Explorar o código

修复已知bug;完善APP功能

Huanyi hai 1 mes
pai
achega
ac76a074c5
Modificáronse 86 ficheiros con 1602 adicións e 192 borrados
  1. 2 0
      pom.xml
  2. 1 1
      ruoyi-api/yingpaipay-api-fulfiller/src/main/java/org/dromara/fulfiller/api/RemoteFulfillerService.java
  3. 9 0
      ruoyi-api/yingpaipay-api-fulfiller/src/main/java/org/dromara/fulfiller/api/RemoteLogService.java
  4. 18 0
      ruoyi-api/yingpaipay-api-fulfiller/src/main/java/org/dromara/fulfiller/api/domain/vo/RemoteLogVo.java
  5. 9 0
      ruoyi-api/yingpaipay-api-order/src/main/java/org/dromara/order/api/RemoteSubOrderLogService.java
  6. 4 0
      ruoyi-api/yingpaipay-api-order/src/main/java/org/dromara/order/api/RemoteSubOrderService.java
  7. 18 0
      ruoyi-api/yingpaipay-api-order/src/main/java/org/dromara/order/api/domain/vo/RemoteSubOrderLogCountVo.java
  8. 2 0
      ruoyi-api/yingpaipay-api-order/src/main/java/org/dromara/order/api/domain/vo/RemoteSubOrderVo.java
  9. 9 0
      ruoyi-auth/src/main/java/org/dromara/auth/constants/LoginUserSourceConstants.java
  10. 2 1
      ruoyi-auth/src/main/java/org/dromara/auth/controller/TokenController.java
  11. 27 3
      ruoyi-auth/src/main/java/org/dromara/auth/service/impl/PasswordAuthStrategy.java
  12. 2 2
      ruoyi-auth/src/main/resources/application.yml
  13. 1 1
      ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/constant/TagTargetConstants.java
  14. 2 2
      ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/model/LoginBody.java
  15. 3 4
      ruoyi-common/yingpaipay-common-platform/src/main/java/org/dromara/common/platform/Platform.java
  16. 1 1
      ruoyi-gateway/src/main/resources/application.yml
  17. 2 2
      ruoyi-modules/ruoyi-gen/src/main/resources/application.yml
  18. 2 2
      ruoyi-modules/ruoyi-job/src/main/resources/application.yml
  19. 2 2
      ruoyi-modules/ruoyi-resource/src/main/resources/application.yml
  20. 1 1
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysTenantServiceImpl.java
  21. 4 1
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysUserServiceImpl.java
  22. 2 2
      ruoyi-modules/ruoyi-system/src/main/resources/application.yml
  23. 1 1
      ruoyi-modules/ruoyi-workflow/src/main/resources/application.yml
  24. 9 0
      ruoyi-modules/yingpaipay-archieves/src/main/java/org/dromara/archieves/constants/ChangeLogTargetTypeConstants.java
  25. 11 0
      ruoyi-modules/yingpaipay-archieves/src/main/java/org/dromara/archieves/constants/ChangeLogTypeConstants.java
  26. 7 0
      ruoyi-modules/yingpaipay-archieves/src/main/java/org/dromara/archieves/controller/UsrPetController.java
  27. 0 15
      ruoyi-modules/yingpaipay-archieves/src/main/java/org/dromara/archieves/domain/UsrCustomer.java
  28. 1 3
      ruoyi-modules/yingpaipay-archieves/src/main/java/org/dromara/archieves/domain/bo/UsrCustomerBo.java
  29. 0 2
      ruoyi-modules/yingpaipay-archieves/src/main/java/org/dromara/archieves/domain/bo/UsrPetBo.java
  30. 12 0
      ruoyi-modules/yingpaipay-archieves/src/main/java/org/dromara/archieves/domain/bo/UsrPetRemarkBo.java
  31. 4 0
      ruoyi-modules/yingpaipay-archieves/src/main/java/org/dromara/archieves/domain/vo/UsrCustomerVo.java
  32. 2 0
      ruoyi-modules/yingpaipay-archieves/src/main/java/org/dromara/archieves/service/IUsrPetService.java
  33. 49 23
      ruoyi-modules/yingpaipay-archieves/src/main/java/org/dromara/archieves/service/impl/UsrCustomerServiceImpl.java
  34. 57 28
      ruoyi-modules/yingpaipay-archieves/src/main/java/org/dromara/archieves/service/impl/UsrPetServiceImpl.java
  35. 2 2
      ruoyi-modules/yingpaipay-archieves/src/main/resources/application.yml
  36. 9 0
      ruoyi-modules/yingpaipay-fulfiller/src/main/java/org/dromara/fulfiller/constants/FlfActionTypeConstant.java
  37. 9 0
      ruoyi-modules/yingpaipay-fulfiller/src/main/java/org/dromara/fulfiller/constants/FlfRewardTargetConstant.java
  38. 1 2
      ruoyi-modules/yingpaipay-fulfiller/src/main/java/org/dromara/fulfiller/controller/FlfAnamalyController.java
  39. 50 5
      ruoyi-modules/yingpaipay-fulfiller/src/main/java/org/dromara/fulfiller/controller/FlfLogController.java
  40. 5 3
      ruoyi-modules/yingpaipay-fulfiller/src/main/java/org/dromara/fulfiller/domain/FlfBalanceLog.java
  41. 1 16
      ruoyi-modules/yingpaipay-fulfiller/src/main/java/org/dromara/fulfiller/domain/FlfFulfiller.java
  42. 2 0
      ruoyi-modules/yingpaipay-fulfiller/src/main/java/org/dromara/fulfiller/domain/FlfPointsLog.java
  43. 5 1
      ruoyi-modules/yingpaipay-fulfiller/src/main/java/org/dromara/fulfiller/domain/FlfRewardLog.java
  44. 1 1
      ruoyi-modules/yingpaipay-fulfiller/src/main/java/org/dromara/fulfiller/domain/bo/FlfFulfillerBo.java
  45. 9 1
      ruoyi-modules/yingpaipay-fulfiller/src/main/java/org/dromara/fulfiller/domain/bo/FlfRewardBo.java
  46. 1 1
      ruoyi-modules/yingpaipay-fulfiller/src/main/java/org/dromara/fulfiller/domain/vo/FlfAnamalyOnOrderVo.java
  47. 1 1
      ruoyi-modules/yingpaipay-fulfiller/src/main/java/org/dromara/fulfiller/domain/vo/FlfBalanceLogVo.java
  48. 27 0
      ruoyi-modules/yingpaipay-fulfiller/src/main/java/org/dromara/fulfiller/domain/vo/FlfBalanceOnAppListVo.java
  49. 19 0
      ruoyi-modules/yingpaipay-fulfiller/src/main/java/org/dromara/fulfiller/domain/vo/FlfBalanceOnAppVo.java
  50. 27 0
      ruoyi-modules/yingpaipay-fulfiller/src/main/java/org/dromara/fulfiller/domain/vo/FlfPointsOnAppListVo.java
  51. 17 0
      ruoyi-modules/yingpaipay-fulfiller/src/main/java/org/dromara/fulfiller/domain/vo/FlfPointsOnAppVo.java
  52. 22 0
      ruoyi-modules/yingpaipay-fulfiller/src/main/java/org/dromara/fulfiller/domain/vo/FlfRewardCountOnAppRewardVo.java
  53. 29 0
      ruoyi-modules/yingpaipay-fulfiller/src/main/java/org/dromara/fulfiller/domain/vo/FlfRewardListOnAppRewardVo.java
  54. 1 0
      ruoyi-modules/yingpaipay-fulfiller/src/main/java/org/dromara/fulfiller/domain/vo/FlfRewardLogVo.java
  55. 9 7
      ruoyi-modules/yingpaipay-fulfiller/src/main/java/org/dromara/fulfiller/dubbo/RemoteFulfillerServiceImpl.java
  56. 41 0
      ruoyi-modules/yingpaipay-fulfiller/src/main/java/org/dromara/fulfiller/dubbo/RemoteLogServiceImpl.java
  57. 18 0
      ruoyi-modules/yingpaipay-fulfiller/src/main/java/org/dromara/fulfiller/enums/AuditStatusEnum.java
  58. 23 0
      ruoyi-modules/yingpaipay-fulfiller/src/main/java/org/dromara/fulfiller/enums/FlfBalanceBizTypeEnum.java
  59. 18 0
      ruoyi-modules/yingpaipay-fulfiller/src/main/java/org/dromara/fulfiller/enums/FlfFulfillerStatusEnum.java
  60. 22 0
      ruoyi-modules/yingpaipay-fulfiller/src/main/java/org/dromara/fulfiller/enums/FlfPointsBizTypeEnum.java
  61. 21 0
      ruoyi-modules/yingpaipay-fulfiller/src/main/java/org/dromara/fulfiller/enums/FlfRewardBizTypeEnum.java
  62. 1 1
      ruoyi-modules/yingpaipay-fulfiller/src/main/java/org/dromara/fulfiller/service/IFlfAnamalyService.java
  63. 25 0
      ruoyi-modules/yingpaipay-fulfiller/src/main/java/org/dromara/fulfiller/service/IFlfLogService.java
  64. 1 2
      ruoyi-modules/yingpaipay-fulfiller/src/main/java/org/dromara/fulfiller/service/impl/FlfAnamalyServiceImpl.java
  65. 13 10
      ruoyi-modules/yingpaipay-fulfiller/src/main/java/org/dromara/fulfiller/service/impl/FlfAuditServiceImpl.java
  66. 29 12
      ruoyi-modules/yingpaipay-fulfiller/src/main/java/org/dromara/fulfiller/service/impl/FlfFulfillerServiceImpl.java
  67. 219 0
      ruoyi-modules/yingpaipay-fulfiller/src/main/java/org/dromara/fulfiller/service/impl/FlfLogServiceImpl.java
  68. 2 2
      ruoyi-modules/yingpaipay-fulfiller/src/main/resources/application.yml
  69. 27 0
      ruoyi-modules/yingpaipay-order/src/main/java/org/dromara/order/controller/SysSubOrderController.java
  70. 17 4
      ruoyi-modules/yingpaipay-order/src/main/java/org/dromara/order/controller/SysSubOrderLogController.java
  71. 26 0
      ruoyi-modules/yingpaipay-order/src/main/java/org/dromara/order/domain/excel/SysSubOrderLogExcel.java
  72. 27 0
      ruoyi-modules/yingpaipay-order/src/main/java/org/dromara/order/domain/vo/SysSubOrderListOnCustomerVo.java
  73. 27 0
      ruoyi-modules/yingpaipay-order/src/main/java/org/dromara/order/domain/vo/SysSubOrderListOnFulfillerVo.java
  74. 27 0
      ruoyi-modules/yingpaipay-order/src/main/java/org/dromara/order/domain/vo/SysSubOrderListOnPetVo.java
  75. 29 0
      ruoyi-modules/yingpaipay-order/src/main/java/org/dromara/order/domain/vo/SysSubOrderListOnStoreVo.java
  76. 22 0
      ruoyi-modules/yingpaipay-order/src/main/java/org/dromara/order/domain/vo/SysSubOrderLogCountVo.java
  77. 59 0
      ruoyi-modules/yingpaipay-order/src/main/java/org/dromara/order/domain/vo/SysSubOrderStatisticPageVo.java
  78. 53 0
      ruoyi-modules/yingpaipay-order/src/main/java/org/dromara/order/dubbo/RemoteSubOrderLogServiceImpl.java
  79. 36 0
      ruoyi-modules/yingpaipay-order/src/main/java/org/dromara/order/dubbo/RemoteSubOrderServiceImpl.java
  80. 6 0
      ruoyi-modules/yingpaipay-order/src/main/java/org/dromara/order/service/ISysSubOrderLogService.java
  81. 10 0
      ruoyi-modules/yingpaipay-order/src/main/java/org/dromara/order/service/ISysSubOrderService.java
  82. 70 0
      ruoyi-modules/yingpaipay-order/src/main/java/org/dromara/order/service/impl/SysSubOrderLogServiceImpl.java
  83. 205 20
      ruoyi-modules/yingpaipay-order/src/main/java/org/dromara/order/service/impl/SysSubOrderServiceImpl.java
  84. 2 2
      ruoyi-modules/yingpaipay-order/src/main/resources/application.yml
  85. 2 2
      ruoyi-modules/yingpaipay-service/src/main/resources/application.yml
  86. 1 0
      ruoyi-visual/ruoyi-nacos/src/main/resources/application.properties

+ 2 - 0
pom.xml

@@ -105,6 +105,7 @@
                 <nacos.password>nacos</nacos.password>
                 <logstash.address>127.0.0.1:4560</logstash.address>
                 <discovery.ip>127.0.0.1</discovery.ip>
+                <mysql.password>1234</mysql.password>
             </properties>
         </profile>
         <profile>
@@ -118,6 +119,7 @@
                 <nacos.password>nacos</nacos.password>
                 <logstash.address>127.0.0.1:4560</logstash.address>
                 <discovery.ip>192.168.1.140</discovery.ip>
+                <mysql.password>Yr7777777</mysql.password>
             </properties>
         </profile>
     </profiles>

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

@@ -33,7 +33,7 @@ public interface RemoteFulfillerService {
 
     List<RemoteFulfillerVo> getByIds(List<Long> fulfillerIds);
 
-    boolean settlement(Long fulfiller, Long price, String orderCode);
+    boolean settlement(Long fulfiller, Long price, String orderCode, Long orderId);
 
     String getNameById(Long id);
 }

+ 9 - 0
ruoyi-api/yingpaipay-api-fulfiller/src/main/java/org/dromara/fulfiller/api/RemoteLogService.java

@@ -0,0 +1,9 @@
+package org.dromara.fulfiller.api;
+
+import org.dromara.fulfiller.api.domain.vo.RemoteLogVo;
+
+import java.util.List;
+
+public interface RemoteLogService {
+    List<RemoteLogVo> getListByUserId(Long userId);
+}

+ 18 - 0
ruoyi-api/yingpaipay-api-fulfiller/src/main/java/org/dromara/fulfiller/api/domain/vo/RemoteLogVo.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 RemoteLogVo implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    private Long subOrderId;
+
+    private String type;
+
+}

+ 9 - 0
ruoyi-api/yingpaipay-api-order/src/main/java/org/dromara/order/api/RemoteSubOrderLogService.java

@@ -0,0 +1,9 @@
+package org.dromara.order.api;
+
+import org.dromara.order.api.domain.vo.RemoteSubOrderLogCountVo;
+
+import java.util.List;
+
+public interface RemoteSubOrderLogService {
+    RemoteSubOrderLogCountVo getCountByFulfillerId(Long fulfillerId);
+}

+ 4 - 0
ruoyi-api/yingpaipay-api-order/src/main/java/org/dromara/order/api/RemoteSubOrderService.java

@@ -20,4 +20,8 @@ public interface RemoteSubOrderService {
     List<Long> getPetIdsByTenantId(String tenantId);
 
     List<RemoteSubOrderVo> getByStoreIds(List<Long> storeIds);
+
+    long balanceOnPending(Long userId);
+
+    List<RemoteSubOrderVo> selectByCustomerIds(List<Long> customerIds);
 }

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

@@ -0,0 +1,18 @@
+package org.dromara.order.api.domain.vo;
+
+import lombok.Data;
+
+import java.io.Serial;
+import java.io.Serializable;
+
+@Data
+public class RemoteSubOrderLogCountVo implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    private Integer total;
+
+    private Integer reject;
+
+}

+ 2 - 0
ruoyi-api/yingpaipay-api-order/src/main/java/org/dromara/order/api/domain/vo/RemoteSubOrderVo.java

@@ -24,4 +24,6 @@ public class RemoteSubOrderVo implements Serializable {
 
     private Long store;
 
+    private Long customer;
+
 }

+ 9 - 0
ruoyi-auth/src/main/java/org/dromara/auth/constants/LoginUserSourceConstants.java

@@ -0,0 +1,9 @@
+package org.dromara.auth.constants;
+
+public interface LoginUserSourceConstants {
+
+    Integer SYS_USER = 0;
+
+    Integer FULFILLER = 1;
+
+}

+ 2 - 1
ruoyi-auth/src/main/java/org/dromara/auth/controller/TokenController.java

@@ -12,6 +12,7 @@ import me.zhyd.oauth.model.AuthUser;
 import me.zhyd.oauth.request.AuthRequest;
 import me.zhyd.oauth.utils.AuthStateUtils;
 import org.apache.dubbo.config.annotation.DubboReference;
