Sfoglia il codice sorgente

订阅快递鸟转化为中间表的方式

xdd 1 mese fa
parent
commit
44b6718152

+ 71 - 0
fs-service-system/src/main/java/com/fs/express/ExpressServiceImpl.java

@@ -0,0 +1,71 @@
+package com.fs.express;
+
+import com.alibaba.fastjson.JSON;
+import com.fs.common.config.FSSysConfig;
+import com.fs.express.dto.ExpressPushRespDTO;
+import com.fs.express.enums.TaskStatusEnum;
+import com.fs.express.http.KdniaoSubscribeHttp;
+import com.fs.express.http.dto.LogisticsInfoDTO;
+import com.fs.store.domain.FsOrderExpressPush;
+import com.fs.store.mapper.FsOrderExpressPushMapper;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.net.URLDecoder;
+import java.util.List;
+
+/**
+ * 物流相关处理
+ */
+@Service
+@Slf4j
+public class ExpressServiceImpl implements IExpressService{
+    @Autowired
+    private FsOrderExpressPushMapper fsOrderExpressPushMapper;
+
+    @Autowired
+    private KdniaoSubscribeHttp kdniaoSubscribeHttp;
+
+    /**
+     * 推送物流信息到快递鸟
+     */
+    @Override
+    public void subscribeExpress() {
+        log.info("开始处理待订阅的物流信息");
+
+        List<FsOrderExpressPush> fsOrderExpressPushes = fsOrderExpressPushMapper.queryPendingData();
+        log.info("查询到待处理的物流信息数量: {}", fsOrderExpressPushes.size());
+
+        for (FsOrderExpressPush fsOrderExpressPush : fsOrderExpressPushes) {
+            log.info("处理物流单号: {}", fsOrderExpressPush.getOrderId());
+            String params = fsOrderExpressPush.getParams();
+            ExpressPushRespDTO expressPushRespDTO = null;
+            try {
+                params = URLDecoder.decode(params, "UTF-8");
+                LogisticsInfoDTO payload = JSON.parseObject(params, LogisticsInfoDTO.class);
+                expressPushRespDTO = kdniaoSubscribeHttp.subscribeLogistic(payload);
+            } catch (Throwable e) {
+                log.error("物流订阅发生异常 - 单号: {}, 错误信息: {}", fsOrderExpressPush.getOrderId(), JSON.toJSONString(e));
+                expressPushRespDTO = new ExpressPushRespDTO();
+                expressPushRespDTO.setSuccess(false);
+                expressPushRespDTO.setReason(JSON.toJSONString(e));
+            }
+
+            fsOrderExpressPush.setResult(JSON.toJSONString(expressPushRespDTO));
+            if(expressPushRespDTO.getSuccess()) {
+                fsOrderExpressPush.setTaskStatus(TaskStatusEnum.SUCCESS.getCode());
+                log.info("物流订阅成功 - 单号: {}", fsOrderExpressPush.getOrderId());
+            } else {
+                fsOrderExpressPush.setTaskStatus(TaskStatusEnum.FAILED.getCode());
+                fsOrderExpressPush.setRetryCount(fsOrderExpressPush.getRetryCount()+1);
+                log.warn("物流订阅失败 - 单号: {}, 重试次数: {}", fsOrderExpressPush.getOrderId(), fsOrderExpressPush.getRetryCount());
+
+            }
+            fsOrderExpressPushMapper.update(fsOrderExpressPush);
+            log.info("更新物流信息 - 单号: {}, 处理结果: {}", fsOrderExpressPush.getOrderId(), JSON.toJSONString(expressPushRespDTO));
+        }
+
+        log.info("物流订阅处理完成");
+    }
+}

+ 5 - 0
fs-service-system/src/main/java/com/fs/express/IExpressService.java

@@ -0,0 +1,5 @@
+package com.fs.express;
+
+public interface IExpressService {
+    void subscribeExpress();
+}

+ 40 - 0
fs-service-system/src/main/java/com/fs/express/dto/ExpressPushRespDTO.java

