Procházet zdrojové kódy

商家pc端 分权限 第二笔提交

liudongzhi před 3 měsíci
rodič
revize
2010013b3f

+ 7 - 1
alien-entity/src/main/java/shop/alien/entity/store/StorePlatformUserRole.java

@@ -28,7 +28,7 @@ public class StorePlatformUserRole implements Serializable {
     @TableId(value = "id", type = IdType.AUTO)
     private Long id;
 
-    @ApiModelProperty(value = "用户ID(关联life_sys.id)")
+    @ApiModelProperty(value = "用户ID(关联store_user.id)")
     @TableField("user_id")
     private Integer userId;
 
@@ -40,5 +40,11 @@ public class StorePlatformUserRole implements Serializable {
     @TableField(value = "created_time", fill = FieldFill.INSERT)
     @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
     private Date createdTime;
+
+
+    @ApiModelProperty(value = "店铺ID(关联store_user.id)")
+    @TableField("store_id")
+    private Integer storeId;
+
 }
 

+ 28 - 0
alien-entity/src/main/java/shop/alien/entity/store/vo/RolePermissionTableVo.java

@@ -0,0 +1,28 @@
+package shop.alien.entity.store.vo;
+
+import com.fasterxml.jackson.annotation.JsonInclude;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * 角色权限表格VO(用于表格形式展示权限层级)
+ *
+ * @author system
+ * @since 2025-01-XX
+ */
+@Data
+@JsonInclude
+@ApiModel(value = "RolePermissionTableVo对象", description = "角色权限表格VO(用于表格形式展示权限层级)")
+public class RolePermissionTableVo {
+
+    @ApiModelProperty(value = "一级权限名称")
+    private String level1Permission;
+
+    @ApiModelProperty(value = "二级权限名称")
+    private String level2Permission;
+
+    @ApiModelProperty(value = "三级权限名称")
+    private String level3Permission;
+}
+

+ 41 - 3
alien-store-platform/src/main/java/shop/alien/storeplatform/controller/StorePlatformRoleController.java

@@ -7,8 +7,11 @@ import lombok.extern.slf4j.Slf4j;
 import org.springframework.web.bind.annotation.*;
 import shop.alien.entity.result.R;
 import shop.alien.entity.store.StorePlatformRole;
+import shop.alien.entity.store.vo.RolePermissionTableVo;
 import shop.alien.entity.store.vo.StorePlatformRoleVo;
 import shop.alien.storeplatform.dto.CreateRoleDto;
+import shop.alien.storeplatform.dto.UpdateRoleDto;
+import shop.alien.storeplatform.service.StorePlatformRoleMenuService;
 import shop.alien.storeplatform.service.StorePlatformRoleService;
 
 import java.util.List;
@@ -29,6 +32,7 @@ import java.util.List;
 public class StorePlatformRoleController {
 
     private final StorePlatformRoleService storePlatformRoleService;
+    private final StorePlatformRoleMenuService storePlatformRoleMenuService;
 
     @ApiOperation("分页查询角色列表(包含关联统计)")
     @ApiOperationSupport(order = 1)
@@ -118,9 +122,31 @@ public class StorePlatformRoleController {
     @ApiOperation("修改角色")
     @ApiOperationSupport(order = 4)
     @PostMapping("/updateRole")
-    public R<String> updateRole(@RequestBody StorePlatformRole role) {
-        log.info("StorePlatformRoleController.updateRole?role={}", role);
-        boolean result = storePlatformRoleService.updateRole(role);
+    public R<String> updateRole(@RequestBody UpdateRoleDto updateRoleDto) {
+        log.info("StorePlatformRoleController.updateRole?roleId={}, roleName={}, menuIds={}", 
+                updateRoleDto.getRoleId(), updateRoleDto.getRoleName(), updateRoleDto.getMenuIds());
+        
+        // 校验必填参数
+        if (updateRoleDto.getRoleId() == null) {
+            return R.fail("角色ID不能为空");
+        }
+        if (updateRoleDto.getStoreId() == null) {
+            return R.fail("店铺ID不能为空");
+        }
+        
+        // 构建角色对象
+        StorePlatformRole role = new StorePlatformRole();
+        role.setRoleId(updateRoleDto.getRoleId());
+        role.setStoreId(updateRoleDto.getStoreId());
+        role.setRoleName(updateRoleDto.getRoleName());
+        role.setRoleSort(updateRoleDto.getRoleSort());
+        role.setStatus(updateRoleDto.getStatus());
+        role.setDescription(updateRoleDto.getDescription());
+        role.setRoleNameEn(updateRoleDto.getRoleNameEn());
+        role.setRemark(updateRoleDto.getRemark());
+        
+        // 更新角色和权限
+        boolean result = storePlatformRoleService.updateRoleWithMenus(role, updateRoleDto.getMenuIds());
         if (result) {
             return R.success("修改成功");
         }
@@ -189,5 +215,17 @@ public class StorePlatformRoleController {
         boolean exists = storePlatformRoleService.checkRoleNameExists(storeId, roleName, excludeRoleId);
         return R.data(exists);
     }
+
+    @ApiOperation("查看角色权限(表格形式)")
+    @ApiOperationSupport(order = 9)
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "roleId", value = "角色ID", dataType = "Long", paramType = "query", required = true)
+    })
+    @GetMapping("/getRolePermissionTable")
+    public R<List<RolePermissionTableVo>> getRolePermissionTable(@RequestParam("roleId") Long roleId) {
+        log.info("StorePlatformRoleController.getRolePermissionTable?roleId={}", roleId);
+        List<RolePermissionTableVo> tableData = storePlatformRoleMenuService.getRolePermissionTable(roleId);
+        return R.data(tableData);
+    }
 }
 

+ 62 - 19
alien-store-platform/src/main/java/shop/alien/storeplatform/controller/StorePlatformUserRoleController.java

@@ -30,24 +30,26 @@ public class StorePlatformUserRoleController {
     @ApiOperation("根据用户ID查询角色ID列表")
     @ApiOperationSupport(order = 1)
     @ApiImplicitParams({
-            @ApiImplicitParam(name = "userId", value = "用户ID", dataType = "int", paramType = "query", required = true)
+            @ApiImplicitParam(name = "userId", value = "用户ID", dataType = "int", paramType = "query", required = true),
+            @ApiImplicitParam(name = "storeId", value = "店铺ID", dataType = "int", paramType = "query", required = true)
     })
     @GetMapping("/getRoleIdsByUserId")
-    public R<List<Long>> getRoleIdsByUserId(@RequestParam("userId") Integer userId) {
-        log.info("StorePlatformUserRoleController.getRoleIdsByUserId?userId={}", userId);
-        List<Long> roleIds = storePlatformUserRoleService.getRoleIdsByUserId(userId);
+    public R<List<Long>> getRoleIdsByUserId(@RequestParam("userId") Integer userId, @RequestParam("storeId") Integer storeId) {
+        log.info("StorePlatformUserRoleController.getRoleIdsByUserId?userId={}, storeId={}", userId, storeId);
+        List<Long> roleIds = storePlatformUserRoleService.getRoleIdsByUserId(userId, storeId);
         return R.data(roleIds);
     }
 
     @ApiOperation("根据角色ID查询用户ID列表")
     @ApiOperationSupport(order = 2)
     @ApiImplicitParams({
-            @ApiImplicitParam(name = "roleId", value = "角色ID", dataType = "Long", paramType = "query", required = true)
+            @ApiImplicitParam(name = "roleId", value = "角色ID", dataType = "Long", paramType = "query", required = true),
+            @ApiImplicitParam(name = "storeId", value = "店铺ID", dataType = "int", paramType = "query", required = true)
     })
     @GetMapping("/getUserIdsByRoleId")
-    public R<List<Integer>> getUserIdsByRoleId(@RequestParam("roleId") Long roleId) {
-        log.info("StorePlatformUserRoleController.getUserIdsByRoleId?roleId={}", roleId);
-        List<Integer> userIds = storePlatformUserRoleService.getUserIdsByRoleId(roleId);
+    public R<List<Integer>> getUserIdsByRoleId(@RequestParam("roleId") Long roleId, @RequestParam("storeId") Integer storeId) {
+        log.info("StorePlatformUserRoleController.getUserIdsByRoleId?roleId={}, storeId={}", roleId, storeId);
+        List<Integer> userIds = storePlatformUserRoleService.getUserIdsByRoleId(roleId, storeId);
         return R.data(userIds);
     }
 
@@ -55,9 +57,9 @@ public class StorePlatformUserRoleController {
     @ApiOperationSupport(order = 3)
     @PostMapping("/assignRoles")
     public R<String> assignRoles(@RequestBody AssignRolesDto assignRolesDto) {
-        log.info("StorePlatformUserRoleController.assignRoles?userId={}, roleIds={}", 
-                assignRolesDto.getUserId(), assignRolesDto.getRoleIds());
-        boolean result = storePlatformUserRoleService.assignRoles(assignRolesDto.getUserId(), assignRolesDto.getRoleIds());
+        log.info("StorePlatformUserRoleController.assignRoles?userId={}, roleIds={}, storeId={}", 
+                assignRolesDto.getUserId(), assignRolesDto.getRoleIds(), assignRolesDto.getStoreId());
+        boolean result = storePlatformUserRoleService.assignRoles(assignRolesDto.getUserId(), assignRolesDto.getRoleIds(), assignRolesDto.getStoreId());
         if (result) {
             return R.success("分配成功");
         }
@@ -67,12 +69,13 @@ public class StorePlatformUserRoleController {
     @ApiOperation("移除用户的所有角色")
     @ApiOperationSupport(order = 4)
     @ApiImplicitParams({
-            @ApiImplicitParam(name = "userId", value = "用户ID", dataType = "int", paramType = "query", required = true)
+            @ApiImplicitParam(name = "userId", value = "用户ID", dataType = "int", paramType = "query", required = true),
+            @ApiImplicitParam(name = "storeId", value = "店铺ID", dataType = "int", paramType = "query", required = true)
     })
     @DeleteMapping("/removeAllRoles")
-    public R<String> removeAllRoles(@RequestParam("userId") Integer userId) {
-        log.info("StorePlatformUserRoleController.removeAllRoles?userId={}", userId);
-        boolean result = storePlatformUserRoleService.removeAllRoles(userId);
+    public R<String> removeAllRoles(@RequestParam("userId") Integer userId, @RequestParam("storeId") Integer storeId) {
+        log.info("StorePlatformUserRoleController.removeAllRoles?userId={}, storeId={}", userId, storeId);
+        boolean result = storePlatformUserRoleService.removeAllRoles(userId, storeId);
         if (result) {
             return R.success("移除成功");
         }
@@ -83,18 +86,36 @@ public class StorePlatformUserRoleController {
     @ApiOperationSupport(order = 5)
     @ApiImplicitParams({
             @ApiImplicitParam(name = "userId", value = "用户ID", dataType = "int", paramType = "query", required = true),
-            @ApiImplicitParam(name = "roleId", value = "角色ID", dataType = "Long", paramType = "query", required = true)
+            @ApiImplicitParam(name = "roleId", value = "角色ID", dataType = "Long", paramType = "query", required = true),
+            @ApiImplicitParam(name = "storeId", value = "店铺ID", dataType = "int", paramType = "query", required = true)
     })
     @DeleteMapping("/removeRole")
-    public R<String> removeRole(@RequestParam("userId") Integer userId, @RequestParam("roleId") Long roleId) {
-        log.info("StorePlatformUserRoleController.removeRole?userId={}, roleId={}", userId, roleId);
-        boolean result = storePlatformUserRoleService.removeRole(userId, roleId);
+    public R<String> removeRole(@RequestParam("userId") Integer userId, @RequestParam("roleId") Long roleId, @RequestParam("storeId") Integer storeId) {
+        log.info("StorePlatformUserRoleController.removeRole?userId={}, roleId={}, storeId={}", userId, roleId, storeId);
+        boolean result = storePlatformUserRoleService.removeRole(userId, roleId, storeId);
         if (result) {
             return R.success("移除成功");
         }
         return R.fail("移除失败");
     }
 
+    @ApiOperation("创建账号并分配角色")
+    @ApiOperationSupport(order = 6)
+    @PostMapping("/createAccountAndAssignRole")
+    public R<String> createAccountAndAssignRole(@RequestBody CreateAccountDto createAccountDto) {
+        log.info("StorePlatformUserRoleController.createAccountAndAssignRole?phone={}, accountName={}, storeId={}, roleId={}", 
+                createAccountDto.getPhone(), createAccountDto.getAccountName(), createAccountDto.getStoreId(), createAccountDto.getRoleId());
+        boolean result = storePlatformUserRoleService.createAccountAndAssignRole(
+                createAccountDto.getPhone(), 
+                createAccountDto.getAccountName(), 
+                createAccountDto.getStoreId(), 
+                createAccountDto.getRoleId());
+        if (result) {
+            return R.success("创建账号并分配角色成功");
+        }
+        return R.fail("创建账号并分配角色失败");
+    }
+
     /**
      * 分配角色请求DTO
      */
@@ -106,6 +127,28 @@ public class StorePlatformUserRoleController {
 
         @ApiModelProperty(value = "角色ID列表", required = true)
         private List<Long> roleIds;
+
+        @ApiModelProperty(value = "店铺ID", required = true)
+        private Integer storeId;
+    }
+
+    /**
+     * 创建账号请求DTO
+     */
+    @Data
+    @ApiModel(value = "CreateAccountDto", description = "创建账号请求参数")
+    static class CreateAccountDto {
+        @ApiModelProperty(value = "手机号", required = true)
+        private String phone;
+
+        @ApiModelProperty(value = "账号名称")
+        private String accountName;
+
+        @ApiModelProperty(value = "店铺ID", required = true)
+        private Integer storeId;
+
+        @ApiModelProperty(value = "角色ID", required = true)
+        private Long roleId;
     }
 }
 

+ 49 - 0
alien-store-platform/src/main/java/shop/alien/storeplatform/dto/UpdateRoleDto.java

@@ -0,0 +1,49 @@
+package shop.alien.storeplatform.dto;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * 更新角色请求DTO
+ *
+ * @author system
+ * @since 2025-01-XX
+ */
+@Data
+@ApiModel(value = "UpdateRoleDto", description = "更新角色请求参数")
+public class UpdateRoleDto {
+
+    @ApiModelProperty(value = "角色ID", required = true)
+    private Long roleId;
+
+    @ApiModelProperty(value = "店铺ID", required = true)
+    private Integer storeId;
+
+    @ApiModelProperty(value = "角色名称", required = true)
+    private String roleName;
+
+    @ApiModelProperty(value = "角色类型")
+    private String roleType;
+
+    @ApiModelProperty(value = "显示顺序")
+    private Integer roleSort;
+
+    @ApiModelProperty(value = "角色状态(0正常 1停用)")
+    private String status;
+
+    @ApiModelProperty(value = "角色描述")
+    private String description;
+
+    @ApiModelProperty(value = "英文角色名称")
+    private String roleNameEn;
+
+    @ApiModelProperty(value = "备注")
+    private String remark;
+
+    @ApiModelProperty(value = "菜单权限ID列表(子账号权限)")
+    private List<Long> menuIds;
+}
+

+ 11 - 0
alien-store-platform/src/main/java/shop/alien/storeplatform/service/StorePlatformRoleMenuService.java

@@ -71,5 +71,16 @@ public interface StorePlatformRoleMenuService extends IService<StorePlatformRole
      * @return 权限树形结构列表
      */
     List<shop.alien.entity.store.vo.RolePermissionVo> getRolePermissionTree(Long roleId);
+
+    /**
+     * 根据角色ID获取权限表格数据(按层级展示)
+     * 如果角色有三级权限,则显示一级、二级、三级权限
+     * 如果只有一级权限,则只显示一级权限
+     * 如果只有二级权限,则显示一级和二级权限
+     *
+     * @param roleId 角色ID
+     * @return 权限表格数据列表
+     */
+    List<shop.alien.entity.store.vo.RolePermissionTableVo> getRolePermissionTable(Long roleId);
 }
 

+ 11 - 0
alien-store-platform/src/main/java/shop/alien/storeplatform/service/StorePlatformRoleService.java

@@ -85,6 +85,17 @@ public interface StorePlatformRoleService extends IService<StorePlatformRole> {
     boolean updateRole(StorePlatformRole role);
 
     /**
+     * 更新角色(包含权限分配)
+     * 如果角色类型(roleName)有变化,则更新 store_platform_role 表
+     * 如果权限有变化,则更新 store_platform_role_menu 表
+     *
+     * @param role 角色信息
+     * @param menuIds 菜单权限ID列表
+     * @return 是否成功
+     */
+    boolean updateRoleWithMenus(StorePlatformRole role, List<Long> menuIds);
+
+    /**
      * 删除角色(逻辑删除)
      *
      * @param roleId 角色ID

+ 28 - 10
alien-store-platform/src/main/java/shop/alien/storeplatform/service/StorePlatformUserRoleService.java

@@ -16,43 +16,61 @@ public interface StorePlatformUserRoleService extends IService<StorePlatformUser
     /**
      * 根据用户ID查询角色ID列表
      *
-     * @param userId 用户ID
+     * @param userId  用户ID
+     * @param storeId 店铺ID
      * @return 角色ID列表
      */
-    List<Long> getRoleIdsByUserId(Integer userId);
+    List<Long> getRoleIdsByUserId(Integer userId, Integer storeId);
 
     /**
      * 根据角色ID查询用户ID列表
      *
-     * @param roleId 角色ID
+     * @param roleId  角色ID
+     * @param storeId 店铺ID
      * @return 用户ID列表
      */
-    List<Integer> getUserIdsByRoleId(Long roleId);
+    List<Integer> getUserIdsByRoleId(Long roleId, Integer storeId);
 
     /**
      * 为用户分配角色
      *
      * @param userId  用户ID
      * @param roleIds 角色ID列表
+     * @param storeId 店铺ID
      * @return 是否成功
      */
-    boolean assignRoles(Integer userId, List<Long> roleIds);
+    boolean assignRoles(Integer userId, List<Long> roleIds, Integer storeId);
 
     /**
      * 移除用户的所有角色
      *
-     * @param userId 用户ID
+     * @param userId  用户ID
+     * @param storeId 店铺ID
      * @return 是否成功
      */
-    boolean removeAllRoles(Integer userId);
+    boolean removeAllRoles(Integer userId, Integer storeId);
 
     /**
      * 移除用户的指定角色
      *
-     * @param userId 用户ID
-     * @param roleId 角色ID
+     * @param userId  用户ID
+     * @param roleId  角色ID
+     * @param storeId 店铺ID
+     * @return 是否成功
+     */
+    boolean removeRole(Integer userId, Long roleId, Integer storeId);
+
+    /**
+     * 根据手机号创建账号并分配角色
+     * 如果 store_user 表中没有该手机号的记录,则插入一条数据
+     * 如果 store_platform_user_role 表中没有该用户和店铺的角色记录,则插入数据
+     *
+     * @param phone       手机号
+     * @param accountName 账号名称
+     * @param storeId     店铺ID
+     * @param roleId      角色ID
      * @return 是否成功
      */
-    boolean removeRole(Integer userId, Long roleId);
+    boolean createAccountAndAssignRole(String phone, String accountName, Integer storeId, Long roleId);
 }
 

+ 128 - 0
alien-store-platform/src/main/java/shop/alien/storeplatform/service/impl/StorePlatformRoleMenuServiceImpl.java

@@ -9,6 +9,7 @@ import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 import shop.alien.entity.store.StorePlatformMenu;
 import shop.alien.entity.store.StorePlatformRoleMenu;
+import shop.alien.entity.store.vo.RolePermissionTableVo;
 import shop.alien.entity.store.vo.RolePermissionVo;
 import shop.alien.mapper.StorePlatformMenuMapper;
 import shop.alien.mapper.StorePlatformRoleMenuMapper;
@@ -187,5 +188,132 @@ public class StorePlatformRoleMenuServiceImpl extends ServiceImpl<StorePlatformR
         
         return result;
     }
+
+    @Override
+    public List<RolePermissionTableVo> getRolePermissionTable(Long roleId) {
+        if (roleId == null) {
+            return new ArrayList<>();
+        }
+
+        // 1. 查询角色拥有的菜单ID列表
+        List<Long> menuIds = getMenuIdsByRoleId(roleId);
+        if (menuIds == null || menuIds.isEmpty()) {
+            return new ArrayList<>();
+        }
+
+        // 2. 查询这些菜单的详细信息
+        LambdaQueryWrapper<StorePlatformMenu> menuQueryWrapper = new LambdaQueryWrapper<>();
+        menuQueryWrapper.in(StorePlatformMenu::getMenuId, menuIds);
+        menuQueryWrapper.eq(StorePlatformMenu::getDelFlag, "0");
+        menuQueryWrapper.eq(StorePlatformMenu::getStatus, "0");
+        menuQueryWrapper.orderByAsc(StorePlatformMenu::getMenuSort);
+        List<StorePlatformMenu> menus = storePlatformMenuMapper.selectList(menuQueryWrapper);
+
+        if (menus == null || menus.isEmpty()) {
+            return new ArrayList<>();
+        }
+
+        // 3. 找出最高层级
+        Integer maxLevel = menus.stream()
+                .map(StorePlatformMenu::getLevel)
+                .filter(Objects::nonNull)
+                .max(Integer::compareTo)
+                .orElse(1);
+
+        // 4. 如果需要,补充父级权限
+        Set<Long> allMenuIds = new HashSet<>(menuIds);
+        if (maxLevel >= 3) {
+            // 如果有三级权限,需要补充一级和二级父权限
+            for (StorePlatformMenu menu : menus) {
+                if (menu.getLevel() != null && menu.getLevel() == 3) {
+                    // 补充二级父权限
+                    if (menu.getParentId() != null && menu.getParentId() != 0) {
+                        allMenuIds.add(menu.getParentId());
+                        // 补充一级父权限
+                        StorePlatformMenu level2Menu = storePlatformMenuMapper.selectById(menu.getParentId());
+                        if (level2Menu != null && level2Menu.getParentId() != null && level2Menu.getParentId() != 0) {
+                            allMenuIds.add(level2Menu.getParentId());
+                        }
+                    }
+                }
+            }
+        } else if (maxLevel == 2) {
+            // 如果只有二级权限,需要补充一级父权限
+            for (StorePlatformMenu menu : menus) {
+                if (menu.getLevel() != null && menu.getLevel() == 2) {
+                    if (menu.getParentId() != null && menu.getParentId() != 0) {
+                        allMenuIds.add(menu.getParentId());
+                    }
+                }
+            }
+        }
+
+        // 5. 查询所有需要的菜单(包括补充的父级权限)
+        if (allMenuIds.size() > menuIds.size()) {
+            LambdaQueryWrapper<StorePlatformMenu> allMenuQueryWrapper = new LambdaQueryWrapper<>();
+            allMenuQueryWrapper.in(StorePlatformMenu::getMenuId, allMenuIds);
+            allMenuQueryWrapper.eq(StorePlatformMenu::getDelFlag, "0");
+            allMenuQueryWrapper.eq(StorePlatformMenu::getStatus, "0");
+            allMenuQueryWrapper.orderByAsc(StorePlatformMenu::getMenuSort);
+            menus = storePlatformMenuMapper.selectList(allMenuQueryWrapper);
+        }
+
+        // 6. 按层级分组
+        Map<Integer, List<StorePlatformMenu>> menusByLevel = menus.stream()
+                .filter(menu -> menu.getLevel() != null)
+                .collect(Collectors.groupingBy(StorePlatformMenu::getLevel));
+
+        // 7. 构建表格数据
+        List<RolePermissionTableVo> tableData = new ArrayList<>();
+
+        // 获取一级权限
+        List<StorePlatformMenu> level1Menus = menusByLevel.getOrDefault(1, new ArrayList<>());
+        level1Menus.sort(Comparator.comparing(StorePlatformMenu::getMenuSort, Comparator.nullsLast(Integer::compareTo)));
+
+        for (StorePlatformMenu level1Menu : level1Menus) {
+            // 获取该一级权限下的二级权限
+            List<StorePlatformMenu> level2Menus = menusByLevel.getOrDefault(2, new ArrayList<>()).stream()
+                    .filter(menu -> level1Menu.getMenuId().equals(menu.getParentId()))
+                    .sorted(Comparator.comparing(StorePlatformMenu::getMenuSort, Comparator.nullsLast(Integer::compareTo)))
+                    .collect(Collectors.toList());
+
+            if (level2Menus.isEmpty()) {
+                // 如果只有一级权限,只显示一级权限
+                RolePermissionTableVo vo = new RolePermissionTableVo();
+                vo.setLevel1Permission(level1Menu.getMenuName());
+                tableData.add(vo);
+            } else {
+                // 如果有二级权限,遍历二级权限
+                for (StorePlatformMenu level2Menu : level2Menus) {
+                    // 获取该二级权限下的三级权限
+                    List<StorePlatformMenu> level3Menus = menusByLevel.getOrDefault(3, new ArrayList<>()).stream()
+                            .filter(menu -> level2Menu.getMenuId().equals(menu.getParentId()))
+                            .sorted(Comparator.comparing(StorePlatformMenu::getMenuSort, Comparator.nullsLast(Integer::compareTo)))
+                            .collect(Collectors.toList());
+
+                    if (level3Menus.isEmpty()) {
+                        // 如果只有二级权限,显示一级和二级权限
+                        RolePermissionTableVo vo = new RolePermissionTableVo();
+                        vo.setLevel1Permission(level1Menu.getMenuName());
+                        vo.setLevel2Permission(level2Menu.getMenuName());
+                        tableData.add(vo);
+                    } else {
+                        // 如果有三级权限,显示一级、二级、三级权限
+                        // 将三级权限名称用空格连接
+                        String level3PermissionNames = level3Menus.stream()
+                                .map(StorePlatformMenu::getMenuName)
+                                .collect(Collectors.joining(" "));
+                        RolePermissionTableVo vo = new RolePermissionTableVo();
+                        vo.setLevel1Permission(level1Menu.getMenuName());
+                        vo.setLevel2Permission(level2Menu.getMenuName());
+                        vo.setLevel3Permission(level3PermissionNames);
+                        tableData.add(vo);
+                    }
+                }
+            }
+        }
+
+        return tableData;
+    }
 }
 

+ 112 - 2
alien-store-platform/src/main/java/shop/alien/storeplatform/service/impl/StorePlatformRoleServiceImpl.java

@@ -12,7 +12,6 @@ import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.util.StringUtils;
 import shop.alien.entity.store.StorePlatformRole;
-import shop.alien.entity.store.vo.RolePermissionVo;
 import shop.alien.entity.store.vo.StorePlatformRoleVo;
 import shop.alien.mapper.StorePlatformRoleMapper;
 import shop.alien.storeplatform.service.StorePlatformRoleMenuService;
@@ -170,6 +169,117 @@ public class StorePlatformRoleServiceImpl extends ServiceImpl<StorePlatformRoleM
     }
 
     @Override
+    public boolean updateRoleWithMenus(StorePlatformRole role, List<Long> menuIds) {
+        if (role.getRoleId() == null) {
+            log.error("角色ID不能为空");
+            return false;
+        }
+
+        // 1. 查询原始角色信息
+        StorePlatformRole originalRole = storePlatformRoleMapper.selectById(role.getRoleId());
+        if (originalRole == null) {
+            log.error("角色不存在,roleId={}", role.getRoleId());
+            return false;
+        }
+
+        // 2. 校验角色类型(roleName)是否变化
+        boolean roleNameChanged = false;
+        if (StringUtils.hasText(role.getRoleName()) && 
+            !role.getRoleName().equals(originalRole.getRoleName())) {
+            // 角色名称变化,需要校验是否重复
+            // 使用传入的 storeId,如果没有则使用原始角色的 storeId
+            Integer storeId = role.getStoreId() != null ? role.getStoreId() : originalRole.getStoreId();
+            if (checkRoleNameExists(storeId, role.getRoleName(), role.getRoleId())) {
+                log.error("角色名称已存在,不允许重复:{}", role.getRoleName());
+                return false;
+            }
+            roleNameChanged = true;
+            log.info("角色名称发生变化:{} -> {}", originalRole.getRoleName(), role.getRoleName());
+        }
+
+        // 3. 如果角色类型有变化,更新 store_platform_role 表
+        if (roleNameChanged || role.getRoleSort() != null || 
+            StringUtils.hasText(role.getStatus()) || StringUtils.hasText(role.getDescription()) ||
+            StringUtils.hasText(role.getRoleNameEn()) || StringUtils.hasText(role.getRemark())) {
+            // 只更新传入的字段,保留原有字段
+            StorePlatformRole updateRole = new StorePlatformRole();
+            updateRole.setRoleId(role.getRoleId());
+            if (roleNameChanged && StringUtils.hasText(role.getRoleName())) {
+                updateRole.setRoleName(role.getRoleName());
+            }
+            if (role.getRoleSort() != null) {
+                updateRole.setRoleSort(role.getRoleSort());
+            }
+            if (StringUtils.hasText(role.getStatus())) {
+                updateRole.setStatus(role.getStatus());
+            }
+            if (StringUtils.hasText(role.getDescription())) {
+                updateRole.setDescription(role.getDescription());
+            }
+            if (StringUtils.hasText(role.getRoleNameEn())) {
+                updateRole.setRoleNameEn(role.getRoleNameEn());
+            }
+            if (StringUtils.hasText(role.getRemark())) {
+                updateRole.setRemark(role.getRemark());
+            }
+            
+            int updateResult = storePlatformRoleMapper.updateById(updateRole);
+            if (updateResult <= 0) {
+                log.error("更新角色信息失败,roleId={}", role.getRoleId());
+                return false;
+            }
+            log.info("成功更新角色信息,roleId={}", role.getRoleId());
+        }
+
+        // 4. 查询当前角色的权限列表
+        List<Long> currentMenuIds = storePlatformRoleMenuService.getMenuIdsByRoleId(role.getRoleId());
+        
+        // 5. 比较权限是否变化
+        boolean permissionsChanged = false;
+        if (menuIds != null) {
+            // 排序后比较,避免顺序不同导致的误判
+            List<Long> sortedCurrent = currentMenuIds != null ? 
+                currentMenuIds.stream().sorted().collect(Collectors.toList()) : 
+                java.util.Collections.emptyList();
+            List<Long> sortedNew = menuIds.stream().sorted().collect(Collectors.toList());
+            
+            if (!sortedCurrent.equals(sortedNew)) {
+                permissionsChanged = true;
+                log.info("权限发生变化,roleId={}, 原权限={}, 新权限={}", 
+                    role.getRoleId(), sortedCurrent, sortedNew);
+            }
+        } else {
+            // 如果传入的 menuIds 为 null,但当前有权限,也算变化
+            if (currentMenuIds != null && !currentMenuIds.isEmpty()) {
+                permissionsChanged = true;
+                log.info("权限发生变化(清空权限),roleId={}, 原权限={}", role.getRoleId(), currentMenuIds);
+            }
+        }
+
+        // 6. 如果权限有变化,更新 store_platform_role_menu 表
+        if (permissionsChanged) {
+            // 先删除所有现有权限
+            boolean removeResult = storePlatformRoleMenuService.removeAllMenus(role.getRoleId());
+            if (!removeResult) {
+                log.error("删除角色权限失败,roleId={}", role.getRoleId());
+                return false;
+            }
+            
+            // 如果有新权限,则添加
+            if (menuIds != null && !menuIds.isEmpty()) {
+                boolean assignResult = storePlatformRoleMenuService.assignMenus(role.getRoleId(), menuIds);
+                if (!assignResult) {
+                    log.error("分配角色权限失败,roleId={}", role.getRoleId());
+                    return false;
+                }
+            }
+            log.info("成功更新角色权限,roleId={}, menuIds={}", role.getRoleId(), menuIds);
+        }
+
+        return true;
+    }
+
+    @Override
     public boolean deleteRole(Long roleId) {
         // 逻辑删除
         LambdaUpdateWrapper<StorePlatformRole> updateWrapper = new LambdaUpdateWrapper<>();
@@ -226,7 +336,7 @@ public class StorePlatformRoleServiceImpl extends ServiceImpl<StorePlatformRoleM
                     BeanUtils.copyProperties(role, vo);
                     
                     // 统计关联子账号数量
-                    List<Integer> userIds = storePlatformUserRoleService.getUserIdsByRoleId(role.getRoleId());
+                    List<Integer> userIds = storePlatformUserRoleService.getUserIdsByRoleId(role.getRoleId(),storeId);
                     vo.setSubAccountCount(userIds != null ? userIds.size() : 0);
                     
                     // 统计关联权限数量

+ 93 - 11
alien-store-platform/src/main/java/shop/alien/storeplatform/service/impl/StorePlatformUserRoleServiceImpl.java

@@ -7,9 +7,12 @@ import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 import shop.alien.entity.store.StorePlatformUserRole;
+import shop.alien.entity.store.StoreUser;
 import shop.alien.mapper.StorePlatformUserRoleMapper;
+import shop.alien.mapper.StoreUserMapper;
 import shop.alien.storeplatform.service.StorePlatformUserRoleService;
 
+import java.util.Date;
 import java.util.List;
 import java.util.stream.Collectors;
 
@@ -26,37 +29,41 @@ import java.util.stream.Collectors;
 public class StorePlatformUserRoleServiceImpl extends ServiceImpl<StorePlatformUserRoleMapper, StorePlatformUserRole> implements StorePlatformUserRoleService {
 
     private final StorePlatformUserRoleMapper storePlatformUserRoleMapper;
+    private final StoreUserMapper storeUserMapper;
 
     @Override
-    public List<Long> getRoleIdsByUserId(Integer userId) {
+    public List<Long> getRoleIdsByUserId(Integer userId, Integer storeId) {
         LambdaQueryWrapper<StorePlatformUserRole> queryWrapper = new LambdaQueryWrapper<>();
-        queryWrapper.eq(StorePlatformUserRole::getUserId, userId);
+        queryWrapper.eq(StorePlatformUserRole::getUserId, userId)
+                .eq(StorePlatformUserRole::getStoreId, storeId);
         List<StorePlatformUserRole> list = storePlatformUserRoleMapper.selectList(queryWrapper);
         return list.stream().map(StorePlatformUserRole::getRoleId).collect(Collectors.toList());
     }
 
     @Override
-    public List<Integer> getUserIdsByRoleId(Long roleId) {
+    public List<Integer> getUserIdsByRoleId(Long roleId, Integer storeId) {
         LambdaQueryWrapper<StorePlatformUserRole> queryWrapper = new LambdaQueryWrapper<>();
-        queryWrapper.eq(StorePlatformUserRole::getRoleId, roleId);
+        queryWrapper.eq(StorePlatformUserRole::getRoleId, roleId)
+                .eq(StorePlatformUserRole::getStoreId, storeId);
         List<StorePlatformUserRole> list = storePlatformUserRoleMapper.selectList(queryWrapper);
         return list.stream().map(StorePlatformUserRole::getUserId).collect(Collectors.toList());
     }
 
     @Override
-    public boolean assignRoles(Integer userId, List<Long> roleIds) {
-        if (userId == null || roleIds == null || roleIds.isEmpty()) {
+    public boolean assignRoles(Integer userId, List<Long> roleIds, Integer storeId) {
+        if (userId == null || roleIds == null || roleIds.isEmpty() || storeId == null) {
             log.error("参数不能为空");
             return false;
         }
         // 先删除用户的所有角色
-        removeAllRoles(userId);
+        removeAllRoles(userId, storeId);
         // 批量插入新角色
         List<StorePlatformUserRole> userRoles = roleIds.stream()
                 .map(roleId -> {
                     StorePlatformUserRole userRole = new StorePlatformUserRole();
                     userRole.setUserId(userId);
                     userRole.setRoleId(roleId);
+                    userRole.setStoreId(storeId);
                     return userRole;
                 })
                 .collect(Collectors.toList());
@@ -64,18 +71,93 @@ public class StorePlatformUserRoleServiceImpl extends ServiceImpl<StorePlatformU
     }
 
     @Override
-    public boolean removeAllRoles(Integer userId) {
+    public boolean removeAllRoles(Integer userId, Integer storeId) {
         LambdaQueryWrapper<StorePlatformUserRole> queryWrapper = new LambdaQueryWrapper<>();
-        queryWrapper.eq(StorePlatformUserRole::getUserId, userId);
+        queryWrapper.eq(StorePlatformUserRole::getUserId, userId)
+                .eq(StorePlatformUserRole::getStoreId, storeId);
         return storePlatformUserRoleMapper.delete(queryWrapper) >= 0;
     }
 
     @Override
-    public boolean removeRole(Integer userId, Long roleId) {
+    public boolean removeRole(Integer userId, Long roleId, Integer storeId) {
         LambdaQueryWrapper<StorePlatformUserRole> queryWrapper = new LambdaQueryWrapper<>();
         queryWrapper.eq(StorePlatformUserRole::getUserId, userId)
-                .eq(StorePlatformUserRole::getRoleId, roleId);
+                .eq(StorePlatformUserRole::getRoleId, roleId)
+                .eq(StorePlatformUserRole::getStoreId, storeId);
         return storePlatformUserRoleMapper.delete(queryWrapper) > 0;
     }
+
+    @Override
+    public boolean createAccountAndAssignRole(String phone, String accountName, Integer storeId, Long roleId) {
+        if (phone == null || phone.isEmpty() || storeId == null || roleId == null) {
+            log.error("参数不能为空: phone={}, storeId={}, roleId={}", phone, storeId, roleId);
+            return false;
+        }
+
+        try {
+            // 1. 根据手机号查询 store_user 表
+            LambdaQueryWrapper<StoreUser> userQueryWrapper = new LambdaQueryWrapper<>();
+            userQueryWrapper.eq(StoreUser::getPhone, phone);
+            StoreUser storeUser = storeUserMapper.selectOne(userQueryWrapper);
+
+            Integer userId;
+            if (storeUser == null) {
+                // 2. 如果没有数据,则插入一条数据
+                StoreUser newUser = new StoreUser();
+                newUser.setPhone(phone);
+                newUser.setName(accountName != null ? accountName : phone);
+                newUser.setStoreId(storeId);
+                newUser.setStatus(0); // 0:启用
+                newUser.setDeleteFlag(0); // 0:未删除
+                newUser.setMoney(0);
+//                newUser.setPassType(0); // 0:初始密码
+                newUser.setLogoutFlag(0); // 0:未注销
+                newUser.setAlipayAccount("2");
+                newUser.setNickName(accountName != null ? accountName : phone);
+                newUser.setCreatedTime(new Date());
+                
+                int insertResult = storeUserMapper.insert(newUser);
+                if (insertResult <= 0) {
+                    log.error("插入 store_user 表失败: phone={}", phone);
+                    return false;
+                }
+                userId = newUser.getId();
+                log.info("成功创建新用户: phone={}, userId={}", phone, userId);
+            } else {
+                userId = storeUser.getId();
+                log.info("用户已存在: phone={}, userId={}", phone, userId);
+            }
+
+            // 3. 通过 store_id 和 user_id 查询 store_platform_user_role 表
+            LambdaQueryWrapper<StorePlatformUserRole> roleQueryWrapper = new LambdaQueryWrapper<>();
+            roleQueryWrapper.eq(StorePlatformUserRole::getUserId, userId)
+                    .eq(StorePlatformUserRole::getStoreId, storeId)
+                    .eq(StorePlatformUserRole::getRoleId, roleId);
+            StorePlatformUserRole existingRole = storePlatformUserRoleMapper.selectOne(roleQueryWrapper);
+
+            if (existingRole == null) {
+                // 4. 如果没有数据,则插入数据
+                StorePlatformUserRole userRole = new StorePlatformUserRole();
+                userRole.setUserId(userId);
+                userRole.setRoleId(roleId);
+                userRole.setStoreId(storeId);
+                userRole.setCreatedTime(new Date());
+                
+                boolean insertRoleResult = this.save(userRole);
+                if (!insertRoleResult) {
+                    log.error("插入 store_platform_user_role 表失败: userId={}, storeId={}, roleId={}", userId, storeId, roleId);
+                    return false;
+                }
+                log.info("成功分配角色: userId={}, storeId={}, roleId={}", userId, storeId, roleId);
+            } else {
+                log.info("用户角色关系已存在: userId={}, storeId={}, roleId={}", userId, storeId, roleId);
+            }
+
+            return true;
+        } catch (Exception e) {
+            log.error("创建账号并分配角色失败: phone={}, storeId={}, roleId={}", phone, storeId, roleId, e);
+            return false;
+        }
+    }
 }