diff --git a/pqs-device/pq-device/pq-device-api/src/main/java/com/njcn/device/pq/constant/Param.java b/pqs-device/pq-device/pq-device-api/src/main/java/com/njcn/device/pq/constant/Param.java index 5508cda65..4ffdb20f7 100644 --- a/pqs-device/pq-device/pq-device-api/src/main/java/com/njcn/device/pq/constant/Param.java +++ b/pqs-device/pq-device/pq-device-api/src/main/java/com/njcn/device/pq/constant/Param.java @@ -21,45 +21,42 @@ public interface Param { - String freq = "freq$DataV"; - String freq_dev = "freq_dev$DataV"; + String freq = "DataV-freq"; + String freq_dev = "DataV-freq_dev"; + String rms_v = "DataV-rms"; + String rms_lvr ="DataV-rms_lvr"; + String vu_dev ="DataV-vu_dev"; + String vl_dev="DataV-vl_dev"; + String rms_i ="DataI-rms"; - - String rms_v = "rms$DataV"; - String rms_lvr ="rms_lvr$DataV"; - String vu_dev ="vu_dev$DataV"; - String rms_i ="rms$DataI"; - - String v_thd = "v_thd$DataV"; + String v_thd = "DataV-v_thd"; //相(线)电压基波有效值 - String v_1_v = "v_1$DataV"; + String v_1_v = "DataV-v_1"; //相(线)电压基波相角 - String phasic_v_1 = "v_1$DataHarmPhasicV"; + String phasic_v_1 = "DataHarmPhasicV-v_1"; //谐波电压相角 - String phasic_rate_$ = "v_?$DataHarmPhasicV"; + String phasic_rate_x = "DataHarmPhasicV-v"; //谐波电压含有率 - String v_rate = "v_?$DataHarmRateV"; + String v_rate = "DataHarmRateV-v"; //间谐波电压含有率 - String in_v_rate = "v_?$DataInHarmV"; + String in_v_rate = "DataInHarmV-v"; //正序、负序和零序电压 - String v_zero = "v_zero$DataV"; - String v_pos = "v_pos$DataV"; - String v_neg = "v_neg$DataV"; - + String v_zero = "DataV-v_zero"; + String v_pos = "DataV-v_pos"; + String v_neg = "DataV-v_neg"; //三相电压不平衡度 - String v_unbalance ="v_unbalance$DataV"; - + String v_unbalance ="DataV-v_unbalance"; //电压波动 - String fluc = "fluc$DataFluc"; - + String fluc = "DataFluc-fluc"; //短时间闪变值 - String plt = "plt$DataPlt"; - - + String plt = "DataPlt-plt"; //长时间闪变值 - String pst = "pst$DataPlt"; + String pst = "DataFlicker-pst"; + + String Voltage_Rise = "r_mp_event_detail-Voltage_Rise"; + String pf = "DataHarmPowerP-pf"; String ADD ="add"; diff --git a/pqs-device/pq-device/pq-device-api/src/main/java/com/njcn/device/pq/pojo/po/PqDataVerifyBak.java b/pqs-device/pq-device/pq-device-api/src/main/java/com/njcn/device/pq/pojo/po/PqDataVerifyBak.java new file mode 100644 index 000000000..75a008611 --- /dev/null +++ b/pqs-device/pq-device/pq-device-api/src/main/java/com/njcn/device/pq/pojo/po/PqDataVerifyBak.java @@ -0,0 +1,151 @@ +package com.njcn.device.pq.pojo.po; + +import com.baomidou.mybatisplus.annotation.TableName; +import com.njcn.db.bo.BaseEntity; +import java.io.Serializable; +import java.time.LocalDate; +import lombok.Getter; +import lombok.Setter; + +/** + *

+ * + *

+ * + * @author cdf + * @since 2025-06-10 + */ +@Getter +@Setter +@TableName("pq_data_verify_bak") +public class PqDataVerifyBak { + + private static final long serialVersionUID = 1L; + + /** + * 监测点id + */ + private String lineId; + + /** + * 异常数据时间 + */ + private LocalDate timeId; + + /** + * 频率(0:正常 1:异常) + */ + private Integer freq; + + /** + * 频率偏差(0:正常 1:异常) + */ + private Integer freqDev; + + /** + * 相电压有效值(0:正常 1:异常) + */ + private Integer vRms; + + /** + * 正序电压(0:正常 1:异常) + */ + private Integer vPos; + + /** + * 负序电压(0:正常 1:异常) + */ + private Integer vNeg; + + /** + * 零序电压(0:正常 1:异常) + */ + private Integer vZero; + + /** + * 电压不平衡度(0:正常 1:异常) + */ + private Integer vUnbalance; + + /** + * 线电压有效值(0:正常 1:异常) + */ + private Integer rmsLvr; + + /** + * 电压正偏差(0:正常 1:异常) + */ + private Integer vuDev; + + /** + * 电压负偏差(0:正常 1:异常) + */ + private Integer vlDev; + + /** + * 电压总谐波畸变率(0:正常 1:异常) + */ + private Integer vThd; + + /** + * 相电压基波有效值(0:正常 1:异常) + */ + private Integer v; + + /** + * 电流有效值(0:正常 1:异常) + */ + private Integer iRms; + + /** + * 长时闪变(0:正常 1:异常) + */ + private Integer plt; + + /** + * 间谐波电压含有率(0:正常 1:异常) + */ + private Integer vInharm; + + /** + * 谐波电压含有率(0:正常 1:异常) + */ + private Integer vHarm; + + /** + * 功率因数(0:正常 1:异常) + */ + private Integer pf; + + /** + * 谐波电压相角(0:正常 1:异常) + */ + private Integer vPhasic; + + /** + * 谐波电压基波相角(0:正常 1:异常) + */ + private Integer v1Phasic; + + /** + * 电压波动(0:正常 1:异常) + */ + private Integer fluc; + + /** + * 短时闪变(0:正常 1:异常) + */ + private Integer pst; + + /** + * 判断所有指标 0:无异常 1:有异常 + */ + private Integer state; + + /** + * 文件路径 + */ + private String path; + + +} diff --git a/pqs-device/pq-device/pq-device-api/src/main/java/com/njcn/device/pq/pojo/vo/dataClean/VerifyMonitorVO.java b/pqs-device/pq-device/pq-device-api/src/main/java/com/njcn/device/pq/pojo/vo/dataClean/VerifyMonitorVO.java index 8c9a8705a..593533790 100644 --- a/pqs-device/pq-device/pq-device-api/src/main/java/com/njcn/device/pq/pojo/vo/dataClean/VerifyMonitorVO.java +++ b/pqs-device/pq-device/pq-device-api/src/main/java/com/njcn/device/pq/pojo/vo/dataClean/VerifyMonitorVO.java @@ -20,12 +20,13 @@ public class VerifyMonitorVO { @ApiModelProperty(value = "异常测点数量",name = "abnormalNum") private Integer abnormalNum; + @ApiModelProperty(value = "异常指标分类",name = "targetList") private List targetList; @ApiModelProperty(value = "时间范围异常测点数量",name = "mapList") private List> mapList; - + @ApiModelProperty(value = "异常装置信息",name = "monitorAlarmInfo") private List monitorAlarmInfo; diff --git a/pqs-device/pq-device/pq-device-boot/src/main/java/com/njcn/device/pq/controller/DataVerifyController.java b/pqs-device/pq-device/pq-device-boot/src/main/java/com/njcn/device/pq/controller/DataVerifyController.java index 299b63878..3c7a45446 100644 --- a/pqs-device/pq-device/pq-device-boot/src/main/java/com/njcn/device/pq/controller/DataVerifyController.java +++ b/pqs-device/pq-device/pq-device-boot/src/main/java/com/njcn/device/pq/controller/DataVerifyController.java @@ -13,6 +13,7 @@ import com.njcn.device.pq.pojo.vo.dataClean.DetailAbnormalVO; import com.njcn.device.pq.pojo.vo.dataClean.PowerQualityIndicatorsVO; import com.njcn.device.pq.pojo.vo.dataClean.VerifyMonitorVO; import com.njcn.device.pq.service.IDataVerifyService; +import com.njcn.device.pq.service.IPqDataVerifyBakService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import lombok.RequiredArgsConstructor; @@ -42,6 +43,8 @@ public class DataVerifyController extends BaseController { private final IDataVerifyService iDataVerifyService; + private final IPqDataVerifyBakService iPqDataVerifyBakService; + /** * 获取异常监测点相关信息 @@ -51,7 +54,7 @@ public class DataVerifyController extends BaseController { @ApiOperation("异常-获取异常数据主页面") public HttpResult getMonitorVerifyData(@RequestBody MonitorBaseParam monitorBaseParam){ String methodDescribe = getMethodDescribe("getMonitorVerifyData"); - VerifyMonitorVO verifyMonitorVO = iDataVerifyService.getMonitorVerifyData(monitorBaseParam); + VerifyMonitorVO verifyMonitorVO = iPqDataVerifyBakService.getMonitorVerifyData(monitorBaseParam); return HttpResultUtil.assembleCommonResponseResult(CommonResponseEnum.SUCCESS, verifyMonitorVO, methodDescribe); } @@ -60,7 +63,7 @@ public class DataVerifyController extends BaseController { @ApiOperation("异常-更新按钮-获取异常数据列表") public HttpResult> getMonitorVerifyDay(@RequestBody MonitorBaseParam monitorBaseParam){ String methodDescribe = getMethodDescribe("getMonitorVerifyDay"); - List list = iDataVerifyService.getMonitorVerifyDay(monitorBaseParam); + List list = iPqDataVerifyBakService.getMonitorVerifyDay(monitorBaseParam); return HttpResultUtil.assembleCommonResponseResult(CommonResponseEnum.SUCCESS, list, methodDescribe); } @@ -73,7 +76,7 @@ public class DataVerifyController extends BaseController { @ApiOperation("异常-弹框-获取异常监测点列表") public HttpResult> monitorAbnormalTable(@RequestBody MonitorBaseParam monitorBaseParam){ String methodDescribe = getMethodDescribe("monitorAbnormalDetail"); - List page = iDataVerifyService.monitorAbnormalTable(monitorBaseParam); + List page = iPqDataVerifyBakService.monitorAbnormalTable(monitorBaseParam); return HttpResultUtil.assembleCommonResponseResult(CommonResponseEnum.SUCCESS, page, methodDescribe); } @@ -87,7 +90,7 @@ public class DataVerifyController extends BaseController { @ApiOperation("弹框-获取异常监测点列表详情") public HttpResult> monitorAbnormalTableDetail(@RequestBody MonitorBaseParam monitorBaseParam){ String methodDescribe = getMethodDescribe("monitorAbnormalTableDetail"); - List list = iDataVerifyService.monitorAbnormalTableDetail(monitorBaseParam); + List list = iPqDataVerifyBakService.monitorAbnormalTableDetail(monitorBaseParam); return HttpResultUtil.assembleCommonResponseResult(CommonResponseEnum.SUCCESS, list, methodDescribe); } diff --git a/pqs-device/pq-device/pq-device-boot/src/main/java/com/njcn/device/pq/mapper/PqDataVerifyBakMapper.java b/pqs-device/pq-device/pq-device-boot/src/main/java/com/njcn/device/pq/mapper/PqDataVerifyBakMapper.java new file mode 100644 index 000000000..0d5a37c85 --- /dev/null +++ b/pqs-device/pq-device/pq-device-boot/src/main/java/com/njcn/device/pq/mapper/PqDataVerifyBakMapper.java @@ -0,0 +1,16 @@ +package com.njcn.device.pq.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.njcn.device.pq.pojo.po.PqDataVerifyBak; + +/** + *

+ * Mapper 接口 + *

+ * + * @author cdf + * @since 2025-06-10 + */ +public interface PqDataVerifyBakMapper extends BaseMapper { + +} diff --git a/pqs-device/pq-device/pq-device-boot/src/main/java/com/njcn/device/pq/service/IPqDataVerifyBakService.java b/pqs-device/pq-device/pq-device-boot/src/main/java/com/njcn/device/pq/service/IPqDataVerifyBakService.java new file mode 100644 index 000000000..7df6823d3 --- /dev/null +++ b/pqs-device/pq-device/pq-device-boot/src/main/java/com/njcn/device/pq/service/IPqDataVerifyBakService.java @@ -0,0 +1,36 @@ +package com.njcn.device.pq.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.njcn.device.pq.pojo.param.dataClean.MonitorBaseParam; +import com.njcn.device.pq.pojo.po.PqDataVerifyBak; +import com.njcn.device.pq.pojo.vo.dataClean.DetailAbnormalVO; +import com.njcn.device.pq.pojo.vo.dataClean.PowerQualityIndicatorsVO; +import com.njcn.device.pq.pojo.vo.dataClean.VerifyMonitorVO; + +import java.util.List; + +/** + *

+ * 服务类 + *

+ * + * @author cdf + * @since 2025-06-10 + */ +public interface IPqDataVerifyBakService extends IService { + + VerifyMonitorVO getMonitorVerifyData(MonitorBaseParam monitorBaseParam); + + List getMonitorVerifyDay(MonitorBaseParam monitorBaseParam); + + + List monitorAbnormalTable(MonitorBaseParam monitorBaseParam); + + + + List monitorAbnormalTableDetail(MonitorBaseParam monitorBaseParam); + + + + +} diff --git a/pqs-device/pq-device/pq-device-boot/src/main/java/com/njcn/device/pq/service/impl/DataVerifyServiceImpl.java b/pqs-device/pq-device/pq-device-boot/src/main/java/com/njcn/device/pq/service/impl/DataVerifyServiceImpl.java index db25d397c..a205bd8ae 100644 --- a/pqs-device/pq-device/pq-device-boot/src/main/java/com/njcn/device/pq/service/impl/DataVerifyServiceImpl.java +++ b/pqs-device/pq-device/pq-device-boot/src/main/java/com/njcn/device/pq/service/impl/DataVerifyServiceImpl.java @@ -30,6 +30,7 @@ import com.njcn.device.pq.constant.Param; import com.njcn.device.pq.mapper.DataVerifyMapper; import com.njcn.device.pq.mapper.LineDetailMapper; import com.njcn.device.pq.mapper.LineMapper; +import com.njcn.device.pq.mapper.PqDataVerifyBakMapper; import com.njcn.device.pq.pojo.param.dataClean.MonitorBaseParam; import com.njcn.device.pq.pojo.po.DataVerify; @@ -66,7 +67,6 @@ import java.util.regex.Pattern; import java.util.stream.Collectors; import java.util.stream.Stream; -import static com.njcn.device.pq.constant.Param.freq; /** @@ -103,6 +103,8 @@ public class DataVerifyServiceImpl extends ServiceImpl dataVerifyList = this.list(lambdaQueryWrapper); - Map> listMap = dataVerifyList.stream().collect(Collectors.groupingBy(DataVerify::getTime, TreeMap::new, Collectors.toList())); listMap.forEach((time, timeList) -> { @@ -217,7 +218,6 @@ public class DataVerifyServiceImpl extends ServiceImpl + * 服务实现类 + *

+ * + * @author cdf + * @since 2025-06-10 + */ +@Service +@RequiredArgsConstructor +@Slf4j +public class PqDataVerifyBakServiceImpl extends ServiceImpl implements IPqDataVerifyBakService { + + private static final String SEPARATOR = "-"; + private static final DateTimeFormatter DATE_FORMAT = DateTimeFormatter.ofPattern(DatePattern.NORM_DATE_PATTERN); + + private final CommTerminalService commTerminalService; + + private final PqReasonableRangeFeignClient pqReasonableRangeFeignClient; + + private final LineMapper lineMapper; + + private final DictTreeFeignClient dictTreeFeignClient; + + private final UserLedgerFeignClient userLedgerFeignClient; + + private final FileStorageUtil fileStorageUtil; + + + @Override + public VerifyMonitorVO getMonitorVerifyData(MonitorBaseParam monitorBaseParam) { + List monitorIds = commTerminalService.getRunMonitorByDept(monitorBaseParam); + if (CollUtil.isEmpty(monitorIds)) { + throw new BusinessException(DeviceResponseEnum.QUERY_LINE_DATA_EMPTY); + } + List dataVerifyList = baseDataVerifyQuery(monitorIds, monitorBaseParam); + VerifyMonitorVO verifyMonitorVO = new VerifyMonitorVO(); + verifyMonitorVO.setRunNum(monitorIds.size()); + verifyMonitorVO.setAbnormalNum(dataVerifyList.stream().collect(Collectors.groupingBy(PqDataVerifyBak::getLineId)).size()); + List dataSumVerifyList = baseDataSumVerifyQuery(monitorIds, monitorBaseParam); + verifyMonitorVO.setMapList(getRangeAbnormalMonitor(monitorBaseParam, dataVerifyList)); + verifyMonitorVO.setTargetList(getAbnormalTarget(dataSumVerifyList)); + verifyMonitorVO.setMonitorAlarmInfo(getAbnormalTable(dataVerifyList, monitorBaseParam)); + return verifyMonitorVO; + } + + + public List getAbnormalTable(List dataVerifyList, MonitorBaseParam monitorBaseParam) { + List result = new ArrayList<>(); + Map> dataMap = dataVerifyList.stream().collect(Collectors.groupingBy(PqDataVerifyBak::getLineId)); + dataMap.forEach((key, list) -> { + List dateList = list.stream().map(PqDataVerifyBak::getTimeId).sorted(Comparator.comparing(Function.identity())).collect(Collectors.toList()); + processTable(monitorBaseParam, dateList, result, key); + }); + dealTableResult(result); + return result; + } + + /** + * 判断测点是否存在连续异常数据 + */ + private void processTable(MonitorBaseParam monitorBaseParam, List dateList, List result, String lineId) { + Integer warnDay = monitorBaseParam.getWarnDayLimit(); + Integer alarmDay = monitorBaseParam.getAlarmDayLimit(); + //检查是否有连续指定天数的告警 + boolean warnFlag = verData(dateList, warnDay); + boolean alarmFlag = verData(dateList, alarmDay); + if (warnFlag) { + PowerQualityIndicatorsVO vo = new PowerQualityIndicatorsVO(); + vo.setMonitorId(lineId); + if (alarmFlag) { + vo.setSeverity(1); + } else { + vo.setSeverity(0); + } + vo.setAbnormalDay(dateList.size()); + result.add(vo); + } + } + + private void dealTableResult(List result) { + if (CollUtil.isNotEmpty(result)) { + List dicTreePOList = dictTreeFeignClient.queryAllByType(Integer.valueOf(DicDataEnum.Obj_Type.getCode())).getData(); + Map sysDicTreePOMap = dicTreePOList.stream().collect(Collectors.toMap(SysDicTreePO::getId, Function.identity())); + List ids = result.stream().map(PowerQualityIndicatorsVO::getMonitorId).distinct().collect(Collectors.toList()); + List areaLineInfoVOList = lineMapper.getBaseLineAreaInfo(ids, null, null); + Map areaMap = areaLineInfoVOList.stream().collect(Collectors.toMap(AreaLineInfoVO::getLineId, Function.identity())); + + List objIds = areaLineInfoVOList.stream().map(AreaLineInfoVO::getObjId).distinct().collect(Collectors.toList()); + List userLedgerVOList = userLedgerFeignClient.getUserReportByIds(objIds).getData(); + Map userMap = userLedgerVOList.stream().collect(Collectors.toMap(NewUserReportVO::getId, Function.identity())); + result.forEach(it -> { + if (areaMap.containsKey(it.getMonitorId())) { + AreaLineInfoVO areaLineInfoVO = areaMap.get(it.getMonitorId()); + it.setMonitorName(areaLineInfoVO.getLineName()); + it.setStationName(areaLineInfoVO.getSubName()); + it.setDevName(areaLineInfoVO.getDeviceName()); + it.setVoltageLevel(areaLineInfoVO.getVoltageScale()); + it.setIp(Base64.encode(areaLineInfoVO.getIp())); + it.setManufacturer(areaLineInfoVO.getManufacturer()); + if (sysDicTreePOMap.containsKey(areaLineInfoVO.getSmallObjType())) { + it.setObjType(sysDicTreePOMap.get(areaLineInfoVO.getSmallObjType()).getName()); + } + if (userMap.containsKey(areaLineInfoVO.getObjId())) { + it.setObjName(userMap.get(areaLineInfoVO.getObjId()).getProjectName()); + } + } + }); + } + } + + @Override + public List getMonitorVerifyDay(MonitorBaseParam monitorBaseParam) { + List monitorIds = commTerminalService.getRunMonitorByDept(monitorBaseParam); + List dataVerifyList = baseDataVerifyQuery(monitorIds, monitorBaseParam); + return getAbnormalTable(dataVerifyList, monitorBaseParam); + } + + @Override + public List monitorAbnormalTable(MonitorBaseParam monitorBaseParam) { + List result = new ArrayList<>(); + + Map rangeMap= getStandRange(); + if(StrUtil.isNotBlank(monitorBaseParam.getTargetKey())) { + if (!rangeMap.containsKey(monitorBaseParam.getTargetKey())) { + throw new BusinessException("targetKey异常参数!"); + } + } + + List lineDetailList = lineMapper.getMonitorListDetail(monitorBaseParam.getMonitorIds()); + Map lineDetailMap = lineDetailList.stream().collect(Collectors.toMap(LineDevGetDTO::getPointId, Function.identity())); + + LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper<>(); + lambdaQueryWrapper.between(PqDataVerifyBak::getTimeId, DateUtil.beginOfDay(DateUtil.parse(monitorBaseParam.getSearchBeginTime())), + DateUtil.endOfDay(DateUtil.parse(monitorBaseParam.getSearchEndTime()))) + .in(PqDataVerifyBak::getLineId, monitorBaseParam.getMonitorIds()) + .eq(PqDataVerifyBak::getState, 1) + .orderByAsc(PqDataVerifyBak::getTimeId); + + if(StrUtil.isNotBlank(monitorBaseParam.getTargetKey())){ + switch (monitorBaseParam.getTargetKey()) { + case Param.freq: + lambdaQueryWrapper.eq(PqDataVerifyBak::getFreq,1); + break; + case Param.freq_dev: + lambdaQueryWrapper.eq(PqDataVerifyBak::getFreqDev,1); + break; + case Param.rms_v: + lambdaQueryWrapper.eq(PqDataVerifyBak::getVRms,1); + break; + case Param.rms_lvr: + lambdaQueryWrapper.eq(PqDataVerifyBak::getRmsLvr,1); + break; + case Param.vu_dev: + lambdaQueryWrapper.eq(PqDataVerifyBak::getVuDev,1); + break; + case Param.vl_dev: + lambdaQueryWrapper.eq(PqDataVerifyBak::getVlDev,1); + break; + + case Param.rms_i: + lambdaQueryWrapper.eq(PqDataVerifyBak::getIRms,1); + break; + case Param.v_thd: + lambdaQueryWrapper.eq(PqDataVerifyBak::getVThd,1); + break; + case Param.v_1_v: + lambdaQueryWrapper.eq(PqDataVerifyBak::getV,1); + break; + case Param.phasic_v_1: + lambdaQueryWrapper.eq(PqDataVerifyBak::getV1Phasic,1); + break; + case Param.phasic_rate_x: + lambdaQueryWrapper.eq(PqDataVerifyBak::getVPhasic,1); + break; + case Param.v_rate: + lambdaQueryWrapper.eq(PqDataVerifyBak::getVHarm,1); + break; + case Param.in_v_rate: + lambdaQueryWrapper.eq(PqDataVerifyBak::getVInharm,1); + break; + case Param.v_zero: + lambdaQueryWrapper.eq(PqDataVerifyBak::getVZero,1); + break; + case Param.v_neg: + lambdaQueryWrapper.eq(PqDataVerifyBak::getVNeg,1); + break; + case Param.v_pos: + lambdaQueryWrapper.eq(PqDataVerifyBak::getVPos,1); + break; + case Param.v_unbalance: + lambdaQueryWrapper.eq(PqDataVerifyBak::getVUnbalance,1); + break; + case Param.fluc: + lambdaQueryWrapper.eq(PqDataVerifyBak::getFluc,1); + break; + case Param.pst: + lambdaQueryWrapper.eq(PqDataVerifyBak::getPst,1); + break; + case Param.plt: + lambdaQueryWrapper.eq(PqDataVerifyBak::getPlt,1); + break; + case Param.pf: + lambdaQueryWrapper.eq(PqDataVerifyBak::getPf,1); + break; + default: + log.error("未匹配到异常数据指标"); + break; + } + } + List dataVerifyList = this.list(lambdaQueryWrapper); + + + + + for (PqDataVerifyBak pqDataVerifyBak : dataVerifyList) { + Set set = new HashSet<>(); + try (InputStream fileStream = fileStorageUtil.getFileStream(pqDataVerifyBak.getPath())) { + JSONArray jsonArray = new JSONArray(new JSONTokener(fileStream, new JSONConfig())); + jsonArray.forEach(it -> { + JSONObject targetJson = (JSONObject) it; + if (StrUtil.isNotBlank(monitorBaseParam.getTargetKey())) { + if (targetJson.containsKey(monitorBaseParam.getTargetKey())) { + JSONArray innerJson = targetJson.getJSONArray(monitorBaseParam.getTargetKey()); + JSONObject jsonObjectTem = (JSONObject) innerJson.get(0); + JSONArray list = jsonObjectTem.getJSONArray("list"); + list.forEach(listItem -> { + JSONObject object = (JSONObject) listItem; + JSONArray timeArr = object.getJSONArray("time"); + timeArr.forEach(timeJson -> set.add((String) timeJson)); + }); + DetailAbnormalVO detailAbnormalVO = new DetailAbnormalVO(); + LineDevGetDTO lineDevGetDTO = lineDetailMap.get(pqDataVerifyBak.getLineId()); + detailAbnormalVO.setTimeSum((long) lineDevGetDTO.getTimeInterval() * set.size()); + detailAbnormalVO.setDate(pqDataVerifyBak.getTimeId().format(DateTimeFormatter.ofPattern(DatePattern.NORM_DATE_PATTERN))); + detailAbnormalVO.setMonitorName(lineDevGetDTO.getPointName()); + detailAbnormalVO.setMonitorId(lineDevGetDTO.getPointId()); + detailAbnormalVO.setTargetKey(monitorBaseParam.getTargetKey()); + result.add(detailAbnormalVO); + } + } else { + rangeMap.forEach((rangeKey, val) -> { + if (targetJson.containsKey(rangeKey)) { + JSONArray innerJson = targetJson.getJSONArray(rangeKey); + JSONObject jsonObjectTem = (JSONObject) innerJson.get(0); + JSONArray list = jsonObjectTem.getJSONArray("list"); + list.forEach(listItem -> { + JSONObject object = (JSONObject) listItem; + JSONArray timeArr = object.getJSONArray("time"); + timeArr.forEach(timeJson -> set.add((String) timeJson)); + }); + DetailAbnormalVO detailAbnormalVO = new DetailAbnormalVO(); + LineDevGetDTO lineDevGetDTO = lineDetailMap.get(pqDataVerifyBak.getLineId()); + detailAbnormalVO.setTimeSum((long) lineDevGetDTO.getTimeInterval() * set.size()); + detailAbnormalVO.setDate(pqDataVerifyBak.getTimeId().format(DateTimeFormatter.ofPattern(DatePattern.NORM_DATE_PATTERN))); + detailAbnormalVO.setMonitorName(lineDevGetDTO.getPointName()); + detailAbnormalVO.setMonitorId(lineDevGetDTO.getPointId()); + detailAbnormalVO.setTargetKey(rangeKey); + result.add(detailAbnormalVO); + } + }); + } + }); + } catch (Exception e) { + throw new BusinessException("数据异常"); + } + } + return result; + } + + @Override + public List monitorAbnormalTableDetail(MonitorBaseParam monitorBaseParam) { + Map dtoMap = getStandRange(); + if(StrUtil.isNotBlank(monitorBaseParam.getTargetKey())) { + if (!dtoMap.containsKey(monitorBaseParam.getTargetKey())) { + throw new BusinessException("targetKey异常参数!"); + } + } + List result = new ArrayList<>(); + LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper<>(); + lambdaQueryWrapper.eq(PqDataVerifyBak::getTimeId, DateUtil.beginOfDay(DateUtil.parse(monitorBaseParam.getSearchBeginTime()))) + .in(PqDataVerifyBak::getLineId, monitorBaseParam.getMonitorIds()).orderByAsc(PqDataVerifyBak::getTimeId); + + PqDataVerifyBak pqDataVerifyBak = this.getOne(lambdaQueryWrapper); + try (InputStream fileStream = fileStorageUtil.getFileStream(pqDataVerifyBak.getPath())) { + JSONArray jsonArray = new JSONArray(new JSONTokener(fileStream, new JSONConfig())); + for (Object it : jsonArray) { + JSONObject targetJson = (JSONObject) it; + if (StrUtil.isNotBlank(monitorBaseParam.getTargetKey())) { + if (targetJson.containsKey(monitorBaseParam.getTargetKey())) { + resultDeal(dtoMap, monitorBaseParam.getTargetKey(), targetJson, result); + break; + } + } else { + String tarKey = ""; + for (Map.Entry entry : dtoMap.entrySet()) { + String key = entry.getKey(); + if (targetJson.containsKey(key)) { + tarKey = key; + break; + } + } + resultDeal(dtoMap, tarKey, targetJson, result); + } + } + } catch (Exception e) { + throw new BusinessException("数据异常"); + } + return result; + } + + + private void resultDeal(Map dtoMap, String targetKey, JSONObject targetJson, List result) { + PqReasonableRangeDto pqReasonableRangeDto = dtoMap.get(targetKey); + JSONArray innerJson = targetJson.getJSONArray(targetKey); + JSONObject jsonObjectTem = (JSONObject) innerJson.get(0); + String targetName = jsonObjectTem.get("targetName").toString(); + JSONArray list = jsonObjectTem.getJSONArray("list"); + + List temList = new ArrayList<>(); + list.forEach(listItem -> { + JSONObject object = (JSONObject) listItem; + JSONArray timeArr = object.getJSONArray("time"); + JSONArray valueArr = object.getJSONArray("value"); + String phase = object.get("phasic").toString(); + String valueType = object.get("valueType").toString(); + for (int i = 0; i < timeArr.size(); i++) { + DetailAbnormalVO.DetailLimitInnerVO temData = new DetailAbnormalVO.DetailLimitInnerVO(); + temData.setTime(timeArr.get(i).toString()); + temData.setVal(valueArr.get(i).toString()); + temData.setTargetName(targetName); + temData.setTargetKey(targetKey); + temData.setPhaseType(phase); + temData.setType(valueType); + temList.add(temData); + } + }); + + Map> listMap = temList.stream().collect(Collectors.groupingBy(DetailAbnormalVO.DetailLimitInnerVO::getTime, TreeMap::new, Collectors.toList())); + listMap.forEach((time, timeList) -> { + Map> indexMap = timeList.stream().collect(Collectors.groupingBy(DetailAbnormalVO.DetailLimitInnerVO::getTargetKey)); + indexMap.forEach((target, targetList) -> { + String unit; + if (StrUtil.isNotBlank(pqReasonableRangeDto.getUnit())) { + unit = pqReasonableRangeDto.getUnit(); + } else { + unit = ""; + } + + Map> phaseMap = timeList.stream().collect(Collectors.groupingBy(DetailAbnormalVO.DetailLimitInnerVO::getPhaseType)); + phaseMap.forEach((phaseKey, valueList) -> { + DetailAbnormalVO.DetailAbnormalInnerVO vo = new DetailAbnormalVO.DetailAbnormalInnerVO(); + vo.setTime(time); + vo.setTargetName(timeList.get(0).getTargetName()); + vo.setTargetKey(targetKey); + vo.setPhaseType(phaseKey); + vo.setRangeDesc(pqReasonableRangeDto.getMinValue() + unit + " ~ " + pqReasonableRangeDto.getMaxValue() + unit); + valueList.forEach(ites -> { + switch (ites.getType()) { + case "AVG": + vo.setAvg(ites.getVal()); + break; + case "MAX": + vo.setMax(ites.getVal()); + break; + case "MIN": + vo.setMin(ites.getVal()); + break; + case "CP95": + vo.setCp95(ites.getVal()); + break; + } + }); + result.add(vo); + }); + }); + }); + + } + + + private List baseDataVerifyQuery(List monitorIds, MonitorBaseParam monitorBaseParam) { + LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper<>(); + lambdaQueryWrapper.between(PqDataVerifyBak::getTimeId, DateUtil.beginOfDay(DateUtil.parse(monitorBaseParam.getSearchBeginTime())), DateUtil.endOfDay(DateUtil.parse(monitorBaseParam.getSearchEndTime()))) + .in(PqDataVerifyBak::getLineId, monitorIds) + .eq(PqDataVerifyBak::getState, 1) + .orderByAsc(PqDataVerifyBak::getTimeId); + return this.list(lambdaQueryWrapper); + } + + private List baseDataSumVerifyQuery(List monitorIds, MonitorBaseParam monitorBaseParam) { + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.select("line_id as lineId,sum(freq) as freq,sum(freq_Dev) as freqDev,sum(v_Rms) as vRms,sum(v_Pos) as vPos,sum(v_Neg) as vNeg," + + "sum(v_Zero) as vZero,sum(v_Unbalance) as vUnbalance,sum(rms_Lvr) as rmsLvr,sum(vu_Dev) as vuDev,sum(vl_Dev) as vlDev," + + "sum(v_Thd) as vThd,sum(v) as v,sum(i_Rms) as iRms,sum(plt) as plt,sum(v_Inharm) as vInharm,sum(v_Harm) as vHarm,sum(pf) as pf," + + "sum(v_Phasic) as vPhasic,sum(v1_Phasic) as v1Phasic,sum(fluc) as fluc,sum(pst) as pst,sum(state) as state") + .lambda().between(PqDataVerifyBak::getTimeId, DateUtil.beginOfDay(DateUtil.parse(monitorBaseParam.getSearchBeginTime())), DateUtil.endOfDay(DateUtil.parse(monitorBaseParam.getSearchEndTime()))) + .in(PqDataVerifyBak::getLineId, monitorIds) + .eq(PqDataVerifyBak::getState, 1) + .groupBy(PqDataVerifyBak::getLineId); + return this.list(queryWrapper); + } + + /** + * 时间范围异常测点数量 + */ + private List> getRangeAbnormalMonitor(MonitorBaseParam monitorBaseParam, List dataVerifyList) { + List> result = new ArrayList<>(); + DateTime startTime = DateUtil.parse(monitorBaseParam.getSearchBeginTime()); + DateTime endTime = DateUtil.parse(monitorBaseParam.getSearchEndTime()); + if (startTime.year() == endTime.year() && startTime.month() == endTime.month()) { + DateRange ranged = DateUtil.range(DateUtil.parse(monitorBaseParam.getSearchBeginTime()), DateUtil.parse(monitorBaseParam.getSearchEndTime()), DateField.DAY_OF_MONTH); + Map map = dataVerifyList.stream().collect(Collectors.groupingBy(its -> its.getTimeId().format(DATE_FORMAT), + Collectors.mapping(PqDataVerifyBak::getLineId, Collectors.collectingAndThen(Collectors.toSet(), Set::size)))); + for (DateTime dateTime : ranged) { + Map rangeMap = new HashMap<>(); + String time = DateUtil.format(dateTime, DATE_FORMAT); + rangeMap.put("time", time); + rangeMap.put("val", map.getOrDefault(time, 0)); + result.add(rangeMap); + } + } else { + //不在一个月则展示月数据 + DateRange ranged = DateUtil.range(DateUtil.parse(monitorBaseParam.getSearchBeginTime()), DateUtil.parse(monitorBaseParam.getSearchEndTime()), DateField.MONTH); + if (CollUtil.isNotEmpty(dataVerifyList)) { + Map map = dataVerifyList.stream().collect(Collectors.groupingBy(it -> it.getTimeId().format(DateTimeFormatter.ofPattern(DatePattern.NORM_MONTH_PATTERN)), + Collectors.mapping(PqDataVerifyBak::getLineId, Collectors.collectingAndThen(Collectors.toSet(), Set::size)))); + for (DateTime dateTime : ranged) { + Map rangeMap = new HashMap<>(); + String time = DateUtil.format(dateTime, DateTimeFormatter.ofPattern(DatePattern.NORM_MONTH_PATTERN)); + rangeMap.put("time", time); + rangeMap.put("val", map.getOrDefault(time, 0)); + result.add(rangeMap); + } + } + } + return result; + } + + + /** + * 指标异常测点数量 + */ + public List getAbnormalTarget(List dataVerifyList) { + List result = new ArrayList<>(); + Map rangeMap = getStandRange(); + rangeMap.forEach((key, dto) -> { + Set ids; + switch (key) { + case Param.freq: + ids = dataVerifyList.stream().filter(it -> it.getFreq() > 0).map(PqDataVerifyBak::getLineId).collect(Collectors.toSet()); + assembleEntity(ids, dto, result); + break; + case Param.freq_dev: + ids = dataVerifyList.stream().filter(it -> it.getFreqDev() > 0).map(PqDataVerifyBak::getLineId).collect(Collectors.toSet()); + assembleEntity(ids, dto, result); + break; + case Param.rms_v: + ids = dataVerifyList.stream().filter(it -> it.getVRms() > 0).map(PqDataVerifyBak::getLineId).collect(Collectors.toSet()); + assembleEntity(ids, dto, result); + break; + case Param.rms_lvr: + ids = dataVerifyList.stream().filter(it -> it.getRmsLvr() > 0).map(PqDataVerifyBak::getLineId).collect(Collectors.toSet()); + assembleEntity(ids, dto, result); + break; + case Param.vu_dev: + ids = dataVerifyList.stream().filter(it -> it.getVuDev() > 0).map(PqDataVerifyBak::getLineId).collect(Collectors.toSet()); + assembleEntity(ids, dto, result); + break; + case Param.vl_dev: + ids = dataVerifyList.stream().filter(it -> it.getVlDev() > 0).map(PqDataVerifyBak::getLineId).collect(Collectors.toSet()); + assembleEntity(ids, dto, result); + break; + + case Param.rms_i: + ids = dataVerifyList.stream().filter(it -> it.getIRms() > 0).map(PqDataVerifyBak::getLineId).collect(Collectors.toSet()); + assembleEntity(ids, dto, result); + break; + case Param.v_thd: + ids = dataVerifyList.stream().filter(it -> it.getVThd() > 0).map(PqDataVerifyBak::getLineId).collect(Collectors.toSet()); + assembleEntity(ids, dto, result); + break; + case Param.v_1_v: + ids = dataVerifyList.stream().filter(it -> it.getV() > 0).map(PqDataVerifyBak::getLineId).collect(Collectors.toSet()); + assembleEntity(ids, dto, result); + break; + case Param.phasic_v_1: + ids = dataVerifyList.stream().filter(it -> it.getV1Phasic() > 0).map(PqDataVerifyBak::getLineId).collect(Collectors.toSet()); + assembleEntity(ids, dto, result); + break; + case Param.phasic_rate_x: + ids = dataVerifyList.stream().filter(it -> it.getVPhasic() > 0).map(PqDataVerifyBak::getLineId).collect(Collectors.toSet()); + assembleEntity(ids, dto, result); + break; + case Param.v_rate: + ids = dataVerifyList.stream().filter(it -> it.getVHarm() > 0).map(PqDataVerifyBak::getLineId).collect(Collectors.toSet()); + assembleEntity(ids, dto, result); + break; + case Param.in_v_rate: + ids = dataVerifyList.stream().filter(it -> it.getVInharm() > 0).map(PqDataVerifyBak::getLineId).collect(Collectors.toSet()); + assembleEntity(ids, dto, result); + break; + case Param.v_zero: + ids = dataVerifyList.stream().filter(it -> it.getVZero() > 0).map(PqDataVerifyBak::getLineId).collect(Collectors.toSet()); + assembleEntity(ids, dto, result); + break; + case Param.v_neg: + ids = dataVerifyList.stream().filter(it -> it.getVNeg() > 0).map(PqDataVerifyBak::getLineId).collect(Collectors.toSet()); + assembleEntity(ids, dto, result); + break; + case Param.v_pos: + ids = dataVerifyList.stream().filter(it -> it.getVPos() > 0).map(PqDataVerifyBak::getLineId).collect(Collectors.toSet()); + assembleEntity(ids, dto, result); + break; + case Param.v_unbalance: + ids = dataVerifyList.stream().filter(it -> it.getVUnbalance() > 0).map(PqDataVerifyBak::getLineId).collect(Collectors.toSet()); + assembleEntity(ids, dto, result); + break; + case Param.fluc: + ids = dataVerifyList.stream().filter(it -> it.getFluc() > 0).map(PqDataVerifyBak::getLineId).collect(Collectors.toSet()); + assembleEntity(ids, dto, result); + break; + case Param.pst: + ids = dataVerifyList.stream().filter(it -> it.getPst() > 0).map(PqDataVerifyBak::getLineId).collect(Collectors.toSet()); + assembleEntity(ids, dto, result); + break; + case Param.plt: + ids = dataVerifyList.stream().filter(it -> it.getPlt() > 0).map(PqDataVerifyBak::getLineId).collect(Collectors.toSet()); + assembleEntity(ids, dto, result); + break; + case Param.pf: + ids = dataVerifyList.stream().filter(it -> it.getPf() > 0).map(PqDataVerifyBak::getLineId).collect(Collectors.toSet()); + assembleEntity(ids, dto, result); + break; + default: + log.error("未匹配到异常数据指标"); + break; + } + }); + return result.stream().sorted(Comparator.comparing(VerifyTargetVO::getSort)).collect(Collectors.toList()); + } + + /** + * 组装实体 + */ + private void assembleEntity(Set ids, PqReasonableRangeDto dto, List result) { + VerifyTargetVO verifyTargetVO = new VerifyTargetVO(); + verifyTargetVO.setKey(dto.getInfluxdbTableName() + SEPARATOR + dto.getIndexCode()); + verifyTargetVO.setTargetName(dto.getIndexName().replace("次", "")); + verifyTargetVO.setIds(ids); + verifyTargetVO.setRemark(dto.getRemark()); + verifyTargetVO.setSort(dto.getSort()); + String unit = ""; + if (StrUtil.isNotBlank(dto.getUnit())) { + unit = dto.getUnit(); + } + verifyTargetVO.setRangeDesc(dto.getMinValue() + unit + " ~ " + dto.getMaxValue() + unit); + result.add(verifyTargetVO); + } + + /** + * 获取异常范围标准 + */ + private Map getStandRange() { + DataCleanParam dataCleanParam = new DataCleanParam(); + dataCleanParam.setSystemType(DataCleanEnum.Pqs.getCode()); + List pqReasonableRangeDtoList = pqReasonableRangeFeignClient.getData(dataCleanParam).getData(); + return pqReasonableRangeDtoList.stream().collect(Collectors.toMap(it -> it.getInfluxdbTableName() + SEPARATOR + it.getIndexCode(), Function.identity())); + } + + /** + * 检查日期列表中是否存在连续指定天数的异常 + * + * @param dateList 日期列表(已排序) + * @param day 连续天数阈值 + * @return 是否存在连续异常 + */ + private Boolean verData(List dateList, Integer day) { + for (int i = 0; i <= dateList.size() - day; i++) { + boolean isConsecutive = true; + for (int j = 1; j < day; j++) { + if (!dateList.get(i).plusDays(j).equals(dateList.get(i + j))) { + isConsecutive = false; + break; + } + } + if (isConsecutive) { + return true; + } + } + return false; + } + +}