Просмотр исходного кода

Merge branch 'master' into hurx

hurx 1 месяц назад
Родитель
Сommit
f3735f021f
100 измененных файлов с 2677 добавлено и 338 удалено
  1. 9 0
      ruoyi-api/ruoyi-api-customer/src/main/java/org/dromara/customer/api/RemoteCustomerService.java
  2. 3 0
      ruoyi-api/ruoyi-api-customer/src/main/java/org/dromara/customer/api/RemotePartnerPreparedService.java
  3. 14 0
      ruoyi-api/ruoyi-api-customer/src/main/java/org/dromara/customer/api/domain/dto/CustomerAddressDTO.java
  4. 16 0
      ruoyi-api/ruoyi-api-customer/src/main/java/org/dromara/customer/api/domain/dto/CustomerInfoDTO.java
  5. 19 0
      ruoyi-api/ruoyi-api-external/src/main/java/org/dromara/external/api/zhongche/domain/bo/PrepareOrderDataBo.java
  6. 16 0
      ruoyi-api/ruoyi-api-external/src/main/java/org/dromara/external/api/zhongche/domain/bo/PrepareOrderDetailReqBo.java
  7. 19 0
      ruoyi-api/ruoyi-api-external/src/main/java/org/dromara/external/api/zhongche/domain/bo/PrepareOrderGoods.java
  8. 12 0
      ruoyi-api/ruoyi-api-external/src/main/java/org/dromara/external/api/zhongche/domain/vo/CheckResultVo.java
  9. 13 1
      ruoyi-api/ruoyi-api-order/src/main/java/org/dromara/product/api/RemoteExternalOrderService.java
  10. 11 2
      ruoyi-api/ruoyi-api-order/src/main/java/org/dromara/product/api/domain/dto/OrderNoDto.java
  11. 24 0
      ruoyi-api/ruoyi-api-order/src/main/java/org/dromara/product/api/domain/dto/OrderReturnDto.java
  12. 5 0
      ruoyi-api/ruoyi-api-product/src/main/java/org/dromara/product/api/RemoteProductService.java
  13. 4 0
      ruoyi-api/ruoyi-api-product/src/main/java/org/dromara/product/api/domain/zhongche/dto/ProductAggregateDto.java
  14. 27 17
      ruoyi-auth/src/main/java/org/dromara/auth/controller/Auth2Controller.java
  15. 25 99
      ruoyi-auth/src/main/java/org/dromara/auth/util/SM2SignatureUtils.java
  16. 6 0
      ruoyi-auth/src/main/java/org/dromara/auth/util/SignParamUtils.java
  17. 2 1
      ruoyi-auth/src/main/java/org/dromara/auth/util/ZCApiUtils.java
  18. 4 2
      ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/zhongche/aftersale/bo/AfterSaleConfirmBo.java
  19. 4 3
      ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/zhongche/aftersale/bo/AfterSaleDeliverGoodsBo.java
  20. 4 2
      ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/zhongche/aftersale/bo/AfterSaleDetailBo.java
  21. 7 5
      ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/zhongche/aftersale/bo/AfterSaleOfflineCreateBo.java
  22. 4 2
      ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/zhongche/aftersale/bo/AfterSalePendingListBo.java
  23. 4 2
      ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/zhongche/aftersale/bo/AfterSaleQueryOutgoingBo.java
  24. 4 2
      ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/zhongche/aftersale/bo/AfterSaleRefundBo.java
  25. 4 2
      ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/zhongche/aftersale/bo/AfterSaleRejectBo.java
  26. 4 2
      ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/zhongche/aftersale/bo/AfterSaleReturnReceivedBo.java
  27. 4 2
      ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/zhongche/aftersale/domain/AfterSaleDeliverGoodsItem.java
  28. 3 2
      ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/zhongche/aftersale/domain/AfterSaleGoods.java
  29. 3 2
      ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/zhongche/aftersale/domain/AfterSaleOutgoingItem.java
  30. 4 2
      ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/zhongche/aftersale/domain/AfterSalePick.java
  31. 3 2
      ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/zhongche/aftersale/domain/AfterSaleReason.java
  32. 4 2
      ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/zhongche/aftersale/domain/AfterSaleRecords.java
  33. 4 2
      ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/zhongche/aftersale/domain/AfterSaleReturn.java
  34. 4 2
      ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/zhongche/aftersale/domain/ImageList.java
  35. 3 2
      ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/zhongche/aftersale/domain/OutgoingGoodsItem.java
  36. 4 2
      ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/zhongche/aftersale/vo/AfterSaleDeliverGoodsVo.java
  37. 7 6
      ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/zhongche/aftersale/vo/AfterSaleDetailVo.java
  38. 4 2
      ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/zhongche/aftersale/vo/AfterSaleOfflineCreateVo.java
  39. 4 3
      ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/zhongche/aftersale/vo/AfterSalePendingListVo.java
  40. 4 3
      ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/zhongche/aftersale/vo/AfterSaleQueryOutgoingVo.java
  41. 4 2
      ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/zhongche/domain/OrderFileItem.java
  42. 3 2
      ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/zhongche/domain/OrderGoodsItem.java
  43. 4 2
      ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/zhongche/domain/ZhongCheOrderInvoice.java
  44. 42 0
      ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/zhongche/domain/ZhongChePrepareOrderGoods.java
  45. 7 6
      ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/zhongche/vo/OrderDetailVo.java
  46. 87 0
      ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/zhongche/vo/PrepareOrderDetailRespVo.java
  47. 2 1
      ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/zhongche/vo/ZhongCheTrackVo.java
  48. 6 0
      ruoyi-common/ruoyi-common-satoken/src/main/resources/common-satoken.yml
  49. 27 0
      ruoyi-gateway/src/main/java/org/dromara/gateway/filter/GlobalCorsConfig.java
  50. 106 0
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/controller/PartnerPreparedProductThirdController.java
  51. 106 0
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/controller/PartnerPreparedThirdController.java
  52. 2 0
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/domain/CustomerInfo.java
  53. 3 1
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/domain/PartnerPrepared.java
  54. 78 0
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/domain/PartnerPreparedProductThird.java
  55. 115 0
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/domain/PartnerPreparedThird.java
  56. 2 0
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/domain/bo/CustomerInfoBo.java
  57. 70 0
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/domain/bo/PartnerPreparedProductThirdBo.java
  58. 107 0
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/domain/bo/PartnerPreparedThirdBo.java
  59. 1 0
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/domain/vo/CustomerInfoVo.java
  60. 89 0
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/domain/vo/PartnerPreparedProductThirdVo.java
  61. 132 0
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/domain/vo/PartnerPreparedThirdVo.java
  62. 36 0
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/dubbo/RemoteCustomerServiceImpl.java
  63. 146 12
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/dubbo/RemotePartnerPreparedServiceImpl.java
  64. 15 0
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/mapper/PartnerPreparedProductThirdMapper.java
  65. 15 0
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/mapper/PartnerPreparedThirdMapper.java
  66. 70 0
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/service/IPartnerPreparedProductThirdService.java
  67. 2 0
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/service/IPartnerPreparedService.java
  68. 70 0
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/service/IPartnerPreparedThirdService.java
  69. 140 0
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/service/impl/PartnerPreparedProductThirdServiceImpl.java
  70. 11 10
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/service/impl/PartnerPreparedServiceImpl.java
  71. 147 0
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/service/impl/PartnerPreparedThirdServiceImpl.java
  72. 7 0
      ruoyi-modules/ruoyi-customer/src/main/resources/mapper/customer/PartnerPreparedProductThirdMapper.xml
  73. 7 0
      ruoyi-modules/ruoyi-customer/src/main/resources/mapper/customer/PartnerPreparedThirdMapper.xml
  74. 2 0
      ruoyi-modules/ruoyi-external/src/main/java/org/dromara/external/RuoyiExternalApplication.java
  75. 227 15
      ruoyi-modules/ruoyi-external/src/main/java/org/dromara/external/controller/zhongche/ZhongChePullController.java
  76. 113 42
      ruoyi-modules/ruoyi-external/src/main/java/org/dromara/external/controller/zhongche/ZhongChePushController.java
  77. 19 7
      ruoyi-modules/ruoyi-external/src/main/java/org/dromara/external/controller/zhongche/handle/impl/AccountActiveMessageHandler.java
  78. 14 7
      ruoyi-modules/ruoyi-external/src/main/java/org/dromara/external/controller/zhongche/handle/impl/AfterSaleApplyMessageHandler.java
  79. 5 3
      ruoyi-modules/ruoyi-external/src/main/java/org/dromara/external/controller/zhongche/handle/impl/AfterSaleCancelMessageHandler.java
  80. 49 0
      ruoyi-modules/ruoyi-external/src/main/java/org/dromara/external/controller/zhongche/handle/impl/AfterSaleDeliverMessageHandler.java
  81. 46 0
      ruoyi-modules/ruoyi-external/src/main/java/org/dromara/external/controller/zhongche/handle/impl/AfterSaleReceiveConfirmMessageHandler.java
  82. 0 1
      ruoyi-modules/ruoyi-external/src/main/java/org/dromara/external/controller/zhongche/handle/impl/BillAbnormalPassMessageHandler.java
  83. 0 1
      ruoyi-modules/ruoyi-external/src/main/java/org/dromara/external/controller/zhongche/handle/impl/BillConfirmMessageHandler.java
  84. 0 1
      ruoyi-modules/ruoyi-external/src/main/java/org/dromara/external/controller/zhongche/handle/impl/BillCreateMessageHandler.java
  85. 0 1
      ruoyi-modules/ruoyi-external/src/main/java/org/dromara/external/controller/zhongche/handle/impl/BillFinishMessageHandler.java
  86. 0 1
      ruoyi-modules/ruoyi-external/src/main/java/org/dromara/external/controller/zhongche/handle/impl/BillModifyMessageHandler.java
  87. 0 1
      ruoyi-modules/ruoyi-external/src/main/java/org/dromara/external/controller/zhongche/handle/impl/BillRejctPassMessageHandler.java
  88. 0 2
      ruoyi-modules/ruoyi-external/src/main/java/org/dromara/external/controller/zhongche/handle/impl/BillRuleCreateMessageHandler.java
  89. 0 1
      ruoyi-modules/ruoyi-external/src/main/java/org/dromara/external/controller/zhongche/handle/impl/BillWaitInvoiceMessageHandler.java
  90. 6 5
      ruoyi-modules/ruoyi-external/src/main/java/org/dromara/external/controller/zhongche/handle/impl/GoodsAuditPassMessageHandler.java
  91. 6 5
      ruoyi-modules/ruoyi-external/src/main/java/org/dromara/external/controller/zhongche/handle/impl/GoodsAuditRejectMessageHandler.java
  92. 6 2
      ruoyi-modules/ruoyi-external/src/main/java/org/dromara/external/controller/zhongche/handle/impl/GoodsImportBlockMessageHandler.java
  93. 7 3
      ruoyi-modules/ruoyi-external/src/main/java/org/dromara/external/controller/zhongche/handle/impl/GoodsOffShelfMessageHandler.java
  94. 7 6
      ruoyi-modules/ruoyi-external/src/main/java/org/dromara/external/controller/zhongche/handle/impl/GoodsOnShelfFailMessageHandler.java
  95. 6 4
      ruoyi-modules/ruoyi-external/src/main/java/org/dromara/external/controller/zhongche/handle/impl/GoodsWaitAuditMessageHandler.java
  96. 0 2
      ruoyi-modules/ruoyi-external/src/main/java/org/dromara/external/controller/zhongche/handle/impl/InvoiceApplyMessageHandler.java
  97. 16 5
      ruoyi-modules/ruoyi-external/src/main/java/org/dromara/external/controller/zhongche/handle/impl/OrderCancelApplyMessageHandler.java
  98. 5 7
      ruoyi-modules/ruoyi-external/src/main/java/org/dromara/external/controller/zhongche/handle/impl/OrderCancelMessageHandler.java
  99. 101 4
      ruoyi-modules/ruoyi-external/src/main/java/org/dromara/external/controller/zhongche/handle/impl/OrderCreateMessageHandler.java
  100. 64 0
      ruoyi-modules/ruoyi-external/src/main/java/org/dromara/external/controller/zhongche/handle/impl/OrderPayNoticeMessageHandler.java

+ 9 - 0
ruoyi-api/ruoyi-api-customer/src/main/java/org/dromara/customer/api/RemoteCustomerService.java

@@ -1,6 +1,8 @@
 package org.dromara.customer.api;
 
 import org.dromara.customer.api.domain.CustomerApiVo;
+import org.dromara.customer.api.domain.dto.CustomerAddressDTO;
+import org.dromara.customer.api.domain.dto.CustomerInfoDTO;
 
 import java.util.Map;
 import java.util.Set;
@@ -22,4 +24,11 @@ public interface RemoteCustomerService {
      */
     Long selectCustomerIdByUserId(Long userId);
 
+    /**
+     * 新增收货人
+     */
+    CustomerInfoDTO addReceiver(String name , String email);
+
+    CustomerAddressDTO addReceiverAddress(String provinceId, String cityId, String countyId, String address , String mobile);
+
 }

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

@@ -1,5 +1,6 @@
 package org.dromara.customer.api;
 
+import org.dromara.common.core.domain.zhongche.vo.PrepareOrderDetailRespVo;
 import org.dromara.customer.api.domain.dto.PartnerPreparedDTO;
 
 /**
@@ -11,4 +12,6 @@ public interface RemotePartnerPreparedService {
     PartnerPreparedDTO updatePartnerPreparedById(String id);
 
     PartnerPreparedDTO cancelPartnerPreparedById(String prepareOrderNo, String cancelReason);
+
+    PartnerPreparedDTO createPartnerPrepared(PrepareOrderDetailRespVo prepareOrderDetailRespVo);
 }

+ 14 - 0
ruoyi-api/ruoyi-api-customer/src/main/java/org/dromara/customer/api/domain/dto/CustomerAddressDTO.java

@@ -0,0 +1,14 @@
+package org.dromara.customer.api.domain.dto;
+
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * author
+ * 时间:2026/2/6,10:59
+ */
+@Data
+public class CustomerAddressDTO implements Serializable {
+    private Long id;
+}

+ 16 - 0
ruoyi-api/ruoyi-api-customer/src/main/java/org/dromara/customer/api/domain/dto/CustomerInfoDTO.java

@@ -0,0 +1,16 @@
+package org.dromara.customer.api.domain.dto;
+
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * author
+ * 时间:2026/2/6,10:50
+ */
+@Data
+public class CustomerInfoDTO implements Serializable {
+    private Long id;
+
+    private String customerName;
+}

+ 19 - 0
ruoyi-api/ruoyi-api-external/src/main/java/org/dromara/external/api/zhongche/domain/bo/PrepareOrderDataBo.java

@@ -0,0 +1,19 @@
+package org.dromara.external.api.zhongche.domain.bo;
+
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * 备货接口业务参数
+ */
+@Data
+public class PrepareOrderDataBo {
+
+    /** 中车电子商城备货单号 */
+    private String prepareOrderNo;
+
+    /** 已备货商品列表 */
+    private List<PrepareOrderGoods> prepareOrderGoods;
+
+}

+ 16 - 0
ruoyi-api/ruoyi-api-external/src/main/java/org/dromara/external/api/zhongche/domain/bo/PrepareOrderDetailReqBo.java

@@ -0,0 +1,16 @@
+package org.dromara.external.api.zhongche.domain.bo;
+
+import lombok.Data;
+
+/**
+ * 5.3.9 查询备货单详情 - 业务请求参数
+ */
+@Data
+public class PrepareOrderDetailReqBo {
+
+    /**
+     * 中车电子商城备货单号
+     */
+    private String prepareOrderNo;
+
+}

+ 19 - 0
ruoyi-api/ruoyi-api-external/src/main/java/org/dromara/external/api/zhongche/domain/bo/PrepareOrderGoods.java

@@ -0,0 +1,19 @@
+package org.dromara.external.api.zhongche.domain.bo;
+
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+/**
+ * 已备货商品
+ */
+@Data
+class PrepareOrderGoods {
+
+    /** 商品SKU */
+    private String goodsId;
+
+    /** 商品发货数量 */
+    private BigDecimal num;
+
+}

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

@@ -0,0 +1,12 @@
+package org.dromara.external.api.zhongche.domain.vo;
+
+import lombok.Data;
+
+/**
+ * author
+ * 时间:2026/2/5,19:40
+ */
+@Data
+public class CheckResultVo {
+    private String checkResult;
+}

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

@@ -1,10 +1,13 @@
 package org.dromara.product.api;
 
+import org.dromara.common.core.domain.zhongche.aftersale.vo.AfterSaleDetailVo;
 import org.dromara.common.core.domain.zhongche.domain.DeliveryTrack;
+import org.dromara.common.core.domain.zhongche.vo.OrderDetailVo;
 import org.dromara.common.core.domain.zhongche.vo.ZhongCheTrackVo;
 import org.dromara.product.api.domain.dto.OrderNoDto;
 import org.dromara.product.api.domain.dto.OrderNoticeDto;
 import org.dromara.product.api.domain.dto.OrderPushDto;
+import org.dromara.product.api.domain.dto.OrderReturnDto;
 
 import java.util.List;
 
