From 59ba5c0a0c96b231fabe53891efeb0d1a3a4cb4e Mon Sep 17 00:00:00 2001 From: wr <1754607820@qq.com> Date: Tue, 22 Apr 2025 15:02:38 +0800 Subject: [PATCH] =?UTF-8?q?=E8=B0=83=E6=95=B4=E6=AD=A3=E5=BC=8F=E6=A3=80?= =?UTF-8?q?=E6=B5=8B=E5=85=AC=E5=BC=8F=E9=80=BB=E8=BE=91=EF=BC=8C=E4=BC=98?= =?UTF-8?q?=E5=8C=96=E7=BB=9D=E5=AF=B9=E5=80=BC=EF=BC=8C=E7=9B=B8=E5=AF=B9?= =?UTF-8?q?=E5=80=BC=E4=BF=A1=E6=81=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/impl/DetectionServiceImpl.java | 266 +++++++++--------- 1 file changed, 127 insertions(+), 139 deletions(-) diff --git a/detection/src/main/java/com/njcn/gather/detection/service/impl/DetectionServiceImpl.java b/detection/src/main/java/com/njcn/gather/detection/service/impl/DetectionServiceImpl.java index 46af89a3..fc90df4d 100644 --- a/detection/src/main/java/com/njcn/gather/detection/service/impl/DetectionServiceImpl.java +++ b/detection/src/main/java/com/njcn/gather/detection/service/impl/DetectionServiceImpl.java @@ -32,11 +32,10 @@ import java.math.BigDecimal; import java.math.RoundingMode; import java.text.NumberFormat; import java.util.*; +import java.util.function.BiConsumer; import java.util.function.Function; import java.util.stream.Collectors; -import static com.njcn.gather.detection.util.socket.UnitUtil.unit; - /** * @author wr @@ -121,14 +120,14 @@ public class DetectionServiceImpl { case HI: AdHarmonicResult harmV = isHarmQualified(dev, devIdMapComm, errDtlsCheckData, U, 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: AdHarmonicResult harmInV = isHarmQualified(dev, devIdMapComm, errDtlsCheckData, U, 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); } } - public Integer resultFlag(AdHarmonicResult v,AdHarmonicResult i,String code){ - List info=new ArrayList<>(); + + public Integer resultFlag(AdHarmonicResult v, AdHarmonicResult i, String code) { + List info = new ArrayList<>(); if (ObjectUtil.isNotNull(v)) { info.add(v); } if (ObjectUtil.isNotNull(i)) { info.add(i); } - if(CollUtil.isNotEmpty(info)){ + if (CollUtil.isNotEmpty(info)) { 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; } + public Integer isUnknownQualified(List dev, Map devIdMapComm, List errDtlsCheckData, @@ -219,15 +220,12 @@ public class DetectionServiceImpl { result.setSort(sourceIssue.getIndex()); result.setDataType("avg"); Integer isQualified; - String valueTypeCode; List dtlsCheckData = errDtlsCheckData.stream().filter(x -> x.getValueTypeCode().equals(s.split("\\$")[1])).collect(Collectors.toList()); if (CollUtil.isNotEmpty(dtlsCheckData)) { result.setAdType(dtlsCheckData.get(0).getValueType()); isQualified = dtlsCheckData.get(0).getIsQualified(); - valueTypeCode = dtlsCheckData.get(0).getValueTypeCode(); } else { isQualified = 4; - valueTypeCode = ""; } List resultFlag = new ArrayList<>(); map.forEach((key, value) -> { @@ -235,9 +233,9 @@ public class DetectionServiceImpl { if (CollUtil.isNotEmpty(checkData)) { DetectionData detectionData; 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 { - 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)) { result.setTValue(JSON.toJSONString(detectionData)); @@ -278,7 +276,6 @@ public class DetectionServiceImpl { } if (devIndex.contains("I")) { fundCode = DetectionCodeEnum.I1.getCode(); - ; type = I; fData = sourceIssue.getFIn(); if (devIndex.contains("50")) { @@ -307,15 +304,13 @@ public class DetectionServiceImpl { if (CollUtil.isNotEmpty(dtlsCheckData)) { harmonicResult.setAdType(dtlsCheckData.get(0).getValueType()); isQualified = dtlsCheckData.get(0).getIsQualified(); - valueTypeCode = dtlsCheckData.get(0).getValueTypeCode(); } else { isQualified = 4; - valueTypeCode = ""; } //电压下百分比给百分比直接算 电流是是下百分比给的是幅值要转换算 - List integerBooleanA = harmRangeComparison(isQualified, valueTypeCode, new ArrayList<>(), type, TYPE_A, sourceIssue, dataRule, devHarmMap.get(TYPE_A), fData, num); - List integerBooleanB = harmRangeComparison(isQualified, valueTypeCode, new ArrayList<>(), type, TYPE_B, sourceIssue, dataRule, devHarmMap.get(TYPE_B), fData, num); - List integerBooleanC = harmRangeComparison(isQualified, valueTypeCode, new ArrayList<>(), type, TYPE_C, sourceIssue, dataRule, devHarmMap.get(TYPE_C), fData, num); + List integerBooleanA = harmRangeComparison(isQualified, new ArrayList<>(), type, TYPE_A, sourceIssue, dataRule, devHarmMap.get(TYPE_A), fData, num); + List integerBooleanB = harmRangeComparison(isQualified, new ArrayList<>(), type, TYPE_B, sourceIssue, dataRule, devHarmMap.get(TYPE_B), fData, num); + List integerBooleanC = harmRangeComparison(isQualified, new ArrayList<>(), type, TYPE_C, sourceIssue, dataRule, devHarmMap.get(TYPE_C), fData, num); harmonicResult.setDataType("avg"); reflectHarmonic("a", integerBooleanA, harmonicResult, num); reflectHarmonic("b", integerBooleanB, harmonicResult, num); @@ -382,13 +377,11 @@ public class DetectionServiceImpl { result.setDataType("avg"); List pqErrSysDtls = new ArrayList<>(); Integer isQualified = 4; - String valueTypeCode = ""; if (CollUtil.isNotEmpty(errDtlsCheckData)) { List dtlsCheckData = errDtlsCheckData.stream().filter(x -> x.getValueTypeCode().equals(s.split("\\$")[1])).collect(Collectors.toList()); if (CollUtil.isNotEmpty(dtlsCheckData)) { result.setAdType(dtlsCheckData.get(0).getValueType()); isQualified = dtlsCheckData.get(0).getIsQualified(); - valueTypeCode = dtlsCheckData.get(0).getValueTypeCode(); if (CollUtil.isNotEmpty(dtlsCheckData.get(0).getErrSysDtls())) { pqErrSysDtls = dtlsCheckData.get(0).getErrSysDtls(); } @@ -396,30 +389,35 @@ public class DetectionServiceImpl { if (map.containsKey(TYPE_T)) { List checkDataT = dtlsCheckData.stream().filter(x -> TYPE_T.equals(x.getPhase())).collect(Collectors.toList()); 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.setResultFlag(t.getIsData()); } } else { List resultFlag = new ArrayList<>(); - //取出源所对应的相别信息 - List checkDataA = dtlsCheckData.stream().filter(x -> TYPE_A.equals(x.getPhase())).collect(Collectors.toList()); - if (CollUtil.isNotEmpty(checkDataA)) { - DetectionData a = rangeComparisonList(map.get(TYPE_A), isQualified, valueTypeCode, pqErrSysDtls, fData, checkDataA.get(0).getValue(), dataRule); - resultFlag.add(a); - result.setAValue(JSON.toJSONString(a)); - } - List 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 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)); + Map> setters = new HashMap<>(); + setters.put(TYPE_A, (r, d) -> r.setAValue(JSON.toJSONString(d))); + setters.put(TYPE_B, (r, d) -> r.setBValue(JSON.toJSONString(d))); + setters.put(TYPE_C, (r, d) -> r.setCValue(JSON.toJSONString(d))); + + List phases = Arrays.asList(TYPE_A, TYPE_B, TYPE_C); + for (String phase : phases) { + List checkData = dtlsCheckData.stream() + .filter(x -> phase.equals(x.getPhase())) + .collect(Collectors.toList()); + if (CollUtil.isNotEmpty(checkData)) { + List 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 setter = setters.get(phase); + if (setter != null) { + setter.accept(result, detectionData); + } else { + // 处理未定义的setter的情况 + throw new IllegalArgumentException("Setter not defined for phase: " + phase); + } + } } result.setResultFlag(setResultFlag(resultFlag)); } @@ -487,20 +485,18 @@ public class DetectionServiceImpl { harmonicResult.setSort(sourceIssue.getIndex()); List pqErrSysDtls = new ArrayList<>(); Integer isQualified = 4; - String valueTypeCode = ""; if (CollUtil.isNotEmpty(errDtlsCheckData)) { String finalHarmCode = harmCode; List adDtlsCheckData = errDtlsCheckData.stream().filter(x -> finalHarmCode.equals(x.getValueTypeCode())).collect(Collectors.toList()); harmonicResult.setAdType(adDtlsCheckData.get(0).getValueType()); isQualified = adDtlsCheckData.get(0).getIsQualified(); - valueTypeCode = adDtlsCheckData.get(0).getValueTypeCode(); if (CollUtil.isNotEmpty(adDtlsCheckData.get(0).getErrSysDtls())) { pqErrSysDtls = adDtlsCheckData.get(0).getErrSysDtls(); } } - List integerBooleanA = harmRangeComparison(isQualified, valueTypeCode, pqErrSysDtls, type, TYPE_A, sourceIssue, dataRule, devMap.get(TYPE_A), fData, num); - List integerBooleanB = harmRangeComparison(isQualified, valueTypeCode, pqErrSysDtls, type, TYPE_B, sourceIssue, dataRule, devMap.get(TYPE_B), fData, num); - List integerBooleanC = harmRangeComparison(isQualified, valueTypeCode, pqErrSysDtls, type, TYPE_C, sourceIssue, dataRule, devMap.get(TYPE_C), fData, num); + List integerBooleanA = harmRangeComparison(isQualified, pqErrSysDtls, type, TYPE_A, sourceIssue, dataRule, devMap.get(TYPE_A), fData, num); + List integerBooleanB = harmRangeComparison(isQualified, pqErrSysDtls, type, TYPE_B, sourceIssue, dataRule, devMap.get(TYPE_B), fData, num); + List integerBooleanC = harmRangeComparison(isQualified, pqErrSysDtls, type, TYPE_C, sourceIssue, dataRule, devMap.get(TYPE_C), fData, num); harmonicResult.setDataType("avg"); reflectHarmonic("a", integerBooleanA, harmonicResult, num); reflectHarmonic("b", integerBooleanB, harmonicResult, num); @@ -554,11 +550,9 @@ public class DetectionServiceImpl { result.setSort(sourceIssue.getIndex()); List pqErrSysDtls = new ArrayList<>(); Integer isQualified = 4; - String valueTypeCode = ""; if (CollUtil.isNotEmpty(errDtlsCheckData)) { result.setAdType(errDtlsCheckData.get(0).getValueType()); isQualified = errDtlsCheckData.get(0).getIsQualified(); - valueTypeCode = errDtlsCheckData.get(0).getValueTypeCode(); if (CollUtil.isNotEmpty(errDtlsCheckData.get(0).getErrSysDtls())) { pqErrSysDtls = errDtlsCheckData.get(0).getErrSysDtls(); } @@ -569,19 +563,19 @@ public class DetectionServiceImpl { List channelTypeAList = checkData.stream() .filter(x -> TYPE_A.equals(x.getPhase())) .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)); List channelTypeBList = checkData.stream() .filter(x -> TYPE_B.equals(x.getPhase())) .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)); List channelTypeCList = checkData.stream() .filter(x -> TYPE_C.equals(x.getPhase())) .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.setResultFlag(setResultFlag(Arrays.asList(a, b, c))); @@ -589,7 +583,7 @@ public class DetectionServiceImpl { List channelTypeBList = checkData.stream() .filter(x -> TYPE_T.equals(x.getPhase())) .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.setResultFlag(setResultFlag(Arrays.asList(t))); } @@ -601,14 +595,14 @@ public class DetectionServiceImpl { /** * 判断值是否在误差范围内,有则进行判断否则则不进行计算(暂态) - * + *

* (假如都符合,则选取最开始合格的,都不合格,取最开始不合格的) - * 方案一 分项问题 - * 分别计算各个相别是否合格 - * 不合格电压幅值的层级最高 - * - * 方案二 不分项问题 - * 以电压幅值最低的作为比较相别 + * 方案一 分项问题 + * 分别计算各个相别是否合格 + * 不合格电压幅值的层级最高 + *

+ * 方案二 不分项问题 + * 以电压幅值最低的作为比较相别 * * @param dev 处理过后的数据 * @param errDtlsCheckData 误差体系 @@ -737,11 +731,9 @@ public class DetectionServiceImpl { result.setDataType("avg"); List magErrList = new ArrayList<>(); Integer isQualified = 4; - String valueTypeCode = ""; if (CollUtil.isNotEmpty(errDtlsCheckData)) { result.setAdType(errDtlsCheckData.get(0).getValueType()); isQualified = errDtlsCheckData.get(0).getIsQualified(); - valueTypeCode = errDtlsCheckData.get(0).getValueTypeCode(); if (CollUtil.isNotEmpty(errDtlsCheckData.get(0).getErrSysDtls())) { magErrList = errDtlsCheckData.get(0).getErrSysDtls(); } @@ -750,24 +742,24 @@ public class DetectionServiceImpl { .filter(x -> ("Ub").equals(x.getChannelType())) .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)); List channelTypeCList = sourceIssue.getChannelList().stream() .filter(x -> ("Uc").equals(x.getChannelType())) .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)); - 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 channelTypeAList = sourceIssue.getChannelList().stream() .filter(x -> ("Ua").equals(x.getChannelType())) .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.setResultFlag(setResultFlag(Arrays.asList(a, b, c))); - }else { + } else { List channelTypeAList = sourceIssue.getChannelList().stream() .filter(x -> x.getChannelType().contains("U")) .sorted(Comparator.comparing( @@ -776,7 +768,7 @@ public class DetectionServiceImpl { .orElse(Double.NaN) )) .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.setTValue(JSON.toJSONString(a)); result.setResultFlag(a.getIsData()); @@ -785,25 +777,20 @@ public class DetectionServiceImpl { } private DetectionData setDetectionData(Integer isQualified, - String valueTypeCode, DictDataEnum dataRule, Map> mag, Double fData, String dur, List magErrList, List channelTypeCList, - String typeC) { - DetectionData c; + String type) { + DetectionData data; 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 { - List ampData = mag.get(typeC).stream() - .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); + data = rangeComparisonList(mag.get(type), isQualified, magErrList, fData, channelTypeCList.get(0).getDipData().getFTransValue(), dataRule); } - return c; + return data; } @@ -924,11 +911,10 @@ public class DetectionServiceImpl { * @param sourceIssue 源下发的值(谐波) * @param dataRule 数据处理原则 * @param devMap - * @param fData + * @param fData 额定值 * @return */ public List harmRangeComparison(Integer isQualified, - String valueTypeCode, List pqErrSysDtls, String type, String phase, @@ -959,12 +945,12 @@ public class DetectionServiceImpl { issueHarmMap = sourceIssue.getChannelList().stream() .filter(x -> (type + phase.toLowerCase()).equals(x.getChannelType())) .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 { issueHarmMap = sourceIssue.getChannelList().stream() .filter(x -> (type + phase.toLowerCase()).equals(x.getChannelType())) .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 errSysDtlMap = new LinkedHashMap<>(); @@ -990,17 +976,14 @@ public class DetectionServiceImpl { if (CollUtil.isNotEmpty(harmDataList)) { data.setData(harmDataList.get(0)); } - Double v = issueHarmMap.get(harm); - data.setResultData(v); + Double channelData = issueHarmMap.get(harm); + data.setResultData(channelData); if (ObjectUtil.isNotNull(errSysDtl)) { PqErrSysDtls errSys = BeanUtil.copyProperties(errSysDtl, PqErrSysDtls.class); - errSys.setMaxErrorValue(maxErrorMultiply(errSys.getMaxErrorValue(), fData, issueHarmMap.get(harm), errSys.getErrorValueType())); - NumberFormat nf = NumberFormat.getInstance(); - nf.setMaximumFractionDigits(6); - nf.setGroupingUsed(false); - data.setUnit(unit(valueTypeCode, errSysDtl.getErrorValueType())); - data.setRadius(nf.format(-errSys.getMaxErrorValue()) + "~" + nf.format(errSys.getMaxErrorValue())); - setDetection(dataRule, harmDataList, errSys, data, v); + errSys.setMaxErrorValue(maxErrorMultiply(errSys, fData, issueHarmMap.get(harm))); + data.setUnit(errSysDtl.getErrorUnit()); + data.setRadius(-errSys.getMaxErrorValue() + "~" + errSys.getMaxErrorValue()); + setDetection(dataRule, harmDataList, errSys, data, channelData, fData); } info.add(data); }); @@ -1013,26 +996,27 @@ public class DetectionServiceImpl { * @param harmDataList 原始数据集合 * @param errSysDtl 误差体系 * @param data 初始化原始数据 - * @param v 源下发的数据 + * @param channelData 源下发的数据 + * @param ratedValue 额定值 * @Description: * @Author: wr * @Date: 2024/12/29 18:10 */ - private void setDetection(DictDataEnum dataRule, List harmDataList, PqErrSysDtls errSysDtl, DetectionData data, Double v) { + private void setDetection(DictDataEnum dataRule, List harmDataList, PqErrSysDtls errSysDtl, DetectionData data, Double channelData, Double ratedValue) { if (CollUtil.isNotEmpty(harmDataList)) { // 存放合格的数据 List 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())) : - 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()))).collect(Collectors.toList()); if (CollUtil.isNotEmpty(qualifiedList)) { - data.setErrorData(devSubtractChannelData(qualifiedList.get(0), v, errSysDtl.getErrorValueType())); + data.setErrorData(devSubtractChannelData(qualifiedList.get(0), channelData, ratedValue, errSysDtl)); } else { - data.setErrorData(devSubtractChannelData(harmDataList.get(0), v, errSysDtl.getErrorValueType())); + data.setErrorData(devSubtractChannelData(harmDataList.get(0), channelData, ratedValue, errSysDtl)); } isData(dataRule, harmDataList, data, qualifiedList); } @@ -1163,7 +1147,7 @@ public class DetectionServiceImpl { * @param dataRule 数据处理原则 * @returnd */ - public DetectionData rangeComparisonList(List list, Integer isQualified, String valueTypeCode, List pqErrSysDtls, Double data, Double channelData, DictDataEnum dataRule) { + public DetectionData rangeComparisonList(List list, Integer isQualified, List pqErrSysDtls, Double data, Double channelData, DictDataEnum dataRule) { DetectionData detectionData = new DetectionData(); detectionData.setIsData(isQualified); if (CollUtil.isNotEmpty(list)) { @@ -1178,19 +1162,16 @@ public class DetectionServiceImpl { channelData)).collect(Collectors.toList()); if (CollUtil.isNotEmpty(errSysDtls)) { PqErrSysDtls errSysDtl = BeanUtil.copyProperties(errSysDtls.get(0), PqErrSysDtls.class); - NumberFormat nf = NumberFormat.getInstance(); - nf.setMaximumFractionDigits(6); - nf.setGroupingUsed(false); - detectionData.setUnit(unit(valueTypeCode, errSysDtl.getErrorValueType())); - 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); + detectionData.setUnit(errSysDtl.getErrorUnit()); + errSysDtl.setMaxErrorValue(maxErrorMultiply(errSysDtl, data, channelData)); + detectionData.setRadius(-errSysDtl.getMaxErrorValue() + "~" + errSysDtl.getMaxErrorValue()); + setDetection(dataRule, list, errSysDtl, detectionData, channelData, data); } } return detectionData; } - public DetectionData rangeDURComparisonList(List list, Integer isQualified, String valueTypeCode, List pqErrSysDtls, Double data, Double channelData, DictDataEnum dataRule) { + public DetectionData rangeDURComparisonList(List list, Integer isQualified, List pqErrSysDtls, Double data, Double channelData, DictDataEnum dataRule) { DetectionData detectionData = new DetectionData(); detectionData.setIsData(isQualified); if (CollUtil.isNotEmpty(list)) { @@ -1209,7 +1190,7 @@ public class DetectionServiceImpl { NumberFormat nf = NumberFormat.getInstance(); nf.setMaximumFractionDigits(6); nf.setGroupingUsed(false); - detectionData.setUnit(unit(valueTypeCode, errSysDtl.getErrorValueType())); + detectionData.setUnit(errSysDtl.getErrorUnit()); detectionData.setRadius(nf.format(BigDecimal.valueOf(-1.0 / data)) + "~" + nf.format(BigDecimal.valueOf(1.0 / data))); List qualifiedList = list.stream() @@ -1275,39 +1256,36 @@ public class DetectionServiceImpl { } /** - * 技术数据误差值(装置返回的值 - 源通道下发的值) + * 计算数据误差值(装置返回的值 - 源通道下发的值) * - * @param devData - * @param channelData - * @param errorValueType + * @param devData 装置返回值 + * @param channelData 通道值 + * @param ratedValue 额定值 + * @param error * @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)); - if (subtract.doubleValue() != 0) { - switch (errorValueType) { - case 2: - //下发的谐波电压幅值,返回的是谐波电压含有率,拿(含有率值*基波 - 源下发对应谐波值幅值)/下发的幅值 + //只有相对值需要%比较,绝对值直接相减就行 + if (2 == error.getValueType()) { + 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)) .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 BigDecimal.valueOf(0); - } - - public BigDecimal divide(Double devData, Double channelData) { - return BigDecimal.valueOf(devData) - .divide(BigDecimal.valueOf(channelData), 4, RoundingMode.HALF_UP); - + return subtract; } /** - * 用于计算误差体系的范围的 + * 用于计算误差体系的范围的(0:标称值 1:谐波值 2:值类型) * * @param value 误差值 * @param ratedData 额定值 @@ -1334,27 +1312,37 @@ public class DetectionServiceImpl { /** * 用于计算最大误差值的范围的 + * (2绝对值-值比较(默认) 0绝对值-标称值(额定电压) 1绝对值-标准值(源下发直谐波如:H2) 0相对值-标称值 1相对值-标准值) * - * @param errorValue 误差值 - * @param ratedData 额定值 - * @param harmData 谐波下发值(百分数->含油率) - * @param type 误差值类型 + * @param error 最大误差值对象 + * @param ratedData 额定值 + * @param harmData 谐波下发值(百分数->含油率) * @return */ - public Double maxErrorMultiply(Double errorValue, Double ratedData, Double harmData, Integer type) { - if (ObjectUtil.isNotNull(errorValue)) { - switch (type) { + public Double maxErrorMultiply(PqErrSysDtls error, Double ratedData, Double harmData) { + Double errorValue = error.getMaxErrorValue(); + //1绝对值 + if (1 == error.getValueType()) { + switch (error.getErrorValueType()) { + //绝对值-标称值= 最大误差值 * 额定电压 case 0: return BigDecimal.valueOf(errorValue).multiply(BigDecimal.valueOf(ratedData)) .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)) .setScale(4, RoundingMode.HALF_UP).doubleValue(); - default: - return errorValue; } - } return errorValue; }