终端异常统计接口开发

This commit is contained in:
zhuxinyu
2023-03-28 11:34:18 +08:00
parent d84337a03a
commit c43d58051b
16 changed files with 889 additions and 20 deletions

View File

@@ -0,0 +1,46 @@
package com.njcn.prepare.harmonic.controller.device;
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.prepare.harmonic.pojo.param.DeviceAbnormaStatisticsParam;
import com.njcn.prepare.harmonic.service.mysql.device.DeviceAbnormalStatisticsService;
import com.njcn.web.controller.BaseController;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiOperation;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.*;
@Slf4j
@Api(tags = "终端异常")
@RestController
@RequestMapping("/deviceAbnormal")
@RequiredArgsConstructor
public class DeviceAbnormalController extends BaseController {
private final DeviceAbnormalStatisticsService deviceAbnormaStatisticsService;
@OperateInfo(info = LogEnum.BUSINESS_COMMON)
@PostMapping("/statistics")
@ApiOperation("终端异常统计")
@ApiImplicitParam(name = "param", value = "参数", required = true)
public HttpResult<Boolean> dailyDeviceAbnormaStatistics(@RequestBody DeviceAbnormaStatisticsParam param){
String methodDescribe = getMethodDescribe("dailyDeviceAbnormaStatistics");
boolean res = deviceAbnormaStatisticsService.dailyDeviceAbnormaStatistics(param);
if(res){
return HttpResultUtil.assembleCommonResponseResult(CommonResponseEnum.SUCCESS, null, methodDescribe);
}else {
return HttpResultUtil.assembleCommonResponseResult(CommonResponseEnum.FAIL, null, methodDescribe);
}
}
}

View File

@@ -0,0 +1,25 @@
package com.njcn.prepare.harmonic.mapper.mysql.device;
import cn.hutool.core.date.DateTime;
import com.njcn.prepare.harmonic.pojo.mysql.po.line.AlarmPO;
import com.njcn.prepare.harmonic.pojo.mysql.po.line.AlarmStrategyVO;
import com.njcn.prepare.harmonic.pojo.mysql.po.line.LinePO;
import com.njcn.prepare.harmonic.pojo.mysql.po.line.TopMsgPO;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import java.util.List;
@Mapper
public interface DeviceAbnormaStatisticsMapper {
List<LinePO> getLines();
List<AlarmPO> getAlarmByDevice(@Param("startTime") DateTime startTime, @Param("endTime") DateTime endTime);
List<AlarmPO> getAlarmByLines(@Param("startTime") DateTime startTime, @Param("endTime") DateTime endTime);
Boolean insertTopMsg(@Param("list") List<TopMsgPO> topMsgPOS);
List<AlarmStrategyVO> selectAlarmStrategy();
}

View File