@@ -0,0 +1,40 @@
+package com.fs.express.dto;
+
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * 业务响应结果DTO类
+ * <p>
+ * 该类用于表示业务操作的响应结果,包括更新时间、业务ID、操作是否成功以及失败原因。
+ * </p>
+ *
+ * @author xdd
+ * @version 1.0
+ * @since 2023-10-10
+ */
+@Data
+public class ExpressPushRespDTO implements Serializable {
+
+    /**
+     * 更新时间,格式为 "yyyy-MM-dd HH:mm:ss"
+     */
+    private Date UpdateTime;
+
+    /**
+     * 业务ID
+     */
+    private String EBusinessID;
+
+    /**
+     * 操作是否成功
+     */
+    private Boolean Success;
+
+    /**
+     * 失败原因
+     */
+    private String Reason;
+}

+ 87 - 0
fs-service-system/src/main/java/com/fs/express/enums/TaskStatusEnum.java

@@ -0,0 +1,87 @@
+package com.fs.express.enums;
+
+/**
+ * 任务状态枚举
+ */
+public enum TaskStatusEnum {
+
+    /**
+     * 待处理
+     */
+    PENDING(0, "待处理"),
+
+    /**
+     * 成功
+     */
+    SUCCESS(1, "成功"),
+
+    /**
+     * 失败
+     */
+    FAILED(2, "失败"),
+
+    /**
+     * 正在处理
+     */
+    PROCESSING(3, "正在处理"),
+
+    /**
+     * 已取消
+     */
+    CANCELLED(4, "已取消");
+
+    private final Integer code; // 状态码
+    private final String description; // 状态描述
+
+    /**
+     * 构造方法
+     *
+     * @param code        状态码
+     * @param description 状态描述
+     */
+    TaskStatusEnum(Integer code, String description) {
+        this.code = code;
+        this.description = description;
+    }
+
+    /**
+     * 根据状态码获取枚举值
+     *
+     * @param code 状态码
+     * @return 对应的枚举值,如果没有匹配的则返回 null
+     */
+    public static TaskStatusEnum getByCode(Integer code) {
+        for (TaskStatusEnum status : TaskStatusEnum.values()) {
+            if (status.getCode().equals(code)) {
+                return status;
+            }
+        }
+        return null;
+    }
+
+    /**
+     * 获取状态码
+     *
+     * @return 状态码
+     */
+    public Integer getCode() {
+        return code;
+    }
+
+    /**
+     * 获取状态描述
+     *
+     * @return 状态描述
+     */
+    public String getDescription() {
+        return description;
+    }
+
+    @Override
+    public String toString() {
+        return "TaskStatusEnum{" +
+                "code=" + code +
+                ", description='" + description + '\'' +
+                '}';
+    }
+}

+ 205 - 0
fs-service-system/src/main/java/com/fs/express/http/KdniaoSubscribeHttp.java

