浏览代码

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

liudongzhi 3 月之前
父节点
当前提交
23ff2a5934

+ 25 - 0
alien-entity/src/main/java/shop/alien/entity/store/vo/PermissionItemVo.java

@@ -0,0 +1,25 @@
+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 = "PermissionItemVo对象", description = "权限项VO")
+public class PermissionItemVo {
+
+    @ApiModelProperty(value = "权限ID(菜单ID)")
+    private Long permissionId;
+
+    @ApiModelProperty(value = "权限名称(菜单名称)")
+    private String permissionName;
+}
+

+ 39 - 0
alien-entity/src/main/java/shop/alien/entity/store/vo/SubAccountDetailVo.java

@@ -0,0 +1,39 @@
+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;
+
+import java.util.List;
+
+/**
+ * 子账号详情VO(用于编辑账号页面)
+ *
+ * @author system
+ * @since 2025-01-XX
+ */
+@Data
+@JsonInclude
+@ApiModel(value = "SubAccountDetailVo对象", description = "子账号详情VO(用于编辑账号页面)")
+public class SubAccountDetailVo {
+
+    @ApiModelProperty(value = "用户ID")
+    private Integer userId;
+
+    @ApiModelProperty(value = "账号名称")
+    private String accountName;
+
+    @ApiModelProperty(value = "手机号")
+    private String phone;
+
+    @ApiModelProperty(value = "角色ID")
+    private Long roleId;
+
+    @ApiModelProperty(value = "角色名称")
+    private String roleName;
+
+    @ApiModelProperty(value = "权限列表(权限名称列表)")
+    private List<PermissionItemVo> permissions;
+}
+

+ 1 - 0
alien-entity/src/main/resources/mapper/StorePlatformUserRoleMapper.xml

@@ -12,6 +12,7 @@
             sur.phone AS phone,
             spr.role_id AS roleId,
             spr.role_name AS roleName,
+            spur.store_id AS storeId,
             0 AS permissionCount
         FROM store_platform_user_role spur
         INNER JOIN store_user sur ON spur.user_id = sur.id

+ 53 - 2
alien-store-platform/src/main/java/shop/alien/storeplatform/controller/StorePlatformUserRoleController.java

@@ -5,8 +5,10 @@ import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.web.bind.annotation.*;
 import shop.alien.entity.result.R;
+import shop.alien.entity.store.vo.SubAccountDetailVo;
 import shop.alien.entity.store.vo.SubAccountVo;
 import shop.alien.storeplatform.dto.AssignRolesDto;
+import shop.alien.storeplatform.dto.BatchDeleteSubAccountDto;
 import shop.alien.storeplatform.dto.CreateAccountDto;
 import shop.alien.storeplatform.service.StorePlatformUserRoleService;
 import shop.alien.storeplatform.annotation.PlatformOperationLog;
@@ -103,8 +105,12 @@ public class StorePlatformUserRoleController {
             type = "移除角色",
             content = "移除用户ID=#{#userId}的角色ID=#{#roleId}(店铺ID=#{#storeId})"
     )
-    @DeleteMapping("/removeRole")
-    public R<String> removeRole(@RequestParam("userId") Integer userId, @RequestParam("roleId") Long roleId, @RequestParam("storeId") Integer storeId) {
+    @GetMapping("/removeRole")
+    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) {
@@ -157,5 +163,50 @@ public class StorePlatformUserRoleController {
         return R.data(subAccountList);
     }
 
+    @ApiOperation("查询子账号详情")
+    @ApiOperationSupport(order = 8)
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "userId", value = "用户ID", dataType = "int", paramType = "query", required = true),
+            @ApiImplicitParam(name = "storeId", value = "店铺ID", dataType = "int", paramType = "query", required = true)
+    })
+    @GetMapping("/getSubAccountDetail")
+    public R<SubAccountDetailVo> getSubAccountDetail(
+            @RequestParam("userId") Integer userId,
+            @RequestParam("storeId") Integer storeId) {
+        log.info("StorePlatformUserRoleController.getSubAccountDetail?userId={}, storeId={}", userId, storeId);
+        SubAccountDetailVo detail = storePlatformUserRoleService.getSubAccountDetail(userId, storeId);
+        if (detail == null) {
+            return R.fail("子账号不存在");
+        }
+        return R.data(detail);
+    }
+
+    @ApiOperation("批量删除子账号")
+    @ApiOperationSupport(order = 9)
+    @PlatformOperationLog(
+            module = "账号操作记录",
+            type = "批量删除子账号",
+            content = "批量删除子账号(店铺ID=#{#p0.storeId},用户数量=#{#p0.userIds != null ? #p0.userIds.size() : 0})"
+    )
+    @PostMapping("/batchDeleteSubAccounts")
+    public R<String> batchDeleteSubAccounts(@RequestBody BatchDeleteSubAccountDto batchDeleteDto) {
+        log.info("StorePlatformUserRoleController.batchDeleteSubAccounts?storeId={}, userIds={}", 
+                batchDeleteDto.getStoreId(), batchDeleteDto.getUserIds());
+        
+        if (batchDeleteDto.getStoreId() == null) {
+            return R.fail("店铺ID不能为空");
+        }
+        if (batchDeleteDto.getUserIds() == null || batchDeleteDto.getUserIds().isEmpty()) {
+            return R.fail("用户ID列表不能为空");
+        }
+        
+        boolean result = storePlatformUserRoleService.batchDeleteSubAccounts(
+                batchDeleteDto.getUserIds(), batchDeleteDto.getStoreId());
+        if (result) {
+            return R.success("批量删除成功");
+        }
+        return R.fail("批量删除失败");
+    }
+
 }
 

