1.完成异常终端详情

This commit is contained in:
wr
2025-05-09 16:05:01 +08:00
parent aabb668734
commit b9c0114c67
10 changed files with 328 additions and 111 deletions

View File

@@ -0,0 +1,42 @@
package com.njcn.device.pq.pojo.param;
import com.njcn.web.constant.ValidMessage;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import org.hibernate.validator.constraints.Range;
import java.util.List;
/**
*
*
* @author wr
* @createTime: 2023-04-03
*/
@Data
@ApiModel
public class DevRunEvaluateParam {
@ApiModelProperty(name = "orgId", value = "部门id")
private String orgId;
/**
* 0-电网侧
* 1-非电网侧
*/
@ApiModelProperty("电网侧标识")
@Range(min = 0, max = 2, message = "电网侧标识" + ValidMessage.PARAM_FORMAT_ERROR)
private Integer powerFlag;
@ApiModelProperty(name = "ids", value = "设备id")
private List<String> ids;
@ApiModelProperty(name = "startTime", value = "开始时间")
private String startTime;
@ApiModelProperty(name = "endTime", value = "结束时间")
private String endTime;
}

View File

@@ -0,0 +1,32 @@
package com.njcn.device.pq.pojo.vo;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
/**
* @author wr
* @description
* @date 2025/5/9 11:26
*/
@Data
public class DevDetailVO {
@ApiModelProperty(name = "lineId",value = "监测点索引")
private String lineId;
@ApiModelProperty(name = "lineName",value = "监测点名称")
private String lineName;
@ApiModelProperty(name = "devId",value = "终端id")
private String devId;
@ApiModelProperty(name = "devName",value = "终端名称")
private String devName;
@ApiModelProperty(name = "subName",value = "变电站名称")
private String subName;
@ApiModelProperty(name = "subName",value = "对象id(新能源用户)")
private String ObjId;
}

View File

@@ -4,6 +4,7 @@ import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.math.BigDecimal;
import java.util.List;
/**
* @author wr
@@ -16,6 +17,8 @@ public class DeviceRunEvaluateVO {
@ApiModelProperty("名称")
private String name;
@ApiModelProperty("变电站名称")
private String subName;
@ApiModelProperty("评价")
private BigDecimal evaluate;
@@ -28,5 +31,9 @@ public class DeviceRunEvaluateVO {
@ApiModelProperty("合格率")
private BigDecimal passRate;
@Data
public static class Info extends DeviceRunEvaluateVO{
@ApiModelProperty("终端id集合")
private List<String> devIds;
}
}

View File

@@ -5,6 +5,7 @@ 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.param.DevRunEvaluateParam;
import com.njcn.device.pq.pojo.param.DeviceInfoParam;
import com.njcn.device.pq.pojo.vo.DeviceRunEvaluateVO;
import com.njcn.common.pojo.annotation.OperateInfo;
@@ -51,12 +52,20 @@ public class DeviceRunEvaluateController extends BaseController {
@OperateInfo(info = LogEnum.SYSTEM_COMMON)
@PostMapping("/getRunEvaluate")
@ApiOperation("终端运行评价")
public HttpResult<List<DeviceRunEvaluateVO>> getRunEvaluate(@RequestBody @Validated DeviceInfoParam.CompareBusinessParam param) {
public HttpResult<List<DeviceRunEvaluateVO.Info>> getRunEvaluate(@RequestBody @Validated DeviceInfoParam.CompareBusinessParam param) {
String methodDescribe = getMethodDescribe("getRunEvaluate");
List<DeviceRunEvaluateVO> runEvaluate = deviceRunEvaluateService.getRunEvaluate(param);
List<DeviceRunEvaluateVO.Info> runEvaluate = deviceRunEvaluateService.getRunEvaluate(param);
return HttpResultUtil.assembleCommonResponseResult(CommonResponseEnum.SUCCESS, runEvaluate, methodDescribe);
}
@OperateInfo(info = LogEnum.SYSTEM_COMMON)
@PostMapping("/getRunEvaluateDetail")
@ApiOperation("终端运行评价")
public HttpResult<List<DeviceRunEvaluateVO>> getRunEvaluateDetail(@RequestBody @Validated DevRunEvaluateParam param) {
String methodDescribe = getMethodDescribe("getRunEvaluateDetail");
List<DeviceRunEvaluateVO> runEvaluate = deviceRunEvaluateService.getRunEvaluateDetail(param);
return HttpResultUtil.assembleCommonResponseResult(CommonResponseEnum.SUCCESS, runEvaluate, methodDescribe);
}
@OperateInfo(info = LogEnum.SYSTEM_COMMON)

View File

@@ -573,4 +573,9 @@ public interface LineMapper extends BaseMapper<Line> {
List<MonitorInfo> getLineByDeviceId(@Param("id") String id);
List<TerminalTree> getLineAndLineDetail();
List<DevDetailVO> getLineDeviceByDevIds(@Param("powerFlag") Integer powerFlag,
@Param("lineIds") List<String> lineIds,
@Param("devIds") List<String> devIds);
}

View File

@@ -1834,4 +1834,39 @@
pq_line t1 inner join pq_line_detail t2 on t1.id = t2.id
where t1.state = 1
</select>
<select id="getLineDeviceByDevIds" resultType="com.njcn.device.pq.pojo.vo.DevDetailVO">
SELECT
t.id lineId,
t.NAME lineName,
dev.id devId,
dev.NAME devName,
sub.NAME subName,
td.Obj_Id objId
FROM
pq_line t,
pq_line_detail td,
pq_line subv,
pq_line dev,
pq_line sub
WHERE
subv.id = t.pid
AND t.id = td.id
AND dev.id = subv.pid
AND sub.id = dev.pid
<if test="powerFlag!=null ">
AND td.Power_Flag =#{powerFlag}
</if>
<if test="lineIds!=null and lineIds.size()!=0">
AND t.id in
<foreach item="item" collection="lineIds" separator="," open="(" close=")">
#{item}
</foreach>
</if>
<if test="devIds!=null and devIds.size()!=0">
AND dev.id in
<foreach item="item" collection="devIds" separator="," open="(" close=")">
#{item}
</foreach>
</if>
</select>
</mapper>

View File

@@ -6,6 +6,7 @@ import com.njcn.device.biz.pojo.dto.SubGetBase;
import com.njcn.device.biz.pojo.dto.TerminalGetBase;
import com.njcn.device.biz.pojo.param.SubstationParam;
import com.njcn.device.pq.pojo.po.DeptLine;
import com.njcn.device.pq.pojo.vo.DevDetailVO;
import com.njcn.device.pq.pojo.vo.LineDeviceStateVO;
import com.njcn.web.pojo.param.DeptLineParam;
@@ -128,4 +129,15 @@ public interface DeptLineService extends IService<DeptLine> {
DeptLine getLineByLineIds(String ids);
List<LineDeviceStateVO> getLineDetailByDeptId(String id);
/**
* 根据部门id和终端id筛选信息
* @param orgId
* @return
*/
List<DevDetailVO> getLineDetailByDeptIdAndDevIds(String orgId,Integer powerFlag, List<String> devIds);
}

