Переглянути джерело

Merge remote-tracking branch 'origin/master'

# Conflicts:
#	lb-app/src/main/java/com/ydd/app/controller/OrderOpenApi.java
#	lb-app/src/main/java/com/ydd/app/service/OpenApiOrderService.java
#	lb-app/src/main/java/com/ydd/app/service/impl/OpenApiOrderServiceImpl.java
#	lb-common/src/main/java/com/ydd/common/enums/ResponseResultCodeEnum.java
zangbin 3 роки тому
батько
коміт
32f281d7df
24 змінених файлів з 499 додано та 69 видалено
  1. 2 3
      lb-app/src/main/java/com/ydd/app/controller/CommonApi.java
  2. 12 0
      lb-app/src/main/java/com/ydd/app/controller/OrderOpenApi.java
  3. 4 8
      lb-app/src/main/java/com/ydd/app/controller/StoreApi.java
  4. 33 0
      lb-app/src/main/java/com/ydd/app/dto/OrderCreateReq.java
  5. 10 0
      lb-app/src/main/java/com/ydd/app/dto/OrderValuationReq.java
  6. 1 1
      lb-app/src/main/java/com/ydd/app/dto/StoreStatusDto.java
  7. 5 0
      lb-app/src/main/java/com/ydd/app/dto/ValuationRes.java
  8. 8 0
      lb-app/src/main/java/com/ydd/app/service/OpenApiOrderService.java
  9. 8 5
      lb-app/src/main/java/com/ydd/app/service/impl/ApiStoreServiceImpl.java
  10. 23 0
      lb-app/src/main/java/com/ydd/app/service/impl/OpenApiOrderServiceImpl.java
  11. 298 18
      lb-app/src/main/java/com/ydd/app/service/impl/OpenApiOrderValuationServiceImpl.java
  12. 29 0
      lb-app/src/main/java/com/ydd/app/vo/OrderCreateVo.java
  13. 5 3
      lb-app/src/main/java/com/ydd/app/vo/OrderValuationVo.java
  14. 5 0
      lb-common/src/main/java/com/ydd/common/constant/RedisKeyConstant.java
  15. 7 0
      lb-common/src/main/java/com/ydd/common/enums/ResponseResultCodeEnum.java
  16. 5 0
      lb-module/src/main/java/com/ydd/module/constants/AppConstant.java
  17. 15 0
      lb-module/src/main/java/com/ydd/module/domain/MemberConfig.java
  18. 3 2
      lb-module/src/main/java/com/ydd/module/mapper/HelpColumnMapper.java
  19. 1 1
      lb-module/src/main/java/com/ydd/module/service/IHelpColumnService.java
  20. 3 3
      lb-module/src/main/java/com/ydd/module/service/impl/HelpColumnServiceImpl.java
  21. 4 2
      lb-module/src/main/resources/mapper/module/HelpColumnMapper.xml
  22. 1 1
      lb-module/src/main/resources/mapper/module/HelpMapper.xml
  23. 4 3
      lb-module/src/main/resources/mapper/module/ShopDeliveryDisableMapper.xml
  24. 13 19
      lb-module/src/main/resources/mapper/module/orderMapper.xml

+ 2 - 3
lb-app/src/main/java/com/ydd/app/controller/CommonApi.java

@@ -64,7 +64,6 @@ public class CommonApi extends BaseController {
             return BaseResult.success(result);
         } catch (Exception e) {
             logger.error("上传异常",e);
-            e.printStackTrace();
             return BaseResult.error(FILE_UPLOAD_ERROR.MSG);
         }
     }
