增加任务多线程处理方案

This commit is contained in:
wr
2025-12-17 14:04:51 +08:00
parent 1043097a11
commit 63f20da451
10 changed files with 2396 additions and 1644 deletions

View File

@@ -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<String, List<CmpStep>> executeSteps = liteflowResponse.getExecuteSteps();
for (String key : executeSteps.keySet()) {
List<CmpStep> 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<String, List<CmpStep>> executeSteps = liteflowResponse.getExecuteSteps();
CmpStep failStep = null;
for (String key : executeSteps.keySet()) {
List<CmpStep> 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)

View File

@@ -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<String, List<PqReasonableRangeDto>> map,
String dataDate,
DictData dip,
DictData rise,
int size,
int i
);
}

View File

@@ -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);
}

View File

@@ -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<String> list,
List<String> phase,
Map<String, Overlimit> overLimitMap,
int size,
int i);
}

View File

@@ -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<Map<String, Object>> resultData = new ArrayList<>();
Set<String> 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<DataVDto> data1 = dataVFeignClient.getRawData(lineParam).getData();
//dataI
List<DataIDto> data2 = dataIFeignClient.getRawData(lineParam).getData();
//dataPlt
List<DataPltDto> data3 = dataPltFeignClient.getRawData(lineParam).getData();
//dataInHarmV
List<DataHarmDto> data4 = dataInharmVFeignClient.getRawData(lineParam).getData();
//dataHarmRateV
List<DataHarmDto> data5 = dataHarmRateVFeignClient.getRawData(lineParam).getData();
//dataHarmPowerP
List<DataPowerPDto> data6 = dataHarmpowerPFeignClient.getRawData(lineParam).getData();
//dataHarmPhasicV
List<DataHarmDto> data7 = dataHarmphasicVFeignClient.getRawData(lineParam).getData();
//dataFluc
List<DataFlucDto> data8 = dataFlucFeignClient.getRawData(lineParam).getData();
//dataFlicker
List<DataFlickerDto> data9 = dataFlickerFeignClient.getRawData(lineParam).getData();
//获取监测点的暂态事件
List<RmpEventDetailDTO> eventList = rmpEventDetailFeignClient.getRawData(lineParam).getData();
if (CollUtil.isNotEmpty(data1)) {
logger.info("{}数据清洗dataV集合大小为>>>>>>>>>>>>{}", lineParam.getStartTime(), MemorySizeUtil.getObjectSize(data1));
List<PqDataVerify> result = new ArrayList<>();
List<PqReasonableRangeDto> list = map.get(DataCleanEnum.DataV.getCode());
Map<String, PqReasonableRangeDto> pqReasonableRangeDtoMap = list.stream().collect(Collectors.toMap(PqReasonableRangeDto::getIndexCode, Function.identity()));
data1.forEach(data -> {
List<PqDataVerify> pqDataVerifies = judgeDataV(pqReasonableRangeDtoMap, item, data);
result.addAll(pqDataVerifies);
});
if (CollUtil.isNotEmpty(result)) {
Map<String, Object> dtoMap = handleDataV(result, bak, item.getTimeInterval());
Set<String> 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<PqDataVerify> result = new ArrayList<>();
// List<PqReasonableRangeDto> list = map.get(DataCleanEnum.DataI.getCode());
// Map<String, PqReasonableRangeDto> pqReasonableRangeDtoMap = list.stream().collect(Collectors.toMap(PqReasonableRangeDto::getIndexCode, Function.identity()));
// data2.forEach(data -> {
// List<PqDataVerify> pqDataVerifies = judgeDataI(pqReasonableRangeDtoMap, item, data);
// result.addAll(pqDataVerifies);
// });
// if (CollUtil.isNotEmpty(result)) {
// Map<String, Object> dtoMap = handleDataI(result, bak, item.getTimeInterval());
// Set<String> 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<PqDataVerify> result = new ArrayList<>();
List<PqReasonableRangeDto> list = map.get(DataCleanEnum.DataPlt.getCode());
Map<String, PqReasonableRangeDto> pqReasonableRangeDtoMap = list.stream().collect(Collectors.toMap(PqReasonableRangeDto::getIndexCode, Function.identity()));
data3.forEach(data -> {
List<PqDataVerify> pqDataVerifies = judgeDataPlt(pqReasonableRangeDtoMap, data);
result.addAll(pqDataVerifies);
});
if (CollUtil.isNotEmpty(result)) {
Map<String, Object> dtoMap = handleDataPlt(result, bak, item.getTimeInterval());
Set<String> 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<PqDataVerify> result = new ArrayList<>();
List<PqReasonableRangeDto> list = map.get(DataCleanEnum.DataInHarmV.getCode());
Map<String, PqReasonableRangeDto> pqReasonableRangeDtoMap = list.stream().collect(Collectors.toMap(PqReasonableRangeDto::getIndexCode, Function.identity()));
data4.forEach(data -> {
List<PqDataVerify> pqDataVerifies = judgeDataInHarmV(pqReasonableRangeDtoMap, data);
result.addAll(pqDataVerifies);
});
if (CollUtil.isNotEmpty(result)) {
Map<String, Object> dtoMap = handleInHarmV(result, bak, item.getTimeInterval());
Set<String> 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<PqDataVerify> result = new ArrayList<>();
List<PqReasonableRangeDto> list = map.get(DataCleanEnum.DataHarmRateV.getCode());
Map<String, PqReasonableRangeDto> pqReasonableRangeDtoMap = list.stream().collect(Collectors.toMap(PqReasonableRangeDto::getIndexCode, Function.identity()));
data5.forEach(data -> {
List<PqDataVerify> pqDataVerifies = judgeDataHarmRateV(pqReasonableRangeDtoMap, data);
result.addAll(pqDataVerifies);
});
if (CollUtil.isNotEmpty(result)) {
Map<String, Object> dtoMap = handleHarmRateV(result, bak, item.getTimeInterval());
Set<String> 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<PqDataVerify> result = new ArrayList<>();
List<PqReasonableRangeDto> list = map.get(DataCleanEnum.DataHarmPowerP.getCode());
Map<String, PqReasonableRangeDto> pqReasonableRangeDtoMap = list.stream().collect(Collectors.toMap(PqReasonableRangeDto::getIndexCode, Function.identity()));
data6.forEach(data -> {
List<PqDataVerify> pqDataVerifies = judgeDataHarmPowerP(pqReasonableRangeDtoMap, data);
result.addAll(pqDataVerifies);
});
if (CollUtil.isNotEmpty(result)) {
Map<String, Object> dtoMap = handleHarmPowerP(result, bak, item.getTimeInterval());
Set<String> 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<PqDataVerify> result = new ArrayList<>();
List<PqReasonableRangeDto> list = map.get(DataCleanEnum.DataHarmPhasicV.getCode());
Map<String, PqReasonableRangeDto> pqReasonableRangeDtoMap = list.stream().collect(Collectors.toMap(PqReasonableRangeDto::getIndexCode, Function.identity()));
data7.forEach(data -> {
List<PqDataVerify> pqDataVerifies = judgeDataHarmPhasicV(pqReasonableRangeDtoMap, data);
result.addAll(pqDataVerifies);
});
if (CollUtil.isNotEmpty(result)) {
Map<String, Object> dtoMap = handleHarmPhasicV(result, bak, item.getTimeInterval());
Set<String> 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<PqDataVerify> result = new ArrayList<>();
List<PqReasonableRangeDto> list = map.get(DataCleanEnum.DataFluc.getCode());
Map<String, PqReasonableRangeDto> pqReasonableRangeDtoMap = list.stream().collect(Collectors.toMap(PqReasonableRangeDto::getIndexCode, Function.identity()));
data8.forEach(data -> {
List<PqDataVerify> pqDataVerifies = judgeDataFluc(pqReasonableRangeDtoMap, data);
result.addAll(pqDataVerifies);
});
if (CollUtil.isNotEmpty(result)) {
Map<String, Object> dtoMap = handleDataFluc(result, bak, item.getTimeInterval());
Set<String> 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<PqDataVerify> result = new ArrayList<>();
List<PqReasonableRangeDto> list = map.get(DataCleanEnum.DataFlicker.getCode());
Map<String, PqReasonableRangeDto> pqReasonableRangeDtoMap = list.stream().collect(Collectors.toMap(PqReasonableRangeDto::getIndexCode, Function.identity()));
data9.forEach(data -> {
List<PqDataVerify> pqDataVerifies = judgeDataFlicker(pqReasonableRangeDtoMap, data);
result.addAll(pqDataVerifies);
});
if (CollUtil.isNotEmpty(result)) {
Map<String, Object> dtoMap = handleDataFlicker(result, bak, item.getTimeInterval());
Set<String> 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<PqDataVerify> result = new ArrayList<>();
List<PqReasonableRangeDto> list = map.get(DataCleanEnum.RMpEventDetail.getCode());
Map<String, PqReasonableRangeDto> pqReasonableRangeDtoMap = list.stream().collect(Collectors.toMap(PqReasonableRangeDto::getIndexCode, Function.identity()));
eventList.forEach(data -> {
data.setFeatureAmplitude(data.getFeatureAmplitude() * 100.0);
List<PqDataVerify> pqDataVerifies = judgeDataEvent(pqReasonableRangeDtoMap, data, dip, rise);
result.addAll(pqDataVerifies);
});
if (CollUtil.isNotEmpty(result)) {
Map<String, Object> dtoMap = handleDataEvent(result, bak, item.getTimeInterval());
Set<String> 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<DataVDto> 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<DataIDto> 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<DataPltDto> 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<DataHarmDto> 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<DataHarmDto> 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<DataPowerPDto> 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<DataHarmDto> 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<DataFlucDto> 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<DataFlickerDto> 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<String, Object> 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<String, Object> handleDataV(List<PqDataVerify> result, PqDataVerifyBak bak, Integer timeInterval) {
Map<String, Object> map = new HashMap<>();
Map<String, List<PqDataVerify>> codeMap = result.stream().collect(Collectors.groupingBy(PqDataVerify::getIndexCode));
//频率
List<DataCleanJsonDTO.DataHarmCleanJsonDTO> 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<DataCleanJsonDTO.DataHarmCleanJsonDTO> 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<DataCleanJsonDTO.DataHarmCleanJsonDTO> 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<DataCleanJsonDTO.DataHarmCleanJsonDTO> 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<DataCleanJsonDTO.DataHarmCleanJsonDTO> 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<DataCleanJsonDTO.DataHarmCleanJsonDTO> 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<DataCleanJsonDTO.DataHarmCleanJsonDTO> 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<DataCleanJsonDTO.DataHarmCleanJsonDTO> 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<DataCleanJsonDTO.DataHarmCleanJsonDTO> 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<DataCleanJsonDTO.DataHarmCleanJsonDTO> 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<DataCleanJsonDTO.DataHarmCleanJsonDTO> 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<DataCleanJsonDTO.DataHarmCleanJsonDTO> 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<String, Object> handleDataI(List<PqDataVerify> result, PqDataVerifyBak bak, Integer timeInterval) {
Map<String, Object> map = new HashMap<>();
Map<String, List<PqDataVerify>> codeMap = result.stream().collect(Collectors.groupingBy(PqDataVerify::getIndexCode));
//电流有效值
List<DataCleanJsonDTO.DataHarmCleanJsonDTO> 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<String, Object> handleDataPlt(List<PqDataVerify> result, PqDataVerifyBak bak, Integer timeInterval) {
Map<String, Object> map = new HashMap<>();
Map<String, List<PqDataVerify>> codeMap = result.stream().collect(Collectors.groupingBy(PqDataVerify::getIndexCode));
//长时闪变
List<DataCleanJsonDTO.DataHarmCleanJsonDTO> 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<String, Object> handleInHarmV(List<PqDataVerify> result, PqDataVerifyBak bak, Integer timeInterval) {
Map<String, Object> map = new HashMap<>();
Map<String, List<PqDataVerify>> codeMap = result.stream().collect(Collectors.groupingBy(PqDataVerify::getIndexCode));
//间谐波电压含有率
List<DataCleanJsonDTO.DataHarmCleanJsonDTO> 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<String, Object> handleHarmRateV(List<PqDataVerify> result, PqDataVerifyBak bak, Integer timeInterval) {
Map<String, Object> map = new HashMap<>();
Map<String, List<PqDataVerify>> codeMap = result.stream().collect(Collectors.groupingBy(PqDataVerify::getIndexCode));
//谐波电压含有率
List<DataCleanJsonDTO.DataHarmCleanJsonDTO> 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<String, Object> handleHarmPowerP(List<PqDataVerify> result, PqDataVerifyBak bak, Integer timeInterval) {
Map<String, Object> map = new HashMap<>();
Map<String, List<PqDataVerify>> codeMap = result.stream().collect(Collectors.groupingBy(PqDataVerify::getIndexCode));
//功率因素
List<DataCleanJsonDTO.DataHarmCleanJsonDTO> 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<String, Object> handleHarmPhasicV(List<PqDataVerify> result, PqDataVerifyBak bak, Integer timeInterval) {
Map<String, Object> map = new HashMap<>();
Map<String, List<PqDataVerify>> codeMap = result.stream().collect(Collectors.groupingBy(PqDataVerify::getIndexCode));
//谐波电压相角
List<DataCleanJsonDTO.DataHarmCleanJsonDTO> 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<DataCleanJsonDTO.DataHarmCleanJsonDTO> 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<String, Object> handleDataFluc(List<PqDataVerify> result, PqDataVerifyBak bak, Integer timeInterval) {
Map<String, Object> map = new HashMap<>();
Map<String, List<PqDataVerify>> codeMap = result.stream().collect(Collectors.groupingBy(PqDataVerify::getIndexCode));
//电压波动
List<DataCleanJsonDTO.DataHarmCleanJsonDTO> 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<String, Object> handleDataFlicker(List<PqDataVerify> result, PqDataVerifyBak bak, Integer timeInterval) {
Map<String, Object> map = new HashMap<>();
Map<String, List<PqDataVerify>> codeMap = result.stream().collect(Collectors.groupingBy(PqDataVerify::getIndexCode));
//短时闪变
List<DataCleanJsonDTO.DataHarmCleanJsonDTO> 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<String, Object> handleDataEvent(List<PqDataVerify> result, PqDataVerifyBak bak, Integer timeInterval) {
Map<String, Object> map = new HashMap<>();
Map<String, List<PqDataVerify>> codeMap = result.stream().collect(Collectors.groupingBy(PqDataVerify::getIndexCode));
//暂降事件
List<DataCleanJsonDTO.DataHarmCleanJsonDTO> 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<DataCleanJsonDTO.DataHarmCleanJsonDTO> 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<DataCleanJsonDTO.DataHarmCleanJsonDTO> handleData(List<PqDataVerify> list, Integer timeInterval) {
List<DataCleanJsonDTO.DataHarmCleanJsonDTO> dataList = new ArrayList<>();
if (CollUtil.isNotEmpty(list)) {
AtomicInteger allCounts = new AtomicInteger();
Set<String> timeSet = new HashSet<>();
DataCleanJsonDTO.DataHarmCleanJsonDTO dto = new DataCleanJsonDTO.DataHarmCleanJsonDTO();
dto.setTargetName(list.get(0).getIndexName());
List<DataCleanJsonDTO.DataHarmCleanNormalJsonDTO> list1 = new ArrayList<>();
Map<String, List<PqDataVerify>> phaseMap = list.stream().collect(Collectors.groupingBy(PqDataVerify::getPhasicType));
phaseMap.forEach((k, v) -> {
Map<String, List<PqDataVerify>> 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<PqDataVerify> 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<DataCleanJsonDTO.DataHarmCleanJsonDTO> handleHarmData(List<PqDataVerify> list, Integer timeInterval) {
List<DataCleanJsonDTO.DataHarmCleanJsonDTO> dataList = new ArrayList<>();
if (CollUtil.isNotEmpty(list)) {
AtomicInteger allCounts = new AtomicInteger();
Set<String> timeSet = new HashSet<>();
Map<String, List<PqDataVerify>> indexNameMap = list.stream().collect(Collectors.groupingBy(PqDataVerify::getIndexName));
indexNameMap.forEach((k, v) -> {
DataCleanJsonDTO.DataHarmCleanJsonDTO dto = new DataCleanJsonDTO.DataHarmCleanJsonDTO();
dto.setTargetName(k);
List<DataCleanJsonDTO.DataHarmCleanNormalJsonDTO> dataCleanJsonDTOList = new ArrayList<>();
Map<String, List<PqDataVerify>> phaseMap = v.stream().collect(Collectors.groupingBy(PqDataVerify::getPhasicType));
phaseMap.forEach((k2, v2) -> {
Map<String, List<PqDataVerify>> 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<PqDataVerify> 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<PqDataVerify> judgeDataEvent(Map<String, PqReasonableRangeDto> map, RmpEventDetailDTO dto, DictData dip, DictData rise) {
List<PqDataVerify> 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();

View File

@@ -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<String, List<CmpStep>> executeSteps = liteflowResponse.getExecuteSteps();
for (String key : executeSteps.keySet()) {
List<CmpStep> 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<String, List<CmpStep>> executeSteps = liteflowResponse.getExecuteSteps();
CmpStep failStep = null;
for (String key : executeSteps.keySet()) {
List<CmpStep> 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());
}
}
}

View File

@@ -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<Overlimit> overLimitList = commTerminalGeneralClient.getOverLimitDataByIds(lineIds).getData();
Map<String, Overlimit> overLimitMap = overLimitList.stream().collect(Collectors.toMap(Overlimit::getId, Function.identity()));
//以100个监测点分片处理
List<List<String>> pendingIds = ListUtils.partition(lineIds, NUM);
List<List<String>> pendingIds = ListUtils.partition(lineIds, 5);
ArrayList<String> 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<String> list = pendingIds.get(i);
lineParam.setLineId(list);
//获取电压数据
List<DataVDto> dataVAllTime = dataVFeignClient.getRawData(lineParam).getData();
//闪变数据
List<DataPltDto> dataPltAllTime = dataPltFeignClient.getRawData(lineParam).getData();
//谐波数据
List<DataHarmDto> dataVHarmList = dataHarmRateVFeignClient.getRawData(lineParam).getData();
//间谐波数据
List<DataHarmDto> dataVInHarmList = dataInharmVFeignClient.getRawData(lineParam).getData();
//电流数据
List<DataIDto> dataIList = dataIFeignClient.getRawData(lineParam).getData();
/**
* 功能描述:获取influxDB -> data_v ->
* 总计算次数(用data_v中phasic_type=A,value_type=avg,quality_flag=0来参与统计)
*/
Map<String, List<DataVDto>> 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<String, List<DataPltDto>> 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<String, List<DataHarmDto>> 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<String, List<DataIDto>> 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<String, List<DataHarmDto>> 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<String, List<DataVDto>> 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<String, List<DataVDto>> 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<String, List<DataIDto>> 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<String, List<DataVDto>> 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<String, List<DataVDto>> 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<String, List<DataPltDto>> 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<DataLimitRateDto> dataLimitRate = result.stream().map(DataLimitDetailDto::getDataLimitRate).filter(ObjectUtil::isNotNull).collect(Collectors.toList());
if(CollUtil.isNotEmpty(dataLimitRate)){
dataLimitRateFeignClient.batchInsertion(dataLimitRate);
}
}
if (CollUtil.isNotEmpty(result)) {
//存储数据
List<DataLimitRateDetailDto> 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<com.njcn.harmonic.pojo.po.LimitRate>
* @Author: clam
* @Date: 2022/10/18
*/
private List<DataLimitDetailDto> getData(String dataDate,
Overlimit overlimit,
List<DataVDto> allTimeList,
List<DataPltDto> flickerAllTimeList,
List<DataHarmDto> dataHarmRateVPOList,
List<DataIDto> dataIPOList,
List<DataHarmDto> dataInHarmVPOList,
List<DataVDto> dataVPOList,
List<DataVDto> dataVPOUnbalanceList,
List<DataIDto> dataIPONegList,
List<DataVDto> dataVPOFreqList,
List<DataVDto> dataVPODevList,
List<DataPltDto> dataPltPOList) {
List<DataLimitDetailDto> result = new ArrayList<>();
Map<String, List<DataHarmDto>> harmRateVByPhaseType = new HashMap<>();
Map<String, List<DataIDto>> dataIByPhaseType = new HashMap<>();
Map<String, List<DataHarmDto>> dataInHarmVPhaseType = new HashMap<>();
Map<String, List<DataVDto>> dataVPhaseType = new HashMap<>();
Map<String, List<DataVDto>> dataVDevPhaseType = new HashMap<>();
Map<String, List<DataPltDto>> 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<PqDataVerify> pqDataVerifies = pqDataVerifyFeignClient.queryData(lineParam).getData();
if (CollUtil.isNotEmpty(pqDataVerifies)) {
Map<String, List<String>> 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<DataHarmDto> dataHarmRateVPOList,
List<DataIDto> dataIPOList,
List<DataHarmDto> dataInHarmVPOList,
List<DataVDto> dataVPOList,
List<DataVDto> dataVPODevList,
List<DataPltDto> dataPltPOList) {
List<AbnormalData> 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<AbnormalData>[] 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<AbnormalData>[] 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<AbnormalData>[] 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<DataHarmDto> dataHarmRateVPOList,
List<DataIDto> dataIPOList,
List<DataHarmDto> dataInHarmVPOList,
List<DataVDto> dataVPOList,
List<DataVDto> dataVPOUnbalanceList,
List<DataIDto> dataIPONegList,
List<DataVDto> dataVPOFreqList,
List<DataVDto> dataVPODevList,
List<DataPltDto> dataPltPOList) {
DataLimitDetailDto dto = new DataLimitDetailDto();
DataLimitRateDto limitRate = new DataLimitRateDto();
List<AbnormalData> thd = new ArrayList<>(), uDev = new ArrayList<>(), flicker = new ArrayList<>(), freqDev = new ArrayList<>(), uAberrance = new ArrayList<>(), iNeg = new ArrayList<>();
// 初始化 v 系列列表
List<AbnormalData>[] 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<AbnormalData>[] 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<AbnormalData>[] 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<AbnormalData>[] v, List<AbnormalData>[] i, List<AbnormalData>[] 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<AbnormalData> list) {
Map<String, List<AbnormalData>> abnormalMap = list.stream().collect(Collectors.groupingBy(x -> x.getPhasic() + "_" + x.getValueType()));
List<AbnormalData.Json> 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<AbnormalData> 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();

View File

@@ -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<String> list,
List<String> phase,
Map<String, Overlimit> overLimitMap,
int size,
int i) {
List<DataLimitDetailDto> result = new ArrayList<>();
LineCountEvaluateParam lineParam = new LineCountEvaluateParam();
lineParam.setStartTime(TimeUtils.getBeginOfDay(dataDate));
lineParam.setEndTime(TimeUtils.getEndOfDay(dataDate));
lineParam.setLineId(list);
//获取电压数据
List<DataVDto> dataVAllTime = dataVFeignClient.getRawData(lineParam).getData();
//闪变数据
List<DataPltDto> dataPltAllTime = dataPltFeignClient.getRawData(lineParam).getData();
//谐波数据
List<DataHarmDto> dataVHarmList = dataHarmRateVFeignClient.getRawData(lineParam).getData();
//间谐波数据
List<DataHarmDto> dataVInHarmList = dataInharmVFeignClient.getRawData(lineParam).getData();
//电流数据
List<DataIDto> dataIList = dataIFeignClient.getRawData(lineParam).getData();
/**
* 功能描述:获取influxDB -> data_v ->
* 总计算次数(用data_v中phasic_type=A,value_type=avg,quality_flag=0来参与统计)
*/
Map<String, List<DataVDto>> 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<String, List<DataPltDto>> 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<String, List<DataHarmDto>> 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<String, List<DataIDto>> 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<String, List<DataHarmDto>> 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<String, List<DataVDto>> 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<String, List<DataVDto>> 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<String, List<DataIDto>> 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<String, List<DataVDto>> 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<String, List<DataVDto>> 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<String, List<DataPltDto>> 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<DataLimitRateDto> dataLimitRate = result.stream().map(DataLimitDetailDto::getDataLimitRate).filter(ObjectUtil::isNotNull).collect(Collectors.toList());
if (CollUtil.isNotEmpty(dataLimitRate)) {
dataLimitRateFeignClient.batchInsertion(dataLimitRate);
}
}
if (CollUtil.isNotEmpty(result)) {
//存储数据
List<DataLimitRateDetailDto> 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<com.njcn.harmonic.pojo.po.LimitRate>
* @Author: clam
* @Date: 2022/10/18
*/
private List<DataLimitDetailDto> getData(String dataDate,
Overlimit overlimit,
List<DataVDto> allTimeList,
List<DataPltDto> flickerAllTimeList,
List<DataHarmDto> dataHarmRateVPOList,
List<DataIDto> dataIPOList,
List<DataHarmDto> dataInHarmVPOList,
List<DataVDto> dataVPOList,
List<DataVDto> dataVPOUnbalanceList,
List<DataIDto> dataIPONegList,
List<DataVDto> dataVPOFreqList,
List<DataVDto> dataVPODevList,
List<DataPltDto> dataPltPOList) {
List<DataLimitDetailDto> result = new ArrayList<>();
Map<String, List<DataHarmDto>> harmRateVByPhaseType = new HashMap<>();
Map<String, List<DataIDto>> dataIByPhaseType = new HashMap<>();
Map<String, List<DataHarmDto>> dataInHarmVPhaseType = new HashMap<>();
Map<String, List<DataVDto>> dataVPhaseType = new HashMap<>();
Map<String, List<DataVDto>> dataVDevPhaseType = new HashMap<>();
Map<String, List<DataPltDto>> 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<DataHarmDto> dataHarmRateVPOList,
List<DataIDto> dataIPOList,
List<DataHarmDto> dataInHarmVPOList,
List<DataVDto> dataVPOList,
List<DataVDto> dataVPODevList,
List<DataPltDto> dataPltPOList) {
List<AbnormalData> 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<AbnormalData>[] 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<AbnormalData>[] 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<AbnormalData>[] 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<DataHarmDto> dataHarmRateVPOList,
List<DataIDto> dataIPOList,
List<DataHarmDto> dataInHarmVPOList,
List<DataVDto> dataVPOList,
List<DataVDto> dataVPOUnbalanceList,
List<DataIDto> dataIPONegList,
List<DataVDto> dataVPOFreqList,
List<DataVDto> dataVPODevList,
List<DataPltDto> dataPltPOList) {
DataLimitDetailDto dto = new DataLimitDetailDto();
DataLimitRateDto limitRate = new DataLimitRateDto();
List<AbnormalData> thd = new ArrayList<>(), uDev = new ArrayList<>(), flicker = new ArrayList<>(), freqDev = new ArrayList<>(), uAberrance = new ArrayList<>(), iNeg = new ArrayList<>();
// 初始化 v 系列列表
List<AbnormalData>[] 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<AbnormalData>[] 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<AbnormalData>[] 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<AbnormalData>[] v, List<AbnormalData>[] i, List<AbnormalData>[] 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<AbnormalData> list) {
Map<String, List<AbnormalData>> abnormalMap = list.stream().collect(Collectors.groupingBy(x -> x.getPhasic() + "_" + x.getValueType()));
List<AbnormalData.Json> 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<AbnormalData> 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);
}
}

View File

@@ -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<String, List<CmpStep>> executeSteps = liteflowResponse.getExecuteSteps();
for (String key : executeSteps.keySet()) {
List<CmpStep> 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<String, List<CmpStep>> executeSteps = liteflowResponse.getExecuteSteps();
CmpStep failStep = null;
for (String key : executeSteps.keySet()) {
List<CmpStep> 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());
}
}
}