Bläddra i källkod

- 区域站点、服务列表基本完成
- 完善平台划分
- 门店新增部分大部分完成

Huanyi 1 månad sedan
förälder
incheckning
90a44a0a6b
59 ändrade filer med 2327 tillägg och 24 borttagningar
  1. 3 0
      ruoyi-modules/pom.xml
  2. 3 1
      ruoyi-modules/ruoyi-gen/src/main/java/org/dromara/gen/RuoYiGenApplication.java
  3. 3 1
      ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/RuoYiResourceApplication.java
  4. 3 1
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/RuoYiSystemApplication.java
  5. 124 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysAreaStationController.java
  6. 7 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysTenantCategoriesController.java
  7. 6 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysTenantController.java
  8. 93 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysAreaStation.java
  9. 4 2
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysStore.java
  10. 88 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysAreaStationBo.java
  11. 26 14
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysStoreBo.java
  12. 36 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysAreaStationOnStoreVo.java
  13. 18 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysAreaStationStatusVo.java
  14. 20 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysAreaStationTypeVo.java
  15. 100 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysAreaStationVo.java
  16. 4 2
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysStoreVo.java
  17. 18 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysTenantCategoriesOnStoreVo.java
  18. 18 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysTenantOnStoreVo.java
  19. 25 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/enums/AreaStationStatusEnum.java
  20. 26 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/enums/AreaStationTypeEnum.java
  21. 15 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysAreaStationMapper.java
  22. 68 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysAreaStationService.java
  23. 3 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysTenantCategoriesService.java
  24. 3 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysTenantService.java
  25. 155 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysAreaStationServiceImpl.java
  26. 2 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysRoleServiceImpl.java
  27. 15 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysTenantCategoriesServiceImpl.java
  28. 21 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysTenantServiceImpl.java
  29. 3 1
      ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/RuoYiWorkflowApplication.java
  30. 128 0
      ruoyi-modules/yingpaipay-archieves/pom.xml
  31. 19 0
      ruoyi-modules/yingpaipay-archieves/src/main/java/org/dromara/archieves/YingpaipayArchievesApplication.java
  32. 35 0
      ruoyi-modules/yingpaipay-archieves/src/main/resources/application.yml
  33. 8 0
      ruoyi-modules/yingpaipay-archieves/src/main/resources/banner.txt
  34. 28 0
      ruoyi-modules/yingpaipay-archieves/src/main/resources/logback-plus.xml
  35. 130 0
      ruoyi-modules/yingpaipay-fulfiller/pom.xml
  36. 19 0
      ruoyi-modules/yingpaipay-fulfiller/src/main/java/org/dromara/fulfiller/YingpaipayFulfillerApplication.java
  37. 35 0
      ruoyi-modules/yingpaipay-fulfiller/src/main/resources/application.yml
  38. 8 0
      ruoyi-modules/yingpaipay-fulfiller/src/main/resources/banner.txt
  39. 28 0
      ruoyi-modules/yingpaipay-fulfiller/src/main/resources/logback-plus.xml
  40. 130 0
      ruoyi-modules/yingpaipay-service/pom.xml
  41. 19 0
      ruoyi-modules/yingpaipay-service/src/main/java/org/dromara/service/YingpaipayServiceApplication.java
  42. 114 0
      ruoyi-modules/yingpaipay-service/src/main/java/org/dromara/service/controller/SysServiceController.java
  43. 25 0
      ruoyi-modules/yingpaipay-service/src/main/java/org/dromara/service/controller/SysServiceModeController.java
  44. 64 0
      ruoyi-modules/yingpaipay-service/src/main/java/org/dromara/service/domain/SysService.java
  45. 60 0
      ruoyi-modules/yingpaipay-service/src/main/java/org/dromara/service/domain/bo/SysServiceBo.java
  46. 18 0
      ruoyi-modules/yingpaipay-service/src/main/java/org/dromara/service/domain/vo/SysServiceModeVo.java
  47. 18 0
      ruoyi-modules/yingpaipay-service/src/main/java/org/dromara/service/domain/vo/SysServiceOnStoreVo.java
  48. 81 0
      ruoyi-modules/yingpaipay-service/src/main/java/org/dromara/service/domain/vo/SysServiceVo.java
  49. 25 0
      ruoyi-modules/yingpaipay-service/src/main/java/org/dromara/service/enums/ServiceModeEnum.java
  50. 15 0
      ruoyi-modules/yingpaipay-service/src/main/java/org/dromara/service/mapper/SysServiceMapper.java
  51. 9 0
      ruoyi-modules/yingpaipay-service/src/main/java/org/dromara/service/service/ISysServiceModeService.java
  52. 72 0
      ruoyi-modules/yingpaipay-service/src/main/java/org/dromara/service/service/ISysServiceService.java
  53. 23 0
      ruoyi-modules/yingpaipay-service/src/main/java/org/dromara/service/service/impl/SysServiceModeServiceImpl.java
  54. 142 0
      ruoyi-modules/yingpaipay-service/src/main/java/org/dromara/service/service/impl/SysServiceServiceImpl.java
  55. 35 0
      ruoyi-modules/yingpaipay-service/src/main/resources/application.yml
  56. 8 0
      ruoyi-modules/yingpaipay-service/src/main/resources/banner.txt
  57. 28 0
      ruoyi-modules/yingpaipay-service/src/main/resources/logback-plus.xml
  58. 47 2
      script/sql/business/create.sql
  59. 46 0
      script/sql/business/update.sql

+ 3 - 0
ruoyi-modules/pom.xml

@@ -14,6 +14,9 @@
         <module>ruoyi-job</module>
         <module>ruoyi-resource</module>
         <module>ruoyi-workflow</module>
+        <module>yingpaipay-service</module>
+        <module>yingpaipay-fulfiller</module>
+        <module>yingpaipay-archieves</module>
     </modules>
 
     <artifactId>ruoyi-modules</artifactId>

+ 3 - 1
ruoyi-modules/ruoyi-gen/src/main/java/org/dromara/gen/RuoYiGenApplication.java

@@ -1,5 +1,6 @@
 package org.dromara.gen;
 
+import lombok.extern.slf4j.Slf4j;
 import org.apache.dubbo.config.spring.context.annotation.EnableDubbo;
 import org.springframework.boot.SpringApplication;
 import org.springframework.boot.autoconfigure.SpringBootApplication;
@@ -12,11 +13,12 @@ import org.springframework.boot.context.metrics.buffering.BufferingApplicationSt
  */
 @EnableDubbo
 @SpringBootApplication
+@Slf4j
 public class RuoYiGenApplication {
     public static void main(String[] args) {
         SpringApplication application = new SpringApplication(RuoYiGenApplication.class);
         application.setApplicationStartup(new BufferingApplicationStartup(2048));
         application.run(args);
-        System.out.println("(♥◠‿◠)ノ゙  代码生成模块启动成功   ლ(´ڡ`ლ)゙  ");
+        log.info("(♥◠‿◠)ノ゙  代码生成模块启动成功   ლ(´ڡ`ლ)゙  ");
     }
 }

+ 3 - 1
ruoyi-modules/ruoyi-resource/src/main/java/org/dromara/resource/RuoYiResourceApplication.java

@@ -1,5 +1,6 @@
 package org.dromara.resource;
 
+import lombok.extern.slf4j.Slf4j;
 import org.apache.dubbo.config.spring.context.annotation.EnableDubbo;
 import org.springframework.boot.SpringApplication;
 import org.springframework.boot.autoconfigure.SpringBootApplication;
@@ -13,11 +14,12 @@ import org.springframework.boot.context.metrics.buffering.BufferingApplicationSt
  */
 @EnableDubbo
 @SpringBootApplication(exclude = {DataSourceAutoConfiguration.class})
+@Slf4j
 public class RuoYiResourceApplication {
     public static void main(String[] args) {
         SpringApplication application = new SpringApplication(RuoYiResourceApplication.class);
         application.setApplicationStartup(new BufferingApplicationStartup(2048));
         application.run(args);
-        System.out.println("(♥◠‿◠)ノ゙  资源服务模块启动成功   ლ(´ڡ`ლ)゙  ");
+        log.info("(♥◠‿◠)ノ゙  资源服务模块启动成功   ლ(´ڡ`ლ)゙  ");
     }
 }

+ 3 - 1
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/RuoYiSystemApplication.java

@@ -1,5 +1,6 @@
 package org.dromara.system;
 
+import lombok.extern.slf4j.Slf4j;
 import org.apache.dubbo.config.spring.context.annotation.EnableDubbo;
 import org.springframework.boot.SpringApplication;
 import org.springframework.boot.autoconfigure.SpringBootApplication;
@@ -12,11 +13,12 @@ import org.springframework.boot.context.metrics.buffering.BufferingApplicationSt
  */
 @EnableDubbo
 @SpringBootApplication
+@Slf4j
 public class RuoYiSystemApplication {
     public static void main(String[] args) {
         SpringApplication application = new SpringApplication(RuoYiSystemApplication.class);
         application.setApplicationStartup(new BufferingApplicationStartup(2048));
         application.run(args);
-        System.out.println("(♥◠‿◠)ノ゙  系统模块启动成功   ლ(´ڡ`ლ)゙  ");
+        log.info("(♥◠‿◠)ノ゙  系统模块启动成功   ლ(´ڡ`ლ)゙  ");
     }
 }

+ 124 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysAreaStationController.java

