diff --git a/src/main/java/com/youlai/system/common/util/ExcelUtils.java b/src/main/java/com/youlai/system/common/util/ExcelUtils.java index f107230b..d9ba301c 100644 --- a/src/main/java/com/youlai/system/common/util/ExcelUtils.java +++ b/src/main/java/com/youlai/system/common/util/ExcelUtils.java @@ -1,7 +1,6 @@ package com.youlai.system.common.util; import com.alibaba.excel.EasyExcel; -import com.youlai.system.framework.easyexcel.ExcelResult; import com.youlai.system.framework.easyexcel.MyAnalysisEventListener; import java.io.InputStream; @@ -14,11 +13,9 @@ import java.io.InputStream; */ public class ExcelUtils { - public static ExcelResult importExcel(InputStream is, Class clazz, MyAnalysisEventListener listener) { + public static String importExcel(InputStream is, Class clazz, MyAnalysisEventListener listener) { EasyExcel.read(is, clazz, listener).sheet().doRead(); - ExcelResult excelResult = listener.getResult(); - return excelResult; + String msg = listener.getMsg(); + return msg; } - - } diff --git a/src/main/java/com/youlai/system/controller/SysUserController.java b/src/main/java/com/youlai/system/controller/SysUserController.java index 6586e07b..d8abb02d 100644 --- a/src/main/java/com/youlai/system/controller/SysUserController.java +++ b/src/main/java/com/youlai/system/controller/SysUserController.java @@ -7,7 +7,6 @@ import com.baomidou.mybatisplus.core.metadata.IPage; import com.youlai.system.common.result.PageResult; import com.youlai.system.common.result.Result; import com.youlai.system.common.util.ExcelUtils; -import com.youlai.system.framework.easyexcel.ExcelResult; import com.youlai.system.listener.UserImportListener; import com.youlai.system.pojo.vo.UserImportVO; import com.youlai.system.pojo.form.UserForm; @@ -149,8 +148,8 @@ public class SysUserController { @PostMapping("/_import") public Result importUsers(@Parameter(name = "部门ID") Long deptId, MultipartFile file) throws IOException { UserImportListener listener = new UserImportListener(deptId); - ExcelResult excelResult = ExcelUtils.importExcel(file.getInputStream(), UserImportVO.class, listener); - return Result.success(excelResult.getMsg()); + String msg = ExcelUtils.importExcel(file.getInputStream(), UserImportVO.class, listener); + return Result.success(msg); } @Operation(summary = "导出用户") diff --git a/src/main/java/com/youlai/system/converter/UserConverter.java b/src/main/java/com/youlai/system/converter/UserConverter.java index 7bdd02ec..7dbb7bcb 100644 --- a/src/main/java/com/youlai/system/converter/UserConverter.java +++ b/src/main/java/com/youlai/system/converter/UserConverter.java @@ -5,6 +5,7 @@ import com.youlai.system.pojo.bo.UserBO; import com.youlai.system.pojo.entity.SysUser; import com.youlai.system.pojo.form.UserForm; import com.youlai.system.pojo.bo.UserFormBO; +import com.youlai.system.pojo.vo.UserImportVO; import com.youlai.system.pojo.vo.UserInfoVO; import com.youlai.system.pojo.vo.UserPageVO; import org.mapstruct.InheritInverseConfiguration; @@ -22,13 +23,13 @@ import org.mapstruct.Mappings; public interface UserConverter { @Mappings({ - @Mapping(target = "genderLabel", expression = "java(com.youlai.system.common.base.IBaseEnum.getLabelByValue(po.getGender(), com.youlai.system.common.enums.GenderEnum.class))") + @Mapping(target = "genderLabel", expression = "java(com.youlai.system.common.base.IBaseEnum.getLabelByValue(bo.getGender(), com.youlai.system.common.enums.GenderEnum.class))") }) - UserPageVO po2Vo(UserBO po); + UserPageVO bo2Vo(UserBO bo); - Page po2Vo(Page po); + Page bo2Vo(Page bo); - UserForm po2Form(UserFormBO po); + UserForm bo2Form(UserFormBO bo); UserForm entity2Form(SysUser entity); @@ -38,7 +39,8 @@ public interface UserConverter { @Mappings({ @Mapping(target = "userId", source = "id") }) - UserInfoVO entity2LoginUser(SysUser entity); + UserInfoVO entity2UserInfoVo(SysUser entity); + SysUser importVo2Entity(UserImportVO vo); } diff --git a/src/main/java/com/youlai/system/framework/easyexcel/ExcelResult.java b/src/main/java/com/youlai/system/framework/easyexcel/ExcelResult.java deleted file mode 100644 index d1a37136..00000000 --- a/src/main/java/com/youlai/system/framework/easyexcel/ExcelResult.java +++ /dev/null @@ -1,17 +0,0 @@ -package com.youlai.system.framework.easyexcel; - -import java.util.List; - -/** - * Excel 读取结果 - * - * @author: haoxr - * @date: 2023/03/01 - */ -public interface ExcelResult { - - List getList(); - - String getMsg(); - -} diff --git a/src/main/java/com/youlai/system/framework/easyexcel/MyAnalysisEventListener.java b/src/main/java/com/youlai/system/framework/easyexcel/MyAnalysisEventListener.java index 00259e60..6dec9710 100644 --- a/src/main/java/com/youlai/system/framework/easyexcel/MyAnalysisEventListener.java +++ b/src/main/java/com/youlai/system/framework/easyexcel/MyAnalysisEventListener.java @@ -9,5 +9,7 @@ import com.alibaba.excel.event.AnalysisEventListener; * @date: 2023/03/01 */ public abstract class MyAnalysisEventListener extends AnalysisEventListener { - public abstract ExcelResult getResult(); + + private String msg; + public abstract String getMsg(); } diff --git a/src/main/java/com/youlai/system/listener/UserImportListener.java b/src/main/java/com/youlai/system/listener/UserImportListener.java index b8f14af3..c17d382a 100644 --- a/src/main/java/com/youlai/system/listener/UserImportListener.java +++ b/src/main/java/com/youlai/system/listener/UserImportListener.java @@ -1,21 +1,29 @@ package com.youlai.system.listener; +import cn.hutool.core.lang.Validator; +import cn.hutool.core.util.StrUtil; import cn.hutool.extra.spring.SpringUtil; import cn.hutool.json.JSONUtil; import com.alibaba.excel.context.AnalysisContext; import com.alibaba.excel.util.ListUtils; -import com.youlai.system.framework.easyexcel.ExcelResult; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.youlai.system.common.base.IBaseEnum; +import com.youlai.system.common.constant.SystemConstants; +import com.youlai.system.common.enums.GenderEnum; +import com.youlai.system.converter.UserConverter; import com.youlai.system.framework.easyexcel.MyAnalysisEventListener; +import com.youlai.system.pojo.entity.SysUser; import com.youlai.system.pojo.vo.UserImportVO; import com.youlai.system.service.SysUserService; import lombok.extern.slf4j.Slf4j; +import org.springframework.security.crypto.password.PasswordEncoder; import java.util.List; /** * 用户导入监听器 *

- * https://easyexcel.opensource.alibaba.com/docs/current/quickstart/read + * 最简单的读监听器:https://easyexcel.opensource.alibaba.com/docs/current/quickstart/read * * @author haoxr * @date 2022/4/10 20:49 @@ -28,11 +36,19 @@ public class UserImportListener extends MyAnalysisEventListener { */ private static final int BATCH_COUNT = 100; + private int validCount; + + private int invalidCount; + + private int currentIndex; + + StringBuilder msg = new StringBuilder(); + + /** * 缓存的数据 */ - private List cachedUserList = ListUtils.newArrayListWithExpectedSize(BATCH_COUNT); - + private List cachedDataList = ListUtils.newArrayListWithExpectedSize(BATCH_COUNT); /** * 部门ID @@ -41,12 +57,17 @@ public class UserImportListener extends MyAnalysisEventListener { private final SysUserService userService; + private final PasswordEncoder passwordEncoder; + + private final UserConverter userConverter; + public UserImportListener(Long deptId) { this.deptId = deptId; this.userService = SpringUtil.getBean(SysUserService.class); + this.passwordEncoder = SpringUtil.getBean(PasswordEncoder.class); + this.userConverter = SpringUtil.getBean(UserConverter.class); } - /** * 每一条数据解析都会来调用 * @@ -56,10 +77,61 @@ public class UserImportListener extends MyAnalysisEventListener { @Override public void invoke(UserImportVO userImportVO, AnalysisContext analysisContext) { log.info("解析到一条用户数据:{}", JSONUtil.toJsonStr(userImportVO)); + currentIndex++; + StringBuilder rowMsg = new StringBuilder(); + boolean rowFlag = true; + // 校验数据 + + String username = userImportVO.getUsername(); + if (StrUtil.isBlank(username)) { + rowFlag = false; + rowMsg.append("用户名为空;"); + } else { + long count = userService.count(new LambdaQueryWrapper().eq(SysUser::getUsername, username)); + if (count > 0) { + rowFlag = false; + rowMsg.append("用户名已存在;"); + } + } + + String nickname = userImportVO.getNickname(); + if (StrUtil.isBlank(nickname)) { + rowFlag = false; + rowMsg.append("用户昵称为空;"); + } + String mobile = userImportVO.getMobile(); + if (StrUtil.isBlank(mobile)) { + rowFlag = false; + rowMsg.append("手机号码为空;"); + } else { + if (!Validator.isMobile(mobile)) { + rowFlag = false; + rowMsg.append("手机号码不正确;"); + } + } + if (rowFlag) { + validCount++; + SysUser entity = userConverter.importVo2Entity(userImportVO); + // 默认密码 + entity.setPassword(passwordEncoder.encode(SystemConstants.DEFAULT_PASSWORD)); + // 性别转换 + Integer gender = (Integer) IBaseEnum.getValueByLabel(userImportVO.getGender(), GenderEnum.class); + entity.setGender(gender); + entity.setDeptId(deptId); + cachedDataList.add(entity); + } else { + invalidCount++; + msg.append("第" + currentIndex + "行数据校验失败:").append(rowMsg + "
"); + } + + if (cachedDataList.size() > BATCH_COUNT) { + saveData(); + cachedDataList = ListUtils.newArrayListWithExpectedSize(BATCH_COUNT); + } } @@ -70,21 +142,20 @@ public class UserImportListener extends MyAnalysisEventListener { */ @Override public void doAfterAllAnalysed(AnalysisContext analysisContext) { + // 这里也要保存数据,确保最后遗留的数据也存储到数据库 + saveData(); + msg = new StringBuilder("导入用户结束:成功" + validCount + "条;失败" + invalidCount + "条
").append(msg); + } + /** + * 存储数据库 + */ + private void saveData() { + userService.saveBatch(cachedDataList); } @Override - public ExcelResult getResult() { - return new ExcelResult() { - @Override - public List getList() { - return null; - } - - @Override - public String getMsg() { - return null; - } - }; + public String getMsg() { + return this.msg.toString(); } } diff --git a/src/main/java/com/youlai/system/service/SysUserService.java b/src/main/java/com/youlai/system/service/SysUserService.java index 5b766736..93b379de 100644 --- a/src/main/java/com/youlai/system/service/SysUserService.java +++ b/src/main/java/com/youlai/system/service/SysUserService.java @@ -85,13 +85,6 @@ public interface SysUserService extends IService { UserAuthInfo getUserAuthInfo(String username); - /** - * 导入用户 - * - * @param userImportVO - * @return - */ - String importUsers(UserImportVO userImportVO) throws IOException; /** * 获取导出用户列表 diff --git a/src/main/resources/excel-templates/用户导入模板.xlsx b/src/main/resources/excel-templates/用户导入模板.xlsx index 60166214..36a208cc 100644 Binary files a/src/main/resources/excel-templates/用户导入模板.xlsx and b/src/main/resources/excel-templates/用户导入模板.xlsx differ