奉贤 alarm topic接入

This commit is contained in:
2025-09-23 13:59:45 +08:00
parent a5f1444984
commit 8e8c57cb64
14 changed files with 593 additions and 15 deletions

View File

@ -61,4 +61,10 @@ public class RedisKeyConstants
public static final String TOPIC_FAILED_ALRAM_RECORD = "topic_failed_"; public static final String TOPIC_FAILED_ALRAM_RECORD = "topic_failed_";
/** topic 内没有数据设备维度告警 */ /** topic 内没有数据设备维度告警 */
public static final String TOPIC_EMPTY_ALARM_RECORD = "topic_empty_"; public static final String TOPIC_EMPTY_ALARM_RECORD = "topic_empty_";
/** 告警匹配信息 */
public static final String ALARM_MATCH_INFO = "alarm_message_info";
/** 现有的告警数据 */
public static final String LATEST_ALARM_RECORD = "LATEST_ALARM_RECORD";
} }

View File

@ -241,6 +241,18 @@ public class RedisCache
return redisTemplate.opsForHash().multiGet(key, hKeys); return redisTemplate.opsForHash().multiGet(key, hKeys);
} }
/**
* 删除Hash中的多条数据
*
* @param key Redis键
* @param hKey Hash键
* @return 是否成功
*/
public boolean deleteAllCacheMapValue(final String key, final Object[] hKey)
{
return redisTemplate.opsForHash().delete(key, hKey) > 0;
}
/** /**
* 删除Hash中的某条数据 * 删除Hash中的某条数据
* *
@ -253,6 +265,18 @@ public class RedisCache
return redisTemplate.opsForHash().delete(key, hKey) > 0; return redisTemplate.opsForHash().delete(key, hKey) > 0;
} }
/**
* 批量往Hash中存入数据
*
* @param key Redis键
* @param value 值
*/
public <T> void setAllCacheMapValue(final String key, final Map<String, T> value)
{
redisTemplate.opsForHash().putAll(key, value);
}
/** /**
* 获得缓存的基本对象列表 * 获得缓存的基本对象列表
* *

View File

@ -3,6 +3,7 @@ package com.xzzn.framework.manager;
import com.ghgande.j2mod.modbus.net.TCPMasterConnection; import com.ghgande.j2mod.modbus.net.TCPMasterConnection;
import com.xzzn.ems.domain.EmsDevicesSetting; import com.xzzn.ems.domain.EmsDevicesSetting;
import com.xzzn.ems.mapper.EmsDevicesSettingMapper; import com.xzzn.ems.mapper.EmsDevicesSettingMapper;
import com.xzzn.ems.service.IEmsAlarmRecordsService;
import org.apache.commons.pool2.impl.GenericObjectPool; import org.apache.commons.pool2.impl.GenericObjectPool;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
@ -35,6 +36,8 @@ public class ModbusConnectionManager implements ApplicationRunner {
private ScheduledExecutorService scheduler; private ScheduledExecutorService scheduler;
@Autowired @Autowired
private EmsDevicesSettingMapper deviceRepo; private EmsDevicesSettingMapper deviceRepo;
@Autowired
private IEmsAlarmRecordsService iEmsAlarmRecordsService;
@Override @Override
public void run(ApplicationArguments args) throws Exception { public void run(ApplicationArguments args) throws Exception {
@ -46,8 +49,15 @@ public class ModbusConnectionManager implements ApplicationRunner {
scheduler = Executors.newSingleThreadScheduledExecutor(); scheduler = Executors.newSingleThreadScheduledExecutor();
scheduler.scheduleAtFixedRate(this::heartbeatCheck, 1, 5, TimeUnit.MINUTES); scheduler.scheduleAtFixedRate(this::heartbeatCheck, 1, 5, TimeUnit.MINUTES);
logger.info("Modbus连接管理器已初始化"); logger.info("Modbus连接管理器已初始化");
// 初始数据工作
initData();
} }
private void initData() {
// 初始化-告警数据
iEmsAlarmRecordsService.initAlarmMatchInfo();
}
/** /**
* 获取连接(带自动创建和缓存) * 获取连接(带自动创建和缓存)
*/ */

View File

