소스 검색

物流查询多运单号适配

xdd 1 개월 전
부모
커밋
4307f849ff
20개의 변경된 파일499개의 추가작업 그리고 108개의 파일을 삭제
  1. 1 0
      fs-admin/src/main/java/com/fs/api/controller/CompanyAPIController.java
  2. 14 0
      fs-admin/src/main/java/com/fs/store/controller/FsExpressController.java
  3. 1 1
      fs-admin/src/main/java/com/fs/store/controller/FsStoreCouponIssueController.java
  4. 3 0
      fs-admin/src/main/java/com/fs/store/controller/FsStoreOrderController.java
  5. 1 0
      fs-admin/src/main/java/com/fs/task/StoreTask.java
  6. 1 1
      fs-admin/src/main/resources/application.yml
  7. 4 1
      fs-api/src/main/java/com/fs/app/controller/CommonController.java
  8. 2 2
      fs-api/src/main/resources/application.yml
  9. 3 0
      fs-company/src/main/java/com/fs/store/controller/FsStoreOrderController.java
  10. 15 0
      fs-service-system/src/main/java/com/fs/express/FsStoreDeliversService.java
  11. 103 0
      fs-service-system/src/main/java/com/fs/express/impl/FsStoreDeliversServiceImpl.java
  12. 31 0
      fs-service-system/src/main/java/com/fs/store/domain/FsStoreDelivers.java
  13. 43 0
      fs-service-system/src/main/java/com/fs/store/mapper/FsStoreDeliversMapper.java
  14. 5 1
      fs-service-system/src/main/java/com/fs/store/param/FsStoreOrderExpressParam.java
  15. 10 7
      fs-service-system/src/main/java/com/fs/store/service/IFsExpressService.java
  16. 1 0
      fs-service-system/src/main/java/com/fs/store/service/IFsStoreOrderService.java
  17. 49 0
      fs-service-system/src/main/java/com/fs/store/service/impl/FsExpressServiceImpl.java
  18. 75 91
      fs-service-system/src/main/java/com/fs/store/service/impl/FsStoreOrderServiceImpl.java
  19. 2 2
      fs-service-system/src/main/resources/application-config.yml
  20. 135 2
      fs-user-app/src/main/java/com/fs/app/controller/StoreOrderController.java

+ 1 - 0
fs-admin/src/main/java/com/fs/api/controller/CompanyAPIController.java

@@ -60,6 +60,7 @@ public class CompanyAPIController extends BaseController
 
 
     @GetMapping("/getExpressInfo")