@@ -0,0 +1,205 @@
+package com.fs.express.http;
+
+import cn.hutool.http.HttpRequest;
+import cn.hutool.http.HttpResponse;
+import com.alibaba.fastjson.JSON;
+import com.fs.common.config.FSSysConfig;
+import com.fs.express.dto.ExpressPushRespDTO;
+import com.fs.express.http.dto.LogisticsInfoDTO;
+import com.sun.org.apache.xerces.internal.impl.dv.util.Base64;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import java.io.UnsupportedEncodingException;
+import java.net.URLEncoder;
+import java.security.MessageDigest;
+import java.util.HashMap;
+import java.util.Map;
+
+
+/**
+ * @技术QQ群: 可登录官网https://www.kdniao.com/右侧查看技术群号
+ * @see: https://kdniao.com/api-follow
+ * @copyright: 深圳市快金数据技术服务有限公司
+ * ID和Key请到官网申请:https://kdniao.com/reg
+ * <p>
+ * <p>
+ * <p>
+ * 轨迹订阅接口
+ * 此接口用于向快递鸟订阅物流轨迹信息。由轨迹订阅接口(RequestType1008)和轨迹推送接口(RequestType101)组成,接入时需要对接二个接口。该功能支持情况需查看技术文档。
+ * 正式地址:https://api.kdniao.com/api/dist
+ * <p>
+ * <p>
+ * 系统级参数
+ * RequestData	   String	R	请求内容为JSON格式 详情可参考接口技术文档:https://www.kdniao.com/documents
+ * EBusinessID	   String	R	用户ID
+ * RequestType	   String	R	请求接口指令
+ * DataSign	       String	R	数据内容签名,加密方法为:把(请求内容(未编码)+ApiKey)进行MD5加密--32位小写,然后Base64编码,最后进行URL(utf-8)编码
+ * DataType	       String	R	DataType=2,请求、返回数据类型均为JSON格式
+ * <p>
+ * <p>
+ * 应用级参数
+ * R-必填(Required),O-可选(Optional),C-报文中该参数在一定条件下可选(Conditional)
+ * Callback	                String(50)	O	用户自定义回传字段
+ * ShipperCode	            String(10)	R	快递公司编码 详细编码参考《快递鸟接口支持快递公司编码.xlsx》
+ * LogisticCode	            String(30)	R	快递单号
+ * CustomerName	            String(50)	C	ShipperCode为SF时必填,对应寄件人/收件人手机号后四位;ShipperCode为其他快递时,可不填或保留字段,不可传值
+ */
+@Component
+@Slf4j
+public class KdniaoSubscribeHttp {
+
+    /**
+     * 用户ID,快递鸟提供,注意保管,不要泄漏
+     * 即用户ID,登录快递鸟官网会员中心获取 https://www.kdniao.com/UserCenter/v4/UserHome.aspx
+     */
+
+    private String EBusinessID;
+    /**
+     * API key,快递鸟提供,注意保管,不要泄漏
+     * 即API key,登录快递鸟官网会员中心获取 https://www.kdniao.com/UserCenter/v4/UserHome.aspx
+     */
+    private String ApiKey;
+    /**
+     * 请求url, 正式环境地址
+     */
+    private String ReqURL;
+
+
+    @Autowired
+    public void setSysConfig(FSSysConfig sysConfig) {
+        this.EBusinessID = sysConfig.getKdnId();
+        this.ApiKey = sysConfig.getKdnKeyId();
+        this.ReqURL = sysConfig.getKdnUrl();
+    }
+
+
+//    public static void main(String[] args) {
+//        try {
+//            KdniaoSubscribeHttp api = new KdniaoSubscribeHttp();
+//            LogisticsInfoDTO payload = new LogisticsInfoDTO();
+//            payload.setCallback("#");
+//            payload.setCustomerName("3432");
+//            payload.setLogisticCode("SF1395044177288");
+//            payload.setShipperCode("SF");
+//            System.out.println(api.subscribeLogistic(payload));
+//        } catch (Exception e) {
+//            e.printStackTrace();
+//        }
+//    }
+
+    /**
+     * 轨迹订阅接口
+     * @param payload
+     * @return
+     * @throws Exception
+     */
+    public ExpressPushRespDTO subscribeLogistic(LogisticsInfoDTO payload) throws Exception {
+        // 组装应用级参数
+//        String RequestData = "{" +
+//                "'Callback':'#'," +
+//                "'ShipperCode':'SF'," +
+//                "'LogisticCode':'SF1395044177288'," +
+//                "'CustomerName':'3432'," +
+//                "}";
+        String RequestData = JSON.toJSONString(payload);
+        // 组装系统级参数
+        Map<String, Object> params = new HashMap<>();
+        params.put("RequestData", urlEncoder(RequestData, "UTF-8"));
+        params.put("EBusinessID", EBusinessID);
+        //免费订阅接口指令1008/在途监控订阅接口指令8008/地图版订阅接口指令8005
+        params.put("RequestType", "8008");
+        String dataSign = encrypt(RequestData, ApiKey, "UTF-8");
+        params.put("DataSign", urlEncoder(dataSign, "UTF-8"));
+        params.put("DataType", "2");
+        // 以form表单形式提交post请求,post请求体中包含了应用级参数和系统级参数
+        String result = sendPost(ReqURL, params);
+        return JSON.parseObject(result, ExpressPushRespDTO.class);
+    }
+
+
+    /**
+     * MD5加密
+     * str 内容
+     * charset 编码方式
+     *
+     * @throws Exception
+     */
+    @SuppressWarnings("unused")
+    private String MD5(String str, String charset) throws Exception {
+        MessageDigest md = MessageDigest.getInstance("MD5");
+        md.update(str.getBytes(charset));
+        byte[] result = md.digest();
+        StringBuffer sb = new StringBuffer(32);
+        for (int i = 0; i < result.length; i++) {
+            int val = result[i] & 0xff;
+            if (val <= 0xf) {
+                sb.append("0");
+            }
+            sb.append(Integer.toHexString(val));
+        }
+        return sb.toString().toLowerCase();
+    }
+
+    /**
+     * base64编码
+     * str 内容
+     * charset 编码方式
+     *
+     * @throws UnsupportedEncodingException
+     */
+    private String base64(String str, String charset) throws UnsupportedEncodingException {
+        String encoded = Base64.encode(str.getBytes(charset));
+        return encoded;
+    }
+
+    @SuppressWarnings("unused")
+    private String urlEncoder(String str, String charset) throws UnsupportedEncodingException {
+        String result = URLEncoder.encode(str, charset);
+        return result;
+    }
+
+    /**
+     * 电商Sign签名生成
+     * content 内容
+     * keyValue ApiKey
+     * charset 编码方式
+     *
+     * @return DataSign签名
+     * @throws UnsupportedEncodingException ,Exception
+     */
+    @SuppressWarnings("unused")
+    private String encrypt(String content, String keyValue, String charset) throws UnsupportedEncodingException, Exception {
+        if (keyValue != null) {
+            return base64(MD5(content + keyValue, charset), charset);
+        }
+        return base64(MD5(content, charset), charset);
+    }
+
+    /**
+     * 使用 Hutool 的 HttpRequest 发送 POST 请求
+     *
+     * @param url    请求的 URL
+     * @param params 请求参数
+     * @return 响应结果
+     */
+    public static String sendPost(String url, Map<String, Object> params) {
+        log.info("开始发送POST请求,URL: {},请求参数: {}", url, params);
+
+        HttpRequest request = HttpRequest.post(url)
+                .header("Content-Type", "application/x-www-form-urlencoded")
+                .header("accept", "*/*")
+                .header("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)");
+
+        log.info("请求头信息 - ContentType: {},Accept: {},UserAgent: {}",
+                "application/x-www-form-urlencoded", "*/*", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)");
+
+        HttpResponse response = request.form(params).execute();
+        String responseBody = response.body();
+        log.info("请求完成,URL: {},响应状态码: {},响应内容: {}", url, response.getStatus(), responseBody);
+
+        return responseBody;
+    }
+}
+

