diff --git a/algorithm/algorithm-boot/src/main/java/com/njcn/algorithm/ExecutionCenter.java b/algorithm/algorithm-boot/src/main/java/com/njcn/algorithm/ExecutionCenter.java index 6ca7a6d..6c4745c 100644 --- a/algorithm/algorithm-boot/src/main/java/com/njcn/algorithm/ExecutionCenter.java +++ b/algorithm/algorithm-boot/src/main/java/com/njcn/algorithm/ExecutionCenter.java @@ -6,13 +6,12 @@ import cn.hutool.core.date.DatePattern; import cn.hutool.core.date.DateTime; import cn.hutool.core.date.DateUnit; import cn.hutool.core.date.DateUtil; -import cn.hutool.core.text.StrPool; import cn.hutool.core.util.StrUtil; import com.njcn.algorithm.pojo.bo.BaseParam; import com.njcn.algorithm.pojo.bo.CalculatedParam; import com.njcn.algorithm.pojo.bo.HourParam; import com.njcn.algorithm.pojo.enums.PrepareResponseEnum; -import com.njcn.algorithm.service.line.FlowService; +import com.njcn.algorithm.service.line.FlowAsyncService; import com.njcn.common.pojo.annotation.OperateInfo; import com.njcn.common.pojo.enums.common.LogEnum; import com.njcn.common.pojo.exception.BusinessException; @@ -29,7 +28,6 @@ import com.njcn.user.pojo.po.Dept; import com.njcn.web.controller.BaseController; import com.yomahub.liteflow.core.FlowExecutor; import com.yomahub.liteflow.flow.LiteflowResponse; -import com.yomahub.liteflow.flow.entity.CmpStep; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import lombok.RequiredArgsConstructor; @@ -46,6 +44,7 @@ import org.springframework.web.bind.annotation.RestController; import javax.annotation.Resource; import java.util.*; import java.util.stream.Collectors; +import static com.njcn.algorithm.utils.MemorySizeUtil.dealResponse; /** * @author hongawen @@ -72,7 +71,7 @@ public class ExecutionCenter extends BaseController { @Resource private CsLineFeignClient csLineFeignClient; @Resource - private FlowService flowService; + private FlowAsyncService flowService; /*** * 1、校验非全链执行时,tagNames节点标签集合必须为非空,否则提示---无可执行节点 @@ -97,41 +96,6 @@ public class ExecutionCenter extends BaseController { return calculatedParam; } - /*** - * - * @author hongawen - * @date 2023/11/7 14:44 - */ - private void dealResponse(CalculatedParam calculatedParam, LiteflowResponse liteflowResponse, String methodDescribe) { -// MemorySizeUtil.getNowMemory(); - if (liteflowResponse.isSuccess()) { - // 获取执行步骤列表 - long allTime = 0; - Map> executeSteps = liteflowResponse.getExecuteSteps(); - for (String key : executeSteps.keySet()) { - List cmpSteps = executeSteps.get(key); - long timeSum = cmpSteps.stream().mapToLong(CmpStep::getTimeSpent).sum(); - allTime += timeSum; - } - logger.info("日期{},{}执行{}成功,执行总时长{}分钟", calculatedParam.getDataDate(), methodDescribe, calculatedParam.isFullChain() ? "全链" : "指定节点:".concat(String.join(StrPool.COMMA, calculatedParam.getTagNames())), allTime / 1000 / 60); - } else { - Map> executeSteps = liteflowResponse.getExecuteSteps(); - CmpStep failStep = null; - for (String key : executeSteps.keySet()) { - List cmpSteps = executeSteps.get(key); - cmpSteps = cmpSteps.stream().filter(cmpStep -> !cmpStep.isSuccess()).collect(Collectors.toList()); - if (CollectionUtil.isNotEmpty(cmpSteps)) { - failStep = cmpSteps.get(0); - } - } - logger.error("日期{},{}执行{}失败,在执行{}失败,失败原因:{}" - , calculatedParam.getDataDate() - , methodDescribe - , calculatedParam.isFullChain() ? "全链" : "指定节点:".concat(String.join(StrPool.COMMA, calculatedParam.getTagNames())) - , failStep.getNodeId().concat(Objects.isNull(failStep.getTag()) ? "" : StrPool.DASHED.concat(failStep.getTag())) - , Objects.isNull(failStep.getException()) ? null : failStep.getException().getMessage()); - } - } @OperateInfo(info = LogEnum.BUSINESS_COMMON) diff --git a/algorithm/algorithm-boot/src/main/java/com/njcn/algorithm/service/line/FlowAsyncService.java b/algorithm/algorithm-boot/src/main/java/com/njcn/algorithm/service/line/FlowAsyncService.java new file mode 100644 index 0000000..9fb3e9d --- /dev/null +++ b/algorithm/algorithm-boot/src/main/java/com/njcn/algorithm/service/line/FlowAsyncService.java @@ -0,0 +1,45 @@ +package com.njcn.algorithm.service.line; + +import com.njcn.algorithm.pojo.bo.CalculatedParam; +import com.njcn.dataProcess.pojo.dto.PqReasonableRangeDto; +import com.njcn.device.pq.pojo.vo.LineDetailVO; +import com.njcn.system.pojo.po.DictData; + +import java.util.List; +import java.util.Map; + +public interface FlowAsyncService { + + /** + * 算法多线程执行 + * @param methodDescribe + * @param calculatedParam + * @Author: wr + * @Date: 2025/12/17 9:25 + */ + void execute2Resp(String methodDescribe,CalculatedParam calculatedParam); + + + /** + * 多线程数据清洗方法 + * @param line + * @param map + * @param dataDate + * @param dip + * @param rise + * @param size + * @param i + * @Author: wr + * @Date: 2025/12/17 10:48 + */ + void lineDataClean(LineDetailVO.Detail line, + Map> map, + String dataDate, + DictData dip, + DictData rise, + int size, + int i + ); + + +} diff --git a/algorithm/algorithm-boot/src/main/java/com/njcn/algorithm/service/line/FlowService.java b/algorithm/algorithm-boot/src/main/java/com/njcn/algorithm/service/line/FlowService.java deleted file mode 100644 index 0626ed1..0000000 --- a/algorithm/algorithm-boot/src/main/java/com/njcn/algorithm/service/line/FlowService.java +++ /dev/null @@ -1,12 +0,0 @@ -package com.njcn.algorithm.service.line; - -import com.njcn.algorithm.pojo.bo.CalculatedParam; - -public interface FlowService { - - /** - * 多线程任务 - * @param calculatedParam - */ - void execute2Resp(String methodDescribe,CalculatedParam calculatedParam); -} diff --git a/algorithm/algorithm-boot/src/main/java/com/njcn/algorithm/service/line/IDataLimitRateAsync.java b/algorithm/algorithm-boot/src/main/java/com/njcn/algorithm/service/line/IDataLimitRateAsync.java new file mode 100644 index 0000000..8b9aca6 --- /dev/null +++ b/algorithm/algorithm-boot/src/main/java/com/njcn/algorithm/service/line/IDataLimitRateAsync.java @@ -0,0 +1,27 @@ +package com.njcn.algorithm.service.line; + +import com.njcn.device.biz.pojo.po.Overlimit; + +import java.util.List; +import java.util.Map; + +public interface IDataLimitRateAsync { + + /** + * limit_rate多线程算法 + * @param dataDate + * @param list + * @param phase + * @param overLimitMap + * @param size + * @param i + * @Author: wr + * @Date: 2025/12/17 12:16 + */ + void lineDataRate(String dataDate, + List list, + List phase, + Map overLimitMap, + int size, + int i); +} diff --git a/algorithm/algorithm-boot/src/main/java/com/njcn/algorithm/serviceimpl/line/DataCleanServiceImpl.java b/algorithm/algorithm-boot/src/main/java/com/njcn/algorithm/serviceimpl/line/DataCleanServiceImpl.java index 1ec4027..68e3cff 100644 --- a/algorithm/algorithm-boot/src/main/java/com/njcn/algorithm/serviceimpl/line/DataCleanServiceImpl.java +++ b/algorithm/algorithm-boot/src/main/java/com/njcn/algorithm/serviceimpl/line/DataCleanServiceImpl.java @@ -1,31 +1,23 @@ package com.njcn.algorithm.serviceimpl.line; import cn.hutool.core.collection.CollUtil; -import cn.hutool.core.date.DatePattern; -import cn.hutool.core.io.IoUtil; -import cn.hutool.core.util.CharsetUtil; import cn.hutool.core.util.ObjectUtil; -import com.alibaba.nacos.shaded.com.google.gson.Gson; import com.njcn.algorithm.pojo.bo.CalculatedParam; +import com.njcn.algorithm.service.line.FlowAsyncService; import com.njcn.algorithm.service.line.IDataCleanService; import com.njcn.algorithm.utils.MemorySizeUtil; import com.njcn.dataProcess.api.*; -import com.njcn.dataProcess.dto.DataCleanJsonDTO; import com.njcn.dataProcess.dto.RmpEventDetailDTO; import com.njcn.dataProcess.enums.DataCleanEnum; import com.njcn.dataProcess.param.DataCleanParam; import com.njcn.dataProcess.param.LineCountEvaluateParam; import com.njcn.dataProcess.pojo.dto.*; import com.njcn.dataProcess.pojo.po.PqDataVerify; -import com.njcn.dataProcess.pojo.po.PqDataVerifyBak; -import com.njcn.dataProcess.pojo.po.PqDataVerifyCount; import com.njcn.dataProcess.util.DataCommonUtils; import com.njcn.dataProcess.util.TimeUtils; import com.njcn.device.pq.api.LineFeignClient; import com.njcn.device.pq.pojo.vo.LineDetailDataVO; import com.njcn.device.pq.pojo.vo.LineDetailVO; -import com.njcn.oss.constant.OssPath; -import com.njcn.oss.utils.FileStorageUtil; import com.njcn.system.api.DicDataFeignClient; import com.njcn.system.enums.DicDataEnum; import com.njcn.system.enums.DicDataTypeEnum; @@ -36,18 +28,14 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; -import org.springframework.scheduling.annotation.Async; import org.springframework.stereotype.Component; import org.springframework.transaction.annotation.Transactional; import javax.annotation.Resource; -import java.io.InputStream; import java.lang.reflect.Method; import java.time.*; import java.time.format.DateTimeFormatter; import java.util.*; -import java.util.concurrent.CompletableFuture; -import java.util.concurrent.atomic.AtomicInteger; import java.util.function.Function; import java.util.stream.Collectors; @@ -60,8 +48,6 @@ public class DataCleanServiceImpl implements IDataCleanService { private static final Logger logger = LoggerFactory.getLogger(DataCleanServiceImpl.class); - private final DateTimeFormatter DATE_TIME_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss").withZone(ZoneId.systemDefault()); - @Value("${line.num}") private Integer NUM = 100; @@ -102,13 +88,9 @@ public class DataCleanServiceImpl implements IDataCleanService { @Autowired private DataHarmphasicIFeignClient dataHarmphasicIFeignClient; @Resource - private PqDataVerifyNewFeignClient pqDataVerifyNewFeignClient; - @Resource - private PqDataVerifyCountFeignClient pqDataVerifyCountFeignClient; - @Resource - private FileStorageUtil fileStorageUtil; - @Resource private DicDataFeignClient dicDataFeignClient; + @Resource + private FlowAsyncService flowService; @Override @Transactional(rollbackFor = Exception.class) @@ -318,624 +300,13 @@ public class DataCleanServiceImpl implements IDataCleanService { lineParam.setStartTime(TimeUtils.getBeginOfDay(calculatedParam.getDataDate())); lineParam.setEndTime(TimeUtils.getEndOfDay(calculatedParam.getDataDate())); for (int i = 0; i < lineDetail.size(); i++) { - logger.info("总数据:" + lineDetail.size() + "=====》当前第"+(i + 1)); + logger.info( calculatedParam.getDataDate()+"总数据:" + lineDetail.size() + "=====》当前第" + (i + 1)); LineDetailVO.Detail item = lineDetail.get(i); - List> resultData = new ArrayList<>(); - Set allTimeSet = new HashSet<>(); - PqDataVerifyBak bak = new PqDataVerifyBak(); - bak.setLineId(item.getLineId()); - bak.setTime(LocalDate.parse(calculatedParam.getDataDate(), DateTimeFormatter.ofPattern(DatePattern.NORM_DATE_PATTERN))); - lineParam.setLineId(Collections.singletonList(item.getLineId())); - //dataV - List data1 = dataVFeignClient.getRawData(lineParam).getData(); - //dataI - List data2 = dataIFeignClient.getRawData(lineParam).getData(); - //dataPlt - List data3 = dataPltFeignClient.getRawData(lineParam).getData(); - //dataInHarmV - List data4 = dataInharmVFeignClient.getRawData(lineParam).getData(); - //dataHarmRateV - List data5 = dataHarmRateVFeignClient.getRawData(lineParam).getData(); - //dataHarmPowerP - List data6 = dataHarmpowerPFeignClient.getRawData(lineParam).getData(); - //dataHarmPhasicV - List data7 = dataHarmphasicVFeignClient.getRawData(lineParam).getData(); - //dataFluc - List data8 = dataFlucFeignClient.getRawData(lineParam).getData(); - //dataFlicker - List data9 = dataFlickerFeignClient.getRawData(lineParam).getData(); - //获取监测点的暂态事件 - List eventList = rmpEventDetailFeignClient.getRawData(lineParam).getData(); - - if (CollUtil.isNotEmpty(data1)) { - logger.info("{}数据清洗dataV集合大小为>>>>>>>>>>>>{}", lineParam.getStartTime(), MemorySizeUtil.getObjectSize(data1)); - List result = new ArrayList<>(); - List list = map.get(DataCleanEnum.DataV.getCode()); - Map pqReasonableRangeDtoMap = list.stream().collect(Collectors.toMap(PqReasonableRangeDto::getIndexCode, Function.identity())); - data1.forEach(data -> { - List pqDataVerifies = judgeDataV(pqReasonableRangeDtoMap, item, data); - result.addAll(pqDataVerifies); - }); - if (CollUtil.isNotEmpty(result)) { - Map dtoMap = handleDataV(result, bak, item.getTimeInterval()); - Set timeSet = new HashSet<>(result.stream().map(dt -> dt.getTime().format(DateTimeFormatter.ofPattern(DatePattern.NORM_TIME_PATTERN))).collect(Collectors.toSet())); - dtoMap.put("errorTimes", timeSet.size() * item.getTimeInterval()); - allTimeSet.addAll(timeSet); - if (CollUtil.isNotEmpty(dtoMap)) { - resultData.add(dtoMap); - } - } - } - - //电流有效值先不判断异常 -// if (CollUtil.isNotEmpty(data2)) { -// logger.info("{}数据清洗dataI集合大小为>>>>>>>>>>>>{}", lineParam.getStartTime(), MemorySizeUtil.getObjectSize(data2)); -// List result = new ArrayList<>(); -// List list = map.get(DataCleanEnum.DataI.getCode()); -// Map pqReasonableRangeDtoMap = list.stream().collect(Collectors.toMap(PqReasonableRangeDto::getIndexCode, Function.identity())); -// data2.forEach(data -> { -// List pqDataVerifies = judgeDataI(pqReasonableRangeDtoMap, item, data); -// result.addAll(pqDataVerifies); -// }); -// if (CollUtil.isNotEmpty(result)) { -// Map dtoMap = handleDataI(result, bak, item.getTimeInterval()); -// Set timeSet = new HashSet<>(result.stream().map(dt -> dt.getTime().format(DateTimeFormatter.ofPattern(DatePattern.NORM_TIME_PATTERN))).collect(Collectors.toSet())); -// dtoMap.put("errorTimes", timeSet.size() * item.getTimeInterval()); -// allTimeSet.addAll(timeSet); -// if (CollUtil.isNotEmpty(dtoMap)) { -// resultData.add(dtoMap); -// } -// } -// } - - if (CollUtil.isNotEmpty(data3)) { - logger.info("{}数据清洗dataPlt集合大小为>>>>>>>>>>>>{}", lineParam.getStartTime(), MemorySizeUtil.getObjectSize(data3)); - List result = new ArrayList<>(); - List list = map.get(DataCleanEnum.DataPlt.getCode()); - Map pqReasonableRangeDtoMap = list.stream().collect(Collectors.toMap(PqReasonableRangeDto::getIndexCode, Function.identity())); - data3.forEach(data -> { - List pqDataVerifies = judgeDataPlt(pqReasonableRangeDtoMap, data); - result.addAll(pqDataVerifies); - }); - if (CollUtil.isNotEmpty(result)) { - Map dtoMap = handleDataPlt(result, bak, item.getTimeInterval()); - Set timeSet = new HashSet<>(result.stream().map(dt -> dt.getTime().format(DateTimeFormatter.ofPattern(DatePattern.NORM_TIME_PATTERN))).collect(Collectors.toSet())); - dtoMap.put("errorTimes", timeSet.size() * item.getTimeInterval()); - allTimeSet.addAll(timeSet); - if (CollUtil.isNotEmpty(dtoMap)) { - resultData.add(dtoMap); - } - } - } - - if (CollUtil.isNotEmpty(data4)) { - logger.info("{}数据清洗dataInHarmV集合大小为>>>>>>>>>>>>{}", lineParam.getStartTime(), MemorySizeUtil.getObjectSize(data4)); - List result = new ArrayList<>(); - List list = map.get(DataCleanEnum.DataInHarmV.getCode()); - Map pqReasonableRangeDtoMap = list.stream().collect(Collectors.toMap(PqReasonableRangeDto::getIndexCode, Function.identity())); - data4.forEach(data -> { - List pqDataVerifies = judgeDataInHarmV(pqReasonableRangeDtoMap, data); - result.addAll(pqDataVerifies); - }); - if (CollUtil.isNotEmpty(result)) { - Map dtoMap = handleInHarmV(result, bak, item.getTimeInterval()); - Set timeSet = new HashSet<>(result.stream().map(dt -> dt.getTime().format(DateTimeFormatter.ofPattern(DatePattern.NORM_TIME_PATTERN))).collect(Collectors.toSet())); - dtoMap.put("errorTimes", timeSet.size() * item.getTimeInterval()); - allTimeSet.addAll(timeSet); - if (CollUtil.isNotEmpty(dtoMap)) { - resultData.add(dtoMap); - } - } - } - - if (CollUtil.isNotEmpty(data5)) { - logger.info("{}数据清洗dataHarmRateV集合大小为>>>>>>>>>>>>{}", lineParam.getStartTime(), MemorySizeUtil.getObjectSize(data5)); - List result = new ArrayList<>(); - List list = map.get(DataCleanEnum.DataHarmRateV.getCode()); - Map pqReasonableRangeDtoMap = list.stream().collect(Collectors.toMap(PqReasonableRangeDto::getIndexCode, Function.identity())); - data5.forEach(data -> { - List pqDataVerifies = judgeDataHarmRateV(pqReasonableRangeDtoMap, data); - result.addAll(pqDataVerifies); - }); - if (CollUtil.isNotEmpty(result)) { - Map dtoMap = handleHarmRateV(result, bak, item.getTimeInterval()); - Set timeSet = new HashSet<>(result.stream().map(dt -> dt.getTime().format(DateTimeFormatter.ofPattern(DatePattern.NORM_TIME_PATTERN))).collect(Collectors.toSet())); - dtoMap.put("errorTimes", timeSet.size() * item.getTimeInterval()); - allTimeSet.addAll(timeSet); - if (CollUtil.isNotEmpty(dtoMap)) { - resultData.add(dtoMap); - } - } - } - - if (CollUtil.isNotEmpty(data6)) { - logger.info("{}数据清洗dataHarmPowerP集合大小为>>>>>>>>>>>>{}", lineParam.getStartTime(), MemorySizeUtil.getObjectSize(data6)); - List result = new ArrayList<>(); - List list = map.get(DataCleanEnum.DataHarmPowerP.getCode()); - Map pqReasonableRangeDtoMap = list.stream().collect(Collectors.toMap(PqReasonableRangeDto::getIndexCode, Function.identity())); - data6.forEach(data -> { - List pqDataVerifies = judgeDataHarmPowerP(pqReasonableRangeDtoMap, data); - result.addAll(pqDataVerifies); - }); - if (CollUtil.isNotEmpty(result)) { - Map dtoMap = handleHarmPowerP(result, bak, item.getTimeInterval()); - Set timeSet = new HashSet<>(result.stream().map(dt -> dt.getTime().format(DateTimeFormatter.ofPattern(DatePattern.NORM_TIME_PATTERN))).collect(Collectors.toSet())); - dtoMap.put("errorTimes", timeSet.size() * item.getTimeInterval()); - allTimeSet.addAll(timeSet); - if (CollUtil.isNotEmpty(dtoMap)) { - resultData.add(dtoMap); - } - } - } - - if (CollUtil.isNotEmpty(data7)) { - logger.info("{}数据清洗dataHarmPhasicV集合大小为>>>>>>>>>>>>{}", lineParam.getStartTime(), MemorySizeUtil.getObjectSize(data7)); - List result = new ArrayList<>(); - List list = map.get(DataCleanEnum.DataHarmPhasicV.getCode()); - Map pqReasonableRangeDtoMap = list.stream().collect(Collectors.toMap(PqReasonableRangeDto::getIndexCode, Function.identity())); - data7.forEach(data -> { - List pqDataVerifies = judgeDataHarmPhasicV(pqReasonableRangeDtoMap, data); - result.addAll(pqDataVerifies); - }); - if (CollUtil.isNotEmpty(result)) { - Map dtoMap = handleHarmPhasicV(result, bak, item.getTimeInterval()); - Set timeSet = new HashSet<>(result.stream().map(dt -> dt.getTime().format(DateTimeFormatter.ofPattern(DatePattern.NORM_TIME_PATTERN))).collect(Collectors.toSet())); - dtoMap.put("errorTimes", timeSet.size() * item.getTimeInterval()); - allTimeSet.addAll(timeSet); - if (CollUtil.isNotEmpty(dtoMap)) { - resultData.add(dtoMap); - } - } - } - - if (CollUtil.isNotEmpty(data8)) { - logger.info("{}数据清洗dataFluc集合大小为>>>>>>>>>>>>{}", lineParam.getStartTime(), MemorySizeUtil.getObjectSize(data8)); - List result = new ArrayList<>(); - List list = map.get(DataCleanEnum.DataFluc.getCode()); - Map pqReasonableRangeDtoMap = list.stream().collect(Collectors.toMap(PqReasonableRangeDto::getIndexCode, Function.identity())); - data8.forEach(data -> { - List pqDataVerifies = judgeDataFluc(pqReasonableRangeDtoMap, data); - result.addAll(pqDataVerifies); - }); - if (CollUtil.isNotEmpty(result)) { - Map dtoMap = handleDataFluc(result, bak, item.getTimeInterval()); - Set timeSet = new HashSet<>(result.stream().map(dt -> dt.getTime().format(DateTimeFormatter.ofPattern(DatePattern.NORM_TIME_PATTERN))).collect(Collectors.toSet())); - dtoMap.put("errorTimes", timeSet.size() * item.getTimeInterval()); - allTimeSet.addAll(timeSet); - if (CollUtil.isNotEmpty(dtoMap)) { - resultData.add(dtoMap); - } - } - } - - if (CollUtil.isNotEmpty(data9)) { - logger.info("{}数据清洗dataFlicker集合大小为>>>>>>>>>>>>{}", lineParam.getStartTime(), MemorySizeUtil.getObjectSize(data9)); - List result = new ArrayList<>(); - List list = map.get(DataCleanEnum.DataFlicker.getCode()); - Map pqReasonableRangeDtoMap = list.stream().collect(Collectors.toMap(PqReasonableRangeDto::getIndexCode, Function.identity())); - data9.forEach(data -> { - List pqDataVerifies = judgeDataFlicker(pqReasonableRangeDtoMap, data); - result.addAll(pqDataVerifies); - }); - if (CollUtil.isNotEmpty(result)) { - Map dtoMap = handleDataFlicker(result, bak, item.getTimeInterval()); - Set timeSet = new HashSet<>(result.stream().map(dt -> dt.getTime().format(DateTimeFormatter.ofPattern(DatePattern.NORM_TIME_PATTERN))).collect(Collectors.toSet())); - dtoMap.put("errorTimes", timeSet.size() * item.getTimeInterval()); - allTimeSet.addAll(timeSet); - if (CollUtil.isNotEmpty(dtoMap)) { - resultData.add(dtoMap); - } - } - } - - if (CollUtil.isNotEmpty(eventList)) { - logger.info("{}数据清洗eventDetail集合大小为>>>>>>>>>>>>{}", lineParam.getStartTime(), MemorySizeUtil.getObjectSize(eventList)); - List result = new ArrayList<>(); - List list = map.get(DataCleanEnum.RMpEventDetail.getCode()); - Map pqReasonableRangeDtoMap = list.stream().collect(Collectors.toMap(PqReasonableRangeDto::getIndexCode, Function.identity())); - eventList.forEach(data -> { - data.setFeatureAmplitude(data.getFeatureAmplitude() * 100.0); - List pqDataVerifies = judgeDataEvent(pqReasonableRangeDtoMap, data, dip, rise); - result.addAll(pqDataVerifies); - }); - if (CollUtil.isNotEmpty(result)) { - Map dtoMap = handleDataEvent(result, bak, item.getTimeInterval()); - Set timeSet = new HashSet<>(result.stream().map(dt -> dt.getTime().format(DateTimeFormatter.ofPattern(DatePattern.NORM_TIME_PATTERN))).collect(Collectors.toSet())); - dtoMap.put("errorTimes", timeSet.size() * item.getTimeInterval()); - allTimeSet.addAll(timeSet); - if (CollUtil.isNotEmpty(dtoMap)) { - resultData.add(dtoMap); - } - } - } - - if (CollUtil.isNotEmpty(allTimeSet)) { - PqDataVerifyCount verifyCount = new PqDataVerifyCount(); - verifyCount.setLineId(item.getLineId()); - verifyCount.setTime(LocalDate.parse(calculatedParam.getDataDate(), DateTimeFormatter.ofPattern(DatePattern.NORM_DATE_PATTERN))); - verifyCount.setTotalAll(data1.size()); - verifyCount.setFlickerAll(data9.size()); - - List dataV = data1.stream() - .filter(item1 -> allTimeSet.contains(item1.getMinTime().substring(11, 19))) - .collect(Collectors.toList()); - if (CollUtil.isNotEmpty(dataV)) { - verifyCount.setTotal(dataV.size()); -// dataV.forEach(item1-> item1.setAbnormalFlag(1)); -// dataVFeignClient.addInfluxDbList(dataV); - } -// List dataI = data2.stream() -// .filter(item1 -> allTimeSet.contains(item1.getMinTime().substring(11, 19))) -// .collect(Collectors.toList()); -// if (CollUtil.isNotEmpty(dataI)) { -// dataI.forEach(item1-> item1.setAbnormalFlag(1)); -// dataIFeignClient.addInfluxDbList(dataI); -// } -// List dataPlt = data3.stream() -// .filter(item1 -> allTimeSet.contains(item1.getMinTime().substring(11, 19))) -// .collect(Collectors.toList()); -// if (CollUtil.isNotEmpty(dataPlt)) { -// dataPlt.forEach(item1-> item1.setAbnormalFlag(1)); -// dataPltFeignClient.addInfluxDbList(dataPlt); -// } -// List dataInHarmV = data4.stream() -// .filter(item1 -> allTimeSet.contains(item1.getMinTime().substring(11, 19))) -// .collect(Collectors.toList()); -// if (CollUtil.isNotEmpty(dataInHarmV)) { -// dataInHarmV.forEach(item1-> item1.setAbnormalFlag(1)); -// dataInharmVFeignClient.addInfluxDbList(dataInHarmV); -// } -// List dataHarmRateV = data5.stream() -// .filter(item1 -> allTimeSet.contains(item1.getMinTime().substring(11, 19))) -// .collect(Collectors.toList()); -// if (CollUtil.isNotEmpty(dataHarmRateV)) { -// dataHarmRateV.forEach(item1-> item1.setAbnormalFlag(1)); -// dataHarmRateVFeignClient.addInfluxDbList(dataHarmRateV); -// } -// List dataHarmPowerP = data6.stream() -// .filter(item1 -> allTimeSet.contains(item1.getMinTime().substring(11, 19))) -// .collect(Collectors.toList()); -// if (CollUtil.isNotEmpty(dataHarmPowerP)) { -// dataHarmPowerP.forEach(item1-> item1.setAbnormalFlag(1)); -// dataHarmpowerPFeignClient.addInfluxDbList(dataHarmPowerP); -// } -// List dataHarmPhasicV = data7.stream() -// .filter(item1 -> allTimeSet.contains(item1.getMinTime().substring(11, 19))) -// .collect(Collectors.toList()); -// if (CollUtil.isNotEmpty(dataHarmPhasicV)) { -// dataHarmPhasicV.forEach(item1-> item1.setAbnormalFlag(1)); -// dataHarmphasicVFeignClient.addInfluxDbList(dataHarmPhasicV); -// } -// List dataFluc = data8.stream() -// .filter(item1 -> allTimeSet.contains(item1.getMinTime().substring(11, 19))) -// .collect(Collectors.toList()); -// if (CollUtil.isNotEmpty(dataFluc)) { -// dataFluc.forEach(item1-> item1.setAbnormalFlag(1)); -// dataFlucFeignClient.addInfluxDbList(dataFluc); -// } - List dataFlicker = data9.stream() - .filter(item1 -> allTimeSet.contains(item1.getMinTime().substring(11, 19))) - .collect(Collectors.toList()); - if (CollUtil.isNotEmpty(dataFlicker)) { - verifyCount.setFlicker(dataFlicker.size()); -// dataFlicker.forEach(item1-> item1.setAbnormalFlag(1)); -// dataFlickerFeignClient.addInfluxDbList(dataFlicker); - } - pqDataVerifyCountFeignClient.insertData(verifyCount); - Map dtoMap = new HashMap<>(1); - dtoMap.put("lineErrorTimes", allTimeSet.size() * item.getTimeInterval()); - resultData.add(dtoMap); - } - - if (CollUtil.isNotEmpty(resultData)) { - bak.setState(1); - //存储文件 - InputStream reportStream = IoUtil.toStream(new Gson().toJson(resultData), CharsetUtil.UTF_8); - String fileName = fileStorageUtil.uploadStreamSpecifyName( - reportStream - , OssPath.DATA_CLEAN + calculatedParam.getDataDate() + "/" - , item.getLineId() + ".txt"); - //存储数据 - bak.setFilePath(fileName); - } - pqDataVerifyNewFeignClient.insertData(bak); + flowService.lineDataClean(item, map, calculatedParam.getDataDate(), dip, rise,lineDetail.size(),(i + 1)); } System.gc(); } - public Map handleDataV(List result, PqDataVerifyBak bak, Integer timeInterval) { - Map map = new HashMap<>(); - Map> codeMap = result.stream().collect(Collectors.groupingBy(PqDataVerify::getIndexCode)); - //频率 - List list1 = handleData(codeMap.get(DataCleanEnum.Freq.getCode()), timeInterval); - if (CollUtil.isNotEmpty(list1)) { - bak.setFreq(1); - map.put(DataCleanEnum.DataV.getCode() + "-" + DataCleanEnum.Freq.getCode(), list1); - } - //频率偏差 - List list2 = handleData(codeMap.get(DataCleanEnum.FreqDev.getCode()), timeInterval); - if (CollUtil.isNotEmpty(list2)) { - bak.setFreqDev(1); - map.put(DataCleanEnum.DataV.getCode() + "-" + DataCleanEnum.FreqDev.getCode(), list2); - } - //相电压有效值 - List list3 = handleData(codeMap.get(DataCleanEnum.RmsV.getCode()), timeInterval); - if (CollUtil.isNotEmpty(list3)) { - bak.setVRms(1); - map.put(DataCleanEnum.DataV.getCode() + "-" + DataCleanEnum.RmsV.getCode(), list3); - } - //正序电压 - List list4 = handleData(codeMap.get(DataCleanEnum.VPos.getCode()), timeInterval); - if (CollUtil.isNotEmpty(list4)) { - bak.setVPos(1); - map.put(DataCleanEnum.DataV.getCode() + "-" + DataCleanEnum.VPos.getCode(), list4); - } - //负序电压 - List list5 = handleData(codeMap.get(DataCleanEnum.VNeg.getCode()), timeInterval); - if (CollUtil.isNotEmpty(list5)) { - bak.setVNeg(1); - map.put(DataCleanEnum.DataV.getCode() + "-" + DataCleanEnum.VNeg.getCode(), list5); - } - //零序电压 - List list6 = handleData(codeMap.get(DataCleanEnum.VZero.getCode()), timeInterval); - if (CollUtil.isNotEmpty(list6)) { - bak.setVZero(1); - map.put(DataCleanEnum.DataV.getCode() + "-" + DataCleanEnum.VZero.getCode(), list6); - } - //电压不平衡度 - List list7 = handleData(codeMap.get(DataCleanEnum.VUnbalance.getCode()), timeInterval); - if (CollUtil.isNotEmpty(list7)) { - bak.setVUnbalance(1); - map.put(DataCleanEnum.DataV.getCode() + "-" + DataCleanEnum.VUnbalance.getCode(), list7); - } - //线电压有效值 - List list8 = handleData(codeMap.get(DataCleanEnum.RmsLvr.getCode()), timeInterval); - if (CollUtil.isNotEmpty(list8)) { - bak.setRmsLvr(1); - map.put(DataCleanEnum.DataV.getCode() + "-" + DataCleanEnum.RmsLvr.getCode(), list8); - } - //电压正偏差 - List list9 = handleData(codeMap.get(DataCleanEnum.VuDev.getCode()), timeInterval); - if (CollUtil.isNotEmpty(list9)) { - bak.setVuDev(1); - map.put(DataCleanEnum.DataV.getCode() + "-" + DataCleanEnum.VuDev.getCode(), list9); - } - //电压负偏差 - List list10 = handleData(codeMap.get(DataCleanEnum.VlDev.getCode()), timeInterval); - if (CollUtil.isNotEmpty(list10)) { - bak.setVlDev(1); - map.put(DataCleanEnum.DataV.getCode() + "-" + DataCleanEnum.VlDev.getCode(), list10); - } - //电压总谐波畸变率 - List list11 = handleData(codeMap.get(DataCleanEnum.VThd.getCode()), timeInterval); - if (CollUtil.isNotEmpty(list11)) { - bak.setVThd(1); - map.put(DataCleanEnum.DataV.getCode() + "-" + DataCleanEnum.VThd.getCode(), list11); - } - //相(线)电压基波有效值 - List list12 = handleData(codeMap.get(DataCleanEnum.V_Data.getCode()), timeInterval); - if (CollUtil.isNotEmpty(list12)) { - bak.setV(1); - map.put(DataCleanEnum.DataV.getCode() + "-" + DataCleanEnum.V_Data.getCode(), list12); - } - return map; - } - - public Map handleDataI(List result, PqDataVerifyBak bak, Integer timeInterval) { - Map map = new HashMap<>(); - Map> codeMap = result.stream().collect(Collectors.groupingBy(PqDataVerify::getIndexCode)); - //电流有效值 - List list = handleData(codeMap.get(DataCleanEnum.RmsI.getCode()), timeInterval); - if (CollUtil.isNotEmpty(list)) { - bak.setIRms(1); - map.put(DataCleanEnum.DataI.getCode() + "-" + DataCleanEnum.RmsI.getCode(), list); - } - return map; - } - - public Map handleDataPlt(List result, PqDataVerifyBak bak, Integer timeInterval) { - Map map = new HashMap<>(); - Map> codeMap = result.stream().collect(Collectors.groupingBy(PqDataVerify::getIndexCode)); - //长时闪变 - List list = handleData(codeMap.get(DataCleanEnum.Plt.getCode()), timeInterval); - if (CollUtil.isNotEmpty(list)) { - bak.setPlt(1); - map.put(DataCleanEnum.DataPlt.getCode() + "-" + DataCleanEnum.Plt.getCode(), list); - } - return map; - } - - public Map handleInHarmV(List result, PqDataVerifyBak bak, Integer timeInterval) { - Map map = new HashMap<>(); - Map> codeMap = result.stream().collect(Collectors.groupingBy(PqDataVerify::getIndexCode)); - //间谐波电压含有率 - List list = handleHarmData(codeMap.get(DataCleanEnum.V_InHarm.getCode()), timeInterval); - if (CollUtil.isNotEmpty(list)) { - bak.setVInharm(1); - map.put(DataCleanEnum.DataInHarmV.getCode() + "-" + DataCleanEnum.V_InHarm.getCode(), list); - } - return map; - } - - public Map handleHarmRateV(List result, PqDataVerifyBak bak, Integer timeInterval) { - Map map = new HashMap<>(); - Map> codeMap = result.stream().collect(Collectors.groupingBy(PqDataVerify::getIndexCode)); - //谐波电压含有率 - List list = handleHarmData(codeMap.get(DataCleanEnum.V_Rate.getCode()), timeInterval); - if (CollUtil.isNotEmpty(list)) { - bak.setVHarm(1); - map.put(DataCleanEnum.DataHarmRateV.getCode() + "-" + DataCleanEnum.V_Rate.getCode(), list); - } - return map; - } - - public Map handleHarmPowerP(List result, PqDataVerifyBak bak, Integer timeInterval) { - Map map = new HashMap<>(); - Map> codeMap = result.stream().collect(Collectors.groupingBy(PqDataVerify::getIndexCode)); - //功率因素 - List list = handleData(codeMap.get(DataCleanEnum.Pf.getCode()), timeInterval); - if (CollUtil.isNotEmpty(list)) { - bak.setPf(1); - map.put(DataCleanEnum.DataHarmPowerP.getCode() + "-" + DataCleanEnum.Pf.getCode(), list); - } - return map; - } - - public Map handleHarmPhasicV(List result, PqDataVerifyBak bak, Integer timeInterval) { - Map map = new HashMap<>(); - Map> codeMap = result.stream().collect(Collectors.groupingBy(PqDataVerify::getIndexCode)); - //谐波电压相角 - List list = handleHarmData(codeMap.get(DataCleanEnum.V.getCode()), timeInterval); - if (CollUtil.isNotEmpty(list)) { - bak.setVPhasic(1); - map.put(DataCleanEnum.DataHarmPhasicV.getCode() + "-" + DataCleanEnum.V.getCode(), list); - } - //谐波电压基波相角 - List list2 = handleData(codeMap.get(DataCleanEnum.V1.getCode()), timeInterval); - if (CollUtil.isNotEmpty(list2)) { - bak.setV1Phasic(1); - map.put(DataCleanEnum.DataHarmPhasicV.getCode() + "-" + DataCleanEnum.V1.getCode(), list2); - } - return map; - } - - public Map handleDataFluc(List result, PqDataVerifyBak bak, Integer timeInterval) { - Map map = new HashMap<>(); - Map> codeMap = result.stream().collect(Collectors.groupingBy(PqDataVerify::getIndexCode)); - //电压波动 - List list = handleData(codeMap.get(DataCleanEnum.Fluc.getCode()), timeInterval); - if (CollUtil.isNotEmpty(list)) { - bak.setFluc(1); - map.put(DataCleanEnum.DataFluc.getCode() + "-" + DataCleanEnum.Fluc.getCode(), list); - } - return map; - } - - public Map handleDataFlicker(List result, PqDataVerifyBak bak, Integer timeInterval) { - Map map = new HashMap<>(); - Map> codeMap = result.stream().collect(Collectors.groupingBy(PqDataVerify::getIndexCode)); - //短时闪变 - List list = handleData(codeMap.get(DataCleanEnum.Pst.getCode()), timeInterval); - if (CollUtil.isNotEmpty(list)) { - bak.setPst(1); - map.put(DataCleanEnum.DataFlicker.getCode() + "-" + DataCleanEnum.Pst.getCode(), list); - } - return map; - } - - public Map handleDataEvent(List result, PqDataVerifyBak bak, Integer timeInterval) { - Map map = new HashMap<>(); - Map> codeMap = result.stream().collect(Collectors.groupingBy(PqDataVerify::getIndexCode)); - //暂降事件 - List list = handleData(codeMap.get(DataCleanEnum.VoltageDip.getCode()), timeInterval); - if (CollUtil.isNotEmpty(list)) { - bak.setDip(1); - map.put(DataCleanEnum.RMpEventDetail.getCode() + "-" + DataCleanEnum.VoltageDip.getCode(), list); - } - //暂升事件 - List list2 = handleData(codeMap.get(DataCleanEnum.VoltageRise.getCode()), timeInterval); - if (CollUtil.isNotEmpty(list2)) { - bak.setRise(1); - map.put(DataCleanEnum.RMpEventDetail.getCode() + "-" + DataCleanEnum.VoltageRise.getCode(), list2); - } - return map; - } - - public List handleData(List list, Integer timeInterval) { - List dataList = new ArrayList<>(); - if (CollUtil.isNotEmpty(list)) { - AtomicInteger allCounts = new AtomicInteger(); - Set timeSet = new HashSet<>(); - DataCleanJsonDTO.DataHarmCleanJsonDTO dto = new DataCleanJsonDTO.DataHarmCleanJsonDTO(); - dto.setTargetName(list.get(0).getIndexName()); - List list1 = new ArrayList<>(); - Map> phaseMap = list.stream().collect(Collectors.groupingBy(PqDataVerify::getPhasicType)); - phaseMap.forEach((k, v) -> { - Map> map11 = v.stream().collect(Collectors.groupingBy(PqDataVerify::getValueType)); - map11.forEach((k2, v2) -> { - DataCleanJsonDTO.DataHarmCleanNormalJsonDTO dataCleanJsonDTO = new DataCleanJsonDTO.DataHarmCleanNormalJsonDTO(); - dataCleanJsonDTO.setPhasic(k); - dataCleanJsonDTO.setValueType(k2); - timeSet.addAll(v2.stream().map(dt -> dt.getTime().format(DateTimeFormatter.ofPattern(DatePattern.NORM_TIME_PATTERN))).collect(Collectors.toSet())); - //只取值最大的10组数据 - List topTen = v2.stream() - //过滤掉null元素 - .filter(Objects::nonNull) - .sorted(Comparator.comparing( - PqDataVerify::getAbnormalValue, - Comparator.nullsLast(Comparator.reverseOrder()))) - .limit(10) - .collect(Collectors.toList()); - dataCleanJsonDTO.setTime(topTen.stream().map(dt -> dt.getTime().format(DateTimeFormatter.ofPattern(DatePattern.NORM_TIME_PATTERN))).collect(Collectors.toList())); - dataCleanJsonDTO.setValue(topTen.stream() - .map(pq -> { - Double value = pq.getAbnormalValue(); - return value != null ? Math.round(value * 100) / 100.0 : null; - }) - .collect(Collectors.toList())); - dataCleanJsonDTO.setErrorCounts(v2.size()); - allCounts.set(allCounts.get() + v2.size()); - list1.add(dataCleanJsonDTO); - }); - dto.setErrorCounts(allCounts.get()); - dto.setErrorTimes(timeSet.size() * timeInterval); - dto.setMinValue(list.get(0).getMinValue()); - dto.setMaxValue(list.get(0).getMaxValue()); - dto.setList(list1); - }); - dataList.add(dto); - } - return dataList; - } - - public List handleHarmData(List list, Integer timeInterval) { - List dataList = new ArrayList<>(); - if (CollUtil.isNotEmpty(list)) { - AtomicInteger allCounts = new AtomicInteger(); - Set timeSet = new HashSet<>(); - Map> indexNameMap = list.stream().collect(Collectors.groupingBy(PqDataVerify::getIndexName)); - indexNameMap.forEach((k, v) -> { - DataCleanJsonDTO.DataHarmCleanJsonDTO dto = new DataCleanJsonDTO.DataHarmCleanJsonDTO(); - dto.setTargetName(k); - List dataCleanJsonDTOList = new ArrayList<>(); - Map> phaseMap = v.stream().collect(Collectors.groupingBy(PqDataVerify::getPhasicType)); - phaseMap.forEach((k2, v2) -> { - Map> valueMap = v2.stream().collect(Collectors.groupingBy(PqDataVerify::getValueType)); - valueMap.forEach((k3, v3) -> { - DataCleanJsonDTO.DataHarmCleanNormalJsonDTO dto1 = new DataCleanJsonDTO.DataHarmCleanNormalJsonDTO(); - dto1.setPhasic(k2); - dto1.setValueType(k3); - timeSet.addAll(v3.stream().map(dt -> dt.getTime().format(DateTimeFormatter.ofPattern(DatePattern.NORM_TIME_PATTERN))).collect(Collectors.toSet())); - //只取值最大的10组数据 - List topTen = v3.stream() - //过滤掉null元素 - .filter(Objects::nonNull) - .sorted(Comparator.comparing( - PqDataVerify::getAbnormalValue, - Comparator.nullsLast(Comparator.reverseOrder()))) - .limit(10) - .collect(Collectors.toList()); - dto1.setTime(topTen.stream().map(dt -> dt.getTime().format(DateTimeFormatter.ofPattern(DatePattern.NORM_TIME_PATTERN))).collect(Collectors.toList())); - dto1.setValue(topTen.stream() - .map(pq -> { - Double value = pq.getAbnormalValue(); - return value != null ? Math.round(value * 100) / 100.0 : null; - }) - .collect(Collectors.toList())); - dto1.setErrorCounts(v3.size()); - allCounts.set(allCounts.get() + v3.size()); - dataCleanJsonDTOList.add(dto1); - }); - dto.setErrorCounts(allCounts.get()); - dto.setErrorTimes(timeSet.size() * timeInterval); - dto.setList(dataCleanJsonDTOList); - }); - dataList.add(dto); - }); - } - return dataList; - } - @Override public void dataVCleanHandler(CalculatedParam calculatedParam) { MemorySizeUtil.getNowMemory(); @@ -1903,50 +1274,6 @@ public class DataCleanServiceImpl implements IDataCleanService { return list; } - /** - * 获取数据的标准范围,进行数据比对 - */ - public List judgeDataEvent(Map map, RmpEventDetailDTO dto, DictData dip, DictData rise) { - List list = new ArrayList<>(); - if (ObjectUtil.isNotNull(dip)) { - PqReasonableRangeDto pqReasonableRangeDto = map.get(DataCleanEnum.VoltageDip.getCode()); - if (ObjectUtil.isNotNull(dto.getFeatureAmplitude()) && dip.getId().equals(dto.getEventType())) { - if (dto.getFeatureAmplitude() < pqReasonableRangeDto.getMinValue() || dto.getFeatureAmplitude() > pqReasonableRangeDto.getMaxValue()) { - PqDataVerify pqDataVerify = getPqDataVerify(dto.getMeasurementPointId() - , dto.getStartTime().format(DateTimeFormatter.ofPattern(DatePattern.NORM_DATETIME_MS_PATTERN)) - , "Feature_Amplitude" - , "/" - , pqReasonableRangeDto.getIndexCode() - , pqReasonableRangeDto.getIndexName() - , pqReasonableRangeDto.getInfluxdbTableName() - , dto.getFeatureAmplitude() - , pqReasonableRangeDto.getMinValue() - , pqReasonableRangeDto.getMaxValue()); - list.add(pqDataVerify); - } - } - } - if (ObjectUtil.isNotNull(rise)) { - PqReasonableRangeDto pqReasonableRangeDto2 = map.get(DataCleanEnum.VoltageRise.getCode()); - if (ObjectUtil.isNotNull(dto.getFeatureAmplitude()) && rise.getId().equals(dto.getEventType())) { - if (dto.getFeatureAmplitude() < pqReasonableRangeDto2.getMinValue() || dto.getFeatureAmplitude() > pqReasonableRangeDto2.getMaxValue()) { - PqDataVerify pqDataVerify = getPqDataVerify(dto.getMeasurementPointId() - , dto.getStartTime().format(DateTimeFormatter.ofPattern(DatePattern.NORM_DATETIME_MS_PATTERN)) - , "Feature_Amplitude" - , "/" - , pqReasonableRangeDto2.getIndexCode() - , pqReasonableRangeDto2.getIndexName() - , pqReasonableRangeDto2.getInfluxdbTableName() - , dto.getFeatureAmplitude() - , pqReasonableRangeDto2.getMinValue() - , pqReasonableRangeDto2.getMaxValue()); - list.add(pqDataVerify); - } - } - } - return list; - } - public PqDataVerify getPqDataVerify(String lineId, String time, String valueType, String phasicType, String indexCode, String indexName, String indexTable, Double data, Double minValue, Double maxValue) { PqDataVerify pqDataVerify = new PqDataVerify(); diff --git a/algorithm/algorithm-boot/src/main/java/com/njcn/algorithm/serviceimpl/line/FlowAsyncServiceImpl.java b/algorithm/algorithm-boot/src/main/java/com/njcn/algorithm/serviceimpl/line/FlowAsyncServiceImpl.java new file mode 100644 index 0000000..bcca522 --- /dev/null +++ b/algorithm/algorithm-boot/src/main/java/com/njcn/algorithm/serviceimpl/line/FlowAsyncServiceImpl.java @@ -0,0 +1,1390 @@ +package com.njcn.algorithm.serviceimpl.line; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.date.DatePattern; +import cn.hutool.core.io.IoUtil; +import cn.hutool.core.util.CharsetUtil; +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.nacos.shaded.com.google.gson.Gson; +import com.njcn.algorithm.pojo.bo.CalculatedParam; +import com.njcn.algorithm.service.line.FlowAsyncService; +import com.njcn.dataProcess.api.*; +import com.njcn.dataProcess.dto.DataCleanJsonDTO; +import com.njcn.dataProcess.dto.RmpEventDetailDTO; +import com.njcn.dataProcess.enums.DataCleanEnum; +import com.njcn.dataProcess.param.LineCountEvaluateParam; +import com.njcn.dataProcess.pojo.dto.*; +import com.njcn.dataProcess.pojo.po.PqDataVerify; +import com.njcn.dataProcess.pojo.po.PqDataVerifyBak; +import com.njcn.dataProcess.pojo.po.PqDataVerifyCount; +import com.njcn.dataProcess.util.DataCommonUtils; +import com.njcn.dataProcess.util.TimeUtils; +import com.njcn.device.pq.pojo.vo.LineDetailVO; +import com.njcn.oss.constant.OssPath; +import com.njcn.oss.utils.FileStorageUtil; +import com.njcn.system.pojo.po.DictData; +import com.yomahub.liteflow.core.FlowExecutor; +import com.yomahub.liteflow.flow.LiteflowResponse; +import lombok.extern.slf4j.Slf4j; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.scheduling.annotation.Async; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.io.InputStream; +import java.lang.reflect.Method; +import java.time.LocalDate; +import java.time.format.DateTimeFormatter; +import java.util.*; +import java.util.concurrent.atomic.AtomicInteger; +import java.util.function.Function; +import java.util.stream.Collectors; + +import static com.njcn.algorithm.utils.MemorySizeUtil.dealResponse; + +/** + * @author wr + * @description + * @date 2025/12/16 17:43 + */ +@Slf4j +@Service +public class FlowAsyncServiceImpl implements FlowAsyncService { + + private static final Logger logger = LoggerFactory.getLogger(FlowAsyncServiceImpl.class); + + @Resource + private DataVFeignClient dataVFeignClient; + @Resource + private DataPltFeignClient dataPltFeignClient; + @Resource + private DataInharmVFeignClient dataInharmVFeignClient; + @Resource + private DataHarmRateVFeignClient dataHarmRateVFeignClient; + @Resource + private DataHarmpowerPFeignClient dataHarmpowerPFeignClient; + @Resource + private DataHarmphasicVFeignClient dataHarmphasicVFeignClient; + @Resource + private DataFlucFeignClient dataFlucFeignClient; + @Resource + private DataFlickerFeignClient dataFlickerFeignClient; + @Resource + private RmpEventDetailFeignClient rmpEventDetailFeignClient; + @Resource + private PqDataVerifyNewFeignClient pqDataVerifyNewFeignClient; + @Resource + private PqDataVerifyCountFeignClient pqDataVerifyCountFeignClient; + @Resource + private FileStorageUtil fileStorageUtil; + @Resource + private FlowExecutor flowExecutor; + + + + @Override + @Async("asyncExecutor") + public void execute2Resp(String methodDescribe, CalculatedParam calculatedParam) { + LiteflowResponse liteflowResponse = flowExecutor.execute2Resp("measurement_point", calculatedParam); + dealResponse(calculatedParam, liteflowResponse, methodDescribe); + } + + @Override + @Async("asyncExecutor") + public void lineDataClean(LineDetailVO.Detail line, Map> map, String dataDate,DictData dip,DictData rise,int size,int i) { + LineDetailVO.Detail item = line; + List> resultData = new ArrayList<>(); + Set allTimeSet = new HashSet<>(); + PqDataVerifyBak bak = new PqDataVerifyBak(); + bak.setLineId(item.getLineId()); + bak.setTime(LocalDate.parse(dataDate, DateTimeFormatter.ofPattern(DatePattern.NORM_DATE_PATTERN))); + LineCountEvaluateParam lineParam = new LineCountEvaluateParam(); + lineParam.setStartTime(TimeUtils.getBeginOfDay(dataDate)); + lineParam.setEndTime(TimeUtils.getEndOfDay(dataDate)); + lineParam.setLineId(Collections.singletonList(item.getLineId())); + //dataV + List data1 = dataVFeignClient.getRawData(lineParam).getData(); + //dataI +// List data2 = dataIFeignClient.getRawData(lineParam).getData(); + //dataPlt + List data3 = dataPltFeignClient.getRawData(lineParam).getData(); + //dataInHarmV + List data4 = dataInharmVFeignClient.getRawData(lineParam).getData(); + //dataHarmRateV + List data5 = dataHarmRateVFeignClient.getRawData(lineParam).getData(); + //dataHarmPowerP + List data6 = dataHarmpowerPFeignClient.getRawData(lineParam).getData(); + //dataHarmPhasicV + List data7 = dataHarmphasicVFeignClient.getRawData(lineParam).getData(); + //dataFluc + List data8 = dataFlucFeignClient.getRawData(lineParam).getData(); + //dataFlicker + List data9 = dataFlickerFeignClient.getRawData(lineParam).getData(); + //获取监测点的暂态事件 + List eventList = rmpEventDetailFeignClient.getRawData(lineParam).getData(); + + if (CollUtil.isNotEmpty(data1)) { + List result = new ArrayList<>(); + List list = map.get(DataCleanEnum.DataV.getCode()); + Map pqReasonableRangeDtoMap = list.stream().collect(Collectors.toMap(PqReasonableRangeDto::getIndexCode, Function.identity())); + data1.forEach(data -> { + List pqDataVerifies = judgeDataV(pqReasonableRangeDtoMap, item, data); + result.addAll(pqDataVerifies); + }); + if (CollUtil.isNotEmpty(result)) { + Map dtoMap = handleDataV(result, bak, item.getTimeInterval()); + Set timeSet = new HashSet<>(result.stream().map(dt -> dt.getTime().format(DateTimeFormatter.ofPattern(DatePattern.NORM_TIME_PATTERN))).collect(Collectors.toSet())); + dtoMap.put("errorTimes", timeSet.size() * item.getTimeInterval()); + allTimeSet.addAll(timeSet); + if (CollUtil.isNotEmpty(dtoMap)) { + resultData.add(dtoMap); + } + } + } + +// if (CollUtil.isNotEmpty(data2)) { +// List result = new ArrayList<>(); +// List list = map.get(DataCleanEnum.DataI.getCode()); +// Map pqReasonableRangeDtoMap = list.stream().collect(Collectors.toMap(PqReasonableRangeDto::getIndexCode, Function.identity())); +// data2.forEach(data -> { +// List pqDataVerifies = judgeDataI(pqReasonableRangeDtoMap, item, data); +// result.addAll(pqDataVerifies); +// }); +// if (CollUtil.isNotEmpty(result)) { +// Map dtoMap = handleDataI(result, bak, item.getTimeInterval()); +// Set timeSet = new HashSet<>(result.stream().map(dt -> dt.getTime().format(DateTimeFormatter.ofPattern(DatePattern.NORM_TIME_PATTERN))).collect(Collectors.toSet())); +// dtoMap.put("errorTimes", timeSet.size() * item.getTimeInterval()); +// allTimeSet.addAll(timeSet); +// if (CollUtil.isNotEmpty(dtoMap)) { +// resultData.add(dtoMap); +// } +// } +// } + + if (CollUtil.isNotEmpty(data3)) { + List result = new ArrayList<>(); + List list = map.get(DataCleanEnum.DataPlt.getCode()); + Map pqReasonableRangeDtoMap = list.stream().collect(Collectors.toMap(PqReasonableRangeDto::getIndexCode, Function.identity())); + data3.forEach(data -> { + List pqDataVerifies = judgeDataPlt(pqReasonableRangeDtoMap, data); + result.addAll(pqDataVerifies); + }); + if (CollUtil.isNotEmpty(result)) { + Map dtoMap = handleDataPlt(result, bak, item.getTimeInterval()); + Set timeSet = new HashSet<>(result.stream().map(dt -> dt.getTime().format(DateTimeFormatter.ofPattern(DatePattern.NORM_TIME_PATTERN))).collect(Collectors.toSet())); + dtoMap.put("errorTimes", timeSet.size() * item.getTimeInterval()); + allTimeSet.addAll(timeSet); + if (CollUtil.isNotEmpty(dtoMap)) { + resultData.add(dtoMap); + } + } + } + + if (CollUtil.isNotEmpty(data4)) { + List result = new ArrayList<>(); + List list = map.get(DataCleanEnum.DataInHarmV.getCode()); + Map pqReasonableRangeDtoMap = list.stream().collect(Collectors.toMap(PqReasonableRangeDto::getIndexCode, Function.identity())); + data4.forEach(data -> { + List pqDataVerifies = judgeDataInHarmV(pqReasonableRangeDtoMap, data); + result.addAll(pqDataVerifies); + }); + if (CollUtil.isNotEmpty(result)) { + Map dtoMap = handleInHarmV(result, bak, item.getTimeInterval()); + Set timeSet = new HashSet<>(result.stream().map(dt -> dt.getTime().format(DateTimeFormatter.ofPattern(DatePattern.NORM_TIME_PATTERN))).collect(Collectors.toSet())); + dtoMap.put("errorTimes", timeSet.size() * item.getTimeInterval()); + allTimeSet.addAll(timeSet); + if (CollUtil.isNotEmpty(dtoMap)) { + resultData.add(dtoMap); + } + } + } + + if (CollUtil.isNotEmpty(data5)) { + List result = new ArrayList<>(); + List list = map.get(DataCleanEnum.DataHarmRateV.getCode()); + Map pqReasonableRangeDtoMap = list.stream().collect(Collectors.toMap(PqReasonableRangeDto::getIndexCode, Function.identity())); + data5.forEach(data -> { + List pqDataVerifies = judgeDataHarmRateV(pqReasonableRangeDtoMap, data); + result.addAll(pqDataVerifies); + }); + if (CollUtil.isNotEmpty(result)) { + Map dtoMap = handleHarmRateV(result, bak, item.getTimeInterval()); + Set timeSet = new HashSet<>(result.stream().map(dt -> dt.getTime().format(DateTimeFormatter.ofPattern(DatePattern.NORM_TIME_PATTERN))).collect(Collectors.toSet())); + dtoMap.put("errorTimes", timeSet.size() * item.getTimeInterval()); + allTimeSet.addAll(timeSet); + if (CollUtil.isNotEmpty(dtoMap)) { + resultData.add(dtoMap); + } + } + } + + if (CollUtil.isNotEmpty(data6)) { + List result = new ArrayList<>(); + List list = map.get(DataCleanEnum.DataHarmPowerP.getCode()); + Map pqReasonableRangeDtoMap = list.stream().collect(Collectors.toMap(PqReasonableRangeDto::getIndexCode, Function.identity())); + data6.forEach(data -> { + List pqDataVerifies = judgeDataHarmPowerP(pqReasonableRangeDtoMap, data); + result.addAll(pqDataVerifies); + }); + if (CollUtil.isNotEmpty(result)) { + Map dtoMap = handleHarmPowerP(result, bak, item.getTimeInterval()); + Set timeSet = new HashSet<>(result.stream().map(dt -> dt.getTime().format(DateTimeFormatter.ofPattern(DatePattern.NORM_TIME_PATTERN))).collect(Collectors.toSet())); + dtoMap.put("errorTimes", timeSet.size() * item.getTimeInterval()); + allTimeSet.addAll(timeSet); + if (CollUtil.isNotEmpty(dtoMap)) { + resultData.add(dtoMap); + } + } + } + + if (CollUtil.isNotEmpty(data7)) { + List result = new ArrayList<>(); + List list = map.get(DataCleanEnum.DataHarmPhasicV.getCode()); + Map pqReasonableRangeDtoMap = list.stream().collect(Collectors.toMap(PqReasonableRangeDto::getIndexCode, Function.identity())); + data7.forEach(data -> { + List pqDataVerifies = judgeDataHarmPhasicV(pqReasonableRangeDtoMap, data); + result.addAll(pqDataVerifies); + }); + if (CollUtil.isNotEmpty(result)) { + Map dtoMap = handleHarmPhasicV(result, bak, item.getTimeInterval()); + Set timeSet = new HashSet<>(result.stream().map(dt -> dt.getTime().format(DateTimeFormatter.ofPattern(DatePattern.NORM_TIME_PATTERN))).collect(Collectors.toSet())); + dtoMap.put("errorTimes", timeSet.size() * item.getTimeInterval()); + allTimeSet.addAll(timeSet); + if (CollUtil.isNotEmpty(dtoMap)) { + resultData.add(dtoMap); + } + } + } + + if (CollUtil.isNotEmpty(data8)) { + List result = new ArrayList<>(); + List list = map.get(DataCleanEnum.DataFluc.getCode()); + Map pqReasonableRangeDtoMap = list.stream().collect(Collectors.toMap(PqReasonableRangeDto::getIndexCode, Function.identity())); + data8.forEach(data -> { + List pqDataVerifies = judgeDataFluc(pqReasonableRangeDtoMap, data); + result.addAll(pqDataVerifies); + }); + if (CollUtil.isNotEmpty(result)) { + Map dtoMap = handleDataFluc(result, bak, item.getTimeInterval()); + Set timeSet = new HashSet<>(result.stream().map(dt -> dt.getTime().format(DateTimeFormatter.ofPattern(DatePattern.NORM_TIME_PATTERN))).collect(Collectors.toSet())); + dtoMap.put("errorTimes", timeSet.size() * item.getTimeInterval()); + allTimeSet.addAll(timeSet); + if (CollUtil.isNotEmpty(dtoMap)) { + resultData.add(dtoMap); + } + } + } + + if (CollUtil.isNotEmpty(data9)) { + List result = new ArrayList<>(); + List list = map.get(DataCleanEnum.DataFlicker.getCode()); + Map pqReasonableRangeDtoMap = list.stream().collect(Collectors.toMap(PqReasonableRangeDto::getIndexCode, Function.identity())); + data9.forEach(data -> { + List pqDataVerifies = judgeDataFlicker(pqReasonableRangeDtoMap, data); + result.addAll(pqDataVerifies); + }); + if (CollUtil.isNotEmpty(result)) { + Map dtoMap = handleDataFlicker(result, bak, item.getTimeInterval()); + Set timeSet = new HashSet<>(result.stream().map(dt -> dt.getTime().format(DateTimeFormatter.ofPattern(DatePattern.NORM_TIME_PATTERN))).collect(Collectors.toSet())); + dtoMap.put("errorTimes", timeSet.size() * item.getTimeInterval()); + allTimeSet.addAll(timeSet); + if (CollUtil.isNotEmpty(dtoMap)) { + resultData.add(dtoMap); + } + } + } + + if (CollUtil.isNotEmpty(eventList)) { + List result = new ArrayList<>(); + List list = map.get(DataCleanEnum.RMpEventDetail.getCode()); + Map pqReasonableRangeDtoMap = list.stream().collect(Collectors.toMap(PqReasonableRangeDto::getIndexCode, Function.identity())); + eventList.forEach(data -> { + data.setFeatureAmplitude(data.getFeatureAmplitude() * 100.0); + List pqDataVerifies = judgeDataEvent(pqReasonableRangeDtoMap, data, dip, rise); + result.addAll(pqDataVerifies); + }); + if (CollUtil.isNotEmpty(result)) { + Map dtoMap = handleDataEvent(result, bak, item.getTimeInterval()); + Set timeSet = new HashSet<>(result.stream().map(dt -> dt.getTime().format(DateTimeFormatter.ofPattern(DatePattern.NORM_TIME_PATTERN))).collect(Collectors.toSet())); + dtoMap.put("errorTimes", timeSet.size() * item.getTimeInterval()); + allTimeSet.addAll(timeSet); + if (CollUtil.isNotEmpty(dtoMap)) { + resultData.add(dtoMap); + } + } + } + + if (CollUtil.isNotEmpty(allTimeSet)) { + PqDataVerifyCount verifyCount = new PqDataVerifyCount(); + verifyCount.setLineId(item.getLineId()); + verifyCount.setTime(LocalDate.parse(dataDate, DateTimeFormatter.ofPattern(DatePattern.NORM_DATE_PATTERN))); + verifyCount.setTotalAll(data1.size()); + verifyCount.setFlickerAll(data9.size()); + + List dataV = data1.stream() + .filter(item1 -> allTimeSet.contains(item1.getMinTime().substring(11, 19))) + .collect(Collectors.toList()); + if (CollUtil.isNotEmpty(dataV)) { + verifyCount.setTotal(dataV.size()); +// dataV.forEach(item1-> item1.setAbnormalFlag(1)); +// dataVFeignClient.addInfluxDbList(dataV); + } +// List dataI = data2.stream() +// .filter(item1 -> allTimeSet.contains(item1.getMinTime().substring(11, 19))) +// .collect(Collectors.toList()); +// if (CollUtil.isNotEmpty(dataI)) { +// dataI.forEach(item1-> item1.setAbnormalFlag(1)); +// dataIFeignClient.addInfluxDbList(dataI); +// } +// List dataPlt = data3.stream() +// .filter(item1 -> allTimeSet.contains(item1.getMinTime().substring(11, 19))) +// .collect(Collectors.toList()); +// if (CollUtil.isNotEmpty(dataPlt)) { +// dataPlt.forEach(item1-> item1.setAbnormalFlag(1)); +// dataPltFeignClient.addInfluxDbList(dataPlt); +// } +// List dataInHarmV = data4.stream() +// .filter(item1 -> allTimeSet.contains(item1.getMinTime().substring(11, 19))) +// .collect(Collectors.toList()); +// if (CollUtil.isNotEmpty(dataInHarmV)) { +// dataInHarmV.forEach(item1-> item1.setAbnormalFlag(1)); +// dataInharmVFeignClient.addInfluxDbList(dataInHarmV); +// } +// List dataHarmRateV = data5.stream() +// .filter(item1 -> allTimeSet.contains(item1.getMinTime().substring(11, 19))) +// .collect(Collectors.toList()); +// if (CollUtil.isNotEmpty(dataHarmRateV)) { +// dataHarmRateV.forEach(item1-> item1.setAbnormalFlag(1)); +// dataHarmRateVFeignClient.addInfluxDbList(dataHarmRateV); +// } +// List dataHarmPowerP = data6.stream() +// .filter(item1 -> allTimeSet.contains(item1.getMinTime().substring(11, 19))) +// .collect(Collectors.toList()); +// if (CollUtil.isNotEmpty(dataHarmPowerP)) { +// dataHarmPowerP.forEach(item1-> item1.setAbnormalFlag(1)); +// dataHarmpowerPFeignClient.addInfluxDbList(dataHarmPowerP); +// } +// List dataHarmPhasicV = data7.stream() +// .filter(item1 -> allTimeSet.contains(item1.getMinTime().substring(11, 19))) +// .collect(Collectors.toList()); +// if (CollUtil.isNotEmpty(dataHarmPhasicV)) { +// dataHarmPhasicV.forEach(item1-> item1.setAbnormalFlag(1)); +// dataHarmphasicVFeignClient.addInfluxDbList(dataHarmPhasicV); +// } +// List dataFluc = data8.stream() +// .filter(item1 -> allTimeSet.contains(item1.getMinTime().substring(11, 19))) +// .collect(Collectors.toList()); +// if (CollUtil.isNotEmpty(dataFluc)) { +// dataFluc.forEach(item1-> item1.setAbnormalFlag(1)); +// dataFlucFeignClient.addInfluxDbList(dataFluc); +// } + List dataFlicker = data9.stream() + .filter(item1 -> allTimeSet.contains(item1.getMinTime().substring(11, 19))) + .collect(Collectors.toList()); + if (CollUtil.isNotEmpty(dataFlicker)) { + verifyCount.setFlicker(dataFlicker.size()); +// dataFlicker.forEach(item1-> item1.setAbnormalFlag(1)); +// dataFlickerFeignClient.addInfluxDbList(dataFlicker); + } + pqDataVerifyCountFeignClient.insertData(verifyCount); + Map dtoMap = new HashMap<>(1); + dtoMap.put("lineErrorTimes", allTimeSet.size() * item.getTimeInterval()); + resultData.add(dtoMap); + } + + if (CollUtil.isNotEmpty(resultData)) { + bak.setState(1); + //存储文件 + InputStream reportStream = IoUtil.toStream(new Gson().toJson(resultData), CharsetUtil.UTF_8); + String fileName = fileStorageUtil.uploadStreamSpecifyName( + reportStream + , OssPath.DATA_CLEAN + dataDate + "/" + , item.getLineId() + ".txt"); + //存储数据 + bak.setFilePath(fileName); + } + pqDataVerifyNewFeignClient.insertData(bak); + resultData=null; + logger.info( dataDate+"总数据:" + size + "=====》当前第" + i+"已完成!"); + System.gc(); + } + + /** + * 获取数据的标准范围,进行数据比对 + */ + public List judgeDataV(Map map, LineDetailVO.Detail line, DataVDto dto) { + List list = new ArrayList<>(); + PqReasonableRangeDto pqReasonableRangeDto; + List phaseList; + //频率判断 + pqReasonableRangeDto = map.get(DataCleanEnum.Freq.getCode()); + phaseList = Arrays.asList(pqReasonableRangeDto.getPhaseType().split(",")); + if (phaseList.contains(dto.getPhasicType())) { + if (ObjectUtil.isNotNull(dto.getFreq())) { + if (dto.getFreq() < pqReasonableRangeDto.getMinValue() || dto.getFreq() > pqReasonableRangeDto.getMaxValue()) { + //log.info("dataV-频率数据异常,已清洗!数据值:{},数据时间:{}", dto.getFreq(), dto.getMinTime()); + PqDataVerify pqDataVerify = getPqDataVerify(dto.getLineId() + , dto.getMinTime() + , dto.getValueType() + , dto.getPhasicType() + , pqReasonableRangeDto.getIndexCode() + , pqReasonableRangeDto.getIndexName() + , pqReasonableRangeDto.getInfluxdbTableName() + , dto.getFreq() + , pqReasonableRangeDto.getMinValue() + , pqReasonableRangeDto.getMaxValue()); + list.add(pqDataVerify); + } + } else { + logger.info("freq{}", dto); + } + } + + //频率偏差判断 + pqReasonableRangeDto = map.get(DataCleanEnum.FreqDev.getCode()); + phaseList = Arrays.asList(pqReasonableRangeDto.getPhaseType().split(",")); + if (phaseList.contains(dto.getPhasicType())) { + if (ObjectUtil.isNotNull(dto.getFreqDev())) { + if (dto.getFreqDev() < pqReasonableRangeDto.getMinValue() || dto.getFreqDev() > pqReasonableRangeDto.getMaxValue()) { + //log.info("dataV-频率偏差数据异常,已清洗!数据值:{},数据时间:{}", dto.getFreqDev(), dto.getMinTime()); + PqDataVerify pqDataVerify = getPqDataVerify(dto.getLineId() + , dto.getMinTime() + , dto.getValueType() + , dto.getPhasicType() + , pqReasonableRangeDto.getIndexCode() + , pqReasonableRangeDto.getIndexName() + , pqReasonableRangeDto.getInfluxdbTableName() + , dto.getFreqDev() + , pqReasonableRangeDto.getMinValue() + , pqReasonableRangeDto.getMaxValue()); + list.add(pqDataVerify); + } + } else { + logger.info("freqDev{}", dto); + } + } + + //相电压有效值 判断接线方式 (0-星型 1-角型 2-V型) 星型是相电压 角型或者v型是线电压 + //0:星型接法;1:三角型接法;2:开口三角型接法 + if (ObjectUtil.isNotNull(line.getPtType()) && line.getPtType() == 0) { + pqReasonableRangeDto = map.get(DataCleanEnum.RmsV.getCode()); + phaseList = Arrays.asList(pqReasonableRangeDto.getPhaseType().split(",")); + if (phaseList.contains(dto.getPhasicType())) { + if (ObjectUtil.isNotNull(dto.getRms())) { + if (dto.getRms() < (pqReasonableRangeDto.getMinValue() / 100.0 * DataCommonUtils.getVoltageData(line.getVoltageLevel())) + || dto.getRms() > (pqReasonableRangeDto.getMaxValue() / 100.0 * DataCommonUtils.getVoltageData(line.getVoltageLevel()))) { + //log.info("dataV-相电压有效值数据异常,已清洗!数据值:{},数据时间:{}", dto.getRms(), dto.getMinTime()); + PqDataVerify pqDataVerify = getPqDataVerify(dto.getLineId() + , dto.getMinTime() + , dto.getValueType() + , dto.getPhasicType() + , pqReasonableRangeDto.getIndexCode() + , pqReasonableRangeDto.getIndexName() + , pqReasonableRangeDto.getInfluxdbTableName() + , dto.getRms() + , pqReasonableRangeDto.getMinValue() * DataCommonUtils.getVoltageData(line.getVoltageLevel()) + , pqReasonableRangeDto.getMaxValue() * DataCommonUtils.getVoltageData(line.getVoltageLevel())); + list.add(pqDataVerify); + } + } else { + logger.info("rmsV{}", dto); + } + } + } + + //正序电压 + pqReasonableRangeDto = map.get(DataCleanEnum.VPos.getCode()); + phaseList = Arrays.asList(pqReasonableRangeDto.getPhaseType().split(",")); + if (phaseList.contains(dto.getPhasicType())) { + if (ObjectUtil.isNotNull(dto.getVPos())) { + if (dto.getVPos() < (pqReasonableRangeDto.getMinValue() / 100.0 * DataCommonUtils.getVoltageData(line.getVoltageLevel())) + || dto.getVPos() > (pqReasonableRangeDto.getMaxValue() / 100.0 * DataCommonUtils.getVoltageData(line.getVoltageLevel()))) { + //log.info("dataV-正序电压数据异常,已清洗!数据值:{},数据时间:{}", dto.getVPos(), dto.getMinTime()); + PqDataVerify pqDataVerify = getPqDataVerify(dto.getLineId() + , dto.getMinTime() + , dto.getValueType() + , dto.getPhasicType() + , pqReasonableRangeDto.getIndexCode() + , pqReasonableRangeDto.getIndexName() + , pqReasonableRangeDto.getInfluxdbTableName() + , dto.getVPos() + , pqReasonableRangeDto.getMinValue() * DataCommonUtils.getVoltageData(line.getVoltageLevel()) + , pqReasonableRangeDto.getMaxValue() * DataCommonUtils.getVoltageData(line.getVoltageLevel())); + list.add(pqDataVerify); + } + } else { + logger.info("vPos{}", dto); + } + } + + //负序电压 + pqReasonableRangeDto = map.get(DataCleanEnum.VNeg.getCode()); + phaseList = Arrays.asList(pqReasonableRangeDto.getPhaseType().split(",")); + if (phaseList.contains(dto.getPhasicType())) { + if (ObjectUtil.isNotNull(dto.getVNeg())) { + if (dto.getVNeg() < (pqReasonableRangeDto.getMinValue() * DataCommonUtils.getVoltageData(line.getVoltageLevel())) + || dto.getVNeg() > (pqReasonableRangeDto.getMaxValue() * DataCommonUtils.getVoltageData(line.getVoltageLevel()))) { + //log.info("dataV-负序电压数据异常,已清洗!数据值:{},数据时间:{}", dto.getVNeg(), dto.getMinTime()); + PqDataVerify pqDataVerify = getPqDataVerify(dto.getLineId() + , dto.getMinTime() + , dto.getValueType() + , dto.getPhasicType() + , pqReasonableRangeDto.getIndexCode() + , pqReasonableRangeDto.getIndexName() + , pqReasonableRangeDto.getInfluxdbTableName() + , dto.getVNeg() + , pqReasonableRangeDto.getMinValue() * DataCommonUtils.getVoltageData(line.getVoltageLevel()) + , pqReasonableRangeDto.getMaxValue() * DataCommonUtils.getVoltageData(line.getVoltageLevel())); + list.add(pqDataVerify); + } + } else { + logger.info("vNeg{}", dto); + } + } + + //零序电压 + pqReasonableRangeDto = map.get(DataCleanEnum.VZero.getCode()); + phaseList = Arrays.asList(pqReasonableRangeDto.getPhaseType().split(",")); + if (phaseList.contains(dto.getPhasicType())) { + if (ObjectUtil.isNotNull(dto.getVZero())) { + if (dto.getVZero() < (pqReasonableRangeDto.getMinValue() * DataCommonUtils.getVoltageData(line.getVoltageLevel())) + || dto.getVZero() > (pqReasonableRangeDto.getMaxValue() * DataCommonUtils.getVoltageData(line.getVoltageLevel()))) { + //log.info("dataV-零序电压数据异常,已清洗!数据值:{},数据时间:{}", dto.getVZero(), dto.getMinTime()); + PqDataVerify pqDataVerify = getPqDataVerify(dto.getLineId() + , dto.getMinTime() + , dto.getValueType() + , dto.getPhasicType() + , pqReasonableRangeDto.getIndexCode() + , pqReasonableRangeDto.getIndexName() + , pqReasonableRangeDto.getInfluxdbTableName() + , dto.getVZero() + , pqReasonableRangeDto.getMinValue() * DataCommonUtils.getVoltageData(line.getVoltageLevel()) + , pqReasonableRangeDto.getMaxValue() * DataCommonUtils.getVoltageData(line.getVoltageLevel())); + list.add(pqDataVerify); + } + } else { + logger.info("vZero{}", dto); + } + } + + //电压不平衡度 + pqReasonableRangeDto = map.get(DataCleanEnum.VUnbalance.getCode()); + phaseList = Arrays.asList(pqReasonableRangeDto.getPhaseType().split(",")); + if (phaseList.contains(dto.getPhasicType())) { + if (ObjectUtil.isNotNull(dto.getVUnbalance())) { + if (dto.getVUnbalance() < pqReasonableRangeDto.getMinValue() || dto.getVUnbalance() > pqReasonableRangeDto.getMaxValue()) { + //log.info("dataV-电压不平衡度数据异常,已清洗!数据值:{},数据时间:{}", dto.getVUnbalance(), dto.getMinTime()); + PqDataVerify pqDataVerify = getPqDataVerify(dto.getLineId() + , dto.getMinTime() + , dto.getValueType() + , dto.getPhasicType() + , pqReasonableRangeDto.getIndexCode() + , pqReasonableRangeDto.getIndexName() + , pqReasonableRangeDto.getInfluxdbTableName() + , dto.getVUnbalance() + , pqReasonableRangeDto.getMinValue() + , pqReasonableRangeDto.getMaxValue()); + list.add(pqDataVerify); + } + } else { + logger.info("vUnbalance{}", dto); + } + } + + //线电压有效值 判断接线方式 (0-星型 1-角型 2-V型) 星型是相电压 角型或者v型是线电压 + //0:星型接法;1:三角型接法;2:开口三角型接法 + if (ObjectUtil.isNotNull(line.getPtType()) && line.getPtType() != 0) { + pqReasonableRangeDto = map.get(DataCleanEnum.RmsLvr.getCode()); + phaseList = Arrays.asList(pqReasonableRangeDto.getPhaseType().split(",")); + if (phaseList.contains(dto.getPhasicType()) && ObjectUtil.isNotNull(dto.getRmsLvr())) { + if (dto.getRmsLvr() < (pqReasonableRangeDto.getMinValue() / 100.0 * DataCommonUtils.getVoltageData(line.getVoltageLevel())) + || dto.getRmsLvr() > (pqReasonableRangeDto.getMaxValue() / 100.0 * DataCommonUtils.getVoltageData(line.getVoltageLevel()))) { + //log.info("dataV-线电压有效值数据异常,已清洗!数据值:{},数据时间:{}", dto.getRmsLvr(), dto.getMinTime()); + PqDataVerify pqDataVerify = getPqDataVerify(dto.getLineId() + , dto.getMinTime() + , dto.getValueType() + , dto.getPhasicType() + , pqReasonableRangeDto.getIndexCode() + , pqReasonableRangeDto.getIndexName() + , pqReasonableRangeDto.getInfluxdbTableName() + , dto.getRmsLvr() + , pqReasonableRangeDto.getMinValue() * DataCommonUtils.getVoltageData(line.getVoltageLevel()) + , pqReasonableRangeDto.getMaxValue() * DataCommonUtils.getVoltageData(line.getVoltageLevel())); + list.add(pqDataVerify); + } + } + } + + //电压偏差 + //电压偏差分为正偏差和负偏差,目前正负偏差都存储在vu_dev字段中,如果vu_dev>=0为正偏差数值,如果vu_dev<0为负偏差数值 + if (ObjectUtil.isNotNull(dto.getVuDev())) { + if (dto.getVuDev() >= 0) { + pqReasonableRangeDto = map.get(DataCleanEnum.VuDev.getCode()); + phaseList = Arrays.asList(pqReasonableRangeDto.getPhaseType().split(",")); + if (phaseList.contains(dto.getPhasicType())) { + if (dto.getVuDev() > pqReasonableRangeDto.getMaxValue()) { + //log.info("dataV-线电压正偏差数据异常,已清洗!数据值:{},数据时间:{}", dto.getVuDev(), dto.getMinTime()); + PqDataVerify pqDataVerify = getPqDataVerify(dto.getLineId() + , dto.getMinTime() + , dto.getValueType() + , dto.getPhasicType() + , pqReasonableRangeDto.getIndexCode() + , pqReasonableRangeDto.getIndexName() + , pqReasonableRangeDto.getInfluxdbTableName() + , dto.getVuDev() + , pqReasonableRangeDto.getMinValue() + , pqReasonableRangeDto.getMaxValue()); + list.add(pqDataVerify); + } + } + } else { + pqReasonableRangeDto = map.get(DataCleanEnum.VlDev.getCode()); + phaseList = Arrays.asList(pqReasonableRangeDto.getPhaseType().split(",")); + if (phaseList.contains(dto.getPhasicType())) { + if (dto.getVuDev() < pqReasonableRangeDto.getMinValue()) { + //log.info("dataV-线电压负偏差数据异常,已清洗!数据值:{},数据时间:{}", dto.getVlDev(), dto.getMinTime()); + PqDataVerify pqDataVerify = getPqDataVerify(dto.getLineId() + , dto.getMinTime() + , dto.getValueType() + , dto.getPhasicType() + , pqReasonableRangeDto.getIndexCode() + , pqReasonableRangeDto.getIndexName() + , pqReasonableRangeDto.getInfluxdbTableName() + , dto.getVuDev() + , pqReasonableRangeDto.getMinValue() + , pqReasonableRangeDto.getMaxValue()); + list.add(pqDataVerify); + } + } + } + } else { + logger.info("vuDev{}", dto); + } + +// //线电压正偏差 +// pqReasonableRangeDto = map.get(DataCleanEnum.VuDev.getCode()); +// phaseList = Arrays.asList(pqReasonableRangeDto.getPhaseType().split(",")); +// if (phaseList.contains(dto.getPhasicType())) { +// if (dto.getVuDev() < pqReasonableRangeDto.getMinValue() || dto.getVuDev() > pqReasonableRangeDto.getMaxValue()) { +// //log.info("dataV-线电压正偏差数据异常,已清洗!数据值:{},数据时间:{}", dto.getVuDev(), dto.getMinTime()); +// PqDataVerify pqDataVerify = getPqDataVerify(dto.getLineId() +// ,dto.getMinTime() +// ,dto.getValueType() +// ,dto.getPhasicType() +// ,pqReasonableRangeDto.getIndexCode() +// ,pqReasonableRangeDto.getIndexName() +// ,pqReasonableRangeDto.getInfluxdbTableName() +// ,dto.getVuDev() +// ,pqReasonableRangeDto.getMinValue() +// ,pqReasonableRangeDto.getMaxValue()); +// list.add(pqDataVerify); +// } +// } +// +// //线电压负偏差 +// pqReasonableRangeDto = map.get(DataCleanEnum.VlDev.getCode()); +// phaseList = Arrays.asList(pqReasonableRangeDto.getPhaseType().split(",")); +// if (phaseList.contains(dto.getPhasicType())) { +// if (dto.getVlDev() < pqReasonableRangeDto.getMinValue() || dto.getVlDev() > pqReasonableRangeDto.getMaxValue()) { +// //log.info("dataV-线电压负偏差数据异常,已清洗!数据值:{},数据时间:{}", dto.getVlDev(), dto.getMinTime()); +// PqDataVerify pqDataVerify = getPqDataVerify(dto.getLineId() +// ,dto.getMinTime() +// ,dto.getValueType() +// ,dto.getPhasicType() +// ,pqReasonableRangeDto.getIndexCode() +// ,pqReasonableRangeDto.getIndexName() +// ,pqReasonableRangeDto.getInfluxdbTableName() +// ,dto.getVlDev() +// ,pqReasonableRangeDto.getMinValue() +// ,pqReasonableRangeDto.getMaxValue()); +// list.add(pqDataVerify); +// } +// } + + //电压总谐波畸变率 + pqReasonableRangeDto = map.get(DataCleanEnum.VThd.getCode()); + phaseList = Arrays.asList(pqReasonableRangeDto.getPhaseType().split(",")); + if (phaseList.contains(dto.getPhasicType())) { + if (ObjectUtil.isNotNull(dto.getVThd())) { + if (dto.getVThd() < pqReasonableRangeDto.getMinValue() || dto.getVThd() > pqReasonableRangeDto.getMaxValue()) { + //log.info("dataV-电压总谐波畸变率数据异常,已清洗!数据值:{},数据时间:{}", dto.getVThd(), dto.getMinTime()); + PqDataVerify pqDataVerify = getPqDataVerify(dto.getLineId() + , dto.getMinTime() + , dto.getValueType() + , dto.getPhasicType() + , pqReasonableRangeDto.getIndexCode() + , pqReasonableRangeDto.getIndexName() + , pqReasonableRangeDto.getInfluxdbTableName() + , dto.getVThd() + , pqReasonableRangeDto.getMinValue() + , pqReasonableRangeDto.getMaxValue()); + list.add(pqDataVerify); + } + } else { + logger.info("vThd{}", dto); + } + } + + //相(线)电压基波有效值 + pqReasonableRangeDto = map.get(DataCleanEnum.V_Data.getCode()); + phaseList = Arrays.asList(pqReasonableRangeDto.getPhaseType().split(",")); + if (phaseList.contains(dto.getPhasicType())) { + if (ObjectUtil.isNotNull(dto.getV1())) { + if (dto.getV1() < (pqReasonableRangeDto.getMinValue() / 100.0 * DataCommonUtils.getVoltageData(line.getVoltageLevel())) + || dto.getV1() > (pqReasonableRangeDto.getMaxValue() / 100.0 * DataCommonUtils.getVoltageData(line.getVoltageLevel()))) { + //log.info("dataV-基波电压数据异常,已清洗!数据值:{},数据时间:{}", dto.getV1(), dto.getMinTime()); + PqDataVerify pqDataVerify = getPqDataVerify(dto.getLineId() + , dto.getMinTime() + , dto.getValueType() + , dto.getPhasicType() + , pqReasonableRangeDto.getIndexCode() + , pqReasonableRangeDto.getIndexName() + , pqReasonableRangeDto.getInfluxdbTableName() + , dto.getV1() + , pqReasonableRangeDto.getMinValue() * DataCommonUtils.getVoltageData(line.getVoltageLevel()) + , pqReasonableRangeDto.getMaxValue() * DataCommonUtils.getVoltageData(line.getVoltageLevel())); + list.add(pqDataVerify); + } + } else { + logger.info("vData{}", dto); + } + } + return list; + } + + /** + * 获取数据的标准范围,进行数据比对 + */ + public List judgeDataI(Map map, LineDetailVO.Detail line, DataIDto dto) { + List list = new ArrayList<>(); + PqReasonableRangeDto pqReasonableRangeDto; + List phaseList; + //电流有效值 + pqReasonableRangeDto = map.get(DataCleanEnum.RmsI.getCode()); + phaseList = Arrays.asList(pqReasonableRangeDto.getPhaseType().split(",")); + if (phaseList.contains(dto.getPhasicType())) { + if (ObjectUtil.isNotNull(dto.getRms())) { + if (dto.getRms() < pqReasonableRangeDto.getMinValue() || dto.getRms() > pqReasonableRangeDto.getMaxValue()) { + PqDataVerify pqDataVerify = getPqDataVerify(dto.getLineId() + , dto.getMinTime() + , dto.getValueType() + , dto.getPhasicType() + , pqReasonableRangeDto.getIndexCode() + , pqReasonableRangeDto.getIndexName() + , pqReasonableRangeDto.getInfluxdbTableName() + , dto.getRms() + , pqReasonableRangeDto.getMinValue() + , line.getCT1()); + list.add(pqDataVerify); + } + } else { + logger.info("rmsI{}", dto); + } + } + return list; + } + + /** + * 获取数据的标准范围,进行数据比对 + */ + public List judgeDataPlt(Map map, DataPltDto dto) { + List list = new ArrayList<>(); + PqReasonableRangeDto pqReasonableRangeDto; + List phaseList; + //线电压有效值 + pqReasonableRangeDto = map.get(DataCleanEnum.Plt.getCode()); + phaseList = Arrays.asList(pqReasonableRangeDto.getPhaseType().split(",")); + if (phaseList.contains(dto.getPhasicType())) { + if (ObjectUtil.isNotNull(dto.getPlt())) { + if (dto.getPlt() < pqReasonableRangeDto.getMinValue() || dto.getPlt() > pqReasonableRangeDto.getMaxValue()) { + PqDataVerify pqDataVerify = getPqDataVerify(dto.getLineId() + , dto.getMinTime() + , dto.getValueType() + , dto.getPhasicType() + , pqReasonableRangeDto.getIndexCode() + , pqReasonableRangeDto.getIndexName() + , pqReasonableRangeDto.getInfluxdbTableName() + , dto.getPlt() + , pqReasonableRangeDto.getMinValue() + , pqReasonableRangeDto.getMaxValue()); + list.add(pqDataVerify); + } + } else { + logger.info("plt{}", dto); + } + } + return list; + } + + /** + * 获取数据的标准范围,进行数据比对 + */ + public List judgeDataInHarmV(Map map, DataHarmDto dto) { + List list = new ArrayList<>(); + PqReasonableRangeDto pqReasonableRangeDto = map.get(DataCleanEnum.V_InHarm.getCode()); + List phaseList = Arrays.asList(pqReasonableRangeDto.getPhaseType().split(",")); + if (phaseList.contains(dto.getPhasicType())) { + // 50次谐波 + for (int i = 1; i <= 50; i++) { + // 通过反射获取dto.getV(i)的值 + Double vValue = getVValue(dto, i); + if (ObjectUtil.isNotNull(vValue)) { + if (vValue < pqReasonableRangeDto.getMinValue() || vValue > pqReasonableRangeDto.getMaxValue()) { + PqDataVerify pqDataVerify = getPqDataVerify( + dto.getLineId(), + dto.getMinTime(), + dto.getValueType(), + dto.getPhasicType(), + pqReasonableRangeDto.getIndexCode(), + (i - 0.5) + pqReasonableRangeDto.getIndexName(), + pqReasonableRangeDto.getInfluxdbTableName(), + vValue, + pqReasonableRangeDto.getMinValue(), + pqReasonableRangeDto.getMaxValue() + ); + list.add(pqDataVerify); + } + } + } + } + return list; + } + + /** + * 获取数据的标准范围,进行数据比对 + */ + public List judgeDataHarmRateV(Map map, DataHarmDto dto) { + List list = new ArrayList<>(); + PqReasonableRangeDto pqReasonableRangeDto = map.get(DataCleanEnum.V_Rate.getCode()); + List phaseList = Arrays.asList(pqReasonableRangeDto.getPhaseType().split(",")); + if (phaseList.contains(dto.getPhasicType())) { + // 50次谐波 + for (int i = 2; i <= 50; i++) { + // 通过反射获取dto.getV(i)的值 + Double vValue = getVValue(dto, i); + if (ObjectUtil.isNotNull(vValue)) { + if (vValue < pqReasonableRangeDto.getMinValue() || vValue > pqReasonableRangeDto.getMaxValue()) { + PqDataVerify pqDataVerify = getPqDataVerify( + dto.getLineId(), + dto.getMinTime(), + dto.getValueType(), + dto.getPhasicType(), + pqReasonableRangeDto.getIndexCode(), + i + pqReasonableRangeDto.getIndexName(), + pqReasonableRangeDto.getInfluxdbTableName(), + vValue, + pqReasonableRangeDto.getMinValue(), + pqReasonableRangeDto.getMaxValue() + ); + list.add(pqDataVerify); + } + } + } + } + return list; + } + + /** + * 获取数据的标准范围,进行数据比对 + */ + public List judgeDataHarmPowerP(Map map, DataPowerPDto dto) { + List list = new ArrayList<>(); + PqReasonableRangeDto pqReasonableRangeDto = map.get(DataCleanEnum.Pf.getCode()); + List phaseList = Arrays.asList(pqReasonableRangeDto.getPhaseType().split(",")); + if (phaseList.contains(dto.getPhasicType())) { + if (ObjectUtil.isNotNull(dto.getPf())) { + if (dto.getPf() < pqReasonableRangeDto.getMinValue() || dto.getPf() > pqReasonableRangeDto.getMaxValue()) { + PqDataVerify pqDataVerify = getPqDataVerify(dto.getLineId() + , dto.getMinTime() + , dto.getValueType() + , dto.getPhasicType() + , pqReasonableRangeDto.getIndexCode() + , pqReasonableRangeDto.getIndexName() + , pqReasonableRangeDto.getInfluxdbTableName() + , dto.getPf() + , pqReasonableRangeDto.getMinValue() + , pqReasonableRangeDto.getMaxValue()); + list.add(pqDataVerify); + } + } else { + logger.info("pf{}", dto); + } + } + return list; + } + + /** + * 获取数据的标准范围,进行数据比对 + */ + public List judgeDataHarmPhasicV(Map map, DataHarmDto dto) { + List list = new ArrayList<>(); + PqReasonableRangeDto pqReasonableRangeDto = map.get(DataCleanEnum.V.getCode()); + List phaseList = Arrays.asList(pqReasonableRangeDto.getPhaseType().split(",")); + if (phaseList.contains(dto.getPhasicType())) { + // 50次谐波 + for (int i = 1; i <= 50; i++) { + // 通过反射获取dto.getV(i)的值 + Double vValue = getVValue(dto, i); + if (ObjectUtil.isNotNull(vValue)) { + if (vValue < -180) { + vValue = vValue + 360; + } + if (vValue > 180) { + vValue = vValue - 360; + } + if (vValue < pqReasonableRangeDto.getMinValue() || vValue > pqReasonableRangeDto.getMaxValue()) { + PqDataVerify pqDataVerify = getPqDataVerify( + dto.getLineId(), + dto.getMinTime(), + dto.getValueType(), + dto.getPhasicType(), + pqReasonableRangeDto.getIndexCode(), + i + pqReasonableRangeDto.getIndexName(), + pqReasonableRangeDto.getInfluxdbTableName(), + vValue, + pqReasonableRangeDto.getMinValue(), + pqReasonableRangeDto.getMaxValue() + ); + list.add(pqDataVerify); + } + } else { + logger.info("DataHarmPhasicV{}", dto); + } + } + } + return list; + } + + /** + * 获取数据的标准范围,进行数据比对 + */ + public List judgeDataFluc(Map map, DataFlucDto dto) { + List list = new ArrayList<>(); + PqReasonableRangeDto pqReasonableRangeDto = map.get(DataCleanEnum.Fluc.getCode()); + List phaseList = Arrays.asList(pqReasonableRangeDto.getPhaseType().split(",")); + if (phaseList.contains(dto.getPhasicType())) { + if (ObjectUtil.isNotNull(dto.getFluc())) { + if (dto.getFluc() < pqReasonableRangeDto.getMinValue() || dto.getFluc() > pqReasonableRangeDto.getMaxValue()) { + PqDataVerify pqDataVerify = getPqDataVerify(dto.getLineId() + , dto.getMinTime() + , dto.getValueType() + , dto.getPhasicType() + , pqReasonableRangeDto.getIndexCode() + , pqReasonableRangeDto.getIndexName() + , pqReasonableRangeDto.getInfluxdbTableName() + , dto.getFluc() + , pqReasonableRangeDto.getMinValue() + , pqReasonableRangeDto.getMaxValue()); + list.add(pqDataVerify); + } + } else { + logger.info("flus{}", dto); + } + } + return list; + } + + /** + * 获取数据的标准范围,进行数据比对 + */ + public List judgeDataFlicker(Map map, DataFlickerDto dto) { + List list = new ArrayList<>(); + PqReasonableRangeDto pqReasonableRangeDto = map.get(DataCleanEnum.Pst.getCode()); + List phaseList = Arrays.asList(pqReasonableRangeDto.getPhaseType().split(",")); + if (phaseList.contains(dto.getPhasicType())) { + if (ObjectUtil.isNotNull(dto.getPst())) { + if (dto.getPst() < pqReasonableRangeDto.getMinValue() || dto.getPst() > pqReasonableRangeDto.getMaxValue()) { + PqDataVerify pqDataVerify = getPqDataVerify(dto.getLineId() + , dto.getMinTime() + , dto.getValueType() + , dto.getPhasicType() + , pqReasonableRangeDto.getIndexCode() + , pqReasonableRangeDto.getIndexName() + , pqReasonableRangeDto.getInfluxdbTableName() + , dto.getPst() + , pqReasonableRangeDto.getMinValue() + , pqReasonableRangeDto.getMaxValue()); + list.add(pqDataVerify); + } + } else { + logger.info("pst{}", dto); + } + } + return list; + } + + /** + * 获取数据的标准范围,进行数据比对 + */ + public List judgeDataEvent(Map map, RmpEventDetailDTO dto, DictData dip, DictData rise) { + List list = new ArrayList<>(); + if (ObjectUtil.isNotNull(dip)) { + PqReasonableRangeDto pqReasonableRangeDto = map.get(DataCleanEnum.VoltageDip.getCode()); + if (ObjectUtil.isNotNull(dto.getFeatureAmplitude()) && dip.getId().equals(dto.getEventType())) { + if (dto.getFeatureAmplitude() < pqReasonableRangeDto.getMinValue() || dto.getFeatureAmplitude() > pqReasonableRangeDto.getMaxValue()) { + PqDataVerify pqDataVerify = getPqDataVerify(dto.getMeasurementPointId() + , dto.getStartTime().format(DateTimeFormatter.ofPattern(DatePattern.NORM_DATETIME_MS_PATTERN)) + , "Feature_Amplitude" + , "/" + , pqReasonableRangeDto.getIndexCode() + , pqReasonableRangeDto.getIndexName() + , pqReasonableRangeDto.getInfluxdbTableName() + , dto.getFeatureAmplitude() + , pqReasonableRangeDto.getMinValue() + , pqReasonableRangeDto.getMaxValue()); + list.add(pqDataVerify); + } + } + } + if (ObjectUtil.isNotNull(rise)) { + PqReasonableRangeDto pqReasonableRangeDto2 = map.get(DataCleanEnum.VoltageRise.getCode()); + if (ObjectUtil.isNotNull(dto.getFeatureAmplitude()) && rise.getId().equals(dto.getEventType())) { + if (dto.getFeatureAmplitude() < pqReasonableRangeDto2.getMinValue() || dto.getFeatureAmplitude() > pqReasonableRangeDto2.getMaxValue()) { + PqDataVerify pqDataVerify = getPqDataVerify(dto.getMeasurementPointId() + , dto.getStartTime().format(DateTimeFormatter.ofPattern(DatePattern.NORM_DATETIME_MS_PATTERN)) + , "Feature_Amplitude" + , "/" + , pqReasonableRangeDto2.getIndexCode() + , pqReasonableRangeDto2.getIndexName() + , pqReasonableRangeDto2.getInfluxdbTableName() + , dto.getFeatureAmplitude() + , pqReasonableRangeDto2.getMinValue() + , pqReasonableRangeDto2.getMaxValue()); + list.add(pqDataVerify); + } + } + } + return list; + } + + + public PqDataVerify getPqDataVerify(String lineId, String time, String valueType, String phasicType, String indexCode, String indexName, String indexTable, Double data, Double minValue, Double maxValue) { + PqDataVerify pqDataVerify = new PqDataVerify(); + pqDataVerify.setLineId(lineId); + pqDataVerify.setTime(time.contains(".") ? TimeUtils.StringToLocalDateTimeSSS(time) : TimeUtils.StringToLocalDateTime(time)); + pqDataVerify.setValueType(Objects.isNull(valueType) ? "AVG" : valueType); + pqDataVerify.setPhasicType(phasicType); + pqDataVerify.setIndexCode(indexCode); + pqDataVerify.setIndexName(indexName); + pqDataVerify.setIndexTable(indexTable); + //这里对数据进行判断,如果值过大,都超出数据库存储范围会报错,无法插入,所以这里设置门槛 上下限都为1千万 + if (data > 10000000.0) { + pqDataVerify.setAbnormalValue(9999999.0); + } else if (data < -10000000.0) { + pqDataVerify.setAbnormalValue(-9999999.0); + } else { + pqDataVerify.setAbnormalValue(data); + } + pqDataVerify.setMinValue(minValue); + pqDataVerify.setMaxValue(maxValue); + return pqDataVerify; + } + + private Double getVValue(DataHarmDto dto, int index) { + try { + Method method = DataHarmDto.class.getMethod("getV" + index); + Object invoke = method.invoke(dto); + if (invoke == null) { + return null; + } + return (Double) invoke; + } catch (Exception e) { + throw new RuntimeException(dto + "Failed to get V value for index: " + index, e); + } + } + + public Map handleDataV(List result, PqDataVerifyBak bak, Integer timeInterval) { + Map map = new HashMap<>(); + Map> codeMap = result.stream().collect(Collectors.groupingBy(PqDataVerify::getIndexCode)); + //频率 + List list1 = handleData(codeMap.get(DataCleanEnum.Freq.getCode()), timeInterval); + if (CollUtil.isNotEmpty(list1)) { + bak.setFreq(1); + map.put(DataCleanEnum.DataV.getCode() + "-" + DataCleanEnum.Freq.getCode(), list1); + } + //频率偏差 + List list2 = handleData(codeMap.get(DataCleanEnum.FreqDev.getCode()), timeInterval); + if (CollUtil.isNotEmpty(list2)) { + bak.setFreqDev(1); + map.put(DataCleanEnum.DataV.getCode() + "-" + DataCleanEnum.FreqDev.getCode(), list2); + } + //相电压有效值 + List list3 = handleData(codeMap.get(DataCleanEnum.RmsV.getCode()), timeInterval); + if (CollUtil.isNotEmpty(list3)) { + bak.setVRms(1); + map.put(DataCleanEnum.DataV.getCode() + "-" + DataCleanEnum.RmsV.getCode(), list3); + } + //正序电压 + List list4 = handleData(codeMap.get(DataCleanEnum.VPos.getCode()), timeInterval); + if (CollUtil.isNotEmpty(list4)) { + bak.setVPos(1); + map.put(DataCleanEnum.DataV.getCode() + "-" + DataCleanEnum.VPos.getCode(), list4); + } + //负序电压 + List list5 = handleData(codeMap.get(DataCleanEnum.VNeg.getCode()), timeInterval); + if (CollUtil.isNotEmpty(list5)) { + bak.setVNeg(1); + map.put(DataCleanEnum.DataV.getCode() + "-" + DataCleanEnum.VNeg.getCode(), list5); + } + //零序电压 + List list6 = handleData(codeMap.get(DataCleanEnum.VZero.getCode()), timeInterval); + if (CollUtil.isNotEmpty(list6)) { + bak.setVZero(1); + map.put(DataCleanEnum.DataV.getCode() + "-" + DataCleanEnum.VZero.getCode(), list6); + } + //电压不平衡度 + List list7 = handleData(codeMap.get(DataCleanEnum.VUnbalance.getCode()), timeInterval); + if (CollUtil.isNotEmpty(list7)) { + bak.setVUnbalance(1); + map.put(DataCleanEnum.DataV.getCode() + "-" + DataCleanEnum.VUnbalance.getCode(), list7); + } + //线电压有效值 + List list8 = handleData(codeMap.get(DataCleanEnum.RmsLvr.getCode()), timeInterval); + if (CollUtil.isNotEmpty(list8)) { + bak.setRmsLvr(1); + map.put(DataCleanEnum.DataV.getCode() + "-" + DataCleanEnum.RmsLvr.getCode(), list8); + } + //电压正偏差 + List list9 = handleData(codeMap.get(DataCleanEnum.VuDev.getCode()), timeInterval); + if (CollUtil.isNotEmpty(list9)) { + bak.setVuDev(1); + map.put(DataCleanEnum.DataV.getCode() + "-" + DataCleanEnum.VuDev.getCode(), list9); + } + //电压负偏差 + List list10 = handleData(codeMap.get(DataCleanEnum.VlDev.getCode()), timeInterval); + if (CollUtil.isNotEmpty(list10)) { + bak.setVlDev(1); + map.put(DataCleanEnum.DataV.getCode() + "-" + DataCleanEnum.VlDev.getCode(), list10); + } + //电压总谐波畸变率 + List list11 = handleData(codeMap.get(DataCleanEnum.VThd.getCode()), timeInterval); + if (CollUtil.isNotEmpty(list11)) { + bak.setVThd(1); + map.put(DataCleanEnum.DataV.getCode() + "-" + DataCleanEnum.VThd.getCode(), list11); + } + //相(线)电压基波有效值 + List list12 = handleData(codeMap.get(DataCleanEnum.V_Data.getCode()), timeInterval); + if (CollUtil.isNotEmpty(list12)) { + bak.setV(1); + map.put(DataCleanEnum.DataV.getCode() + "-" + DataCleanEnum.V_Data.getCode(), list12); + } + return map; + } + + public Map handleDataI(List result, PqDataVerifyBak bak, Integer timeInterval) { + Map map = new HashMap<>(); + Map> codeMap = result.stream().collect(Collectors.groupingBy(PqDataVerify::getIndexCode)); + //电流有效值 + List list = handleData(codeMap.get(DataCleanEnum.RmsI.getCode()), timeInterval); + if (CollUtil.isNotEmpty(list)) { + bak.setIRms(1); + map.put(DataCleanEnum.DataI.getCode() + "-" + DataCleanEnum.RmsI.getCode(), list); + } + return map; + } + + public Map handleDataPlt(List result, PqDataVerifyBak bak, Integer timeInterval) { + Map map = new HashMap<>(); + Map> codeMap = result.stream().collect(Collectors.groupingBy(PqDataVerify::getIndexCode)); + //长时闪变 + List list = handleData(codeMap.get(DataCleanEnum.Plt.getCode()), timeInterval); + if (CollUtil.isNotEmpty(list)) { + bak.setPlt(1); + map.put(DataCleanEnum.DataPlt.getCode() + "-" + DataCleanEnum.Plt.getCode(), list); + } + return map; + } + + public Map handleInHarmV(List result, PqDataVerifyBak bak, Integer timeInterval) { + Map map = new HashMap<>(); + Map> codeMap = result.stream().collect(Collectors.groupingBy(PqDataVerify::getIndexCode)); + //间谐波电压含有率 + List list = handleHarmData(codeMap.get(DataCleanEnum.V_InHarm.getCode()), timeInterval); + if (CollUtil.isNotEmpty(list)) { + bak.setVInharm(1); + map.put(DataCleanEnum.DataInHarmV.getCode() + "-" + DataCleanEnum.V_InHarm.getCode(), list); + } + return map; + } + + public Map handleHarmRateV(List result, PqDataVerifyBak bak, Integer timeInterval) { + Map map = new HashMap<>(); + Map> codeMap = result.stream().collect(Collectors.groupingBy(PqDataVerify::getIndexCode)); + //谐波电压含有率 + List list = handleHarmData(codeMap.get(DataCleanEnum.V_Rate.getCode()), timeInterval); + if (CollUtil.isNotEmpty(list)) { + bak.setVHarm(1); + map.put(DataCleanEnum.DataHarmRateV.getCode() + "-" + DataCleanEnum.V_Rate.getCode(), list); + } + return map; + } + + public Map handleHarmPowerP(List result, PqDataVerifyBak bak, Integer timeInterval) { + Map map = new HashMap<>(); + Map> codeMap = result.stream().collect(Collectors.groupingBy(PqDataVerify::getIndexCode)); + //功率因素 + List list = handleData(codeMap.get(DataCleanEnum.Pf.getCode()), timeInterval); + if (CollUtil.isNotEmpty(list)) { + bak.setPf(1); + map.put(DataCleanEnum.DataHarmPowerP.getCode() + "-" + DataCleanEnum.Pf.getCode(), list); + } + return map; + } + + public Map handleHarmPhasicV(List result, PqDataVerifyBak bak, Integer timeInterval) { + Map map = new HashMap<>(); + Map> codeMap = result.stream().collect(Collectors.groupingBy(PqDataVerify::getIndexCode)); + //谐波电压相角 + List list = handleHarmData(codeMap.get(DataCleanEnum.V.getCode()), timeInterval); + if (CollUtil.isNotEmpty(list)) { + bak.setVPhasic(1); + map.put(DataCleanEnum.DataHarmPhasicV.getCode() + "-" + DataCleanEnum.V.getCode(), list); + } + //谐波电压基波相角 + List list2 = handleData(codeMap.get(DataCleanEnum.V1.getCode()), timeInterval); + if (CollUtil.isNotEmpty(list2)) { + bak.setV1Phasic(1); + map.put(DataCleanEnum.DataHarmPhasicV.getCode() + "-" + DataCleanEnum.V1.getCode(), list2); + } + return map; + } + + public Map handleDataFluc(List result, PqDataVerifyBak bak, Integer timeInterval) { + Map map = new HashMap<>(); + Map> codeMap = result.stream().collect(Collectors.groupingBy(PqDataVerify::getIndexCode)); + //电压波动 + List list = handleData(codeMap.get(DataCleanEnum.Fluc.getCode()), timeInterval); + if (CollUtil.isNotEmpty(list)) { + bak.setFluc(1); + map.put(DataCleanEnum.DataFluc.getCode() + "-" + DataCleanEnum.Fluc.getCode(), list); + } + return map; + } + + public Map handleDataFlicker(List result, PqDataVerifyBak bak, Integer timeInterval) { + Map map = new HashMap<>(); + Map> codeMap = result.stream().collect(Collectors.groupingBy(PqDataVerify::getIndexCode)); + //短时闪变 + List list = handleData(codeMap.get(DataCleanEnum.Pst.getCode()), timeInterval); + if (CollUtil.isNotEmpty(list)) { + bak.setPst(1); + map.put(DataCleanEnum.DataFlicker.getCode() + "-" + DataCleanEnum.Pst.getCode(), list); + } + return map; + } + + public Map handleDataEvent(List result, PqDataVerifyBak bak, Integer timeInterval) { + Map map = new HashMap<>(); + Map> codeMap = result.stream().collect(Collectors.groupingBy(PqDataVerify::getIndexCode)); + //暂降事件 + List list = handleData(codeMap.get(DataCleanEnum.VoltageDip.getCode()), timeInterval); + if (CollUtil.isNotEmpty(list)) { + bak.setDip(1); + map.put(DataCleanEnum.RMpEventDetail.getCode() + "-" + DataCleanEnum.VoltageDip.getCode(), list); + } + //暂升事件 + List list2 = handleData(codeMap.get(DataCleanEnum.VoltageRise.getCode()), timeInterval); + if (CollUtil.isNotEmpty(list2)) { + bak.setRise(1); + map.put(DataCleanEnum.RMpEventDetail.getCode() + "-" + DataCleanEnum.VoltageRise.getCode(), list2); + } + return map; + } + + public List handleData(List list, Integer timeInterval) { + List dataList = new ArrayList<>(); + if (CollUtil.isNotEmpty(list)) { + AtomicInteger allCounts = new AtomicInteger(); + Set timeSet = new HashSet<>(); + DataCleanJsonDTO.DataHarmCleanJsonDTO dto = new DataCleanJsonDTO.DataHarmCleanJsonDTO(); + dto.setTargetName(list.get(0).getIndexName()); + List list1 = new ArrayList<>(); + Map> phaseMap = list.stream().collect(Collectors.groupingBy(PqDataVerify::getPhasicType)); + phaseMap.forEach((k, v) -> { + Map> map11 = v.stream().collect(Collectors.groupingBy(PqDataVerify::getValueType)); + map11.forEach((k2, v2) -> { + DataCleanJsonDTO.DataHarmCleanNormalJsonDTO dataCleanJsonDTO = new DataCleanJsonDTO.DataHarmCleanNormalJsonDTO(); + dataCleanJsonDTO.setPhasic(k); + dataCleanJsonDTO.setValueType(k2); + timeSet.addAll(v2.stream().map(dt -> dt.getTime().format(DateTimeFormatter.ofPattern(DatePattern.NORM_TIME_PATTERN))).collect(Collectors.toSet())); + //只取值最大的10组数据 + List topTen = v2.stream() + //过滤掉null元素 + .filter(Objects::nonNull) + .sorted(Comparator.comparing( + PqDataVerify::getAbnormalValue, + Comparator.nullsLast(Comparator.reverseOrder()))) + .limit(10) + .collect(Collectors.toList()); + dataCleanJsonDTO.setTime(topTen.stream().map(dt -> dt.getTime().format(DateTimeFormatter.ofPattern(DatePattern.NORM_TIME_PATTERN))).collect(Collectors.toList())); + dataCleanJsonDTO.setValue(topTen.stream() + .map(pq -> { + Double value = pq.getAbnormalValue(); + return value != null ? Math.round(value * 100) / 100.0 : null; + }) + .collect(Collectors.toList())); + dataCleanJsonDTO.setErrorCounts(v2.size()); + allCounts.set(allCounts.get() + v2.size()); + list1.add(dataCleanJsonDTO); + }); + dto.setErrorCounts(allCounts.get()); + dto.setErrorTimes(timeSet.size() * timeInterval); + dto.setMinValue(list.get(0).getMinValue()); + dto.setMaxValue(list.get(0).getMaxValue()); + dto.setList(list1); + }); + dataList.add(dto); + } + return dataList; + } + + public List handleHarmData(List list, Integer timeInterval) { + List dataList = new ArrayList<>(); + if (CollUtil.isNotEmpty(list)) { + AtomicInteger allCounts = new AtomicInteger(); + Set timeSet = new HashSet<>(); + Map> indexNameMap = list.stream().collect(Collectors.groupingBy(PqDataVerify::getIndexName)); + indexNameMap.forEach((k, v) -> { + DataCleanJsonDTO.DataHarmCleanJsonDTO dto = new DataCleanJsonDTO.DataHarmCleanJsonDTO(); + dto.setTargetName(k); + List dataCleanJsonDTOList = new ArrayList<>(); + Map> phaseMap = v.stream().collect(Collectors.groupingBy(PqDataVerify::getPhasicType)); + phaseMap.forEach((k2, v2) -> { + Map> valueMap = v2.stream().collect(Collectors.groupingBy(PqDataVerify::getValueType)); + valueMap.forEach((k3, v3) -> { + DataCleanJsonDTO.DataHarmCleanNormalJsonDTO dto1 = new DataCleanJsonDTO.DataHarmCleanNormalJsonDTO(); + dto1.setPhasic(k2); + dto1.setValueType(k3); + timeSet.addAll(v3.stream().map(dt -> dt.getTime().format(DateTimeFormatter.ofPattern(DatePattern.NORM_TIME_PATTERN))).collect(Collectors.toSet())); + //只取值最大的10组数据 + List topTen = v3.stream() + //过滤掉null元素 + .filter(Objects::nonNull) + .sorted(Comparator.comparing( + PqDataVerify::getAbnormalValue, + Comparator.nullsLast(Comparator.reverseOrder()))) + .limit(10) + .collect(Collectors.toList()); + dto1.setTime(topTen.stream().map(dt -> dt.getTime().format(DateTimeFormatter.ofPattern(DatePattern.NORM_TIME_PATTERN))).collect(Collectors.toList())); + dto1.setValue(topTen.stream() + .map(pq -> { + Double value = pq.getAbnormalValue(); + return value != null ? Math.round(value * 100) / 100.0 : null; + }) + .collect(Collectors.toList())); + dto1.setErrorCounts(v3.size()); + allCounts.set(allCounts.get() + v3.size()); + dataCleanJsonDTOList.add(dto1); + }); + dto.setErrorCounts(allCounts.get()); + dto.setErrorTimes(timeSet.size() * timeInterval); + dto.setList(dataCleanJsonDTOList); + }); + dataList.add(dto); + }); + } + return dataList; + } + +} diff --git a/algorithm/algorithm-boot/src/main/java/com/njcn/algorithm/serviceimpl/line/FlowServiceImpl.java b/algorithm/algorithm-boot/src/main/java/com/njcn/algorithm/serviceimpl/line/FlowServiceImpl.java deleted file mode 100644 index ee8758f..0000000 --- a/algorithm/algorithm-boot/src/main/java/com/njcn/algorithm/serviceimpl/line/FlowServiceImpl.java +++ /dev/null @@ -1,80 +0,0 @@ -package com.njcn.algorithm.serviceimpl.line; - -import cn.hutool.core.collection.CollectionUtil; -import cn.hutool.core.text.StrPool; -import com.njcn.algorithm.ExecutionCenter; -import com.njcn.algorithm.pojo.bo.CalculatedParam; -import com.njcn.algorithm.service.line.FlowService; -import com.njcn.algorithm.utils.MemorySizeUtil; -import com.yomahub.liteflow.core.FlowExecutor; -import com.yomahub.liteflow.flow.LiteflowResponse; -import com.yomahub.liteflow.flow.entity.CmpStep; -import lombok.extern.slf4j.Slf4j; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.scheduling.annotation.Async; -import org.springframework.stereotype.Service; - -import javax.annotation.Resource; -import java.util.List; -import java.util.Map; -import java.util.Objects; -import java.util.stream.Collectors; - -/** - * @author wr - * @description - * @date 2025/12/16 17:43 - */ -@Slf4j -@Service -public class FlowServiceImpl implements FlowService { - - private static final Logger logger = LoggerFactory.getLogger(FlowServiceImpl.class); - - @Resource - private FlowExecutor flowExecutor; - - @Override - @Async("asyncExecutor") - public void execute2Resp(String methodDescribe,CalculatedParam calculatedParam) { - LiteflowResponse liteflowResponse = flowExecutor.execute2Resp("measurement_point", calculatedParam); - dealResponse(calculatedParam, liteflowResponse, methodDescribe); - } - - /*** - * - * @author hongawen - * @date 2023/11/7 14:44 - */ - private void dealResponse(CalculatedParam calculatedParam, LiteflowResponse liteflowResponse, String methodDescribe) { - MemorySizeUtil.getNowMemory(); - if (liteflowResponse.isSuccess()) { - // 获取执行步骤列表 - long allTime = 0; - Map> executeSteps = liteflowResponse.getExecuteSteps(); - for (String key : executeSteps.keySet()) { - List cmpSteps = executeSteps.get(key); - long timeSum = cmpSteps.stream().mapToLong(CmpStep::getTimeSpent).sum(); - allTime+=timeSum; - } - logger.info("日期{},{}执行{}成功,执行总时长{}分钟", calculatedParam.getDataDate(), methodDescribe, calculatedParam.isFullChain() ? "全链" : "指定节点:".concat(String.join(StrPool.COMMA, calculatedParam.getTagNames())),allTime/1000/60); - } else { - Map> executeSteps = liteflowResponse.getExecuteSteps(); - CmpStep failStep = null; - for (String key : executeSteps.keySet()) { - List cmpSteps = executeSteps.get(key); - cmpSteps = cmpSteps.stream().filter(cmpStep -> !cmpStep.isSuccess()).collect(Collectors.toList()); - if (CollectionUtil.isNotEmpty(cmpSteps)) { - failStep = cmpSteps.get(0); - } - } - logger.error("日期{},{}执行{}失败,在执行{}失败,失败原因:{}" - , calculatedParam.getDataDate() - , methodDescribe - , calculatedParam.isFullChain() ? "全链" : "指定节点:".concat(String.join(StrPool.COMMA, calculatedParam.getTagNames())) - , failStep.getNodeId().concat(Objects.isNull(failStep.getTag()) ? "" : StrPool.DASHED.concat(failStep.getTag())) - , Objects.isNull(failStep.getException()) ? null : failStep.getException().getMessage()); - } - } -} diff --git a/algorithm/algorithm-boot/src/main/java/com/njcn/algorithm/serviceimpl/line/IDataCrossingServiceImpl.java b/algorithm/algorithm-boot/src/main/java/com/njcn/algorithm/serviceimpl/line/IDataCrossingServiceImpl.java index 1c1a515..d4de3c5 100644 --- a/algorithm/algorithm-boot/src/main/java/com/njcn/algorithm/serviceimpl/line/IDataCrossingServiceImpl.java +++ b/algorithm/algorithm-boot/src/main/java/com/njcn/algorithm/serviceimpl/line/IDataCrossingServiceImpl.java @@ -6,23 +6,19 @@ import cn.hutool.core.collection.ListUtil; import cn.hutool.core.date.DatePattern; import cn.hutool.core.date.LocalDateTimeUtil; import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSON; import com.njcn.algorithm.pojo.bo.CalculatedParam; import com.njcn.algorithm.service.line.IDataCrossingService; +import com.njcn.algorithm.service.line.IDataLimitRateAsync; import com.njcn.algorithm.utils.MemorySizeUtil; import com.njcn.common.utils.PubUtils; import com.njcn.csdevice.api.CsLineFeignClient; import com.njcn.dataProcess.api.*; import com.njcn.dataProcess.constant.PhaseType; -import com.njcn.dataProcess.enums.DataCleanEnum; import com.njcn.dataProcess.param.LineCountEvaluateParam; import com.njcn.dataProcess.pojo.dto.*; -import com.njcn.dataProcess.pojo.po.PqDataVerify; import com.njcn.dataProcess.util.TimeUtils; import com.njcn.device.biz.commApi.CommTerminalGeneralClient; import com.njcn.device.biz.pojo.po.Overlimit; -import com.njcn.influx.constant.InfluxDbSqlConstant; -import com.njcn.influx.pojo.constant.InfluxDBTableConstant; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.collections4.ListUtils; @@ -40,7 +36,6 @@ import java.math.BigDecimal; import java.math.RoundingMode; import java.time.LocalDateTime; import java.util.ArrayList; -import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.function.Function; @@ -59,32 +54,20 @@ public class IDataCrossingServiceImpl implements IDataCrossingService { private static final Logger logger = LoggerFactory.getLogger(DayDataServiceImpl.class); @Value("${line.num}") private Integer NUM; - @Resource - private DataVFeignClient dataVFeignClient; + @Resource private CommTerminalGeneralClient commTerminalGeneralClient; @Resource - private DataIFeignClient dataIFeignClient; - @Resource - private DataPltFeignClient dataPltFeignClient; - @Resource - private DataInharmVFeignClient dataInharmVFeignClient; - @Resource - private DataHarmRateVFeignClient dataHarmRateVFeignClient; - @Resource private DataLimitRateFeignClient dataLimitRateFeignClient; @Resource - private DataLimitRateDetailFeignClient dataLimitRateDetailFeignClient; - @Resource - private PqDataVerifyFeignClient pqDataVerifyFeignClient; - @Resource private DataLimitTargetFeignClient dataLimitTargetFeignClient; @Resource private DataLimitQualifiedFeignClient dataLimitQualifiedFeignClient; @Resource + private IDataLimitRateAsync dataLimitRateAsync; + @Resource private CsLineFeignClient csLineFeignClient; - @Override public void limitRateHandler(CalculatedParam calculatedParam) { MemorySizeUtil.getNowMemory(); @@ -100,148 +83,13 @@ public class IDataCrossingServiceImpl implements IDataCrossingService { List overLimitList = commTerminalGeneralClient.getOverLimitDataByIds(lineIds).getData(); Map overLimitMap = overLimitList.stream().collect(Collectors.toMap(Overlimit::getId, Function.identity())); //以100个监测点分片处理 - List> pendingIds = ListUtils.partition(lineIds, NUM); + List> pendingIds = ListUtils.partition(lineIds, 5); ArrayList phase = ListUtil.toList(PhaseType.PHASE_A, PhaseType.PHASE_B, PhaseType.PHASE_C); MemorySizeUtil.getNowMemory(); for (int i = 0; i < pendingIds.size(); i++) { - logger.info("总分区数据:" + pendingIds.size() + "=====》当前第"+(i + 1)+"小分区"); + logger.info(calculatedParam.getDataDate()+" 总分区数据:" + pendingIds.size() + "=====》当前第"+(i + 1)+"小分区"); List list = pendingIds.get(i); - lineParam.setLineId(list); - //获取电压数据 - List dataVAllTime = dataVFeignClient.getRawData(lineParam).getData(); - //闪变数据 - List dataPltAllTime = dataPltFeignClient.getRawData(lineParam).getData(); - //谐波数据 - List dataVHarmList = dataHarmRateVFeignClient.getRawData(lineParam).getData(); - //间谐波数据 - List dataVInHarmList = dataInharmVFeignClient.getRawData(lineParam).getData(); - //电流数据 - List dataIList = dataIFeignClient.getRawData(lineParam).getData(); - /** - * 功能描述:获取influxDB -> data_v -> - * 总计算次数(用data_v中phasic_type=A,value_type=avg,quality_flag=0来参与统计) - */ - Map> allTime = dataVAllTime.stream() - .filter(x -> PhaseType.PHASE_A.equals(x.getPhasicType())) - .filter(x -> InfluxDbSqlConstant.AVG_WEB.equalsIgnoreCase(x.getValueType())) - .collect(Collectors.groupingBy(DataVDto::getLineId)); - - /** - * 功能描述:获取influxDB -> data_plt -> - * 闪变总计算次数(用data_plt中phasic_type=A,value_type=avg,quality_flag=0来参与统计) - */ - //fixme 冀北现场 闪变原始表没有 value_type 这个参数 - Map> pltAllTime = dataPltAllTime.stream() - .filter(x -> PhaseType.PHASE_A.equals(x.getPhasicType())) -// .filter(x -> InfluxDbSqlConstant.AVG_WEB.equalsIgnoreCase(x.getValueType())) - .collect(Collectors.groupingBy(DataPltDto::getLineId)); - - /** - *功能描述:获取influxDB -> data_harmrate_v -> - * 2-25次谐波电压含有率 -> A相||B相||C相的日95%概率值 - */ - Map> harmRateV = dataVHarmList.stream() - .filter(x -> phase.contains(x.getPhasicType())) - .filter(x -> InfluxDBTableConstant.CP95.equals(x.getValueType())) - .collect(Collectors.groupingBy(DataHarmDto::getLineId)); - - /** - * 功能描述:获取influxDB -> data_i -> 2-25次谐波电流 -> 日95%概率值 - */ - Map> dataI = dataIList.stream() - .filter(x -> phase.contains(x.getPhasicType())) - .filter(x -> InfluxDBTableConstant.CP95.equals(x.getValueType())) - .collect(Collectors.groupingBy(DataIDto::getLineId)); - - - /** - * 功能描述:获取influxDB -> data_inharm_v -> 0.5-15.5次间谐波电压含有率 -> 日95%概率值 - */ - Map> inHarmV = dataVInHarmList.stream() - .filter(x -> phase.contains(x.getPhasicType())) - .filter(x -> InfluxDBTableConstant.CP95.equals(x.getValueType())) - .collect(Collectors.groupingBy(DataHarmDto::getLineId)); - - /** - * 功能描述:获取influxDB -> data_v -> 电压总谐波畸变率 -> 日95%概率值 - */ - Map> dataVThd = dataVAllTime.stream() - .filter(x -> phase.contains(x.getPhasicType())) - .filter(x -> InfluxDBTableConstant.CP95.equals(x.getValueType())) - .collect(Collectors.groupingBy(DataVDto::getLineId)); - - /** - * 功能描述:获取influxDB -> data_v -> 负序电压不平衡度 -> 最大值 && 日95%概率值 - */ - Map> dataVUnbalance = dataVAllTime.stream() - .filter(x -> InfluxDBTableConstant.PHASE_TYPE_T.equals(x.getPhasicType())) - .filter(x -> InfluxDBTableConstant.CP95.equals(x.getValueType()) || - InfluxDBTableConstant.MAX.equals(x.getValueType())) - .collect(Collectors.groupingBy(DataVDto::getLineId)); - - /** - * 功能描述:获取influxDB -> data_i -> 负序电流 -> 最大值 && 日95%概率值 - */ - Map> dataINeg = dataIList.stream() - .filter(x -> InfluxDBTableConstant.PHASE_TYPE_T.equals(x.getPhasicType())) - .filter(x -> InfluxDBTableConstant.CP95.equals(x.getValueType()) || - InfluxDBTableConstant.MAX.equals(x.getValueType())) - .collect(Collectors.groupingBy(DataIDto::getLineId)); - - /** - * 功能描述:获取influxDB -> data_v -> 频率偏差 -> 最大值 && 最小值 - */ - Map> dataVFreq = dataVAllTime.stream() - .filter(x -> InfluxDBTableConstant.PHASE_TYPE_T.equals(x.getPhasicType())) - .filter(x -> InfluxDBTableConstant.MIN.equals(x.getValueType()) || - InfluxDBTableConstant.MAX.equals(x.getValueType())) - .collect(Collectors.groupingBy(DataVDto::getLineId)); - /** - * 功能描述:获取influxDB -> data_v -> 电压偏差 -> 最大值 - */ - Map> dataVDev = dataVAllTime.stream() - .filter(x -> phase.contains(x.getPhasicType())) - .filter(x -> InfluxDBTableConstant.MAX.equals(x.getValueType())) - .collect(Collectors.groupingBy(DataVDto::getLineId)); - - /** - * 功能描述:获取influxDB -> data_plt -> 长时间闪变 -> 注(取最大值原始算法去掉了,现没有根据最大值比较) - */ - Map> dataPlt = dataPltAllTime.stream() - .filter(x -> phase.contains(x.getPhasicType())) - .collect(Collectors.groupingBy(DataPltDto::getLineId)); - - for (String item : list) { - if(ObjectUtil.isNotNull(overLimitMap.get(item))){ - result.addAll(getData(calculatedParam.getDataDate(), - overLimitMap.get(item), - allTime.get(item), - pltAllTime.get(item), - harmRateV.get(item), - dataI.get(item), - inHarmV.get(item), - dataVThd.get(item), - dataVUnbalance.get(item), - dataINeg.get(item), - dataVFreq.get(item), - dataVDev.get(item), - dataPlt.get(item))); - } - } - } - if (CollUtil.isNotEmpty(result)) { - //存储数据 - List dataLimitRate = result.stream().map(DataLimitDetailDto::getDataLimitRate).filter(ObjectUtil::isNotNull).collect(Collectors.toList()); - if(CollUtil.isNotEmpty(dataLimitRate)){ - dataLimitRateFeignClient.batchInsertion(dataLimitRate); - } - } - if (CollUtil.isNotEmpty(result)) { - //存储数据 - List detail = result.stream().map(DataLimitDetailDto::getDataLimitRateDetail).filter(x -> ObjectUtil.isNotNull(x)).collect(Collectors.toList()); - if(CollUtil.isNotEmpty(detail)) { - dataLimitRateDetailFeignClient.batchInsertion(detail); - } + dataLimitRateAsync.lineDataRate(calculatedParam.getDataDate(), list, phase, overLimitMap, pendingIds.size(), (i + 1)); } System.gc(); } @@ -448,682 +296,6 @@ public class IDataCrossingServiceImpl implements IDataCrossingService { } - /** - * @Description: getData - * @Param: [overlimit, allTimeList, flickerAllTimeList, dataHarmRateVPOList, dataIPOList, dataInHarmVPOList, dataVPOList, dataVPOUnbalanceList, dataIPONegList, dataVPOFreqList, dataVPODevList, dataPltPOList] - * @return: java.util.List - * @Author: clam - * @Date: 2022/10/18 - */ - private List getData(String dataDate, - Overlimit overlimit, - List allTimeList, - List flickerAllTimeList, - List dataHarmRateVPOList, - List dataIPOList, - List dataInHarmVPOList, - List dataVPOList, - List dataVPOUnbalanceList, - List dataIPONegList, - List dataVPOFreqList, - List dataVPODevList, - List dataPltPOList) { - List result = new ArrayList<>(); - - Map> harmRateVByPhaseType = new HashMap<>(); - Map> dataIByPhaseType = new HashMap<>(); - Map> dataInHarmVPhaseType = new HashMap<>(); - Map> dataVPhaseType = new HashMap<>(); - Map> dataVDevPhaseType = new HashMap<>(); - Map> dataPltPhaseType = new HashMap<>(); - - - Integer allTime = 0; - Integer flickerAllTime = 0; - if (!CollectionUtils.isEmpty(allTimeList)) { - allTime = allTimeList.size(); - } - if (!CollectionUtils.isEmpty(flickerAllTimeList)) { - flickerAllTime = flickerAllTimeList.size(); - } - if (!CollectionUtils.isEmpty(dataHarmRateVPOList)) { - harmRateVByPhaseType = dataHarmRateVPOList.stream().collect(Collectors.groupingBy(DataHarmDto::getPhasicType)); - } - if (!CollectionUtils.isEmpty(dataIPOList)) { - dataIByPhaseType = dataIPOList.stream().collect(Collectors.groupingBy(DataIDto::getPhasicType)); - } - if (!CollectionUtils.isEmpty(dataInHarmVPOList)) { - dataInHarmVPhaseType = dataInHarmVPOList.stream().collect(Collectors.groupingBy(DataHarmDto::getPhasicType)); - } - if (!CollectionUtils.isEmpty(dataVPOList)) { - dataVPhaseType = dataVPOList.stream().collect(Collectors.groupingBy(DataVDto::getPhasicType)); - } - if (!CollectionUtils.isEmpty(dataVPODevList)) { - dataVDevPhaseType = dataVPODevList.stream().collect(Collectors.groupingBy(DataVDto::getPhasicType)); - } - if (!CollectionUtils.isEmpty(dataPltPOList)) { - dataPltPhaseType = dataPltPOList.stream().collect(Collectors.groupingBy(DataPltDto::getPhasicType)); - } - DataLimitDetailDto a = limitRateData(dataDate, overlimit, allTime, flickerAllTime, PhaseType.PHASE_A, overlimit.getId(), harmRateVByPhaseType.get(PhaseType.PHASE_A), dataIByPhaseType.get(PhaseType.PHASE_A), dataInHarmVPhaseType.get(PhaseType.PHASE_A), dataVPhaseType.get(PhaseType.PHASE_A), dataVDevPhaseType.get(PhaseType.PHASE_A), dataPltPhaseType.get(PhaseType.PHASE_A)); - DataLimitDetailDto b = limitRateData(dataDate, overlimit, allTime, flickerAllTime, PhaseType.PHASE_B, overlimit.getId(), harmRateVByPhaseType.get(PhaseType.PHASE_B), dataIByPhaseType.get(PhaseType.PHASE_B), dataInHarmVPhaseType.get(PhaseType.PHASE_B), dataVPhaseType.get(PhaseType.PHASE_B), dataVDevPhaseType.get(PhaseType.PHASE_B), dataPltPhaseType.get(PhaseType.PHASE_B)); - DataLimitDetailDto c = limitRateData(dataDate, overlimit, allTime, flickerAllTime, PhaseType.PHASE_C, overlimit.getId(), harmRateVByPhaseType.get(PhaseType.PHASE_C), dataIByPhaseType.get(PhaseType.PHASE_C), dataInHarmVPhaseType.get(PhaseType.PHASE_C), dataVPhaseType.get(PhaseType.PHASE_C), dataVDevPhaseType.get(PhaseType.PHASE_C), dataPltPhaseType.get(PhaseType.PHASE_C)); - DataLimitDetailDto t = limitRateDataT(dataDate, overlimit, allTime, flickerAllTime, overlimit.getId(), dataHarmRateVPOList, dataIPOList, dataInHarmVPOList, dataVPOList, dataVPOUnbalanceList, dataIPONegList, dataVPOFreqList, dataVPODevList, dataPltPOList); - result.add(a); - result.add(b); - result.add(c); - result.add(t); - return result; - } - - /** - * @param lineParam - * @Description: - * @Author: wr - * @Date: 2025/3/11 9:04 - */ - private void getAbnormalData(LineCountEvaluateParam lineParam) { - lineParam.setTableName(DataCleanEnum.DataV.getCode()); - // 获取异常数据,用于排除异常数据 - List pqDataVerifies = pqDataVerifyFeignClient.queryData(lineParam).getData(); - if (CollUtil.isNotEmpty(pqDataVerifies)) { - Map> timeMap = pqDataVerifies.stream() - .collect(Collectors.groupingBy( - PqDataVerify::getLineId, - Collectors.mapping(item -> TimeUtils.LocalDateTimeToString(item.getTime()), Collectors.toList()) - )); - lineParam.setAbnormalTime(timeMap); - } - } - - /** - * @Description: limitRateData - * @Param: [overlimit, allTime, flickerAllTime, phasicType, lineId, dataHarmRateVPOList, dataIPOList, dataInHarmVPOList, dataVPOList, dataVUnbalanceList, dataINegList] - * @return: com.njcn.harmonic.pojo.po.LimitRate - * @Author: clam - * @Date: 2022/10/18 - */ - public DataLimitDetailDto limitRateData(String dataDate, - Overlimit overlimit, - Integer allTime, - Integer flickerAllTime, - String phasicType, String lineId, - List dataHarmRateVPOList, - List dataIPOList, - List dataInHarmVPOList, - List dataVPOList, - List dataVPODevList, - List dataPltPOList) { - List thd = new ArrayList<>(), uDev = new ArrayList<>(), flicker = new ArrayList<>(), freqDev = new ArrayList<>(), uAberrance = new ArrayList<>(), iNeg = new ArrayList<>(); - DataLimitDetailDto dto = new DataLimitDetailDto(); - DataLimitRateDto limitRate = new DataLimitRateDto(); - // 初始化 v 系列列表 - List[] v = new List[24]; - for (int i = 0; i < 24; i++) { - v[i] = new ArrayList<>(); - } - // 处理数据 - if (!CollectionUtils.isEmpty(dataHarmRateVPOList)) { - for (DataHarmDto item : dataHarmRateVPOList) { - for (int i = 2; i < 26; i++) { - try { - // 获取 DataHarmDto 类的 getVx 方法 - Method getVMethod = DataHarmDto.class.getMethod("getV" + i); - Double value = (Double) getVMethod.invoke(item); - // 获取 Overlimit 类的 getUharmx 方法 - Method getUharmMethod = Overlimit.class.getMethod("getUharm" + i); - float limit = (float) getUharmMethod.invoke(overlimit); - if (ObjectUtil.isNotNull(value)){ - if (value > limit) { - addAbnormalData(v[i - 2], item.getPhasicType(), item.getValueType(), item.getMinTime(), value, limit); - } - } - } catch (Exception e) { - e.printStackTrace(); - } - } - } - } - - // 初始化 i 系列列表 - List[] i = new List[24]; - for (int j = 0; j < 24; j++) { - i[j] = new ArrayList<>(); - } - // 处理数据 - if (!CollectionUtils.isEmpty(dataIPOList)) { - for (DataIDto item : dataIPOList) { - for (int j = 2; j < 26; j++) { - try { - // 获取 DataHarmDto 类的 getIx 方法 - Method getVMethod = DataIDto.class.getMethod("getI" + j); - Double value = (Double) getVMethod.invoke(item); - // 获取 Overlimit 类的 getUharmx 方法 - Method getUharmMethod = Overlimit.class.getMethod("getIharm" + j); - float limit = (float) getUharmMethod.invoke(overlimit); - if (ObjectUtil.isNotNull(value)){ - if (value > limit) { - addAbnormalData(i[j - 2], item.getValueType(), item.getPhasicType(), item.getMinTime(), value, limit); - } - } - - } catch (Exception e) { - e.printStackTrace(); - } - } - } - } - // 初始化 uHarm 系列列表 - List[] uHarm = new List[16]; - for (int j = 0; j < 16; j++) { - uHarm[j] = new ArrayList<>(); - } - // 处理数据 - if (!CollectionUtils.isEmpty(dataInHarmVPOList)) { - for (DataHarmDto item : dataInHarmVPOList) { - for (int j = 1; j < 17; j++) { - try { - // 获取 DataHarmDto 类的 getVx 方法 - Method getVMethod = DataHarmDto.class.getMethod("getV" + j); - Double value = (Double) getVMethod.invoke(item); - // 获取 Overlimit 类的 getUharmx 方法 - Method getUharmMethod = Overlimit.class.getMethod("getInuharm" + j); - float limit = (float) getUharmMethod.invoke(overlimit); - if (ObjectUtil.isNotNull(value)){ - if (value > limit) { - addAbnormalData(uHarm[j - 1], item.getPhasicType(), item.getValueType(), item.getMinTime(), value, limit); - } - } - } catch (Exception e) { - e.printStackTrace(); - } - } - } - } - //电压总谐波畸变率 - if (!CollectionUtils.isEmpty(dataVPOList)) { - for (DataVDto item : dataVPOList) { - if (ObjectUtil.isNotNull(item.getVThd())) { - if(item.getVThd() > overlimit.getUaberrance()){ - addAbnormalData(thd, item.getPhasicType(), item.getValueType(), item.getMinTime(), item.getVThd(), overlimit.getUaberrance()); - } - } - } - } - //电压上偏差、电压下偏差(根据vl_dev的正负判断是用哪个值判断越限) - if (!CollectionUtils.isEmpty(dataVPODevList)) { - for (DataVDto item : dataVPODevList) { - if(ObjectUtil.isNotNull(item.getVlDev())){ - if (item.getVlDev() >= 0) { - if (item.getVlDev() > overlimit.getVoltageDev()) { - addAbnormalData(uDev, item.getPhasicType(), item.getValueType(), item.getMinTime(), item.getVlDev(), overlimit.getVoltageDev()); - } - } else { - if (Math.abs(item.getVuDev()) > Math.abs(overlimit.getUvoltageDev())) { - addAbnormalData(uDev, item.getPhasicType(), item.getValueType(), item.getMinTime(), item.getVuDev(), overlimit.getUvoltageDev()); - } - } - } - } - } - //长时间闪变 - if (!CollectionUtils.isEmpty(dataPltPOList)) { - for (DataPltDto item : dataPltPOList) { - if (ObjectUtil.isNotNull(item.getPlt())) { - if(item.getPlt() > overlimit.getFlicker()){ - addAbnormalData(flicker, item.getPhasicType(), item.getValueType(), item.getMinTime(), item.getPlt(), overlimit.getFlicker()); - } - } - } - } - limitRate.setLineId(lineId); - limitRate.setTime(LocalDateTimeUtil.parseDate(dataDate, DatePattern.NORM_DATE_PATTERN)); - limitRate.setPhasicType(phasicType); - limitRate.setAllTime(allTime); - limitRate.setFlickerAllTime(flickerAllTime); - - limitRate.setFlickerOvertime(flicker.size()); - limitRate.setUaberranceOvertime(thd.size()); - limitRate.setINegOvertime(iNeg.size()); - limitRate.setFreqDevOvertime(freqDev.size()); - limitRate.setUbalanceOvertime(uAberrance.size()); - limitRate.setVoltageDevOvertime(uDev.size()); - dto.setDataLimitRate(getDataLimitRateDto(limitRate, v, i, uHarm)); - - return dto; - } - - - public DataLimitDetailDto limitRateDataT( - String dataDate, - Overlimit overlimit, - Integer allTime, - Integer flickerAllTime, - String lineId, - List dataHarmRateVPOList, - List dataIPOList, - List dataInHarmVPOList, - List dataVPOList, - List dataVPOUnbalanceList, - List dataIPONegList, - List dataVPOFreqList, - List dataVPODevList, - List dataPltPOList) { - DataLimitDetailDto dto = new DataLimitDetailDto(); - DataLimitRateDto limitRate = new DataLimitRateDto(); - List thd = new ArrayList<>(), uDev = new ArrayList<>(), flicker = new ArrayList<>(), freqDev = new ArrayList<>(), uAberrance = new ArrayList<>(), iNeg = new ArrayList<>(); - // 初始化 v 系列列表 - List[] v = new List[24]; - for (int i = 0; i < 24; i++) { - v[i] = new ArrayList<>(); - } - // 处理数据 - if (!CollectionUtils.isEmpty(dataHarmRateVPOList)) { - for (DataHarmDto item : dataHarmRateVPOList) { - for (int i = 2; i < 26; i++) { - try { - // 获取 DataHarmDto 类的 getVx 方法 - Method getVMethod = DataHarmDto.class.getMethod("getV" + i); - Double value = (Double) getVMethod.invoke(item); - // 获取 Overlimit 类的 getUharmx 方法 - Method getUharmMethod = Overlimit.class.getMethod("getUharm" + i); - float limit = (float) getUharmMethod.invoke(overlimit); - if (ObjectUtil.isNotNull(value)){ - if (value > limit) { - addAbnormalData(v[i - 2], item.getPhasicType(), item.getValueType(), item.getMinTime(), value, limit); - } - } - } catch (Exception e) { - e.printStackTrace(); - } - } - } - } - - // 初始化 i 系列列表 - List[] i = new List[24]; - for (int j = 0; j < 24; j++) { - i[j] = new ArrayList<>(); - } - // 处理数据 - if (!CollectionUtils.isEmpty(dataIPOList)) { - for (DataIDto item : dataIPOList) { - for (int j = 2; j < 26; j++) { - try { - // 获取 DataHarmDto 类的 getIx 方法 - Method getVMethod = DataIDto.class.getMethod("getI" + j); - Double value = (Double) getVMethod.invoke(item); - // 获取 Overlimit 类的 getUharmx 方法 - Method getUharmMethod = Overlimit.class.getMethod("getIharm" + j); - float limit = (float) getUharmMethod.invoke(overlimit); - if(ObjectUtil.isNotNull(value)){ - if (value > limit) { - addAbnormalData(i[j - 2], item.getPhasicType(), item.getValueType(), item.getMinTime(), value, limit); - } - } - } catch (Exception e) { - e.printStackTrace(); - } - } - } - } - // 初始化 uHarm 系列列表 - List[] uHarm = new List[16]; - for (int j = 0; j < 16; j++) { - uHarm[j] = new ArrayList<>(); - } - // 处理数据 - if (!CollectionUtils.isEmpty(dataInHarmVPOList)) { - for (DataHarmDto item : dataInHarmVPOList) { - for (int j = 1; j < 17; j++) { - try { - // 获取 DataHarmDto 类的 getVx 方法 - Method getVMethod = DataHarmDto.class.getMethod("getV" + j); - Double value = (Double) getVMethod.invoke(item); - // 获取 Overlimit 类的 getUharmx 方法 - Method getUharmMethod = Overlimit.class.getMethod("getInuharm" + j); - float limit = (float) getUharmMethod.invoke(overlimit); - if(ObjectUtil.isNotNull(value)){ - if (value > limit) { - addAbnormalData(uHarm[j - 1], item.getPhasicType(), item.getValueType(), item.getMinTime(), value, limit); - } - } - } catch (Exception e) { - e.printStackTrace(); - } - } - } - } - //电压总谐波畸变率 - if (!CollectionUtils.isEmpty(dataVPOList)) { - for (DataVDto item : dataVPOList) { - if (ObjectUtil.isNotNull(item.getVThd())) { - if(item.getVThd() > overlimit.getUaberrance()){ - addAbnormalData(thd, item.getPhasicType(), item.getValueType(), item.getMinTime(), item.getVThd(), overlimit.getUaberrance()); - } - } - } - } - //三相电压不平衡度 - if (!CollectionUtils.isEmpty(dataVPOUnbalanceList)) { - for (DataVDto item : dataVPOUnbalanceList) { - if (ObjectUtil.isNotNull(item.getVUnbalance())) { - if(item.getVUnbalance() > overlimit.getUbalance()){ - addAbnormalData(uAberrance, item.getPhasicType(), item.getValueType(), item.getMinTime(), item.getVUnbalance(), overlimit.getUbalance()); - } - } - } - } - //负序电流 - if (!CollectionUtils.isEmpty(dataIPONegList)) { - for (DataIDto item : dataIPONegList) { - if(ObjectUtil.isNotNull(item.getINeg())){ - if (item.getINeg() > overlimit.getINeg()) { - addAbnormalData(iNeg, item.getPhasicType(), item.getValueType(), item.getMinTime(), item.getINeg(), overlimit.getINeg()); - } - } - } - } - //频率偏差 - if (!CollectionUtils.isEmpty(dataVPOFreqList)) { - for (DataVDto item : dataVPOFreqList) { - if (ObjectUtil.isNotNull(item.getFreqDev())) { - if(item.getFreqDev() > overlimit.getFreqDev()){ - addAbnormalData(freqDev, item.getPhasicType(), item.getValueType(), item.getMinTime(), item.getFreqDev(), overlimit.getFreqDev()); - } - } - } - } - - //电压上偏差、电压下偏差(根据vl_dev的正负判断是用哪个值判断越限) - if (!CollectionUtils.isEmpty(dataVPODevList)) { - for (DataVDto item : dataVPODevList) { - if(ObjectUtil.isNotNull(item.getVlDev())){ - if (item.getVlDev() >= 0) { - if (item.getVlDev() > overlimit.getVoltageDev()) { - addAbnormalData(uDev, item.getPhasicType(), item.getMinTime(), item.getValueType(), item.getVlDev(), overlimit.getVoltageDev()); - } - } else { - if (Math.abs(item.getVuDev()) > Math.abs(overlimit.getUvoltageDev())) { - addAbnormalData(uDev, item.getPhasicType(), item.getMinTime(), item.getValueType(), item.getVuDev(), overlimit.getUvoltageDev()); - } - } - } - - } - } - //长时间闪变 - if (!CollectionUtils.isEmpty(dataPltPOList)) { - for (DataPltDto item : dataPltPOList) { - if (ObjectUtil.isNotNull(item.getPlt())) { - if(item.getPlt() > overlimit.getFlicker()){ - addAbnormalData(flicker, item.getPhasicType(), item.getValueType(), item.getMinTime(), item.getPlt(), overlimit.getFlicker()); - } - } - } - } - limitRate.setLineId(lineId); - limitRate.setTime(LocalDateTimeUtil.parseDate(dataDate, DatePattern.NORM_DATE_PATTERN)); - limitRate.setPhasicType(PhaseType.PHASE_T); - limitRate.setAllTime(allTime); - limitRate.setFlickerAllTime(flickerAllTime); - limitRate.setUaberranceOvertime(thd.stream().map(AbnormalData::getTime).distinct().collect(Collectors.toList()).size()); - limitRate.setINegOvertime(iNeg.stream().map(AbnormalData::getTime).distinct().collect(Collectors.toList()).size()); - limitRate.setFreqDevOvertime(freqDev.stream().map(AbnormalData::getTime).distinct().collect(Collectors.toList()).size()); - limitRate.setUbalanceOvertime(uAberrance.stream().map(AbnormalData::getTime).distinct().collect(Collectors.toList()).size()); - limitRate.setVoltageDevOvertime(uDev.stream().map(AbnormalData::getTime).distinct().collect(Collectors.toList()).size()); - limitRate.setFlickerOvertime(flicker.stream().map(AbnormalData::getTime).distinct().collect(Collectors.toList()).size()); - limitRate.setUharm2Overtime(v[0].stream().map(AbnormalData::getTime).distinct().collect(Collectors.toList()).size()); - limitRate.setUharm3Overtime(v[1].stream().map(AbnormalData::getTime).distinct().collect(Collectors.toList()).size()); - limitRate.setUharm4Overtime(v[2].stream().map(AbnormalData::getTime).distinct().collect(Collectors.toList()).size()); - limitRate.setUharm5Overtime(v[3].stream().map(AbnormalData::getTime).distinct().collect(Collectors.toList()).size()); - limitRate.setUharm6Overtime(v[4].stream().map(AbnormalData::getTime).distinct().collect(Collectors.toList()).size()); - limitRate.setUharm7Overtime(v[5].stream().map(AbnormalData::getTime).distinct().collect(Collectors.toList()).size()); - limitRate.setUharm8Overtime(v[6].stream().map(AbnormalData::getTime).distinct().collect(Collectors.toList()).size()); - limitRate.setUharm9Overtime(v[7].stream().map(AbnormalData::getTime).distinct().collect(Collectors.toList()).size()); - limitRate.setUharm10Overtime(v[8].stream().map(AbnormalData::getTime).distinct().collect(Collectors.toList()).size()); - limitRate.setUharm11Overtime(v[9].stream().map(AbnormalData::getTime).distinct().collect(Collectors.toList()).size()); - limitRate.setUharm12Overtime(v[10].stream().map(AbnormalData::getTime).distinct().collect(Collectors.toList()).size()); - limitRate.setUharm13Overtime(v[11].stream().map(AbnormalData::getTime).distinct().collect(Collectors.toList()).size()); - limitRate.setUharm14Overtime(v[12].stream().map(AbnormalData::getTime).distinct().collect(Collectors.toList()).size()); - limitRate.setUharm15Overtime(v[13].stream().map(AbnormalData::getTime).distinct().collect(Collectors.toList()).size()); - limitRate.setUharm16Overtime(v[14].stream().map(AbnormalData::getTime).distinct().collect(Collectors.toList()).size()); - limitRate.setUharm17Overtime(v[15].stream().map(AbnormalData::getTime).distinct().collect(Collectors.toList()).size()); - limitRate.setUharm18Overtime(v[16].stream().map(AbnormalData::getTime).distinct().collect(Collectors.toList()).size()); - limitRate.setUharm19Overtime(v[17].stream().map(AbnormalData::getTime).distinct().collect(Collectors.toList()).size()); - limitRate.setUharm20Overtime(v[18].stream().map(AbnormalData::getTime).distinct().collect(Collectors.toList()).size()); - limitRate.setUharm21Overtime(v[19].stream().map(AbnormalData::getTime).distinct().collect(Collectors.toList()).size()); - limitRate.setUharm22Overtime(v[20].stream().map(AbnormalData::getTime).distinct().collect(Collectors.toList()).size()); - limitRate.setUharm23Overtime(v[21].stream().map(AbnormalData::getTime).distinct().collect(Collectors.toList()).size()); - limitRate.setUharm24Overtime(v[22].stream().map(AbnormalData::getTime).distinct().collect(Collectors.toList()).size()); - limitRate.setUharm25Overtime(v[23].stream().map(AbnormalData::getTime).distinct().collect(Collectors.toList()).size()); - limitRate.setIharm2Overtime(i[0].stream().map(AbnormalData::getTime).distinct().collect(Collectors.toList()).size()); - limitRate.setIharm3Overtime(i[1].stream().map(AbnormalData::getTime).distinct().collect(Collectors.toList()).size()); - limitRate.setIharm4Overtime(i[2].stream().map(AbnormalData::getTime).distinct().collect(Collectors.toList()).size()); - limitRate.setIharm5Overtime(i[3].stream().map(AbnormalData::getTime).distinct().collect(Collectors.toList()).size()); - limitRate.setIharm6Overtime(i[4].stream().map(AbnormalData::getTime).distinct().collect(Collectors.toList()).size()); - limitRate.setIharm7Overtime(i[5].stream().map(AbnormalData::getTime).distinct().collect(Collectors.toList()).size()); - limitRate.setIharm8Overtime(i[6].stream().map(AbnormalData::getTime).distinct().collect(Collectors.toList()).size()); - limitRate.setIharm9Overtime(i[7].stream().map(AbnormalData::getTime).distinct().collect(Collectors.toList()).size()); - limitRate.setIharm10Overtime(i[8].stream().map(AbnormalData::getTime).distinct().collect(Collectors.toList()).size()); - limitRate.setIharm11Overtime(i[9].stream().map(AbnormalData::getTime).distinct().collect(Collectors.toList()).size()); - limitRate.setIharm12Overtime(i[10].stream().map(AbnormalData::getTime).distinct().collect(Collectors.toList()).size()); - limitRate.setIharm13Overtime(i[11].stream().map(AbnormalData::getTime).distinct().collect(Collectors.toList()).size()); - limitRate.setIharm14Overtime(i[12].stream().map(AbnormalData::getTime).distinct().collect(Collectors.toList()).size()); - limitRate.setIharm15Overtime(i[13].stream().map(AbnormalData::getTime).distinct().collect(Collectors.toList()).size()); - limitRate.setIharm16Overtime(i[14].stream().map(AbnormalData::getTime).distinct().collect(Collectors.toList()).size()); - limitRate.setIharm17Overtime(i[15].stream().map(AbnormalData::getTime).distinct().collect(Collectors.toList()).size()); - limitRate.setIharm18Overtime(i[16].stream().map(AbnormalData::getTime).distinct().collect(Collectors.toList()).size()); - limitRate.setIharm19Overtime(i[17].stream().map(AbnormalData::getTime).distinct().collect(Collectors.toList()).size()); - limitRate.setIharm20Overtime(i[18].stream().map(AbnormalData::getTime).distinct().collect(Collectors.toList()).size()); - limitRate.setIharm21Overtime(i[19].stream().map(AbnormalData::getTime).distinct().collect(Collectors.toList()).size()); - limitRate.setIharm22Overtime(i[20].stream().map(AbnormalData::getTime).distinct().collect(Collectors.toList()).size()); - limitRate.setIharm23Overtime(i[21].stream().map(AbnormalData::getTime).distinct().collect(Collectors.toList()).size()); - limitRate.setIharm24Overtime(i[22].stream().map(AbnormalData::getTime).distinct().collect(Collectors.toList()).size()); - limitRate.setIharm25Overtime(i[23].stream().map(AbnormalData::getTime).distinct().collect(Collectors.toList()).size()); - limitRate.setInuharm1Overtime(uHarm[0].stream().map(AbnormalData::getTime).distinct().collect(Collectors.toList()).size()); - limitRate.setInuharm2Overtime(uHarm[1].stream().map(AbnormalData::getTime).distinct().collect(Collectors.toList()).size()); - limitRate.setInuharm3Overtime(uHarm[2].stream().map(AbnormalData::getTime).distinct().collect(Collectors.toList()).size()); - limitRate.setInuharm4Overtime(uHarm[3].stream().map(AbnormalData::getTime).distinct().collect(Collectors.toList()).size()); - limitRate.setInuharm5Overtime(uHarm[4].stream().map(AbnormalData::getTime).distinct().collect(Collectors.toList()).size()); - limitRate.setInuharm6Overtime(uHarm[5].stream().map(AbnormalData::getTime).distinct().collect(Collectors.toList()).size()); - limitRate.setInuharm7Overtime(uHarm[6].stream().map(AbnormalData::getTime).distinct().collect(Collectors.toList()).size()); - limitRate.setInuharm8Overtime(uHarm[7].stream().map(AbnormalData::getTime).distinct().collect(Collectors.toList()).size()); - limitRate.setInuharm9Overtime(uHarm[8].stream().map(AbnormalData::getTime).distinct().collect(Collectors.toList()).size()); - limitRate.setInuharm10Overtime(uHarm[9].stream().map(AbnormalData::getTime).distinct().collect(Collectors.toList()).size()); - limitRate.setInuharm11Overtime(uHarm[10].stream().map(AbnormalData::getTime).distinct().collect(Collectors.toList()).size()); - limitRate.setInuharm12Overtime(uHarm[11].stream().map(AbnormalData::getTime).distinct().collect(Collectors.toList()).size()); - limitRate.setInuharm13Overtime(uHarm[12].stream().map(AbnormalData::getTime).distinct().collect(Collectors.toList()).size()); - limitRate.setInuharm14Overtime(uHarm[13].stream().map(AbnormalData::getTime).distinct().collect(Collectors.toList()).size()); - limitRate.setInuharm15Overtime(uHarm[14].stream().map(AbnormalData::getTime).distinct().collect(Collectors.toList()).size()); - limitRate.setInuharm16Overtime(uHarm[15].stream().map(AbnormalData::getTime).distinct().collect(Collectors.toList()).size()); - dto.setDataLimitRate(limitRate); - - int detailAllTime = flicker.size() + uAberrance.size() + iNeg.size() + freqDev.size() + thd.size() + uDev.size() + - v[0].size() + v[1].size() + v[2].size() + v[3].size() + v[4].size() + v[5].size() + v[6].size() + v[7].size() + v[8].size() + v[9].size() + v[11].size() + v[12].size() + v[13].size() + v[14].size() + v[15].size() + v[16].size() + v[17].size() + v[18].size() + v[19].size() + v[20].size() + v[21].size() + v[22].size() + v[23].size() + - i[0].size() + i[1].size() + i[2].size() + i[3].size() + i[4].size() + i[5].size() + i[6].size() + i[7].size() + i[8].size() + i[9].size() + i[10].size() + i[11].size() + i[12].size() + i[13].size() + i[14].size() + i[15].size() + i[16].size() + i[17].size() + i[18].size() + i[19].size() + i[20].size() + i[21].size() + i[22].size() + i[23].size() + - uHarm[0].size() + uHarm[1].size() + uHarm[2].size() + uHarm[3].size() + uHarm[4].size() + uHarm[5].size() + uHarm[6].size() + uHarm[7].size() + uHarm[8].size() + uHarm[9].size() + uHarm[10].size() + uHarm[11].size() + uHarm[12].size() + uHarm[13].size() + uHarm[14].size() + uHarm[15].size(); - if (detailAllTime > 0) { - DataLimitRateDetailDto detail = new DataLimitRateDetailDto(); - detail.setLineId(lineId); - detail.setTime(LocalDateTimeUtil.parseDate(dataDate, DatePattern.NORM_DATE_PATTERN)); - detail.setFlickerOvertime(toJson(flicker)); - detail.setUaberranceOvertime(toJson(uAberrance)); - detail.setINegOvertime(toJson(iNeg)); - detail.setFreqDevOvertime(toJson(freqDev)); - detail.setUbalanceOvertime(toJson(thd)); - detail.setVoltageDevOvertime(toJson(uDev)); - detail.setUharm2Overtime(toJson(v[0])); - detail.setUharm3Overtime(toJson(v[1])); - detail.setUharm4Overtime(toJson(v[2])); - detail.setUharm5Overtime(toJson(v[3])); - detail.setUharm6Overtime(toJson(v[4])); - detail.setUharm7Overtime(toJson(v[5])); - detail.setUharm8Overtime(toJson(v[6])); - detail.setUharm9Overtime(toJson(v[7])); - detail.setUharm10Overtime(toJson(v[8])); - detail.setUharm11Overtime(toJson(v[9])); - detail.setUharm12Overtime(toJson(v[10])); - detail.setUharm13Overtime(toJson(v[11])); - detail.setUharm14Overtime(toJson(v[12])); - detail.setUharm15Overtime(toJson(v[13])); - detail.setUharm16Overtime(toJson(v[14])); - detail.setUharm17Overtime(toJson(v[15])); - detail.setUharm18Overtime(toJson(v[16])); - detail.setUharm19Overtime(toJson(v[17])); - detail.setUharm20Overtime(toJson(v[18])); - detail.setUharm21Overtime(toJson(v[19])); - detail.setUharm22Overtime(toJson(v[20])); - detail.setUharm23Overtime(toJson(v[21])); - detail.setUharm24Overtime(toJson(v[22])); - detail.setUharm25Overtime(toJson(v[23])); - detail.setIharm2Overtime(toJson(i[0])); - detail.setIharm3Overtime(toJson(i[1])); - detail.setIharm4Overtime(toJson(i[2])); - detail.setIharm5Overtime(toJson(i[3])); - detail.setIharm6Overtime(toJson(i[4])); - detail.setIharm7Overtime(toJson(i[5])); - detail.setIharm8Overtime(toJson(i[6])); - detail.setIharm9Overtime(toJson(i[7])); - detail.setIharm10Overtime(toJson(i[8])); - detail.setIharm11Overtime(toJson(i[9])); - detail.setIharm12Overtime(toJson(i[10])); - detail.setIharm13Overtime(toJson(i[11])); - detail.setIharm14Overtime(toJson(i[12])); - detail.setIharm15Overtime(toJson(i[13])); - detail.setIharm16Overtime(toJson(i[14])); - detail.setIharm17Overtime(toJson(i[15])); - detail.setIharm18Overtime(toJson(i[16])); - detail.setIharm19Overtime(toJson(i[17])); - detail.setIharm20Overtime(toJson(i[18])); - detail.setIharm21Overtime(toJson(i[19])); - detail.setIharm22Overtime(toJson(i[20])); - detail.setIharm23Overtime(toJson(i[21])); - detail.setIharm24Overtime(toJson(i[22])); - detail.setIharm25Overtime(toJson(i[23])); - detail.setInuharm1Overtime(toJson(uHarm[0])); - detail.setInuharm2Overtime(toJson(uHarm[1])); - detail.setInuharm3Overtime(toJson(uHarm[2])); - detail.setInuharm4Overtime(toJson(uHarm[3])); - detail.setInuharm5Overtime(toJson(uHarm[4])); - detail.setInuharm6Overtime(toJson(uHarm[5])); - detail.setInuharm7Overtime(toJson(uHarm[6])); - detail.setInuharm8Overtime(toJson(uHarm[7])); - detail.setInuharm9Overtime(toJson(uHarm[8])); - detail.setInuharm10Overtime(toJson(uHarm[9])); - detail.setInuharm11Overtime(toJson(uHarm[10])); - detail.setInuharm12Overtime(toJson(uHarm[11])); - detail.setInuharm13Overtime(toJson(uHarm[12])); - detail.setInuharm14Overtime(toJson(uHarm[13])); - detail.setInuharm15Overtime(toJson(uHarm[14])); - detail.setInuharm16Overtime(toJson(uHarm[15])); - dto.setDataLimitRateDetail(detail); - } - return dto; - } - - - private DataLimitRateDto getDataLimitRateDto(DataLimitRateDto limitRate, List[] v, List[] i, List[] uHarm) { - limitRate.setUharm2Overtime(v[0].size()); - limitRate.setUharm3Overtime(v[1].size()); - limitRate.setUharm4Overtime(v[2].size()); - limitRate.setUharm5Overtime(v[3].size()); - limitRate.setUharm6Overtime(v[4].size()); - limitRate.setUharm7Overtime(v[5].size()); - limitRate.setUharm8Overtime(v[6].size()); - limitRate.setUharm9Overtime(v[7].size()); - limitRate.setUharm10Overtime(v[8].size()); - limitRate.setUharm11Overtime(v[9].size()); - limitRate.setUharm12Overtime(v[10].size()); - limitRate.setUharm13Overtime(v[11].size()); - limitRate.setUharm14Overtime(v[12].size()); - limitRate.setUharm15Overtime(v[13].size()); - limitRate.setUharm16Overtime(v[14].size()); - limitRate.setUharm17Overtime(v[15].size()); - limitRate.setUharm18Overtime(v[16].size()); - limitRate.setUharm19Overtime(v[17].size()); - limitRate.setUharm20Overtime(v[18].size()); - limitRate.setUharm21Overtime(v[19].size()); - limitRate.setUharm22Overtime(v[20].size()); - limitRate.setUharm23Overtime(v[21].size()); - limitRate.setUharm24Overtime(v[22].size()); - limitRate.setUharm25Overtime(v[23].size()); - limitRate.setIharm2Overtime(i[0].size()); - limitRate.setIharm3Overtime(i[1].size()); - limitRate.setIharm4Overtime(i[2].size()); - limitRate.setIharm5Overtime(i[3].size()); - limitRate.setIharm6Overtime(i[4].size()); - limitRate.setIharm7Overtime(i[5].size()); - limitRate.setIharm8Overtime(i[6].size()); - limitRate.setIharm9Overtime(i[7].size()); - limitRate.setIharm10Overtime(i[8].size()); - limitRate.setIharm11Overtime(i[9].size()); - limitRate.setIharm12Overtime(i[10].size()); - limitRate.setIharm13Overtime(i[11].size()); - limitRate.setIharm14Overtime(i[12].size()); - limitRate.setIharm15Overtime(i[13].size()); - limitRate.setIharm16Overtime(i[14].size()); - limitRate.setIharm17Overtime(i[15].size()); - limitRate.setIharm18Overtime(i[16].size()); - limitRate.setIharm19Overtime(i[17].size()); - limitRate.setIharm20Overtime(i[18].size()); - limitRate.setIharm21Overtime(i[19].size()); - limitRate.setIharm22Overtime(i[20].size()); - limitRate.setIharm23Overtime(i[21].size()); - limitRate.setIharm24Overtime(i[22].size()); - limitRate.setIharm25Overtime(i[23].size()); - limitRate.setInuharm1Overtime(uHarm[0].size()); - limitRate.setInuharm2Overtime(uHarm[1].size()); - limitRate.setInuharm3Overtime(uHarm[2].size()); - limitRate.setInuharm4Overtime(uHarm[3].size()); - limitRate.setInuharm5Overtime(uHarm[4].size()); - limitRate.setInuharm6Overtime(uHarm[5].size()); - limitRate.setInuharm7Overtime(uHarm[6].size()); - limitRate.setInuharm8Overtime(uHarm[7].size()); - limitRate.setInuharm9Overtime(uHarm[8].size()); - limitRate.setInuharm10Overtime(uHarm[9].size()); - limitRate.setInuharm11Overtime(uHarm[10].size()); - limitRate.setInuharm12Overtime(uHarm[11].size()); - limitRate.setInuharm13Overtime(uHarm[12].size()); - limitRate.setInuharm14Overtime(uHarm[13].size()); - limitRate.setInuharm15Overtime(uHarm[14].size()); - limitRate.setInuharm16Overtime(uHarm[15].size()); - return limitRate; - } - - private String toJson(List list) { - Map> abnormalMap = list.stream().collect(Collectors.groupingBy(x -> x.getPhasic() + "_" + x.getValueType())); - List info = new ArrayList<>(); - abnormalMap.forEach((key, value) -> { - String[] split = key.split("_"); - AbnormalData.Json json = new AbnormalData.Json(); - json.setPhasic(split[0]); - json.setValueType(split[1]); - json.setTime(String.join(",", value.stream() - .map(abnormal -> abnormal.getTime()) - .collect(Collectors.toList()))); - json.setValue(String.join(",", value.stream() - .map(abnormal -> abnormal.getValue() + "") - .collect(Collectors.toList()))); - json.setOverLimitValue(list.get(0).getOverLimitValue()); - info.add(json); - }); - if (CollUtil.isNotEmpty(info)) { - return JSON.toJSONString(info); - } - return null; - } - - private void addAbnormalData(List list, String phasicType, String valueType, String time, Double value, float overLimitValue) { - AbnormalData data = new AbnormalData(); - data.setTime(time.substring(11, time.length())); - data.setPhasic(phasicType); - data.setValueType(valueType); - data.setValue(value); - data.setOverLimitValue(overLimitValue); - list.add(data); - } - - private void chanelData(DataLimitRateDto limitRate, DataLimitTargetDto limitTarget) { //有一个指标超标,allTime则为1 int allTime = limitRate.getFreqDevOvertime() + limitRate.getVoltageDevOvertime() + limitRate.getUbalanceOvertime() + limitRate.getUaberranceOvertime() + limitRate.getINegOvertime(); diff --git a/algorithm/algorithm-boot/src/main/java/com/njcn/algorithm/serviceimpl/line/IDataLimitRateAsyncImpl.java b/algorithm/algorithm-boot/src/main/java/com/njcn/algorithm/serviceimpl/line/IDataLimitRateAsyncImpl.java new file mode 100644 index 0000000..40e4641 --- /dev/null +++ b/algorithm/algorithm-boot/src/main/java/com/njcn/algorithm/serviceimpl/line/IDataLimitRateAsyncImpl.java @@ -0,0 +1,870 @@ +package com.njcn.algorithm.serviceimpl.line; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.date.DatePattern; +import cn.hutool.core.date.LocalDateTimeUtil; +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSON; +import com.njcn.algorithm.service.line.IDataLimitRateAsync; +import com.njcn.algorithm.utils.MemorySizeUtil; +import com.njcn.dataProcess.api.*; +import com.njcn.dataProcess.constant.PhaseType; +import com.njcn.dataProcess.param.LineCountEvaluateParam; +import com.njcn.dataProcess.pojo.dto.*; +import com.njcn.dataProcess.util.TimeUtils; +import com.njcn.device.biz.pojo.po.Overlimit; +import com.njcn.influx.constant.InfluxDbSqlConstant; +import com.njcn.influx.pojo.constant.InfluxDBTableConstant; +import lombok.extern.slf4j.Slf4j; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.scheduling.annotation.Async; +import org.springframework.stereotype.Service; +import org.springframework.util.CollectionUtils; + +import javax.annotation.Resource; +import java.lang.reflect.Method; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +/** + * @author wr + * @description + * @date 2025/12/17 10:56 + */ +@Slf4j +@Service +public class IDataLimitRateAsyncImpl implements IDataLimitRateAsync { + + private static final Logger logger = LoggerFactory.getLogger(IDataLimitRateAsyncImpl.class); + + @Resource + private DataVFeignClient dataVFeignClient; + @Resource + private DataIFeignClient dataIFeignClient; + @Resource + private DataPltFeignClient dataPltFeignClient; + @Resource + private DataInharmVFeignClient dataInharmVFeignClient; + @Resource + private DataHarmRateVFeignClient dataHarmRateVFeignClient; + @Resource + private DataLimitRateFeignClient dataLimitRateFeignClient; + @Resource + private DataLimitRateDetailFeignClient dataLimitRateDetailFeignClient; + + + @Override + @Async("asyncExecutor") + public void lineDataRate(String dataDate, + List list, + List phase, + Map overLimitMap, + int size, + int i) { + List result = new ArrayList<>(); + LineCountEvaluateParam lineParam = new LineCountEvaluateParam(); + lineParam.setStartTime(TimeUtils.getBeginOfDay(dataDate)); + lineParam.setEndTime(TimeUtils.getEndOfDay(dataDate)); + lineParam.setLineId(list); + //获取电压数据 + List dataVAllTime = dataVFeignClient.getRawData(lineParam).getData(); + //闪变数据 + List dataPltAllTime = dataPltFeignClient.getRawData(lineParam).getData(); + //谐波数据 + List dataVHarmList = dataHarmRateVFeignClient.getRawData(lineParam).getData(); + //间谐波数据 + List dataVInHarmList = dataInharmVFeignClient.getRawData(lineParam).getData(); + //电流数据 + List dataIList = dataIFeignClient.getRawData(lineParam).getData(); + /** + * 功能描述:获取influxDB -> data_v -> + * 总计算次数(用data_v中phasic_type=A,value_type=avg,quality_flag=0来参与统计) + */ + Map> allTime = dataVAllTime.stream() + .filter(x -> PhaseType.PHASE_A.equals(x.getPhasicType())) + .filter(x -> InfluxDbSqlConstant.AVG_WEB.equalsIgnoreCase(x.getValueType())) + .collect(Collectors.groupingBy(DataVDto::getLineId)); + + /** + * 功能描述:获取influxDB -> data_plt -> + * 闪变总计算次数(用data_plt中phasic_type=A,value_type=avg,quality_flag=0来参与统计) + */ + //fixme 冀北现场 闪变原始表没有 value_type 这个参数 + Map> pltAllTime = dataPltAllTime.stream() + .filter(x -> PhaseType.PHASE_A.equals(x.getPhasicType())) +// .filter(x -> InfluxDbSqlConstant.AVG_WEB.equalsIgnoreCase(x.getValueType())) + .collect(Collectors.groupingBy(DataPltDto::getLineId)); + + /** + *功能描述:获取influxDB -> data_harmrate_v -> + * 2-25次谐波电压含有率 -> A相||B相||C相的日95%概率值 + */ + Map> harmRateV = dataVHarmList.stream() + .filter(x -> phase.contains(x.getPhasicType())) + .filter(x -> InfluxDBTableConstant.CP95.equals(x.getValueType())) + .collect(Collectors.groupingBy(DataHarmDto::getLineId)); + + /** + * 功能描述:获取influxDB -> data_i -> 2-25次谐波电流 -> 日95%概率值 + */ + Map> dataI = dataIList.stream() + .filter(x -> phase.contains(x.getPhasicType())) + .filter(x -> InfluxDBTableConstant.CP95.equals(x.getValueType())) + .collect(Collectors.groupingBy(DataIDto::getLineId)); + + + /** + * 功能描述:获取influxDB -> data_inharm_v -> 0.5-15.5次间谐波电压含有率 -> 日95%概率值 + */ + Map> inHarmV = dataVInHarmList.stream() + .filter(x -> phase.contains(x.getPhasicType())) + .filter(x -> InfluxDBTableConstant.CP95.equals(x.getValueType())) + .collect(Collectors.groupingBy(DataHarmDto::getLineId)); + + /** + * 功能描述:获取influxDB -> data_v -> 电压总谐波畸变率 -> 日95%概率值 + */ + Map> dataVThd = dataVAllTime.stream() + .filter(x -> phase.contains(x.getPhasicType())) + .filter(x -> InfluxDBTableConstant.CP95.equals(x.getValueType())) + .collect(Collectors.groupingBy(DataVDto::getLineId)); + + /** + * 功能描述:获取influxDB -> data_v -> 负序电压不平衡度 -> 最大值 && 日95%概率值 + */ + Map> dataVUnbalance = dataVAllTime.stream() + .filter(x -> InfluxDBTableConstant.PHASE_TYPE_T.equals(x.getPhasicType())) + .filter(x -> InfluxDBTableConstant.CP95.equals(x.getValueType()) || + InfluxDBTableConstant.MAX.equals(x.getValueType())) + .collect(Collectors.groupingBy(DataVDto::getLineId)); + + /** + * 功能描述:获取influxDB -> data_i -> 负序电流 -> 最大值 && 日95%概率值 + */ + Map> dataINeg = dataIList.stream() + .filter(x -> InfluxDBTableConstant.PHASE_TYPE_T.equals(x.getPhasicType())) + .filter(x -> InfluxDBTableConstant.CP95.equals(x.getValueType()) || + InfluxDBTableConstant.MAX.equals(x.getValueType())) + .collect(Collectors.groupingBy(DataIDto::getLineId)); + + /** + * 功能描述:获取influxDB -> data_v -> 频率偏差 -> 最大值 && 最小值 + */ + Map> dataVFreq = dataVAllTime.stream() + .filter(x -> InfluxDBTableConstant.PHASE_TYPE_T.equals(x.getPhasicType())) + .filter(x -> InfluxDBTableConstant.MIN.equals(x.getValueType()) || + InfluxDBTableConstant.MAX.equals(x.getValueType())) + .collect(Collectors.groupingBy(DataVDto::getLineId)); + /** + * 功能描述:获取influxDB -> data_v -> 电压偏差 -> 最大值 + */ + Map> dataVDev = dataVAllTime.stream() + .filter(x -> phase.contains(x.getPhasicType())) + .filter(x -> InfluxDBTableConstant.MAX.equals(x.getValueType())) + .collect(Collectors.groupingBy(DataVDto::getLineId)); + + /** + * 功能描述:获取influxDB -> data_plt -> 长时间闪变 -> 注(取最大值原始算法去掉了,现没有根据最大值比较) + */ + Map> dataPlt = dataPltAllTime.stream() + .filter(x -> phase.contains(x.getPhasicType())) + .collect(Collectors.groupingBy(DataPltDto::getLineId)); + + for (String item : list) { + if (ObjectUtil.isNotNull(overLimitMap.get(item))) { + result.addAll(getData(dataDate, + overLimitMap.get(item), + allTime.get(item), + pltAllTime.get(item), + harmRateV.get(item), + dataI.get(item), + inHarmV.get(item), + dataVThd.get(item), + dataVUnbalance.get(item), + dataINeg.get(item), + dataVFreq.get(item), + dataVDev.get(item), + dataPlt.get(item))); + } + } + if (CollUtil.isNotEmpty(result)) { + //存储数据 + List dataLimitRate = result.stream().map(DataLimitDetailDto::getDataLimitRate).filter(ObjectUtil::isNotNull).collect(Collectors.toList()); + if (CollUtil.isNotEmpty(dataLimitRate)) { + dataLimitRateFeignClient.batchInsertion(dataLimitRate); + } + } + if (CollUtil.isNotEmpty(result)) { + //存储数据 + List detail = result.stream().map(DataLimitDetailDto::getDataLimitRateDetail).filter(x -> ObjectUtil.isNotNull(x)).collect(Collectors.toList()); + if (CollUtil.isNotEmpty(detail)) { + dataLimitRateDetailFeignClient.batchInsertion(detail); + } + } + logger.info(dataDate + " 总分区数据:" + size + "=====》当前第" + i + "小分区已完成!"); + result = null; + if(i==size){ + MemorySizeUtil.getNowMemory(); + } + System.gc(); + } + + /** + * @Description: getData + * @Param: [overlimit, allTimeList, flickerAllTimeList, dataHarmRateVPOList, dataIPOList, dataInHarmVPOList, dataVPOList, dataVPOUnbalanceList, dataIPONegList, dataVPOFreqList, dataVPODevList, dataPltPOList] + * @return: java.util.List + * @Author: clam + * @Date: 2022/10/18 + */ + private List getData(String dataDate, + Overlimit overlimit, + List allTimeList, + List flickerAllTimeList, + List dataHarmRateVPOList, + List dataIPOList, + List dataInHarmVPOList, + List dataVPOList, + List dataVPOUnbalanceList, + List dataIPONegList, + List dataVPOFreqList, + List dataVPODevList, + List dataPltPOList) { + List result = new ArrayList<>(); + + Map> harmRateVByPhaseType = new HashMap<>(); + Map> dataIByPhaseType = new HashMap<>(); + Map> dataInHarmVPhaseType = new HashMap<>(); + Map> dataVPhaseType = new HashMap<>(); + Map> dataVDevPhaseType = new HashMap<>(); + Map> dataPltPhaseType = new HashMap<>(); + + + Integer allTime = 0; + Integer flickerAllTime = 0; + if (!CollectionUtils.isEmpty(allTimeList)) { + allTime = allTimeList.size(); + } + if (!CollectionUtils.isEmpty(flickerAllTimeList)) { + flickerAllTime = flickerAllTimeList.size(); + } + if (!CollectionUtils.isEmpty(dataHarmRateVPOList)) { + harmRateVByPhaseType = dataHarmRateVPOList.stream().collect(Collectors.groupingBy(DataHarmDto::getPhasicType)); + } + if (!CollectionUtils.isEmpty(dataIPOList)) { + dataIByPhaseType = dataIPOList.stream().collect(Collectors.groupingBy(DataIDto::getPhasicType)); + } + if (!CollectionUtils.isEmpty(dataInHarmVPOList)) { + dataInHarmVPhaseType = dataInHarmVPOList.stream().collect(Collectors.groupingBy(DataHarmDto::getPhasicType)); + } + if (!CollectionUtils.isEmpty(dataVPOList)) { + dataVPhaseType = dataVPOList.stream().collect(Collectors.groupingBy(DataVDto::getPhasicType)); + } + if (!CollectionUtils.isEmpty(dataVPODevList)) { + dataVDevPhaseType = dataVPODevList.stream().collect(Collectors.groupingBy(DataVDto::getPhasicType)); + } + if (!CollectionUtils.isEmpty(dataPltPOList)) { + dataPltPhaseType = dataPltPOList.stream().collect(Collectors.groupingBy(DataPltDto::getPhasicType)); + } + DataLimitDetailDto a = limitRateData(dataDate, overlimit, allTime, flickerAllTime, PhaseType.PHASE_A, overlimit.getId(), harmRateVByPhaseType.get(PhaseType.PHASE_A), dataIByPhaseType.get(PhaseType.PHASE_A), dataInHarmVPhaseType.get(PhaseType.PHASE_A), dataVPhaseType.get(PhaseType.PHASE_A), dataVDevPhaseType.get(PhaseType.PHASE_A), dataPltPhaseType.get(PhaseType.PHASE_A)); + DataLimitDetailDto b = limitRateData(dataDate, overlimit, allTime, flickerAllTime, PhaseType.PHASE_B, overlimit.getId(), harmRateVByPhaseType.get(PhaseType.PHASE_B), dataIByPhaseType.get(PhaseType.PHASE_B), dataInHarmVPhaseType.get(PhaseType.PHASE_B), dataVPhaseType.get(PhaseType.PHASE_B), dataVDevPhaseType.get(PhaseType.PHASE_B), dataPltPhaseType.get(PhaseType.PHASE_B)); + DataLimitDetailDto c = limitRateData(dataDate, overlimit, allTime, flickerAllTime, PhaseType.PHASE_C, overlimit.getId(), harmRateVByPhaseType.get(PhaseType.PHASE_C), dataIByPhaseType.get(PhaseType.PHASE_C), dataInHarmVPhaseType.get(PhaseType.PHASE_C), dataVPhaseType.get(PhaseType.PHASE_C), dataVDevPhaseType.get(PhaseType.PHASE_C), dataPltPhaseType.get(PhaseType.PHASE_C)); + DataLimitDetailDto t = limitRateDataT(dataDate, overlimit, allTime, flickerAllTime, overlimit.getId(), dataHarmRateVPOList, dataIPOList, dataInHarmVPOList, dataVPOList, dataVPOUnbalanceList, dataIPONegList, dataVPOFreqList, dataVPODevList, dataPltPOList); + result.add(a); + result.add(b); + result.add(c); + result.add(t); + return result; + } + + /** + * @Description: limitRateData + * @Param: [overlimit, allTime, flickerAllTime, phasicType, lineId, dataHarmRateVPOList, dataIPOList, dataInHarmVPOList, dataVPOList, dataVUnbalanceList, dataINegList] + * @return: com.njcn.harmonic.pojo.po.LimitRate + * @Author: clam + * @Date: 2022/10/18 + */ + public DataLimitDetailDto limitRateData(String dataDate, + Overlimit overlimit, + Integer allTime, + Integer flickerAllTime, + String phasicType, String lineId, + List dataHarmRateVPOList, + List dataIPOList, + List dataInHarmVPOList, + List dataVPOList, + List dataVPODevList, + List dataPltPOList) { + List thd = new ArrayList<>(), uDev = new ArrayList<>(), flicker = new ArrayList<>(), freqDev = new ArrayList<>(), uAberrance = new ArrayList<>(), iNeg = new ArrayList<>(); + DataLimitDetailDto dto = new DataLimitDetailDto(); + DataLimitRateDto limitRate = new DataLimitRateDto(); + // 初始化 v 系列列表 + List[] v = new List[24]; + for (int i = 0; i < 24; i++) { + v[i] = new ArrayList<>(); + } + // 处理数据 + if (!CollectionUtils.isEmpty(dataHarmRateVPOList)) { + for (DataHarmDto item : dataHarmRateVPOList) { + for (int i = 2; i < 26; i++) { + try { + // 获取 DataHarmDto 类的 getVx 方法 + Method getVMethod = DataHarmDto.class.getMethod("getV" + i); + Double value = (Double) getVMethod.invoke(item); + // 获取 Overlimit 类的 getUharmx 方法 + Method getUharmMethod = Overlimit.class.getMethod("getUharm" + i); + float limit = (float) getUharmMethod.invoke(overlimit); + if (ObjectUtil.isNotNull(value)) { + if (value > limit) { + addAbnormalData(v[i - 2], item.getPhasicType(), item.getValueType(), item.getMinTime(), value, limit); + } + } + } catch (Exception e) { + e.printStackTrace(); + } + } + } + } + + // 初始化 i 系列列表 + List[] i = new List[24]; + for (int j = 0; j < 24; j++) { + i[j] = new ArrayList<>(); + } + // 处理数据 + if (!CollectionUtils.isEmpty(dataIPOList)) { + for (DataIDto item : dataIPOList) { + for (int j = 2; j < 26; j++) { + try { + // 获取 DataHarmDto 类的 getIx 方法 + Method getVMethod = DataIDto.class.getMethod("getI" + j); + Double value = (Double) getVMethod.invoke(item); + // 获取 Overlimit 类的 getUharmx 方法 + Method getUharmMethod = Overlimit.class.getMethod("getIharm" + j); + float limit = (float) getUharmMethod.invoke(overlimit); + if (ObjectUtil.isNotNull(value)) { + if (value > limit) { + addAbnormalData(i[j - 2], item.getValueType(), item.getPhasicType(), item.getMinTime(), value, limit); + } + } + + } catch (Exception e) { + e.printStackTrace(); + } + } + } + } + // 初始化 uHarm 系列列表 + List[] uHarm = new List[16]; + for (int j = 0; j < 16; j++) { + uHarm[j] = new ArrayList<>(); + } + // 处理数据 + if (!CollectionUtils.isEmpty(dataInHarmVPOList)) { + for (DataHarmDto item : dataInHarmVPOList) { + for (int j = 1; j < 17; j++) { + try { + // 获取 DataHarmDto 类的 getVx 方法 + Method getVMethod = DataHarmDto.class.getMethod("getV" + j); + Double value = (Double) getVMethod.invoke(item); + // 获取 Overlimit 类的 getUharmx 方法 + Method getUharmMethod = Overlimit.class.getMethod("getInuharm" + j); + float limit = (float) getUharmMethod.invoke(overlimit); + if (ObjectUtil.isNotNull(value)) { + if (value > limit) { + addAbnormalData(uHarm[j - 1], item.getPhasicType(), item.getValueType(), item.getMinTime(), value, limit); + } + } + } catch (Exception e) { + e.printStackTrace(); + } + } + } + } + //电压总谐波畸变率 + if (!CollectionUtils.isEmpty(dataVPOList)) { + for (DataVDto item : dataVPOList) { + if (ObjectUtil.isNotNull(item.getVThd())) { + if (item.getVThd() > overlimit.getUaberrance()) { + addAbnormalData(thd, item.getPhasicType(), item.getValueType(), item.getMinTime(), item.getVThd(), overlimit.getUaberrance()); + } + } + } + } + //电压上偏差、电压下偏差(根据vl_dev的正负判断是用哪个值判断越限) + if (!CollectionUtils.isEmpty(dataVPODevList)) { + for (DataVDto item : dataVPODevList) { + if (ObjectUtil.isNotNull(item.getVlDev())) { + if (item.getVlDev() >= 0) { + if (item.getVlDev() > overlimit.getVoltageDev()) { + addAbnormalData(uDev, item.getPhasicType(), item.getValueType(), item.getMinTime(), item.getVlDev(), overlimit.getVoltageDev()); + } + } else { + if (Math.abs(item.getVuDev()) > Math.abs(overlimit.getUvoltageDev())) { + addAbnormalData(uDev, item.getPhasicType(), item.getValueType(), item.getMinTime(), item.getVuDev(), overlimit.getUvoltageDev()); + } + } + } + } + } + //长时间闪变 + if (!CollectionUtils.isEmpty(dataPltPOList)) { + for (DataPltDto item : dataPltPOList) { + if (ObjectUtil.isNotNull(item.getPlt())) { + if (item.getPlt() > overlimit.getFlicker()) { + addAbnormalData(flicker, item.getPhasicType(), item.getValueType(), item.getMinTime(), item.getPlt(), overlimit.getFlicker()); + } + } + } + } + limitRate.setLineId(lineId); + limitRate.setTime(LocalDateTimeUtil.parseDate(dataDate, DatePattern.NORM_DATE_PATTERN)); + limitRate.setPhasicType(phasicType); + limitRate.setAllTime(allTime); + limitRate.setFlickerAllTime(flickerAllTime); + + limitRate.setFlickerOvertime(flicker.size()); + limitRate.setUaberranceOvertime(thd.size()); + limitRate.setINegOvertime(iNeg.size()); + limitRate.setFreqDevOvertime(freqDev.size()); + limitRate.setUbalanceOvertime(uAberrance.size()); + limitRate.setVoltageDevOvertime(uDev.size()); + dto.setDataLimitRate(getDataLimitRateDto(limitRate, v, i, uHarm)); + + return dto; + } + + + public DataLimitDetailDto limitRateDataT( + String dataDate, + Overlimit overlimit, + Integer allTime, + Integer flickerAllTime, + String lineId, + List dataHarmRateVPOList, + List dataIPOList, + List dataInHarmVPOList, + List dataVPOList, + List dataVPOUnbalanceList, + List dataIPONegList, + List dataVPOFreqList, + List dataVPODevList, + List dataPltPOList) { + DataLimitDetailDto dto = new DataLimitDetailDto(); + DataLimitRateDto limitRate = new DataLimitRateDto(); + List thd = new ArrayList<>(), uDev = new ArrayList<>(), flicker = new ArrayList<>(), freqDev = new ArrayList<>(), uAberrance = new ArrayList<>(), iNeg = new ArrayList<>(); + // 初始化 v 系列列表 + List[] v = new List[24]; + for (int i = 0; i < 24; i++) { + v[i] = new ArrayList<>(); + } + // 处理数据 + if (!CollectionUtils.isEmpty(dataHarmRateVPOList)) { + for (DataHarmDto item : dataHarmRateVPOList) { + for (int i = 2; i < 26; i++) { + try { + // 获取 DataHarmDto 类的 getVx 方法 + Method getVMethod = DataHarmDto.class.getMethod("getV" + i); + Double value = (Double) getVMethod.invoke(item); + // 获取 Overlimit 类的 getUharmx 方法 + Method getUharmMethod = Overlimit.class.getMethod("getUharm" + i); + float limit = (float) getUharmMethod.invoke(overlimit); + if (ObjectUtil.isNotNull(value)) { + if (value > limit) { + addAbnormalData(v[i - 2], item.getPhasicType(), item.getValueType(), item.getMinTime(), value, limit); + } + } + } catch (Exception e) { + e.printStackTrace(); + } + } + } + } + + // 初始化 i 系列列表 + List[] i = new List[24]; + for (int j = 0; j < 24; j++) { + i[j] = new ArrayList<>(); + } + // 处理数据 + if (!CollectionUtils.isEmpty(dataIPOList)) { + for (DataIDto item : dataIPOList) { + for (int j = 2; j < 26; j++) { + try { + // 获取 DataHarmDto 类的 getIx 方法 + Method getVMethod = DataIDto.class.getMethod("getI" + j); + Double value = (Double) getVMethod.invoke(item); + // 获取 Overlimit 类的 getUharmx 方法 + Method getUharmMethod = Overlimit.class.getMethod("getIharm" + j); + float limit = (float) getUharmMethod.invoke(overlimit); + if (ObjectUtil.isNotNull(value)) { + if (value > limit) { + addAbnormalData(i[j - 2], item.getPhasicType(), item.getValueType(), item.getMinTime(), value, limit); + } + } + } catch (Exception e) { + e.printStackTrace(); + } + } + } + } + // 初始化 uHarm 系列列表 + List[] uHarm = new List[16]; + for (int j = 0; j < 16; j++) { + uHarm[j] = new ArrayList<>(); + } + // 处理数据 + if (!CollectionUtils.isEmpty(dataInHarmVPOList)) { + for (DataHarmDto item : dataInHarmVPOList) { + for (int j = 1; j < 17; j++) { + try { + // 获取 DataHarmDto 类的 getVx 方法 + Method getVMethod = DataHarmDto.class.getMethod("getV" + j); + Double value = (Double) getVMethod.invoke(item); + // 获取 Overlimit 类的 getUharmx 方法 + Method getUharmMethod = Overlimit.class.getMethod("getInuharm" + j); + float limit = (float) getUharmMethod.invoke(overlimit); + if (ObjectUtil.isNotNull(value)) { + if (value > limit) { + addAbnormalData(uHarm[j - 1], item.getPhasicType(), item.getValueType(), item.getMinTime(), value, limit); + } + } + } catch (Exception e) { + e.printStackTrace(); + } + } + } + } + //电压总谐波畸变率 + if (!CollectionUtils.isEmpty(dataVPOList)) { + for (DataVDto item : dataVPOList) { + if (ObjectUtil.isNotNull(item.getVThd())) { + if (item.getVThd() > overlimit.getUaberrance()) { + addAbnormalData(thd, item.getPhasicType(), item.getValueType(), item.getMinTime(), item.getVThd(), overlimit.getUaberrance()); + } + } + } + } + //三相电压不平衡度 + if (!CollectionUtils.isEmpty(dataVPOUnbalanceList)) { + for (DataVDto item : dataVPOUnbalanceList) { + if (ObjectUtil.isNotNull(item.getVUnbalance())) { + if (item.getVUnbalance() > overlimit.getUbalance()) { + addAbnormalData(uAberrance, item.getPhasicType(), item.getValueType(), item.getMinTime(), item.getVUnbalance(), overlimit.getUbalance()); + } + } + } + } + //负序电流 + if (!CollectionUtils.isEmpty(dataIPONegList)) { + for (DataIDto item : dataIPONegList) { + if (ObjectUtil.isNotNull(item.getINeg())) { + if (item.getINeg() > overlimit.getINeg()) { + addAbnormalData(iNeg, item.getPhasicType(), item.getValueType(), item.getMinTime(), item.getINeg(), overlimit.getINeg()); + } + } + } + } + //频率偏差 + if (!CollectionUtils.isEmpty(dataVPOFreqList)) { + for (DataVDto item : dataVPOFreqList) { + if (ObjectUtil.isNotNull(item.getFreqDev())) { + if (item.getFreqDev() > overlimit.getFreqDev()) { + addAbnormalData(freqDev, item.getPhasicType(), item.getValueType(), item.getMinTime(), item.getFreqDev(), overlimit.getFreqDev()); + } + } + } + } + + //电压上偏差、电压下偏差(根据vl_dev的正负判断是用哪个值判断越限) + if (!CollectionUtils.isEmpty(dataVPODevList)) { + for (DataVDto item : dataVPODevList) { + if (ObjectUtil.isNotNull(item.getVlDev())) { + if (item.getVlDev() >= 0) { + if (item.getVlDev() > overlimit.getVoltageDev()) { + addAbnormalData(uDev, item.getPhasicType(), item.getMinTime(), item.getValueType(), item.getVlDev(), overlimit.getVoltageDev()); + } + } else { + if (Math.abs(item.getVuDev()) > Math.abs(overlimit.getUvoltageDev())) { + addAbnormalData(uDev, item.getPhasicType(), item.getMinTime(), item.getValueType(), item.getVuDev(), overlimit.getUvoltageDev()); + } + } + } + + } + } + //长时间闪变 + if (!CollectionUtils.isEmpty(dataPltPOList)) { + for (DataPltDto item : dataPltPOList) { + if (ObjectUtil.isNotNull(item.getPlt())) { + if (item.getPlt() > overlimit.getFlicker()) { + addAbnormalData(flicker, item.getPhasicType(), item.getValueType(), item.getMinTime(), item.getPlt(), overlimit.getFlicker()); + } + } + } + } + limitRate.setLineId(lineId); + limitRate.setTime(LocalDateTimeUtil.parseDate(dataDate, DatePattern.NORM_DATE_PATTERN)); + limitRate.setPhasicType(PhaseType.PHASE_T); + limitRate.setAllTime(allTime); + limitRate.setFlickerAllTime(flickerAllTime); + limitRate.setUaberranceOvertime(thd.stream().map(AbnormalData::getTime).distinct().collect(Collectors.toList()).size()); + limitRate.setINegOvertime(iNeg.stream().map(AbnormalData::getTime).distinct().collect(Collectors.toList()).size()); + limitRate.setFreqDevOvertime(freqDev.stream().map(AbnormalData::getTime).distinct().collect(Collectors.toList()).size()); + limitRate.setUbalanceOvertime(uAberrance.stream().map(AbnormalData::getTime).distinct().collect(Collectors.toList()).size()); + limitRate.setVoltageDevOvertime(uDev.stream().map(AbnormalData::getTime).distinct().collect(Collectors.toList()).size()); + limitRate.setFlickerOvertime(flicker.stream().map(AbnormalData::getTime).distinct().collect(Collectors.toList()).size()); + limitRate.setUharm2Overtime(v[0].stream().map(AbnormalData::getTime).distinct().collect(Collectors.toList()).size()); + limitRate.setUharm3Overtime(v[1].stream().map(AbnormalData::getTime).distinct().collect(Collectors.toList()).size()); + limitRate.setUharm4Overtime(v[2].stream().map(AbnormalData::getTime).distinct().collect(Collectors.toList()).size()); + limitRate.setUharm5Overtime(v[3].stream().map(AbnormalData::getTime).distinct().collect(Collectors.toList()).size()); + limitRate.setUharm6Overtime(v[4].stream().map(AbnormalData::getTime).distinct().collect(Collectors.toList()).size()); + limitRate.setUharm7Overtime(v[5].stream().map(AbnormalData::getTime).distinct().collect(Collectors.toList()).size()); + limitRate.setUharm8Overtime(v[6].stream().map(AbnormalData::getTime).distinct().collect(Collectors.toList()).size()); + limitRate.setUharm9Overtime(v[7].stream().map(AbnormalData::getTime).distinct().collect(Collectors.toList()).size()); + limitRate.setUharm10Overtime(v[8].stream().map(AbnormalData::getTime).distinct().collect(Collectors.toList()).size()); + limitRate.setUharm11Overtime(v[9].stream().map(AbnormalData::getTime).distinct().collect(Collectors.toList()).size()); + limitRate.setUharm12Overtime(v[10].stream().map(AbnormalData::getTime).distinct().collect(Collectors.toList()).size()); + limitRate.setUharm13Overtime(v[11].stream().map(AbnormalData::getTime).distinct().collect(Collectors.toList()).size()); + limitRate.setUharm14Overtime(v[12].stream().map(AbnormalData::getTime).distinct().collect(Collectors.toList()).size()); + limitRate.setUharm15Overtime(v[13].stream().map(AbnormalData::getTime).distinct().collect(Collectors.toList()).size()); + limitRate.setUharm16Overtime(v[14].stream().map(AbnormalData::getTime).distinct().collect(Collectors.toList()).size()); + limitRate.setUharm17Overtime(v[15].stream().map(AbnormalData::getTime).distinct().collect(Collectors.toList()).size()); + limitRate.setUharm18Overtime(v[16].stream().map(AbnormalData::getTime).distinct().collect(Collectors.toList()).size()); + limitRate.setUharm19Overtime(v[17].stream().map(AbnormalData::getTime).distinct().collect(Collectors.toList()).size()); + limitRate.setUharm20Overtime(v[18].stream().map(AbnormalData::getTime).distinct().collect(Collectors.toList()).size()); + limitRate.setUharm21Overtime(v[19].stream().map(AbnormalData::getTime).distinct().collect(Collectors.toList()).size()); + limitRate.setUharm22Overtime(v[20].stream().map(AbnormalData::getTime).distinct().collect(Collectors.toList()).size()); + limitRate.setUharm23Overtime(v[21].stream().map(AbnormalData::getTime).distinct().collect(Collectors.toList()).size()); + limitRate.setUharm24Overtime(v[22].stream().map(AbnormalData::getTime).distinct().collect(Collectors.toList()).size()); + limitRate.setUharm25Overtime(v[23].stream().map(AbnormalData::getTime).distinct().collect(Collectors.toList()).size()); + limitRate.setIharm2Overtime(i[0].stream().map(AbnormalData::getTime).distinct().collect(Collectors.toList()).size()); + limitRate.setIharm3Overtime(i[1].stream().map(AbnormalData::getTime).distinct().collect(Collectors.toList()).size()); + limitRate.setIharm4Overtime(i[2].stream().map(AbnormalData::getTime).distinct().collect(Collectors.toList()).size()); + limitRate.setIharm5Overtime(i[3].stream().map(AbnormalData::getTime).distinct().collect(Collectors.toList()).size()); + limitRate.setIharm6Overtime(i[4].stream().map(AbnormalData::getTime).distinct().collect(Collectors.toList()).size()); + limitRate.setIharm7Overtime(i[5].stream().map(AbnormalData::getTime).distinct().collect(Collectors.toList()).size()); + limitRate.setIharm8Overtime(i[6].stream().map(AbnormalData::getTime).distinct().collect(Collectors.toList()).size()); + limitRate.setIharm9Overtime(i[7].stream().map(AbnormalData::getTime).distinct().collect(Collectors.toList()).size()); + limitRate.setIharm10Overtime(i[8].stream().map(AbnormalData::getTime).distinct().collect(Collectors.toList()).size()); + limitRate.setIharm11Overtime(i[9].stream().map(AbnormalData::getTime).distinct().collect(Collectors.toList()).size()); + limitRate.setIharm12Overtime(i[10].stream().map(AbnormalData::getTime).distinct().collect(Collectors.toList()).size()); + limitRate.setIharm13Overtime(i[11].stream().map(AbnormalData::getTime).distinct().collect(Collectors.toList()).size()); + limitRate.setIharm14Overtime(i[12].stream().map(AbnormalData::getTime).distinct().collect(Collectors.toList()).size()); + limitRate.setIharm15Overtime(i[13].stream().map(AbnormalData::getTime).distinct().collect(Collectors.toList()).size()); + limitRate.setIharm16Overtime(i[14].stream().map(AbnormalData::getTime).distinct().collect(Collectors.toList()).size()); + limitRate.setIharm17Overtime(i[15].stream().map(AbnormalData::getTime).distinct().collect(Collectors.toList()).size()); + limitRate.setIharm18Overtime(i[16].stream().map(AbnormalData::getTime).distinct().collect(Collectors.toList()).size()); + limitRate.setIharm19Overtime(i[17].stream().map(AbnormalData::getTime).distinct().collect(Collectors.toList()).size()); + limitRate.setIharm20Overtime(i[18].stream().map(AbnormalData::getTime).distinct().collect(Collectors.toList()).size()); + limitRate.setIharm21Overtime(i[19].stream().map(AbnormalData::getTime).distinct().collect(Collectors.toList()).size()); + limitRate.setIharm22Overtime(i[20].stream().map(AbnormalData::getTime).distinct().collect(Collectors.toList()).size()); + limitRate.setIharm23Overtime(i[21].stream().map(AbnormalData::getTime).distinct().collect(Collectors.toList()).size()); + limitRate.setIharm24Overtime(i[22].stream().map(AbnormalData::getTime).distinct().collect(Collectors.toList()).size()); + limitRate.setIharm25Overtime(i[23].stream().map(AbnormalData::getTime).distinct().collect(Collectors.toList()).size()); + limitRate.setInuharm1Overtime(uHarm[0].stream().map(AbnormalData::getTime).distinct().collect(Collectors.toList()).size()); + limitRate.setInuharm2Overtime(uHarm[1].stream().map(AbnormalData::getTime).distinct().collect(Collectors.toList()).size()); + limitRate.setInuharm3Overtime(uHarm[2].stream().map(AbnormalData::getTime).distinct().collect(Collectors.toList()).size()); + limitRate.setInuharm4Overtime(uHarm[3].stream().map(AbnormalData::getTime).distinct().collect(Collectors.toList()).size()); + limitRate.setInuharm5Overtime(uHarm[4].stream().map(AbnormalData::getTime).distinct().collect(Collectors.toList()).size()); + limitRate.setInuharm6Overtime(uHarm[5].stream().map(AbnormalData::getTime).distinct().collect(Collectors.toList()).size()); + limitRate.setInuharm7Overtime(uHarm[6].stream().map(AbnormalData::getTime).distinct().collect(Collectors.toList()).size()); + limitRate.setInuharm8Overtime(uHarm[7].stream().map(AbnormalData::getTime).distinct().collect(Collectors.toList()).size()); + limitRate.setInuharm9Overtime(uHarm[8].stream().map(AbnormalData::getTime).distinct().collect(Collectors.toList()).size()); + limitRate.setInuharm10Overtime(uHarm[9].stream().map(AbnormalData::getTime).distinct().collect(Collectors.toList()).size()); + limitRate.setInuharm11Overtime(uHarm[10].stream().map(AbnormalData::getTime).distinct().collect(Collectors.toList()).size()); + limitRate.setInuharm12Overtime(uHarm[11].stream().map(AbnormalData::getTime).distinct().collect(Collectors.toList()).size()); + limitRate.setInuharm13Overtime(uHarm[12].stream().map(AbnormalData::getTime).distinct().collect(Collectors.toList()).size()); + limitRate.setInuharm14Overtime(uHarm[13].stream().map(AbnormalData::getTime).distinct().collect(Collectors.toList()).size()); + limitRate.setInuharm15Overtime(uHarm[14].stream().map(AbnormalData::getTime).distinct().collect(Collectors.toList()).size()); + limitRate.setInuharm16Overtime(uHarm[15].stream().map(AbnormalData::getTime).distinct().collect(Collectors.toList()).size()); + dto.setDataLimitRate(limitRate); + + int detailAllTime = flicker.size() + uAberrance.size() + iNeg.size() + freqDev.size() + thd.size() + uDev.size() + + v[0].size() + v[1].size() + v[2].size() + v[3].size() + v[4].size() + v[5].size() + v[6].size() + v[7].size() + v[8].size() + v[9].size() + v[11].size() + v[12].size() + v[13].size() + v[14].size() + v[15].size() + v[16].size() + v[17].size() + v[18].size() + v[19].size() + v[20].size() + v[21].size() + v[22].size() + v[23].size() + + i[0].size() + i[1].size() + i[2].size() + i[3].size() + i[4].size() + i[5].size() + i[6].size() + i[7].size() + i[8].size() + i[9].size() + i[10].size() + i[11].size() + i[12].size() + i[13].size() + i[14].size() + i[15].size() + i[16].size() + i[17].size() + i[18].size() + i[19].size() + i[20].size() + i[21].size() + i[22].size() + i[23].size() + + uHarm[0].size() + uHarm[1].size() + uHarm[2].size() + uHarm[3].size() + uHarm[4].size() + uHarm[5].size() + uHarm[6].size() + uHarm[7].size() + uHarm[8].size() + uHarm[9].size() + uHarm[10].size() + uHarm[11].size() + uHarm[12].size() + uHarm[13].size() + uHarm[14].size() + uHarm[15].size(); + if (detailAllTime > 0) { + DataLimitRateDetailDto detail = new DataLimitRateDetailDto(); + detail.setLineId(lineId); + detail.setTime(LocalDateTimeUtil.parseDate(dataDate, DatePattern.NORM_DATE_PATTERN)); + detail.setFlickerOvertime(toJson(flicker)); + detail.setUaberranceOvertime(toJson(uAberrance)); + detail.setINegOvertime(toJson(iNeg)); + detail.setFreqDevOvertime(toJson(freqDev)); + detail.setUbalanceOvertime(toJson(thd)); + detail.setVoltageDevOvertime(toJson(uDev)); + detail.setUharm2Overtime(toJson(v[0])); + detail.setUharm3Overtime(toJson(v[1])); + detail.setUharm4Overtime(toJson(v[2])); + detail.setUharm5Overtime(toJson(v[3])); + detail.setUharm6Overtime(toJson(v[4])); + detail.setUharm7Overtime(toJson(v[5])); + detail.setUharm8Overtime(toJson(v[6])); + detail.setUharm9Overtime(toJson(v[7])); + detail.setUharm10Overtime(toJson(v[8])); + detail.setUharm11Overtime(toJson(v[9])); + detail.setUharm12Overtime(toJson(v[10])); + detail.setUharm13Overtime(toJson(v[11])); + detail.setUharm14Overtime(toJson(v[12])); + detail.setUharm15Overtime(toJson(v[13])); + detail.setUharm16Overtime(toJson(v[14])); + detail.setUharm17Overtime(toJson(v[15])); + detail.setUharm18Overtime(toJson(v[16])); + detail.setUharm19Overtime(toJson(v[17])); + detail.setUharm20Overtime(toJson(v[18])); + detail.setUharm21Overtime(toJson(v[19])); + detail.setUharm22Overtime(toJson(v[20])); + detail.setUharm23Overtime(toJson(v[21])); + detail.setUharm24Overtime(toJson(v[22])); + detail.setUharm25Overtime(toJson(v[23])); + detail.setIharm2Overtime(toJson(i[0])); + detail.setIharm3Overtime(toJson(i[1])); + detail.setIharm4Overtime(toJson(i[2])); + detail.setIharm5Overtime(toJson(i[3])); + detail.setIharm6Overtime(toJson(i[4])); + detail.setIharm7Overtime(toJson(i[5])); + detail.setIharm8Overtime(toJson(i[6])); + detail.setIharm9Overtime(toJson(i[7])); + detail.setIharm10Overtime(toJson(i[8])); + detail.setIharm11Overtime(toJson(i[9])); + detail.setIharm12Overtime(toJson(i[10])); + detail.setIharm13Overtime(toJson(i[11])); + detail.setIharm14Overtime(toJson(i[12])); + detail.setIharm15Overtime(toJson(i[13])); + detail.setIharm16Overtime(toJson(i[14])); + detail.setIharm17Overtime(toJson(i[15])); + detail.setIharm18Overtime(toJson(i[16])); + detail.setIharm19Overtime(toJson(i[17])); + detail.setIharm20Overtime(toJson(i[18])); + detail.setIharm21Overtime(toJson(i[19])); + detail.setIharm22Overtime(toJson(i[20])); + detail.setIharm23Overtime(toJson(i[21])); + detail.setIharm24Overtime(toJson(i[22])); + detail.setIharm25Overtime(toJson(i[23])); + detail.setInuharm1Overtime(toJson(uHarm[0])); + detail.setInuharm2Overtime(toJson(uHarm[1])); + detail.setInuharm3Overtime(toJson(uHarm[2])); + detail.setInuharm4Overtime(toJson(uHarm[3])); + detail.setInuharm5Overtime(toJson(uHarm[4])); + detail.setInuharm6Overtime(toJson(uHarm[5])); + detail.setInuharm7Overtime(toJson(uHarm[6])); + detail.setInuharm8Overtime(toJson(uHarm[7])); + detail.setInuharm9Overtime(toJson(uHarm[8])); + detail.setInuharm10Overtime(toJson(uHarm[9])); + detail.setInuharm11Overtime(toJson(uHarm[10])); + detail.setInuharm12Overtime(toJson(uHarm[11])); + detail.setInuharm13Overtime(toJson(uHarm[12])); + detail.setInuharm14Overtime(toJson(uHarm[13])); + detail.setInuharm15Overtime(toJson(uHarm[14])); + detail.setInuharm16Overtime(toJson(uHarm[15])); + dto.setDataLimitRateDetail(detail); + } + return dto; + } + + + private DataLimitRateDto getDataLimitRateDto(DataLimitRateDto limitRate, List[] v, List[] i, List[] uHarm) { + limitRate.setUharm2Overtime(v[0].size()); + limitRate.setUharm3Overtime(v[1].size()); + limitRate.setUharm4Overtime(v[2].size()); + limitRate.setUharm5Overtime(v[3].size()); + limitRate.setUharm6Overtime(v[4].size()); + limitRate.setUharm7Overtime(v[5].size()); + limitRate.setUharm8Overtime(v[6].size()); + limitRate.setUharm9Overtime(v[7].size()); + limitRate.setUharm10Overtime(v[8].size()); + limitRate.setUharm11Overtime(v[9].size()); + limitRate.setUharm12Overtime(v[10].size()); + limitRate.setUharm13Overtime(v[11].size()); + limitRate.setUharm14Overtime(v[12].size()); + limitRate.setUharm15Overtime(v[13].size()); + limitRate.setUharm16Overtime(v[14].size()); + limitRate.setUharm17Overtime(v[15].size()); + limitRate.setUharm18Overtime(v[16].size()); + limitRate.setUharm19Overtime(v[17].size()); + limitRate.setUharm20Overtime(v[18].size()); + limitRate.setUharm21Overtime(v[19].size()); + limitRate.setUharm22Overtime(v[20].size()); + limitRate.setUharm23Overtime(v[21].size()); + limitRate.setUharm24Overtime(v[22].size()); + limitRate.setUharm25Overtime(v[23].size()); + limitRate.setIharm2Overtime(i[0].size()); + limitRate.setIharm3Overtime(i[1].size()); + limitRate.setIharm4Overtime(i[2].size()); + limitRate.setIharm5Overtime(i[3].size()); + limitRate.setIharm6Overtime(i[4].size()); + limitRate.setIharm7Overtime(i[5].size()); + limitRate.setIharm8Overtime(i[6].size()); + limitRate.setIharm9Overtime(i[7].size()); + limitRate.setIharm10Overtime(i[8].size()); + limitRate.setIharm11Overtime(i[9].size()); + limitRate.setIharm12Overtime(i[10].size()); + limitRate.setIharm13Overtime(i[11].size()); + limitRate.setIharm14Overtime(i[12].size()); + limitRate.setIharm15Overtime(i[13].size()); + limitRate.setIharm16Overtime(i[14].size()); + limitRate.setIharm17Overtime(i[15].size()); + limitRate.setIharm18Overtime(i[16].size()); + limitRate.setIharm19Overtime(i[17].size()); + limitRate.setIharm20Overtime(i[18].size()); + limitRate.setIharm21Overtime(i[19].size()); + limitRate.setIharm22Overtime(i[20].size()); + limitRate.setIharm23Overtime(i[21].size()); + limitRate.setIharm24Overtime(i[22].size()); + limitRate.setIharm25Overtime(i[23].size()); + limitRate.setInuharm1Overtime(uHarm[0].size()); + limitRate.setInuharm2Overtime(uHarm[1].size()); + limitRate.setInuharm3Overtime(uHarm[2].size()); + limitRate.setInuharm4Overtime(uHarm[3].size()); + limitRate.setInuharm5Overtime(uHarm[4].size()); + limitRate.setInuharm6Overtime(uHarm[5].size()); + limitRate.setInuharm7Overtime(uHarm[6].size()); + limitRate.setInuharm8Overtime(uHarm[7].size()); + limitRate.setInuharm9Overtime(uHarm[8].size()); + limitRate.setInuharm10Overtime(uHarm[9].size()); + limitRate.setInuharm11Overtime(uHarm[10].size()); + limitRate.setInuharm12Overtime(uHarm[11].size()); + limitRate.setInuharm13Overtime(uHarm[12].size()); + limitRate.setInuharm14Overtime(uHarm[13].size()); + limitRate.setInuharm15Overtime(uHarm[14].size()); + limitRate.setInuharm16Overtime(uHarm[15].size()); + return limitRate; + } + + private String toJson(List list) { + Map> abnormalMap = list.stream().collect(Collectors.groupingBy(x -> x.getPhasic() + "_" + x.getValueType())); + List info = new ArrayList<>(); + abnormalMap.forEach((key, value) -> { + String[] split = key.split("_"); + AbnormalData.Json json = new AbnormalData.Json(); + json.setPhasic(split[0]); + json.setValueType(split[1]); + json.setTime(String.join(",", value.stream() + .map(abnormal -> abnormal.getTime()) + .collect(Collectors.toList()))); + json.setValue(String.join(",", value.stream() + .map(abnormal -> abnormal.getValue() + "") + .collect(Collectors.toList()))); + json.setOverLimitValue(list.get(0).getOverLimitValue()); + info.add(json); + }); + if (CollUtil.isNotEmpty(info)) { + return JSON.toJSONString(info); + } + return null; + } + + private void addAbnormalData(List list, String phasicType, String valueType, String time, Double value, float overLimitValue) { + AbnormalData data = new AbnormalData(); + data.setTime(time.substring(11, time.length())); + data.setPhasic(phasicType); + data.setValueType(valueType); + data.setValue(value); + data.setOverLimitValue(overLimitValue); + list.add(data); + } +} diff --git a/algorithm/algorithm-boot/src/main/java/com/njcn/algorithm/utils/MemorySizeUtil.java b/algorithm/algorithm-boot/src/main/java/com/njcn/algorithm/utils/MemorySizeUtil.java index 0556025..a3b62cc 100644 --- a/algorithm/algorithm-boot/src/main/java/com/njcn/algorithm/utils/MemorySizeUtil.java +++ b/algorithm/algorithm-boot/src/main/java/com/njcn/algorithm/utils/MemorySizeUtil.java @@ -1,9 +1,20 @@ package com.njcn.algorithm.utils; +import cn.hutool.core.collection.CollectionUtil; +import cn.hutool.core.text.StrPool; +import com.njcn.algorithm.pojo.bo.CalculatedParam; +import com.yomahub.liteflow.flow.LiteflowResponse; +import com.yomahub.liteflow.flow.entity.CmpStep; import org.apache.commons.lang.SerializationUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import java.time.LocalDateTime; import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.stream.Collectors; + /** * @Author: cdf @@ -13,6 +24,8 @@ import java.util.List; public class MemorySizeUtil { + private static final Logger logger = LoggerFactory.getLogger(MemorySizeUtil.class); + public static double getObjectSize(List list) { byte[] serialized = SerializationUtils.serialize((java.io.Serializable) list); return (double)serialized.length/1024/1024; @@ -36,5 +49,41 @@ public class MemorySizeUtil { System.out.println("已使用的内存: " + usedMemory / (1024 * 1024) + " MB"); } + /*** + * + * @author hongawen + * @date 2023/11/7 14:44 + */ + public static void dealResponse(CalculatedParam calculatedParam, LiteflowResponse liteflowResponse, String methodDescribe) { + MemorySizeUtil.getNowMemory(); + if (liteflowResponse.isSuccess()) { + // 获取执行步骤列表 + long allTime = 0; + Map> executeSteps = liteflowResponse.getExecuteSteps(); + for (String key : executeSteps.keySet()) { + List cmpSteps = executeSteps.get(key); + long timeSum = cmpSteps.stream().mapToLong(CmpStep::getTimeSpent).sum(); + allTime+=timeSum; + } + logger.info("日期{},{}执行{}成功,执行总时长{}分钟", calculatedParam.getDataDate(), methodDescribe, calculatedParam.isFullChain() ? "全链" : "指定节点:".concat(String.join(StrPool.COMMA, calculatedParam.getTagNames())),allTime/1000/60); + } else { + Map> executeSteps = liteflowResponse.getExecuteSteps(); + CmpStep failStep = null; + for (String key : executeSteps.keySet()) { + List cmpSteps = executeSteps.get(key); + cmpSteps = cmpSteps.stream().filter(cmpStep -> !cmpStep.isSuccess()).collect(Collectors.toList()); + if (CollectionUtil.isNotEmpty(cmpSteps)) { + failStep = cmpSteps.get(0); + } + } + logger.error("日期{},{}执行{}失败,在执行{}失败,失败原因:{}" + , calculatedParam.getDataDate() + , methodDescribe + , calculatedParam.isFullChain() ? "全链" : "指定节点:".concat(String.join(StrPool.COMMA, calculatedParam.getTagNames())) + , failStep.getNodeId().concat(Objects.isNull(failStep.getTag()) ? "" : StrPool.DASHED.concat(failStep.getTag())) + , Objects.isNull(failStep.getException()) ? null : failStep.getException().getMessage()); + } + } + }