Przeglądaj źródła

中车API对接

Lijingyang 2 miesięcy temu
rodzic
commit
017bf9dbec
36 zmienionych plików z 1242 dodań i 449 usunięć
  1. 14 0
      ruoyi-api/ruoyi-api-customer/src/main/java/org/dromara/customer/api/RemotePartnerPreparedService.java
  2. 18 0
      ruoyi-api/ruoyi-api-customer/src/main/java/org/dromara/customer/api/domain/dto/PartnerPreparedDTO.java
  3. 3 1
      ruoyi-api/ruoyi-api-external/src/main/java/org/dromara/external/api/zhongche/domain/bo/MessageBo.java
  4. 5 0
      ruoyi-api/ruoyi-api-external/src/main/java/org/dromara/external/api/zhongche/domain/vo/MessageVo.java
  5. 11 1
      ruoyi-api/ruoyi-api-order/src/main/java/org/dromara/product/api/RemoteExternalOrderService.java
  6. 31 0
      ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/zhongche/vo/TrackVo.java
  7. 75 0
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/dubbo/RemotePartnerPreparedServiceImpl.java
  8. 54 0
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/enums/PartnerPreparedStatusEnum.java
  9. 1 0
      ruoyi-modules/ruoyi-external/pom.xml
  10. 2 0
      ruoyi-modules/ruoyi-external/src/main/java/org/dromara/external/controller/ExternalProductController.java
  11. 150 422
      ruoyi-modules/ruoyi-external/src/main/java/org/dromara/external/controller/zhongche/ZhongChePullController.java
  12. 9 22
      ruoyi-modules/ruoyi-external/src/main/java/org/dromara/external/controller/zhongche/ZhongChePushController.java
  13. 39 0
      ruoyi-modules/ruoyi-external/src/main/java/org/dromara/external/controller/zhongche/handle/MallMessageDispatcher.java
  14. 18 0
      ruoyi-modules/ruoyi-external/src/main/java/org/dromara/external/controller/zhongche/handle/MallMessageHandler.java
  15. 76 0
      ruoyi-modules/ruoyi-external/src/main/java/org/dromara/external/controller/zhongche/handle/impl/AccountActiveMessageHandler.java
  16. 45 0
      ruoyi-modules/ruoyi-external/src/main/java/org/dromara/external/controller/zhongche/handle/impl/AfterSaleApplyMessageHandler.java
  17. 41 0
      ruoyi-modules/ruoyi-external/src/main/java/org/dromara/external/controller/zhongche/handle/impl/AfterSaleCancelMessageHandler.java
  18. 33 0
      ruoyi-modules/ruoyi-external/src/main/java/org/dromara/external/controller/zhongche/handle/impl/BillAbnormalPassMessageHandler.java
  19. 34 0
      ruoyi-modules/ruoyi-external/src/main/java/org/dromara/external/controller/zhongche/handle/impl/BillConfirmMessageHandler.java
  20. 33 0
      ruoyi-modules/ruoyi-external/src/main/java/org/dromara/external/controller/zhongche/handle/impl/BillCreateMessageHandler.java
  21. 34 0
      ruoyi-modules/ruoyi-external/src/main/java/org/dromara/external/controller/zhongche/handle/impl/BillFinishMessageHandler.java
  22. 35 0
      ruoyi-modules/ruoyi-external/src/main/java/org/dromara/external/controller/zhongche/handle/impl/BillModifyMessageHandler.java
  23. 35 0
      ruoyi-modules/ruoyi-external/src/main/java/org/dromara/external/controller/zhongche/handle/impl/BillRejctPassMessageHandler.java
  24. 41 0
      ruoyi-modules/ruoyi-external/src/main/java/org/dromara/external/controller/zhongche/handle/impl/BillRuleCreateMessageHandler.java
  25. 34 0
      ruoyi-modules/ruoyi-external/src/main/java/org/dromara/external/controller/zhongche/handle/impl/BillWaitInvoiceMessageHandler.java
  26. 41 0
      ruoyi-modules/ruoyi-external/src/main/java/org/dromara/external/controller/zhongche/handle/impl/OrderCancelApplyMessageHandler.java
  27. 44 0
      ruoyi-modules/ruoyi-external/src/main/java/org/dromara/external/controller/zhongche/handle/impl/OrderCancelMessageHandler.java
  28. 39 0
      ruoyi-modules/ruoyi-external/src/main/java/org/dromara/external/controller/zhongche/handle/impl/OrderCreateMessageHandler.java
  29. 40 0
      ruoyi-modules/ruoyi-external/src/main/java/org/dromara/external/controller/zhongche/handle/impl/OrderReceiveConfirmMessageHandler.java
  30. 40 0
      ruoyi-modules/ruoyi-external/src/main/java/org/dromara/external/controller/zhongche/handle/impl/PrepareCancelMessageHandler.java
  31. 40 0
      ruoyi-modules/ruoyi-external/src/main/java/org/dromara/external/controller/zhongche/handle/impl/PrepareConfirmMessageHandler.java
  32. 21 2
      ruoyi-modules/ruoyi-external/src/main/java/org/dromara/external/enums/MallMessageTypeEnum.java
  33. 5 0
      ruoyi-modules/ruoyi-external/src/main/java/org/dromara/external/service/IExternalProductService.java
  34. 6 0
      ruoyi-modules/ruoyi-external/src/main/java/org/dromara/external/service/impl/ExternalProductServiceImpl.java
  35. 61 1
      ruoyi-modules/ruoyi-order/src/main/java/org/dromara/order/dubbo/RemoteExternalOrderServiceImpl.java
  36. 34 0
      ruoyi-modules/ruoyi-order/src/main/java/org/dromara/order/enums/PackStatusEnum.java

+ 14 - 0
ruoyi-api/ruoyi-api-customer/src/main/java/org/dromara/customer/api/RemotePartnerPreparedService.java

@@ -0,0 +1,14 @@
+package org.dromara.customer.api;
+
+import org.dromara.customer.api.domain.dto.PartnerPreparedDTO;
+
+/**
+ * author
+ * 时间:2026/2/3,17:49
+ */
+public interface RemotePartnerPreparedService {
+
+    PartnerPreparedDTO updatePartnerPreparedById(String id);
+
+    PartnerPreparedDTO cancelPartnerPreparedById(String prepareOrderNo, String cancelReason);
+}

+ 18 - 0
ruoyi-api/ruoyi-api-customer/src/main/java/org/dromara/customer/api/domain/dto/PartnerPreparedDTO.java

@@ -0,0 +1,18 @@
+package org.dromara.customer.api.domain.dto;
+
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * author
+ * 时间:2026/2/3,17:51
+ */
+@Data
+public class PartnerPreparedDTO implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    private boolean flag;
+
+    private String message;
+}

+ 3 - 1
ruoyi-api/ruoyi-api-external/src/main/java/org/dromara/external/api/zhongche/domain/bo/MessageBo.java

@@ -4,6 +4,8 @@ import lombok.AllArgsConstructor;
 import lombok.Data;
 import lombok.NoArgsConstructor;
 
+import java.util.Map;
+
 /**
  * 消息监听接口的业务请求参数
  * (对应请求体中 data 字段 Base64 解码后的内容)
@@ -23,7 +25,7 @@ public class MessageBo {
     /**
      * 消息内容,格式为json对象
      */
-    private Object content;
+    private Map<String, Object> content;
     /**
      * 推送时间,格式YYYYMMDDHHMMSS
      */

+ 5 - 0
ruoyi-api/ruoyi-api-external/src/main/java/org/dromara/external/api/zhongche/domain/vo/MessageVo.java

@@ -12,6 +12,11 @@ import lombok.NoArgsConstructor;
 @NoArgsConstructor
 @AllArgsConstructor
 public class MessageVo {
+
+    public MessageVo(String result) {
+        this.result = result;
+    }
+
     /**
      * 结果:0-失败 1-成功
      */

+ 11 - 1
ruoyi-api/ruoyi-api-order/src/main/java/org/dromara/product/api/RemoteExternalOrderService.java

@@ -1,7 +1,7 @@
 package org.dromara.product.api;
 
 import org.dromara.common.core.domain.zhongche.domain.DeliveryTrack;
-import org.dromara.external.api.zhongche.domain.vo.TrackVo;
+import org.dromara.common.core.domain.zhongche.vo.TrackVo;
 import org.dromara.product.api.domain.dto.OrderNoDto;
 import org.dromara.product.api.domain.dto.OrderNoticeDto;
 import org.dromara.product.api.domain.dto.OrderPushDto;
@@ -44,4 +44,14 @@ public interface RemoteExternalOrderService {
 
     //获取退货订单号
     String getReturnOrderNo(String ZCorderNo);
+
+    //取消订单
+    boolean cancelOrder(String orderNo ,String cancelReason);
+
+    //确认收获消息
+    boolean confirmReceive(String orderNo , String outgoingCode);
+
+    //取消售后订单
+    boolean cancelReturnOrder(String afterSaleNo, String cancelReason);
+
 }

+ 31 - 0
ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/zhongche/vo/TrackVo.java

@@ -0,0 +1,31 @@
+package org.dromara.common.core.domain.zhongche.vo;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import org.dromara.common.core.domain.zhongche.domain.DeliveryTrack;
+
+import java.util.List;
+
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+public class TrackVo {
+    /**
+     * 物流单号
+     * 非必填
+     */
+    private String expressCode;
+
+    /**
+     * 物流公司
+     * 非必填
+     */
+    private String expressCompanyName;
+
+    /**
+     * 物流信息列表
+     * 非必填
+     */
+    private List<DeliveryTrack> deliveryTrack;
+}

+ 75 - 0
ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/dubbo/RemotePartnerPreparedServiceImpl.java

@@ -0,0 +1,75 @@
+package org.dromara.customer.dubbo;
+
+import lombok.RequiredArgsConstructor;
+import org.apache.dubbo.config.annotation.DubboService;
+import org.dromara.customer.api.RemotePartnerPreparedService;
+import org.dromara.customer.api.domain.dto.PartnerPreparedDTO;
+import org.dromara.customer.domain.PartnerPrepared;
+import org.dromara.customer.enums.PartnerPreparedStatusEnum;
+import org.dromara.customer.service.IPartnerPreparedService;
+import org.springframework.stereotype.Service;
+
+/**
+ * author
+ * 时间:2026/2/3,17:53
+ */
+@Service
+@RequiredArgsConstructor
+@DubboService
+public class RemotePartnerPreparedServiceImpl implements RemotePartnerPreparedService {
+
+    private final IPartnerPreparedService partnerPreparedService;
+    @Override
+    public PartnerPreparedDTO updatePartnerPreparedById(String id) {
+        PartnerPreparedDTO partnerPreparedDTO = new PartnerPreparedDTO();
+        PartnerPrepared one = partnerPreparedService.lambdaQuery().eq(PartnerPrepared::getPreparedNo, id).one();
+        if (one == null){
+            partnerPreparedDTO.setFlag(false);
+            partnerPreparedDTO.setMessage("未找到该数据");
+        }
+        //这里状态不知道 没有eq判断状态 如果需要的话
+        boolean update = partnerPreparedService.lambdaUpdate().set(PartnerPrepared::getPreparedStatus, PartnerPreparedStatusEnum.PREPARED_TIME)
+            .eq(PartnerPrepared::getId, one.getId())
+            .update();
+        if (update){
+            partnerPreparedDTO.setFlag(true);
+            partnerPreparedDTO.setMessage("修改成功");
+        }else {
+            partnerPreparedDTO.setFlag(false);
+            partnerPreparedDTO.setMessage("修改失败");
+        }
+
+        return partnerPreparedDTO;
+    }
+
+    @Override
+    public PartnerPreparedDTO cancelPartnerPreparedById(String prepareOrderNo, String cancelReason) {
+        PartnerPreparedDTO partnerPreparedDTO = new PartnerPreparedDTO();
+        PartnerPrepared one = partnerPreparedService.lambdaQuery().eq(PartnerPrepared::getPreparedNo, prepareOrderNo).one();
+        if (one == null){
+            partnerPreparedDTO.setFlag(false);
+            partnerPreparedDTO.setMessage("未找到该数据");
+        }
+
+        boolean update = partnerPreparedService.lambdaUpdate()
+            .set(PartnerPrepared::getPreparedStatus, PartnerPreparedStatusEnum.PREPARED_TIME.getCode())
+            .set(PartnerPrepared::getReject, cancelReason)
+            .eq(PartnerPrepared::getId, one.getId())
+            .in(
+                PartnerPrepared::getPreparedStatus,
+                PartnerPreparedStatusEnum.PREPARED_APPROVE.getCode(),
+                PartnerPreparedStatusEnum.PREPARED_TIME.getCode(),
+                PartnerPreparedStatusEnum.PREPARED_FINISH.getCode()
+            )
+            .update();
+
+        if (update){
+            partnerPreparedDTO.setFlag(true);
+            partnerPreparedDTO.setMessage("修改成功");
+        }else {
+            partnerPreparedDTO.setFlag(false);
+            partnerPreparedDTO.setMessage("修改失败");
+        }
+        return partnerPreparedDTO;
+    }
+}

+ 54 - 0
ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/enums/PartnerPreparedStatusEnum.java

@@ -0,0 +1,54 @@
+package org.dromara.customer.enums;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+/**
+ * author
+ * 时间:2026/2/3,17:39
+ */
+@Getter
+@AllArgsConstructor
+public enum PartnerPreparedStatusEnum {
+    // 枚举项:状态码, 展示文案
+    PREPARED_APPROVE(0, "待审核"),
+    PREPARED_PASS(1, "已通过"),
+    PREPARED_UNPASS(2, "已驳回"),
+    PREPARED_TIME(3,"待备货"),
+    PREPARED_FINISH(4, "备货完成");
+
+
+
+    // 状态码
+    private final Integer code;
+    // 前端/业务展示的文案
+    private final String displayName;
+
+    /**
+     * 核心方法:根据状态码获取展示文案
+     * @param code 数据库中的数字值(0/1/2)
+     * @return 展示文案,无匹配时返回"未知状态"
+     */
+    public static String getDisplayNameByCode(Integer code) {
+        // 空值校验,避免空指针
+        if (code == null) {
+            return "未知状态";
+        }
+        // 遍历枚举匹配状态码(修正枚举类型为当前类)
+        for (PartnerPreparedStatusEnum status : values()) {
+            if (status.code.equals(code)) {
+                return status.displayName;
+            }
+        }
+        return "未知状态";
+    }
+
+    // getter方法(便于单独获取码值/文案)
+    public Integer getCode() {
+        return code;
+    }
+
+    public String getDisplayName() {
+        return displayName;
+    }
+}

+ 1 - 0
ruoyi-modules/ruoyi-external/pom.xml

@@ -128,6 +128,7 @@
             <artifactId>mssql-jdbc</artifactId>
             <version>9.4.0.jre11</version>
         </dependency>
+
     </dependencies>
 
     <build>

+ 2 - 0
ruoyi-modules/ruoyi-external/src/main/java/org/dromara/external/controller/ExternalProductController.java

@@ -131,4 +131,6 @@ public class ExternalProductController extends BaseController {
     }
 
 
+
+
 }

