diff --git a/pqs-device/pq-device/pq-device-api/src/main/java/com/njcn/device/pq/pojo/vo/DeviceRunEvaluateVO.java b/pqs-device/pq-device/pq-device-api/src/main/java/com/njcn/device/pq/pojo/vo/DeviceRunEvaluateVO.java index ec2021be0..a317ee87e 100644 --- a/pqs-device/pq-device/pq-device-api/src/main/java/com/njcn/device/pq/pojo/vo/DeviceRunEvaluateVO.java +++ b/pqs-device/pq-device/pq-device-api/src/main/java/com/njcn/device/pq/pojo/vo/DeviceRunEvaluateVO.java @@ -14,6 +14,9 @@ import java.util.List; @Data public class DeviceRunEvaluateVO { + @ApiModelProperty("终端id") + private String id; + @ApiModelProperty("名称") private String name; @@ -40,4 +43,29 @@ public class DeviceRunEvaluateVO { @ApiModelProperty("终端id集合") private List devIds; } + + @Data + public static class Detail { + + @ApiModelProperty("名称") + private String name; + + @ApiModelProperty("评价") + private BigDecimal score; + + @ApiModelProperty("终端数量") + private Integer count; + + @ApiModelProperty("在线率") + private BigDecimal online; + + @ApiModelProperty("数据完整性") + private BigDecimal integrity; + + @ApiModelProperty("异常率") + private BigDecimal qualified; + + @ApiModelProperty("终端信息") + List list; + } } diff --git a/pqs-device/pq-device/pq-device-boot/src/main/java/com/njcn/device/pq/controller/DeviceRunEvaluateController.java b/pqs-device/pq-device/pq-device-boot/src/main/java/com/njcn/device/pq/controller/DeviceRunEvaluateController.java index 88240dcb4..ca9a90bd2 100644 --- a/pqs-device/pq-device/pq-device-boot/src/main/java/com/njcn/device/pq/controller/DeviceRunEvaluateController.java +++ b/pqs-device/pq-device/pq-device-boot/src/main/java/com/njcn/device/pq/controller/DeviceRunEvaluateController.java @@ -76,4 +76,14 @@ public class DeviceRunEvaluateController extends BaseController { } + @OperateInfo(info = LogEnum.SYSTEM_COMMON) + @PostMapping("/getRunEvaluateInfo") + @ApiOperation("终端评价列表(冀北)") + public HttpResult> getRunEvaluateInfo(@RequestBody DeviceInfoParam.BusinessParam businessParam) { + String methodDescribe = getMethodDescribe("getRunEvaluateInfo"); + List runEvaluate = deviceRunEvaluateService.getRunEvaluate(businessParam); + return HttpResultUtil.assembleCommonResponseResult(CommonResponseEnum.SUCCESS, runEvaluate, methodDescribe); + } + + } diff --git a/pqs-device/pq-device/pq-device-boot/src/main/java/com/njcn/device/pq/service/DeviceRunEvaluateService.java b/pqs-device/pq-device/pq-device-boot/src/main/java/com/njcn/device/pq/service/DeviceRunEvaluateService.java index 514469cac..5d40db5fe 100644 --- a/pqs-device/pq-device/pq-device-boot/src/main/java/com/njcn/device/pq/service/DeviceRunEvaluateService.java +++ b/pqs-device/pq-device/pq-device-boot/src/main/java/com/njcn/device/pq/service/DeviceRunEvaluateService.java @@ -34,4 +34,13 @@ public interface DeviceRunEvaluateService { TerminalEvaluateAreaVO.lastWeekTrendVO lastWeekTrend(DeviceInfoParam.BusinessParam businessParam); + + /** + * @Description: 获取终端列表 + * @param param + * @return: java.util.List + * @Author: wr + * @Date: 2025/11/27 10:24 + */ + List getRunEvaluate(DeviceInfoParam.BusinessParam param); } diff --git a/pqs-device/pq-device/pq-device-boot/src/main/java/com/njcn/device/pq/service/impl/DeviceRunEvaluateServiceImpl.java b/pqs-device/pq-device/pq-device-boot/src/main/java/com/njcn/device/pq/service/impl/DeviceRunEvaluateServiceImpl.java index fe3cd0ab5..f1451f875 100644 --- a/pqs-device/pq-device/pq-device-boot/src/main/java/com/njcn/device/pq/service/impl/DeviceRunEvaluateServiceImpl.java +++ b/pqs-device/pq-device/pq-device-boot/src/main/java/com/njcn/device/pq/service/impl/DeviceRunEvaluateServiceImpl.java @@ -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% */ @@ -107,7 +111,7 @@ public class DeviceRunEvaluateServiceImpl implements DeviceRunEvaluateService { } - return info.stream().sorted(Comparator.comparing(DeviceRunEvaluateVO.Info::getEvaluate,Comparator.reverseOrder())).collect(Collectors.toList()); + return info.stream().sorted(Comparator.comparing(DeviceRunEvaluateVO.Info::getEvaluate, Comparator.reverseOrder())).collect(Collectors.toList()); } private void setEvaluate(List devIds, List lineIds, List onIntegrityList, DeviceRunEvaluateVO evaluateVO, List onlineRateList, List limitRateList) { @@ -116,7 +120,7 @@ public class DeviceRunEvaluateServiceImpl implements DeviceRunEvaluateService { if (CollUtil.isNotEmpty(integrityDS)) { double realTime = integrityDS.stream().mapToDouble(RStatIntegrityD::getRealTime).sum(); double dueTime = integrityDS.stream().mapToDouble(RStatIntegrityD::getDueTime).sum(); - evaluateVO.setIntegrityRate(NumberUtil.round(Math.min(realTime * 100 / dueTime,100), 2)); + evaluateVO.setIntegrityRate(NumberUtil.round(Math.min(realTime * 100 / dueTime, 100), 2)); } else { evaluateVO.setIntegrityRate(new BigDecimal(0)); } @@ -125,7 +129,7 @@ public class DeviceRunEvaluateServiceImpl implements DeviceRunEvaluateService { if (CollUtil.isNotEmpty(onlineRateDS)) { double onlineTime = onlineRateDS.stream().mapToDouble(RStatOnlinerateD::getOnlineMin).sum(); double offlineTime = onlineRateDS.stream().mapToDouble(RStatOnlinerateD::getOfflineMin).sum(); - evaluateVO.setOnLineRate(NumberUtil.round(Math.min(onlineTime * 100.0 / (onlineTime + offlineTime),100), 2)); + evaluateVO.setOnLineRate(NumberUtil.round(Math.min(onlineTime * 100.0 / (onlineTime + offlineTime), 100), 2)); } else { evaluateVO.setOnLineRate(new BigDecimal(0)); } @@ -143,7 +147,7 @@ public class DeviceRunEvaluateServiceImpl implements DeviceRunEvaluateService { if (allTime == 0) { evaluateVO.setPassRate(new BigDecimal(0)); } else { - evaluateVO.setPassRate(NumberUtil.round(Math.min((1 - (overTime * 1.0 / allTime)) * 100,100), 2)); + evaluateVO.setPassRate(NumberUtil.round(Math.min((1 - (overTime * 1.0 / allTime)) * 100, 100), 2)); } } else { evaluateVO.setPassRate(new BigDecimal(0)); @@ -213,7 +217,7 @@ public class DeviceRunEvaluateServiceImpl implements DeviceRunEvaluateService { List generalDeviceDTOList = generalDeviceService.getDeviceInfo(businessParam, Stream.of(RunFlagEnum.RUNNING.getStatus()).collect(Collectors.toList()), Stream.of(PowerFlagEnum.REAL_DEVICE.getCode()).collect(Collectors.toList())); if (CollectionUtil.isNotEmpty(generalDeviceDTOList)) { if (generalDeviceDTOList.size() == 1 && generalDeviceDTOList.get(0).getIndex().equals(businessParam.getDeptIndex())) { - if(CollUtil.isNotEmpty(generalDeviceDTOList.get(0).getLineIndexes())) { + if (CollUtil.isNotEmpty(generalDeviceDTOList.get(0).getLineIndexes())) { //已经最底层,展示电站和用户场站 List lineDetailList = lineMapper.getLineListByIds(generalDeviceDTOList.get(0).getLineIndexes()); List ids = lineDetailList.stream().map(MonitorInfoDTO::getId).distinct().collect(Collectors.toList()); @@ -246,7 +250,7 @@ public class DeviceRunEvaluateServiceImpl implements DeviceRunEvaluateService { } } else { for (GeneralDeviceDTO generalDeviceDTO : generalDeviceDTOList) { - if(CollUtil.isEmpty(generalDeviceDTO.getDeviceIndexes())){ + if (CollUtil.isEmpty(generalDeviceDTO.getDeviceIndexes())) { continue; } List rStatIntegrityDList = new ArrayList<>(); @@ -334,6 +338,126 @@ public class DeviceRunEvaluateServiceImpl implements DeviceRunEvaluateService { return lastWeekTrendVO; } + @Override + public List getRunEvaluate(DeviceInfoParam.BusinessParam param) { + List info = new ArrayList<>(); + //获取终端台账类信息 + List deviceInfo = deviceService.getDeviceInfo(param, ObjectUtil.isNull(param.getLineRunFlag()) ? null : Arrays.asList(param.getLineRunFlag()), Arrays.asList(1)); + if (CollUtil.isNotEmpty(deviceInfo)) { + List deviceIds = deviceInfo.stream() + .flatMap(x -> x.getDeviceIndexes().stream()).collect(Collectors.toList()) + .stream() + .distinct() + .collect(Collectors.toList()); + List lineIds = deviceInfo.stream() + .flatMap(x -> x.getLineIndexes().stream()).collect(Collectors.toList()) + .stream() + .distinct() + .collect(Collectors.toList()); + //获取所有监测点信息信息 + List 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 integrityList = integrityDMapper.getLineIntegrityRateInfo(lineIds, param.getSearchBeginTime(), param.getSearchEndTime()); + //超标率 + List limitRatePOList = rStatLimitRateDClient.monitorIdsGetLimitInfo(rStatLimitQueryParam).getData(); + //获取所有终端在线率 + List 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> dev = lineDeviceByDevIds + .stream() + .filter(x -> dto.getDeviceIndexes().contains(x.getDevId())) + .collect(Collectors.groupingBy(DevDetailVO::getDevId)); + List deviceDetail = new ArrayList<>(); + if (CollUtil.isNotEmpty(dev)) { + dev.forEach((key, value) -> { + List 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 integrityList, List lineIds) { + //监测完整率 + List 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 onlineRateByDev, List devIds) { + //终端在线率 + List 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 limitRatePOList, List lineIds) { + //超标信息 + List 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 getUserLedgerByObjIds(List objIds) { List userReportVOList = userLedgerFeignClient.getUserReportByIds(objIds).getData(); return userReportVOList.stream().collect(Collectors.toMap(NewUserReportVO::getId, Function.identity())); diff --git a/pqs-device/pq-device/pq-device-com/src/main/java/com/njcn/device/device/service/impl/OnLineRateServiceImpl.java b/pqs-device/pq-device/pq-device-com/src/main/java/com/njcn/device/device/service/impl/OnLineRateServiceImpl.java index 176a7db33..27d838c9b 100644 --- a/pqs-device/pq-device/pq-device-com/src/main/java/com/njcn/device/device/service/impl/OnLineRateServiceImpl.java +++ b/pqs-device/pq-device/pq-device-com/src/main/java/com/njcn/device/device/service/impl/OnLineRateServiceImpl.java @@ -1,6 +1,7 @@ package com.njcn.device.device.service.impl; import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.ObjectUtil; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.njcn.device.common.service.GeneralDeviceService; import com.njcn.device.device.service.OnLineRateService; @@ -35,7 +36,7 @@ public class OnLineRateServiceImpl extends ServiceImpl deviceInfo = deviceService.getDeviceInfo(param, null, Arrays.asList(1)); + List deviceInfo = deviceService.getDeviceInfo(param, ObjectUtil.isNull(param.getLineRunFlag()) ? null : Arrays.asList(param.getLineRunFlag()), Arrays.asList(1)); if (CollUtil.isNotEmpty(deviceInfo)) { List deviceIds = deviceInfo.stream() .flatMap(x -> x.getDeviceIndexes().stream()).collect(Collectors.toList())