diff --git a/pqs-advance/advance-boot/src/main/java/com/njcn/advance/service/impl/EventRelevantAnalysisServiceImpl.java b/pqs-advance/advance-boot/src/main/java/com/njcn/advance/service/impl/EventRelevantAnalysisServiceImpl.java index febeb5e23..25519edd9 100644 --- a/pqs-advance/advance-boot/src/main/java/com/njcn/advance/service/impl/EventRelevantAnalysisServiceImpl.java +++ b/pqs-advance/advance-boot/src/main/java/com/njcn/advance/service/impl/EventRelevantAnalysisServiceImpl.java @@ -452,14 +452,10 @@ public class EventRelevantAnalysisServiceImpl extends ServiceImpl vTime = PubUtils.checkLocalDate(baseParam.getSearchBeginTime(), baseParam.getSearchEndTime()); LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper<>(); lambdaQueryWrapper.and(i -> i.isNull(RmpEventDetailPO::getEventassIndex).or().eq(RmpEventDetailPO::getEventassIndex, "")) - .between(RmpEventDetailPO::getStartTime, vTime.get(0), vTime.get(1)).orderByAsc(RmpEventDetailPO::getStartTime) - ; - + .between(RmpEventDetailPO::getStartTime, vTime.get(0), vTime.get(1)).orderByAsc(RmpEventDetailPO::getStartTime); Page poPage = eventAdvanceMapper.selectPage(new Page<>(PageFactory.getPageNum(baseParam), PageFactory.getPageSize(baseParam)), lambdaQueryWrapper); List rmpEventDetailPOList = poPage.getRecords(); diff --git a/pqs-device/pq-device/pq-device-api/src/main/java/com/njcn/device/pq/enums/PowerFlagEnum.java b/pqs-device/pq-device/pq-device-api/src/main/java/com/njcn/device/pq/enums/PowerFlagEnum.java index 7d3105801..3ea76b040 100644 --- a/pqs-device/pq-device/pq-device-api/src/main/java/com/njcn/device/pq/enums/PowerFlagEnum.java +++ b/pqs-device/pq-device/pq-device-api/src/main/java/com/njcn/device/pq/enums/PowerFlagEnum.java @@ -21,12 +21,18 @@ public enum PowerFlagEnum { NEW_ENERGY(2, "电网侧(新能源)"), NO_NEW_ENERGY(3, "非电网侧(新能源)"), SEND_NETWORK(4, "上送国网"), - PCC(5, "PCC"); + PCC(5, "PCC"), + + + VIRTUAL_DEVICE(0,"虚拟终端"), + REAL_DEVICE(1,"实际终端"), + OFFLINE_DEICE(2,"离线终端") + ; private final Integer code; private final String message; diff --git a/pqs-device/pq-device/pq-device-api/src/main/java/com/njcn/device/pq/pojo/dto/MonitorInfoDTO.java b/pqs-device/pq-device/pq-device-api/src/main/java/com/njcn/device/pq/pojo/dto/MonitorInfoDTO.java new file mode 100644 index 000000000..98949f4da --- /dev/null +++ b/pqs-device/pq-device/pq-device-api/src/main/java/com/njcn/device/pq/pojo/dto/MonitorInfoDTO.java @@ -0,0 +1,52 @@ +package com.njcn.device.pq.pojo.dto; + +import lombok.Data; + +/** + * @Author: cdf + * @CreateTime: 2025-05-08 + * @Description: + */ +@Data +public class MonitorInfoDTO { + /** + * 监测点Id + */ + private String id; + + /** + * 父节点(0为根节点) + */ + private String pid; + + /** + * 上层所有节点 + */ + private String pids; + + /** + * 名称 + */ + private String name; + + /** + * 等级:0-项目名称;1- 工程名称;2-单位;3-部门;4-终端;5-母线;6-监测点 + */ + private Integer level; + + /** + * 排序(默认为0,有特殊排序需要时候人为输入) + */ + private Integer sort; + + /** + * 备注 + */ + private String remark; + + private String objId; + + private Integer powerFlag; + + +} diff --git a/pqs-device/pq-device/pq-device-api/src/main/java/com/njcn/device/pq/pojo/vo/TerminalEvaluateAreaVO.java b/pqs-device/pq-device/pq-device-api/src/main/java/com/njcn/device/pq/pojo/vo/TerminalEvaluateAreaVO.java new file mode 100644 index 000000000..f5c81c9d8 --- /dev/null +++ b/pqs-device/pq-device/pq-device-api/src/main/java/com/njcn/device/pq/pojo/vo/TerminalEvaluateAreaVO.java @@ -0,0 +1,24 @@ +package com.njcn.device.pq.pojo.vo; + +import lombok.Data; + +/** + * @Author: cdf + * @CreateTime: 2025-05-08 + * @Description: + */ +@Data +public class TerminalEvaluateAreaVO { + + private String name; + + private Double score; + + private Integer count; + + private Double online; + + private Double integrity; + + private Double qualified; +} 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 d6aacf088..0f60fcf96 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 @@ -7,6 +7,15 @@ import com.njcn.common.pojo.response.HttpResult; import com.njcn.common.utils.HttpResultUtil; import com.njcn.device.pq.pojo.param.DeviceInfoParam; import com.njcn.device.pq.pojo.vo.DeviceRunEvaluateVO; +import com.njcn.common.pojo.annotation.OperateInfo; +import com.njcn.common.pojo.enums.common.LogEnum; +import com.njcn.common.pojo.enums.response.CommonResponseEnum; +import com.njcn.common.pojo.response.HttpResult; +import com.njcn.common.utils.HttpResultUtil; +import com.njcn.device.pq.pojo.dto.DevComFlagDTO; +import com.njcn.device.pq.pojo.param.DeviceInfoParam; +import com.njcn.device.pq.pojo.po.Device; +import com.njcn.device.pq.pojo.vo.TerminalEvaluateAreaVO; import com.njcn.device.pq.service.DeviceRunEvaluateService; import com.njcn.web.controller.BaseController; import io.swagger.annotations.Api; @@ -18,6 +27,10 @@ import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.bind.annotation.*; + +import java.util.List; +import java.util.Objects; import java.util.List; @@ -45,4 +58,15 @@ public class DeviceRunEvaluateController extends BaseController { } + + @OperateInfo(info = LogEnum.SYSTEM_COMMON) + @PostMapping("/areaTerminalStatistic") + @ApiOperation("根据部门获取不同层级的终端信息") + public HttpResult> areaTerminalStatistic(@RequestBody DeviceInfoParam.BusinessParam businessParam) { + String methodDescribe = getMethodDescribe("areaTerminalStatistic"); + List result = deviceRunEvaluateService.areaTerminalStatistic(businessParam); + return HttpResultUtil.assembleCommonResponseResult(CommonResponseEnum.SUCCESS, result, methodDescribe); + } + + } diff --git a/pqs-device/pq-device/pq-device-boot/src/main/java/com/njcn/device/pq/mapper/LineMapper.java b/pqs-device/pq-device/pq-device-boot/src/main/java/com/njcn/device/pq/mapper/LineMapper.java index 437ebdd70..8a7e058a5 100644 --- a/pqs-device/pq-device/pq-device-boot/src/main/java/com/njcn/device/pq/mapper/LineMapper.java +++ b/pqs-device/pq-device/pq-device-boot/src/main/java/com/njcn/device/pq/mapper/LineMapper.java @@ -100,6 +100,8 @@ public interface LineMapper extends BaseMapper { List getProvinceList(@Param("pids") List pids, @Param("type") Integer type); + List getLineListByIds(@Param("ids") List ids); + /** * 返回未绑定的监测点 */ diff --git a/pqs-device/pq-device/pq-device-boot/src/main/java/com/njcn/device/pq/mapper/RStatOnlinerateDMapper.java b/pqs-device/pq-device/pq-device-boot/src/main/java/com/njcn/device/pq/mapper/RStatOnlinerateDMapper.java index 1241dc706..3923f9a48 100644 --- a/pqs-device/pq-device/pq-device-boot/src/main/java/com/njcn/device/pq/mapper/RStatOnlinerateDMapper.java +++ b/pqs-device/pq-device/pq-device-boot/src/main/java/com/njcn/device/pq/mapper/RStatOnlinerateDMapper.java @@ -3,7 +3,6 @@ package com.njcn.device.pq.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.njcn.device.pq.pojo.param.OnlineRateParam; -import com.njcn.device.pq.pojo.po.OnlineRate; import com.njcn.device.pq.pojo.po.RStatOnlinerateD; import com.njcn.device.pq.pojo.vo.RStatOnlinerateVO; import org.apache.ibatis.annotations.Param; diff --git a/pqs-device/pq-device/pq-device-boot/src/main/java/com/njcn/device/pq/mapper/mapping/LineMapper.xml b/pqs-device/pq-device/pq-device-boot/src/main/java/com/njcn/device/pq/mapper/mapping/LineMapper.xml index df4a19e3f..50c72c4ea 100644 --- a/pqs-device/pq-device/pq-device-boot/src/main/java/com/njcn/device/pq/mapper/mapping/LineMapper.xml +++ b/pqs-device/pq-device/pq-device-boot/src/main/java/com/njcn/device/pq/mapper/mapping/LineMapper.xml @@ -131,8 +131,8 @@ - + select a.id,a.pid,a.pids,a.name,a.level,a.sort,b.obj_id,b.power_flag from pq_line a inner join pq_line_detail b on a.id = b.id where a.id in 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 f216065a8..040fbefd4 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 @@ -5,6 +5,11 @@ import com.njcn.device.pq.pojo.vo.DeviceRunEvaluateVO; import java.util.List; +import com.njcn.device.pq.pojo.param.DeviceInfoParam; +import com.njcn.device.pq.pojo.vo.TerminalEvaluateAreaVO; + +import java.util.List; + /** * @author wr * @description @@ -18,4 +23,8 @@ public interface DeviceRunEvaluateService { * @return */ List getRunEvaluate(DeviceInfoParam.CompareBusinessParam deviceInfoParam); + + + + List areaTerminalStatistic(DeviceInfoParam.BusinessParam businessParam); } 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 ed08f0506..e3fd95cbf 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 @@ -12,19 +12,34 @@ import com.njcn.device.pq.pojo.param.DeviceInfoParam; import com.njcn.device.pq.pojo.po.RStatIntegrityD; import com.njcn.device.pq.pojo.po.RStatOnlinerateD; import com.njcn.device.pq.pojo.vo.DeviceRunEvaluateVO; +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.mapper.LineMapper; +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.harmonic.api.RStatLimitRateDClient; import com.njcn.harmonic.pojo.param.RStatLimitQueryParam; import com.njcn.harmonic.pojo.po.day.RStatLimitRateDPO; +import com.njcn.supervision.api.UserLedgerFeignClient; +import com.njcn.supervision.pojo.param.user.UserReportParam; +import com.njcn.supervision.pojo.vo.user.UserLedgerVO; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import java.math.BigDecimal; +import java.math.RoundingMode; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.stream.Collectors; +import java.util.Map; +import java.util.function.Function; +import java.util.stream.Stream; + /** * @author wr * @description @@ -34,24 +49,26 @@ import java.util.stream.Collectors; @RequiredArgsConstructor public class DeviceRunEvaluateServiceImpl implements DeviceRunEvaluateService { - /** - * 数据完整性:50% - */ - private static BigDecimal ONINTEGRITY = new BigDecimal(0.5); - /** - * 数据合格率:30% - */ - private static BigDecimal ONLINERATE = new BigDecimal(0.2); - /** - * 终端在线率:20% - */ - private static BigDecimal LIMITRATE = new BigDecimal(0.3); - - private final GeneralDeviceService generalDeviceService; private final RStatLimitRateDClient rStatLimitRateDClient; private final RStatOnlinerateDMapper onLineRateDMapper; private final RStatIntegrityDMapper integrityDMapper; + private final LineMapper lineMapper; + private final UserLedgerFeignClient userLedgerFeignClient; + + /** + * 数据完整性:50% + */ + private static final BigDecimal ONINTEGRITY = new BigDecimal("0.5"); + /** + * 数据合格率:30% + */ + private static final BigDecimal ONLINERATE = new BigDecimal("0.2"); + /** + * 终端在线率:20% + */ + private static final BigDecimal LIMITRATE = new BigDecimal("0.3"); + @Override public List getRunEvaluate(DeviceInfoParam.CompareBusinessParam param) { @@ -161,4 +178,109 @@ public class DeviceRunEvaluateServiceImpl implements DeviceRunEvaluateService { return info; } + + + @Override + public List areaTerminalStatistic(DeviceInfoParam.BusinessParam businessParam) { + List result = new ArrayList<>(); + 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())) { + List userLedgerVOList = userLedgerFeignClient.selectUserList(new UserReportParam()).getData(); + Map userReportVOMap = userLedgerVOList.stream().collect(Collectors.toMap(UserLedgerVO::getId, Function.identity())); + //已经最底层,展示电站和用户场站 + List lineDetailList = lineMapper.getLineListByIds(generalDeviceDTOList.get(0).getLineIndexes()); + List detailList = lineDetailList.stream().filter(it -> StrUtil.isNotBlank(it.getObjId())).collect(Collectors.toList()); + if (CollUtil.isNotEmpty(detailList)) { + List ids = detailList.stream().map(MonitorInfoDTO::getId).distinct().collect(Collectors.toList()); + List devIds = detailList.stream().map(it->it.getPids().split(StrUtil.COMMA)[LineBaseEnum.DEVICE_LEVEL.getCode()]).distinct().collect(Collectors.toList()); + + List rStatIntegrityDList = new ArrayList<>(); + List rStatOnlinerateDList = new ArrayList<>(); + List rStatLimitRateDPOList = new ArrayList<>(); + getData(rStatIntegrityDList,rStatOnlinerateDList,rStatLimitRateDPOList,ids,devIds,businessParam.getSearchBeginTime(),businessParam.getSearchEndTime()); + Map> map = detailList.stream().collect(Collectors.groupingBy(MonitorInfoDTO::getObjId)); + map.forEach((objId, list) -> { + UserLedgerVO userLedgerVO = userReportVOMap.get(objId); + List lineIds = list.stream().map(MonitorInfoDTO::getId).collect(Collectors.toList()); + List devList = list.stream().map(it->it.getPids().split(StrUtil.COMMA)[LineBaseEnum.DEVICE_LEVEL.getCode()]).collect(Collectors.toList()); + List temIntegrityList = rStatIntegrityDList.stream().filter(it->lineIds.contains(it.getLineIndex())).collect(Collectors.toList()); + List temlimitList = rStatLimitRateDPOList.stream().filter(it->lineIds.contains(it.getLineId())).collect(Collectors.toList()); + List onlineList = rStatOnlinerateDList.stream().filter(it->devList.contains(it.getDevIndex())).collect(Collectors.toList()); + + result.add(getScoreData(userLedgerVO.getProjectName(),devList,temIntegrityList,onlineList,temlimitList)); + }); + } + } else { + for (GeneralDeviceDTO generalDeviceDTO : generalDeviceDTOList) { + List rStatIntegrityDList = new ArrayList<>(); + List rStatOnlinerateDList = new ArrayList<>(); + List rStatLimitRateDPOList = new ArrayList<>(); + getData(rStatIntegrityDList,rStatOnlinerateDList,rStatLimitRateDPOList,generalDeviceDTO.getLineIndexes(),generalDeviceDTO.getDeviceIndexes(),businessParam.getSearchBeginTime(),businessParam.getSearchEndTime()); + result.add(getScoreData(generalDeviceDTO.getName(),generalDeviceDTO.getDeviceIndexes(),rStatIntegrityDList,rStatOnlinerateDList,rStatLimitRateDPOList)); + } + } + } + return result; + } + + private TerminalEvaluateAreaVO getScoreData(String name,List devIds,List rStatIntegrityDList,List rStatOnlinerateDList,List rStatLimitRateDPOList) { + double integrityRate = 0; + double onlineRate = 0; + double qualifiedRate = 0; + TerminalEvaluateAreaVO terminalEvaluateAreaVO = new TerminalEvaluateAreaVO(); + terminalEvaluateAreaVO.setName(name); + terminalEvaluateAreaVO.setCount(devIds.size()); + if (CollectionUtil.isNotEmpty(rStatIntegrityDList)) { + integrityRate = rStatIntegrityDList.stream().mapToDouble(it -> (double) it.getRealTime() / it.getDueTime()).average().orElse(0); + terminalEvaluateAreaVO.setIntegrity(NumberUtil.round(integrityRate*100,2).doubleValue()); + } + if (CollectionUtil.isNotEmpty(rStatOnlinerateDList)) { + onlineRate = rStatOnlinerateDList.stream().mapToDouble(it -> (double) it.getOnlineRate() / it.getOnlineRate() + it.getOfflineMin()).average().orElse(0); + terminalEvaluateAreaVO.setOnline(NumberUtil.round(onlineRate*100,2).doubleValue()); + } + if (CollectionUtil.isNotEmpty(rStatLimitRateDPOList)) { + qualifiedRate = rStatLimitRateDPOList.stream().mapToDouble(it -> { + if (it.getAllTime() == 0) { + return 0; + } else { + int limit = it.getUharm2Overtime() + it.getUharm3Overtime() + it.getUharm4Overtime() + it.getUharm5Overtime() + it.getUharm6Overtime() + + it.getUharm7Overtime() + it.getUharm8Overtime() + it.getUharm9Overtime() + it.getUharm10Overtime() + it.getUharm11Overtime() + + it.getUharm12Overtime() + it.getUharm13Overtime() + it.getUharm14Overtime() + it.getUharm15Overtime() + it.getUharm16Overtime() + + it.getUharm17Overtime() + it.getUharm18Overtime() + it.getUharm19Overtime() + it.getUharm20Overtime() + it.getUharm21Overtime() + + it.getUharm22Overtime() + it.getUharm23Overtime() + it.getUharm24Overtime() + it.getUharm25Overtime() + it.getUaberranceOvertime(); + return 1 - ((double) (limit) / it.getAllTime() * 25); + } + }).average().orElse(0); + terminalEvaluateAreaVO.setQualified(NumberUtil.round(qualifiedRate*100,2).doubleValue()); + double pingFen = integrityRate * 0.5 + onlineRate * 0.2 + qualifiedRate * 0.3; + terminalEvaluateAreaVO.setScore(BigDecimal.valueOf(pingFen*100).setScale(2, RoundingMode.HALF_UP).doubleValue()); + } + return terminalEvaluateAreaVO; + } + + + private void getData(List rStatIntegrityDList,List rStatOnlinerateDList,List rStatLimitRateDPOList,List lineIds,List devIds,String startTime,String endTime){ + if(CollUtil.isNotEmpty(lineIds)){ + rStatIntegrityDList.addAll(integrityDMapper.selectList(new QueryWrapper() + .select("sum(real_time) as realTime,sum(due_time) as dueTime,line_index as lineIndex") + .in(CollUtil.isNotEmpty(lineIds), "line_index", lineIds) + .between("time_id",startTime,endTime) + .groupBy("line_index"))); + RStatLimitQueryParam rStatLimitQueryParam = new RStatLimitQueryParam(); + rStatLimitQueryParam.setIds(lineIds); + rStatLimitQueryParam.setDate(startTime); + rStatLimitQueryParam.setEndDate(endTime); + rStatLimitRateDPOList.addAll(rStatLimitRateDClient.monitorIdsGetLimitInfo(rStatLimitQueryParam).getData()); + } + if(CollectionUtil.isNotEmpty(devIds)) { + rStatOnlinerateDList.addAll(onLineRateDMapper.selectList(new QueryWrapper() + .select("sum(online_min) as onlineMin,sum(offline_min) as offlineMin,dev_index as devIndex") + .in(CollUtil.isNotEmpty(devIds), "dev_index", devIds) + .between("time_id",startTime,endTime) + .groupBy("dev_index"))); + } + } + + }