Forráskód Böngészése

用户角色关联导入功能

xy 1 hete
szülő
commit
802bf0677e

+ 17 - 0
tz-module-system/tz-module-system-biz/src/main/java/cn/start/tz/module/system/controller/admin/user/UserController.java

@@ -204,6 +204,23 @@ public class UserController {
         return success(userService.importUserList(list, updateSupport));
     }
 
+    @GetMapping("/get-import-role-template")
+    @Operation(summary = "获得导入用户角色关联模板")
+    public void importRoleTemplate(HttpServletResponse response) throws IOException {
+        List<UserRoleImportExcelVO> list = Arrays.asList(
+                UserRoleImportExcelVO.builder().username("dexdev").roleCode("super_admin").build(),
+                UserRoleImportExcelVO.builder().username("admin").roleCode("admin").build()
+        );
+        ExcelUtils.write(response, "用户角色关联导入模板.xls", "用户角色关联", UserRoleImportExcelVO.class, list);
+    }
+
+    @PostMapping("/import-role")
+    @Operation(summary = "导入用户角色关联")
+    public CommonResult<UserRoleImportRespVO> importUserRoleExcel(@RequestParam("file") MultipartFile file) throws Exception {
+        List<UserRoleImportExcelVO> list = ExcelUtils.read(file, UserRoleImportExcelVO.class);
+        return success(userService.importUserRoleList(list));
+    }
+
     @PostMapping("/assign-role")
     @Operation(summary = "分配用户角色", description = "给单个用户或整个部门的用户分配角色")
     public CommonResult<Boolean> assignRole(@Valid @RequestBody UserAssignRoleReqVO reqVO) {

+ 28 - 0
tz-module-system/tz-module-system-biz/src/main/java/cn/start/tz/module/system/controller/admin/user/vo/user/UserRoleImportExcelVO.java

@@ -0,0 +1,28 @@
+package cn.start.tz.module.system.controller.admin.user.vo.user;
+
+import com.alibaba.excel.annotation.ExcelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.experimental.Accessors;
+
+/**
+ * 用户角色关联导入 Excel VO
+ *
+ * @author tz
+ */
+@Data
+@Builder
+@AllArgsConstructor
+@NoArgsConstructor
+@Accessors(chain = false)
+public class UserRoleImportExcelVO {
+
+    @ExcelProperty("用户名")
+    private String username;
+
+    @ExcelProperty("角色标识")
+    private String roleCode;
+
+}

+ 26 - 0
tz-module-system/tz-module-system-biz/src/main/java/cn/start/tz/module/system/controller/admin/user/vo/user/UserRoleImportRespVO.java

@@ -0,0 +1,26 @@
+package cn.start.tz.module.system.controller.admin.user.vo.user;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Builder;
+import lombok.Data;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 用户角色关联导入 Response VO
+ *
+ * @author tz
+ */
+@Schema(description = "管理后台 - 用户角色关联导入 Response VO")
+@Data
+@Builder
+public class UserRoleImportRespVO {
+
+    @Schema(description = "关联成功的用户名数组", requiredMode = Schema.RequiredMode.REQUIRED)
+    private List<String> createUsernames;
+
+    @Schema(description = "关联失败的用户集合,key 为用户名,value 为失败原因", requiredMode = Schema.RequiredMode.REQUIRED)
+    private Map<String, String> failureUsernames;
+
+}

+ 12 - 0
tz-module-system/tz-module-system-biz/src/main/java/cn/start/tz/module/system/service/user/AdminUserService.java

@@ -8,6 +8,10 @@ import cn.start.tz.module.system.controller.admin.auth.vo.AuthRegisterReqVO;
 import cn.start.tz.module.system.controller.admin.user.vo.profile.UserProfileUpdatePasswordReqVO;
 import cn.start.tz.module.system.controller.admin.user.vo.profile.UserProfileUpdateReqVO;
 import cn.start.tz.module.system.controller.admin.user.vo.user.*;
+import cn.start.tz.module.system.controller.admin.user.vo.user.UserImportExcelVO;
+import cn.start.tz.module.system.controller.admin.user.vo.user.UserImportRespVO;
+import cn.start.tz.module.system.controller.admin.user.vo.user.UserRoleImportExcelVO;
+import cn.start.tz.module.system.controller.admin.user.vo.user.UserRoleImportRespVO;
 import cn.start.tz.module.system.dal.dataobject.user.AdminUserDO;
 import jakarta.validation.Valid;
 
@@ -197,6 +201,14 @@ public interface AdminUserService {
      */
     UserImportRespVO importUserList(List<UserImportExcelVO> importUsers, boolean isUpdateSupport);
 
+    /**
+     * 导入用户角色关联列表
+     *
+     * @param importList 导入的用户角色关联列表
+     * @return 导入结果
+     */
+    UserRoleImportRespVO importUserRoleList(List<UserRoleImportExcelVO> importList);
+
     /**
      * 获得指定状态的用户们
      *

+ 68 - 0
tz-module-system/tz-module-system-biz/src/main/java/cn/start/tz/module/system/service/user/AdminUserServiceImpl.java

@@ -20,10 +20,12 @@ import cn.start.tz.module.system.controller.admin.user.vo.profile.UserProfileUpd
 import cn.start.tz.module.system.controller.admin.user.vo.user.*;
 import cn.start.tz.module.system.dal.dataobject.dept.DeptDO;
 import cn.start.tz.module.system.dal.dataobject.dept.UserPostDO;
+import cn.start.tz.module.system.dal.dataobject.permission.RoleDO;
 import cn.start.tz.module.system.dal.dataobject.permission.UserRoleDO;
 import cn.start.tz.module.system.dal.dataobject.user.AdminUserDO;
 import cn.start.tz.module.system.dal.dataobject.userqualifications.UserQualificationsDO;
 import cn.start.tz.module.system.dal.mysql.dept.UserPostMapper;
+import cn.start.tz.module.system.dal.mysql.permission.RoleMapper;
 import cn.start.tz.module.system.dal.mysql.permission.UserRoleMapper;
 import cn.start.tz.module.system.dal.mysql.user.AdminUserMapper;
 import cn.start.tz.module.system.dal.mysql.userqualifications.UserQualificationsMapper;
@@ -89,6 +91,9 @@ public class AdminUserServiceImpl implements AdminUserService {
     @Resource
     private UserRoleMapper userRoleMapper;
 
+    @Resource
+    private RoleMapper roleMapper;
+
     @Resource
     private FileApi fileApi;
     @Resource
@@ -572,6 +577,69 @@ public class AdminUserServiceImpl implements AdminUserService {
         return respVO;
     }
 
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public UserRoleImportRespVO importUserRoleList(List<UserRoleImportExcelVO> importList) {
+        if (CollUtil.isEmpty(importList)) {
+            throw exception(USER_IMPORT_LIST_IS_EMPTY);
+        }
+
+        UserRoleImportRespVO respVO = UserRoleImportRespVO.builder()
+                .createUsernames(new ArrayList<>())
+                .failureUsernames(new LinkedHashMap<>())
+                .build();
+
+        importList.forEach(item -> {
+            try {
+                if (item.getUsername() == null || item.getUsername().trim().isEmpty()) {
+                    respVO.getFailureUsernames().put(item.getUsername() == null ? "未知" : item.getUsername(), "用户名不能为空");
+                    return;
+                }
+                if (item.getRoleCode() == null || item.getRoleCode().trim().isEmpty()) {
+                    respVO.getFailureUsernames().put(item.getUsername(), "角色标识不能为空");
+                    return;
+                }
+
+                // 1. 校验用户名是否存在
+                AdminUserDO user = userMapper.selectByUsername(item.getUsername().trim());
+                if (user == null) {
+                    respVO.getFailureUsernames().put(item.getUsername(), "用户不存在");
+                    return;
+                }
+
+                // 2. 校验角色标识是否存在
+                RoleDO role = roleMapper.selectByCode(item.getRoleCode().trim());
+                if (role == null) {
+                    respVO.getFailureUsernames().put(item.getUsername(), "角色标识不存在: " + item.getRoleCode());
+                    return;
+                }
+
+                // 3. 检查是否已关联
+                List<UserRoleDO> existList = userRoleMapper.selectList(
+                        new LambdaQueryWrapperX<UserRoleDO>()
+                                .eq(UserRoleDO::getUserId, user.getId())
+                                .eq(UserRoleDO::getRoleId, role.getId()));
+                if (CollUtil.isNotEmpty(existList)) {
+                    respVO.getFailureUsernames().put(item.getUsername(), "用户已拥有该角色");
+                    return;
+                }
+
+                // 4. 插入关联
+                UserRoleDO userRole = new UserRoleDO();
+                userRole.setUserId(user.getId());
+                userRole.setRoleId(role.getId());
+                userRoleMapper.insert(userRole);
+                respVO.getCreateUsernames().add(item.getUsername());
+
+            } catch (Exception e) {
+                log.error("[importUserRoleList] 导入用户角色关联失败: {}", item.getUsername(), e);
+                respVO.getFailureUsernames().put(item.getUsername(), "系统异常: " + e.getMessage());
+            }
+        });
+
+        return respVO;
+    }
+
     @Override
     public List<AdminUserDO> getUserListByStatus(Integer status) {
         return userMapper.selectListByStatus(status);