فهرست منبع

用户批量导入

caozixuan 3 سال پیش
والد
کامیت
7a8fd63e21

+ 72 - 0
distributed-print-business/src/main/java/com/qmth/distributed/print/business/templete/execute/AsyncSysUserDataImportService.java

@@ -0,0 +1,72 @@
+package com.qmth.distributed.print.business.templete.execute;
+
+import cn.hutool.core.date.DateUtil;
+import com.qmth.boot.api.exception.ApiException;
+import com.qmth.distributed.print.business.templete.importData.AsyncImportTaskTemplete;
+import com.qmth.distributed.print.business.templete.service.TaskLogicService;
+import com.qmth.teachcloud.common.contant.SpringContextHolder;
+import com.qmth.teachcloud.common.contant.SystemConstant;
+import com.qmth.teachcloud.common.entity.TBTask;
+import com.qmth.teachcloud.common.enums.TaskResultEnum;
+import com.qmth.teachcloud.common.enums.TaskStatusEnum;
+import com.qmth.teachcloud.common.service.TBTaskService;
+import com.qmth.teachcloud.common.util.Result;
+import com.qmth.teachcloud.common.util.ResultUtil;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.stereotype.Service;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.text.MessageFormat;
+import java.util.Date;
+import java.util.Map;
+import java.util.StringJoiner;
+
+/**
+ * @Description: 系统用户批量导入
+ * @Author: CaoZixuan
+ * @Date: 2021-08-12
+ */
+@Service
+public class AsyncSysUserDataImportService extends AsyncImportTaskTemplete {
+    private final static Logger log = LoggerFactory.getLogger(AsyncCourseDataImportService.class);
+
+    public static final String OBJ_TITLE = "用户基本信息";
+
+    @Override
+    public Result importTask(Map<String, Object> map) throws IOException, Exception {
+        TBTask tbTask = (TBTask) map.get(SystemConstant.TASK);
+        InputStream inputStream = super.getUploadFileInputStream(tbTask);
+        map.put("inputStream",inputStream);
+
+        StringJoiner stringJoinerSummary = new StringJoiner("\n")
+                .add(MessageFormat.format("{0}{1}{2}", DateUtil.format(new Date(), SystemConstant.DEFAULT_DATE_PATTERN), BEGIN_TITLE, OBJ_TITLE));
+        tbTask.setStatus(TaskStatusEnum.RUNNING);
+        TBTaskService tbTaskService = SpringContextHolder.getBean(TBTaskService.class);
+        tbTaskService.updateById(tbTask);
+        try {
+            TaskLogicService taskLogicService = SpringContextHolder.getBean(TaskLogicService.class);
+
+            // 执行导入基础学生数据
+            Map<String, Object> result = taskLogicService.executeImportSysUserLogic(map);
+
+
+            stringJoinerSummary.add(MessageFormat.format("{0}{1}{2}{3}", DateUtil.format(new Date(), SystemConstant.DEFAULT_DATE_PATTERN), FINISH_TITLE, Long.valueOf(String.valueOf(result.get("dataCount"))), FINISH_SIZE));
+            tbTask.setResult(TaskResultEnum.SUCCESS);
+        }catch (Exception e){
+            log.error("请求出错", e);
+            stringJoinerSummary.add(MessageFormat.format("{0}{1}{2}{3}", DateUtil.format(new Date(), SystemConstant.DEFAULT_DATE_PATTERN), EXCEPTION_TITLE, EXCEPTION_DATA, e.getMessage()));
+            tbTask.setResult(TaskResultEnum.ERROR);
+            if (e instanceof ApiException) {
+                ResultUtil.error((ApiException) e, e.getMessage());
+            } else {
+                ResultUtil.error(e.getMessage());
+            }
+        } finally {//生成txt文件
+            tbTask.setSummary(stringJoinerSummary.toString());
+            super.createTxt(tbTask);
+        }
+        return ResultUtil.ok(map);
+    }
+}

+ 8 - 0
distributed-print-business/src/main/java/com/qmth/distributed/print/business/templete/service/TaskLogicService.java