@@ -0,0 +1,124 @@
+package org.dromara.system.controller.system;
+
+import java.util.List;
+
+import lombok.RequiredArgsConstructor;
+import jakarta.servlet.http.HttpServletResponse;
+import jakarta.validation.constraints.*;
+import cn.dev33.satoken.annotation.SaCheckPermission;
+import org.dromara.system.domain.vo.SysAreaStationOnStoreVo;
+import org.dromara.system.domain.vo.SysAreaStationStatusVo;
+import org.dromara.system.domain.vo.SysAreaStationTypeVo;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.validation.annotation.Validated;
+import org.dromara.common.idempotent.annotation.RepeatSubmit;
+import org.dromara.common.log.annotation.Log;
+import org.dromara.common.web.core.BaseController;
+import org.dromara.common.core.domain.R;
+import org.dromara.common.core.validate.AddGroup;
+import org.dromara.common.core.validate.EditGroup;
+import org.dromara.common.log.enums.BusinessType;
+import org.dromara.common.excel.utils.ExcelUtil;
+import org.dromara.system.domain.vo.SysAreaStationVo;
+import org.dromara.system.domain.bo.SysAreaStationBo;
+import org.dromara.system.service.ISysAreaStationService;
+
+/**
+ * 区域站点
+ * 前端访问路由地址为:/system/areaStation
+ *
+ * @author Huanyi
+ * @date 2026-02-25
+ */
+@Validated
+@RequiredArgsConstructor
+@RestController
+@RequestMapping("/areaStation")
+public class SysAreaStationController extends BaseController {
+
+    private final ISysAreaStationService sysAreaStationService;
+
+    /**
+     * 查询区域站点列表
+     */
+    @SaCheckPermission("system:areaStation:list")
+    @GetMapping("/list")
+    public R<List<SysAreaStationVo>> list(SysAreaStationBo bo) {
+        List<SysAreaStationVo> list = sysAreaStationService.queryList(bo);
+        return R.ok(list);
+    }
+
+    /**
+     * 导出区域站点列表
+     */
+    @SaCheckPermission("system:areaStation:export")
+    @Log(title = "区域站点", businessType = BusinessType.EXPORT)
+    @PostMapping("/export")
+    public void export(SysAreaStationBo bo, HttpServletResponse response) {
+        List<SysAreaStationVo> list = sysAreaStationService.queryList(bo);
+        ExcelUtil.exportExcel(list, "区域站点", SysAreaStationVo.class, response);
+    }
+
+    /**
+     * 获取区域站点详细信息
+     *
+     * @param id 主键
+     */
+    @SaCheckPermission("system:areaStation:query")
+    @GetMapping("/{id}")
+    public R<SysAreaStationVo> getInfo(@NotNull(message = "主键不能为空")
+                                     @PathVariable("id") Long id) {
+        return R.ok(sysAreaStationService.queryById(id));
+    }
+
+    /**
+     * 新增区域站点
+     */
+    @SaCheckPermission("system:areaStation:add")
+    @Log(title = "区域站点", businessType = BusinessType.INSERT)
+    @RepeatSubmit()
+    @PostMapping()
+    public R<Void> add(@Validated(AddGroup.class) @RequestBody SysAreaStationBo bo) {
+        return toAjax(sysAreaStationService.insertByBo(bo));
+    }
+
+    /**
+     * 修改区域站点
+     */
+    @SaCheckPermission("system:areaStation:edit")
+    @Log(title = "区域站点", businessType = BusinessType.UPDATE)
+    @RepeatSubmit()
+    @PutMapping()
+    public R<Void> edit(@Validated(EditGroup.class) @RequestBody SysAreaStationBo bo) {
+        return toAjax(sysAreaStationService.updateByBo(bo));
+    }
+
+    /**
+     * 删除区域站点
+     *
+     * @param ids 主键串
+     */
+    @SaCheckPermission("system:areaStation:remove")
+    @Log(title = "区域站点", businessType = BusinessType.DELETE)
+    @DeleteMapping("/{ids}")
+    public R<Void> remove(@NotEmpty(message = "主键不能为空")
+                          @PathVariable("ids") Long[] ids) {
+        return toAjax(sysAreaStationService.deleteWithValidByIds(List.of(ids), true));
+    }
+
+    @GetMapping("/listType")
+    public R<List<SysAreaStationTypeVo>> listType() {
+        return R.ok(sysAreaStationService.listType());
+    }
+
+    @GetMapping("/listStatus")
+    public R<List<SysAreaStationStatusVo>> listStatus() {
+        return R.ok(sysAreaStationService.listStatus());
+    }
+
+    @GetMapping("/listOnStore")
+    public R<List<SysAreaStationOnStoreVo>> listOnStore() {
+        return R.ok(sysAreaStationService.listOnStore());
+    }
+
+}

+ 7 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysTenantCategoriesController.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.system.domain.vo.SysTenantCategoriesOnStoreVo;
 import org.springframework.web.bind.annotation.*;
 import org.springframework.validation.annotation.Validated;
 import org.dromara.common.idempotent.annotation.RepeatSubmit;
@@ -103,4 +104,10 @@ public class SysTenantCategoriesController extends BaseController {
                           @PathVariable("ids") Long[] ids) {
         return toAjax(sysTenantCategoriesService.deleteWithValidByIds(List.of(ids), true));
     }
+
+    @GetMapping("/listOnStore")
+    public TableDataInfo<SysTenantCategoriesOnStoreVo> listOnStore(PageQuery pageQuery) {
+        return sysTenantCategoriesService.listOnStore(pageQuery);
+    }
+
 }

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

@@ -18,6 +18,7 @@ import org.dromara.common.mybatis.core.page.PageQuery;
 import org.dromara.common.mybatis.core.page.TableDataInfo;
 import org.dromara.common.tenant.helper.TenantHelper;
 import org.dromara.system.domain.bo.SysTenantBo;
+import org.dromara.system.domain.vo.SysTenantOnStoreVo;
 import org.dromara.system.domain.vo.SysTenantVo;
 import org.dromara.system.service.ISysTenantService;
 import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
@@ -209,4 +210,9 @@ public class SysTenantController extends BaseController {
         return R.ok("同步租户参数配置成功");
     }
 
+    @GetMapping("/listOnStore")
+    public TableDataInfo<SysTenantOnStoreVo> listOnStore(PageQuery pageQuery) {
+        return tenantService.listOnStore(pageQuery);
+    }
+
 }

+ 93 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysAreaStation.java

@@ -0,0 +1,93 @@
+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.math.BigDecimal;
+
+import java.io.Serial;
+
+/**
+ * 区域站点对象 sys_area_station
+ *
+ * @author Huanyi
+ * @date 2026-02-25
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@TableName("sys_area_station")
+public class SysAreaStation extends BaseEntity {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 序号
+     */
+    @TableId(value = "id")
+    private Long id;
+
+    /**
+     * 区域名称
+     */
+    private String name;
+
+    /**
+     * 父级ID
+     */
+    private Long parentId;
+
+    /**
+     * 省市编码
+     */
+    private String code;
+
+    /**
+     * 排序权重
+     */
+    private Long sort;
+
+    /**
+     * 详细地址
+     */
+    private String address;
+
+    /**
+     * 站长姓名
+     */
+    private String leaderName;
+
+    /**
+     * 联系电话
+     */
+    private String contactPhone;
+
+    /**
+     * 经度
+     */
+    private BigDecimal longitude;
+
+    /**
+     * 纬度
+     */
+    private BigDecimal latitude;
+
+    /**
+     * 类型
+     */
+    private Integer type;
+
+    /**
+     * 状态
+     */
+    private Integer status;
+
+    /**
+     * 删除标志(0代表存在 1代表删除)
+     */
+    @TableLogic
+    private String delFlag;
+
+
+}

+ 4 - 2
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysStore.java

@@ -5,6 +5,8 @@ import com.baomidou.mybatisplus.annotation.*;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 import org.dromara.common.translation.annotation.Translation;
+
+import java.math.BigDecimal;
 import java.util.Date;
 import com.fasterxml.jackson.annotation.JsonFormat;
 import org.dromara.common.translation.constant.TransConstant;
@@ -94,12 +96,12 @@ public class SysStore extends TenantEntity {
     /**
      * 经度
      */
-    private Float longitude;
+    private BigDecimal longitude;
 
     /**
      * 维度
      */
-    private Float latitude;
+    private BigDecimal latitude;
 
     /**
      * 删除标志(0代表存在 1代表删除)

+ 88 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysAreaStationBo.java

@@ -0,0 +1,88 @@
+package org.dromara.system.domain.bo;
+
+import org.dromara.system.domain.SysAreaStation;
+import org.dromara.common.mybatis.core.domain.BaseEntity;
+import org.dromara.common.core.validate.AddGroup;
+import org.dromara.common.core.validate.EditGroup;
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import jakarta.validation.constraints.*;
+import java.math.BigDecimal;
+
+/**
+ * 区域站点业务对象 sys_area_station
+ *
+ * @author Huanyi
+ * @date 2026-02-25
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@AutoMapper(target = SysAreaStation.class, reverseConvertGenerate = false)
+public class SysAreaStationBo extends BaseEntity {
+
+    /**
+     * 序号
+     */
+    @NotNull(message = "序号不能为空", groups = { EditGroup.class })
+    private Long id;
+
+    /**
+     * 区域名称
+     */
+    @NotBlank(message = "区域名称不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String name;
+
+    /**
+     * 父级ID
+     */
+    private Long parentId;
+
+    /**
+     * 省市编码
+     */
+    private String code;
+
+    /**
+     * 排序权重
+     */
+    private Long sort;
+
+    /**
+     * 详细地址
+     */
+    private String address;
+
+    /**
+     * 站长姓名
+     */
+    private String leaderName;
+
+    /**
+     * 联系电话
+     */
+    private String contactPhone;
+
+    /**
+     * 经度
+     */
+    private BigDecimal longitude;
+
+    /**
+     * 纬度
+     */
+    private BigDecimal latitude;
+
+    /**
+     * 类型
+     */
+    @NotNull(message = "类型不能为空", groups = { AddGroup.class, EditGroup.class })
+    private Integer type;
+
+    /**
+     * 状态
+     */
+    private Integer status;
+
+
+}

+ 26 - 14
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysStoreBo.java

@@ -8,10 +8,10 @@ import io.github.linpeilie.annotations.AutoMapper;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 import jakarta.validation.constraints.*;
-import org.dromara.common.translation.annotation.Translation;
+
+import java.math.BigDecimal;
 import java.util.Date;
-import com.fasterxml.jackson.annotation.JsonFormat;
-import org.dromara.common.translation.constant.TransConstant;
+import java.util.List;
 
 /**
  * 门店管理业务对象 sys_store
@@ -27,7 +27,7 @@ public class SysStoreBo extends BaseEntity {
     /**
      * 序号
      */
-    @NotNull(message = "序号不能为空", groups = { EditGroup.class })
+    @NotNull(message = "序号不能为空", groups = {EditGroup.class})
     private Long id;
 
     /**
@@ -38,49 +38,49 @@ public class SysStoreBo extends BaseEntity {
     /**
      * 营业执照
      */
-    @NotNull(message = "营业执照不能为空", groups = { AddGroup.class, EditGroup.class })
+    @NotNull(message = "营业执照不能为空", groups = {AddGroup.class, EditGroup.class})
     private Long businessLicense;
 
     /**
      * 门店名称
      */
-    @NotBlank(message = "门店名称不能为空", groups = { AddGroup.class, EditGroup.class })
+    @NotBlank(message = "门店名称不能为空", groups = {AddGroup.class, EditGroup.class})
     private String name;
 
     /**
      * 商户分类
      */
-    @NotNull(message = "商户分类不能为空", groups = { AddGroup.class, EditGroup.class })
+    @NotNull(message = "商户分类不能为空", groups = {AddGroup.class, EditGroup.class})
     private Long tenantCatergories;
 
     /**
      * 开始营业时间
      */
-    @NotNull(message = "开始营业时间不能为空", groups = { AddGroup.class, EditGroup.class })
+    @NotNull(message = "开始营业时间不能为空", groups = {AddGroup.class, EditGroup.class})
     private Date startBusinessTime;
 
     /**
      * 结束营业时间
      */
-    @NotNull(message = "结束营业时间不能为空", groups = { AddGroup.class, EditGroup.class })
+    @NotNull(message = "结束营业时间不能为空", groups = {AddGroup.class, EditGroup.class})
     private Date endBusinessTime;
 
     /**
      * 联系人
      */
-    @NotBlank(message = "联系人不能为空", groups = { AddGroup.class, EditGroup.class })
+    @NotBlank(message = "联系人不能为空", groups = {AddGroup.class, EditGroup.class})
     private String contact;
 
     /**
      * 联系电话
      */
-    @NotBlank(message = "联系电话不能为空", groups = { AddGroup.class, EditGroup.class })
+    @NotBlank(message = "联系电话不能为空", groups = {AddGroup.class, EditGroup.class})
     private String contactNumber;
 
     /**
      * 有效期至
      */
-    @NotNull(message = "有效期至不能为空", groups = { AddGroup.class, EditGroup.class })
+    @NotNull(message = "有效期至不能为空", groups = {AddGroup.class, EditGroup.class})
     private Date validity;
 
     /**
@@ -101,12 +101,24 @@ public class SysStoreBo extends BaseEntity {
     /**
      * 经度
      */
-    private Float longitude;
+    @Null(groups = {AddGroup.class, EditGroup.class})
+    @DecimalMax(value = "180.000000", message = "经度最大值为180", groups = {AddGroup.class, EditGroup.class})
+    @DecimalMin(value = "-180.000000", message = "经度最小值为-180", groups = {AddGroup.class, EditGroup.class})
+    private BigDecimal longitude;
 
     /**
      * 维度
      */
-    private Float latitude;
+    @Null(groups = {AddGroup.class, EditGroup.class})
+    @DecimalMin(value = "-90.000000", message = "纬度最小值为-90", groups = {AddGroup.class, EditGroup.class})
+    @DecimalMax(value = "90.000000", message = "纬度最大值为90", groups = {AddGroup.class, EditGroup.class})
+    private BigDecimal latitude;
+
 
+    /**
+     * 服务项目
+     */
+    @NotEmpty(message = "服务项目不能为空", groups = {AddGroup.class, EditGroup.class})
+    private List<Long> services;
 
 }

