|
|
|
|
@@ -0,0 +1,650 @@
|
|
|
|
|
package com.njcn.device.pq.service.impl;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
import cn.hutool.core.codec.Base64;
|
|
|
|
|
import cn.hutool.core.collection.CollUtil;
|
|
|
|
|
import cn.hutool.core.date.*;
|
|
|
|
|
import cn.hutool.core.util.StrUtil;
|
|
|
|
|
import cn.hutool.json.JSONArray;
|
|
|
|
|
import cn.hutool.json.JSONConfig;
|
|
|
|
|
import cn.hutool.json.JSONObject;
|
|
|
|
|
import cn.hutool.json.JSONTokener;
|
|
|
|
|
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
|
|
|
|
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
|
|
|
|
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
|
|
|
|
import com.njcn.common.pojo.exception.BusinessException;
|
|
|
|
|
import com.njcn.dataProcess.api.PqReasonableRangeFeignClient;
|
|
|
|
|
import com.njcn.dataProcess.enums.DataCleanEnum;
|
|
|
|
|
import com.njcn.dataProcess.param.DataCleanParam;
|
|
|
|
|
import com.njcn.dataProcess.pojo.dto.PqReasonableRangeDto;
|
|
|
|
|
import com.njcn.device.biz.enums.DeviceResponseEnum;
|
|
|
|
|
import com.njcn.device.biz.pojo.dto.LineDevGetDTO;
|
|
|
|
|
import com.njcn.device.pq.constant.Param;
|
|
|
|
|
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;
|
|
|
|
|
import com.njcn.device.pq.pojo.po.PqDataVerifyBak;
|
|
|
|
|
import com.njcn.device.pq.pojo.vo.AreaLineInfoVO;
|
|
|
|
|
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.pojo.vo.dataClean.VerifyTargetVO;
|
|
|
|
|
import com.njcn.device.pq.service.CommTerminalService;
|
|
|
|
|
import com.njcn.device.pq.service.IPqDataVerifyBakService;
|
|
|
|
|
import com.njcn.harmonic.enums.HarmonicResponseEnum;
|
|
|
|
|
import com.njcn.oss.constant.OssPath;
|
|
|
|
|
import com.njcn.oss.utils.FileStorageUtil;
|
|
|
|
|
import com.njcn.supervision.api.UserLedgerFeignClient;
|
|
|
|
|
import com.njcn.supervision.pojo.vo.user.NewUserReportVO;
|
|
|
|
|
import com.njcn.system.api.DictTreeFeignClient;
|
|
|
|
|
import com.njcn.system.enums.DicDataEnum;
|
|
|
|
|
import com.njcn.system.pojo.po.SysDicTreePO;
|
|
|
|
|
import lombok.RequiredArgsConstructor;
|
|
|
|
|
import lombok.extern.slf4j.Slf4j;
|
|
|
|
|
import org.slf4j.Logger;
|
|
|
|
|
import org.slf4j.LoggerFactory;
|
|
|
|
|
import org.springframework.stereotype.Service;
|
|
|
|
|
|
|
|
|
|
import java.io.InputStream;
|
|
|
|
|
import java.time.LocalDate;
|
|
|
|
|
import java.time.LocalDateTime;
|
|
|
|
|
import java.time.format.DateTimeFormatter;
|
|
|
|
|
import java.util.*;
|
|
|
|
|
import java.util.function.Function;
|
|
|
|
|
import java.util.stream.Collectors;
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* <p>
|
|
|
|
|
* 服务实现类
|
|
|
|
|
* </p>
|
|
|
|
|
*
|
|
|
|
|
* @author cdf
|
|
|
|
|
* @since 2025-06-10
|
|
|
|
|
*/
|
|
|
|
|
@Service
|
|
|
|
|
@RequiredArgsConstructor
|
|
|
|
|
@Slf4j
|
|
|
|
|
public class PqDataVerifyBakServiceImpl extends ServiceImpl<PqDataVerifyBakMapper, PqDataVerifyBak> 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<String> monitorIds = commTerminalService.getRunMonitorByDept(monitorBaseParam);
|
|
|
|
|
if (CollUtil.isEmpty(monitorIds)) {
|
|
|
|
|
throw new BusinessException(DeviceResponseEnum.QUERY_LINE_DATA_EMPTY);
|
|
|
|
|
}
|
|
|
|
|
List<PqDataVerifyBak> dataVerifyList = baseDataVerifyQuery(monitorIds, monitorBaseParam);
|
|
|
|
|
VerifyMonitorVO verifyMonitorVO = new VerifyMonitorVO();
|
|
|
|
|
verifyMonitorVO.setRunNum(monitorIds.size());
|
|
|
|
|
verifyMonitorVO.setAbnormalNum(dataVerifyList.stream().collect(Collectors.groupingBy(PqDataVerifyBak::getLineId)).size());
|
|
|
|
|
List<PqDataVerifyBak> dataSumVerifyList = baseDataSumVerifyQuery(monitorIds, monitorBaseParam);
|
|
|
|
|
verifyMonitorVO.setMapList(getRangeAbnormalMonitor(monitorBaseParam, dataVerifyList));
|
|
|
|
|
verifyMonitorVO.setTargetList(getAbnormalTarget(dataSumVerifyList));
|
|
|
|
|
verifyMonitorVO.setMonitorAlarmInfo(getAbnormalTable(dataVerifyList, monitorBaseParam));
|
|
|
|
|
return verifyMonitorVO;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public List<PowerQualityIndicatorsVO> getAbnormalTable(List<PqDataVerifyBak> dataVerifyList, MonitorBaseParam monitorBaseParam) {
|
|
|
|
|
List<PowerQualityIndicatorsVO> result = new ArrayList<>();
|
|
|
|
|
Map<String, List<PqDataVerifyBak>> dataMap = dataVerifyList.stream().collect(Collectors.groupingBy(PqDataVerifyBak::getLineId));
|
|
|
|
|
dataMap.forEach((key, list) -> {
|
|
|
|
|
List<LocalDate> 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<LocalDate> dateList, List<PowerQualityIndicatorsVO> 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<PowerQualityIndicatorsVO> result) {
|
|
|
|
|
if (CollUtil.isNotEmpty(result)) {
|
|
|
|
|
List<SysDicTreePO> dicTreePOList = dictTreeFeignClient.queryAllByType(Integer.valueOf(DicDataEnum.Obj_Type.getCode())).getData();
|
|
|
|
|
Map<String, SysDicTreePO> sysDicTreePOMap = dicTreePOList.stream().collect(Collectors.toMap(SysDicTreePO::getId, Function.identity()));
|
|
|
|
|
List<String> ids = result.stream().map(PowerQualityIndicatorsVO::getMonitorId).distinct().collect(Collectors.toList());
|
|
|
|
|
List<AreaLineInfoVO> areaLineInfoVOList = lineMapper.getBaseLineAreaInfo(ids, null, null);
|
|
|
|
|
Map<String, AreaLineInfoVO> areaMap = areaLineInfoVOList.stream().collect(Collectors.toMap(AreaLineInfoVO::getLineId, Function.identity()));
|
|
|
|
|
|
|
|
|
|
List<String> objIds = areaLineInfoVOList.stream().map(AreaLineInfoVO::getObjId).distinct().collect(Collectors.toList());
|
|
|
|
|
List<NewUserReportVO> userLedgerVOList = userLedgerFeignClient.getUserReportByIds(objIds).getData();
|
|
|
|
|
Map<String, NewUserReportVO> 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<PowerQualityIndicatorsVO> getMonitorVerifyDay(MonitorBaseParam monitorBaseParam) {
|
|
|
|
|
List<String> monitorIds = commTerminalService.getRunMonitorByDept(monitorBaseParam);
|
|
|
|
|
List<PqDataVerifyBak> dataVerifyList = baseDataVerifyQuery(monitorIds, monitorBaseParam);
|
|
|
|
|
return getAbnormalTable(dataVerifyList, monitorBaseParam);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
public List<DetailAbnormalVO> monitorAbnormalTable(MonitorBaseParam monitorBaseParam) {
|
|
|
|
|
List<DetailAbnormalVO> result = new ArrayList<>();
|
|
|
|
|
|
|
|
|
|
Map<String, PqReasonableRangeDto> rangeMap= getStandRange();
|
|
|
|
|
if(StrUtil.isNotBlank(monitorBaseParam.getTargetKey())) {
|
|
|
|
|
if (!rangeMap.containsKey(monitorBaseParam.getTargetKey())) {
|
|
|
|
|
throw new BusinessException("targetKey异常参数!");
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
List<LineDevGetDTO> lineDetailList = lineMapper.getMonitorListDetail(monitorBaseParam.getMonitorIds());
|
|
|
|
|
Map<String, LineDevGetDTO> lineDetailMap = lineDetailList.stream().collect(Collectors.toMap(LineDevGetDTO::getPointId, Function.identity()));
|
|
|
|
|
|
|
|
|
|
LambdaQueryWrapper<PqDataVerifyBak> 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<PqDataVerifyBak> dataVerifyList = this.list(lambdaQueryWrapper);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
for (PqDataVerifyBak pqDataVerifyBak : dataVerifyList) {
|
|
|
|
|
Set<String> 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<DetailAbnormalVO.DetailAbnormalInnerVO> monitorAbnormalTableDetail(MonitorBaseParam monitorBaseParam) {
|
|
|
|
|
Map<String, PqReasonableRangeDto> dtoMap = getStandRange();
|
|
|
|
|
if(StrUtil.isNotBlank(monitorBaseParam.getTargetKey())) {
|
|
|
|
|
if (!dtoMap.containsKey(monitorBaseParam.getTargetKey())) {
|
|
|
|
|
throw new BusinessException("targetKey异常参数!");
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
List<DetailAbnormalVO.DetailAbnormalInnerVO> result = new ArrayList<>();
|
|
|
|
|
LambdaQueryWrapper<PqDataVerifyBak> 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<String, PqReasonableRangeDto> 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<String, PqReasonableRangeDto> dtoMap, String targetKey, JSONObject targetJson, List<DetailAbnormalVO.DetailAbnormalInnerVO> 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<DetailAbnormalVO.DetailLimitInnerVO> 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<String, List<DetailAbnormalVO.DetailLimitInnerVO>> listMap = temList.stream().collect(Collectors.groupingBy(DetailAbnormalVO.DetailLimitInnerVO::getTime, TreeMap::new, Collectors.toList()));
|
|
|
|
|
listMap.forEach((time, timeList) -> {
|
|
|
|
|
Map<String, List<DetailAbnormalVO.DetailLimitInnerVO>> 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<String, List<DetailAbnormalVO.DetailLimitInnerVO>> 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<PqDataVerifyBak> baseDataVerifyQuery(List<String> monitorIds, MonitorBaseParam monitorBaseParam) {
|
|
|
|
|
LambdaQueryWrapper<PqDataVerifyBak> 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<PqDataVerifyBak> baseDataSumVerifyQuery(List<String> monitorIds, MonitorBaseParam monitorBaseParam) {
|
|
|
|
|
QueryWrapper<PqDataVerifyBak> 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<Map<String, Object>> getRangeAbnormalMonitor(MonitorBaseParam monitorBaseParam, List<PqDataVerifyBak> dataVerifyList) {
|
|
|
|
|
List<Map<String, Object>> 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<String, Integer> 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<String, Object> 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<String, Integer> 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<String, Object> 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<VerifyTargetVO> getAbnormalTarget(List<PqDataVerifyBak> dataVerifyList) {
|
|
|
|
|
List<VerifyTargetVO> result = new ArrayList<>();
|
|
|
|
|
Map<String, PqReasonableRangeDto> rangeMap = getStandRange();
|
|
|
|
|
rangeMap.forEach((key, dto) -> {
|
|
|
|
|
Set<String> 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<String> ids, PqReasonableRangeDto dto, List<VerifyTargetVO> 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<String, PqReasonableRangeDto> getStandRange() {
|
|
|
|
|
DataCleanParam dataCleanParam = new DataCleanParam();
|
|
|
|
|
dataCleanParam.setSystemType(DataCleanEnum.Pqs.getCode());
|
|
|
|
|
List<PqReasonableRangeDto> 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<LocalDate> 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;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|