123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557 |
- package com.ydd.app.service.impl;
- import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
- import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
- import com.ydd.api.DeliveryService;
- import com.ydd.app.OrderEntityUtils;
- import com.ydd.app.QueryAmountEntityUtils;
- import com.ydd.app.dto.OrderReq;
- import com.ydd.app.dto.ValuationRes;
- import com.ydd.app.dto.ValuationResultData;
- import com.ydd.app.service.ApiDadaValuationService;
- import com.ydd.common.core.redis.RedisCache;
- import com.ydd.common.enums.DeliveryTypeEnums;
- import com.ydd.common.utils.DateUtils;
- import com.ydd.common.utils.SnCodeUtils;
- import com.ydd.ecloud.core.utils.BigDecimalUtils;
- import com.ydd.ecloud.core.utils.JsonMapper;
- import com.ydd.module.domain.*;
- import com.ydd.module.dto.DeliveryInfo;
- import com.ydd.module.dto.OrderFreightDto;
- import com.ydd.module.enums.IsDeleteEnum;
- import com.ydd.module.enums.MemberTypeEnum;
- import com.ydd.module.enums.StatusEnum;
- import com.ydd.module.expection.CustomWebException;
- 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;
- import com.ydd.third.common.vo.shop.QueryAmount;
- import com.ydd.third.common.vo.vo.order.OrderResultVo;
- import com.ydd.third.common.vo.vo.order.OrderVo;
- import lombok.RequiredArgsConstructor;
- import lombok.extern.slf4j.Slf4j;
- import org.springframework.beans.BeanUtils;
- 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;
- import static java.math.BigDecimal.ROUND_UP;
- /**
- * 达达配送商-计价serviceImpl
- * @author 叶君翔
- * @date 2021/12/31 15:20
- */
- @Slf4j
- @Service
- @RequiredArgsConstructor(onConstructor_ = @Autowired)
- public class ApiDadaValuationServiceImpl implements ApiDadaValuationService {
- private final IPackageFreightService iPackageFreightService;
- private final IPackageFreightDateService iPackageFreightDateService;
- private final IPackageFreightDistanceService iPackageFreightDistanceService;
- private final IPackageFreightMoneyService iPackageFreightMoneyService;
- private final IPackageFreightTimeService iPackageFreightTimeService;
- private final IPackageFreightWeekService iPackageFreightWeekService;
- private final IPackageFreightWeightService iPackageFreightWeightService;
- private final DeliveryService client;
- private final IShopService iShopService;
- private final DeliveryConfig deliveryConfig;
- private final IShopDeliveryBindService iShopDeliveryBindService;
- private final IDspDeliveryService iDspDeliveryService;
- private final RedisCache redisCache;
- @Override
- 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();
- List<ValuationRes> list = new ArrayList<>();
- List<ValuationRes> supports = new ArrayList<>();
- // 达达配送商个人地址发单,使用登录用户绑定的shopId
- if (shopId == null) {
- shopId = member.getShopId();
- }
- if (shopId != null) {
- Shop shop = iShopService.getById(shopId);
- orderReq.setShopName(shop.getName());
- }
- OrderFreightDto orderFreight = new OrderFreightDto();
- DeliveryInfo info = this.getDeliveryInfo(member, shopId);
- if (info == null) {
- log.warn("未绑定达达自运力");
- return ValuationResultData.error("达达配送商模式发单, 请绑定达达自运力");
- }
- ValuationRes valuationRes = null;
- if (valuationType == 1) {
- // 达达收付模式
- orderFreight = this.getDadaValuationPrice(shopId, member, orderReq);
- if (orderFreight == null) {
- log.warn("运费包计算异常, 计价失败!");
- return ValuationResultData.error("运费包计算异常, 计价失败");
- }
- orderFreight.setValuationType(1);
- valuationRes = this.queryOrderDeliverFee(orderReq, info, member.getMerchantId(), shopId, orderFreight);
- valuationRes.setIsEnough(StatusEnum.SHOW.status);
- } else if (valuationType == 2) {
- // 达达非收付模式
- orderFreight.setValuationType(2);
- valuationRes = this.queryOrderDeliverFee(orderReq, info, member.getMerchantId(), shopId, orderFreight);
- }
- if (valuationRes == null) {
- log.warn("计价失败!");
- return ValuationResultData.error("计价失败!");
- }
- orderFreight.setDadaDspId(dadaDspId);
- // 计价金额存入redis, 24小时后自动失效, 下单时再入库
- redisCache.setCacheObject(orderReq.getOrderNo(), orderFreight, 24 * 3600, TimeUnit.SECONDS);
- valuationRes.setPreferredDelivery(info.getPreferredDelivery());
- valuationRes.setOriginalMoney(valuationRes.getDeliveryAmount());
- valuationRes.setIsMerchant(info.getIsMerchant());
- list.add(valuationRes);
- // Res数据组装
- this.setValuationRes(list, res);
- res.setOptionals(list);
- res.setSupports(supports);
- return ValuationResultData.success(res);
- }
- private void setValuationRes(List<ValuationRes> list, ValuationRes res) {
- // 获取聚合配送的预估价,选最低价格展示
- if (CollectionUtils.isNotEmpty(list)) {
- res.setDeliveryId(list.get(0).getDeliveryId());
- res.setDesc("全网运力推单");
- res.setDeliveryAmount(list.get(0).getDeliveryAmount());
- res.setName("聚合配送");
- res.setIsEnough(list.get(0).getIsEnough());
- res.setLogo("https://ecloud-cdn.51sssd.com/20210317/e24a425797f54f64b808b95beae37285.png");
- }
- }
- private DeliveryInfo getDeliveryInfo(Member member, Long shopId) {
- DspDelivery dspDelivery = iDspDeliveryService.findOne(DeliveryTypeEnums.DADA.getType());
- DeliveryInfo info = new DeliveryInfo();
- BeanUtils.copyProperties(dspDelivery, info);
- int isMine = 0;
- if (member.getMerchantId() != null) {
- ShopDeliveryBind shopDeliveryBind = iShopDeliveryBindService.getShopDeliveryBind(member.getMerchantId(), shopId, dspDelivery.getId(), dspDelivery.getType());
- if (shopDeliveryBind == null) {
- log.warn("达达配送商模式发单, 未绑定达达自运力");
- return null;
- }
- info.setAuthToken(shopDeliveryBind.getAuthToken());
- info.setThirdShopId(shopDeliveryBind.getThirdShopId());
- isMine = 1;
- 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)){
- info.setIsMerchant(StatusEnum.SHOW.status);
- }
- info.setPreferredDelivery(StatusEnum.STOP.getStatus());
- info.setIsMine(isMine);
- return info;
- }
- private OrderFreightDto getDadaValuationPrice(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.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 (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 addNum = orderDistance.divide(item.getDistance(), 0, BigDecimal.ROUND_UP);
- valuationPrice = valuationPrice.add(item.getPrice().multiply(addNum));
- orderFreight.setDistanceAdd(item.getPrice().multiply(addNum));
- break;
- }
- }
- }
- // 获取重量加价配置
- 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) {
- // 计算加价次数
- BigDecimal addNum = orderWeight.divide(item.getWeight(), 0, BigDecimal.ROUND_UP);
- valuationPrice = valuationPrice.add(item.getPrice().multiply(addNum));
- orderFreight.setWeightAdd(item.getPrice().multiply(addNum));
- break;
- }
- }
- }
- // 获取商品金额加价配置
- 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;
- }
- }
- }
- // 获取时间段加价配置
- 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;
- }
- }
- }
- // 获取日期加价配置
- 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;
- }
- }
- }
- // 获取每周加价配置
- 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 (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;
- }
- }
- 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 (CollectionUtils.isNotEmpty(distanceList)) {
- 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 = 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(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.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();
- 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)) {
- 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 (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 (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());
- OrderVo orderVo = OrderEntityUtils.createOrderVo(orderReq, delivery, deliveryConfig.isTest());
- orderVo.setIsMine(delivery.getIsMine());
- ValuationRes res = new ValuationRes();
- if (orderFreight.getValuationType() == 2) {
- ResObject<OrderResultVo> resObject = client.queryOrderDeliverFee(orderVo);
- if (resObject.getCode() == 0) {
- this.transResObject(res, delivery, resObject, orderReq, orderVo);
- }
- } else {
- this.transRes(res, delivery, orderFreight, orderReq, orderVo);
- }
- // 判断是否是自己平台,查询金额是否充足
- QueryAmount queryAmount = QueryAmountEntityUtils.queryAmount(delivery, merchantId, delivery.getIsMine());
- ResObject<AmountResultVo> amountRes = client.queryAmount(queryAmount);
- if (amountRes.getCode() == 0) {
- // 更新余额
- AmountResultVo vo = amountRes.getData();
- this.updateAmount(delivery, merchantId, shopId, vo.getBalanceAmount());
- // 自运力余额不足0.1元, 则直接计价失败
- if (vo.getBalanceAmount().compareTo(new BigDecimal("0.1")) < 0) {
- log.error("自运力余额不足, 计价失败!");
- throw new CustomWebException("自运力余额不足, 计价失败");
- }
- res.setIsEnough(StatusEnum.SHOW.status);
- res.setIsMine(1);
- }
- return res;
- }
- private void updateAmount(DeliveryInfo delivery, Long merchantId, Long shopId, BigDecimal balanceAmount) {
- ShopDeliveryBind shopDeliveryBind = iShopDeliveryBindService.getOne(new QueryWrapper<ShopDeliveryBind>()
- .eq("merchant_id", merchantId).eq("shop_id", shopId).eq("delivery_id", delivery.getId())
- .eq("deleted", IsDeleteEnum.NORMAL.status).eq("bind_status", 1));
- // 门店模式变更余额
- if (shopDeliveryBind != null) {
- iShopDeliveryBindService.updateShopAmount(shopDeliveryBind.getMerchantId(), shopDeliveryBind.getDeliveryId(), shopDeliveryBind.getThirdShopId(), balanceAmount);
- }
- }
- private void transResObject(ValuationRes res, DeliveryInfo delivery, ResObject<OrderResultVo> resObject, OrderReq orderReq, OrderVo orderVo) {
- res.setDeliveryId(delivery.getId());
- res.setName(delivery.getName());
- res.setLogo(delivery.getLogo());
- res.setDesc(CommonUtils.change2Km((int) resObject.getData().getDistance()));
- res.setDeliveryAmount(resObject.getData().getDeliverFee());
- res.setIsEnough(StatusEnum.STOP.status);
- res.setOrderSn(orderReq.getOrderSn());
- res.setIsMine(orderVo.getIsMine());
- res.setOrderNo(orderReq.getOrderNo());
- res.setOrderNumber(resObject.getData().getDeliveryOrderNo());
- res.setShopId(delivery.getShopId());
- res.setThirdShopId(delivery.getThirdShopId());
- res.setAuthToken(delivery.getAuthToken());
- res.setPhone(delivery.getPhone());
- res.setDeliveryType(delivery.getType());
- }
- private void transRes(ValuationRes res, DeliveryInfo delivery, OrderFreightDto orderFreight, OrderReq orderReq, OrderVo orderVo) {
- res.setDeliveryId(delivery.getId());
- res.setName(delivery.getName());
- res.setLogo(delivery.getLogo());
- res.setDesc(CommonUtils.change2Km(orderFreight.getDistance()));
- res.setDeliveryAmount(orderFreight.getDeliveryAmount());
- res.setIsEnough(StatusEnum.STOP.status);
- res.setOrderSn(orderReq.getOrderSn());
- res.setIsMine(orderVo.getIsMine());
- res.setOrderNo(orderReq.getOrderNo());
- res.setOrderNumber(null);
- res.setShopId(delivery.getShopId());
- res.setThirdShopId(delivery.getThirdShopId());
- res.setAuthToken(delivery.getAuthToken());
- res.setPhone(delivery.getPhone());
- res.setDeliveryType(delivery.getType());
- }
- }
|