Browse Source

Merge branch 'dev/2024/0506/update-admin-Y' of feifan/mall-backend-admin into master

添加订单的订阅和推送
Yangzw 10 months ago
parent
commit
2428dc763d

+ 21 - 0
feifan-module-mall/feifan-module-trade-api/src/main/java/cn/newfeifan/mall/module/trade/enums/order/TradeOrderSubscribeStatusEnum.java

@@ -0,0 +1,21 @@
+package cn.newfeifan.mall.module.trade.enums.order;
+
+import lombok.Getter;
+import lombok.RequiredArgsConstructor;
+
+@RequiredArgsConstructor
+@Getter
+public enum TradeOrderSubscribeStatusEnum {
+    UNSUBSCRIBE(0, "未订阅"),
+    SUBSCRIBE(1, "已订阅"),
+    abnormal(2,"异常");
+
+    /**
+     * 状态值
+     */
+    private final Integer status;
+    /**
+     * 状态名
+     */
+    private final String name;
+}

+ 27 - 0
feifan-module-mall/feifan-module-trade-biz/src/main/java/cn/newfeifan/mall/module/trade/controller/admin/order/TradeOrderController.java

@@ -29,6 +29,8 @@ import cn.newfeifan.mall.module.trade.service.order.TradeOrderLogService;
 import cn.newfeifan.mall.module.trade.service.order.TradeOrderQueryService;
 import cn.newfeifan.mall.module.trade.service.order.TradeOrderUpdateService;
 import com.google.common.collect.Maps;
+import com.kuaidi100.sdk.response.SubscribeResp;
+import com.kuaidi100.sdk.utils.SignUtils;
 import io.swagger.v3.oas.annotations.Operation;
 import io.swagger.v3.oas.annotations.Parameter;
 import io.swagger.v3.oas.annotations.tags.Tag;
@@ -38,6 +40,7 @@ import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
 
 import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
 import javax.validation.Valid;
 import java.util.*;
 import java.util.stream.Collectors;
@@ -145,6 +148,30 @@ public class TradeOrderController {
         tradeOrderUpdateService.deliveryOrder(deliveryReqVO);
         return success(true);
     }
+    @PostMapping("/callBackUrl")
+    @Operation(summary = "订单订阅回调")
+    public SubscribeResp callBackUrl(HttpServletRequest request){
+        String param = request.getParameter("param");
+        String sign = request.getParameter("sign");
+        String orderId = request.getParameter("orderId");
+
+        //建议记录一下这个回调的内容,方便出问题后双方排查问题
+        log.debug("快递100订阅推送回调结果|{}|{}",param,sign);
+        //订阅时传的salt,没有可以忽略
+        String salt = "";
+        String ourSign = SignUtils.sign(param + salt);
+        log.info("订单:{},回调param:{}",orderId,param);
+        SubscribeResp subscribeResp = new SubscribeResp();
+        subscribeResp.setResult(Boolean.TRUE);
+        subscribeResp.setReturnCode("200");
+        subscribeResp.setMessage("成功");
+        //加密如果相等,属于快递100推送;否则可以忽略掉当前请求
+        if (ourSign.equals(sign)){
+            //TODO 业务处理
+            return subscribeResp;
+        }
+        return null;
+    }
 
     @PutMapping("/update-remark")
     @Operation(summary = "订单备注")

+ 9 - 0
feifan-module-mall/feifan-module-trade-biz/src/main/java/cn/newfeifan/mall/module/trade/dal/dataobject/order/TradeOrderDO.java

@@ -334,4 +334,13 @@ public class TradeOrderDO extends BaseDO {
     private Long shopId;
 
     private Long merchantId;
+
+    /**
+     * 订阅物流信息,未订阅是0,已订阅是1
+     */
+    private Integer subscriptionLogisticsInfo;
+    /**
+     * 物流签收时间
+     */
+    private LocalDateTime receivingTime;
 }

+ 35 - 1
feifan-module-mall/feifan-module-trade-biz/src/main/java/cn/newfeifan/mall/module/trade/framework/delivery/core/client/impl/kd100/Kd100ExpressClient.java

@@ -4,12 +4,17 @@ import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.util.HexUtil;
 import cn.hutool.crypto.digest.DigestUtil;
 import cn.newfeifan.mall.framework.common.util.json.JsonUtils;
+import cn.newfeifan.mall.module.trade.dal.dataobject.delivery.DeliveryExpressDO;
+import cn.newfeifan.mall.module.trade.dal.dataobject.order.TradeOrderDO;
+import cn.newfeifan.mall.module.trade.dal.mysql.delivery.DeliveryExpressMapper;
+import cn.newfeifan.mall.module.trade.dal.mysql.order.TradeOrderMapper;
 import cn.newfeifan.mall.module.trade.framework.delivery.config.TradeExpressProperties;
 import cn.newfeifan.mall.module.trade.framework.delivery.core.client.ExpressClient;
 import cn.newfeifan.mall.module.trade.framework.delivery.core.client.dto.ExpressTrackQueryReqDTO;
 import cn.newfeifan.mall.module.trade.framework.delivery.core.client.dto.ExpressTrackRespDTO;
 import cn.newfeifan.mall.module.trade.framework.delivery.core.client.dto.kd100.Kd100ExpressQueryReqDTO;
 import cn.newfeifan.mall.module.trade.framework.delivery.core.client.dto.kd100.Kd100ExpressQueryRespDTO;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import lombok.AllArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.http.*;
