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 d688fe6c..01152ca4 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 @@ -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 harmDataList, PqErrSysDtls errSysDtl, DetectionData data, Double channelData, Double ratedValue) { if (CollUtil.isNotEmpty(harmDataList)) { // 存放合格的数据 + SysTestConfig oneConfig = sysTestConfigService.getOneConfig(); List 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 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 harmDataList, DetectionData data, List 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 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; diff --git a/system/src/main/java/com/njcn/gather/system/cfg/pojo/param/SysTestConfigParam.java b/system/src/main/java/com/njcn/gather/system/cfg/pojo/param/SysTestConfigParam.java index fad2142d..f22ef846 100644 --- a/system/src/main/java/com/njcn/gather/system/cfg/pojo/param/SysTestConfigParam.java +++ b/system/src/main/java/com/njcn/gather/system/cfg/pojo/param/SysTestConfigParam.java @@ -24,6 +24,10 @@ public class SysTestConfigParam { @NotNull(message = SystemValidMessage.MAX_RECHECK_NOT_NULL) private Integer maxTime; + @ApiModelProperty(value = "数据精度") + @NotNull(message = SystemValidMessage.SCALE_NOT_NULL) + private Integer scale; + // @ApiModelProperty(value = "数据处理规则") // @NotBlank(message = SystemValidMessage.DATA_RULE_NOT_BLANK) // @Pattern(regexp = PatternRegex.SYSTEM_ID, message = SystemValidMessage.DATA_RULE_FORMAT_ERROR) diff --git a/system/src/main/java/com/njcn/gather/system/cfg/pojo/po/SysTestConfig.java b/system/src/main/java/com/njcn/gather/system/cfg/pojo/po/SysTestConfig.java index df0e9514..5853e4c9 100644 --- a/system/src/main/java/com/njcn/gather/system/cfg/pojo/po/SysTestConfig.java +++ b/system/src/main/java/com/njcn/gather/system/cfg/pojo/po/SysTestConfig.java @@ -46,6 +46,11 @@ public class SysTestConfig extends BaseEntity implements Serializable { @TableField("Scene") private String scene; + /** + * 小数点精度 + */ + private Integer scale; + /** * 状态:0-删除 1-正常 diff --git a/system/src/main/java/com/njcn/gather/system/pojo/constant/SystemValidMessage.java b/system/src/main/java/com/njcn/gather/system/pojo/constant/SystemValidMessage.java index 9b1c6fa3..517fe18f 100644 --- a/system/src/main/java/com/njcn/gather/system/pojo/constant/SystemValidMessage.java +++ b/system/src/main/java/com/njcn/gather/system/pojo/constant/SystemValidMessage.java @@ -91,4 +91,5 @@ public interface SystemValidMessage { String DICT_DATA_CODE_FORMAT_ERROR = "字典数据编码格式错误,只能包含字母、数字、中文、下划线、中划线、空格、点、斜线、反斜线、百分号、摄氏度符号,长度为1~30个字符"; String DICT_PQ_OTHER_NAME_FORMAT_ERROR = "别名格式错误,只能包含字母、数字、中文、下划线、中划线、空格,长度最大为32个字符"; String DICT_PQ_SHOW_NAME_FORMAT_ERROR = "显示名称格式错误,只能包含字母、数字、中文、下划线、中划线、空格,长度最大为32个字符"; + String SCALE_NOT_NULL = "数据精度不能为空,请检查scale参数"; }