Commit 4ab1cf1cd477e8ba85f0765e9923ea85ea2b4d27
1 parent
c3df5bc6
1. 完成用户导入的功能
Showing
13 changed files
with
152 additions
and
137 deletions
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 /> ' + username; | |
| 689 | + } | |
| 690 | + text += '<br />更新成功数量:' + data.updateUsernames.length; | |
| 691 | + for (const username of data.updateUsernames) { | |
| 692 | + text += '<br /> ' + username; | |
| 693 | + } | |
| 694 | + text += '<br />更新失败数量:' + Object.keys(data.failureUsernames).length; | |
| 695 | + for (const username in data.failureUsernames) { | |
| 696 | + text += '<br /> ' + 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
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 | } | ... | ... |