+ 51 - 0
fs-service-system/src/main/java/com/fs/express/http/dto/LogisticsInfoDTO.java

@@ -0,0 +1,51 @@
+package com.fs.express.http.dto;
+
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * 物流信息订阅快递鸟
+ * <p>
+ * 该类用于表示物流信息的DTO(Data Transfer Object),包含物流相关的核心信息。
+ * </p>
+ *
+ * @author xdd
+ * @version 1.0
+ * @since 2025-02-27
+ */
+@Data
+public class LogisticsInfoDTO implements Serializable {
+
+    /**
+     * 回调地址
+     * <p>
+     * 该字段用于存储回调地址,通常是一个URL,用于接收物流状态的更新。
+     * </p>
+     */
+    private String Callback;
+
+    /**
+     * 快递公司编码
+     * <p>
+     * 该字段用于存储快递公司的唯一编码,例如顺丰快递的编码为SF。
+     * </p>
+     */
+    private String ShipperCode;
+
+    /**
+     * 物流单号
+     * <p>
+     * 该字段用于存储物流单号,是快递公司提供的唯一标识符,用于追踪物流状态。
+     * </p>
+     */
+    private String LogisticCode;
+
+    /**
+     * 客户名称
+     * <p>
+     * 手机号后4位
+     * </p>
+     */
+    private String CustomerName;
+}

