Преглед на файлове

新建商户平台框架基本完成

Huanyi преди 1 месец
родител
ревизия
4b390514e1
променени са 30 файла, в които са добавени 878 реда и са изтрити 16 реда
  1. 2 1
      ruoyi-common/ruoyi-common-tenant/src/main/java/org/dromara/common/tenant/helper/TenantHelper.java
  2. 13 0
      ruoyi-common/yingpaipay-common-platform/src/main/java/org/dromara/common/platform/Platform.java
  3. 9 0
      ruoyi-common/yingpaipay-common-platform/src/main/java/org/dromara/common/platform/PlatformContants.java
  4. 12 0
      ruoyi-common/yingpaipay-common-platform/src/main/java/org/dromara/common/platform/PlatformInfo.java
  5. 2 1
      ruoyi-common/yingpaipay-common-platform/src/main/java/org/dromara/common/platform/PlatformUtils.java
  6. 6 0
      ruoyi-modules/ruoyi-gen/src/main/java/org/dromara/gen/constant/GenConstants.java
  7. 7 0
      ruoyi-modules/ruoyi-gen/src/main/java/org/dromara/gen/domain/GenTable.java
  8. 2 0
      ruoyi-modules/ruoyi-gen/src/main/java/org/dromara/gen/service/GenTableServiceImpl.java
  9. 18 0
      ruoyi-modules/ruoyi-gen/src/main/java/org/dromara/gen/util/VelocityUtils.java
  10. 12 12
      ruoyi-modules/ruoyi-gen/src/main/resources/vm/sql/sql.vm
  11. 28 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysPlatformController.java
  12. 106 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysStoreController.java
  13. 6 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysDept.java
  14. 6 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysPost.java
  15. 101 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysStore.java
  16. 102 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysStoreBo.java
  17. 18 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysPlatformVo.java
  18. 124 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysStoreVo.java
  19. 15 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysStoreMapper.java
  20. 9 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysPlatformService.java
  21. 69 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysStoreService.java
  22. 5 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysDeptServiceImpl.java
  23. 5 1
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysMenuServiceImpl.java
  24. 30 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysPlatformServiceImpl.java
  25. 5 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysPostServiceImpl.java
  26. 3 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysRoleServiceImpl.java
  27. 135 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysStoreServiceImpl.java
  28. 1 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysTenantServiceImpl.java
  29. 3 1
      script/sql/business/create.sql
  30. 24 0
      script/sql/business/update.sql

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

@@ -15,6 +15,7 @@ import org.dromara.common.core.utils.SpringUtils;
 import org.dromara.common.core.utils.StringUtils;
 import org.dromara.common.core.utils.reflect.ReflectUtils;
 import org.dromara.common.platform.Platform;
+import org.dromara.common.platform.PlatformContants;
 import org.dromara.common.redis.utils.RedisUtils;
 import org.dromara.common.satoken.utils.LoginHelper;
 
