Quellcode durchsuchen

Merge remote-tracking branch 'origin/master'

zangbin vor 3 Jahren
Ursprung
Commit
0c99636a50
53 geänderte Dateien mit 2136 neuen und 150 gelöschten Zeilen
  1. 43 0
      lb-app/src/main/java/com/ydd/app/OrderEntityUtils.java
  2. 1 1
      lb-app/src/main/java/com/ydd/app/ShopEditUtils.java
  3. 12 1
      lb-app/src/main/java/com/ydd/app/ShopEntityUtils.java
  4. 77 0
      lb-app/src/main/java/com/ydd/app/callback/controller/MaKePtDeliveryCallback.java
  5. 44 0
      lb-app/src/main/java/com/ydd/app/controller/MaKePtApi.java
  6. 8 2
      lb-app/src/main/java/com/ydd/app/dto/MemberDetailReq.java
  7. 6 0
      lb-app/src/main/java/com/ydd/app/dto/OrderReq.java
  8. 5 0
      lb-app/src/main/java/com/ydd/app/dto/ValuationRes.java
  9. 33 22
      lb-app/src/main/java/com/ydd/app/listener/DeliveryOrderListener.java
  10. 14 0
      lb-app/src/main/java/com/ydd/app/listener/DoCreateOrder.java
  11. 6 0
      lb-app/src/main/java/com/ydd/app/listener/GuaranteeListener.java
  12. 12 0
      lb-app/src/main/java/com/ydd/app/service/ApiOrderAgainService.java
  13. 4 0
      lb-app/src/main/java/com/ydd/app/service/ApiShopService.java
  14. 84 0
      lb-app/src/main/java/com/ydd/app/service/impl/ApiCallBackMaKePt.java
  15. 178 0
      lb-app/src/main/java/com/ydd/app/service/impl/ApiCreateShopMaKePt.java
  16. 1 0
      lb-app/src/main/java/com/ydd/app/service/impl/ApiDevelopServiceImpl.java
  17. 81 0
      lb-app/src/main/java/com/ydd/app/service/impl/ApiOrderAgainServiceImpl.java
  18. 24 6
      lb-app/src/main/java/com/ydd/app/service/impl/ApiOrderBackServiceImpl.java
  19. 22 6
      lb-app/src/main/java/com/ydd/app/service/impl/ApiOrderCancelServiceImpl.java
  20. 38 7
      lb-app/src/main/java/com/ydd/app/service/impl/ApiOrderNewServiceImpl.java
  21. 11 1
      lb-app/src/main/java/com/ydd/app/service/impl/ApiOrderServiceImpl.java
  22. 28 2
      lb-app/src/main/java/com/ydd/app/service/impl/ApiOrderValuationServiceImpl.java
  23. 25 4
      lb-app/src/main/java/com/ydd/app/service/impl/ApiRiderLocationServiceImpl.java
  24. 1 1
      lb-app/src/main/java/com/ydd/app/service/impl/ApiShopDeviceServiceImpl.java
  25. 51 0
      lb-app/src/main/java/com/ydd/app/service/impl/ApiShopServiceImpl.java
  26. 76 69
      lb-app/src/test/java/com/ydd/app/Test.java
  27. 5 5
      lb-common/src/main/java/com/ydd/common/core/domain/ResponseResult.java
  28. 1 1
      lb-common/src/main/java/com/ydd/common/core/domain/Result.java
  29. 2 0
      lb-common/src/main/java/com/ydd/common/enums/DeliveryTypeEnums.java
  30. 7 0
      lb-module/src/main/java/com/ydd/module/CancelOrderUtils.java
  31. 8 6
      lb-module/src/main/java/com/ydd/module/domain/MemberConfig.java
  32. 5 6
      lb-module/src/main/java/com/ydd/module/domain/WaimaiOrderRecord.java
  33. 5 0
      lb-module/src/main/java/com/ydd/module/dto/CancelOrderDto.java
  34. 7 0
      lb-module/src/main/java/com/ydd/module/dto/MemberDetailDto.java
  35. 2 1
      lb-module/src/main/java/com/ydd/module/service/IWaimaiOrderRecordService.java
  36. 4 2
      lb-module/src/main/java/com/ydd/module/service/impl/ShopDeliveryBindServiceImpl.java
  37. 29 0
      lb-third/lb-third-common/src/main/java/com/ydd/third/common/dto/MaKePtProductVo.java
  38. 34 0
      lb-third/lb-third-common/src/main/java/com/ydd/third/common/vo/callback/MaKePtCallbackOrderVo.java
  39. 11 0
      lb-third/lb-third-common/src/main/java/com/ydd/third/common/vo/shop/ShopVo.java
  40. 5 0
      lb-third/lb-third-common/src/main/java/com/ydd/third/common/vo/vo/order/CancelOrderVo.java
  41. 5 0
      lb-third/lb-third-common/src/main/java/com/ydd/third/common/vo/vo/order/OrderQueryVo.java
  42. 6 0
      lb-third/lb-third-common/src/main/java/com/ydd/third/common/vo/vo/order/OrderVo.java
  43. 23 7
      lb-third/lb-third-delivery/src/main/java/com/ydd/third/delivery/Client.java
  44. 35 0
      lb-third/lb-third-delivery/src/main/java/com/ydd/third/delivery/makept/MaKePtCallback.java
  45. 689 0
      lb-third/lb-third-delivery/src/main/java/com/ydd/third/delivery/makept/MaKePtClient.java
  46. 45 0
      lb-third/lb-third-delivery/src/main/java/com/ydd/third/delivery/makept/constant/MaKePtConstant.java
  47. 35 0
      lb-third/lb-third-delivery/src/main/java/com/ydd/third/delivery/makept/request/QueryOrderFeeRequest.java
  48. 23 0
      lb-third/lb-third-delivery/src/main/java/com/ydd/third/delivery/makept/request/QueryOrderStatusRequest.java
  49. 15 0
      lb-third/lb-third-delivery/src/main/java/com/ydd/third/delivery/makept/request/QueryRiderLocationRequest.java
  50. 97 0
      lb-third/lb-third-delivery/src/main/java/com/ydd/third/delivery/makept/request/SyncOrderRequest.java
  51. 23 0
      lb-third/lb-third-delivery/src/main/java/com/ydd/third/delivery/makept/request/SyncOrderStatusRequest.java
  52. 33 0
      lb-third/lb-third-delivery/src/main/java/com/ydd/third/delivery/makept/request/SyncStoreRequest.java
  53. 97 0
      lb-third/lb-third-delivery/src/main/java/com/ydd/third/delivery/makept/util/HttpClient.java

+ 43 - 0
lb-app/src/main/java/com/ydd/app/OrderEntityUtils.java

@@ -1,6 +1,7 @@
 package com.ydd.app;
 
 import com.fasterxml.jackson.core.type.TypeReference;
+import com.google.common.collect.Lists;
 import com.ydd.app.dto.AddressReq;
 import com.ydd.app.dto.OrderReq;
 import com.ydd.common.enums.DeliveryTypeEnums;
@@ -10,6 +11,7 @@ import com.ydd.ecloud.core.utils.JsonMapper;
 import com.ydd.module.domain.WaimaiOrderDetail;
 import com.ydd.module.dto.DeliveryInfo;
 import com.ydd.module.dto.SfShopDto;
+import com.ydd.third.common.dto.MaKePtProductVo;
 import com.ydd.third.common.vo.dada.config.DadaConstant;
 import com.ydd.third.common.vo.dada.domain.order.GoodsInfo;
 import com.ydd.third.common.vo.vo.order.OrderVo;
@@ -156,6 +158,7 @@ public class OrderEntityUtils {
         List<ProductVo> fnGoods = new ArrayList<>();
         List<OpenApiGood> mtGoods = new ArrayList<>();
         List<GoodsInfo> dadaGoodsList = new ArrayList<>();
+        List<MaKePtProductVo> maKePtProductVos = Lists.newArrayList();
         for (WaimaiOrderDetail d : details){
             StringBuilder spec = new StringBuilder();
             if(StringUtils.isNotBlank(d.getFoodProperty())){
@@ -169,15 +172,18 @@ public class OrderEntityUtils {
             OpenApiGood good = new OpenApiGood();
             ProductVo dto = new ProductVo();
             GoodsInfo dadaGoods = new GoodsInfo();
+            MaKePtProductVo ptProductVo = new MaKePtProductVo();
             good.setGoodCount(d.getQuantity().intValue());
             good.setGoodName(d.getFoodName());
             good.setGoodPrice(d.getPrice());
             dto.setProductName(d.getFoodName());
             dadaGoods.setSku_name(d.getFoodName());
+            ptProductVo.setName(d.getFoodName());
             if(StringUtils.isNotBlank(spec.toString())){
                 good.setGoodName(d.getFoodName()+"("+spec.toString()+")");
                 dto.setProductName(d.getFoodName()+"("+spec.toString()+")");
                 dadaGoods.setSku_name(d.getFoodName()+"("+spec.toString()+")");
+                ptProductVo.setName(d.getFoodName()+"("+spec.toString()+")");
             }
             mtGoods.add(good);
             dto.setProductNum(d.getQuantity().intValue());
@@ -187,6 +193,9 @@ public class OrderEntityUtils {
             dadaGoods.setSrc_product_no(d.getId().toString());
             dadaGoods.setCount(d.getQuantity().doubleValue());
             dadaGoodsList.add(dadaGoods);
+            ptProductVo.setNum(d.getQuantity().toString());
+            ptProductVo.setPrice(d.getPrice().toString());
+            maKePtProductVos.add(ptProductVo);
         }
 
         // 使用的运力平台是自己的平台还是我们的平台
@@ -1402,6 +1411,40 @@ public class OrderEntityUtils {
              */
             orderVo.setGoodsNum(1);
 
+        } else if (DeliveryTypeEnums.MA_KE_PT.getType().equals(delivery.getType())) {
+            orderVo.setLbClient(DeliveryTypeEnums.MA_KE_PT.getName());
+            /**
+             * 门店id
+             * 对应的猎豹平台门店编号
+             */
+            orderVo.setShopNo(orderReq.getLbShopCode());
+            orderVo.setMaKePtProducts(maKePtProductVos);
+
+            /**
+             * 码科跑腿
+             * 商户订单来源(1:美团 ,2:饿了么, 3:饿百零售, 4:手工单,5:有赞,6:京东,7:抖音)
+             */
+            if (StringUtils.isNotBlank(orderReq.getOrderSource())){
+                // 美团/美团闪购
+                if (orderReq.getOrderSource().equals("101")){
+                    orderVo.setOrderSource("1");
+                }else if (orderReq.getOrderSource().equals("102")){
+                    // 饿了么
+                    orderVo.setOrderSource("2");
+                }else if (orderReq.getOrderSource().equals("103")){
+                    // 饿百零售
+                    orderVo.setOrderSource("3");
+                }else if (orderReq.getOrderSource().equals("104")){
+                    // 京东到家
+                    orderVo.setOrderSource("6");
+                }
+                orderVo.setPoiSeq(orderReq.getPoiSeq());
+            } else {
+                // 手工单
+                orderVo.setOrderSource("4");
+                orderVo.setPoiSeq(orderReq.getDaySeq());
+            }
+            orderVo.setOrderNo(orderReq.getOrderSn());
         }
         return orderVo;
     }

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

@@ -416,7 +416,7 @@ public class ShopEditUtils {
              * 配送服务代码,详情见合同 1)服务包 飞速达:4002 快速达:4011 及时达:4012 集中送:4013 跑腿B帮送:4031 例如:4011,4012(多个英文逗号隔开) 2)新服务产品 具体可参考新服务产品列表。(多个英文逗号隔开)
              * 默认光速达 光速达-45-> 100001,光速达-40->100000,光速达-50->100002,光速达-55->100003
              */
-            shopVo.setDeliveryServiceCodes("100004"); // 等确认后再改
+            shopVo.setDeliveryServiceCodes("100005"); // 等确认后再改
 
             /**
              * 营业时间

+ 12 - 1
lb-app/src/main/java/com/ydd/app/ShopEntityUtils.java

@@ -389,7 +389,7 @@ public class ShopEntityUtils {
              * 配送服务代码,详情见合同 1)服务包 飞速达:4002 快速达:4011 及时达:4012 集中送:4013 跑腿B帮送:4031 例如:4011,4012(多个英文逗号隔开) 2)新服务产品 具体可参考新服务产品列表。(多个英文逗号隔开)
              * 默认光速达 光速达-45-> 100001,光速达-40->100000,光速达-50->100002,光速达-55->100003
              */
-            shopVo.setDeliveryServiceCodes("100004");// 等确认后再改
+            shopVo.setDeliveryServiceCodes("100005");// 等确认后再改
 
             /**
              * 营业时间
@@ -510,6 +510,17 @@ public class ShopEntityUtils {
              */
             shopVo.setFoodLicensePicHash("https://ecloud-cdn.51sssd.com/20210604/364b8355956740a281f676221d1a7a9b.jpg");
 
+        } else if (DeliveryTypeEnums.MA_KE_PT.getType().equals(delivery.getType())) {
+            shopVo.setLbClient(DeliveryTypeEnums.MA_KE_PT.getName());
+            shopVo.setShopName(shop.getName());
+            shopVo.setProvinceName(shop.getProvinceName());
+            shopVo.setCityName(shop.getCityName());
+            shopVo.setAreaName(shop.getDistrictName());
+            shopVo.setLbShopCode(shop.getCode());
+            shopVo.setShopAddress(poiAddress + shop.getAddress() + shop.getStreet());
+            shopVo.setShopLng(new BigDecimal(shop.getLng()));
+            shopVo.setShopLat(new BigDecimal(shop.getLat()));
+            shopVo.setContactPhone(shop.getMobile());
         }
         return shopVo;
     }

+ 77 - 0
lb-app/src/main/java/com/ydd/app/callback/controller/MaKePtDeliveryCallback.java

@@ -0,0 +1,77 @@
+package com.ydd.app.callback.controller;
+
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.ydd.api.DeliveryCallbackApi;
+import com.ydd.app.service.ApiOrderBackService;
+import com.ydd.app.service.impl.ApiCallBackContent;
+import com.ydd.app.service.impl.ApiCallBackMaKePt;
+import com.ydd.common.enums.DeliveryTypeEnums;
+import com.ydd.module.domain.OrderDelivery;
+import com.ydd.module.dto.CallBackOrderDto;
+import com.ydd.module.service.IOrderDeliveryService;
+import com.ydd.third.common.vo.ResObject;
+import com.ydd.third.common.vo.callback.CallBackOrderVo;
+import com.ydd.third.common.vo.callback.MaKePtCallbackOrderVo;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.annotation.Resource;
+
+/**
+ * 码科跑腿回调
+ * @author 叶君翔
+ * @date 2022/05/06 10:37
+ */
+
+@Slf4j
+@RestController
+@RequestMapping("/app/delivery/maKePt/callback")
+public class MaKePtDeliveryCallback {
+
+    @Autowired
+    private DeliveryCallbackApi callback;
+
+    @Resource
+    private ApiOrderBackService apiOrderService;
+
+    @Resource
+    private IOrderDeliveryService iOrderDeliveryService;
+
+    @PostMapping("/doOrder")
+    public String orderStatus(@RequestBody JSONObject jsonParam){
+        JSONObject res = new JSONObject();
+        if (null == jsonParam) {
+            res.put("status", "0");
+            res.put("msg", "回调参数为空");
+            return res.toJSONString();
+        }
+        log.info("码科跑腿回调参数: {}", jsonParam);
+        CallBackOrderVo vo = new CallBackOrderVo();
+        vo.setLbClient(DeliveryTypeEnums.MA_KE_PT.getName());
+        vo.setParams(jsonParam);
+        Object result = callback.doOrder(vo);
+        ObjectMapper objectMapper = new ObjectMapper();
+        ResObject callbackRes = objectMapper.convertValue(result, ResObject.class);
+        if (callbackRes.getCode() == 0) {
+            MaKePtCallbackOrderVo orderVo = objectMapper.convertValue(callbackRes.getData(), MaKePtCallbackOrderVo.class);
+            ApiCallBackContent content = new ApiCallBackContent(new ApiCallBackMaKePt(orderVo));
+            OrderDelivery orderDelivery = iOrderDeliveryService.getOne(new QueryWrapper<OrderDelivery>().eq("child_order_sn",orderVo.getOrderNo()));
+            CallBackOrderDto dto = content.createCallBack();
+            dto.setParentOrderSn(orderDelivery.getOrderSn());
+            apiOrderService.callBackOrder(dto);
+            res.put("code", "200");
+            res.put("msg", "SUCCESS");
+        } else {
+            res.put("code", "0");
+            res.put("msg", callbackRes.getMsg());
+        }
+        return res.toJSONString();
+    }
+
+}

+ 44 - 0
lb-app/src/main/java/com/ydd/app/controller/MaKePtApi.java

@@ -0,0 +1,44 @@
+package com.ydd.app.controller;
+
+import com.ydd.app.dto.ShopReq;
+import com.ydd.app.service.ApiShopService;
+import com.ydd.common.annotation.AccessToken;
+import com.ydd.common.annotation.ControllerLog;
+import com.ydd.common.core.controller.BaseController;
+import com.ydd.common.core.domain.BaseResult;
+import io.swagger.annotations.ApiOperation;
+import lombok.RequiredArgsConstructor;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+/**
+ * 码科跑腿
+ * @author 叶君翔
+ * @date 2022/05/10 13:46
+ */
+@RestController
+@RequestMapping("/app/makept/")
+@RequiredArgsConstructor(onConstructor_ = @Autowired)
+public class MaKePtApi extends BaseController {
+
+    private final ApiShopService apiShopService;
+
+    @ApiOperation("同步门店")
+    @RequestMapping(value = "/syncShop", method = RequestMethod.POST)
+    @AccessToken
+    @ControllerLog(value = "码科跑腿-同步门店")
+    public BaseResult syncShop(@RequestBody ShopReq shop) {
+        apiShopService.syncMaKePtShop(getLoginId(), shop);
+        return BaseResult.success();
+    }
+
+    @ApiOperation("绑定自运力")
+    @RequestMapping(value = "/bind", method = RequestMethod.POST)
+    @AccessToken
+    @ControllerLog(value = "码科跑腿-绑定自运力")
+    public BaseResult bind(@RequestParam("shopId") Long shopId, @RequestParam("deliveryId") Long deliveryId) {
+        apiShopService.bindMakePtDelivery(shopId, deliveryId);
+        return BaseResult.success();
+    }
+
+}

