From 546f1364e1c8b9bc4fbabe406a0e9fb1af502266 Mon Sep 17 00:00:00 2001 From: caihaohan Date: Fri, 19 Jul 2024 11:33:18 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20scc=E6=B5=81=E7=A8=8B=E4=B8=8D=E5=88=86?= =?UTF-8?q?=E5=8F=91=E5=AF=BC=E5=85=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...ocessStandardComplianceCheckConstants.java | 4 + ...cessStandardComplianceCheckController.java | 3 +- .../ProcessStandardComplianceCheckDetail.java | 3 +- .../vo/WithoutDistributeExcelTemplate.java | 5 +- ...ProcessStandardComplianceCheckService.java | 3 +- ...essStandardComplianceCheckServiceImpl.java | 181 +++++++++++++++++- .../modules/activiti/util/ExcelUtils.java | 25 +++ .../service/impl/LawsCommonServiceImpl.java | 2 +- .../modules/laws/common/util/ImportUtil.java | 4 +- 9 files changed, 219 insertions(+), 11 deletions(-) diff --git a/laws-modules/src/main/java/com/jero/modules/activiti/process/standardComplianceCheck/common/ProcessStandardComplianceCheckConstants.java b/laws-modules/src/main/java/com/jero/modules/activiti/process/standardComplianceCheck/common/ProcessStandardComplianceCheckConstants.java index 60f9705a..25e9dd03 100644 --- a/laws-modules/src/main/java/com/jero/modules/activiti/process/standardComplianceCheck/common/ProcessStandardComplianceCheckConstants.java +++ b/laws-modules/src/main/java/com/jero/modules/activiti/process/standardComplianceCheck/common/ProcessStandardComplianceCheckConstants.java @@ -74,9 +74,13 @@ public class ProcessStandardComplianceCheckConstants { public static final String AUTO_TASK_2 = "autoTask_2"; public static final String AUTO_TASK_3 = "autoTask_3"; + // 符合 public static final String CONFORM_TO = "1"; + // 不符合 public static final String DISCREPANCY = "2"; + // 不涉及 public static final String NOT_INVOLVE = "3"; + // 待验证 public static final String TO_BE_VERIFIED = "4"; } diff --git a/laws-modules/src/main/java/com/jero/modules/activiti/process/standardComplianceCheck/controller/ProcessStandardComplianceCheckController.java b/laws-modules/src/main/java/com/jero/modules/activiti/process/standardComplianceCheck/controller/ProcessStandardComplianceCheckController.java index fcc810b9..4f863187 100644 --- a/laws-modules/src/main/java/com/jero/modules/activiti/process/standardComplianceCheck/controller/ProcessStandardComplianceCheckController.java +++ b/laws-modules/src/main/java/com/jero/modules/activiti/process/standardComplianceCheck/controller/ProcessStandardComplianceCheckController.java @@ -35,6 +35,7 @@ import org.springframework.web.servlet.ModelAndView; import javax.annotation.Resource; import javax.servlet.http.HttpServletResponse; +import java.io.IOException; import java.util.ArrayList; import java.util.Arrays; import java.util.List; @@ -198,7 +199,7 @@ public class ProcessStandardComplianceCheckController extends JeroController importExcelWithData(@RequestParam("file") @ApiParam("文件") MultipartFile file) { + public Result importExcelWithData(@RequestParam("file") @ApiParam("文件") MultipartFile file) throws IOException { Map resultMap = sccService.importExcelWithData(file); Object flag = resultMap.get("flag"); if (flag == YesOrNoEnum.YES.getValue()) { diff --git a/laws-modules/src/main/java/com/jero/modules/activiti/process/standardComplianceCheck/entity/ProcessStandardComplianceCheckDetail.java b/laws-modules/src/main/java/com/jero/modules/activiti/process/standardComplianceCheck/entity/ProcessStandardComplianceCheckDetail.java index 5bf0fd1f..8bad9929 100644 --- a/laws-modules/src/main/java/com/jero/modules/activiti/process/standardComplianceCheck/entity/ProcessStandardComplianceCheckDetail.java +++ b/laws-modules/src/main/java/com/jero/modules/activiti/process/standardComplianceCheck/entity/ProcessStandardComplianceCheckDetail.java @@ -159,8 +159,7 @@ public class ProcessStandardComplianceCheckDetail implements Serializable { * 整改周期 */ @ApiModelProperty(value = "整改周期") - @Dict(dicCode = "correction_period") - @Excel(name = "整改方案", width = 15, orderNum = "11", dicCode = "correction_period") + @Excel(name = "整改周期", width = 15, orderNum = "11") private String correctionPeriod; /** diff --git a/laws-modules/src/main/java/com/jero/modules/activiti/process/standardComplianceCheck/entity/vo/WithoutDistributeExcelTemplate.java b/laws-modules/src/main/java/com/jero/modules/activiti/process/standardComplianceCheck/entity/vo/WithoutDistributeExcelTemplate.java index 6b80a93b..85e592de 100644 --- a/laws-modules/src/main/java/com/jero/modules/activiti/process/standardComplianceCheck/entity/vo/WithoutDistributeExcelTemplate.java +++ b/laws-modules/src/main/java/com/jero/modules/activiti/process/standardComplianceCheck/entity/vo/WithoutDistributeExcelTemplate.java @@ -77,8 +77,7 @@ public class WithoutDistributeExcelTemplate { * 整改周期 */ @ApiModelProperty(value = "整改周期") - @Dict(dicCode = "correction_period") - @Excel(name = "整改方案", width = 15, orderNum = "9", dicCode = "correction_period") + @Excel(name = "整改方案", width = 15, orderNum = "9") private String correctionPeriod; /** @@ -124,6 +123,8 @@ public class WithoutDistributeExcelTemplate { @Dict(dictTable = "oss_file", dicCode = "id", dicText = "file_name") private String material; + private String sort; + public List obtainFileIds() { return material != null ? Arrays.asList(material.split(",")) : Collections.emptyList(); } diff --git a/laws-modules/src/main/java/com/jero/modules/activiti/process/standardComplianceCheck/service/IProcessStandardComplianceCheckService.java b/laws-modules/src/main/java/com/jero/modules/activiti/process/standardComplianceCheck/service/IProcessStandardComplianceCheckService.java index f1ef49c0..bb7e4b45 100644 --- a/laws-modules/src/main/java/com/jero/modules/activiti/process/standardComplianceCheck/service/IProcessStandardComplianceCheckService.java +++ b/laws-modules/src/main/java/com/jero/modules/activiti/process/standardComplianceCheck/service/IProcessStandardComplianceCheckService.java @@ -9,6 +9,7 @@ import org.activiti.engine.delegate.DelegateTask; import org.springframework.web.multipart.MultipartFile; import javax.servlet.http.HttpServletResponse; +import java.io.IOException; import java.util.List; import java.util.Map; @@ -34,5 +35,5 @@ public interface IProcessStandardComplianceCheckService extends IService importExcelWithData(MultipartFile file); + Map importExcelWithData(MultipartFile file) throws IOException; } diff --git a/laws-modules/src/main/java/com/jero/modules/activiti/process/standardComplianceCheck/service/impl/ProcessStandardComplianceCheckServiceImpl.java b/laws-modules/src/main/java/com/jero/modules/activiti/process/standardComplianceCheck/service/impl/ProcessStandardComplianceCheckServiceImpl.java index 2e4fb15d..dfbd2b8c 100644 --- a/laws-modules/src/main/java/com/jero/modules/activiti/process/standardComplianceCheck/service/impl/ProcessStandardComplianceCheckServiceImpl.java +++ b/laws-modules/src/main/java/com/jero/modules/activiti/process/standardComplianceCheck/service/impl/ProcessStandardComplianceCheckServiceImpl.java @@ -5,10 +5,14 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.jero.common.api.CommonAPI; +import com.jero.common.api.vo.ResultCommon; import com.jero.common.constant.enums.YesOrNoEnum; import com.jero.common.exception.JeroBootException; import com.jero.common.system.vo.LoginUser; +import com.jero.common.system.vo.SysDictItemCore; import com.jero.common.util.FileUtils; +import com.jero.common.util.MessageUtils; import com.jero.common.util.MinioUtil; import com.jero.common.util.ZipUtil; import com.jero.modules.activiti.common.ActivitiCommon; @@ -33,6 +37,7 @@ import com.jero.modules.activiti.process.standardComplianceCheck.service.IProces import com.jero.modules.activiti.process.standardComplianceCheck.service.IProcessStandardComplianceCheckService; import com.jero.modules.activiti.service.ProcessNodeLinkService; import com.jero.modules.activiti.util.ExcelUtils; +import com.jero.modules.laws.common.service.impl.LawsCommonServiceImpl; import com.jero.modules.laws.documenttool.entity.LawsDocumentSplit; import com.jero.modules.laws.documenttool.mapper.DocumentSplitMapper; import com.jero.modules.laws.documenttool.service.IDocumentSplitService; @@ -40,11 +45,13 @@ import com.jero.modules.laws.enterprise.util.BeanCopyUtils; import com.jero.modules.laws.utils.ExcelExportUtilPro; import com.jero.modules.oss.entity.OSSFile; import com.jero.modules.oss.service.IOSSFileService; +import com.jero.modules.split.common.FileUnZip; import com.jero.modules.split.entity.SarFileSplitInfoEO; import com.jero.modules.split.service.ISarFileSplitInfoService; import com.jero.modules.sys.utils.UserUtils; import com.jero.modules.system.entity.SysDepart; import com.jero.modules.system.service.ISysDepartService; +import lombok.Cleanup; import lombok.extern.slf4j.Slf4j; import org.activiti.engine.RuntimeService; import org.activiti.engine.TaskService; @@ -68,6 +75,8 @@ import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; +import java.nio.file.Files; +import java.nio.file.Path; import java.util.*; import java.util.stream.Collectors; @@ -109,6 +118,10 @@ public class ProcessStandardComplianceCheckServiceImpl extends ServiceImpl handleData = this.getHandleData(taskId); ProcessSccVO businessInfoDTO = handleData.getBusinessInfoDTO(); @@ -520,14 +533,178 @@ public class ProcessStandardComplianceCheckServiceImpl extends ServiceImpl importExcelWithData(MultipartFile file) { + public Map importExcelWithData(MultipartFile file) throws IOException { + List listDict = commonAPI.getDictItemAll(); Map resultMap = new HashMap<>(); + List errorMsgs = new ArrayList<>(); + // 判断上传的是不是压缩包 + if (!Objects.requireNonNull(file.getOriginalFilename()).toLowerCase().endsWith(".zip")) { + throw new JeroBootException(MessageUtils.getMessage(ResultCommon.PLEASE_UPLOAD_ZIP)); + } + Path path = Files.createTempDirectory("temp"); + File saveDirectory = new File(path.toUri()); + if (!saveDirectory.isDirectory()) { + boolean mkdir = saveDirectory.mkdir(); + } + org.apache.commons.io.FileUtils.copyInputStreamToFile(file.getInputStream(), + new File(path + File.separator + file.getOriginalFilename())); + // 解压缩 + FileUnZip.unZipFiles(path + File.separator + file.getOriginalFilename(), String.valueOf(path)); + List fileList = new ArrayList<>(); + for (File file1 : Objects.requireNonNull(saveDirectory.listFiles())) { + if (file1.getName().contains(".xls") || file1.getName().contains(".xlsx")) { + fileList.add(file1); + } + } + if (fileList.isEmpty()) { + FileUnZip.deleteDir(saveDirectory); + throw new JeroBootException(MessageUtils.getMessage(ResultCommon.IMPORT_TEMPLATE_ERROR)); + } else if (fileList.size() > 1) { + FileUnZip.deleteDir(saveDirectory); + throw new JeroBootException(MessageUtils.getMessage(ResultCommon.IMPORT_TEMPLATE_ERROR)); + } + List excelfilelist = FileUnZip.readImpExcelFile(saveDirectory.getPath()); + System.gc(); + if (excelfilelist.size() != 1) { + FileUnZip.deleteDir(saveDirectory); + throw new JeroBootException(MessageUtils.getMessage(ResultCommon.IMPORT_TEMPLATE_ERROR)); + } + // 数据内容格式校验 + Map fileMap = new HashMap<>(); + // 遍历saveDirectory下的所有文件 + LawsCommonServiceImpl.populateFileMap(saveDirectory, saveDirectory, fileMap); + // 获取Excel的header + List headers; + try { + headers = ExcelUtils.getHeaderFromExcel(file.getInputStream(), 0); + } catch (Exception e) { + errorMsgs.add("模板错误,请按照系统模板导入!"); + resultMap.put("msg", errorMsgs); + resultMap.put("flag", YesOrNoEnum.NO.getValue()); + log.error(e.getMessage(), e); + return resultMap; // 返回错误信息 + } + + // 使用静态方法验证header + boolean isMatched = headers.equals(ExcelUtils.getSortedHeadersFromClass(WithoutDistributeExcelTemplate.class)); + if (!isMatched) { + errorMsgs.add("模板错误,请按照系统模板导入!"); + resultMap.put("msg", errorMsgs); + resultMap.put("flag", YesOrNoEnum.NO.getValue()); + return resultMap; // 返回错误信息 + } + + ImportParams params = new ImportParams(); + params.setTitleRows(0); + params.setHeadRows(1); + params.setNeedSave(true); + + try { + @Cleanup + InputStream inputStream = Files.newInputStream(excelfilelist.get(0).toPath()); + List list = ExcelImportUtil + .importExcel(inputStream, WithoutDistributeExcelTemplate.class, params); + list.remove(0); + list.remove(0); + if (list.isEmpty()) { + errorMsgs.add("文件暂无数据,请检查后重试。"); + resultMap.put("msg", errorMsgs); + resultMap.put("flag", YesOrNoEnum.NO.getValue()); + return resultMap; // 返回错误信息 + } + // 批量检查数据是否有效 + errorMsgs = this.validationList(list, listDict, fileMap); + if (!errorMsgs.isEmpty()) { + resultMap.put("msg", errorMsgs); + resultMap.put("flag", YesOrNoEnum.NO.getValue()); + } else { + resultMap.put("flag", YesOrNoEnum.YES.getValue()); + // 转换为字典值 + this.transToDictValue(list, listDict, fileMap); + // 清洗 + this.cleanData(list); + resultMap.put("dataList", list); + } + } catch (Exception e) { + errorMsgs.add("文件导入异常:" + e.getMessage()); + resultMap.put("msg", errorMsgs); + resultMap.put("flag", YesOrNoEnum.NO.getValue()); + log.error(e.getMessage(), e); + } return resultMap; } + private void cleanData(List list) { + list.forEach(item -> { + String result = item.getResult(); + if (StrUtil.isBlank(result)) { + item.setUnsatisfiedRequire(null); + item.setCorrectionSolution(null); + item.setCorrectionCost(null); + item.setCommonality(null); + item.setCommonalityCost(null); + item.setRemark(null); + item.setMaterial(null); + } + switch (result) { + case CONFORM_TO: + case NOT_INVOLVE: + item.setUnsatisfiedRequire(null); + item.setCorrectionSolution(null); + item.setCorrectionCost(null); + item.setCommonality(null); + item.setCommonalityCost(null); + break; + case DISCREPANCY: + case TO_BE_VERIFIED: + item.setRemark(null); + item.setMaterial(null); + } + }); + } + + private void transToDictValue(List list, List listDict, Map fileMap) { + list.forEach(item -> { + item.setResult(excelUtils.translateDictValue("evaluation_result", item.getResult(), listDict)); + item.setMaterial(excelUtils.uploadFile(item.getMaterial(), fileMap)); + }); + } + + private List validationList(List list, List listDict, Map fileMap) { + List errorMsgs = new ArrayList<>(); + int i = 4; + Iterator iterator = list.iterator(); + while (iterator.hasNext()) { + WithoutDistributeExcelTemplate data = iterator.next(); + if (ExcelUtils.isEmptyRow(data)) { + iterator.remove(); + if (list.isEmpty()) { + errorMsgs.add("文件暂无数据,请检查后重试。"); + } + continue; + } + String result = data.getResult(); + String material = data.getMaterial(); + + StringBuilder errMsgHeader = new StringBuilder(); + StringBuilder errMsg = new StringBuilder(); + data.setSort(String.valueOf(i++)); + errMsgHeader.append("第").append(data.getSort()).append("行"); + + // 检查所有数据字典校验的字段 + errMsg.append(excelUtils.validResult(result, listDict)); + errMsg.append(excelUtils.validMaterial(material, fileMap)); + // 如果数据有问题,则将提示信息添加到 errorMsgs 中 + if (errMsg.length() > 0) { + errorMsgs.add(errMsgHeader.append(errMsg).toString()); + } + } + return errorMsgs; + } + private List getSplitDataByStandard(ProcessStandardComplianceCheck scc) { String standardId = scc.getStandardId(); String fileType = scc.getSplitFileSource(); diff --git a/laws-modules/src/main/java/com/jero/modules/activiti/util/ExcelUtils.java b/laws-modules/src/main/java/com/jero/modules/activiti/util/ExcelUtils.java index b25a836c..071fd070 100644 --- a/laws-modules/src/main/java/com/jero/modules/activiti/util/ExcelUtils.java +++ b/laws-modules/src/main/java/com/jero/modules/activiti/util/ExcelUtils.java @@ -28,6 +28,7 @@ import org.springframework.util.StringUtils; import javax.annotation.Resource; import javax.servlet.http.HttpServletResponse; +import java.io.File; import java.io.InputStream; import java.lang.reflect.Field; import java.util.*; @@ -531,4 +532,28 @@ public class ExcelUtils { } } + public String validResult(String value, List listDict) { + if (StrUtil.isBlank(value)) { + return ""; + } + // 检查排查结果 + if (!excelUtils.validDict("evaluation_result", value, null, null, true, listDict)) { + return "'评估结果'无效。"; + } + return ""; + } + + public String validMaterial(String value, Map fileMap) { + if (StrUtil.isBlank(value)) { + return ""; + } + if (!importUtil.fileValid(value, fileMap)) { + return "'佐证材料'无效。"; + } + return ""; + } + + public String uploadFile(String material, Map fileMap) { + return importUtil.convertFileIds(material, fileMap); + } } diff --git a/laws-modules/src/main/java/com/jero/modules/laws/common/service/impl/LawsCommonServiceImpl.java b/laws-modules/src/main/java/com/jero/modules/laws/common/service/impl/LawsCommonServiceImpl.java index 07aef6ea..98851b97 100644 --- a/laws-modules/src/main/java/com/jero/modules/laws/common/service/impl/LawsCommonServiceImpl.java +++ b/laws-modules/src/main/java/com/jero/modules/laws/common/service/impl/LawsCommonServiceImpl.java @@ -1763,7 +1763,7 @@ public class LawsCommonServiceImpl implements ILawsCommonService { return lawsTreeNodeService.list(queryWrapper); } - private static void populateFileMap(File rootDir, File currentDir, Map fileMap) { + public static void populateFileMap(File rootDir, File currentDir, Map fileMap) { File[] files = currentDir.listFiles(); // 列出所有文件和子目录 if (files != null) { for (File file : files) { diff --git a/laws-modules/src/main/java/com/jero/modules/laws/common/util/ImportUtil.java b/laws-modules/src/main/java/com/jero/modules/laws/common/util/ImportUtil.java index e28ccf85..1027a2a3 100644 --- a/laws-modules/src/main/java/com/jero/modules/laws/common/util/ImportUtil.java +++ b/laws-modules/src/main/java/com/jero/modules/laws/common/util/ImportUtil.java @@ -668,7 +668,7 @@ public class ImportUtil { return cellValue.matches("^[0-9]{4}$"); } - private String convertFileIds(String cellValue, Map fileMap) { + public String convertFileIds(String cellValue, Map fileMap) { String[] pathList = cellValue.split(","); StringBuilder fileIds = new StringBuilder(); for (String path : pathList) { @@ -806,7 +806,7 @@ public class ImportUtil { } // 文件校验 - private boolean fileValid(String cellValue, Map fileMap) { + public boolean fileValid(String cellValue, Map fileMap) { String[] pathList = cellValue.split(","); for (String path : pathList) { // 校验是否真的有这个文件