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

Merge branch 'ljy'

# Conflicts:
#	ruoyi-modules/ruoyi-order/src/main/java/org/dromara/order/service/IOrderMainService.java
#	ruoyi-modules/ruoyi-order/src/main/java/org/dromara/order/service/impl/OrderMainServiceImpl.java
Lijingyang 1 месяц назад
Родитель
Сommit
df67d3ae88
41 измененных файлов с 2434 добавлено и 158 удалено
  1. 18 0
      ruoyi-api/ruoyi-api-external/src/main/java/org/dromara/external/api/zhongche/RemoteZhongChePullService.java
  2. 3 1
      ruoyi-api/ruoyi-api-external/src/main/java/org/dromara/external/api/zhongche/domain/bo/OrderConfirmBo.java
  3. 3 1
      ruoyi-api/ruoyi-api-external/src/main/java/org/dromara/external/api/zhongche/domain/bo/OrderRejectBo.java
  4. 3 1
      ruoyi-api/ruoyi-api-external/src/main/java/org/dromara/external/api/zhongche/domain/vo/GoodsUpdateVo.java
  5. 7 0
      ruoyi-api/ruoyi-api-product/src/main/java/org/dromara/product/api/RemoteProductService.java
  6. 28 0
      ruoyi-api/ruoyi-api-product/src/main/java/org/dromara/product/api/domain/zhongche/dto/OrderProductDto.java
  7. 2 1
      ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/RemoteComLogisticsCompanyService.java
  8. 38 0
      ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/exception/api/ZhongcheException.java
  9. 2 1
      ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/interceptor/PlatformDataScopeInterceptor.java
  10. 7 0
      ruoyi-common/ruoyi-common-web/src/main/java/org/dromara/common/web/handler/GlobalExceptionHandler.java
  11. 97 114
      ruoyi-modules/ruoyi-external/src/main/java/org/dromara/external/controller/zhongche/ZhongChePullController.java
  12. 2 2
      ruoyi-modules/ruoyi-external/src/main/java/org/dromara/external/controller/zhongche/ZhongChePushController.java
  13. 53 6
      ruoyi-modules/ruoyi-external/src/main/java/org/dromara/external/controller/zhongche/handle/impl/AfterSaleApplyMessageHandler.java
  14. 4 4
      ruoyi-modules/ruoyi-external/src/main/java/org/dromara/external/controller/zhongche/handle/impl/AfterSaleReceiveConfirmMessageHandler.java
  15. 47 0
      ruoyi-modules/ruoyi-external/src/main/java/org/dromara/external/controller/zhongche/handle/impl/AfterSaleRefundNoticeMessageHandler.java
  16. 1 1
      ruoyi-modules/ruoyi-external/src/main/java/org/dromara/external/controller/zhongche/handle/impl/BillConfirmMessageHandler.java
  17. 1 1
      ruoyi-modules/ruoyi-external/src/main/java/org/dromara/external/controller/zhongche/handle/impl/BillModifyMessageHandler.java
  18. 1 1
      ruoyi-modules/ruoyi-external/src/main/java/org/dromara/external/controller/zhongche/handle/impl/BillRuleCreateMessageHandler.java
  19. 1 1
      ruoyi-modules/ruoyi-external/src/main/java/org/dromara/external/controller/zhongche/handle/impl/BillWaitInvoiceMessageHandler.java
  20. 6 6
      ruoyi-modules/ruoyi-external/src/main/java/org/dromara/external/controller/zhongche/handle/impl/OrderCreateMessageHandler.java
  21. 1 2
      ruoyi-modules/ruoyi-external/src/main/java/org/dromara/external/controller/zhongche/handle/impl/OrderReceiveConfirmMessageHandler.java
  22. 36 0
      ruoyi-modules/ruoyi-external/src/main/java/org/dromara/external/dubbo/RemoteZhongChePullServiceImpl.java
  23. 167 0
      ruoyi-modules/ruoyi-order/src/main/java/org/dromara/order/controller/zhongche/ZhongCheOrderMainController.java
  24. 106 0
      ruoyi-modules/ruoyi-order/src/main/java/org/dromara/order/controller/zhongche/ZhongCheOrderReturnController.java
  25. 16 0
      ruoyi-modules/ruoyi-order/src/main/java/org/dromara/order/domain/OrderMainCrrcExt.java
  26. 294 0
      ruoyi-modules/ruoyi-order/src/main/java/org/dromara/order/domain/ZhongCheOrderMain.java
  27. 281 0
      ruoyi-modules/ruoyi-order/src/main/java/org/dromara/order/domain/bo/ZhongCheOrderMainBo.java
  28. 3 0
      ruoyi-modules/ruoyi-order/src/main/java/org/dromara/order/domain/vo/OrderDeliverVo.java
  29. 21 0
      ruoyi-modules/ruoyi-order/src/main/java/org/dromara/order/domain/vo/OrderMainVo.java
  30. 337 0
      ruoyi-modules/ruoyi-order/src/main/java/org/dromara/order/domain/vo/ZhongCheOrderMainVo.java
  31. 66 12
      ruoyi-modules/ruoyi-order/src/main/java/org/dromara/order/dubbo/RemoteExternalOrderServiceImpl.java
  32. 23 0
      ruoyi-modules/ruoyi-order/src/main/java/org/dromara/order/mapper/ZhongCheOrderMainMapper.java
  33. 20 0
      ruoyi-modules/ruoyi-order/src/main/java/org/dromara/order/service/IOrderMainService.java
  34. 8 0
      ruoyi-modules/ruoyi-order/src/main/java/org/dromara/order/service/IOrderReturnService.java
  35. 86 0
      ruoyi-modules/ruoyi-order/src/main/java/org/dromara/order/service/IZhongCheOrderMainService.java
  36. 189 3
      ruoyi-modules/ruoyi-order/src/main/java/org/dromara/order/service/impl/OrderMainServiceImpl.java
  37. 7 0
      ruoyi-modules/ruoyi-order/src/main/java/org/dromara/order/service/impl/OrderReturnServiceImpl.java
  38. 324 0
      ruoyi-modules/ruoyi-order/src/main/java/org/dromara/order/service/impl/ZhongCheOrderMainServiceImpl.java
  39. 35 0
      ruoyi-modules/ruoyi-order/src/main/resources/mapper/order/ZhongCheOrderMainMapper.xml
  40. 61 0
      ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/dubbo/RemoteProductServiceImpl.java
  41. 29 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/dubbo/RemoteComLogisticsCompanyServiceImpl.java

+ 18 - 0
ruoyi-api/ruoyi-api-external/src/main/java/org/dromara/external/api/zhongche/RemoteZhongChePullService.java

@@ -0,0 +1,18 @@
+package org.dromara.external.api.zhongche;
+
+import org.dromara.common.core.exception.api.ZhongcheException;
+import org.dromara.external.api.zhongche.domain.bo.OrderConfirmBo;
+import org.dromara.external.api.zhongche.domain.bo.OrderRejectBo;
+import org.dromara.external.api.zhongche.domain.vo.GoodsUpdateVo;
+import org.springframework.web.bind.annotation.RequestBody;
+
+/**
+ * author
+ * 时间:2026/2/25,17:49
+ */
+public interface RemoteZhongChePullService {
+    //接单
+    GoodsUpdateVo mallOrderConfirm(OrderConfirmBo bo) throws ZhongcheException;
+    //拒单
+    GoodsUpdateVo mallOrderReject( OrderRejectBo bo) throws ZhongcheException;
+}

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

@@ -4,6 +4,8 @@ import lombok.AllArgsConstructor;
 import lombok.Data;
 import lombok.NoArgsConstructor;
 
+import java.io.Serializable;
+
 /**
  * 接单的业务请求参数
  * 对应 5.3.2.4.1 业务参数
@@ -11,7 +13,7 @@ import lombok.NoArgsConstructor;
 @Data
 @NoArgsConstructor
 @AllArgsConstructor
-public class OrderConfirmBo {
+public class OrderConfirmBo implements Serializable {
     /**
      * 中车电子商城订单号
      * 必填

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

@@ -4,6 +4,8 @@ import lombok.AllArgsConstructor;
 import lombok.Data;
 import lombok.NoArgsConstructor;
 
+import java.io.Serializable;
+
 /**
  * 拒单的业务请求参数
  * 对应 5.3.4.4.1 业务参数
@@ -11,7 +13,7 @@ import lombok.NoArgsConstructor;
 @Data
 @NoArgsConstructor
 @AllArgsConstructor
-public class OrderRejectBo {
+public class OrderRejectBo implements Serializable {
     /**
      * 中车电子商城订单号
      * 必填

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

@@ -4,6 +4,8 @@ import lombok.AllArgsConstructor;
 import lombok.Data;
 import lombok.NoArgsConstructor;
 
+import java.io.Serializable;
+
 /**
  * author
  * 时间:2026/1/6,13:56
@@ -11,7 +13,7 @@ import lombok.NoArgsConstructor;
 @Data
 @NoArgsConstructor
 @AllArgsConstructor
-public class GoodsUpdateVo {
+public class GoodsUpdateVo implements Serializable {
     /**
      * 结果:0-失败 1-成功
      */

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

@@ -8,6 +8,7 @@ import org.dromara.product.api.domain.ProductVo;
 import org.dromara.product.api.domain.SiteProductRemoteBo;
 import org.dromara.product.api.domain.SiteProductRemoteResult;
 import org.dromara.product.api.domain.SiteProductRemoteVo;
+import org.dromara.product.api.domain.zhongche.dto.OrderProductDto;
 import org.dromara.product.api.domain.zhongche.dto.ProductAggregateDto;
 import org.dromara.product.api.domain.zhongche.dto.StocksResultDto;
 import org.dromara.product.api.domain.RemoteProductBrand;
@@ -91,6 +92,12 @@ public interface RemoteProductService {
      */
     List<ProductAggregateDto> getProductInfo(List<Long> productIds);
 
+    /**
+     * 给订单商品赋值
+     * @param productIds
+     * @return
+     */
+    List<OrderProductDto> buildOrderProduct(List<Long> productIds);
 
     /**
      * 库存锁定

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

@@ -0,0 +1,28 @@
+package org.dromara.product.api.domain.zhongche.dto;
+
+import lombok.Data;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+
+/**
+ * author
+ * 时间:2026/2/24,17:27
+ * 给orderProduct表赋值
+ */
+@Data
+public class OrderProductDto implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    private Long productId;
+    //
+    private String productNo;
+
+    private String productName;
+    //
+    private Long productUnitId;
+
+    private String unit;
+
+    private String barImgUrls;
+}

+ 2 - 1
ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/RemoteComLogisticsCompanyService.java

@@ -4,6 +4,7 @@ import org.dromara.common.core.domain.zhongche.domain.DeliveryTrack;
 import org.dromara.common.core.validate.enumd.EnumPattern;
 
 import java.util.List;
+import java.util.Map;
 
 /**
  * author
@@ -12,5 +13,5 @@ import java.util.List;
 public interface RemoteComLogisticsCompanyService {
     String selectLogisticsCompanyNameById(Long ids);
 
-
+    Map<Long ,String> selectLogisticsCompanyNameByIds(List<Long> ids);
 }

+ 38 - 0
ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/exception/api/ZhongcheException.java

@@ -0,0 +1,38 @@
+package org.dromara.common.core.exception.api;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.NoArgsConstructor;
+
+import java.io.Serial;
+
+/**
+ * author
+ * 时间:2026/2/26,10:11
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@NoArgsConstructor
+@AllArgsConstructor
+public class ZhongcheException extends RuntimeException {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 错误码
+     */
+    private Integer code;
+
+    /**
+     * 错误提示
+     */
+    private String message;
+
+    public ZhongcheException(String message) {
+        this.code = 500;
+        this.message = message;
+    }
+
+}

+ 2 - 1
ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/interceptor/PlatformDataScopeInterceptor.java

@@ -78,6 +78,7 @@ public class PlatformDataScopeInterceptor implements Interceptor {
         "com_",
         "product_",
         "flow_",
+        "order_",
         "supplier_level",
         "enterprise_scale",
         "industry_category",
@@ -212,7 +213,7 @@ public class PlatformDataScopeInterceptor implements Interceptor {
         }
 
         // 前缀匹配
-        return tableName.startsWith("qrtz_") || tableName.startsWith("product_") || tableName.startsWith("com_") || tableName.startsWith("supplier_") || tableName.startsWith("flow_");
+        return tableName.startsWith("qrtz_") || tableName.startsWith("product_") || tableName.startsWith("com_") || tableName.startsWith("supplier_") || tableName.startsWith("flow_") || tableName.startsWith("order_");
     }
 
     /**

+ 7 - 0
ruoyi-common/ruoyi-common-web/src/main/java/org/dromara/common/web/handler/GlobalExceptionHandler.java

@@ -11,6 +11,7 @@ import lombok.extern.slf4j.Slf4j;
 import org.dromara.common.core.domain.R;
 import org.dromara.common.core.exception.ServiceException;
 import org.dromara.common.core.exception.SseException;
+import org.dromara.common.core.exception.api.ZhongcheException;
 import org.dromara.common.core.exception.base.BaseException;
 import org.dromara.common.core.utils.StreamUtils;
 import org.dromara.common.json.utils.JsonUtils;
@@ -48,6 +49,12 @@ public class GlobalExceptionHandler {
         return R.fail(HttpStatus.HTTP_BAD_METHOD, "请求方式不正确!");
     }
 
+    @ExceptionHandler(ZhongcheException.class)
+    public R<Void> handleZhongcheException(ZhongcheException e) {
+        log.error("中车系统异常 : {}", e.getMessage());
+        return R.fail(e.getMessage());
+    }
+
     /**
      * 业务异常
      */

