Преглед на файлове

实现异步导入文件, 并且记录日志

wanggaokun преди 1 година
родител
ревизия
0f5643f5cc

+ 16 - 0
eco-common/common-core/src/main/java/org/eco/common/core/core/domain/UploadRes.java

@@ -0,0 +1,16 @@
+package org.eco.common.core.core.domain;
+
+import lombok.Builder;
+import lombok.Data;
+
+/**
+ * @Description: UploadRes
+ * @Author: GaoKun Wang
+ * @Date: 2024/6/28
+ */
+@Data
+@Builder
+public class UploadRes {
+    private String url;
+    private String name;
+}

+ 4 - 0
eco-common/common-core/src/main/java/org/eco/common/core/service/OssService.java

@@ -1,5 +1,7 @@
 package org.eco.common.core.service;
 
+import org.eco.common.core.core.domain.UploadRes;
+
 /**
  * 通用 OSS服务
  *
@@ -15,4 +17,6 @@ public interface OssService {
      */
     String selectUrlByIds(String ossIds);
 
+    UploadRes upload(byte[] file, String name);
+
 }

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

@@ -60,10 +60,10 @@ public class DefaultExcelResult<T> implements ExcelResult<T> {
         int successCount = list.size();
         int errorCount = errorList.size();
         if (successCount == 0) {
-            return ExcelResultRes.builder().msg("读取失败,未解析到数据").status("0").build();
+            return ExcelResultRes.builder().logInfo("读取失败,未解析到数据").status("0").build();
         } else {
             if (errorCount == 0) {
-                return ExcelResultRes.builder().msg(StrUtil.format("恭喜您,全部读取成功!共{}条", successCount)).status("2").build();
+                return ExcelResultRes.builder().logInfo(StrUtil.format("恭喜您,全部读取成功!共{}条", successCount)).status("2").build();
             } else {
                 return ExcelResultRes.builder().build();
             }

+ 3 - 1
eco-common/common-excel/src/main/java/org/eco/common/excel/entity/ExcelResultRes.java

@@ -12,5 +12,7 @@ import lombok.Data;
 @Builder
 public class ExcelResultRes {
     private String status;
-    private String msg;
+    private String logInfo;
+    private String url;
+    private String name;
 }

+ 5 - 6
eco-common/common-excel/src/main/java/org/eco/common/excel/service/IExcelService.java

@@ -2,9 +2,9 @@ package org.eco.common.excel.service;
 
 import jakarta.servlet.http.HttpServletResponse;
 import org.eco.common.excel.core.ExcelListener;
-import org.springframework.scheduling.annotation.Async;
+import org.eco.common.excel.entity.ExcelResultRes;
+import org.springframework.web.multipart.MultipartFile;
 
-import java.io.InputStream;
 import java.util.List;
 
 /**
@@ -17,12 +17,11 @@ public interface IExcelService {
     /**
      * 使用自定义监听器 异步导入 自定义返回
      *
-     * @param is       输入流
+     * @param file     输入流文件
      * @param clazz    对象类型
      * @param listener 自定义监听器
      */
-    @Async
-    <T> void importExcel(InputStream is, Class<T> clazz, ExcelListener<T> listener);
+    <T> ExcelResultRes importExcel(MultipartFile file, Class<T> clazz, ExcelListener<T> listener);
 
 
     /**
@@ -32,5 +31,5 @@ public interface IExcelService {
      * @param sheetName 工作表的名称
      * @param clazz     实体类
      */
-    <T> void exportExcel(List<T> list, String sheetName, Class<T> clazz, HttpServletResponse response);
+    <T> ExcelResultRes exportExcel(List<T> list, String sheetName, Class<T> clazz, HttpServletResponse response);
 }

+ 32 - 5
eco-common/common-excel/src/main/java/org/eco/common/excel/service/impl/ExcelService.java

@@ -1,14 +1,19 @@
 package org.eco.common.excel.service.impl;
 
 import com.alibaba.excel.EasyExcel;
+import jakarta.annotation.Resource;
 import jakarta.servlet.http.HttpServletResponse;
 import lombok.extern.slf4j.Slf4j;
+import org.eco.common.core.core.domain.UploadRes;
+import org.eco.common.core.service.OssService;
 import org.eco.common.excel.core.ExcelListener;
+import org.eco.common.excel.entity.ExcelResultRes;
 import org.eco.common.excel.service.IExcelService;
 import org.eco.common.excel.utils.ExcelUtil;
-import org.springframework.scheduling.annotation.Async;
 import org.springframework.stereotype.Service;
+import org.springframework.web.multipart.MultipartFile;
 
+import java.io.IOException;
 import java.io.InputStream;
 import java.util.List;
 
@@ -20,14 +25,36 @@ import java.util.List;
 @Service
 @Slf4j
 public class ExcelService implements IExcelService {
+
+    @Resource
+    private OssService ossService;
+
     @Override
-    public <T> void importExcel(InputStream is, Class<T> clazz, ExcelListener<T> listener) {
-        EasyExcel.read(is, clazz, listener).sheet().doRead();
+    public <T> ExcelResultRes importExcel(MultipartFile file, Class<T> clazz, ExcelListener<T> listener) {
+        log.info("ExcelResultRes00000000000000000000000000000000");
+        InputStream inputStream;
+        try {
+            inputStream = file.getInputStream();
+            String originalFilename = file.getOriginalFilename();
+            byte[] bytes = file.getBytes();
+            UploadRes uploadRes = ossService.upload(bytes, originalFilename);
+            EasyExcel.read(inputStream, clazz, listener).sheet().doReadSync();
+            log.info("错误信息:{}", listener.getExcelResult().getAnalysis().getLogInfo());
+            log.info("状态:{}", listener.getExcelResult().getAnalysis().getStatus());
+            ExcelResultRes res = listener.getExcelResult().getAnalysis();
+            res.setName(uploadRes.getName());
+            res.setUrl(uploadRes.getUrl());
+            return res;
+        } catch (IOException e) {
+            log.error("异步导入失败:{}", e.getMessage());
+        }
+        log.info("ExcelResultRes11111111111111111111111111111111");
+        return null;
     }
 
     @Override
-    @Async
-    public <T> void exportExcel(List<T> list, String sheetName, Class<T> clazz, HttpServletResponse response) {
+    public <T> ExcelResultRes exportExcel(List<T> list, String sheetName, Class<T> clazz, HttpServletResponse response) {
         ExcelUtil.exportExcel(list, sheetName, clazz, response);
+        return null;
     }
 }

+ 6 - 8
eco-modules/system/src/main/java/org/eco/system/controller/system/SysUserController.java

@@ -53,7 +53,6 @@ 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;
 
@@ -79,9 +78,6 @@ public class SysUserController extends BaseController {
     @Resource
     private ISysTenantService tenantService;
 
-    @Resource
-    private IExcelService excelService;
-
     /**
      * 获取用户列表
      */
@@ -112,10 +108,12 @@ public class SysUserController extends BaseController {
     @Log(title = "用户管理", businessType = BusinessType.IMPORT)
     @SaCheckPermission("system:user:import")
     @PostMapping("/importData")
-    public CommonResult<Void> asyncImportData(MultipartFile file, boolean updateSupport) throws Exception {
+    public CommonResult<Void> asyncImportData(MultipartFile file, boolean updateSupport) {
+        log.info("00000000000000000000000000");
         LoginUser loginUser = LoginHelper.getLoginUser();
-        InputStream inputStream = file.getInputStream();
-        userService.asyncImportData(inputStream, updateSupport, loginUser);
+//        excelService.importExcel(file, SysUserImportVo.class, new SysUserImportListener(updateSupport, loginUser));
+        userService.asyncImportData(file, updateSupport, loginUser);
+        log.info("11111111111111111111111111111111");
         return CommonResult.success();
     }
 
@@ -124,7 +122,7 @@ public class SysUserController extends BaseController {
     @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());
+        return CommonResult.success(result.getAnalysis().getLogInfo());
     }
 
     @PostMapping("/importTemplate")

+ 6 - 1
eco-modules/system/src/main/java/org/eco/system/domain/ImportExport.java

@@ -32,6 +32,11 @@ public class ImportExport extends BaseEntity {
      */
     private String name;
 
+    /**
+     * 文件地址
+     */
+    private String url;
+
     /**
      * 日志信息
      */
@@ -40,7 +45,7 @@ public class ImportExport extends BaseEntity {
     /**
      * 状态
      */
-    private Integer status;
+    private String status;
 
 
 }

+ 8 - 8
eco-modules/system/src/main/java/org/eco/system/domain/bo/ImportExportBo.java

@@ -1,11 +1,10 @@
 package org.eco.system.domain.bo;
 
-import org.eco.common.orm.core.domain.BaseEntity;
-import org.eco.system.domain.ImportExport;
 import io.github.linpeilie.annotations.AutoMapper;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
-import jakarta.validation.constraints.*;
+import org.eco.common.orm.core.domain.BaseEntity;
+import org.eco.system.domain.ImportExport;
 
 /**
  * 导入导出日志业务对象 sys_import_export_t
@@ -20,26 +19,27 @@ public class ImportExportBo extends BaseEntity {
     /**
      * 唯一编码
      */
-    @NotNull(message = "唯一编码不能为空")
     private Long id;
 
     /**
      * 文件名称
      */
-    @NotBlank(message = "文件名称不能为空")
     private String name;
 
     /**
      * 日志信息
      */
-    @NotBlank(message = "日志信息不能为空")
     private String logInfo;
 
     /**
      * 状态
      */
-    @NotNull(message = "状态不能为空")
-    private Integer status;
+    private String status;
+
+    /**
+     * 状态
+     */
+    private String url;
 
 
 }

+ 21 - 11
eco-modules/system/src/main/java/org/eco/system/domain/vo/ImportExportVo.java

@@ -1,14 +1,13 @@
 package org.eco.system.domain.vo;
 
-import org.eco.common.orm.core.domain.BaseEntity;
-import org.eco.system.domain.ImportExport;
 import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
 import com.alibaba.excel.annotation.ExcelProperty;
-import org.eco.common.excel.annotation.ExcelDictFormat;
-import org.eco.common.excel.convert.ExcelDictConvert;
 import io.github.linpeilie.annotations.AutoMapper;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
+import org.eco.common.orm.core.domain.BaseEntity;
+import org.eco.system.domain.ImportExport;
+
 import java.io.Serial;
 import java.io.Serializable;
 
@@ -24,22 +23,33 @@ import java.io.Serializable;
 @AutoMapper(target = ImportExport.class)
 public class ImportExportVo extends BaseEntity implements Serializable {
 
-@Serial
-private static final long serialVersionUID = 1L;
+    @Serial
+    private static final long serialVersionUID = 1L;
 
-    /** 唯一编码 */
+    /**
+     * 唯一编码
+     */
     @ExcelProperty(value = "唯一编码")
     private Long id;
 
-    /** 文件名称 */
+    /**
+     * 文件名称
+     */
     @ExcelProperty(value = "文件名称")
     private String name;
 
-    /** 日志信息 */
+    @ExcelProperty(value = "文件地址")
+    private String url;
+
+    /**
+     * 日志信息
+     */
     @ExcelProperty(value = "日志信息")
     private String logInfo;
 
-    /** 状态 */
+    /**
+     * 状态
+     */
     @ExcelProperty(value = "状态")
-    private Integer status;
+    private String status;
 }

+ 8 - 3
eco-modules/system/src/main/java/org/eco/system/listener/SysUserImportListener.java

@@ -59,6 +59,11 @@ public class SysUserImportListener extends AnalysisEventListener<SysUserImportVo
 
     @Override
     public void invoke(SysUserImportVo userVo, AnalysisContext context) {
+        try {
+            Thread.sleep(3000L);
+        } catch (InterruptedException e) {
+            throw new RuntimeException(e);
+        }
         SysUserVo sysUser = this.userService.selectUserByUserName(userVo.getUserName());
         try {
             if (StringUtils.isNotEmpty(userVo.getDeptName())) {
@@ -134,13 +139,13 @@ public class SysUserImportListener extends AnalysisEventListener<SysUserImportVo
             public ExcelResultRes getAnalysis() {
                 if (failureNum > 0 && successNum == 0) {
                     failureMsg.insert(0, "很抱歉,导入失败!共 " + failureNum + " 条数据没有成功导入,错误如下:");
-                    return ExcelResultRes.builder().msg(failureMsg.toString()).status("0").build();
+                    return ExcelResultRes.builder().logInfo(failureMsg.toString()).status("0").build();
                 } else if (failureNum > 0 && successNum > 0) {
                     failureMsg.insert(0, "很抱歉,部分导入失败!共 " + failureNum + " 条数据没有成功导入,错误如下:");
-                    return ExcelResultRes.builder().msg(failureMsg.toString()).status("99").build();
+                    return ExcelResultRes.builder().logInfo(failureMsg.toString()).status("99").build();
                 } else {
                     successMsg.insert(0, "恭喜您,数据已全部导入成功!共 " + successNum + " 条,数据如下:");
-                    return ExcelResultRes.builder().msg(successMsg.toString()).status("1").build();
+                    return ExcelResultRes.builder().logInfo(successMsg.toString()).status("1").build();
                 }
             }
 

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

@@ -6,8 +6,8 @@ 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 org.springframework.web.multipart.MultipartFile;
 
-import java.io.InputStream;
 import java.util.List;
 
 /**
@@ -233,5 +233,5 @@ public interface ISysUserService extends IBaseService<SysUser> {
      */
     List<SysUserVo> selectUserListByDept(Long deptId);
 
-    void asyncImportData(InputStream inputStream, boolean updateSupport, LoginUser user);
+    void asyncImportData(MultipartFile file, boolean updateSupport, LoginUser user);
 }

+ 21 - 9
eco-modules/system/src/main/java/org/eco/system/service/impl/SysOssServiceImpl.java

@@ -5,14 +5,17 @@ import cn.hutool.core.io.FileUtil;
 import cn.hutool.core.io.IoUtil;
 import cn.hutool.core.util.ObjectUtil;
 import cn.hutool.core.util.StrUtil;
-import org.eco.common.core.exception.BusinessException;
-import org.eco.system.domain.SysOss;
-import org.eco.system.domain.bo.SysOssBo;
-import org.eco.system.domain.vo.SysOssVo;
+import com.mybatisflex.core.paginate.Page;
+import com.mybatisflex.core.query.QueryWrapper;
+import jakarta.servlet.http.HttpServletResponse;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
 import org.eco.common.core.config.EcoConfig;
 import org.eco.common.core.constant.CacheNames;
 import org.eco.common.core.constant.Constants;
+import org.eco.common.core.core.domain.UploadRes;
 import org.eco.common.core.core.page.PageResult;
+import org.eco.common.core.exception.BusinessException;
 import org.eco.common.core.service.OssService;
 import org.eco.common.core.utils.MapstructUtils;
 import org.eco.common.core.utils.SpringUtils;
@@ -25,12 +28,11 @@ import org.eco.common.oss.core.OssClient;
 import org.eco.common.oss.entity.UploadResult;
 import org.eco.common.oss.enumd.AccessPolicyType;
 import org.eco.common.oss.factory.OssFactory;
+import org.eco.system.domain.SysOss;
+import org.eco.system.domain.bo.SysOssBo;
+import org.eco.system.domain.vo.SysOssVo;
 import org.eco.system.mapper.SysOssMapper;
 import org.eco.system.service.ISysOssService;
-import com.mybatisflex.core.paginate.Page;
-import com.mybatisflex.core.query.QueryWrapper;
-import jakarta.servlet.http.HttpServletResponse;
-import lombok.RequiredArgsConstructor;
 import org.springframework.cache.annotation.Cacheable;
 import org.springframework.http.MediaType;
 import org.springframework.stereotype.Service;
@@ -53,10 +55,12 @@ import static org.eco.system.domain.table.SysOssTableDef.SYS_OSS;
  */
 @RequiredArgsConstructor
 @Service
+@Slf4j
 public class SysOssServiceImpl extends BaseServiceImpl<SysOssMapper, SysOss> implements ISysOssService, OssService {
 
     private final SysOssMapper ossMapper;
 
+
     @Override
     public QueryWrapper query() {
         return super.query().from(SYS_OSS);
@@ -116,7 +120,6 @@ public class SysOssServiceImpl extends BaseServiceImpl<SysOssMapper, SysOss> imp
         return String.join(StringUtils.SEPARATOR, list);
     }
 
-
     @Cacheable(cacheNames = CacheNames.SYS_OSS, key = "#ossId")
     @Override
     public SysOssVo getById(Long ossId) {
@@ -158,6 +161,15 @@ public class SysOssServiceImpl extends BaseServiceImpl<SysOssMapper, SysOss> imp
         return buildResultEntity(originalFilename, suffix, storage.getConfigKey(), uploadResult);
     }
 
+    @Override
+    public UploadRes upload(byte[] file, String name) {
+        String suffix = StringUtils.substring(name, name.lastIndexOf("."), name.length());
+        OssClient storage = OssFactory.instance();
+        UploadResult uploadResult = storage.uploadSuffix(file, suffix);
+        buildResultEntity(name, suffix, storage.getConfigKey(), uploadResult);
+        return UploadRes.builder().name(name).url(uploadResult.getUrl()).build();
+    }
+
     @Override
     public SysOssVo upload(File file) {
         String originalFileName = file.getName();

+ 20 - 12
eco-modules/system/src/main/java/org/eco/system/service/impl/SysUserServiceImpl.java

@@ -17,14 +17,15 @@ 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.excel.core.ExcelResult;
-import org.eco.common.excel.utils.ExcelUtil;
+import org.eco.common.excel.entity.ExcelResultRes;
+import org.eco.common.excel.service.IExcelService;
 import org.eco.common.orm.core.page.PageQuery;
 import org.eco.common.orm.core.service.impl.BaseServiceImpl;
 import org.eco.common.security.utils.LoginHelper;
 import org.eco.common.tenant.helper.TenantHelper;
 import org.eco.system.domain.SysUser;
 import org.eco.system.domain.SysUserPost;
+import org.eco.system.domain.bo.ImportExportBo;
 import org.eco.system.domain.bo.SysUserBo;
 import org.eco.system.domain.vo.SysPostVo;
 import org.eco.system.domain.vo.SysRoleVo;
@@ -32,7 +33,7 @@ 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.IImportExportService;
 import org.eco.system.service.ISysDataScopeService;
 import org.eco.system.service.ISysPostService;
 import org.eco.system.service.ISysRoleService;
@@ -44,8 +45,8 @@ import org.springframework.scheduling.annotation.Async;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.util.CollectionUtils;
+import org.springframework.web.multipart.MultipartFile;
 
-import java.io.InputStream;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.List;
@@ -68,8 +69,6 @@ import static org.eco.system.domain.table.SysUserTableDef.SYS_USER;
 @Service
 @Slf4j
 public class SysUserServiceImpl extends BaseServiceImpl<SysUserMapper, SysUser> implements ISysUserService, UserService {
-    @Resource
-    protected Validator validator;
     @Resource
     private SysUserMapper userMapper;
     @Resource
@@ -81,9 +80,12 @@ public class SysUserServiceImpl extends BaseServiceImpl<SysUserMapper, SysUser>
     @Resource
     private ISysUserPostService userPostService;
     @Resource
-    private ISysConfigService configService;
-    @Resource
     private ISysDataScopeService dataScopeService;
+    @Resource
+    private IExcelService excelService;
+
+    @Resource
+    private IImportExportService importExportService;
 
     @Override
     public QueryWrapper query() {
@@ -658,9 +660,15 @@ public class SysUserServiceImpl extends BaseServiceImpl<SysUserMapper, SysUser>
 
     @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());
+    public void asyncImportData(MultipartFile file, boolean updateSupport, LoginUser loginUser) {
+        log.info("asyncImportData000000000000000000000000000000000000000");
+        ExcelResultRes result = excelService.importExcel(file, SysUserImportVo.class, new SysUserImportListener(updateSupport, loginUser));
+        ImportExportBo importExportBo = new ImportExportBo();
+        importExportBo.setUrl(result.getUrl());
+        importExportBo.setStatus(result.getStatus());
+        importExportBo.setName(result.getName());
+        importExportBo.setLogInfo(result.getLogInfo());
+        importExportService.insert(importExportBo);
+        log.info("asyncImportData1111111111111111111111111111111111111111");
     }
 }