Commit 4ab1cf1cd477e8ba85f0765e9923ea85ea2b4d27

Authored by YunaiV
1 parent c3df5bc6

1. 完成用户导入的功能

ruoyi-ui/src/api/system/user.js
@@ -122,7 +122,8 @@ export function uploadAvatar(data) { @@ -122,7 +122,8 @@ export function uploadAvatar(data) {
122 // 下载用户导入模板 122 // 下载用户导入模板
123 export function importTemplate() { 123 export function importTemplate() {
124 return request({ 124 return request({
125 - url: '/system/user/importTemplate',  
126 - method: 'get' 125 + url: '/system/user/get-import-template',
  126 + method: 'get',
  127 + responseType: 'blob'
127 }) 128 })
128 } 129 }
ruoyi-ui/src/views/system/user/index.vue
@@ -391,7 +391,7 @@ export default { @@ -391,7 +391,7 @@ export default {
391 // 设置上传的请求头部 391 // 设置上传的请求头部
392 headers: { Authorization: "Bearer " + getToken() }, 392 headers: { Authorization: "Bearer " + getToken() },
393 // 上传的地址 393 // 上传的地址
394 - url: process.env.VUE_APP_BASE_API + "/system/user/importData" 394 + url: process.env.VUE_APP_BASE_API + '/api/' + "/system/user/import"
395 }, 395 },
396 // 查询参数 396 // 查询参数
397 queryParams: { 397 queryParams: {
@@ -669,7 +669,7 @@ export default { @@ -669,7 +669,7 @@ export default {
669 /** 下载模板操作 */ 669 /** 下载模板操作 */
670 importTemplate() { 670 importTemplate() {
671 importTemplate().then(response => { 671 importTemplate().then(response => {
672 - this.download(response.msg); 672 + this.downloadExcel(response, '用户导入模板.xls');
673 }); 673 });
674 }, 674 },
675 // 文件上传中处理 675 // 文件上传中处理
@@ -681,7 +681,21 @@ export default { @@ -681,7 +681,21 @@ export default {
681 this.upload.open = false; 681 this.upload.open = false;
682 this.upload.isUploading = false; 682 this.upload.isUploading = false;
683 this.$refs.upload.clearFiles(); 683 this.$refs.upload.clearFiles();
684 - this.$alert(response.msg, "导入结果", { dangerouslyUseHTMLString: true }); 684 + // 拼接提示语
  685 + let data = response.data;
  686 + let text = '创建成功数量:' + data.createUsernames.length;
  687 + for (const username of data.createUsernames) {
  688 + text += '<br />&nbsp;&nbsp;&nbsp;&nbsp;' + username;
  689 + }
  690 + text += '<br />更新成功数量:' + data.updateUsernames.length;
  691 + for (const username of data.updateUsernames) {
  692 + text += '<br />&nbsp;&nbsp;&nbsp;&nbsp;' + username;
  693 + }
  694 + text += '<br />更新失败数量:' + Object.keys(data.failureUsernames).length;
  695 + for (const username in data.failureUsernames) {
  696 + text += '<br />&nbsp;&nbsp;&nbsp;&nbsp;' + username + ':' + data.failureUsernames[username];
  697 + }
  698 + this.$alert(text, "导入结果", { dangerouslyUseHTMLString: true });
685 this.getList(); 699 this.getList();
686 }, 700 },
687 // 提交上传文件 701 // 提交上传文件
src/main/java/cn/iocoder/dashboard/common/exception/ServiceException.java
@@ -47,6 +47,7 @@ public final class ServiceException extends RuntimeException { @@ -47,6 +47,7 @@ public final class ServiceException extends RuntimeException {
47 return this; 47 return this;
48 } 48 }
49 49
  50 + @Override
50 public String getMessage() { 51 public String getMessage() {
51 return message; 52 return message;
52 } 53 }
src/main/java/cn/iocoder/dashboard/common/exception/util/ServiceExceptionUtil.java
@@ -103,11 +103,11 @@ public class ServiceExceptionUtil { @@ -103,11 +103,11 @@ public class ServiceExceptionUtil {
103 if (i == 0) { 103 if (i == 0) {
104 return messagePattern; 104 return messagePattern;
105 } else { 105 } else {
106 - sbuf.append(messagePattern.substring(i, messagePattern.length())); 106 + sbuf.append(messagePattern.substring(i));
107 return sbuf.toString(); 107 return sbuf.toString();
108 } 108 }
109 } else { 109 } else {
110 - sbuf.append(messagePattern.substring(i, j)); 110 + sbuf.append(messagePattern, i, j);
111 sbuf.append(params[l]); 111 sbuf.append(params[l]);
112 i = j + 2; 112 i = j + 2;
113 } 113 }
@@ -115,7 +115,7 @@ public class ServiceExceptionUtil { @@ -115,7 +115,7 @@ public class ServiceExceptionUtil {
115 if (messagePattern.indexOf("{}", i) != -1) { 115 if (messagePattern.indexOf("{}", i) != -1) {
116 LOGGER.error("[doFormat][参数过少:错误码({})|错误内容({})|参数({})", code, messagePattern, params); 116 LOGGER.error("[doFormat][参数过少:错误码({})|错误内容({})|参数({})", code, messagePattern, params);
117 } 117 }
118 - sbuf.append(messagePattern.substring(i, messagePattern.length())); 118 + sbuf.append(messagePattern.substring(i));
119 return sbuf.toString(); 119 return sbuf.toString();
120 } 120 }
121 121
src/main/java/cn/iocoder/dashboard/framework/excel/core/util/ExcelUtils.java
@@ -2,6 +2,7 @@ package cn.iocoder.dashboard.framework.excel.core.util; @@ -2,6 +2,7 @@ package cn.iocoder.dashboard.framework.excel.core.util;
2 2
3 import com.alibaba.excel.EasyExcel; 3 import com.alibaba.excel.EasyExcel;
4 import com.alibaba.excel.write.style.column.LongestMatchColumnWidthStyleStrategy; 4 import com.alibaba.excel.write.style.column.LongestMatchColumnWidthStyleStrategy;
  5 +import org.springframework.web.multipart.MultipartFile;
5 6
6 import javax.servlet.http.HttpServletResponse; 7 import javax.servlet.http.HttpServletResponse;
7 import java.io.IOException; 8 import java.io.IOException;
@@ -38,4 +39,10 @@ public class ExcelUtils { @@ -38,4 +39,10 @@ public class ExcelUtils {
38 response.setContentType("application/vnd.ms-excel;charset=UTF-8"); 39 response.setContentType("application/vnd.ms-excel;charset=UTF-8");
39 } 40 }
40 41
  42 + public static <T> List<T> raed(MultipartFile file, Class<T> head) throws IOException {
  43 + return EasyExcel.read(file.getInputStream(), head, null)
  44 + .autoCloseStream(false) // 不要自动关闭,交给 Servlet 自己处理
  45 + .doReadAllSync();
  46 + }
  47 +
41 } 48 }
src/main/java/cn/iocoder/dashboard/modules/system/controller/user/SysUserController.java
1 package cn.iocoder.dashboard.modules.system.controller.user; 1 package cn.iocoder.dashboard.modules.system.controller.user;
2 2
3 import cn.hutool.core.collection.CollUtil; 3 import cn.hutool.core.collection.CollUtil;
  4 +import cn.iocoder.dashboard.common.enums.CommonStatusEnum;
4 import cn.iocoder.dashboard.common.pojo.CommonResult; 5 import cn.iocoder.dashboard.common.pojo.CommonResult;
5 import cn.iocoder.dashboard.common.pojo.PageResult; 6 import cn.iocoder.dashboard.common.pojo.PageResult;
6 import cn.iocoder.dashboard.framework.excel.core.util.ExcelUtils; 7 import cn.iocoder.dashboard.framework.excel.core.util.ExcelUtils;
@@ -8,23 +9,23 @@ import cn.iocoder.dashboard.modules.system.controller.user.vo.user.*; @@ -8,23 +9,23 @@ import cn.iocoder.dashboard.modules.system.controller.user.vo.user.*;
8 import cn.iocoder.dashboard.modules.system.convert.user.SysUserConvert; 9 import cn.iocoder.dashboard.modules.system.convert.user.SysUserConvert;
9 import cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.dept.SysDeptDO; 10 import cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.dept.SysDeptDO;
10 import cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.user.SysUserDO; 11 import cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.user.SysUserDO;
  12 +import cn.iocoder.dashboard.modules.system.enums.common.SysSexEnum;
11 import cn.iocoder.dashboard.modules.system.service.dept.SysDeptService; 13 import cn.iocoder.dashboard.modules.system.service.dept.SysDeptService;
12 import cn.iocoder.dashboard.modules.system.service.user.SysUserService; 14 import cn.iocoder.dashboard.modules.system.service.user.SysUserService;
13 import cn.iocoder.dashboard.util.collection.CollectionUtils; 15 import cn.iocoder.dashboard.util.collection.CollectionUtils;
14 import cn.iocoder.dashboard.util.collection.MapUtils; 16 import cn.iocoder.dashboard.util.collection.MapUtils;
15 import io.swagger.annotations.Api; 17 import io.swagger.annotations.Api;
16 import io.swagger.annotations.ApiImplicitParam; 18 import io.swagger.annotations.ApiImplicitParam;
  19 +import io.swagger.annotations.ApiImplicitParams;
17 import io.swagger.annotations.ApiOperation; 20 import io.swagger.annotations.ApiOperation;
18 import org.springframework.validation.annotation.Validated; 21 import org.springframework.validation.annotation.Validated;
19 import org.springframework.web.bind.annotation.*; 22 import org.springframework.web.bind.annotation.*;
  23 +import org.springframework.web.multipart.MultipartFile;
20 24
21 import javax.annotation.Resource; 25 import javax.annotation.Resource;
22 import javax.servlet.http.HttpServletResponse; 26 import javax.servlet.http.HttpServletResponse;
23 import java.io.IOException; 27 import java.io.IOException;
24 -import java.util.ArrayList;  
25 -import java.util.Collection;  
26 -import java.util.List;  
27 -import java.util.Map; 28 +import java.util.*;
28 29
29 import static cn.iocoder.dashboard.common.pojo.CommonResult.success; 30 import static cn.iocoder.dashboard.common.pojo.CommonResult.success;
30 31
@@ -145,35 +146,35 @@ public class SysUserController { @@ -145,35 +146,35 @@ public class SysUserController {
145 SysUserExcelVO.class, excelUsers); 146 SysUserExcelVO.class, excelUsers);
146 } 147 }
147 148
148 -// @Log(title = "用户管理", businessType = BusinessType.EXPORT)  
149 -// @PreAuthorize("@ss.hasPermi('system:user:export')")  
150 -// @GetMapping("/export")  
151 -// public AjaxResult export(SysUser user)  
152 -// {  
153 -// List<SysUser> list = userService.selectUserList(user);  
154 -// ExcelUtil<SysUser> util = new ExcelUtil<SysUser>(SysUser.class);  
155 -// return util.exportExcel(list, "用户数据");  
156 -// }  
157 -// 149 + @ApiOperation("获得导入用户模板")
  150 + @GetMapping("/get-import-template")
  151 + public void importTemplate(HttpServletResponse response) throws IOException {
  152 + // 手动创建导出 demo
  153 + List<SysUserImportExcelVO> list = Arrays.asList(
  154 + SysUserImportExcelVO.builder().username("yudao").deptId(1L).email("yudao@iocoder.cn").mobile("15601691300")
  155 + .nickname("芋道").status(CommonStatusEnum.ENABLE.getStatus()).sex(SysSexEnum.MALE.getSEX()).build(),
  156 + SysUserImportExcelVO.builder().username("yuanma").deptId(2L).email("yuanma@iocoder.cn").mobile("15601701300")
  157 + .nickname("源码").status(CommonStatusEnum.DISABLE.getStatus()).sex(SysSexEnum.FEMALE.getSEX()).build()
  158 + );
  159 +
  160 + // 输出
  161 + ExcelUtils.write(response, "用户导入模板.xls", "用户列表",
  162 + SysUserImportExcelVO.class, list);
  163 +
  164 + }
  165 +
  166 + @ApiOperation("导入用户")
  167 + @ApiImplicitParams({
  168 + @ApiImplicitParam(name = "path", value = "Excel 文件", required = true, dataTypeClass = MultipartFile.class),
  169 + @ApiImplicitParam(name = "update-support", value = "是否支持更新,默认为 false", example = "true", dataTypeClass = Long.class)
  170 + })
  171 + @PostMapping("/import")
158 // @Log(title = "用户管理", businessType = BusinessType.IMPORT) 172 // @Log(title = "用户管理", businessType = BusinessType.IMPORT)
159 // @PreAuthorize("@ss.hasPermi('system:user:import')") 173 // @PreAuthorize("@ss.hasPermi('system:user:import')")
160 -// @PostMapping("/importData")  
161 -// public AjaxResult importData(MultipartFile file, boolean updateSupport) throws Exception  
162 -// {  
163 -// ExcelUtil<SysUser> util = new ExcelUtil<SysUser>(SysUser.class);  
164 -// List<SysUser> userList = util.importExcel(file.getInputStream());  
165 -// LoginUser loginUser = tokenService.getLoginUser(ServletUtils.getRequest());  
166 -// String operName = loginUser.getUsername();  
167 -// String message = userService.importUser(userList, updateSupport, operName);  
168 -// return AjaxResult.success(message);  
169 -// }  
170 -//  
171 -// @GetMapping("/importTemplate")  
172 -// public AjaxResult importTemplate()  
173 -// {  
174 -// ExcelUtil<SysUser> util = new ExcelUtil<SysUser>(SysUser.class);  
175 -// return util.importTemplateExcel("用户数据");  
176 -// }  
177 -// 174 + public CommonResult<SysUserImportRespVO> importExcel(@RequestParam("file") MultipartFile file,
  175 + @RequestParam(value = "updateSupport", required = false, defaultValue = "false") Boolean updateSupport) throws Exception {
  176 + List<SysUserImportExcelVO> list = ExcelUtils.raed(file, SysUserImportExcelVO.class);
  177 + return success(userService.importUsers(list, updateSupport));
  178 + }
178 179
179 } 180 }
src/main/java/cn/iocoder/dashboard/modules/system/controller/user/vo/user/SysUserImportExcelVO.java
@@ -4,12 +4,18 @@ import cn.iocoder.dashboard.framework.excel.core.annotations.DictFormat; @@ -4,12 +4,18 @@ import cn.iocoder.dashboard.framework.excel.core.annotations.DictFormat;
4 import cn.iocoder.dashboard.framework.excel.core.convert.DictConvert; 4 import cn.iocoder.dashboard.framework.excel.core.convert.DictConvert;
5 import cn.iocoder.dashboard.modules.system.enums.dict.DictTypeEnum; 5 import cn.iocoder.dashboard.modules.system.enums.dict.DictTypeEnum;
6 import com.alibaba.excel.annotation.ExcelProperty; 6 import com.alibaba.excel.annotation.ExcelProperty;
  7 +import lombok.AllArgsConstructor;
  8 +import lombok.Builder;
