Ver Fonte

门店管理完成、商户后台基本搭建完成

Huanyi há 1 mês atrás
pai
commit
ce8828ab2d
27 ficheiros alterados com 288 adições e 11 exclusões
  1. 2 0
      .gitignore
  2. 2 2
      pom.xml
  3. 1 1
      ruoyi-common/ruoyi-common-dubbo/src/main/resources/common-dubbo.yml
  4. 10 0
      ruoyi-common/yingpaipay-common-platform/src/main/java/org/dromara/common/platform/Platform.java
  5. 1 0
      ruoyi-gateway/src/main/resources/application.yml
  6. 6 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysRoleController.java
  7. 18 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysStoreController.java
  8. 5 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysTenantController.java
  9. 5 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysUserController.java
  10. 1 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysStore.java
  11. 17 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysUserStore.java
  12. 4 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysStoreBo.java
  13. 5 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysUserBo.java
  14. 18 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysRoleOnListVo.java
  15. 18 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysStoreListOnMerchantAccountInfoVo.java
  16. 18 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysStoreListOnMerchantStoreInfoVo.java
  17. 2 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysStoreVo.java
  18. 5 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysUserVo.java
  19. 7 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysUserStoreMapper.java
  20. 2 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysRoleService.java
  21. 6 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysStoreService.java
  22. 1 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysUserService.java
  23. 13 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysRoleServiceImpl.java
  24. 32 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysStoreServiceImpl.java
  25. 77 8
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysUserServiceImpl.java
  26. 8 0
      script/sql/business/create.sql
  27. 4 0
      script/sql/business/update.sql

+ 2 - 0
.gitignore

@@ -46,3 +46,5 @@ nbdist/
 !*/build/*.xml
 
 .flattened-pom.xml
+
+ruoyi-visual/ruoyi-nacos/src/main/resources/application.properties

+ 2 - 2
pom.xml

@@ -69,7 +69,7 @@
             <properties>
                 <!-- 环境标识,需要与配置文件的名称相对应 -->
                 <profiles.active>dev</profiles.active>
-                <nacos.server>127.0.0.1:8848</nacos.server>
+                <nacos.server>192.168.1.118:8848</nacos.server>
                 <nacos.discovery.group>DEFAULT_GROUP</nacos.discovery.group>
                 <nacos.config.group>DEFAULT_GROUP</nacos.config.group>
                 <nacos.username>nacos</nacos.username>
@@ -87,7 +87,7 @@
             <properties>
                 <!-- 环境标识,需要与配置文件的名称相对应 -->
                 <profiles.active>test</profiles.active>
-                <nacos.server>127.0.0.1:8848</nacos.server>
+                <nacos.server>192.168.1.140:8848</nacos.server>
                 <nacos.discovery.group>DEFAULT_GROUP</nacos.discovery.group>
                 <nacos.config.group>DEFAULT_GROUP</nacos.config.group>
                 <nacos.username>nacos</nacos.username>

+ 1 - 1
ruoyi-common/ruoyi-common-dubbo/src/main/resources/common-dubbo.yml

@@ -22,7 +22,7 @@ dubbo:
   metadata-report:
     address: redis://${spring.data.redis.host:localhost}:${spring.data.redis.port:6379}
     group: DUBBO_GROUP
-    username: default
+    username: ${spring.data.redis.username:default}
     password: ${spring.data.redis.password:ruoyi123}
     parameters:
       namespace: ${spring.profiles.active}

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

@@ -1,8 +1,10 @@
 package org.dromara.common.platform;
 
+import cn.dev33.satoken.context.SaHolder;
 import lombok.AccessLevel;
 import lombok.AllArgsConstructor;
 import lombok.Getter;
+import org.dromara.common.core.utils.SpringUtils;
 
 import java.util.ArrayList;
 import java.util.Arrays;
@@ -30,6 +32,14 @@ public enum Platform {
         return !isAdmin(header);
     }
 
+    public static boolean isAdmin() {
+        return SaHolder.getContext().getRequest().getHeader(PlatformContants.PLATFORM_HEADER).equals(ADMIN.code);
+    }
+
+    public static boolean isNotAdmin() {
+        return !isAdmin();
+    }
+
     public static boolean isAdmin(String header) {
         return header.equals(ADMIN.code);
     }

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

@@ -26,6 +26,7 @@ spring:
         # 注册组
         group: @nacos.discovery.group@
         namespace: ${spring.profiles.active}
+        grpc-port:
       config:
         # 配置组
         group: @nacos.config.group@

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

@@ -16,6 +16,7 @@ import org.dromara.system.domain.SysUserRole;
 import org.dromara.system.domain.bo.SysDeptBo;
 import org.dromara.system.domain.bo.SysRoleBo;
 import org.dromara.system.domain.bo.SysUserBo;
+import org.dromara.system.domain.vo.SysRoleOnListVo;
 import org.dromara.system.domain.vo.SysRoleVo;
 import org.dromara.system.domain.vo.SysUserVo;
 import org.dromara.system.service.ISysDeptService;
@@ -243,5 +244,10 @@ public class SysRoleController extends BaseController {
      */
     public record DeptTreeSelectVo(List<Long> checkedKeys, List<Tree<Long>> depts) {}
 
