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

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.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<AdHarmonicResult> info=new ArrayList<>();
public Integer resultFlag(AdHarmonicResult v, AdHarmonicResult i, String code) {
List<AdHarmonicResult> 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<DevData> dev,
Map<String, String> devIdMapComm,
List<ErrDtlsCheckDataVO> errDtlsCheckData,
@@ -219,15 +220,12 @@ public class DetectionServiceImpl {
result.setSort(sourceIssue.getIndex());
result.setDataType("avg");
Integer isQualified;
String valueTypeCode;
List<ErrDtlsCheckDataVO> 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<DetectionData> 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<DetectionData> integerBooleanA = harmRangeComparison(isQualified, valueTypeCode, 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> integerBooleanC = harmRangeComparison(isQualified, valueTypeCode, new ArrayList<>(), type, TYPE_C, sourceIssue, dataRule, devHarmMap.get(TYPE_C), 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, new ArrayList<>(), type, TYPE_B, sourceIssue, dataRule, devHarmMap.get(TYPE_B), fData, num);
List<DetectionData> 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> pqErrSysDtls = new ArrayList<>();
Integer isQualified = 4;
String valueTypeCode = "";
if (CollUtil.isNotEmpty(errDtlsCheckData)) {
List<ErrDtlsCheckDataVO> 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<ErrDtlsCheckDataVO> 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<DetectionData> resultFlag = new ArrayList<>();
//取出源所对应的相别信息
List<ErrDtlsCheckDataVO> 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<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));
Map<String, BiConsumer<AdNonHarmonicResult, DetectionData>> 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<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);
}
}
}
result.setResultFlag(setResultFlag(resultFlag));
}
@@ -487,20 +485,18 @@ public class DetectionServiceImpl {
harmonicResult.setSort(sourceIssue.getIndex());
List<PqErrSysDtls> pqErrSysDtls = new ArrayList<>();
Integer isQualified = 4;
String valueTypeCode = "";
if (CollUtil.isNotEmpty(errDtlsCheckData)) {
String finalHarmCode = harmCode;
List<ErrDtlsCheckDataVO> 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<DetectionData> integerBooleanA = harmRangeComparison(isQualified, valueTypeCode, 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> integerBooleanC = harmRangeComparison(isQualified, valueTypeCode, pqErrSysDtls, type, TYPE_C, sourceIssue, dataRule, devMap.get(TYPE_C), fData, num);
List<DetectionData> integerBooleanA = harmRangeComparison(isQualified, pqErrSysDtls, type, TYPE_A, sourceIssue, dataRule, devMap.get(TYPE_A), fData, num);
List<DetectionData> integerBooleanB = harmRangeComparison(isQualified, pqErrSysDtls, type, TYPE_B, sourceIssue, dataRule, devMap.get(TYPE_B), fData, num);
List<DetectionData> 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> 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<PqScriptCheckData> 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<PqScriptCheckData> 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<PqScriptCheckData> 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<PqScriptCheckData> 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 {
/**
* 判断值是否在误差范围内,有则进行判断否则则不进行计算(暂态)
*
* <p>
* (假如都符合,则选取最开始合格的,都不合格,取最开始不合格的)
* 方案一 分项问题
* 分别计算各个相别是否合格
* 不合格电压幅值的层级最高
*
* 方案二 不分项问题
* 以电压幅值最低的作为比较相别
* 方案一 分项问题
* 分别计算各个相别是否合格
* 不合格电压幅值的层级最高
* <p>
* 方案二 不分项问题
* 以电压幅值最低的作为比较相别
*
* @param dev 处理过后的数据
* @param errDtlsCheckData 误差体系
@@ -737,11 +731,9 @@ public class DetectionServiceImpl {
result.setDataType("avg");
List<PqErrSysDtls> 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<SourceIssue.ChannelListDTO> 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<SourceIssue.ChannelListDTO> 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<SourceIssue.ChannelListDTO> 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<String, List<Double>> mag,
Double fData,
String dur,
List<PqErrSysDtls> magErrList,
List<SourceIssue.ChannelListDTO> 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<Double> 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<DetectionData> harmRangeComparison(Integer isQualified,
String valueTypeCode,
List<PqErrSysDtls> 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<Double, PqErrSysDtls> 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<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)) {
// 存放合格的数据
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()))
:
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<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.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<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.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<Double> 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;
}