Huanyi hai 3 semanas
pai
achega
0fd93948d6
Modificáronse 51 ficheiros con 827 adicións e 73 borrados
  1. 5 0
      ruoyi-api/yingpaipay-api-fulfiller/src/main/java/org/dromara/fulfiller/api/RemoteAuditService.java
  2. 6 0
      ruoyi-api/yingpaipay-api-fulfiller/src/main/java/org/dromara/fulfiller/api/RemoteFulfillerService.java
  3. 5 0
      ruoyi-api/yingpaipay-api-fulfiller/src/main/java/org/dromara/fulfiller/api/domain/vo/RemoteFulfillerVo.java
  4. 3 0
      ruoyi-api/yingpaipay-api-order/src/main/java/org/dromara/order/api/RemoteSubOrderLogService.java
  5. 7 0
      ruoyi-api/yingpaipay-api-order/src/main/java/org/dromara/order/api/RemoteSubOrderService.java
  6. 18 0
      ruoyi-api/yingpaipay-api-order/src/main/java/org/dromara/order/api/domain/vo/RemoteSubOrderLogListVo.java
  7. 10 0
      ruoyi-api/yingpaipay-api-order/src/main/java/org/dromara/order/api/domain/vo/RemoteSubOrderVo.java
  8. 1 1
      ruoyi-api/yingpaipay-api-order/src/main/java/org/dromara/order/api/enums/OrderLogActionerTypeEnum.java
  9. 1 1
      ruoyi-api/yingpaipay-api-order/src/main/java/org/dromara/order/api/enums/OrderLogFulfillerStepEnum.java
  10. 1 1
      ruoyi-api/yingpaipay-api-order/src/main/java/org/dromara/order/api/enums/OrderLogSystemStepEnum.java
  11. 1 1
      ruoyi-api/yingpaipay-api-order/src/main/java/org/dromara/order/api/enums/OrderLogTypeEnum.java
  12. 1 1
      ruoyi-api/yingpaipay-api-order/src/main/java/org/dromara/order/api/enums/OrderStatusEnum.java
  13. 1 1
      ruoyi-api/yingpaipay-api-order/src/main/java/org/dromara/order/api/enums/OrderTypeEnum.java
  14. 6 0
      ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/constant/CacheNames.java
  15. 4 0
      ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/constant/GlobalConstants.java
  16. 4 0
      ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/utils/DateUtils.java
  17. 137 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/AdminIndexController.java
  18. 74 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/MerchantIndexController.java
  19. 36 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysAgreementController.java
  20. 12 12
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysTenantController.java
  21. 37 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysAgreement.java
  22. 2 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysTenantBo.java
  23. 0 1
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysUserBo.java
  24. 30 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/AdminIndexCountVo.java
  25. 22 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/AdminIndexFulfillerRankVo.java
  26. 25 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/AdminIndexStoreRankVo.java
  27. 23 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/AdminIndexSubOrderVo.java
  28. 24 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/MerchantIndexCountVo.java
  29. 27 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/MerchantIndexSubOrderVo.java
  30. 14 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysAgreementMapper.java
  31. 14 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysAgreementService.java
  32. 40 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysAgreementServiceImpl.java
  33. 4 4
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysAreaStationServiceImpl.java
  34. 7 1
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysTenantServiceImpl.java
  35. 11 5
      ruoyi-modules/yingpaipay-archieves/src/main/java/org/dromara/archieves/service/impl/UsrCustomerServiceImpl.java
  36. 7 0
      ruoyi-modules/yingpaipay-fulfiller/src/main/java/org/dromara/fulfiller/controller/FlfAnamalyController.java
  37. 15 6
      ruoyi-modules/yingpaipay-fulfiller/src/main/java/org/dromara/fulfiller/controller/FlfFulfillerController.java
  38. 14 0
      ruoyi-modules/yingpaipay-fulfiller/src/main/java/org/dromara/fulfiller/domain/FlfGps.java
  39. 28 0
      ruoyi-modules/yingpaipay-fulfiller/src/main/java/org/dromara/fulfiller/dubbo/RemoteAuditServiceImpl.java
  40. 27 0
      ruoyi-modules/yingpaipay-fulfiller/src/main/java/org/dromara/fulfiller/dubbo/RemoteFulfillerServiceImpl.java
  41. 2 0
      ruoyi-modules/yingpaipay-fulfiller/src/main/java/org/dromara/fulfiller/service/IFlfAnamalyService.java
  42. 1 1
      ruoyi-modules/yingpaipay-fulfiller/src/main/java/org/dromara/fulfiller/service/IFlfFulfillerService.java
  43. 5 0
      ruoyi-modules/yingpaipay-fulfiller/src/main/java/org/dromara/fulfiller/service/impl/FlfAnamalyServiceImpl.java
  44. 3 3
      ruoyi-modules/yingpaipay-fulfiller/src/main/java/org/dromara/fulfiller/service/impl/FlfFulfillerServiceImpl.java
  45. 20 5
      ruoyi-modules/yingpaipay-order/src/main/java/org/dromara/order/dubbo/RemoteSubOrderLogServiceImpl.java
  46. 58 3
      ruoyi-modules/yingpaipay-order/src/main/java/org/dromara/order/dubbo/RemoteSubOrderServiceImpl.java
  47. 1 1
      ruoyi-modules/yingpaipay-order/src/main/java/org/dromara/order/service/impl/OrderStatusServiceImpl.java
  48. 3 6
      ruoyi-modules/yingpaipay-order/src/main/java/org/dromara/order/service/impl/SysOrderServiceImpl.java
  49. 3 4
      ruoyi-modules/yingpaipay-order/src/main/java/org/dromara/order/service/impl/SysSubOrderLogServiceImpl.java
  50. 12 11
      ruoyi-modules/yingpaipay-order/src/main/java/org/dromara/order/service/impl/SysSubOrderServiceImpl.java
  51. 15 4
      script/sql/business/create.sql

+ 5 - 0
ruoyi-api/yingpaipay-api-fulfiller/src/main/java/org/dromara/fulfiller/api/RemoteAuditService.java

@@ -0,0 +1,5 @@
+package org.dromara.fulfiller.api;
+
+public interface RemoteAuditService {
+    long countUnderReview();
+}

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

@@ -38,4 +38,10 @@ public interface RemoteFulfillerService {
     String getNameById(Long id);
 
     boolean taskLevelPoints();
+
+    RemoteFulfillerVo getById(Long id);
+
+    List<RemoteFulfillerVo> listAll();
+
+    Long count();
 }

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

@@ -4,6 +4,7 @@ import lombok.Data;
 
 import java.io.Serial;
 import java.io.Serializable;
