在线监测

1.数据生成
2.分页查询
3.预告警单下发
This commit is contained in:
xy
2024-06-18 18:12:02 +08:00
parent 88bbfcc607
commit 0140a1166d
10 changed files with 679 additions and 4 deletions

View File

@@ -0,0 +1,74 @@
package com.njcn.supervision.controller.device;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
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.supervision.pojo.param.device.OnlineParam;
import com.njcn.supervision.pojo.po.device.LineWarning;
import com.njcn.supervision.pojo.vo.device.OnlineVo;
import com.njcn.supervision.service.device.ILineWarningService;
import com.njcn.supervision.service.leaflet.IWarningLeafletService;
import com.njcn.web.controller.BaseController;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiOperation;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.validation.annotation.Validated;
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;
/**
* <p>
* 监测点每日稳态指标超标天数统计表 前端控制器
* </p>
*
* @author xy
* @since 2024-06-17
*/
@Slf4j
@RestController
@RequestMapping("/onlineMonitor")
@Api(tags = "在线监测")
@AllArgsConstructor
public class LineWarningController extends BaseController {
private final ILineWarningService lineWarningService;
@OperateInfo(info = LogEnum.BUSINESS_COMMON)
@PostMapping("/add")
@ApiOperation("新增在线监测数据")
public HttpResult<String> add() {
String methodDescribe = getMethodDescribe("add");
lineWarningService.addLineWarning();
return HttpResultUtil.assembleCommonResponseResult(CommonResponseEnum.SUCCESS, null, methodDescribe);
}
@OperateInfo(info = LogEnum.BUSINESS_COMMON)
@PostMapping("/list")
@ApiOperation("分页查询在线监测数据")
@ApiImplicitParam(name = "param", value = "参数", required = true)
public HttpResult<Page<OnlineVo>> lineWarningList(@RequestBody @Validated OnlineParam param) {
String methodDescribe = getMethodDescribe("lineWarningList");
Page<OnlineVo> list = lineWarningService.getLineWarningList(param);
return HttpResultUtil.assembleCommonResponseResult(CommonResponseEnum.SUCCESS, list, methodDescribe);
}
@OperateInfo(info = LogEnum.BUSINESS_COMMON)
@PostMapping("/report")
@ApiOperation("发起预告警单")
@ApiImplicitParam(name = "param", value = "参数", required = true)
public HttpResult<String> startReport(@RequestBody @Validated OnlineParam.ReportParam param) {
String methodDescribe = getMethodDescribe("startReport");
lineWarningService.startReport(param);
return HttpResultUtil.assembleCommonResponseResult(CommonResponseEnum.SUCCESS, "success", methodDescribe);
}
}

View File

