feat: scc流程不分发导入

This commit is contained in:
2024-07-19 11:33:18 +08:00
parent 98e95db7b2
commit 546f1364e1
9 changed files with 219 additions and 11 deletions
@@ -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";
}
@@ -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<Pro
@AutoLog(value = "法规符合性排查流程-导入")
@ApiOperation(value="法规符合性排查流程-导入", notes="法规符合性排查流程-导入")
@PostMapping("/importExcelWithData")
public Result<?> importExcelWithData(@RequestParam("file") @ApiParam("文件") MultipartFile file) {
public Result<?> importExcelWithData(@RequestParam("file") @ApiParam("文件") MultipartFile file) throws IOException {
Map<String, Object> resultMap = sccService.importExcelWithData(file);
Object flag = resultMap.get("flag");
if (flag == YesOrNoEnum.YES.getValue()) {
@@ -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;
/**
@@ -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<String> obtainFileIds() {
return material != null ? Arrays.asList(material.split(",")) : Collections.emptyList();
}
@@ -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<Process
void exportXls(String taskId, HttpServletResponse response);
void exportXlsWithoutDistribute(String taskId, HttpServletResponse response);
Map<String, Object> importExcelWithData(MultipartFile file);
Map<String, Object> importExcelWithData(MultipartFile file) throws IOException;
}
@@ -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<Proce
private DocumentSplitMapper documentSplitMapper;
@Resource
private ExcelExportUtilPro excelExportUtilPro;
@Resource
private CommonAPI commonAPI;
@Resource
private ExcelUtils excelUtils;
@Value("${jero.path.exportExcelTempPath}")
private String exportExcelTempPath;
@@ -474,7 +487,7 @@ public class ProcessStandardComplianceCheckServiceImpl extends ServiceImpl<Proce
}
}
// @Override
@Override
public void exportXlsWithoutDistribute(String taskId, HttpServletResponse response) {
ProcessInfoVO<ProcessSccVO> handleData = this.getHandleData(taskId);
ProcessSccVO businessInfoDTO = handleData.getBusinessInfoDTO();
@@ -520,14 +533,178 @@ public class ProcessStandardComplianceCheckServiceImpl extends ServiceImpl<Proce
}
@Override
public Map<String, Object> importExcelWithData(MultipartFile file) {
public Map<String, Object> importExcelWithData(MultipartFile file) throws IOException {
List<SysDictItemCore> listDict = commonAPI.getDictItemAll();
Map<String, Object> resultMap = new HashMap<>();
List<String> 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<File> 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<File> excelfilelist = FileUnZip.readImpExcelFile(saveDirectory.getPath());
System.gc();
if (excelfilelist.size() != 1) {
FileUnZip.deleteDir(saveDirectory);
throw new JeroBootException(MessageUtils.getMessage(ResultCommon.IMPORT_TEMPLATE_ERROR));
}
// 数据内容格式校验
Map<String, File> fileMap = new HashMap<>();
// 遍历saveDirectory下的所有文件
LawsCommonServiceImpl.populateFileMap(saveDirectory, saveDirectory, fileMap);
// 获取Excel的header
List<String> 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<WithoutDistributeExcelTemplate> 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<WithoutDistributeExcelTemplate> 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<WithoutDistributeExcelTemplate> list, List<SysDictItemCore> listDict, Map<String, File> fileMap) {
list.forEach(item -> {
item.setResult(excelUtils.translateDictValue("evaluation_result", item.getResult(), listDict));
item.setMaterial(excelUtils.uploadFile(item.getMaterial(), fileMap));
});
}
private List<String> validationList(List<WithoutDistributeExcelTemplate> list, List<SysDictItemCore> listDict, Map<String, File> fileMap) {
List<String> errorMsgs = new ArrayList<>();
int i = 4;
Iterator<WithoutDistributeExcelTemplate> 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<ProcessStandardComplianceCheckDetail> getSplitDataByStandard(ProcessStandardComplianceCheck scc) {
String standardId = scc.getStandardId();
String fileType = scc.getSplitFileSource();
@@ -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<SysDictItemCore> listDict) {
if (StrUtil.isBlank(value)) {
return "";
}
// 检查排查结果
if (!excelUtils.validDict("evaluation_result", value, null, null, true, listDict)) {
return "'评估结果'无效。";
}
return "";
}
public String validMaterial(String value, Map<String, File> fileMap) {
if (StrUtil.isBlank(value)) {
return "";
}
if (!importUtil.fileValid(value, fileMap)) {
return "'佐证材料'无效。";
}
return "";
}
public String uploadFile(String material, Map<String, File> fileMap) {
return importUtil.convertFileIds(material, fileMap);
}
}
@@ -1763,7 +1763,7 @@ public class LawsCommonServiceImpl implements ILawsCommonService {
return lawsTreeNodeService.list(queryWrapper);
}
private static void populateFileMap(File rootDir, File currentDir, Map<String, File> fileMap) {
public static void populateFileMap(File rootDir, File currentDir, Map<String, File> fileMap) {
File[] files = currentDir.listFiles(); // 列出所有文件和子目录
if (files != null) {
for (File file : files) {
@@ -668,7 +668,7 @@ public class ImportUtil {
return cellValue.matches("^[0-9]{4}$");
}
private String convertFileIds(String cellValue, Map<String, File> fileMap) {
public String convertFileIds(String cellValue, Map<String, File> 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<String, File> fileMap) {
public boolean fileValid(String cellValue, Map<String, File> fileMap) {
String[] pathList = cellValue.split(",");
for (String path : pathList) {
// 校验是否真的有这个文件