+ 36 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysAreaStationOnStoreVo.java

@@ -0,0 +1,36 @@
+package org.dromara.system.domain.vo;
+
+import lombok.Data;
+
+import java.io.Serial;
+import java.io.Serializable;
+
+
+/**
+ * @author Huanyi
+ * @date 2026-02-25
+ */
+@Data
+public class SysAreaStationOnStoreVo implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 序号
+     */
+    private Long id;
+
+    /**
+     * 区域名称
+     */
+    private String name;
+
+    /**
+     * 类型
+     */
+    private Integer type;
+
+    private Long parentId;
+
+}

+ 18 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysAreaStationStatusVo.java

@@ -0,0 +1,18 @@
+package org.dromara.system.domain.vo;
+
+import lombok.Data;
+
+import java.io.Serial;
+import java.io.Serializable;
+
+@Data
+public class SysAreaStationStatusVo implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    private Integer value;
+
+    private String label;
+
+}

+ 20 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysAreaStationTypeVo.java

@@ -0,0 +1,20 @@
+package org.dromara.system.domain.vo;
+
+import lombok.Data;
+
+import java.io.Serial;
+import java.io.Serializable;
+
+@Data
+public class SysAreaStationTypeVo implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    private Integer value;
+
+    private String label;
+
+    private String style;
+
+}

+ 100 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysAreaStationVo.java

@@ -0,0 +1,100 @@
+package org.dromara.system.domain.vo;
+
+import java.math.BigDecimal;
+import org.dromara.system.domain.SysAreaStation;
+import cn.idev.excel.annotation.ExcelIgnoreUnannotated;
+import cn.idev.excel.annotation.ExcelProperty;
+import org.dromara.common.excel.annotation.ExcelDictFormat;
+import org.dromara.common.excel.convert.ExcelDictConvert;
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.util.Date;
+
+
+
+/**
+ * 区域站点视图对象 sys_area_station
+ *
+ * @author Huanyi
+ * @date 2026-02-25
+ */
+@Data
+@ExcelIgnoreUnannotated
+@AutoMapper(target = SysAreaStation.class)
+public class SysAreaStationVo implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 序号
+     */
+    @ExcelProperty(value = "序号")
+    private Long id;
+
+    /**
+     * 区域名称
+     */
+    @ExcelProperty(value = "区域名称")
+    private String name;
+
+    /**
+     * 省市编码
+     */
+    @ExcelProperty(value = "省市编码")
+    private String code;
+
+    /**
+     * 排序权重
+     */
+    @ExcelProperty(value = "排序权重")
+    private Long sort;
+
+    /**
+     * 详细地址
+     */
+    @ExcelProperty(value = "详细地址")
+    private String address;
+
+    /**
+     * 站长姓名
+     */
+    @ExcelProperty(value = "站长姓名")
+    private String leaderName;
+
+    /**
+     * 联系电话
+     */
+    @ExcelProperty(value = "联系电话")
+    private String contactPhone;
+
+    /**
+     * 经度
+     */
+    @ExcelProperty(value = "经度")
+    private BigDecimal longitude;
+
+    /**
+     * 纬度
+     */
+    @ExcelProperty(value = "纬度")
+    private BigDecimal latitude;
+
+    /**
+     * 类型
+     */
+    @ExcelProperty(value = "类型")
+    private Integer type;
+
+    /**
+     * 状态
+     */
+    @ExcelProperty(value = "状态")
+    private Integer status;
+
+    private Long parentId;
+
+}

+ 4 - 2
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysStoreVo.java

@@ -1,6 +1,8 @@
 package org.dromara.system.domain.vo;
 
 import org.dromara.common.translation.annotation.Translation;
+
+import java.math.BigDecimal;
 import java.util.Date;
 import com.fasterxml.jackson.annotation.JsonFormat;
 import org.dromara.common.translation.constant.TransConstant;
@@ -123,11 +125,11 @@ public class SysStoreVo implements Serializable {
     /**
      * 经度
      */
-    private Float longitude;
+    private BigDecimal longitude;
 
     /**
      * 维度
      */
-    private Float latitude;
+    private BigDecimal latitude;
 
 }

+ 18 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysTenantCategoriesOnStoreVo.java

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

+ 18 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysTenantOnStoreVo.java

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

+ 25 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/enums/AreaStationStatusEnum.java

@@ -0,0 +1,25 @@
+package org.dromara.system.enums;
+
+import lombok.AccessLevel;
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+import java.util.Arrays;
+import java.util.List;
+
+@Getter
+@AllArgsConstructor(access = AccessLevel.PRIVATE)
+public enum AreaStationStatusEnum {
+
+    ENABLE(0, "启用"),
+    BANNED(1, "禁用"),
+    ;
+
+    private final Integer value;
+    private final String label;
+
+    public static List<AreaStationStatusEnum> list() {
+        return Arrays.stream(values()).toList();
+    }
+
+}

+ 26 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/enums/AreaStationTypeEnum.java

@@ -0,0 +1,26 @@
+package org.dromara.system.enums;
+
+import lombok.AccessLevel;
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+import java.util.Arrays;
+import java.util.List;
+
+@Getter
+@AllArgsConstructor(access = AccessLevel.PRIVATE)
+public enum AreaStationTypeEnum {
+
+    CITY(0, "城市", "success"),
+    DISTRICT(1, "区域", "info"),
+    STATION(2, "站点", "info"),
+    ;
+    private final Integer value;
+    private final String label;
+    private final String style;
+
+    public static List<AreaStationTypeEnum> list() {
+        return Arrays.stream(values()).toList();
+    }
+
+}

+ 15 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysAreaStationMapper.java

@@ -0,0 +1,15 @@
+package org.dromara.system.mapper;
+
+import org.dromara.system.domain.SysAreaStation;
+import org.dromara.system.domain.vo.SysAreaStationVo;
+import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
+
+/**
+ * 区域站点Mapper接口
+ *
+ * @author Huanyi
+ * @date 2026-02-25
+ */
+public interface SysAreaStationMapper extends BaseMapperPlus<SysAreaStation, SysAreaStationVo> {
+
+}

+ 68 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysAreaStationService.java

@@ -0,0 +1,68 @@
+package org.dromara.system.service;
+
+import org.dromara.system.domain.SysAreaStation;
+import org.dromara.system.domain.vo.SysAreaStationOnStoreVo;
+import org.dromara.system.domain.vo.SysAreaStationStatusVo;
+import org.dromara.system.domain.vo.SysAreaStationTypeVo;
+import org.dromara.system.domain.vo.SysAreaStationVo;
+import org.dromara.system.domain.bo.SysAreaStationBo;
+
+import java.util.Collection;
+import java.util.List;
+
+/**
+ * 区域站点Service接口
+ *
+ * @author Huanyi
+ * @date 2026-02-25
+ */
+public interface ISysAreaStationService {
+
+    /**
+     * 查询区域站点
+     *
+     * @param id 主键
+     * @return 区域站点
+     */
+    SysAreaStationVo queryById(Long id);
+
+
+    /**
+     * 查询符合条件的区域站点列表
+     *
+     * @param bo 查询条件
+     * @return 区域站点列表
+     */
+    List<SysAreaStationVo> queryList(SysAreaStationBo bo);
+
+    /**
+     * 新增区域站点
+     *
+     * @param bo 区域站点
+     * @return 是否新增成功
+     */
+    Boolean insertByBo(SysAreaStationBo bo);
+
+    /**
+     * 修改区域站点
+     *
+     * @param bo 区域站点
+     * @return 是否修改成功
+     */
+    Boolean updateByBo(SysAreaStationBo bo);
+
+    /**
+     * 校验并批量删除区域站点信息
+     *
+     * @param ids     待删除的主键集合
+     * @param isValid 是否进行有效性校验
+     * @return 是否删除成功
+     */
+    Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
+
+    List<SysAreaStationTypeVo> listType();
+
+    List<SysAreaStationStatusVo> listStatus();
+
+    List<SysAreaStationOnStoreVo> listOnStore();
+}

+ 3 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysTenantCategoriesService.java

@@ -1,6 +1,7 @@
 package org.dromara.system.service;
 
 import org.dromara.system.domain.SysTenantCategories;
