Explorar el Código

lb_app service模块

叶君翔 hace 3 años
padre
commit
4ea721d72a
Se han modificado 26 ficheros con 1367 adiciones y 362 borrados
  1. 64 0
      lb-app/src/main/java/com/ydd/app/dto/AddUsbPrintReq.java
  2. 36 4
      lb-app/src/main/java/com/ydd/app/dto/ValuationRes.java
  3. 9 0
      lb-app/src/main/java/com/ydd/app/service/ApiOrderService.java
  4. 19 0
      lb-app/src/main/java/com/ydd/app/service/ApiOrderValuationService.java
  5. 14 0
      lb-app/src/main/java/com/ydd/app/service/ApiShopDeviceService.java
  6. 2 2
      lb-app/src/main/java/com/ydd/app/service/impl/ApiCallBackKF.java
  7. 1 1
      lb-app/src/main/java/com/ydd/app/service/impl/ApiCallBackMeiTuan.java
  8. 3 3
      lb-app/src/main/java/com/ydd/app/service/impl/ApiCallBackShunFeng.java
  9. 12 4
      lb-app/src/main/java/com/ydd/app/service/impl/ApiDeliveryServiceImpl.java
  10. 5 2
      lb-app/src/main/java/com/ydd/app/service/impl/ApiMemberServiceImpl.java
  11. 16 1
      lb-app/src/main/java/com/ydd/app/service/impl/ApiOrderBackServiceImpl.java
  12. 4 3
      lb-app/src/main/java/com/ydd/app/service/impl/ApiOrderCancelServiceImpl.java
  13. 0 5
      lb-app/src/main/java/com/ydd/app/service/impl/ApiOrderDetailServiceImpl.java
  14. 307 303
      lb-app/src/main/java/com/ydd/app/service/impl/ApiOrderNewServiceImpl.java
  15. 149 9
      lb-app/src/main/java/com/ydd/app/service/impl/ApiOrderServiceImpl.java
  16. 540 0
      lb-app/src/main/java/com/ydd/app/service/impl/ApiOrderValuationServiceImpl.java
  17. 27 3
      lb-app/src/main/java/com/ydd/app/service/impl/ApiRiderLocationServiceImpl.java
  18. 45 4
      lb-app/src/main/java/com/ydd/app/service/impl/ApiShopDeviceServiceImpl.java
  19. 4 7
      lb-app/src/main/java/com/ydd/app/service/impl/ApiShopServiceImpl.java
  20. 1 1
      lb-app/src/test/java/com/ydd/app/Test.java
  21. 25 0
      lb-common/src/main/java/com/ydd/common/constant/BillingConstant.java
  22. 26 0
      lb-core/src/main/java/com/ydd/ecloud/core/utils/BigDecimalUtils.java
  23. 17 0
      lb-module/src/main/java/com/ydd/module/dto/PackageDeliveryDetailDto.java
  24. 2 1
      lb-module/src/main/java/com/ydd/module/service/IPackageCityConfigService.java
  25. 4 9
      lb-module/src/main/java/com/ydd/module/service/impl/PackageCityConfigServiceImpl.java
  26. 35 0
      lb-third/lb-third-common/src/main/java/com/ydd/third/common/utils/CoordinateUtils.java

+ 64 - 0
lb-app/src/main/java/com/ydd/app/dto/AddUsbPrintReq.java

@@ -0,0 +1,64 @@
+package com.ydd.app.dto;
+
+import lombok.Data;
+
+/**
+ * @author 叶君翔
+ * @date 2021/11/13 10:38
+ */
+@Data
+public class AddUsbPrintReq {
+
+    private Long id;
+
+    /**
+     * 设备名称(自动获取的设备名称)
+     */
+    private String deviceName;
+
+    /**
+     * 名称(商家自己命名的)
+     */
+    private String name;
+
+    /**
+     * 说明
+     */
+    private String remark;
+
+    /**
+     * 打印接单打印:1->打开,0->关闭
+     */
+    private Integer openOrderPrint;
+
+    /**
+     * 打印取消单打印:1->打开,0->关闭
+     */
+    private Integer openOrderCancelPrint;
+
+    /**
+     * 打印客户联数量
+     */
+    private Long printCustomerCount;
+
+    /**
+     * 打印商家联数量
+     */
+    private Long printMerchantCount;
+
+    /**
+     * 打印厨房联数量
+     */
+    private Long printKitchenCount;
+
+    /**
+     * 1->启用,0->禁用
+     */
+    private Integer status;
+
+    /**
+     * 打印小票宽度
+     */
+    private Integer width;
+
+}

+ 36 - 4
lb-app/src/main/java/com/ydd/app/dto/ValuationRes.java

@@ -1,6 +1,6 @@
 package com.ydd.app.dto;
 
-import com.ydd.module.dto.DeliveryInfo;
+import com.fasterxml.jackson.annotation.JsonIgnore;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
@@ -23,7 +23,9 @@ import java.util.List;
 @NoArgsConstructor
 @Accessors(chain = true)
 @ApiModel("配送返回结果")