+import org.dromara.auth.constants.LoginUserSourceConstants;
 import org.dromara.auth.domain.vo.LoginTenantVo;
 import org.dromara.auth.domain.vo.LoginVo;
 import org.dromara.auth.domain.vo.TenantListVo;
@@ -101,7 +102,7 @@ public class TokenController {
             return R.fail(MessageUtils.message("auth.grant.type.blocked"));
         }
         // 校验租户
-        sysLoginService.checkTenant(loginBody.getTenantId());
+//        sysLoginService.checkTenant(loginBody.getTenantId());
         // 登录
         LoginVo loginVo = IAuthStrategy.login(body, clientVo, grantType);
 

+ 27 - 3
ruoyi-auth/src/main/java/org/dromara/auth/service/impl/PasswordAuthStrategy.java

@@ -6,6 +6,7 @@ import cn.dev33.satoken.stp.parameter.SaLoginParameter;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.dubbo.config.annotation.DubboReference;
+import org.dromara.auth.constants.LoginUserSourceConstants;
 import org.dromara.auth.domain.vo.LoginVo;
 import org.dromara.auth.form.PasswordLoginBody;
 import org.dromara.auth.properties.CaptchaProperties;
@@ -14,15 +15,19 @@ import org.dromara.auth.service.SysLoginService;
 import org.dromara.common.core.constant.Constants;
 import org.dromara.common.core.constant.GlobalConstants;
 import org.dromara.common.core.enums.LoginType;
+import org.dromara.common.core.enums.UserType;
 import org.dromara.common.core.exception.user.CaptchaException;
 import org.dromara.common.core.exception.user.CaptchaExpireException;
 import org.dromara.common.core.utils.MessageUtils;
 import org.dromara.common.core.utils.StringUtils;
 import org.dromara.common.core.utils.ValidatorUtils;
 import org.dromara.common.json.utils.JsonUtils;
+import org.dromara.common.platform.PlatformUtils;
 import org.dromara.common.redis.utils.RedisUtils;
 import org.dromara.common.satoken.utils.LoginHelper;
 import org.dromara.common.tenant.helper.TenantHelper;
+import org.dromara.fulfiller.api.RemoteFulfillerService;
+import org.dromara.fulfiller.api.model.FulfillerLoginUser;
 import org.dromara.system.api.RemoteUserService;
 import org.dromara.system.api.domain.vo.RemoteClientVo;
 import org.dromara.system.api.model.LoginUser;
