全局配置小数精度

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

View File

@@ -24,6 +24,10 @@ public class SysTestConfigParam {
@NotNull(message = SystemValidMessage.MAX_RECHECK_NOT_NULL) @NotNull(message = SystemValidMessage.MAX_RECHECK_NOT_NULL)
private Integer maxTime; private Integer maxTime;
@ApiModelProperty(value = "数据精度")
@NotNull(message = SystemValidMessage.SCALE_NOT_NULL)
private Integer scale;
// @ApiModelProperty(value = "数据处理规则") // @ApiModelProperty(value = "数据处理规则")
// @NotBlank(message = SystemValidMessage.DATA_RULE_NOT_BLANK) // @NotBlank(message = SystemValidMessage.DATA_RULE_NOT_BLANK)
// @Pattern(regexp = PatternRegex.SYSTEM_ID, message = SystemValidMessage.DATA_RULE_FORMAT_ERROR) // @Pattern(regexp = PatternRegex.SYSTEM_ID, message = SystemValidMessage.DATA_RULE_FORMAT_ERROR)

View File

@@ -46,6 +46,11 @@ public class SysTestConfig extends BaseEntity implements Serializable {
@TableField("Scene") @TableField("Scene")
private String scene; private String scene;
/**
* 小数点精度
*/
private Integer scale;
/** /**
* 状态0-删除 1-正常 * 状态0-删除 1-正常

View File

@@ -91,4 +91,5 @@ public interface SystemValidMessage {
String DICT_DATA_CODE_FORMAT_ERROR = "字典数据编码格式错误只能包含字母、数字、中文、下划线、中划线、空格、点、斜线、反斜线、百分号、摄氏度符号长度为1~30个字符"; String DICT_DATA_CODE_FORMAT_ERROR = "字典数据编码格式错误只能包含字母、数字、中文、下划线、中划线、空格、点、斜线、反斜线、百分号、摄氏度符号长度为1~30个字符";
String DICT_PQ_OTHER_NAME_FORMAT_ERROR = "别名格式错误只能包含字母、数字、中文、下划线、中划线、空格长度最大为32个字符"; String DICT_PQ_OTHER_NAME_FORMAT_ERROR = "别名格式错误只能包含字母、数字、中文、下划线、中划线、空格长度最大为32个字符";
String DICT_PQ_SHOW_NAME_FORMAT_ERROR = "显示名称格式错误只能包含字母、数字、中文、下划线、中划线、空格长度最大为32个字符"; String DICT_PQ_SHOW_NAME_FORMAT_ERROR = "显示名称格式错误只能包含字母、数字、中文、下划线、中划线、空格长度最大为32个字符";
String SCALE_NOT_NULL = "数据精度不能为空请检查scale参数";
} }