From 64cee85a9ccd7ff9922e59cf43499d0c6be63cb1 Mon Sep 17 00:00:00 2001 From: yjz <3131811435@qq.com> Date: Fri, 28 Jun 2024 19:41:29 +0800 Subject: [PATCH] =?UTF-8?q?fix(=E6=96=87=E6=A1=A3=E6=8B=86=E5=88=86):=20?= =?UTF-8?q?=E5=AF=BC=E5=85=A5=E3=80=81=E4=B8=8B=E8=BD=BD=E5=AF=BC=E5=85=A5?= =?UTF-8?q?=E6=A8=A1=E6=9D=BF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../modules/system/entity/SysDictItem.java | 17 +- .../impl/DocumentSplitServiceImpl.java | 241 +++++++++++++----- .../laws/standard/entity/PartName.java | 15 +- .../impl/FileSplitItemsEOServiceImpl.java | 197 +++++++++++++- .../resources/excelTemplate/条款导入模板.xlsx | Bin 0 -> 38484 bytes 5 files changed, 392 insertions(+), 78 deletions(-) create mode 100644 laws-modules/src/main/resources/excelTemplate/条款导入模板.xlsx diff --git a/laws-module-system/src/main/java/com/jero/modules/system/entity/SysDictItem.java b/laws-module-system/src/main/java/com/jero/modules/system/entity/SysDictItem.java index a6063732..da368cc3 100644 --- a/laws-module-system/src/main/java/com/jero/modules/system/entity/SysDictItem.java +++ b/laws-module-system/src/main/java/com/jero/modules/system/entity/SysDictItem.java @@ -4,10 +4,12 @@ import com.baomidou.mybatisplus.annotation.*; import com.jero.common.aspect.annotation.Dict; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; -import java.util.Date; import lombok.Data; import org.jeecgframework.poi.excel.annotation.Excel; +import java.util.Date; +import java.util.List; + /** * @author liJiaRao * @date 2023-11-20 15:46 @@ -162,4 +164,15 @@ public class SysDictItem { private String pId; @TableField(exist = false) private String dictCode; -} \ No newline at end of file + + /** + * 层级 + */ + @TableField(exist = false) + private String levelPath; + /** + * 层级 + */ + @TableField(exist = false) + private List childrenList; +} diff --git a/laws-modules/src/main/java/com/jero/modules/laws/documenttool/service/impl/DocumentSplitServiceImpl.java b/laws-modules/src/main/java/com/jero/modules/laws/documenttool/service/impl/DocumentSplitServiceImpl.java index a67f0c6d..891f5bee 100644 --- a/laws-modules/src/main/java/com/jero/modules/laws/documenttool/service/impl/DocumentSplitServiceImpl.java +++ b/laws-modules/src/main/java/com/jero/modules/laws/documenttool/service/impl/DocumentSplitServiceImpl.java @@ -66,11 +66,8 @@ import com.jero.modules.tag.enums.TableNameEnum; import lombok.extern.slf4j.Slf4j; import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.StringUtils; -import org.apache.poi.hssf.usermodel.HSSFDataFormat; import org.apache.poi.ss.usermodel.*; -import org.apache.poi.ss.util.CellRangeAddress; import org.apache.poi.xssf.usermodel.XSSFRichTextString; -import org.apache.poi.xssf.usermodel.XSSFSheet; import org.apache.poi.xssf.usermodel.XSSFWorkbook; import org.apache.shiro.SecurityUtils; import org.jetbrains.annotations.NotNull; @@ -81,6 +78,7 @@ import org.jsoup.select.Elements; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; +import org.springframework.core.io.ClassPathResource; import org.springframework.stereotype.Service; import org.springframework.transaction.PlatformTransactionManager; import org.springframework.transaction.TransactionDefinition; @@ -94,6 +92,7 @@ import javax.servlet.http.HttpServletResponse; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; +import java.io.InputStream; import java.text.SimpleDateFormat; import java.util.*; import java.util.concurrent.atomic.AtomicReference; @@ -135,6 +134,37 @@ public class DocumentSplitServiceImpl implements IDocumentSplitService { private static final String ITEM_NUM = "item_num"; private static final String ITEM_TITLE = "item_title"; private static final String ITEM_CONTENT = "item_content"; + private static final String TRANSLATION = "translation"; + private static final String IS_SAME_AS_PREV_VERSION = "is_same_as_prev_version"; + private static final String CHANGE_DESCRIPTION = "change_description"; + private static final String REGULATORY_NOTES = "regulatory_notes"; + private static final String KEYWORDS = "keywords"; + private static final String KEY_CONTROLLER = "key_controller"; + private static final String APPLICABLE_COMPONENTS = "applicable_components"; + private static final String RESPONSIBLE_DEPARTMENT = "responsible_department"; + private static final String RESPONSIBLE_MODULE = "responsible_module"; + private static final String RELATED_DEPARTMENT = "related_department"; + private static final String RELATED_MODULE = "related_module"; + private static final String APPLICATIONS = "applications"; + private static final String POWER_TYPE = "power_type"; + private static final String DOMAIN_AREA = "domain_area"; + private static final String CONFIGURATION_REQUIREMENTS = "configuration_requirements"; + private static final String NEW_CER_IMPLEMENT_DATE = "new_cer_implement_date"; + private static final String NEW_PRODUCTION_IMPLEMENTATION = "new_production_implementation"; + private static final String REGISTRATION_DATE = "registration_date"; + private static final String ENTERPRISE_STANDARD = "enterprise_standard"; + private static final String TECHNICAL_SPECIFICATION_DESIGN_GUIDE = "technical_specification_design_guide"; + private static final String DRAWING_TEMPLATE = "drawing_template"; + private static final String TECHNICAL_AGREEMENT_TEMPLATE = "technical_agreement_template"; + private static final String VERIFICATION_REPORT_TEMPLATE_CHECKLIST = "verification_report_template_checklist"; + private static final String DVP_TEMPLATE = "dvp_template"; + private static final String DFEMA = "dfema"; + private static final String KEY_TECHNOLOGY_DECOMPOSITION_TABLE = "key_technology_decomposition_table"; + private static final String OTHER_DOCUMENTS_TEMPLATES = "other_documents_templates"; + private static final String INVESTIGATION_STAGE = "investigation_stage"; + private static final String P3 = "p3"; + private static final String P5 = "p5"; + private static final String REMARKSS = "remarkss"; private static final String INTERPRETATION_ARTICLES = "interpretation_articles"; private static final String INTERPRETATION_ARTICLES_LIST = "interpretationArticlesList"; private static final String MENU_ID = "menu_id"; @@ -372,6 +402,18 @@ public class DocumentSplitServiceImpl implements IDocumentSplitService { List partNames = partNameService.queryEcho(applicableComponents); map.put("applicable_components_dictText", partNames.stream().map(PartName::getName).collect(Collectors.joining(","))); } + // 涉及系统/部件(关键词) + if (map.containsKey("keywords")){ + String applicableComponents = (String) map.get("keywords"); + List partNames = partNameService.queryEcho(applicableComponents); + map.put("keywords_dictText", partNames.stream().map(PartName::getName).collect(Collectors.joining(","))); + } + // 关键控制器 + if (map.containsKey("key_controller")){ + String applicableComponents = (String) map.get("key_controller"); + List partNames = partNameService.queryEcho(applicableComponents); + map.put("key_controller_dictText", partNames.stream().map(PartName::getName).collect(Collectors.joining(","))); + } // 属性标识翻译 if (map.containsKey("property_tag")){ String propertyTag = (String) map.get("property_tag"); @@ -738,14 +780,76 @@ public class DocumentSplitServiceImpl implements IDocumentSplitService { // 第一条数据 Map firstData = listMap.get(0); listMap.remove(0); - // 合并数据(条文标题、条文内容) - String title = firstData.get(ITEM_TITLE) + " " + mergeData(listMap, ITEM_TITLE); - String content = firstData.get(ITEM_CONTENT) + mergeData(listMap, ITEM_CONTENT); + // 合并数据(条文标题、条文内容、等全部字段) + String title = firstData.get(ITEM_TITLE) + " " + mergeData(listMap, ITEM_TITLE, false); + String content = firstData.get(ITEM_CONTENT) + mergeData(listMap, ITEM_CONTENT, false); + listMap.add(0, firstData); + String translation = firstData.get(TRANSLATION) + mergeData(listMap, TRANSLATION, false); + String changeDescription = firstData.get(CHANGE_DESCRIPTION) + mergeData(listMap, CHANGE_DESCRIPTION, false); + String regulatoryNotes = firstData.get(REGULATORY_NOTES) + mergeData(listMap, REGULATORY_NOTES, false); + String keywords = firstData.get(KEYWORDS) + mergeData(listMap, KEYWORDS, true); + String keyController = mergeData2(listMap, KEY_CONTROLLER, true); + String applicableComponents = mergeData2(listMap, APPLICABLE_COMPONENTS, true); + String responsibleDepartment = mergeData2(listMap, RESPONSIBLE_DEPARTMENT, true); + String responsibleModule = mergeData2(listMap, RESPONSIBLE_MODULE, true); + String relatedDepartment = mergeData2(listMap, RELATED_DEPARTMENT, true); + String relatedModule = mergeData2(listMap, RELATED_MODULE, true); + String applications = mergeData2(listMap, APPLICATIONS, true); + String powerType = mergeData2(listMap, POWER_TYPE, true); + String domainArea = mergeData2(listMap, DOMAIN_AREA, true); + String configurationRequirements = mergeData2(listMap, CONFIGURATION_REQUIREMENTS, true); + String newCerImplementDate = mergeData2(listMap, NEW_CER_IMPLEMENT_DATE, true); + String newProductionImplementation = mergeData2(listMap, NEW_PRODUCTION_IMPLEMENTATION, true); + String registrationDate = mergeData2(listMap, REGISTRATION_DATE, true); + String enterpriseStandard = mergeData2(listMap, ENTERPRISE_STANDARD, true); + String technicalSpecificationDesignGuide = mergeData2(listMap, TECHNICAL_SPECIFICATION_DESIGN_GUIDE, true); + String drawingTemplate = firstData.get(DRAWING_TEMPLATE) + mergeData(listMap, DRAWING_TEMPLATE, false); + String technicalAgreementTemplate = firstData.get(TECHNICAL_AGREEMENT_TEMPLATE) + mergeData(listMap, TECHNICAL_AGREEMENT_TEMPLATE, false); + String verificationReportTemplateChecklist = firstData.get(VERIFICATION_REPORT_TEMPLATE_CHECKLIST) + mergeData(listMap, VERIFICATION_REPORT_TEMPLATE_CHECKLIST, false); + String dvpTemplate = firstData.get(DVP_TEMPLATE) + mergeData(listMap, DVP_TEMPLATE, false); + String dfema = firstData.get(DFEMA) + mergeData(listMap, DFEMA, false); + String keyTechnologyDecompositionTable = firstData.get(KEY_TECHNOLOGY_DECOMPOSITION_TABLE) + mergeData(listMap, KEY_TECHNOLOGY_DECOMPOSITION_TABLE, false); + String otherDocumentsTemplates = firstData.get(OTHER_DOCUMENTS_TEMPLATES) + mergeData(listMap, OTHER_DOCUMENTS_TEMPLATES, false); + String investigationStage = firstData.get(INVESTIGATION_STAGE) + mergeData(listMap, INVESTIGATION_STAGE, false); + String p3 = firstData.get(this.P3) + mergeData(listMap, this.P3, false); + String p5 = firstData.get(this.P5) + mergeData(listMap, this.P5, false); + String remarkss = firstData.get(REMARKSS) + mergeData(listMap, REMARKSS, false); String updateByAndUpdateTime = new UniversalImpl().getUpdateByAndUpdateTime(); String updateSet = updateByAndUpdateTime + "," + ITEM_TITLE + " = " + "' "+ title + "'" + - "," + ITEM_CONTENT + " = " + "'" + content + "'"; + "," + ITEM_CONTENT + " = " + "'" + content + "'" + + "," + TRANSLATION + " = " + "'" + translation + "'" + + "," + CHANGE_DESCRIPTION + " = " + "'" + changeDescription + "'" + + "," + REGULATORY_NOTES + " = " + "'" + regulatoryNotes + "'" + + "," + KEYWORDS + " = " + "'" + keywords + "'" + + "," + KEY_CONTROLLER + " = " + "'" + keyController + "'" + + "," + APPLICABLE_COMPONENTS + " = " + "'" + applicableComponents + "'" + + "," + RESPONSIBLE_DEPARTMENT + " = " + "'" + responsibleDepartment + "'" + + "," + RESPONSIBLE_MODULE + " = " + "'" + responsibleModule + "'" + + "," + RELATED_DEPARTMENT + " = " + "'" + relatedDepartment + "'" + + "," + RELATED_MODULE + " = " + "'" + relatedModule + "'" + + "," + APPLICATIONS + " = " + "'" + applications + "'" + + "," + POWER_TYPE + " = " + "'" + powerType + "'" + + "," + DOMAIN_AREA + " = " + "'" + domainArea + "'" + + "," + CONFIGURATION_REQUIREMENTS + " = " + "'" + configurationRequirements + "'" + + "," + NEW_CER_IMPLEMENT_DATE + " = " + "'" + newCerImplementDate + "'" + + "," + NEW_PRODUCTION_IMPLEMENTATION + " = " + "'" + newProductionImplementation + "'" + + "," + REGISTRATION_DATE + " = " + "'" + registrationDate + "'" + + "," + ENTERPRISE_STANDARD + " = " + "'" + enterpriseStandard + "'" + + "," + TECHNICAL_SPECIFICATION_DESIGN_GUIDE + " = " + "'" + technicalSpecificationDesignGuide + "'" + + "," + DRAWING_TEMPLATE + " = " + "'" + drawingTemplate + "'" + + "," + TECHNICAL_AGREEMENT_TEMPLATE + " = " + "'" + technicalAgreementTemplate + "'" + + "," + VERIFICATION_REPORT_TEMPLATE_CHECKLIST + " = " + "'" + verificationReportTemplateChecklist + "'" + + "," + DVP_TEMPLATE + " = " + "'" + dvpTemplate + "'" + + "," + DFEMA + " = " + "'" + dfema + "'" + + "," + KEY_TECHNOLOGY_DECOMPOSITION_TABLE + " = " + "'" + keyTechnologyDecompositionTable + "'" + + "," + OTHER_DOCUMENTS_TEMPLATES + " = " + "'" + otherDocumentsTemplates + "'" + + "," + INVESTIGATION_STAGE + " = " + "'" + investigationStage + "'" + + "," + P3 + " = " + "'" + p3 + "'" + + "," + P5 + " = " + "'" + p5 + "'" + + "," + REMARKSS + " = " + "'" + remarkss + "'"; String updateCondition = "id = " + "'" + firstData.get(ID) + "'"; + listMap.remove(0); // 修改数据 documentSplitMapper.editDocumentSplitDetail(updateSet, updateCondition); List otherIds = listMap.stream().map(v -> (String)v.get(ID)).collect(Collectors.toList()); @@ -908,63 +1012,53 @@ public class DocumentSplitServiceImpl implements IDocumentSplitService { public void downloadImportTemplate(HttpServletRequest request, HttpServletResponse response) { // 水平越权 isHorizontalOverstep(request.getParameter("infoId")); - - try (Workbook workbook = new XSSFWorkbook()){ - String fileName = "拆分导入模版下载.xlsx"; - // sheet页 - XSSFSheet sheet = (XSSFSheet) workbook.createSheet("拆分导入模版"); - // 列宽 - sheet.setDefaultColumnWidth(16); - // 创建第一行 - Row headerRow = sheet.createRow(0); - // 创建表头信息 - String[] titleArr = {"条文号", "条文标题", "条文内容"}; - - //样式 - CellStyle cellStyle = workbook.createCellStyle(); - // 水平、垂直居中 - cellStyle.setAlignment(HorizontalAlignment.CENTER); - cellStyle.setVerticalAlignment(VerticalAlignment.CENTER); - // 文本格式 - cellStyle.setDataFormat(HSSFDataFormat.getBuiltinFormat("@")); - - for (int i = 0; i < titleArr.length; i++) { - // 创建列 - Cell cell = headerRow.createCell(i); - cell.setCellValue(titleArr[i]); - cell.setCellStyle(cellStyle); + ClassPathResource resource = new ClassPathResource("excelTemplate/条款导入模板.xlsx"); + // 设置HTTP响应头,包括文件大小和内容类型 + response.setContentType("application/vnd.ms-excel"); // 根据实际文件类型设置内容类型 + response.setHeader("Content-Disposition", "attachment; filename=条款导入模板.xlsx"); + String filePath = ""; + // 将文件内容写入HTTP响应输出流中 + try (InputStream in = resource.getInputStream()) { + // 导出文件 + filePath = exportExcelTempPath + File.separator + "条款导入模板"; + String excelFilePath = filePath + File.separator + "条款导入模板.xlsx"; + writeToLocal(excelFilePath, in); + ZipUtil.toZip(filePath, response.getOutputStream(), response, true); + } catch (IOException e) { + throw new JeroBootException(e); + } finally { + // 删除文件 + if (new File(filePath).exists()) { + FileUtils.deleteFolders(filePath); } + } + } - // 创建第二行 - Row headerRowTwo = sheet.createRow(1); - // 填充说明 - Cell cell = headerRowTwo.createCell(0); - String explain = "模版说明:\n" + - "1.条文号不能为空\n" + - "2.仅支持zip格式文件夹\n" + - "3.条文内容如果导入表格类型,表格的名称需要与sheet页名称保持一致"; - - CellStyle cellStyleTwo = workbook.createCellStyle(); - cellStyleTwo.setWrapText(true); - cell.setCellStyle(cellStyleTwo); - // 行高 - headerRowTwo.setHeight((short) 1500); - cell.setCellValue(new XSSFRichTextString(explain)); - // 合并单元格(参数说明:起始行,结束行,起始列,结束列) - CellRangeAddress region = new CellRangeAddress(1, 1, 0, 2); - sheet.addMergedRegion(region); - - // excel临时保存到本地并在同级创建文件夹 - String replacePath = exportExcelTempPath.replace("exportExcelTemp", "拆分导入模版下载"); - generateExcel(workbook, fileName, replacePath); - - // 生成zip文件返回文件流 - ZipUtil.toZip(replacePath, response.getOutputStream(), response, true); - - //删除指定文件夹 - FileUtils.deleteFolders(replacePath); + /** + * 将InputStream写入本地文件 + * + * @param filePath 写入本地目录 + * @param input 输入流 + * @throws IOException + */ + public void writeToLocal(String filePath, InputStream input) + throws IOException { + // 导出路径 没有则创建 + File saveFile = new File(filePath.substring(0, filePath.lastIndexOf(File.separator))); + if (!saveFile.exists()) { + saveFile.mkdirs(); + } + int index; + byte[] bytes = new byte[1024]; + try (FileOutputStream downloadFile = new FileOutputStream(filePath)){ + while ((index = input.read(bytes)) != -1) { + downloadFile.write(bytes, 0, index); + downloadFile.flush(); + } }catch (Exception e){ - throw new JeroBootException("下载文件失败!"); + log.error("将InputStream写入本地失败:{}", e.getMessage()); + }finally { + input.close(); } } @@ -1398,15 +1492,38 @@ public class DocumentSplitServiceImpl implements IDocumentSplitService { } - private String mergeData(List> listMap, String key) { + private String mergeData(List> listMap, String key, boolean isDistinct) { StringBuilder stringBuilder = new StringBuilder(); + List list = new ArrayList<>(); for (Map map : listMap) { + if (isDistinct){ + // 去重 + String valueString = map.get(key).toString(); + if (list.contains(valueString)){ + continue; + } + list.add(valueString); + } String content = (String) map.get(key); stringBuilder.append(content); } return stringBuilder.toString(); } + private String mergeData2(List> listMap, String key, boolean isDistinct) { + List list = new ArrayList<>(); + for (Map map : listMap) { + String[] split = map.get(key).toString().split(","); + for (String s : split) { + if (isDistinct && list.contains(s)){ + continue; + } + list.add(s); + } + } + return String.join(",", list); + } + @Override public void saveDocumentSplitInfo(SarFileSplitInfoEO sarFileSplitInfoEO) { LoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal(); diff --git a/laws-modules/src/main/java/com/jero/modules/laws/standard/entity/PartName.java b/laws-modules/src/main/java/com/jero/modules/laws/standard/entity/PartName.java index 3a6a3ac9..cd4bb4d8 100644 --- a/laws-modules/src/main/java/com/jero/modules/laws/standard/entity/PartName.java +++ b/laws-modules/src/main/java/com/jero/modules/laws/standard/entity/PartName.java @@ -4,17 +4,16 @@ import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; - -import java.io.Serializable; -import java.util.Date; -import java.util.List; - import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import lombok.EqualsAndHashCode; import lombok.experimental.Accessors; +import java.io.Serializable; +import java.util.Date; +import java.util.List; + /** * @TableName laws_part_name */ @@ -116,4 +115,10 @@ public class PartName implements Serializable { @TableField(exist = false) private static final long serialVersionUID = 1L; + + /** + * 层级 + */ + @TableField(exist = false) + private String levelPath; } diff --git a/laws-modules/src/main/java/com/jero/modules/split/service/impl/FileSplitItemsEOServiceImpl.java b/laws-modules/src/main/java/com/jero/modules/split/service/impl/FileSplitItemsEOServiceImpl.java index 1f85d3e1..644568de 100644 --- a/laws-modules/src/main/java/com/jero/modules/split/service/impl/FileSplitItemsEOServiceImpl.java +++ b/laws-modules/src/main/java/com/jero/modules/split/service/impl/FileSplitItemsEOServiceImpl.java @@ -51,10 +51,10 @@ import com.jero.modules.split.service.ISarFileSplitInfoService; import com.jero.modules.split.service.ISarFileSplitItemsValEOService; import com.jero.modules.split.service.ISarFileSplitMenuEOService; import com.jero.modules.split.util.POIReadExcelToHtml; -import com.jero.modules.system.entity.SysCategory; -import com.jero.modules.system.entity.SysCategoryTreeVO; -import com.jero.modules.system.entity.SysDictItem; -import com.jero.modules.system.entity.SysUser; +import com.jero.modules.system.entity.*; +import com.jero.modules.system.service.ISysDepartService; +import com.jero.modules.system.service.ISysDictItemService; +import com.jero.modules.system.service.ISysDictService; import com.jero.modules.system.service.ISysUserService; import com.jero.modules.system.service.impl.SysCategoryServiceImpl; import com.jero.modules.system.service.impl.SysDictItemServiceImpl; @@ -146,6 +146,12 @@ public class FileSplitItemsEOServiceImpl extends ServiceImpl SPECIAL_FIELD = Arrays.asList("keywords", "key_controller", "applicable_components"); + @Value("${download.enable}") public void setEnable(boolean enable) { ENCRYPT_ENABLE = enable; @@ -1877,7 +1885,7 @@ public class FileSplitItemsEOServiceImpl extends ServiceImpl map = null; //获得所有数据 - //从第3行开始获取,第一行是表头,第二行是填写说明 - for (int x = 2; x <= totalRowNum; x++) { + //从第4行开始获取,第一行是表头,第二行是填写说明 + for (int x = 3; x <= totalRowNum; x++) { map = new HashMap(); //获得第i行对象 Row row= sheet.getRow(x); @@ -2031,10 +2039,15 @@ public class FileSplitItemsEOServiceImpl extends ServiceImpl sysDictTreeList = sysDictService.list(new LambdaQueryWrapper().eq(SysDict::getAttributeType, "2")); + // 组织结构 + List sysDepartList = sysDepartService.list(); + // 适用零部件 + List partNameList = new ArrayList<>(); //存放数据验证结果信息 List stringMessage = new ArrayList<>(); - int i = 2; //记录行号 + int i = 3; //记录行号 int num = 0; //记录是第几条数据 //循环验证数据 for (Map dto : datas) { @@ -2053,6 +2066,7 @@ public class FileSplitItemsEOServiceImpl extends ServiceImpl valueList = new ArrayList<>(); String field = ""; for (Map map : fieldList) { String fieldName = (String) map.get("db_field_txt");//中文名称/英文名称 @@ -2060,6 +2074,7 @@ public class FileSplitItemsEOServiceImpl extends ServiceImpl first = sysDepartList.stream().filter(o -> v.equals(o.getDepartName())).findFirst(); + if (!first.isPresent()) { + if(MessageUtils.getLanguage().getValue().equals(LanguageEnum.CN.getValue())) { + errorMsg += fieldName + "中组织机构" + v + "不存在;"; + } else { + errorMsg += fieldName + " " + v + "Not exist;"; + } + countError++; + valueList = Collections.emptyList(); + break; + }else { + valueList.add(first.get().getId()); + } + } + } + }else if (FieldTypeEnum.TREE_BOX.getValue().equals(fieldShowType)) { + // 树型结构(多选) + //判断是否必填 + if (IsMustEnum.YES.getValue().equals(mustInput) && StringUtils.isBlank(value)) { + if(MessageUtils.getLanguage().getValue().equals(LanguageEnum.CN.getValue())) { + errorMsg += fieldName + "为必填项,不能为空;"; + } else { + errorMsg += fieldName + " is mandatory and cannot be empty;"; + } + countError++; + } + + if (StringUtils.isNotBlank(value) && StringUtils.isNotBlank(dictField)){ + Optional firstDict = sysDictTreeList.stream().filter(o -> dictField.equals(o.getDictCode())).findFirst(); + if (firstDict.isPresent()){ + List sysDictItemLists = sysDictItemService.list(new LambdaQueryWrapper() + .eq(SysDictItem::getDictId, firstDict.get().getId())); + List sysDictItemList = getLevelPath(sysDictItemLists); + String[] treePathList = value.split(","); + for (String treePath : treePathList) { + List path = + sysDictItemList.stream().filter(o -> treePath.equals(o.getLevelPath())) + .collect(Collectors.toList()); + if (!path.isEmpty()){ + if (path.size() > 1) { + if(MessageUtils.getLanguage().getValue().equals(LanguageEnum.CN.getValue())) { + errorMsg += fieldName + "中" + treePath + "存在多个;"; + countError++; + valueList = Collections.emptyList(); + } else { + errorMsg += fieldName + " " + treePath + "Exist in multiple;"; + } + break; + } + valueList.add(path.get(0).getItemValue()); + }else { + if(MessageUtils.getLanguage().getValue().equals(LanguageEnum.CN.getValue())) { + errorMsg += fieldName + "中" + treePath + "不存在;"; + countError++; + valueList = Collections.emptyList(); + } else { + errorMsg += fieldName + " " + treePath + "Not exist;"; + } + break; + } + } + } + } + } + + // 特殊字段 + if (StringUtils.isNotBlank(value) && SPECIAL_FIELD.contains(dbfieldName)){ + if (partNameList.isEmpty()){ + List partNames = partNameService.list(new LambdaQueryWrapper().ne(PartName::getCode, "Part")); + partNameList = partNameGetLevelPath(partNames); + } + String[] treePathList = value.split(","); + for (String treePath : treePathList) { + List path = + partNameList.stream().filter(o -> treePath.equals(o.getLevelPath())) + .collect(Collectors.toList()); + if (!path.isEmpty()){ + if (path.size() > 1) { + if(MessageUtils.getLanguage().getValue().equals(LanguageEnum.CN.getValue())) { + errorMsg += fieldName + "中" + treePath + "存在多个;"; + countError++; + valueList = Collections.emptyList(); + } else { + errorMsg += fieldName + " " + treePath + "Exist in multiple;"; + } + break; + } + valueList.add(path.get(0).getCode()); + }else { + if(MessageUtils.getLanguage().getValue().equals(LanguageEnum.CN.getValue())) { + errorMsg += fieldName + "中" + treePath + "不存在;"; + countError++; + valueList = Collections.emptyList(); + } else { + errorMsg += fieldName + " " + treePath + "Not exist;"; + } + break; + } + } } } } + if (!valueList.isEmpty()){ + value = String.join(",", valueList); + } if((dto.get(key)== null && value != null) || (dto.get(key)!= null && !dto.get(key).toString().equals(value))){ dto.put(key, value); // 覆盖原来的值 } @@ -2536,6 +2667,54 @@ public class FileSplitItemsEOServiceImpl extends ServiceImpl partNameGetLevelPath(List partNames) { + List list = new ArrayList<>(); + // 一级节点 + List firstLevelList = partNames.stream().filter(o -> o.getParentCode().equals("Part")).collect(Collectors.toList()); + queryPartNameChildren(firstLevelList, partNames, "", list); + return list; + } + + private void queryPartNameChildren(List firstLevelList, List partNames, String levelPath, List list) { + for (PartName partName : firstLevelList) { + if (StringUtils.isBlank(levelPath)){ + partName.setLevelPath(partName.getName()); + }else { + partName.setLevelPath(levelPath + "/" + partName.getName()); + } + list.add(partName); + List children = partNames.stream() + .filter(v -> v.getParentCode().equals(partName.getCode())).collect(Collectors.toList()); + if (!children.isEmpty()){ + queryPartNameChildren(children, partNames, partName.getLevelPath(), list); + } + } + } + + private List getLevelPath(List sysDictItemLists) { + List list = new ArrayList<>(); + // 一级节点 + List firstLevelList = sysDictItemLists.stream().filter(v -> v.getParentId().equals("0")).collect(Collectors.toList()); + queryChildren(firstLevelList, sysDictItemLists, "", list); + return list; + } + + private void queryChildren(List treeList, List sysDictItemLists, String levelPath, List list) { + for (SysDictItem sysDictItem : treeList) { + if (StringUtils.isBlank(levelPath)){ + sysDictItem.setLevelPath(sysDictItem.getItemText()); + }else { + sysDictItem.setLevelPath(levelPath + "/" + sysDictItem.getItemText()); + } + list.add(sysDictItem); + List children = sysDictItemLists.stream() + .filter(v -> v.getParentId().equals(sysDictItem.getId())).collect(Collectors.toList()); + if (!children.isEmpty()){ + queryChildren(children, sysDictItemLists, sysDictItem.getLevelPath(), list); + } + } + } + private void createItemsInfo(Map sarFileSplitItemsEO, String menuId, String infoId){ LoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal(); String userId = sysUser.getId(); diff --git a/laws-modules/src/main/resources/excelTemplate/条款导入模板.xlsx b/laws-modules/src/main/resources/excelTemplate/条款导入模板.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..7fad60b786577addda7ef0b0e4340b4684dbf269 GIT binary patch literal 38484 zcmeEtgPSJJvS-^pZQHiHr!j5Y)3$Bfwr$&-wr$&(wtIWN@0_z|?>)Q!z}*1^@v706+j>boUc$77zen?W>6d00Hzobw>irQ%Ts)?r$xwi{j=@sFekyZEpSe>bo%H7qz6*=q$)^BA9f{(GOtkZ< zjj1=RF?#WGgFR|w3*cc|V?18TD^^_ke3Nj{a{arlz@9oVqF64tBqK_+h=@C;@xbH* z{>dL1GNjr=Vk7+xlp8?)(#Xz7${WbExqeX ziL}0BjHf8;OtngolJ~-5>H7wm#iiz2OZ-PS0KU8PNKi)P0 z+B6cWl7qyDC_XrcMbwLMd;&IMk0UpxN5L!c+Y<>s;(|u07b9I9bboKJ`(2@lmDg;M zya34S!oo}St;J%MUMT23T(1SoHT127Mi#uO?+|%rbjL@F4nYaNa&#eAj`QuJv%zkc zCU>LY5H2zLyx;&|oX2CilyYwiI0i!teHwafxaR^|c_)W@eFu4+5^}-bjgjI;{Qc~c z$&6_G`x8N1Ix=VMjg>um9u64WdpS#8I&6{~@<#|}R{CU9`+chDgu~rQ(0nCIiT=s~ zVm?#;@62)3787kLBk!+(|NI07ko`YW0g_giAnqZszfys=ouP$29qpg%|4#w` zgX8|+pjX66NdPmz2VMDn5{!3ptx*!rTF?m{OBuWaGNiuiu%*Tnw7owH|8U4{!gb52 zcFuB5y*H}Mcgcr$cS1}Og7nKUnrm17CGpLGpAyG4n0MxX~-e-7XH1 z<0b`p9X3eYYWid&l-8q+$|HVABU9VsH^{M=;;M#=L4xck4x><74Ov5te;GGXK`@LXBo~&=J8je)dT|ofcu&fUo+?5 z=S+c;l*}3*e5cB(cg@2*ZbT=k6CyM?D3Dn}6F*I$1aU(xn@iw@c#^Oc}de9TNR&b`%<%_Cx4ZKA4<0`KcNViXH z5s)ASY)uSGbBKre#SO7Bl1w>;B~|^zK~&bk{U6=Ni)k*87^Dm!2~7lvr>FRnjF1|Z zyWun>`{lAud7>43j_X23;(?G&YpV+KRHAP5^FeZhick0SUzoI_pQ@ zi?~IyVG%qmJ0`TBo3v*7+Y8b5xOnpT)WgM==go`h?aA=&{$=W5;3`|i+uFL(_{r7y z?nJ~`y40YR=0l*oUqy``AC_d{=GjWzr`CqdZ9SIX|H$c#WPYE9BM8d(o1ZOkb1sO> zJ^t^&a5!np`jz#PW;3_B)y-Kd<<7FDiLg>Os!B|!rm`Z_Rb%)F8;$IEji9|HUouJ?n9Cu#*{ja;};C8Q$~z(0+uyXaXydS1^OhH@dLWu zHkb8$K{-tAM!g9)8_=WQ1au-S*A%4)s0YRcpd-{t@-15&3{lZB>=VL(QA$vpX(-Zk z?w;N5E|Rs(fWFx{9+qkJ<&tPLCYpe&2C{ZTC^EIRVSBZt{;c6_?x76hU6~|{txf~A z5<)p!Za5u?7)j3k{Wa(Rdpf=3MiKJ{2LLD{1OPz)-$7w-Vrb}KPxsdk!=H?rp=4>j zN)P|RWBN&O^GI3?ydxA)W**o^H#dKIP%j3f8mVuT&d+kuePv-27fKvROkww z2@qeAQ-DkV;g)>%ISR5&pw$>9!=eCjzDK1o@=l9Eot;chm^f-qR8}jO>6gZRZ%jJu z)QbN&oS)JmOrEM3?DY~?*Ani9;@vMQWN!YdESd1#zUP9$zI-Y#zaw$8Rt8;KA%`NT z%meDQ_xR%BS7OQ%H;!{_02jECO4pHzbO|(2!ffwNW%(ILNF0tGgbDw6KRDmd0-+Qw zkyDw}LzY=b68GM1xq@Y?=2^3x;n%W|Ar@5Ao;YW}LY5SoEGo=u!K<2_1SiC2&CMPYPgM+@udEkArZNQEi6cK~>pmBX)g0Y{I@cgN+Gv4+B#*C_j@f zL7~O$`?OcMsm5R`<#lexKmqFyb#S<|of;Ccv_*?`u-wQeI;p*Hex2i=LOf59xq28J zHPloVqwIIMxa)8RV}P>eN{}Rz5Ccx}*|;zH#GFtFOi$_qr{Xol{u-(QF$ec?`c~r> z%mBrS?UQTobHB@%1Bdes;0Rmi0u3X;sCq6 z5S`pZ1(^4`=P1{$@_o`^wMEgr}dqnD18G z{mtB_6KCFH!k3RnbYEff`T5r+VR1#ej~*U$T08U&(12=M*_5~$aCEk=p~6}z#0MOe z#qiY~Tdy(oOb$#-))0q-sp%@Dz=JwWsY#V)*5LW&ga({aQR}(Mg<_)GYh7-0Z}e?d zS?fcqN-KM4V6N{f?56A2B;nPTx3N$v8l5oc&sy>Lj#WXGc9{97n{hW&W!_o*-@LQ^ zQjfrgjJJKRQtWalEcZk&A=_qIWBU1&8zPArrjwd-iNRK9 zS(BuY0&TKaN#k<>vZ9)13LtQ!n^uTT=F+Uew%lG)#df5-hYMc3_o`P1BPMb+n0 zE0a1i&b+`43deod!LDJAuN(}jTUb_X3KUvXZMxLAUomUZv3e;h&hCEpzW>Ua|8VOp}_DdZ|)*lYBJ}lMjl%!k$GOkEbOfzL>oRi&DKa56s8K zGw*q*cnn8`Z!IPQ!yaXm232UA95F$7r3jtJ4K-KjInVddGJYG`1dmv9Bn|H3S`<}L z8mbT)+Cjf=pNi7$!#=2^Ysj&T8%&1bh6sB$Y*o?Oj$=-7MPXd20Qo$NG|+A2g3!g@ zRQR%sV-|(bql6>TAVrC>qj?r_7(2-%nRfe$htSO;E{!+?@i!@}}-4|)ao_hmQgV4mw(RJF|jL9-*!2}d#2Yw7Ci8cF-9^&YLJ$_lB zW2(0dIY>tfnss;X`b7~(Un=@%I~Qf=+8z;Jn6avvBEJ zOhg0Uf2+(CtwdQ0p6!sXYMGMTs*^$Z?QHv`V4bVjgXdqSOV5U^lq;MGC)adY_E<`p zzCHV3r0XzxMv_ce^ZoLItbd@D{6x~thvm7`ZV*awX3!0~wuii38b@EP5?dz7%nxV< zhqw)z#2hULbXt#12R_#YuG#sf^D*EPxe2AiE%Xzu=oJot>vFgf@bGM?%AM$brpc-% z()oUzZPsxULbvaoErqS6`vKPJ*B7@WTBavTDc8>cSlX^%Rbna4TMoQ7c&mD+qBIX_ z$u|H-zMsLH+O+*|NKF}`YCjQ9>$b9>IVzz665qa_RsZ{dn~H9kt8M+}%lCu=9Ov0gv*^J~w@rS43kgOlX1y zdXC01j8u8B6N%mFm5(`#N7#!%%&MT}tnFWJhvtrnNEU0`bmW&}=8#lhYTQ1pT&InU zsQ^S|bDKCSGtBGA>pFl2&Q;lD_oPcB^}cl183&H9=jV>e z+o+mvQkHC}_4^ondtVc0ZcH%1a>6;G452V{JSA1cW7&*^N z>Z_9SFs%%JOz-gz>zYfVU8S8bw~*ZnthmZgw~; zC;?=%EUyVDp2EK;C|>T^_!YjaJV_^5Za7a-nH1Pl^c!3VCV}HU!C-2{VYeGH`wh{i zM#X;D-6Q{g()xS;XhKEe zrQFz7o(;-oFU19#_T3J229wwu!VB(r*c>MH(4h$Lo=%o|Xp=3m_>)9L=U5aVT;_fR z;--4B5?&ux2Yk)Eug@|Psz1mbB18xd!9Wf$0(~JL-#H|@g^y1VFko$S0Qh&l6lair zo?kZK@Hm0=L{eZydNy<*e|KTid*S0hfH<(l2>89b(}GC9G}yXHgz}Gk6{!B1(;70a ztk#ra2DC}8fvJn`yG5Zb9L=s6!l+drbuXqJHXa`0DZ=-;J2X~9Pl|VUQ#kVu@T#e^ z*SS4iJl^a)J`dj0+o!TW+MeIsMB3Afc{ja1(mo%}RyRDJ7(a{GHom_--yO_d9Sv=H z9VBi{Y|VFhyWEfQ4h9Ug9g(rUk*2|sZ z#%(F(klE&R=!oPoyr5ADqD>(dTYSVcc6=$MLrw~Kqg2sUNZ!Gihh!;p2i%P8^@@vb zs5v>W+IhhB*S(8}mYsHN56f#6q3_s5gJ_sl?}1a5;>=j(@uG+L^F|voP5Z)b<9)|| z7h$h?`PXS4yKL3yVyQ&zX2}rcrA5-rPu}t}OqKeJ% zbSx{6tfv>M8ReQNeMZc5de9UCO5QV#T{d#G;mA@6WgeqOp1{<~ zQ%lY>tmk~9$Ieb(S0TQ3<)DenL$ZO)Rta_ZMU9+^uAPUJoHq^mwy=^wKx$Z(@tP8i`$+Q7*gGYInb@-NKEaJ2uBw4u>YogQELW zLbedmk(tV9eC0(To3*gX3gzmCC|m}Im;a%|0y0^6y&SV!-PlY!&Ln@?g+z09#n$sZ zUpf&U#-=Cntdc?oHKEv7hqJ}`%=2&yrV;CPxBgi+6KNGG+d2r+nd6ZvE(zzlM$KJ~ zw|1)&>HSAF?n@HE{GzIt6-vPyUel++pcZ}FCqqjiOGE@ zM5n@nm`jqNPfrmqLf$#>U}3iT1Enej&c)`G8zh$=8njjf3zbpn6ZlQN(W$Xs+XYz3 zFw(;xWQSl18igIx;5z$i%r__XR0q!RoGVQ!>c*j)&u|b2{;6zZ?}3^WQYRp*dZXSr z3;+RB;7n*$MR{Vj(_*y)3EgLSF~=SSV?QgbwFU3|5k12xWbOb%Cq*cwgamoXXPQ&g zO)aY^h&k~}nNcAa7CHyA`Lv&0F@+|5hBX0qdIsjq7bzHJ|psXXPKEltbD~W z$9ZxJ2s7!(dG;vufr4m}X<;Foe@lHlsM~pDeBD>NHH2=Kt*3%2ntSx9!>H5cZ*1#{CVNRU(l@;LMD}R6hs|nN=ieH zEum℘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 z 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 T{IS=82*?-EL1~Hj