@@ -17,6 +22,8 @@ import org.springframework.util.LinkedMultiValueMap;
 import org.springframework.util.MultiValueMap;
 import org.springframework.web.client.RestTemplate;
 
+import javax.annotation.Resource;
+import java.time.LocalDateTime;
 import java.util.Collections;
 import java.util.List;
 import java.util.Objects;
@@ -40,6 +47,12 @@ public class Kd100ExpressClient implements ExpressClient {
     private final RestTemplate restTemplate;
     private final TradeExpressProperties.Kd100Config config;
 
+    @Resource
+    private TradeOrderMapper tradeOrderMapper;
+
+    @Resource
+    private DeliveryExpressMapper deliveryExpressMapper;
+
     /**
      * 查询快递轨迹
      *
@@ -63,7 +76,28 @@ public class Kd100ExpressClient implements ExpressClient {
         if (CollUtil.isEmpty(respDTO.getTracks())) {
             return Collections.emptyList();
         }
-        return INSTANCE.convertList2(respDTO.getTracks());
+        List<ExpressTrackRespDTO> expressTrackRespDTOS = INSTANCE.convertList2(respDTO.getTracks());
+
+        if(respDTO.getState().equals("3")){
+            updateOrder(respDTO.getExpressCompanyCode(),respDTO.getLogisticsNo(),expressTrackRespDTOS.get(0).getTime());
+        }
+        return expressTrackRespDTOS;
+    }
+
+    /**
+     * 保存订单的签收时间
+     * @param com 快递公司编码
+     * @param nu 单号
+     */
+    private void updateOrder(String com, String nu, LocalDateTime time){
+        DeliveryExpressDO deliveryExpressDO = deliveryExpressMapper.selectByCode(com);
+        TradeOrderDO tradeOrderDO = tradeOrderMapper.selectOne(new LambdaQueryWrapper<TradeOrderDO>()
+                .eq(TradeOrderDO::getLogisticsNo, nu)
+                .eq(TradeOrderDO::getLogisticsId, deliveryExpressDO.getId())
+        );
+        tradeOrderDO.setReceivingTime(time);
+
+        tradeOrderMapper.updateById(tradeOrderDO);
     }
 
     /**

+ 23 - 3
feifan-module-mall/feifan-module-trade-biz/src/main/java/cn/newfeifan/mall/module/trade/service/order/TradeOrderUpdateServiceImpl.java

@@ -50,9 +50,11 @@ import cn.newfeifan.mall.module.trade.service.price.bo.TradePriceCalculateReqBO;
 import cn.newfeifan.mall.module.trade.service.price.bo.TradePriceCalculateRespBO;
 import cn.newfeifan.mall.module.trade.service.price.calculator.TradePriceCalculatorHelper;
 import com.google.gson.Gson;
+import com.google.gson.JsonObject;
 import com.kuaidi100.sdk.api.Subscribe;
 import com.kuaidi100.sdk.contant.ApiInfoConstant;
 import com.kuaidi100.sdk.core.IBaseClient;
+import com.kuaidi100.sdk.pojo.HttpResult;
 import com.kuaidi100.sdk.request.SubscribeParam;
 import com.kuaidi100.sdk.request.SubscribeParameters;
 import com.kuaidi100.sdk.request.SubscribeReq;
@@ -389,16 +391,17 @@ public class TradeOrderUpdateServiceImpl implements TradeOrderUpdateService {
 
     /**
      * 测试订阅物流信息
+     *
      * @param order 交易订单对象,包含物流信息和接收人手机号
      * @throws Exception 抛出异常,可能由于外部服务调用失败等原因
      */
-    private void testSubscribe(TradeOrderDO order) throws Exception{
+    private void testSubscribe(TradeOrderDO order) throws Exception {
         // 根据物流ID获取配送信息
         DeliveryExpressDO deliveryExpress = deliveryExpressService.getDeliveryExpress(order.getLogisticsId());
 
         // 设置订阅参数,包括回调URL和手机号
         SubscribeParameters subscribeParameters = new SubscribeParameters();
-        subscribeParameters.setCallbackurl("http://www.baidu.com");
+        subscribeParameters.setCallbackurl("https://letcgopt.newfeifan.cn/admin-api/trade/order/callBackUrl?orderId="+order.getId());
         subscribeParameters.setPhone(order.getReceiverMobile());
 
         // 创建订阅参数实例,并设置相关公司代码、物流单号和密钥
@@ -415,7 +418,24 @@ public class TradeOrderUpdateServiceImpl implements TradeOrderUpdateService {
 
         // 调用订阅服务,并打印执行结果
         IBaseClient subscribe = new Subscribe();
-        System.out.println(subscribe.execute(subscribeReq));
+        HttpResult execute = subscribe.execute(subscribeReq);
+
+        Gson gson = new Gson();
+        JsonObject jsonObject = gson.fromJson(execute.getBody(), JsonObject.class);
+        boolean result = jsonObject.get("result").getAsBoolean();
+        String returnCode = jsonObject.get("returnCode").getAsString();
+
+        if (result && returnCode.equals("200")) {
+            log.info("{}:订阅成功",order.getLogisticsNo());
+
+            order.setSubscriptionLogisticsInfo(TradeOrderSubscribeStatusEnum.SUBSCRIBE.getStatus());
+        } else {
+            log.info("{}:订阅失败",order.getLogisticsNo());
+
+            order.setSubscriptionLogisticsInfo(TradeOrderSubscribeStatusEnum.abnormal.getStatus());
+        }
+        tradeOrderMapper.updateById(order);
+
     }
 
     /**