@ -0,0 +1,117 @@
package com.xzzn.ems.domain;
import com.xzzn.common.core.domain.BaseEntity;
import org.apache.commons.lang3.builder.ToStringBuilder;
import org.apache.commons.lang3.builder.ToStringStyle;
import com.xzzn.common.annotation.Excel;
/**
* 告警点位匹配数据对象 ems_alarm_match_data
*
* @author xzzn
* @date 2025-09-22
*/
public class EmsAlarmMatchData extends BaseEntity
{
private static final long serialVersionUID = 1L;
/** $column.columnComment */
private Long id;
/** 告警点位 */
@Excel(name = "告警点位")
private String point;
/** 告警值 */
@Excel(name = "告警值")
private Long alarmData;
/** 告警描述 */
@Excel(name = "告警描述")
private String alarmDescription;
/** 站点id */
@Excel(name = "站点id")
private String siteId;
/** 设备类型 */
@Excel(name = "设备类型")
private String deviceCategory;
public void setId(Long id)
{
this.id = id;
}
public Long getId()
{
return id;
}
public void setPoint(String point)
{
this.point = point;
}
public String getPoint()
{
return point;
}
public void setAlarmData(Long alarmData)
{
this.alarmData = alarmData;
}
public Long getAlarmData()
{
return alarmData;
}
public void setAlarmDescription(String alarmDescription)
{
this.alarmDescription = alarmDescription;
}
public String getAlarmDescription()
{
return alarmDescription;
}
public void setSiteId(String siteId)
{
this.siteId = siteId;
}
public String getSiteId()
{
return siteId;
}
public void setDeviceCategory(String deviceCategory)
{
this.deviceCategory = deviceCategory;
}
public String getDeviceCategory()
{
return deviceCategory;
}
@Override
public String toString() {
return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
.append("id", getId())
.append("point", getPoint())
.append("alarmData", getAlarmData())
.append("alarmDescription", getAlarmDescription())
.append("siteId", getSiteId())
.append("deviceCategory", getDeviceCategory())
.append("createBy", getCreateBy())
.append("createTime", getCreateTime())
.append("updateBy", getUpdateBy())
.append("updateTime", getUpdateTime())
.append("remark", getRemark())
.toString();
}
}

View File

@ -24,8 +24,8 @@ public class EmsAlarmRecords extends BaseEntity
@Excel(name = "设备类型") @Excel(name = "设备类型")
private String deviceType; private String deviceType;
/** 告警等级 */ /** 告警等级A-提示 B-一般 C-严重 D紧急 */
@Excel(name = "告警等级") @Excel(name = "告警等级A-提示 B-一般 C-严重 D紧急")
private String alarmLevel; private String alarmLevel;
/** 告警内容 */ /** 告警内容 */
@ -42,8 +42,12 @@ public class EmsAlarmRecords extends BaseEntity
@Excel(name = "告警结束时间", width = 30, dateFormat = "yyyy-MM-dd") @Excel(name = "告警结束时间", width = 30, dateFormat = "yyyy-MM-dd")
private Date alarmEndTime; private Date alarmEndTime;
/** 状态 */ /** 告警点位 */
@Excel(name = "状态") @Excel(name = "告警点位")
private String alarmPoint;
/** 状态:0-待处理 1-已处理 2-处理中 */
@Excel(name = "状态:0-待处理 1-已处理 2-处理中")
private String status; private String status;
/** 站点id */ /** 站点id */
@ -118,6 +122,16 @@ public class EmsAlarmRecords extends BaseEntity
return alarmEndTime; return alarmEndTime;
} }
public void setAlarmPoint(String alarmPoint)
{
this.alarmPoint = alarmPoint;
}
public String getAlarmPoint()
{
return alarmPoint;
}
public void setStatus(String status) public void setStatus(String status)
{ {
this.status = status; this.status = status;
@ -148,12 +162,14 @@ public class EmsAlarmRecords extends BaseEntity
return deviceId; return deviceId;
} }
public String getTicketNo() { public void setTicketNo(String ticketNo)
return ticketNo; {
this.ticketNo = ticketNo;
} }
public void setTicketNo(String ticketNo) { public String getTicketNo()
this.ticketNo = ticketNo; {
return ticketNo;
} }
@Override @Override
@ -165,6 +181,7 @@ public class EmsAlarmRecords extends BaseEntity
.append("alarmContent", getAlarmContent()) .append("alarmContent", getAlarmContent())
.append("alarmStartTime", getAlarmStartTime()) .append("alarmStartTime", getAlarmStartTime())
.append("alarmEndTime", getAlarmEndTime()) .append("alarmEndTime", getAlarmEndTime())
.append("alarmPoint", getAlarmPoint())
.append("status", getStatus()) .append("status", getStatus())
.append("createBy", getCreateBy()) .append("createBy", getCreateBy())
.append("createTime", getCreateTime()) .append("createTime", getCreateTime())

View File