+import org.dromara.system.domain.vo.SysTenantCategoriesOnStoreVo;
 import org.dromara.system.domain.vo.SysTenantCategoriesVo;
 import org.dromara.system.domain.bo.SysTenantCategoriesBo;
 import org.dromara.common.mybatis.core.page.TableDataInfo;
@@ -66,4 +67,6 @@ public interface ISysTenantCategoriesService {
      * @return 是否删除成功
      */
     Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
+
+    TableDataInfo<SysTenantCategoriesOnStoreVo> listOnStore(PageQuery pageQuery);
 }

+ 3 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysTenantService.java

@@ -1,5 +1,6 @@
 package org.dromara.system.service;
 
+import org.dromara.system.domain.vo.SysTenantOnStoreVo;
 import org.dromara.system.domain.vo.SysTenantVo;
 import org.dromara.system.domain.bo.SysTenantBo;
 import org.dromara.common.mybatis.core.page.TableDataInfo;
@@ -89,4 +90,6 @@ public interface ISysTenantService {
      * 同步租户参数配置
      */
     void syncTenantConfig();
+
+    TableDataInfo<SysTenantOnStoreVo> listOnStore(PageQuery pageQuery);
 }

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

@@ -0,0 +1,155 @@
+package org.dromara.system.service.impl;
+
+import org.dromara.common.core.utils.MapstructUtils;
+import org.dromara.common.core.utils.StringUtils;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.dromara.system.domain.vo.SysAreaStationOnStoreVo;
+import org.dromara.system.domain.vo.SysAreaStationStatusVo;
+import org.dromara.system.domain.vo.SysAreaStationTypeVo;
+import org.dromara.system.enums.AreaStationStatusEnum;
+import org.dromara.system.enums.AreaStationTypeEnum;
+import org.springframework.stereotype.Service;
+import org.dromara.system.domain.bo.SysAreaStationBo;
+import org.dromara.system.domain.vo.SysAreaStationVo;
+import org.dromara.system.domain.SysAreaStation;
+import org.dromara.system.mapper.SysAreaStationMapper;
+import org.dromara.system.service.ISysAreaStationService;
+
+import java.util.List;
+import java.util.Map;
+import java.util.Collection;
+
+/**
+ * 区域站点Service业务层处理
+ *
+ * @author Huanyi
+ * @date 2026-02-25
+ */
+@Slf4j
+@RequiredArgsConstructor
+@Service
+public class SysAreaStationServiceImpl implements ISysAreaStationService {
+
+    private final SysAreaStationMapper baseMapper;
+
+    /**
+     * 查询区域站点
+     *
+     * @param id 主键
+     * @return 区域站点
+     */
+    @Override
+    public SysAreaStationVo queryById(Long id){
+        return baseMapper.selectVoById(id);
+    }
+
+
+    /**
+     * 查询符合条件的区域站点列表
+     *
+     * @param bo 查询条件
+     * @return 区域站点列表
+     */
+    @Override
+    public List<SysAreaStationVo> queryList(SysAreaStationBo bo) {
+        LambdaQueryWrapper<SysAreaStation> lqw = buildQueryWrapper(bo);
+        return baseMapper.selectVoList(lqw);
+    }
+
+    private LambdaQueryWrapper<SysAreaStation> buildQueryWrapper(SysAreaStationBo bo) {
+        Map<String, Object> params = bo.getParams();
+        LambdaQueryWrapper<SysAreaStation> lqw = Wrappers.lambdaQuery();
+        lqw.orderByDesc(SysAreaStation::getId);
+        return lqw;
+    }
+
+    /**
+     * 新增区域站点
+     *
+     * @param bo 区域站点
+     * @return 是否新增成功
+     */
+    @Override
+    public Boolean insertByBo(SysAreaStationBo bo) {
+        SysAreaStation add = MapstructUtils.convert(bo, SysAreaStation.class);
+        validEntityBeforeSave(add);
+        boolean flag = baseMapper.insert(add) > 0;
+        if (flag) {
+            bo.setId(add.getId());
+        }
+        return flag;
+    }
+
+    /**
+     * 修改区域站点
+     *
+     * @param bo 区域站点
+     * @return 是否修改成功
+     */
+    @Override
+    public Boolean updateByBo(SysAreaStationBo bo) {
+        SysAreaStation update = MapstructUtils.convert(bo, SysAreaStation.class);
+        validEntityBeforeSave(update);
+        return baseMapper.updateById(update) > 0;
+    }
+
+    /**
+     * 保存前的数据校验
+     */
+    private void validEntityBeforeSave(SysAreaStation entity){
+        //TODO 做一些数据校验,如唯一约束
+    }
+
+    /**
+     * 校验并批量删除区域站点信息
+     *
+     * @param ids     待删除的主键集合
+     * @param isValid 是否进行有效性校验
+     * @return 是否删除成功
+     */
+    @Override
+    public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
+        if(isValid){
+            //TODO 做一些业务上的校验,判断是否需要校验
+        }
+        return baseMapper.deleteByIds(ids) > 0;
+    }
+
+    @Override
+    public List<SysAreaStationTypeVo> listType() {
+        return AreaStationTypeEnum.list().stream().map(e -> {
+            SysAreaStationTypeVo vo = new SysAreaStationTypeVo();
+            vo.setValue(e.getValue());
+            vo.setLabel(e.getLabel());
+            vo.setStyle(e.getStyle());
+            return vo;
+        }).toList();
+    }
+
+    @Override
+    public List<SysAreaStationStatusVo> listStatus() {
+        return AreaStationStatusEnum.list().stream().map(e -> {
+            SysAreaStationStatusVo vo = new SysAreaStationStatusVo();
+            vo.setValue(e.getValue());
+            vo.setLabel(e.getLabel());
+            return vo;
+        }).toList();
+    }
+
+    @Override
+    public List<SysAreaStationOnStoreVo> listOnStore() {
+        return baseMapper.selectList().stream()
+            .map(e -> {
+                SysAreaStationOnStoreVo vo = new SysAreaStationOnStoreVo();
+                vo.setId(e.getId());
+                vo.setName(e.getName());
+                vo.setType(e.getType());
+                vo.setParentId(e.getParentId());
+                return vo;
+            })
+            .toList();
+    }
+}

+ 2 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysRoleServiceImpl.java

@@ -296,6 +296,8 @@ public class SysRoleServiceImpl implements ISysRoleService {
     @Transactional(rollbackFor = Exception.class)
     public int insertRole(SysRoleBo bo) {
         SysRole role = MapstructUtils.convert(bo, SysRole.class);
+        // 绑定平台 @author: Huanyi
+        role.setPlatformId(PlatformUtils.getId());
         // 新增角色信息
         baseMapper.insert(role);
         bo.setRoleId(role.getRoleId());

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

@@ -9,6 +9,7 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
+import org.dromara.system.domain.vo.SysTenantCategoriesOnStoreVo;
 import org.springframework.stereotype.Service;
 import org.dromara.system.domain.bo.SysTenantCategoriesBo;
 import org.dromara.system.domain.vo.SysTenantCategoriesVo;
@@ -134,4 +135,18 @@ public class SysTenantCategoriesServiceImpl implements ISysTenantCategoriesServi
         }
         return baseMapper.deleteByIds(ids) > 0;
     }
+
+    @Override
+    public TableDataInfo<SysTenantCategoriesOnStoreVo> listOnStore(PageQuery pageQuery) {
+        Page<SysTenantCategories> page = baseMapper.selectPage(
+            pageQuery.build(),
+            Wrappers.lambdaQuery(SysTenantCategories.class).orderByDesc(SysTenantCategories::getId)
+        );
+        return TableDataInfo.build(page.convert(e -> {
+            SysTenantCategoriesOnStoreVo vo = new SysTenantCategoriesOnStoreVo();
+            vo.setId(e.getId());
+            vo.setName(e.getName());
+            return vo;
+        }));
+    }
 }

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

@@ -29,6 +29,7 @@ import org.dromara.common.tenant.core.TenantEntity;
 import org.dromara.common.tenant.helper.TenantHelper;
 import org.dromara.system.domain.*;
 import org.dromara.system.domain.bo.SysTenantBo;
+import org.dromara.system.domain.vo.SysTenantOnStoreVo;
 import org.dromara.system.domain.vo.SysTenantVo;
 import org.dromara.system.mapper.*;
 import org.dromara.system.service.ISysTenantService;
@@ -116,6 +117,9 @@ public class SysTenantServiceImpl implements ISysTenantService {
         lqw.eq(bo.getAccountCount() != null, SysTenant::getAccountCount, bo.getAccountCount());
         lqw.eq(StringUtils.isNotBlank(bo.getStatus()), SysTenant::getStatus, bo.getStatus());
         lqw.orderByAsc(SysTenant::getId);
+
+        // 总控中心不属于商户 @author: Huanyi
+        lqw.ne(SysTenant::getTenantId, TenantConstants.DEFAULT_TENANT_ID);
         return lqw;
     }
 
@@ -581,4 +585,21 @@ public class SysTenantServiceImpl implements ISysTenantService {
         }
     }
 
+    @Override
+    public TableDataInfo<SysTenantOnStoreVo> listOnStore(PageQuery pageQuery) {
+
+        Page<SysTenant> page = baseMapper.selectPage(
+            pageQuery.build(),
+            Wrappers.lambdaQuery(SysTenant.class)
+                .ne(SysTenant::getTenantId, TenantConstants.DEFAULT_TENANT_ID)
+                .orderByDesc(SysTenant::getId)
+        );
+        return TableDataInfo.build(page.convert(e -> {
+            SysTenantOnStoreVo vo = new SysTenantOnStoreVo();
+            vo.setTenantId(e.getTenantId());
+            vo.setName(e.getCompanyName());
+            return vo;
+        }));
+    }
+
 }

+ 3 - 1
ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/RuoYiWorkflowApplication.java

@@ -1,5 +1,6 @@
 package org.dromara.workflow;
 
+import lombok.extern.slf4j.Slf4j;
 import org.apache.dubbo.config.spring.context.annotation.EnableDubbo;
 import org.springframework.boot.SpringApplication;
 import org.springframework.boot.autoconfigure.SpringBootApplication;
@@ -12,11 +13,12 @@ import org.springframework.boot.context.metrics.buffering.BufferingApplicationSt
  */
 @EnableDubbo
 @SpringBootApplication
+@Slf4j
 public class RuoYiWorkflowApplication {
     public static void main(String[] args) {
         SpringApplication application = new SpringApplication(RuoYiWorkflowApplication.class);
         application.setApplicationStartup(new BufferingApplicationStartup(2048));
         application.run(args);
-        System.out.println("(♥◠‿◠)ノ゙  工作流模块启动成功   ლ(´ڡ`ლ)゙  ");
+        log.info("(♥◠‿◠)ノ゙  工作流模块启动成功   ლ(´ڡ`ლ)゙  ");
     }
 }

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