+    @GetMapping("/listAll")
+    public R<List<SysRoleOnListVo>> listAll() {
+        return R.ok(roleService.listAll());
+    }
+
 }
 

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

@@ -7,6 +7,8 @@ import jakarta.servlet.http.HttpServletResponse;
 import jakarta.validation.constraints.*;
 import cn.dev33.satoken.annotation.SaCheckPermission;
 import org.dromara.system.domain.bo.SysStorePageBo;
+import org.dromara.system.domain.vo.SysStoreListOnMerchantAccountInfoVo;
+import org.dromara.system.domain.vo.SysStoreListOnMerchantStoreInfoVo;
 import org.dromara.system.domain.vo.SysStoreStatusVo;
 import org.springframework.web.bind.annotation.*;
 import org.springframework.validation.annotation.Validated;
@@ -111,4 +113,20 @@ public class SysStoreController extends BaseController {
         return R.ok(sysStoreService.listStatus());
     }
 
+    @GetMapping("/listOnMerchantStoreInfo")
+    public R<List<SysStoreListOnMerchantStoreInfoVo>> listOnMerchantStoreInfo() {
+        return R.ok(sysStoreService.listOnMerchantStoreInfo());
+    }
+
+    @GetMapping("/getInfo")
+    public R<SysStoreVo> getInfoOnStore(@NotNull(message = "主键不能为空")
+                                 @RequestParam Long id) {
+        return R.ok(sysStoreService.queryById(id));
+    }
+
+    @GetMapping("/listOnUser")
+    public R<List<SysStoreListOnMerchantAccountInfoVo>> listOnUser() {
+        return R.ok(sysStoreService.listAll());
+    }
+
 }

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

@@ -215,4 +215,9 @@ public class SysTenantController extends BaseController {
         return tenantService.listOnStore(pageQuery);
     }
 
+    @GetMapping("/getInfo")
+    public R<SysTenantVo> getInfo() {
+        return R.ok(tenantService.queryByTenantId(TenantHelper.getTenantId()));
+    }
+
 }

+ 5 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysUserController.java

@@ -66,6 +66,11 @@ public class SysUserController extends BaseController {
         return userService.selectPageUserList(user, pageQuery);
     }
 
+    @GetMapping("/listOnMerchant")
+    public TableDataInfo<SysUserVo> listOnMerchant(SysUserBo user, PageQuery pageQuery) {
+        return userService.selectPageUserListOnMerchant(user, pageQuery);
+    }
+
     /**
      * 导出用户列表
      */

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

@@ -109,5 +109,6 @@ public class SysStore extends TenantEntity {
     @TableLogic
     private String delFlag;
 
+    private String areaCode;
 
 }