@@ -0,0 +1,150 @@
<?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.prepare.harmonic.mapper.mysql.device.DeviceAbnormaStatisticsMapper">
<insert id="insertTopMsg">
INSERT INTO pqs_top_msg(
`Time_Id`,
`Dev_Id`,
`Comout_Count`,
`Comout_Desc`,
`Integrity_Flag`,
`Integrity_Value`,
`Alarm_Count`,
`Alarm_Desc`,
`Flow_Flag`,
`Flow_Value`,
`State`
) VALUES
<foreach collection="list" separator="," item="item">
(
now(),
#{item.devId},
#{item.comOutCount},
#{item.comOutDesc},
#{item.integrityFlag},
#{item.integrityValue},
IFNULL(#{item.alarmCount},0),
#{item.alarmDesc},
#{item.flowFlag},
#{item.flowValue},
1
)
</foreach>
</insert>
<select id="getLines" resultType="com.njcn.prepare.harmonic.pojo.mysql.po.line.LinePO">
(SELECT line.Id AS Id,
device.id AS deviceId,
COUNT(ca.Id) AS alarmCount,
GROUP_CONCAT(ca.Remark) AS alarmDesc
FROM pq_line line
INNER JOIN pq_line vol ON line.pid=vol.id
INNER JOIN pq_line device ON vol.pid=device.id
LEFT JOIN pq_device pd ON device.id=pd.id
LEFT JOIN pq_line_detail pld ON pld.id=line.id
LEFT JOIN cld_alarm ca ON ca.Line_Id=line.id
WHERE
pd.Dev_Model=1
AND
pd.Run_Flag=0
AND
pld.Line_Grade is NOT NULL
GROUP BY deviceId)
UNION ALL
(SELECT device.Id AS Id,
device.id AS deviceId,
COUNT(ca.Id) AS alarmCount,
GROUP_CONCAT(ca.Remark) AS alarmDesc
FROM pq_line line
INNER JOIN pq_line vol ON line.pid=vol.id
INNER JOIN pq_line device ON vol.pid=device.id
LEFT JOIN pq_device pd ON device.id=pd.id
LEFT JOIN pq_line_detail pld ON pld.id=line.id
LEFT JOIN cld_alarm ca ON ca.Line_Id=device.id
WHERE
pd.Dev_Model=1
AND
pd.Run_Flag=0
AND
pld.Line_Grade is NOT NULL
GROUP BY deviceId)
</select>
<select id="getAlarmByDevice" resultType="com.njcn.prepare.harmonic.pojo.mysql.po.line.AlarmPO">
SELECT t.*,
(t.statisValue)/t.flowMeal flowProportion
FROM
(
SELECT device.Id AS Id,
device.id AS deviceId,
COUNT(ca.Id) AS alarmCount,
GROUP_CONCAT(ca.Remark) AS alarmDesc,
IFNULL(d.flow, (select flow from cld_flow_meal where type = 0 and flag = 1)) + ifnull(d1.flow, 0) flowMeal,
IFNULL(pmf.Actual_Value,0) statisValue
FROM pq_line line
INNER JOIN pq_line vol ON line.pid=vol.id
INNER JOIN pq_line device ON vol.pid=device.id
LEFT JOIN pq_device pd ON device.id=pd.id
LEFT JOIN pq_line_detail pld ON pld.id=line.id
LEFT JOIN cld_alarm ca ON ca.Line_Id=device.id
LEFT JOIN pqs_month_flow pmf ON pmf.Dev_Id=device.id
LEFT JOIN cld_dev_meal c ON device.id = c.line_id
LEFT JOIN cld_flow_meal d ON c.Base_Meal_Id = d.id
LEFT JOIN cld_flow_meal d1 ON c.Ream_Meal_Id = d1.id
WHERE
pd.Dev_Model = 1
AND
pd.Run_Flag = 0
AND
pld.Line_Grade is NOT NULL
AND
ca.Occurred_Time between #{startTime} and #{endTime}
GROUP BY deviceId
) t
ORDER BY flowProportion DESC
</select>
<select id="getAlarmByLines" resultType="com.njcn.prepare.harmonic.pojo.mysql.po.line.AlarmPO">
SELECT GROUP_CONCAT(line.Id) AS Id,
device.id AS deviceId,
COUNT(ca.Id) AS alarmCount,
GROUP_CONCAT(ca.Remark) AS alarmDesc,
MIN(sdd.Algo_Describe) AS `level`,
IFNULL(SUM(pi.Due),0) AS due,
IFNULL(SUM(pi.Real),0) AS `real`
FROM pq_line line
INNER JOIN pq_line vol ON line.pid=vol.id
INNER JOIN pq_line device ON vol.pid=device.id
LEFT JOIN pq_device pd ON device.id=pd.id
LEFT JOIN pq_line_detail pld ON pld.id=line.id
LEFT JOIN cld_alarm ca ON ca.Line_Id=line.id
LEFT JOIN pqs_integrity pi ON pi.LINE_Id=line.Id
LEFT JOIN sys_dict_data sdd ON sdd.Id=pld.Line_Grade
WHERE
pd.Dev_Model=1
AND
pd.Run_Flag=0
AND
pld.Line_Grade is NOT NULL
AND
ca.Occurred_Time between #{startTime} and #{endTime}
GROUP BY deviceId
ORDER BY alarmCount DESC
</select>
<select id="selectAlarmStrategy" resultType="com.njcn.prepare.harmonic.pojo.mysql.po.line.AlarmStrategyVO">
SELECT
A.`Id` id,
B.`Name` name,
A.`Integrity_Value` integrityValue,
A.`Online_Value` onlineValue,
A.`Offtime_Value` offTimeValue,
A.`Warn_Value` warnValue,
A.`Update_Time` updateTime,
B.Algo_Describe algoDesc
FROM
pqs_alarm_strategy A,
sys_dict_data B
WHERE A.State = 1
AND A.Id = B.Id
</select>
</mapper>

View File

@@ -0,0 +1,133 @@
package com.njcn.prepare.harmonic.service.mysql.Impl.device;
import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.date.DateUtil;
import com.njcn.device.pq.pojo.po.Communicate;
import com.njcn.influxdb.param.InfluxDBPublicParam;
import com.njcn.influxdb.utils.InfluxDbUtils;
import com.njcn.prepare.harmonic.mapper.mysql.device.DeviceAbnormaStatisticsMapper;
import com.njcn.prepare.harmonic.pojo.dto.GeneralDeviceDTO;
import com.njcn.prepare.harmonic.pojo.mysql.po.line.AlarmPO;
import com.njcn.prepare.harmonic.pojo.mysql.po.line.AlarmStrategyVO;
import com.njcn.prepare.harmonic.pojo.mysql.po.line.LinePO;
import com.njcn.prepare.harmonic.pojo.mysql.po.line.TopMsgPO;
import com.njcn.prepare.harmonic.pojo.param.DeviceAbnormaStatisticsParam;
import com.njcn.prepare.harmonic.service.mysql.device.DeviceAbnormalStatisticsService;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang.StringUtils;
import org.influxdb.dto.QueryResult;
import org.influxdb.impl.InfluxDBResultMapper;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import java.math.BigDecimal;
import java.util.*;
import java.util.stream.Collectors;
/**
*
*/
@Service
@RequiredArgsConstructor
@Slf4j
public class DeviceAbnormaStatisticsServiceImpl implements DeviceAbnormalStatisticsService {
private final DeviceAbnormaStatisticsMapper deviceAbnormaStatisticsMapper;
private final InfluxDbUtils influxDbUtils;
@Override
public boolean dailyDeviceAbnormaStatistics(DeviceAbnormaStatisticsParam param) {
// 获取监测点告警
List<AlarmPO> lineAlarms = deviceAbnormaStatisticsMapper.getAlarmByLines(
DateUtil.beginOfDay(DateUtil.parse(param.getBeginTime())),
DateUtil.beginOfDay(DateUtil.parse(param.getEndTime())));
Map<String, List<AlarmPO>> lineMap = new HashMap<>();
if (CollectionUtil.isNotEmpty(lineAlarms)){
// 根据装置分组
lineMap = lineAlarms.stream().collect(Collectors.groupingBy(AlarmPO::getDeviceId));
}
// 获取设备流量
List<AlarmPO> deviceAlarms = deviceAbnormaStatisticsMapper.getAlarmByDevice(
DateUtil.beginOfDay(DateUtil.parse(param.getBeginTime())),
DateUtil.beginOfDay(DateUtil.parse(param.getEndTime())));
List<String> devs = deviceAlarms.stream().map(AlarmPO::getId).collect(Collectors.toList());
devs.add("6469e77fda42db12c7ca6620a092f03c");
Map<String, List<Communicate>> comMap = new HashMap<>();
// 获取通信中断信息
List<Communicate> communicate = getCommunicate(devs, param.getBeginTime(), param.getEndTime());
if (CollectionUtil.isNotEmpty(communicate)){
comMap = communicate.stream().collect(Collectors.groupingBy(Communicate::getId));
}
for (AlarmPO deviceAlarm : deviceAlarms) {
if (!lineMap.containsKey(deviceAlarm.getId())) {
continue;
}
AlarmPO lineAlarm = lineMap.get(deviceAlarm.getId()).get(0);
deviceAlarm.setAlarmCount(deviceAlarm.getAlarmCount() + lineAlarm.getAlarmCount());
if (lineAlarm.getDue().compareTo(BigDecimal.ZERO) == 0) {
deviceAlarm.setIntegrity(BigDecimal.ZERO);
} else {
deviceAlarm.setIntegrity(lineAlarm.getReal().divide(lineAlarm.getDue(), 2, BigDecimal.ROUND_HALF_UP));
}
if (lineAlarm.getLevel() != null) {
deviceAlarm.setLevel(lineAlarm.getLevel());
}
if (CollectionUtil.isNotEmpty(comMap)) {
List<Communicate> communicates = comMap.get(deviceAlarm.getId());
int comOut = communicates.stream().filter(t -> t.getType() == 0).collect(Collectors.toList()).size();
deviceAlarm.setComOutNum(comOut);
}
}
Map<Integer, List<AlarmPO>> levelMap = deviceAlarms.stream().collect(Collectors.groupingBy(AlarmPO::getLevel));
List<AlarmStrategyVO> alarmStrategyVOS = deviceAbnormaStatisticsMapper.selectAlarmStrategy();
List<TopMsgPO> alarmExceptions = new ArrayList<>();
for (AlarmStrategyVO strategyVO : alarmStrategyVOS) {
if (!levelMap.containsKey(strategyVO.getAlgoDesc())){
continue;
}
List<AlarmPO> alarmPOS = levelMap.get(strategyVO.getAlgoDesc());
for (AlarmPO alarmPO : alarmPOS) {
TopMsgPO topMsg = new TopMsgPO();
topMsg.setDevId(alarmPO.getId());
topMsg.setFlowFlag(1);
topMsg.setComOutCount(alarmPO.getComOutNum() == 0 ? 0 : alarmPO.getComOutNum());
if (alarmPO.getIntegrity().intValue()<strategyVO.getIntegrityValue()) {
topMsg.setIntegrityFlag("0");
topMsg.setIntegrityValue(alarmPO.getIntegrity().intValue());
}
if (alarmPO.getAlarmCount()>strategyVO.getWarnValue()){
topMsg.setAlarmCount(alarmPO.getAlarmCount());
topMsg.setAlarmDesc(alarmPO.getAlarmDesc());
}
if (alarmPO.getStatisValue()>alarmPO.getFlowMeal()) {
topMsg.setFlowFlag(0);
topMsg.setFlowValue(alarmPO.getFlowProportion());
}
alarmExceptions.add(topMsg);
}
}
return deviceAbnormaStatisticsMapper.insertTopMsg(alarmExceptions);
}
public List<Communicate> getCommunicate(List<String> devs, String startTime, String endTime) {
//组装sql语句
StringBuilder stringBuilder = new StringBuilder();
stringBuilder.append("time >= '").append(DateUtil.beginOfDay(DateUtil.parse(startTime))).append("' and ").append("time <= '").append(DateUtil.endOfDay(DateUtil.parse(endTime))).append("' and ");
for (int i = 0; i < devs.size(); i++) {
if (devs.size() - i != 1) {
stringBuilder.append("dev_id ='").append(devs.get(i)).append("' or ");
} else {
stringBuilder.append("dev_id ='").append(devs.get(i)).append("' ");
}
}
String sql = "select * from " + InfluxDBPublicParam.PQS_COMMUNICATE + " where " + stringBuilder.toString() + InfluxDBPublicParam.TIME_ZONE;
//获取暂降事件
QueryResult result = influxDbUtils.query(sql);
InfluxDBResultMapper influxDBResultMapper = new InfluxDBResultMapper();
List<Communicate> communicateList = influxDBResultMapper.toPOJO(result, Communicate.class);
return communicateList;
}
}

View File

@@ -0,0 +1,7 @@
package com.njcn.prepare.harmonic.service.mysql.device;
import com.njcn.prepare.harmonic.pojo.param.DeviceAbnormaStatisticsParam;
public interface DeviceAbnormalStatisticsService {
boolean dailyDeviceAbnormaStatistics(DeviceAbnormaStatisticsParam param);
}