@@ -43,13 +48,15 @@ public class PasswordAuthStrategy implements IAuthStrategy {
     private final SysLoginService loginService;
 
     @DubboReference
-    private RemoteUserService remoteUserService;
+    private final RemoteUserService remoteUserService;
+    @DubboReference
+    private final RemoteFulfillerService remoteFulfillerService;
 
     @Override
     public LoginVo login(String body, RemoteClientVo client) {
         PasswordLoginBody loginBody = JsonUtils.parseObject(body, PasswordLoginBody.class);
         ValidatorUtils.validate(loginBody);
-        int platformId = loginBody.getPlatformId();
+//        Integer platformId = PlatformUtils.getId();
         String tenantId = loginBody.getTenantId();
         String username = loginBody.getUsername();
         String password = loginBody.getPassword();
@@ -61,7 +68,13 @@ public class PasswordAuthStrategy implements IAuthStrategy {
             validateCaptcha(tenantId, username, code, uuid);
         }
         LoginUser loginUser = TenantHelper.dynamic(tenantId, () -> {
-            LoginUser user = remoteUserService.getUserInfo(username, tenantId, platformId);
+            LoginUser user;
+            if (loginBody.getUserSource().equals(LoginUserSourceConstants.SYS_USER)) {
+                user = remoteUserService.getUserInfo(username, tenantId, PlatformUtils.getId());
+            } else {
+                FulfillerLoginUser fulfiller = remoteFulfillerService.getFulfillerByPhone(username);
+                user = convertFulfillerToLoginUser(fulfiller);
+            }
             loginService.checkLogin(LoginType.PASSWORD, user.getTenantId(), username, () -> !BCrypt.checkpw(password, user.getPassword()));
             return user;
         });
@@ -84,6 +97,17 @@ public class PasswordAuthStrategy implements IAuthStrategy {
         return loginVo;
     }
 
+    private LoginUser convertFulfillerToLoginUser(FulfillerLoginUser fulfiller) {
+        LoginUser user = new LoginUser();
+        user.setTenantId(fulfiller.getTenantId());
+        user.setUserId(fulfiller.getId()); // 使用 flf_fulfiller.id
+        user.setUsername(fulfiller.getPhone());
+        user.setNickname(fulfiller.getName());
+        user.setPassword(fulfiller.getPassword());
+        user.setUserType(UserType.FULFILLER_USER.getUserType());
+        return user;
+    }
+
     /**
      * 校验验证码
      *

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

@@ -1,6 +1,6 @@
 # Tomcat
 server:
-  port: 9210
+  port: 10000
 
 # Spring
 spring:
@@ -20,7 +20,7 @@ spring:
       username: @nacos.username@
       password: @nacos.password@
       discovery:
-        ip: @discovery.ip@
+        # ip: @discovery.ip
         # 注册组
         group: @nacos.discovery.group@
         namespace: ${spring.profiles.active}

+ 1 - 1
ruoyi-modules/yingpaipay-fulfiller/src/main/java/org/dromara/fulfiller/constants/TagTargetConstants.java → ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/constant/TagTargetConstants.java

@@ -1,4 +1,4 @@
-package org.dromara.fulfiller.constants;
+package org.dromara.common.core.constant;
 
 public interface TagTargetConstants {
 

+ 2 - 2
ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/model/LoginBody.java

@@ -20,8 +20,8 @@ public class LoginBody {
     @NotBlank(message = "{auth.clientid.not.blank}")
     private String clientId;
 
-    @NotNull(message = "未知平台")
-    private Integer platformId;
+    @NotNull(message = "用户来源不能为空")
+    private Integer userSource;
 
     /**
      * 授权类型

+ 3 - 4
ruoyi-common/yingpaipay-common-platform/src/main/java/org/dromara/common/platform/Platform.java

@@ -11,7 +11,7 @@ import java.util.Arrays;
 import java.util.List;
 
 /**
- * 平台分割,包含平台ID和平台码
+ * 商户端和管理端进行平台分割,包含平台ID和平台码
  * @Author Huanyi
  * @CreateTime 2026-02-11
  */
@@ -20,9 +20,8 @@ import java.util.List;
 @AllArgsConstructor(access = AccessLevel.PRIVATE)
 public enum Platform {
 
-    ADMIN(0, "4pwuAzDBzUd6hekvGHHKedT4VX5WHERAXHpeztPFAzRaUsBUrD", "管理后台"),
-    MERCHANT(1, "MfJkMNMW2JKXBuPcbP2rxkD3ynXmReAZZFm4fN7cAGwGJdKCmd", "商户后台"),
-
+    ADMIN(0, "4pwuAzDBzUd6hekvGHHKedT4VX5WHERAXHpeztPFAzRaUsBUrD", "管理端"),
+    MERCHANT(1, "MfJkMNMW2JKXBuPcbP2rxkD3ynXmReAZZFm4fN7cAGwGJdKCmd", "商户端"),
     ;
 
     private final Integer id;

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

@@ -22,7 +22,7 @@ spring:
       username: @nacos.username@
       password: @nacos.password@
       discovery:
-        ip: @discovery.ip@
+        # ip: @discovery.ip
         # 注册组
         group: @nacos.discovery.group@
         namespace: ${spring.profiles.active}

+ 2 - 2
ruoyi-modules/ruoyi-gen/src/main/resources/application.yml

@@ -1,6 +1,6 @@
 # Tomcat
 server:
-  port: 9213
+  port: 10008
 
 # Spring
 spring:
@@ -20,7 +20,7 @@ spring:
       username: @nacos.username@
       password: @nacos.password@
       discovery:
-        ip: @discovery.ip@
+        # ip: @discovery.ip
         # 注册组
         group: @nacos.discovery.group@
         namespace: ${spring.profiles.active}

+ 2 - 2
ruoyi-modules/ruoyi-job/src/main/resources/application.yml

@@ -1,6 +1,6 @@
 # Tomcat
 server:
-  port: 9214
+  port: 10007
 
 # Spring
 spring:
@@ -20,7 +20,7 @@ spring:
       username: @nacos.username@
       password: @nacos.password@
       discovery:
-        ip: @discovery.ip@
+        # ip: @discovery.ip
         # 注册组
         group: @nacos.discovery.group@
         namespace: ${spring.profiles.active}

+ 2 - 2
ruoyi-modules/ruoyi-resource/src/main/resources/application.yml

@@ -1,6 +1,6 @@
 # Tomcat
 server:
-  port: 9212
+  port: 10002
 
 # Spring
 spring:
@@ -24,7 +24,7 @@ spring:
       username: @nacos.username@
       password: @nacos.password@
       discovery:
-        ip: @discovery.ip@
+        # ip: @discovery.ip
         # 注册组
         group: @nacos.discovery.group@
         namespace: ${spring.profiles.active}

+ 1 - 1
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysTenantServiceImpl.java

@@ -622,7 +622,7 @@ public class SysTenantServiceImpl implements ISysTenantService {
         tenant.setContactUserName(bo.getContact());
         tenant.setContactPhone(bo.getPhoneNumber());
         tenant.setAddress(bo.getAddress());
-        tenant.setRemark(bo.getRemark());
+        tenant.setIntro(bo.getRemark());
 
         return baseMapper.updateById(tenant) > 0;
     }

+ 4 - 1
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysUserServiceImpl.java

@@ -19,6 +19,7 @@ import org.dromara.common.core.exception.ServiceException;
 import org.dromara.common.core.utils.*;
 import org.dromara.common.mybatis.core.page.PageQuery;
 import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.common.platform.Platform;
 import org.dromara.common.platform.PlatformUtils;
 import org.dromara.common.satoken.utils.LoginHelper;
 import org.dromara.common.tenant.helper.TenantHelper;
@@ -330,7 +331,9 @@ public class SysUserServiceImpl implements ISysUserService {
         // 新增用户与角色管理
         insertUserRole(user, false);
         // 新增用户与门店关联 @author: Huanyi
-        insertUserStore(user, false);
+        if (Platform.isNotAdmin()) {
+            insertUserStore(user, false);
+        }
         return rows;
     }
 

+ 2 - 2
ruoyi-modules/ruoyi-system/src/main/resources/application.yml

@@ -1,6 +1,6 @@
 # Tomcat
 server:
-  port: 9211
+  port: 10001
 
 # Spring
 spring:
@@ -20,7 +20,7 @@ spring:
       username: @nacos.username@
       password: @nacos.password@
       discovery:
-        ip: @discovery.ip@
+        # ip: @discovery.ip
         # 注册组
         group: @nacos.discovery.group@
         namespace: ${spring.profiles.active}

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

@@ -20,7 +20,7 @@ spring:
       username: @nacos.username@
       password: @nacos.password@
       discovery:
-        ip: @discovery.ip@
+        # ip: @discovery.ip
         # 注册组
         group: @nacos.discovery.group@
         namespace: ${spring.profiles.active}

+ 9 - 0
ruoyi-modules/yingpaipay-archieves/src/main/java/org/dromara/archieves/constants/ChangeLogTargetTypeConstants.java

@@ -0,0 +1,9 @@
+package org.dromara.archieves.constants;
+
+public interface ChangeLogTargetTypeConstants {
+
+    String CUSTOMER = "customer";
+
+    String PET = "pet";
+
+}

+ 11 - 0
ruoyi-modules/yingpaipay-archieves/src/main/java/org/dromara/archieves/constants/ChangeLogTypeConstants.java

@@ -0,0 +1,11 @@
+package org.dromara.archieves.constants;
+
+public interface ChangeLogTypeConstants {
+
+    String REMARK = "remark";
+
+    String SYSTEM = "system";
+
+    String CHANGE = "change";
+
+}

+ 7 - 0
ruoyi-modules/yingpaipay-archieves/src/main/java/org/dromara/archieves/controller/UsrPetController.java

@@ -6,6 +6,7 @@ import lombok.RequiredArgsConstructor;
 import jakarta.servlet.http.HttpServletResponse;
 import jakarta.validation.constraints.*;
 import cn.dev33.satoken.annotation.SaCheckPermission;
+import org.dromara.archieves.domain.bo.UsrPetRemarkBo;
 import org.springframework.web.bind.annotation.*;
 import org.springframework.validation.annotation.Validated;
 import org.dromara.common.idempotent.annotation.RepeatSubmit;
@@ -122,4 +123,10 @@ public class UsrPetController extends BaseController {
         return R.ok(usrPetService.queryListByUserId(customerId));
     }
 
+    @RepeatSubmit()
+    @PostMapping("/remark")
+    public R<Void> remark(@RequestBody UsrPetRemarkBo bo) {
+        return toAjax(usrPetService.remark(bo));
+    }
+
 }

+ 0 - 15
ruoyi-modules/yingpaipay-archieves/src/main/java/org/dromara/archieves/domain/UsrCustomer.java

@@ -100,16 +100,6 @@ public class UsrCustomer extends TenantEntity {
      */
     private String keyLocation;
 
-    /**
-     * 来源渠道
-     */
-    private String source;
-
-    /**
-     * 宠物数量
-     */
-    private Integer petCount;
-
     /**
      * 积分
      */
@@ -120,11 +110,6 @@ public class UsrCustomer extends TenantEntity {
      */
     private Long balance;
 
-    /**
-     * 下单次数
-     */
-    private Integer orderCount;
-
     /**
      * 总消费额(分)
      */

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

@@ -93,7 +93,7 @@ public class UsrCustomerBo extends BaseEntity {
     /**
      * 来源渠道
      */
-    private String source;
+    private String tenantId;
 
     /**
      * 状态
@@ -115,6 +115,4 @@ public class UsrCustomerBo extends BaseEntity {
      */
     private List<Long> tagIds;
 
-    private Integer tab;
-
 }

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

@@ -89,6 +89,4 @@ public class UsrPetBo extends BaseEntity {
      */
     private List<Long> tagIds;
 
-    private Integer tab;
-
 }

+ 12 - 0
ruoyi-modules/yingpaipay-archieves/src/main/java/org/dromara/archieves/domain/bo/UsrPetRemarkBo.java

@@ -0,0 +1,12 @@
+package org.dromara.archieves.domain.bo;
+
+import lombok.Data;
+
+@Data
+public class UsrPetRemarkBo {
+
+    private Long petId;
+
+    private String content;
+
+}

+ 4 - 0
ruoyi-modules/yingpaipay-archieves/src/main/java/org/dromara/archieves/domain/vo/UsrCustomerVo.java

@@ -92,4 +92,8 @@ public class UsrCustomerVo implements Serializable {
      */
     private List<SysTagVo> tags;
 
+    private String tenantId;
+    @Translation(type = TransConstant.TENANT_ID_TO_NAME, mapper = "tenantId")
+    private String tenantName;
+
 }

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

@@ -1,5 +1,6 @@
 package org.dromara.archieves.service;
 
+import org.dromara.archieves.domain.bo.UsrPetRemarkBo;
 import org.dromara.archieves.domain.vo.UsrPetVo;
 import org.dromara.archieves.domain.bo.UsrPetBo;
 import org.dromara.common.mybatis.core.page.TableDataInfo;
@@ -46,4 +47,5 @@ public interface IUsrPetService {
      */
     Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
 
+    boolean remark(UsrPetRemarkBo bo);
 }

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

@@ -1,9 +1,12 @@
 package org.dromara.archieves.service.impl;
 
 import org.apache.dubbo.config.annotation.DubboReference;
+import org.dromara.archieves.domain.UsrPet;
 import org.dromara.archieves.domain.vo.UsrCustomerOnOrderVo;
 import org.dromara.archieves.enums.UsrCustomerTabEnum;
+import org.dromara.archieves.mapper.UsrPetMapper;
 import org.dromara.common.core.constant.CacheNames;
+import org.dromara.common.core.constant.TagTargetConstants;
 import org.dromara.common.core.utils.MapstructUtils;
 import org.dromara.common.core.utils.StringUtils;
 import org.dromara.common.mybatis.core.page.TableDataInfo;
@@ -14,10 +17,12 @@ 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.platform.Platform;
 import org.dromara.common.platform.PlatformUtils;
 import org.dromara.common.redis.utils.CacheUtils;
 import org.dromara.common.tenant.helper.TenantHelper;
 import org.dromara.order.api.RemoteSubOrderService;
+import org.dromara.order.api.domain.vo.RemoteSubOrderVo;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 import org.dromara.archieves.domain.SysTagRel;
@@ -31,9 +36,7 @@ import org.dromara.archieves.mapper.SysTagMapper;
 import org.dromara.archieves.service.IArcChangeLogService;
 import org.dromara.archieves.service.IUsrCustomerService;
 
-import java.util.List;
-import java.util.Collection;
-import java.util.Collections;
+import java.util.*;
 import java.util.stream.Collectors;
 
 /**
@@ -51,6 +54,7 @@ public class UsrCustomerServiceImpl implements IUsrCustomerService {
     private final SysTagRelMapper tagRelMapper;
     private final SysTagMapper tagMapper;
     private final IArcChangeLogService arcChangeLogService;
+    private final UsrPetMapper petMapper;
 
     @DubboReference
     private final RemoteSubOrderService remoteSubOrderService;
@@ -59,7 +63,7 @@ public class UsrCustomerServiceImpl implements IUsrCustomerService {
     public UsrCustomerVo queryById(Long id) {
         UsrCustomerVo vo = baseMapper.selectVoById(id);
         if (vo != null) {
-            vo.setTags(queryTagsByTargetId(id, "user"));
+            vo.setTags(queryTagsByTargetId(id, TagTargetConstants.CUSTOMER));
         }
         return vo;
     }
@@ -68,16 +72,35 @@ public class UsrCustomerServiceImpl implements IUsrCustomerService {
     public TableDataInfo<UsrCustomerVo> queryPageList(UsrCustomerBo bo, PageQuery pageQuery) {
         LambdaQueryWrapper<UsrCustomer> lqw = buildQueryWrapper(bo);
         Page<UsrCustomerVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
+        List<Long> customerIds = new ArrayList<>();
         // 填充标签
-        result.getRecords().forEach(vo -> vo.setTags(queryTagsByTargetId(vo.getId(), "user")));
-        return TableDataInfo.build(result);
+        result.getRecords().forEach(vo -> {
+            vo.setTags(queryTagsByTargetId(vo.getId(), TagTargetConstants.CUSTOMER));
+            customerIds.add(vo.getId());
+        });
+        Map<Long, Integer> petMap = petMapper.selectList(Wrappers.lambdaQuery(UsrPet.class).in(UsrPet::getUserId, customerIds).select(UsrPet::getId, UsrPet::getUserId))
+            .stream()
+            .collect(Collectors.groupingBy(
+                UsrPet::getUserId,
+                Collectors.summingInt(e -> 1)
+            ));
+        Map<Long, Integer> orderMap = remoteSubOrderService.selectByCustomerIds(customerIds).stream()
+            .collect(Collectors.groupingBy(
+                RemoteSubOrderVo::getCustomer,
+                Collectors.summingInt(e -> 1)
+            ));
+        return TableDataInfo.build(result.convert(vo -> {
+            vo.setPetCount(petMap.getOrDefault(vo.getId(), 0));
+            vo.setOrderCount(orderMap.getOrDefault(vo.getId(), 0));
+            return vo;
+        }));
     }
 
     @Override
     public List<UsrCustomerVo> queryList(UsrCustomerBo bo) {
         LambdaQueryWrapper<UsrCustomer> lqw = buildQueryWrapper(bo);
         List<UsrCustomerVo> list = baseMapper.selectVoList(lqw);
-        list.forEach(vo -> vo.setTags(queryTagsByTargetId(vo.getId(), "user")));
+        list.forEach(vo -> vo.setTags(queryTagsByTargetId(vo.getId(), TagTargetConstants.CUSTOMER)));
         return list;
     }
 
@@ -93,14 +116,14 @@ public class UsrCustomerServiceImpl implements IUsrCustomerService {
         lqw.eq(bo.getStatus() != null, UsrCustomer::getStatus, bo.getStatus());
         lqw.orderByDesc(UsrCustomer::getCreateTime);
 
-        if (bo.getTab() != null) {
-            if (bo.getTab().equals(UsrCustomerTabEnum.SELF.getValue())) {
-                lqw.eq(UsrCustomer::getTenantId, TenantHelper.getTenantId());
-            } else {
-                List<Long> customerIds = remoteSubOrderService.getCustomerIdsByTenantId(TenantHelper.getTenantId());
-                lqw.in(UsrCustomer::getId, WrapperUtils.convertIds(customerIds));
-            }
-        }
+//        if (bo.getTab() != null) {
+//            if (bo.getTab().equals(UsrCustomerTabEnum.SELF.getValue())) {
+//                lqw.eq(UsrCustomer::getTenantId, TenantHelper.getTenantId());
+//            } else {
+//                List<Long> customerIds = remoteSubOrderService.getCustomerIdsByTenantId(TenantHelper.getTenantId());
+//                lqw.in(UsrCustomer::getId, WrapperUtils.convertIds(customerIds));
+//            }
+//        }
 
         return lqw;
     }
@@ -111,11 +134,14 @@ public class UsrCustomerServiceImpl implements IUsrCustomerService {
         UsrCustomer add = MapstructUtils.convert(bo, UsrCustomer.class);
         add.setPlatformId(PlatformUtils.getId());
         validEntityBeforeSave(add);
+//        if (Platform.isNotAdmin()) {
+//            add.setTenantId(TenantHelper.getTenantId());
+//        }
         boolean flag = baseMapper.insert(add) > 0;
         if (flag) {
             bo.setId(add.getId());
-            saveTagRels(add.getId(), bo.getTagIds(), "user");
-            arcChangeLogService.addLog(add.getId(), "customer", "创建", "用户已被创建");
+            saveTagRels(add.getId(), bo.getTagIds(), TagTargetConstants.CUSTOMER);
+            arcChangeLogService.addLog(add.getId(), TagTargetConstants.CUSTOMER, "创建", "用户已被创建");
         }
         CacheUtils.put(CacheNames.USR_CUSTOMER_NAME, add.getId(), add.getName());
         return flag;
@@ -128,12 +154,12 @@ public class UsrCustomerServiceImpl implements IUsrCustomerService {
         validEntityBeforeSave(update);
         boolean flag = baseMapper.updateById(update) > 0;
         if (flag) {
-            saveTagRels(bo.getId(), bo.getTagIds(), "user");
+            saveTagRels(bo.getId(), bo.getTagIds(), TagTargetConstants.CUSTOMER);
             // 如果有备注内容,记录备注日志;否则记录编辑日志
             if (StringUtils.isNotBlank(bo.getRemark())) {
-                arcChangeLogService.addLog(bo.getId(), "customer", "备注", bo.getRemark());
+                arcChangeLogService.addLog(bo.getId(), TagTargetConstants.CUSTOMER, "备注", bo.getRemark());
             } else {
-                arcChangeLogService.addLog(bo.getId(), "customer", "编辑", "用户信息已修改");
+                arcChangeLogService.addLog(bo.getId(), TagTargetConstants.CUSTOMER, "编辑", "用户信息已修改");
             }
         }
         CacheUtils.put(CacheNames.USR_CUSTOMER_NAME, update.getId(), update.getName());
@@ -150,13 +176,13 @@ public class UsrCustomerServiceImpl implements IUsrCustomerService {
             //TODO 做一些业务上的校验
         }
         // 记录删除日志
-        ids.forEach(id -> arcChangeLogService.addLog(id, "customer", "删除", "用户已被删除"));
+        ids.forEach(id -> arcChangeLogService.addLog(id, TagTargetConstants.CUSTOMER, "删除", "用户已被删除"));
         // 删除标签关联
         ids.forEach(id -> {
             tagRelMapper.delete(
                 Wrappers.lambdaQuery(SysTagRel.class)
                     .eq(SysTagRel::getTargetId, id)
-                    .eq(SysTagRel::getTargetType, "user")
+                    .eq(SysTagRel::getTargetType, TagTargetConstants.CUSTOMER)
             );
             CacheUtils.evict(CacheNames.USR_CUSTOMER_NAME, id);
         });
@@ -171,7 +197,7 @@ public class UsrCustomerServiceImpl implements IUsrCustomerService {
         boolean flag = baseMapper.updateById(update) > 0;
         if (flag) {
             String statusText = (status != null && status == 0) ? "启用" : "停用";
-            arcChangeLogService.addLog(id, "customer", "状态变更", "用户状态变更为 " + statusText);
+            arcChangeLogService.addLog(id, TagTargetConstants.CUSTOMER, "状态变更", "用户状态变更为 " + statusText);
         }
         return flag;
     }

+ 57 - 28
ruoyi-modules/yingpaipay-archieves/src/main/java/org/dromara/archieves/service/impl/UsrPetServiceImpl.java

@@ -1,7 +1,13 @@
 package org.dromara.archieves.service.impl;
 
 import org.apache.dubbo.config.annotation.DubboReference;
+import org.dromara.archieves.constants.ChangeLogTargetTypeConstants;
+import org.dromara.archieves.constants.ChangeLogTypeConstants;
+import org.dromara.archieves.domain.*;
+import org.dromara.archieves.domain.bo.UsrPetRemarkBo;
 import org.dromara.archieves.enums.UsrPetTabEnum;
+import org.dromara.archieves.mapper.*;
+import org.dromara.common.core.constant.TagTargetConstants;
 import org.dromara.common.core.utils.MapstructUtils;
 import org.dromara.common.core.utils.StringUtils;
 import org.dromara.common.mybatis.core.page.TableDataInfo;
@@ -13,21 +19,14 @@ import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.dromara.common.mybatis.utils.WrapperUtils;
 import org.dromara.common.platform.PlatformUtils;
+import org.dromara.common.satoken.utils.LoginHelper;
 import org.dromara.common.tenant.helper.TenantHelper;
 import org.dromara.order.api.RemoteSubOrderService;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
-import org.dromara.archieves.domain.SysTag;
-import org.dromara.archieves.domain.SysTagRel;
-import org.dromara.archieves.domain.UsrCustomer;
 import org.dromara.archieves.domain.bo.UsrPetBo;
 import org.dromara.archieves.domain.vo.UsrPetVo;
 import org.dromara.archieves.domain.vo.SysTagVo;
-import org.dromara.archieves.domain.UsrPet;
-import org.dromara.archieves.mapper.UsrPetMapper;
-import org.dromara.archieves.mapper.UsrCustomerMapper;
-import org.dromara.archieves.mapper.SysTagRelMapper;
-import org.dromara.archieves.mapper.SysTagMapper;
 import org.dromara.archieves.service.IArcChangeLogService;
 import org.dromara.archieves.service.IUsrPetService;
 
@@ -51,6 +50,8 @@ public class UsrPetServiceImpl implements IUsrPetService {
     private final UsrCustomerMapper customerMapper;
     private final SysTagRelMapper tagRelMapper;
     private final SysTagMapper tagMapper;
+    private final ArcChangeLogMapper arcChangeLogMapper;
+
     private final IArcChangeLogService arcChangeLogService;
 
     @DubboReference
@@ -61,7 +62,7 @@ public class UsrPetServiceImpl implements IUsrPetService {
         UsrPetVo vo = baseMapper.selectVoById(id);
         if (vo != null) {
             fillOwnerInfo(vo);
-            vo.setTags(queryTagsByTargetId(id, "pet"));
+            vo.setTags(queryTagsByTargetId(id, TagTargetConstants.PET));
         }
         return vo;
     }
@@ -72,7 +73,7 @@ public class UsrPetServiceImpl implements IUsrPetService {
         Page<UsrPetVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
         result.getRecords().forEach(vo -> {
             fillOwnerInfo(vo);
-            vo.setTags(queryTagsByTargetId(vo.getId(), "pet"));
+            vo.setTags(queryTagsByTargetId(vo.getId(), TagTargetConstants.PET));
         });
         return TableDataInfo.build(result);
     }
@@ -85,7 +86,7 @@ public class UsrPetServiceImpl implements IUsrPetService {
         List<UsrPetVo> list = baseMapper.selectVoList(lqw);
         list.forEach(vo -> {
             fillOwnerInfo(vo);
-            vo.setTags(queryTagsByTargetId(vo.getId(), "pet"));
+            vo.setTags(queryTagsByTargetId(vo.getId(), TagTargetConstants.PET));
         });
         return list;
     }
@@ -111,14 +112,14 @@ public class UsrPetServiceImpl implements IUsrPetService {
         lqw.eq(bo.getUserId() != null, UsrPet::getUserId, bo.getUserId());
         lqw.orderByDesc(UsrPet::getCreateTime);
 
-        if (bo.getTab() != null) {
-            if (bo.getTab().equals(UsrPetTabEnum.SELF.getValue())) {
-                lqw.eq(UsrPet::getTenantId, TenantHelper.getTenantId());
-            } else {
-                List<Long> petIds = remoteSubOrderService.getPetIdsByTenantId(TenantHelper.getTenantId());
-                lqw.in(UsrPet::getId, WrapperUtils.convertIds(petIds));
-            }
-        }
+//        if (bo.getTab() != null) {
+//            if (bo.getTab().equals(UsrPetTabEnum.SELF.getValue())) {
+//                lqw.eq(UsrPet::getTenantId, TenantHelper.getTenantId());
+//            } else {
+//                List<Long> petIds = remoteSubOrderService.getPetIdsByTenantId(TenantHelper.getTenantId());
+//                lqw.in(UsrPet::getId, WrapperUtils.convertIds(petIds));
+//            }
+//        }
 
         return lqw;
     }
@@ -129,14 +130,15 @@ public class UsrPetServiceImpl implements IUsrPetService {
         UsrPet add = MapstructUtils.convert(bo, UsrPet.class);
         add.setPlatformId(PlatformUtils.getId());
         validEntityBeforeSave(add);
+        add.setTenantId(TenantHelper.getTenantId());
         boolean flag = baseMapper.insert(add) > 0;
         if (flag) {
             bo.setId(add.getId());
-            saveTagRels(add.getId(), bo.getTagIds(), "pet");
-            // 更新用户宠物数量
-            updateCustomerPetCount(bo.getUserId());
+            saveTagRels(add.getId(), bo.getTagIds(), TagTargetConstants.PET);
+//            // 更新用户宠物数量
+//            updateCustomerPetCount(bo.getUserId());
             // 记录到用户的档案日志
-            arcChangeLogService.addLog(bo.getUserId(), "customer", "新增宠物", "新增宠物档案 (" + bo.getName() + ")");
+            arcChangeLogService.addLog(bo.getUserId(), TagTargetConstants.CUSTOMER, "新增宠物", "新增宠物档案 (" + bo.getName() + ")");
         }
         return flag;
     }
@@ -148,10 +150,10 @@ public class UsrPetServiceImpl implements IUsrPetService {
         validEntityBeforeSave(update);
         boolean flag = baseMapper.updateById(update) > 0;
         if (flag) {
-            saveTagRels(bo.getId(), bo.getTagIds(), "pet");
+            saveTagRels(bo.getId(), bo.getTagIds(), TagTargetConstants.PET);
             // 如果有备注内容,记录变更日志
             if (StringUtils.isNotBlank(bo.getRemark())) {
-                arcChangeLogService.addLog(bo.getId(), "pet", "备注", bo.getRemark());
+                arcChangeLogService.addLog(bo.getId(), TagTargetConstants.PET, "备注", bo.getRemark());
             }
         }
         return flag;
@@ -172,14 +174,14 @@ public class UsrPetServiceImpl implements IUsrPetService {
         // 记录删除宠物日志到用户的档案日志
         for (UsrPet pet : pets) {
             if (pet.getUserId() != null) {
-                arcChangeLogService.addLog(pet.getUserId(), "customer", "删除宠物", "删除宠物档案 (" + pet.getName() + ")");
+                arcChangeLogService.addLog(pet.getUserId(), TagTargetConstants.CUSTOMER, "删除宠物", "删除宠物档案 (" + pet.getName() + ")");
             }
         }
         // 删除标签关联
         ids.forEach(id -> tagRelMapper.delete(
             Wrappers.lambdaQuery(SysTagRel.class)
                 .eq(SysTagRel::getTargetId, id)
-                .eq(SysTagRel::getTargetType, "pet")
+                .eq(SysTagRel::getTargetType, TagTargetConstants.PET)
         ));
         boolean flag = baseMapper.deleteByIds(ids) > 0;
         if (flag) {
@@ -188,6 +190,34 @@ public class UsrPetServiceImpl implements IUsrPetService {
         return flag;
     }
 
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public boolean remark(UsrPetRemarkBo bo) {
+
+        UsrPet pet = baseMapper.selectById(bo.getPetId());
+        pet.setRemark(bo.getContent());
+
+        boolean petFlag = baseMapper.updateById(pet) == 0;
+        if (petFlag) {
+            throw new RuntimeException("修改失败");
+        }
+
+        ArcChangeLog log = new ArcChangeLog();
+        log.setTenantId(pet.getTenantId());
+        log.setTargetId(pet.getId());
+        log.setTargetType(ChangeLogTargetTypeConstants.PET);
+        log.setLogType(ChangeLogTypeConstants.REMARK);
+        log.setContent(bo.getContent());
+        log.setOperatorId(LoginHelper.getUserId());
+        log.setOperatorName(LoginHelper.getLoginUser().getNickname());
+        boolean logFlag = arcChangeLogMapper.insert(log) == 0;
+        if (logFlag) {
+            throw new RuntimeException("新增日志失败");
+        }
+
+        return true;
+    }
+
     /**
      * 填充主人信息
      */
@@ -213,7 +243,6 @@ public class UsrPetServiceImpl implements IUsrPetService {
         );
         UsrCustomer update = new UsrCustomer();
         update.setId(userId);
-        update.setPetCount(count.intValue());
         customerMapper.updateById(update);
     }
 

+ 2 - 2
ruoyi-modules/yingpaipay-archieves/src/main/resources/application.yml

@@ -1,6 +1,6 @@
 # Tomcat
 server:
-  port: 9216
+  port: 10003
 
 # Spring
 spring:
@@ -20,7 +20,7 @@ spring:
       username: @nacos.username@
       password: @nacos.password@
       discovery:
-        ip: @discovery.ip@
+        # ip: @discovery.ip
         # 注册组
         group: @nacos.discovery.group@
         namespace: ${spring.profiles.active}

+ 9 - 0
ruoyi-modules/yingpaipay-fulfiller/src/main/java/org/dromara/fulfiller/constants/FlfActionTypeConstant.java

@@ -0,0 +1,9 @@
+package org.dromara.fulfiller.constants;
+
+public interface FlfActionTypeConstant {
+
+    String REDUCE = "reduce";
+
+    String ADD = "add";
+
+}

+ 9 - 0
ruoyi-modules/yingpaipay-fulfiller/src/main/java/org/dromara/fulfiller/constants/FlfRewardTargetConstant.java

@@ -0,0 +1,9 @@
+package org.dromara.fulfiller.constants;
+
+public interface FlfRewardTargetConstant {
+
+    String BALANCE = "balance";
+
+    String POINTS = "points";
+
+}

+ 1 - 2
ruoyi-modules/yingpaipay-fulfiller/src/main/java/org/dromara/fulfiller/controller/FlfAnamalyController.java

@@ -2,14 +2,13 @@ package org.dromara.fulfiller.controller;
 
 import lombok.RequiredArgsConstructor;
 import org.dromara.common.core.domain.R;
-import org.dromara.common.core.validate.AddGroup;
 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.fulfiller.domain.bo.*;
 import org.dromara.fulfiller.domain.vo.FlfAnamalyVo;
 import org.dromara.fulfiller.service.IFlfAnamalyService;
-import org.dromara.system.domain.vo.FlfAnamalyOnOrderVo;
+import org.dromara.fulfiller.domain.vo.FlfAnamalyOnOrderVo;
 import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
 

+ 50 - 5
ruoyi-modules/yingpaipay-fulfiller/src/main/java/org/dromara/fulfiller/controller/FlfLogController.java

@@ -2,14 +2,15 @@ package org.dromara.fulfiller.controller;
 
 import lombok.RequiredArgsConstructor;
 import cn.dev33.satoken.annotation.SaCheckPermission;
+import org.dromara.common.core.domain.R;
+import org.dromara.common.satoken.utils.LoginHelper;
+import org.dromara.fulfiller.domain.vo.*;
+import org.dromara.fulfiller.service.IFlfLogService;
 import org.springframework.web.bind.annotation.*;
 import org.springframework.validation.annotation.Validated;
 import org.dromara.common.web.core.BaseController;
 import org.dromara.common.mybatis.core.page.PageQuery;
 import org.dromara.common.mybatis.core.page.TableDataInfo;
-import org.dromara.fulfiller.domain.vo.FlfPointsLogVo;
-import org.dromara.fulfiller.domain.vo.FlfBalanceLogVo;
-import org.dromara.fulfiller.domain.vo.FlfRewardLogVo;
 import org.dromara.fulfiller.domain.FlfPointsLog;
 import org.dromara.fulfiller.domain.FlfBalanceLog;
 import org.dromara.fulfiller.domain.FlfRewardLog;
@@ -20,6 +21,8 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 
+import java.util.List;
+
 /**
  * 履约者日志查询
  * 前端访问路由地址为:/fulfiller/log
@@ -37,10 +40,12 @@ public class FlfLogController extends BaseController {
     private final FlfBalanceLogMapper balanceLogMapper;
     private final FlfRewardLogMapper rewardLogMapper;
 
+    private final IFlfLogService logService;
+
     /**
      * 查询积分变动记录
      */
-    @SaCheckPermission("fulfiller:fulfiller:query")
+//    @SaCheckPermission("fulfiller:fulfiller:query")
     @GetMapping("/points")
     public TableDataInfo<FlfPointsLogVo> pointsLog(
         @RequestParam Long fulfillerId, PageQuery pageQuery) {
@@ -54,7 +59,7 @@ public class FlfLogController extends BaseController {
     /**
      * 查询余额变动记录
      */
-    @SaCheckPermission("fulfiller:fulfiller:query")
+//    @SaCheckPermission("fulfiller:fulfiller:query")
     @GetMapping("/balance")
     public TableDataInfo<FlfBalanceLogVo> balanceLog(
         @RequestParam Long fulfillerId, PageQuery pageQuery) {
@@ -79,4 +84,44 @@ public class FlfLogController extends BaseController {
         return TableDataInfo.build(result);
     }
 
+    @GetMapping("/balanceOnApp")
+    public R<FlfBalanceOnAppVo> balanceOnApp() {
+        return R.ok(logService.balanceOnAppById(LoginHelper.getUserId()));
+    }
+
+    @GetMapping("/pageBalanceOnApp")
+    public TableDataInfo<FlfBalanceOnAppListVo> pageBalanceOnApp(PageQuery pageQuery) {
+        return logService.pageBalanceOnApp(LoginHelper.getUserId(), pageQuery);
+    }
+
+    @GetMapping("/listBalanceOnApp")
+    public R<List<FlfBalanceOnAppListVo>> listBalanceOnApp(@RequestParam Integer year, @RequestParam Integer month) {
+        return R.ok(logService.listBalanceOnApp(LoginHelper.getUserId(), year, month));
+    }
+
+    @GetMapping("/pointsOnApp")
+    public R<Integer> pointsOnApp() {
+        return R.ok(logService.pointsOnAppById(LoginHelper.getUserId()));
+    }
+
+    @GetMapping("/pagePointsOnApp")
+    public TableDataInfo<FlfPointsOnAppListVo> pagePointsOnApp(PageQuery pageQuery) {
+        return logService.pagePointsOnApp(LoginHelper.getUserId(), pageQuery);
+    }
+
+    @GetMapping("/listPointsOnApp")
+    public R<List<FlfPointsOnAppListVo>> listPointsOnApp(@RequestParam Integer year, @RequestParam Integer month) {
+        return R.ok(logService.listPointsOnApp(LoginHelper.getUserId(), year, month));
+    }
+
+    @GetMapping("/countOnAppReward")
+    public R<FlfRewardCountOnAppRewardVo> countOnAppReward(@RequestParam Integer year, @RequestParam Integer month) {
+        return R.ok(logService.countOnAppReward(LoginHelper.getUserId(), year, month));
+    }
+
+    @GetMapping("/listOnAppReward")
+    public R<List<FlfRewardListOnAppRewardVo>> listOnAppReward(@RequestParam Integer year, @RequestParam Integer month) {
+        return R.ok(logService.listOnAppReward(LoginHelper.getUserId(), year, month));
+    }
+
 }

+ 5 - 3
ruoyi-modules/yingpaipay-fulfiller/src/main/java/org/dromara/fulfiller/domain/FlfBalanceLog.java

@@ -32,14 +32,14 @@ public class FlfBalanceLog implements Serializable {
     private Long fulfillerId;
 
     /**
-     * 变动方向 (add:增加, reduce:减少)
+     * 变动方向
      */
     private String type;
 
     /**
-     * 资金类型 (reward:奖励, punish:惩罚, salary:工资发放, withdraw:提现, order:订单完成, other:其他)
+     * 资金类型
      */
-    private String subType;
+    private String bizType;
 
     /**
      * 变动金额(分, 正数)
@@ -67,4 +67,6 @@ public class FlfBalanceLog implements Serializable {
     @TableField(fill = FieldFill.INSERT)
     private Date createTime;
 
+    private Long subOrderId;
+
 }

+ 1 - 16
ruoyi-modules/yingpaipay-fulfiller/src/main/java/org/dromara/fulfiller/domain/FlfFulfiller.java

@@ -29,11 +29,6 @@ public class FlfFulfiller extends BaseEntity {
     @TableId(value = "id")
     private Long id;
 
-    /**
-     * 关联系统用户ID
-     */
-    private Long userId;
-
     /**
      * 姓名
      */
@@ -135,7 +130,7 @@ public class FlfFulfiller extends BaseEntity {
     private Long balance;
 
     /**
-     * 状态 (resting:休息, busy:接单中, disabled:禁用)
+     * 状态
      */
     private String status;
 
@@ -154,16 +149,6 @@ public class FlfFulfiller extends BaseEntity {
      */
     private String qualImages;
 
-    /**
-     * 服务单量
-     */
-    private Integer orderCount;
-
-    /**
-     * 拒单量
-     */
-    private Integer rejectCount;
-
     /**
      * 综合评分
      */

+ 2 - 0
ruoyi-modules/yingpaipay-fulfiller/src/main/java/org/dromara/fulfiller/domain/FlfPointsLog.java

@@ -67,4 +67,6 @@ public class FlfPointsLog implements Serializable {
     @TableField(fill = FieldFill.INSERT)
     private Date createTime;
 
+    private Long subOrderId;
+
 }

+ 5 - 1
ruoyi-modules/yingpaipay-fulfiller/src/main/java/org/dromara/fulfiller/domain/FlfRewardLog.java

@@ -32,7 +32,7 @@ public class FlfRewardLog implements Serializable {
     private Long fulfillerId;
 
     /**
-     * 操作类型 (reward:奖励, punish:惩罚)
+     * 操作类型
      */
     private String type;
 
@@ -67,4 +67,8 @@ public class FlfRewardLog implements Serializable {
     @TableField(fill = FieldFill.INSERT)
     private Date createTime;
 
+    private Long subOrderId;
+
+    private String bizType;
+
 }

+ 1 - 1
ruoyi-modules/yingpaipay-fulfiller/src/main/java/org/dromara/fulfiller/domain/bo/FlfFulfillerBo.java

@@ -73,7 +73,7 @@ public class FlfFulfillerBo extends BaseEntity {
     private Date idCardExpiry;
 
     /**
-     * 服务类型(JSON数组)
+     * 服务类型
      */
     private String serviceTypes;
 

+ 9 - 1
ruoyi-modules/yingpaipay-fulfiller/src/main/java/org/dromara/fulfiller/domain/bo/FlfRewardBo.java

@@ -19,11 +19,17 @@ public class FlfRewardBo {
     private Long fulfillerId;
 
     /**
-     * 操作类型 (reward:奖励, punish:惩罚)
+     * 操作类型
      */
     @NotBlank(message = "操作类型不能为空")
     private String type;
 
+    /**
+     * 奖惩类型
+     */
+    @NotBlank(message = "奖惩类型不能为空")
+    private String bizType;
+
     /**
      * 关联项目 (points:积分, balance:余额)
      */
@@ -43,4 +49,6 @@ public class FlfRewardBo {
     @NotBlank(message = "原因不能为空")
     private String reason;
 
+    private Long orderId;
+
 }

+ 1 - 1
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/FlfAnamalyOnOrderVo.java → ruoyi-modules/yingpaipay-fulfiller/src/main/java/org/dromara/fulfiller/domain/vo/FlfAnamalyOnOrderVo.java

@@ -1,4 +1,4 @@
-package org.dromara.system.domain.vo;
+package org.dromara.fulfiller.domain.vo;
 
 import lombok.Data;
 

+ 1 - 1
ruoyi-modules/yingpaipay-fulfiller/src/main/java/org/dromara/fulfiller/domain/vo/FlfBalanceLogVo.java

@@ -24,7 +24,7 @@ public class FlfBalanceLogVo implements Serializable {
     private Long id;
     private Long fulfillerId;
     private String type;
-    private String subType;
+    private String bizType;
     private Long amount;
     private Long balanceAfter;
     private String reason;

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

@@ -0,0 +1,27 @@
+package org.dromara.fulfiller.domain.vo;
+
+import lombok.Data;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.util.Date;
+
+@Data
+public class FlfBalanceOnAppListVo implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    private Long id;
+
+    private String bizType;
+
+    private String reason;
+
+    private Date createTime;
+
+    private Long amount;
+
+    private String type;
+
+}

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

@@ -0,0 +1,19 @@
+package org.dromara.fulfiller.domain.vo;
+
+import lombok.Data;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.util.List;
+
+@Data
+public class FlfBalanceOnAppVo implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    private Long balance;
+
+    private Long pendingBalance;
+
+}

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

@@ -0,0 +1,27 @@
+package org.dromara.fulfiller.domain.vo;
+
+import lombok.Data;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.util.Date;
+
+@Data
+public class FlfPointsOnAppListVo implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    private Long id;
+
+    private String bizType;
+
+    private String reason;
+
+    private Date createTime;
+
+    private Integer amount;
+
+    private String type;
+
+}

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

@@ -0,0 +1,17 @@
+package org.dromara.fulfiller.domain.vo;
+
+import lombok.Data;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.util.List;
+
+@Data
+public class FlfPointsOnAppVo implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    private Integer points;
+
+}

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

@@ -0,0 +1,22 @@
+package org.dromara.fulfiller.domain.vo;
+
+import lombok.Data;
+
+import java.io.Serial;
+import java.io.Serializable;
+
+@Data
+public class FlfRewardCountOnAppRewardVo implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    private Integer rewardCount;
+
+    private Integer punishCount;
+
+    private Long rewardBalance;
+
+    private Long punishBalance;
+
+}

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

@@ -0,0 +1,29 @@
+package org.dromara.fulfiller.domain.vo;
+
+import lombok.Data;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.util.Date;
+
+@Data
+public class FlfRewardListOnAppRewardVo implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    private Long id;
+
+    private String type;
+
+    private String bizType;
+
+    private String target;
+
+    private Integer amount;
+
+    private String reason;
+
+    private Date createTime;
+
+}

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

@@ -24,6 +24,7 @@ public class FlfRewardLogVo implements Serializable {
     private Long id;
     private Long fulfillerId;
     private String type;
+    private String bizType;
     private String target;
     private Integer amount;
     private String reason;

+ 9 - 7
ruoyi-modules/yingpaipay-fulfiller/src/main/java/org/dromara/fulfiller/dubbo/RemoteFulfillerServiceImpl.java

@@ -11,8 +11,11 @@ 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.constants.FlfActionTypeConstant;
 import org.dromara.fulfiller.domain.FlfBalanceLog;
 import org.dromara.fulfiller.domain.FlfFulfiller;
+import org.dromara.fulfiller.enums.FlfBalanceBizTypeEnum;
+import org.dromara.fulfiller.enums.FlfFulfillerStatusEnum;
 import org.dromara.fulfiller.mapper.FlfBalanceLogMapper;
 import org.dromara.fulfiller.mapper.FlfFulfillerMapper;
 import org.springframework.cache.annotation.Cacheable;
@@ -42,7 +45,6 @@ public class RemoteFulfillerServiceImpl implements RemoteFulfillerService {
         FlfFulfiller fulfiller = fulfillerMapper.selectOne(
             new com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper<FlfFulfiller>()
                 .eq(FlfFulfiller::getPhone, phone)
-                .eq(FlfFulfiller::getDelFlag, "0")
         );
 
         if (fulfiller == null) {
@@ -50,7 +52,7 @@ public class RemoteFulfillerServiceImpl implements RemoteFulfillerService {
             throw new UserException("user.not.exists");
         }
 
-        if ("disabled".equals(fulfiller.getStatus())) {
+        if (FlfFulfillerStatusEnum.DISABLED.getValue().equals(fulfiller.getStatus())) {
             log.info("登录用户:{} 已被禁用.", phone);
             throw new UserException("user.blocked");
         }
@@ -67,7 +69,7 @@ public class RemoteFulfillerServiceImpl implements RemoteFulfillerService {
             throw new UserException("user.not.exists");
         }
 
-        if ("disabled".equals(fulfiller.getStatus())) {
+        if (FlfFulfillerStatusEnum.DISABLED.getValue().equals(fulfiller.getStatus())) {
             log.info("履约者ID:{} 已被禁用.", id);
             throw new UserException("user.blocked");
         }
@@ -98,7 +100,7 @@ public class RemoteFulfillerServiceImpl implements RemoteFulfillerService {
     }
 
     @Override
-    public boolean settlement(Long fulfiller, Long price, String orderCode) {
+    public boolean settlement(Long fulfiller, Long price, String orderCode, Long orderId) {
 
         FlfFulfiller flfFulfiller = fulfillerMapper.selectById(fulfiller);
         flfFulfiller.setBalance(flfFulfiller.getBalance() + price);
@@ -110,13 +112,13 @@ public class RemoteFulfillerServiceImpl implements RemoteFulfillerService {
 
         FlfBalanceLog balanceLog = new FlfBalanceLog();
         balanceLog.setFulfillerId(fulfiller);
-        balanceLog.setType("add");
-        balanceLog.setSubType("order");
+        balanceLog.setType(FlfActionTypeConstant.ADD);
+        balanceLog.setBizType(FlfBalanceBizTypeEnum.ORDER_FINISH.getValue());
         balanceLog.setAmount(price);
         balanceLog.setBalanceAfter(flfFulfiller.getBalance());
         balanceLog.setReason("完成订单 " + orderCode);
         balanceLog.setOperatorId(fulfiller);
-        balanceLog.setCreateTime(new Date());
+        balanceLog.setSubOrderId(orderId);
         boolean balanceFlag = balanceLogMapper.insert(balanceLog) == 0;
         if (balanceFlag) {
             throw new RuntimeException("记录日志失败");

+ 41 - 0
ruoyi-modules/yingpaipay-fulfiller/src/main/java/org/dromara/fulfiller/dubbo/RemoteLogServiceImpl.java

@@ -0,0 +1,41 @@
+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;
+import org.dromara.fulfiller.api.RemoteLogService;
+import org.dromara.fulfiller.api.domain.vo.RemoteLogVo;
+import org.dromara.fulfiller.domain.FlfRewardLog;
+import org.dromara.fulfiller.mapper.FlfRewardLogMapper;
+import org.springframework.stereotype.Service;
+
+import java.util.ArrayList;
+import java.util.List;
+
+@Slf4j
+@RequiredArgsConstructor
+@Service
+@DubboService
+public class RemoteLogServiceImpl implements RemoteLogService {
+
+    private final FlfRewardLogMapper rewardLogMapper;
+
+    @Override
+    public List<RemoteLogVo> getListByUserId(Long userId) {
+
+        List<RemoteLogVo> vos = new ArrayList<>();
+
+        rewardLogMapper.selectList(
+            Wrappers.lambdaQuery(FlfRewardLog.class).select(FlfRewardLog::getSubOrderId, FlfRewardLog::getType)
+                .eq(FlfRewardLog::getFulfillerId, userId).isNotNull(FlfRewardLog::getSubOrderId)
+        ).forEach(e -> {
+            RemoteLogVo vo = new RemoteLogVo();
+            vo.setSubOrderId(e.getSubOrderId());
+            vo.setType(e.getType());
+            vos.add(vo);
+        });
+
+        return vos;
+    }
+}

+ 18 - 0
ruoyi-modules/yingpaipay-fulfiller/src/main/java/org/dromara/fulfiller/enums/AuditStatusEnum.java

@@ -0,0 +1,18 @@
+package org.dromara.fulfiller.enums;
+
+import lombok.AccessLevel;
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+@Getter
+@AllArgsConstructor(access = AccessLevel.PRIVATE)
+public enum AuditStatusEnum {
+
+    UNDER_REVIEW(0, "待审核"),
+    PASSED(1, "已通过"),
+    REJECTED(2, "已驳回"),
+    ;
+    private final Integer value;
+    private final String label;
+
+}

+ 23 - 0
ruoyi-modules/yingpaipay-fulfiller/src/main/java/org/dromara/fulfiller/enums/FlfBalanceBizTypeEnum.java

@@ -0,0 +1,23 @@
+package org.dromara.fulfiller.enums;
+
+import lombok.AccessLevel;
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+@Getter
+@AllArgsConstructor(access = AccessLevel.PRIVATE)
+public enum FlfBalanceBizTypeEnum {
+
+    ADMIN_REWARD("admin_reward", "后台奖励"),
+    ADMIN_PUNISH("admin_punish", "后台惩罚"),
+    ADMIN_ADJUST("admin_adjust", "后台调整"),
+    ORDER_REWARD("admin_reward", "订单奖励"),
+    ORDER_PUNISH("admin_punish", "订单惩罚"),
+    ORDER_FINISH("order_finish", "订单完成"),
+    SALARY("salary", "工资发放"),
+    WITHDRAW("withdraw", "提现"),
+    ;
+    private final String value;
+    private final String label;
+
+}

+ 18 - 0
ruoyi-modules/yingpaipay-fulfiller/src/main/java/org/dromara/fulfiller/enums/FlfFulfillerStatusEnum.java

@@ -0,0 +1,18 @@
+package org.dromara.fulfiller.enums;
+
+import lombok.AccessLevel;
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+@Getter
+@AllArgsConstructor(access = AccessLevel.PRIVATE)
+public enum FlfFulfillerStatusEnum {
+
+    RESTING("resting", "休息"),
+    BUSY("busy", "接单中"),
+    DISABLED("disabled", "已禁用"),
+    ;
+    private final String value;
+    private final String label;
+
+}

+ 22 - 0
ruoyi-modules/yingpaipay-fulfiller/src/main/java/org/dromara/fulfiller/enums/FlfPointsBizTypeEnum.java

@@ -0,0 +1,22 @@
+package org.dromara.fulfiller.enums;
+
+import lombok.AccessLevel;
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+@Getter
+@AllArgsConstructor(access = AccessLevel.PRIVATE)
+public enum FlfPointsBizTypeEnum {
+
+    ADMIN_REWARD("admin_reward", "后台奖励"),
+    ADMIN_PUNISH("admin_punish", "后台惩罚"),
+    ADMIN_ADJUST("admin_adjust", "后台调整"),
+
+    ORDER_REWARD("admin_reward", "订单奖励"),
+    ORDER_PUNISH("admin_punish", "订单惩罚"),
+    ORDER_FINISH("order_finish", "订单完成"),
+    ;
+    private final String value;
+    private final String label;
+
+}

+ 21 - 0
ruoyi-modules/yingpaipay-fulfiller/src/main/java/org/dromara/fulfiller/enums/FlfRewardBizTypeEnum.java

@@ -0,0 +1,21 @@
+package org.dromara.fulfiller.enums;
+
+import lombok.AccessLevel;
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+@Getter
+@AllArgsConstructor(access = AccessLevel.PRIVATE)
+public enum FlfRewardBizTypeEnum {
+
+    ADMIN_REWARD("admin_reward", "后台奖励"),
+    ADMIN_PUNISH("admin_punish", "后台惩罚"),
+
+    ORDER_REWARD("order_reward", "订单奖励"),
+    ORDER_PUNISH("admin_punish", "订单惩罚"),
+    ORDER_FINISH("order_finish", "订单完成"),
+    ;
+    private final String value;
+    private final String label;
+
+}

+ 1 - 1
ruoyi-modules/yingpaipay-fulfiller/src/main/java/org/dromara/fulfiller/service/IFlfAnamalyService.java

@@ -4,7 +4,7 @@ import org.dromara.common.mybatis.core.page.PageQuery;
 import org.dromara.common.mybatis.core.page.TableDataInfo;
 import org.dromara.fulfiller.domain.bo.*;
 import org.dromara.fulfiller.domain.vo.FlfAnamalyVo;
-import org.dromara.system.domain.vo.FlfAnamalyOnOrderVo;
+import org.dromara.fulfiller.domain.vo.FlfAnamalyOnOrderVo;
 
 import java.util.List;
 

+ 25 - 0
ruoyi-modules/yingpaipay-fulfiller/src/main/java/org/dromara/fulfiller/service/IFlfLogService.java

@@ -0,0 +1,25 @@
+package org.dromara.fulfiller.service;
+
+import org.dromara.common.mybatis.core.page.PageQuery;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.fulfiller.domain.vo.*;
+
+import java.util.List;
+
+public interface IFlfLogService {
+    FlfBalanceOnAppVo balanceOnAppById(Long userId);
+
+    Integer pointsOnAppById(Long userId);
+
+    TableDataInfo<FlfBalanceOnAppListVo> pageBalanceOnApp(Long userId, PageQuery pageQuery);
+
+    TableDataInfo<FlfPointsOnAppListVo> pagePointsOnApp(Long userId, PageQuery pageQuery);
+
+    List<FlfBalanceOnAppListVo> listBalanceOnApp(Long userId, Integer year, Integer month);
+
+    List<FlfPointsOnAppListVo> listPointsOnApp(Long userId, Integer year, Integer month);
+
+    FlfRewardCountOnAppRewardVo countOnAppReward(Long userId, Integer year, Integer month);
+
+    List<FlfRewardListOnAppRewardVo> listOnAppReward(Long userId, Integer year, Integer month);
+}

+ 1 - 2
ruoyi-modules/yingpaipay-fulfiller/src/main/java/org/dromara/fulfiller/service/impl/FlfAnamalyServiceImpl.java

@@ -6,7 +6,6 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import lombok.RequiredArgsConstructor;
 import org.apache.dubbo.config.annotation.DubboReference;
 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.PageQuery;
 import org.dromara.common.mybatis.core.page.TableDataInfo;
@@ -25,7 +24,7 @@ import org.dromara.resource.api.RemoteFileService;
 import org.dromara.resource.api.domain.RemoteFile;
 import org.dromara.system.api.RemoteUserService;
 import org.dromara.system.api.domain.vo.RemoteUserVo;
-import org.dromara.system.domain.vo.FlfAnamalyOnOrderVo;
+import org.dromara.fulfiller.domain.vo.FlfAnamalyOnOrderVo;
 import org.springframework.stereotype.Service;
 
 import java.util.*;

+ 13 - 10
ruoyi-modules/yingpaipay-fulfiller/src/main/java/org/dromara/fulfiller/service/impl/FlfAuditServiceImpl.java

@@ -12,6 +12,8 @@ import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.dubbo.config.annotation.DubboReference;
+import org.dromara.fulfiller.enums.AuditStatusEnum;
+import org.dromara.fulfiller.enums.FlfFulfillerStatusEnum;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 import org.dromara.fulfiller.domain.FlfAudit;
@@ -27,6 +29,7 @@ import org.dromara.system.api.RemoteAreaStationService;
 
 import java.util.Date;
 import java.util.List;
+import java.util.Objects;
 
 /**
  * 履约者审核记录Service业务层处理
@@ -96,7 +99,7 @@ public class FlfAuditServiceImpl implements IFlfAuditService {
     @Override
     public Long countPending() {
         return baseMapper.selectCount(Wrappers.<FlfAudit>lambdaQuery()
-            .eq(FlfAudit::getStatus, 0));
+            .eq(FlfAudit::getStatus, AuditStatusEnum.UNDER_REVIEW.getLabel()));
     }
 
     private LambdaQueryWrapper<FlfAudit> buildQueryWrapper(FlfAuditBo bo) {
@@ -114,8 +117,11 @@ public class FlfAuditServiceImpl implements IFlfAuditService {
     @Override
     public Boolean submitApply(FlfAuditBo bo) {
         FlfAudit add = MapstructUtils.convert(bo, FlfAudit.class);
-        add.setStatus(0);
+        add.setStatus(AuditStatusEnum.UNDER_REVIEW.getValue());
         // 密码BCrypt加密后存储,避免明文存入数据库
+        if (fulfillerMapper.exists(Wrappers.lambdaQuery(FlfFulfiller.class).eq(FlfFulfiller::getPhone, bo.getPhone()))) {
+            throw new ServiceException("手机号已存在");
+        }
         if (StringUtils.isNotBlank(add.getPassword())) {
             add.setPassword(cn.hutool.crypto.digest.BCrypt.hashpw(add.getPassword()));
         }
@@ -129,14 +135,14 @@ public class FlfAuditServiceImpl implements IFlfAuditService {
         if (audit == null) {
             throw new ServiceException("审核记录不存在");
         }
-        if (audit.getStatus() != 0) {
+        if (!Objects.equals(audit.getStatus(), AuditStatusEnum.UNDER_REVIEW.getValue())) {
             throw new ServiceException("该记录已处理,不可重复操作");
         }
 
         // 更新审核状态
         FlfAudit update = new FlfAudit();
         update.setId(id);
-        update.setStatus(1);
+        update.setStatus(AuditStatusEnum.PASSED.getValue());
         update.setAuditBy(LoginHelper.getUserId());
         update.setAuditTime(new Date());
         baseMapper.updateById(update);
@@ -158,7 +164,6 @@ public class FlfAuditServiceImpl implements IFlfAuditService {
             // 首次入驻审核通过:创建履约者 @author steelwei
             // 创建 flf_fulfiller 记录(不再创建 sys_user)
             FlfFulfiller fulfiller = new FlfFulfiller();
-            fulfiller.setUserId(null); // 不再关联 sys_user
             fulfiller.setName(audit.getName());
             fulfiller.setRealName(audit.getRealName());
             fulfiller.setPhone(audit.getPhone());
@@ -173,13 +178,11 @@ public class FlfAuditServiceImpl implements IFlfAuditService {
             fulfiller.setWorkType(audit.getWorkType());
             fulfiller.setStationId(audit.getStationId());
             fulfiller.setQualImages(audit.getQualifications());
-            fulfiller.setStatus("resting");
+            fulfiller.setStatus(FlfFulfillerStatusEnum.RESTING.getValue());
             fulfiller.setAuthId(true);
             fulfiller.setAuthQual(StringUtils.isNotBlank(audit.getQualifications()));
             fulfiller.setPoints(0);
             fulfiller.setBalance(0L);
-            fulfiller.setOrderCount(0);
-            fulfiller.setRejectCount(0);
             fulfillerMapper.insert(fulfiller);
 
             // 回写fulfillerId到审核记录
@@ -210,13 +213,13 @@ public class FlfAuditServiceImpl implements IFlfAuditService {
         if (audit == null) {
             throw new ServiceException("审核记录不存在");
         }
-        if (audit.getStatus() != 0) {
+        if (!Objects.equals(audit.getStatus(), AuditStatusEnum.UNDER_REVIEW.getValue())) {
             throw new ServiceException("该记录已处理,不可重复操作");
         }
 
         FlfAudit update = new FlfAudit();
         update.setId(id);
-        update.setStatus(2);
+        update.setStatus(AuditStatusEnum.REJECTED.getValue());
         update.setRejectReason(rejectReason);
         update.setAuditBy(LoginHelper.getUserId());
         update.setAuditTime(new Date());

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

@@ -17,10 +17,16 @@ import org.dromara.common.mybatis.helper.DataBaseHelper;
 import org.dromara.common.mybatis.utils.WrapperUtils;
 import org.dromara.common.redis.utils.CacheUtils;
 import org.dromara.common.satoken.utils.LoginHelper;
-import org.dromara.fulfiller.constants.TagTargetConstants;
+import org.dromara.fulfiller.constants.FlfActionTypeConstant;
+import org.dromara.fulfiller.constants.FlfRewardTargetConstant;
+import org.dromara.common.core.constant.TagTargetConstants;
 import org.dromara.fulfiller.domain.vo.FlfFulfillerOnOrderVo;
 import org.dromara.fulfiller.domain.vo.FlfFulfilllerListByNameAndPhoneNumberVo;
+import org.dromara.fulfiller.enums.FlfBalanceBizTypeEnum;
+import org.dromara.fulfiller.enums.FlfPointsBizTypeEnum;
+import org.dromara.order.api.RemoteSubOrderLogService;
 import org.dromara.order.api.RemoteSubOrderService;
+import org.dromara.order.api.domain.vo.RemoteSubOrderLogCountVo;
 import org.dromara.order.api.domain.vo.RemoteSubOrderVo;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
@@ -84,6 +90,8 @@ public class FlfFulfillerServiceImpl implements IFlfFulfillerService {
     private final RemoteFileService remoteFileService;
     @DubboReference
     private final RemoteSubOrderService remoteSubOrderService;
+    @DubboReference
+    private final RemoteSubOrderLogService remoteSubOrderLogService;
 
     @Override
     public FlfFulfillerVo queryById(Long id) {
@@ -142,7 +150,6 @@ public class FlfFulfillerServiceImpl implements IFlfFulfillerService {
             : BCrypt.hashpw("123456"); // 默认密码
 
         FlfFulfiller add = MapstructUtils.convert(bo, FlfFulfiller.class);
-        add.setUserId(null); // 不再关联 sys_user
         add.setPassword(encryptedPwd);
         validEntityBeforeSave(add);
         boolean flag = baseMapper.insert(add) > 0;
@@ -203,9 +210,9 @@ public class FlfFulfillerServiceImpl implements IFlfFulfillerService {
             throw new ServiceException("履约者不存在");
         }
 
-        int delta = "punish".equals(bo.getType()) ? -bo.getAmount() : bo.getAmount();
+        int delta = FlfActionTypeConstant.REDUCE.equals(bo.getType()) ? -bo.getAmount() : bo.getAmount();
 
-        if ("points".equals(bo.getTarget())) {
+        if (FlfRewardTargetConstant.POINTS.equals(bo.getTarget())) {
             int newPoints = fulfiller.getPoints() + delta;
             FlfFulfiller update = new FlfFulfiller();
             update.setId(fulfiller.getId());
@@ -216,14 +223,15 @@ public class FlfFulfillerServiceImpl implements IFlfFulfillerService {
             FlfPointsLog plog = new FlfPointsLog();
             plog.setFulfillerId(fulfiller.getId());
             plog.setType(bo.getType());
-            plog.setBizType("admin_" + bo.getType());
+            plog.setBizType(bo.getBizType());
             plog.setAmount(delta);
             plog.setPointsAfter(newPoints);
             plog.setReason(bo.getReason());
             plog.setOperatorId(LoginHelper.getUserId());
+            plog.setSubOrderId(bo.getOrderId());
             pointsLogMapper.insert(plog);
-        } else if ("balance".equals(bo.getTarget())) {
-            long longDelta = (long) delta;
+        } else if (FlfRewardTargetConstant.BALANCE.equals(bo.getTarget())) {
+            long longDelta = delta;
             long newBalance = fulfiller.getBalance() + longDelta;
             FlfFulfiller update = new FlfFulfiller();
             update.setId(fulfiller.getId());
@@ -234,11 +242,12 @@ public class FlfFulfillerServiceImpl implements IFlfFulfillerService {
             FlfBalanceLog blog = new FlfBalanceLog();
             blog.setFulfillerId(fulfiller.getId());
             blog.setType(bo.getType());
-            blog.setSubType("admin_" + bo.getType());
+            blog.setBizType(bo.getBizType());
             blog.setAmount(longDelta);
             blog.setBalanceAfter(newBalance);
             blog.setReason(bo.getReason());
             blog.setOperatorId(LoginHelper.getUserId());
+            blog.setSubOrderId(bo.getOrderId());
             balanceLogMapper.insert(blog);
         }
 
@@ -246,10 +255,12 @@ public class FlfFulfillerServiceImpl implements IFlfFulfillerService {
         FlfRewardLog rlog = new FlfRewardLog();
         rlog.setFulfillerId(fulfiller.getId());
         rlog.setType(bo.getType());
+        rlog.setBizType(bo.getBizType());
         rlog.setTarget(bo.getTarget());
         rlog.setAmount(bo.getAmount());
         rlog.setReason(bo.getReason());
         rlog.setOperatorId(LoginHelper.getUserId());
+        rlog.setSubOrderId(bo.getOrderId());
         rewardLogMapper.insert(rlog);
 
         return true;
@@ -271,8 +282,8 @@ public class FlfFulfillerServiceImpl implements IFlfFulfillerService {
 
         FlfPointsLog plog = new FlfPointsLog();
         plog.setFulfillerId(fulfiller.getId());
-        plog.setType(bo.getAmount() > 0 ? "increase" : "decrease");
-        plog.setBizType("admin_adjust");
+        plog.setType(bo.getAmount() > 0 ? FlfActionTypeConstant.ADD : FlfActionTypeConstant.REDUCE);
+        plog.setBizType(FlfPointsBizTypeEnum.ADMIN_ADJUST.getValue());
         plog.setAmount(bo.getAmount());
         plog.setPointsAfter(newPoints);
         plog.setReason(bo.getReason());
@@ -298,8 +309,8 @@ public class FlfFulfillerServiceImpl implements IFlfFulfillerService {
 
         FlfBalanceLog blog = new FlfBalanceLog();
         blog.setFulfillerId(fulfiller.getId());
-        blog.setType(bo.getAmount() > 0 ? "increase" : "decrease");
-        blog.setSubType("admin_adjust");
+        blog.setType(bo.getAmount() > 0 ? FlfActionTypeConstant.ADD : FlfActionTypeConstant.REDUCE);
+        blog.setBizType(FlfBalanceBizTypeEnum.ADMIN_ADJUST.getValue());
         blog.setAmount(bo.getAmount());
         blog.setBalanceAfter(newBalance);
         blog.setReason(bo.getReason());
@@ -370,6 +381,12 @@ public class FlfFulfillerServiceImpl implements IFlfFulfillerService {
             vo.setHasPassword(entity != null && StringUtils.isNotBlank(entity.getPassword()));
 
             // 图片URL由 @Translation 注解在序列化时自动解析,无需手动处理
+
+            // 我摆烂了,直接接下去写,性能后面再说吧 @author: Huanyi
+            RemoteSubOrderLogCountVo count = remoteSubOrderLogService.getCountByFulfillerId(vo.getId());
+            vo.setOrderCount(count.getTotal());
+            vo.setRejectCount(count.getReject());
+
         } catch (Exception e) {
             log.warn("enrichVo失败: {}", e.getMessage());
         }

+ 219 - 0
ruoyi-modules/yingpaipay-fulfiller/src/main/java/org/dromara/fulfiller/service/impl/FlfLogServiceImpl.java

@@ -0,0 +1,219 @@
+package org.dromara.fulfiller.service.impl;
+
+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.common.mybatis.core.page.PageQuery;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.common.satoken.utils.LoginHelper;
+import org.dromara.fulfiller.constants.FlfActionTypeConstant;
+import org.dromara.fulfiller.constants.FlfRewardTargetConstant;
+import org.dromara.fulfiller.domain.FlfBalanceLog;
+import org.dromara.fulfiller.domain.FlfPointsLog;
+import org.dromara.fulfiller.domain.FlfRewardLog;
+import org.dromara.fulfiller.domain.vo.*;
+import org.dromara.fulfiller.mapper.FlfBalanceLogMapper;
+import org.dromara.fulfiller.mapper.FlfFulfillerMapper;
+import org.dromara.fulfiller.mapper.FlfPointsLogMapper;
+import org.dromara.fulfiller.mapper.FlfRewardLogMapper;
+import org.dromara.fulfiller.service.IFlfLogService;
+import org.dromara.order.api.RemoteSubOrderService;
+import org.springframework.stereotype.Service;
+
+import java.sql.Timestamp;
+import java.time.LocalDate;
+import java.time.LocalTime;
+import java.time.YearMonth;
+import java.time.ZoneId;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+import java.util.concurrent.atomic.AtomicLong;
+
+@Service
+@RequiredArgsConstructor
+public class FlfLogServiceImpl implements IFlfLogService {
+
+    private final FlfFulfillerMapper fulfillerMapper;
+    private final FlfBalanceLogMapper balanceLogMapper;
+    private final FlfPointsLogMapper pointsLogMapper;
+    private final FlfRewardLogMapper rewardLogMapper;
+
+    @DubboReference
+    private final RemoteSubOrderService remoteSubOrderService;
+
+    private static final Integer START_DATE = 0;
+    private static final Integer LAST_DATE = 1;
+
+    @Override
+    public FlfBalanceOnAppVo balanceOnAppById(Long userId) {
+        FlfBalanceOnAppVo vo = new FlfBalanceOnAppVo();
+        vo.setBalance(fulfillerMapper.selectById(userId).getBalance());
+        vo.setPendingBalance(remoteSubOrderService.balanceOnPending(userId));
+        return vo;
+    }
+
+    @Override
+    public Integer pointsOnAppById(Long userId) {
+        return fulfillerMapper.selectById(userId).getPoints();
+    }
+
+    @Override
+    public TableDataInfo<FlfBalanceOnAppListVo> pageBalanceOnApp(Long userId, PageQuery pageQuery) {
+
+        Page<FlfBalanceLog> page = balanceLogMapper.selectPage(
+            pageQuery.build(),
+            Wrappers.lambdaQuery(FlfBalanceLog.class).eq(FlfBalanceLog::getFulfillerId, userId).orderByDesc(FlfBalanceLog::getId)
+        );
+
+        return TableDataInfo.build(page.convert(e -> {
+            FlfBalanceOnAppListVo vo = new FlfBalanceOnAppListVo();
+            vo.setId(e.getId());
+            vo.setBizType(e.getBizType());
+            vo.setReason(e.getReason());
+            vo.setCreateTime(e.getCreateTime());
+            vo.setAmount(e.getAmount());
+            vo.setType(e.getType());
+            return vo;
+        }));
+    }
+
+    @Override
+    public TableDataInfo<FlfPointsOnAppListVo> pagePointsOnApp(Long userId, PageQuery pageQuery) {
+        Page<FlfPointsLog> page = pointsLogMapper.selectPage(
+            pageQuery.build(),
+            Wrappers.lambdaQuery(FlfPointsLog.class).eq(FlfPointsLog::getFulfillerId, userId).orderByDesc(FlfPointsLog::getId)
+        );
+
+        return TableDataInfo.build(page.convert(e -> {
+            FlfPointsOnAppListVo vo = new FlfPointsOnAppListVo();
+            vo.setId(e.getId());
+            vo.setBizType(e.getBizType());
+            vo.setReason(e.getReason());
+            vo.setCreateTime(e.getCreateTime());
+            vo.setAmount(e.getAmount());
+            vo.setType(e.getType());
+            return vo;
+        }));
+    }
+
+    @Override
+    public List<FlfBalanceOnAppListVo> listBalanceOnApp(Long userId, Integer year, Integer month) {
+
+        List<Date> date = getDate(year, month);
+
+        List<FlfBalanceOnAppListVo> result = new ArrayList<>();
+
+        balanceLogMapper.selectList(
+            Wrappers.lambdaQuery(FlfBalanceLog.class).eq(FlfBalanceLog::getFulfillerId, userId).orderByDesc(FlfBalanceLog::getId)
+                .between(FlfBalanceLog::getCreateTime, date.get(START_DATE), date.get(LAST_DATE))
+        ).forEach(e -> {
+            FlfBalanceOnAppListVo vo = new FlfBalanceOnAppListVo();
+            vo.setId(e.getId());
+            vo.setBizType(e.getBizType());
+            vo.setReason(e.getReason());
+            vo.setCreateTime(e.getCreateTime());
+            vo.setAmount(e.getAmount());
+            vo.setType(e.getType());
+            result.add(vo);
+        });
+
+        return result;
+    }
+
+    @Override
+    public List<FlfPointsOnAppListVo> listPointsOnApp(Long userId, Integer year, Integer month) {
+
+        List<Date> date = getDate(year, month);
+
+        List<FlfPointsOnAppListVo> result = new ArrayList<>();
+
+        pointsLogMapper.selectList(
+            Wrappers.lambdaQuery(FlfPointsLog.class).eq(FlfPointsLog::getFulfillerId, userId).orderByDesc(FlfPointsLog::getId)
+                .between(FlfPointsLog::getCreateTime, date.get(START_DATE), date.get(LAST_DATE))
+        ).forEach(e -> {
+            FlfPointsOnAppListVo vo = new FlfPointsOnAppListVo();
+            vo.setId(e.getId());
+            vo.setBizType(e.getBizType());
+            vo.setReason(e.getReason());
+            vo.setCreateTime(e.getCreateTime());
+            vo.setAmount(e.getAmount());
+            vo.setType(e.getType());
+            result.add(vo);
+        });
+
+        return result;
+    }
+
+    @Override
+    public FlfRewardCountOnAppRewardVo countOnAppReward(Long userId, Integer year, Integer month) {
+        List<Date> date = getDate(year, month);
+        FlfRewardCountOnAppRewardVo vo = new FlfRewardCountOnAppRewardVo();
+
+        List<Long> reward = new ArrayList<>();
+        List<Long> punish = new ArrayList<>();
+        AtomicLong rewardBalance = new AtomicLong(0);
+        AtomicLong punishBalance = new AtomicLong(0);
+
+        rewardLogMapper.selectList(
+            Wrappers.lambdaQuery(FlfRewardLog.class).eq(FlfRewardLog::getFulfillerId, userId)
+                .isNotNull(FlfRewardLog::getSubOrderId).eq(FlfRewardLog::getTarget, FlfRewardTargetConstant.BALANCE)
+                .between(FlfRewardLog::getCreateTime, date.get(START_DATE), date.get(LAST_DATE))
+        ).forEach(e -> {
+            if (e.getType().equals(FlfActionTypeConstant.ADD)) {
+                rewardBalance.addAndGet(e.getAmount());
+                if (!reward.contains(e.getSubOrderId())) {
+                    reward.add(e.getSubOrderId());
+                }
+            } else {
+                punishBalance.addAndGet(e.getAmount());
+                if (!punish.contains(e.getSubOrderId())) {
+                    punish.add(e.getSubOrderId());
+                }
+            }
+        });
+
+        vo.setRewardCount(reward.size());
+        vo.setPunishCount(punish.size());
+        vo.setRewardBalance(rewardBalance.get());
+        vo.setPunishBalance(punishBalance.get());
+
+        return vo;
+    }
+
+    @Override
+    public List<FlfRewardListOnAppRewardVo> listOnAppReward(Long userId, Integer year, Integer month) {
+
+        List<Date> date = getDate(year, month);
+        List<FlfRewardListOnAppRewardVo> list = new ArrayList<>();
+
+        rewardLogMapper.selectList(
+            Wrappers.lambdaQuery(FlfRewardLog.class).eq(FlfRewardLog::getFulfillerId, userId)
+                .isNotNull(FlfRewardLog::getSubOrderId).eq(FlfRewardLog::getTarget, FlfRewardTargetConstant.BALANCE)
+                .between(FlfRewardLog::getCreateTime, date.get(START_DATE), date.get(LAST_DATE))
+        ).forEach(e -> {
+            FlfRewardListOnAppRewardVo vo = new FlfRewardListOnAppRewardVo();
+            vo.setId(e.getId());
+            vo.setType(e.getType());
+            vo.setBizType(e.getBizType());
+            vo.setTarget(e.getTarget());
+            vo.setAmount(e.getAmount());
+            vo.setReason(e.getReason());
+            vo.setCreateTime(e.getCreateTime());
+            list.add(vo);
+        });
+
+        return list;
+    }
+
+    private List<Date> getDate(int year, int month) {
+        List<Date> result = new ArrayList<>();
+        YearMonth yearMonth = YearMonth.of(year, month);
+        LocalDate first = yearMonth.atDay(1), last = yearMonth.atEndOfMonth();
+        result.add(Date.from(first.atStartOfDay(ZoneId.systemDefault()).toInstant()));
+        result.add(Date.from(last.atTime(LocalTime.MAX).atZone(ZoneId.systemDefault()).toInstant()));
+        return result;
+    }
+
+}

+ 2 - 2
ruoyi-modules/yingpaipay-fulfiller/src/main/resources/application.yml

@@ -1,6 +1,6 @@
 # Tomcat
 server:
-  port: 9217
+  port: 10004
 
 # Spring
 spring:
@@ -20,7 +20,7 @@ spring:
       username: @nacos.username@
       password: @nacos.password@
       discovery:
-        ip: @discovery.ip@
+        # ip: @discovery.ip
         # 注册组
         group: @nacos.discovery.group@
         namespace: ${spring.profiles.active}

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

@@ -6,6 +6,7 @@ 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.satoken.utils.LoginHelper;
 import org.dromara.common.web.core.BaseController;
 import org.dromara.order.domain.bo.*;
 import org.dromara.order.domain.vo.*;
@@ -100,4 +101,30 @@ public class SysSubOrderController extends BaseController {
         return toAjax(subOrderService.reject(bo));
     }
 
+    @GetMapping("/listOnCustomer")
+    public R<List<SysSubOrderListOnCustomerVo>> listOnCustomer(@RequestParam Long customerId) {
+        return R.ok(subOrderService.listOnCustomer(customerId));
+    }
+
+    @GetMapping("/listOnPet")
+    public R<List<SysSubOrderListOnPetVo>> listOnPet(@RequestParam Long petId) {
+        return R.ok(subOrderService.listOnPet(petId));
+    }
+
+    @GetMapping("/listOnFulfiller")
+    public R<List<SysSubOrderListOnFulfillerVo>> listOnFulfiller(@RequestParam Long fulfillerId) {
+        return R.ok(subOrderService.listOnFulfiller(fulfillerId));
+    }
+
+    @GetMapping("/listOnStore")
+    public TableDataInfo<SysSubOrderListOnStoreVo> listOnStore(@RequestParam Long storeId, PageQuery pageQuery) {
+        return subOrderService.listOnStore(storeId, pageQuery);
+    }
+
+    @GetMapping("/listOnStatistic")
+    public TableDataInfo<SysSubOrderStatisticPageVo> listOnStatistic(
+        @RequestParam(name = "status", required = false) Integer status, PageQuery pageQuery) {
+        return subOrderService.listOnStatistic(status, pageQuery, LoginHelper.getUserId());
+    }
+
 }

+ 17 - 4
ruoyi-modules/yingpaipay-order/src/main/java/org/dromara/order/controller/SysSubOrderLogController.java

@@ -1,14 +1,16 @@
 package org.dromara.order.controller;
 
+import jakarta.servlet.http.HttpServletResponse;
 import lombok.RequiredArgsConstructor;
 import org.dromara.common.core.domain.R;
+import org.dromara.common.excel.utils.ExcelUtil;
+import org.dromara.common.satoken.utils.LoginHelper;
 import org.dromara.common.web.core.BaseController;
+import org.dromara.order.domain.excel.SysSubOrderLogExcel;
+import org.dromara.order.domain.vo.SysSubOrderLogCountVo;
 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 org.springframework.web.bind.annotation.*;
 
 import java.util.List;
 
@@ -24,4 +26,15 @@ public class SysSubOrderLogController extends BaseController {
         return R.ok(subOrderLogService.list(orderId));
     }
 
+    @PostMapping("/export/{orderId}")
+    public void export(@PathVariable Long orderId, HttpServletResponse response) {
+        List<SysSubOrderLogExcel> list = subOrderLogService.listLogExcelList(orderId);
+        ExcelUtil.exportExcel(list, "服务进度", SysSubOrderLogExcel.class, response);
+    }
+
+    @GetMapping("/count")
+    public R<SysSubOrderLogCountVo> count() {
+        return R.ok(subOrderLogService.count(LoginHelper.getUserId()));
+    }
+
 }

+ 26 - 0
ruoyi-modules/yingpaipay-order/src/main/java/org/dromara/order/domain/excel/SysSubOrderLogExcel.java

@@ -0,0 +1,26 @@
+package org.dromara.order.domain.excel;
+
+import cn.idev.excel.annotation.ExcelIgnoreUnannotated;
+import cn.idev.excel.annotation.ExcelProperty;
+import lombok.Data;
+
+import java.io.Serial;
+import java.io.Serializable;
+
+@Data
+@ExcelIgnoreUnannotated
+public class SysSubOrderLogExcel implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    @ExcelProperty("标题")
+    private String title;
+
+    @ExcelProperty("内容")
+    private String content;
+
+    @ExcelProperty("时间")
+    private String createTime;
+
+}

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

@@ -0,0 +1,27 @@
+package org.dromara.order.domain.vo;
+
+import lombok.Data;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.util.Date;
+
+@Data
+public class SysSubOrderListOnCustomerVo implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    private Long id;
+
+    private String code;
+
+    private Long service;
+
+    private String pet;
+
+    private Date serviceTime;
+
+    private Integer status;
+
+}

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

@@ -0,0 +1,27 @@
+package org.dromara.order.domain.vo;
+
+import lombok.Data;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.util.Date;
+
+@Data
+public class SysSubOrderListOnFulfillerVo implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    private Long id;
+
+    private String code;
+
+    private Long service;
+
+    private Long price;
+
+    private Date serviceTime;
+
+    private Integer status;
+
+}

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

@@ -0,0 +1,27 @@
+package org.dromara.order.domain.vo;
+
+import lombok.Data;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.util.Date;
+
+@Data
+public class SysSubOrderListOnPetVo implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    private Long id;
+
+    private String code;
+
+    private Long service;
+
+    private Long price;
+
+    private Date serviceTime;
+
+    private Integer status;
+
+}

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

@@ -0,0 +1,29 @@
+package org.dromara.order.domain.vo;
+
+import lombok.Data;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.util.Date;
+
+@Data
+public class SysSubOrderListOnStoreVo implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    private Long id;
+
+    private String code;
+
+    private Long service;
+
+    private String customer;
+
+    private Long price;
+
+    private Date createTime;
+
+    private Integer status;
+
+}

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

@@ -0,0 +1,22 @@
+package org.dromara.order.domain.vo;
+
+import lombok.Data;
+
+import java.io.Serial;
+import java.io.Serializable;
+
+@Data
+public class SysSubOrderLogCountVo implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    private Integer total;
+
+    private Integer reject;
+
+    private Integer reward;
+
+    private Integer punish;
+
+}

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

@@ -0,0 +1,59 @@
+package org.dromara.order.domain.vo;
+
+import lombok.Data;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.util.Date;
+
+@Data
+public class SysSubOrderStatisticPageVo implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    private Long id;
+
+    private Long service;
+
+    private Long price;
+
+    private Date serviceTime;
+
+    private Long pet;
+
+    private String petName;
+
+    private Long petAvatar;
+
+    private String petAvatarUrl;
+
+    private String breed;
+
+    private Long store;
+
+    private String storeName;
+
+    private String storeAreaCode;
+
+    private String storeAddress;
+
+    private Long customer;
+
+    private String customerName;
+
+    private String customerPhone;
+
+    private String fromCode;
+
+    private String fromAddress;
+
+    private String toCode;
+
+    private String toAddress;
+
+    private String remark;
+
+    private Integer status;
+
+}

+ 53 - 0
ruoyi-modules/yingpaipay-order/src/main/java/org/dromara/order/dubbo/RemoteSubOrderLogServiceImpl.java

@@ -0,0 +1,53 @@
+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.order.api.RemoteSubOrderLogService;
+import org.dromara.order.api.domain.vo.RemoteSubOrderLogCountVo;
+import org.dromara.order.domain.SysSubOrderLog;
+import org.dromara.order.enums.OrderLogActionerTypeEnum;
+import org.dromara.order.enums.OrderLogFulfillerStepEnum;
+import org.dromara.order.enums.OrderLogTypeEnum;
+import org.dromara.order.mapper.SysSubOrderLogMapper;
+import org.springframework.stereotype.Service;
+
+import java.util.ArrayList;
+import java.util.List;
+
+@DubboService
+@Service
+@RequiredArgsConstructor
+public class RemoteSubOrderLogServiceImpl implements RemoteSubOrderLogService {
+
+    private final SysSubOrderLogMapper baseMapper;
+
+    @Override
+    public RemoteSubOrderLogCountVo getCountByFulfillerId(Long fulfillerId) {
+
+        RemoteSubOrderLogCountVo vo = new RemoteSubOrderLogCountVo();
+        List<Long> total = new ArrayList<>();
+        List<Long> reject = new ArrayList<>();
+
+        baseMapper.selectList(
+                Wrappers.lambdaQuery(SysSubOrderLog.class)
+                    .select(SysSubOrderLog::getSubOrderId, SysSubOrderLog::getStep)
+                    .eq(SysSubOrderLog::getLogType, OrderLogTypeEnum.FULFILLER.getValue())
+                    .eq(SysSubOrderLog::getActionerType, OrderLogActionerTypeEnum.FULFILLER.getValue())
+                    .eq(SysSubOrderLog::getActioner, fulfillerId)
+            )
+            .forEach(e -> {
+                if (!total.contains(e.getSubOrderId())) {
+                    total.add(e.getSubOrderId());
+                }
+                if (!reject.contains(e.getSubOrderId()) && e.getStep().equals(OrderLogFulfillerStepEnum.REJECT.getStep())) {
+                    reject.add(e.getSubOrderId());
+                }
+            });
+
+        vo.setTotal(total.size());
+        vo.setReject(reject.size());
+
+        return vo;
+    }
+}

+ 36 - 0
ruoyi-modules/yingpaipay-order/src/main/java/org/dromara/order/dubbo/RemoteSubOrderServiceImpl.java

@@ -13,6 +13,7 @@ import org.springframework.stereotype.Service;
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
+import java.util.concurrent.atomic.AtomicLong;
 
 @DubboService
 @RequiredArgsConstructor
@@ -173,4 +174,39 @@ public class RemoteSubOrderServiceImpl implements RemoteSubOrderService {
 
         return vos;
     }
+
+    @Override
+    public long balanceOnPending(Long userId) {
+        AtomicLong result = new AtomicLong(0);
+
+        baseMapper.selectList(
+            Wrappers.lambdaQuery(SysSubOrder.class).select(SysSubOrder::getPrice)
+                .eq(SysSubOrder::getFulfiller, userId)
+                .notIn(SysSubOrder::getStatus, List.of(
+                    OrderStatusEnum.PENDING_DISPATCH.getValue(),
+                    OrderStatusEnum.PENDING_ACCEPT.getValue(),
+                    OrderStatusEnum.COMPLETED.getValue(),
+                    OrderStatusEnum.CANCELLED.getValue()))
+        ).forEach(e -> result.addAndGet(e.getPrice()));
+
+        return result.get();
+    }
+
+    @Override
+    public List<RemoteSubOrderVo> selectByCustomerIds(List<Long> customerIds) {
+
+        List<RemoteSubOrderVo> vos = new ArrayList<>();
+
+        baseMapper.selectList(
+            Wrappers.lambdaQuery(SysSubOrder.class).select(SysSubOrder::getId, SysSubOrder::getUsrCustomer)
+                .in(SysSubOrder::getUsrCustomer, customerIds)
+        ).forEach(e -> {
+            RemoteSubOrderVo vo = new RemoteSubOrderVo();
+            vo.setId(e.getId());
+            vo.setCustomer(e.getUsrCustomer());
+            vos.add(vo);
+        });
+
+        return vos;
+    }
 }

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

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

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

@@ -37,4 +37,14 @@ public interface ISysSubOrderService {
     List<SysSubOrderOnDispatchVo> listOnDispatch(Long service, Long site);
 
     boolean reject(SysSubOrderRejectBo bo);
+
+    List<SysSubOrderListOnCustomerVo> listOnCustomer(Long customerId);
+
+    List<SysSubOrderListOnPetVo> listOnPet(Long petId);
+
+    List<SysSubOrderListOnFulfillerVo> listOnFulfiller(Long fulfillerId);
+
+    TableDataInfo<SysSubOrderListOnStoreVo> listOnStore(Long storeId, PageQuery pageQuery);
+
+    TableDataInfo<SysSubOrderStatisticPageVo> listOnStatistic(Integer status, PageQuery pageQuery, Long userId);
 }

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

@@ -4,8 +4,16 @@ import com.baomidou.mybatisplus.core.toolkit.StringUtils;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import lombok.RequiredArgsConstructor;
 import org.apache.dubbo.config.annotation.DubboReference;
+import org.dromara.common.core.utils.DateUtils;
+import org.dromara.fulfiller.api.RemoteLogService;
+import org.dromara.fulfiller.api.domain.vo.RemoteLogVo;
 import org.dromara.order.domain.SysSubOrderLog;
+import org.dromara.order.domain.excel.SysSubOrderLogExcel;
+import org.dromara.order.domain.vo.SysSubOrderLogCountVo;
 import org.dromara.order.domain.vo.SysSubOrderLogVo;
+import org.dromara.order.enums.OrderLogActionerTypeEnum;
+import org.dromara.order.enums.OrderLogFulfillerStepEnum;
+import org.dromara.order.enums.OrderLogTypeEnum;
 import org.dromara.order.mapper.SysSubOrderLogMapper;
 import org.dromara.order.service.ISysSubOrderLogService;
 import org.dromara.resource.api.RemoteFileService;
@@ -22,6 +30,8 @@ public class SysSubOrderLogServiceImpl implements ISysSubOrderLogService {
 
     @DubboReference
     private final RemoteFileService remoteFileService;
+    @DubboReference
+    private final RemoteLogService remoteLogService;
 
     @Override
     public List<SysSubOrderLogVo> list(Long orderId) {
@@ -50,4 +60,64 @@ public class SysSubOrderLogServiceImpl implements ISysSubOrderLogService {
 
         return vos;
     }
+
+    @Override
+    public List<SysSubOrderLogExcel> listLogExcelList(Long orderId) {
+        List<SysSubOrderLogExcel> list = new ArrayList<>();
+        baseMapper.selectList(
+                Wrappers.lambdaQuery(SysSubOrderLog.class).eq(SysSubOrderLog::getSubOrderId, orderId).eq(SysSubOrderLog::getLogType, OrderLogTypeEnum.ORDER.getValue()))
+            .forEach(e -> {
+                SysSubOrderLogExcel excel = new SysSubOrderLogExcel();
+                excel.setTitle(e.getTitle());
+                excel.setContent(e.getContent());
+                excel.setCreateTime(Optional.ofNullable(e.getCreateTime()).map(DateUtils::formatDateTime).orElse("-"));
+                list.add(excel);
+            });
+        return list;
+    }
+
+    @Override
+    public SysSubOrderLogCountVo count(Long userId) {
+
+        SysSubOrderLogCountVo vo = new SysSubOrderLogCountVo();
+        List<Long> total = new ArrayList<>();
+        List<Long> reject = new ArrayList<>();
+        List<Long> reward = new ArrayList<>();
+        List<Long> punish = new ArrayList<>();
+        baseMapper.selectList(
+            Wrappers.lambdaQuery(SysSubOrderLog.class)
+                .eq(SysSubOrderLog::getActionerType, OrderLogActionerTypeEnum.FULFILLER.getValue())
+                .eq(SysSubOrderLog::getActioner, userId)
+        ).forEach(e -> {
+            if (e.getStep().equals(OrderLogFulfillerStepEnum.RECIEVED.getStep())) {
+                if (!total.contains(e.getSubOrderId())) {
+                    total.add(e.getSubOrderId());
+                }
+            }
+            if (e.getStep().equals(OrderLogFulfillerStepEnum.REJECT.getStep())) {
+                if (!reject.contains(e.getSubOrderId())) {
+                    reject.add(e.getSubOrderId());
+                }
+            }
+        });
+        vo.setTotal(total.size());
+        vo.setReject(reject.size());
+
+        remoteLogService.getListByUserId(userId)
+            .forEach(e -> {
+                if (e.getType().equals("add")) {
+                    if (!reward.contains(e.getSubOrderId())) {
+                        reward.add(e.getSubOrderId());
+                    }
+                } else {
+                    if (!punish.contains(e.getSubOrderId())) {
+                        punish.add(e.getSubOrderId());
+                    }
+                }
+            });
+        vo.setReward(reward.size());
+        vo.setPunish(punish.size());
+
+        return vo;
+    }
 }

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

@@ -69,20 +69,25 @@ public class SysSubOrderServiceImpl implements ISysSubOrderService {
     @Override
     public TableDataInfo<SysSubOrderListPageVo> list(SysSubOrderListPageBo bo, PageQuery pageQuery) {
 
-        LambdaQueryWrapper<SysOrder> orderWrapper = Wrappers.lambdaQuery(SysOrder.class);
+        LambdaQueryWrapper<SysSubOrder> orderWrapper = Wrappers.lambdaQuery(SysSubOrder.class);
 
         if (StringUtils.isNotBlank(bo.getContent())) {
             List<String> tenantIds = remoteTenantService.selectTenantIdsByName(bo.getContent());
-            orderWrapper.in(SysOrder::getStore, tenantIds.isEmpty() ? TenantConstants.DEFAULT_TENANT_ID : tenantIds);
+//            orderWrapper.in(SysSubOrder::getStore, tenantIds.isEmpty() ? TenantConstants.DEFAULT_TENANT_ID : tenantIds);
             List<Long> userIds = remoteUserService.selectUserIdsByName(bo.getContent());
-            orderWrapper.in(SysOrder::getOrderPlacer, WrapperUtils.convertIds(userIds));
+//            orderWrapper.in(SysSubOrder::getOrderPlacer, WrapperUtils.convertIds(userIds));
             List<Long> customerIds = remoteCustomerService.selectIdsByName(bo.getContent());
-            orderWrapper.in(SysOrder::getUsrCustomer, WrapperUtils.convertIds(customerIds));
+//            orderWrapper.in(SysSubOrder::getUsrCustomer, WrapperUtils.convertIds(customerIds));
+            orderWrapper.and(w -> w
+                .in(SysSubOrder::getTenantId, tenantIds.isEmpty() ? List.of(TenantConstants.DEFAULT_TENANT_ID) : tenantIds).or()
+                .in(SysSubOrder::getOrderPlacer, WrapperUtils.convertIds(userIds)).or()
+                .in(SysSubOrder::getUsrCustomer, WrapperUtils.convertIds(customerIds))
+            );
         }
 
         Page<SysSubOrder> page = baseMapper.selectPage(
             pageQuery.build(),
-            Wrappers.lambdaQuery(SysSubOrder.class).orderByDesc(SysSubOrder::getId)
+            orderWrapper.orderByDesc(SysSubOrder::getId)
                 .eq(bo.getStatus() != null, SysSubOrder::getStatus, bo.getStatus())
                 .eq(bo.getService() != null, SysSubOrder::getService, bo.getService())
         );
@@ -248,20 +253,26 @@ public class SysSubOrderServiceImpl implements ISysSubOrderService {
     @Override
     public TableDataInfo<SysSubOrderListPageVo> listOnMerchant(SysSubOrderListPageBo bo, PageQuery pageQuery) {
 
-        LambdaQueryWrapper<SysOrder> orderWrapper = Wrappers.lambdaQuery(SysOrder.class);
+        LambdaQueryWrapper<SysSubOrder> orderWrapper = Wrappers.lambdaQuery(SysSubOrder.class);
 
         if (StringUtils.isNotBlank(bo.getContent())) {
             List<Long> storeIds = remoteStoreService.selectIdsByName(bo.getContent());
-            orderWrapper.in(SysOrder::getStore, WrapperUtils.convertIds(storeIds));
+//            orderWrapper.in(SysSubOrder::getStore, WrapperUtils.convertIds(storeIds));
             List<Long> userIds = remoteUserService.selectUserIdsByName(bo.getContent());
-            orderWrapper.in(SysOrder::getOrderPlacer, WrapperUtils.convertIds(userIds));
+//            orderWrapper.in(SysSubOrder::getOrderPlacer, WrapperUtils.convertIds(userIds));
             List<Long> customerIds = remoteCustomerService.selectIdsByName(bo.getContent());
-            orderWrapper.in(SysOrder::getUsrCustomer, WrapperUtils.convertIds(customerIds));
+//            orderWrapper.in(SysSubOrder::getUsrCustomer, WrapperUtils.convertIds(customerIds));
+            orderWrapper.and(w -> w
+                .in(SysSubOrder::getStore, WrapperUtils.convertIds(storeIds)).or()
+                .in(SysSubOrder::getOrderPlacer, WrapperUtils.convertIds(userIds)).or()
+                .in(SysSubOrder::getUsrCustomer, WrapperUtils.convertIds(customerIds))
+            );
+
         }
 
         Page<SysSubOrder> page = baseMapper.selectPage(
             pageQuery.build(),
-            Wrappers.lambdaQuery(SysSubOrder.class).orderByDesc(SysSubOrder::getId)
+            orderWrapper.orderByDesc(SysSubOrder::getId)
                 .eq(bo.getStatus() != null, SysSubOrder::getStatus, bo.getStatus())
                 .eq(bo.getService() != null, SysSubOrder::getService, bo.getService())
         );
@@ -357,10 +368,13 @@ public class SysSubOrderServiceImpl implements ISysSubOrderService {
         });
         remotePetService.getByIds(petIds).forEach(e -> {
             petMap.put(e.getId(), e);
-            avatarIds.add(e.getAvatar());
+            if (e.getAvatar() != null) {
+                avatarIds.add(e.getAvatar());
+            }
         });
         remoteCustomerService.getByIds(customerIds).forEach(e -> customerMap.put(e.getId(), e));
-        remoteFileService.selectByIds(avatarIds).forEach(e -> avatarMap.put(e.getOssId(), e));
+        List<RemoteFile> files = remoteFileService.selectByIds(avatarIds);
+        files.forEach(e -> avatarMap.put(e.getOssId(), e));
 
         return TableDataInfo.build(page.convert(e -> {
             SysSubOrderPendingAcceptPageVo vo = new SysSubOrderPendingAcceptPageVo();
@@ -556,18 +570,18 @@ public class SysSubOrderServiceImpl implements ISysSubOrderService {
             endSysLog.setTenantId(subOrder.getTenantId());
             logs.add(endSysLog);
 
+            // 履约者拿到佣金
+            boolean fulfillerFlag = remoteFulfillerService.settlement(subOrder.getFulfiller(), subOrder.getPrice(), subOrder.getCode(), subOrder.getId());
+            if (!fulfillerFlag) {
+                throw new RuntimeException("履约者新增佣金失败");
+            }
+
         }
         boolean flag = subOrderLogMapper.insertBatch(logs);
         if (!flag) {
             throw new RuntimeException("记录服务进度失败");
         }
 
-        // 履约者拿到佣金
-        boolean fulfillerFlag = remoteFulfillerService.settlement(subOrder.getFulfiller(), subOrder.getPrice(), subOrder.getCode());
-        if (!fulfillerFlag) {
-            throw new RuntimeException("履约者新增佣金失败");
-        }
-
         return true;
     }
 
@@ -601,7 +615,9 @@ public class SysSubOrderServiceImpl implements ISysSubOrderService {
         });
         remotePetService.getByIds(petIds).forEach(e -> {
             petMap.put(e.getId(), e);
-            avatarIds.add(e.getAvatar());
+            if (e.getAvatar() != null) {
+                avatarIds.add(e.getAvatar());
+            }
         });
         remoteCustomerService.getByIds(customerIds).forEach(e -> customerMap.put(e.getId(), e));
         remoteFileService.selectByIds(avatarIds).forEach(e -> avatarMap.put(e.getOssId(), e));
@@ -676,7 +692,7 @@ public class SysSubOrderServiceImpl implements ISysSubOrderService {
         }
 
         // 履约者拿到佣金
-        boolean fulfillerFlag = remoteFulfillerService.settlement(subOrder.getFulfiller(), subOrder.getPrice(), subOrder.getCode());
+        boolean fulfillerFlag = remoteFulfillerService.settlement(subOrder.getFulfiller(), subOrder.getPrice(), subOrder.getCode(), subOrder.getId());
         if (!fulfillerFlag) {
             throw new RuntimeException("履约者新增佣金失败");
         }
@@ -753,4 +769,173 @@ public class SysSubOrderServiceImpl implements ISysSubOrderService {
 
         return true;
     }
+
+    @Override
+    public List<SysSubOrderListOnCustomerVo> listOnCustomer(Long customerId) {
+
+        List<SysSubOrderListOnCustomerVo> vos = new ArrayList<>();
+
+        Map<Long, RemotePetVo> petMap = new HashMap<>();
+        List<SysSubOrder> sysSubOrders = baseMapper.selectList(
+            Wrappers.lambdaQuery(SysSubOrder.class)
+                .eq(SysSubOrder::getUsrCustomer, customerId)
+                .orderByDesc(SysSubOrder::getId)
+        );
+        List<Long> petIds = new ArrayList<>();
+        sysSubOrders.forEach(e -> petIds.add(e.getUsrPet()));
+
+        remotePetService.getByIds(petIds).forEach(e -> petMap.put(e.getId(), e));
+
+        for (SysSubOrder sysSubOrder : sysSubOrders) {
+            SysSubOrderListOnCustomerVo vo = new SysSubOrderListOnCustomerVo();
+            vo.setId(sysSubOrder.getId());
+            vo.setCode(sysSubOrder.getCode());
+            vo.setService(sysSubOrder.getService());
+            vo.setPet(petMap.containsKey(sysSubOrder.getUsrPet()) ? petMap.get(sysSubOrder.getUsrPet()).getName() : "未知");
+            vo.setServiceTime(sysSubOrder.getServiceTime());
+            vo.setStatus(sysSubOrder.getStatus());
+            vos.add(vo);
+        }
+
+        return vos;
+    }
+
+    @Override
+    public List<SysSubOrderListOnPetVo> listOnPet(Long petId) {
+
+        List<SysSubOrderListOnPetVo> vos = new ArrayList<>();
+
+        baseMapper.selectList(
+                Wrappers.lambdaQuery(SysSubOrder.class)
+                    .eq(SysSubOrder::getUsrPet, petId)
+                    .orderByDesc(SysSubOrder::getId)
+            )
+            .forEach(e -> {
+                SysSubOrderListOnPetVo vo = new SysSubOrderListOnPetVo();
+                vo.setId(e.getId());
+                vo.setCode(e.getCode());
+                vo.setService(e.getService());
+                vo.setPrice(e.getPrice());
+                vo.setServiceTime(e.getServiceTime());
+                vo.setStatus(e.getStatus());
+                vos.add(vo);
+            });
+
+        return vos;
+    }
+
+    @Override
+    public List<SysSubOrderListOnFulfillerVo> listOnFulfiller(Long fulfillerId) {
+
+        List<SysSubOrderListOnFulfillerVo> vos = new ArrayList<>();
+
+        baseMapper.selectList(
+                Wrappers.lambdaQuery(SysSubOrder.class)
+                    .eq(SysSubOrder::getFulfiller, fulfillerId)
+                    .orderByDesc(SysSubOrder::getId)
+            )
+            .forEach(e -> {
+                SysSubOrderListOnFulfillerVo vo = new SysSubOrderListOnFulfillerVo();
+                vo.setId(e.getId());
+                vo.setCode(e.getCode());
+                vo.setService(e.getService());
+                vo.setPrice(e.getPrice());
+                vo.setServiceTime(e.getServiceTime());
+                vo.setStatus(e.getStatus());
+                vos.add(vo);
+            });
+
+        return vos;
+    }
+
+    @Override
+    public TableDataInfo<SysSubOrderListOnStoreVo> listOnStore(Long storeId, PageQuery pageQuery) {
+
+        Page<SysSubOrder> page = baseMapper.selectPage(
+            pageQuery.build(),
+            Wrappers.lambdaQuery(SysSubOrder.class)
+                .eq(SysSubOrder::getStore, storeId)
+                .orderByDesc(SysSubOrder::getId)
+        );
+
+        List<Long> customerIds = new ArrayList<>();
+        Map<Long, RemoteCustomerVo> customerMap = new HashMap<>();
+        page.getRecords().forEach(e -> customerIds.add(e.getUsrCustomer()));
+        remoteCustomerService.getByIds(customerIds).forEach(e -> customerMap.put(e.getId(), e));
+
+        return TableDataInfo.build(page.convert(e -> {
+            SysSubOrderListOnStoreVo vo = new SysSubOrderListOnStoreVo();
+            vo.setId(e.getId());
+            vo.setCode(e.getCode());
+            vo.setService(e.getService());
+            vo.setCustomer(customerMap.get(e.getUsrCustomer()).getName());
+            vo.setPrice(e.getPrice());
+            vo.setCreateTime(e.getCreateTime());
+            vo.setStatus(e.getStatus());
+            return vo;
+        }));
+    }
+
+    @Override
+    public TableDataInfo<SysSubOrderStatisticPageVo> listOnStatistic(Integer status, PageQuery pageQuery, Long userId) {
+
+        LambdaQueryWrapper<SysSubOrder> wrapper = Wrappers.lambdaQuery(SysSubOrder.class)
+            .eq(status != null, SysSubOrder::getStatus, status)
+            .eq(SysSubOrder::getFulfiller, userId)
+            .orderByDesc(SysSubOrder::getId);
+
+        Page<SysSubOrder> page = baseMapper.selectPage(pageQuery.build(), wrapper);
+
+        List<Long> petIds = new ArrayList<>();
+        List<Long> customerIds = new ArrayList<>();
+        List<Long> avatarIds = new ArrayList<>();
+        Map<Long, RemotePetVo> petMap = new HashMap<>();
+        Map<Long, RemoteCustomerVo> customerMap = new HashMap<>();
+        Map<Long, RemoteFile> avatarMap = new HashMap<>();
+        page.getRecords().forEach(e -> {
+            petIds.add(e.getUsrPet());
+            customerIds.add(e.getUsrCustomer());
+        });
+        remotePetService.getByIds(petIds).forEach(e -> {
+            petMap.put(e.getId(), e);
+            if (e.getAvatar() != null) {
+                avatarIds.add(e.getAvatar());
+            }
+        });
+        remoteCustomerService.getByIds(customerIds).forEach(e -> customerMap.put(e.getId(), e));
+        remoteFileService.selectByIds(avatarIds).forEach(e -> avatarMap.put(e.getOssId(), e));
+
+        return TableDataInfo.build(page.convert(e -> {
+            SysSubOrderStatisticPageVo vo = new SysSubOrderStatisticPageVo();
+            vo.setId(e.getId());
+            vo.setService(e.getService());
+            vo.setPrice(e.getPrice());
+            vo.setServiceTime(e.getServiceTime());
+            vo.setPet(e.getUsrPet());
+            RemotePetVo pet = petMap.get(e.getUsrPet());
+            if (pet != null) {
+                vo.setPetName(pet.getName());
+                vo.setBreed(pet.getBreed());
+                vo.setPetAvatar(pet.getAvatar());
+                vo.setPetAvatarUrl(avatarMap.containsKey(pet.getAvatar()) ? avatarMap.get(pet.getAvatar()).getUrl() : null);
+            }
+            vo.setStore(e.getStore());
+//            vo.setStoreName();
+//            vo.setStoreAreaCode();
+//            vo.setStoreAddress();
+            vo.setCustomer(e.getUsrCustomer());
+            RemoteCustomerVo customer = customerMap.get(e.getUsrCustomer());
+            if (customer != null) {
+                vo.setCustomerName(customer.getName());
+                vo.setCustomerPhone(customer.getPhone());
+            }
+            vo.setFromCode(e.getFromCode());
+            vo.setFromAddress(e.getFromAddress());
+            vo.setToCode(e.getToCode());
+            vo.setToAddress(e.getToAddress());
+            vo.setRemark(e.getRemark());
+            vo.setStatus(e.getStatus());
+            return vo;
+        }));
+    }
 }

+ 2 - 2
ruoyi-modules/yingpaipay-order/src/main/resources/application.yml

@@ -1,6 +1,6 @@
 # Tomcat
 server:
-  port: 9219
+  port: 10005
 
 # Spring
 spring:
@@ -20,7 +20,7 @@ spring:
       username: @nacos.username@
       password: @nacos.password@
       discovery:
-        ip: @discovery.ip@
+        # ip: @discovery.ip
         # 注册组
         group: @nacos.discovery.group@
         namespace: ${spring.profiles.active}

+ 2 - 2
ruoyi-modules/yingpaipay-service/src/main/resources/application.yml

@@ -1,6 +1,6 @@
 # Tomcat
 server:
-  port: 9218
+  port: 10006
 
 # Spring
 spring:
@@ -20,7 +20,7 @@ spring:
       username: @nacos.username@
       password: @nacos.password@
       discovery:
-        ip: @discovery.ip@
+#        # ip: @discovery.ip
         # 注册组
         group: @nacos.discovery.group@
         namespace: ${spring.profiles.active}

+ 1 - 0
ruoyi-visual/ruoyi-nacos/src/main/resources/application.properties

@@ -46,6 +46,7 @@ db.num=1
 db.url.0=jdbc:mysql://127.0.0.1:3306/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=1234
+# db.password.0=Yr7777777
 
 ### the maximum retry times for push
 nacos.config.push.maxRetryTime=50