Kaynağa Gözat

Merge branch 'feature-createuserbyexcel-20210720'

# Conflicts:
#	hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/controller/SysUserController.java
shc 4 yıl önce
ebeveyn
işleme
549c754086

+ 515 - 466
hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/controller/SysUserController.java

@@ -20,12 +20,16 @@
 package com.qunzhixinxi.hnqz.admin.controller;
 
 import cn.hutool.core.util.StrUtil;
+import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.core.collection.CollectionUtil;
+import cn.hutool.json.JSONUtil;
 import com.alibaba.csp.sentinel.util.StringUtil;
 import com.alibaba.nacos.common.utils.Md5Utils;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.pig4cloud.plugin.excel.annotation.RequestExcel;
 import com.qunzhixinxi.hnqz.admin.api.dto.UserDTO;
 import com.qunzhixinxi.hnqz.admin.api.dto.UserInfo;
 import com.qunzhixinxi.hnqz.admin.api.dto.UserPwd;
@@ -36,7 +40,9 @@ import com.qunzhixinxi.hnqz.admin.api.entity.SysUserRole;
 import com.qunzhixinxi.hnqz.admin.api.vo.ErrorInfoVo;
 import com.qunzhixinxi.hnqz.admin.api.vo.UserVO;
 import com.qunzhixinxi.hnqz.admin.config.UpmsConfig;
+import com.qunzhixinxi.hnqz.admin.entity.dto.CommonUserDTO;
 import com.qunzhixinxi.hnqz.admin.entity.input.UserCertificationInput;
+import com.qunzhixinxi.hnqz.admin.entity.model.excel.CommonUserExcelModel;
 import com.qunzhixinxi.hnqz.admin.enums.SubjectTypeEnum;
 import com.qunzhixinxi.hnqz.admin.mapper.*;
 import com.qunzhixinxi.hnqz.admin.service.SysDeptService;
@@ -79,6 +85,7 @@ import javax.validation.Valid;
 import java.io.InputStream;
 import java.time.LocalDateTime;
 import java.util.*;
+import java.util.stream.Collectors;
 
 /**
  * @author hnqz
@@ -873,486 +880,528 @@ public class SysUserController {
 	/**
 	 * 批量导入用户
 	 *
-	 * @param file 用户信息文件
+	 * @param commonUserExcelModelList 用户信息列表
 	 * @return success/false
 	 */
 	@SysLog("批量导入用户")
 	@PostMapping(value = "/batch")
 	@PreAuthorize("@pms.hasPermission('sys_user_add')")
