Browse Source

导入

master
zxc 3 years ago
parent
commit
b0b155c1d1
  1. 2
      epmet-commons/epmet-commons-tools/src/main/java/com/epmet/commons/tools/enums/DictTypeEnum.java
  2. 1
      epmet-module/epmet-common-service/common-service-client/src/main/java/com/epmet/constants/ImportTaskConstants.java
  3. 70
      epmet-user/epmet-user-server/src/main/java/com/epmet/controller/IcDangerAreaController.java
  4. 34
      epmet-user/epmet-user-server/src/main/java/com/epmet/excel/IcDangerAreaImportExcel.java
  5. 130
      epmet-user/epmet-user-server/src/main/java/com/epmet/excel/handler/IcDangerAreaExcelImportListener.java
  6. 3
      epmet-user/epmet-user-server/src/main/java/com/epmet/service/IcDangerAreaService.java
  7. 123
      epmet-user/epmet-user-server/src/main/java/com/epmet/service/impl/IcDangerAreaServiceImpl.java

2
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),

1
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";
// 新冠病毒疫苗接种人员信息台账

70
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<PageData<IcDangerAreaDTO>> page(@RequestParam Map<String, Object> 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();
}
}

34
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;
}
}

130
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<IcDangerAreaImportExcel> {
public static final int MAX_THRESHOLD = 200;
private String customerId = "";
private Map<String,String> dangerLevelMap = null;
private List<IcDangerAreaEntity> datas = new ArrayList<>();
private List<IcDangerAreaImportExcel.IcDangerAreaError> errorRows = new ArrayList<>();
@Autowired
private IcDangerAreaService icDangerAreaService;
@Autowired
private IcDangerAreaDao icDangerAreaDao;
public IcDangerAreaExcelImportListener(Map<String,String> 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<IcDangerAreaEntity> 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<IcDangerAreaImportExcel.IcDangerAreaError> getErrorRows() {
return errorRows;
}
}

3
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<IcDangerAreaEntity> {
* @date 2022-10-31
*/
void delete(List<String> ids,String staffId);
void execAsyncExcelImport(Path fileSavePath, String taskId, String customerId, String userId);
}

123
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<IcDangerAreaDao, IcDangerAreaEntity> implements IcDangerAreaService {
@Autowired
private EpmetAdminOpenFeignClient adminOpenFeignClient;
@Autowired
private OssFeignClient ossFeignClient;
@Autowired
private EpmetCommonServiceOpenFeignClient commonServiceOpenFeignClient;
@Override
public PageData<IcDangerAreaDTO> page(Map<String, Object> params) {
IPage<IcDangerAreaEntity> page = baseDao.selectPage(
@ -139,4 +173,85 @@ public class IcDangerAreaServiceImpl extends BaseServiceImpl<IcDangerAreaDao, Ic
baseDao.update(null,updateWrapper);
}
@Override
@Async
public void execAsyncExcelImport(Path fileSavePath, String taskId, String customerId, String userId) {
try {
//获取当前登录用户所属组织id
CustomerStaffInfoCacheResult staffInfo = CustomerStaffRedis.getStaffInfo(customerId, userId);
if (null == staffInfo){
throw new EpmetException("未查询到工作人员信息:"+userId);
}
// 字典表
Result<List<SysDictDataDTO>> dictMapRes = adminOpenFeignClient.dictDataList(DictTypeEnum.DANGER_AREA_LEVEL_TYPE.getCode());
Map<String, String> 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<IcDangerAreaImportExcel.IcDangerAreaError> 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<UploadImgResultDTO> 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);
}
}
}
}
}
Loading…
Cancel
Save