@@ -0,0 +1,128 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+    <parent>
+        <groupId>org.dromara</groupId>
+        <artifactId>ruoyi-modules</artifactId>
+        <version>${revision}</version>
+    </parent>
+
+    <artifactId>yingpaipay-archieves</artifactId>
+    <dependencies>
+
+        <dependency>
+            <groupId>org.dromara</groupId>
+            <artifactId>ruoyi-common-nacos</artifactId>
+        </dependency>
+
+        <!-- RuoYi Common Log -->
+        <dependency>
+            <groupId>org.dromara</groupId>
+            <artifactId>ruoyi-common-log</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.dromara</groupId>
+            <artifactId>ruoyi-common-service-impl</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.dromara</groupId>
+            <artifactId>ruoyi-common-doc</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.dromara</groupId>
+            <artifactId>ruoyi-common-web</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.dromara</groupId>
+            <artifactId>ruoyi-common-mybatis</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.dromara</groupId>
+            <artifactId>ruoyi-common-dubbo</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.dromara</groupId>
+            <artifactId>ruoyi-common-seata</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.dromara</groupId>
+            <artifactId>ruoyi-common-idempotent</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.dromara</groupId>
+            <artifactId>ruoyi-common-tenant</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.dromara</groupId>
+            <artifactId>ruoyi-common-security</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.dromara</groupId>
+            <artifactId>ruoyi-common-translation</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.dromara</groupId>
+            <artifactId>ruoyi-common-sensitive</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.dromara</groupId>
+            <artifactId>ruoyi-common-encrypt</artifactId>
+        </dependency>
+
+        <!-- RuoYi Api System -->
+        <dependency>
+            <groupId>org.dromara</groupId>
+            <artifactId>ruoyi-api-system</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.dromara</groupId>
+            <artifactId>ruoyi-api-resource</artifactId>
+        </dependency>
+
+        <!-- RuoYi Api System -->
+        <dependency>
+            <groupId>org.dromara</groupId>
+            <artifactId>ruoyi-api-workflow</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.bouncycastle</groupId>
+            <artifactId>bcprov-jdk18on</artifactId>
+            <version>1.80</version>
+            <scope>compile</scope>
+        </dependency>
+
+    </dependencies>
+
+    <build>
+        <finalName>${project.artifactId}</finalName>
+        <plugins>
+            <plugin>
+                <groupId>org.springframework.boot</groupId>
+                <artifactId>spring-boot-maven-plugin</artifactId>
+                <version>${spring-boot.version}</version>
+                <executions>
+                    <execution>
+                        <goals>
+                            <goal>repackage</goal>
+                        </goals>
+                    </execution>
+                </executions>
+            </plugin>
+        </plugins>
+    </build>
+</project>

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

@@ -0,0 +1,19 @@
+package org.dromara.archieves;
+
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.boot.context.metrics.buffering.BufferingApplicationStartup;
+
+@SpringBootApplication
+@Slf4j
+public class YingpaipayArchievesApplication {
+
+    public static void main(String[] args) {
+        SpringApplication application = new SpringApplication(YingpaipayArchievesApplication.class);
+        application.setApplicationStartup(new BufferingApplicationStartup(2048));
+        application.run(args);
+        log.info("(♥◠‿◠)ノ゙  档案模块启动成功   ლ(´ڡ`ლ)゙  ");
+    }
+
+}

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

@@ -0,0 +1,35 @@
+# Tomcat
+server:
+  port: 9208
+
+# Spring
+spring:
+  application:
+    # 应用名称
+    name: yingpaipay-archieves
+  profiles:
+    # 环境配置
+    active: @profiles.active@
+
+--- # nacos 配置
+spring:
+  cloud:
+    nacos:
+      # nacos 服务地址
+      server-addr: @nacos.server@
+      username: @nacos.username@
+      password: @nacos.password@
+      discovery:
+        ip: 192.168.1.118
+        # 注册组
+        group: @nacos.discovery.group@
+        namespace: ${spring.profiles.active}
+      config:
+        # 配置组
+        group: @nacos.config.group@
+        namespace: ${spring.profiles.active}
+  config:
+    import:
+      - optional:nacos:application-common.yml
+      - optional:nacos:datasource.yml
+      - optional:nacos:${spring.application.name}.yml

+ 8 - 0
ruoyi-modules/yingpaipay-archieves/src/main/resources/banner.txt