-	public R batchUser(@RequestPart("file") MultipartFile file) {
-
-		// 获取操作员和操作员所在的结算主体
-		HnqzUser operator = SecurityUtils.getUser();
-		SysDept sysDept = sysDeptService.getById(operator.getDeptId());
-
-		// 读取excel
-		try {
-			String fileName = file.getOriginalFilename().toLowerCase();
-			InputStream inputStream = file.getInputStream();
-
-			// 校验文件信息
-			Workbook wbs = null;
-			if (fileName.endsWith("xls")) {
-				//2003
-				wbs = new HSSFWorkbook(inputStream);
-			} else if (fileName.endsWith("xlsx")) {
-				//2007
-				wbs = new XSSFWorkbook(inputStream);
-			} else {
-				return R.failed("上传文件格式错误!");
-			}
-			if (wbs.isSheetHidden(0)) {
-				return R.failed("导入表中有隐藏列");
-			}
-
-			// 校验页(数据页)
-			Sheet sheet = wbs.getSheetAt(1);
-
-			// 校验模板
-			Row row0 = sheet.getRow(0);
-			if (row0 == null) {
-				return R.failed("导入模版错误!");
-			}
-
-			// 校验记录数
-			int rowNum = sheet.getLastRowNum();
-			if (rowNum < 1) {
-				return R.failed("导入表中缺少数据!");
-			} else if (rowNum > 1000) {
-				return R.failed("单次批量导入最大支持1000行数据!");
-			}
-
-			// 校验列信息
-			String name = row0.getCell(0).getStringCellValue();
-			if (!"姓名".equals(name)) {
-				return R.failed("导入模版第一列错误!");
-			}
-			String phone = row0.getCell(1).getStringCellValue();
-			if (!"手机号".equals(phone)) {
-				return R.failed("导入模版第二列错误!");
-			}
-			String prov = row0.getCell(2).getStringCellValue();
-			if (!"省".equals(prov)) {
-				return R.failed("导入模版第三列错误!");
-			}
-			String city = row0.getCell(3).getStringCellValue();
-			if (!"市".equals(city)) {
-				return R.failed("导入模版第四列错误!");
-			}
-			String role = row0.getCell(4).getStringCellValue();
-			if (!"角色".equals(role)) {
-				return R.failed("导入模版第五列错误!");
-			}
-			String userStatus = row0.getCell(5).getStringCellValue();
-			if (!"状态".equals(userStatus)) {
-				return R.failed("导入模版第六列错误!");
-			}
-			String provinceCode = row0.getCell(6).getStringCellValue();
-			if (!"省份编码".equals(provinceCode)) {
-				return R.failed("导入模版第七列错误!");
-			}
-			String cityCode = row0.getCell(7).getStringCellValue();
-			if (!"城市编码".equals(cityCode)) {
-				return R.failed("导入模版第八列错误!");
-			}
-
-			//数据
-			List<UserDTO> userDTOList = new ArrayList<>();
-			List<ErrorInfoVo> errorList = new ArrayList<>();
-			log.info(">>> 通过excel批量创建用户开始 <<<");
-			// 行数据
-			for (int i = 1; i <= rowNum; i++) {
-
-				// 行编号
-				int rNum = i;
-				Row row = sheet.getRow(i);
-				log.info(">>>当前导入第{}行<<<", i);
-
-				if (row == null) {
-					ErrorInfoVo errorInfoVo = new ErrorInfoVo();
-					errorInfoVo.setRowNum(rNum);
-					errorInfoVo.setColumnName(null);
-					errorInfoVo.setContent(null);
-					errorInfoVo.setReason("当前行没有数据信息");
-					errorList.add(errorInfoVo);
-					continue;
-				}
-
-				int colNum = row.getLastCellNum();
-				UserDTO userDTO = new UserDTO();
-
-				userDTO.setDeptId(sysDept.getDeptId());
-				if(ArrayUtils.contains(sysDept.getSubjectType(),SubjectTypeEnum.TYPE_SHUIBANGYUN.getCode())){
-					userDTO.setCertStatus(TaxHelperCertStatus.UN_CERT.getCode());
-				}
-//				if(ArrayUtils.contains(sysDept.getSubjectType(),SubjectTypeEnum.TYPE_RENLIJIA.getCode())){
-//					userDTO.setRljCertStatus(DingEnum.CER_STATUS_4.getType());
-//				}
-//				if ("1".equals(sysDept.getSubjectType())) {
-//					userDTO.setCertStatus(TaxHelperCertStatus.UN_CERT.getCode());
-//					userDTO.setUserType("1");
-//				} else {
-//					userDTO.setUserType("0");
-//				}
-				userDTO.setCreateTime(LocalDateTime.now());
-
-				for (int j = 0; j < colNum; j++) {//列数据
-
-					// 获取列名称
-					String columnName = row0.getCell(j).getStringCellValue();
-					int columnNum = j + 1;
-
-					if (null == row.getCell(j)) {
-						ErrorInfoVo errorInfoVo = new ErrorInfoVo();
-						errorInfoVo.setRowNum(rNum);
-						errorInfoVo.setColumnNum(columnNum);
-						errorInfoVo.setColumnName(columnName);
-						errorInfoVo.setContent(null);
-						errorInfoVo.setReason("列数据为空");
-						errorList.add(errorInfoVo);
-						continue;
-					}
-
-					// 格式化字符串
-					row.getCell(j).setCellType(CellType.STRING);
-					String value = row.getCell(j).getStringCellValue()
-							.replaceAll(" ", "")
-							.replaceAll(",", "")
-							.replaceAll("\\u00A0", "")
-							.replaceAll((char) 12288 + "", "")
-							.replace("+", "·");
-
-					// 校验value
-					if (StringUtil.isEmpty(value)) {
-						ErrorInfoVo errorInfoVo = new ErrorInfoVo();
-						errorInfoVo.setRowNum(rNum);
-						errorInfoVo.setColumnNum(columnNum);
-						errorInfoVo.setColumnName(columnName);
-						errorInfoVo.setContent(value);
-						errorInfoVo.setReason("数据为空");
-						errorList.add(errorInfoVo);
-						continue;
-					}
-
-					if (j == 0) {
-						userDTO.setRealname(value);
-					} else if (j == 1) {
-						// 记录错误说明
-						String errorInfo = null;
-						// 正则校验手机号
-						if (ValidateUtils.validPhoneNum("0", value)) {
-							// 判断同一个dept下用户是否重复
-							SysUser query = new SysUser();
-							query.setUsername(value);
-							query.setDeptId(userDTO.getDeptId());
-							SysUser sysUser = sysUserMapper.selectUserByName(query);
-							if (sysUser != null) {
-								errorInfo = "手机号已被占用";
-							}
-						} else {
-							errorInfo = "不是手机号";
-						}
-
-						// 封装错误信息
-						if (StringUtils.isNotEmpty(errorInfo)) {
-							ErrorInfoVo errorInfoVo = new ErrorInfoVo();
-							errorInfoVo.setRowNum(rNum);
-							errorInfoVo.setColumnNum(columnNum);
-							errorInfoVo.setColumnName(columnName);
-							errorInfoVo.setContent(value);
-							errorInfoVo.setReason(errorInfo);
-							errorList.add(errorInfoVo);
-							continue;
-						}
-
-						userDTO.setPlatId(value);
-						userDTO.setPhone(value);
-						userDTO.setUsername(value);
-					} else if (j == 2) {
-						if ("全国".equals(value)) {
-							userDTO.setProvince("");
-						} else {
-							userDTO.setProvince(value);
-						}
-					} else if (j == 3) {
-						if (StringUtils.isEmpty(userDTO.getProvince())) {
-							userDTO.setCity("");
-						} else {
-							userDTO.setCity(value);
-						}
-					} else if (j == 4) {
-						// 声明错误信息记录
-						String errorInfo = "";
-
-						// 根据角色名称获取角色
-						SysRole sysRole = sysRoleMapper.selectOne(Wrappers.<SysRole>query().eq("role_name", value));
-						if (sysRole != null) {
-							userDTO.setRole(Arrays.asList(sysRole.getRoleId()));
-							if (userDTO.getRole().contains(2)) {
-								UserDTO tmp = new UserDTO();
-								tmp.setUsername(userDTO.getUsername());
-								tmp.setDelFlag("0");
-								List<UserVO> userVoList = sysUserMapper.selectByPhone(tmp);
-								if (userVoList.size() > 0) {
-									for (UserVO userVO : userVoList) {
-										if (null != userVO.getRoleList()) {
-											for (SysRole r : userVO.getRoleList()) {
-												if (r.getRoleId() == 3) {
-													errorInfo = errorInfo + "用户已存在平台管理员角色,不能同时为药企管理员!";
-													continue;
-												}
-												if (r.getRoleId() == 4) {
-													errorInfo = errorInfo + "用户已存在平台管理员角色,不能同时为CSO管理员!";
-													continue;
-												}
-												if (r.getRoleId() == 5) {
-													errorInfo = errorInfo + "用户已存在平台管理员角色,不能同时为全职学术推广员!";
-													continue;
-												}
-												if (r.getRoleId() == 6) {
-													errorInfo = errorInfo + "用户已存在平台管理员角色,不能同时为兼职学术推广员!";
-													continue;
-												}
-												if (r.getRoleId() == 7) {
-													errorInfo = errorInfo + "用户已存在平台管理员角色,不能同时为财务管理员!";
-													continue;
-												}
-											}
-										}
-									}
-								}
-
-							} else if (userDTO.getRole().contains(3)) {
-								UserDTO tmp = new UserDTO();
-								tmp.setUsername(userDTO.getUsername());
-								tmp.setDelFlag("0");
-								List<UserVO> userVoList = sysUserMapper.selectByPhone(tmp);
-								if (userVoList.size() > 0) {
-									for (UserVO userVO : userVoList) {
-										if (null != userVO.getRoleList()) {
-											for (SysRole r : userVO.getRoleList()) {
-												if (r.getRoleId() == 2) {
-													errorInfo = errorInfo + "用户已存在药企管理员角色,不能同时为平台管理员!";
-													continue;
-												}
-												if (r.getRoleId() == 4) {
-													errorInfo = errorInfo + "用户已存在药企管理员角色,不能同时为CSO管理员!";
-													continue;
-												}
-												if (sysDept.getLevel() == 3 || sysDept.getLevel() == 4) {
-													if (r.getRoleId() == 5) {
-														errorInfo = errorInfo + "用户已存在CSO关系角色,不能同时为药企管理员!";
-														continue;
-													}
-												}
-											}
-										}
-									}
-								}
-
-							} else if (userDTO.getRole().contains(4)) {
-								UserDTO tmp = new UserDTO();
-								tmp.setUsername(userDTO.getUsername());
-								tmp.setDelFlag("0");
-								List<UserVO> userVoList = sysUserMapper.selectByPhone(tmp);
-								if (userVoList.size() > 0) {
-									for (UserVO userVO : userVoList) {
-										if (null != userVO.getRoleList()) {
-											for (SysRole r : userVO.getRoleList()) {
-												if (sysRole.getRoleId() == 2) {
-													errorInfo = errorInfo + "用户已存在平台管理员角色,不能同时为!";
-													continue;
-												}
-
-												if (r.getRoleId() == 3) {
-													errorInfo = errorInfo + "用户已存在药企管理员角色,不能同时为CSO管理员!";
-													continue;
-												}
-												if (r.getRoleId() == 5) {
-													SysUserRole sysUserRole = new SysUserRole();
-													sysUserRole.setUserId(userVO.getUserId());
-													List<SysUserRole> sysUserRoleList = sysUserRoleMapper.selectById(sysUserRole);
-													for (int k = 0; k < sysUserRoleList.size(); k++) {
-														SysUser sysUser = userService.getById(sysUserRoleList.get(k).getUserId());
-														if (!sysUser.getDeptId().equals(userDTO.getDeptId())) {
-															errorInfo = errorInfo + "用户已存在全职学术推广员角色,不能为其他机构CSO管理员!";
-															continue;
-														}
-													}
-												}
-											}
-										}
-									}
-								}
-
-							} else if (userDTO.getRole().contains(7)) {
-								UserDTO tmp = new UserDTO();
-								tmp.setUsername(userDTO.getUsername());
-								tmp.setDelFlag("0");
-								List<UserVO> userVoList = sysUserMapper.selectByPhone(tmp);
-								if (userVoList.size() > 0) {
-									for (UserVO userVO : userVoList) {
-										if (null != userVO.getRoleList()) {
-											for (SysRole r : userVO.getRoleList()) {
-												if (r.getRoleId() == 2) {
-													errorInfo = errorInfo + "用户已存在平台管理员,不能同时为财务管理员!";
-													continue;
-												}
-												if (sysDept.getLevel() == 3 || sysDept.getLevel() == 4) {
-													if (r.getRoleId() == 3) {
-														errorInfo = errorInfo + "用户已存在药企管理员,不能同时为CSO机构财务管理员!";
-														continue;
-													}
-												}
-											}
-										}
-									}
-								}
-
-							} else if (userDTO.getRole().contains(5)) {
-								UserDTO tmp = new UserDTO();
-								tmp.setUsername(userDTO.getUsername());
-								tmp.setDelFlag("0");
-								List<UserVO> userVoList = sysUserMapper.selectByPhone(tmp);
-								if (userVoList.size() > 0) {
-									for (UserVO userVO : userVoList) {
-										if (null != userVO.getRoleList()) {
-											for (SysRole r : userVO.getRoleList()) {
-												if (r.getRoleId() == 2) {
-													errorInfo = errorInfo + "用户已存在平台管理员,不能同时为全职学术推广员!";
-													continue;
-												}
-												if (r.getRoleId() == 3) {
-													if (sysDept.getLevel() == 3 || sysDept.getLevel() == 4) {
-														errorInfo = errorInfo + "用户已存在药企管理员,不能为CSO的全职学术推广员!";
-														continue;
-													}
-												}
-												if (r.getRoleId() == 4) {
-													if (sysDept.getLevel() == 3 || sysDept.getLevel() == 4) {
-														errorInfo = errorInfo + "用户已存在CSO管理员,不能为其他CSO的全职学术推广员!";
-														continue;
-													}
-												}
-
-											}
-										}
-									}
-								}
+	public R batchUser(@RequestExcel List<CommonUserExcelModel> commonUserExcelModelList){
 
-							} else if (userDTO.getRole().contains(6)) {
-								UserDTO tmp = new UserDTO();
-								tmp.setUsername(userDTO.getUsername());
-								tmp.setDelFlag("0");
-								List<UserVO> userVoList = sysUserMapper.selectByPhone(tmp);
-								if (userVoList.size() > 0) {
-									for (UserVO userVO : userVoList) {
-										if (null != userVO.getRoleList()) {
-											for (SysRole r : userVO.getRoleList()) {
-												if (r.getRoleId() == 2) {
-													errorInfo = errorInfo + "用户已存在平台管理员,不能同时为兼职学术推广员!";
-													continue;
-												}
-												SysUserRole sysUserRole = new SysUserRole();
-												sysUserRole.setUserId(userVO.getUserId());
-												List<SysUserRole> sysUserRoleList = sysUserRoleMapper.selectById(sysUserRole);
-												for (int k = 0; k < sysUserRoleList.size(); k++) {
-													if (sysUserRoleList.get(k).getRoleId().equals(7)) {
-														SysUser sysUser = userService.getById(sysUserRoleList.get(k).getUserId());
-														if (sysUser.getDeptId().equals(userDTO.getDeptId())) {
-															errorInfo = errorInfo + "用户已存在财务管理员角色,不能同时为兼职学术推广员!";
-															continue;
-														}
-													}
-												}
-											}
-										}
-									}
-								}
+		// 参数校验
+		if (CollectionUtils.isEmpty(commonUserExcelModelList)) {
+			log.error("空报表,不能上传");
+			return R.failed("空报表,不能上传");
+		}
 
-							} else if (userDTO.getRole().contains(9)) {
-								UserDTO tmp = new UserDTO();
-								tmp.setUsername(userDTO.getUsername());
-								tmp.setDelFlag("0");
-								List<UserVO> userVoList = sysUserMapper.selectByPhone(tmp);
-								if (userVoList.size() > 0) {
-									for (UserVO userVO : userVoList) {
-										if (null != userVO.getRoleList()) {
-											for (SysRole r : userVO.getRoleList()) {
-												if (sysRole.getRoleId() == 2) {
-													errorInfo = errorInfo + "用户已存在平台管理员,不能同时为CRO管理员!";
-													continue;
-												}
-												if (r.getRoleId() == 3) {
-													errorInfo = errorInfo + "用户已存在药企管理员,不能同时为CRO管理员!";
-													continue;
-												}
-											}
-										}
-									}
-								}
-							}
-							if (userDTO.getRole().contains(3)) {
-								if (sysDept.getLevel() != 2) {
-									errorInfo = errorInfo + "角色选为药企管理员时,组织架构必须为药企!";
-								}
-							}
-							if (!userDTO.getDeptId().equals(SecurityUtils.getUser().getDeptId())) {
-								if (userDTO.getRole().contains(5) || userDTO.getRole().contains(6)) {
-									errorInfo = errorInfo + "不能跨机构维护学术推广员!";
-								}
-							}
-						}
+		Map<String, List<CommonUserDTO>> collect = commonUserExcelModelList.stream().map(commonUserExcelModel ->
+				BeanUtil.copyProperties(commonUserExcelModel, CommonUserDTO.class)
+		).collect(Collectors.groupingBy(CommonUserDTO::getUsername));
 
-						// 存在错误
-						if (StringUtils.isNotEmpty(errorInfo) || sysRole == null) {
-							ErrorInfoVo errorInfoVo = new ErrorInfoVo();
-							errorInfoVo.setRowNum(rNum);
-							errorInfoVo.setColumnNum(columnNum);
-							errorInfoVo.setColumnName(columnName);
-							errorInfoVo.setContent(errorInfo);
-							errorInfoVo.setReason("角色信息有误");
-							errorList.add(errorInfoVo);
-							continue;
-						}
-					} else if (j == 5) {
-						if (!"活跃".equals(value) && !"休眠".equals(value)) {
-							ErrorInfoVo errorInfoVo = new ErrorInfoVo();
-							errorInfoVo.setRowNum(rNum);
-							errorInfoVo.setColumnNum(columnNum);
-							errorInfoVo.setColumnName(columnName);
-							errorInfoVo.setContent(value);
-							errorInfoVo.setReason("角色状态有误");
-							errorList.add(errorInfoVo);
-							continue;
-						}
-						userDTO.setLockFlag("活跃".equals(value) ? "0" : "9");
-					} else if (j == 6) {
-						userDTO.setProvinceCode(value);
-					} else if (j == 7) {
-						userDTO.setCityCode(value);
-					}
-				}
 
-				// 记录争取额的信息
-				userDTOList.add(userDTO);
-			}
+		// 实际的处理业务
+		Map<String, String> errorMap = userService.batchByExcel(collect);
 
-			// 判断是否有错误的数据行,如果没有,执行入库操作
-			if (CollectionUtils.isEmpty(errorList)) {
-				userDTOList.forEach(userDTO -> {
-					userService.saveUser(userDTO);
-				});
-			}
-			return R.ok(errorList);
+		// 返回上传结果
+		Map<String, Object> result = new HashMap<>(3);
+		if (CollectionUtil.isEmpty(errorMap)) {
+			result.put("code", "SUCCESS");
+			result.put("message", "上传成功");
+			result.put("data", null);
+			return R.ok(result);
+		} else {
+			log.error("上传数据错误,{}", JSONUtil.toJsonStr(errorMap));
+			result.put("code", "FAILURE");
+			result.put("message", "上传数据错误");
+			result.put("data", errorMap);
+			return R.failed(result);
 
-		} catch (Exception e) {
-			log.error("批量创建用户失败:{}",e.getMessage());
-			e.printStackTrace();
-			return R.failed("批量创建用户失败");
 		}
 	}
 
+// 	/**
+// 	 * 批量导入用户
+// 	 *
+// 	 * @param file 用户信息文件
+// 	 * @return success/false
+// 	 */
+// 	@SysLog("批量导入用户")
+// 	@PostMapping(value = "/batch")
+// 	@PreAuthorize("@pms.hasPermission('sys_user_add')")
+// 	public R batchUser(@RequestPart("file") MultipartFile file) {
+//
+// 		// 获取操作员和操作员所在的结算主体
+// 		HnqzUser operator = SecurityUtils.getUser();
+// 		SysDept sysDept = sysDeptService.getById(operator.getDeptId());
+//
+// 		// 读取excel
+// 		try {
+// 			String fileName = file.getOriginalFilename().toLowerCase();
+// 			InputStream inputStream = file.getInputStream();
+//
+// 			// 校验文件信息
+// 			Workbook wbs = null;
+// 			if (fileName.endsWith("xls")) {
+// 				//2003
+// 				wbs = new HSSFWorkbook(inputStream);
+// 			} else if (fileName.endsWith("xlsx")) {
+// 				//2007
+// 				wbs = new XSSFWorkbook(inputStream);
+// 			} else {
+// 				return R.failed("上传文件格式错误!");
+// 			}
+// 			if (wbs.isSheetHidden(0)) {
+// 				return R.failed("导入表中有隐藏列");
+// 			}
+//
+// 			// 校验页(数据页)
+// 			Sheet sheet = wbs.getSheetAt(1);
+//
+// 			// 校验模板
+// 			Row row0 = sheet.getRow(0);
+// 			if (row0 == null) {
+// 				return R.failed("导入模版错误!");
+// 			}
+//
+// 			// 校验记录数
+// 			int rowNum = sheet.getLastRowNum();
+// 			if (rowNum < 1) {
+// 				return R.failed("导入表中缺少数据!");
+// 			} else if (rowNum > 1000) {
+// 				return R.failed("单次批量导入最大支持1000行数据!");
+// 			}
+//
+// 			// 校验列信息
+// 			String name = row0.getCell(0).getStringCellValue();
+// 			if (!"姓名".equals(name)) {
+// 				return R.failed("导入模版第一列错误!");
+// 			}
+// 			String phone = row0.getCell(1).getStringCellValue();
+// 			if (!"手机号".equals(phone)) {
+// 				return R.failed("导入模版第二列错误!");
+// 			}
+// 			String prov = row0.getCell(2).getStringCellValue();
+// 			if (!"省".equals(prov)) {
+// 				return R.failed("导入模版第三列错误!");
+// 			}
+// 			String city = row0.getCell(3).getStringCellValue();
+// 			if (!"市".equals(city)) {
+// 				return R.failed("导入模版第四列错误!");
+// 			}
+// 			String role = row0.getCell(4).getStringCellValue();
+// 			if (!"角色".equals(role)) {
+// 				return R.failed("导入模版第五列错误!");
+// 			}
+// 			String userStatus = row0.getCell(5).getStringCellValue();
+// 			if (!"状态".equals(userStatus)) {
+// 				return R.failed("导入模版第六列错误!");
+// 			}
+// 			String provinceCode = row0.getCell(6).getStringCellValue();
+// 			if (!"省份编码".equals(provinceCode)) {
+// 				return R.failed("导入模版第七列错误!");
+// 			}
+// 			String cityCode = row0.getCell(7).getStringCellValue();
+// 			if (!"城市编码".equals(cityCode)) {
+// 				return R.failed("导入模版第八列错误!");
+// 			}
+//
+// 			//数据
+// 			List<UserDTO> userDTOList = new ArrayList<>();
+// 			List<ErrorInfoVo> errorList = new ArrayList<>();
+// 			log.info(">>> 通过excel批量创建用户开始 <<<");
+// 			// 行数据
+// 			for (int i = 1; i <= rowNum; i++) {
+//
+// 				// 行编号
+// 				int rNum = i;
+// 				Row row = sheet.getRow(i);
+// 				log.info(">>>当前导入第{}行<<<", i);
+//
+// 				if (row == null) {
+// 					ErrorInfoVo errorInfoVo = new ErrorInfoVo();
+// 					errorInfoVo.setRowNum(rNum);
+// 					errorInfoVo.setColumnName(null);
+// 					errorInfoVo.setContent(null);
+// 					errorInfoVo.setReason("当前行没有数据信息");
+// 					errorList.add(errorInfoVo);
+// 					continue;
+// 				}
+//
+// 				int colNum = row.getLastCellNum();
+// 				UserDTO userDTO = new UserDTO();
+//
+// 				userDTO.setDeptId(sysDept.getDeptId());
+// 				if(ArrayUtils.contains(sysDept.getSubjectType(),SubjectTypeEnum.TYPE_SHUIBANGYUN.getCode())){
+// 					userDTO.setCertStatus(TaxHelperCertStatus.UN_CERT.getCode());
+// 				}
+// //				if(ArrayUtils.contains(sysDept.getSubjectType(),SubjectTypeEnum.TYPE_RENLIJIA.getCode())){
+// //					userDTO.setRljCertStatus(DingEnum.CER_STATUS_4.getType());
+// //				}
+// //				if ("1".equals(sysDept.getSubjectType())) {
+// //					userDTO.setCertStatus(TaxHelperCertStatus.UN_CERT.getCode());
+// //					userDTO.setUserType("1");
+// //				} else {
+// //					userDTO.setUserType("0");
+// //				}
+// 				userDTO.setCreateTime(LocalDateTime.now());
+//
+// 				for (int j = 0; j < colNum; j++) {//列数据
+//
+// 					// 获取列名称
+// 					String columnName = row0.getCell(j).getStringCellValue();
+// 					int columnNum = j + 1;
+//
+// 					if (null == row.getCell(j)) {
+// 						ErrorInfoVo errorInfoVo = new ErrorInfoVo();
+// 						errorInfoVo.setRowNum(rNum);
+// 						errorInfoVo.setColumnNum(columnNum);
+// 						errorInfoVo.setColumnName(columnName);
+// 						errorInfoVo.setContent(null);
+// 						errorInfoVo.setReason("列数据为空");
+// 						errorList.add(errorInfoVo);
+// 						continue;
+// 					}
+//
+// 					// 格式化字符串
+// 					row.getCell(j).setCellType(CellType.STRING);
+// 					String value = row.getCell(j).getStringCellValue()
+// 							.replaceAll(" ", "")
+// 							.replaceAll(",", "")
+// 							.replaceAll("\\u00A0", "")
+// 							.replaceAll((char) 12288 + "", "")
+// 							.replace("+", "·");
+//
+// 					// 校验value
+// 					if (StringUtil.isEmpty(value)) {
+// 						ErrorInfoVo errorInfoVo = new ErrorInfoVo();
+// 						errorInfoVo.setRowNum(rNum);
+// 						errorInfoVo.setColumnNum(columnNum);
+// 						errorInfoVo.setColumnName(columnName);
+// 						errorInfoVo.setContent(value);
+// 						errorInfoVo.setReason("数据为空");
+// 						errorList.add(errorInfoVo);
+// 						continue;
+// 					}
+//
+// 					if (j == 0) {
+// 						userDTO.setRealname(value);
+// 					} else if (j == 1) {
+// 						// 记录错误说明
+// 						String errorInfo = null;
+// 						// 正则校验手机号
+// 						if (ValidateUtils.validPhoneNum("0", value)) {
+// 							// 判断同一个dept下用户是否重复
+// 							SysUser query = new SysUser();
+// 							query.setUsername(value);
+// 							query.setDeptId(userDTO.getDeptId());
+// 							SysUser sysUser = sysUserMapper.selectUserByName(query);
+// 							if (sysUser != null) {
+// 								errorInfo = "手机号已被占用";
+// 							}
+// 						} else {
+// 							errorInfo = "不是手机号";
+// 						}
+//
+// 						// 封装错误信息
+// 						if (StringUtils.isNotEmpty(errorInfo)) {
+// 							ErrorInfoVo errorInfoVo = new ErrorInfoVo();
+// 							errorInfoVo.setRowNum(rNum);
+// 							errorInfoVo.setColumnNum(columnNum);
+// 							errorInfoVo.setColumnName(columnName);
+// 							errorInfoVo.setContent(value);
+// 							errorInfoVo.setReason(errorInfo);
+// 							errorList.add(errorInfoVo);
+// 							continue;
+// 						}
+//
+// 						userDTO.setPlatId(value);
+// 						userDTO.setPhone(value);
+// 						userDTO.setUsername(value);
+// 					} else if (j == 2) {
+// 						if ("全国".equals(value)) {
+// 							userDTO.setProvince("");
+// 						} else {
+// 							userDTO.setProvince(value);
+// 						}
+// 					} else if (j == 3) {
+// 						if (StringUtils.isEmpty(userDTO.getProvince())) {
+// 							userDTO.setCity("");
+// 						} else {
+// 							userDTO.setCity(value);
+// 						}
+// 					} else if (j == 4) {
+// 						// 声明错误信息记录
+// 						String errorInfo = "";
+//
+// 						// 根据角色名称获取角色
+// 						SysRole sysRole = sysRoleMapper.selectOne(Wrappers.<SysRole>query().eq("role_name", value));
+// 						if (sysRole != null) {
+// 							userDTO.setRole(Arrays.asList(sysRole.getRoleId()));
+// 							if (userDTO.getRole().contains(2)) {
+// 								UserDTO tmp = new UserDTO();
+// 								tmp.setUsername(userDTO.getUsername());
+// 								tmp.setDelFlag("0");
+// 								List<UserVO> userVoList = sysUserMapper.selectByPhone(tmp);
+// 								if (userVoList.size() > 0) {
+// 									for (UserVO userVO : userVoList) {
+// 										if (null != userVO.getRoleList()) {
+// 											for (SysRole r : userVO.getRoleList()) {
+// 												if (r.getRoleId() == 3) {
+// 													errorInfo = errorInfo + "用户已存在平台管理员角色,不能同时为药企管理员!";
+// 													continue;
+// 												}
+// 												if (r.getRoleId() == 4) {
+// 													errorInfo = errorInfo + "用户已存在平台管理员角色,不能同时为CSO管理员!";
+// 													continue;
+// 												}
+// 												if (r.getRoleId() == 5) {
+// 													errorInfo = errorInfo + "用户已存在平台管理员角色,不能同时为全职学术推广员!";
+// 													continue;
+// 												}
+// 												if (r.getRoleId() == 6) {
+// 													errorInfo = errorInfo + "用户已存在平台管理员角色,不能同时为兼职学术推广员!";
+// 													continue;
+// 												}
+// 												if (r.getRoleId() == 7) {
+// 													errorInfo = errorInfo + "用户已存在平台管理员角色,不能同时为财务管理员!";
+// 													continue;
+// 												}
+// 											}
+// 										}
+// 									}
+// 								}
+//
+// 							} else if (userDTO.getRole().contains(3)) {
+// 								UserDTO tmp = new UserDTO();
+// 								tmp.setUsername(userDTO.getUsername());
+// 								tmp.setDelFlag("0");
+// 								List<UserVO> userVoList = sysUserMapper.selectByPhone(tmp);
+// 								if (userVoList.size() > 0) {
+// 									for (UserVO userVO : userVoList) {
+// 										if (null != userVO.getRoleList()) {
+// 											for (SysRole r : userVO.getRoleList()) {
+// 												if (r.getRoleId() == 2) {
+// 													errorInfo = errorInfo + "用户已存在药企管理员角色,不能同时为平台管理员!";
+// 													continue;
+// 												}
+// 												if (r.getRoleId() == 4) {
+// 													errorInfo = errorInfo + "用户已存在药企管理员角色,不能同时为CSO管理员!";
+// 													continue;
+// 												}
+// 												if (sysDept.getLevel() == 3 || sysDept.getLevel() == 4) {
+// 													if (r.getRoleId() == 5) {
+// 														errorInfo = errorInfo + "用户已存在CSO关系角色,不能同时为药企管理员!";
+// 														continue;
+// 													}
+// 												}
+// 											}
+// 										}
+// 									}
+// 								}
+//
+// 							} else if (userDTO.getRole().contains(4)) {
+// 								UserDTO tmp = new UserDTO();
+// 								tmp.setUsername(userDTO.getUsername());
+// 								tmp.setDelFlag("0");
+// 								List<UserVO> userVoList = sysUserMapper.selectByPhone(tmp);
+// 								if (userVoList.size() > 0) {
+// 									for (UserVO userVO : userVoList) {
+// 										if (null != userVO.getRoleList()) {
+// 											for (SysRole r : userVO.getRoleList()) {
+// 												if (sysRole.getRoleId() == 2) {
+// 													errorInfo = errorInfo + "用户已存在平台管理员角色,不能同时为!";
+// 													continue;
+// 												}
+//
+// 												if (r.getRoleId() == 3) {
+// 													errorInfo = errorInfo + "用户已存在药企管理员角色,不能同时为CSO管理员!";
+// 													continue;
+// 												}
+// 												if (r.getRoleId() == 5) {
+// 													SysUserRole sysUserRole = new SysUserRole();
+// 													sysUserRole.setUserId(userVO.getUserId());
+// 													List<SysUserRole> sysUserRoleList = sysUserRoleMapper.selectById(sysUserRole);
+// 													for (int k = 0; k < sysUserRoleList.size(); k++) {
+// 														SysUser sysUser = userService.getById(sysUserRoleList.get(k).getUserId());
+// 														if (!sysUser.getDeptId().equals(userDTO.getDeptId())) {
+// 															errorInfo = errorInfo + "用户已存在全职学术推广员角色,不能为其他机构CSO管理员!";
+// 															continue;
+// 														}
+// 													}
+// 												}
+// 											}
+// 										}
+// 									}
+// 								}
+//
+// 							} else if (userDTO.getRole().contains(7)) {
+// 								UserDTO tmp = new UserDTO();
+// 								tmp.setUsername(userDTO.getUsername());
+// 								tmp.setDelFlag("0");
+// 								List<UserVO> userVoList = sysUserMapper.selectByPhone(tmp);
+// 								if (userVoList.size() > 0) {
+// 									for (UserVO userVO : userVoList) {
+// 										if (null != userVO.getRoleList()) {
+// 											for (SysRole r : userVO.getRoleList()) {
+// 												if (r.getRoleId() == 2) {
+// 													errorInfo = errorInfo + "用户已存在平台管理员,不能同时为财务管理员!";
+// 													continue;
+// 												}
+// 												if (sysDept.getLevel() == 3 || sysDept.getLevel() == 4) {
+// 													if (r.getRoleId() == 3) {
+// 														errorInfo = errorInfo + "用户已存在药企管理员,不能同时为CSO机构财务管理员!";
+// 														continue;
+// 													}
+// 												}
+// 											}
+// 										}
+// 									}
+// 								}
+//
+// 							} else if (userDTO.getRole().contains(5)) {
+// 								UserDTO tmp = new UserDTO();
+// 								tmp.setUsername(userDTO.getUsername());
+// 								tmp.setDelFlag("0");
+// 								List<UserVO> userVoList = sysUserMapper.selectByPhone(tmp);
+// 								if (userVoList.size() > 0) {
+// 									for (UserVO userVO : userVoList) {
+// 										if (null != userVO.getRoleList()) {
+// 											for (SysRole r : userVO.getRoleList()) {
+// 												if (r.getRoleId() == 2) {
+// 													errorInfo = errorInfo + "用户已存在平台管理员,不能同时为全职学术推广员!";
+// 													continue;
+// 												}
+// 												if (r.getRoleId() == 3) {
+// 													if (sysDept.getLevel() == 3 || sysDept.getLevel() == 4) {
+// 														errorInfo = errorInfo + "用户已存在药企管理员,不能为CSO的全职学术推广员!";
+// 														continue;
+// 													}
+// 												}
+// 												if (r.getRoleId() == 4) {
+// 													if (sysDept.getLevel() == 3 || sysDept.getLevel() == 4) {
+// 														errorInfo = errorInfo + "用户已存在CSO管理员,不能为其他CSO的全职学术推广员!";
+// 														continue;
+// 													}
+// 												}
+//
+// 											}
+// 										}
+// 									}
+// 								}
+//
+// 							} else if (userDTO.getRole().contains(6)) {
+// 								UserDTO tmp = new UserDTO();
+// 								tmp.setUsername(userDTO.getUsername());
+// 								tmp.setDelFlag("0");
+// 								List<UserVO> userVoList = sysUserMapper.selectByPhone(tmp);
+// 								if (userVoList.size() > 0) {
+// 									for (UserVO userVO : userVoList) {
+// 										if (null != userVO.getRoleList()) {
+// 											for (SysRole r : userVO.getRoleList()) {
+// 												if (r.getRoleId() == 2) {
+// 													errorInfo = errorInfo + "用户已存在平台管理员,不能同时为兼职学术推广员!";
+// 													continue;
+// 												}
+// 												SysUserRole sysUserRole = new SysUserRole();
+// 												sysUserRole.setUserId(userVO.getUserId());
+// 												List<SysUserRole> sysUserRoleList = sysUserRoleMapper.selectById(sysUserRole);
+// 												for (int k = 0; k < sysUserRoleList.size(); k++) {
+// 													if (sysUserRoleList.get(k).getRoleId().equals(7)) {
+// 														SysUser sysUser = userService.getById(sysUserRoleList.get(k).getUserId());
+// 														if (sysUser.getDeptId().equals(userDTO.getDeptId())) {
+// 															errorInfo = errorInfo + "用户已存在财务管理员角色,不能同时为兼职学术推广员!";
+// 															continue;
+// 														}
+// 													}
+// 												}
+// 											}
+// 										}
+// 									}
+// 								}
+//
+// 							} else if (userDTO.getRole().contains(9)) {
+// 								UserDTO tmp = new UserDTO();
+// 								tmp.setUsername(userDTO.getUsername());
+// 								tmp.setDelFlag("0");
+// 								List<UserVO> userVoList = sysUserMapper.selectByPhone(tmp);
+// 								if (userVoList.size() > 0) {
+// 									for (UserVO userVO : userVoList) {
+// 										if (null != userVO.getRoleList()) {
+// 											for (SysRole r : userVO.getRoleList()) {
+// 												if (sysRole.getRoleId() == 2) {
+// 													errorInfo = errorInfo + "用户已存在平台管理员,不能同时为CRO管理员!";
+// 													continue;
+// 												}
+// 												if (r.getRoleId() == 3) {
+// 													errorInfo = errorInfo + "用户已存在药企管理员,不能同时为CRO管理员!";
+// 													continue;
+// 												}
+// 											}
+// 										}
+// 									}
+// 								}
+// 							}
+// 							if (userDTO.getRole().contains(3)) {
+// 								if (sysDept.getLevel() != 2) {
+// 									errorInfo = errorInfo + "角色选为药企管理员时,组织架构必须为药企!";
+// 								}
+// 							}
+// 							if (!userDTO.getDeptId().equals(SecurityUtils.getUser().getDeptId())) {
+// 								if (userDTO.getRole().contains(5) || userDTO.getRole().contains(6)) {
+// 									errorInfo = errorInfo + "不能跨机构维护学术推广员!";
+// 								}
+// 							}
+// 						}
+//
+// 						// 存在错误
+// 						if (StringUtils.isNotEmpty(errorInfo) || sysRole == null) {
+// 							ErrorInfoVo errorInfoVo = new ErrorInfoVo();
+// 							errorInfoVo.setRowNum(rNum);
+// 							errorInfoVo.setColumnNum(columnNum);
+// 							errorInfoVo.setColumnName(columnName);
+// 							errorInfoVo.setContent(errorInfo);
+// 							errorInfoVo.setReason("角色信息有误");
+// 							errorList.add(errorInfoVo);
+// 							continue;
+// 						}
+// 					} else if (j == 5) {
+// 						if (!"活跃".equals(value) && !"休眠".equals(value)) {
+// 							ErrorInfoVo errorInfoVo = new ErrorInfoVo();
+// 							errorInfoVo.setRowNum(rNum);
+// 							errorInfoVo.setColumnNum(columnNum);
+// 							errorInfoVo.setColumnName(columnName);
+// 							errorInfoVo.setContent(value);
+// 							errorInfoVo.setReason("角色状态有误");
+// 							errorList.add(errorInfoVo);
+// 							continue;
+// 						}
+// 						userDTO.setLockFlag("活跃".equals(value) ? "0" : "9");
+// 					} else if (j == 6) {
+// 						userDTO.setProvinceCode(value);
+// 					} else if (j == 7) {
+// 						userDTO.setCityCode(value);
+// 					}
+// 				}
+//
+// 				// 记录争取额的信息
+// 				userDTOList.add(userDTO);
+// 			}
+//
+// 			// 判断是否有错误的数据行,如果没有,执行入库操作
+// 			if (CollectionUtils.isEmpty(errorList)) {
+// 				userDTOList.forEach(userDTO -> {
+// 					userService.saveUser(userDTO);
+// 				});
+// 			}
+// 			return R.ok(errorList);
+//
+// 		} catch (Exception e) {
+// 			log.error("批量创建用户失败:{}",e.getMessage());
+// 			e.printStackTrace();
+// 			return R.failed("批量创建用户失败");
+// 		}
+// 	}
+
 	/**
 	 * 更新用户信息
 	 *

+ 64 - 0
hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/entity/dto/CommonUserDTO.java

@@ -0,0 +1,64 @@
+package com.qunzhixinxi.hnqz.admin.entity.dto;
+
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * {@code CommonUserDTO} 批量创建用户DTO
+ *
+ * @author Hengchen.Sun
+ * @version 1.0.0
+ * @date 2021/07/20 11:11:26
+ */
+@Data
+public class CommonUserDTO implements Serializable {
+	private static final long serialVersionUID = -4749161744799972179L;
+
+	/**
+	 * id
+	 */
+	private String id;
+
+	/**
+	 * 用户真实姓名
+	 */
+	private String realName;
+
+	/**
+	 * 用户名
+	 */
+	private String username;
+
+	/**
+	 * 省
+	 */
+	private String province;
+
+	/**
+	 * 市
+	 */
+	private String city;
+
+
+	/**
+	 * 角色名称
+	 */
+	private String roleName;
+
+	/**
+	 * 锁定状态
+	 */
+	private String lockFlag;
+
+	/**
+	 * 省份编码
+	 */
+
+	private String provinceCode;
+
+	/**
+	 * 城市编码
+	 */
+	private String cityCode;
+}

+ 74 - 0
hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/entity/model/excel/CommonUserExcelModel.java

@@ -0,0 +1,74 @@
+package com.qunzhixinxi.hnqz.admin.entity.model.excel;
+
+import com.alibaba.excel.annotation.ExcelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * {@code CommonUserExcelModel} 用户excel模型
+ *
+ * @author Hengchen.Sun
+ * @version 1.0.0
+ * @date 2021/07/20 10:53:32
+ */
+@Data
+public class CommonUserExcelModel implements Serializable {
+	private static final long serialVersionUID = -8680773572039025644L;
+
+	/**
+	 * id
+	 */
+	@ExcelProperty(index = 0)
+	private String id;
+
+	/**
+	 * 用户真实姓名
+	 */
+	@ExcelProperty(index = 1)
+	private String realName;
+
+	/**
+	 * 用户名
+	 */
+	@ExcelProperty(index = 2)
+	private String username;
+
+	/**
+	 * 省
+	 */
+	@ExcelProperty(index = 3)
+	private String province;
+
+	/**
+	 * 市
+	 */
+	@ExcelProperty(index = 4)
+	private String city;
+
+
+	/**
+	 * 角色名称
+	 */
+	@ExcelProperty(index = 5)
+	private String roleName;
+
+	/**
+	 * 锁定状态
+	 */
+	@ExcelProperty(index = 6)
+	private String lockFlag;
+
+	/**
+	 * 省份编码
+	 */
+	@ExcelProperty(index = 7)
+	private String provinceCode;
+
+	/**
+	 * 城市编码
+	 */
+	@ExcelProperty(index = 8)
+	private String cityCode;
+
+}

+ 18 - 1
hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/service/SysUserService.java

@@ -27,10 +27,12 @@ import com.qunzhixinxi.hnqz.admin.api.dto.UserInfo;
 import com.qunzhixinxi.hnqz.admin.api.dto.UserPwd;
 import com.qunzhixinxi.hnqz.admin.api.entity.SysUser;
 import com.qunzhixinxi.hnqz.admin.api.vo.UserVO;
+import com.qunzhixinxi.hnqz.admin.entity.dto.CommonUserDTO;
 import com.qunzhixinxi.hnqz.admin.entity.input.UserCertificationInput;
 import com.qunzhixinxi.hnqz.common.core.util.R;
 
 import java.util.List;
+import java.util.Map;
 
 /**
  * @author hnqz
@@ -40,6 +42,7 @@ public interface SysUserService extends IService<SysUser> {
 
 	/**
 	 * 查询用户信息
+	 *
 	 * @param sysUser 用户
 	 * @return userInfo
 	 */
@@ -48,7 +51,8 @@ public interface SysUserService extends IService<SysUser> {
 
 	/**
 	 * 分页查询用户信息(含有角色信息)
-	 * @param page 分页对象
+	 *
+	 * @param page    分页对象
 	 * @param userDTO 参数列表
 	 * @return
 	 */
@@ -60,6 +64,7 @@ public interface SysUserService extends IService<SysUser> {
 
 	/**
 	 * 删除用户
+	 *
 	 * @param sysUser 用户
 	 * @return boolean
 	 */
@@ -67,6 +72,7 @@ public interface SysUserService extends IService<SysUser> {
 
 	/**
 	 * 更新当前用户基本信息
+	 *
 	 * @param userDto 用户信息
 	 * @return Boolean
 	 */
@@ -74,6 +80,7 @@ public interface SysUserService extends IService<SysUser> {
 
 	/**
 	 * 更新指定用户信息
+	 *
 	 * @param userDto 用户信息
 	 * @return
 	 */
@@ -84,6 +91,7 @@ public interface SysUserService extends IService<SysUser> {
 
 	/**
 	 * 通过ID查询用户信息
+	 *
 	 * @param id 用户ID
 	 * @return 用户信息
 	 */
@@ -91,6 +99,7 @@ public interface SysUserService extends IService<SysUser> {
 
 	/**
 	 * 查询上级部门的用户信息
+	 *
 	 * @param username 用户名
 	 * @return R
 	 */
@@ -98,6 +107,7 @@ public interface SysUserService extends IService<SysUser> {
 
 	/**
 	 * 保存用户信息
+	 *
 	 * @param userDto DTO 对象
 	 * @return success/fail
 	 */
@@ -116,4 +126,11 @@ public interface SysUserService extends IService<SysUser> {
 
 	R getAuthInfo(UserCertificationInput input);
 
+	/**
+	 * 通过excel批量创建用户
+	 *
+	 * @param commonUserDTOListMap 通用用户dto
+	 * @return 结果
+	 */
+	Map<String, String> batchByExcel(Map<String, List<CommonUserDTO>> commonUserDTOListMap);
 }

+ 430 - 3
hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/service/impl/SysUserServiceImpl.java

@@ -19,8 +19,11 @@
 
 package com.qunzhixinxi.hnqz.admin.service.impl;
 
+import cn.hutool.core.collection.CollectionUtil;
+import cn.hutool.core.lang.Validator;
 import cn.hutool.core.util.ArrayUtil;
 import cn.hutool.core.util.StrUtil;
+import cn.hutool.json.JSONUtil;
 import com.alibaba.nacos.common.utils.Md5Utils;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
@@ -34,8 +37,11 @@ import com.qunzhixinxi.hnqz.admin.api.vo.MenuVO;
 import com.qunzhixinxi.hnqz.admin.api.vo.UserVO;
 import com.qunzhixinxi.hnqz.admin.entity.SysCertResultRecord;
 import com.qunzhixinxi.hnqz.admin.entity.SysDeptSub;
+import com.qunzhixinxi.hnqz.admin.entity.dto.CommonUserDTO;
 import com.qunzhixinxi.hnqz.admin.entity.input.UserCertificationInput;
 import com.qunzhixinxi.hnqz.admin.entity.output.UserCertificationOutput;
+import com.qunzhixinxi.hnqz.admin.enums.DelEnum;
+import com.qunzhixinxi.hnqz.admin.enums.LockEnum;
 import com.qunzhixinxi.hnqz.admin.enums.SubjectTypeEnum;
 import com.qunzhixinxi.hnqz.admin.mapper.*;
 import com.qunzhixinxi.hnqz.admin.service.*;
@@ -48,6 +54,7 @@ import com.qunzhixinxi.hnqz.common.ding.entity.EmployCheckResponse;
 import com.qunzhixinxi.hnqz.common.ding.entity.EmployCheckResultItem;
 import com.qunzhixinxi.hnqz.common.ding.enums.DingEnum;
 import com.qunzhixinxi.hnqz.common.ding.service.DingService;
+import com.qunzhixinxi.hnqz.common.security.service.HnqzUser;
 import com.qunzhixinxi.hnqz.common.security.util.SecurityUtils;
 import com.qunzhixinxi.hnqz.common.taxhelper.config.TaxHelperConfig;
 import com.qunzhixinxi.hnqz.common.taxhelper.entity.model.TaxHelperAddMemberModel;
@@ -58,7 +65,8 @@ import com.qunzhixinxi.hnqz.common.taxhelper.service.TaxHelperService;
 import lombok.AllArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.collections4.CollectionUtils;
-import org.apache.commons.lang.StringUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.commons.lang3.ArrayUtils;
 import org.springframework.beans.BeanUtils;
 import org.springframework.cache.annotation.CacheEvict;
 import org.springframework.cache.annotation.Caching;
@@ -118,7 +126,7 @@ public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUser> impl
 	 * @Version: v2021.4.16
 	 * @Author: ryz
 	 * @Date: 2021/5/6
-	*/
+	 */
 	@Override
 	public R getAuthInfo(UserCertificationInput input) {
 
@@ -135,6 +143,425 @@ public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUser> impl
 		return R.ok(output);
 	}
 
+	/**
+	 * 通过excel批量创建用户
+	 *
+	 * @param commonUserDTOListMap 通用用户dto
+	 * @return 结果
+	 */
+	@Override
+	@Transactional(rollbackFor = Exception.class)
+	public Map<String, String> batchByExcel(Map<String, List<CommonUserDTO>> commonUserDTOListMap) {
+
+		// 变量
+		Map<String, String> errorMap = new HashMap<>();
+		List<UserDTO> currentList = new ArrayList<>();
+
+		// 获取操作员
+		HnqzUser creator = SecurityUtils.getUser();
+
+		// 业务值校验
+		for (Map.Entry<String, List<CommonUserDTO>> entry : commonUserDTOListMap.entrySet()) {
+			checkoutCommonUserDTOInfo(entry.getValue(), creator, errorMap, currentList);
+		}
+
+		// 上传结果
+		if (CollectionUtil.isEmpty(errorMap)) {
+			currentList.forEach(this::saveUser);
+		}
+
+		return errorMap;
+	}
+
+	/**
+	 * 封装错误信息
+	 *
+	 * @param errorMap 记录错误信息map
+	 * @param key      原因
+	 * @param idStr    错误id
+	 */
+	private void errorMap(Map<String, String> errorMap, String key, String idStr) {
+		if (errorMap.containsKey(key)) {
+			String val = errorMap.get(key);
+			idStr = String.join(";", val, idStr);
+		}
+		errorMap.put(key, idStr);
+	}
+
+	/**
+	 * 角色校验
+	 *
+	 * @param roleName 角色名称
+	 * @param userDTO 用户dto
+	 * @param dept     部门
+	 * @return 校验错误信息
+	 */
+	private String checkoutCommonUserRole(String roleName, UserDTO userDTO, SysDept dept) {
+
+		String errorInfo = null;
+
+		if (StringUtils.isEmpty(roleName)) {
+			errorInfo = "角色名称为空";
+		} else {
+			// 根据角色名称获取角色
+			SysRole sysRole = sysRoleService.getOne(Wrappers.<SysRole>lambdaQuery()
+					.eq(SysRole::getRoleName, roleName)
+					.eq(SysRole::getDelFlag, DelEnum.NOT_DEL.val()));
+			if (sysRole == null) {
+				errorInfo = "角色不存在或者未启用";
+			} else {
+				userDTO.setRole(Collections.singletonList(sysRole.getRoleId()));
+				if (userDTO.getRole().contains(2)) {
+					UserDTO tmp = new UserDTO();
+					tmp.setUsername(userDTO.getUsername());
+					tmp.setDelFlag("0");
+					List<UserVO> userVoList = sysUserMapper.selectByPhone(tmp);
+					if (userVoList.size() > 0) {
+						for (UserVO userVO : userVoList) {
+							if (null != userVO.getRoleList()) {
+								for (SysRole r : userVO.getRoleList()) {
+									if (r.getRoleId() == 3) {
+										errorInfo = errorInfo + "用户已存在平台管理员角色,不能同时为药企管理员!";
+										continue;
+									}
+									if (r.getRoleId() == 4) {
+										errorInfo = errorInfo + "用户已存在平台管理员角色,不能同时为CSO管理员!";
+										continue;
+									}
+									if (r.getRoleId() == 5) {
+										errorInfo = errorInfo + "用户已存在平台管理员角色,不能同时为全职学术推广员!";
+										continue;
+									}
+									if (r.getRoleId() == 6) {
+										errorInfo = errorInfo + "用户已存在平台管理员角色,不能同时为兼职学术推广员!";
+										continue;
+									}
+									if (r.getRoleId() == 7) {
+										errorInfo = errorInfo + "用户已存在平台管理员角色,不能同时为财务管理员!";
+										continue;
+									}
+								}
+							}
+						}
+					}
+
+				} else if (userDTO.getRole().contains(3)) {
+					UserDTO tmp = new UserDTO();
+					tmp.setUsername(userDTO.getUsername());
+					tmp.setDelFlag("0");
+					List<UserVO> userVoList = sysUserMapper.selectByPhone(tmp);
+					if (userVoList.size() > 0) {
+						for (UserVO userVO : userVoList) {
+							if (null != userVO.getRoleList()) {
+								for (SysRole r : userVO.getRoleList()) {
+									if (r.getRoleId() == 2) {
+										errorInfo = errorInfo + "用户已存在药企管理员角色,不能同时为平台管理员!";
+										continue;
+									}
+									if (r.getRoleId() == 4) {
+										errorInfo = errorInfo + "用户已存在药企管理员角色,不能同时为CSO管理员!";
+										continue;
+									}
+									if (dept.getLevel() == 3 || dept.getLevel() == 4) {
+										if (r.getRoleId() == 5) {
+											errorInfo = errorInfo + "用户已存在CSO关系角色,不能同时为药企管理员!";
+											continue;
+										}
+									}
+								}
+							}
+						}
+					}
+
+				} else if (userDTO.getRole().contains(4)) {
+					UserDTO tmp = new UserDTO();
+					tmp.setUsername(userDTO.getUsername());
+					tmp.setDelFlag("0");
+					List<UserVO> userVoList = sysUserMapper.selectByPhone(tmp);
+					if (userVoList.size() > 0) {
+						for (UserVO userVO : userVoList) {
+							if (null != userVO.getRoleList()) {
+								for (SysRole r : userVO.getRoleList()) {
+									if (sysRole.getRoleId() == 2) {
+										errorInfo = errorInfo + "用户已存在平台管理员角色,不能同时为!";
+										continue;
+									}
+
+									if (r.getRoleId() == 3) {
+										errorInfo = errorInfo + "用户已存在药企管理员角色,不能同时为CSO管理员!";
+										continue;
+									}
+									if (r.getRoleId() == 5) {
+										SysUserRole sysUserRole = new SysUserRole();
+										sysUserRole.setUserId(userVO.getUserId());
+										List<SysUserRole> sysUserRoleList = sysUserRoleMapper.selectById(sysUserRole);
+										for (int k = 0; k < sysUserRoleList.size(); k++) {
+											SysUser sysUser = getById(sysUserRoleList.get(k).getUserId());
+											if (!sysUser.getDeptId().equals(userDTO.getDeptId())) {
+												errorInfo = errorInfo + "用户已存在全职学术推广员角色,不能为其他机构CSO管理员!";
+												continue;
+											}
+										}
+									}
+								}
+							}
+						}
+					}
+
+				} else if (userDTO.getRole().contains(7)) {
+					UserDTO tmp = new UserDTO();
+					tmp.setUsername(userDTO.getUsername());
+					tmp.setDelFlag("0");
+					List<UserVO> userVoList = sysUserMapper.selectByPhone(tmp);
+					if (userVoList.size() > 0) {
+						for (UserVO userVO : userVoList) {
+							if (null != userVO.getRoleList()) {
+								for (SysRole r : userVO.getRoleList()) {
+									if (r.getRoleId() == 2) {
+										errorInfo = errorInfo + "用户已存在平台管理员,不能同时为财务管理员!";
+										continue;
+									}
+									if (dept.getLevel() == 3 || dept.getLevel() == 4) {
+										if (r.getRoleId() == 3) {
+											errorInfo = errorInfo + "用户已存在药企管理员,不能同时为CSO机构财务管理员!";
+											continue;
+										}
+									}
+								}
+							}
+						}
+					}
+
+				} else if (userDTO.getRole().contains(5)) {
+					UserDTO tmp = new UserDTO();
+					tmp.setUsername(userDTO.getUsername());
+					tmp.setDelFlag("0");
+					List<UserVO> userVoList = sysUserMapper.selectByPhone(tmp);
+					if (userVoList.size() > 0) {
+						for (UserVO userVO : userVoList) {
+							if (null != userVO.getRoleList()) {
+								for (SysRole r : userVO.getRoleList()) {
+									if (r.getRoleId() == 2) {
+										errorInfo = errorInfo + "用户已存在平台管理员,不能同时为全职学术推广员!";
+										continue;
+									}
+									if (r.getRoleId() == 3) {
+										if (dept.getLevel() == 3 || dept.getLevel() == 4) {
+											errorInfo = errorInfo + "用户已存在药企管理员,不能为CSO的全职学术推广员!";
+											continue;
+										}
+									}
+									if (r.getRoleId() == 4) {
+										if (dept.getLevel() == 3 || dept.getLevel() == 4) {
+											errorInfo = errorInfo + "用户已存在CSO管理员,不能为其他CSO的全职学术推广员!";
+											continue;
+										}
+									}
+
+								}
+							}
+						}
+					}
+
+				} else if (userDTO.getRole().contains(6)) {
+					UserDTO tmp = new UserDTO();
+					tmp.setUsername(userDTO.getUsername());
+					tmp.setDelFlag("0");
+					List<UserVO> userVoList = sysUserMapper.selectByPhone(tmp);
+					if (userVoList.size() > 0) {
+						for (UserVO userVO : userVoList) {
+							if (null != userVO.getRoleList()) {
+								for (SysRole r : userVO.getRoleList()) {
+									if (r.getRoleId() == 2) {
+										errorInfo = errorInfo + "用户已存在平台管理员,不能同时为兼职学术推广员!";
+										continue;
+									}
+									SysUserRole sysUserRole = new SysUserRole();
+									sysUserRole.setUserId(userVO.getUserId());
+									List<SysUserRole> sysUserRoleList = sysUserRoleMapper.selectById(sysUserRole);
+									for (int k = 0; k < sysUserRoleList.size(); k++) {
+										if (sysUserRoleList.get(k).getRoleId().equals(7)) {
+											SysUser sysUser = getById(sysUserRoleList.get(k).getUserId());
+											if (sysUser.getDeptId().equals(userDTO.getDeptId())) {
+												errorInfo = errorInfo + "用户已存在财务管理员角色,不能同时为兼职学术推广员!";
+												continue;
+											}
+										}
+									}
+								}
+							}
+						}
+					}
+
+				} else if (userDTO.getRole().contains(9)) {
+					UserDTO tmp = new UserDTO();
+					tmp.setUsername(userDTO.getUsername());
+					tmp.setDelFlag("0");
+					List<UserVO> userVoList = sysUserMapper.selectByPhone(tmp);
+					if (userVoList.size() > 0) {
+						for (UserVO userVO : userVoList) {
+							if (null != userVO.getRoleList()) {
+								for (SysRole r : userVO.getRoleList()) {
+									if (sysRole.getRoleId() == 2) {
+										errorInfo = errorInfo + "用户已存在平台管理员,不能同时为CRO管理员!";
+										continue;
+									}
+									if (r.getRoleId() == 3) {
+										errorInfo = errorInfo + "用户已存在药企管理员,不能同时为CRO管理员!";
+										continue;
+									}
+								}
+							}
+						}
+					}
+				}
+				if (userDTO.getRole().contains(3)) {
+					if (dept.getLevel() != 2) {
+						errorInfo = errorInfo + "角色选为药企管理员时,组织架构必须为药企!";
+					}
+				}
+			}
+		}
+
+		return errorInfo;
+	}
+
+	/**
+	 * 校验通用dto信息
+	 *
+	 * @param commonUserDTOList 通用用户dto信息
+	 * @param creator       创建人
+	 * @param errorMap      错误信息记录map
+	 * @param currentList   正确结果收集信息
+	 */
+	private void checkoutCommonUserDTOInfo(List<CommonUserDTO> commonUserDTOList, HnqzUser
+			creator, Map<String, String> errorMap, List<UserDTO> currentList) {
+
+		// 行编号
+		log.info("开始校验数据:{}", commonUserDTOList);
+
+		if (commonUserDTOList.size() != 1){
+			log.error("表中手机号重复");
+			Set<String> idSet = commonUserDTOList.stream().map(dto -> dto.getId()).collect(Collectors.toSet());
+			errorMap(errorMap, "表中手机号重复", JSONUtil.toJsonStr(idSet));
+		}
+
+		CommonUserDTO commonUserDTO = commonUserDTOList.get(0);
+
+		UserDTO userDTO = new UserDTO();
+
+		// 校验用户名称
+		String realName = StrUtil.cleanBlank(commonUserDTO.getRealName());
+		if (StringUtils.isEmpty(realName)) {
+			log.error("用户姓名为空");
+			errorMap(errorMap, "用户姓名为空", commonUserDTO.getId());
+		} else {
+			userDTO.setRealname(realName);
+		}
+
+		// 校验手机号
+		String username = StrUtil.cleanBlank(commonUserDTO.getUsername());
+		if (StringUtils.isEmpty(username)) {
+			log.error("手机号为空");
+			errorMap(errorMap, "用户手机号为空", commonUserDTO.getId());
+		} else {
+			// 校验手机号格式
+			boolean isMobile = Validator.isMobile(username);
+			if (!isMobile) {
+				log.error("用户手机号各式不正确");
+				errorMap(errorMap, "用户手机号各式不正确", commonUserDTO.getId());
+			}
+
+			// 校验部门下是否有启用的用户
+			int count = count(Wrappers.<SysUser>lambdaQuery().eq(SysUser::getUsername, username)
+					.eq(SysUser::getDeptId,creator.getDeptId())
+					.eq(SysUser::getLockFlag, LockEnum.UN_LOCK.val()).eq(SysUser::getDelFlag, DelEnum.NOT_DEL.val()));
+			if (count != 0) {
+				log.info("手机号被占用");
+				errorMap(errorMap, "手机号被占用", commonUserDTO.getId());
+			}
+
+			userDTO.setPlatId(username);
+			userDTO.setPhone(username);
+			userDTO.setUsername(username);
+		}
+
+		// 校验省
+		String province = StrUtil.cleanBlank(commonUserDTO.getProvince());
+		if (StringUtils.isEmpty(province)) {
+			log.error("省份为空");
+			errorMap(errorMap, "省份为空", commonUserDTO.getId());
+		} else {
+			province = "全国".equals(province) ? "" : province;
+			userDTO.setProvince(province);
+
+			// 校验城市
+			if (StringUtils.isEmpty(province)) {
+				userDTO.setCity("");
+				userDTO.setProvinceCode("");
+				userDTO.setCityCode("");
+			} else {
+				String provinceCode = StrUtil.cleanBlank(commonUserDTO.getProvinceCode());
+				if (StringUtils.isEmpty(provinceCode)){
+					log.error("省份编码为空");
+					errorMap(errorMap, "省份编码为空", commonUserDTO.getId());
+				}
+				userDTO.setProvinceCode(provinceCode);
+
+				String city = StrUtil.cleanBlank(commonUserDTO.getCity());
+				if (StringUtils.isEmpty(city)) {
+					log.error("城市为空");
+					errorMap(errorMap, "城市为空", commonUserDTO.getId());
+				}
+
+				userDTO.setCity(city);
+
+				String cityCode = StrUtil.cleanBlank(commonUserDTO.getCityCode());
+				if (StringUtils.isEmpty(cityCode)){
+					log.error("城市编码为空");
+					errorMap(errorMap, "城市编码为空", commonUserDTO.getId());
+				}
+				userDTO.setCityCode(cityCode);
+
+			}
+		}
+
+		// 校验用户角色
+		SysDept dept = sysDeptService.getById(creator.getDeptId());
+		String roleName = StrUtil.cleanBlank(commonUserDTO.getRoleName());
+		String errInfo = checkoutCommonUserRole(roleName, userDTO, dept);
+		if (StringUtils.isNotEmpty(errInfo)) {
+			log.error(errInfo);
+			errorMap(errorMap, errInfo, commonUserDTO.getId());
+		}
+
+		// 校验用户状态
+		String lockflag = StrUtil.cleanBlank(commonUserDTO.getLockFlag());
+		if (StringUtils.isEmpty(lockflag)) {
+			log.error("用户状态为空");
+			errorMap(errorMap, "用户状态为空", commonUserDTO.getId());
+		} else {
+			if (StringUtils.equals(lockflag, "活跃")) {
+				userDTO.setLockFlag("0");
+			} else if (StringUtils.equals(lockflag, "休眠")) {
+				userDTO.setLockFlag("9");
+			} else {
+				log.error("用户状态为值不是\"活跃\"或者\"休眠\"");
+				errorMap(errorMap, "用户状态为值不是\"活跃\"或者\"休眠\"", commonUserDTO.getId());
+			}
+		}
+
+		if (ArrayUtils.contains(dept.getSubjectType(), SubjectTypeEnum.TYPE_SHUIBANGYUN.getCode())) {
+			userDTO.setCertStatus(TaxHelperCertStatus.UN_CERT.getCode());
+		}
+
+		// 记录正确的结果
+		userDTO.setCreateTime(LocalDateTime.now());
+		userDTO.setDeptId(dept.getDeptId());
+		currentList.add(userDTO);
+
+	}
+
 	/**
 	 * @Modify: start
 	 * @Version: 2021.4.16
@@ -169,7 +596,7 @@ public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUser> impl
 		String resultMsg = msg.toString();
 
 		baseMapper.updateById(sysUser);
-		return R.ok(null, resultMsg.substring(0,resultMsg.length()-1));
+		return R.ok(null, resultMsg.substring(0, resultMsg.length() - 1));
 	}
 
 	private Map<String, String> certByShuiBangYun(SysUser sysUser, SysDept sysDept) {