View File

@@ -1,5 +1,6 @@
package com.njcn.device.pq.service;
import com.njcn.device.pq.pojo.param.DevRunEvaluateParam;
import com.njcn.device.pq.pojo.param.DeviceInfoParam;
import com.njcn.device.pq.pojo.vo.DeviceRunEvaluateVO;
@@ -20,7 +21,12 @@ public interface DeviceRunEvaluateService {
* @param deviceInfoParam
* @return
*/
List<DeviceRunEvaluateVO> getRunEvaluate(DeviceInfoParam.CompareBusinessParam deviceInfoParam);
List<DeviceRunEvaluateVO.Info> getRunEvaluate(DeviceInfoParam.CompareBusinessParam deviceInfoParam);
/**
* 获取终端信息
*/
List<DeviceRunEvaluateVO> getRunEvaluateDetail(DevRunEvaluateParam param);

View File

@@ -16,8 +16,11 @@ import com.njcn.device.pq.mapper.LineDetailMapper;
import com.njcn.device.pq.mapper.LineMapper;
import com.njcn.device.pq.pojo.po.DeptLine;
import com.njcn.device.pq.pojo.po.LineDetail;
import com.njcn.device.pq.pojo.vo.DevDetailVO;
import com.njcn.device.pq.pojo.vo.LineDeviceStateVO;
import com.njcn.device.pq.service.DeptLineService;
import com.njcn.supervision.api.UserLedgerFeignClient;
import com.njcn.supervision.pojo.vo.user.NewUserReportVO;
import com.njcn.system.api.DictTreeFeignClient;
import com.njcn.system.enums.DicTreeEnum;
import com.njcn.system.pojo.vo.DictTreeVO;
@@ -32,8 +35,10 @@ import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.function.Function;
import java.util.stream.Collectors;
/**
@@ -50,6 +55,7 @@ public class DeptLineServiceImpl extends ServiceImpl<DeptLineMapper, DeptLine> i
private final LineMapper lineMapper;
private final DictTreeFeignClient dictTreeFeignClient;
private final LineDetailMapper detailMapper;
private final UserLedgerFeignClient userLedgerFeignClient;
@Override
@@ -195,5 +201,30 @@ public class DeptLineServiceImpl extends ServiceImpl<DeptLineMapper, DeptLine> i
return lineDeviceStateVO;
}
@Override
public List<DevDetailVO> getLineDetailByDeptIdAndDevIds(String orgId,Integer powerFlag, List<String> devIds) {
List<String> lineByDeptId = this.getLineNodeByDeptId(orgId);
List<DevDetailVO> lineDeviceByDevIds = lineMapper.getLineDeviceByDevIds(powerFlag,lineByDeptId, devIds);
if(CollUtil.isNotEmpty(lineDeviceByDevIds)){
List<String> objIds = lineDeviceByDevIds.stream()
.filter(x -> StrUtil.isNotBlank(x.getObjId()))
.map(DevDetailVO::getObjId)
.distinct()
.collect(Collectors.toList());
if(CollUtil.isNotEmpty(objIds)){
List<NewUserReportVO> data = userLedgerFeignClient.getUserReportByIds(objIds).getData();
Map<String, String> userMap = data.stream().collect(Collectors.toMap(NewUserReportVO::getId, NewUserReportVO::getProjectName));
for (DevDetailVO lineDeviceByDevId : lineDeviceByDevIds) {
if(StrUtil.isNotBlank(lineDeviceByDevId.getObjId())){
if(userMap.containsKey(lineDeviceByDevId.getObjId())){
lineDeviceByDevId.setSubName(userMap.get(lineDeviceByDevId.getObjId()));
}
}
}
}
}
return lineDeviceByDevIds;
}
}

View File

@@ -8,9 +8,11 @@ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.njcn.device.pq.mapper.RStatIntegrityDMapper;
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.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 cn.hutool.core.collection.CollectionUtil;
import com.njcn.device.pq.enums.LineBaseEnum;
@@ -19,6 +21,7 @@ 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.DeptLineService;
import com.njcn.device.pq.service.DeviceRunEvaluateService;
import com.njcn.harmonic.api.RStatLimitRateDClient;
import com.njcn.harmonic.pojo.param.RStatLimitQueryParam;
@@ -31,12 +34,9 @@ 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.*;
import java.util.stream.Collectors;
import java.util.Map;
import java.util.function.Function;
import java.util.stream.Stream;
@@ -55,6 +55,7 @@ public class DeviceRunEvaluateServiceImpl implements DeviceRunEvaluateService {
private final RStatIntegrityDMapper integrityDMapper;
private final LineMapper lineMapper;
private final UserLedgerFeignClient userLedgerFeignClient;
private final DeptLineService deptLineService;
/**
* 数据完整性:50%
@@ -71,8 +72,8 @@ public class DeviceRunEvaluateServiceImpl implements DeviceRunEvaluateService {
@Override
public List<DeviceRunEvaluateVO> getRunEvaluate(DeviceInfoParam.CompareBusinessParam param) {
List<DeviceRunEvaluateVO> info = new ArrayList<>();
public List<DeviceRunEvaluateVO.Info> getRunEvaluate(DeviceInfoParam.CompareBusinessParam param) {
List<DeviceRunEvaluateVO.Info> info = new ArrayList<>();
List<GeneralDeviceDTO> deptDeviceInfos = generalDeviceService.getDeviceInfo(param, Arrays.asList(0), Arrays.asList(1));
//监测点id集合
List<String> lineIds = deptDeviceInfos.stream().flatMap(x -> x.getLineIndexes().stream()).distinct().collect(Collectors.toList());
@@ -83,36 +84,29 @@ public class DeviceRunEvaluateServiceImpl implements DeviceRunEvaluateService {
List<RStatIntegrityD> onIntegrityList = new ArrayList<>();
if (CollUtil.isNotEmpty(lineIds)) {
RStatLimitQueryParam limitQueryParam = new RStatLimitQueryParam();
limitQueryParam.setIds(lineIds);
limitQueryParam.setDate(param.getSearchBeginTime());
limitQueryParam.setEndDate(param.getSearchEndTime());
limitRateList.addAll(rStatLimitRateDClient.monitorIdsGetLimitInfo(limitQueryParam).getData());
//监测点完整性
onIntegrityList.addAll(integrityDMapper.selectList(new QueryWrapper<RStatIntegrityD>()
.select("sum(real_time) as realTime,sum(due_time) as dueTime,line_index as lineIndex")
.in(CollUtil.isNotEmpty(lineIds), "line_index", lineIds)
.ge(StrUtil.isNotBlank(param.getSearchBeginTime()), "time_id", DateUtil.beginOfDay(DateUtil.parse(param.getSearchBeginTime())))
.le(StrUtil.isNotBlank(param.getSearchEndTime()), "time_id", DateUtil.endOfDay(DateUtil.parse(param.getSearchEndTime())))
.groupBy("line_index")));
//终端在线率
onlineRateList.addAll(onLineRateDMapper.selectList(new QueryWrapper<RStatOnlinerateD>()
.select("sum(online_min) as onlineMin,sum(offline_min) as offlineMin,dev_index as devIndex")
.in(CollUtil.isNotEmpty(devIds), "dev_index", devIds)
.ge(StrUtil.isNotBlank(param.getSearchBeginTime()), "time_id", DateUtil.beginOfDay(DateUtil.parse(param.getSearchBeginTime())))
.le(StrUtil.isNotBlank(param.getSearchEndTime()), "time_id", DateUtil.endOfDay(DateUtil.parse(param.getSearchEndTime())))
.groupBy("dev_index")));
setList(param.getSearchBeginTime(), param.getSearchEndTime(), devIds, lineIds, limitRateList, onIntegrityList, onlineRateList);
}
DeviceRunEvaluateVO evaluateVO;
DeviceRunEvaluateVO.Info evaluateVO;
for (GeneralDeviceDTO deptDeviceInfo : deptDeviceInfos) {
List<String> lineIndexes = deptDeviceInfo.getLineIndexes();
List<String> devIndexes = deptDeviceInfo.getLineIndexes();
if (CollUtil.isNotEmpty(lineIndexes)) {
evaluateVO = new DeviceRunEvaluateVO();
evaluateVO = new DeviceRunEvaluateVO.Info();
evaluateVO.setName(deptDeviceInfo.getName());
evaluateVO.setDevIds(deptDeviceInfo.getDeviceIndexes());
setEvaluate(devIndexes, lineIndexes, onIntegrityList, evaluateVO, onlineRateList, limitRateList);
info.add(evaluateVO);
}
}
return info;
}
private void setEvaluate(List<String> devIds, List<String> lineIds, List<RStatIntegrityD> onIntegrityList, DeviceRunEvaluateVO evaluateVO, List<RStatOnlinerateD> onlineRateList, List<RStatLimitRateDPO> limitRateList) {
//监测完整率
List<RStatIntegrityD> integrityDS = onIntegrityList.stream().filter(x -> lineIndexes.contains(x.getLineIndex())).collect(Collectors.toList());
List<RStatIntegrityD> integrityDS = onIntegrityList.stream().filter(x -> lineIds.contains(x.getLineIndex())).collect(Collectors.toList());
if (CollUtil.isNotEmpty(integrityDS)) {
double realTime = integrityDS.stream().mapToDouble(RStatIntegrityD::getRealTime).sum();
double dueTime = integrityDS.stream().mapToDouble(RStatIntegrityD::getDueTime).sum();
@@ -121,7 +115,7 @@ public class DeviceRunEvaluateServiceImpl implements DeviceRunEvaluateService {
evaluateVO.setIntegrityRate(new BigDecimal(0));
}
//终端在线率
List<RStatOnlinerateD> onlineRateDS = onlineRateList.stream().filter(x -> deptDeviceInfo.getDeviceIndexes().contains(x.getDevIndex())).collect(Collectors.toList());
List<RStatOnlinerateD> onlineRateDS = onlineRateList.stream().filter(x -> devIds.contains(x.getDevIndex())).collect(Collectors.toList());
if (CollUtil.isNotEmpty(onlineRateDS)) {
double onlineTime = onlineRateDS.stream().mapToDouble(RStatOnlinerateD::getOnlineMin).sum();
double offlineTime = onlineRateDS.stream().mapToDouble(RStatOnlinerateD::getOfflineMin).sum();
@@ -129,8 +123,8 @@ public class DeviceRunEvaluateServiceImpl implements DeviceRunEvaluateService {
} else {
evaluateVO.setOnLineRate(new BigDecimal(0));
}
//终端在线率
List<RStatLimitRateDPO> limitRateDPOS = limitRateList.stream().filter(x -> lineIndexes.contains(x.getLineId())).collect(Collectors.toList());
//超标信息
List<RStatLimitRateDPO> limitRateDPOS = limitRateList.stream().filter(x -> lineIds.contains(x.getLineId())).collect(Collectors.toList());
if (CollUtil.isNotEmpty(limitRateDPOS)) {
double overTime = limitRateDPOS.stream().mapToDouble(x -> (x.getUaberranceOvertime() +
x.getUharm2Overtime() +
@@ -161,7 +155,7 @@ public class DeviceRunEvaluateServiceImpl implements DeviceRunEvaluateService {
if (allTime == 0) {
evaluateVO.setPassRate(new BigDecimal(0));
} else {
evaluateVO.setPassRate(NumberUtil.round(overTime * 100.0 / allTime, 2));
evaluateVO.setPassRate(NumberUtil.round((1 - (overTime * 1.0 / allTime)) * 100, 2));
}
} else {
evaluateVO.setPassRate(new BigDecimal(0));
@@ -171,11 +165,55 @@ public class DeviceRunEvaluateServiceImpl implements DeviceRunEvaluateService {
.add(ONLINERATE.multiply(evaluateVO.getOnLineRate())
.add(LIMITRATE.multiply(evaluateVO.getPassRate()))).stripTrailingZeros()
);
info.add(evaluateVO);
}
private void setList(String beginTime, String endTime, List<String> devIds, List<String> lineIds, List<RStatLimitRateDPO> limitRateList, List<RStatIntegrityD> onIntegrityList, List<RStatOnlinerateD> onlineRateList) {
RStatLimitQueryParam limitQueryParam = new RStatLimitQueryParam();
limitQueryParam.setIds(lineIds);
limitQueryParam.setDate(beginTime);
limitQueryParam.setEndDate(endTime);
limitRateList.addAll(rStatLimitRateDClient.monitorIdsGetLimitInfo(limitQueryParam).getData());
//监测点完整性
onIntegrityList.addAll(integrityDMapper.selectList(new QueryWrapper<RStatIntegrityD>()
.select("sum(real_time) as realTime,sum(due_time) as dueTime,line_index as lineIndex")
.in(CollUtil.isNotEmpty(lineIds), "line_index", lineIds)
.ge(StrUtil.isNotBlank(beginTime), "time_id", DateUtil.beginOfDay(DateUtil.parse(beginTime)))
.le(StrUtil.isNotBlank(endTime), "time_id", DateUtil.endOfDay(DateUtil.parse(endTime)))
.groupBy("line_index")));
//终端在线率
onlineRateList.addAll(onLineRateDMapper.selectList(new QueryWrapper<RStatOnlinerateD>()
.select("sum(online_min) as onlineMin,sum(offline_min) as offlineMin,dev_index as devIndex")
.in(CollUtil.isNotEmpty(devIds), "dev_index", devIds)
.ge(StrUtil.isNotBlank(beginTime), "time_id", DateUtil.beginOfDay(DateUtil.parse(beginTime)))
.le(StrUtil.isNotBlank(endTime), "time_id", DateUtil.endOfDay(DateUtil.parse(endTime)))
.groupBy("dev_index")));
}
@Override
public List<DeviceRunEvaluateVO> getRunEvaluateDetail(DevRunEvaluateParam param) {
List<DeviceRunEvaluateVO> info = new ArrayList<>();
List<DevDetailVO> devDetailVOList = deptLineService.getLineDetailByDeptIdAndDevIds(param.getOrgId(), param.getPowerFlag(), param.getIds());
if (CollUtil.isNotEmpty(devDetailVOList)) {
List<RStatLimitRateDPO> limitRateList = new ArrayList<>();
List<RStatOnlinerateD> onlineRateList = new ArrayList<>();
List<RStatIntegrityD> onIntegrityList = new ArrayList<>();
List<String> devIds = devDetailVOList.stream().map(DevDetailVO::getDevId).distinct().collect(Collectors.toList());
List<String> lineIds = devDetailVOList.stream().map(DevDetailVO::getLineId).distinct().collect(Collectors.toList());
setList(param.getStartTime(), param.getEndTime(), devIds, lineIds, limitRateList, onIntegrityList, onlineRateList);
Map<String, List<DevDetailVO>> devDetailMap = devDetailVOList.stream()
.collect(Collectors.groupingBy(x -> x.getDevId() + "_" + x.getDevName() + "_" + x.getSubName()));
devDetailMap.forEach((key, value) -> {
String[] split = key.split("_");
DeviceRunEvaluateVO vo = new DeviceRunEvaluateVO();
vo.setName(split[1]);
vo.setSubName(split[2]);
setEvaluate(Arrays.asList(split[0]),
value.stream().map(DevDetailVO::getLineId).distinct().collect(Collectors.toList()),
onIntegrityList, vo, onlineRateList, limitRateList);
info.add(vo);
});
}
return info;
}