@@ -78,4 +78,12 @@ public interface TaskLogicService {
      * @throws Exception 异常
      */
     Map<String,Object> executeImportBasicCourseLogic(Map<String,Object> map) throws Exception;
+
+    /**
+     * 处理导入用户数据
+     * @param map 数据源
+     * @return 结果
+     * @throws Exception 异常
+     */
+    Map<String,Object> executeImportSysUserLogic(Map<String,Object> map) throws Exception;
 }

+ 49 - 0
distributed-print-business/src/main/java/com/qmth/distributed/print/business/templete/service/impl/TaskLogicServiceImpl.java

@@ -23,6 +23,7 @@ import com.qmth.distributed.print.business.templete.service.TaskLogicService;
 import com.qmth.distributed.print.business.util.CreatePdfUtil;
 import com.qmth.distributed.print.business.util.HtmlToPdfUtil;
 import com.qmth.teachcloud.common.annotation.ExcelDBFieldDesc;
+import com.qmth.teachcloud.common.bean.dto.excel.SysUserImportDto;
 import com.qmth.teachcloud.common.bean.params.ArraysParams;
 import com.qmth.teachcloud.common.contant.SystemConstant;
 import com.qmth.teachcloud.common.entity.BasicAttachment;
@@ -148,6 +149,9 @@ public class TaskLogicServiceImpl implements TaskLogicService {
     @Autowired
     ExamTaskPrintService examTaskPrintService;
 
+    @Resource
+    SysUserService sysUserService;
+
 
     /**
      * 创建pdf前置条件
@@ -1159,6 +1163,51 @@ public class TaskLogicServiceImpl implements TaskLogicService {
         return basicCourseService.executeBasicCourseImportLogic(finalList, map);
     }
 
+    @Transactional
+    @Override
+    public Map<String, Object> executeImportSysUserLogic(Map<String, Object> map) throws Exception {
+        InputStream inputStream = (InputStream) map.get("inputStream");
+        List<LinkedMultiValueMap<Integer, Object>> finalList = ExcelUtil.excelReader(inputStream, Lists.newArrayList(SysUserImportDto.class), (finalExcelList, finalColumnNameList, finalExcelErrorList) -> {
+            List<ExcelError> excelErrorTemp = new ArrayList<>();
+            Map<String,String> checkMap = new HashMap<>();
+            for (int i = 0; i < finalExcelList.size(); i++) {
+                LinkedMultiValueMap<Integer, Object> excelMap = finalExcelList.get(i);
+                List<Object> sysUserImportDtoList = excelMap.get(i);
+                for (int y = 0; y < Objects.requireNonNull(sysUserImportDtoList).size(); y++) {
+                    SysUserImportDto sysUserImportDto = (SysUserImportDto) sysUserImportDtoList.get(y);
+                    String name = sysUserImportDto.getName();
+                    String code = sysUserImportDto.getCode();
+                    String phoneNumber = sysUserImportDto.getPhoneNumber();
+                    String orgName = sysUserImportDto.getOrgName();
+                    String roleName = sysUserImportDto.getRoleName();
+
+                    // 检验excel中
+                    if (checkMap.containsKey(name)){
+                        throw ExceptionResultEnum.ERROR.exception("导入的excel中包含在重复的【name】:" + name);
+                    }else {
+                        checkMap.put(name,code);
+                    }
+
+                    excelErrorTemp.addAll(ExcelUtil.checkExcelField(sysUserImportDto, y, i));
+                    if (Objects.isNull(code) || code.length() > 30 || !code.matches(SystemConstant.REGULAR_EXPRESSION_OF_CODE)){
+                        excelErrorTemp.add(new ExcelError(y + 1,"excel第" + (i + 1) + "个sheet第" + (y + 1) + "行[课程编号]不符合输入规范"));
+                    }
+                    if (Objects.isNull(name) || name.length() > 30){
+                        excelErrorTemp.add(new ExcelError(y + 1,"excel第" + (i + 1) + "个sheet第" + (y + 1) + "行[课程名称]不符合输入规范"));
+                    }
+//                    if (Objects.isNull(phoneNumber) || !phoneNumber.matches(SystemConstant.REGULAR_EXPRESSION_OF_PHONE)){
+//                        excelErrorTemp.add(new ExcelError(y + 1,"excel第" + (i + 1) + "个sheet第" + (y + 1) + "行[电话号码]不符合输入规范"));
+//                    }
+                }
+            }
+            if (excelErrorTemp.size() > 0) {
+                throw ExceptionResultEnum.ERROR.exception(JSONObject.toJSONString(excelErrorTemp));
+            }
+            return finalExcelList;
+        });
+        return sysUserService.executeSysUserImportLogic(finalList,map);
+    }
+
 
     public String createTempNumber(SerialNumberParams serialNumberParams) {
         return convertUtil.getIncre(serialNumberParams.getPrefix(), serialNumberParams.getModel(), serialNumberParams.getDigit());

+ 32 - 3
distributed-print/src/main/java/com/qmth/distributed/print/api/SysUserController.java

@@ -1,24 +1,35 @@
 package com.qmth.distributed.print.api;
 
+import com.qmth.boot.api.annotation.Aac;
+import com.qmth.boot.api.annotation.BOOL;
 import com.qmth.boot.api.constant.ApiConstant;
+import com.qmth.distributed.print.business.bean.result.EditResult;
+import com.qmth.distributed.print.business.service.PrintCommonService;
+import com.qmth.distributed.print.business.templete.execute.AsyncSysUserDataImportService;
 import com.qmth.teachcloud.common.bean.dto.BlurryUserDto;
 import com.qmth.teachcloud.common.bean.params.UserSaveParams;
+import com.qmth.teachcloud.common.contant.SystemConstant;
 import com.qmth.teachcloud.common.entity.SysUser;
+import com.qmth.teachcloud.common.entity.TBTask;
+import com.qmth.teachcloud.common.enums.TaskTypeEnum;
 import com.qmth.teachcloud.common.service.SysUserService;
 import com.qmth.teachcloud.common.util.Result;
 import com.qmth.teachcloud.common.util.ResultUtil;
-import io.swagger.annotations.Api;
-import io.swagger.annotations.ApiOperation;
-import io.swagger.annotations.ApiParam;
+import com.qmth.teachcloud.common.util.ServletUtil;
+import io.swagger.annotations.*;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.validation.BindingResult;
 import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
 
+import javax.annotation.Resource;
 import javax.validation.Valid;
 import java.security.NoSuchAlgorithmException;
 import java.util.List;
+import java.util.Map;
+import java.util.Objects;
 
 /**
  * <p>
@@ -31,11 +42,16 @@ import java.util.List;
 @Api(tags = "用户Controller")
 @RestController
 @RequestMapping(ApiConstant.DEFAULT_URI_PREFIX + "/${prefix.url.sys}/user")
+//@Aac(strict = BOOL.FALSE, auth = BOOL.FALSE)
 public class SysUserController {
     private final static Logger log = LoggerFactory.getLogger(SysUserController.class);
 
     @Autowired
     private SysUserService sysUserService;
+    @Resource
+    private PrintCommonService printCommonService;
+    @Resource
+    private AsyncSysUserDataImportService asyncSysUserDataImportService;
 
     /**
      * 查询
@@ -163,5 +179,18 @@ public class SysUserController {
     public Result bindRoles(@RequestBody SysUser sysUser) {
         return ResultUtil.ok(sysUserService.bindRoles(sysUser));
     }
+
+    @ApiOperation(value = "用户管理-批量导入(异步)")
+    @RequestMapping(value = "/import", method = RequestMethod.POST)
+    @ApiResponses({@ApiResponse(code = 200, message = "返回信息", response = EditResult.class)})
+    public Result sysUserImportAysnc(@ApiParam(value = "上传文件", required = true) @RequestParam MultipartFile file) throws Exception {
+        SysUser sysUser = (SysUser) ServletUtil.getRequestUser();
+        Map<String, Object> map = printCommonService.saveTask(file, TaskTypeEnum.USER_IMPORT);
+        map.put(SystemConstant.SYS_USER,sysUser);
+
+        asyncSysUserDataImportService.importTask(map);
+        TBTask tbTask = Objects.nonNull(map.get(SystemConstant.TASK)) ? (TBTask) map.get(SystemConstant.TASK) : null;
+        return Objects.nonNull(tbTask) ? ResultUtil.ok(tbTask.getId()) : ResultUtil.error("创建任务失败");
+    }
 }
 

+ 73 - 0
teachcloud-common/src/main/java/com/qmth/teachcloud/common/bean/dto/excel/SysUserImportDto.java

@@ -0,0 +1,73 @@
+package com.qmth.teachcloud.common.bean.dto.excel;
+
+import com.qmth.teachcloud.common.annotation.ExcelNote;
+
+import javax.validation.constraints.NotNull;
+
+/**
+ * @Description: 系统用户导入Dto
+ * @Author: CaoZixuan
+ * @Date: 2021-08-12
+ */
+public class SysUserImportDto {
+
+    @ExcelNote(value = "姓名")
+    @NotNull
+    private String name;
+
+    @ExcelNote(value = "工号")
+    @NotNull
+    private String code;
+
+    @ExcelNote(value = "手机号")
+    @NotNull
+    private String phoneNumber;
+
+    @ExcelNote(value = "组织架构")
+    @NotNull
+    private String orgName;
+
+    @ExcelNote(value = "角色")
+    @NotNull
+    private String roleName;
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public String getCode() {
+        return code;
+    }
+
+    public void setCode(String code) {
+        this.code = code;
+    }
+
+    public String getPhoneNumber() {
+        return phoneNumber;
+    }
+
+    public void setPhoneNumber(String phoneNumber) {
+        this.phoneNumber = phoneNumber;
+    }
+
+    public String getOrgName() {
+        return orgName;
+    }
+
+    public void setOrgName(String orgName) {
+        this.orgName = orgName;
+    }
+
+    public String getRoleName() {
+        return roleName;
+    }
+
+    public void setRoleName(String roleName) {
+        this.roleName = roleName;
+    }
+}

+ 32 - 0
teachcloud-common/src/main/java/com/qmth/teachcloud/common/bean/result/UserBatchDisposeResult.java

@@ -0,0 +1,32 @@
+package com.qmth.teachcloud.common.bean.result;
+
+import com.qmth.teachcloud.common.entity.SysUser;
+import com.qmth.teachcloud.common.entity.SysUserRole;
+
+import java.util.List;
+
+/**
+ * @Description: 用户批量处理
+ * @Author: CaoZixuan
+ * @Date: 2021-08-12
+ */
+public class UserBatchDisposeResult {
+    private List<SysUser> userList;
+    private List<SysUserRole> userRoleList;
+
+    public List<SysUser> getUserList() {
+        return userList;
+    }
+
+    public void setUserList(List<SysUser> userList) {
+        this.userList = userList;
+    }
+
+    public List<SysUserRole> getUserRoleList() {
+        return userRoleList;
+    }
+
+    public void setUserRoleList(List<SysUserRole> userRoleList) {
+        this.userRoleList = userRoleList;
+    }
+}

+ 1 - 0
teachcloud-common/src/main/java/com/qmth/teachcloud/common/contant/SystemConstant.java

@@ -77,6 +77,7 @@ public class SystemConstant {
     //    public static final int MAX_RETRY_CREATE_PDF_COUNT = 5;
     //英文字母、数字、中文括号、英文括号、下划线(_)、减号(-)、中文横线(—)
     public static final String REGULAR_EXPRESSION_OF_CODE = "[a-zA-Z0-9](\\w+)?-?(\\w+)?—?(\\w+)?(\\((\\w+)?-?(\\w+)?—?(\\w+)?\\))?(\\((\\w+)?-?(\\w+)?—?(\\w+)?\\))?(\\w+)?";
+    public static final String REGULAR_EXPRESSION_OF_PHONE = "^((13[0-9])|(14[5|7])|(15([0-3]|[5-9]))|(17[013678])|(18[0,5-9]))\\\\d{8}$";
     public static final String SYS_USER = "sysUser";
 
     /**

+ 16 - 0
teachcloud-common/src/main/java/com/qmth/teachcloud/common/entity/SysUser.java

@@ -48,6 +48,14 @@ public class SysUser extends BaseEntity implements Serializable {
     @NotBlank(message = "请输入姓名")
     @Length(message = "姓名不能超过{max}个字符", max = 50)
     private String realName;
+
+    /**
+     * 姓名
+     */
+    @TableField("code")
+    @NotBlank(message = "请输入工号")
+    @Length(message = "工号不能超过{max}个字符", max = 50)
+    private String code;
     /**
      * 密码
      */
@@ -207,4 +215,12 @@ public class SysUser extends BaseEntity implements Serializable {
     public void setOldPassword(String oldPassword) {
         this.oldPassword = oldPassword;
     }
+
+    public String getCode() {
+        return code;
+    }
+
+    public void setCode(String code) {
+        this.code = code;
+    }
 }

+ 11 - 0
teachcloud-common/src/main/java/com/qmth/teachcloud/common/service/SysUserService.java

@@ -7,9 +7,11 @@ import com.qmth.teachcloud.common.bean.dto.LoginDto;
 import com.qmth.teachcloud.common.bean.dto.UserDto;
 import com.qmth.teachcloud.common.bean.params.UserSaveParams;
 import com.qmth.teachcloud.common.entity.SysUser;
+import org.springframework.util.LinkedMultiValueMap;
 
 import java.security.NoSuchAlgorithmException;
 import java.util.List;
+import java.util.Map;
 import java.util.Set;
 
 /**
@@ -69,4 +71,13 @@ public interface SysUserService extends IService<SysUser> {
      * @return
      */
     List<SysUser> filterFlowPrivilege(Long schoolId, Set<Long> orgIds);
+
+    /**
+     * 执行批量导入用户逻辑
+     *
+     * @param finalList 基础课程数据集合
+     * @param map       参数
+     * @return 结果
+     */
+    Map<String, Object> executeSysUserImportLogic(List<LinkedMultiValueMap<Integer, Object>> finalList, Map<String, Object> map) throws NoSuchAlgorithmException;
 }

+ 8 - 0
teachcloud-common/src/main/java/com/qmth/teachcloud/common/service/TeachcloudCommonService.java

@@ -54,6 +54,14 @@ public interface TeachcloudCommonService {
      */
     public void addUserRolePrivilege(SysUser sysUser, Long[] roleIds);
 
+    /**
+     * 获取要新增的用户权限集合
+     * @param sysUser
+     * @param roleIds
+     * @return
+     */
+    List<SysUserRole> disposeUserPrivilege(SysUser sysUser, Long[] roleIds);
+
     /**
      * 获取用户角色
      *

+ 166 - 14
teachcloud-common/src/main/java/com/qmth/teachcloud/common/service/impl/SysUserServiceImpl.java

@@ -1,6 +1,5 @@
 package com.qmth.teachcloud.common.service.impl;
 
-import com.alibaba.fastjson.JSON;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
@@ -11,7 +10,9 @@ import com.qmth.boot.api.exception.ApiException;
 import com.qmth.teachcloud.common.bean.dto.BlurryUserDto;
 import com.qmth.teachcloud.common.bean.dto.LoginDto;
 import com.qmth.teachcloud.common.bean.dto.UserDto;
+import com.qmth.teachcloud.common.bean.dto.excel.SysUserImportDto;
 import com.qmth.teachcloud.common.bean.params.UserSaveParams;
+import com.qmth.teachcloud.common.bean.result.UserBatchDisposeResult;
 import com.qmth.teachcloud.common.contant.SpringContextHolder;
 import com.qmth.teachcloud.common.contant.SystemConstant;
 import com.qmth.teachcloud.common.entity.*;
@@ -24,10 +25,12 @@ import com.qmth.teachcloud.common.util.Base64Util;
 import com.qmth.teachcloud.common.util.ResultUtil;
 import com.qmth.teachcloud.common.util.ServletUtil;
 import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.dao.DuplicateKeyException;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
+import org.springframework.util.LinkedMultiValueMap;
 
 import javax.annotation.Resource;
 import java.security.NoSuchAlgorithmException;
@@ -72,6 +75,9 @@ public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUser> impl
     @Resource
     SysUserMapper sysUserMapper;
 
+    @Resource
+    SysOrgService sysOrgService;
+
     @Override
     public IPage<UserDto> list(String loginName, String roleId, Boolean enable, String realName, Integer pageNumber, Integer pageSize) {
         Long schoolId = Long.valueOf(ServletUtil.getRequestHeaderSchoolId().toString());
@@ -411,19 +417,19 @@ public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUser> impl
                     }
                 }
             }
-            //用户科目全量删除全量增加
-            QueryWrapper<BasicUserCourse> basicUserCourseQueryWrapper = new QueryWrapper<>();
-            basicUserCourseQueryWrapper.lambda().eq(BasicUserCourse::getUserId, sysUser.getId());
-            basicUserCourseService.remove(basicUserCourseQueryWrapper);
-
-            List<SysRole> sysRoles = sysRoleService.list(sysUser.getRoleIds(), RoleTypeEnum.QUESTION_TEACHER.name());
-            if (sysRoles != null && sysRoles.size() > 0) {
-                Long[] courseIds = sysUser.getCourseIds();
-                if (courseIds.length == 0) {
-                    throw ExceptionResultEnum.ERROR.exception("请选择课程");
-                }
-                basicUserCourseService.saveBatch(sysUser);
-            }
+//            //用户科目全量删除全量增加
+//            QueryWrapper<BasicUserCourse> basicUserCourseQueryWrapper = new QueryWrapper<>();
+//            basicUserCourseQueryWrapper.lambda().eq(BasicUserCourse::getUserId, sysUser.getId());
+//            basicUserCourseService.remove(basicUserCourseQueryWrapper);
+//
+//            List<SysRole> sysRoles = sysRoleService.list(sysUser.getRoleIds(), RoleTypeEnum.QUESTION_TEACHER.name());
+//            if (sysRoles != null && sysRoles.size() > 0) {
+//                Long[] courseIds = sysUser.getCourseIds();
+//                if (courseIds.length == 0) {
+//                    throw ExceptionResultEnum.ERROR.exception("请选择课程");
+//                }
+//                basicUserCourseService.saveBatch(sysUser);
+//            }
         } catch (Exception e) {
             log.error("请求出错", e);
             isSuccess = false;
@@ -451,4 +457,150 @@ public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUser> impl
     public List<SysUser> filterFlowPrivilege(Long schoolId, Set<Long> orgIds) {
         return sysUserMapper.filterFlowPrivilege(schoolId, orgIds);
     }
+
+    @Override
+    public Map<String, Object> executeSysUserImportLogic(List<LinkedMultiValueMap<Integer, Object>> finalList, Map<String, Object> map) throws NoSuchAlgorithmException {
+        SysUser sysUser = (SysUser) map.get(SystemConstant.SYS_USER);
+        Long schoolId = sysUser.getSchoolId();
+        List<UserSaveParams> userSaveParamsList = new ArrayList<>();
+        for (int i = 0; i < finalList.size(); i++) {
+            LinkedMultiValueMap<Integer, Object> excelMap = finalList.get(i);
+            List<Object> sysUserImportDtoList = excelMap.get(i);
+            assert sysUserImportDtoList != null;
+            List<SysUserImportDto> datasource = sysUserImportDtoList.stream().map(e -> {
+                SysUserImportDto sysUserImportDto = new SysUserImportDto();
+                BeanUtils.copyProperties(e, sysUserImportDto);
+                return sysUserImportDto;
+            }).collect(Collectors.toList());
+            // TODO: 2021/7/16 校验datasource集合的正确性
+            map.put("dataCount", datasource.size());
+            System.out.println("datasource:\n" + datasource);
+
+            for (int y = 0; y < Objects.requireNonNull(sysUserImportDtoList).size(); y++) {
+                SysUserImportDto sysUserImportDto = (SysUserImportDto) sysUserImportDtoList.get(y);
+                String name = sysUserImportDto.getName();
+                String code = sysUserImportDto.getCode();
+                String phoneNumber = sysUserImportDto.getPhoneNumber();
+                String orgName = sysUserImportDto.getOrgName();
+                String roleName = sysUserImportDto.getRoleName();
+
+                UserSaveParams userSaveParams = new UserSaveParams();
+                Long orgId = this.analyzeOrgName(schoolId,orgName);
+                List<Long> roleIdList = this.analyzeRoleName(schoolId, roleName);
+
+                SysUser oldUser = this.getOne(new QueryWrapper<SysUser>().lambda().eq(SysUser::getLoginName,name).eq(SysUser::getSchoolId,schoolId));
+                Long oldUserId = null;
+                if (Objects.nonNull(oldUser)){
+                     oldUserId = oldUser.getId();
+                }
+                if (SystemConstant.longNotNull(oldUserId)){
+                    // 编辑
+                    userSaveParams.setId(oldUserId);
+                }
+                userSaveParams.setOrgId(orgId);
+                userSaveParams.setRealName(name);
+                userSaveParams.setRoleIds(roleIdList.toArray(new Long[0]));
+                userSaveParams.setMobileNumber(phoneNumber);
+                userSaveParams.setCode(code);
+                userSaveParamsList.add(userSaveParams);
+            }
+        }
+        UserBatchDisposeResult userBatchDisposeResult = this.disposeUserInfoHelp(userSaveParamsList,sysUser);
+        List<SysUser> sysUserList = userBatchDisposeResult.getUserList();
+        List<SysUserRole> sysUserRoleList = userBatchDisposeResult.getUserRoleList();
+        this.saveOrUpdateBatch(sysUserList);
+        sysUserRoleService.saveOrUpdateBatch(sysUserRoleList);
+        return map;
+    }
+
+    /**
+     * 批量处理用户信息帮助类
+     * @param userSaveParamsList 用户信息集合
+     * @param master 创建人信息
+     * @return 处理后的结果
+     */
+    private UserBatchDisposeResult disposeUserInfoHelp(List<UserSaveParams> userSaveParamsList,SysUser master) throws NoSuchAlgorithmException {
+        Long schoolId = master.getSchoolId();
+        List<SysUser> userList = new ArrayList<>();
+        List<SysUserRole> sysUserRoleList = new ArrayList<>();
+        for (UserSaveParams userSaveParams : userSaveParamsList) {
+            Gson gson = new Gson();
+            userSaveParams.setSchoolId(schoolId);
+            SysUser userCell = gson.fromJson(gson.toJson(userSaveParams), SysUser.class);
+            if (Objects.isNull(userCell.getId())) {//新增用户
+                userCell.insertInfo(master.getId());
+                userCell.setLoginName(userCell.getCode());
+                userList.add(userCell);
+                List<SysUserRole> sysUserRoleCell = commonService.disposeUserPrivilege(userCell, userSaveParams.getRoleIds());
+                sysUserRoleList.addAll(sysUserRoleCell);
+            }else {//修改用户
+                List<SysUserRole> oldRoleList = cacheService.userRolePrivilegeCache(userCell.getId());
+                List<Long> newRoleList = Arrays.asList(userSaveParams.getRoleIds());
+                Set<Long> dbUserRolesList = oldRoleList.stream().map(SysUserRole::getRoleId).collect(Collectors.toSet());
+                int count = (int) dbUserRolesList.stream().filter(newRoleList::contains).count();
+                SysUser dbUser = this.getById(userCell.getId());
+                userCell.updateInfo(master.getId());
+                userList.add(userCell);
+                //如果修改了角色,需要重新登录
+                if (count == 0 || dbUserRolesList.size() != newRoleList.size()) {
+                    QueryWrapper<SysUserRole> sysUserRoleQueryWrapper = new QueryWrapper<>();
+                    sysUserRoleQueryWrapper.lambda().eq(SysUserRole::getUserId, userCell.getId());
+                    sysUserRoleService.remove(sysUserRoleQueryWrapper);
+
+                    cacheService.removeUserRolePrivilegeCache(userCell.getId());
+                    List<SysUserRole> sysUserRoleCell = commonService.disposeUserPrivilege(userCell, userSaveParams.getRoleIds());
+                    sysUserRoleList.addAll(sysUserRoleCell);
+                    commonService.removeUserInfo(userCell.getId(), true);
+                }
+                //如果修改了机构或手机号,需更新用户缓存
+                if (Objects.nonNull(dbUser.getOrgId())) {
+                    if (dbUser.getOrgId().longValue() != userCell.getOrgId().longValue()
+                            || !Objects.equals(dbUser.getMobileNumber(), userCell.getMobileNumber())) {
+                        cacheService.updateUserCache(userCell.getId());
+                        cacheService.updateUserAuthCache(userCell.getId());
+                    }
+                }
+            }
+        }
+        UserBatchDisposeResult userBatchDisposeResult = new UserBatchDisposeResult();
+        userBatchDisposeResult.setUserList(userList);
+        userBatchDisposeResult.setUserRoleList(sysUserRoleList);
+        return userBatchDisposeResult;
+    }
+
+    /**
+     * 解析机构名称
+     * @param schoolId 学校id
+     * @param orgName 结构名称
+     * @return 机构id
+     */
+    private Long analyzeOrgName(Long schoolId,String orgName){
+        SysOrg sysOrg = sysOrgService.getOne(new QueryWrapper<SysOrg>().lambda().eq(SysOrg::getEnable,true).eq(SysOrg::getSchoolId,schoolId).eq(SysOrg::getName,orgName));
+        if (Objects.isNull(sysOrg)){
+            throw ExceptionResultEnum.ERROR.exception("系统中不存在excel导入的机构【" + orgName + "】");
+        }
+        return sysOrg.getId();
+    }
+
+    /**
+     * 根据角色名称获取角色id集合
+     * @param schoolId 学校id
+     * @param roleName 角色名称组
+     * @return 角色集合
+     */
+    private List<Long> analyzeRoleName(Long schoolId, String roleName){
+        List<Long> roleIdList = new ArrayList<>();
+        String[] arr = roleName.split(",");
+        for (String cell : arr) {
+            SysRole sysRole = sysRoleService.getOne(new QueryWrapper<SysRole>().lambda()
+                    .eq(SysRole::getEnable,true)
+                    .eq(SysRole::getName,cell)
+                    .eq(SysRole::getSchoolId,schoolId));
+            if (Objects.isNull(sysRole)){
+                throw ExceptionResultEnum.ERROR.exception("系统中不存在excel导入的角色【" + cell + "】");
+            }
+            roleIdList.add(sysRole.getId());
+        }
+        return roleIdList;
+    }
 }

+ 9 - 0
teachcloud-common/src/main/java/com/qmth/teachcloud/common/service/impl/TeachcloudCommonServiceImpl.java

@@ -188,6 +188,15 @@ public class TeachcloudCommonServiceImpl implements TeachcloudCommonService {
         sysUserRoleService.saveBatch(sysUserRoleList);
     }
 
+    @Override
+    public List<SysUserRole> disposeUserPrivilege(SysUser sysUser, Long[] roleIds) {
+        List<SysUserRole> sysUserRoleList = new ArrayList<>();
+        for (int i = 0; i < roleIds.length; i++) {
+            sysUserRoleList.add(new SysUserRole(sysUser.getId(), roleIds[i]));
+        }
+        return sysUserRoleList;
+    }
+
 
     /**
      * 获取用户角色权限