@@ -43,7 +44,7 @@ public class TenantHelper {
 
         // 通过平台进行分离 @author: Huanyi
         if (SaHolder.getContext().isValid()) {
-            String header = SaHolder.getRequest().getHeader("X-Platform-Code");
+            String header = SaHolder.getRequest().getHeader(PlatformContants.PLATFORM_HEADER);
             if (StringUtils.isNotBlank(header)) {
                 return Platform.isNotAdmin(header);
             }

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

@@ -4,6 +4,10 @@ import lombok.AccessLevel;
 import lombok.AllArgsConstructor;
 import lombok.Getter;
 
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
 /**
  * 平台分割,包含平台ID和平台码
  * @Author Huanyi
@@ -38,4 +42,13 @@ public enum Platform {
         }
         throw new IllegalArgumentException("未知平台");
     }
+
+    public static List<PlatformInfo> list() {
+        return Arrays.stream(values()).map(e -> {
+            PlatformInfo info = new PlatformInfo();
+            info.setId(e.id);
+            info.setLabel(e.label);
+            return info;
+        }).toList();
+    }
 }

+ 9 - 0
ruoyi-common/yingpaipay-common-platform/src/main/java/org/dromara/common/platform/PlatformContants.java

@@ -0,0 +1,9 @@
+package org.dromara.common.platform;
+
+public interface PlatformContants {
+
+    String PLATFORM_HEADER = "X-Platform-Code";
+
+    String PLATFORM_ID = "platformId";
+
+}

+ 12 - 0
ruoyi-common/yingpaipay-common-platform/src/main/java/org/dromara/common/platform/PlatformInfo.java

@@ -0,0 +1,12 @@
+package org.dromara.common.platform;
+
+import lombok.Data;
+
+@Data
+public class PlatformInfo {
+
+    private Integer id;
+
+    private String label;
+
+}

+ 2 - 1
ruoyi-common/yingpaipay-common-platform/src/main/java/org/dromara/common/platform/PlatformUtils.java

@@ -5,7 +5,8 @@ import cn.dev33.satoken.context.SaHolder;
 public class PlatformUtils {
 
     public static int getId() {
-        return Platform.getIdByCode(SaHolder.getRequest().getHeader("X-Platform-Code"));
+        String header = SaHolder.getRequest().getHeader(PlatformContants.PLATFORM_HEADER);
+        return Platform.getIdByCode(header);
     }
 
 }

+ 6 - 0
ruoyi-modules/ruoyi-gen/src/main/java/org/dromara/gen/constant/GenConstants.java

@@ -41,6 +41,12 @@ public interface GenConstants {
      */
     String PARENT_MENU_NAME = "parentMenuName";
 
+    /**
+     * 所属平台ID字段
+     * @Author: Huanyi
+     */
+    String PLATFORM_ID = "platformId";
+
     /**
      * 数据库字符串类型
      */

+ 7 - 0
ruoyi-modules/ruoyi-gen/src/main/java/org/dromara/gen/domain/GenTable.java

@@ -170,6 +170,13 @@ public class GenTable extends BaseEntity {
     @TableField(exist = false)
     private String parentMenuName;
 
+    /**
+     * 所属平台ID
+     * @Author Huanyi
+     */
+    @TableField(exist = false)
+    private Integer platformId;
+
     public boolean isTree() {
         return isTree(this.tplCategory);
     }

+ 2 - 0
ruoyi-modules/ruoyi-gen/src/main/java/org/dromara/gen/service/GenTableServiceImpl.java

@@ -548,12 +548,14 @@ public class GenTableServiceImpl implements IGenTableService {
             String treeName = paramsObj.getStr(GenConstants.TREE_NAME);
             Long parentMenuId = paramsObj.getLong(GenConstants.PARENT_MENU_ID);
             String parentMenuName = paramsObj.getStr(GenConstants.PARENT_MENU_NAME);
+            Integer platformId = paramsObj.getInt(GenConstants.PLATFORM_ID);
 
             genTable.setTreeCode(treeCode);
             genTable.setTreeParentCode(treeParentCode);
             genTable.setTreeName(treeName);
             genTable.setParentMenuId(parentMenuId);
             genTable.setParentMenuName(parentMenuName);
+            genTable.setPlatformId(platformId);
         }
     }
 

+ 18 - 0
ruoyi-modules/ruoyi-gen/src/main/java/org/dromara/gen/util/VelocityUtils.java

@@ -7,10 +7,12 @@ import lombok.AccessLevel;
 import lombok.NoArgsConstructor;
 import org.apache.velocity.VelocityContext;
 import org.dromara.common.core.utils.DateUtils;
+import org.dromara.common.core.utils.ObjectUtils;
 import org.dromara.common.core.utils.StringUtils;
 import org.dromara.common.json.utils.JsonUtils;
 import org.dromara.common.mybatis.enums.DataBaseType;
 import org.dromara.common.mybatis.helper.DataBaseHelper;
+import org.dromara.common.platform.Platform;
 import org.dromara.gen.constant.GenConstants;
 import org.dromara.gen.domain.GenTable;
 import org.dromara.gen.domain.GenTableColumn;
@@ -82,7 +84,23 @@ public class VelocityUtils {
         String options = genTable.getOptions();
         Dict paramsObj = JsonUtils.parseMap(options);
         String parentMenuId = getParentMenuId(paramsObj);
+        // 获取平台ID @author: Huanyi
+        Integer platformId = getPlatformId(paramsObj);
         context.put("parentMenuId", parentMenuId);
+        // 赋值 @author: Huanyi
+        context.put("platformId", platformId);
+    }
+
+    /**
+     * 根据 {@code options} 获取平台ID
+     * @Author Huanyi
+     */
+    private static Integer getPlatformId(Dict paramsObj) {
+        if (CollUtil.isNotEmpty(paramsObj) && paramsObj.containsKey(GenConstants.PLATFORM_ID)
+            && ObjectUtils.isNotNull(paramsObj.getInt(GenConstants.PLATFORM_ID))) {
+            return paramsObj.getInt(GenConstants.PLATFORM_ID);
+        }
+        return Platform.ADMIN.getId();
     }
 
     public static void setTreeVelocityContext(VelocityContext context, GenTable genTable) {

+ 12 - 12
ruoyi-modules/ruoyi-gen/src/main/resources/vm/sql/sql.vm

@@ -1,19 +1,19 @@
 -- 菜单 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)
-values(${table.menuIds[0]}, '${functionName}', '${parentMenuId}', '1', '${businessName}', '${moduleName}/${businessName}/index', 1, 0, 'C', '0', '0', '${permissionPrefix}:list', '#', 103, 1, sysdate(), null, null, '${functionName}菜单');
+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(${table.menuIds[0]}, '${functionName}', '${parentMenuId}', '1', '${businessName}', '${moduleName}/${businessName}/index', 1, 0, 'C', '0', '0', '${permissionPrefix}:list', '#', 103, 1, sysdate(), null, null, '${functionName}菜单', ${platformId});
 
 -- 按钮 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)
-values(${table.menuIds[1]}, '${functionName}查询', ${table.menuIds[0]}, '1',  '#', '', 1, 0, 'F', '0', '0', '${permissionPrefix}:query',        '#', 103, 1, sysdate(), null, null, '');
+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(${table.menuIds[1]}, '${functionName}查询', ${table.menuIds[0]}, '1',  '#', '', 1, 0, 'F', '0', '0', '${permissionPrefix}:query',        '#', 103, 1, sysdate(), null, null, '', ${platformId});
 
-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)
-values(${table.menuIds[2]}, '${functionName}新增', ${table.menuIds[0]}, '2',  '#', '', 1, 0, 'F', '0', '0', '${permissionPrefix}:add',          '#', 103, 1, sysdate(), null, null, '');
+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(${table.menuIds[2]}, '${functionName}新增', ${table.menuIds[0]}, '2',  '#', '', 1, 0, 'F', '0', '0', '${permissionPrefix}:add',          '#', 103, 1, sysdate(), null, null, '', ${platformId});
 