+ 25 - 0
alien-store-platform/src/main/java/shop/alien/storeplatform/dto/BatchDeleteSubAccountDto.java

@@ -0,0 +1,25 @@
+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 = "BatchDeleteSubAccountDto", description = "批量删除子账号请求参数")
+public class BatchDeleteSubAccountDto {
+
+    @ApiModelProperty(value = "店铺ID", required = true)
+    private Integer storeId;
+
+    @ApiModelProperty(value = "用户ID列表", required = true)
+    private List<Integer> userIds;
+}
+

+ 20 - 0
alien-store-platform/src/main/java/shop/alien/storeplatform/service/StorePlatformUserRoleService.java

@@ -2,6 +2,7 @@ package shop.alien.storeplatform.service;
 
 import com.baomidou.mybatisplus.extension.service.IService;
 import shop.alien.entity.store.StorePlatformUserRole;
+import shop.alien.entity.store.vo.SubAccountDetailVo;
 import shop.alien.entity.store.vo.SubAccountVo;
 
 import java.util.List;
@@ -87,5 +88,24 @@ public interface StorePlatformUserRoleService extends IService<StorePlatformUser
      * @return 子账号列表
      */
     List<SubAccountVo> querySubAccounts(Integer storeId, String accountName, String phone, String roleName);
+
+    /**
+     * 根据用户ID和店铺ID查询子账号详情(用于编辑账号页面)
+     * 包含账号基本信息、角色信息和权限列表
+     *
+     * @param userId  用户ID
+     * @param storeId 店铺ID
+     * @return 子账号详情
+     */
+    SubAccountDetailVo getSubAccountDetail(Integer userId, Integer storeId);
+
+    /**
+     * 批量逻辑删除子账号(删除用户角色关联关系)
+     *
+     * @param userIds 用户ID列表
+     * @param storeId 店铺ID
+     * @return 是否成功
+     */
+    boolean batchDeleteSubAccounts(List<Integer> userIds, Integer storeId);
 }
 

+ 121 - 4
alien-store-platform/src/main/java/shop/alien/storeplatform/service/impl/StorePlatformUserRoleServiceImpl.java

@@ -1,14 +1,21 @@
 package shop.alien.storeplatform.service.impl;
 
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
+import shop.alien.entity.store.StorePlatformMenu;
+import shop.alien.entity.store.StorePlatformRole;
 import shop.alien.entity.store.StorePlatformUserRole;
 import shop.alien.entity.store.StoreUser;
+import shop.alien.entity.store.vo.PermissionItemVo;
+import shop.alien.entity.store.vo.SubAccountDetailVo;
 import shop.alien.entity.store.vo.SubAccountVo;
+import shop.alien.mapper.StorePlatformMenuMapper;
+import shop.alien.mapper.StorePlatformRoleMapper;
 import shop.alien.mapper.StorePlatformUserRoleMapper;
 import shop.alien.mapper.StoreUserMapper;
 import shop.alien.storeplatform.service.StorePlatformRoleMenuService;
@@ -34,6 +41,8 @@ public class StorePlatformUserRoleServiceImpl extends ServiceImpl<StorePlatformU
     private final StorePlatformUserRoleMapper storePlatformUserRoleMapper;
     private final StoreUserMapper storeUserMapper;
     private final StorePlatformRoleMenuService storePlatformRoleMenuService;
+    private final StorePlatformRoleMapper storePlatformRoleMapper;
+    private final StorePlatformMenuMapper storePlatformMenuMapper;
 
     @Override
     public List<Long> getRoleIdsByUserId(Integer userId, Integer storeId) {
@@ -84,11 +93,13 @@ public class StorePlatformUserRoleServiceImpl extends ServiceImpl<StorePlatformU
 
     @Override
     public boolean removeRole(Integer userId, Long roleId, Integer storeId) {
-        LambdaQueryWrapper<StorePlatformUserRole> queryWrapper = new LambdaQueryWrapper<>();
-        queryWrapper.eq(StorePlatformUserRole::getUserId, userId)
+        // 逻辑删除
+        LambdaUpdateWrapper<StorePlatformUserRole> updateWrapper = new LambdaUpdateWrapper<>();
+        updateWrapper.eq(StorePlatformUserRole::getUserId, userId)
                 .eq(StorePlatformUserRole::getRoleId, roleId)
-                .eq(StorePlatformUserRole::getStoreId, storeId);
-        return storePlatformUserRoleMapper.delete(queryWrapper) > 0;
+                .eq(StorePlatformUserRole::getStoreId, storeId)
+                .set(StorePlatformUserRole::getDeleteFlag, 1); // 1代表删除
+        return storePlatformUserRoleMapper.update(null, updateWrapper) > 0;
     }
 
     @Override
@@ -195,5 +206,111 @@ public class StorePlatformUserRoleServiceImpl extends ServiceImpl<StorePlatformU
             return new ArrayList<>();
         }
     }
