From 42bb66d19dc763bf756cd42af2499c80f2124eb6 Mon Sep 17 00:00:00 2001 From: dxfeng Date: Tue, 8 Apr 2025 15:05:35 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AD=97=E6=AE=B5=E8=BD=AC=E6=8D=A2=E9=80=BB?= =?UTF-8?q?=E8=BE=91,=E5=8F=8D=E5=A1=AB=E8=A1=A8=E5=8D=95=E5=AD=97?= =?UTF-8?q?=E6=AE=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../entity/unpack/DataConfigDetail.java | 10 ++ .../secret/entity/unpack/FileConfig.java | 3 +- .../secret/enums/ApplicationCategory.java | 32 +++++ .../engine/secret/enums/CategoryValue.java | 15 ++ .../secret/enums/IntegrateCategory.java | 44 ++++++ .../engine/secret/enums/PrintCategory.java | 41 ++++++ .../QualificationApplicationServiceImpl.java | 132 ++++++++++++++++-- .../engine/secret/util/FieldConvertUtil.java | 17 +++ src/com/engine/secret/util/ModeUtil.java | 28 +++- 9 files changed, 310 insertions(+), 12 deletions(-) create mode 100644 src/com/engine/secret/enums/ApplicationCategory.java create mode 100644 src/com/engine/secret/enums/CategoryValue.java create mode 100644 src/com/engine/secret/enums/IntegrateCategory.java create mode 100644 src/com/engine/secret/enums/PrintCategory.java diff --git a/src/com/engine/secret/entity/unpack/DataConfigDetail.java b/src/com/engine/secret/entity/unpack/DataConfigDetail.java index ef64197..aa0ddba 100644 --- a/src/com/engine/secret/entity/unpack/DataConfigDetail.java +++ b/src/com/engine/secret/entity/unpack/DataConfigDetail.java @@ -1,9 +1,11 @@ package com.engine.secret.entity.unpack; +import com.engine.secret.util.ModeUtil; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor; +import org.apache.commons.lang.StringUtils; /** * @author:dxfeng @@ -18,4 +20,12 @@ public class DataConfigDetail { private String fieldName; private String path; private String condition; + private String convertSql; + + public String getConvertSql() { + if (StringUtils.isBlank(convertSql)) { + return ""; + } + return ModeUtil.ToDBC(convertSql); + } } diff --git a/src/com/engine/secret/entity/unpack/FileConfig.java b/src/com/engine/secret/entity/unpack/FileConfig.java index b7149d2..2d935dc 100644 --- a/src/com/engine/secret/entity/unpack/FileConfig.java +++ b/src/com/engine/secret/entity/unpack/FileConfig.java @@ -18,5 +18,6 @@ public class FileConfig { private String fieldName; private String fileId; private String isFilled; - private String isDefault; + private String fixedValue; + private String attachments; } diff --git a/src/com/engine/secret/enums/ApplicationCategory.java b/src/com/engine/secret/enums/ApplicationCategory.java new file mode 100644 index 0000000..61238d9 --- /dev/null +++ b/src/com/engine/secret/enums/ApplicationCategory.java @@ -0,0 +1,32 @@ +package com.engine.secret.enums; + +/** + * 申请类别 + * + * @author:dxfeng + * @createTime: 2025/04/07 + * @version: 1.0 + */ +public enum ApplicationCategory { + // 涉密信息系统集成资质、国家秘密载体印制资质、武器装备科研生产单位保密资质、涉密军事设施建设保密资质 + CLASSIFIED_INFO_SYSTEM_INTEGRATION_QUALIFICATION("涉密信息系统集成资质", 0), + NATIONAL_SECRET_CARRIER_PRINTING_QUALIFICATION("国家秘密载体印制资质", 1), + WEAPON_EQUIPMENT_RESEARCH_SECURITY_QUALIFICATION("武器装备科研生产单位保密资质", 2), + CLASSIFIED_MILITARY_FACILITY_CONSTRUCTION_QUALIFICATION("涉密军事设施建设保密资质", 3); + + ApplicationCategory(String name, Integer value) { + this.name = name; + this.value = value; + } + + private String name; + private Integer value; + + public String getName() { + return name; + } + + public Integer getValue() { + return value; + } +} diff --git a/src/com/engine/secret/enums/CategoryValue.java b/src/com/engine/secret/enums/CategoryValue.java new file mode 100644 index 0000000..3ebb174 --- /dev/null +++ b/src/com/engine/secret/enums/CategoryValue.java @@ -0,0 +1,15 @@ +package com.engine.secret.enums; + +/** + * @author:dxfeng + * @createTime: 2025/04/07 + * @version: 1.0 + */ +public interface CategoryValue { + /** + * 获取值 + * + * @return + */ + int getSelectValue(); +} diff --git a/src/com/engine/secret/enums/IntegrateCategory.java b/src/com/engine/secret/enums/IntegrateCategory.java new file mode 100644 index 0000000..b5dcd96 --- /dev/null +++ b/src/com/engine/secret/enums/IntegrateCategory.java @@ -0,0 +1,44 @@ +package com.engine.secret.enums; + +/** + * 集成资质 + * + * @author:dxfeng + * @createTime: 2025/04/07 + * @version: 1.0 + */ +public enum IntegrateCategory implements CategoryValue { + // 总体集成、系统咨询、软件开发、安防监控、屏蔽室建设、运行维护、数据恢复、工程监理 + SYSTEM_INTEGRATION("总体集成", 0), + SYSTEM_CONSULTING("系统咨询", 1), + SOFTWARE_DEVELOPMENT("软件开发", 2), + SECURITY_SURVEILLANCE("安防监控", 3), + SHIELDED_ROOM_CONSTRUCTION("屏蔽室建设", 4), + OPERATION_MAINTENANCE("运行维护", 5), + DATA_RECOVERY("数据恢复", 6), + PROJECT_SUPERVISION("工程监理", 7); + + IntegrateCategory(String name, Integer value) { + this.name = name; + this.value = value; + } + + private String name; + private Integer value; + + public static IntegrateCategory getValue(String name) { + for (IntegrateCategory item : IntegrateCategory.values()) { + if (item.name.equalsIgnoreCase(name)) { + return item; + } + } + //throw new RuntimeException("不支持的操作类型"); + return null; + } + + + @Override + public int getSelectValue() { + return value; + } +} diff --git a/src/com/engine/secret/enums/PrintCategory.java b/src/com/engine/secret/enums/PrintCategory.java new file mode 100644 index 0000000..5e7afc8 --- /dev/null +++ b/src/com/engine/secret/enums/PrintCategory.java @@ -0,0 +1,41 @@ +package com.engine.secret.enums; + +/** + * 印制资质 + * + * @author:dxfeng + * @createTime: 2025/04/07 + * @version: 1.0 + */ +public enum PrintCategory implements CategoryValue { + // 涉密文件资料、国家统一考试试卷、涉密防伪票据证书、涉密光电磁介质、涉密档案数字化加工 + CLASSIFIED_DOCUMENTS("涉密文件资料", 0), + NATIONAL_EXAM_PAPERS("国家统一考试试卷", 1), + CLASSIFIED_VOUCHERS("涉密防伪票据证书", 2), + SECURE_ELECTRONIC_STORAGE("涉密光电磁介质", 3), + CLASSIFIED_DIGITIZATION("涉密档案数字化加工", 4); + + PrintCategory(String name, Integer value) { + this.name = name; + this.value = value; + } + + private String name; + private Integer value; + + public static PrintCategory getValue(String name) { + for (PrintCategory item : PrintCategory.values()) { + if (item.name.equalsIgnoreCase(name)) { + return item; + } + } + //throw new RuntimeException("不支持的操作类型"); + return null; + } + + + @Override + public int getSelectValue() { + return value; + } +} diff --git a/src/com/engine/secret/service/impl/QualificationApplicationServiceImpl.java b/src/com/engine/secret/service/impl/QualificationApplicationServiceImpl.java index a4e917b..3ef96b6 100644 --- a/src/com/engine/secret/service/impl/QualificationApplicationServiceImpl.java +++ b/src/com/engine/secret/service/impl/QualificationApplicationServiceImpl.java @@ -4,6 +4,10 @@ import cn.hutool.core.convert.Convert; import com.alibaba.fastjson.JSON; import com.engine.core.impl.Service; import com.engine.secret.entity.unpack.*; +import com.engine.secret.enums.ApplicationCategory; +import com.engine.secret.enums.CategoryValue; +import com.engine.secret.enums.IntegrateCategory; +import com.engine.secret.enums.PrintCategory; import com.engine.secret.exception.CustomizeRunTimeException; import com.engine.secret.service.QualificationApplicationService; import com.engine.secret.util.ConfigUtil; @@ -33,6 +37,7 @@ import java.nio.file.Path; import java.nio.file.Paths; import java.nio.file.StandardCopyOption; import java.util.*; +import java.util.function.Function; import java.util.stream.Collectors; /** @@ -58,6 +63,8 @@ public class QualificationApplicationServiceImpl extends Service implements Qual String relatedFlowId; + Map returnMap = new HashMap<>(); + @Override public Map parsingFiles(Map param) { @@ -115,8 +122,7 @@ public class QualificationApplicationServiceImpl extends Service implements Qual baseBean.writeLog("开始解压文件,处理压缩包"); unzipWithPassword(tempZipFile, Paths.get("output"), unzipPwd); baseBean.writeLog("压缩包处理完成"); - - return new HashMap<>(); + return returnMap; } catch (Exception e) { throw new CustomizeRunTimeException(e.getMessage(), e); } @@ -171,6 +177,7 @@ public class QualificationApplicationServiceImpl extends Service implements Qual if (dataJsonImageId != null && dataJsonImageId > 0) { // 离线端方式 JsonNode rootNode = parseJsonContent(dataJsonImageId); + buildFormFields(rootNode); offline(rootNode); } @@ -200,6 +207,9 @@ public class QualificationApplicationServiceImpl extends Service implements Qual * @throws JsonProcessingException */ private void offline(JsonNode rootNode) throws Exception { + // 解析基本信息并反写到流程表单 + + List dataConfigList = getDataConfig("0"); baseBean.writeLog("dataConfigList==" + JSON.toJSONString(dataConfigList)); @@ -340,6 +350,7 @@ public class QualificationApplicationServiceImpl extends Service implements Qual String fieldName = fieldDetail.getFieldName(); String path = fieldDetail.getPath(); String condition = fieldDetail.getCondition(); + String convertSql = fieldDetail.getConvertSql(); JsonNode atNode = jsonNode.at(path); if (null != atNode) { String value = atNode.asText(); @@ -352,7 +363,12 @@ public class QualificationApplicationServiceImpl extends Service implements Qual if (null == formfield) { continue; } - Object reallyValue = FieldConvertUtil.getReallyValue(formfield, value); + Object reallyValue; + if (StringUtils.isNotBlank(convertSql)) { + reallyValue = FieldConvertUtil.executeConvertSql(convertSql, value); + } else { + reallyValue = FieldConvertUtil.getReallyValue(formfield, value); + } insertMap.put(fieldName, reallyValue); } } @@ -392,6 +408,7 @@ public class QualificationApplicationServiceImpl extends Service implements Qual String fieldName = fieldDetail.getFieldName(); String path = fieldDetail.getPath(); String condition = fieldDetail.getCondition(); + String convertSql = fieldDetail.getConvertSql(); JsonNode atNode = jsonNode.at(path); if (null != atNode) { String value = atNode.asText(); @@ -404,7 +421,13 @@ public class QualificationApplicationServiceImpl extends Service implements Qual if (null == formfield) { continue; } - Object reallyValue = FieldConvertUtil.getReallyValue(formfield, value); + Object reallyValue; + if (StringUtils.isNotBlank(convertSql)) { + reallyValue = FieldConvertUtil.executeConvertSql(convertSql, value); + } else { + reallyValue = FieldConvertUtil.getReallyValue(formfield, value); + } + insertMap.put(fieldName, reallyValue); } } @@ -437,15 +460,25 @@ public class QualificationApplicationServiceImpl extends Service implements Qual String fieldName = fileConfig.getFieldName(); // 是否更正文件 String isFilled = fileConfig.getIsFilled(); + if ("2".equals(isFilled)) { + // 如果为更正文件,跳过不做处理 + continue; + } // 文件标识ID String fileId = fileConfig.getFileId(); - String isDefault = fileConfig.getIsDefault(); - if ("1".equals(isDefault)) { - // 默认值条件,直接写入表单对应的字段 - defaultDataMap.put(fieldName, fileId); + String fixedValue = fileConfig.getFixedValue(); + String attachments = fileConfig.getAttachments(); + if (StringUtils.isNotBlank(fixedValue)) { + // 默认值,直接写入表单对应的字段 + defaultDataMap.put(fieldName, fixedValue); continue; } + // 附件清单不为空,则写入对应的浏览按钮ID + if (StringUtils.isNotBlank(attachments)) { + defaultDataMap.put(fieldName, attachments); + } + List applicationResources = applicationResourceMap.get(fileId); if (CollectionUtils.isEmpty(applicationResources)) { @@ -573,7 +606,12 @@ public class QualificationApplicationServiceImpl extends Service implements Qual RecordSet rs = new RecordSet(); rs.executeQuery("select * from " + CONFIG_DETAIL_TABLE_NAME + " where mainId = ?", mainId); while (rs.next()) { - detailList.add(DataConfigDetail.builder().fieldName(rs.getString("field_name")).path(rs.getString("config_path")).condition(rs.getString("conditions")).build()); + detailList.add(DataConfigDetail.builder() + .fieldName(rs.getString("field_name")) + .path(rs.getString("config_path")) + .condition(rs.getString("conditions")) + .convertSql(rs.getString("convert_sql")) + .build()); } return detailList; } @@ -593,7 +631,8 @@ public class QualificationApplicationServiceImpl extends Service implements Qual .fieldName(rs.getString("field_name")) .fileId(rs.getString("file_id")) .isFilled(rs.getString("file_type")) - .isDefault(rs.getString("is_default")) + .fixedValue(rs.getString("fixed_value")) + .attachments(rs.getString("attachments")) .build()); } return fileList; @@ -678,5 +717,78 @@ public class QualificationApplicationServiceImpl extends Service implements Qual } } + /** + * 构建反写表单的字段 + * + * @param rootNode + */ + private void buildFormFields(JsonNode rootNode) { + Map data = new HashMap<>(); + // + processQualification(rootNode, "typeIntegrateList", + ApplicationCategory.CLASSIFIED_INFO_SYSTEM_INTEGRATION_QUALIFICATION, data, IntegrateCategory::getValue); + + processQualification(rootNode, "typePrintList", + ApplicationCategory.NATIONAL_SECRET_CARRIER_PRINTING_QUALIFICATION, data, PrintCategory::getValue); + } + + /** + * 提取资格类型 + * + * @param rootNode + * @param nodeName + * @param category + * @param data + * @param resolver + */ + private void processQualification(JsonNode rootNode, String nodeName, + ApplicationCategory category, Map data, Function> resolver) { + JsonNode typeList = rootNode.get(nodeName); + if (isValidArrayNode(typeList)) { + data.put("category_name", category.getName()); + data.put("category_value", category.getValue()); + + JsonNode applicationInfo = rootNode.get("applicationInfo"); + JsonNode applicationLevel = applicationInfo.get("applicationLevel"); + JsonNode companyName = applicationInfo.get("companyName"); + // 集成/印制级别 + data.put("level", applicationLevel.asInt()); + data.put("companyName", companyName.asText()); + + JsonNode applicationQualification = applicationInfo.get("applicationQualification"); + String values = extractQualificationValues(applicationQualification, resolver); + data.put("types", values); + returnMap.put("data", data); + } + } + + /** + * 判断节点是否存在 + * + * @param node + * @return + */ + private boolean isValidArrayNode(JsonNode node) { + return !node.isMissingNode() && node.isArray() && !node.isEmpty(); + } + + /** + * 转换为资格类型为对应的值 + * + * @param applicationQualification + * @param resolver + * @return + */ + private String extractQualificationValues(JsonNode applicationQualification, Function> resolver) { + String asText = applicationQualification.asText(); + + return Arrays.stream(asText.split("、")) + .map(resolver) + .filter(Objects::nonNull) + .map(category -> ((CategoryValue) category).getSelectValue()) + .map(String::valueOf) + .collect(Collectors.joining(",")); + } + } diff --git a/src/com/engine/secret/util/FieldConvertUtil.java b/src/com/engine/secret/util/FieldConvertUtil.java index c537825..8b4bc79 100644 --- a/src/com/engine/secret/util/FieldConvertUtil.java +++ b/src/com/engine/secret/util/FieldConvertUtil.java @@ -128,6 +128,23 @@ public class FieldConvertUtil { } + /** + * 执行转换SQL + * + * @param convertSql + * @param value + * @return + */ + public static String executeConvertSql(String convertSql, String value) { + RecordSet rs = new RecordSet(); + rs.executeQuery(convertSql, value); + if (rs.next()) { + return rs.getString(1); + } + return ""; + } + + /** * 校验字符串是否为纯数字或逗号分隔的数字 * diff --git a/src/com/engine/secret/util/ModeUtil.java b/src/com/engine/secret/util/ModeUtil.java index 4395ad7..d191941 100644 --- a/src/com/engine/secret/util/ModeUtil.java +++ b/src/com/engine/secret/util/ModeUtil.java @@ -389,7 +389,7 @@ public class ModeUtil { String selectValue = ""; RecordSet rs = new RecordSet(); String detailTable = formfield.getDetailtable(); - rs.executeQuery("select selectvalue from workflow_selectitem where fieldid =( select id from workflow_billfield where billid = ? and fieldname = ? and detailtable = ? ) and selectname = ?", formfield.getBillid(), formfield.getFieldname(), Util.null2String(detailTable),selectName); + rs.executeQuery("select selectvalue from workflow_selectitem where fieldid =( select id from workflow_billfield where billid = ? and fieldname = ? and detailtable = ? ) and selectname = ?", formfield.getBillid(), formfield.getFieldname(), Util.null2String(detailTable), selectName); if (rs.next()) { selectValue = rs.getString("selectvalue"); } @@ -397,4 +397,30 @@ public class ModeUtil { } + /** + * 全角转半角 + * + * @param input + * @return + */ + public static String ToDBC(String input) { + if (input == null) { + input = ""; + } + char[] c = input.toCharArray(); + for (int i = 0; i < c.length; i++) { + if (c[i] == 12288) { + //全角空格为12288,半角空格为32 + c[i] = (char) 32; + continue; + } + if (c[i] > 65280 && c[i] < 65375) { + //其他字符半角(33-126)与全角(65281-65374)的对应关系是:均相差65248 + c[i] = (char) (c[i] - 65248); + } + } + return new String(c); + } + + }