-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)
-values(${table.menuIds[3]}, '${functionName}修改', ${table.menuIds[0]}, '3',  '#', '', 1, 0, 'F', '0', '0', '${permissionPrefix}:edit',         '#', 103, 1, sysdate(), null, null, '');
+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(${table.menuIds[3]}, '${functionName}修改', ${table.menuIds[0]}, '3',  '#', '', 1, 0, 'F', '0', '0', '${permissionPrefix}:edit',         '#', 103, 1, sysdate(), null, null, '', ${platformId});
 
-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)
-values(${table.menuIds[4]}, '${functionName}删除', ${table.menuIds[0]}, '4',  '#', '', 1, 0, 'F', '0', '0', '${permissionPrefix}:remove',       '#', 103, 1, sysdate(), null, null, '');
+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(${table.menuIds[4]}, '${functionName}删除', ${table.menuIds[0]}, '4',  '#', '', 1, 0, 'F', '0', '0', '${permissionPrefix}:remove',       '#', 103, 1, sysdate(), null, null, '', ${platformId});
 
-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)
-values(${table.menuIds[5]}, '${functionName}导出', ${table.menuIds[0]}, '5',  '#', '', 1, 0, 'F', '0', '0', '${permissionPrefix}:export',       '#', 103, 1, sysdate(), null, null, '');
+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(${table.menuIds[5]}, '${functionName}导出', ${table.menuIds[0]}, '5',  '#', '', 1, 0, 'F', '0', '0', '${permissionPrefix}:export',       '#', 103, 1, sysdate(), null, null, '', ${platformId});

+ 28 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysPlatformController.java

@@ -0,0 +1,28 @@
+package org.dromara.system.controller.system;
+
+import lombok.RequiredArgsConstructor;
+import org.dromara.common.core.domain.R;
+import org.dromara.common.web.core.BaseController;
+import org.dromara.system.domain.vo.SysPlatformVo;
+import org.dromara.system.service.ISysPlatformService;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.List;
+
+@Validated
+@RequiredArgsConstructor
+@RestController
+@RequestMapping("/platform")
+public class SysPlatformController extends BaseController {
+
+    private final ISysPlatformService platformService;
+
+    @GetMapping("/list")
+    public R<List<SysPlatformVo>> listPlatform() {
+        return R.ok(platformService.list());
+    }
+
+}

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

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

+ 6 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysDept.java

