Переглянути джерело

下单、派单、取消基本完成

Huanyi 1 місяць тому
батько
коміт
a2c3eed414
84 змінених файлів з 1788 додано та 71 видалено
  1. 16 9
      pom.xml
  2. 2 0
      ruoyi-api/pom.xml
  3. 18 0
      ruoyi-api/ruoyi-api-bom/pom.xml
  4. 2 0
      ruoyi-api/ruoyi-api-resource/src/main/java/org/dromara/resource/api/RemoteFileService.java
  5. 6 0
      ruoyi-api/ruoyi-api-resource/src/main/java/org/dromara/resource/api/RemoteFileServiceMock.java
  6. 11 0
      ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/RemoteStoreService.java
  7. 5 0
      ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/RemoteUserService.java
  8. 18 0
      ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/domain/vo/RemoteStoreVo.java
  9. 21 0
      ruoyi-api/yingpaipay-api-archieves/pom.xml
  10. 15 0
      ruoyi-api/yingpaipay-api-archieves/src/main/java/org/dromara/api/RemoteCustomerService.java
  11. 9 0
      ruoyi-api/yingpaipay-api-archieves/src/main/java/org/dromara/api/RemotePetService.java
  12. 20 0
      ruoyi-api/yingpaipay-api-archieves/src/main/java/org/dromara/api/domain/vo/RemoteCustomerVo.java
  13. 20 0
      ruoyi-api/yingpaipay-api-archieves/src/main/java/org/dromara/api/domain/vo/RemotePetVo.java
  14. 4 2
      ruoyi-api/yingpaipay-api-fulfiller/pom.xml
  15. 4 0
      ruoyi-api/yingpaipay-api-fulfiller/src/main/java/org/dromara/fulfiller/api/RemoteFulfillerService.java
  16. 18 0
      ruoyi-api/yingpaipay-api-fulfiller/src/main/java/org/dromara/fulfiller/api/domain/vo/RemoteFulfillerVo.java
  17. 14 0
      ruoyi-api/yingpaipay-api-order/pom.xml
  18. 5 0
      ruoyi-api/yingpaipay-api-order/src/main/java/org/dromara/order/api/RemoteOrderService.java
  19. 18 0
      ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/constant/CacheNames.java
  20. 1 1
      ruoyi-common/ruoyi-common-dubbo/src/main/java/org/dromara/common/dubbo/config/CustomBeanFactoryPostProcessor.java
  21. 6 1
      ruoyi-common/ruoyi-common-tenant/src/main/java/org/dromara/common/tenant/helper/TenantHelper.java
  22. 10 0
      ruoyi-common/ruoyi-common-translation/pom.xml
  23. 18 0
      ruoyi-common/ruoyi-common-translation/src/main/java/org/dromara/common/translation/constant/TransConstant.java
  24. 22 0
      ruoyi-common/ruoyi-common-translation/src/main/java/org/dromara/common/translation/core/impl/CustomerNameTranslationImpl.java
  25. 22 0
      ruoyi-common/ruoyi-common-translation/src/main/java/org/dromara/common/translation/core/impl/OrderCodeTranslationImpl.java
  26. 22 0
      ruoyi-common/ruoyi-common-translation/src/main/java/org/dromara/common/translation/core/impl/StoreNameTranslationImpl.java
  27. 3 0
      ruoyi-common/ruoyi-common-translation/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
  28. 0 1
      ruoyi-common/yingpaipay-common-platform/src/main/java/org/dromara/common/platform/Platform.java
  29. 6 0
      ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/dubbo/RemoteFileServiceImpl.java
  30. 14 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysStoreController.java
  31. 10 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysStoreBanBo.java
  32. 14 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysStoreRenewBo.java
  33. 59 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/dubbo/RemoteStoreServiceImpl.java
  34. 61 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/dubbo/RemoteUserServiceImpl.java
  35. 6 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysStoreService.java
  36. 29 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysStoreServiceImpl.java
  37. 13 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysTenantCategoriesServiceImpl.java
  38. 5 0
      ruoyi-modules/yingpaipay-archieves/pom.xml
  39. 2 0
      ruoyi-modules/yingpaipay-archieves/src/main/java/org/dromara/archieves/YingpaipayArchievesApplication.java
  40. 1 1
      ruoyi-modules/yingpaipay-archieves/src/main/java/org/dromara/archieves/controller/UsrCustomerController.java
  41. 1 2
      ruoyi-modules/yingpaipay-archieves/src/main/java/org/dromara/archieves/controller/UsrPetController.java
  42. 1 1
      ruoyi-modules/yingpaipay-archieves/src/main/java/org/dromara/archieves/domain/UsrPet.java
  43. 1 1
      ruoyi-modules/yingpaipay-archieves/src/main/java/org/dromara/archieves/domain/bo/UsrPetBo.java
  44. 1 1
      ruoyi-modules/yingpaipay-archieves/src/main/java/org/dromara/archieves/domain/vo/UsrPetOnOrderVo.java
  45. 1 1
      ruoyi-modules/yingpaipay-archieves/src/main/java/org/dromara/archieves/domain/vo/UsrPetVo.java
  46. 82 0
      ruoyi-modules/yingpaipay-archieves/src/main/java/org/dromara/archieves/dubbo/RemoteCustomerServiceImpl.java
  47. 46 0
      ruoyi-modules/yingpaipay-archieves/src/main/java/org/dromara/archieves/dubbo/RemotePetServiceImpl.java
  48. 12 5
      ruoyi-modules/yingpaipay-archieves/src/main/java/org/dromara/archieves/service/impl/UsrCustomerServiceImpl.java
  49. 5 0
      ruoyi-modules/yingpaipay-fulfiller/pom.xml
  50. 12 0
      ruoyi-modules/yingpaipay-fulfiller/src/main/java/org/dromara/fulfiller/controller/FlfFulfillerController.java
  51. 25 0
      ruoyi-modules/yingpaipay-fulfiller/src/main/java/org/dromara/fulfiller/domain/vo/FlfFulfillerOnOrderVo.java
  52. 31 4
      ruoyi-modules/yingpaipay-fulfiller/src/main/java/org/dromara/fulfiller/dubbo/RemoteFulfillerServiceImpl.java
  53. 2 0
      ruoyi-modules/yingpaipay-fulfiller/src/main/java/org/dromara/fulfiller/service/IFlfFulfillerService.java
  54. 49 3
      ruoyi-modules/yingpaipay-fulfiller/src/main/java/org/dromara/fulfiller/service/impl/FlfFulfillerServiceImpl.java
  55. 15 0
      ruoyi-modules/yingpaipay-order/pom.xml
  56. 2 0
      ruoyi-modules/yingpaipay-order/src/main/java/org/dromara/order/YingpaipayOrderApplication.java
  57. 6 5
      ruoyi-modules/yingpaipay-order/src/main/java/org/dromara/order/controller/SysOrderController.java
  58. 46 0
      ruoyi-modules/yingpaipay-order/src/main/java/org/dromara/order/controller/SysSubOrderController.java
  59. 27 0
      ruoyi-modules/yingpaipay-order/src/main/java/org/dromara/order/controller/SysSubOrderLogController.java
  60. 34 0
      ruoyi-modules/yingpaipay-order/src/main/java/org/dromara/order/domain/SysSubOrder.java
  61. 77 0
      ruoyi-modules/yingpaipay-order/src/main/java/org/dromara/order/domain/SysSubOrderLog.java
  62. 10 0
      ruoyi-modules/yingpaipay-order/src/main/java/org/dromara/order/domain/bo/SysOrderCreateBo.java
  63. 10 0
      ruoyi-modules/yingpaipay-order/src/main/java/org/dromara/order/domain/bo/SysSubOrderCancelBo.java
  64. 14 0
      ruoyi-modules/yingpaipay-order/src/main/java/org/dromara/order/domain/bo/SysSubOrderDispatchBo.java
  65. 14 0
      ruoyi-modules/yingpaipay-order/src/main/java/org/dromara/order/domain/bo/SysSubOrderListPageBo.java
  66. 77 0
      ruoyi-modules/yingpaipay-order/src/main/java/org/dromara/order/domain/bo/SysSubOrderLogBo.java
  67. 62 0
      ruoyi-modules/yingpaipay-order/src/main/java/org/dromara/order/domain/vo/SysSubOrderListPageVo.java
  68. 86 0
      ruoyi-modules/yingpaipay-order/src/main/java/org/dromara/order/domain/vo/SysSubOrderLogVo.java
  69. 11 0
      ruoyi-modules/yingpaipay-order/src/main/java/org/dromara/order/domain/vo/SysSubOrderVo.java
  70. 29 0
      ruoyi-modules/yingpaipay-order/src/main/java/org/dromara/order/dubbo/RemoteOrderServiceImpl.java
  71. 24 0
      ruoyi-modules/yingpaipay-order/src/main/java/org/dromara/order/enums/OrderLogActionTypeEnum.java
  72. 17 0
      ruoyi-modules/yingpaipay-order/src/main/java/org/dromara/order/enums/OrderLogActionerTypeEnum.java
  73. 17 0
      ruoyi-modules/yingpaipay-order/src/main/java/org/dromara/order/enums/OrderLogTypeEnum.java
  74. 19 0
      ruoyi-modules/yingpaipay-order/src/main/java/org/dromara/order/enums/OrderTypeEnum.java
  75. 15 0
      ruoyi-modules/yingpaipay-order/src/main/java/org/dromara/order/mapper/SysSubOrderLogMapper.java
  76. 9 0
      ruoyi-modules/yingpaipay-order/src/main/java/org/dromara/order/service/ISysSubOrderLogService.java
  77. 19 0
      ruoyi-modules/yingpaipay-order/src/main/java/org/dromara/order/service/ISysSubOrderService.java
  78. 1 1
      ruoyi-modules/yingpaipay-order/src/main/java/org/dromara/order/service/impl/OrderStatusServiceImpl.java
  79. 40 2
      ruoyi-modules/yingpaipay-order/src/main/java/org/dromara/order/service/impl/SysOrderServiceImpl.java
  80. 26 0
      ruoyi-modules/yingpaipay-order/src/main/java/org/dromara/order/service/impl/SysSubOrderLogServiceImpl.java
  81. 189 0
      ruoyi-modules/yingpaipay-order/src/main/java/org/dromara/order/service/impl/SysSubOrderServiceImpl.java
  82. 6 3
      ruoyi-visual/ruoyi-nacos/src/main/resources/application.properties
  83. 67 27
      script/sql/business/create.sql
  84. 0 0
      sessionStore/8091/root.data

+ 16 - 9
pom.xml

@@ -65,7 +65,22 @@
 
     <profiles>
         <profile>
-            <id>Huanyi</id>
+            <id>Huanyi-Home</id>
+            <properties>
+                <!-- 环境标识,需要与配置文件的名称相对应 -->
+                <profiles.active>dev</profiles.active>
+                <nacos.server>192.168.0.102:8848</nacos.server>
+                <nacos.discovery.group>DEFAULT_GROUP</nacos.discovery.group>
+                <nacos.config.group>DEFAULT_GROUP</nacos.config.group>
+                <nacos.username>nacos</nacos.username>
+                <nacos.password>nacos</nacos.password>
+                <logstash.address>127.0.0.1:4560</logstash.address>
+                <discovery.ip>192.168.0.102</discovery.ip>
+                <nacos.ip>192.168.0.102</nacos.ip>
+            </properties>
+        </profile>
+        <profile>
+            <id>Huanyi-Company</id>
             <properties>
                 <!-- 环境标识,需要与配置文件的名称相对应 -->
                 <profiles.active>dev</profiles.active>
@@ -78,10 +93,6 @@
                 <discovery.ip>192.168.1.118</discovery.ip>
                 <nacos.ip>192.168.1.118</nacos.ip>
             </properties>
-            <activation>
-                <!-- 默认环境 -->
-                <activeByDefault>true</activeByDefault>
-            </activation>
         </profile>
         <profile>
             <id>Steelwei</id>
@@ -96,10 +107,6 @@
                 <logstash.address>127.0.0.1:4560</logstash.address>
                 <discovery.ip>127.0.0.1</discovery.ip>
             </properties>
-            <activation>
-                <!-- 默认环境 -->
-                <activeByDefault>true</activeByDefault>
-            </activation>
         </profile>
         <profile>
             <id>prod</id>

+ 2 - 0
ruoyi-api/pom.xml

@@ -14,7 +14,9 @@
         <module>ruoyi-api-resource</module>
         <module>ruoyi-api-workflow</module>
         <module>yingpaipay-api-service</module>
+        <module>yingpaipay-api-archieves</module>
         <module>yingpaipay-api-fulfiller</module>
+        <module>yingpaipay-api-order</module>
     </modules>
 
     <artifactId>ruoyi-api</artifactId>

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

@@ -54,6 +54,24 @@
                 <version>${revision}</version>
             </dependency>
 
+            <dependency>
+                <groupId>org.dromara</groupId>
+                <artifactId>yingpaipay-api-archieves</artifactId>
+                <version>${revision}</version>
+            </dependency>
+
+            <dependency>
+                <groupId>org.dromara</groupId>
+                <artifactId>yingpaipay-api-fulfiller</artifactId>
+                <version>${revision}</version>
+            </dependency>
+
+            <dependency>
+                <groupId>org.dromara</groupId>
+                <artifactId>yingpaipay-api-order</artifactId>
+                <version>${revision}</version>
+            </dependency>
+
         </dependencies>
     </dependencyManagement>
 </project>

+ 2 - 0
ruoyi-api/ruoyi-api-resource/src/main/java/org/dromara/resource/api/RemoteFileService.java