@@ -1,12 +1,10 @@
package com.njcn.supervision.mapper.device;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.github.jeffreyning.mybatisplus.base.MppBaseMapper;
import com.njcn.supervision.pojo.po.device.CheckDevice;
import com.njcn.supervision.pojo.vo.device.CheckDeviceVo;
import com.njcn.user.pojo.vo.UserVO;
import org.apache.ibatis.annotations.Param;
/**
@@ -19,7 +17,7 @@ import org.apache.ibatis.annotations.Param;
*/
public interface CheckDeviceMapper extends MppBaseMapper<CheckDevice> {
Page<CheckDeviceVo> page(@Param("page") Page<UserVO> page, @Param("ew") QueryWrapper<CheckDeviceVo> queryWrapper);
Page<CheckDeviceVo> page(@Param("page") Page<CheckDeviceVo> page, @Param("ew") QueryWrapper<CheckDeviceVo> queryWrapper);
CheckDeviceVo getInfo(@Param("id") String id);

View File

@@ -0,0 +1,22 @@
package com.njcn.supervision.mapper.device;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.github.jeffreyning.mybatisplus.base.MppBaseMapper;
import com.njcn.supervision.pojo.po.device.LineWarning;
import com.njcn.supervision.pojo.vo.device.OnlineVo;
import org.apache.ibatis.annotations.Param;
/**
* <p>
* 监测点每日稳态指标超标天数统计表 Mapper 接口
* </p>
*
* @author xy
* @since 2024-06-17
*/
public interface LineWarningMapper extends MppBaseMapper<LineWarning> {
Page<OnlineVo> page(@Param("page") Page<LineWarning> page, @Param("ew") QueryWrapper<LineWarning> queryWrapper);
}

View File

@@ -0,0 +1,33 @@
<?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.supervision.mapper.device.LineWarningMapper">
<select id="page" resultType="OnlineVo">
select
A.id id,
D.Name dept,
p4.Name substation,
p3.Name deviceName,
p1.Name lineName,
A.line_id lineId,
B.Business_Type businessType,
B.Obj_Name objectName,
A.target_type targetType,
A.over_limit_day overLimitDay,
A.initiate_warning_flag dataResource
from
supervision_line_warning A
left join pq_line p1 on A.line_id = p1.Id
left join pq_line p2 on p1.Pid = p2.Id
left join pq_line p3 on p2.Pid = p3.Id
left join pq_line p4 on p3.Pid = p4.Id
left join pq_line p5 on p4.Pid = p5.Id
left join pq_line_detail B on A.line_id = B.Id
left join pq_dept_line C on A.line_id = C.Line_Id
left join sys_dept D on C.Id = D.Id
<where>
and ${ew.sqlSegment}
</where>
</select>
</mapper>

View File

@@ -0,0 +1,38 @@
package com.njcn.supervision.service.device;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import com.njcn.supervision.pojo.param.device.OnlineParam;
import com.njcn.supervision.pojo.po.device.LineWarning;
import com.njcn.supervision.pojo.vo.device.OnlineVo;
/**
* <p>
* 监测点每日稳态指标超标天数统计表 服务类
* </p>
*
* @author xy
* @since 2024-06-17
*/
public interface ILineWarningService extends IService<LineWarning> {
/**
* 每天定时计算各监测点各个指标超标情况
*/
void addLineWarning();
/**
* 获取在线监测的数据列表
* @param param
* @return
*/
Page<OnlineVo> getLineWarningList(OnlineParam param);
/**
* 发起预告警单
* @param param
* @return
*/
void startReport(OnlineParam.ReportParam param);
}

View File

@@ -101,7 +101,7 @@ public class CheckDeviceServiceImpl extends MppServiceImpl<CheckDeviceMapper, Ch
//查询参数不为空,进行条件填充
if (StrUtil.isNotBlank(param.getSearchValue())) {
queryWrapper
.and(par -> par.like("B.Name", param.getSearchValue()));
.and(par -> par.like("B.Name", param.getSearchValue()).or().like("B1.Name", param.getSearchValue()));
}
//排序
if (ObjectUtil.isAllNotEmpty(param.getSortBy(), param.getOrderBy())) {

View File

@@ -0,0 +1,328 @@
package com.njcn.supervision.service.device.impl;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.date.DatePattern;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.IdUtil;
import com.alibaba.nacos.common.utils.UuidUtils;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.github.jeffreyning.mybatisplus.service.MppServiceImpl;
import com.njcn.device.biz.commApi.CommTerminalGeneralClient;
import com.njcn.device.biz.pojo.param.DeptGetLineParam;
import com.njcn.harmonic.api.RStatLimitRateDClient;
import com.njcn.harmonic.pojo.param.RStatLimitQueryParam;
import com.njcn.harmonic.pojo.po.day.RStatLimitTargetDPO;
import com.njcn.supervision.enums.ProblemTypeEnum;
import com.njcn.supervision.mapper.device.LineWarningMapper;
import com.njcn.supervision.pojo.param.device.OnlineParam;
import com.njcn.supervision.pojo.po.device.LineWarning;
import com.njcn.supervision.pojo.vo.device.OnlineVo;
import com.njcn.supervision.service.device.ILineWarningService;
import com.njcn.supervision.service.leaflet.IWarningLeafletService;
import com.njcn.system.api.DicDataFeignClient;
import com.njcn.system.enums.DicDataEnum;
import com.njcn.system.enums.DicDataTypeEnum;
import com.njcn.system.pojo.po.DictData;
import com.njcn.web.factory.PageFactory;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.lang.reflect.Method;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.*;
import java.util.function.Function;
import java.util.stream.Collectors;
/**
* <p>
* 监测点每日稳态指标超标天数统计表 服务实现类
* </p>
*
* @author xy
* @since 2024-06-17
*/
@Service
@RequiredArgsConstructor
public class LineWarningServiceImpl extends MppServiceImpl<LineWarningMapper, LineWarning> implements ILineWarningService {
private final DicDataFeignClient dicDataFeignClient;
private final RStatLimitRateDClient limitRateDClient;
private final CommTerminalGeneralClient commTerminalGeneralClient;
private final IWarningLeafletService warningLeafletService;
@Override
@Transactional(rollbackFor = Exception.class)
public void addLineWarning() {
List<LineWarning> addList = new ArrayList<>();
List<LineWarning> updateList = new ArrayList<>();
//获取指标集合(10个指标包含总指标)
List<DictData> dataList = dicDataFeignClient.getDicDataByTypeCode(DicDataTypeEnum.STEADY_STATIS.getCode()).getData();
Map<String, DictData> targetMap = dataList.stream().collect(Collectors.toMap(DictData::getCode, Function.identity()));
//获取当前表的数据
List<LineWarning> lineWarningList = this.baseMapper.selectList(null);
Map<String, List<LineWarning>> lineWarningMap = lineWarningList.stream().collect(Collectors.groupingBy(LineWarning::getLineId));
//获取所有监测点id
List<String> lineList = commTerminalGeneralClient.getRunMonitorIds().getData();
RStatLimitQueryParam param = new RStatLimitQueryParam();
String date = DateUtil.format(LocalDateTime.now().minusDays(1), DatePattern.NORM_DATE_PATTERN);
param.setDate(date);
param.setIds(lineList);
//获取监测点越限信息
List<RStatLimitTargetDPO> limitTarget = limitRateDClient.monitorIdsGetLimitTargetInfo(param).getData();
Map<String, RStatLimitTargetDPO> limitMap = limitTarget.stream().collect(Collectors.toMap(RStatLimitTargetDPO::getLineId, Function.identity()));
for (RStatLimitTargetDPO item : limitTarget) {
List<LineWarning> lineWarnings = lineWarningMap.get(item.getLineId());
if (CollUtil.isEmpty(lineWarnings)) {
addList.addAll(getTargetInfo(item.getLineId(),targetMap,limitMap));
} else {
//1.查询各指标越限时间不超过10天超标则每天递增不超标则清零
//2.越限时间超过10天未超过15天超标则每天递增不超标保存当前记录新增一条记录
//3.越限时间超过15天超标则每天递增不超标保存当前记录新增一条记录
//4.发过告警单,则重新生成一条数据
RStatLimitTargetDPO dpo = limitMap.get(item.getLineId());
//频率偏差
targetInfo(lineWarnings,targetMap,DicDataEnum.FREQUENCY_DEV.getCode(),dpo,item.getLineId(),addList,updateList);
//电压偏差
targetInfo(lineWarnings,targetMap,DicDataEnum.VOLTAGE_DEV.getCode(),dpo,item.getLineId(),addList,updateList);
//长时闪变
targetInfo(lineWarnings,targetMap,DicDataEnum.FLICKER.getCode(),dpo,item.getLineId(),addList,updateList);
//谐波电压
targetInfo(lineWarnings,targetMap,DicDataEnum.HARMONIC_VOLTAGE.getCode(),dpo,item.getLineId(),addList,updateList);
//谐波电流
targetInfo(lineWarnings,targetMap,DicDataEnum.HARMONIC_CURRENT.getCode(),dpo,item.getLineId(),addList,updateList);
//间谐波电压
targetInfo(lineWarnings,targetMap,DicDataEnum.INTERHARMONIC_VOLTAGE.getCode(),dpo,item.getLineId(),addList,updateList);
//负序电压不平衡度
targetInfo(lineWarnings,targetMap,DicDataEnum.phase_Voltage.getCode(),dpo,item.getLineId(),addList,updateList);
//负序电流
targetInfo(lineWarnings,targetMap,DicDataEnum.NEG_CURRENT.getCode(),dpo,item.getLineId(),addList,updateList);
//电压总谐波畸变率
targetInfo(lineWarnings,targetMap,DicDataEnum.THD_V.getCode(),dpo,item.getLineId(),addList,updateList);
//总稳态指标
targetInfo(lineWarnings,targetMap,DicDataEnum.TOTAL_INDICATOR.getCode(),dpo,item.getLineId(),addList,updateList);
}
}
this.saveBatch(addList);
this.updateBatchById(updateList);
}
@Override
public Page<OnlineVo> getLineWarningList(OnlineParam param) {
DeptGetLineParam deptGetLineParam = new DeptGetLineParam();
deptGetLineParam.setDeptId(param.getDeptId());
List<String> lineList = commTerminalGeneralClient.deptGetLineList(deptGetLineParam)
.getData()
.stream()
.flatMap(item -> item.getLineIds().stream())
.distinct()
.collect(Collectors.toList());;
QueryWrapper<LineWarning> queryWrapper = new QueryWrapper<>();
queryWrapper.between("A.alarm_time", param.getSearchBeginTime(),param.getSearchEndTime());
queryWrapper.le("A.alert_threshold", param.getAlertThreshold());
if (CollUtil.isNotEmpty(lineList)) {
queryWrapper.in("A.line_id",lineList);
}
if (!Objects.isNull(param.getTargetId())) {
queryWrapper.eq("A.target_type", param.getTargetId());
}
return this.baseMapper.page(new Page<>(PageFactory.getPageNum(param), PageFactory.getPageSize(param)), queryWrapper);
}
@Override
@Transactional(rollbackFor = Exception.class)
public void startReport(OnlineParam.ReportParam param) {
//下发预告警单
warningLeafletService.createLeaflet(ProblemTypeEnum.ONLINE.getName(), IdUtil.fastSimpleUUID(), param.getId(), ProblemTypeEnum.ONLINE.getCode(),param.getType(),param.getIssueDetail());
//更新supervision_line_warning表字段信
LineWarning lineWarning = this.baseMapper.selectById(param.getId());
if (lineWarning.getThresholdResource() == 0) {
lineWarning.setInitiateWarningFlag(1);
lineWarning.setAlertThreshold(10);
lineWarning.setAlarmThreshold(15);
} else {
lineWarning.setInitiateWarningFlag(1);
lineWarning.setThresholdResource(1);
lineWarning.setAlertThreshold(param.getAlertThreshold());
lineWarning.setAlarmThreshold(param.getAlarmThreshold());
}
this.baseMapper.updateById(lineWarning);
}
/**
* 获取监测点各指标的超标天数
*/
public List<LineWarning> getTargetInfo(String lineId, Map<String, DictData> map, Map<String, RStatLimitTargetDPO> limitMap) {
List<LineWarning> result = new ArrayList<>();
map.forEach((k,v)->{
LineWarning lineWarning = new LineWarning();
lineWarning.setAlarmTime(LocalDate.now().minusDays(1));
lineWarning.setLineId(lineId);
lineWarning.setTargetType(v.getId());
lineWarning.setOverLimitDay(overDay(k,limitMap.get(lineId)));
lineWarning.setInitiateWarningFlag(0);
lineWarning.setStep(0);
result.add(lineWarning);
});
return result;
}
public int overDay(String code, RStatLimitTargetDPO limitTarget) {
int result = 0;
try {
//频率偏差
if (Objects.equals(code,DicDataEnum.FREQUENCY_DEV.getCode())) {
result = limitTarget.getFreqDevOvertime();
}
//电压偏差
else if (Objects.equals(code,DicDataEnum.VOLTAGE_DEV.getCode())) {
result = limitTarget.getVoltageDevOvertime();
}
//长时闪变
else if (Objects.equals(code,DicDataEnum.FLICKER.getCode())) {
result = limitTarget.getFlickerOvertime();
}
//谐波电压
else if (Objects.equals(code,DicDataEnum.HARMONIC_VOLTAGE.getCode())) {
int sum = 0;
Class<?> clazz = limitTarget.getClass();
for (int i = 2; i <= 25; i++) {
String methodName = "getUharm" + i + "Overtime";
Method method = clazz.getMethod(methodName);
int value = (int) method.invoke(limitTarget);
sum += value;
}
result = limitTarget.getUaberranceOvertime() + sum;
}
//谐波电流
else if (Objects.equals(code,DicDataEnum.HARMONIC_CURRENT.getCode())) {
int sum = 0;
Class<?> clazz = limitTarget.getClass();
for (int i = 2; i <= 25; i++) {
String methodName = "getIharm" + i + "Overtime";
Method method = clazz.getMethod(methodName);
int value = (int) method.invoke(limitTarget);
sum += value;
}
result = sum;
}
//间谐波电压
else if (Objects.equals(code,DicDataEnum.INTERHARMONIC_VOLTAGE.getCode())) {
int sum = 0;
Class<?> clazz = limitTarget.getClass();
for (int i = 1; i <= 16; i++) {
String methodName = "getInuharm" + i + "Overtime";
Method method = clazz.getMethod(methodName);
int value = (int) method.invoke(limitTarget);
sum += value;
}
result = sum;
}
//负序电压不平衡度
else if (Objects.equals(code,DicDataEnum.PHASE_VOLTAGE.getCode())) {
result = limitTarget.getUbalanceOvertime();
}
//负序电流
else if (Objects.equals(code,DicDataEnum.NEG_CURRENT.getCode())) {
result = limitTarget.getINegOvertime();
}
//电压总谐波畸变率
else if (Objects.equals(code,DicDataEnum.THD_V.getCode())) {
result = limitTarget.getUaberranceOvertime();
}
//总稳态指标
else if (Objects.equals(code,DicDataEnum.TOTAL_INDICATOR.getCode())) {
int sum1 = 0,sum2 = 0,sum3 = 0;
Class<?> clazz = limitTarget.getClass();
for (int i = 2; i <= 25; i++) {
String methodName1 = "getUharm" + i + "Overtime";
Method method1 = clazz.getMethod(methodName1);
int value1 = (int) method1.invoke(limitTarget);
sum1 += value1;
String methodName2 = "getIharm" + i + "Overtime";
Method method2 = clazz.getMethod(methodName2);
int value2 = (int) method2.invoke(limitTarget);
sum2 += value2;
}
for (int i = 1; i <= 16; i++) {
String methodName = "getInuharm" + i + "Overtime";
Method method = clazz.getMethod(methodName);
int value = (int) method.invoke(limitTarget);
sum3 += value;
}
result = limitTarget.getFreqDevOvertime()
+ limitTarget.getVoltageDevOvertime()
+ limitTarget.getFlickerOvertime()
+ sum1
+ sum2
+ sum3
+ limitTarget.getUbalanceOvertime()
+ limitTarget.getINegOvertime()
+ limitTarget.getUaberranceOvertime();
}
} catch (Exception e) {
e.printStackTrace();
}
return result > 0 ? 1:0;
}
/**
* 各指标计算 系统默认阈值:预警单10天 告警单15天
*/
public void targetInfo(List<LineWarning> lineWarnings, Map<String, DictData> targetMap, String target, RStatLimitTargetDPO dpo, String item, List<LineWarning> addList, List<LineWarning> updateList) {
List<LineWarning> l1 = lineWarnings.stream().filter(o->Objects.equals(o.getTargetType(),targetMap.get(target).getId())).collect(Collectors.toList());
//获取最新的一条记录
LineWarning line = l1.stream().max(Comparator.comparing(LineWarning::getAlarmTime)).orElse(null);
//当前监测点连续越限天数
int day = line.getOverLimitDay();
//当天是否越限 0:未越限 1:越限
int result = overDay(target,dpo);
if (result == 0) {
if (day < 10) {
line.setOverLimitDay(0);
updateList.add(line);
} else {
LineWarning lineWarning = new LineWarning();
lineWarning.setAlarmTime(LocalDate.now().minusDays(1));
lineWarning.setLineId(item);
lineWarning.setTargetType(targetMap.get(target).getId());
lineWarning.setOverLimitDay(0);
lineWarning.setInitiateWarningFlag(0);
lineWarning.setStep(0);
addList.add(lineWarning);
}
} else {
if (day < 9) {
line.setOverLimitDay(day + 1);
} else if (day < 14) {
line.setOverLimitDay(day + 1);
line.setStep(1);
line.setAlertThreshold(10);
line.setAlarmThreshold(15);
line.setThresholdResource(0);
} else {
//已发告警单,重新生成记录
if (line.getInitiateWarningFlag() == 1 && line.getStep() == 2) {
LineWarning lineWarning = new LineWarning();
lineWarning.setAlarmTime(LocalDate.now().minusDays(1));
lineWarning.setLineId(item);
lineWarning.setTargetType(targetMap.get(target).getId());
lineWarning.setOverLimitDay(result);
lineWarning.setInitiateWarningFlag(0);
lineWarning.setStep(0);
addList.add(lineWarning);
}
//未发告警单,继续添加越限天数
else {
line.setOverLimitDay(day + 1);
line.setStep(2);
}
}
updateList.add(line);
}
}
}