+ 17 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysUserStore.java

@@ -0,0 +1,17 @@
+package org.dromara.system.domain;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+
+@Data
+@TableName("sys_user_store")
+public class SysUserStore {
+
+    @TableId(type = IdType.INPUT)
+    private Long userId;
+
+    private Long storeId;
+
+}

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

@@ -120,4 +120,8 @@ public class SysStoreBo extends TenantEntity {
     @NotEmpty(message = "服务项目不能为空", groups = {AddGroup.class, EditGroup.class})
     private List<Long> services;
 
+
+    @NotBlank(message = "请选择区域", groups = {AddGroup.class, EditGroup.class})
+    private String areaCode;
+
 }

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

@@ -113,6 +113,11 @@ public class SysUserBo extends BaseEntity {
      */
     private String excludeUserIds;
 
+    /**
+     * 门店组
+     */
+    private Long[] storeIds;
+
     public SysUserBo(Long userId) {
         this.userId = userId;
     }

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

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

@@ -154,4 +154,6 @@ public class SysStoreVo implements Serializable {
      */
     private Long serviceOrder;
 
+    private String areaCode;
+
 }

+ 5 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysUserVo.java

@@ -139,4 +139,9 @@ public class SysUserVo implements Serializable {
      */
     private Long roleId;
 
+    /**
+     * 门店组
+     */
+    private Long[] storeIds;
+
 }

+ 7 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysUserStoreMapper.java

@@ -0,0 +1,7 @@
+package org.dromara.system.mapper;
+
+import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
+import org.dromara.system.domain.SysUserStore;
+
+public interface SysUserStoreMapper extends BaseMapperPlus<SysUserStore, SysUserStore> {
+}

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

@@ -4,6 +4,7 @@ import org.dromara.common.mybatis.core.page.PageQuery;
 import org.dromara.common.mybatis.core.page.TableDataInfo;
 import org.dromara.system.domain.SysUserRole;
 import org.dromara.system.domain.bo.SysRoleBo;
+import org.dromara.system.domain.vo.SysRoleOnListVo;
 import org.dromara.system.domain.vo.SysRoleVo;
 
 import java.util.List;
@@ -212,4 +213,5 @@ public interface ISysRoleService {
 
     void cleanOnlineUser(List<Long> userIds);
 
+    List<SysRoleOnListVo> listAll();
 }

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

@@ -2,6 +2,8 @@ package org.dromara.system.service;
 
 import org.dromara.system.domain.SysStore;
 import org.dromara.system.domain.bo.SysStorePageBo;
+import org.dromara.system.domain.vo.SysStoreListOnMerchantAccountInfoVo;
+import org.dromara.system.domain.vo.SysStoreListOnMerchantStoreInfoVo;
 import org.dromara.system.domain.vo.SysStoreStatusVo;
 import org.dromara.system.domain.vo.SysStoreVo;
 import org.dromara.system.domain.bo.SysStoreBo;
@@ -70,4 +72,8 @@ public interface ISysStoreService {
     Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
 
     List<SysStoreStatusVo> listStatus();
+
+    List<SysStoreListOnMerchantStoreInfoVo> listOnMerchantStoreInfo();
+
+    List<SysStoreListOnMerchantAccountInfoVo> listAll();
 }

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

@@ -274,4 +274,5 @@ public interface ISysUserService {
      */
     List<Long> selectUserIdsByRoleIds(List<Long> roleIds);
 
+    TableDataInfo<SysUserVo> selectPageUserListOnMerchant(SysUserBo user, PageQuery pageQuery);
 }

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

@@ -28,6 +28,7 @@ import org.dromara.system.domain.SysRoleDept;
 import org.dromara.system.domain.SysRoleMenu;
 import org.dromara.system.domain.SysUserRole;
 import org.dromara.system.domain.bo.SysRoleBo;
+import org.dromara.system.domain.vo.SysRoleOnListVo;
 import org.dromara.system.domain.vo.SysRoleVo;
 import org.dromara.system.mapper.SysRoleDeptMapper;
 import org.dromara.system.mapper.SysRoleMapper;
@@ -596,4 +597,16 @@ public class SysRoleServiceImpl implements ISysRoleService {
         });
     }
 
