调整正式检测公式逻辑,优化绝对值,相对值信息

This commit is contained in:
wr
2025-04-22 15:02:38 +08:00
parent 99d43041cb
commit 59ba5c0a0c

View File

@@ -32,11 +32,10 @@ import java.math.BigDecimal;
import java.math.RoundingMode; import java.math.RoundingMode;
import java.text.NumberFormat; import java.text.NumberFormat;
import java.util.*; import java.util.*;
import java.util.function.BiConsumer;
import java.util.function.Function; import java.util.function.Function;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import static com.njcn.gather.detection.util.socket.UnitUtil.unit;
/** /**
* @author wr * @author wr
@@ -121,14 +120,14 @@ public class DetectionServiceImpl {
case HI: case HI:
AdHarmonicResult harmV = isHarmQualified(dev, devIdMapComm, errDtlsCheckData, U, sourceIssue, dataRule, 2); AdHarmonicResult harmV = isHarmQualified(dev, devIdMapComm, errDtlsCheckData, U, sourceIssue, dataRule, 2);
AdHarmonicResult harmI = isHarmQualified(dev, devIdMapComm, errDtlsCheckData, I, sourceIssue, dataRule, 2); AdHarmonicResult harmI = isHarmQualified(dev, devIdMapComm, errDtlsCheckData, I, sourceIssue, dataRule, 2);
return resultFlag(harmV,harmI,code); return resultFlag(harmV, harmI, code);
/** /**
* 间谐波 * 间谐波
*/ */
case HSV: case HSV:
AdHarmonicResult harmInV = isHarmQualified(dev, devIdMapComm, errDtlsCheckData, U, sourceIssue, dataRule, 1); AdHarmonicResult harmInV = isHarmQualified(dev, devIdMapComm, errDtlsCheckData, U, sourceIssue, dataRule, 1);
AdHarmonicResult harmInI = isHarmQualified(dev, devIdMapComm, errDtlsCheckData, I, sourceIssue, dataRule, 1); AdHarmonicResult harmInI = isHarmQualified(dev, devIdMapComm, errDtlsCheckData, I, sourceIssue, dataRule, 1);
return resultFlag(harmInV,harmInI,code); return resultFlag(harmInV, harmInI, code);
/** /**
* 三相电压不平衡度 * 三相电压不平衡度
*/ */
@@ -179,20 +178,22 @@ public class DetectionServiceImpl {
return isUnknownQualified(dev, devIdMapComm, errDtlsCheckData, sourceIssue, dataRule, code); return isUnknownQualified(dev, devIdMapComm, errDtlsCheckData, sourceIssue, dataRule, code);
} }
} }
public Integer resultFlag(AdHarmonicResult v,AdHarmonicResult i,String code){
List<AdHarmonicResult> info=new ArrayList<>(); public Integer resultFlag(AdHarmonicResult v, AdHarmonicResult i, String code) {
List<AdHarmonicResult> info = new ArrayList<>();
if (ObjectUtil.isNotNull(v)) { if (ObjectUtil.isNotNull(v)) {
info.add(v); info.add(v);
} }
if (ObjectUtil.isNotNull(i)) { if (ObjectUtil.isNotNull(i)) {
info.add(i); info.add(i);
} }
if(CollUtil.isNotEmpty(info)){ if (CollUtil.isNotEmpty(info)) {
detectionDataDealService.acceptAdResult(info, code); detectionDataDealService.acceptAdResult(info, code);
return getInteger(info.stream().map(x->x.getResultFlag()).distinct().collect(Collectors.toList())); return getInteger(info.stream().map(x -> x.getResultFlag()).distinct().collect(Collectors.toList()));
} }
return 4; return 4;
} }
public Integer isUnknownQualified(List<DevData> dev, public Integer isUnknownQualified(List<DevData> dev,
Map<String, String> devIdMapComm, Map<String, String> devIdMapComm,
List<ErrDtlsCheckDataVO> errDtlsCheckData, List<ErrDtlsCheckDataVO> errDtlsCheckData,
@@ -219,15 +220,12 @@ public class DetectionServiceImpl {
result.setSort(sourceIssue.getIndex()); result.setSort(sourceIssue.getIndex());
result.setDataType("avg"); result.setDataType("avg");
Integer isQualified; Integer isQualified;
String valueTypeCode;
List<ErrDtlsCheckDataVO> dtlsCheckData = errDtlsCheckData.stream().filter(x -> x.getValueTypeCode().equals(s.split("\\$")[1])).collect(Collectors.toList()); List<ErrDtlsCheckDataVO> dtlsCheckData = errDtlsCheckData.stream().filter(x -> x.getValueTypeCode().equals(s.split("\\$")[1])).collect(Collectors.toList());
if (CollUtil.isNotEmpty(dtlsCheckData)) { if (CollUtil.isNotEmpty(dtlsCheckData)) {
result.setAdType(dtlsCheckData.get(0).getValueType()); result.setAdType(dtlsCheckData.get(0).getValueType());
isQualified = dtlsCheckData.get(0).getIsQualified(); isQualified = dtlsCheckData.get(0).getIsQualified();
valueTypeCode = dtlsCheckData.get(0).getValueTypeCode();
} else { } else {
isQualified = 4; isQualified = 4;
valueTypeCode = "";
} }
List<DetectionData> resultFlag = new ArrayList<>(); List<DetectionData> resultFlag = new ArrayList<>();
map.forEach((key, value) -> { map.forEach((key, value) -> {
@@ -235,9 +233,9 @@ public class DetectionServiceImpl {
if (CollUtil.isNotEmpty(checkData)) { if (CollUtil.isNotEmpty(checkData)) {
DetectionData detectionData; DetectionData detectionData;
if (DUR.equals(devIndex)) { if (DUR.equals(devIndex)) {
detectionData = rangeDURComparisonList(value, isQualified, valueTypeCode, new ArrayList<>(), sourceIssue.getFFreq(), checkData.get(0).getValue(), dataRule); detectionData = rangeDURComparisonList(value, isQualified, new ArrayList<>(), sourceIssue.getFFreq(), checkData.get(0).getValue(), dataRule);
} else { } else {
detectionData = rangeComparisonList(value, isQualified, valueTypeCode, new ArrayList<>(), null, checkData.get(0).getValue(), dataRule); detectionData = rangeComparisonList(value, isQualified, new ArrayList<>(), null, checkData.get(0).getValue(), dataRule);
} }
if (key.equals(TYPE_T)) { if (key.equals(TYPE_T)) {
result.setTValue(JSON.toJSONString(detectionData)); result.setTValue(JSON.toJSONString(detectionData));
@@ -278,7 +276,6 @@ public class DetectionServiceImpl {
} }
if (devIndex.contains("I")) { if (devIndex.contains("I")) {
fundCode = DetectionCodeEnum.I1.getCode(); fundCode = DetectionCodeEnum.I1.getCode();
;
type = I; type = I;
fData = sourceIssue.getFIn(); fData = sourceIssue.getFIn();
if (devIndex.contains("50")) { if (devIndex.contains("50")) {
@@ -307,15 +304,13 @@ public class DetectionServiceImpl {
if (CollUtil.isNotEmpty(dtlsCheckData)) { if (CollUtil.isNotEmpty(dtlsCheckData)) {
harmonicResult.setAdType(dtlsCheckData.get(0).getValueType()); harmonicResult.setAdType(dtlsCheckData.get(0).getValueType());
isQualified = dtlsCheckData.get(0).getIsQualified(); isQualified = dtlsCheckData.get(0).getIsQualified();
valueTypeCode = dtlsCheckData.get(0).getValueTypeCode();
} else { } else {
isQualified = 4; isQualified = 4;
valueTypeCode = "";
} }
//电压下百分比给百分比直接算 电流是是下百分比给的是幅值要转换算 //电压下百分比给百分比直接算 电流是是下百分比给的是幅值要转换算
List<DetectionData> integerBooleanA = harmRangeComparison(isQualified, valueTypeCode, new ArrayList<>(), type, TYPE_A, sourceIssue, dataRule, devHarmMap.get(TYPE_A), fData, num); List<DetectionData> integerBooleanA = harmRangeComparison(isQualified, new ArrayList<>(), type, TYPE_A, sourceIssue, dataRule, devHarmMap.get(TYPE_A), fData, num);
List<DetectionData> integerBooleanB = harmRangeComparison(isQualified, valueTypeCode, new ArrayList<>(), type, TYPE_B, sourceIssue, dataRule, devHarmMap.get(TYPE_B), fData, num); List<DetectionData> integerBooleanB = harmRangeComparison(isQualified, new ArrayList<>(), type, TYPE_B, sourceIssue, dataRule, devHarmMap.get(TYPE_B), fData, num);
List<DetectionData> integerBooleanC = harmRangeComparison(isQualified, valueTypeCode, new ArrayList<>(), type, TYPE_C, sourceIssue, dataRule, devHarmMap.get(TYPE_C), fData, num); List<DetectionData> integerBooleanC = harmRangeComparison(isQualified, new ArrayList<>(), type, TYPE_C, sourceIssue, dataRule, devHarmMap.get(TYPE_C), fData, num);
harmonicResult.setDataType("avg"); harmonicResult.setDataType("avg");
reflectHarmonic("a", integerBooleanA, harmonicResult, num); reflectHarmonic("a", integerBooleanA, harmonicResult, num);
reflectHarmonic("b", integerBooleanB, harmonicResult, num); reflectHarmonic("b", integerBooleanB, harmonicResult, num);
@@ -382,13 +377,11 @@ public class DetectionServiceImpl {
result.setDataType("avg"); result.setDataType("avg");
List<PqErrSysDtls> pqErrSysDtls = new ArrayList<>(); List<PqErrSysDtls> pqErrSysDtls = new ArrayList<>();
Integer isQualified = 4; Integer isQualified = 4;
String valueTypeCode = "";
if (CollUtil.isNotEmpty(errDtlsCheckData)) { if (CollUtil.isNotEmpty(errDtlsCheckData)) {
List<ErrDtlsCheckDataVO> dtlsCheckData = errDtlsCheckData.stream().filter(x -> x.getValueTypeCode().equals(s.split("\\$")[1])).collect(Collectors.toList()); List<ErrDtlsCheckDataVO> dtlsCheckData = errDtlsCheckData.stream().filter(x -> x.getValueTypeCode().equals(s.split("\\$")[1])).collect(Collectors.toList());
if (CollUtil.isNotEmpty(dtlsCheckData)) { if (CollUtil.isNotEmpty(dtlsCheckData)) {
result.setAdType(dtlsCheckData.get(0).getValueType()); result.setAdType(dtlsCheckData.get(0).getValueType());
isQualified = dtlsCheckData.get(0).getIsQualified(); isQualified = dtlsCheckData.get(0).getIsQualified();
valueTypeCode = dtlsCheckData.get(0).getValueTypeCode();
if (CollUtil.isNotEmpty(dtlsCheckData.get(0).getErrSysDtls())) { if (CollUtil.isNotEmpty(dtlsCheckData.get(0).getErrSysDtls())) {
pqErrSysDtls = dtlsCheckData.get(0).getErrSysDtls(); pqErrSysDtls = dtlsCheckData.get(0).getErrSysDtls();
} }
@@ -396,30 +389,35 @@ public class DetectionServiceImpl {
if (map.containsKey(TYPE_T)) { if (map.containsKey(TYPE_T)) {
List<ErrDtlsCheckDataVO> checkDataT = dtlsCheckData.stream().filter(x -> TYPE_T.equals(x.getPhase())).collect(Collectors.toList()); List<ErrDtlsCheckDataVO> checkDataT = dtlsCheckData.stream().filter(x -> TYPE_T.equals(x.getPhase())).collect(Collectors.toList());
if (CollUtil.isNotEmpty(checkDataT)) { if (CollUtil.isNotEmpty(checkDataT)) {
DetectionData t = rangeComparisonList(map.get(TYPE_T), isQualified, valueTypeCode, pqErrSysDtls, fData, checkDataT.get(0).getValue(), dataRule); DetectionData t = rangeComparisonList(map.get(TYPE_T), isQualified, pqErrSysDtls, fData, checkDataT.get(0).getValue(), dataRule);
result.setTValue(JSON.toJSONString(t)); result.setTValue(JSON.toJSONString(t));
result.setResultFlag(t.getIsData()); result.setResultFlag(t.getIsData());
} }
} else { } else {
List<DetectionData> resultFlag = new ArrayList<>(); List<DetectionData> resultFlag = new ArrayList<>();
//取出源所对应的相别信息 Map<String, BiConsumer<AdNonHarmonicResult, DetectionData>> setters = new HashMap<>();
List<ErrDtlsCheckDataVO> checkDataA = dtlsCheckData.stream().filter(x -> TYPE_A.equals(x.getPhase())).collect(Collectors.toList()); setters.put(TYPE_A, (r, d) -> r.setAValue(JSON.toJSONString(d)));
if (CollUtil.isNotEmpty(checkDataA)) { setters.put(TYPE_B, (r, d) -> r.setBValue(JSON.toJSONString(d)));
DetectionData a = rangeComparisonList(map.get(TYPE_A), isQualified, valueTypeCode, pqErrSysDtls, fData, checkDataA.get(0).getValue(), dataRule); setters.put(TYPE_C, (r, d) -> r.setCValue(JSON.toJSONString(d)));
resultFlag.add(a);
result.setAValue(JSON.toJSONString(a)); List<String> phases = Arrays.asList(TYPE_A, TYPE_B, TYPE_C);
for (String phase : phases) {
List<ErrDtlsCheckDataVO> checkData = dtlsCheckData.stream()
.filter(x -> phase.equals(x.getPhase()))
.collect(Collectors.toList());
if (CollUtil.isNotEmpty(checkData)) {
List<Double> phaseValue = map.get(phase);
// 注意如果map中不存在该phase的键phaseValue可能为null需确保map包含该键
DetectionData detectionData = rangeComparisonList(phaseValue, isQualified, pqErrSysDtls, fData, checkData.get(0).getValue(), dataRule);
resultFlag.add(detectionData);
BiConsumer<AdNonHarmonicResult, DetectionData> setter = setters.get(phase);
if (setter != null) {
setter.accept(result, detectionData);
} else {
// 处理未定义的setter的情况
throw new IllegalArgumentException("Setter not defined for phase: " + phase);
} }
List<ErrDtlsCheckDataVO> checkDataB = dtlsCheckData.stream().filter(x -> TYPE_B.equals(x.getPhase())).collect(Collectors.toList());
if (CollUtil.isNotEmpty(checkDataB)) {
DetectionData b = rangeComparisonList(map.get(TYPE_B), isQualified, valueTypeCode, pqErrSysDtls, fData, checkDataB.get(0).getValue(), dataRule);
resultFlag.add(b);
result.setBValue(JSON.toJSONString(b));
} }
List<ErrDtlsCheckDataVO> checkDataC = dtlsCheckData.stream().filter(x -> TYPE_C.equals(x.getPhase())).collect(Collectors.toList());
if (CollUtil.isNotEmpty(checkDataC)) {
DetectionData c = rangeComparisonList(map.get(TYPE_C), isQualified, valueTypeCode, pqErrSysDtls, fData, checkDataC.get(0).getValue(), dataRule);
resultFlag.add(c);
result.setCValue(JSON.toJSONString(c));
} }
result.setResultFlag(setResultFlag(resultFlag)); result.setResultFlag(setResultFlag(resultFlag));
} }
@@ -487,20 +485,18 @@ public class DetectionServiceImpl {
harmonicResult.setSort(sourceIssue.getIndex()); harmonicResult.setSort(sourceIssue.getIndex());
List<PqErrSysDtls> pqErrSysDtls = new ArrayList<>(); List<PqErrSysDtls> pqErrSysDtls = new ArrayList<>();
Integer isQualified = 4; Integer isQualified = 4;
String valueTypeCode = "";
if (CollUtil.isNotEmpty(errDtlsCheckData)) { if (CollUtil.isNotEmpty(errDtlsCheckData)) {
String finalHarmCode = harmCode; String finalHarmCode = harmCode;
List<ErrDtlsCheckDataVO> adDtlsCheckData = errDtlsCheckData.stream().filter(x -> finalHarmCode.equals(x.getValueTypeCode())).collect(Collectors.toList()); List<ErrDtlsCheckDataVO> adDtlsCheckData = errDtlsCheckData.stream().filter(x -> finalHarmCode.equals(x.getValueTypeCode())).collect(Collectors.toList());
harmonicResult.setAdType(adDtlsCheckData.get(0).getValueType()); harmonicResult.setAdType(adDtlsCheckData.get(0).getValueType());
isQualified = adDtlsCheckData.get(0).getIsQualified(); isQualified = adDtlsCheckData.get(0).getIsQualified();
valueTypeCode = adDtlsCheckData.get(0).getValueTypeCode();
if (CollUtil.isNotEmpty(adDtlsCheckData.get(0).getErrSysDtls())) { if (CollUtil.isNotEmpty(adDtlsCheckData.get(0).getErrSysDtls())) {
pqErrSysDtls = adDtlsCheckData.get(0).getErrSysDtls(); pqErrSysDtls = adDtlsCheckData.get(0).getErrSysDtls();
} }
} }
List<DetectionData> integerBooleanA = harmRangeComparison(isQualified, valueTypeCode, pqErrSysDtls, type, TYPE_A, sourceIssue, dataRule, devMap.get(TYPE_A), fData, num); List<DetectionData> integerBooleanA = harmRangeComparison(isQualified, pqErrSysDtls, type, TYPE_A, sourceIssue, dataRule, devMap.get(TYPE_A), fData, num);
List<DetectionData> integerBooleanB = harmRangeComparison(isQualified, valueTypeCode, pqErrSysDtls, type, TYPE_B, sourceIssue, dataRule, devMap.get(TYPE_B), fData, num); List<DetectionData> integerBooleanB = harmRangeComparison(isQualified, pqErrSysDtls, type, TYPE_B, sourceIssue, dataRule, devMap.get(TYPE_B), fData, num);
List<DetectionData> integerBooleanC = harmRangeComparison(isQualified, valueTypeCode, pqErrSysDtls, type, TYPE_C, sourceIssue, dataRule, devMap.get(TYPE_C), fData, num); List<DetectionData> integerBooleanC = harmRangeComparison(isQualified, pqErrSysDtls, type, TYPE_C, sourceIssue, dataRule, devMap.get(TYPE_C), fData, num);
harmonicResult.setDataType("avg"); harmonicResult.setDataType("avg");
reflectHarmonic("a", integerBooleanA, harmonicResult, num); reflectHarmonic("a", integerBooleanA, harmonicResult, num);
reflectHarmonic("b", integerBooleanB, harmonicResult, num); reflectHarmonic("b", integerBooleanB, harmonicResult, num);
@@ -554,11 +550,9 @@ public class DetectionServiceImpl {
result.setSort(sourceIssue.getIndex()); result.setSort(sourceIssue.getIndex());
List<PqErrSysDtls> pqErrSysDtls = new ArrayList<>(); List<PqErrSysDtls> pqErrSysDtls = new ArrayList<>();
Integer isQualified = 4; Integer isQualified = 4;
String valueTypeCode = "";
if (CollUtil.isNotEmpty(errDtlsCheckData)) { if (CollUtil.isNotEmpty(errDtlsCheckData)) {
result.setAdType(errDtlsCheckData.get(0).getValueType()); result.setAdType(errDtlsCheckData.get(0).getValueType());
isQualified = errDtlsCheckData.get(0).getIsQualified(); isQualified = errDtlsCheckData.get(0).getIsQualified();
valueTypeCode = errDtlsCheckData.get(0).getValueTypeCode();
if (CollUtil.isNotEmpty(errDtlsCheckData.get(0).getErrSysDtls())) { if (CollUtil.isNotEmpty(errDtlsCheckData.get(0).getErrSysDtls())) {
pqErrSysDtls = errDtlsCheckData.get(0).getErrSysDtls(); pqErrSysDtls = errDtlsCheckData.get(0).getErrSysDtls();
} }
@@ -569,19 +563,19 @@ public class DetectionServiceImpl {
List<PqScriptCheckData> channelTypeAList = checkData.stream() List<PqScriptCheckData> channelTypeAList = checkData.stream()
.filter(x -> TYPE_A.equals(x.getPhase())) .filter(x -> TYPE_A.equals(x.getPhase()))
.collect(Collectors.toList()); .collect(Collectors.toList());
DetectionData a = rangeComparisonList(map.get(TYPE_A), isQualified, valueTypeCode, pqErrSysDtls, fData, channelTypeAList.get(0).getValue(), dataRule); DetectionData a = rangeComparisonList(map.get(TYPE_A), isQualified, pqErrSysDtls, fData, channelTypeAList.get(0).getValue(), dataRule);
result.setAValue(JSON.toJSONString(a)); result.setAValue(JSON.toJSONString(a));
List<PqScriptCheckData> channelTypeBList = checkData.stream() List<PqScriptCheckData> channelTypeBList = checkData.stream()
.filter(x -> TYPE_B.equals(x.getPhase())) .filter(x -> TYPE_B.equals(x.getPhase()))
.collect(Collectors.toList()); .collect(Collectors.toList());
DetectionData b = rangeComparisonList(map.get(TYPE_B), isQualified, valueTypeCode, pqErrSysDtls, fData, channelTypeBList.get(0).getValue(), dataRule); DetectionData b = rangeComparisonList(map.get(TYPE_B), isQualified, pqErrSysDtls, fData, channelTypeBList.get(0).getValue(), dataRule);
result.setBValue(JSON.toJSONString(b)); result.setBValue(JSON.toJSONString(b));
List<PqScriptCheckData> channelTypeCList = checkData.stream() List<PqScriptCheckData> channelTypeCList = checkData.stream()
.filter(x -> TYPE_C.equals(x.getPhase())) .filter(x -> TYPE_C.equals(x.getPhase()))
.collect(Collectors.toList()); .collect(Collectors.toList());
DetectionData c = rangeComparisonList(map.get(TYPE_C), isQualified, valueTypeCode, pqErrSysDtls, fData, channelTypeCList.get(0).getValue(), dataRule); DetectionData c = rangeComparisonList(map.get(TYPE_C), isQualified, pqErrSysDtls, fData, channelTypeCList.get(0).getValue(), dataRule);
result.setCValue(JSON.toJSONString(c)); result.setCValue(JSON.toJSONString(c));
result.setResultFlag(setResultFlag(Arrays.asList(a, b, c))); result.setResultFlag(setResultFlag(Arrays.asList(a, b, c)));
@@ -589,7 +583,7 @@ public class DetectionServiceImpl {
List<PqScriptCheckData> channelTypeBList = checkData.stream() List<PqScriptCheckData> channelTypeBList = checkData.stream()
.filter(x -> TYPE_T.equals(x.getPhase())) .filter(x -> TYPE_T.equals(x.getPhase()))
.collect(Collectors.toList()); .collect(Collectors.toList());
DetectionData t = rangeComparisonList(map.get(TYPE_B), isQualified, valueTypeCode, pqErrSysDtls, fData, channelTypeBList.get(0).getValue(), dataRule); DetectionData t = rangeComparisonList(map.get(TYPE_B), isQualified, pqErrSysDtls, fData, channelTypeBList.get(0).getValue(), dataRule);
result.setTValue(JSON.toJSONString(t)); result.setTValue(JSON.toJSONString(t));
result.setResultFlag(setResultFlag(Arrays.asList(t))); result.setResultFlag(setResultFlag(Arrays.asList(t)));
} }
@@ -601,12 +595,12 @@ public class DetectionServiceImpl {
/** /**
* 判断值是否在误差范围内,有则进行判断否则则不进行计算(暂态) * 判断值是否在误差范围内,有则进行判断否则则不进行计算(暂态)
* * <p>
* (假如都符合,则选取最开始合格的,都不合格,取最开始不合格的) * (假如都符合,则选取最开始合格的,都不合格,取最开始不合格的)
* 方案一 分项问题 * 方案一 分项问题
* 分别计算各个相别是否合格 * 分别计算各个相别是否合格
* 不合格电压幅值的层级最高 * 不合格电压幅值的层级最高
* * <p>
* 方案二 不分项问题 * 方案二 不分项问题
* 以电压幅值最低的作为比较相别 * 以电压幅值最低的作为比较相别
* *
@@ -737,11 +731,9 @@ public class DetectionServiceImpl {
result.setDataType("avg"); result.setDataType("avg");
List<PqErrSysDtls> magErrList = new ArrayList<>(); List<PqErrSysDtls> magErrList = new ArrayList<>();
Integer isQualified = 4; Integer isQualified = 4;
String valueTypeCode = "";
if (CollUtil.isNotEmpty(errDtlsCheckData)) { if (CollUtil.isNotEmpty(errDtlsCheckData)) {
result.setAdType(errDtlsCheckData.get(0).getValueType()); result.setAdType(errDtlsCheckData.get(0).getValueType());
isQualified = errDtlsCheckData.get(0).getIsQualified(); isQualified = errDtlsCheckData.get(0).getIsQualified();
valueTypeCode = errDtlsCheckData.get(0).getValueTypeCode();
if (CollUtil.isNotEmpty(errDtlsCheckData.get(0).getErrSysDtls())) { if (CollUtil.isNotEmpty(errDtlsCheckData.get(0).getErrSysDtls())) {
magErrList = errDtlsCheckData.get(0).getErrSysDtls(); magErrList = errDtlsCheckData.get(0).getErrSysDtls();
} }
@@ -750,24 +742,24 @@ public class DetectionServiceImpl {
.filter(x -> ("Ub").equals(x.getChannelType())) .filter(x -> ("Ub").equals(x.getChannelType()))
.collect(Collectors.toList()); .collect(Collectors.toList());
DetectionData b = setDetectionData(isQualified, valueTypeCode, dataRule, mag, fData, dur, magErrList, channelTypeBList, TYPE_B); DetectionData b = setDetectionData(isQualified, dataRule, mag, fData, dur, magErrList, channelTypeBList, TYPE_B);
result.setBValue(JSON.toJSONString(b)); result.setBValue(JSON.toJSONString(b));
List<SourceIssue.ChannelListDTO> channelTypeCList = sourceIssue.getChannelList().stream() List<SourceIssue.ChannelListDTO> channelTypeCList = sourceIssue.getChannelList().stream()
.filter(x -> ("Uc").equals(x.getChannelType())) .filter(x -> ("Uc").equals(x.getChannelType()))
.collect(Collectors.toList()); .collect(Collectors.toList());
DetectionData c = setDetectionData(isQualified, valueTypeCode, dataRule, mag, fData, dur, magErrList, channelTypeCList, TYPE_C); DetectionData c = setDetectionData(isQualified, dataRule, mag, fData, dur, magErrList, channelTypeCList, TYPE_C);
result.setCValue(JSON.toJSONString(c)); result.setCValue(JSON.toJSONString(c));
if (CollUtil.isNotEmpty(mag.get(TYPE_B)) &&CollUtil.isNotEmpty(mag.get(TYPE_C))) { if (CollUtil.isNotEmpty(mag.get(TYPE_B)) && CollUtil.isNotEmpty(mag.get(TYPE_C))) {
//取出源所对应的相别信息 //取出源所对应的相别信息
List<SourceIssue.ChannelListDTO> channelTypeAList = sourceIssue.getChannelList().stream() List<SourceIssue.ChannelListDTO> channelTypeAList = sourceIssue.getChannelList().stream()
.filter(x -> ("Ua").equals(x.getChannelType())) .filter(x -> ("Ua").equals(x.getChannelType()))
.collect(Collectors.toList()); .collect(Collectors.toList());
DetectionData a = setDetectionData(isQualified, valueTypeCode, dataRule, mag, fData, dur, magErrList, channelTypeAList, TYPE_A); DetectionData a = setDetectionData(isQualified, dataRule, mag, fData, dur, magErrList, channelTypeAList, TYPE_A);
result.setAValue(JSON.toJSONString(a)); result.setAValue(JSON.toJSONString(a));
result.setResultFlag(setResultFlag(Arrays.asList(a, b, c))); result.setResultFlag(setResultFlag(Arrays.asList(a, b, c)));
}else { } else {
List<SourceIssue.ChannelListDTO> channelTypeAList = sourceIssue.getChannelList().stream() List<SourceIssue.ChannelListDTO> channelTypeAList = sourceIssue.getChannelList().stream()
.filter(x -> x.getChannelType().contains("U")) .filter(x -> x.getChannelType().contains("U"))
.sorted(Comparator.comparing( .sorted(Comparator.comparing(
@@ -776,7 +768,7 @@ public class DetectionServiceImpl {
.orElse(Double.NaN) .orElse(Double.NaN)
)) ))
.collect(Collectors.toList()); .collect(Collectors.toList());
DetectionData a = setDetectionData(isQualified, valueTypeCode, dataRule, mag, fData, dur, magErrList, channelTypeAList, TYPE_A); DetectionData a = setDetectionData(isQualified, dataRule, mag, fData, dur, magErrList, channelTypeAList, TYPE_A);
result.setAValue(JSON.toJSONString(a)); result.setAValue(JSON.toJSONString(a));
result.setTValue(JSON.toJSONString(a)); result.setTValue(JSON.toJSONString(a));
result.setResultFlag(a.getIsData()); result.setResultFlag(a.getIsData());
@@ -785,25 +777,20 @@ public class DetectionServiceImpl {
} }
private DetectionData setDetectionData(Integer isQualified, private DetectionData setDetectionData(Integer isQualified,
String valueTypeCode,
DictDataEnum dataRule, DictDataEnum dataRule,
Map<String, List<Double>> mag, Map<String, List<Double>> mag,
Double fData, Double fData,
String dur, String dur,
List<PqErrSysDtls> magErrList, List<PqErrSysDtls> magErrList,
List<SourceIssue.ChannelListDTO> channelTypeCList, List<SourceIssue.ChannelListDTO> channelTypeCList,
String typeC) { String type) {
DetectionData c; DetectionData data;
if (DUR.equals(dur)) { if (DUR.equals(dur)) {
c = rangeDURComparisonList(mag.get(typeC), isQualified, valueTypeCode, magErrList, fData, channelTypeCList.get(0).getDipData().getRetainTime(), dataRule); data = rangeDURComparisonList(mag.get(type), isQualified, magErrList, fData, channelTypeCList.get(0).getDipData().getRetainTime(), dataRule);
} else { } else {
List<Double> ampData = mag.get(typeC).stream() data = rangeComparisonList(mag.get(type), isQualified, magErrList, fData, channelTypeCList.get(0).getDipData().getFTransValue(), dataRule);
.filter(x -> ObjectUtil.isNotNull(x))
.map(x -> NumberUtil.round(x * channelTypeCList.get(0).getFAmp() * 0.01, 4).doubleValue())
.collect(Collectors.toList());
c = rangeComparisonList(ampData, isQualified, valueTypeCode, magErrList, fData, channelTypeCList.get(0).getDipData().getFTransValue(), dataRule);
} }
return c; return data;
} }
@@ -924,11 +911,10 @@ public class DetectionServiceImpl {
* @param sourceIssue 源下发的值(谐波) * @param sourceIssue 源下发的值(谐波)
* @param dataRule 数据处理原则 * @param dataRule 数据处理原则
* @param devMap * @param devMap
* @param fData * @param fData 额定值
* @return * @return
*/ */
public List<DetectionData> harmRangeComparison(Integer isQualified, public List<DetectionData> harmRangeComparison(Integer isQualified,
String valueTypeCode,
List<PqErrSysDtls> pqErrSysDtls, List<PqErrSysDtls> pqErrSysDtls,
String type, String type,
String phase, String phase,
@@ -959,12 +945,12 @@ public class DetectionServiceImpl {
issueHarmMap = sourceIssue.getChannelList().stream() issueHarmMap = sourceIssue.getChannelList().stream()
.filter(x -> (type + phase.toLowerCase()).equals(x.getChannelType())) .filter(x -> (type + phase.toLowerCase()).equals(x.getChannelType()))
.flatMap(x -> x.getInharmList().stream()) .flatMap(x -> x.getInharmList().stream())
.collect(Collectors.toMap(SourceIssue.ChannelListDTO.InharmModel::getInharm, x -> x.getFAmp() * percent)); .collect(Collectors.toMap(SourceIssue.ChannelListDTO.InharmModel::getInharm, x -> BigDecimal.valueOf(x.getFAmp()).multiply(BigDecimal.valueOf(percent)).doubleValue()));
} else { } else {
issueHarmMap = sourceIssue.getChannelList().stream() issueHarmMap = sourceIssue.getChannelList().stream()
.filter(x -> (type + phase.toLowerCase()).equals(x.getChannelType())) .filter(x -> (type + phase.toLowerCase()).equals(x.getChannelType()))
.flatMap(x -> x.getHarmList().stream()) .flatMap(x -> x.getHarmList().stream())
.collect(Collectors.toMap(SourceIssue.ChannelListDTO.HarmModel::getHarm, x -> x.getFAmp() * percent)); .collect(Collectors.toMap(SourceIssue.ChannelListDTO.HarmModel::getHarm, x -> BigDecimal.valueOf(x.getFAmp()).multiply(BigDecimal.valueOf(percent)).doubleValue()));
} }
} }
Map<Double, PqErrSysDtls> errSysDtlMap = new LinkedHashMap<>(); Map<Double, PqErrSysDtls> errSysDtlMap = new LinkedHashMap<>();
@@ -990,17 +976,14 @@ public class DetectionServiceImpl {
if (CollUtil.isNotEmpty(harmDataList)) { if (CollUtil.isNotEmpty(harmDataList)) {
data.setData(harmDataList.get(0)); data.setData(harmDataList.get(0));
} }
Double v = issueHarmMap.get(harm); Double channelData = issueHarmMap.get(harm);
data.setResultData(v); data.setResultData(channelData);
if (ObjectUtil.isNotNull(errSysDtl)) { if (ObjectUtil.isNotNull(errSysDtl)) {
PqErrSysDtls errSys = BeanUtil.copyProperties(errSysDtl, PqErrSysDtls.class); PqErrSysDtls errSys = BeanUtil.copyProperties(errSysDtl, PqErrSysDtls.class);
errSys.setMaxErrorValue(maxErrorMultiply(errSys.getMaxErrorValue(), fData, issueHarmMap.get(harm), errSys.getErrorValueType())); errSys.setMaxErrorValue(maxErrorMultiply(errSys, fData, issueHarmMap.get(harm)));
NumberFormat nf = NumberFormat.getInstance(); data.setUnit(errSysDtl.getErrorUnit());
nf.setMaximumFractionDigits(6); data.setRadius(-errSys.getMaxErrorValue() + "~" + errSys.getMaxErrorValue());
nf.setGroupingUsed(false); setDetection(dataRule, harmDataList, errSys, data, channelData, fData);
data.setUnit(unit(valueTypeCode, errSysDtl.getErrorValueType()));
data.setRadius(nf.format(-errSys.getMaxErrorValue()) + "~" + nf.format(errSys.getMaxErrorValue()));
setDetection(dataRule, harmDataList, errSys, data, v);
} }
info.add(data); info.add(data);
}); });
@@ -1013,26 +996,27 @@ public class DetectionServiceImpl {
* @param harmDataList 原始数据集合 * @param harmDataList 原始数据集合
* @param errSysDtl 误差体系 * @param errSysDtl 误差体系
* @param data 初始化原始数据 * @param data 初始化原始数据
* @param v 源下发的数据 * @param channelData 源下发的数据
* @param ratedValue 额定值
* @Description: * @Description:
* @Author: wr * @Author: wr
* @Date: 2024/12/29 18:10 * @Date: 2024/12/29 18:10
*/ */
private void setDetection(DictDataEnum dataRule, List<Double> harmDataList, PqErrSysDtls errSysDtl, DetectionData data, Double v) { private void setDetection(DictDataEnum dataRule, List<Double> harmDataList, PqErrSysDtls errSysDtl, DetectionData data, Double channelData, Double ratedValue) {
if (CollUtil.isNotEmpty(harmDataList)) { if (CollUtil.isNotEmpty(harmDataList)) {
// 存放合格的数据 // 存放合格的数据
List<Double> qualifiedList = harmDataList.stream() List<Double> qualifiedList = harmDataList.stream()
.filter(x -> v == 0 ? NumberUtil.isIn(devSubtractChannelData(x, v, errSysDtl.getErrorValueType()), .filter(x -> channelData == 0 ? NumberUtil.isIn(devSubtractChannelData(x, channelData, ratedValue, errSysDtl),
BigDecimal.valueOf(-errSysDtl.getMaxErrorValue()), BigDecimal.valueOf(-errSysDtl.getMaxErrorValue()),
BigDecimal.valueOf(errSysDtl.getMaxErrorValue())) BigDecimal.valueOf(errSysDtl.getMaxErrorValue()))
: :
x != 0 && NumberUtil.isIn(devSubtractChannelData(x, v, errSysDtl.getErrorValueType()), x != 0 && NumberUtil.isIn(devSubtractChannelData(x, channelData, ratedValue, errSysDtl),
BigDecimal.valueOf(-errSysDtl.getMaxErrorValue()), BigDecimal.valueOf(-errSysDtl.getMaxErrorValue()),
BigDecimal.valueOf(errSysDtl.getMaxErrorValue()))).collect(Collectors.toList()); BigDecimal.valueOf(errSysDtl.getMaxErrorValue()))).collect(Collectors.toList());
if (CollUtil.isNotEmpty(qualifiedList)) { if (CollUtil.isNotEmpty(qualifiedList)) {
data.setErrorData(devSubtractChannelData(qualifiedList.get(0), v, errSysDtl.getErrorValueType())); data.setErrorData(devSubtractChannelData(qualifiedList.get(0), channelData, ratedValue, errSysDtl));
} else { } else {
data.setErrorData(devSubtractChannelData(harmDataList.get(0), v, errSysDtl.getErrorValueType())); data.setErrorData(devSubtractChannelData(harmDataList.get(0), channelData, ratedValue, errSysDtl));
} }
isData(dataRule, harmDataList, data, qualifiedList); isData(dataRule, harmDataList, data, qualifiedList);
} }
@@ -1163,7 +1147,7 @@ public class DetectionServiceImpl {
* @param dataRule 数据处理原则 * @param dataRule 数据处理原则
* @returnd * @returnd
*/ */
public DetectionData rangeComparisonList(List<Double> list, Integer isQualified, String valueTypeCode, List<PqErrSysDtls> pqErrSysDtls, Double data, Double channelData, DictDataEnum dataRule) { public DetectionData rangeComparisonList(List<Double> list, Integer isQualified, List<PqErrSysDtls> pqErrSysDtls, Double data, Double channelData, DictDataEnum dataRule) {
DetectionData detectionData = new DetectionData(); DetectionData detectionData = new DetectionData();
detectionData.setIsData(isQualified); detectionData.setIsData(isQualified);
if (CollUtil.isNotEmpty(list)) { if (CollUtil.isNotEmpty(list)) {
@@ -1178,19 +1162,16 @@ public class DetectionServiceImpl {
channelData)).collect(Collectors.toList()); channelData)).collect(Collectors.toList());
if (CollUtil.isNotEmpty(errSysDtls)) { if (CollUtil.isNotEmpty(errSysDtls)) {
PqErrSysDtls errSysDtl = BeanUtil.copyProperties(errSysDtls.get(0), PqErrSysDtls.class); PqErrSysDtls errSysDtl = BeanUtil.copyProperties(errSysDtls.get(0), PqErrSysDtls.class);
NumberFormat nf = NumberFormat.getInstance(); detectionData.setUnit(errSysDtl.getErrorUnit());
nf.setMaximumFractionDigits(6); errSysDtl.setMaxErrorValue(maxErrorMultiply(errSysDtl, data, channelData));
nf.setGroupingUsed(false); detectionData.setRadius(-errSysDtl.getMaxErrorValue() + "~" + errSysDtl.getMaxErrorValue());
detectionData.setUnit(unit(valueTypeCode, errSysDtl.getErrorValueType())); setDetection(dataRule, list, errSysDtl, detectionData, channelData, data);
errSysDtl.setMaxErrorValue(maxErrorMultiply(errSysDtl.getMaxErrorValue(), data, channelData, errSysDtl.getErrorValueType()));
detectionData.setRadius(nf.format(-errSysDtl.getMaxErrorValue()) + "~" + nf.format(errSysDtl.getMaxErrorValue()));
setDetection(dataRule, list, errSysDtl, detectionData, channelData);
} }
} }
return detectionData; return detectionData;
} }
public DetectionData rangeDURComparisonList(List<Double> list, Integer isQualified, String valueTypeCode, List<PqErrSysDtls> pqErrSysDtls, Double data, Double channelData, DictDataEnum dataRule) { public DetectionData rangeDURComparisonList(List<Double> list, Integer isQualified, List<PqErrSysDtls> pqErrSysDtls, Double data, Double channelData, DictDataEnum dataRule) {
DetectionData detectionData = new DetectionData(); DetectionData detectionData = new DetectionData();
detectionData.setIsData(isQualified); detectionData.setIsData(isQualified);
if (CollUtil.isNotEmpty(list)) { if (CollUtil.isNotEmpty(list)) {
@@ -1209,7 +1190,7 @@ public class DetectionServiceImpl {
NumberFormat nf = NumberFormat.getInstance(); NumberFormat nf = NumberFormat.getInstance();
nf.setMaximumFractionDigits(6); nf.setMaximumFractionDigits(6);
nf.setGroupingUsed(false); nf.setGroupingUsed(false);
detectionData.setUnit(unit(valueTypeCode, errSysDtl.getErrorValueType())); detectionData.setUnit(errSysDtl.getErrorUnit());
detectionData.setRadius(nf.format(BigDecimal.valueOf(-1.0 / data)) detectionData.setRadius(nf.format(BigDecimal.valueOf(-1.0 / data))
+ "~" + nf.format(BigDecimal.valueOf(1.0 / data))); + "~" + nf.format(BigDecimal.valueOf(1.0 / data)));
List<Double> qualifiedList = list.stream() List<Double> qualifiedList = list.stream()
@@ -1275,39 +1256,36 @@ public class DetectionServiceImpl {
} }
/** /**
* 技术数据误差值(装置返回的值 - 源通道下发的值) * 计算数据误差值(装置返回的值 - 源通道下发的值)
* *
* @param devData * @param devData 装置返回值
* @param channelData * @param channelData 通道值
* @param errorValueType * @param ratedValue 额定值
* @param error
* @return * @return
*/ */
public BigDecimal devSubtractChannelData(Double devData, Double channelData, Integer errorValueType) { public BigDecimal devSubtractChannelData(Double devData, Double channelData, Double ratedValue, PqErrSysDtls error) {
//计算装置值返回值 - 源下发值的数据 = 差值
BigDecimal subtract = BigDecimal.valueOf(devData).subtract(BigDecimal.valueOf(channelData)); BigDecimal subtract = BigDecimal.valueOf(devData).subtract(BigDecimal.valueOf(channelData));
if (subtract.doubleValue() != 0) { //只有相对值需要%比较,绝对值直接相减就行
switch (errorValueType) { if (2 == error.getValueType()) {
case 2: switch (error.getErrorValueType()) {
//下发的谐波电压幅值,返回的是谐波电压含有率,拿(含有率值*基波 - 源下发对应谐波值幅值)/下发的幅值 case 0:
//下发的谐波电压幅值,返回的是谐波电压含有率,拿(含有率值*基波 - 源下发对应谐波值幅值)/ 额定值
return subtract.multiply(BigDecimal.valueOf(100))
.divide(BigDecimal.valueOf(ratedValue), 4, RoundingMode.HALF_UP);
case 1:
//todo 当谐波电压和间谐波电压默认都是按照相对值误差进行计算(用户关心的是含有率)
//下发的谐波电压幅值,返回的是谐波电压含有率,拿(含有率值*基波 - 源下发对应谐波值幅值)/ 下发的幅值
return subtract.multiply(BigDecimal.valueOf(100)) return subtract.multiply(BigDecimal.valueOf(100))
.divide(BigDecimal.valueOf(channelData), 4, RoundingMode.HALF_UP); .divide(BigDecimal.valueOf(channelData), 4, RoundingMode.HALF_UP);
case 3: }
//下发的谐波电压幅值,返回的是谐波电压含有率,拿(含有率值*基波 - 源下发对应谐波值幅值)/装置返回值
return subtract.multiply(BigDecimal.valueOf(100))
.divide(BigDecimal.valueOf(devData), 4, RoundingMode.HALF_UP);
} }
return subtract; return subtract;
} }
return BigDecimal.valueOf(0);
}
public BigDecimal divide(Double devData, Double channelData) {
return BigDecimal.valueOf(devData)
.divide(BigDecimal.valueOf(channelData), 4, RoundingMode.HALF_UP);
}
/** /**
* 用于计算误差体系的范围的 * 用于计算误差体系的范围的0标称值 1谐波值 2值类型
* *
* @param value 误差值 * @param value 误差值
* @param ratedData 额定值 * @param ratedData 额定值
@@ -1334,27 +1312,37 @@ public class DetectionServiceImpl {
/** /**
* 用于计算最大误差值的范围的 * 用于计算最大误差值的范围的
* 2绝对值-值比较(默认) 0绝对值-标称值(额定电压) 1绝对值-标准值(源下发直谐波如:H2 0相对值-标称值 1相对值-标准值)
* *
* @param errorValue 误差值 * @param error 最大误差值对象
* @param ratedData 额定值 * @param ratedData 额定值
* @param harmData 谐波下发值(百分数->含油率) * @param harmData 谐波下发值(百分数->含油率)
* @param type 误差值类型
* @return * @return
*/ */
public Double maxErrorMultiply(Double errorValue, Double ratedData, Double harmData, Integer type) { public Double maxErrorMultiply(PqErrSysDtls error, Double ratedData, Double harmData) {
if (ObjectUtil.isNotNull(errorValue)) { Double errorValue = error.getMaxErrorValue();
switch (type) { //1绝对值
if (1 == error.getValueType()) {
switch (error.getErrorValueType()) {
//绝对值-标称值= 最大误差值 * 额定电压
case 0: case 0:
return BigDecimal.valueOf(errorValue).multiply(BigDecimal.valueOf(ratedData)) return BigDecimal.valueOf(errorValue).multiply(BigDecimal.valueOf(ratedData))
.setScale(4, RoundingMode.HALF_UP).doubleValue(); .setScale(4, RoundingMode.HALF_UP).doubleValue();
case 2: //绝对值-标准值 = 最大误差值 * 谐波下发值
case 3: case 1:
return BigDecimal.valueOf(errorValue).multiply(BigDecimal.valueOf(harmData))
.setScale(4, RoundingMode.HALF_UP).doubleValue();
}
}
//2相对值
if (2 == error.getValueType()) {
switch (error.getErrorValueType()) {
//相对值-标称值 | 相对值-标准值 = 最大误差值 * 100
case 0:
case 1:
return BigDecimal.valueOf(errorValue).multiply(BigDecimal.valueOf(100)) return BigDecimal.valueOf(errorValue).multiply(BigDecimal.valueOf(100))
.setScale(4, RoundingMode.HALF_UP).doubleValue(); .setScale(4, RoundingMode.HALF_UP).doubleValue();
default:
return errorValue;
} }
} }
return errorValue; return errorValue;
} }