+ 150 - 422
ruoyi-modules/ruoyi-external/src/main/java/org/dromara/external/controller/zhongche/ZhongChePullController.java

@@ -62,27 +62,18 @@ public class ZhongChePullController {
 
     //5.1.1	地区查询
     @PostMapping("/area/query")
-    public ZCR areaQuery(@RequestBody AreaQueryBo bo) {
+    public AreaVo areaQuery(@RequestBody AreaQueryBo bo) {
         // 1. 校验业务请求参数(自身先校验,避免无效调用电商平台)
         //1 省级,2市级,3县级, 4区级
         //父级地址id	当查询省级时填0
         if (bo.getLevel() == null || !List.of(1, 2, 3, 4).contains(bo.getLevel())) {
-            return ZCR.fail("5051", "级次(level)必填,且仅支持1/2/3/4");
+            throw new RuntimeException("级次(level)必填,且仅支持1/2/3/4");
         }
         if (StrUtil.isBlank(bo.getPid())) {
-            return ZCR.fail("5052", "父级地址id(pid)不能为空");
+            throw new RuntimeException("父级地址id(pid)不能为空");
         }
         //获取response.body
         ZCR responseDto = doZcPost("/api/area/query", bo);
-        if (!"0".equals(responseDto.getRespCode())) {
-            log.error("地区查询 - 电商平台返回失败,错误码:{},错误信息:{}", responseDto.getRespCode(), responseDto.getRespMsg());
-            return ZCR.fail(responseDto.getRespCode(), responseDto.getRespMsg());
-        }
-        // 3. 复用工具类校验签名
-        Boolean signValid = verifyResponseSign(responseDto);
-        if (!signValid) {
-            return ZCR.fail("5053", "响应签名验证失败");
-        }
         // 4. 复用工具类解析响应
         return parseZcResponse(responseDto, AreaVo.class);
     }
@@ -112,20 +103,19 @@ public class ZhongChePullController {
 
 
     private <B> ZCR doZcPost(String apiPath, B bo) {
-        // 1. 业务 BO → JSON 字符串(复用 ZCApiUtils)
+        // 1.BO → JSON
         String bizJson;
         try {
             bizJson = ZCApiUtils.objectToJson(bo);
         } catch (JsonProcessingException e) {
-            log.error("通用请求 - 业务 BO 转换 JSON 失败", e);
             return ZCR.fail("5000", "业务参数转换失败:" + e.getMessage());
         }
 
-        // 2. JSON 字符串 → Base64 编码(复用 ZCApiUtils,适配 UTF-8)
+        // 2. JSON→ Base64
         String dataBase64;
         try {
             // 注意:你的 ZCApiUtils.base64Encode 内部用 getBytes(),默认是系统编码,补充 UTF-8 编码保证一致性
-            dataBase64 = ZCApiUtils.base64Encode(new String(bizJson.getBytes(StandardCharsets.UTF_8)));
+            dataBase64 = ZCApiUtils.base64Encode(bizJson);
         } catch (IllegalArgumentException e) {
             log.error("通用请求 - 业务 JSON Base64 编码失败", e);
             return ZCR.fail("5000", "业务参数编码失败:" + e.getMessage());
@@ -133,8 +123,7 @@ public class ZhongChePullController {
 
         //TODO 3. 构建 ZCTokenBo 请求体
         ZCTokenBo zcTokenBo = getZcTokenBo(dataBase64);
-
-        // 4. 生成请求签名(复用 SignParamUtils + SM2SignatureUtils)
+        // 4. 生成请求签名
         String requestSign;
         try {
             requestSign = SignParamUtils.generateRequestSign(zcTokenBo, PRIVATE_KEY);
@@ -143,7 +132,7 @@ public class ZhongChePullController {
             return ZCR.fail("5000", "生成请求签名失败:" + e.getMessage());
         }
         zcTokenBo.setSign(requestSign);
-        // 5. ZCTokenBo → JSON 字符串(复用 ZCApiUtils)
+        // 5. ZCTokenBo → JSON 字符串
         String requestJson;
         try {
             requestJson = ZCApiUtils.objectToJson(zcTokenBo);
@@ -154,7 +143,7 @@ public class ZhongChePullController {
 
         // 6. 发送 HTTP POST 请求(保持 hutool HTTP 工具,保证稳定性)
         String fullUrl = AREA_QUERY_URL + apiPath;
-        HttpResponse httpResponse = cn.hutool.http.HttpRequest
+        HttpResponse httpResponse = HttpRequest
             .post(fullUrl)
             .charset(StandardCharsets.UTF_8)
             .contentType("application/json")
@@ -167,6 +156,7 @@ public class ZhongChePullController {
             log.error("通用请求 - 电商平台接口调用失败,接口路径:{},HTTP 状态码:{}", apiPath, httpResponse.getStatus());
             return ZCR.fail("5000", "电商平台接口调用失败,HTTP 响应异常");
         }
+
         // 8. 响应体 → ZCR(复用 ZCApiUtils 转换 JSON)
         String responseBody = httpResponse.body();
         ZCR responseDto;
@@ -177,16 +167,17 @@ public class ZhongChePullController {
             return ZCR.fail("5000", "响应体解析失败:" + e.getMessage());
         }
 
-        // 6. 校验HTTP响应状态
-        if (!httpResponse.isOk()) {
-            log.error("通用请求 - 电商平台接口调用失败,接口路径:{},HTTP状态码:{}", apiPath, httpResponse.getStatus());
-            return ZCR.fail("5000", "电商平台接口调用失败,HTTP响应异常");
-        }
-        // 5. 响应码校验
+        // 9. 响应码校验
         if (!"0".equals(responseDto.getRespCode())) {
             return ZCR.fail(responseDto.getRespCode(), responseDto.getRespMsg());
         }
 
+        // 10. 响应签名校验(中车强要求)
+        if (!verifyResponseSign(responseDto)) {
+            log.error("通用请求 - 响应签名校验失败,apiPath={}", apiPath);
+            return ZCR.fail("5001", "响应签名验证失败");
+        }
+
         return responseDto;
     }
 
@@ -198,231 +189,159 @@ public class ZhongChePullController {
         zcTokenBo.setAccessToken(null);
         zcTokenBo.setClientId(CLIENT_ID);
         zcTokenBo.setData(data);
-        zcTokenBo.setSign("");
+        zcTokenBo.setSign(null);
         return zcTokenBo;
     }
 
 
-    //5.2 商品服务
-
-    //TODO 5.2.1	商品导入
+    //5.2.1	商品导入
     @PostMapping("/egoods/import")
-    public ZCR egoodsImport(@RequestBody GoodsImportBo bo) {
-
+    public GoodsImportVo egoodsImport(@RequestBody GoodsImportBo bo) {
         ZCR responseDto = doZcPost("/api/egoods/import", bo);
-        //TODO 6.2 签名校验
-        Boolean aBoolean = verifyResponseSign(responseDto);
-        if (!aBoolean){
-            return ZCR.fail("5001", "响应签名验证失败");
-        }
         //解析业务响应参数
-        ZCR zcr = parseZcResponse(responseDto, GoodsImportVo.class);
+        GoodsImportVo zcr = parseZcResponse(responseDto, GoodsImportVo.class);
         return zcr;
-
     }
-    private <V> ZCR parseZcResponse(ZCR responseDto, Class<V> voClass) {
-        // 1. 空值防护
-        if (responseDto == null || responseDto.getData() == null || responseDto.getData().trim().isEmpty()) {
-            log.warn("通用解析 - 电商平台响应数据为空");
-            return ZCR.fail("5001", "解析响应数据失败:响应数据为空");
+    private <V> V parseZcResponse(ZCR responseDto, Class<V> voClass) {
+        // 1. 基础校验
+        if (responseDto == null) {
+            throw new RuntimeException("中车响应为空");
         }
 
-        // 2. Base64 解码 data 字段(复用 ZCApiUtils)
-        String respBizJson;
-        try {
-            respBizJson = ZCApiUtils.base64Decode(responseDto.getData());
-            // 补充 UTF-8 编码转换,保证中文不乱码
-            respBizJson = new String(respBizJson.getBytes(), StandardCharsets.UTF_8);
-        } catch (IllegalArgumentException e) {
-            log.warn("通用解析 - 电商平台响应数据 Base64 解码失败", e);
-            return ZCR.fail("5001", "解析响应数据失败:Base64 解码失败");
+        if (!"0".equals(responseDto.getRespCode())) {
+            throw new RuntimeException(
+                "中车接口返回失败:" + responseDto.getRespCode() + " - " + responseDto.getRespMsg()
+            );
         }
 
-        // 3. JSON → 业务 VO(复用 ZCApiUtils)
-        V bizVo;
-        try {
-            bizVo = ZCApiUtils.jsonToObject(respBizJson, voClass);
-        } catch (JsonProcessingException e) {
-            log.error("通用解析 - 响应 JSON 转换业务 VO 失败", e);
-            return ZCR.fail("5001", "解析响应数据失败:JSON 转换失败");
+        if (StrUtil.isBlank(responseDto.getData())) {
+            throw new RuntimeException("中车响应 data 为空");
         }
 
-        // 4. 业务 VO → Base64 JSON,封装回 ZCR
-        String respDataBase64;
         try {
-            String bizVoJson = ZCApiUtils.objectToJson(bizVo);
-            respDataBase64 = ZCApiUtils.base64Encode(bizVoJson);
+            // 2. Base64 → JSON
+            String bizJson = ZCApiUtils.base64Decode(responseDto.getData());
+
+            // 3. JSON → VO(Jackson 自动处理嵌套对象 / List)
+            return ZCApiUtils.jsonToObject(bizJson, voClass);
+
         } catch (Exception e) {
-            log.error("通用解析 - 业务 VO 转换 Base64 JSON 失败", e);
-            return ZCR.fail("5001", "解析响应数据失败:结果封装失败");
+            log.error("解析中车响应失败,response={}", responseDto, e);
+            throw new RuntimeException("解析中车响应失败", e);
         }
-
-        return ZCR.ok(respDataBase64, "");
     }
 
 
     //TODO 5.2.2	商品价格变更
     @PostMapping("/egoods/price/update")
-    public ZCR egoodsPriceUpdate(@RequestBody GoodsImportBo bo) {
-
+    public GoodsPriceUpdateVo egoodsPriceUpdate(@RequestBody GoodsImportBo bo) {
         ZCR responseDto = doZcPost("/api/egoods/price/update", bo);
-        Boolean aBoolean = verifyResponseSign(responseDto);
-        if (!aBoolean){
-            return ZCR.fail("5001", "响应签名验证失败");
-        }
-        ZCR zcr = parseZcResponse(responseDto, GoodsPriceUpdateVo.class);
+        GoodsPriceUpdateVo zcr = parseZcResponse(responseDto, GoodsPriceUpdateVo.class);
         return zcr;
     }
 
     //TODO 5.2.3	商品上下架状态变更
     @PostMapping("/egoods/status/update")
-    public ZCR egoodsStatusUpdate(@RequestBody GoodsStatusUpdateBo bo) {
+    public GoodsStatusUpdateVo egoodsStatusUpdate(@RequestBody GoodsStatusUpdateBo bo) {
 
         ZCR responseDto = doZcPost("/api/egoods/status/update", bo);
-        Boolean aBoolean = verifyResponseSign(responseDto);
-        if (!aBoolean){
-            return ZCR.fail("5001", "响应签名验证失败");
-        }
-        ZCR zcr = parseZcResponse(responseDto, GoodsStatusUpdateVo.class);
+        GoodsStatusUpdateVo zcr = parseZcResponse(responseDto, GoodsStatusUpdateVo.class);
         return zcr;
     }
 
     //TODO 5.2.4	商品图片变更
     @PostMapping("/egoods/imgs/update")
-    public ZCR egoodsImgsUpdate(@RequestBody GoodsImageUpdateBo bo) {
+    public GoodsImageUpdateVo egoodsImgsUpdate(@RequestBody GoodsImageUpdateBo bo) {
         ZCR responseDto = doZcPost("/api/egoods/imgs/update", bo);
-        Boolean aBoolean = verifyResponseSign(responseDto);
-        if (!aBoolean){
-            return ZCR.fail("5001", "响应签名验证失败");
-        }
-        ZCR zcr = parseZcResponse(responseDto, GoodsImageUpdateVo.class);
+        GoodsImageUpdateVo zcr = parseZcResponse(responseDto, GoodsImageUpdateVo.class);
         return zcr;
     }
 
     //TODO 5.2.5	商品规格信息变更
     @PostMapping("/egoods/properties/update")
-    public ZCR egoodsPropertiesUpdate(@RequestBody GoodsPropertiesUpdateBo bo) {
+    public GoodsUpdateVo egoodsPropertiesUpdate(@RequestBody GoodsPropertiesUpdateBo bo) {
         ZCR responseDto = doZcPost("/api/egoods/properties/update", bo);
-        Boolean aBoolean = verifyResponseSign(responseDto);
-        if (!aBoolean){
-            return ZCR.fail("5001", "响应签名验证失败");
-        }
-        ZCR zcr = parseZcResponse(responseDto, GoodsUpdateVo.class);
+        GoodsUpdateVo zcr = parseZcResponse(responseDto, GoodsUpdateVo.class);
         return zcr;
     }
 
     //TODO 5.2.6	商品详情信息变更
     @PostMapping("/egoods/detail/update")
-    public ZCR egoodsDetailUpdate(@RequestBody GoodsDetailBo bo) {
+    public GoodsUpdateVo egoodsDetailUpdate(@RequestBody GoodsDetailBo bo) {
         ZCR responseDto = doZcPost("/api/egoods/detail/update", bo);
-        Boolean aBoolean = verifyResponseSign(responseDto);
-        if (!aBoolean){
-            return ZCR.fail("5001", "响应签名验证失败");
-        }
-        ZCR zcr = parseZcResponse(responseDto, GoodsUpdateVo.class);
+        GoodsUpdateVo zcr = parseZcResponse(responseDto, GoodsUpdateVo.class);
         return zcr;
     }
 
     //5.3	订单服务
 
-    //TODO 5.3.1	查询订单详情
+    // 5.3.1	查询订单详情
     @PostMapping("/mall/order/detail")
-    public ZCR mallOrderDetail(@RequestBody OrderDetailBo bo) {
+    public OrderDetailVo mallOrderDetail(@RequestBody OrderDetailBo bo) {
         ZCR responseDto = doZcPost("/api/mall/order/detail", bo);
-        Boolean aBoolean = verifyResponseSign(responseDto);
-        if (!aBoolean){
-            return ZCR.fail("5001", "响应签名验证失败");
-        }
-        ZCR zcr = parseZcResponse(responseDto, OrderDetailVo.class);
-        return zcr;
+        OrderDetailVo orderDetailVo = parseZcResponse(responseDto, OrderDetailVo.class);
+        return orderDetailVo;
     }
 
     //TODO 5.3.2	接单
     @PostMapping("/mall/order/confirm")
-    public ZCR mallOrderConfirm(@RequestBody OrderConfirmBo bo) {
+    public GoodsUpdateVo mallOrderConfirm(@RequestBody OrderConfirmBo bo) {
         ZCR responseDto = doZcPost("/api/mall/order/confirm", bo);
-        Boolean aBoolean = verifyResponseSign(responseDto);
-        if (!aBoolean){
-            return ZCR.fail("5001", "响应签名验证失败");
-        }
-        ZCR zcr = parseZcResponse(responseDto, GoodsUpdateVo.class);
+        GoodsUpdateVo zcr = parseZcResponse(responseDto, GoodsUpdateVo.class);
         return zcr;
     }
 
     //TODO 5.3.3	同步商品协商发货时间
     @PostMapping("/mall/order/goods/append")
-    public ZCR mallOrderGoodsAppend(@RequestBody OrderGoodsAppendBo bo) {
+    public GoodsUpdateVo mallOrderGoodsAppend(@RequestBody OrderGoodsAppendBo bo) {
         ZCR responseDto = doZcPost("/api/mall/order/goods/append", bo);
-        Boolean aBoolean = verifyResponseSign(responseDto);
-        if (!aBoolean){
-            return ZCR.fail("5001", "响应签名验证失败");
-        }
-        ZCR zcr = parseZcResponse(responseDto, GoodsUpdateVo.class);
+        GoodsUpdateVo zcr = parseZcResponse(responseDto, GoodsUpdateVo.class);
         return zcr;
     }
 
     //TODO 5.3.4	拒单
     @PostMapping("/mall/order/reject")
-    public ZCR mallOrderReject(@RequestBody OrderRejectBo bo) {
+    public GoodsUpdateVo mallOrderReject(@RequestBody OrderRejectBo bo) {
         ZCR responseDto = doZcPost("/api/mall/order/reject", bo);
-        Boolean aBoolean = verifyResponseSign(responseDto);
-        if (!aBoolean){
-            return ZCR.fail("5001", "响应签名验证失败");
-        }
-        ZCR zcr = parseZcResponse(responseDto, GoodsUpdateVo.class);
+        GoodsUpdateVo zcr = parseZcResponse(responseDto, GoodsUpdateVo.class);
         return zcr;
     }
 
     //TODO 5.3.5	发货
     @PostMapping("/mall/order/deliver/goods")
-    public ZCR mallOrderDeliverGoods(@RequestBody OrderDeliverBo bo) {
+    public OrderDeliverVo mallOrderDeliverGoods(@RequestBody OrderDeliverBo bo) {
         ZCR responseDto = doZcPost("/api/mall/order/deliver/goods", bo);
-        Boolean aBoolean = verifyResponseSign(responseDto);
-        if (!aBoolean){
-            return ZCR.fail("5001", "响应签名验证失败");
-        }
-        ZCR zcr = parseZcResponse(responseDto, OrderDeliverVo.class);
+
+        OrderDeliverVo zcr = parseZcResponse(responseDto, OrderDeliverVo.class);
         return zcr;
 
     }
 
     //TODO 5.3.6	查询待处理订单列表
     @PostMapping("/mall/order/pending/list")
-    public ZCR mallOrderPendingList(@RequestBody ZCTokenBo bo) {
+    public PendingOrderListVo mallOrderPendingList(@RequestBody ZCTokenBo bo) {
         ZCR responseDto = doZcPost("/api/mall/order/pending/list", bo);
-        Boolean aBoolean = verifyResponseSign(responseDto);
-        if (!aBoolean){
-            return ZCR.fail("5001", "响应签名验证失败");
-        }
-        ZCR zcr = parseZcResponse(responseDto, PendingOrderListVo.class);
+        PendingOrderListVo zcr = parseZcResponse(responseDto, PendingOrderListVo.class);
         return zcr;
     }
 
     //TODO 5.3.7	妥投通知
     @PostMapping("/mall/order/delivered/notice")
-    public ZCR mallOrderDeliveredNotice(@RequestBody OrderDeliveredNoticeBo bo) {
+    public GoodsUpdateVo mallOrderDeliveredNotice(@RequestBody OrderDeliveredNoticeBo bo) {
         ZCR responseDto = doZcPost("/api/mall/order/delivered/notice", bo);
-        Boolean aBoolean = verifyResponseSign(responseDto);
-        if (!aBoolean){
-            return ZCR.fail("5001", "响应签名验证失败");
-        }
-        ZCR zcr = parseZcResponse(responseDto, GoodsUpdateVo.class);
+        GoodsUpdateVo zcr = parseZcResponse(responseDto, GoodsUpdateVo.class);
         return zcr;
     }
 
     //TODO 5.3.8	查询发货单信息
     @PostMapping("/mall/order/query/outgoing")
-    public ZCR mallOrderQueryOutgoing(@RequestBody OutgoingQueryBo bo) {
+    public OutgoingVo mallOrderQueryOutgoing(@RequestBody OutgoingQueryBo bo) {
         ZCR responseDto = doZcPost("/api/mall/order/query/outgoing", bo);
-        Boolean aBoolean = verifyResponseSign(responseDto);
-        if (!aBoolean){
-            return ZCR.fail("5001", "响应签名验证失败");
-        }
-        ZCR zcr = parseZcResponse(responseDto, OutgoingVo.class);
+        OutgoingVo zcr = parseZcResponse(responseDto, OutgoingVo.class);
         return zcr;
     }
 
-    //TODO 5.3.12	审核订单取消
+    //TODO 5.3.11	审核订单取消
     /*
         //请求业务参数
         OrderCancelAuditBo orderCancelAuditBo = new OrderCancelAuditBo();
@@ -430,21 +349,12 @@ public class ZhongChePullController {
         GoodsUpdateVo goodsUpdateVo = new GoodsUpdateVo();
      */
     @PostMapping("/mall/order/cancel/audit/judge")
-    public ZCR mallOrderCancelAuditJudge(@RequestBody OrderCancelAuditBo bo) {
+    public GoodsUpdateVo mallOrderCancelAuditJudge(@RequestBody OrderCancelAuditBo bo) {
         ZCR responseDto = doZcPost("/api/mall/order/cancel/audit/judge", bo);
-        Boolean aBoolean = verifyResponseSign(responseDto);
-        if (!aBoolean){
-            return ZCR.fail("5001", "响应签名验证失败");
-        }
-        ZCR zcr = parseZcResponse(responseDto, GoodsUpdateVo.class);
+        GoodsUpdateVo zcr = parseZcResponse(responseDto, GoodsUpdateVo.class);
         return zcr;
     }
-
-
-
-    //5.4	售后服务
-
-    //TODO 5.4.1	查询售后单详情
+    //5.4.1	查询售后单详情
     /*
         //请求业务参数
         AfterSaleDetailBo afterSaleDetailBo = new AfterSaleDetailBo();
@@ -457,383 +367,201 @@ public class ZhongChePullController {
         AfterSaleReturn afterSaleReturn = new AfterSaleReturn();
      */
     @PostMapping("/mall/aftersale/detail")
-    public ZCR mallAftersaleDetail(@RequestBody AfterSaleDetailBo bo) {
+    public AfterSaleDetailVo mallAftersaleDetail(@RequestBody AfterSaleDetailBo bo) {
         ZCR responseDto = doZcPost("/api/mall/aftersale/detail", bo);
-        Boolean aBoolean = verifyResponseSign(responseDto);
-        if (!aBoolean){
-            return ZCR.fail("5001", "响应签名验证失败");
-        }
-        ZCR zcr = parseZcResponse(responseDto, AfterSaleDetailVo.class);
+        AfterSaleDetailVo zcr = parseZcResponse(responseDto, AfterSaleDetailVo.class);
         return zcr;
     }
 
-    //TODO 5.4.2	接受售后
+    //5.4.2	接受售后
     @PostMapping("/mall/aftersale/confirm")
-    public ZCR mallAftersaleConfirm(@RequestBody AfterSaleConfirmBo bo) {
+    public GoodsUpdateVo mallAftersaleConfirm(@RequestBody AfterSaleConfirmBo bo) {
         ZCR responseDto = doZcPost("/api/mall/aftersale/confirm", bo);
-        Boolean aBoolean = verifyResponseSign(responseDto);
-        if (!aBoolean){
-            return ZCR.fail("5001", "响应签名验证失败");
-        }
-        ZCR zcr = parseZcResponse(responseDto, GoodsUpdateVo.class);
+        GoodsUpdateVo zcr = parseZcResponse(responseDto, GoodsUpdateVo.class);
         return zcr;
     }
 
-    //TODO 5.4.3	拒绝售后
+    //5.4.3	拒绝售后
     @PostMapping("/mall/aftersale/reject")
-    public ZCR mallAftersaleReject(@RequestBody AfterSaleRejectBo bo) {
+    public GoodsUpdateVo mallAftersaleReject(@RequestBody AfterSaleRejectBo bo) {
         ZCR responseDto = doZcPost("/api/mall/aftersale/reject", bo);
-        Boolean aBoolean = verifyResponseSign(responseDto);
-        if (!aBoolean){
-            return ZCR.fail("5001", "响应签名验证失败");
-        }
-        ZCR zcr = parseZcResponse(responseDto, GoodsUpdateVo.class);
+        GoodsUpdateVo zcr = parseZcResponse(responseDto, GoodsUpdateVo.class);
         return zcr;
     }
 
-    //TODO 5.4.4	确认收到退货
+    //5.4.4	确认收到退货
     @PostMapping("/mall/aftersale/return/goods/received")
-    public ZCR mallAftersaleReturnGoodsReceived(@RequestBody AfterSaleReturnReceivedBo bo) {
+    public GoodsUpdateVo mallAftersaleReturnGoodsReceived(@RequestBody AfterSaleReturnReceivedBo bo) {
         ZCR responseDto = doZcPost("/api/mall/aftersale/return/goods/received", bo);
-        Boolean aBoolean = verifyResponseSign(responseDto);
-        if (!aBoolean){
-            return ZCR.fail("5001", "响应签名验证失败");
-        }
-        ZCR zcr = parseZcResponse(responseDto, GoodsUpdateVo.class);
+        GoodsUpdateVo zcr = parseZcResponse(responseDto, GoodsUpdateVo.class);
         return zcr;
     }
 
-    //TODO 5.4.5	换货新品发货
+    //5.4.5	换货新品发货
     @PostMapping("/mall/aftersale/deliver/goods")
-    public ZCR mallAftersaleDeliverGoods(@RequestBody AfterSaleDeliverGoodsBo bo) {
+    public AfterSaleDeliverGoodsVo mallAftersaleDeliverGoods(@RequestBody AfterSaleDeliverGoodsBo bo) {
         ZCR responseDto = doZcPost("/api/mall/aftersale/deliver/goods", bo);
-        Boolean aBoolean = verifyResponseSign(responseDto);
-        if (!aBoolean){
-            return ZCR.fail("5001", "响应签名验证失败");
-        }
-        ZCR zcr = parseZcResponse(responseDto, AfterSaleDeliverGoodsVo.class);
+        AfterSaleDeliverGoodsVo zcr = parseZcResponse(responseDto, AfterSaleDeliverGoodsVo.class);
         return zcr;
     }
 
     //TODO 5.4.6	查询待处理售后单列表
     @PostMapping("/mall/aftersale/pending/list")
-    public ZCR mallAftersalePendingList(@RequestBody AfterSalePendingListBo bo) {
+    public AfterSalePendingListVo mallAftersalePendingList(@RequestBody AfterSalePendingListBo bo) {
         ZCR responseDto = doZcPost("/api/mall/aftersale/pending/list", bo);
-        Boolean aBoolean = verifyResponseSign(responseDto);
-        if (!aBoolean){
-            return ZCR.fail("5001", "响应签名验证失败");
-        }
-        ZCR zcr = parseZcResponse(responseDto, AfterSalePendingListVo.class);
+        AfterSalePendingListVo zcr = parseZcResponse(responseDto, AfterSalePendingListVo.class);
         return zcr;
     }
 
-    //TODO 5.4.7	查询换货新品发货单信息
+    //5.4.7	查询换货新品发货单信息
     @PostMapping("/mall/aftersale/query/outgoing")
-    public ZCR mallAftersaleQueryOutgoing(@RequestBody AfterSaleQueryOutgoingBo bo) {
+    public AfterSaleQueryOutgoingVo mallAftersaleQueryOutgoing(@RequestBody AfterSaleQueryOutgoingBo bo) {
         ZCR responseDto = doZcPost("/api/mall/aftersale/query/outgoing", bo);
-        Boolean aBoolean = verifyResponseSign(responseDto);
-        if (!aBoolean){
-            return ZCR.fail("5001", "响应签名验证失败");
-        }
-        ZCR zcr = parseZcResponse(responseDto, AfterSaleQueryOutgoingVo.class);
+        AfterSaleQueryOutgoingVo zcr = parseZcResponse(responseDto, AfterSaleQueryOutgoingVo.class);
         return zcr;
     }
 
-    //TODO 5.4.8	线下售后
+    //5.4.8	线下售后
     @PostMapping("/mall/aftersale/offline/create")
-    public ZCR mallAftersaleOfflineCreate(@RequestBody AfterSaleOfflineCreateBo bo) {
+    public AfterSaleOfflineCreateVo mallAftersaleOfflineCreate(@RequestBody AfterSaleOfflineCreateBo bo) {
         ZCR responseDto = doZcPost("/api/mall/aftersale/offline/create", bo);
-        Boolean aBoolean = verifyResponseSign(responseDto);
-        if (!aBoolean){
-            return ZCR.fail("5001", "响应签名验证失败");
-        }
-        ZCR zcr = parseZcResponse(responseDto, AfterSaleOfflineCreateVo.class);
+        AfterSaleOfflineCreateVo zcr = parseZcResponse(responseDto, AfterSaleOfflineCreateVo.class);
         return zcr;
     }
 
-    //TODO 5.4.9	确认退款
+    //5.4.9	确认退款
     @PostMapping("/mall/aftersale/refund")
-    public ZCR mallAftersaleRefund(@RequestBody AfterSaleRefundBo bo) {
+    public GoodsUpdateVo mallAftersaleRefund(@RequestBody AfterSaleRefundBo bo) {
         ZCR responseDto = doZcPost("/api/mall/aftersale/refund", bo);
-        Boolean aBoolean = verifyResponseSign(responseDto);
-        if (!aBoolean){
-            return ZCR.fail("5001", "响应签名验证失败");
-        }
-        ZCR zcr = parseZcResponse(responseDto, GoodsUpdateVo.class);
+        GoodsUpdateVo zcr = parseZcResponse(responseDto, GoodsUpdateVo.class);
         return zcr;
     }
 
-    //5.7	开票服务
 
-    //TODO 5.7.1	查询开票信息
-    /*
-        //请求业务参数
-        InvoiceApplyDetailBo invoiceApplyDetailBo = new InvoiceApplyDetailBo();
-        //响应业务参数
-        InvoiceApplyDetailVo invoiceApplyDetailVo = new InvoiceApplyDetailVo();
-        InvoiceReceiver invoiceReceiver = new InvoiceReceiver();
-     */
+    //5.7.1	查询开票信息
     @PostMapping("/mall/invoice/apply/detail")
-    public ZCR mallInvoiceApplyDetail(@RequestBody InvoiceApplyDetailBo bo) {
+    public InvoiceApplyDetailVo mallInvoiceApplyDetail(@RequestBody InvoiceApplyDetailBo bo) {
         ZCR responseDto = doZcPost("/api/mall/invoice/apply/detail", bo);
-        Boolean aBoolean = verifyResponseSign(responseDto);
-        if (!aBoolean){
-            return ZCR.fail("5001", "响应签名验证失败");
-        }
-        ZCR zcr = parseZcResponse(responseDto, InvoiceApplyDetailVo.class);
+        InvoiceApplyDetailVo zcr = parseZcResponse(responseDto, InvoiceApplyDetailVo.class);
         return zcr;
 
     }
 
-    //TODO 5.7.2	查询开票申请订单列表
-    /*
-        //请求业务参数
-        InvoiceApplyOrdersBo invoiceApplyOrdersBo = new InvoiceApplyOrdersBo();
-        //响应业务参数
-        InvoiceApplyOrdersVo invoiceApplyOrdersVo = new InvoiceApplyOrdersVo();
-        InvoiceOrder invoiceOrder = new InvoiceOrder();
-     */
+    //5.7.2	查询开票申请订单列表
     @PostMapping("/mall/invoice/apply/orders")
-    public ZCR mallInvoiceApplyOrders(@RequestBody InvoiceApplyOrdersBo bo) {
+    public InvoiceApplyOrdersVo mallInvoiceApplyOrders(@RequestBody InvoiceApplyOrdersBo bo) {
         ZCR responseDto = doZcPost("/api/mall/invoice/apply/orders", bo);
-        Boolean aBoolean = verifyResponseSign(responseDto);
-        if (!aBoolean){
-            return ZCR.fail("5001", "响应签名验证失败");
-        }
-        ZCR zcr = parseZcResponse(responseDto, InvoiceApplyOrdersVo.class);
+        InvoiceApplyOrdersVo zcr = parseZcResponse(responseDto, InvoiceApplyOrdersVo.class);
         return zcr;
 
     }
 
-    //TODO 5.7.3    拒绝开票
-
+    //5.7.3    拒绝开票
     @PostMapping("/mall/invoice/apply/reject")
-    public ZCR mallInvoiceApplyReject(@RequestBody InvoiceApplyRejectBo bo) {
+    public GoodsUpdateVo mallInvoiceApplyReject(@RequestBody InvoiceApplyRejectBo bo) {
         ZCR responseDto = doZcPost("/api/mall/invoice/apply/reject", bo);
-        Boolean aBoolean = verifyResponseSign(responseDto);
-        if (!aBoolean){
-            return ZCR.fail("5001", "响应签名验证失败");
-        }
-        ZCR zcr = parseZcResponse(responseDto, GoodsUpdateVo.class);
+        GoodsUpdateVo zcr = parseZcResponse(responseDto, GoodsUpdateVo.class);
         return zcr;
     }
 
-    //TODO 5.7.4	电商同步开票信息
-    /*
-        //请求业务参数
-        InvoiceSyncInvoiceInfosBo invoiceSyncInvoiceInfosBo = new InvoiceSyncInvoiceInfosBo();
-        InvoiceInfo invoiceInfo = new InvoiceInfo();
-        //响应业务参数
-        GoodsUpdateVo goodsUpdateVo = new GoodsUpdateVo();
-     */
+    //5.7.4	电商同步开票信息
     @PostMapping("/mall/invoice/sync/invoiceinfos")
-    public ZCR mallInvoiceSyncInvoiceInfos(@RequestBody InvoiceSyncInvoiceInfosBo bo) {
+    public GoodsUpdateVo mallInvoiceSyncInvoiceInfos(@RequestBody InvoiceSyncInvoiceInfosBo bo) {
         ZCR responseDto = doZcPost("/api/mall/invoice/sync/invoiceinfos", bo);
-        Boolean aBoolean = verifyResponseSign(responseDto);
-        if (!aBoolean){
-            return ZCR.fail("5001", "响应签名验证失败");
-        }
-        ZCR zcr = parseZcResponse(responseDto, GoodsUpdateVo.class);
+        GoodsUpdateVo zcr = parseZcResponse(responseDto, GoodsUpdateVo.class);
         return zcr;
-
     }
 
-    //TODO 5.7.5 同步纸质发票邮寄信息
-    /*
-        //请求业务参数
-        InvoiceSyncWaybillBo invoiceSyncWaybillBo = new InvoiceSyncWaybillBo();
-        //响应业务参数
-        GoodsUpdateVo goodsUpdateVo = new GoodsUpdateVo();
-     */
+    //5.7.5 同步纸质发票邮寄信息
+
     @PostMapping("/mall/invoice/sync/waybill")
-    public ZCR mallInvoiceSyncWaybill(@RequestBody InvoiceSyncWaybillBo bo) {
+    public GoodsUpdateVo mallInvoiceSyncWaybill(@RequestBody InvoiceSyncWaybillBo bo) {
         ZCR responseDto = doZcPost("/api/mall/invoice/sync/waybill", bo);
-        Boolean aBoolean = verifyResponseSign(responseDto);
-        if (!aBoolean){
-            return ZCR.fail("5001", "响应签名验证失败");
-        }
-        ZCR zcr = parseZcResponse(responseDto, GoodsUpdateVo.class);
+        GoodsUpdateVo zcr = parseZcResponse(responseDto, GoodsUpdateVo.class);
         return zcr;
     }
 
-    //TODO 5.7.6 发票妥投通知
-    /*
-        //请求业务参数
-        InvoiceDeliveredNoticeBo invoiceDeliveredNoticeBo = new InvoiceDeliveredNoticeBo();
-        //响应业务参数
-        GoodsUpdateVo goodsUpdateVo = new GoodsUpdateVo();
-     */
+    //5.7.6 发票妥投通知
     @PostMapping("/mall/invoice/delivered/notice")
-    public ZCR mallInvoiceDeliveredNotice(@RequestBody InvoiceDeliveredNoticeBo bo) {
+    public GoodsUpdateVo mallInvoiceDeliveredNotice(@RequestBody InvoiceDeliveredNoticeBo bo) {
         ZCR responseDto = doZcPost("/api/mall/invoice/delivered/notice", bo);
-        Boolean aBoolean = verifyResponseSign(responseDto);
-        if (!aBoolean){
-            return ZCR.fail("5001", "响应签名验证失败");
-        }
-        ZCR zcr = parseZcResponse(responseDto, GoodsUpdateVo.class);
+        GoodsUpdateVo zcr = parseZcResponse(responseDto, GoodsUpdateVo.class);
         return zcr;
-
-
     }
 
-    //TODO 5.7.7	查询待开票申请单列表
-    /*
-        //请求业务参数
-        InvoiceApplyWaitlistBo invoiceApplyWaitListBo = new InvoiceApplyWaitlistBo();
-
-        //响应业务参数
-        WaitInvoiceApply waitInvoiceApply = new WaitInvoiceApply();
-        InvoiceApplyWaitlistVo invoiceApplyWaitlistVo = new InvoiceApplyWaitlistVo();
-     */
+    //5.7.7	查询待开票申请单列表
     @PostMapping("/mall/invoice/apply/waitlist")
-    public ZCR mallInvoiceApplyWaitList(@RequestBody InvoiceApplyWaitlistBo bo) {
+    public InvoiceApplyWaitlistVo mallInvoiceApplyWaitList(@RequestBody InvoiceApplyWaitlistBo bo) {
         ZCR responseDto = doZcPost("/api/mall/invoice/apply/waitlist", bo);
-        Boolean aBoolean = verifyResponseSign(responseDto);
-        if (!aBoolean){
-            return ZCR.fail("5001", "响应签名验证失败");
-        }
-        ZCR zcr = parseZcResponse(responseDto, InvoiceApplyWaitlistVo.class);
+        InvoiceApplyWaitlistVo zcr = parseZcResponse(responseDto, InvoiceApplyWaitlistVo.class);
         return zcr;
-
-
     }
 
-    //TODO 5.7.8	电商同意退票
-    /*
-        //请求业务参数
-        InvoiceRefundAgreeBo invoiceRefundAgreeBo = new InvoiceRefundAgreeBo();
-        //响应业务参数
-        GoodsUpdateVo goodsUpdateVo = new GoodsUpdateVo();
-     */
+    //5.7.8	电商同意退票
     @PostMapping("/mall/invoice/refund/agree")
-    public ZCR mallInvoiceRefundAgree(@RequestBody InvoiceRefundAgreeBo bo) {
+    public GoodsUpdateVo mallInvoiceRefundAgree(@RequestBody InvoiceRefundAgreeBo bo) {
         ZCR responseDto = doZcPost("/api/mall/invoice/refund/agree", bo);
-        Boolean aBoolean = verifyResponseSign(responseDto);
-        if (!aBoolean){
-            return ZCR.fail("5001", "响应签名验证失败");
-        }
-        ZCR zcr = parseZcResponse(responseDto, GoodsUpdateVo.class);
+        GoodsUpdateVo zcr = parseZcResponse(responseDto, GoodsUpdateVo.class);
         return zcr;
-
     }
 
-    //TODO 5.7.9	电商确认完成退票
-    /*
-        //请求业务参数
-        InvoiceRefundFinishBo invoiceRefundFinishBo = new InvoiceRefundFinishBo();
-        //响应业务参数
-        GoodsUpdateVo goodsUpdateVo = new GoodsUpdateVo();
-     */
+    //5.7.9	电商确认完成退票
+
     @PostMapping("/mall/invoice/refund/finish")
-    public ZCR mallInvoiceRefundFinish(@RequestBody InvoiceRefundFinishBo bo) {
+    public GoodsUpdateVo mallInvoiceRefundFinish(@RequestBody InvoiceRefundFinishBo bo) {
         ZCR responseDto = doZcPost("/api/mall/invoice/refund/finish", bo);
-        Boolean aBoolean = verifyResponseSign(responseDto);
-        if (!aBoolean){
-            return ZCR.fail("5001", "响应签名验证失败");
-        }
-        ZCR zcr = parseZcResponse(responseDto, GoodsUpdateVo.class);
+        GoodsUpdateVo zcr = parseZcResponse(responseDto, GoodsUpdateVo.class);
         return zcr;
-
     }
 
-    //TODO 5.7.10 电商拒绝退票申请
-    /*
-        //请求业务参数
-        InvoiceRefundRejectBo invoiceRefundRejectBo = new InvoiceRefundRejectBo();
-        //响应业务参数
-        GoodsUpdateVo goodsUpdateVo = new GoodsUpdateVo();
-     */
+    //5.7.10 电商拒绝退票申请
     @PostMapping("/mall/invoice/refund/reject")
-    public ZCR mallInvoiceRefundReject(@RequestBody InvoiceRefundRejectBo bo) {
+    public GoodsUpdateVo mallInvoiceRefundReject(@RequestBody InvoiceRefundRejectBo bo) {
         ZCR responseDto = doZcPost("/api/mall/invoice/refund/reject", bo);
-        Boolean aBoolean = verifyResponseSign(responseDto);
-        if (!aBoolean){
-            return ZCR.fail("5001", "响应签名验证失败");
-        }
-        ZCR zcr = parseZcResponse(responseDto, GoodsUpdateVo.class);
-        return zcr;
-
+        GoodsUpdateVo goodsUpdateVo = parseZcResponse(responseDto, GoodsUpdateVo.class);
+        return goodsUpdateVo;
     }
 
-    //5.9 结算服务
-
-    //TODO 5.9.1	查询结算单详情
+    //5.9.1	查询结算单详情
     @PostMapping("/mall/settlement/detail")
-    public ZCR mallSettlementDetail(@RequestBody SettlementDetailBo bo) {
+    public SettlementDetailVo mallSettlementDetail(@RequestBody SettlementDetailBo bo) {
         ZCR responseDto = doZcPost("/api/mall/settlement/detail", bo);
-        Boolean aBoolean = verifyResponseSign(responseDto);
-        if (!aBoolean){
-            return ZCR.fail("5001", "响应签名验证失败");
-        }
-        ZCR zcr = parseZcResponse(responseDto, SettlementDetailVo.class);
-        return zcr;
-
+        SettlementDetailVo settlementDetailVo = parseZcResponse(responseDto, SettlementDetailVo.class);
+        return settlementDetailVo;
     }
 
-    //TODO 5.9.2	查询结算单订单列表
+    //5.9.2	查询结算单订单列表
     @PostMapping("/mall/settlement/apply/orders")
-    public ZCR mallSettlementApplyOrders(@RequestBody SettlementApplyOrdersBo bo) {
+    public SettlementApplyOrdersVo mallSettlementApplyOrders(@RequestBody SettlementApplyOrdersBo bo) {
         ZCR responseDto = doZcPost("/api/mall/settlement/apply/orders", bo);
-        Boolean aBoolean = verifyResponseSign(responseDto);
-        if (!aBoolean){
-            return ZCR.fail("5001", "响应签名验证失败");
-        }
-        ZCR zcr = parseZcResponse(responseDto, SettlementApplyOrdersVo.class);
-        return zcr;
-
+        SettlementApplyOrdersVo settlementApplyOrdersVo = parseZcResponse(responseDto, SettlementApplyOrdersVo.class);
+        return settlementApplyOrdersVo;
     }
 
 
-    //TODO 5.9.3	结算单确认结算
+    //5.9.3	结算单确认结算
     @PostMapping("/mall/settlement/confirm")
-    public ZCR mallSettlementConfirm(@RequestBody SettlementConfirmBo bo) {
+    public GoodsUpdateVo mallSettlementConfirm(@RequestBody SettlementConfirmBo bo) {
         ZCR responseDto = doZcPost("/api/mall/settlement/confirm", bo);
-        Boolean aBoolean = verifyResponseSign(responseDto);
-        if (!aBoolean){
-            return ZCR.fail("5001", "响应签名验证失败");
-        }
-        ZCR zcr = parseZcResponse(responseDto, GoodsUpdateVo.class);
-        return zcr;
-
-
+        GoodsUpdateVo goodsUpdateVo = parseZcResponse(responseDto, GoodsUpdateVo.class);
+        return goodsUpdateVo;
     }
 
-    //TODO 5.9.4	结算单付款详情
+    //5.9.4	结算单付款详情
     @PostMapping("/mall/settlement/payment/detail")
-    public ZCR mallSettlementPaymentDetail( @RequestBody SettlementPaymentDetailBo bo) {
+    public SettlementPaymentDetailVo mallSettlementPaymentDetail( @RequestBody SettlementPaymentDetailBo bo) {
         ZCR responseDto = doZcPost("/api/mall/settlement/payment/detail", bo);
-        Boolean aBoolean = verifyResponseSign(responseDto);
-        if (!aBoolean){
-            return ZCR.fail("5001", "响应签名验证失败");
-        }
-        ZCR zcr = parseZcResponse(responseDto, SettlementPaymentDetailVo.class);
-        return zcr;
+        SettlementPaymentDetailVo settlementPaymentDetailVo = parseZcResponse(responseDto, SettlementPaymentDetailVo.class);
+        return settlementPaymentDetailVo;
 
     }
 
-    //TODO 5.9.5	结算单确认收款
+    //5.9.5	结算单确认收款
     @PostMapping("/mall/settlement/confirm/payment")
-    public ZCR mallSettlementConfirmPayment( @RequestBody SettlementConfirmPaymentBo bo) {
+    public GoodsUpdateVo mallSettlementConfirmPayment( @RequestBody SettlementConfirmPaymentBo bo) {
         ZCR responseDto = doZcPost("/api/mall/settlement/confirm/payment", bo);
-        Boolean aBoolean = verifyResponseSign(responseDto);
-        if (!aBoolean){
-            return ZCR.fail("5001", "响应签名验证失败");
-        }
-        ZCR zcr = parseZcResponse(responseDto, GoodsUpdateVo.class);
-        return zcr;
+        GoodsUpdateVo goodsUpdateVo = parseZcResponse(responseDto, GoodsUpdateVo.class);
+        return goodsUpdateVo;
     }
 
-
-
-
-
-
-
-
-
-
-
-
-
-
 }

+ 9 - 22
ruoyi-modules/ruoyi-external/src/main/java/org/dromara/external/controller/zhongche/ZhongChePushController.java

@@ -18,6 +18,8 @@ import org.dromara.external.api.zhongche.domain.bo.AreaStockBo;
 import org.dromara.external.api.zhongche.domain.bo.*;
 import org.dromara.external.api.zhongche.domain.vo.*;
 import org.dromara.external.api.zhongche.domain.Catalog;
+import org.dromara.common.core.domain.zhongche.vo.TrackVo;
+import org.dromara.external.controller.zhongche.handle.MallMessageDispatcher;
 import org.dromara.external.util.SM2SignatureUtils;
 import org.dromara.external.util.SignParamUtils;
 import org.dromara.product.api.RemoteExternalOrderService;
@@ -59,6 +61,8 @@ public class ZhongChePushController {
     @DubboReference
     private final RemoteExternalOrderService remoteOrderService;
 
+    private final MallMessageDispatcher mallMessageDispatcher;
+
     private final String DEVELOPER_PRIVATE_KEY = "MFkwEwYHKoZIzj0CAQYIKoEcz1UBgi0DQgAE1YybOl0QDE2e9humlm4AgI3wJ1tI+UfVRZx8kk4hfPtZjorHN8Tjq/cP07t4Yscy+R9oFci8xw0VpBbcnlaq1w=="; // 电商提供的私钥
 
     private final String DEVELOPER_PUBLIC_KEY = "MIGTAgEAMBMGByqGSM49AgEGCCqBHM9VAYItBHkwdwIBAQQgpQdXwMi21Mg1FhWad2AQLOwfNiDHgwhootau0YerQbagCgYIKoEcz1UBgi2hRANCAATVjJs6XRAMTZ72G6aWbgCAjfAnW0j5R9VFnHySTiF8+1mOisc3xOOr9w/Tu3hixzL5H2gVyLzHDRWkFtyeVqrX";  // 电商提供的公钥
@@ -610,21 +614,13 @@ public class ZhongChePushController {
 
         // 5. 按消息类型处理业务
         try {
-            MessageTypeEnum typeEnum = MessageTypeEnum.of(messageBo.getType());
-            switch (typeEnum) {
-                case NEW_ORDER:
-                    handleNewOrder(messageBo);
-                    break;
-                case AFTER_SALE_APPLY:
-                    handleAfterSale(messageBo);
-                    break;
-                default:
-                    log.warn("未处理的消息类型:{}", messageBo.getType());
-            }
+            mallMessageDispatcher.dispatch(messageBo);
         } catch (Exception e) {
-            log.error("消息监听 - 业务处理失败,msgId={}", messageBo.getId(), e);
-            return ZCR.fail("5006", "消息处理失败");
+            log.error("消息处理异常,messageId={}", messageBo.getId(), e);
+            return ZCR.fail("5007", "消息处理失败");
         }
+
+
         // 6. 构造响应业务参数
         MessageVo messageVo = new MessageVo();
         messageVo.setResult("1");
@@ -745,13 +741,4 @@ public class ZhongChePushController {
         return ZCR.ok( null);
     }
 
-
-
-    /**
-     * 生成响应签名(按中车签名规则)
-     */
-    private String generateRespSign(String respDataBase64, String clientId){
-        // 临时占位,需替换
-        return "";
-    }
 }

+ 39 - 0
ruoyi-modules/ruoyi-external/src/main/java/org/dromara/external/controller/zhongche/handle/MallMessageDispatcher.java

@@ -0,0 +1,39 @@
+package org.dromara.external.controller.zhongche.handle;
+
+import lombok.extern.slf4j.Slf4j;
+import org.dromara.external.api.zhongche.domain.bo.MessageBo;
+import org.dromara.external.enums.MallMessageTypeEnum;
+import org.springframework.stereotype.Component;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+@Component
+@Slf4j
+public class MallMessageDispatcher {
+
+    private final Map<MallMessageTypeEnum, MallMessageHandler> handlerMap = new HashMap<>();
+
+    public MallMessageDispatcher(List<MallMessageHandler> handlers) {
+        for (MallMessageHandler handler : handlers) {
+            handlerMap.put(handler.supportType(), handler);
+        }
+    }
+
+    public void dispatch(MessageBo messageBo) {
+        MallMessageTypeEnum type = MallMessageTypeEnum.of(messageBo.getType());
+        if (type == null) {
+            log.warn("未知消息类型:{}", messageBo.getType());
+            return;
+        }
+
+        MallMessageHandler handler = handlerMap.get(type);
+        if (handler == null) {
+            log.warn("未找到消息处理器,type={}", type);
+            return;
+        }
+
+        handler.handle(messageBo);
+    }
+}

+ 18 - 0
ruoyi-modules/ruoyi-external/src/main/java/org/dromara/external/controller/zhongche/handle/MallMessageHandler.java

@@ -0,0 +1,18 @@
+package org.dromara.external.controller.zhongche.handle;
+
+import org.dromara.external.api.zhongche.domain.bo.MessageBo;
+import org.dromara.external.api.zhongche.domain.vo.MessageVo;
+import org.dromara.external.enums.MallMessageTypeEnum;
+
+public interface MallMessageHandler {
+
+    /**
+     * 当前处理器支持的消息类型
+     */
+    MallMessageTypeEnum supportType();
+
+    /**
+     * 处理消息
+     */
+    MessageVo handle(MessageBo messageBo);
+}

+ 76 - 0
ruoyi-modules/ruoyi-external/src/main/java/org/dromara/external/controller/zhongche/handle/impl/AccountActiveMessageHandler.java

@@ -0,0 +1,76 @@
+package org.dromara.external.controller.zhongche.handle.impl;
+
+import cn.hutool.core.collection.CollUtil;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.dromara.external.api.zhongche.domain.GoodsImportItem;
+import org.dromara.external.api.zhongche.domain.aftersale.bo.AfterSaleDetailBo;
+import org.dromara.external.api.zhongche.domain.aftersale.vo.AfterSaleDetailVo;
+import org.dromara.external.api.zhongche.domain.bo.GoodsImportBo;
+import org.dromara.external.api.zhongche.domain.bo.MessageBo;
+import org.dromara.external.api.zhongche.domain.vo.GoodsImportVo;
+import org.dromara.external.api.zhongche.domain.vo.MessageVo;
+import org.dromara.external.controller.zhongche.ZhongChePullController;
+import org.dromara.external.controller.zhongche.handle.MallMessageHandler;
+import org.dromara.external.domain.vo.ExternalProductVo;
+import org.dromara.external.enums.MallMessageTypeEnum;
+import org.dromara.external.service.IExternalProductService;
+import org.springframework.stereotype.Component;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * author
+ * 时间:2026/2/3,19:30
+ */
+@Component
+@Slf4j
+@RequiredArgsConstructor
+public class AccountActiveMessageHandler implements MallMessageHandler {
+
+    private final ZhongChePullController zhongChePullController;
+
+    private final IExternalProductService externalProductService;
+
+    @Override
+    public MallMessageTypeEnum supportType() {
+        return MallMessageTypeEnum.ACCOUNT_ACTIVE;
+    }
+
+    @Override
+    public MessageVo handle(MessageBo messageBo) {
+        Map<String, Object> content = (Map<String, Object>) messageBo.getContent();
+        String username = String.valueOf(content.get("username"));
+        List<ExternalProductVo> allProductList = externalProductService.getAllProductList();
+        if (CollUtil.isEmpty(allProductList)) {
+            log.info("商品导入:无可导入商品,username={}", username);
+            return new MessageVo("0","无可导入商品");
+        }
+        int size = allProductList.size();
+        for (int i = 0; i < size; i += 50) {
+            int end = Math.min(i + 50, size);
+            List<ExternalProductVo> batchList = allProductList.subList(i, end);
+            ExternalProductVo externalProductVo = batchList.get(0);
+            GoodsImportItem goodsImportItem = new GoodsImportItem();
+            goodsImportItem.setGoodsId(externalProductVo.getProductId().toString());
+            goodsImportItem.setCatalogId(externalProductVo.getExternalCategoryId().toString());
+            goodsImportItem.setCatalogName(externalProductVo.getItemName());
+
+
+            //GoodsImportBo goodsImportBo = new GoodsImportBo(username, batchList);
+            //GoodsImportVo result = zhongChePullController.egoodsImport(goodsImportBo);
+        }
+
+        //GoodsImportBo goodsImportBo = new GoodsImportBo(username, allProductList);
+
+        //zhongChePullController.egoodsImport()
+
+
+
+        /*if (!= null){
+            return new MessageVo("1");
+        }*/
+        return new MessageVo("0","取消订单失败");
+    }
+}

+ 45 - 0
ruoyi-modules/ruoyi-external/src/main/java/org/dromara/external/controller/zhongche/handle/impl/AfterSaleApplyMessageHandler.java

@@ -0,0 +1,45 @@
+package org.dromara.external.controller.zhongche.handle.impl;
+
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.dromara.external.api.zhongche.domain.aftersale.bo.AfterSaleDetailBo;
+import org.dromara.external.api.zhongche.domain.aftersale.vo.AfterSaleDetailVo;
+import org.dromara.external.api.zhongche.domain.bo.MessageBo;
+import org.dromara.external.api.zhongche.domain.vo.MessageVo;
+import org.dromara.external.controller.zhongche.ZhongChePullController;
+import org.dromara.external.controller.zhongche.ZhongChePushController;
+import org.dromara.external.controller.zhongche.handle.MallMessageHandler;
+import org.dromara.external.enums.MallMessageTypeEnum;
+import org.dromara.product.api.RemoteExternalOrderService;
+import org.springframework.stereotype.Component;
+import org.springframework.web.bind.annotation.RequestBody;
+
+/**
+ * author
+ * 时间:2026/2/3,19:00
+ */
+@Component
+@Slf4j
+@RequiredArgsConstructor
+public class AfterSaleApplyMessageHandler implements MallMessageHandler {
+
+    private final ZhongChePullController zhongChePullController;
+    @Override
+    public MallMessageTypeEnum supportType() {
+        return MallMessageTypeEnum.AFTER_SALE_APPLY;
+    }
+
+    @Override
+    public MessageVo handle(MessageBo messageBo) {
+        String afterSaleNo = (String) messageBo.getContent().get("afterSaleNo");
+        AfterSaleDetailBo bo = new AfterSaleDetailBo();
+        bo.setAfterSaleNo(afterSaleNo);
+        AfterSaleDetailVo afterSaleDetailVo = zhongChePullController.mallAftersaleDetail(bo);
+
+
+        if (afterSaleDetailVo != null){
+            return new MessageVo("1");
+        }
+        return new MessageVo("0","取消订单失败");
+    }
+}

+ 41 - 0
ruoyi-modules/ruoyi-external/src/main/java/org/dromara/external/controller/zhongche/handle/impl/AfterSaleCancelMessageHandler.java

@@ -0,0 +1,41 @@
+package org.dromara.external.controller.zhongche.handle.impl;
+
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.dromara.external.api.zhongche.domain.bo.MessageBo;
+import org.dromara.external.api.zhongche.domain.vo.MessageVo;
+import org.dromara.external.controller.zhongche.handle.MallMessageHandler;
+import org.dromara.external.enums.MallMessageTypeEnum;
+import org.dromara.product.api.RemoteExternalOrderService;
+import org.springframework.stereotype.Component;
+
+/**
+ * author
+ * 时间:2026/2/3,19:08
+ */
+@Component
+@Slf4j
+@RequiredArgsConstructor
+public class AfterSaleCancelMessageHandler implements MallMessageHandler {
+
+
+    private final RemoteExternalOrderService remoteExternalOrderService;
+
+    @Override
+    public MallMessageTypeEnum supportType() {
+        return MallMessageTypeEnum.AFTER_SALE_CANCEL;
+    }
+
+    @Override
+    public MessageVo handle(MessageBo messageBo) {
+        String afterSaleNo = (String) messageBo.getContent().get("afterSaleNo");
+        String cancelReason = (String) messageBo.getContent().get("cancelReason");
+
+        boolean b = remoteExternalOrderService.cancelReturnOrder(afterSaleNo, cancelReason);
+
+        if (b){
+            return new MessageVo("1");
+        }
+        return new MessageVo("0","取消订单失败");
+    }
+}

+ 33 - 0
ruoyi-modules/ruoyi-external/src/main/java/org/dromara/external/controller/zhongche/handle/impl/BillAbnormalPassMessageHandler.java

@@ -0,0 +1,33 @@
+package org.dromara.external.controller.zhongche.handle.impl;
+
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.dromara.external.api.zhongche.domain.aftersale.vo.AfterSaleDetailVo;
+import org.dromara.external.api.zhongche.domain.bo.MessageBo;
+import org.dromara.external.api.zhongche.domain.vo.MessageVo;
+import org.dromara.external.controller.zhongche.ZhongChePullController;
+import org.dromara.external.controller.zhongche.handle.MallMessageHandler;
+import org.dromara.external.enums.MallMessageTypeEnum;
+import org.springframework.stereotype.Component;
+
+/**
+ * author
+ * 时间:2026/2/3,19:47
+ */
+@Component
+@Slf4j
+@RequiredArgsConstructor
+public class BillAbnormalPassMessageHandler implements MallMessageHandler {
+
+    private final ZhongChePullController zhongChePullController;
+    @Override
+    public MallMessageTypeEnum supportType() {
+        return MallMessageTypeEnum.ABNORMAL_PASS;
+    }
+
+    @Override
+    public MessageVo handle(MessageBo messageBo) {
+        String abnormalId = (String) messageBo.getContent().get("abnormalId");
+        return new MessageVo("0","取消订单失败");
+    }
+}

+ 34 - 0
ruoyi-modules/ruoyi-external/src/main/java/org/dromara/external/controller/zhongche/handle/impl/BillConfirmMessageHandler.java

@@ -0,0 +1,34 @@
+package org.dromara.external.controller.zhongche.handle.impl;
+
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.dromara.external.api.zhongche.domain.aftersale.vo.AfterSaleDetailVo;
+import org.dromara.external.api.zhongche.domain.bo.MessageBo;
+import org.dromara.external.api.zhongche.domain.vo.MessageVo;
+import org.dromara.external.controller.zhongche.ZhongChePullController;
+import org.dromara.external.controller.zhongche.handle.MallMessageHandler;
+import org.dromara.external.enums.MallMessageTypeEnum;
+import org.springframework.stereotype.Component;
+
+/**
+ * author
+ * 时间:2026/2/3,19:39
+ */
+@Component
+@Slf4j
+@RequiredArgsConstructor
+public class BillConfirmMessageHandler implements MallMessageHandler {
+
+    private final ZhongChePullController zhongChePullController;
+    @Override
+    public MallMessageTypeEnum supportType() {
+        return MallMessageTypeEnum.AFTER_SALE_APPLY;
+    }
+
+    @Override
+    public MessageVo handle(MessageBo messageBo) {
+        String billId = (String) messageBo.getContent().get("billId");
+        String remark = (String) messageBo.getContent().get("remark");
+        return new MessageVo("0","取消订单失败");
+    }
+}

+ 33 - 0
ruoyi-modules/ruoyi-external/src/main/java/org/dromara/external/controller/zhongche/handle/impl/BillCreateMessageHandler.java

@@ -0,0 +1,33 @@
+package org.dromara.external.controller.zhongche.handle.impl;
+
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.dromara.external.api.zhongche.domain.aftersale.vo.AfterSaleDetailVo;
+import org.dromara.external.api.zhongche.domain.bo.MessageBo;
+import org.dromara.external.api.zhongche.domain.vo.MessageVo;
+import org.dromara.external.controller.zhongche.ZhongChePullController;
+import org.dromara.external.controller.zhongche.handle.MallMessageHandler;
+import org.dromara.external.enums.MallMessageTypeEnum;
+import org.springframework.stereotype.Component;
+
+/**
+ * author
+ * 时间:2026/2/3,19:43
+ */
+@Component
+@Slf4j
+@RequiredArgsConstructor
+public class BillCreateMessageHandler implements MallMessageHandler {
+
+    private final ZhongChePullController zhongChePullController;
+    @Override
+    public MallMessageTypeEnum supportType() {
+        return MallMessageTypeEnum.BILL_CREATE;
+    }
+
+    @Override
+    public MessageVo handle(MessageBo messageBo) {
+        String billId = (String) messageBo.getContent().get("billId");
+        return new MessageVo("0","取消订单失败");
+    }
+}

+ 34 - 0
ruoyi-modules/ruoyi-external/src/main/java/org/dromara/external/controller/zhongche/handle/impl/BillFinishMessageHandler.java

@@ -0,0 +1,34 @@
+package org.dromara.external.controller.zhongche.handle.impl;
+
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.dromara.external.api.zhongche.domain.aftersale.vo.AfterSaleDetailVo;
+import org.dromara.external.api.zhongche.domain.bo.MessageBo;
+import org.dromara.external.api.zhongche.domain.vo.MessageVo;
+import org.dromara.external.controller.zhongche.ZhongChePullController;
+import org.dromara.external.controller.zhongche.handle.MallMessageHandler;
+import org.dromara.external.enums.MallMessageTypeEnum;
+import org.springframework.stereotype.Component;
+
+/**
+ * author
+ * 时间:2026/2/3,19:45
+ */
+@Component
+@Slf4j
+@RequiredArgsConstructor
+public class BillFinishMessageHandler implements MallMessageHandler {
+
+    private final ZhongChePullController zhongChePullController;
+    @Override
+    public MallMessageTypeEnum supportType() {
+        return MallMessageTypeEnum.BILL_FINISH;
+    }
+
+    @Override
+    public MessageVo handle(MessageBo messageBo) {
+        String billId = (String) messageBo.getContent().get("billId");
+
+        return new MessageVo("0","取消订单失败");
+    }
+}

+ 35 - 0
ruoyi-modules/ruoyi-external/src/main/java/org/dromara/external/controller/zhongche/handle/impl/BillModifyMessageHandler.java

@@ -0,0 +1,35 @@
+package org.dromara.external.controller.zhongche.handle.impl;
+
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.dromara.external.api.zhongche.domain.aftersale.vo.AfterSaleDetailVo;
+import org.dromara.external.api.zhongche.domain.bo.MessageBo;
+import org.dromara.external.api.zhongche.domain.vo.MessageVo;
+import org.dromara.external.controller.zhongche.ZhongChePullController;
+import org.dromara.external.controller.zhongche.handle.MallMessageHandler;
+import org.dromara.external.enums.MallMessageTypeEnum;
+import org.springframework.stereotype.Component;
+
+/**
+ * author
+ * 时间:2026/2/3,19:40
+ */
+@Component
+@Slf4j
+@RequiredArgsConstructor
+public class BillModifyMessageHandler implements MallMessageHandler {
+
+    private final ZhongChePullController zhongChePullController;
+    @Override
+    public MallMessageTypeEnum supportType() {
+        return MallMessageTypeEnum.AFTER_SALE_APPLY;
+    }
+
+    @Override
+    public MessageVo handle(MessageBo messageBo) {
+        String billId = (String) messageBo.getContent().get("billId");
+        String purchaserRemark = (String) messageBo.getContent().get("purchaserRemark");
+
+        return new MessageVo("0","取消订单失败");
+    }
+}

+ 35 - 0
ruoyi-modules/ruoyi-external/src/main/java/org/dromara/external/controller/zhongche/handle/impl/BillRejctPassMessageHandler.java

@@ -0,0 +1,35 @@
+package org.dromara.external.controller.zhongche.handle.impl;
+
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.dromara.external.api.zhongche.domain.aftersale.vo.AfterSaleDetailVo;
+import org.dromara.external.api.zhongche.domain.bo.MessageBo;
+import org.dromara.external.api.zhongche.domain.vo.MessageVo;
+import org.dromara.external.controller.zhongche.ZhongChePullController;
+import org.dromara.external.controller.zhongche.handle.MallMessageHandler;
+import org.dromara.external.enums.MallMessageTypeEnum;
+import org.springframework.stereotype.Component;
+
+/**
+ * author
+ * 时间:2026/2/3,19:49
+ */
+
+@Component
+@Slf4j
+@RequiredArgsConstructor
+public class BillRejctPassMessageHandler implements MallMessageHandler {
+
+    private final ZhongChePullController zhongChePullController;
+    @Override
+    public MallMessageTypeEnum supportType() {
+        return MallMessageTypeEnum.ABNORMAL_REJECT;
+    }
+
+    @Override
+    public MessageVo handle(MessageBo messageBo) {
+        String abnormalId = (String) messageBo.getContent().get("abnormalId");
+
+        return new MessageVo("0","取消订单失败");
+    }
+}

+ 41 - 0
ruoyi-modules/ruoyi-external/src/main/java/org/dromara/external/controller/zhongche/handle/impl/BillRuleCreateMessageHandler.java

@@ -0,0 +1,41 @@
+package org.dromara.external.controller.zhongche.handle.impl;
+
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.dromara.external.api.zhongche.domain.aftersale.bo.AfterSaleDetailBo;
+import org.dromara.external.api.zhongche.domain.aftersale.vo.AfterSaleDetailVo;
+import org.dromara.external.api.zhongche.domain.bo.MessageBo;
+import org.dromara.external.api.zhongche.domain.vo.MessageVo;
+import org.dromara.external.controller.zhongche.ZhongChePullController;
+import org.dromara.external.controller.zhongche.handle.MallMessageHandler;
+import org.dromara.external.enums.MallMessageTypeEnum;
+import org.springframework.stereotype.Component;
+
+/**
+ * author
+ * 时间:2026/2/3,19:32
+ */
+@Component
+@Slf4j
+@RequiredArgsConstructor
+public class BillRuleCreateMessageHandler implements MallMessageHandler {
+
+    private final ZhongChePullController zhongChePullController;
+    @Override
+    public MallMessageTypeEnum supportType() {
+        return MallMessageTypeEnum.AFTER_SALE_APPLY;
+    }
+
+    @Override
+    public MessageVo handle(MessageBo messageBo) {
+        String billRuleNo = (String) messageBo.getContent().get("billRuleNo");
+        String billCycle = (String) messageBo.getContent().get("billCycle");
+        String billDay = (String) messageBo.getContent().get("billDay");
+        //格式:2020-09-29 21:20:58
+        String firstStartTime = (String) messageBo.getContent().get("firstStartTime");
+        boolean cashIncluded = (boolean) messageBo.getContent().get("cashIncluded");
+        String orderCompleteDay = (String) messageBo.getContent().get("orderCompleteDay");
+        String ruleStatus = (String) messageBo.getContent().get("ruleStatus");
+        return new MessageVo("0","取消订单失败");
+    }
+}

+ 34 - 0
ruoyi-modules/ruoyi-external/src/main/java/org/dromara/external/controller/zhongche/handle/impl/BillWaitInvoiceMessageHandler.java

@@ -0,0 +1,34 @@
+package org.dromara.external.controller.zhongche.handle.impl;
+
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.dromara.external.api.zhongche.domain.aftersale.vo.AfterSaleDetailVo;
+import org.dromara.external.api.zhongche.domain.bo.MessageBo;
+import org.dromara.external.api.zhongche.domain.vo.MessageVo;
+import org.dromara.external.controller.zhongche.ZhongChePullController;
+import org.dromara.external.controller.zhongche.handle.MallMessageHandler;
+import org.dromara.external.enums.MallMessageTypeEnum;
+import org.springframework.stereotype.Component;
+
+/**
+ * author
+ * 时间:2026/2/3,19:42
+ */
+@Component
+@Slf4j
+@RequiredArgsConstructor
+public class BillWaitInvoiceMessageHandler implements MallMessageHandler {
+
+    private final ZhongChePullController zhongChePullController;
+    @Override
+    public MallMessageTypeEnum supportType() {
+        return MallMessageTypeEnum.AFTER_SALE_APPLY;
+    }
+
+    @Override
+    public MessageVo handle(MessageBo messageBo) {
+        String batchNo = (String) messageBo.getContent().get("batchNo");
+
+        return new MessageVo("0","取消订单失败");
+    }
+}

+ 41 - 0
ruoyi-modules/ruoyi-external/src/main/java/org/dromara/external/controller/zhongche/handle/impl/OrderCancelApplyMessageHandler.java

@@ -0,0 +1,41 @@
+package org.dromara.external.controller.zhongche.handle.impl;
+
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.dromara.external.api.zhongche.domain.bo.MessageBo;
+import org.dromara.external.api.zhongche.domain.vo.MessageVo;
+import org.dromara.external.controller.zhongche.handle.MallMessageHandler;
+import org.dromara.external.enums.MallMessageTypeEnum;
+import org.dromara.product.api.RemoteExternalOrderService;
+import org.springframework.stereotype.Component;
+
+/**
+ * author
+ * 时间:2026/2/3,18:50
+ */
+@Component
+@Slf4j
+@RequiredArgsConstructor
+public class OrderCancelApplyMessageHandler implements MallMessageHandler {
+
+
+    private final RemoteExternalOrderService remoteExternalOrderService;
+
+    @Override
+    public MallMessageTypeEnum supportType() {
+        return MallMessageTypeEnum.ORDER_CANCEL_APPLY;
+    }
+
+    @Override
+    public MessageVo handle(MessageBo messageBo) {
+        String orderNo = (String) messageBo.getContent().get("orderNo");
+        String cancelReason = (String) messageBo.getContent().get("cancelReason");
+
+        boolean b = remoteExternalOrderService.cancelOrder(orderNo, cancelReason);
+
+        if (b){
+            return new MessageVo("1");
+        }
+        return new MessageVo("0","取消订单失败");
+    }
+}

+ 44 - 0
ruoyi-modules/ruoyi-external/src/main/java/org/dromara/external/controller/zhongche/handle/impl/OrderCancelMessageHandler.java

@@ -0,0 +1,44 @@
+package org.dromara.external.controller.zhongche.handle.impl;
+
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.dromara.external.api.zhongche.domain.bo.MessageBo;
+import org.dromara.external.api.zhongche.domain.bo.OrderDetailBo;
+import org.dromara.external.api.zhongche.domain.vo.MessageVo;
+import org.dromara.external.api.zhongche.domain.vo.OrderDetailVo;
+import org.dromara.external.controller.zhongche.ZhongChePullController;
+import org.dromara.external.controller.zhongche.handle.MallMessageHandler;
+import org.dromara.external.enums.MallMessageTypeEnum;
+import org.dromara.product.api.RemoteExternalOrderService;
+import org.springframework.stereotype.Component;
+
+/**
+ * author
+ * 时间:2026/2/3,15:41
+ */
+@Component
+@Slf4j
+@RequiredArgsConstructor
+public class OrderCancelMessageHandler implements MallMessageHandler {
+
+
+    private final RemoteExternalOrderService remoteExternalOrderService;
+
+    @Override
+    public MallMessageTypeEnum supportType() {
+        return MallMessageTypeEnum.ORDER_CANCEL;
+    }
+
+    @Override
+    public MessageVo handle(MessageBo messageBo) {
+        String orderNo = (String) messageBo.getContent().get("orderNo");
+        String cancelReason = (String) messageBo.getContent().get("cancelReason");
+
+        boolean b = remoteExternalOrderService.cancelOrder(orderNo, cancelReason);
+
+        if (b){
+            return new MessageVo("1");
+        }
+        return new MessageVo("0","取消订单失败");
+    }
+}

+ 39 - 0
ruoyi-modules/ruoyi-external/src/main/java/org/dromara/external/controller/zhongche/handle/impl/OrderCreateMessageHandler.java

@@ -0,0 +1,39 @@
+package org.dromara.external.controller.zhongche.handle.impl;
+
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.dromara.external.api.zhongche.domain.bo.MessageBo;
+import org.dromara.external.api.zhongche.domain.bo.OrderDetailBo;
+import org.dromara.external.api.zhongche.domain.vo.MessageVo;
+import org.dromara.external.api.zhongche.domain.vo.OrderDetailVo;
+import org.dromara.external.controller.zhongche.ZhongChePullController;
+import org.dromara.external.controller.zhongche.handle.MallMessageHandler;
+import org.dromara.external.enums.MallMessageTypeEnum;
+import org.springframework.stereotype.Component;
+
+@Component
+@Slf4j
+@RequiredArgsConstructor
+public class OrderCreateMessageHandler implements MallMessageHandler {
+
+    private final ZhongChePullController zhongChePullController;
+
+    @Override
+    public MallMessageTypeEnum supportType() {
+        return MallMessageTypeEnum.ORDER_CREATE;
+    }
+
+    @Override
+    public MessageVo handle(MessageBo messageBo) {
+        String orderNo = (String) messageBo.getContent().get("orderNo");
+        log.info("处理新订单消息,orderNo={}", orderNo);
+        OrderDetailBo orderDetailBo = new OrderDetailBo();
+        orderDetailBo.setOrderNo(orderNo);
+        OrderDetailVo orderDetailVo = zhongChePullController.mallOrderDetail(orderDetailBo);
+        if (orderDetailVo != null){
+            return new MessageVo("1");
+        }
+
+        return new MessageVo("0","获取订单详情失败");
+    }
+}

+ 40 - 0
ruoyi-modules/ruoyi-external/src/main/java/org/dromara/external/controller/zhongche/handle/impl/OrderReceiveConfirmMessageHandler.java

@@ -0,0 +1,40 @@
+package org.dromara.external.controller.zhongche.handle.impl;
+
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.dromara.external.api.zhongche.domain.bo.MessageBo;
+import org.dromara.external.api.zhongche.domain.vo.MessageVo;
+import org.dromara.external.controller.zhongche.handle.MallMessageHandler;
+import org.dromara.external.enums.MallMessageTypeEnum;
+import org.dromara.product.api.RemoteExternalOrderService;
+import org.springframework.stereotype.Component;
+
+/**
+ * author
+ * 时间:2026/2/3,16:06
+ */
+@Component
+@Slf4j
+@RequiredArgsConstructor
+public class OrderReceiveConfirmMessageHandler implements MallMessageHandler {
+
+    private final RemoteExternalOrderService remoteExternalOrderService;
+
+    @Override
+    public MallMessageTypeEnum supportType() {
+        return MallMessageTypeEnum.ORDER_RECEIVE_CONFIRM;
+    }
+
+    @Override
+    public MessageVo handle(MessageBo messageBo) {
+        String orderNo = (String) messageBo.getContent().get("orderNo");
+        String outgoingCode = (String) messageBo.getContent().get("outgoingCode");
+
+        boolean b = remoteExternalOrderService.cancelOrder(orderNo, outgoingCode);
+
+        if (b){
+            return new MessageVo("1");
+        }
+        return new MessageVo("0","确认收获失败");
+    }
+}

+ 40 - 0
ruoyi-modules/ruoyi-external/src/main/java/org/dromara/external/controller/zhongche/handle/impl/PrepareCancelMessageHandler.java

@@ -0,0 +1,40 @@
+package org.dromara.external.controller.zhongche.handle.impl;
+
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.dromara.customer.api.RemotePartnerPreparedService;
+import org.dromara.customer.api.domain.dto.PartnerPreparedDTO;
+import org.dromara.external.api.zhongche.domain.bo.MessageBo;
+import org.dromara.external.api.zhongche.domain.vo.MessageVo;
+import org.dromara.external.controller.zhongche.handle.MallMessageHandler;
+import org.dromara.external.enums.MallMessageTypeEnum;
+import org.springframework.stereotype.Component;
+
+/**
+ * author
+ * 时间:2026/2/3,18:15
+ */
+@Component
+@Slf4j
+@RequiredArgsConstructor
+public class PrepareCancelMessageHandler implements MallMessageHandler {
+
+    private final RemotePartnerPreparedService remotePartnerPreparedService;
+
+    @Override
+    public MallMessageTypeEnum supportType() {
+        return MallMessageTypeEnum.PREPARE_CANCEL;
+    }
+
+    @Override
+    public MessageVo handle(MessageBo messageBo) {
+        String prepareOrderNo = (String) messageBo.getContent().get("prepareOrderNo");
+        String cancelReason = (String) messageBo.getContent().get("cancelReason");
+        PartnerPreparedDTO partnerPreparedDTO = remotePartnerPreparedService.cancelPartnerPreparedById(prepareOrderNo,cancelReason);
+        if (partnerPreparedDTO.isFlag()){
+            return new MessageVo("1");
+        }
+
+        return new MessageVo("0",partnerPreparedDTO.getMessage());
+    }
+}

+ 40 - 0
ruoyi-modules/ruoyi-external/src/main/java/org/dromara/external/controller/zhongche/handle/impl/PrepareConfirmMessageHandler.java

@@ -0,0 +1,40 @@
+package org.dromara.external.controller.zhongche.handle.impl;
+
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.dromara.customer.api.RemotePartnerPreparedService;
+import org.dromara.customer.api.domain.dto.PartnerPreparedDTO;
+import org.dromara.external.api.zhongche.domain.bo.MessageBo;
+import org.dromara.external.api.zhongche.domain.vo.MessageVo;
+import org.dromara.external.controller.zhongche.handle.MallMessageHandler;
+import org.dromara.external.enums.MallMessageTypeEnum;
+import org.dromara.product.api.RemoteExternalOrderService;
+import org.springframework.stereotype.Component;
+
+/**
+ * author
+ * 时间:2026/2/3,17:32
+ */
+@Component
+@Slf4j
+@RequiredArgsConstructor
+public class PrepareConfirmMessageHandler  implements MallMessageHandler {
+
+    private final RemotePartnerPreparedService remotePartnerPreparedService;
+
+    @Override
+    public MallMessageTypeEnum supportType() {
+        return MallMessageTypeEnum.PREPARE_CONFIRM;
+    }
+
+    @Override
+    public MessageVo handle(MessageBo messageBo) {
+        String prepareOrderNo = (String) messageBo.getContent().get("prepareOrderNo");
+        PartnerPreparedDTO partnerPreparedDTO = remotePartnerPreparedService.updatePartnerPreparedById(prepareOrderNo);
+        if (partnerPreparedDTO.isFlag()){
+            return new MessageVo("1");
+        }
+
+        return new MessageVo("0",partnerPreparedDTO.getMessage());
+    }
+}

+ 21 - 2
ruoyi-modules/ruoyi-external/src/main/java/org/dromara/external/enums/MallMessageTypeEnum.java

@@ -12,36 +12,52 @@ public enum MallMessageTypeEnum {
     ORDER_CREATE("2001", "订单", "新订单消息"),
     ORDER_CANCEL("2002", "订单", "取消订单消息"),
     ORDER_RECEIVE_CONFIRM("2003", "订单", "确认收货消息"),
+    //TODO 没有预购单
     ORDER_PRE_CONFIRM("2004", "订单", "确认预购单"),
+    //TODO 胡哥说没有混合支付订单
     ORDER_PAY_NOTICE("2005", "订单", "订单支付信息通知"),
 
     /* ======================= 备货单 ======================= */
+    //TODO 废弃
     PREPARE_CREATE("2006", "备货单", "新备货单消息"),
     PREPARE_CONFIRM("2007", "备货单", "确认备货单消息"),
     PREPARE_CANCEL("2008", "备货单", "取消备货单消息"),
 
     /* ======================= 订单取消申请 ======================= */
+    //TODO 跟2002功能重复
     ORDER_CANCEL_APPLY("2009", "订单", "取消订单申请消息"),
-
     /* ======================= 售后 ======================= */
     AFTER_SALE_APPLY("2101", "售后单", "申请售后消息"),
     AFTER_SALE_CANCEL("2102", "售后单", "取消售后消息"),
+    //没注释
     AFTER_SALE_DELIVER("2103", "售后单", "退货发运消息"),
+    //没注释
     AFTER_SALE_RECEIVE_CONFIRM("2104", "售后单", "确认收货"),
+    //胡歌说都是信用支付不是现金支付
     AFTER_SALE_REFUND_NOTICE("2105", "售后单", "售后退款信息通知"),
 
     /* ======================= 账户 ======================= */
+    //TODO 没做
     ACCOUNT_ACTIVE("2201", "账户", "电商账户已生效"),
-    NOTICE("2202", "账户", "通知公告信息"),
+    //没做常老师说不需要
+    ACCOUNT_NOTICE("2202", "账户", "通知公告信息"),
 
     /* ======================= 对账 ======================= */
+    //废弃
     BILL_RULE_CREATE("2301", "对账", "生成对账规则消息"),
+    //废弃
     BILL_CONFIRM("2302", "对账", "采购确认账单"),
+    //废弃
     BILL_MODIFY("2303", "对账", "采购修改账单"),
+    //废弃
     BILL_WAIT_INVOICE("2304", "对账", "待开票订单消息"),
+    //废弃
     BILL_CREATE("2305", "对账", "采购生成对账单消息"),
+    //废弃
     BILL_FINISH("2306", "对账", "采购完成对账单消息"),
+    //废弃
     ABNORMAL_PASS("2307", "对账", "异议单审核通过消息"),
+    //废弃
     ABNORMAL_REJECT("2308", "对账", "异议单审核不通过消息"),
 
     /* ======================= 开票 ======================= */
@@ -75,6 +91,9 @@ public enum MallMessageTypeEnum {
      * 根据 type 查枚举
      */
     public static MallMessageTypeEnum of(String code) {
+        if (code == null) {
+            return null;
+        }
         for (MallMessageTypeEnum type : values()) {
             if (type.code.equals(code)) {
                 return type;

+ 5 - 0
ruoyi-modules/ruoyi-external/src/main/java/org/dromara/external/service/IExternalProductService.java

@@ -92,4 +92,9 @@ public interface IExternalProductService extends IService<ExternalProduct>{
      * @return 是否审核成功
      */
     Boolean shelfReview(ExternalProductBo bo);
+
+    /**
+     * 获取所有商品列表
+     */
+    List<ExternalProductVo> getAllProductList();
 }

+ 6 - 0
ruoyi-modules/ruoyi-external/src/main/java/org/dromara/external/service/impl/ExternalProductServiceImpl.java

@@ -193,4 +193,10 @@ public class ExternalProductServiceImpl  extends ServiceImpl<ExternalProductMapp
             .eq(ExternalProduct::getId, bo.getId())
         )>0;
     }
+
+    @Override
+    public List<ExternalProductVo> getAllProductList() {
+        List<ExternalProductVo> externalProductVos = baseMapper.selectVoList();
+        return externalProductVos;
+    }
 }

+ 61 - 1
ruoyi-modules/ruoyi-order/src/main/java/org/dromara/order/dubbo/RemoteExternalOrderServiceImpl.java

@@ -8,11 +8,12 @@ import org.apache.dubbo.config.annotation.DubboService;
 import org.dromara.common.core.domain.zhongche.domain.DeliveryTrack;
 import org.dromara.common.core.exception.ServiceException;
 import org.dromara.common.core.utils.StringUtils;
-import org.dromara.external.api.zhongche.domain.vo.TrackVo;
+import org.dromara.common.core.domain.zhongche.vo.TrackVo;
 import org.dromara.order.domain.OrderDeliver;
 import org.dromara.order.domain.OrderMain;
 import org.dromara.order.domain.OrderReturn;
 import org.dromara.order.domain.bo.OrderProductBo;
+import org.dromara.order.enums.PackStatusEnum;
 import org.dromara.order.service.IOrderDeliverService;
 import org.dromara.order.service.IOrderMainService;
 import org.dromara.order.service.IOrderProductService;
@@ -27,6 +28,7 @@ import org.dromara.product.api.domain.dto.OrderNoticeDto;
 import org.dromara.product.api.domain.dto.OrderPushDto;
 import org.dromara.system.api.RemoteComLogisticsCompanyService;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
 
 import java.util.ArrayList;
 import java.util.List;
@@ -186,6 +188,64 @@ public class RemoteExternalOrderServiceImpl implements RemoteExternalOrderServic
         return one.getReturnNo();
     }
 
+    @Override
+    public boolean cancelOrder(String orderNo, String cancelReason) {
+        boolean update = orderMainService.lambdaUpdate()
+            .eq(OrderMain::getOrderNo, orderNo)
+            .eq(OrderMain::getOrderStatus, "2")
+            .set(OrderMain::getOrderStatus, "7")
+            .set(OrderMain::getCancelReason, cancelReason)
+            .update();
+        return update;
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public boolean confirmReceive(String orderNo ,String outgoingCode) {
+        boolean updated = orderDeliverService.lambdaUpdate()
+            .eq(OrderDeliver::getOrderCode, orderNo)
+            .eq(OrderDeliver::getDeliverCode, outgoingCode)
+            //这里可以加一个幂等性判断但是目前好像没有包裹状态 胡哥还没完成
+            .set(OrderDeliver::getLogisticPackStatus, PackStatusEnum.PACK_STATUS_RECEIVED)
+            .update();
+
+        if (!updated) {
+            log.warn("确认收货失败,未找到发货单,orderNo={}, outgoingCode={}", orderNo, outgoingCode);
+            return false;
+        }
+        // 2. 判断该订单下是否还有【未收货】的发货单
+        long notReceivedCount = orderDeliverService.lambdaQuery()
+            .eq(OrderDeliver::getOrderCode, orderNo)
+            .ne(OrderDeliver::getLogisticPackStatus, PackStatusEnum.PACK_STATUS_RECEIVED)
+            .count();
+
+        // 3. 如果全部已收货 → 更新订单主表为【已完成】
+        if (notReceivedCount == 0) {
+            orderMainService.lambdaUpdate()
+                .eq(OrderMain::getOrderNo, orderNo)
+                .set(OrderMain::getOrderStatus, "5")
+                .update();
+
+            log.info("订单全部收货完成,orderNo={},订单状态更新为已完成", orderNo);
+        }
+
+        return true;
+
+    }
+
+    @Override
+    public boolean cancelReturnOrder(String afterSaleNo, String cancelReason) {
+        //要求是待处理状态 目前没有 就拿待处理状态先写
+        boolean update = orderReturnService.lambdaUpdate()
+            .eq(OrderReturn::getReturnNo, afterSaleNo)
+            .eq(OrderReturn::getReturnStatus, "0")
+            .set(OrderReturn::getReturnStatus, "4")
+            .set(OrderReturn::getReturnReason, cancelReason)
+            .update();
+
+        return update;
+    }
+
     /**
      * 从物流描述中提取快递员姓名
      * @param context 物流描述字符串

+ 34 - 0
ruoyi-modules/ruoyi-order/src/main/java/org/dromara/order/enums/PackStatusEnum.java

@@ -0,0 +1,34 @@
+package org.dromara.order.enums;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+/**
+ * author
+ * 时间:2026/2/3,16:03
+ */
+@Getter
+@AllArgsConstructor
+public enum PackStatusEnum {
+
+    PACK_STATUS_WAIT_PACK("0", "待打包"),
+    PACK_STATUS_RECEIVED("1", "已收货");
+
+    private final String code;
+    private final String desc;
+
+    /**
+     * 根据 type 查枚举
+     */
+    public static PackStatusEnum of(String code) {
+        if (code == null) {
+            return null;
+        }
+        for (PackStatusEnum type : values()) {
+            if (type.code.equals(code)) {
+                return type;
+            }
+        }
+        return null;
+    }
+}