diff --git a/tools/mms-mapping/src/main/java/com/njcn/gather/icd/mapping/component/JsonToXmlConversionService.java b/tools/mms-mapping/src/main/java/com/njcn/gather/icd/mapping/component/JsonToXmlConversionService.java index 640bb81..fcfc6a9 100644 --- a/tools/mms-mapping/src/main/java/com/njcn/gather/icd/mapping/component/JsonToXmlConversionService.java +++ b/tools/mms-mapping/src/main/java/com/njcn/gather/icd/mapping/component/JsonToXmlConversionService.java @@ -102,13 +102,13 @@ public class JsonToXmlConversionService { List ruleStreams, IcdToXmlMappingService.IndexMappingConfig indexMapping, List methodDescribeList) throws Exception { - + // 读取模板 String templateContent = readInputStreamToString(templateStream); - + //填充IED信息 String xmlContent = fillIedInfo(templateContent, mappingDocument); - + //填充ReportControls信息 xmlContent = fillReportControlsFromMapping(xmlContent, mappingDocument); - + //填充do da信息 xmlContent = applyRulesFromMapping(xmlContent, mappingDocument, ruleStreams, indexMapping, methodDescribeList); return xmlContent; @@ -192,6 +192,68 @@ public class JsonToXmlConversionService { reportStatBuilder.toString().replace("$", "\\$").replace("[", "\\[").replace("]", "\\]") ); + reportStatBuilder = new StringBuilder(); + reportStatBuilder.append("\t\t\n"); + + for (var reportItem : mappingDocument.getReportMap()) { + if (reportItem.getName() != null && !reportItem.getName().isEmpty()) { + String name = reportItem.getName(); + + if (name.contains("urcbFluc") || + name.contains("urcbStHarm") || + name.contains("urcbStIHarm") || + name.contains("urcbStMMXU") || + name.contains("urcbStMSQI") || + name.contains("urcbPLT") || + name.contains("urcbPST") || + name.contains("urcbFlicker") || + name.contains("urcbStatistic")|| + name.contains("urcbRealData")) { + + String reportControlStr = buildReportControlString(reportItem); + reportStatBuilder.append("\t\t\t\n"); + } + } + } + + reportStatBuilder.append("\t\t"); + + xmlContent = xmlContent.replaceAll( + "[\\s\\S]*?", + reportStatBuilder.toString().replace("$", "\\$").replace("[", "\\[").replace("]", "\\]") + ); + + reportStatBuilder = new StringBuilder(); + reportStatBuilder.append("\t\t\n"); + + for (var reportItem : mappingDocument.getReportMap()) { + if (reportItem.getName() != null && !reportItem.getName().isEmpty()) { + String name = reportItem.getName(); + + if (name.contains("QVVR") || + name.contains("RDRE") || + name.contains("GGIO")) { + + String reportControlStr = buildEventReportControlString(reportItem); + reportStatBuilder.append("\t\t\t\n"); + } + } + } + + reportStatBuilder.append("\t\t"); + + xmlContent = xmlContent.replaceAll( + "[\\s\\S]*?", + reportStatBuilder.toString().replace("$", "\\$").replace("[", "\\[").replace("]", "\\]") + ); + + + + return xmlContent; } @@ -202,8 +264,10 @@ public class JsonToXmlConversionService { StringBuilder sb = new StringBuilder(); sb.append("LLN0$").append(rc.getBuffered() != null && rc.getBuffered().equals("BR") ? "BR$" : "RP$").append(rc.getName()); - - if(rc.getName().contains("PLT") || rc.getName().contains("Flicker") || rc.getName().contains("PST") || rc.getName().contains("Fluc")){ + if(rc.getName().contains("urcb")){ + sb.append(",3"); + } + else if(rc.getName().contains("PLT") || rc.getName().contains("Flicker") || rc.getName().contains("PST") || rc.getName().contains("Fluc")){ sb.append(",600"); }else{ sb.append(",60"); @@ -227,15 +291,53 @@ public class JsonToXmlConversionService { if(rc.getName().contains("PLT") || rc.getName().contains("Flicker")){ sb.append(",1"); - }else if(rc.getName().contains("PST") || rc.getName().contains("Fluc")){ + }else if(rc.getName().contains("PST") || rc.getName().contains("Fluc")|| rc.getName().contains("RealData")){ sb.append(",2"); - } else { + }else { sb.append(",0"); } return sb.toString(); } - + + + /** + * 构建EventReportControl字符串 + */ + private String buildEventReportControlString(ReportMapItem rc) { + StringBuilder sb = new StringBuilder(); + + sb.append("LLN0$").append(rc.getBuffered() != null && rc.getBuffered().equals("BR") ? "BR$" : "RP$").append(rc.getName()); + if(rc.getName().contains("urcb")){ + sb.append(",3"); + } + else if(rc.getName().contains("PLT") || rc.getName().contains("Flicker") || rc.getName().contains("PST") || rc.getName().contains("Fluc")){ + sb.append(",600"); + }else{ + sb.append(",60"); + } + sb.append(",1"); + sb.append(",0"); + sb.append(",0"); + sb.append(",0"); + sb.append(",0"); + sb.append(",yes"); + sb.append(",1"); + sb.append(",1"); + sb.append(",1"); + sb.append(",1"); + sb.append(",1"); + sb.append(",0"); + sb.append(",1"); + sb.append(",1"); + sb.append(",1"); + sb.append(",8"); + sb.append(",1"); + sb.append(",0"); + + return sb.toString(); + } + /** * 从MappingDocument应用规则 */ @@ -244,9 +346,9 @@ public class JsonToXmlConversionService { List ruleStreams, IcdToXmlMappingService.IndexMappingConfig indexMapping, List methodDescribeList) throws Exception { - + //合并所有规则文件 var mergedRules = mergeAllRulesDesc(ruleStreams, indexMapping); - + //读取mappingDocument var mappingMetrics = extractMetricsFromMapping(mappingDocument); addMethodDescribe(methodDescribeList, "========== 开始从JSON匹配规则 =========="); @@ -401,18 +503,14 @@ public class JsonToXmlConversionService { String line; String currentGroup = ""; - java.util.regex.Pattern valueRulePattern = java.util.regex.Pattern.compile( - "", java.util.regex.Pattern.CASE_INSENSITIVE + java.util.regex.Pattern valueTagPattern = java.util.regex.Pattern.compile( + "]+)/>", + java.util.regex.Pattern.CASE_INSENSITIVE + ); + + java.util.regex.Pattern attributePattern = java.util.regex.Pattern.compile( + "(name|desc|type|DO|DA|BaseFlag|LimitUp|LimitDown|Coefficient|Offset|PltFlag)=\"([^\"]*)\"", + java.util.regex.Pattern.CASE_INSENSITIVE ); while ((line = reader.readLine()) != null) { @@ -441,14 +539,23 @@ public class JsonToXmlConversionService { continue; } - java.util.regex.Matcher matcher = valueRulePattern.matcher(line); - if (matcher.find()) { + java.util.regex.Matcher tagMatcher = valueTagPattern.matcher(line); + if (tagMatcher.find()) { + String attributesStr = tagMatcher.group(1); + + java.util.Map attrMap = new java.util.HashMap<>(); + java.util.regex.Matcher attrMatcher = attributePattern.matcher(attributesStr); + while (attrMatcher.find()) { + attrMap.put(attrMatcher.group(1).toLowerCase(), attrMatcher.group(2)); + } + RuleBasedXmlMappingService.ValueRule rule = new RuleBasedXmlMappingService.ValueRule(); - rule.setName(matcher.group(1)); - rule.setDesc(matcher.group(2)); - rule.setType(matcher.group(3)); - String doPath = matcher.group(4) != null ? matcher.group(4) : ""; - String daPath = matcher.group(5) != null ? matcher.group(5) : ""; + rule.setName(attrMap.getOrDefault("name", "")); + rule.setDesc(attrMap.getOrDefault("desc", "")); + rule.setType(attrMap.getOrDefault("type", "")); + + String doPath = attrMap.getOrDefault("do", ""); + String daPath = attrMap.getOrDefault("da", ""); if (indexMapping != null && !doPath.isEmpty()) { doPath = applyIndexMapping(doPath, currentGroup, indexMapping, rule.getName(), rule.getDesc()); @@ -456,13 +563,16 @@ public class JsonToXmlConversionService { rule.setDoPath(doPath); rule.setDaPath(daPath); - rule.setBaseFlag(matcher.group(6)); - rule.setLimitUp(matcher.group(7)); - rule.setLimitDown(matcher.group(8)); - rule.setCoefficient(matcher.group(9)); + rule.setBaseFlag(attrMap.getOrDefault("baseflag", null)); + rule.setLimitUp(attrMap.getOrDefault("limitup", null)); + rule.setLimitDown(attrMap.getOrDefault("limitdown", null)); + rule.setCoefficient(attrMap.getOrDefault("coefficient", null)); + rule.setOffset(attrMap.getOrDefault("offset", null)); + rule.setPltFlag(attrMap.getOrDefault("pltflag", null)); String key = rule.getDesc(); - if (!key.isEmpty() && hasValidDoOrDa(rule)) { + + if (!key.isEmpty()) {//!key.isEmpty() && hasValidDoOrDa(rule) rules.computeIfAbsent(key.toLowerCase(), k -> new ArrayList<>()).add(rule); } } @@ -710,6 +820,8 @@ public class JsonToXmlConversionService { } else { sb.append("[").append(start).append("]"); } + }else{ + sb.append("$cVal"); } } if (typeName != null && !typeName.isEmpty()) { @@ -770,9 +882,9 @@ public class JsonToXmlConversionService { boolean matched = false; for (RuleBasedXmlMappingService.ValueRule rule : ruleVariants) { - if (rule.getName() == null || rule.getDoPath().isEmpty()) { - continue; - } +// if (rule.getName() == null || rule.getDoPath().isEmpty()) { +// continue; +// } if(mappingMetrics.containsKey(rule.getName())){ MetricInfo metric = mappingMetrics.get(rule.getName()); @@ -909,30 +1021,32 @@ public class JsonToXmlConversionService { private String applyRulesToXml(String xmlContent, java.util.Map applicableRules) { - java.util.regex.Pattern xmlValuePattern = java.util.regex.Pattern.compile( - "", java.util.regex.Pattern.CASE_INSENSITIVE + java.util.regex.Pattern valueTagPattern = java.util.regex.Pattern.compile( + "]+)/>", + java.util.regex.Pattern.CASE_INSENSITIVE ); - java.util.regex.Matcher matcher = xmlValuePattern.matcher(xmlContent); + java.util.regex.Pattern attributePattern = java.util.regex.Pattern.compile( + "(name|desc|type|DO|DA|BaseFlag|LimitUp|LimitDown|Coefficient|Offset|PltFlag)=\"([^\"]*)\"", + java.util.regex.Pattern.CASE_INSENSITIVE + ); + + java.util.regex.Matcher matcher = valueTagPattern.matcher(xmlContent); StringBuffer result = new StringBuffer(); while (matcher.find()) { - String name = matcher.group(1); - String desc = matcher.group(2); - String type = matcher.group(3); + String attributesStr = matcher.group(1); + + java.util.Map attrMap = new java.util.HashMap<>(); + java.util.regex.Matcher attrMatcher = attributePattern.matcher(attributesStr); + while (attrMatcher.find()) { + attrMap.put(attrMatcher.group(1).toLowerCase(), attrMatcher.group(2)); + } + + String name = attrMap.getOrDefault("name", ""); + String desc = attrMap.getOrDefault("desc", ""); + String type = attrMap.getOrDefault("type", "6"); - // String key = buildRuleKey(name, desc); - //RuleBasedXmlMappingService.ValueRule matchedRule = applicableRules.get(key.toLowerCase()); RuleBasedXmlMappingService.ValueRule matchedRule = applicableRules.get(desc); if (matchedRule != null) { StringBuilder valueNode = new StringBuilder(""); matcher.appendReplacement(result, java.util.regex.Matcher.quoteReplacement(valueNode.toString())); diff --git a/tools/mms-mapping/src/main/java/com/njcn/gather/icd/mapping/component/RuleBasedXmlMappingService.java b/tools/mms-mapping/src/main/java/com/njcn/gather/icd/mapping/component/RuleBasedXmlMappingService.java index 5d1a5a1..8f68d6d 100644 --- a/tools/mms-mapping/src/main/java/com/njcn/gather/icd/mapping/component/RuleBasedXmlMappingService.java +++ b/tools/mms-mapping/src/main/java/com/njcn/gather/icd/mapping/component/RuleBasedXmlMappingService.java @@ -61,7 +61,7 @@ public class RuleBasedXmlMappingService { private static final Pattern DO_NO_INDEX_PATTERN = Pattern.compile("(MMXU|MHAI|MSQI|MFLK|QVVR)\\$"); public InputStream loadDefaultXmlFile( ) throws Exception { - ClassPathResource templateResource = new ClassPathResource("template/JiangSu_Config2.xml"); + ClassPathResource templateResource = new ClassPathResource("template/JiangSu_Config1.xml"); if (!templateResource.exists()) { return null; @@ -808,6 +808,8 @@ public class RuleBasedXmlMappingService { private String limitUp; private String limitDown; private String coefficient; + private String offset; + private String pltFlag; public String getName() { return name; } public void setName(String name) { this.name = name; } @@ -827,6 +829,10 @@ public class RuleBasedXmlMappingService { public void setLimitDown(String limitDown) { this.limitDown = limitDown; } public String getCoefficient() { return coefficient; } public void setCoefficient(String coefficient) { this.coefficient = coefficient; } + public String getOffset() { return offset; } + public void setOffset(String offset) { this.offset = offset; } + public String getPltFlag() { return pltFlag; } + public void setPltFlag(String pltFlag) { this.pltFlag = pltFlag; } } static class IcdMetricInfo { diff --git a/tools/mms-mapping/src/main/resources/template/JiangSu_Config1.xml b/tools/mms-mapping/src/main/resources/template/JiangSu_Config1.xml new file mode 100644 index 0000000..6cae627 --- /dev/null +++ b/tools/mms-mapping/src/main/resources/template/JiangSu_Config1.xml @@ -0,0 +1,617 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/tools/mms-mapping/src/main/resources/template/默认规则.txt b/tools/mms-mapping/src/main/resources/template/默认规则.txt index 3a8e567..60c7bfd 100644 --- a/tools/mms-mapping/src/main/resources/template/默认规则.txt +++ b/tools/mms-mapping/src/main/resources/template/默认规则.txt @@ -1,127 +1,328 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + - - - + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/tools/mms-mapping/src/test/java/com/njcn/gather/icd/mapping/debug/JsonToXmlDebugRunner.java b/tools/mms-mapping/src/test/java/com/njcn/gather/icd/mapping/debug/JsonToXmlDebugRunner.java index 0466555..cf42dad 100644 --- a/tools/mms-mapping/src/test/java/com/njcn/gather/icd/mapping/debug/JsonToXmlDebugRunner.java +++ b/tools/mms-mapping/src/test/java/com/njcn/gather/icd/mapping/debug/JsonToXmlDebugRunner.java @@ -89,7 +89,7 @@ public class JsonToXmlDebugRunner { // 保存 XML 到磁盘 if (SAVE_XML_TO_DISK && result.getStatus() == GenerateStatus.SUCCESS) { - saveXmlToDisk(result.getMappingXml()); + saveXmlToDisk(result.getXmlContent()); } if (VERBOSE_LOG) {