优化终端在线率算法

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