@@ -90,4 +90,10 @@ public class SysDept extends TenantEntity {
     @TableField(exist = false)
     private List<SysDept> children = new ArrayList<>();
 
+    /**
+     * 平台ID
+     * @Author: Huanyi
+     */
+    private Integer platformId;
+
 }

+ 6 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysPost.java

@@ -58,4 +58,10 @@ public class SysPost extends TenantEntity {
      */
     private String remark;
 
+    /**
+     * 平台ID
+     * @Author: Huanyi
+     */
+    private Integer platformId;
+
 }

+ 101 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysStore.java

@@ -0,0 +1,101 @@
+package org.dromara.system.domain;
+
+import org.dromara.common.tenant.core.TenantEntity;
+import com.baomidou.mybatisplus.annotation.*;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.dromara.common.translation.annotation.Translation;
+import java.util.Date;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import org.dromara.common.translation.constant.TransConstant;
+
+import java.io.Serial;
+
+/**
+ * 门店管理对象 sys_store
+ *
+ * @author Huanyi
+ * @date 2026-02-24
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@TableName("sys_store")
+public class SysStore extends TenantEntity {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 序号
+     */
+    @TableId(value = "id")
+    private Long id;
+
+    /**
+     * LOGO
+     */
+    private Long logo;
+
+    /**
+     * 营业执照
+     */
+    private Long businessLicense;
+
+    /**
+     * 门店名称
+     */
+    private String name;
+
+    /**
+     * 商户分类
+     */
+    private Long tenantCatergories;
+
+    /**
+     * 开始营业时间
+     */
+    private Date startBusinessTime;
+
+    /**
+     * 结束营业时间
+     */
+    private Date endBusinessTime;
+
+    /**
+     * 联系人
+     */
+    private String contact;
+
+    /**
+     * 联系电话
+     */
+    private String contactNumber;
+
+    /**
+     * 有效期至
+     */
+    private Date validity;
+
+    /**
+     * 归属站点
+     */
+    private Long site;
+
+    /**
+     * 详细地址
+     */
+    private String detailAddress;
+
+    /**
+     * 状态
+     */
+    private Integer status;
+
+    /**
+     * 删除标志(0代表存在 1代表删除)
+     */
+    @TableLogic
+    private String delFlag;
+
+
+}

+ 102 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysStoreBo.java