@ -0,0 +1,63 @@
package com.xzzn.ems.mapper;
import java.util.List;
import java.util.Map;
import com.xzzn.ems.domain.EmsAlarmMatchData;
/**
* 告警点位匹配数据Mapper接口
*
* @author xzzn
* @date 2025-09-22
*/
public interface EmsAlarmMatchDataMapper
{
/**
* 查询告警点位匹配数据
*
* @param id 告警点位匹配数据主键
* @return 告警点位匹配数据
*/
public EmsAlarmMatchData selectEmsAlarmMatchDataById(Long id);
/**
* 查询告警点位匹配数据列表
*
* @param emsAlarmMatchData 告警点位匹配数据
* @return 告警点位匹配数据集合
*/
public List<EmsAlarmMatchData> selectEmsAlarmMatchDataList(EmsAlarmMatchData emsAlarmMatchData);
/**
* 新增告警点位匹配数据
*
* @param emsAlarmMatchData 告警点位匹配数据
* @return 结果
*/
public int insertEmsAlarmMatchData(EmsAlarmMatchData emsAlarmMatchData);
/**
* 修改告警点位匹配数据
*
* @param emsAlarmMatchData 告警点位匹配数据
* @return 结果
*/
public int updateEmsAlarmMatchData(EmsAlarmMatchData emsAlarmMatchData);
/**
* 删除告警点位匹配数据
*
* @param id 告警点位匹配数据主键
* @return 结果
*/
public int deleteEmsAlarmMatchDataById(Long id);
/**
* 批量删除告警点位匹配数据
*
* @param ids 需要删除的数据主键集合
* @return 结果
*/
public int deleteEmsAlarmMatchDataByIds(Long[] ids);
}

View File

@ -94,4 +94,10 @@ public interface EmsAlarmRecordsMapper
//获取未处理的订阅失败告警 //获取未处理的订阅失败告警
public EmsAlarmRecords getFailedRecord(@Param("siteId")String siteId, @Param("deviceId")String deviceId, public EmsAlarmRecords getFailedRecord(@Param("siteId")String siteId, @Param("deviceId")String deviceId,
@Param("content") String content,@Param("status")String status); @Param("content") String content,@Param("status")String status);
// 批量处理告警数据
public void batchUpsert(@Param("recordsList")List<EmsAlarmRecords> recordsList);
// 获取所有没有处理完成的告警记录
public List<EmsAlarmRecords> getAllUnfinishedRecords(@Param("needUpdateKeys")List<String> needUpdateKeys,@Param("siteId") String siteId);
} }

View File

@ -83,4 +83,13 @@ public interface IEmsAlarmRecordsService
// topic 内没有数据,按照设备维度告警 // topic 内没有数据,按照设备维度告警
public void addEmptyDataAlarmRecord(String siteId, String deviceId); public void addEmptyDataAlarmRecord(String siteId, String deviceId);
// 告警字段和告警信息
public void initAlarmMatchInfo();
// 获取所有没有处理完成的告警记录
public List<EmsAlarmRecords> getAllUnfinishedRecords(List<String> needUpdateKeys, String siteId);
// 批量处理告警数据
public void batchProcessAlarmRecords(List<EmsAlarmRecords> recordsList);
} }

View File

@ -4,4 +4,5 @@ public interface IFXXDataProcessService {
public void handleFxData(String message); public void handleFxData(String message);
public void handleFxAlarmData(String message);
} }

View File

