From b0b155c1d1944521d67a8c255d1e0716086fa4f3 Mon Sep 17 00:00:00 2001 From: zxc <1272811460@qq.com> Date: Tue, 1 Nov 2022 15:07:28 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AF=BC=E5=85=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../commons/tools/enums/DictTypeEnum.java | 2 + .../epmet/constants/ImportTaskConstants.java | 1 + .../controller/IcDangerAreaController.java | 70 +++++++++- .../epmet/excel/IcDangerAreaImportExcel.java | 34 +++++ .../IcDangerAreaExcelImportListener.java | 130 ++++++++++++++++++ .../epmet/service/IcDangerAreaService.java | 3 + .../service/impl/IcDangerAreaServiceImpl.java | 123 ++++++++++++++++- 7 files changed, 354 insertions(+), 9 deletions(-) create mode 100644 epmet-user/epmet-user-server/src/main/java/com/epmet/excel/IcDangerAreaImportExcel.java create mode 100644 epmet-user/epmet-user-server/src/main/java/com/epmet/excel/handler/IcDangerAreaExcelImportListener.java diff --git a/epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/enums/DictTypeEnum.java b/epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/enums/DictTypeEnum.java index 57b2461c1e..d38442798e 100644 --- a/epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/enums/DictTypeEnum.java +++ b/epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/enums/DictTypeEnum.java @@ -29,6 +29,8 @@ public enum DictTypeEnum { IC_DANGER_TYPE("ic_danger_type","危化品种类",24), POLICY_LEVEL("policy_level","政策级别",25), LOG_TYPE("log_type", "日志类型", 33), + + DANGER_AREA_LEVEL_TYPE("dangerAreaLevel", "风险地区等级", 34), TRAFFIC_TYPE("traffic_type", "交通方式", 36), SOJOURN_HISTORY("sojourn_history", "7天内旅居史情况", 37), ISOLATE_TYPE("isolate_type", "隔离状态", 38), diff --git a/epmet-module/epmet-common-service/common-service-client/src/main/java/com/epmet/constants/ImportTaskConstants.java b/epmet-module/epmet-common-service/common-service-client/src/main/java/com/epmet/constants/ImportTaskConstants.java index 1d9190c9db..204845c1fb 100644 --- a/epmet-module/epmet-common-service/common-service-client/src/main/java/com/epmet/constants/ImportTaskConstants.java +++ b/epmet-module/epmet-common-service/common-service-client/src/main/java/com/epmet/constants/ImportTaskConstants.java @@ -21,6 +21,7 @@ public interface ImportTaskConstants { String BIZ_TYPE_IC_PARTY_MEMBER = "ic_party_member"; String BIZ_TYPE_IC_DANGEROUS_CHEMICALS = "ic_dangerous_chemicals"; String BIZ_TYPE_IC_ENTERPRISE="ic_enterprise"; + String BIZ_TYPE_IC_DANGER_AREA="ic_danger_area"; String IC_POINT_NUCLEIC_MONITORING = "ic_point_nucleic_monitoring"; String IC_POINT_VACCINES_INOCULATION = "ic_point_vaccines_inoculation"; // 新冠病毒疫苗接种人员信息台账 diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/IcDangerAreaController.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/IcDangerAreaController.java index 4dcfd4bb09..ea4ebcc55b 100644 --- a/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/IcDangerAreaController.java +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/controller/IcDangerAreaController.java @@ -5,25 +5,32 @@ import com.alibaba.excel.ExcelWriter; import com.alibaba.excel.write.metadata.WriteSheet; import com.epmet.commons.tools.annotation.LoginUser; import com.epmet.commons.tools.aop.NoRepeatSubmit; +import com.epmet.commons.tools.constant.AppClientConstant; import com.epmet.commons.tools.constant.NumConstant; +import com.epmet.commons.tools.constant.ServiceConstant; import com.epmet.commons.tools.dto.form.PageFormDTO; +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.page.PageData; import com.epmet.commons.tools.security.dto.TokenDto; -import com.epmet.commons.tools.utils.ConvertUtils; -import com.epmet.commons.tools.utils.ExcelUtils; -import com.epmet.commons.tools.utils.Result; +import com.epmet.commons.tools.utils.*; import com.epmet.commons.tools.utils.poi.excel.handler.FreezeAndFilter; -import com.epmet.commons.tools.validator.AssertUtils; +import com.epmet.commons.tools.feign.*; import com.epmet.commons.tools.validator.ValidatorUtils; import com.epmet.commons.tools.validator.group.AddGroup; import com.epmet.commons.tools.validator.group.UpdateGroup; import com.epmet.commons.tools.validator.group.DefaultGroup; +import com.epmet.constants.ImportTaskConstants; import com.epmet.dto.IcDangerAreaDTO; import com.epmet.dto.form.DangerAreaListFormDTO; +import com.epmet.dto.form.ImportTaskCommonFormDTO; +import com.epmet.dto.result.ImportTaskCommonResultDTO; import com.epmet.dto.result.NatListCommonExcelResultDTO; import com.epmet.dto.result.NatListResultDTO; import com.epmet.enums.DangerLevelEnum; import com.epmet.excel.IcDangerAreaResultExcel; +import com.epmet.feign.EpmetCommonServiceOpenFeignClient; import com.epmet.service.IcDangerAreaService; import lombok.extern.slf4j.Slf4j; import org.apache.commons.collections4.CollectionUtils; @@ -31,14 +38,18 @@ import org.apache.commons.io.IOUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpHeaders; import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; import javax.servlet.ServletOutputStream; import javax.servlet.http.HttpServletResponse; +import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.net.URLEncoder; +import java.nio.file.Path; import java.util.List; import java.util.Map; +import java.util.UUID; /** @@ -50,10 +61,12 @@ import java.util.Map; @RestController @Slf4j @RequestMapping("icDangerArea") -public class IcDangerAreaController { +public class IcDangerAreaController implements ResultDataResolver{ @Autowired private IcDangerAreaService icDangerAreaService; + @Autowired + private EpmetCommonServiceOpenFeignClient commonServiceOpenFeignClient; @RequestMapping("page") public Result> page(@RequestParam Map params){ @@ -159,4 +172,51 @@ public class IcDangerAreaController { } } + @PostMapping("import") + public Result importExcel(@LoginUser TokenDto tokenDto, @RequestPart("file") MultipartFile file) { + String userId = EpmetRequestHolder.getHeader(AppClientConstant.USER_ID); + // 1.暂存文件 + String originalFilename = file.getOriginalFilename(); + String extName = originalFilename.substring(originalFilename.lastIndexOf(".")); + Path fileSavePath; + try { + Path importPath = FileUtils.getAndCreateDirUnderEpmetFilesDir("ic_danger_area", "import"); + fileSavePath = importPath.resolve(UUID.randomUUID().toString().concat(extName)); + } catch (IOException e) { + String errorMsg = ExceptionUtils.getErrorStackTrace(e); + log.error("【风险地区】创建临时存储文件失败:{}", errorMsg); + throw new EpmetException(EpmetErrorCode.EPMET_COMMON_OPERATION_FAIL.getCode(), "文件上传失败", "文件上传失败"); + } + + InputStream is = null; + FileOutputStream os = null; + + try { + is = file.getInputStream(); + os = new FileOutputStream(fileSavePath.toString()); + IOUtils.copy(is, os); + } catch (Exception e) { + log.error("method exception", e); + } finally { + org.apache.poi.util.IOUtils.closeQuietly(is); + org.apache.poi.util.IOUtils.closeQuietly(os); + } + + // 2.生成导入任务记录 + ImportTaskCommonFormDTO importTaskForm = new ImportTaskCommonFormDTO(); + importTaskForm.setOperatorId(userId); + importTaskForm.setBizType(ImportTaskConstants.BIZ_TYPE_IC_DANGER_AREA); + importTaskForm.setOriginFileName(originalFilename); + + ImportTaskCommonResultDTO rstData = getResultDataOrThrowsException(commonServiceOpenFeignClient.createImportTask(importTaskForm), + ServiceConstant.EPMET_COMMON_SERVICE, + EpmetErrorCode.EPMET_COMMON_OPERATION_FAIL.getCode(), + "excel导入风险地区错误", + "风险地区导入失败"); + + // 3.执行导入 + icDangerAreaService.execAsyncExcelImport(fileSavePath, rstData.getTaskId(),tokenDto.getCustomerId(),tokenDto.getUserId()); + return new Result(); + } + } diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/excel/IcDangerAreaImportExcel.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/excel/IcDangerAreaImportExcel.java new file mode 100644 index 0000000000..7358f3ee39 --- /dev/null +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/excel/IcDangerAreaImportExcel.java @@ -0,0 +1,34 @@ +package com.epmet.excel; + +import com.alibaba.excel.annotation.ExcelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; + +/** + * @Author zxc + * @DateTime 2022/11/1 11:18 + */ +@Data +public class IcDangerAreaImportExcel { + + @NotBlank(message = "风险地区为必填项") + @ExcelProperty("风险地区") + private String allName; + + @NotBlank(message = "风险等级为必填项") + @ExcelProperty("风险等级") + private String dangerLevel; + + @Data + public static class IcDangerAreaError{ + @ExcelProperty("风险地区") + private String name; + + @ExcelProperty("风险等级") + private String dangerLevel; + + @ExcelProperty("错误信息") + private String errorInfo; + } +} diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/excel/handler/IcDangerAreaExcelImportListener.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/excel/handler/IcDangerAreaExcelImportListener.java new file mode 100644 index 0000000000..5e09a8d102 --- /dev/null +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/excel/handler/IcDangerAreaExcelImportListener.java @@ -0,0 +1,130 @@ +package com.epmet.excel.handler; + +import com.alibaba.excel.context.AnalysisContext; +import com.alibaba.excel.read.listener.ReadListener; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.epmet.commons.tools.constant.NumConstant; +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.utils.ConvertUtils; +import com.epmet.commons.tools.validator.ValidatorUtils; +import com.epmet.dao.IcDangerAreaDao; +import com.epmet.entity.IcDangerAreaEntity; +import com.epmet.entity.IcNatEntity; +import com.epmet.enums.DangerLevelEnum; +import com.epmet.excel.IcDangerAreaImportExcel; +import com.epmet.excel.data.IcNatImportExcelData; +import com.epmet.service.IcDangerAreaService; +import lombok.Data; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.collections4.CollectionUtils; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +/** + * 核酸检测excel导入监听器 + */ +@Data +@Slf4j +public class IcDangerAreaExcelImportListener implements ReadListener { + + public static final int MAX_THRESHOLD = 200; + private String customerId = ""; + private Map dangerLevelMap = null; + private List datas = new ArrayList<>(); + private List errorRows = new ArrayList<>(); + + @Autowired + private IcDangerAreaService icDangerAreaService; + @Autowired + private IcDangerAreaDao icDangerAreaDao; + + public IcDangerAreaExcelImportListener(Map dangerLevelMap, String customerId, IcDangerAreaService icDangerAreaService, IcDangerAreaDao icDangerAreaDao) { + this.dangerLevelMap = dangerLevelMap; + this.customerId = customerId; + this.icDangerAreaService = icDangerAreaService; + this.icDangerAreaDao = icDangerAreaDao; + } + + @Override + public void invoke(IcDangerAreaImportExcel data, AnalysisContext context) { + try { + LambdaQueryWrapper qw = new LambdaQueryWrapper<>(); + qw.eq(IcDangerAreaEntity::getAllName,data.getAllName()); + IcDangerAreaEntity icDangerAreaEntity = icDangerAreaDao.selectOne(qw); + if (null != icDangerAreaEntity){ + throw new EpmetException(EpmetErrorCode.DANGER_AREA_ERROR.getCode()); + } + ValidatorUtils.validateEntity(data); + IcDangerAreaEntity entity = ConvertUtils.sourceToTarget(data, IcDangerAreaEntity.class); + String[] split = data.getAllName().split("-"); + for (int i = NumConstant.ZERO; i < split.length; i++) { + switch (i){ + case NumConstant.ZERO: + entity.setProvince(split[i]); + break; + case NumConstant.ONE: + entity.setCity(split[i]); + break; + case NumConstant.TWO: + entity.setDistrict(split[i]); + break; + default: + break; + } + } + entity.setDangerLevel(dangerLevelMap.get(entity.getDangerLevel())); + entity.setCustomerId(customerId); + datas.add(entity); + if (datas.size() == MAX_THRESHOLD) { + execPersist(); + } + } catch (Exception e) { + String errorMsg = null; + if (e instanceof ValidateException) { + errorMsg = ((ValidateException) e).getMsg(); + } else { + log.error("【风险地区信息导入】出错:{}", e.getStackTrace()); + errorMsg = ((EpmetException)e).getInternalMsg(); + log.error("【风险地区信息导入】出错:{}", ExceptionUtils.getErrorStackTrace(e)); + } + IcDangerAreaImportExcel.IcDangerAreaError errorRow = new IcDangerAreaImportExcel.IcDangerAreaError(); + errorRow.setName(data.getAllName()); + errorRow.setErrorInfo(errorMsg); + errorRows.add(errorRow); + } + } + + @Override + public void doAfterAllAnalysed(AnalysisContext context) { + // 最后几条达不到阈值,这里必须再调用一次 + execPersist(); + } + + /** + * 执行持久化 + */ + private void execPersist() { + try { + if (CollectionUtils.isNotEmpty(datas)){ + icDangerAreaService.insertBatch(datas); + } + } finally { + datas.clear(); + } + } + + /** + * 获取错误行 + * @return + */ + public List getErrorRows() { + return errorRows; + } +} diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/service/IcDangerAreaService.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/service/IcDangerAreaService.java index 9baf3e2b99..18a98985fb 100644 --- a/epmet-user/epmet-user-server/src/main/java/com/epmet/service/IcDangerAreaService.java +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/service/IcDangerAreaService.java @@ -6,6 +6,7 @@ import com.epmet.dto.IcDangerAreaDTO; import com.epmet.dto.form.DangerAreaListFormDTO; import com.epmet.entity.IcDangerAreaEntity; +import java.nio.file.Path; import java.util.List; import java.util.Map; @@ -78,4 +79,6 @@ public interface IcDangerAreaService extends BaseService { * @date 2022-10-31 */ void delete(List ids,String staffId); + + void execAsyncExcelImport(Path fileSavePath, String taskId, String customerId, String userId); } \ No newline at end of file diff --git a/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcDangerAreaServiceImpl.java b/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcDangerAreaServiceImpl.java index 498712ae68..0c56f212f7 100644 --- a/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcDangerAreaServiceImpl.java +++ b/epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcDangerAreaServiceImpl.java @@ -1,32 +1,58 @@ package com.epmet.service.impl; +import com.alibaba.excel.EasyExcel; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.epmet.commons.mybatis.service.impl.BaseServiceImpl; import com.epmet.commons.tools.constant.NumConstant; +import com.epmet.commons.tools.dto.result.CustomerStaffInfoCacheResult; +import com.epmet.commons.tools.enums.DictTypeEnum; 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.page.PageData; +import com.epmet.commons.tools.redis.common.CustomerStaffRedis; import com.epmet.commons.tools.utils.ConvertUtils; import com.epmet.commons.tools.constant.FieldConstant; +import com.epmet.commons.tools.utils.FileUtils; +import com.epmet.commons.tools.utils.Result; +import com.epmet.constants.ImportTaskConstants; import com.epmet.dao.IcDangerAreaDao; import com.epmet.dto.IcDangerAreaDTO; +import com.epmet.dto.SysDictDataDTO; import com.epmet.dto.form.DangerAreaListFormDTO; +import com.epmet.dto.form.ImportTaskCommonFormDTO; +import com.epmet.dto.result.UploadImgResultDTO; import com.epmet.entity.IcDangerAreaEntity; +import com.epmet.excel.IcDangerAreaImportExcel; +import com.epmet.excel.handler.IcDangerAreaExcelImportListener; +import com.epmet.feign.EpmetAdminOpenFeignClient; +import com.epmet.feign.EpmetCommonServiceOpenFeignClient; +import com.epmet.feign.OssFeignClient; import com.epmet.service.IcDangerAreaService; import com.github.pagehelper.PageHelper; import com.github.pagehelper.PageInfo; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.collections4.CollectionUtils; +import org.apache.commons.fileupload.FileItem; +import org.apache.commons.fileupload.FileItemFactory; +import org.apache.commons.fileupload.disk.DiskFileItemFactory; import org.apache.commons.lang3.StringUtils; +import org.apache.http.entity.ContentType; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.scheduling.annotation.Async; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import org.springframework.web.multipart.commons.CommonsMultipartFile; -import java.util.Arrays; -import java.util.Date; -import java.util.List; -import java.util.Map; +import java.io.IOException; +import java.io.OutputStream; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.*; +import java.util.stream.Collectors; /** * 疫情风险地区 @@ -35,8 +61,16 @@ import java.util.Map; * @since v1.0.0 2022-10-31 */ @Service +@Slf4j public class IcDangerAreaServiceImpl extends BaseServiceImpl implements IcDangerAreaService { + @Autowired + private EpmetAdminOpenFeignClient adminOpenFeignClient; + @Autowired + private OssFeignClient ossFeignClient; + @Autowired + private EpmetCommonServiceOpenFeignClient commonServiceOpenFeignClient; + @Override public PageData page(Map params) { IPage page = baseDao.selectPage( @@ -139,4 +173,85 @@ public class IcDangerAreaServiceImpl extends BaseServiceImpl> dictMapRes = adminOpenFeignClient.dictDataList(DictTypeEnum.DANGER_AREA_LEVEL_TYPE.getCode()); + Map dangerLevelMap = dictMapRes.success() && CollectionUtils.isNotEmpty(dictMapRes.getData()) ? dictMapRes.getData().stream().collect(Collectors.toMap(SysDictDataDTO::getDictLabel, SysDictDataDTO::getDictValue)) : new HashMap<>(); + + IcDangerAreaExcelImportListener dangerAreaExcelImportListener = new IcDangerAreaExcelImportListener(dangerLevelMap, customerId,this ,baseDao); + EasyExcel.read(fileSavePath.toFile(), IcDangerAreaImportExcel.class, dangerAreaExcelImportListener).headRowNumber(1).sheet(0).doRead(); + + Path errorDescFile = null; + String errorDesFileUrl = null; + List errorRows = dangerAreaExcelImportListener.getErrorRows(); + boolean failed = CollectionUtils.isNotEmpty(errorRows); + if (failed) { + // 生成并上传错误文件 + try { + // 文件生成 + Path errorDescDir = FileUtils.getAndCreateDirUnderEpmetFilesDir("ic_danger_area", "import", "error_des"); + String fileName = UUID.randomUUID().toString().concat(".xlsx"); + errorDescFile = errorDescDir.resolve(fileName); + + FileItemFactory factory = new DiskFileItemFactory(16, errorDescDir.toFile()); + FileItem fileItem = factory.createItem("file", ContentType.APPLICATION_OCTET_STREAM.toString(), true, fileName); + OutputStream os = fileItem.getOutputStream(); + EasyExcel.write(os, IcDangerAreaImportExcel.IcDangerAreaError.class).sheet("导入失败列表").doWrite(errorRows); + // 文件上传oss + Result errorDesFileUploadResult = ossFeignClient.uploadImportTaskDescFile(new CommonsMultipartFile(fileItem)); + if (errorDesFileUploadResult.success()) { + errorDesFileUrl = errorDesFileUploadResult.getData().getUrl(); + } + } finally { + if (Files.exists(errorDescFile)) { + Files.delete(errorDescFile); + } + } + } + + ImportTaskCommonFormDTO importFinishTaskForm = new ImportTaskCommonFormDTO(); + importFinishTaskForm.setTaskId(taskId); + importFinishTaskForm.setProcessStatus(failed ? ImportTaskConstants.PROCESS_STATUS_FINISHED_FAIL : ImportTaskConstants.PROCESS_STATUS_FINISHED_SUCCESS); + importFinishTaskForm.setOperatorId(userId); + importFinishTaskForm.setResultDesc(""); + importFinishTaskForm.setResultDescFilePath(errorDesFileUrl); + + Result result = commonServiceOpenFeignClient.finishImportTask(importFinishTaskForm); + if (!result.success()) { + log.error("【风险地区导入】finishImportTask失败"); + } + } catch (Exception e) { + String errorMsg = ExceptionUtils.getErrorStackTrace(e); + log.error("【风险地区导入】出错:{}", errorMsg); + + ImportTaskCommonFormDTO importFinishTaskForm = new ImportTaskCommonFormDTO(); + importFinishTaskForm.setTaskId(taskId); + importFinishTaskForm.setProcessStatus(ImportTaskConstants.PROCESS_STATUS_FINISHED_FAIL); + importFinishTaskForm.setOperatorId(userId); + importFinishTaskForm.setResultDesc("导入失败"); + + Result result = commonServiceOpenFeignClient.finishImportTask(importFinishTaskForm); + if (!result.success()) { + log.error("【风险地区导入】导入记录状态修改为'完成'失败"); + } + } finally { + // 删除临时文件 + if (Files.exists(fileSavePath)) { + try { + Files.delete(fileSavePath); + } catch (IOException e) { + log.error("method exception", e); + } + } + } + } + } \ No newline at end of file