+ 97 - 114
ruoyi-modules/ruoyi-external/src/main/java/org/dromara/external/controller/zhongche/ZhongChePullController.java

@@ -14,6 +14,7 @@ import org.dromara.common.core.domain.zhongche.aftersale.domain.AfterSaleDeliver
 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.common.core.exception.api.ZhongcheException;
 import org.dromara.external.api.zhongche.domain.*;
 import org.dromara.external.api.zhongche.domain.bo.*;
 import org.dromara.external.api.zhongche.domain.invoice.bo.*;
@@ -198,109 +199,6 @@ 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) {
@@ -317,7 +215,10 @@ public class ZhongChePullController {
     //他们售后发货了
 //{"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":"2101","content":{"afterSaleNo":"1471137739549315072"},"time":"20260211135601149"}
 //{"id":"d0094ec3-e032-43df-b95a-7cfb4ac91261","type":"2002","content":{"orderNo":"20260210110174130","cancelReason":"不想要了"},"time":"20260211135601149"}
+//{"id":"d0094ec3-e032-43df-b95a-7cfb4ac91261","type":"2003","content":{"orderNo":"20260210110174131","outgoingCode":"123456789"},"time":"20260211135601149"}
+//{"outgoingCode":"123456789","waybillType":"1"}
 
     //查询订单详情
     /*public static void main(String[] args) {
@@ -380,30 +281,112 @@ public class ZhongChePullController {
         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) {
+        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) {
+        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) {
+        AfterSaleRefundBo bo = new AfterSaleRefundBo();
+        bo.setAfterSaleNo("1471151366025121792");
+        ZhongChePullController zhongChePullController = new ZhongChePullController();
+        GoodsUpdateVo vo = zhongChePullController.mallAftersaleRefund(bo);
+        System.out.println(vo);
+    }*/
     //5.2.1	商品导入
     @PostMapping("/egoods/import")
-    public GoodsImportVo egoodsImport(@RequestBody GoodsImportBo bo) {
+    public GoodsImportVo egoodsImport(@RequestBody GoodsImportBo bo) throws ZhongcheException {
         ZCR responseDto = doZcPost("/api/egoods/import", bo);
         //解析业务响应参数
         GoodsImportVo zcr = parseZcResponse(responseDto, GoodsImportVo.class);
         return zcr;
     }
-    private <V> V parseZcResponse(ZCR responseDto, Class<V> voClass) {
+    private <V> V parseZcResponse(ZCR responseDto, Class<V> voClass) throws ZhongcheException {
         // 1. 基础校验
         if (responseDto == null) {
-            throw new RuntimeException("中车响应为空");
+            throw new ZhongcheException("中车响应为空");
         }
 
         if (!"0".equals(responseDto.getRespCode())) {
-            throw new RuntimeException(
-                "中车接口返回失败:" + responseDto.getRespCode() + " - " + responseDto.getRespMsg()
-            );
+            throw new ZhongcheException("中车接口返回失败:" + responseDto.getRespCode() + " - " + responseDto.getRespMsg());
         }
 
         if (StrUtil.isBlank(responseDto.getData())) {
-            throw new RuntimeException("中车响应 data 为空");
+            throw new ZhongcheException("中车响应 data 为空");
         }
-
         try {
             // 2. Base64 → JSON
             String bizJson = ZCApiUtils.base64Decode(responseDto.getData());
@@ -413,7 +396,7 @@ public class ZhongChePullController {
             return JSONUtil.toBean(bizJson, voClass);
         } catch (Exception e) {
             log.error("解析中车响应失败,response={}", responseDto, e);
-            throw new RuntimeException("解析中车响应失败", e);
+            throw new ZhongcheException("中车响应解析失败 : " + e.getMessage());
         }
     }
 
@@ -471,7 +454,7 @@ public class ZhongChePullController {
 
     //TODO 5.3.2	接单
     @PostMapping("/mall/order/confirm")
-    public GoodsUpdateVo mallOrderConfirm(@RequestBody OrderConfirmBo bo) {
+    public GoodsUpdateVo mallOrderConfirm(@RequestBody OrderConfirmBo bo) throws ZhongcheException {
         ZCR responseDto = doZcPost("/api/mall/order/confirm", bo);
         GoodsUpdateVo zcr = parseZcResponse(responseDto, GoodsUpdateVo.class);
         return zcr;
@@ -487,7 +470,7 @@ public class ZhongChePullController {
 
     //TODO 5.3.4	拒单
     @PostMapping("/mall/order/reject")
-    public GoodsUpdateVo mallOrderReject(@RequestBody OrderRejectBo bo) {
+    public GoodsUpdateVo mallOrderReject(@RequestBody OrderRejectBo bo) throws ZhongcheException {
         ZCR responseDto = doZcPost("/api/mall/order/reject", bo);
         GoodsUpdateVo zcr = parseZcResponse(responseDto, GoodsUpdateVo.class);
         return zcr;

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

@@ -797,8 +797,8 @@ public class ZhongChePushController {
         bo.setVersion("1.0.0");
         bo.setTimestamp("20260210162447");
         bo.setClientId("KFZAVuIyC56");
-        bo.setData("eyJpZCI6ImQwMDk0ZWMzLWUwMzItNDNkZi1iOTVhLTdjZmI0YWM5MTI2MSIsInR5cGUiOiIyMDAyIiwiY29udGVudCI6eyJvcmRlck5vIjoiMjAyNjAyMTAxMTAxNzQxMzAiLCJjYW5jZWxSZWFzb24iOiLkuI3mg7PopoHkuoYifSwidGltZSI6IjIwMjYwMjExMTM1NjAxMTQ5In0=");
-        bo.setAccessToken( "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJsb2dpblR5cGUiOiJsb2dpbiIsImxvZ2luSWQiOiJzeXNfdXNlcjoxIiwicm5TdHIiOiI4U2Zwa1owb3YyS2xLakNPa1BMcjRKcUxWcXExN2FYWSIsImNsaWVudGlkIjoiZTVjZDdlNDg5MWJmOTVkMWQxOTIwNmNlMjRhN2IzMmUiLCJ0ZW5hbnRJZCI6IjAwMDAwMCIsInVzZXJJZCI6MSwidXNlck5hbWUiOiJhZG1pbiIsImRlcHRJZCI6MTAzLCJkZXB0TmFtZSI6IueglOWPkemDqOmXqCIsImRlcHRDYXRlZ29yeSI6IiJ9.fyF_TFAORlA2SQGwQbJFEoT7DiRoWywzykWNcfcaPuU");
+        bo.setData("eyJpZCI6ImQwMDk0ZWMzLWUwMzItNDNkZi1iOTVhLTdjZmI0YWM5MTI2MSIsInR5cGUiOiIyMDAxIiwiY29udGVudCI6eyJvcmRlck5vIjoiMjAyNjAyMTAxMTAxNzQxMzAifSwidGltZSI6IjIwMjYwMjExMTM1NjAxMTQ5In0=");
+        bo.setAccessToken( "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJsb2dpblR5cGUiOiJsb2dpbiIsImxvZ2luSWQiOiJzeXNfdXNlcjoxIiwicm5TdHIiOiI5TThhbTRWczNBcm85cG5lSnlKUUhzMXFhMTZiT3BPcSIsImNsaWVudGlkIjoiZTVjZDdlNDg5MWJmOTVkMWQxOTIwNmNlMjRhN2IzMmUiLCJ0ZW5hbnRJZCI6IjAwMDAwMCIsInVzZXJJZCI6MSwidXNlck5hbWUiOiJhZG1pbiIsImRlcHRJZCI6MTAzLCJkZXB0TmFtZSI6IueglOWPkemDqOmXqCIsImRlcHRDYXRlZ29yeSI6IiJ9.0OsSOuJNM3KSYvkdSYh4AtbR9OFWllbHCUaBkqpfMMY");
         // 注意:此时不要 setSign
 
         // 2️⃣ 打印待签名内容(用于和中车排查)

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

@@ -3,6 +3,9 @@ package org.dromara.external.controller.zhongche.handle.impl;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.dromara.common.core.domain.zhongche.aftersale.bo.AfterSaleDetailBo;
+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.vo.AfterSaleDetailVo;
 import org.dromara.external.api.zhongche.domain.bo.MessageBo;
 import org.dromara.external.api.zhongche.domain.vo.MessageVo;
@@ -13,6 +16,9 @@ import org.dromara.product.api.RemoteExternalOrderService;
 import org.dromara.product.api.domain.dto.OrderReturnDto;
 import org.springframework.stereotype.Component;
 
+import java.math.BigDecimal;
+import java.util.ArrayList;
+
 /**
  * author
  * 时间:2026/2/3,19:00
@@ -30,18 +36,12 @@ public class AfterSaleApplyMessageHandler implements MallMessageHandler {
         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 (orderReturnDto.getSuccess() == true){
@@ -49,4 +49,51 @@ public class AfterSaleApplyMessageHandler implements MallMessageHandler {
         }
         return new MessageVo("0",orderReturnDto.getCancelReason());
     }*/
+
+    @Override
+    public MessageVo handle(MessageBo messageBo) {
+        String afterSaleNo = (String) messageBo.getContent().get("afterSaleNo");
+        AfterSaleDetailBo bo = new AfterSaleDetailBo();
+        bo.setAfterSaleNo(afterSaleNo);
+
+        AfterSaleGoods goods = new AfterSaleGoods();
+        goods.setGoodsId("362032");
+        goods.setNum(new BigDecimal("1.0000"));
+        goods.setNeedDetectionReport(0);
+        goods.setHasPackage(1);
+        goods.setPackageDesc("10");
+
+        AfterSaleReason reason = new AfterSaleReason();
+        reason.setReasonTypeName("错发");
+        reason.setReasonTypeCode("1");
+        reason.setReason("1111");
+        reason.setImageList(new ArrayList<>());
+
+        AfterSalePick pick = new AfterSalePick();
+        pick.setPickType("3");
+        pick.setTownId("0");
+
+        AfterSaleDetailVo afterSaleDetailVo = new AfterSaleDetailVo();
+
+        afterSaleDetailVo.setAfterSaleNo("1471137739549315072");
+        afterSaleDetailVo.setPurchaserAfterSaleNo("1471137739675144192");
+        afterSaleDetailVo.setOrderNo("20260210110174131");
+
+        afterSaleDetailVo.setAfterSaleType("1");
+        afterSaleDetailVo.setAfterSaleStatus("10");
+        afterSaleDetailVo.setGoodsReturnStatus("1");
+        afterSaleDetailVo.setApplyTime("20260211133610");
+
+        afterSaleDetailVo.setAfterSaleReason(reason);
+        afterSaleDetailVo.setAfterSaleGoods(goods);
+        afterSaleDetailVo.setAfterSalePick(pick);
+
+
+        OrderReturnDto orderReturnDto = remoteExternalOrderService.createReturnOrder(afterSaleDetailVo);
+
+        if (orderReturnDto.getSuccess() == true){
+            return new MessageVo("1");
+        }
+        return new MessageVo("0",orderReturnDto.getCancelReason());
+    }
 }

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

@@ -27,11 +27,11 @@ public class AfterSaleReceiveConfirmMessageHandler implements MallMessageHandler
         return MallMessageTypeEnum.AFTER_SALE_RECEIVE_CONFIRM;
     }
 
-    @Override
+    /*@Override
     public MessageVo handle(MessageBo messageBo) {
         return new MessageVo("1");
-    }
-    /*@Override
+    }*/
+    @Override
     public MessageVo handle(MessageBo messageBo) {
         String afterSaleNo = (String) messageBo.getContent().get("afterSaleNo");
         String outgoingCode = (String) messageBo.getContent().get("outgoingCode");
@@ -42,5 +42,5 @@ public class AfterSaleReceiveConfirmMessageHandler implements MallMessageHandler
         }else {
             return new MessageVo("0",dto.getCancelReason());
         }
-    }*/
+    }
 }

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

@@ -0,0 +1,47 @@
+package org.dromara.external.controller.zhongche.handle.impl;
+
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.dromara.common.core.domain.zhongche.aftersale.bo.AfterSaleRefundBo;
+import org.dromara.external.api.zhongche.domain.bo.MessageBo;
+import org.dromara.external.api.zhongche.domain.vo.GoodsUpdateVo;
+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.springframework.stereotype.Component;
+
+/**
+ * author
+ * 时间:2026/2/24,16:38
+ */
+@Component
+@Slf4j
+@RequiredArgsConstructor
+public class AfterSaleRefundNoticeMessageHandler implements MallMessageHandler {
+
+    private final ZhongChePullController zhongChePullController;
+
+    @Override
+    public MallMessageTypeEnum supportType() {
+        return MallMessageTypeEnum.AFTER_SALE_REFUND_NOTICE;
+    }
+
+    /*@Override
+    public MessageVo handle(MessageBo messageBo) {
+        return new MessageVo("1");
+    }*/
+    @Override
+    public MessageVo handle(MessageBo messageBo) {
+        String afterSaleNo = (String) messageBo.getContent().get("afterSaleNo");
+        AfterSaleRefundBo dto = new AfterSaleRefundBo();
+        dto.setAfterSaleNo(afterSaleNo);
+        GoodsUpdateVo goodsUpdateVo = zhongChePullController.mallAftersaleRefund(dto);
+        if (goodsUpdateVo.getMessage().equals("1")){
+            return new MessageVo("1");
+        }else {
+            return new MessageVo("0","退款失败");
+        }
+    }
+}

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

@@ -21,7 +21,7 @@ public class BillConfirmMessageHandler implements MallMessageHandler {
     private final ZhongChePullController zhongChePullController;
     @Override
     public MallMessageTypeEnum supportType() {
-        return MallMessageTypeEnum.AFTER_SALE_APPLY;
+        return MallMessageTypeEnum.BILL_CONFIRM;
     }
 
     @Override

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

@@ -21,7 +21,7 @@ public class BillModifyMessageHandler implements MallMessageHandler {
     private final ZhongChePullController zhongChePullController;
     @Override
     public MallMessageTypeEnum supportType() {
-        return MallMessageTypeEnum.AFTER_SALE_APPLY;
+        return MallMessageTypeEnum.BILL_MODIFY;
     }
 
     @Override

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

@@ -21,7 +21,7 @@ public class BillRuleCreateMessageHandler implements MallMessageHandler {
     private final ZhongChePullController zhongChePullController;
     @Override
     public MallMessageTypeEnum supportType() {
-        return MallMessageTypeEnum.AFTER_SALE_APPLY;
+        return MallMessageTypeEnum.BILL_RULE_CREATE;
     }
 
     @Override

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

@@ -21,7 +21,7 @@ public class BillWaitInvoiceMessageHandler implements MallMessageHandler {
     private final ZhongChePullController zhongChePullController;
     @Override
     public MallMessageTypeEnum supportType() {
-        return MallMessageTypeEnum.AFTER_SALE_APPLY;
+        return MallMessageTypeEnum.BILL_WAIT_INVOICE;
     }
 
     @Override

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

@@ -38,7 +38,7 @@ public class OrderCreateMessageHandler implements MallMessageHandler {
     }
 
 
-    @Override
+    /*@Override
     public MessageVo handle(MessageBo messageBo) {
         //获取中车订单号获取订单详情,我们电商平台没有接单功能胡哥说的,然后默认接单 就发起接单的请求
         String orderNo = (String) messageBo.getContent().get("orderNo");
@@ -52,10 +52,10 @@ public class OrderCreateMessageHandler implements MallMessageHandler {
         }else {
             return new MessageVo("0","获取订单详情失败");
         }
-    }
+    }*/
 
 
-    /*@Override
+    @Override
     public MessageVo handle(MessageBo messageBo) {
         //获取中车订单号获取订单详情,我们电商平台没有接单功能胡哥说的,然后默认接单 就发起接单的请求
         String orderNo = (String) messageBo.getContent().get("orderNo");
@@ -63,8 +63,8 @@ public class OrderCreateMessageHandler implements MallMessageHandler {
         OrderDetailVo orderDetailVo = new OrderDetailVo();
 
 // ===== 基本信息 =====
-        orderDetailVo.setOrderNo("20260210110174131");
-        orderDetailVo.setPurchaserOrderNo("2026021010452504");
+        orderDetailVo.setOrderNo("20260210110174145");
+        orderDetailVo.setPurchaserOrderNo("2026021010452505");
         orderDetailVo.setPreOrder(0);
         orderDetailVo.setMallOrderNo(null);
         orderDetailVo.setOrderStatus("1");
@@ -129,7 +129,7 @@ public class OrderCreateMessageHandler implements MallMessageHandler {
         }else {
             return new MessageVo("0","获取订单详情失败");
         }
-    }*/
+    }
 
 
 

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

@@ -36,11 +36,10 @@ public class OrderReceiveConfirmMessageHandler implements MallMessageHandler {
     public MessageVo handle(MessageBo messageBo) {
         String orderNo = (String) messageBo.getContent().get("orderNo");
         String outgoingCode = (String) messageBo.getContent().get("outgoingCode");
-
         boolean b = remoteExternalOrderService.confirmReceive(orderNo, outgoingCode);
         if (b){
             return new MessageVo("1");
         }
-        return new MessageVo("0","确认收失败");
+        return new MessageVo("0","确认收失败");
     }
 }

+ 36 - 0
ruoyi-modules/ruoyi-external/src/main/java/org/dromara/external/dubbo/RemoteZhongChePullServiceImpl.java

@@ -0,0 +1,36 @@
+package org.dromara.external.dubbo;
+
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.dubbo.config.annotation.DubboService;
+import org.dromara.common.core.exception.api.ZhongcheException;
+import org.dromara.external.api.zhongche.RemoteZhongChePullService;
+import org.dromara.external.api.zhongche.domain.bo.OrderConfirmBo;
+import org.dromara.external.api.zhongche.domain.bo.OrderRejectBo;
+import org.dromara.external.api.zhongche.domain.vo.GoodsUpdateVo;
+import org.dromara.external.controller.zhongche.ZhongChePullController;
+import org.springframework.stereotype.Service;
+
+/**
+ * author
+ * 时间:2026/2/25,17:52
+ */
+@Slf4j
+@Service
+@RequiredArgsConstructor
+@DubboService
+public class RemoteZhongChePullServiceImpl implements RemoteZhongChePullService {
+
+    private final ZhongChePullController zhongChePullController;
+    @Override
+    public GoodsUpdateVo mallOrderConfirm(OrderConfirmBo bo) throws ZhongcheException {
+        GoodsUpdateVo goodsUpdateVo = zhongChePullController.mallOrderConfirm(bo);
+        return goodsUpdateVo;
+    }
+
+    @Override
+    public GoodsUpdateVo mallOrderReject(OrderRejectBo bo) throws ZhongcheException {
+        GoodsUpdateVo goodsUpdateVo = zhongChePullController.mallOrderReject(bo);
+        return goodsUpdateVo;
+    }
+}

+ 167 - 0
ruoyi-modules/ruoyi-order/src/main/java/org/dromara/order/controller/zhongche/ZhongCheOrderMainController.java

@@ -0,0 +1,167 @@
+package org.dromara.order.controller.zhongche;
+
+import java.util.Date;
+import java.util.List;
+
+import lombok.RequiredArgsConstructor;
+import jakarta.servlet.http.HttpServletResponse;
+import jakarta.validation.constraints.*;
+import cn.dev33.satoken.annotation.SaCheckPermission;
+import org.dromara.order.domain.bo.OrderMainBo;
+import org.dromara.order.domain.vo.OrderDeliverVo;
+import org.dromara.order.domain.vo.OrderMainVo;
+import org.dromara.order.service.IOrderMainService;
+import org.dromara.order.utils.kd100.domain.TrackData;
+import org.springframework.format.annotation.DateTimeFormat;
+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.order.domain.vo.ZhongCheOrderMainVo;
+import org.dromara.order.domain.bo.ZhongCheOrderMainBo;
+import org.dromara.order.service.IZhongCheOrderMainService;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+
+/**
+ * 订单列表
+ * 前端访问路由地址为:/order/zhongcheorder
+ *
+ * @author LionLi
+ * @date 2026-02-25
+ */
+@Validated
+@RequiredArgsConstructor
+@RestController
+@RequestMapping("/zhongcheorder")
+public class ZhongCheOrderMainController extends BaseController {
+
+    private final IOrderMainService zhongCheOrderMainService;
+
+    /**
+     * 查询订单列表列表
+     */
+    //@SaCheckPermission("order:zhongcheorder:list")
+    @GetMapping("/list")
+    public TableDataInfo<OrderMainVo> list(OrderMainBo bo, PageQuery pageQuery) {
+        return zhongCheOrderMainService.queryZhongChePageList(bo, pageQuery);
+    }
+
+    /**
+     * 导出订单列表列表
+     */
+    //@SaCheckPermission("order:zhongcheorder:export")
+    @Log(title = "订单列表", businessType = BusinessType.EXPORT)
+    @PostMapping("/export")
+    public void export(OrderMainBo bo, HttpServletResponse response) {
+        List<OrderMainVo> list = zhongCheOrderMainService.queryList(bo);
+        ExcelUtil.exportExcel(list, "订单列表", OrderMainVo.class, response);
+    }
+
+    /**
+     * 获取订单列表详细信息
+     *
+     * @param id 主键
+     */
+    //@SaCheckPermission("order:zhongcheorder:query")
+    @GetMapping("/{id}")
+    public R<OrderMainVo> getInfo(@NotNull(message = "主键不能为空")
+                                     @PathVariable("id") Long id) {
+        return R.ok(zhongCheOrderMainService.queryById(id));
+    }
+
+
+    /**
+     * 修改订单列表
+     */
+    //@SaCheckPermission("order:zhongcheorder:edit")
+    @Log(title = "订单列表", businessType = BusinessType.UPDATE)
+    @RepeatSubmit()
+    @PutMapping()
+    public R<Void> edit(@Validated(EditGroup.class) @RequestBody OrderMainBo bo) {
+        return toAjax(zhongCheOrderMainService.updateByBo(bo));
+    }
+
+    /**
+     * 删除订单列表
+     *
+     * @param ids 主键串
+     */
+    //@SaCheckPermission("order:zhongcheorder:remove")
+    @Log(title = "订单列表", businessType = BusinessType.DELETE)
+    @DeleteMapping("/{ids}")
+    public R<Void> remove(@NotEmpty(message = "主键不能为空")
+                          @PathVariable("ids") Long[] ids) {
+        return toAjax(zhongCheOrderMainService.deleteWithValidByIds(List.of(ids), true));
+    }
+
+
+    /**
+     * 接单
+     * @param id
+     * @return
+     */
+    @PostMapping("/accept")
+    public R<Void> accept(@RequestParam("id") Long id) {
+        return toAjax(zhongCheOrderMainService.accept(id));
+    }
+
+    /**
+     * 拒单
+     * @param id
+     * @param reason
+     * @return
+     */
+    @PostMapping("/reject")
+    public R<Void> reject(@RequestParam("id") Long id, @RequestParam(value = "reason") String reason) {
+        return toAjax(zhongCheOrderMainService.reject(id, reason));
+    }
+
+    /**
+     * 查询物流
+     * @param id
+     * @return
+     */
+    @GetMapping("/logistics")
+    public R<List<OrderDeliverVo>> logistics(@RequestParam("id") Long id) {
+        return R.ok(zhongCheOrderMainService.queryLogisticsByOrderId(id));
+    }
+
+    /**
+     * 查询物流轨迹
+     * @param id
+     * @return
+     */
+    @GetMapping("/logistics/track")
+    public R<List<TrackData>> logisticsTrack(@RequestParam("id") Long id) {
+        return R.ok(zhongCheOrderMainService.queryLogisticsTrackById(id));
+    }
+
+    /**
+     * 结算功能  //TODO 目前先做出效果
+     * @param id
+     * @return
+     */
+    @PutMapping("/settlement")
+    public R<Void> settlement(@RequestParam("id") Long id) {
+        return toAjax(zhongCheOrderMainService.settlement(id));
+    }
+
+    /**
+     * 录入截止还款时间
+     * @param id
+     * @return
+     */
+    @PutMapping("/setdeadline")
+    public R<Void> setdeadline(@RequestParam("id") Long id,@RequestParam("repaymentDeadline")
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") Date repaymentDeadline) {
+        return toAjax(zhongCheOrderMainService.setdeadline(id,repaymentDeadline));
+    }
+
+}

+ 106 - 0
ruoyi-modules/ruoyi-order/src/main/java/org/dromara/order/controller/zhongche/ZhongCheOrderReturnController.java

@@ -0,0 +1,106 @@
+package org.dromara.order.controller.zhongche;
+
+import java.util.List;
+
+import lombok.RequiredArgsConstructor;
+import jakarta.servlet.http.HttpServletResponse;
+import jakarta.validation.constraints.*;
+import cn.dev33.satoken.annotation.SaCheckPermission;
+import org.dromara.order.domain.bo.OrderReturnBo;
+import org.dromara.order.domain.vo.OrderReturnVo;
+import org.dromara.order.service.IOrderReturnService;
+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.common.mybatis.core.page.TableDataInfo;
+
+/**
+ * 中车售后单
+ * 前端访问路由地址为:/order/zhongcheReturn
+ *
+ * @author LionLi
+ * @date 2026-02-28
+ */
+@Validated
+@RequiredArgsConstructor
+@RestController
+@RequestMapping("/zhongcheReturn")
+public class ZhongCheOrderReturnController extends BaseController {
+
+    private final IOrderReturnService zhongCheOrderReturnService;
+
+    /**
+     * 查询中车售后单列表
+     */
+    //@SaCheckPermission("order:zhongcheReturn:list")
+    @GetMapping("/list")
+    public TableDataInfo<OrderReturnVo> list(OrderReturnBo bo, PageQuery pageQuery) {
+        return zhongCheOrderReturnService.queryZhongchePageList(bo, pageQuery);
+    }
+
+    /**
+     * 导出中车售后单列表
+     */
+    //@SaCheckPermission("order:zhongcheReturn:export")
+    @Log(title = "中车售后单", businessType = BusinessType.EXPORT)
+    @PostMapping("/export")
+    public void export(OrderReturnBo bo, HttpServletResponse response) {
+        List<OrderReturnVo> list = zhongCheOrderReturnService.queryList(bo);
+        ExcelUtil.exportExcel(list, "中车售后单", OrderReturnVo.class, response);
+    }
+
+    /**
+     * 获取中车售后单详细信息
+     *
+     * @param id 主键
+     */
+    //@SaCheckPermission("order:zhongcheReturn:query")
+    @GetMapping("/{id}")
+    public R<OrderReturnVo> getInfo(@NotNull(message = "主键不能为空")
+                                     @PathVariable("id") Long id) {
+        return R.ok(zhongCheOrderReturnService.queryById(id));
+    }
+
+    /**
+     * 新增中车售后单
+     */
+    //@SaCheckPermission("order:zhongcheReturn:add")
+    @Log(title = "中车售后单", businessType = BusinessType.INSERT)
+    @RepeatSubmit()
+    @PostMapping()
+    public R<Void> add(@Validated(AddGroup.class) @RequestBody OrderReturnBo bo) {
+        return toAjax(zhongCheOrderReturnService.insertByBo(bo));
+    }
+
+    /**
+     * 修改中车售后单
+     */
+    //@SaCheckPermission("order:zhongcheReturn:edit")
+    @Log(title = "中车售后单", businessType = BusinessType.UPDATE)
+    @RepeatSubmit()
+    @PutMapping()
+    public R<Void> edit(@Validated(EditGroup.class) @RequestBody OrderReturnBo bo) {
+        return toAjax(zhongCheOrderReturnService.updateByBo(bo));
+    }
+
+    /**
+     * 删除中车售后单
+     *
+     * @param ids 主键串
+     */
+    //@SaCheckPermission("order:zhongcheReturn:remove")
+    @Log(title = "中车售后单", businessType = BusinessType.DELETE)
+    @DeleteMapping("/{ids}")
+    public R<Void> remove(@NotEmpty(message = "主键不能为空")
+                          @PathVariable("ids") Long[] ids) {
+        return toAjax(zhongCheOrderReturnService.deleteWithValidByIds(List.of(ids), true));
+    }
+}

+ 16 - 0
ruoyi-modules/ruoyi-order/src/main/java/org/dromara/order/domain/OrderMainCrrcExt.java

@@ -187,5 +187,21 @@ public class OrderMainCrrcExt extends TenantEntity {
      */
     private String remark;
 
+    //对账状态
+    private String reconciliationStatus;
+
+    //是否妥投
+    private String isProperDelivery;
+
+    //开票状态
+    private String invoiceStatus;
+
+    //结算状态
+    private String settlementStatus;
+
+    //截止还款时间
+    private Date repaymentDeadline;
+
+
 
 }

+ 294 - 0
ruoyi-modules/ruoyi-order/src/main/java/org/dromara/order/domain/ZhongCheOrderMain.java

@@ -0,0 +1,294 @@
+package org.dromara.order.domain;
+
+import org.dromara.common.tenant.core.TenantEntity;
+import com.baomidou.mybatisplus.annotation.*;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import java.util.Date;
+import com.fasterxml.jackson.annotation.JsonFormat;
+
+import java.io.Serial;
+
+/**
+ * 订单列表对象 order_main
+ *
+ * @author LionLi
+ * @date 2026-02-25
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@TableName("order_main")
+public class ZhongCheOrderMain extends TenantEntity {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键ID
+     */
+    @TableId(value = "id")
+    private Long id;
+
+    /**
+     * 父订单id
+     */
+    private Long parentOrderId;
+
+    /**
+     * 订单编号
+     */
+    private String orderNo;
+
+    /**
+     * 发货单号
+     */
+    private String shipmentNo;
+
+    /**
+     * 子订单编号
+     */
+    private String subOrderNo;
+
+    /**
+     * 所属公司
+     */
+    private Long companyId;
+
+    /**
+     * 客户编号
+     */
+    private String customerCode;
+
+    /**
+     * 客户ID(关联客户主表)
+     */
+    private Long customerId;
+
+    /**
+     * 用户ID(关联用户表 登陆的联系人Id)
+     */
+    private Long userId;
+
+    /**
+     * 收货地址ID
+     */
+    private Long shippingAddressId;
+
+    /**
+     * 采购事由
+     */
+    private String purchaseReason;
+
+    /**
+     * 发票类型
+     */
+    private String invoiceType;
+
+    /**
+     * 支付方式
+     */
+    private String payType;
+
+    /**
+     * 发货仓库
+     */
+    private Long warehouseId;
+
+    /**
+     * 信用额度(元)
+     */
+    private Long creditLimit;
+
+    /**
+     * 预计送达时间
+     */
+    private Date expectedDeliveryTime;
+
+    /**
+     * 业务员姓名/工号
+     */
+    private String businessStaff;
+
+    /**
+     * 客服人员
+     */
+    private String customerService;
+
+    /**
+     * 业务部门
+     */
+    private String businessDept;
+
+    /**
+     * 用户所属部门
+     */
+    private String userDept;
+
+    /**
+     * 商品总数量
+     */
+    private Long productQuantity;
+
+    /**
+     * 运费(元)
+     */
+    private Long shippingFee;
+
+    /**
+     * 订单总金额(元)
+     */
+    private Long totalAmount;
+
+    /**
+     * 应付金额(元)
+     */
+    private Long payableAmount;
+
+    /**
+     * 支付状态
+     */
+    private String paymentStatus;
+
+    /**
+     * 订单来源
+     */
+    private String orderSource;
+
+    /**
+     * 订单状态
+     */
+    private String orderStatus;
+
+    /**
+     * 下单时间
+     */
+    private Date orderTime;
+
+    /**
+     * 确认时间
+     */
+    private Date confirmTime;
+
+    /**
+     * 发货时间
+     */
+    private Date shippingTime;
+
+    /**
+     * 收货时间
+     */
+    private Date receivingTime;
+
+    /**
+     * 拆单状态:0=未拆, 1=已拆出子单
+     */
+    private String splitStatus;
+
+    /**
+     * 是否为拆分子单:0=是 (子订单), 1=否 (父订单)
+     */
+    private String isSplitChild;
+
+    /**
+     * 包裹数量
+     */
+    private Long packageCount;
+
+    /**
+     * 签收数量
+     */
+    private Long signedQuantity;
+
+    /**
+     * 已完成售后数量
+     */
+    private Long afterSaleCompleted;
+
+    /**
+     * 申请售后数量
+     */
+    private Long afterSalePending;
+
+    /**
+     * 配送时效描述
+     */
+    private String deliveryDesc;
+
+    /**
+     * 推送状态
+     */
+    private String pushStatus;
+
+    /**
+     * 订单附件文件路径
+     */
+    private String attachmentPath;
+
+    /**
+     * 配送类型
+     */
+    private String deliveryType;
+
+    /**
+     * 创建类别
+     */
+    private String orderCategory;
+
+    /**
+     * 取消或异常原因
+     */
+    private String cancelReason;
+
+    /**
+     * 费用类型
+     */
+    private String expenseType;
+
+    /**
+     * 用户编号
+     */
+    private String userNo;
+
+    /**
+     * 状态(0正常 1停用)
+     */
+    private String status;
+
+    /**
+     * 删除标志(0代表存在 2代表删除)
+     */
+    @TableLogic
+    private String delFlag;
+
+    /**
+     * 备注
+     */
+    private String remark;
+
+    /**
+     * 数据来源
+     */
+    private String dataSource;
+
+    /**
+     * 审核状态(0 待审核 1已通过 2已驳回)
+     */
+    private String checkStatus;
+
+    /**
+     * 分配状态(0待分配 1已分配 )
+     */
+    private String assignmentStatus;
+
+    /**
+     * 分配对象ID
+     */
+    private Long assigneeId;
+
+    /**
+     * 分配对象类型:srm-供应商, bp-伙伴商
+     */
+    private String assigneeType;
+
+
+}

+ 281 - 0
ruoyi-modules/ruoyi-order/src/main/java/org/dromara/order/domain/bo/ZhongCheOrderMainBo.java

@@ -0,0 +1,281 @@
+package org.dromara.order.domain.bo;
+
+import org.dromara.order.domain.ZhongCheOrderMain;
+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.util.Date;
+import com.fasterxml.jackson.annotation.JsonFormat;
+
+/**
+ * 订单列表业务对象 order_main
+ *
+ * @author LionLi
+ * @date 2026-02-25
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@AutoMapper(target = ZhongCheOrderMain.class, reverseConvertGenerate = false)
+public class ZhongCheOrderMainBo extends BaseEntity {
+
+    /**
+     * 主键ID
+     */
+    private Long id;
+
+    /**
+     * 父订单id
+     */
+    private Long parentOrderId;
+
+    /**
+     * 订单编号
+     */
+    private String orderNo;
+
+    /**
+     * 发货单号
+     */
+    private String shipmentNo;
+
+    /**
+     * 子订单编号
+     */
+    private String subOrderNo;
+
+    /**
+     * 所属公司
+     */
+    private Long companyId;
+
+    /**
+     * 客户编号
+     */
+    private String customerCode;
+
+    /**
+     * 客户ID(关联客户主表)
+     */
+    private Long customerId;
+
+    /**
+     * 用户ID(关联用户表 登陆的联系人Id)
+     */
+    private Long userId;
+
+    /**
+     * 收货地址ID
+     */
+    private Long shippingAddressId;
+
+    /**
+     * 采购事由
+     */
+    private String purchaseReason;
+
+    /**
+     * 发票类型
+     */
+    private String invoiceType;
+
+    /**
+     * 支付方式
+     */
+    private String payType;
+
+    /**
+     * 发货仓库
+     */
+    private Long warehouseId;
+
+    /**
+     * 信用额度(元)
+     */
+    private Long creditLimit;
+
+    /**
+     * 预计送达时间
+     */
+    private Date expectedDeliveryTime;
+
+    /**
+     * 业务员姓名/工号
+     */
+    private String businessStaff;
+
+    /**
+     * 客服人员
+     */
+    private String customerService;
+
+    /**
+     * 业务部门
+     */
+    private String businessDept;
+
+    /**
+     * 用户所属部门
+     */
+    private String userDept;
+
+    /**
+     * 商品总数量
+     */
+    private Long productQuantity;
+
+    /**
+     * 运费(元)
+     */
+    private Long shippingFee;
+
+    /**
+     * 订单总金额(元)
+     */
+    private Long totalAmount;
+
+    /**
+     * 应付金额(元)
+     */
+    private Long payableAmount;
+
+    /**
+     * 支付状态
+     */
+    private String paymentStatus;
+
+    /**
+     * 订单来源
+     */
+    private String orderSource;
+
+    /**
+     * 订单状态
+     */
+    private String orderStatus;
+
+    /**
+     * 下单时间
+     */
+    private Date orderTime;
+
+    /**
+     * 确认时间
+     */
+    private Date confirmTime;
+
+    /**
+     * 发货时间
+     */
+    private Date shippingTime;
+
+    /**
+     * 收货时间
+     */
+    private Date receivingTime;
+
+    /**
+     * 拆单状态:0=未拆, 1=已拆出子单
+     */
+    private String splitStatus;
+
+    /**
+     * 是否为拆分子单:0=是 (子订单), 1=否 (父订单)
+     */
+    private String isSplitChild;
+
+    /**
+     * 包裹数量
+     */
+    private Long packageCount;
+
+    /**
+     * 签收数量
+     */
+    private Long signedQuantity;
+
+    /**
+     * 已完成售后数量
+     */
+    private Long afterSaleCompleted;
+
+    /**
+     * 申请售后数量
+     */
+    private Long afterSalePending;
+
+    /**
+     * 配送时效描述
+     */
+    private String deliveryDesc;
+
+    /**
+     * 推送状态
+     */
+    private String pushStatus;
+
+    /**
+     * 订单附件文件路径
+     */
+    private String attachmentPath;
+
+    /**
+     * 配送类型
+     */
+    private String deliveryType;
+
+    /**
+     * 创建类别
+     */
+    private String orderCategory;
+
+    /**
+     * 取消或异常原因
+     */
+    private String cancelReason;
+
+    /**
+     * 费用类型
+     */
+    private String expenseType;
+
+    /**
+     * 用户编号
+     */
+    private String userNo;
+
+    /**
+     * 备注
+     */
+    private String remark;
+
+    /**
+     * 数据来源
+     */
+    private String dataSource;
+
+    /**
+     * 审核状态(0 待审核 1已通过 2已驳回)
+     */
+    private String checkStatus;
+
+    /**
+     * 分配状态(0待分配 1已分配 )
+     */
+    private String assignmentStatus;
+
+    /**
+     * 分配对象ID
+     */
+    private Long assigneeId;
+
+    /**
+     * 分配对象类型:srm-供应商, bp-伙伴商
+     */
+    private String assigneeType;
+
+
+}

+ 3 - 0
ruoyi-modules/ruoyi-order/src/main/java/org/dromara/order/domain/vo/OrderDeliverVo.java

@@ -147,4 +147,7 @@ public class OrderDeliverVo implements Serializable {
     private String createDeptName;
 
     private List<OrderDeliverProductVo> deliverProductList;
+
+    //物流公司
+    private String logisticsCompanyName;
 }

+ 21 - 0
ruoyi-modules/ruoyi-order/src/main/java/org/dromara/order/domain/vo/OrderMainVo.java

@@ -383,5 +383,26 @@ public class OrderMainVo implements Serializable {
 
     private List<OrderDeliverProductVo> deliverProductList;
 
+    //下单人
+    private String buyerName;
+
+    //订单类型
+    private Integer preOrder;
+
+    //对账状态
+    private String reconciliationStatus;
+
+    //是否妥投
+    private String isProperDelivery;
+
+    //开票状态
+    private String invoiceStatus;
+
+    //结算状态
+    private String settlementStatus;
+
+    //截止还款时间
+    private Date repaymentDeadline;
+
 
 }

+ 337 - 0
ruoyi-modules/ruoyi-order/src/main/java/org/dromara/order/domain/vo/ZhongCheOrderMainVo.java

@@ -0,0 +1,337 @@
+package org.dromara.order.domain.vo;
+
+import java.util.Date;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import org.dromara.order.domain.ZhongCheOrderMain;
+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;
+
+
+
+/**
+ * 订单列表视图对象 order_main
+ *
+ * @author LionLi
+ * @date 2026-02-25
+ */
+@Data
+@ExcelIgnoreUnannotated
+@AutoMapper(target = ZhongCheOrderMain.class)
+public class ZhongCheOrderMainVo implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键ID
+     */
+    @ExcelProperty(value = "主键ID")
+    private Long id;
+
+    /**
+     * 父订单id
+     */
+    @ExcelProperty(value = "父订单id")
+    private Long parentOrderId;
+
+    /**
+     * 订单编号
+     */
+    @ExcelProperty(value = "订单编号")
+    private String orderNo;
+
+    /**
+     * 发货单号
+     */
+    @ExcelProperty(value = "发货单号")
+    private String shipmentNo;
+
+    /**
+     * 子订单编号
+     */
+    @ExcelProperty(value = "子订单编号")
+    private String subOrderNo;
+
+    /**
+     * 所属公司
+     */
+    @ExcelProperty(value = "所属公司")
+    private Long companyId;
+
+    /**
+     * 客户编号
+     */
+    @ExcelProperty(value = "客户编号")
+    private String customerCode;
+
+    /**
+     * 客户ID(关联客户主表)
+     */
+    @ExcelProperty(value = "客户ID", converter = ExcelDictConvert.class)
+    @ExcelDictFormat(readConverterExp = "关=联客户主表")
+    private Long customerId;
+
+    /**
+     * 用户ID(关联用户表 登陆的联系人Id)
+     */
+    @ExcelProperty(value = "用户ID", converter = ExcelDictConvert.class)
+    @ExcelDictFormat(readConverterExp = "关=联用户表,登=陆的联系人Id")
+    private Long userId;
+
+    /**
+     * 收货地址ID
+     */
+    @ExcelProperty(value = "收货地址ID")
+    private Long shippingAddressId;
+
+    /**
+     * 采购事由
+     */
+    @ExcelProperty(value = "采购事由")
+    private String purchaseReason;
+
+    /**
+     * 发票类型
+     */
+    @ExcelProperty(value = "发票类型")
+    private String invoiceType;
+
+    /**
+     * 支付方式
+     */
+    @ExcelProperty(value = "支付方式")
+    private String payType;
+
+    /**
+     * 发货仓库
+     */
+    @ExcelProperty(value = "发货仓库")
+    private Long warehouseId;
+
+    /**
+     * 信用额度(元)
+     */
+    @ExcelProperty(value = "信用额度", converter = ExcelDictConvert.class)
+    @ExcelDictFormat(readConverterExp = "元=")
+    private Long creditLimit;
+
+    /**
+     * 预计送达时间
+     */
+    @ExcelProperty(value = "预计送达时间")
+    private Date expectedDeliveryTime;
+
+    /**
+     * 业务员姓名/工号
+     */
+    @ExcelProperty(value = "业务员姓名/工号")
+    private String businessStaff;
+
+    /**
+     * 客服人员
+     */
+    @ExcelProperty(value = "客服人员")
+    private String customerService;
+
+    /**
+     * 业务部门
+     */
+    @ExcelProperty(value = "业务部门")
+    private String businessDept;
+
+    /**
+     * 用户所属部门
+     */
+    @ExcelProperty(value = "用户所属部门")
+    private String userDept;
+
+    /**
+     * 商品总数量
+     */
+    @ExcelProperty(value = "商品总数量")
+    private Long productQuantity;
+
+    /**
+     * 运费(元)
+     */
+    @ExcelProperty(value = "运费", converter = ExcelDictConvert.class)
+    @ExcelDictFormat(readConverterExp = "元=")
+    private Long shippingFee;
+
+    /**
+     * 订单总金额(元)
+     */
+    @ExcelProperty(value = "订单总金额", converter = ExcelDictConvert.class)
+    @ExcelDictFormat(readConverterExp = "元=")
+    private Long totalAmount;
+
+    /**
+     * 应付金额(元)
+     */
+    @ExcelProperty(value = "应付金额", converter = ExcelDictConvert.class)
+    @ExcelDictFormat(readConverterExp = "元=")
+    private Long payableAmount;
+
+    /**
+     * 支付状态
+     */
+    @ExcelProperty(value = "支付状态")
+    private String paymentStatus;
+
+    /**
+     * 订单来源
+     */
+    @ExcelProperty(value = "订单来源")
+    private String orderSource;
+
+    /**
+     * 订单状态
+     */
+    @ExcelProperty(value = "订单状态")
+    private String orderStatus;
+
+    /**
+     * 下单时间
+     */
+    @ExcelProperty(value = "下单时间")
+    private Date orderTime;
+
+    /**
+     * 确认时间
+     */
+    @ExcelProperty(value = "确认时间")
+    private Date confirmTime;
+
+    /**
+     * 发货时间
+     */
+    @ExcelProperty(value = "发货时间")
+    private Date shippingTime;
+
+    /**
+     * 收货时间
+     */
+    @ExcelProperty(value = "收货时间")
+    private Date receivingTime;
+
+    /**
+     * 拆单状态:0=未拆, 1=已拆出子单
+     */
+    @ExcelProperty(value = "拆单状态:0=未拆, 1=已拆出子单")
+    private String splitStatus;
+
+    /**
+     * 是否为拆分子单:0=是 (子订单), 1=否 (父订单)
+     */
+    @ExcelProperty(value = "是否为拆分子单:0=是 (子订单), 1=否 (父订单)")
+    private String isSplitChild;
+
+    /**
+     * 包裹数量
+     */
+    @ExcelProperty(value = "包裹数量")
+    private Long packageCount;
+
+    /**
+     * 签收数量
+     */
+    @ExcelProperty(value = "签收数量")
+    private Long signedQuantity;
+
+    /**
+     * 已完成售后数量
+     */
+    @ExcelProperty(value = "已完成售后数量")
+    private Long afterSaleCompleted;
+
+    /**
+     * 申请售后数量
+     */
+    @ExcelProperty(value = "申请售后数量")
+    private Long afterSalePending;
+
+    /**
+     * 配送时效描述
+     */
+    @ExcelProperty(value = "配送时效描述")
+    private String deliveryDesc;
+
+    /**
+     * 推送状态
+     */
+    @ExcelProperty(value = "推送状态")
+    private String pushStatus;
+
+    /**
+     * 订单附件文件路径
+     */
+    @ExcelProperty(value = "订单附件文件路径")
+    private String attachmentPath;
+
+    /**
+     * 配送类型
+     */
+    @ExcelProperty(value = "配送类型")
+    private String deliveryType;
+
+    /**
+     * 创建类别
+     */
+    @ExcelProperty(value = "创建类别")
+    private String orderCategory;
+
+    /**
+     * 取消或异常原因
+     */
+    @ExcelProperty(value = "取消或异常原因")
+    private String cancelReason;
+
+    /**
+     * 费用类型
+     */
+    @ExcelProperty(value = "费用类型")
+    private String expenseType;
+
+    /**
+     * 用户编号
+     */
+    @ExcelProperty(value = "用户编号")
+    private String userNo;
+
+    /**
+     * 备注
+     */
+    @ExcelProperty(value = "备注")
+    private String remark;
+
+
+    //下单人
+    private String buyerName;
+
+    //订单类型
+    private Integer preOrder;
+
+    //对账状态
+    private String reconciliationStatus;
+
+    //是否妥投
+    private String isProperDelivery;
+
+    //开票状态
+    private String invoiceStatus;
+
+    //结算状态
+    private String settlementStatus;
+
+    //截止还款时间
+    private Date repaymentDeadline;
+
+}

+ 66 - 12
ruoyi-modules/ruoyi-order/src/main/java/org/dromara/order/dubbo/RemoteExternalOrderServiceImpl.java

@@ -1,6 +1,7 @@
 package org.dromara.order.dubbo;
 
 import cn.hutool.core.util.ObjectUtil;
+import cn.hutool.core.util.StrUtil;
 import cn.idev.excel.event.Order;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import lombok.RequiredArgsConstructor;
@@ -35,10 +36,12 @@ import org.dromara.order.utils.kd100.domain.QueryTrackDTO;
 import org.dromara.order.utils.kd100.domain.TrackData;
 import org.dromara.order.utils.kd100.domain.TrackVO;
 import org.dromara.product.api.RemoteExternalOrderService;
+import org.dromara.product.api.RemoteProductService;
 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 org.dromara.product.api.domain.zhongche.dto.OrderProductDto;
 import org.dromara.system.api.RemoteComLogisticsCompanyService;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
@@ -49,10 +52,8 @@ import java.text.ParseException;
 import java.text.SimpleDateFormat;
 import java.time.LocalDateTime;
 import java.time.format.DateTimeFormatter;
-import java.util.ArrayList;
-import java.util.Date;
-import java.util.List;
-import java.util.Objects;
+import java.util.*;
+import java.util.function.Function;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 import java.util.stream.Collectors;
@@ -77,9 +78,13 @@ public class RemoteExternalOrderServiceImpl implements RemoteExternalOrderServic
      private final RemoteComLogisticsCompanyService remoteComLogisticsCompanyService;
 
      private final IOrderReturnService orderReturnService;
+
      @DubboReference
      private final RemoteCustomerService remoteCustomerService;
 
+     @DubboReference
+     private final RemoteProductService remoteProductService;
+
      private final IOrderMainCrrcExtService orderMainCrrcExtService;
 
      private final IOrderInvoiceService orderInvoiceService;
@@ -279,7 +284,7 @@ public class RemoteExternalOrderServiceImpl implements RemoteExternalOrderServic
         boolean update = orderMainService.lambdaUpdate()
             .eq(OrderMain::getId, orderMainCrrcExt.getId())
             .in(OrderMain::getOrderStatus, "2", "3")
-            .set(OrderMain::getOrderStatus, "8")
+            .set(OrderMain::getOrderStatus, "7")
             .set(OrderMain::getCancelReason, cancelReason)
             .update();
         if (update != true){
@@ -299,7 +304,7 @@ public class RemoteExternalOrderServiceImpl implements RemoteExternalOrderServic
         boolean update = orderDeliverService.lambdaUpdate().eq(OrderDeliver::getId, one2.getDeliverId())
             //已完成
             //这里可以加一个幂等性判断但是目前好像没有包裹状态 胡哥还没完成
-            .set(OrderDeliver::getLogisticsStatus, PackStatusEnum.PACK_STATUS_RECEIVED)
+            .set(OrderDeliver::getLogisticsStatus, PackStatusEnum.PACK_STATUS_RECEIVED.getCode())
             .update();
         //更新完要判断订单是否完成  逻辑是 先判断订单的是不是发货完成的值  如果小于发货完成的值 就代表订单未完成
         OrderMainCrrcExt one = orderMainCrrcExtService.lambdaQuery().eq(OrderMainCrrcExt::getCrrcOrderNo, orderNo).one();
@@ -308,11 +313,11 @@ public class RemoteExternalOrderServiceImpl implements RemoteExternalOrderServic
         if (status == 5) {
             //开始判断发货是否完成
             Long totalDeliver = orderDeliverService.lambdaQuery().eq(OrderDeliver::getOrderId, one.getId()).count();
-            Long RECEIVEDeliver = orderDeliverService.lambdaQuery().eq(OrderDeliver::getOrderId, one.getId())
-                .eq(OrderDeliver::getLogisticsStatus, PackStatusEnum.PACK_STATUS_RECEIVED)
+            Long receiveDeliver = orderDeliverService.lambdaQuery().eq(OrderDeliver::getOrderId, one.getId())
+                .eq(OrderDeliver::getLogisticsStatus, PackStatusEnum.PACK_STATUS_RECEIVED.getCode())
                 .count();
 
-            if (totalDeliver.equals(RECEIVEDeliver)){
+            if (totalDeliver.equals(receiveDeliver)){
                 orderMainService.lambdaUpdate()
                     .eq(OrderMain::getOrderNo, orderNo)
                     .set(OrderMain::getOrderStatus, "6")
@@ -351,7 +356,7 @@ public class RemoteExternalOrderServiceImpl implements RemoteExternalOrderServic
         String orderNo = SequenceUtils.generateOrderCode("RS");
         orderMain.setOrderNo(orderNo);
         //5、订单状态
-        orderMain.setOrderStatus("2");
+        orderMain.setOrderStatus("1");
         //6、订单金额
         orderMain.setTotalAmount(orderDetailVo.getOrderAmount());
         //7、运费
@@ -507,11 +512,38 @@ public class RemoteExternalOrderServiceImpl implements RemoteExternalOrderServic
         }
         //商品订单
         List<OrderGoodsItem> orderGoods = orderDetailVo.getOrderGoods();
+        List<Long> goodsIds = orderGoods.stream()
+            .map(OrderGoodsItem::getGoodsId)
+            .filter(StrUtil::isNotBlank)
+            .map(Long::valueOf)
+            .distinct()
+            .toList();
+        List<OrderProductDto> orderProductDtos = remoteProductService.buildOrderProduct(goodsIds);
+        Map<Long, OrderProductDto> productMap =
+            orderProductDtos.stream()
+                .collect(Collectors.toMap(
+                    OrderProductDto::getProductId,
+                    Function.identity()
+                ));
         List<OrderProduct> orderProductList = new ArrayList<>();
         for (OrderGoodsItem item : orderGoods) {
+
+            Long productId = Long.valueOf(item.getGoodsId());
+            OrderProductDto productDto = productMap.get(productId);
             OrderProduct orderProduct = new OrderProduct();
             orderProduct.setOrderId(id);
-            orderProduct.setProductId(Long.parseLong(item.getGoodsId()));
+            orderProduct.setProductId(productId);
+            orderProduct.setOrderNo(orderNo);
+
+            // ===== 商品中心冗余字段 =====
+            if (productDto != null) {
+                orderProduct.setProductNo(productDto.getProductNo());
+                orderProduct.setProductName(productDto.getProductName());
+                orderProduct.setProductUnitId(productDto.getProductUnitId());
+                orderProduct.setProductUnit(productDto.getUnit());
+                orderProduct.setProductImage(productDto.getBarImgUrls());
+            }
+
             int quantity = item.getNum()
                 .setScale(0, RoundingMode.DOWN)  // 直接去小数,不四舍五入
                 .intValue();
@@ -575,7 +607,10 @@ public class RemoteExternalOrderServiceImpl implements RemoteExternalOrderServic
             orderReturn.setAfterSalesRemarks(afterSaleDetailVo.getMemo());
         }
         //7、售后单状态
-        orderReturn.setReturnStatus(afterSaleDetailVo.getAfterSaleStatus());
+        orderReturn.setReturnStatus(convertAfterSaleStatus(afterSaleDetailVo.getAfterSaleStatus()));
+
+        //设置商品总数量
+        orderReturn.setReturnProductNum(afterSaleDetailVo.getAfterSaleGoods().getNum().longValue());
         //9、售后单创建时间
         SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss");
         Date returnTime = null;
@@ -746,6 +781,25 @@ public class RemoteExternalOrderServiceImpl implements RemoteExternalOrderServic
         }
     }
 
+
+    private String convertAfterSaleStatus(String status) {
+        if (status == null) {
+            return null;
+        }
+        switch (status) {
+            case "10":
+                return "1";
+            case "20":
+                return "2";
+            case "30":
+                return "3";
+            case "40":
+                return "4";
+            default:
+                throw new RuntimeException("未知的中车售后状态:" + status);
+        }
+    }
+
     @Override
     public OrderReturnDto createOrderDeliver(String afterSaleNo, String expressCode, String expressCompanyName, String freight, String deliverTime) {
         OrderReturnDto orderReturnDto = new OrderReturnDto();

+ 23 - 0
ruoyi-modules/ruoyi-order/src/main/java/org/dromara/order/mapper/ZhongCheOrderMainMapper.java

@@ -0,0 +1,23 @@
+package org.dromara.order.mapper;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import org.apache.ibatis.annotations.Param;
+import org.dromara.order.domain.ZhongCheOrderMain;
+import org.dromara.order.domain.bo.ZhongCheOrderMainBo;
+import org.dromara.order.domain.vo.ZhongCheOrderMainVo;
+import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
+
+/**
+ * 订单列表Mapper接口
+ *
+ * @author LionLi
+ * @date 2026-02-25
+ */
+public interface ZhongCheOrderMainMapper extends BaseMapperPlus<ZhongCheOrderMain, ZhongCheOrderMainVo> {
+
+    Page<ZhongCheOrderMainVo> selectJoinPage(
+        @Param("page") Page<?> page,
+        @Param("bo") ZhongCheOrderMainBo bo
+    );
+
+}

+ 20 - 0
ruoyi-modules/ruoyi-order/src/main/java/org/dromara/order/service/IOrderMainService.java

@@ -3,14 +3,20 @@ package org.dromara.order.service;
 import com.baomidou.mybatisplus.extension.service.IService;
 import org.dromara.common.mybatis.core.page.PageQuery;
 import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.common.core.exception.api.ZhongcheException;
 import org.dromara.order.domain.OrderMain;
+import org.dromara.order.domain.OrderProduct;
 import org.dromara.order.domain.bo.OrderMainBo;
 import org.dromara.order.domain.bo.OrderProductBo;
+import org.dromara.order.domain.vo.OrderDeliverVo;
 import org.dromara.order.domain.vo.OrderMainVo;
+
 import org.dromara.order.domain.vo.OrderProductVo;
 import org.dromara.order.domain.vo.OrderStatusStats;
+import org.dromara.order.utils.kd100.domain.TrackData;
 
 import java.util.Collection;
+import java.util.Date;
 import java.util.List;
 import java.util.Set;
 
@@ -102,4 +108,18 @@ public interface IOrderMainService extends IService<OrderMain> {
     Boolean batchConfirmation(Set<Long> ids);
 
     Boolean closeOrderByIds(Collection<Long> ids, Boolean isValid);
+
+    TableDataInfo<OrderMainVo> queryZhongChePageList(OrderMainBo bo, PageQuery pageQuery);
+
+    boolean accept(Long id) throws ZhongcheException;
+
+    boolean reject(Long id, String reason);
+
+    List<OrderDeliverVo> queryLogisticsByOrderId(Long id);
+
+    List<TrackData> queryLogisticsTrackById(Long id);
+
+    boolean settlement(Long id);
+
+    boolean setdeadline(Long id, Date deadline);
 }

+ 8 - 0
ruoyi-modules/ruoyi-order/src/main/java/org/dromara/order/service/IOrderReturnService.java

@@ -67,4 +67,12 @@ public interface IOrderReturnService extends IService<OrderReturn>{
      * @return 是否删除成功
      */
     Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
+
+    /**
+     * 查询中车售后订单
+     * @param bo
+     * @param pageQuery
+     * @return
+     */
+    TableDataInfo<OrderReturnVo> queryZhongchePageList(OrderReturnBo bo, PageQuery pageQuery);
 }

+ 86 - 0
ruoyi-modules/ruoyi-order/src/main/java/org/dromara/order/service/IZhongCheOrderMainService.java

@@ -0,0 +1,86 @@
+package org.dromara.order.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import org.dromara.common.core.exception.api.ZhongcheException;
+import org.dromara.order.domain.ZhongCheOrderMain;
+import org.dromara.order.domain.vo.OrderDeliverVo;
+import org.dromara.order.domain.vo.ZhongCheOrderMainVo;
+import org.dromara.order.domain.bo.ZhongCheOrderMainBo;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.common.mybatis.core.page.PageQuery;
+import org.dromara.order.utils.kd100.domain.TrackData;
+
+import java.util.Collection;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * 订单列表Service接口
+ *
+ * @author LionLi
+ * @date 2026-02-25
+ */
+public interface IZhongCheOrderMainService extends IService<ZhongCheOrderMain>{
+
+    /**
+     * 查询订单列表
+     *
+     * @param id 主键
+     * @return 订单列表
+     */
+    ZhongCheOrderMainVo queryById(Long id);
+
+    /**
+     * 分页查询订单列表列表
+     *
+     * @param bo        查询条件
+     * @param pageQuery 分页参数
+     * @return 订单列表分页列表
+     */
+    TableDataInfo<ZhongCheOrderMainVo> queryPageList(ZhongCheOrderMainBo bo, PageQuery pageQuery);
+
+    /**
+     * 查询符合条件的订单列表列表
+     *
+     * @param bo 查询条件
+     * @return 订单列表列表
+     */
+    List<ZhongCheOrderMainVo> queryList(ZhongCheOrderMainBo bo);
+
+    /**
+     * 新增订单列表
+     *
+     * @param bo 订单列表
+     * @return 是否新增成功
+     */
+    Boolean insertByBo(ZhongCheOrderMainBo bo);
+
+    /**
+     * 修改订单列表
+     *
+     * @param bo 订单列表
+     * @return 是否修改成功
+     */
+    Boolean updateByBo(ZhongCheOrderMainBo bo);
+
+    /**
+     * 校验并批量删除订单列表信息
+     *
+     * @param ids     待删除的主键集合
+     * @param isValid 是否进行有效性校验
+     * @return 是否删除成功
+     */
+    Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
+
+    boolean accept(Long id) throws ZhongcheException;
+
+    boolean reject(Long id, String reason);
+
+    List<OrderDeliverVo> queryLogisticsByOrderId(Long id);
+
+    List<TrackData> queryLogisticsTrackById(Long id);
+
+    boolean settlement(Long id);
+
+    boolean setdeadline(Long id, Date deadline);
+}

+ 189 - 3
ruoyi-modules/ruoyi-order/src/main/java/org/dromara/order/service/impl/OrderMainServiceImpl.java

@@ -12,6 +12,7 @@ import lombok.extern.slf4j.Slf4j;
 import org.apache.dubbo.config.annotation.DubboReference;
 import org.dromara.common.core.enums.OrderPayType;
 import org.dromara.common.core.enums.OrderStatus;
+import org.dromara.common.core.exception.api.ZhongcheException;
 import org.dromara.common.core.utils.MapstructUtils;
 import org.dromara.common.core.utils.StringUtils;
 import org.dromara.common.mybatis.core.page.PageQuery;
@@ -22,14 +23,24 @@ import org.dromara.customer.api.RemoteCustomerService;
 import org.dromara.customer.api.domain.vo.RemoteCustomerSalesVo;
 import org.dromara.order.domain.OrderMain;
 import org.dromara.order.domain.OrderProduct;
+import org.dromara.external.api.zhongche.RemoteZhongChePullService;
+import org.dromara.external.api.zhongche.domain.bo.OrderConfirmBo;
+import org.dromara.external.api.zhongche.domain.bo.OrderRejectBo;
+import org.dromara.external.api.zhongche.domain.vo.GoodsUpdateVo;
+import org.dromara.order.domain.*;
 import org.dromara.order.domain.bo.OrderMainBo;
 import org.dromara.order.domain.bo.OrderProductBo;
 import org.dromara.order.domain.dto.AssignmentStatsDto;
-import org.dromara.order.domain.vo.OrderMainVo;
-import org.dromara.order.domain.vo.OrderProductVo;
-import org.dromara.order.domain.vo.OrderStatusStats;
+import org.dromara.order.domain.vo.*;
 import org.dromara.order.mapper.*;
+import org.dromara.order.service.IOrderDeliverService;
+import org.dromara.order.service.IOrderMainCrrcExtService;
 import org.dromara.order.service.IOrderMainService;
+import org.dromara.order.utils.kd100.Kd100Util;
+import org.dromara.order.utils.kd100.domain.QueryTrackDTO;
+import org.dromara.order.utils.kd100.domain.TrackData;
+import org.dromara.order.utils.kd100.domain.TrackVO;
+import org.dromara.system.api.RemoteComLogisticsCompanyService;
 import org.dromara.system.api.RemoteDeptService;
 import org.dromara.system.api.RemoteUserService;
 import org.springframework.stereotype.Service;
@@ -75,6 +86,16 @@ public class OrderMainServiceImpl extends ServiceImpl<OrderMainMapper, OrderMain
 
     private final OrderCustomerFlowNodeMapper orderCustomerFlowNodeMapper;
 
+    private final IOrderMainCrrcExtService orderMainCrrcExtService;
+
+    private final IOrderDeliverService orderDeliverService;
+
+    @DubboReference
+    private final RemoteComLogisticsCompanyService remoteComLogisticsCompanyService;
+
+    @DubboReference
+    private final RemoteZhongChePullService zhongChePullService;
+
     /**
      * 查询订单主信息
      *
@@ -648,4 +669,169 @@ public class OrderMainServiceImpl extends ServiceImpl<OrderMainMapper, OrderMain
 
         return updateSuccess;
     }
+
+    @Override
+    public TableDataInfo<OrderMainVo> queryZhongChePageList(OrderMainBo bo, PageQuery pageQuery) {
+        LambdaQueryWrapper<OrderMain> lqw = buildQueryWrapper(bo);
+        lqw.eq(OrderMain::getDataSource,"zhongche");
+        Page<OrderMainVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
+        List<OrderMainVo> records = result.getRecords();
+
+        if (CollUtil.isNotEmpty(records)) {
+            List<Long> ids = records.stream()
+                .map(OrderMainVo::getId)
+                .collect(Collectors.toList());
+
+            List<OrderMainCrrcExt> extList =
+                orderMainCrrcExtService.lambdaQuery()
+                    .in(OrderMainCrrcExt::getId, ids)
+                    .list();
+
+            Map<Long, OrderMainCrrcExt> extMap =
+                extList.stream()
+                    .collect(Collectors.toMap(
+                        OrderMainCrrcExt::getId,
+                        Function.identity()
+                    ));
+
+            for (OrderMainVo vo : records) {
+                OrderMainCrrcExt ext = extMap.get(vo.getId());
+                if (ext != null) {
+                    vo.setBuyerName(ext.getBuyerName());
+                    vo.setPreOrder(ext.getPreOrder());
+                    vo.setReconciliationStatus(ext.getReconciliationStatus());
+                    vo.setIsProperDelivery(ext.getIsProperDelivery());
+                    vo.setInvoiceStatus(ext.getInvoiceStatus());
+                    vo.setSettlementStatus(ext.getSettlementStatus());
+                    vo.setRepaymentDeadline(ext.getRepaymentDeadline());
+                }
+            }
+        }
+        return TableDataInfo.build(result);
+    }
+
+    @Override
+    public boolean accept(Long id) throws ZhongcheException {
+        //查主表拿我们系统订单号
+        OrderMain orderMain = baseMapper.selectById(id);
+        if (orderMain == null) {
+            throw new ZhongcheException("订单不存在");
+        }
+        String orderNo = orderMain.getOrderNo();
+        // 查扩展表拿中车订单号(ID一致!)
+        OrderMainCrrcExt ext = orderMainCrrcExtService.getById(id);
+        if (ext == null) {
+            throw new ZhongcheException("中车订单扩展信息不存在");
+        }
+        String crrcOrderNo = ext.getCrrcOrderNo();
+        OrderConfirmBo bo = new OrderConfirmBo(crrcOrderNo,orderNo);
+        GoodsUpdateVo goodsUpdateVo = zhongChePullService.mallOrderConfirm(bo);
+        if (goodsUpdateVo.getResult() != 1) {
+            throw new ZhongcheException("中车订单扩展信息不存在");
+        }
+        OrderMain update = new OrderMain();
+        update.setId(id);
+        update.setOrderStatus("2");   // ← 待发货
+
+        int rows = baseMapper.updateById(update);
+        return rows > 0;
+
+
+    }
+
+    @Override
+    public boolean reject(Long id, String reason) throws ZhongcheException {
+        //查主表拿我们系统订单号
+        OrderMain orderMain = baseMapper.selectById(id);
+        if (orderMain == null) {
+            throw new ZhongcheException("订单不存在");
+        }
+        String orderNo = orderMain.getOrderNo();
+        // 查扩展表拿中车订单号(ID一致!)
+        OrderMainCrrcExt ext = orderMainCrrcExtService.getById(id);
+        if (ext == null) {
+            throw new ZhongcheException("中车订单扩展信息不存在");
+        }
+        String crrcOrderNo = ext.getCrrcOrderNo();
+        OrderRejectBo bo = new OrderRejectBo(crrcOrderNo,orderNo,reason);
+        GoodsUpdateVo goodsUpdateVo = zhongChePullService.mallOrderReject(bo);
+        if (goodsUpdateVo.getResult() != 1) {
+            throw new ZhongcheException("拒绝失败");
+        }
+        OrderMain update = new OrderMain();
+        update.setId(id);
+        update.setOrderStatus("7");
+        update.setRemark(reason);
+        int rows = baseMapper.updateById(update);
+        return rows > 0;
+    }
+
+    @Override
+    public List<OrderDeliverVo> queryLogisticsByOrderId(Long id) {
+        List<OrderDeliver> list = orderDeliverService.lambdaQuery()
+            .eq(OrderDeliver::getOrderId, id)
+            .select(OrderDeliver::getLogisticNo, OrderDeliver::getLogisticsCompanyId, OrderDeliver::getId)
+            .list();
+
+        if (org.springframework.util.CollectionUtils.isEmpty(list)) {
+            return Collections.emptyList();
+        }
+
+        // 2. 收集 LogisticsCompanyId(去重)
+        List<Long> companyIds = list.stream()
+            .map(OrderDeliver::getLogisticsCompanyId)
+            .filter(Objects::nonNull)
+            .distinct()
+            .collect(Collectors.toList());
+
+        // 3. 批量查询物流公司名称
+        Map<Long, String> companyMap = remoteComLogisticsCompanyService
+            .selectLogisticsCompanyNameByIds(companyIds);
+
+        // 4. 组装返回数据
+        return list.stream().map(item -> {
+            OrderDeliverVo vo = new OrderDeliverVo();
+            vo.setLogisticNo(item.getLogisticNo());
+            vo.setId(item.getId());
+            vo.setLogisticsCompanyName(
+                companyMap.getOrDefault(item.getLogisticsCompanyId(), "")
+            );
+            return vo;
+        }).collect(Collectors.toList());
+
+    }
+
+    @Override
+    public List<TrackData> queryLogisticsTrackById(Long id) {
+        OrderDeliver one = orderDeliverService.lambdaQuery()
+            .eq(OrderDeliver::getId, id)
+            .select(OrderDeliver::getLogisticNo, OrderDeliver::getLogisticsCompanyCode, OrderDeliver::getConsigneePhone)
+            .one();
+        if (one == null) {
+            return Collections.emptyList();
+        }
+        QueryTrackDTO dto = new QueryTrackDTO(one.getLogisticsCompanyCode(), one.getLogisticNo(), one.getConsigneePhone());
+        TrackVO trackVO = Kd100Util.queryTrack(dto);
+        return trackVO.getData();
+
+
+    }
+
+    @Override
+    public boolean settlement(Long id) {
+        boolean update = orderMainCrrcExtService.lambdaUpdate()
+            .eq(OrderMainCrrcExt::getId, id)
+            .set(OrderMainCrrcExt::getSettlementStatus, true)
+            .update();
+        return update;
+    }
+
+    @Override
+    public boolean setdeadline(Long id, Date deadline) {
+        boolean update = orderMainCrrcExtService.lambdaUpdate()
+            .eq(OrderMainCrrcExt::getId, id)
+            .set(OrderMainCrrcExt::getRepaymentDeadline, deadline)
+            .update();
+        return update;
+    }
 }

+ 7 - 0
ruoyi-modules/ruoyi-order/src/main/java/org/dromara/order/service/impl/OrderReturnServiceImpl.java

@@ -272,4 +272,11 @@ public class OrderReturnServiceImpl extends ServiceImpl<OrderReturnMapper, Order
         }
         return baseMapper.deleteByIds(ids) > 0;
     }
+
+    @Override
+    public TableDataInfo<OrderReturnVo> queryZhongchePageList(OrderReturnBo bo, PageQuery pageQuery) {
+        LambdaQueryWrapper<OrderReturn> lqw = buildQueryWrapper(bo);
+        Page<OrderReturnVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
+        return TableDataInfo.build(result);
+    }
 }

+ 324 - 0
ruoyi-modules/ruoyi-order/src/main/java/org/dromara/order/service/impl/ZhongCheOrderMainServiceImpl.java

@@ -0,0 +1,324 @@
+package org.dromara.order.service.impl;
+
+import cn.hutool.core.collection.CollUtil;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.apache.dubbo.config.annotation.DubboReference;
+import org.dromara.common.core.exception.api.ZhongcheException;
+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.dromara.external.api.zhongche.RemoteZhongChePullService;
+import org.dromara.external.api.zhongche.domain.bo.OrderConfirmBo;
+import org.dromara.external.api.zhongche.domain.bo.OrderRejectBo;
+import org.dromara.external.api.zhongche.domain.vo.GoodsUpdateVo;
+import org.dromara.order.domain.OrderDeliver;
+import org.dromara.order.domain.OrderMainCrrcExt;
+import org.dromara.order.domain.vo.OrderDeliverVo;
+import org.dromara.order.service.IOrderDeliverService;
+import org.dromara.order.service.IOrderMainCrrcExtService;
+import org.dromara.order.utils.kd100.Kd100Util;
+import org.dromara.order.utils.kd100.domain.QueryTrackDTO;
+import org.dromara.order.utils.kd100.domain.TrackData;
+import org.dromara.order.utils.kd100.domain.TrackVO;
+import org.dromara.system.api.RemoteComLogisticsCompanyService;
+import org.springframework.stereotype.Service;
+import org.dromara.order.domain.bo.ZhongCheOrderMainBo;
+import org.dromara.order.domain.vo.ZhongCheOrderMainVo;
+import org.dromara.order.domain.ZhongCheOrderMain;
+import org.dromara.order.mapper.ZhongCheOrderMainMapper;
+import org.dromara.order.service.IZhongCheOrderMainService;
+import org.springframework.util.CollectionUtils;
+
+import java.util.*;
+import java.util.function.Function;
+import java.util.stream.Collectors;
+
+/**
+ * 订单列表Service业务层处理
+ *
+ * @author LionLi
+ * @date 2026-02-25
+ */
+@Slf4j
+@RequiredArgsConstructor
+@Service
+public class ZhongCheOrderMainServiceImpl  extends ServiceImpl<ZhongCheOrderMainMapper, ZhongCheOrderMain> implements IZhongCheOrderMainService {
+
+    private final ZhongCheOrderMainMapper baseMapper;
+
+    private final IOrderMainCrrcExtService orderMainCrrcExtService;
+
+    @DubboReference
+    private final RemoteZhongChePullService zhongChePullService;
+
+    private final IOrderDeliverService orderDeliverService;
+
+    @DubboReference
+    private final RemoteComLogisticsCompanyService remoteComLogisticsCompanyService;
+
+    /**
+     * 查询订单列表
+     *
+     * @param id 主键
+     * @return 订单列表
+     */
+    @Override
+    public ZhongCheOrderMainVo queryById(Long id){
+        return baseMapper.selectVoById(id);
+    }
+
+    /**
+     * 分页查询订单列表列表
+     *
+     * @param bo        查询条件
+     * @param pageQuery 分页参数
+     * @return 订单列表分页列表
+     */
+    @Override
+    public TableDataInfo<ZhongCheOrderMainVo> queryPageList(ZhongCheOrderMainBo bo, PageQuery pageQuery) {
+        LambdaQueryWrapper<ZhongCheOrderMain> lqw = buildQueryWrapper(bo);
+        lqw.eq(ZhongCheOrderMain::getDataSource,"zhongche");
+        Page<ZhongCheOrderMainVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
+        List<ZhongCheOrderMainVo> records = result.getRecords();
+
+        if (CollUtil.isNotEmpty(records)) {
+            List<Long> ids = records.stream()
+                .map(ZhongCheOrderMainVo::getId)
+                .collect(Collectors.toList());
+
+            List<OrderMainCrrcExt> extList =
+                orderMainCrrcExtService.lambdaQuery()
+                    .in(OrderMainCrrcExt::getId, ids)
+                    .list();
+
+            Map<Long, OrderMainCrrcExt> extMap =
+                extList.stream()
+                    .collect(Collectors.toMap(
+                        OrderMainCrrcExt::getId,
+                        Function.identity()
+                    ));
+
+            for (ZhongCheOrderMainVo vo : records) {
+                OrderMainCrrcExt ext = extMap.get(vo.getId());
+                if (ext != null) {
+                    vo.setBuyerName(ext.getBuyerName());
+                    vo.setPreOrder(ext.getPreOrder());
+                    vo.setReconciliationStatus(ext.getReconciliationStatus());
+                    vo.setIsProperDelivery(ext.getIsProperDelivery());
+                    vo.setInvoiceStatus(ext.getInvoiceStatus());
+                    vo.setSettlementStatus(ext.getSettlementStatus());
+                    vo.setRepaymentDeadline(ext.getRepaymentDeadline());
+                }
+            }
+        }
+        return TableDataInfo.build(result);
+    }
+
+    /**
+     * 查询符合条件的订单列表列表
+     *
+     * @param bo 查询条件
+     * @return 订单列表列表
+     */
+    @Override
+    public List<ZhongCheOrderMainVo> queryList(ZhongCheOrderMainBo bo) {
+        LambdaQueryWrapper<ZhongCheOrderMain> lqw = buildQueryWrapper(bo);
+        return baseMapper.selectVoList(lqw);
+    }
+
+    private LambdaQueryWrapper<ZhongCheOrderMain> buildQueryWrapper(ZhongCheOrderMainBo bo) {
+        Map<String, Object> params = bo.getParams();
+        LambdaQueryWrapper<ZhongCheOrderMain> lqw = Wrappers.lambdaQuery();
+        lqw.orderByAsc(ZhongCheOrderMain::getId);
+        lqw.eq(StringUtils.isNotBlank(bo.getOrderNo()), ZhongCheOrderMain::getOrderNo, bo.getOrderNo());
+        lqw.eq(StringUtils.isNotBlank(bo.getPaymentStatus()), ZhongCheOrderMain::getPaymentStatus, bo.getPaymentStatus());
+        lqw.eq(StringUtils.isNotBlank(bo.getOrderStatus()), ZhongCheOrderMain::getOrderStatus, bo.getOrderStatus());
+        return lqw;
+    }
+
+    /**
+     * 新增订单列表
+     *
+     * @param bo 订单列表
+     * @return 是否新增成功
+     */
+    @Override
+    public Boolean insertByBo(ZhongCheOrderMainBo bo) {
+        ZhongCheOrderMain add = MapstructUtils.convert(bo, ZhongCheOrderMain.class);
+        validEntityBeforeSave(add);
+        boolean flag = baseMapper.insert(add) > 0;
+        if (flag) {
+            bo.setId(add.getId());
+        }
+        return flag;
+    }
+
+    /**
+     * 修改订单列表
+     *
+     * @param bo 订单列表
+     * @return 是否修改成功
+     */
+    @Override
+    public Boolean updateByBo(ZhongCheOrderMainBo bo) {
+        ZhongCheOrderMain update = MapstructUtils.convert(bo, ZhongCheOrderMain.class);
+        validEntityBeforeSave(update);
+        return baseMapper.updateById(update) > 0;
+    }
+
+    /**
+     * 保存前的数据校验
+     */
+    private void validEntityBeforeSave(ZhongCheOrderMain entity){
+        //TODO 做一些数据校验,如唯一约束
+    }
+
+    /**
+     * 校验并批量删除订单列表信息
+     *
+     * @param ids     待删除的主键集合
+     * @param isValid 是否进行有效性校验
+     * @return 是否删除成功
+     */
+    @Override
+    public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
+        if(isValid){
+            //TODO 做一些业务上的校验,判断是否需要校验
+        }
+        return baseMapper.deleteByIds(ids) > 0;
+    }
+
+    @Override
+    public boolean accept(Long id) throws ZhongcheException {
+        //查主表拿我们系统订单号
+        ZhongCheOrderMain orderMain = baseMapper.selectById(id);
+        if (orderMain == null) {
+            throw new ZhongcheException("订单不存在");
+        }
+        String orderNo = orderMain.getOrderNo();
+        // 查扩展表拿中车订单号(ID一致!)
+        OrderMainCrrcExt ext = orderMainCrrcExtService.getById(id);
+        if (ext == null) {
+            throw new ZhongcheException("中车订单扩展信息不存在");
+        }
+        String crrcOrderNo = ext.getCrrcOrderNo();
+        OrderConfirmBo bo = new OrderConfirmBo(crrcOrderNo,orderNo);
+        GoodsUpdateVo goodsUpdateVo = zhongChePullService.mallOrderConfirm(bo);
+        if (goodsUpdateVo.getResult() != 1) {
+            throw new ZhongcheException("中车订单扩展信息不存在");
+        }
+        ZhongCheOrderMain update = new ZhongCheOrderMain();
+        update.setId(id);
+        update.setOrderStatus("2");   // ← 待发货
+
+        int rows = baseMapper.updateById(update);
+        return rows > 0;
+
+
+    }
+
+    @Override
+    public boolean reject(Long id, String reason) throws ZhongcheException {
+        //查主表拿我们系统订单号
+        ZhongCheOrderMain orderMain = baseMapper.selectById(id);
+        if (orderMain == null) {
+            throw new ZhongcheException("订单不存在");
+        }
+        String orderNo = orderMain.getOrderNo();
+        // 查扩展表拿中车订单号(ID一致!)
+        OrderMainCrrcExt ext = orderMainCrrcExtService.getById(id);
+        if (ext == null) {
+            throw new ZhongcheException("中车订单扩展信息不存在");
+        }
+        String crrcOrderNo = ext.getCrrcOrderNo();
+        OrderRejectBo bo = new OrderRejectBo(crrcOrderNo,orderNo,reason);
+        GoodsUpdateVo goodsUpdateVo = zhongChePullService.mallOrderReject(bo);
+        if (goodsUpdateVo.getResult() != 1) {
+            throw new ZhongcheException("拒绝失败");
+        }
+        ZhongCheOrderMain update = new ZhongCheOrderMain();
+        update.setId(id);
+        update.setOrderStatus("7");
+        update.setRemark(reason);
+        int rows = baseMapper.updateById(update);
+        return rows > 0;
+    }
+
+    @Override
+    public List<OrderDeliverVo> queryLogisticsByOrderId(Long id) {
+        List<OrderDeliver> list = orderDeliverService.lambdaQuery()
+            .eq(OrderDeliver::getOrderId, id)
+            .select(OrderDeliver::getLogisticNo, OrderDeliver::getLogisticsCompanyId, OrderDeliver::getId)
+            .list();
+
+        if (CollectionUtils.isEmpty(list)) {
+            return Collections.emptyList();
+        }
+
+        // 2. 收集 LogisticsCompanyId(去重)
+        List<Long> companyIds = list.stream()
+            .map(OrderDeliver::getLogisticsCompanyId)
+            .filter(Objects::nonNull)
+            .distinct()
+            .collect(Collectors.toList());
+
+        // 3. 批量查询物流公司名称
+        Map<Long, String> companyMap = remoteComLogisticsCompanyService
+            .selectLogisticsCompanyNameByIds(companyIds);
+
+        // 4. 组装返回数据
+        return list.stream().map(item -> {
+            OrderDeliverVo vo = new OrderDeliverVo();
+            vo.setLogisticNo(item.getLogisticNo());
+            vo.setId(item.getId());
+            vo.setLogisticsCompanyName(
+                companyMap.getOrDefault(item.getLogisticsCompanyId(), "")
+            );
+            return vo;
+        }).collect(Collectors.toList());
+
+    }
+
+    @Override
+    public List<TrackData> queryLogisticsTrackById(Long id) {
+        OrderDeliver one = orderDeliverService.lambdaQuery()
+            .eq(OrderDeliver::getId, id)
+            .select(OrderDeliver::getLogisticNo, OrderDeliver::getLogisticsCompanyCode, OrderDeliver::getConsigneePhone)
+            .one();
+        if (one == null) {
+            return Collections.emptyList();
+        }
+        QueryTrackDTO dto = new QueryTrackDTO(one.getLogisticsCompanyCode(), one.getLogisticNo(), one.getConsigneePhone());
+        TrackVO trackVO = Kd100Util.queryTrack(dto);
+        return trackVO.getData();
+
+
+    }
+
+    @Override
+    public boolean settlement(Long id) {
+        boolean update = orderMainCrrcExtService.lambdaUpdate()
+            .eq(OrderMainCrrcExt::getId, id)
+            .set(OrderMainCrrcExt::getSettlementStatus, true)
+            .update();
+        return update;
+    }
+
+    @Override
+    public boolean setdeadline(Long id, Date deadline) {
+        boolean update = orderMainCrrcExtService.lambdaUpdate()
+            .eq(OrderMainCrrcExt::getId, id)
+            .set(OrderMainCrrcExt::getRepaymentDeadline, deadline)
+            .update();
+        return update;
+    }
+
+
+}

+ 35 - 0
ruoyi-modules/ruoyi-order/src/main/resources/mapper/order/ZhongCheOrderMainMapper.xml

@@ -0,0 +1,35 @@
+<?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.order.mapper.ZhongCheOrderMainMapper">
+
+    <select id="selectJoinPage" resultType="org.dromara.order.domain.vo.ZhongCheOrderMainVo">
+
+        SELECT
+        m.*,
+        ext.buyer_name,
+        ext.pre_order,
+        ext.reconciliation_status,
+        ext.is_proper_delivery,
+        ext.invoice_status,
+        ext.settlement_status,
+        ext.repayment_deadline
+        FROM order_main m
+        LEFT JOIN order_main_crrc_ext ext
+        ON m.id = ext.id
+        <where>
+            m.del_flag = '0'
+            AND m.data_source = 'zhongche'
+            <if test="bo.orderNo != null and bo.orderNo != ''">
+                AND m.order_no = #{bo.orderNo}
+            </if>
+            <if test="bo.orderStatus != null and bo.orderStatus != ''">
+                AND m.order_status = #{bo.orderStatus}
+            </if>
+            <if test="bo.paymentStatus != null and bo.paymentStatus != ''">
+                AND m.payment_status = #{bo.paymentStatus}
+            </if>
+        </where>
+    </select>
+</mapper>

+ 61 - 0
ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/dubbo/RemoteProductServiceImpl.java

@@ -21,6 +21,7 @@ import org.dromara.product.api.domain.ProductVo;
 import org.dromara.product.api.domain.SiteProductRemoteBo;
 import org.dromara.product.api.domain.SiteProductRemoteResult;
 import org.dromara.product.api.domain.SiteProductRemoteVo;
+import org.dromara.product.api.domain.zhongche.dto.OrderProductDto;
 import org.dromara.product.api.domain.zhongche.dto.ProductAggregateDto;
 import org.dromara.product.api.domain.zhongche.dto.StocksResult;
 import org.dromara.product.api.domain.zhongche.dto.StocksResultDto;
@@ -493,6 +494,66 @@ public class RemoteProductServiceImpl implements RemoteProductService {
         }).toList();
     }
 
+    public List<OrderProductDto> buildOrderProduct(List<Long> productIds){
+        if (CollUtil.isEmpty(productIds)) {
+            return Collections.emptyList();
+        }
+        // ① 查商品基础表
+        List<ProductBase> productList = productBaseService.list(
+            new LambdaQueryWrapper<ProductBase>()
+                .in(ProductBase::getId, productIds)
+        );
+
+        if (CollUtil.isEmpty(productList)) {
+            return Collections.emptyList();
+        }
+
+        // ② 提取 unitId
+        List<Long> unitIds = productList.stream()
+            .map(ProductBase::getUnitId)
+            .filter(Objects::nonNull)
+            .distinct()
+            .toList();
+
+        // ③ 查单位表(核心逻辑就是你 getProductInfo 里的)
+        Map<Long, String> unitNameMap = Collections.emptyMap();
+        if (CollUtil.isNotEmpty(unitIds)) {
+            List<ProductUnit> unitList = productUnitService.list(
+                new LambdaQueryWrapper<ProductUnit>()
+                    .in(ProductUnit::getId, unitIds)
+            );
+
+            unitNameMap = unitList.stream()
+                .collect(Collectors.toMap(
+                    ProductUnit::getId,
+                    ProductUnit::getUnitName,
+                    (a,b)->a
+                ));
+        }
+
+        Map<Long, String> finalUnitNameMap = unitNameMap;
+
+        // ④ 组装订单商品DTO(快照)
+        return productList.stream().map(p -> {
+
+            OrderProductDto dto = new OrderProductDto();
+
+            dto.setProductId(p.getId());
+            dto.setProductNo(p.getProductNo());
+            dto.setProductName(p.getItemName());
+
+            dto.setProductUnitId(p.getUnitId());
+
+            //关键:单位名称冗余快照
+            dto.setUnit(finalUnitNameMap.get(p.getUnitId()));
+
+            // 图片json化(订单必须冗余)
+            String productImage = p.getProductImage();
+            dto.setBarImgUrls(productImage);
+            return dto;
+        }).toList();
+    }
+
     @Override
     @Transactional
     public boolean lockShoppingCart(Long productId, Long count,String accountName) {

+ 29 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/dubbo/RemoteComLogisticsCompanyServiceImpl.java

@@ -7,6 +7,11 @@ import org.dromara.system.domain.ComLogisticsCompany;
 import org.dromara.system.service.IComLogisticsCompanyService;
 import org.springframework.stereotype.Service;
 
+import java.util.Collections;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
 /**
  * author
  * 时间:2026/2/2,19:13
@@ -22,4 +27,28 @@ public class RemoteComLogisticsCompanyServiceImpl implements RemoteComLogisticsC
         ComLogisticsCompany one = comLogisticsCompanyService.lambdaQuery().eq(ComLogisticsCompany::getId, ids).select(ComLogisticsCompany::getLogisticsName).one();
         return one == null ? "" : one.getLogisticsName();
     }
+
+    @Override
+    public Map<Long, String> selectLogisticsCompanyNameByIds(List<Long> ids) {
+        if (ids == null || ids.isEmpty()) {
+            return Collections.emptyMap();
+        }
+
+        List<ComLogisticsCompany> list = comLogisticsCompanyService.lambdaQuery()
+            .in(ComLogisticsCompany::getId, ids)
+            .select(ComLogisticsCompany::getId, ComLogisticsCompany::getLogisticsName)
+            .list();
+
+        if (list == null || list.isEmpty()) {
+            return Collections.emptyMap();
+        }
+
+        return list.stream()
+            .collect(Collectors.toMap(
+                ComLogisticsCompany::getId,
+                ComLogisticsCompany::getLogisticsName,
+                (a, b) -> b   // 防止重复key报错(虽然一般不会)
+            ));
+
+    }
 }