+    @Deprecated
     public R getExpressInfo(ExpressParam param, HttpServletRequest request) {
         Company company=checkCompany(request);
         List<ExpressVO> list = expressService.getExpressInfoAPI(param);

+ 14 - 0
fs-admin/src/main/java/com/fs/store/controller/FsExpressController.java

@@ -5,8 +5,11 @@ import java.util.List;
 import com.fs.common.core.domain.R;
 import com.fs.company.domain.Company;
 import com.fs.company.service.ICompanyService;
+import com.fs.store.param.FsStoreOrderExpressParam;
+import io.swagger.annotations.ApiOperation;
 import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.PutMapping;
@@ -24,6 +27,8 @@ import com.fs.store.service.IFsExpressService;
 import com.fs.common.utils.poi.ExcelUtil;
 import com.fs.common.core.page.TableDataInfo;
 
+import javax.servlet.http.HttpServletRequest;
+
 /**
  * 快递公司Controller
  *
@@ -40,6 +45,15 @@ public class FsExpressController extends BaseController
     @Autowired
     private ICompanyService companyService;
 
+
+
+    @ApiOperation("物流查询")
+    @PostMapping("/getExpressByDeliverId")
+    public R getExpressByDeliverId(@Validated @RequestBody FsStoreOrderExpressParam param, HttpServletRequest request){
+        return fsExpressService.getExpressByDeliverId(param);
+    }
+
+
     /**
      * 查询快递公司列表
      */

+ 1 - 1
fs-admin/src/main/java/com/fs/store/controller/FsStoreCouponIssueController.java

@@ -42,7 +42,7 @@ public class FsStoreCouponIssueController extends BaseController
      * @return 套餐券列表
      */
     @GetMapping("/listAllAvailable")
-    @PreAuthorize("@ss.hasPermi('store:storeCoupon:listAllAvailable')")
+    @PreAuthorize("@ss.hasPermi('store:storeCouponIssue:list')")
     public AjaxResult listAllAvailable(){
         List<FsStoreCouponIssueVO> fsStoreCouponIssueVOS = fsStoreCouponIssueService.listAllAvailable();
         return AjaxResult.success(fsStoreCouponIssueVOS);

+ 3 - 0
fs-admin/src/main/java/com/fs/store/controller/FsStoreOrderController.java

@@ -342,7 +342,10 @@ public class FsStoreOrderController extends BaseController {
 
     @PreAuthorize("@ss.hasPermi('store:storeOrder:express')")
     @GetMapping(value = "/getExpress/{id}")
+    @Deprecated
     public R getExpress(@PathVariable("id") Long id) {
+        logger.warn("该接口已经停止使用!");
+
         FsStoreOrder order = fsStoreOrderService.selectFsStoreOrderById(id);
         ExpressInfoDTO expressInfoDTO = null;
         if (StringUtils.isNotEmpty(order.getDeliveryId())) {

+ 1 - 0
fs-admin/src/main/java/com/fs/task/StoreTask.java

@@ -387,6 +387,7 @@ public class StoreTask {
     @Autowired
     private IFsExpressService expressService;
 
+    @Deprecated
     public void changeStatus() {
         List<Long> list = fsStoreOrderMapper.selectOrderId();
         for (Long orderId : list) {

+ 1 - 1
fs-admin/src/main/resources/application.yml

@@ -19,7 +19,7 @@ fs:
 # 开发环境配置
 server:
   # 服务器的HTTP端口,默认为 7011  store 7111
-  port: 7011
+  port: 7015
   servlet:
     # 应用的访问路径
     context-path: /

+ 4 - 1
fs-api/src/main/java/com/fs/app/controller/CommonController.java

@@ -45,8 +45,12 @@ import org.springframework.web.multipart.MultipartFile;
 import java.math.BigDecimal;
 import java.nio.charset.Charset;
 import java.sql.*;
+import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
 import java.util.ArrayList;
+import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
 
 
 @Api("公共接口")
@@ -571,5 +575,4 @@ public class CommonController extends AppBaseController {
 		return orderService.updateDeliveryItem(notifyDTO);
 	}
 
-
 }

+ 2 - 2
fs-api/src/main/resources/application.yml

@@ -25,7 +25,7 @@ fs:
 # 开发环境配置
 server:
   # 服务器的HTTP端口,默认为 7014  store 7114
-  port: 7014
+  port: 7011
   servlet:
     # 应用的访问路径
     context-path: /
@@ -70,7 +70,7 @@ spring:
     # 国际化资源文件路径
     basename: i18n/messages
   profiles:
-    active: druid
+    active: dev
     include: config
   # 文件上传
   servlet:

+ 3 - 0
fs-company/src/main/java/com/fs/store/controller/FsStoreOrderController.java

@@ -229,8 +229,11 @@ public class FsStoreOrderController extends BaseController
 
     @PreAuthorize("@ss.hasPermi('store:storeOrder:express')")
     @GetMapping(value = "/getExpress/{id}")
+    @Deprecated
     public R getExpress(@PathVariable("id") Long id)
     {
+        logger.warn("该接口已经停止使用!");
+
         FsStoreOrder order=fsStoreOrderService.selectFsStoreOrderById(id);
         ExpressInfoDTO expressInfoDTO=null;
         if(StringUtils.isNotEmpty(order.getDeliveryId())){

+ 15 - 0
fs-service-system/src/main/java/com/fs/express/FsStoreDeliversService.java

@@ -40,4 +40,19 @@ public interface FsStoreDeliversService {
      * @return List<FsStoreDelivers>
      */
     List<FsStoreDelivers> findByOrderId(Long orderId);
+
+    /**
+     * 签收订单
+     * 获取当前订单下面的所有物流信息,如果都是已签收就更新订单状态
+     * @param orderId 订单id
+     */
+    void finishOrder(Long orderId);
+
+    /**
+     * 同步物流信息
+     * @param orderId 订单号
+     */
+    void syncDeliverInfo(Long orderId);
+
+    FsStoreDelivers findByOrderCodeAndDeliverId(String orderCode, String deliverId);
 }

+ 103 - 0
fs-service-system/src/main/java/com/fs/express/impl/FsStoreDeliversServiceImpl.java

@@ -1,14 +1,30 @@
 package com.fs.express.impl;
 
+import cn.hutool.core.util.ObjectUtil;
+import cn.hutool.core.util.StrUtil;
+import com.fs.common.utils.PhoneUtils;
 import com.fs.express.FsStoreDeliversService;
+import com.fs.express.IExpressService;
 import com.fs.store.domain.FsStoreDelivers;
+import com.fs.store.domain.FsStoreOrder;
+import com.fs.store.dto.ExpressInfoDTO;
+import com.fs.store.enums.ShipperCodeEnum;
 import com.fs.store.mapper.FsStoreDeliversMapper;
+import com.fs.store.service.IFsExpressService;
+import com.fs.store.service.IFsStoreOrderService;
+import org.apache.commons.lang.StringUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
 import java.time.LocalDateTime;
+import java.util.HashSet;
 import java.util.List;
+import java.util.Objects;
+import java.util.Set;
+import java.util.stream.Collectors;
 
 /**
  * 物流信息查询类
@@ -16,10 +32,16 @@ import java.util.List;
  */
 @Service
 public class FsStoreDeliversServiceImpl implements FsStoreDeliversService {
+    private static final Logger logger = LoggerFactory.getLogger(FsStoreDeliversServiceImpl.class);
 
     @Autowired
     private FsStoreDeliversMapper fsStoreDeliversMapper;
 
+    @Autowired
+    private IFsStoreOrderService orderService;
+
+    @Autowired
+    private IFsExpressService expressService;
     @Override
     public FsStoreDelivers findById(Integer id) {
         return fsStoreDeliversMapper.findById(id);
@@ -48,4 +70,85 @@ public class FsStoreDeliversServiceImpl implements FsStoreDeliversService {
     public List<FsStoreDelivers> findByOrderId(Long orderId) {
         return fsStoreDeliversMapper.findByOrderId(orderId);
     }
+
+    @Override
+    public void finishOrder(Long orderId) {
+        List<FsStoreDelivers> byOrderId = fsStoreDeliversMapper.findByOrderId(orderId);
+        Set<Integer> orderStatusSet = byOrderId.stream().map(FsStoreDelivers::getStatus)
+                .collect(Collectors.toSet());
+
+
+        Set<Integer> orderStateExSet = byOrderId.stream().map(FsStoreDelivers::getStateEx)
+                .collect(Collectors.toSet());
+
+        // 如果订单都是已经签收
+        Set<Integer> finishStatusExSet = new HashSet<>();
+        finishStatusExSet.add(301);
+        finishStatusExSet.add(302);
+        finishStatusExSet.add(304);
+        finishStatusExSet.add(311);
+
+        // orderStatusSet 必须都为3
+        if (orderStatusSet.size() == 1 && orderStatusSet.contains(3) && finishStatusExSet.containsAll(orderStateExSet)) {
+            // 订单完成
+            orderService.finishOrder(orderId);
+        }
+    }
+
+    @Override
+    public void syncDeliverInfo(Long orderId) {
+        logger.info("开始同步订单发货信息, 订单ID: {}", orderId);
+        FsStoreOrder order = orderService.selectFsStoreOrderById(orderId);
+
+        if (order == null) {
+            logger.warn("订单不存在,订单ID: {}", orderId);
+            return;
+        }
+        logger.info("查询到订单信息, 订单号: {}", order.getOrderCode());
+        List<FsStoreDelivers> byOrderId = fsStoreDeliversMapper.findByOrderId(orderId);
+        if (byOrderId.isEmpty()) {
+            logger.info("订单没有发货信息, 订单ID: {}", orderId);
+            return;
+        }
+        for (FsStoreDelivers fsStoreDelivers : byOrderId) {
+            if (ObjectUtil.isNotEmpty(fsStoreDelivers.getDeliverId())) {
+                logger.info("开始处理发货单, 发货单ID: {}, 快递单号: {}", fsStoreDelivers.getDeliverId(), fsStoreDelivers.getDeliverSn());
+                String lastFourNumber = "";
+                if (StringUtils.equals(fsStoreDelivers.getDeliverSn(), ShipperCodeEnum.SF.getValue())) {
+                    lastFourNumber = PhoneUtils.getLastFourNum(order.getUserPhone());
+                    logger.info("顺丰快递,获取手机号后四位: {}", lastFourNumber);
+                }
+                ExpressInfoDTO dto = null;
+                try {
+                    // 记录HTTP请求前的信息
+                    logger.info("开始调用快递查询接口, 订单号: {}, 快递公司编码: {}, 快递单号: {}, 手机号后四位: {}",
+                            order.getOrderCode(), fsStoreDelivers.getDeliverId(), fsStoreDelivers.getDeliverSn(), lastFourNumber);
+                    dto = expressService.getExpressInfo(order.getOrderCode(),
+                            fsStoreDelivers.getDeliverSn(), fsStoreDelivers.getDeliverId(), lastFourNumber);
+                    // 假设expressService.getExpressInfo内部进行了HTTP请求,你需要在expressService内部打印更详细的日志
+                    // 这里只记录返回结果
+                    if (ObjectUtil.isNotNull(dto)) {
+                        logger.info("快递查询接口调用成功, 订单号: {}, 快递状态: {}, 扩展状态: {}",
+                                order.getOrderCode(), dto.getState(), dto.getStateEx());
+                        fsStoreDelivers.setStatus(Integer.valueOf(dto.getState()));
+                        fsStoreDelivers.setStateEx(Integer.valueOf(dto.getStateEx()));
+                    } else {
+                        logger.warn("快递查询接口调用成功,但返回结果为空, 订单号: {}", order.getOrderCode());
+                    }
+                } catch (Exception e) {
+                    logger.error("快递查询接口调用失败, 订单号: {}, 快递单号: {}, 错误信息: {}", order.getOrderCode(), fsStoreDelivers.getDeliverSn(), e.getMessage(), e);
+                }
+            } else {
+                logger.info("发货单信息中快递ID为空, 跳过处理, 发货单ID: {}", fsStoreDelivers.getId());
+            }
+        }
+
+        fsStoreDeliversMapper.updateBatch(byOrderId);
+        logger.info("同步订单发货信息完成, 订单ID: {}", orderId);
+    }
+
+    @Override
+    public FsStoreDelivers findByOrderCodeAndDeliverId(String orderCode, String deliverId) {
+        return fsStoreDeliversMapper.findByOrderCodeAndDeliverId(orderCode,deliverId);
+    }
 }

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

@@ -66,4 +66,35 @@ public class FsStoreDelivers {
      * 更新人
      */
     private String updateBy;
+
+    /**
+     * 状态
+     */
+    private Integer status;
+
+    /**
+     *     //增值物流状态:
+     *     //0-暂无轨迹信息
+     *     //1-已揽收
+     *     //2-在途中
+     *     // 201-到达派件城市
+     *     // 202-派件中
+     *     //211-已放入快递柜或驿站
+     *     //3-已签收
+     *     // 301-正常签收
+     *     // 302-派件异常后最终签收
+     *     // 304-代收签收
+     *     // 311-快递柜或驿站签收
+     *     //4-问题件
+     *     // 401-发货无信息
+     *     // 402-超时未签收
+     *     // 403-超时未更新
+     *     // 404-拒收(退件)
+     *     // 405-派件异常
+     *     // 406-退货签收
+     *     // 407-退货未签收
+     *     //412-快递柜或驿站超时未取
+     *     //10-待揽件
+     */
+    private Integer stateEx;
 }

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

@@ -59,4 +59,47 @@ public interface FsStoreDeliversMapper {
      */
     @Select("SELECT * FROM fs_store_delivers WHERE order_id = #{orderId}")
     List<FsStoreDelivers> findByOrderId(@Param("orderId") Long orderId);
+
+    /**
+     * 通过订单号和快递号查询物流信息
+     * @param orderId 订单号
+     * @param deliverId 物流号
+     * @return FsStoreDelivers
+     */
+    @Select("SELECT * FROM fs_store_delivers WHERE order_id = #{orderId} and deliver_id=#{deliverId}")
+    FsStoreDelivers findByOrderIdAndDeliverId(Long orderId, String deliverId);
+    /**
+     * 批量更新发货信息
+     * @param byOrderId 发货信息对象列表
+     * @return 更新影响的行数
+     */
+    @Update("<script>" +
+            "<foreach collection='list' item='item' separator=';'>" +
+            "UPDATE fs_store_delivers " +
+            "<set>" +
+            "   <if test='item.orderId != null'>order_id = #{item.orderId},</if>" +
+            "   <if test='item.orderCode != null'>order_code = #{item.orderCode},</if>" +
+            "   <if test='item.deliverSn != null'>deliver_sn = #{item.deliverSn},</if>" +
+            "   <if test='item.deliverName != null'>deliver_name = #{item.deliverName},</if>" +
+            "   <if test='item.deliverId != null'>deliver_id = #{item.deliverId},</if>" +
+            "   <if test='item.status != null'>status = #{item.status},</if>" +
+            "   <if test='item.stateEx != null'>state_ex = #{item.stateEx},</if>" +
+            "   <if test='item.deliverSendTime != null'>deliver_send_time = #{item.deliverSendTime},</if>" +
+            "   <if test='item.updateTime != null'>update_time = #{item.updateTime},</if>" +
+            "   <if test='item.updateBy != null'>update_by = #{item.updateBy},</if>" +
+            "</set>" +
+            "WHERE id = #{item.id}" +
+            "</foreach>" +
+            "</script>")
+    void updateBatch(List<FsStoreDelivers> byOrderId);
+
+
+    /**
+     * 查询订单号和快递号查询物流信息
+     * @param orderCode 订单号
+     * @param deliverId 物流Id
+     * @return FsStoreDelivers
+     */
+    @Select("SELECT * FROM fs_store_delivers WHERE order_code = #{orderCode} and deliver_id=#{deliverId}")
+    FsStoreDelivers findByOrderCodeAndDeliverId(String orderCode, String deliverId);
 }

+ 5 - 1
fs-service-system/src/main/java/com/fs/store/param/FsStoreOrderExpressParam.java

@@ -6,10 +6,14 @@ import lombok.Data;
 import java.io.Serializable;
 
 @Data
-public class    FsStoreOrderExpressParam implements Serializable
+public class FsStoreOrderExpressParam implements Serializable
 {
     @ApiModelProperty(value = "orderId")
     private Long orderId;
 
+    private String deliverId;
+
+    private String deliverSn;
+
 
 }

+ 10 - 7
fs-service-system/src/main/java/com/fs/store/service/IFsExpressService.java

@@ -7,18 +7,19 @@ import com.fs.api.vo.ExpressVO;
 import com.fs.common.core.domain.R;
 import com.fs.store.domain.FsExpress;
 import com.fs.store.dto.ExpressInfoDTO;
+import com.fs.store.param.FsStoreOrderExpressParam;
 
 /**
  * 快递公司Service接口
- * 
+ *
  * @author fs
  * @date 2022-03-15
  */
-public interface IFsExpressService 
+public interface IFsExpressService
 {
     /**
      * 查询快递公司
-     * 
+     *
      * @param id 快递公司ID
      * @return 快递公司
      */
@@ -26,7 +27,7 @@ public interface IFsExpressService
 
     /**
      * 查询快递公司列表
-     * 
+     *
      * @param fsExpress 快递公司
      * @return 快递公司集合
      */
@@ -34,7 +35,7 @@ public interface IFsExpressService
 
     /**
      * 新增快递公司
-     * 
+     *
      * @param fsExpress 快递公司
      * @return 结果
      */
@@ -42,7 +43,7 @@ public interface IFsExpressService
 
     /**
      * 修改快递公司
-     * 
+     *
      * @param fsExpress 快递公司
      * @return 结果
      */
@@ -50,7 +51,7 @@ public interface IFsExpressService
 
     /**
      * 批量删除快递公司
-     * 
+     *
      * @param ids 需要删除的快递公司ID
      * @return 结果
      */
@@ -78,4 +79,6 @@ public interface IFsExpressService
 
 
     List<ExpressVO> getExpressInfoAPI(ExpressParam param);
+
+    R getExpressByDeliverId(FsStoreOrderExpressParam param);
 }

+ 1 - 0
fs-service-system/src/main/java/com/fs/store/service/IFsStoreOrderService.java

@@ -196,4 +196,5 @@ public interface IFsStoreOrderService
     int uploadItemJson(FsStoreOrder order);
 
     ExpressResultDTO updateDeliveryItem(ExpressNotifyDTO notifyDTO);
+
 }

+ 49 - 0
fs-service-system/src/main/java/com/fs/store/service/impl/FsExpressServiceImpl.java

@@ -8,6 +8,7 @@ import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 
+import cn.hutool.core.util.ObjectUtil;
 import cn.hutool.core.util.StrUtil;
 import cn.hutool.http.HttpUtil;
 import cn.hutool.json.JSONUtil;
@@ -18,8 +19,10 @@ 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.common.utils.PhoneUtils;
 import com.fs.express.enums.TaskStatusEnum;
 import com.fs.store.domain.FsOrderExpressPush;
+import com.fs.store.domain.FsStoreDelivers;
 import com.fs.store.domain.FsStoreOrder;
 import com.fs.store.dto.ExpressAddressDTO;
 import com.fs.store.dto.ExpressAddressDataDTO;
@@ -27,8 +30,12 @@ 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.FsStoreDeliversMapper;
 import com.fs.store.mapper.FsStoreOrderMapper;
+import com.fs.store.param.FsStoreOrderExpressParam;
+import com.fs.store.service.IFsStoreOrderService;
 import com.hc.openapi.tool.util.ObjectUtils;
+import org.apache.commons.lang.StringUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -62,6 +69,15 @@ public class FsExpressServiceImpl implements IFsExpressService
     @Autowired
     private FsOrderExpressPushMapper fsOrderExpressPushMapper;
 
+    @Autowired
+    private IFsStoreOrderService orderService;
+
+    @Autowired
+    private IFsExpressService expressService;
+    @Autowired
+    private FsStoreDeliversMapper fsStoreDeliversMapper;
+
+
     /**
      * 查询快递公司
      *
@@ -250,6 +266,7 @@ public class FsExpressServiceImpl implements IFsExpressService
 
     @Override
     public List<ExpressVO> getExpressInfoAPI(ExpressParam param) {
+        //TODO 需要修改
         FsStoreOrder order=fsStoreOrderMapper.selectFsStoreOrderByDeliveryId(param.getPackageno());
         if(order!=null){
 
@@ -301,6 +318,38 @@ public class FsExpressServiceImpl implements IFsExpressService
         return null;
 
     }
+    @Override
+    public R getExpressByDeliverId(FsStoreOrderExpressParam param) {
+        // 添加日志 - 开始
+        Logger logger = LoggerFactory.getLogger(this.getClass());
+        logger.info("查询物流信息开始,参数:{}", param);
+        FsStoreOrder fsStoreOrder = orderService.selectFsStoreOrderById(param.getOrderId());
+        // 添加日志 - 订单信息
+        logger.info("查询到订单信息:{}", fsStoreOrder);
+        //顺丰轨迹查询处理
+        String lastFourNumber = "";
+        if (StringUtils.equals(param.getDeliverSn(),ShipperCodeEnum.SF.getValue())) {
+            lastFourNumber = PhoneUtils.getLastFourNum(fsStoreOrder.getUserPhone());
+            // 添加日志 - 顺丰单号
+            logger.info("顺丰单号处理,获取用户手机号后四位:{}", lastFourNumber);
+        }
+        ExpressInfoDTO dto = null;
+        try {
+            dto = expressService.getExpressInfo(fsStoreOrder.getOrderCode(),
+                    param.getDeliverSn(),
+                    param.getDeliverId(),
+                    lastFourNumber);
+            // 添加日志 - 成功获取物流信息
+            logger.info("成功获取物流信息,订单号:{},物流单号:{}, 快递公司ID:{}, 返回数据:{}", fsStoreOrder.getOrderCode(), param.getDeliverSn(),param.getDeliverId(), dto);
+        } catch (Exception e) {
+            // 添加日志 - 异常
+            logger.error("获取物流信息异常,订单号:{},物流单号:{},快递公司ID:{}", fsStoreOrder.getOrderCode(), param.getDeliverSn(), param.getDeliverId(), e);
+        }
+        // 添加日志 - 结束
+        logger.info("查询物流信息结束,订单号:{}", param.getOrderId());
+
+        return R.ok().put("data",dto);
+    }
 
     /**
      * Sign签名生成

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

@@ -45,6 +45,7 @@ import com.fs.company.service.ICompanyUserService;
 import com.fs.erp.domain.*;
 import com.fs.erp.dto.*;
 import com.fs.erp.service.IErpOrderService;
+import com.fs.express.FsStoreDeliversService;
 import com.fs.huifuPay.domain.HuiFuRefundResult;
 import com.fs.huifuPay.dto.*;
 import com.fs.huifuPay.sdk.opps.core.request.V2TradePaymentScanpayRefundRequest;
@@ -190,6 +191,13 @@ public class FsStoreOrderServiceImpl implements IFsStoreOrderService
 
     @Autowired
     private FsStoreDeliversMapper fsStoreDeliversMapper;
+
+    @Autowired
+    private IFsStoreOrderService orderService;
+
+    @Autowired
+    private FsStoreDeliversService fsStoreDeliversService;
+
     /**
      * 查询订单
      *
@@ -902,9 +910,9 @@ public class FsStoreOrderServiceImpl implements IFsStoreOrderService
             // 微信消息通知
             TemplateBean templateBean = TemplateBean.builder()
                     .orderId(order.getId().toString())
-                    .orderCode(order.getOrderCode().toString())
-                    .deliveryId(order.getDeliveryId())
-                    .deliveryName(order.getDeliveryName())
+                    .orderCode(order.getOrderCode())
+                    .deliveryId(deliveryId)
+                    .deliveryName(express.getName())
                     .userId(order.getUserId())
                     .templateType(TemplateListenEnum.TYPE_2.getValue())
                     .build();
@@ -912,38 +920,34 @@ public class FsStoreOrderServiceImpl implements IFsStoreOrderService
 
             //订阅物流回调
             String lastFourNumber = "";
-            if (order.getDeliverySn().equals(ShipperCodeEnum.SF.getValue())) {
-                lastFourNumber = order.getUserPhone();
-                if (lastFourNumber.length() == 11) {
-                    lastFourNumber = StrUtil.sub(lastFourNumber, lastFourNumber.length(), -4);
-                }
+            if (StringUtils.equals(express.getCode(),ShipperCodeEnum.SF.getValue())) {
+                lastFourNumber = PhoneUtils.getLastFourNum(order.getUserPhone());
             }
-            expressService.subscribeEspress(order.getOrderCode(),order.getDeliverySn(),order.getDeliveryId(),lastFourNumber);
+            expressService.subscribeEspress(order.getOrderCode(),express.getCode(),deliveryId,lastFourNumber);
         }
     }
 
     @Override
-    public void updateDeliveryOrder(Long id,String deliveryId,String deliverCode,String deliverName) {
-        FsStoreOrder order= fsStoreOrderMapper.selectFsStoreOrderById(id);
-        if(order!=null){
-            FsExpress express=expressService.selectFsExpressByOmsCode(deliverCode);
-            if(express!=null){
-            order.setDeliveryName(deliverName);
-            order.setDeliverySn(express.getCode());
-            order.setDeliveryId(deliveryId);
-            order.setDeliverySendTime(new Date());
-            fsStoreOrderMapper.updateFsStoreOrder(order);
-            orderStatusService.create(order.getId(), OrderLogEnum.DELIVERY_GOODS.getValue(),
-                    OrderLogEnum.DELIVERY_GOODS.getDesc());
-            //订阅物流回调
-            String lastFourNumber = "";
-            if (express.getCode().equals(ShipperCodeEnum.SF.getValue())) {
-                lastFourNumber = order.getUserPhone();
-                if (lastFourNumber.length() == 11) {
-                    lastFourNumber = StrUtil.sub(lastFourNumber, lastFourNumber.length(), -4);
+    public void updateDeliveryOrder(Long id, String deliveryId, String deliverCode, String deliverName) {
+        FsStoreOrder order = fsStoreOrderMapper.selectFsStoreOrderById(id);
+        if (order != null) {
+            FsExpress express = expressService.selectFsExpressByOmsCode(deliverCode);
+            if (express != null) {
+                order.setDeliveryName(deliverName);
+                order.setDeliverySn(express.getCode());
+                order.setDeliveryId(deliveryId);
+                order.setDeliverySendTime(new Date());
+                fsStoreOrderMapper.updateFsStoreOrder(order);
+                orderStatusService.create(order.getId(), OrderLogEnum.DELIVERY_GOODS.getValue(),
+                        OrderLogEnum.DELIVERY_GOODS.getDesc());
+                //订阅物流回调
+                String lastFourNumber = "";
+                if (express.getCode().equals(ShipperCodeEnum.SF.getValue())) {
+                    if (StringUtils.equals(express.getCode(), ShipperCodeEnum.SF.getValue())) {
+                        lastFourNumber = PhoneUtils.getLastFourNum(order.getUserPhone());
+                    }
                 }
-            }
-            expressService.subscribeEspress(order.getOrderCode(),express.getCode(),deliveryId,lastFourNumber);
+                expressService.subscribeEspress(order.getOrderCode(), express.getCode(), deliveryId, lastFourNumber);
             }
         }
     }
@@ -1078,12 +1082,10 @@ public class FsStoreOrderServiceImpl implements IFsStoreOrderService
     public List<FsMyStoreOrderListQueryVO> selectFsCompanyStoreOrderListVO(FsMyStoreOrderQueryParam param) {
         List<FsMyStoreOrderListQueryVO> list=fsStoreOrderMapper.selectFsCompanyStoreOrderListVO(param);
         for(FsMyStoreOrderListQueryVO vo:list){
-//          List<FsStoreOrderItemVO> items=fsStoreOrderItemMapper.selectMyFsStoreOrderItemListByOrderId(vo.getId());
-//          vo.setItems(items);
             if(StringUtils.isNotEmpty(vo.getItemJson())){
                 JSONArray jsonArray=JSONUtil.parseArray(vo.getItemJson());
                 List<FsStoreOrderItemVO> items=JSONUtil.toList(jsonArray, FsStoreOrderItemVO.class);
-                if(items.size()>0){
+                if(CollectionUtils.isNotEmpty(items)){
                     vo.setItems(items);
                 }
             }
@@ -2080,25 +2082,11 @@ public class FsStoreOrderServiceImpl implements IFsStoreOrderService
     @Override
     @Transactional
     public R syncExpress(FsStoreOrderExpressEditParam param) {
-        FsStoreOrder order = fsStoreOrderMapper.selectFsStoreOrderById(param.getOrderId());
-        String lastFourNumber = "";
-        if (order.getDeliverySn().equals(ShipperCodeEnum.SF.getValue())) {
-            lastFourNumber = order.getUserPhone();
-            if (lastFourNumber.length() == 11) {
-                lastFourNumber = StrUtil.sub(lastFourNumber, lastFourNumber.length(), -4);
-            }
-        }
-        ExpressInfoDTO dto=expressService.getExpressInfo(order.getOrderCode(),order.getDeliverySn(),order.getDeliveryId(),lastFourNumber);
-        FsStoreOrder map=new FsStoreOrder();
-        map.setDeliveryStatus(Integer.parseInt(dto.getState()));
-        map.setId(order.getId());
-        map.setDeliveryType(dto.getStateEx());
-        fsStoreOrderMapper.updateFsStoreOrder(map);
-        //如果是正常签收,更新订单状态
-        if(dto.getState().equals("3")&&(dto.getStateEx().equals("301")||dto.getStateEx().equals("302")||dto.getStateEx().equals("304")||dto.getStateEx().equals("311"))){
-            finishOrder(order.getId());
-        }
-        return null;
+
+        fsStoreDeliversService.syncDeliverInfo(param.getOrderId());
+        fsStoreDeliversService.finishOrder(param.getOrderId());
+
+        return R.ok();
     }
 
     @Override
@@ -2700,53 +2688,49 @@ public class FsStoreOrderServiceImpl implements IFsStoreOrderService
         //https://api.hospital.ifeiyu100.com/app/common/expressNotify
         String data= URLDecoder.decode(notifyDTO.getRequestData(), Charset.forName("UTF-8"));
         //ExpressInfoDTO
-        logger.info("快递根踪回调:"+data);
+        logger.info("快递跟踪回调: {}",data);
         ExpressDataDTO expressDataDTO=JSONUtil.toBean(data,ExpressDataDTO.class);
-        if(expressDataDTO!=null&&expressDataDTO.getData()!=null){
-            for(ExpressInfoDTO dto:expressDataDTO.getData()){
-                List<FsStoreOrder> orders=this.selectFsStoreOrderListByDeliveryId(dto.getLogisticCode());
-                if(orders!=null){
-                    for(FsStoreOrder order:orders){
-                        logger.info("订单信息:"+JSONUtil.toJsonStr(order));
-                        logger.info("运单号:"+dto.getLogisticCode());
-                        if(order!=null && (order.getDeliveryStatus()==null||order.getDeliveryStatus()!=3)){
-                            if (dto.getState()!=null&&dto.getStateEx()!=null) {
-                                FsStoreOrder map = new FsStoreOrder();
-                                map.setDeliveryStatus(Integer.parseInt(dto.getState()));
-                                map.setId(order.getId());
-                                map.setDeliveryType(dto.getStateEx());
-                                this.updateFsStoreOrder(map);
-                                //如果是正常签收,更新订单状态
-                                if (dto.getState().equals("3") && (dto.getStateEx().equals("301") || dto.getStateEx().equals("302") || dto.getStateEx().equals("304") || dto.getStateEx().equals("311"))) {
-                                    this.finishOrder(order.getId());
-                                }
-                            }
-                            if (!dto.isSuccess()){
-                                logger.info("物流状态异常:{}",dto);
-                            }
-                            //如果无轨迹重新订阅
-                            if ((!dto.isSuccess()&&dto.getReason().equals("三天无轨迹"))||(!dto.isSuccess()&&dto.getReason().equals("七天内无轨迹变化"))){
-                                //订阅物流回调
-                                String lastFourNumber = "";
-                                if (order.getDeliverySn().equals(ShipperCodeEnum.SF.getValue())) {
-                                    lastFourNumber = order.getUserPhone();
-                                    if (lastFourNumber.length() == 11) {
-                                        lastFourNumber = StrUtil.sub(lastFourNumber, lastFourNumber.length(), -4);
-                                    }
-                                }
-                                logger.info("物流重新订阅:{}",order.getDeliveryId());
-                                expressService.subscribeEspress(order.getOrderCode(),order.getDeliverySn(),order.getDeliveryId(),lastFourNumber);
-                            }
 
-                        }
+        if(ObjectUtil.isNotNull(expressDataDTO)){
+            List<ExpressInfoDTO> expressInfoDTOList = expressDataDTO.getData();
+            List<FsStoreDelivers> delivers = new ArrayList<>();
+            for (ExpressInfoDTO express : expressInfoDTOList) {
+                FsStoreDelivers deliver = fsStoreDeliversService
+                        .findByOrderCodeAndDeliverId(express.getOrderCode(), express.getLogisticCode());
+                if(ObjectUtil.isNotNull(express) && express.isSuccess()){
+                    if(ObjectUtil.isNotNull(deliver)){
+                        deliver.setStatus(Integer.valueOf(express.getState()));
+                        deliver.setStateEx(Integer.valueOf(express.getStateEx()));
+
+                        delivers.add(deliver);
                     }
                 }
 
+                //如果无轨迹重新订阅
+                if ((!express.isSuccess()&&express.getReason().equals("三天无轨迹"))||(!express.isSuccess()&&express.getReason().equals("七天内无轨迹变化"))){
+                    FsStoreOrder fsStoreOrder = orderService.selectFsStoreOrderByOrderCode(express.getOrderCode());
+                    String lastFourNumber = "";
+                    if(StringUtils.equals(deliver.getDeliverSn(), ShipperCodeEnum.SF.getValue())){
+                        lastFourNumber = PhoneUtils.getLastFourNum(fsStoreOrder.getUserPhone());
+                    }
+                    logger.info("物流重新订阅:{}",fsStoreOrder.getDeliveryId());
+                    if(ObjectUtil.isNotNull(deliver)){
+                        expressService.subscribeEspress(fsStoreOrder.getOrderCode(),deliver.getDeliverSn(),deliver.getDeliverId(),lastFourNumber);
+                    }
+                }
             }
-            return ExpressResultDTO.success(sysConfig.getKdnId().trim());
+            // 更新物流状态
+            fsStoreDeliversMapper.updateBatch(delivers);
+            List<Long> collect = delivers.stream().map(FsStoreDelivers::getOrderId)
+                    .filter(ObjectUtil::isNotNull)
+                    .collect(Collectors.toList());
+
+            for (Long orderId : collect) {
+                fsStoreDeliversService.finishOrder(orderId);
+            }
+
         }
-        return ExpressResultDTO.error(sysConfig.getKdnId().trim(),"物流详情数据为null");
+        return ExpressResultDTO.success(sysConfig.getKdnId().trim());
     }
 
-
 }

+ 2 - 2
fs-service-system/src/main/resources/application-config.yml

@@ -1,8 +1,8 @@
 #配置
 fsConfig:
   #快递鸟
-  kdnId: 1762981
-  kdnKeyId: 024e89b1-25c7-4725-8a3c-1bf1ca3ddcab
+  kdnId: 1881217
+  kdnKeyId: a43fee18-3ea9-4eff-99c0-7e94618d7a57
   kdnUrl: http://api.kdniao.com/Ebusiness/EbusinessOrderHandle.aspx
   kdnSubscribeUrl: https://api.kdniao.com/api/dist
   kdnAddressUrl: https://api.kdniao.com/api/dist

+ 135 - 2
fs-user-app/src/main/java/com/fs/app/controller/StoreOrderController.java

@@ -8,6 +8,8 @@ import cn.hutool.core.util.ObjectUtil;
 import cn.hutool.core.util.StrUtil;
 import cn.hutool.json.JSONUtil;
 import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
 import com.fs.app.annotation.Login;
 import com.fs.common.annotation.RepeatSubmit;
 
@@ -1321,9 +1323,55 @@ public class StoreOrderController extends  AppBaseController {
         if (order.getStatus() <2) {
             throw new CustomException("未发货订单不能查询");
         }
-        return orderService.getExpress(order);
+
+        JSONObject jsonObject = JSONObject.parseObject("{\n" +
+                "  \"LogisticCode\": \"YT1234567890\",  // 物流运单号, 示例:YT1234567890\n" +
+                "  \"ShipperCode\": \"YTO\",          // 快递公司编码, 示例:YTO (圆通)\n" +
+                "  \"Traces\": [                    // 物流轨迹, 数组形式,包含多个物流节点信息\n" +
+                "    {\n" +
+                "      \"Action\": \"已揽收\",       // 动作, 示例: 已揽收\n" +
+                "      \"Location\": \"上海市\",      //位置, 示例: 上海市\n" +
+                "      \"AcceptStation\": \"【上海市】已揽收, 揽收员:张三\",  // 物流节点描述, 示例:包裹已被揽收\n" +
+                "      \"AcceptTime\": \"2024-03-15 08:00:00\" // 物流节点时间, 示例:2024-03-15 08:00:00\n" +
+                "    },\n" +
+                "    {\n" +
+                "      \"Action\": \"运输中\",      // 动作, 示例: 运输中\n" +
+                "      \"Location\": \"上海市\",     // 位置, 示例:上海市\n" +
+                "      \"AcceptStation\": \"【上海市】已发出,下一站【上海市浦东新区】\",\n" +
+                "      \"AcceptTime\": \"2024-03-15 10:00:00\"\n" +
+                "    },\n" +
+                "    {\n" +
+                "      \"Action\": \"派送中\",      // 动作, 示例:派送中\n" +
+                "      \"Location\":\"上海市浦东新区\",       //位置, 示例:上海市浦东新区\n" +
+                "      \"AcceptStation\": \"【上海市浦东新区】派件中,派件员:张三,电话:13800000000\",\n" +
+                "      \"AcceptTime\": \"2024-03-16 09:00:00\"\n" +
+                "    },\n" +
+                "    {\n" +
+                "      \"Action\": \"已签收\",     // 动作, 示例:已签收\n" +
+                "      \"Location\": \"上海市浦东新区\",      //位置, 示例: 上海市浦东新区\n" +
+                "      \"AcceptStation\": \"【上海市浦东新区】已签收,签收人:本人\",\n" +
+                "      \"AcceptTime\": \"2024-03-16 12:00:00\"\n" +
+                "    }\n" +
+                "  ],\n" +
+                "  \"State\": \"3\",                // 物流状态:0-暂无轨迹信息 1-已揽收 2-在途中,3-签收,4-问题件, 示例:3 (已签收)\n" +
+                "  \"StateEx\": \"301\",              // 增值物流状态, 示例:301 (正常签收)\n" +
+                "  \"EBusinessID\": \"user123\",      // 用户ID, 示例:user123\n" +
+                "  \"Success\": true,             // 成功与否, 示例:true (成功)\n" +
+                "  \"Reason\": \"\",               // 失败原因, 示例:空字符串 (成功时为空)\n" +
+                "  \"ShipperName\": \"圆通快递\", // 快递公司名称, 示例:圆通快递\n" +
+                "  \"OrderCode\": \"order20240315\"  // 订单编号, 示例:order20240315\n" +
+                "}");
+
+        FsExpress fsExpress = new FsExpress();
+        fsExpress.setCode("YTO");
+        fsExpress.setName("圆通快递");
+
+        return R.ok().put("data", jsonObject)
+                .put("express",fsExpress).put("deliveryId",order.getDeliveryId());
+//        return orderService.getExpress(order);
     }
 
+
     @Login
     @ApiOperation("物流查询多运单号")
     @PostMapping("/getExpressMulti")
@@ -1335,7 +1383,92 @@ public class StoreOrderController extends  AppBaseController {
         if (order.getStatus() <2) {
             throw new CustomException("未发货订单不能查询");
         }
-        return orderService.getExpressMulti(order);
+//        return orderService.getExpressMulti(order);
+
+        JSONObject jsonObject = JSONObject.parseObject("{\n" +
+                "  \"LogisticCode\": \"YT1234567890\",  // 物流运单号, 示例:YT1234567890\n" +
+                "  \"ShipperCode\": \"YTO\",          // 快递公司编码, 示例:YTO (圆通)\n" +
+                "  \"Traces\": [                    // 物流轨迹, 数组形式,包含多个物流节点信息\n" +
+                "    {\n" +
+                "      \"Action\": \"已揽收\",       // 动作, 示例: 已揽收\n" +
+                "      \"Location\": \"上海市\",      //位置, 示例: 上海市\n" +
+                "      \"AcceptStation\": \"【上海市】已揽收, 揽收员:张三\",  // 物流节点描述, 示例:包裹已被揽收\n" +
+                "      \"AcceptTime\": \"2024-03-15 08:00:00\" // 物流节点时间, 示例:2024-03-15 08:00:00\n" +
+                "    },\n" +
+                "    {\n" +
+                "      \"Action\": \"运输中\",      // 动作, 示例: 运输中\n" +
+                "      \"Location\": \"上海市\",     // 位置, 示例:上海市\n" +
+                "      \"AcceptStation\": \"【上海市】已发出,下一站【上海市浦东新区】\",\n" +
+                "      \"AcceptTime\": \"2024-03-15 10:00:00\"\n" +
+                "    },\n" +
+                "    {\n" +
+                "      \"Action\": \"派送中\",      // 动作, 示例:派送中\n" +
+                "      \"Location\":\"上海市浦东新区\",       //位置, 示例:上海市浦东新区\n" +
+                "      \"AcceptStation\": \"【上海市浦东新区】派件中,派件员:张三,电话:13800000000\",\n" +
+                "      \"AcceptTime\": \"2024-03-16 09:00:00\"\n" +
+                "    },\n" +
+                "    {\n" +
+                "      \"Action\": \"已签收\",     // 动作, 示例:已签收\n" +
+                "      \"Location\": \"上海市浦东新区\",      //位置, 示例: 上海市浦东新区\n" +
+                "      \"AcceptStation\": \"【上海市浦东新区】已签收,签收人:本人\",\n" +
+                "      \"AcceptTime\": \"2024-03-16 12:00:00\"\n" +
+                "    }\n" +
+                "  ],\n" +
+                "  \"State\": \"3\",                // 物流状态:0-暂无轨迹信息 1-已揽收 2-在途中,3-签收,4-问题件, 示例:3 (已签收)\n" +
+                "  \"StateEx\": \"301\",              // 增值物流状态, 示例:301 (正常签收)\n" +
+                "  \"EBusinessID\": \"user123\",      // 用户ID, 示例:user123\n" +
+                "  \"Success\": true,             // 成功与否, 示例:true (成功)\n" +
+                "  \"Reason\": \"\",               // 失败原因, 示例:空字符串 (成功时为空)\n" +
+                "  \"ShipperName\": \"圆通快递\", // 快递公司名称, 示例:圆通快递\n" +
+                "  \"OrderCode\": \"order20240315\"  // 订单编号, 示例:order20240315\n" +
+                "}");
+        JSONObject jsonObject2 = JSONObject.parseObject("{\n" +
+                "  \"LogisticCode\": \"SF9876543210\",\n" +
+                "  \"ShipperCode\": \"SF\",\n" +
+                "  \"Traces\": [\n" +
+                "    {\n" +
+                "      \"Action\": \"已揽收\",\n" +
+                "      \"Location\": \"上海市\",\n" +
+                "      \"AcceptStation\": \"【上海市】已揽收, 揽收员:张三\",\n" +
+                "      \"AcceptTime\": \"2024-03-15 08:00:00\"\n" +
+                "    },\n" +
+                "    {\n" +
+                "      \"Action\": \"运输中\",\n" +
+                "      \"Location\": \"上海市\",\n" +
+                "      \"AcceptStation\": \"【上海市】已发出,下一站【上海市浦东新区】\",\n" +
+                "      \"AcceptTime\": \"2024-03-15 10:00:00\"\n" +
+                "    },\n" +
+                "    {\n" +
+                "      \"Action\": \"派送中\",\n" +
+                "      \"Location\": \"上海市浦东新区\",\n" +
+                "      \"AcceptStation\": \"【上海市浦东新区】派件中,派件员:张三,电话:13800000000\",\n" +
+                "      \"AcceptTime\": \"2024-03-16 09:00:00\"\n" +
+                "    },\n" +
+                "    {\n" +
+                "      \"Action\": \"已签收\",\n" +
+                "      \"Location\": \"上海市浦东新区XX小区\",\n" +
+                "      \"AcceptStation\": \"【上海市浦东新区】已签收,签收人:门卫\",\n" +
+                "      \"AcceptTime\": \"2024-03-16 12:30:00\"\n" +
+                "    },\n" +
+                "    {\n" +
+                "      \"Action\": \"离开\",\n" +
+                "      \"Location\": \"上海市浦东新区XX小区\",\n" +
+                "      \"AcceptStation\": \"包裹已离开XX小区,开始新的旅程\",\n" +
+                "      \"AcceptTime\": \"2024-03-16 13:00:00\"\n" +
+                "    }\n" +
+                "  ],\n" +
+                "  \"State\": \"3\",\n" +
+                "  \"StateEx\": \"302\",\n" +
+                "  \"EBusinessID\": \"user456\",\n" +
+                "  \"Success\": true,\n" +
+                "  \"Reason\": \"\",\n" +
+                "  \"ShipperName\": \"顺丰速运\",\n" +
+                "  \"OrderCode\": \"order20240316\"\n" +
+                "}");
+        JSONArray objects = new JSONArray();
+        objects.add(jsonObject);
+        objects.add(jsonObject2);
+        return R.ok().put("data", objects);
     }