+
+    @Override
+    public SubAccountDetailVo getSubAccountDetail(Integer userId, Integer storeId) {
+        if (userId == null || storeId == null) {
+            log.error("用户ID或店铺ID不能为空: userId={}, storeId={}", userId, storeId);
+            return null;
+        }
+
+        try {
+            SubAccountDetailVo detailVo = new SubAccountDetailVo();
+            detailVo.setUserId(userId);
+
+            // 1. 查询用户基本信息
+            StoreUser storeUser = storeUserMapper.selectById(userId);
+            if (storeUser == null) {
+                log.error("用户不存在: userId={}", userId);
+                return null;
+            }
+            
+            // 设置账号名称(优先使用 name,否则使用 nick_name)
+            String accountName = storeUser.getName();
+            if (accountName == null || accountName.isEmpty()) {
+                accountName = storeUser.getNickName();
+            }
+            detailVo.setAccountName(accountName);
+            detailVo.setPhone(storeUser.getPhone());
+
+            // 2. 查询用户角色关联(根据userId和storeId查询)
+            LambdaQueryWrapper<StorePlatformUserRole> userRoleQueryWrapper = new LambdaQueryWrapper<>();
+            userRoleQueryWrapper.eq(StorePlatformUserRole::getUserId, userId)
+                    .eq(StorePlatformUserRole::getStoreId, storeId);
+            StorePlatformUserRole userRole = storePlatformUserRoleMapper.selectOne(userRoleQueryWrapper);
+
+            if (userRole != null && userRole.getRoleId() != null) {
+                Long roleId = userRole.getRoleId();
+                detailVo.setRoleId(roleId);
+
+                // 3. 查询角色信息
+                StorePlatformRole role = storePlatformRoleMapper.selectById(roleId);
+                if (role != null) {
+                    detailVo.setRoleName(role.getRoleName());
+                }
+
+                // 4. 查询权限列表(菜单列表)
+                List<Long> menuIds = storePlatformRoleMenuService.getMenuIdsByRoleId(roleId);
+                if (menuIds != null && !menuIds.isEmpty()) {
+                    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);
+
+                    // 转换为权限项VO列表
+                    List<PermissionItemVo> permissionList = menus.stream()
+                            .map(menu -> {
+                                PermissionItemVo permissionItem = new PermissionItemVo();
+                                permissionItem.setPermissionId(menu.getMenuId());
+                                permissionItem.setPermissionName(menu.getMenuName());
+                                return permissionItem;
+                            })
+                            .collect(Collectors.toList());
+                    detailVo.setPermissions(permissionList);
+                } else {
+                    detailVo.setPermissions(new ArrayList<>());
+                }
+            } else {
+                // 如果没有角色,设置为空
+                detailVo.setRoleId(null);
+                detailVo.setRoleName(null);
+                detailVo.setPermissions(new ArrayList<>());
+            }
+
+            return detailVo;
+        } catch (Exception e) {
+            log.error("查询子账号详情失败: userId={}, storeId={}", userId, storeId, e);
+            return null;
+        }
+    }
+
+    @Override
+    public boolean batchDeleteSubAccounts(List<Integer> userIds, Integer storeId) {
+        if (userIds == null || userIds.isEmpty()) {
+            log.error("用户ID列表不能为空");
+            return false;
+        }
+        if (storeId == null) {
+            log.error("店铺ID不能为空");
+            return false;
+        }
+
+        try {
+            // 批量逻辑删除用户角色关联关系
+            LambdaUpdateWrapper<StorePlatformUserRole> updateWrapper = new LambdaUpdateWrapper<>();
+            updateWrapper.eq(StorePlatformUserRole::getStoreId, storeId)
+                    .in(StorePlatformUserRole::getUserId, userIds)
+                    .set(StorePlatformUserRole::getDeleteFlag, 1); // 1代表删除
+
+            int result = storePlatformUserRoleMapper.update(null, updateWrapper);
+            log.info("批量删除子账号成功: storeId={}, userIds={}, 删除数量={}", storeId, userIds, result);
+            return result > 0;
+        } catch (Exception e) {
+            log.error("批量删除子账号失败: storeId={}, userIds={}", storeId, userIds, e);
+            return false;
+        }
+    }
 }