@ -2,18 +2,20 @@ package com.xzzn.ems.service.impl;
import java.util.*; import java.util.*;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors;
import com.xzzn.common.constant.RedisKeyConstants; import com.xzzn.common.constant.RedisKeyConstants;
import com.xzzn.common.core.domain.entity.SysUser; import com.xzzn.common.core.domain.entity.SysUser;
import com.xzzn.common.core.domain.model.LoginUser;
import com.xzzn.common.core.redis.RedisCache; import com.xzzn.common.core.redis.RedisCache;
import com.xzzn.common.enums.AlarmLevelStatus; import com.xzzn.common.enums.AlarmLevelStatus;
import com.xzzn.common.enums.AlarmStatus; import com.xzzn.common.enums.AlarmStatus;
import com.xzzn.common.utils.DateUtils; import com.xzzn.common.utils.DateUtils;
import com.xzzn.common.utils.StringUtils; import com.xzzn.common.utils.StringUtils;
import com.xzzn.ems.domain.EmsAlarmMatchData;
import com.xzzn.ems.domain.EmsTicket; import com.xzzn.ems.domain.EmsTicket;
import com.xzzn.ems.domain.vo.AlarmRecordListRequestVo; import com.xzzn.ems.domain.vo.AlarmRecordListRequestVo;
import com.xzzn.ems.domain.vo.AlarmRecordListResponseVo; import com.xzzn.ems.domain.vo.AlarmRecordListResponseVo;
import com.xzzn.ems.mapper.EmsAlarmMatchDataMapper;
import com.xzzn.ems.mapper.EmsTicketMapper; import com.xzzn.ems.mapper.EmsTicketMapper;
import com.xzzn.ems.service.IEmsTicketService; import com.xzzn.ems.service.IEmsTicketService;
import com.xzzn.system.mapper.SysUserMapper; import com.xzzn.system.mapper.SysUserMapper;
@ -35,8 +37,6 @@ public class EmsAlarmRecordsServiceImpl implements IEmsAlarmRecordsService
@Autowired @Autowired
private EmsAlarmRecordsMapper emsAlarmRecordsMapper; private EmsAlarmRecordsMapper emsAlarmRecordsMapper;
@Autowired @Autowired
private IEmsTicketService emsTicketService;
@Autowired
private EmsTicketMapper emsTicketMapper; private EmsTicketMapper emsTicketMapper;
@Autowired @Autowired
private SysUserMapper sysUserMapper; private SysUserMapper sysUserMapper;
@ -47,6 +47,8 @@ public class EmsAlarmRecordsServiceImpl implements IEmsAlarmRecordsService
put("021_DDS_01", "PCS"); put("021_DDS_01", "PCS");
put("021_FXX_01", "PCS01"); put("021_FXX_01", "PCS01");
}}; }};
@Autowired
private EmsAlarmMatchDataMapper emsAlarmMatchDataMapper;
/** /**
* 查询告警记录 * 查询告警记录
@ -228,7 +230,6 @@ public class EmsAlarmRecordsServiceImpl implements IEmsAlarmRecordsService
redisCache.setCacheObject(RedisKeyConstants.TOPIC_EMPTY_ALARM_RECORD + siteId + "_" + topicDevice, emsAlarmRecords,1, TimeUnit.DAYS); redisCache.setCacheObject(RedisKeyConstants.TOPIC_EMPTY_ALARM_RECORD + siteId + "_" + topicDevice, emsAlarmRecords,1, TimeUnit.DAYS);
} }
private EmsAlarmRecords createAlarmAtPcs(String siteId, String deviceId,String content,String level) { private EmsAlarmRecords createAlarmAtPcs(String siteId, String deviceId,String content,String level) {
EmsAlarmRecords emsAlarmRecords = new EmsAlarmRecords(); EmsAlarmRecords emsAlarmRecords = new EmsAlarmRecords();
emsAlarmRecords.setSiteId(siteId); emsAlarmRecords.setSiteId(siteId);
@ -251,4 +252,28 @@ public class EmsAlarmRecordsServiceImpl implements IEmsAlarmRecordsService
} }
@Override
public void initAlarmMatchInfo() {
List<EmsAlarmMatchData> alarmPointList = emsAlarmMatchDataMapper.selectEmsAlarmMatchDataList(null);
Map<String, EmsAlarmMatchData> resultMap = alarmPointList.stream()
.collect(Collectors.toMap(
data->data.getDeviceCategory()+"_"+data.getPoint(),
data->data,
(existing, replacement) -> replacement
));
// 存redis
redisCache.setCacheObject(RedisKeyConstants.ALARM_MATCH_INFO,resultMap, 1, TimeUnit.DAYS);
}
@Override
public List<EmsAlarmRecords> getAllUnfinishedRecords(List<String> needUpdateKeys, String siteId) {
return emsAlarmRecordsMapper.getAllUnfinishedRecords(needUpdateKeys,siteId);
}
@Override
public void batchProcessAlarmRecords(List<EmsAlarmRecords> recordsList) {
emsAlarmRecordsMapper.batchUpsert(recordsList);
}
} }

View File

@ -27,6 +27,7 @@ import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter; import java.time.format.DateTimeFormatter;
import java.time.temporal.ChronoUnit; import java.time.temporal.ChronoUnit;
import java.util.*; import java.util.*;
import java.util.stream.Collectors;
@Service @Service
public class FXXDataProcessServiceImpl extends AbstractBatteryDataProcessor implements IFXXDataProcessService { public class FXXDataProcessServiceImpl extends AbstractBatteryDataProcessor implements IFXXDataProcessService {
@ -767,6 +768,145 @@ public class FXXDataProcessServiceImpl extends AbstractBatteryDataProcessor impl
return records; return records;
} }
@Override
public void handleFxAlarmData(String message) {
JSONArray arraylist = JSONArray.parseArray(message);
// 获取redis缓存-告警信息
Map<String, EmsAlarmMatchData> alarmMatchInfo= redisCache.getCacheObject(RedisKeyConstants.ALARM_MATCH_INFO);
for (int i = 0; i < arraylist.size(); i++) {
JSONObject obj = JSONObject.parseObject(arraylist.get(i).toString());
String deviceId = obj.get("Device").toString();
String jsonData = obj.get("Data").toString();
log.info("deviceId:" + deviceId);
if (deviceId.contains("BMSD")) {
alarmDataProcess(deviceId, jsonData, alarmMatchInfo, DeviceCategory.STACK.getCode());
} else if (deviceId.contains("BMSC")) {
alarmDataProcess(deviceId, jsonData, alarmMatchInfo, DeviceCategory.CLUSTER.getCode());
} else if (deviceId.contains("PCS")) {
alarmDataProcess(deviceId, jsonData, alarmMatchInfo, DeviceCategory.PCS.getCode());
}
}
}
private void alarmDataProcess(String deviceId, String jsonData,
Map<String, EmsAlarmMatchData> alarmInfoData, String category) {
Map<String, Object> obj = JSON.parseObject(jsonData, new TypeReference<Map<String, Object>>() {
});
String redisKey = RedisKeyConstants.LATEST_ALARM_RECORD + "_" + SITE_ID +"_" + deviceId;
// 获取redis里面的当前有效告警遍历添加到已存在告警key里面
Map<String, Object> currentAlarm = redisCache.getCacheMap(redisKey);
final Set<String> currentAlarmKeys = new HashSet<>();
if (currentAlarm != null && !currentAlarm.isEmpty()) {
currentAlarm.keySet().stream()
.filter(Objects::nonNull)
.map(Object::toString)
.forEach(currentAlarmKeys::add);
}
// 结合同步数据,筛选簇需要更新的告警信息
List<String> needUpdateKeys = obj.entrySet().stream()
.filter(entry -> {
Object valueObj = entry.getValue();
if (valueObj == null) {
return false;
}
int value = Integer.parseInt(valueObj.toString());
return value == 0 && currentAlarmKeys.contains(entry.getKey());
})
.map(Map.Entry::getKey)
.collect(Collectors.toList());
// 批量查询数据库-需要更新的数据
Map<String, EmsAlarmRecords> needUpdateMap = new HashMap<>();
if (!needUpdateKeys.isEmpty()) {
List<EmsAlarmRecords> records = iEmsAlarmRecordsService.getAllUnfinishedRecords(needUpdateKeys,SITE_ID);
// 转为Map便于快速获取
needUpdateMap = records.stream()
.collect(Collectors.toMap(
EmsAlarmRecords::getAlarmPoint,
record -> record
));
}
List<EmsAlarmRecords> saveOrUpdateList = new ArrayList<>();
List<EmsAlarmRecords> newAddRecordList = new ArrayList<>();
List<String> toRemoveFromRedis = new ArrayList<>();
// 遍历数据map
for (Map.Entry<String, Object> entry : obj.entrySet()) {
String key = entry.getKey();
Integer value = (Integer) entry.getValue();
Boolean isCurrentAlarm = currentAlarmKeys.contains(key);
// 值为 1且不在当前告警里面 - 新增告警
if (value == 1 && !isCurrentAlarm) {
String matchRedisKey = category + "_" + key;
Object cacheObj = alarmInfoData.get(matchRedisKey);
if (cacheObj == null) {
// 处理空数据逻辑
return;
}
EmsAlarmMatchData matchInfo = JSON.toJavaObject(cacheObj, EmsAlarmMatchData.class);
EmsAlarmRecords emsAlarmRecord = convertAlarmRecord(deviceId,matchInfo);
saveOrUpdateList.add(emsAlarmRecord);
newAddRecordList.add(emsAlarmRecord);
} else if (value == 0 && isCurrentAlarm) {// 值为 0且在当前告警里面 - 更新告警已处理
EmsAlarmRecords existingAlarm = needUpdateMap.get(key);
if (existingAlarm != null) {
existingAlarm.setStatus(AlarmStatus.DONE.getCode());
existingAlarm.setUpdateTime(new Date());
existingAlarm.setAlarmEndTime(new Date());
saveOrUpdateList.add(existingAlarm);
toRemoveFromRedis.add(key);
}
}
}
// 批量处理插入和更新操作
if (saveOrUpdateList != null && saveOrUpdateList.size() > 0) {
iEmsAlarmRecordsService.batchProcessAlarmRecords(saveOrUpdateList);
}
// 已处理的从redis里面删除
if (!toRemoveFromRedis.isEmpty()) {
redisCache.deleteAllCacheMapValue(RedisKeyConstants.LATEST_ALARM_RECORD + SITE_ID,toRemoveFromRedis.toArray());
}
// 批量添加新增的告警到Redis
Map<String, EmsAlarmRecords> newAlarms = newAddRecordList.stream()
.filter(a -> !AlarmStatus.DONE.getCode().equals(a.getStatus()))
.collect(Collectors.toMap(EmsAlarmRecords::getAlarmPoint, a -> a));
if (!newAlarms.isEmpty()) {
// 本次新增的放入redis
redisCache.setAllCacheMapValue(redisKey, newAlarms);
}
}
private EmsAlarmRecords convertAlarmRecord(String deviceId, EmsAlarmMatchData matchInfo) {
EmsAlarmRecords emsAlarmRecords = new EmsAlarmRecords();
emsAlarmRecords.setSiteId(SITE_ID);
emsAlarmRecords.setDeviceId(deviceId);
emsAlarmRecords.setDeviceType(DeviceType.TCP.toString());
emsAlarmRecords.setAlarmLevel(AlarmLevelStatus.GENERAL.getCode());
emsAlarmRecords.setStatus(AlarmStatus.WAITING.getCode());
emsAlarmRecords.setAlarmStartTime(DateUtils.getNowDate());
emsAlarmRecords.setCreateTime(DateUtils.getNowDate());
emsAlarmRecords.setCreateBy("system");
emsAlarmRecords.setUpdateTime(DateUtils.getNowDate());
emsAlarmRecords.setUpdateBy("system");
if (matchInfo != null) {
emsAlarmRecords.setAlarmPoint(matchInfo.getPoint());
emsAlarmRecords.setAlarmContent(matchInfo.getAlarmDescription());
}
return emsAlarmRecords;
}
// 空数据不处理 // 空数据不处理
private boolean checkJsonDataEmpty(String jsonData) { private boolean checkJsonDataEmpty(String jsonData) {
boolean flag = false; boolean flag = false;

View File

@ -0,0 +1,100 @@
<?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.xzzn.ems.mapper.EmsAlarmMatchDataMapper">
<resultMap type="EmsAlarmMatchData" id="EmsAlarmMatchDataResult">
<result property="id" column="id" />
<result property="point" column="point" />
<result property="alarmData" column="alarm_data" />
<result property="alarmDescription" column="alarm_description" />
<result property="siteId" column="site_id" />
<result property="deviceCategory" column="device_category" />
<result property="createBy" column="create_by" />
<result property="createTime" column="create_time" />
<result property="updateBy" column="update_by" />
<result property="updateTime" column="update_time" />
<result property="remark" column="remark" />
</resultMap>
<sql id="selectEmsAlarmMatchDataVo">
select id, point, alarm_data, alarm_description, site_id, device_category, create_by, create_time, update_by, update_time, remark from ems_alarm_match_data
</sql>
<select id="selectEmsAlarmMatchDataList" parameterType="EmsAlarmMatchData" resultMap="EmsAlarmMatchDataResult">
<include refid="selectEmsAlarmMatchDataVo"/>
<where>
<if test="point != null and point != ''"> and point = #{point}</if>
<if test="alarmData != null "> and alarm_data = #{alarmData}</if>
<if test="alarmDescription != null and alarmDescription != ''"> and alarm_description = #{alarmDescription}</if>
<if test="siteId != null and siteId != ''"> and site_id = #{siteId}</if>
<if test="deviceCategory != null and deviceCategory != ''"> and device_category = #{deviceCategory}</if>
</where>
</select>
<select id="selectEmsAlarmMatchDataById" parameterType="Long" resultMap="EmsAlarmMatchDataResult">
<include refid="selectEmsAlarmMatchDataVo"/>
where id = #{id}
</select>
<insert id="insertEmsAlarmMatchData" parameterType="EmsAlarmMatchData" useGeneratedKeys="true" keyProperty="id">
insert into ems_alarm_match_data
<trim prefix="(" suffix=")" suffixOverrides=",">
<if test="point != null">point,</if>
<if test="alarmData != null">alarm_data,</if>
<if test="alarmDescription != null">alarm_description,</if>
<if test="siteId != null">site_id,</if>
<if test="deviceCategory != null">device_category,</if>
<if test="createBy != null">create_by,</if>
<if test="createTime != null">create_time,</if>
<if test="updateBy != null">update_by,</if>
<if test="updateTime != null">update_time,</if>
<if test="remark != null">remark,</if>
</trim>
<trim prefix="values (" suffix=")" suffixOverrides=",">
<if test="point != null">#{point},</if>
<if test="alarmData != null">#{alarmData},</if>
<if test="alarmDescription != null">#{alarmDescription},</if>
<if test="siteId != null">#{siteId},</if>
<if test="deviceCategory != null">#{deviceCategory},</if>
<if test="createBy != null">#{createBy},</if>
<if test="createTime != null">#{createTime},</if>
<if test="updateBy != null">#{updateBy},</if>
<if test="updateTime != null">#{updateTime},</if>
<if test="remark != null">#{remark},</if>
</trim>
</insert>
<update id="updateEmsAlarmMatchData" parameterType="EmsAlarmMatchData">
update ems_alarm_match_data
<trim prefix="SET" suffixOverrides=",">
<if test="point != null">point = #{point},</if>
<if test="alarmData != null">alarm_data = #{alarmData},</if>
<if test="alarmDescription != null">alarm_description = #{alarmDescription},</if>
<if test="siteId != null">site_id = #{siteId},</if>
<if test="deviceCategory != null">device_category = #{deviceCategory},</if>
<if test="createBy != null">create_by = #{createBy},</if>
<if test="createTime != null">create_time = #{createTime},</if>
<if test="updateBy != null">update_by = #{updateBy},</if>
<if test="updateTime != null">update_time = #{updateTime},</if>
<if test="remark != null">remark = #{remark},</if>
</trim>
where id = #{id}
</update>
<delete id="deleteEmsAlarmMatchDataById" parameterType="Long">
delete from ems_alarm_match_data where id = #{id}
</delete>
<delete id="deleteEmsAlarmMatchDataByIds" parameterType="String">
delete from ems_alarm_match_data where id in
<foreach item="id" collection="array" open="(" separator="," close=")">
#{id}
</foreach>
</delete>
<select id="getAllMatchInfo" resultType="java.util.Map">
select point,alarm_description as description from ems_alarm_match_data GROUP BY point,alarm_description
</select>
</mapper>

View File

@ -11,6 +11,7 @@
<result property="alarmContent" column="alarm_content" /> <result property="alarmContent" column="alarm_content" />
<result property="alarmStartTime" column="alarm_start_time" /> <result property="alarmStartTime" column="alarm_start_time" />
<result property="alarmEndTime" column="alarm_end_time" /> <result property="alarmEndTime" column="alarm_end_time" />
<result property="alarmPoint" column="alarm_point" />
<result property="status" column="status" /> <result property="status" column="status" />
<result property="createBy" column="create_by" /> <result property="createBy" column="create_by" />
<result property="createTime" column="create_time" /> <result property="createTime" column="create_time" />
@ -23,7 +24,7 @@
</resultMap> </resultMap>
<sql id="selectEmsAlarmRecordsVo"> <sql id="selectEmsAlarmRecordsVo">
select id, device_type, alarm_level, alarm_content, alarm_start_time, alarm_end_time, status, create_by, create_time, update_by, update_time, remark, site_id, device_id, ticket_no from ems_alarm_records select id, device_type, alarm_level, alarm_content, alarm_start_time, alarm_end_time, alarm_point, status, create_by, create_time, update_by, update_time, remark, site_id, device_id, ticket_no from ems_alarm_records
</sql> </sql>
<select id="selectEmsAlarmRecordsList" parameterType="EmsAlarmRecords" resultMap="EmsAlarmRecordsResult"> <select id="selectEmsAlarmRecordsList" parameterType="EmsAlarmRecords" resultMap="EmsAlarmRecordsResult">
@ -34,6 +35,7 @@
<if test="alarmContent != null and alarmContent != ''"> and alarm_content = #{alarmContent}</if> <if test="alarmContent != null and alarmContent != ''"> and alarm_content = #{alarmContent}</if>
<if test="alarmStartTime != null "> and alarm_start_time = #{alarmStartTime}</if> <if test="alarmStartTime != null "> and alarm_start_time = #{alarmStartTime}</if>
<if test="alarmEndTime != null "> and alarm_end_time = #{alarmEndTime}</if> <if test="alarmEndTime != null "> and alarm_end_time = #{alarmEndTime}</if>
<if test="alarmPoint != null and alarmPoint != ''"> and alarm_point = #{alarmPoint}</if>
<if test="status != null and status != ''"> and status = #{status}</if> <if test="status != null and status != ''"> and status = #{status}</if>
<if test="siteId != null and siteId != ''"> and site_id = #{siteId}</if> <if test="siteId != null and siteId != ''"> and site_id = #{siteId}</if>
<if test="deviceId != null and deviceId != ''"> and device_id = #{deviceId}</if> <if test="deviceId != null and deviceId != ''"> and device_id = #{deviceId}</if>
@ -54,6 +56,7 @@
<if test="alarmContent != null">alarm_content,</if> <if test="alarmContent != null">alarm_content,</if>
<if test="alarmStartTime != null">alarm_start_time,</if> <if test="alarmStartTime != null">alarm_start_time,</if>
<if test="alarmEndTime != null">alarm_end_time,</if> <if test="alarmEndTime != null">alarm_end_time,</if>
<if test="alarmPoint != null">alarm_point,</if>
<if test="status != null">status,</if> <if test="status != null">status,</if>
<if test="createBy != null">create_by,</if> <if test="createBy != null">create_by,</if>
<if test="createTime != null">create_time,</if> <if test="createTime != null">create_time,</if>
@ -70,6 +73,7 @@
<if test="alarmContent != null">#{alarmContent},</if> <if test="alarmContent != null">#{alarmContent},</if>
<if test="alarmStartTime != null">#{alarmStartTime},</if> <if test="alarmStartTime != null">#{alarmStartTime},</if>
<if test="alarmEndTime != null">#{alarmEndTime},</if> <if test="alarmEndTime != null">#{alarmEndTime},</if>
<if test="alarmPoint != null">#{alarmPoint},</if>
<if test="status != null">#{status},</if> <if test="status != null">#{status},</if>
<if test="createBy != null">#{createBy},</if> <if test="createBy != null">#{createBy},</if>
<if test="createTime != null">#{createTime},</if> <if test="createTime != null">#{createTime},</if>
@ -90,6 +94,7 @@
<if test="alarmContent != null">alarm_content = #{alarmContent},</if> <if test="alarmContent != null">alarm_content = #{alarmContent},</if>
<if test="alarmStartTime != null">alarm_start_time = #{alarmStartTime},</if> <if test="alarmStartTime != null">alarm_start_time = #{alarmStartTime},</if>
<if test="alarmEndTime != null">alarm_end_time = #{alarmEndTime},</if> <if test="alarmEndTime != null">alarm_end_time = #{alarmEndTime},</if>
<if test="alarmPoint != null">alarm_point = #{alarmPoint},</if>
<if test="status != null">status = #{status},</if> <if test="status != null">status = #{status},</if>
<if test="createBy != null">create_by = #{createBy},</if> <if test="createBy != null">create_by = #{createBy},</if>
<if test="createTime != null">create_time = #{createTime},</if> <if test="createTime != null">create_time = #{createTime},</if>
@ -186,4 +191,59 @@
and status = #{status} and status = #{status}
limit 1 limit 1
</select> </select>
<select id="getAllUnfinishedRecords" resultType="com.xzzn.ems.domain.EmsAlarmRecords">
<include refid="selectEmsAlarmRecordsVo"/>
WHERE status <![CDATA[ != ]]> 1
and site_id = #{siteId}
and alarm_point IN
<foreach collection="needUpdateKeys" item="key" open="(" separator="," close=")">
#{key}
</foreach>
</select>
<insert id="batchUpsert">
INSERT into ems_alarm_records (
id,
device_type,
alarm_level,
alarm_content,
alarm_start_time,
alarm_end_time,
alarm_point,
status,
create_by,
create_time,
update_by,
update_time,
remark,
site_id,
device_id,
ticket_no
) values
<foreach collection="recordsList" item="item" separator=",">
(
#{item.id},
#{item.deviceType},
#{item.alarmLevel},
#{item.alarmContent},
#{item.alarmStartTime},
#{item.alarmEndTime},
#{item.alarmPoint},
#{item.status},
#{item.createBy},
#{item.createTime},
#{item.updateBy},
#{item.updateTime},
#{item.remark},
#{item.siteId},
#{item.deviceId},
#{item.ticketNo}
)
</foreach>
on duplicate key update
alarm_end_time = values(alarm_end_time),
status = values(status),
device_id = values(device_id)
</insert>
</mapper> </mapper>

View File

@ -984,7 +984,7 @@
<select id="getPowerDataByHour" parameterType="com.xzzn.ems.domain.vo.DateSearchRequest" resultType="com.xzzn.ems.domain.vo.PowerStatisListVo"> <select id="getPowerDataByHour" parameterType="com.xzzn.ems.domain.vo.DateSearchRequest" resultType="com.xzzn.ems.domain.vo.PowerStatisListVo">
select latest.dateHour as statisDate, select latest.dateHour as statisDate,
<include refid="powerFilter"/> <include refid="powerFilter"/>
from ( SELECT p.site_id, p.device_id,DATE_FORMAT(p.data_update_time, '%H:00') AS dateHour,MAX(p.data_update_time) as max_update_time from ( SELECT p.site_id, p.device_id,DATE_FORMAT(p.data_update_time, '%Y-%m-%d %H:00') AS dateHour,MAX(p.data_update_time) as max_update_time
FROM ems_ammeter_data p FROM ems_ammeter_data p
<include refid="commonFilter"/> <include refid="commonFilter"/>
GROUP BY p.site_id,p.device_id,dateHour GROUP BY p.site_id,p.device_id,dateHour