@@ -35,4 +35,6 @@ public interface RemoteFileService {
      * @return 列表
      */
     List<RemoteFile> selectByIds(String ossIds);
+
+    List<RemoteFile> selectByIds(List<Long> ossIds);
 }

+ 6 - 0
ruoyi-api/ruoyi-api-resource/src/main/java/org/dromara/resource/api/RemoteFileServiceMock.java

@@ -50,4 +50,10 @@ public class RemoteFileServiceMock implements RemoteFileService {
         return List.of();
     }
 
+    @Override
+    public List<RemoteFile> selectByIds(List<Long> ossIds) {
+        log.warn("服务调用异常 -> 降级处理");
+        return List.of();
+    }
+
 }

+ 11 - 0
ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/RemoteStoreService.java

@@ -0,0 +1,11 @@
+package org.dromara.system.api;
+
+import org.dromara.system.api.domain.vo.RemoteStoreVo;
+
+import java.util.List;
+
+public interface RemoteStoreService {
+    String getNameById(Long id);
+
+    List<RemoteStoreVo> getByIds(List<Long> storeIds);
+}

+ 5 - 0
ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/RemoteUserService.java

@@ -182,4 +182,9 @@ public interface RemoteUserService {
      */
     int resetUserPwd(Long userId, String password);
 
+    List<Long> selectUserIdsByName(String username);
+
+    List<RemoteUserVo> getByIds(List<Long> userIds);
+
+    List<RemoteUserVo> selectListByName(String username);
 }

+ 18 - 0
ruoyi-api/ruoyi-api-system/src/main/java/org/dromara/system/api/domain/vo/RemoteStoreVo.java

@@ -0,0 +1,18 @@
+package org.dromara.system.api.domain.vo;
+
+import lombok.Data;
+
+import java.io.Serial;
+import java.io.Serializable;
+
+@Data
+public class RemoteStoreVo implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    private Long id;
+
+    private String name;
+
+}

+ 21 - 0
ruoyi-api/yingpaipay-api-archieves/pom.xml

@@ -0,0 +1,21 @@
+<?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">
+    <modelVersion>4.0.0</modelVersion>
+    <parent>
+        <groupId>org.dromara</groupId>
+        <artifactId>ruoyi-api</artifactId>
+        <version>${revision}</version>
+    </parent>
+
+    <artifactId>yingpaipay-api-archieves</artifactId>
+
+    <dependencies>
+        <dependency>
+            <groupId>org.projectlombok</groupId>
+            <artifactId>lombok</artifactId>
+        </dependency>
+    </dependencies>
+
+</project>

+ 15 - 0
ruoyi-api/yingpaipay-api-archieves/src/main/java/org/dromara/api/RemoteCustomerService.java

@@ -0,0 +1,15 @@
+package org.dromara.api;
+
+import org.dromara.api.domain.vo.RemoteCustomerVo;
+
+import java.util.List;
+
+public interface RemoteCustomerService {
+    List<Long> selectIdsByName(String name);
+
+    String selectNameById(Long id);
+
+    List<RemoteCustomerVo> getByIds(List<Long> customerIds);
+
+    List<RemoteCustomerVo> selectListByName(String name);
+}

+ 9 - 0
ruoyi-api/yingpaipay-api-archieves/src/main/java/org/dromara/api/RemotePetService.java

@@ -0,0 +1,9 @@
+package org.dromara.api;
+
+import org.dromara.api.domain.vo.RemotePetVo;
+
+import java.util.List;
+
+public interface RemotePetService {
+    List<RemotePetVo> getByIds(List<Long> petIds);
+}

+ 20 - 0
ruoyi-api/yingpaipay-api-archieves/src/main/java/org/dromara/api/domain/vo/RemoteCustomerVo.java

@@ -0,0 +1,20 @@
+package org.dromara.api.domain.vo;
+
+import lombok.Data;
+
+import java.io.Serial;
+import java.io.Serializable;
+
+@Data
+public class RemoteCustomerVo implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    private Long id;
+
+    private String name;
+
+    private String address;
+
+}

+ 20 - 0
ruoyi-api/yingpaipay-api-archieves/src/main/java/org/dromara/api/domain/vo/RemotePetVo.java

@@ -0,0 +1,20 @@
+package org.dromara.api.domain.vo;
+
+import lombok.Data;
+
+import java.io.Serial;
+import java.io.Serializable;
+
+@Data
+public class RemotePetVo implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    private Long id;
+
+    private String name;
+
+    private String breed;
+
+}

+ 4 - 2
ruoyi-api/yingpaipay-api-fulfiller/pom.xml

@@ -12,13 +12,15 @@
     <artifactId>yingpaipay-api-fulfiller</artifactId>
 
     <dependencies>
-
+        <dependency>
+            <groupId>org.projectlombok</groupId>
+            <artifactId>lombok</artifactId>
+        </dependency>
         <!-- RuoYi Common Core-->
         <dependency>
             <groupId>org.dromara</groupId>
             <artifactId>ruoyi-common-core</artifactId>
         </dependency>
-
     </dependencies>
 
 </project>

+ 4 - 0
ruoyi-api/yingpaipay-api-fulfiller/src/main/java/org/dromara/fulfiller/api/RemoteFulfillerService.java

@@ -1,8 +1,11 @@
 package org.dromara.fulfiller.api;
 
 import org.dromara.common.core.exception.user.UserException;
+import org.dromara.fulfiller.api.domain.vo.RemoteFulfillerVo;
 import org.dromara.fulfiller.api.model.FulfillerLoginUser;
 
+import java.util.List;
+
 /**
  * 履约者服务接口
  *
@@ -28,4 +31,5 @@ public interface RemoteFulfillerService {
      */
     FulfillerLoginUser getFulfillerById(Long id) throws UserException;
 
+    List<RemoteFulfillerVo> getByIds(List<Long> fulfillerIds);
 }

+ 18 - 0
ruoyi-api/yingpaipay-api-fulfiller/src/main/java/org/dromara/fulfiller/api/domain/vo/RemoteFulfillerVo.java

@@ -0,0 +1,18 @@
+package org.dromara.fulfiller.api.domain.vo;
+
+import lombok.Data;
+
+import java.io.Serial;
+import java.io.Serializable;
+
+@Data
+public class RemoteFulfillerVo implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    private Long id;
+
+    private String name;
+
+}

+ 14 - 0
ruoyi-api/yingpaipay-api-order/pom.xml

@@ -0,0 +1,14 @@
+<?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">
+    <modelVersion>4.0.0</modelVersion>
+    <parent>
+        <groupId>org.dromara</groupId>
+        <artifactId>ruoyi-api</artifactId>
+        <version>${revision}</version>
+    </parent>
+
+    <artifactId>yingpaipay-api-order</artifactId>
+
+</project>

+ 5 - 0
ruoyi-api/yingpaipay-api-order/src/main/java/org/dromara/order/api/RemoteOrderService.java

@@ -0,0 +1,5 @@
+package org.dromara.order.api;
+
+public interface RemoteOrderService {
+    String getCodeById(Long id);
+}

+ 18 - 0
ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/constant/CacheNames.java

@@ -97,4 +97,22 @@ public interface CacheNames {
      * @Author: Huanyi
      */
     String SYS_TENANT_CATERGORIES_NAME = "sys_tenant_catergories_name#30d";
+
+    /**
+     * 门店名
+     * @Author: Huanyi
+     */
+    String SYS_STORE_NAME = "sys_store_name#30d";
+
+    /**
+     * 宠物用户名
+     * @Author: Huanyi
+     */
+    String USR_CUSTOMER_NAME = "usr_customer_name#30d";
+
+    /**
+     * 订单号
+     * @Author: Huanyi
+     */
+    String SYS_ORDER_CODE = "sys_order_code#30d";
 }

+ 1 - 1
ruoyi-common/ruoyi-common-dubbo/src/main/java/org/dromara/common/dubbo/config/CustomBeanFactoryPostProcessor.java

