微调
This commit is contained in:
@@ -1,8 +1,6 @@
|
|||||||
package com.njcn.gather.detection.pojo.param;
|
package com.njcn.gather.detection.pojo.param;
|
||||||
|
|
||||||
import com.alibaba.fastjson.annotation.JSONField;
|
import com.alibaba.fastjson.annotation.JSONField;
|
||||||
import com.fasterxml.jackson.annotation.JsonProperty;
|
|
||||||
import io.swagger.annotations.ApiOperation;
|
|
||||||
import lombok.Data;
|
import lombok.Data;
|
||||||
import lombok.NoArgsConstructor;
|
import lombok.NoArgsConstructor;
|
||||||
|
|
||||||
|
|||||||
@@ -3,6 +3,7 @@ package com.njcn.gather.detection.pojo.po;
|
|||||||
import com.alibaba.fastjson.annotation.JSONField;
|
import com.alibaba.fastjson.annotation.JSONField;
|
||||||
import lombok.Data;
|
import lombok.Data;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
|
|
||||||
@@ -55,5 +56,31 @@ public class SourceCompareDev {
|
|||||||
@JSONField(ordinal = 6)
|
@JSONField(ordinal = 6)
|
||||||
private Map<String, Double> DevData;
|
private Map<String, Double> DevData;
|
||||||
|
|
||||||
|
@Data
|
||||||
|
public static class Info {
|
||||||
|
/**
|
||||||
|
* 装置名称
|
||||||
|
*/
|
||||||
|
@JSONField(ordinal = 1)
|
||||||
|
private String devName;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 装置ip
|
||||||
|
*/
|
||||||
|
@JSONField(ordinal = 2)
|
||||||
|
private String ip;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 描述
|
||||||
|
*/
|
||||||
|
@JSONField(ordinal = 3)
|
||||||
|
private String desc;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 装置下所有通道信息
|
||||||
|
*/
|
||||||
|
@JSONField(ordinal = 4)
|
||||||
|
List<SourceCompareDev> devNumlist;
|
||||||
|
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,550 @@
|
|||||||
|
package com.njcn.gather.detection.service.impl;
|
||||||
|
|
||||||
|
|
||||||
|
import cn.hutool.core.collection.CollUtil;
|
||||||
|
import cn.hutool.core.util.NumberUtil;
|
||||||
|
import cn.hutool.core.util.ObjectUtil;
|
||||||
|
import com.njcn.gather.detection.pojo.po.DevData;
|
||||||
|
import com.njcn.gather.device.err.pojo.param.PqErrSysParam;
|
||||||
|
import com.njcn.gather.device.err.pojo.po.PqErrSysDtls;
|
||||||
|
import com.njcn.gather.device.err.service.IPqErrSysDtlsService;
|
||||||
|
import com.njcn.gather.device.script.pojo.po.SourceIssue;
|
||||||
|
import com.njcn.gather.system.dictionary.pojo.enums.DictDataEnum;
|
||||||
|
import lombok.RequiredArgsConstructor;
|
||||||
|
import org.springframework.stereotype.Service;
|
||||||
|
|
||||||
|
import java.math.BigDecimal;
|
||||||
|
import java.math.RoundingMode;
|
||||||
|
import java.util.*;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author wr
|
||||||
|
* @description
|
||||||
|
* @date 2024/12/20 13:52
|
||||||
|
*/
|
||||||
|
@Service
|
||||||
|
@RequiredArgsConstructor
|
||||||
|
public class DetectionServiceImpl {
|
||||||
|
|
||||||
|
public final IPqErrSysDtlsService pqErrSysDtlsService;
|
||||||
|
public final String TYPE_A = "A";
|
||||||
|
public final String TYPE_B = "B";
|
||||||
|
public final String TYPE_C = "C";
|
||||||
|
public final String TYPE_T = "T";
|
||||||
|
public final String U = "U";
|
||||||
|
public final String I = "I";
|
||||||
|
public final String F = "F";
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 开始处理指标类型
|
||||||
|
* 一共20组数据,开始处理格式
|
||||||
|
*/
|
||||||
|
public void text(List<DevData> dev, SourceIssue issue, DictDataEnum dataRule) {
|
||||||
|
Map<String, List<DevData>> devDataMap = dev.stream().collect(Collectors.groupingBy(DevData::getId));
|
||||||
|
devDataMap.forEach(((key, value) -> {
|
||||||
|
DetectionIndexProcessing(value, dataRule, issue);
|
||||||
|
}));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 取值的方法
|
||||||
|
* 1.根据源参数下发,获得所检测项目的误差体系
|
||||||
|
* 2.根据数据处理原则,先将原始20组数据进行处理,是任意,还是部分
|
||||||
|
* 3.根据误差体系筛选出,在范围内的数据,然后根据最大误差值是不是在合理范围内
|
||||||
|
*
|
||||||
|
* @param dev 原始数据
|
||||||
|
* @param sourceIssue 源下发的参数
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public Boolean DetectionIndexProcessing(List<DevData> dev, DictDataEnum dataRule, SourceIssue sourceIssue) {
|
||||||
|
PqErrSysParam.DetectionParam param = new PqErrSysParam.DetectionParam();
|
||||||
|
List<PqErrSysDtls> pqErrSysDtls = pqErrSysDtlsService.listPqErrSysDtlsByPqErrSysIdAndTypes(param);
|
||||||
|
//判断取值是否在误差范围内
|
||||||
|
return isQualified(dev, pqErrSysDtls, U, sourceIssue, dataRule);
|
||||||
|
//获得对应的误差体系
|
||||||
|
// switch (errSysEnum) {
|
||||||
|
// case VOL:
|
||||||
|
// return isQualified(dev, pqErrSysDtls, U, sourceIssue, dataRule);
|
||||||
|
// case Freq:
|
||||||
|
// return isQualified(dev, pqErrSysDtls, I, sourceIssue, dataRule);
|
||||||
|
// case MSQI_U:
|
||||||
|
// break;
|
||||||
|
// case MSQI_I:
|
||||||
|
// break;
|
||||||
|
// case Flicker:
|
||||||
|
// break;
|
||||||
|
// case Harm_V:
|
||||||
|
// isHarmQualified(dev, pqErrSysDtls, U, sourceIssue, dataRule);
|
||||||
|
// break;
|
||||||
|
// case Harm_I:
|
||||||
|
// isHarmQualified(dev, pqErrSysDtls, I, sourceIssue, dataRule);
|
||||||
|
// break;
|
||||||
|
// case Harm_P:
|
||||||
|
// break;
|
||||||
|
// case InHarm_V:
|
||||||
|
// isHarmQualified(dev, pqErrSysDtls, U, sourceIssue, dataRule);
|
||||||
|
// break;
|
||||||
|
// case InHarm_I:
|
||||||
|
// isHarmQualified(dev, pqErrSysDtls, I, sourceIssue, dataRule);
|
||||||
|
// break;
|
||||||
|
// case CUR:
|
||||||
|
// return isQualified(dev, pqErrSysDtls, F, sourceIssue, dataRule);
|
||||||
|
// case Dip:
|
||||||
|
// break;
|
||||||
|
//
|
||||||
|
// }
|
||||||
|
// return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 处理非谐波类型取值
|
||||||
|
*
|
||||||
|
* @param dev
|
||||||
|
* @param dataRule
|
||||||
|
*/
|
||||||
|
public Map<String, List<Double>> devListMap(List<DevData> dev, DictDataEnum dataRule) {
|
||||||
|
//设置
|
||||||
|
Map<String, List<Double>> map = new HashMap<>(3);
|
||||||
|
List<Double> a = new ArrayList<>();
|
||||||
|
List<Double> b = new ArrayList<>();
|
||||||
|
List<Double> c = new ArrayList<>();
|
||||||
|
List<Double> t = new ArrayList<>();
|
||||||
|
List<DevData.SqlDataDTO> sqlDataDTOS = dev.stream().flatMap(x -> x.getSqlData().stream()).collect(Collectors.toList());
|
||||||
|
if (CollUtil.isNotEmpty(sqlDataDTOS)) {
|
||||||
|
List<DevData.SqlDataDTO.ListDTO> list = sqlDataDTOS.stream().map(DevData.SqlDataDTO::getList).collect(Collectors.toList());
|
||||||
|
a = list.stream()
|
||||||
|
.filter(x -> ObjectUtil.isNotNull(x.getA()))
|
||||||
|
.map(DevData.SqlDataDTO.ListDTO::getA)
|
||||||
|
.sorted(Comparator.comparing(Double::doubleValue).reversed())
|
||||||
|
.collect(Collectors.toList());
|
||||||
|
b = list.stream()
|
||||||
|
.filter(x -> ObjectUtil.isNotNull(x.getA()))
|
||||||
|
.map(DevData.SqlDataDTO.ListDTO::getB)
|
||||||
|
.sorted(Comparator.comparing(Double::doubleValue).reversed())
|
||||||
|
.collect(Collectors.toList());
|
||||||
|
c = list.stream()
|
||||||
|
.filter(x -> ObjectUtil.isNotNull(x.getC()))
|
||||||
|
.map(DevData.SqlDataDTO.ListDTO::getC)
|
||||||
|
.sorted(Comparator.comparing(Double::doubleValue).reversed())
|
||||||
|
.collect(Collectors.toList());
|
||||||
|
t = list.stream().filter(x -> ObjectUtil.isNotNull(x.getT()))
|
||||||
|
.map(DevData.SqlDataDTO.ListDTO::getT)
|
||||||
|
.sorted(Comparator.comparing(Double::doubleValue).reversed())
|
||||||
|
.collect(Collectors.toList());
|
||||||
|
}
|
||||||
|
switch (dataRule) {
|
||||||
|
case SECTION_VALUE:
|
||||||
|
a = getDoubles(a, 1, 19);
|
||||||
|
b = getDoubles(b, 1, 19);
|
||||||
|
c = getDoubles(c, 1, 19);
|
||||||
|
t = getDoubles(t, 1, 19);
|
||||||
|
break;
|
||||||
|
case CP95_VALUE:
|
||||||
|
a = getDoubles(a, 1, 2);
|
||||||
|
b = getDoubles(b, 1, 2);
|
||||||
|
c = getDoubles(c, 1, 2);
|
||||||
|
t = getDoubles(t, 1, 2);
|
||||||
|
break;
|
||||||
|
case AVG_VALUE:
|
||||||
|
a = getAvgDoubles(a);
|
||||||
|
b = getAvgDoubles(b);
|
||||||
|
c = getAvgDoubles(c);
|
||||||
|
t = getAvgDoubles(t);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
map.put(TYPE_A, a);
|
||||||
|
map.put(TYPE_B, b);
|
||||||
|
map.put(TYPE_C, c);
|
||||||
|
if (CollUtil.isNotEmpty(t)) {
|
||||||
|
map.put(TYPE_T, t);
|
||||||
|
}
|
||||||
|
return map;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 判断值是否在误差范围内,有则进行判断否则则不进行计算(非谐波类型)
|
||||||
|
*
|
||||||
|
* @param dev 处理过后的数据
|
||||||
|
* @param pqErrSysDtls 误差体系
|
||||||
|
* @param type (电压还是电流)
|
||||||
|
* @param sourceIssue 源下发所对应的参数
|
||||||
|
* @param dataRule 数据处理原则
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public Boolean isQualified(List<DevData> dev, List<PqErrSysDtls> pqErrSysDtls, String type, SourceIssue sourceIssue, DictDataEnum dataRule) {
|
||||||
|
Map<String, List<Double>> map = devListMap(dev, dataRule);
|
||||||
|
Double fData = 1.0;
|
||||||
|
if (U.equals(type)) {
|
||||||
|
fData = sourceIssue.getFUn();
|
||||||
|
}
|
||||||
|
if (I.equals(type)) {
|
||||||
|
fData = sourceIssue.getFIn();
|
||||||
|
}
|
||||||
|
if (F.equals(type)) {
|
||||||
|
fData = sourceIssue.getFFreq();
|
||||||
|
}
|
||||||
|
if (map.containsKey(TYPE_T)) {
|
||||||
|
return rangeComparisonList(map.get(TYPE_T), pqErrSysDtls, fData, 1.0, dataRule);
|
||||||
|
} else {
|
||||||
|
//取出源所对应的相别信息
|
||||||
|
List<SourceIssue.ChannelListDTO> channelTypeAList = sourceIssue.getChannelList().stream()
|
||||||
|
.filter(x -> (type + "a").equals(x.getChannelType()))
|
||||||
|
.collect(Collectors.toList());
|
||||||
|
Boolean a = rangeComparisonList(map.get(TYPE_A), pqErrSysDtls, fData, channelTypeAList.get(0).getFAmp(), dataRule);
|
||||||
|
List<SourceIssue.ChannelListDTO> channelTypeBList = sourceIssue.getChannelList().stream()
|
||||||
|
.filter(x -> (type + "b").equals(x.getChannelType()))
|
||||||
|
.collect(Collectors.toList());
|
||||||
|
Boolean b = rangeComparisonList(map.get(TYPE_B), pqErrSysDtls, fData, channelTypeBList.get(0).getFAmp(), dataRule);
|
||||||
|
List<SourceIssue.ChannelListDTO> channelTypeCList = sourceIssue.getChannelList().stream()
|
||||||
|
.filter(x -> (type + "c").equals(x.getChannelType()))
|
||||||
|
.collect(Collectors.toList());
|
||||||
|
Boolean c = rangeComparisonList(map.get(TYPE_C), pqErrSysDtls, fData, channelTypeCList.get(0).getFAmp(), dataRule);
|
||||||
|
if (ObjectUtil.isAllNotEmpty(a, b, c)) {
|
||||||
|
return a && b && c;
|
||||||
|
}
|
||||||
|
if (ObjectUtil.isAllEmpty(a, b, c)) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 判断值是否在误差范围内,有则进行判断否则则不进行计算(谐波类型)
|
||||||
|
*
|
||||||
|
* @param dev 处理过后的数据
|
||||||
|
* @param pqErrSysDtls 误差体系
|
||||||
|
* @param type (电压还是电流)
|
||||||
|
* @param sourceIssue 源下发所对应的参数
|
||||||
|
* @param dataRule 数据处理原则
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public Boolean isHarmQualified(List<DevData> dev, List<PqErrSysDtls> pqErrSysDtls, String type, SourceIssue sourceIssue, DictDataEnum dataRule) {
|
||||||
|
Map<String, Map<Integer, List<Double>>> devMap = devHarmListMap(dev, sourceIssue, dataRule);
|
||||||
|
Double fData = 1.0;
|
||||||
|
if (U.equals(type)) {
|
||||||
|
fData = sourceIssue.getFUn();
|
||||||
|
}
|
||||||
|
if (I.equals(type)) {
|
||||||
|
fData = sourceIssue.getFIn();
|
||||||
|
}
|
||||||
|
Map<Integer, Boolean> integerBooleanMapA = harmRangeComparison(pqErrSysDtls, type, TYPE_A, sourceIssue, dataRule, devMap.get(TYPE_A), fData);
|
||||||
|
Map<Integer, Boolean> integerBooleanMapB = harmRangeComparison(pqErrSysDtls, type, TYPE_B, sourceIssue, dataRule, devMap.get(TYPE_B), fData);
|
||||||
|
Map<Integer, Boolean> integerBooleanMapC = harmRangeComparison(pqErrSysDtls, type, TYPE_C, sourceIssue, dataRule, devMap.get(TYPE_C), fData);
|
||||||
|
List<Boolean> list = new ArrayList<>();
|
||||||
|
list.addAll(integerBooleanMapA.values());
|
||||||
|
list.addAll(integerBooleanMapB.values());
|
||||||
|
list.addAll(integerBooleanMapC.values());
|
||||||
|
if (CollUtil.isNotEmpty(list)) {
|
||||||
|
List<Boolean> integerList = list.stream().filter(x -> ObjectUtil.isNotNull(x)).collect(Collectors.toList());
|
||||||
|
if (integerList.size() == list.size()) {
|
||||||
|
List<Boolean> booleans = integerList.stream().distinct().collect(Collectors.toList());
|
||||||
|
if (booleans.size() > 1) {
|
||||||
|
return false;
|
||||||
|
} else {
|
||||||
|
return booleans.get(0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param pqErrSysDtls 误差体系
|
||||||
|
* @param type U,I
|
||||||
|
* @param phase A,B,C
|
||||||
|
* @param sourceIssue 源下发的值(谐波)
|
||||||
|
* @param dataRule 数据处理原则
|
||||||
|
* @param devMap
|
||||||
|
* @param fData
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public Map<Integer, Boolean> harmRangeComparison(List<PqErrSysDtls> pqErrSysDtls, String type, String phase, SourceIssue sourceIssue, DictDataEnum dataRule, Map<Integer, List<Double>> devMap, Double fData) {
|
||||||
|
Map<Integer, Boolean> map = new LinkedHashMap<>();
|
||||||
|
//根据谐波几次相值/额定值
|
||||||
|
Map<Integer, Double> 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.getFApm()));
|
||||||
|
Map<Integer, PqErrSysDtls> errSysDtlMap = new LinkedHashMap<>();
|
||||||
|
issueHarmMap.forEach((key, value) -> {
|
||||||
|
//获得误差体系
|
||||||
|
List<PqErrSysDtls> errSysDtls = pqErrSysDtls.stream().filter(x -> rangeComparison(x.getStartValue(),
|
||||||
|
x.getStartFlag(),
|
||||||
|
x.getEndValue(),
|
||||||
|
x.getEndFlag(),
|
||||||
|
divide(value - fData, fData).doubleValue())).collect(Collectors.toList());
|
||||||
|
if (CollUtil.isNotEmpty(errSysDtls)) {
|
||||||
|
errSysDtlMap.put(key, errSysDtls.get(0));
|
||||||
|
} else {
|
||||||
|
errSysDtlMap.put(key, null);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
devMap.forEach((harm, harmDataList) -> {
|
||||||
|
Boolean harmBigNum = getHarmNum(dataRule, harmDataList, errSysDtlMap.get(harm), issueHarmMap.get(harm), fData);
|
||||||
|
if (ObjectUtil.isNotNull(harmBigNum)) {
|
||||||
|
map.put(harm, harmBigNum);
|
||||||
|
}
|
||||||
|
|
||||||
|
});
|
||||||
|
return map;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Boolean getHarmNum(DictDataEnum dataRule, List<Double> harmDataList, PqErrSysDtls errSysDtl, Double channelData, Double fData) {
|
||||||
|
if (ObjectUtil.isNotNull(errSysDtl)) {
|
||||||
|
if (0 == errSysDtl.getErrorValueType()) {
|
||||||
|
errSysDtl.setMaxErrorValue(multiply(errSysDtl.getMaxErrorValue(), fData, 0));
|
||||||
|
}
|
||||||
|
List<Double> qualifiedList = harmDataList.stream()
|
||||||
|
.filter(x -> NumberUtil.isIn(devSubtractChannelData(x, channelData, errSysDtl.getErrorValueType()),
|
||||||
|
BigDecimal.valueOf(-errSysDtl.getMaxErrorValue()),
|
||||||
|
BigDecimal.valueOf(errSysDtl.getMaxErrorValue()))).collect(Collectors.toList());
|
||||||
|
switch (dataRule) {
|
||||||
|
case AT_WILL_VALUE:
|
||||||
|
case CP95_VALUE:
|
||||||
|
case AVG_VALUE:
|
||||||
|
if (qualifiedList.size() > 0) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case SECTION_VALUE:
|
||||||
|
case Own_value:
|
||||||
|
if (qualifiedList.size() == harmDataList.size()) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Map<String, Map<Integer, List<Double>>> devHarmListMap(List<DevData> dev, SourceIssue sourceIssue, DictDataEnum dataRule) {
|
||||||
|
List<Integer> harmNum = sourceIssue.getChannelList().stream()
|
||||||
|
.flatMap(x -> x.getHarmList().stream().map(f -> f.getHarm()))
|
||||||
|
.sorted().distinct().collect(Collectors.toList());
|
||||||
|
Map<String, Map<Integer, List<Double>>> map = new HashMap<>(3);
|
||||||
|
for (DevData devData : dev) {
|
||||||
|
DevData.SqlDataHarmDTO fund = devData.getSqlDataHarm().stream().filter(x -> 1 == x.getNum()).collect(Collectors.toList()).stream().findFirst().get();
|
||||||
|
DevData.SqlDataHarmDTO harm = devData.getSqlDataHarm().stream().filter(x -> 49 == x.getNum()).collect(Collectors.toList()).stream().findFirst().get();
|
||||||
|
if(ObjectUtil.isNotNull(fund)){
|
||||||
|
harmPut(TYPE_A, map, harmNum, harm, fund.getList().getA().get(0));
|
||||||
|
harmPut(TYPE_B, map, harmNum, harm, fund.getList().getA().get(0));
|
||||||
|
harmPut(TYPE_C, map, harmNum, harm, fund.getList().getA().get(0));
|
||||||
|
}else{
|
||||||
|
harmPut(TYPE_A, map, harmNum, harm, "1.0");
|
||||||
|
harmPut(TYPE_B, map, harmNum, harm, "1.0");
|
||||||
|
harmPut(TYPE_C, map, harmNum, harm, "1.0");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
map.forEach((typeKey, typeValue) -> {
|
||||||
|
typeValue.forEach((key, value) -> {
|
||||||
|
value.sort(Comparator.comparing(Double::doubleValue).reversed());
|
||||||
|
switch (dataRule) {
|
||||||
|
case SECTION_VALUE:
|
||||||
|
value.subList(19, value.size()).clear(); // 保留前19个元素
|
||||||
|
value.remove(0); // 移除第一个元素
|
||||||
|
break;
|
||||||
|
case CP95_VALUE:
|
||||||
|
value.subList(1, value.size()).clear(); // 保留第一个元素
|
||||||
|
break;
|
||||||
|
case AVG_VALUE:
|
||||||
|
double average = value.stream().mapToDouble(Double::doubleValue).average().orElse(0.0);
|
||||||
|
value.clear(); // 清空列表
|
||||||
|
value.add(average); // 添加平均值
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
return map;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 处理数据是否合格
|
||||||
|
*
|
||||||
|
* @param listT 原始的数据
|
||||||
|
* @param pqErrSysDtls 误差体系
|
||||||
|
* @param data 源下发的额定信息(额定电压,额定电流)
|
||||||
|
* @param channelData 源下发的通道信息的值包括 {Ua, Ub, Uc, Ux, Ia, Ib, Ic, Ix ,NULL}
|
||||||
|
* @param dataRule 数据处理原则
|
||||||
|
* @returnd
|
||||||
|
*/
|
||||||
|
public Boolean rangeComparisonList(List<Double> listT, List<PqErrSysDtls> pqErrSysDtls, Double data, Double channelData, DictDataEnum dataRule) {
|
||||||
|
//先根据源所下发的数据,是否在误差体系范围内在则可以进行误差体系判断
|
||||||
|
//获得误差体系
|
||||||
|
List<PqErrSysDtls> errSysDtls = pqErrSysDtls.stream().filter(x -> rangeComparison(multiply(x.getStartValue(), data, x.getConditionType()),
|
||||||
|
x.getStartFlag(),
|
||||||
|
multiply(x.getEndValue(), data, x.getConditionType()),
|
||||||
|
x.getEndFlag(),
|
||||||
|
channelData)).collect(Collectors.toList());
|
||||||
|
if (CollUtil.isNotEmpty(errSysDtls)) {
|
||||||
|
PqErrSysDtls errSysDtl = errSysDtls.get(0);
|
||||||
|
if (0 == errSysDtl.getErrorValueType()) {
|
||||||
|
errSysDtl.setMaxErrorValue(multiply(errSysDtl.getMaxErrorValue(), data, 0));
|
||||||
|
}
|
||||||
|
List<Double> qualifiedList = listT.stream().filter(x -> NumberUtil.isIn(devSubtractChannelData(x, channelData, errSysDtl.getErrorValueType()),
|
||||||
|
BigDecimal.valueOf(-errSysDtl.getMaxErrorValue()),
|
||||||
|
BigDecimal.valueOf(errSysDtl.getMaxErrorValue()))).collect(Collectors.toList());
|
||||||
|
switch (dataRule) {
|
||||||
|
case AT_WILL_VALUE:
|
||||||
|
case CP95_VALUE:
|
||||||
|
case AVG_VALUE:
|
||||||
|
if (qualifiedList.size() > 0) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case SECTION_VALUE:
|
||||||
|
case Own_value:
|
||||||
|
if (qualifiedList.size() == listT.size()) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 先判断在范围的数据,在进行误差体系的判断
|
||||||
|
*
|
||||||
|
* @param startValue 开始值
|
||||||
|
* @param startFlag 是否包含
|
||||||
|
* @param endValue 结束值
|
||||||
|
* @param endFlag 是否包含
|
||||||
|
* @param devData 装置上送值
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public Boolean rangeComparison(Double startValue, Integer startFlag, Double endValue, Integer endFlag, Double devData) {
|
||||||
|
Boolean minBool = null;
|
||||||
|
Boolean maxBool = null;
|
||||||
|
if (ObjectUtil.isNotNull(startValue)) {
|
||||||
|
if (1 == startFlag) {
|
||||||
|
minBool = NumberUtil.isGreaterOrEqual(BigDecimal.valueOf(devData), BigDecimal.valueOf(startValue));
|
||||||
|
} else {
|
||||||
|
minBool = NumberUtil.isGreater(BigDecimal.valueOf(devData), BigDecimal.valueOf(startValue));
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
if (ObjectUtil.isNotNull(endValue)) {
|
||||||
|
if (1 == endFlag) {
|
||||||
|
maxBool = NumberUtil.isLessOrEqual(BigDecimal.valueOf(devData), BigDecimal.valueOf(endValue));
|
||||||
|
} else {
|
||||||
|
maxBool = NumberUtil.isLess(BigDecimal.valueOf(devData), BigDecimal.valueOf(endValue));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (ObjectUtil.isNotNull(minBool) && ObjectUtil.isNotNull(maxBool)) {
|
||||||
|
return minBool && maxBool;
|
||||||
|
} else {
|
||||||
|
if (ObjectUtil.isNotNull(minBool)) {
|
||||||
|
return minBool;
|
||||||
|
}
|
||||||
|
if (ObjectUtil.isNotNull(maxBool)) {
|
||||||
|
return maxBool;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 技术数据误差值(装置返回的值 - 源通道下发的值)
|
||||||
|
*
|
||||||
|
* @param devData
|
||||||
|
* @param channelData
|
||||||
|
* @param errorValueType
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public BigDecimal devSubtractChannelData(Double devData, Double channelData, Integer errorValueType) {
|
||||||
|
switch (errorValueType) {
|
||||||
|
case 2:
|
||||||
|
return BigDecimal.valueOf(devData - channelData)
|
||||||
|
.divide(BigDecimal.valueOf(devData), 7, RoundingMode.HALF_UP);
|
||||||
|
case 3:
|
||||||
|
return BigDecimal.valueOf(devData - channelData)
|
||||||
|
.divide(BigDecimal.valueOf(channelData), 7, RoundingMode.HALF_UP);
|
||||||
|
}
|
||||||
|
return BigDecimal.valueOf(devData - channelData);
|
||||||
|
}
|
||||||
|
|
||||||
|
public BigDecimal divide(Double devData, Double channelData) {
|
||||||
|
return BigDecimal.valueOf(devData)
|
||||||
|
.divide(BigDecimal.valueOf(channelData), 7, RoundingMode.HALF_UP);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public Double multiply(Double devData, Double channelData, Integer type) {
|
||||||
|
if (0 == type) {
|
||||||
|
return BigDecimal.valueOf(devData).multiply(BigDecimal.valueOf(channelData))
|
||||||
|
.setScale(7, RoundingMode.HALF_UP).doubleValue();
|
||||||
|
} else {
|
||||||
|
return BigDecimal.valueOf(devData).doubleValue();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public Double multiply(String devData, String channelData) {
|
||||||
|
return BigDecimal.valueOf(Double.valueOf(devData)).multiply(BigDecimal.valueOf(Double.valueOf(channelData)))
|
||||||
|
.setScale(7, RoundingMode.HALF_UP).doubleValue();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 处理谐波原始数据
|
||||||
|
*
|
||||||
|
* @param type A,b,c
|
||||||
|
* @param map 初始化集合
|
||||||
|
* @param harmNum 多少次谐波集合
|
||||||
|
* @param harm 基波信息
|
||||||
|
* @param fund 2-50次谐波信息
|
||||||
|
*/
|
||||||
|
public void harmPut(String type, Map<String, Map<Integer, List<Double>>> map, List<Integer> harmNum, DevData.SqlDataHarmDTO harm, String fund) {
|
||||||
|
if (map.containsKey(type)) {
|
||||||
|
Map<Integer, List<Double>> integerListMap = map.get(type);
|
||||||
|
for (Integer i : harmNum) {
|
||||||
|
if (integerListMap.containsKey(i)) {
|
||||||
|
if (type.equals("A")) {
|
||||||
|
integerListMap.get(i).add(multiply(harm.getList().getA().get(i - 2), fund));
|
||||||
|
}
|
||||||
|
if (type.equals("B")) {
|
||||||
|
integerListMap.get(i).add(multiply(harm.getList().getB().get(i - 2), fund));
|
||||||
|
}
|
||||||
|
if (type.equals("C")) {
|
||||||
|
integerListMap.get(i).add(multiply(harm.getList().getC().get(i - 2), fund));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
Map<Integer, List<Double>> integerListMap = new LinkedHashMap<>(5);
|
||||||
|
for (Integer i : harmNum) {
|
||||||
|
List<Double> integerList = new ArrayList<>();
|
||||||
|
if (type.equals("A")) {
|
||||||
|
integerList.add(multiply(harm.getList().getA().get(i - 2), fund));
|
||||||
|
}
|
||||||
|
if (type.equals("B")) {
|
||||||
|
integerList.add(multiply(harm.getList().getB().get(i - 2), fund));
|
||||||
|
}
|
||||||
|
if (type.equals("C")) {
|
||||||
|
integerList.add(multiply(harm.getList().getC().get(i - 2), fund));
|
||||||
|
}
|
||||||
|
integerListMap.put(i, integerList);
|
||||||
|
}
|
||||||
|
map.put(type, integerListMap);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static List<Double> getAvgDoubles(List<Double> t) {
|
||||||
|
if (CollUtil.isNotEmpty(t)) {
|
||||||
|
t = Arrays.asList(t.stream().mapToDouble(Double::doubleValue).average().orElse(0.0));
|
||||||
|
}
|
||||||
|
return t;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static List<Double> getDoubles(List<Double> t, Integer start, Integer end) {
|
||||||
|
if (CollUtil.isNotEmpty(t)) {
|
||||||
|
t = t.subList(start, end);
|
||||||
|
}
|
||||||
|
return t;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -36,7 +36,7 @@ public class PqErrSysDtls implements Serializable {
|
|||||||
/**
|
/**
|
||||||
* 误差判断起始值
|
* 误差判断起始值
|
||||||
*/
|
*/
|
||||||
private Float startValue;
|
private Double startValue;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 是否包含起始值
|
* 是否包含起始值
|
||||||
@@ -46,7 +46,7 @@ public class PqErrSysDtls implements Serializable {
|
|||||||
/**
|
/**
|
||||||
* 误差判断结束值
|
* 误差判断结束值
|
||||||
*/
|
*/
|
||||||
private Float endValue;
|
private Double endValue;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 是否包含结束值
|
* 是否包含结束值
|
||||||
@@ -66,7 +66,7 @@ public class PqErrSysDtls implements Serializable {
|
|||||||
/**
|
/**
|
||||||
* 误差最大值
|
* 误差最大值
|
||||||
*/
|
*/
|
||||||
private Float maxErrorValue;
|
private Double maxErrorValue;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 误差值类型
|
* 误差值类型
|
||||||
|
|||||||
@@ -147,7 +147,7 @@ public class PqScriptDtlsServiceImpl extends ServiceImpl<PqScriptDtlsMapper, PqS
|
|||||||
List<SourceIssue.ChannelListDTO> channelListDTOS = new ArrayList<>();
|
List<SourceIssue.ChannelListDTO> channelListDTOS = new ArrayList<>();
|
||||||
|
|
||||||
//1.通道电压(ABC)
|
//1.通道电压(ABC)
|
||||||
List<PqScriptDtls> volList = value.stream().filter(x -> VOL.equals(x.getValueType()) || HARM_V.equals(x.getValueType()))
|
List<PqScriptDtls> volList = value.stream().filter(x -> VOL.equals(x.getValueType()))
|
||||||
.sorted(Comparator.comparing(PqScriptDtls::getPhase))
|
.sorted(Comparator.comparing(PqScriptDtls::getPhase))
|
||||||
.collect(Collectors.toList());
|
.collect(Collectors.toList());
|
||||||
//谐波电压,间谐波
|
//谐波电压,间谐波
|
||||||
@@ -155,7 +155,6 @@ public class PqScriptDtlsServiceImpl extends ServiceImpl<PqScriptDtlsMapper, PqS
|
|||||||
INHARM_V.equals(x.getValueType()) ||
|
INHARM_V.equals(x.getValueType()) ||
|
||||||
DIP.equals(x.getValueType()) ||
|
DIP.equals(x.getValueType()) ||
|
||||||
FLICKER.equals(x.getValueType())
|
FLICKER.equals(x.getValueType())
|
||||||
|
|
||||||
)
|
)
|
||||||
.sorted(Comparator.comparing(PqScriptDtls::getPhase))
|
.sorted(Comparator.comparing(PqScriptDtls::getPhase))
|
||||||
.collect(Collectors.toList());
|
.collect(Collectors.toList());
|
||||||
@@ -166,7 +165,11 @@ public class PqScriptDtlsServiceImpl extends ServiceImpl<PqScriptDtlsMapper, PqS
|
|||||||
.sorted(Comparator.comparing(PqScriptDtls::getPhase))
|
.sorted(Comparator.comparing(PqScriptDtls::getPhase))
|
||||||
.collect(Collectors.toList());
|
.collect(Collectors.toList());
|
||||||
//谐波电流,间谐波电流
|
//谐波电流,间谐波电流
|
||||||
List<PqScriptDtls> dtlsIList = value.stream().filter(x -> HARM_I.equals(x.getValueType()) || HARM_I.equals(x.getValueType()))
|
List<PqScriptDtls> dtlsIList = value.stream().filter(x -> HARM_I.equals(x.getValueType()) ||
|
||||||
|
INHARM_I.equals(x.getValueType())||
|
||||||
|
DIP.equals(x.getValueType()) ||
|
||||||
|
FLICKER.equals(x.getValueType())
|
||||||
|
)
|
||||||
.sorted(Comparator.comparing(PqScriptDtls::getPhase))
|
.sorted(Comparator.comparing(PqScriptDtls::getPhase))
|
||||||
.collect(Collectors.toList());
|
.collect(Collectors.toList());
|
||||||
issueAdd(curList, dtlsIList, HARM_I, INHARM_I, freqDtls.getValue(), "I", channelListDTOS);
|
issueAdd(curList, dtlsIList, HARM_I, INHARM_I, freqDtls.getValue(), "I", channelListDTOS);
|
||||||
@@ -213,7 +216,7 @@ public class PqScriptDtlsServiceImpl extends ServiceImpl<PqScriptDtlsMapper, PqS
|
|||||||
* @param dtlsList 检测集合
|
* @param dtlsList 检测集合
|
||||||
* @param dtlsList 其他类型检测集合(谐波,间谐波等)
|
* @param dtlsList 其他类型检测集合(谐波,间谐波等)
|
||||||
* @param harm 谐波
|
* @param harm 谐波
|
||||||
* @param harm 间谐波
|
* @param inHarm 间谐波
|
||||||
* @param fFreq 频率
|
* @param fFreq 频率
|
||||||
* @param code U,I
|
* @param code U,I
|
||||||
* @param channelListDTOS 通道信息
|
* @param channelListDTOS 通道信息
|
||||||
|
|||||||
@@ -29,4 +29,10 @@ public interface ISysTestConfigService extends IService<SysTestConfig> {
|
|||||||
* @return 是否更新成功
|
* @return 是否更新成功
|
||||||
*/
|
*/
|
||||||
boolean updateTestConfig(SysTestConfigParam.UpdateParam param);
|
boolean updateTestConfig(SysTestConfigParam.UpdateParam param);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取检测配置
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
SysTestConfig getOneConfig();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,11 +2,13 @@ package com.njcn.gather.system.config.service.impl;
|
|||||||
|
|
||||||
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
||||||
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
||||||
|
import com.github.yulichang.wrapper.MPJLambdaWrapper;
|
||||||
import com.njcn.common.pojo.enums.common.DataStateEnum;
|
import com.njcn.common.pojo.enums.common.DataStateEnum;
|
||||||
import com.njcn.gather.system.config.mapper.SysTestConfigMapper;
|
import com.njcn.gather.system.config.mapper.SysTestConfigMapper;
|
||||||
import com.njcn.gather.system.config.pojo.param.SysTestConfigParam;
|
import com.njcn.gather.system.config.pojo.param.SysTestConfigParam;
|
||||||
import com.njcn.gather.system.config.pojo.po.SysTestConfig;
|
import com.njcn.gather.system.config.pojo.po.SysTestConfig;
|
||||||
import com.njcn.gather.system.config.service.ISysTestConfigService;
|
import com.njcn.gather.system.config.service.ISysTestConfigService;
|
||||||
|
import com.njcn.gather.system.dictionary.pojo.po.DictData;
|
||||||
import lombok.RequiredArgsConstructor;
|
import lombok.RequiredArgsConstructor;
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
import org.springframework.beans.BeanUtils;
|
import org.springframework.beans.BeanUtils;
|
||||||
@@ -43,4 +45,14 @@ public class SysTestConfigServiceImpl extends ServiceImpl<SysTestConfigMapper, S
|
|||||||
BeanUtils.copyProperties(param, sysTestConfig);
|
BeanUtils.copyProperties(param, sysTestConfig);
|
||||||
return this.updateById(sysTestConfig);
|
return this.updateById(sysTestConfig);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public SysTestConfig getOneConfig() {
|
||||||
|
MPJLambdaWrapper<SysTestConfig> queryWrapper = new MPJLambdaWrapper<>();
|
||||||
|
queryWrapper.selectAll(SysTestConfig.class)
|
||||||
|
.selectAs(DictData::getCode, SysTestConfig::getDataRule)
|
||||||
|
.leftJoin(DictData.class, DictData::getId, SysTestConfig::getDataRule)
|
||||||
|
.eq(SysTestConfig::getState, DataStateEnum.ENABLE.getCode());
|
||||||
|
return this.getBaseMapper().selectJoinOne(SysTestConfig.class, queryWrapper);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -16,7 +16,22 @@ public enum DictDataEnum {
|
|||||||
*/
|
*/
|
||||||
DIGITAL("数字式", "Digital"),
|
DIGITAL("数字式", "Digital"),
|
||||||
SIMULATE("模拟式", "Simulate"),
|
SIMULATE("模拟式", "Simulate"),
|
||||||
CONTRAST("比对式", "Contrast"),;
|
CONTRAST("比对式", "Contrast"),
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 数据处理原则
|
||||||
|
*/
|
||||||
|
AT_WILL_VALUE("任意值", "At_Will_Value"),
|
||||||
|
SECTION_VALUE("部分值", "Section_Value"),
|
||||||
|
CP95_VALUE("cp95值", "Cp95_Value"),
|
||||||
|
AVG_VALUE("平均值", "Avg_value"),
|
||||||
|
Own_value("所有值", "Own_value"),
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
;
|
||||||
|
|
||||||
|
|
||||||
private final String name;
|
private final String name;
|
||||||
|
|||||||
Reference in New Issue
Block a user