+    @Override
+    public List<SysRoleOnListVo> listAll() {
+        return baseMapper.selectList().stream()
+            .map(e -> {
+                SysRoleOnListVo vo = new SysRoleOnListVo();
+                vo.setId(e.getRoleId());
+                vo.setName(e.getRoleName());
+                return vo;
+            })
+            .toList();
+    }
+
 }

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

@@ -12,10 +12,13 @@ import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.dromara.common.mybatis.utils.WrapperUtils;
+import org.dromara.common.satoken.utils.LoginHelper;
 import org.dromara.service.api.RemoteStoreServiceService;
 import org.dromara.service.api.domain.bo.RemoteStoreServiceBo;
 import org.dromara.system.domain.SysAreaStation;
 import org.dromara.system.domain.bo.SysStorePageBo;
+import org.dromara.system.domain.vo.SysStoreListOnMerchantAccountInfoVo;
+import org.dromara.system.domain.vo.SysStoreListOnMerchantStoreInfoVo;
 import org.dromara.system.domain.vo.SysStoreStatusVo;
 import org.dromara.system.enums.AreaStationStatusEnum;
 import org.dromara.system.enums.SysStoreStatusEnum;
@@ -57,6 +60,7 @@ public class SysStoreServiceImpl implements ISysStoreService {
         SysStoreVo vo = baseMapper.selectVoById(id);
         Map<Long, List<Long>> map = storeServiceService.getByIds(List.of(id));
         vo.setServices(map.get(id));
+        vo.setServiceOrder(0L);
         return vo;
     }
 
@@ -210,4 +214,32 @@ public class SysStoreServiceImpl implements ISysStoreService {
             })
             .toList();
     }
+
+    @Override
+    public List<SysStoreListOnMerchantStoreInfoVo> listOnMerchantStoreInfo() {
+
+        List<SysStoreListOnMerchantStoreInfoVo> list = new ArrayList<>();
+
+        if (LoginHelper.isTenantAdmin()) {
+            baseMapper.selectList().forEach(e -> {
+                SysStoreListOnMerchantStoreInfoVo vo = new SysStoreListOnMerchantStoreInfoVo();
+                vo.setId(e.getId());
+                vo.setName(e.getName());
+                list.add(vo);
+            });
+        }
+
+        return list;
+    }
+
+    @Override
+    public List<SysStoreListOnMerchantAccountInfoVo> listAll() {
+        return baseMapper.selectList().stream()
+            .map(e -> {
+                SysStoreListOnMerchantAccountInfoVo vo = new SysStoreListOnMerchantAccountInfoVo();
+                vo.setId(e.getId());
+                vo.setName(e.getName());
+                return vo;
+            }).toList();
+    }
 }

+ 77 - 8
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysUserServiceImpl.java

@@ -1,6 +1,5 @@
 package org.dromara.system.service.impl;
 
-import cn.dev33.satoken.context.SaHolder;
 import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.convert.Convert;
 import cn.hutool.core.util.ArrayUtil;
@@ -15,6 +14,7 @@ import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.dromara.common.core.constant.CacheNames;
 import org.dromara.common.core.constant.SystemConstants;
+import org.dromara.common.core.constant.TenantConstants;
 import org.dromara.common.core.exception.ServiceException;
 import org.dromara.common.core.utils.*;
 import org.dromara.common.mybatis.core.page.PageQuery;
@@ -22,25 +22,22 @@ import org.dromara.common.mybatis.core.page.TableDataInfo;
 import org.dromara.common.platform.Platform;
 import org.dromara.common.platform.PlatformUtils;
 import org.dromara.common.satoken.utils.LoginHelper;