@@ -0,0 +1,102 @@
+package org.dromara.system.domain.bo;
+
+import org.dromara.system.domain.SysStore;
+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 java.util.Date;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import org.dromara.common.translation.constant.TransConstant;
+
+/**
+ * 门店管理业务对象 sys_store
+ *
+ * @author Huanyi
+ * @date 2026-02-24
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@AutoMapper(target = SysStore.class, reverseConvertGenerate = false)
+public class SysStoreBo extends BaseEntity {
+
+    /**
+     * 序号
+     */
+    @NotNull(message = "序号不能为空", groups = { EditGroup.class })
+    private Long id;
+
+    /**
+     * LOGO
+     */
+    private Long logo;
+
+    /**
+     * 营业执照
+     */
+    @NotNull(message = "营业执照不能为空", groups = { AddGroup.class, EditGroup.class })
+    private Long businessLicense;
+
+    /**
+     * 门店名称
+     */
+    @NotBlank(message = "门店名称不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String name;
+
+    /**
+     * 商户分类
+     */
+    @NotNull(message = "商户分类不能为空", groups = { AddGroup.class, EditGroup.class })
+    private Long tenantCatergories;
+
+    /**
+     * 开始营业时间
+     */
+    @NotNull(message = "开始营业时间不能为空", groups = { AddGroup.class, EditGroup.class })
+    private Date startBusinessTime;
+
+    /**
+     * 结束营业时间
+     */
+    @NotNull(message = "结束营业时间不能为空", groups = { AddGroup.class, EditGroup.class })
+    private Date endBusinessTime;
+
+    /**
+     * 联系人
+     */
+    @NotBlank(message = "联系人不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String contact;
+
+    /**
+     * 联系电话
+     */
+    @NotBlank(message = "联系电话不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String contactNumber;
+
+    /**
+     * 有效期至
+     */
+    @NotNull(message = "有效期至不能为空", groups = { AddGroup.class, EditGroup.class })
+    private Date validity;
+
+    /**
+     * 归属站点
+     */
+    private Long site;
+
+    /**
+     * 详细地址
+     */
+    private String detailAddress;
+
+    /**
+     * 状态
+     */
+    private Integer status;
+
+
+}

+ 18 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysPlatformVo.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 SysPlatformVo implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    private Integer id;
+
+    private String label;
+
+}

+ 124 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysStoreVo.java

@@ -0,0 +1,124 @@
+package org.dromara.system.domain.vo;
+
+import org.dromara.common.translation.annotation.Translation;
+import java.util.Date;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import org.dromara.common.translation.constant.TransConstant;
+import org.dromara.system.domain.SysStore;
+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_store
+ *
+ * @author Huanyi
+ * @date 2026-02-24
+ */
+@Data
+@ExcelIgnoreUnannotated
+@AutoMapper(target = SysStore.class)
+public class SysStoreVo implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 序号
+     */
+    @ExcelProperty(value = "序号")
+    private Long id;
+
+    /**
+     * LOGO
+     */
+    @ExcelProperty(value = "LOGO")
+    private Long logo;
+
+    /**
+     * LOGOUrl
+     */
+    @Translation(type = TransConstant.OSS_ID_TO_URL, mapper = "logo")
+    private String logoUrl;
+    /**
+     * 营业执照
+     */
+    @ExcelProperty(value = "营业执照")
+    private Long businessLicense;
+
+    /**
+     * 营业执照Url
+     */
+    @Translation(type = TransConstant.OSS_ID_TO_URL, mapper = "businessLicense")
+    private String businessLicenseUrl;
+    /**
+     * 门店名称
+     */
+    @ExcelProperty(value = "门店名称")
+    private String name;
+
+    /**
+     * 商户分类
+     */
+    @ExcelProperty(value = "商户分类")
+    private Long tenantCatergories;
+
+    /**
+     * 开始营业时间
+     */
+    @ExcelProperty(value = "开始营业时间")
+    private Date startBusinessTime;
+
+    /**
+     * 结束营业时间
+     */
+    @ExcelProperty(value = "结束营业时间")
+    private Date endBusinessTime;
+
+    /**
+     * 联系人
+     */
+    @ExcelProperty(value = "联系人")
+    private String contact;
+
+    /**
+     * 联系电话
+     */
+    @ExcelProperty(value = "联系电话")
+    private String contactNumber;
+
+    /**
+     * 有效期至
+     */
+    @ExcelProperty(value = "有效期至")
+    private Date validity;
+
+    /**
+     * 归属站点
+     */
+    @ExcelProperty(value = "归属站点")
+    private Long site;
+
+    /**
+     * 详细地址
+     */
+    @ExcelProperty(value = "详细地址")
+    private String detailAddress;
+
+    /**
+     * 状态
+     */
+    @ExcelProperty(value = "状态")
+    private Integer status;
+
+
+}

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

@@ -0,0 +1,15 @@
+package org.dromara.system.mapper;
+
+import org.dromara.system.domain.SysStore;
+import org.dromara.system.domain.vo.SysStoreVo;
+import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
+
+/**
+ * 门店管理Mapper接口
+ *
+ * @author Huanyi
+ * @date 2026-02-24
+ */
+public interface SysStoreMapper extends BaseMapperPlus<SysStore, SysStoreVo> {
+
+}

+ 9 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysPlatformService.java

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

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

@@ -0,0 +1,69 @@
+package org.dromara.system.service;
+
+import org.dromara.system.domain.SysStore;
+import org.dromara.system.domain.vo.SysStoreVo;
+import org.dromara.system.domain.bo.SysStoreBo;
+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-24
+ */
+public interface ISysStoreService {
+
+    /**
+     * 查询门店管理
+     *
+     * @param id 主键
+     * @return 门店管理
+     */
+    SysStoreVo queryById(Long id);
+
+    /**
+     * 分页查询门店管理列表
+     *
+     * @param bo        查询条件
+     * @param pageQuery 分页参数
+     * @return 门店管理分页列表
+     */
+    TableDataInfo<SysStoreVo> queryPageList(SysStoreBo bo, PageQuery pageQuery);
+
+    /**
+     * 查询符合条件的门店管理列表
+     *
+     * @param bo 查询条件
+     * @return 门店管理列表
+     */
+    List<SysStoreVo> queryList(SysStoreBo bo);
+
+    /**
+     * 新增门店管理
+     *
+     * @param bo 门店管理
+     * @return 是否新增成功
+     */
+    Boolean insertByBo(SysStoreBo bo);
+
+    /**
+     * 修改门店管理
+     *
+     * @param bo 门店管理
+     * @return 是否修改成功
+     */
+    Boolean updateByBo(SysStoreBo bo);
+
+    /**
+     * 校验并批量删除门店管理信息
+     *
+     * @param ids     待删除的主键集合
+     * @param isValid 是否进行有效性校验
+     * @return 是否删除成功
+     */
+    Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
+}