+ 32 - 0
fs-service-system/src/main/java/com/fs/store/domain/FsOrderExpressPush.java

@@ -0,0 +1,32 @@
+package com.fs.store.domain;
+
+import lombok.Data;
+
+import java.time.LocalDateTime;
+
+/***
+ * 订阅物流
+ */
+@Data
+public class FsOrderExpressPush {
+    /*** 主键,自增 */
+    private Long id;
+    /*** 订单号,唯一标识订单 */
+    private String orderId;
+    /*** 任务状态:0-待处理,1-成功,2-失败,3-正在处理,4-已取消 */
+    private Integer taskStatus;
+    /*** 重试次数,默认为 0 */
+    private Integer retryCount;
+    /*** 上次执行时间,用于记录任务执行的最后时间 */
+    private LocalDateTime lastExecuteTime;
+    /*** 记录创建时间 */
+    private LocalDateTime createTime;
+    /*** 记录更新时间 */
+    private LocalDateTime updateTime;
+    /*** 调用接口时传入的参数(JSON 格式) */
+    private String params;
+    /*** 调用接口返回的结果(JSON 格式) */
+    private String result;
+    /*** 错误信息(记录失败原因) */
+    private String errorMessage;
+}

+ 67 - 0
fs-service-system/src/main/java/com/fs/store/domain/FsStoreDelivers.java

@@ -0,0 +1,67 @@
+package com.fs.store.domain;
+
+import lombok.Data;
+import java.util.Date;
+
+/**
+ * 发货信息表
+ * @author
+ */
+@Data
+public class FsStoreDelivers {
+
+    /**
+     * 主键
+     */
+    private Integer id;
+
+    /**
+     * 订单id
+     */
+    private Integer orderId;
+
+    /**
+     * 订单号
+     */
+    private String orderCode;
+
+    /**
+     * 快递类型
+     */
+    private String deliverSn;
+
+    /**
+     * 快递名称
+     */
+    private String deliverName;
+
+    /**
+     * 快递号
+     */
+    private String deliverId;
+
+    /**
+     * 发货时间
+     */
+    private Date deliverSendTime;
+
+    /**
+     * 创建时间
+     */
+    private Date createTime;
+
+    /**
+     * 更新时间
+     */
+    private Date updateTime;
+
+    /**
+     * 创建人
+     */
+    private String createBy;
+
+    /**
+     * 更新人
+     */
+    private Date updateBy;
+}

+ 30 - 0
fs-service-system/src/main/java/com/fs/store/mapper/FsOrderExpressPushMapper.java

@@ -0,0 +1,30 @@
+package com.fs.store.mapper;
+
+import com.fs.store.domain.FsOrderExpressPush;
+import org.apache.ibatis.annotations.*;
+
+import java.util.List;
+
+@Mapper
+public interface FsOrderExpressPushMapper {
+
+    @Select("SELECT * FROM fs_order_express_push WHERE id = #{id}")
+    FsOrderExpressPush selectById(Long id);
+
+    @Insert("INSERT INTO fs_order_express_push (order_id, task_status, retry_count, last_execute_time, create_time, update_time, params, result, error_message) " +
+            "VALUES (#{orderId}, #{taskStatus}, #{retryCount}, #{lastExecuteTime}, #{createTime}, #{updateTime}, #{params}, #{result}, #{errorMessage})")
+    @Options(useGeneratedKeys = true, keyProperty = "id")
+    int insert(FsOrderExpressPush fsOrderExpressPush);
+
+    @Update("UPDATE fs_order_express_push SET order_id = #{orderId}, task_status = #{taskStatus}, retry_count = #{retryCount}, " +
+            "last_execute_time = #{lastExecuteTime}, create_time = #{createTime}, update_time = #{updateTime}, " +
+            "params = #{params}, result = #{result}, error_message = #{errorMessage} WHERE id = #{id}")
+    int update(FsOrderExpressPush fsOrderExpressPush);
+
+    @Delete("DELETE FROM fs_order_express_push WHERE id = #{id}")
+    int deleteById(Long id);
+
+    @Select("SELECT * FROM fs_order_express_push where task_status in (0,2) and retry_count < 3")
+    List<FsOrderExpressPush> queryPendingData();
+
+}

