Ver código fonte

Merge remote-tracking branch 'origin/master'

# Conflicts:
#	ruoyi-api/ruoyi-api-product/src/main/java/org/dromara/product/api/RemoteProductService.java
#	ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/dubbo/RemoteProductServiceImpl.java
#	ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysDeptServiceImpl.java
tjxt 3 meses atrás
pai
commit
6b23a16345
100 arquivos alterados com 3903 adições e 498 exclusões
  1. 5 4
      pom.xml
  2. 2 1
      ruoyi-api/pom.xml
  3. 5 0
      ruoyi-api/ruoyi-api-bom/pom.xml
  4. 28 0
      ruoyi-api/ruoyi-api-customer/pom.xml
  5. 10 0
      ruoyi-api/ruoyi-api-customer/src/main/java/org/dromara/customer/api/RemoteCustomerService.java
  6. 1 1
      ruoyi-api/ruoyi-api-external/src/main/java/org/dromara/external/api/zhongzhi/domain/vo/ZhongzhiExternalProductVo.java
  7. 6 0
      ruoyi-api/ruoyi-api-product/src/main/java/org/dromara/product/api/RemoteProductService.java
  8. 9 9
      ruoyi-api/ruoyi-api-product/src/main/java/org/dromara/product/api/domain/ProductVo.java
  9. 128 0
      ruoyi-api/ruoyi-api-product/src/main/java/org/dromara/product/api/domain/RemoteProductBrand.java
  10. 25 0
      ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/RemoteDeptService.java
  11. 6 0
      ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/domain/vo/RemoteDeptVo.java
  12. 27 0
      ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/enums/OrderAssignStatus.java
  13. 27 0
      ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/enums/OrderSplitStatus.java
  14. 21 0
      ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/enums/SysPlatformYesNo.java
  15. 14 0
      ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/core/page/PageQuery.java
  16. 54 6
      ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/interceptor/PlatformDataScopeInterceptor.java
  17. 20 9
      ruoyi-common/ruoyi-common-redis/src/main/java/org/dromara/common/redis/utils/SequenceUtils.java
  18. 213 0
      ruoyi-common/ruoyi-common-tenant/src/main/java/org/dromara/common/tenant/helper/PlatformHelper.java
  19. 3 3
      ruoyi-example/ruoyi-demo/src/main/resources/application.yml
  20. 8 0
      ruoyi-modules/ruoyi-customer/pom.xml
  21. 7 0
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/controller/CustomerDeptController.java
  22. 2 44
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/domain/CustomerDept.java
  23. 1 1
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/domain/CustomerSalesInfo.java
  24. 1 5
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/domain/bo/CustomerDeptBo.java
  25. 1 1
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/domain/bo/CustomerSalesInfoBo.java
  26. 27 0
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/domain/vo/CustomerDeptTreeVo.java
  27. 2 9
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/domain/vo/CustomerDeptVo.java
  28. 1 1
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/domain/vo/CustomerSalesInfoVo.java
  29. 25 0
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/dubbo/RemoteCustomerServiceImpl.java
  30. 4 2
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/service/ICustomerDeptService.java
  31. 4 0
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/service/ICustomerInfoService.java
  32. 137 70
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/service/impl/CustomerDeptServiceImpl.java
  33. 115 89
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/service/impl/CustomerInfoServiceImpl.java
  34. 0 1
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/service/impl/CustomerSalesInfoServiceImpl.java
  35. 7 7
      ruoyi-modules/ruoyi-external/src/main/java/org/dromara/external/controller/ExternalItemController.java
  36. 7 7
      ruoyi-modules/ruoyi-external/src/main/java/org/dromara/external/controller/ExternalProductBrandController.java
  37. 19 19
      ruoyi-modules/ruoyi-external/src/main/java/org/dromara/external/controller/ExternalProductCategoryController.java
  38. 106 0
      ruoyi-modules/ruoyi-external/src/main/java/org/dromara/external/controller/ExternalProductChangeLogController.java
  39. 106 0
      ruoyi-modules/ruoyi-external/src/main/java/org/dromara/external/controller/ExternalProductController.java
  40. 7 7
      ruoyi-modules/ruoyi-external/src/main/java/org/dromara/external/controller/ExternalPushPoolLogController.java
  41. 1 0
      ruoyi-modules/ruoyi-external/src/main/java/org/dromara/external/controller/zhongzhi/ZhongZhiPullController.java
  42. 4 9
      ruoyi-modules/ruoyi-external/src/main/java/org/dromara/external/controller/zhongzhi/ZhongZhiPushController.java
  43. 2 2
      ruoyi-modules/ruoyi-external/src/main/java/org/dromara/external/domain/ExternalItem.java
  44. 67 0
      ruoyi-modules/ruoyi-external/src/main/java/org/dromara/external/domain/ExternalProduct.java
  45. 1 9
      ruoyi-modules/ruoyi-external/src/main/java/org/dromara/external/domain/ExternalProductBrand.java
  46. 2 2
      ruoyi-modules/ruoyi-external/src/main/java/org/dromara/external/domain/ExternalProductCategory.java
  47. 84 0
      ruoyi-modules/ruoyi-external/src/main/java/org/dromara/external/domain/ExternalProductChangeLog.java
  48. 8 8
      ruoyi-modules/ruoyi-external/src/main/java/org/dromara/external/domain/ExternalPushPoolLog.java
  49. 9 9
      ruoyi-modules/ruoyi-external/src/main/java/org/dromara/external/domain/bo/ExternalItemBo.java
  50. 65 0
      ruoyi-modules/ruoyi-external/src/main/java/org/dromara/external/domain/bo/ExternalProductBo.java
  51. 1 3
      ruoyi-modules/ruoyi-external/src/main/java/org/dromara/external/domain/bo/ExternalProductBrandBo.java
  52. 2 2
      ruoyi-modules/ruoyi-external/src/main/java/org/dromara/external/domain/bo/ExternalProductCategoryBo.java
  53. 80 0
      ruoyi-modules/ruoyi-external/src/main/java/org/dromara/external/domain/bo/ExternalProductChangeLogBo.java
  54. 11 9
      ruoyi-modules/ruoyi-external/src/main/java/org/dromara/external/domain/bo/ExternalPushPoolLogBo.java
  55. 3 3
      ruoyi-modules/ruoyi-external/src/main/java/org/dromara/external/domain/vo/ExternalItemVo.java
  56. 8 80
      ruoyi-modules/ruoyi-external/src/main/java/org/dromara/external/domain/vo/ExternalProductBrandVo.java
  57. 2 2
      ruoyi-modules/ruoyi-external/src/main/java/org/dromara/external/domain/vo/ExternalProductCategoryVo.java
  58. 90 0
      ruoyi-modules/ruoyi-external/src/main/java/org/dromara/external/domain/vo/ExternalProductChangeLogVo.java
  59. 74 0
      ruoyi-modules/ruoyi-external/src/main/java/org/dromara/external/domain/vo/ExternalProductVo.java
  60. 10 8
      ruoyi-modules/ruoyi-external/src/main/java/org/dromara/external/domain/vo/ExternalPushPoolLogVo.java
  61. 1 1
      ruoyi-modules/ruoyi-external/src/main/java/org/dromara/external/mapper/ExternalItemMapper.java
  62. 1 1
      ruoyi-modules/ruoyi-external/src/main/java/org/dromara/external/mapper/ExternalProductBrandMapper.java
  63. 2 2
      ruoyi-modules/ruoyi-external/src/main/java/org/dromara/external/mapper/ExternalProductCategoryMapper.java
  64. 15 0
      ruoyi-modules/ruoyi-external/src/main/java/org/dromara/external/mapper/ExternalProductChangeLogMapper.java
  65. 15 0
      ruoyi-modules/ruoyi-external/src/main/java/org/dromara/external/mapper/ExternalProductMapper.java
  66. 1 1
      ruoyi-modules/ruoyi-external/src/main/java/org/dromara/external/mapper/ExternalPushPoolLogMapper.java
  67. 1 1
      ruoyi-modules/ruoyi-external/src/main/java/org/dromara/external/service/IExternalItemService.java
  68. 1 1
      ruoyi-modules/ruoyi-external/src/main/java/org/dromara/external/service/IExternalProductBrandService.java
  69. 13 13
      ruoyi-modules/ruoyi-external/src/main/java/org/dromara/external/service/IExternalProductCategoryService.java
  70. 70 0
      ruoyi-modules/ruoyi-external/src/main/java/org/dromara/external/service/IExternalProductChangeLogService.java
  71. 70 0
      ruoyi-modules/ruoyi-external/src/main/java/org/dromara/external/service/IExternalProductService.java
  72. 1 1
      ruoyi-modules/ruoyi-external/src/main/java/org/dromara/external/service/IExternalPushPoolLogService.java
  73. 1 1
      ruoyi-modules/ruoyi-external/src/main/java/org/dromara/external/service/impl/ExternalItemServiceImpl.java
  74. 25 2
      ruoyi-modules/ruoyi-external/src/main/java/org/dromara/external/service/impl/ExternalProductBrandServiceImpl.java
  75. 13 13
      ruoyi-modules/ruoyi-external/src/main/java/org/dromara/external/service/impl/ExternalProductCategoryServiceImpl.java
  76. 137 0
      ruoyi-modules/ruoyi-external/src/main/java/org/dromara/external/service/impl/ExternalProductChangeLogServiceImpl.java
  77. 138 0
      ruoyi-modules/ruoyi-external/src/main/java/org/dromara/external/service/impl/ExternalProductServiceImpl.java
  78. 3 1
      ruoyi-modules/ruoyi-external/src/main/java/org/dromara/external/service/impl/ExternalPushPoolLogServiceImpl.java
  79. 7 0
      ruoyi-modules/ruoyi-external/src/main/resources/mapper/external/ExternalProductChangeLogMapper.xml
  80. 7 0
      ruoyi-modules/ruoyi-external/src/main/resources/mapper/external/ExternalProductMapper.xml
  81. 4 0
      ruoyi-modules/ruoyi-order/pom.xml
  82. 119 0
      ruoyi-modules/ruoyi-order/src/main/java/org/dromara/order/controller/OrderAssignmentController.java
  83. 18 0
      ruoyi-modules/ruoyi-order/src/main/java/org/dromara/order/controller/OrderMainController.java
  84. 106 0
      ruoyi-modules/ruoyi-order/src/main/java/org/dromara/order/controller/OrderReturnController.java
  85. 106 0
      ruoyi-modules/ruoyi-order/src/main/java/org/dromara/order/controller/OrderReturnItemController.java
  86. 106 0
      ruoyi-modules/ruoyi-order/src/main/java/org/dromara/order/controller/OrderRevenueDetailController.java
  87. 116 0
      ruoyi-modules/ruoyi-order/src/main/java/org/dromara/order/controller/OrderRevenueHeaderController.java
  88. 83 0
      ruoyi-modules/ruoyi-order/src/main/java/org/dromara/order/domain/OrderAssignment.java
  89. 18 11
      ruoyi-modules/ruoyi-order/src/main/java/org/dromara/order/domain/OrderMain.java
  90. 28 0
      ruoyi-modules/ruoyi-order/src/main/java/org/dromara/order/domain/OrderProduct.java
  91. 13 0
      ruoyi-modules/ruoyi-order/src/main/java/org/dromara/order/domain/OrderProductAssignRule.java
  92. 220 0
      ruoyi-modules/ruoyi-order/src/main/java/org/dromara/order/domain/OrderReturn.java
  93. 88 0
      ruoyi-modules/ruoyi-order/src/main/java/org/dromara/order/domain/OrderReturnItem.java
  94. 103 0
      ruoyi-modules/ruoyi-order/src/main/java/org/dromara/order/domain/OrderRevenueDetail.java
  95. 113 0
      ruoyi-modules/ruoyi-order/src/main/java/org/dromara/order/domain/OrderRevenueHeader.java
  96. 78 0
      ruoyi-modules/ruoyi-order/src/main/java/org/dromara/order/domain/bo/OrderAssignmentBo.java
  97. 23 7
      ruoyi-modules/ruoyi-order/src/main/java/org/dromara/order/domain/bo/OrderMainBo.java
  98. 27 0
      ruoyi-modules/ruoyi-order/src/main/java/org/dromara/order/domain/bo/OrderProductBo.java
  99. 217 0
      ruoyi-modules/ruoyi-order/src/main/java/org/dromara/order/domain/bo/OrderReturnBo.java
  100. 80 0
      ruoyi-modules/ruoyi-order/src/main/java/org/dromara/order/domain/bo/OrderReturnItemBo.java

+ 5 - 4
pom.xml

@@ -106,6 +106,10 @@
                 <nacos.password>nacos</nacos.password>
                 <logstash.address>127.0.0.1:4560</logstash.address>
             </properties>
+            <activation>
+                <!-- 默认环境 -->
+                <activeByDefault>true</activeByDefault>
+            </activation>
         </profile>
         <profile>
             <id>xiaolu</id>
@@ -119,10 +123,7 @@
                 <nacos.password>nacos</nacos.password>
                 <logstash.address>127.0.0.1:4560</logstash.address>
             </properties>
-            <activation>
-                <!-- 默认环境 -->
-                <activeByDefault>true</activeByDefault>
-            </activation>
+
         </profile>
         <profile>
             <id>prod</id>

+ 2 - 1
ruoyi-api/pom.xml

@@ -15,7 +15,8 @@
         <module>ruoyi-api-workflow</module>
         <module>ruoyi-api-product</module>
         <module>ruoyi-api-external</module>
-	    <module>ruoyi-api-order</module>
+        <module>ruoyi-api-order</module>
+        <module>ruoyi-api-customer</module>
     </modules>
 
     <artifactId>ruoyi-api</artifactId>

+ 5 - 0
ruoyi-api/ruoyi-api-bom/pom.xml

@@ -57,6 +57,11 @@
                 <artifactId>ruoyi-api-order</artifactId>
                 <version>${revision}</version>
             </dependency>
+            <dependency>
+                <groupId>org.dromara</groupId>
+                <artifactId>ruoyi-api-customer</artifactId>
+                <version>${revision}</version>
+            </dependency>
 
         </dependencies>
     </dependencyManagement>

+ 28 - 0
ruoyi-api/ruoyi-api-customer/pom.xml

@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <parent>
+        <groupId>org.dromara</groupId>
+        <artifactId>ruoyi-api</artifactId>
+        <version>${revision}</version>
+    </parent>
+    <modelVersion>4.0.0</modelVersion>
+
+    <artifactId>ruoyi-api-customer</artifactId>
+
+    <description>
+        ruoyi-api-customer 客户模块接口模块
+    </description>
+
+    <dependencies>
+
+        <!-- RuoYi Common Core-->
+        <dependency>
+            <groupId>org.dromara</groupId>
+            <artifactId>ruoyi-common-core</artifactId>
+        </dependency>
+
+
+    </dependencies>
+
+</project>

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

@@ -0,0 +1,10 @@
+package org.dromara.customer.api;
+
+import java.util.Map;
+import java.util.Set;
+
+public interface RemoteCustomerService {
+
+    /*根据ids查询客户名称*/
+    Map<Long, String> selectCustomerNameByIds(Set<Long> ids);
+}

+ 1 - 1
ruoyi-api/ruoyi-api-external/src/main/java/org/dromara/external/api/zhongzhi/domain/vo/ExternalProductVo.java → ruoyi-api/ruoyi-api-external/src/main/java/org/dromara/external/api/zhongzhi/domain/vo/ZhongzhiExternalProductVo.java

@@ -9,7 +9,7 @@ import java.util.List;
 
 @Data
 @Builder