+ 5 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysDeptServiceImpl.java

@@ -16,6 +16,7 @@ import org.dromara.common.core.utils.*;
 import org.dromara.common.mybatis.core.page.PageQuery;
 import org.dromara.common.mybatis.core.page.TableDataInfo;
 import org.dromara.common.mybatis.helper.DataBaseHelper;
+import org.dromara.common.platform.PlatformUtils;
 import org.dromara.common.redis.utils.CacheUtils;
 import org.dromara.common.satoken.utils.LoginHelper;
 import org.dromara.system.domain.SysDept;
@@ -111,6 +112,10 @@ public class SysDeptServiceImpl implements ISysDeptService {
                 x.in(SysDept::getDeptId, deptIds);
             });
         }
+
+        // 平台隔离 @author: Huanyi
+        lqw.eq(SysDept::getPlatformId, PlatformUtils.getId());
+
         return lqw;
     }
 

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

@@ -356,7 +356,9 @@ public class SysMenuServiceImpl implements ISysMenuService {
         boolean exist = baseMapper.exists(new LambdaQueryWrapper<SysMenu>()
             .eq(SysMenu::getMenuName, menu.getMenuName())
             .eq(SysMenu::getParentId, menu.getParentId())
-            .ne(ObjectUtil.isNotNull(menu.getMenuId()), SysMenu::getMenuId, menu.getMenuId()));
+            .ne(ObjectUtil.isNotNull(menu.getMenuId()), SysMenu::getMenuId, menu.getMenuId())
+            // 平台隔离 @author: Huanyi
+            .eq(SysMenu::getPlatformId, menu.getPlatformId()));
         return !exist;
     }
 
@@ -379,6 +381,8 @@ public class SysMenuServiceImpl implements ISysMenuService {
         List<SysMenu> sysMenuList = baseMapper.selectList(
             new LambdaQueryWrapper<SysMenu>()
                 .in(SysMenu::getMenuType, SystemConstants.TYPE_DIR, SystemConstants.TYPE_MENU)
+                // 平台隔离 @author: Huanyi
+                .eq(SysMenu::getPlatformId, menuBo.getPlatformId())
                 .and(w ->
                     w.eq(SysMenu::getPath, path).or().eq(SysMenu::getPath, routeName)
                 ));

+ 30 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysPlatformServiceImpl.java

@@ -0,0 +1,30 @@
+package org.dromara.system.service.impl;
+
+import org.dromara.common.platform.Platform;
+import org.dromara.system.domain.vo.SysPlatformVo;
+import org.dromara.system.service.ISysPlatformService;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+/**
+ * 代码生成关于平台ID的操作
+ * @Author: Huanyi
+ * @CreateTime: 2026/02/24
+ */
+
+@Service
+public class SysPlatformServiceImpl implements ISysPlatformService {
+
+    @Override
+    public List<SysPlatformVo> list() {
+        return Platform.list().stream()
+            .map(e -> {
+                SysPlatformVo vo = new SysPlatformVo();
+                vo.setId(e.getId());
+                vo.setLabel(e.getLabel());
+                return vo;
+            }).toList();
+    }
+
+}

+ 5 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysPostServiceImpl.java

@@ -13,6 +13,8 @@ import org.dromara.common.core.utils.StreamUtils;
 import org.dromara.common.core.utils.StringUtils;
 import org.dromara.common.mybatis.core.page.PageQuery;
 import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.common.platform.PlatformUtils;
+import org.dromara.system.domain.SysDept;
 import org.dromara.system.domain.SysPost;
 import org.dromara.system.domain.SysUserPost;
 import org.dromara.system.domain.bo.SysPostBo;
@@ -100,6 +102,9 @@ public class SysPostServiceImpl implements ISysPostService {
                 x.in(SysPost::getDeptId, deptIds);
             });
         }
+
+        // 平台隔离 @author: Huanyi
+        wrapper.eq(SysPost::getPlatformId, PlatformUtils.getId());
         return wrapper;
     }
 

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

@@ -20,6 +20,7 @@ import org.dromara.common.core.utils.StreamUtils;
 import org.dromara.common.core.utils.StringUtils;
 import org.dromara.common.mybatis.core.page.PageQuery;
 import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.common.platform.PlatformUtils;
 import org.dromara.common.satoken.utils.LoginHelper;
 import org.dromara.system.api.model.LoginUser;
 import org.dromara.system.domain.SysRole;