-import org.dromara.system.domain.SysUser;
-import org.dromara.system.domain.SysUserPost;
-import org.dromara.system.domain.SysUserRole;
+import org.dromara.system.domain.*;
 import org.dromara.system.domain.bo.SysUserBo;
 import org.dromara.system.domain.vo.SysPostVo;
 import org.dromara.system.domain.vo.SysRoleVo;
 import org.dromara.system.domain.vo.SysUserExportVo;
 import org.dromara.system.domain.vo.SysUserVo;
 import org.dromara.system.mapper.*;
+import org.dromara.system.service.ISysRoleService;
 import org.dromara.system.service.ISysUserService;
 import org.springframework.cache.annotation.CacheEvict;
 import org.springframework.cache.annotation.Cacheable;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
+import java.util.stream.Collectors;
 
 /**
  * 用户 业务层处理
@@ -58,6 +55,10 @@ public class SysUserServiceImpl implements ISysUserService {
     private final SysPostMapper postMapper;
     private final SysUserRoleMapper userRoleMapper;
     private final SysUserPostMapper userPostMapper;
+    private final SysUserStoreMapper userStoreMapper;
+    private final SysStoreMapper storeMapper;
+
+    private final ISysRoleService roleService;
 
     @Override
     public TableDataInfo<SysUserVo> selectPageUserList(SysUserBo user, PageQuery pageQuery) {
@@ -315,6 +316,8 @@ public class SysUserServiceImpl implements ISysUserService {
     @Transactional(rollbackFor = Exception.class)
     public int insertUser(SysUserBo user) {
         SysUser sysUser = MapstructUtils.convert(user, SysUser.class);
+        // 增加平台信息 @author: Huanyi
+        sysUser.setPlatformId(PlatformUtils.getId());
         // 新增用户信息
         int rows = baseMapper.insert(sysUser);
         user.setUserId(sysUser.getUserId());
@@ -322,9 +325,28 @@ public class SysUserServiceImpl implements ISysUserService {
         insertUserPost(user, false);
         // 新增用户与角色管理
         insertUserRole(user, false);
+        // 新增用户与门店关联 @author: Huanyi
+        insertUserStore(user, false);
         return rows;
     }
 
+    private void insertUserStore(SysUserBo user, boolean clean) {
+        if (clean) {
+            userStoreMapper.delete(Wrappers.lambdaQuery(SysUserStore.class).eq(SysUserStore::getUserId, user.getUserId()));
+        }
+        if (user.getStoreIds().length == 0) {
+            return;
+        }
+        List<SysUserStore> list = Arrays.stream(user.getStoreIds())
+            .map(storeId -> {
+                SysUserStore e = new SysUserStore();
+                e.setUserId(user.getUserId());
+                e.setStoreId(storeId);
+                return e;
+            }).toList();
+        userStoreMapper.insertBatch(list);
+    }
+
     /**
      * 注册用户信息
      *
@@ -354,6 +376,8 @@ public class SysUserServiceImpl implements ISysUserService {
         insertUserRole(user, true);
         // 新增用户与岗位管理
         insertUserPost(user, true);
+        // 新增用户与门店关联 @author: Huanyi
+        insertUserStore(user, true);
         SysUser sysUser = MapstructUtils.convert(user, SysUser.class);
         // 防止错误更新后导致的数据误删除
         int flag = baseMapper.updateById(sysUser);
@@ -590,6 +614,51 @@ public class SysUserServiceImpl implements ISysUserService {
         return StreamUtils.toList(userRoles, SysUserRole::getUserId);
     }
 
+    @Override
+    public TableDataInfo<SysUserVo> selectPageUserListOnMerchant(SysUserBo user, PageQuery pageQuery) {
+        Page<SysUserVo> page = baseMapper.selectPageUserList(pageQuery.build(), this.buildQueryWrapper(user));
+
+        if (!page.getRecords().isEmpty()) {
+            List<Long> userIds = page.getRecords().stream().map(SysUserVo::getUserId).toList();
+            Map<Long, List<SysUserStore>> storeMap = userStoreMapper.selectList(
+                Wrappers.lambdaQuery(SysUserStore.class).in(SysUserStore::getUserId, userIds)
+            ).stream().collect(Collectors.groupingBy(SysUserStore::getUserId));
+            List<Long> allStoreList = new ArrayList<>();
+            Map<Long, List<SysUserRole>> userRoleMap = userRoleMapper.selectList(Wrappers.lambdaQuery(SysUserRole.class).in(SysUserRole::getUserId, userIds)).stream().collect(Collectors.groupingBy(SysUserRole::getUserId));
+            storeMapper.selectList(Wrappers.lambdaQuery(SysStore.class).select(SysStore::getId)).forEach(e -> allStoreList.add(e.getId()));
+            Long[] allStores = new Long[allStoreList.size()];
+            for (int i = 0; i < allStoreList.size(); i++) {
+                allStores[i] = allStoreList.get(i);
+            }
+            Map<Long, SysRole> roleMap = new HashMap<>();
+            roleMapper.selectList().forEach(e -> roleMap.put(e.getRoleId(), e));
+            page.getRecords().forEach(e -> {
+
+                List<SysUserRole> roleIds = userRoleMap.get(e.getUserId());
+                e.setRoleIds(roleIds.stream().map(SysUserRole::getRoleId).toArray(Long[]::new));
+                for (SysUserRole userRole : roleIds) {
+                    SysRole role = roleMap.get(userRole.getRoleId());
+                    if (role.getRoleKey().equals(TenantConstants.TENANT_ADMIN_ROLE_KEY)) {
+                        e.setStoreIds(allStores);
+                        return;
+                    }
+                }
+
+                List<SysUserStore> stores = storeMap.get(e.getUserId());
+                Long[] storeIds = new Long[stores.size()];
+                if (!stores.isEmpty()) {
+                    // 一个人能够分到的店面有限,贸然stream流性能反而更慢 @author: Huanyi
+                    for (int i = 0; i < stores.size(); i++) {
+                        storeIds[i] = stores.get(i).getStoreId();
+                    }
+                    e.setStoreIds(storeIds);
+                }
+            });
+        }
+
+        return TableDataInfo.build(page);
+    }
+
     /**
      * 通过用户ID查询用户账户
      *

+ 8 - 0
script/sql/business/create.sql

@@ -104,3 +104,11 @@ CREATE TABLE `pet_system`.`sys_sms_config`
     `update_by`         bigint(20) COMMENT '更新者',
     `update_time`       datetime COMMENT '更新时间'
 ) ENGINE = innoDB COMMENT = '短信配置表';
+
+# 2026/02/28
+CREATE TABLE `pet_system`.`sys_user_store`
+(
+    `user_id`    bigint NOT NULL COMMENT '用户ID',
+    `store_id`   bigint NOT NULL COMMENT '门店ID',
+    PRIMARY KEY (`user_id`, `store_id`)
+) ENGINE = innoDB COMMENT = '用户门店关系表';

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

@@ -188,3 +188,7 @@ insert into sys_dict_data values(141, '000000', 20, '暹罗猫',         '暹罗
 insert into sys_dict_data values(142, '000000', 21, '波斯猫',         '波斯猫',         'sys_pet_breed', '', '', 'N', 103, 1, sysdate(), null, null, '');
 insert into sys_dict_data values(143, '000000', 22, '缅因猫',         '缅因猫',         'sys_pet_breed', '', '', 'N', 103, 1, sysdate(), null, null, '');
 insert into sys_dict_data values(144, '000000', 23, '中华田园猫',     '中华田园猫',     'sys_pet_breed', '', '', 'N', 103, 1, sysdate(), null, null, '');
+
+# 2026/02/28
+-- 门店信息加入区域编码
+ALTER TABLE `pet_system`.`sys_store` ADD COLUMN `area_code` varchar(255) NOT NULL COMMENT '区域编码';