@@ -65,7 +65,7 @@ public class CustomBeanFactoryPostProcessor implements BeanFactoryPostProcessor,
         // 创建临时的 InetUtils 实例
         try (InetUtils inetUtils = new InetUtils(properties)) {
 //            String ip = "127.0.0.1";
-            String ip = "192.168.1.118";
+            String ip = "192.168.0.102";
             // 获取第一个非回环地址
             InetAddress address = inetUtils.findFirstNonLoopbackAddress();
             if (address != null) {

+ 6 - 1
ruoyi-common/ruoyi-common-tenant/src/main/java/org/dromara/common/tenant/helper/TenantHelper.java

@@ -40,6 +40,10 @@ public class TenantHelper {
     /**
      * 租户功能是否启用
      */
+    /**
+     * FIXME dubbo调用会将mvc上下文丢失
+     * @Author: Huanyi
+     */
     public static boolean isEnable() {
 
         // 通过平台进行分离 @author: Huanyi
@@ -49,8 +53,9 @@ public class TenantHelper {
                 return Platform.isNotAdmin(header);
             }
         }
+        return Convert.toBool(false);
 
-        return Convert.toBool(SpringUtils.getProperty("tenant.enable"), false);
+//        return Convert.toBool(SpringUtils.getProperty("tenant.enable"), false);
     }
 
     private static IgnoreStrategy getIgnoreStrategy() {

+ 10 - 0
ruoyi-common/ruoyi-common-translation/pom.xml

@@ -37,6 +37,16 @@
             <artifactId>ruoyi-api-resource</artifactId>
         </dependency>
 
+        <dependency>
+            <groupId>org.dromara</groupId>
+            <artifactId>yingpaipay-api-archieves</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.dromara</groupId>
+            <artifactId>yingpaipay-api-order</artifactId>
+        </dependency>
+
     </dependencies>
 
 </project>

+ 18 - 0
ruoyi-common/ruoyi-common-translation/src/main/java/org/dromara/common/translation/constant/TransConstant.java

@@ -50,4 +50,22 @@ public interface TransConstant {
      * @Author: Huanyi
      */
     String TENANT_CATERORIES_ID_TO_NAME = "tenant_catergories_id_to_name";
+
+    /**
+     * 门店ID转门店名
+     * @Author: Huanyi
+     */
+    String STORE_ID_TO_NAME = "store_id_to_name";
+
+    /**
+     * 宠物用户ID转名称
+     * @Author: Huanyi
+     */
+    String CUSTOMER_ID_TO_NAME = "customer_id_to_name";
+
+    /**
+     * 订单ID转订单号
+     * @Author: Huanyi
+     */
+    String ORDER_ID_TO_CODE = "order_id_to_code";
 }

+ 22 - 0
ruoyi-common/ruoyi-common-translation/src/main/java/org/dromara/common/translation/core/impl/CustomerNameTranslationImpl.java

@@ -0,0 +1,22 @@
+package org.dromara.common.translation.core.impl;
+
+import cn.hutool.core.convert.Convert;
+import lombok.AllArgsConstructor;
+import org.apache.dubbo.config.annotation.DubboReference;
+import org.dromara.api.RemoteCustomerService;
+import org.dromara.common.translation.annotation.TranslationType;
+import org.dromara.common.translation.constant.TransConstant;
+import org.dromara.common.translation.core.TranslationInterface;
+
+@AllArgsConstructor
+@TranslationType(type = TransConstant.CUSTOMER_ID_TO_NAME)
+public class CustomerNameTranslationImpl implements TranslationInterface<String> {
+
+    @DubboReference
+    private final RemoteCustomerService remoteCustomerService;
+
+    @Override
+    public String translation(Object key, String other) {
+        return remoteCustomerService.selectNameById(Convert.toLong(key));
+    }
+}

+ 22 - 0
ruoyi-common/ruoyi-common-translation/src/main/java/org/dromara/common/translation/core/impl/OrderCodeTranslationImpl.java

@@ -0,0 +1,22 @@
+package org.dromara.common.translation.core.impl;
+
+import cn.hutool.core.convert.Convert;
+import lombok.AllArgsConstructor;
+import org.apache.dubbo.config.annotation.DubboReference;
+import org.dromara.common.translation.annotation.TranslationType;
+import org.dromara.common.translation.constant.TransConstant;
+import org.dromara.common.translation.core.TranslationInterface;
+import org.dromara.order.api.RemoteOrderService;
+
+@AllArgsConstructor
+@TranslationType(type = TransConstant.ORDER_ID_TO_CODE)
+public class OrderCodeTranslationImpl implements TranslationInterface<String> {
+
+    @DubboReference
+    private final RemoteOrderService remoteOrderService;
+
+    @Override
+    public String translation(Object key, String other) {
+        return remoteOrderService.getCodeById(Convert.toLong(key));
+    }
+}

+ 22 - 0
ruoyi-common/ruoyi-common-translation/src/main/java/org/dromara/common/translation/core/impl/StoreNameTranslationImpl.java

@@ -0,0 +1,22 @@
+package org.dromara.common.translation.core.impl;
+
+import cn.hutool.core.convert.Convert;
+import lombok.AllArgsConstructor;
+import org.apache.dubbo.config.annotation.DubboReference;
+import org.dromara.common.translation.annotation.TranslationType;
+import org.dromara.common.translation.constant.TransConstant;
+import org.dromara.common.translation.core.TranslationInterface;
+import org.dromara.system.api.RemoteStoreService;
+
+@AllArgsConstructor
+@TranslationType(type = TransConstant.STORE_ID_TO_NAME)
+public class StoreNameTranslationImpl implements TranslationInterface<String> {
+
+    @DubboReference
+    private final RemoteStoreService remoteStoreService;
+
+    @Override
+    public String translation(Object key, String other) {
+        return remoteStoreService.getNameById(Convert.toLong(key));
+    }
+}

+ 3 - 0
ruoyi-common/ruoyi-common-translation/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports

@@ -7,3 +7,6 @@ org.dromara.common.translation.core.impl.NicknameTranslationImpl
 org.dromara.common.translation.core.impl.AreaStationTranslationImpl
 org.dromara.common.translation.core.impl.TenantNameTranslationImpl
 org.dromara.common.translation.core.impl.TenantCatergoriesNameTranslationImpl
+org.dromara.common.translation.core.impl.CustomerNameTranslationImpl
+org.dromara.common.translation.core.impl.OrderCodeTranslationImpl
+org.dromara.common.translation.core.impl.StoreNameTranslationImpl

+ 0 - 1
ruoyi-common/yingpaipay-common-platform/src/main/java/org/dromara/common/platform/Platform.java

@@ -22,7 +22,6 @@ public enum Platform {
 
     ADMIN(0, "4pwuAzDBzUd6hekvGHHKedT4VX5WHERAXHpeztPFAzRaUsBUrD", "管理后台"),
     MERCHANT(1, "MfJkMNMW2JKXBuPcbP2rxkD3ynXmReAZZFm4fN7cAGwGJdKCmd", "商户后台"),
-    FULFILLER(2, "FlfAppPlatformCodeX9kR7mT3wQ5vZ8nB1jY6pD4sL0hC2gA", "履约者App"),
     ;
 
     private final Integer id;

+ 6 - 0
ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/dubbo/RemoteFileServiceImpl.java

@@ -93,4 +93,10 @@ public class RemoteFileServiceImpl implements RemoteFileService {
         List<SysOssVo> sysOssVos = sysOssService.listByIds(StringUtils.splitTo(ossIds, Convert::toLong));
         return MapstructUtils.convert(sysOssVos, RemoteFile.class);
     }
+
+    @Override
+    public List<RemoteFile> selectByIds(List<Long> ossIds){
+        List<SysOssVo> sysOssVos = sysOssService.listByIds(ossIds);
+        return MapstructUtils.convert(sysOssVos, RemoteFile.class);
+    }
 }

+ 14 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysStoreController.java

@@ -6,7 +6,9 @@ import lombok.RequiredArgsConstructor;
 import jakarta.servlet.http.HttpServletResponse;
 import jakarta.validation.constraints.*;
 import cn.dev33.satoken.annotation.SaCheckPermission;
+import org.dromara.system.domain.bo.SysStoreBanBo;
 import org.dromara.system.domain.bo.SysStorePageBo;
+import org.dromara.system.domain.bo.SysStoreRenewBo;
 import org.dromara.system.domain.vo.*;
 import org.springframework.web.bind.annotation.*;
 import org.springframework.validation.annotation.Validated;
@@ -134,4 +136,16 @@ public class SysStoreController extends BaseController {
         return sysStoreService.listOnOrder(name, site,  pageQuery);
     }
 
+    @RepeatSubmit()
+    @PutMapping("/renew")
+    public R<Void> renew(@RequestBody SysStoreRenewBo bo) {
+        return toAjax(sysStoreService.renew(bo));
+    }
+
+    @RepeatSubmit()
+    @PutMapping("/ban")
+    public R<Void> ban(@RequestBody SysStoreBanBo bo) {
+        return toAjax(sysStoreService.ban(bo));
+    }
+
 }

+ 10 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysStoreBanBo.java

@@ -0,0 +1,10 @@
+package org.dromara.system.domain.bo;
+
+import lombok.Data;
+
+@Data
+public class SysStoreBanBo {
+
+    private Long id;
+
+}

+ 14 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysStoreRenewBo.java

@@ -0,0 +1,14 @@
+package org.dromara.system.domain.bo;
+
+import lombok.Data;
+
+import java.util.Date;
+
+@Data
+public class SysStoreRenewBo {
+
+    private Long id;
+
+    private Date to;
+
+}

+ 59 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/dubbo/RemoteStoreServiceImpl.java

@@ -0,0 +1,59 @@
+package org.dromara.system.dubbo;
+
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import lombok.RequiredArgsConstructor;
+import org.apache.dubbo.config.annotation.DubboService;
+import org.dromara.common.core.constant.CacheNames;
+import org.dromara.common.tenant.helper.TenantHelper;
+import org.dromara.system.api.RemoteStoreService;
+import org.dromara.system.api.domain.vo.RemoteStoreVo;
+import org.dromara.system.domain.SysStore;
+import org.dromara.system.mapper.SysStoreMapper;
+import org.springframework.cache.annotation.Cacheable;
+import org.springframework.stereotype.Service;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import java.util.concurrent.atomic.AtomicReference;
+
+@RequiredArgsConstructor
+@Service
+@DubboService
+public class RemoteStoreServiceImpl implements RemoteStoreService {
+
+    private final SysStoreMapper baseMapper;
+
+    @Cacheable(cacheNames = CacheNames.SYS_STORE_NAME, key = "#id")
+    @Override
+    public String getNameById(Long id) {
+        AtomicReference<SysStore> store = new AtomicReference<>();
+        TenantHelper.ignore(() -> store.set(baseMapper.selectOne(
+            Wrappers.lambdaQuery(SysStore.class)
+                .select(SysStore::getName)
+                .eq(SysStore::getId, id)
+        )));
+        return store.get().getName();
+    }
+
+    @Override
+    public List<RemoteStoreVo> getByIds(List<Long> storeIds) {
+        if (storeIds.isEmpty()) {
+            return Collections.emptyList();
+        }
+
+        List<RemoteStoreVo> vos = new ArrayList<>();
+        baseMapper.selectList(
+            Wrappers.lambdaQuery(SysStore.class)
+                .select(SysStore::getId, SysStore::getName)
+                .in(SysStore::getId, storeIds)
+        ).forEach(e -> {
+            RemoteStoreVo vo = new RemoteStoreVo();
+            vo.setId(e.getId());
+            vo.setName(e.getName());
+            vos.add(vo);
+        });
+
+        return vos;
+    }
+}

+ 61 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/dubbo/RemoteUserServiceImpl.java

@@ -5,6 +5,7 @@ import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.lang.Opt;
 import cn.hutool.core.util.ObjectUtil;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import lombok.RequiredArgsConstructor;
 import org.apache.dubbo.config.annotation.DubboService;
 import org.dromara.common.core.constant.SystemConstants;
@@ -452,4 +453,64 @@ public class RemoteUserServiceImpl implements RemoteUserService {
         return userService.resetUserPwd(userId, password);
     }
 
+    @Override
+    public List<Long> selectUserIdsByName(String username) {
+        List<Long> ids = new ArrayList<>();
+        userMapper.selectList(
+            Wrappers.lambdaQuery(SysUser.class)
+                .select(SysUser::getUserId)
+                .like(StringUtils.isNotBlank(username), SysUser::getUserName, username)
+        ).forEach(e -> ids.add(e.getUserId()));
+        return ids;
+    }
+
+    @Override
+    public List<RemoteUserVo> getByIds(List<Long> userIds) {
+        if (userIds.isEmpty()) {
+            return Collections.emptyList();
+        }
+        List<RemoteUserVo> vos = new ArrayList<>();
+        userMapper.selectList(
+            Wrappers.lambdaQuery(SysUser.class)
+                .in(SysUser::getUserId, userIds)
+        ).forEach(e -> {
+            RemoteUserVo vo = new RemoteUserVo();
+            vo.setUserId(e.getUserId());
+            vo.setDeptId(e.getDeptId());
+            vo.setUserName(e.getUserName());
+            vo.setNickName(e.getNickName());
+            vo.setUserType(e.getUserType());
+            vo.setEmail(e.getEmail());
+            vo.setPhonenumber(e.getPhonenumber());
+            vo.setSex(e.getSex());
+            vo.setStatus(e.getStatus());
+            vo.setCreateTime(e.getCreateTime());
+            vos.add(vo);
+        });
+        return vos;
+    }
+
+    @Override
+    public List<RemoteUserVo> selectListByName(String username) {
+        List<RemoteUserVo> vos = new ArrayList<>();
+        userMapper.selectList(
+            Wrappers.lambdaQuery(SysUser.class)
+                .like(StringUtils.isNotBlank(username), SysUser::getUserName, username)
+        ).forEach(e -> {
+            RemoteUserVo vo = new RemoteUserVo();
+            vo.setUserId(e.getUserId());
+            vo.setDeptId(e.getDeptId());
+            vo.setUserName(e.getUserName());
+            vo.setNickName(e.getNickName());
+            vo.setUserType(e.getUserType());
+            vo.setEmail(e.getEmail());
+            vo.setPhonenumber(e.getPhonenumber());
+            vo.setSex(e.getSex());
+            vo.setStatus(e.getStatus());
+            vo.setCreateTime(e.getCreateTime());
+            vos.add(vo);
+        });
+        return vos;
+    }
+
 }

+ 6 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysStoreService.java

@@ -1,7 +1,9 @@
 package org.dromara.system.service;
 
 import org.dromara.system.domain.SysStore;
+import org.dromara.system.domain.bo.SysStoreBanBo;
 import org.dromara.system.domain.bo.SysStorePageBo;
+import org.dromara.system.domain.bo.SysStoreRenewBo;
 import org.dromara.system.domain.vo.*;
 import org.dromara.system.domain.bo.SysStoreBo;
 import org.dromara.common.mybatis.core.page.TableDataInfo;
@@ -77,4 +79,8 @@ public interface ISysStoreService {
     List<Long> selectStoreIds(Long userId);
 
     TableDataInfo<SysStoreListOnOrderVo> listOnOrder(String name, Long site, PageQuery pageQuery);
+
+    boolean renew(SysStoreRenewBo bo);
+
+    boolean ban(SysStoreBanBo bo);
 }

+ 29 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysStoreServiceImpl.java

@@ -2,6 +2,7 @@ package org.dromara.system.service.impl;
 
 import org.apache.dubbo.config.annotation.DubboReference;
 import org.apache.seata.spring.annotation.GlobalTransactional;
+import org.dromara.common.core.constant.CacheNames;
 import org.dromara.common.core.utils.MapstructUtils;
 import org.dromara.common.core.utils.StringUtils;
 import org.dromara.common.mybatis.core.page.TableDataInfo;
@@ -12,13 +13,16 @@ import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.dromara.common.mybatis.utils.WrapperUtils;
+import org.dromara.common.redis.utils.CacheUtils;
 import org.dromara.common.satoken.utils.LoginHelper;
 import org.dromara.service.api.RemoteStoreServiceService;
 import org.dromara.service.api.domain.bo.RemoteStoreServiceBo;
 import org.dromara.system.constants.StoreConstants;
 import org.dromara.system.domain.SysAreaStation;
 import org.dromara.system.domain.SysUserStore;
+import org.dromara.system.domain.bo.SysStoreBanBo;
 import org.dromara.system.domain.bo.SysStorePageBo;
+import org.dromara.system.domain.bo.SysStoreRenewBo;
 import org.dromara.system.domain.vo.*;
 import org.dromara.system.enums.AreaStationStatusEnum;
 import org.dromara.system.enums.SysStoreStatusEnum;
@@ -165,6 +169,8 @@ public class SysStoreServiceImpl implements ISysStoreService {
             throw new RuntimeException("批量插入关系失败");
         }
 
+        CacheUtils.put(CacheNames.SYS_STORE_NAME, add.getId(), add.getName());
+
         return true;
     }
 
@@ -178,6 +184,9 @@ public class SysStoreServiceImpl implements ISysStoreService {
     public Boolean updateByBo(SysStoreBo bo) {
         SysStore update = MapstructUtils.convert(bo, SysStore.class);
         validEntityBeforeSave(update);
+
+        CacheUtils.put(CacheNames.SYS_STORE_NAME, update.getId(), update.getName());
+
         return baseMapper.updateById(update) > 0;
     }
 
@@ -200,6 +209,7 @@ public class SysStoreServiceImpl implements ISysStoreService {
         if(isValid){
             //TODO 做一些业务上的校验,判断是否需要校验
         }
+        ids.forEach(id -> CacheUtils.evict(CacheNames.SYS_STORE_NAME, id));
         return baseMapper.deleteByIds(ids) > 0;
     }
 
@@ -284,4 +294,23 @@ public class SysStoreServiceImpl implements ISysStoreService {
             return vo;
         }));
     }
+
+    @Override
+    public boolean renew(SysStoreRenewBo bo) {
+        return baseMapper.update(
+            Wrappers.lambdaUpdate(SysStore.class)
+                .eq(SysStore::getId, bo.getId())
+                .set(SysStore::getEndBusinessTime, bo.getTo())
+                .set(SysStore::getStatus, SysStoreStatusEnum.IN_OPERATION.getValue())
+        ) > 0;
+    }
+
+    @Override
+    public boolean ban(SysStoreBanBo bo) {
+        return baseMapper.update(
+            Wrappers.lambdaUpdate(SysStore.class)
+                .eq(SysStore::getId, bo.getId())
+                .set(SysStore::getStatus, SysStoreStatusEnum.BANNED.getValue())
+        ) > 0;
+    }
 }

+ 13 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysTenantCategoriesServiceImpl.java

@@ -1,5 +1,6 @@
 package org.dromara.system.service.impl;
 
+import org.dromara.common.core.exception.ServiceException;
 import org.dromara.common.core.utils.MapstructUtils;
 import org.dromara.common.core.utils.StringUtils;
 import org.dromara.common.mybatis.core.page.TableDataInfo;
@@ -9,7 +10,9 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
+import org.dromara.system.domain.SysStore;
 import org.dromara.system.domain.vo.SysTenantCategoriesOnStoreVo;
