Procházet zdrojové kódy

Merge branch 'master' into zl

林小张 před 3 měsíci
rodič
revize
c61df34a39
84 změnil soubory, kde provedl 2760 přidání a 361 odebrání
  1. 2 1
      ruoyi-api/pom.xml
  2. 0 12
      ruoyi-api/ruoyi-api-auth/src/main/java/org/dromara/auth/api/RemoteAuthService.java
  3. 0 57
      ruoyi-api/ruoyi-api-auth/src/main/java/org/dromara/auth/api/domain/RemoteLoginVo.java
  4. 10 5
      ruoyi-api/ruoyi-api-bom/pom.xml
  5. 29 0
      ruoyi-api/ruoyi-api-external/pom.xml
  6. 1 1
      ruoyi-api/ruoyi-api-external/src/main/java/org/dromara/external/api/zhongzhi/domain/Attribute.java
  7. 1 1
      ruoyi-api/ruoyi-api-external/src/main/java/org/dromara/external/api/zhongzhi/domain/AttributeValue.java
  8. 1 2
      ruoyi-api/ruoyi-api-external/src/main/java/org/dromara/external/api/zhongzhi/domain/Result.java
  9. 1 1
      ruoyi-api/ruoyi-api-external/src/main/java/org/dromara/external/api/zhongzhi/domain/bo/DelMessagePoolBo.java
  10. 1 1
      ruoyi-api/ruoyi-api-external/src/main/java/org/dromara/external/api/zhongzhi/domain/bo/GetMessagePoolBo.java
  11. 1 1
      ruoyi-api/ruoyi-api-external/src/main/java/org/dromara/external/api/zhongzhi/domain/bo/GetProductDetailBo.java
  12. 1 1
      ruoyi-api/ruoyi-api-external/src/main/java/org/dromara/external/api/zhongzhi/domain/bo/OrderNoticeBo.java
  13. 4 1
      ruoyi-api/ruoyi-api-external/src/main/java/org/dromara/external/api/zhongzhi/domain/bo/OrderPushBo.java
  14. 23 0
      ruoyi-api/ruoyi-api-external/src/main/java/org/dromara/external/api/zhongzhi/domain/bo/ProductNoticeBo.java
  15. 1 1
      ruoyi-api/ruoyi-api-external/src/main/java/org/dromara/external/api/zhongzhi/domain/bo/ZZTokenBo.java
  16. 3 3
      ruoyi-api/ruoyi-api-external/src/main/java/org/dromara/external/api/zhongzhi/domain/vo/ExternalProductVo.java
  17. 5 2
      ruoyi-api/ruoyi-api-external/src/main/java/org/dromara/external/api/zhongzhi/domain/vo/OrderPushVo.java
  18. 1 1
      ruoyi-api/ruoyi-api-external/src/main/java/org/dromara/external/api/zhongzhi/domain/vo/ProductImageVo.java
  19. 1 1
      ruoyi-api/ruoyi-api-external/src/main/java/org/dromara/external/api/zhongzhi/domain/vo/ProductMessageInfo.java
  20. 1 1
      ruoyi-api/ruoyi-api-external/src/main/java/org/dromara/external/api/zhongzhi/domain/vo/ProductPriceVo.java
  21. 1 1
      ruoyi-api/ruoyi-api-external/src/main/java/org/dromara/external/api/zhongzhi/domain/vo/ProductPromiseVo.java
  22. 1 1
      ruoyi-api/ruoyi-api-external/src/main/java/org/dromara/external/api/zhongzhi/domain/vo/ProductShelfStateVo.java
  23. 2 2
      ruoyi-api/ruoyi-api-order/pom.xml
  24. 25 0
      ruoyi-api/ruoyi-api-order/src/main/java/org/dromara/product/api/RemoteExternalOrderService.java
  25. 42 0
      ruoyi-api/ruoyi-api-order/src/main/java/org/dromara/product/api/domain/dto/OrderNoticeDto.java
  26. 75 0
      ruoyi-api/ruoyi-api-order/src/main/java/org/dromara/product/api/domain/dto/OrderPushDto.java
  27. 2 2
      ruoyi-api/ruoyi-api-product/src/main/java/org/dromara/product/api/RemoteProductService.java
  28. 3 3
      ruoyi-api/ruoyi-api-product/src/main/java/org/dromara/product/api/domain/ProductChangeLogApiVo.java
  29. 1 1
      ruoyi-auth/pom.xml
  30. 72 0
      ruoyi-auth/src/main/java/org/dromara/auth/controller/Auth2Controller.java
  31. 0 21
      ruoyi-auth/src/main/java/org/dromara/auth/dubbo/RemoteAuthServiceImpl.java
  32. 1 1
      ruoyi-auth/src/main/resources/application.yml
  33. 11 25
      ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/enums/OrderStatus.java
  34. 17 0
      ruoyi-common/ruoyi-common-redis/src/main/java/org/dromara/common/redis/utils/SequenceUtils.java
  35. 7 4
      ruoyi-modules/ruoyi-external/pom.xml
  36. 26 20
      ruoyi-modules/ruoyi-external/src/main/java/org/dromara/external/controller/zhongzhi/ZhongZhiPullController.java
  37. 103 44
      ruoyi-modules/ruoyi-external/src/main/java/org/dromara/external/controller/zhongzhi/ZhongZhiPushController.java
  38. 4 0
      ruoyi-modules/ruoyi-order/pom.xml
  39. 106 0
      ruoyi-modules/ruoyi-order/src/main/java/org/dromara/order/controller/OrderDeliverController.java
  40. 106 0
      ruoyi-modules/ruoyi-order/src/main/java/org/dromara/order/controller/OrderDeliverProductController.java
  41. 9 0
      ruoyi-modules/ruoyi-order/src/main/java/org/dromara/order/controller/OrderMainController.java
  42. 116 0
      ruoyi-modules/ruoyi-order/src/main/java/org/dromara/order/domain/OrderDeliver.java
  43. 79 0
      ruoyi-modules/ruoyi-order/src/main/java/org/dromara/order/domain/OrderDeliverProduct.java
  44. 7 5
      ruoyi-modules/ruoyi-order/src/main/java/org/dromara/order/domain/OrderMain.java
  45. 6 0
      ruoyi-modules/ruoyi-order/src/main/java/org/dromara/order/domain/OrderProduct.java
  46. 110 0
      ruoyi-modules/ruoyi-order/src/main/java/org/dromara/order/domain/bo/OrderDeliverBo.java
  47. 71 0
      ruoyi-modules/ruoyi-order/src/main/java/org/dromara/order/domain/bo/OrderDeliverProductBo.java
  48. 7 5
      ruoyi-modules/ruoyi-order/src/main/java/org/dromara/order/domain/bo/OrderMainBo.java
  49. 7 1
      ruoyi-modules/ruoyi-order/src/main/java/org/dromara/order/domain/bo/OrderProductBo.java
  50. 86 0
      ruoyi-modules/ruoyi-order/src/main/java/org/dromara/order/domain/vo/OrderDeliverProductVo.java
  51. 131 0
      ruoyi-modules/ruoyi-order/src/main/java/org/dromara/order/domain/vo/OrderDeliverVo.java
  52. 9 6
      ruoyi-modules/ruoyi-order/src/main/java/org/dromara/order/domain/vo/OrderMainVo.java
  53. 5 1
      ruoyi-modules/ruoyi-order/src/main/java/org/dromara/order/domain/vo/OrderProductVo.java
  54. 13 0
      ruoyi-modules/ruoyi-order/src/main/java/org/dromara/order/domain/vo/OrderQuantitySummary.java
  55. 40 0
      ruoyi-modules/ruoyi-order/src/main/java/org/dromara/order/domain/vo/OrderStatusStats.java
  56. 60 0
      ruoyi-modules/ruoyi-order/src/main/java/org/dromara/order/dubbo/RemoteExternalOrderServiceImpl.java
  57. 15 0
      ruoyi-modules/ruoyi-order/src/main/java/org/dromara/order/mapper/OrderDeliverMapper.java
  58. 22 0
      ruoyi-modules/ruoyi-order/src/main/java/org/dromara/order/mapper/OrderDeliverProductMapper.java
  59. 3 0
      ruoyi-modules/ruoyi-order/src/main/java/org/dromara/order/mapper/OrderMainMapper.java
  60. 7 0
      ruoyi-modules/ruoyi-order/src/main/java/org/dromara/order/mapper/OrderProductMapper.java
  61. 70 0
      ruoyi-modules/ruoyi-order/src/main/java/org/dromara/order/service/IOrderDeliverProductService.java
  62. 70 0
      ruoyi-modules/ruoyi-order/src/main/java/org/dromara/order/service/IOrderDeliverService.java
  63. 3 0
      ruoyi-modules/ruoyi-order/src/main/java/org/dromara/order/service/IOrderMainService.java
  64. 139 0
      ruoyi-modules/ruoyi-order/src/main/java/org/dromara/order/service/impl/OrderDeliverProductServiceImpl.java
  65. 266 0
      ruoyi-modules/ruoyi-order/src/main/java/org/dromara/order/service/impl/OrderDeliverServiceImpl.java
  66. 68 41
      ruoyi-modules/ruoyi-order/src/main/java/org/dromara/order/service/impl/OrderMainServiceImpl.java
  67. 1 1
      ruoyi-modules/ruoyi-order/src/main/resources/mapper/order/OrderDeliverMapper.xml
  68. 20 0
      ruoyi-modules/ruoyi-order/src/main/resources/mapper/order/OrderDeliverProductMapper.xml
  69. 17 0
      ruoyi-modules/ruoyi-order/src/main/resources/mapper/order/OrderMainMapper.xml
  70. 53 0
      ruoyi-modules/ruoyi-order/src/main/resources/mapper/order/OrderProductMapper.xml
  71. 106 0
      ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/controller/ProductChangeLogController.java
  72. 84 0
      ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/domain/ProductChangeLog.java
  73. 55 0
      ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/domain/bo/ProductChangeLogBo.java
  74. 65 0
      ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/domain/vo/ProductChangeLogVo.java
  75. 11 7
      ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/dubbo/RemoteProductServiceImpl.java
  76. 15 0
      ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/mapper/ProductChangeLogMapper.java
  77. 70 0
      ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/service/IProductChangeLogService.java
  78. 137 0
      ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/service/impl/ProductChangeLogServiceImpl.java
  79. 1 1
      ruoyi-modules/ruoyi-product/src/main/resources/application.yml
  80. 1 1
      ruoyi-modules/ruoyi-product/src/main/resources/mapper/product/ProductChangeLogMapper.xml
  81. 3 23
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysDept.java
  82. 3 24
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysDeptBo.java
  83. 3 23
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysDeptVo.java
  84. 4 4
      script/docker/docker-compose.yml

+ 2 - 1
ruoyi-api/pom.xml

@@ -14,7 +14,8 @@
         <module>ruoyi-api-resource</module>
         <module>ruoyi-api-workflow</module>
         <module>ruoyi-api-product</module>
-	    <module>ruoyi-api-auth</module>
+        <module>ruoyi-api-external</module>
+	    <module>ruoyi-api-order</module>
     </modules>
 
     <artifactId>ruoyi-api</artifactId>

+ 0 - 12
ruoyi-api/ruoyi-api-auth/src/main/java/org/dromara/auth/api/RemoteAuthService.java

@@ -1,12 +0,0 @@
-package org.dromara.auth.api;
-
-import org.dromara.auth.api.domain.RemoteLoginVo;
-
-/**
- * @author
- * @date 2025/12/24 下午2:31
- */
-public interface RemoteAuthService {
-
-    RemoteLoginVo getAccessToken(String username, String password);
-}

+ 0 - 57
ruoyi-api/ruoyi-api-auth/src/main/java/org/dromara/auth/api/domain/RemoteLoginVo.java

@@ -1,57 +0,0 @@
-package org.dromara.auth.api.domain;
-
-import lombok.Data;
-
-import java.io.Serializable;
-
-/**
- * 登录验证信息
- *
- * @author Michelle.Chung
- */
-@Data
-public class RemoteLoginVo implements Serializable {
-
-    private final static long serialVersionUID = 1L;
-
-    /**
-     * 授权令牌
-     */
-    private String accessToken;
-
-    /**
-     * 刷新令牌
-     */
-    private String refreshToken;
-
-    /**
-     * 授权令牌 access_token 的有效期
-     */
-    private Long expireIn;
-
-    /**
-     * 刷新令牌 refresh_token 的有效期
-     */
-
-    private Long refreshExpireIn;
-
-    /**
-     * 应用id
-     */
-    private String clientId;
-
-    /**
-     * 令牌权限
-     */
-    private String scope;
-
-    /**
-     * 用户 openid
-     */
-    private String openid;
-
-    private Integer code;
-
-    private String msg;
-
-}

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

@@ -21,11 +21,6 @@
     <dependencyManagement>
         <dependencies>
 
-            <dependency>
-                <groupId>org.dromara</groupId>
-                <artifactId>ruoyi-api-auth</artifactId>
-                <version>${revision}</version>
-            </dependency>
             <!-- 系统接口 -->
             <dependency>
                 <groupId>org.dromara</groupId>
@@ -52,6 +47,16 @@
                 <artifactId>ruoyi-api-product</artifactId>
                 <version>${revision}</version>
             </dependency>
+            <dependency>
+                <groupId>org.dromara</groupId>
+                <artifactId>ruoyi-api-external</artifactId>
+                <version>${revision}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.dromara</groupId>
+                <artifactId>ruoyi-api-order</artifactId>
+                <version>${revision}</version>
+            </dependency>
 
         </dependencies>
     </dependencyManagement>

+ 29 - 0
ruoyi-api/ruoyi-api-external/pom.xml

@@ -0,0 +1,29 @@
+<?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 http://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-external</artifactId>
+
+    <description>
+        ruoyi-api-external api接口模块,提供外部访问接口
+    </description>
+
+    <dependencies>
+
+        <!-- RuoYi Common Core-->
+        <dependency>
+            <groupId>org.dromara</groupId>
+            <artifactId>ruoyi-common-core</artifactId>
+        </dependency>
+
+
+    </dependencies>
+
+</project>

+ 1 - 1
ruoyi-modules/ruoyi-external/src/main/java/org/dromara/external/controller/zhongzhi/domain/Attribute.java → ruoyi-api/ruoyi-api-external/src/main/java/org/dromara/external/api/zhongzhi/domain/Attribute.java

@@ -1,4 +1,4 @@
-package org.dromara.external.controller.zhongzhi.domain;
+package org.dromara.external.api.zhongzhi.domain;
 
 import lombok.Data;
 

+ 1 - 1
ruoyi-modules/ruoyi-external/src/main/java/org/dromara/external/controller/zhongzhi/domain/AttributeValue.java → ruoyi-api/ruoyi-api-external/src/main/java/org/dromara/external/api/zhongzhi/domain/AttributeValue.java

@@ -1,4 +1,4 @@
-package org.dromara.external.controller.zhongzhi.domain;
+package org.dromara.external.api.zhongzhi.domain;
 
 import lombok.Data;
 

+ 1 - 2
ruoyi-modules/ruoyi-external/src/main/java/org/dromara/external/controller/zhongzhi/domain/Result.java → ruoyi-api/ruoyi-api-external/src/main/java/org/dromara/external/api/zhongzhi/domain/Result.java

@@ -1,8 +1,7 @@
-package org.dromara.external.controller.zhongzhi.domain;
+package org.dromara.external.api.zhongzhi.domain;
 
 import lombok.Data;
 import lombok.NoArgsConstructor;
-import org.apache.dubbo.common.logger.FluentLogger;
 
 import java.io.Serial;
 import java.io.Serializable;

+ 1 - 1
ruoyi-modules/ruoyi-external/src/main/java/org/dromara/external/controller/zhongzhi/domain/bo/DelMessagePoolBo.java → ruoyi-api/ruoyi-api-external/src/main/java/org/dromara/external/api/zhongzhi/domain/bo/DelMessagePoolBo.java

@@ -1,4 +1,4 @@
-package org.dromara.external.controller.zhongzhi.domain.bo;
+package org.dromara.external.api.zhongzhi.domain.bo;
 
 import lombok.Data;
 

+ 1 - 1
ruoyi-modules/ruoyi-external/src/main/java/org/dromara/external/controller/zhongzhi/domain/bo/GetMessagePoolBo.java → ruoyi-api/ruoyi-api-external/src/main/java/org/dromara/external/api/zhongzhi/domain/bo/GetMessagePoolBo.java

@@ -1,4 +1,4 @@
-package org.dromara.external.controller.zhongzhi.domain.bo;
+package org.dromara.external.api.zhongzhi.domain.bo;
 
 import lombok.Data;
 

+ 1 - 1
ruoyi-modules/ruoyi-external/src/main/java/org/dromara/external/controller/zhongzhi/domain/bo/GetProductDetailBo.java → ruoyi-api/ruoyi-api-external/src/main/java/org/dromara/external/api/zhongzhi/domain/bo/GetProductDetailBo.java

@@ -1,4 +1,4 @@
-package org.dromara.external.controller.zhongzhi.domain.bo;
+package org.dromara.external.api.zhongzhi.domain.bo;
 
 import lombok.Data;
 

+ 1 - 1
ruoyi-modules/ruoyi-external/src/main/java/org/dromara/external/controller/zhongzhi/domain/bo/OrderNoticeBo.java → ruoyi-api/ruoyi-api-external/src/main/java/org/dromara/external/api/zhongzhi/domain/bo/OrderNoticeBo.java

@@ -1,4 +1,4 @@
-package org.dromara.external.controller.zhongzhi.domain.bo;
+package org.dromara.external.api.zhongzhi.domain.bo;
 
 import lombok.Data;
 

