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 122 // 下载用户导入模板
123 123 export function importTemplate() {
124 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 391 // 设置上传的请求头部
392 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 397 queryParams: {
... ... @@ -669,7 +669,7 @@ export default {
669 669 /** 下载模板操作 */
670 670 importTemplate() {
671 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 681 this.upload.open = false;
682 682 this.upload.isUploading = false;
683 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 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 47 return this;
48 48 }
49 49  
  50 + @Override
50 51 public String getMessage() {
51 52 return message;
52 53 }
... ...
src/main/java/cn/iocoder/dashboard/common/exception/util/ServiceExceptionUtil.java
... ... @@ -103,11 +103,11 @@ public class ServiceExceptionUtil {
103 103 if (i == 0) {
104 104 return messagePattern;
105 105 } else {
106   - sbuf.append(messagePattern.substring(i, messagePattern.length()));
  106 + sbuf.append(messagePattern.substring(i));
107 107 return sbuf.toString();
108 108 }
109 109 } else {
110   - sbuf.append(messagePattern.substring(i, j));
  110 + sbuf.append(messagePattern, i, j);
111 111 sbuf.append(params[l]);
112 112 i = j + 2;
113 113 }
... ... @@ -115,7 +115,7 @@ public class ServiceExceptionUtil {
115 115 if (messagePattern.indexOf("{}", i) != -1) {
116 116 LOGGER.error("[doFormat][参数过少:错误码({})|错误内容({})|参数({})", code, messagePattern, params);
117 117 }
118   - sbuf.append(messagePattern.substring(i, messagePattern.length()));
  118 + sbuf.append(messagePattern.substring(i));
119 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 2  
3 3 import com.alibaba.excel.EasyExcel;
4 4 import com.alibaba.excel.write.style.column.LongestMatchColumnWidthStyleStrategy;
  5 +import org.springframework.web.multipart.MultipartFile;
5 6  
6 7 import javax.servlet.http.HttpServletResponse;
7 8 import java.io.IOException;
... ... @@ -38,4 +39,10 @@ public class ExcelUtils {
38 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 1 package cn.iocoder.dashboard.modules.system.controller.user;
2 2  
3 3 import cn.hutool.core.collection.CollUtil;
  4 +import cn.iocoder.dashboard.common.enums.CommonStatusEnum;
4 5 import cn.iocoder.dashboard.common.pojo.CommonResult;
5 6 import cn.iocoder.dashboard.common.pojo.PageResult;
6 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 9 import cn.iocoder.dashboard.modules.system.convert.user.SysUserConvert;
9 10 import cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.dept.SysDeptDO;
10 11 import cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.user.SysUserDO;
  12 +import cn.iocoder.dashboard.modules.system.enums.common.SysSexEnum;
11 13 import cn.iocoder.dashboard.modules.system.service.dept.SysDeptService;
12 14 import cn.iocoder.dashboard.modules.system.service.user.SysUserService;
13 15 import cn.iocoder.dashboard.util.collection.CollectionUtils;
14 16 import cn.iocoder.dashboard.util.collection.MapUtils;
15 17 import io.swagger.annotations.Api;
16 18 import io.swagger.annotations.ApiImplicitParam;
  19 +import io.swagger.annotations.ApiImplicitParams;
17 20 import io.swagger.annotations.ApiOperation;
18 21 import org.springframework.validation.annotation.Validated;
19 22 import org.springframework.web.bind.annotation.*;
  23 +import org.springframework.web.multipart.MultipartFile;
20 24  
21 25 import javax.annotation.Resource;
22 26 import javax.servlet.http.HttpServletResponse;
23 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 30 import static cn.iocoder.dashboard.common.pojo.CommonResult.success;
30 31  
... ... @@ -145,35 +146,35 @@ public class SysUserController {
145 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 172 // @Log(title = "用户管理", businessType = BusinessType.IMPORT)
159 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 4 import cn.iocoder.dashboard.framework.excel.core.convert.DictConvert;
5 5 import cn.iocoder.dashboard.modules.system.enums.dict.DictTypeEnum;
6 6 import com.alibaba.excel.annotation.ExcelProperty;
  7 +import lombok.AllArgsConstructor;
  8 +import lombok.Builder;
7 9 import lombok.Data;
  10 +import lombok.NoArgsConstructor;
8 11  
9 12 /**
10 13 * 用户 Excel 导入 VO
11 14 */
12 15 @Data
  16 +@Builder
  17 +@AllArgsConstructor
  18 +@NoArgsConstructor
13 19 public class SysUserImportExcelVO {
14 20  
15 21 @ExcelProperty("登录名称")
... ... @@ -29,7 +35,7 @@ public class SysUserImportExcelVO {
29 35  
30 36 @ExcelProperty(value = "用户性别", converter = DictConvert.class)
31 37 @DictFormat(DictTypeEnum.SYS_USER_SEX)
32   - private String sex;
  38 + private Integer sex;
33 39  
34 40 @ExcelProperty(value = "账号状态", converter = DictConvert.class)
35 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 2  
3 3 import io.swagger.annotations.ApiModel;
4 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 7 import java.util.Date;
11 8  
... ...
src/main/java/cn/iocoder/dashboard/modules/system/convert/user/SysUserConvert.java
1 1 package cn.iocoder.dashboard.modules.system.convert.user;
2 2  
3 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 5 import cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.dept.SysDeptDO;
9 6 import cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.user.SysUserDO;
10 7 import com.baomidou.mybatisplus.core.metadata.IPage;
... ... @@ -30,4 +27,6 @@ public interface SysUserConvert {
30 27  
31 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 37 ErrorCode USER_MOBILE_EXISTS = new ErrorCode(1002004001, "手机号已经存在");
38 38 ErrorCode USER_EMAIL_EXISTS = new ErrorCode(1002004002, "邮箱已经存在");
39 39 ErrorCode USER_NOT_EXISTS = new ErrorCode(1002004003, "用户不存在");
  40 + ErrorCode USER_IMPORT_LIST_IS_EMPTY = new ErrorCode(1002004004, "导入用户数据不能为空!");
40 41  
41 42 // ========== 部门模块 1002005000 ==========
42 43 ErrorCode DEPT_NAME_DUPLICATE = new ErrorCode(1002004001, "已经存在该名字的部门");
... ...
src/main/java/cn/iocoder/dashboard/modules/system/service/user/SysUserService.java
1 1 package cn.iocoder.dashboard.modules.system.service.user;
2 2  
3 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 5 import cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.user.SysUserDO;
9 6  
10 7 import java.util.List;
... ... @@ -86,6 +83,15 @@ public interface SysUserService {
86 83 */
87 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 127 // */
122 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 3 import cn.hutool.core.collection.CollUtil;
4 4 import cn.hutool.core.util.StrUtil;
5 5 import cn.iocoder.dashboard.common.enums.CommonStatusEnum;
  6 +import cn.iocoder.dashboard.common.exception.ServiceException;
6 7 import cn.iocoder.dashboard.common.exception.util.ServiceExceptionUtil;
7 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 10 import cn.iocoder.dashboard.modules.system.convert.user.SysUserConvert;
13 11 import cn.iocoder.dashboard.modules.system.dal.mysql.dao.user.SysUserMapper;
14 12 import cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.dept.SysDeptDO;
... ... @@ -21,12 +19,10 @@ import cn.iocoder.dashboard.util.collection.CollectionUtils;
21 19 import lombok.extern.slf4j.Slf4j;
22 20 import org.springframework.security.crypto.password.PasswordEncoder;
23 21 import org.springframework.stereotype.Service;
  22 +import org.springframework.transaction.annotation.Transactional;
24 23  
25 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 27 import static cn.iocoder.dashboard.modules.system.enums.SysErrorCodeConstants.*;
32 28  
... ... @@ -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 }
... ...