|
@@ -53,6 +53,7 @@ import static java.math.BigDecimal.ROUND_UP;
|
|
|
|
|
|
/**
|
|
|
* 达达配送商-计价serviceImpl
|
|
|
+ *
|
|
|
* @author 叶君翔
|
|
|
* @date 2021/12/31 15:20
|
|
|
*/
|
|
@@ -78,7 +79,7 @@ public class ApiDadaValuationServiceImpl implements ApiDadaValuationService {
|
|
|
private final RedisCache redisCache;
|
|
|
|
|
|
@Override
|
|
|
- public ValuationResultData dadaValuation(Long shopId, Member loginMember, Member member, OrderReq orderReq, int valuationType, Long dadaDspId) {
|
|
|
+ public ValuationResultData dadaValuation(Long shopId, Member loginMember, Member member, OrderReq orderReq, int valuationType, Long dadaDspId) {
|
|
|
log.info("达达配送商计价: shopId: {}, orderReq: {}, valuationType: {}, dadaDspId: {}", shopId, JsonMapper.nonEmptyMapper().toJson(orderReq), valuationType, dadaDspId);
|
|
|
ValuationResultData resultData = new ValuationResultData();
|
|
|
ValuationRes res = new ValuationRes();
|
|
@@ -158,12 +159,12 @@ public class ApiDadaValuationServiceImpl implements ApiDadaValuationService {
|
|
|
info.setAuthToken(shopDeliveryBind.getAuthToken());
|
|
|
info.setThirdShopId(shopDeliveryBind.getThirdShopId());
|
|
|
isMine = 1;
|
|
|
- if (info.getType().equals(DeliveryTypeEnums.DADA.getType())){
|
|
|
+ if (info.getType().equals(DeliveryTypeEnums.DADA.getType())) {
|
|
|
info.setShopId(shopDeliveryBind.getDadaShopNo());
|
|
|
info.setDadaThirdShopId(shopDeliveryBind.getThirdShopId());
|
|
|
}
|
|
|
}
|
|
|
- if (dspDelivery.getType().equals(DeliveryTypeEnums.DADA.getType()) && member.getMemberType().equals(MemberTypeEnum.PERSON.type)){
|
|
|
+ if (dspDelivery.getType().equals(DeliveryTypeEnums.DADA.getType()) && member.getMemberType().equals(MemberTypeEnum.PERSON.type)) {
|
|
|
info.setIsMerchant(StatusEnum.SHOW.status);
|
|
|
}
|
|
|
info.setPreferredDelivery(StatusEnum.STOP.getStatus());
|
|
@@ -171,7 +172,8 @@ public class ApiDadaValuationServiceImpl implements ApiDadaValuationService {
|
|
|
return info;
|
|
|
}
|
|
|
|
|
|
- private OrderFreightDto getDadaValuationPrice(Long shopId, Member member, OrderReq orderReq) {
|
|
|
+
|
|
|
+ public OrderFreightDto getDadaValuationPrice(Long shopId, Member member, OrderReq orderReq) {
|
|
|
try {
|
|
|
BigDecimal valuationPrice = BigDecimal.ZERO;
|
|
|
|
|
@@ -179,15 +181,17 @@ public class ApiDadaValuationServiceImpl implements ApiDadaValuationService {
|
|
|
Long packageId = iPackageFreightService.getPackageId(shopId, member);
|
|
|
PackageFreight packageFreight = iPackageFreightService.getById(packageId);
|
|
|
if (packageFreight == null) {
|
|
|
- log.warn("无合适运费包!");
|
|
|
+ log.warn("无合适运费包!");
|
|
|
return null;
|
|
|
}
|
|
|
// 基础运费
|
|
|
if (packageFreight.getAmount() != null) {
|
|
|
valuationPrice = valuationPrice.add(packageFreight.getAmount());
|
|
|
}
|
|
|
+
|
|
|
// 订单加价详情
|
|
|
OrderFreightDto orderFreight = new OrderFreightDto();
|
|
|
+ orderFreight.setOrderId(orderReq.getOrderId());
|
|
|
orderFreight.setFreightPackageId(packageFreight.getId());
|
|
|
orderFreight.setAmount(packageFreight.getAmount());
|
|
|
orderFreight.setMaxAmount(packageFreight.getMaxAmount());
|
|
@@ -200,83 +204,149 @@ public class ApiDadaValuationServiceImpl implements ApiDadaValuationService {
|
|
|
// 获取距离加价配置
|
|
|
List<PackageFreightDistance> distanceList = iPackageFreightDistanceService.getPackageById(packageId);
|
|
|
if (CollectionUtils.isNotEmpty(distanceList)) {
|
|
|
- BigDecimal orderDistance = new BigDecimal(String.valueOf(bicyclingInfo.getDistance())).divide(new BigDecimal(String.valueOf(1000)), 2, BigDecimal.ROUND_UP);
|
|
|
- for (PackageFreightDistance item : distanceList) {
|
|
|
- boolean inRange = BigDecimalUtils.inRange(item.getStartDistance(), item.getEndDistance(), orderDistance);
|
|
|
- if (inRange && item.getDistance() != null && item.getPrice() != null) {
|
|
|
+ BigDecimal orderKm = new BigDecimal(String.valueOf(bicyclingInfo.getDistance())).divide(new BigDecimal(String.valueOf(1000)), 2, BigDecimal.ROUND_UP);
|
|
|
+ BigDecimal distanceAdd = new BigDecimal(BigInteger.ZERO);
|
|
|
+ for (PackageFreightDistance distance : distanceList) {
|
|
|
+ // 起始 < orderKm <= 无穷大
|
|
|
+ if (distance.getEndDistance() == null && orderKm.compareTo(distance.getStartDistance()) > 0) {
|
|
|
// 计算加价次数
|
|
|
- BigDecimal addNum = orderDistance.divide(item.getDistance(), 0, BigDecimal.ROUND_UP);
|
|
|
- valuationPrice = valuationPrice.add(item.getPrice().multiply(addNum));
|
|
|
- orderFreight.setDistanceAdd(item.getPrice().multiply(addNum));
|
|
|
- break;
|
|
|
+ BigDecimal addNum = orderKm.subtract(distance.getStartDistance()).divide(distance.getDistance(), 0, ROUND_UP);
|
|
|
+ valuationPrice = valuationPrice.add(distance.getPrice().multiply(addNum));
|
|
|
+ distanceAdd = distanceAdd.add(distance.getPrice().multiply(addNum));
|
|
|
+ }
|
|
|
+
|
|
|
+ // 起始 < orderKm <= 结束值
|
|
|
+ if (distance.getEndDistance() != null && orderKm.compareTo(distance.getEndDistance()) > 0) {
|
|
|
+ // 计算加价次数
|
|
|
+ BigDecimal addNum = distance.getEndDistance().subtract(distance.getStartDistance()).divide(distance.getDistance(), 0, ROUND_UP);
|
|
|
+ valuationPrice = valuationPrice.add(distance.getPrice().multiply(addNum));
|
|
|
+ distanceAdd = distanceAdd.add(distance.getPrice().multiply(addNum));
|
|
|
+ }
|
|
|
+
|
|
|
+ if (distance.getEndDistance() != null &&
|
|
|
+ (orderKm.compareTo(distance.getStartDistance()) > 0 && orderKm.compareTo(distance.getEndDistance()) < 1)) {
|
|
|
+ // 计算加价次数
|
|
|
+ BigDecimal addNum = orderKm.subtract(distance.getStartDistance()).divide(distance.getDistance(), 0, ROUND_UP);
|
|
|
+ valuationPrice = valuationPrice.add(distance.getPrice().multiply(addNum));
|
|
|
+ distanceAdd = distanceAdd.add(distance.getPrice().multiply(addNum));
|
|
|
}
|
|
|
}
|
|
|
+ orderFreight.setDistanceAdd(distanceAdd);
|
|
|
}
|
|
|
+
|
|
|
// 获取重量加价配置
|
|
|
List<PackageFreightWeight> weightList = iPackageFreightWeightService.getPackageById(packageId);
|
|
|
- if(CollectionUtils.isNotEmpty(weightList)) {
|
|
|
- BigDecimal orderWeight = new BigDecimal(String.valueOf(orderReq.getWeight()));
|
|
|
- for (PackageFreightWeight item : weightList) {
|
|
|
- boolean inRange = BigDecimalUtils.inRange(item.getStartWeight(), item.getEndWeight(), orderWeight);
|
|
|
- if (inRange && item.getWeight() != null && item.getPrice() != null) {
|
|
|
+ if (CollectionUtils.isNotEmpty(weightList)) {
|
|
|
+ BigDecimal orderWeight = new BigDecimal(Integer.toString(orderReq.getWeight()));
|
|
|
+ BigDecimal weightAdd = new BigDecimal(BigInteger.ZERO);
|
|
|
+ for (PackageFreightWeight weight : weightList) {
|
|
|
+ // 起始 < orderWeight <= 无穷大
|
|
|
+ if (weight.getEndWeight() == null && orderWeight.compareTo(weight.getStartWeight()) > 0) {
|
|
|
// 计算加价次数
|
|
|
- BigDecimal addNum = orderWeight.divide(item.getWeight(), 0, BigDecimal.ROUND_UP);
|
|
|
- valuationPrice = valuationPrice.add(item.getPrice().multiply(addNum));
|
|
|
- orderFreight.setWeightAdd(item.getPrice().multiply(addNum));
|
|
|
- break;
|
|
|
+ BigDecimal addNum = orderWeight.subtract(weight.getStartWeight()).divide(weight.getWeight(), 0, ROUND_UP);
|
|
|
+ valuationPrice = valuationPrice.add(weight.getPrice().multiply(addNum));
|
|
|
+ weightAdd = weightAdd.add(weight.getPrice().multiply(addNum));
|
|
|
+ }
|
|
|
+
|
|
|
+ // 起始 < orderWeight <= 结束值
|
|
|
+ if (weight.getEndWeight() != null && orderWeight.compareTo(weight.getEndWeight()) > 0) {
|
|
|
+ // 计算加价次数
|
|
|
+ BigDecimal addNum = weight.getEndWeight().subtract(weight.getStartWeight()).divide(weight.getWeight(), 0, ROUND_UP);
|
|
|
+ valuationPrice = valuationPrice.add(weight.getPrice().multiply(addNum));
|
|
|
+ weightAdd = weightAdd.add(weight.getPrice().multiply(addNum));
|
|
|
+ }
|
|
|
+
|
|
|
+ if (weight.getEndWeight() != null &&
|
|
|
+ (orderWeight.compareTo(weight.getStartWeight()) > 0 && orderWeight.compareTo(weight.getEndWeight()) < 1)) {
|
|
|
+ // 计算加价次数
|
|
|
+ BigDecimal addNum = orderWeight.subtract(weight.getStartWeight()).divide(weight.getWeight(), 0, ROUND_UP);
|
|
|
+ valuationPrice = valuationPrice.add(weight.getPrice().multiply(addNum));
|
|
|
+ weightAdd = weightAdd.add(weight.getPrice().multiply(addNum));
|
|
|
}
|
|
|
}
|
|
|
+ orderFreight.setWeightAdd(weightAdd);
|
|
|
}
|
|
|
+
|
|
|
// 获取商品金额加价配置
|
|
|
List<PackageFreightMoney> moneyList = iPackageFreightMoneyService.getPackageById(packageId);
|
|
|
if (CollectionUtils.isNotEmpty(moneyList)) {
|
|
|
BigDecimal orderAmount = orderReq.getWaimaiOrderId() == null ? orderReq.getProductAmount() : orderReq.getMtMoney();
|
|
|
- for (PackageFreightMoney item : moneyList) {
|
|
|
- boolean inRange = BigDecimalUtils.inRange(item.getStartMoney(), item.getEndMoney(), orderAmount);
|
|
|
- if (inRange && item.getPrice() != null) {
|
|
|
- valuationPrice = valuationPrice.add(item.getPrice());
|
|
|
- orderFreight.setProductAmountAdd(item.getPrice());
|
|
|
- break;
|
|
|
+ BigDecimal moneyAdd = new BigDecimal(BigInteger.ZERO);
|
|
|
+ for (PackageFreightMoney money : moneyList) {
|
|
|
+ // 起始 < orderAmount <= 结束值
|
|
|
+ if (orderAmount.compareTo(money.getEndMoney()) > 0) {
|
|
|
+ valuationPrice = valuationPrice.add(money.getPrice());
|
|
|
+ moneyAdd = moneyAdd.add(money.getPrice());
|
|
|
+ }
|
|
|
+
|
|
|
+ if (orderAmount.compareTo(money.getStartMoney()) > 0 && orderAmount.compareTo(money.getEndMoney()) < 1) {
|
|
|
+ valuationPrice = valuationPrice.add(money.getPrice());
|
|
|
+ moneyAdd = moneyAdd.add(money.getPrice());
|
|
|
}
|
|
|
}
|
|
|
+ orderFreight.setProductAmountAdd(moneyAdd);
|
|
|
}
|
|
|
+
|
|
|
// 获取时间段加价配置
|
|
|
List<PackageFreightTime> timeList = iPackageFreightTimeService.getPackageById(packageId);
|
|
|
if (CollectionUtils.isNotEmpty(timeList)) {
|
|
|
- for (PackageFreightTime item : timeList) {
|
|
|
- boolean inZone = DateUtils.HHmmInZone(item.getStartTime(), item.getEndTime());
|
|
|
- if (inZone && item.getPrice() != null) {
|
|
|
- valuationPrice = valuationPrice.add(item.getPrice());
|
|
|
- orderFreight.setTimeAdd(item.getPrice());
|
|
|
- break;
|
|
|
+ Date newDate = new Date();
|
|
|
+ SimpleDateFormat sdf = new SimpleDateFormat("HH:mm");
|
|
|
+ String now = sdf.format(newDate);
|
|
|
+ BigDecimal timeAdd = new BigDecimal(BigInteger.ZERO);
|
|
|
+ for (PackageFreightTime time : timeList) {
|
|
|
+ // 起始时间段 < now <= 结束时间段
|
|
|
+ if (now.compareTo(time.getEndTime()) > 0) {
|
|
|
+ valuationPrice = valuationPrice.add(time.getPrice());
|
|
|
+ timeAdd = timeAdd.add(time.getPrice());
|
|
|
+ }
|
|
|
+
|
|
|
+ if (now.compareTo(time.getStartTime()) > 0 && now.compareTo(time.getEndTime()) < 1) {
|
|
|
+ valuationPrice = valuationPrice.add(time.getPrice());
|
|
|
+ timeAdd = timeAdd.add(time.getPrice());
|
|
|
}
|
|
|
}
|
|
|
+ orderFreight.setTimeAdd(timeAdd);
|
|
|
}
|
|
|
+
|
|
|
// 获取日期加价配置
|
|
|
List<PackageFreightDate> dateList = iPackageFreightDateService.getPackageById(packageId);
|
|
|
- if (CollectionUtils.isNotEmpty(dateList)) {
|
|
|
- for (PackageFreightDate item : dateList) {
|
|
|
- boolean inZone = DateUtils.YYYYMMddInZone(item.getStartDate(), item.getEndDate());
|
|
|
- if (inZone && item.getPrice() != null) {
|
|
|
- valuationPrice = valuationPrice.add(item.getPrice());
|
|
|
- orderFreight.setDateAdd(item.getPrice());
|
|
|
- break;
|
|
|
+ if (dateList != null && dateList.size() > 0) {
|
|
|
+ Date newDate = new Date();
|
|
|
+ SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
|
|
|
+ Date now = sdf.parse(sdf.format(newDate));
|
|
|
+ BigDecimal dateAdd = new BigDecimal(BigInteger.ZERO);
|
|
|
+ for (PackageFreightDate date : dateList) {
|
|
|
+ // 起始日期 < now <= 结束日期
|
|
|
+ if (now.compareTo(date.getEndDate()) > 0) {
|
|
|
+ valuationPrice = valuationPrice.add(date.getPrice());
|
|
|
+ dateAdd = dateAdd.add(date.getPrice());
|
|
|
+ }
|
|
|
+
|
|
|
+ if (now.compareTo(date.getStartDate()) > 0 && now.compareTo(date.getEndDate()) < 1) {
|
|
|
+ valuationPrice = valuationPrice.add(date.getPrice());
|
|
|
+ dateAdd = dateAdd.add(date.getPrice());
|
|
|
}
|
|
|
}
|
|
|
+ orderFreight.setDateAdd(dateAdd);
|
|
|
}
|
|
|
+
|
|
|
// 获取每周加价配置
|
|
|
List<PackageFreightWeek> weekList = iPackageFreightWeekService.getPackageById(packageId);
|
|
|
- if (CollectionUtils.isNotEmpty(weekList)) {
|
|
|
- Integer todayWeek = Calendar.getInstance().get(Calendar.DAY_OF_WEEK);
|
|
|
- for (PackageFreightWeek item : weekList) {
|
|
|
- if (todayWeek.equals(item.getWeek())) {
|
|
|
- valuationPrice = valuationPrice.add(item.getPrice());
|
|
|
- orderFreight.setWeekAdd(item.getPrice());
|
|
|
- break;
|
|
|
+ if (weekList != null && weekList.size() > 0) {
|
|
|
+ Calendar calendar = Calendar.getInstance();
|
|
|
+ Integer todayWeek = calendar.get(Calendar.DAY_OF_WEEK);
|
|
|
+ BigDecimal weekAdd = new BigDecimal(BigInteger.ZERO);
|
|
|
+ for (PackageFreightWeek week : weekList) {
|
|
|
+ if (todayWeek.equals(week.getWeek())) {
|
|
|
+ valuationPrice = valuationPrice.add(week.getPrice());
|
|
|
+ weekAdd = weekAdd.add(week.getPrice());
|
|
|
}
|
|
|
}
|
|
|
+ orderFreight.setWeekAdd(weekAdd);
|
|
|
}
|
|
|
- // 计算运费金额
|
|
|
+
|
|
|
+ // 加价超过最高运费,返回最高运费
|
|
|
if (packageFreight.getMaxAmount() != null && packageFreight.getMaxAmount().compareTo(valuationPrice) < 0) {
|
|
|
orderFreight.setDeliveryAmount(packageFreight.getMaxAmount());
|
|
|
} else {
|
|
@@ -287,7 +357,6 @@ public class ApiDadaValuationServiceImpl implements ApiDadaValuationService {
|
|
|
log.error("运费包计算异常", e);
|
|
|
return null;
|
|
|
}
|
|
|
-
|
|
|
}
|
|
|
|
|
|
public OrderFreightDto dadaValuation(Long shopId, Member member, OrderReq orderReq) {
|
|
@@ -298,12 +367,12 @@ public class ApiDadaValuationServiceImpl implements ApiDadaValuationService {
|
|
|
Long packageId = iPackageFreightService.getPackageId(shopId, member);
|
|
|
PackageFreight packageFreight = iPackageFreightService.getById(packageId);
|
|
|
if (packageFreight == null) {
|
|
|
- log.warn("无合适运费包!");
|
|
|
- return null;
|
|
|
+ log.warn("无合适运费包!");
|
|
|
+ return null;
|
|
|
}
|
|
|
// 基础运费
|
|
|
if (packageFreight.getAmount() != null) {
|
|
|
- valuationPrice = valuationPrice.add(packageFreight.getAmount());
|
|
|
+ valuationPrice = valuationPrice.add(packageFreight.getAmount());
|
|
|
}
|
|
|
|
|
|
// 订单加价详情
|
|
@@ -353,7 +422,7 @@ public class ApiDadaValuationServiceImpl implements ApiDadaValuationService {
|
|
|
|
|
|
// 获取重量加价配置
|
|
|
List<PackageFreightWeight> weightList = iPackageFreightWeightService.getPackageById(packageId);
|
|
|
- if(CollectionUtils.isNotEmpty(weightList)) {
|
|
|
+ if (CollectionUtils.isNotEmpty(weightList)) {
|
|
|
BigDecimal orderWeight = new BigDecimal(Integer.toString(orderReq.getWeight()));
|
|
|
BigDecimal weightAdd = new BigDecimal(BigInteger.ZERO);
|
|
|
for (PackageFreightWeight weight : weightList) {
|
|
@@ -470,7 +539,7 @@ public class ApiDadaValuationServiceImpl implements ApiDadaValuationService {
|
|
|
orderFreight.setDeliveryAmount(valuationPrice);
|
|
|
}
|
|
|
return orderFreight;
|
|
|
- }catch (Exception e) {
|
|
|
+ } catch (Exception e) {
|
|
|
log.error("运费包计算异常", e);
|
|
|
return null;
|
|
|
}
|