@@ -81,6 +82,8 @@ public class SysRoleServiceImpl implements ISysRoleService {
         Map<String, Object> params = bo.getParams();
         LambdaQueryWrapper<SysRole> wrapper = Wrappers.lambdaQuery();
         wrapper.eq(ObjectUtil.isNotNull(bo.getRoleId()), SysRole::getRoleId, bo.getRoleId())
+            // 平台隔离 @author: Huanyi
+            .eq(SysRole::getPlatformId, PlatformUtils.getId())
             .like(StringUtils.isNotBlank(bo.getRoleName()), SysRole::getRoleName, bo.getRoleName())
             .eq(StringUtils.isNotBlank(bo.getStatus()), SysRole::getStatus, bo.getStatus())
             .like(StringUtils.isNotBlank(bo.getRoleKey()), SysRole::getRoleKey, bo.getRoleKey())

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

@@ -0,0 +1,135 @@
+package org.dromara.system.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.springframework.stereotype.Service;
+import org.dromara.system.domain.bo.SysStoreBo;
+import org.dromara.system.domain.vo.SysStoreVo;
+import org.dromara.system.domain.SysStore;
+import org.dromara.system.mapper.SysStoreMapper;
+import org.dromara.system.service.ISysStoreService;
+
+import java.util.List;
+import java.util.Map;
+import java.util.Collection;
+
+/**
+ * 门店管理Service业务层处理
+ *
+ * @author Huanyi
+ * @date 2026-02-24
+ */
+@Slf4j
+@RequiredArgsConstructor
+@Service
+public class SysStoreServiceImpl implements ISysStoreService {
+
+    private final SysStoreMapper baseMapper;
+
+    /**
+     * 查询门店管理
+     *
+     * @param id 主键
+     * @return 门店管理
+     */
+    @Override
+    public SysStoreVo queryById(Long id){
+        return baseMapper.selectVoById(id);
+    }
+
+    /**
+     * 分页查询门店管理列表
+     *
+     * @param bo        查询条件
+     * @param pageQuery 分页参数
+     * @return 门店管理分页列表
+     */
+    @Override
+    public TableDataInfo<SysStoreVo> queryPageList(SysStoreBo bo, PageQuery pageQuery) {
+        LambdaQueryWrapper<SysStore> lqw = buildQueryWrapper(bo);
+        Page<SysStoreVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
+        return TableDataInfo.build(result);
+    }
+
+    /**
+     * 查询符合条件的门店管理列表
+     *
+     * @param bo 查询条件
+     * @return 门店管理列表
+     */
+    @Override
+    public List<SysStoreVo> queryList(SysStoreBo bo) {
+        LambdaQueryWrapper<SysStore> lqw = buildQueryWrapper(bo);
+        return baseMapper.selectVoList(lqw);
+    }
+
+    private LambdaQueryWrapper<SysStore> buildQueryWrapper(SysStoreBo bo) {
+        Map<String, Object> params = bo.getParams();
+        LambdaQueryWrapper<SysStore> lqw = Wrappers.lambdaQuery();
+        lqw.orderByDesc(SysStore::getId);
+        lqw.like(StringUtils.isNotBlank(bo.getName()), SysStore::getName, bo.getName());
+        lqw.like(StringUtils.isNotBlank(bo.getContact()), SysStore::getContact, bo.getContact());
+        lqw.eq(bo.getSite() != null, SysStore::getSite, bo.getSite());
+        lqw.eq(bo.getStatus() != null, SysStore::getStatus, bo.getStatus());
+        return lqw;
+    }
+
+    /**
+     * 新增门店管理
+     *
+     * @param bo 门店管理
+     * @return 是否新增成功
+     */
+    @Override
+    public Boolean insertByBo(SysStoreBo bo) {
+        SysStore add = MapstructUtils.convert(bo, SysStore.class);
+        validEntityBeforeSave(add);
+        boolean flag = baseMapper.insert(add) > 0;
+        if (flag) {
+            bo.setId(add.getId());
+        }
+        return flag;
+    }
+
+    /**
+     * 修改门店管理
+     *
+     * @param bo 门店管理
+     * @return 是否修改成功
+     */
+    @Override
+    public Boolean updateByBo(SysStoreBo bo) {
+        SysStore update = MapstructUtils.convert(bo, SysStore.class);
+        validEntityBeforeSave(update);
+        return baseMapper.updateById(update) > 0;
+    }
+
+    /**
+     * 保存前的数据校验
+     */
+    private void validEntityBeforeSave(SysStore entity){
+        //TODO 做一些数据校验,如唯一约束
+    }
+
+    /**
+     * 校验并批量删除门店管理信息
+     *
+     * @param ids     待删除的主键集合
+     * @param isValid 是否进行有效性校验
+     * @return 是否删除成功
+     */
+    @Override
+    public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
+        if(isValid){
+            //TODO 做一些业务上的校验,判断是否需要校验
+        }
+        return baseMapper.deleteByIds(ids) > 0;
+    }
+}

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

