ApiDadaValuationServiceImpl.java 29 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557
  1. package com.ydd.app.service.impl;
  2. import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
  3. import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
  4. import com.ydd.api.DeliveryService;
  5. import com.ydd.app.OrderEntityUtils;
  6. import com.ydd.app.QueryAmountEntityUtils;
  7. import com.ydd.app.dto.OrderReq;
  8. import com.ydd.app.dto.ValuationRes;
  9. import com.ydd.app.dto.ValuationResultData;
  10. import com.ydd.app.service.ApiDadaValuationService;
  11. import com.ydd.common.core.redis.RedisCache;
  12. import com.ydd.common.enums.DeliveryTypeEnums;
  13. import com.ydd.common.utils.DateUtils;
  14. import com.ydd.common.utils.SnCodeUtils;
  15. import com.ydd.ecloud.core.utils.BigDecimalUtils;
  16. import com.ydd.ecloud.core.utils.JsonMapper;
  17. import com.ydd.module.domain.*;
  18. import com.ydd.module.dto.DeliveryInfo;
  19. import com.ydd.module.dto.OrderFreightDto;
  20. import com.ydd.module.enums.IsDeleteEnum;
  21. import com.ydd.module.enums.MemberTypeEnum;
  22. import com.ydd.module.enums.StatusEnum;
  23. import com.ydd.module.expection.CustomWebException;
  24. import com.ydd.module.service.*;
  25. import com.ydd.module.utils.CommonUtils;
  26. import com.ydd.third.common.config.DeliveryConfig;
  27. import com.ydd.third.common.utils.AddressLngLatExchanger;
  28. import com.ydd.third.common.utils.CoordinateUtils;
  29. import com.ydd.third.common.vo.GDMapTripResult;
  30. import com.ydd.third.common.vo.ResObject;
  31. import com.ydd.third.common.vo.shop.AmountResultVo;
  32. import com.ydd.third.common.vo.shop.QueryAmount;
  33. import com.ydd.third.common.vo.vo.order.OrderResultVo;
  34. import com.ydd.third.common.vo.vo.order.OrderVo;
  35. import lombok.RequiredArgsConstructor;
  36. import lombok.extern.slf4j.Slf4j;
  37. import org.springframework.beans.BeanUtils;
  38. import org.springframework.beans.factory.annotation.Autowired;
  39. import org.springframework.stereotype.Service;
  40. import java.math.BigDecimal;
  41. import java.math.BigInteger;
  42. import java.text.SimpleDateFormat;
  43. import java.util.ArrayList;
  44. import java.util.Calendar;
  45. import java.util.Date;
  46. import java.util.List;
  47. import java.util.concurrent.TimeUnit;
  48. import static java.math.BigDecimal.ROUND_DOWN;
  49. import static java.math.BigDecimal.ROUND_UP;
  50. /**
  51. * 达达配送商-计价serviceImpl
  52. * @author 叶君翔
  53. * @date 2021/12/31 15:20
  54. */
  55. @Slf4j
  56. @Service
  57. @RequiredArgsConstructor(onConstructor_ = @Autowired)
  58. public class ApiDadaValuationServiceImpl implements ApiDadaValuationService {
  59. private final IPackageFreightService iPackageFreightService;
  60. private final IPackageFreightDateService iPackageFreightDateService;
  61. private final IPackageFreightDistanceService iPackageFreightDistanceService;
  62. private final IPackageFreightMoneyService iPackageFreightMoneyService;
  63. private final IPackageFreightTimeService iPackageFreightTimeService;
  64. private final IPackageFreightWeekService iPackageFreightWeekService;
  65. private final IPackageFreightWeightService iPackageFreightWeightService;
  66. private final DeliveryService client;
  67. private final IShopService iShopService;
  68. private final DeliveryConfig deliveryConfig;
  69. private final IShopDeliveryBindService iShopDeliveryBindService;
  70. private final IDspDeliveryService iDspDeliveryService;
  71. private final RedisCache redisCache;
  72. @Override
  73. public ValuationResultData dadaValuation(Long shopId, Member loginMember, Member member, OrderReq orderReq, int valuationType, Long dadaDspId) {
  74. log.info("达达配送商计价: shopId: {}, orderReq: {}, valuationType: {}, dadaDspId: {}", shopId, JsonMapper.nonEmptyMapper().toJson(orderReq), valuationType, dadaDspId);
  75. ValuationResultData resultData = new ValuationResultData();
  76. ValuationRes res = new ValuationRes();
  77. List<ValuationRes> list = new ArrayList<>();
  78. List<ValuationRes> supports = new ArrayList<>();
  79. // 达达配送商个人地址发单,使用登录用户绑定的shopId
  80. if (shopId == null) {
  81. shopId = member.getShopId();
  82. }
  83. if (shopId != null) {
  84. Shop shop = iShopService.getById(shopId);
  85. orderReq.setShopName(shop.getName());
  86. }
  87. OrderFreightDto orderFreight = new OrderFreightDto();
  88. DeliveryInfo info = this.getDeliveryInfo(member, shopId);
  89. if (info == null) {
  90. log.warn("未绑定达达自运力");
  91. return ValuationResultData.error("达达配送商模式发单, 请绑定达达自运力");
  92. }
  93. ValuationRes valuationRes = null;
  94. if (valuationType == 1) {
  95. // 达达收付模式
  96. orderFreight = this.getDadaValuationPrice(shopId, member, orderReq);
  97. if (orderFreight == null) {
  98. log.warn("运费包计算异常, 计价失败!");
  99. return ValuationResultData.error("运费包计算异常, 计价失败");
  100. }
  101. orderFreight.setValuationType(1);
  102. valuationRes = this.queryOrderDeliverFee(orderReq, info, member.getMerchantId(), shopId, orderFreight);
  103. valuationRes.setIsEnough(StatusEnum.SHOW.status);
  104. } else if (valuationType == 2) {
  105. // 达达非收付模式
  106. orderFreight.setValuationType(2);
  107. valuationRes = this.queryOrderDeliverFee(orderReq, info, member.getMerchantId(), shopId, orderFreight);
  108. }
  109. if (valuationRes == null) {
  110. log.warn("计价失败!");
  111. return ValuationResultData.error("计价失败!");
  112. }
  113. orderFreight.setDadaDspId(dadaDspId);
  114. // 计价金额存入redis, 24小时后自动失效, 下单时再入库
  115. redisCache.setCacheObject(orderReq.getOrderNo(), orderFreight, 24 * 3600, TimeUnit.SECONDS);
  116. valuationRes.setPreferredDelivery(info.getPreferredDelivery());
  117. valuationRes.setOriginalMoney(valuationRes.getDeliveryAmount());
  118. valuationRes.setIsMerchant(info.getIsMerchant());
  119. list.add(valuationRes);
  120. // Res数据组装
  121. this.setValuationRes(list, res);
  122. res.setOptionals(list);
  123. res.setSupports(supports);
  124. return ValuationResultData.success(res);
  125. }
  126. private void setValuationRes(List<ValuationRes> list, ValuationRes res) {
  127. // 获取聚合配送的预估价,选最低价格展示
  128. if (CollectionUtils.isNotEmpty(list)) {
  129. res.setDeliveryId(list.get(0).getDeliveryId());
  130. res.setDesc("全网运力推单");
  131. res.setDeliveryAmount(list.get(0).getDeliveryAmount());
  132. res.setName("聚合配送");
  133. res.setIsEnough(list.get(0).getIsEnough());
  134. res.setLogo("https://ecloud-cdn.51sssd.com/20210317/e24a425797f54f64b808b95beae37285.png");
  135. }
  136. }
  137. private DeliveryInfo getDeliveryInfo(Member member, Long shopId) {
  138. DspDelivery dspDelivery = iDspDeliveryService.findOne(DeliveryTypeEnums.DADA.getType());
  139. DeliveryInfo info = new DeliveryInfo();
  140. BeanUtils.copyProperties(dspDelivery, info);
  141. int isMine = 0;
  142. if (member.getMerchantId() != null) {
  143. ShopDeliveryBind shopDeliveryBind = iShopDeliveryBindService.getShopDeliveryBind(member.getMerchantId(), shopId, dspDelivery.getId(), dspDelivery.getType());
  144. if (shopDeliveryBind == null) {
  145. log.warn("达达配送商模式发单, 未绑定达达自运力");
  146. return null;
  147. }
  148. info.setAuthToken(shopDeliveryBind.getAuthToken());
  149. info.setThirdShopId(shopDeliveryBind.getThirdShopId());
  150. isMine = 1;
  151. if (info.getType().equals(DeliveryTypeEnums.DADA.getType())){
  152. info.setShopId(shopDeliveryBind.getDadaShopNo());
  153. info.setDadaThirdShopId(shopDeliveryBind.getThirdShopId());
  154. }
  155. }
  156. if (dspDelivery.getType().equals(DeliveryTypeEnums.DADA.getType()) && member.getMemberType().equals(MemberTypeEnum.PERSON.type)){
  157. info.setIsMerchant(StatusEnum.SHOW.status);
  158. }
  159. info.setPreferredDelivery(StatusEnum.STOP.getStatus());
  160. info.setIsMine(isMine);
  161. return info;
  162. }
  163. private OrderFreightDto getDadaValuationPrice(Long shopId, Member member, OrderReq orderReq) {
  164. try {
  165. BigDecimal valuationPrice = BigDecimal.ZERO;
  166. // 获取合适运费包(门店>商户>通用)
  167. Long packageId = iPackageFreightService.getPackageId(shopId, member);
  168. PackageFreight packageFreight = iPackageFreightService.getById(packageId);
  169. if (packageFreight == null) {
  170. log.warn("无合适运费包!");
  171. return null;
  172. }
  173. // 基础运费
  174. if (packageFreight.getAmount() != null) {
  175. valuationPrice = valuationPrice.add(packageFreight.getAmount());
  176. }
  177. // 订单加价详情
  178. OrderFreightDto orderFreight = new OrderFreightDto();
  179. orderFreight.setFreightPackageId(packageFreight.getId());
  180. orderFreight.setAmount(packageFreight.getAmount());
  181. orderFreight.setMaxAmount(packageFreight.getMaxAmount());
  182. String startLonLat = orderReq.getSendAddress().getLng() + "," + orderReq.getSendAddress().getLat();
  183. String endLonLat = orderReq.getReceiptAddress().getLng() + "," + orderReq.getReceiptAddress().getLat();
  184. // 获取订单距离
  185. GDMapTripResult bicyclingInfo = AddressLngLatExchanger.getBicyclingInfo(startLonLat, endLonLat);
  186. orderFreight.setDistance(Integer.valueOf(bicyclingInfo.getDistance() + ""));
  187. // 获取距离加价配置
  188. List<PackageFreightDistance> distanceList = iPackageFreightDistanceService.getPackageById(packageId);
  189. if (CollectionUtils.isNotEmpty(distanceList)) {
  190. BigDecimal orderDistance = new BigDecimal(String.valueOf(bicyclingInfo.getDistance())).divide(new BigDecimal(String.valueOf(1000)), 2, BigDecimal.ROUND_UP);
  191. for (PackageFreightDistance item : distanceList) {
  192. boolean inRange = BigDecimalUtils.inRange(item.getStartDistance(), item.getEndDistance(), orderDistance);
  193. if (inRange && item.getDistance() != null && item.getPrice() != null) {
  194. // 计算加价次数
  195. BigDecimal addNum = orderDistance.divide(item.getDistance(), 0, BigDecimal.ROUND_UP);
  196. valuationPrice = valuationPrice.add(item.getPrice().multiply(addNum));
  197. orderFreight.setDistanceAdd(item.getPrice().multiply(addNum));
  198. break;
  199. }
  200. }
  201. }
  202. // 获取重量加价配置
  203. List<PackageFreightWeight> weightList = iPackageFreightWeightService.getPackageById(packageId);
  204. if(CollectionUtils.isNotEmpty(weightList)) {
  205. BigDecimal orderWeight = new BigDecimal(String.valueOf(orderReq.getWeight()));
  206. for (PackageFreightWeight item : weightList) {
  207. boolean inRange = BigDecimalUtils.inRange(item.getStartWeight(), item.getEndWeight(), orderWeight);
  208. if (inRange && item.getWeight() != null && item.getPrice() != null) {
  209. // 计算加价次数
  210. BigDecimal addNum = orderWeight.divide(item.getWeight(), 0, BigDecimal.ROUND_UP);
  211. valuationPrice = valuationPrice.add(item.getPrice().multiply(addNum));
  212. orderFreight.setWeightAdd(item.getPrice().multiply(addNum));
  213. break;
  214. }
  215. }
  216. }
  217. // 获取商品金额加价配置
  218. List<PackageFreightMoney> moneyList = iPackageFreightMoneyService.getPackageById(packageId);
  219. if (CollectionUtils.isNotEmpty(moneyList)) {
  220. BigDecimal orderAmount = orderReq.getWaimaiOrderId() == null ? orderReq.getProductAmount() : orderReq.getMtMoney();
  221. for (PackageFreightMoney item : moneyList) {
  222. boolean inRange = BigDecimalUtils.inRange(item.getStartMoney(), item.getEndMoney(), orderAmount);
  223. if (inRange && item.getPrice() != null) {
  224. valuationPrice = valuationPrice.add(item.getPrice());
  225. orderFreight.setProductAmountAdd(item.getPrice());
  226. break;
  227. }
  228. }
  229. }
  230. // 获取时间段加价配置
  231. List<PackageFreightTime> timeList = iPackageFreightTimeService.getPackageById(packageId);
  232. if (CollectionUtils.isNotEmpty(timeList)) {
  233. for (PackageFreightTime item : timeList) {
  234. boolean inZone = DateUtils.HHmmInZone(item.getStartTime(), item.getEndTime());
  235. if (inZone && item.getPrice() != null) {
  236. valuationPrice = valuationPrice.add(item.getPrice());
  237. orderFreight.setTimeAdd(item.getPrice());
  238. break;
  239. }
  240. }
  241. }
  242. // 获取日期加价配置
  243. List<PackageFreightDate> dateList = iPackageFreightDateService.getPackageById(packageId);
  244. if (CollectionUtils.isNotEmpty(dateList)) {
  245. for (PackageFreightDate item : dateList) {
  246. boolean inZone = DateUtils.YYYYMMddInZone(item.getStartDate(), item.getEndDate());
  247. if (inZone && item.getPrice() != null) {
  248. valuationPrice = valuationPrice.add(item.getPrice());
  249. orderFreight.setDateAdd(item.getPrice());
  250. break;
  251. }
  252. }
  253. }
  254. // 获取每周加价配置
  255. List<PackageFreightWeek> weekList = iPackageFreightWeekService.getPackageById(packageId);
  256. if (CollectionUtils.isNotEmpty(weekList)) {
  257. Integer todayWeek = Calendar.getInstance().get(Calendar.DAY_OF_WEEK);
  258. for (PackageFreightWeek item : weekList) {
  259. if (todayWeek.equals(item.getWeek())) {
  260. valuationPrice = valuationPrice.add(item.getPrice());
  261. orderFreight.setWeekAdd(item.getPrice());
  262. break;
  263. }
  264. }
  265. }
  266. // 计算运费金额
  267. if (packageFreight.getMaxAmount() != null && packageFreight.getMaxAmount().compareTo(valuationPrice) < 0) {
  268. orderFreight.setDeliveryAmount(packageFreight.getMaxAmount());
  269. } else {
  270. orderFreight.setDeliveryAmount(valuationPrice);
  271. }
  272. return orderFreight;
  273. } catch (Exception e) {
  274. log.error("运费包计算异常", e);
  275. return null;
  276. }
  277. }
  278. public OrderFreightDto dadaValuation(Long shopId, Member member, OrderReq orderReq) {
  279. try {
  280. BigDecimal valuationPrice = BigDecimal.ZERO;
  281. // 获取合适运费包(门店>商户>通用)
  282. Long packageId = iPackageFreightService.getPackageId(shopId, member);
  283. PackageFreight packageFreight = iPackageFreightService.getById(packageId);
  284. if (packageFreight == null) {
  285. log.warn("无合适运费包!");
  286. return null;
  287. }
  288. // 基础运费
  289. if (packageFreight.getAmount() != null) {
  290. valuationPrice = valuationPrice.add(packageFreight.getAmount());
  291. }
  292. // 订单加价详情
  293. OrderFreightDto orderFreight = new OrderFreightDto();
  294. orderFreight.setOrderId(orderReq.getOrderId());
  295. orderFreight.setFreightPackageId(packageFreight.getId());
  296. orderFreight.setAmount(packageFreight.getAmount());
  297. orderFreight.setMaxAmount(packageFreight.getMaxAmount());
  298. String startLonLat = orderReq.getSendAddress().getLng() + "," + orderReq.getSendAddress().getLat();
  299. String endLonLat = orderReq.getReceiptAddress().getLng() + "," + orderReq.getReceiptAddress().getLat();
  300. // 获取订单距离
  301. GDMapTripResult bicyclingInfo = AddressLngLatExchanger.getBicyclingInfo(startLonLat, endLonLat);
  302. orderFreight.setDistance(Integer.valueOf(bicyclingInfo.getDistance() + ""));
  303. // 获取距离加价配置
  304. List<PackageFreightDistance> distanceList = iPackageFreightDistanceService.getPackageById(packageId);
  305. if (CollectionUtils.isNotEmpty(distanceList)) {
  306. BigDecimal orderKm = new BigDecimal(String.valueOf(bicyclingInfo.getDistance())).divide(new BigDecimal(String.valueOf(1000)), 2, BigDecimal.ROUND_UP);
  307. BigDecimal distanceAdd = new BigDecimal(BigInteger.ZERO);
  308. for (PackageFreightDistance distance : distanceList) {
  309. // 起始 < orderKm <= 无穷大
  310. if (distance.getEndDistance() == null && orderKm.compareTo(distance.getStartDistance()) > 0) {
  311. // 计算加价次数
  312. BigDecimal addNum = orderKm.subtract(distance.getStartDistance()).divide(distance.getDistance(), 0, ROUND_UP);
  313. valuationPrice = valuationPrice.add(distance.getPrice().multiply(addNum));
  314. distanceAdd = distanceAdd.add(distance.getPrice().multiply(addNum));
  315. }
  316. // 起始 < orderKm <= 结束值
  317. if (distance.getEndDistance() != null && orderKm.compareTo(distance.getEndDistance()) > 0) {
  318. // 计算加价次数
  319. BigDecimal addNum = distance.getEndDistance().subtract(distance.getStartDistance()).divide(distance.getDistance(), 0, ROUND_UP);
  320. valuationPrice = valuationPrice.add(distance.getPrice().multiply(addNum));
  321. distanceAdd = distanceAdd.add(distance.getPrice().multiply(addNum));
  322. }
  323. if (distance.getEndDistance() != null &&
  324. (orderKm.compareTo(distance.getStartDistance()) > 0 && orderKm.compareTo(distance.getEndDistance()) < 1)) {
  325. // 计算加价次数
  326. BigDecimal addNum = orderKm.subtract(distance.getStartDistance()).divide(distance.getDistance(), 0, ROUND_UP);
  327. valuationPrice = valuationPrice.add(distance.getPrice().multiply(addNum));
  328. distanceAdd = distanceAdd.add(distance.getPrice().multiply(addNum));
  329. }
  330. }
  331. orderFreight.setDistanceAdd(distanceAdd);
  332. }
  333. // 获取重量加价配置
  334. List<PackageFreightWeight> weightList = iPackageFreightWeightService.getPackageById(packageId);
  335. if(CollectionUtils.isNotEmpty(weightList)) {
  336. BigDecimal orderWeight = new BigDecimal(Integer.toString(orderReq.getWeight()));
  337. BigDecimal weightAdd = new BigDecimal(BigInteger.ZERO);
  338. for (PackageFreightWeight weight : weightList) {
  339. // 起始 < orderWeight <= 无穷大
  340. if (weight.getEndWeight() == null && orderWeight.compareTo(weight.getStartWeight()) > 0) {
  341. // 计算加价次数
  342. BigDecimal addNum = orderWeight.subtract(weight.getStartWeight()).divide(weight.getWeight(), 0, ROUND_UP);
  343. valuationPrice = valuationPrice.add(weight.getPrice().multiply(addNum));
  344. weightAdd = weightAdd.add(weight.getPrice().multiply(addNum));
  345. }
  346. // 起始 < orderWeight <= 结束值
  347. if (weight.getEndWeight() != null && orderWeight.compareTo(weight.getEndWeight()) > 0) {
  348. // 计算加价次数
  349. BigDecimal addNum = weight.getEndWeight().subtract(weight.getStartWeight()).divide(weight.getWeight(), 0, ROUND_UP);
  350. valuationPrice = valuationPrice.add(weight.getPrice().multiply(addNum));
  351. weightAdd = weightAdd.add(weight.getPrice().multiply(addNum));
  352. }
  353. if (weight.getEndWeight() != null &&
  354. (orderWeight.compareTo(weight.getStartWeight()) > 0 && orderWeight.compareTo(weight.getEndWeight()) < 1)) {
  355. // 计算加价次数
  356. BigDecimal addNum = orderWeight.subtract(weight.getStartWeight()).divide(weight.getWeight(), 0, ROUND_UP);
  357. valuationPrice = valuationPrice.add(weight.getPrice().multiply(addNum));
  358. weightAdd = weightAdd.add(weight.getPrice().multiply(addNum));
  359. }
  360. }
  361. orderFreight.setWeightAdd(weightAdd);
  362. }
  363. // 获取商品金额加价配置
  364. List<PackageFreightMoney> moneyList = iPackageFreightMoneyService.getPackageById(packageId);
  365. if (CollectionUtils.isNotEmpty(moneyList)) {
  366. BigDecimal orderAmount = orderReq.getWaimaiOrderId() == null ? orderReq.getProductAmount() : orderReq.getMtMoney();
  367. BigDecimal moneyAdd = new BigDecimal(BigInteger.ZERO);
  368. for (PackageFreightMoney money : moneyList) {
  369. // 起始 < orderAmount <= 结束值
  370. if (orderAmount.compareTo(money.getEndMoney()) > 0) {
  371. valuationPrice = valuationPrice.add(money.getPrice());
  372. moneyAdd = moneyAdd.add(money.getPrice());
  373. }
  374. if (orderAmount.compareTo(money.getStartMoney()) > 0 && orderAmount.compareTo(money.getEndMoney()) < 1) {
  375. valuationPrice = valuationPrice.add(money.getPrice());
  376. moneyAdd = moneyAdd.add(money.getPrice());
  377. }
  378. }
  379. orderFreight.setProductAmountAdd(moneyAdd);
  380. }
  381. // 获取时间段加价配置
  382. List<PackageFreightTime> timeList = iPackageFreightTimeService.getPackageById(packageId);
  383. if (CollectionUtils.isNotEmpty(timeList)) {
  384. Date newDate = new Date();
  385. SimpleDateFormat sdf = new SimpleDateFormat("HH:mm");
  386. String now = sdf.format(newDate);
  387. BigDecimal timeAdd = new BigDecimal(BigInteger.ZERO);
  388. for (PackageFreightTime time : timeList) {
  389. // 起始时间段 < now <= 结束时间段
  390. if (now.compareTo(time.getEndTime()) > 0) {
  391. valuationPrice = valuationPrice.add(time.getPrice());
  392. timeAdd = timeAdd.add(time.getPrice());
  393. }
  394. if (now.compareTo(time.getStartTime()) > 0 && now.compareTo(time.getEndTime()) < 1) {
  395. valuationPrice = valuationPrice.add(time.getPrice());
  396. timeAdd = timeAdd.add(time.getPrice());
  397. }
  398. }
  399. orderFreight.setTimeAdd(timeAdd);
  400. }
  401. // 获取日期加价配置
  402. List<PackageFreightDate> dateList = iPackageFreightDateService.getPackageById(packageId);
  403. if (dateList != null && dateList.size() > 0) {
  404. Date newDate = new Date();
  405. SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
  406. Date now = sdf.parse(sdf.format(newDate));
  407. BigDecimal dateAdd = new BigDecimal(BigInteger.ZERO);
  408. for (PackageFreightDate date : dateList) {
  409. // 起始日期 < now <= 结束日期
  410. if (now.compareTo(date.getEndDate()) > 0) {
  411. valuationPrice = valuationPrice.add(date.getPrice());
  412. dateAdd = dateAdd.add(date.getPrice());
  413. }
  414. if (now.compareTo(date.getStartDate()) > 0 && now.compareTo(date.getEndDate()) < 1) {
  415. valuationPrice = valuationPrice.add(date.getPrice());
  416. dateAdd = dateAdd.add(date.getPrice());
  417. }
  418. }
  419. orderFreight.setDateAdd(dateAdd);
  420. }
  421. // 获取每周加价配置
  422. List<PackageFreightWeek> weekList = iPackageFreightWeekService.getPackageById(packageId);
  423. if (weekList != null && weekList.size() > 0) {
  424. Calendar calendar = Calendar.getInstance();
  425. Integer todayWeek = calendar.get(Calendar.DAY_OF_WEEK);
  426. BigDecimal weekAdd = new BigDecimal(BigInteger.ZERO);
  427. for (PackageFreightWeek week : weekList) {
  428. if (todayWeek.equals(week.getWeek())) {
  429. valuationPrice = valuationPrice.add(week.getPrice());
  430. weekAdd = weekAdd.add(week.getPrice());
  431. }
  432. }
  433. orderFreight.setWeekAdd(weekAdd);
  434. }
  435. // 加价超过最高运费,返回最高运费
  436. if (packageFreight.getMaxAmount() != null && packageFreight.getMaxAmount().compareTo(valuationPrice) < 0) {
  437. orderFreight.setDeliveryAmount(packageFreight.getMaxAmount());
  438. } else {
  439. orderFreight.setDeliveryAmount(valuationPrice);
  440. }
  441. return orderFreight;
  442. }catch (Exception e) {
  443. log.error("运费包计算异常", e);
  444. return null;
  445. }
  446. }
  447. private ValuationRes queryOrderDeliverFee(OrderReq orderReq, DeliveryInfo delivery, Long merchantId, Long shopId, OrderFreightDto orderFreight) {
  448. orderReq.setOrderSn(SnCodeUtils.createSn());
  449. orderReq.setAmount(orderReq.getProductAmount());
  450. OrderVo orderVo = OrderEntityUtils.createOrderVo(orderReq, delivery, deliveryConfig.isTest());
  451. orderVo.setIsMine(delivery.getIsMine());
  452. ValuationRes res = new ValuationRes();
  453. if (orderFreight.getValuationType() == 2) {
  454. ResObject<OrderResultVo> resObject = client.queryOrderDeliverFee(orderVo);
  455. if (resObject.getCode() == 0) {
  456. this.transResObject(res, delivery, resObject, orderReq, orderVo);
  457. }
  458. } else {
  459. this.transRes(res, delivery, orderFreight, orderReq, orderVo);
  460. }
  461. // 判断是否是自己平台,查询金额是否充足
  462. QueryAmount queryAmount = QueryAmountEntityUtils.queryAmount(delivery, merchantId, delivery.getIsMine());
  463. ResObject<AmountResultVo> amountRes = client.queryAmount(queryAmount);
  464. if (amountRes.getCode() == 0) {
  465. // 更新余额
  466. AmountResultVo vo = amountRes.getData();
  467. this.updateAmount(delivery, merchantId, shopId, vo.getBalanceAmount());
  468. // 自运力余额不足0.1元, 则直接计价失败
  469. if (vo.getBalanceAmount().compareTo(new BigDecimal("0.1")) < 0) {
  470. log.error("自运力余额不足, 计价失败!");
  471. throw new CustomWebException("自运力余额不足, 计价失败");
  472. }
  473. res.setIsEnough(StatusEnum.SHOW.status);
  474. res.setIsMine(1);
  475. }
  476. return res;
  477. }
  478. private void updateAmount(DeliveryInfo delivery, Long merchantId, Long shopId, BigDecimal balanceAmount) {
  479. ShopDeliveryBind shopDeliveryBind = iShopDeliveryBindService.getOne(new QueryWrapper<ShopDeliveryBind>()
  480. .eq("merchant_id", merchantId).eq("shop_id", shopId).eq("delivery_id", delivery.getId())
  481. .eq("deleted", IsDeleteEnum.NORMAL.status).eq("bind_status", 1));
  482. // 门店模式变更余额
  483. if (shopDeliveryBind != null) {
  484. iShopDeliveryBindService.updateShopAmount(shopDeliveryBind.getMerchantId(), shopDeliveryBind.getDeliveryId(), shopDeliveryBind.getThirdShopId(), balanceAmount);
  485. }
  486. }
  487. private void transResObject(ValuationRes res, DeliveryInfo delivery, ResObject<OrderResultVo> resObject, OrderReq orderReq, OrderVo orderVo) {
  488. res.setDeliveryId(delivery.getId());
  489. res.setName(delivery.getName());
  490. res.setLogo(delivery.getLogo());
  491. res.setDesc(CommonUtils.change2Km((int) resObject.getData().getDistance()));
  492. res.setDeliveryAmount(resObject.getData().getDeliverFee());
  493. res.setIsEnough(StatusEnum.STOP.status);
  494. res.setOrderSn(orderReq.getOrderSn());
  495. res.setIsMine(orderVo.getIsMine());
  496. res.setOrderNo(orderReq.getOrderNo());
  497. res.setOrderNumber(resObject.getData().getDeliveryOrderNo());
  498. res.setShopId(delivery.getShopId());
  499. res.setThirdShopId(delivery.getThirdShopId());
  500. res.setAuthToken(delivery.getAuthToken());
  501. res.setPhone(delivery.getPhone());
  502. res.setDeliveryType(delivery.getType());
  503. }
  504. private void transRes(ValuationRes res, DeliveryInfo delivery, OrderFreightDto orderFreight, OrderReq orderReq, OrderVo orderVo) {
  505. res.setDeliveryId(delivery.getId());
  506. res.setName(delivery.getName());
  507. res.setLogo(delivery.getLogo());
  508. res.setDesc(CommonUtils.change2Km(orderFreight.getDistance()));
  509. res.setDeliveryAmount(orderFreight.getDeliveryAmount());
  510. res.setIsEnough(StatusEnum.STOP.status);
  511. res.setOrderSn(orderReq.getOrderSn());
  512. res.setIsMine(orderVo.getIsMine());
  513. res.setOrderNo(orderReq.getOrderNo());
  514. res.setOrderNumber(null);
  515. res.setShopId(delivery.getShopId());
  516. res.setThirdShopId(delivery.getThirdShopId());
  517. res.setAuthToken(delivery.getAuthToken());
  518. res.setPhone(delivery.getPhone());
  519. res.setDeliveryType(delivery.getType());
  520. }
  521. }