@@ -106,8 +105,8 @@ public class CommonApi extends BaseController {
      */
     @ApiOperation("帮助中心栏目")
     @RequestMapping(value = "/help", method = RequestMethod.GET)
-    public BaseResult<List<HelpDto>> help() {
-        return BaseResult.success("OK",iHelpColumnService.getAll());
+    public BaseResult<List<HelpDto>> help(@RequestParam("type") Integer type) {
+        return BaseResult.success("OK",iHelpColumnService.getAll(type));
     }
     /**
      * 帮助中心

+ 12 - 0
lb-app/src/main/java/com/ydd/app/controller/OrderOpenApi.java

@@ -1,6 +1,10 @@
 package com.ydd.app.controller;
 
 import com.ydd.app.dto.*;
+import com.ydd.app.dto.OrderCreateReq;
+import com.ydd.app.dto.OrderReq;
+import com.ydd.app.dto.OrderValuationReq;
+import com.ydd.app.dto.PushOrderDto;
 import com.ydd.app.service.OpenApiOrderService;
 import com.ydd.app.service.OpenApiOrderValuationService;
 import com.ydd.common.annotation.ControllerLog;
@@ -40,6 +44,14 @@ public class OrderOpenApi {
         return openApiOrderValuationService.valuation(valuationReq);
     }
 
+    @ApiOperation("开放接口-创建订单")
+    @RequestMapping(value = "/create", method = RequestMethod.POST)
+    @RepeatSubmit
+    @ControllerLog("开放接口-创建订单")
+    public ResponseResult create(@RequestBody @Valid OrderCreateReq orderCreateReq) {
+        return openApiOrderService.createOrder(orderCreateReq);
+    }
+
     @ApiOperation("开放接口-推送订单")
     @RequestMapping(value = "/push", method = RequestMethod.POST)
     public ResponseResult pushOrder(@Valid @RequestBody OrderPushReq pushReq) {

+ 4 - 8
lb-app/src/main/java/com/ydd/app/controller/StoreApi.java

@@ -97,15 +97,11 @@ public class StoreApi extends BaseController {
     @RequestMapping(value = "/delivery", method = RequestMethod.POST)
     @AccessToken
     public ResponseResult delivery(@RequestBody @Validated StoreStatusDto dto) {
-        if (StringUtils.isNotBlank(dto.getDeliveryIdStr())) {
-            JSONObject json = apiStoreService.queryhopDelivery(getLoginId(), dto);
-            if (json.get("code") != null) {
-                return ResponseResult.error((ResponseResultCodeEnum) json.get("code"));
-            } else {
-                return ResponseResult.success(json);
-            }
+        JSONObject json = apiStoreService.queryhopDelivery(getLoginId(), dto);
+        if (json.get("code") != null) {
+            return ResponseResult.error((ResponseResultCodeEnum) json.get("code"));
         } else {
-            return ResponseResult.error(ResponseResultCodeEnum.SHOP_DELIVERY_NOT_FOUND);
+            return ResponseResult.success(json);
         }
     }
 

+ 33 - 0
lb-app/src/main/java/com/ydd/app/dto/OrderCreateReq.java

@@ -0,0 +1,33 @@
+package com.ydd.app.dto;
+
+import lombok.Data;
+
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.Size;
+import java.io.Serializable;
+
+
+/**
+ * 创建订单请求参数
+ * @author 叶君翔
+ * @date 2022/04/12 17:39
+ */
+@Data
+public class OrderCreateReq extends BaseDto implements Serializable {
+
+    private static final long serialVersionUID = 2336025605696861690L;
+
+    /**
+     * 接入方订单编号
+     */
+    @NotBlank(message = "接入方订单编号不能为空")
+    @Size(max = 32, message = "接入方订单编号最长不能超过32个字符")
+    private String outOrderSn;
+
+    /**
+     * 下单运力id,多个用英文逗号拼接
+     */
+    @NotBlank(message = "下单运力不能为空")
+    private String deliveryIdStr;
+
+}

+ 10 - 0
lb-app/src/main/java/com/ydd/app/dto/OrderValuationReq.java

@@ -57,6 +57,11 @@ public class OrderValuationReq extends BaseDto implements Serializable {
     private String receiverCityName;
 
     /**
+     * 收件城市编码
+     */
+    private String receiverCityCode;
+
+    /**
      * 收件人所在区
      */
     @Size(max = 40, message = "收件人所在区最长不能超过40个字符")
@@ -123,6 +128,11 @@ public class OrderValuationReq extends BaseDto implements Serializable {
     private String sendCityName;
 
     /**
+     * 发件城市编码
+     */
+    private String sendCityCode;
+
+    /**
      * 发件人所在区,当传入shopCode门店编号时,不必填,根据门店信息发单
      */
     @Size(max = 30, message = "发件人所在区最长不能超过30个字符")

+ 1 - 1
lb-app/src/main/java/com/ydd/app/dto/StoreStatusDto.java

@@ -26,6 +26,6 @@ public class StoreStatusDto extends BaseDto implements Serializable {
 
     private String deliveryIdStr;
 
-    private String status;
+    private Integer status;
 
 }

+ 5 - 0
lb-app/src/main/java/com/ydd/app/dto/ValuationRes.java

@@ -51,6 +51,11 @@ public class ValuationRes implements Serializable, Comparable<ValuationRes> {
     private String desc;
 
     /**
+     * 配送距离, 单位: 米
+     */
+    private String distance;
+
+    /**
      * 预估配送费
      */
     @ApiModelProperty(value = "预估配送费")

+ 8 - 0
lb-app/src/main/java/com/ydd/app/service/OpenApiOrderService.java

@@ -2,6 +2,7 @@ package com.ydd.app.service;
 
 import com.ydd.app.dto.OrderCancelReq;
 import com.ydd.app.dto.OrderLocationReq;
+import com.ydd.app.dto.OrderCreateReq;
 import com.ydd.app.dto.OrderReq;
 import com.ydd.app.dto.OrderPushReq;
 import com.ydd.common.core.domain.ResponseResult;
@@ -21,6 +22,13 @@ public interface OpenApiOrderService {
     ResponseResult pushOrder(OrderPushReq pushReq);
 
     /**
+     * 创建订单
+     * @param orderCreateReq 创建订单请求参数
+     * @return 创建订单返回结果
+     */
+    ResponseResult createOrder(OrderCreateReq orderCreateReq);
+
+    /**
      * 取消订单
      * @param cancelReq 取消订单请求参数
      * @return 取消结果

+ 8 - 5
lb-app/src/main/java/com/ydd/app/service/impl/ApiStoreServiceImpl.java

@@ -2,6 +2,7 @@ package com.ydd.app.service.impl;
 
 import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
 import com.ydd.api.DeliveryService;
 import com.ydd.app.ShopEditUtils;
 import com.ydd.app.ShopEntityUtils;
@@ -31,6 +32,7 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
+import java.util.Arrays;
 import java.util.List;
 import java.util.Map;
 import java.util.stream.Collectors;
@@ -272,15 +274,16 @@ public class ApiStoreServiceImpl implements ApiStoreService {
             json.put("code", ResponseResultCodeEnum.SHOP_NOT_EXIST);
             return  json;
         }
-        String deliverIds = storeStatusDto.getDeliveryIdStr();
-        if(StatusEnum.SHOW.getStatus().equals(storeStatusDto.getStatus())){
-            iShopDeliveryDisableService.remove(new QueryWrapper<ShopDeliveryDisable>().in("delivery_type",deliverIds).eq("shop_id",shop.getId()));
+        String deliverIdStr = storeStatusDto.getDeliveryIdStr();
+        List<String> deliverIds= Arrays.stream(deliverIdStr.split(",")).collect(Collectors.toList());
+        if(StatusEnum.SHOW.getStatus()==storeStatusDto.getStatus()){
+            iShopDeliveryDisableService.remove(new UpdateWrapper<ShopDeliveryDisable>().in("delivery_type",deliverIds).eq("shop_id",shop.getId()));
         }else{
-            String[] ids = deliverIds.split(",");
+            String[] ids = deliverIdStr.split(",");
             for(int i=0;i<ids.length;i++){
                 ShopDeliveryDisable bean = new ShopDeliveryDisable();
                 bean.setAppId(storeStatusDto.getAppId());
-                bean.setDeliveryType(Long.valueOf(ids[i]));
+                bean.setDeliveryType(Integer.valueOf(ids[i]));
                 bean.setShopId(shop.getId());
                 iShopDeliveryDisableService.save(bean);
             }

+ 23 - 0
lb-app/src/main/java/com/ydd/app/service/impl/OpenApiOrderServiceImpl.java

@@ -6,15 +6,21 @@ import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
 import com.ydd.api.DeliveryService;
 import com.ydd.app.dto.OrderCancelReq;
 import com.ydd.app.dto.OrderLocationReq;
+import com.ydd.app.dto.OrderCreateReq;
 import com.ydd.app.dto.OrderReq;
 import com.ydd.app.dto.OrderPushReq;
 import com.ydd.app.service.ApiOrderNewService;
+import com.ydd.app.dto.PushOrderDto;
+import com.ydd.app.service.ApiOrderNewService;
 import com.ydd.app.service.OpenApiOrderService;
 import com.ydd.app.vo.OrderLocationVo;
+import com.ydd.app.vo.OrderCreateVo;
 import com.ydd.app.vo.PushOrderVo;
+import com.ydd.common.constant.RedisKeyConstant;
 import com.ydd.common.core.domain.ResponseResult;
 import com.ydd.common.core.redis.RedisCache;
 import com.ydd.common.enums.DeliveryTypeEnums;
+import com.ydd.common.core.redis.RedisCache;
 import com.ydd.common.enums.ResponseResultCodeEnum;
 import com.ydd.common.enums.WaimaiTypeEnums;
 import com.ydd.common.utils.SnCodeUtils;
@@ -693,4 +699,21 @@ public class OpenApiOrderServiceImpl implements OpenApiOrderService {
             return locationVo;
     }
 
+    @Override
+    public ResponseResult createOrder(OrderCreateReq orderCreateReq) {
+        // 计价结果缓存到redis, 10分钟有效, 到时需重新计价
+        if (!redisCache.hasKey(RedisKeyConstant.VALUATION_RESULT + orderCreateReq.getOutOrderSn())) {
+            return ResponseResult.error(ResponseResultCodeEnum.VALUATION_INVALID);
+        }
+        OrderReq orderReq = redisCache.getCacheObject(RedisKeyConstant.VALUATION_RESULT + orderCreateReq.getOutOrderSn());
+        Object result = apiOrderNewService.createOrder(orderReq.getMemberId(), orderReq, 1);
+        if ("amount_not_enough".equals(result)) {
+            return ResponseResult.error(ResponseResultCodeEnum.AMOUNT_NOT_ENOUGH);
+        } else if ("ok".equals(result)) {
+            OrderCreateVo orderCreateVo = OrderCreateVo.builder().orderSn(orderReq.getOrderNo()).outOrderSn(orderCreateReq.getOutOrderSn()).build();
+            return ResponseResult.success(orderCreateVo);
+        }
+        return ResponseResult.error(ResponseResultCodeEnum.ORDER_CREATE_ERR);
+    }
+
 }

+ 298 - 18
lb-app/src/main/java/com/ydd/app/service/impl/OpenApiOrderValuationServiceImpl.java

@@ -1,23 +1,38 @@
 package com.ydd.app.service.impl;
 
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
-import com.ydd.app.dto.OrderValuationDto;
-import com.ydd.app.dto.OrderValuationReq;
-import com.ydd.app.dto.ValuationRes;
+import com.ydd.api.DeliveryService;
+import com.ydd.app.OrderEntityUtils;
+import com.ydd.app.QueryAmountEntityUtils;
+import com.ydd.app.dto.*;
 import com.ydd.app.response.OrderValuationResponse;
 import com.ydd.app.service.OpenApiOrderValuationService;
 import com.ydd.app.vo.OrderValuationVo;
 import com.ydd.common.constant.BillingConstant;
+import com.ydd.common.constant.RedisKeyConstant;
 import com.ydd.common.core.domain.ResponseResult;
+import com.ydd.common.core.redis.RedisCache;
 import com.ydd.common.enums.DeliveryTypeEnums;
 import com.ydd.common.enums.ResponseResultCodeEnum;
+import com.ydd.common.utils.DateUtils;
 import com.ydd.common.utils.SnCodeUtils;
 import com.ydd.common.utils.StringUtils;
+import com.ydd.ecloud.core.enums.DeletedEnum;
 import com.ydd.ecloud.core.utils.BigDecimalUtils;
+import com.ydd.module.constants.AppConstant;
 import com.ydd.module.domain.*;
 import com.ydd.module.dto.*;
 import com.ydd.module.enums.*;
 import com.ydd.module.service.*;
+import com.ydd.module.utils.CommonUtils;
+import com.ydd.system.domain.SysConfig;
+import com.ydd.system.service.ISysConfigService;
+import com.ydd.third.common.config.DeliveryConfig;
+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.apache.commons.collections4.CollectionUtils;
@@ -28,6 +43,7 @@ import org.springframework.stereotype.Service;
 
 import java.math.BigDecimal;
 import java.util.*;
+import java.util.concurrent.TimeUnit;
 import java.util.stream.Collectors;
 
 /**
@@ -66,6 +82,17 @@ public class OpenApiOrderValuationServiceImpl implements OpenApiOrderValuationSe
 
     private final IMemberConfigService iMemberConfigService;
 
+    private final DeliveryConfig deliveryConfig;
+
+    private final ISysConfigService iSysConfigService;
+
+    private final DeliveryService client;
+
+    private final IShopDeliveryBindService iShopDeliveryBindService;
+
+    private final RedisCache redisCache;
+
+
     @Override
     public ResponseResult valuation(OrderValuationReq valuationReq) {
         OrderValuationDto valuationDto = new OrderValuationDto();
@@ -95,7 +122,7 @@ public class OpenApiOrderValuationServiceImpl implements OpenApiOrderValuationSe
                 types = deliveryDetailDtoList.stream().map(PackageDeliveryDetailDto::getDeliveryType).collect(Collectors.toList());
             }
         }
-        // 获取门店屏蔽运力
+        // 获取门店屏蔽运力(开放平台门店)
         List<Integer> disableDeliveryTypes = iShopDeliveryDisableService.list(new QueryWrapper<ShopDeliveryDisable>()
                 .eq("shop_id", valuationDto.getShopId()).eq("deleted", 0))
                 .stream().map(ShopDeliveryDisable::getDeliveryType).collect(Collectors.toList());
@@ -123,8 +150,9 @@ public class OpenApiOrderValuationServiceImpl implements OpenApiOrderValuationSe
             List<PackageCommissionDetailDto> commissionDetailDtoList = iPackageCommissionDetailService.getCommissionListByPackageIdAndDeliveryType(commissionPackageId, deliveryTypes);
             packageCommissionMap = commissionDetailDtoList.stream().collect(Collectors.groupingBy(PackageCommissionDetailDto::getDeliveryType));
         }
+        OrderReq orderReq = this.convertToOrderReq(valuationDto);
         // 计价
-        List<ValuationRes> list = this.getValuationResList(member, valuationDto, deliveryInfos, packageDeliveryDto, packageDiscountMap, packageCommissionMap);
+        List<ValuationRes> list = this.getValuationResList(orderReq, valuationDto, deliveryInfos, packageDeliveryDto, packageDiscountMap, packageCommissionMap);
         // 默认价格优先
         list.sort(Comparator.comparing(ValuationRes::getDeliveryAmount));
         // 运力包发单类型为自定义, 则先按照sort排,再按价格排
@@ -137,7 +165,10 @@ public class OpenApiOrderValuationServiceImpl implements OpenApiOrderValuationSe
         if (packageDeliveryDto != null) {
             billList = this.setBillingDuration(packageDeliveryDto, billList);
         }
-        // todo: 计价结果缓存到redis, 10分钟有效
+        orderReq.setMemberId(member.getId());
+        orderReq.setValuationRes(billList);
+        // 计价结果缓存到redis, 10分钟有效, 到时需重新计价
+        redisCache.setCacheObject(RedisKeyConstant.VALUATION_RESULT + valuationDto.getOutOrderSn(), orderReq, AppConstant.VALUATION_RESULT_EFFECTIVE_MINUTES, TimeUnit.MINUTES);
         // 数据转换
         List<OrderValuationVo> valuationVos = this.convertResult(billList);
         OrderValuationResponse response = OrderValuationResponse.builder().valuationList(valuationVos).outOrderSn(valuationReq.getOutOrderSn()).build();
@@ -145,8 +176,21 @@ public class OpenApiOrderValuationServiceImpl implements OpenApiOrderValuationSe
     }
 
     private List<OrderValuationVo> convertResult(List<ValuationRes> billList) {
-        // todo: 数据转换
-        return null;
+        List<OrderValuationVo> valuationVos = Lists.newArrayList();
+        for (ValuationRes valuationRes : billList) {
+            OrderValuationVo valuationVo = new OrderValuationVo();
+            valuationVo.setDeliveryId(valuationRes.getDeliveryType());
+            valuationVo.setDeliveryName(valuationRes.getName());
+            valuationVo.setDistance(valuationRes.getDesc());
+            if (valuationRes.getDeliveryAmount() != null) {
+                valuationVo.setDeliveryAmount(valuationRes.getDeliveryAmount().setScale(2, BigDecimal.ROUND_HALF_UP));
+                // 暂时第三方
+                valuationVo.setDiscountAmount(BigDecimal.ZERO);
+                valuationVo.setNeedPayAmount(valuationVo.getDeliveryAmount().subtract(valuationVo.getDiscountAmount()));
+            }
+            valuationVos.add(valuationVo);
+        }
+        return valuationVos;
     }
 
     private List<ValuationRes> handleBillList(Long memberId, List<ValuationRes> list) {
@@ -172,9 +216,11 @@ public class OpenApiOrderValuationServiceImpl implements OpenApiOrderValuationSe
         Optional<ValuationRes> optional = billList.stream().filter(item -> !item.getDeliveryType().equals(DeliveryTypeEnums.SHAN_SONG.getType())).findFirst();
         if (optional.isPresent()) {
             String desc = optional.get().getDesc();
+            String distance = optional.get().getDistance();
             for (ValuationRes res1 : billList) {
                 if (DeliveryTypeEnums.SHAN_SONG.getType().equals(res1.getDeliveryType())) {
                     res1.setDesc(desc);
+                    res1.setDistance(distance);
                     break;
                 }
             }
@@ -182,15 +228,16 @@ public class OpenApiOrderValuationServiceImpl implements OpenApiOrderValuationSe
         return billList;
     }
 
-    private List<ValuationRes> getValuationResList(Member member, OrderValuationDto valuationDto, List<DeliveryInfo> deliveryInfos, PackageDeliveryDto packageDeliveryDto, Map<Integer, List<PackageDiscountDetailDto>> packageDiscountMap, Map<Integer, List<PackageCommissionDetailDto>> packageCommissionMap) {
+    private List<ValuationRes> getValuationResList(OrderReq orderReq, OrderValuationDto valuationDto, List<DeliveryInfo> deliveryInfos, PackageDeliveryDto packageDeliveryDto, Map<Integer, List<PackageDiscountDetailDto>> packageDiscountMap, Map<Integer, List<PackageCommissionDetailDto>> packageCommissionMap) {
         List<ValuationRes> valuationResList = Lists.newArrayList();
-        for (DeliveryInfo info : deliveryInfos) {
+        for (DeliveryInfo deliveryInfo : deliveryInfos) {
+//            OrderReq orderReq = this.convertToOrderReq(valuationDto);
             // 计价
-            ValuationRes valuationRes = this.doValuation(valuationDto, info, valuationDto.getMerchantId(), valuationDto.getShopId());
-            if (valuationRes == null) {
+            ValuationRes valuationRes = this.doValuation(orderReq, deliveryInfo, valuationDto.getMerchantId(), valuationDto.getShopId());
+            if (Objects.isNull(valuationRes)) {
                 continue;
             }
-            valuationRes.setPreferredDelivery(info.getPreferredDelivery());
+            valuationRes.setPreferredDelivery(deliveryInfo.getPreferredDelivery());
             valuationRes.setOriginalMoney(valuationRes.getDeliveryAmount());
             // 设置排序
             if (packageDeliveryDto != null && PackageDeliveryTypeEnum.CUSTOM.type.equals(packageDeliveryDto.getType())) {
@@ -198,15 +245,16 @@ public class OpenApiOrderValuationServiceImpl implements OpenApiOrderValuationSe
             }
             // 设置优惠
             if (packageDiscountMap.size() > 0) {
-                this.setDiscountInfo(packageDiscountMap.get(info.getType()), valuationRes);
+                this.setDiscountInfo(packageDiscountMap.get(deliveryInfo.getType()), valuationRes);
             }
             // 设置佣金
             if (packageCommissionMap.size() > 0) {
-                this.setCommissionInfo(packageCommissionMap.get(info.getType()), valuationRes);
+                this.setCommissionInfo(packageCommissionMap.get(deliveryInfo.getType()), valuationRes);
             }
-            valuationRes.setIsMerchant(info.getIsMerchant());
+            valuationRes.setIsMerchant(deliveryInfo.getIsMerchant());
             if (valuationRes.getIsMine() == 0) {
                 // 校验余额是否充足
+                Member member = iMemberService.getOne(new QueryWrapper<Member>().eq("member_type", MemberTypeEnum.MERCHANT.type).eq("merchant_id", valuationDto.getMerchantId()));
                 if (member.getAmount().compareTo(valuationRes.getDeliveryAmount()) >= 0) {
                     valuationRes.setIsEnough(StatusEnum.SHOW.status);
                 }
@@ -216,11 +264,243 @@ public class OpenApiOrderValuationServiceImpl implements OpenApiOrderValuationSe
         return valuationResList;
     }
 
-    private ValuationRes doValuation(OrderValuationDto valuationDto, DeliveryInfo info, Long merchantId, Long shopId) {
-        // todo: 计价主逻辑
+    private OrderReq convertToOrderReq(OrderValuationDto valuationDto) {
+        OrderReq orderReq = new OrderReq();
+        BeanUtils.copyProperties(valuationDto, orderReq);
+
+        AddressReq sendAddress = new AddressReq();
+        sendAddress.setContact(valuationDto.getSendName());
+        sendAddress.setPhone(valuationDto.getSendPhone());
+        sendAddress.setProvinceName(valuationDto.getSendProvinceName());
+        sendAddress.setCityName(valuationDto.getSendCityName());
+        sendAddress.setDistrictName(valuationDto.getSendDistrictName());
+        sendAddress.setAddress(valuationDto.getSendAddress());
+        sendAddress.setStreet(valuationDto.getSendHouseNumber());
+        sendAddress.setLng(valuationDto.getSendLng());
+        sendAddress.setLat(valuationDto.getSendLat());
+        sendAddress.setCityCode(valuationDto.getSendCityCode());
+        orderReq.setSendAddress(sendAddress);
+
+        AddressReq receiptAddress = new AddressReq();
+        receiptAddress.setContact(valuationDto.getReceiverName());
+        receiptAddress.setPhone(valuationDto.getReceiverPhone());
+        receiptAddress.setProvinceName(valuationDto.getReceiverProvinceName());
+        receiptAddress.setCityName(valuationDto.getReceiverCityName());
+        receiptAddress.setDistrictName(valuationDto.getReceiverDistrictName());
+        receiptAddress.setAddress(valuationDto.getReceiverAddress());
+        receiptAddress.setStreet(valuationDto.getReceiverHouseNumber());
+        receiptAddress.setLng(valuationDto.getReceiverLng());
+        receiptAddress.setLat(valuationDto.getReceiverLat());
+        receiptAddress.setCityCode(valuationDto.getReceiverCityCode());
+        orderReq.setReceiptAddress(receiptAddress);
+
+        orderReq.setOrderNo(valuationDto.getOrderSn());
+        orderReq.setDaySeq(valuationDto.getDaySeq());
+        orderReq.setProduct(valuationDto.getProduct());
+        orderReq.setProductId(valuationDto.getCategoryId());
+        orderReq.setWeight(valuationDto.getWeight());
+
+        if (StringUtils.isNotBlank(valuationDto.getShopCode())) {
+            orderReq.setShopId(valuationDto.getShopId());
+            orderReq.setShopName(valuationDto.getShopName());
+        }
+        orderReq.setIsMine(0);
+        orderReq.setPlatformType(0);
+        orderReq.setTransport(0);
+        // 对接开放接口的均为余额支付
+        orderReq.setPaymentType(PaymentTypeEnum.BALANCE.type);
+        orderReq.setTakeRemark(valuationDto.getRemark());
+        // 对接开放接口均为自选运力
+        orderReq.setDeliveryType(2);
+        // 对接开放接口均为立即取件,取件时间为当前
+        orderReq.setTakeType(0);
+        orderReq.setTakeTime(DateUtils.format(new Date(), DateUtils.YYYY_MM_DD_HH_MM_SS));
+
+        return orderReq;
+    }
+
+    private ValuationRes doValuation(OrderReq orderReq, DeliveryInfo delivery, Long merchantId, Long shopId) {
+        orderReq.setOrderSn(SnCodeUtils.createSn());
+        orderReq.setAmount(orderReq.getProductAmount());
+        OrderVo orderVo = OrderEntityUtils.createOrderVo(orderReq, delivery, deliveryConfig.isTest());
+        // 获取用户配置
+        MemberConfig memberConfig = iMemberConfigService.getShopMemberConfig(shopId, null);
+        if (memberConfig != null && memberConfig.getSyncGoodsDetailToDelivery().equals(DeletedEnum.YES.getValue())) {
+            // 是否同步订单商品给骑手
+            orderVo.setMtGoods(Lists.newArrayList());
+        }
+        orderVo.setIsMine(delivery.getIsMine());
+        if (DeliveryTypeEnums.FENG_NIAO.getType().equals(delivery.getType()) || DeliveryTypeEnums.MEI_TUAN.getType().equals(delivery.getType())
+                || DeliveryTypeEnums.FENG_NIAO_PT.getType().equals(delivery.getType())) {
+            ShopDelivery shopDelivery = iShopDeliveryService.findOne(shopId, delivery.getId());
+            if (shopDelivery == null || !BindStatusEnum.BIND.status.equals(shopDelivery.getBindStatus())) {
+                return null;
+            }
+        }
+
+//        if ((DeliveryTypeEnums.FENG_NIAO.getType().equals(delivery.getType())
+//                || DeliveryTypeEnums.MEI_TUAN.getType().equals(delivery.getType())
+//                ||DeliveryTypeEnums.FENG_NIAO_PT.getType().equals(delivery.getType()))
+//                && DefaultShopEnum.SHOW.status.equals(defaultShop)) {
+//            return null;
+//        }
+
+        if ((DeliveryTypeEnums.FENG_NIAO.getType().equals(delivery.getType())||DeliveryTypeEnums.FENG_NIAO_PT.getType().equals(delivery.getType())) && shopId == null) {
+            return null;
+        }
+        // 美团跑腿未绑定不参与计价
+        if ((DeliveryTypeEnums.MEI_TUAN_ZB.getType().equals(delivery.getType()) ||DeliveryTypeEnums.MEI_TUAN_SG_ZB.getType().equals(delivery.getType())) && delivery.getIsMine() == 0){
+            return null;
+        }
+        if ((DeliveryTypeEnums.MEI_TUAN_ZB.getType().equals(delivery.getType()) || DeliveryTypeEnums.MEI_TUAN_SG_ZB.getType().equals(delivery.getType()))){
+            SysConfig sysConfig = iSysConfigService.selectSysConfigByKey("MT_PT");
+            if (sysConfig.getConfigValue().equals("yes") && shopId != 1626){
+                return null;
+            }
+        }
+        ResObject<OrderResultVo> resObject = client.queryOrderDeliverFee(orderVo);
+        if (resObject.getCode() == 0) {
+            ValuationRes res = new ValuationRes();
+            transResObject(res, delivery, resObject, orderReq, orderVo);
+            // 判断是否是自己平台,查询金额是否充足  (对接开放平台暂时无自运力逻辑, 此处保留防止需求变更)
+            if (delivery.getIsMine() == 1 && !delivery.getType().equals(DeliveryTypeEnums.KUAI_FU.getType())
+                    && !delivery.getType().equals(DeliveryTypeEnums.MEI_TUAN_ZB.getType())
+                    && !DeliveryTypeEnums.MEI_TUAN_ZB.getType().equals(delivery.getType())) {
+                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());
+                    if (vo.getBalanceAmount().compareTo(res.getDeliveryAmount()) >= 0) {
+                        res.setIsEnough(StatusEnum.SHOW.status);
+                        res.setIsMine(1);
+                    } else {
+                        //uupt需重新计价
+                        res.setIsMine(0);
+                        orderVo.setIsMine(0);
+                        if (DeliveryTypeEnums.UUPT.getName().equals(orderVo.getLbClient())||DeliveryTypeEnums.SHAN_SONG.getName().equals(orderVo.getLbClient())) {
+                            orderVo.setOpenId("");
+                            resObject = client.queryOrderDeliverFee(orderVo);
+                            if (resObject.getCode() == 0) {
+                                transResObject(res, delivery, resObject, orderReq, orderVo);
+                            } else {
+                                res = null;
+                            }
+                        }
+                        if (DeliveryTypeEnums.DADA.getType().equals(delivery.getType()) || DeliveryTypeEnums.DADA_YZ.getType().equals(delivery.getType())){
+                            // 达达/优质余额不足,重新计价
+                            log.info("余额不足----" + DeliveryTypeEnums.getNameByType(delivery.getType()) + "余额不足,重新计价");
+                            ShopDelivery sd = iShopDeliveryService.getOne(new QueryWrapper<ShopDelivery>().eq("merchant_id", merchantId).eq("delivery_id", delivery.getId())
+                                    .eq("deleted", IsDeleteEnum.NORMAL.status).eq("shop_id", shopId).eq("bind_status",1));
+                            if (sd != null && sd.getThirdShopId() != null) {
+                                orderVo.setShopNo(sd.getThirdShopId());
+                                delivery.setShopId(sd.getThirdShopId());
+                            } else {
+                                // 如果默认店铺被删了,则取列表第一个
+                                List<ShopDelivery> deliveries = iShopDeliveryService.list(new QueryWrapper<ShopDelivery>().eq("merchant_id", merchantId).eq("delivery_id", delivery.getId())
+                                        .eq("deleted", IsDeleteEnum.NORMAL.status).isNotNull("third_shop_id"));
+                                if (CollectionUtils.isNotEmpty(deliveries)){
+                                    orderVo.setShopNo(deliveries.get(0).getThirdShopId());
+                                    delivery.setShopId(deliveries.get(0).getThirdShopId());
+                                }
+                            }
+                            orderVo.setMerchantId(null);
+                            resObject = client.queryOrderDeliverFee(orderVo);
+                            if (resObject.getCode() == 0) {
+                                transResObject(res, delivery, resObject, orderReq, orderVo);
+                            }else{
+                                res = null;
+                            }
+                        }
+                        // 顺丰自运力余额不足,转猎豹平台重写计价
+                        if (DeliveryTypeEnums.SHUN_FENG.getName().equals(orderVo.getLbClient())) {
+                            delivery.setIsMine(0);
+                            delivery.setThirdShopId(null);
+                            OrderVo reOrderVo = OrderEntityUtils.createOrderVo(orderReq, delivery, deliveryConfig.isTest());
+                            reOrderVo.setIsMine(delivery.getIsMine());
+                            resObject = client.queryOrderDeliverFee(reOrderVo);
+                            if (resObject.getCode() == 0) {
+                                transResObject(res, delivery, resObject, orderReq, orderVo);
+                            }else{
+                                res = null;
+                            }
+                        }
+
+                    }
+                }
+            } else if (delivery.getIsMine() == 1 && delivery.getType().equals(DeliveryTypeEnums.KUAI_FU.getType())) {
+                if (!resObject.getData().getFeStatus().equals("1")) {
+
+                    res.setIsMine(0);
+                    orderVo.setIsMine(0);
+                    orderVo.setAccessToken(null);
+                    orderVo.setOpenId(null);
+                    resObject = client.queryOrderDeliverFee(orderVo);
+                    if (resObject.getCode() == 0) {
+                        transResObject(res, delivery, resObject, orderReq, orderVo);
+                    }else{
+                        res = null;
+                    }
+                }
+            }
+            return res;
+        }
         return null;
     }
 
+    private void updateAmount(DeliveryInfo delivery, Long merchantId, Long shopId, BigDecimal balanceAmount) {
+        if (DeliveryTypeEnums.DADA.getType().equals(delivery.getType())
+                || DeliveryTypeEnums.DADA_YZ.getType().equals(delivery.getType())
+                || DeliveryTypeEnums.FENG_NIAO.getType().equals(delivery.getType())
+                || DeliveryTypeEnums.SHUN_FENG.getType().equals(delivery.getType())
+                || DeliveryTypeEnums.MEI_TUAN_ZB.getType().equals(delivery.getType())) {
+            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);
+            }
+        } else {
+            ShopDeliveryBind shopDeliveryBind = iShopDeliveryBindService.getOne(new QueryWrapper<ShopDeliveryBind>()
+                    .eq("merchant_id", merchantId).eq("delivery_id", delivery.getId())
+                    .eq("deleted", IsDeleteEnum.NORMAL.status).isNull("shop_id")
+                    .eq("bind_status", 1));
+            // 商户模式变更余额
+            if (shopDeliveryBind != null) {
+                iShopDeliveryBindService.updateMerchantAmount(shopDeliveryBind.getId(), 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.setDistance(String.valueOf(resObject.getData().getDistance()));
+        res.setDeliveryAmount(resObject.getData().getDeliverFee());
+        res.setIsEnough(StatusEnum.STOP.status);
+        res.setTotalMoney(resObject.getData().getTotalMoney());
+        res.setNeedPaymoney(resObject.getData().getNeedPaymoney());
+        res.setPriceToken(resObject.getData().getPriceToken());
+        // res.setDeliveryInfo(delivery);
+        res.setOrderSn(orderReq.getOrderSn());
+        res.setIsMine(orderVo.getIsMine());
+        res.setOrderNo(orderReq.getOrderNo());
+        res.setCityId(resObject.getData().getCityId());
+        res.setCityInfoRevision(resObject.getData().getCityInfoRevision());
+        res.setOrderVehicleId(resObject.getData().getOrderVehicleId());
+        res.setTotalPriceFen(resObject.getData().getHllAmount());
+        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 setBillingSort(PackageDeliveryDto packageDeliveryDto, ValuationRes valuationRes) {
         List<PackageDeliveryDetailDto> deliveryDetailDtoList = packageDeliveryDto.getPackageDeliveryDetailDtoList();
         if (CollectionUtils.isNotEmpty(deliveryDetailDtoList)) {

+ 29 - 0
lb-app/src/main/java/com/ydd/app/vo/OrderCreateVo.java

@@ -0,0 +1,29 @@
+package com.ydd.app.vo;
+
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+/**
+ * 创建订单结果
+ * @author 叶君翔
+ * @date 2022/04/12 18:38
+ */
+@Data
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class OrderCreateVo {
+
+    /**
+     * 外部订单号
+     */
+    private String outOrderSn;
+
+    /**
+     * 猎豹订单号
+     */
+    private String orderSn;
+
+}

+ 5 - 3
lb-app/src/main/java/com/ydd/app/vo/OrderValuationVo.java

@@ -2,6 +2,8 @@ package com.ydd.app.vo;
 
 import lombok.Data;
 
+import java.math.BigDecimal;
+
 /**
  * 运力计价结果
  * @author 叶君翔
@@ -28,16 +30,16 @@ public class OrderValuationVo {
     /**
      * 预估运费金额,单位: 元
      */
-    private String deliveryAmount;
+    private BigDecimal deliveryAmount;
 
     /**
      * 优惠金额,单位: 元
      */
-    private String discountAmount;
+    private BigDecimal discountAmount;
 
     /**
      * 最终需支付金额,单位: 元
      */
-    private String needPayAmount;
+    private BigDecimal needPayAmount;
 
 }

+ 5 - 0
lb-common/src/main/java/com/ydd/common/constant/RedisKeyConstant.java

@@ -37,4 +37,9 @@ public interface RedisKeyConstant {
      */
     String MEMBER_DAY_SEQ = "member_day_seq:date:";
 
+    /**
+     * 计价结果缓存key
+     */
+    String VALUATION_RESULT = "valuation_result:";
+
 }

+ 7 - 0
lb-common/src/main/java/com/ydd/common/enums/ResponseResultCodeEnum.java

@@ -35,6 +35,13 @@ public enum ResponseResultCodeEnum {
     ORDER_NOT_EXIST(2009, "订单不存在"),
     ORDER_STATUS_FAIL(2010, "订单状态异常"),
 
+
+    VALUATION_ERR(2021, "计价失败"),
+
+
+    VALUATION_INVALID(2030, "计价已失效, 请重新计价"),
+    AMOUNT_NOT_ENOUGH(2031, "账户余额不足"),
+    ORDER_CREATE_ERR(2032, "下单失败"),
     ;
 
     private final int code;

+ 5 - 0
lb-module/src/main/java/com/ydd/module/constants/AppConstant.java

@@ -20,4 +20,9 @@ public interface AppConstant {
 
     String PRIVATE_NUMBER_INVALID_TIME_KEY = "PRIVATE_NUMBER_INVALID_TIME";
 
+    /**
+     * 计价结果有效时长, 单位: 分钟
+     */
+    int VALUATION_RESULT_EFFECTIVE_MINUTES = 10;
+
 }

+ 15 - 0
lb-module/src/main/java/com/ydd/module/domain/MemberConfig.java

@@ -133,6 +133,21 @@ private static final long serialVersionUID=1L;
     /** 预约单自动下单时长: 单位秒 */
     private Integer bookingAutodeliveryOrderTime;
 
+    /**
+     * 同步订单商品给骑手
+     */
+    private Integer syncGoodsDetailToDelivery;
+
+    /**
+     * 同步打印客户联商品明细
+     */
+    private Integer customerLinkPrintGoodsDetail;
+
+    /**
+     * 同步打印客户联商品价格
+     */
+    private Integer customerLinkPrintGoodsPrice;
+
     /** 创建时间 */
     @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
     @Excel(name = "创建时间", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss")

+ 3 - 2
lb-module/src/main/java/com/ydd/module/mapper/HelpColumnMapper.java

@@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.ydd.module.domain.HelpColumn;
 import com.ydd.module.dto.HelpDto;
 import com.ydd.module.dto.HelpSecondDto;
+import org.apache.ibatis.annotations.Param;
 
 import java.util.List;
 
@@ -18,12 +19,12 @@ public interface HelpColumnMapper extends BaseMapper<HelpColumn> {
      * 查询所有一级栏目
      * @return
      */
-    List<HelpDto> getAll();
+    List<HelpDto> getAll(Integer type);
 
     /**
      * 查询二级栏目
      * @param pId 父类id
      * @return
      */
-    List<HelpSecondDto> getByFirstId(Integer pId);
+    List<HelpSecondDto> getByFirstId(@Param("pId") Integer pId,@Param("type")  Integer type);
 }

+ 1 - 1
lb-module/src/main/java/com/ydd/module/service/IHelpColumnService.java

@@ -27,7 +27,7 @@ public interface IHelpColumnService extends IService<HelpColumn> {
      * 获取所有栏目
      * @return
      */
-    List<HelpDto> getAll();
+    List<HelpDto> getAll(Integer type);
 
     /**
      * 帮助中心内容

+ 3 - 3
lb-module/src/main/java/com/ydd/module/service/impl/HelpColumnServiceImpl.java

@@ -50,11 +50,11 @@ public class HelpColumnServiceImpl extends ServiceImpl<HelpColumnMapper, HelpCol
      * @return
      */
     @Override
-    public List<HelpDto> getAll() {
-        List<HelpDto> dtos = baseMapper.getAll();
+    public List<HelpDto> getAll(Integer type) {
+        List<HelpDto> dtos = baseMapper.getAll(type);
         for (HelpDto d : dtos){
             // 查询二级栏目
-            d.setHelpSeconds(baseMapper.getByFirstId(d.getFirstColumnId()));
+            d.setHelpSeconds(baseMapper.getByFirstId(d.getFirstColumnId(),type));
         }
         return dtos;
     }

+ 4 - 2
lb-module/src/main/resources/mapper/module/HelpColumnMapper.xml

@@ -6,10 +6,12 @@
 
 
     <select id="getAll" resultType="com.ydd.module.dto.HelpDto">
-        SELECT id as firstColumnId ,`name` as firstColumnNames from lb_help_column WHERE p_id is null and deleted = 0 ORDER BY sort desc
+        SELECT id as firstColumnId ,`name` as firstColumnNames
+        from lb_help_column WHERE p_id is null and deleted = 0 and type=#{type} ORDER BY sort desc
     </select>
 
     <select id="getByFirstId" resultType="com.ydd.module.dto.HelpSecondDto">
-        SELECT id as secondColumnId ,`name` as secondColumnNames from lb_help_column WHERE p_id = #{pId} and deleted = 0 ORDER BY sort desc
+        SELECT id as secondColumnId ,`name` as secondColumnNames
+        from lb_help_column WHERE p_id = #{pId} and deleted = 0 and type=#{type} ORDER BY sort desc
     </select>
 </mapper>

+ 1 - 1
lb-module/src/main/resources/mapper/module/HelpMapper.xml

@@ -10,7 +10,7 @@
         FROM
             lb_help
         WHERE second_column_id = #{secondColumnId}
-        AND type = #{type}
+<!--        AND type = #{type}-->
         AND deleted = 0
         ORDER BY
             sort DESC

+ 4 - 3
lb-module/src/main/resources/mapper/module/ShopDeliveryDisableMapper.xml

@@ -14,9 +14,10 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
     <select id="shopDelivery" resultType="com.ydd.module.dto.StoreDeliveryDto">
         SELECT d.type deliveryId,d.`name` deliveryName,sd.bind_status,if(sd.bind_status!=1,sd.auth_msg,'') failMsg,
         if(di.id is null,1,0) status
-        from lb_dsp_delivery d,lb_shop_delivery sd
-        LEFT JOIN lb_shop_delivery_disable di on sd.shop_id=di.shop_id
-        where sd.deleted=0  and sd.delivery_id=d.id and sd.shop_id=#{shopId}
+        from lb_dsp_delivery d
+        JOIN lb_shop_delivery sd on sd.delivery_id = d.id
+        LEFT JOIN lb_shop_delivery_disable di ON sd.shop_id = di.shop_id and d.type = di.delivery_type and di.deleted=0
+        where sd.deleted=0   and sd.shop_id=#{shopId}
     </select>
 
 </mapper>

+ 13 - 19
lb-module/src/main/resources/mapper/module/orderMapper.xml

@@ -2189,40 +2189,34 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 
     <select id="getSubsidyList" resultType="com.ydd.module.dto.SubsidyStatisticsDto">
         SELECT
-        original as originalAmount,
-        reala as realAmount,
-        coup as couponAmount,
-        (original - reala) as subsidyAmount,
+        sum(original) as originalAmount,
+        sum(reala) as realAmount,
+        sum(coup) as couponAmount,
+        (sum(original) - sum(reala)) as subsidyAmount,
         delivery_name as deliveryName,
         tim as date,
-        commission as commission,
-        if(original - reala &gt;0,-(original-reala+commission),abs(original - reala)-commission) as profit
+        sum(commission) as commission,
+        if(sum(original) - sum(reala)  &gt;0,-(sum(original) - sum(reala)+sum(commission)),abs(sum(original) - sum(reala))-sum(commission)) as profit
         FROM
         (
         SELECT
-        sum(o.max_amount) original,
-        sum(
-        o.pay_amount - o.tip_amount
-        ) reala,
-        sum(
-        o.pay_amount
-        ) realb,
+        o.max_amount original,
+        o.pay_amount - o.tip_amount reala,
+        o.pay_amount realb,
         (select SUM(if(agent_id is not null,commission,0)) from lb_profits_detail d where d.order_id= o.id)commission,
-        sum( o.coupon_amount) coup,
+        o.coupon_amount coup,
         o.delivery_name,
         DATE_FORMAT(o.create_time, '%Y-%m-%d') tim
         FROM
         lb_order o
         WHERE
-        o.id in(select DISTINCT order_id from lb_profits_detail d where    d.create_time &gt;= #{params.startTime}
-        AND d.create_time &lt; #{params.endTime} and origin_source=0)
+        o.id in(select DISTINCT order_id from lb_profits_detail d where    d.create_time &gt;=  #{params.startTime}
+        AND d.create_time  &lt; #{params.endTime} and origin_source=0)
         and o.delivery_status = 4
         and o.payment_type!=5
         and o.dada_dsp_id is null
-        GROUP BY
-        o.delivery_name,
-        DATE_FORMAT(o.create_time, '%Y-%m-%d')
         ) t
+        GROUP BY deliveryName,date
         ORDER BY date DESC
     </select>