7 import lombok.Data; 9 import lombok.Data;
  10 +import lombok.NoArgsConstructor;
8 11
9 /** 12 /**
10 * 用户 Excel 导入 VO 13 * 用户 Excel 导入 VO
11 */ 14 */
12 @Data 15 @Data
  16 +@Builder
  17 +@AllArgsConstructor
  18 +@NoArgsConstructor
13 public class SysUserImportExcelVO { 19 public class SysUserImportExcelVO {
14 20
15 @ExcelProperty("登录名称") 21 @ExcelProperty("登录名称")
@@ -29,7 +35,7 @@ public class SysUserImportExcelVO { @@ -29,7 +35,7 @@ public class SysUserImportExcelVO {
29 35
30 @ExcelProperty(value = "用户性别", converter = DictConvert.class) 36 @ExcelProperty(value = "用户性别", converter = DictConvert.class)
31 @DictFormat(DictTypeEnum.SYS_USER_SEX) 37 @DictFormat(DictTypeEnum.SYS_USER_SEX)
32 - private String sex; 38 + private Integer sex;
33 39
34 @ExcelProperty(value = "账号状态", converter = DictConvert.class) 40 @ExcelProperty(value = "账号状态", converter = DictConvert.class)
35 @DictFormat(DictTypeEnum.SYS_COMMON_STATUS) 41 @DictFormat(DictTypeEnum.SYS_COMMON_STATUS)
src/main/java/cn/iocoder/dashboard/modules/system/controller/user/vo/user/SysUserImportRespVO.java 0 → 100644
  1 +package cn.iocoder.dashboard.modules.system.controller.user.vo.user;
  2 +
  3 +import io.swagger.annotations.ApiModel;
  4 +import io.swagger.annotations.ApiModelProperty;
  5 +import lombok.Builder;
  6 +import lombok.Data;
  7 +
  8 +import java.util.List;
  9 +import java.util.Map;
  10 +
  11 +@ApiModel("用户导入 Response VO")
  12 +@Data
  13 +@Builder
  14 +public class SysUserImportRespVO {
  15 +
  16 + @ApiModelProperty(value = "创建成功的用户名数组", required = true)
  17 + private List<String> createUsernames;
  18 +
  19 + @ApiModelProperty(value = "更新成功的用户名数组", required = true)
  20 + private List<String> updateUsernames;
  21 +
  22 + @ApiModelProperty(value = "导入失败的用户集合", required = true, notes = "key 为用户名,value 为失败原因")
  23 + private Map<String, String> failureUsernames;
  24 +
  25 +}
src/main/java/cn/iocoder/dashboard/modules/system/controller/user/vo/user/SysUserRespVO.java
@@ -2,10 +2,7 @@ package cn.iocoder.dashboard.modules.system.controller.user.vo.user; @@ -2,10 +2,7 @@ package cn.iocoder.dashboard.modules.system.controller.user.vo.user;
2 2
3 import io.swagger.annotations.ApiModel; 3 import io.swagger.annotations.ApiModel;
4 import io.swagger.annotations.ApiModelProperty; 4 import io.swagger.annotations.ApiModelProperty;
5 -import lombok.AllArgsConstructor;  
6 -import lombok.Data;  
7 -import lombok.EqualsAndHashCode;  
8 -import lombok.NoArgsConstructor; 5 +import lombok.*;
9 6
10 import java.util.Date; 7 import java.util.Date;
11 8
src/main/java/cn/iocoder/dashboard/modules/system/convert/user/SysUserConvert.java
1 package cn.iocoder.dashboard.modules.system.convert.user; 1 package cn.iocoder.dashboard.modules.system.convert.user;
2 2
3 import cn.iocoder.dashboard.common.pojo.PageResult; 3 import cn.iocoder.dashboard.common.pojo.PageResult;
4 -import cn.iocoder.dashboard.modules.system.controller.user.vo.user.SysUserCreateReqVO;  
5 -import cn.iocoder.dashboard.modules.system.controller.user.vo.user.SysUserExcelVO;  
6 -import cn.iocoder.dashboard.modules.system.controller.user.vo.user.SysUserPageItemRespVO;  
7 -import cn.iocoder.dashboard.modules.system.controller.user.vo.user.SysUserUpdateReqVO; 4 +import cn.iocoder.dashboard.modules.system.controller.user.vo.user.*;
8 import cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.dept.SysDeptDO; 5 import cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.dept.SysDeptDO;
9 import cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.user.SysUserDO; 6 import cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.user.SysUserDO;
10 import com.baomidou.mybatisplus.core.metadata.IPage; 7 import com.baomidou.mybatisplus.core.metadata.IPage;
@@ -30,4 +27,6 @@ public interface SysUserConvert { @@ -30,4 +27,6 @@ public interface SysUserConvert {
30 27
31 SysUserExcelVO convert02(SysUserDO bean); 28 SysUserExcelVO convert02(SysUserDO bean);
32 29
  30 + SysUserDO convert(SysUserImportExcelVO bean);
  31 +
33 } 32 }
src/main/java/cn/iocoder/dashboard/modules/system/enums/SysErrorCodeConstants.java
@@ -37,6 +37,7 @@ public interface SysErrorCodeConstants { @@ -37,6 +37,7 @@ public interface SysErrorCodeConstants {
37 ErrorCode USER_MOBILE_EXISTS = new ErrorCode(1002004001, "手机号已经存在"); 37 ErrorCode USER_MOBILE_EXISTS = new ErrorCode(1002004001, "手机号已经存在");
38 ErrorCode USER_EMAIL_EXISTS = new ErrorCode(1002004002, "邮箱已经存在"); 38 ErrorCode USER_EMAIL_EXISTS = new ErrorCode(1002004002, "邮箱已经存在");
39 ErrorCode USER_NOT_EXISTS = new ErrorCode(1002004003, "用户不存在"); 39 ErrorCode USER_NOT_EXISTS = new ErrorCode(1002004003, "用户不存在");
  40 + ErrorCode USER_IMPORT_LIST_IS_EMPTY = new ErrorCode(1002004004, "导入用户数据不能为空!");
40 41
41 // ========== 部门模块 1002005000 ========== 42 // ========== 部门模块 1002005000 ==========
42 ErrorCode DEPT_NAME_DUPLICATE = new ErrorCode(1002004001, "已经存在该名字的部门"); 43 ErrorCode DEPT_NAME_DUPLICATE = new ErrorCode(1002004001, "已经存在该名字的部门");
src/main/java/cn/iocoder/dashboard/modules/system/service/user/SysUserService.java
1 package cn.iocoder.dashboard.modules.system.service.user; 1 package cn.iocoder.dashboard.modules.system.service.user;
2 2
3 import cn.iocoder.dashboard.common.pojo.PageResult; 3 import cn.iocoder.dashboard.common.pojo.PageResult;
4 -import cn.iocoder.dashboard.modules.system.controller.user.vo.user.SysUserCreateReqVO;  
5 -import cn.iocoder.dashboard.modules.system.controller.user.vo.user.SysUserExportReqVO;  
6 -import cn.iocoder.dashboard.modules.system.controller.user.vo.user.SysUserPageReqVO;  
7 -import cn.iocoder.dashboard.modules.system.controller.user.vo.user.SysUserUpdateReqVO; 4 +import cn.iocoder.dashboard.modules.system.controller.user.vo.user.*;
8 import cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.user.SysUserDO; 5 import cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.user.SysUserDO;
9 6
10 import java.util.List; 7 import java.util.List;
@@ -86,6 +83,15 @@ public interface SysUserService { @@ -86,6 +83,15 @@ public interface SysUserService {
86 */ 83 */
87 void updateUserStatus(Long id, Integer status); 84 void updateUserStatus(Long id, Integer status);
88 85
  86 + /**
  87 + * 批量导入用户
  88 + *
  89 + * @param importUsers 导入用户列表
  90 + * @param isUpdateSupport 是否支持更新
  91 + * @return 导入结果
  92 + */
  93 + SysUserImportRespVO importUsers(List<SysUserImportExcelVO> importUsers, boolean isUpdateSupport);
  94 +
89 // 95 //
90 // /** 96 // /**
91 // * 修改用户基本信息 97 // * 修改用户基本信息
@@ -121,14 +127,4 @@ public interface SysUserService { @@ -121,14 +127,4 @@ public interface SysUserService {
121 // */ 127 // */
122 // public int resetUserPwd(String userName, String password); 128 // public int resetUserPwd(String userName, String password);
123 129
124 -//  
125 -// /**  
126 -// * 导入用户数据  
127 -// *  
128 -// * @param userList 用户数据列表  
129 -// * @param isUpdateSupport 是否更新支持,如果已存在,则进行更新数据  
130 -// * @param operName 操作用户  
131 -// * @return 结果  
132 -// */  
133 -// public String importUser(List<SysUser> userList, Boolean isUpdateSupport, String operName);  
134 } 130 }
src/main/java/cn/iocoder/dashboard/modules/system/service/user/SysUserServiceImpl.java
@@ -3,12 +3,10 @@ package cn.iocoder.dashboard.modules.system.service.user; @@ -3,12 +3,10 @@ package cn.iocoder.dashboard.modules.system.service.user;
3 import cn.hutool.core.collection.CollUtil; 3 import cn.hutool.core.collection.CollUtil;
4 import cn.hutool.core.util.StrUtil; 4 import cn.hutool.core.util.StrUtil;
5 import cn.iocoder.dashboard.common.enums.CommonStatusEnum; 5 import cn.iocoder.dashboard.common.enums.CommonStatusEnum;
  6 +import cn.iocoder.dashboard.common.exception.ServiceException;
6 import cn.iocoder.dashboard.common.exception.util.ServiceExceptionUtil; 7 import cn.iocoder.dashboard.common.exception.util.ServiceExceptionUtil;
7 import cn.iocoder.dashboard.common.pojo.PageResult; 8 import cn.iocoder.dashboard.common.pojo.PageResult;
8 -import cn.iocoder.dashboard.modules.system.controller.user.vo.user.SysUserCreateReqVO;  
9 -import cn.iocoder.dashboard.modules.system.controller.user.vo.user.SysUserExportReqVO;  
10 -import cn.iocoder.dashboard.modules.system.controller.user.vo.user.SysUserPageReqVO;  
11 -import cn.iocoder.dashboard.modules.system.controller.user.vo.user.SysUserUpdateReqVO; 9 +import cn.iocoder.dashboard.modules.system.controller.user.vo.user.*;
12 import cn.iocoder.dashboard.modules.system.convert.user.SysUserConvert; 10 import cn.iocoder.dashboard.modules.system.convert.user.SysUserConvert;
13 import cn.iocoder.dashboard.modules.system.dal.mysql.dao.user.SysUserMapper; 11 import cn.iocoder.dashboard.modules.system.dal.mysql.dao.user.SysUserMapper;
14 import cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.dept.SysDeptDO; 12 import cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.dept.SysDeptDO;
@@ -21,12 +19,10 @@ import cn.iocoder.dashboard.util.collection.CollectionUtils; @@ -21,12 +19,10 @@ import cn.iocoder.dashboard.util.collection.CollectionUtils;
21 import lombok.extern.slf4j.Slf4j; 19 import lombok.extern.slf4j.Slf4j;
22 import org.springframework.security.crypto.password.PasswordEncoder; 20 import org.springframework.security.crypto.password.PasswordEncoder;
23 import org.springframework.stereotype.Service; 21 import org.springframework.stereotype.Service;
  22 +import org.springframework.transaction.annotation.Transactional;
24 23
25 import javax.annotation.Resource; 24 import javax.annotation.Resource;
26 -import java.util.Collections;  
27 -import java.util.List;  
28 -import java.util.Map;  
29 -import java.util.Set; 25 +import java.util.*;
30 26
31 import static cn.iocoder.dashboard.modules.system.enums.SysErrorCodeConstants.*; 27 import static cn.iocoder.dashboard.modules.system.enums.SysErrorCodeConstants.*;
32 28
@@ -268,71 +264,42 @@ public class SysUserServiceImpl implements SysUserService { @@ -268,71 +264,42 @@ public class SysUserServiceImpl implements SysUserService {
268 }); 264 });
269 } 265 }
270 266
271 -// /**  
272 -// * 导入用户数据  
273 -// *  
274 -// * @param userList 用户数据列表  
275 -// * @param isUpdateSupport 是否更新支持,如果已存在,则进行更新数据  
276 -// * @param operName 操作用户  
277 -// * @return 结果  
278 -// */  
279 -// @Override  
280 -// public String importUser(List<SysUser> userList, Boolean isUpdateSupport, String operName)  
281 -// {  
282 -// if (StringUtils.isNull(userList) || userList.size() == 0)  
283 -// {  
284 -// throw new CustomException("导入用户数据不能为空!");  
285 -// }  
286 -// int successNum = 0;  
287 -// int failureNum = 0;  
288 -// StringBuilder successMsg = new StringBuilder();  
289 -// StringBuilder failureMsg = new StringBuilder();  
290 -// String password = configService.selectConfigByKey("sys.user.initPassword");  
291 -// for (SysUser user : userList)  
292 -// {  
293 -// try  
294 -// {  
295 -// // 验证是否存在这个用户  
296 -// SysUser u = userMapper.selectUserByUserName(user.getUserName());  
297 -// if (StringUtils.isNull(u))  
298 -// {  
299 -// user.setPassword(SecurityUtils.encryptPassword(password));  
300 -// user.setCreateBy(operName);  
301 -// this.insertUser(user);  
302 -// successNum++;  
303 -// successMsg.append("<br/>" + successNum + "、账号 " + user.getUserName() + " 导入成功");  
304 -// }  
305 -// else if (isUpdateSupport)  
306 -// {  
307 -// user.setUpdateBy(operName);  
308 -// this.updateUser(user);  
309 -// successNum++;  
310 -// successMsg.append("<br/>" + successNum + "、账号 " + user.getUserName() + " 更新成功");  
311 -// }  
312 -// else  
313 -// {  
314 -// failureNum++;  
315 -// failureMsg.append("<br/>" + failureNum + "、账号 " + user.getUserName() + " 已存在");  
316 -// }  
317 -// }  
318 -// catch (Exception e)  
319 -// {  
320 -// failureNum++;  
321 -// String msg = "<br/>" + failureNum + "、账号 " + user.getUserName() + " 导入失败:";  
322 -// failureMsg.append(msg + e.getMessage());  
323 -// log.error(msg, e);  
324 -// }  
325 -// }  
326 -// if (failureNum > 0)  
327 -// {  
328 -// failureMsg.insert(0, "很抱歉,导入失败!共 " + failureNum + " 条数据格式不正确,错误如下:");  
329 -// throw new CustomException(failureMsg.toString());  
330 -// }  
331 -// else  
332 -// {  
333 -// successMsg.insert(0, "恭喜您,数据已全部导入成功!共 " + successNum + " 条,数据如下:");  
334 -// }  
335 -// return successMsg.toString();  
336 -// } 267 + @Override
  268 + @Transactional // 添加事务,异常则回滚所有导入
  269 + public SysUserImportRespVO importUsers(List<SysUserImportExcelVO> importUsers, boolean isUpdateSupport) {
  270 + if (CollUtil.isEmpty(importUsers)) {
  271 + throw ServiceExceptionUtil.exception(USER_IMPORT_LIST_IS_EMPTY);
  272 + }
  273 + SysUserImportRespVO respVO = SysUserImportRespVO.builder().createUsernames(new ArrayList<>())
  274 + .updateUsernames(new ArrayList<>()).failureUsernames(new LinkedHashMap<>()).build();
  275 + importUsers.forEach(importUser -> {
  276 + // 校验,判断是否有不符合的原因
  277 + try {
  278 + checkCreateOrUpdate(null, null, importUser.getMobile(), importUser.getEmail(),
  279 + importUser.getDeptId(), null);
  280 + } catch (ServiceException ex) {
  281 + respVO.getFailureUsernames().put(importUser.getUsername(), ex.getMessage());
  282 + return;
  283 + }
  284 + // 判断如果不存在,在进行插入
  285 + SysUserDO existUser = userMapper.selectByUsername(importUser.getUsername());
  286 + if (existUser == null) {
  287 + // TODO 芋艿:初始密码
  288 + userMapper.insert(SysUserConvert.INSTANCE.convert(importUser));
  289 + respVO.getCreateUsernames().add(importUser.getUsername());
  290 + return;
  291 + }
  292 + // 如果存在,判断是否允许更新
  293 + if (!isUpdateSupport) {
  294 + respVO.getFailureUsernames().put(importUser.getUsername(), USER_USERNAME_EXISTS.getMessage());
  295 + return;
  296 + }
  297 + SysUserDO updateUser = SysUserConvert.INSTANCE.convert(importUser);
  298 + updateUser.setId(existUser.getId());
  299 + userMapper.updateById(updateUser);
  300 + respVO.getUpdateUsernames().add(importUser.getUsername());
  301 + });
  302 + return respVO;
  303 + }
337 304
338 } 305 }