diff --git a/epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/enums/BizTypeEnum.java b/epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/enums/BizTypeEnum.java index e6318f61b6..517330e427 100644 --- a/epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/enums/BizTypeEnum.java +++ b/epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/enums/BizTypeEnum.java @@ -19,6 +19,7 @@ public enum BizTypeEnum { GRID_PROJECT("grid_project", "网格项目"), PROJECT("project", "项目"), ARTICLE("article", "文章(党建声音)"), + SPECIAL_CROWD("special_crowd", "社会维稳(特殊人群)"), ; public static BizTypeEnum getEnum(String code) { diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/LingShanSpecialCrowdController.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/LingShanSpecialCrowdController.java index bfd157573f..1d99dbce93 100644 --- a/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/LingShanSpecialCrowdController.java +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/LingShanSpecialCrowdController.java @@ -53,12 +53,15 @@ public class LingShanSpecialCrowdController { @PostMapping("import") public Result importSpecialCowd(MultipartFile file, @RequestParam("crowdCategory") String crowdCategory) { + String originalFilename = file.getOriginalFilename(); + String suffix = originalFilename.substring(originalFilename.lastIndexOf(".")); + // 1.存文件 - Path fileSavePath = saveSpecialCrowdTempFile(file); + Path fileSavePath = saveSpecialCrowdTempFile(file, suffix); // 2.执行业务导入 try { - lingShanSpecialCrowdService.importSpecialCrowd(crowdCategory, fileSavePath.toString()); + lingShanSpecialCrowdService.importSpecialCrowd(crowdCategory, fileSavePath.toString(), originalFilename); } catch (Exception e) { throw e; // ... @@ -77,12 +80,12 @@ public class LingShanSpecialCrowdController { * @author: WangXianZhang * @date: 2023/4/18 9:46 AM */ - public Path saveSpecialCrowdTempFile(@RequestParam("file") MultipartFile file) { + public Path saveSpecialCrowdTempFile(@RequestParam("file") MultipartFile file, String suffix) { Path fileSavePath; FileOutputStream os = null; try { Path fileSaveDir = FileUtils.getAndCreateDirUnderEpmetFilesDir("special_crowd_import"); - String fileName = DateUtils.format(new Date(), "yyyyMMdd_HHmmss_" + System.nanoTime()); + String fileName = DateUtils.format(new Date(), "yyyyMMdd_HHmmss_" + System.nanoTime()) + suffix; fileSavePath = fileSaveDir.resolve(fileName); IOUtils.copy(file.getInputStream(), (os = new FileOutputStream(fileSavePath.toString()))); return fileSavePath; diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/excel/handler/AbstractLingShanSpecialCrowdExcelImportListener.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/excel/handler/AbstractLingShanSpecialCrowdExcelImportListener.java index f82271ff08..72bea84f54 100644 --- a/epmet-user/epmet-user-server/src/main/java/com/epmet/excel/handler/AbstractLingShanSpecialCrowdExcelImportListener.java +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/excel/handler/AbstractLingShanSpecialCrowdExcelImportListener.java @@ -58,6 +58,8 @@ public abstract class AbstractLingShanSpecialCrowdExcelImportListener getErrorDatas() { + public List getErrorDatas() { return errorDatas; } @@ -370,6 +371,15 @@ public abstract class AbstractLingShanSpecialCrowdExcelImportListener setHeaderZhList(); + /** + * @description: 设置模板名称 + * @param : + * @return + * @author: WangXianZhang + * @date: 2023/4/20 9:07 AM + */ + abstract String setTemplateFileName(); + /** * @description: 获取entity的class,用于数据拷贝 * @param : diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/excel/handler/LingShanSpecialCrowdAzbjExcelImportListener.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/excel/handler/LingShanSpecialCrowdAzbjExcelImportListener.java index 6be9cba8b4..117d5c833b 100644 --- a/epmet-user/epmet-user-server/src/main/java/com/epmet/excel/handler/LingShanSpecialCrowdAzbjExcelImportListener.java +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/excel/handler/LingShanSpecialCrowdAzbjExcelImportListener.java @@ -46,4 +46,9 @@ public class LingShanSpecialCrowdAzbjExcelImportListener LingShanSpecialCrowdTypeEnums getSpecialCrowdType() { return LingShanSpecialCrowdTypeEnums.AZBJ; } + + @Override + String setTemplateFileName() { + return "lingshan/lingshan_special_crowd_azbj_export.xlsx"; + } } diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/excel/handler/LingShanSpecialCrowdJieduExcelImportListener.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/excel/handler/LingShanSpecialCrowdJieduExcelImportListener.java index 98038505a6..6ab49e11a7 100644 --- a/epmet-user/epmet-user-server/src/main/java/com/epmet/excel/handler/LingShanSpecialCrowdJieduExcelImportListener.java +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/excel/handler/LingShanSpecialCrowdJieduExcelImportListener.java @@ -42,4 +42,9 @@ public class LingShanSpecialCrowdJieduExcelImportListener LingShanSpecialCrowdTypeEnums getSpecialCrowdType() { return LingShanSpecialCrowdTypeEnums.JDRY; } + + @Override + String setTemplateFileName() { + return "lingshan/lingshan_special_crowd_jdry_export.xlsx"; + } } diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/excel/handler/LingShanSpecialCrowdJingZhangExcelImportListener.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/excel/handler/LingShanSpecialCrowdJingZhangExcelImportListener.java index 6ea1034872..236811340a 100644 --- a/epmet-user/epmet-user-server/src/main/java/com/epmet/excel/handler/LingShanSpecialCrowdJingZhangExcelImportListener.java +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/excel/handler/LingShanSpecialCrowdJingZhangExcelImportListener.java @@ -43,4 +43,9 @@ public class LingShanSpecialCrowdJingZhangExcelImportListener LingShanSpecialCrowdTypeEnums getSpecialCrowdType() { return LingShanSpecialCrowdTypeEnums.JZHZ; } + + @Override + String setTemplateFileName() { + return "lingshan/lingshan_special_crowd_jzhz_export.xlsx"; + } } diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/excel/handler/LingShanSpecialCrowdSqjzExcelImportListener.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/excel/handler/LingShanSpecialCrowdSqjzExcelImportListener.java index d347b131d4..2d25a7652b 100644 --- a/epmet-user/epmet-user-server/src/main/java/com/epmet/excel/handler/LingShanSpecialCrowdSqjzExcelImportListener.java +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/excel/handler/LingShanSpecialCrowdSqjzExcelImportListener.java @@ -42,4 +42,9 @@ public class LingShanSpecialCrowdSqjzExcelImportListener LingShanSpecialCrowdTypeEnums getSpecialCrowdType() { return LingShanSpecialCrowdTypeEnums.SQJZ; } + + @Override + String setTemplateFileName() { + return "lingshan/lingshan_special_crowd_sqjz_export.xlsx"; + } } diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/excel/handler/LingShanSpecialCrowdXinFangExcelImportListener.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/excel/handler/LingShanSpecialCrowdXinFangExcelImportListener.java index 062c7bff64..ac1557245e 100644 --- a/epmet-user/epmet-user-server/src/main/java/com/epmet/excel/handler/LingShanSpecialCrowdXinFangExcelImportListener.java +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/excel/handler/LingShanSpecialCrowdXinFangExcelImportListener.java @@ -43,4 +43,9 @@ public class LingShanSpecialCrowdXinFangExcelImportListener LingShanSpecialCrowdTypeEnums getSpecialCrowdType() { return LingShanSpecialCrowdTypeEnums.XFRY; } + + @Override + String setTemplateFileName() { + return "lingshan/lingshan_special_crowd_xfry_export.xlsx"; + } } diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/service/LingShanSpecialCrowdService.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/service/LingShanSpecialCrowdService.java index bf26d89d83..5ad0abd666 100644 --- a/epmet-user/epmet-user-server/src/main/java/com/epmet/service/LingShanSpecialCrowdService.java +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/service/LingShanSpecialCrowdService.java @@ -20,7 +20,7 @@ public interface LingShanSpecialCrowdService { * @author: WangXianZhang * @date: 2023/4/18 5:42 PM */ - void importSpecialCrowd(String crowdCategory, String fileSavePath); + void importSpecialCrowd(String crowdCategory, String fileSavePath, String originFilename); /** * @description: 数据校验 diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/LingShanSpecialCrowdServiceImpl.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/LingShanSpecialCrowdServiceImpl.java index 767afa43cc..d9ba64e551 100644 --- a/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/LingShanSpecialCrowdServiceImpl.java +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/LingShanSpecialCrowdServiceImpl.java @@ -1,27 +1,49 @@ package com.epmet.service.impl; import com.alibaba.excel.EasyExcel; +import com.alibaba.excel.ExcelWriter; import com.alibaba.excel.converters.Converter; import com.alibaba.excel.converters.ReadConverterContext; import com.alibaba.excel.enums.CellDataTypeEnum; import com.alibaba.excel.read.metadata.ReadSheet; +import com.alibaba.excel.write.builder.ExcelWriterBuilder; +import com.epmet.commons.tools.constant.ServiceConstant; +import com.epmet.commons.tools.enums.BizTypeEnum; import com.epmet.commons.tools.exception.EpmetErrorCode; import com.epmet.commons.tools.exception.EpmetException; +import com.epmet.commons.tools.exception.ExceptionUtils; import com.epmet.commons.tools.exception.ValidateException; +import com.epmet.commons.tools.feign.ResultDataResolver; +import com.epmet.commons.tools.utils.DateUtils; import com.epmet.commons.tools.utils.EpmetRequestHolder; +import com.epmet.commons.tools.utils.ExcelUtils; +import com.epmet.commons.tools.utils.FileUtils; +import com.epmet.constants.ImportTaskConstants; import com.epmet.dao.*; +import com.epmet.dto.result.ImportTaskCommonResultDTO; +import com.epmet.dto.result.UploadImgResultDTO; import com.epmet.entity.*; import com.epmet.enums.LingShanSpecialCrowdTypeEnums; import com.epmet.excel.data.*; import com.epmet.excel.handler.*; import com.epmet.exceptions.ReadExcelHeaderOnlyException; +import com.epmet.feign.OssFeignClient; import com.epmet.service.LingShanSpecialCrowdService; +import com.epmet.utils.ImportTaskUtils; import lombok.extern.slf4j.Slf4j; +import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.collections4.ListUtils; +import org.apache.commons.fileupload.FileItem; +import org.apache.commons.fileupload.disk.DiskFileItemFactory; +import org.apache.http.entity.ContentType; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import org.springframework.web.multipart.commons.CommonsMultipartFile; import java.io.File; +import java.io.IOException; +import java.io.OutputStream; +import java.util.Date; import java.util.List; import java.util.concurrent.CompletableFuture; import java.util.concurrent.ExecutorService; @@ -31,7 +53,7 @@ import java.util.concurrent.ExecutorService; */ @Slf4j @Service -public class LingShanSpecialCrowdServiceImpl implements LingShanSpecialCrowdService { +public class LingShanSpecialCrowdServiceImpl implements LingShanSpecialCrowdService, ResultDataResolver { @Autowired private LingshanSpecialCrowdPersonDao specialCrowdPersonDao; @@ -60,8 +82,11 @@ public class LingShanSpecialCrowdServiceImpl implements LingShanSpecialCrowdServ @Autowired private ExecutorService executorService; + @Autowired + private OssFeignClient ossFeignClient; + @Override - public void importSpecialCrowd(String crowdCategory, String fileSavePath) { + public void importSpecialCrowd(String crowdCategory, String fileSavePath, String originFilename) { Class excelDataClass; AbstractLingShanSpecialCrowdExcelImportListener listener; LingShanSpecialCrowdTypeEnums specialCrowdTypeEnum; @@ -107,14 +132,83 @@ public class LingShanSpecialCrowdServiceImpl implements LingShanSpecialCrowdServ // 正式开始导入。异步导入 listener.setValidateHeaderOnly(false); + CompletableFuture.runAsync(() -> { - EasyExcel.read(fileSavePath, excelDataClass, listener) - .headRowNumber(specialCrowdTypeEnum.getHeaderRowNumber()) - .sheet(0) - .doRead(); + // 创建导入任务 + ImportTaskCommonResultDTO importTaskRst = getResultDataOrThrowsException(ImportTaskUtils.createImportTask(originFilename, + BizTypeEnum.SPECIAL_CROWD.getType()), + ServiceConstant.EPMET_COMMON_SERVICE, + EpmetErrorCode.EPMET_COMMON_OPERATION_FAIL.getCode(), + null, "【灵山街道-导入特殊人群】创建导入任务失败"); + + try { + EasyExcel.read(fileSavePath, excelDataClass, listener) + .headRowNumber(specialCrowdTypeEnum.getHeaderRowNumber()) + .sheet(0) + .doRead(); + + List errorDatas = listener.getErrorDatas(); + if (CollectionUtils.isNotEmpty(errorDatas)) { + // 有错误数据需要提示 + String resultDescFilePath = uploadResultDescFilePath(errorDatas, listener.getTemplateFileName()); + ImportTaskUtils.finishImportTask(importTaskRst.getTaskId(), + ImportTaskConstants.PROCESS_STATUS_FINISHED_FAIL, resultDescFilePath, "失败,请导出文件查看详细信息"); + } else { + // 全部成功 + ImportTaskUtils.finishImportTask(importTaskRst.getTaskId(), + ImportTaskConstants.PROCESS_STATUS_FINISHED_SUCCESS, null, "成功"); + } + } catch (Exception e) { + log.error("【灵山街道-导入特殊人群】失败,错误信息:" + ExceptionUtils.getErrorStackTrace(e)); + ImportTaskUtils.finishImportTask(importTaskRst.getTaskId(), + ImportTaskConstants.PROCESS_STATUS_FINISHED_FAIL, null, "未知错误"); + } }, executorService); } + /** + * @description: 上传错误描述文件 + * @param errorDatas: + * @return + * @author: WangXianZhang + * @date: 2023/4/19 10:19 PM + */ + private String uploadResultDescFilePath(List errorDatas, String templateFileName) { + FileItem fileItem = null; + try { + String fileName = + DateUtils.format(new Date(), "yyyyMMdd_HHmmss_") + System.nanoTime() + "社会维稳导入失败数据.xlsx"; + + // 创建临时文件 + fileItem = new DiskFileItemFactory(DiskFileItemFactory.DEFAULT_SIZE_THRESHOLD, FileUtils.getAndCreateDirUnderEpmetFilesDir("temp").toFile()) + .createItem("file", ContentType.APPLICATION_OCTET_STREAM.toString(), false, fileName); + + // 写入临时文件 + try (OutputStream os = fileItem.getOutputStream()) { + ExcelWriter excelWriter = EasyExcel.write(os).withTemplate(templateFileName).build(); + excelWriter.finish(); + } catch (IOException e) { + throw new RuntimeException(e); + } + + // 上传文件 + UploadImgResultDTO uploadRst = getResultDataOrThrowsException(ossFeignClient.uploadImportTaskDescFile(new CommonsMultipartFile(fileItem)), ServiceConstant.EPMET_COMMON_SERVICE, + EpmetErrorCode.EPMET_COMMON_OPERATION_FAIL.getCode(), + null, "【灵山街道-导入特殊人群】上传错误描述文件失败。"); + + return uploadRst.getUrl(); + + } catch (IOException e) { + throw new RuntimeException("【灵山街道-导入特殊人群】生成错误描述文件-创建临时目录失败"); + } finally { + try { + fileItem.delete(); + } catch (Exception e) { + log.error("【灵山街道-导入特殊人群】删除fileItem临时文件失败"); + } + } + } + @Override public String validate(LingShanSpecialCrowdDetailBaseExcelData row) { String idCard = row.getIdCard(); diff --git a/epmet-user/epmet-user-server/src/main/resources/excel/lingshan/lingshan_special_crowd_azbj_export.xlsx b/epmet-user/epmet-user-server/src/main/resources/excel/lingshan/lingshan_special_crowd_azbj_export.xlsx new file mode 100644 index 0000000000..5fc410a64e Binary files /dev/null and b/epmet-user/epmet-user-server/src/main/resources/excel/lingshan/lingshan_special_crowd_azbj_export.xlsx differ diff --git a/epmet-user/epmet-user-server/src/main/resources/excel/lingshan/lingshan_special_crowd_jdry_export.xlsx b/epmet-user/epmet-user-server/src/main/resources/excel/lingshan/lingshan_special_crowd_jdry_export.xlsx new file mode 100644 index 0000000000..2ab2738250 Binary files /dev/null and b/epmet-user/epmet-user-server/src/main/resources/excel/lingshan/lingshan_special_crowd_jdry_export.xlsx differ diff --git a/epmet-user/epmet-user-server/src/main/resources/excel/lingshan/lingshan_special_crowd_jzhz_export.xlsx b/epmet-user/epmet-user-server/src/main/resources/excel/lingshan/lingshan_special_crowd_jzhz_export.xlsx new file mode 100644 index 0000000000..d055b68eb1 Binary files /dev/null and b/epmet-user/epmet-user-server/src/main/resources/excel/lingshan/lingshan_special_crowd_jzhz_export.xlsx differ diff --git a/epmet-user/epmet-user-server/src/main/resources/excel/lingshan/lingshan_special_crowd_sqjz_export.xlsx b/epmet-user/epmet-user-server/src/main/resources/excel/lingshan/lingshan_special_crowd_sqjz_export.xlsx new file mode 100644 index 0000000000..47927aa2a0 Binary files /dev/null and b/epmet-user/epmet-user-server/src/main/resources/excel/lingshan/lingshan_special_crowd_sqjz_export.xlsx differ diff --git a/epmet-user/epmet-user-server/src/main/resources/excel/lingshan/lingshan_special_crowd_xfry_export.xlsx b/epmet-user/epmet-user-server/src/main/resources/excel/lingshan/lingshan_special_crowd_xfry_export.xlsx new file mode 100644 index 0000000000..9eb90e825b Binary files /dev/null and b/epmet-user/epmet-user-server/src/main/resources/excel/lingshan/lingshan_special_crowd_xfry_export.xlsx differ