-public class ValuationRes implements Serializable {
+public class ValuationRes implements Serializable, Comparable<ValuationRes> {
+
+    private static final long serialVersionUID = 9220538910607099334L;
 
     /**
      * 配送平台ID
@@ -84,7 +86,7 @@ public class ValuationRes implements Serializable {
     @ApiModelProperty(value = "平台即将上线运力")
     private List<ValuationRes> supports;
 
-    //private DeliveryInfo deliveryInfo;
+    // private DeliveryInfo deliveryInfo;
     private String orderNo;
     private String orderSn;
     private BigDecimal couponAmount;
@@ -145,9 +147,39 @@ public class ValuationRes implements Serializable {
     private BigDecimal originalMoney;
 
     private Integer deliveryType;
-
     private String shopId;
     private String authToken;
     private String thirdShopId;
     private String phone;
+
+    /**
+     * 发单顺序
+     */
+    @JsonIgnore
+    private Integer sort;
+
+    /**
+     * 发单时长
+     */
+    private Integer billDuration;
+
+    /**
+     * 重写比较大小的方法,
+     * 实现: 先按照sort排序正序,再按照deliveryAmount正序
+     */
+    @Override
+    public int compareTo(ValuationRes o) {
+        if(this.getSort() > o.getSort()) {
+            return 1;
+        } else if (this.getSort() < o.getSort()){
+            return -1;
+        } else {
+            if (this.getDeliveryAmount().compareTo(o.getDeliveryAmount()) > 0) {
+                return 1;
+            } else {
+                return -1;
+            }
+        }
+    }
+
 }

+ 9 - 0
lb-app/src/main/java/com/ydd/app/service/ApiOrderService.java

@@ -9,6 +9,7 @@ import com.ydd.module.domain.OrderLog;
 import com.ydd.module.dto.*;
 import com.ydd.module.request.OrderListRequest;
 import com.ydd.module.request.OrderMarkerRequest;
+import com.ydd.third.print.request.PrintOrderDto;
 
 import java.math.BigDecimal;
 import java.util.List;
@@ -166,4 +167,12 @@ public interface ApiOrderService {
      */
     DeliveryLocationDto getRiderArriveTime(Long orderId);
 
+    /**
+     * 获取打印订单信息
+     * @param orderId 订单id
+     * @param waimaiOrderId 外卖订单id
+     * @return 待打印订单信息
+     */
+    PrintOrderDto getPrintOrderInfos(Long orderId, Long waimaiOrderId);
+
 }

+ 19 - 0
lb-app/src/main/java/com/ydd/app/service/ApiOrderValuationService.java

@@ -0,0 +1,19 @@
+package com.ydd.app.service;
+
+import com.ydd.app.dto.OrderReq;
+import com.ydd.app.dto.ValuationRes;
+import com.ydd.module.domain.Member;
+
+/**
+ * @author 叶君翔
+ * @date 2021/11/12 11:19
+ */
+public interface ApiOrderValuationService {
+
+    /**
+     * 计价
+     * @return 计价结果
+     */
+    ValuationRes orderValuation(Member member, OrderReq orderReq, Integer type);
+
+}

+ 14 - 0
lb-app/src/main/java/com/ydd/app/service/ApiShopDeviceService.java

@@ -1,5 +1,6 @@
 package com.ydd.app.service;
 
+import com.ydd.app.dto.AddUsbPrintReq;
 import com.ydd.module.domain.Device;
 import com.ydd.module.dto.DeviceDto;
 import com.ydd.module.dto.DeviceStatusDto;
@@ -49,5 +50,18 @@ public interface ApiShopDeviceService {
     DeviceStatusDto status(Long loginId, Long shopId);
 
 
+    /**
+     * 添加usb打印机
+     * @param loginId 登录用户id
+     * @param req 请求参数
+     */
+    void addUsbPrint(Long loginId, AddUsbPrintReq req);
+
+    /**
+     * 获取用户已绑定的usb打印机列表
+     * @param loginId 登录用户
+     * @return usb打印机
+     */
+    List<ShopDeviceDto> getUsbPrint(Long loginId);
 
 }

+ 2 - 2
lb-app/src/main/java/com/ydd/app/service/impl/ApiCallBackKF.java

@@ -63,8 +63,8 @@ public class ApiCallBackKF extends ApiCallBack {
                 break;
             case 3:
                 dto.setOrderStatus(OrderStatusEnum.IN_DELIVERY.status);
-                dto.setOrderMtStatus(15);
-                dto.setOrderEleStatus("DELIVERY_KNIGHT_REACH_SHOP");
+                dto.setOrderMtStatus(20);
+                dto.setOrderEleStatus("DELIVERY_START");
                 dto.setOrderEleRetaiStatus("21");
                 break;
             case 4:

+ 1 - 1
lb-app/src/main/java/com/ydd/app/service/impl/ApiCallBackMeiTuan.java

@@ -68,7 +68,7 @@ public class ApiCallBackMeiTuan extends ApiCallBack {
             case 20:
                 dto.setOrderStatus(OrderStatusEnum.TO_BE_DELIVERED.status);
                 dto.setOrderMtStatus(15);
-                dto.setOrderEleStatus("DELIVERY_KNIGHT_ACCEPT");
+                dto.setOrderEleStatus("DELIVERY_KNIGHT_REACH_SHOP");
                 dto.setOrderEleRetaiStatus("7");
                 break;
             case 30:

+ 3 - 3
lb-app/src/main/java/com/ydd/app/service/impl/ApiCallBackShunFeng.java

@@ -63,14 +63,14 @@ public class ApiCallBackShunFeng extends ApiCallBack {
                 break;
             case 12:
                 dto.setOrderStatus(OrderStatusEnum.TO_BE_DELIVERED.status);
-                dto.setOrderMtStatus(12);
+                dto.setOrderMtStatus(15);
                 dto.setOrderEleStatus("DELIVERY_KNIGHT_REACH_SHOP");
                 dto.setOrderEleRetaiStatus("21");
                 break;
             case 15:
                 dto.setOrderStatus(OrderStatusEnum.IN_DELIVERY.status);
-                dto.setOrderMtStatus(15);
-                dto.setOrderEleStatus("DELIVERY_KNIGHT_REACH_SHOP");
+                dto.setOrderMtStatus(20);
+                dto.setOrderEleStatus("DELIVERY_START");
                 dto.setOrderEleRetaiStatus("8");
                 break;
             case 17:

+ 12 - 4
lb-app/src/main/java/com/ydd/app/service/impl/ApiDeliveryServiceImpl.java

@@ -136,10 +136,10 @@ public class ApiDeliveryServiceImpl implements ApiDeliveryService {
         if (delivery.getType().equals(DeliveryTypeEnums.AIPT.getType())){
             AiptUnBindDto dto = unBind(id,loginId);
         }else {
-            if (delivery.getType().equals(DeliveryTypeEnums.SHUN_FENG.getType()) || delivery.getType().equals(DeliveryTypeEnums.DADA.getType())|| delivery.getType().equals(DeliveryTypeEnums.DADA_YZ.getType())){
-//                if (!sfId.equals(shopDelivery.getThirdShopId())){
-//                    throw new CustomAppException("ID输入错误");
-//                }
+            if (delivery.getType().equals(DeliveryTypeEnums.SHUN_FENG.getType()) ||
+                    delivery.getType().equals(DeliveryTypeEnums.DADA.getType())||
+                    delivery.getType().equals(DeliveryTypeEnums.DADA_YZ.getType()) ||
+                    delivery.getType().equals(DeliveryTypeEnums.MEI_TUAN_ZB.getType())){
                 iShopDeliveryService.removeById(id);
             }
             if(DeliveryTypeEnums.SHAN_SONG.getType().equals(delivery.getType())){
@@ -281,6 +281,14 @@ public class ApiDeliveryServiceImpl implements ApiDeliveryService {
         if (delivery.getType().equals(DeliveryTypeEnums.KUAI_FU.getType())){
             url = client.kfAuthUrl(merchant.getCode());
         }
+        if (delivery.getType().equals(DeliveryTypeEnums.MEI_TUAN_ZB.getType())){
+            shopDelivery = new ShopDelivery();
+            shopDelivery.setAccount("sssss");
+            shopDelivery.setMerchantId(merchant.getId());
+            shopDelivery.setDeliveryId(delivery.getId());
+            shopDelivery.setBindStatus(BindStatusEnum.BIND.status);
+            iShopDeliveryService.save(shopDelivery);
+        }
         if (StringUtils.isBlank(sfId) && (delivery.getType().equals(DeliveryTypeEnums.DADA.getType()) || delivery.getType().equals(DeliveryTypeEnums.DADA_YZ.getType()))){
             Integer type = 0;
             if (delivery.getType().equals(DeliveryTypeEnums.DADA_YZ.getType())){

+ 5 - 2
lb-app/src/main/java/com/ydd/app/service/impl/ApiMemberServiceImpl.java

@@ -5,7 +5,7 @@ import cn.hutool.core.lang.UUID;
 import com.alibaba.fastjson.JSON;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
-import com.google.common.collect.Lists;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.google.common.collect.Maps;
 import com.ydd.app.dto.MemberDetailReq;
 import com.ydd.app.dto.MemberDto;
@@ -55,7 +55,6 @@ import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
-import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 
 import javax.imageio.ImageIO;
 import javax.imageio.stream.ImageOutputStream;
@@ -350,6 +349,7 @@ public class ApiMemberServiceImpl implements ApiMemberService {
                     member.setPersonnelId(agentId);
                 }
             }
+            member.setMemberType(MemberTypeEnum.PERSON.type);
             iMemberService.save(member);
 
             if (inviteLog != null) {
@@ -858,6 +858,9 @@ public class ApiMemberServiceImpl implements ApiMemberService {
                String shopName = iShopService.getShopNameById(shopMember.getShopId());
                 memberBalanceLog.setShopName(shopName);
             }
+            if (memberBalanceLog.getOrderSn() != null && memberBalanceLog.getWaimaiOrderId() == null) {
+                memberBalanceLog.setOrderType(99);
+            }
         });
         return new PageResult(pageResult);
     }

+ 16 - 1
lb-app/src/main/java/com/ydd/app/service/impl/ApiOrderBackServiceImpl.java

@@ -237,6 +237,7 @@ public class ApiOrderBackServiceImpl implements ApiOrderBackService {
                     }
                     if (order.getWaimaiOrderId() != null && !order.getDeliveryStatus().equals(OrderStatusEnum.CANCEL.status)) {
                         order.setDeliveryStatus(OrderStatusEnum.ABNORMAL.status);
+                        iOrderLogService.addOrderLog(order.getId(), DeliveryStatusEnum.ABNORMAL.status);
                     }
                     if (order.getWaimaiOrderId() == null){
                         order.setDeliveryStatus(dto.getOrderStatus());
@@ -287,6 +288,7 @@ public class ApiOrderBackServiceImpl implements ApiOrderBackService {
     }
 
     @Async
+    @Override
     public ResObject<CancelOrderResultVo> getCancelOrderResultVoResObject(Order order, Long deliveryId, OrderResultVo vo) {
         OrderDelivery orderDelivery = iOrderDeliveryService.getOne(new QueryWrapper<OrderDelivery>().eq("order_sn", order.getOrderSn()).eq("delivery_id", deliveryId));
         orderDelivery.setDeliveryStatus(DeliveryStatusEnum.CANCEL.status);
@@ -303,6 +305,10 @@ public class ApiOrderBackServiceImpl implements ApiOrderBackService {
         dto.setIsMine(vo.getIsMine());
         dto.setUuptOpenId(vo.getUuptOpenId());
         dto.setKfAccessToken(orderDelivery.getKfToken());
+
+        // 美团众包
+        dto.setZbOrderSn(orderDelivery.getOutTradeNo());
+        dto.setZbAccessToken(orderDelivery.getZbToken());
         //顺丰需要shopId
         DspDelivery delivery = iDspDeliveryService.getById(deliveryId);
         CancelOrderVo orderVo = CancelOrderUtils.createOrderVo(dto, delivery);
@@ -319,6 +325,8 @@ public class ApiOrderBackServiceImpl implements ApiOrderBackService {
         ResObject<CancelOrderResultVo> resObject = client.cancelOrder(orderVo);
 //        if (DeliveryTypeEnums.SHUN_FENG.getType().equals(delivery.getType()) && resObject.getCode().equals("8126")) {
         if (resObject.getCode() != 0) {
+            orderDelivery.setCancelResult(resObject.getMsg());
+            iOrderDeliveryService.updateById(orderDelivery);
             try {
                 log.info("<===========>重新发起取消开始********************");
                 TimeUnit.SECONDS.sleep(5);
@@ -342,6 +350,12 @@ public class ApiOrderBackServiceImpl implements ApiOrderBackService {
             waimaiOrder = iWaimaiOrderService.findById(order.getWaimaiOrderId());
             DspWaimai waimai = iDspWaimaiService.getById(waimaiOrder.getWaimaiId());
             ShopWaimai shopWaimai = iShopWaimaiService.findById(waimaiOrder.getShopId(), waimai.getId());
+//            if(shopWaimai.getBusinessId()!=null&&shopWaimai.getBusinessId().intValue()==16){
+//                return;
+//            }
+            if(DeliveryTypeEnums.MEI_TUAN_ZB.getType().equals(delivery.getType())){
+                return;
+            }
             if (!DeliveryStatusEnum.CANCEL.status.equals(dto.getOrderStatus())) {
                 waimaiOrder.setStatus(dto.getOrderStatus());
                 iWaimaiOrderService.updateById(waimaiOrder);
@@ -352,6 +366,7 @@ public class ApiOrderBackServiceImpl implements ApiOrderBackService {
                 vo.setLogisticsStatus(dto.getOrderMtStatus());
                 vo.setThirdLogisticsId(DeliveryTypeMeituanCodeEnums.getEnums(dto.getDeliveryType()).getCode());
                 vo.setLbClient(WaimaiTypeEnums.MEI_TUAN.getName());
+                vo.setBusinessId(shopWaimai.getBusinessId());
             }
             if (waimai.getType().equals(WaimaiTypeEnums.E_LE_ME.getType())) {
                 //eleme
@@ -553,6 +568,7 @@ public class ApiOrderBackServiceImpl implements ApiOrderBackService {
                     order.setCouponAmount(orderDelivery.getCouponAmount());
                     // 更新佣金
                     order.setCommission(orderDelivery.getCommission());
+                    order.setMaxAmount(orderDelivery.getOriginalMoney());
                     if (orderDelivery.getIsMine().equals(DeliveryPayEnum.MINE.status)) {
                         order.setPaymentType(PaymentTypeEnum.LOCAL.type);
                     }
@@ -581,7 +597,6 @@ public class ApiOrderBackServiceImpl implements ApiOrderBackService {
                             iMemberService.updateAmount(member.getId(), realFee.negate());
                             //扣款记录
                             iMemberBalanceLogService.saveLog(order.getMemberId(), LogTypeEnum.REDUCE.type, "绑定运力支付服务费", LogSourceEnum.CONSUMPTION.status, realFee, member.getMerchantId(),order.getId(), order.getPaymentType());
-
                         }
                     }
                     iOrderDeliveryService.updateById(orderDelivery);

+ 4 - 3
lb-app/src/main/java/com/ydd/app/service/impl/ApiOrderCancelServiceImpl.java

@@ -171,7 +171,7 @@ public class ApiOrderCancelServiceImpl implements ApiOrderCancelService {
         //违约金处理
         BigDecimal deductFee = BigDecimal.ZERO;
         if (DeliveryStatusEnum.CANCEL.status.equals(orderDelivery.getDeliveryStatus())) {//三方平台已取消
-            cancelSf(deductFee, order,deliveryId);
+            cancelSf(deductFee, order,deliveryId,"");
         } else {
             //调用配送平台取消接口
             ResObject<CancelOrderResultVo> resObject = getCancelOrderResultVoResObject(orderDelivery.getChildOrderSn(), orderDelivery.getOutTradeNo(), orderDelivery.getUuptOpenId(), aptOrderId, aptPhone, order.getId(), delivery);
@@ -192,7 +192,7 @@ public class ApiOrderCancelServiceImpl implements ApiOrderCancelService {
             }
             //商家取消订单 顺丰是实时处理不回调
             if (DeliveryTypeEnums.SHUN_FENG.getType().equals(delivery.getType()) || DeliveryTypeEnums.FENG_NIAO.getType().equals(delivery.getType()) || DeliveryTypeEnums.MEI_TUAN_ZB.getType().equals(delivery.getType())) {
-                cancelSf(deductFee, order,deliveryId);
+                cancelSf(deductFee, order,deliveryId,resObject.getMsg());
             }
         }
     }
@@ -248,7 +248,7 @@ public class ApiOrderCancelServiceImpl implements ApiOrderCancelService {
     }
 
 
-    private void cancelSf(BigDecimal deductFee, Order order,Long deliveryId) {
+    private void cancelSf(BigDecimal deductFee, Order order,Long deliveryId,String cancelResult) {
 //        if(order.getDeliveryId()==null){
 //            order.setDeliveryId(deliveryId);
 //            redisTemplate.opsForValue().increment(order.getOrderSn()+"to_recive:",1);
@@ -256,6 +256,7 @@ public class ApiOrderCancelServiceImpl implements ApiOrderCancelService {
         OrderDelivery orderDelivery = new OrderDelivery();
         orderDelivery.setDeliveryStatus(DeliveryStatusEnum.CANCEL.status);
         orderDelivery.setCancelTime(new Date());
+        orderDelivery.setCancelResult(cancelResult);
         iOrderDeliveryService.update(orderDelivery, new UpdateWrapper<OrderDelivery>().eq("order_sn", order.getOrderSn()).eq("delivery_id", deliveryId));
         List<OrderDelivery> orderDeliverys = iOrderDeliveryService.list(new QueryWrapper<OrderDelivery>().eq("order_sn", order.getOrderSn())
                 .ne("delivery_status", DeliveryStatusEnum.CANCEL.status).ne("out_trade_no", -1).isNotNull("out_trade_no"));

+ 0 - 5
lb-app/src/main/java/com/ydd/app/service/impl/ApiOrderDetailServiceImpl.java

@@ -5,24 +5,19 @@ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.ydd.app.service.ApiOrderDetailService;
 import com.ydd.app.service.ApiRiderLocationService;
 import com.ydd.common.enums.DeliveryTypeEnums;
-import com.ydd.common.utils.StringUtils;
 import com.ydd.module.domain.*;
 import com.ydd.module.dto.OrderDto;
 import com.ydd.module.enums.DeliveryStatusEnum;
-import com.ydd.module.enums.MemberTypeEnum;
 import com.ydd.module.expection.CustomAppException;
 import com.ydd.module.service.*;
 import com.ydd.third.common.utils.AddressLngLatExchanger;
-
 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 org.springframework.util.CollectionUtils;
 
 import java.math.BigDecimal;
-import java.util.ArrayList;
 import java.util.List;
 
 /**

+ 307 - 303
lb-app/src/main/java/com/ydd/app/service/impl/ApiOrderNewServiceImpl.java

@@ -88,283 +88,287 @@ public class ApiOrderNewServiceImpl implements ApiOrderNewService {
 
     @Override
     @Transactional(rollbackFor = Exception.class)
-    public Object createOrder(Long loginId, OrderReq req, Integer type){
+    public Object createOrder(Long loginId, OrderReq req, Integer type) {
         log.info("<===========>提交下单参数" + JsonMapper.nonEmptyMapper().toJson(req));
 //        try {
-            String orderNo = req.getValuationRes().get(0).getOrderNo();
-            List<Order> orderLists = iOrderService.list(new QueryWrapper<Order>().eq("order_sn",orderNo));
-            if(CollectionUtils.isNotEmpty(orderLists)){
-                req.setOrderId(orderLists.get(0).getId());
-                // 校验订单状态
-                Integer status = orderLists.get(0).getStatus();
-                if (!PayStatusEnum.NO_PAYED.status.equals(status)) {
-                    log.warn("orderSn:{}, status: {}, 该状态不支持下单操作!", orderNo, status);
-                    throw new CustomAppException("该状态不支持下单操作!");
-                }
-            }
-            Member member = iMemberService.getById(loginId);
-            if (member.getMemberType().equals(MemberTypeEnum.SHOP.type)) {
-                member = iMemberService.getOne(new QueryWrapper<Member>().eq("member_type", MemberTypeEnum.MERCHANT.type).eq("merchant_id", member.getMerchantId()));
-            }
-            Product product = apiProductService.findById(req.getProductId());
-            if (product == null) {
-                throw new CustomAppException(ExceptionEnum.PRODUCT_NOT_EXISTS);
-            }
-            CouponDto couponDto = null;
-            if (req.getCouponId() != null) {
-                couponDto = apiCouponService.findDetail(req.getCouponId());
-                if (couponDto == null&&type.intValue()!=3) {
-                    throw new CustomAppException("优惠券不存在!");
-                }
+        String orderNo = req.getValuationRes().get(0).getOrderNo();
+        List<Order> orderLists = iOrderService.list(new QueryWrapper<Order>().eq("order_sn", orderNo));
+        if (CollectionUtils.isNotEmpty(orderLists)) {
+            req.setOrderId(orderLists.get(0).getId());
+            // 校验订单状态
+            Integer status = orderLists.get(0).getStatus();
+            if (!PayStatusEnum.NO_PAYED.status.equals(status)) {
+                log.warn("orderSn:{}, status: {}, 该状态不支持下单操作!", orderNo, status);
+                throw new CustomAppException("该状态不支持下单操作!");
             }
-            //地址处理重复楼层
-            address(req);
-            //保存发件信息, 如果发件Id不存在, 则为手工录入信息, 保存到缓存
-            apiCacheUserAddress.cacheAddress(loginId, req);
-
-            Order order = createOrder(product, couponDto, req, loginId);
-            if(order.getId()!=null&& order.getDeliveryStatus().intValue()>= DeliveryStatusEnum.ORDERS_TO_BE_RECEIVED.status.intValue()&&order.getDeliveryStatus().intValue()!=DeliveryStatusEnum.FINISH.status.intValue()){
-                return null;
-            }
-            if(order.getId()!=null&&(DeliveryStatusEnum.CANCEL.status.equals(order.getDeliveryStatus())||DeliveryStatusEnum.FINISH.status.equals(order.getDeliveryStatus()))){
-                 resetOrder(order,product);
+        }
+        Member member = iMemberService.getById(loginId);
+        if (member.getMemberType().equals(MemberTypeEnum.SHOP.type)) {
+            member = iMemberService.getOne(new QueryWrapper<Member>().eq("member_type", MemberTypeEnum.MERCHANT.type).eq("merchant_id", member.getMerchantId()));
+        }
+        Product product = apiProductService.findById(req.getProductId());
+        if (product == null) {
+            throw new CustomAppException(ExceptionEnum.PRODUCT_NOT_EXISTS);
+        }
+        CouponDto couponDto = null;
+        if (req.getCouponId() != null) {
+            couponDto = apiCouponService.findDetail(req.getCouponId());
+            if (couponDto == null && type.intValue() != 3) {
+                throw new CustomAppException("优惠券不存在!");
             }
-            order.setMemberId(loginId);
-            order.setCreateTime(new Date());
-            order.setTakeType(req.getTakeType());
-            if(TakeTypeEnum.APPOINTMENT.type.equals(req.getTakeType())){
-                if(DateUtils.addMinutes(new Date(),130).compareTo(DateUtils.dateTime(DateUtils.YYYY_MM_DD_HH_MM_SS,req.getTakeTime()))>0){
-                    //order.setTakeTime(null);
-                    order.setTakeType(TakeTypeEnum.APPOINTMENT_2.type);
-                }else{
-                    order.setTakeTime(DateUtils.dateTime(DateUtils.YYYY_MM_DD_HH_MM_SS,req.getTakeTime()));
-                }
+        }
+        //地址处理重复楼层
+        address(req);
+        //保存发件信息, 如果发件Id不存在, 则为手工录入信息, 保存到缓存
+        apiCacheUserAddress.cacheAddress(loginId, req);
+
+        Order order = createOrder(product, couponDto, req, loginId);
+        if (order.getId() != null && order.getDeliveryStatus() != null && order.getDeliveryStatus() >= DeliveryStatusEnum.ORDERS_TO_BE_RECEIVED.status && order.getDeliveryStatus() != DeliveryStatusEnum.FINISH.status) {
+            return null;
+        }
+        if (order.getId() != null && order.getDeliveryStatus() != null && (DeliveryStatusEnum.CANCEL.status.equals(order.getDeliveryStatus()) || DeliveryStatusEnum.FINISH.status.equals(order.getDeliveryStatus()))) {
+            resetOrder(order, product);
+        }
+        order.setMemberId(loginId);
+        order.setCreateTime(new Date());
+        order.setTakeType(req.getTakeType());
+        if (TakeTypeEnum.APPOINTMENT.type.equals(req.getTakeType())) {
+            if (DateUtils.addMinutes(new Date(), 130).compareTo(DateUtils.dateTime(DateUtils.YYYY_MM_DD_HH_MM_SS, req.getTakeTime())) > 0) {
+                //order.setTakeTime(null);
+                order.setTakeType(TakeTypeEnum.APPOINTMENT_2.type);
+            } else {
+                order.setTakeTime(DateUtils.dateTime(DateUtils.YYYY_MM_DD_HH_MM_SS, req.getTakeTime()));
             }
+        }
 
-            BigDecimal tip = BigDecimal.ZERO;
-            if (req.getTipAmount() != null && req.getTipAmount().compareTo(BigDecimal.ZERO) > 0) {
-                order.setUseTip(StatusEnum.SHOW.status);
-                tip = req.getTipAmount();
-                order.setTipAmount(tip);
-            }
+        BigDecimal tip = BigDecimal.ZERO;
+        if (req.getTipAmount() != null && req.getTipAmount().compareTo(BigDecimal.ZERO) > 0) {
+            order.setUseTip(StatusEnum.SHOW.status);
+            tip = req.getTipAmount();
+            order.setTipAmount(tip);
+        }
 
-            //发单算钱
-            List<ValuationRes> resList = req.getValuationRes();
-            List<ValuationRes> maxReslIst = new ArrayList<>();
-
-            if (couponDto != null) {
-                for (ValuationRes res : resList) {
-                    if (couponDto.getType().equals(CouponTypeEnum.MAN_JIAN.type)) {
-                        if (res.getDeliveryAmount().compareTo(couponDto.getLimitFee()) >= 0  && res.getIsMine() == 0) {
-                            res.setDeliveryAmount(res.getDeliveryAmount().subtract(couponDto.getMoney()));
-                            res.setCouponAmount(couponDto.getMoney());
-                        }
-                    } else if (couponDto.getType().equals(CouponTypeEnum.LI_JIAN.type)  && res.getIsMine() == 0) {
+        //发单算钱
+        List<ValuationRes> resList = req.getValuationRes();
+        List<ValuationRes> maxReslIst = new ArrayList<>();
+
+        if (couponDto != null) {
+            for (ValuationRes res : resList) {
+                if (couponDto.getType().equals(CouponTypeEnum.MAN_JIAN.type)) {
+                    if (res.getDeliveryAmount().compareTo(couponDto.getLimitFee()) >= 0 && res.getIsMine() == 0) {
                         res.setDeliveryAmount(res.getDeliveryAmount().subtract(couponDto.getMoney()));
                         res.setCouponAmount(couponDto.getMoney());
-                    }  else if (couponDto.getType().equals(CouponTypeEnum.ZHE_KOU.type)  && res.getIsMine() == 0) {
-                        BigDecimal discount = res.getDeliveryAmount().multiply(couponDto.getDiscount()).divide(BigDecimal.TEN).setScale(2,BigDecimal.ROUND_HALF_UP);
-                        if((res.getDeliveryAmount().subtract(discount)).compareTo(couponDto.getMaxDiscount())>0){
-                            discount = res.getDeliveryAmount().subtract(couponDto.getMaxDiscount());
-                        }else {
-                            discount = res.getDeliveryAmount().subtract(res.getDeliveryAmount().subtract(discount));
-                        }
-                        res.setCouponAmount( res.getDeliveryAmount().subtract(discount));
-                        res.setDeliveryAmount(discount);
                     }
+                } else if (couponDto.getType().equals(CouponTypeEnum.LI_JIAN.type) && res.getIsMine() == 0) {
+                    res.setDeliveryAmount(res.getDeliveryAmount().subtract(couponDto.getMoney()));
+                    res.setCouponAmount(couponDto.getMoney());
+                } else if (couponDto.getType().equals(CouponTypeEnum.ZHE_KOU.type) && res.getIsMine() == 0) {
+                    BigDecimal discount = res.getDeliveryAmount().multiply(couponDto.getDiscount()).divide(BigDecimal.TEN).setScale(2, BigDecimal.ROUND_HALF_UP);
+                    if ((res.getDeliveryAmount().subtract(discount)).compareTo(couponDto.getMaxDiscount()) > 0) {
+                        discount = res.getDeliveryAmount().subtract(couponDto.getMaxDiscount());
+                    } else {
+                        discount = res.getDeliveryAmount().subtract(res.getDeliveryAmount().subtract(discount));
+                    }
+                    res.setCouponAmount(res.getDeliveryAmount().subtract(discount));
+                    res.setDeliveryAmount(discount);
                 }
             }
-            // 默认没有选择绑定三方运力下单
-            List<Long> deliveryIds = new ArrayList<>();
-            for (ValuationRes r : resList){
-                if (r.getIsMine() == 0){
-                    maxReslIst.add(r);
-                }
-                if (r.getIsMine() == 1){
-                    // 自运力
-                    deliveryIds.add(r.getDeliveryId());
-                }
-            }
-            Optional<ValuationRes> max = null;
-            // false用我们平台支付,true用用户自己绑定三方平台支付
-            boolean isMine = false;
-            if (maxReslIst != null && maxReslIst.size() > 0){
-                max = maxReslIst.stream().max(Comparator.comparing(ValuationRes::getDeliveryAmount));
-            }else {
-                max = resList.stream().max(Comparator.comparing(ValuationRes::getDeliveryAmount));
-                isMine = true;
+        }
+        // 默认没有选择绑定三方运力下单
+        List<Long> deliveryIds = new ArrayList<>();
+        for (ValuationRes r : resList) {
+            if (r.getIsMine() == 0) {
+                maxReslIst.add(r);
             }
-            if (order.getWaimaiOrderId() != null) {
-                getWaiMaiInfo(order,req);
+            if (r.getIsMine() == 1) {
+                // 自运力
+                deliveryIds.add(r.getDeliveryId());
             }
-            //金额折扣
-            BigDecimal deliveryAmount = max.get().getDeliveryAmount();//取最高价
-            // req.setOrderSn(max.get().getOrderSn());
-            order.setOrderSn(max.get().getOrderNo());
-            //计算优惠券
-            order.setTotalAmount(deliveryAmount.add(tip));
-            order.setMaxAmount(deliveryAmount.add(tip));
-            order.setCouponAmount(BigDecimal.ZERO);
-            if (couponDto != null) {
-                if (couponDto.getType().equals(CouponTypeEnum.MAN_JIAN.type)) {
-                    if ((order.getTotalAmount().add(couponDto.getMoney())).compareTo(couponDto.getLimitFee()) >= 0 && !isMine) {
-                        order.setCouponAmount(couponDto.getMoney());
-                        order.setCouponId(Long.valueOf(couponDto.getId()));
-                        couponDto.setStatus(MemberCouponStatusEnum.USED.getStatus());
-                    }
-                } else if (couponDto.getType().equals(CouponTypeEnum.LI_JIAN.type) && !isMine) {
+        }
+        Optional<ValuationRes> max = null;
+        // false用我们平台支付,true用用户自己绑定三方平台支付
+        boolean isMine = false;
+        if (maxReslIst != null && maxReslIst.size() > 0) {
+            max = maxReslIst.stream().max(Comparator.comparing(ValuationRes::getDeliveryAmount));
+        } else {
+            max = resList.stream().max(Comparator.comparing(ValuationRes::getDeliveryAmount));
+            isMine = true;
+        }
+        if (order.getWaimaiOrderId() != null) {
+            getWaiMaiInfo(order, req);
+        }
+        //金额折扣
+        BigDecimal deliveryAmount = max.get().getDeliveryAmount();//取最高价
+        // req.setOrderSn(max.get().getOrderSn());
+        order.setOrderSn(max.get().getOrderNo());
+        //计算优惠券
+        order.setTotalAmount(deliveryAmount.add(tip));
+        order.setMaxAmount(deliveryAmount.add(tip));
+        order.setCouponAmount(BigDecimal.ZERO);
+        if (couponDto != null) {
+            if (couponDto.getType().equals(CouponTypeEnum.MAN_JIAN.type)) {
+                if ((order.getTotalAmount().add(couponDto.getMoney())).compareTo(couponDto.getLimitFee()) >= 0 && !isMine) {
                     order.setCouponAmount(couponDto.getMoney());
                     order.setCouponId(Long.valueOf(couponDto.getId()));
                     couponDto.setStatus(MemberCouponStatusEnum.USED.getStatus());
                 }
-                else if (couponDto.getType().equals(CouponTypeEnum.ZHE_KOU.type) && !isMine) {
-                    BigDecimal discount = order.getTotalAmount().multiply(couponDto.getDiscount()).divide(BigDecimal.TEN).setScale(2,BigDecimal.ROUND_HALF_UP);
-                    if((order.getTotalAmount().subtract(discount)).compareTo(couponDto.getMaxDiscount())>0){
-                        discount = order.getTotalAmount().subtract(couponDto.getMaxDiscount());
-                    }
-                    order.setCouponAmount(order.getTotalAmount().subtract(discount));
-                    order.setCouponId(Long.valueOf(couponDto.getId()));
-                    couponDto.setStatus(MemberCouponStatusEnum.USED.getStatus());
+            } else if (couponDto.getType().equals(CouponTypeEnum.LI_JIAN.type) && !isMine) {
+                order.setCouponAmount(couponDto.getMoney());
+                order.setCouponId(Long.valueOf(couponDto.getId()));
+                couponDto.setStatus(MemberCouponStatusEnum.USED.getStatus());
+            } else if (couponDto.getType().equals(CouponTypeEnum.ZHE_KOU.type) && !isMine) {
+                BigDecimal discount = order.getTotalAmount().multiply(couponDto.getDiscount()).divide(BigDecimal.TEN).setScale(2, BigDecimal.ROUND_HALF_UP);
+                if ((order.getTotalAmount().subtract(discount)).compareTo(couponDto.getMaxDiscount()) > 0) {
+                    discount = order.getTotalAmount().subtract(couponDto.getMaxDiscount());
                 }
+                order.setCouponAmount(order.getTotalAmount().subtract(discount));
+                order.setCouponId(Long.valueOf(couponDto.getId()));
+                couponDto.setStatus(MemberCouponStatusEnum.USED.getStatus());
             }
+        }
 
-            //新用户只要没有产生过订单数据的算首单,并且是用平台支付
-            List<Order> orderList = iOrderService.list(new QueryWrapper<Order>().eq("member_id", loginId).eq("status",PayStatusEnum.PAYED.status));
+        //新用户只要没有产生过订单数据的算首单,并且是用平台支付
+        List<Order> orderList = new ArrayList<>();
+        if (member.getShopId() != null) {
+            orderList = iOrderService.list(new QueryWrapper<Order>().eq("shop_id", member.getShopId()).eq("status", PayStatusEnum.PAYED.status));
+        } else {
+            orderList = iOrderService.list(new QueryWrapper<Order>().eq("member_id", loginId).eq("status", PayStatusEnum.PAYED.status));
+        }
 
-            BigDecimal firstCoupon = BigDecimal.ZERO;
-            if (CollectionUtils.isEmpty(orderList) && !isMine) {
-                String configValue = iSysConfigService.selectConfigByKey("NEW_COMERS");
-                firstCoupon = new BigDecimal(configValue);
-            }
-            order.setFirstCoupon(firstCoupon);
-            order.setPayAmount(order.getTotalAmount().subtract(firstCoupon));
-
-            if (order.getCouponAmount().compareTo(order.getTotalAmount().add(order.getCouponAmount())) > 0) {
-                order.setPayAmount(BigDecimal.ZERO);
-                order.setCommission(BigDecimal.ZERO);
-            } else if (order.getPayAmount().compareTo(BigDecimal.ZERO) < 0) {
-                order.setPayAmount(BigDecimal.ZERO);
-            } else {
-                //代理商佣金
-                order.setCommission(max.get().getCommission());
-            }
-            if (!isMine && order.getPayAmount().compareTo(member.getAmount()) > 0 && PaymentTypeEnum.BALANCE.type.equals(req.getPaymentType())) {
-                log.error("余额不足"+order.getOrderSn());
-                throw new CustomAppException(ExceptionEnum.AMOUNT_ERROR);
-            }
-            // 下单运力中含有自运力
-            if (deliveryIds.size() > 0 && isMine){
-                checkMemberAmount(member,deliveryIds);
-            }
-            //下单
-            req.setProduct(product);
+        BigDecimal firstCoupon = BigDecimal.ZERO;
+        if (CollectionUtils.isEmpty(orderList) && !isMine) {
+            String configValue = iSysConfigService.selectConfigByKey("NEW_COMERS");
+            firstCoupon = new BigDecimal(configValue);
+        }
+        order.setFirstCoupon(firstCoupon);
+        order.setPayAmount(order.getTotalAmount().subtract(firstCoupon));
+
+        if (order.getCouponAmount().compareTo(order.getTotalAmount().add(order.getCouponAmount())) > 0) {
+            order.setPayAmount(BigDecimal.ZERO);
+            order.setCommission(BigDecimal.ZERO);
+        } else if (order.getPayAmount().compareTo(BigDecimal.ZERO) < 0) {
+            order.setPayAmount(BigDecimal.ZERO);
+        } else {
+            //代理商佣金
+            order.setCommission(max.get().getCommission());
+        }
+        if (!isMine && order.getPayAmount().compareTo(member.getAmount()) > 0 && PaymentTypeEnum.BALANCE.type.equals(req.getPaymentType())) {
+            log.error("余额不足" + order.getOrderSn());
+            throw new CustomAppException(ExceptionEnum.AMOUNT_ERROR);
+        }
+        // 下单运力中含有自运力
+        if (deliveryIds.size() > 0 && isMine) {
+            checkMemberAmount(member, deliveryIds);
+        }
+        //下单
+        req.setProduct(product);
 
-            order.setMerchantId(member.getMerchantId());
+        order.setMerchantId(member.getMerchantId());
 //        String startLat = req.getSendAddress().getLng() + "," + req.getSendAddress().getLat();
 //        String endLat = req.getReceiptAddress().getLng() + "," + req.getReceiptAddress().getLat();
 //        order.setOrderDistance(BigDecimal.valueOf(AddressLngLatExchanger.getDistance(startLat, endLat)));
-            if (member.getAgentId() != null) {
-                order.setAgentId(member.getAgentId());
-                order.setAgentIdSource(member.getAgentSource());
-                if (member.getPersonnelId() != null){
-                    order.setPersonnelId(member.getPersonnelId());
-                }
-            } else {
-                // 判断区域,只给一级代理商
-                Agent agent = iAgentService.findByArea(order.getSendCityName(), order.getSendDistrictName());
-                if (agent != null) {
-                    order.setAgentId(agent.getId());
-                    order.setAgentIdSource(AgentSourceEnum.QU_YU.status);
-                }
+        if (member.getAgentId() != null) {
+            order.setAgentId(member.getAgentId());
+            order.setAgentIdSource(member.getAgentSource());
+            if (member.getPersonnelId() != null) {
+                order.setPersonnelId(member.getPersonnelId());
             }
-            if (isMine&&PaymentTypeEnum.BALANCE.type.equals(req.getPaymentType())){
-                order.setPaymentType(PaymentTypeEnum.LOCAL.type);
-            }else if(!isMine&&PaymentTypeEnum.BALANCE.type.equals(req.getPaymentType())){
-                order.setPaymentType(PaymentTypeEnum.BALANCE.type);
-            }else{
-                order.setPaymentType(req.getPaymentType());
+        } else {
+            // 判断区域,只给一级代理商
+            Agent agent = iAgentService.findByArea(order.getSendCityName(), order.getSendDistrictName());
+            if (agent != null) {
+                order.setAgentId(agent.getId());
+                order.setAgentIdSource(AgentSourceEnum.QU_YU.status);
             }
-            Object resp = "ok";
-            BigDecimal payAmount = order.getPayAmount().setScale(2,BigDecimal.ROUND_HALF_UP);
-            if (PaymentTypeEnum.BALANCE.type.equals(req.getPaymentType())&&isMine){
-                order.setStatus(PayStatusEnum.PAYED.status);
-                order.setDeliveryStatus(DeliveryStatusEnum.ORDERS_TO_BE_RECEIVED.status);
+        }
+        if (isMine && PaymentTypeEnum.BALANCE.type.equals(req.getPaymentType())) {
+            order.setPaymentType(PaymentTypeEnum.LOCAL.type);
+        } else if (!isMine && PaymentTypeEnum.BALANCE.type.equals(req.getPaymentType())) {
+            order.setPaymentType(PaymentTypeEnum.BALANCE.type);
+        } else {
+            order.setPaymentType(req.getPaymentType());
+        }
+        Object resp = "ok";
+        BigDecimal payAmount = order.getPayAmount().setScale(2, BigDecimal.ROUND_HALF_UP);
+        if (PaymentTypeEnum.BALANCE.type.equals(req.getPaymentType()) && isMine) {
+            order.setStatus(PayStatusEnum.PAYED.status);
+            order.setDeliveryStatus(DeliveryStatusEnum.ORDERS_TO_BE_RECEIVED.status);
+        }
+        if (PaymentTypeEnum.BALANCE.type.equals(req.getPaymentType()) && !isMine) {
+            order.setStatus(PayStatusEnum.PAYED.status);
+            order.setDeliveryStatus(DeliveryStatusEnum.ORDERS_TO_BE_RECEIVED.status);
+            // 判断余额是否低于50/100
+            checkAmount(member.getId());
+        } else if (PaymentTypeEnum.ZHI_FU_BAO.type.equals(req.getPaymentType()) && order.getPayAmount().compareTo(BigDecimal.ZERO) > 0) {
+            // PC下单
+            if (req.getCreateType() != null && req.getCreateType() == 1) {
+                resp = apiOrderService.getPaymentQRCode(payAmount, order.getOrderSn(), PaymentTypeEnum.ZHI_FU_BAO.type);
+            } else {
+                // APP下单
+                order.setDeliveryStatus(DeliveryStatusEnum.ORDERS_TO_BE_BILLED.status);
+                order.setStatus(PayStatusEnum.NO_PAYED.status);
+                resp = aliPayService.pay(order.getOrderSn(), payAmount.toString(), order.getOrderSn());
             }
-            if (PaymentTypeEnum.BALANCE.type.equals(req.getPaymentType())&&!isMine) {
-                order.setStatus(PayStatusEnum.PAYED.status);
-                order.setDeliveryStatus(DeliveryStatusEnum.ORDERS_TO_BE_RECEIVED.status);
-                // 判断余额是否低于50/100
-                checkAmount(member.getId());
-            } else if (PaymentTypeEnum.ZHI_FU_BAO.type.equals(req.getPaymentType()) && order.getPayAmount().compareTo(BigDecimal.ZERO) > 0) {
-                // PC下单
-                if (req.getCreateType() != null && req.getCreateType() == 1) {
-                    resp = apiOrderService.getPaymentQRCode(payAmount, order.getOrderSn(), PaymentTypeEnum.ZHI_FU_BAO.type);
-                } else {
-                    // APP下单
-                    order.setDeliveryStatus(DeliveryStatusEnum.ORDERS_TO_BE_BILLED.status);
-                    order.setStatus(PayStatusEnum.NO_PAYED.status);
-                    resp = aliPayService.pay(order.getOrderSn(), payAmount.toString(), order.getOrderSn());
-                }
-            } else if (PaymentTypeEnum.WEI_XIN.type.equals(req.getPaymentType()) && order.getPayAmount().compareTo(BigDecimal.ZERO) > 0) {
-                // PC下单
-                if (req.getCreateType() != null && req.getCreateType() == 1) {
-                    resp = apiOrderService.getPaymentQRCode(payAmount, order.getOrderSn(), PaymentTypeEnum.WEI_XIN.type);
-                } else {
-                    // APP下单
-                    order.setDeliveryStatus(DeliveryStatusEnum.ORDERS_TO_BE_BILLED.status);
-                    order.setStatus(PayStatusEnum.NO_PAYED.status);
-                    OrderPaySignResponse.WechatPayParam respon = null;
-                    try {
-                        respon = wechatPayService.pay(payAmount, order.getOrderSn(), order.getOrderSn(), TradeType.APP);
-                    } catch (WxPayException e) {
-                        e.printStackTrace();
-                    }
-                    resp = JSONObject.toJSONString(respon);
+        } else if (PaymentTypeEnum.WEI_XIN.type.equals(req.getPaymentType()) && order.getPayAmount().compareTo(BigDecimal.ZERO) > 0) {
+            // PC下单
+            if (req.getCreateType() != null && req.getCreateType() == 1) {
+                resp = apiOrderService.getPaymentQRCode(payAmount, order.getOrderSn(), PaymentTypeEnum.WEI_XIN.type);
+            } else {
+                // APP下单
+                order.setDeliveryStatus(DeliveryStatusEnum.ORDERS_TO_BE_BILLED.status);
+                order.setStatus(PayStatusEnum.NO_PAYED.status);
+                OrderPaySignResponse.WechatPayParam respon = null;
+                try {
+                    respon = wechatPayService.pay(payAmount, order.getOrderSn(), order.getOrderSn(), TradeType.APP);
+                } catch (WxPayException e) {
+                    e.printStackTrace();
                 }
-
-            }
-            if (payAmount.compareTo(BigDecimal.ZERO)==0) {
-                order.setStatus(PayStatusEnum.PAYED.status);
-                order.setDeliveryStatus(DeliveryStatusEnum.ORDERS_TO_BE_RECEIVED.status);
-            }
-            if (order.getPayAmount().compareTo(BigDecimal.ZERO) > 0) {
-                paymentService.savePayment(order.getMemberId(), order.getOrderSn(), order.getPayAmount(), req.getPaymentType(), TradeTypeEnum.ORDER.type, JSONObject.toJSONString(resList),order.getOrderSn());
-            }
-            order.setRefundMoney(BigDecimal.ZERO);
-            if(order.getId()!=null){
-                iOrderService.updateById(order);
-            }else {
-                iOrderService.save(order);
+                resp = JSONObject.toJSONString(respon);
             }
 
-           // iOrderLogService.addOrderLog(order.getId(), OrderStatusEnum.ORDER_CREATE.status);
-            iOrderLogService.addOrderLog(order.getId(), OrderStatusEnum.NO_PAYED.status);
-            if (PaymentTypeEnum.BALANCE.type.equals(req.getPaymentType())) {
-
-                iOrderLogService.addOrderLog(order.getId(), OrderStatusEnum.PAYED.status);
-                iOrderLogService.addOrderLog(order.getId(), OrderStatusEnum.ORDERS_TO_BE_RECEIVED.status);
-                if (!isMine) {
-                    //扣款
-                    iMemberService.updateAmount(member.getId(), payAmount.negate());
-                    //扣款记录
-                    iMemberBalanceLogService.saveLog(loginId, LogTypeEnum.REDUCE.type, "下单支付", LogSourceEnum.CONSUMPTION.status, order.getPayAmount(), member.getMerchantId(),order.getId(), order.getPaymentType());
-                }
+        }
+        if (payAmount.compareTo(BigDecimal.ZERO) == 0) {
+            order.setStatus(PayStatusEnum.PAYED.status);
+            order.setDeliveryStatus(DeliveryStatusEnum.ORDERS_TO_BE_RECEIVED.status);
+        }
+        if (order.getPayAmount().compareTo(BigDecimal.ZERO) > 0) {
+            paymentService.savePayment(order.getMemberId(), order.getOrderSn(), order.getPayAmount(), req.getPaymentType(), TradeTypeEnum.ORDER.type, JSONObject.toJSONString(resList), order.getOrderSn());
+        }
+        order.setRefundMoney(BigDecimal.ZERO);
+        if (order.getId() != null) {
+            iOrderService.updateById(order);
+        } else {
+            iOrderService.save(order);
+        }
+
+        // iOrderLogService.addOrderLog(order.getId(), OrderStatusEnum.ORDER_CREATE.status);
+        iOrderLogService.addOrderLog(order.getId(), OrderStatusEnum.NO_PAYED.status);
+        if (PaymentTypeEnum.BALANCE.type.equals(req.getPaymentType())) {
+
+            iOrderLogService.addOrderLog(order.getId(), OrderStatusEnum.PAYED.status);
+            iOrderLogService.addOrderLog(order.getId(), OrderStatusEnum.ORDERS_TO_BE_RECEIVED.status);
+            if (!isMine) {
+                //扣款
+                iMemberService.updateAmount(member.getId(), payAmount.negate());
+                //扣款记录
+                iMemberBalanceLogService.saveLog(loginId, LogTypeEnum.REDUCE.type, "下单支付", LogSourceEnum.CONSUMPTION.status, order.getPayAmount(), member.getMerchantId(), order.getId(), order.getPaymentType());
             }
-            //更改优惠券状态
-            if (PaymentTypeEnum.BALANCE.type.equals(req.getPaymentType())||payAmount.compareTo(BigDecimal.ZERO)==0) {
-                apiCouponService.updateCoupon(couponDto);
-                if (CollectionUtils.isNotEmpty(resList)) {
-                 //   order.setProduct(product);
-                    CouponDto finalCouponDto = couponDto;
-                    TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronizationAdapter() {
-                        @Override
-                        public void afterCommit() {
-                            applicationContext.publishEvent(new DeliveryOrderEvent(order, resList, finalCouponDto));
-                        }
-                    });
-                }
+        }
+        //更改优惠券状态
+        if (PaymentTypeEnum.BALANCE.type.equals(req.getPaymentType()) || payAmount.compareTo(BigDecimal.ZERO) == 0) {
+            apiCouponService.updateCoupon(couponDto);
+            if (CollectionUtils.isNotEmpty(resList)) {
+                //   order.setProduct(product);
+                CouponDto finalCouponDto = couponDto;
+                TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronizationAdapter() {
+                    @Override
+                    public void afterCommit() {
+                        applicationContext.publishEvent(new DeliveryOrderEvent(order, resList, finalCouponDto));
+                    }
+                });
             }
-            return resp;
+        }
+        return resp;
 //        }catch (Exception e){
 //            TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
 //            log.error("下单异常",e);
@@ -373,22 +377,21 @@ public class ApiOrderNewServiceImpl implements ApiOrderNewService {
     }
 
 
-
     private Order createOrder(Product product, CouponDto couponDto, OrderReq req, Long memberId) {
         Order order = new Order();
         if (req.getOrderId() != null) {
-           order = iOrderService.getById(req.getOrderId());
-           order.setPersonnelId(null);
-           if (order.getWaimaiOrderId() == null){
-               order.setProductAmount(req.getProductAmount());
-               order.setTakeType(req.getTakeType());
-               order.setTakeRemark(req.getTakeRemark());
-           }else {
-               if (StringUtils.isNotBlank(req.getTakeRemark())){
-                   order.setTakeRemark(req.getTakeRemark());
-               }
-           }
-           return order;
+            order = iOrderService.getById(req.getOrderId());
+            order.setPersonnelId(null);
+            if (order.getWaimaiOrderId() == null) {
+                order.setProductAmount(req.getProductAmount());
+                order.setTakeType(req.getTakeType());
+                order.setTakeRemark(req.getTakeRemark());
+            } else {
+                if (StringUtils.isNotBlank(req.getTakeRemark())) {
+                    order.setTakeRemark(req.getTakeRemark());
+                }
+            }
+            return order;
         }
         order.setMemberId(memberId);
         order.setWeight(req.getWeight());
@@ -404,11 +407,11 @@ public class ApiOrderNewServiceImpl implements ApiOrderNewService {
         order.setCouponAmount(BigDecimal.ZERO);
         order.setTaxpayerId(req.getTaxpayerId());
         order.setInvoiceTitle(req.getInvoiceTitle());
-      //  order.setProduct(product);
+        //  order.setProduct(product);
         Long shopId = req.getShopId();
-        if (shopId == null){
+        if (shopId == null) {
             Member member = iMemberService.getById(memberId);
-            if (member.getShopId() != null){
+            if (member.getShopId() != null) {
                 shopId = member.getShopId();
                 order.setDefaultShop(DefaultShopEnum.SHOW.status);
             }
@@ -421,9 +424,9 @@ public class ApiOrderNewServiceImpl implements ApiOrderNewService {
         }
         AddressReq sendAddress = req.getSendAddress();
         AddressReq receiveAddress = req.getReceiptAddress();
-        if(StringUtils.isNotBlank(sendAddress.getStreet())){
-            order.setSendAddress(sendAddress.getAddress()+sendAddress.getStreet());
-        }else {
+        if (StringUtils.isNotBlank(sendAddress.getStreet())) {
+            order.setSendAddress(sendAddress.getAddress() + sendAddress.getStreet());
+        } else {
             order.setSendAddress(sendAddress.getAddress());
         }
         order.setSendAddressId(sendAddress.getId());
@@ -431,14 +434,14 @@ public class ApiOrderNewServiceImpl implements ApiOrderNewService {
         order.setSendContactName(sendAddress.getContact());
         order.setSendPhone(sendAddress.getPhone());
         order.setSendExtension(sendAddress.getExtension());
-        order.setSendDistrictName((String)sendAddress.getDistrictName());
+        order.setSendDistrictName((String) sendAddress.getDistrictName());
         order.setSendProvinceName(sendAddress.getProvinceName());
         order.setSendLat(sendAddress.getLat());
         order.setSendLng(sendAddress.getLng());
         order.setSendCityCode(sendAddress.getCityCode());
-        if(StringUtils.isNotBlank(receiveAddress.getStreet())){
-            order.setReceiptAddress(receiveAddress.getAddress()+receiveAddress.getStreet());
-        }else {
+        if (StringUtils.isNotBlank(receiveAddress.getStreet())) {
+            order.setReceiptAddress(receiveAddress.getAddress() + receiveAddress.getStreet());
+        } else {
             order.setReceiptAddress(receiveAddress.getAddress());
         }
         order.setReceiptAddressId(receiveAddress.getId());
@@ -446,14 +449,14 @@ public class ApiOrderNewServiceImpl implements ApiOrderNewService {
         order.setReceiptContactName(receiveAddress.getContact());
         order.setReceiptPhone(receiveAddress.getPhone());
         order.setReceiptExtension(receiveAddress.getExtension());
-        order.setReceiptDistrictName((String)receiveAddress.getDistrictName());
+        order.setReceiptDistrictName((String) receiveAddress.getDistrictName());
         order.setReceiptProvinceName(receiveAddress.getProvinceName());
         order.setReceiptLat(receiveAddress.getLat());
         order.setReceiptLng(receiveAddress.getLng());
         order.setReceiptCityCode(receiveAddress.getCityCode());
-        if (order.getWaimaiOrderId() != null){
+        if (order.getWaimaiOrderId() != null) {
             order.setWaimaiOrderId(order.getWaimaiOrderId());
-        }else {
+        } else {
             order.setWaimaiOrderId(req.getWaimaiOrderId());
         }
         order.setProductAmount(req.getProductAmount());
@@ -472,14 +475,14 @@ public class ApiOrderNewServiceImpl implements ApiOrderNewService {
         } else if (PaymentTypeEnum.ZHI_FU_BAO.type.equals(order.getPaymentType())) {
             aliPayService.alipayRefundRequest(orderNo, refundMoney.doubleValue());
         } else if (PaymentTypeEnum.WEI_XIN.type.equals(order.getPaymentType())) {
-            Payment payment = paymentService.getOne(new QueryWrapper<Payment>().eq("child_order_sn", orderNo).eq("payment_type",PaymentTypeEnum.WEI_XIN.type));
+            Payment payment = paymentService.getOne(new QueryWrapper<Payment>().eq("child_order_sn", orderNo).eq("payment_type", PaymentTypeEnum.WEI_XIN.type));
             wechatPayService.refund(orderNo, payment.getTotalAmount(), refundMoney, "");
         }
-        iMemberBalanceLogService.saveLog(memberId, LogTypeEnum.INCREASE.type, remark, LogSourceEnum.REFUND.status, refundMoney, merchantId,order.getId(), order.getPaymentType());
+        iMemberBalanceLogService.saveLog(memberId, LogTypeEnum.INCREASE.type, remark, LogSourceEnum.REFUND.status, refundMoney, merchantId, order.getId(), order.getPaymentType());
         // 是否需要退服务费-绑定三方运力下单
-        if (order.getBindFee().compareTo(BigDecimal.ZERO) == 1){
+        if (order.getBindFee().compareTo(BigDecimal.ZERO) == 1) {
             iMemberService.updateAmount(member.getId(), order.getBindFee());
-            iMemberBalanceLogService.saveLog(memberId, LogTypeEnum.INCREASE.type, "订单取消,服务费退款", LogSourceEnum.REFUND.status, order.getBindFee(), merchantId,order.getId(), order.getPaymentType());
+            iMemberBalanceLogService.saveLog(memberId, LogTypeEnum.INCREASE.type, "订单取消,服务费退款", LogSourceEnum.REFUND.status, order.getBindFee(), merchantId, order.getId(), order.getPaymentType());
         }
     }
 
@@ -498,8 +501,8 @@ public class ApiOrderNewServiceImpl implements ApiOrderNewService {
                 wechatPayService.refund(orderTip.getChildOrderNo(), orderTip.getTotalAmout(), orderTip.getAmount(), "");
             }
         }
-        if(tips.compareTo(BigDecimal.ZERO)>0){
-            iMemberBalanceLogService.saveLog(memberId, LogTypeEnum.INCREASE.type, remark, LogSourceEnum.REFUND.status, tips, merchantId,Long.valueOf(orderTips.get(0).getOrderId()), orderTips.get(0).getPayType());
+        if (tips.compareTo(BigDecimal.ZERO) > 0) {
+            iMemberBalanceLogService.saveLog(memberId, LogTypeEnum.INCREASE.type, remark, LogSourceEnum.REFUND.status, tips, merchantId, Long.valueOf(orderTips.get(0).getOrderId()), orderTips.get(0).getPayType());
         }
     }
 
@@ -529,18 +532,18 @@ public class ApiOrderNewServiceImpl implements ApiOrderNewService {
 //            order.setTakeRemark(waimaiOrder.getCaution());
 //        }
 
-        if(DefaultShopEnum.SHOW.status.equals(order.getDefaultShop())){
+        if (DefaultShopEnum.SHOW.status.equals(order.getDefaultShop())) {
             order.setDefaultShop(DefaultShopEnum.STOP.status);
         }
         //order.setShopName(waimaiOrder.getPoiName());
         order.setPoiSeq(waimaiOrder.getDaySeq());
+        order.setOrderingSourceNo(waimaiOrder.getOutOrderId());
         if (waimaiOrder.getOrderType().equals(WaimaiTypeEnums.MEI_TUAN.getType())) {
             order.setOrderSource("101");
-            order.setOrderingSourceNo(waimaiOrder.getOutOrderId());
-        } else if(waimaiOrder.getOrderType().equals(WaimaiTypeEnums.E_LE_ME.getType())){
+        } else if (waimaiOrder.getOrderType().equals(WaimaiTypeEnums.E_LE_ME.getType())) {
             // 饿了么
             order.setOrderSource("102");
-        }else if(waimaiOrder.getOrderType().equals(WaimaiTypeEnums.E_LE_ME_RETAIL.getType())){
+        } else if (waimaiOrder.getOrderType().equals(WaimaiTypeEnums.E_LE_ME_RETAIL.getType())) {
             // 饿百
             order.setOrderSource("103");
         }
@@ -554,42 +557,42 @@ public class ApiOrderNewServiceImpl implements ApiOrderNewService {
      * 校验用户绑定三方运力,下单机制(这里校验的都是商家)
      */
     @Transactional(rollbackFor = Exception.class)
-    public void checkMemberAmount(Member member, List<Long> deliveryIds){
-        if (member.getMerchantId() == null){
+    public void checkMemberAmount(Member member, List<Long> deliveryIds) {
+        if (member.getMerchantId() == null) {
             return;
         }
-        MerchantDeliveryFee fee = iMerchantDeliveryFeeService.getByMerchantAndDeliveryIds(member.getMerchantId(),deliveryIds);
-        if (fee == null){
+        MerchantDeliveryFee fee = iMerchantDeliveryFeeService.getByMerchantAndDeliveryIds(member.getMerchantId(), deliveryIds);
+        if (fee == null) {
             return;
         }
-        if (member.getAmount().compareTo(fee.getAmount()) == -1){
+        if (member.getAmount().compareTo(fee.getAmount()) == -1) {
             throw new CustomAppException("选择运力为绑定运力,当前余额少于服务费,请充值后再下单!", 250);
         }
     }
 
     @Override
     public boolean addRemark(Long orderId, String remark) {
-        Order order  = new Order();
+        Order order = new Order();
         order.setTakeRemark(remark);
         order.setId(orderId);
-       return iOrderService.updateById(order);
+        return iOrderService.updateById(order);
     }
 
-    private  void address(OrderReq req){
+    private void address(OrderReq req) {
         String sendAddress = req.getSendAddress().getAddress();
         String sendStreet = req.getSendAddress().getStreet();
         String receiptAddress = req.getReceiptAddress().getAddress();
         String receiptStreet = req.getReceiptAddress().getStreet();
-        if(StringUtils.isNotBlank(sendStreet)&&sendAddress.endsWith(sendStreet)){
-            req.getSendAddress().setAddress(sendAddress.substring(0,sendAddress.lastIndexOf(sendStreet)));
+        if (StringUtils.isNotBlank(sendStreet) && sendAddress.endsWith(sendStreet)) {
+            req.getSendAddress().setAddress(sendAddress.substring(0, sendAddress.lastIndexOf(sendStreet)));
         }
-        if(StringUtils.isNotBlank(receiptStreet)&&receiptAddress.endsWith(receiptStreet)){
-            req.getReceiptAddress().setAddress(receiptAddress.substring(0,receiptAddress.lastIndexOf(receiptStreet)));
+        if (StringUtils.isNotBlank(receiptStreet) && receiptAddress.endsWith(receiptStreet)) {
+            req.getReceiptAddress().setAddress(receiptAddress.substring(0, receiptAddress.lastIndexOf(receiptStreet)));
         }
     }
 
 
-    private void resetOrder(Order order, Product product){
+    private void resetOrder(Order order, Product product) {
         order.setId(null);
         order.setRefundMoney(BigDecimal.ZERO);
         order.setOutTradeNo("");
@@ -622,17 +625,18 @@ public class ApiOrderNewServiceImpl implements ApiOrderNewService {
 
     /**
      * 判断用户余额
+     *
      * @param memberId
      */
-    public void checkAmount(Long memberId){
+    public void checkAmount(Long memberId) {
         Member member = iMemberService.getById(memberId);
-        if (member.getMerchantId() != null){
+        if (member.getMerchantId() != null) {
             List<Member> members = iMemberService.selectListByMerchantId(member.getMerchantId().intValue());
             List<Long> mIds = new ArrayList<>();
-            log.info("推送用户==="+JSONObject.toJSONString(members));
-            if (member.getAmount().compareTo(new BigDecimal(50)) == -1){
+            log.info("推送用户===" + JSONObject.toJSONString(members));
+            if (member.getAmount().compareTo(new BigDecimal(50)) == -1) {
                 // 自动配送关闭,关闭该商家的所有门店
-                for (Member m : members){
+                for (Member m : members) {
                     // 判断用户是否开启自配送
 //                    MemberConfigDto memberConfigDto = iMemberConfigService.findDetail(m.getId());
 //                    if (memberConfigDto == null || memberConfigDto.getOpenAutodelivery().equals(0)){
@@ -644,18 +648,18 @@ public class ApiOrderNewServiceImpl implements ApiOrderNewService {
                     mIds.add(m.getId());
                 }
                 // 发推送
-                if(CollectionUtils.isNotEmpty(mIds)){
-                    messagePushService.memberAmountMessage(mIds, "您的平台余额低于50元","您的平台余额已不足50元,可能导致自动发单失败,请及时充值!",1);
+                if (CollectionUtils.isNotEmpty(mIds)) {
+                    messagePushService.memberAmountMessage(mIds, "您的平台余额低于50元", "您的平台余额已不足50元,可能导致自动发单失败,请及时充值!", 1);
                 }
                 return;
             }
-            if (member.getAmount().compareTo(new BigDecimal(100)) == -1){
-                for (Member m : members){
+            if (member.getAmount().compareTo(new BigDecimal(100)) == -1) {
+                for (Member m : members) {
                     mIds.add(m.getId());
                 }
                 // 发推送
-                if(CollectionUtils.isNotEmpty(mIds)){
-                    messagePushService.memberAmountMessage(mIds, "您的平台余额低于100元","您的平台余额已不足100元,可能导致自动发单失败,请及时充值!",2);
+                if (CollectionUtils.isNotEmpty(mIds)) {
+                    messagePushService.memberAmountMessage(mIds, "您的平台余额低于100元", "您的平台余额已不足100元,可能导致自动发单失败,请及时充值!", 2);
                 }
             }
         }

+ 149 - 9
lb-app/src/main/java/com/ydd/app/service/impl/ApiOrderServiceImpl.java

@@ -1,5 +1,7 @@
 package com.ydd.app.service.impl;
 
+import cn.hutool.core.bean.BeanUtil;
+import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
@@ -49,6 +51,11 @@ 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 com.ydd.third.common.vo.waimai.eleme.api.entity.order.OActivity;
+import com.ydd.third.common.vo.waimai.meituan.MeituanOrderExtraVo;
+import com.ydd.third.print.request.PrintOrderActDto;
+import com.ydd.third.print.request.PrintOrderDto;
+import com.ydd.third.print.request.PrintOrderGoodsDto;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.collections4.CollectionUtils;
@@ -239,7 +246,7 @@ public class ApiOrderServiceImpl implements ApiOrderService {
             DspConfig dspConfig = null;
             dspConfig = iDspConfigService.getOne(new QueryWrapper<DspConfig>().eq("deleted", 0));
 
-            List<DeliveryInfo> deliveryInfos = iDspDeliveryService.findList(member, shopId,orderReq.getTransport(),null);
+            List<DeliveryInfo> deliveryInfos = iDspDeliveryService.findList(member, shopId, orderReq.getTransport(), null);
             if (type == 2) {
                 List<String> deliveryIds = Arrays.asList(orderReq.getPreDeliveryIds().split(","));
                 deliveryInfos = deliveryInfos.stream().filter(a -> deliveryIds.contains(a.getId().toString())).collect(Collectors.toList());
@@ -250,7 +257,7 @@ public class ApiOrderServiceImpl implements ApiOrderService {
                 orderReq.setShopName(shop.getName());
             }
             for (DeliveryInfo info : deliveryInfos) {
-                if (orderReq.getTransport().equals(0)) {
+                /*if (orderReq.getTransport().equals(0)) {
                     if (info.getType().equals(DeliveryTypeEnums.HUO_LA_LA.getType())) {
                         continue;
                     }
@@ -258,7 +265,7 @@ public class ApiOrderServiceImpl implements ApiOrderService {
                     if (!info.getType().equals(DeliveryTypeEnums.HUO_LA_LA.getType())) {
                         continue;
                     }
-                }
+                }*/
                 ValuationRes valuationRes = queryOrderDeliverFee(orderReq, info, member.getAmount(), loginId, shopId, defaultShop);
                 if (valuationRes != null) {
                     valuationRes.setPreferredDelivery(info.getPreferredDelivery());
@@ -375,7 +382,6 @@ public class ApiOrderServiceImpl implements ApiOrderService {
         }
     }
 
-
     private ValuationRes queryOrderDeliverFee(OrderReq orderReq, DeliveryInfo delivery, BigDecimal amount, Long memberId, Long shopId, Integer defaultShop) {
         if (DeliveryTypeEnums.SHUN_FENG.getType().equals(delivery.getType()) && "0".equals(orderReq.getProduct().getSfProductType())) {
             return null;
@@ -410,7 +416,7 @@ public class ApiOrderServiceImpl implements ApiOrderService {
         ResObject<OrderResultVo> resObject = client.queryOrderDeliverFee(orderVo);
         if (resObject.getCode() == 2155 && (DeliveryTypeEnums.DADA.getType().equals(delivery.getType()) || DeliveryTypeEnums.DADA_YZ.getType().equals(delivery.getType()))){
             // 达达/优质余额不足,重新计价
-            log.info("余额不足----"+DeliveryTypeEnums.getEnums(delivery.getType()).getName()+"余额不足,重新计价");
+            log.info("余额不足----" + DeliveryTypeEnums.getNameByType(delivery.getType()) + "余额不足,重新计价");
             orderVo.setMerchantId(null);
             orderVo.setShopNo(delivery.getDadaThirdShopId());
             delivery.setShopId(delivery.getDadaThirdShopId());
@@ -839,6 +845,7 @@ public class ApiOrderServiceImpl implements ApiOrderService {
         res.setThirdShopId(delivery.getThirdShopId());
         res.setAuthToken(delivery.getAuthToken());
         res.setPhone(delivery.getPhone());
+        res.setDeliveryType(delivery.getType());
     }
 
     @Override
@@ -1252,7 +1259,6 @@ public class ApiOrderServiceImpl implements ApiOrderService {
         List<OrderListDto> list = iOrderService.getOrderListByShopIdsAndMemberIds(shopIds, memberIds);
         // 新订单、异常单 门店/商家才有
         List<OrderListDto> newOrderList = Lists.newArrayList();
-        List<OrderListDto> appointList = Lists.newArrayList();
         List<OrderListDto> exceptionList = Lists.newArrayList();
         if (!MemberTypeEnum.PERSON.type.equals(member.getMemberType())) {
             // 新订单
@@ -1264,7 +1270,7 @@ public class ApiOrderServiceImpl implements ApiOrderService {
                     || (item.getWaimaiOrderId() != null && DeliveryStatusEnum.ABNORMAL.getStatus().equals(item.getDeliveryStatus()) && item.getWmstatus() != null && item.getWmstatus() != 4)).collect(Collectors.toList());
         }
         // 预约单
-        appointList = list.stream().filter(item -> DeliveryStatusEnum.ORDERS_TO_BE_BILLED.getStatus().equals(item.getDeliveryStatus()) && item.getTakeType() != null && !TakeTypeEnum.NOW.getType().equals(item.getTakeType())
+        List<OrderListDto> appointList = list.stream().filter(item -> DeliveryStatusEnum.ORDERS_TO_BE_BILLED.getStatus().equals(item.getDeliveryStatus()) && item.getTakeType() != null && !TakeTypeEnum.NOW.getType().equals(item.getTakeType())
                 && (item.getWaimaiOrderId() == null && item.getSaveFlag() == 1 || (item.getWaimaiOrderId() != null && item.getWmstatus() != null && item.getWmstatus() != 4))).collect(Collectors.toList());
         // 待接单
         List<OrderListDto> toBeReceivedList = list.stream().filter(item -> (item.getWaimaiOrderId() == null && DeliveryStatusEnum.ORDERS_TO_BE_RECEIVED.getStatus().equals(item.getDeliveryStatus()))
@@ -1461,6 +1467,7 @@ public class ApiOrderServiceImpl implements ApiOrderService {
             }
         }
         order.setShopId(shopId);
+        order.setShopName(req.getShopName());
         AddressReq sendAddress = req.getSendAddress();
         AddressReq receiveAddress = req.getReceiptAddress();
         if (Objects.isNull(sendAddress) || Objects.isNull(receiveAddress)) {
@@ -1593,11 +1600,11 @@ public class ApiOrderServiceImpl implements ApiOrderService {
                     if (DeliveryStatusEnum.TO_BE_DELIVERED.status.equals(order.getDeliveryStatus())) {
 //                        dto.setRiderArriveMinute(Math.max(DateUtils.parseMsToMinute(result.getDuration() * 1000), 0));
                         dto.setRiderArriveMinute(Math.max(result.getDuration() / 60, 0));
-                        log.info("配送平台: {}, 骑手取货中, 三方平台返回预计到店时间: {}, 计算预计到店时长: {} 分钟", DeliveryTypeEnums.getEnums(delivery.getType()), orderDto.getEstimateArriveTimeStr(), Math.max(DateUtils.parseMsToMinute(result.getDuration() * 1000), 0));
+                        log.info("配送平台: {}, 骑手取货中, 三方平台返回预计到店时间: {}, 计算预计到店时长: {} 分钟", DeliveryTypeEnums.getNameByType(delivery.getType()), orderDto.getEstimateArriveTimeStr(), Math.max(DateUtils.parseMsToMinute(result.getDuration() * 1000), 0));
                     } else if (DeliveryStatusEnum.IN_DELIVERY.status.equals(order.getDeliveryStatus())) {
                         Date estimateArriveTime = DateUtils.addSecondsToTimeDate(new Date(), Integer.parseInt(String.valueOf(result.getDuration())));
                         dto.setEstimateArriveTime(estimateArriveTime);
-                        log.info("配送平台: {}, 骑手配送中, 三方平台返回预计送达时间: {}, 计算预计送达时间: {}", DeliveryTypeEnums.getEnums(delivery.getType()), orderDto.getEstimateArriveTimeStr(), estimateArriveTime);
+                        log.info("配送平台: {}, 骑手配送中, 三方平台返回预计送达时间: {}, 计算预计送达时间: {}", DeliveryTypeEnums.getNameByType(delivery.getType()), orderDto.getEstimateArriveTimeStr(), estimateArriveTime);
                     }
                 }
             }
@@ -1605,4 +1612,137 @@ public class ApiOrderServiceImpl implements ApiOrderService {
         return dto;
     }
 
+    @Override
+    public PrintOrderDto getPrintOrderInfos(Long orderId, Long waimaiOrderId) {
+        WaimaiOrder waimaiOrder = null;
+        if (Objects.nonNull(orderId)) {
+            Order order = iOrderService.getById(orderId);
+            if (Objects.isNull(order)) {
+                return null;
+            }
+            waimaiOrder = iWaimaiOrderService.getById(order.getWaimaiOrderId());
+        }
+        if (Objects.nonNull(waimaiOrderId)) {
+            waimaiOrder = iWaimaiOrderService.getById(waimaiOrderId);
+        }
+        if (Objects.isNull(waimaiOrder)) {
+            return null;
+        }
+        PrintOrderDto printOrderDto = new PrintOrderDto();
+        BeanUtil.copyProperties(waimaiOrder, printOrderDto);
+        // 取消单
+        if (waimaiOrder.getStatus().equals(OrderStatusEnum.CANCEL.status)){
+            printOrderDto.setOrderStatus(OrderStatusEnum.CANCEL.status);
+        }
+        if (waimaiOrder.getCaution().contains("收餐人隐私号")){
+            printOrderDto.setCaution(waimaiOrder.getCaution().substring(0,waimaiOrder.getCaution().indexOf("收餐人隐私号")));
+        } else {
+            printOrderDto.setCaution(waimaiOrder.getCaution());
+        }
+        if (waimaiOrder.getDeliveryTime() != 0) {
+            String deliverTimeStr = DateUtils.format( new Date(waimaiOrder.getDeliveryTime() * 1000),"MM月dd日 HH:mm") + "送达";
+            printOrderDto.setDeliveryTime(deliverTimeStr);
+        }
+        // 设置商品信息
+        printOrderDto.setOrderGoodsDtoList(this.getOrderGoods(waimaiOrder.getId()));
+        // 设置订单活动信息
+        DspWaimai dspWaimai = iDspWaimaiService.getById(waimaiOrder.getWaimaiId());
+        printOrderDto.setActDtos(this.getOrderActs(waimaiOrder, dspWaimai.getType()));
+
+        if (waimaiOrder.getShippingFee() != null) {
+            printOrderDto.setDeliverFee(waimaiOrder.getShippingFee().toString());
+        }
+        if (waimaiOrder.getBoxFee() != null) {
+            printOrderDto.setBoxFee(waimaiOrder.getBoxFee().toString());
+        }
+        printOrderDto.setIsBook(waimaiOrder.getDeliveryTime() > 0 ? 1 : 0);
+        if (waimaiOrder.getOrderTime() != null) {
+            printOrderDto.setCreateTime(DateUtils.parseDateToStr(DateUtils.YYYY_MM_DD_HH_MM_SS,waimaiOrder.getOrderTime()));
+        } else {
+            printOrderDto.setCreateTime(DateUtils.dateTimeNow(DateUtils.YYYY_MM_DD_HH_MM_SS));
+        }
+        printOrderDto.setOrderSource(dspWaimai.getName());
+        printOrderDto.setShopName(waimaiOrder.getPoiName());
+        printOrderDto.setRecipientPrivacyPhone(waimaiOrder.getReceiptPrivacyPhone());
+        if (waimaiOrder.getLogisticsCode() != null && !waimaiOrder.getLogisticsCode().equals("0000") && !waimaiOrder.getLogisticsCode().equals("5001") && !waimaiOrder.getLogisticsCode().equals("00009003")){
+            printOrderDto.setRecipientAddress(waimaiOrder.getRecipientAddressDesensitization());
+        } else {
+            printOrderDto.setRecipientAddress(waimaiOrder.getRecipientAddress());
+        }
+        printOrderDto.setOpenQrCode(iShopService.getOpenQrCode(waimaiOrder.getShopId()));
+        printOrderDto.setQrCode(waimaiOrder.getOutOrderId());
+        return printOrderDto;
+    }
+
+    private List<PrintOrderActDto> getOrderActs(WaimaiOrder waimaiOrder, Integer waimaiType) {
+        List<PrintOrderActDto> orderActs = Lists.newArrayList();
+        if (StringUtils.isBlank(waimaiOrder.getExtras())) {
+            return orderActs;
+        }
+        if (WaimaiTypeEnums.E_LE_ME.getType().equals(waimaiType)) {
+            List<OActivity> list = JSONArray.parseArray(waimaiOrder.getExtras(), OActivity.class);
+            if (CollectionUtils.isNotEmpty(list)) {
+                for (OActivity activity : list) {
+                    if (activity != null) {
+                        PrintOrderActDto actDto = new PrintOrderActDto();
+                        actDto.setAmount(String.valueOf(activity.getAmount()));
+                        actDto.setName(activity.getName());
+                        actDto.setType(activity.getType());
+                        orderActs.add(actDto);
+                    }
+                }
+            }
+        } else if (WaimaiTypeEnums.MEI_TUAN.getType().equals(waimaiType)) {
+            List<MeituanOrderExtraVo> list =JSONArray.parseArray(waimaiOrder.getExtras(), MeituanOrderExtraVo.class);
+            if (CollectionUtils.isNotEmpty(list)) {
+                for (MeituanOrderExtraVo vo : list) {
+                    if(vo != null && vo.getRemark() != null) {
+                        PrintOrderActDto actDto = new PrintOrderActDto();
+                        actDto.setAmount(String.valueOf(vo.getReduceFee()));
+                        actDto.setType(String.valueOf(vo.getType()));
+                        actDto.setName(vo.getRemark());
+                        orderActs.add(actDto);
+                    }
+                }
+            }
+        } else if (WaimaiTypeEnums.E_LE_ME_RETAIL.getType().equals(waimaiType)) {
+            JSONArray array = JSONArray.parseArray(waimaiOrder.getExtras());
+            if(array != null && array.size() > 0){
+                for(int i = 0; i < array.size(); i++){
+                    JSONObject json1 = array.getJSONObject(i);
+                    PrintOrderActDto actDto = new PrintOrderActDto();
+                    actDto.setAmount(new BigDecimal(json1.getString("fee")).divide(new BigDecimal("100")).toString());
+                    actDto.setName(json1.getString("desc"));
+                    actDto.setType(json1.getString("type"));
+                    orderActs.add(actDto);
+                }
+            }
+        }
+        orderActs = MeiTuanConvertPrint.merge(orderActs);
+        return orderActs;
+    }
+
+    private List<PrintOrderGoodsDto> getOrderGoods(Long waimaiOrderId) {
+        List<PrintOrderGoodsDto> orderGoods = Lists.newArrayList();
+        List<WaimaiOrderDetail> detailList = iWaimaiOrderDetailService.list(new QueryWrapper<WaimaiOrderDetail>().eq("waimai_order_id", waimaiOrderId));
+        for (WaimaiOrderDetail waimaiOrderDetail : detailList) {
+            PrintOrderGoodsDto printOrderGoodsDto = new PrintOrderGoodsDto();
+            BeanUtil.copyProperties(waimaiOrderDetail, printOrderGoodsDto);
+            StringBuilder spec = new StringBuilder();
+            if (StringUtils.isNotBlank(waimaiOrderDetail.getFoodProperty())){
+                spec.append(waimaiOrderDetail.getFoodProperty());
+            }
+            if (StringUtils.isNotBlank(spec.toString()) && StringUtils.isNotBlank(waimaiOrderDetail.getSpec())) {
+                spec.append(",").append(waimaiOrderDetail.getSpec());
+            } else if (StringUtils.isBlank(spec.toString()) && StringUtils.isNotBlank(waimaiOrderDetail.getSpec())) {
+                spec.append(waimaiOrderDetail.getSpec());
+            }
+            if (StringUtils.isNotBlank(spec.toString())) {
+                printOrderGoodsDto.setFoodName(waimaiOrderDetail.getFoodName() + "(" + spec.toString() + ")");
+            }
+            orderGoods.add(printOrderGoodsDto);
+        }
+        return orderGoods;
+    }
+
 }

+ 540 - 0
lb-app/src/main/java/com/ydd/app/service/impl/ApiOrderValuationServiceImpl.java

@@ -0,0 +1,540 @@
+package com.ydd.app.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.ydd.api.DeliveryService;
+import com.ydd.app.OrderEntityUtils;
+import com.ydd.app.QueryAmountEntityUtils;
+import com.ydd.app.dto.AddressReq;
+import com.ydd.app.dto.OrderReq;
+import com.ydd.app.dto.ValuationRes;
+import com.ydd.app.service.ApiOrderValuationService;
+import com.ydd.app.service.ApiProductService;
+import com.ydd.common.constant.BillingConstant;
+import com.ydd.common.enums.DeliveryTypeEnums;
+import com.ydd.common.enums.WaimaiTypeEnums;
+import com.ydd.common.utils.DateUtils;
+import com.ydd.common.utils.SnCodeUtils;
+import com.ydd.common.utils.StringUtils;
+import com.ydd.ecloud.core.utils.BigDecimalUtils;
+import com.ydd.ecloud.core.utils.JsonMapper;
+import com.ydd.module.domain.*;
+import com.ydd.module.dto.*;
+import com.ydd.module.enums.*;
+import com.ydd.module.expection.CustomAppException;
+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.utils.CoordinateUtils;
+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;
+import org.apache.commons.compress.utils.Lists;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.math.BigDecimal;
+import java.util.*;
+import java.util.stream.Collectors;
+
+/**
+ * @author 叶君翔
+ * @date 2021/11/12 11:20
+ */
+@Slf4j
+@Service
+@RequiredArgsConstructor(onConstructor_ = @Autowired)
+public class ApiOrderValuationServiceImpl implements ApiOrderValuationService {
+
+    private final ApiProductService apiProductService;
+
+    private final IOrderService iOrderService;
+
+    private final IMemberService iMemberService;
+
+    private final DeliveryService client;
+
+    private final IDspDeliveryService iDspDeliveryService;
+
+    private final IWaimaiOrderDetailService iWaimaiOrderDetailService;
+
+    private final IWaimaiOrderService iWaimaiOrderService;
+
+    private final IDspWaimaiService iDspWaimaiService;
+
+    private final DeliveryConfig deliveryConfig;
+
+    private final IMemberConfigService iMemberConfigService;
+
+    private final ISysConfigService iSysConfigService;
+
+    private final IShopDeliveryService iShopDeliveryService;
+
+    private final IShopService iShopService;
+    private final IShopWaimaiService iShopWaimaiService;
+
+    private final IPackageDiscountDetailService iPackageDiscountDetailService;
+    private final IPackageCommissionDetailService iPackageCommissionDetailService;
+    private final IPackageDeliveryService iPackageDeliveryService;
+    private final IPackageCityConfigService iPackageCityConfigService;
+
+    @Override
+    public ValuationRes orderValuation(Member member, OrderReq orderReq, Integer type) {
+        log.info("<===========>订单计价参数: loginId:{}, type: {}, orderReq: {} ", member.getId(), type, JsonMapper.nonEmptyMapper().toJson(orderReq));
+        try {
+            if (member.getMemberType().equals(MemberTypeEnum.SHOP.type)) {
+                member = iMemberService.getOne(new QueryWrapper<Member>().eq("member_type", MemberTypeEnum.MERCHANT.type).eq("merchant_id", member.getMerchantId()));
+            }
+            AddressReq sendAddress = orderReq.getSendAddress();
+            AddressReq receiveAddress = orderReq.getReceiptAddress();
+            if (sendAddress == null || receiveAddress == null) {
+                throw new CustomAppException(ExceptionEnum.ADDRESS_NOT_EXISTS);
+            }
+            Product product = apiProductService.findById(orderReq.getProductId());
+            if (product == null) {
+                throw new CustomAppException(ExceptionEnum.PRODUCT_NOT_EXISTS);
+            }
+            Long shopId = orderReq.getShopId();
+            String takeRemark = "";
+            Integer defaultShop = 0;
+            orderReq.setOrderNo(SnCodeUtils.createSn());
+            if (orderReq.getOrderId() != null) {
+                Order order = iOrderService.getById(orderReq.getOrderId());
+                orderReq.setWaimaiOrderId(order.getWaimaiOrderId());
+                if (order.getDeliveryStatus() >= DeliveryStatusEnum.ORDERS_TO_BE_RECEIVED.status && !DeliveryStatusEnum.FINISH.status.equals(order.getDeliveryStatus())) {
+                    log.info("该配送状态的订单不支持计价操作, orderId: {}, deliveryStatus: {}", order.getId(), order.getDeliveryStatus());
+                    return null;
+                }
+                // 非再来一单
+                if (!DeliveryStatusEnum.CANCEL.status.equals(order.getDeliveryStatus())
+                        && !DeliveryStatusEnum.FINISH.status.equals(order.getDeliveryStatus())
+                        && !DeliveryStatusEnum.ABNORMAL.status.equals(order.getDeliveryStatus())) {
+                    orderReq.setOrderNo(order.getOrderSn());
+                }
+                shopId = order.getShopId();
+                takeRemark = order.getTakeRemark();
+            }
+            if(member.getShopId() != null && shopId == null){
+                Shop shop = iShopService.getById(member.getShopId());
+                double distance = CoordinateUtils.getDistance(Double.parseDouble(sendAddress.getLng()), Double.parseDouble(sendAddress.getLat()), Double.parseDouble(shop.getLng()), Double.parseDouble(shop.getLat()));
+                if (distance > BillingConstant.SHOP_BILLING_DISTANCE) { //暂定小于三百米 是门店发单
+                    defaultShop = 1;
+                } else {
+                    shopId = member.getShopId();
+                }
+            }
+
+            if (StringUtils.isNotBlank(orderReq.getTakeTime()) && DateUtils.addHours(new Date(), 2).compareTo(DateUtils.dateTime(DateUtils.YYYY_MM_DD_HH_MM_SS, orderReq.getTakeTime())) > 0) {
+                orderReq.setTakeTime("");
+                orderReq.setTakeType(0);
+            }
+            List<WaimaiOrderDetail> waiMaiOrderDetails = new ArrayList<>();
+            orderReq.setWaimaiOrderDetails(waiMaiOrderDetails);
+            if (orderReq.getWaimaiOrderId() != null) {
+                // 设置外卖单相关信息
+                shopId = this.setWaimaiOrderInfo(orderReq, takeRemark, shopId);
+            }
+            orderReq.setProduct(product);
+            ValuationRes res = new ValuationRes();
+            List<ValuationRes> list = new ArrayList<>();
+            List<ValuationRes> supports = new ArrayList<>();
+
+            // 获取最匹配的运力包(门店 > 城市 > 全国)
+            Long deliveryPackageId = iPackageCityConfigService.getPackageId(shopId, member.getAgentId(), orderReq.getSendAddress().getCityCode(), PackageCityConfigPackageTypeEnum.DELIVERY.type);
+            List<Integer> types = Lists.newArrayList();
+            PackageDeliveryDto packageDeliveryDto = null;
+            if (deliveryPackageId != null) {
+                packageDeliveryDto = iPackageDeliveryService.getDeliveryDtoByPackageIdAndDeliveryType(deliveryPackageId);
+                List<PackageDeliveryDetailDto> deliveryDetailDtoList = packageDeliveryDto.getPackageDeliveryDetailDtoList();
+                if (CollectionUtils.isNotEmpty(deliveryDetailDtoList)) {
+                    types = deliveryDetailDtoList.stream().map(PackageDeliveryDetailDto::getDeliveryType).collect(Collectors.toList());
+                }
+            }
+            List<DeliveryInfo> deliveryInfos = iDspDeliveryService.findList(member, shopId, orderReq.getTransport(), types);
+            if (CollectionUtils.isEmpty(deliveryInfos)) {
+                log.warn("无可用发单运力!");
+                return res;
+            }
+            if (shopId != null) {
+                Shop shop = iShopService.getById(shopId);
+                orderReq.setShopName(shop.getName());
+            }
+
+            List<Integer> deliveryTypes = deliveryInfos.stream().map(DspDelivery::getType).collect(Collectors.toList());
+            // 获取最匹配的优惠包(门店 > 代理商 > 全国)
+            Long discountPackageId = iPackageCityConfigService.getPackageId(shopId, member.getAgentId(), orderReq.getSendAddress().getCityCode(), PackageCityConfigPackageTypeEnum.DISCOUNT.type);
+            Map<Integer, List<PackageDiscountDetailDto>> packageDiscountMap = new HashMap<>();
+            if (discountPackageId != null) {
+                List<PackageDiscountDetailDto> discountDetailDtoList = iPackageDiscountDetailService.getDiscountListByPackageIdAndDeliveryType(discountPackageId, deliveryTypes);
+                packageDiscountMap = discountDetailDtoList.stream().collect(Collectors.groupingBy(PackageDiscountDetailDto::getDeliveryType));
+            }
+            // 获取最匹配的佣金包(门店 > 代理商 > 全国)
+            Long commissionPackageId = iPackageCityConfigService.getPackageId(shopId, member.getAgentId(), orderReq.getSendAddress().getCityCode(), PackageCityConfigPackageTypeEnum.COMMISSION.type);
+            Map<Integer, List<PackageCommissionDetailDto>> packageCommissionMap = new HashMap<>();
+            if (commissionPackageId != null) {
+                List<PackageCommissionDetailDto> commissionDetailDtoList = iPackageCommissionDetailService.getCommissionListByPackageIdAndDeliveryType(commissionPackageId, deliveryTypes);
+                packageCommissionMap = commissionDetailDtoList.stream().collect(Collectors.groupingBy(PackageCommissionDetailDto::getDeliveryType));
+            }
+
+            for (DeliveryInfo info : deliveryInfos) {
+                // 计价
+                ValuationRes valuationRes = this.queryOrderDeliverFee(orderReq, info, member.getMerchantId(), shopId, defaultShop);
+                if (valuationRes == null) {
+                    continue;
+                }
+                valuationRes.setPreferredDelivery(info.getPreferredDelivery());
+                valuationRes.setOriginalMoney(valuationRes.getDeliveryAmount());
+                // 设置排序
+                if (packageDeliveryDto != null && PackageDeliveryTypeEnum.CUSTOM.type.equals(packageDeliveryDto.getType())) {
+                    this.setBillingSort(packageDeliveryDto, valuationRes);
+                }
+                // 设置优惠
+                if (packageDiscountMap.size() > 0) {
+                    this.setDiscountInfo(packageDiscountMap.get(info.getType()), valuationRes);
+                }
+                // 设置佣金
+                if (packageCommissionMap.size() > 0) {
+                    this.setCommissionInfo(packageCommissionMap.get(info.getType()), valuationRes);
+                }
+                valuationRes.setIsMerchant(info.getIsMerchant());
+                if (valuationRes.getIsMine() == 0) {
+                    // 校验余额是否充足
+                    if (member.getAmount().compareTo(valuationRes.getDeliveryAmount()) >= 0) {
+                        valuationRes.setIsEnough(StatusEnum.SHOW.status);
+                    }
+                }
+                list.add(valuationRes);
+            }
+
+            // 默认价格优先
+            list.sort((o1, o2) -> {
+                BigDecimal i = o1.getDeliveryAmount().subtract(o2.getDeliveryAmount());
+                return i.intValue();
+            });
+            // Res数据组装
+            this.setValuationRes(list, res, member);
+            // 运力包发单类型为自定义, 则先按照sort排,再按价格排
+            if (packageDeliveryDto != null && PackageDeliveryTypeEnum.CUSTOM.type.equals(packageDeliveryDto.getType())) {
+                Collections.sort(list);
+            }
+
+            // 处理发单运力
+            List<ValuationRes> billList = this.handleBillList(type, member.getId(), list);
+            // 设置发单时长
+            if (packageDeliveryDto != null) {
+                billList = this.setBillingDuration(packageDeliveryDto, billList);
+            }
+            res.setOptionals(billList);
+            res.setSupports(supports);
+            return res;
+        } catch (Exception e) {
+            log.error("发起计价异常", e);
+            return null;
+        }
+    }
+
+    private List<ValuationRes> handleBillList(Integer type, Long loginId, List<ValuationRes> list) {
+        // 查询下单设置推荐屏蔽运力
+        List<ValuationRes> billList = new ArrayList<>();
+        if (type == 1) {
+            MemberConfig config = iMemberConfigService.getOne(new QueryWrapper<MemberConfig>().eq("member_id",loginId));
+            if (config != null) {
+                if (StringUtils.isNotEmpty(config.getBillDeliveryIds())) {
+                    List<String> billDeliveryIds = Arrays.asList(config.getBillDeliveryIds().split(","));
+                    // 过滤出商家设置的推荐运力, 计价页面靠前显示
+                    billList = list.stream().filter(a -> billDeliveryIds.contains(a.getDeliveryId().toString())).collect(Collectors.toList());
+                }
+                if (StringUtils.isNotEmpty(config.getShieldDeliveryIds())) {
+                    List<String> shieldDeliveryIds = Arrays.asList(config.getShieldDeliveryIds().split(","));
+                    // 过滤掉商家设置的屏蔽运力
+                    list = list.stream().filter(a -> !shieldDeliveryIds.contains(a.getDeliveryId().toString())).collect(Collectors.toList());
+                }
+            }
+        }
+        list.removeAll(billList);
+        billList.addAll(list);
+
+        // 闪送距离替换
+        Optional<ValuationRes> optional = billList.stream().filter(item -> !item.getDeliveryType().equals(DeliveryTypeEnums.SHAN_SONG.getType())).findFirst();
+        if (optional.isPresent()) {
+            String desc = optional.get().getDesc();
+            for (ValuationRes res1 : billList) {
+                if (DeliveryTypeEnums.SHAN_SONG.getType().equals(res1.getDeliveryType())) {
+                    res1.setDesc(desc);
+                    break;
+                }
+            }
+        }
+        return billList;
+    }
+
+    private void setValuationRes(List<ValuationRes> list, ValuationRes res, Member member) {
+        // 获取聚合配送的预估价,选最低价格展示
+        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");
+        }
+        // 新用户只要没有产生支付成功的订单数据 算首单
+        int successOrderCount;
+        if (member.getShopId() != null) {
+            successOrderCount = iOrderService.count(new QueryWrapper<Order>().eq("shop_id", member.getShopId()).eq("status", PayStatusEnum.PAYED.status));
+        } else {
+            successOrderCount = iOrderService.count(new QueryWrapper<Order>().eq("member_id", member.getId()).eq("status", PayStatusEnum.PAYED.status));
+        }
+        if (successOrderCount == 0) {
+            String configValue = iSysConfigService.selectConfigByKey("NEW_COMERS");
+            res.setFirstCoupon(configValue);
+        }
+    }
+
+    private void setBillingSort(PackageDeliveryDto packageDeliveryDto, ValuationRes valuationRes) {
+        List<PackageDeliveryDetailDto> deliveryDetailDtoList = packageDeliveryDto.getPackageDeliveryDetailDtoList();
+        if (CollectionUtils.isNotEmpty(deliveryDetailDtoList)) {
+            Optional<PackageDeliveryDetailDto> optional = deliveryDetailDtoList.stream().filter(item -> valuationRes.getDeliveryType().equals(item.getDeliveryType())).findFirst();
+            if (optional.isPresent()) {
+                PackageDeliveryDetailDto packageDeliveryDetailDto = optional.get();
+                valuationRes.setSort((packageDeliveryDetailDto.getSort() == null || packageDeliveryDetailDto.getSort() == 0) ? BillingConstant.DEFAULT_BILL_SORT : packageDeliveryDetailDto.getSort());
+            }
+        }
+    }
+
+    private List<ValuationRes> setBillingDuration(PackageDeliveryDto packageDeliveryDto, List<ValuationRes> billList) {
+        String billDurationStr = packageDeliveryDto.getBillDurationStr();
+        List<PackageDeliveryDetailDto> deliveryDetailList = packageDeliveryDto.getPackageDeliveryDetailDtoList();
+        if (PackageDeliveryBillDurationTypeEnum.CUSTOM.type.equals(packageDeliveryDto.getBillDurationType()) && StringUtils.isNotEmpty(billDurationStr) && CollectionUtils.isNotEmpty(deliveryDetailList)) {
+            deliveryDetailList = deliveryDetailList.stream().filter(item -> item.getSort() != null && item.getSort() > 0).collect(Collectors.toList());
+            deliveryDetailList.sort(Comparator.comparing(PackageDeliveryDetailDto::getSort));
+            String[] split = billDurationStr.split(",");
+            for (int i = 0; i < deliveryDetailList.size(); i++) {
+                PackageDeliveryDetailDto packageDeliveryDetailDto = deliveryDetailList.get(i);
+                if (i < split.length) {
+                    packageDeliveryDetailDto.setBillDuration(Integer.parseInt(split[i]));
+                }
+            }
+            for (ValuationRes valuationRes : billList) {
+                int billDuration = BillingConstant.DEFAULT_BILL_DURATION;
+                Optional<PackageDeliveryDetailDto> optional = deliveryDetailList.stream().filter(item -> item.getDeliveryType().equals(valuationRes.getDeliveryType())).findAny();
+                if (optional.isPresent()) {
+                    PackageDeliveryDetailDto packageDeliveryDetailDto = optional.get();
+                    billDuration = packageDeliveryDetailDto.getBillDuration();
+                }
+                valuationRes.setBillDuration(billDuration == 0 ? BillingConstant.DEFAULT_BILL_DURATION : billDuration);
+            }
+        } else {
+            billList = billList.stream().map(valuationRes -> valuationRes.setBillDuration(BillingConstant.DEFAULT_BILL_DURATION)).collect(Collectors.toList());
+        }
+        return billList;
+    }
+
+    private void setCommissionInfo(List<PackageCommissionDetailDto> packageCommissionDetailDtoList, ValuationRes valuationRes) {
+        BigDecimal commission = BigDecimal.ZERO;
+        if (valuationRes.getIsMine() == 1 || DeliveryTypeEnums.HUO_LA_LA.getType().equals(valuationRes.getDeliveryType())) {
+            valuationRes.setCommission(commission);
+            return;
+        }
+        if (CollectionUtils.isNotEmpty(packageCommissionDetailDtoList) && packageCommissionDetailDtoList.size() > 0) {
+            PackageCommissionDetailDto packageCommissionDetailDto = packageCommissionDetailDtoList.get(0);
+            if (PackageCommissionTypeEnum.RATE.type.equals(packageCommissionDetailDto.getCommissionType())) {
+                if (packageCommissionDetailDto.getValue() != null) {
+                    commission = packageCommissionDetailDto.getValue().multiply(valuationRes.getDeliveryAmount())
+                            .divide(new BigDecimal("100"), BigDecimal.ROUND_HALF_UP).setScale(6, BigDecimal.ROUND_HALF_UP);
+                }
+            } else if (PackageDiscountDetailTypeEnum.GRADIENT.type.equals(packageCommissionDetailDto.getCommissionType())) {
+                for (PackageCommissionDetailDto item : packageCommissionDetailDtoList) {
+                    boolean inRange = BigDecimalUtils.inRange(item.getLeftValue(), item.getRightValue(), valuationRes.getDeliveryAmount());
+                    if (inRange) {
+                        if (item.getValue() != null) {
+                            commission = item.getValue();
+                        }
+                        break;
+                    }
+                }
+            }
+        }
+        valuationRes.setCommission(commission);
+        valuationRes.setDeliveryAmount(commission.add(valuationRes.getDeliveryAmount()));
+    }
+
+    private void setDiscountInfo(List<PackageDiscountDetailDto> discountDetailDtoList, ValuationRes valuationRes) {
+        if (valuationRes.getIsMine() == 1) {
+            return;
+        }
+        if (CollectionUtils.isNotEmpty(discountDetailDtoList) && discountDetailDtoList.size() > 0) {
+            PackageDiscountDetailDto discountDetailDto = discountDetailDtoList.get(0);
+            if (PackageDiscountDetailTypeEnum.ZHE_KOU.type.equals(discountDetailDto.getType())) {
+                if (discountDetailDto.getValue() != null) {
+                    BigDecimal discountValue = discountDetailDto.getValue().multiply(valuationRes.getDeliveryAmount())
+                            .divide(BigDecimal.TEN, BigDecimal.ROUND_HALF_UP).setScale(6, BigDecimal.ROUND_HALF_UP);
+                    double abs = Math.abs(valuationRes.getDeliveryAmount().subtract(discountValue).doubleValue());
+                    if (discountDetailDto.getMaxValue() != null) {
+                        abs = Math.min(abs, discountDetailDto.getMaxValue().doubleValue());
+                    }
+                    // 判断是优惠还是提价
+                    boolean positiveNum = discountValue.subtract(valuationRes.getDeliveryAmount()).compareTo(BigDecimal.ZERO) >= 0;
+                    if (positiveNum) {
+                        valuationRes.setDeliveryAmount(valuationRes.getDeliveryAmount().add(new BigDecimal(abs)));
+                    } else {
+                        valuationRes.setDeliveryAmount(valuationRes.getDeliveryAmount().subtract(new BigDecimal(abs)));
+                    }
+                    valuationRes.setZk(discountDetailDto.getValue());
+                }
+            } else if (PackageDiscountDetailTypeEnum.GRADIENT.type.equals(discountDetailDto.getType())) {
+                for (PackageDiscountDetailDto item : discountDetailDtoList) {
+                    boolean inRange = BigDecimalUtils.inRange(item.getLeftValue(), item.getRightValue(), valuationRes.getDeliveryAmount());
+                    if (inRange) {
+                        if (item.getValue() != null) {
+                            valuationRes.setDeliveryAmount(valuationRes.getDeliveryAmount().subtract(item.getValue()));
+                            valuationRes.setMj(item.getValue());
+                        }
+                        break;
+                    }
+                }
+            }
+        }
+    }
+
+    private Long setWaimaiOrderInfo(OrderReq orderReq, String takeRemark, Long shopId) {
+        WaimaiOrder waimaiOrder = iWaimaiOrderService.findById(orderReq.getWaimaiOrderId());
+        if (waimaiOrder.getOrderType().equals(WaimaiOrderTypeEnum.MEI_TUAN.getType())) {
+            orderReq.setOrderSource("101");
+            orderReq.setOrderingSourceNo(waimaiOrder.getOutOrderId());
+            orderReq.setZbOrderingSourceNo(waimaiOrder.getOutOrderId());
+            // 查询美团跑腿的token
+            DspWaimai waiMai = iDspWaimaiService.findOne(WaimaiTypeEnums.MEI_TUAN.getType());
+            if (waiMai != null){
+                ShopWaimai shopWaimai = iShopWaimaiService.findById(shopId, waiMai.getId());
+                if (shopWaimai != null){
+                    orderReq.setZbToken(shopWaimai.getAuthToken());
+                }
+            }
+        } else if (waimaiOrder.getOrderType().equals(WaimaiOrderTypeEnum.E_LE_ME.getType())) {
+            orderReq.setOrderSource("102");
+        }else if (waimaiOrder.getOrderType().equals(WaimaiOrderTypeEnum.E_LE_ME_RETAIL.getType())) {
+            orderReq.setOrderSource("103");
+        }
+        orderReq.setTakeRemark(takeRemark);
+        orderReq.setWaiMaiRemark(waimaiOrder.getCaution());
+        orderReq.setMtMoney(waimaiOrder.getTotalPrice());
+        orderReq.setPoiSeq(waimaiOrder.getDaySeq());
+        orderReq.setWaimaiOrderDetails(iWaimaiOrderDetailService.findList(orderReq.getWaimaiOrderId()));
+        return waimaiOrder.getShopId();
+    }
+
+    private ValuationRes queryOrderDeliverFee(OrderReq orderReq, DeliveryInfo delivery, Long merchantId, Long shopId, Integer defaultShop) {
+        if (DeliveryTypeEnums.SHUN_FENG.getType().equals(delivery.getType()) && "0".equals(orderReq.getProduct().getSfProductType())) {
+            return null;
+        }
+        orderReq.setOrderSn(SnCodeUtils.createSn());
+        orderReq.setAmount(orderReq.getProductAmount());
+        OrderVo orderVo = OrderEntityUtils.createOrderVo(orderReq, delivery, deliveryConfig.isTest());
+        orderVo.setIsMine(delivery.getIsMine());
+        if (DeliveryTypeEnums.FENG_NIAO.getType().equals(delivery.getType()) || DeliveryTypeEnums.MEI_TUAN.getType().equals(delivery.getType())) {
+            ShopDelivery shopDelivery = iShopDeliveryService.findOne(shopId, delivery.getId());
+            if (shopDelivery == null || !shopDelivery.getBindStatus().equals(BindStatusEnum.BIND.status)) {
+                return null;
+            }
+        }
+        if ((DeliveryTypeEnums.FENG_NIAO.getType().equals(delivery.getType()) || DeliveryTypeEnums.MEI_TUAN.getType().equals(delivery.getType())) && DefaultShopEnum.SHOW.status.equals(defaultShop)) {
+            return null;
+        }
+        if (DeliveryTypeEnums.FENG_NIAO.getType().equals(delivery.getType()) && shopId == null) {
+            return null;
+        }
+        // 美团跑腿未绑定不参与计价
+        if (DeliveryTypeEnums.MEI_TUAN_ZB.getType().equals(delivery.getType()) && delivery.getIsMine() == 0){
+            return null;
+        }
+        if (DeliveryTypeEnums.MEI_TUAN_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() == 2155 && (DeliveryTypeEnums.DADA.getType().equals(delivery.getType()) || DeliveryTypeEnums.DADA_YZ.getType().equals(delivery.getType()))){
+            // 达达/优质余额不足,重新计价
+            log.info("余额不足----" + DeliveryTypeEnums.getNameByType(delivery.getType()) + "余额不足,重新计价");
+            orderVo.setMerchantId(null);
+            orderVo.setShopNo(delivery.getDadaThirdShopId());
+            delivery.setShopId(delivery.getDadaThirdShopId());
+            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())) {
+                QueryAmount queryAmount = QueryAmountEntityUtils.queryAmount(delivery, merchantId, delivery.getIsMine());
+                ResObject<AmountResultVo> amountRes = client.queryAmount(queryAmount);
+                if (amountRes.getCode() == 0) {
+                    // 更新余额
+                    AmountResultVo vo = amountRes.getData();
+                    ShopDelivery shopDelivery = iShopDeliveryService.getOne(new QueryWrapper<ShopDelivery>().eq("merchant_id", merchantId).eq("delivery_id", delivery.getId())
+                            .eq("deleted", IsDeleteEnum.NORMAL.status).isNull("shop_id").eq("bind_status", 1));
+                    if (shopDelivery != null) {
+                        shopDelivery.setBalance(vo.getBalanceAmount());
+                        iShopDeliveryService.updateById(shopDelivery);
+                    }
+                    if (vo.getBalanceAmount().compareTo(res.getDeliveryAmount()) >= 0) {
+                        res.setIsEnough(StatusEnum.SHOW.status);
+                        res.setIsMine(1);
+                    } else {
+                        //uupt需重新计价
+                        res.setIsMine(0);
+                        orderVo.setIsMine(0);
+                        if ("uupt".equals(orderVo.getLbClient())) {
+                            orderVo.setOpenId("");
+                            resObject = client.queryOrderDeliverFee(orderVo);
+                            transResObject(res, delivery, resObject, orderReq, orderVo);
+                        }
+
+                    }
+                }
+            } else if (delivery.getIsMine() == 1 && delivery.getType().equals(DeliveryTypeEnums.KUAI_FU.getType())) {
+                if (!resObject.getData().getFeStatus().equals("1")) {
+                    res.setIsMine(0);
+                    orderVo.setIsMine(0);
+                }
+            }
+            return res;
+        }
+        return null;
+    }
+
+    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.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());
+    }
+
+}

+ 27 - 3
lb-app/src/main/java/com/ydd/app/service/impl/ApiRiderLocationServiceImpl.java

@@ -175,20 +175,44 @@ public class ApiRiderLocationServiceImpl  implements ApiRiderLocationService {
                         dto.setEstimateArriveTimeStr(resObject1.getData().getEstimateArriveTimeStr());
                     }
                 }
+            } else if (DeliveryTypeEnums.MEI_TUAN_ZB.getType().equals(delivery.getType())) {
+                if (order.getDeliveryStatus() > DeliveryStatusEnum.ORDERS_TO_BE_RECEIVED.status) {
+                    RiderLocationVo orderQueryVo = new RiderLocationVo();
+                    orderQueryVo.setLbClient(DeliveryTypeEnums.MEI_TUAN_ZB.getName());
+                    // 美团订单号
+                    orderQueryVo.setOrderNo(orderDelivery.getOutTradeNo());
+                    // token
+                    orderQueryVo.setAccessToken(orderDelivery.getZbToken());
+                    ResObject<RiderLocationResultVo> resObject = client.getRiderLocation(orderQueryVo);
+                    if (resObject.getCode().intValue() == 0) {
+                        dto.setShipperLat(resObject.getData().getLat());
+                        dto.setShipperLng(resObject.getData().getLng());
+                    }
+                }
             }
             else if (DeliveryTypeEnums.SHAN_SONG.getType().equals(delivery.getType())&&orderDelivery!=null) {
                 OrderQueryVo orderQueryVo = new OrderQueryVo();
                 orderQueryVo.setLbClient(DeliveryTypeEnums.SHAN_SONG.getName());
                 orderQueryVo.setOrderNo(orderDelivery.getChildOrderSn());
                 orderQueryVo.setIssOrderNo(order.getOutTradeNo());
-                if(orderDelivery.getIsMine()==1){
+                if (orderDelivery.getIsMine() == 1){
                     orderQueryVo.setIsShansongSH(true);
+                    ShopDelivery shopDelivery = iShopDeliveryService.getOne(new QueryWrapper<ShopDelivery>().eq("merchant_id", order.getMerchantId()).eq("delivery_id", delivery.getId())
+                            .eq("deleted", IsDeleteEnum.NORMAL.status).isNull("shop_id").eq("bind_status",1));
+                    if (shopDelivery != null){
+                        orderQueryVo.setAccessToken(shopDelivery.getAuthToken());
+                    }
                 }
                 if (order.getDeliveryStatus() > DeliveryStatusEnum.ORDERS_TO_BE_RECEIVED.status) {
                     ResObject<OrderQueryResultVo> resObject = client.queryOrderInfo(orderQueryVo);
                     if (resObject.getCode().intValue() == 0) {
-                        dto.setShipperLat(resObject.getData().getRiderLat());
-                        dto.setShipperLng(resObject.getData().getRiderLng());
+                        if(resObject.getData().getRiderLat()!=null){
+                            double[] receiverGps = CoordinateUtils.bd09_To_Gcj02(resObject.getData().getRiderLat().doubleValue(), resObject.getData().getRiderLng().doubleValue());
+                            dto.setShipperLat(new BigDecimal(receiverGps[0] + ""));
+                            dto.setShipperLng(new BigDecimal(receiverGps[1] + ""));
+                        }
+//                        dto.setShipperLat(resObject.getData().getRiderLat());
+//                        dto.setShipperLng(resObject.getData().getRiderLng());
                         dto.setEstimateArriveTimeStr(resObject.getData().getEstimateArriveTimeStr());
                     }
                 }

+ 45 - 4
lb-app/src/main/java/com/ydd/app/service/impl/ApiShopDeviceServiceImpl.java

@@ -3,6 +3,7 @@ package com.ydd.app.service.impl;
 import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.ydd.api.PrintApi;
+import com.ydd.app.dto.AddUsbPrintReq;
 import com.ydd.app.service.ApiShopDeviceService;
 import com.ydd.module.domain.Device;
 import com.ydd.module.domain.Member;
@@ -13,18 +14,21 @@ import com.ydd.module.dto.ShopDeviceDto;
 import com.ydd.module.enums.DeviceStatusEnum;
 import com.ydd.module.enums.IsDeleteEnum;
 import com.ydd.module.enums.StatusEnum;
+import com.ydd.module.expection.CustomAppException;
 import com.ydd.module.service.IDeviceService;
 import com.ydd.module.service.IMemberService;
 import com.ydd.module.service.IShopDeviceService;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.collections4.CollectionUtils;
+import org.apache.commons.compress.utils.Lists;
 import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
 import java.util.List;
+import java.util.stream.Collectors;
 
 /**
  * Project:lb-server
@@ -108,15 +112,19 @@ public class ApiShopDeviceServiceImpl implements ApiShopDeviceService {
 
     }
 
+    @Transactional(rollbackFor = Exception.class)
     @Override
     public void delete(Long loginId, Integer id) {
         ShopDeviceDto deviceDto = iShopDeviceService.findDetail((long) id);
-        unifiedPrintService.deleteSn(deviceDto.getDeviceSn(),deviceDto.getDeviceType());
-//        iShopDeviceService.removeById(id);
+        iShopDeviceService.removeById(id);
         List<ShopDevice> shopDevices = iShopDeviceService.findByDeviceSn(deviceDto.getDeviceSn());
-        for (ShopDevice s : shopDevices){
-            iShopDeviceService.removeById(s.getId());
+        List<ShopDevice> otherShopDevice = shopDevices.stream().filter(item -> !deviceDto.getShopId().equals(item.getShopId())).collect(Collectors.toList());
+        if (CollectionUtils.isEmpty(otherShopDevice)) {
+            unifiedPrintService.deleteSn(deviceDto.getDeviceSn(),deviceDto.getDeviceType());
         }
+        /*for (ShopDevice s : shopDevices){
+            iShopDeviceService.removeById(s.getId());
+        }*/
     }
 
     @Override
@@ -133,4 +141,37 @@ public class ApiShopDeviceServiceImpl implements ApiShopDeviceService {
         return dto;
     }
 
+    @Override
+    public void addUsbPrint(Long loginId, AddUsbPrintReq req) {
+        if (req.getPrintMerchantCount() == 0 && req.getPrintCustomerCount() == 0 && req.getPrintKitchenCount() == 0){
+            throw new CustomAppException("请设置客户联、商家联、厨房联打印次数");
+        }
+        ShopDevice shopDevice = new ShopDevice();
+        if (req.getId() != null && req.getId() != 0) {
+            shopDevice = iShopDeviceService.getById(req.getId());
+            // 禁用后就直接删除
+            if (shopDevice.getStatus() == 0) {
+                shopDevice.setDeleted(1);
+            }
+        }
+        BeanUtils.copyProperties(req, shopDevice);
+        Member member = iMemberService.getById(loginId);
+        shopDevice.setShopId(member.getShopId());
+        shopDevice.setMerchantId(member.getMerchantId());
+        shopDevice.setDeviceType(99);
+        shopDevice.setDeviceSn("USB打印");
+        shopDevice.setDeviceId(0L);
+        boolean result = iShopDeviceService.saveOrUpdate(shopDevice);
+        if (!result) {
+            throw new CustomAppException("操作失败!");
+        }
+    }
+
+    @Override
+    public List<ShopDeviceDto> getUsbPrint(Long loginId) {
+        Member member = iMemberService.getById(loginId);
+        List<ShopDeviceDto> list = iShopDeviceService.findUsbPrintList(member.getShopId());
+        return CollectionUtils.isEmpty(list) ? Lists.newArrayList() : list;
+    }
+
 }

+ 4 - 7
lb-app/src/main/java/com/ydd/app/service/impl/ApiShopServiceImpl.java

@@ -11,7 +11,6 @@ import com.ydd.common.enums.DeliveryTypeEnums;
 import com.ydd.common.utils.SnCodeUtils;
 import com.ydd.common.utils.StringUtils;
 import com.ydd.ecloud.core.utils.JsonMapper;
-import com.ydd.framework.web.domain.server.Mem;
 import com.ydd.module.domain.*;
 import com.ydd.module.dto.DeliveryDto;
 import com.ydd.module.dto.ShopDto;
@@ -27,10 +26,8 @@ import com.ydd.third.common.vo.shop.ShopQueryResultVo;
 import com.ydd.third.common.vo.shop.ShopQueryVo;
 import com.ydd.third.common.vo.shop.ShopResultVo;
 import com.ydd.third.common.vo.shop.ShopVo;
-
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
-import org.apache.commons.collections4.CollectionUtils;
 import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
@@ -189,7 +186,7 @@ public class ApiShopServiceImpl implements ApiShopService {
             delivery.setMerchantId(shop.getMerchantId());
             delivery.setShopId(shop.getId());
             if ("shunfeng".equals(shopVo.getLbClient()) || "uupt".equals(shopVo.getLbClient()) ||
-                "kuanfu".equals(shopVo.getLbClient()) || "huolala".equals(shopVo.getLbClient())) {
+                "kuanfu".equals(shopVo.getLbClient()) || "huolala".equals(shopVo.getLbClient()) || "meituanzb".equals(shopVo.getLbClient())) {
                 delivery.setBindStatus(BindStatusEnum.BIND.getStatus());
             } else {
                 delivery.setBindStatus(BindStatusEnum.UNBIND.getStatus());
@@ -378,7 +375,7 @@ public class ApiShopServiceImpl implements ApiShopService {
                 shopReq.setCode(shop.getCode());
                 ShopVo shopVo = ShopEditUtils.editShopVo(shopReq, dspDelivery, merchant);
                 if ("shunfeng".equals(shopVo.getLbClient()) || "uupt".equals(shopVo.getLbClient()) ||
-                    "kuanfu".equals(shopVo.getLbClient()) || "huolala".equals(shopVo.getLbClient())) {
+                    "kuanfu".equals(shopVo.getLbClient()) || "huolala".equals(shopVo.getLbClient()) || "meituanzb".equals(shopVo.getLbClient())) {
                     delivery.setBindStatus(BindStatusEnum.BIND.getStatus());
                 }
                 ResObject<ShopResultVo> res = deliveryClient.updateShop(shopVo);
@@ -407,7 +404,7 @@ public class ApiShopServiceImpl implements ApiShopService {
                 ResObject<ShopResultVo> res = deliveryClient.createShop(shopVo);
                 delivery.setBindStatus(BindStatusEnum.UNBIND.getStatus());
                 if ("shunfeng".equals(shopVo.getLbClient()) || "uupt".equals(shopVo.getLbClient()) ||
-                    "kuanfu".equals(shopVo.getLbClient()) || "huolala".equals(shopVo.getLbClient())) {
+                    "kuanfu".equals(shopVo.getLbClient()) || "huolala".equals(shopVo.getLbClient())  || "meituanzb".equals(shopVo.getLbClient())) {
                     delivery.setBindStatus(BindStatusEnum.BIND.getStatus());
                 }
                 if (res.getCode() == 0) {//操作成功
@@ -556,7 +553,7 @@ public class ApiShopServiceImpl implements ApiShopService {
             }
             iShopDeliveryService.updateById(delivery);
         }
-        ShopThird shopThird =  shopThird = new ShopThird();
+        ShopThird shopThird = new ShopThird();
         shopThird.setShopId(shopReq.getId());
         shopThird.setAddress(shopReq.getAddress());
         shopThird.setContactName(shopReq.getContactName());

+ 1 - 1
lb-app/src/test/java/com/ydd/app/Test.java

@@ -54,7 +54,7 @@ public class Test {
 //        System.out.println(JSONObject.toJSONString(res));
        // elemeAuthClient.doRefreshToken("c54df9d9bcc3d605417111aea02f2e48");
 
-        apiWaimaiPrintService.printTestWaimai("50005126", 1358L);
+        apiWaimaiPrintService.printTestWaimai("50005126", 1358L, "");
     }
 
 }

+ 25 - 0
lb-common/src/main/java/com/ydd/common/constant/BillingConstant.java

@@ -0,0 +1,25 @@
+package com.ydd.common.constant;
+
+/**
+ * 发单常量
+ * @author 叶君翔
+ * @date 2021/11/16 19:35
+ */
+public interface BillingConstant {
+
+    /**
+     * 运力默认发单时长 25秒
+     */
+    int DEFAULT_BILL_DURATION = 25;
+
+    /**
+     * 默认发单排序
+     */
+    int DEFAULT_BILL_SORT = 99;
+
+    /**
+     * 距离小于300米为门店发单
+     */
+    int SHOP_BILLING_DISTANCE = 300;
+
+}

+ 26 - 0
lb-core/src/main/java/com/ydd/ecloud/core/utils/BigDecimalUtils.java

@@ -1,5 +1,7 @@
 package com.ydd.ecloud.core.utils;
 import java.math.BigDecimal;
+import java.util.Objects;
+
 /**
  * 重写BigDecimal的求和方法,避免BigDecimal对象为null的时,报空指针的情况
  */
@@ -18,4 +20,28 @@ public class BigDecimalUtils {
         }
         return result;
     }
+
+    /**
+     * 判断某个值是否在某个范围内
+     * @param leftValue 左边值(可为空)
+     * @param rightValue 右边值(可为空)
+     * @param value 目标值
+     * @return true-在范围内   false-不在范围内
+     */
+    public static boolean inRange(BigDecimal leftValue, BigDecimal rightValue, BigDecimal value) {
+        if (Objects.isNull(value)) {
+            return false;
+        }
+        if (Objects.isNull(leftValue) && Objects.nonNull(rightValue)) {
+            return value.compareTo(rightValue) <= 0;
+        }
+        if (Objects.nonNull(leftValue) && Objects.nonNull(rightValue)) {
+            return value.compareTo(leftValue) > 0 && value.compareTo(rightValue) <= 0;
+        }
+        if (Objects.nonNull(leftValue)) {
+            return value.compareTo(leftValue) > 0;
+        }
+        return false;
+    }
+
 }

+ 17 - 0
lb-module/src/main/java/com/ydd/module/dto/PackageDeliveryDetailDto.java

@@ -1,5 +1,6 @@
 package com.ydd.module.dto;
 
+import com.fasterxml.jackson.annotation.JsonIgnore;
 import lombok.Data;
 import lombok.NoArgsConstructor;
 
@@ -23,8 +24,24 @@ public class PackageDeliveryDetailDto implements Serializable {
     private Integer deliveryType;
 
     /**
+     * 运力名称
+     */
+    private String deliveryName;
+
+    /**
      * 运力排序
      */
     private Integer sort;
 
+    /**
+     * 发单时长
+     */
+    @JsonIgnore
+    private int billDuration;
+
+    /**
+     * 是否被勾选
+     */
+    private Boolean check;
+
 }

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

@@ -16,10 +16,11 @@ public interface IPackageCityConfigService extends IService<PackageCityConfig> {
     /**
      * 查询满足条件的包
      * @param shopId 门店id
+     * @param agentId 代理商id
      * @param cityCode 城市code
      * @param packageType 包类型
      * @return 包id
      */
-    Long getPackageId(Long shopId, String cityCode, Integer packageType);
+    Long getPackageId(Long shopId, Long agentId, String cityCode, Integer packageType);
 
 }

+ 4 - 9
lb-module/src/main/java/com/ydd/module/service/impl/PackageCityConfigServiceImpl.java

@@ -44,7 +44,7 @@ public class PackageCityConfigServiceImpl extends ServiceImpl<PackageCityConfigM
     }
 
     @Override
-    public Long getPackageId(Long shopId, String cityCode, Integer packageType) {
+    public Long getPackageId(Long shopId, Long agentId, String cityCode, Integer packageType) {
         boolean deliveryPackage = PackageCityConfigPackageTypeEnum.DELIVERY.type.equals(packageType);
         boolean discountPackage = PackageCityConfigPackageTypeEnum.DISCOUNT.type.equals(packageType);
         boolean commissionPackage = PackageCityConfigPackageTypeEnum.COMMISSION.type.equals(packageType);
@@ -71,14 +71,9 @@ public class PackageCityConfigServiceImpl extends ServiceImpl<PackageCityConfigM
             }
             // 优惠包、佣金包  查代理商配置
             if (discountPackage || commissionPackage) {
-                if (Objects.nonNull(shop)) {
-                    Merchant merchant = iMerchantService.getById(shop.getMerchantId());
-                    if (Objects.nonNull(merchant)) {
-                        Agent agent = iAgentService.getById(merchant.getAgentId());
-                        if (Objects.nonNull(agent)) {
-                            packageId = discountPackage ? agent.getPackageDiscountId() : agent.getPackageCommissionId();
-                        }
-                    }
+                Agent agent = iAgentService.getById(agentId);
+                if (Objects.nonNull(agent)) {
+                    packageId = discountPackage ? agent.getPackageDiscountId() : agent.getPackageCommissionId();
                 }
             }
         }

+ 35 - 0
lb-third/lb-third-common/src/main/java/com/ydd/third/common/utils/CoordinateUtils.java

@@ -139,5 +139,40 @@ public class CoordinateUtils {
         return Double.valueOf(result);
     }
 
+    /**
+     * 地球半径,单位 km
+     */
+    private static final double EARTH_RADIUS = 6378.137;
+
+    /**
+     * 根据经纬度,计算两点间的距离
+     *
+     * @param longitude1 第一个点的经度
+     * @param latitude1  第一个点的纬度
+     * @param longitude2 第二个点的经度
+     * @param latitude2  第二个点的纬度
+     * @return 返回距离 单位米
+     */
+    public static double getDistance(double longitude1, double latitude1, double longitude2, double latitude2) {
+        // 纬度
+        double lat1 = Math.toRadians(latitude1);
+        double lat2 = Math.toRadians(latitude2);
+        // 经度
+        double lng1 = Math.toRadians(longitude1);
+        double lng2 = Math.toRadians(longitude2);
+        // 纬度之差
+        double a = lat1 - lat2;
+        // 经度之差
+        double b = lng1 - lng2;
+        // 计算两点距离的公式
+        double s = 2 * Math.asin(Math.sqrt(Math.pow(Math.sin(a / 2), 2) +
+                Math.cos(lat1) * Math.cos(lat2) * Math.pow(Math.sin(b / 2), 2)));
+        // 弧长乘地球半径, 返回单位: 千米
+        s = s * EARTH_RADIUS;
+        s = Math.round(s * 100d) / 100d;
+        s = s * 1000;
+        return s;
+    }
+
 }