@@ -0,0 +1,8 @@
+Spring Boot Version: ${spring-boot.version}
+Spring Application Name: ${spring.application.name}
+        .__                            .__                                                       .__
+ ___.__.|__| ____    ____ ___________  |__|__________  ___.__.           ______ ______________  _|__| ____  ____
+<   |  ||  |/    \  / ___\\____ \__  \ |  \____ \__  \<   |  |  ______  /  ___// __ \_  __ \  \/ /  |/ ___\/ __ \
+ \___  ||  |   |  \/ /_/  >  |_> > __ \|  |  |_> > __ \\___  | /_____/  \___ \\  ___/|  | \/\   /|  \  \__\  ___/
+ / ____||__|___|  /\___  /|   __(____  /__|   __(____  / ____|         /____  >\___  >__|    \_/ |__|\___  >___  >
+ \/             \//_____/ |__|       \/   |__|       \/\/                   \/     \/                    \/    \/

+ 28 - 0
ruoyi-modules/yingpaipay-archieves/src/main/resources/logback-plus.xml

@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<configuration scan="true" scanPeriod="60 seconds" debug="false">
+    <!-- 日志存放路径 -->
+	<property name="log.path" value="logs/${project.artifactId}" />
+   <!-- 日志输出格式 -->
+    <property name="console.log.pattern"
+              value="%cyan(%d{yyyy-MM-dd HH:mm:ss}) %green([%thread]) %highlight(%-5level) %boldMagenta(%logger{36}%n) - %msg%n"/>
+
+    <!-- 控制台输出 -->
+    <appender name="console" class="ch.qos.logback.core.ConsoleAppender">
+        <encoder>
+            <pattern>${console.log.pattern}</pattern>
+            <charset>utf-8</charset>
+        </encoder>
+    </appender>
+
+    <include resource="logback-common.xml" />
+
+    <include resource="logback-logstash.xml" />
+
+    <!-- 开启 skywalking 日志收集 -->
+    <include resource="logback-skylog.xml" />
+
+	<!--系统操作日志-->
+    <root level="info">
+        <appender-ref ref="console" />
+    </root>
+</configuration>

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

@@ -0,0 +1,130 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+    <parent>
+        <groupId>org.dromara</groupId>
+        <artifactId>ruoyi-modules</artifactId>
+        <version>${revision}</version>
+    </parent>
+
+    <artifactId>yingpaipay-fulfiller</artifactId>
+
+    <dependencies>
+
+        <dependency>
+            <groupId>org.dromara</groupId>
+            <artifactId>ruoyi-common-nacos</artifactId>
+        </dependency>
+
+        <!-- RuoYi Common Log -->
+        <dependency>
+            <groupId>org.dromara</groupId>
+            <artifactId>ruoyi-common-log</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.dromara</groupId>
+            <artifactId>ruoyi-common-service-impl</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.dromara</groupId>
+            <artifactId>ruoyi-common-doc</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.dromara</groupId>
+            <artifactId>ruoyi-common-web</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.dromara</groupId>
+            <artifactId>ruoyi-common-mybatis</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.dromara</groupId>
+            <artifactId>ruoyi-common-dubbo</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.dromara</groupId>
+            <artifactId>ruoyi-common-seata</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.dromara</groupId>
+            <artifactId>ruoyi-common-idempotent</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.dromara</groupId>
+            <artifactId>ruoyi-common-tenant</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.dromara</groupId>
+            <artifactId>ruoyi-common-security</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.dromara</groupId>
+            <artifactId>ruoyi-common-translation</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.dromara</groupId>
+            <artifactId>ruoyi-common-sensitive</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.dromara</groupId>
+            <artifactId>ruoyi-common-encrypt</artifactId>
+        </dependency>
+
+        <!-- RuoYi Api System -->
+        <dependency>
+            <groupId>org.dromara</groupId>
+            <artifactId>ruoyi-api-system</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.dromara</groupId>
+            <artifactId>ruoyi-api-resource</artifactId>
+        </dependency>
+
+        <!-- RuoYi Api System -->
+        <dependency>
+            <groupId>org.dromara</groupId>
+            <artifactId>ruoyi-api-workflow</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.bouncycastle</groupId>
+            <artifactId>bcprov-jdk18on</artifactId>
+            <version>1.80</version>
+            <scope>compile</scope>
+        </dependency>
+
+    </dependencies>
+
+    <build>
+        <finalName>${project.artifactId}</finalName>
+        <plugins>
+            <plugin>
+                <groupId>org.springframework.boot</groupId>
+                <artifactId>spring-boot-maven-plugin</artifactId>
+                <version>${spring-boot.version}</version>
+                <executions>
+                    <execution>
+                        <goals>
+                            <goal>repackage</goal>
+                        </goals>
+                    </execution>
+                </executions>
+            </plugin>
+        </plugins>
+    </build>
+
+</project>

+ 19 - 0
ruoyi-modules/yingpaipay-fulfiller/src/main/java/org/dromara/fulfiller/YingpaipayFulfillerApplication.java

@@ -0,0 +1,19 @@
+package org.dromara.fulfiller;
+
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.boot.context.metrics.buffering.BufferingApplicationStartup;
+
+@SpringBootApplication
+@Slf4j
+public class YingpaipayFulfillerApplication {
+
+    public static void main(String[] args) {
+        SpringApplication application = new SpringApplication(YingpaipayFulfillerApplication.class);
+        application.setApplicationStartup(new BufferingApplicationStartup(2048));
+        application.run(args);
+        log.info("(♥◠‿◠)ノ゙  履约者模块启动成功   ლ(´ڡ`ლ)゙  ");
+    }
+
+}

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

@@ -0,0 +1,35 @@
+# Tomcat
+server:
+  port: 9207
+
+# Spring
+spring:
+  application:
+    # 应用名称
+    name: yingpaipay-fulfiller
+  profiles:
+    # 环境配置
+    active: @profiles.active@
+
+--- # nacos 配置
+spring:
+  cloud:
+    nacos:
+      # nacos 服务地址
+      server-addr: @nacos.server@
+      username: @nacos.username@
+      password: @nacos.password@
+      discovery:
+        ip: 192.168.1.118
+        # 注册组
+        group: @nacos.discovery.group@
+        namespace: ${spring.profiles.active}
+      config:
+        # 配置组
+        group: @nacos.config.group@
+        namespace: ${spring.profiles.active}
+  config:
+    import:
+      - optional:nacos:application-common.yml
+      - optional:nacos:datasource.yml
+      - optional:nacos:${spring.application.name}.yml

+ 8 - 0
ruoyi-modules/yingpaipay-fulfiller/src/main/resources/banner.txt

@@ -0,0 +1,8 @@
+Spring Boot Version: ${spring-boot.version}
+Spring Application Name: ${spring.application.name}
+        .__                            .__                                                       .__
+ ___.__.|__| ____    ____ ___________  |__|__________  ___.__.           ______ ______________  _|__| ____  ____
+<   |  ||  |/    \  / ___\\____ \__  \ |  \____ \__  \<   |  |  ______  /  ___// __ \_  __ \  \/ /  |/ ___\/ __ \
+ \___  ||  |   |  \/ /_/  >  |_> > __ \|  |  |_> > __ \\___  | /_____/  \___ \\  ___/|  | \/\   /|  \  \__\  ___/
+ / ____||__|___|  /\___  /|   __(____  /__|   __(____  / ____|         /____  >\___  >__|    \_/ |__|\___  >___  >
+ \/             \//_____/ |__|       \/   |__|       \/\/                   \/     \/                    \/    \/

+ 28 - 0
ruoyi-modules/yingpaipay-fulfiller/src/main/resources/logback-plus.xml

@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<configuration scan="true" scanPeriod="60 seconds" debug="false">
+    <!-- 日志存放路径 -->
+	<property name="log.path" value="logs/${project.artifactId}" />
+   <!-- 日志输出格式 -->
+    <property name="console.log.pattern"
+              value="%cyan(%d{yyyy-MM-dd HH:mm:ss}) %green([%thread]) %highlight(%-5level) %boldMagenta(%logger{36}%n) - %msg%n"/>
+
+    <!-- 控制台输出 -->
+    <appender name="console" class="ch.qos.logback.core.ConsoleAppender">
+        <encoder>
+            <pattern>${console.log.pattern}</pattern>
+            <charset>utf-8</charset>
+        </encoder>
+    </appender>
+
+    <include resource="logback-common.xml" />
+
+    <include resource="logback-logstash.xml" />
+
+    <!-- 开启 skywalking 日志收集 -->
+    <include resource="logback-skylog.xml" />
+
+	<!--系统操作日志-->
+    <root level="info">
+        <appender-ref ref="console" />
+    </root>
+</configuration>

+ 130 - 0
ruoyi-modules/yingpaipay-service/pom.xml

@@ -0,0 +1,130 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+    <parent>
+        <groupId>org.dromara</groupId>
+        <artifactId>ruoyi-modules</artifactId>
+        <version>${revision}</version>
+    </parent>
+
+    <artifactId>yingpaipay-service</artifactId>
+
+    <dependencies>
+
+        <dependency>
+            <groupId>org.dromara</groupId>
+            <artifactId>ruoyi-common-nacos</artifactId>
+        </dependency>
+
+        <!-- RuoYi Common Log -->
+        <dependency>
+            <groupId>org.dromara</groupId>
+            <artifactId>ruoyi-common-log</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.dromara</groupId>
+            <artifactId>ruoyi-common-service-impl</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.dromara</groupId>
+            <artifactId>ruoyi-common-doc</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.dromara</groupId>
+            <artifactId>ruoyi-common-web</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.dromara</groupId>
+            <artifactId>ruoyi-common-mybatis</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.dromara</groupId>
+            <artifactId>ruoyi-common-dubbo</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.dromara</groupId>
+            <artifactId>ruoyi-common-seata</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.dromara</groupId>
+            <artifactId>ruoyi-common-idempotent</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.dromara</groupId>
+            <artifactId>ruoyi-common-tenant</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.dromara</groupId>
+            <artifactId>ruoyi-common-security</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.dromara</groupId>
+            <artifactId>ruoyi-common-translation</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.dromara</groupId>
+            <artifactId>ruoyi-common-sensitive</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.dromara</groupId>
+            <artifactId>ruoyi-common-encrypt</artifactId>
+        </dependency>
+
+        <!-- RuoYi Api System -->
+        <dependency>
+            <groupId>org.dromara</groupId>
+            <artifactId>ruoyi-api-system</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.dromara</groupId>
+            <artifactId>ruoyi-api-resource</artifactId>
+        </dependency>
+
+        <!-- RuoYi Api System -->
+        <dependency>
+            <groupId>org.dromara</groupId>
+            <artifactId>ruoyi-api-workflow</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.bouncycastle</groupId>
+            <artifactId>bcprov-jdk18on</artifactId>
+            <version>1.80</version>
+            <scope>compile</scope>
+        </dependency>
+
+    </dependencies>
+
+    <build>
+        <finalName>${project.artifactId}</finalName>
+        <plugins>
+            <plugin>
+                <groupId>org.springframework.boot</groupId>
+                <artifactId>spring-boot-maven-plugin</artifactId>
+                <version>${spring-boot.version}</version>
+                <executions>
+                    <execution>
+                        <goals>
+                            <goal>repackage</goal>
+                        </goals>
+                    </execution>
+                </executions>
+            </plugin>
+        </plugins>
+    </build>
+
+</project>

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

@@ -0,0 +1,19 @@
+package org.dromara.service;
+
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.boot.context.metrics.buffering.BufferingApplicationStartup;
+
+@SpringBootApplication
+@Slf4j
+public class YingpaipayServiceApplication {
+
+    public static void main(String[] args) {
+        SpringApplication application = new SpringApplication(YingpaipayServiceApplication.class);
+        application.setApplicationStartup(new BufferingApplicationStartup(2048));
+        application.run(args);
+        log.info("(♥◠‿◠)ノ゙  服务项目模块启动成功   ლ(´ڡ`ლ)゙  ");
+    }
+
+}

+ 114 - 0
ruoyi-modules/yingpaipay-service/src/main/java/org/dromara/service/controller/SysServiceController.java

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

+ 25 - 0
ruoyi-modules/yingpaipay-service/src/main/java/org/dromara/service/controller/SysServiceModeController.java

@@ -0,0 +1,25 @@
+package org.dromara.service.controller;
+
+import lombok.RequiredArgsConstructor;
+import org.dromara.common.core.domain.R;
+import org.dromara.service.domain.vo.SysServiceModeVo;
+import org.dromara.service.service.ISysServiceModeService;
+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;
+
+@RestController
+@RequestMapping("/mode")
+@RequiredArgsConstructor
+public class SysServiceModeController {
+
+    private final ISysServiceModeService modeService;
+
+    @GetMapping("/list")
+    public R<List<SysServiceModeVo>> list() {
+        return R.ok(modeService.list());
+    }
+
+}

+ 64 - 0
ruoyi-modules/yingpaipay-service/src/main/java/org/dromara/service/domain/SysService.java

@@ -0,0 +1,64 @@
+package org.dromara.service.domain;
+
+import org.dromara.common.mybatis.core.domain.BaseEntity;
+import com.baomidou.mybatisplus.annotation.*;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.dromara.common.translation.annotation.Translation;
+import org.dromara.common.translation.constant.TransConstant;
+
+import java.io.Serial;
+
+/**
+ * 服务列表对象 sys_service
+ *
+ * @author Huanyi
+ * @date 2026-02-25
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@TableName("sys_service")
+public class SysService extends BaseEntity {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 序号
+     */
+    @TableId(value = "id")
+    private Long id;
+
+    /**
+     * 服务名称
+     */
+    private String name;
+
+    /**
+     * 服务图标
+     */
+    private Long icon;
+
+    /**
+     * 服务模式
+     */
+    private Integer mode;
+
+    /**
+     * 排序权重
+     */
+    private Long sort;
+
+    /**
+     * 备注说明
+     */
+    private String remark;
+
+    /**
+     * 删除标志(0代表存在 1代表删除)
+     */
+    @TableLogic
+    private String delFlag;
+
+
+}

+ 60 - 0
ruoyi-modules/yingpaipay-service/src/main/java/org/dromara/service/domain/bo/SysServiceBo.java

@@ -0,0 +1,60 @@
+package org.dromara.service.domain.bo;
+
+import org.dromara.service.domain.SysService;
+import org.dromara.common.mybatis.core.domain.BaseEntity;
+import org.dromara.common.core.validate.AddGroup;
+import org.dromara.common.core.validate.EditGroup;
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import jakarta.validation.constraints.*;
+import org.dromara.common.translation.annotation.Translation;
+import org.dromara.common.translation.constant.TransConstant;
+
+/**
+ * 服务列表业务对象 sys_service
+ *
+ * @author Huanyi
+ * @date 2026-02-25
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@AutoMapper(target = SysService.class, reverseConvertGenerate = false)
+public class SysServiceBo extends BaseEntity {
+
+    /**
+     * 序号
+     */
+    @NotNull(message = "序号不能为空", groups = { EditGroup.class })
+    private Long id;
+
+    /**
+     * 服务名称
+     */
+    @NotBlank(message = "服务名称不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String name;
+
+    /**
+     * 服务图标
+     */
+    @NotNull(message = "服务图标不能为空", groups = { AddGroup.class, EditGroup.class })
+    private Long icon;
+
+    /**
+     * 服务模式
+     */
+    @NotNull(message = "服务模式不能为空", groups = { AddGroup.class, EditGroup.class })
+    private Integer mode;
+
+    /**
+     * 排序权重
+     */
+    private Long sort;
+
+    /**
+     * 备注说明
+     */
+    private String remark;
+
+
+}

+ 18 - 0
ruoyi-modules/yingpaipay-service/src/main/java/org/dromara/service/domain/vo/SysServiceModeVo.java

@@ -0,0 +1,18 @@
+package org.dromara.service.domain.vo;
+
+import lombok.Data;
+
+import java.io.Serial;
+import java.io.Serializable;
+
+@Data
+public class SysServiceModeVo implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    private Integer value;
+
+    private String label;
+
+}

+ 18 - 0
ruoyi-modules/yingpaipay-service/src/main/java/org/dromara/service/domain/vo/SysServiceOnStoreVo.java

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

+ 81 - 0
ruoyi-modules/yingpaipay-service/src/main/java/org/dromara/service/domain/vo/SysServiceVo.java

@@ -0,0 +1,81 @@
+package org.dromara.service.domain.vo;
+
+import org.dromara.common.translation.annotation.Translation;
+import org.dromara.common.translation.constant.TransConstant;
+import org.dromara.service.domain.SysService;
+import cn.idev.excel.annotation.ExcelIgnoreUnannotated;
+import cn.idev.excel.annotation.ExcelProperty;
+import org.dromara.common.excel.annotation.ExcelDictFormat;
+import org.dromara.common.excel.convert.ExcelDictConvert;
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.util.Date;
+
+
+
+/**
+ * 服务列表视图对象 sys_service
+ *
+ * @author Huanyi
+ * @date 2026-02-25
+ */
+@Data
+@ExcelIgnoreUnannotated
+@AutoMapper(target = SysService.class)
+public class SysServiceVo implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 序号
+     */
+    @ExcelProperty(value = "序号")
+    private Long id;
+
+    /**
+     * 服务名称
+     */
+    @ExcelProperty(value = "服务名称")
+    private String name;
+
+    /**
+     * 服务图标
+     */
+    @ExcelProperty(value = "服务图标")
+    private Long icon;
+
+    /**
+     * 服务图标Url
+     */
+    @Translation(type = TransConstant.OSS_ID_TO_URL, mapper = "icon")
+    private String iconUrl;
+    /**
+     * 服务模式
+     */
+    @ExcelProperty(value = "服务模式")
+    private Integer mode;
+
+    /**
+     * 排序权重
+     */
+    @ExcelProperty(value = "排序权重")
+    private Long sort;
+
+    /**
+     * 备注说明
+     */
+    @ExcelProperty(value = "备注说明")
+    private String remark;
+
+    /**
+     * 创建时间
+     */
+    @ExcelProperty(value = "创建时间")
+    private Date createTime;
+
+
+}

+ 25 - 0
ruoyi-modules/yingpaipay-service/src/main/java/org/dromara/service/enums/ServiceModeEnum.java

@@ -0,0 +1,25 @@
+package org.dromara.service.enums;
+
+import lombok.AccessLevel;
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+import java.util.Arrays;
+import java.util.List;
+
+@Getter
+@AllArgsConstructor(access = AccessLevel.PRIVATE)
+public enum ServiceModeEnum {
+
+    ONEWAY_SINGLETRIP(0, "单程/单次"),
+    ROUNDTRIP_RETURNTRIP(1, "往返/双程"),
+    ;
+
+    private final Integer value;
+    private final String label;
+
+    public static List<ServiceModeEnum> list() {
+        return Arrays.stream(values()).toList();
+    }
+
+}

+ 15 - 0
ruoyi-modules/yingpaipay-service/src/main/java/org/dromara/service/mapper/SysServiceMapper.java

@@ -0,0 +1,15 @@
+package org.dromara.service.mapper;
+
+import org.dromara.service.domain.SysService;
+import org.dromara.service.domain.vo.SysServiceVo;
+import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
+
+/**
+ * 服务列表Mapper接口
+ *
+ * @author Huanyi
+ * @date 2026-02-25
+ */
+public interface SysServiceMapper extends BaseMapperPlus<SysService, SysServiceVo> {
+
+}

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

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

+ 72 - 0
ruoyi-modules/yingpaipay-service/src/main/java/org/dromara/service/service/ISysServiceService.java

@@ -0,0 +1,72 @@
+package org.dromara.service.service;
+
+import org.dromara.service.domain.SysService;
+import org.dromara.service.domain.vo.SysServiceOnStoreVo;
+import org.dromara.service.domain.vo.SysServiceVo;
+import org.dromara.service.domain.bo.SysServiceBo;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.common.mybatis.core.page.PageQuery;
+
+import java.util.Collection;
+import java.util.List;
+
+/**
+ * 服务列表Service接口
+ *
+ * @author Huanyi
+ * @date 2026-02-25
+ */
+public interface ISysServiceService {
+
+    /**
+     * 查询服务列表
+     *
+     * @param id 主键
+     * @return 服务列表
+     */
+    SysServiceVo queryById(Long id);
+
+    /**
+     * 分页查询服务列表列表
+     *
+     * @param bo        查询条件
+     * @param pageQuery 分页参数
+     * @return 服务列表分页列表
+     */
+    TableDataInfo<SysServiceVo> queryPageList(SysServiceBo bo, PageQuery pageQuery);
+
+    /**
+     * 查询符合条件的服务列表列表
+     *
+     * @param bo 查询条件
+     * @return 服务列表列表
+     */
+    List<SysServiceVo> queryList(SysServiceBo bo);
+
+    /**
+     * 新增服务列表
+     *
+     * @param bo 服务列表
+     * @return 是否新增成功
+     */
+    Boolean insertByBo(SysServiceBo bo);
+
+    /**
+     * 修改服务列表
+     *
+     * @param bo 服务列表
+     * @return 是否修改成功
+     */
+    Boolean updateByBo(SysServiceBo bo);
+
+    /**
+     * 校验并批量删除服务列表信息
+     *
+     * @param ids     待删除的主键集合
+     * @param isValid 是否进行有效性校验
+     * @return 是否删除成功
+     */
+    Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
+
+    List<SysServiceOnStoreVo> listOnStore();
+}

+ 23 - 0
ruoyi-modules/yingpaipay-service/src/main/java/org/dromara/service/service/impl/SysServiceModeServiceImpl.java

@@ -0,0 +1,23 @@
+package org.dromara.service.service.impl;
+
+import org.dromara.service.domain.vo.SysServiceModeVo;
+import org.dromara.service.enums.ServiceModeEnum;
+import org.dromara.service.service.ISysServiceModeService;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+@Service
+public class SysServiceModeServiceImpl implements ISysServiceModeService {
+
+    @Override
+    public List<SysServiceModeVo> list() {
+        return ServiceModeEnum.list().stream().map(e -> {
+            SysServiceModeVo vo = new SysServiceModeVo();
+            vo.setValue(e.getValue());
+            vo.setLabel(e.getLabel());
+            return vo;
+        }).toList();
+    }
+
+}

+ 142 - 0
ruoyi-modules/yingpaipay-service/src/main/java/org/dromara/service/service/impl/SysServiceServiceImpl.java

@@ -0,0 +1,142 @@
+package org.dromara.service.service.impl;
+
+import org.dromara.common.core.utils.MapstructUtils;
+import org.dromara.common.core.utils.StringUtils;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.common.mybatis.core.page.PageQuery;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.dromara.service.domain.vo.SysServiceOnStoreVo;
+import org.springframework.stereotype.Service;
+import org.dromara.service.domain.bo.SysServiceBo;
+import org.dromara.service.domain.vo.SysServiceVo;
+import org.dromara.service.domain.SysService;
+import org.dromara.service.mapper.SysServiceMapper;
+import org.dromara.service.service.ISysServiceService;
+
+import java.util.List;
+import java.util.Map;
+import java.util.Collection;
+
+/**
+ * 服务列表Service业务层处理
+ *
+ * @author Huanyi
+ * @date 2026-02-25
+ */
+@Slf4j
+@RequiredArgsConstructor
+@Service
+public class SysServiceServiceImpl implements ISysServiceService {
+
+    private final SysServiceMapper baseMapper;
+
+    /**
+     * 查询服务列表
+     *
+     * @param id 主键
+     * @return 服务列表
+     */
+    @Override
+    public SysServiceVo queryById(Long id){
+        return baseMapper.selectVoById(id);
+    }
+
+    /**
+     * 分页查询服务列表列表
+     *
+     * @param bo        查询条件
+     * @param pageQuery 分页参数
+     * @return 服务列表分页列表
+     */
+    @Override
+    public TableDataInfo<SysServiceVo> queryPageList(SysServiceBo bo, PageQuery pageQuery) {
+        LambdaQueryWrapper<SysService> lqw = buildQueryWrapper(bo);
+        Page<SysServiceVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
+        return TableDataInfo.build(result);
+    }
+
+    /**
+     * 查询符合条件的服务列表列表
+     *
+     * @param bo 查询条件
+     * @return 服务列表列表
+     */
+    @Override
+    public List<SysServiceVo> queryList(SysServiceBo bo) {
+        LambdaQueryWrapper<SysService> lqw = buildQueryWrapper(bo);
+        return baseMapper.selectVoList(lqw);
+    }
+
+    private LambdaQueryWrapper<SysService> buildQueryWrapper(SysServiceBo bo) {
+        Map<String, Object> params = bo.getParams();
+        LambdaQueryWrapper<SysService> lqw = Wrappers.lambdaQuery();
+        lqw.orderByAsc(SysService::getSort);
+        return lqw;
+    }
+
+    /**
+     * 新增服务列表
+     *
+     * @param bo 服务列表
+     * @return 是否新增成功
+     */
+    @Override
+    public Boolean insertByBo(SysServiceBo bo) {
+        SysService add = MapstructUtils.convert(bo, SysService.class);
+        validEntityBeforeSave(add);
+        boolean flag = baseMapper.insert(add) > 0;
+        if (flag) {
+            bo.setId(add.getId());
+        }
+        return flag;
+    }
+
+    /**
+     * 修改服务列表
+     *
+     * @param bo 服务列表
+     * @return 是否修改成功
+     */
+    @Override
+    public Boolean updateByBo(SysServiceBo bo) {
+        SysService update = MapstructUtils.convert(bo, SysService.class);
+        validEntityBeforeSave(update);
+        return baseMapper.updateById(update) > 0;
+    }
+
+    /**
+     * 保存前的数据校验
+     */
+    private void validEntityBeforeSave(SysService entity){
+        //TODO 做一些数据校验,如唯一约束
+    }
+
+    /**
+     * 校验并批量删除服务列表信息
+     *
+     * @param ids     待删除的主键集合
+     * @param isValid 是否进行有效性校验
+     * @return 是否删除成功
+     */
+    @Override
+    public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
+        if(isValid){
+            //TODO 做一些业务上的校验,判断是否需要校验
+        }
+        return baseMapper.deleteByIds(ids) > 0;
+    }
+
+    @Override
+    public List<SysServiceOnStoreVo> listOnStore() {
+        return baseMapper.selectList().stream().map(e -> {
+            SysServiceOnStoreVo vo = new SysServiceOnStoreVo();
+            vo.setId(e.getId());
+            vo.setName(e.getName());
+            return vo;
+        }).toList();
+    }
+}

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