+import org.dromara.system.mapper.SysStoreMapper;
 import org.springframework.stereotype.Service;
 import org.dromara.system.domain.bo.SysTenantCategoriesBo;
 import org.dromara.system.domain.vo.SysTenantCategoriesVo;
@@ -33,6 +36,7 @@ import java.util.Collection;
 public class SysTenantCategoriesServiceImpl implements ISysTenantCategoriesService {
 
     private final SysTenantCategoriesMapper baseMapper;
+    private final SysStoreMapper storeMapper;
 
     /**
      * 查询商户分类
@@ -133,6 +137,15 @@ public class SysTenantCategoriesServiceImpl implements ISysTenantCategoriesServi
         if(isValid){
             //TODO 做一些业务上的校验,判断是否需要校验
         }
+
+        boolean exists = storeMapper.exists(
+            Wrappers.lambdaQuery(SysStore.class)
+                .in(SysStore::getTenantCatergories, ids)
+        );
+        if (exists) {
+            throw new ServiceException("存在有门店绑定,不能删除");
+        }
+
         return baseMapper.deleteByIds(ids) > 0;
     }
 

+ 5 - 0
ruoyi-modules/yingpaipay-archieves/pom.xml

@@ -94,6 +94,11 @@
             <artifactId>ruoyi-api-resource</artifactId>
         </dependency>
 
+        <dependency>
+            <groupId>org.dromara</groupId>
+            <artifactId>yingpaipay-api-archieves</artifactId>
+        </dependency>
+
         <!-- RuoYi Api System -->
         <dependency>
             <groupId>org.dromara</groupId>

+ 2 - 0
ruoyi-modules/yingpaipay-archieves/src/main/java/org/dromara/archieves/YingpaipayArchievesApplication.java

@@ -1,10 +1,12 @@
 package org.dromara.archieves;
 
 import lombok.extern.slf4j.Slf4j;
+import org.apache.dubbo.config.spring.context.annotation.EnableDubbo;
 import org.springframework.boot.SpringApplication;
 import org.springframework.boot.autoconfigure.SpringBootApplication;
 import org.springframework.boot.context.metrics.buffering.BufferingApplicationStartup;
 
+@EnableDubbo
 @SpringBootApplication
 @Slf4j
 public class YingpaipayArchievesApplication {

+ 1 - 1
ruoyi-modules/yingpaipay-archieves/src/main/java/org/dromara/archieves/controller/UsrCustomerController.java

@@ -70,7 +70,7 @@ public class UsrCustomerController extends BaseController {
     /**
      * 获取用户详细信息
      */
-    @SaCheckPermission("archieves:customer:query")
+//    @SaCheckPermission("archieves:customer:query")
     @GetMapping("/{id}")
     public R<UsrCustomerVo> getInfo(@NotNull(message = "主键不能为空")
                                     @PathVariable("id") Long id) {

+ 1 - 2
ruoyi-modules/yingpaipay-archieves/src/main/java/org/dromara/archieves/controller/UsrPetController.java

@@ -6,7 +6,6 @@ import lombok.RequiredArgsConstructor;
 import jakarta.servlet.http.HttpServletResponse;
 import jakarta.validation.constraints.*;
 import cn.dev33.satoken.annotation.SaCheckPermission;
-import org.dromara.archieves.domain.vo.UsrPetOnOrderVo;
 import org.springframework.web.bind.annotation.*;
 import org.springframework.validation.annotation.Validated;
 import org.dromara.common.idempotent.annotation.RepeatSubmit;
@@ -71,7 +70,7 @@ public class UsrPetController extends BaseController {
     /**
      * 获取宠物详细信息
      */
-    @SaCheckPermission("archieves:pet:query")
+//    @SaCheckPermission("archieves:pet:query")
     @GetMapping("/{id}")
     public R<UsrPetVo> getInfo(@NotNull(message = "主键不能为空")
                                @PathVariable("id") Long id) {

+ 1 - 1
ruoyi-modules/yingpaipay-archieves/src/main/java/org/dromara/archieves/domain/UsrPet.java

@@ -35,7 +35,7 @@ public class UsrPet extends BaseEntity {
 
     private Long avatar;
 
-    private Integer type;
+    private String type;
 
     private String breed;
 

+ 1 - 1
ruoyi-modules/yingpaipay-archieves/src/main/java/org/dromara/archieves/domain/bo/UsrPetBo.java

@@ -35,7 +35,7 @@ public class UsrPetBo extends BaseEntity {
 
     private Long avatar;
 
-    private Integer type;
+    private String type;
 
     private String breed;
 

+ 1 - 1
ruoyi-modules/yingpaipay-archieves/src/main/java/org/dromara/archieves/domain/vo/UsrPetOnOrderVo.java

@@ -15,6 +15,6 @@ public class UsrPetOnOrderVo implements Serializable {
 
     private String name;
 
-    private Integer type;
+    private String type;
 
 }

+ 1 - 1
ruoyi-modules/yingpaipay-archieves/src/main/java/org/dromara/archieves/domain/vo/UsrPetVo.java

@@ -42,7 +42,7 @@ public class UsrPetVo implements Serializable {
     private String avatarUrl;
 
     @ExcelProperty(value = "类型")
-    private Integer type;
+    private Integer String;
 
     @ExcelProperty(value = "品种")
     private String breed;

+ 82 - 0
ruoyi-modules/yingpaipay-archieves/src/main/java/org/dromara/archieves/dubbo/RemoteCustomerServiceImpl.java

@@ -0,0 +1,82 @@
+package org.dromara.archieves.dubbo;
+
+import com.baomidou.mybatisplus.core.toolkit.StringUtils;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import lombok.RequiredArgsConstructor;
+import org.apache.dubbo.config.annotation.DubboService;
+import org.dromara.api.RemoteCustomerService;
+import org.dromara.api.domain.vo.RemoteCustomerVo;
+import org.dromara.archieves.domain.UsrCustomer;
+import org.dromara.archieves.mapper.UsrCustomerMapper;
+import org.dromara.common.core.constant.CacheNames;
+import org.springframework.cache.annotation.Cacheable;
+import org.springframework.stereotype.Service;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+@DubboService
+@Service
+@RequiredArgsConstructor
+public class RemoteCustomerServiceImpl implements RemoteCustomerService {
+
+    private final UsrCustomerMapper baseMapper;
+
+    @Override
+    public List<Long> selectIdsByName(String name) {
+        List<Long> ids = new ArrayList<>();
+        baseMapper.selectList(
+            Wrappers.lambdaQuery(UsrCustomer.class)
+                .select(UsrCustomer::getId)
+                .like(StringUtils.isNotBlank(name), UsrCustomer::getName, name)
+        ).forEach(e -> ids.add(e.getId()));
+        return ids;
+    }
+
+    @Cacheable(cacheNames = CacheNames.USR_CUSTOMER_NAME, key = "#id")
+    @Override
+    public String selectNameById(Long id) {
+        return baseMapper.selectOne(
+            Wrappers.lambdaQuery(UsrCustomer.class)
+                .select(UsrCustomer::getName)
+                .eq(UsrCustomer::getId, id)
+        ).getName();
+    }
+
+    @Override
+    public List<RemoteCustomerVo> getByIds(List<Long> customerIds) {
+        if (customerIds.isEmpty()) {
+            return Collections.emptyList();
+        }
+        List<RemoteCustomerVo> vos = new ArrayList<>();
+        baseMapper.selectList(
+            Wrappers.lambdaQuery(UsrCustomer.class)
+                .select(UsrCustomer::getId, UsrCustomer::getName, UsrCustomer::getAddress)
+                .in(UsrCustomer::getId, customerIds)
+        ).forEach(e -> {
+            RemoteCustomerVo vo = new RemoteCustomerVo();
+            vo.setId(e.getId());
+            vo.setName(e.getName());
+            vo.setAddress(e.getAddress());
+            vos.add(vo);
+        });
+        return vos;
+    }
+
+    @Override
+    public List<RemoteCustomerVo> selectListByName(String name) {
+        List<RemoteCustomerVo> vos = new ArrayList<>();
+        baseMapper.selectList(
+            Wrappers.lambdaQuery(UsrCustomer.class)
+                .select(UsrCustomer::getId, UsrCustomer::getName)
+                .like(StringUtils.isNotBlank(name), UsrCustomer::getName, name)
+        ).forEach(e -> {
+            RemoteCustomerVo vo = new RemoteCustomerVo();
+            vo.setId(e.getId());
+            vo.setName(e.getName());
+            vos.add(vo);
+        });
+        return vos;
+    }
+}

+ 46 - 0
ruoyi-modules/yingpaipay-archieves/src/main/java/org/dromara/archieves/dubbo/RemotePetServiceImpl.java

@@ -0,0 +1,46 @@
+package org.dromara.archieves.dubbo;
+
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import lombok.RequiredArgsConstructor;
+import org.apache.dubbo.config.annotation.DubboService;
+import org.dromara.api.RemotePetService;
+import org.dromara.api.domain.vo.RemotePetVo;
+import org.dromara.archieves.domain.UsrPet;
+import org.dromara.archieves.mapper.SysTagRelMapper;
+import org.dromara.archieves.mapper.UsrPetMapper;
+import org.dromara.common.mybatis.utils.WrapperUtils;
+import org.springframework.stereotype.Service;
+
+import java.util.ArrayList;
+import java.util.List;
+
+@RequiredArgsConstructor
+@Service
+@DubboService
+public class RemotePetServiceImpl implements RemotePetService {
+
+    private final UsrPetMapper baseMapper;
+    private final SysTagRelMapper tagRelMapper;
+
+    @Override
+    public List<RemotePetVo> getByIds(List<Long> petIds) {
+
+        List<RemotePetVo> vos = new ArrayList<>();
+
+        List<UsrPet> pets = baseMapper.selectList(
+            Wrappers.lambdaQuery(UsrPet.class)
+                .select(UsrPet::getId, UsrPet::getName, UsrPet::getBreed)
+                .in(UsrPet::getId, WrapperUtils.convertIds(petIds))
+        );
+
+        for (UsrPet pet : pets) {
+            RemotePetVo vo = new RemotePetVo();
+            vo.setId(pet.getId());
+            vo.setName(pet.getName());
+            vo.setBreed(pet.getBreed());
+            vos.add(vo);
+        }
+
+        return vos;
+    }
+}

+ 12 - 5
ruoyi-modules/yingpaipay-archieves/src/main/java/org/dromara/archieves/service/impl/UsrCustomerServiceImpl.java

@@ -1,6 +1,7 @@
 package org.dromara.archieves.service.impl;
 
 import org.dromara.archieves.domain.vo.UsrCustomerOnOrderVo;
+import org.dromara.common.core.constant.CacheNames;
 import org.dromara.common.core.utils.MapstructUtils;
 import org.dromara.common.core.utils.StringUtils;
 import org.dromara.common.mybatis.core.page.TableDataInfo;
@@ -10,6 +11,7 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
+import org.dromara.common.redis.utils.CacheUtils;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 import org.dromara.archieves.domain.SysTagRel;
@@ -92,6 +94,7 @@ public class UsrCustomerServiceImpl implements IUsrCustomerService {
             bo.setId(add.getId());
             saveTagRels(add.getId(), bo.getTagIds(), "user");
         }
+        CacheUtils.put(CacheNames.USR_CUSTOMER_NAME, add.getId(), add.getName());
         return flag;
     }
 
@@ -104,6 +107,7 @@ public class UsrCustomerServiceImpl implements IUsrCustomerService {
         if (flag) {
             saveTagRels(bo.getId(), bo.getTagIds(), "user");
         }
+        CacheUtils.put(CacheNames.USR_CUSTOMER_NAME, update.getId(), update.getName());
         return flag;
     }
 
@@ -117,11 +121,14 @@ public class UsrCustomerServiceImpl implements IUsrCustomerService {
             //TODO 做一些业务上的校验
         }
         // 删除标签关联
-        ids.forEach(id -> tagRelMapper.delete(
-            Wrappers.lambdaQuery(SysTagRel.class)
-                .eq(SysTagRel::getTargetId, id)
-                .eq(SysTagRel::getTargetType, "user")
-        ));
+        ids.forEach(id -> {
+            tagRelMapper.delete(
+                Wrappers.lambdaQuery(SysTagRel.class)
+                    .eq(SysTagRel::getTargetId, id)
+                    .eq(SysTagRel::getTargetType, "user")
+            );
+            CacheUtils.evict(CacheNames.USR_CUSTOMER_NAME, id);
+        });
         return baseMapper.deleteByIds(ids) > 0;
     }
 

+ 5 - 0
ruoyi-modules/yingpaipay-fulfiller/pom.xml

@@ -95,6 +95,11 @@
             <artifactId>ruoyi-api-resource</artifactId>
         </dependency>
 
+        <dependency>
+            <groupId>org.dromara</groupId>
+            <artifactId>yingpaipay-api-fulfiller</artifactId>
+        </dependency>
+
         <!-- RuoYi Api System -->
         <dependency>
             <groupId>org.dromara</groupId>

+ 12 - 0
ruoyi-modules/yingpaipay-fulfiller/src/main/java/org/dromara/fulfiller/controller/FlfFulfillerController.java

@@ -7,6 +7,7 @@ import lombok.RequiredArgsConstructor;
 import jakarta.servlet.http.HttpServletResponse;
 import jakarta.validation.constraints.*;
 import cn.dev33.satoken.annotation.SaCheckPermission;
+import org.dromara.fulfiller.domain.vo.FlfFulfillerOnOrderVo;
 import org.springframework.web.bind.annotation.*;
 import org.springframework.validation.annotation.Validated;
 import org.dromara.common.idempotent.annotation.RepeatSubmit;
@@ -268,4 +269,15 @@ public class FlfFulfillerController extends BaseController {
         return toAjax(fulfillerService.adjustBalance(bo));
     }
 
+    /**
+     * 订单式获取履约者
+     */
+    @GetMapping("/pageOnOrder")
+    public TableDataInfo<FlfFulfillerOnOrderVo> pageOnOrder(
+        @RequestParam(name = "content", required = false) String content,
+        PageQuery pageQuery
+    ) {
+        return fulfillerService.pageOnOrder(content, pageQuery);
+    }
+
 }

+ 25 - 0
ruoyi-modules/yingpaipay-fulfiller/src/main/java/org/dromara/fulfiller/domain/vo/FlfFulfillerOnOrderVo.java

@@ -0,0 +1,25 @@
+package org.dromara.fulfiller.domain.vo;
+
+import lombok.Data;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.util.List;
+
+@Data
+public class FlfFulfillerOnOrderVo implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    private Long id;
+
+    private String name;
+
+    private String avatar;
+
+    private String phone;
+
+    private List<Long> tags;
+
+}

+ 31 - 4
ruoyi-modules/yingpaipay-fulfiller/src/main/java/org/dromara/fulfiller/dubbo/RemoteFulfillerServiceImpl.java

@@ -1,5 +1,6 @@
 package org.dromara.fulfiller.dubbo;
 
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.dubbo.config.annotation.DubboService;
@@ -7,11 +8,16 @@ import org.dromara.common.core.exception.ServiceException;
 import org.dromara.common.core.exception.user.UserException;
 import org.dromara.common.tenant.helper.TenantHelper;
 import org.dromara.fulfiller.api.RemoteFulfillerService;
+import org.dromara.fulfiller.api.domain.vo.RemoteFulfillerVo;
 import org.dromara.fulfiller.api.model.FulfillerLoginUser;
 import org.dromara.fulfiller.domain.FlfFulfiller;
 import org.dromara.fulfiller.mapper.FlfFulfillerMapper;
 import org.springframework.stereotype.Service;
 
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
 /**
  * 履约者服务实现
  *
@@ -32,12 +38,12 @@ public class RemoteFulfillerServiceImpl implements RemoteFulfillerService {
                 .eq(FlfFulfiller::getPhone, phone)
                 .eq(FlfFulfiller::getDelFlag, "0")
         );
-        
+
         if (fulfiller == null) {
             log.info("登录用户:{} 不存在.", phone);
             throw new UserException("user.not.exists");
         }
-        
+
         if ("disabled".equals(fulfiller.getStatus())) {
             log.info("登录用户:{} 已被禁用.", phone);
             throw new UserException("user.blocked");
@@ -49,12 +55,12 @@ public class RemoteFulfillerServiceImpl implements RemoteFulfillerService {
     @Override
     public FulfillerLoginUser getFulfillerById(Long id) throws UserException {
         FlfFulfiller fulfiller = fulfillerMapper.selectById(id);
-        
+
         if (fulfiller == null) {
             log.info("履约者ID:{} 不存在.", id);
             throw new UserException("user.not.exists");
         }
-        
+
         if ("disabled".equals(fulfiller.getStatus())) {
             log.info("履约者ID:{} 已被禁用.", id);
             throw new UserException("user.blocked");
@@ -63,6 +69,27 @@ public class RemoteFulfillerServiceImpl implements RemoteFulfillerService {
         return toLoginUser(fulfiller);
     }
 
+    @Override
+    public List<RemoteFulfillerVo> getByIds(List<Long> fulfillerIds) {
+
+        if (fulfillerIds.isEmpty()) {
+            return Collections.emptyList();
+        }
+
+        List<RemoteFulfillerVo> vos = new ArrayList<>();
+        fulfillerMapper.selectList(
+            Wrappers.lambdaQuery(FlfFulfiller.class)
+                .select(FlfFulfiller::getId, FlfFulfiller::getName)
+                .in(FlfFulfiller::getId, fulfillerIds)
+        ).forEach(e -> {
+            RemoteFulfillerVo vo = new RemoteFulfillerVo();
+            vo.setId(e.getId());
+            vo.setName(e.getName());
+            vos.add(vo);
+        });
+        return vos;
+    }
+
     /**
      * 手动转换 FlfFulfiller → FulfillerLoginUser(避免跨模块 MapStruct 转换器缺失)
      */

+ 2 - 0
ruoyi-modules/yingpaipay-fulfiller/src/main/java/org/dromara/fulfiller/service/IFlfFulfillerService.java

@@ -4,6 +4,7 @@ import org.dromara.fulfiller.domain.bo.FlfFulfillerBo;
 import org.dromara.fulfiller.domain.bo.FlfAdjustBalanceBo;
 import org.dromara.fulfiller.domain.bo.FlfAdjustPointsBo;
 import org.dromara.fulfiller.domain.bo.FlfRewardBo;
+import org.dromara.fulfiller.domain.vo.FlfFulfillerOnOrderVo;
 import org.dromara.fulfiller.domain.vo.FlfFulfillerVo;
 import org.dromara.common.mybatis.core.page.TableDataInfo;
 import org.dromara.common.mybatis.core.page.PageQuery;
@@ -126,4 +127,5 @@ public interface IFlfFulfillerService {
      */
     Boolean updateAuthInfoByUserId(Long userId, java.util.Map<String, String> params);
 
+    TableDataInfo<FlfFulfillerOnOrderVo> pageOnOrder(String content, PageQuery pageQuery);
 }

+ 49 - 3
ruoyi-modules/yingpaipay-fulfiller/src/main/java/org/dromara/fulfiller/service/impl/FlfFulfillerServiceImpl.java

@@ -12,7 +12,9 @@ import cn.hutool.crypto.digest.BCrypt;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.dubbo.config.annotation.DubboReference;
+import org.dromara.common.mybatis.utils.WrapperUtils;
 import org.dromara.common.satoken.utils.LoginHelper;
+import org.dromara.fulfiller.domain.vo.FlfFulfillerOnOrderVo;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 import org.dromara.fulfiller.domain.FlfAudit;
@@ -41,9 +43,7 @@ import org.dromara.resource.api.RemoteFileService;
 import org.dromara.resource.api.domain.RemoteFile;
 import org.dromara.system.api.RemoteAreaStationService;
 
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
+import java.util.*;
 import java.util.stream.Collectors;
 
 /**
@@ -313,6 +313,7 @@ public class FlfFulfillerServiceImpl implements IFlfFulfillerService {
 
     /**
      * 填充VO的图片URL、站点名称、服务类型列表等
+     *
      * @author steelwei
      */
     private void enrichVo(FlfFulfillerVo vo) {
@@ -572,4 +573,49 @@ public class FlfFulfillerServiceImpl implements IFlfFulfillerService {
         return auditMapper.updateById(audit) > 0;
     }
 
+    @Override
+    public TableDataInfo<FlfFulfillerOnOrderVo> pageOnOrder(String content, PageQuery pageQuery) {
+
+        Page<FlfFulfiller> page = baseMapper.selectPage(
+            pageQuery.build(),
+            Wrappers.lambdaQuery(FlfFulfiller.class)
+                .select(FlfFulfiller::getId, FlfFulfiller::getAvatar, FlfFulfiller::getPhone, FlfFulfiller::getName)
+                .orderByDesc(FlfFulfiller::getId)
+                .and(StringUtils.isNotBlank(content), wrapper -> wrapper
+                    .like(FlfFulfiller::getName, content).or().like(FlfFulfiller::getPhone, content)
+                )
+        );
+        List<Long> fulfillerIds = new ArrayList<>();
+        List<Long> avatarIds = new ArrayList<>();
+        page.getRecords().forEach(e -> {
+            fulfillerIds.add(e.getId());
+            if ((StringUtils.isNotBlank(e.getAvatar()))) {
+                avatarIds.add(Long.parseLong(e.getAvatar()));
+            }
+        });
+        Map<Long, List<Long>> tagMap = new HashMap<>();
+        Map<Long, RemoteFile> avatarMap = new HashMap<>();
+        tagRelMapper.selectList(
+            Wrappers.lambdaQuery(SysTagRel.class)
+                .eq(SysTagRel::getTargetType, "fulfiller")
+                .in(SysTagRel::getTargetId, WrapperUtils.convertIds(fulfillerIds))
+        ).forEach(e -> tagMap.computeIfAbsent(e.getTargetId(), k -> new ArrayList<>()).add(e.getTagId()));
+
+        remoteFileService.selectByIds(avatarIds).forEach(e -> avatarMap.put(e.getOssId(), e));
+
+        return TableDataInfo.build(page.convert(e -> {
+            FlfFulfillerOnOrderVo vo = new FlfFulfillerOnOrderVo();
+            vo.setId(e.getId());
+            vo.setName(e.getName());
+            vo.setAvatar(
+                Optional.ofNullable(e.getAvatar())
+                    .map(id -> avatarMap.get(Long.parseLong(id)).getUrl())
+                    .orElse(null)
+            );
+            vo.setPhone(e.getPhone());
+            vo.setTags(tagMap.get(e.getId()));
+            return vo;
+        }));
+    }
+
 }

+ 15 - 0
ruoyi-modules/yingpaipay-order/pom.xml

@@ -100,6 +100,21 @@
             <artifactId>yingpaipay-api-service</artifactId>
         </dependency>
 
+        <dependency>
+            <groupId>org.dromara</groupId>
+            <artifactId>yingpaipay-api-archieves</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.dromara</groupId>
+            <artifactId>yingpaipay-api-fulfiller</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.dromara</groupId>
+            <artifactId>yingpaipay-api-order</artifactId>
+        </dependency>
+
         <!-- RuoYi Api System -->
         <dependency>
             <groupId>org.dromara</groupId>

+ 2 - 0
ruoyi-modules/yingpaipay-order/src/main/java/org/dromara/order/YingpaipayOrderApplication.java

@@ -1,10 +1,12 @@
 package org.dromara.order;
 
 import lombok.extern.slf4j.Slf4j;
+import org.apache.dubbo.config.spring.context.annotation.EnableDubbo;
 import org.springframework.boot.SpringApplication;
 import org.springframework.boot.autoconfigure.SpringBootApplication;
 import org.springframework.boot.context.metrics.buffering.BufferingApplicationStartup;
 
+@EnableDubbo
 @SpringBootApplication
 @Slf4j
 public class YingpaipayOrderApplication {

+ 6 - 5
ruoyi-modules/yingpaipay-order/src/main/java/org/dromara/order/controller/SysOrderController.java

@@ -2,14 +2,14 @@ package org.dromara.order.controller;
 
 import lombok.RequiredArgsConstructor;
 import org.dromara.common.core.domain.R;
+import org.dromara.common.idempotent.annotation.RepeatSubmit;
 import org.dromara.common.web.core.BaseController;
 import org.dromara.order.domain.bo.SysOrderCreateBo;
 import org.dromara.order.service.ISysOrderService;
-import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.RequestBody;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
 
+@Validated
 @RestController
 @RequestMapping("/order")
 @RequiredArgsConstructor
@@ -17,8 +17,9 @@ public class SysOrderController extends BaseController {
 
     private final ISysOrderService orderService;
 
+    @RepeatSubmit()
     @PostMapping("/create")
-    public R<Void> create(@RequestBody SysOrderCreateBo bo) {
+    public R<Void> create(@Validated @RequestBody SysOrderCreateBo bo) {
         return toAjax(orderService.create(bo));
     }
 

+ 46 - 0
ruoyi-modules/yingpaipay-order/src/main/java/org/dromara/order/controller/SysSubOrderController.java

@@ -0,0 +1,46 @@
+package org.dromara.order.controller;
+
+import lombok.RequiredArgsConstructor;
+import org.dromara.common.core.domain.R;
+import org.dromara.common.idempotent.annotation.RepeatSubmit;
+import org.dromara.common.mybatis.core.page.PageQuery;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.common.web.core.BaseController;
+import org.dromara.order.domain.bo.SysSubOrderCancelBo;
+import org.dromara.order.domain.bo.SysSubOrderDispatchBo;
+import org.dromara.order.domain.bo.SysSubOrderListPageBo;
+import org.dromara.order.domain.vo.SysSubOrderListPageVo;
+import org.dromara.order.domain.vo.SysSubOrderVo;
+import org.dromara.order.service.ISysSubOrderService;
+import org.springframework.web.bind.annotation.*;
+
+@RestController
+@RequiredArgsConstructor
+@RequestMapping("/subOrder")
+public class SysSubOrderController extends BaseController {
+
+    private final ISysSubOrderService subOrderService;
+
+    @GetMapping("/list")
+    public TableDataInfo<SysSubOrderListPageVo> list(SysSubOrderListPageBo bo, PageQuery pageQuery) {
+        return subOrderService.list(bo, pageQuery);
+    }
+
+    @GetMapping("/getInfo")
+    public R<SysSubOrderVo> getInfo(@RequestParam Long id) {
+        return R.ok(subOrderService.getInfo(id));
+    }
+
+    @RepeatSubmit()
+    @PutMapping("/dispatch")
+    public R<Void> dispatch(@RequestBody SysSubOrderDispatchBo bo) {
+        return toAjax(subOrderService.dispatch(bo));
+    }
+
+    @RepeatSubmit()
+    @PutMapping("/cancel")
+    public R<Void> cancel(@RequestBody SysSubOrderCancelBo bo) {
+        return toAjax(subOrderService.cancel(bo));
+    }
+
+}

+ 27 - 0
ruoyi-modules/yingpaipay-order/src/main/java/org/dromara/order/controller/SysSubOrderLogController.java

@@ -0,0 +1,27 @@
+package org.dromara.order.controller;
+
+import lombok.RequiredArgsConstructor;
+import org.dromara.common.core.domain.R;
+import org.dromara.common.web.core.BaseController;
+import org.dromara.order.domain.vo.SysSubOrderLogVo;
+import org.dromara.order.service.ISysSubOrderLogService;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.List;
+
+@RestController
+@RequestMapping("/subOrderLog")
+@RequiredArgsConstructor
+public class SysSubOrderLogController extends BaseController {
+
+    private final ISysSubOrderLogService subOrderLogService;
+
+    @GetMapping("/list")
+    public R<List<SysSubOrderLogVo>> list(@RequestParam Long orderId) {
+        return R.ok(subOrderLogService.list(orderId));
+    }
+
+}

+ 34 - 0
ruoyi-modules/yingpaipay-order/src/main/java/org/dromara/order/domain/SysSubOrder.java

@@ -39,6 +39,36 @@ public class SysSubOrder extends TenantEntity {
      */
     private Long orderId;
 
+    /**
+     * 所属门店ID
+     */
+    private Long store;
+
+    /**
+     * 所属门店站点
+     */
+    private Long storeSite;
+
+    /**
+     * 下单人
+     */
+    private Long orderPlacer;
+
+    /**
+     * 宠物主
+     */
+    private Long usrCustomer;
+
+    /**
+     * 宠物
+     */
+    private Long usrPet;
+
+    /**
+     * 服务项目
+     */
+    private Long service;
+
     /**
      * 接送模式(仅接送单有)
      */
@@ -113,4 +143,8 @@ public class SysSubOrder extends TenantEntity {
 
     private String remark;
 
+    private Integer platformId;
+
+    private String groupPurchasePackageName;
+
 }

+ 77 - 0
ruoyi-modules/yingpaipay-order/src/main/java/org/dromara/order/domain/SysSubOrderLog.java

@@ -0,0 +1,77 @@
+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;
+
+/**
+ * 订单操作日志对象 sys_sub_order_log
+ *
+ * @author Huanyi
+ * @date 2026-03-05
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@TableName("sys_sub_order_log")
+public class SysSubOrderLog extends TenantEntity {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 序号
+     */
+    @TableId(value = "id")
+    private Long id;
+
+    /**
+     * 子订单ID
+     */
+    private Long subOrderId;
+
+    /**
+     * 操作人
+     */
+    private Long actioner;
+
+    /**
+     * 操作人类型
+     */
+    private Integer actionerType;
+
+    /**
+     * 日志类型
+     */
+    private Integer logType;
+
+    /**
+     * 操作类型
+     */
+    private Integer actionType;
+
+    /**
+     * 标题
+     */
+    private String title;
+
+    /**
+     * 内容
+     */
+    private String content;
+
+    /**
+     * 上传图片
+     */
+    private String photos;
+
+    /**
+     * 删除标志(0代表存在 1代表删除)
+     */
+    @TableLogic
+    private String delFlag;
+
+
+}

+ 10 - 0
ruoyi-modules/yingpaipay-order/src/main/java/org/dromara/order/domain/bo/SysOrderCreateBo.java

@@ -1,5 +1,8 @@
 package org.dromara.order.domain.bo;
 
+import jakarta.validation.constraints.NotBlank;
+import jakarta.validation.constraints.NotEmpty;
+import jakarta.validation.constraints.NotNull;
 import lombok.Data;
 
 import java.util.List;
@@ -7,22 +10,29 @@ import java.util.List;
 @Data
 public class SysOrderCreateBo {
 
+    @NotNull(message = "必须选择一个门店")
     private Long store;
 
     private Long storeSite;
 
+    @NotNull(message = "必须选择一个客户")
     private Long customer;
 
+    @NotNull(message = "必须选择一个萌宠")
     private Long pet;
 
+    @NotBlank(message = "请合法输入套餐名")
     private String groupPurchasePackageName;
 
+    @NotNull(message = "必须选择一个服务")
     private Long service;
 
     private String remark;
 
+    @NotBlank(message = "请从正确途径下单")
     private String tenantId;
 
+    @NotEmpty(message = "请从正确途径下单")
     private List<SysSubOrderCreateBo> subOrders;
 
 }

+ 10 - 0
ruoyi-modules/yingpaipay-order/src/main/java/org/dromara/order/domain/bo/SysSubOrderCancelBo.java

@@ -0,0 +1,10 @@
+package org.dromara.order.domain.bo;
+
+import lombok.Data;
+
+@Data
+public class SysSubOrderCancelBo {
+
+    private Long orderId;
+
+}

+ 14 - 0
ruoyi-modules/yingpaipay-order/src/main/java/org/dromara/order/domain/bo/SysSubOrderDispatchBo.java

@@ -0,0 +1,14 @@
+package org.dromara.order.domain.bo;
+
+import lombok.Data;
+
+@Data
+public class SysSubOrderDispatchBo {
+
+    private Long orderId;
+
+    private Long fulfiller;
+
+    private Long price;
+
+}

+ 14 - 0
ruoyi-modules/yingpaipay-order/src/main/java/org/dromara/order/domain/bo/SysSubOrderListPageBo.java

@@ -0,0 +1,14 @@
+package org.dromara.order.domain.bo;
+
+import lombok.Data;
+
+@Data
+public class SysSubOrderListPageBo {
+
+    private Integer status;
+
+    private Long service;
+
+    private String content;
+
+}

+ 77 - 0
ruoyi-modules/yingpaipay-order/src/main/java/org/dromara/order/domain/bo/SysSubOrderLogBo.java

@@ -0,0 +1,77 @@
+package org.dromara.order.domain.bo;
+
+import org.dromara.order.domain.SysSubOrderLog;
+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.*;
+
+/**
+ * 订单操作日志业务对象 sys_sub_order_log
+ *
+ * @author Huanyi
+ * @date 2026-03-05
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@AutoMapper(target = SysSubOrderLog.class, reverseConvertGenerate = false)
+public class SysSubOrderLogBo extends BaseEntity {
+
+    /**
+     * 序号
+     */
+    @NotNull(message = "序号不能为空", groups = { EditGroup.class })
+    private Long id;
+
+    /**
+     * 子订单ID
+     */
+    @NotNull(message = "子订单ID不能为空", groups = { AddGroup.class, EditGroup.class })
+    private Long subOrderId;
+
+    /**
+     * 操作人
+     */
+    @NotNull(message = "操作人不能为空", groups = { AddGroup.class, EditGroup.class })
+    private Long actioner;
+
+    /**
+     * 操作人类型
+     */
+    @NotNull(message = "操作人类型不能为空", groups = { AddGroup.class, EditGroup.class })
+    private Integer actionerType;
+
+    /**
+     * 日志类型
+     */
+    @NotNull(message = "日志类型不能为空", groups = { AddGroup.class, EditGroup.class })
+    private Integer logType;
+
+    /**
+     * 操作类型
+     */
+    @NotNull(message = "操作类型不能为空", groups = { AddGroup.class, EditGroup.class })
+    private Integer actionType;
+
+    /**
+     * 标题
+     */
+    @NotBlank(message = "标题不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String title;
+
+    /**
+     * 内容
+     */
+    @NotBlank(message = "内容不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String content;
+
+    /**
+     * 上传图片
+     */
+    private String photos;
+
+
+}

+ 62 - 0
ruoyi-modules/yingpaipay-order/src/main/java/org/dromara/order/domain/vo/SysSubOrderListPageVo.java

@@ -0,0 +1,62 @@
+package org.dromara.order.domain.vo;
+
+import lombok.Data;
+import org.dromara.common.translation.annotation.Translation;
+import org.dromara.common.translation.constant.TransConstant;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.util.Date;
+
+@Data
+public class SysSubOrderListPageVo implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    private Long id;
+
+    private String code;
+
+    private Long service;
+
+    private String toAddress;
+
+    private Integer mode;
+
+    private Integer type;
+
+    private Long pet;
+
+    private String petName;
+
+    private String petBreed;
+
+    private Long customer;
+
+//    @Translation(type = TransConstant.CUSTOMER_ID_TO_NAME, mapper = "customer")
+    private String customerName;
+
+    private Long site;
+
+    private Long store;
+
+//    @Translation(type = TransConstant.STORE_ID_TO_NAME, mapper = "store")
+    private String storeName;
+
+    private Long placer;
+
+//    @Translation(type = TransConstant.USER_ID_TO_NAME, mapper = "placer")
+    private String placerUsername;
+
+    private Date createTime;
+
+    private Integer status;
+
+    private Long fulfiller;
+
+    private String fulfillerName;
+
+    private Long price;
+
+}

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

@@ -0,0 +1,86 @@
+package org.dromara.order.domain.vo;
+
+import org.dromara.order.domain.SysSubOrderLog;
+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;
+
+
+
+/**
+ * 订单操作日志视图对象 sys_sub_order_log
+ *
+ * @author Huanyi
+ * @date 2026-03-05
+ */
+@Data
+@ExcelIgnoreUnannotated
+@AutoMapper(target = SysSubOrderLog.class)
+public class SysSubOrderLogVo implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 序号
+     */
+    @ExcelProperty(value = "序号")
+    private Long id;
+
+    /**
+     * 子订单ID
+     */
+    @ExcelProperty(value = "子订单ID")
+    private Long subOrderId;
+
+    /**
+     * 操作人
+     */
+    @ExcelProperty(value = "操作人")
+    private Long actioner;
+
+    /**
+     * 操作人类型
+     */
+    @ExcelProperty(value = "操作人类型")
+    private Integer actionerType;
+
+    /**
+     * 日志类型
+     */
+    @ExcelProperty(value = "日志类型")
+    private Integer logType;
+
+    /**
+     * 操作类型
+     */
+    @ExcelProperty(value = "操作类型")
+    private Integer actionType;
+
+    /**
+     * 标题
+     */
+    @ExcelProperty(value = "标题")
+    private String title;
+
+    /**
+     * 内容
+     */
+    @ExcelProperty(value = "内容")
+    private String content;
+
+    /**
+     * 上传图片
+     */
+    @ExcelProperty(value = "上传图片")
+    private String photos;
+
+
+}

+ 11 - 0
ruoyi-modules/yingpaipay-order/src/main/java/org/dromara/order/domain/vo/SysSubOrderVo.java

@@ -2,6 +2,8 @@ package org.dromara.order.domain.vo;
 
 import java.util.Date;
 import com.fasterxml.jackson.annotation.JsonFormat;
+import org.dromara.common.translation.annotation.Translation;
+import org.dromara.common.translation.constant.TransConstant;
 import org.dromara.order.domain.SysSubOrder;
 import cn.idev.excel.annotation.ExcelIgnoreUnannotated;
 import cn.idev.excel.annotation.ExcelProperty;
@@ -40,6 +42,7 @@ public class SysSubOrderVo implements Serializable {
      * 订单号
      */
     @ExcelProperty(value = "订单号")
+    @Translation(type = TransConstant.ORDER_ID_TO_CODE, mapper = "orderId")
     private String code;
 
     /**
@@ -126,5 +129,13 @@ public class SysSubOrderVo implements Serializable {
     @ExcelProperty(value = "状态")
     private Integer status;
 
+    private Integer platformId;
+
+    private Long store;
+
+    @Translation(type = TransConstant.STORE_ID_TO_NAME, mapper = "store")
+    private String storeName;
+
+    private String groupPurchasePackageName;
 
 }

+ 29 - 0
ruoyi-modules/yingpaipay-order/src/main/java/org/dromara/order/dubbo/RemoteOrderServiceImpl.java

@@ -0,0 +1,29 @@
+package org.dromara.order.dubbo;
+
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import lombok.RequiredArgsConstructor;
+import org.apache.dubbo.config.annotation.DubboService;
+import org.dromara.common.core.constant.CacheNames;
+import org.dromara.order.api.RemoteOrderService;
+import org.dromara.order.domain.SysOrder;
+import org.dromara.order.mapper.SysOrderMapper;
+import org.springframework.cache.annotation.Cacheable;
+import org.springframework.stereotype.Service;
+
+@Service
+@DubboService
+@RequiredArgsConstructor
+public class RemoteOrderServiceImpl implements RemoteOrderService {
+
+    private final SysOrderMapper baseMapper;
+
+    @Cacheable(cacheNames = CacheNames.SYS_ORDER_CODE, key = "#id")
+    @Override
+    public String getCodeById(Long id) {
+        return baseMapper.selectOne(
+            Wrappers.lambdaQuery(SysOrder.class)
+                .select(SysOrder::getCode)
+                .eq(SysOrder::getId, id)
+        ).getCode();
+    }
+}

+ 24 - 0
ruoyi-modules/yingpaipay-order/src/main/java/org/dromara/order/enums/OrderLogActionTypeEnum.java

@@ -0,0 +1,24 @@
+package org.dromara.order.enums;
+
+import lombok.AccessLevel;
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+@Getter
+@AllArgsConstructor(access = AccessLevel.PRIVATE)
+public enum OrderLogActionTypeEnum {
+
+    CREATE_ORDER(0, "订单创建"),
+    DISPATCH(1, "系统派单"),
+    FULFILLER_RECIEVE(2, "已接单"),
+    RECIEVED(3, "接单成功"),
+    ARRIVE_LOCK_ON(4, "到达打卡"),
+    ARRIVED(5, "到达服务点"),
+    START_SERVICE(6, "开始服务"),
+    FINISH_SERVICE(7, "服务结束"),
+    WAITING_FOR_CONFIRM(8, "待商家确认"),
+    FINISH(9, "订单完成"),
+    ;
+    private final Integer value;
+    private final String label;
+}

+ 17 - 0
ruoyi-modules/yingpaipay-order/src/main/java/org/dromara/order/enums/OrderLogActionerTypeEnum.java

@@ -0,0 +1,17 @@
+package org.dromara.order.enums;
+
+import lombok.AccessLevel;
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+@Getter
+@AllArgsConstructor(access = AccessLevel.PRIVATE)
+public enum OrderLogActionerTypeEnum {
+
+    SYS_USER(0, "系统用户"),
+    FULFILLER(1, "履约者"),
+    ;
+    private final Integer value;
+    private final String label;
+
+}

+ 17 - 0
ruoyi-modules/yingpaipay-order/src/main/java/org/dromara/order/enums/OrderLogTypeEnum.java

@@ -0,0 +1,17 @@
+package org.dromara.order.enums;
+
+import lombok.AccessLevel;
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+@Getter
+@AllArgsConstructor(access = AccessLevel.PRIVATE)
+public enum OrderLogTypeEnum {
+
+    ORDER(0, "订单日志"),
+    FULFILLER(1, "服务进度"),
+    ;
+    private final Integer value;
+    private final String label;
+
+}

+ 19 - 0
ruoyi-modules/yingpaipay-order/src/main/java/org/dromara/order/enums/OrderTypeEnum.java

@@ -0,0 +1,19 @@
+package org.dromara.order.enums;
+
+import lombok.AccessLevel;
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+@Getter
+@AllArgsConstructor(access = AccessLevel.PRIVATE)
+public enum OrderTypeEnum {
+
+    ROUNDTRIPPING_PICK(0, "往返接送/接"),
+    ROUNDTRIPPING_SEND(1, "往返接送/送"),
+    PICK(2, "单程接(到店)"),
+    SEND(3, "单程送(回家)"),
+    ;
+    private final Integer value;
+    private final String label;
+
+}

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

@@ -0,0 +1,15 @@
+package org.dromara.order.mapper;
+
+import org.dromara.order.domain.SysSubOrderLog;
+import org.dromara.order.domain.vo.SysSubOrderLogVo;
+import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
+
+/**
+ * 订单操作日志Mapper接口
+ *
+ * @author Huanyi
+ * @date 2026-03-05
+ */
+public interface SysSubOrderLogMapper extends BaseMapperPlus<SysSubOrderLog, SysSubOrderLogVo> {
+
+}

+ 9 - 0
ruoyi-modules/yingpaipay-order/src/main/java/org/dromara/order/service/ISysSubOrderLogService.java

@@ -0,0 +1,9 @@
+package org.dromara.order.service;
+
+import org.dromara.order.domain.vo.SysSubOrderLogVo;
+
+import java.util.List;
+
+public interface ISysSubOrderLogService {
+    List<SysSubOrderLogVo> list(Long orderId);
+}

+ 19 - 0
ruoyi-modules/yingpaipay-order/src/main/java/org/dromara/order/service/ISysSubOrderService.java

@@ -0,0 +1,19 @@
+package org.dromara.order.service;
+
+import org.dromara.common.mybatis.core.page.PageQuery;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.order.domain.bo.SysSubOrderCancelBo;
+import org.dromara.order.domain.bo.SysSubOrderDispatchBo;
+import org.dromara.order.domain.bo.SysSubOrderListPageBo;
+import org.dromara.order.domain.vo.SysSubOrderListPageVo;
+import org.dromara.order.domain.vo.SysSubOrderVo;
+
+public interface ISysSubOrderService {
+    TableDataInfo<SysSubOrderListPageVo> list(SysSubOrderListPageBo bo, PageQuery pageQuery);
+
+    boolean dispatch(SysSubOrderDispatchBo bo);
+
+    boolean cancel(SysSubOrderCancelBo bo);
+
+    SysSubOrderVo getInfo(Long id);
+}

+ 1 - 1
ruoyi-modules/yingpaipay-order/src/main/java/org/dromara/order/service/impl/IOrderStatusServiceImpl.java → ruoyi-modules/yingpaipay-order/src/main/java/org/dromara/order/service/impl/OrderStatusServiceImpl.java

@@ -8,7 +8,7 @@ import org.springframework.stereotype.Service;
 import java.util.List;
 
 @Service
-public class IOrderStatusServiceImpl implements IOrderStatusService {
+public class OrderStatusServiceImpl implements IOrderStatusService {
 
     @Override
     public List<OrderStatusVo> list() {

+ 40 - 2
ruoyi-modules/yingpaipay-order/src/main/java/org/dromara/order/service/impl/SysOrderServiceImpl.java

@@ -1,14 +1,21 @@
 package org.dromara.order.service.impl;
 
 import lombok.RequiredArgsConstructor;
+import org.dromara.common.core.constant.CacheNames;
 import org.dromara.common.core.exception.ServiceException;
 import org.dromara.common.mybatis.utils.IdGeneratorUtil;
 import org.dromara.common.platform.PlatformUtils;
+import org.dromara.common.redis.utils.CacheUtils;
 import org.dromara.common.satoken.utils.LoginHelper;
 import org.dromara.order.domain.SysOrder;
 import org.dromara.order.domain.SysSubOrder;
+import org.dromara.order.domain.SysSubOrderLog;
 import org.dromara.order.domain.bo.SysOrderCreateBo;
+import org.dromara.order.enums.OrderLogActionTypeEnum;
+import org.dromara.order.enums.OrderLogActionerTypeEnum;
+import org.dromara.order.enums.OrderLogTypeEnum;
 import org.dromara.order.mapper.SysOrderMapper;
+import org.dromara.order.mapper.SysSubOrderLogMapper;
 import org.dromara.order.mapper.SysSubOrderMapper;
 import org.dromara.order.service.ISysOrderService;
 import org.springframework.stereotype.Service;
@@ -23,6 +30,7 @@ public class SysOrderServiceImpl implements ISysOrderService {
 
     private final SysOrderMapper baseMapper;
     private final SysSubOrderMapper subOrderMapper;
+    private final SysSubOrderLogMapper subOrderLogMapper;
 
     @Transactional(rollbackFor = Exception.class)
     @Override
@@ -45,15 +53,24 @@ public class SysOrderServiceImpl implements ISysOrderService {
             throw new RuntimeException("订单插入失败");
         }
 
+        CacheUtils.put(CacheNames.SYS_ORDER_CODE, order.getId(), order.getCode());
+
         List<SysSubOrder> subOrders = new ArrayList<>();
         bo.getSubOrders().forEach(e -> {
             SysSubOrder subOrder = new SysSubOrder();
             subOrder.setCode(IdGeneratorUtil.nextUUID().replaceAll("-", ""));
             subOrder.setOrderId(order.getId());
+            subOrder.setStore(bo.getStore());
+            subOrder.setStoreSite(bo.getStoreSite());
+            subOrder.setOrderPlacer(LoginHelper.getUserId());
+            subOrder.setUsrCustomer(bo.getCustomer());
+            subOrder.setUsrPet(bo.getPet());
+            subOrder.setService(bo.getService());
             subOrder.setMode(e.getMode());
             subOrder.setType(e.getType());
             subOrder.setContact(e.getContact());
             subOrder.setContactPhoneNumber(e.getContactPhoneNumber());
+            subOrder.setGroupPurchasePackageName(bo.getGroupPurchasePackageName());
             subOrder.setServiceTime(e.getServiceTime());
             subOrder.setEndServiceTime(e.getEndServiceTime());
             subOrder.setFromCode(e.getFromCode());
@@ -62,14 +79,35 @@ public class SysOrderServiceImpl implements ISysOrderService {
             subOrder.setToAddress(e.getToAddress());
             subOrder.setRemark(order.getRemark());
             subOrder.setTenantId(order.getTenantId());
+            subOrder.setPlatformId(PlatformUtils.getId());
             subOrders.add(subOrder);
+
         });
         boolean subFlag = subOrderMapper.insertBatch(subOrders);
         if (!subFlag) {
             throw new RuntimeException("批量生成子订单失败");
         }
 
-//        return true;
-        throw new ServiceException("成功");
+        // TODO 新增操作日志
+        List<SysSubOrderLog> logs = new ArrayList<>();
+        for (SysSubOrder subOrder : subOrders) {
+            SysSubOrderLog log = new SysSubOrderLog();
+            log.setSubOrderId(subOrder.getId());
+            log.setActioner(LoginHelper.getUserId());
+            log.setActionerType(OrderLogActionerTypeEnum.SYS_USER.getValue());
+            log.setLogType(OrderLogTypeEnum.ORDER.getValue());
+            log.setActionType(OrderLogActionTypeEnum.CREATE_ORDER.getValue());
+            log.setTitle(OrderLogActionTypeEnum.CREATE_ORDER.getLabel());
+            log.setContent("商户提交订单");
+            log.setTenantId(order.getTenantId());
+            logs.add(log);
+        }
+        boolean logFlag = subOrderLogMapper.insertBatch(logs);
+        if (!logFlag) {
+            throw new RuntimeException("批量生成日志失败");
+        }
+
+        return true;
+//        throw new ServiceException("成功");
     }
 }

+ 26 - 0
ruoyi-modules/yingpaipay-order/src/main/java/org/dromara/order/service/impl/SysSubOrderLogServiceImpl.java

@@ -0,0 +1,26 @@
+package org.dromara.order.service.impl;
+
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import lombok.RequiredArgsConstructor;
+import org.dromara.order.domain.SysSubOrderLog;
+import org.dromara.order.domain.vo.SysSubOrderLogVo;
+import org.dromara.order.mapper.SysSubOrderLogMapper;
+import org.dromara.order.service.ISysSubOrderLogService;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+@Service
+@RequiredArgsConstructor
+public class SysSubOrderLogServiceImpl implements ISysSubOrderLogService {
+
+    private final SysSubOrderLogMapper baseMapper;
+
+    @Override
+    public List<SysSubOrderLogVo> list(Long orderId) {
+        return baseMapper.selectVoList(
+            Wrappers.lambdaQuery(SysSubOrderLog.class)
+                .eq(SysSubOrderLog::getSubOrderId, orderId)
+        );
+    }
+}

+ 189 - 0
ruoyi-modules/yingpaipay-order/src/main/java/org/dromara/order/service/impl/SysSubOrderServiceImpl.java

@@ -0,0 +1,189 @@
+package org.dromara.order.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.StringUtils;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import lombok.RequiredArgsConstructor;
+import org.apache.dubbo.config.annotation.DubboReference;
+import org.dromara.api.RemoteCustomerService;
+import org.dromara.api.RemotePetService;
+import org.dromara.api.domain.vo.RemoteCustomerVo;
+import org.dromara.api.domain.vo.RemotePetVo;
+import org.dromara.common.core.exception.ServiceException;
+import org.dromara.common.mybatis.core.page.PageQuery;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.common.mybatis.utils.WrapperUtils;
+import org.dromara.common.satoken.utils.LoginHelper;
+import org.dromara.fulfiller.api.RemoteFulfillerService;
+import org.dromara.fulfiller.api.domain.vo.RemoteFulfillerVo;
+import org.dromara.fulfiller.api.model.FulfillerLoginUser;
+import org.dromara.order.domain.SysOrder;
+import org.dromara.order.domain.SysSubOrder;
+import org.dromara.order.domain.SysSubOrderLog;
+import org.dromara.order.domain.bo.SysSubOrderCancelBo;
+import org.dromara.order.domain.bo.SysSubOrderDispatchBo;
+import org.dromara.order.domain.bo.SysSubOrderListPageBo;
+import org.dromara.order.domain.vo.SysSubOrderListPageVo;
+import org.dromara.order.domain.vo.SysSubOrderVo;
+import org.dromara.order.enums.OrderLogActionTypeEnum;
+import org.dromara.order.enums.OrderLogActionerTypeEnum;
+import org.dromara.order.enums.OrderLogTypeEnum;
+import org.dromara.order.enums.OrderStatusEnum;
+import org.dromara.order.mapper.SysOrderMapper;
+import org.dromara.order.mapper.SysSubOrderLogMapper;
+import org.dromara.order.mapper.SysSubOrderMapper;
+import org.dromara.order.service.ISysSubOrderService;
+import org.dromara.system.api.RemoteStoreService;
+import org.dromara.system.api.RemoteUserService;
+import org.dromara.system.api.domain.vo.RemoteStoreVo;
+import org.dromara.system.api.domain.vo.RemoteUserVo;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+@Service
+@RequiredArgsConstructor
+public class SysSubOrderServiceImpl implements ISysSubOrderService {
+
+    private final SysSubOrderMapper baseMapper;
+    private final SysSubOrderLogMapper subOrderLogMapper;
+
+    @DubboReference
+    private final RemoteUserService remoteUserService;
+    @DubboReference
+    private final RemoteCustomerService remoteCustomerService;
+    @DubboReference
+    private final RemotePetService remotePetService;
+    @DubboReference
+    private final RemoteStoreService remoteStoreService;
+    @DubboReference
+    private final RemoteFulfillerService remoteFulfillerService;
+
+    @Override
+    public TableDataInfo<SysSubOrderListPageVo> list(SysSubOrderListPageBo bo, PageQuery pageQuery) {
+
+        LambdaQueryWrapper<SysOrder> orderWrapper = Wrappers.lambdaQuery(SysOrder.class);
+
+        if (StringUtils.isNotBlank(bo.getContent())) {
+            List<Long> userIds = remoteUserService.selectUserIdsByName(bo.getContent());
+            orderWrapper.in(SysOrder::getOrderPlacer, WrapperUtils.convertIds(userIds));
+            List<Long> customerIds = remoteCustomerService.selectIdsByName(bo.getContent());
+            orderWrapper.in(SysOrder::getUsrCustomer, WrapperUtils.convertIds(customerIds));
+        }
+
+        Page<SysSubOrder> page = baseMapper.selectPage(
+            pageQuery.build(),
+            Wrappers.lambdaQuery(SysSubOrder.class).orderByDesc(SysSubOrder::getId)
+                .eq(bo.getStatus() != null, SysSubOrder::getStatus, bo.getStatus())
+                .eq(bo.getService() != null, SysSubOrder::getService, bo.getService())
+        );
+
+        List<Long> petIds = new ArrayList<>();
+        List<Long> storeIds = new ArrayList<>();
+        List<Long> customerIds = new ArrayList<>();
+        List<Long> userIds = new ArrayList<>();
+        List<Long> fulfillerIds = new ArrayList<>();
+        page.getRecords().forEach(e -> {
+            petIds.add(e.getUsrPet());
+            customerIds.add(e.getUsrCustomer());
+            storeIds.add(e.getStore());
+            userIds.add(e.getOrderPlacer());
+            if (e.getFulfiller() != null) {
+                fulfillerIds.add(e.getFulfiller());
+            }
+        });
+        Map<Long, RemotePetVo> petMap = new HashMap<>();
+        Map<Long, RemoteStoreVo> storeMap = new HashMap<>();
+        Map<Long, RemoteCustomerVo> customerMap = new HashMap<>();
+        Map<Long, RemoteUserVo> userMap = new HashMap<>();
+        Map<Long, RemoteFulfillerVo> fulfillerMap = new HashMap<>();
+        remotePetService.getByIds(petIds).forEach(e -> petMap.put(e.getId(), e));
+        remoteStoreService.getByIds(storeIds).forEach(e -> storeMap.put(e.getId(), e));
+        remoteUserService.getByIds(userIds).forEach(e -> userMap.put(e.getUserId(), e));
+        remoteCustomerService.getByIds(customerIds).forEach(e -> customerMap.put(e.getId(), e));
+        remoteFulfillerService.getByIds(fulfillerIds).forEach(e -> fulfillerMap.put(e.getId(), e));
+
+        return TableDataInfo.build(page.convert(e -> {
+            SysSubOrderListPageVo vo = new SysSubOrderListPageVo();
+            vo.setId(e.getId());
+            vo.setCode(e.getCode());
+            vo.setService(e.getService());
+            vo.setMode(e.getMode());
+            vo.setType(e.getType());
+            vo.setPet(e.getUsrPet());
+            RemotePetVo pet = petMap.get(e.getUsrPet());
+            vo.setPetName(pet.getName());
+            vo.setPetBreed(pet.getBreed());
+            vo.setCustomer(e.getUsrCustomer());
+            RemoteCustomerVo customer = customerMap.get(e.getUsrCustomer());
+            vo.setCustomerName(customer.getName());
+            vo.setToAddress(e.getToAddress());
+            vo.setSite(e.getStoreSite());
+            vo.setStore(e.getStore());
+            RemoteStoreVo store = storeMap.get(e.getStore());
+            vo.setStoreName(store.getName());
+            vo.setPlacer(e.getOrderPlacer());
+            RemoteUserVo placer = userMap.get(e.getOrderPlacer());
+            vo.setPlacerUsername(placer.getUserName());
+            vo.setCreateTime(e.getCreateTime());
+            vo.setStatus(e.getStatus());
+            vo.setFulfiller(e.getFulfiller());
+            RemoteFulfillerVo fulfiller = fulfillerMap.get(e.getFulfiller());
+            vo.setFulfillerName(fulfiller != null ? fulfiller.getName() : null);
+            vo.setPrice(e.getPrice());
+            return vo;
+        }));
+    }
+
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public boolean dispatch(SysSubOrderDispatchBo bo) {
+
+        SysSubOrder subOrder = baseMapper.selectById(bo.getOrderId());
+        subOrder.setFulfiller(bo.getFulfiller());
+        subOrder.setPrice(bo.getPrice());
+        subOrder.setStatus(OrderStatusEnum.PENDING_ACCEPT.getValue());
+
+        boolean orderFlag = baseMapper.updateById(subOrder) == 0;
+        if (orderFlag) {
+            throw new RuntimeException("修改订单失败");
+        }
+
+        FulfillerLoginUser fulfiller = remoteFulfillerService.getFulfillerById(bo.getFulfiller());
+
+        SysSubOrderLog log = new SysSubOrderLog();
+        log.setSubOrderId(bo.getOrderId());
+        log.setActioner(LoginHelper.getUserId());
+        log.setActionerType(OrderLogActionerTypeEnum.SYS_USER.getValue());
+        log.setLogType(OrderLogTypeEnum.ORDER.getValue());
+        log.setActionType(OrderLogActionTypeEnum.DISPATCH.getValue());
+        log.setTitle(OrderLogActionTypeEnum.DISPATCH.getLabel());
+        log.setContent("指派给 " + fulfiller.getName());
+        log.setTenantId(subOrder.getTenantId());
+        boolean logFlag = subOrderLogMapper.insert(log) == 0;
+        if (logFlag) {
+            throw new RuntimeException("记录日志失败");
+        }
+
+        return true;
+    }
+
+    @Override
+    public boolean cancel(SysSubOrderCancelBo bo) {
+        return baseMapper.update(
+            Wrappers.lambdaUpdate(SysSubOrder.class)
+                .eq(SysSubOrder::getId, bo.getOrderId())
+                .set(SysSubOrder::getStatus, OrderStatusEnum.CANCELLED.getValue())
+        ) > 0;
+    }
+
+    @Override
+    public SysSubOrderVo getInfo(Long id) {
+        return baseMapper.selectVoById(id);
+    }
+}

+ 6 - 3
ruoyi-visual/ruoyi-nacos/src/main/resources/application.properties

@@ -40,9 +40,12 @@ spring.sql.init.platform=mysql
 db.num=1
 
 ### Connect URL of DB:
-db.url.0=jdbc:mysql://yp1.yingpaipay.com:9039/pet_system_config?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=UTC&allowPublicKeyRetrieval=true
-db.user.0=root
-db.password.0=P@ssw0rd
+#db.url.0=jdbc:mysql://yp1.yingpaipay.com:9039/pet_system_config?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=UTC&allowPublicKeyRetrieval=true
+#db.user.0=root
+#db.password.0=P@ssw0rd
+db.url.0=jdbc:mysql://116.62.136.107:4563/pet_system_config?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=UTC&allowPublicKeyRetrieval=true
+db.user.0=pet_system_config
+db.password.0=tfry6h6yrztNTw3e
 
 ### the maximum retry times for push
 nacos.config.push.maxRetryTime=50

+ 67 - 27
script/sql/business/create.sql

@@ -133,7 +133,7 @@ CREATE TABLE `pet_system`.`sys_order`
     # 其它信息
     `service`                     bigint             NOT NULL COMMENT '服务项目',
     `group_purchase_package_name` varchar(64) COMMENT '团购套餐',
-    `remark`                      varchar(512)       NOT NULL COMMENT '备注',
+    `remark`                      varchar(512) COMMENT '备注',
     `platform_id`                 tinyint            NOT NULL COMMENT '下单平台',
     `status`                      tinyint DEFAULT 0 COMMENT '状态',
     `tenant_id`                   varchar(20)        NOT NULL COMMENT '租户编号',
@@ -147,38 +147,78 @@ CREATE TABLE `pet_system`.`sys_order`
 
 CREATE TABLE `pet_system`.`sys_sub_order`
 (
-    `id`                   bigint PRIMARY KEY NOT NULL COMMENT '序号',
-    `code`                 varchar(255)       NOT NULL COMMENT '订单号',
-    `order_id`             bigint             NOT NULL COMMENT '父订单ID',
+    `id`                          bigint PRIMARY KEY NOT NULL COMMENT '序号',
+    `code`                        varchar(255)       NOT NULL COMMENT '订单号',
+    `order_id`                    bigint             NOT NULL COMMENT '订单ID',
+
+    -- 查询冗余
+    # 门店信息
+    `store`                       bigint             NOT NULL COMMENT '所属门店ID',
+    `store_site`                  varchar(128)       NOT NULL COMMENT '所属门店站点',
+
+    # 下单人
+    `order_placer`                bigint             NOT NULL COMMENT '下单人',
+
+    # 客户以及宠物等信息
+    `usr_customer`                bigint             NOT NULL COMMENT '宠物主',
+    `usr_pet`                     bigint             NOT NULL COMMENT '宠物',
+
+    `service`                     bigint             NOT NULL COMMENT '服务项目',
+
+    -- 冗余结束
 
     # 接送单信息
-    `mode`                 tinyint COMMENT '接送模式(仅接送单有)',
-    `type`                 tinyint COMMENT '0接/1送(仅接送单有)',
+    `mode`                        tinyint COMMENT '接送模式(仅接送单有)',
+    `type`                        tinyint COMMENT '0接/1送(仅接送单有)',
 
     # 关于联系
-    `contact`              varchar(255)       NOT NULL COMMENT '联系人',
-    `contact_phone_number` varchar(32)        NOT NULL COMMENT '联系电话',
+    `contact`                     varchar(255)       NOT NULL COMMENT '联系人',
+    `contact_phone_number`        varchar(32)        NOT NULL COMMENT '联系电话',
 
     # 关于时间
-    `service_time`         datetime           NOT NULL COMMENT '起始服务时间(仅服务单有)',
-    `end_service_time`     datetime           NOT NULL COMMENT '结束服务时间',
+    `service_time`                datetime           NOT NULL COMMENT '起始服务时间(仅服务单有)',
+    `end_service_time`            datetime           NOT NULL COMMENT '结束服务时间',
 
     # 地址
-    `from_code`            varchar(128)       NOT NULL COMMENT '起点地址编号(仅接送单有)',
-    `from_address`         varchar(255)       NOT NULL COMMENT '起点详细地址(仅接送单有)',
-    `to_code`              varchar(128)       NOT NULL COMMENT '终点地址编号',
-    `to_address`           varchar(255)       NOT NULL COMMENT '终点详细地址',
-
-    `price`                bigint COMMENT '价格(分)',
-
-    `fulfiller`            bigint COMMENT '履约者',
-
-    `status`               tinyint DEFAULT 0  NOT NULL COMMENT '状态',
-    `tenant_id`            varchar(20)        NOT NULL COMMENT '租户编号',
-    `del_flag`             char(1) DEFAULT '0' COMMENT '删除标志(0代表存在 1代表删除)',
-    `create_dept`          bigint(20) COMMENT '创建部门',
-    `create_by`            bigint(20) COMMENT '创建者',
-    `create_time`          datetime COMMENT '创建时间',
-    `update_by`            bigint(20) COMMENT '更新者',
-    `update_time`          datetime COMMENT '更新时间'
+    `from_code`                   varchar(128)       NOT NULL COMMENT '起点地址编号(仅接送单有)',
+    `from_address`                varchar(255)       NOT NULL COMMENT '起点详细地址(仅接送单有)',
+    `to_code`                     varchar(128)       NOT NULL COMMENT '终点地址编号',
+    `to_address`                  varchar(255)       NOT NULL COMMENT '终点详细地址',
+
+    `price`                       bigint COMMENT '价格(分)',
+
+    `fulfiller`                   bigint COMMENT '履约者',
+
+    `group_purchase_package_name` varchar(64) COMMENT '团购套餐',
+    `remark`                      varchar(512) COMMENT '备注',
+    `service_remark`              varchar(512) COMMENT '服务备注',
+    `platform_id`                 tinyint            NOT NULL COMMENT '下单平台',
+    `status`                      tinyint DEFAULT 0  NOT NULL COMMENT '状态',
+    `tenant_id`                   varchar(20)        NOT NULL COMMENT '租户编号',
+    `del_flag`                    char(1) DEFAULT '0' COMMENT '删除标志(0代表存在 1代表删除)',
+    `create_dept`                 bigint(20) COMMENT '创建部门',
+    `create_by`                   bigint(20) COMMENT '创建者',
+    `create_time`                 datetime COMMENT '创建时间',
+    `update_by`                   bigint(20) COMMENT '更新者',
+    `update_time`                 datetime COMMENT '更新时间'
 ) ENGINE = innoDB COMMENT = '子订单表';
+
+CREATE TABLE `pet_system`.`sys_sub_order_log`
+(
+    `id`            bigint PRIMARY KEY NOT NULL COMMENT '序号',
+    `sub_order_id`  bigint             NOT NULL COMMENT '子订单ID',
+    `actioner`      bigint             NOT NULL COMMENT '操作人',
+    `actioner_type` tinyint            NOT NULL COMMENT '操作人类型',
+    `log_type`      tinyint            NOT NULL COMMENT '日志类型',
+    `action_type`   tinyint            NOT NULL COMMENT '操作类型',
+    `title`         varchar(64)        NOT NULL COMMENT '标题',
+    `content`       varchar(512)       NOT NULL COMMENT '内容',
+    `photos`        varchar(512) COMMENT '上传图片',
+    `tenant_id`     varchar(20)        NOT NULL COMMENT '租户编号',
+    `del_flag`      char(1) DEFAULT '0' COMMENT '删除标志(0代表存在 1代表删除)',
+    `create_dept`   bigint(20) COMMENT '创建部门',
+    `create_by`     bigint(20) COMMENT '创建者',
+    `create_time`   datetime COMMENT '创建时间',
+    `update_by`     bigint(20) COMMENT '更新者',
+    `update_time`   datetime COMMENT '更新时间'
+) ENGINE = innoDB COMMENT = '订单操作日志表';

+ 0 - 0
sessionStore/8091/root.data