优化终端在线率算法

This commit is contained in:
wr
2025-12-25 15:34:29 +08:00
parent e49dee8263
commit ab96d247fa
3 changed files with 78 additions and 43 deletions

View File

@@ -3,16 +3,18 @@ package com.njcn.algorithm.serviceimpl.line;
import cn.hutool.core.collection.CollUtil; import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.date.DateTime;
import cn.hutool.core.date.DateUnit; import cn.hutool.core.date.DateUnit;
import cn.hutool.core.date.DateUtil; import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.NumberUtil;
import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.ObjectUtil;
import com.njcn.algorithm.pojo.bo.CalculatedParam; import com.njcn.algorithm.pojo.bo.CalculatedParam;
import com.njcn.algorithm.service.line.IDataOnlineRateService; import com.njcn.algorithm.service.line.IDataOnlineRateService;
import com.njcn.dataProcess.api.DataIntegrityFeignClient;
import com.njcn.dataProcess.api.DataOnlineRateFeignClient; import com.njcn.dataProcess.api.DataOnlineRateFeignClient;
import com.njcn.dataProcess.api.DataVFeignClient; import com.njcn.dataProcess.api.DataVFeignClient;
import com.njcn.dataProcess.api.PqsCommunicateFeignClient; import com.njcn.dataProcess.api.PqsCommunicateFeignClient;
import com.njcn.dataProcess.param.LineCountEvaluateParam; import com.njcn.dataProcess.param.LineCountEvaluateParam;
import com.njcn.dataProcess.pojo.dto.DataIntegrityDto;
import com.njcn.dataProcess.pojo.dto.DataOnlineRateDto; import com.njcn.dataProcess.pojo.dto.DataOnlineRateDto;
import com.njcn.dataProcess.pojo.dto.PqsCommunicateDto; import com.njcn.dataProcess.pojo.dto.PqsCommunicateDto;
import com.njcn.dataProcess.util.TimeUtils; import com.njcn.dataProcess.util.TimeUtils;
@@ -47,7 +49,7 @@ public class IDataOnlineRateServiceImpl implements IDataOnlineRateService {
private static final Logger logger = LoggerFactory.getLogger(IDataOnlineRateServiceImpl.class); private static final Logger logger = LoggerFactory.getLogger(IDataOnlineRateServiceImpl.class);
@Value("${line.num}") @Value("${line.num}")
private Integer NUM = 100; private Integer NUM = 100;
private final Integer online = 1; private final Integer online = 1;
private final Integer offline = 0; private final Integer offline = 0;
@@ -61,7 +63,8 @@ public class IDataOnlineRateServiceImpl implements IDataOnlineRateService {
private CommTerminalGeneralClient commTerminalGeneralClient; private CommTerminalGeneralClient commTerminalGeneralClient;
@Resource @Resource
private DeptFeignClient deptFeignClient; private DeptFeignClient deptFeignClient;
@Resource
private DataIntegrityFeignClient dataIntegrityFeignClient;
@Override @Override
@@ -73,35 +76,33 @@ public class IDataOnlineRateServiceImpl implements IDataOnlineRateService {
List<String> devIdList = calculatedParam.getIdList(); List<String> devIdList = calculatedParam.getIdList();
List<DataOnlineRateDto.Detail> list = new ArrayList<>(); List<DataOnlineRateDto.Detail> list = new ArrayList<>();
if(ObjectUtil.isNotNull(calculatedParam.getType())){ DeptGetLineParam deptGetLineParam = new DeptGetLineParam();
if(calculatedParam.getType()==1){ Dept dept = deptFeignClient.getRootDept().getData();
DeptGetLineParam deptGetLineParam = new DeptGetLineParam(); deptGetLineParam.setDeptId(dept.getId());
Dept dept = deptFeignClient.getRootDept().getData(); List<DeptGetDeviceDTO> DeviceAndMonitorList = commTerminalGeneralClient.deptGetDeviceAndMonitor(deptGetLineParam).getData();
deptGetLineParam.setDeptId(dept.getId()); DeptGetDeviceDTO dto = DeviceAndMonitorList.stream().filter(po -> Objects.equals(po.getUnitId(), dept.getId())).collect(Collectors.toList()).get(0);
List<DeptGetDeviceDTO> DeviceAndMonitorList = commTerminalGeneralClient.deptGetDeviceAndMonitor(deptGetLineParam).getData(); List<LineDevGetDTO> devList = dto.getDeviceList();
DeptGetDeviceDTO dto = DeviceAndMonitorList.stream().filter(po -> Objects.equals(po.getUnitId(), dept.getId())).collect(Collectors.toList()).get(0); Map<String, List<LineDevGetDTO>> LineDevGetMap = devList.stream()
List<LineDevGetDTO> devList = dto.getDeviceList(); .filter(x -> devIdList.contains(x.getDevId()))
Map<String, List<LineDevGetDTO>> LineDevGetMap = devList.stream() .collect(Collectors.groupingBy(LineDevGetDTO::getDevId));
.filter(x -> devIdList.contains(x.getDevId())) if (ObjectUtil.isNotNull(calculatedParam.getType())&&calculatedParam.getType() == 1) {
.collect(Collectors.groupingBy(LineDevGetDTO::getDevId)); LineDevGetMap.forEach((key, value) -> {
LineDevGetMap.forEach((key,value)->{ DataOnlineRateDto.Detail onlineRateDpo = new DataOnlineRateDto.Detail();
DataOnlineRateDto.Detail onlineRateDpo = new DataOnlineRateDto.Detail(); List<String> collect = value.stream().map(LineDevGetDTO::getPointId).collect(Collectors.toList());
List<String> collect = value.stream().map(LineDevGetDTO::getPointId).collect(Collectors.toList()); lineParam.setLineId(collect);
lineParam.setLineId(collect); Integer data = dataVFeignClient.getCountRawData(lineParam).getData();
Integer data = dataVFeignClient.getCountRawData(lineParam).getData(); onlineRateDpo.setTimeId(calculatedParam.getDataDate());
onlineRateDpo.setTimeId(calculatedParam.getDataDate()); onlineRateDpo.setDevIndex(key);
onlineRateDpo.setDevIndex(key); if (data > 0) {
if(data>0){ onlineRateDpo.setOnlineMin(InfluxDBPublicParam.DAY_MINUTE);
onlineRateDpo.setOnlineMin(InfluxDBPublicParam.DAY_MINUTE); onlineRateDpo.setOfflineMin(0);
onlineRateDpo.setOfflineMin(0); } else {
}else{ onlineRateDpo.setOnlineMin(0);
onlineRateDpo.setOnlineMin(0); onlineRateDpo.setOfflineMin(InfluxDBPublicParam.DAY_MINUTE);
onlineRateDpo.setOfflineMin(InfluxDBPublicParam.DAY_MINUTE); }
} list.add(onlineRateDpo);
list.add(onlineRateDpo); });
}); } else {
}
}else{
List<PqsCommunicateDto> outCommunicateData = new ArrayList<>(); List<PqsCommunicateDto> outCommunicateData = new ArrayList<>();
for (String s : devIdList) { for (String s : devIdList) {
lineParam.setLineId(Arrays.asList(s)); lineParam.setLineId(Arrays.asList(s));
@@ -120,6 +121,35 @@ public class IDataOnlineRateServiceImpl implements IDataOnlineRateService {
onlineRateDpo.setOfflineMin(onLineRate.getOfflineMin()); onlineRateDpo.setOfflineMin(onLineRate.getOfflineMin());
list.add(onlineRateDpo); list.add(onlineRateDpo);
} }
LineDevGetMap.forEach((key, value) -> {
DataOnlineRateDto.Detail onlineRateDpo = new DataOnlineRateDto.Detail();
long count = list.stream().filter(x -> x.getDevIndex().equals(key)).count();
if (count < 1) {
onlineRateDpo.setTimeId(calculatedParam.getDataDate());
onlineRateDpo.setDevIndex(key);
List<String> lineIds = value.stream().map(LineDevGetDTO::getPointId).collect(Collectors.toList());
lineParam.setLineId(lineIds);
List<DataIntegrityDto> integrityDS = dataIntegrityFeignClient.getRawData(lineParam).getData();
Double max=0.0;
if(CollUtil.isNotEmpty(integrityDS)){
List<Double> info=new ArrayList<>();
for (DataIntegrityDto integrityD : integrityDS) {
double realTime = integrityD.getRealTime();
double dueTime = integrityD.getDueTime();
Double decimal = 0.0;
if (dueTime != 0) {
decimal = NumberUtil.round(Math.min(realTime / dueTime, 1), 6).doubleValue();
}
info.add(decimal);
}
max = info.stream().max(Comparator.naturalOrder()).orElse(0.0);
}
int v = (int)Math.ceil(InfluxDBPublicParam.DAY_MINUTE * max);
onlineRateDpo.setOnlineMin(v);
onlineRateDpo.setOfflineMin(InfluxDBPublicParam.DAY_MINUTE - v);
list.add(onlineRateDpo);
}
});
} }
if (CollectionUtil.isNotEmpty(list)) { if (CollectionUtil.isNotEmpty(list)) {
onlineRateFeignClient.batchInsertion(list); onlineRateFeignClient.batchInsertion(list);
@@ -128,20 +158,20 @@ public class IDataOnlineRateServiceImpl implements IDataOnlineRateService {
} }
@Override @Override
public List<DataOnlineRateDto.Detail> dataOnlineRateMonth(CalculatedParam calculatedParam) { public List<DataOnlineRateDto.Detail> dataOnlineRateMonth(CalculatedParam calculatedParam) {
LineCountEvaluateParam lineParam = new LineCountEvaluateParam(); LineCountEvaluateParam lineParam = new LineCountEvaluateParam();
lineParam.setStartTime(TimeUtils.getBeginOfMonth(calculatedParam.getDataDate())); lineParam.setStartTime(TimeUtils.getBeginOfMonth(calculatedParam.getDataDate()));
lineParam.setEndTime(TimeUtils.getEndOfMonth(calculatedParam.getDataDate())); lineParam.setEndTime(TimeUtils.getEndOfMonth(calculatedParam.getDataDate()));
List<String> devIdList = calculatedParam.getIdList(); List<String> devIdList = calculatedParam.getIdList();
List<DataOnlineRateDto.Detail> info=new ArrayList<>(); List<DataOnlineRateDto.Detail> info = new ArrayList<>();
List<List<String>> pendingIds = ListUtils.partition(devIdList,NUM); List<List<String>> pendingIds = ListUtils.partition(devIdList, NUM);
for (List<String> pendingId : pendingIds) { for (List<String> pendingId : pendingIds) {
lineParam.setLineId(pendingId); lineParam.setLineId(pendingId);
List<DataOnlineRateDto.Detail> data = onlineRateFeignClient.getRawData(lineParam).getData(); List<DataOnlineRateDto.Detail> data = onlineRateFeignClient.getRawData(lineParam).getData();
Map<String, List<DataOnlineRateDto.Detail>> collect = data.stream().collect(Collectors.groupingBy(DataOnlineRateDto.Detail::getDevIndex)); Map<String, List<DataOnlineRateDto.Detail>> collect = data.stream().collect(Collectors.groupingBy(DataOnlineRateDto.Detail::getDevIndex));
collect.forEach((key,value)->{ collect.forEach((key, value) -> {
DataOnlineRateDto.Detail onlineRateDto=new DataOnlineRateDto.Detail(); DataOnlineRateDto.Detail onlineRateDto = new DataOnlineRateDto.Detail();
onlineRateDto.setTimeId(calculatedParam.getDataDate()); onlineRateDto.setTimeId(calculatedParam.getDataDate());
onlineRateDto.setDevIndex(key); onlineRateDto.setDevIndex(key);
onlineRateDto.setOnlineMin(value.stream().mapToInt(DataOnlineRateDto.Detail::getOnlineMin).sum()); onlineRateDto.setOnlineMin(value.stream().mapToInt(DataOnlineRateDto.Detail::getOnlineMin).sum());
@@ -149,7 +179,7 @@ public class IDataOnlineRateServiceImpl implements IDataOnlineRateService {
info.add(onlineRateDto); info.add(onlineRateDto);
}); });
} }
if(CollUtil.isNotEmpty(info)){ if (CollUtil.isNotEmpty(info)) {
} }
@@ -182,7 +212,7 @@ public class IDataOnlineRateServiceImpl implements IDataOnlineRateService {
return onLineRate; return onLineRate;
} }
private Integer processData(Date newDate, Date date, Integer type,LineCountEvaluateParam lineParam) { private Integer processData(Date newDate, Date date, Integer type, LineCountEvaluateParam lineParam) {
int minute = 0; int minute = 0;
List<PqsCommunicateDto> communicateData = communicateFeignClient.getRawData(lineParam).getData(); List<PqsCommunicateDto> communicateData = communicateFeignClient.getRawData(lineParam).getData();
/*当前统计时间内存在多条数据*/ /*当前统计时间内存在多条数据*/
@@ -220,8 +250,8 @@ public class IDataOnlineRateServiceImpl implements IDataOnlineRateService {
} }
} else { } else {
List<PqsCommunicateDto> communicateDataOld = communicateFeignClient.getRawDataEnd(lineParam).getData(); List<PqsCommunicateDto> communicateDataOld = communicateFeignClient.getRawDataEnd(lineParam).getData();
if (communicateDataOld.size() > 0){ if (communicateDataOld.size() > 0) {
if (online.equals(communicateDataOld.get(0).getType())){ if (online.equals(communicateDataOld.get(0).getType())) {
minute = InfluxDBPublicParam.DAY_MINUTE; minute = InfluxDBPublicParam.DAY_MINUTE;
} }
} }

View File

@@ -11,6 +11,7 @@ import com.github.jeffreyning.mybatisplus.service.MppServiceImpl;
import com.njcn.dataProcess.dao.relation.mapper.RStatLimitRateDetailRelationMapper; import com.njcn.dataProcess.dao.relation.mapper.RStatLimitRateDetailRelationMapper;
import com.njcn.dataProcess.pojo.dto.*; import com.njcn.dataProcess.pojo.dto.*;
import com.njcn.dataProcess.param.LineCountEvaluateParam; import com.njcn.dataProcess.param.LineCountEvaluateParam;
import com.njcn.dataProcess.pojo.po.RStatLimitRateD;
import com.njcn.dataProcess.pojo.po.RStatLimitRateDetailD; import com.njcn.dataProcess.pojo.po.RStatLimitRateDetailD;
import com.njcn.dataProcess.service.IDataLimitRateDetail; import com.njcn.dataProcess.service.IDataLimitRateDetail;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
@@ -81,7 +82,9 @@ public class RelationDataLimitRateDetailImpl extends MppServiceImpl<RStatLimitRa
LambdaQueryWrapper<RStatLimitRateDetailD> lambdaQueryWrapper = new LambdaQueryWrapper<>(); LambdaQueryWrapper<RStatLimitRateDetailD> lambdaQueryWrapper = new LambdaQueryWrapper<>();
lambdaQueryWrapper.in(CollUtil.isNotEmpty(lineParam.getLineId()), RStatLimitRateDetailD::getLineId, lineParam.getLineId()) lambdaQueryWrapper.in(CollUtil.isNotEmpty(lineParam.getLineId()), RStatLimitRateDetailD::getLineId, lineParam.getLineId())
.ge(RStatLimitRateDetailD::getTime, lineParam.getStartTime()) .ge(RStatLimitRateDetailD::getTime, lineParam.getStartTime())
.le(RStatLimitRateDetailD::getTime, lineParam.getEndTime()); .le(RStatLimitRateDetailD::getTime, lineParam.getEndTime())
.orderByAsc(RStatLimitRateDetailD::getTime)
;
List<RStatLimitRateDetailD> list = this.list(lambdaQueryWrapper); List<RStatLimitRateDetailD> list = this.list(lambdaQueryWrapper);
DataLimitRateDetailTimeDto dto; DataLimitRateDetailTimeDto dto;

View File

@@ -49,7 +49,9 @@ public class RelationDataLimitRateImpl extends MppServiceImpl<RStatLimitRateRela
lambdaQueryWrapper.in(CollUtil.isNotEmpty(lineParam.getLineId()),RStatLimitRateD::getLineId,lineParam.getLineId()) lambdaQueryWrapper.in(CollUtil.isNotEmpty(lineParam.getLineId()),RStatLimitRateD::getLineId,lineParam.getLineId())
.ge(RStatLimitRateD::getTime,lineParam.getStartTime()) .ge(RStatLimitRateD::getTime,lineParam.getStartTime())
.le(RStatLimitRateD::getTime,lineParam.getEndTime()) .le(RStatLimitRateD::getTime,lineParam.getEndTime())
.eq(RStatLimitRateD::getPhasicType, PhaseType.PHASE_T); .eq(RStatLimitRateD::getPhasicType, PhaseType.PHASE_T)
.orderByAsc(RStatLimitRateD::getTime)
;
List<RStatLimitRateD> list = this.list(lambdaQueryWrapper); List<RStatLimitRateD> list = this.list(lambdaQueryWrapper);
list.forEach(item->{ list.forEach(item->{