奉贤 alarm topic接入
This commit is contained in:
@ -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";
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 获得缓存的基本对象列表
|
* 获得缓存的基本对象列表
|
||||||
*
|
*
|
||||||
|
|||||||
@ -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();
|
||||||
|
}
|
||||||
/**
|
/**
|
||||||
* 获取连接(带自动创建和缓存)
|
* 获取连接(带自动创建和缓存)
|
||||||
*/
|
*/
|
||||||
|
|||||||
@ -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();
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -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())
|
||||||
|
|||||||
@ -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);
|
||||||
|
}
|
||||||
@ -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);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -4,4 +4,5 @@ public interface IFXXDataProcessService {
|
|||||||
|
|
||||||
public void handleFxData(String message);
|
public void handleFxData(String message);
|
||||||
|
|
||||||
|
public void handleFxAlarmData(String message);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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;
|
||||||
|
|||||||
@ -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>
|
||||||
@ -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>
|
||||||
@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user