-public class ExternalProductVo {
+public class ZhongzhiExternalProductVo {
     private String sku;
     private String url;
     private String model;

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

@@ -6,6 +6,7 @@ import org.dromara.product.api.domain.ProductChangeLogApiVo;
 import org.dromara.product.api.domain.ProductPriceInventoryRemoteVo;
 import org.dromara.product.api.domain.ProductVo;
 import org.dromara.product.api.domain.zhongche.dto.StocksResultDto;
+import org.dromara.product.api.domain.RemoteProductBrand;
 
 import java.util.List;
 import java.util.Map;
@@ -41,6 +42,11 @@ public interface RemoteProductService {
 
     void delMessagePool(Long messageId);
 
+    /**
+    * 根据品牌id获取单个品牌
+    * */
+    RemoteProductBrand getProductByBrandId(Long brandId);
+
     /**
      * 获取品目列表
      */

+ 9 - 9
ruoyi-api/ruoyi-api-product/src/main/java/org/dromara/product/api/domain/ProductVo.java

@@ -86,28 +86,28 @@ public class ProductVo implements Serializable {
     /**
      * 是否自营(1=是,0=否)
      */
-    private String isSelf;
+    private Integer isSelf;
 
     /**
      * 产品审核状态 0=待提交,1=待审核,2=审核通过,3=审核驳回
      */
 
-    private String productReviewStatus;
+    private Integer productReviewStatus;
 
     /**
      * 首页推荐:1=推荐,0=不推荐
      */
-    private String homeRecommended;
+    private Integer homeRecommended;
 
     /**
      * 分类推荐:1=推荐,0=不推荐
      */
-    private String categoryRecommendation;
+    private Integer categoryRecommendation;
 
     /**
      * 购物车推荐:1=推荐,0=不推荐
      */
-    private String cartRecommendation;
+    private Integer cartRecommendation;
 
     /**
      * 推荐产品顺序
@@ -117,17 +117,17 @@ public class ProductVo implements Serializable {
     /**
      * 是否热门:1=是,0=否
      */
-    private String isPopular;
+    private Integer isPopular;
 
     /**
      * 是否新品:1=是,0=否
      */
-    private String isNew;
+    private Integer isNew;
 
     /**
-     * 商品状态:1=上架,0=下架等
+     * 商品状态:1=上架,0=下架 2 上架中
      */
-    private String productStatus;
+    Integer productStatus;
 
     /**
      * 数据来源

+ 128 - 0
ruoyi-api/ruoyi-api-product/src/main/java/org/dromara/product/api/domain/RemoteProductBrand.java

@@ -0,0 +1,128 @@
+package org.dromara.product.api.domain;
+
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * 产品品牌信息对象 product_brand
+ *
+ * @author LionLi
+ * @date 2025-12-11
+ */
+@Data
+public class RemoteProductBrand implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键
+     */
+    private Long id;
+
+    /**
+     * 品牌编号(唯一标识)
+     */
+    private String brandNo;
+
+    /**
+     * 品牌中文名称
+     */
+    private String brandName;
+
+    /**
+     * 品牌首字母缩写(如拼音首字母)
+     */
+    private String brandInitials;
+
+    /**
+     * 品牌英文名称
+     */
+    private String brandEnglishName;
+
+    /**
+     * 推荐值(数值越大越靠前)
+     */
+    private Long recommendValue;
+
+    /**
+     * 品牌Logo图片路径或URL
+     */
+    private String brandLogo;
+
+    /**
+     * 品牌标题(用于展示)
+     */
+    private String brandTitle;
+
+    /**
+     * 品牌大图(横幅/封面图)
+     */
+    private String brandBigImage;
+
+    /**
+     * 品牌故事(简介文本)
+     */
+    private String brandStory;
+
+    /**
+     * 是否显示(1=显示,0=隐藏)
+     */
+    private Long isShow;
+
+    /**
+     * 品牌注册人
+     */
+    private String brandRegistrant;
+
+    /**
+     * 许可证编号
+     */
+    private String license;
+
+    /**
+     * 注册证书编号
+     */
+    private String registrationCertificate;
+
+    /**
+     * 证书/许可过期时间
+     */
+    private Date expireTime;
+
+    /**
+     * 品牌描述(较长文本)
+     */
+    private String brandDescribe;
+
+    /**
+     * 展示位置(如首页、分类页等)
+     */
+    private String position;
+
+    /**
+     * 关注度/收藏数(默认为0)
+     */
+    private Long care;
+
+    /**
+     * 数据来源
+     */
+    private String dataSource;
+
+    /**
+     * 删除标志(0代表存在 2代表删除)
+     */
+    private String delFlag;
+
+    /**
+     * 备注
+     */
+    private String remark;
+
+
+}

+ 25 - 0
ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/RemoteDeptService.java

@@ -1,8 +1,11 @@
 package org.dromara.system.api;
 
+import cn.hutool.core.lang.tree.Tree;
 import org.dromara.system.api.domain.vo.RemoteDeptVo;
 
 import java.util.List;
+import java.util.Map;
+import java.util.Set;
 
 /**
  * 部门服务
@@ -19,6 +22,8 @@ public interface RemoteDeptService {
      */
     String selectDeptNameByIds(String deptIds);
 
+    RemoteDeptVo selectDeptById(Long deptId);
+
     /**
      * 根据部门ID查询部门负责人
      *
@@ -38,4 +43,24 @@ public interface RemoteDeptService {
 
     RemoteDeptVo insertDept(RemoteDeptVo vo);
 
+    List<RemoteDeptVo> selectDeptByIds(List<Long> deptIds);
+
+    /**
+     * 查询部门树结构信息
+     *
+     * @param dept 部门信息
+     * @return 部门树信息集合
+     */
+    List<Tree<Long>> selectDeptTreeList(RemoteDeptVo dept);
+
+    /**
+     * 构建前端所需要下拉树结构
+     *
+     * @param depts 部门列表
+     * @return 下拉树结构列表
+     */
+    List<Tree<Long>> buildDeptTreeSelect(List<RemoteDeptVo> depts);
+
+    Map<Long, String> selectDeptNameByIds(Set<Long> ids);
+
 }

+ 6 - 0
ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/domain/vo/RemoteDeptVo.java

@@ -36,6 +36,12 @@ public class RemoteDeptVo implements Serializable {
 
     private Long customerId;
 
+    private String status;
+
+    private Integer orderNum;
+
+    private Long companyId;
+
 
     private String platformCode;
 

+ 27 - 0
ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/enums/OrderAssignStatus.java

@@ -0,0 +1,27 @@
+package org.dromara.common.core.enums;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+/**
+ * 用户状态
+ *
+ * @author ruoyi
+ */
+@Getter
+@AllArgsConstructor
+public enum OrderAssignStatus {
+    /**
+     * 待分配
+     */
+    WAIT_ASSIGN("0", "待分配"),
+    /**
+     * 已分配
+     */
+    ASSIGNED("1", "已分配");
+
+
+    private final String code;
+    private final String info;
+
+}

+ 27 - 0
ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/enums/OrderSplitStatus.java

@@ -0,0 +1,27 @@
+package org.dromara.common.core.enums;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+/**
+ * 用户状态
+ *
+ * @author ruoyi
+ */
+@Getter
+@AllArgsConstructor
+public enum OrderSplitStatus {
+    /**
+     * 未拆单
+     */
+    WAIT_SPLIT("0", "未拆单"),
+    /**
+     * 已拆单
+     */
+    SPLITED("1", "已拆单");
+
+
+    private final String code;
+    private final String info;
+
+}

+ 21 - 0
ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/enums/SysPlatformYesNo.java

@@ -0,0 +1,21 @@
+package org.dromara.common.core.enums;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+@Getter
+@AllArgsConstructor
+public enum SysPlatformYesNo {
+
+    /**
+     * 是
+     */
+    YES("0", "是"),
+    /**
+     * 否
+     */
+    NO("1", "否");
+
+    private final String code;
+    private final String info;
+}

+ 14 - 0
ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/core/page/PageQuery.java

@@ -48,6 +48,20 @@ public class PageQuery implements Serializable {
      */
     private String isAsc;
 
+    /**
+    * 第一个id
+    * */
+    private Long firstSeenId;
+    /**
+    * 最后一个id
+    * */
+    private Long lastSeenId;
+
+    /**
+    * 翻页方式 0:向上翻页 1:向下翻页
+    * */
+    private Integer way;
+
     /**
      * 当前记录起始索引 默认值
      */

+ 54 - 6
ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/interceptor/PlatformDataScopeInterceptor.java

@@ -1,5 +1,6 @@
 package org.dromara.common.mybatis.interceptor;
 
+import com.baomidou.mybatisplus.core.plugins.InterceptorIgnoreHelper;
 import lombok.extern.slf4j.Slf4j;
 import net.sf.jsqlparser.expression.Expression;
 import net.sf.jsqlparser.expression.operators.conditional.AndExpression;
@@ -25,6 +26,7 @@ import java.util.Set;
 /**
  * 平台数据隔离拦截器
  * 自动在 SELECT 语句中注入 platform_code = '当前平台' 条件
+ * 支持通过 PlatformHelper.ignore() 临时忽略平台隔离
  *
  * @author YourName
  */
@@ -41,6 +43,7 @@ public class PlatformDataScopeInterceptor implements Interceptor {
         "sys_post",
         "sys_user_post",
         "sys_config",
+        "sys_dept",
         "sys_dict",
         "sys_dict_type",
         "sys_dict_data",
@@ -57,6 +60,7 @@ public class PlatformDataScopeInterceptor implements Interceptor {
         "customer_info_tag",
         "invoice_type",
         "customer_info",
+        "customer_dept",
         "com_bank",
         "settlement_level",
         "settlement_method",
@@ -67,14 +71,12 @@ public class PlatformDataScopeInterceptor implements Interceptor {
         "order_pay_set",
         "customer_shipping_address",
         "customer_sales_info",
+        "order_main",
+        "order_product",
         "com_",
         "product_"
-
-
-        // 注意:前缀匹配需特殊处理(如 qrtz_),见 isIgnoreTable 方法
     ));
 
-
     @Override
     public Object intercept(Invocation invocation) throws Throwable {
         StatementHandler statementHandler = (StatementHandler) invocation.getTarget();
@@ -86,11 +88,16 @@ public class PlatformDataScopeInterceptor implements Interceptor {
             return invocation.proceed();
         }
 
+        // 新增:检查是否应忽略平台数据隔离(由 PlatformHelper.ignore() 触发)
+        if (isIgnorePlatform()) {
+            return invocation.proceed();
+        }
+
         String platform = PlatformContext.getPlatform();
 
         // 总控平台:直接放行,不注入任何条件
         if (SysPlatformCode.MAIN.getCode().equals(platform)) {
-            return invocation.proceed(); // ← 核心:提前返回
+            return invocation.proceed();
         }
 
         // 原有逻辑:仅对非 main 平台生效
@@ -178,10 +185,41 @@ public class PlatformDataScopeInterceptor implements Interceptor {
             return true;
         }
 
-        // 前缀匹配(例如以 "qrtz_" 开头的表)
+        // 前缀匹配
         return tableName.startsWith("qrtz_") || tableName.startsWith("product_") || tableName.startsWith("com_");
     }
 
+    /**
+     * 判断当前是否应忽略平台数据隔离
+     * 复用 MyBatis-Plus 的 IgnoreStrategy.tenantLine 作为开关
+     */
+    private boolean isIgnorePlatform() {
+        try {
+            Object ignoreStrategyLocal = ReflectUtil.getStaticFieldValue(
+                InterceptorIgnoreHelper.class, "IGNORE_STRATEGY_LOCAL"
+            );
+            if (ignoreStrategyLocal instanceof ThreadLocal) {
+                Object strategy = ((ThreadLocal<?>) ignoreStrategyLocal).get();
+                if (strategy != null) {
+                    try {
+                        Field tenantLineField = strategy.getClass().getDeclaredField("tenantLine");
+                        tenantLineField.setAccessible(true);
+                        Boolean tenantLine = (Boolean) tenantLineField.get(strategy);
+                        if (Boolean.TRUE.equals(tenantLine)) {
+                            log.debug("PlatformDataScopeInterceptor: ignored due to tenantLine=true");
+                            return true;
+                        }
+                    } catch (NoSuchFieldException | IllegalAccessException ignored) {
+                        // 字段不存在或无法访问,视为未忽略
+                    }
+                }
+            }
+        } catch (Exception e) {
+            log.warn("Failed to check ignore platform status", e);
+        }
+        return false;
+    }
+
     @Override
     public Object plugin(Object target) {
         return Plugin.wrap(target, this);
@@ -214,6 +252,16 @@ public class PlatformDataScopeInterceptor implements Interceptor {
             }
         }
 
+        public static Object getStaticFieldValue(Class<?> clazz, String fieldName) {
+            try {
+                Field field = getField(clazz, fieldName);
+                field.setAccessible(true);
+                return field.get(null);
+            } catch (Exception e) {
+                throw new RuntimeException("Get static field value error: " + fieldName, e);
+            }
+        }
+
         private static Field getField(Class<?> clazz, String fieldName) {
             while (clazz != null) {
                 try {

+ 20 - 9
ruoyi-common/ruoyi-common-redis/src/main/java/org/dromara/common/redis/utils/SequenceUtils.java

@@ -8,8 +8,15 @@ import org.dromara.common.core.utils.SpringUtils;
 import org.dromara.common.core.utils.StringUtils;
 import org.redisson.api.RIdGenerator;
 import org.redisson.api.RedissonClient;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.redis.core.RedisTemplate;
 
 import java.time.Duration;
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+import java.time.temporal.ChronoUnit;
+import java.util.Date;
+import java.util.concurrent.TimeUnit;
 
 /**
  * 发号器工具类
@@ -178,18 +185,22 @@ public class SequenceUtils {
     }
 
     public static String generateOrderCode(String prefix) {
-        // 构建带日期的 key,确保每天重置流水号
-        String dateKey = DateUtil.format(DateUtil.date(), DatePattern.PURE_DATE_FORMATTER);
-        String businessKey = prefix + dateKey;
+        // 明确指定 bean name 为 "redisTemplate"
+        RedisTemplate<String, Object> redisTemplate = SpringUtils.getBean("redisTemplate", RedisTemplate.class);
 
-        // 每天过期,保证每天从 0001 开始
-        Duration expireTime = Duration.ofDays(1);
+        String dateKey = DateUtil.format(new Date(), DatePattern.PURE_DATE_PATTERN); // 如 "yyyyMMdd"
+        String businessKey = prefix + dateKey;
 
-        // 获取补零后的4位流水号
-        String paddedSeq = SequenceUtils.nextPaddedIdStr(businessKey, expireTime, 4);
+        Long seq = redisTemplate.opsForValue().increment(businessKey);
+        if (seq == 1L) {
+            long secondsUntilEndOfDay = LocalDateTime.now().until(
+                LocalDate.now().plusDays(1).atStartOfDay(),
+                ChronoUnit.SECONDS
+            );
+            redisTemplate.expire(businessKey, secondsUntilEndOfDay, TimeUnit.SECONDS);
+        }
 
-        // 拼接最终单号
-        return businessKey + paddedSeq;
+        return businessKey + String.format("%04d", seq);
     }
 
     /*生成20位发货单号方法*/

+ 213 - 0
ruoyi-common/ruoyi-common-tenant/src/main/java/org/dromara/common/tenant/helper/PlatformHelper.java

@@ -0,0 +1,213 @@
+package org.dromara.common.tenant.helper;
+
+import cn.dev33.satoken.context.SaHolder;
+import cn.dev33.satoken.context.model.SaStorage;
+import cn.hutool.core.collection.CollectionUtil;
+import cn.hutool.core.convert.Convert;
+import cn.hutool.core.util.ObjectUtil;
+import com.baomidou.mybatisplus.core.plugins.IgnoreStrategy;
+import com.baomidou.mybatisplus.core.plugins.InterceptorIgnoreHelper;
+import lombok.AccessLevel;
+import lombok.NoArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.dromara.common.core.constant.GlobalConstants;
+import org.dromara.common.core.context.PlatformContext;
+import org.dromara.common.core.utils.SpringUtils;
+import org.dromara.common.core.utils.StringUtils;
+import org.dromara.common.redis.utils.RedisUtils;
+import org.dromara.common.satoken.utils.LoginHelper;
+
+import java.util.Stack;
+import java.util.function.Supplier;
+
+@Slf4j
+@NoArgsConstructor(access = AccessLevel.PRIVATE)
+public class PlatformHelper {
+
+    private static final String DYNAMIC_PLATFORM_KEY = GlobalConstants.GLOBAL_REDIS_KEY + "dynamicPlatform";
+
+    private static final ThreadLocal<String> TEMP_DYNAMIC_PLATFORM = new ThreadLocal<>();
+
+    private static final ThreadLocal<Stack<Integer>> REENTRANT_IGNORE = ThreadLocal.withInitial(Stack::new);
+
+    /**
+     * 平台功能是否启用
+     */
+    public static boolean isEnable() {
+        return Convert.toBool(SpringUtils.getProperty("platform.enable"), false);
+    }
+
+    /**
+     * 开启忽略平台(需手动调用 disableIgnore 关闭)
+     * 复用 tenantLine 作为平台忽略标志(与 PlatformDataScopeInterceptor 配合)
+     */
+    public static void enableIgnore() {
+        InterceptorIgnoreHelper.handle(IgnoreStrategy.builder().tenantLine(true).build());
+        Stack<Integer> reentrantStack = REENTRANT_IGNORE.get();
+        reentrantStack.push(reentrantStack.size() + 1);
+    }
+
+    /**
+     * 关闭忽略平台
+     */
+    public static void disableIgnore() {
+        IgnoreStrategy current = InterceptorIgnoreHelper.getIgnoreStrategy("tenant");
+        if (current == null) {
+            return;
+        }
+
+        Stack<Integer> reentrantStack = REENTRANT_IGNORE.get();
+        boolean isOutermost = reentrantStack.isEmpty() || reentrantStack.pop() == 1;
+
+        if (!isOutermost) {
+            // 嵌套调用,仅关闭 tenantLine
+            current.setTenantLine(false);
+            return;
+        }
+
+        // 判断是否还有其他忽略项
+        boolean hasOtherIgnore = Boolean.TRUE.equals(current.getDynamicTableName())
+            || Boolean.TRUE.equals(current.getBlockAttack())
+            || Boolean.TRUE.equals(current.getIllegalSql())
+            || Boolean.TRUE.equals(current.getDataPermission())
+            || CollectionUtil.isNotEmpty(current.getOthers());
+
+        if (hasOtherIgnore) {
+            // 保留其他忽略项,仅关闭 tenantLine
+            current.setTenantLine(false);
+        } else {
+            // 完全无忽略项,清除整个策略
+            InterceptorIgnoreHelper.clearIgnoreStrategy();
+        }
+    }
+
+    /**
+     * 在忽略平台上下文中执行(无返回值)
+     */
+    public static void ignore(Runnable handle) {
+        enableIgnore();
+        try {
+            handle.run();
+        } finally {
+            disableIgnore();
+        }
+    }
+
+    /**
+     * 在忽略平台上下文中执行(有返回值)
+     */
+    public static <T> T ignore(Supplier<T> handle) {
+        enableIgnore();
+        try {
+            return handle.get();
+        } finally {
+            disableIgnore();
+        }
+    }
+
+    /**
+     * 设置动态平台(仅当前线程或全局)
+     *
+     * @param platformCode 平台编码,如 "web", "app"
+     * @param global       是否全局生效(需用户已登录)
+     */
+    public static void setDynamic(String platformCode, boolean global) {
+        if (!isEnable()) {
+            return;
+        }
+        if (!global || !LoginHelper.isLogin()) {
+            TEMP_DYNAMIC_PLATFORM.set(platformCode);
+            return;
+        }
+
+        String cacheKey = DYNAMIC_PLATFORM_KEY + ":" + LoginHelper.getUserId();
+        RedisUtils.setCacheObject(cacheKey, platformCode);
+        SaHolder.getStorage().set(cacheKey, platformCode);
+    }
+
+    public static void setDynamic(String platformCode) {
+        setDynamic(platformCode, false);
+    }
+
+    /**
+     * 获取动态平台
+     */
+    public static String getDynamic() {
+        if (!isEnable()) {
+            return null;
+        }
+        String platform = TEMP_DYNAMIC_PLATFORM.get();
+        if (StringUtils.isNotBlank(platform)) {
+            return platform;
+        }
+
+        SaStorage storage = SaHolder.getStorage();
+        if (storage == null || LoginHelper.getUserId() == null) {
+            return null;
+        }
+
+        String cacheKey = DYNAMIC_PLATFORM_KEY + ":" + LoginHelper.getUserId();
+        platform = storage.getString(cacheKey);
+        if (StringUtils.isNotBlank(platform)) {
+            return "-1".equals(platform) ? null : platform;
+        }
+
+        platform = RedisUtils.getCacheObject(cacheKey);
+        storage.set(cacheKey, StringUtils.isBlank(platform) ? "-1" : platform);
+        return platform;
+    }
+
+    /**
+     * 清除动态平台
+     */
+    public static void clearDynamic() {
+        if (!isEnable()) {
+            return;
+        }
+        TEMP_DYNAMIC_PLATFORM.remove();
+
+        SaStorage storage = SaHolder.getStorage();
+        if (storage != null && LoginHelper.getUserId() != null) {
+            String cacheKey = DYNAMIC_PLATFORM_KEY + ":" + LoginHelper.getUserId();
+            RedisUtils.deleteObject(cacheKey);
+            storage.delete(cacheKey);
+        }
+    }
+
+    /**
+     * 在指定动态平台下执行(自动清理)
+     */
+    public static void dynamic(String platformCode, Runnable handle) {
+        setDynamic(platformCode);
+        try {
+            handle.run();
+        } finally {
+            clearDynamic();
+        }
+    }
+
+    public static <T> T dynamic(String platformCode, Supplier<T> handle) {
+        setDynamic(platformCode);
+        try {
+            return handle.get();
+        } finally {
+            clearDynamic();
+        }
+    }
+
+    /**
+     * 获取当前平台(动态平台优先,否则从 PlatformContext 获取)
+     *
+     * @return 当前生效的 platformCode
+     */
+    public static String getPlatform() {
+        if (!isEnable()) {
+            return null;
+        }
+        String platform = getDynamic();
+        if (StringUtils.isBlank(platform)) {
+            platform = PlatformContext.getPlatform();
+        }
+        return platform;
+    }
+}

+ 3 - 3
ruoyi-example/ruoyi-demo/src/main/resources/application.yml

@@ -80,14 +80,14 @@ easy-es:
   # 兼容模式
   compatible: true
   # es连接地址+端口 格式必须为ip:port,如果是集群则可用逗号隔开
-  address : localhost:9200
+  address : 119.97.180.88:9200
   # 默认为http
   schema: http
   # 注意ES建议使用账号认证 不使用会报警告日志
   #如果无账号密码则可不配置此行
-  #username:
+  username: elastic
   #如果无账号密码则可不配置此行
-  #password:
+  password: kRhwhe4Mf4pyPYHN
   # 心跳策略时间 单位:ms
   keep-alive-millis: 18000
   # 连接超时时间 单位:ms

+ 8 - 0
ruoyi-modules/ruoyi-customer/pom.xml

@@ -108,6 +108,14 @@
             <groupId>org.dromara</groupId>
             <artifactId>ruoyi-api-workflow</artifactId>
         </dependency>
+        <dependency>
+            <groupId>org.dromara</groupId>
+            <artifactId>ruoyi-api-customer</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.dromara</groupId>
+            <artifactId>ruoyi-api-customer</artifactId>
+        </dependency>
 
     </dependencies>
 

+ 7 - 0
ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/controller/CustomerDeptController.java

@@ -6,6 +6,7 @@ import lombok.RequiredArgsConstructor;
 import jakarta.servlet.http.HttpServletResponse;
 import jakarta.validation.constraints.*;
 import cn.dev33.satoken.annotation.SaCheckPermission;
+import org.dromara.customer.domain.vo.CustomerDeptTreeVo;
 import org.springframework.web.bind.annotation.*;
 import org.springframework.validation.annotation.Validated;
 import org.dromara.common.idempotent.annotation.RepeatSubmit;
@@ -45,6 +46,12 @@ public class CustomerDeptController extends BaseController {
         return R.ok(list);
     }
 
+    @GetMapping("/tree")
+    public R<List<CustomerDeptTreeVo>> getCustomerDeptTree(@RequestParam Long customerId) {
+        List<CustomerDeptTreeVo> list = customerDeptService.getCustomerDeptTree(customerId);
+        return R.ok(list);
+    }
+
     /**
      * 导出客户部门信息列表
      */

+ 2 - 44
ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/domain/CustomerDept.java

@@ -25,39 +25,14 @@ public class CustomerDept extends TenantEntity {
     /**
      * ID
      */
-    @TableId(value = "id")
-    private Long id;
-
-    /**
-     * 部门编号
-     */
-    private String deptNo;
-
-    /**
-     * 部门名称
-     */
-    private String deptName;
-
-    /**
-     * 父部门id
-     */
-    private Long parentId;
-
-    /**
-     * 祖级列表
-     */
-    private String ancestors;
+    @TableId(value = "dept_id")
+    private Long deptId;
 
     /**
      * 客户编号
      */
     private Long customerId;
 
-    /**
-     * 部门层级(如1级、2级等)
-     */
-    private Long departmentLevel;
-
     /**
      * 年度预算
      */
@@ -118,21 +93,4 @@ public class CustomerDept extends TenantEntity {
      */
     private Long recharge;
 
-    /**
-     * 状态(0正常 1停用)
-     */
-    private String status;
-
-    /**
-     * 删除标志(0代表存在 2代表删除)
-     */
-    @TableLogic
-    private String delFlag;
-
-    /**
-     * 备注
-     */
-    private String remark;
-
-
 }

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

@@ -72,7 +72,7 @@ public class CustomerSalesInfo extends TenantEntity {
     /**
      * 信用管理方式
      */
-    private String creditManagement;
+    private Long creditManagementId;
 
     /**
      * 信用支付密码

+ 1 - 5
ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/domain/bo/CustomerDeptBo.java

@@ -25,7 +25,7 @@ public class CustomerDeptBo extends BaseEntity {
     /**
      * ID
      */
-    private Long id;
+    private Long deptId;
 
     /**
      * 部门编号
@@ -35,7 +35,6 @@ public class CustomerDeptBo extends BaseEntity {
     /**
      * 部门名称
      */
-    @NotBlank(message = "部门名称不能为空", groups = {AddGroup.class, EditGroup.class})
     private String deptName;
 
     /**
@@ -61,19 +60,16 @@ public class CustomerDeptBo extends BaseEntity {
     /**
      * 年度预算
      */
-    @NotNull(message = "年度预算不能为空", groups = {AddGroup.class, EditGroup.class})
     private BigDecimal yearlyBudget;
 
     /**
      * 已使用预算
      */
-    @NotNull(message = "已使用预算不能为空", groups = {AddGroup.class, EditGroup.class})
     private BigDecimal usedBudget;
 
     /**
      * 月度限额
      */
-    @NotNull(message = "月度限额不能为空", groups = {AddGroup.class, EditGroup.class})
     private BigDecimal monthLimit;
 
     /**

+ 1 - 1
ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/domain/bo/CustomerSalesInfoBo.java

@@ -72,7 +72,7 @@ public class CustomerSalesInfoBo extends BaseEntity {
     /**
      * 信用管理方式
      */
-    private String creditManagement;
+    private Long creditManagementId;
 
     /**
      * 信用支付密码

+ 27 - 0
ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/domain/vo/CustomerDeptTreeVo.java

@@ -0,0 +1,27 @@
+package org.dromara.customer.domain.vo;
+
+import lombok.Data;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+
+@Data
+public class CustomerDeptTreeVo implements Serializable {
+
+    private Long deptId;            // = dept_id
+    private Long parentId;      // 来自 sys_dept
+    private String deptName;    // 来自 sys_dept
+    private Integer orderNum;   // 排序
+
+    // 业务字段(来自 customer_dept)
+    private BigDecimal yearlyBudget;
+    private BigDecimal usedBudget;
+    private BigDecimal monthLimit;
+    private String bindAddress;
+    private String bindStatus;
+    private String status;      // 来自 sys_dept(启用/停用)
+
+    // 可选:是否叶子节点(前端有时需要)
+    private Boolean hasChildren = false;
+
+}

+ 2 - 9
ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/domain/vo/CustomerDeptVo.java

@@ -31,8 +31,8 @@ public class CustomerDeptVo implements Serializable {
     /**
      * ID
      */
-    @ExcelProperty(value = "ID")
-    private Long id;
+    @ExcelProperty(value = "dept_id")
+    private Long deptId;
 
     /**
      * 部门编号
@@ -64,13 +64,6 @@ public class CustomerDeptVo implements Serializable {
     @ExcelProperty(value = "客户编号")
     private Long customerId;
 
-    /**
-     * 部门层级(如1级、2级等)
-     */
-    @ExcelProperty(value = "部门层级", converter = ExcelDictConvert.class)
-    @ExcelDictFormat(readConverterExp = "如=1级、2级等")
-    private BigDecimal departmentLevel;
-
     /**
      * 年度预算
      */

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

@@ -90,7 +90,7 @@ public class CustomerSalesInfoVo implements Serializable {
      * 信用管理方式
      */
     @ExcelProperty(value = "信用管理方式")
-    private String creditManagement;
+    private Long creditManagementId;
 
     /**
      * 信用支付密码

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

@@ -0,0 +1,25 @@
+package org.dromara.customer.dubbo;
+
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.dubbo.config.annotation.DubboService;
+import org.dromara.customer.api.RemoteCustomerService;
+import org.dromara.customer.service.ICustomerInfoService;
+import org.springframework.stereotype.Service;
+
+import java.util.Map;
+import java.util.Set;
+
+@Slf4j
+@Service
+@RequiredArgsConstructor
+@DubboService
+public class RemoteCustomerServiceImpl implements RemoteCustomerService {
+
+    private final ICustomerInfoService customerInfoService;
+
+    @Override
+    public Map<Long, String> selectCustomerNameByIds(Set<Long> ids) {
+        return customerInfoService.selectCustomerNameByIds(ids);
+    }
+}

+ 4 - 2
ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/service/ICustomerDeptService.java

@@ -2,6 +2,7 @@ package org.dromara.customer.service;
 
 import com.baomidou.mybatisplus.extension.service.IService;
 import org.dromara.customer.domain.CustomerDept;
+import org.dromara.customer.domain.vo.CustomerDeptTreeVo;
 import org.dromara.customer.domain.vo.CustomerDeptVo;
 import org.dromara.customer.domain.bo.CustomerDeptBo;
 
@@ -14,7 +15,7 @@ import java.util.List;
  * @author LionLi
  * @date 2025-12-18
  */
-public interface ICustomerDeptService extends IService<CustomerDept>{
+public interface ICustomerDeptService extends IService<CustomerDept> {
 
     /**
      * 查询客户部门信息
@@ -24,7 +25,6 @@ public interface ICustomerDeptService extends IService<CustomerDept>{
      */
     CustomerDeptVo queryById(Long id);
 
-
     /**
      * 查询符合条件的客户部门信息列表
      *
@@ -33,6 +33,8 @@ public interface ICustomerDeptService extends IService<CustomerDept>{
      */
     List<CustomerDeptVo> queryList(CustomerDeptBo bo);
 
+    List<CustomerDeptTreeVo> getCustomerDeptTree(Long customerId);
+
     /**
      * 新增客户部门信息
      *

+ 4 - 0
ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/service/ICustomerInfoService.java

@@ -11,6 +11,8 @@ import org.dromara.common.mybatis.core.page.PageQuery;
 import java.math.BigDecimal;
 import java.util.Collection;
 import java.util.List;
+import java.util.Map;
+import java.util.Set;
 
 /**
  * 客户信息Service接口
@@ -82,6 +84,8 @@ public interface ICustomerInfoService extends IService<CustomerInfo> {
     /*设置客户标签*/
     int setCustomerInfoTag(List<Long> customerIds, List<Long> tagIds);
 
+    Map<Long, String> selectCustomerNameByIds(Set<Long> ids);
+
     /**
      * 校验并批量删除客户信息信息
      *

+ 137 - 70
ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/service/impl/CustomerDeptServiceImpl.java

@@ -1,27 +1,33 @@
 package org.dromara.customer.service.impl;
 
-import cn.hutool.core.util.ObjectUtil;
-import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
-import org.dromara.common.core.constant.SystemConstants;
-import org.dromara.common.core.exception.ServiceException;
-import org.dromara.common.core.utils.MapstructUtils;
-import org.dromara.common.core.utils.StringUtils;
+import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.lang.tree.Tree;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
-import org.dromara.common.redis.utils.SequenceUtils;
-import org.springframework.stereotype.Service;
+import org.apache.dubbo.config.annotation.DubboReference;
+import org.dromara.common.core.context.PlatformContext;
+import org.dromara.common.core.enums.IsDefault;
+import org.dromara.common.core.utils.MapstructUtils;
+import org.dromara.common.core.utils.StringUtils;
+import org.dromara.customer.domain.CustomerDept;
+import org.dromara.customer.domain.CustomerInfo;
 import org.dromara.customer.domain.bo.CustomerDeptBo;
+import org.dromara.customer.domain.vo.CustomerDeptTreeVo;
 import org.dromara.customer.domain.vo.CustomerDeptVo;
-import org.dromara.customer.domain.CustomerDept;
 import org.dromara.customer.mapper.CustomerDeptMapper;
 import org.dromara.customer.service.ICustomerDeptService;
+import org.dromara.system.api.RemoteDeptService;
+import org.dromara.system.api.domain.vo.RemoteDeptVo;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
 
-import java.time.Duration;
-import java.util.List;
-import java.util.Map;
-import java.util.Collection;
+import java.math.BigDecimal;
+import java.util.*;
+import java.util.stream.Collectors;
 
 /**
  * 客户部门信息Service业务层处理
@@ -34,6 +40,9 @@ import java.util.Collection;
 @Service
 public class CustomerDeptServiceImpl extends ServiceImpl<CustomerDeptMapper, CustomerDept> implements ICustomerDeptService {
 
+    @DubboReference
+    private RemoteDeptService remoteDeptService;
+
     private static final String DEPT_NO_KEY = "customer_dept:dept_no";
 
     private final CustomerDeptMapper baseMapper;
@@ -62,16 +71,64 @@ public class CustomerDeptServiceImpl extends ServiceImpl<CustomerDeptMapper, Cus
         return baseMapper.selectVoList(lqw);
     }
 
+    @Override
+    public List<CustomerDeptTreeVo> getCustomerDeptTree(Long customerId) {
+        if (customerId == null) {
+            return Collections.emptyList();
+        }
+
+        // 1. 查 customer_dept
+        List<CustomerDept> customerDepts = baseMapper.selectList(
+            new LambdaQueryWrapper<CustomerDept>()
+                .eq(CustomerDept::getCustomerId, customerId)
+        );
+
+        if (CollUtil.isEmpty(customerDepts)) {
+            return Collections.emptyList();
+        }
+
+        // 2. 查 sys_dept
+        List<Long> deptIds = customerDepts.stream()
+            .map(CustomerDept::getDeptId)
+            .collect(Collectors.toList());
+
+        List<RemoteDeptVo> sysDepts = remoteDeptService.selectDeptByIds(deptIds);
+
+        Map<Long, RemoteDeptVo> deptMap = sysDepts.stream()
+            .collect(Collectors.toMap(RemoteDeptVo::getDeptId, d -> d));
+
+        // 3. 合并 + 安全排序
+        return customerDepts.stream()
+            .filter(cd -> deptMap.containsKey(cd.getDeptId()))
+            .map(cd -> {
+                RemoteDeptVo sys = deptMap.get(cd.getDeptId());
+                CustomerDeptTreeVo vo = new CustomerDeptTreeVo();
+                vo.setDeptId(sys.getDeptId());
+                vo.setParentId(sys.getParentId());
+                vo.setDeptName(sys.getDeptName());
+                vo.setOrderNum(sys.getOrderNum()); // 可能为 null!
+                vo.setStatus(sys.getStatus());
+
+                vo.setYearlyBudget(cd.getYearlyBudget());
+                vo.setUsedBudget(cd.getUsedBudget());
+                vo.setMonthLimit(cd.getMonthLimit());
+                vo.setBindAddress(cd.getBindAddress());
+                vo.setBindStatus(cd.getBindStatus());
+
+                return vo;
+            })
+            .sorted(Comparator.comparing(
+                CustomerDeptTreeVo::getOrderNum,
+                Comparator.nullsLast(Comparator.naturalOrder()) // ✅ 安全处理 null
+            ))
+            .collect(Collectors.toList());
+    }
+
     private LambdaQueryWrapper<CustomerDept> buildQueryWrapper(CustomerDeptBo bo) {
         Map<String, Object> params = bo.getParams();
         LambdaQueryWrapper<CustomerDept> lqw = Wrappers.lambdaQuery();
-        lqw.orderByAsc(CustomerDept::getId);
-        lqw.eq(StringUtils.isNotBlank(bo.getDeptNo()), CustomerDept::getDeptNo, bo.getDeptNo());
-        lqw.like(StringUtils.isNotBlank(bo.getDeptName()), CustomerDept::getDeptName, bo.getDeptName());
-        lqw.eq(bo.getParentId() != null, CustomerDept::getParentId, bo.getParentId());
+        lqw.orderByAsc(CustomerDept::getDeptId);
         lqw.eq(bo.getCustomerId() != null, CustomerDept::getCustomerId, bo.getCustomerId());
-        lqw.eq(StringUtils.isNotBlank(bo.getAncestors()), CustomerDept::getAncestors, bo.getAncestors());
-        lqw.eq(bo.getDepartmentLevel() != null, CustomerDept::getDepartmentLevel, bo.getDepartmentLevel());
         lqw.eq(bo.getYearlyBudget() != null, CustomerDept::getYearlyBudget, bo.getYearlyBudget());
         lqw.eq(bo.getUsedBudget() != null, CustomerDept::getUsedBudget, bo.getUsedBudget());
         lqw.eq(bo.getMonthLimit() != null, CustomerDept::getMonthLimit, bo.getMonthLimit());
@@ -81,74 +138,84 @@ public class CustomerDeptServiceImpl extends ServiceImpl<CustomerDeptMapper, Cus
         lqw.eq(StringUtils.isNotBlank(bo.getDeptManage()), CustomerDept::getDeptManage, bo.getDeptManage());
         lqw.eq(StringUtils.isNotBlank(bo.getIsLimit()), CustomerDept::getIsLimit, bo.getIsLimit());
         lqw.eq(StringUtils.isNotBlank(bo.getSelectYear()), CustomerDept::getSelectYear, bo.getSelectYear());
-        lqw.eq(StringUtils.isNotBlank(bo.getStatus()), CustomerDept::getStatus, bo.getStatus());
         lqw.eq(StringUtils.isNotBlank(bo.getPlatformCode()), CustomerDept::getPlatformCode, bo.getPlatformCode());
         return lqw;
     }
 
-    /**
-     * 新增客户部门信息
-     *
-     * @param bo 客户部门信息
-     * @return 是否新增成功
-     */
+
     @Override
+    @Transactional(rollbackFor = Exception.class)
     public Boolean insertByBo(CustomerDeptBo bo) {
-        bo.setDeptNo(SequenceUtils.nextPaddedIdStr(DEPT_NO_KEY, Duration.ofDays(3650), 5));
+        try {
+            // 1. 参数校验
+            if (bo == null || bo.getCustomerId() == null) {
+                throw new IllegalArgumentException("客户ID不能为空");
+            }
 
-        CustomerDept info = baseMapper.selectById(bo.getParentId());
-        // 如果父节点不为正常状态,则不允许新增子节点
-        if (!SystemConstants.NORMAL.equals(info.getStatus())) {
-            throw new ServiceException("部门停用,不允许新增");
-        }
+            // 2. 构建并插入 sys_dept 部门结构
+            RemoteDeptVo remoteDeptVo = new RemoteDeptVo();
+            remoteDeptVo.setParentId(bo.getParentId());
+            remoteDeptVo.setDeptName(bo.getDeptName());
+            remoteDeptVo.setPlatformCode(PlatformContext.getPlatform());
+
+
+            RemoteDeptVo deptVo = remoteDeptService.insertDept(remoteDeptVo);
+
+            // 3. 校验 deptId 是否回填成功
+            if (deptVo == null || deptVo.getDeptId() == null) {
+                log.error("创建部门失败:未返回有效部门ID");
+            }
 
-        CustomerDept dept = MapstructUtils.convert(bo, CustomerDept.class);
-        dept.setAncestors(info.getAncestors() + StringUtils.SEPARATOR + dept.getParentId());
-        validEntityBeforeSave(dept);
-        boolean flag = baseMapper.insert(dept) > 0;
-        if (flag) {
-            bo.setId(dept.getId());
+            // 4. 插入 customer_dept 业务数据
+            CustomerDept dept = new CustomerDept();
+            dept.setDeptId(deptVo.getDeptId());
+            dept.setCustomerId(bo.getCustomerId());
+            dept.setYearlyBudget(bo.getYearlyBudget());
+            dept.setMonthLimit(bo.getMonthLimit());
+            dept.setUsedBudget(bo.getUsedBudget());
+            dept.setBindStatus(bo.getBindStatus());
+            dept.setBindAddress(bo.getBindAddress());
+
+            boolean success = baseMapper.insert(dept) > 0;
+            if (!success) {
+                log.error("创建部门失败:插入业务数据失败");
+            }
+            return success;
+        } catch (IllegalArgumentException e) {
+            log.error("创建部门失败:{}", e.getMessage());
+            throw new RuntimeException(e);
         }
-        return flag;
     }
 
-    /**
-     * 修改客户部门信息
-     *
-     * @param bo 客户部门信息
-     * @return 是否修改成功
-     */
     @Override
     public Boolean updateByBo(CustomerDeptBo bo) {
-        CustomerDept update = MapstructUtils.convert(bo, CustomerDept.class);
-        validEntityBeforeSave(update);
-        return baseMapper.updateById(update) > 0;
-    }
 
-    /**
-     * 保存前的数据校验
-     */
-    private boolean validEntityBeforeSave(CustomerDept dept) {
-        boolean exist = baseMapper.exists(new LambdaQueryWrapper<CustomerDept>()
-            .eq(CustomerDept::getDeptName, dept.getDeptName())
-            .eq(CustomerDept::getParentId, dept.getParentId())
-            .eq(CustomerDept::getPlatformCode, dept.getPlatformCode())
-            .ne(ObjectUtil.isNotNull(dept.getId()), CustomerDept::getId, dept.getId()));
-        return !exist;
+        if (bo == null || bo.getDeptId() == null || bo.getDeptId() <= 0) {
+            return false;
+        }
+        RemoteDeptVo remoteDeptVo = remoteDeptService.selectDeptById(bo.getDeptId());
+        if (remoteDeptVo == null) {
+            return false;
+        }
+
+        MapstructUtils.convert(bo, CustomerInfo.class);
+
+
+        // 1. 更新主表
+        CustomerInfo entity = MapstructUtils.convert(bo, CustomerInfo.class);
+//        boolean mainUpdated = baseMapper.updateById(entity) > 0;
+//        if (!mainUpdated) {
+//            return false;
+//        }
+//
+//        Long customerId = bo.getId();
+
+
+        return true;
     }
 
-    /**
-     * 校验并批量删除客户部门信息信息
-     *
-     * @param ids     待删除的主键集合
-     * @param isValid 是否进行有效性校验
-     * @return 是否删除成功
-     */
     @Override
     public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
-        if (isValid) {
-            //TODO 做一些业务上的校验,判断是否需要校验
-        }
-        return baseMapper.deleteByIds(ids) > 0;
+        return null;
     }
 }

+ 115 - 89
ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/service/impl/CustomerInfoServiceImpl.java

@@ -41,7 +41,8 @@ import java.util.stream.Collectors;
 @RequiredArgsConstructor
 @Service
 public class CustomerInfoServiceImpl extends ServiceImpl<CustomerInfoMapper, CustomerInfo> implements ICustomerInfoService {
-
+    @DubboReference
+    private RemoteDeptService remoteDeptService;
     @DubboReference
     private RemoteComPostService remoteComPostService;
     @DubboReference
@@ -122,7 +123,7 @@ public class CustomerInfoServiceImpl extends ServiceImpl<CustomerInfoMapper, Cus
 
         Map<Long, String> deptMap = deptIds.isEmpty()
             ? Collections.emptyMap()
-            : remoteComDeptService.selectDeptNameByIds(deptIds);
+            : remoteDeptService.selectDeptNameByIds(deptIds);
 
         // 先转换
         CustomerSalesInfoVo voObj = MapstructUtils.convert(customerSalesInfo, CustomerSalesInfoVo.class);
@@ -248,7 +249,7 @@ public class CustomerInfoServiceImpl extends ServiceImpl<CustomerInfoMapper, Cus
 
         Map<Long, String> deptMap = deptIds.isEmpty()
             ? Collections.emptyMap()
-            : remoteComDeptService.selectDeptNameByIds(deptIds);
+            : remoteDeptService.selectDeptNameByIds(deptIds);
 
         // === 6. 回填人员和部门名称到 salesInfoVo ===
         for (CustomerSalesInfoVo vo : salesInfoVos) {
@@ -437,104 +438,105 @@ public class CustomerInfoServiceImpl extends ServiceImpl<CustomerInfoMapper, Cus
     @Override
     @Transactional(rollbackFor = Exception.class)
     public Boolean insertByBo(CustomerInfoBo bo) {
-        if (bo == null) {
-            return false;
-        }
-        String platform = PlatformContext.getPlatform();
-//        RemoteDeptVo deptVo = remoteDeptService.selectParentDeptByPlatformCode(platform);
+        try {
+            if (bo == null) {
+                return false;
+            }
+            String platform = PlatformContext.getPlatform();
 
-        boolean isNew = bo.getId() == null || bo.getId() <= 0;
+            boolean isNew = bo.getId() == null || bo.getId() <= 0;
 
-        // 1. 处理主表 CustomerInfo
-        CustomerInfo entity = MapstructUtils.convert(bo, CustomerInfo.class);
-        validEntityBeforeSave(entity);
+            // 1. 处理主表 CustomerInfo
+            CustomerInfo entity = MapstructUtils.convert(bo, CustomerInfo.class);
+            validEntityBeforeSave(entity);
 
-        boolean success;
-        if (isNew) {
-            success = baseMapper.insert(entity) > 0;
-            if (success) {
-                bo.setId(entity.getId()); // 回填ID
+            boolean success;
+            if (isNew) {
+                success = baseMapper.insert(entity) > 0;
+                if (success) {
+                    bo.setId(entity.getId()); // 回填ID
+                }
+            } else {
+                success = baseMapper.updateById(entity) > 0;
             }
-        } else {
-            success = baseMapper.updateById(entity) > 0;
-        }
 
-        if (!success) {
-            return false;
-        }
+            if (!success) {
+                return false;
+            }
 
-        Long customerId = entity.getId();
-
-        /*新增客户时给每个客户创建自己的组织架构*/
-//        RemoteDeptVo remoteDeptVo = new RemoteDeptVo();
-//        remoteDeptVo.setParentId(deptVo.getDeptId());
-//        remoteDeptVo.setCustomerId(customerId);
-//        remoteDeptVo.setDeptName(bo.getCustomerName());
-//        remoteDeptVo.setPlatformCode(platform);
-//        remoteDeptService.insertDept(remoteDeptVo);
-        CustomerDept dept = new CustomerDept();
-        dept.setCustomerId(customerId);
-        dept.setDeptName(bo.getCustomerName());
-        dept.setParentId(0L);
-        dept.setYearlyBudget(BigDecimal.ZERO);
-        dept.setYearlyBudget(BigDecimal.ZERO);
-        dept.setMonthLimit(BigDecimal.ZERO);
-        dept.setUsedBudget(BigDecimal.ZERO);
-        dept.setStatus(IsDefault.No.getCode());
-        dept.setBindStatus(IsDefault.No.getCode());
-        customerDeptMapper.insert(dept);
-
-
-        // 2. 获取各子对象
-        CustomerBusinessInfoBo businessBo = bo.getCustomerBusinessBo();
-        CustomerSalesInfoBo salesBo = bo.getCustomerSalesInfoBo();
-        List<CustomerContactBo> contactList = bo.getCustomerContactBoList();
-        List<CustomerInvoiceInfoBo> invoiceList = bo.getCustomerInvoiceInfoBoList();
-
-        // 3. 如果是更新,先删除旧的关联数据
-        if (!isNew) {
-            // 删除业务信息(一对一)
-            customerBusinessInfoMapper.deleteByCustomerId(customerId);
-            // 删除销售信息(一对一)
-            customerSalesInfoMapper.deleteByCustomerId(customerId);
-            // 删除发票信息(一对多)
-            customerInvoiceInfoMapper.deleteByCustomerId(customerId);
-        }
-
-        // 4. 插入新的关联数据(即使为空也安全处理)
-        // 业务信息
-        if (businessBo != null) {
-            CustomerBusinessInfo businessEntity = MapstructUtils.convert(businessBo, CustomerBusinessInfo.class);
-            businessEntity.setCustomerId(customerId);
-            customerBusinessInfoMapper.insert(businessEntity);
-        }
+            Long customerId = entity.getId();
+
+            /*新增客户时给每个客户创建自己的组织架构*/
+            RemoteDeptVo remoteDeptVo = new RemoteDeptVo();
+            remoteDeptVo.setParentId(100L);
+            remoteDeptVo.setDeptName(bo.getCustomerName());
+            remoteDeptVo.setPlatformCode(platform);
+            RemoteDeptVo deptVo = remoteDeptService.insertDept(remoteDeptVo);
+
+            CustomerDept dept = new CustomerDept();
+            dept.setDeptId(deptVo.getDeptId());
+            dept.setCustomerId(customerId);
+            dept.setYearlyBudget(BigDecimal.ZERO);
+            dept.setMonthLimit(BigDecimal.ZERO);
+            dept.setUsedBudget(BigDecimal.ZERO);
+            dept.setBindStatus(IsDefault.No.getCode());
+            customerDeptMapper.insert(dept);
+
+
+            // 2. 获取各子对象
+            CustomerBusinessInfoBo businessBo = bo.getCustomerBusinessBo();
+            CustomerSalesInfoBo salesBo = bo.getCustomerSalesInfoBo();
+            List<CustomerContactBo> contactList = bo.getCustomerContactBoList();
+            List<CustomerInvoiceInfoBo> invoiceList = bo.getCustomerInvoiceInfoBoList();
+
+            // 3. 如果是更新,先删除旧的关联数据
+            if (!isNew) {
+                // 删除业务信息(一对一)
+                customerBusinessInfoMapper.deleteByCustomerId(customerId);
+                // 删除销售信息(一对一)
+                customerSalesInfoMapper.deleteByCustomerId(customerId);
+                // 删除发票信息(一对多)
+                customerInvoiceInfoMapper.deleteByCustomerId(customerId);
+            }
 
-        // 销售信息
-        if (salesBo != null) {
-            CustomerSalesInfo salesEntity = MapstructUtils.convert(salesBo, CustomerSalesInfo.class);
-            salesEntity.setCustomerId(customerId);
-            customerSalesInfoMapper.insert(salesEntity);
-        }
+            // 4. 插入新的关联数据(即使为空也安全处理)
+            // 业务信息
+            if (businessBo != null) {
+                CustomerBusinessInfo businessEntity = MapstructUtils.convert(businessBo, CustomerBusinessInfo.class);
+                businessEntity.setCustomerId(customerId);
+                customerBusinessInfoMapper.insert(businessEntity);
+            }
 
-        // 联系人列表
-        if (contactList != null && !contactList.isEmpty()) {
-            for (CustomerContactBo contactBo : contactList) {
-                CustomerContact contact = MapstructUtils.convert(contactBo, CustomerContact.class);
-                contact.setCustomerId(customerId);
-                customerContactMapper.insert(contact);
+            // 销售信息
+            if (salesBo != null) {
+                CustomerSalesInfo salesEntity = MapstructUtils.convert(salesBo, CustomerSalesInfo.class);
+                salesEntity.setCustomerId(customerId);
+                customerSalesInfoMapper.insert(salesEntity);
             }
-        }
 
-        // 发票信息列表
-        if (invoiceList != null && !invoiceList.isEmpty()) {
-            for (CustomerInvoiceInfoBo invoiceBo : invoiceList) {
-                CustomerInvoiceInfo invoice = MapstructUtils.convert(invoiceBo, CustomerInvoiceInfo.class);
-                invoice.setCustomerId(customerId);
-                customerInvoiceInfoMapper.insert(invoice);
+            // 联系人列表
+            if (contactList != null && !contactList.isEmpty()) {
+                for (CustomerContactBo contactBo : contactList) {
+                    CustomerContact contact = MapstructUtils.convert(contactBo, CustomerContact.class);
+                    contact.setCustomerId(customerId);
+                    customerContactMapper.insert(contact);
+                }
             }
-        }
 
-        return true;
+            // 发票信息列表
+            if (invoiceList != null && !invoiceList.isEmpty()) {
+                for (CustomerInvoiceInfoBo invoiceBo : invoiceList) {
+                    CustomerInvoiceInfo invoice = MapstructUtils.convert(invoiceBo, CustomerInvoiceInfo.class);
+                    invoice.setCustomerId(customerId);
+                    customerInvoiceInfoMapper.insert(invoice);
+                }
+            }
+            log.info("新增客户信息成功:{}", bo);
+            return true;
+        } catch (Exception e) {
+            log.error("新增客户信息失败:{}", e.getMessage());
+            throw new RuntimeException(e);
+        }
     }
 
     /**
@@ -687,6 +689,30 @@ public class CustomerInfoServiceImpl extends ServiceImpl<CustomerInfoMapper, Cus
         }
     }
 
+    public Map<Long, String> selectCustomerNameByIds(Set<Long> ids) {
+        if (ids == null || ids.isEmpty()) {
+            return Collections.emptyMap();
+        }
+
+        // 限制批量大小
+        if (ids.size() > 1000) {
+            throw new IllegalArgumentException("Batch size exceeds limit: " + ids.size());
+        }
+
+        List<CustomerInfo> customerInfoList = baseMapper.selectByIds(ids);
+        Map<Long, String> resultMap = new HashMap<>(ids.size());
+
+        // 初始化所有请求的 ID 为 null
+        ids.forEach(id -> resultMap.put(id, null));
+
+        if (customerInfoList != null) {
+            customerInfoList.stream()
+                .filter(dept -> dept.getId() != null && dept.getCustomerName() != null)
+                .forEach(dept -> resultMap.put(dept.getId(), dept.getCustomerName()));
+        }
+
+        return resultMap;
+    }
 
     /**
      * 保存前的数据校验

+ 0 - 1
ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/service/impl/CustomerSalesInfoServiceImpl.java

@@ -82,7 +82,6 @@ public class CustomerSalesInfoServiceImpl extends ServiceImpl<CustomerSalesInfoM
         lqw.eq(bo.getBillDate() != null, CustomerSalesInfo::getBillDate, bo.getBillDate());
         lqw.eq(bo.getBillingDay() != null, CustomerSalesInfo::getBillingDay, bo.getBillingDay());
         lqw.eq(StringUtils.isNotBlank(bo.getOrderAudit()), CustomerSalesInfo::getOrderAudit, bo.getOrderAudit());
-        lqw.eq(StringUtils.isNotBlank(bo.getCreditManagement()), CustomerSalesInfo::getCreditManagement, bo.getCreditManagement());
         lqw.eq(StringUtils.isNotBlank(bo.getCreditPaymentPassword()), CustomerSalesInfo::getCreditPaymentPassword, bo.getCreditPaymentPassword());
         lqw.eq(bo.getPayDays() != null, CustomerSalesInfo::getPayDays, bo.getPayDays());
         lqw.eq(bo.getSalesPersonId() != null, CustomerSalesInfo::getSalesPersonId, bo.getSalesPersonId());

+ 7 - 7
ruoyi-modules/ruoyi-external/src/main/java/org/dromara/external/controller/ExternalItemController.java

@@ -27,7 +27,7 @@ import org.dromara.common.mybatis.core.page.TableDataInfo;
  * 前端访问路由地址为:/external/item
  *
  * @author LionLi
- * @date 2025-12-29
+ * @date 2026-01-08
  */
 @Validated
 @RequiredArgsConstructor
@@ -40,7 +40,7 @@ public class ExternalItemController extends BaseController {
     /**
      * 查询第三方对接项目管理列表
      */
-    @SaCheckPermission("external:item:list")
+    //@SaCheckPermission("external:item:list")
     @GetMapping("/list")
     public TableDataInfo<ExternalItemVo> list(ExternalItemBo bo, PageQuery pageQuery) {
         return externalItemService.queryPageList(bo, pageQuery);
@@ -49,7 +49,7 @@ public class ExternalItemController extends BaseController {
     /**
      * 导出第三方对接项目管理列表
      */
-    @SaCheckPermission("external:item:export")
+    //@SaCheckPermission("external:item:export")
     @Log(title = "第三方对接项目管理", businessType = BusinessType.EXPORT)
     @PostMapping("/export")
     public void export(ExternalItemBo bo, HttpServletResponse response) {
@@ -62,7 +62,7 @@ public class ExternalItemController extends BaseController {
      *
      * @param id 主键
      */
-    @SaCheckPermission("external:item:query")
+    //@SaCheckPermission("external:item:query")
     @GetMapping("/{id}")
     public R<ExternalItemVo> getInfo(@NotNull(message = "主键不能为空")
                                      @PathVariable("id") Long id) {
@@ -72,7 +72,7 @@ public class ExternalItemController extends BaseController {
     /**
      * 新增第三方对接项目管理
      */
-    @SaCheckPermission("external:item:add")
+    //@SaCheckPermission("external:item:add")
     @Log(title = "第三方对接项目管理", businessType = BusinessType.INSERT)
     @RepeatSubmit()
     @PostMapping()
@@ -83,7 +83,7 @@ public class ExternalItemController extends BaseController {
     /**
      * 修改第三方对接项目管理
      */
-    @SaCheckPermission("external:item:edit")
+    //@SaCheckPermission("external:item:edit")
     @Log(title = "第三方对接项目管理", businessType = BusinessType.UPDATE)
     @RepeatSubmit()
     @PutMapping()
@@ -96,7 +96,7 @@ public class ExternalItemController extends BaseController {
      *
      * @param ids 主键串
      */
-    @SaCheckPermission("external:item:remove")
+    //@SaCheckPermission("external:item:remove")
     @Log(title = "第三方对接项目管理", businessType = BusinessType.DELETE)
     @DeleteMapping("/{ids}")
     public R<Void> remove(@NotEmpty(message = "主键不能为空")

+ 7 - 7
ruoyi-modules/ruoyi-external/src/main/java/org/dromara/external/controller/ExternalProductBrandController.java

@@ -27,7 +27,7 @@ import org.dromara.common.mybatis.core.page.TableDataInfo;
  * 前端访问路由地址为:/external/productBrand
  *
  * @author LionLi
- * @date 2025-12-29
+ * @date 2026-01-08
  */
 @Validated
 @RequiredArgsConstructor
@@ -40,7 +40,7 @@ public class ExternalProductBrandController extends BaseController {
     /**
      * 查询第三方产品品牌信息列表
      */
-    @SaCheckPermission("external:productBrand:list")
+    //@SaCheckPermission("external:productBrand:list")
     @GetMapping("/list")
     public TableDataInfo<ExternalProductBrandVo> list(ExternalProductBrandBo bo, PageQuery pageQuery) {
         return externalProductBrandService.queryPageList(bo, pageQuery);
@@ -49,7 +49,7 @@ public class ExternalProductBrandController extends BaseController {
     /**
      * 导出第三方产品品牌信息列表
      */
-    @SaCheckPermission("external:productBrand:export")
+    //@SaCheckPermission("external:productBrand:export")
     @Log(title = "第三方产品品牌信息", businessType = BusinessType.EXPORT)
     @PostMapping("/export")
     public void export(ExternalProductBrandBo bo, HttpServletResponse response) {
@@ -62,7 +62,7 @@ public class ExternalProductBrandController extends BaseController {
      *
      * @param id 主键
      */
-    @SaCheckPermission("external:productBrand:query")
+    //@SaCheckPermission("external:productBrand:query")
     @GetMapping("/{id}")
     public R<ExternalProductBrandVo> getInfo(@NotNull(message = "主键不能为空")
                                      @PathVariable("id") Long id) {
@@ -72,7 +72,7 @@ public class ExternalProductBrandController extends BaseController {
     /**
      * 新增第三方产品品牌信息
      */
-    @SaCheckPermission("external:productBrand:add")
+    //@SaCheckPermission("external:productBrand:add")
     @Log(title = "第三方产品品牌信息", businessType = BusinessType.INSERT)
     @RepeatSubmit()
     @PostMapping()
@@ -83,7 +83,7 @@ public class ExternalProductBrandController extends BaseController {
     /**
      * 修改第三方产品品牌信息
      */
-    @SaCheckPermission("external:productBrand:edit")
+    //@SaCheckPermission("external:productBrand:edit")
     @Log(title = "第三方产品品牌信息", businessType = BusinessType.UPDATE)
     @RepeatSubmit()
     @PutMapping()
@@ -96,7 +96,7 @@ public class ExternalProductBrandController extends BaseController {
      *
      * @param ids 主键串
      */
-    @SaCheckPermission("external:productBrand:remove")
+    //@SaCheckPermission("external:productBrand:remove")
     @Log(title = "第三方产品品牌信息", businessType = BusinessType.DELETE)
     @DeleteMapping("/{ids}")
     public R<Void> remove(@NotEmpty(message = "主键不能为空")

+ 19 - 19
ruoyi-modules/ruoyi-external/src/main/java/org/dromara/external/controller/ExternalProductCategoryController.java

@@ -23,11 +23,11 @@ import org.dromara.external.service.IExternalProductCategoryService;
 import org.dromara.common.mybatis.core.page.TableDataInfo;
 
 /**
- * 第三方产品分类
+ * 产品分类
  * 前端访问路由地址为:/external/productCategory
  *
  * @author LionLi
- * @date 2025-12-29
+ * @date 2026-01-08
  */
 @Validated
 @RequiredArgsConstructor
@@ -38,31 +38,31 @@ public class ExternalProductCategoryController extends BaseController {
     private final IExternalProductCategoryService externalProductCategoryService;
 
     /**
-     * 查询第三方产品分类列表
+     * 查询产品分类列表
      */
-    @SaCheckPermission("external:productCategory:list")
+    //@SaCheckPermission("external:productCategory:list")
     @GetMapping("/list")
     public TableDataInfo<ExternalProductCategoryVo> list(ExternalProductCategoryBo bo, PageQuery pageQuery) {
         return externalProductCategoryService.queryPageList(bo, pageQuery);
     }
 
     /**
-     * 导出第三方产品分类列表
+     * 导出产品分类列表
      */
-    @SaCheckPermission("external:productCategory:export")
-    @Log(title = "第三方产品分类", businessType = BusinessType.EXPORT)
+    //@SaCheckPermission("external:productCategory:export")
+    @Log(title = "产品分类", businessType = BusinessType.EXPORT)
     @PostMapping("/export")
     public void export(ExternalProductCategoryBo bo, HttpServletResponse response) {
         List<ExternalProductCategoryVo> list = externalProductCategoryService.queryList(bo);
-        ExcelUtil.exportExcel(list, "第三方产品分类", ExternalProductCategoryVo.class, response);
+        ExcelUtil.exportExcel(list, "产品分类", ExternalProductCategoryVo.class, response);
     }
 
     /**
-     * 获取第三方产品分类详细信息
+     * 获取产品分类详细信息
      *
      * @param id 主键
      */
-    @SaCheckPermission("external:productCategory:query")
+    //@SaCheckPermission("external:productCategory:query")
     @GetMapping("/{id}")
     public R<ExternalProductCategoryVo> getInfo(@NotNull(message = "主键不能为空")
                                      @PathVariable("id") Long id) {
@@ -70,10 +70,10 @@ public class ExternalProductCategoryController extends BaseController {
     }
 
     /**
-     * 新增第三方产品分类
+     * 新增产品分类
      */
-    @SaCheckPermission("external:productCategory:add")
-    @Log(title = "第三方产品分类", businessType = BusinessType.INSERT)
+    //@SaCheckPermission("external:productCategory:add")
+    @Log(title = "产品分类", businessType = BusinessType.INSERT)
     @RepeatSubmit()
     @PostMapping()
     public R<Void> add(@Validated(AddGroup.class) @RequestBody ExternalProductCategoryBo bo) {
@@ -81,10 +81,10 @@ public class ExternalProductCategoryController extends BaseController {
     }
 
     /**
-     * 修改第三方产品分类
+     * 修改产品分类
      */
-    @SaCheckPermission("external:productCategory:edit")
-    @Log(title = "第三方产品分类", businessType = BusinessType.UPDATE)
+    //@SaCheckPermission("external:productCategory:edit")
+    @Log(title = "产品分类", businessType = BusinessType.UPDATE)
     @RepeatSubmit()
     @PutMapping()
     public R<Void> edit(@Validated(EditGroup.class) @RequestBody ExternalProductCategoryBo bo) {
@@ -92,12 +92,12 @@ public class ExternalProductCategoryController extends BaseController {
     }
 
     /**
-     * 删除第三方产品分类
+     * 删除产品分类
      *
      * @param ids 主键串
      */
-    @SaCheckPermission("external:productCategory:remove")
-    @Log(title = "第三方产品分类", businessType = BusinessType.DELETE)
+    //@SaCheckPermission("external:productCategory:remove")
+    @Log(title = "产品分类", businessType = BusinessType.DELETE)
     @DeleteMapping("/{ids}")
     public R<Void> remove(@NotEmpty(message = "主键不能为空")
                           @PathVariable("ids") Long[] ids) {

+ 106 - 0
ruoyi-modules/ruoyi-external/src/main/java/org/dromara/external/controller/ExternalProductChangeLogController.java

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

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

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

+ 7 - 7
ruoyi-modules/ruoyi-external/src/main/java/org/dromara/external/controller/ExternalPushPoolLogController.java

@@ -27,7 +27,7 @@ import org.dromara.common.mybatis.core.page.TableDataInfo;
  * 前端访问路由地址为:/external/pushPoolLog
  *
  * @author LionLi
- * @date 2025-12-24
+ * @date 2026-01-08
  */
 @Validated
 @RequiredArgsConstructor
@@ -40,7 +40,7 @@ public class ExternalPushPoolLogController extends BaseController {
     /**
      * 查询商品池推送记录列表
      */
-    @SaCheckPermission("external:pushPoolLog:list")
+    //@SaCheckPermission("external:pushPoolLog:list")
     @GetMapping("/list")
     public TableDataInfo<ExternalPushPoolLogVo> list(ExternalPushPoolLogBo bo, PageQuery pageQuery) {
         return externalPushPoolLogService.queryPageList(bo, pageQuery);
@@ -49,7 +49,7 @@ public class ExternalPushPoolLogController extends BaseController {
     /**
      * 导出商品池推送记录列表
      */
-    @SaCheckPermission("external:pushPoolLog:export")
+    //@SaCheckPermission("external:pushPoolLog:export")
     @Log(title = "商品池推送记录", businessType = BusinessType.EXPORT)
     @PostMapping("/export")
     public void export(ExternalPushPoolLogBo bo, HttpServletResponse response) {
@@ -62,7 +62,7 @@ public class ExternalPushPoolLogController extends BaseController {
      *
      * @param id 主键
      */
-    @SaCheckPermission("external:pushPoolLog:query")
+    //@SaCheckPermission("external:pushPoolLog:query")
     @GetMapping("/{id}")
     public R<ExternalPushPoolLogVo> getInfo(@NotNull(message = "主键不能为空")
                                      @PathVariable("id") Long id) {
@@ -72,7 +72,7 @@ public class ExternalPushPoolLogController extends BaseController {
     /**
      * 新增商品池推送记录
      */
-    @SaCheckPermission("external:pushPoolLog:add")
+    //@SaCheckPermission("external:pushPoolLog:add")
     @Log(title = "商品池推送记录", businessType = BusinessType.INSERT)
     @RepeatSubmit()
     @PostMapping()
@@ -83,7 +83,7 @@ public class ExternalPushPoolLogController extends BaseController {
     /**
      * 修改商品池推送记录
      */
-    @SaCheckPermission("external:pushPoolLog:edit")
+    //@SaCheckPermission("external:pushPoolLog:edit")
     @Log(title = "商品池推送记录", businessType = BusinessType.UPDATE)
     @RepeatSubmit()
     @PutMapping()
@@ -96,7 +96,7 @@ public class ExternalPushPoolLogController extends BaseController {
      *
      * @param ids 主键串
      */
-    @SaCheckPermission("external:pushPoolLog:remove")
+    //@SaCheckPermission("external:pushPoolLog:remove")
     @Log(title = "商品池推送记录", businessType = BusinessType.DELETE)
     @DeleteMapping("/{ids}")
     public R<Void> remove(@NotEmpty(message = "主键不能为空")

+ 1 - 0
ruoyi-modules/ruoyi-external/src/main/java/org/dromara/external/controller/zhongzhi/ZhongZhiPullController.java

@@ -123,6 +123,7 @@ public class ZhongZhiPullController {
         String accessToken = this.getAccessToken();
         post.form("token", accessToken);
         post.form("platformCode", code);
+        HashMap<String, String> stringStringHashMap = new HashMap<>();
         String body = post.execute().body();
         Result<List<Map<String,String>>> result = JSONUtil.toBean(body, Result.class);
         if (!result.getSuccess()) {

+ 4 - 9
ruoyi-modules/ruoyi-external/src/main/java/org/dromara/external/controller/zhongzhi/ZhongZhiPushController.java

@@ -2,11 +2,9 @@ package org.dromara.external.controller.zhongzhi;
 
 import cn.dev33.satoken.stp.StpUtil;
 import cn.hutool.core.bean.BeanUtil;
-import cn.hutool.core.date.DateTime;
 import cn.hutool.core.date.DateUtil;
 import cn.hutool.core.lang.UUID;
 import cn.hutool.core.util.ObjectUtil;
-import cn.hutool.crypto.SecureUtil;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import lombok.RequiredArgsConstructor;
 import org.apache.dubbo.config.annotation.DubboReference;
@@ -24,16 +22,13 @@ import org.dromara.product.api.domain.ProductChangeLogApiVo;
 import org.dromara.product.api.domain.ProductVo;
 import org.dromara.product.api.domain.dto.OrderNoticeDto;
 import org.dromara.product.api.domain.dto.OrderPushDto;
-import org.dromara.system.api.RemoteUserService;
 import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
 
 import java.util.ArrayList;
-import java.util.Arrays;
 import java.util.List;
-import java.util.Objects;
 
 /**
  * 商品池推送记录
@@ -108,7 +103,7 @@ public class ZhongZhiPushController {
     * 获取商品详情 362031
     * */
     @PostMapping("/product/detail_standard")
-    public Result<ExternalProductVo> detailStandard(GetProductDetailBo bo) {
+    public Result<ZhongzhiExternalProductVo> detailStandard(GetProductDetailBo bo) {
         Result result = checkToken(bo.getToken(), bo.getPlatformCode());
         if(ObjectUtil.isNotEmpty(result)){
             return result;
@@ -131,13 +126,13 @@ public class ZhongZhiPushController {
         );
 
 
-        ExternalProductVo externalProductVo = ExternalProductVo.builder()
+        ZhongzhiExternalProductVo externalProductVo = ZhongzhiExternalProductVo.builder()
             .sku(String.valueOf(productDetail.getId()))
             .url(productDetail.getProductImage())
             .model(productDetail.getItemName())
             .weight(productDetail.getWeight())
             .image_path(productDetail.getProductImageUrl())
-            .state(productDetail.getProductStatus())
+            .state(String.valueOf(productDetail.getProductStatus()))
             .brand_name(productDetail.getBrandName())
             .name(productDetail.getItemName())
             .product_area(null)
@@ -205,7 +200,7 @@ public class ZhongZhiPushController {
             ProductVo productVo = remoteProductService.updateProductShelfState(Long.valueOf(skuId));
             ProductShelfStateVo productShelfStateVo = new ProductShelfStateVo();
             productShelfStateVo.setSku(skuId);
-            productShelfStateVo.setState(productVo.getProductStatus());
+            productShelfStateVo.setState(String.valueOf(productVo.getProductStatus()));
             shelfState.add(productShelfStateVo);
         }
         return Result.ok(shelfState);

+ 2 - 2
ruoyi-modules/ruoyi-external/src/main/java/org/dromara/external/domain/ExternalItem.java

@@ -11,7 +11,7 @@ import java.io.Serial;
  * 第三方对接项目管理对象 external_item
  *
  * @author LionLi
- * @date 2025-12-29
+ * @date 2026-01-08
  */
 @Data
 @EqualsAndHashCode(callSuper = true)
@@ -28,7 +28,7 @@ public class ExternalItem extends TenantEntity {
     private Long id;
 
     /**
-     * 项目
+     * 项目
      */
     private String itemName;
 

+ 67 - 0
ruoyi-modules/ruoyi-external/src/main/java/org/dromara/external/domain/ExternalProduct.java

@@ -0,0 +1,67 @@
+package org.dromara.external.domain;
+
+import org.dromara.common.tenant.core.TenantEntity;
+import com.baomidou.mybatisplus.annotation.*;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.io.Serial;
+
+/**
+ * 对外部推送商品对象 external_product
+ *
+ * @author LionLi
+ * @date 2026-01-08
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@TableName("external_product")
+public class ExternalProduct extends TenantEntity {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 
+     */
+    @TableId(value = "id")
+    private Long id;
+
+    /**
+     * 商品id
+     */
+    private Long productId;
+
+    /**
+     * 项目id
+     */
+    private Long itemId;
+
+    /**
+     * 分类id
+     */
+    private Long categoryId;
+
+    /**
+     * 外部分类id
+     */
+    private Long externlCategoryId;
+
+    /**
+     * 推送状态 0未推送,1已推送
+     */
+    private Long pushStatus;
+
+    /**
+     * 删除标志(0代表存在 2代表删除)
+     */
+    @TableLogic
+    private String delFlag;
+
+    /**
+     * 备注
+     */
+    private String remark;
+
+
+}

+ 1 - 9
ruoyi-modules/ruoyi-external/src/main/java/org/dromara/external/domain/ExternalProductBrand.java

@@ -4,8 +4,6 @@ import org.dromara.common.tenant.core.TenantEntity;
 import com.baomidou.mybatisplus.annotation.*;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
-import org.dromara.common.translation.annotation.Translation;
-import org.dromara.common.translation.constant.TransConstant;
 
 import java.io.Serial;
 
@@ -13,7 +11,7 @@ import java.io.Serial;
  * 第三方产品品牌信息对象 external_product_brand
  *
  * @author LionLi
- * @date 2025-12-29
+ * @date 2026-01-08
  */
 @Data
 @EqualsAndHashCode(callSuper = true)
@@ -90,10 +88,4 @@ public class ExternalProductBrand extends TenantEntity {
     @TableLogic
     private String delFlag;
 
-    /**
-     * 备注
-     */
-    private String remark;
-
-
 }

+ 2 - 2
ruoyi-modules/ruoyi-external/src/main/java/org/dromara/external/domain/ExternalProductCategory.java

@@ -8,10 +8,10 @@ import lombok.EqualsAndHashCode;
 import java.io.Serial;
 
 /**
- * 第三方产品分类对象 external_product_category
+ * 产品分类对象 external_product_category
  *
  * @author LionLi
- * @date 2025-12-29
+ * @date 2026-01-08
  */
 @Data
 @EqualsAndHashCode(callSuper = true)

+ 84 - 0
ruoyi-modules/ruoyi-external/src/main/java/org/dromara/external/domain/ExternalProductChangeLog.java

@@ -0,0 +1,84 @@
+package org.dromara.external.domain;
+
+import org.dromara.common.tenant.core.TenantEntity;
+import com.baomidou.mybatisplus.annotation.*;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.io.Serial;
+
+/**
+ * 商品变更消息记录对象 external_product_change_log
+ *
+ * @author LionLi
+ * @date 2026-01-08
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@TableName("external_product_change_log")
+public class ExternalProductChangeLog extends TenantEntity {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 
+     */
+    @TableId(value = "id")
+    private Long id;
+
+    /**
+     * 项目id
+     */
+    private Long itemId;
+
+    /**
+     * 商品id
+     */
+    private Long productId;
+
+    /**
+     * type=2商品
+价格变更,后
+续会调用价格
+接口。
+type=4代表
+商品上下架变
+更消息,后续
+会调用上下架
+状态接口。
+type=6代表
+添加、删除商
+品池内的商
+品,触发保存
+商品流程,依
+次调用商品详
+情等接口获取
+商品信息。
+type=16商品
+介绍及规格参
+数变更消息,
+调用商品详情
+等接口更新商
+品信息。
+     */
+    private String type;
+
+    /**
+     * 状态(0正常 1停用)
+     */
+    private String status;
+
+    /**
+     * 删除标志(0代表存在 2代表删除)
+     */
+    @TableLogic
+    private String delFlag;
+
+    /**
+     * 备注
+     */
+    private String remark;
+
+
+}

+ 8 - 8
ruoyi-modules/ruoyi-external/src/main/java/org/dromara/external/domain/ExternalPushPoolLog.java

@@ -11,7 +11,7 @@ import java.io.Serial;
  * 商品池推送记录对象 external_push_pool_log
  *
  * @author LionLi
- * @date 2025-12-24
+ * @date 2026-01-08
  */
 @Data
 @EqualsAndHashCode(callSuper = true)
@@ -22,14 +22,14 @@ public class ExternalPushPoolLog extends TenantEntity {
     private static final long serialVersionUID = 1L;
 
     /**
-     *
+     * 
      */
     @TableId(value = "id")
     private Long id;
 
     /**
      * 项目id
-     * */
+     */
     private Long itemId;
 
     /**
@@ -47,16 +47,16 @@ public class ExternalPushPoolLog extends TenantEntity {
      */
     private String pushStatus;
 
-    /**
-     * 失败原因
-     * */
-    private String reason;
-
     /**
      * 状态(0正常 1停用)
      */
     private String status;
 
+    /**
+     * 失败原因
+     */
+    private String reason;
+
     /**
      * 删除标志(0代表存在 2代表删除)
      */

+ 9 - 9
ruoyi-modules/ruoyi-external/src/main/java/org/dromara/external/domain/bo/ExternalItemBo.java

@@ -13,7 +13,7 @@ import jakarta.validation.constraints.*;
  * 第三方对接项目管理业务对象 external_item
  *
  * @author LionLi
- * @date 2025-12-29
+ * @date 2026-01-08
  */
 @Data
 @EqualsAndHashCode(callSuper = true)
@@ -26,45 +26,45 @@ public class ExternalItemBo extends BaseEntity {
     private Long id;
 
     /**
-     * 项目
+     * 项目
      */
-    @NotBlank(message = "项目表不能为空", groups = { AddGroup.class, EditGroup.class })
+//    @NotBlank(message = "项目名不能为空", groups = { AddGroup.class, EditGroup.class })
     private String itemName;
 
     /**
      * 项目key
      */
-    @NotBlank(message = "项目key不能为空", groups = { AddGroup.class, EditGroup.class })
+//    @NotBlank(message = "项目key不能为空", groups = { AddGroup.class, EditGroup.class })
     private String itemKey;
 
     /**
      * 项目用户名
      */
-    @NotBlank(message = "项目用户名不能为空", groups = { AddGroup.class, EditGroup.class })
+//    @NotBlank(message = "项目用户名不能为空", groups = { AddGroup.class, EditGroup.class })
     private String userName;
 
     /**
      * 项目密码
      */
-    @NotBlank(message = "项目密码不能为空", groups = { AddGroup.class, EditGroup.class })
+//    @NotBlank(message = "项目密码不能为空", groups = { AddGroup.class, EditGroup.class })
     private String password;
 
     /**
      * 项目url
      */
-    @NotBlank(message = "项目url不能为空", groups = { AddGroup.class, EditGroup.class })
+//    @NotBlank(message = "项目url不能为空", groups = { AddGroup.class, EditGroup.class })
     private String url;
 
     /**
      * 状态(0正常 1停用)
      */
-    @NotBlank(message = "状态(0正常 1停用)不能为空", groups = { AddGroup.class, EditGroup.class })
+//    @NotBlank(message = "状态(0正常 1停用)不能为空", groups = { AddGroup.class, EditGroup.class })
     private String status;
 
     /**
      * 备注
      */
-    @NotBlank(message = "备注不能为空", groups = { AddGroup.class, EditGroup.class })
+//    @NotBlank(message = "备注不能为空", groups = { AddGroup.class, EditGroup.class })
     private String remark;
 
 

+ 65 - 0
ruoyi-modules/ruoyi-external/src/main/java/org/dromara/external/domain/bo/ExternalProductBo.java

@@ -0,0 +1,65 @@
+package org.dromara.external.domain.bo;
+
+import org.dromara.external.domain.ExternalProduct;
+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.*;
+
+/**
+ * 对外部推送商品业务对象 external_product
+ *
+ * @author LionLi
+ * @date 2026-01-08
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@AutoMapper(target = ExternalProduct.class, reverseConvertGenerate = false)
+public class ExternalProductBo extends BaseEntity {
+
+    /**
+     * 
+     */
+    private Long id;
+
+    /**
+     * 商品id
+     */
+    @NotNull(message = "商品id不能为空", groups = { AddGroup.class, EditGroup.class })
+    private Long productId;
+
+    /**
+     * 项目id
+     */
+    @NotNull(message = "项目id不能为空", groups = { AddGroup.class, EditGroup.class })
+    private Long itemId;
+
+    /**
+     * 分类id
+     */
+    @NotNull(message = "分类id不能为空", groups = { AddGroup.class, EditGroup.class })
+    private Long categoryId;
+
+    /**
+     * 外部分类id
+     */
+    @NotNull(message = "外部分类id不能为空", groups = { AddGroup.class, EditGroup.class })
+    private Long externlCategoryId;
+
+    /**
+     * 推送状态 0未推送,1已推送
+     */
+    @NotNull(message = "推送状态 0未推送,1已推送不能为空", groups = { AddGroup.class, EditGroup.class })
+    private Long pushStatus;
+
+    /**
+     * 备注
+     */
+    @NotBlank(message = "备注不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String remark;
+
+
+}

+ 1 - 3
ruoyi-modules/ruoyi-external/src/main/java/org/dromara/external/domain/bo/ExternalProductBrandBo.java

@@ -8,14 +8,12 @@ import io.github.linpeilie.annotations.AutoMapper;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 import jakarta.validation.constraints.*;
-import org.dromara.common.translation.annotation.Translation;
-import org.dromara.common.translation.constant.TransConstant;
 
 /**
  * 第三方产品品牌信息业务对象 external_product_brand
  *
  * @author LionLi
- * @date 2025-12-29
+ * @date 2026-01-08
  */
 @Data
 @EqualsAndHashCode(callSuper = true)

+ 2 - 2
ruoyi-modules/ruoyi-external/src/main/java/org/dromara/external/domain/bo/ExternalProductCategoryBo.java

@@ -10,10 +10,10 @@ import lombok.EqualsAndHashCode;
 import jakarta.validation.constraints.*;
 
 /**
- * 第三方产品分类业务对象 external_product_category
+ * 产品分类业务对象 external_product_category
  *
  * @author LionLi
- * @date 2025-12-29
+ * @date 2026-01-08
  */
 @Data
 @EqualsAndHashCode(callSuper = true)

+ 80 - 0
ruoyi-modules/ruoyi-external/src/main/java/org/dromara/external/domain/bo/ExternalProductChangeLogBo.java

@@ -0,0 +1,80 @@
+package org.dromara.external.domain.bo;
+
+import org.dromara.external.domain.ExternalProductChangeLog;
+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.*;
+
+/**
+ * 商品变更消息记录业务对象 external_product_change_log
+ *
+ * @author LionLi
+ * @date 2026-01-08
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@AutoMapper(target = ExternalProductChangeLog.class, reverseConvertGenerate = false)
+public class ExternalProductChangeLogBo extends BaseEntity {
+
+    /**
+     *
+     */
+    private Long id;
+
+    /**
+     * 项目id
+     */
+    @NotNull(message = "项目id不能为空", groups = { AddGroup.class, EditGroup.class })
+    private Long itemId;
+
+    /**
+     * 商品id
+     */
+    @NotNull(message = "商品id不能为空", groups = { AddGroup.class, EditGroup.class })
+    private Long productId;
+
+    /**
+     * type=2商品
+价格变更,后
+续会调用价格
+接口。
+type=4代表
+商品上下架变
+更消息,后续
+会调用上下架
+状态接口。
+type=6代表
+添加、删除商
+品池内的商
+品,触发保存
+商品流程,依
+次调用商品详
+情等接口获取
+商品信息。
+type=16商品
+介绍及规格参
+数变更消息,
+调用商品详情
+等接口更新商
+品信息。
+     */
+    private String type;
+
+    /**
+     * 状态(0正常 1停用)
+     */
+    @NotBlank(message = "状态(0正常 1停用)不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String status;
+
+    /**
+     * 备注
+     */
+    @NotBlank(message = "备注不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String remark;
+
+
+}

+ 11 - 9
ruoyi-modules/ruoyi-external/src/main/java/org/dromara/external/domain/bo/ExternalPushPoolLogBo.java

@@ -13,7 +13,7 @@ import jakarta.validation.constraints.*;
  * 商品池推送记录业务对象 external_push_pool_log
  *
  * @author LionLi
- * @date 2025-12-24
+ * @date 2026-01-08
  */
 @Data
 @EqualsAndHashCode(callSuper = true)
@@ -21,13 +21,14 @@ import jakarta.validation.constraints.*;
 public class ExternalPushPoolLogBo extends BaseEntity {
 
     /**
-     *
+     * 
      */
     private Long id;
 
     /**
-    * 项目id
-    * */
+     * 项目id
+     */
+    @NotNull(message = "项目id不能为空", groups = { AddGroup.class, EditGroup.class })
     private Long itemId;
 
     /**
@@ -48,17 +49,18 @@ public class ExternalPushPoolLogBo extends BaseEntity {
     @NotBlank(message = "推送状态 0成功 1失败不能为空", groups = { AddGroup.class, EditGroup.class })
     private String pushStatus;
 
-    /**
-    * 失败原因
-    * */
-    private String reason;
-
     /**
      * 状态(0正常 1停用)
      */
     @NotBlank(message = "状态(0正常 1停用)不能为空", groups = { AddGroup.class, EditGroup.class })
     private String status;
 
+    /**
+     * 失败原因
+     */
+    @NotBlank(message = "失败原因不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String reason;
+
     /**
      * 备注
      */

+ 3 - 3
ruoyi-modules/ruoyi-external/src/main/java/org/dromara/external/domain/vo/ExternalItemVo.java

@@ -18,7 +18,7 @@ import java.util.Date;
  * 第三方对接项目管理视图对象 external_item
  *
  * @author LionLi
- * @date 2025-12-29
+ * @date 2026-01-08
  */
 @Data
 @ExcelIgnoreUnannotated
@@ -35,9 +35,9 @@ public class ExternalItemVo implements Serializable {
     private Long id;
 
     /**
-     * 项目
+     * 项目
      */
-    @ExcelProperty(value = "项目")
+    @ExcelProperty(value = "项目")
     private String itemName;
 
     /**

+ 8 - 80
ruoyi-modules/ruoyi-external/src/main/java/org/dromara/external/domain/vo/ExternalProductBrandVo.java

@@ -1,26 +1,19 @@
 package org.dromara.external.domain.vo;
 
-import org.dromara.common.translation.annotation.Translation;
-import org.dromara.common.translation.constant.TransConstant;
 import org.dromara.external.domain.ExternalProductBrand;
 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;
-
-
 
 /**
  * 第三方产品品牌信息视图对象 external_product_brand
  *
  * @author LionLi
- * @date 2025-12-29
+ * @date 2026-01-08
  */
 @Data
 @ExcelIgnoreUnannotated
@@ -37,86 +30,21 @@ public class ExternalProductBrandVo implements Serializable {
     private Long id;
 
     /**
-     * 原系统品牌id
+     * 官方品牌id
      */
-    @ExcelProperty(value = "原系统品牌id")
+    @ExcelProperty(value = "官方品牌id")
     private Long productBrandId;
 
     /**
-     * 项目id
-     */
-    @ExcelProperty(value = "项目id")
-    private Long itemId;
-
-    /**
-     * 品牌编号(唯一标识)
-     */
-    @ExcelProperty(value = "品牌编号", converter = ExcelDictConvert.class)
-    @ExcelDictFormat(readConverterExp = "唯=一标识")
-    private String brandNo;
-
-    /**
-     * 品牌中文名称
+     * 官方品牌名称
      */
-    @ExcelProperty(value = "品牌中文名称")
+    @ExcelProperty(value = "官方品牌名称")
     private String brandName;
 
     /**
-     * 品牌首字母缩写(如拼音首字母)
-     */
-    @ExcelProperty(value = "品牌首字母缩写", converter = ExcelDictConvert.class)
-    @ExcelDictFormat(readConverterExp = "如=拼音首字母")
-    private String brandInitials;
-
-    /**
-     * 品牌英文名称
-     */
-    @ExcelProperty(value = "品牌英文名称")
-    private String brandEnglishName;
-
-    /**
-     * 品牌Logo图片路径或URL
-     */
-    @ExcelProperty(value = "品牌Logo图片路径或URL")
-    private String brandLogo;
-
-    /**
-     * 品牌标题(用于展示)
-     */
-    @ExcelProperty(value = "品牌标题", converter = ExcelDictConvert.class)
-    @ExcelDictFormat(readConverterExp = "用=于展示")
-    private String brandTitle;
-
-    /**
-     * 品牌大图(横幅/封面图)
-     */
-    @ExcelProperty(value = "品牌大图", converter = ExcelDictConvert.class)
-    @ExcelDictFormat(readConverterExp = "横=幅/封面图")
-    private String brandBigImage;
-
-    /**
-     * 品牌大图(横幅/封面图)Url
-     */
-    @Translation(type = TransConstant.OSS_ID_TO_URL, mapper = "brandBigImage")
-    private String brandBigImageUrl;
-    /**
-     * 品牌故事(简介文本)
-     */
-    @ExcelProperty(value = "品牌故事", converter = ExcelDictConvert.class)
-    @ExcelDictFormat(readConverterExp = "简=介文本")
-    private String brandStory;
-
-    /**
-     * 数据来源
+     * 第三方品牌名称
      */
-    @ExcelProperty(value = "数据来源")
-    private String dataSource;
-
-    /**
-     * 备注
-     */
-    @ExcelProperty(value = "备注")
-    private String remark;
-
+    @ExcelProperty(value = "第三方品牌名称")
+    private String thirdPartyBrandName;
 
 }

+ 2 - 2
ruoyi-modules/ruoyi-external/src/main/java/org/dromara/external/domain/vo/ExternalProductCategoryVo.java

@@ -15,10 +15,10 @@ import java.util.Date;
 
 
 /**
- * 第三方产品分类视图对象 external_product_category
+ * 产品分类视图对象 external_product_category
  *
  * @author LionLi
- * @date 2025-12-29
+ * @date 2026-01-08
  */
 @Data
 @ExcelIgnoreUnannotated

+ 90 - 0
ruoyi-modules/ruoyi-external/src/main/java/org/dromara/external/domain/vo/ExternalProductChangeLogVo.java

@@ -0,0 +1,90 @@
+package org.dromara.external.domain.vo;
+
+import org.dromara.external.domain.ExternalProductChangeLog;
+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;
+
+
+
+/**
+ * 商品变更消息记录视图对象 external_product_change_log
+ *
+ * @author LionLi
+ * @date 2026-01-08
+ */
+@Data
+@ExcelIgnoreUnannotated
+@AutoMapper(target = ExternalProductChangeLog.class)
+public class ExternalProductChangeLogVo implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     *
+     */
+    @ExcelProperty(value = "")
+    private Long id;
+
+    /**
+     * 项目id
+     */
+    @ExcelProperty(value = "项目id")
+    private Long itemId;
+
+    /**
+     * 商品id
+     */
+    @ExcelProperty(value = "商品id")
+    private Long productId;
+
+    /**
+     * type=2商品
+价格变更,后
+续会调用价格
+接口。
+type=4代表
+商品上下架变
+更消息,后续
+会调用上下架
+状态接口。
+type=6代表
+添加、删除商
+品池内的商
+品,触发保存
+商品流程,依
+次调用商品详
+情等接口获取
+商品信息。
+type=16商品
+介绍及规格参
+数变更消息,
+调用商品详情
+等接口更新商
+品信息。
+     */
+    private String type;
+
+    /**
+     * 状态(0正常 1停用)
+     */
+    @ExcelProperty(value = "状态", converter = ExcelDictConvert.class)
+    @ExcelDictFormat(readConverterExp = "0=正常,1=停用")
+    private String status;
+
+    /**
+     * 备注
+     */
+    @ExcelProperty(value = "备注")
+    private String remark;
+
+
+}

+ 74 - 0
ruoyi-modules/ruoyi-external/src/main/java/org/dromara/external/domain/vo/ExternalProductVo.java

@@ -0,0 +1,74 @@
+package org.dromara.external.domain.vo;
+
+import org.dromara.external.domain.ExternalProduct;
+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;
+
+
+
+/**
+ * 对外部推送商品视图对象 external_product
+ *
+ * @author LionLi
+ * @date 2026-01-08
+ */
+@Data
+@ExcelIgnoreUnannotated
+@AutoMapper(target = ExternalProduct.class)
+public class ExternalProductVo implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 
+     */
+    @ExcelProperty(value = "")
+    private Long id;
+
+    /**
+     * 商品id
+     */
+    @ExcelProperty(value = "商品id")
+    private Long productId;
+
+    /**
+     * 项目id
+     */
+    @ExcelProperty(value = "项目id")
+    private Long itemId;
+
+    /**
+     * 分类id
+     */
+    @ExcelProperty(value = "分类id")
+    private Long categoryId;
+
+    /**
+     * 外部分类id
+     */
+    @ExcelProperty(value = "外部分类id")
+    private Long externlCategoryId;
+
+    /**
+     * 推送状态 0未推送,1已推送
+     */
+    @ExcelProperty(value = "推送状态 0未推送,1已推送")
+    private Long pushStatus;
+
+    /**
+     * 备注
+     */
+    @ExcelProperty(value = "备注")
+    private String remark;
+
+
+}

+ 10 - 8
ruoyi-modules/ruoyi-external/src/main/java/org/dromara/external/domain/vo/ExternalPushPoolLogVo.java

@@ -18,7 +18,7 @@ import java.util.Date;
  * 商品池推送记录视图对象 external_push_pool_log
  *
  * @author LionLi
- * @date 2025-12-24
+ * @date 2026-01-08
  */
 @Data
 @ExcelIgnoreUnannotated
@@ -29,14 +29,15 @@ public class ExternalPushPoolLogVo implements Serializable {
     private static final long serialVersionUID = 1L;
 
     /**
-     *
+     * 
      */
     @ExcelProperty(value = "")
     private Long id;
 
     /**
      * 项目id
-     * */
+     */
+    @ExcelProperty(value = "项目id")
     private Long itemId;
 
     /**
@@ -57,11 +58,6 @@ public class ExternalPushPoolLogVo implements Serializable {
     @ExcelProperty(value = "推送状态 0成功 1失败")
     private String pushStatus;
 
-    /**
-     * 失败原因
-     * */
-    private String reason;
-
     /**
      * 状态(0正常 1停用)
      */
@@ -69,6 +65,12 @@ public class ExternalPushPoolLogVo implements Serializable {
     @ExcelDictFormat(readConverterExp = "0=正常,1=停用")
     private String status;
 
+    /**
+     * 失败原因
+     */
+    @ExcelProperty(value = "失败原因")
+    private String reason;
+
     /**
      * 备注
      */

+ 1 - 1
ruoyi-modules/ruoyi-external/src/main/java/org/dromara/external/mapper/ExternalItemMapper.java

@@ -8,7 +8,7 @@ import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
  * 第三方对接项目管理Mapper接口
  *
  * @author LionLi
- * @date 2025-12-29
+ * @date 2026-01-08
  */
 public interface ExternalItemMapper extends BaseMapperPlus<ExternalItem, ExternalItemVo> {
 

+ 1 - 1
ruoyi-modules/ruoyi-external/src/main/java/org/dromara/external/mapper/ExternalProductBrandMapper.java

@@ -8,7 +8,7 @@ import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
  * 第三方产品品牌信息Mapper接口
  *
  * @author LionLi
- * @date 2025-12-29
+ * @date 2026-01-08
  */
 public interface ExternalProductBrandMapper extends BaseMapperPlus<ExternalProductBrand, ExternalProductBrandVo> {
 

+ 2 - 2
ruoyi-modules/ruoyi-external/src/main/java/org/dromara/external/mapper/ExternalProductCategoryMapper.java

@@ -5,10 +5,10 @@ import org.dromara.external.domain.vo.ExternalProductCategoryVo;
 import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
 
 /**
- * 第三方产品分类Mapper接口
+ * 产品分类Mapper接口
  *
  * @author LionLi
- * @date 2025-12-29
+ * @date 2026-01-08
  */
 public interface ExternalProductCategoryMapper extends BaseMapperPlus<ExternalProductCategory, ExternalProductCategoryVo> {
 

+ 15 - 0
ruoyi-modules/ruoyi-external/src/main/java/org/dromara/external/mapper/ExternalProductChangeLogMapper.java

@@ -0,0 +1,15 @@
+package org.dromara.external.mapper;
+
+import org.dromara.external.domain.ExternalProductChangeLog;
+import org.dromara.external.domain.vo.ExternalProductChangeLogVo;
+import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
+
+/**
+ * 商品变更消息记录Mapper接口
+ *
+ * @author LionLi
+ * @date 2026-01-08
+ */
+public interface ExternalProductChangeLogMapper extends BaseMapperPlus<ExternalProductChangeLog, ExternalProductChangeLogVo> {
+
+}

+ 15 - 0
ruoyi-modules/ruoyi-external/src/main/java/org/dromara/external/mapper/ExternalProductMapper.java

@@ -0,0 +1,15 @@
+package org.dromara.external.mapper;
+
+import org.dromara.external.domain.ExternalProduct;
+import org.dromara.external.domain.vo.ExternalProductVo;
+import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
+
+/**
+ * 对外部推送商品Mapper接口
+ *
+ * @author LionLi
+ * @date 2026-01-08
+ */
+public interface ExternalProductMapper extends BaseMapperPlus<ExternalProduct, ExternalProductVo> {
+
+}

+ 1 - 1
ruoyi-modules/ruoyi-external/src/main/java/org/dromara/external/mapper/ExternalPushPoolLogMapper.java

@@ -8,7 +8,7 @@ import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
  * 商品池推送记录Mapper接口
  *
  * @author LionLi
- * @date 2025-12-24
+ * @date 2026-01-08
  */
 public interface ExternalPushPoolLogMapper extends BaseMapperPlus<ExternalPushPoolLog, ExternalPushPoolLogVo> {
 

+ 1 - 1
ruoyi-modules/ruoyi-external/src/main/java/org/dromara/external/service/IExternalItemService.java

@@ -14,7 +14,7 @@ import java.util.List;
  * 第三方对接项目管理Service接口
  *
  * @author LionLi
- * @date 2025-12-29
+ * @date 2026-01-08
  */
 public interface IExternalItemService extends IService<ExternalItem>{
 

+ 1 - 1
ruoyi-modules/ruoyi-external/src/main/java/org/dromara/external/service/IExternalProductBrandService.java

@@ -14,7 +14,7 @@ import java.util.List;
  * 第三方产品品牌信息Service接口
  *
  * @author LionLi
- * @date 2025-12-29
+ * @date 2026-01-08
  */
 public interface IExternalProductBrandService extends IService<ExternalProductBrand>{
 

+ 13 - 13
ruoyi-modules/ruoyi-external/src/main/java/org/dromara/external/service/IExternalProductCategoryService.java

@@ -11,56 +11,56 @@ import java.util.Collection;
 import java.util.List;
 
 /**
- * 第三方产品分类Service接口
+ * 产品分类Service接口
  *
  * @author LionLi
- * @date 2025-12-29
+ * @date 2026-01-08
  */
 public interface IExternalProductCategoryService extends IService<ExternalProductCategory>{
 
     /**
-     * 查询第三方产品分类
+     * 查询产品分类
      *
      * @param id 主键
-     * @return 第三方产品分类
+     * @return 产品分类
      */
     ExternalProductCategoryVo queryById(Long id);
 
     /**
-     * 分页查询第三方产品分类列表
+     * 分页查询产品分类列表
      *
      * @param bo        查询条件
      * @param pageQuery 分页参数
-     * @return 第三方产品分类分页列表
+     * @return 产品分类分页列表
      */
     TableDataInfo<ExternalProductCategoryVo> queryPageList(ExternalProductCategoryBo bo, PageQuery pageQuery);
 
     /**
-     * 查询符合条件的第三方产品分类列表
+     * 查询符合条件的产品分类列表
      *
      * @param bo 查询条件
-     * @return 第三方产品分类列表
+     * @return 产品分类列表
      */
     List<ExternalProductCategoryVo> queryList(ExternalProductCategoryBo bo);
 
     /**
-     * 新增第三方产品分类
+     * 新增产品分类
      *
-     * @param bo 第三方产品分类
+     * @param bo 产品分类
      * @return 是否新增成功
      */
     Boolean insertByBo(ExternalProductCategoryBo bo);
 
     /**
-     * 修改第三方产品分类
+     * 修改产品分类
      *
-     * @param bo 第三方产品分类
+     * @param bo 产品分类
      * @return 是否修改成功
      */
     Boolean updateByBo(ExternalProductCategoryBo bo);
 
     /**
-     * 校验并批量删除第三方产品分类信息
+     * 校验并批量删除产品分类信息
      *
      * @param ids     待删除的主键集合
      * @param isValid 是否进行有效性校验

+ 70 - 0
ruoyi-modules/ruoyi-external/src/main/java/org/dromara/external/service/IExternalProductChangeLogService.java

@@ -0,0 +1,70 @@
+package org.dromara.external.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import org.dromara.external.domain.ExternalProductChangeLog;
+import org.dromara.external.domain.vo.ExternalProductChangeLogVo;
+import org.dromara.external.domain.bo.ExternalProductChangeLogBo;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.common.mybatis.core.page.PageQuery;
+
+import java.util.Collection;
+import java.util.List;
+
+/**
+ * 商品变更消息记录Service接口
+ *
+ * @author LionLi
+ * @date 2026-01-08
+ */
+public interface IExternalProductChangeLogService extends IService<ExternalProductChangeLog>{
+
+    /**
+     * 查询商品变更消息记录
+     *
+     * @param id 主键
+     * @return 商品变更消息记录
+     */
+    ExternalProductChangeLogVo queryById(Long id);
+
+    /**
+     * 分页查询商品变更消息记录列表
+     *
+     * @param bo        查询条件
+     * @param pageQuery 分页参数
+     * @return 商品变更消息记录分页列表
+     */
+    TableDataInfo<ExternalProductChangeLogVo> queryPageList(ExternalProductChangeLogBo bo, PageQuery pageQuery);
+
+    /**
+     * 查询符合条件的商品变更消息记录列表
+     *
+     * @param bo 查询条件
+     * @return 商品变更消息记录列表
+     */
+    List<ExternalProductChangeLogVo> queryList(ExternalProductChangeLogBo bo);
+
+    /**
+     * 新增商品变更消息记录
+     *
+     * @param bo 商品变更消息记录
+     * @return 是否新增成功
+     */
+    Boolean insertByBo(ExternalProductChangeLogBo bo);
+
+    /**
+     * 修改商品变更消息记录
+     *
+     * @param bo 商品变更消息记录
+     * @return 是否修改成功
+     */
+    Boolean updateByBo(ExternalProductChangeLogBo bo);
+
+    /**
+     * 校验并批量删除商品变更消息记录信息
+     *
+     * @param ids     待删除的主键集合
+     * @param isValid 是否进行有效性校验
+     * @return 是否删除成功
+     */
+    Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
+}

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

@@ -0,0 +1,70 @@
+package org.dromara.external.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import org.dromara.external.domain.ExternalProduct;
+import org.dromara.external.domain.vo.ExternalProductVo;
+import org.dromara.external.domain.bo.ExternalProductBo;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.common.mybatis.core.page.PageQuery;
+
+import java.util.Collection;
+import java.util.List;
+
+/**
+ * 对外部推送商品Service接口
+ *
+ * @author LionLi
+ * @date 2026-01-08
+ */
+public interface IExternalProductService extends IService<ExternalProduct>{
+
+    /**
+     * 查询对外部推送商品
+     *
+     * @param id 主键
+     * @return 对外部推送商品
+     */
+    ExternalProductVo queryById(Long id);
+
+    /**
+     * 分页查询对外部推送商品列表
+     *
+     * @param bo        查询条件
+     * @param pageQuery 分页参数
+     * @return 对外部推送商品分页列表
+     */
+    TableDataInfo<ExternalProductVo> queryPageList(ExternalProductBo bo, PageQuery pageQuery);
+
+    /**
+     * 查询符合条件的对外部推送商品列表
+     *
+     * @param bo 查询条件
+     * @return 对外部推送商品列表
+     */
+    List<ExternalProductVo> queryList(ExternalProductBo bo);
+
+    /**
+     * 新增对外部推送商品
+     *
+     * @param bo 对外部推送商品
+     * @return 是否新增成功
+     */
+    Boolean insertByBo(ExternalProductBo bo);
+
+    /**
+     * 修改对外部推送商品
+     *
+     * @param bo 对外部推送商品
+     * @return 是否修改成功
+     */
+    Boolean updateByBo(ExternalProductBo bo);
+
+    /**
+     * 校验并批量删除对外部推送商品信息
+     *
+     * @param ids     待删除的主键集合
+     * @param isValid 是否进行有效性校验
+     * @return 是否删除成功
+     */
+    Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
+}

+ 1 - 1
ruoyi-modules/ruoyi-external/src/main/java/org/dromara/external/service/IExternalPushPoolLogService.java

@@ -14,7 +14,7 @@ import java.util.List;
  * 商品池推送记录Service接口
  *
  * @author LionLi
- * @date 2025-12-24
+ * @date 2026-01-08
  */
 public interface IExternalPushPoolLogService extends IService<ExternalPushPoolLog>{
 

+ 1 - 1
ruoyi-modules/ruoyi-external/src/main/java/org/dromara/external/service/impl/ExternalItemServiceImpl.java

@@ -25,7 +25,7 @@ import java.util.Collection;
  * 第三方对接项目管理Service业务层处理
  *
  * @author LionLi
- * @date 2025-12-29
+ * @date 2026-01-08
  */
 @Slf4j
 @RequiredArgsConstructor

+ 25 - 2
ruoyi-modules/ruoyi-external/src/main/java/org/dromara/external/service/impl/ExternalProductBrandServiceImpl.java

@@ -1,6 +1,7 @@
 package org.dromara.external.service.impl;
 
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.apache.dubbo.config.annotation.DubboReference;
 import org.dromara.common.core.utils.MapstructUtils;
 import org.dromara.common.core.utils.StringUtils;
 import org.dromara.common.mybatis.core.page.TableDataInfo;
@@ -10,6 +11,8 @@ 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.product.api.RemoteProductService;
+import org.dromara.product.api.domain.RemoteProductBrand;
 import org.springframework.stereotype.Service;
 import org.dromara.external.domain.bo.ExternalProductBrandBo;
 import org.dromara.external.domain.vo.ExternalProductBrandVo;
@@ -25,7 +28,7 @@ import java.util.Collection;
  * 第三方产品品牌信息Service业务层处理
  *
  * @author LionLi
- * @date 2025-12-29
+ * @date 2026-01-08
  */
 @Slf4j
 @RequiredArgsConstructor
@@ -34,6 +37,9 @@ public class ExternalProductBrandServiceImpl  extends ServiceImpl<ExternalProduc
 
     private final ExternalProductBrandMapper baseMapper;
 
+    @DubboReference
+    private RemoteProductService remoteProductService;
+
     /**
      * 查询第三方产品品牌信息
      *
@@ -42,7 +48,15 @@ public class ExternalProductBrandServiceImpl  extends ServiceImpl<ExternalProduc
      */
     @Override
     public ExternalProductBrandVo queryById(Long id){
-        return baseMapper.selectVoById(id);
+        ExternalProductBrandVo vo = baseMapper.selectVoById(id);
+        vo.setThirdPartyBrandName(vo.getBrandName());
+        RemoteProductBrand productByBrandId = remoteProductService.getProductByBrandId(vo.getProductBrandId());
+        if (productByBrandId != null) {
+            vo.setBrandName(productByBrandId.getBrandName());
+        }else {
+            vo.setBrandName(null);
+        }
+        return vo;
     }
 
     /**
@@ -56,6 +70,15 @@ public class ExternalProductBrandServiceImpl  extends ServiceImpl<ExternalProduc
     public TableDataInfo<ExternalProductBrandVo> queryPageList(ExternalProductBrandBo bo, PageQuery pageQuery) {
         LambdaQueryWrapper<ExternalProductBrand> lqw = buildQueryWrapper(bo);
         Page<ExternalProductBrandVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
+        result.getRecords().forEach(vo -> {
+            vo.setThirdPartyBrandName(vo.getBrandName());
+            RemoteProductBrand productByBrandId = remoteProductService.getProductByBrandId(vo.getProductBrandId());
+            if (productByBrandId != null) {
+                vo.setBrandName(productByBrandId.getBrandName());
+            }else {
+                vo.setBrandName(null);
+            }
+        });
         return TableDataInfo.build(result);
     }
 

+ 13 - 13
ruoyi-modules/ruoyi-external/src/main/java/org/dromara/external/service/impl/ExternalProductCategoryServiceImpl.java

@@ -22,10 +22,10 @@ import java.util.Map;
 import java.util.Collection;
 
 /**
- * 第三方产品分类Service业务层处理
+ * 产品分类Service业务层处理
  *
  * @author LionLi
- * @date 2025-12-29
+ * @date 2026-01-08
  */
 @Slf4j
 @RequiredArgsConstructor
@@ -35,10 +35,10 @@ public class ExternalProductCategoryServiceImpl  extends ServiceImpl<ExternalPro
     private final ExternalProductCategoryMapper baseMapper;
 
     /**
-     * 查询第三方产品分类
+     * 查询产品分类
      *
      * @param id 主键
-     * @return 第三方产品分类
+     * @return 产品分类
      */
     @Override
     public ExternalProductCategoryVo queryById(Long id){
@@ -46,11 +46,11 @@ public class ExternalProductCategoryServiceImpl  extends ServiceImpl<ExternalPro
     }
 
     /**
-     * 分页查询第三方产品分类列表
+     * 分页查询产品分类列表
      *
      * @param bo        查询条件
      * @param pageQuery 分页参数
-     * @return 第三方产品分类分页列表
+     * @return 产品分类分页列表
      */
     @Override
     public TableDataInfo<ExternalProductCategoryVo> queryPageList(ExternalProductCategoryBo bo, PageQuery pageQuery) {
@@ -60,10 +60,10 @@ public class ExternalProductCategoryServiceImpl  extends ServiceImpl<ExternalPro
     }
 
     /**
-     * 查询符合条件的第三方产品分类列表
+     * 查询符合条件的产品分类列表
      *
      * @param bo 查询条件
-     * @return 第三方产品分类列表
+     * @return 产品分类列表
      */
     @Override
     public List<ExternalProductCategoryVo> queryList(ExternalProductCategoryBo bo) {
@@ -91,9 +91,9 @@ public class ExternalProductCategoryServiceImpl  extends ServiceImpl<ExternalPro
     }
 
     /**
-     * 新增第三方产品分类
+     * 新增产品分类
      *
-     * @param bo 第三方产品分类
+     * @param bo 产品分类
      * @return 是否新增成功
      */
     @Override
@@ -108,9 +108,9 @@ public class ExternalProductCategoryServiceImpl  extends ServiceImpl<ExternalPro
     }
 
     /**
-     * 修改第三方产品分类
+     * 修改产品分类
      *
-     * @param bo 第三方产品分类
+     * @param bo 产品分类
      * @return 是否修改成功
      */
     @Override
@@ -128,7 +128,7 @@ public class ExternalProductCategoryServiceImpl  extends ServiceImpl<ExternalPro
     }
 
     /**
-     * 校验并批量删除第三方产品分类信息
+     * 校验并批量删除产品分类信息
      *
      * @param ids     待删除的主键集合
      * @param isValid 是否进行有效性校验

+ 137 - 0
ruoyi-modules/ruoyi-external/src/main/java/org/dromara/external/service/impl/ExternalProductChangeLogServiceImpl.java

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

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

@@ -0,0 +1,138 @@
+package org.dromara.external.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.dromara.common.core.utils.MapstructUtils;
+import org.dromara.common.core.utils.StringUtils;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.common.mybatis.core.page.PageQuery;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+import org.dromara.external.domain.bo.ExternalProductBo;
+import org.dromara.external.domain.vo.ExternalProductVo;
+import org.dromara.external.domain.ExternalProduct;
+import org.dromara.external.mapper.ExternalProductMapper;
+import org.dromara.external.service.IExternalProductService;
+
+import java.util.List;
+import java.util.Map;
+import java.util.Collection;
+
+/**
+ * 对外部推送商品Service业务层处理
+ *
+ * @author LionLi
+ * @date 2026-01-08
+ */
+@Slf4j
+@RequiredArgsConstructor
+@Service
+public class ExternalProductServiceImpl  extends ServiceImpl<ExternalProductMapper, ExternalProduct> implements IExternalProductService {
+
+    private final ExternalProductMapper baseMapper;
+
+    /**
+     * 查询对外部推送商品
+     *
+     * @param id 主键
+     * @return 对外部推送商品
+     */
+    @Override
+    public ExternalProductVo queryById(Long id){
+        return baseMapper.selectVoById(id);
+    }
+
+    /**
+     * 分页查询对外部推送商品列表
+     *
+     * @param bo        查询条件
+     * @param pageQuery 分页参数
+     * @return 对外部推送商品分页列表
+     */
+    @Override
+    public TableDataInfo<ExternalProductVo> queryPageList(ExternalProductBo bo, PageQuery pageQuery) {
+        LambdaQueryWrapper<ExternalProduct> lqw = buildQueryWrapper(bo);
+        Page<ExternalProductVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
+        return TableDataInfo.build(result);
+    }
+
+    /**
+     * 查询符合条件的对外部推送商品列表
+     *
+     * @param bo 查询条件
+     * @return 对外部推送商品列表
+     */
+    @Override
+    public List<ExternalProductVo> queryList(ExternalProductBo bo) {
+        LambdaQueryWrapper<ExternalProduct> lqw = buildQueryWrapper(bo);
+        return baseMapper.selectVoList(lqw);
+    }
+
+    private LambdaQueryWrapper<ExternalProduct> buildQueryWrapper(ExternalProductBo bo) {
+        Map<String, Object> params = bo.getParams();
+        LambdaQueryWrapper<ExternalProduct> lqw = Wrappers.lambdaQuery();
+        lqw.orderByAsc(ExternalProduct::getId);
+        lqw.eq(bo.getProductId() != null, ExternalProduct::getProductId, bo.getProductId());
+        lqw.eq(bo.getItemId() != null, ExternalProduct::getItemId, bo.getItemId());
+        lqw.eq(bo.getCategoryId() != null, ExternalProduct::getCategoryId, bo.getCategoryId());
+        lqw.eq(bo.getExternlCategoryId() != null, ExternalProduct::getExternlCategoryId, bo.getExternlCategoryId());
+        lqw.eq(bo.getPushStatus() != null, ExternalProduct::getPushStatus, bo.getPushStatus());
+        lqw.eq(StringUtils.isNotBlank(bo.getPlatformCode()), ExternalProduct::getPlatformCode, bo.getPlatformCode());
+        return lqw;
+    }
+
+    /**
+     * 新增对外部推送商品
+     *
+     * @param bo 对外部推送商品
+     * @return 是否新增成功
+     */
+    @Override
+    public Boolean insertByBo(ExternalProductBo bo) {
+        ExternalProduct add = MapstructUtils.convert(bo, ExternalProduct.class);
+        validEntityBeforeSave(add);
+        boolean flag = baseMapper.insert(add) > 0;
+        if (flag) {
+            bo.setId(add.getId());
+        }
+        return flag;
+    }
+
+    /**
+     * 修改对外部推送商品
+     *
+     * @param bo 对外部推送商品
+     * @return 是否修改成功
+     */
+    @Override
+    public Boolean updateByBo(ExternalProductBo bo) {
+        ExternalProduct update = MapstructUtils.convert(bo, ExternalProduct.class);
+        validEntityBeforeSave(update);
+        return baseMapper.updateById(update) > 0;
+    }
+
+    /**
+     * 保存前的数据校验
+     */
+    private void validEntityBeforeSave(ExternalProduct entity){
+        //TODO 做一些数据校验,如唯一约束
+    }
+
+    /**
+     * 校验并批量删除对外部推送商品信息
+     *
+     * @param ids     待删除的主键集合
+     * @param isValid 是否进行有效性校验
+     * @return 是否删除成功
+     */
+    @Override
+    public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
+        if(isValid){
+            //TODO 做一些业务上的校验,判断是否需要校验
+        }
+        return baseMapper.deleteByIds(ids) > 0;
+    }
+}

+ 3 - 1
ruoyi-modules/ruoyi-external/src/main/java/org/dromara/external/service/impl/ExternalPushPoolLogServiceImpl.java

@@ -25,7 +25,7 @@ import java.util.Collection;
  * 商品池推送记录Service业务层处理
  *
  * @author LionLi
- * @date 2025-12-24
+ * @date 2026-01-08
  */
 @Slf4j
 @RequiredArgsConstructor
@@ -75,10 +75,12 @@ public class ExternalPushPoolLogServiceImpl  extends ServiceImpl<ExternalPushPoo
         Map<String, Object> params = bo.getParams();
         LambdaQueryWrapper<ExternalPushPoolLog> lqw = Wrappers.lambdaQuery();
         lqw.orderByAsc(ExternalPushPoolLog::getId);
+        lqw.eq(bo.getItemId() != null, ExternalPushPoolLog::getItemId, bo.getItemId());
         lqw.eq(bo.getPoolId() != null, ExternalPushPoolLog::getPoolId, bo.getPoolId());
         lqw.eq(bo.getOperatorId() != null, ExternalPushPoolLog::getOperatorId, bo.getOperatorId());
         lqw.eq(StringUtils.isNotBlank(bo.getPushStatus()), ExternalPushPoolLog::getPushStatus, bo.getPushStatus());
         lqw.eq(StringUtils.isNotBlank(bo.getStatus()), ExternalPushPoolLog::getStatus, bo.getStatus());
+        lqw.eq(StringUtils.isNotBlank(bo.getReason()), ExternalPushPoolLog::getReason, bo.getReason());
         lqw.eq(StringUtils.isNotBlank(bo.getPlatformCode()), ExternalPushPoolLog::getPlatformCode, bo.getPlatformCode());
         return lqw;
     }

+ 7 - 0
ruoyi-modules/ruoyi-external/src/main/resources/mapper/external/ExternalProductChangeLogMapper.xml

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

+ 7 - 0
ruoyi-modules/ruoyi-external/src/main/resources/mapper/external/ExternalProductMapper.xml

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

+ 4 - 0
ruoyi-modules/ruoyi-order/pom.xml

@@ -112,6 +112,10 @@
             <groupId>org.dromara</groupId>
             <artifactId>ruoyi-api-order</artifactId>
         </dependency>
+        <dependency>
+            <groupId>org.dromara</groupId>
+            <artifactId>ruoyi-api-customer</artifactId>
+        </dependency>
 
     </dependencies>
 

+ 119 - 0
ruoyi-modules/ruoyi-order/src/main/java/org/dromara/order/controller/OrderAssignmentController.java

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

+ 18 - 0
ruoyi-modules/ruoyi-order/src/main/java/org/dromara/order/controller/OrderMainController.java

@@ -13,6 +13,7 @@ import org.dromara.common.log.annotation.Log;
 import org.dromara.common.log.enums.BusinessType;
 import org.dromara.common.mybatis.core.page.PageQuery;
 import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.common.tenant.helper.PlatformHelper;
 import org.dromara.common.web.core.BaseController;
 import org.dromara.order.domain.bo.OrderMainBo;
 import org.dromara.order.domain.vo.OrderMainVo;
@@ -46,6 +47,14 @@ public class OrderMainController extends BaseController {
         return orderMainService.queryPageList(bo, pageQuery);
     }
 
+    /**
+     * 查询分配订单列表
+     */
+    @GetMapping("/assignmentList")
+    public TableDataInfo<OrderMainVo> assignmentList(OrderMainBo bo, PageQuery pageQuery) {
+        return PlatformHelper.ignore(() -> orderMainService.queryPageList(bo, pageQuery));
+    }
+
     /**
      * 查询订单状态数量
      */
@@ -119,4 +128,13 @@ public class OrderMainController extends BaseController {
     public R<Void> changeStatus(@RequestBody OrderMainBo bo) {
         return toAjax(orderMainService.updateStatus(bo));
     }
+
+    /**
+     * 订单审核
+     */
+    @Log(title = "订单主信息", businessType = BusinessType.UPDATE)
+    @PutMapping("/checkStatus")
+    public R<Void> checkStatus(@RequestBody OrderMainBo bo) {
+        return toAjax(orderMainService.updateCheckStatus(bo));
+    }
 }

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

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

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

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

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

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

+ 116 - 0
ruoyi-modules/ruoyi-order/src/main/java/org/dromara/order/controller/OrderRevenueHeaderController.java

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

+ 83 - 0
ruoyi-modules/ruoyi-order/src/main/java/org/dromara/order/domain/OrderAssignment.java

@@ -0,0 +1,83 @@
+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_assignment
+ *
+ * @author LionLi
+ * @date 2026-01-07
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@TableName("order_assignment")
+public class OrderAssignment extends TenantEntity {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键ID
+     */
+    @TableId(value = "id")
+    private Long id;
+
+    /**
+     * 订单ID,关联订单表
+     */
+    private Long orderId;
+
+    private String orderNo;
+
+    /**
+     * 分配前平台
+     */
+    private String platformBefore;
+
+    /**
+     * 分配后平台
+     */
+    private String platformAfter;
+
+    /**
+     * 分配人
+     */
+    private Long assignedBy;
+
+    /**
+     * 分配时间
+     */
+    private Date assignTime;
+
+    /**
+     * 分配类型:手动/自动
+     */
+    private String assignType;
+
+    /**
+     * 状态(0正常 1停用)
+     */
+    private String status;
+
+    /**
+     * 删除标志(0代表存在 2代表删除)
+     */
+    @TableLogic
+    private String delFlag;
+
+    /**
+     * 分配原因
+     */
+    private String remark;
+
+
+}

+ 18 - 11
ruoyi-modules/ruoyi-order/src/main/java/org/dromara/order/domain/OrderMain.java

@@ -35,6 +35,11 @@ public class OrderMain extends TenantEntity {
     @TableId(value = "id")
     private Long id;
 
+    /**
+     * 父订单id
+     */
+    private Long parentOrderId;
+
     /**
      * 订单编号
      */
@@ -133,17 +138,17 @@ public class OrderMain extends TenantEntity {
     /**
      * 运费(元)
      */
-    private Long shippingFee;
+    private BigDecimal shippingFee;
 
     /**
      * 订单总金额(元)
      */
-    private Long totalAmount;
+    private BigDecimal totalAmount;
 
     /**
      * 应付金额(元)
      */
-    private Long payableAmount;
+    private BigDecimal payableAmount;
 
     /**
      * 支付状态
@@ -181,14 +186,14 @@ public class OrderMain extends TenantEntity {
     private Date receivingTime;
 
     /**
-     * 已发货数量
+     * 拆单状态:0=未拆, 1=已拆出子单
      */
-    private Long shippedQuantity;
+    private String splitStatus;
 
     /**
-     * 未发货数量
+     * 是否为拆分子单:0=是, 1=否
      */
-    private Long unshippedQuantity;
+    private String isSplitChild;
 
     /**
      * 包裹数量
@@ -235,10 +240,6 @@ public class OrderMain extends TenantEntity {
      */
     private String orderCategory;
 
-    /**
-     * 商品编码
-     */
-    private String productCode;
 
     /**
      * 取消或异常原因
@@ -262,6 +263,12 @@ public class OrderMain extends TenantEntity {
 
     private String dataSource;
 
+    /*审核状态(0 待审核 1已通过 2已驳回)*/
+    private String checkStatus;
+
+    /*分配状态(0待分配 1已分配 )*/
+    private String assignmentStatus;
+
     /**
      * 删除标志(0代表存在 2代表删除)
      */

+ 28 - 0
ruoyi-modules/ruoyi-order/src/main/java/org/dromara/order/domain/OrderProduct.java

@@ -81,6 +81,32 @@ public class OrderProduct extends TenantEntity {
      */
     private BigDecimal platformPrice;
 
+    /**
+     * 税率
+     */
+    private BigDecimal taxRate;
+
+    /**
+     * 市场价格
+     */
+    private BigDecimal marketPrice;
+
+    /**
+     * 会员价格
+     */
+    private BigDecimal memberPrice;
+
+    /**
+     * 采购价格
+     */
+    private BigDecimal purchasingPrice;
+
+    /**
+     * 最高采购价格
+     */
+    private BigDecimal maxPurchasePrice;
+
+
     /**
      * 最小起订量
      */
@@ -159,5 +185,7 @@ public class OrderProduct extends TenantEntity {
      */
     private String remark;
 
+    private String assignmentStatus;
+
 
 }

+ 13 - 0
ruoyi-modules/ruoyi-order/src/main/java/org/dromara/order/domain/OrderProductAssignRule.java

@@ -0,0 +1,13 @@
+package org.dromara.order.domain;
+
+import lombok.Data;
+
+import java.io.Serializable;
+
+@Data
+public class OrderProductAssignRule implements Serializable {
+
+    private Long itemId;          // order_product.id
+
+    private String targetPlatform; // 目标平台
+}

+ 220 - 0
ruoyi-modules/ruoyi-order/src/main/java/org/dromara/order/domain/OrderReturn.java

@@ -0,0 +1,220 @@
+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.math.BigDecimal;
+import java.util.Date;
+import com.fasterxml.jackson.annotation.JsonFormat;
+
+import java.io.Serial;
+
+/**
+ * 退货主对象 order_return
+ *
+ * @author LionLi
+ * @date 2026-01-05
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@TableName("order_return")
+public class OrderReturn extends TenantEntity {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键ID
+     */
+    @TableId(value = "id")
+    private Long id;
+
+    /**
+     * 原订单id
+     */
+    private Long orderId;
+
+    /**
+     * 原订单编号
+     */
+    private String orderNo;
+
+    /**
+     * 售后服务类型(如:退货、换货、仅退款等)
+     */
+    private String serviceType;
+
+    /**
+     * 退货申请时间
+     */
+    private Date returnTime;
+
+    /**
+     * 退货单号
+     */
+    private String returnNo;
+
+    /**
+     * 客户编号
+     */
+    private Long customerId;
+
+    /**
+     * 客户编号
+     */
+    private String customerNo;
+
+    /**
+     * 客户姓名
+     */
+    private String customerName;
+
+    /**
+     * 售后金额
+     */
+    private Long afterSaleAmount;
+
+    /**
+     * 退货订单状态
+     */
+    private String returnStatus;
+
+    /**
+     * 退货商品总数量
+     */
+    private Long returnProductNum;
+
+    /**
+     * 处理完成时间
+     */
+    private Date processingTime;
+
+    /**
+     * 退货原因id
+     */
+    private Long returnReasonId;
+
+    /**
+     * 退货原因
+     */
+    private String returnReason;
+
+    /**
+     * 问题描述
+     */
+    private String problemDescription;
+
+    /**
+     * 凭证图片URL
+     */
+    private String voucherPhoto;
+
+    /**
+     * 运费金额
+     */
+    private BigDecimal shippingFee;
+
+    /**
+     * 是否承担运费
+     */
+    private String isShippingFee;
+
+    /**
+     * 原订单总金额
+     */
+    private BigDecimal orderAmount;
+
+    /**
+     * 实际退款金额
+     */
+    private BigDecimal returnAmount;
+
+    /**
+     * 售后备注
+     */
+    private String afterSalesRemarks;
+
+    /**
+     * 退货方式(如:上门取件、自行寄回)
+     */
+    private String returnMethod;
+
+    /**
+     * 取件人姓名
+     */
+    private String chargebackName;
+
+    /**
+     * 取件联系电话
+     */
+    private String chargebackPhone;
+
+    /**
+     * 预约取件时间
+     */
+    private String chargebackPickupTime;
+
+    /**
+     * 取件省
+     */
+    private String chargebackProvincial;
+
+    /**
+     * 取件市
+     */
+    private String chargebackCity;
+
+    /**
+     * 取件区/县
+     */
+    private String chargebackCounty;
+
+    /**
+     * 取件区/县
+     */
+    private String provincialCityCounty;
+
+    /**
+     * 取件详细地址
+     */
+    private String chargebackAddress;
+
+    /**
+     * 推送状态(如:0-未推送, 1-已推送)
+     */
+    private String pushStatus;
+
+    /**
+     * 物流公司id
+     */
+    private Long logisticsId;
+
+    /**
+     * 物流公司名称
+     */
+    private String logisticsName;
+
+    /**
+     * 物流单号
+     */
+    private String logisticsNo;
+
+    /**
+     * 状态(0正常 1停用)
+     */
+    private String status;
+
+    /**
+     * 删除标志(0代表存在 2代表删除)
+     */
+    @TableLogic
+    private String delFlag;
+
+    /**
+     * 备注
+     */
+    private String remark;
+
+
+}

+ 88 - 0
ruoyi-modules/ruoyi-order/src/main/java/org/dromara/order/domain/OrderReturnItem.java

@@ -0,0 +1,88 @@
+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.math.BigDecimal;
+
+import java.io.Serial;
+
+/**
+ * 退货商品明细对象 order_return_item
+ *
+ * @author LionLi
+ * @date 2026-01-05
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@TableName("order_return_item")
+public class OrderReturnItem extends TenantEntity {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键ID
+     */
+    @TableId(value = "id")
+    private Long id;
+
+    /**
+     * 关联的退货单ID
+     */
+    private Long returnId;
+
+    /**
+     * 原订单明细ID
+     */
+    private Long orderProductId;
+
+    /**
+     * 商品SKU编码
+     */
+    private String productSku;
+
+    /**
+     * 商品名称
+     */
+    private String productName;
+
+    /**
+     * 本次退货数量
+     */
+    private Long returnQuantity;
+
+    /**
+     * 商品单价
+     */
+    private BigDecimal unitPrice;
+
+    /**
+     * 该项退货总金额
+     */
+    private BigDecimal totalAmount;
+
+    /**
+     * 该商品的具体退货原因
+     */
+    private String reasonDetail;
+
+    /**
+     * 状态(0正常 1停用)
+     */
+    private String status;
+
+    /**
+     * 删除标志(0代表存在 2代表删除)
+     */
+    @TableLogic
+    private String delFlag;
+
+    /**
+     * 备注
+     */
+    private String remark;
+
+
+}

+ 103 - 0
ruoyi-modules/ruoyi-order/src/main/java/org/dromara/order/domain/OrderRevenueDetail.java

@@ -0,0 +1,103 @@
+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.math.BigDecimal;
+
+import java.io.Serial;
+
+/**
+ * 收入单明细对象 order_revenue_detail
+ *
+ * @author LionLi
+ * @date 2026-01-04
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@TableName("order_revenue_detail")
+public class OrderRevenueDetail extends TenantEntity {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键ID
+     */
+    @TableId(value = "id")
+    private Long id;
+
+    /**
+     * 关联的收入单id
+     */
+    private Long orderRevenueId;
+
+    /**
+     * 收入类型ID
+     */
+    private Long revenueId;
+
+    /**
+     * 收入明细编号
+     */
+    private String revenueCode;
+
+    /**
+     * 税率编码
+     */
+    private String taxRateCode;
+
+    /**
+     * 总金额
+     */
+    private BigDecimal totalAmount;
+
+    /**
+     * 单价
+     */
+    private BigDecimal unitPrice;
+
+    /**
+     * 数量
+     */
+    private Long quantity;
+
+    /**
+     * 平台分账金额
+     */
+    private Long platformAmount;
+
+    /**
+     * 平台单价
+     */
+    private BigDecimal platformPrice;
+
+    /**
+     * 订单类型
+     */
+    private String orderType;
+
+    /**
+     * 明细附件文件路径
+     */
+    private String revFile;
+
+    /**
+     * 状态(0正常 1停用)
+     */
+    private String status;
+
+    /**
+     * 删除标志(0代表存在 2代表删除)
+     */
+    @TableLogic
+    private String delFlag;
+
+    /**
+     * 备注
+     */
+    private String remark;
+
+
+}

+ 113 - 0
ruoyi-modules/ruoyi-order/src/main/java/org/dromara/order/domain/OrderRevenueHeader.java

@@ -0,0 +1,113 @@
+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.io.Serial;
+
+/**
+ * 收入单主对象 order_revenue_header
+ *
+ * @author LionLi
+ * @date 2026-01-04
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@TableName("order_revenue_header")
+public class OrderRevenueHeader extends TenantEntity {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键ID
+     */
+    @TableId(value = "id")
+    private Long id;
+
+    /**
+     * 收入大类
+     */
+    private String revenueType;
+
+    /**
+     * 收入单号
+     */
+    private String orderRevenueCode;
+
+    /**
+     * 关联的主订单号
+     */
+    private String incomeOrderCode;
+
+    /**
+     * 其他收入子类型
+     */
+    private String otherRevenueType;
+
+    /**
+     * 客户id
+     */
+    private Long customerId;
+
+    private String customerName;
+
+    /*客户编号*/
+    private String customerCode;
+
+    private String supplierName;
+
+    private String companyName;
+
+    private String businessDept;
+
+    private String businessStaff;
+
+    private String customerService;
+
+
+    /**
+     * 供应商id
+     */
+    private Long supplierId;
+
+    /**
+     * 是否含税
+     */
+    private String isPrwTax;
+
+    /**
+     * 币种
+     */
+    private Long currencyId;
+
+    /**
+     * 推送状态
+     */
+    private String pushStatus;
+
+    /**
+     * 附件文件路径或URL
+     */
+    private String orderFile;
+
+    /**
+     * 状态(0正常 1停用)
+     */
+    private String status;
+
+    /**
+     * 删除标志(0代表存在 2代表删除)
+     */
+    @TableLogic
+    private String delFlag;
+
+    /**
+     * 备注
+     */
+    private String remark;
+
+
+}

+ 78 - 0
ruoyi-modules/ruoyi-order/src/main/java/org/dromara/order/domain/bo/OrderAssignmentBo.java

@@ -0,0 +1,78 @@
+package org.dromara.order.domain.bo;
+
+import org.dromara.order.domain.OrderAssignment;
+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_assignment
+ *
+ * @author LionLi
+ * @date 2026-01-07
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@AutoMapper(target = OrderAssignment.class, reverseConvertGenerate = false)
+public class OrderAssignmentBo extends BaseEntity {
+
+    /**
+     * 主键ID
+     */
+    private Long id;
+
+    /**
+     * 订单ID,关联订单表
+     */
+    private Long orderId;
+
+    private String orderNo;
+
+    /**
+     * 分配前平台
+     */
+    private String platformBefore;
+
+    /**
+     * 分配后平台
+     */
+    @NotBlank(message = "分配后平台不能为空", groups = {AddGroup.class, EditGroup.class})
+    private String platformAfter;
+
+    /**
+     * 分配人
+     */
+    private Long assignedBy;
+
+    /**
+     * 分配时间
+     */
+    private Date assignTime;
+
+    /**
+     * 分配类型:手动/自动
+     */
+    private String assignType;
+
+    /**
+     * 状态(0正常 1停用)
+     */
+    private String status;
+
+    private String orderIds;
+
+    /**
+     * 分配原因
+     */
+    private String remark;
+
+
+}

+ 23 - 7
ruoyi-modules/ruoyi-order/src/main/java/org/dromara/order/domain/bo/OrderMainBo.java

@@ -31,6 +31,11 @@ public class OrderMainBo extends BaseEntity {
      */
     private Long id;
 
+    /**
+     * 父订单id
+     */
+    private Long parentOrderId;
+
     /**
      * 订单编号
      */
@@ -134,17 +139,17 @@ public class OrderMainBo extends BaseEntity {
      * 运费(元)
      */
     @NotNull(message = "运费(元)不能为空", groups = {AddGroup.class, EditGroup.class})
-    private Long shippingFee;
+    private BigDecimal shippingFee;
 
     /**
      * 订单总金额(元)
      */
-    private Long totalAmount;
+    private BigDecimal totalAmount;
 
     /**
      * 应付金额(元)
      */
-    private Long payableAmount;
+    private BigDecimal payableAmount;
 
     /**
      * 支付状态
@@ -182,14 +187,14 @@ public class OrderMainBo extends BaseEntity {
     private Date receivingTime;
 
     /**
-     * 已发货数量
+     * 拆单状态:0=未拆, 1=已拆出子单
      */
-    private Long shippedQuantity;
+    private String splitStatus;
 
     /**
-     * 未发货数量
+     * 是否为拆分子单:0=是, 1=否
      */
-    private Long unshippedQuantity;
+    private String isSplitChild;
 
     /**
      * 包裹数量
@@ -269,6 +274,17 @@ public class OrderMainBo extends BaseEntity {
      */
     private String remark;
 
+    /*审核状态(0 待审核 1已通过 2已驳回)*/
+    private String checkStatus;
+
+    /*分配状态(0待分配 1已分配 )*/
+    private String assignmentStatus;
+
+    /**
+     * 订单状态
+     */
+    private String orderStatuses;
+
     List<OrderProductBo> orderProductBos;
 
 

+ 27 - 0
ruoyi-modules/ruoyi-order/src/main/java/org/dromara/order/domain/bo/OrderProductBo.java

@@ -80,6 +80,31 @@ public class OrderProductBo extends BaseEntity {
      */
     private BigDecimal platformPrice;
 
+    /**
+     * 税率
+     */
+    private BigDecimal taxRate;
+
+    /**
+     * 市场价格
+     */
+    private BigDecimal marketPrice;
+
+    /**
+     * 会员价格
+     */
+    private BigDecimal memberPrice;
+
+    /**
+     * 采购价格
+     */
+    private BigDecimal purchasingPrice;
+
+    /**
+     * 最高采购价格
+     */
+    private BigDecimal maxPurchasePrice;
+
     /**
      * 最小起订量
      */
@@ -147,6 +172,8 @@ public class OrderProductBo extends BaseEntity {
 
     private String dataSource;
 
+    private String assignmentStatus;
+
     /**
      * 备注
      */

+ 217 - 0
ruoyi-modules/ruoyi-order/src/main/java/org/dromara/order/domain/bo/OrderReturnBo.java

@@ -0,0 +1,217 @@
+package org.dromara.order.domain.bo;
+
+import org.dromara.order.domain.OrderReturn;
+import org.dromara.common.mybatis.core.domain.BaseEntity;
+import org.dromara.common.core.validate.AddGroup;
+import org.dromara.common.core.validate.EditGroup;
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import jakarta.validation.constraints.*;
+
+import java.math.BigDecimal;
+import java.util.Date;
+import java.util.List;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+
+/**
+ * 退货主业务对象 order_return
+ *
+ * @author LionLi
+ * @date 2026-01-05
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@AutoMapper(target = OrderReturn.class, reverseConvertGenerate = false)
+public class OrderReturnBo extends BaseEntity {
+
+    /**
+     * 主键ID
+     */
+    private Long id;
+
+    /**
+     * 原订单id
+     */
+    private Long orderId;
+
+    /**
+     * 原订单编号
+     */
+    private String orderNo;
+
+    /**
+     * 售后服务类型(如:退货、换货、仅退款等)
+     */
+    private String serviceType;
+
+    /**
+     * 退货申请时间
+     */
+    private Date returnTime;
+
+    /**
+     * 退货单号
+     */
+    private String returnNo;
+
+    /**
+     * 客户编号
+     */
+    private Long customerId;
+
+    /**
+     * 客户编号
+     */
+    private String customerNo;
+
+    /**
+     * 客户姓名
+     */
+    private String customerName;
+
+    /**
+     * 售后金额
+     */
+    private Long afterSaleAmount;
+
+    /**
+     * 退货订单状态
+     */
+    private String returnStatus;
+
+    /**
+     * 退货商品总数量
+     */
+    private Long returnProductNum;
+
+    /**
+     * 处理完成时间
+     */
+    private Date processingTime;
+
+    /**
+     * 退货原因id
+     */
+    private Long returnReasonId;
+
+    /**
+     * 退货原因
+     */
+    private String returnReason;
+
+    /**
+     * 问题描述
+     */
+    private String problemDescription;
+
+    /**
+     * 凭证图片URL
+     */
+    private String voucherPhoto;
+
+    /**
+     * 运费金额
+     */
+    private BigDecimal shippingFee;
+
+    /**
+     * 是否承担运费
+     */
+    private String isShippingFee;
+
+    /**
+     * 原订单总金额
+     */
+    private BigDecimal orderAmount;
+
+    /**
+     * 实际退款金额
+     */
+    private BigDecimal returnAmount;
+
+    /**
+     * 售后备注
+     */
+    private String afterSalesRemarks;
+
+    /**
+     * 退货方式(如:上门取件、自行寄回)
+     */
+    private String returnMethod;
+
+    /**
+     * 取件人姓名
+     */
+    private String chargebackName;
+
+    /**
+     * 取件联系电话
+     */
+    private String chargebackPhone;
+
+    /**
+     * 预约取件时间
+     */
+    private String chargebackPickupTime;
+
+    /**
+     * 取件省
+     */
+    private String chargebackProvincial;
+
+    /**
+     * 取件市
+     */
+    private String chargebackCity;
+
+    /**
+     * 取件区/县
+     */
+    private String chargebackCounty;
+
+    /**
+     * 取件区/县
+     */
+    private String provincialCityCounty;
+
+    /**
+     * 取件详细地址
+     */
+    private String chargebackAddress;
+
+    /**
+     * 推送状态(如:0-未推送, 1-已推送)
+     */
+    private String pushStatus;
+
+    /**
+     * 物流公司id
+     */
+    private Long logisticsId;
+
+    /**
+     * 物流公司名称
+     */
+    private String logisticsName;
+
+    /**
+     * 物流单号
+     */
+    private String logisticsNo;
+
+    /**
+     * 状态(0正常 1停用)
+     */
+    private String status;
+
+    /**
+     * 备注
+     */
+    private String remark;
+
+    private List<OrderReturnItemBo> orderReturnItemList;
+
+
+}

+ 80 - 0
ruoyi-modules/ruoyi-order/src/main/java/org/dromara/order/domain/bo/OrderReturnItemBo.java

@@ -0,0 +1,80 @@
+package org.dromara.order.domain.bo;
+
+import org.dromara.order.domain.OrderReturnItem;
+import org.dromara.common.mybatis.core.domain.BaseEntity;
+import org.dromara.common.core.validate.AddGroup;
+import org.dromara.common.core.validate.EditGroup;
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import jakarta.validation.constraints.*;
+import java.math.BigDecimal;
+
+/**
+ * 退货商品明细业务对象 order_return_item
+ *
+ * @author LionLi
+ * @date 2026-01-05
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@AutoMapper(target = OrderReturnItem.class, reverseConvertGenerate = false)
+public class OrderReturnItemBo extends BaseEntity {
+
+    /**
+     * 主键ID
+     */
+    private Long id;
+
+    /**
+     * 关联的退货单ID
+     */
+    private Long returnId;
+
+    /**
+     * 原订单明细ID
+     */
+    private Long orderProductId;
+
+    /**
+     * 商品SKU编码
+     */
+    private String productSku;
+
+    /**
+     * 商品名称
+     */
+    private String productName;
+
+    /**
+     * 本次退货数量
+     */
+    private Long returnQuantity;
+
+    /**
+     * 商品单价
+     */
+    private BigDecimal unitPrice;
+
+    /**
+     * 该项退货总金额
+     */
+    private BigDecimal totalAmount;
+
+    /**
+     * 该商品的具体退货原因
+     */
+    private String reasonDetail;
+
+    /**
+     * 状态(0正常 1停用)
+     */
+    private String status;
+
+    /**
+     * 备注
+     */
+    private String remark;
+
+
+}

Alguns arquivos não foram mostrados porque muitos arquivos mudaram nesse diff