@@ -0,0 +1,35 @@
+# Tomcat
+server:
+  port: 9206
+
+# Spring
+spring:
+  application:
+    # 应用名称
+    name: yingpaipay-service
+  profiles:
+    # 环境配置
+    active: @profiles.active@
+
+--- # nacos 配置
+spring:
+  cloud:
+    nacos:
+      # nacos 服务地址
+      server-addr: @nacos.server@
+      username: @nacos.username@
+      password: @nacos.password@
+      discovery:
+        ip: 192.168.1.118
+        # 注册组
+        group: @nacos.discovery.group@
+        namespace: ${spring.profiles.active}
+      config:
+        # 配置组
+        group: @nacos.config.group@
+        namespace: ${spring.profiles.active}
+  config:
+    import:
+      - optional:nacos:application-common.yml
+      - optional:nacos:datasource.yml
+      - optional:nacos:${spring.application.name}.yml

+ 8 - 0
ruoyi-modules/yingpaipay-service/src/main/resources/banner.txt

@@ -0,0 +1,8 @@
+Spring Boot Version: ${spring-boot.version}
+Spring Application Name: ${spring.application.name}
+        .__                            .__                                                       .__
+ ___.__.|__| ____    ____ ___________  |__|__________  ___.__.           ______ ______________  _|__| ____  ____
+<   |  ||  |/    \  / ___\\____ \__  \ |  \____ \__  \<   |  |  ______  /  ___// __ \_  __ \  \/ /  |/ ___\/ __ \
+ \___  ||  |   |  \/ /_/  >  |_> > __ \|  |  |_> > __ \\___  | /_____/  \___ \\  ___/|  | \/\   /|  \  \__\  ___/
+ / ____||__|___|  /\___  /|   __(____  /__|   __(____  / ____|         /____  >\___  >__|    \_/ |__|\___  >___  >
+ \/             \//_____/ |__|       \/   |__|       \/\/                   \/     \/                    \/    \/

+ 28 - 0
ruoyi-modules/yingpaipay-service/src/main/resources/logback-plus.xml

@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<configuration scan="true" scanPeriod="60 seconds" debug="false">
+    <!-- 日志存放路径 -->
+	<property name="log.path" value="logs/${project.artifactId}" />
+   <!-- 日志输出格式 -->
+    <property name="console.log.pattern"
+              value="%cyan(%d{yyyy-MM-dd HH:mm:ss}) %green([%thread]) %highlight(%-5level) %boldMagenta(%logger{36}%n) - %msg%n"/>
+
+    <!-- 控制台输出 -->
+    <appender name="console" class="ch.qos.logback.core.ConsoleAppender">
+        <encoder>
+            <pattern>${console.log.pattern}</pattern>
+            <charset>utf-8</charset>
+        </encoder>
+    </appender>
+
+    <include resource="logback-common.xml" />
+
+    <include resource="logback-logstash.xml" />
+
+    <!-- 开启 skywalking 日志收集 -->
+    <include resource="logback-skylog.xml" />
+
+	<!--系统操作日志-->
+    <root level="info">
+        <appender-ref ref="console" />
+    </root>
+</configuration>

+ 47 - 2
script/sql/business/create.sql

@@ -30,8 +30,8 @@ CREATE TABLE `pet_system`.`sys_store`
     `site`                bigint COMMENT '归属站点',
     `detail_address`      varchar(255) COMMENT '详细地址',
     `status`              tinyint            NOT NULL DEFAULT 0 COMMENT '状态',
-    `longitude`           float COMMENT '经度',
-    `latitude`            float COMMENT '维度',
+    `longitude`           decimal(20, 4) COMMENT '经度',
+    `latitude`            decimal(20, 4) COMMENT '维度',
     `del_flag`            char(1)                     DEFAULT '0' COMMENT '删除标志(0代表存在 1代表删除)',
     `tenant_id`           varchar(20)        NOT NULL COMMENT '租户编号',
     `create_dept`         bigint(20) COMMENT '创建部门',
@@ -40,3 +40,48 @@ CREATE TABLE `pet_system`.`sys_store`
     `update_by`           bigint(20) COMMENT '更新者',
     `update_time`         datetime COMMENT '更新时间'
 ) ENGINE = innoDB COMMENT = '门店表';
+
+# 2026/02/25
+CREATE TABLE `pet_system`.`sys_service`
+(
+    `id`          bigint PRIMARY KEY NOT NULL COMMENT '序号',
+    `name`        varchar(64)        NOT NULL COMMENT '服务名称',
+    `icon`        bigint             NOT NULL COMMENT '服务图标',
+    `mode`        tinyint            NOT NULL COMMENT '服务模式',
+    `sort`        bigint  DEFAULT 0 COMMENT '排序权重',
+    `remark`      varchar(255) COMMENT '备注说明',
+    `del_flag`    char(1) DEFAULT '0' COMMENT '删除标志(0代表存在 1代表删除)',
+    `create_dept` bigint(20) COMMENT '创建部门',
+    `create_by`   bigint(20) COMMENT '创建者',
+    `create_time` datetime COMMENT '创建时间',
+    `update_by`   bigint(20) COMMENT '更新者',
+    `update_time` datetime COMMENT '更新时间'
+) ENGINE = innoDB COMMENT = '服务项目表';
+
+CREATE TABLE `pet_system`.`sys_area_station`
+(
+    `id`            bigint PRIMARY KEY NOT NULL COMMENT '序号',
+    `name`          varchar(100)       NOT NULL COMMENT '区域名称',
+    `parent_id`     bigint(20) DEFAULT 0 COMMENT '父级ID',
+    `code`          varchar(50) COMMENT '省市编码',
+    `sort`          bigint     DEFAULT 0 COMMENT '排序权重',
+    `address`       varchar(255) COMMENT '详细地址',
+    `leader_name`   varchar(64) COMMENT '站长姓名',
+    `contact_phone` varchar(32) COMMENT '联系电话',
+    `longitude`     decimal(20, 6) COMMENT '经度',
+    `latitude`      decimal(20, 6) COMMENT '纬度',
+    `type`          tinyint            NOT NULL COMMENT '类型',
+    `status`        tinyint    DEFAULT 0 COMMENT '状态 (0:启用, 1:禁用)',
+    `del_flag`      char(1)    DEFAULT '0' COMMENT '删除标志(0代表存在 1代表删除)',
+    `create_dept`   bigint(20) COMMENT '创建部门',
+    `create_by`     bigint(20) COMMENT '创建者',
+    `create_time`   datetime COMMENT '创建时间',
+    `update_by`     bigint(20) COMMENT '更新者',
+    `update_time`   datetime COMMENT '更新时间'
+) ENGINE = innoDB COMMENT = '区域站点表';
+
+CREATE TABLE `pet_system`.`sys_store_service`
+(
+    `store_id`       bigint PRIMARY KEY  NOT NULL COMMENT '门店ID',
+    `service_ids`    varchar(255)        NOT NULL COMMENT '服务ID'
+) ENGINE = innoDB COMMENT = '门店服务关系表';

+ 46 - 0
script/sql/business/update.sql

@@ -51,3 +51,49 @@ values(2026190519642099718, '门店管理导出', 2026190519642099713, '5',  '#'
 
 ALTER TABLE `pet_system`.`sys_dept` ADD COLUMN `platform_id` tinyint NOT NULL COMMENT '平台ID';
 ALTER TABLE `pet_system`.`sys_post` ADD COLUMN `platform_id` tinyint NOT NULL COMMENT '平台ID';
+
+# 2026/02/25
+-- 菜单 SQL
+insert into sys_menu (menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark, platform_id)
+values(2026533580326912001, '服务列表', '2020736413590941698', '1', 'list', 'service/list/index', 1, 0, 'C', '0', '0', 'service:list:list', '#', 103, 1, sysdate(), null, null, '服务列表菜单', 0);
+
+-- 按钮 SQL
+insert into sys_menu (menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark, platform_id)
+values(2026533580326912002, '服务列表查询', 2026533580326912001, '1',  '#', '', 1, 0, 'F', '0', '0', 'service:list:query',        '#', 103, 1, sysdate(), null, null, '', 0);
+
+insert into sys_menu (menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark, platform_id)
+values(2026533580326912003, '服务列表新增', 2026533580326912001, '2',  '#', '', 1, 0, 'F', '0', '0', 'service:list:add',          '#', 103, 1, sysdate(), null, null, '', 0);
+
+insert into sys_menu (menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark, platform_id)
+values(2026533580326912004, '服务列表修改', 2026533580326912001, '3',  '#', '', 1, 0, 'F', '0', '0', 'service:list:edit',         '#', 103, 1, sysdate(), null, null, '', 0);
+
+insert into sys_menu (menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark, platform_id)
+values(2026533580326912005, '服务列表删除', 2026533580326912001, '4',  '#', '', 1, 0, 'F', '0', '0', 'service:list:remove',       '#', 103, 1, sysdate(), null, null, '', 0);
+
+insert into sys_menu (menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark, platform_id)
+values(2026533580326912006, '服务列表导出', 2026533580326912001, '5',  '#', '', 1, 0, 'F', '0', '0', 'service:list:export',       '#', 103, 1, sysdate(), null, null, '', 0);
+
+-- 菜单 SQL
+insert into sys_menu (menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark, platform_id)
+values(2021464069248733192, '商户分类', '6', '12', 'tenantCategories', 'system/tenantCategories/index', 1, 0, 'C', '0', '0', 'system:tenantCategories:list', '#', 103, 1, sysdate(), null, null, '商户分类菜单', 0);
+
+-- 按钮 SQL
+-- 菜单 SQL
+insert into sys_menu (menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark, platform_id)
+values(2026556930960998402, '区域站点', '1', '1', 'areaStation', 'system/areaStation/index', 1, 0, 'C', '0', '0', 'system:areaStation:list', '#', 103, 1, sysdate(), null, null, '区域站点菜单', 0);
+
+-- 按钮 SQL
+insert into sys_menu (menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark, platform_id)
+values(2026556930960998403, '区域站点查询', 2026556930960998402, '1',  '#', '', 1, 0, 'F', '0', '0', 'system:areaStation:query',        '#', 103, 1, sysdate(), null, null, '', 0);
+
+insert into sys_menu (menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark, platform_id)
+values(2026556930960998404, '区域站点新增', 2026556930960998402, '2',  '#', '', 1, 0, 'F', '0', '0', 'system:areaStation:add',          '#', 103, 1, sysdate(), null, null, '', 0);
+
+insert into sys_menu (menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark, platform_id)
+values(2026556930960998405, '区域站点修改', 2026556930960998402, '3',  '#', '', 1, 0, 'F', '0', '0', 'system:areaStation:edit',         '#', 103, 1, sysdate(), null, null, '', 0);
+
+insert into sys_menu (menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark, platform_id)
+values(2026556930960998406, '区域站点删除', 2026556930960998402, '4',  '#', '', 1, 0, 'F', '0', '0', 'system:areaStation:remove',       '#', 103, 1, sysdate(), null, null, '', 0);
+
+insert into sys_menu (menu_id, menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark, platform_id)
+values(2026556930960998407, '区域站点导出', 2026556930960998402, '5',  '#', '', 1, 0, 'F', '0', '0', 'system:areaStation:export',       '#', 103, 1, sysdate(), null, null, '', 0);