+ 8 - 2
lb-app/src/main/java/com/ydd/app/dto/MemberDetailReq.java

@@ -1,9 +1,7 @@
 package com.ydd.app.dto;
 
-import com.ydd.module.domain.Member;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
-import lombok.EqualsAndHashCode;
 import lombok.NoArgsConstructor;
 import lombok.experimental.Accessors;
 
@@ -88,6 +86,7 @@ public class MemberDetailReq implements Serializable {
 
     @ApiModelProperty(value = "开启显示商品图片: 1->显示,0->不显示")
     private Integer showFoodImg;
+    
 
     @ApiModelProperty(value = "开启wifi自动下载安装包: 1->是,0->否")
     private Integer wifiUpgrade;
@@ -106,5 +105,12 @@ public class MemberDetailReq implements Serializable {
      * 同步打印客户联商品价格
      */
     private Integer customerLinkPrintGoodsPrice;
+    @ApiModelProperty(value = "取消在发起配送开关 0 关闭 1开启")
+    private Integer againOrder;
+
+    @ApiModelProperty(value = "省钱模式开关0 关闭 1开启")
+    private Integer littleMoney;
+    @ApiModelProperty(value = "省钱模式 间隔时间,逗号隔开")
+    private String littleMoneyTime;
 
 }

+ 6 - 0
lb-app/src/main/java/com/ydd/app/dto/OrderReq.java

@@ -124,6 +124,12 @@ public class OrderReq implements Serializable {
     @ApiModelProperty(value = "选择门店地址时,需要传入(门店Id)")
     private Long shopId;
 
+    /**
+     * 门店(商家)code
+     */
+    @ApiModelProperty(value = "门店(商家)code")
+    private String lbShopCode;
+
     private String orderNo;
 
     /**

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

@@ -169,6 +169,11 @@ public class ValuationRes implements Serializable, Comparable<ValuationRes> {
     private Integer billDuration;
 
     /**
+     * 猎豹门店编号, 码科跑腿计价需传
+     */
+    private String lbShopCode;
+
+    /**
      * 重写比较大小的方法,
      * 实现: 先按照sort排序正序,再按照deliveryAmount正序
      */

+ 33 - 22
lb-app/src/main/java/com/ydd/app/listener/DeliveryOrderListener.java

@@ -69,6 +69,7 @@ public class DeliveryOrderListener {
     private final ApiCouponService apiCouponService;
     private final IDspWaimaiService iDspWaimaiService;
     private final IWaimaiOrderService iWaimaiOrderService;
+    private final IWaimaiOrderRecordService iWaimaiOrderRecordService;
 
     @EventListener(DeliveryOrderEvent.class)
     @Async
@@ -79,7 +80,7 @@ public class DeliveryOrderListener {
         //触发保底配送
         OrderReq req = new OrderReq();
         //封装
-        req = doCreateOrder.transOrderReq(order,req);
+        req = doCreateOrder.transOrderReq(order, req);
         BigDecimal tipAmount = order.getTipAmount() == null ? BigDecimal.ZERO : order.getTipAmount();
         Lock lock = new ReentrantLock();
         //封装
@@ -89,10 +90,10 @@ public class DeliveryOrderListener {
 //            return;
 //        }
         int count = iOrderDeliveryService.count(new QueryWrapper<OrderDelivery>().eq("order_sn", order.getOrderSn()));
-        if(count != 0){
+        if (count != 0) {
             return;
         }
-        doCreateOrder.addOrderDelivery(list,order,tipAmount);
+        doCreateOrder.addOrderDelivery(list, order, tipAmount);
 
 /*
         list.sort((o1, o2) -> {
@@ -100,7 +101,7 @@ public class DeliveryOrderListener {
             return i.intValue();
         });
 */
-        if(order.getTipAmount()!=null&&order.getTipAmount().compareTo(BigDecimal.ZERO)>0){
+        if (order.getTipAmount() != null && order.getTipAmount().compareTo(BigDecimal.ZERO) > 0) {
             OrderTip orderTip = new OrderTip();
             orderTip.setChildOrderNo(order.getOrderSn());
             orderTip.setAmount(order.getTipAmount());
@@ -115,10 +116,10 @@ public class DeliveryOrderListener {
             log.info("订单ID" + order.getOrderSn() + "开始进行配送");
             try {
                 //判断该订单是否被接单
-               // lock.lock();
+                // lock.lock();
                 log.info("订单ID" + order.getId() + "配送平台ID" + res.getDeliveryId() + "得到了锁");
 
-                doCreateOrder.doCreateOrder(order,res,req,tipAmount,couponDto);
+                doCreateOrder.doCreateOrder(order, res, req, tipAmount, couponDto);
 
                 int billDuration = (res.getBillDuration() == null || res.getBillDuration() == 0) ? BillingConstant.DEFAULT_BILL_DURATION : res.getBillDuration();
                 TimeUnit.SECONDS.sleep(billDuration);
@@ -136,21 +137,21 @@ public class DeliveryOrderListener {
                 .eq("order_sn", order.getOrderSn())
                 .isNotNull("out_trade_no")
                 .ne("out_trade_no", -1));
-        if (countOrderDelivery == 0){
+        if (countOrderDelivery == 0) {
             Order nowOrder = iOrderService.getById(order.getId());
-            if (nowOrder.getWaimaiOrderId() != null){
+            if (nowOrder.getWaimaiOrderId() != null) {
                 nowOrder.setDeliveryStatus(DeliveryStatusEnum.ABNORMAL.status);
-            }else {
+            } else {
                 nowOrder.setDeliveryStatus(DeliveryStatusEnum.CANCEL.status);
             }
             iOrderService.updateById(nowOrder);
             iOrderLogService.addOrderLog(nowOrder.getId(), OrderStatusEnum.CANCEL.status);
             // 非自己运力下单支付,退款
-            if (!nowOrder.getPaymentType().equals(PaymentTypeEnum.LOCAL.type)&&nowOrder.getRefundMoney().compareTo(BigDecimal.ZERO) == 0){
+            if (!nowOrder.getPaymentType().equals(PaymentTypeEnum.LOCAL.type) && nowOrder.getRefundMoney().compareTo(BigDecimal.ZERO) == 0) {
                 nowOrder.setRefundMoney(nowOrder.getPayAmount());
-                apiOrderNewService.refund(order.getOrderSn(),nowOrder.getPayAmount(),"运力平台下单失败,退还金额",nowOrder.getMemberId(),nowOrder.getMerchantId());
+                apiOrderNewService.refund(order.getOrderSn(), nowOrder.getPayAmount(), "运力平台下单失败,退还金额", nowOrder.getMemberId(), nowOrder.getMerchantId());
                 if (order.getCouponId() != null) {
-                  //   couponDto = apiCouponService.findDetailBack(nowOrder.getCouponId().intValue());
+                    //   couponDto = apiCouponService.findDetailBack(nowOrder.getCouponId().intValue());
                     log.info("订单取消退优惠券详情:" + JSONObject.toJSONString(couponDto));
                     couponDto = new CouponDto();
                     couponDto.setId(nowOrder.getCouponId().intValue());
@@ -161,12 +162,12 @@ public class DeliveryOrderListener {
                 }
             }
             iOrderService.updateById(nowOrder);
-        }else{
-            if(order.getWaimaiOrderId()!=null&&order.getShopId()!=null){
+        } else {
+            if (order.getWaimaiOrderId() != null && order.getShopId() != null) {
                 WaimaiOrder waimaiOrder = iWaimaiOrderService.getById(order.getWaimaiOrderId());
                 DspWaimai waimai = iDspWaimaiService.getById(waimaiOrder.getWaimaiId());
                 OrderDetailDto dto = new OrderDetailDto();
-                BeanUtils.copyProperties(order,dto);
+                BeanUtils.copyProperties(order, dto);
                 dto.setCaution(waimaiOrder.getCaution());
                 dto.setOutOrderId(waimaiOrder.getOutOrderId());
                 dto.setDaySeq(waimaiOrder.getDaySeq());
@@ -176,15 +177,25 @@ public class DeliveryOrderListener {
                 dto.setExceptTime(waimaiOrder.getDeliveryTime());
                 dto.setOrderTime(waimaiOrder.getOrderTime());
 
-                redisTemplate.opsForList().leftPush("shop_received"+order.getShopId() + "", dto);
-                redisTemplate.expire("shop_received"+order.getShopId(),30,TimeUnit.MINUTES);
-                if(order.getMerchantId()!=null){
-                    redisTemplate.opsForList().leftPush("merchant_received"+order.getMerchantId() + "", dto);
-                    redisTemplate.expire("merchant_received"+order.getMerchantId(),30,TimeUnit.MINUTES);
+                redisTemplate.opsForList().leftPush("shop_received" + order.getShopId() + "", dto);
+                redisTemplate.expire("shop_received" + order.getShopId(), 30, TimeUnit.MINUTES);
+                if (order.getMerchantId() != null) {
+                    redisTemplate.opsForList().leftPush("merchant_received" + order.getMerchantId() + "", dto);
+                    redisTemplate.expire("merchant_received" + order.getMerchantId(), 30, TimeUnit.MINUTES);
+                }
+                WaimaiOrderRecord record = iWaimaiOrderRecordService.getOne(new QueryWrapper<WaimaiOrderRecord>().eq("waimai_order_id", waimaiOrder.getId()));
+                if (record == null) {
+                    record = new WaimaiOrderRecord();
+                    record.setShopId(waimaiOrder.getShopId());
+                    record.setWaimaiOrderId(waimaiOrder.getId());
+                    record.setWaimaiId(waimaiOrder.getWaimaiId());
+                    record.setNum(1);
+                    iWaimaiOrderRecordService.save(record);
+                } else {
+                    record.setCreateTime(new Date());
+                    iWaimaiOrderRecordService.updateById(record);
                 }
             }
-
-
         }
 
     }

+ 14 - 0
lb-app/src/main/java/com/ydd/app/listener/DoCreateOrder.java

@@ -22,6 +22,7 @@ import com.ydd.module.enums.IsDeleteEnum;
 import com.ydd.module.enums.MemberCouponStatusEnum;
 import com.ydd.module.service.*;
 import com.ydd.third.common.config.DeliveryConfig;
+import com.ydd.third.common.dto.MaKePtProductVo;
 import com.ydd.third.common.vo.ResObject;
 import com.ydd.third.common.vo.dada.domain.order.GoodsInfo;
 import com.ydd.third.common.vo.vo.order.OrderResultVo;
@@ -105,12 +106,15 @@ public class DoCreateOrder {
             req.setTotalPriceFen(res.getTotalPriceFen());
         }
         req.setTipAmount(order.getTipAmount());
+        req.setLbShopCode(res.getLbShopCode());
+
         DeliveryInfo info = new DeliveryInfo();
         info.setType(res.getDeliveryType());
         info.setShopId(res.getShopId());
         info.setThirdShopId(res.getThirdShopId());
         info.setAuthToken(res.getAuthToken());
         info.setPhone(res.getPhone());
+
         // 调用运力方下单
         OrderResultVo vo = createOrder(req, info);
        // OrderResultVo vo = createOrder(req, res.getDeliveryInfo());
@@ -229,6 +233,13 @@ public class DoCreateOrder {
                    dadaGood.setSku_name("商品");
                 });
             }
+
+            List<MaKePtProductVo> maKePtProducts = orderVo.getMaKePtProducts();
+            if (CollectionUtils.isNotEmpty(maKePtProducts)) {
+                maKePtProducts.forEach(maKePtProductVo -> {
+                    maKePtProductVo.setName("商品");
+                });
+            }
         }
         ResObject<OrderResultVo> resObject = client.createOrder(orderVo);
         if (resObject.getCode() == 0) {
@@ -273,6 +284,9 @@ public class DoCreateOrder {
         if (StringUtils.isNotBlank(order.getPoiSeq())) {
             req.setPoiSeq(order.getPoiSeq());
         }
+        if (StringUtils.isNotBlank(order.getLbDaySeq())) {
+            req.setDaySeq(order.getLbDaySeq());
+        }
         if (StringUtils.isNotBlank(order.getOrderingSourceNo())) {
             req.setOrderingSourceNo(order.getOrderingSourceNo());
         }

+ 6 - 0
lb-app/src/main/java/com/ydd/app/listener/GuaranteeListener.java

@@ -148,6 +148,12 @@ public class GuaranteeListener {
 //                || nowOrder.getDeliveryStatus().equals(DeliveryStatusEnum.CANCEL.status)) {
 //            return ;
 //        }
+        if (!order.getParams().isEmpty() && order.getParams().get("again") != null&&order.getWaimaiOrderId()!=null) {
+            Long orderId  = (Long) order.getParams().get("again");
+            Order order1 = new Order();
+            order1.setId(orderId);
+            iOrderService.removeById(order1);
+        }
         // 下单,扣除最高价格,这里需要和普通订单一样处理
         createOrder(order, res, couponDto, req);
 

+ 12 - 0
lb-app/src/main/java/com/ydd/app/service/ApiOrderAgainService.java

@@ -0,0 +1,12 @@
+package com.ydd.app.service;
+
+
+
+/**
+ * @author wangtao
+ * @date 2022/5/6
+ */
+public interface ApiOrderAgainService {
+
+    void againOrder(Long  orderId);
+}

+ 4 - 0
lb-app/src/main/java/com/ydd/app/service/ApiShopService.java

@@ -82,4 +82,8 @@ public interface ApiShopService {
 
     List<ShopSelectDto> findShopSelectList(Long loginId);
 
+    void syncMaKePtShop(Long loginId, ShopReq shop);
+
+    void bindMakePtDelivery(Long shopId, Long deliveryId);
+
 }

+ 84 - 0
lb-app/src/main/java/com/ydd/app/service/impl/ApiCallBackMaKePt.java

@@ -0,0 +1,84 @@
+package com.ydd.app.service.impl;
+
+import com.ydd.app.service.ApiCallBack;
+import com.ydd.common.enums.DeliveryTypeEnums;
+import com.ydd.module.dto.CallBackOrderDto;
+import com.ydd.module.enums.OrderStatusEnum;
+import com.ydd.third.common.vo.callback.MaKePtCallbackOrderVo;
+import lombok.extern.slf4j.Slf4j;
+
+/**
+ * Project:lb-server
+ * Class:ApiCallBackDaDa
+ * Description:TODO
+ * Time:2021/3/11 14:41
+ *
+ * @author zoe
+ */
+@Slf4j
+public class ApiCallBackMaKePt extends ApiCallBack {
+
+    private final MaKePtCallbackOrderVo maKePtCallbackOrderVo;
+
+    public ApiCallBackMaKePt(MaKePtCallbackOrderVo maKePtCallbackOrderVo) {
+        this.maKePtCallbackOrderVo = maKePtCallbackOrderVo;
+    }
+
+    /**
+     * 配送状态:wait_to_shop(已接单,待到店),to_the_store(已到店),geted(配送中),gotoed(配送完成),cancel(取消配送)
+     *
+     *
+     * 自配送状态
+     * 美团:logisticsStatus,必须
+     * 0 配送单发往配送 10 配送单已确认 15 骑手已到店 20 骑手已取餐 40 骑手已送达 100 配送单已取消
+     *
+     * 饿了么配送状态
+     * 饿了么-state 必选
+     * DELIVERY_START-商家已送出
+     * DELIVERY_CANCEL-商家已取消
+     * DELIVERY_COMPLETE-商家已送达
+     * DELIVERY_KNIGHT_ACCEPT-骑手已接单
+     * DELIVERY_KNIGHT_REACH_SHOP-骑手到店
+     */
+    @Override
+    public CallBackOrderDto createCallBack() {
+        CallBackOrderDto dto = new CallBackOrderDto();
+        dto.setOrderSn(maKePtCallbackOrderVo.getOrderNo());
+        dto.setRiderName(maKePtCallbackOrderVo.getRiderName());
+        dto.setRiderPhone(maKePtCallbackOrderVo.getRiderPhone());
+        dto.setDeliveryType(DeliveryTypeEnums.MA_KE_PT.getType());
+        String status = maKePtCallbackOrderVo.getStatus();
+        if ("wait_to_shop".equals(status)) {   // 已接单、待到店
+            dto.setOrderStatus(OrderStatusEnum.TO_BE_DELIVERED.status);
+            dto.setOrderMtStatus(10);
+            dto.setOrderEleStatus("DELIVERY_KNIGHT_ACCEPT");
+            dto.setOrderEleRetaiStatus("7");
+        } else if ("to_the_store".equals(status)) {    // 已到店
+            dto.setOrderStatus(OrderStatusEnum.TO_BE_DELIVERED.status);
+            dto.setOrderMtStatus(15);
+            dto.setOrderEleStatus("DELIVERY_KNIGHT_REACH_SHOP");
+            dto.setOrderEleRetaiStatus("7");
+        } else if ("geted".equals(status)) {       // 配送中
+            dto.setOrderStatus(OrderStatusEnum.IN_DELIVERY.status);
+            dto.setOrderMtStatus(20);
+            dto.setOrderEleStatus("DELIVERY_START");
+            dto.setOrderEleRetaiStatus("21");
+        } else if ("gotoed".equals(status)) {       // 配送完成
+            dto.setOrderStatus(OrderStatusEnum.FINISH.status);
+            dto.setOrderMtStatus(40);
+            dto.setOrderEleStatus("DELIVERY_COMPLETE");
+            dto.setOrderEleRetaiStatus("16");
+        } else if ("cancel".equals(status)) {     // 配送取消
+            dto.setOrderStatus(OrderStatusEnum.CANCEL.status);
+            dto.setOrderMtStatus(100);
+            dto.setOrderEleStatus("DELIVERY_CANCEL");
+            dto.setOrderEleRetaiStatus("10");
+        } else if ("payed".equals(status)) {     // 骑手取消  即转单
+            dto.setOrderStatus(OrderStatusEnum.ORDERS_TO_BE_RECEIVED.status);
+            dto.setOrderMtStatus(0);
+            dto.setOrderEleRetaiStatus("4");
+        }
+        return dto;
+    }
+
+}

+ 178 - 0
lb-app/src/main/java/com/ydd/app/service/impl/ApiCreateShopMaKePt.java

@@ -0,0 +1,178 @@
+package com.ydd.app.service.impl;
+
+import com.ydd.api.DeliveryService;
+import com.ydd.app.dto.ShopReq;
+import com.ydd.app.service.ApiCreateShop;
+import com.ydd.common.enums.DeliveryTypeEnums;
+import com.ydd.module.domain.DspDelivery;
+import com.ydd.module.domain.Shop;
+import com.ydd.module.domain.ShopDelivery;
+import com.ydd.module.enums.BindStatusEnum;
+import com.ydd.module.service.IDspDeliveryService;
+import com.ydd.module.service.IShopDeliveryService;
+import com.ydd.third.common.vo.ResObject;
+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.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.math.BigDecimal;
+
+/**
+ * 码科跑腿 - 同步店铺
+ * @author 叶君翔
+ * @date 2022/05/09 14:02
+ */
+@Slf4j
+@Service
+@RequiredArgsConstructor(onConstructor_ = @Autowired)
+public class ApiCreateShopMaKePt implements ApiCreateShop {
+
+    private final DeliveryService deliveryClient;
+
+    private final IShopDeliveryService iShopDeliveryService;
+
+    private final IDspDeliveryService iDspDeliveryService;
+
+    @Override
+    public void createShop(Shop shop) {
+
+        ShopVo shopVo = new ShopVo();
+
+        shopVo.setLbClient(DeliveryTypeEnums.SHAN_SONG.getName());
+
+        /**
+         * 门店名称
+         * 闪送:storeName门店名称,店铺名称
+         * */
+        shopVo.setShopName(shop.getName());
+
+        /**
+         * 业务类型
+         * 闪送:goodType,必传,店铺业务类型
+         * 1-文件广告	3-电子产品 5-蛋糕	6-快餐水果 7-鲜花绿植 8-海鲜水产	9-汽车配件 10-其他 11-宠物	12-母婴	13-医药健康 14-教育
+         */
+        shopVo.setBusiness(6);
+        /**
+         * 城市名称
+         * 闪送:cityName 必传,城市名称(如,上海)
+         */
+        shopVo.setCityName(shop.getCityName());
+
+        /**
+         * 店铺地址
+         * 闪送:address 必传,店铺地址
+         */
+        shopVo.setShopAddress(shop.getAddress());
+
+        /**
+         * 详细地址
+         * 闪送:addressDetail,门牌号
+         */
+        shopVo.setShopAddressDetail(shop.getStreet());
+
+        /**
+         *门店经度
+         * 闪送:longitude必传,店铺经度
+         */
+        shopVo.setShopLng(new BigDecimal(shop.getLng()));
+        /**
+         * 门店纬度
+         * 达达:latitude  必传,店铺纬度
+         */
+        shopVo.setShopLat(new BigDecimal(shop.getLat()));
+
+        /**
+         * 联系人电话
+         * 达达:phone 必传,店铺联系人手机号/座机
+         */
+        shopVo.setContactPhone(shop.getMobile());
+
+        ResObject<ShopResultVo> res = deliveryClient.createShop(shopVo);
+        DspDelivery ssDelivery = iDspDeliveryService.findOne(DeliveryTypeEnums.SHAN_SONG.getType());
+        ShopDelivery delivery = new ShopDelivery();
+        delivery.setDeliveryId(ssDelivery.getId());
+        delivery.setMerchantId(shop.getMerchantId());
+        delivery.setShopId(shop.getId());
+        delivery.setBindStatus(BindStatusEnum.UNBIND.getStatus());
+        if (res.getCode() == 0) {//操作成功
+            ShopResultVo shopResultVo = res.getData();
+            String shopId = shopResultVo.getShopId();//返回的门店id,作保存以作后用
+            Object resData = shopResultVo.getResData(); //返回的详细数据
+            delivery.setBindStatus(BindStatusEnum.BIND.getStatus());
+            delivery.setThirdShopId(shopId);
+        }
+        iShopDeliveryService.save(delivery);
+    }
+
+    @Override
+    public void modifyShop(ShopReq shop) {
+        ShopVo shopVo = new ShopVo();
+
+        shopVo.setLbClient(DeliveryTypeEnums.SHAN_SONG.getName());
+        /**
+         * 闪送店铺id
+         * 闪送:storeId,更新店铺时storeId不允许为空, 必传
+         *
+         */
+        shopVo.setShopId(shop.getThirdShopId());
+        /**
+         * 门店名称
+         * 闪送:storeName门店名称,店铺名称
+         * */
+        shopVo.setShopName(shop.getName());
+
+        /**
+         * 业务类型
+         * 闪送:goodType,必传,店铺业务类型
+         * 1-文件广告	3-电子产品 5-蛋糕	6-快餐水果 7-鲜花绿植 8-海鲜水产	9-汽车配件 10-其他 11-宠物	12-母婴	13-医药健康 14-教育
+         */
+        shopVo.setBusiness(6);
+        /**
+         * 城市名称
+         * 闪送:cityName 必传,城市名称(如,上海)
+         */
+        shopVo.setCityName(shop.getCityName());
+
+        /**
+         * 店铺地址
+         * 闪送:address 必传,店铺地址
+         */
+        shopVo.setShopAddress(shop.getAddress());
+
+        /**
+         * 详细地址
+         * 闪送:addressDetail,门牌号
+         */
+        shopVo.setShopAddressDetail(shop.getStreet());
+
+        /**
+         *门店经度
+         * 闪送:longitude必传,店铺经度
+         */
+        shopVo.setShopLng(new BigDecimal(shop.getLng()));
+        /**
+         * 门店纬度
+         * 达达:latitude  必传,店铺纬度
+         */
+        shopVo.setShopLat(new BigDecimal(shop.getLat()));
+
+        /**
+         * 联系人电话
+         * 达达:phone 必传,店铺联系人手机号/座机
+         */
+        shopVo.setContactPhone(shop.getMobile());
+        ResObject<ShopResultVo> res = deliveryClient.updateShop(shopVo);
+        ShopDelivery delivery = iShopDeliveryService.getById(shop.getDeliveryId());
+        if (res.getCode() == 0) {//操作成功
+            ShopResultVo shopResultVo = res.getData();
+            String shopId = shopResultVo.getShopId();//返回的门店id,作保存以作后用
+            Object resData = shopResultVo.getResData(); //返回的详细数据
+            delivery.setBindStatus(BindStatusEnum.BIND.getStatus());
+            delivery.setThirdShopId(shopId);
+        }
+        iShopDeliveryService.updateById(delivery);
+    }
+}

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

@@ -145,6 +145,7 @@ public class ApiDevelopServiceImpl implements ApiDevelopService {
                 appInfo_dev.setStartTime(DateUtils.parseDate(developAuditDto.getStartTime()));
                 appInfo_dev.setEndTime(DateUtils.parseDate(developAuditDto.getEndTime()));
                 appInfo_dev.setEarnestMoney(developAuditDto.getEarnestMoney());
+                appInfo_dev.setMerchantId(merchant.getId());
                 iAppInfoService.createAppInfo(appInfo_dev);
                 AppInfoToken token_dev = new AppInfoToken();
                 token_dev.setAppId(appInfo_dev.getAppId());

+ 81 - 0
lb-app/src/main/java/com/ydd/app/service/impl/ApiOrderAgainServiceImpl.java

@@ -0,0 +1,81 @@
+package com.ydd.app.service.impl;
+
+import com.ydd.app.service.ApiOrderAgainService;
+import com.ydd.app.task.TriggerProcessTask;
+import com.ydd.common.utils.SnCodeUtils;
+import com.ydd.module.domain.MemberConfig;
+import com.ydd.module.domain.Order;
+import com.ydd.module.domain.OrderLog;
+import com.ydd.module.enums.*;
+import com.ydd.module.service.IMemberConfigService;
+import com.ydd.module.service.IOrderLogService;
+import com.ydd.module.service.IOrderService;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.ApplicationContext;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.support.TransactionSynchronizationAdapter;
+import org.springframework.transaction.support.TransactionSynchronizationManager;
+
+import java.util.HashMap;
+import java.util.Map;
+import java.util.concurrent.Executors;
+import java.util.concurrent.ScheduledExecutorService;
+import java.util.concurrent.TimeUnit;
+
+/**
+ * @author wangtao
+ * @date 2022/5/6
+ */
+@Slf4j
+@Service
+@RequiredArgsConstructor(onConstructor_ = @Autowired)
+public class ApiOrderAgainServiceImpl implements ApiOrderAgainService {
+
+    private final IMemberConfigService iMemberConfigService;
+    private final IOrderService iOrderService;
+    private final IOrderLogService iOrderLogService;
+    private final ApplicationContext applicationContext;
+    public static ScheduledExecutorService scheduledExecutorService = Executors.newScheduledThreadPool(10);
+
+    @Override
+    public void againOrder(Long  orderId) {
+        Order orderNew = iOrderService.getById(orderId);
+        MemberConfig config = iMemberConfigService.getShopMemberConfig(orderNew.getShopId(), null);
+        if(config!=null&& StatusEnum.SHOW.status.equals(config.getAgainOrder())){
+            orderNew.setDeliveryStatus(DeliveryStatusEnum.ORDERS_TO_BE_BILLED.status);
+            orderNew.setStatus(OrderStatusEnum.NO_PAYED.status);
+            orderNew.setPaymentType(PaymentTypeEnum.BALANCE.type);
+            orderNew.setDeliveryName("");
+            orderNew.setDeliveryId(null);
+            orderNew.setShipperName("");
+            orderNew.setShipperPhone("");
+            orderNew.setId(null);
+            orderNew.setOrderSn(SnCodeUtils.createSn());
+            orderNew.setCancelReason("");
+            orderNew.setCancelType(null);
+            orderNew.setPayAmount(null);
+            orderNew.setCouponAmount(null);
+            orderNew.setCouponId(null);
+            orderNew.setCommission(null);
+            iOrderService.save(orderNew);
+            OrderLog log = new OrderLog();
+            log.setOrderId(orderNew.getId());
+            log.setOrderStatus(DeliveryStatusEnum.ORDERS_TO_BE_BILLED.status);
+            log.setRemark(orderId+"");
+            iOrderLogService.save(log);
+
+            Map<String, Object> params = new HashMap<>();
+            params.put("again",orderId);
+            orderNew.setTakeType(TakeTypeEnum.NOW.type);
+            orderNew.setParams(params);
+            TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronizationAdapter() {
+                @Override
+                public void afterCommit() {
+                    scheduledExecutorService.schedule(new TriggerProcessTask(orderNew, null, applicationContext), 60, TimeUnit.SECONDS);
+                }
+            });
+        }
+    }
+}

+ 24 - 6
lb-app/src/main/java/com/ydd/app/service/impl/ApiOrderBackServiceImpl.java

@@ -109,6 +109,9 @@ public class ApiOrderBackServiceImpl implements ApiOrderBackService {
     private final IShopJdHomeCodeService iShopJdHomeCodeService;
 
     private final OpenApiNotifyService openApiNotifyService;
+    private final ApiOrderAgainService apiOrderAgainService;
+
+    private final IShopService iShopService;
 
     @Async
     @Override
@@ -350,6 +353,9 @@ public class ApiOrderBackServiceImpl implements ApiOrderBackService {
         // 美团众包
         dto.setZbOrderSn(orderDelivery.getOutTradeNo());
         dto.setZbAccessToken(orderDelivery.getZbToken());
+
+        Shop shop = iShopService.getById(order.getShopId());
+        dto.setLbShopCode(shop == null ? "" : shop.getCode());
         //顺丰需要shopId
         DspDelivery delivery = iDspDeliveryService.getById(deliveryId);
         CancelOrderVo orderVo = CancelOrderUtils.createOrderVo(dto, delivery);
@@ -588,10 +594,11 @@ public class ApiOrderBackServiceImpl implements ApiOrderBackService {
                         } else {
                             // 退差价
                             if (DeliveryTypeEnums.MEI_TUAN.getType().equals(dto.getDeliveryType()) || DeliveryTypeEnums.AIPT.getType().equals(dto.getDeliveryType())) {
-                                //美团或者爱跑腿没有加小费,如果加小费美团接单需退小费
+                                // 美团或者爱跑腿没有加小费,如果加小费美团接单需退小费
                                 List<OrderTip> orderTips = iOrderTipService.list(new QueryWrapper<OrderTip>().eq("order_no", order.getOrderSn()).eq("status", PayStatusEnum.PAYED.status));
-                                log.info("美团或者爱跑腿接单退小费");
-                                apiOrderNewService.refundTip(orderTips, "美团接单小费退款", order.getMemberId(), order.getMerchantId());
+                                String deliveryName = DeliveryTypeEnums.getNameByType(dto.getDeliveryType());
+                                log.info("{} 平台接单退小费", deliveryName);
+                                apiOrderNewService.refundTip(orderTips, deliveryName + "接单小费退款", order.getMemberId(), order.getMerchantId());
                                 diffAmount = order.getPayAmount().subtract(orderDelivery.getPayAmount());
                                 orderDelivery.setPayAmount(orderDelivery.getOriginAmount());
                                 orderDelivery.setTotalAmount(orderDelivery.getOriginAmount());
@@ -606,6 +613,11 @@ public class ApiOrderBackServiceImpl implements ApiOrderBackService {
                             apiOrderNewService.refundTip(orderTips, "绑定运力接单小费退款", order.getMemberId(), order.getMerchantId());
                         }
                     }
+                    if (DeliveryTypeEnums.MA_KE_PT.getType().equals(dto.getDeliveryType())) {
+                        orderDelivery.setPayAmount(orderDelivery.getOriginAmount());
+                        orderDelivery.setTotalAmount(orderDelivery.getOriginAmount());
+                        order.setTipAmount(BigDecimal.ZERO);
+                    }
                     if (diffAmount.compareTo(BigDecimal.ZERO) > 0) {
                         //退差价
                         apiOrderNewService.refund(order.getOrderSn(), diffAmount, "订单差价退款", order.getMemberId(), order.getMerchantId());
@@ -683,7 +695,7 @@ public class ApiOrderBackServiceImpl implements ApiOrderBackService {
         orderDelivery.setCancelTime(new Date());
         //   iOrderDeliveryService.update(orderDelivery, new UpdateWrapper<OrderDelivery>().eq("order_sn", order.getOrderSn()).eq("delivery_id", delivery.getId()));
         iOrderDeliveryService.updateById(orderDelivery);
-        if (order.getRefundMoney().compareTo(BigDecimal.ZERO) == 0) {
+        if (order.getRefundMoney().compareTo(BigDecimal.ZERO) == 0&&!redisTemplate.hasKey(order.getOrderSn()+"_refundmoney")) {
             orderDelivery = iOrderDeliveryService.getOne(new QueryWrapper<OrderDelivery>().eq("order_sn", order.getOrderSn()).eq("delivery_id", order.getDeliveryId()));
             order.setStatus(PayStatusEnum.CANCEL.status);
             //退费处理
@@ -707,8 +719,9 @@ public class ApiOrderBackServiceImpl implements ApiOrderBackService {
             List<OrderTip> orderTips = iOrderTipService.list(new QueryWrapper<OrderTip>().eq("order_no", order.getOrderSn()).eq("status", PayStatusEnum.PAYED.status));
             BigDecimal refundMoney = order.getPayAmount().subtract(deductFee);
             //DspDelivery delivery1 = iDspDeliveryService.getById(order.getDeliveryId());
-            if (orderDelivery != null && (DeliveryTypeEnums.MEI_TUAN.getType().equals(delivery.getType()) || DeliveryTypeEnums.AIPT.getType().equals(delivery.getType()))) {
-                log.info("美团或爱跑腿接单不退小费");
+            if (orderDelivery != null && (DeliveryTypeEnums.MEI_TUAN.getType().equals(delivery.getType()) || DeliveryTypeEnums.AIPT.getType().equals(delivery.getType()) || DeliveryTypeEnums.MA_KE_PT.getType().equals(delivery.getType()))) {
+                String deliveryName = DeliveryTypeEnums.getNameByType(delivery.getType());
+                log.info("{} 接单不退小费", deliveryName);
             } else if (orderDelivery != null && orderDelivery.getIsMine() == 1) {
                 log.info("自运力接单取消不退小费");
             } else if (CollectionUtils.isNotEmpty(orderTips)) {
@@ -730,7 +743,12 @@ public class ApiOrderBackServiceImpl implements ApiOrderBackService {
                 apiCouponService.updateCoupon(couponDto);
                 log.info("订单取消退优惠券成功:");
             }
+
             redisTemplate.delete(order.getOrderSn() + "to_recive:");
+            redisTemplate.opsForValue().set(order.getOrderSn()+"_refundmoney",refundMoney,90,TimeUnit.SECONDS);
+            if(OrderCancelTypeEnum.SYSTEM_CANCEL.type.equals(order.getCancelType())){
+                apiOrderAgainService.againOrder(order.getId());
+            }
         }
     }
 }

+ 22 - 6
lb-app/src/main/java/com/ydd/app/service/impl/ApiOrderCancelServiceImpl.java

@@ -5,6 +5,7 @@ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
 import com.ydd.api.DeliveryService;
 import com.ydd.app.service.ApiCouponService;
+import com.ydd.app.service.ApiOrderAgainService;
 import com.ydd.app.service.ApiOrderCancelService;
 import com.ydd.app.service.ApiOrderNewService;
 import com.ydd.common.core.redis.RedisCache;
@@ -76,6 +77,10 @@ public class ApiOrderCancelServiceImpl implements ApiOrderCancelService {
 
     private final IShopDeliveryBindService iShopDeliveryBindService;
 
+    private final ApiOrderAgainService apiOrderAgainService;
+
+    private final IShopService iShopService;
+
 
 
 
@@ -202,7 +207,8 @@ public class ApiOrderCancelServiceImpl implements ApiOrderCancelService {
             if (DeliveryTypeEnums.SHUN_FENG.getType().equals(delivery.getType()) || DeliveryTypeEnums.FENG_NIAO.getType().equals(delivery.getType())
                     || DeliveryTypeEnums.FENG_NIAO_PT.getType().equals(delivery.getType())
                     || DeliveryTypeEnums.MEI_TUAN_ZB.getType().equals(delivery.getType())
-                    || DeliveryTypeEnums.MEI_TUAN_SG_ZB.getType().equals(delivery.getType())) {
+                    || DeliveryTypeEnums.MEI_TUAN_SG_ZB.getType().equals(delivery.getType())
+                    || DeliveryTypeEnums.MA_KE_PT.getType().equals(delivery.getType())) {
                 cancelSf(deductFee, order,deliveryId,resObject.getMsg());
             }
         }
@@ -236,8 +242,12 @@ public class ApiOrderCancelServiceImpl implements ApiOrderCancelService {
         //顺丰需要shopId  delivery配送平台信息
 
         // dto.setStatus(orderDelivery.getDeliveryStatus());
-        CancelOrderVo orderVo = CancelOrderUtils.createOrderVo(dto, delivery);
         Order order = iOrderService.getById(orderId);
+
+        Shop shop = iShopService.getById(order.getShopId());
+        dto.setLbShopCode(shop == null ? "" : shop.getCode());
+        CancelOrderVo orderVo = CancelOrderUtils.createOrderVo(dto, delivery);
+
         if (order.getMerchantId() != null && orderDelivery.getIsMine().equals(1)) {
             ShopDeliveryBind shopDeliveryBind = iShopDeliveryBindService.getShopDeliveryBind(order.getMerchantId(), order.getShopId(), delivery.getId(), delivery.getType());
             /*ShopDelivery shopDelivery = iShopDeliveryService.getOne(new QueryWrapper<ShopDelivery>().eq("merchant_id", order.getMerchantId()).eq("delivery_id", delivery.getId())
@@ -297,10 +307,13 @@ public class ApiOrderCancelServiceImpl implements ApiOrderCancelService {
                 List<OrderTip> orderTips = iOrderTipService.list(new QueryWrapper<OrderTip>().eq("order_no", order.getOrderSn()).eq("status", PayStatusEnum.PAYED.status));
                 BigDecimal refundMoney = order.getPayAmount().subtract(deductFee);
 
-                BigDecimal tips = orderTips.stream().map(OrderTip::getAmount).reduce(BigDecimal.ZERO, BigDecimalUtils::sum);
-                refundMoney = refundMoney.subtract(tips);
-                apiOrderNewService.refundTip(orderTips, "加小费退款", order.getMemberId(), order.getMerchantId());
-
+                // 码科跑腿自运力,取消时不需要退小费, 接单时已经退了
+                DspDelivery dspDelivery = iDspDeliveryService.getById(deliveryId);
+                if (CollectionUtils.isNotEmpty(orderTips) && !DeliveryTypeEnums.MA_KE_PT.getType().equals(dspDelivery.getType())) {
+                    BigDecimal tips = orderTips.stream().map(OrderTip::getAmount).reduce(BigDecimal.ZERO, BigDecimalUtils::sum);
+                    refundMoney = refundMoney.subtract(tips);
+                    apiOrderNewService.refundTip(orderTips, "加小费退款", order.getMemberId(), order.getMerchantId());
+                }
                 apiOrderNewService.refund(order.getOrderSn(), refundMoney, "取消订单退款", order.getMemberId(), order.getMerchantId());
                 redisTemplate.delete(order.getOrderSn()+"to_recive:");
             }
@@ -314,6 +327,9 @@ public class ApiOrderCancelServiceImpl implements ApiOrderCancelService {
                 log.info("订单取消退优惠券成功:");
             }
             iOrderService.updateById(order);
+            if(OrderCancelTypeEnum.SYSTEM_CANCEL.type.equals(order.getCancelType())){
+                apiOrderAgainService.againOrder(order.getId());
+            }
         }
     }
 }

+ 38 - 7
lb-app/src/main/java/com/ydd/app/service/impl/ApiOrderNewServiceImpl.java

@@ -4,6 +4,7 @@ import cn.hutool.core.bean.BeanUtil;
 import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.github.binarywang.wxpay.exception.WxPayException;
+import com.google.common.collect.Lists;
 import com.ijpay.core.enums.TradeType;
 import com.ydd.app.dto.AddressReq;
 import com.ydd.app.dto.OrderReq;
@@ -13,6 +14,7 @@ import com.ydd.app.service.ApiCouponService;
 import com.ydd.app.service.ApiOrderNewService;
 import com.ydd.app.service.ApiOrderService;
 import com.ydd.app.service.ApiProductService;
+import com.ydd.common.constant.BillingConstant;
 import com.ydd.common.constant.RedisKeyConstant;
 import com.ydd.common.core.redis.RedisCache;
 import com.ydd.common.enums.WaimaiTypeEnums;
@@ -31,6 +33,7 @@ import com.ydd.module.pay.wechat.service.WechatPayService;
 import com.ydd.module.push.MessagePushService;
 import com.ydd.module.service.*;
 import com.ydd.system.service.ISysConfigService;
+import com.ydd.third.common.utils.CoordinateUtils;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.collections4.CollectionUtils;
@@ -93,6 +96,7 @@ public class ApiOrderNewServiceImpl implements ApiOrderNewService {
     private final RedisCache redisCache;
     private final IOrderFreightService iOrderFreightService;
 
+    private final IShopService iShopService;
 
     @Override
     @Transactional(rollbackFor = Exception.class)
@@ -309,7 +313,7 @@ public class ApiOrderNewServiceImpl implements ApiOrderNewService {
             checkAmount(member.getId(), true, order.getOrderSn(), order.getId());
             return "amount_not_enough";
         }
-        // 下单运力中含有自运力校验账户余额, 达达配送商模式无需校验
+        // 下单运力中含有自运力校验账户余额(设置的自运力服务费), 达达配送商模式无需校验
         if (deliveryIds.size() > 0 && isMine && !isDadaOrder) {
             checkMemberAmount(member, deliveryIds);
         }
@@ -535,20 +539,47 @@ public class ApiOrderNewServiceImpl implements ApiOrderNewService {
         order.setInvoiceTitle(req.getInvoiceTitle());
         //  order.setProduct(product);
         Long shopId = req.getShopId();
-        if (shopId == null) {
-            Member member = iMemberService.getById(memberId);
-            if (member.getShopId() != null) {
-                shopId = member.getShopId();
-                order.setDefaultShop(DefaultShopEnum.SHOW.status);
+//        if (shopId == null) {
+//            Member member = iMemberService.getById(memberId);
+//            if (member.getShopId() != null) {
+//                shopId = member.getShopId();
+//                order.setDefaultShop(DefaultShopEnum.SHOW.status);
+//            }
+//        }
+
+        AddressReq sendAddress = req.getSendAddress();
+
+        Member member = iMemberService.getById(memberId);
+        if (member.getShopId() != null && req.getShopId() == null) {
+            List<Shop> shops = Lists.newArrayList();
+            if (member.getMemberType().equals(MemberTypeEnum.SHOP.type)) {
+                Shop shop = iShopService.getById(member.getShopId());
+                shops.add(shop);
+            } else {
+                shops = iShopService.list(new QueryWrapper<Shop>()
+                        .eq("merchant_id", member.getMerchantId())
+                        .eq("deleted", 0)
+                        .eq("status", 1));
+            }
+            for (Shop shop : shops) {
+                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) { //暂定小于一百米 是门店发单
+                    // 个人发单,发件地址附近100米内的门店作为发单门店
+                    shopId = shop.getId();
+                }
             }
         }
         order.setShopId(shopId);
+        if (shopId != null && shopId.equals(member.getShopId()) ) {
+            order.setDefaultShop(DefaultShopEnum.SHOW.status);
+        }
+
 
         if (couponDto != null) {
             order.setCouponAmount(couponDto.getMoney());
             order.setCouponId(Long.valueOf(couponDto.getId()));
         }
-        AddressReq sendAddress = req.getSendAddress();
+
         AddressReq receiveAddress = req.getReceiptAddress();
         if (StringUtils.isNotBlank(sendAddress.getStreet())) {
             order.setSendStreet(sendAddress.getStreet());

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

@@ -2271,7 +2271,17 @@ public class ApiOrderServiceImpl implements ApiOrderService {
                 goodsItem.setQuantity(waimaiDetail.getQuantity());
                 goodsItem.setPrice(waimaiDetail.getPrice());
                 goodsItem.setFoodProperty(waimaiDetail.getFoodProperty() == null ? "" : waimaiDetail.getFoodProperty());
-                goodsItem.setSpec(waimaiDetail.getSpec() == null ? "" : waimaiDetail.getSpec());
+                StringBuilder spec = new StringBuilder();
+                if(StringUtils.isNotBlank(waimaiDetail.getFoodProperty())){
+                    spec.append(waimaiDetail.getFoodProperty());
+                }
+                if(StringUtils.isNotBlank(spec.toString())&&StringUtils.isNotBlank(waimaiDetail.getSpec())){
+                    spec.append(",").append(waimaiDetail.getSpec());
+                }else if(StringUtils.isBlank(spec.toString())&&StringUtils.isNotBlank(waimaiDetail.getSpec())){
+                    spec.append(waimaiDetail.getSpec());
+                }
+                // goodsItem.setSpec(waimaiDetail.getSpec() == null ? "" : waimaiDetail.getSpec());
+                goodsItem.setSpec(spec.toString());
                 if (showFoodImg) {
                     WaimaiFoodImg waimaiFoodImg = iWaimaiFoodImgService.getOne(new QueryWrapper<WaimaiFoodImg>()
                             .eq("sku_id", waimaiDetail.getSkuId())

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

@@ -9,6 +9,7 @@ import com.ydd.app.dto.OrderReq;
 import com.ydd.app.dto.ValuationRes;
 import com.ydd.app.dto.ValuationResultData;
 import com.ydd.app.service.ApiDadaValuationService;
+import com.ydd.app.service.ApiOrderAgainService;
 import com.ydd.app.service.ApiOrderValuationService;
 import com.ydd.app.service.ApiProductService;
 import com.ydd.common.constant.BillingConstant;
@@ -94,6 +95,7 @@ public class ApiOrderValuationServiceImpl implements ApiOrderValuationService {
     private final ApiDadaValuationService dadaValuationService;
     private final IDspDeliveryUuService iDspDeliveryUuService;
 
+
     @Override
     public ValuationResultData orderValuation(Member member, OrderReq orderReq, Integer type) {
         log.info("<===========>订单计价参数: loginId:{}, type: {}, orderReq: {} ", member.getId(), type, JsonMapper.nonEmptyMapper().toJson(orderReq));
@@ -308,8 +310,10 @@ public class ApiOrderValuationServiceImpl implements ApiOrderValuationService {
         list.sort(Comparator.comparing(ValuationRes::getDeliveryAmount));
         // Res数据组装
         this.setValuationRes(list, res, loginMember, orderReq.getTransport());
+        MemberConfig config = iMemberConfigService.getShopMemberConfig(shopId, null);
         // 运力包发单类型为自定义, 则先按照sort排,再按价格排
-        if (packageDeliveryDto != null && PackageDeliveryTypeEnum.CUSTOM.type.equals(packageDeliveryDto.getType())) {
+        if (packageDeliveryDto != null && PackageDeliveryTypeEnum.CUSTOM.type.equals(packageDeliveryDto.getType())
+                &&config!=null&& !StatusEnum.SHOW.status.equals(config.getLittleMoney())) {//用户配置了省钱模式,运力包排序无效
             Collections.sort(list);
         }
 
@@ -319,6 +323,20 @@ public class ApiOrderValuationServiceImpl implements ApiOrderValuationService {
         if (packageDeliveryDto != null) {
             billList = this.setBillingDuration(packageDeliveryDto, billList);
         }
+        if(config!=null&& StatusEnum.SHOW.status.equals(config.getLittleMoney())){//省钱模式
+            if (StringUtils.isNotBlank(config.getLittleMoneyTime())){
+                String[] split = config.getLittleMoneyTime().split(",");
+                for (int i = 0; i < billList.size(); i++) {
+                    ValuationRes valuationRes = billList.get(i);
+                    if (i < split.length) {
+                        if(StringUtils.isNotBlank(split[i])){
+                            valuationRes.setBillDuration(Integer.parseInt(split[i])*60);
+                        }
+                    }
+                }
+            }
+
+        }
         res.setOptionals(billList);
         res.setSupports(supports);
         return res;
@@ -564,6 +582,12 @@ public class ApiOrderValuationServiceImpl implements ApiOrderValuationService {
                 }
             }
         }
+        // 码科跑腿为门店模式, 计价需传store_id,
+        if (delivery.getType().equals(DeliveryTypeEnums.MA_KE_PT.getType())) {
+            Shop shop = iShopService.getById(shopId);
+            orderReq.setLbShopCode(shop == null ? "" : shop.getCode());
+        }
+
         OrderVo orderVo = OrderEntityUtils.createOrderVo(orderReq, delivery, deliveryConfig.isTest());
         // 获取用户配置
         MemberConfig memberConfig = iMemberConfigService.getShopMemberConfig(shopId, null);
@@ -626,7 +650,8 @@ public class ApiOrderValuationServiceImpl implements ApiOrderValuationService {
             // 判断是否是自己平台,查询金额是否充足
             if (delivery.getIsMine() == 1 && !delivery.getType().equals(DeliveryTypeEnums.KUAI_FU.getType())
                     && !delivery.getType().equals(DeliveryTypeEnums.MEI_TUAN_ZB.getType())
-                    && !DeliveryTypeEnums.MEI_TUAN_ZB.getType().equals(delivery.getType())) {
+                    && !DeliveryTypeEnums.MEI_TUAN_ZB.getType().equals(delivery.getType())
+                    && !DeliveryTypeEnums.MA_KE_PT.getType().equals(delivery.getType())) {
                 QueryAmount queryAmount = QueryAmountEntityUtils.queryAmount(delivery, merchantId, delivery.getIsMine());
                 ResObject<AmountResultVo> amountRes = client.queryAmount(queryAmount);
                 if (amountRes.getCode() == 0) {
@@ -777,6 +802,7 @@ public class ApiOrderValuationServiceImpl implements ApiOrderValuationService {
         res.setAuthToken(delivery.getAuthToken());
         res.setPhone(delivery.getPhone());
         res.setDeliveryType(delivery.getType());
+        res.setLbShopCode(orderReq.getLbShopCode());
     }
 
 }

+ 25 - 4
lb-app/src/main/java/com/ydd/app/service/impl/ApiRiderLocationServiceImpl.java

@@ -7,10 +7,7 @@ import com.ydd.common.enums.WaimaiTypeEnums;
 import com.ydd.module.domain.*;
 import com.ydd.module.dto.OrderDto;
 import com.ydd.module.enums.DeliveryStatusEnum;
-import com.ydd.module.service.IDspWaimaiService;
-import com.ydd.module.service.IShopDeliveryBindService;
-import com.ydd.module.service.IShopDeliveryService;
-import com.ydd.module.service.IShopWaimaiService;
+import com.ydd.module.service.*;
 import com.ydd.third.common.utils.CoordinateUtils;
 import com.ydd.third.common.vo.ResObject;
 import com.ydd.third.common.vo.huolalavo.HirtualPhoneInfo;
@@ -47,6 +44,8 @@ public class ApiRiderLocationServiceImpl  implements ApiRiderLocationService {
     private final IDspWaimaiService iDspWaimaiService;
     private final IShopWaimaiService iShopWaimaiService;
 
+    private final IShopService iShopService;
+
     @Override
     public OrderDto getRiderLocation(Order order,OrderDelivery orderDelivery ,OrderDto dto, DspDelivery delivery ) {
         //    DspDelivery delivery = iDspDeliveryService.getById(order.getDeliveryId());
@@ -332,9 +331,31 @@ public class ApiRiderLocationServiceImpl  implements ApiRiderLocationService {
                     if (res.getCode().intValue() == 0) {
                         dto.setShipperLat(res.getData().getLat());
                         dto.setShipperLng(res.getData().getLng());
+
                         //  dto.setEstimateArriveTimeStr(resObject.getData().getEstimateArriveTimeStr());
                     }
                 }
+            } else if (DeliveryTypeEnums.MA_KE_PT.getType().equals(delivery.getType()) && orderDelivery != null) {
+                if (order.getDeliveryStatus() > DeliveryStatusEnum.ORDERS_TO_BE_RECEIVED.status) {
+                    RiderLocationVo riderLocationVo = new RiderLocationVo();
+                    riderLocationVo.setLbClient(DeliveryTypeEnums.MA_KE_PT.getName());
+                    riderLocationVo.setOrderNo(orderDelivery.getChildOrderSn());
+                    ResObject<RiderLocationResultVo> res = client.getRiderLocation(riderLocationVo);
+                    if (res.getCode() == 0) {
+                        dto.setShipperLat(res.getData().getLat());
+                        dto.setShipperLng(res.getData().getLng());
+                    }
+                    OrderQueryVo orderQueryVo = new OrderQueryVo();
+                    orderQueryVo.setLbClient(DeliveryTypeEnums.MA_KE_PT.getName());
+                    orderQueryVo.setOrderNo(orderDelivery.getChildOrderSn());
+                    Shop shop = iShopService.getById(order.getShopId());
+                    orderQueryVo.setLbShopCode(shop == null ? "" : shop.getCode());
+                    ResObject<OrderQueryResultVo> resObject = client.queryOrderInfo(orderQueryVo);
+                    if (resObject.getCode() == 0) {
+                        dto.setShipperName(resObject.getData().getRiderName());
+                        dto.setShipperPhone(resObject.getData().getRiderPhone());
+                    }
+                }
             }
         return dto;
     }

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

@@ -92,7 +92,7 @@ public class ApiShopDeviceServiceImpl implements ApiShopDeviceService {
         } else {
 
             ShopDevice device = iShopDeviceService.getById(dto.getId());
-            if (CollectionUtils.isEmpty(shopDevices)&&!device.getDeviceSn().equals(dto.getDeviceSn())||!device.getDeviceSecret().equals(dto.getDeviceSecret())){
+            if (CollectionUtils.isEmpty(shopDevices)&&!device.getDeviceSn().equals(dto.getDeviceSn())||!dto.getDeviceSecret().equals(device.getDeviceSecret())){
                 reslut = unifiedPrintService.addPrintSn(dto.getDeviceType(), shopDevice.getDeviceSn(), shopDevice.getDeviceSecret(),dto.getName());
             }
             if("ok".equals(reslut)){

+ 51 - 0
lb-app/src/main/java/com/ydd/app/service/impl/ApiShopServiceImpl.java

@@ -74,6 +74,8 @@ public class ApiShopServiceImpl implements ApiShopService {
 
     private final OpenApiNotifyService openApiNotifyService;
 
+    private final IShopDeliveryBindService iShopDeliveryBindService;
+
     @Override
     public List<ShopDto> findList(Long loginId) {
         Member member = iMemberService.getById(loginId);
@@ -747,4 +749,53 @@ public class ApiShopServiceImpl implements ApiShopService {
         return iShopService.findShopSelectList(member);
     }
 
+    @Override
+    public void syncMaKePtShop(Long loginId, ShopReq shopReq) {
+        Shop shop  = iShopService.getById(shopReq.getId());
+        DspDelivery dspDelivery = iDspDeliveryService.getById(shopReq.getDeliveryId());
+        ShopVo shopVo = ShopEntityUtils.createShopVo(shop, dspDelivery, null);
+        ShopDelivery delivery = iShopDeliveryService.getOne(new QueryWrapper<ShopDelivery>().eq("shop_id", shopReq.getId()).eq("delivery_id", shopReq.getDeliveryId()));
+        if (delivery == null) {
+            delivery = new ShopDelivery();
+            delivery.setDeliveryId(dspDelivery.getId());
+            delivery.setMerchantId(shop.getMerchantId());
+            delivery.setShopId(shop.getId());
+        }
+        log.info("门店信息:{}", JsonMapper.nonEmptyMapper().toJson(shopVo));
+        ResObject<ShopResultVo> res = deliveryClient.createShop(shopVo);
+        if (res.getCode() == 0) {
+            delivery.setBindStatus(BindStatusEnum.BIND.getStatus());
+        } else {
+            delivery.setBindStatus(BindStatusEnum.UNBIND.getStatus());
+            delivery.setAuthMsg(res.getMsg());
+        }
+        iShopDeliveryService.saveOrUpdate(delivery);
+    }
+
+    @Override
+    public void bindMakePtDelivery(Long shopId, Long deliveryId) {
+        Shop shop  = iShopService.getById(shopId);
+        if (shop == null) {
+            throw new CustomAppException("门店信息异常,请联系管理员!");
+        }
+        Merchant merchant = iMerchantService.getById(shop.getMerchantId());
+        if (merchant == null) {
+            throw new CustomAppException("商家信息异常,请联系管理员!");
+        }
+        DspDelivery delivery = iDspDeliveryService.getById(deliveryId);
+        if (delivery == null) {
+            throw new CustomAppException("暂不支持该运力绑定!");
+        }
+        Integer deliveryType = delivery.getType();
+        ShopDeliveryBind shopDeliveryBind = iShopDeliveryBindService.getShopDeliveryBindInfo(shop.getMerchantId(), shopId, deliveryId, deliveryType);
+        if (shopDeliveryBind == null) {
+            shopDeliveryBind = new ShopDeliveryBind();
+        }
+        shopDeliveryBind.setMerchantId(shop.getMerchantId());
+        shopDeliveryBind.setShopId(shopId);
+        shopDeliveryBind.setDeliveryId(deliveryId);
+        shopDeliveryBind.setBindStatus(1);
+        iShopDeliveryBindService.saveOrUpdate(shopDeliveryBind);
+    }
+
 }

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

@@ -1,80 +1,87 @@
-//package com.ydd.app;
-//
-//import com.alibaba.fastjson.JSON;
-//import com.alibaba.fastjson.JSONArray;
-//import com.alibaba.fastjson.JSONObject;
-//import com.ydd.AppApplication;
-//import com.ydd.app.service.ApiStatisticsService;
-//import com.ydd.app.service.ApiWaimaiPrintService;
-//import com.ydd.module.domain.WaimaiOrder;
-//import com.ydd.module.push.MessagePushService;
-//import com.ydd.module.service.IOrderPushMessageService;
-//import com.ydd.module.service.IWaimaiOrderService;
-//import com.ydd.third.common.vo.ResObject;
-//import com.ydd.third.delivery.meituan.MeituanSgClient;
-//import com.ydd.third.delivery.vo.order.OrderVo;
-//import com.ydd.third.waimai.eleme.ElemeAuthClient;
-//import com.ydd.third.waimai.eleme.ElemeClient;
-//import org.apache.commons.collections4.CollectionUtils;
-//import org.junit.runner.RunWith;
-//import org.springframework.beans.factory.annotation.Autowired;
-//import org.springframework.boot.test.context.SpringBootTest;
-//import org.springframework.test.context.junit4.SpringRunner;
-//
-//import javax.annotation.Resource;
-//import java.util.List;
-//import java.util.regex.Matcher;
-//import java.util.regex.Pattern;
-//
-//@RunWith(SpringRunner.class)
-//@SpringBootTest(classes = AppApplication.class, webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
-//public class Test {
-//    @Autowired
-//    private  IWaimaiOrderService iWaimaiOrderService;
-//    @Autowired
-//    private  MessagePushService messagePushService;
-//
-//    @Autowired
-//    private  IOrderPushMessageService iOrderPushMessageService;
-//    @Autowired
-//    private  ApiStatisticsService apiStatisticsService;
-//    @Autowired
-//    private  ApiWaimaiPrintService apiWaimaiPrintService;
+package com.ydd.app;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.ydd.AppApplication;
+import com.ydd.app.dto.DevelopAuditDto;
+import com.ydd.app.service.ApiDevelopService;
+import com.ydd.app.service.ApiStatisticsService;
+import com.ydd.app.service.ApiWaimaiPrintService;
+import com.ydd.module.domain.WaimaiOrder;
+import com.ydd.module.push.MessagePushService;
+import com.ydd.module.service.IOrderPushMessageService;
+import com.ydd.module.service.IWaimaiOrderService;
+
+import org.apache.commons.collections4.CollectionUtils;
+import org.junit.runner.RunWith;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.test.context.junit4.SpringRunner;
+
+import javax.annotation.Resource;
+import java.math.BigDecimal;
+import java.util.List;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+@RunWith(SpringRunner.class)
+@SpringBootTest(classes = AppApplication.class, webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
+public class Test {
+    @Autowired
+    private  IWaimaiOrderService iWaimaiOrderService;
+    @Autowired
+    private  MessagePushService messagePushService;
+
+    @Autowired
+    private  IOrderPushMessageService iOrderPushMessageService;
+    @Autowired
+    private  ApiStatisticsService apiStatisticsService;
+    @Autowired
+    private  ApiWaimaiPrintService apiWaimaiPrintService;
 //    @Resource
 //    private ElemeAuthClient elemeAuthClient;
 //    @Resource
 //    private  ElemeClient elemeClient;
 //    @Resource
 //    private MeituanSgClient meituanSgClient;
-////
-//    public  void test(){
-//        String title = "您有一个订单5分钟内没有骑手接单,请及时关注";
-//        String content = "您有一个订单5分钟内没有骑手接单,请及时关注";
-//        List<WaimaiOrder> list = iWaimaiOrderService.queryTimeOutFiveOrder();
-//        if (CollectionUtils.isNotEmpty(list)) {
-//            for (WaimaiOrder waimaiOrder : list) {
-//                messagePushService.riderMissedOrderMessage(waimaiOrder, title, content);
-//            }
-//        }
 //
-//    }
-//
-//    @org.junit.Test
-//    public  void testtj(){
-//        System.out.println(apiStatisticsService.shop(185l,164l,3,null,null));
-//    }
-//
-//    @org.junit.Test
-//    public  void testPrint(){
-////        ResObject res = elemeClient.getNonReachedOMessages("06143463292980a8ec66c0a2000102b5",77457529);
-////        System.out.println(JSONObject.toJSONString(res));
-//       // elemeAuthClient.doRefreshToken("c54df9d9bcc3d605417111aea02f2e48");
-//
-//        //apiWaimaiPrintService.printTestWaimai("50005126", 342514L,"4377979561300340297");.
+    public  void test(){
+        String title = "您有一个订单5分钟内没有骑手接单,请及时关注";
+        String content = "您有一个订单5分钟内没有骑手接单,请及时关注";
+        List<WaimaiOrder> list = iWaimaiOrderService.queryTimeOutFiveOrder();
+        if (CollectionUtils.isNotEmpty(list)) {
+            for (WaimaiOrder waimaiOrder : list) {
+                messagePushService.riderMissedOrderMessage(waimaiOrder, title, content);
+            }
+        }
+
+    }
+
+    @org.junit.Test
+    public  void testtj(){
+        System.out.println(apiStatisticsService.shop(185l,164l,3,null,null));
+    }
+    @Autowired
+    ApiDevelopService apiDevelopService;
+    @org.junit.Test
+    public  void testPrint(){
+//        ResObject res = elemeClient.getNonReachedOMessages("06143463292980a8ec66c0a2000102b5",77457529);
+//        System.out.println(JSONObject.toJSONString(res));
+       // elemeAuthClient.doRefreshToken("c54df9d9bcc3d605417111aea02f2e48");
+
+        //apiWaimaiPrintService.printTestWaimai("50005126", 342514L,"4377979561300340297");.
 //        OrderVo orderVo = new OrderVo();
 //        orderVo.setZbToken("token_lt5wP20-mAgj4JUczj1ErQ");
 //        orderVo.setOrderingSourceNo("56835752520387746");
 //        meituanSgClient.zhongBaoFee(orderVo);
-//    }
-//
-//}
+        DevelopAuditDto developAuditDto = new DevelopAuditDto();
+        developAuditDto.setMerchantId(197l);
+        developAuditDto.setStartTime("2022-05-13");
+        developAuditDto.setStartTime("2023-05-12");
+        developAuditDto.setEarnestMoney(new BigDecimal("2000"));
+        developAuditDto.setStatus(1);
+        apiDevelopService.audit(developAuditDto);
+    }
+
+}

+ 5 - 5
lb-common/src/main/java/com/ydd/common/core/domain/ResponseResult.java

@@ -15,7 +15,7 @@ public class ResponseResult<T> implements Serializable {
     private static final long serialVersionUID = 1785841673089951952L;
 
     private int code;
-    private String message;
+    private String msg;
     private T data;
 
     public int getCode() {
@@ -27,11 +27,11 @@ public class ResponseResult<T> implements Serializable {
     }
 
     public String getMessage() {
-        return message;
+        return msg;
     }
 
     public void setMessage(String message) {
-        this.message = message;
+        this.msg = message;
     }
 
     public T getData() {
@@ -48,12 +48,12 @@ public class ResponseResult<T> implements Serializable {
 
     public ResponseResult(int code, String message) {
         this.code = code;
-        this.message = message;
+        this.msg = message;
     }
 
     public ResponseResult(int code, String message, T data) {
         this.code = code;
-        this.message = message;
+        this.msg = message;
         if (data != null) {
             this.data = data;
         }

+ 1 - 1
lb-common/src/main/java/com/ydd/common/core/domain/Result.java

@@ -22,7 +22,7 @@ public class Result extends HashMap<String, Object> {
     /**
      * 返回内容
      */
-    public static final String MSG_TAG = "message";
+    public static final String MSG_TAG = "msg";
 
     /**
      * 数据对象

+ 2 - 0
lb-common/src/main/java/com/ydd/common/enums/DeliveryTypeEnums.java

@@ -33,6 +33,8 @@ public enum DeliveryTypeEnums {
     MEI_TUAN_ZB(13, "meituanzb"),
     MEI_TUAN_SG_ZB(14, "meituansgzb"),
     FENG_NIAO_PT(15, "fengniaopt"),
+
+    MA_KE_PT(16, "makept"),
     ;
 
     private final Integer type;

+ 7 - 0
lb-module/src/main/java/com/ydd/module/CancelOrderUtils.java

@@ -214,6 +214,13 @@ public class CancelOrderUtils {
             cancelOrderVo.setMerchantId(delivery.getShopId());
             cancelOrderVo.setAccessToken(delivery.getAuthToken());
 
+        } else if (DeliveryTypeEnums.MA_KE_PT.getType().equals(delivery.getType())) {
+            cancelOrderVo.setLbClient(DeliveryTypeEnums.MA_KE_PT.getName());
+            cancelOrderVo.setOrderNo(order.getOrderSn());
+            cancelOrderVo.setCancelReason(order.getReason());
+            // 码科跑腿暂时无取消原因分类, 可以不传
+            cancelOrderVo.setCancelCode(null);
+            cancelOrderVo.setLbShopCode(order.getLbShopCode());
         }
         return cancelOrderVo;
     }

+ 8 - 6
lb-module/src/main/java/com/ydd/module/domain/MemberConfig.java

@@ -1,17 +1,15 @@
 package com.ydd.module.domain;
 
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
 import com.fasterxml.jackson.annotation.JsonFormat;
+import com.ydd.common.annotation.Excel;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 import lombok.NoArgsConstructor;
 import lombok.experimental.Accessors;
-import com.ydd.common.annotation.Excel;
-import com.baomidou.mybatisplus.annotation.TableId;
-import com.baomidou.mybatisplus.annotation.TableName;
-import com.baomidou.mybatisplus.annotation.TableField;
-import com.baomidou.mybatisplus.annotation.TableLogic;
 
-import java.math.BigDecimal;
 import java.io.Serializable;
 import java.util.Date;
 import java.util.HashMap;
@@ -148,6 +146,10 @@ private static final long serialVersionUID=1L;
      */
     private Integer customerLinkPrintGoodsPrice;
 
+    private Integer againOrder;
+
+    private Integer littleMoney;
+    private String littleMoneyTime;
     /** 创建时间 */
     @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
     @Excel(name = "创建时间", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss")

+ 5 - 6
lb-module/src/main/java/com/ydd/module/domain/WaimaiOrderRecord.java

@@ -1,16 +1,15 @@
 package com.ydd.module.domain;
 
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableLogic;
+import com.baomidou.mybatisplus.annotation.TableName;
 import com.fasterxml.jackson.annotation.JsonFormat;
+import com.ydd.common.annotation.Excel;
 import lombok.Data;
 import lombok.NoArgsConstructor;
 import lombok.experimental.Accessors;
-import com.ydd.common.annotation.Excel;
-import com.baomidou.mybatisplus.annotation.TableId;
-import com.baomidou.mybatisplus.annotation.TableName;
-import com.baomidou.mybatisplus.annotation.TableField;
-import com.baomidou.mybatisplus.annotation.TableLogic;
 
-import java.math.BigDecimal;
 import java.io.Serializable;
 import java.util.Date;
 import java.util.HashMap;

+ 5 - 0
lb-module/src/main/java/com/ydd/module/dto/CancelOrderDto.java

@@ -59,4 +59,9 @@ public class CancelOrderDto implements Serializable {
 
     private Integer cancelCode;
     private String cancenlResonMsg;
+
+    /**
+     * 码科跑腿需传猎豹门店编号
+     */
+    private String lbShopCode;
 }

+ 7 - 0
lb-module/src/main/java/com/ydd/module/dto/MemberDetailDto.java

@@ -133,5 +133,12 @@ public class MemberDetailDto extends Member {
      * 同步打印客户联商品价格
      */
     private Integer customerLinkPrintGoodsPrice;
+    @ApiModelProperty(value = "取消在发起配送开关 0 关闭 1开启")
+    private Integer againOrder;
+
+    @ApiModelProperty(value = "省钱模式开关0 关闭 1开启")
+    private Integer littleMoney;
+    @ApiModelProperty(value = "省钱模式 间隔时间,逗号隔开")
+    private String littleMoneyTime;
 
 }

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

@@ -1,7 +1,8 @@
 package com.ydd.module.service;
 
-import com.ydd.module.domain.WaimaiOrderRecord;
 import com.baomidou.mybatisplus.extension.service.IService;
+import com.ydd.module.domain.WaimaiOrderRecord;
+
 import java.util.List;
 
 /**

+ 4 - 2
lb-module/src/main/java/com/ydd/module/service/impl/ShopDeliveryBindServiceImpl.java

@@ -131,7 +131,8 @@ public class ShopDeliveryBindServiceImpl extends ServiceImpl<ShopDeliveryBindMap
                 || DeliveryTypeEnums.FENG_NIAO.getType().equals(deliveryType)
                 || DeliveryTypeEnums.FENG_NIAO_PT.getType().equals(deliveryType)
                 || DeliveryTypeEnums.SHUN_FENG.getType().equals(deliveryType)
-                || DeliveryTypeEnums.MEI_TUAN_ZB.getType().equals(deliveryType)) {
+                || DeliveryTypeEnums.MEI_TUAN_ZB.getType().equals(deliveryType)
+                || DeliveryTypeEnums.MA_KE_PT.getType().equals(deliveryType)) {
             shopDeliveryBind = this.getOne(new QueryWrapper<ShopDeliveryBind>()
                     .eq("merchant_id", merchantId)
                     .eq("shop_id", shopId)
@@ -292,7 +293,8 @@ public class ShopDeliveryBindServiceImpl extends ServiceImpl<ShopDeliveryBindMap
                 || DeliveryTypeEnums.FENG_NIAO.getType().equals(deliveryType)
                 || DeliveryTypeEnums.FENG_NIAO_PT.getType().equals(deliveryType)
                 || DeliveryTypeEnums.SHUN_FENG.getType().equals(deliveryType)
-                || DeliveryTypeEnums.MEI_TUAN_ZB.getType().equals(deliveryType)) {
+                || DeliveryTypeEnums.MEI_TUAN_ZB.getType().equals(deliveryType)
+                || DeliveryTypeEnums.MA_KE_PT.getType().equals(deliveryType)) {
             shopDeliveryBind = this.getOne(new QueryWrapper<ShopDeliveryBind>()
                     .eq("merchant_id", merchantId)
                     .eq("shop_id", shopId)

+ 29 - 0
lb-third/lb-third-common/src/main/java/com/ydd/third/common/dto/MaKePtProductVo.java

@@ -0,0 +1,29 @@
+package com.ydd.third.common.dto;
+
+import lombok.Data;
+
+/**
+ *  码科跑腿 订单商品信息
+ * @author 叶君翔
+ * @date 2022/05/07 15:24
+ */
+@Data
+public class MaKePtProductVo {
+    /**
+     * 商品数量
+     */
+    private String num;
+
+    /**
+     * 商品名称
+     */
+    private String name;
+
+    /**
+     * 商品价格,单位为元
+     */
+    private String price;
+
+}
+
+

+ 34 - 0
lb-third/lb-third-common/src/main/java/com/ydd/third/common/vo/callback/MaKePtCallbackOrderVo.java

@@ -0,0 +1,34 @@
+package com.ydd.third.common.vo.callback;
+
+import com.alibaba.fastjson.annotation.JSONField;
+import lombok.Data;
+
+@Data
+public class MaKePtCallbackOrderVo {
+
+    /**
+     * 下单时传入的猎豹子订单号
+     */
+    @JSONField(name = "order_no")
+    private String orderNo;
+
+    /**
+     * 配送状态:wait_to_shop(已接单,待到店),to_the_store(已到店),geted(配送中),gotoed(配送完成),cancel(取消配送)
+     *
+     * 参考: https://www.yuque.com/docs/share/cbbb0719-10e6-40c3-9cfc-7111a7623909#W8uaa
+     */
+    private String status;
+
+    /**
+     * 	配送员姓名,接单以后会传
+     */
+    @JSONField(name = "rider_name")
+    private String riderName;
+
+    /**
+     * 配送员手机号,接单以后会传
+     */
+    @JSONField(name = "rider_phone")
+    private String riderPhone;
+
+}

+ 11 - 0
lb-third/lb-third-common/src/main/java/com/ydd/third/common/vo/shop/ShopVo.java

@@ -111,6 +111,12 @@ public class ShopVo {
     private Integer secondCategory;
 
     /**
+     * 码科跑腿需要传省份id
+     * 省份名称
+     */
+    private String provinceName;
+
+    /**
      * 城市名称
      * 达达,闪送
      * 达达:city_name 必传,城市名称(如,上海)
@@ -289,4 +295,9 @@ public class ShopVo {
      * 1.保存 2.更新,默认为1
      */
     private Integer operationType;
+
+    /**
+     * 列表门店编号
+     */
+    private String lbShopCode;
 }

+ 5 - 0
lb-third/lb-third-common/src/main/java/com/ydd/third/common/vo/vo/order/CancelOrderVo.java

@@ -141,4 +141,9 @@ public class CancelOrderVo {
     private Integer status;
 
     private Integer isMine;
+
+    /**
+     * 码科跑腿需传猎豹门店编号
+     */
+    private String lbShopCode;
 }

+ 5 - 0
lb-third/lb-third-common/src/main/java/com/ydd/third/common/vo/vo/order/OrderQueryVo.java

@@ -99,4 +99,9 @@ public class OrderQueryVo extends BaseModel {
      */
     private Integer isDirectDelivery;
     private Integer isMine;
+
+    /**
+     * 码科跑腿需传猎豹门店编号
+     */
+    private String lbShopCode;
 }

+ 6 - 0
lb-third/lb-third-common/src/main/java/com/ydd/third/common/vo/vo/order/OrderVo.java

@@ -1,5 +1,6 @@
 package com.ydd.third.common.vo.vo.order;
 
+import com.ydd.third.common.dto.MaKePtProductVo;
 import com.ydd.third.common.vo.dada.domain.BaseModel;
 import com.ydd.third.common.vo.dada.domain.order.GoodsInfo;
 import com.ydd.third.common.vo.waimai.meituan.OpenApiGood;
@@ -556,6 +557,11 @@ public class OrderVo  extends BaseModel {
 
     private List<GoodsInfo> dadaGoods;
 
+    /**
+     * 码科跑腿商品信息
+     */
+    private List<MaKePtProductVo> maKePtProducts;
+
     private Integer isTest;
 
     /**

+ 23 - 7
lb-third/lb-third-delivery/src/main/java/com/ydd/third/delivery/Client.java

@@ -9,6 +9,7 @@ import com.ydd.third.delivery.dianwoda.DianwodaClient;
 import com.ydd.third.delivery.fengniao.FengniaoClient;
 import com.ydd.third.delivery.huolala.HuolalaClient;
 import com.ydd.third.delivery.kuaifu.KfClient;
+import com.ydd.third.delivery.makept.MaKePtClient;
 import com.ydd.third.delivery.meituan.MeituanClient;
 import com.ydd.third.delivery.meituan.MeituanSgClient;
 import com.ydd.third.delivery.shansong.ShansongClient;
@@ -60,6 +61,9 @@ public class Client {
     HuolalaClient huolalaClient;
     @Autowired
     MeituanSgClient meituanSgClient;
+
+    @Autowired
+    MaKePtClient makeptClient;
     /**
      * 下订单
      *
@@ -109,6 +113,8 @@ public class Client {
             } else if (client.equals("fengniaopt")) {
                 // res = fengniaoClient.createOrder(order);
                 res = fengniaoClient.createOrder(order);
+            } else if (client.equals("makept")) {
+                res = makeptClient.createOrder(order);
             } else {
                 throw new BusinessException("lbClient参数不正确");
             }
@@ -163,14 +169,16 @@ public class Client {
                 res = aiptClient.queryOrderDeliverFee(order);
             } else if (client.equals("kuanfu")){
                 res = kfClient.queryOrderDeliverFee(order);
-            } else  if (client.equals("huolala")){
+            } else if (client.equals("huolala")){
                 res =huolalaClient.queryOrderDeliverFee(order);
             } else if (client.equals("meituansgzb")) {
                 res = meituanSgClient.zhongBaoFee(order);
             } else if (client.equals("fengniaopt")) {
                 // res = fengniaoClient.cancelOrder(cancelOrderVo);
                 res = fengniaoClient.queryOrderDeliverFee(order);
-            }else {
+            } else if (client.equals("makept")) {
+                res = makeptClient.queryOrderDeliverFee(order);
+            } else {
                 throw new BusinessException("lbClient参数不正确");
             }
         } catch (Exception e) {
@@ -225,12 +233,14 @@ public class Client {
                 res = kfClient.cancelOrder(cancelOrderVo);
             } else if (client.equals("huolala")){
                 res =huolalaClient.cancelOrder(cancelOrderVo);
-            }else if (client.equals("meituansgzb")) {
+            } else if (client.equals("meituansgzb")) {
                 res = meituanSgClient.cancelDeliveryOrder(cancelOrderVo);
-            }  else if (client.equals("fengniaopt")) {
+            } else if (client.equals("fengniaopt")) {
                 // res = fengniaoClient.cancelOrder(cancelOrderVo);
                 res = fengniaoClient.cancelOrder(cancelOrderVo);
-            }else {
+            } else if (client.equals("makept")) {
+                res = makeptClient.cancelOrder(cancelOrderVo);
+            } else {
                 throw new BusinessException("lbClient参数不正确");
             }
         } catch (Exception e) {
@@ -338,9 +348,11 @@ public class Client {
                 res = kfClient.queryOrderInfo(orderQueryVo);
             }else if (client.equals("huolala")) {
                 res = huolalaClient.queryOrderInfo(orderQueryVo);
-            }else if (client.equals("fengniaopt")) {
+            } else if (client.equals("fengniaopt")) {
                 //  res = fengniaoClient.queryOrder(orderQueryVo);
                 res = fengniaoClient.queryOrderInfo(orderQueryVo);
+            } else if (client.equals("makept")) {
+                res = makeptClient.queryOrderInfo(orderQueryVo);
             } else {
                 throw new BusinessException("lbClient参数不正确");
             }
@@ -395,7 +407,9 @@ public class Client {
             } else if (client.equals("fengniaopt")) {
                 //res = fengniaoClient.queryCarrier(riderLocationVo);
                 res = fengniaoClient.getRiderLocation(riderLocationVo);
-            }else {
+            } else if (client.equals("makept")) {
+                res = makeptClient.getRiderLocation(riderLocationVo);
+            } else {
                 throw new BusinessException("lbClient参数不正确");
             }
         } catch (Exception e) {
@@ -467,6 +481,8 @@ public class Client {
         } else if (client.equals("fengniaopt")) {
             //res =fengniaoClient.addChainStore(shopVo);
             res = fengniaoClient.createShop(shopVo);
+        } else if (client.equals("makept")) {
+            res = makeptClient.createShop(shopVo);
         } else {
             //顺丰没有相应的接口
             throw new BusinessException("lbClient参数不正确");

+ 35 - 0
lb-third/lb-third-delivery/src/main/java/com/ydd/third/delivery/makept/MaKePtCallback.java

@@ -0,0 +1,35 @@
+package com.ydd.third.delivery.makept;
+
+import com.alibaba.fastjson.JSONObject;
+import com.ydd.third.common.utils.StringUtils;
+import com.ydd.third.common.vo.ResObject;
+import com.ydd.third.common.vo.callback.MaKePtCallbackOrderVo;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+
+/**
+ * @author 叶君翔
+ * @date 2022/05/06 10:55
+ */
+@Slf4j
+@Service
+public class MaKePtCallback {
+
+    public ResObject<MaKePtCallbackOrderVo> doOrder(JSONObject params) {
+        String orderNo = params.getString("order_no");
+        String status = params.getString("status");
+        ResObject<MaKePtCallbackOrderVo> resObject = new ResObject<>();
+        if (StringUtils.isNotBlank(status) && StringUtils.isNotBlank(orderNo)) {
+            MaKePtCallbackOrderVo orderVo = params.toJavaObject(MaKePtCallbackOrderVo.class);
+            resObject.setCode(0);
+            resObject.setMsg("操作成功");
+            resObject.setData(orderVo);
+        } else {
+            resObject.setCode(1);
+            resObject.setMsg("回调参数不正确");
+        }
+        return resObject;
+    }
+
+}
+

+ 689 - 0
lb-third/lb-third-delivery/src/main/java/com/ydd/third/delivery/makept/MaKePtClient.java

@@ -0,0 +1,689 @@
+package com.ydd.third.delivery.makept;
+
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.ydd.common.utils.SnCodeUtils;
+import com.ydd.third.common.config.DeliveryConfig;
+import com.ydd.third.common.utils.AddressLngLatExchanger;
+import com.ydd.third.common.utils.StringUtils;
+import com.ydd.third.common.vo.AddressComponentDto;
+import com.ydd.third.common.vo.ResObject;
+import com.ydd.third.common.vo.dada.domain.merchant.QueryBalanceModel;
+import com.ydd.third.common.vo.dada.domain.merchant.ShopDetailModel;
+import com.ydd.third.common.vo.dada.domain.merchant.ShopUpdateModel;
+import com.ydd.third.common.vo.dada.domain.order.OrderAddTipModel;
+import com.ydd.third.common.vo.dada.domain.order.OrderReAddModel;
+import com.ydd.third.common.vo.shop.*;
+import com.ydd.third.common.vo.vo.order.*;
+import com.ydd.third.delivery.ClientHandler;
+import com.ydd.third.delivery.dada.client.DadaApiResponse;
+import com.ydd.third.delivery.dada.client.DadaRequestClient;
+import com.ydd.third.delivery.dada.service.merchant.MerchantQueryBalanceService;
+import com.ydd.third.delivery.dada.service.merchant.ShopDetailService;
+import com.ydd.third.delivery.dada.service.merchant.ShopUpdateService;
+import com.ydd.third.delivery.dada.service.order.OrderAddTipService;
+import com.ydd.third.delivery.dada.service.order.OrderReAddService;
+import com.ydd.third.delivery.makept.constant.MaKePtConstant;
+import com.ydd.third.delivery.makept.request.*;
+import com.ydd.third.delivery.makept.util.HttpClient;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.math.BigDecimal;
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * @ClassName Client
+ * @Deacription TODO
+ * @Author peakren
+ * @Date 2/4/21 10:20 PM
+ * @Version 1.0
+ **/
+@Slf4j
+@Service
+public class MaKePtClient implements ClientHandler {
+
+    private static final String SUCCESS_STATUS = "1";
+
+    private static final String FAILED_STATUS = "0";
+
+    private static final String CONTENT_TYPE_APPLICATION_JSON = "application/json";
+
+    private static final String CONTENT_TYPE_APPLICATION_WWW_FORM = "application/x-www-form-urlencoded";
+
+    @Autowired
+    private DeliveryConfig appConfig;
+
+    @Override
+    public ResObject<OrderResultVo> queryOrderDeliverFee(OrderVo order) {
+        String store_id = order.getShopNo();
+        BigDecimal latitude = order.getReceiverLat();
+        BigDecimal longitude = order.getReceiverLng();
+        String order_no = order.getOrderNo();
+
+        QueryOrderFeeRequest requestParam = new QueryOrderFeeRequest();
+        requestParam.setStore_id(store_id);
+        requestParam.setOrder_no(order_no);
+        requestParam.setLatitude(latitude);
+        requestParam.setLongitude(longitude);
+
+
+        Map<String, Object> params = new HashMap<>();
+        params.put("action_name", MaKePtConstant.QUERY_ORDER_FEE);
+        params.put("data", requestParam);
+
+        log.info("码科跑腿计价请求参数: {} ", params);
+        String result = HttpClient.post(MaKePtConstant.URL, params, CONTENT_TYPE_APPLICATION_JSON);
+        JSONObject jsonObject = JSONObject.parseObject(result);
+        log.info("码科跑腿计价返回结果: {} ", jsonObject);
+
+
+        String status = jsonObject.getString("status");
+        String msg = jsonObject.getString("msg");
+
+        ResObject<OrderResultVo> resObject = new ResObject<>();
+        if (SUCCESS_STATUS.equals(status)) {
+            JSONObject resultJson = jsonObject.getJSONObject("data");
+            if (resultJson != null) {
+                OrderResultVo orderResultVo = new OrderResultVo();
+                Double distance = resultJson.getDouble("distance");
+                orderResultVo.setDistance(distance == null ? 0 : BigDecimal.valueOf(distance).multiply(new BigDecimal(1000)).doubleValue());
+                orderResultVo.setDeliverFee(resultJson.getBigDecimal("price"));
+                orderResultVo.setDeliveryOrderNo(resultJson.getString("order_no"));
+                resObject.setData(orderResultVo);
+                resObject.setCode(0);
+                resObject.setMsg("操作成功");
+            } else {
+                resObject.setMsg("计价返回异常");
+                resObject.setCode(1);
+            }
+        } else {
+            resObject.setMsg(msg == null ? "计价失败" : msg);
+            resObject.setCode(1);
+        }
+        return resObject;
+    }
+
+    /**
+     * 新增订单
+     *
+     * @param order
+     * @return
+     */
+    @Override
+    public ResObject<OrderResultVo> createOrder(OrderVo order) {
+        String receiverCity = order.getReceiverCity() == null ? "" : order.getReceiverCity();
+        String receiverDistrictName = order.getReceiverDistrictName() == null ? "" : order.getReceiverDistrictName();
+        String receiverAddressDetail = order.getReceiverAddressWithHouseNumber() == null ? "" : order.getReceiverAddressWithHouseNumber();
+
+        SyncOrderRequest requestParam = new SyncOrderRequest();
+        requestParam.setAddress(receiverCity + receiverDistrictName + receiverAddressDetail);
+        requestParam.setLatitude(order.getReceiverLat());
+        requestParam.setLongitude(order.getReceiverLng());
+        requestParam.setOrder_no(order.getOrderNo());
+        // 订单状态,码科跑腿只需要同步待接单状态
+        requestParam.setOrder_status(1);
+        requestParam.setOrder_time(System.currentTimeMillis() / 1000);
+        // 是否预约单(1:即时,2:预约,0:不区分,默认)
+        requestParam.setBook(1);
+        requestParam.setOrder_platform(Integer.valueOf(order.getOrderSource()));
+
+        requestParam.setName(order.getReceiverName());
+        requestParam.setPhone(order.getReceiverPhone());
+        requestParam.setProducts(JSONObject.toJSONString(order.getMaKePtProducts()));
+        requestParam.setStore_id(order.getShopNo());
+        requestParam.setRemark(order.getRemark() == null ? " " : order.getRemark());
+        requestParam.setGet_time(null);
+
+        requestParam.setHidden_phone(" ");
+        requestParam.setThird_sn(order.getPoiSeq() == null ? "0" : order.getPoiSeq());
+
+        Map<String, Object> params = new HashMap<>();
+        params.put("action_name", MaKePtConstant.SYNC_ORDER);
+        params.put("data", requestParam);
+
+        log.info("码科跑腿下单请求参数: {} ", params);
+        String result = HttpClient.post(MaKePtConstant.URL, params, CONTENT_TYPE_APPLICATION_JSON);
+        JSONObject jsonObject = JSONObject.parseObject(result);
+        log.info("码科跑腿下单返回结果: {} ", jsonObject);
+
+
+        String status = jsonObject.getString("status");
+        String msg = jsonObject.getString("msg");
+
+        ResObject<OrderResultVo> resObject = new ResObject<>();
+        if (SUCCESS_STATUS.equals(status)) {
+            JSONObject dataJson = jsonObject.getJSONObject("data");
+            OrderResultVo orderResultVo = new OrderResultVo();
+            if (dataJson != null) {
+                String order_no = dataJson.getString("order_no");
+                orderResultVo.setDeliveryOrderNo(order_no == null ? SnCodeUtils.createSn() : order_no);
+                resObject.setData(orderResultVo);
+            } else {
+                orderResultVo.setDeliveryOrderNo(SnCodeUtils.createSn());
+            }
+            resObject.setData(orderResultVo);
+            resObject.setCode(0);
+            resObject.setMsg("操作成功");
+        } else {
+            resObject.setMsg(msg == null ? "下单失败" : msg);
+            resObject.setCode(1);
+        }
+        return resObject;
+    }
+
+    /**
+     * 取消订单
+     *
+     * @param cancelOrderVo
+     * @return 取消订单结果
+     */
+    @Override
+    public ResObject<CancelOrderResultVo> cancelOrder(CancelOrderVo cancelOrderVo) {
+        SyncOrderStatusRequest requestParam = new SyncOrderStatusRequest();
+        requestParam.setOrder_no(cancelOrderVo.getOrderNo());
+        // 目前只有取消时需要同步订单状态, 固定为7
+        requestParam.setOrder_status(7);
+        requestParam.setStore_id(cancelOrderVo.getLbShopCode());
+        requestParam.setCancel_reason(cancelOrderVo.getCancelCode());
+        requestParam.setCancel_reason_text(cancelOrderVo.getCancelReason());
+
+        Map<String, Object> params = new HashMap<>();
+        params.put("action_name", MaKePtConstant.SYNC_ORDER_STATUS);
+        params.put("data", requestParam);
+
+        log.info("码科跑腿取消订单请求参数: {} ", params);
+        String result = HttpClient.post(MaKePtConstant.URL, params, CONTENT_TYPE_APPLICATION_JSON);
+        JSONObject jsonObject = JSONObject.parseObject(result);
+        log.info("码科跑腿取消订单返回结果: {} ", jsonObject);
+
+
+        String status = jsonObject.getString("status");
+        String msg = jsonObject.getString("msg");
+
+        ResObject<CancelOrderResultVo> resObject = new ResObject<>();
+        if (SUCCESS_STATUS.equals(status)) {
+            resObject.setCode(0);
+            resObject.setMsg("操作成功");
+        } else {
+            resObject.setCode(1);
+            resObject.setMsg(msg);
+            log.error("errCode:" + status + ", errMsg:" + msg);
+        }
+        return resObject;
+    }
+
+    /**
+     * 订单增加小费
+     *
+     * @param orderTipsVo
+     * @return
+     */
+    @Override
+    public ResObject<OrderTipsResultVo> orderAddTip(OrderTipsVo orderTipsVo) {
+        String orderId = orderTipsVo.getOrderNo(); //jsonParams.getString("orderId");
+
+        BigDecimal tips = orderTipsVo.getTips(); //jsonParams.getBigDecimal("tips");
+        String cityCode = orderTipsVo.getCityCode(); //jsonParams.getString("cityCode");
+        String merchantId = orderTipsVo.getMerchantId();
+        OrderAddTipModel orderAddTipModel = new OrderAddTipModel();
+        orderAddTipModel.setOrderId(orderId);
+        orderAddTipModel.setTips(tips);
+        orderAddTipModel.setCityCode(cityCode);
+        //city_code
+
+        // 3.初始化service
+        OrderAddTipService orderService = new OrderAddTipService(orderAddTipModel.toJson());
+
+        // 4.初始化客户端
+        DadaRequestClient dadaClient = new DadaRequestClient(orderService, appConfig, merchantId,orderTipsVo.getIsDirectDelivery());
+        DadaApiResponse dadaResponse = dadaClient.callRpc();
+        String name ="达达";
+        if (orderTipsVo.getIsDirectDelivery() == 1){
+            name ="达达优质";
+        }
+        int code = dadaResponse.getCode();
+        String status = dadaResponse.getStatus();
+        ResObject<OrderTipsResultVo> resObject = new ResObject<>();
+        if (code == 0 && status.equals("success")) {
+            OrderTipsResultVo resultVo = new OrderTipsResultVo();
+            resultVo.setOrderNo(orderId);
+            resultVo.setTips(tips);
+            resultVo.setResData(dadaResponse.getResult());
+            resObject.setCode(0);
+            resObject.setData(resultVo);
+            resObject.setMsg("操作成功");
+            log.error(name+"加小费返回:" + dadaResponse.getMsg());
+        } else {
+            resObject.setCode(1);
+            resObject.setMsg(dadaResponse.getMsg());
+            log.error(name+"加小费异常 errCode:" + code + ", errMsg:" + dadaResponse.getMsg());
+        }
+        return resObject;
+    }
+
+    /**
+     * 订单详情查询
+     *
+     * @param
+     * @return
+     */
+    @Override
+    public ResObject<OrderQueryResultVo> queryOrderInfo(OrderQueryVo orderQueryVo) {
+        QueryOrderStatusRequest requestParam = new QueryOrderStatusRequest();
+        requestParam.setOrder_no(orderQueryVo.getOrderNo());
+        requestParam.setStore_id(orderQueryVo.getLbShopCode());
+
+        Map<String, Object> params = new HashMap<>();
+        params.put("action_name", MaKePtConstant.QUERY_ORDER_STATUS);
+        params.put("data", requestParam);
+
+        log.info("码科跑腿获取订单状态请求参数: {} ", params);
+        String result = HttpClient.post(MaKePtConstant.URL, params, CONTENT_TYPE_APPLICATION_JSON);
+        JSONObject jsonObject = JSONObject.parseObject(result);
+        log.info("码科跑腿获取订单状态返回结果: {} ", jsonObject);
+
+        String status = jsonObject.getString("status");
+        String msg = jsonObject.getString("msg");
+
+        ResObject<OrderQueryResultVo> resObject = new ResObject<>();
+        if (SUCCESS_STATUS.equals(status)) {
+
+            JSONObject dataJson = jsonObject.getJSONObject("data");
+
+            OrderQueryResultVo resultVo = new OrderQueryResultVo();
+            resultVo.setOrderNo(dataJson.getString("order_no"));
+            resultVo.setOrderStatusDesc(dataJson.getString("status"));
+            resultVo.setRiderName(dataJson.getString("provider_real_name"));
+            resultVo.setRiderPhone(dataJson.getString("provider_mobile"));
+
+            resObject.setData(resultVo);
+            resObject.setCode(0);
+            resObject.setMsg("操作成功");
+        } else {
+            resObject.setCode(1);
+            resObject.setMsg(msg);
+            log.error("status: {}, errMsg: {}", status, msg);
+        }
+        return resObject;
+    }
+
+    /**
+     * 获取骑手当前位置(信息)
+     *
+     * @param riderLocationVo
+     * @return
+     */
+    @Override
+    public ResObject<RiderLocationResultVo> getRiderLocation(RiderLocationVo riderLocationVo) {
+        ResObject<RiderLocationResultVo> res = new ResObject<>();
+        res.setMsg("操作失败");
+        res.setCode(1);
+
+        QueryRiderLocationRequest requestParam = new QueryRiderLocationRequest();
+        requestParam.setOrder_no(riderLocationVo.getOrderNo());
+        Map<String, Object> params = new HashMap<>();
+        params.put("action_name", MaKePtConstant.QUERY_RIDER_LOCATION);
+        params.put("data", requestParam);
+
+        log.info("码科跑腿获取骑手位置请求参数: {}", params);
+        String result = HttpClient.post(MaKePtConstant.URL, params, CONTENT_TYPE_APPLICATION_JSON);
+        JSONObject jsonObject = JSONObject.parseObject(result);
+        log.info("码科跑腿获取骑手位置返回结果: {}", jsonObject);
+
+        String status = jsonObject.getString("status");
+        String msg = jsonObject.getString("msg");
+
+        if (SUCCESS_STATUS.equals(status)) {
+            JSONArray array = jsonObject.getJSONArray("data");
+            if (array != null && array.size() == 2) {
+                RiderLocationResultVo resultVo = new RiderLocationResultVo();
+                resultVo.setLat(new BigDecimal(array.get(1).toString()));
+                resultVo.setLng(new BigDecimal(array.get(0).toString()));
+                res.setCode(0);
+                res.setMsg("操作成功");
+                res.setData(resultVo);
+            } else {
+                res.setMsg("查询结果异常");
+                res.setCode(1);
+            }
+        } else {
+            res.setMsg(msg == null ? "没有查询到相应的数据" : msg);
+            res.setCode(1);
+        }
+        return res;
+    }
+
+    /**
+     * 同步门店
+     *
+     * @param shopVo
+     * @return
+     */
+    @Override
+    public ResObject<ShopResultVo> createShop(ShopVo shopVo) {
+        SyncStoreRequest requestParam = new SyncStoreRequest();
+        requestParam.setStore_name(shopVo.getShopName());
+        requestParam.setStore_address(shopVo.getShopAddress());
+        requestParam.setProvince(shopVo.getProvinceName());
+        requestParam.setCity(shopVo.getCityName());
+        requestParam.setDistrict(shopVo.getAreaName());
+        requestParam.setLatitude(shopVo.getShopLat());
+        requestParam.setLongitude(shopVo.getShopLng());
+        requestParam.setPhone(shopVo.getContactPhone());
+        requestParam.setStore_id(shopVo.getLbShopCode());
+
+        Map<String, Object> params = new HashMap<>();
+        params.put("action_name", MaKePtConstant.SYNC_STORE);
+        params.put("data", requestParam);
+
+        log.info("码科跑腿同步店铺请求参数: {}", params);
+        String result = HttpClient.post(MaKePtConstant.URL, params, CONTENT_TYPE_APPLICATION_JSON);
+        JSONObject jsonObject = JSONObject.parseObject(result);
+        log.info("码科跑腿同步店铺返回结果: {}", jsonObject);
+
+        String status = jsonObject.getString("status");
+        String msg = jsonObject.getString("msg");
+
+        ResObject<ShopResultVo> resObject = new ResObject<>();
+        if (SUCCESS_STATUS.equals(status)) {
+            resObject.setData(new ShopResultVo());
+            resObject.setCode(0);
+            resObject.setMsg("操作成功");
+        } else {
+            resObject.setCode(1);
+            resObject.setMsg(msg);
+            log.error("status: {}, errMsg: {}", status, msg);
+        }
+        return resObject;
+    }
+
+    /**
+     * 更新门店
+     *
+     * @param shopVo
+     * @return
+     */
+    @Override
+    public ResObject<ShopResultVo> updateShop(ShopVo shopVo) {
+        //JSONObject jsonParams = JSONObject.parseObject(jsonParamsStr);
+        String originShopId = shopVo.getShopId(); //jsonParams.getString("originShopId");
+        //不可更新门店编码
+        // String newShopId = shopVo.getShopId(); //jsonParams.getString("newShopId");
+        String stationName = shopVo.getShopName();//jsonParams.getString("stationName");
+        Integer business = shopVo.getBusiness();//shopVo.getShopName(); //jsonParams.getInteger("business");
+        String cityName = shopVo.getCityName(); //jsonParams.getString("cityName");
+        String areaName = shopVo.getAreaName(); //jsonParams.getString("areaName");
+        String stationAddress = shopVo.getShopAddress(); //jsonParams.getString("stationAddress");
+        BigDecimal lng = shopVo.getShopLng();//jsonParams.getBigDecimal("lng");
+        BigDecimal lat = shopVo.getShopLat(); //jsonParams.getBigDecimal("lat");
+        String contactName = shopVo.getContactName(); //jsonParams.getString("contactName");
+        String phone = shopVo.getContactPhone(); //jsonParams.getString("phone");
+        Integer shopStatus = shopVo.getShopStatus(); //jsonParams.getInteger("status");
+
+        String merchantId = shopVo.getMerchantId();
+        ShopUpdateModel shopModel = new ShopUpdateModel();
+        // 根据实际信息来填写门店地址
+        shopModel.setOriginShopId(originShopId);
+        //shopModel.setNewShopId(newShopId);
+        shopModel.setStationName(stationName);
+        shopModel.setBusiness(business);
+        if (StringUtils.isBlank(areaName)){
+            areaName = getAreaName(lng.toString(), lat.toString(), areaName, cityName);
+        }else if (areaName.endsWith("市")){
+            cityName = areaName;
+            areaName = getAreaName(lng.toString(), lat.toString(), areaName, cityName);
+        }
+//        shopModel.setCityName(cityName);
+//        shopModel.setAreaName(areaName);
+        shopModel.setStationAddress(stationAddress);
+        shopModel.setLng(lng);
+        shopModel.setLat(lat);
+        shopModel.setContactName(contactName);
+        shopModel.setPhone(phone);
+        shopModel.setStatus(shopStatus);
+
+        // 3.初始化service
+        ShopUpdateService shopUpdateService = new ShopUpdateService(shopModel.toJson());
+        // 4.初始化客户端
+        DadaRequestClient dadaClient = new DadaRequestClient(shopUpdateService, appConfig, merchantId,shopVo.getIsDirectDelivery());
+        DadaApiResponse dadaResponse = dadaClient.callRpc();
+        int code = dadaResponse.getCode();
+        String status = dadaResponse.getStatus();
+        ResObject<ShopResultVo> resObject = new ResObject<>();
+        if (code == 0 && status.equals("success")) {
+            resObject.setCode(0);
+            ShopResultVo shopResultVo = new ShopResultVo();
+            shopResultVo.setShopId(originShopId);
+            shopResultVo.setResData(dadaResponse.getResult());
+            resObject.setData(shopResultVo);
+            resObject.setMsg("操作成功");
+        } else {
+            resObject.setCode(1);
+            resObject.setMsg(dadaResponse.getMsg());
+            log.error("errCode:" + code + ", errMsg:" + dadaResponse.getMsg());
+        }
+        return resObject;
+        //return JSONUtil.toJson(resObject);
+    }
+
+    public String getAreaName(String lng,String lat,String areaName,String cityName){
+        if (StringUtils.isBlank(areaName)) {
+            // 没有区域的门店,重新调用高德地图[地理/逆地理编码]接口
+            AddressComponentDto result = AddressLngLatExchanger.geocodeRegeo(lng.toString(), lat.toString());
+            if (result != null) {
+                areaName = result.getTownship();
+                if ("东莞市".equals(cityName)){
+                    if (areaName.endsWith("街道")) {
+                        areaName = areaName.replace("街道", "区");
+                    }
+                    if (areaName.equals("松山湖管委会")){
+                        areaName = "松山湖高新区";
+                    }
+                }
+            }
+        }else if (areaName.endsWith("市")){
+            // 以市结尾的城市,也要替换,如昆山
+            AddressComponentDto result1 = AddressLngLatExchanger.geocodeRegeo(lng.toString(),lat.toString());
+            if (result1 != null){
+                areaName = result1.getTownship();
+            }
+            if ("昆山市".equals(cityName)){
+                if ("周庄镇".equals(areaName)){
+                    areaName = "周庄";
+                }
+            }
+            if (cityName.equals("常熟市")){
+                if (areaName.equals("虞山街道")){
+                    areaName = "虞山镇";
+                }
+                if ("常熟经济技术开发区".equals(areaName) || "江苏省常熟高新技术产业开发区".equals(areaName)){
+                    areaName = "经济开发区";
+                }
+            }
+
+        }
+        return areaName;
+    }
+
+    /**
+     * 门店详情
+     *
+     * @param
+     * @return
+     */
+    @Override
+    public ResObject<ShopQueryResultVo> queryShop(ShopQueryVo shopQueryVo) {
+
+        String originShopId = shopQueryVo.getShopId(); //jsonParams.getString("originShopId");
+        String merchantId = shopQueryVo.getMerchantId();
+        ShopDetailModel shopModel = new ShopDetailModel();
+        // 根据实际信息来填写
+        shopModel.setOriginShopId(originShopId);
+
+        // 3.初始化service
+        ShopDetailService shopDetailService = new ShopDetailService(shopModel.toJson());
+        // 4.初始化客户端
+        DadaRequestClient dadaClient = new DadaRequestClient(shopDetailService, appConfig, merchantId,shopQueryVo.getIsDirectDelivery());
+        DadaApiResponse dadaResponse = dadaClient.callRpc();
+        int code = dadaResponse.getCode();
+        String status = dadaResponse.getStatus();
+        ResObject<ShopQueryResultVo> resObject = new ResObject<>();
+        if (code == 0 && status.equals("success")) {
+            JSONObject dataJson = (JSONObject) dadaResponse.getResult();
+            ShopQueryResultVo resultVo = new ShopQueryResultVo();
+            resultVo.setShopId(dataJson.getString("origin_shop_id"));
+            resultVo.setShopName(dataJson.getString("station_name"));
+            resultVo.setBusiness(dataJson.getInteger("business"));
+            resultVo.setCityName(dataJson.getString("city_name"));
+            resultVo.setAreaName(dataJson.getString("area_name"));
+            resultVo.setShopAddress(dataJson.getString("station_address"));
+            resultVo.setShopLng(dataJson.getBigDecimal("lng"));
+            resultVo.setShopLat(dataJson.getBigDecimal("lat"));
+            resultVo.setContactName(dataJson.getString("contact_name"));
+            resultVo.setContactPhone(dataJson.getString("phone"));
+            Integer shopStatus = dataJson.getInteger("status");
+            String shopStatusDesc = "";
+            if (shopStatus == 0) {
+                shopStatusDesc = "门店已下线";
+            } else if (shopStatus == 1) {
+                shopStatusDesc = "门店已激活";
+            }
+            dataJson.put("shop_status_desc", shopStatusDesc);
+            resultVo.setShopStatus(shopStatus);
+            resultVo.setShopStatusDesc(shopStatusDesc);
+            resultVo.setResData(dataJson);
+            resObject.setCode(0);
+            resObject.setData(resultVo);
+            resObject.setMsg("操作成功");
+        } else {
+            resObject.setCode(1);
+            resObject.setMsg(dadaResponse.getMsg());
+            log.error("errCode:" + code + ", errMsg:" + dadaResponse.getMsg());
+        }
+        return resObject;
+    }
+
+    /**
+     * 查询账户余额
+     * @param queryAmount
+     * @return
+     */
+    @Override
+    public ResObject<AmountResultVo> queryAmount(QueryAmount queryAmount) {
+
+        String merchantId = queryAmount.getMerchantId();
+        QueryBalanceModel queryBalanceModel = new QueryBalanceModel();
+        queryBalanceModel.setCategory(1);
+
+        // 3.初始化service
+        MerchantQueryBalanceService service = new MerchantQueryBalanceService(queryBalanceModel.toJson());
+
+        // 4.初始化客户端
+        DadaRequestClient dadaClient = new DadaRequestClient(service , appConfig, merchantId,queryAmount.getIsDirectDelivery());
+        DadaApiResponse dadaResponse = dadaClient.callRpc();
+        log.info("达达余额返回---:"+JSONObject.toJSONString(dadaResponse));
+        int code = dadaResponse.getCode();
+        String status = dadaResponse.getStatus();
+        ResObject resObject = new ResObject();
+        if (code == 0 && status.equals("success")) {
+            resObject.setCode(0);
+            // resObject.setData(dadaResponse.getResult());
+            JSONObject resultJson = (JSONObject) dadaResponse.getResult();
+            AmountResultVo amountResultVo = new AmountResultVo();
+            amountResultVo.setBalanceAmount(resultJson.getBigDecimal("deliverBalance"));
+            amountResultVo.setResData(resultJson);
+            resObject.setData(amountResultVo);
+            resObject.setMsg("操作成功");
+        } else {
+            resObject.setCode(1);
+            resObject.setMsg(dadaResponse.getMsg());
+            log.error("errCode:" + code + ", errMsg:" + dadaResponse.getMsg());
+        }
+        return resObject;
+    }
+
+
+    /**
+     * 重新发布订单
+     *
+     * @param order
+     * @return
+     */
+    public ResObject reAddOrder(OrderVo order) {
+
+        // String cityName = jsonParams.getString("cityName");
+        String shopNo = order.getShopNo(); //jsonParams.getString("shopNo");
+        String originId = order.getOrderNo(); //jsonParams.getString("originId");
+        String cityCode = order.getCityCode(); //jsonParams.getString("cityCode");
+        BigDecimal cargoPrice = order.getOrderMoney(); // getjsonParams.getBigDecimal("cargoPrice");
+        String receiverName = order.getReceiverName(); //jsonParams.getString("receiverName");
+        String receiverAddress = order.getReceiverAddressWithHouseNumber(); //jsonParams.getString("receiverAddress");
+        BigDecimal receiverLat = order.getReceiverLat(); //jsonParams.getBigDecimal("receiverLat");
+        BigDecimal receiverLng = order.getReceiverLng(); //jsonParams.getBigDecimal("receiverLng");
+        String receiverPhone = order.getReceiverPhone(); //jsonParams.getString("receiverPhone");
+        String callback = order.getCallback(); //jsonParams.getString("callback");
+        Integer cargoType = order.getGoodsType(); //jsonParams.getInteger("cargoType");
+        BigDecimal cargoWeight = order.getWeight(); //jsonParams.getBigDecimal("cargoWeight");
+        Integer cargoNum = order.getGoodsNum(); //物品数量
+        Integer isUseInsurance = 0; //jsonParams.getInteger("isUseInsurance");
+        BigDecimal tips = order.getTips(); //jsonParams.getBigDecimal("tips");
+        Integer delayPublishTime = 0;
+        if (null != order.getDelayPublishTime()) {
+            delayPublishTime = (int) ((order.getDelayPublishTime()).getTime() / 1000);
+        }
+        String merchantId = order.getMerchantId();
+        OrderReAddModel orderReAddModel = new OrderReAddModel();
+        orderReAddModel.setShopNo(shopNo);
+        orderReAddModel.setOriginId(originId);
+        // String cityCode = getCityCode(cityName);
+        orderReAddModel.setCityCode(cityCode);
+        orderReAddModel.setCargoPrice(cargoPrice);
+        orderReAddModel.setIsPrepay(0); //是否需要垫付0表示否
+        // 填写收货人信息
+        orderReAddModel.setReceiverName(receiverName);
+        orderReAddModel.setReceiverAddress(receiverAddress);
+        orderReAddModel.setReceiverLat(receiverLat);
+        orderReAddModel.setReceiverLng(receiverLng);
+        orderReAddModel.setReceiverPhone(receiverPhone);
+        // 设置回调url, 订单状态每次变更就会往该url发送通知(参见回调接口)
+        orderReAddModel.setCallback(callback);
+        orderReAddModel.setCargoType(cargoType);
+        orderReAddModel.setCargoWeight(cargoWeight);
+        orderReAddModel.setIsUseInsurance(isUseInsurance);
+        orderReAddModel.setTips(tips);
+        orderReAddModel.setCargoNum(cargoNum);
+        orderReAddModel.setDelayPublishTime(delayPublishTime);
+
+        // 3.初始化service
+        OrderReAddService orderService = new OrderReAddService(orderReAddModel.toJson());
+
+        // 4.初始化客户端
+        DadaRequestClient dadaClient = new DadaRequestClient(orderService, appConfig, merchantId,0);
+        DadaApiResponse dadaResponse = dadaClient.callRpc();
+        int code = dadaResponse.getCode();
+        String status = dadaResponse.getStatus();
+        ResObject resObject = new ResObject();
+        if (code == 0 && status.equals("success")) {
+            resObject.setCode(0);
+            // resObject.setData(dadaResponse.getResult());
+            JSONObject resultJson = (JSONObject) dadaResponse.getResult();
+            OrderResultVo orderResultVo = new OrderResultVo();
+            orderResultVo.setDistance(resultJson.getDouble("distance"));
+            orderResultVo.setDeliverFee(resultJson.getBigDecimal("deliverFee"));
+            orderResultVo.setDeliveryOrderNo(resultJson.getString("deliveryNo"));
+            orderResultVo.setResData(dadaResponse.getResult());
+            resObject.setData(orderResultVo);
+            resObject.setMsg("操作成功");
+        } else {
+            resObject.setCode(1);
+            resObject.setMsg(dadaResponse.getMsg());
+            log.error("errCode:" + code + ", errMsg:" + dadaResponse.getMsg());
+        }
+        return resObject;
+    }
+
+
+}

+ 45 - 0
lb-third/lb-third-delivery/src/main/java/com/ydd/third/delivery/makept/constant/MaKePtConstant.java

@@ -0,0 +1,45 @@
+package com.ydd.third.delivery.makept.constant;
+
+/**
+ * 码科跑腿常量
+ * @author 叶君翔
+ * @date 2022/05/06 10:37
+ */
+public class MaKePtConstant {
+
+    /**
+     * http://jh.99make.com/index/make_order/common
+     */
+    public final static String URL = "http://liebao.99make.com/index/make_order/common";
+
+    /**
+     * 同步店铺
+     */
+    public final static String SYNC_STORE = "store.postStoreInfo";
+
+    /**
+     * 同步订单(下单)
+     */
+    public final static String SYNC_ORDER = "order.addOrder";
+
+    /**
+     * 同步订单状态
+     */
+    public final static String SYNC_ORDER_STATUS = "order.updateOrderStatus";
+
+    /**
+     * 获取订单配送费
+     */
+    public final static String QUERY_ORDER_FEE = "order.serviceFee";
+
+    /**
+     * 获取接单员经纬度
+     */
+    public final static String QUERY_RIDER_LOCATION = "order.getProviderLnglat";
+
+    /**
+     * 获取订单状态
+     */
+    public final static String QUERY_ORDER_STATUS = "order.getStatus";
+
+}

+ 35 - 0
lb-third/lb-third-delivery/src/main/java/com/ydd/third/delivery/makept/request/QueryOrderFeeRequest.java

@@ -0,0 +1,35 @@
+package com.ydd.third.delivery.makept.request;
+
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+/**
+ *  码科跑腿 订单计费请求参数
+ * @author 叶君翔
+ * @date 2022/05/07 11:19
+ */
+@Data
+public class QueryOrderFeeRequest {
+
+    /**
+     * 猎豹子订单号
+     */
+    private String order_no;
+
+    /**
+     * 猎豹门店id
+     */
+    private String store_id;
+
+    /**
+     * 收件人经度
+     */
+    private BigDecimal longitude;
+
+    /**
+     * 手机人纬度
+     */
+    private BigDecimal latitude;
+
+}

+ 23 - 0
lb-third/lb-third-delivery/src/main/java/com/ydd/third/delivery/makept/request/QueryOrderStatusRequest.java

@@ -0,0 +1,23 @@
+package com.ydd.third.delivery.makept.request;
+
+import lombok.Data;
+
+/**
+ *  码科跑腿 订单查询请求参数
+ * @author 叶君翔
+ * @date 2022/05/07 11:19
+ */
+@Data
+public class QueryOrderStatusRequest {
+
+    /**
+     * 猎豹子订单号
+     */
+    private String order_no;
+
+    /**
+     * 猎豹门店id
+     */
+    private String store_id;
+
+}

+ 15 - 0
lb-third/lb-third-delivery/src/main/java/com/ydd/third/delivery/makept/request/QueryRiderLocationRequest.java

@@ -0,0 +1,15 @@
+package com.ydd.third.delivery.makept.request;
+
+import lombok.Data;
+
+/**
+ *  码科跑腿 获取骑手位置请求参数
+ * @author 叶君翔
+ * @date 2022/05/06 15:44
+ */
+@Data
+public class QueryRiderLocationRequest {
+
+    private String order_no;
+
+}

+ 97 - 0
lb-third/lb-third-delivery/src/main/java/com/ydd/third/delivery/makept/request/SyncOrderRequest.java

@@ -0,0 +1,97 @@
+package com.ydd.third.delivery.makept.request;
+
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+/**
+ *  码科跑腿 同步订单请求参数
+ * @author 叶君翔
+ * @date 2022/05/07 15:24
+ */
+@Data
+public class SyncOrderRequest {
+
+    /**
+     * 收件人地址
+     */
+    private String address;
+
+    /**
+     * 收件人纬度
+     */
+    private BigDecimal latitude;
+
+    /**
+     * 收件人经度
+     */
+    private BigDecimal longitude;
+
+    /**
+     * 猎豹订单号
+     */
+    private String order_no;
+
+    /**
+     * 猎豹订单配送状态(只有待接单)
+     */
+    private Integer order_status;
+
+    /**
+     * 下单时间
+     */
+    private Long order_time;
+
+    /**
+     * 是否预约单(1:即时,2:预约,0:不区分,默认)
+     * 猎豹均传1即可
+     */
+    private Integer book;
+
+    /**
+     * 收件人姓名
+     */
+    private String name;
+
+    /**
+     * 订单平台
+     * 1:美团 ,2:饿了么, 3:饿百零售, 4:手工单,5:有赞,6:京东,7:抖音
+     */
+    private Integer order_platform;
+
+    /**
+     * 收件人电话
+     */
+    private String phone;
+
+    /**
+     * 物品信息
+     */
+    private String products;
+
+    /**
+     * 预计取件时间(预计配送时间)
+     */
+    private Integer get_time;
+
+    /**
+     * 猎豹shop_id
+     */
+    private String store_id;
+
+    /**
+     * 订单备注
+     */
+    private String remark;
+
+    /**
+     * 收件人隐私号
+     */
+    private String hidden_phone;
+
+    /**
+     * 订单流水号
+     */
+    private String third_sn;
+
+}

+ 23 - 0
lb-third/lb-third-delivery/src/main/java/com/ydd/third/delivery/makept/request/SyncOrderStatusRequest.java

@@ -0,0 +1,23 @@
+package com.ydd.third.delivery.makept.request;
+
+import lombok.Data;
+
+/**
+ *  码科跑腿 同步订单状态请求参数
+ * @author 叶君翔
+ * @date 2022/05/06 15:44
+ */
+@Data
+public class SyncOrderStatusRequest {
+
+    private String order_no;
+
+    private Integer order_status;
+
+    private String store_id;
+
+    private Integer cancel_reason;
+
+    private String cancel_reason_text;
+
+}

+ 33 - 0
lb-third/lb-third-delivery/src/main/java/com/ydd/third/delivery/makept/request/SyncStoreRequest.java

@@ -0,0 +1,33 @@
+package com.ydd.third.delivery.makept.request;
+
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+/**
+ * 码科跑腿 - 同步店铺
+ * @author 叶君翔
+ * @date 2022/05/09 11:55
+ */
+@Data
+public class SyncStoreRequest {
+
+    private String store_name;
+
+    private String store_address;
+
+    private String province;
+
+    private String city;
+
+    private String district;
+
+    private BigDecimal latitude;
+
+    private BigDecimal longitude;
+
+    private String phone;
+
+    private String store_id;
+
+}

+ 97 - 0
lb-third/lb-third-delivery/src/main/java/com/ydd/third/delivery/makept/util/HttpClient.java

@@ -0,0 +1,97 @@
+package com.ydd.third.delivery.makept.util;
+
+import com.alibaba.fastjson.JSONObject;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.http.Consts;
+import org.apache.http.HttpEntity;
+import org.apache.http.StatusLine;
+import org.apache.http.client.config.RequestConfig;
+import org.apache.http.client.methods.CloseableHttpResponse;
+import org.apache.http.client.methods.HttpPost;
+import org.apache.http.entity.StringEntity;
+import org.apache.http.impl.client.CloseableHttpClient;
+import org.apache.http.message.BasicHeader;
+import org.apache.http.protocol.HTTP;
+import org.apache.http.util.EntityUtils;
+
+import java.io.IOException;
+import java.util.Map;
+
+import static org.apache.http.impl.client.HttpClients.createDefault;
+
+/**
+ * 发送Http请求工具类
+ */
+@Slf4j
+public class HttpClient {
+
+    private static final int DEFAULT_TIMEOUT = 10000;
+    private static final Log logger = LogFactory.getLog(HttpClient.class);
+
+    /**
+     * post 方法
+     *
+     * @param url
+     * @param params
+     * @return
+     * @throws IOException
+     */
+    public static String post(String url, Map<String, Object> params, String contentType)  {
+        if (StringUtils.isEmpty(url) || params == null || params.isEmpty()) {
+            return "";
+        }
+
+        CloseableHttpClient httpClient = createDefault();
+        CloseableHttpResponse response = null;
+        String result = null;
+
+        try {
+            HttpPost httpPost = new HttpPost(url);
+            RequestConfig requestConfig = RequestConfig
+                    .custom()
+                    .setSocketTimeout(DEFAULT_TIMEOUT)
+                    .setConnectTimeout(DEFAULT_TIMEOUT)
+                    .build();//设置请求和传输超时时间
+
+            httpPost.setConfig(requestConfig);
+            httpPost.setHeader("Charset", "UTF-8");
+
+            httpPost.setHeader("Content-Type", contentType);
+            StringEntity stringEntity = new StringEntity(JSONObject.toJSONString(params), Consts.UTF_8);
+            stringEntity.setContentType(new BasicHeader(HTTP.CONTENT_TYPE, contentType));
+            httpPost.setEntity(stringEntity);
+
+            response = httpClient.execute(httpPost);
+            StatusLine statusLine = response.getStatusLine();
+            logger.info(String.format("request url: %s, params: %s, response status: %s",
+                    url, JSONObject.toJSONString(params), statusLine.getStatusCode()));
+
+            HttpEntity entity = response.getEntity();
+            result = EntityUtils.toString(entity, Consts.UTF_8);
+            logger.info(String.format("response data: %s", result));
+
+            return result == null ? "" : result.trim();
+
+        } catch (IOException e) {
+            e.printStackTrace();
+            return null;
+        } finally {
+            try {
+                if (response != null) {
+                    response.close();
+                }
+                if (httpClient != null) {
+                    httpClient.close();
+                }
+            } catch (IOException e) {
+                logger.error("close http client failed", e);
+            }
+        }
+
+    }
+
+}
+