Parcourir la source

实现异步导入导出,封装结果
优化导入时字典的解析

wanggaokun il y a 1 an
Parent
commit
48777dc814

+ 5 - 4
eco-common/common-excel/src/main/java/org/eco/common/excel/core/DefaultExcelResult.java

@@ -2,6 +2,7 @@ package org.eco.common.excel.core;
 
 import cn.hutool.core.util.StrUtil;
 import lombok.Setter;
+import org.eco.common.excel.entity.ExcelResultRes;
 
 import java.util.ArrayList;
 import java.util.List;
@@ -55,16 +56,16 @@ public class DefaultExcelResult<T> implements ExcelResult<T> {
      * @return 导入回执
      */
     @Override
-    public String getAnalysis() {
+    public ExcelResultRes getAnalysis() {
         int successCount = list.size();
         int errorCount = errorList.size();
         if (successCount == 0) {
-            return "读取失败,未解析到数据";
+            return ExcelResultRes.builder().msg("读取失败,未解析到数据").status("0").build();
         } else {
             if (errorCount == 0) {
-                return StrUtil.format("恭喜您,全部读取成功!共{}条", successCount);
+                return ExcelResultRes.builder().msg(StrUtil.format("恭喜您,全部读取成功!共{}条", successCount)).status("2").build();
             } else {
-                return "";
+                return ExcelResultRes.builder().build();
             }
         }
     }

+ 3 - 1
eco-common/common-excel/src/main/java/org/eco/common/excel/core/ExcelResult.java

@@ -1,5 +1,7 @@
 package org.eco.common.excel.core;
 
+import org.eco.common.excel.entity.ExcelResultRes;
+
 import java.util.List;
 
 /**
@@ -22,5 +24,5 @@ public interface ExcelResult<T> {
     /**
      * 导入回执
      */
-    String getAnalysis();
+    ExcelResultRes getAnalysis();
 }

+ 16 - 0
eco-common/common-excel/src/main/java/org/eco/common/excel/entity/ExcelResultRes.java

@@ -0,0 +1,16 @@
+package org.eco.common.excel.entity;
+
+import lombok.Builder;
+import lombok.Data;
+
+/**
+ * @Description: ExcelResult 导入导出结果
+ * @Author: GaoKun Wang
+ * @Date: 2024/6/28
+ */
+@Data
+@Builder
+public class ExcelResultRes {
+    private String status;
+    private String msg;
+}

+ 14 - 15
eco-modules/system/src/main/java/org/eco/system/controller/system/SysUserController.java

@@ -37,7 +37,6 @@ import org.eco.system.domain.vo.SysUserImportVo;
 import org.eco.system.domain.vo.SysUserInfoVo;
 import org.eco.system.domain.vo.SysUserVo;
 import org.eco.system.domain.vo.UserInfoVo;
-import org.eco.system.listener.SysUserImportListener;
 import org.eco.system.service.ISysDeptService;
 import org.eco.system.service.ISysPostService;
 import org.eco.system.service.ISysRoleService;
@@ -54,6 +53,7 @@ import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
 import org.springframework.web.multipart.MultipartFile;
 
+import java.io.InputStream;
 import java.util.ArrayList;
 import java.util.List;
 
@@ -109,23 +109,22 @@ public class SysUserController extends BaseController {
      * @param file          导入文件
      * @param updateSupport 是否更新已存在数据
      */
-//    @Log(title = "用户管理", businessType = BusinessType.IMPORT)
-//    @SaCheckPermission("system:user:import")
-//    @PostMapping("/importData")
-//    public CommonResult<Void> importData(MultipartFile file, boolean updateSupport) throws Exception {
-//        log.info("****************************************");
-////        ExcelResult<SysUserImportVo> result = ExcelUtil.importExcel(file.getInputStream(), SysUserImportVo.class, new SysUserImportListener(updateSupport));
-//        excelService.importExcel(file.getInputStream(), SysUserImportVo.class, new SysUserImportListener(updateSupport));
-//        log.info("#########################################");
-//        return CommonResult.success();
-//    }
-
     @Log(title = "用户管理", businessType = BusinessType.IMPORT)
     @SaCheckPermission("system:user:import")
     @PostMapping("/importData")
-    public CommonResult<Void> importData(MultipartFile file, boolean updateSupport) throws Exception {
-        ExcelResult<SysUserImportVo> result = ExcelUtil.importExcel(file.getInputStream(), SysUserImportVo.class, new SysUserImportListener(updateSupport));
-        return CommonResult.success(result.getAnalysis());
+    public CommonResult<Void> asyncImportData(MultipartFile file, boolean updateSupport) throws Exception {
+        LoginUser loginUser = LoginHelper.getLoginUser();
+        InputStream inputStream = file.getInputStream();
+        userService.asyncImportData(inputStream, updateSupport, loginUser);
+        return CommonResult.success();
+    }
+
+    @Log(title = "用户管理", businessType = BusinessType.IMPORT)
+    @SaCheckPermission("system:user:import")
+    @PostMapping("/syncImportData")
+    public CommonResult<Void> syncImportData(MultipartFile file, boolean updateSupport) throws Exception {
+        ExcelResult<SysUserImportVo> result = ExcelUtil.importExcel(file.getInputStream(), SysUserImportVo.class, updateSupport);
+        return CommonResult.success(result.getAnalysis().getMsg());
     }
 
     @PostMapping("/importTemplate")

+ 18 - 16
eco-modules/system/src/main/java/org/eco/system/listener/SysUserImportListener.java

@@ -6,13 +6,13 @@ import cn.hutool.crypto.digest.BCrypt;
 import com.alibaba.excel.context.AnalysisContext;
 import com.alibaba.excel.event.AnalysisEventListener;
 import lombok.extern.slf4j.Slf4j;
-import org.eco.common.core.exception.BusinessException;
+import org.eco.common.core.core.domain.model.LoginUser;
 import org.eco.common.core.utils.SpringUtils;
 import org.eco.common.core.utils.StringUtils;
 import org.eco.common.core.utils.ValidatorUtils;
 import org.eco.common.excel.core.ExcelListener;
 import org.eco.common.excel.core.ExcelResult;
-import org.eco.common.security.utils.LoginHelper;
+import org.eco.common.excel.entity.ExcelResultRes;
 import org.eco.system.domain.bo.SysUserBo;
 import org.eco.system.domain.vo.SysDeptVo;
 import org.eco.system.domain.vo.SysUserImportVo;
@@ -40,28 +40,25 @@ public class SysUserImportListener extends AnalysisEventListener<SysUserImportVo
     private final Boolean isUpdateSupport;
 
     private final Long operateUserId;
+
+    private final LoginUser loginUser;
     private final StringBuilder successMsg = new StringBuilder();
     private final StringBuilder failureMsg = new StringBuilder();
     private int successNum = 0;
     private int failureNum = 0;
 
-    public SysUserImportListener(Boolean isUpdateSupport) {
+    public SysUserImportListener(Boolean isUpdateSupport, LoginUser loginUser) {
+        this.loginUser = loginUser;
         String initPassword = SpringUtils.getBean(ISysConfigService.class).selectConfigByKey("sys.user.initPassword").getConfigValue();
         this.userService = SpringUtils.getBean(ISysUserService.class);
         this.deptService = SpringUtils.getBean(ISysDeptService.class);
         this.password = BCrypt.hashpw(initPassword);
         this.isUpdateSupport = isUpdateSupport;
-        this.operateUserId = LoginHelper.getUserId();
+        this.operateUserId = loginUser.getUserId();
     }
 
     @Override
     public void invoke(SysUserImportVo userVo, AnalysisContext context) {
-        log.info("invoke&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&");
-        try {
-            Thread.sleep(3000L);
-        } catch (InterruptedException e) {
-            throw new RuntimeException(e);
-        }
         SysUserVo sysUser = this.userService.selectUserByUserName(userVo.getUserName());
         try {
             if (StringUtils.isNotEmpty(userVo.getDeptName())) {
@@ -76,6 +73,8 @@ public class SysUserImportListener extends AnalysisEventListener<SysUserImportVo
                             SysUserBo user = BeanUtil.toBean(userVo, SysUserBo.class);
                             user.setDeptId(dept.getDeptId());//获取用户部门ID
                             ValidatorUtils.validate(user);
+                            user.setTenantId(loginUser.getTenantId());
+                            user.setUpdateBy(operateUserId);
                             user.setPassword(password);
                             user.setCreateBy(operateUserId);
                             userService.insertUser(user);
@@ -90,6 +89,7 @@ public class SysUserImportListener extends AnalysisEventListener<SysUserImportVo
                             userService.checkUserAllowed(user.getUserId());
                             userService.checkUserDataScope(user.getUserId());
                             user.setUpdateBy(operateUserId);
+                            user.setVersion(sysUser.getVersion());
                             userService.updateUser(user);
                             successNum++;
                             successMsg.append("<br/>").append(successNum).append("、账号 ").append(user.getUserName()).append(" 更新成功");
@@ -120,26 +120,28 @@ public class SysUserImportListener extends AnalysisEventListener<SysUserImportVo
             failureMsg.append(msg).append(e.getMessage());
             log.error(msg, e);
         }
-        log.info("invoke&&&&&&&&&&&&&&&");
     }
 
     @Override
     public void doAfterAllAnalysed(AnalysisContext context) {
-        log.info("%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%{}", context.toString());
+        log.info("解析完成");
     }
 
     @Override
     public ExcelResult<SysUserImportVo> getExcelResult() {
         return new ExcelResult<>() {
             @Override
-            public String getAnalysis() {
-                if (failureNum > 0) {
+            public ExcelResultRes getAnalysis() {
+                if (failureNum > 0 && successNum == 0) {
                     failureMsg.insert(0, "很抱歉,导入失败!共 " + failureNum + " 条数据没有成功导入,错误如下:");
-                    throw new BusinessException(failureMsg.toString());
+                    return ExcelResultRes.builder().msg(failureMsg.toString()).status("0").build();
+                } else if (failureNum > 0 && successNum > 0) {
+                    failureMsg.insert(0, "很抱歉,部分导入失败!共 " + failureNum + " 条数据没有成功导入,错误如下:");
+                    return ExcelResultRes.builder().msg(failureMsg.toString()).status("99").build();
                 } else {
                     successMsg.insert(0, "恭喜您,数据已全部导入成功!共 " + successNum + " 条,数据如下:");
+                    return ExcelResultRes.builder().msg(successMsg.toString()).status("1").build();
                 }
-                return successMsg.toString();
             }
 
             @Override

+ 6 - 12
eco-modules/system/src/main/java/org/eco/system/service/ISysUserService.java

@@ -1,11 +1,13 @@
 package org.eco.system.service;
 
-import org.eco.system.domain.SysUser;
-import org.eco.system.domain.bo.SysUserBo;
+import org.eco.common.core.core.domain.model.LoginUser;
 import org.eco.common.core.core.page.PageResult;
 import org.eco.common.orm.core.service.IBaseService;
+import org.eco.system.domain.SysUser;
+import org.eco.system.domain.bo.SysUserBo;
 import org.eco.system.domain.vo.SysUserVo;
 
+import java.io.InputStream;
 import java.util.List;
 
 /**
@@ -223,16 +225,6 @@ public interface ISysUserService extends IBaseService<SysUser> {
      */
     boolean deleteUserByIds(Long[] userIds);
 
-    /**
-     * 导入用户数据
-     *
-     * @param userList        用户数据列表
-     * @param isUpdateSupport 是否更新支持,如果已存在,则进行更新数据
-     * @param operID          操作用户ID
-     * @return 结果
-     */
-    String importUser(List<SysUser> userList, Boolean isUpdateSupport, Long operID);
-
     /**
      * 通过部门id查询当前部门所有用户
      *
@@ -240,4 +232,6 @@ public interface ISysUserService extends IBaseService<SysUser> {
      * @return 用户vo列表
      */
     List<SysUserVo> selectUserListByDept(Long deptId);
+
+    void asyncImportData(InputStream inputStream, boolean updateSupport, LoginUser user);
 }

+ 14 - 16
eco-modules/system/src/main/java/org/eco/system/service/impl/SysDictTypeServiceImpl.java

@@ -1,6 +1,5 @@
 package org.eco.system.service.impl;
 
-import cn.hutool.core.util.ObjectUtil;
 import com.mybatisflex.core.paginate.Page;
 import com.mybatisflex.core.query.QueryWrapper;
 import jakarta.annotation.Resource;
@@ -233,22 +232,9 @@ public class SysDictTypeServiceImpl extends BaseServiceImpl<SysDictTypeMapper, S
      */
     @Override
     public String getDictLabel(String dictType, String dictValue, String separator) {
-        return getDictResult(dictType, dictValue, separator);
-    }
-
-    private String getDictResult(String dictType, String dictValue, String separator) {
         List<SysDictDataVo> lists = SpringUtils.getAopProxy(this).selectDictDataByType(dictType);
-        if (ObjectUtil.isNull(lists)) {
-            return StringUtils.EMPTY;
-        }
         Map<String, String> map = StreamUtils.toMap(lists, SysDictDataVo::getDictValue, SysDictDataVo::getDictLabel);
-        if (StringUtils.containsAny(dictValue, separator)) {
-            return Arrays.stream(dictValue.split(separator))
-                .map(v -> map.getOrDefault(v, StringUtils.EMPTY))
-                .collect(Collectors.joining(separator));
-        } else {
-            return map.getOrDefault(dictValue, StringUtils.EMPTY);
-        }
+        return getDictResult(dictValue, separator, map);
     }
 
     /**
@@ -261,7 +247,19 @@ public class SysDictTypeServiceImpl extends BaseServiceImpl<SysDictTypeMapper, S
      */
     @Override
     public String getDictValue(String dictType, String dictLabel, String separator) {
-        return getDictResult(dictType, dictLabel, separator);
+        List<SysDictDataVo> lists = SpringUtils.getAopProxy(this).selectDictDataByType(dictType);
+        Map<String, String> map = StreamUtils.toMap(lists, SysDictDataVo::getDictLabel, SysDictDataVo::getDictValue);
+        return getDictResult(dictLabel, separator, map);
+    }
+
+    private String getDictResult(String dict, String separator, Map<String, String> map) {
+        if (StringUtils.containsAny(dict, separator)) {
+            return Arrays.stream(dict.split(separator))
+                .map(v -> map.getOrDefault(v, StringUtils.EMPTY))
+                .collect(Collectors.joining(separator));
+        } else {
+            return map.getOrDefault(dict, StringUtils.EMPTY);
+        }
     }
 
     @Override

+ 23 - 63
eco-modules/system/src/main/java/org/eco/system/service/impl/SysUserServiceImpl.java

@@ -1,6 +1,5 @@
 package org.eco.system.service.impl;
 
-import cn.dev33.satoken.secure.BCrypt;
 import cn.hutool.core.util.ObjectUtil;
 import com.mybatisflex.core.paginate.Page;
 import com.mybatisflex.core.query.QueryMethods;
@@ -11,13 +10,15 @@ import jakarta.validation.Validator;
 import lombok.extern.slf4j.Slf4j;
 import org.eco.common.core.constant.CacheNames;
 import org.eco.common.core.constant.UserConstants;
+import org.eco.common.core.core.domain.model.LoginUser;
 import org.eco.common.core.core.page.PageResult;
 import org.eco.common.core.exception.BusinessException;
 import org.eco.common.core.service.UserService;
 import org.eco.common.core.utils.MapstructUtils;
 import org.eco.common.core.utils.SpringUtils;
 import org.eco.common.core.utils.StringUtils;
-import org.eco.common.core.utils.bean.BeanValidators;
+import org.eco.common.excel.core.ExcelResult;
+import org.eco.common.excel.utils.ExcelUtil;
 import org.eco.common.orm.core.page.PageQuery;
 import org.eco.common.orm.core.service.impl.BaseServiceImpl;
 import org.eco.common.security.utils.LoginHelper;
@@ -27,7 +28,9 @@ import org.eco.system.domain.SysUserPost;
 import org.eco.system.domain.bo.SysUserBo;
 import org.eco.system.domain.vo.SysPostVo;
 import org.eco.system.domain.vo.SysRoleVo;
+import org.eco.system.domain.vo.SysUserImportVo;
 import org.eco.system.domain.vo.SysUserVo;
+import org.eco.system.listener.SysUserImportListener;
 import org.eco.system.mapper.SysUserMapper;
 import org.eco.system.service.ISysConfigService;
 import org.eco.system.service.ISysDataScopeService;
@@ -37,10 +40,12 @@ import org.eco.system.service.ISysUserPostService;
 import org.eco.system.service.ISysUserRoleService;
 import org.eco.system.service.ISysUserService;
 import org.springframework.cache.annotation.Cacheable;
+import org.springframework.scheduling.annotation.Async;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.util.CollectionUtils;
 
+import java.io.InputStream;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.List;
@@ -444,8 +449,14 @@ public class SysUserServiceImpl extends BaseServiceImpl<SysUserMapper, SysUser>
     @Transactional
     public boolean insertUser(SysUserBo userBo) {
         SysUser user = MapstructUtils.convert(userBo, SysUser.class);
-        // 新增用户信息
-        boolean saved = this.save(user);
+        boolean saved;
+        if (ObjectUtil.isNotNull(user.getTenantId())) {
+            // 不会覆盖租户
+            saved = TenantHelper.ignore(() -> this.save(user));
+        } else {
+            // 新增用户信息
+            saved = this.save(user);
+        }
         if (saved) {
             // 新增用户岗位关联
             insertUserPost(user);
@@ -626,65 +637,6 @@ public class SysUserServiceImpl extends BaseServiceImpl<SysUserMapper, SysUser>
         return this.removeByIds(Arrays.asList(userIds));
     }
 
-    /**
-     * 导入用户数据
-     *
-     * @param userList        用户数据列表
-     * @param isUpdateSupport 是否更新支持,如果已存在,则进行更新数据
-     * @param operId          操作用户ID
-     * @return 结果
-     */
-    @Override
-    public String importUser(List<SysUser> userList, Boolean isUpdateSupport, Long operId) {
-        if (StringUtils.isNull(userList) || userList.isEmpty()) {
-            throw new BusinessException("导入用户数据不能为空!");
-        }
-        int successNum = 0;
-        int failureNum = 0;
-        StringBuilder successMsg = new StringBuilder();
-        StringBuilder failureMsg = new StringBuilder();
-        String initPassword = configService.selectConfigByKey("sys.user.initPassword").getConfigValue();
-        for (SysUser user : userList) {
-            try {
-                // 验证是否存在这个用户
-                SysUserVo u = selectUserByUserName(user.getUserName());
-                if (StringUtils.isNull(u)) {
-                    BeanValidators.validateWithException(validator, user);
-                    user.setPassword(BCrypt.hashpw(initPassword));
-                    user.setCreateBy(operId);
-                    this.save(user);
-                    successNum++;
-                    successMsg.append("<br/>" + successNum + "、账号 " + user.getUserName() + " 导入成功");
-                } else if (isUpdateSupport) {
-                    BeanValidators.validateWithException(validator, user);
-                    checkUserAllowed(u.getUserId());
-                    checkUserDataScope(u.getUserId());
-                    user.setVersion(u.getVersion());
-                    user.setUserId(u.getUserId());
-                    user.setUpdateBy(operId);
-                    this.updateById(user);
-                    successNum++;
-                    successMsg.append("<br/>" + successNum + "、账号 " + user.getUserName() + " 更新成功");
-                } else {
-                    failureNum++;
-                    failureMsg.append("<br/>" + failureNum + "、账号 " + user.getUserName() + " 已存在");
-                }
-            } catch (Exception e) {
-                failureNum++;
-                String msg = "<br/>" + failureNum + "、账号 " + user.getUserName() + " 导入失败:";
-                failureMsg.append(msg + e.getMessage());
-                log.error(msg, e);
-            }
-        }
-        if (failureNum > 0) {
-            failureMsg.insert(0, "很抱歉,导入失败!共 " + failureNum + " 条数据格式不正确,错误如下:");
-            throw new BusinessException(failureMsg.toString());
-        } else {
-            successMsg.insert(0, "恭喜您,数据已全部导入成功!共 " + successNum + " 条,数据如下:");
-        }
-        return successMsg.toString();
-    }
-
     @Cacheable(cacheNames = CacheNames.SYS_USER_NAME, key = "#userId")
     @Override
     public String selectUserNameById(Long userId) {
@@ -703,4 +655,12 @@ public class SysUserServiceImpl extends BaseServiceImpl<SysUserMapper, SysUser>
         QueryWrapper queryWrapper = query().where(SYS_USER.DEPT_ID.eq(deptId)).and(SYS_USER.DEL_FLAG.eq(0));
         return this.listAs(queryWrapper, SysUserVo.class);
     }
+
+    @Override
+    @Async
+    public void asyncImportData(InputStream inputStream, boolean updateSupport, LoginUser loginUser) {
+        ExcelResult<SysUserImportVo> result = ExcelUtil.importExcel(inputStream, SysUserImportVo.class, new SysUserImportListener(updateSupport, loginUser));
+        log.info("错误信息:{}", result.getAnalysis().getMsg());
+        log.info("状态:{}", result.getAnalysis().getStatus());
+    }
 }