|
|
|
|
@@ -6,27 +6,29 @@ import cn.hutool.core.date.DatePattern;
|
|
|
|
|
import cn.hutool.core.date.DateTime;
|
|
|
|
|
import cn.hutool.core.date.DateUtil;
|
|
|
|
|
import cn.hutool.core.util.NumberUtil;
|
|
|
|
|
import cn.hutool.core.util.ObjectUtil;
|
|
|
|
|
import cn.hutool.core.util.StrUtil;
|
|
|
|
|
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
|
|
|
|
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
|
|
|
|
import com.njcn.device.common.mapper.onlinerate.OnLineRateMapper;
|
|
|
|
|
import com.njcn.device.common.service.GeneralDeviceService;
|
|
|
|
|
import com.njcn.device.line.mapper.LineMapper;
|
|
|
|
|
import com.njcn.device.line.service.DeptLineService;
|
|
|
|
|
import com.njcn.device.line.service.LineService;
|
|
|
|
|
import com.njcn.device.pq.mapper.RStatOnlinerateDMapper;
|
|
|
|
|
import com.njcn.device.pq.pojo.dto.GeneralDeviceDTO;
|
|
|
|
|
import com.njcn.device.pq.pojo.param.DevRunEvaluateParam;
|
|
|
|
|
import com.njcn.device.pq.pojo.param.DeviceInfoParam;
|
|
|
|
|
import com.njcn.device.pq.pojo.param.OnlineRateParam;
|
|
|
|
|
import com.njcn.device.pq.pojo.po.Line;
|
|
|
|
|
import com.njcn.device.pq.pojo.po.RStatIntegrityD;
|
|
|
|
|
import com.njcn.device.pq.pojo.po.RStatOnlinerateD;
|
|
|
|
|
import com.njcn.device.pq.pojo.vo.DevDetailVO;
|
|
|
|
|
import com.njcn.device.pq.pojo.vo.DeviceRunEvaluateVO;
|
|
|
|
|
import com.njcn.device.pq.pojo.vo.*;
|
|
|
|
|
import cn.hutool.core.collection.CollectionUtil;
|
|
|
|
|
import com.njcn.device.pq.enums.LineBaseEnum;
|
|
|
|
|
import com.njcn.device.pq.enums.PowerFlagEnum;
|
|
|
|
|
import com.njcn.device.pq.enums.RunFlagEnum;
|
|
|
|
|
import com.njcn.device.pq.pojo.dto.MonitorInfoDTO;
|
|
|
|
|
import com.njcn.device.pq.pojo.vo.TerminalEvaluateAreaVO;
|
|
|
|
|
import com.njcn.device.pq.service.DeviceRunEvaluateService;
|
|
|
|
|
import com.njcn.device.rstatintegrity.mapper.RStatIntegrityDMapper;
|
|
|
|
|
import com.njcn.harmonic.api.RStatLimitRateDClient;
|
|
|
|
|
@@ -62,7 +64,9 @@ public class DeviceRunEvaluateServiceImpl implements DeviceRunEvaluateService {
|
|
|
|
|
private final LineMapper lineMapper;
|
|
|
|
|
private final UserLedgerFeignClient userLedgerFeignClient;
|
|
|
|
|
private final DeptLineService deptLineService;
|
|
|
|
|
|
|
|
|
|
private final GeneralDeviceService deviceService;
|
|
|
|
|
private final OnLineRateMapper onLineRateMapper;
|
|
|
|
|
private final LineService lineService;
|
|
|
|
|
/**
|
|
|
|
|
* 数据完整性:50%
|
|
|
|
|
*/
|
|
|
|
|
@@ -334,6 +338,126 @@ public class DeviceRunEvaluateServiceImpl implements DeviceRunEvaluateService {
|
|
|
|
|
return lastWeekTrendVO;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
public List<DeviceRunEvaluateVO.Detail> getRunEvaluate(DeviceInfoParam.BusinessParam param) {
|
|
|
|
|
List<DeviceRunEvaluateVO.Detail> info = new ArrayList<>();
|
|
|
|
|
//获取终端台账类信息
|
|
|
|
|
List<GeneralDeviceDTO> deviceInfo = deviceService.getDeviceInfo(param, ObjectUtil.isNull(param.getLineRunFlag()) ? null : Arrays.asList(param.getLineRunFlag()), Arrays.asList(1));
|
|
|
|
|
if (CollUtil.isNotEmpty(deviceInfo)) {
|
|
|
|
|
List<String> deviceIds = deviceInfo.stream()
|
|
|
|
|
.flatMap(x -> x.getDeviceIndexes().stream()).collect(Collectors.toList())
|
|
|
|
|
.stream()
|
|
|
|
|
.distinct()
|
|
|
|
|
.collect(Collectors.toList());
|
|
|
|
|
List<String> lineIds = deviceInfo.stream()
|
|
|
|
|
.flatMap(x -> x.getLineIndexes().stream()).collect(Collectors.toList())
|
|
|
|
|
.stream()
|
|
|
|
|
.distinct()
|
|
|
|
|
.collect(Collectors.toList());
|
|
|
|
|
//获取所有监测点信息信息
|
|
|
|
|
List<DevDetailVO> lineDeviceByDevIds = lineMapper.getLineDeviceByDevIds(param.getPowerFlag(), lineIds, deviceIds);
|
|
|
|
|
RStatLimitQueryParam rStatLimitQueryParam = new RStatLimitQueryParam();
|
|
|
|
|
rStatLimitQueryParam.setIds(lineIds);
|
|
|
|
|
rStatLimitQueryParam.setDate(param.getSearchBeginTime());
|
|
|
|
|
rStatLimitQueryParam.setEndDate(param.getSearchEndTime());
|
|
|
|
|
OnlineRateParam onlineRateParam = new OnlineRateParam();
|
|
|
|
|
onlineRateParam.setIds(deviceIds);
|
|
|
|
|
onlineRateParam.setStartTime(param.getSearchBeginTime());
|
|
|
|
|
onlineRateParam.setEndTime(param.getSearchEndTime());
|
|
|
|
|
DeviceRunEvaluateVO.Detail detail;
|
|
|
|
|
//完整率
|
|
|
|
|
List<RStatIntegrityVO> integrityList = integrityDMapper.getLineIntegrityRateInfo(lineIds, param.getSearchBeginTime(), param.getSearchEndTime());
|
|
|
|
|
//超标率
|
|
|
|
|
List<RStatLimitRateDPO> limitRatePOList = rStatLimitRateDClient.monitorIdsGetLimitInfo(rStatLimitQueryParam).getData();
|
|
|
|
|
//获取所有终端在线率
|
|
|
|
|
List<RStatOnlinerateVO> onlineRateByDev = onLineRateMapper.getOnlineRateByDevIds(onlineRateParam);
|
|
|
|
|
|
|
|
|
|
for (GeneralDeviceDTO dto : deviceInfo) {
|
|
|
|
|
detail = new DeviceRunEvaluateVO.Detail();
|
|
|
|
|
detail.setName(dto.getName());
|
|
|
|
|
detail.setCount(dto.getDeviceIndexes().size());
|
|
|
|
|
detail.setOnline(onLineRate(onlineRateByDev, dto.getDeviceIndexes()));
|
|
|
|
|
detail.setIntegrity(integrity(integrityList, dto.getLineIndexes()));
|
|
|
|
|
detail.setQualified(limitRate(limitRatePOList, dto.getLineIndexes()));
|
|
|
|
|
detail.setScore(ONINTEGRITY.multiply(detail.getIntegrity())
|
|
|
|
|
.add(ONLINERATE.multiply(detail.getOnline())
|
|
|
|
|
.add(LIMITRATE.multiply(detail.getQualified()))).stripTrailingZeros());
|
|
|
|
|
Map<String, List<DevDetailVO>> dev = lineDeviceByDevIds
|
|
|
|
|
.stream()
|
|
|
|
|
.filter(x -> dto.getDeviceIndexes().contains(x.getDevId()))
|
|
|
|
|
.collect(Collectors.groupingBy(DevDetailVO::getDevId));
|
|
|
|
|
List<DeviceRunEvaluateVO> deviceDetail = new ArrayList<>();
|
|
|
|
|
if (CollUtil.isNotEmpty(dev)) {
|
|
|
|
|
dev.forEach((key, value) -> {
|
|
|
|
|
List<String> ids = value.stream().map(DevDetailVO::getLineId).distinct().collect(Collectors.toList());
|
|
|
|
|
DeviceRunEvaluateVO evaluateVO = new DeviceRunEvaluateVO();
|
|
|
|
|
evaluateVO.setId(value.get(0).getDevId());
|
|
|
|
|
evaluateVO.setName(value.get(0).getDevName());
|
|
|
|
|
evaluateVO.setSubName(value.get(0).getSubName());
|
|
|
|
|
evaluateVO.setIp(value.get(0).getIp());
|
|
|
|
|
evaluateVO.setOnLineRate(onLineRate(onlineRateByDev, Arrays.asList(key)));
|
|
|
|
|
evaluateVO.setIntegrityRate(integrity(integrityList, ids));
|
|
|
|
|
evaluateVO.setPassRate(limitRate(limitRatePOList, ids));
|
|
|
|
|
evaluateVO.setEvaluate(ONINTEGRITY.multiply(evaluateVO.getIntegrityRate())
|
|
|
|
|
.add(ONLINERATE.multiply(evaluateVO.getOnLineRate())
|
|
|
|
|
.add(LIMITRATE.multiply(evaluateVO.getPassRate()))).stripTrailingZeros());
|
|
|
|
|
deviceDetail.add(evaluateVO);
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
detail.setList(deviceDetail);
|
|
|
|
|
info.add(detail);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
return info;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private BigDecimal integrity(List<RStatIntegrityVO> integrityList, List<String> lineIds) {
|
|
|
|
|
//监测完整率
|
|
|
|
|
List<RStatIntegrityVO> integrityDS = integrityList.stream().filter(x -> lineIds.contains(x.getLineIndex())).collect(Collectors.toList());
|
|
|
|
|
if (CollUtil.isNotEmpty(integrityDS)) {
|
|
|
|
|
double realTime = integrityDS.stream().mapToDouble(RStatIntegrityVO::getRealTime).sum();
|
|
|
|
|
double dueTime = integrityDS.stream().mapToDouble(RStatIntegrityVO::getDueTime).sum();
|
|
|
|
|
return NumberUtil.round(Math.min(realTime * 100 / dueTime, 100), 2);
|
|
|
|
|
} else {
|
|
|
|
|
return new BigDecimal(0);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private BigDecimal onLineRate(List<RStatOnlinerateVO> onlineRateByDev, List<String> devIds) {
|
|
|
|
|
//终端在线率
|
|
|
|
|
List<RStatOnlinerateVO> onlineRateDS = onlineRateByDev.stream().filter(x -> devIds.contains(x.getDevIndex())).collect(Collectors.toList());
|
|
|
|
|
if (CollUtil.isNotEmpty(onlineRateDS)) {
|
|
|
|
|
double onlineTime = onlineRateDS.stream().mapToDouble(RStatOnlinerateVO::getOnlineMin).sum();
|
|
|
|
|
double offlineTime = onlineRateDS.stream().mapToDouble(RStatOnlinerateVO::getOfflineMin).sum();
|
|
|
|
|
return NumberUtil.round(Math.min(onlineTime * 100.0 / (onlineTime + offlineTime), 100), 2);
|
|
|
|
|
} else {
|
|
|
|
|
return new BigDecimal(0);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private BigDecimal limitRate(List<RStatLimitRateDPO> limitRatePOList, List<String> lineIds) {
|
|
|
|
|
//超标信息
|
|
|
|
|
List<RStatLimitRateDPO> limitRateDPOS = limitRatePOList.stream().filter(x -> lineIds.contains(x.getLineId())).collect(Collectors.toList());
|
|
|
|
|
if (CollUtil.isNotEmpty(limitRateDPOS)) {
|
|
|
|
|
double overTime = limitRateDPOS.stream().mapToDouble(x -> (x.getUaberranceOvertime() +
|
|
|
|
|
x.getUharm2Overtime() + x.getUharm3Overtime() + x.getUharm4Overtime() + x.getUharm5Overtime() +
|
|
|
|
|
x.getUharm6Overtime() + x.getUharm7Overtime() + x.getUharm8Overtime() + x.getUharm9Overtime() +
|
|
|
|
|
x.getUharm10Overtime() + x.getUharm11Overtime() + x.getUharm12Overtime() + x.getUharm13Overtime() + x.getUharm14Overtime() +
|
|
|
|
|
x.getUharm15Overtime() + x.getUharm16Overtime() + x.getUharm17Overtime() + x.getUharm18Overtime() + x.getUharm19Overtime() +
|
|
|
|
|
x.getUharm20Overtime() + x.getUharm21Overtime() + x.getUharm22Overtime() + x.getUharm23Overtime() + x.getUharm24Overtime() +
|
|
|
|
|
x.getUharm25Overtime())).sum();
|
|
|
|
|
double allTime = limitRateDPOS.stream().mapToDouble(x -> x.getAllTime() * 25.0).sum();
|
|
|
|
|
if (allTime == 0) {
|
|
|
|
|
return new BigDecimal(0);
|
|
|
|
|
} else {
|
|
|
|
|
return NumberUtil.round(Math.min((1 - (overTime * 1.0 / allTime)) * 100, 100), 2);
|
|
|
|
|
}
|
|
|
|
|
} else {
|
|
|
|
|
return new BigDecimal(0);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
private Map<String, NewUserReportVO> getUserLedgerByObjIds(List<String> objIds) {
|
|
|
|
|
List<NewUserReportVO> userReportVOList = userLedgerFeignClient.getUserReportByIds(objIds).getData();
|
|
|
|
|
return userReportVOList.stream().collect(Collectors.toMap(NewUserReportVO::getId, Function.identity()));
|
|
|
|
|
|