粉尘涉爆定时任务
parent
f26a4428ce
commit
bac8551228
|
|
@ -0,0 +1,39 @@
|
|||
package com.zcloud.mapper.datasource.dust;
|
||||
|
||||
|
||||
import com.zcloud.entity.PageData;
|
||||
import org.apache.ibatis.annotations.Param;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
public interface DustSensorMapper {
|
||||
/**
|
||||
* 查询所有启用的传感器
|
||||
*
|
||||
* @return 传感器列表
|
||||
*/
|
||||
List<PageData> selectAllActiveSensors();
|
||||
/**
|
||||
* 根据设备传感器ID查询规则
|
||||
* @param deviceSensorId
|
||||
* @return
|
||||
*/
|
||||
PageData selectRuleByDeviceSensorId(String deviceSensorId);
|
||||
/**
|
||||
* 根据设备ID和传感器类型查询传感器
|
||||
* @param deviceId
|
||||
* @param assocSensorType
|
||||
* @return
|
||||
*/
|
||||
PageData findByDeviceIdAndSensorType(@Param("deviceId") String deviceId, @Param("assocSensorType") String assocSensorType);
|
||||
/**
|
||||
* 批量创建报警记录
|
||||
* @param alarmRecords
|
||||
* @return
|
||||
*/
|
||||
int insertBatch(@Param("alarmRecords") List<PageData> alarmRecords);
|
||||
|
||||
List<PageData> getLatestData();
|
||||
|
||||
PageData getLatestDataById(String deviceSensorId);
|
||||
}
|
||||
|
|
@ -0,0 +1,10 @@
|
|||
package com.zcloud.mapper.dsno2.sensor;
|
||||
|
||||
import com.zcloud.entity.PageData;
|
||||
import org.apache.ibatis.annotations.Param;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
public interface LastSensorDataMapper {
|
||||
|
||||
}
|
||||
|
|
@ -0,0 +1,295 @@
|
|||
package com.zcloud.scheduled;
|
||||
|
||||
import cn.hutool.core.date.DateUtil;
|
||||
import cn.hutool.core.util.IdUtil;
|
||||
import com.xxl.job.core.handler.annotation.XxlJob;
|
||||
import com.zcloud.entity.PageData;
|
||||
import com.zcloud.mapper.dsno2.sensor.LastSensorDataMapper;
|
||||
import com.zcloud.service.dust.DustSensorService;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
import org.springframework.stereotype.Component;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
import java.math.BigDecimal;
|
||||
import java.time.Duration;
|
||||
import java.time.LocalDateTime;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.concurrent.ConcurrentHashMap;
|
||||
|
||||
@Component
|
||||
public class DustSensorAlarmScheduled {
|
||||
|
||||
private static final Logger log = LoggerFactory.getLogger(DustSensorAlarmScheduled.class);
|
||||
|
||||
|
||||
@Resource
|
||||
private DustSensorService sensorAlarmService;
|
||||
@Resource
|
||||
private LastSensorDataMapper lastSensorDataMapper;
|
||||
|
||||
// 缓存规则模板:RULE_ID -> Rule
|
||||
private final Map<String, PageData> ruleCache = new ConcurrentHashMap<>();
|
||||
|
||||
// 报警状态缓存:DEVICE_SENSOR_ID -> AlarmState
|
||||
private final Map<String, PageData> alarmStateCache = new ConcurrentHashMap<>();
|
||||
|
||||
|
||||
@XxlJob(value = "sensorAlarmScheduled")
|
||||
public void sensorAlarmScheduled() {
|
||||
// 1. 获取所有启用的传感器(排除停用/删除)
|
||||
List<PageData> allSensors = sensorAlarmService.selectAllActiveSensors();
|
||||
// 2. 批量获取最新实时数据
|
||||
List<PageData> latestDataMap = sensorAlarmService.getLatestData();
|
||||
// 3.批量错误 数据
|
||||
List<PageData> alarmRecords = new ArrayList<>();
|
||||
allSensors.forEach(sensor -> {
|
||||
PageData currentData = latestDataMap.stream()
|
||||
.filter(item -> item.get("DEVICE_SENSOR_ID").equals(sensor.get("DEVICE_SENSOR_ID")))
|
||||
.findFirst()
|
||||
.orElse(null);
|
||||
if (currentData == null) {
|
||||
log.warn("未获取到传感器实时数据, DEVICE_SENSOR_ID={}", sensor.get("DEVICE_SENSOR_ID"));
|
||||
}
|
||||
evaluateSingleSensorAlarm(alarmRecords, sensor, currentData);
|
||||
});
|
||||
if (!alarmRecords.isEmpty()) {
|
||||
// 4. 批量创建报警记录
|
||||
sensorAlarmService.createAlarmRecord(alarmRecords);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 判断单个传感器是否触发/消警
|
||||
*/
|
||||
private void evaluateSingleSensorAlarm(List<PageData> alarmRecords, PageData sensor, PageData currentData) {
|
||||
// 1. 获取规则(优先从缓存)
|
||||
PageData rule = getRuleTemplate(sensor.getString("DEVICE_SENSOR_ID"));
|
||||
if (rule == null || !"1".equals(rule.getString("IS_ACTIVE"))) {
|
||||
return;
|
||||
}
|
||||
|
||||
// 2. 检查传感器是否离线超时(24小时)
|
||||
if (isOfflineTimeout(currentData, Integer.parseInt(rule.getString("OFFLINE_TIMEOUT_HOUR")))) {
|
||||
handleOfflineClear(sensor, rule);
|
||||
return;
|
||||
}
|
||||
|
||||
// 3. 处理关联传感器(如启停信号)
|
||||
if (!checkAssociatedCondition(sensor, rule, currentData)) {
|
||||
// 不满足关联条件,不报警(但不清除已有报警!)
|
||||
// 注意:业务规则中,关联不满足 ≠ 消警,只是不触发新报警
|
||||
return;
|
||||
}
|
||||
|
||||
// 4. 判断是否超限
|
||||
boolean isOverLimit = isValueOverLimit(currentData, rule);
|
||||
|
||||
// 5. 获取当前报警状态
|
||||
PageData state = alarmStateCache.computeIfAbsent(
|
||||
sensor.getString("DEVICE_SENSOR_ID"),
|
||||
k -> {
|
||||
PageData stateInit = new PageData();
|
||||
stateInit.put("IS_ALARMING", false);
|
||||
stateInit.put("CONSECUTIVE_NORMAL_POINTS", 0);
|
||||
return stateInit;
|
||||
}
|
||||
);
|
||||
|
||||
if (isOverLimit) {
|
||||
// --- 触发逻辑 ---
|
||||
handleTriggerLogic(alarmRecords, sensor, rule, currentData, state);
|
||||
} else {
|
||||
// --- 消警逻辑 ---
|
||||
handleClearLogic(sensor, rule, currentData, state);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 处理触发逻辑(考虑持续时间)
|
||||
*/
|
||||
private void handleTriggerLogic(List<PageData> alarmRecords, PageData sensor, PageData rule,
|
||||
PageData currentData, PageData state) {
|
||||
LocalDateTime now = LocalDateTime.now();
|
||||
if (!Boolean.parseBoolean(state.get("IS_ALARMING").toString())) {
|
||||
// 判断规则是否存在 持续报警时间
|
||||
if (rule.get("TRIGGER_DURATION_SEC") != null) {
|
||||
// 首次超限
|
||||
if (state.get("FIRST_TRIGGER_TIME") == null) {
|
||||
state.put("FIRST_TRIGGER_TIME", now);
|
||||
}
|
||||
// 检查是否满足持续时间 单位:秒
|
||||
// 暂时还没考虑数据点的情况,如后期有需求,在数据库的规则表中增加一个字段TRIGGER_DURATION_POINT
|
||||
long durationSec = Duration.between(LocalDateTime.parse(state.get("FIRST_TRIGGER_TIME").toString()), now).getSeconds();
|
||||
if (durationSec >= Integer.parseInt(rule.getString("TRIGGER_DURATION_SEC"))) {
|
||||
// 触发报警
|
||||
createAlarmRecord(alarmRecords, sensor, rule, currentData);
|
||||
state.put("IS_ALARMING", true);
|
||||
log.info("【满足持续时间报警触发】sensor={}, value={}", sensor.get("SENSOR_NAME"), currentData.getString("CURRENT_VALUE"));
|
||||
}
|
||||
}else {
|
||||
// 触发报警
|
||||
createAlarmRecord(alarmRecords, sensor, rule, currentData);
|
||||
state.put("IS_ALARMING", true);
|
||||
log.info("【报警触发】sensor={}, value={}", sensor.get("SENSOR_NAME"), currentData.getString("CURRENT_VALUE"));
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* 创建报警记录
|
||||
*/
|
||||
private void createAlarmRecord(List<PageData> alarmRecords, PageData sensor, PageData rule, PageData currentData) {
|
||||
PageData alarmRecord = new PageData();
|
||||
alarmRecord.put("ALARM_RECORD_ID", IdUtil.fastSimpleUUID());
|
||||
alarmRecord.put("RULE_ID", rule.get("RULE_ID"));
|
||||
alarmRecord.put("DEVICE_SENSOR_ID", sensor.get("DEVICE_SENSOR_ID"));
|
||||
alarmRecord.put("SENSOR_CODE", sensor.get("SENSOR_CODE"));
|
||||
alarmRecord.put("DEVICE_ID", sensor.get("DEVICE_ID"));
|
||||
alarmRecord.put("ALARM_TYPE", rule.get("ALARM_TYPE"));
|
||||
alarmRecord.put("TRIGGER_REASON", currentData.get("TRIGGER_REASON"));
|
||||
alarmRecord.put("ALARM_LEVEL", currentData.get("ALARM_LEVEL"));
|
||||
alarmRecord.put("VALUE_AT_TRIGGER", currentData.getString("CURRENT_VALUE"));
|
||||
alarmRecord.put("TRIGGERED_TIME", DateUtil.now());
|
||||
alarmRecord.put("CREATOR", "scheduled");
|
||||
alarmRecord.put("OPERATOR", "scheduled");
|
||||
alarmRecord.put("CREATTIME", DateUtil.now());
|
||||
alarmRecord.put("OPERATTIME", DateUtil.now());
|
||||
alarmRecords.add(alarmRecord);
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* 处理消警逻辑
|
||||
*/
|
||||
private void handleClearLogic(PageData sensor, PageData rule,
|
||||
PageData currentData, PageData state) {
|
||||
if (!Boolean.parseBoolean(state.get("IS_ALARMING").toString())) {
|
||||
// 未报警,重置状态
|
||||
state.put("FIRST_TRIGGER_TIME", null);
|
||||
state.put("CONSECUTIVE_NORMAL_POINTS", 0);
|
||||
return;
|
||||
}
|
||||
|
||||
// 值已恢复正常,开始计数
|
||||
int normalPoints = Integer.parseInt(state.get("CONSECUTIVE_NORMAL_POINTS").toString()) + 1;
|
||||
state.put("CONSECUTIVE_NORMAL_POINTS", normalPoints);
|
||||
|
||||
// 假设1个数据点 = 1秒(可根据实际调整)
|
||||
if (normalPoints >= Integer.parseInt(rule.get("CLEAR_DURATION_SEC").toString())) {
|
||||
// TODO 消警逻辑
|
||||
// sensorAlarmService.clearAlarmEvent(sensor.get("DEVICE_SENSOR_ID").toString(), "normal");
|
||||
state.put("IS_ALARMING", false);
|
||||
state.put("CONSECUTIVE_NORMAL_POINTS", 0);
|
||||
log.info("【报警消警】sensor={}", sensor.get("SENSOR_NAME"));
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 判断当前值是否超限
|
||||
*/
|
||||
private boolean isValueOverLimit(PageData data, PageData rule) {
|
||||
BigDecimal value = new BigDecimal(data.getString("CURRENT_VALUE"));
|
||||
|
||||
if ("2".equals(rule.getString("SIGNAL_TYPE"))) { // 开关量
|
||||
return value.compareTo(new BigDecimal(rule.getString("SWITCH_ALARM_VALUE"))) == 0;
|
||||
} else { // 模拟量
|
||||
if (rule.getString("HIGH_ALARM") != null && value.compareTo(new BigDecimal(rule.getString("HIGH_ALARM"))) > 0) {
|
||||
data.put("TRIGGER_REASON", data.getString("TARGET_NAME") + "超过高报警");
|
||||
data.put("ALARM_LEVEL", "2");
|
||||
return true;
|
||||
}
|
||||
if (rule.getString("HIGH_HIGH_ALARM") != null && value.compareTo(new BigDecimal(rule.getString("HIGH_HIGH_ALARM"))) > 0) {
|
||||
data.put("TRIGGER_REASON", data.getString("TARGET_NAME") + "超过高高报警");
|
||||
data.put("ALARM_LEVEL", "3");
|
||||
return true;
|
||||
}
|
||||
if (rule.getString("LOW_ALARM") != null && value.compareTo(new BigDecimal(rule.getString("LOW_ALARM"))) < 0) {
|
||||
data.put("TRIGGER_REASON", data.getString("TARGET_NAME") + "超过低报警");
|
||||
data.put("ALARM_LEVEL", "2");
|
||||
return true;
|
||||
}
|
||||
if (rule.getString("LOW_LOW_ALARM") != null && value.compareTo(new BigDecimal(rule.getString("LOW_LOW_ALARM"))) < 0) {
|
||||
data.put("TRIGGER_REASON", data.getString("TARGET_NAME") + "超过低低报警");
|
||||
data.put("ALARM_LEVEL", "3");
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* 检查关联条件(如同设备下的启停信号是否为“启动”)
|
||||
*/
|
||||
private boolean checkAssociatedCondition(PageData sensor, PageData rule, PageData currentData) {
|
||||
String assocSensorType = rule.getString("ASSOCIATED_SENSOR_TYPE");
|
||||
if (assocSensorType == null) {
|
||||
return true; // 无关联,直接通过
|
||||
}
|
||||
|
||||
// 在同一设备下查找关联传感器
|
||||
PageData associatedSensor = sensorAlarmService.findByDeviceIdAndSensorType(
|
||||
sensor.getString("DEVICE_ID"), assocSensorType
|
||||
);
|
||||
|
||||
if (associatedSensor == null) {
|
||||
log.warn("未找到关联传感器, deviceId={}, type={}", sensor.getString("DEVICE_ID"), assocSensorType);
|
||||
return false;
|
||||
}
|
||||
|
||||
// 获取关联传感器的最新数据
|
||||
PageData assocData = sensorAlarmService.getLatestDataById(associatedSensor.getString("DEVICE_SENSOR_ID"));
|
||||
if (assocData == null) {
|
||||
return true; // 注意:这里返回 true 表示“不阻断”,但实际不触发报警(由上层控制)
|
||||
}
|
||||
|
||||
// 判断关联条件(must_be_on → 值=1)
|
||||
if ("1".equals(rule.getString("ASSOCIATED_CONDITION"))) {
|
||||
return BigDecimal.ONE.compareTo(new BigDecimal(assocData.getString("CURRENT_VALUE"))) == 0;
|
||||
}
|
||||
if ("0".equals(rule.getString("ASSOCIATED_CONDITION"))) {
|
||||
return BigDecimal.ZERO.compareTo(new BigDecimal(assocData.getString("CURRENT_VALUE"))) == 0;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 离线超时自动消警
|
||||
*/
|
||||
private void handleOfflineClear(PageData sensor, PageData rule) {
|
||||
PageData state = alarmStateCache.get(sensor.getString("DEVICE_SENSOR_ID"));
|
||||
if (state != null && Boolean.parseBoolean(state.get("IS_ALARMING").toString())) {
|
||||
// TODO 消警逻辑
|
||||
//alarmEventService.clearAlarmEvent(sensor.get("DEVICE_SENSOR_ID").toString(), "offline_timeout");
|
||||
state.put("IS_ALARMING", false);
|
||||
log.info("【离线超时消警】sensor={}", sensor.get("SENSOR_NAME"));
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 检查是否离线超时(24小时)
|
||||
*/
|
||||
private boolean isOfflineTimeout(PageData data, int offlineTimeoutHour) {
|
||||
LocalDateTime insertTime = DateUtil.parseLocalDateTime(data.getString("INSERT_TIME"));
|
||||
long offlineHours = Duration.between(insertTime, LocalDateTime.now()).toHours();
|
||||
return offlineHours >= offlineTimeoutHour;
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取规则模板(带缓存)
|
||||
*/
|
||||
private PageData getRuleTemplate(String deviceSensorId) {
|
||||
return ruleCache.computeIfAbsent(deviceSensorId, id -> {
|
||||
PageData rule = sensorAlarmService.selectRuleByDeviceSensorId(deviceSensorId);
|
||||
if (rule == null) {
|
||||
log.error("规则模板不存在: deviceSensorId={}", deviceSensorId);
|
||||
}
|
||||
return rule;
|
||||
});
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,45 @@
|
|||
package com.zcloud.service.dust;
|
||||
|
||||
import com.zcloud.entity.PageData;
|
||||
import org.apache.ibatis.annotations.Param;
|
||||
|
||||
import java.time.LocalDateTime;
|
||||
import java.util.List;
|
||||
|
||||
public interface DustSensorService {
|
||||
/**
|
||||
* 查询所有活跃的传感器
|
||||
* @return
|
||||
*/
|
||||
List<PageData> selectAllActiveSensors();
|
||||
/**
|
||||
* 根据设备传感器ID查询规则
|
||||
* @param deviceSensorId
|
||||
* @return
|
||||
*/
|
||||
PageData selectRuleByDeviceSensorId(String deviceSensorId);
|
||||
/**
|
||||
* 根据设备ID和传感器类型查询传感器
|
||||
* @param deviceId
|
||||
* @param assocSensorType
|
||||
* @return
|
||||
*/
|
||||
PageData findByDeviceIdAndSensorType(String deviceId, String assocSensorType);
|
||||
/**
|
||||
* 创建报警记录
|
||||
* @param alarmRecords
|
||||
*/
|
||||
void createAlarmRecord(List<PageData> alarmRecords);
|
||||
|
||||
/**
|
||||
* 批量获取最新实时数据
|
||||
* @return
|
||||
*/
|
||||
List<PageData> getLatestData();
|
||||
/**
|
||||
* 根据设备传感器ID获取最新数据
|
||||
* @param deviceSensorId
|
||||
* @return
|
||||
*/
|
||||
PageData getLatestDataById(@Param("deviceSensorId") String deviceSensorId);
|
||||
}
|
||||
|
|
@ -0,0 +1,43 @@
|
|||
package com.zcloud.service.dust.impl;
|
||||
|
||||
import com.zcloud.entity.PageData;
|
||||
import com.zcloud.mapper.datasource.dust.DustSensorMapper;
|
||||
import com.zcloud.service.dust.DustSensorService;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
import java.util.List;
|
||||
|
||||
@Service
|
||||
public class DustSensorServiceImpl implements DustSensorService {
|
||||
|
||||
@Resource
|
||||
private DustSensorMapper dustSensorMapper;
|
||||
|
||||
@Override
|
||||
public List<PageData> selectAllActiveSensors() {
|
||||
return dustSensorMapper.selectAllActiveSensors();
|
||||
}
|
||||
|
||||
@Override
|
||||
public PageData selectRuleByDeviceSensorId(String deviceSensorId) {
|
||||
return dustSensorMapper.selectRuleByDeviceSensorId(deviceSensorId);
|
||||
}
|
||||
@Override
|
||||
public PageData findByDeviceIdAndSensorType(String deviceId, String assocSensorType) {
|
||||
return dustSensorMapper.findByDeviceIdAndSensorType(deviceId, assocSensorType);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void createAlarmRecord(List<PageData> alarmRecords) {
|
||||
dustSensorMapper.insertBatch(alarmRecords);
|
||||
}
|
||||
@Override
|
||||
public List<PageData> getLatestData() {
|
||||
return dustSensorMapper.getLatestData();
|
||||
}
|
||||
@Override
|
||||
public PageData getLatestDataById(String deviceSensorId) {
|
||||
return dustSensorMapper.getLatestDataById(deviceSensorId);
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,153 @@
|
|||
<?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.zcloud.mapper.datasource.dust.DustSensorMapper">
|
||||
|
||||
<select id="selectAllActiveSensors" resultType="com.zcloud.entity.PageData">
|
||||
select DEVICE_SENSOR_ID,
|
||||
DEVICE_ID,
|
||||
SENSOR_CODE,
|
||||
SENSOR_NAME,
|
||||
SENSOR_TYPE,
|
||||
SENSOR_CATEGORY,
|
||||
SIGNAL_TYPE,
|
||||
DISABLED_STATUS,
|
||||
ISDELETE
|
||||
from dust_device_sensor
|
||||
where DISABLED_STATUS = 0 AND ISDELETE = 0
|
||||
</select>
|
||||
|
||||
<select id="selectRuleByDeviceSensorId" resultType="com.zcloud.entity.PageData">
|
||||
select RULE_ID,
|
||||
DEVICE_SENSOR_ID,
|
||||
RULE_NAME,
|
||||
DEVICE_TYPE,
|
||||
SENSOR_TYPE,
|
||||
SIGNAL_TYPE,
|
||||
HIGH_ALARM,
|
||||
HIGH_HIGH_ALARM,
|
||||
LOW_ALARM,
|
||||
LOW_LOW_ALARM,
|
||||
SWITCH_ALARM_VALUE,
|
||||
TRIGGER_DURATION_SEC,
|
||||
CLEAR_DURATION_SEC,
|
||||
ASSOCIATED_SENSOR_TYPE,
|
||||
ASSOCIATED_CONDITION,
|
||||
OFFLINE_TIMEOUT_HOUR,
|
||||
IS_ACTIVE,
|
||||
SPECIAL_LOGIC_TYPE,
|
||||
CREATOR,
|
||||
CREATTIME,
|
||||
`OPERATOR`,
|
||||
OPERATTIME,
|
||||
ISDELETE,
|
||||
CORPINFO_ID
|
||||
from dust_device_sensor_alarm_rule
|
||||
where DEVICE_SENSOR_ID = #{deviceSensorId}
|
||||
</select>
|
||||
|
||||
<select id="findByDeviceIdAndSensorType" resultType="com.zcloud.entity.PageData">
|
||||
select DEVICE_SENSOR_ID,
|
||||
DEVICE_ID,
|
||||
SENSOR_CODE,
|
||||
SENSOR_NAME,
|
||||
SENSOR_TYPE,
|
||||
SENSOR_CATEGORY,
|
||||
SIGNAL_TYPE,
|
||||
DISABLED_STATUS,
|
||||
ISDELETE
|
||||
from dust_device_sensor
|
||||
where DEVICE_ID = #{deviceId} AND SENSOR_TYPE = #{assocSensorType}
|
||||
</select>
|
||||
|
||||
<insert id="insertBatch">
|
||||
insert into dust_device_sensor_alarm_record
|
||||
(ALARM_RECORD_ID,
|
||||
DEVICE_ID,
|
||||
RULE_ID,
|
||||
DEVICE_SENSOR_ID,
|
||||
SENSOR_CODE,
|
||||
ALARM_TYPE,
|
||||
TRIGGER_REASON,
|
||||
ALARM_LEVEL,
|
||||
VALUE_AT_TRIGGER,
|
||||
TRIGGERED_TIME,
|
||||
CREATOR,
|
||||
CREATTIME,
|
||||
OPERATTIME,
|
||||
OPERATOR)
|
||||
values
|
||||
<foreach collection="alarmRecords" item="item" separator=",">
|
||||
(#{item.ALARM_RECORD_ID},
|
||||
#{item.DEVICE_ID},
|
||||
#{item.RULE_ID},
|
||||
#{item.DEVICE_SENSOR_ID},
|
||||
#{item.SENSOR_CODE},
|
||||
#{item.ALARM_TYPE},
|
||||
#{item.TRIGGER_REASON},
|
||||
#{item.ALARM_LEVEL},
|
||||
#{item.VALUE_AT_TRIGGER},
|
||||
#{item.TRIGGERED_TIME},
|
||||
#{item.CREATOR},
|
||||
#{item.CREATTIME},
|
||||
#{item.OPERATTIME},
|
||||
#{item.OPERATOR})
|
||||
</foreach>
|
||||
</insert>
|
||||
|
||||
<select id="getLatestData" resultType="com.zcloud.entity.PageData">
|
||||
select MONITORING_ID,
|
||||
TARGET_NAME,
|
||||
TARGET_PLACE,
|
||||
TARGET_UNIT,
|
||||
SIGNAL_TYPE,
|
||||
CURRENT_VALUE,
|
||||
ALARM_VALUE,
|
||||
THRESHOLD_UP_LIMIT,
|
||||
THRESHOLD_UP_UP_LIM,
|
||||
THRESHOLD_DOWN_LIMI,
|
||||
THRESHOLD_DOWN_DOWN,
|
||||
RANGE_UP,
|
||||
RANGE_DOWN,
|
||||
PROCESSING_TIME,
|
||||
INSERT_TIME,
|
||||
PLC_ID,
|
||||
WARNING,
|
||||
GATHER_TIME,
|
||||
CORPINFO_ID,
|
||||
IPCDEVICE_ID,
|
||||
PLC_NAME,
|
||||
PROCESSING_BATCH_ID,
|
||||
OVERVIEW_OF_ALERTS,
|
||||
EQUIPMENT_ID
|
||||
from tb_iron_device_realtime_sxgt
|
||||
</select>
|
||||
|
||||
<select id="getLatestDataById" resultType="com.zcloud.entity.PageData">
|
||||
select MONITORING_ID,
|
||||
TARGET_NAME,
|
||||
TARGET_PLACE,
|
||||
TARGET_UNIT,
|
||||
SIGNAL_TYPE,
|
||||
CURRENT_VALUE,
|
||||
ALARM_VALUE,
|
||||
THRESHOLD_UP_LIMIT,
|
||||
THRESHOLD_UP_UP_LIM,
|
||||
THRESHOLD_DOWN_LIMI,
|
||||
THRESHOLD_DOWN_DOWN,
|
||||
RANGE_UP,
|
||||
RANGE_DOWN,
|
||||
PROCESSING_TIME,
|
||||
INSERT_TIME,
|
||||
PLC_ID,
|
||||
WARNING,
|
||||
GATHER_TIME,
|
||||
CORPINFO_ID,
|
||||
IPCDEVICE_ID,
|
||||
PLC_NAME,
|
||||
PROCESSING_BATCH_ID,
|
||||
OVERVIEW_OF_ALERTS,
|
||||
EQUIPMENT_ID
|
||||
from tb_iron_device_realtime_sxgt
|
||||
where PLC_ID = #{deviceSensorId} limit 1
|
||||
</select>
|
||||
</mapper>
|
||||
|
|
@ -0,0 +1,6 @@
|
|||
<?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.zcloud.mapper.dsno2.sensor.LastSensorDataMapper">
|
||||
|
||||
|
||||
</mapper>
|
||||
Loading…
Reference in New Issue