From f7aca83257d4bb4751a0fa40ba003de597d344a9 Mon Sep 17 00:00:00 2001 From: weitang Date: Thu, 8 May 2025 16:51:43 +0800 Subject: [PATCH] =?UTF-8?q?=E5=91=8A=E8=AD=A6=E9=80=BB=E8=BE=91=E4=BC=98?= =?UTF-8?q?=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../iec104/client/MasterSysDataHandler.java | 8 +- .../client/IEC61850ClientListener.java | 8 +- .../DeviceAlarmRecordController.java | 57 --- .../controller/DeviceWorkDataController.java | 4 - .../auxcontrol/controller/IECController.java | 19 - .../auxcontrol/domain/DeviceAlarmRecord.java | 238 ---------- .../mapper/DeviceAlarmRecordMapper.java | 22 - .../service/IDeviceAlarmRecordService.java | 44 -- .../impl/DeviceAlarmRecordServiceImpl.java | 428 ------------------ .../controller/AlarmLogController.java | 26 +- .../modules/patroltask/domain/AlarmLog.java | 50 ++ .../patroltask/mapper/AlarmLogMapper.java | 3 + .../patroltask/service/IAlarmLogService.java | 17 +- .../service/impl/AlarmLogServiceImpl.java | 384 +++++++++++++++- .../auxcontrol/DeviceAlarmRecordMapper.xml | 74 --- .../mapper/auxcontrol/DeviceSignalMapper.xml | 14 +- .../mapper/patroltask/AlarmLogMapper.xml | 105 ++++- 17 files changed, 551 insertions(+), 950 deletions(-) delete mode 100644 riis-system/src/main/java/com/yfd/platform/modules/auxcontrol/controller/DeviceAlarmRecordController.java delete mode 100644 riis-system/src/main/java/com/yfd/platform/modules/auxcontrol/domain/DeviceAlarmRecord.java delete mode 100644 riis-system/src/main/java/com/yfd/platform/modules/auxcontrol/mapper/DeviceAlarmRecordMapper.java delete mode 100644 riis-system/src/main/java/com/yfd/platform/modules/auxcontrol/service/IDeviceAlarmRecordService.java delete mode 100644 riis-system/src/main/java/com/yfd/platform/modules/auxcontrol/service/impl/DeviceAlarmRecordServiceImpl.java delete mode 100644 riis-system/src/main/resources/mapper/auxcontrol/DeviceAlarmRecordMapper.xml diff --git a/riis-system/src/main/java/com/yfd/platform/component/iec104/client/MasterSysDataHandler.java b/riis-system/src/main/java/com/yfd/platform/component/iec104/client/MasterSysDataHandler.java index db455cb..36388ba 100644 --- a/riis-system/src/main/java/com/yfd/platform/component/iec104/client/MasterSysDataHandler.java +++ b/riis-system/src/main/java/com/yfd/platform/component/iec104/client/MasterSysDataHandler.java @@ -8,10 +8,10 @@ import com.yfd.platform.component.iec104.server.handler.ChannelHandler; import com.yfd.platform.component.iec104.server.handler.DataHandler; import com.yfd.platform.component.iec104.server.master.BootNettyClientChannel; import com.yfd.platform.component.iec104.server.master.BootNettyClientChannelCache; -import com.yfd.platform.modules.auxcontrol.service.IDeviceAlarmRecordService; import com.yfd.platform.modules.auxcontrol.service.IDeviceSignalService; import com.yfd.platform.modules.auxcontrol.service.IDeviceWorkDataService; import com.yfd.platform.modules.auxcontrol.service.IGatewayDeviceService; +import com.yfd.platform.modules.patroltask.service.IAlarmLogService; import com.yfd.platform.utils.SpringContextHolder; import io.netty.channel.ChannelHandlerContext; import org.slf4j.Logger; @@ -29,7 +29,7 @@ public class MasterSysDataHandler implements DataHandler { IDeviceSignalService signalService = SpringContextHolder.getBean(IDeviceSignalService.class); IDeviceWorkDataService workDataService = SpringContextHolder.getBean(IDeviceWorkDataService.class); IGatewayDeviceService gatewayDeviceService = SpringContextHolder.getBean(IGatewayDeviceService.class); - IDeviceAlarmRecordService alarmRecordService = SpringContextHolder.getBean(IDeviceAlarmRecordService.class); + IAlarmLogService alarmLogService = SpringContextHolder.getBean(IAlarmLogService.class); @Override public void handlerAdded(ChannelHandler ctx) throws Exception { @@ -63,7 +63,7 @@ public class MasterSysDataHandler implements DataHandler { String dateTime = messageInfo.getTimeScale(); signalService.updateDeviceSignalValue(slaveIp, address, "yx", status, dateTime); //生成设备自身报警记录(status=1) - alarmRecordService.doAlaramRecord("IEC104", "yx", slaveIp, address, status); + alarmLogService.doAlaramRecord("IEC104", "yx", slaveIp, address, status); } } if (type == 9 || type == 11 || type == 13 || type == 34 || type == 35 || type == 36) { @@ -78,7 +78,7 @@ public class MasterSysDataHandler implements DataHandler { workDataService.insertData("IEC104", slaveIp, address, value, dateTime); signalService.updateDeviceSignalValue(slaveIp, address, "yc", value, dateTime); //生成阈值越限报警记录 - alarmRecordService.doAlaramRecord("IEC104", "yc", slaveIp, address, value); + alarmLogService.doAlaramRecord("IEC104", "yc", slaveIp, address, value); } } diff --git a/riis-system/src/main/java/com/yfd/platform/component/iec61850/client/IEC61850ClientListener.java b/riis-system/src/main/java/com/yfd/platform/component/iec61850/client/IEC61850ClientListener.java index d887c8e..2ce7abe 100644 --- a/riis-system/src/main/java/com/yfd/platform/component/iec61850/client/IEC61850ClientListener.java +++ b/riis-system/src/main/java/com/yfd/platform/component/iec61850/client/IEC61850ClientListener.java @@ -2,8 +2,8 @@ package com.yfd.platform.component.iec61850.client; import com.beanit.iec61850bean.*; import com.yfd.platform.modules.auxcontrol.mapper.DeviceSignalMapper; -import com.yfd.platform.modules.auxcontrol.service.IDeviceAlarmRecordService; import com.yfd.platform.modules.auxcontrol.service.IDeviceWorkDataService; +import com.yfd.platform.modules.patroltask.service.IAlarmLogService; import com.yfd.platform.utils.StringUtils; import lombok.RequiredArgsConstructor; import org.slf4j.Logger; @@ -22,7 +22,7 @@ public class IEC61850ClientListener extends Thread implements ClientEventListene private static final Logger log = LoggerFactory.getLogger(StringUtils.class); private final DeviceSignalMapper deviceSignalMapper; - private final IDeviceAlarmRecordService deviceAlarmRecordService; + private final IAlarmLogService alarmLogService; private final IDeviceWorkDataService deviceWorkDataService; @Override @@ -41,7 +41,7 @@ public class IEC61850ClientListener extends Thread implements ClientEventListene //插入历史数据 deviceWorkDataService.insertData("IEC61850", null, node_name, node_value, datestr); //执行报警处理 - deviceAlarmRecordService.doAlaramRecord("IEC61850", "yc", null, node_name, node_value); + alarmLogService.doAlaramRecord("IEC61850", "yc", null, node_name, node_value); } else if ("ST".equals(value.getFc().name())) { //遥信 状态值 @@ -54,7 +54,7 @@ public class IEC61850ClientListener extends Thread implements ClientEventListene //更新信号状态 deviceSignalMapper.updateDeviceSignalValue_yx(node_name, node_value, datestr); //执行报警处理:生成设备自身报警记录(status=1) - deviceAlarmRecordService.doAlaramRecord("IEC61850", "yx", null, node_name, node_value); + alarmLogService.doAlaramRecord("IEC61850", "yx", null, node_name, node_value); } } } diff --git a/riis-system/src/main/java/com/yfd/platform/modules/auxcontrol/controller/DeviceAlarmRecordController.java b/riis-system/src/main/java/com/yfd/platform/modules/auxcontrol/controller/DeviceAlarmRecordController.java deleted file mode 100644 index 76b4d21..0000000 --- a/riis-system/src/main/java/com/yfd/platform/modules/auxcontrol/controller/DeviceAlarmRecordController.java +++ /dev/null @@ -1,57 +0,0 @@ -package com.yfd.platform.modules.auxcontrol.controller; - - -import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import com.yfd.platform.config.ResponseResult; -import com.yfd.platform.modules.auxcontrol.domain.DeviceAlarmRecord; -import com.yfd.platform.modules.auxcontrol.service.IDeviceAlarmRecordService; -import io.swagger.annotations.Api; -import io.swagger.annotations.ApiOperation; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RequestMapping; - -import org.springframework.web.bind.annotation.RestController; - -import javax.annotation.Resource; - -/** - *

- * 变电站-辅控设备-告警记录 前端控制器 - *

- * - * @author zhengsl - * @since 2025-04-23 - */ -@RestController -@RequestMapping("/auxcontrol/device-alarm-record") -@Api(value = "DeviceAlarmRecordController", tags = "变电站辅控设备告警记录") -public class DeviceAlarmRecordController { - - @Resource - private IDeviceAlarmRecordService deviceAlarmRecordService; - - /********************************** - * 用途说明: 分页查询变电站辅控设备告警记录 - * 参数说明 - * systemcode 所属系统 - * deviceName 告警设备名称 - * signalName 告警信号名称 - * startDate (开始日期) - * endDate (结束日期) - * alarmLevel 告警等级 - * status 告警状态 - * page 分页对象 - * 返回值说明: com.yfd.platform.config.ResponseResult 返回分页查询结果 - ***********************************/ - @GetMapping("/page") - @ApiOperation("分页查询变电站辅控设备告警记录") - public ResponseResult getDeviceAlarmRecordPage(String systemcode, String deviceName, String signalName, String startDate, String endDate, String alarmLevel, String status, Page page) { - //参数校验 所属系统不能为空 - if (systemcode == null) { - return ResponseResult.error("参数为空"); - } - //分页查询 - Page deviceAlarmRecordPage = deviceAlarmRecordService.getDeviceAlarmRecordPage(systemcode, deviceName, signalName, startDate,endDate,alarmLevel,status,page); - return ResponseResult.successData(deviceAlarmRecordPage); - } -} diff --git a/riis-system/src/main/java/com/yfd/platform/modules/auxcontrol/controller/DeviceWorkDataController.java b/riis-system/src/main/java/com/yfd/platform/modules/auxcontrol/controller/DeviceWorkDataController.java index 783a4d2..bd685fc 100644 --- a/riis-system/src/main/java/com/yfd/platform/modules/auxcontrol/controller/DeviceWorkDataController.java +++ b/riis-system/src/main/java/com/yfd/platform/modules/auxcontrol/controller/DeviceWorkDataController.java @@ -1,9 +1,7 @@ package com.yfd.platform.modules.auxcontrol.controller; -import cn.hutool.json.JSONUtil; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.yfd.platform.config.ResponseResult; -import com.yfd.platform.modules.auxcontrol.domain.DeviceAlarmRecord; import com.yfd.platform.modules.auxcontrol.domain.DeviceSignal; import com.yfd.platform.modules.auxcontrol.domain.DeviceWorkData; import com.yfd.platform.modules.auxcontrol.service.IDeviceSignalService; @@ -20,8 +18,6 @@ import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; import java.time.temporal.ChronoUnit; import java.util.*; -import java.util.stream.Collectors; -import java.util.stream.LongStream; /** *

diff --git a/riis-system/src/main/java/com/yfd/platform/modules/auxcontrol/controller/IECController.java b/riis-system/src/main/java/com/yfd/platform/modules/auxcontrol/controller/IECController.java index 1686466..1f2cf3d 100644 --- a/riis-system/src/main/java/com/yfd/platform/modules/auxcontrol/controller/IECController.java +++ b/riis-system/src/main/java/com/yfd/platform/modules/auxcontrol/controller/IECController.java @@ -7,17 +7,12 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.yfd.platform.component.iec104.client.IIEC104Service; import com.yfd.platform.component.iec61850.client.IEC61850Service; import com.yfd.platform.config.ResponseResult; -import com.yfd.platform.modules.auxcontrol.domain.DeviceAlarmRecord; import com.yfd.platform.modules.auxcontrol.domain.DeviceSignal; import com.yfd.platform.modules.auxcontrol.domain.GatewayDevice; import com.yfd.platform.modules.auxcontrol.domain.MeterDevice; -import com.yfd.platform.modules.auxcontrol.service.IDeviceAlarmRecordService; import com.yfd.platform.modules.auxcontrol.service.IDeviceSignalService; import com.yfd.platform.modules.auxcontrol.service.IGatewayDeviceService; import com.yfd.platform.modules.auxcontrol.service.IMeterDeviceService; -import com.yfd.platform.modules.basedata.service.ISubstationAreaService; -import com.yfd.platform.modules.basedata.service.ISubstationComponentService; -import com.yfd.platform.modules.basedata.service.ISubstationMaindeviceService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import org.springframework.web.bind.annotation.GetMapping; @@ -25,7 +20,6 @@ import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import javax.annotation.Resource; -import java.util.List; /** *

@@ -51,9 +45,6 @@ public class IECController { @Resource private IMeterDeviceService meterDeviceService; - //变电站报警记录 - @Resource - private IDeviceAlarmRecordService deviceAlarmRecordService; @Resource private IIEC104Service iec104Service; @@ -62,16 +53,6 @@ public class IECController { private IEC61850Service iec61850Service; - @GetMapping("/confirmclosealarm") - @ApiOperation("确认告警信息,关闭告警弹窗") - public ResponseResult confirmCloseAlarmRecord(String record_id) { - DeviceAlarmRecord alarmRecord = new DeviceAlarmRecord(); - alarmRecord.setRecordId(record_id); - alarmRecord.setStatus("03"); - alarmRecord.setFixTime(DateUtil.toLocalDateTime(DateUtil.date())); - deviceAlarmRecordService.updateById(alarmRecord); - return ResponseResult.success(); - } /********************************** * 用途说明: 发送遥控遥调命令 diff --git a/riis-system/src/main/java/com/yfd/platform/modules/auxcontrol/domain/DeviceAlarmRecord.java b/riis-system/src/main/java/com/yfd/platform/modules/auxcontrol/domain/DeviceAlarmRecord.java deleted file mode 100644 index 8ea7fab..0000000 --- a/riis-system/src/main/java/com/yfd/platform/modules/auxcontrol/domain/DeviceAlarmRecord.java +++ /dev/null @@ -1,238 +0,0 @@ -package com.yfd.platform.modules.auxcontrol.domain; - -import com.baomidou.mybatisplus.annotation.IdType; -import com.baomidou.mybatisplus.annotation.TableField; -import com.baomidou.mybatisplus.annotation.TableId; -import com.baomidou.mybatisplus.annotation.TableName; -import java.time.LocalDateTime; -import java.io.Serializable; - -import com.fasterxml.jackson.annotation.JsonFormat; -import lombok.Data; -import lombok.EqualsAndHashCode; - -/** - *

- * 变电站-辅控设备-告警记录 - *

- * - * @author zhengsl - * @since 2025-04-23 - */ -@Data -@EqualsAndHashCode(callSuper = false) -@TableName("fk_device_alarm_record") -public class DeviceAlarmRecord implements Serializable { - - private static final long serialVersionUID = 1L; - - /** - * 记录ID - */ - @TableId(type = IdType.ASSIGN_UUID) - private String recordId; - - /** - * 变电站ID - */ - private String stationId; - - /** - * 所属系统:01-在线监测 02-消防系统 03-安防系统 04-动环系统 05-锁控系统 06-辅控系统 07-照明系统 - */ - private String systemcode; - - /** - * 告警时间 - */ - @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") - private LocalDateTime alarmTime; - - /** - * 告警设备ID - */ - private String deviceId; - - /** - * 告警设备名称 - */ - private String deviceName; - - /** - * 告警信号ID - */ - private String signalId; - - /** - * 告警信号名称 - */ - private String signalName; - - /** - * 告警类型 - */ - private String alarmType; - - /** - * 告警等级:一般、严重、危急 - */ - private String alarmLevel; - - /** - * 告警值 - */ - private String alarmValue; - - /** - * 值单位 - */ - private String signalUnit; - - /** - * 正常范围 - */ - private String normalRange; - - /** - * 告警信息 - */ - private String alarmMessage; - - /** - * 01-组件变色 02-系统弹窗 ,03-邮件通知 ,04-触发联动 可多选:01,02 - */ - private String noticeAction; - - /** - * 邮件通知:[{name:"张三",email:"1122@163.com"}] - */ - private String noticeEmails; - - /** - * 触发联动:[{name:"XX联动",id:"12345678"}] - */ - private String noticeLinkages; - - /** - * 状态:01-初始生成 02-已执行动作 03-手动关闭 09-故障消除 - */ - private String status; - - /** - * 备用1 - */ - private String custom1; - - /** - * 备用2 - */ - private String custom2; - - /** - * 备用3 - */ - private String custom3; - - /** - * 告警分类:1-越限告警 2-设备报警 - */ - private String alarmClass; - - /** - * 故障消除时间 - */ - @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") - private LocalDateTime fixTime; - - /** - * 区域标识 - */ - private String region; - - /** - * 是否关闭告警0为关闭 1关闭 - */ - private String confirmClosure; - - /** - * 操作人 - */ - private String operator; - - /** - * 操作时间 - */ - @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") - private LocalDateTime operationTime; - - /** - * 告警分类:1-越限告警 2-设备报警 TODO 增加用于前端展示 - */ - @TableField(exist = false) - private String alarmClassName; - - - /** - * 告警类型名称:如:温度过高、压力异常、电流过载 TODO 增加用于前端展示 - */ - @TableField(exist = false) - private String alarmTypeName; - - /** - * 告警等级名称:一般、严重、危急 TODO 增加用于前端展示 - */ - @TableField(exist = false) - private String alarmLevelName; - - /** - * 次数:TODO 增加用于前端展示 - */ - @TableField(exist = false) - private String frequency; - - /** - * 开始时间:TODO 增加用于前端展示 - */ - @TableField(exist = false) - private String startDate; - - /** - * 结束时间:TODO 增加用于前端展示 - */ - @TableField(exist = false) - private String endDate; - - /** - * 区域名称:TODO 增加用于前端展示 - */ - @TableField(exist = false) - private String regionName; - - - /** - * 告警状态名称:TODO 增加用于前端展示 - */ - @TableField(exist = false) - private String statusName; - - /** - * 告警通知方式名称:01-系统弹窗 ,02-邮件通知 ,03-触发联动 可多选:01,02 - */ - @TableField(exist = false) - private String noticeTypeName; - - /** - * 0:未核查;1:已审核;2.已修正 - */ - private String checkFlag; - - /** - * 核查反馈意见 - */ - private String checkComment; - - /** - * 是否属实 - */ - private String checkResult; -} diff --git a/riis-system/src/main/java/com/yfd/platform/modules/auxcontrol/mapper/DeviceAlarmRecordMapper.java b/riis-system/src/main/java/com/yfd/platform/modules/auxcontrol/mapper/DeviceAlarmRecordMapper.java deleted file mode 100644 index db7a759..0000000 --- a/riis-system/src/main/java/com/yfd/platform/modules/auxcontrol/mapper/DeviceAlarmRecordMapper.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.yfd.platform.modules.auxcontrol.mapper; - -import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import com.yfd.platform.modules.auxcontrol.domain.DeviceAlarmRecord; -import com.baomidou.mybatisplus.core.mapper.BaseMapper; - -import java.util.Map; - -/** - *

- * 变电站-辅控设备-告警记录 Mapper 接口 - *

- * - * @author zhengsl - * @since 2025-04-23 - */ -public interface DeviceAlarmRecordMapper extends BaseMapper { - - Page getDeviceAlarmRecordPage(Page page, String systemcode, String deviceName, String signalName, String startDate, String endDate, String alarmLevel, String status); - - Map getAlarmLogById(String id); -} diff --git a/riis-system/src/main/java/com/yfd/platform/modules/auxcontrol/service/IDeviceAlarmRecordService.java b/riis-system/src/main/java/com/yfd/platform/modules/auxcontrol/service/IDeviceAlarmRecordService.java deleted file mode 100644 index e1c43b9..0000000 --- a/riis-system/src/main/java/com/yfd/platform/modules/auxcontrol/service/IDeviceAlarmRecordService.java +++ /dev/null @@ -1,44 +0,0 @@ -package com.yfd.platform.modules.auxcontrol.service; - -import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import com.yfd.platform.modules.auxcontrol.domain.DeviceAlarmRecord; -import com.baomidou.mybatisplus.extension.service.IService; - -/** - *

- * 变电站-辅控设备-告警记录 服务类 - *

- * - * @author zhengsl - * @since 2025-04-23 - */ -public interface IDeviceAlarmRecordService extends IService { - - /********************************** - * 用途说明: 生成报警记录 - * 参数说明 - * from 'IEC104','IEC61850' - * type 'yx','yc' - * slave_ip 服务器IP - * address 地址 - * value 值 - * 返回值说明: 无返回值 - ***********************************/ - void doAlaramRecord(String from,String type,String slaveIp,String address,String value); - - - /********************************** - * 用途说明: 分页查询变电站辅控设备告警记录 - * 参数说明 - * systemcode 所属系统 - * deviceName 告警设备名称 - * signalName 告警信号名称 - * startDate (开始日期) - * endDate (结束日期) - * alarmLevel 告警等级 - * status 告警状态 - * page 分页对象 - * 返回值说明: com.yfd.platform.config.ResponseResult 返回分页查询结果 - ***********************************/ - Page getDeviceAlarmRecordPage(String systemcode, String deviceName, String signalName, String startDate, String endDate, String alarmLevel, String status, Page page); -} diff --git a/riis-system/src/main/java/com/yfd/platform/modules/auxcontrol/service/impl/DeviceAlarmRecordServiceImpl.java b/riis-system/src/main/java/com/yfd/platform/modules/auxcontrol/service/impl/DeviceAlarmRecordServiceImpl.java deleted file mode 100644 index 0ed79d3..0000000 --- a/riis-system/src/main/java/com/yfd/platform/modules/auxcontrol/service/impl/DeviceAlarmRecordServiceImpl.java +++ /dev/null @@ -1,428 +0,0 @@ -package com.yfd.platform.modules.auxcontrol.service.impl; - -import cn.hutool.core.date.DateTime; -import cn.hutool.core.date.DateUtil; -import cn.hutool.core.util.IdUtil; -import cn.hutool.core.util.ObjUtil; -import cn.hutool.core.util.StrUtil; -import cn.hutool.json.JSONArray; -import cn.hutool.json.JSONObject; -import cn.hutool.json.JSONUtil; -import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; -import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import com.yfd.platform.modules.auxcontrol.domain.DeviceAlarmParameter; -import com.yfd.platform.modules.auxcontrol.domain.DeviceAlarmRecord; -import com.yfd.platform.modules.auxcontrol.domain.MeterDevice; -import com.yfd.platform.modules.auxcontrol.mapper.DeviceAlarmParameterMapper; -import com.yfd.platform.modules.auxcontrol.mapper.DeviceAlarmRecordMapper; -import com.yfd.platform.modules.auxcontrol.mapper.DeviceSignalMapper; -import com.yfd.platform.modules.auxcontrol.mapper.MeterDeviceMapper; -import com.yfd.platform.modules.auxcontrol.service.IDeviceAlarmRecordService; -import com.yfd.platform.system.domain.SysDictionaryItems; -import com.yfd.platform.system.mapper.SysDictionaryItemsMapper; -import com.yfd.platform.utils.StringUtils; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; - -import javax.annotation.Resource; -import java.text.SimpleDateFormat; -import java.time.LocalDateTime; -import java.time.LocalTime; -import java.util.*; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -/** - *

- * 变电站-辅控设备-告警记录 服务实现类 - *

- * - * @author zhengsl - * @since 2025-04-23 - */ -@Service -@Slf4j -public class DeviceAlarmRecordServiceImpl extends ServiceImpl implements IDeviceAlarmRecordService { - - @Resource - private DeviceSignalMapper deviceSignalMapper; - - @Resource - private MeterDeviceMapper meterDeviceMapper; - - @Resource - private DeviceAlarmParameterMapper deviceAlarmParameterMapper; - - @Resource - private DeviceAlarmRecordMapper deviceAlarmRecordMapper; - - @Resource - private SysDictionaryItemsMapper sysDictionaryItemsMapper; - - /********************************** - * 用途说明: 分页查询变电站辅控设备告警记录 - * 参数说明 - * systemcode 所属系统 - * deviceName 告警设备名称 - * signalName 告警信号名称 - * startDate (开始日期) - * endDate (结束日期) - * alarmLevel 告警等级 - * status 告警状态 - * page 分页对象 - * 返回值说明: com.yfd.platform.config.ResponseResult 返回分页查询结果 - ***********************************/ - @Override - public Page getDeviceAlarmRecordPage(String systemcode, String deviceName, String signalName, - String startDate, String endDate, String alarmLevel, - String status, Page page) { - return deviceAlarmRecordMapper.getDeviceAlarmRecordPage(page, systemcode, deviceName, signalName, startDate, endDate, alarmLevel, status); - } - - /********************************** - * 用途说明: 生成报警记录(IEC104) - * 参数说明 - * from 'IEC104','IEC61850' - * type 'yx','yc' - * slave_ip IP - * address 遥信、要测地址 - * value 值 - * 返回值说明: 无返回值 - ***********************************/ - @Override - @Transactional - public void doAlaramRecord(String from, String type, String slaveIp, String address, String value) { - String sinnalType = type; - if ("IEC104".equals(from)) { - sinnalType = "yc"; - } else if ("IEC61850".equals(from)) { - slaveIp = null; - } - Map map = deviceSignalMapper.selectDeviceSignalMap(slaveIp, sinnalType, address); - if (map == null || ObjUtil.isEmpty(map)) { - return; - } - //如果是yx 遥信 (设备自身报警记录) - if ("yx".equals(type)) { - //如果信号类型是1 设备告警 - if ("1".equals(map.get("signalType").toString())) { - //紧接者判断 value (1是告警 0是正常) status - if ("1".equals(value)) { - //填充告警记录信息接口 - DeviceAlarmRecord deviceAlarmRecord = FillingDeviceAlarmRecord(type, null, map, value); - //首先判断 在不在时间范围之内 判断时间在不在时间范围之内接口 - Map timeInterval = getTimeInterval(7); - //查询表中是否存在该报警记录 - List alarmRecords = queryDeviceAlarmRecord(deviceAlarmRecord, timeInterval); - //如果没有有报警记录 新增记录 - if (alarmRecords.size() == 0) { - doAlarmAction(deviceAlarmRecord); - } else if (alarmRecords.size() > 1) { - this.removeById(alarmRecords.get(0).getRecordId()); - } - } else { - //判断 value (1是告警 0是正常) status 同一信号监测到报警状态消除,对当前信号所有未处理历史报警打上已处理标签,并记录消除时间 - LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); - queryWrapper.eq(DeviceAlarmRecord::getSignalId, map.get("signalId").toString()); - queryWrapper.eq(DeviceAlarmRecord::getAlarmClass, "2"); - queryWrapper.in(DeviceAlarmRecord::getStatus, "01", "02"); - DeviceAlarmRecord deviceAlarmRecord = new DeviceAlarmRecord(); - deviceAlarmRecord.setStatus("09"); - //状态 故障消除 - deviceAlarmRecord.setFixTime(DateUtil.toLocalDateTime(DateUtil.date())); - //故障消除时间 - this.update(deviceAlarmRecord, queryWrapper); - } - } - } else if ("yc".equals(type)) { - //1.通过设备id 和信号id 查询告警参数设置表(告警规则) - LambdaQueryWrapper querywrapperdap = new LambdaQueryWrapper<>(); - if (StrUtil.isNotEmpty(map.get("meterDeviceId").toString())) { - querywrapperdap.eq(DeviceAlarmParameter::getDeviceId, map.get("meterDeviceId").toString()); - } - if (StrUtil.isNotEmpty(map.get("signalId").toString())) { - querywrapperdap.eq(DeviceAlarmParameter::getSignalId, map.get("signalId").toString()); - } - List deviceAlarmParameters = deviceAlarmParameterMapper.selectList(querywrapperdap); - if (deviceAlarmParameters != null && deviceAlarmParameters.size() > 0) { - for (DeviceAlarmParameter deviceAlarmParameter : deviceAlarmParameters) { - //如果告警触发条件 不为空 1<=value<=100 - if (deviceAlarmParameter.getAlarmCondition() != null) { - //根据告警规则 判断是否触发告警 - boolean alarmTrigger = TriggerAlarm(deviceAlarmParameter, value); - - //2.通过告警触发条件 和 value比较 满足条件 触发告警 - if (alarmTrigger) { - DeviceAlarmRecord deviceAlarmRecord = FillingDeviceAlarmRecord(type, deviceAlarmParameter - , map, value); - //首先判断 在不在时间范围之内 判断时间在不在时间范围之内接口 - Map timeInterval = getTimeInterval(7); - //如果在时间范围内 - //查询表中是否存在该报警记录 - List alarmRecords = queryDeviceAlarmRecord(deviceAlarmRecord, - timeInterval); - //如果没有有报警记录 新增记录 - if (alarmRecords.size() == 0) { - // 新增 - deviceAlarmRecordMapper.insert(deviceAlarmRecord); - //TODO 邮件推送暂时删除了 - } - } else { - //不满足条件 同一信号监测到报警状态消除,对当前信号所有未处理历史报警打上已处理标签,并记录消除时间 - LambdaUpdateWrapper queryWrapper = new LambdaUpdateWrapper<>(); - queryWrapper.eq(DeviceAlarmRecord::getSignalId, map.get("signalId").toString()); - queryWrapper.eq(DeviceAlarmRecord::getAlarmClass, "1"); - queryWrapper.eq(DeviceAlarmRecord::getAlarmLevel, deviceAlarmParameter.getAlarmLevel()); - queryWrapper.in(DeviceAlarmRecord::getStatus, "01", "02") - .set(DeviceAlarmRecord::getStatus, "09") - .set(DeviceAlarmRecord::getFixTime, LocalDateTime.now()); - //故障消除时间 - this.update(null, queryWrapper); - } - } - } - } - } - - } - - /** - * 填充告警记录表 - * - * @return 返回告警记录信息 - */ - public DeviceAlarmRecord FillingDeviceAlarmRecord(String type, DeviceAlarmParameter deviceAlarmParameter, - Map singalData, String value) { - DeviceAlarmRecord deviceAlarmRecord = new DeviceAlarmRecord(); - MeterDevice device = meterDeviceMapper.selectById(singalData.get("meterDeviceId").toString()); - deviceAlarmRecord.setCheckFlag("0"); - // 创建 SimpleDateFormat 对象,指定日期格式 - if ("yx".equals(type)) { - deviceAlarmRecord.setRecordId(IdUtil.fastSimpleUUID()); - deviceAlarmRecord.setStationId(singalData.get("stationId").toString()); - //变电站id - deviceAlarmRecord.setSystemcode(singalData.get("systemcode").toString()); - //所属系统 - deviceAlarmRecord.setAlarmTime(DateUtil.toLocalDateTime(DateUtil.date())); - //告警时间 - deviceAlarmRecord.setDeviceId(singalData.get("meterDeviceId").toString()); - //告警设备ID - deviceAlarmRecord.setDeviceName(singalData.get("deviceName").toString()); - //告警设名称 - deviceAlarmRecord.setSignalId(singalData.get("signalId").toString()); - //告警信号id - deviceAlarmRecord.setSignalName(singalData.get("signalName").toString()); - //告警信号名称 - deviceAlarmRecord.setAlarmValue(value); - //告警值 - deviceAlarmRecord.setSignalUnit(""); - //值单位 - String alarmMessage = String.format("[%s]发生了%s!", singalData.get("deviceName").toString(), - singalData.get("signalName").toString()); - deviceAlarmRecord.setAlarmMessage(alarmMessage); - //告警信息 - deviceAlarmRecord.setStatus("01"); - //状态 - deviceAlarmRecord.setAlarmLevel("03"); - deviceAlarmRecord.setAlarmClass("2"); - //2-设备报警 - deviceAlarmRecord.setRegion(device.getRegion()); - //区域标识 - } - if ("yc".equals(type)) { - deviceAlarmRecord.setRecordId(IdUtil.fastSimpleUUID()); - //变电站id - deviceAlarmRecord.setStationId(singalData.get("stationId").toString()); - //所属系统 - deviceAlarmRecord.setSystemcode(singalData.get("systemcode").toString()); - //告警时间 - deviceAlarmRecord.setAlarmTime(DateUtil.toLocalDateTime(DateUtil.date())); - //告警设备ID - deviceAlarmRecord.setDeviceId(singalData.get("meterDeviceId").toString()); - //告警设备名称 - deviceAlarmRecord.setDeviceName(singalData.get("deviceName").toString()); - //告警信号id - deviceAlarmRecord.setSignalId(singalData.get("signalId").toString()); - //告警信号名称 - deviceAlarmRecord.setSignalName(singalData.get("signalName").toString()); - //告警类型 - deviceAlarmRecord.setAlarmType(deviceAlarmParameter.getAlarmType()); - //告警等级 - deviceAlarmRecord.setAlarmLevel(deviceAlarmParameter.getAlarmLevel()); - //告警值 - deviceAlarmRecord.setAlarmValue(value); - String sinalUnit = ObjUtil.isNotEmpty(singalData.get("signalUnit")) ? - singalData.get("signalUnit").toString() : ""; - //值单位 - deviceAlarmRecord.setSignalUnit(sinalUnit); - //正常范围 - deviceAlarmRecord.setNormalRange(deviceAlarmParameter.getAlarmCondition()); - - String alarmLevelname = getDictName(deviceAlarmParameter.getAlarmLevel(), "alarmLevel"); - String alarmMessage = String.format("信号[%s]监测值为[%s]%s,达到了设置的报警阈值范围[%s],发生告警,告警级别为[%s]!", - singalData.get("signal_name").toString(), value, sinalUnit, - deviceAlarmParameter.getAlarmCondition(), alarmLevelname - ); - //告警信息 - deviceAlarmRecord.setAlarmMessage(alarmMessage); - //告警方式 - deviceAlarmRecord.setNoticeAction(deviceAlarmParameter.getNoticeType()); - //邮件通知 - deviceAlarmRecord.setNoticeEmails(deviceAlarmParameter.getNoticeEmails()); - //触发联动 - deviceAlarmRecord.setNoticeLinkages(deviceAlarmParameter.getNoticeLinkages()); - //状态 - deviceAlarmRecord.setStatus("01"); - //1-越限报警 - deviceAlarmRecord.setAlarmClass("1"); - //区域标识 - deviceAlarmRecord.setRegion(device.getRegion()); - - } - return deviceAlarmRecord; - } - - //获取字典名称 根据项目编码和父项编码 - public String getDictName(String itemcode, String parentcode) { - QueryWrapper queryWrapperSysDictionaryItems = new QueryWrapper<>(); - String dictname = ""; - queryWrapperSysDictionaryItems.eq("itemcode", itemcode); - queryWrapperSysDictionaryItems.eq("parentcode", parentcode); - SysDictionaryItems sysDictionaryItems = sysDictionaryItemsMapper.selectOne(queryWrapperSysDictionaryItems); - if (sysDictionaryItems != null) { - dictname = sysDictionaryItems.getDictName(); - } - return dictname; - } - - /** - * 根据告警规则 判断是否触发告警 - * - * @return true 触发恭敬规则 - * false 没有触发告警规则 - */ - public boolean TriggerAlarm(DeviceAlarmParameter deviceAlarmParameter, String value) { - - // //获取告警触发条件 - String str = deviceAlarmParameter.getAlarmCondition(); - // 定义正则表达式 - String regex = "(\\d+)\\s*((?:==?|!=|<=?|>=?))\\s*value\\s*((?:==?|!=|<=?|>=?))\\s*(\\d+)"; - Pattern pattern = Pattern.compile(regex); - Matcher matcher = pattern.matcher(str); - - // 查找并输出比较符号和数值 - if (matcher.find()) { - try { - // 第一个数字 - String number1 = matcher.group(1); - // 第一个比较符 - String operator1 = matcher.group(2); - // 第二个比较符 - String operator2 = matcher.group(3); - // 第二个数字 - String number2 = matcher.group(4); - Double aDouble = Double.valueOf(value); - boolean result = compare(Double.valueOf(number1), operator1, aDouble); - boolean resultTwo = compare(aDouble, operator2, Double.valueOf(number2)); - return result && resultTwo; - } catch (Exception e) { - log.error(e.getMessage()); - return false; - } - - } - return false; - - } - - private static boolean compare(Double value1, String operator, Double value2) { - switch (operator) { - case "<": - return value1.compareTo(value2) < 0; - case "<=": - return value1.compareTo(value2) < 0 || value1.compareTo(value2) == 0; - case ">": - return value1.compareTo(value2) > 0; - case ">=": - return value1.compareTo(value2) > 0 || value1.compareTo(value2) == 0; - case "==": - case "=": - return value1.compareTo(value2) == 0; - case "!=": - return value1.compareTo(value2) != 0; - default: - throw new IllegalArgumentException("错误的告警规则: " + operator); - } - } - - //执行告警相关动作 插入数据库 - private void doAlarmAction(DeviceAlarmRecord alarmRecord) { - //1.通过设备id 和信号id 查询告警参数设置表(告警规则) - LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); - queryWrapper.eq(DeviceAlarmParameter::getDeviceId, alarmRecord.getDeviceId()); - queryWrapper.eq(DeviceAlarmParameter::getSignalId, alarmRecord.getSignalId()); - List alarmParameters = deviceAlarmParameterMapper.selectList(queryWrapper); - for (DeviceAlarmParameter alarmParameter : alarmParameters) { - alarmRecord.setAlarmType(alarmParameter.getAlarmType()); - alarmRecord.setNoticeAction(alarmParameter.getNoticeType()); - alarmRecord.setNoticeLinkages(alarmParameter.getNoticeLinkages()); - //todo 发送邮件 - // pushEmail(alarmRecord,alarmParameter); - } - this.saveOrUpdate(alarmRecord); - } - - /** - * 判断当前时间在不在区间范围之内 - * - * @return true 在区间范围之内 - * false 不在时间范围之内 - */ - public Map getTimeInterval(int clockHour) { - int beforeclock = 0; - Map map = new HashMap<>(10); - // 获取当前时间 - LocalDateTime now = LocalDateTime.now(); - - // 获取昨天的 7 点 - LocalDateTime yesterdayClockAM = LocalDateTime.of(now.minusDays(1).toLocalDate(), LocalTime.of(clockHour, 0)); - map.put("starttime", yesterdayClockAM); - // 获取今天的 7 点 - LocalDateTime todayClockAM = LocalDateTime.of(now.toLocalDate(), LocalTime.of(clockHour, 0)); - LocalDateTime nextdayClockAM = LocalDateTime.of(now.plusDays(1).toLocalDate(), LocalTime.of(clockHour, 0)); - - map.put("endtime", todayClockAM); - // 判断时间是否在范围内 - if (now.isAfter(yesterdayClockAM) && now.isBefore(todayClockAM)) { - beforeclock = 1; - } else { - map.put("starttime", todayClockAM); - map.put("endtime", nextdayClockAM); - } - map.put("beforeclock", beforeclock); - return map; - } - - /** - * 根据条件查询告警记录表 判断是否存在告警记录 - * - * @return true 存在告警记录 - * false 不存在告警记录 - */ - public List queryDeviceAlarmRecord(DeviceAlarmRecord deviceAlarmRecord, - Map timeInterval) { - LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); - queryWrapper.eq(DeviceAlarmRecord::getSignalId, deviceAlarmRecord.getSignalId()); - queryWrapper.eq(DeviceAlarmRecord::getAlarmLevel, deviceAlarmRecord.getAlarmLevel()); - LocalDateTime starttime = (LocalDateTime) timeInterval.get("starttime"); - LocalDateTime endtime = (LocalDateTime) timeInterval.get("endtime"); - queryWrapper.between(DeviceAlarmRecord::getAlarmTime, starttime, endtime); - queryWrapper.in(DeviceAlarmRecord::getStatus, "01", "02"); - return this.list(queryWrapper); - - } -} diff --git a/riis-system/src/main/java/com/yfd/platform/modules/patroltask/controller/AlarmLogController.java b/riis-system/src/main/java/com/yfd/platform/modules/patroltask/controller/AlarmLogController.java index ae70576..e6c152c 100644 --- a/riis-system/src/main/java/com/yfd/platform/modules/patroltask/controller/AlarmLogController.java +++ b/riis-system/src/main/java/com/yfd/platform/modules/patroltask/controller/AlarmLogController.java @@ -5,6 +5,7 @@ import cn.hutool.core.date.DateUtil; import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.StrUtil; import cn.hutool.json.JSONObject; +import cn.hutool.json.JSONUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; @@ -77,11 +78,12 @@ public class AlarmLogController { if (StrUtil.isBlank(stationId)) { return ResponseResult.successData(null); } - String[] split = stationId.split(","); - LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); - queryWrapper.eq(AlarmLog::getDatastatus, "1").in(AlarmLog::getStationId, Arrays.asList(split)).eq(AlarmLog::getCheckFlag - , 0).orderByDesc(AlarmLog::getAlarmDate); - List list = alarmLogService.list(queryWrapper); + List list =alarmLogService.getNotCheckAlarmCount(stationId); +// String[] split = stationId.split(","); +// LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); +// queryWrapper.eq(AlarmLog::getDatastatus, "1").in(AlarmLog::getStationId, Arrays.asList(split)).eq(AlarmLog::getCheckFlag +// , 0).orderByDesc(AlarmLog::getAlarmDate); +// List list = alarmLogService.list(queryWrapper); Map map = new HashMap<>(); map.put("count", list.size()); map.put("notCheck", list); @@ -287,8 +289,8 @@ public class AlarmLogController { @GetMapping("/getAlarmLogById") @ApiOperation("根据告警信息ID查询详情") - public ResponseResult getAlarmLogById(String id,String systemType) { - Map alarmLog = alarmLogService.getAlarmLogById(id,systemType); + public ResponseResult getAlarmLogById(String id) { + Map alarmLog = alarmLogService.getAlarmLogById(id); return ResponseResult.successData(alarmLog); } @@ -299,4 +301,14 @@ public class AlarmLogController { Map alarmLog = alarmLogService.getConfirmationRate(stationId); return ResponseResult.successData(alarmLog); } + + @GetMapping("/sendAlarmById") + @ApiOperation("发送报警") + public ResponseResult sendAlarmById(String stationId,String id) { + AlarmLog alarmLog = alarmLogService.getById(id); + WebSocketServer.sendInfo(stationId, JSONUtil.parseObj(alarmLog).toString()); + return ResponseResult.success(); + } + + } diff --git a/riis-system/src/main/java/com/yfd/platform/modules/patroltask/domain/AlarmLog.java b/riis-system/src/main/java/com/yfd/platform/modules/patroltask/domain/AlarmLog.java index ef1ef89..c659cde 100644 --- a/riis-system/src/main/java/com/yfd/platform/modules/patroltask/domain/AlarmLog.java +++ b/riis-system/src/main/java/com/yfd/platform/modules/patroltask/domain/AlarmLog.java @@ -93,6 +93,11 @@ public class AlarmLog implements Serializable { */ private String deviceId; + /** + * 巡视设备id(告警设备ID、巡视设备ID) + */ + private String patroldeviceId; + /** * 巡视设备编码 */ @@ -262,5 +267,50 @@ public class AlarmLog implements Serializable { */ private String custom3; + /** + * 所属系统:01-在线监测 02-消防系统 03-安防系统 04-动环系统 05-锁控系统 06-辅控系统 07-照明系统(辅控) + */ + private String systemcode; + + + /** + * 辅控告警类型(辅控) + */ + private String fkAlarmType; + + /** + * 正常范围(辅控) + */ + private String normalRange; + + /** + * 01-组件变色 02-系统弹窗 ,03-邮件通知 ,04-触发联动 可多选:01,02(辅控) + */ + private String noticeAction; + + /** + * 邮件通知:[{name:"张三",email:"1122@163.com"}](辅控) + */ + private String noticeEmails; + + /** + * 触发联动:[{name:"XX联动",id:"12345678"}](辅控) + */ + private String noticeLinkages; + + /** + * 告警分类:1-越限告警 2-设备报警(辅控) + */ + private String alarmClass; + + /** + * 区域标识(辅控) + */ + private String region; + + /** + * 报警来源类型(1:智巡;2:辅控) + */ + private String alarmSourceType; } diff --git a/riis-system/src/main/java/com/yfd/platform/modules/patroltask/mapper/AlarmLogMapper.java b/riis-system/src/main/java/com/yfd/platform/modules/patroltask/mapper/AlarmLogMapper.java index 8173a92..336c359 100644 --- a/riis-system/src/main/java/com/yfd/platform/modules/patroltask/mapper/AlarmLogMapper.java +++ b/riis-system/src/main/java/com/yfd/platform/modules/patroltask/mapper/AlarmLogMapper.java @@ -56,4 +56,7 @@ public interface AlarmLogMapper extends BaseMapper { List> getAlarmLogList(String stationId); Map getAlarmLogById(String id); + + List getNotCheckAlarmCount(String stationId); + } diff --git a/riis-system/src/main/java/com/yfd/platform/modules/patroltask/service/IAlarmLogService.java b/riis-system/src/main/java/com/yfd/platform/modules/patroltask/service/IAlarmLogService.java index 05fd947..2a32610 100644 --- a/riis-system/src/main/java/com/yfd/platform/modules/patroltask/service/IAlarmLogService.java +++ b/riis-system/src/main/java/com/yfd/platform/modules/patroltask/service/IAlarmLogService.java @@ -59,7 +59,7 @@ public interface IAlarmLogService extends IService { * 参数说明 id 告警id * 返回值说明: java.util.Map ***********************************/ - Map getAlarmLogById(String id,String systemType); + Map getAlarmLogById(String id); boolean updateDeviceResult(JSONObject jsonObject) throws Exception; @@ -77,4 +77,19 @@ public interface IAlarmLogService extends IService { ***********************************/ List> getAlarmLogList(String stationId); + List getNotCheckAlarmCount(String stationId); + + + /********************************** + * 用途说明: 生成报警记录 + * 参数说明 + * from 'IEC104','IEC61850' + * type 'yx','yc' + * slave_ip 服务器IP + * address 地址 + * value 值 + * 返回值说明: 无返回值 + ***********************************/ + void doAlaramRecord(String from,String type,String slaveIp,String address,String value); + } diff --git a/riis-system/src/main/java/com/yfd/platform/modules/patroltask/service/impl/AlarmLogServiceImpl.java b/riis-system/src/main/java/com/yfd/platform/modules/patroltask/service/impl/AlarmLogServiceImpl.java index 9b02cac..18fac76 100644 --- a/riis-system/src/main/java/com/yfd/platform/modules/patroltask/service/impl/AlarmLogServiceImpl.java +++ b/riis-system/src/main/java/com/yfd/platform/modules/patroltask/service/impl/AlarmLogServiceImpl.java @@ -2,9 +2,7 @@ package com.yfd.platform.modules.patroltask.service.impl; import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.collection.CollectionUtil; -import cn.hutool.core.collection.ListUtil; import cn.hutool.core.date.DatePattern; -import cn.hutool.core.date.DateTime; import cn.hutool.core.date.DateUtil; import cn.hutool.core.date.LocalDateTimeUtil; import cn.hutool.core.util.*; @@ -12,6 +10,7 @@ import cn.hutool.json.JSONArray; import cn.hutool.json.JSONObject; import cn.hutool.json.JSONUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; @@ -22,8 +21,11 @@ import com.yfd.platform.component.nettyclient.*; import com.yfd.platform.config.AlarmTemplateConfig; import com.yfd.platform.config.HttpServerConfig; import com.yfd.platform.config.ParentConfig; -import com.yfd.platform.config.ResponseResult; -import com.yfd.platform.modules.auxcontrol.mapper.DeviceAlarmRecordMapper; +import com.yfd.platform.modules.auxcontrol.domain.DeviceAlarmParameter; +import com.yfd.platform.modules.auxcontrol.domain.MeterDevice; +import com.yfd.platform.modules.auxcontrol.mapper.DeviceAlarmParameterMapper; +import com.yfd.platform.modules.auxcontrol.mapper.DeviceSignalMapper; +import com.yfd.platform.modules.auxcontrol.mapper.MeterDeviceMapper; import com.yfd.platform.modules.basedata.domain.LinkageSignal; import com.yfd.platform.modules.basedata.domain.Substation; import com.yfd.platform.modules.basedata.domain.SubstationDevice; @@ -42,6 +44,7 @@ import com.yfd.platform.modules.patroltask.service.IAlarmLogService; import com.yfd.platform.modules.patroltask.service.ITaskTodoService; import com.yfd.platform.modules.robotapi.service.IStationRobotService; import com.yfd.platform.system.domain.Message; +import com.yfd.platform.system.domain.SysDictionaryItems; import com.yfd.platform.system.domain.SysOrganization; import com.yfd.platform.system.mapper.SysOrganizationMapper; import com.yfd.platform.system.service.IMessageService; @@ -50,15 +53,11 @@ import com.yfd.platform.utils.FileUtil; import com.yfd.platform.utils.SecurityUtils; import io.netty.util.CharsetUtil; import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; import javax.annotation.Resource; -import javax.imageio.ImageIO; import java.awt.*; -import java.io.File; -import java.io.FileWriter; -import java.io.IOException; import java.io.UnsupportedEncodingException; import java.math.BigDecimal; import java.net.URLDecoder; @@ -66,10 +65,12 @@ import java.net.URLEncoder; import java.sql.Timestamp; import java.text.SimpleDateFormat; import java.time.LocalDateTime; +import java.time.LocalTime; import java.util.*; import java.util.List; +import java.util.regex.Matcher; +import java.util.regex.Pattern; import java.util.stream.Collectors; -import java.util.stream.Stream; /** *

@@ -120,11 +121,19 @@ public class AlarmLogServiceImpl extends ServiceImpl i @Resource private ISysDictionaryItemsService sysDictionaryItemsService; - @Resource - private DeviceAlarmRecordMapper deviceAlarmRecordMapper; + @Resource private MqttGateway mqttGateway; + @Resource + private DeviceSignalMapper deviceSignalMapper; + + @Resource + private MeterDeviceMapper meterDeviceMapper; + + @Resource + private DeviceAlarmParameterMapper deviceAlarmParameterMapper; + @Override public synchronized boolean updateTaskResult(JSONObject jsonObject) throws Exception { JSONArray resultList = jsonObject.getJSONArray("resultList"); @@ -415,6 +424,11 @@ public class AlarmLogServiceImpl extends ServiceImpl i return alarmLogMapper.getAlarmLogList(stationId); } + @Override + public List getNotCheckAlarmCount(String stationId) { + return alarmLogMapper.getNotCheckAlarmCount(stationId); + } + /********************************** * 用途说明: 设置任务结果数据 * 参数说明 taskResult @@ -1179,16 +1193,8 @@ public class AlarmLogServiceImpl extends ServiceImpl i * 返回值说明: java.util.Map ***********************************/ @Override - public Map getAlarmLogById(String id, String systemType) { - - if ("01".equals(systemType)) { - Map map = deviceAlarmRecordMapper.getAlarmLogById(id); - } - if ("02".equals(systemType)) { - Map map = alarmLogMapper.getAlarmLogById(id); - return ResponseResult.successData(map); - } - return ResponseResult.successData(null); + public Map getAlarmLogById(String id) { + return alarmLogMapper.getAlarmLogById(id); } private String getSlienceType(String type) { @@ -1949,4 +1955,338 @@ public class AlarmLogServiceImpl extends ServiceImpl i } } + /********************************** + * 用途说明: 生成报警记录(IEC104) + * 参数说明 + * from 'IEC104','IEC61850' + * type 'yx','yc' + * slave_ip IP + * address 遥信、要测地址 + * value 值 + * 返回值说明: 无返回值 + ***********************************/ + @Override + @Transactional + public void doAlaramRecord(String from, String type, String slaveIp, String address, String value) { + String sinnalType = type; + if ("IEC104".equals(from)) { + sinnalType = "yc"; + } else if ("IEC61850".equals(from)) { + slaveIp = null; + } + Map map = deviceSignalMapper.selectDeviceSignalMap(slaveIp, sinnalType, address); + if (map == null || ObjUtil.isEmpty(map)) { + return; + } + //如果是yx 遥信 (设备自身报警记录) + if ("yx".equals(type)) { + //如果信号类型是1 设备告警 + if ("1".equals(map.get("signalType").toString())) { + //紧接者判断 value (1是告警 0是正常) status + if ("1".equals(value)) { + //填充告警记录信息接口 + AlarmLog alarmLog = FillingDeviceAlarmRecord(type, null, map, value); + //首先判断 在不在时间范围之内 判断时间在不在时间范围之内接口 + Map timeInterval = getTimeInterval(7); + //查询表中是否存在该报警记录 + List alarmRecords = queryDeviceAlarmRecord(alarmLog, timeInterval); + //如果没有有报警记录 新增记录 + if (alarmRecords.size() == 0) { + doAlarmAction(alarmLog); + } else if (alarmRecords.size() > 1) { + this.removeById(alarmRecords.get(0).getId()); + } + } + } + } else if ("yc".equals(type)) { + //1.通过设备id 和信号id 查询告警参数设置表(告警规则) + LambdaQueryWrapper querywrapperdap = new LambdaQueryWrapper<>(); + if (StrUtil.isNotEmpty(map.get("meterDeviceId").toString())) { + querywrapperdap.eq(DeviceAlarmParameter::getDeviceId, map.get("meterDeviceId").toString()); + } + if (StrUtil.isNotEmpty(map.get("signalId").toString())) { + querywrapperdap.eq(DeviceAlarmParameter::getSignalId, map.get("signalId").toString()); + } + List deviceAlarmParameters = deviceAlarmParameterMapper.selectList(querywrapperdap); + if (deviceAlarmParameters != null && deviceAlarmParameters.size() > 0) { + for (DeviceAlarmParameter deviceAlarmParameter : deviceAlarmParameters) { + //如果告警触发条件 不为空 1<=value<=100 + if (deviceAlarmParameter.getAlarmCondition() != null) { + //根据告警规则 判断是否触发告警 + boolean alarmTrigger = TriggerAlarm(deviceAlarmParameter, value); + + //2.通过告警触发条件 和 value比较 满足条件 触发告警 + if (alarmTrigger) { + AlarmLog alarmLog = FillingDeviceAlarmRecord(type, deviceAlarmParameter + , map, value); + //首先判断 在不在时间范围之内 判断时间在不在时间范围之内接口 + Map timeInterval = getTimeInterval(7); + //如果在时间范围内 + //查询表中是否存在该报警记录 + List alarmRecords = queryDeviceAlarmRecord(alarmLog, + timeInterval); + //如果没有有报警记录 新增记录 + if (alarmRecords.size() == 0) { + // 新增 + alarmLogMapper.insert(alarmLog); + //TODO 邮件推送暂时删除了 + } + } + } + } + } + } + + } + + /** + * 填充告警记录表 + * + * @return 返回告警记录信息 + */ + public AlarmLog FillingDeviceAlarmRecord(String type, DeviceAlarmParameter deviceAlarmParameter, + Map signalDate, String value) { + AlarmLog alarmLog = new AlarmLog(); + MeterDevice meterDevice = meterDeviceMapper.selectById(signalDate.get("meterDeviceId").toString()); + alarmLog.setCheckFlag("0"); + alarmLog.setAlarmSourceType("2"); + // 创建 SimpleDateFormat 对象,指定日期格式 + if ("yx".equals(type)) { + alarmLog.setId(IdUtil.fastSimpleUUID()); + + alarmLog.setStationId(signalDate.get("stationId").toString()); + alarmLog.setStationName(signalDate.get("stationName").toString()); + alarmLog.setStationCode(signalDate.get("stationCode").toString()); + alarmLog.setAreaId(signalDate.get("areaId").toString()); + alarmLog.setAreaName(signalDate.get("areaName").toString()); + alarmLog.setBayId(signalDate.get("bayId").toString()); + alarmLog.setBayName(signalDate.get("bayName").toString()); + alarmLog.setMainDeviceName(signalDate.get("mainDeviceName").toString()); + alarmLog.setComponentName(signalDate.get("componentName").toString()); + + //所属系统 + alarmLog.setSystemcode(signalDate.get("systemcode").toString()); + //告警时间 + alarmLog.setAlarmDate(DateUtil.now()); + //告警设备ID + alarmLog.setPatroldeviceId(meterDevice.getDeviceId()); + alarmLog.setPatroldeviceName(meterDevice.getDeviceName()); + + //告警设名称 + alarmLog.setDeviceId(signalDate.get("signalId").toString()); + //告警信号id + alarmLog.setDeviceName(signalDate.get("signalName").toString()); + //告警信号名称 + alarmLog.setValue(value); + //告警值 + alarmLog.setUnit(""); + //值单位 + String alarmMessage = String.format("[%s]发生了%s!", signalDate.get("deviceName").toString(), + signalDate.get("signalName").toString()); + alarmLog.setContent(alarmMessage); + //状态 + alarmLog.setAlarmLevel("4"); + alarmLog.setAlarmClass("2"); + //2-设备报警 + alarmLog.setRegion(meterDevice.getRegion()); + //区域标识 + } + if ("yc".equals(type)) { + alarmLog.setId(IdUtil.fastSimpleUUID()); + //变电站id + alarmLog.setStationId(signalDate.get("stationId").toString()); + alarmLog.setStationName(signalDate.get("stationName").toString()); + alarmLog.setStationCode(signalDate.get("stationCode").toString()); + alarmLog.setAreaId(signalDate.get("areaId").toString()); + alarmLog.setAreaName(signalDate.get("areaName").toString()); + alarmLog.setBayId(signalDate.get("bayId").toString()); + alarmLog.setBayName(signalDate.get("bayName").toString()); + alarmLog.setMainDeviceName(signalDate.get("mainDeviceName").toString()); + alarmLog.setComponentName(signalDate.get("componentName").toString()); + //所属系统 + alarmLog.setSystemcode(signalDate.get("systemcode").toString()); + //告警时间 + alarmLog.setAlarmDate(DateUtil.now()); + //告警设备ID + alarmLog.setPatroldeviceId(meterDevice.getDeviceId()); + //告警设备名称 + alarmLog.setPatroldeviceName(meterDevice.getDeviceName()); + //告警信号id + alarmLog.setDeviceId(signalDate.get("signalId").toString()); + //告警信号名称 + alarmLog.setDeviceName(signalDate.get("signalName").toString()); + //告警类型 + alarmLog.setAlarmType(deviceAlarmParameter.getAlarmType()); + //告警等级 + alarmLog.setAlarmLevel(deviceAlarmParameter.getAlarmLevel()); + //告警值 + alarmLog.setValue(value); + String sinalUnit = ObjUtil.isNotEmpty(signalDate.get("signalUnit")) ? + signalDate.get("signalUnit").toString() : ""; + //值单位 + alarmLog.setUnit(sinalUnit); + //正常范围 + alarmLog.setNormalRange(deviceAlarmParameter.getAlarmCondition()); + + String alarmLevelname = getDictName(deviceAlarmParameter.getAlarmLevel(), "alarmLevel"); + String alarmMessage = String.format("信号[%s]监测值为[%s]%s,达到了设置的报警阈值范围[%s],发生告警,告警级别为[%s]!", + signalDate.get("signal_name").toString(), value, sinalUnit, + deviceAlarmParameter.getAlarmCondition(), alarmLevelname + ); + //告警信息 + alarmLog.setContent(alarmMessage); + //告警方式 + alarmLog.setNoticeAction(deviceAlarmParameter.getNoticeType()); + //邮件通知 + alarmLog.setNoticeEmails(deviceAlarmParameter.getNoticeEmails()); + //触发联动 + alarmLog.setNoticeLinkages(deviceAlarmParameter.getNoticeLinkages()); + //1-越限报警 + alarmLog.setAlarmClass("1"); + //区域标识 + alarmLog.setRegion(meterDevice.getRegion()); + + } + return alarmLog; + } + + //获取字典名称 根据项目编码和父项编码 + public String getDictName(String itemcode, String parentcode) { + QueryWrapper queryWrapperSysDictionaryItems = new QueryWrapper<>(); + String dictname = ""; + queryWrapperSysDictionaryItems.eq("itemcode", itemcode); + queryWrapperSysDictionaryItems.eq("parentcode", parentcode); + SysDictionaryItems sysDictionaryItems = sysDictionaryItemsService.getOne(queryWrapperSysDictionaryItems); + if (sysDictionaryItems != null) { + dictname = sysDictionaryItems.getDictName(); + } + return dictname; + } + + /** + * 根据告警规则 判断是否触发告警 + * + * @return true 触发恭敬规则 + * false 没有触发告警规则 + */ + public boolean TriggerAlarm(DeviceAlarmParameter deviceAlarmParameter, String value) { + + // //获取告警触发条件 + String str = deviceAlarmParameter.getAlarmCondition(); + // 定义正则表达式 + String regex = "(\\d+)\\s*((?:==?|!=|<=?|>=?))\\s*value\\s*((?:==?|!=|<=?|>=?))\\s*(\\d+)"; + Pattern pattern = Pattern.compile(regex); + Matcher matcher = pattern.matcher(str); + + // 查找并输出比较符号和数值 + if (matcher.find()) { + try { + // 第一个数字 + String number1 = matcher.group(1); + // 第一个比较符 + String operator1 = matcher.group(2); + // 第二个比较符 + String operator2 = matcher.group(3); + // 第二个数字 + String number2 = matcher.group(4); + Double aDouble = Double.valueOf(value); + boolean result = compare(Double.valueOf(number1), operator1, aDouble); + boolean resultTwo = compare(aDouble, operator2, Double.valueOf(number2)); + return result && resultTwo; + } catch (Exception e) { + log.error(e.getMessage()); + return false; + } + + } + return false; + + } + + private static boolean compare(Double value1, String operator, Double value2) { + switch (operator) { + case "<": + return value1.compareTo(value2) < 0; + case "<=": + return value1.compareTo(value2) < 0 || value1.compareTo(value2) == 0; + case ">": + return value1.compareTo(value2) > 0; + case ">=": + return value1.compareTo(value2) > 0 || value1.compareTo(value2) == 0; + case "==": + case "=": + return value1.compareTo(value2) == 0; + case "!=": + return value1.compareTo(value2) != 0; + default: + throw new IllegalArgumentException("错误的告警规则: " + operator); + } + } + + //执行告警相关动作 插入数据库 + private void doAlarmAction(AlarmLog alarmLog) { + //1.通过设备id 和信号id 查询告警参数设置表(告警规则) + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(DeviceAlarmParameter::getDeviceId, alarmLog.getPatroldeviceId()); + queryWrapper.eq(DeviceAlarmParameter::getSignalId, alarmLog.getDeviceId()); + List alarmParameters = deviceAlarmParameterMapper.selectList(queryWrapper); + for (DeviceAlarmParameter alarmParameter : alarmParameters) { + alarmLog.setFkAlarmType(alarmParameter.getAlarmType()); + alarmLog.setNoticeAction(alarmParameter.getNoticeType()); + alarmLog.setNoticeLinkages(alarmParameter.getNoticeLinkages()); + //todo 发送邮件 + // pushEmail(alarmRecord,alarmParameter); + } + this.saveOrUpdate(alarmLog); + } + + /** + * 判断当前时间在不在区间范围之内 + * + * @return true 在区间范围之内 + * false 不在时间范围之内 + */ + public Map getTimeInterval(int clockHour) { + int beforeclock = 0; + Map map = new HashMap<>(10); + // 获取当前时间 + LocalDateTime now = LocalDateTime.now(); + + // 获取昨天的 7 点 + LocalDateTime yesterdayClockAM = LocalDateTime.of(now.minusDays(1).toLocalDate(), LocalTime.of(clockHour, 0)); + map.put("starttime", yesterdayClockAM); + // 获取今天的 7 点 + LocalDateTime todayClockAM = LocalDateTime.of(now.toLocalDate(), LocalTime.of(clockHour, 0)); + LocalDateTime nextdayClockAM = LocalDateTime.of(now.plusDays(1).toLocalDate(), LocalTime.of(clockHour, 0)); + + map.put("endtime", todayClockAM); + // 判断时间是否在范围内 + if (now.isAfter(yesterdayClockAM) && now.isBefore(todayClockAM)) { + beforeclock = 1; + } else { + map.put("starttime", todayClockAM); + map.put("endtime", nextdayClockAM); + } + map.put("beforeclock", beforeclock); + return map; + } + + /** + * 根据条件查询告警记录表 判断是否存在告警记录 + * + * @return true 存在告警记录 + * false 不存在告警记录 + */ + public List queryDeviceAlarmRecord(AlarmLog alarmLog, + Map timeInterval) { + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(AlarmLog::getDeviceId, alarmLog.getDeviceId()); + queryWrapper.eq(AlarmLog::getAlarmLevel, alarmLog.getAlarmLevel()); + LocalDateTime starttime = (LocalDateTime) timeInterval.get("starttime"); + LocalDateTime endtime = (LocalDateTime) timeInterval.get("endtime"); + queryWrapper.between(AlarmLog::getAlarmDate, starttime, endtime); + return this.list(queryWrapper); + + } + } diff --git a/riis-system/src/main/resources/mapper/auxcontrol/DeviceAlarmRecordMapper.xml b/riis-system/src/main/resources/mapper/auxcontrol/DeviceAlarmRecordMapper.xml deleted file mode 100644 index 47230af..0000000 --- a/riis-system/src/main/resources/mapper/auxcontrol/DeviceAlarmRecordMapper.xml +++ /dev/null @@ -1,74 +0,0 @@ - - - - - - - - diff --git a/riis-system/src/main/resources/mapper/auxcontrol/DeviceSignalMapper.xml b/riis-system/src/main/resources/mapper/auxcontrol/DeviceSignalMapper.xml index a89a636..b512930 100644 --- a/riis-system/src/main/resources/mapper/auxcontrol/DeviceSignalMapper.xml +++ b/riis-system/src/main/resources/mapper/auxcontrol/DeviceSignalMapper.xml @@ -5,14 +5,24 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +