1.冀北终端在线率代码提交

This commit is contained in:
wr
2025-11-26 16:08:20 +08:00
parent b523a24e5b
commit 62c3c09a6b
10 changed files with 369 additions and 1 deletions

View File

@@ -0,0 +1,31 @@
package com.njcn.device.common.mapper.onlinerate;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.njcn.device.pq.pojo.param.OnlineRateParam;
import com.njcn.device.pq.pojo.po.RStatOnlinerateD;
import com.njcn.device.pq.pojo.vo.RStatOnlinerateVO;
import org.apache.ibatis.annotations.Param;
import java.util.List;
/**
* <p>
* 在线率日表 Mapper 接口
* </p>
*
* @author hongawen
* @since 2023-03-28
*/
public interface OnLineRateMapper extends BaseMapper<RStatOnlinerateD> {
/***
* 获取设备在线率
* @author wr
* @date 2023-04-03 10:10
* @param param
* @return List<OnlineRate>
*/
List<RStatOnlinerateVO> getOnlineRateByDevIds(@Param("param") OnlineRateParam param);
}

View File

@@ -0,0 +1,50 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.njcn.device.common.mapper.onlinerate.OnLineRateMapper">
<select id="getOnlineRateByDevIds" resultType="com.njcn.device.pq.pojo.vo.RStatOnlinerateVO">
select
dev_index,
sum(online_min) as onlineMin,
sum(offline_min) as offlineMin,
ROUND( sum(online_min)*1.0/(sum(online_min) + sum(offline_min))*100,2) as onlineRate
from r_stat_onlinerate_d
<where>
<if test="param!=null and param.ids != null and param.ids.size > 0">
AND dev_index IN
<foreach collection='param.ids' item='item' index="index" open='(' separator=',' close=')'>
#{item}
</foreach>
</if>
<if test=" param.startTime != null and param.startTime !=''">
AND time_id >= #{param.startTime}
</if>
<if test="param.endTime != null and param.endTime != ''">
AND time_id &lt;= #{param.endTime}
</if>
</where>
group by dev_index ;
</select>
<select id="getTotalOnlineRates" resultType="java.lang.Float">
select
if( sum( online_min )/( sum( online_min ) + sum( offline_min ))* 100 > 100,
100,
IFNULL( ROUND( sum( online_min )/( sum( online_min ) + sum( offline_min ))* 100, 2 ), 0 ))
as online_rate
from r_stat_onlinerate_d
<where>
<if test="param!=null and param.ids != null and param.ids.size > 0">
AND dev_index IN
<foreach collection='param.ids' item='item' index="index" open='(' separator=',' close=')'>
#{item}
</foreach>
</if>
<if test=" param.startTime != null and param.startTime !=''">
AND time_id >= #{param.startTime}
</if>
<if test="param.endTime != null and param.endTime != ''">
AND time_id &lt;= #{param.endTime}
</if>
</where>
</select>
</mapper>

View File

@@ -34,6 +34,7 @@ import com.njcn.system.pojo.enums.StatisticsEnum;
import com.njcn.system.pojo.po.DictData;
import com.njcn.user.api.DeptFeignClient;
import com.njcn.user.pojo.dto.DeptDTO;
import com.njcn.user.pojo.po.Dept;
import com.njcn.web.utils.WebUtil;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
@@ -796,12 +797,25 @@ public class GeneralDeviceService {
List<DictData> gradeType = dicDataFeignClient.getDicDataByTypeCode(DicDataTypeEnum.DEV_GRADE.getCode()).getData();
Map<String, Integer> gradeMap = gradeType.stream().collect(Collectors.toMap(DictData::getId, DictData::getAlgoDescribe));
List<DictData> manufacturerList = dicDataFeignClient.getDicDataByTypeCode(DicDataTypeEnum.DEV_MANUFACTURER.getCode()).getData();
Map<String, String> manufacturerMap = manufacturerList.stream().collect(Collectors.toMap(DictData::getId, DictData::getName));
List<Dept> deptList = deptFeignClient.getAllDept().getData();
Map<String, String> deptMap = deptList.stream().collect(Collectors.toMap(Dept::getId, Dept::getName));
List<DevDetail> devDetails = deviceMapper.selectDevByIds(devIds);
for (DevDetail devDetail : devDetails) {
//终端等级
if(gradeMap.containsKey(devDetail.getLineGrade())){
devDetail.setLineGrade(String.valueOf(gradeMap.get(devDetail.getLineGrade())));
}
//部门
if(deptMap.containsKey(devDetail.getDeptName())){
devDetail.setDeptName(deptMap.get(devDetail.getDeptName()));
}
//终端厂商
if(manufacturerMap.containsKey(devDetail.getManufacturer())){
devDetail.setManufacturer(manufacturerMap.get(devDetail.getManufacturer()));
}
}
return devDetails;
}

View File

@@ -0,0 +1,46 @@
package com.njcn.device.device.controller;
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.device.service.OnLineRateService;
import com.njcn.device.pq.pojo.param.DeviceInfoParam;
import com.njcn.device.pq.pojo.vo.common.DeviceOnlineRate;
import com.njcn.web.controller.BaseController;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.*;
/**
* @Description: 终端在线率
* @Author: wr
* @Date: 2025/11/26 10:28
*/
@Slf4j
@Api(tags = "终端在线率")
@RestController
@RequestMapping("/onLineRate")
@RequiredArgsConstructor
public class OnLineRateController extends BaseController {
private final OnLineRateService onLineRateService;
@OperateInfo(info = LogEnum.BUSINESS_COMMON)
@PostMapping("/deviceOnlineRateInfo")
@ApiOperation("终端在线率列表(冀北)")
public HttpResult<DeviceOnlineRate> deviceOnlineRateInfo(@RequestBody DeviceInfoParam.BusinessParam deviceInfoParam) {
String methodDescribe = getMethodDescribe("deviceOnlineRateInfo");
DeviceOnlineRate rate = onLineRateService.deviceOnlineRateInfo(deviceInfoParam);
return HttpResultUtil.assembleCommonResponseResult(CommonResponseEnum.SUCCESS, rate, methodDescribe);
}
}

View File

@@ -229,6 +229,7 @@
<select id="selectDevByIds" resultType="com.njcn.device.pq.pojo.vo.DevDetail">
SELECT DISTINCT
device.id as devIndex,
pd.Id as deptName,
gd.NAME as gdName,
substation.NAME as bdzName,
device.NAME as devName,
@@ -236,9 +237,12 @@
deviceDetail.Update_Time AS timeID,
deviceDetail.ip as ip,
deviceDetail.Com_Flag as comFlag,
deviceDetail.run_Flag as runFlag,
deviceDetail.Manufacturer as manufacturer,
deviceDetail.Next_Time_Check as nextTimeCheck
FROM
pq_line line,
pq_dept_line pd,
pq_line voltage,
pq_line device,
pq_line substation,
@@ -253,6 +257,7 @@
</foreach>
</if>
AND line.pid = voltage.id
AND line.id = pd.Line_Id
AND voltage.pid = device.id
AND device.pid = substation.id
AND substation.pid = gd.id

View File

@@ -0,0 +1,21 @@
package com.njcn.device.device.service;
import com.njcn.device.pq.pojo.param.DeviceInfoParam;
import com.njcn.device.pq.pojo.vo.common.DeviceOnlineRate;
/**
* @Description: 终端在线率
* @Author: wr
* @Date: 2025/11/26 10:27
*/
public interface OnLineRateService {
/**
* 终端详情列表
* @param deviceInfoParam
* @return
*/
DeviceOnlineRate deviceOnlineRateInfo(DeviceInfoParam.BusinessParam deviceInfoParam);
}

View File

@@ -0,0 +1,109 @@
package com.njcn.device.device.service.impl;
import cn.hutool.core.collection.CollUtil;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.njcn.device.common.service.GeneralDeviceService;
import com.njcn.device.device.service.OnLineRateService;
import com.njcn.device.common.mapper.onlinerate.OnLineRateMapper;
import com.njcn.device.pq.pojo.dto.GeneralDeviceDTO;
import com.njcn.device.pq.pojo.param.DeviceInfoParam;
import com.njcn.device.pq.pojo.param.OnlineRateParam;
import com.njcn.device.pq.pojo.po.RStatOnlinerateD;
import com.njcn.device.pq.pojo.vo.DevDetail;
import com.njcn.device.pq.pojo.vo.RStatOnlinerateVO;
import com.njcn.device.pq.pojo.vo.common.DeviceOnlineRate;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import java.math.BigDecimal;
import java.util.*;
import java.util.stream.Collectors;
/**
* @author wr
* @description
* @date 2025/11/26 10:26
*/
@Service
@RequiredArgsConstructor
public class OnLineRateServiceImpl extends ServiceImpl<OnLineRateMapper, RStatOnlinerateD> implements OnLineRateService {
private final GeneralDeviceService deviceService;
@Override
public DeviceOnlineRate deviceOnlineRateInfo(DeviceInfoParam.BusinessParam param) {
DeviceOnlineRate rate = new DeviceOnlineRate();
//获取终端台账类信息
List<GeneralDeviceDTO> deviceInfo = deviceService.getDeviceInfo(param, null, 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());
rate.setTotalNum(deviceIds.size());
OnlineRateParam onlineRateParam = new OnlineRateParam();
onlineRateParam.setIds(deviceIds);
onlineRateParam.setStartTime(param.getSearchBeginTime());
onlineRateParam.setEndTime(param.getSearchEndTime());
//获取所有终端在线率
List<RStatOnlinerateVO> onlineRateByDev = this.baseMapper.getOnlineRateByDevIds(onlineRateParam);
//获取所有终端信息
List<DevDetail> devInfoByIds = deviceService.getDevInfoByIds(deviceIds);
rate.setBelowNum(CollUtil.isNotEmpty(onlineRateByDev)?calculateOnLineRate(onlineRateByDev,90):deviceIds.size());
rate.setTotalOnlineRate(calculateOnLineRate(onlineRateByDev,deviceIds));
List<DeviceOnlineRate.CitDetail> citDetailList=new ArrayList<>();
DeviceOnlineRate.CitDetail citDetail;
DeviceOnlineRate.Detail detail;
for (GeneralDeviceDTO dto : deviceInfo) {
//获取部门终端集合
List<RStatOnlinerateVO> citDevOnRate = onlineRateByDev.stream().filter(x -> dto.getDeviceIndexes().contains(x.getDevIndex())).collect(Collectors.toList());
Map<String, Float> onlineRateByDevMap = citDevOnRate.stream()
.collect(Collectors.toMap(RStatOnlinerateVO::getDevIndex, RStatOnlinerateVO::getOnlineRate));
citDetail=new DeviceOnlineRate.CitDetail();
citDetail.setCitName(dto.getName());
citDetail.setCitTotalNum(dto.getDeviceIndexes().size());
citDetail.setCitBelowNum(CollUtil.isNotEmpty(citDevOnRate)?calculateOnLineRate(onlineRateByDev,90):dto.getDeviceIndexes().size());
citDetail.setCitTotalOnlineRate(calculateOnLineRate(onlineRateByDev,dto.getDeviceIndexes()));
List<DeviceOnlineRate.Detail> detailList = new ArrayList<>();
List<DevDetail> details = devInfoByIds.stream().filter(x -> dto.getDeviceIndexes().contains(x.getDevIndex())).collect(Collectors.toList());
for (DevDetail dev : details) {
detail=new DeviceOnlineRate.Detail();
detail.setCit(dev.getDeptName());
detail.setCompany(dev.getGdName());
detail.setSubStation(dev.getBdzName());
detail.setDeviceId(dev.getDevIndex());
detail.setDeviceName(dev.getDevName());
detail.setManufacturer(dev.getManufacturer());
detail.setIp(dev.getIp());
detail.setRunFlag(dev.getRunFlag());
detail.setComFlag(dev.getComFlag());
detail.setOnlineRate(onlineRateByDevMap.containsKey(dev.getDevIndex())?onlineRateByDevMap.get(dev.getDevIndex()).toString():"0");
detailList.add(detail);
}
citDetail.setDetailList(detailList);
citDetailList.add(citDetail);
}
rate.setCitDetailList(citDetailList);
}
return rate;
}
private String calculateOnLineRate(List<RStatOnlinerateVO> onlineRateByDev ,List<String> deviceIds){
List<RStatOnlinerateVO> list = onlineRateByDev.stream().filter(x -> deviceIds.contains(x.getDevIndex())).collect(Collectors.toList());
if(CollUtil.isNotEmpty(list)){
BigDecimal onlineMin = BigDecimal.valueOf(list.stream().mapToLong(RStatOnlinerateVO::getOnlineMin).sum());
BigDecimal offlineMin =BigDecimal.valueOf( list.stream().mapToLong(RStatOnlinerateVO::getOfflineMin).sum());
BigDecimal sumMin= onlineMin.add(offlineMin);
return onlineMin.divide(sumMin,2).toString();
}
return "0";
}
private Integer calculateOnLineRate(List<RStatOnlinerateVO> onlineRateByDev,Integer limit){
return onlineRateByDev.stream().filter(x -> x.getOnlineRate() < limit).collect(Collectors.toList()).size();
}
}