|
@@ -26,6 +26,7 @@ import com.ydd.module.service.*;
|
|
|
import com.ydd.module.utils.CommonUtils;
|
|
|
import com.ydd.third.common.config.DeliveryConfig;
|
|
|
import com.ydd.third.common.utils.AddressLngLatExchanger;
|
|
|
+import com.ydd.third.common.utils.CoordinateUtils;
|
|
|
import com.ydd.third.common.vo.GDMapTripResult;
|
|
|
import com.ydd.third.common.vo.ResObject;
|
|
|
import com.ydd.third.common.vo.shop.AmountResultVo;
|
|
@@ -39,11 +40,16 @@ import org.springframework.beans.factory.annotation.Autowired;
|
|
|
import org.springframework.stereotype.Service;
|
|
|
|
|
|
import java.math.BigDecimal;
|
|
|
+import java.math.BigInteger;
|
|
|
+import java.text.SimpleDateFormat;
|
|
|
import java.util.ArrayList;
|
|
|
import java.util.Calendar;
|
|
|
+import java.util.Date;
|
|
|
import java.util.List;
|
|
|
import java.util.concurrent.TimeUnit;
|
|
|
|
|
|
+import static java.math.BigDecimal.ROUND_DOWN;
|
|
|
+
|
|
|
/**
|
|
|
* 达达配送商-计价serviceImpl
|
|
|
* @author 叶君翔
|
|
@@ -283,6 +289,198 @@ public class ApiDadaValuationServiceImpl implements ApiDadaValuationService {
|
|
|
|
|
|
}
|
|
|
|
|
|
+ public OrderFreightDto dadaValuation(Long shopId, Member member, OrderReq orderReq) {
|
|
|
+ try {
|
|
|
+ BigDecimal valuationPrice = BigDecimal.ZERO;
|
|
|
+
|
|
|
+ // 获取合适运费包(门店>商户>通用)
|
|
|
+ Long packageId = iPackageFreightService.getPackageId(shopId, member);
|
|
|
+ PackageFreight packageFreight = iPackageFreightService.getById(packageId);
|
|
|
+ if (packageFreight == null) {
|
|
|
+ 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());
|
|
|
+
|
|
|
+ String startLonLat = orderReq.getSendAddress().getLng() + "," + orderReq.getSendAddress().getLat();
|
|
|
+ String endLonLat = orderReq.getReceiptAddress().getLng() + "," + orderReq.getReceiptAddress().getLat();
|
|
|
+ // 获取订单距离
|
|
|
+ GDMapTripResult bicyclingInfo = AddressLngLatExchanger.getBicyclingInfo(startLonLat, endLonLat);
|
|
|
+ orderFreight.setDistance(Integer.valueOf(bicyclingInfo.getDistance() + ""));
|
|
|
+ // 获取距离加价配置
|
|
|
+ List<PackageFreightDistance> distanceList = iPackageFreightDistanceService.getPackageById(packageId);
|
|
|
+ if (distanceList != null && distanceList.size() > 0) {
|
|
|
+ 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()) == 1) {
|
|
|
+ // 计算加价次数
|
|
|
+ BigDecimal addNum = orderKm.subtract(distance.getStartDistance()).divide(distance.getDistance())
|
|
|
+ .setScale(0, ROUND_DOWN);
|
|
|
+ valuationPrice = valuationPrice.add(distance.getPrice().multiply(addNum));
|
|
|
+ distanceAdd = distanceAdd.add(distance.getPrice().multiply(addNum));
|
|
|
+ }
|
|
|
+
|
|
|
+ // 起始 < orderKm <= 结束值
|
|
|
+ if (distance.getEndDistance() != null && orderKm.compareTo(distance.getEndDistance()) == 1) {
|
|
|
+ // 计算加价次数
|
|
|
+ BigDecimal addNum = distance.getEndDistance().subtract(distance.getStartDistance()).divide(distance.getDistance())
|
|
|
+ .setScale(0, ROUND_DOWN);
|
|
|
+ valuationPrice = valuationPrice.add(distance.getPrice().multiply(addNum));
|
|
|
+ distanceAdd = distanceAdd.add(distance.getPrice().multiply(addNum));
|
|
|
+ }
|
|
|
+
|
|
|
+ if (distance.getEndDistance() != null &&
|
|
|
+ (orderKm.compareTo(distance.getStartDistance()) == 1 && orderKm.compareTo(distance.getEndDistance()) < 1)) {
|
|
|
+ // 计算加价次数
|
|
|
+ BigDecimal addNum = orderKm.subtract(distance.getStartDistance()).divide(distance.getDistance())
|
|
|
+ .setScale(0, ROUND_DOWN);
|
|
|
+ valuationPrice = valuationPrice.add(distance.getPrice().multiply(addNum));
|
|
|
+ distanceAdd = distanceAdd.add(distance.getPrice().multiply(addNum));
|
|
|
+ }
|
|
|
+ }
|
|
|
+ orderFreight.setDistanceAdd(distanceAdd);
|
|
|
+ }
|
|
|
+
|
|
|
+ // 获取重量加价配置
|
|
|
+ List<PackageFreightWeight> weightList = iPackageFreightWeightService.getPackageById(packageId);
|
|
|
+ if(weightList != null && weightList.size() > 0) {
|
|
|
+ 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()) == 1) {
|
|
|
+ // 计算加价次数
|
|
|
+ BigDecimal addNum = orderWeight.subtract(weight.getStartWeight()).divide(weight.getWeight())
|
|
|
+ .setScale(0, ROUND_DOWN);
|
|
|
+ valuationPrice = valuationPrice.add(weight.getPrice().multiply(addNum));
|
|
|
+ weightAdd = weightAdd.add(weight.getPrice().multiply(addNum));
|
|
|
+ }
|
|
|
+
|
|
|
+ // 起始 < orderWeight <= 结束值
|
|
|
+ if (weight.getEndWeight() != null && orderWeight.compareTo(weight.getEndWeight()) == 1) {
|
|
|
+ // 计算加价次数
|
|
|
+ BigDecimal addNum = weight.getEndWeight().subtract(weight.getStartWeight()).divide(weight.getWeight())
|
|
|
+ .setScale(0, ROUND_DOWN);
|
|
|
+ valuationPrice = valuationPrice.add(weight.getPrice().multiply(addNum));
|
|
|
+ weightAdd = weightAdd.add(weight.getPrice().multiply(addNum));
|
|
|
+ }
|
|
|
+
|
|
|
+ if (weight.getEndWeight() != null &&
|
|
|
+ (orderWeight.compareTo(weight.getStartWeight()) == 1 && orderWeight.compareTo(weight.getEndWeight()) < 1)) {
|
|
|
+ // 计算加价次数
|
|
|
+ BigDecimal addNum = orderWeight.subtract(weight.getStartWeight()).divide(weight.getWeight())
|
|
|
+ .setScale(0, ROUND_DOWN);
|
|
|
+ valuationPrice = valuationPrice.add(weight.getPrice().multiply(addNum));
|
|
|
+ weightAdd = weightAdd.add(weight.getPrice().multiply(addNum));
|
|
|
+ }
|
|
|
+ }
|
|
|
+ orderFreight.setWeightAdd(weightAdd);
|
|
|
+ }
|
|
|
+
|
|
|
+ // 获取商品金额加价配置
|
|
|
+ List<PackageFreightMoney> moneyList = iPackageFreightMoneyService.getPackageById(packageId);
|
|
|
+ if (moneyList != null && moneyList.size() > 0) {
|
|
|
+ BigDecimal orderAmount = orderReq.getProductAmount();
|
|
|
+ BigDecimal moneyAdd = new BigDecimal(BigInteger.ZERO);
|
|
|
+ for (PackageFreightMoney money : moneyList) {
|
|
|
+ // 起始 < orderAmount <= 结束值
|
|
|
+ if (orderAmount.compareTo(money.getEndMoney()) == 1) {
|
|
|
+ valuationPrice = valuationPrice.add(money.getPrice());
|
|
|
+ moneyAdd = moneyAdd.add(money.getPrice());
|
|
|
+ }
|
|
|
+
|
|
|
+ if (orderAmount.compareTo(money.getStartMoney()) == 1 && 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 (timeList != null && timeList.size() > 0) {
|
|
|
+ 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()) < 0 || now.compareTo(time.getEndTime()) == 0)) {
|
|
|
+ valuationPrice = valuationPrice.add(time.getPrice());
|
|
|
+ timeAdd = timeAdd.add(time.getPrice());
|
|
|
+ }
|
|
|
+ }
|
|
|
+ orderFreight.setTimeAdd(timeAdd);
|
|
|
+ }
|
|
|
+
|
|
|
+ // 获取日期加价配置
|
|
|
+ List<PackageFreightDate> dateList = iPackageFreightDateService.getPackageById(packageId);
|
|
|
+ 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.getTime() > date.getEndDate().getTime()) {
|
|
|
+ valuationPrice = valuationPrice.add(date.getPrice());
|
|
|
+ dateAdd = dateAdd.add(date.getPrice());
|
|
|
+ }
|
|
|
+
|
|
|
+ if (now.getTime() > date.getStartDate().getTime() && now.getTime() <= date.getEndDate().getTime()) {
|
|
|
+ valuationPrice = valuationPrice.add(date.getPrice());
|
|
|
+ dateAdd = dateAdd.add(date.getPrice());
|
|
|
+ }
|
|
|
+ }
|
|
|
+ orderFreight.setDateAdd(dateAdd);
|
|
|
+ }
|
|
|
+
|
|
|
+ // 获取每周加价配置
|
|
|
+ List<PackageFreightWeek> weekList = iPackageFreightWeekService.getPackageById(packageId);
|
|
|
+ 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 {
|
|
|
+ orderFreight.setDeliveryAmount(valuationPrice);
|
|
|
+ }
|
|
|
+ return orderFreight;
|
|
|
+ }catch (Exception e) {
|
|
|
+ log.error("运费包计算异常", e);
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
private ValuationRes queryOrderDeliverFee(OrderReq orderReq, DeliveryInfo delivery, Long merchantId, Long shopId, OrderFreightDto orderFreight) {
|
|
|
orderReq.setOrderSn(SnCodeUtils.createSn());
|
|
|
orderReq.setAmount(orderReq.getProductAmount());
|