+ 60 - 0
fs-service-system/src/main/java/com/fs/store/mapper/FsStoreDeliversMapper.java

@@ -0,0 +1,60 @@
+package com.fs.store.mapper;
+
+import com.fs.store.domain.FsStoreDelivers;
+import org.apache.ibatis.annotations.*;
+
+/**
+ * 发货信息Mapper接口
+ *
+ * @date 2022-07-28
+ * @author xdd
+ */
+@Mapper
+public interface FsStoreDeliversMapper {
+
+    /**
+     * 根据ID查询发货信息
+     * @param id 主键ID
+     * @return 发货信息
+     */
+    @Select("SELECT * FROM fs_store_delivers WHERE id = #{id}")
+    FsStoreDelivers findById(@Param("id") Integer id);
+
+    /**
+     * 插入发货信息
+     * @param fsStoreDelivers 发货信息对象
+     * @return 插入影响的行数
+     */
+    @Insert("INSERT INTO fs_store_delivers (order_id, order_code, deliver_sn, deliver_name, deliver_id, deliver_send_time, create_time, update_time, create_by, update_by) " +
+            "VALUES (#{orderId}, #{orderCode}, #{deliverSn}, #{deliverName}, #{deliverId}, #{deliverSendTime}, #{createTime}, #{updateTime}, #{createBy}, #{updateBy})")
+    @Options(useGeneratedKeys = true, keyProperty = "id")
+    int insert(FsStoreDelivers fsStoreDelivers);
+
+    /**
+     * 更新发货信息
+     * @param fsStoreDelivers 发货信息对象
+     * @return 更新影响的行数
+     */
+    @Update("<script>" +
+            "UPDATE fs_store_delivers " +
+            "<set>" +
+            "   <if test='orderId != null'>order_id = #{orderId},</if>" +
+            "   <if test='orderCode != null'>order_code = #{orderCode},</if>" +
+            "   <if test='deliverSn != null'>deliver_sn = #{deliverSn},</if>" +
+            "   <if test='deliverName != null'>deliver_name = #{deliverName},</if>" +
+            "   <if test='deliverId != null'>deliver_id = #{deliverId},</if>" +
+            "   <if test='deliverSendTime != null'>deliver_send_time = #{deliverSendTime},</if>" +
+            "   <if test='updateTime != null'>update_time = #{updateTime},</if>" +
+            "   <if test='updateBy != null'>update_by = #{updateBy},</if>" +
+            "</set>" +
+            "WHERE id = #{id}" +
+            "</script>")
+    int update(FsStoreDelivers fsStoreDelivers);
+      /**
+     * 根据orderId查询发货信息
+     * @param orderId 订单ID
+     * @return 发货信息
+     */
+    @Select("SELECT * FROM fs_store_delivers WHERE order_id = #{orderId}")
+    FsStoreDelivers findByOrderId(@Param("orderId") Integer orderId);
+}

+ 19 - 3
fs-service-system/src/main/java/com/fs/store/service/impl/FsExpressServiceImpl.java

@@ -2,6 +2,7 @@ package com.fs.store.service.impl;
 
 import java.net.URLEncoder;
 import java.security.MessageDigest;
+import java.time.LocalDateTime;
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
@@ -10,19 +11,24 @@ import java.util.Map;
 import cn.hutool.core.util.StrUtil;
 import cn.hutool.http.HttpUtil;
 import cn.hutool.json.JSONUtil;
+import com.alibaba.fastjson.JSON;
 import com.fs.api.param.ExpressParam;
 import com.fs.api.vo.ExpressVO;
 import com.fs.common.config.FSSysConfig;
 import com.fs.common.core.domain.R;
 import com.fs.common.exception.CustomException;
 import com.fs.common.utils.DateUtils;