@@ -46,7 +49,7 @@ public interface RemoteExternalOrderService {
     String getReturnOrderNo(String ZCorderNo);
 
     //取消订单
-    boolean cancelOrder(String orderNo ,String cancelReason);
+    OrderNoDto cancelOrder(String orderNo ,String cancelReason);
 
     //确认收获消息
     boolean confirmReceive(String orderNo , String outgoingCode);
@@ -54,4 +57,13 @@ public interface RemoteExternalOrderService {
     //取消售后订单
     boolean cancelReturnOrder(String afterSaleNo, String cancelReason);
 
+    OrderNoDto createZhongCheOrder(OrderDetailVo orderDetailVo);
+
+    OrderReturnDto createReturnOrder(AfterSaleDetailVo afterSaleDetailVo);
+
+    //退货发运消息
+    OrderReturnDto createOrderDeliver(String afterSaleNo, String expressCode, String expressCompanyName, String freight, String deliverTime);
+
+    //确认收获消息
+    OrderReturnDto confirmOrderDeliver(String afterSaleNo, String outgoingCode);
 }

+ 11 - 2
ruoyi-api/ruoyi-api-order/src/main/java/org/dromara/product/api/domain/dto/OrderNoDto.java

@@ -2,14 +2,23 @@ package org.dromara.product.api.domain.dto;
 
 import lombok.Data;
 
+import java.io.Serializable;
+
 /**
  * author
  * 时间:2026/1/8,9:18
  */
 @Data
-public class OrderNoDto {
+public class OrderNoDto implements Serializable {
     /**
      * 订单编号
      */
-    private String orderId;
+    private String orderNo;
+
+    private Boolean success;
+
+    /**
+     * 取消原因
+     */
+    private String cancelReason;
 }

+ 24 - 0
ruoyi-api/ruoyi-api-order/src/main/java/org/dromara/product/api/domain/dto/OrderReturnDto.java

@@ -0,0 +1,24 @@
+package org.dromara.product.api.domain.dto;
+
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * author
+ * 时间:2026/2/7,10:46
+ */
+@Data
+public class OrderReturnDto implements Serializable {
+    /**
+     * 订单编号
+     */
+    private String orderNo;
+
+    private Boolean success;
+
+    /**
+     * 取消原因
+     */
+    private String cancelReason;
+}

+ 5 - 0
ruoyi-api/ruoyi-api-product/src/main/java/org/dromara/product/api/RemoteProductService.java

@@ -69,6 +69,11 @@ public interface RemoteProductService {
      */
     List<ProductCategoryRemoteVo> queryList();
 
+    /**
+     * 根据ids获取品目列表
+     */
+    List<ProductCategoryRemoteVo> queryListByIds(List<Long> ids);
+
     StocksResultDto queryProductStock(Map<String, Integer> goods, String areaId);
 
     Map<String, Prices> queryProductPrice(List<String> goodsIds);

+ 4 - 0
ruoyi-api/ruoyi-api-product/src/main/java/org/dromara/product/api/domain/zhongche/dto/ProductAggregateDto.java

@@ -43,4 +43,8 @@ public class ProductAggregateDto implements Serializable {
     private BigDecimal tax;
 
     private String taxCode;
+
+    private String categoryId;
+
+    private String categoryName;
 }

+ 27 - 17
ruoyi-auth/src/main/java/org/dromara/auth/controller/Auth2Controller.java

@@ -3,16 +3,11 @@ package org.dromara.auth.controller;
 import cn.dev33.satoken.annotation.SaIgnore;
 import cn.dev33.satoken.stp.StpUtil;
 import cn.hutool.core.date.DateTime;
-import cn.hutool.core.date.DateUnit;
 import cn.hutool.core.date.DateUtil;
 import cn.hutool.core.util.ObjectUtil;
 import cn.hutool.crypto.SecureUtil;
-import cn.hutool.http.HttpRequest;
-import cn.hutool.http.HttpUtil;
-import cn.hutool.json.JSONUtil;
 import com.fasterxml.jackson.core.JsonProcessingException;
 import com.fasterxml.jackson.databind.ObjectMapper;
-import jakarta.annotation.PostConstruct;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.dromara.auth.domain.vo.LoginVo;
@@ -20,26 +15,18 @@ import org.dromara.auth.service.IAuthStrategy;
 import org.dromara.auth.util.SM2SignatureUtils;
 import org.dromara.auth.util.SignParamUtils;
 import org.dromara.auth.util.ZCApiUtils;
-import org.dromara.common.redis.utils.RedisUtils;
 import org.dromara.external.api.zhongche.domain.ZCR;
 import org.dromara.external.api.zhongche.domain.bo.UserLoginBo;
 import org.dromara.external.api.zhongche.domain.bo.ZCTokenBo;
 import org.dromara.external.api.zhongche.domain.vo.ZCLoginBusinessRespVo;
 import org.dromara.external.api.zhongzhi.domain.Result;
-import org.springframework.beans.factory.annotation.Value;
 import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
 
-import java.time.Duration;
-import java.time.format.DateTimeFormatter;
-import java.util.Base64;
-import java.util.Map;
 import java.util.Objects;
 
-import static org.dromara.common.core.constant.GlobalConstants.GLOBAL_REDIS_KEY;
-
 /**
  * @author
  * @date 2025/8/4 下午6:46
@@ -55,9 +42,11 @@ public class Auth2Controller {
 
     // ========== 读取yml中的真实公私钥(直接复制使用) ==========
 
-    private final String DEVELOPER_PRIVATE_KEY = "MFkwEwYHKoZIzj0CAQYIKoEcz1UBgi0DQgAE1YybOl0QDE2e9humlm4AgI3wJ1tI+UfVRZx8kk4hfPtZjorHN8Tjq/cP07t4Yscy+R9oFci8xw0VpBbcnlaq1w=="; // 电商提供的私钥
+    //电商私钥
+    private final static String DEVELOPER_PRIVATE_KEY = "MIGTAgEAMBMGByqGSM49AgEGCCqBHM9VAYItBHkwdwIBAQQgpQdXwMi21Mg1FhWad2AQLOwfNiDHgwhootau0YerQbagCgYIKoEcz1UBgi2hRANCAATVjJs6XRAMTZ72G6aWbgCAjfAnW0j5R9VFnHySTiF8+1mOisc3xOOr9w/Tu3hixzL5H2gVyLzHDRWkFtyeVqrX";
 
-    private final String DEVELOPER_PUBLIC_KEY = "MIGTAgEAMBMGByqGSM49AgEGCCqBHM9VAYItBHkwdwIBAQQgpQdXwMi21Mg1FhWad2AQLOwfNiDHgwhootau0YerQbagCgYIKoEcz1UBgi2hRANCAATVjJs6XRAMTZ72G6aWbgCAjfAnW0j5R9VFnHySTiF8+1mOisc3xOOr9w/Tu3hixzL5H2gVyLzHDRWkFtyeVqrX";  // 电商提供的公钥
+    //企采公钥
+    private final static String DEVELOPER_PUBLIC_KEY = "MFkwEwYHKoZIzj0CAQYIKoEcz1UBgi0DQgAEmUrB5ByAeb8jHayC7vbddqBFDIEsf1cpNO1qJttZ17xlDagVB/tBFasPr/x0+OWf2kimTKah2NGCYarymD1R5Q==";
 
 
     /**
@@ -145,7 +134,7 @@ public class Auth2Controller {
         }
 
         // ========== 步骤4:业务逻辑校验( ==========
-        //TODO 这里用的肖哥的逻辑 待完成吧
+        //这里用的肖哥的逻辑
         String username = userLoginBo.getUsername();
         String password = userLoginBo.getPassword();
         LoginVo loginVo = IAuthStrategy.getAccessToken(username, password);
@@ -174,7 +163,7 @@ public class Auth2Controller {
         }
 
         // ========== 步骤7:生成响应签名(正常响应必须返回 sign,复用工具类) ==========
-        ZCR successZcr = ZCR.ok(respData, ""); // 先填充 data,暂不填 sign
+        ZCR successZcr = ZCR.ok(respData, null); // 先填充 data,暂不填 sign
         String respSignContent = null;
         try {
             respSignContent = SignParamUtils.getSignContent(successZcr);
@@ -187,6 +176,27 @@ public class Auth2Controller {
         return ZCR.ok(respData, respSign);
 
     }
+    public static void main(String[] args) throws Exception {
+
+        // ===== 1️⃣ 模拟请求参数 =====
+        ZCTokenBo bo = new ZCTokenBo();
+        bo.setClientId("KFZiCAVUBUM");
+        bo.setData("eyJ1c2VybmFtZSI6InRlc3QiLCJwYXNzd29yZCI6IjEyMzQ1NiJ9"); // 随便一段Base64
+        bo.setTimestamp("20260209153000");
+        bo.setVersion("1.0.0");
+
+
+        String sign = SignParamUtils.generateRequestSign(bo, DEVELOPER_PRIVATE_KEY);
+        bo.setSign(sign);
+
+        System.out.println("生成的签名: " + sign);
+
+        // ===== 3️⃣ 验签 =====
+        boolean verifyResult = SignParamUtils.verifyRequestSign(bo,"MFkwEwYHKoZIzj0CAQYIKoEcz1UBgi0DQgAE1YybOl0QDE2e9humlm4AgI3wJ1tI+UfVRZx8kk4hfPtZjorHN8Tjq/cP07t4Yscy+R9oFci8xw0VpBbcnlaq1w==" );
+
+        System.out.println("验签结果: " + verifyResult);
+    }
+
 
 
 

+ 25 - 99
ruoyi-auth/src/main/java/org/dromara/auth/util/SM2SignatureUtils.java

@@ -1,128 +1,54 @@
 package org.dromara.auth.util;
 
-import org.bouncycastle.asn1.gm.GMNamedCurves;
-import org.bouncycastle.asn1.x9.X9ECParameters;
-import org.bouncycastle.crypto.AsymmetricCipherKeyPair;
-import org.bouncycastle.crypto.generators.ECKeyPairGenerator;
-import org.bouncycastle.crypto.params.ECDomainParameters;
-import org.bouncycastle.crypto.params.ECKeyGenerationParameters;
-import org.bouncycastle.crypto.params.ECPrivateKeyParameters;
-import org.bouncycastle.crypto.params.ECPublicKeyParameters;
-import org.bouncycastle.crypto.signers.SM2Signer;
-import org.bouncycastle.jce.provider.BouncyCastleProvider;
-import org.bouncycastle.util.encoders.Base64;
+import cn.hutool.crypto.SmUtil;
+import cn.hutool.crypto.asymmetric.SM2;
+import cn.hutool.core.codec.Base64;
 
 import java.nio.charset.StandardCharsets;
-import java.security.SecureRandom;
-import java.security.Security;
 
 /**
  * 国密 SM2withSM3 签名工具类
  * 注意:开发者私钥/公钥需由电商平台提供,此处提供生成示例(实际使用平台分配的密钥)
  */
 public class SM2SignatureUtils {
-    // 注册 BouncyCastle 安全提供者
-    static {
-        Security.addProvider(new BouncyCastleProvider());
-    }
 
-    // SM2 曲线参数(固定,国密标准)
-    private static final X9ECParameters SM2_CURVE_PARAMS = GMNamedCurves.getByName("sm2p256v1");
-    private static final ECDomainParameters EC_DOMAIN_PARAMETERS = new ECDomainParameters(
-            SM2_CURVE_PARAMS.getCurve(),
-            SM2_CURVE_PARAMS.getG(),
-            SM2_CURVE_PARAMS.getN(),
-            SM2_CURVE_PARAMS.getH()
-    );
 
     /**
-     * 生成 SM2 密钥对(仅用于测试,实际使用电商平台提供的开发者私钥/公钥)
-     * @return 密钥对(私钥在前,公钥在后,均为 Base64 编码)
+     * 签名(完全对齐对方逻辑)
      */
-    public static String[] generateSM2KeyPair() {
-        ECKeyPairGenerator generator = new ECKeyPairGenerator();
-        ECKeyGenerationParameters genParams = new ECKeyGenerationParameters(EC_DOMAIN_PARAMETERS, new SecureRandom());
-        generator.init(genParams);
-
-        AsymmetricCipherKeyPair keyPair = generator.generateKeyPair();
-        ECPrivateKeyParameters privateKeyParams = (ECPrivateKeyParameters) keyPair.getPrivate();
-        ECPublicKeyParameters publicKeyParams = (ECPublicKeyParameters) keyPair.getPublic();
-
-        // 转换为 Base64 编码字符串
-        String privateKeyBase64 = Base64.toBase64String(privateKeyParams.getD().toByteArray());
-        String publicKeyBase64 = Base64.toBase64String(publicKeyParams.getQ().getEncoded(false));
-
-        return new String[]{privateKeyBase64, publicKeyBase64};
-    }
+    public static String sign(String data, String privateKeyStr) {
 
-    /**
-     * SM2withSM3 签名(私钥签名,生成待提交的 sign 字段)
-     * @param content 待签名字符串(筛选排序后的 JSON 字符串)
-     * @param privateKeyBase64 开发者私钥(Base64 编码,平台提供)
-     * @return 签名结果(Base64 编码,可直接赋值给 sign 字段)
-     */
-    public static String sign(String content, String privateKeyBase64) {
-        if (content == null || content.trim().isEmpty() || privateKeyBase64 == null || privateKeyBase64.trim().isEmpty()) {
-            throw new IllegalArgumentException("待签名字符串和私钥不能为空");
-        }
+        // 1️⃣ 先做 SM3(得到16进制字符串)
+        String sm3Hex = SmUtil.sm3(data);
 
-        try {
-            // 1. 解码私钥
-            byte[] privateKeyBytes = Base64.decode(privateKeyBase64);
-            ECPrivateKeyParameters privateKeyParams = new ECPrivateKeyParameters(
-                    new java.math.BigInteger(1, privateKeyBytes),
-                    EC_DOMAIN_PARAMETERS
-            );
+        // 2️⃣ 转成 UTF-8 字节
+        byte[] hashBytes = sm3Hex.getBytes(StandardCharsets.UTF_8);
 
-            // 2. 初始化 SM2 签名器
-            SM2Signer signer = new SM2Signer();
-            signer.init(true, privateKeyParams);
+        // 3️⃣ 创建 SM2
+        SM2 sm2 = SmUtil.sm2(privateKeyStr, null);
 
-            // 3. 传入待签名内容(UTF-8 编码)
-            byte[] contentBytes = content.getBytes(StandardCharsets.UTF_8);
-            signer.update(contentBytes, 0, contentBytes.length);
+        // 4️⃣ 签名
+        byte[] signBytes = sm2.sign(hashBytes);
 
-            // 4. 生成签名并进行 Base64 编码
-            byte[] signatureBytes = signer.generateSignature();
-            return Base64.toBase64String(signatureBytes);
-        } catch (Exception e) {
-            throw new RuntimeException("SM2 签名失败:" + e.getMessage(), e);
-        }
+        // 5️⃣ Base64
+        return Base64.encode(signBytes);
     }
 
     /**
-     * SM2withSM3 验签(公钥校验,验证请求传入的 sign 是否合法)
-     * @param content 待签名字符串(与签名时一致的 JSON 字符串)
-     * @param signBase64 请求传入的 sign 字段(Base64 编码)
-     * @param publicKeyBase64 开发者公钥(Base64 编码,平台提供)
-     * @return true=验签通过,false=验签失败
+     * 验签(完全对齐对方逻辑)
      */
-    public static boolean verify(String content, String signBase64, String publicKeyBase64) {
-        if (content == null || content.trim().isEmpty() || signBase64 == null || signBase64.trim().isEmpty()
-                || publicKeyBase64 == null || publicKeyBase64.trim().isEmpty()) {
-            throw new IllegalArgumentException("待签名字符串、签名和公钥不能为空");
-        }
-
-        try {
-            // 1. 解码公钥和签名
-            byte[] publicKeyBytes = Base64.decode(publicKeyBase64);
-            byte[] signatureBytes = Base64.decode(signBase64);
+    public static boolean verify(String data, String signBase64, String publicKeyStr) {
 
-            // 2. 构建公钥参数
-            org.bouncycastle.math.ec.ECPoint ecPoint = SM2_CURVE_PARAMS.getCurve().decodePoint(publicKeyBytes);
-            ECPublicKeyParameters publicKeyParams = new ECPublicKeyParameters(ecPoint, EC_DOMAIN_PARAMETERS);
+        // 1️⃣ SM3
+        String sm3Hex = SmUtil.sm3(data);
 
-            // 3. 初始化 SM2 签名器
-            SM2Signer signer = new SM2Signer();
-            signer.init(false, publicKeyParams);
+        // 2️⃣ UTF-8字节
+        byte[] hashBytes = sm3Hex.getBytes(StandardCharsets.UTF_8);
 
-            // 4. 传入待签名内容并验签
-            byte[] contentBytes = content.getBytes(StandardCharsets.UTF_8);
-            signer.update(contentBytes, 0, contentBytes.length);
+        // 3️⃣ 创建 SM2
+        SM2 sm2 = SmUtil.sm2(null, publicKeyStr);
 
-            return signer.verifySignature(signatureBytes);
-        } catch (Exception e) {
-            throw new RuntimeException("SM2 验签失败:" + e.getMessage(), e);
-        }
+        // 4️⃣ 验签
+        return sm2.verify(hashBytes, Base64.decode(signBase64));
     }
 }

+ 6 - 0
ruoyi-auth/src/main/java/org/dromara/auth/util/SignParamUtils.java

@@ -6,6 +6,7 @@ import com.fasterxml.jackson.databind.ObjectMapper;
 import org.dromara.external.api.zhongche.domain.bo.ZCTokenBo;
 
 import java.lang.reflect.Field;
+import java.lang.reflect.Modifier;
 import java.util.Comparator;
 import java.util.HashMap;
 import java.util.Map;
@@ -20,6 +21,7 @@ public class SignParamUtils {
      */
     private static final ObjectMapper OBJECT_MAPPER = new ObjectMapper();
 
+
     /**
      * 处理签名参数(核心方法)
      * @param paramObj 请求/响应参数实体(如 ZCTokenBo、ZCR)
@@ -38,6 +40,9 @@ public class SignParamUtils {
             field.setAccessible(true); // 允许访问私有字段
             String fieldName = field.getName();
             Object fieldValue = null;
+            if (Modifier.isStatic(field.getModifiers())) {
+                continue;
+            }
 
             try {
                 fieldValue = field.get(paramObj);
@@ -84,6 +89,7 @@ public class SignParamUtils {
     public static String generateRequestSign(ZCTokenBo zcTokenBo, String privateKeyBase64) throws JsonProcessingException {
         // 生成待签名字符串
         String signContent = getSignContent(zcTokenBo);
+        System.out.println("待签名字符串:"+signContent);
         // SM2 签名并返回
         return SM2SignatureUtils.sign(signContent, privateKeyBase64);
     }

+ 2 - 1
ruoyi-auth/src/main/java/org/dromara/auth/util/ZCApiUtils.java

@@ -3,6 +3,7 @@ package org.dromara.auth.util;
 import com.fasterxml.jackson.core.JsonProcessingException;
 import com.fasterxml.jackson.databind.ObjectMapper;
 
+import java.nio.charset.StandardCharsets;
 import java.util.Base64;
 
 /**
@@ -36,7 +37,7 @@ public class ZCApiUtils {
         if (rawStr == null || rawStr.trim().isEmpty()) {
             throw new IllegalArgumentException("原始字符串不能为空");
         }
-        byte[] encodeBytes = rawStr.getBytes();
+        byte[] encodeBytes = rawStr.getBytes(StandardCharsets.UTF_8);
         return Base64.getEncoder().encodeToString(encodeBytes);
     }
 

+ 4 - 2
ruoyi-api/ruoyi-api-external/src/main/java/org/dromara/external/api/zhongche/domain/aftersale/bo/AfterSaleConfirmBo.java → ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/zhongche/aftersale/bo/AfterSaleConfirmBo.java

@@ -1,9 +1,11 @@
-package org.dromara.external.api.zhongche.domain.aftersale.bo;
+package org.dromara.common.core.domain.zhongche.aftersale.bo;
 
 import lombok.AllArgsConstructor;
 import lombok.Data;
 import lombok.NoArgsConstructor;
 
+import java.io.Serializable;
+
 /**
  * 接受售后的业务请求参数
  * 对应接口文档 5.4.2.4.1 业务参数
@@ -12,7 +14,7 @@ import lombok.NoArgsConstructor;
 @Data
 @NoArgsConstructor
 @AllArgsConstructor
-public class AfterSaleConfirmBo {
+public class AfterSaleConfirmBo implements Serializable {
     /**
      * 中车电子商城售后单号
      * 必填,长度20

+ 4 - 3
ruoyi-api/ruoyi-api-external/src/main/java/org/dromara/external/api/zhongche/domain/aftersale/bo/AfterSaleDeliverGoodsBo.java → ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/zhongche/aftersale/bo/AfterSaleDeliverGoodsBo.java

@@ -1,10 +1,11 @@
-package org.dromara.external.api.zhongche.domain.aftersale.bo;
+package org.dromara.common.core.domain.zhongche.aftersale.bo;
 
 import lombok.AllArgsConstructor;
 import lombok.Data;
 import lombok.NoArgsConstructor;
-import org.dromara.external.api.zhongche.domain.aftersale.domain.AfterSaleDeliverGoodsItem;
+import org.dromara.common.core.domain.zhongche.aftersale.domain.AfterSaleDeliverGoodsItem;
 
+import java.io.Serializable;
 import java.util.List;
 
 /**
@@ -15,7 +16,7 @@ import java.util.List;
 @Data
 @NoArgsConstructor
 @AllArgsConstructor
-public class AfterSaleDeliverGoodsBo {
+public class AfterSaleDeliverGoodsBo implements Serializable {
     /**
      * 中车电子商城售后单号
      * 必填,长度20

+ 4 - 2
ruoyi-api/ruoyi-api-external/src/main/java/org/dromara/external/api/zhongche/domain/aftersale/bo/AfterSaleDetailBo.java → ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/zhongche/aftersale/bo/AfterSaleDetailBo.java

@@ -1,9 +1,11 @@
-package org.dromara.external.api.zhongche.domain.aftersale.bo;
+package org.dromara.common.core.domain.zhongche.aftersale.bo;
 
 import lombok.AllArgsConstructor;
 import lombok.Data;
 import lombok.NoArgsConstructor;
 
+import java.io.Serializable;
+
 /**
  * 查询售后单详情的业务请求参数
  * 对应 5.4.1.4.1 业务参数
@@ -11,7 +13,7 @@ import lombok.NoArgsConstructor;
 @Data
 @NoArgsConstructor
 @AllArgsConstructor
-public class AfterSaleDetailBo {
+public class AfterSaleDetailBo implements Serializable {
     /**
      * 供应商售后单号
      * 必填

+ 7 - 5
ruoyi-api/ruoyi-api-external/src/main/java/org/dromara/external/api/zhongche/domain/aftersale/bo/AfterSaleOfflineCreateBo.java → ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/zhongche/aftersale/bo/AfterSaleOfflineCreateBo.java

@@ -1,16 +1,18 @@
-package org.dromara.external.api.zhongche.domain.aftersale.bo;
+package org.dromara.common.core.domain.zhongche.aftersale.bo;
 
 import lombok.AllArgsConstructor;
 import lombok.Data;
 import lombok.NoArgsConstructor;
-import org.dromara.external.api.zhongche.domain.aftersale.domain.AfterSaleGoods;
-import org.dromara.external.api.zhongche.domain.aftersale.domain.AfterSalePick;
-import org.dromara.external.api.zhongche.domain.aftersale.domain.AfterSaleReturn;
+import org.dromara.common.core.domain.zhongche.aftersale.domain.AfterSaleGoods;
+import org.dromara.common.core.domain.zhongche.aftersale.domain.AfterSalePick;
+import org.dromara.common.core.domain.zhongche.aftersale.domain.AfterSaleReturn;
+
+import java.io.Serializable;
 
 @Data
 @NoArgsConstructor
 @AllArgsConstructor
-public class AfterSaleOfflineCreateBo {
+public class AfterSaleOfflineCreateBo implements Serializable {
     /**
      * 申请售后的供应商订单号
      * 必填,长度20

+ 4 - 2
ruoyi-api/ruoyi-api-external/src/main/java/org/dromara/external/api/zhongche/domain/aftersale/bo/AfterSalePendingListBo.java → ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/zhongche/aftersale/bo/AfterSalePendingListBo.java

@@ -1,9 +1,11 @@
-package org.dromara.external.api.zhongche.domain.aftersale.bo;
+package org.dromara.common.core.domain.zhongche.aftersale.bo;
 
 import lombok.AllArgsConstructor;
 import lombok.Data;
 import lombok.NoArgsConstructor;
 
+import java.io.Serializable;
+
 /**
  * 查询待处理售后单列表的请求参数
  * 对应接口文档 5.4.6.4.1 业务参数
@@ -11,7 +13,7 @@ import lombok.NoArgsConstructor;
 @Data
 @NoArgsConstructor
 @AllArgsConstructor
-public class AfterSalePendingListBo {
+public class AfterSalePendingListBo implements Serializable {
     /**
      * 当前页
      * 必填,长度11

+ 4 - 2
ruoyi-api/ruoyi-api-external/src/main/java/org/dromara/external/api/zhongche/domain/aftersale/bo/AfterSaleQueryOutgoingBo.java → ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/zhongche/aftersale/bo/AfterSaleQueryOutgoingBo.java

@@ -1,13 +1,15 @@
-package org.dromara.external.api.zhongche.domain.aftersale.bo;
+package org.dromara.common.core.domain.zhongche.aftersale.bo;
 
 import lombok.AllArgsConstructor;
 import lombok.Data;
 import lombok.NoArgsConstructor;
 
+import java.io.Serializable;
+
 @Data
 @NoArgsConstructor
 @AllArgsConstructor
-public class AfterSaleQueryOutgoingBo {
+public class AfterSaleQueryOutgoingBo implements Serializable {
     /**
      * 中车电子商城售后单号
      * 必填,长度20

+ 4 - 2
ruoyi-api/ruoyi-api-external/src/main/java/org/dromara/external/api/zhongche/domain/aftersale/bo/AfterSaleRefundBo.java → ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/zhongche/aftersale/bo/AfterSaleRefundBo.java

@@ -1,9 +1,11 @@
-package org.dromara.external.api.zhongche.domain.aftersale.bo;
+package org.dromara.common.core.domain.zhongche.aftersale.bo;
 
 import lombok.AllArgsConstructor;
 import lombok.Data;
 import lombok.NoArgsConstructor;
 
+import java.io.Serializable;
+
 /**
  * 确认退款的请求参数
  * 对应接口文档 5.4.9.4.1 业务参数
@@ -11,7 +13,7 @@ import lombok.NoArgsConstructor;
 @Data
 @NoArgsConstructor
 @AllArgsConstructor
-public class AfterSaleRefundBo {
+public class AfterSaleRefundBo implements Serializable {
     /**
      * 中车电子商城售后单号
      * 必填,长度20

+ 4 - 2
ruoyi-api/ruoyi-api-external/src/main/java/org/dromara/external/api/zhongche/domain/aftersale/bo/AfterSaleRejectBo.java → ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/zhongche/aftersale/bo/AfterSaleRejectBo.java

@@ -1,13 +1,15 @@
-package org.dromara.external.api.zhongche.domain.aftersale.bo;
+package org.dromara.common.core.domain.zhongche.aftersale.bo;
 
 import lombok.AllArgsConstructor;
 import lombok.Data;
 import lombok.NoArgsConstructor;
 
+import java.io.Serializable;
+
 @Data
 @NoArgsConstructor
 @AllArgsConstructor
-public class AfterSaleRejectBo {
+public class AfterSaleRejectBo implements Serializable {
     /**
      * 中车电子商城售后单号
      * 必填,长度20

+ 4 - 2
ruoyi-api/ruoyi-api-external/src/main/java/org/dromara/external/api/zhongche/domain/aftersale/bo/AfterSaleReturnReceivedBo.java → ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/zhongche/aftersale/bo/AfterSaleReturnReceivedBo.java

@@ -1,9 +1,11 @@
-package org.dromara.external.api.zhongche.domain.aftersale.bo;
+package org.dromara.common.core.domain.zhongche.aftersale.bo;
 
 import lombok.AllArgsConstructor;
 import lombok.Data;
 import lombok.NoArgsConstructor;
 
+import java.io.Serializable;
+
 /**
  * 确认收到退货的业务请求参数
  * 对应接口文档 5.4.4.4.1 业务参数
@@ -11,7 +13,7 @@ import lombok.NoArgsConstructor;
 @Data
 @NoArgsConstructor
 @AllArgsConstructor
-public class AfterSaleReturnReceivedBo {
+public class AfterSaleReturnReceivedBo implements Serializable {
     /**
      * 中车电子商城售后单号
      * 必填,长度20

+ 4 - 2
ruoyi-api/ruoyi-api-external/src/main/java/org/dromara/external/api/zhongche/domain/aftersale/domain/AfterSaleDeliverGoodsItem.java → ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/zhongche/aftersale/domain/AfterSaleDeliverGoodsItem.java

@@ -1,8 +1,10 @@
-package org.dromara.external.api.zhongche.domain.aftersale.domain;
+package org.dromara.common.core.domain.zhongche.aftersale.domain;
 
 import lombok.AllArgsConstructor;
 import lombok.Data;
 import lombok.NoArgsConstructor;
+
+import java.io.Serializable;
 import java.math.BigDecimal;
 
 
@@ -13,7 +15,7 @@ import java.math.BigDecimal;
 @Data
 @NoArgsConstructor
 @AllArgsConstructor
-public class AfterSaleDeliverGoodsItem {
+public class AfterSaleDeliverGoodsItem implements Serializable {
     /**
      * 商品sku
      * 必填,长度200

+ 3 - 2
ruoyi-api/ruoyi-api-external/src/main/java/org/dromara/external/api/zhongche/domain/aftersale/domain/AfterSaleGoods.java → ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/zhongche/aftersale/domain/AfterSaleGoods.java

@@ -1,9 +1,10 @@
-package org.dromara.external.api.zhongche.domain.aftersale.domain;
+package org.dromara.common.core.domain.zhongche.aftersale.domain;
 
 import lombok.AllArgsConstructor;
 import lombok.Data;
 import lombok.NoArgsConstructor;
 
+import java.io.Serializable;
 import java.math.BigDecimal;
 
 /**
@@ -15,7 +16,7 @@ import java.math.BigDecimal;
 @Data
 @NoArgsConstructor
 @AllArgsConstructor
-public class AfterSaleGoods {
+public class AfterSaleGoods implements Serializable {
     /**
      * 商品sku
      * 必填,长度200

+ 3 - 2
ruoyi-api/ruoyi-api-external/src/main/java/org/dromara/external/api/zhongche/domain/aftersale/domain/AfterSaleOutgoingItem.java → ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/zhongche/aftersale/domain/AfterSaleOutgoingItem.java

@@ -1,15 +1,16 @@
-package org.dromara.external.api.zhongche.domain.aftersale.domain;
+package org.dromara.common.core.domain.zhongche.aftersale.domain;
 
 import lombok.AllArgsConstructor;
 import lombok.Data;
 import lombok.NoArgsConstructor;
 
+import java.io.Serializable;
 import java.util.List;
 
 @Data
 @NoArgsConstructor
 @AllArgsConstructor
-public class AfterSaleOutgoingItem {
+public class AfterSaleOutgoingItem implements Serializable {
     /**
      * 中车电子商城售后单号
      * 必填,长度20

+ 4 - 2
ruoyi-api/ruoyi-api-external/src/main/java/org/dromara/external/api/zhongche/domain/aftersale/domain/AfterSalePick.java → ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/zhongche/aftersale/domain/AfterSalePick.java

@@ -1,9 +1,11 @@
-package org.dromara.external.api.zhongche.domain.aftersale.domain;
+package org.dromara.common.core.domain.zhongche.aftersale.domain;
 
 import lombok.AllArgsConstructor;
 import lombok.Data;
 import lombok.NoArgsConstructor;
 
+import java.io.Serializable;
+
 /**
  * 售后地址信息(包含取件、返件)
  * 对应接口文档 5.4.1.5.5 售后取件信息、5.4.1.5.6 售后返件信息
@@ -13,7 +15,7 @@ import lombok.NoArgsConstructor;
 @Data
 @NoArgsConstructor
 @AllArgsConstructor
-public class AfterSalePick {
+public class AfterSalePick implements Serializable {
     /**
      * 取件方式
      * 仅取件信息有值;必填,长度3;枚举值:1上门取件 2客户送货 3客户发货

+ 3 - 2
ruoyi-api/ruoyi-api-external/src/main/java/org/dromara/external/api/zhongche/domain/aftersale/domain/AfterSaleReason.java → ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/zhongche/aftersale/domain/AfterSaleReason.java

@@ -1,9 +1,10 @@
-package org.dromara.external.api.zhongche.domain.aftersale.domain;
+package org.dromara.common.core.domain.zhongche.aftersale.domain;
 
 import lombok.AllArgsConstructor;
 import lombok.Data;
 import lombok.NoArgsConstructor;
 
+import java.io.Serializable;
 import java.util.List;
 
 /**
@@ -15,7 +16,7 @@ import java.util.List;
 @Data
 @NoArgsConstructor
 @AllArgsConstructor
-public class AfterSaleReason {
+public class AfterSaleReason implements Serializable {
     /**
      * 售后原因名称
      * 必填,长度200

+ 4 - 2
ruoyi-api/ruoyi-api-external/src/main/java/org/dromara/external/api/zhongche/domain/aftersale/domain/AfterSaleRecords.java → ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/zhongche/aftersale/domain/AfterSaleRecords.java

@@ -1,9 +1,11 @@
-package org.dromara.external.api.zhongche.domain.aftersale.domain;
+package org.dromara.common.core.domain.zhongche.aftersale.domain;
 
 import lombok.AllArgsConstructor;
 import lombok.Data;
 import lombok.NoArgsConstructor;
 
+import java.io.Serializable;
+
 /**
  * 待处理售后单列表项
  * 对应接口文档 5.4.6.5.2 售后单列表-records
@@ -11,7 +13,7 @@ import lombok.NoArgsConstructor;
 @Data
 @NoArgsConstructor
 @AllArgsConstructor
-public class AfterSaleRecords {
+public class AfterSaleRecords implements Serializable {
     /**
      * 中车电子商城售后单号
      * 必填,长度20

+ 4 - 2
ruoyi-api/ruoyi-api-external/src/main/java/org/dromara/external/api/zhongche/domain/aftersale/domain/AfterSaleReturn.java → ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/zhongche/aftersale/domain/AfterSaleReturn.java

@@ -1,9 +1,11 @@
-package org.dromara.external.api.zhongche.domain.aftersale.domain;
+package org.dromara.common.core.domain.zhongche.aftersale.domain;
 
 import lombok.AllArgsConstructor;
 import lombok.Data;
 import lombok.NoArgsConstructor;
 
+import java.io.Serializable;
+
 /**
  * 售后返件信息
  * 对应接口文档 5.4.1.5.6 售后返件信息-afterSaleReturn
@@ -11,7 +13,7 @@ import lombok.NoArgsConstructor;
 @Data
 @NoArgsConstructor
 @AllArgsConstructor
-public class AfterSaleReturn {
+public class AfterSaleReturn implements Serializable {
     /**
      * 联系人
      * 必填,长度200

+ 4 - 2
ruoyi-api/ruoyi-api-external/src/main/java/org/dromara/external/api/zhongche/domain/aftersale/domain/ImageList.java → ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/zhongche/aftersale/domain/ImageList.java

@@ -1,14 +1,16 @@
-package org.dromara.external.api.zhongche.domain.aftersale.domain;
+package org.dromara.common.core.domain.zhongche.aftersale.domain;
 
 import lombok.AllArgsConstructor;
 import lombok.Data;
 import lombok.NoArgsConstructor;
 
+import java.io.Serializable;
+
 // 1.2.1 售后原因图片 (imageList)
 @Data
 @NoArgsConstructor
 @AllArgsConstructor
-public class ImageList {
+public class ImageList implements Serializable {
     /**
      * 图片地址
      * 必填,长度128

+ 3 - 2
ruoyi-api/ruoyi-api-external/src/main/java/org/dromara/external/api/zhongche/domain/aftersale/domain/OutgoingGoodsItem.java → ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/zhongche/aftersale/domain/OutgoingGoodsItem.java

@@ -1,9 +1,10 @@
-package org.dromara.external.api.zhongche.domain.aftersale.domain;
+package org.dromara.common.core.domain.zhongche.aftersale.domain;
 
 import lombok.AllArgsConstructor;
 import lombok.Data;
 import lombok.NoArgsConstructor;
 
+import java.io.Serializable;
 import java.math.BigDecimal;
 
 /**
@@ -13,7 +14,7 @@ import java.math.BigDecimal;
 @Data
 @NoArgsConstructor
 @AllArgsConstructor
-public class OutgoingGoodsItem {
+public class OutgoingGoodsItem implements Serializable {
     /**
      * 商品sku
      * 必填,长度200

+ 4 - 2
ruoyi-api/ruoyi-api-external/src/main/java/org/dromara/external/api/zhongche/domain/aftersale/vo/AfterSaleDeliverGoodsVo.java → ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/zhongche/aftersale/vo/AfterSaleDeliverGoodsVo.java

@@ -1,13 +1,15 @@
-package org.dromara.external.api.zhongche.domain.aftersale.vo;
+package org.dromara.common.core.domain.zhongche.aftersale.vo;
 
 import lombok.AllArgsConstructor;
 import lombok.Data;
 import lombok.NoArgsConstructor;
 
+import java.io.Serializable;
+
 @Data
 @NoArgsConstructor
 @AllArgsConstructor
-public class AfterSaleDeliverGoodsVo {
+public class AfterSaleDeliverGoodsVo implements Serializable {
     /**
      * 发货单编号
      * 必填,长度20

+ 7 - 6
ruoyi-api/ruoyi-api-external/src/main/java/org/dromara/external/api/zhongche/domain/aftersale/vo/AfterSaleDetailVo.java → ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/zhongche/aftersale/vo/AfterSaleDetailVo.java

@@ -1,12 +1,13 @@
-package org.dromara.external.api.zhongche.domain.aftersale.vo;
+package org.dromara.common.core.domain.zhongche.aftersale.vo;
 import lombok.AllArgsConstructor;
 import lombok.Data;
 import lombok.NoArgsConstructor;
-import org.dromara.external.api.zhongche.domain.aftersale.domain.AfterSaleGoods;
-import org.dromara.external.api.zhongche.domain.aftersale.domain.AfterSalePick;
-import org.dromara.external.api.zhongche.domain.aftersale.domain.AfterSaleReason;
-import org.dromara.external.api.zhongche.domain.aftersale.domain.AfterSaleReturn;
+import org.dromara.common.core.domain.zhongche.aftersale.domain.AfterSaleGoods;
+import org.dromara.common.core.domain.zhongche.aftersale.domain.AfterSalePick;
+import org.dromara.common.core.domain.zhongche.aftersale.domain.AfterSaleReason;
+import org.dromara.common.core.domain.zhongche.aftersale.domain.AfterSaleReturn;
 
+import java.io.Serializable;
 import java.math.BigDecimal;
 
 /**
@@ -16,7 +17,7 @@ import java.math.BigDecimal;
 @Data
 @NoArgsConstructor
 @AllArgsConstructor
-public class AfterSaleDetailVo {
+public class AfterSaleDetailVo  implements Serializable {
     /**
      * 中车电子商城售后单号
      * 必填,长度20

+ 4 - 2
ruoyi-api/ruoyi-api-external/src/main/java/org/dromara/external/api/zhongche/domain/aftersale/vo/AfterSaleOfflineCreateVo.java → ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/zhongche/aftersale/vo/AfterSaleOfflineCreateVo.java

@@ -1,13 +1,15 @@
-package org.dromara.external.api.zhongche.domain.aftersale.vo;
+package org.dromara.common.core.domain.zhongche.aftersale.vo;
 
 import lombok.AllArgsConstructor;
 import lombok.Data;
 import lombok.NoArgsConstructor;
 
+import java.io.Serializable;
+
 @Data
 @NoArgsConstructor
 @AllArgsConstructor
-public class AfterSaleOfflineCreateVo {
+public class AfterSaleOfflineCreateVo  implements Serializable {
     /**
      * 中车电子商城售后单号
      * 必填,长度20

+ 4 - 3
ruoyi-api/ruoyi-api-external/src/main/java/org/dromara/external/api/zhongche/domain/aftersale/vo/AfterSalePendingListVo.java → ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/zhongche/aftersale/vo/AfterSalePendingListVo.java

@@ -1,10 +1,11 @@
-package org.dromara.external.api.zhongche.domain.aftersale.vo;
+package org.dromara.common.core.domain.zhongche.aftersale.vo;
 
 import lombok.AllArgsConstructor;
 import lombok.Data;
 import lombok.NoArgsConstructor;
-import org.dromara.external.api.zhongche.domain.aftersale.domain.AfterSaleRecords;
+import org.dromara.common.core.domain.zhongche.aftersale.domain.AfterSaleRecords;
 
+import java.io.Serializable;
 import java.util.List;
 
 /**
@@ -14,7 +15,7 @@ import java.util.List;
 @Data
 @NoArgsConstructor
 @AllArgsConstructor
-public class AfterSalePendingListVo {
+public class AfterSalePendingListVo implements Serializable{
     /**
      * 当前页
      * 必填

+ 4 - 3
ruoyi-api/ruoyi-api-external/src/main/java/org/dromara/external/api/zhongche/domain/aftersale/vo/AfterSaleQueryOutgoingVo.java → ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/zhongche/aftersale/vo/AfterSaleQueryOutgoingVo.java

@@ -1,16 +1,17 @@
-package org.dromara.external.api.zhongche.domain.aftersale.vo;
+package org.dromara.common.core.domain.zhongche.aftersale.vo;
 
 import lombok.AllArgsConstructor;
 import lombok.Data;
 import lombok.NoArgsConstructor;
-import org.dromara.external.api.zhongche.domain.aftersale.domain.AfterSaleOutgoingItem;
+import org.dromara.common.core.domain.zhongche.aftersale.domain.AfterSaleOutgoingItem;
 
+import java.io.Serializable;
 import java.util.List;
 
 @Data
 @NoArgsConstructor
 @AllArgsConstructor
-public class AfterSaleQueryOutgoingVo {
+public class AfterSaleQueryOutgoingVo implements Serializable {
     /**
      * 发货单列表
      * 必填;一个售后单可能对应多个发货单(多次发货)

+ 4 - 2
ruoyi-api/ruoyi-api-external/src/main/java/org/dromara/external/api/zhongche/domain/OrderFileItem.java → ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/zhongche/domain/OrderFileItem.java

@@ -1,15 +1,17 @@
-package org.dromara.external.api.zhongche.domain;
+package org.dromara.common.core.domain.zhongche.domain;
 
 import lombok.AllArgsConstructor;
 import lombok.Data;
 import lombok.NoArgsConstructor;
 
+import java.io.Serializable;
+
 
 // 1.2.1 订单附件
 @Data
 @NoArgsConstructor
 @AllArgsConstructor
-public class OrderFileItem {
+public class OrderFileItem implements Serializable {
     /**
      * 附件名称
      */

+ 3 - 2
ruoyi-api/ruoyi-api-external/src/main/java/org/dromara/external/api/zhongche/domain/OrderGoodsItem.java → ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/zhongche/domain/OrderGoodsItem.java

@@ -1,16 +1,17 @@
-package org.dromara.external.api.zhongche.domain;
+package org.dromara.common.core.domain.zhongche.domain;
 
 import lombok.AllArgsConstructor;
 import lombok.Data;
 import lombok.NoArgsConstructor;
 
+import java.io.Serializable;
 import java.math.BigDecimal;
 
 // 1.2.3 订单商品 (orderGoods)
 @Data
 @NoArgsConstructor
 @AllArgsConstructor
-public class OrderGoodsItem {
+public class OrderGoodsItem implements Serializable {
     /**
      * 商品sku
      */

+ 4 - 2
ruoyi-api/ruoyi-api-external/src/main/java/org/dromara/external/api/zhongche/domain/OrderInvoice.java → ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/zhongche/domain/ZhongCheOrderInvoice.java

@@ -1,14 +1,16 @@
-package org.dromara.external.api.zhongche.domain;
+package org.dromara.common.core.domain.zhongche.domain;
 
 import lombok.AllArgsConstructor;
 import lombok.Data;
 import lombok.NoArgsConstructor;
 
+import java.io.Serializable;
+
 //1.2.2 订单发票 (orderInvoice)
 @Data
 @NoArgsConstructor
 @AllArgsConstructor
-public class OrderInvoice {
+public class ZhongCheOrderInvoice implements Serializable {
     /**
      * 发票类型(2增值税专用发票;3 电子票)
      */

+ 42 - 0
ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/zhongche/domain/ZhongChePrepareOrderGoods.java

@@ -0,0 +1,42 @@
+package org.dromara.common.core.domain.zhongche.domain;
+
+import lombok.Data;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+
+/**
+ * 5.3.9 备货单商品明细
+ */
+@Data
+public class ZhongChePrepareOrderGoods implements Serializable {
+
+    /**
+     * 商品SKU
+     */
+    private String goodsId;
+
+    /**
+     * 商品数量
+     * 最多精确到小数点后4位
+     */
+    private BigDecimal num;
+
+    /**
+     * 商品价格(单位:元,精确到分)
+     */
+    private BigDecimal price;
+
+    /**
+     * 商品总金额
+     * num * price
+     * 四舍五入,精确到分
+     */
+    private BigDecimal subAmount;
+
+    /**
+     * 备货期
+     */
+    private Integer prepareDay;
+
+}

+ 7 - 6
ruoyi-api/ruoyi-api-external/src/main/java/org/dromara/external/api/zhongche/domain/vo/OrderDetailVo.java → ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/zhongche/vo/OrderDetailVo.java

@@ -1,19 +1,20 @@
-package org.dromara.external.api.zhongche.domain.vo;
+package org.dromara.common.core.domain.zhongche.vo;
 
 import lombok.AllArgsConstructor;
 import lombok.Data;
 import lombok.NoArgsConstructor;
-import org.dromara.external.api.zhongche.domain.OrderFileItem;
-import org.dromara.external.api.zhongche.domain.OrderGoodsItem;
-import org.dromara.external.api.zhongche.domain.OrderInvoice;
+import org.dromara.common.core.domain.zhongche.domain.OrderFileItem;
+import org.dromara.common.core.domain.zhongche.domain.OrderGoodsItem;
+import org.dromara.common.core.domain.zhongche.domain.ZhongCheOrderInvoice;
 
+import java.io.Serializable;
 import java.math.BigDecimal;
 import java.util.List;
 
 @Data
 @NoArgsConstructor
 @AllArgsConstructor
-public class OrderDetailVo {
+public class OrderDetailVo implements Serializable {
     /**
      * 中车电子商城订单号
      */
@@ -117,7 +118,7 @@ public class OrderDetailVo {
     /**
      * 订单发票信息
      */
-    private OrderInvoice orderInvoice;
+    private ZhongCheOrderInvoice orderInvoice;
     /**
      * 是否需要发货凭证;0否 1货物照片
      */

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

@@ -0,0 +1,87 @@
+package org.dromara.common.core.domain.zhongche.vo;
+
+import lombok.Data;
+import org.dromara.common.core.domain.zhongche.domain.ZhongChePrepareOrderGoods;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.util.List;
+
+/**
+ * 5.3.9 查询备货单详情 - 业务响应参数
+ */
+@Data
+public class PrepareOrderDetailRespVo implements Serializable {
+
+    /**
+     * 中车电子商城备货单号
+     */
+    private String prepareOrderNo;
+
+    /**
+     * 采购平台备货单号
+     */
+    private String purchaserPrepareOrderNo;
+
+    /**
+     * 备货单状态
+     * 0草稿
+     * 1待备货
+     * 2备货完成
+     * 3已取消
+     */
+    private String prepareOrderStatus;
+
+    /**
+     * 备货单金额(单位:元,精确到分)
+     */
+    private BigDecimal prepareOrderAmount;
+
+    /**
+     * 备货单商品列表
+     */
+    private List<ZhongChePrepareOrderGoods> prepareOrderGoods;
+
+    /**
+     * 备货计划名称
+     */
+    private String name;
+
+    /**
+     * 备注
+     */
+    private String memo;
+
+    /**
+     * 备货单创建时间
+     * 格式:yyyy-MM-dd HH:mm:ss
+     */
+    private String prepareOrderTime;
+
+    /**
+     * 备货人名称
+     */
+    private String buyer;
+
+    /**
+     * 备货人电话
+     */
+    private String buyerMobile;
+
+    /**
+     * 采购单位
+     */
+    private String purchaserName;
+
+    /**
+     * 采购部门
+     * 格式:山西省烟草公司-省公司总部-省公司-规范办
+     */
+    private String purchaserDeptName;
+
+    /**
+     * 附件
+     */
+    private String attach;
+
+}

+ 2 - 1
ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/zhongche/vo/ZhongCheTrackVo.java

@@ -5,12 +5,13 @@ import lombok.Data;
 import lombok.NoArgsConstructor;
 import org.dromara.common.core.domain.zhongche.domain.DeliveryTrack;
 
+import java.io.Serializable;
 import java.util.List;
 
 @Data
 @NoArgsConstructor
 @AllArgsConstructor
-public class ZhongCheTrackVo {
+public class ZhongCheTrackVo implements Serializable {
     /**
      * 物流单号
      * 非必填

+ 6 - 0
ruoyi-common/ruoyi-common-satoken/src/main/resources/common-satoken.yml

@@ -11,3 +11,9 @@ sa-token:
   is-read-cookie: false
   # token前缀
   token-prefix: "Bearer"
+  cookie:
+    domain: .xiaoluwebsite.xyz
+    path: /
+    secure: true
+    httpOnly: false
+    sameSite: None

+ 27 - 0
ruoyi-gateway/src/main/java/org/dromara/gateway/filter/GlobalCorsConfig.java

@@ -0,0 +1,27 @@
+package org.dromara.gateway.filter;
+
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.web.cors.CorsConfiguration;
+import org.springframework.web.cors.reactive.CorsWebFilter;
+import org.springframework.web.cors.reactive.UrlBasedCorsConfigurationSource;
+
+@Configuration
+public class GlobalCorsConfig {
+
+    @Bean
+    public CorsWebFilter corsWebFilter() {
+        CorsConfiguration config = new CorsConfiguration();
+        config.setAllowCredentials(true); // 【关键】
+
+        // 添加允许的源 (生产环境建议动态获取或配置列表)
+        config.addAllowedOriginPattern("https://*.xiaoluwebsite.xyz");
+        config.addAllowedHeader("*");
+        config.addAllowedMethod("*");
+
+        UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
+        source.registerCorsConfiguration("/**", config);
+
+        return new CorsWebFilter(source);
+    }
+}

+ 106 - 0
ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/controller/PartnerPreparedProductThirdController.java

@@ -0,0 +1,106 @@
+package org.dromara.customer.controller;
+
+import java.util.List;
+
+import lombok.RequiredArgsConstructor;
+import jakarta.servlet.http.HttpServletResponse;
+import jakarta.validation.constraints.*;
+import cn.dev33.satoken.annotation.SaCheckPermission;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.validation.annotation.Validated;
+import org.dromara.common.idempotent.annotation.RepeatSubmit;
+import org.dromara.common.log.annotation.Log;
+import org.dromara.common.web.core.BaseController;
+import org.dromara.common.mybatis.core.page.PageQuery;
+import org.dromara.common.core.domain.R;
+import org.dromara.common.core.validate.AddGroup;
+import org.dromara.common.core.validate.EditGroup;
+import org.dromara.common.log.enums.BusinessType;
+import org.dromara.common.excel.utils.ExcelUtil;
+import org.dromara.customer.domain.vo.PartnerPreparedProductThirdVo;
+import org.dromara.customer.domain.bo.PartnerPreparedProductThirdBo;
+import org.dromara.customer.service.IPartnerPreparedProductThirdService;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+
+/**
+ * 伙伴商备货单产品第三方接口
+ * 前端访问路由地址为:/customer/preparedProductThird
+ *
+ * @author LionLi
+ * @date 2026-02-09
+ */
+@Validated
+@RequiredArgsConstructor
+@RestController
+@RequestMapping("/preparedProductThird")
+public class PartnerPreparedProductThirdController extends BaseController {
+
+    private final IPartnerPreparedProductThirdService partnerPreparedProductThirdService;
+
+    /**
+     * 查询伙伴商备货单产品第三方接口列表
+     */
+    //@SaCheckPermission("customer:preparedProductThird:list")
+    @GetMapping("/list")
+    public TableDataInfo<PartnerPreparedProductThirdVo> list(PartnerPreparedProductThirdBo bo, PageQuery pageQuery) {
+        return partnerPreparedProductThirdService.queryPageList(bo, pageQuery);
+    }
+
+    /**
+     * 导出伙伴商备货单产品第三方接口列表
+     */
+    //@SaCheckPermission("customer:preparedProductThird:export")
+    @Log(title = "伙伴商备货单产品第三方接口", businessType = BusinessType.EXPORT)
+    @PostMapping("/export")
+    public void export(PartnerPreparedProductThirdBo bo, HttpServletResponse response) {
+        List<PartnerPreparedProductThirdVo> list = partnerPreparedProductThirdService.queryList(bo);
+        ExcelUtil.exportExcel(list, "伙伴商备货单产品第三方接口", PartnerPreparedProductThirdVo.class, response);
+    }
+
+    /**
+     * 获取伙伴商备货单产品第三方接口详细信息
+     *
+     * @param id 主键
+     */
+    //@SaCheckPermission("customer:preparedProductThird:query")
+    @GetMapping("/{id}")
+    public R<PartnerPreparedProductThirdVo> getInfo(@NotNull(message = "主键不能为空")
+                                     @PathVariable("id") Long id) {
+        return R.ok(partnerPreparedProductThirdService.queryById(id));
+    }
+
+    /**
+     * 新增伙伴商备货单产品第三方接口
+     */
+    //@SaCheckPermission("customer:preparedProductThird:add")
+    @Log(title = "伙伴商备货单产品第三方接口", businessType = BusinessType.INSERT)
+    @RepeatSubmit()
+    @PostMapping()
+    public R<Void> add(@Validated(AddGroup.class) @RequestBody PartnerPreparedProductThirdBo bo) {
+        return toAjax(partnerPreparedProductThirdService.insertByBo(bo));
+    }
+
+    /**
+     * 修改伙伴商备货单产品第三方接口
+     */
+    //@SaCheckPermission("customer:preparedProductThird:edit")
+    @Log(title = "伙伴商备货单产品第三方接口", businessType = BusinessType.UPDATE)
+    @RepeatSubmit()
+    @PutMapping()
+    public R<Void> edit(@Validated(EditGroup.class) @RequestBody PartnerPreparedProductThirdBo bo) {
+        return toAjax(partnerPreparedProductThirdService.updateByBo(bo));
+    }
+
+    /**
+     * 删除伙伴商备货单产品第三方接口
+     *
+     * @param ids 主键串
+     */
+    //@SaCheckPermission("customer:preparedProductThird:remove")
+    @Log(title = "伙伴商备货单产品第三方接口", businessType = BusinessType.DELETE)
+    @DeleteMapping("/{ids}")
+    public R<Void> remove(@NotEmpty(message = "主键不能为空")
+                          @PathVariable("ids") Long[] ids) {
+        return toAjax(partnerPreparedProductThirdService.deleteWithValidByIds(List.of(ids), true));
+    }
+}

+ 106 - 0
ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/controller/PartnerPreparedThirdController.java

@@ -0,0 +1,106 @@
+package org.dromara.customer.controller;
+
+import java.util.List;
+
+import lombok.RequiredArgsConstructor;
+import jakarta.servlet.http.HttpServletResponse;
+import jakarta.validation.constraints.*;
+import cn.dev33.satoken.annotation.SaCheckPermission;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.validation.annotation.Validated;
+import org.dromara.common.idempotent.annotation.RepeatSubmit;
+import org.dromara.common.log.annotation.Log;
+import org.dromara.common.web.core.BaseController;
+import org.dromara.common.mybatis.core.page.PageQuery;
+import org.dromara.common.core.domain.R;
+import org.dromara.common.core.validate.AddGroup;
+import org.dromara.common.core.validate.EditGroup;
+import org.dromara.common.log.enums.BusinessType;
+import org.dromara.common.excel.utils.ExcelUtil;
+import org.dromara.customer.domain.vo.PartnerPreparedThirdVo;
+import org.dromara.customer.domain.bo.PartnerPreparedThirdBo;
+import org.dromara.customer.service.IPartnerPreparedThirdService;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+
+/**
+ * 伙伴商备货单第三方接口
+ * 前端访问路由地址为:/customer/preparedThird
+ *
+ * @author LionLi
+ * @date 2026-02-09
+ */
+@Validated
+@RequiredArgsConstructor
+@RestController
+@RequestMapping("/preparedThird")
+public class PartnerPreparedThirdController extends BaseController {
+
+    private final IPartnerPreparedThirdService partnerPreparedThirdService;
+
+    /**
+     * 查询伙伴商备货单第三方接口列表
+     */
+    //@SaCheckPermission("customer:preparedThird:list")
+    @GetMapping("/list")
+    public TableDataInfo<PartnerPreparedThirdVo> list(PartnerPreparedThirdBo bo, PageQuery pageQuery) {
+        return partnerPreparedThirdService.queryPageList(bo, pageQuery);
+    }
+
+    /**
+     * 导出伙伴商备货单第三方接口列表
+     */
+    //@SaCheckPermission("customer:preparedThird:export")
+    @Log(title = "伙伴商备货单第三方接口", businessType = BusinessType.EXPORT)
+    @PostMapping("/export")
+    public void export(PartnerPreparedThirdBo bo, HttpServletResponse response) {
+        List<PartnerPreparedThirdVo> list = partnerPreparedThirdService.queryList(bo);
+        ExcelUtil.exportExcel(list, "伙伴商备货单第三方接口", PartnerPreparedThirdVo.class, response);
+    }
+
+    /**
+     * 获取伙伴商备货单第三方接口详细信息
+     *
+     * @param id 主键
+     */
+    //@SaCheckPermission("customer:preparedThird:query")
+    @GetMapping("/{id}")
+    public R<PartnerPreparedThirdVo> getInfo(@NotNull(message = "主键不能为空")
+                                     @PathVariable("id") Long id) {
+        return R.ok(partnerPreparedThirdService.queryById(id));
+    }
+
+    /**
+     * 新增伙伴商备货单第三方接口
+     */
+    //@SaCheckPermission("customer:preparedThird:add")
+    @Log(title = "伙伴商备货单第三方接口", businessType = BusinessType.INSERT)
+    @RepeatSubmit()
+    @PostMapping()
+    public R<Void> add(@Validated(AddGroup.class) @RequestBody PartnerPreparedThirdBo bo) {
+        return toAjax(partnerPreparedThirdService.insertByBo(bo));
+    }
+
+    /**
+     * 修改伙伴商备货单第三方接口
+     */
+    //@SaCheckPermission("customer:preparedThird:edit")
+    @Log(title = "伙伴商备货单第三方接口", businessType = BusinessType.UPDATE)
+    @RepeatSubmit()
+    @PutMapping()
+    public R<Void> edit(@Validated(EditGroup.class) @RequestBody PartnerPreparedThirdBo bo) {
+        return toAjax(partnerPreparedThirdService.updateByBo(bo));
+    }
+
+    /**
+     * 删除伙伴商备货单第三方接口
+     *
+     * @param ids 主键串
+     */
+    //@SaCheckPermission("customer:preparedThird:remove")
+    @Log(title = "伙伴商备货单第三方接口", businessType = BusinessType.DELETE)
+    @DeleteMapping("/{ids}")
+    public R<Void> remove(@NotEmpty(message = "主键不能为空")
+                          @PathVariable("ids") Long[] ids) {
+        return toAjax(partnerPreparedThirdService.deleteWithValidByIds(List.of(ids), true));
+    }
+}

+ 2 - 0
ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/domain/CustomerInfo.java

@@ -44,6 +44,8 @@ public class CustomerInfo extends TenantEntity {
 
     private String companyName;
 
+    private String email;
+
     /**
      * 客户名称
      */

+ 3 - 1
ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/domain/PartnerPrepared.java

@@ -4,6 +4,8 @@ import org.dromara.common.tenant.core.TenantEntity;
 import com.baomidou.mybatisplus.annotation.*;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
+
+import java.math.BigDecimal;
 import java.util.Date;
 import com.fasterxml.jackson.annotation.JsonFormat;
 
@@ -57,7 +59,7 @@ public class PartnerPrepared extends TenantEntity {
     /**
      * 备货金额
      */
-    private Long amount;
+    private BigDecimal amount;
 
     /**
      * 区域

+ 78 - 0
ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/domain/PartnerPreparedProductThird.java

@@ -0,0 +1,78 @@
+package org.dromara.customer.domain;
+
+import org.dromara.common.tenant.core.TenantEntity;
+import com.baomidou.mybatisplus.annotation.*;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import java.math.BigDecimal;
+
+import java.io.Serial;
+
+/**
+ * 伙伴商备货单产品第三方接口对象 partner_prepared_product_third
+ *
+ * @author LionLi
+ * @date 2026-02-09
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@TableName("partner_prepared_product_third")
+public class PartnerPreparedProductThird extends TenantEntity {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * ID
+     */
+    @TableId(value = "id")
+    private Long id;
+
+    /**
+     * 关联系统备货单产品明细ID(partner_prepared_product.id)
+     */
+    private Long partnerPreparedProductId;
+
+    /**
+     * 商品SKU
+     */
+    private String goodsId;
+
+    /**
+     * 商品数量
+     */
+    private BigDecimal num;
+
+    /**
+     * 商品价格
+     */
+    private BigDecimal price;
+
+    /**
+     * 商品总金额
+     */
+    private BigDecimal subAmount;
+
+    /**
+     * 备货期
+     */
+    private Long prepareDay;
+
+    /**
+     * 状态(0正常 1停用)
+     */
+    private String status;
+
+    /**
+     * 删除标志(0代表存在 2代表删除)
+     */
+    @TableLogic
+    private String delFlag;
+
+    /**
+     * 备注
+     */
+    private String remark;
+
+
+}

+ 115 - 0
ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/domain/PartnerPreparedThird.java

@@ -0,0 +1,115 @@
+package org.dromara.customer.domain;
+
+import org.dromara.common.tenant.core.TenantEntity;
+import com.baomidou.mybatisplus.annotation.*;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import java.math.BigDecimal;
+import java.util.Date;
+import com.fasterxml.jackson.annotation.JsonFormat;
+
+import java.io.Serial;
+
+/**
+ * 伙伴商备货单第三方接口对象 partner_prepared_third
+ *
+ * @author LionLi
+ * @date 2026-02-09
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@TableName("partner_prepared_third")
+public class PartnerPreparedThird extends TenantEntity {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * ID
+     */
+    @TableId(value = "id")
+    private Long id;
+
+    /**
+     * 关联系统备货单ID
+     */
+    private Long partnerPreparedId;
+
+    /**
+     * 中车电子商城备货单号
+     */
+    private String prepareOrderNo;
+
+    /**
+     * 采购平台备货单号
+     */
+    private String purchaserPrepareOrderNo;
+
+    /**
+     * 备货单状态 0草稿 1待备货 2备货完成 3已取消
+     */
+    private Long prepareOrderStatus;
+
+    /**
+     * 备货单金额
+     */
+    private BigDecimal prepareOrderAmount;
+
+    /**
+     * 备货计划名称
+     */
+    private String planName;
+
+    /**
+     * 备注
+     */
+    private String memo;
+
+    /**
+     * 备货单创建时间
+     */
+    private Date prepareOrderTime;
+
+    /**
+     * 备货人
+     */
+    private String buyer;
+
+    /**
+     * 备货人电话
+     */
+    private String buyerMobile;
+
+    /**
+     * 采购单位
+     */
+    private String purchaserName;
+
+    /**
+     * 采购部门
+     */
+    private String purchaserDeptName;
+
+    /**
+     * 附件
+     */
+    private String attach;
+
+    /**
+     * 状态(0正常 1停用)
+     */
+    private String status;
+
+    /**
+     * 删除标志(0代表存在 2代表删除)
+     */
+    @TableLogic
+    private String delFlag;
+
+    /**
+     * 备注
+     */
+    private String remark;
+
+
+}

+ 2 - 0
ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/domain/bo/CustomerInfoBo.java

@@ -49,6 +49,8 @@ public class CustomerInfoBo extends BaseEntity {
      */
     private String companyName;
 
+    private String email;
+
     /**
      * 客户名称
      */

+ 70 - 0
ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/domain/bo/PartnerPreparedProductThirdBo.java

@@ -0,0 +1,70 @@
+package org.dromara.customer.domain.bo;
+
+import org.dromara.customer.domain.PartnerPreparedProductThird;
+import org.dromara.common.mybatis.core.domain.BaseEntity;
+import org.dromara.common.core.validate.AddGroup;
+import org.dromara.common.core.validate.EditGroup;
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import jakarta.validation.constraints.*;
+import java.math.BigDecimal;
+
+/**
+ * 伙伴商备货单产品第三方接口业务对象 partner_prepared_product_third
+ *
+ * @author LionLi
+ * @date 2026-02-09
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@AutoMapper(target = PartnerPreparedProductThird.class, reverseConvertGenerate = false)
+public class PartnerPreparedProductThirdBo extends BaseEntity {
+
+    /**
+     * ID
+     */
+    private Long id;
+
+    /**
+     * 关联系统备货单产品明细ID(partner_prepared_product.id)
+     */
+    private Long partnerPreparedProductId;
+
+    /**
+     * 商品SKU
+     */
+    private String goodsId;
+
+    /**
+     * 商品数量
+     */
+    private BigDecimal num;
+
+    /**
+     * 商品价格
+     */
+    private BigDecimal price;
+
+    /**
+     * 商品总金额
+     */
+    private BigDecimal subAmount;
+
+    /**
+     * 备货期
+     */
+    private Long prepareDay;
+
+    /**
+     * 状态(0正常 1停用)
+     */
+    private String status;
+
+    /**
+     * 备注
+     */
+    private String remark;
+
+
+}

+ 107 - 0
ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/domain/bo/PartnerPreparedThirdBo.java

@@ -0,0 +1,107 @@
+package org.dromara.customer.domain.bo;
+
+import org.dromara.customer.domain.PartnerPreparedThird;
+import org.dromara.common.mybatis.core.domain.BaseEntity;
+import org.dromara.common.core.validate.AddGroup;
+import org.dromara.common.core.validate.EditGroup;
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import jakarta.validation.constraints.*;
+import java.math.BigDecimal;
+import java.util.Date;
+import com.fasterxml.jackson.annotation.JsonFormat;
+
+/**
+ * 伙伴商备货单第三方接口业务对象 partner_prepared_third
+ *
+ * @author LionLi
+ * @date 2026-02-09
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@AutoMapper(target = PartnerPreparedThird.class, reverseConvertGenerate = false)
+public class PartnerPreparedThirdBo extends BaseEntity {
+
+    /**
+     * ID
+     */
+    private Long id;
+
+    /**
+     * 关联系统备货单ID
+     */
+    private Long partnerPreparedId;
+
+    /**
+     * 中车电子商城备货单号
+     */
+    private String prepareOrderNo;
+
+    /**
+     * 采购平台备货单号
+     */
+    private String purchaserPrepareOrderNo;
+
+    /**
+     * 备货单状态 0草稿 1待备货 2备货完成 3已取消
+     */
+    private Long prepareOrderStatus;
+
+    /**
+     * 备货单金额
+     */
+    private BigDecimal prepareOrderAmount;
+
+    /**
+     * 备货计划名称
+     */
+    private String planName;
+
+    /**
+     * 备注
+     */
+    private String memo;
+
+    /**
+     * 备货单创建时间
+     */
+    private Date prepareOrderTime;
+
+    /**
+     * 备货人
+     */
+    private String buyer;
+
+    /**
+     * 备货人电话
+     */
+    private String buyerMobile;
+
+    /**
+     * 采购单位
+     */
+    private String purchaserName;
+
+    /**
+     * 采购部门
+     */
+    private String purchaserDeptName;
+
+    /**
+     * 附件
+     */
+    private String attach;
+
+    /**
+     * 状态(0正常 1停用)
+     */
+    private String status;
+
+    /**
+     * 备注
+     */
+    private String remark;
+
+
+}

+ 1 - 0
ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/domain/vo/CustomerInfoVo.java

@@ -46,6 +46,7 @@ public class CustomerInfoVo implements Serializable {
     @ExcelProperty(value = "客户编号")
     private String customerNo;
 
+    private String email;
     /**
      * 所属公司
      */

+ 89 - 0
ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/domain/vo/PartnerPreparedProductThirdVo.java

@@ -0,0 +1,89 @@
+package org.dromara.customer.domain.vo;
+
+import java.math.BigDecimal;
+import org.dromara.customer.domain.PartnerPreparedProductThird;
+import cn.idev.excel.annotation.ExcelIgnoreUnannotated;
+import cn.idev.excel.annotation.ExcelProperty;
+import org.dromara.common.excel.annotation.ExcelDictFormat;
+import org.dromara.common.excel.convert.ExcelDictConvert;
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.util.Date;
+
+
+
+/**
+ * 伙伴商备货单产品第三方接口视图对象 partner_prepared_product_third
+ *
+ * @author LionLi
+ * @date 2026-02-09
+ */
+@Data
+@ExcelIgnoreUnannotated
+@AutoMapper(target = PartnerPreparedProductThird.class)
+public class PartnerPreparedProductThirdVo implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * ID
+     */
+    @ExcelProperty(value = "ID")
+    private Long id;
+
+    /**
+     * 关联系统备货单产品明细ID(partner_prepared_product.id)
+     */
+    @ExcelProperty(value = "关联系统备货单产品明细ID", converter = ExcelDictConvert.class)
+    @ExcelDictFormat(readConverterExp = "p=artner_prepared_product.id")
+    private Long partnerPreparedProductId;
+
+    /**
+     * 商品SKU
+     */
+    @ExcelProperty(value = "商品SKU")
+    private String goodsId;
+
+    /**
+     * 商品数量
+     */
+    @ExcelProperty(value = "商品数量")
+    private BigDecimal num;
+
+    /**
+     * 商品价格
+     */
+    @ExcelProperty(value = "商品价格")
+    private BigDecimal price;
+
+    /**
+     * 商品总金额
+     */
+    @ExcelProperty(value = "商品总金额")
+    private BigDecimal subAmount;
+
+    /**
+     * 备货期
+     */
+    @ExcelProperty(value = "备货期")
+    private Long prepareDay;
+
+    /**
+     * 状态(0正常 1停用)
+     */
+    @ExcelProperty(value = "状态", converter = ExcelDictConvert.class)
+    @ExcelDictFormat(readConverterExp = "0=正常,1=停用")
+    private String status;
+
+    /**
+     * 备注
+     */
+    @ExcelProperty(value = "备注")
+    private String remark;
+
+
+}

+ 132 - 0
ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/domain/vo/PartnerPreparedThirdVo.java

@@ -0,0 +1,132 @@
+package org.dromara.customer.domain.vo;
+
+import java.math.BigDecimal;
+import java.util.Date;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import org.dromara.customer.domain.PartnerPreparedThird;
+import cn.idev.excel.annotation.ExcelIgnoreUnannotated;
+import cn.idev.excel.annotation.ExcelProperty;
+import org.dromara.common.excel.annotation.ExcelDictFormat;
+import org.dromara.common.excel.convert.ExcelDictConvert;
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.util.Date;
+
+
+
+/**
+ * 伙伴商备货单第三方接口视图对象 partner_prepared_third
+ *
+ * @author LionLi
+ * @date 2026-02-09
+ */
+@Data
+@ExcelIgnoreUnannotated
+@AutoMapper(target = PartnerPreparedThird.class)
+public class PartnerPreparedThirdVo implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * ID
+     */
+    @ExcelProperty(value = "ID")
+    private Long id;
+
+    /**
+     * 关联系统备货单ID
+     */
+    @ExcelProperty(value = "关联系统备货单ID")
+    private Long partnerPreparedId;
+
+    /**
+     * 中车电子商城备货单号
+     */
+    @ExcelProperty(value = "中车电子商城备货单号")
+    private String prepareOrderNo;
+
+    /**
+     * 采购平台备货单号
+     */
+    @ExcelProperty(value = "采购平台备货单号")
+    private String purchaserPrepareOrderNo;
+
+    /**
+     * 备货单状态 0草稿 1待备货 2备货完成 3已取消
+     */
+    @ExcelProperty(value = "备货单状态 0草稿 1待备货 2备货完成 3已取消")
+    private Long prepareOrderStatus;
+
+    /**
+     * 备货单金额
+     */
+    @ExcelProperty(value = "备货单金额")
+    private BigDecimal prepareOrderAmount;
+
+    /**
+     * 备货计划名称
+     */
+    @ExcelProperty(value = "备货计划名称")
+    private String planName;
+
+    /**
+     * 备注
+     */
+    @ExcelProperty(value = "备注")
+    private String memo;
+
+    /**
+     * 备货单创建时间
+     */
+    @ExcelProperty(value = "备货单创建时间")
+    private Date prepareOrderTime;
+
+    /**
+     * 备货人
+     */
+    @ExcelProperty(value = "备货人")
+    private String buyer;
+
+    /**
+     * 备货人电话
+     */
+    @ExcelProperty(value = "备货人电话")
+    private String buyerMobile;
+
+    /**
+     * 采购单位
+     */
+    @ExcelProperty(value = "采购单位")
+    private String purchaserName;
+
+    /**
+     * 采购部门
+     */
+    @ExcelProperty(value = "采购部门")
+    private String purchaserDeptName;
+
+    /**
+     * 附件
+     */
+    @ExcelProperty(value = "附件")
+    private String attach;
+
+    /**
+     * 状态(0正常 1停用)
+     */
+    @ExcelProperty(value = "状态", converter = ExcelDictConvert.class)
+    @ExcelDictFormat(readConverterExp = "0=正常,1=停用")
+    private String status;
+
+    /**
+     * 备注
+     */
+    @ExcelProperty(value = "备注")
+    private String remark;
+
+
+}

+ 36 - 0
ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/dubbo/RemoteCustomerServiceImpl.java

@@ -7,11 +7,15 @@ import lombok.extern.slf4j.Slf4j;
 import org.apache.dubbo.config.annotation.DubboService;
 import org.dromara.customer.api.RemoteCustomerService;
 import org.dromara.customer.api.domain.CustomerApiVo;
+import org.dromara.customer.api.domain.dto.CustomerAddressDTO;
+import org.dromara.customer.api.domain.dto.CustomerInfoDTO;
 import org.dromara.customer.domain.CustomerContact;
 import org.dromara.customer.domain.CustomerInfo;
+import org.dromara.customer.domain.CustomerShippingAddress;
 import org.dromara.customer.mapper.CustomerInfoMapper;
 import org.dromara.customer.service.ICustomerContactService;
 import org.dromara.customer.service.ICustomerInfoService;
+import org.dromara.customer.service.ICustomerShippingAddressService;
 import org.springframework.stereotype.Service;
 
 import java.util.Collections;
@@ -29,8 +33,12 @@ public class RemoteCustomerServiceImpl implements RemoteCustomerService {
     private final ICustomerInfoService customerInfoService;
 
     private final ICustomerContactService customerContactService;
+
     private final CustomerInfoMapper customerInfoMapper;
 
+    private final ICustomerShippingAddressService customerShippingAddressService;
+
+
     @Override
     public Map<Long, String> selectCustomerNameByIds(Set<Long> ids) {
         return customerInfoService.selectCustomerNameByIds(ids);
@@ -72,4 +80,32 @@ public class RemoteCustomerServiceImpl implements RemoteCustomerService {
         }
         return null;
     }
+
+    @Override
+    public CustomerInfoDTO addReceiver(String name , String email) {
+        CustomerInfo customerInfo = new CustomerInfo();
+        customerInfo.setCustomerName(name);
+        customerInfo.setEmail(email);
+        boolean save = customerInfoService.save(customerInfo);
+        CustomerInfoDTO customerInfoDTO = new CustomerInfoDTO();
+        customerInfoDTO.setId(customerInfo.getId());
+        customerInfoDTO.setCustomerName(customerInfo.getCustomerName());
+        return customerInfoDTO;
+    }
+
+    @Override
+    public CustomerAddressDTO addReceiverAddress(String provinceId, String cityId, String countyId, String address, String mobile) {
+        CustomerShippingAddress customerShippingAddress = new CustomerShippingAddress();
+        customerShippingAddress.setProvincialNo(provinceId);
+        customerShippingAddress.setCityNo(cityId);
+        customerShippingAddress.setCountryNo(countyId);
+        customerShippingAddress.setAddress(address);
+        customerShippingAddress.setPhone(mobile);
+        boolean save = customerShippingAddressService.save(customerShippingAddress);
+        CustomerAddressDTO customerAddressDTO = new CustomerAddressDTO();
+        customerAddressDTO.setId(customerShippingAddress.getId());
+        return customerAddressDTO;
+    }
+
+
 }

+ 146 - 12
ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/dubbo/RemotePartnerPreparedServiceImpl.java

@@ -1,13 +1,32 @@
 package org.dromara.customer.dubbo;
 
+import cn.hutool.core.util.ObjectUtil;
 import lombok.RequiredArgsConstructor;
 import org.apache.dubbo.config.annotation.DubboService;
+import org.dromara.common.core.domain.zhongche.domain.ZhongChePrepareOrderGoods;
+import org.dromara.common.core.domain.zhongche.vo.PrepareOrderDetailRespVo;
 import org.dromara.customer.api.RemotePartnerPreparedService;
 import org.dromara.customer.api.domain.dto.PartnerPreparedDTO;
 import org.dromara.customer.domain.PartnerPrepared;
+import org.dromara.customer.domain.PartnerPreparedProduct;
+import org.dromara.customer.domain.PartnerPreparedProductThird;
+import org.dromara.customer.domain.PartnerPreparedThird;
 import org.dromara.customer.enums.PartnerPreparedStatusEnum;
+import org.dromara.customer.service.IPartnerPreparedProductService;
+import org.dromara.customer.service.IPartnerPreparedProductThirdService;
 import org.dromara.customer.service.IPartnerPreparedService;
+import org.dromara.customer.service.IPartnerPreparedThirdService;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.math.BigDecimal;
+import java.time.LocalDateTime;
+import java.time.ZoneId;
+import java.time.format.DateTimeFormatter;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+import java.util.stream.Collectors;
 
 /**
  * author
@@ -19,17 +38,25 @@ import org.springframework.stereotype.Service;
 public class RemotePartnerPreparedServiceImpl implements RemotePartnerPreparedService {
 
     private final IPartnerPreparedService partnerPreparedService;
+
+    private final IPartnerPreparedProductService partnerPreparedProductService;
+
+    private final IPartnerPreparedThirdService partnerPreparedThirdService;
+
+    private final IPartnerPreparedProductThirdService partnerPreparedProductThirdService;
+
+
     @Override
     public PartnerPreparedDTO updatePartnerPreparedById(String id) {
         PartnerPreparedDTO partnerPreparedDTO = new PartnerPreparedDTO();
-        PartnerPrepared one = partnerPreparedService.lambdaQuery().eq(PartnerPrepared::getPreparedNo, id).one();
+        PartnerPreparedThird one = partnerPreparedThirdService.lambdaQuery().eq(PartnerPreparedThird::getPrepareOrderNo, 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())
+        boolean update = partnerPreparedThirdService.lambdaUpdate().set(PartnerPreparedThird::getPrepareOrderStatus, 1)
+            .eq(PartnerPreparedThird::getPrepareOrderNo, one.getId())
             .update();
         if (update){
             partnerPreparedDTO.setFlag(true);
@@ -43,27 +70,26 @@ public class RemotePartnerPreparedServiceImpl implements RemotePartnerPreparedSe
     }
 
     @Override
+    @Transactional
     public PartnerPreparedDTO cancelPartnerPreparedById(String prepareOrderNo, String cancelReason) {
         PartnerPreparedDTO partnerPreparedDTO = new PartnerPreparedDTO();
-        PartnerPrepared one = partnerPreparedService.lambdaQuery().eq(PartnerPrepared::getPreparedNo, prepareOrderNo).one();
+        PartnerPreparedThird one = partnerPreparedThirdService.lambdaQuery().eq(PartnerPreparedThird::getPrepareOrderNo, prepareOrderNo).one();
         if (one == null){
             partnerPreparedDTO.setFlag(false);
             partnerPreparedDTO.setMessage("未找到该数据");
         }
 
+        boolean update1 = partnerPreparedThirdService.lambdaUpdate().set(PartnerPreparedThird::getPrepareOrderStatus, 1)
+            .eq(PartnerPreparedThird::getPrepareOrderNo, prepareOrderNo)
+            .in(PartnerPreparedThird::getPrepareOrderStatus, 0, 1, 2)
+            .update();
+
         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){
+        if (update && update1){
             partnerPreparedDTO.setFlag(true);
             partnerPreparedDTO.setMessage("修改成功");
         }else {
@@ -72,4 +98,112 @@ public class RemotePartnerPreparedServiceImpl implements RemotePartnerPreparedSe
         }
         return partnerPreparedDTO;
     }
+
+    @Override
+    @Transactional
+    public PartnerPreparedDTO createPartnerPrepared(PrepareOrderDetailRespVo prepareOrderDetailRespVo) {
+        //主表
+        PartnerPrepared partnerPrepared = new PartnerPrepared();
+        //4、备货单金额
+        partnerPrepared.setAmount(prepareOrderDetailRespVo.getPrepareOrderAmount());
+        //7、备货单备注
+        if (ObjectUtil.isNotEmpty(prepareOrderDetailRespVo.getMemo())){
+            partnerPrepared.setRemark(prepareOrderDetailRespVo.getMemo());
+        }
+        //11、采购单位
+        if (ObjectUtil.isNotEmpty(prepareOrderDetailRespVo.getPurchaserName())){
+            partnerPrepared.setPurchasingUnit(prepareOrderDetailRespVo.getPurchaserName());
+        }
+        //12、采购部门
+        if (ObjectUtil.isNotEmpty(prepareOrderDetailRespVo.getPurchaserDeptName())){
+            partnerPrepared.setDeptName(prepareOrderDetailRespVo.getPurchaserDeptName());
+        }
+        partnerPrepared.setPreparedNo(partnerPreparedService.generatePreparedNo());
+        boolean partnerPreparedFlag = partnerPreparedService.save(partnerPrepared);
+
+        //副表
+        PartnerPreparedThird partnerPreparedThird = new PartnerPreparedThird();
+        //备货ID
+        partnerPreparedThird.setPartnerPreparedId(partnerPrepared.getId());
+        //1、中车电子商城备货单号
+        partnerPreparedThird.setPrepareOrderNo(prepareOrderDetailRespVo.getPrepareOrderNo());
+        //2、采购平台备货单号
+        partnerPreparedThird.setPurchaserPrepareOrderNo(prepareOrderDetailRespVo.getPurchaserPrepareOrderNo());
+        //3、备货单状态
+        partnerPreparedThird.setPrepareOrderStatus(Long.parseLong(prepareOrderDetailRespVo.getPrepareOrderStatus()));
+        //6、备货计划名称
+        partnerPreparedThird.setPlanName(prepareOrderDetailRespVo.getName());
+        //8、备货单创建时间
+        Date date = parseDate(prepareOrderDetailRespVo.getPrepareOrderTime());
+        partnerPreparedThird.setPrepareOrderTime(date);
+        //9、备货人名称
+        if (ObjectUtil.isNotEmpty(prepareOrderDetailRespVo.getBuyer())){
+            partnerPreparedThird.setBuyer(prepareOrderDetailRespVo.getBuyer());
+        }
+        //10、备货人电话
+        if (ObjectUtil.isNotEmpty(prepareOrderDetailRespVo.getBuyer())){
+            partnerPreparedThird.setBuyer(prepareOrderDetailRespVo.getBuyer());
+        }
+        //13、附件
+        if (ObjectUtil.isNotEmpty(prepareOrderDetailRespVo.getAttach())){
+            partnerPreparedThird.setAttach(prepareOrderDetailRespVo.getAttach());
+        }
+        boolean partnerPreparedThirdFlag = partnerPreparedThirdService.save(partnerPreparedThird);
+
+
+        //备货单商品
+        List<ZhongChePrepareOrderGoods> prepareOrderGoods = prepareOrderDetailRespVo.getPrepareOrderGoods();
+        List<PartnerPreparedProduct> productList = prepareOrderGoods.stream().map(goods -> {
+            PartnerPreparedProduct product = new PartnerPreparedProduct();
+            //关联主备货单
+            product.setPartnerPreparedId(partnerPrepared.getId());
+            // goodsId → productId
+            product.setProductId(Long.parseLong(goods.getGoodsId()));
+            // num → quantity (Long)
+            if (goods.getNum() != null) {
+                product.setQuantity(goods.getNum().longValueExact());
+            }
+            // price
+            product.setPrice(goods.getPrice());
+            return product;
+        }).collect(Collectors.toList());
+        boolean partnerPreparedProductFlag = partnerPreparedProductService.saveBatch(productList);
+        List<PartnerPreparedProductThird> thirdList = new ArrayList<>();
+        for (int i = 0; i < productList.size(); i++) {
+            PartnerPreparedProduct product = productList.get(i);
+            ZhongChePrepareOrderGoods goods = prepareOrderGoods.get(i);
+            PartnerPreparedProductThird third = new PartnerPreparedProductThird();
+            // 关键:关联主表ID
+            third.setPartnerPreparedProductId(product.getId());
+            third.setSubAmount(goods.getSubAmount());
+            third.setPrepareDay(goods.getPrepareDay() == null ? null :
+                goods.getPrepareDay().longValue());
+            thirdList.add(third);
+        }
+        boolean partnerPreparedProductThirdFlag = partnerPreparedProductThirdService.saveBatch(thirdList);
+        if (partnerPreparedFlag && partnerPreparedThirdFlag && partnerPreparedProductFlag && partnerPreparedProductThirdFlag) {
+            PartnerPreparedDTO partnerPreparedDTO = new PartnerPreparedDTO();
+            partnerPreparedDTO.setFlag(true);
+            partnerPreparedDTO.setMessage("创建成功");
+            return partnerPreparedDTO;
+        }else {
+            PartnerPreparedDTO partnerPreparedDTO = new PartnerPreparedDTO();
+            partnerPreparedDTO.setFlag(false);
+            partnerPreparedDTO.setMessage("创建失败");
+            return partnerPreparedDTO;
+        }
+    }
+
+    private Date parseDate(String timeStr) {
+        if (timeStr == null || timeStr.isEmpty()) {
+            return null;
+        }
+
+        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
+        LocalDateTime localDateTime = LocalDateTime.parse(timeStr, formatter);
+
+        return Date.from(localDateTime.atZone(ZoneId.systemDefault()).toInstant());
+    }
+
+
 }

+ 15 - 0
ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/mapper/PartnerPreparedProductThirdMapper.java

@@ -0,0 +1,15 @@
+package org.dromara.customer.mapper;
+
+import org.dromara.customer.domain.PartnerPreparedProductThird;
+import org.dromara.customer.domain.vo.PartnerPreparedProductThirdVo;
+import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
+
+/**
+ * 伙伴商备货单产品第三方接口Mapper接口
+ *
+ * @author LionLi
+ * @date 2026-02-09
+ */
+public interface PartnerPreparedProductThirdMapper extends BaseMapperPlus<PartnerPreparedProductThird, PartnerPreparedProductThirdVo> {
+
+}

+ 15 - 0
ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/mapper/PartnerPreparedThirdMapper.java

@@ -0,0 +1,15 @@
+package org.dromara.customer.mapper;
+
+import org.dromara.customer.domain.PartnerPreparedThird;
+import org.dromara.customer.domain.vo.PartnerPreparedThirdVo;
+import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
+
+/**
+ * 伙伴商备货单第三方接口Mapper接口
+ *
+ * @author LionLi
+ * @date 2026-02-09
+ */
+public interface PartnerPreparedThirdMapper extends BaseMapperPlus<PartnerPreparedThird, PartnerPreparedThirdVo> {
+
+}

+ 70 - 0
ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/service/IPartnerPreparedProductThirdService.java

@@ -0,0 +1,70 @@
+package org.dromara.customer.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import org.dromara.customer.domain.PartnerPreparedProductThird;
+import org.dromara.customer.domain.vo.PartnerPreparedProductThirdVo;
+import org.dromara.customer.domain.bo.PartnerPreparedProductThirdBo;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.common.mybatis.core.page.PageQuery;
+
+import java.util.Collection;
+import java.util.List;
+
+/**
+ * 伙伴商备货单产品第三方接口Service接口
+ *
+ * @author LionLi
+ * @date 2026-02-09
+ */
+public interface IPartnerPreparedProductThirdService extends IService<PartnerPreparedProductThird>{
+
+    /**
+     * 查询伙伴商备货单产品第三方接口
+     *
+     * @param id 主键
+     * @return 伙伴商备货单产品第三方接口
+     */
+    PartnerPreparedProductThirdVo queryById(Long id);
+
+    /**
+     * 分页查询伙伴商备货单产品第三方接口列表
+     *
+     * @param bo        查询条件
+     * @param pageQuery 分页参数
+     * @return 伙伴商备货单产品第三方接口分页列表
+     */
+    TableDataInfo<PartnerPreparedProductThirdVo> queryPageList(PartnerPreparedProductThirdBo bo, PageQuery pageQuery);
+
+    /**
+     * 查询符合条件的伙伴商备货单产品第三方接口列表
+     *
+     * @param bo 查询条件
+     * @return 伙伴商备货单产品第三方接口列表
+     */
+    List<PartnerPreparedProductThirdVo> queryList(PartnerPreparedProductThirdBo bo);
+
+    /**
+     * 新增伙伴商备货单产品第三方接口
+     *
+     * @param bo 伙伴商备货单产品第三方接口
+     * @return 是否新增成功
+     */
+    Boolean insertByBo(PartnerPreparedProductThirdBo bo);
+
+    /**
+     * 修改伙伴商备货单产品第三方接口
+     *
+     * @param bo 伙伴商备货单产品第三方接口
+     * @return 是否修改成功
+     */
+    Boolean updateByBo(PartnerPreparedProductThirdBo bo);
+
+    /**
+     * 校验并批量删除伙伴商备货单产品第三方接口信息
+     *
+     * @param ids     待删除的主键集合
+     * @param isValid 是否进行有效性校验
+     * @return 是否删除成功
+     */
+    Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
+}

+ 2 - 0
ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/service/IPartnerPreparedService.java

@@ -67,4 +67,6 @@ public interface IPartnerPreparedService extends IService<PartnerPrepared>{
      * @return 是否删除成功
      */
     Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
+
+    String generatePreparedNo();
 }

+ 70 - 0
ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/service/IPartnerPreparedThirdService.java

@@ -0,0 +1,70 @@
+package org.dromara.customer.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import org.dromara.customer.domain.PartnerPreparedThird;
+import org.dromara.customer.domain.vo.PartnerPreparedThirdVo;
+import org.dromara.customer.domain.bo.PartnerPreparedThirdBo;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.common.mybatis.core.page.PageQuery;
+
+import java.util.Collection;
+import java.util.List;
+
+/**
+ * 伙伴商备货单第三方接口Service接口
+ *
+ * @author LionLi
+ * @date 2026-02-09
+ */
+public interface IPartnerPreparedThirdService extends IService<PartnerPreparedThird>{
+
+    /**
+     * 查询伙伴商备货单第三方接口
+     *
+     * @param id 主键
+     * @return 伙伴商备货单第三方接口
+     */
+    PartnerPreparedThirdVo queryById(Long id);
+
+    /**
+     * 分页查询伙伴商备货单第三方接口列表
+     *
+     * @param bo        查询条件
+     * @param pageQuery 分页参数
+     * @return 伙伴商备货单第三方接口分页列表
+     */
+    TableDataInfo<PartnerPreparedThirdVo> queryPageList(PartnerPreparedThirdBo bo, PageQuery pageQuery);
+
+    /**
+     * 查询符合条件的伙伴商备货单第三方接口列表
+     *
+     * @param bo 查询条件
+     * @return 伙伴商备货单第三方接口列表
+     */
+    List<PartnerPreparedThirdVo> queryList(PartnerPreparedThirdBo bo);
+
+    /**
+     * 新增伙伴商备货单第三方接口
+     *
+     * @param bo 伙伴商备货单第三方接口
+     * @return 是否新增成功
+     */
+    Boolean insertByBo(PartnerPreparedThirdBo bo);
+
+    /**
+     * 修改伙伴商备货单第三方接口
+     *
+     * @param bo 伙伴商备货单第三方接口
+     * @return 是否修改成功
+     */
+    Boolean updateByBo(PartnerPreparedThirdBo bo);
+
+    /**
+     * 校验并批量删除伙伴商备货单第三方接口信息
+     *
+     * @param ids     待删除的主键集合
+     * @param isValid 是否进行有效性校验
+     * @return 是否删除成功
+     */
+    Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
+}

+ 140 - 0
ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/service/impl/PartnerPreparedProductThirdServiceImpl.java

@@ -0,0 +1,140 @@
+package org.dromara.customer.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.dromara.common.core.utils.MapstructUtils;
+import org.dromara.common.core.utils.StringUtils;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.common.mybatis.core.page.PageQuery;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+import org.dromara.customer.domain.bo.PartnerPreparedProductThirdBo;
+import org.dromara.customer.domain.vo.PartnerPreparedProductThirdVo;
+import org.dromara.customer.domain.PartnerPreparedProductThird;
+import org.dromara.customer.mapper.PartnerPreparedProductThirdMapper;
+import org.dromara.customer.service.IPartnerPreparedProductThirdService;
+
+import java.util.List;
+import java.util.Map;
+import java.util.Collection;
+
+/**
+ * 伙伴商备货单产品第三方接口Service业务层处理
+ *
+ * @author LionLi
+ * @date 2026-02-09
+ */
+@Slf4j
+@RequiredArgsConstructor
+@Service
+public class PartnerPreparedProductThirdServiceImpl  extends ServiceImpl<PartnerPreparedProductThirdMapper, PartnerPreparedProductThird> implements IPartnerPreparedProductThirdService {
+
+    private final PartnerPreparedProductThirdMapper baseMapper;
+
+    /**
+     * 查询伙伴商备货单产品第三方接口
+     *
+     * @param id 主键
+     * @return 伙伴商备货单产品第三方接口
+     */
+    @Override
+    public PartnerPreparedProductThirdVo queryById(Long id){
+        return baseMapper.selectVoById(id);
+    }
+
+    /**
+     * 分页查询伙伴商备货单产品第三方接口列表
+     *
+     * @param bo        查询条件
+     * @param pageQuery 分页参数
+     * @return 伙伴商备货单产品第三方接口分页列表
+     */
+    @Override
+    public TableDataInfo<PartnerPreparedProductThirdVo> queryPageList(PartnerPreparedProductThirdBo bo, PageQuery pageQuery) {
+        LambdaQueryWrapper<PartnerPreparedProductThird> lqw = buildQueryWrapper(bo);
+        Page<PartnerPreparedProductThirdVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
+        return TableDataInfo.build(result);
+    }
+
+    /**
+     * 查询符合条件的伙伴商备货单产品第三方接口列表
+     *
+     * @param bo 查询条件
+     * @return 伙伴商备货单产品第三方接口列表
+     */
+    @Override
+    public List<PartnerPreparedProductThirdVo> queryList(PartnerPreparedProductThirdBo bo) {
+        LambdaQueryWrapper<PartnerPreparedProductThird> lqw = buildQueryWrapper(bo);
+        return baseMapper.selectVoList(lqw);
+    }
+
+    private LambdaQueryWrapper<PartnerPreparedProductThird> buildQueryWrapper(PartnerPreparedProductThirdBo bo) {
+        Map<String, Object> params = bo.getParams();
+        LambdaQueryWrapper<PartnerPreparedProductThird> lqw = Wrappers.lambdaQuery();
+        lqw.orderByAsc(PartnerPreparedProductThird::getId);
+        lqw.eq(bo.getPartnerPreparedProductId() != null, PartnerPreparedProductThird::getPartnerPreparedProductId, bo.getPartnerPreparedProductId());
+        lqw.eq(StringUtils.isNotBlank(bo.getGoodsId()), PartnerPreparedProductThird::getGoodsId, bo.getGoodsId());
+        lqw.eq(bo.getNum() != null, PartnerPreparedProductThird::getNum, bo.getNum());
+        lqw.eq(bo.getPrice() != null, PartnerPreparedProductThird::getPrice, bo.getPrice());
+        lqw.eq(bo.getSubAmount() != null, PartnerPreparedProductThird::getSubAmount, bo.getSubAmount());
+        lqw.eq(bo.getPrepareDay() != null, PartnerPreparedProductThird::getPrepareDay, bo.getPrepareDay());
+        lqw.eq(StringUtils.isNotBlank(bo.getStatus()), PartnerPreparedProductThird::getStatus, bo.getStatus());
+        lqw.eq(StringUtils.isNotBlank(bo.getPlatformCode()), PartnerPreparedProductThird::getPlatformCode, bo.getPlatformCode());
+        return lqw;
+    }
+
+    /**
+     * 新增伙伴商备货单产品第三方接口
+     *
+     * @param bo 伙伴商备货单产品第三方接口
+     * @return 是否新增成功
+     */
+    @Override
+    public Boolean insertByBo(PartnerPreparedProductThirdBo bo) {
+        PartnerPreparedProductThird add = MapstructUtils.convert(bo, PartnerPreparedProductThird.class);
+        validEntityBeforeSave(add);
+        boolean flag = baseMapper.insert(add) > 0;
+        if (flag) {
+            bo.setId(add.getId());
+        }
+        return flag;
+    }
+
+    /**
+     * 修改伙伴商备货单产品第三方接口
+     *
+     * @param bo 伙伴商备货单产品第三方接口
+     * @return 是否修改成功
+     */
+    @Override
+    public Boolean updateByBo(PartnerPreparedProductThirdBo bo) {
+        PartnerPreparedProductThird update = MapstructUtils.convert(bo, PartnerPreparedProductThird.class);
+        validEntityBeforeSave(update);
+        return baseMapper.updateById(update) > 0;
+    }
+
+    /**
+     * 保存前的数据校验
+     */
+    private void validEntityBeforeSave(PartnerPreparedProductThird entity){
+        //TODO 做一些数据校验,如唯一约束
+    }
+
+    /**
+     * 校验并批量删除伙伴商备货单产品第三方接口信息
+     *
+     * @param ids     待删除的主键集合
+     * @param isValid 是否进行有效性校验
+     * @return 是否删除成功
+     */
+    @Override
+    public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
+        if(isValid){
+            //TODO 做一些业务上的校验,判断是否需要校验
+        }
+        return baseMapper.deleteByIds(ids) > 0;
+    }
+}

+ 11 - 10
ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/service/impl/PartnerPreparedServiceImpl.java

@@ -108,7 +108,7 @@ public class PartnerPreparedServiceImpl  extends ServiceImpl<PartnerPreparedMapp
     @Override
     public Boolean insertByBo(PartnerPreparedBo bo) {
         PartnerPrepared add = MapstructUtils.convert(bo, PartnerPrepared.class);
-        
+
         // TODO: 【重要】partner_id 用于关联当前登录的伙伴商用户
         //  应该从当前登录用户的 token/session 中获取其关联的伙伴商ID(partner_info.id)
         //  伙伴商用户登录后,其创建的所有订单报备都应自动绑定到该伙伴商
@@ -116,12 +116,12 @@ public class PartnerPreparedServiceImpl  extends ServiceImpl<PartnerPreparedMapp
         if (add.getPartnerId() == null) {
             add.setPartnerId(1L);
         }
-        
+
         // 自动生成备货单编号
         if (StringUtils.isBlank(add.getPreparedNo())) {
             add.setPreparedNo(generatePreparedNo());
         }
-        
+
         // 设置必填字段的默认值(避免数据库约束错误)
         if (StringUtils.isBlank(add.getPurchasingUnitName())) {
             add.setPurchasingUnitName("");
@@ -132,7 +132,7 @@ public class PartnerPreparedServiceImpl  extends ServiceImpl<PartnerPreparedMapp
         if (StringUtils.isBlank(add.getInvoiceAttachment())) {
             add.setInvoiceAttachment("");
         }
-        
+
         // 设置初始状态:新建订单默认为待审核、未处理
         if (add.getPreparedStatus() == null) {
             add.setPreparedStatus(0L); // 0=待审核
@@ -140,7 +140,7 @@ public class PartnerPreparedServiceImpl  extends ServiceImpl<PartnerPreparedMapp
         if (add.getDealStatus() == null) {
             add.setDealStatus(0L); // 0=未处理
         }
-        
+
         validEntityBeforeSave(add);
         boolean flag = baseMapper.insert(add) > 0;
         if (flag) {
@@ -148,23 +148,24 @@ public class PartnerPreparedServiceImpl  extends ServiceImpl<PartnerPreparedMapp
         }
         return flag;
     }
-    
+
     /**
      * 生成备货单编号
      * 格式:BH + yyyyMMdd + 6位流水号
      * 例如:BH202601220000001
      */
-    private String generatePreparedNo() {
+    @Override
+    public String generatePreparedNo() {
         String dateStr = DateUtils.dateTimeNow(FormatsType.YYYYMMDD);
         String prefix = "BH" + dateStr;
-        
+
         // 查询当天最大的流水号
         LambdaQueryWrapper<PartnerPrepared> wrapper = Wrappers.lambdaQuery();
         wrapper.likeRight(PartnerPrepared::getPreparedNo, prefix)
                .orderByDesc(PartnerPrepared::getPreparedNo)
                .last("LIMIT 1");
         PartnerPrepared lastOrder = baseMapper.selectOne(wrapper);
-        
+
         int sequence = 1;
         if (lastOrder != null && StringUtils.isNotBlank(lastOrder.getPreparedNo())) {
             String lastNo = lastOrder.getPreparedNo();
@@ -173,7 +174,7 @@ public class PartnerPreparedServiceImpl  extends ServiceImpl<PartnerPreparedMapp
                 sequence = Integer.parseInt(lastSequence) + 1;
             }
         }
-        
+
         return prefix + String.format("%06d", sequence);
     }
 

+ 147 - 0
ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/service/impl/PartnerPreparedThirdServiceImpl.java

@@ -0,0 +1,147 @@
+package org.dromara.customer.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.dromara.common.core.utils.MapstructUtils;
+import org.dromara.common.core.utils.StringUtils;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.common.mybatis.core.page.PageQuery;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+import org.dromara.customer.domain.bo.PartnerPreparedThirdBo;
+import org.dromara.customer.domain.vo.PartnerPreparedThirdVo;
+import org.dromara.customer.domain.PartnerPreparedThird;
+import org.dromara.customer.mapper.PartnerPreparedThirdMapper;
+import org.dromara.customer.service.IPartnerPreparedThirdService;
+
+import java.util.List;
+import java.util.Map;
+import java.util.Collection;
+
+/**
+ * 伙伴商备货单第三方接口Service业务层处理
+ *
+ * @author LionLi
+ * @date 2026-02-09
+ */
+@Slf4j
+@RequiredArgsConstructor
+@Service
+public class PartnerPreparedThirdServiceImpl  extends ServiceImpl<PartnerPreparedThirdMapper, PartnerPreparedThird> implements IPartnerPreparedThirdService {
+
+    private final PartnerPreparedThirdMapper baseMapper;
+
+    /**
+     * 查询伙伴商备货单第三方接口
+     *
+     * @param id 主键
+     * @return 伙伴商备货单第三方接口
+     */
+    @Override
+    public PartnerPreparedThirdVo queryById(Long id){
+        return baseMapper.selectVoById(id);
+    }
+
+    /**
+     * 分页查询伙伴商备货单第三方接口列表
+     *
+     * @param bo        查询条件
+     * @param pageQuery 分页参数
+     * @return 伙伴商备货单第三方接口分页列表
+     */
+    @Override
+    public TableDataInfo<PartnerPreparedThirdVo> queryPageList(PartnerPreparedThirdBo bo, PageQuery pageQuery) {
+        LambdaQueryWrapper<PartnerPreparedThird> lqw = buildQueryWrapper(bo);
+        Page<PartnerPreparedThirdVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
+        return TableDataInfo.build(result);
+    }
+
+    /**
+     * 查询符合条件的伙伴商备货单第三方接口列表
+     *
+     * @param bo 查询条件
+     * @return 伙伴商备货单第三方接口列表
+     */
+    @Override
+    public List<PartnerPreparedThirdVo> queryList(PartnerPreparedThirdBo bo) {
+        LambdaQueryWrapper<PartnerPreparedThird> lqw = buildQueryWrapper(bo);
+        return baseMapper.selectVoList(lqw);
+    }
+
+    private LambdaQueryWrapper<PartnerPreparedThird> buildQueryWrapper(PartnerPreparedThirdBo bo) {
+        Map<String, Object> params = bo.getParams();
+        LambdaQueryWrapper<PartnerPreparedThird> lqw = Wrappers.lambdaQuery();
+        lqw.orderByAsc(PartnerPreparedThird::getId);
+        lqw.eq(bo.getPartnerPreparedId() != null, PartnerPreparedThird::getPartnerPreparedId, bo.getPartnerPreparedId());
+        lqw.eq(StringUtils.isNotBlank(bo.getPrepareOrderNo()), PartnerPreparedThird::getPrepareOrderNo, bo.getPrepareOrderNo());
+        lqw.eq(StringUtils.isNotBlank(bo.getPurchaserPrepareOrderNo()), PartnerPreparedThird::getPurchaserPrepareOrderNo, bo.getPurchaserPrepareOrderNo());
+        lqw.eq(bo.getPrepareOrderStatus() != null, PartnerPreparedThird::getPrepareOrderStatus, bo.getPrepareOrderStatus());
+        lqw.eq(bo.getPrepareOrderAmount() != null, PartnerPreparedThird::getPrepareOrderAmount, bo.getPrepareOrderAmount());
+        lqw.like(StringUtils.isNotBlank(bo.getPlanName()), PartnerPreparedThird::getPlanName, bo.getPlanName());
+        lqw.eq(StringUtils.isNotBlank(bo.getMemo()), PartnerPreparedThird::getMemo, bo.getMemo());
+        lqw.eq(bo.getPrepareOrderTime() != null, PartnerPreparedThird::getPrepareOrderTime, bo.getPrepareOrderTime());
+        lqw.eq(StringUtils.isNotBlank(bo.getBuyer()), PartnerPreparedThird::getBuyer, bo.getBuyer());
+        lqw.eq(StringUtils.isNotBlank(bo.getBuyerMobile()), PartnerPreparedThird::getBuyerMobile, bo.getBuyerMobile());
+        lqw.like(StringUtils.isNotBlank(bo.getPurchaserName()), PartnerPreparedThird::getPurchaserName, bo.getPurchaserName());
+        lqw.like(StringUtils.isNotBlank(bo.getPurchaserDeptName()), PartnerPreparedThird::getPurchaserDeptName, bo.getPurchaserDeptName());
+        lqw.eq(StringUtils.isNotBlank(bo.getAttach()), PartnerPreparedThird::getAttach, bo.getAttach());
+        lqw.eq(StringUtils.isNotBlank(bo.getStatus()), PartnerPreparedThird::getStatus, bo.getStatus());
+        lqw.eq(StringUtils.isNotBlank(bo.getPlatformCode()), PartnerPreparedThird::getPlatformCode, bo.getPlatformCode());
+        return lqw;
+    }
+
+    /**
+     * 新增伙伴商备货单第三方接口
+     *
+     * @param bo 伙伴商备货单第三方接口
+     * @return 是否新增成功
+     */
+    @Override
+    public Boolean insertByBo(PartnerPreparedThirdBo bo) {
+        PartnerPreparedThird add = MapstructUtils.convert(bo, PartnerPreparedThird.class);
+        validEntityBeforeSave(add);
+        boolean flag = baseMapper.insert(add) > 0;
+        if (flag) {
+            bo.setId(add.getId());
+        }
+        return flag;
+    }
+
+    /**
+     * 修改伙伴商备货单第三方接口
+     *
+     * @param bo 伙伴商备货单第三方接口
+     * @return 是否修改成功
+     */
+    @Override
+    public Boolean updateByBo(PartnerPreparedThirdBo bo) {
+        PartnerPreparedThird update = MapstructUtils.convert(bo, PartnerPreparedThird.class);
+        validEntityBeforeSave(update);
+        return baseMapper.updateById(update) > 0;
+    }
+
+    /**
+     * 保存前的数据校验
+     */
+    private void validEntityBeforeSave(PartnerPreparedThird entity){
+        //TODO 做一些数据校验,如唯一约束
+    }
+
+    /**
+     * 校验并批量删除伙伴商备货单第三方接口信息
+     *
+     * @param ids     待删除的主键集合
+     * @param isValid 是否进行有效性校验
+     * @return 是否删除成功
+     */
+    @Override
+    public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
+        if(isValid){
+            //TODO 做一些业务上的校验,判断是否需要校验
+        }
+        return baseMapper.deleteByIds(ids) > 0;
+    }
+}

+ 7 - 0
ruoyi-modules/ruoyi-customer/src/main/resources/mapper/customer/PartnerPreparedProductThirdMapper.xml

@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="org.dromara.customer.mapper.PartnerPreparedProductThirdMapper">
+
+</mapper>

+ 7 - 0
ruoyi-modules/ruoyi-customer/src/main/resources/mapper/customer/PartnerPreparedThirdMapper.xml

@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="org.dromara.customer.mapper.PartnerPreparedThirdMapper">
+
+</mapper>

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

@@ -1,10 +1,12 @@
 package org.dromara.external;
 
+import org.apache.dubbo.config.spring.context.annotation.EnableDubbo;
 import org.springframework.boot.SpringApplication;
 import org.springframework.boot.autoconfigure.SpringBootApplication;
 import org.springframework.boot.context.metrics.buffering.BufferingApplicationStartup;
 
 @SpringBootApplication
+@EnableDubbo
 public class RuoyiExternalApplication {
 
     public static void main(String[] args) {

+ 227 - 15
ruoyi-modules/ruoyi-external/src/main/java/org/dromara/external/controller/zhongche/ZhongChePullController.java

@@ -1,6 +1,5 @@
 package org.dromara.external.controller.zhongche;
 
-import cn.hutool.core.codec.Base64;
 import cn.hutool.core.date.DateUtil;
 
 import cn.hutool.core.util.StrUtil;
@@ -10,9 +9,12 @@ import cn.hutool.json.JSONUtil;
 import com.fasterxml.jackson.core.JsonProcessingException;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
+import org.dromara.common.core.domain.zhongche.aftersale.bo.*;
+import org.dromara.common.core.domain.zhongche.aftersale.domain.AfterSaleDeliverGoodsItem;
+import org.dromara.common.core.domain.zhongche.aftersale.vo.*;
+import org.dromara.common.core.domain.zhongche.vo.OrderDetailVo;
+import org.dromara.common.core.domain.zhongche.vo.PrepareOrderDetailRespVo;
 import org.dromara.external.api.zhongche.domain.*;
-import org.dromara.external.api.zhongche.domain.aftersale.bo.*;
-import org.dromara.external.api.zhongche.domain.aftersale.vo.*;
 import org.dromara.external.api.zhongche.domain.bo.*;
 import org.dromara.external.api.zhongche.domain.invoice.bo.*;
 import org.dromara.external.api.zhongche.domain.invoice.vo.InvoiceApplyDetailVo;
@@ -23,7 +25,6 @@ import org.dromara.external.api.zhongche.domain.settlement.vo.SettlementApplyOrd
 import org.dromara.external.api.zhongche.domain.settlement.vo.SettlementDetailVo;
 import org.dromara.external.api.zhongche.domain.settlement.vo.SettlementPaymentDetailVo;
 import org.dromara.external.api.zhongche.domain.vo.*;
-import org.dromara.external.util.SM2SignUtil;
 import org.dromara.external.util.SM2SignatureUtils;
 import org.dromara.external.util.SignParamUtils;
 import org.dromara.external.util.ZCApiUtils;
@@ -33,7 +34,9 @@ import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
 
+import java.math.BigDecimal;
 import java.nio.charset.StandardCharsets;
+import java.util.ArrayList;
 import java.util.List;
 
 /**
@@ -48,11 +51,16 @@ import java.util.List;
 public class ZhongChePullController {
 
     // 中车地区查询接口地址(替换为真实域名)
-    private static final String AREA_QUERY_URL = "https://supply-test.crrcgo.cc/mallapi/";
+    private static final String AREA_QUERY_URL = "https://supply-test.crrcgo.cc/mallapi";
     // 中车提供的配置(替换为真实值)
     private static final String CLIENT_ID = "KFZAVuIyC56";
+    //正式环境
+    /*private static final String PRIVATE_KEY = "MIGTAgEAMBMGByqGSM49AgEGCCqBHM9VAYItBHkwdwIBAQQgpQdXwMi21Mg1FhWad2AQLOwfNiDHgwhootau0YerQbagCgYIKoEcz1UBgi2hRANCAATVjJs6XRAMTZ72G6aWbgCAjfAnW0j5R9VFnHySTiF8+1mOisc3xOOr9w/Tu3hixzL5H2gVyLzHDRWkFtyeVqrX"; // 电商平台私钥
+    private static final String ZC_PUBLIC_KEY = "MFkwEwYHKoZIzj0CAQYIKoEcz1UBgi0DQgAEmUrB5ByAeb8jHayC7vbddqBFDIEsf1cpNO1qJttZ17xlDagVB/tBFasPr/x0+OWf2kimTKah2NGCYarymD1R5Q=="; // 中车公钥*/
+    //测试环境
     private static final String PRIVATE_KEY = "MIGTAgEAMBMGByqGSM49AgEGCCqBHM9VAYItBHkwdwIBAQQgpQdXwMi21Mg1FhWad2AQLOwfNiDHgwhootau0YerQbagCgYIKoEcz1UBgi2hRANCAATVjJs6XRAMTZ72G6aWbgCAjfAnW0j5R9VFnHySTiF8+1mOisc3xOOr9w/Tu3hixzL5H2gVyLzHDRWkFtyeVqrX"; // 电商平台私钥
-    private static final String ZC_PUBLIC_KEY = "MFkwEwYHKoZIzj0CAQYIKoEcz1UBgi0DQgAEmUrB5ByAeb8jHayC7vbddqBFDIEsf1cpNO1qJttZ17xlDagVB/tBFasPr/x0+OWf2kimTKah2NGCYarymD1R5Q==\n"; // 中车公钥
+    private static final String ZC_PUBLIC_KEY = "MFkwEwYHKoZIzj0CAQYIKoEcz1UBgi0DQgAE1YybOl0QDE2e9humlm4AgI3wJ1tI+UfVRZx8kk4hfPtZjorHN8Tjq/cP07t4Yscy+R9oFci8xw0VpBbcnlaq1w=="; // 中车公钥
+    //企采公钥
     private static final String VERSION = "1.0.0";
 
 
@@ -120,7 +128,7 @@ public class ZhongChePullController {
             return ZCR.fail("5000", "业务参数编码失败:" + e.getMessage());
         }
 
-        //TODO 3. 构建 ZCTokenBo 请求体
+        //3. 构建 ZCTokenBo 请求体
         ZCTokenBo zcTokenBo = getZcTokenBo(dataBase64);
         // 4. 生成请求签名
         String requestSign;
@@ -179,13 +187,10 @@ public class ZhongChePullController {
 
         return responseDto;
     }
-
-    //TODO 怎么获取TOKEN
     private ZCTokenBo getZcTokenBo(String data) {
         ZCTokenBo zcTokenBo = new ZCTokenBo();
         zcTokenBo.setVersion(VERSION);
         zcTokenBo.setTimestamp(DateUtil.format(DateUtil.date(), "yyyyMMddHHmmss"));
-        zcTokenBo.setAccessToken(null);
         zcTokenBo.setClientId(CLIENT_ID);
         zcTokenBo.setData(data);
         zcTokenBo.setSign(null);
@@ -193,6 +198,188 @@ public class ZhongChePullController {
     }
 
 
+
+
+
+
+
+
+
+    //换货新品发货
+    /*public static void main(String[] args) {
+        AfterSaleDeliverGoodsBo bo = new AfterSaleDeliverGoodsBo();
+        bo.setAfterSaleNo("1471145050028249088");
+        bo.setDeliveryType("1");
+        bo.setExpressCode("434848895994511");
+        bo.setExpressCompanyName("韵达");
+        List<AfterSaleDeliverGoodsItem> afterSaleDeliverGoods = new ArrayList<>();
+        AfterSaleDeliverGoodsItem afterSaleDeliverGoodsItem = new AfterSaleDeliverGoodsItem();
+        afterSaleDeliverGoodsItem.setGoodsId("362032");
+        afterSaleDeliverGoodsItem.setNum(new BigDecimal(1.0000));
+        afterSaleDeliverGoods.add(afterSaleDeliverGoodsItem);
+        bo.setAfterSaleDeliverGoods(afterSaleDeliverGoods);
+        ZhongChePullController zhongChePullController = new ZhongChePullController();
+        AfterSaleDeliverGoodsVo vo =  zhongChePullController.mallAftersaleDeliverGoods(bo);
+        System.out.println(vo);
+        //待签名字符串:{"clientId":"KFZAVuIyC56","data":"eyJhZnRlclNhbGVObyI6IjE0NzExNDUwNTAwMjgyNDkwODgiLCJkZWxpdmVyeVR5cGUiOiIxIiwiZXhwcmVzc0NvZGUiOiI0MzQ4NDg4OTU5OTQ1MTEiLCJleHByZXNzQ29tcGFueU5hbWUiOiLpn7Xovr4iLCJhZnRlclNhbGVEZWxpdmVyR29vZHMiOlt7Imdvb2RzSWQiOiIzNjIwMzIiLCJudW0iOjF9XX0=","timestamp":"20260211142325","version":"1.0.0"}
+        //AfterSaleDeliverGoodsVo(outgoingCode=1471149642388475904)
+    }*/
+
+    //查询售后单详情
+    /*public static void main(String[] args) {
+        AfterSaleDetailBo bo = new AfterSaleDetailBo();
+        bo.setAfterSaleNo("1471151366025121792");
+        ZhongChePullController zhongChePullController = new ZhongChePullController();
+        AfterSaleDetailVo vo =zhongChePullController.mallAftersaleDetail(bo);
+        System.out.println(vo);
+        //仅退款
+        //AfterSaleDetailVo(afterSaleNo=1471151366025121792, purchaserAfterSaleNo=1471151366243225600, mallAfterSaleNo=null, orderNo=20260211110174132, afterSaleType=4, memo=null, afterSaleStatus=10, goodsReturnStatus=1, applyTime=20260211143018, afterSaleReason=AfterSaleReason(reasonTypeName=收货商品与商品描述不符, reasonTypeCode=1, reason=2312321, imageList=[]), afterSaleGoods=AfterSaleGoods(goodsId=362032, num=1.0000, needDetectionReport=null, hasPackage=null, packageDesc=null), afterSalePick=null, afterSaleReturn=null, refundAccount=null, refundMoney=null, refundGoodsStatus=1, refundPrestore=null)
+        //换货
+        //AfterSaleDetailVo(afterSaleNo=1471137739549315072, purchaserAfterSaleNo=1471137739675144192, mallAfterSaleNo=null, orderNo=20260211110174132, afterSaleType=1, memo=null, afterSaleStatus=10, goodsReturnStatus=1, applyTime=20260211133610, afterSaleReason=AfterSaleReason(reasonTypeName=错发, reasonTypeCode=1, reason=1111, imageList=[]), afterSaleGoods=AfterSaleGoods(goodsId=362032, num=1.0000, needDetectionReport=0, hasPackage=1, packageDesc=10), afterSalePick=AfterSalePick(pickType=3, name=null, provinceId=null, cityId=null, countyId=null, townId=0, address=null, zip=null, mobile=null, phone=null, email=null), afterSaleReturn=null, refundAccount=null, refundMoney=null, refundGoodsStatus=null, refundPrestore=null)
+    }*/
+
+    //同意售后
+    /*public static void main(String[] args) {
+        AfterSaleConfirmBo bo = new AfterSaleConfirmBo();
+        bo.setAfterSaleNo("1471151366025121792");
+        bo.setMallAfterSaleNo("RT202602110003");
+        //bo.setName("李景阳");
+        //bo.setProvinceId("1");
+        //bo.setCityId("2800");
+        //bo.setCountyId("55835");
+        //bo.setAddress("湖北省武汉市武昌区中南国际城C12207");
+        //bo.setZip("430000");
+        //bo.setMobile("18327041620");
+        //bo.setPhone("18327041620");
+        //bo.setEmail("18327041620@163.com");
+        ZhongChePullController zhongChePullController = new ZhongChePullController();
+        GoodsUpdateVo vo =zhongChePullController.mallAftersaleConfirm(bo);
+        System.out.println(vo);
+    }*/
+
+    //换货
+    //待签名字符串:{"clientId":"KFZAVuIyC56","data":"eyJhZnRlclNhbGVObyI6IjE0NzExNDUwNTAwMjgyNDkwODgifQ==","timestamp":"20260211140847","version":"1.0.0"}
+    //AfterSaleDetailVo(afterSaleNo=1471145050028249088, purchaserAfterSaleNo=1471145050934218752, mallAfterSaleNo=null, orderNo=20260211110174132, afterSaleType=2, memo=null, afterSaleStatus=10, goodsReturnStatus=1, applyTime=20260211140512, afterSaleReason=AfterSaleReason(reasonTypeName=错发, reasonTypeCode=1, reason=123123, imageList=[]), afterSaleGoods=AfterSaleGoods(goodsId=362032, num=1.0000, needDetectionReport=0, hasPackage=1, packageDesc=10), afterSalePick=AfterSalePick(pickType=1, name=111, provinceId=1, cityId=2800, countyId=55835, townId=0, address=中车智程, zip=null, mobile=13381115928, phone=null, email=null), afterSaleReturn=AfterSaleReturn(name=111, provinceId=1, cityId=2800, countyId=55835, townId=null, address=中车智程, zip=null, mobile=13381115928, phone=null, email=null), refundAccount=null, refundMoney=null, refundGoodsStatus=null, refundPrestore=null)
+
+    //收到商品确认
+    /*public static void main(String[] args) {
+        AfterSaleReturnReceivedBo bo = new AfterSaleReturnReceivedBo();
+        bo.setAfterSaleNo("1471145050028249088");
+        ZhongChePullController zhongChePullController = new ZhongChePullController();
+        GoodsUpdateVo vo =zhongChePullController. mallAftersaleReturnGoodsReceived(bo);
+        System.out.println(vo);
+    }*/
+
+    //接单
+    /*public static void main(String[] args) {
+        OrderConfirmBo bo = new OrderConfirmBo();
+        bo.setOrderNo("20260211110174132");
+        bo.setMallOrderNo("RS20260002");
+        ZhongChePullController zhongChePullController = new ZhongChePullController();
+        GoodsUpdateVo goodsUpdateVo =  zhongChePullController.mallOrderConfirm(bo);
+        System.out.println(goodsUpdateVo);
+        //待签名字符串:{"clientId":"KFZAVuIyC56","data":"eyJvcmRlck5vIjoiMjAyNjAyMTAxMTAxNzQxMzEiLCJtYWxsT3JkZXJObyI6IlJTMjAyNjAwMDEifQ==","timestamp":"20260210175937","version":"1.0.0"}
+        //GoodsUpdateVo(result=1, message=null)
+    }*/
+
+
+
+    //确认退款
+    public static void main(String[] args) {
+        AfterSaleRefundBo bo = new AfterSaleRefundBo();
+        bo.setAfterSaleNo("1471151366025121792");
+        ZhongChePullController zhongChePullController = new ZhongChePullController();
+        GoodsUpdateVo vo = zhongChePullController.mallAftersaleRefund(bo);
+        System.out.println(vo);
+    }
+
+    //获取地址信息
+    /*public static void main(String[] args) {
+        AreaQueryBo bo = new AreaQueryBo();
+        AreaVo areaQuery(@RequestBody AreaQueryBo bo)
+        ZhongChePullController zhongChePullController = new ZhongChePullController();
+        GoodsUpdateVo vo =zhongChePullController.mallAftersaleConfirm(bo);
+        System.out.println(vo);
+    }*/
+    //ZhongCheOrderDeliverVo(outgoingCode=1471093529601249280)
+    //查询发货单详情
+    /*public static void main(String[] args) {
+        ZhongChePullController zhongChePullController = new ZhongChePullController();
+        OutgoingQueryBo queryBo = new OutgoingQueryBo();
+        queryBo.setOrderNo("20260210110174131");
+        OutgoingVo outgoingVo = zhongChePullController.mallOrderQueryOutgoing(queryBo);
+        System.out.println(outgoingVo);
+        //OutgoingVo(outgoingList=[OutgoingList(orderNo=20260210110174131, outgoingCode=1470843870811131904, outgoingStatus=0, deliveryType=1, expressCode=123456, expressCompanyName=韵达, outgoingGoods=[OutgoingGoods(goodsId=362032, num=7.0000)])])
+    }*/
+
+//OrderDetailVo(orderNo=20260211110174132, purchaserOrderNo=2026021110452506, preOrder=0, mallOrderNo=null, orderStatus=1, orderAmount=205.24, freight=0.00, orderGoods=[OrderGoodsItem(goodsId=362032, num=7.0000, price=29.3200, subAmount=205.24, wishDeliveryDate=null)], name=111, provinceId=1, cityId=2800, countyId=55835, townId=0, address=中车智程, zip=null, mobile=13381115928, phone=null, email=service_yg@bosssoft.com.cn, memo=, orderTime=2026-02-11 10:17:40, buyer=常恒瑀, buyerMobile=18801195315, purchaserName=中国中车, purchaserDeptName=中国中车-中车科技园发展有限公司-中车智程文化科技(北京)有限公司, paymentType=01, orderInvoice=ZhongCheOrderInvoice(invoiceType=2, selectedInvoiceTitle=5, companyName=中车智程文化科技(北京), invoiceContent=1, invoiceName=王琳, invoicePhone=15249101907, invoiceFullAddress=北京海淀区羊坊店街道北京市海淀区羊坊店路11号, regCompanyName=中车智程文化科技(北京), regCode=91110108MAC4385K6J, regAddr=北京市海淀区羊坊店路11号四层428室测试, regPhone=010-51891021, regBank=中国工商银行股份有限公司北京玉渊潭支行测试, regBankAccount=111111111), voucher=0, payClient=0, paySerialNum=null, payAccount=null, payMoney=null, payPrestore=null, files=null)
+
+    //他们售后发货了
+//{"id":"d0094ec3-e032-43df-b95a-7cfb4ac91261","type":"2103","content":{"afterSaleNo":"1471137739549315072","expressCode":"21312321","expressCompanyName":"顺丰快递","freight":0,"deliverTime":"20260211135600"},"time":"20260211135601149","protocolId":null}
+//{"id":"d0094ec3-e032-43df-b95a-7cfb4ac91261","type":"2001","content":{"orderNo":"20260210110174130"},"time":"20260211135601149"}
+//{"id":"d0094ec3-e032-43df-b95a-7cfb4ac91261","type":"2002","content":{"orderNo":"20260210110174130","cancelReason":"不想要了"},"time":"20260211135601149"}
+
+    //查询订单详情
+    /*public static void main(String[] args) {
+        OrderDetailBo bo = new OrderDetailBo();
+        bo.setOrderNo("20260210110174131");
+        ZhongChePullController zhongChePullController = new ZhongChePullController();
+        OrderDetailVo orderDetailVo =  zhongChePullController.mallOrderDetail(bo);
+        System.out.println(orderDetailVo);
+        //待签名字符串:{"clientId":"KFZAVuIyC56","data":"eyJvcmRlck5vIjoiMjAyNjAyMTAxMTAxNzQxMzAifQ==","timestamp":"20260210174806","version":"1.0.0"}
+        //OrderDetailVo(orderNo=20260210110174130, purchaserOrderNo=2026021010452504, preOrder=0, mallOrderNo=null, orderStatus=1, orderAmount=205.24, freight=0.00, orderGoods=[OrderGoodsItem(goodsId=362032, num=7.0000, price=29.3200, subAmount=205.24, wishDeliveryDate=null)], name=111, provinceId=1, cityId=2800, countyId=55835, townId=0, address=中车智程, zip=null, mobile=13381115928, phone=null, email=service_yg@bosssoft.com.cn, memo=, orderTime=2026-02-10 17:25:18, buyer=常恒瑀, buyerMobile=18801195315, purchaserName=中国中车, purchaserDeptName=中国中车-中车科技园发展有限公司-中车智程文化科技(北京)有限公司, paymentType=01, orderInvoice=ZhongCheOrderInvoice(invoiceType=2, selectedInvoiceTitle=5, companyName=中车智程文化科技(北京), invoiceContent=1, invoiceName=王琳, invoicePhone=15249101907, invoiceFullAddress=北京海淀区羊坊店街道北京市海淀区羊坊店路11号, regCompanyName=中车智程文化科技(北京), regCode=91110108MAC4385K6J, regAddr=北京市海淀区羊坊店路11号四层428室测试, regPhone=010-51891021, regBank=中国工商银行股份有限公司北京玉渊潭支行测试, regBankAccount=111111111), voucher=0, payClient=0, paySerialNum=null, payAccount=null, payMoney=null, payPrestore=null, files=null)
+    }*/
+
+    //导入商品
+    /*public static void main(String[] args) {
+        String username = "admin";
+        List<GoodsImportItem> batchGoods = new ArrayList<>();
+        GoodsImportItem item = new GoodsImportItem();
+        item.setGoodsId("362031");
+        item.setCatalogId("13012");
+        item.setCatalogName("原装墨盒");
+        item.setStandardCatalogId("1750717233748832257");
+        item.setStandardCatalogName("铁圈装订机耗材");
+        item.setBrandName("得力");
+        item.setName("得力");
+        item.setDsPrice(new BigDecimal(41));
+        item.setPrice(new BigDecimal(34));
+        item.setUnit("个");
+        item.setStock(100);
+        item.setBarImgUrls("[\"https://img1.com\",\"https://img2.com\"]");
+        item.setDescription("得力商品");
+        item.setProperties("{\"颜色\":\"红色\",\"尺寸\":\"XL\",\"材质\":\"棉|涤纶\"}");
+        item.setIsSelfOperated(1);
+        item.setTax(new BigDecimal(0.05));
+        item.setTaxCode("123456");
+        batchGoods.add(item);
+        GoodsImportBo bo = new GoodsImportBo();
+        bo.setAccount(username);
+        bo.setGoods(batchGoods);
+        ZhongChePullController zhongChePullController = new ZhongChePullController();
+        GoodsImportVo resp = zhongChePullController.egoodsImport(bo);
+        System.out.println(resp);
+    }*/
+
+    //发货
+    /*public static void main(String[] args) {
+        ZhongCheOrderDeliverBo bo = new ZhongCheOrderDeliverBo();
+        bo.setOrderNo("20260211110174132");
+        bo.setDeliveryType("1");
+        bo.setExpressCode("434848895994511");
+        bo.setExpressCompanyName("韵达");
+        List<OrderDeliverGoods> orderDeliverGoods1 = new ArrayList<>();
+        OrderDeliverGoods orderDeliverGoods = new OrderDeliverGoods();
+        orderDeliverGoods.setGoodsId("362032");
+        orderDeliverGoods.setNum(new BigDecimal(7.0000));
+        orderDeliverGoods.setVoucher("[\"imgUrl1\",\"imgUrl2\"]");
+        orderDeliverGoods1.add(orderDeliverGoods);
+        bo.setOrderDeliverGoods(orderDeliverGoods1);
+        ZhongChePullController zhongChePullController = new ZhongChePullController();
+        ZhongCheOrderDeliverVo vo =  zhongChePullController.mallOrderDeliverGoods(bo);
+        System.out.println(vo);
+    }*/
+
     //5.2.1	商品导入
     @PostMapping("/egoods/import")
     public GoodsImportVo egoodsImport(@RequestBody GoodsImportBo bo) {
@@ -222,8 +409,8 @@ public class ZhongChePullController {
             String bizJson = ZCApiUtils.base64Decode(responseDto.getData());
 
             // 3. JSON → VO(Jackson 自动处理嵌套对象 / List)
-            return ZCApiUtils.jsonToObject(bizJson, voClass);
-
+//            return ZCApiUtils.jsonToObject(bizJson, voClass);
+            return JSONUtil.toBean(bizJson, voClass);
         } catch (Exception e) {
             log.error("解析中车响应失败,response={}", responseDto, e);
             throw new RuntimeException("解析中车响应失败", e);
@@ -310,10 +497,8 @@ public class ZhongChePullController {
     @PostMapping("/mall/order/deliver/goods")
     public ZhongCheOrderDeliverVo mallOrderDeliverGoods(@RequestBody ZhongCheOrderDeliverBo bo) {
         ZCR responseDto = doZcPost("/api/mall/order/deliver/goods", bo);
-
         ZhongCheOrderDeliverVo zcr = parseZcResponse(responseDto, ZhongCheOrderDeliverVo.class);
         return zcr;
-
     }
 
     //TODO 5.3.6	查询待处理订单列表
@@ -340,7 +525,34 @@ public class ZhongChePullController {
         return zcr;
     }
 
-    //TODO 5.3.11	审核订单取消
+    //5.3.9	查询备货单详情
+    @PostMapping("/mall/prepare/order/detail")
+    public PrepareOrderDetailRespVo mallPrepareOrderDetail(@RequestBody PrepareOrderDetailReqBo bo) {
+        ZCR responseDto = doZcPost("/api/mall/prepare/order/detail", bo);
+        PrepareOrderDetailRespVo zcr = parseZcResponse(responseDto, PrepareOrderDetailRespVo.class);
+        return zcr;
+    }
+
+    //5.3.10	备货
+    @PostMapping("/mall/prepare/order/goods")
+    public GoodsUpdateVo mallPrepareOrderGoods(@RequestBody PrepareOrderDataBo bo) {
+        ZCR responseDto = doZcPost("/api/mall/prepare/order/goods", bo);
+        GoodsUpdateVo zcr = parseZcResponse(responseDto, GoodsUpdateVo.class);
+        return zcr;
+    }
+
+
+    //5.3.11	确认取消备货单
+    @PostMapping("/mall/prepare/order/confirm/cancel")
+    public GoodsUpdateVo mallPrepareOrderConfirmCancel(@RequestBody PrepareOrderDetailReqBo bo) {
+        ZCR responseDto = doZcPost("/api/mall/prepare/order/confirm/cancel", bo);
+        GoodsUpdateVo zcr = parseZcResponse(responseDto, GoodsUpdateVo.class);
+        return zcr;
+    }
+
+
+
+    //TODO 5.3.12	审核订单取消
     /*
         //请求业务参数
         OrderCancelAuditBo orderCancelAuditBo = new OrderCancelAuditBo();

+ 113 - 42
ruoyi-modules/ruoyi-external/src/main/java/org/dromara/external/controller/zhongche/ZhongChePushController.java

@@ -12,14 +12,19 @@ import lombok.extern.slf4j.Slf4j;
 import org.apache.dubbo.config.annotation.DubboReference;
 import org.dromara.common.core.domain.zhongche.domain.Goods;
 import org.dromara.common.core.domain.zhongche.domain.Prices;
+import org.dromara.common.core.domain.zhongche.vo.OrderDetailVo;
 import org.dromara.common.core.domain.zhongche.vo.PricesVo;
 import org.dromara.common.core.domain.zhongche.vo.ZhongCheTrackVo;
 import org.dromara.external.api.zhongche.domain.*;
+import org.dromara.common.core.domain.zhongche.aftersale.bo.AfterSaleDetailBo;
+import org.dromara.common.core.domain.zhongche.aftersale.vo.AfterSaleDetailVo;
 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.external.controller.zhongche.handle.MallMessageDispatcher;
+import org.dromara.external.domain.ExternalProductCategory;
+import org.dromara.external.service.IExternalProductCategoryService;
 import org.dromara.external.util.SM2SignatureUtils;
 import org.dromara.external.util.SignParamUtils;
 import org.dromara.product.api.RemoteExternalOrderService;
@@ -49,7 +54,7 @@ import static org.dromara.common.core.constant.GlobalConstants.GLOBAL_REDIS_KEY;
 @Validated
 @RequiredArgsConstructor
 @RestController
-@RequestMapping("/api/mall/auth")
+@RequestMapping("/api/mall")
 public class ZhongChePushController {
     private final String key = GLOBAL_REDIS_KEY+"external:zhongche:token:";
     private final String CLIENT_ID = "KFZAVuIyC56";
@@ -63,13 +68,23 @@ public class ZhongChePushController {
 
     private final MallMessageDispatcher mallMessageDispatcher;
 
-    private final String DEVELOPER_PRIVATE_KEY = "MFkwEwYHKoZIzj0CAQYIKoEcz1UBgi0DQgAE1YybOl0QDE2e9humlm4AgI3wJ1tI+UfVRZx8kk4hfPtZjorHN8Tjq/cP07t4Yscy+R9oFci8xw0VpBbcnlaq1w=="; // 电商提供的私钥
+    private final IExternalProductCategoryService externalProductCategoryService;
 
-    private final String DEVELOPER_PUBLIC_KEY = "MIGTAgEAMBMGByqGSM49AgEGCCqBHM9VAYItBHkwdwIBAQQgpQdXwMi21Mg1FhWad2AQLOwfNiDHgwhootau0YerQbagCgYIKoEcz1UBgi2hRANCAATVjJs6XRAMTZ72G6aWbgCAjfAnW0j5R9VFnHySTiF8+1mOisc3xOOr9w/Tu3hixzL5H2gVyLzHDRWkFtyeVqrX";  // 电商提供的公钥
+    //正式环境
+    /*private static final String DEVELOPER_PUBLIC_KEY = "MFkwEwYHKoZIzj0CAQYIKoEcz1UBgi0DQgAEmUrB5ByAeb8jHayC7vbddqBFDIEsf1cpNO1qJttZ17xlDagVB/tBFasPr/x0+OWf2kimTKah2NGCYarymD1R5Q=="; // 电商提供的私钥
 
+    private static final String DEVELOPER_PRIVATE_KEY = "MIGTAgEAMBMGByqGSM49AgEGCCqBHM9VAYItBHkwdwIBAQQgpQdXwMi21Mg1FhWad2AQLOwfNiDHgwhootau0YerQbagCgYIKoEcz1UBgi2hRANCAATVjJs6XRAMTZ72G6aWbgCAjfAnW0j5R9VFnHySTiF8+1mOisc3xOOr9w/Tu3hixzL5H2gVyLzHDRWkFtyeVqrX";  // 电商提供的公钥*/
 
 
-    //TODO 登录
+    //测试环境
+    private static final String DEVELOPER_PUBLIC_KEY = "MFkwEwYHKoZIzj0CAQYIKoEcz1UBgi0DQgAE1YybOl0QDE2e9humlm4AgI3wJ1tI+UfVRZx8kk4hfPtZjorHN8Tjq/cP07t4Yscy+R9oFci8xw0VpBbcnlaq1w=="; // 电商提供的私钥
+
+    private static final String DEVELOPER_PRIVATE_KEY = "MIGTAgEAMBMGByqGSM49AgEGCCqBHM9VAYItBHkwdwIBAQQgpQdXwMi21Mg1FhWad2AQLOwfNiDHgwhootau0YerQbagCgYIKoEcz1UBgi2hRANCAATVjJs6XRAMTZ72G6aWbgCAjfAnW0j5R9VFnHySTiF8+1mOisc3xOOr9w/Tu3hixzL5H2gVyLzHDRWkFtyeVqrX";  // 电商提供的公钥
+
+
+
+
+    //登录
     @PostMapping("/login")
     public ZCR login(@RequestBody ZCTokenBo zcTokenBo) {
         //业务参数
@@ -79,7 +94,7 @@ public class ZhongChePushController {
     }
 
     // 获取品目列表
-    @PostMapping("/catalog/query")
+    @PostMapping("/auth/catalog/query")
     public ZCR catelogQuery(@RequestBody ZCTokenBo zcTokenBo) {
         //  1. 公共请求参数校验
         ZCR checkResult = checkPublicParams(zcTokenBo);
@@ -98,7 +113,13 @@ public class ZhongChePushController {
             return zcr;
         }
         // 4. 核心业务:查询品目列表并转换为文档要求的结构  TODO这里标准品目没有做
-        List<Catalog> catalogVoList = remoteProductService.queryList()
+        List<ExternalProductCategory> externalProductCategoryList = externalProductCategoryService.lambdaQuery()
+            .select(ExternalProductCategory::getProductCategoryId)
+            .list();
+        List<Long> collect = externalProductCategoryList.stream()
+            .map(ExternalProductCategory::getProductCategoryId)
+            .collect(Collectors.toList());
+        List<Catalog> catalogVoList = remoteProductService.queryListByIds(collect)
             .stream()
             .map(this::convertToCatalogVo)
             .collect(Collectors.toList());
@@ -108,7 +129,7 @@ public class ZhongChePushController {
         // 业务参数→JSON→Base64编码
         String respBizJson = JSONUtil.toJsonStr(catalogVo);
         String respDataBase64 = Base64.encode(respBizJson, StandardCharsets.UTF_8);
-        // 6. 生成响应签名(核心:复用工具类,完成SM2withSM3签名,补全TODO
+        // 6. 生成响应签名(核心:复用工具类,完成SM2withSM3签名,补全)
         String respSign = "";
         try {
             // 步骤6.1:封装空签名的成功响应实体(用于生成待签名字符串)
@@ -139,7 +160,6 @@ public class ZhongChePushController {
         catalog.setName(category.getCategoryName());      // 品目名称
         catalog.setLevel(category.getClassLevel().toString()); // 品目级次
         catalog.setState(category.getIsShow() == 1 ? 1 : 0); // 状态:1有效 0无效
-
         // 标准品目(仅最细级填充)
         /*if (StrUtil.isNotBlank(category.getStandardCatalogId())) {
             StandardCatalogVo standardVo = new StandardCatalogVo();
@@ -147,7 +167,6 @@ public class ZhongChePushController {
             standardVo.setStandardCatalogName(category.getStandardCatalogName());
             vo.setStandardCatalog(standardVo);
         }*/
-
         catalog.setStandardCatalog(null);
         return catalog;
     }
@@ -167,7 +186,7 @@ public class ZhongChePushController {
      * @param zcTokenBo
      * @return
      */
-    @PostMapping("/egoods/stock/query")
+    @PostMapping("/auth/egoods/stock/query")
     public ZCR egoodsStockQuery(@RequestBody ZCTokenBo zcTokenBo) {
 
         //1. 公共请求参数校验
@@ -249,7 +268,7 @@ public class ZhongChePushController {
         StocksResultDto stocksResultDto = remoteProductService.queryProductStock(goodsMap, areaId);
 
         List<Stocks> goodsStockRespList = new ArrayList<>();
-        if (stocksResultDto == null || stocksResultDto.getStocks() == null || stocksResultDto.getStocks().isEmpty()) {
+        if (stocksResultDto != null || stocksResultDto.getStocks() != null || !stocksResultDto.getStocks().isEmpty()) {
             // 无库存数据返回,遍历入参商品,按「未查询到」处理
             for (StocksResult stocksResult : stocksResultDto.getStocks()) {
                 Stocks stocks =new Stocks();
@@ -262,7 +281,7 @@ public class ZhongChePushController {
     }
 
 
-    //TODO 查询商品价格
+    //查询商品价格
     /*
         //请求业务参数
         Goods goods = new Goods();
@@ -270,7 +289,7 @@ public class ZhongChePushController {
         //响应业务参数
         PricesVo pricesVo = new PricesVo();
      */
-    @PostMapping("/egoods/price/query")
+    @PostMapping("/auth/egoods/price/query")
     public ZCR egoodsPriceQuery(@RequestBody ZCTokenBo zcTokenBo) {
         //1. 公共请求参数校验
         ZCR checkResult = checkPublicParams(zcTokenBo);
@@ -414,7 +433,7 @@ public class ZhongChePushController {
             return ZCR.fail("5035", "业务参数data解析失败:" + e.getMessage());
         }
 
-        //******4. 核心业务:调用Dubbo服务查询物流信息   我们没有换新单 所以第二个参数先抛弃掉
+        //******4. 核心业务:调用Dubbo服务查询物流信息   TODO我们没有换新单 所以第二个参数先抛弃掉
         ZhongCheTrackVo trackVo = remoteOrderService.queryLogisticsTrack(bizReq.getOutgoingCode(), bizReq.getWaybillType());
         if (trackVo == null){
             return ZCR.fail("5035", "物流信息为空");
@@ -439,13 +458,6 @@ public class ZhongChePushController {
     }
 
     //4.6 查询电商平台订单号
-    /*
-        //请求业务参数
-        MallOrderNoQueryBo mallOrderNoQueryBo = new MallOrderNoQueryBo();
-
-        //响应业务参数
-        MallOrderNoVo mallOrderNoVo = new MallOrderNoVo();
-     */
     @PostMapping("/get/mallOrderNo")
     public ZCR getMallOrderNo(@RequestBody ZCTokenBo zcTokenBo) {
         //1. 公共请求参数校验
@@ -485,11 +497,8 @@ public class ZhongChePushController {
 
         // 5. 查询电商平台订单号(你的内部逻辑)
         String orderNo = orderNoQueryBo.getOrderNo();
-        String mallOrderNo;
-        try {
-            mallOrderNo = remoteOrderService.getOrderNo(orderNo);
-        } catch (Exception e) {
-            log.error("查询电商订单号 - 查询失败,orderNo={}", orderNo, e);
+        String mallOrderNo = remoteOrderService.getOrderNo(orderNo);
+        if (!ObjectUtil.isNotEmpty(mallOrderNo)){
             return ZCR.fail("5010", "查询电商订单号失败");
         }
         // 6. 构造业务响应 data(VO → JSON → Base64)
@@ -547,15 +556,14 @@ public class ZhongChePushController {
 
         // 5. 查询电商平台售后单号(内部逻辑你自己实现)
         String afterSaleNo = queryBo.getAfterSaleNo();
-        String mallAfterSaleNo = remoteOrderService.getReturnOrderNo(afterSaleNo);
-
-        if (StrUtil.isBlank(mallAfterSaleNo)) {
+        String returnOrderNo = remoteOrderService.getReturnOrderNo(afterSaleNo);
+        if (StrUtil.isBlank(returnOrderNo)) {
             return ZCR.fail("5004", "未查询到对应的电商平台售后单号");
         }
 
         // 6. 构造响应业务参数
         MallAfterSaleNoVo vo = new MallAfterSaleNoVo();
-        vo.setMallAfterSaleNo(mallAfterSaleNo);
+        vo.setMallAfterSaleNo(returnOrderNo);
 
         String respBizJson = JSONUtil.toJsonStr(vo);
         String respDataBase64 = Base64.encode(respBizJson, StandardCharsets.UTF_8);
@@ -580,7 +588,7 @@ public class ZhongChePushController {
         return ZCR.ok(respDataBase64, respSign);
     }
 
-    //TODO 4.8 消息监听     消息类型枚举没做
+    //4.8 消息监听
     @PostMapping("/message/listening")
     public ZCR listener(@RequestBody ZCTokenBo zcTokenBo) {
         // 1. 公共请求参数校验
@@ -594,14 +602,11 @@ public class ZhongChePushController {
         if (!"0".equals(tokenCheck.getRespCode())) {
             return tokenCheck;
         }
-        //TODO 假设解析出电商用户名
-        String accountName = "123456";
         // 3. 业务参数解析
         MessageBo messageBo;
         try {
             String decodedData = Base64.decodeStr(zcTokenBo.getData(), StandardCharsets.UTF_8);
             messageBo = JSONUtil.toBean(decodedData, MessageBo.class);
-            messageBo.setAccountName(accountName);
         } catch (Exception e) {
             log.error("消息监听 - 业务参数解析失败", e);
             return ZCR.fail("5007", "业务参数解析失败");
@@ -644,23 +649,65 @@ public class ZhongChePushController {
 
         // 8. 返回响应
         return ZCR.ok(respDataBase64, respSign);
-
     }
 
-    //TODO 4.9 非必接模块接入校验
+    //4.9 非必接模块接入校验
     @PostMapping("/notRequireApi/check")
     public ZCR notRequireApiCheck(@RequestBody ZCTokenBo zcTokenBo) {
-        //请求业务参数
-        ModuleCheckBo moduleCheckBo = new ModuleCheckBo();
+        // 1. 公共请求参数校验
+        ZCR checkResult = checkPublicParams(zcTokenBo);
+        if (!"0".equals(checkResult.getRespCode())) {
+            return ZCR.fail(checkResult.getRespCode(), checkResult.getRespMsg());
+        }
 
-        //响应业务参数
-        MessageVo messageVo = new MessageVo();
+        // 2. accessToken 校验
+        ZCR tokenCheck = checkAccessTokenValid(zcTokenBo.getAccessToken());
+        if (!"0".equals(tokenCheck.getRespCode())) {
+            return tokenCheck;
+        }
 
-        return null;
+        // 3. 业务参数解析
+        ModuleCheckBo moduleCheckBo;
+        try {
+            String decodedData = Base64.decodeStr(zcTokenBo.getData(), StandardCharsets.UTF_8);
+            moduleCheckBo = JSONUtil.toBean(decodedData, ModuleCheckBo.class);
+        } catch (Exception e) {
+            log.error("非必接模块校验 - 业务参数解析失败", e);
+            return ZCR.fail("5007", "业务参数解析失败");
+        }
+        // 4. 业务参数必填校验
+        if (moduleCheckBo == null
+            || StrUtil.isBlank(moduleCheckBo.getAccount())
+            || StrUtil.isBlank(moduleCheckBo.getModuleType())) {
+            return ZCR.fail("5007", "模块校验业务参数不完整");
+        }
+
+        // 5. 核心业务逻辑
+        // 当前阶段:所有非必接模块【均未接入】
+        CheckResultVo checkResultVo = new CheckResultVo();
+        checkResultVo.setCheckResult("1"); // 0 = 未接入
+
+        // 6. 业务响应转 Base64
+        String respBizJson = JSONUtil.toJsonStr(checkResultVo);
+        String respDataBase64 = Base64.encode(respBizJson, StandardCharsets.UTF_8);
+
+        // 7. 生成响应签名
+        String respSign;
+        try {
+            ZCR successZcr = ZCR.ok(respDataBase64);
+            String respSignContent = SignParamUtils.getSignContent(successZcr);
+            respSign = SM2SignatureUtils.sign(respSignContent, DEVELOPER_PRIVATE_KEY);
+        } catch (Exception e) {
+            log.error("非必接模块校验 - 响应签名生成失败,业务JSON:{}", respBizJson, e);
+            return ZCR.fail("5036", "接口响应签名生成失败");
+        }
+
+        // 8. 返回成功响应
+        return ZCR.ok(respDataBase64, respSign);
     }
 
     //TODO 4.10 	查询运费
-    @PostMapping("egoods/getfreight")
+    @PostMapping("/auth/egoods/getfreight")
     public ZCR getFreight(@RequestBody ZCTokenBo zcTokenBo) {
         //请求业务参数
         AreaStockBo areaStock = new AreaStockBo();
@@ -737,10 +784,34 @@ public class ZhongChePushController {
         if(ObjectUtil.isEmpty(accessToken)){
             return ZCR.fail("5006","token不能为空");
         }
+        System.out.println(StpUtil.getTokenTimeout(accessToken));
         if(StpUtil.getTokenTimeout(accessToken) == -2l){
             return ZCR.fail("5005","token_expired");
         }
         return ZCR.ok( null);
     }
 
+    public static void main(String[] args) throws JsonProcessingException {
+        // 1️⃣ 构造请求对象(和你 controller 里的一模一样)
+        ZCTokenBo bo = new ZCTokenBo();
+        bo.setVersion("1.0.0");
+        bo.setTimestamp("20260210162447");
+        bo.setClientId("KFZAVuIyC56");
+        bo.setData("eyJpZCI6ImQwMDk0ZWMzLWUwMzItNDNkZi1iOTVhLTdjZmI0YWM5MTI2MSIsInR5cGUiOiIyMDAyIiwiY29udGVudCI6eyJvcmRlck5vIjoiMjAyNjAyMTAxMTAxNzQxMzAiLCJjYW5jZWxSZWFzb24iOiLkuI3mg7PopoHkuoYifSwidGltZSI6IjIwMjYwMjExMTM1NjAxMTQ5In0=");
+        bo.setAccessToken( "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJsb2dpblR5cGUiOiJsb2dpbiIsImxvZ2luSWQiOiJzeXNfdXNlcjoxIiwicm5TdHIiOiI4U2Zwa1owb3YyS2xLakNPa1BMcjRKcUxWcXExN2FYWSIsImNsaWVudGlkIjoiZTVjZDdlNDg5MWJmOTVkMWQxOTIwNmNlMjRhN2IzMmUiLCJ0ZW5hbnRJZCI6IjAwMDAwMCIsInVzZXJJZCI6MSwidXNlck5hbWUiOiJhZG1pbiIsImRlcHRJZCI6MTAzLCJkZXB0TmFtZSI6IueglOWPkemDqOmXqCIsImRlcHRDYXRlZ29yeSI6IiJ9.fyF_TFAORlA2SQGwQbJFEoT7DiRoWywzykWNcfcaPuU");
+        // 注意:此时不要 setSign
+
+        // 2️⃣ 打印待签名内容(用于和中车排查)
+        String signContent = SignParamUtils.getSignContent(bo);
+        System.out.println("待签名字符串:");
+        System.out.println(signContent);
+
+        // 3️⃣ 生成 SM2 签名
+        String sign = SignParamUtils.generateRequestSign(bo, DEVELOPER_PRIVATE_KEY);
+
+        // 4️⃣ 输出 sign
+        System.out.println("生成的 sign:");
+        System.out.println(sign);
+    }
+
 }

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

@@ -1,11 +1,10 @@
 package org.dromara.external.controller.zhongche.handle.impl;
 
 import cn.hutool.core.collection.CollUtil;
+import cn.hutool.json.JSONUtil;
 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;
@@ -20,6 +19,9 @@ import org.dromara.product.api.RemoteProductService;
 import org.dromara.product.api.domain.zhongche.dto.ProductAggregateDto;
 import org.springframework.stereotype.Component;
 
+import java.math.BigDecimal;
+import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.List;
 import java.util.Map;
 import java.util.function.Function;
@@ -47,6 +49,13 @@ public class AccountActiveMessageHandler implements MallMessageHandler {
     }
 
     @Override
+    public MessageVo handle(MessageBo messageBo) {
+        Map<String, Object> content = (Map<String, Object>) messageBo.getContent();
+        String username = String.valueOf(content.get("username"));
+        return new MessageVo("1");
+    }
+
+    /*@Override
     public MessageVo handle(MessageBo messageBo) {
         Map<String, Object> content = (Map<String, Object>) messageBo.getContent();
         String username = String.valueOf(content.get("username"));
@@ -79,10 +88,11 @@ public class AccountActiveMessageHandler implements MallMessageHandler {
             item.setGoodsId(p.getProductId().toString());
 
             // ===== 品目(只能来自 ExternalProductVo)=====
-            item.setCatalogId(ext.getCategoryId().toString());
-            item.setCatalogName(ext.getCategoryName());
-            item.setStandardCatalogId(ext.getExternalCategoryId().toString());
-            item.setStandardCatalogName(ext.getStandardCatalogName());
+            item.setCatalogId(p.getCategoryId().toString());
+            item.setCatalogName(p.getCategoryName());
+            //TODO没有做品类映射
+            //item.setStandardCatalogId(ext.getExternalCategoryId().toString());
+            //item.setStandardCatalogName(ext.getStandardCatalogName());
 
             // ===== 商品基础 =====
             item.setName(p.getName());
@@ -150,5 +160,7 @@ public class AccountActiveMessageHandler implements MallMessageHandler {
         }
 
         return new MessageVo("1","商品导入成功");
-    }
+    }*/
+
+
 }

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

@@ -2,17 +2,16 @@ 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.common.core.domain.zhongche.aftersale.bo.AfterSaleDetailBo;
+import org.dromara.common.core.domain.zhongche.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.dromara.product.api.domain.dto.OrderReturnDto;
 import org.springframework.stereotype.Component;
-import org.springframework.web.bind.annotation.RequestBody;
 
 /**
  * author
@@ -24,22 +23,30 @@ import org.springframework.web.bind.annotation.RequestBody;
 public class AfterSaleApplyMessageHandler implements MallMessageHandler {
 
     private final ZhongChePullController zhongChePullController;
+
+    private final RemoteExternalOrderService remoteExternalOrderService;
     @Override
     public MallMessageTypeEnum supportType() {
         return MallMessageTypeEnum.AFTER_SALE_APPLY;
     }
 
     @Override
+    public MessageVo handle(MessageBo messageBo) {
+        return new MessageVo("1");
+    }
+
+    /*@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);
 
+        OrderReturnDto orderReturnDto = remoteExternalOrderService.createReturnOrder(afterSaleDetailVo);
 
-        if (afterSaleDetailVo != null){
+        if (orderReturnDto.getSuccess() == true){
             return new MessageVo("1");
         }
-        return new MessageVo("0","取消订单失败");
-    }
+        return new MessageVo("0",orderReturnDto.getCancelReason());
+    }*/
 }

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

@@ -27,15 +27,17 @@ public class AfterSaleCancelMessageHandler implements MallMessageHandler {
     }
 
     @Override
+    public MessageVo handle(MessageBo messageBo) {
+        return new MessageVo("1");
+    }
+    /*@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","取消订单失败");
-    }
+    }*/
 }

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

@@ -0,0 +1,49 @@
+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.dromara.product.api.domain.dto.OrderReturnDto;
+import org.springframework.stereotype.Component;
+
+/**
+ * author
+ * 时间:2026/2/7,15:22
+ */
+@Component
+@Slf4j
+@RequiredArgsConstructor
+public class AfterSaleDeliverMessageHandler implements MallMessageHandler {
+
+
+    private final RemoteExternalOrderService remoteExternalOrderService;
+
+    @Override
+    public MallMessageTypeEnum supportType() {
+        return MallMessageTypeEnum.AFTER_SALE_DELIVER;
+    }
+
+    @Override
+    public MessageVo handle(MessageBo messageBo) {
+        return new MessageVo("1");
+    }
+    /*@Override
+    public MessageVo handle(MessageBo messageBo) {
+        String afterSaleNo = (String) messageBo.getContent().get("afterSaleNo");
+        String expressCode = (String) messageBo.getContent().get("expressCode");
+        String expressCompanyName = (String) messageBo.getContent().get("expressCompanyName");
+        String freight = (String) messageBo.getContent().get("freight");
+        String deliverTime = (String) messageBo.getContent().get("deliverTime");
+        OrderReturnDto dto = remoteExternalOrderService.createOrderDeliver(afterSaleNo,expressCode,expressCompanyName,freight,deliverTime );
+
+        if (dto.getSuccess() == true){
+            return new MessageVo("1");
+        }else {
+            return new MessageVo("0",dto.getCancelReason());
+        }
+    }*/
+}

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

@@ -0,0 +1,46 @@
+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.dromara.product.api.domain.dto.OrderReturnDto;
+import org.springframework.stereotype.Component;
+
+/**
+ * author
+ * 时间:2026/2/7,16:35
+ */
+@Component
+@Slf4j
+@RequiredArgsConstructor
+public class AfterSaleReceiveConfirmMessageHandler implements MallMessageHandler {
+
+
+    private final RemoteExternalOrderService remoteExternalOrderService;
+
+    @Override
+    public MallMessageTypeEnum supportType() {
+        return MallMessageTypeEnum.AFTER_SALE_RECEIVE_CONFIRM;
+    }
+
+    @Override
+    public MessageVo handle(MessageBo messageBo) {
+        return new MessageVo("1");
+    }
+    /*@Override
+    public MessageVo handle(MessageBo messageBo) {
+        String afterSaleNo = (String) messageBo.getContent().get("afterSaleNo");
+        String outgoingCode = (String) messageBo.getContent().get("outgoingCode");
+        OrderReturnDto dto = remoteExternalOrderService.confirmOrderDeliver(afterSaleNo,outgoingCode);
+
+        if (dto.getSuccess() == true){
+            return new MessageVo("1");
+        }else {
+            return new MessageVo("0",dto.getCancelReason());
+        }
+    }*/
+}

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

@@ -2,7 +2,6 @@ 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;

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

@@ -2,7 +2,6 @@ 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;

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

@@ -2,7 +2,6 @@ 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;

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

@@ -2,7 +2,6 @@ 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;

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

@@ -2,7 +2,6 @@ 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;

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

@@ -2,7 +2,6 @@ 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;

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

@@ -2,8 +2,6 @@ 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;

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

@@ -2,7 +2,6 @@ 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;

+ 6 - 5
ruoyi-modules/ruoyi-external/src/main/java/org/dromara/external/controller/zhongche/handle/impl/GoodsAuditPassMessageHandler.java

@@ -29,6 +29,10 @@ public class GoodsAuditPassMessageHandler implements MallMessageHandler {
     }
 
     @Override
+    public MessageVo handle(MessageBo messageBo) {
+        return new MessageVo("1");
+    }
+    /*@Override
     public MessageVo handle(MessageBo messageBo) {
         Map<String, Object> content = (Map<String, Object>) messageBo.getContent();
 
@@ -37,16 +41,13 @@ public class GoodsAuditPassMessageHandler implements MallMessageHandler {
         if (StrUtil.isBlank(goodsIdsStr)) {
             return new MessageVo("0", "goodsIds为空");
         }
-
-
         // 更新
         boolean update = externalProductService.lambdaUpdate()
             .eq(ExternalProduct::getProductId, Long.parseLong(goodsIdsStr))
             .set(ExternalProduct::getPushStatus, 1L)
             .update();
-
         return update
-            ? new MessageVo("1", "处理成功")
+            ? new MessageVo("1")
             : new MessageVo("0", "处理失败");
-    }
+    }*/
 }

+ 6 - 5
ruoyi-modules/ruoyi-external/src/main/java/org/dromara/external/controller/zhongche/handle/impl/GoodsAuditRejectMessageHandler.java

@@ -29,6 +29,10 @@ public class GoodsAuditRejectMessageHandler implements MallMessageHandler {
     }
 
     @Override
+    public MessageVo handle(MessageBo messageBo) {
+        return new MessageVo("1");
+    }
+    /*@Override
     public MessageVo handle(MessageBo messageBo) {
         Map<String, Object> content = (Map<String, Object>) messageBo.getContent();
 
@@ -38,17 +42,14 @@ public class GoodsAuditRejectMessageHandler implements MallMessageHandler {
         if (StrUtil.isBlank(goodsIdsStr)) {
             return new MessageVo("0", "goodsIds为空");
         }
-
-
         // 更新
         boolean update = externalProductService.lambdaUpdate()
             .eq(ExternalProduct::getProductId, Long.parseLong(goodsIdsStr))
             .set(ExternalProduct::getPushStatus, 2L)
             .set(ExternalProduct::getRemark, auditMsg)
             .update();
-
         return update
-            ? new MessageVo("1", "处理成功")
+            ? new MessageVo("1")
             : new MessageVo("0", "处理失败");
-    }
+    }*/
 }

+ 6 - 2
ruoyi-modules/ruoyi-external/src/main/java/org/dromara/external/controller/zhongche/handle/impl/GoodsImportBlockMessageHandler.java

@@ -33,6 +33,10 @@ public class GoodsImportBlockMessageHandler implements MallMessageHandler {
     }
 
     @Override
+    public MessageVo handle(MessageBo messageBo) {
+        return new MessageVo("1");
+    }
+    /*@Override
     public MessageVo handle(MessageBo messageBo) {
         Map<String, Object> content = (Map<String, Object>) messageBo.getContent();
 
@@ -65,7 +69,7 @@ public class GoodsImportBlockMessageHandler implements MallMessageHandler {
         log.info("商品导入拦截处理完成,productIds={}, msg={}", productIds, msg);
 
         return update
-            ? new MessageVo("1", "拦截处理成功")
+            ? new MessageVo("1")
             : new MessageVo("0", "拦截处理失败");
-    }
+    }*/
 }

+ 7 - 3
ruoyi-modules/ruoyi-external/src/main/java/org/dromara/external/controller/zhongche/handle/impl/GoodsOffShelfMessageHandler.java

@@ -25,10 +25,14 @@ public class GoodsOffShelfMessageHandler implements MallMessageHandler {
     private final IExternalProductService externalProductService;
     @Override
     public MallMessageTypeEnum supportType() {
-        return MallMessageTypeEnum.GOODS_AUDIT_PASS;
+        return MallMessageTypeEnum.GOODS_OFF_SHELF;
     }
 
     @Override
+    public MessageVo handle(MessageBo messageBo) {
+        return new MessageVo("1");
+    }
+    /*@Override
     public MessageVo handle(MessageBo messageBo) {
         Map<String, Object> content = (Map<String, Object>) messageBo.getContent();
         String goodsIdsStr = (String) content.get("goodsIds");
@@ -46,7 +50,7 @@ public class GoodsOffShelfMessageHandler implements MallMessageHandler {
             .update();
 
         return update
-            ? new MessageVo("1", "处理成功")
+            ? new MessageVo("1")
             : new MessageVo("0", "处理失败");
-    }
+    }*/
 }

+ 7 - 6
ruoyi-modules/ruoyi-external/src/main/java/org/dromara/external/controller/zhongche/handle/impl/GoodsOnShelfFailMessageHandler.java

@@ -25,10 +25,14 @@ public class GoodsOnShelfFailMessageHandler implements MallMessageHandler {
     private final IExternalProductService externalProductService;
     @Override
     public MallMessageTypeEnum supportType() {
-        return MallMessageTypeEnum.GOODS_AUDIT_PASS;
+        return MallMessageTypeEnum.GOODS_ON_SHELF_FAIL;
     }
 
     @Override
+    public MessageVo handle(MessageBo messageBo) {
+        return new MessageVo("1");
+    }
+    /*@Override
     public MessageVo handle(MessageBo messageBo) {
         Map<String, Object> content = (Map<String, Object>) messageBo.getContent();
         String goodsIdsStr = (String) content.get("goodsIds");
@@ -36,17 +40,14 @@ public class GoodsOnShelfFailMessageHandler implements MallMessageHandler {
         if (StrUtil.isBlank(goodsIdsStr)) {
             return new MessageVo("0", "goodsIds为空");
         }
-
-
         // 更新下架
         boolean update = externalProductService.lambdaUpdate()
             .eq(ExternalProduct::getProductId, Long.parseLong(goodsIdsStr))
             .set(ExternalProduct::getProductStatus, 0L)
             .set(ExternalProduct::getRemark, message)
             .update();
-
         return update
-            ? new MessageVo("1", "处理成功")
+            ? new MessageVo("1")
             : new MessageVo("0", "处理失败");
-    }
+    }*/
 }

+ 6 - 4
ruoyi-modules/ruoyi-external/src/main/java/org/dromara/external/controller/zhongche/handle/impl/GoodsWaitAuditMessageHandler.java

@@ -31,6 +31,10 @@ public class GoodsWaitAuditMessageHandler implements MallMessageHandler {
     }
 
     @Override
+    public MessageVo handle(MessageBo messageBo) {
+        return new MessageVo("1");
+    }
+    /*@Override
     public MessageVo handle(MessageBo messageBo) {
         Map<String, Object> content = (Map<String, Object>) messageBo.getContent();
 
@@ -39,8 +43,6 @@ public class GoodsWaitAuditMessageHandler implements MallMessageHandler {
         if (StrUtil.isBlank(goodsIdsStr)) {
             return new MessageVo("0", "goodsIds为空");
         }
-
-
         // 更新
         boolean update = externalProductService.lambdaUpdate()
             .eq(ExternalProduct::getProductId, Long.parseLong(goodsIdsStr))
@@ -48,7 +50,7 @@ public class GoodsWaitAuditMessageHandler implements MallMessageHandler {
             .update();
 
         return update
-            ? new MessageVo("1", "处理成功")
+            ? new MessageVo("1")
             : new MessageVo("0", "处理失败");
-    }
+    }*/
 }

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

@@ -33,8 +33,6 @@ public class InvoiceApplyMessageHandler implements MallMessageHandler {
 
     private final ZhongChePullController zhongChePullController;
 
-
-
     @Override
     public MallMessageTypeEnum supportType() {
         return MallMessageTypeEnum.INVOICE_APPLY;

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

@@ -3,11 +3,15 @@ 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.OrderCancelAuditBo;
 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.dromara.product.api.RemoteExternalOrderService;
+import org.dromara.product.api.domain.dto.OrderNoDto;
 import org.springframework.stereotype.Component;
+import org.springframework.web.bind.annotation.RequestBody;
 
 /**
  * author
@@ -21,6 +25,8 @@ public class OrderCancelApplyMessageHandler implements MallMessageHandler {
 
     private final RemoteExternalOrderService remoteExternalOrderService;
 
+    private final ZhongChePullController zhongChePullController;
+
     @Override
     public MallMessageTypeEnum supportType() {
         return MallMessageTypeEnum.ORDER_CANCEL_APPLY;
@@ -28,14 +34,19 @@ public class OrderCancelApplyMessageHandler implements MallMessageHandler {
 
     @Override
     public MessageVo handle(MessageBo messageBo) {
+        return new MessageVo("1");
+    }
+    /*@Override
+    public MessageVo handle(MessageBo messageBo) {
+        //这个得手动通过还是不通过-----供应商可通过5.3.11审核订单取消接口通过/不通过此申请) 目前是直接通过
         String orderNo = (String) messageBo.getContent().get("orderNo");
         String cancelReason = (String) messageBo.getContent().get("cancelReason");
-
-        boolean b = remoteExternalOrderService.cancelOrder(orderNo, cancelReason);
-
-        if (b){
+        OrderNoDto b = remoteExternalOrderService.cancelOrder(orderNo, cancelReason);
+        OrderCancelAuditBo bo = new OrderCancelAuditBo(orderNo, "1", null);
+        zhongChePullController.mallOrderCancelAuditJudge(bo);
+        if (b.getSuccess()){
             return new MessageVo("1");
         }
         return new MessageVo("0","取消订单失败");
-    }
+    }*/
 }

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

@@ -3,13 +3,11 @@ 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.dromara.product.api.domain.dto.OrderNoDto;
 import org.springframework.stereotype.Component;
 
 /**
@@ -29,16 +27,16 @@ public class OrderCancelMessageHandler implements MallMessageHandler {
         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){
+        OrderNoDto orderNoDto= remoteExternalOrderService.cancelOrder(orderNo, cancelReason);
+        if (orderNoDto.getSuccess() == true){
             return new MessageVo("1");
         }
-        return new MessageVo("0","取消订单失败");
+        return new MessageVo("0",orderNoDto.getCancelReason());
     }
 }

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

@@ -2,14 +2,25 @@ package org.dromara.external.controller.zhongche.handle.impl;
 
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
+import org.apache.dubbo.config.annotation.DubboReference;
+import org.dromara.common.core.domain.zhongche.domain.OrderGoodsItem;
+import org.dromara.common.core.domain.zhongche.domain.ZhongCheOrderInvoice;
+import org.dromara.common.core.domain.zhongche.vo.OrderDetailVo;
 import org.dromara.external.api.zhongche.domain.bo.MessageBo;
+import org.dromara.external.api.zhongche.domain.bo.OrderConfirmBo;
 import org.dromara.external.api.zhongche.domain.bo.OrderDetailBo;
+import org.dromara.external.api.zhongche.domain.vo.GoodsUpdateVo;
 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.dromara.product.api.domain.dto.OrderNoDto;
 import org.springframework.stereotype.Component;
+import org.springframework.web.bind.annotation.RequestBody;
+
+import java.math.BigDecimal;
+import java.util.Collections;
 
 @Component
 @Slf4j
@@ -18,22 +29,108 @@ public class OrderCreateMessageHandler implements MallMessageHandler {
 
     private final ZhongChePullController zhongChePullController;
 
+    @DubboReference
+    private final RemoteExternalOrderService remoteExternalOrderService;
+
     @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){
+        OrderNoDto orderNoDto = remoteExternalOrderService.createZhongCheOrder(orderDetailVo);
+        if (orderNoDto.getSuccess()){
             return new MessageVo("1");
+        }else {
+            return new MessageVo("0","获取订单详情失败");
         }
-
-        return new MessageVo("0","获取订单详情失败");
     }
+
+
+    /*@Override
+    public MessageVo handle(MessageBo messageBo) {
+        //获取中车订单号获取订单详情,我们电商平台没有接单功能胡哥说的,然后默认接单 就发起接单的请求
+        String orderNo = (String) messageBo.getContent().get("orderNo");
+        log.info("处理新订单消息,orderNo={}", orderNo);
+        OrderDetailVo orderDetailVo = new OrderDetailVo();
+
+// ===== 基本信息 =====
+        orderDetailVo.setOrderNo("20260210110174131");
+        orderDetailVo.setPurchaserOrderNo("2026021010452504");
+        orderDetailVo.setPreOrder(0);
+        orderDetailVo.setMallOrderNo(null);
+        orderDetailVo.setOrderStatus("1");
+        orderDetailVo.setOrderAmount(new BigDecimal("205.24"));
+        orderDetailVo.setFreight(new BigDecimal("0.00"));
+
+// ===== 收货信息 =====
+        orderDetailVo.setName("111");
+        orderDetailVo.setProvinceId("1");
+        orderDetailVo.setCityId("2800");
+        orderDetailVo.setCountyId("55835");
+        orderDetailVo.setTownId("0");
+        orderDetailVo.setAddress("中车智程");
+        orderDetailVo.setZip(null);
+        orderDetailVo.setMobile("13381115928");
+        orderDetailVo.setPhone(null);
+        orderDetailVo.setEmail("service_yg@bosssoft.com.cn");
+
+// ===== 下单信息 =====
+        orderDetailVo.setMemo("");
+        orderDetailVo.setOrderTime("2026-02-10 17:25:18");
+        orderDetailVo.setBuyer("常恒瑀");
+        orderDetailVo.setBuyerMobile("18801195315");
+        orderDetailVo.setPurchaserName("中国中车");
+        orderDetailVo.setPurchaserDeptName("中国中车-中车科技园发展有限公司-中车智程文化科技(北京)有限公司");
+
+// ===== 支付信息 =====
+        orderDetailVo.setPaymentType("01");
+        orderDetailVo.setVoucher("0");
+        orderDetailVo.setPayClient("0");
+        orderDetailVo.setPaySerialNum(null);
+        orderDetailVo.setPayAccount(null);
+        orderDetailVo.setPayMoney(null);
+        orderDetailVo.setPayPrestore(null);
+
+        OrderGoodsItem goodsItem = new OrderGoodsItem();
+        goodsItem.setGoodsId("362032");
+        goodsItem.setNum(new BigDecimal("7.0000"));
+        goodsItem.setPrice(new BigDecimal("29.3200"));
+        goodsItem.setSubAmount(new BigDecimal("205.24"));
+        goodsItem.setWishDeliveryDate(null);
+
+        orderDetailVo.setOrderGoods(Collections.singletonList(goodsItem));
+        ZhongCheOrderInvoice invoice = new ZhongCheOrderInvoice();
+        invoice.setInvoiceType("2");
+        invoice.setSelectedInvoiceTitle("5");
+        invoice.setCompanyName("中车智程文化科技(北京)");
+        invoice.setInvoiceContent("1");
+        invoice.setInvoiceName("王琳");
+        invoice.setInvoicePhone("15249101907");
+        invoice.setInvoiceFullAddress("北京海淀区羊坊店街道北京市海淀区羊坊店路11号");
+        invoice.setRegCompanyName("中车智程文化科技(北京)");
+        invoice.setRegCode("91110108MAC4385K6J");
+        invoice.setRegAddr("北京市海淀区羊坊店路11号四层428室测试");
+        invoice.setRegPhone("010-51891021");
+        invoice.setRegBank("中国工商银行股份有限公司北京玉渊潭支行测试");
+        invoice.setRegBankAccount("111111111");
+        orderDetailVo.setOrderInvoice(invoice);
+        OrderNoDto orderNoDto = remoteExternalOrderService.createZhongCheOrder(orderDetailVo);
+        if (orderNoDto.getSuccess()){
+            return new MessageVo("1");
+        }else {
+            return new MessageVo("0","获取订单详情失败");
+        }
+    }*/
+
+
+
 }

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

@@ -0,0 +1,64 @@
+package org.dromara.external.controller.zhongche.handle.impl;
+
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.dubbo.config.annotation.DubboReference;
+import org.dromara.common.core.domain.zhongche.vo.OrderDetailVo;
+import org.dromara.external.api.zhongche.domain.bo.MessageBo;
+import org.dromara.external.api.zhongche.domain.bo.OrderConfirmBo;
+import org.dromara.external.api.zhongche.domain.bo.OrderDetailBo;
+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.dromara.product.api.RemoteExternalOrderService;
+import org.dromara.product.api.domain.dto.OrderNoDto;
+import org.springframework.stereotype.Component;
+
+/**
+ * author
+ * 时间:2026/2/10,9:18
+ */
+@Component
+@Slf4j
+@RequiredArgsConstructor
+public class OrderPayNoticeMessageHandler implements MallMessageHandler {
+
+    private final ZhongChePullController zhongChePullController;
+
+    @DubboReference
+    private final RemoteExternalOrderService remoteExternalOrderService;
+
+    @Override
+    public MallMessageTypeEnum supportType() {
+        return MallMessageTypeEnum.ORDER_PAY_NOTICE;
+    }
+
+    @Override
+    public MessageVo handle(MessageBo messageBo) {
+        return new MessageVo("1");
+    }
+    /*@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);
+        OrderNoDto orderNoDto = remoteExternalOrderService.createZhongCheOrder(orderDetailVo);
+        OrderConfirmBo bo = new OrderConfirmBo();
+
+        if (orderNoDto.getSuccess() == true){
+            //中车电子商城订单号
+            bo.setOrderNo(orderNo);
+            //电商平台订单号
+            bo.setMallOrderNo(orderNoDto.getOrderNo());
+            //发起接单
+            zhongChePullController.mallOrderConfirm(bo);
+            return new MessageVo("1");
+        }else {
+            return new MessageVo("0","获取订单详情失败");
+        }
+    }*/
+}

Некоторые файлы не были показаны из-за большого количества измененных файлов