全局配置小数精度

This commit is contained in:
caozehui
2025-06-27 13:33:46 +08:00
parent ad2752197a
commit b2bb7c3901
4 changed files with 56 additions and 23 deletions

View File

@@ -23,6 +23,8 @@ import com.njcn.gather.script.service.IPqScriptCheckDataService;
import com.njcn.gather.storage.pojo.po.AdHarmonicResult;
import com.njcn.gather.storage.pojo.po.AdNonHarmonicResult;
import com.njcn.gather.storage.service.DetectionDataDealService;
import com.njcn.gather.system.cfg.pojo.po.SysTestConfig;
import com.njcn.gather.system.cfg.service.ISysTestConfigService;
import com.njcn.gather.system.dictionary.pojo.enums.DictDataEnum;
import lombok.RequiredArgsConstructor;
import org.apache.commons.collections4.CollectionUtils;
@@ -50,6 +52,7 @@ public class DetectionServiceImpl {
private final IPqErrSysDtlsService pqErrSysDtlsService;
private final IPqScriptCheckDataService pqScriptCheckDataService;
private final DetectionDataDealService detectionDataDealService;
private final ISysTestConfigService sysTestConfigService;
private final String TYPE_A = "A";
private final String TYPE_B = "B";
@@ -976,7 +979,10 @@ public class DetectionServiceImpl {
data.setIsData(isQualified);
data.setNum(harm);
if (CollUtil.isNotEmpty(harmDataList)) {
data.setData(harmDataList.get(0));
SysTestConfig oneConfig = sysTestConfigService.getOneConfig();
BigDecimal bd = BigDecimal.valueOf(harmDataList.get(0));
bd = bd.setScale(oneConfig.getScale(), RoundingMode.HALF_UP);
data.setData(bd.doubleValue());
}
Double channelData = issueHarmMap.get(harm);
data.setResultData(channelData);
@@ -1007,12 +1013,13 @@ public class DetectionServiceImpl {
private void setDetection(DictDataEnum dataRule, List<Double> harmDataList, PqErrSysDtls errSysDtl, DetectionData data, Double channelData, Double ratedValue) {
if (CollUtil.isNotEmpty(harmDataList)) {
// 存放合格的数据
SysTestConfig oneConfig = sysTestConfigService.getOneConfig();
List<Double> qualifiedList = harmDataList.stream()
.filter(x -> channelData == 0 ? NumberUtil.isIn(devSubtractChannelData(x, channelData, ratedValue, errSysDtl),
.filter(x -> channelData == 0 ? NumberUtil.isIn(devSubtractChannelData(x, channelData, ratedValue, errSysDtl, oneConfig.getScale()),
BigDecimal.valueOf(-errSysDtl.getMaxErrorValue()),
BigDecimal.valueOf(errSysDtl.getMaxErrorValue()))
:
x != 0 && NumberUtil.isIn(devSubtractChannelData(x, channelData, ratedValue, errSysDtl),
x != 0 && NumberUtil.isIn(devSubtractChannelData(x, channelData, ratedValue, errSysDtl, oneConfig.getScale()),
BigDecimal.valueOf(-errSysDtl.getMaxErrorValue()),
BigDecimal.valueOf(errSysDtl.getMaxErrorValue()))).collect(Collectors.toList());
if (CollUtil.isNotEmpty(qualifiedList)) {
@@ -1020,21 +1027,23 @@ public class DetectionServiceImpl {
case AT_WILL_VALUE:
case CP95_VALUE:
case AVG_VALUE:
data.setErrorData(devSubtractChannelData(qualifiedList.get(0), channelData, ratedValue, errSysDtl));
data.setErrorData(devSubtractChannelData(qualifiedList.get(0), channelData, ratedValue, errSysDtl, oneConfig.getScale()));
break;
case SECTION_VALUE:
case Own_value:
if (qualifiedList.size() == harmDataList.size()) {
data.setErrorData(devSubtractChannelData(qualifiedList.get(0), channelData, ratedValue, errSysDtl));
data.setErrorData(devSubtractChannelData(qualifiedList.get(0), channelData, ratedValue, errSysDtl, oneConfig.getScale()));
} else {
List<Double> subtract = CollectionUtils.subtract(harmDataList, qualifiedList).stream().collect(Collectors.toList());
data.setData(subtract.get(0));
data.setErrorData(devSubtractChannelData(subtract.get(0), channelData, ratedValue, errSysDtl));
BigDecimal bd = BigDecimal.valueOf(subtract.get(0));
bd = bd.setScale(oneConfig.getScale(), RoundingMode.HALF_UP);
data.setData(bd.doubleValue());
data.setErrorData(devSubtractChannelData(subtract.get(0), channelData, ratedValue, errSysDtl, oneConfig.getScale()));
}
break;
}
} else {
data.setErrorData(devSubtractChannelData(harmDataList.get(0), channelData, ratedValue, errSysDtl));
data.setErrorData(devSubtractChannelData(harmDataList.get(0), channelData, ratedValue, errSysDtl, oneConfig.getScale()));
}
isData(dataRule, harmDataList, data, qualifiedList);
}
@@ -1042,7 +1051,10 @@ public class DetectionServiceImpl {
private void isData(DictDataEnum dataRule, List<Double> harmDataList, DetectionData data, List<Double> qualifiedList) {
if (CollUtil.isNotEmpty(qualifiedList)) {
data.setData(qualifiedList.get(0));
SysTestConfig oneConfig = sysTestConfigService.getOneConfig();
BigDecimal bd = BigDecimal.valueOf(qualifiedList.get(0));
bd = bd.setScale(oneConfig.getScale(), RoundingMode.HALF_UP);
data.setData(bd.doubleValue());
switch (dataRule) {
case AT_WILL_VALUE:
case CP95_VALUE:
@@ -1059,7 +1071,9 @@ public class DetectionServiceImpl {
data.setIsData(1);
} else {
List<Double> subtract = CollectionUtils.subtract(harmDataList, qualifiedList).stream().collect(Collectors.toList());
data.setData(subtract.get(0));
bd = BigDecimal.valueOf(subtract.get(0));
bd = bd.setScale(oneConfig.getScale(), RoundingMode.HALF_UP);
data.setData(bd.doubleValue());
data.setIsData(2);
}
break;
@@ -1171,7 +1185,10 @@ public class DetectionServiceImpl {
DetectionData detectionData = new DetectionData();
detectionData.setIsData(isQualified);
if (CollUtil.isNotEmpty(list)) {
detectionData.setData(list.get(0));
SysTestConfig oneConfig = sysTestConfigService.getOneConfig();
BigDecimal bd = BigDecimal.valueOf(list.get(0));
bd = bd.setScale(oneConfig.getScale(), RoundingMode.HALF_UP);
detectionData.setData(bd.doubleValue());
detectionData.setResultData(channelData);
//先根据源所下发的数据,是否在误差体系范围内在则可以进行误差体系判断
//获得误差体系
@@ -1195,7 +1212,10 @@ public class DetectionServiceImpl {
DetectionData detectionData = new DetectionData();
detectionData.setIsData(isQualified);
if (CollUtil.isNotEmpty(list)) {
detectionData.setData(list.get(0));
SysTestConfig oneConfig = sysTestConfigService.getOneConfig();
BigDecimal bd = BigDecimal.valueOf(list.get(0));
bd = bd.setScale(oneConfig.getScale(), RoundingMode.HALF_UP);
detectionData.setData(bd.doubleValue());
detectionData.setResultData(BigDecimal.valueOf(1.0 / data).doubleValue() * channelData);
//先根据源所下发的数据,是否在误差体系范围内在则可以进行误差体系判断
@@ -1220,11 +1240,11 @@ public class DetectionServiceImpl {
).collect(Collectors.toList());
if (CollUtil.isNotEmpty(qualifiedList)) {
BigDecimal subtract = BigDecimal.valueOf(qualifiedList.get(0))
.subtract(BigDecimal.valueOf(1.0 / data * (channelData)));
.subtract(BigDecimal.valueOf(1.0 / data * (channelData))).setScale(oneConfig.getScale(), RoundingMode.HALF_UP);
detectionData.setErrorData(subtract);
} else {
BigDecimal subtract = BigDecimal.valueOf(list.get(0))
.subtract(BigDecimal.valueOf(1.0 / data * (channelData)));
.subtract(BigDecimal.valueOf(1.0 / data * (channelData))).setScale(oneConfig.getScale(), RoundingMode.HALF_UP);
detectionData.setErrorData(subtract);
}
isData(dataRule, list, detectionData, qualifiedList);
@@ -1282,23 +1302,24 @@ public class DetectionServiceImpl {
* @param channelData 通道值
* @param ratedValue 额定值
* @param error
* @param scale 小数点位数
* @return
*/
public BigDecimal devSubtractChannelData(Double devData, Double channelData, Double ratedValue, PqErrSysDtls error) {
public BigDecimal devSubtractChannelData(Double devData, Double channelData, Double ratedValue, PqErrSysDtls error, Integer scale) {
//计算装置值返回值 - 源下发值的数据 = 差值
BigDecimal subtract = BigDecimal.valueOf(devData).subtract(BigDecimal.valueOf(channelData));
BigDecimal subtract = BigDecimal.valueOf(devData).setScale(scale, RoundingMode.HALF_UP).subtract(BigDecimal.valueOf(channelData));
//只有相对值需要%比较,绝对值直接相减就行
if (2 == error.getValueType()) {
switch (error.getErrorValueType()) {
case 0:
//下发的谐波电压幅值,返回的是谐波电压含有率,拿(含有率值*基波 - 源下发对应谐波值幅值)/ 额定值
return subtract.multiply(BigDecimal.valueOf(100))
.divide(BigDecimal.valueOf(ratedValue), 4, RoundingMode.HALF_UP);
.divide(BigDecimal.valueOf(ratedValue), scale, RoundingMode.HALF_UP);
case 1:
//todo 当谐波电压和间谐波电压默认都是按照相对值误差进行计算(用户关心的是含有率)
//下发的谐波电压幅值,返回的是谐波电压含有率,拿(含有率值*基波 - 源下发对应谐波值幅值)/ 下发的幅值
return subtract.multiply(BigDecimal.valueOf(100))
.divide(BigDecimal.valueOf(channelData), 4, RoundingMode.HALF_UP);
.divide(BigDecimal.valueOf(channelData), scale, RoundingMode.HALF_UP);
}
}
return subtract;
@@ -1314,14 +1335,15 @@ public class DetectionServiceImpl {
* @return
*/
public Double startRadiusEnd(Double value, Double ratedData, Double harmData, Integer type) {
SysTestConfig oneConfig = sysTestConfigService.getOneConfig();
if (ObjectUtil.isNotNull(value)) {
switch (type) {
case 0:
return BigDecimal.valueOf(value).multiply(BigDecimal.valueOf(ratedData))
.setScale(4, RoundingMode.HALF_UP).doubleValue();
.setScale(oneConfig.getScale(), RoundingMode.HALF_UP).doubleValue();
case 1:
return BigDecimal.valueOf(value).multiply(BigDecimal.valueOf(harmData))
.setScale(4, RoundingMode.HALF_UP).doubleValue();
.setScale(oneConfig.getScale(), RoundingMode.HALF_UP).doubleValue();
default:
return value;
}
@@ -1340,6 +1362,7 @@ public class DetectionServiceImpl {
* @return
*/
public Double maxErrorMultiply(PqErrSysDtls error, Double ratedData, Double harmData) {
SysTestConfig oneConfig = sysTestConfigService.getOneConfig();
Double errorValue = error.getMaxErrorValue();
//1绝对值
if (1 == error.getValueType()) {
@@ -1347,11 +1370,11 @@ public class DetectionServiceImpl {
//绝对值-标称值= 最大误差值 * 额定电压
case 0:
return BigDecimal.valueOf(errorValue).multiply(BigDecimal.valueOf(ratedData))
.setScale(4, RoundingMode.HALF_UP).doubleValue();
.setScale(oneConfig.getScale(), RoundingMode.HALF_UP).doubleValue();
//绝对值-标准值 = 最大误差值 * 谐波下发值
case 1:
return BigDecimal.valueOf(errorValue).multiply(BigDecimal.valueOf(harmData))
.setScale(4, RoundingMode.HALF_UP).doubleValue();
.setScale(oneConfig.getScale(), RoundingMode.HALF_UP).doubleValue();
}
}
//2相对值
@@ -1361,7 +1384,7 @@ public class DetectionServiceImpl {
case 0:
case 1:
return BigDecimal.valueOf(errorValue).multiply(BigDecimal.valueOf(100))
.setScale(4, RoundingMode.HALF_UP).doubleValue();
.setScale(oneConfig.getScale(), RoundingMode.HALF_UP).doubleValue();
}
}
return errorValue;