+import com.fs.express.enums.TaskStatusEnum;
+import com.fs.store.domain.FsOrderExpressPush;
 import com.fs.store.domain.FsStoreOrder;
 import com.fs.store.dto.ExpressAddressDTO;
 import com.fs.store.dto.ExpressAddressDataDTO;
 import com.fs.store.dto.ExpressInfoDTO;
 import com.fs.store.dto.TracesDTO;
 import com.fs.store.enums.ShipperCodeEnum;
+import com.fs.store.mapper.FsOrderExpressPushMapper;
 import com.fs.store.mapper.FsStoreOrderMapper;
+import com.hc.openapi.tool.util.ObjectUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -50,6 +56,10 @@ public class FsExpressServiceImpl implements IFsExpressService
     private FsStoreOrderMapper fsStoreOrderMapper;
     @Autowired
     private FSSysConfig sysConfig;
+
+    @Autowired
+    private FsOrderExpressPushMapper fsOrderExpressPushMapper;
+
     /**
      * 查询快递公司
      *
@@ -174,7 +184,7 @@ public class FsExpressServiceImpl implements IFsExpressService
     public void subscribeEspress(String orderCode, String deliverySn, String deliveryId, String userPhone) {
         //处理顺丰查询轨迹需手机号码后4位
         String requestData;
-        if (deliverySn.equals(ShipperCodeEnum.SF.getValue())) {
+        if (ObjectUtils.equals(deliverySn,ShipperCodeEnum.SF.getValue())) {
             requestData = "{'OrderCode':'" + orderCode + "','ShipperCode':'" + deliverySn + "','LogisticCode':'" + deliveryId + "','CustomerName':'" + userPhone + "'}";
         } else {
             requestData = "{'OrderCode':'" + orderCode + "','ShipperCode':'" + deliverySn + "','LogisticCode':'" + deliveryId + "'}";
@@ -188,9 +198,15 @@ public class FsExpressServiceImpl implements IFsExpressService
             String dataSign = encrypt(requestData, sysConfig.getKdnKeyId().trim(), "UTF-8");
             params.put("DataSign", URLEncoder.encode(dataSign, "UTF-8"));
             params.put("DataType", "2");
-            String result = HttpUtil.post(sysConfig.getKdnSubscribeUrl().trim(), params);
-            logger.info("订阅物流:"+result);
 
+            FsOrderExpressPush fsOrderExpressPush = new FsOrderExpressPush();
+            fsOrderExpressPush.setOrderId(orderCode);
+            fsOrderExpressPush.setParams(JSON.toJSONString(params));
+            fsOrderExpressPush.setCreateTime(LocalDateTime.now());
+            fsOrderExpressPush.setUpdateTime(LocalDateTime.now());
+            fsOrderExpressPush.setRetryCount(0);
+            fsOrderExpressPush.setTaskStatus(TaskStatusEnum.PENDING.getCode());
+            fsOrderExpressPushMapper.insert(fsOrderExpressPush);
         } catch (Exception e) {
             throw  new CustomException(e.getMessage());
         }

+ 1 - 1
fs-service-system/src/main/java/com/fs/store/service/impl/FsStoreOrderServiceImpl.java

@@ -871,7 +871,7 @@ public class FsStoreOrderServiceImpl implements IFsStoreOrderService
     @Override
     public void deliveryOrder(String orderCode,String deliveryId,String deliverCode,String deliverName) {
         FsStoreOrder order= fsStoreOrderMapper.selectFsStoreOrderByOrderCode(orderCode);
-        if(order!=null&&order.getStatus()==OrderInfoEnum.STATUS_1.getValue()){
+        if(order!=null&& Objects.equals(order.getStatus(), OrderInfoEnum.STATUS_1.getValue())){
             FsExpress express=expressService.selectFsExpressByOmsCode(deliverCode);
             if(express!=null){
                 order.setDeliveryName(deliverName);

+ 1 - 0
fs-user-app/src/main/resources/static/S8Zw463cFc.txt

@@ -0,0 +1 @@
+641273d9479c4e0133bfacb9f669d39f