@@ -151,6 +151,7 @@ public class SysTenantServiceImpl implements ISysTenantService {
         dept.setDeptName(bo.getCompanyName());
         dept.setParentId(Constants.TOP_PARENT_ID);
         dept.setAncestors(Constants.TOP_PARENT_ID.toString());
+        dept.setPlatformId(Platform.MERCHANT.getId());
         deptMapper.insert(dept);
         Long deptId = dept.getDeptId();
 

+ 3 - 1
script/sql/business/create.sql

@@ -1,3 +1,4 @@
+# 2026/02/10
 CREATE TABLE `pet_system`.`sys_tenant_categories`
 (
     `id`          bigint PRIMARY KEY NOT NULL COMMENT '序号',
@@ -13,6 +14,7 @@ CREATE TABLE `pet_system`.`sys_tenant_categories`
     `update_time` datetime COMMENT '更新时间'
 ) ENGINE = innoDB COMMENT = '商户分类表';
 
+# 2026/02/24
 CREATE TABLE `pet_system`.`sys_store`
 (
     `id`                  bigint PRIMARY KEY NOT NULL COMMENT '序号',
@@ -20,7 +22,6 @@ CREATE TABLE `pet_system`.`sys_store`
     `business_license`    bigint             NOT NULL COMMENT '营业执照',
     `name`                varchar(64)        NOT NULL COMMENT '门店名称',
     `tenant_catergories`  bigint             NOT NULL COMMENT '商户分类',
-    `sys_tenant`          bigint             NOT NULL COMMENT '所属品牌',
     `start_business_time` time               NOT NULL COMMENT '开始营业时间',
     `end_business_time`   time               NOT NULL COMMENT '结束营业时间',
     `contact`             varchar(64)        NOT NULL COMMENT '联系人',
@@ -30,6 +31,7 @@ CREATE TABLE `pet_system`.`sys_store`
     `detail_address`      varchar(255) COMMENT '详细地址',
     `status`              tinyint            NOT NULL DEFAULT 0 COMMENT '状态',
     `del_flag`            char(1)                     DEFAULT '0' COMMENT '删除标志(0代表存在 1代表删除)',
+    `tenant_id`           varchar(20)        NOT NULL COMMENT '租户编号',
     `create_dept`         bigint(20) COMMENT '创建部门',
     `create_by`           bigint(20) COMMENT '创建者',
     `create_time`         datetime COMMENT '创建时间',

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

@@ -27,3 +27,27 @@ ALTER TABLE `pet_system`.`sys_tenant` ADD COLUMN `logo` bigint COMMENT '品牌LO
 
 ALTER TABLE `pet_system`.`sys_tenant` ADD COLUMN `admin` bigint NOT NULL COMMENT '管理员';
 ALTER TABLE `pet_system`.`sys_role` ADD COLUMN `platform_id` tinyint NOT NULL COMMENT '平台ID';
+
+# 2026/02/24
+-- 菜单 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(2026190519642099713, '门店管理', '6', '1', 'store', 'system/store/index', 1, 0, 'C', '0', '0', 'system:store: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(2026190519642099714, '门店管理查询', 2026190519642099713, '1',  '#', '', 1, 0, 'F', '0', '0', 'system:store: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(2026190519642099715, '门店管理新增', 2026190519642099713, '2',  '#', '', 1, 0, 'F', '0', '0', 'system:store: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(2026190519642099716, '门店管理修改', 2026190519642099713, '3',  '#', '', 1, 0, 'F', '0', '0', 'system:store: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(2026190519642099717, '门店管理删除', 2026190519642099713, '4',  '#', '', 1, 0, 'F', '0', '0', 'system:store: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(2026190519642099718, '门店管理导出', 2026190519642099713, '5',  '#', '', 1, 0, 'F', '0', '0', 'system:store:export',       '#', 103, 1, sysdate(), null, null, '', 0);
+
+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';