+import java.util.Date;
 
 @Data
 public class RemoteFulfillerVo implements Serializable {
@@ -17,4 +18,8 @@ public class RemoteFulfillerVo implements Serializable {
 
     private String status;
 
+    private Long site;
+
+    private Date createTime;
+
 }

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

@@ -1,6 +1,7 @@
 package org.dromara.order.api;
 
 import org.dromara.order.api.domain.vo.RemoteSubOrderLogCountVo;
+import org.dromara.order.api.domain.vo.RemoteSubOrderLogListVo;
 
 import java.util.List;
 
@@ -10,4 +11,6 @@ public interface RemoteSubOrderLogService {
     int countOnTimeByFulfillerId(Long id);
 
     long countCompletedLastMonthByFulfiller(Long id);
+
+    List<RemoteSubOrderLogListVo> listAllRecieved();
 }

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

@@ -2,6 +2,7 @@ package org.dromara.order.api;
 
 import org.dromara.order.api.domain.vo.RemoteSubOrderVo;
 
+import java.util.Date;
 import java.util.List;
 
 public interface RemoteSubOrderService {
@@ -28,4 +29,10 @@ public interface RemoteSubOrderService {
     String getCodeById(Long id);
 
     long countCompletedThisMonthByFulfiller(Long id);
+
+    List<RemoteSubOrderVo> listAfterDate(Date time);
+
+    List<RemoteSubOrderVo> listAll();
+
+    List<RemoteSubOrderVo> listAfterDateEnableTenant(Date firstDayOfMonth, String tenantId);
 }

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

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

@@ -26,4 +26,14 @@ public class RemoteSubOrderVo implements Serializable {
 
     private Long customer;
 
+    private Long price;
+
+    private Date createTime;
+
+    private Long service;
+
+    private Integer status;
+
+    private Long pet;
+
 }

+ 1 - 1
ruoyi-modules/yingpaipay-order/src/main/java/org/dromara/order/enums/OrderLogActionerTypeEnum.java → ruoyi-api/yingpaipay-api-order/src/main/java/org/dromara/order/api/enums/OrderLogActionerTypeEnum.java

@@ -1,4 +1,4 @@
-package org.dromara.order.enums;
+package org.dromara.order.api.enums;
 
 import lombok.AccessLevel;
 import lombok.AllArgsConstructor;

+ 1 - 1
ruoyi-modules/yingpaipay-order/src/main/java/org/dromara/order/enums/OrderLogFulfillerStepEnum.java → ruoyi-api/yingpaipay-api-order/src/main/java/org/dromara/order/api/enums/OrderLogFulfillerStepEnum.java

@@ -1,4 +1,4 @@
-package org.dromara.order.enums;
+package org.dromara.order.api.enums;
 
 import lombok.AccessLevel;
 import lombok.AllArgsConstructor;

+ 1 - 1
ruoyi-modules/yingpaipay-order/src/main/java/org/dromara/order/enums/OrderLogSystemStepEnum.java → ruoyi-api/yingpaipay-api-order/src/main/java/org/dromara/order/api/enums/OrderLogSystemStepEnum.java

@@ -1,4 +1,4 @@
-package org.dromara.order.enums;
+package org.dromara.order.api.enums;
 
 import lombok.AccessLevel;
 import lombok.AllArgsConstructor;

+ 1 - 1
ruoyi-modules/yingpaipay-order/src/main/java/org/dromara/order/enums/OrderLogTypeEnum.java → ruoyi-api/yingpaipay-api-order/src/main/java/org/dromara/order/api/enums/OrderLogTypeEnum.java

@@ -1,4 +1,4 @@
-package org.dromara.order.enums;
+package org.dromara.order.api.enums;
 
 import lombok.AccessLevel;
 import lombok.AllArgsConstructor;

+ 1 - 1
ruoyi-modules/yingpaipay-order/src/main/java/org/dromara/order/enums/OrderStatusEnum.java → ruoyi-api/yingpaipay-api-order/src/main/java/org/dromara/order/api/enums/OrderStatusEnum.java

@@ -1,4 +1,4 @@
-package org.dromara.order.enums;
+package org.dromara.order.api.enums;
 
 import lombok.AccessLevel;
 import lombok.AllArgsConstructor;

+ 1 - 1
ruoyi-modules/yingpaipay-order/src/main/java/org/dromara/order/enums/OrderTypeEnum.java → ruoyi-api/yingpaipay-api-order/src/main/java/org/dromara/order/api/enums/OrderTypeEnum.java

@@ -1,4 +1,4 @@
-package org.dromara.order.enums;
+package org.dromara.order.api.enums;
 
 import lombok.AccessLevel;
 import lombok.AllArgsConstructor;

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

@@ -145,4 +145,10 @@ public interface CacheNames {
      * @Author: Huanyi
      */
     String SYS_AREA_STATION = "sys_area_station#30d";
+
+    /**
+     * 协议
+     * @Author: Huanyi
+     */
+    String SYS_AGREEMENT = "sys_agreement#30d";
 }

+ 4 - 0
ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/constant/GlobalConstants.java

@@ -32,4 +32,8 @@ public interface GlobalConstants {
      */
     String SOCIAL_AUTH_CODE_KEY = GLOBAL_REDIS_KEY + "social_auth_codes:";
 
+    /**
+     * 履约者 GPS
+     */
+    String FLF_FULFILLER_GPS = GLOBAL_REDIS_KEY + "flf_fulfiller_gps:";
 }

+ 4 - 0
ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/utils/DateUtils.java

@@ -388,4 +388,8 @@ public class DateUtils extends org.apache.commons.lang3.time.DateUtils {
         return Date.from(startOfDay.atZone(ZoneId.systemDefault()).toInstant());
     }
 
+    public static Date getDateDaysAgo(Long days) {
+        ZonedDateTime time = LocalDate.now().minusDays(days).atStartOfDay(ZoneId.systemDefault());
+        return Date.from(time.toInstant());
+    }
 }

+ 137 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/AdminIndexController.java

@@ -0,0 +1,137 @@
+package org.dromara.system.controller;
+
+import lombok.RequiredArgsConstructor;
+import org.apache.dubbo.config.annotation.DubboReference;
+import org.dromara.common.core.domain.R;
+import org.dromara.common.core.utils.DateUtils;
+import org.dromara.common.web.core.BaseController;
+import org.dromara.fulfiller.api.RemoteAuditService;
+import org.dromara.fulfiller.api.RemoteFulfillerService;
+import org.dromara.fulfiller.api.domain.vo.RemoteFulfillerVo;
+import org.dromara.order.api.RemoteSubOrderLogService;
+import org.dromara.order.api.RemoteSubOrderService;
+import org.dromara.order.api.domain.vo.RemoteSubOrderLogListVo;
+import org.dromara.order.api.domain.vo.RemoteSubOrderVo;
+import org.dromara.system.domain.SysStore;
+import org.dromara.system.domain.vo.AdminIndexCountVo;
+import org.dromara.system.domain.vo.AdminIndexFulfillerRankVo;
+import org.dromara.system.domain.vo.AdminIndexStoreRankVo;
+import org.dromara.system.domain.vo.AdminIndexSubOrderVo;
+import org.dromara.system.mapper.SysStoreMapper;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.*;
+import java.util.stream.Collectors;
+
+@Validated
+@RequiredArgsConstructor
+@RestController
+@RequestMapping("/admin/index")
+public class AdminIndexController extends BaseController {
+
+    private final SysStoreMapper sysStoreMapper;
+
+    @DubboReference
+    private final RemoteAuditService remoteAuditService;
+    @DubboReference
+    private final RemoteSubOrderService remoteSubOrderService;
+    @DubboReference
+    private final RemoteSubOrderLogService remoteSubOrderLogService;
+    @DubboReference
+    private final RemoteFulfillerService remoteFulfillerService;
+
+    @GetMapping("/count")
+    public R<AdminIndexCountVo> count() {
+        AdminIndexCountVo vo = new AdminIndexCountVo();
+        vo.setUnderReviewFulfillerCount(remoteAuditService.countUnderReview());
+        List<RemoteSubOrderVo> orders = remoteSubOrderService.listAfterDate(DateUtils.getDateDaysAgo(1L));
+        long priceToday = 0L, priceLastday = 0L;
+        int countToday = 0, countLastday = 0;
+        for (RemoteSubOrderVo order : orders) {
+            if (order.getCreateTime().before(DateUtils.getDateDaysAgo(0L))) {
+                countLastday++;
+                priceLastday += order.getPrice();
+            } else {
+                countToday++;
+                priceToday += order.getPrice();
+            }
+        }
+        vo.setPriceToday(priceToday);
+        vo.setPriceLastday(priceLastday);
+        vo.setOrderCountToday(countToday);
+        vo.setOrderCountLastday(countLastday);
+        vo.setFulfillerCount(remoteFulfillerService.count());
+        List<SysStore> stores = sysStoreMapper.selectList();
+        int newStoreCountThisMonth = 0;
+        for (SysStore store : stores) {
+            if (store.getCreateTime().after(DateUtils.getFirstDayOfMonth())) {
+                newStoreCountThisMonth++;
+            }
+        }
+        vo.setStoreCount(stores.size());
+        vo.setNewStoreCountThisMonth(newStoreCountThisMonth);
+        return R.ok(vo);
+    }
+
+    @GetMapping("/listOrder")
+    public R<List<AdminIndexSubOrderVo>> listOrder(@RequestParam Integer type) {
+        Date time = type == 0 ? DateUtils.getDateDaysAgo(7L) : DateUtils.getFirstDayOfMonth();
+        return R.ok(remoteSubOrderService.listAfterDate(time).stream()
+            .map(e -> {
+                AdminIndexSubOrderVo vo = new AdminIndexSubOrderVo();
+                vo.setId(e.getId());
+                vo.setService(e.getService());
+                vo.setPrice(e.getPrice());
+                vo.setCreateTime(e.getCreateTime());
+                return vo;
+            }).toList());
+    }
+
+    @GetMapping("/fulfillerRank")
+    public R<List<AdminIndexFulfillerRankVo>> fulfillerRank() {
+        Map<Long, List<RemoteSubOrderLogListVo>> map = new HashMap<>();
+        List<RemoteSubOrderLogListVo> list = remoteSubOrderLogService.listAllRecieved();
+        list.forEach(e -> map.computeIfAbsent(e.getFulfiller(), k -> new ArrayList<>()).add(e));
+        return R.ok(map.entrySet().stream()
+            .sorted(Map.Entry.<Long, List<RemoteSubOrderLogListVo>>comparingByValue(
+                Comparator.comparingInt(List::size)
+            ).reversed())
+            .limit(5)
+            .map(entry -> {
+                AdminIndexFulfillerRankVo vo = new AdminIndexFulfillerRankVo();
+                vo.setId(entry.getKey());
+                vo.setCount(entry.getValue().size());
+                RemoteFulfillerVo fulfiller = remoteFulfillerService.getById(entry.getKey());
+                vo.setName(fulfiller.getName());
+                vo.setSite(fulfiller.getSite());
+                return vo;
+            })
+            .collect(Collectors.toList()));
+    }
+
+    @GetMapping("/storeRank")
+    public R<List<AdminIndexStoreRankVo>> storeRank() {
+        List<RemoteSubOrderVo> list = remoteSubOrderService.listAll();
+        Map<Long, List<RemoteSubOrderVo>> map = new HashMap<>();
+        list.forEach(e -> map.computeIfAbsent(e.getStore(), k -> new ArrayList<>()).add(e));
+        return R.ok(map.entrySet().stream()
+            .sorted(Map.Entry.<Long, List<RemoteSubOrderVo>>comparingByValue(
+                Comparator.comparingInt(List::size)
+            ).reversed()).limit(5)
+            .map(entry -> {
+                AdminIndexStoreRankVo vo = new AdminIndexStoreRankVo();
+                vo.setId(entry.getKey());
+                vo.setCount(entry.getValue().size());
+                SysStore store = sysStoreMapper.selectById(entry.getKey());
+                vo.setName(store.getName());
+                vo.setLogo(store.getLogo());
+                return vo;
+            })
+            .collect(Collectors.toList()));
+    }
+
+}

+ 74 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/MerchantIndexController.java

@@ -0,0 +1,74 @@
+package org.dromara.system.controller;
+
+import lombok.RequiredArgsConstructor;
+import org.apache.dubbo.config.annotation.DubboReference;
+import org.dromara.common.core.domain.R;
+import org.dromara.common.core.utils.DateUtils;
+import org.dromara.common.tenant.helper.TenantHelper;
+import org.dromara.common.web.core.BaseController;
+import org.dromara.order.api.RemoteSubOrderService;
+import org.dromara.order.api.domain.vo.RemoteSubOrderVo;
+import org.dromara.order.api.enums.OrderStatusEnum;
+import org.dromara.system.domain.vo.MerchantIndexCountVo;
+import org.dromara.system.domain.vo.MerchantIndexSubOrderVo;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.List;
+
+@Validated
+@RequiredArgsConstructor
+@RestController
+@RequestMapping("/merchant/index")
+public class MerchantIndexController extends BaseController {
+
+    @DubboReference
+    private final RemoteSubOrderService remoteSubOrderService;
+
+    @GetMapping("/count")
+    public R<MerchantIndexCountVo> count() {
+        MerchantIndexCountVo vo = new MerchantIndexCountVo();
+
+        List<RemoteSubOrderVo> orders = remoteSubOrderService.listAfterDateEnableTenant(DateUtils.getFirstDayOfMonth(), TenantHelper.getTenantId());
+
+        int orderCountToday = 0, orderCompletedThisMonth = 0, pendingDispatchCount = 0;
+
+        for (RemoteSubOrderVo order : orders) {
+            if (order.getCreateTime().after(DateUtils.getDateDaysAgo(0L))) {
+                orderCountToday++;
+            }
+            if (order.getStatus().equals(OrderStatusEnum.COMPLETED.getValue())) {
+                orderCompletedThisMonth++;
+            }
+            if (order.getStatus().equals(OrderStatusEnum.PENDING_ACCEPT.getValue())) {
+                pendingDispatchCount++;
+            }
+        }
+
+        vo.setOrderCountToday(orderCountToday);
+        vo.setCostToday(0L);
+        vo.setCostLastday(0L);
+        vo.setOrderCompletedThisMonth(orderCompletedThisMonth);
+        vo.setPendingDispatchCount(pendingDispatchCount);
+
+        return R.ok(vo);
+    }
+
+    @GetMapping("/listOrder")
+    public R<List<MerchantIndexSubOrderVo>> listOrder() {
+        List<RemoteSubOrderVo> orders = remoteSubOrderService.listAfterDateEnableTenant(DateUtils.getDateDaysAgo(7L), TenantHelper.getTenantId());
+        return R.ok(orders.stream().map(e -> {
+            MerchantIndexSubOrderVo vo = new MerchantIndexSubOrderVo();
+            vo.setId(e.getId());
+            vo.setCode(e.getCode());
+            vo.setService(e.getService());
+            vo.setServiceTime(e.getServiceTime());
+            vo.setStatus(e.getStatus());
+            vo.setCreateTime(e.getCreateTime());
+            return vo;
+        }).toList());
+    }
+
+}

+ 36 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysAgreementController.java

@@ -0,0 +1,36 @@
+package org.dromara.system.controller.system;
+
+import lombok.RequiredArgsConstructor;
+import org.dromara.common.core.domain.R;
+import org.dromara.common.web.core.BaseController;
+import org.dromara.system.domain.SysAgreement;
+import org.dromara.system.service.ISysAgreementService;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+
+@Validated
+@RequiredArgsConstructor
+@RestController
+@RequestMapping("/agreement")
+public class SysAgreementController extends BaseController {
+
+    private final ISysAgreementService agreementService;
+
+    @GetMapping("/listAll")
+    public R<List<SysAgreement>> listAll() {
+        return R.ok(agreementService.listAll());
+    }
+
+    @GetMapping("/{id}")
+    public R<SysAgreement> getInfo(@PathVariable Long id) {
+        return R.ok(agreementService.getById(id));
+    }
+
+    @PutMapping("/edit")
+    public R<Void> edit(@Validated @RequestBody SysAgreement agreement) {
+        return toAjax(agreementService.updateById(agreement) != null);
+    }
+
+}

+ 12 - 12
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysTenantController.java

@@ -50,7 +50,7 @@ public class SysTenantController extends BaseController {
     /**
      * 查询租户列表
      */
-    @SaCheckRole(TenantConstants.SUPER_ADMIN_ROLE_KEY)
+//    @SaCheckRole(TenantConstants.SUPER_ADMIN_ROLE_KEY)
     //@SaCheckPermission("system:tenant:list")
     @GetMapping("/list")
     public TableDataInfo<SysTenantVo> list(SysTenantBo bo, PageQuery pageQuery) {
@@ -60,7 +60,7 @@ public class SysTenantController extends BaseController {
     /**
      * 导出租户列表
      */
-    @SaCheckRole(TenantConstants.SUPER_ADMIN_ROLE_KEY)
+//    @SaCheckRole(TenantConstants.SUPER_ADMIN_ROLE_KEY)
     //@SaCheckPermission("system:tenant:export")
     @Log(title = "租户管理", businessType = BusinessType.EXPORT)
     @PostMapping("/export")
@@ -74,7 +74,7 @@ public class SysTenantController extends BaseController {
      *
      * @param id 主键
      */
-    @SaCheckRole(TenantConstants.SUPER_ADMIN_ROLE_KEY)
+//    @SaCheckRole(TenantConstants.SUPER_ADMIN_ROLE_KEY)
     //@SaCheckPermission("system:tenant:query")
     @GetMapping("/{id}")
     public R<SysTenantVo> getInfo(@NotNull(message = "主键不能为空")
@@ -86,7 +86,7 @@ public class SysTenantController extends BaseController {
      * 新增租户
      */
     @ApiEncrypt
-    @SaCheckRole(TenantConstants.SUPER_ADMIN_ROLE_KEY)
+//    @SaCheckRole(TenantConstants.SUPER_ADMIN_ROLE_KEY)
     //@SaCheckPermission("system:tenant:add")
     @Log(title = "租户管理", businessType = BusinessType.INSERT)
     @Lock4j
@@ -102,7 +102,7 @@ public class SysTenantController extends BaseController {
     /**
      * 修改租户
      */
-    @SaCheckRole(TenantConstants.SUPER_ADMIN_ROLE_KEY)
+//    @SaCheckRole(TenantConstants.SUPER_ADMIN_ROLE_KEY)
     //@SaCheckPermission("system:tenant:edit")
     @Log(title = "租户管理", businessType = BusinessType.UPDATE)
     @RepeatSubmit()
@@ -118,7 +118,7 @@ public class SysTenantController extends BaseController {
     /**
      * 状态修改
      */
-    @SaCheckRole(TenantConstants.SUPER_ADMIN_ROLE_KEY)
+//    @SaCheckRole(TenantConstants.SUPER_ADMIN_ROLE_KEY)
     //@SaCheckPermission("system:tenant:edit")
     @Log(title = "租户管理", businessType = BusinessType.UPDATE)
     @RepeatSubmit()
@@ -133,7 +133,7 @@ public class SysTenantController extends BaseController {
      *
      * @param ids 主键串
      */
-    @SaCheckRole(TenantConstants.SUPER_ADMIN_ROLE_KEY)
+//    @SaCheckRole(TenantConstants.SUPER_ADMIN_ROLE_KEY)
     //@SaCheckPermission("system:tenant:remove")
     @Log(title = "租户管理", businessType = BusinessType.DELETE)
     @DeleteMapping("/{ids}")
@@ -147,7 +147,7 @@ public class SysTenantController extends BaseController {
      *
      * @param tenantId 租户ID
      */
-    @SaCheckRole(TenantConstants.SUPER_ADMIN_ROLE_KEY)
+//    @SaCheckRole(TenantConstants.SUPER_ADMIN_ROLE_KEY)
     @GetMapping("/dynamic/{tenantId}")
     public R<Void> dynamicTenant(@NotBlank(message = "租户ID不能为空") @PathVariable String tenantId) {
         TenantHelper.setDynamic(tenantId, true);
@@ -157,7 +157,7 @@ public class SysTenantController extends BaseController {
     /**
      * 清除动态租户
      */
-    @SaCheckRole(TenantConstants.SUPER_ADMIN_ROLE_KEY)
+//    @SaCheckRole(TenantConstants.SUPER_ADMIN_ROLE_KEY)
     @GetMapping("/dynamic/clear")
     public R<Void> dynamicClear() {
         TenantHelper.clearDynamic();
@@ -171,7 +171,7 @@ public class SysTenantController extends BaseController {
      * @param tenantId  租户id
      * @param packageId 套餐id
      */
-    @SaCheckRole(TenantConstants.SUPER_ADMIN_ROLE_KEY)
+//    @SaCheckRole(TenantConstants.SUPER_ADMIN_ROLE_KEY)
     //@SaCheckPermission("system:tenant:edit")
     @Log(title = "租户管理", businessType = BusinessType.UPDATE)
     @Lock4j
@@ -184,7 +184,7 @@ public class SysTenantController extends BaseController {
     /**
      * 同步租户字典
      */
-    @SaCheckRole(TenantConstants.SUPER_ADMIN_ROLE_KEY)
+//    @SaCheckRole(TenantConstants.SUPER_ADMIN_ROLE_KEY)
     @Log(title = "租户管理", businessType = BusinessType.INSERT)
     @Lock4j
     @GetMapping("/syncTenantDict")
@@ -199,7 +199,7 @@ public class SysTenantController extends BaseController {
     /**
      * 同步租户参数配置
      */
-    @SaCheckRole(TenantConstants.SUPER_ADMIN_ROLE_KEY)
+//    @SaCheckRole(TenantConstants.SUPER_ADMIN_ROLE_KEY)
     @Log(title = "租户管理", businessType = BusinessType.INSERT)
     @Lock4j
     @GetMapping("/syncTenantConfig")

+ 37 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysAgreement.java

@@ -0,0 +1,37 @@
+package org.dromara.system.domain;
+
+import org.dromara.common.mybatis.core.domain.BaseEntity;
+import com.baomidou.mybatisplus.annotation.*;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.io.Serial;
+
+/**
+ * 等级配置信息对象 sys_agreement
+ *
+ * @author Huanyi
+ * @date 2026-03-20
+ */
+@Data
+@TableName("sys_agreement")
+public class SysAgreement {
+
+    /**
+     * 序号
+     */
+    @TableId(value = "id")
+    private Long id;
+
+    /**
+     * 标题
+     */
+    private String title;
+
+    /**
+     * 内容
+     */
+    private String content;
+
+
+}

+ 2 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysTenantBo.java

@@ -116,4 +116,6 @@ public class SysTenantBo extends BaseEntity {
      */
     private Long logo;
 
+    private String content;
+
 }

+ 0 - 1
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysUserBo.java

@@ -133,7 +133,6 @@ public class SysUserBo extends BaseEntity {
      * 区域站点组
      * @Author: Huanyi
      */
-    @Size(min = 1, message = "必须设置站点")
     private Long[] areaStations;
 
     public SysUserBo(Long userId) {

+ 30 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/AdminIndexCountVo.java

@@ -0,0 +1,30 @@
+package org.dromara.system.domain.vo;
+
+import lombok.Data;
+
+import java.io.Serial;
+import java.io.Serializable;
+
+@Data
+public class AdminIndexCountVo implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    private Long underReviewFulfillerCount;
+
+    private Long priceToday;
+
+    private Long priceLastday;
+
+    private Integer orderCountToday;
+
+    private Integer orderCountLastday;
+
+    private Long fulfillerCount;
+
+    private Integer storeCount;
+
+    private Integer newStoreCountThisMonth;
+
+}

+ 22 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/AdminIndexFulfillerRankVo.java

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

+ 25 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/AdminIndexStoreRankVo.java

@@ -0,0 +1,25 @@
+package org.dromara.system.domain.vo;
+
+import lombok.Data;
+import org.dromara.common.translation.annotation.Translation;
+import org.dromara.common.translation.constant.TransConstant;
+
+import java.io.Serial;
+import java.io.Serializable;
+
+@Data
+public class AdminIndexStoreRankVo implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    private Long id;
+
+    private String name;
+
+    private Integer count;
+
+    @Translation(type = TransConstant.OSS_ID_TO_URL, mapper = "logo")
+    private Long logo;
+
+}

+ 23 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/AdminIndexSubOrderVo.java

@@ -0,0 +1,23 @@
+package org.dromara.system.domain.vo;
+
+import lombok.Data;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.util.Date;
+
+@Data
+public class AdminIndexSubOrderVo implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    private Long id;
+
+    private Long service;
+
+    private Long price;
+
+    private Date createTime;
+
+}

+ 24 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/MerchantIndexCountVo.java

@@ -0,0 +1,24 @@
+package org.dromara.system.domain.vo;
+
+import lombok.Data;
+
+import java.io.Serial;
+import java.io.Serializable;
+
+@Data
+public class MerchantIndexCountVo implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    private Integer orderCountToday;
+
+    private Long costToday;
+
+    private Long costLastday;
+
+    private Integer orderCompletedThisMonth;
+
+    private Integer pendingDispatchCount;
+
+}

+ 27 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/MerchantIndexSubOrderVo.java

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

+ 14 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysAgreementMapper.java

@@ -0,0 +1,14 @@
+package org.dromara.system.mapper;
+
+import org.dromara.system.domain.SysAgreement;
+import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
+
+/**
+ * 等级配置信息Mapper接口
+ *
+ * @author Huanyi
+ * @date 2026-03-20
+ */
+public interface SysAgreementMapper extends BaseMapperPlus<SysAgreement, SysAgreement> {
+
+}

+ 14 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysAgreementService.java

@@ -0,0 +1,14 @@
+package org.dromara.system.service;
+
+import org.dromara.system.domain.SysAgreement;
+
+import java.util.List;
+
+public interface ISysAgreementService {
+
+    List<SysAgreement> listAll();
+
+    SysAgreement getById(Long id);
+
+    SysAgreement updateById(SysAgreement agreement);
+}

+ 40 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysAgreementServiceImpl.java

@@ -0,0 +1,40 @@
+package org.dromara.system.service.impl;
+
+import lombok.RequiredArgsConstructor;
+import org.dromara.common.core.constant.CacheNames;
+import org.dromara.system.domain.SysAgreement;
+import org.dromara.system.mapper.SysAgreementMapper;
+import org.dromara.system.service.ISysAgreementService;
+import org.springframework.cache.annotation.CachePut;
+import org.springframework.cache.annotation.Cacheable;
+import org.springframework.stereotype.Service;
+
+import java.nio.charset.StandardCharsets;
+import java.util.Base64;
+import java.util.List;
+
+@Service
+@RequiredArgsConstructor
+public class SysAgreementServiceImpl implements ISysAgreementService {
+
+    private final SysAgreementMapper baseMapper;
+
+    @Override
+    public List<SysAgreement> listAll() {
+        return baseMapper.selectList();
+    }
+
+    @Cacheable(cacheNames = CacheNames.SYS_AGREEMENT, key = "#id")
+    @Override
+    public SysAgreement getById(Long id) {
+        return baseMapper.selectById(id);
+    }
+
+    @CachePut(cacheNames = CacheNames.SYS_AGREEMENT, key = "#agreement.id")
+    @Override
+    public SysAgreement updateById(SysAgreement agreement) {
+        agreement.setContent(new String(Base64.getDecoder().decode(agreement.getContent()), StandardCharsets.UTF_8));
+        return baseMapper.selectById(agreement.getId());
+    }
+
+}

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

@@ -57,7 +57,7 @@ public class SysAreaStationServiceImpl implements ISysAreaStationService {
      * @param bo 查询条件
      * @return 区域站点列表
      */
-    @Cacheable(cacheNames = CacheNames.SYS_AREA_STATION)
+    @Cacheable(cacheNames = CacheNames.SYS_AREA_STATION, key = "'all'")
     @Override
     public List<SysAreaStationVo> queryList(SysAreaStationBo bo) {
         LambdaQueryWrapper<SysAreaStation> lqw = buildQueryWrapper(bo);
@@ -77,7 +77,7 @@ public class SysAreaStationServiceImpl implements ISysAreaStationService {
      * @param bo 区域站点
      * @return 是否新增成功
      */
-    @CacheEvict(cacheNames = CacheNames.SYS_AREA_STATION)
+    @CacheEvict(cacheNames = CacheNames.SYS_AREA_STATION, key = "'all'")
     @Override
     public Boolean insertByBo(SysAreaStationBo bo) {
         SysAreaStation add = MapstructUtils.convert(bo, SysAreaStation.class);
@@ -96,7 +96,7 @@ public class SysAreaStationServiceImpl implements ISysAreaStationService {
      * @param bo 区域站点
      * @return 是否修改成功
      */
-    @CacheEvict(cacheNames = CacheNames.SYS_AREA_STATION)
+    @CacheEvict(cacheNames = CacheNames.SYS_AREA_STATION, key = "'all'")
     @Override
     public Boolean updateByBo(SysAreaStationBo bo) {
         SysAreaStation update = MapstructUtils.convert(bo, SysAreaStation.class);
@@ -119,7 +119,7 @@ public class SysAreaStationServiceImpl implements ISysAreaStationService {
      * @param isValid 是否进行有效性校验
      * @return 是否删除成功
      */
-    @CacheEvict(cacheNames = CacheNames.SYS_AREA_STATION)
+    @CacheEvict(cacheNames = CacheNames.SYS_AREA_STATION, key = "'all'")
     @Override
     public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
         if(isValid){

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

@@ -112,7 +112,7 @@ public class SysTenantServiceImpl implements ISysTenantService {
         lqw.eq(StringUtils.isNotBlank(bo.getContactPhone()), SysTenant::getContactPhone, bo.getContactPhone());
         lqw.like(StringUtils.isNotBlank(bo.getCompanyName()), SysTenant::getCompanyName, bo.getCompanyName());
         lqw.eq(StringUtils.isNotBlank(bo.getLicenseNumber()), SysTenant::getLicenseNumber, bo.getLicenseNumber());
-        lqw.eq(StringUtils.isNotBlank(bo.getAddress()), SysTenant::getAddress, bo.getAddress());
+        lqw.like(StringUtils.isNotBlank(bo.getAddress()), SysTenant::getAddress, bo.getAddress());
         lqw.eq(StringUtils.isNotBlank(bo.getIntro()), SysTenant::getIntro, bo.getIntro());
         lqw.like(StringUtils.isNotBlank(bo.getDomain()), SysTenant::getDomain, bo.getDomain());
         lqw.eq(bo.getPackageId() != null, SysTenant::getPackageId, bo.getPackageId());
@@ -121,6 +121,12 @@ public class SysTenantServiceImpl implements ISysTenantService {
         lqw.eq(StringUtils.isNotBlank(bo.getStatus()), SysTenant::getStatus, bo.getStatus());
         lqw.orderByAsc(SysTenant::getId);
 
+        lqw.and(StringUtils.isNotBlank(bo.getContent()), w -> w
+            .like(SysTenant::getCompanyName, bo.getContent())
+            .or()
+            .like(SysTenant::getContactUserName, bo.getContent())
+        );
+
         // 总控中心不属于商户 @author: Huanyi
         lqw.ne(SysTenant::getTenantId, TenantConstants.DEFAULT_TENANT_ID);
         return lqw;

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

@@ -88,11 +88,17 @@ public class UsrCustomerServiceImpl implements IUsrCustomerService {
                 UsrPet::getUserId,
                 Collectors.summingInt(e -> 1)
             ));
-        Map<Long, Integer> orderMap = remoteSubOrderService.selectByCustomerIds(WrapperUtils.convertIds(customerIds)).stream()
-            .collect(Collectors.groupingBy(
-                RemoteSubOrderVo::getCustomer,
-                Collectors.summingInt(e -> 1)
-            ));
+        List<RemoteSubOrderVo> vos = remoteSubOrderService.selectByCustomerIds(WrapperUtils.convertIds(customerIds));
+        Map<Long, Integer> orderMap;
+        if (!vos.isEmpty()) {
+            orderMap = vos.stream()
+                .collect(Collectors.groupingBy(
+                    RemoteSubOrderVo::getCustomer,
+                    Collectors.summingInt(e -> 1)
+                ));
+        } else {
+            orderMap = new HashMap<>();
+        }
         return TableDataInfo.build(result.convert(vo -> {
             vo.setPetCount(petMap.getOrDefault(vo.getId(), 0));
             vo.setOrderCount(orderMap.getOrDefault(vo.getId(), 0));

+ 7 - 0
ruoyi-modules/yingpaipay-fulfiller/src/main/java/org/dromara/fulfiller/controller/FlfAnamalyController.java

@@ -2,6 +2,7 @@ package org.dromara.fulfiller.controller;
 
 import lombok.RequiredArgsConstructor;
 import org.dromara.common.core.domain.R;
+import org.dromara.common.idempotent.annotation.RepeatSubmit;
 import org.dromara.common.mybatis.core.page.PageQuery;
 import org.dromara.common.mybatis.core.page.TableDataInfo;
 import org.dromara.common.web.core.BaseController;
@@ -27,16 +28,22 @@ public class FlfAnamalyController extends BaseController {
         return flfAnamalyService.list(bo, pageQuery);
     }
 
+    @RepeatSubmit()
     @PostMapping("/add")
     public R<Void> add(@Validated @RequestBody FlfAnamalyAddBo bo) {
         return toAjax(flfAnamalyService.insertByBo(bo));
     }
 
+    @RepeatSubmit()
     @PutMapping("/audit")
     public R<Void> audit(@RequestBody FlfAnamalyAuditBo bo) {
         return toAjax(flfAnamalyService.audit(bo));
     }
 
+    @DeleteMapping("/remove")
+    public R<Void> remove(@RequestParam Long id) {
+        return toAjax(flfAnamalyService.delete(id));
+    }
 
     @PostMapping("/upload")
     public R<Void> upload(@RequestBody FlfAnamalyUploadBo bo) {

+ 15 - 6
ruoyi-modules/yingpaipay-fulfiller/src/main/java/org/dromara/fulfiller/controller/FlfFulfillerController.java

@@ -1,12 +1,17 @@
 package org.dromara.fulfiller.controller;
 
+import java.time.Duration;
 import java.util.List;
 import java.util.Map;
 
 import lombok.RequiredArgsConstructor;
 import jakarta.servlet.http.HttpServletResponse;
 import jakarta.validation.constraints.*;
-import cn.dev33.satoken.annotation.SaCheckPermission;
+import lombok.extern.slf4j.Slf4j;
+import org.dromara.common.core.constant.GlobalConstants;
+import org.dromara.common.redis.utils.RedisUtils;
+import org.dromara.fulfiller.domain.FlfGps;
+import org.dromara.fulfiller.domain.bo.*;
 import org.dromara.fulfiller.domain.vo.FlfFulfillerOnOrderVo;
 import org.dromara.fulfiller.domain.vo.FlfFulfilllerListByNameAndPhoneNumberVo;
 import org.springframework.web.bind.annotation.*;
@@ -25,10 +30,6 @@ import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import org.dromara.fulfiller.domain.FlfAudit;
 import org.dromara.fulfiller.domain.vo.FlfFulfillerVo;
 import org.dromara.fulfiller.mapper.FlfAuditMapper;
-import org.dromara.fulfiller.domain.bo.FlfFulfillerBo;
-import org.dromara.fulfiller.domain.bo.FlfRewardBo;
-import org.dromara.fulfiller.domain.bo.FlfAdjustPointsBo;
-import org.dromara.fulfiller.domain.bo.FlfAdjustBalanceBo;
 import org.dromara.fulfiller.service.IFlfFulfillerService;
 import org.dromara.common.mybatis.core.page.TableDataInfo;
 
@@ -43,6 +44,7 @@ import org.dromara.common.mybatis.core.page.TableDataInfo;
 @RequiredArgsConstructor
 @RestController
 @RequestMapping("/fulfiller")
+@Slf4j
 public class FlfFulfillerController extends BaseController {
 
     private final IFlfFulfillerService fulfillerService;
@@ -98,7 +100,7 @@ public class FlfFulfillerController extends BaseController {
     @PutMapping("/my/city")
     public R<Void> updateMyCity(@RequestBody Map<String, String> params) {
         Long userId = LoginHelper.getUserId();
-        return toAjax(fulfillerService.updateCityByUserId(userId, params.get("cityCode"), params.get("cityName")));
+        return toAjax(fulfillerService.updateCityByUserId(userId, params.get("stationId")));
     }
 
     /**
@@ -292,4 +294,11 @@ public class FlfFulfillerController extends BaseController {
         return fulfillerService.listByNameAndPhoneNumber(content, pageQuery);
     }
 
+    @PostMapping("/gps")
+    public R<Void> gps(@RequestBody FlfGps gps) {
+        log.info("履约者ID: {}; 经度: {}; 维度: {}", LoginHelper.getUserId(), gps.getLongitude(), gps.getLatitude());
+        RedisUtils.setCacheObject(GlobalConstants.FLF_FULFILLER_GPS + LoginHelper.getUserId(), gps, Duration.ofMinutes(30L));
+        return R.ok();
+    }
+
 }

+ 14 - 0
ruoyi-modules/yingpaipay-fulfiller/src/main/java/org/dromara/fulfiller/domain/FlfGps.java

@@ -0,0 +1,14 @@
+package org.dromara.fulfiller.domain;
+
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+@Data
+public class FlfGps {
+
+    private BigDecimal longitude;
+
+    private BigDecimal latitude;
+
+}

+ 28 - 0
ruoyi-modules/yingpaipay-fulfiller/src/main/java/org/dromara/fulfiller/dubbo/RemoteAuditServiceImpl.java

@@ -0,0 +1,28 @@
+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.RemoteAuditService;
+import org.dromara.fulfiller.domain.FlfAudit;
+import org.dromara.fulfiller.enums.AuditStatusEnum;
+import org.dromara.fulfiller.mapper.FlfAuditMapper;
+import org.springframework.stereotype.Service;
+
+@Slf4j
+@RequiredArgsConstructor
+@Service
+@DubboService
+public class RemoteAuditServiceImpl implements RemoteAuditService {
+
+    private final FlfAuditMapper baseMapper;
+
+    @Override
+    public long countUnderReview() {
+        return baseMapper.selectCount(
+            Wrappers.lambdaQuery(FlfAudit.class)
+                .eq(FlfAudit::getStatus, AuditStatusEnum.UNDER_REVIEW.getValue())
+        );
+    }
+}

+ 27 - 0
ruoyi-modules/yingpaipay-fulfiller/src/main/java/org/dromara/fulfiller/dubbo/RemoteFulfillerServiceImpl.java

@@ -260,6 +260,33 @@ public class RemoteFulfillerServiceImpl implements RemoteFulfillerService {
         return fulfillerMapper.updateBatchById(fulfillers);
     }
 
+    @Override
+    public RemoteFulfillerVo getById(Long id) {
+        FlfFulfiller fulfiller = fulfillerMapper.selectById(id);
+        RemoteFulfillerVo vo = new RemoteFulfillerVo();
+        vo.setId(fulfiller.getId());
+        vo.setName(fulfiller.getName());
+        vo.setStatus(fulfiller.getStatus());
+        vo.setSite(fulfiller.getStationId());
+        return vo;
+    }
+
+    @Override
+    public List<RemoteFulfillerVo> listAll() {
+        return fulfillerMapper.selectList()
+            .stream().map(e -> {
+                RemoteFulfillerVo vo = new RemoteFulfillerVo();
+                vo.setId(e.getId());
+                vo.setCreateTime(e.getCreateTime());
+                return vo;
+            }).toList();
+    }
+
+    @Override
+    public Long count() {
+        return fulfillerMapper.selectCount(Wrappers.lambdaQuery(FlfFulfiller.class));
+    }
+
     /**
      * 手动转换 FlfFulfiller → FulfillerLoginUser(避免跨模块 MapStruct 转换器缺失)
      */

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

@@ -18,4 +18,6 @@ public interface IFlfAnamalyService {
     boolean upload(FlfAnamalyUploadBo bo);
 
     List<FlfAnamalyOnOrderVo> getByOrderId(Long orderId);
+
+    boolean delete(Long id);
 }

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

@@ -102,7 +102,7 @@ public interface IFlfFulfillerService {
      * 修改工作城市(App端)
      * @author steelwei
      */
-    Boolean updateCityByUserId(Long userId, String cityCode, String cityName);
+    Boolean updateCityByUserId(Long userId, String cityCode);
 
     /**
      * 修改手机号(App端)

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

@@ -231,4 +231,9 @@ public class FlfAnamalyServiceImpl implements IFlfAnamalyService {
 
         return vos;
     }
+
+    @Override
+    public boolean delete(Long id) {
+        return baseMapper.deleteById(id) > 0;
+    }
 }

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

@@ -474,14 +474,14 @@ public class FlfFulfillerServiceImpl implements IFlfFulfillerService {
     }
 
     @Override
-    public Boolean updateCityByUserId(Long userId, String cityCode, String cityName) {
+    public Boolean updateCityByUserId(Long userId, String cityCode) {
         // userId 现在是 flf_fulfiller.id @author steelwei
         FlfFulfiller fulfiller = baseMapper.selectById(userId);
         if (fulfiller == null) {
             return false;
         }
-        fulfiller.setCityCode(cityCode);
-        fulfiller.setCityName(cityName);
+        fulfiller.setStationId(Long.valueOf(cityCode));
+//        fulfiller.setCityName(cityName);
         return baseMapper.updateById(fulfiller) > 0;
     }
 

+ 20 - 5
ruoyi-modules/yingpaipay-order/src/main/java/org/dromara/order/dubbo/RemoteSubOrderLogServiceImpl.java

@@ -6,15 +6,15 @@ import org.apache.dubbo.config.annotation.DubboService;
 import org.dromara.common.core.utils.DateUtils;
 import org.dromara.order.api.RemoteSubOrderLogService;
 import org.dromara.order.api.domain.vo.RemoteSubOrderLogCountVo;
+import org.dromara.order.api.domain.vo.RemoteSubOrderLogListVo;
 import org.dromara.order.domain.SysSubOrder;
 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.enums.OrderStatusEnum;
+import org.dromara.order.api.enums.OrderLogActionerTypeEnum;
+import org.dromara.order.api.enums.OrderLogFulfillerStepEnum;
+import org.dromara.order.api.enums.OrderLogTypeEnum;
+import org.dromara.order.api.enums.OrderStatusEnum;
 import org.dromara.order.mapper.SysSubOrderLogMapper;
 import org.dromara.order.mapper.SysSubOrderMapper;
-import org.springframework.core.annotation.Order;
 import org.springframework.stereotype.Service;
 
 import java.util.*;
@@ -114,4 +114,19 @@ public class RemoteSubOrderLogServiceImpl implements RemoteSubOrderLogService {
 //                .ge(SysSubOrderLog::getCreateTime, DateUtils.getFirstDayOfMonth())
 //        );
     }
+
+    @Override
+    public List<RemoteSubOrderLogListVo> listAllRecieved() {
+        return baseMapper.selectList(
+                Wrappers.lambdaQuery(SysSubOrderLog.class)
+                    .eq(SysSubOrderLog::getActionerType, OrderLogActionerTypeEnum.FULFILLER.getValue())
+                    .eq(SysSubOrderLog::getStep, OrderLogFulfillerStepEnum.RECIEVED.getStep())
+            )
+            .stream().map(e -> {
+                RemoteSubOrderLogListVo vo = new RemoteSubOrderLogListVo();
+                vo.setId(e.getId());
+                vo.setFulfiller(e.getActioner());
+                return vo;
+            }).toList();
+    }
 }

+ 58 - 3
ruoyi-modules/yingpaipay-order/src/main/java/org/dromara/order/dubbo/RemoteSubOrderServiceImpl.java

@@ -7,15 +7,15 @@ import org.dromara.common.core.constant.CacheNames;
 import org.dromara.common.core.utils.DateUtils;
 import org.dromara.order.api.RemoteSubOrderService;
 import org.dromara.order.api.domain.vo.RemoteSubOrderVo;
-import org.dromara.order.domain.SysOrder;
 import org.dromara.order.domain.SysSubOrder;
-import org.dromara.order.enums.OrderStatusEnum;
+import org.dromara.order.api.enums.OrderStatusEnum;
 import org.dromara.order.mapper.SysSubOrderMapper;
 import org.springframework.cache.annotation.Cacheable;
 import org.springframework.stereotype.Service;
 
 import java.util.ArrayList;
 import java.util.Collections;
+import java.util.Date;
 import java.util.List;
 import java.util.concurrent.atomic.AtomicLong;
 
@@ -202,7 +202,7 @@ public class RemoteSubOrderServiceImpl implements RemoteSubOrderService {
         List<RemoteSubOrderVo> vos = new ArrayList<>();
 
         baseMapper.selectList(
-            Wrappers.lambdaQuery(SysSubOrder.class).select(SysSubOrder::getId, SysSubOrder::getUsrCustomer)
+            Wrappers.lambdaQuery(SysSubOrder.class).select(SysSubOrder::getId, SysSubOrder::getPrice)
                 .in(SysSubOrder::getUsrCustomer, customerIds)
         ).forEach(e -> {
             RemoteSubOrderVo vo = new RemoteSubOrderVo();
@@ -233,4 +233,59 @@ public class RemoteSubOrderServiceImpl implements RemoteSubOrderService {
                 .ge(SysSubOrder::getServiceTime, DateUtils.getFirstDayOfLastMonth())
         );
     }
+
+    @Override
+    public List<RemoteSubOrderVo> listAfterDate(Date time) {
+        List<RemoteSubOrderVo> vos = new ArrayList<>();
+
+        baseMapper.selectList(
+            Wrappers.lambdaQuery(SysSubOrder.class)
+                .select(SysSubOrder::getId, SysSubOrder::getService, SysSubOrder::getPrice, SysSubOrder::getCreateTime)
+                .ge(SysSubOrder::getCreateTime, time)
+        ).forEach(e -> {
+            RemoteSubOrderVo vo = new RemoteSubOrderVo();
+            vo.setId(e.getId());
+            vo.setService(e.getService());
+            vo.setPrice(e.getPrice());
+            vo.setCreateTime(e.getCreateTime());
+            vo.setStatus(e.getStatus());
+            vos.add(vo);
+        });
+
+        return vos;
+    }
+
+    @Override
+    public List<RemoteSubOrderVo> listAll() {
+        return baseMapper.selectList(Wrappers.lambdaQuery(SysSubOrder.class)
+                .select(SysSubOrder::getId, SysSubOrder::getStore)
+            ).stream().map(e -> {
+                RemoteSubOrderVo vo = new RemoteSubOrderVo();
+                vo.setId(e.getId());
+                vo.setStore(e.getStore());
+                return vo;
+            }).toList();
+    }
+
+    @Override
+    public List<RemoteSubOrderVo> listAfterDateEnableTenant(Date time, String tenantId) {
+        List<RemoteSubOrderVo> vos = new ArrayList<>();
+
+        baseMapper.selectList(
+            Wrappers.lambdaQuery(SysSubOrder.class)
+                .select(SysSubOrder::getId, SysSubOrder::getService, SysSubOrder::getPrice, SysSubOrder::getCreateTime, SysSubOrder::getStatus, SysSubOrder::getUsrPet)
+                .ge(SysSubOrder::getCreateTime, time).eq(SysSubOrder::getTenantId, tenantId)
+        ).forEach(e -> {
+            RemoteSubOrderVo vo = new RemoteSubOrderVo();
+            vo.setId(e.getId());
+            vo.setService(e.getService());
+            vo.setPrice(e.getPrice());
+            vo.setCreateTime(e.getCreateTime());
+            vo.setStatus(e.getStatus());
+            vo.setPet(e.getUsrPet());
+            vos.add(vo);
+        });
+
+        return vos;
+    }
 }

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

@@ -1,7 +1,7 @@
 package org.dromara.order.service.impl;
 
 import org.dromara.order.domain.vo.OrderStatusVo;
-import org.dromara.order.enums.OrderStatusEnum;
+import org.dromara.order.api.enums.OrderStatusEnum;
 import org.dromara.order.service.IOrderStatusService;
 import org.springframework.stereotype.Service;
 

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

@@ -2,15 +2,12 @@ package org.dromara.order.service.impl;
 
 import cn.hutool.core.date.DateUtil;
 import cn.hutool.core.util.IdUtil;
-import com.baomidou.lock.LockInfo;
 import com.baomidou.lock.LockTemplate;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.dromara.common.core.constant.CacheConstants;
 import org.dromara.common.core.constant.CacheNames;
-import org.dromara.common.mybatis.utils.IdGeneratorUtil;
 import org.dromara.common.platform.PlatformUtils;
-import org.dromara.common.redis.constants.LockContants;
 import org.dromara.common.redis.utils.CacheUtils;
 import org.dromara.common.redis.utils.RedisUtils;
 import org.dromara.common.satoken.utils.LoginHelper;
@@ -19,9 +16,9 @@ import org.dromara.order.domain.SysSubOrder;
 import org.dromara.order.domain.SysSubOrderLog;
 import org.dromara.order.domain.bo.SysOrderCreateBo;
 import org.dromara.order.domain.bo.SysSubOrderCreateBo;
-import org.dromara.order.enums.OrderLogSystemStepEnum;
-import org.dromara.order.enums.OrderLogActionerTypeEnum;
-import org.dromara.order.enums.OrderLogTypeEnum;
+import org.dromara.order.api.enums.OrderLogSystemStepEnum;
+import org.dromara.order.api.enums.OrderLogActionerTypeEnum;
+import org.dromara.order.api.enums.OrderLogTypeEnum;
 import org.dromara.order.mapper.SysOrderMapper;
 import org.dromara.order.mapper.SysSubOrderLogMapper;
 import org.dromara.order.mapper.SysSubOrderMapper;

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

@@ -6,14 +6,13 @@ 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.api.enums.OrderLogActionerTypeEnum;
+import org.dromara.order.api.enums.OrderLogFulfillerStepEnum;
+import org.dromara.order.api.enums.OrderLogTypeEnum;
 import org.dromara.order.mapper.SysSubOrderLogMapper;
 import org.dromara.order.service.ISysSubOrderLogService;
 import org.dromara.resource.api.RemoteFileService;

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

@@ -16,17 +16,18 @@ import org.dromara.common.core.enums.UserType;
 import org.dromara.common.mybatis.core.page.PageQuery;
 import org.dromara.common.mybatis.core.page.TableDataInfo;
 import org.dromara.common.mybatis.utils.WrapperUtils;
-import org.dromara.common.platform.Platform;
 import org.dromara.common.satoken.utils.LoginHelper;
 import org.dromara.fulfiller.api.RemoteFulfillerService;
 import org.dromara.fulfiller.api.domain.vo.RemoteFulfillerVo;
 import org.dromara.fulfiller.api.model.FulfillerLoginUser;
-import org.dromara.order.domain.SysOrder;
+import org.dromara.order.api.enums.OrderLogActionerTypeEnum;
+import org.dromara.order.api.enums.OrderLogSystemStepEnum;
+import org.dromara.order.api.enums.OrderLogTypeEnum;
+import org.dromara.order.api.enums.OrderStatusEnum;
 import org.dromara.order.domain.SysSubOrder;
 import org.dromara.order.domain.SysSubOrderLog;
 import org.dromara.order.domain.bo.*;
 import org.dromara.order.domain.vo.*;
-import org.dromara.order.enums.*;
 import org.dromara.order.mapper.SysSubOrderLogMapper;
 import org.dromara.order.mapper.SysSubOrderMapper;
 import org.dromara.order.service.ISysSubOrderService;
@@ -223,7 +224,7 @@ public class SysSubOrderServiceImpl implements ISysSubOrderService {
             log.setActioner(LoginHelper.getUserId());
             log.setActionerType(OrderLogActionerTypeEnum.FULFILLER.getValue());
             log.setLogType(OrderLogTypeEnum.FULFILLER.getValue());
-            OrderLogFulfillerStepEnum step = OrderLogFulfillerStepEnum.REJECT;
+            org.dromara.order.api.enums.OrderLogFulfillerStepEnum step = org.dromara.order.api.enums.OrderLogFulfillerStepEnum.REJECT;
             log.setStep(step.getStep());
             log.setTitle(step.getTitle());
             log.setContent(String.format(step.getContent(), loginUser.getNickname()));
@@ -439,9 +440,9 @@ public class SysSubOrderServiceImpl implements ISysSubOrderService {
         fulfillerLog.setActioner(LoginHelper.getUserId());
         fulfillerLog.setActionerType(OrderLogActionerTypeEnum.FULFILLER.getValue());
         fulfillerLog.setLogType(OrderLogTypeEnum.FULFILLER.getValue());
-        fulfillerLog.setStep(OrderLogFulfillerStepEnum.RECIEVED.getStep());
-        fulfillerLog.setTitle(OrderLogFulfillerStepEnum.RECIEVED.getTitle());
-        fulfillerLog.setContent(String.format(OrderLogFulfillerStepEnum.RECIEVED.getContent(), LoginHelper.getLoginUser().getNickname()));
+        fulfillerLog.setStep(org.dromara.order.api.enums.OrderLogFulfillerStepEnum.RECIEVED.getStep());
+        fulfillerLog.setTitle(org.dromara.order.api.enums.OrderLogFulfillerStepEnum.RECIEVED.getTitle());
+        fulfillerLog.setContent(String.format(org.dromara.order.api.enums.OrderLogFulfillerStepEnum.RECIEVED.getContent(), LoginHelper.getLoginUser().getNickname()));
         fulfillerLog.setTenantId(subOrder.getTenantId());
 
         boolean logFlag = subOrderLogMapper.insertBatch(Arrays.asList(orderLog, fulfillerLog));
@@ -478,11 +479,11 @@ public class SysSubOrderServiceImpl implements ISysSubOrderService {
             if (!total.contains(e.getSubOrderId())) {
                 total.add(e.getSubOrderId());
             }
-            if (e.getStep().equals(OrderLogFulfillerStepEnum.REJECT.getStep())) {
+            if (e.getStep().equals(org.dromara.order.api.enums.OrderLogFulfillerStepEnum.REJECT.getStep())) {
                 if (!reject.contains(e.getSubOrderId())) {
                     reject.add(e.getSubOrderId());
                 }
-            } else if (e.getStep().equals(OrderLogFulfillerStepEnum.COMPLETED.getStep())) {
+            } else if (e.getStep().equals(org.dromara.order.api.enums.OrderLogFulfillerStepEnum.COMPLETED.getStep())) {
                 if (!completed.contains(e.getSubOrderId())) {
                     completed.add(e.getSubOrderId());
                 }
@@ -554,7 +555,7 @@ public class SysSubOrderServiceImpl implements ISysSubOrderService {
             endFlfLog.setActioner(LoginHelper.getUserId());
             endFlfLog.setActionerType(OrderLogActionerTypeEnum.FULFILLER.getValue());
             endFlfLog.setLogType(OrderLogTypeEnum.FULFILLER.getValue());
-            OrderLogFulfillerStepEnum flfStep = OrderLogFulfillerStepEnum.COMPLETED;
+            org.dromara.order.api.enums.OrderLogFulfillerStepEnum flfStep = org.dromara.order.api.enums.OrderLogFulfillerStepEnum.COMPLETED;
             endFlfLog.setStep(flfStep.getStep());
             endFlfLog.setTitle(flfStep.getTitle());
             endFlfLog.setContent(flfStep.getContent());
@@ -760,7 +761,7 @@ public class SysSubOrderServiceImpl implements ISysSubOrderService {
         log.setActioner(LoginHelper.getUserId());
         log.setActionerType(OrderLogActionerTypeEnum.FULFILLER.getValue());
         log.setLogType(OrderLogTypeEnum.FULFILLER.getValue());
-        OrderLogFulfillerStepEnum step = OrderLogFulfillerStepEnum.REJECT;
+        org.dromara.order.api.enums.OrderLogFulfillerStepEnum step = org.dromara.order.api.enums.OrderLogFulfillerStepEnum.REJECT;
         log.setStep(step.getStep());
         log.setTitle(step.getTitle());
         log.setContent(bo.getRejectReason());

+ 15 - 4
script/sql/business/create.sql

@@ -324,14 +324,25 @@ CREATE TABLE `pet_system`.`flf_level_config`
 
 CREATE TABLE `pet_system`.`flf_level_config_rights`
 (
-    `config_id`    bigint    NOT NULL COMMENT '配置ID',
-    `rights_id`    bigint    NOT NULL COMMENT '权益ID',
+    `config_id` bigint NOT NULL COMMENT '配置ID',
+    `rights_id` bigint NOT NULL COMMENT '权益ID',
     PRIMARY KEY (`config_id`, `rights_id`)
 ) ENGINE = innoDB COMMENT = '等级配置权益关联表';
 
 CREATE TABLE `pet_system`.`sys_user_area_station`
 (
-    `sys_user_id` bigint     NOT NULL COMMENT '系统用户ID',
-    `area_station_id` bigint  NOT NULL COMMENT '区域站点ID',
+    `sys_user_id`     bigint NOT NULL COMMENT '系统用户ID',
+    `area_station_id` bigint NOT NULL COMMENT '区域站点ID',
     PRIMARY KEY (`sys_user_id`, `area_station_id`)
 ) ENGINE = innoDB COMMENT = '等级配置权益关联表';
+
+CREATE TABLE `pet_system`.`sys_agreement`
+(
+    `id`                            bigint PRIMARY KEY NOT NULL COMMENT '序号',
+    `user_agreement_title`          varchar(64)        NOT NULL DEFAULT '' COMMENT '用户协议标题',
+    `user_agreement_content`        text               NOT NULL COMMENT '用户协议内容',
+    `privacy_policy_title`          varchar(64)        NOT NULL DEFAULT '' COMMENT '隐私政策标题',
+    `privacy_policy_content`        text               NOT NULL COMMENT '隐私政策内容',
+    `fulfiller_explanation_title`   varchar(64)        NOT NULL DEFAULT '' COMMENT '履约者说明标题',
+    `fulfiller_explanation_content` text               NOT NULL COMMENT '履约者说明内容'
+) ENGINE = innoDB COMMENT = '等级配置信息表';