fix(mms-mapping): 修复谐波数据映射配置和偏移量计算问题

- 修改JiangSu_Config1.xml中谐波电流相关指标的命名规则
- 修改默认规则文件中相电压间谐波含有率序列的描述名称
- 添加相电压间谐波含有率序列实时数据值配置
- 更新JsonToXmlConversionService中遥测数据处理逻辑,将urcb相关标识修改为brcb
- 新增calculateOffset方法用于计算指标偏移量
- 实现adjustPathWithOffset方法根据offset调整路径中的数值格式
- 添加offset字段到MetricInfo类中用于存储偏移信息
- 在规则匹配过程中传递offset值并在生成Value节点时应用偏移调整
This commit is contained in:
周宇 蔡
2026-07-10 11:20:31 +08:00
parent fa1a285e04
commit cbafe85c4a
3 changed files with 114 additions and 34 deletions

View File

@@ -188,12 +188,15 @@ public class JsonToXmlConversionService {
String name = reportItem.getName(); String name = reportItem.getName();
if (name.contains("urcbFluc") || if (name.contains("urcbFluc") ||
name.contains("urcbStHarm") || name.contains("brcbFluc") ||
name.contains("urcbStIHarm") || name.contains("urcbRtHarm") ||
name.contains("urcbStMMXU") || name.contains("urcbRtIHarm") ||
name.contains("urcbStMSQI") || name.contains("urcbRtMMXU") ||
name.contains("urcbRtMSQI") ||
name.contains("urcbPLT") || name.contains("urcbPLT") ||
name.contains("urcbPST") || name.contains("urcbPST") ||
name.contains("brcbPLT") ||
name.contains("brcbPST") ||
name.contains("urcbFlicker") || name.contains("urcbFlicker") ||
name.contains("urcbStatistic")|| name.contains("urcbStatistic")||
name.contains("urcbRealData")) { name.contains("urcbRealData")) {
@@ -771,6 +774,7 @@ public class JsonToXmlConversionService {
if(2==configType && fullKey.contains("线电压总有效值")){ if(2==configType && fullKey.contains("线电压总有效值")){
daPath = "1_" + daPath; daPath = "1_" + daPath;
} }
int offset=calculateOffset(sdiItem.getName(), typeItem.getName(), doiItem);
MetricInfo info = new MetricInfo(); MetricInfo info = new MetricInfo();
info.setLnClass(dataSetGroup.getLnClass()); info.setLnClass(dataSetGroup.getLnClass());
info.setLnInst(instItem.getInst()); info.setLnInst(instItem.getInst());
@@ -781,6 +785,7 @@ public class JsonToXmlConversionService {
info.setStart(doiItem.getStart()); info.setStart(doiItem.getStart());
info.setEnd(doiItem.getEnd()); info.setEnd(doiItem.getEnd());
info.setBaseFlag(doiItem.getBaseflag()); info.setBaseFlag(doiItem.getBaseflag());
info.setOffset(offset);
metrics.put(fullKey.toLowerCase(), info); metrics.put(fullKey.toLowerCase(), info);
} }
} }
@@ -829,10 +834,15 @@ public class JsonToXmlConversionService {
int start = doiItem.getStart(); int start = doiItem.getStart();
if (baseflag == 1) { if (baseflag == 1) {
boolean isInterHarmonic = isInterHarmonicMetric(doiItem); boolean isInterHarmonic = isInterHarmonicMetric(doiItem);//间谐波判断
int m = isInterHarmonic ? 0 : 2; int m = isInterHarmonic ? 0 : 2;
int i = m - start; int i = m - start;
sb.append("[%-").append(i).append("]"); //判断是Offset是否需要
if(i<0){
sb.append("[%-0]");
}else {
sb.append("[%-").append(i).append("]");
}
} else { } else {
sb.append("[").append(start).append("]"); sb.append("[").append(start).append("]");
} }
@@ -849,6 +859,28 @@ public class JsonToXmlConversionService {
return sb.toString(); return sb.toString();
} }
private int calculateOffset(String sdiName, String typeName, DoiItem doiItem) {
int offset=0;
if (sdiName != null && !sdiName.isEmpty()){
if (sdiName.endsWith("Har") && doiItem != null) {
int baseflag = doiItem.getBaseflag();
int start = doiItem.getStart();
if (baseflag == 1) {
boolean isInterHarmonic = isInterHarmonicMetric(doiItem);//间谐波判断
int m = isInterHarmonic ? 0 : 2;
int i = m - start;
//判断是Offset是否需要
if(i<0){
offset = i;
}
}
}
}
return offset;
}
/** /**
* 标准化相别名称,将具体相别转换为通配符格式 * 标准化相别名称,将具体相别转换为通配符格式
* - phsA, phsB, phsC, phsAB, phsBC, phsCA -> phs* * - phsA, phsB, phsC, phsAB, phsBC, phsCA -> phs*
@@ -906,6 +938,8 @@ public class JsonToXmlConversionService {
MetricInfo metric = mappingMetrics.get(rule.getName()); MetricInfo metric = mappingMetrics.get(rule.getName());
rule.setDoPath(metric.getDoPath()); rule.setDoPath(metric.getDoPath());
rule.setDaPath(metric.getDaPath()); rule.setDaPath(metric.getDaPath());
// 传递offset值将Integer转换为String
rule.setOffset(String.valueOf(metric.getOffset()));
applicable.put(ruleKey, rule); applicable.put(ruleKey, rule);
matched = true; matched = true;
addMethodDescribe(methodDescribeList, "✓ 规则匹配成功: " + ruleKey + " -> DO=" + rule.getDoPath() + ", DA=" + rule.getDaPath()); addMethodDescribe(methodDescribeList, "✓ 规则匹配成功: " + ruleKey + " -> DO=" + rule.getDoPath() + ", DA=" + rule.getDaPath());
@@ -1066,10 +1100,11 @@ public class JsonToXmlConversionService {
RuleBasedXmlMappingService.ValueRule matchedRule = applicableRules.get(desc); RuleBasedXmlMappingService.ValueRule matchedRule = applicableRules.get(desc);
if (matchedRule != null) { if (matchedRule != null) {
StringBuilder valueNode = new StringBuilder("<Value "); StringBuilder valueNode = new StringBuilder("<Value ");
valueNode.append("name=\"").append(escapeXml(name)).append("\" "); // 如果offset<0需要调整指标名中的%int或int%格式
String adjustedName = adjustPathWithOffset(name, matchedRule.getOffset());
valueNode.append("name=\"").append(escapeXml(adjustedName)).append("\" ");
valueNode.append("desc=\"").append(escapeXml(desc)).append("\" "); valueNode.append("desc=\"").append(escapeXml(desc)).append("\" ");
valueNode.append("type=\"").append(type).append("\" "); valueNode.append("type=\"").append(type).append("\" ");
if (matchedRule.getDoPath() != null && !matchedRule.getDoPath().isEmpty()) { if (matchedRule.getDoPath() != null && !matchedRule.getDoPath().isEmpty()) {
valueNode.append("DO=\"").append(escapeXml(matchedRule.getDoPath())).append("\" "); valueNode.append("DO=\"").append(escapeXml(matchedRule.getDoPath())).append("\" ");
} }
@@ -1088,7 +1123,7 @@ public class JsonToXmlConversionService {
if (matchedRule.getCoefficient() != null && !matchedRule.getCoefficient().isEmpty()) { if (matchedRule.getCoefficient() != null && !matchedRule.getCoefficient().isEmpty()) {
valueNode.append("Coefficient=\"").append(escapeXml(matchedRule.getCoefficient())).append("\" "); valueNode.append("Coefficient=\"").append(escapeXml(matchedRule.getCoefficient())).append("\" ");
} }
if (matchedRule.getOffset() != null && !matchedRule.getOffset().isEmpty()) { if (matchedRule.getOffset() != null && !matchedRule.getOffset().isEmpty() && !matchedRule.getOffset().equals("0")) {
valueNode.append("Offset=\"").append(escapeXml(matchedRule.getOffset())).append("\" "); valueNode.append("Offset=\"").append(escapeXml(matchedRule.getOffset())).append("\" ");
} }
if (matchedRule.getPltFlag() != null && !matchedRule.getPltFlag().isEmpty()) { if (matchedRule.getPltFlag() != null && !matchedRule.getPltFlag().isEmpty()) {
@@ -1116,6 +1151,48 @@ public class JsonToXmlConversionService {
.replace("'", "&apos;"); .replace("'", "&apos;");
} }
/**
* 根据offset调整路径DO或DA
* 当offset<0时对路径中的[%-int]或[int%]格式增加-offset的值
* @param path 原始路径DO或DA
* @param offsetStr offset字符串值
* @return 调整后的路径
*/
private String adjustPathWithOffset(String path, String offsetStr) {
if (path == null || offsetStr == null || offsetStr.isEmpty()) {
return path;
}
try {
int offset = Integer.parseInt(offsetStr);
// 只有当offset<0时才需要调整
if (offset >= 0) {
return path;
}
int adjustment = -offset;
// 匹配 %数字,数字% 格式并调整(如 %0,49%
java.util.regex.Pattern pattern3 = java.util.regex.Pattern.compile("%(\\d+),(\\d+)%");
java.util.regex.Matcher matcher3 = pattern3.matcher(path);
StringBuffer result3 = new StringBuffer();
while (matcher3.find()) {
int startVal = Integer.parseInt(matcher3.group(1));
int endVal = Integer.parseInt(matcher3.group(2));
int newStart = startVal + adjustment;
int newEnd = endVal + adjustment;
matcher3.appendReplacement(result3, "%"+newStart+","+newEnd+"%");
}
matcher3.appendTail(result3);
path = result3.toString();
return path;
} catch (NumberFormatException e) {
// 如果offset无法解析为整数返回原始路径
return path;
}
}
private void addMethodDescribe(List<String> methodDescribeList, String message) { private void addMethodDescribe(List<String> methodDescribeList, String message) {
if (methodDescribeList == null || message == null || message.trim().isEmpty()) { if (methodDescribeList == null || message == null || message.trim().isEmpty()) {
return; return;
@@ -1231,7 +1308,9 @@ public class JsonToXmlConversionService {
private int end; private int end;
private int baseCount; private int baseCount;
private int baseFlag; private int baseFlag;
private int offset;
public int getOffset() {return offset;}
public void setOffset(int offset) {this.offset = offset;}
public String getLnClass() { return lnClass; } public String getLnClass() { return lnClass; }
public void setLnClass(String lnClass) { this.lnClass = lnClass; } public void setLnClass(String lnClass) { this.lnClass = lnClass; }
public String getLnInst() { return lnInst; } public String getLnInst() { return lnInst; }

View File

@@ -217,14 +217,14 @@
<Value name="SI_%0,49%" desc="间谐波电流幅值(f25-2475)平均值" type="6" DO="" DA="" /> <Value name="SI_%0,49%" desc="间谐波电流幅值(f25-2475)平均值" type="6" DO="" DA="" />
<Value name="MAX_SI_%0,49%" desc="间谐波电流幅值(f25-2475)最大值" type="6" DO="" DA="" /> <Value name="MAX_SI_%0,49%" desc="间谐波电流幅值(f25-2475)最大值" type="6" DO="" DA="" />
<Value name="MIN_SI_%0,49%" desc="间谐波电流幅值(f25-2475)最小值" type="6" DO="" DA="" /> <Value name="MIN_SI_%0,49%" desc="间谐波电流幅值(f25-2475)最小值" type="6" DO="" DA="" />
<Value name="G_I%1,50%" desc="谐波电流幅值(2-50)95值" type="6" DO="" DA="" /> <Value name="G_I%2,50%" desc="谐波电流幅值(2-50)95值" type="6" DO="" DA="" />
<Value name="I%1,50%" desc="谐波电流幅值(2-50)平均值" type="6" DO="" DA="" /> <Value name="I%2,50%" desc="谐波电流幅值(2-50)平均值" type="6" DO="" DA="" />
<Value name="MAX_I%1,50%" desc="谐波电流幅值(2-50)最大值" type="6" DO="" DA="" /> <Value name="MAX_I%2,50%" desc="谐波电流幅值(2-50)最大值" type="6" DO="" DA="" />
<Value name="MIN_I%1,50%" desc="谐波电流幅值(2-50)最小值" type="6" DO="" DA="" /> <Value name="MIN_I%2,50%" desc="谐波电流幅值(2-50)最小值" type="6" DO="" DA="" />
<Value name="G_IA%1,50%" desc="谐波电流相角(2-50)95值" type="6" DO="" DA="" /> <Value name="G_IA%2,50%" desc="谐波电流相角(2-50)95值" type="6" DO="" DA="" />
<Value name="IA%1,50%" desc="谐波电流相角(2-50)平均值" type="6" DO="" DA="" /> <Value name="IA%2,50%" desc="谐波电流相角(2-50)平均值" type="6" DO="" DA="" />
<Value name="MAX_IA%1,50%" desc="谐波电流相角(2-50)最大值" type="6" DO="" DA="" /> <Value name="MAX_IA%2,50%" desc="谐波电流相角(2-50)最大值" type="6" DO="" DA="" />
<Value name="MIN_IA%1,50%" desc="谐波电流相角(2-50)最小值" type="6" DO="" DA="" /> <Value name="MIN_IA%2,50%" desc="谐波电流相角(2-50)最小值" type="6" DO="" DA="" />
<Value name="ITHD" desc="电流总谐波畸变率平均值" type="6" DO="" DA="" Coefficient="1" /> <Value name="ITHD" desc="电流总谐波畸变率平均值" type="6" DO="" DA="" Coefficient="1" />
<Value name="MAX_ITHD" desc="电流总谐波畸变率最大值" type="6" DO="" DA="" Coefficient="1" /> <Value name="MAX_ITHD" desc="电流总谐波畸变率最大值" type="6" DO="" DA="" Coefficient="1" />
<Value name="MIN_ITHD" desc="电流总谐波畸变率最小值" type="6" DO="" DA="" Coefficient="1" /> <Value name="MIN_ITHD" desc="电流总谐波畸变率最小值" type="6" DO="" DA="" Coefficient="1" />
@@ -277,18 +277,18 @@
<Value name="Q" desc="无功功率平均值" type="6" DO="" DA="" /> <Value name="Q" desc="无功功率平均值" type="6" DO="" DA="" />
<Value name="MAX_Q" desc="无功功率最大值" type="6" DO="" DA="" /> <Value name="MAX_Q" desc="无功功率最大值" type="6" DO="" DA="" />
<Value name="MIN_Q" desc="无功功率最小值" type="6" DO="" DA="" /> <Value name="MIN_Q" desc="无功功率最小值" type="6" DO="" DA="" />
<Value name="G_P%1,50%" desc="谐波有功功率(2-50)95值" type="6" DO="" DA="" /> <Value name="G_P%2,50%" desc="谐波有功功率(2-50)95值" type="6" DO="" DA="" />
<Value name="P%1,50%" desc="谐波有功功率(2-50)平均值" type="6" DO="" DA="" /> <Value name="P%2,50%" desc="谐波有功功率(2-50)平均值" type="6" DO="" DA="" />
<Value name="MAX_P%1,50%" desc="谐波有功功率(2-50)最大值" type="6" DO="" DA="" /> <Value name="MAX_P%2,50%" desc="谐波有功功率(2-50)最大值" type="6" DO="" DA="" />
<Value name="MIN_P%1,50%" desc="谐波有功功率(2-50)最小值" type="6" DO="" DA="" /> <Value name="MIN_P%2,50%" desc="谐波有功功率(2-50)最小值" type="6" DO="" DA="" />
<Value name="G_Q%1,50%" desc="谐波无功功率(2-50)95值" type="6" DO="" DA="" /> <Value name="G_Q%2,50%" desc="谐波无功功率(2-50)95值" type="6" DO="" DA="" />
<Value name="Q%1,50%" desc="谐波无功功率(2-50)平均值" type="6" DO="" DA="" /> <Value name="Q%2,50%" desc="谐波无功功率(2-50)平均值" type="6" DO="" DA="" />
<Value name="MAX_Q%1,50%" desc="谐波无功功率(2-50)最大值" type="6" DO="" DA="" /> <Value name="MAX_Q%2,50%" desc="谐波无功功率(2-50)最大值" type="6" DO="" DA="" />
<Value name="MIN_Q%1,50%" desc="谐波无功功率(2-50)最小值" type="6" DO="" DA="" /> <Value name="MIN_Q%2,50%" desc="谐波无功功率(2-50)最小值" type="6" DO="" DA="" />
<Value name="G_S%1,50%" desc="谐波视在功率(2-50)95值" type="6" DO="" DA="" /> <Value name="G_S%2,50%" desc="谐波视在功率(2-50)95值" type="6" DO="" DA="" />
<Value name="S%1,50%" desc="谐波视在功率(2-50)平均值" type="6" DO="" DA="" /> <Value name="S%2,50%" desc="谐波视在功率(2-50)平均值" type="6" DO="" DA="" />
<Value name="MAX_S%1,50%" desc="谐波视在功率(2-50)最大值" type="6" DO="" DA="" /> <Value name="MAX_S%2,50%" desc="谐波视在功率(2-50)最大值" type="6" DO="" DA="" />
<Value name="MIN_S%1,50%" desc="谐波视在功率(2-50)最小值" type="6" DO="" DA="" /> <Value name="MIN_S%2,50%" desc="谐波视在功率(2-50)最小值" type="6" DO="" DA="" />
<Value name="G_P" desc="有功功率95值" type="6" DO="" DA="" /> <Value name="G_P" desc="有功功率95值" type="6" DO="" DA="" />
<Value name="P" desc="有功功率平均值" type="6" DO="" DA="" /> <Value name="P" desc="有功功率平均值" type="6" DO="" DA="" />
<Value name="MAX_P" desc="有功功率最大值" type="6" DO="" DA="" /> <Value name="MAX_P" desc="有功功率最大值" type="6" DO="" DA="" />

View File

@@ -43,10 +43,10 @@
<Value name="间谐波电压有效值序列间谐波平均值值" desc="间谐波电压含有率(f25-2475)平均值" type="6" DO="MHAI8$MX$HPhV" DA="phs*Har[%-0]$mag$f" /> <Value name="间谐波电压有效值序列间谐波平均值值" desc="间谐波电压含有率(f25-2475)平均值" type="6" DO="MHAI8$MX$HPhV" DA="phs*Har[%-0]$mag$f" />
<Value name="间谐波电压有效值序列间谐波最大值值" desc="间谐波电压含有率(f25-2475)最大值" type="6" DO="MHAI9$MX$HPhV" DA="phs*Har[%-0]$mag$f" /> <Value name="间谐波电压有效值序列间谐波最大值值" desc="间谐波电压含有率(f25-2475)最大值" type="6" DO="MHAI9$MX$HPhV" DA="phs*Har[%-0]$mag$f" />
<Value name="间谐波电压有效值序列间谐波最小值值" desc="间谐波电压含有率(f25-2475)最小值" type="6" DO="MHAI10$MX$HPhV" DA="phs*Har[%-0]$mag$f" /> <Value name="间谐波电压有效值序列间谐波最小值值" desc="间谐波电压含有率(f25-2475)最小值" type="6" DO="MHAI10$MX$HPhV" DA="phs*Har[%-0]$mag$f" />
<Value name="间谐波电压有效值序列间谐波95值值" desc="间谐波电压含有率(f25-2475)95值" type="6" DO="MHAI8$MX$HPhV" DA="phs*Har[%-0]$mag$f" /> <Value name="相电压间谐波含有率序列间谐波95值值" desc="间谐波电压含有率(f25-2475)95值" type="6" DO="MHAI8$MX$HPhV" DA="phs*Har[%-0]$mag$f" />
<Value name="间谐波电压有效值序列间谐波平均值值" desc="间谐波电压含有率(f25-2475)平均值" type="6" DO="MHAI8$MX$HPhV" DA="phs*Har[%-0]$mag$f" /> <Value name="相电压间谐波含有率序列间谐波平均值值" desc="间谐波电压含有率(f25-2475)平均值" type="6" DO="MHAI8$MX$HPhV" DA="phs*Har[%-0]$mag$f" />
<Value name="间谐波电压有效值序列间谐波最大值值" desc="间谐波电压含有率(f25-2475)最大值" type="6" DO="MHAI9$MX$HPhV" DA="phs*Har[%-0]$mag$f" /> <Value name="相电压间谐波含有率序列间谐波最大值值" desc="间谐波电压含有率(f25-2475)最大值" type="6" DO="MHAI9$MX$HPhV" DA="phs*Har[%-0]$mag$f" />
<Value name="间谐波电压有效值序列间谐波最小值值" desc="间谐波电压含有率(f25-2475)最小值" type="6" DO="MHAI10$MX$HPhV" DA="phs*Har[%-0]$mag$f" /> <Value name="相电压间谐波含有率序列间谐波最小值值" desc="间谐波电压含有率(f25-2475)最小值" type="6" DO="MHAI10$MX$HPhV" DA="phs*Har[%-0]$mag$f" />
<Value name="相电压谐波含有率序列95值值" desc="谐波电压含有率(2-50)95值" type="6" DO="MHAI2$MX$HPhV" DA="phs*Har[%-2]$mag$f" /> <Value name="相电压谐波含有率序列95值值" desc="谐波电压含有率(2-50)95值" type="6" DO="MHAI2$MX$HPhV" DA="phs*Har[%-2]$mag$f" />
<Value name="相电压谐波含有率序列平均值值" desc="谐波电压含有率(2-50)平均值" type="6" DO="MHAI2$MX$HPhV" DA="phs*Har[%-2]$mag$f" /> <Value name="相电压谐波含有率序列平均值值" desc="谐波电压含有率(2-50)平均值" type="6" DO="MHAI2$MX$HPhV" DA="phs*Har[%-2]$mag$f" />
@@ -281,6 +281,7 @@
<Value name="相电压基波有效值实时数据值" desc="实时基波电压有效值" type="6" DO="MHAI$MX$FundPhV" DA="phs*$cVal$mag$f" Coefficient="1" /> <Value name="相电压基波有效值实时数据值" desc="实时基波电压有效值" type="6" DO="MHAI$MX$FundPhV" DA="phs*$cVal$mag$f" Coefficient="1" />
<Value name="相电压谐波含有率序列实时数据值" desc="实时2-50次谐波电压含有率" type="6" DO="MHAI$MX$HPhV" DA="phs*Har[%-2]$mag$f" Coefficient="1" Offset="0" /> <Value name="相电压谐波含有率序列实时数据值" desc="实时2-50次谐波电压含有率" type="6" DO="MHAI$MX$HPhV" DA="phs*Har[%-2]$mag$f" Coefficient="1" Offset="0" />
<Value name="间谐波电压有效值序列间谐波实时数据值" desc="实时1-50次间谐波电压含有率" type="6" DO="MHAI$MX$HPhV" DA="phs*Har[%-0]$mag$f" Coefficient="1" Offset="0" /> <Value name="间谐波电压有效值序列间谐波实时数据值" desc="实时1-50次间谐波电压含有率" type="6" DO="MHAI$MX$HPhV" DA="phs*Har[%-0]$mag$f" Coefficient="1" Offset="0" />
<Value name="相电压间谐波含有率序列间谐波实时数据值" desc="实时1-50次间谐波电压含有率" type="6" DO="MHAI$MX$HPhV" DA="phs*Har[%-0]$mag$f" Coefficient="1" Offset="0" />
<Value name="谐波电压有效值序列实时数据角度" desc="实时谐波电压相角(2-50)" type="6" DO="MHAI$MX$HPhV" DA="phs*Har[%-2]$ang$f" /> <Value name="谐波电压有效值序列实时数据角度" desc="实时谐波电压相角(2-50)" type="6" DO="MHAI$MX$HPhV" DA="phs*Har[%-2]$ang$f" />
<Value name="相电压谐波含有率序列实时数据角度" desc="实时谐波电压相角(2-50)" type="6" DO="MHAI$MX$HPhV" DA="phs*Har[%-2]$ang$f" /> <Value name="相电压谐波含有率序列实时数据角度" desc="实时谐波电压相角(2-50)" type="6" DO="MHAI$MX$HPhV" DA="phs*Har[%-2]$ang$f" />
<Value name="线电压偏差实时数据值" desc="实时线电压偏差" type="6" DO="MMXU$MX$LnVolDev" DA="phs*$cVal$mag$f" Coefficient="1"/> <Value name="线电压偏差实时数据值" desc="实时线电压偏差" type="6" DO="MMXU$MX$LnVolDev" DA="phs*$cVal$mag$f" Coefficient="1"/>