+ 4 - 1
ruoyi-modules/ruoyi-external/src/main/java/org/dromara/external/controller/zhongzhi/domain/bo/OrderPushBo.java → ruoyi-api/ruoyi-api-external/src/main/java/org/dromara/external/api/zhongzhi/domain/bo/OrderPushBo.java

@@ -1,4 +1,4 @@
-package org.dromara.external.controller.zhongzhi.domain.bo;
+package org.dromara.external.api.zhongzhi.domain.bo;
 
 import lombok.Data;
 
@@ -7,6 +7,9 @@ import java.util.List;
 @Data
 public class OrderPushBo extends ZZTokenBo{
 
+    // 1. 订单类型 Y
+    private String order_id;
+
     // 3. 订单单号 Y
     private String yggc_order;
 

+ 23 - 0
ruoyi-api/ruoyi-api-external/src/main/java/org/dromara/external/api/zhongzhi/domain/bo/ProductNoticeBo.java

@@ -0,0 +1,23 @@
+package org.dromara.external.api.zhongzhi.domain.bo;
+
+import lombok.Data;
+
+/**
+ * @author
+ * @date 2025/12/30 下午5:27
+ */
+@Data
+public class ProductNoticeBo extends ZZTokenBo{
+    /**
+    * 商品编号
+    * */
+    private String sku;
+    /**
+    * 状态 商品状态变更情况 1:上架,0:下架
+    * */
+    private String status;
+    /**
+    * 状态变更信息
+    * */
+    private String message;
+}

+ 1 - 1
ruoyi-modules/ruoyi-external/src/main/java/org/dromara/external/controller/zhongzhi/domain/bo/ZZTokenBo.java → ruoyi-api/ruoyi-api-external/src/main/java/org/dromara/external/api/zhongzhi/domain/bo/ZZTokenBo.java

@@ -1,4 +1,4 @@
-package org.dromara.external.controller.zhongzhi.domain.bo;
+package org.dromara.external.api.zhongzhi.domain.bo;
 
 import lombok.Data;
 

+ 3 - 3
ruoyi-modules/ruoyi-external/src/main/java/org/dromara/external/controller/zhongzhi/domain/vo/ExternalProductVo.java → ruoyi-api/ruoyi-api-external/src/main/java/org/dromara/external/api/zhongzhi/domain/vo/ExternalProductVo.java

@@ -1,9 +1,9 @@
-package org.dromara.external.controller.zhongzhi.domain.vo;
+package org.dromara.external.api.zhongzhi.domain.vo;
 
 import lombok.Builder;
 import lombok.Data;
-import org.dromara.external.controller.zhongzhi.domain.Attribute;
-import org.dromara.external.controller.zhongzhi.domain.AttributeValue;
+import org.dromara.external.api.zhongzhi.domain.Attribute;
+import org.dromara.external.api.zhongzhi.domain.AttributeValue;
 
 import java.util.List;
 

+ 5 - 2
ruoyi-modules/ruoyi-external/src/main/java/org/dromara/external/controller/zhongzhi/domain/vo/OrderPushVo.java → ruoyi-api/ruoyi-api-external/src/main/java/org/dromara/external/api/zhongzhi/domain/vo/OrderPushVo.java

@@ -1,7 +1,8 @@
-package org.dromara.external.controller.zhongzhi.domain.vo;
+package org.dromara.external.api.zhongzhi.domain.vo;
 
 import lombok.Data;
 
+import java.io.Serializable;
 import java.util.List;
 
 /**
@@ -9,7 +10,9 @@ import java.util.List;
  * @date 2025/12/24 下午6:02
  */
 @Data
-public class OrderPushVo {
+public class OrderPushVo implements Serializable {
+
+    private static final long serialVersionUID = 1L;
     /**
     * 订单编号
     * */

+ 1 - 1
ruoyi-modules/ruoyi-external/src/main/java/org/dromara/external/controller/zhongzhi/domain/vo/ProductImageVo.java → ruoyi-api/ruoyi-api-external/src/main/java/org/dromara/external/api/zhongzhi/domain/vo/ProductImageVo.java

@@ -1,4 +1,4 @@
-package org.dromara.external.controller.zhongzhi.domain.vo;
+package org.dromara.external.api.zhongzhi.domain.vo;
 
 import lombok.Data;
 

+ 1 - 1
ruoyi-modules/ruoyi-external/src/main/java/org/dromara/external/controller/zhongzhi/domain/vo/ProductMessageInfo.java → ruoyi-api/ruoyi-api-external/src/main/java/org/dromara/external/api/zhongzhi/domain/vo/ProductMessageInfo.java

@@ -1,4 +1,4 @@
-package org.dromara.external.controller.zhongzhi.domain.vo;
+package org.dromara.external.api.zhongzhi.domain.vo;
 
 
 import lombok.Data;

+ 1 - 1
ruoyi-modules/ruoyi-external/src/main/java/org/dromara/external/controller/zhongzhi/domain/vo/ProductPriceVo.java → ruoyi-api/ruoyi-api-external/src/main/java/org/dromara/external/api/zhongzhi/domain/vo/ProductPriceVo.java

@@ -1,4 +1,4 @@
-package org.dromara.external.controller.zhongzhi.domain.vo;
+package org.dromara.external.api.zhongzhi.domain.vo;
 
 import lombok.Data;
 

+ 1 - 1
ruoyi-modules/ruoyi-external/src/main/java/org/dromara/external/controller/zhongzhi/domain/vo/ProductPromiseVo.java → ruoyi-api/ruoyi-api-external/src/main/java/org/dromara/external/api/zhongzhi/domain/vo/ProductPromiseVo.java

@@ -1,4 +1,4 @@
-package org.dromara.external.controller.zhongzhi.domain.vo;
+package org.dromara.external.api.zhongzhi.domain.vo;
 
 import lombok.Data;
 

+ 1 - 1
ruoyi-modules/ruoyi-external/src/main/java/org/dromara/external/controller/zhongzhi/domain/vo/ProductShelfStateVo.java → ruoyi-api/ruoyi-api-external/src/main/java/org/dromara/external/api/zhongzhi/domain/vo/ProductShelfStateVo.java

@@ -1,4 +1,4 @@
-package org.dromara.external.controller.zhongzhi.domain.vo;
+package org.dromara.external.api.zhongzhi.domain.vo;
 
 import lombok.Data;
 

+ 2 - 2
ruoyi-api/ruoyi-api-auth/pom.xml → ruoyi-api/ruoyi-api-order/pom.xml

@@ -9,10 +9,10 @@
     </parent>
     <modelVersion>4.0.0</modelVersion>
 
-    <artifactId>ruoyi-api-auth</artifactId>
+    <artifactId>ruoyi-api-order</artifactId>
 
     <description>
-        ruoyi-api-auth
+        ruoyi-api-order 订单模块接口模块
     </description>
 
     <dependencies>

+ 25 - 0
ruoyi-api/ruoyi-api-order/src/main/java/org/dromara/product/api/RemoteExternalOrderService.java

@@ -0,0 +1,25 @@
+package org.dromara.product.api;
+
+import org.dromara.product.api.domain.dto.OrderNoticeDto;
+import org.dromara.product.api.domain.dto.OrderPushDto;
+
+/**
+ * @author
+ * @date 2025/12/30 下午7:09
+ */
+public interface RemoteExternalOrderService {
+    /**
+    * 推送订单
+    * */
+    OrderNoticeDto pushOrder(OrderPushDto bo);
+
+    /**
+    * 确认订单
+    * */
+    void confirmOrder(Long orderId);
+
+    /**
+    * 订单状态通知
+    * */
+    void notice(OrderNoticeDto bo);
+}

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

@@ -0,0 +1,42 @@
+package org.dromara.product.api.domain.dto;
+
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * @author
+ * @date 2025/12/24 下午6:08
+ */
+@Data
+public class OrderNoticeDto implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+    /**
+    * 订单编号
+    * */
+    private String orderId;
+    /**
+    * 订单状态
+     * (100, "待付预付款"),
+     *
+     * (120, "待供应商发货"),
+     *
+     * (131, "供应商已发货(待供应商收货)"),
+     *
+     * (132, "已收货(待供应商发起验收)"),
+     *
+     * (149, "退款完成"),
+     *
+     * (150, "待采购人验收"),
+     *
+     * (151, "已验收"),
+     *
+     * (153, "待付款,(线下支付)待采购人确认付款(待上传支付凭证)"),
+     *
+     * (154, "已付款,(线下支付)采购人已上传正式支付凭证,待供应商确认收款"),
+     *
+     * (159, "已结算")
+    * */
+    private String orderState;
+}

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

@@ -0,0 +1,75 @@
+package org.dromara.product.api.domain.dto;
+
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.List;
+
+@Data
+public class OrderPushDto implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    // 1. 订单类型 Y
+    private String order_id;
+
+    // 3. 订单单号 Y
+    private String yggc_order;
+
+    // 4. 订单商品信息 Y
+//    private List<SkuItem> sku;
+    private String sku;
+
+    // 5-14. 收货与地址信息
+    private String name;           // 收货人名称 Y
+    private Integer province;      // 一级地址(省级编码) Y
+    private Integer city;          // 二级地址(市级编码) Y
+    private Integer county;        // 三级地址(区级编码) Y
+    private String address;        // 详细地址 Y
+    private String zip;            // 邮编 Y
+    private String phone;          // 座机号(与 mobile 二选一) Y
+    private String mobile;         // 手机号(与 phone 二选一) Y
+    private String email;          // 邮箱(可选)
+    private String remark;         // 备注(<100字)
+
+    // 15. 采购单位名称
+    private String dep_name;
+
+    // 16-25. 发票信息
+    private String invoice_title;           // 发票抬头 Y
+    private String invoice_type;            // 发票类型:1普通, 2增值税, 3电子 Y
+    private String invoice_org_code;         // 纳税人识别号 Y
+    private String invoice_name;            // 增值税收票人(invoiceType=2 时必填)
+    private String invoice_phone;           // 注册电话(invoiceType=2 时必填)
+    private String invoice_bank;            // 开户银行(invoiceType=2 时必填)
+    private String invoice_bank_code;        // 开户行账号(invoiceType=2 时必填)
+    private String invoice_address;         // 注册地址(invoiceType=2 时必填)
+    private String invoice_mobile;          // 收票联系电话(可选)
+    private String invoice_receipt_address;  // 收票地址(可选)
+
+    // 26-30. 其他订单信息
+    private String payment;        // 付款方式1:货到付款,2:集中支付, 3:在线支付, 4:支票 5:账期支付 6:先款后货 Y
+    private String order_price;     // 订单金额(含运费)Y
+    private String freight;        // 运费 Y
+    private String mode;           // 订单模式:1-协议价(默认), 2-团购, 3-特惠, 4-阶梯价(可选) Y
+    private String orderCode;      // 卖场订单编号   Y
+
+
+    // ===== 内部静态类:商品项(含延保) =====
+    @Data
+    public static class SkuItem {
+        private String sku;                    // 商品编号
+        private Integer num;                   // 商品数量
+        private Integer price;                 // 商品价格
+        private Integer mode;                  // 价格模式(同订单 mode 含义)
+        private List<YanbaoItem> yanbao;       // 延保服务(可选)
+
+        @Data
+        public static class YanbaoItem {
+            private String sku;                // 延保编号
+            private Integer price;             // 延保价格
+            private Integer num;               // 延保数量
+        }
+    }
+
+}

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

@@ -1,6 +1,6 @@
 package org.dromara.product.api;
 
-import org.dromara.product.api.domain.ProductChangeLogVo;
+import org.dromara.product.api.domain.ProductChangeLogApiVo;
 import org.dromara.product.api.domain.ProductVo;
 
 import java.util.List;
@@ -32,7 +32,7 @@ public interface RemoteProductService {
     /**
     * 获取商品变更记录
     * */
-    List<ProductChangeLogVo> getProductChangeLogs(Long itemId,String type);
+    List<ProductChangeLogApiVo> getProductChangeLogs(Long itemId,String type);
 
     void delMessagePool(Long messageId);
 }

+ 3 - 3
ruoyi-api/ruoyi-api-product/src/main/java/org/dromara/product/api/domain/ProductChangeLogVo.java → ruoyi-api/ruoyi-api-product/src/main/java/org/dromara/product/api/domain/ProductChangeLogApiVo.java

@@ -11,13 +11,13 @@ import java.io.Serial;
  * @date 2025-12-29
  */
 @Data
-public class ProductChangeLogVo {
+public class ProductChangeLogApiVo {
 
     @Serial
     private static final long serialVersionUID = 1L;
 
     /**
-     *
+     * 
      */
     private Long id;
 
@@ -44,4 +44,4 @@ public class ProductChangeLogVo {
     private String remark;
 
 
-}
+}

+ 1 - 1
ruoyi-auth/pom.xml

@@ -93,7 +93,7 @@
         </dependency>
         <dependency>
             <groupId>org.dromara</groupId>
-            <artifactId>ruoyi-api-auth</artifactId>
+            <artifactId>ruoyi-api-external</artifactId>
         </dependency>
 
         <!-- 自定义负载均衡(多团队开发使用) -->

+ 72 - 0
ruoyi-auth/src/main/java/org/dromara/auth/controller/Auth2Controller.java

@@ -0,0 +1,72 @@
+package org.dromara.auth.controller;
+
+import cn.dev33.satoken.annotation.SaIgnore;
+import cn.dev33.satoken.stp.StpUtil;
+import cn.hutool.core.date.DateTime;
+import cn.hutool.core.date.DateUnit;
+import cn.hutool.core.date.DateUtil;
+import cn.hutool.core.util.ObjectUtil;
+import cn.hutool.crypto.SecureUtil;
+import cn.hutool.http.HttpRequest;
+import cn.hutool.http.HttpUtil;
+import cn.hutool.json.JSONUtil;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.dromara.auth.domain.vo.LoginVo;
+import org.dromara.auth.service.IAuthStrategy;
+import org.dromara.common.redis.utils.RedisUtils;
+import org.dromara.external.api.zhongzhi.domain.Result;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.time.Duration;
+import java.time.format.DateTimeFormatter;
+import java.util.Map;
+import java.util.Objects;
+
+import static org.dromara.common.core.constant.GlobalConstants.GLOBAL_REDIS_KEY;
+
+/**
+ * @author
+ * @date 2025/8/4 下午6:46
+ */
+@Slf4j
+@SaIgnore
+@RequiredArgsConstructor
+@RestController
+@RequestMapping("/auth2")
+public class Auth2Controller {
+
+
+    /**
+     * 获取 Access Token
+     * @param username 用户名
+     * @param password 密码(明文,生产环境建议加密后再传)
+     * @return 包含 access_token 和 expires_at 的 Result,失败则 success=false
+     */
+    @PostMapping("/zhongzhi/access_token")
+    public Result getAccessToken(String timestamp, String username, String password, String sign) {
+        // 2. 生成 sign = MD5(username + password + timestamp + password).toLowerCase()
+        String signStr = username + password + timestamp + password;
+        String sign1 = SecureUtil.md5(signStr).toLowerCase();
+
+        if(Objects.equals(sign1,sign)){
+            LoginVo loginVo = IAuthStrategy.getAccessToken(username, password);
+            if(ObjectUtil.isEmpty(loginVo)){
+                return Result.fail(5002,"授权失败");
+            }
+            if(ObjectUtil.isNotEmpty(loginVo.getMsg())){
+                return Result.fail(loginVo.getCode(),loginVo.getMsg());
+            }
+            DateTime date = DateUtil.offsetSecond(DateUtil.date(), (int) StpUtil.getTokenTimeout(loginVo.getAccessToken()));
+            String format = DateUtil.format(date, "yyyy-MM-dd HH:mm:ss");
+            return  Result.tokenOk(loginVo.getAccessToken(), format);
+        } else  {
+            return Result.fail(5004,"签名错误,请检查后重试");
+        }
+    }
+
+
+
+}

+ 0 - 21
ruoyi-auth/src/main/java/org/dromara/auth/dubbo/RemoteAuthServiceImpl.java

@@ -1,21 +0,0 @@
-package org.dromara.auth.dubbo;
-
-import cn.hutool.core.bean.BeanUtil;
-import org.dromara.auth.api.RemoteAuthService;
-import org.dromara.auth.api.domain.RemoteLoginVo;
-import org.dromara.auth.domain.vo.LoginVo;
-import org.dromara.auth.service.IAuthStrategy;
-
-/**
- * @author
- * @date 2025/12/24 下午2:35
- */
-public class RemoteAuthServiceImpl implements RemoteAuthService {
-
-
-    @Override
-    public RemoteLoginVo getAccessToken(String username, String password) {
-        LoginVo loginVo = IAuthStrategy.getAccessToken(username, password);
-        return BeanUtil.toBean(loginVo, RemoteLoginVo.class);
-    }
-}

+ 1 - 1
ruoyi-auth/src/main/resources/application.yml

@@ -1,6 +1,6 @@
 # Tomcat
 server:
-  port: 9210
+  port: 9211
 
 # Spring
 spring:

+ 11 - 25
ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/enums/OrderStatus.java

@@ -8,54 +8,40 @@ import lombok.Getter;
 public enum OrderStatus {
 
     /**
-     * 待收单(初始状态)
+     * 待支付(初始状态)
      */
-    PENDING_RECEIPT("0", "待收单"),
+    PENDING_PAYMENT("0", "待支付"),
 
     /**
-     * 已收单
+     * 待确认(已支付,等待商家处理)
      */
-    RECEIVED("1", "已收单"),
+    PENDING_CONFIRMATION("1", "待确认"),
 
     /**
-     * 待发货
+     * 待发货(商家已确认,准备发货)
      */
     PENDING_SHIPMENT("2", "待发货"),
 
     /**
-     * 部分发货
+     * 部分发货(已发部分商品)
      */
     PARTIALLY_SHIPPED("3", "部分发货"),
 
     /**
-     * 发货完成
+     * 发货完成(所有商品已发出,物流在途)
      */
     SHIPPED("4", "发货完成"),
 
     /**
-     * 待签收
+     * 已完成(全部签收,交易结束)
      */
-    PENDING_SIGN("5", "待签收"),
+    COMPLETED("5", "已完成"),
 
     /**
-     * 部分签收
+     * 已关闭(取消、超时、全额退款等)
      */
-    PARTIALLY_SIGNED("6", "部分签收"),
+    CLOSED("6", "已关闭");
 
-    /**
-     * 签收完成
-     */
-    SIGNED("7", "签收完成"),
-
-    /**
-     * 拒单(客户拒绝)
-     */
-    REJECTED("8", "拒单"),
-
-    /**
-     * 即将逾期收单(预警状态)
-     */
-    ABOUT_TO_EXPIRE("9", "即将逾期收单");
 
     private final String code;
     private final String info;

+ 17 - 0
ruoyi-common/ruoyi-common-redis/src/main/java/org/dromara/common/redis/utils/SequenceUtils.java

@@ -192,4 +192,21 @@ public class SequenceUtils {
         return businessKey + paddedSeq;
     }
 
+    /*生成20位发货单号方法*/
+    public static String nextIdDateTimePadded(String prefix) {
+        // 使用精确到分钟的 key,避免单秒内流水号超过9999
+        String timeKey = DateUtil.format(DateUtil.date(), "yyyyMMddHHmm");
+        String businessKey = StringUtils.blankToDefault(prefix, "") + timeKey;
+
+        // 设置过期时间为1小时(或1天),确保key不会永久占用内存
+        Duration expireTime = Duration.ofHours(1);
+
+        // 获取4位补零流水号
+        String paddedSeq = nextPaddedIdStr(businessKey, expireTime, 4);
+
+        // 拼接完整时间(到秒)+ 流水号
+        String fullTime = DateUtil.format(DateUtil.date(), DatePattern.PURE_DATETIME_FORMATTER); // yyyyMMddHHmmss
+        return fullTime + paddedSeq;
+    }
+
 }

+ 7 - 4
ruoyi-modules/ruoyi-external/pom.xml

@@ -102,17 +102,20 @@
 
         <dependency>
             <groupId>org.dromara</groupId>
-            <artifactId>ruoyi-api-auth</artifactId>
+            <artifactId>ruoyi-api-resource</artifactId>
         </dependency>
 
         <dependency>
             <groupId>org.dromara</groupId>
-            <artifactId>ruoyi-api-resource</artifactId>
+            <artifactId>ruoyi-api-product</artifactId>
         </dependency>
-
         <dependency>
             <groupId>org.dromara</groupId>
-            <artifactId>ruoyi-api-product</artifactId>
+            <artifactId>ruoyi-api-external</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.dromara</groupId>
+            <artifactId>ruoyi-api-order</artifactId>
         </dependency>
 
         <dependency>

+ 26 - 20
ruoyi-modules/ruoyi-external/src/main/java/org/dromara/external/controller/zhongzhi/ZhongZhiPullController.java

@@ -11,7 +11,7 @@ import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import lombok.RequiredArgsConstructor;
 import org.dromara.common.redis.utils.RedisUtils;
 import org.dromara.external.controller.ExternalItemController;
-import org.dromara.external.controller.zhongzhi.domain.Result;
+import org.dromara.external.api.zhongzhi.domain.Result;
 import org.dromara.external.domain.ExternalProductBrand;
 import org.dromara.external.domain.ExternalProductCategory;
 import org.dromara.external.service.IExternalProductBrandService;
@@ -23,6 +23,8 @@ import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
 
 import java.time.Duration;
+import java.util.HashMap;
+import java.util.List;
 import java.util.Map;
 
 import static org.dromara.common.core.constant.GlobalConstants.GLOBAL_REDIS_KEY;
@@ -40,6 +42,7 @@ import static org.dromara.common.core.constant.GlobalConstants.GLOBAL_REDIS_KEY;
 @RequestMapping("/zhongzhi/pull")
 public class ZhongZhiPullController {
     private final String url = "http://gcytapi.gcycloud.cn/";
+//    private final String url = "http://gcyts.gcycloud.cn/";
 
     private final String key = GLOBAL_REDIS_KEY+"external:zhongzhi:token:";
 
@@ -61,7 +64,7 @@ public class ZhongZhiPullController {
     public static void main(String[] args) {
 //        HttpResponse response = HttpUtil.createPost("http://127.0.0.1:8080/external/zhongzhi/pull/gyssc/token")
 //            .execute();
-        HttpResponse response2 = HttpUtil.createPost("http://127.0.0.1:8080/external/zhongzhi/pull/gyssc/platform/info")
+        HttpResponse response2 = HttpUtil.createPost("http://127.0.0.1:8080/external/zhongzhi/pull/gyssc/platform/brands")
             .execute();
         System.out.println(response2.body());
     }
@@ -115,27 +118,31 @@ public class ZhongZhiPullController {
     * 获取平台品目信息接口
     * */
     @PostMapping("/gyssc/platform/catalogs")
-    public Result getPlatformCatalogs(String access_token) {
+    public Result getPlatformCatalogs() {
         HttpRequest post = HttpUtil.createPost(url + "gyssc/platform/catalogs");
-        post.header("Authorization", "Bearer " + access_token);
+        String accessToken = this.getAccessToken();
+        post.form("token", accessToken);
+        post.form("platformCode", code);
         String body = post.execute().body();
-        Result<Map<String,String>> result = JSONUtil.toBean(body, Result.class);
+        Result<List<Map<String,String>>> result = JSONUtil.toBean(body, Result.class);
         if (!result.getSuccess()) {
             return Result.fail(result.getCode(), result.getDesc());
         }
-        result.getResult().forEach((k,v)->{
+        result.getResult().forEach(map->{
+
             boolean exists = externalProductCategoryService.exists(Wrappers.lambdaQuery(ExternalProductCategory.class)
-                .eq(ExternalProductCategory::getCategoryNo, k));
+                .eq(ExternalProductCategory::getCategoryNo, map.get("interfaceCode")));
 
             ExternalProductCategory externalProductCategory = new ExternalProductCategory();
-            externalProductCategory.setPlatformCode(code);
-            externalProductCategory.setCategoryName(v);
-            externalProductCategory.setCategoryNo(k);
+            externalProductCategory.setDataSource(code);
+            externalProductCategory.setCategoryName(map.get("name"));
+            externalProductCategory.setClassDescription(map.get("treeNames"));
+            externalProductCategory.setCategoryNo(map.get("interfaceCode"));
             if(!exists){
                 externalProductCategoryService.save(externalProductCategory);
             }else {
                 externalProductCategoryService.update(externalProductCategory,Wrappers.lambdaUpdate(ExternalProductCategory.class)
-                    .eq(ExternalProductCategory::getCategoryNo, k));
+                    .eq(ExternalProductCategory::getCategoryNo, map.get("interfaceCode")));
             }
 
         });
@@ -162,7 +169,6 @@ public class ZhongZhiPullController {
     @PostMapping("/gyssc/platform/catalogsParam")
     public Result getStandardCatalogs(String access_token) {
         HttpRequest post = HttpUtil.createPost(url + "gyssc/platform/catalogsParam");
-        post.header("Authorization", "Bearer " + access_token);
         String body = post.execute().body();
         Result result = JSONUtil.toBean(body, Result.class);
         if (!result.getSuccess()) {
@@ -174,10 +180,12 @@ public class ZhongZhiPullController {
     /**
     * 获取品牌信息接口
     * */
-    @PostMapping("/brands")
-    public Result getBrands(String access_token) {
-        HttpRequest post = HttpUtil.createPost(url + "brands");
-        post.header("Authorization", "Bearer " + access_token);
+    @PostMapping("/gyssc/platform/brands")
+    public Result getBrands() {
+        HttpRequest post = HttpUtil.createPost(url + "gyssc/platform/brands");
+        String accessToken = this.getAccessToken();
+        post.form("token", accessToken);
+        post.form("platformCode", code);
         String body = post.execute().body();
         Result<Map<String,String>> result = JSONUtil.toBean(body, Result.class);
         if (!result.getSuccess()) {
@@ -187,7 +195,7 @@ public class ZhongZhiPullController {
             boolean exists = externalProductBrandService.exists(Wrappers.lambdaQuery(ExternalProductBrand.class)
                 .eq(ExternalProductBrand::getBrandNo, k));
                 ExternalProductBrand externalProductBrand = new ExternalProductBrand();
-                externalProductBrand.setPlatformCode(code);
+                externalProductBrand.setDataSource(code);
                 externalProductBrand.setBrandName(v);
                 externalProductBrand.setBrandNo(k);
                 if(!exists){
@@ -205,7 +213,6 @@ public class ZhongZhiPullController {
     @PostMapping("/gyssc/platform/getBigdataUrl")
     public Result getBigdataUrl(String access_token) {
         HttpRequest post = HttpUtil.createPost(url + "gyssc/platform/getBigdataUrl");
-        post.header("Authorization", "Bearer " + access_token);
         String body = post.execute().body();
         Result result = JSONUtil.toBean(body, Result.class);
         if (!result.getSuccess()) {
@@ -219,7 +226,7 @@ public class ZhongZhiPullController {
     @PostMapping("/gyssc/platform/getPushLog")
     public Result getPushLog(String access_token) {
         HttpRequest post = HttpUtil.createPost(url + "gyssc/platform/getPushLog");
-        post.header("Authorization", "Bearer " + access_token);
+
         String body = post.execute().body();
         Result result = JSONUtil.toBean(body, Result.class);
         if (!result.getSuccess()) {
@@ -234,7 +241,6 @@ public class ZhongZhiPullController {
     @PostMapping("/gyssc/platform/goodsPriceSource")
     public Result getGoodsPriceSource(String access_token) {
         HttpRequest post = HttpUtil.createPost(url + "gyssc/platform/goodsPriceSource");
-        post.header("Authorization", "Bearer " + access_token);
         String body = post.execute().body();
         Result result = JSONUtil.toBean(body, Result.class);
         if (!result.getSuccess()) {

+ 103 - 44
ruoyi-modules/ruoyi-external/src/main/java/org/dromara/external/controller/zhongzhi/ZhongZhiPushController.java

@@ -1,21 +1,29 @@
 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;
-import org.dromara.auth.api.RemoteAuthService;
-import org.dromara.auth.api.domain.RemoteLoginVo;
-import org.dromara.external.controller.zhongzhi.domain.Attribute;
-import org.dromara.external.controller.zhongzhi.domain.Result;
-import org.dromara.external.controller.zhongzhi.domain.bo.*;
-import org.dromara.external.controller.zhongzhi.domain.vo.*;
+import org.dromara.common.json.utils.JsonUtils;
+import org.dromara.external.api.zhongzhi.domain.Attribute;
+import org.dromara.external.api.zhongzhi.domain.Result;
+import org.dromara.external.api.zhongzhi.domain.bo.*;
+import org.dromara.external.api.zhongzhi.domain.vo.*;
+import org.dromara.external.domain.ExternalProductCategory;
+import org.dromara.external.service.IExternalProductBrandService;
+import org.dromara.external.service.IExternalProductCategoryService;
+import org.dromara.product.api.RemoteExternalOrderService;
 import org.dromara.product.api.RemoteProductService;
-import org.dromara.product.api.domain.ProductChangeLogVo;
+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;
@@ -23,6 +31,7 @@ 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;
 
@@ -39,12 +48,17 @@ import java.util.Objects;
 @RequestMapping("/zhongzhi/api")
 public class ZhongZhiPushController {
 
-    @DubboReference
-    private final RemoteAuthService remoteAuthService;
 
     @DubboReference
     private final RemoteProductService remoteProductService;
 
+    @DubboReference
+    private final RemoteExternalOrderService remoteOrderService;
+
+    private final IExternalProductCategoryService externalProductCategoryService;
+
+    private final IExternalProductBrandService externalProductBrandService;
+
     /**
      * 校验token
      * */
@@ -61,35 +75,6 @@ public class ZhongZhiPushController {
         return null;
     }
 
-
-    /**
-     * 获取 Access Token
-     * @param username 用户名
-     * @param password 密码(明文,生产环境建议加密后再传)
-     * @return 包含 access_token 和 expires_at 的 Result,失败则 success=false
-     */
-    @PostMapping("/auth2/access_token")
-    public Result getAccessToken(String timestamp, String username, String password, String sign) {
-        // 2. 生成 sign = MD5(username + password + timestamp + password).toLowerCase()
-        String signStr = username + password + timestamp + password;
-        String sign1 = SecureUtil.md5(signStr).toLowerCase();
-
-        if(Objects.equals(sign1,sign)){
-            RemoteLoginVo loginVo= remoteAuthService.getAccessToken(username, password);
-            if(ObjectUtil.isEmpty(loginVo)){
-                return Result.fail(5002,"授权失败");
-            }
-            if(ObjectUtil.isNotEmpty(loginVo.getMsg())){
-                return Result.fail(loginVo.getCode(),loginVo.getMsg());
-            }
-            DateTime date = DateUtil.offsetSecond(DateUtil.date(), (int) StpUtil.getTokenTimeout(loginVo.getAccessToken()));
-            String format = DateUtil.format(date, "yyyy-MM-dd HH:mm:ss");
-            return  Result.tokenOk(loginVo.getAccessToken(), format);
-        } else  {
-            return Result.fail(5004,"签名错误,请检查后重试");
-        }
-    }
-
     /**
     * 获取电商商品变动消息
     * */
@@ -102,7 +87,7 @@ public class ZhongZhiPushController {
         if(ObjectUtil.isEmpty(bo.getType())){
             return Result.fail(5006,"消息类型不能为空");
         }
-        List<ProductChangeLogVo> productChangeLogs = remoteProductService.getProductChangeLogs(null, String.valueOf(bo.getType()));
+        List<ProductChangeLogApiVo> productChangeLogs = remoteProductService.getProductChangeLogs(null, String.valueOf(bo.getType()));
         List<ProductMessageInfo> productMessageInfos = productChangeLogs.stream().map(productChangeLogVo -> {
             ProductMessageInfo productMessageInfo = new ProductMessageInfo();
             ProductVo productDetail = remoteProductService.getProductDetail(productChangeLogVo.getProductId());
@@ -120,7 +105,7 @@ public class ZhongZhiPushController {
         return Result.ok(productMessageInfos);
     }
     /**
-    * 获取商品详情
+    * 获取商品详情 362031
     * */
     @PostMapping("/product/detail_standard")
     public Result<ExternalProductVo> detailStandard(GetProductDetailBo bo) {
@@ -133,6 +118,19 @@ public class ZhongZhiPushController {
         }
 
         ProductVo productDetail = remoteProductService.getProductDetail(Long.valueOf(bo.getSku()));
+        //获取第三方分类
+//        ExternalProductBrand one = externalProductBrandService.getOne(Wrappers.lambdaQuery(ExternalProductBrand.class)
+//            .eq(ExternalProductBrand::getProductBrandId, productDetail.getBrandId())
+//            .eq(ExternalProductBrand::getPlatformCode, bo.getPlatformCode())
+//            .last("limit 1")
+//        );
+        ExternalProductCategory one = externalProductCategoryService.getOne(Wrappers.lambdaQuery(ExternalProductCategory.class)
+            .eq(ExternalProductCategory::getProductCategoryId, productDetail.getBottomCategoryId())
+            .eq(ExternalProductCategory::getDataSource, bo.getPlatformCode())
+            .last("limit 1")
+        );
+
+
         ExternalProductVo externalProductVo = ExternalProductVo.builder()
             .sku(String.valueOf(productDetail.getId()))
             .url(productDetail.getProductImage())
@@ -145,18 +143,22 @@ public class ZhongZhiPushController {
             .product_area(null)
             .upc(productDetail.getUpcBarcode())
             .unit(productDetail.getUnitName())
-            .category(productDetail.getCategoryName())
+            .category(null)
             .service(productDetail.getAfterSalesService())
             .code_69(null)
             .introduction(productDetail.getMainLibraryIntro())
             .build();
+        if(ObjectUtil.isNotEmpty(one)){
+            externalProductVo.setCategory(one.getCategoryNo());
+        }
+
         return Result.ok(externalProductVo);
     }
 
     /**
     * 获取商品参数信息
     * */
-    @PostMapping("/product/ product_attributes_standard")
+    @PostMapping("/product/product_attributes_standard")
     public Result<Attribute> productAttributesStandard(GetProductDetailBo bo) {
         Result result = checkToken(bo.getToken(), bo.getPlatformCode());
         if(ObjectUtil.isNotEmpty(result)){
@@ -256,8 +258,8 @@ public class ZhongZhiPushController {
         List<ProductPriceVo> prices = productDetails.stream().map(productVo -> {
             ProductPriceVo productPriceVo = new ProductPriceVo();
             productPriceVo.setSku(String.valueOf(productVo.getId()));
-            productPriceVo.setPrice(productVo.getMarketPrice());
-            productPriceVo.setMall_price(productVo.getMemberPrice());
+            productPriceVo.setPrice(productVo.getMemberPrice());
+            productPriceVo.setMall_price(productVo.getMarketPrice());
             productPriceVo.setStock(String.valueOf(productVo.getTotalInventory()));
             return productPriceVo;
         }).toList();
@@ -296,6 +298,7 @@ public class ZhongZhiPushController {
         if(ObjectUtil.isEmpty(bo.getSku())){
             return Result.fail(5006,"订单商品不能为空");
         }
+        List<OrderPushBo.SkuItem> sku = JsonUtils.parseArray(bo.getSku(), OrderPushBo.SkuItem.class);
         if(ObjectUtil.isEmpty(bo.getName())){
             return Result.fail(5006,"收货人名称不能为空");
         }
@@ -358,10 +361,42 @@ public class ZhongZhiPushController {
         if(ObjectUtil.isEmpty(bo.getOrderCode())){
             return Result.fail(5006,"卖场订单编号不能为空");
         }
+        OrderPushDto dto = BeanUtil.toBean(bo, OrderPushDto.class);
+//        remoteOrderService.pushOrder(dto);
         OrderPushVo orderPushVo = new OrderPushVo();
+        orderPushVo.setOrderPrice(bo.getOrder_price());
+        List<OrderPushVo.Sku> list = sku.stream().map(skuItem -> {
+            OrderPushVo.Sku skuVo = new OrderPushVo.Sku();
+            skuVo.setSku(skuItem.getSku());
+            skuVo.setNum(String.valueOf(skuItem.getNum()));
+            skuVo.setPrice(String.valueOf(skuItem.getPrice()));
+            return skuVo;
+        }).toList();
+        orderPushVo.setMall_order_id(UUID.randomUUID().toString());
+        orderPushVo.setSku(list);
+//        sku.setSku("1");
+//        sku.setNum(bo.get);
+//        orderPushVo.setSku();
+
         return Result.ok(orderPushVo);
     }
 
+    /**
+    * 确认接收订单
+    * */
+    @PostMapping("/order/confirm")
+    public Result confirm(OrderPushBo bo) {
+        Result result = checkToken(bo.getToken(),bo.getPlatformCode());
+        if(ObjectUtil.isNotEmpty(result)){
+            return result;
+        }
+        if(ObjectUtil.isEmpty(bo.getOrder_id())){
+            return Result.fail(5006,"订单编号不能为空");
+        }
+//        remoteOrderService.confirmOrder(Long.valueOf(bo.getOrder_id()));
+        return Result.ok("成功确认接收订单",null);
+    }
+
     /**
     * 订单状态通知接口
     * */
@@ -377,9 +412,33 @@ public class ZhongZhiPushController {
         if(ObjectUtil.isEmpty(bo.getOrderState())){
             return Result.fail(5006,"订单状态不能为空");
         }
+        OrderNoticeDto dto = BeanUtil.toBean(bo, OrderNoticeDto.class);
+//        remoteOrderService.notice(dto);
         return Result.ok("成功收到通知",null);
     }
 
+    /**
+    * 商品状态通知接口
+    * */
+    @PostMapping("/product/notice")
+    public Result notice(ProductNoticeBo bo) {
+        Result result = checkToken(bo.getToken(),bo.getPlatformCode());
+        if(ObjectUtil.isNotEmpty(result)){
+            return result;
+        }
+        if(ObjectUtil.isEmpty(bo.getSku())){
+            return Result.fail(5006,"商品编号不能为空");
+        }
+        if(ObjectUtil.isEmpty(bo.getStatus())){
+            return Result.fail(5006,"商品状态不能为空");
+        }
+        if(ObjectUtil.isEmpty(bo.getMessage())){
+            return Result.fail(5006,"商品状态通知不能为空");
+        }
+        return Result.ok("成功收到通知",null);
+    }
+
+
 
 
 

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

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

+ 106 - 0
ruoyi-modules/ruoyi-order/src/main/java/org/dromara/order/controller/OrderDeliverController.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.OrderDeliverVo;
+import org.dromara.order.domain.bo.OrderDeliverBo;
+import org.dromara.order.service.IOrderDeliverService;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+
+/**
+ * 订单发货主
+ * 前端访问路由地址为:/system/orderDeliver
+ *
+ * @author LionLi
+ * @date 2025-12-30
+ */
+@Validated
+@RequiredArgsConstructor
+@RestController
+@RequestMapping("/orderDeliver")
+public class OrderDeliverController extends BaseController {
+
+    private final IOrderDeliverService orderDeliverService;
+
+    /**
+     * 查询订单发货主列表
+     */
+//    @SaCheckPermission("system:orderDeliver:list")
+    @GetMapping("/list")
+    public TableDataInfo<OrderDeliverVo> list(OrderDeliverBo bo, PageQuery pageQuery) {
+        return orderDeliverService.queryPageList(bo, pageQuery);
+    }
+
+    /**
+     * 导出订单发货主列表
+     */
+//    @SaCheckPermission("system:orderDeliver:export")
+    @Log(title = "订单发货主", businessType = BusinessType.EXPORT)
+    @PostMapping("/export")
+    public void export(OrderDeliverBo bo, HttpServletResponse response) {
+        List<OrderDeliverVo> list = orderDeliverService.queryList(bo);
+        ExcelUtil.exportExcel(list, "订单发货主", OrderDeliverVo.class, response);
+    }
+
+    /**
+     * 获取订单发货主详细信息
+     *
+     * @param id 主键
+     */
+//    @SaCheckPermission("system:orderDeliver:query")
+    @GetMapping("/{id}")
+    public R<OrderDeliverVo> getInfo(@NotNull(message = "主键不能为空")
+                                     @PathVariable("id") Long id) {
+        return R.ok(orderDeliverService.queryById(id));
+    }
+
+    /**
+     * 新增订单发货主
+     */
+//    @SaCheckPermission("system:orderDeliver:add")
+    @Log(title = "订单发货主", businessType = BusinessType.INSERT)
+    @RepeatSubmit()
+    @PostMapping()
+    public R<Void> add(@Validated(AddGroup.class) @RequestBody OrderDeliverBo bo) {
+        return toAjax(orderDeliverService.insertByBo(bo));
+    }
+
+    /**
+     * 修改订单发货主
+     */
+//    @SaCheckPermission("system:orderDeliver:edit")
+    @Log(title = "订单发货主", businessType = BusinessType.UPDATE)
+    @RepeatSubmit()
+    @PutMapping()
+    public R<Void> edit(@Validated(EditGroup.class) @RequestBody OrderDeliverBo bo) {
+        return toAjax(orderDeliverService.updateByBo(bo));
+    }
+
+    /**
+     * 删除订单发货主
+     *
+     * @param ids 主键串
+     */
+//    @SaCheckPermission("system:orderDeliver:remove")
+    @Log(title = "订单发货主", businessType = BusinessType.DELETE)
+    @DeleteMapping("/{ids}")
+    public R<Void> remove(@NotEmpty(message = "主键不能为空")
+                          @PathVariable("ids") Long[] ids) {
+        return toAjax(orderDeliverService.deleteWithValidByIds(List.of(ids), true));
+    }
+}

+ 106 - 0
ruoyi-modules/ruoyi-order/src/main/java/org/dromara/order/controller/OrderDeliverProductController.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.OrderDeliverProductVo;
+import org.dromara.order.domain.bo.OrderDeliverProductBo;
+import org.dromara.order.service.IOrderDeliverProductService;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+
+/**
+ * 订单发货商品明细
+ * 前端访问路由地址为:/system/deliverProduct
+ *
+ * @author LionLi
+ * @date 2025-12-30
+ */
+@Validated
+@RequiredArgsConstructor
+@RestController
+@RequestMapping("/deliverProduct")
+public class OrderDeliverProductController extends BaseController {
+
+    private final IOrderDeliverProductService orderDeliverProductService;
+
+    /**
+     * 查询订单发货商品明细列表
+     */
+//    @SaCheckPermission("system:deliverProduct:list")
+    @GetMapping("/list")
+    public TableDataInfo<OrderDeliverProductVo> list(OrderDeliverProductBo bo, PageQuery pageQuery) {
+        return orderDeliverProductService.queryPageList(bo, pageQuery);
+    }
+
+    /**
+     * 导出订单发货商品明细列表
+     */
+//    @SaCheckPermission("system:deliverProduct:export")
+    @Log(title = "订单发货商品明细", businessType = BusinessType.EXPORT)
+    @PostMapping("/export")
+    public void export(OrderDeliverProductBo bo, HttpServletResponse response) {
+        List<OrderDeliverProductVo> list = orderDeliverProductService.queryList(bo);
+        ExcelUtil.exportExcel(list, "订单发货商品明细", OrderDeliverProductVo.class, response);
+    }
+
+    /**
+     * 获取订单发货商品明细详细信息
+     *
+     * @param id 主键
+     */
+//    @SaCheckPermission("system:deliverProduct:query")
+    @GetMapping("/{id}")
+    public R<OrderDeliverProductVo> getInfo(@NotNull(message = "主键不能为空")
+                                            @PathVariable("id") Long id) {
+        return R.ok(orderDeliverProductService.queryById(id));
+    }
+
+    /**
+     * 新增订单发货商品明细
+     */
+//    @SaCheckPermission("system:deliverProduct:add")
+    @Log(title = "订单发货商品明细", businessType = BusinessType.INSERT)
+    @RepeatSubmit()
+    @PostMapping()
+    public R<Void> add(@Validated(AddGroup.class) @RequestBody OrderDeliverProductBo bo) {
+        return toAjax(orderDeliverProductService.insertByBo(bo));
+    }
+
+    /**
+     * 修改订单发货商品明细
+     */
+//    @SaCheckPermission("system:deliverProduct:edit")
+    @Log(title = "订单发货商品明细", businessType = BusinessType.UPDATE)
+    @RepeatSubmit()
+    @PutMapping()
+    public R<Void> edit(@Validated(EditGroup.class) @RequestBody OrderDeliverProductBo bo) {
+        return toAjax(orderDeliverProductService.updateByBo(bo));
+    }
+
+    /**
+     * 删除订单发货商品明细
+     *
+     * @param ids 主键串
+     */
+//    @SaCheckPermission("system:deliverProduct:remove")
+    @Log(title = "订单发货商品明细", businessType = BusinessType.DELETE)
+    @DeleteMapping("/{ids}")
+    public R<Void> remove(@NotEmpty(message = "主键不能为空")
+                          @PathVariable("ids") Long[] ids) {
+        return toAjax(orderDeliverProductService.deleteWithValidByIds(List.of(ids), true));
+    }
+}

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

@@ -16,6 +16,7 @@ import org.dromara.common.mybatis.core.page.TableDataInfo;
 import org.dromara.common.web.core.BaseController;
 import org.dromara.order.domain.bo.OrderMainBo;
 import org.dromara.order.domain.vo.OrderMainVo;
+import org.dromara.order.domain.vo.OrderStatusStats;
 import org.dromara.order.service.IOrderMainService;
 import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
@@ -45,6 +46,14 @@ public class OrderMainController extends BaseController {
         return orderMainService.queryPageList(bo, pageQuery);
     }
 
+    /**
+     * 查询订单状态数量
+     */
+    @GetMapping("/queryOrderStatusStats")
+    public OrderStatusStats queryOrderStatusStats() {
+        return orderMainService.queryOrderStatusStats();
+    }
+
     /**
      * 导出订单主信息列表
      */

+ 116 - 0
ruoyi-modules/ruoyi-order/src/main/java/org/dromara/order/domain/OrderDeliver.java

@@ -0,0 +1,116 @@
+package org.dromara.order.domain;
+
+import org.dromara.common.tenant.core.TenantEntity;
+import com.baomidou.mybatisplus.annotation.*;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.dromara.order.domain.vo.OrderDeliverProductVo;
+import org.dromara.order.domain.vo.OrderDeliverVo;
+
+import java.io.Serial;
+import java.util.List;
+
+/**
+ * 订单发货主对象 order_deliver
+ *
+ * @author LionLi
+ * @date 2025-12-30
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@TableName("order_deliver")
+public class OrderDeliver extends TenantEntity {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键ID
+     */
+    @TableId(value = "id")
+    private Long id;
+
+    /**
+     * 订单id
+     */
+    private Long orderId;
+
+    /**
+     * 订单编号
+     */
+    private String orderCode;
+
+    /**
+     * 订单发货编号
+     */
+    private String deliverCode;
+
+    /**
+     * 物流包裹号
+     */
+    private String logisticPackNo;
+
+    /**
+     * 发货方式
+     */
+    private String deliverMethod;
+
+    /**
+     * 送货人姓名
+     */
+    private String deliverMan;
+
+    /**
+     * 送货人联系电话
+     */
+    private String phone;
+
+    /**
+     * 物流状态
+     */
+    private String logisticsStatus;
+
+    /**
+     * 发货备注
+     */
+    private String deliverRemark;
+
+    /**
+     * 装箱/验货备注
+     */
+    private String checklistRemark;
+
+    /**
+     * 承运物流公司
+     */
+    private Long logisticsCompany;
+
+    /**
+     * 物流单号
+     */
+    private String logisticNo;
+
+    /**
+     * 包裹状态
+     */
+    private String logisticPackStatus;
+
+    /**
+     * 收货人电话
+     */
+    private String consigneePhone;
+
+    private String dataSource;
+
+    /**
+     * 删除标志(0代表存在 2代表删除)
+     */
+    @TableLogic
+    private String delFlag;
+
+    /**
+     * 备注
+     */
+    private String remark;
+
+}

+ 79 - 0
ruoyi-modules/ruoyi-order/src/main/java/org/dromara/order/domain/OrderDeliverProduct.java

@@ -0,0 +1,79 @@
+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_deliver_product
+ *
+ * @author LionLi
+ * @date 2025-12-30
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@TableName("order_deliver_product")
+public class OrderDeliverProduct extends TenantEntity {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键ID
+     */
+    @TableId(value = "id")
+    private Long id;
+
+    /**
+     * 发货单
+     */
+    private Long deliverId;
+
+    /**
+     * 商品编号
+     */
+    private Long productId;
+
+    /**
+     * 产品编号
+     */
+    private String productNo;
+
+    /**
+     * 商品名称
+     */
+    private String productName;
+
+    /**
+     * 商品单位
+     */
+    private Long productUnitId;
+
+    /**
+     * 商品单位
+     */
+    private String productUnit;
+
+    /**
+     * 本次发货数量
+     */
+    private Long deliverNum;
+
+    private String dataSource;
+
+    /**
+     * 删除标志(0代表存在 2代表删除)
+     */
+    @TableLogic
+    private String delFlag;
+
+    /**
+     * 备注
+     */
+    private String remark;
+
+
+}

+ 7 - 5
ruoyi-modules/ruoyi-order/src/main/java/org/dromara/order/domain/OrderMain.java

@@ -60,6 +60,11 @@ public class OrderMain extends TenantEntity {
      */
     private Long customerId;
 
+    /**
+     * 客户编号
+     */
+    private String customerCode;
+
     /**
      * 用户ID(关联用户表)
      */
@@ -245,11 +250,6 @@ public class OrderMain extends TenantEntity {
      */
     private String expenseType;
 
-    /**
-     * 客户编号
-     */
-    private String customerNo;
-
     /**
      * 用户编号
      */
@@ -260,6 +260,8 @@ public class OrderMain extends TenantEntity {
      */
     private String status;
 
+    private String dataSource;
+
     /**
      * 删除标志(0代表存在 2代表删除)
      */

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

@@ -4,9 +4,13 @@ import org.dromara.common.tenant.core.TenantEntity;
 import com.baomidou.mybatisplus.annotation.*;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
+
 import java.math.BigDecimal;
+
 import org.dromara.common.translation.annotation.Translation;
+
 import java.util.Date;
+
 import com.fasterxml.jackson.annotation.JsonFormat;
 import org.dromara.common.translation.constant.TransConstant;
 
@@ -142,6 +146,8 @@ public class OrderProduct extends TenantEntity {
      */
     private String status;
 
+    private String dataSource;
+
     /**
      * 删除标志(0代表存在 2代表删除)
      */

+ 110 - 0
ruoyi-modules/ruoyi-order/src/main/java/org/dromara/order/domain/bo/OrderDeliverBo.java

@@ -0,0 +1,110 @@
+package org.dromara.order.domain.bo;
+
+import org.dromara.order.domain.OrderDeliver;
+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.List;
+
+/**
+ * 订单发货主业务对象 order_deliver
+ *
+ * @author LionLi
+ * @date 2025-12-30
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@AutoMapper(target = OrderDeliver.class, reverseConvertGenerate = false)
+public class OrderDeliverBo extends BaseEntity {
+
+    /**
+     * 主键ID
+     */
+    private Long id;
+
+    /**
+     * 订单id
+     */
+    private Long orderId;
+
+    /**
+     * 订单编号
+     */
+    private String orderCode;
+
+    /**
+     * 订单发货编号
+     */
+    private String deliverCode;
+
+    /**
+     * 物流包裹号
+     */
+    private String logisticPackNo;
+
+    /**
+     * 发货方式
+     */
+    private String deliverMethod;
+
+    /**
+     * 送货人姓名
+     */
+    private String deliverMan;
+
+    /**
+     * 送货人联系电话
+     */
+    private String phone;
+
+    /**
+     * 物流状态
+     */
+    private String logisticsStatus;
+
+    /**
+     * 发货备注
+     */
+    private String deliverRemark;
+
+    /**
+     * 装箱/验货备注
+     */
+    private String checklistRemark;
+
+    /**
+     * 承运物流公司
+     */
+    private Long logisticsCompany;
+
+    /**
+     * 物流单号
+     */
+    private String logisticNo;
+
+    /**
+     * 包裹状态
+     */
+    private String logisticPackStatus;
+
+    /**
+     * 收货人电话
+     */
+    private String consigneePhone;
+
+    private String dataSource;
+
+    /**
+     * 备注
+     */
+    private String remark;
+
+    private List<OrderDeliverProductBo> orderDeliverProducts;
+
+
+}

+ 71 - 0
ruoyi-modules/ruoyi-order/src/main/java/org/dromara/order/domain/bo/OrderDeliverProductBo.java

@@ -0,0 +1,71 @@
+package org.dromara.order.domain.bo;
+
+import org.dromara.order.domain.OrderDeliverProduct;
+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.*;
+
+/**
+ * 订单发货商品明细业务对象 order_deliver_product
+ *
+ * @author LionLi
+ * @date 2025-12-30
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@AutoMapper(target = OrderDeliverProduct.class, reverseConvertGenerate = false)
+public class OrderDeliverProductBo extends BaseEntity {
+
+    /**
+     * 主键ID
+     */
+    private Long id;
+
+    /**
+     * 发货单
+     */
+    private Long deliverId;
+
+    /**
+     * 商品编号
+     */
+    private Long productId;
+
+    /**
+     * 产品编号(业务编码)
+     */
+    private String productNo;
+
+    /**
+     * 商品名称
+     */
+    private String productName;
+
+    /**
+     * 商品单位
+     */
+    private Long productUnitId;
+
+    /**
+     * 商品单位
+     */
+    private String productUnit;
+
+    /**
+     * 本次发货数量
+     */
+    private Long deliverNum;
+
+    private String dataSource;
+
+    /**
+     * 备注
+     */
+    private String remark;
+
+
+}

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

@@ -57,6 +57,11 @@ public class OrderMainBo extends BaseEntity {
     @NotNull(message = "客户ID(关联客户主表)不能为空", groups = {AddGroup.class, EditGroup.class})
     private Long customerId;
 
+    /**
+     * 客户编号
+     */
+    private String customerCode;
+
     /**
      * 用户ID(关联用户表)
      */
@@ -247,11 +252,6 @@ public class OrderMainBo extends BaseEntity {
     @NotBlank(message = "费用类型不能为空", groups = {AddGroup.class, EditGroup.class})
     private String expenseType;
 
-    /**
-     * 客户编号
-     */
-    private String customerNo;
-
     /**
      * 用户编号
      */
@@ -262,6 +262,8 @@ public class OrderMainBo extends BaseEntity {
      */
     private String status;
 
+    private String dataSource;
+
     /**
      * 备注
      */

+ 7 - 1
ruoyi-modules/ruoyi-order/src/main/java/org/dromara/order/domain/bo/OrderProductBo.java

@@ -8,9 +8,13 @@ import io.github.linpeilie.annotations.AutoMapper;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 import jakarta.validation.constraints.*;
+
 import java.math.BigDecimal;
+
 import org.dromara.common.translation.annotation.Translation;
+
 import java.util.Date;
+
 import com.fasterxml.jackson.annotation.JsonFormat;
 import org.dromara.common.translation.constant.TransConstant;
 
@@ -33,7 +37,7 @@ public class OrderProductBo extends BaseEntity {
     /**
      * 订单ID
      */
-    @NotNull(message = "订单ID不能为空", groups = { AddGroup.class, EditGroup.class })
+    @NotNull(message = "订单ID不能为空", groups = {AddGroup.class, EditGroup.class})
     private Long orderId;
 
     /**
@@ -141,6 +145,8 @@ public class OrderProductBo extends BaseEntity {
      */
     private String status;
 
+    private String dataSource;
+
     /**
      * 备注
      */

+ 86 - 0
ruoyi-modules/ruoyi-order/src/main/java/org/dromara/order/domain/vo/OrderDeliverProductVo.java

@@ -0,0 +1,86 @@
+package org.dromara.order.domain.vo;
+
+import org.dromara.order.domain.OrderDeliverProduct;
+import cn.idev.excel.annotation.ExcelIgnoreUnannotated;
+import cn.idev.excel.annotation.ExcelProperty;
+import org.dromara.common.excel.annotation.ExcelDictFormat;
+import org.dromara.common.excel.convert.ExcelDictConvert;
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.util.Date;
+
+
+/**
+ * 订单发货商品明细视图对象 order_deliver_product
+ *
+ * @author LionLi
+ * @date 2025-12-30
+ */
+@Data
+@ExcelIgnoreUnannotated
+@AutoMapper(target = OrderDeliverProduct.class)
+public class OrderDeliverProductVo implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键ID
+     */
+    @ExcelProperty(value = "主键ID")
+    private Long id;
+
+    /**
+     * 发货单
+     */
+    @ExcelProperty(value = "发货单")
+    private Long deliverId;
+
+    /**
+     * 商品编号
+     */
+    @ExcelProperty(value = "商品编号")
+    private Long productId;
+
+    /**
+     * 产品编号(业务编码)
+     */
+    private String productNo;
+
+    /**
+     * 商品名称
+     */
+    @ExcelProperty(value = "商品名称")
+    private String productName;
+
+    /**
+     * 商品单位
+     */
+    @ExcelProperty(value = "商品单位")
+    private Long productUnitId;
+
+    /**
+     * 商品单位
+     */
+    @ExcelProperty(value = "商品单位")
+    private String productUnit;
+
+    /**
+     * 本次发货数量
+     */
+    @ExcelProperty(value = "本次发货数量")
+    private Long deliverNum;
+
+    /**
+     * 备注
+     */
+    @ExcelProperty(value = "备注")
+    private String remark;
+
+    private String dataSource;
+
+
+}

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

@@ -0,0 +1,131 @@
+package org.dromara.order.domain.vo;
+
+import org.dromara.order.domain.OrderDeliver;
+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;
+import java.util.List;
+
+
+/**
+ * 订单发货主视图对象 order_deliver
+ *
+ * @author LionLi
+ * @date 2025-12-30
+ */
+@Data
+@ExcelIgnoreUnannotated
+@AutoMapper(target = OrderDeliver.class)
+public class OrderDeliverVo implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键ID
+     */
+    @ExcelProperty(value = "主键ID")
+    private Long id;
+
+    /**
+     * 订单id
+     */
+    @ExcelProperty(value = "订单id")
+    private Long orderId;
+
+    /**
+     * 订单编号
+     */
+    @ExcelProperty(value = "订单编号")
+    private String orderCode;
+
+    @ExcelProperty(value = "发货单号")
+    /**
+     * 订单发货编号
+     */
+    private String deliverCode;
+
+    /**
+     * 物流包裹号
+     */
+    @ExcelProperty(value = "物流包裹号")
+    private String logisticPackNo;
+
+    /**
+     * 发货方式
+     */
+    @ExcelProperty(value = "发货方式", converter = ExcelDictConvert.class)
+    @ExcelDictFormat(dictType = "deliver_method")
+    private String deliverMethod;
+
+    /**
+     * 送货人姓名
+     */
+    @ExcelProperty(value = "送货人姓名")
+    private String deliverMan;
+
+    /**
+     * 送货人联系电话
+     */
+    @ExcelProperty(value = "送货人联系电话")
+    private String phone;
+
+    /**
+     * 物流状态
+     */
+    @ExcelProperty(value = "物流状态")
+    private String logisticsStatus;
+
+    /**
+     * 发货备注
+     */
+    @ExcelProperty(value = "发货备注")
+    private String deliverRemark;
+
+    /**
+     * 装箱/验货备注
+     */
+    @ExcelProperty(value = "装箱/验货备注")
+    private String checklistRemark;
+
+    /**
+     * 承运物流公司
+     */
+    @ExcelProperty(value = "承运物流公司")
+    private Long logisticsCompany;
+
+    /**
+     * 物流单号
+     */
+    @ExcelProperty(value = "物流单号")
+    private String logisticNo;
+
+    /**
+     * 包裹状态
+     */
+    @ExcelProperty(value = "包裹状态")
+    private String logisticPackStatus;
+
+    /**
+     * 收货人电话
+     */
+    @ExcelProperty(value = "收货人电话")
+    private String consigneePhone;
+
+    /**
+     * 备注
+     */
+    @ExcelProperty(value = "备注")
+    private String remark;
+
+    private String dataSource;
+
+    private List<OrderDeliverProductVo> deliverProductList;
+}

+ 9 - 6
ruoyi-modules/ruoyi-order/src/main/java/org/dromara/order/domain/vo/OrderMainVo.java

@@ -69,6 +69,11 @@ public class OrderMainVo implements Serializable {
     @ExcelDictFormat(readConverterExp = "关=联客户主表")
     private Long customerId;
 
+    /**
+     * 客户编号
+     */
+    private String customerCode;
+
     /**
      * 用户ID(关联用户表)
      */
@@ -299,12 +304,6 @@ public class OrderMainVo implements Serializable {
     @ExcelDictFormat(dictType = "fee_type")
     private String expenseType;
 
-    /**
-     * 客户编号
-     */
-    @ExcelProperty(value = "客户编号")
-    private String customerNo;
-
     /**
      * 用户编号
      */
@@ -324,7 +323,11 @@ public class OrderMainVo implements Serializable {
     @ExcelProperty(value = "备注")
     private String remark;
 
+    private String dataSource;
+
     private List<OrderProductVo> orderProductList;
 
+    private List<OrderDeliverProductVo> deliverProductList;
+
 
 }

+ 5 - 1
ruoyi-modules/ruoyi-order/src/main/java/org/dromara/order/domain/vo/OrderProductVo.java

@@ -1,8 +1,11 @@
 package org.dromara.order.domain.vo;
 
 import java.math.BigDecimal;
+
 import org.dromara.common.translation.annotation.Translation;
+
 import java.util.Date;
+
 import com.fasterxml.jackson.annotation.JsonFormat;
 import org.dromara.common.translation.constant.TransConstant;
 import org.dromara.order.domain.OrderProduct;
@@ -18,7 +21,6 @@ import java.io.Serializable;
 import java.util.Date;
 
 
-
 /**
  * 订单商品明细视图对象 order_product
  *
@@ -189,5 +191,7 @@ public class OrderProductVo implements Serializable {
     @ExcelProperty(value = "备注")
     private String remark;
 
+    private String dataSource;
+
 
 }

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

@@ -0,0 +1,13 @@
+package org.dromara.order.domain.vo;
+
+import lombok.Data;
+
+import java.io.Serializable;
+
+@Data
+public class OrderQuantitySummary implements Serializable {
+    
+    private Long orderTotalQty;
+
+    private Long deliveredTotalQty;
+}

+ 40 - 0
ruoyi-modules/ruoyi-order/src/main/java/org/dromara/order/domain/vo/OrderStatusStats.java

@@ -0,0 +1,40 @@
+package org.dromara.order.domain.vo;
+
+import lombok.Data;
+
+import java.io.Serializable;
+
+@Data
+public class OrderStatusStats implements Serializable {
+
+
+    /**
+     * 待付款订单数量
+     */
+    private Long pendingPaymentCount;
+
+    /**
+     * 待发货订单数量
+     */
+    private Long pendingShipmentCount;
+
+    /**
+     * 已发货订单数量
+     */
+    private Long shippedCount;
+
+    /**
+     * 已完成订单数量
+     */
+    private Long completedCount;
+
+    /**
+     * 已关闭订单数量
+     */
+    private Long closedCount;
+
+    /**
+     * 订单总数
+     */
+    private Long totalCount;
+}

+ 60 - 0
ruoyi-modules/ruoyi-order/src/main/java/org/dromara/order/dubbo/RemoteExternalOrderServiceImpl.java

@@ -0,0 +1,60 @@
+package org.dromara.order.dubbo;
+
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.dubbo.config.annotation.DubboService;
+import org.dromara.order.domain.bo.OrderProductBo;
+import org.dromara.order.service.IOrderProductService;
+import org.dromara.product.api.RemoteExternalOrderService;
+import org.dromara.product.api.domain.dto.OrderNoticeDto;
+import org.dromara.product.api.domain.dto.OrderPushDto;
+import org.springframework.stereotype.Service;
+
+/**
+ * @author
+ * @date 2025/12/30 下午7:12
+ */
+@Slf4j
+@Service
+@RequiredArgsConstructor
+@DubboService
+public class RemoteExternalOrderServiceImpl implements RemoteExternalOrderService {
+
+     private final IOrderProductService orderProductService;
+
+    /**
+     * 推送订单
+     *
+     * @param dto
+     */
+    @Override
+    public OrderNoticeDto pushOrder(OrderPushDto dto) {
+        OrderProductBo  bo = new OrderProductBo();
+//         bo.setOrderNo(dto.getOrder_id());
+//         bo.setProductNo(dto.getSku());
+//         bo.setProductName(dto.getName());
+//         bo.setProductUnit(dto.getMode());
+//        orderProductService.insertByBo(bo);
+        return null;
+    }
+
+    /**
+     * 确认订单
+     *
+     * @param orderId
+     */
+    @Override
+    public void confirmOrder(Long orderId) {
+
+    }
+
+    /**
+     * 订单状态通知
+     *
+     * @param bo
+     */
+    @Override
+    public void notice(OrderNoticeDto bo) {
+
+    }
+}

+ 15 - 0
ruoyi-modules/ruoyi-order/src/main/java/org/dromara/order/mapper/OrderDeliverMapper.java

@@ -0,0 +1,15 @@
+package org.dromara.order.mapper;
+
+import org.dromara.order.domain.OrderDeliver;
+import org.dromara.order.domain.vo.OrderDeliverVo;
+import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
+
+/**
+ * 订单发货主Mapper接口
+ *
+ * @author LionLi
+ * @date 2025-12-30
+ */
+public interface OrderDeliverMapper extends BaseMapperPlus<OrderDeliver, OrderDeliverVo> {
+
+}

+ 22 - 0
ruoyi-modules/ruoyi-order/src/main/java/org/dromara/order/mapper/OrderDeliverProductMapper.java

@@ -0,0 +1,22 @@
+package org.dromara.order.mapper;
+
+import org.apache.dubbo.remoting.http12.rest.Param;
+import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
+import org.dromara.order.domain.OrderDeliverProduct;
+import org.dromara.order.domain.vo.OrderDeliverProductVo;
+
+import java.util.List;
+
+/**
+ * 订单发货商品明细Mapper接口
+ *
+ * @author LionLi
+ * @date 2025-12-30
+ */
+public interface OrderDeliverProductMapper extends BaseMapperPlus<OrderDeliverProduct, OrderDeliverProductVo> {
+
+    void deleteByDeliverId(@Param("deliverId") Long deliverId);
+
+    List<OrderDeliverProductVo> selectDeliverProductsByOrderId(@Param("orderId") Long orderId);
+
+}

+ 3 - 0
ruoyi-modules/ruoyi-order/src/main/java/org/dromara/order/mapper/OrderMainMapper.java

@@ -3,6 +3,7 @@ package org.dromara.order.mapper;
 import org.dromara.order.domain.OrderMain;
 import org.dromara.order.domain.vo.OrderMainVo;
 import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
+import org.dromara.order.domain.vo.OrderStatusStats;
 
 /**
  * 订单主信息Mapper接口
@@ -12,4 +13,6 @@ import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
  */
 public interface OrderMainMapper extends BaseMapperPlus<OrderMain, OrderMainVo> {
 
+    OrderStatusStats selectOrderStatusCounts();
+
 }

+ 7 - 0
ruoyi-modules/ruoyi-order/src/main/java/org/dromara/order/mapper/OrderProductMapper.java

@@ -1,8 +1,12 @@
 package org.dromara.order.mapper;
 
+import org.apache.ibatis.annotations.Param;
 import org.dromara.order.domain.OrderProduct;
 import org.dromara.order.domain.vo.OrderProductVo;
 import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
+import org.dromara.order.domain.vo.OrderQuantitySummary;
+
+import java.util.List;
 
 /**
  * 订单商品明细Mapper接口
@@ -12,4 +16,7 @@ import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
  */
 public interface OrderProductMapper extends BaseMapperPlus<OrderProduct, OrderProductVo> {
 
+    List<OrderProductVo> selectProductsWithDelivered(@Param("orderId") Long orderId);
+
+    OrderQuantitySummary selectOrderAndDeliveredQuantity(@Param("orderId") Long orderId);
 }

+ 70 - 0
ruoyi-modules/ruoyi-order/src/main/java/org/dromara/order/service/IOrderDeliverProductService.java

@@ -0,0 +1,70 @@
+package org.dromara.order.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import org.dromara.order.domain.OrderDeliverProduct;
+import org.dromara.order.domain.vo.OrderDeliverProductVo;
+import org.dromara.order.domain.bo.OrderDeliverProductBo;
+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 2025-12-30
+ */
+public interface IOrderDeliverProductService extends IService<OrderDeliverProduct>{
+
+    /**
+     * 查询订单发货商品明细
+     *
+     * @param id 主键
+     * @return 订单发货商品明细
+     */
+    OrderDeliverProductVo queryById(Long id);
+
+    /**
+     * 分页查询订单发货商品明细列表
+     *
+     * @param bo        查询条件
+     * @param pageQuery 分页参数
+     * @return 订单发货商品明细分页列表
+     */
+    TableDataInfo<OrderDeliverProductVo> queryPageList(OrderDeliverProductBo bo, PageQuery pageQuery);
+
+    /**
+     * 查询符合条件的订单发货商品明细列表
+     *
+     * @param bo 查询条件
+     * @return 订单发货商品明细列表
+     */
+    List<OrderDeliverProductVo> queryList(OrderDeliverProductBo bo);
+
+    /**
+     * 新增订单发货商品明细
+     *
+     * @param bo 订单发货商品明细
+     * @return 是否新增成功
+     */
+    Boolean insertByBo(OrderDeliverProductBo bo);
+
+    /**
+     * 修改订单发货商品明细
+     *
+     * @param bo 订单发货商品明细
+     * @return 是否修改成功
+     */
+    Boolean updateByBo(OrderDeliverProductBo bo);
+
+    /**
+     * 校验并批量删除订单发货商品明细信息
+     *
+     * @param ids     待删除的主键集合
+     * @param isValid 是否进行有效性校验
+     * @return 是否删除成功
+     */
+    Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
+}

+ 70 - 0
ruoyi-modules/ruoyi-order/src/main/java/org/dromara/order/service/IOrderDeliverService.java

@@ -0,0 +1,70 @@
+package org.dromara.order.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import org.dromara.order.domain.OrderDeliver;
+import org.dromara.order.domain.vo.OrderDeliverVo;
+import org.dromara.order.domain.bo.OrderDeliverBo;
+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 2025-12-30
+ */
+public interface IOrderDeliverService extends IService<OrderDeliver>{
+
+    /**
+     * 查询订单发货主
+     *
+     * @param id 主键
+     * @return 订单发货主
+     */
+    OrderDeliverVo queryById(Long id);
+
+    /**
+     * 分页查询订单发货主列表
+     *
+     * @param bo        查询条件
+     * @param pageQuery 分页参数
+     * @return 订单发货主分页列表
+     */
+    TableDataInfo<OrderDeliverVo> queryPageList(OrderDeliverBo bo, PageQuery pageQuery);
+
+    /**
+     * 查询符合条件的订单发货主列表
+     *
+     * @param bo 查询条件
+     * @return 订单发货主列表
+     */
+    List<OrderDeliverVo> queryList(OrderDeliverBo bo);
+
+    /**
+     * 新增订单发货主
+     *
+     * @param bo 订单发货主
+     * @return 是否新增成功
+     */
+    Boolean insertByBo(OrderDeliverBo bo);
+
+    /**
+     * 修改订单发货主
+     *
+     * @param bo 订单发货主
+     * @return 是否修改成功
+     */
+    Boolean updateByBo(OrderDeliverBo bo);
+
+    /**
+     * 校验并批量删除订单发货主信息
+     *
+     * @param ids     待删除的主键集合
+     * @param isValid 是否进行有效性校验
+     * @return 是否删除成功
+     */
+    Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
+}

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

@@ -6,6 +6,7 @@ import org.dromara.order.domain.vo.OrderMainVo;
 import org.dromara.order.domain.bo.OrderMainBo;
 import org.dromara.common.mybatis.core.page.TableDataInfo;
 import org.dromara.common.mybatis.core.page.PageQuery;
+import org.dromara.order.domain.vo.OrderStatusStats;
 
 import java.util.Collection;
 import java.util.List;
@@ -43,6 +44,8 @@ public interface IOrderMainService extends IService<OrderMain> {
      */
     List<OrderMainVo> queryList(OrderMainBo bo);
 
+    OrderStatusStats queryOrderStatusStats();
+
     /**
      * 新增订单主信息
      *

+ 139 - 0
ruoyi-modules/ruoyi-order/src/main/java/org/dromara/order/service/impl/OrderDeliverProductServiceImpl.java

@@ -0,0 +1,139 @@
+package org.dromara.order.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.order.domain.bo.OrderDeliverProductBo;
+import org.dromara.order.domain.vo.OrderDeliverProductVo;
+import org.dromara.order.domain.OrderDeliverProduct;
+import org.dromara.order.mapper.OrderDeliverProductMapper;
+import org.dromara.order.service.IOrderDeliverProductService;
+
+import java.util.List;
+import java.util.Map;
+import java.util.Collection;
+
+/**
+ * 订单发货商品明细Service业务层处理
+ *
+ * @author LionLi
+ * @date 2025-12-30
+ */
+@Slf4j
+@RequiredArgsConstructor
+@Service
+public class OrderDeliverProductServiceImpl  extends ServiceImpl<OrderDeliverProductMapper, OrderDeliverProduct> implements IOrderDeliverProductService {
+
+    private final OrderDeliverProductMapper baseMapper;
+
+    /**
+     * 查询订单发货商品明细
+     *
+     * @param id 主键
+     * @return 订单发货商品明细
+     */
+    @Override
+    public OrderDeliverProductVo queryById(Long id){
+        return baseMapper.selectVoById(id);
+    }
+
+    /**
+     * 分页查询订单发货商品明细列表
+     *
+     * @param bo        查询条件
+     * @param pageQuery 分页参数
+     * @return 订单发货商品明细分页列表
+     */
+    @Override
+    public TableDataInfo<OrderDeliverProductVo> queryPageList(OrderDeliverProductBo bo, PageQuery pageQuery) {
+        LambdaQueryWrapper<OrderDeliverProduct> lqw = buildQueryWrapper(bo);
+        Page<OrderDeliverProductVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
+        return TableDataInfo.build(result);
+    }
+
+    /**
+     * 查询符合条件的订单发货商品明细列表
+     *
+     * @param bo 查询条件
+     * @return 订单发货商品明细列表
+     */
+    @Override
+    public List<OrderDeliverProductVo> queryList(OrderDeliverProductBo bo) {
+        LambdaQueryWrapper<OrderDeliverProduct> lqw = buildQueryWrapper(bo);
+        return baseMapper.selectVoList(lqw);
+    }
+
+    private LambdaQueryWrapper<OrderDeliverProduct> buildQueryWrapper(OrderDeliverProductBo bo) {
+        Map<String, Object> params = bo.getParams();
+        LambdaQueryWrapper<OrderDeliverProduct> lqw = Wrappers.lambdaQuery();
+        lqw.orderByAsc(OrderDeliverProduct::getId);
+        lqw.eq(bo.getDeliverId() != null, OrderDeliverProduct::getDeliverId, bo.getDeliverId());
+        lqw.eq(bo.getProductId() != null, OrderDeliverProduct::getProductId, bo.getProductId());
+        lqw.like(StringUtils.isNotBlank(bo.getProductName()), OrderDeliverProduct::getProductName, bo.getProductName());
+        lqw.eq(bo.getProductUnitId() != null, OrderDeliverProduct::getProductUnitId, bo.getProductUnitId());
+        lqw.eq(StringUtils.isNotBlank(bo.getProductUnit()), OrderDeliverProduct::getProductUnit, bo.getProductUnit());
+        lqw.eq(bo.getDeliverNum() != null, OrderDeliverProduct::getDeliverNum, bo.getDeliverNum());
+        lqw.eq(StringUtils.isNotBlank(bo.getPlatformCode()), OrderDeliverProduct::getPlatformCode, bo.getPlatformCode());
+        return lqw;
+    }
+
+    /**
+     * 新增订单发货商品明细
+     *
+     * @param bo 订单发货商品明细
+     * @return 是否新增成功
+     */
+    @Override
+    public Boolean insertByBo(OrderDeliverProductBo bo) {
+        OrderDeliverProduct add = MapstructUtils.convert(bo, OrderDeliverProduct.class);
+        validEntityBeforeSave(add);
+        boolean flag = baseMapper.insert(add) > 0;
+        if (flag) {
+            bo.setId(add.getId());
+        }
+        return flag;
+    }
+
+    /**
+     * 修改订单发货商品明细
+     *
+     * @param bo 订单发货商品明细
+     * @return 是否修改成功
+     */
+    @Override
+    public Boolean updateByBo(OrderDeliverProductBo bo) {
+        OrderDeliverProduct update = MapstructUtils.convert(bo, OrderDeliverProduct.class);
+        validEntityBeforeSave(update);
+        return baseMapper.updateById(update) > 0;
+    }
+
+    /**
+     * 保存前的数据校验
+     */
+    private void validEntityBeforeSave(OrderDeliverProduct entity){
+        //TODO 做一些数据校验,如唯一约束
+    }
+
+    /**
+     * 校验并批量删除订单发货商品明细信息
+     *
+     * @param ids     待删除的主键集合
+     * @param isValid 是否进行有效性校验
+     * @return 是否删除成功
+     */
+    @Override
+    public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
+        if(isValid){
+            //TODO 做一些业务上的校验,判断是否需要校验
+        }
+        return baseMapper.deleteByIds(ids) > 0;
+    }
+}

+ 266 - 0
ruoyi-modules/ruoyi-order/src/main/java/org/dromara/order/service/impl/OrderDeliverServiceImpl.java

@@ -0,0 +1,266 @@
+package org.dromara.order.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.dromara.common.core.enums.OrderStatus;
+import org.dromara.common.core.utils.MapstructUtils;
+import org.dromara.common.core.utils.StringUtils;
+import org.dromara.common.mybatis.core.page.PageQuery;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.common.redis.utils.SequenceUtils;
+import org.dromara.order.domain.OrderDeliver;
+import org.dromara.order.domain.OrderDeliverProduct;
+import org.dromara.order.domain.OrderMain;
+import org.dromara.order.domain.bo.OrderDeliverBo;
+import org.dromara.order.domain.bo.OrderDeliverProductBo;
+import org.dromara.order.domain.vo.OrderDeliverVo;
+import org.dromara.order.domain.vo.OrderQuantitySummary;
+import org.dromara.order.mapper.OrderDeliverMapper;
+import org.dromara.order.mapper.OrderDeliverProductMapper;
+import org.dromara.order.mapper.OrderMainMapper;
+import org.dromara.order.mapper.OrderProductMapper;
+import org.dromara.order.service.IOrderDeliverService;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.Collection;
+import java.util.List;
+import java.util.Map;
+import java.util.Optional;
+import java.util.stream.Collectors;
+
+/**
+ * 订单发货主Service业务层处理
+ *
+ * @author LionLi
+ * @date 2025-12-30
+ */
+@Slf4j
+@RequiredArgsConstructor
+@Service
+public class OrderDeliverServiceImpl extends ServiceImpl<OrderDeliverMapper, OrderDeliver> implements IOrderDeliverService {
+
+    private final OrderDeliverMapper baseMapper;
+
+    private final OrderMainMapper orderMainMapper;
+
+    private final OrderProductMapper orderProductMapper;
+
+    private final OrderDeliverProductMapper orderDeliverProductMapper;
+
+    /**
+     * 查询订单发货主
+     *
+     * @param id 主键
+     * @return 订单发货主
+     */
+    @Override
+    public OrderDeliverVo queryById(Long id) {
+        OrderDeliverVo orderDeliverVo = baseMapper.selectVoById(id);
+        orderDeliverVo.setDeliverProductList(orderDeliverProductMapper.selectVoList(new LambdaQueryWrapper<OrderDeliverProduct>()
+            .eq(OrderDeliverProduct::getDeliverId, id)));
+        return orderDeliverVo;
+    }
+
+    /**
+     * 分页查询订单发货主列表
+     *
+     * @param bo        查询条件
+     * @param pageQuery 分页参数
+     * @return 订单发货主分页列表
+     */
+    @Override
+    public TableDataInfo<OrderDeliverVo> queryPageList(OrderDeliverBo bo, PageQuery pageQuery) {
+        LambdaQueryWrapper<OrderDeliver> lqw = buildQueryWrapper(bo);
+        Page<OrderDeliverVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
+        return TableDataInfo.build(result);
+    }
+
+    /**
+     * 查询符合条件的订单发货主列表
+     *
+     * @param bo 查询条件
+     * @return 订单发货主列表
+     */
+    @Override
+    public List<OrderDeliverVo> queryList(OrderDeliverBo bo) {
+        LambdaQueryWrapper<OrderDeliver> lqw = buildQueryWrapper(bo);
+        return baseMapper.selectVoList(lqw);
+    }
+
+    private LambdaQueryWrapper<OrderDeliver> buildQueryWrapper(OrderDeliverBo bo) {
+        Map<String, Object> params = bo.getParams();
+        LambdaQueryWrapper<OrderDeliver> lqw = Wrappers.lambdaQuery();
+        lqw.orderByAsc(OrderDeliver::getId);
+        lqw.eq(bo.getOrderId() != null, OrderDeliver::getOrderId, bo.getOrderId());
+        lqw.eq(StringUtils.isNotBlank(bo.getOrderCode()), OrderDeliver::getOrderCode, bo.getOrderCode());
+        lqw.eq(StringUtils.isNotBlank(bo.getLogisticPackNo()), OrderDeliver::getLogisticPackNo, bo.getLogisticPackNo());
+        lqw.eq(StringUtils.isNotBlank(bo.getDeliverMethod()), OrderDeliver::getDeliverMethod, bo.getDeliverMethod());
+        lqw.eq(StringUtils.isNotBlank(bo.getDeliverMan()), OrderDeliver::getDeliverMan, bo.getDeliverMan());
+        lqw.eq(StringUtils.isNotBlank(bo.getPhone()), OrderDeliver::getPhone, bo.getPhone());
+        lqw.eq(StringUtils.isNotBlank(bo.getLogisticsStatus()), OrderDeliver::getLogisticsStatus, bo.getLogisticsStatus());
+        lqw.eq(StringUtils.isNotBlank(bo.getDeliverRemark()), OrderDeliver::getDeliverRemark, bo.getDeliverRemark());
+        lqw.eq(StringUtils.isNotBlank(bo.getChecklistRemark()), OrderDeliver::getChecklistRemark, bo.getChecklistRemark());
+        lqw.eq(bo.getLogisticsCompany() != null, OrderDeliver::getLogisticsCompany, bo.getLogisticsCompany());
+        lqw.eq(StringUtils.isNotBlank(bo.getLogisticNo()), OrderDeliver::getLogisticNo, bo.getLogisticNo());
+        lqw.eq(StringUtils.isNotBlank(bo.getLogisticPackStatus()), OrderDeliver::getLogisticPackStatus, bo.getLogisticPackStatus());
+        lqw.eq(StringUtils.isNotBlank(bo.getConsigneePhone()), OrderDeliver::getConsigneePhone, bo.getConsigneePhone());
+        lqw.eq(StringUtils.isNotBlank(bo.getPlatformCode()), OrderDeliver::getPlatformCode, bo.getPlatformCode());
+        return lqw;
+    }
+
+    /**
+     * 新增订单发货主
+     *
+     * @param bo 订单发货主
+     * @return 是否新增成功
+     */
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public Boolean insertByBo(OrderDeliverBo bo) {
+        try {
+            // 1. 生成发货单号
+            bo.setDeliverCode(SequenceUtils.nextIdDateTimePadded(""));
+
+            Long orderId = bo.getOrderId();
+
+            // 2. 查询订单主信息(用于后续状态更新)
+            OrderMain orderMain = orderMainMapper.selectById(orderId);
+            if (orderMain == null) {
+                throw new RuntimeException("订单不存在: " + orderId);
+            }
+
+            // 3. 获取 订单总数量 和 已发货总数量
+            OrderQuantitySummary summary = orderProductMapper.selectOrderAndDeliveredQuantity(orderId);
+            long orderTotalQty = Optional.ofNullable(summary.getOrderTotalQty()).orElse(0L);
+            long deliveredTotalQty = Optional.ofNullable(summary.getDeliveredTotalQty()).orElse(0L);
+
+            // 4. 新增本次发货数量(从 BO 中累加)
+            long currentDeliverQty = bo.getOrderDeliverProducts().stream()
+                .mapToLong(OrderDeliverProductBo::getDeliverNum)
+                .sum();
+
+            // 5. 计算发货后总量
+            long newDeliveredTotalQty = deliveredTotalQty + currentDeliverQty;
+
+            // 6. 判断新状态
+            String newStatus;
+            if (newDeliveredTotalQty >= orderTotalQty) {
+                newStatus = OrderStatus.SHIPPED.getCode(); // 已全部发货
+            } else if (newDeliveredTotalQty > 0) {
+                newStatus = OrderStatus.PARTIALLY_SHIPPED.getCode(); // 部分发货
+            } else {
+                newStatus = orderMain.getOrderStatus(); // 无发货,保持原状态
+            }
+
+            // 7. 插入发货单主表
+            OrderDeliver deliver = MapstructUtils.convert(bo, OrderDeliver.class);
+            validEntityBeforeSave(deliver);
+            boolean inserted = baseMapper.insert(deliver) > 0;
+            if (!inserted) {
+                return false;
+            }
+            bo.setId(deliver.getId());
+
+            // 8. 插入发货商品明细
+            saveOrderDeliverProducts(deliver.getId(), bo.getOrderDeliverProducts(), false);
+
+            // 9. 更新订单主表状态
+            LambdaUpdateWrapper<OrderMain> updateWrapper = new LambdaUpdateWrapper<OrderMain>()
+                .eq(OrderMain::getId, orderId)
+                .set(OrderMain::getOrderStatus, newStatus);
+
+            orderMainMapper.update(null, updateWrapper);
+
+            log.info("新增订单发货单成功:{}", bo.getId());
+            return true;
+        } catch (RuntimeException e) {
+            log.error("新增订单发货主失败:{}", e.getMessage(), e);
+            throw new RuntimeException(e);
+        }
+    }
+
+    /**
+     * 修改订单发货主
+     *
+     * @param bo 订单发货主
+     * @return 是否修改成功
+     */
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public Boolean updateByBo(OrderDeliverBo bo) {
+        try {
+            OrderDeliver update = MapstructUtils.convert(bo, OrderDeliver.class);
+            validEntityBeforeSave(update);
+            boolean flag = baseMapper.updateById(update) > 0;
+
+            if (flag) {
+                // 保存商品明细(编辑时先删除再新增)
+                saveOrderDeliverProducts(bo.getId(), bo.getOrderDeliverProducts(), true);
+            }
+            log.info("修改订单发货主成功:{}", bo.getId());
+            return flag;
+        } catch (Exception e) {
+            log.error("修改订单发货主失败:{}", e.getMessage(), e);
+            throw new RuntimeException(e);
+        }
+    }
+
+    /**
+     * 保存发货商品明细(公共方法)
+     *
+     * @param deliverId   发货单ID
+     * @param productBos  商品明细列表
+     * @param deleteFirst 是否先删除已有明细(true=编辑,false=新增)
+     */
+    private void saveOrderDeliverProducts(Long deliverId, List<OrderDeliverProductBo> productBos, boolean deleteFirst) {
+        if (deliverId == null || productBos == null || productBos.isEmpty()) {
+            return;
+        }
+
+        // 编辑时:先删除明细
+        if (deleteFirst) {
+            orderDeliverProductMapper.deleteByDeliverId(deliverId);
+        }
+
+        // 批量插入新明细
+        List<OrderDeliverProduct> products = productBos.stream()
+            .map(bo -> {
+                OrderDeliverProduct product = MapstructUtils.convert(bo, OrderDeliverProduct.class);
+                product.setDeliverId(deliverId);
+                return product;
+            })
+            .collect(Collectors.toList());
+
+        if (!products.isEmpty()) {
+            orderDeliverProductMapper.insertBatch(products);
+        }
+    }
+
+    /**
+     * 保存前的数据校验
+     */
+    private void validEntityBeforeSave(OrderDeliver entity) {
+        //TODO 做一些数据校验,如唯一约束
+    }
+
+    /**
+     * 校验并批量删除订单发货主信息
+     *
+     * @param ids     待删除的主键集合
+     * @param isValid 是否进行有效性校验
+     * @return 是否删除成功
+     */
+    @Override
+    public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
+        if (isValid) {
+            //TODO 做一些业务上的校验,判断是否需要校验
+        }
+        return baseMapper.deleteByIds(ids) > 0;
+    }
+}

+ 68 - 41
ruoyi-modules/ruoyi-order/src/main/java/org/dromara/order/service/impl/OrderMainServiceImpl.java

@@ -18,6 +18,9 @@ import org.dromara.order.domain.bo.OrderMainBo;
 import org.dromara.order.domain.bo.OrderProductBo;
 import org.dromara.order.domain.vo.OrderMainVo;
 import org.dromara.order.domain.vo.OrderProductVo;
+import org.dromara.order.domain.vo.OrderStatusStats;
+import org.dromara.order.mapper.OrderDeliverMapper;
+import org.dromara.order.mapper.OrderDeliverProductMapper;
 import org.dromara.order.mapper.OrderMainMapper;
 import org.dromara.order.mapper.OrderProductMapper;
 import org.dromara.order.service.IOrderMainService;
@@ -44,6 +47,10 @@ public class OrderMainServiceImpl extends ServiceImpl<OrderMainMapper, OrderMain
 
     private final OrderProductMapper orderProductMapper;
 
+    private final OrderDeliverMapper orderDeliverMapper;
+
+    private final OrderDeliverProductMapper orderDeliverProductMapper;
+
     /**
      * 查询订单主信息
      *
@@ -59,13 +66,14 @@ public class OrderMainServiceImpl extends ServiceImpl<OrderMainMapper, OrderMain
         }
 
         // 2. 查询关联的商品列表
-        List<OrderProductVo> orderProductVoList = orderProductMapper.selectVoList(
-            new LambdaQueryWrapper<OrderProduct>().eq(OrderProduct::getOrderId, orderMainVo.getId())
-        );
+        List<OrderProductVo> orderProductVoList = orderProductMapper.selectProductsWithDelivered(orderMainVo.getId());
 
         // 3. 组装数据
         orderMainVo.setOrderProductList(orderProductVoList);
 
+        orderMainVo.setDeliverProductList(
+            orderDeliverProductMapper.selectDeliverProductsByOrderId(orderMainVo.getId())
+        );
         // 4. 返回已组装好的对象
         return orderMainVo;
     }
@@ -81,9 +89,16 @@ public class OrderMainServiceImpl extends ServiceImpl<OrderMainMapper, OrderMain
     public TableDataInfo<OrderMainVo> queryPageList(OrderMainBo bo, PageQuery pageQuery) {
         LambdaQueryWrapper<OrderMain> lqw = buildQueryWrapper(bo);
         Page<OrderMainVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
+        List<OrderMainVo> records = result.getRecords();
+
         return TableDataInfo.build(result);
     }
 
+    @Override
+    public OrderStatusStats queryOrderStatusStats() {
+        return baseMapper.selectOrderStatusCounts();
+    }
+
     /**
      * 查询符合条件的订单主信息列表
      *
@@ -101,6 +116,7 @@ public class OrderMainServiceImpl extends ServiceImpl<OrderMainMapper, OrderMain
         LambdaQueryWrapper<OrderMain> lqw = Wrappers.lambdaQuery();
         lqw.orderByAsc(OrderMain::getId);
         lqw.eq(StringUtils.isNotBlank(bo.getOrderNo()), OrderMain::getOrderNo, bo.getOrderNo());
+        lqw.eq(StringUtils.isNotBlank(bo.getCustomerCode()), OrderMain::getCustomerCode, bo.getCustomerCode());
         lqw.eq(StringUtils.isNotBlank(bo.getShipmentNo()), OrderMain::getShipmentNo, bo.getShipmentNo());
         lqw.eq(StringUtils.isNotBlank(bo.getSubOrderNo()), OrderMain::getSubOrderNo, bo.getSubOrderNo());
         lqw.eq(bo.getCompanyId() != null, OrderMain::getCompanyId, bo.getCompanyId());
@@ -142,7 +158,6 @@ public class OrderMainServiceImpl extends ServiceImpl<OrderMainMapper, OrderMain
         lqw.eq(StringUtils.isNotBlank(bo.getProductCode()), OrderMain::getProductCode, bo.getProductCode());
         lqw.eq(StringUtils.isNotBlank(bo.getCancelReason()), OrderMain::getCancelReason, bo.getCancelReason());
         lqw.eq(StringUtils.isNotBlank(bo.getExpenseType()), OrderMain::getExpenseType, bo.getExpenseType());
-        lqw.eq(StringUtils.isNotBlank(bo.getCustomerNo()), OrderMain::getCustomerNo, bo.getCustomerNo());
         lqw.eq(StringUtils.isNotBlank(bo.getStatus()), OrderMain::getStatus, bo.getStatus());
         return lqw;
     }
@@ -156,48 +171,53 @@ public class OrderMainServiceImpl extends ServiceImpl<OrderMainMapper, OrderMain
     @Transactional(rollbackFor = Exception.class)
     @Override
     public Boolean insertByBo(OrderMainBo bo) {
-        // 1. 校验商品列表
-        List<OrderProductBo> orderProductBos = bo.getOrderProductBos();
-        if (CollUtil.isEmpty(orderProductBos)) {
-            throw new IllegalArgumentException("订单商品列表不能为空");
-        }
-
-        // 可选:校验每个商品的数量、价格等
-        for (OrderProductBo productBo : orderProductBos) {
-            if (productBo.getOrderQuantity() == null || productBo.getOrderQuantity() <= 0) {
-                throw new IllegalArgumentException("商品数量必须大于0");
+        try {
+            // 1. 校验商品列表
+            List<OrderProductBo> orderProductBos = bo.getOrderProductBos();
+            if (CollUtil.isEmpty(orderProductBos)) {
+                throw new IllegalArgumentException("订单商品列表不能为空");
             }
-        }
 
-        // 2. 生成订单号并转换主单
-        String orderNo = SequenceUtils.generateOrderCode("RS");
-        bo.setOrderNo(orderNo);
-        OrderMain orderMain = MapstructUtils.convert(bo, OrderMain.class);
+            // 可选:校验每个商品的数量、价格等
+            for (OrderProductBo productBo : orderProductBos) {
+                if (productBo.getOrderQuantity() == null || productBo.getOrderQuantity() <= 0) {
+                    throw new IllegalArgumentException("商品数量必须大于0");
+                }
+            }
 
-        validEntityBeforeSave(orderMain);
+            // 2. 生成订单号并转换主单
+            String orderNo = SequenceUtils.generateOrderCode("RS");
+            bo.setOrderNo(orderNo);
+            OrderMain orderMain = MapstructUtils.convert(bo, OrderMain.class);
 
-        // 3. 插入主订单
-        boolean mainSaved = baseMapper.insert(orderMain) > 0;
-        if (!mainSaved) {
-            throw new RuntimeException("主订单保存失败");
-        }
+            validEntityBeforeSave(orderMain);
 
-        // 4. 转换并填充子订单商品
-        Long orderId = orderMain.getId();
-        List<OrderProduct> orderProducts = orderProductBos.stream()
-            .map(productBo -> {
-                OrderProduct product = MapstructUtils.convert(productBo, OrderProduct.class);
-                product.setOrderId(orderId);      // 关联主单ID
-                product.setOrderNo(orderNo);      // 关联订单号
-                return product;
-            })
-            .collect(Collectors.toList());
+            // 3. 插入主订单
+            boolean mainSaved = baseMapper.insert(orderMain) > 0;
+            if (!mainSaved) {
+                throw new RuntimeException("主订单保存失败");
+            }
 
-        // 5. 批量插入订单商品
-        boolean productsSaved = orderProductMapper.insertBatch(orderProducts);
+            // 4. 转换并填充子订单商品
+            Long orderId = orderMain.getId();
+            List<OrderProduct> orderProducts = orderProductBos.stream()
+                .map(productBo -> {
+                    OrderProduct product = MapstructUtils.convert(productBo, OrderProduct.class);
+                    product.setOrderId(orderId);      // 关联主单ID
+                    product.setOrderNo(orderNo);      // 关联订单号
+                    return product;
+                })
+                .collect(Collectors.toList());
 
+            // 5. 批量插入订单商品
+            boolean productsSaved = orderProductMapper.insertBatch(orderProducts);
 
-        return productsSaved;
+            log.info("成功新增订单,ID: {}", orderId);
+            return productsSaved;
+        } catch (RuntimeException e) {
+            log.error("新增订单失败: {}", e.getMessage(), e);
+            throw new RuntimeException("新增订单失败: " + e.getMessage());
+        }
     }
 
     /**
@@ -206,11 +226,18 @@ public class OrderMainServiceImpl extends ServiceImpl<OrderMainMapper, OrderMain
      * @param bo 订单主信息
      * @return 是否修改成功
      */
+    @Transactional(rollbackFor = Exception.class)
     @Override
     public Boolean updateByBo(OrderMainBo bo) {
-        OrderMain update = MapstructUtils.convert(bo, OrderMain.class);
-        validEntityBeforeSave(update);
-        return baseMapper.updateById(update) > 0;
+        try {
+            OrderMain update = MapstructUtils.convert(bo, OrderMain.class);
+            validEntityBeforeSave(update);
+            log.info("成功更新订单,ID: {}", bo.getId());
+            return baseMapper.updateById(update) > 0;
+        } catch (Exception e) {
+            log.error("更新订单失败: {}", e.getMessage(), e);
+            throw new RuntimeException("更新订单失败: " + e.getMessage());
+        }
     }
 
     /**

+ 1 - 1
ruoyi-modules/ruoyi-order/src/main/resources/mapper.order/OrderProductMapper.xml → ruoyi-modules/ruoyi-order/src/main/resources/mapper/order/OrderDeliverMapper.xml

@@ -2,6 +2,6 @@
 <!DOCTYPE mapper
 PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
-<mapper namespace="org.dromara.order.mapper.OrderProductMapper">
+<mapper namespace="org.dromara.order.mapper.OrderDeliverMapper">
 
 </mapper>

+ 20 - 0
ruoyi-modules/ruoyi-order/src/main/resources/mapper/order/OrderDeliverProductMapper.xml

@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+    PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+    "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="org.dromara.order.mapper.OrderDeliverProductMapper">
+
+    <delete id="deleteByDeliverId" parameterType="java.lang.Long">
+        DELETE
+        FROM order_deliver_product
+        WHERE deliver_id = #{deliverId}
+    </delete>
+
+    <select id="selectDeliverProductsByOrderId" resultType="org.dromara.order.domain.vo.OrderDeliverProductVo">
+        SELECT odp.*
+        FROM order_deliver_product odp
+                 JOIN order_deliver od ON odp.deliver_id = od.id
+        WHERE od.order_id = #{orderId}
+    </select>
+
+</mapper>

+ 17 - 0
ruoyi-modules/ruoyi-order/src/main/resources/mapper/order/OrderMainMapper.xml

@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+    PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+    "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="org.dromara.order.mapper.OrderMainMapper">
+    <!-- 查询各订单状态的数量 -->
+    <select id="selectOrderStatusCounts" resultType="org.dromara.order.domain.vo.OrderStatusStats">
+        SELECT SUM(CASE WHEN order_status = '0' THEN 1 ELSE 0 END) AS pendingPaymentCount,
+               SUM(CASE WHEN order_status = '2' THEN 1 ELSE 0 END) AS pendingShipmentCount,
+               SUM(CASE WHEN order_status = '4' THEN 1 ELSE 0 END) AS shippedCount,
+               SUM(CASE WHEN order_status = '5' THEN 1 ELSE 0 END) AS completedCount,
+               SUM(CASE WHEN order_status = '6' THEN 1 ELSE 0 END) AS closedCount,
+               COUNT(*)                                            AS totalCount
+        FROM order_main
+        WHERE del_flag = '0'
+    </select>
+</mapper>

+ 53 - 0
ruoyi-modules/ruoyi-order/src/main/resources/mapper/order/OrderProductMapper.xml

@@ -0,0 +1,53 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+    PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+    "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="org.dromara.order.mapper.OrderProductMapper">
+
+    <select id="selectProductsWithDelivered" resultType="org.dromara.order.domain.vo.OrderProductVo">
+        SELECT op.id,
+               op.order_id                                           AS orderId,
+               op.order_no                                           AS orderNo,
+               op.shipment_no                                        AS shipmentNo,
+               op.product_id                                         AS productId,
+               op.product_no                                         AS productNo,
+               op.product_name                                       AS productName,
+               op.product_unit                                       AS productUnit,
+               op.product_image                                      AS productImage,
+               op.platform_price                                     AS platformPrice,
+               op.min_order_quantity                                 AS minOrderQuantity,
+               op.order_price                                        AS orderPrice,
+               op.order_quantity                                     AS orderQuantity,
+               op.subtotal                                           AS subtotal,
+               op.min_selling_price                                  AS minSellingPrice,
+               op.signed_quantity                                    AS signedQuantity,
+               COALESCE(SUM(odp.deliver_num), 0)                     AS quantitySent,
+               op.order_quantity - COALESCE(SUM(odp.deliver_num), 0) AS unsentQuantity,
+               op.is_after_sale                                      AS isAfterSale,
+               op.after_sale_quantity                                AS afterSaleQuantity,
+               op.return_amount                                      AS returnAmount,
+               op.pre_delivery_date                                  AS preDeliveryDate,
+               op.status                                             AS status,
+               op.del_flag                                           AS delFlag,
+               op.remark                                             AS remark
+        FROM order_product op
+                 LEFT JOIN order_deliver od ON od.order_id = op.order_id
+                 LEFT JOIN order_deliver_product odp ON odp.deliver_id = od.id
+            AND odp.product_id = op.product_id
+        WHERE op.order_id = #{orderId}
+          AND op.del_flag = '0'
+        GROUP BY op.id
+        ORDER BY op.id
+    </select>
+
+    <select id="selectOrderAndDeliveredQuantity" resultType="org.dromara.order.domain.vo.OrderQuantitySummary">
+        SELECT SUM(op.order_quantity)            AS orderTotalQty,
+               COALESCE(SUM(odp.deliver_num), 0) AS deliveredTotalQty
+        FROM order_product op
+                 LEFT JOIN order_deliver od ON od.order_id = op.order_id AND od.del_flag = '0'
+                 LEFT JOIN order_deliver_product odp ON odp.deliver_id = od.id
+        WHERE op.order_id = #{orderId}
+          AND op.del_flag = '0'
+    </select>
+
+</mapper>

+ 106 - 0
ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/controller/ProductChangeLogController.java

@@ -0,0 +1,106 @@
+package org.dromara.product.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.product.domain.vo.ProductChangeLogVo;
+import org.dromara.product.domain.bo.ProductChangeLogBo;
+import org.dromara.product.service.IProductChangeLogService;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+
+/**
+ * 商品变更消息记录
+ * 前端访问路由地址为:/product/changeLog
+ *
+ * @author LionLi
+ * @date 2025-12-29
+ */
+@Validated
+@RequiredArgsConstructor
+@RestController
+@RequestMapping("/changeLog")
+public class ProductChangeLogController extends BaseController {
+
+    private final IProductChangeLogService productChangeLogService;
+
+    /**
+     * 查询商品变更消息记录列表
+     */
+    @SaCheckPermission("product:changeLog:list")
+    @GetMapping("/list")
+    public TableDataInfo<ProductChangeLogVo> list(ProductChangeLogBo bo, PageQuery pageQuery) {
+        return productChangeLogService.queryPageList(bo, pageQuery);
+    }
+
+    /**
+     * 导出商品变更消息记录列表
+     */
+    @SaCheckPermission("product:changeLog:export")
+    @Log(title = "商品变更消息记录", businessType = BusinessType.EXPORT)
+    @PostMapping("/export")
+    public void export(ProductChangeLogBo bo, HttpServletResponse response) {
+        List<ProductChangeLogVo> list = productChangeLogService.queryList(bo);
+        ExcelUtil.exportExcel(list, "商品变更消息记录", ProductChangeLogVo.class, response);
+    }
+
+    /**
+     * 获取商品变更消息记录详细信息
+     *
+     * @param id 主键
+     */
+    @SaCheckPermission("product:changeLog:query")
+    @GetMapping("/{id}")
+    public R<ProductChangeLogVo> getInfo(@NotNull(message = "主键不能为空")
+                                     @PathVariable("id") Long id) {
+        return R.ok(productChangeLogService.queryById(id));
+    }
+
+    /**
+     * 新增商品变更消息记录
+     */
+    @SaCheckPermission("product:changeLog:add")
+    @Log(title = "商品变更消息记录", businessType = BusinessType.INSERT)
+    @RepeatSubmit()
+    @PostMapping()
+    public R<Void> add(@Validated(AddGroup.class) @RequestBody ProductChangeLogBo bo) {
+        return toAjax(productChangeLogService.insertByBo(bo));
+    }
+
+    /**
+     * 修改商品变更消息记录
+     */
+    @SaCheckPermission("product:changeLog:edit")
+    @Log(title = "商品变更消息记录", businessType = BusinessType.UPDATE)
+    @RepeatSubmit()
+    @PutMapping()
+    public R<Void> edit(@Validated(EditGroup.class) @RequestBody ProductChangeLogBo bo) {
+        return toAjax(productChangeLogService.updateByBo(bo));
+    }
+
+    /**
+     * 删除商品变更消息记录
+     *
+     * @param ids 主键串
+     */
+    @SaCheckPermission("product:changeLog:remove")
+    @Log(title = "商品变更消息记录", businessType = BusinessType.DELETE)
+    @DeleteMapping("/{ids}")
+    public R<Void> remove(@NotEmpty(message = "主键不能为空")
+                          @PathVariable("ids") Long[] ids) {
+        return toAjax(productChangeLogService.deleteWithValidByIds(List.of(ids), true));
+    }
+}

+ 84 - 0
ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/domain/ProductChangeLog.java

@@ -0,0 +1,84 @@
+package org.dromara.product.domain;
+
+import org.dromara.common.tenant.core.TenantEntity;
+import com.baomidou.mybatisplus.annotation.*;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.io.Serial;
+
+/**
+ * 商品变更消息记录对象 product_change_log
+ *
+ * @author LionLi
+ * @date 2025-12-29
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@TableName("product_change_log")
+public class ProductChangeLog 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;
+
+
+}

+ 55 - 0
ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/domain/bo/ProductChangeLogBo.java

@@ -0,0 +1,55 @@
+package org.dromara.product.domain.bo;
+
+import org.dromara.product.domain.ProductChangeLog;
+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.*;
+
+/**
+ * 商品变更消息记录业务对象 product_change_log
+ *
+ * @author LionLi
+ * @date 2025-12-29
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@AutoMapper(target = ProductChangeLog.class, reverseConvertGenerate = false)
+public class ProductChangeLogBo 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;
+
+    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;
+
+
+}

+ 65 - 0
ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/domain/vo/ProductChangeLogVo.java

@@ -0,0 +1,65 @@
+package org.dromara.product.domain.vo;
+
+import org.dromara.product.domain.ProductChangeLog;
+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;
+
+
+
+/**
+ * 商品变更消息记录视图对象 product_change_log
+ *
+ * @author LionLi
+ * @date 2025-12-29
+ */
+@Data
+@ExcelIgnoreUnannotated
+@AutoMapper(target = ProductChangeLog.class)
+public class ProductChangeLogVo 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;
+
+    private String type;
+
+    /**
+     * 状态(0正常 1停用)
+     */
+    @ExcelProperty(value = "状态", converter = ExcelDictConvert.class)
+    @ExcelDictFormat(readConverterExp = "0=正常,1=停用")
+    private String status;
+
+    /**
+     * 备注
+     */
+    @ExcelProperty(value = "备注")
+    private String remark;
+
+
+}

+ 11 - 7
ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/dubbo/RemoteProductServiceImpl.java

@@ -5,16 +5,19 @@ import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.dubbo.config.annotation.DubboService;
 import org.dromara.product.api.RemoteProductService;
-import org.dromara.product.api.domain.ProductChangeLogVo;
+import org.dromara.product.api.domain.ProductChangeLogApiVo;
 import org.dromara.product.api.domain.ProductVo;
 import org.dromara.product.domain.bo.ProductBaseBo;
 import org.dromara.product.domain.bo.ProductChangeLogBo;
 import org.dromara.product.domain.vo.ProductBaseVo;
+import org.dromara.product.domain.vo.ProductChangeLogVo;
 import org.dromara.product.service.IProductBaseService;
 import org.dromara.product.service.IProductChangeLogService;
 import org.springframework.stereotype.Service;
 
+import java.util.Arrays;
 import java.util.List;
+import java.util.stream.Collectors;
 
 /**
  * 产品基础信息服务
@@ -60,9 +63,10 @@ public class RemoteProductServiceImpl implements RemoteProductService {
      */
     @Override
     public List<ProductVo> getProductDetails(String productIds) {
-        ProductBaseBo productBaseBo = new ProductBaseBo();
-        productBaseBo.setProductIds(productIds);
-        List<ProductBaseVo> productBaseVos = productBaseService.queryList(productBaseBo);
+        String[] split = productIds.split(",");
+        List<ProductBaseVo> productBaseVos = Arrays.stream(split).map(productId ->
+            productBaseService.queryById(Long.valueOf(productId))
+        ).collect(Collectors.toList());
         return BeanUtil.copyToList(productBaseVos, ProductVo.class);
     }
 
@@ -73,12 +77,12 @@ public class RemoteProductServiceImpl implements RemoteProductService {
      * @param type
      */
     @Override
-    public List<ProductChangeLogVo> getProductChangeLogs(Long itemId, String type) {
+    public List<ProductChangeLogApiVo> getProductChangeLogs(Long itemId, String type) {
         ProductChangeLogBo productChangeLogBo = new ProductChangeLogBo();
         productChangeLogBo.setItemId(itemId);
         productChangeLogBo.setType(type);
-        List<org.dromara.product.domain.vo.ProductChangeLogVo> productChangeLogVos = productChangeLogService.queryList(productChangeLogBo);
-        return BeanUtil.copyToList(productChangeLogVos, ProductChangeLogVo.class);
+        List<ProductChangeLogVo> productChangeLogVos = productChangeLogService.queryList(productChangeLogBo);
+        return BeanUtil.copyToList(productChangeLogVos, ProductChangeLogApiVo.class);
     }
 
     @Override

+ 15 - 0
ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/mapper/ProductChangeLogMapper.java

@@ -0,0 +1,15 @@
+package org.dromara.product.mapper;
+
+import org.dromara.product.domain.ProductChangeLog;
+import org.dromara.product.domain.vo.ProductChangeLogVo;
+import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
+
+/**
+ * 商品变更消息记录Mapper接口
+ *
+ * @author LionLi
+ * @date 2025-12-29
+ */
+public interface ProductChangeLogMapper extends BaseMapperPlus<ProductChangeLog, ProductChangeLogVo> {
+
+}

+ 70 - 0
ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/service/IProductChangeLogService.java

@@ -0,0 +1,70 @@
+package org.dromara.product.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import org.dromara.product.domain.ProductChangeLog;
+import org.dromara.product.domain.vo.ProductChangeLogVo;
+import org.dromara.product.domain.bo.ProductChangeLogBo;
+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 2025-12-29
+ */
+public interface IProductChangeLogService extends IService<ProductChangeLog>{
+
+    /**
+     * 查询商品变更消息记录
+     *
+     * @param id 主键
+     * @return 商品变更消息记录
+     */
+    ProductChangeLogVo queryById(Long id);
+
+    /**
+     * 分页查询商品变更消息记录列表
+     *
+     * @param bo        查询条件
+     * @param pageQuery 分页参数
+     * @return 商品变更消息记录分页列表
+     */
+    TableDataInfo<ProductChangeLogVo> queryPageList(ProductChangeLogBo bo, PageQuery pageQuery);
+
+    /**
+     * 查询符合条件的商品变更消息记录列表
+     *
+     * @param bo 查询条件
+     * @return 商品变更消息记录列表
+     */
+    List<ProductChangeLogVo> queryList(ProductChangeLogBo bo);
+
+    /**
+     * 新增商品变更消息记录
+     *
+     * @param bo 商品变更消息记录
+     * @return 是否新增成功
+     */
+    Boolean insertByBo(ProductChangeLogBo bo);
+
+    /**
+     * 修改商品变更消息记录
+     *
+     * @param bo 商品变更消息记录
+     * @return 是否修改成功
+     */
+    Boolean updateByBo(ProductChangeLogBo bo);
+
+    /**
+     * 校验并批量删除商品变更消息记录信息
+     *
+     * @param ids     待删除的主键集合
+     * @param isValid 是否进行有效性校验
+     * @return 是否删除成功
+     */
+    Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
+}

+ 137 - 0
ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/service/impl/ProductChangeLogServiceImpl.java

@@ -0,0 +1,137 @@
+package org.dromara.product.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.product.domain.bo.ProductChangeLogBo;
+import org.dromara.product.domain.vo.ProductChangeLogVo;
+import org.dromara.product.domain.ProductChangeLog;
+import org.dromara.product.mapper.ProductChangeLogMapper;
+import org.dromara.product.service.IProductChangeLogService;
+
+import java.util.List;
+import java.util.Map;
+import java.util.Collection;
+
+/**
+ * 商品变更消息记录Service业务层处理
+ *
+ * @author LionLi
+ * @date 2025-12-29
+ */
+@Slf4j
+@RequiredArgsConstructor
+@Service
+public class ProductChangeLogServiceImpl  extends ServiceImpl<ProductChangeLogMapper, ProductChangeLog> implements IProductChangeLogService {
+
+    private final ProductChangeLogMapper baseMapper;
+
+    /**
+     * 查询商品变更消息记录
+     *
+     * @param id 主键
+     * @return 商品变更消息记录
+     */
+    @Override
+    public ProductChangeLogVo queryById(Long id){
+        return baseMapper.selectVoById(id);
+    }
+
+    /**
+     * 分页查询商品变更消息记录列表
+     *
+     * @param bo        查询条件
+     * @param pageQuery 分页参数
+     * @return 商品变更消息记录分页列表
+     */
+    @Override
+    public TableDataInfo<ProductChangeLogVo> queryPageList(ProductChangeLogBo bo, PageQuery pageQuery) {
+        LambdaQueryWrapper<ProductChangeLog> lqw = buildQueryWrapper(bo);
+        Page<ProductChangeLogVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
+        return TableDataInfo.build(result);
+    }
+
+    /**
+     * 查询符合条件的商品变更消息记录列表
+     *
+     * @param bo 查询条件
+     * @return 商品变更消息记录列表
+     */
+    @Override
+    public List<ProductChangeLogVo> queryList(ProductChangeLogBo bo) {
+        LambdaQueryWrapper<ProductChangeLog> lqw = buildQueryWrapper(bo);
+        return baseMapper.selectVoList(lqw);
+    }
+
+    private LambdaQueryWrapper<ProductChangeLog> buildQueryWrapper(ProductChangeLogBo bo) {
+        Map<String, Object> params = bo.getParams();
+        LambdaQueryWrapper<ProductChangeLog> lqw = Wrappers.lambdaQuery();
+        lqw.orderByAsc(ProductChangeLog::getId);
+        lqw.eq(bo.getItemId() != null, ProductChangeLog::getItemId, bo.getItemId());
+        lqw.eq(bo.getProductId() != null, ProductChangeLog::getProductId, bo.getProductId());
+        lqw.eq(StringUtils.isNotBlank(bo.getType()), ProductChangeLog::getType, bo.getType());
+        lqw.eq(StringUtils.isNotBlank(bo.getStatus()), ProductChangeLog::getStatus, bo.getStatus());
+        lqw.eq(StringUtils.isNotBlank(bo.getPlatformCode()), ProductChangeLog::getPlatformCode, bo.getPlatformCode());
+        return lqw;
+    }
+
+    /**
+     * 新增商品变更消息记录
+     *
+     * @param bo 商品变更消息记录
+     * @return 是否新增成功
+     */
+    @Override
+    public Boolean insertByBo(ProductChangeLogBo bo) {
+        ProductChangeLog add = MapstructUtils.convert(bo, ProductChangeLog.class);
+        validEntityBeforeSave(add);
+        boolean flag = baseMapper.insert(add) > 0;
+        if (flag) {
+            bo.setId(add.getId());
+        }
+        return flag;
+    }
+
+    /**
+     * 修改商品变更消息记录
+     *
+     * @param bo 商品变更消息记录
+     * @return 是否修改成功
+     */
+    @Override
+    public Boolean updateByBo(ProductChangeLogBo bo) {
+        ProductChangeLog update = MapstructUtils.convert(bo, ProductChangeLog.class);
+        validEntityBeforeSave(update);
+        return baseMapper.updateById(update) > 0;
+    }
+
+    /**
+     * 保存前的数据校验
+     */
+    private void validEntityBeforeSave(ProductChangeLog entity){
+        //TODO 做一些数据校验,如唯一约束
+    }
+
+    /**
+     * 校验并批量删除商品变更消息记录信息
+     *
+     * @param ids     待删除的主键集合
+     * @param isValid 是否进行有效性校验
+     * @return 是否删除成功
+     */
+    @Override
+    public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
+        if(isValid){
+            //TODO 做一些业务上的校验,判断是否需要校验
+        }
+        return baseMapper.deleteByIds(ids) > 0;
+    }
+}

+ 1 - 1
ruoyi-modules/ruoyi-product/src/main/resources/application.yml

@@ -1,6 +1,6 @@
 # Tomcat
 server:
-  port: 9618
+  port: 9608
 
 # Spring
 spring:

+ 1 - 1
ruoyi-modules/ruoyi-order/src/main/resources/mapper.order/OrderMainMapper.xml → ruoyi-modules/ruoyi-product/src/main/resources/mapper/product/ProductChangeLogMapper.xml

@@ -2,6 +2,6 @@
 <!DOCTYPE mapper
 PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
-<mapper namespace="org.dromara.order.mapper.OrderMainMapper">
+<mapper namespace="org.dromara.product.mapper.ProductChangeLogMapper">
 
 </mapper>

+ 3 - 23
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysDept.java

@@ -85,32 +85,12 @@ public class SysDept extends TenantEntity {
      */
     private String ancestors;
 
-    /**
-     * 年度预算
-     */
-    private BigDecimal annualBudget;
-
-    /**
-     * 已用预算
-     */
-    private BigDecimal budgetUsed;
-
-    /**
-     * 月采限额
-     */
-    private BigDecimal monthlyQuota;
 
-    /**
-     * 是否绑定
-     */
-    private String isBound;
+    private Long companyId;
 
-    /**
-     * 地址ID
-     */
-    private Long shopAddressId;
+    private String deptNo;
 
-    private Long customerId;
+    private String isCompanyFlag;
 
 
     /**

+ 3 - 24
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysDeptBo.java

@@ -81,31 +81,10 @@ public class SysDeptBo extends BaseEntity {
      */
     private Long belongDeptId;
 
-    /**
-     * 年度预算
-     */
-    private BigDecimal annualBudget;
+    private Long companyId;
 
-    /**
-     * 已用预算
-     */
-    private BigDecimal budgetUsed;
-
-    /**
-     * 月采限额
-     */
-    private BigDecimal monthlyQuota;
-
-    /**
-     * 是否绑定
-     */
-    private String isBound;
-
-    /**
-     * 地址ID
-     */
-    private Long shopAddressId;
+    private String deptNo;
 
-    private Long customerId;
+    private String isCompanyFlag;
 
 }

+ 3 - 23
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysDeptVo.java

@@ -105,32 +105,12 @@ public class SysDeptVo implements Serializable {
     /*平台标识*/
     private String platformCode;
 
-    /**
-     * 年度预算
-     */
-    private BigDecimal annualBudget;
-
-    /**
-     * 已用预算
-     */
-    private BigDecimal budgetUsed;
-
-    /**
-     * 月采限额
-     */
-    private BigDecimal monthlyQuota;
 
-    /**
-     * 是否绑定
-     */
-    private String isBound;
+    private Long companyId;
 
-    /**
-     * 地址ID
-     */
-    private Long shopAddressId;
+    private String deptNo;
 
-    private Long customerId;
+    private String isCompanyFlag;
 
     /**
      * 子菜单

+ 4 - 4
script/docker/docker-compose.yml

@@ -73,9 +73,9 @@ services:
       # 时区上海
       TZ: Asia/Shanghai
       # 管理后台用户名
-      MINIO_ROOT_USER: ruoyi
+      MINIO_ROOT_USER: youyida
       # 管理后台密码,最小8个字符
-      MINIO_ROOT_PASSWORD: ruoyi123
+      MINIO_ROOT_PASSWORD: youyida@123456
       # https需要指定域名
       #MINIO_SERVER_URL: "https://xxx.com:9000"
       #MINIO_BROWSER_REDIRECT_URL: "https://xxx.com:9001"
@@ -87,9 +87,9 @@ services:
       MINIO_COMPRESS_MIME_TYPES: ""
     volumes:
       # 映射当前目录下的data目录至容器内/data目录
-      - /docker/minio/data:/data
+      - /upload/docker/minio/data:/data
       # 映射配置目录
-      - /docker/minio/config:/root/.minio/
+      - /upload/docker/minio/config:/root/.minio/
     command: server --address ':9000' --console-address ':9001' /data  # 指定容器中的目录 /data
     privileged: true
     network_mode: "host"