|
|
|
|
@ -1,13 +1,8 @@
|
|
|
|
|
package cn.iocoder.yudao.module.iot.service.device;
|
|
|
|
|
|
|
|
|
|
import cn.iocoder.yudao.framework.common.pojo.DeviceEdgeData;
|
|
|
|
|
import cn.iocoder.yudao.framework.common.pojo.PageResult;
|
|
|
|
|
import cn.iocoder.yudao.module.iot.controller.admin.device.enums.JavaToTdengineTypeEnum;
|
|
|
|
|
import cn.iocoder.yudao.module.iot.controller.admin.deviceoperationrecord.vo.DeviceTotalTimeRecordRespVO;
|
|
|
|
|
import cn.iocoder.yudao.module.iot.controller.admin.devicewarinningrecord.vo.DeviceWarinningRecordPageReqVO;
|
|
|
|
|
import cn.iocoder.yudao.module.iot.dal.dataobject.devicecontactmodel.DeviceContactModelDO;
|
|
|
|
|
import cn.iocoder.yudao.module.iot.dal.dataobject.deviceoperationrecord.DeviceOperationRecordDO;
|
|
|
|
|
import cn.iocoder.yudao.module.iot.dal.dataobject.devicewarinningrecord.DeviceWarinningRecordDO;
|
|
|
|
|
import com.alibaba.fastjson.JSON;
|
|
|
|
|
import com.baomidou.dynamic.datasource.annotation.DS;
|
|
|
|
|
import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
|
|
|
|
|
@ -1569,611 +1564,4 @@ public class TDengineService {
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// ========================== 运行记录表 ==========================
|
|
|
|
|
/**
|
|
|
|
|
* 插入设备运行记录到 TDengine
|
|
|
|
|
* @param record 设备运行记录
|
|
|
|
|
* @return 是否插入成功
|
|
|
|
|
*/
|
|
|
|
|
@DS("tdengine")
|
|
|
|
|
public boolean insertDeviceOperationRecord(DeviceOperationRecordDO record) {
|
|
|
|
|
|
|
|
|
|
if (record == null || record.getDeviceId() == null) {
|
|
|
|
|
log.warn("设备运行记录参数为空");
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 表名 - 使用固定表名或按设备分表
|
|
|
|
|
String tableName = "besure_server.iot_device_operation_record";
|
|
|
|
|
// 或者按设备分表: "besure_server.operation_record_" + record.getDeviceId();
|
|
|
|
|
|
|
|
|
|
// 构建 SQL
|
|
|
|
|
StringBuilder columnBuilder = new StringBuilder();
|
|
|
|
|
StringBuilder valueBuilder = new StringBuilder();
|
|
|
|
|
List<Object> params = new ArrayList<>();
|
|
|
|
|
|
|
|
|
|
// 1. 必须字段: 时间戳 (TDengine 要求)
|
|
|
|
|
columnBuilder.append("ts");
|
|
|
|
|
valueBuilder.append("?");
|
|
|
|
|
// 使用当前时间作为 ts,或者使用 record 中的时间
|
|
|
|
|
// if (record.getCreateTime() != null) {
|
|
|
|
|
// 将 LocalDateTime 转换为 Timestamp
|
|
|
|
|
// Timestamp tsTimestamp = Timestamp.valueOf(record.getCreateTime());
|
|
|
|
|
params.add(new Timestamp(System.currentTimeMillis()));
|
|
|
|
|
// } else {
|
|
|
|
|
// params.add(new Timestamp(System.currentTimeMillis()));
|
|
|
|
|
// }
|
|
|
|
|
|
|
|
|
|
// 2. 添加其他字段
|
|
|
|
|
// addFieldIfNotNull(record.getId(), "id", columnBuilder, valueBuilder, params);
|
|
|
|
|
addFieldIfNotNull(record.getDeviceId(), "device_id", columnBuilder, valueBuilder, params);
|
|
|
|
|
addFieldIfNotNull(record.getModelId(), "model_id", columnBuilder, valueBuilder, params);
|
|
|
|
|
addFieldIfNotNull(record.getRule(), "rule", columnBuilder, valueBuilder, params);
|
|
|
|
|
addFieldIfNotNull(record.getAddressValue(), "address_value", columnBuilder, valueBuilder, params);
|
|
|
|
|
addFieldIfNotNull(record.getCreator(), "creator", columnBuilder, valueBuilder, params);
|
|
|
|
|
|
|
|
|
|
// create_time 单独处理(如果已经作为 ts 使用,可以选择不重复插入)
|
|
|
|
|
|
|
|
|
|
columnBuilder.append(", create_time");
|
|
|
|
|
valueBuilder.append(", ?");
|
|
|
|
|
// // 将 LocalDateTime 转换为 Timestamp
|
|
|
|
|
// LocalDateTime createTime = record.getCreateTime();
|
|
|
|
|
// Timestamp timestamp = Timestamp.valueOf(createTime);
|
|
|
|
|
params.add(new Timestamp(System.currentTimeMillis()));
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
addFieldIfNotNull(record.getUpdater(), "updater", columnBuilder, valueBuilder, params);
|
|
|
|
|
|
|
|
|
|
// update_time
|
|
|
|
|
|
|
|
|
|
columnBuilder.append(", update_time");
|
|
|
|
|
valueBuilder.append(", ?");
|
|
|
|
|
params.add(new Timestamp(System.currentTimeMillis()));
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
addFieldIfNotNull(0,"deleted", columnBuilder, valueBuilder, params);
|
|
|
|
|
//TODO 待优化租户ID
|
|
|
|
|
addFieldIfNotNull("1", "tenant_id", columnBuilder, valueBuilder, params);
|
|
|
|
|
addFieldIfNotNull(record.getRuleId(), "rule_id", columnBuilder, valueBuilder, params);
|
|
|
|
|
|
|
|
|
|
// 构建完整 SQL
|
|
|
|
|
String sql = String.format("INSERT INTO %s (%s) VALUES (%s)",
|
|
|
|
|
tableName, columnBuilder.toString(), valueBuilder.toString());
|
|
|
|
|
|
|
|
|
|
try {
|
|
|
|
|
int rows = jdbcTemplate.update(sql, params.toArray());
|
|
|
|
|
log.info("TDengine 设备运行记录插入成功: deviceId={}, table={}, rows={}",
|
|
|
|
|
record.getDeviceId(), tableName, rows);
|
|
|
|
|
return rows > 0;
|
|
|
|
|
} catch (Exception e) {
|
|
|
|
|
log.error("TDengine 设备运行记录插入失败: deviceId={}, table={}, sql={}",
|
|
|
|
|
record.getDeviceId(), tableName, sql, e);
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 辅助方法:添加字段到 SQL
|
|
|
|
|
*/
|
|
|
|
|
private void addFieldIfNotNull(Object value, String columnName,
|
|
|
|
|
StringBuilder columnBuilder, StringBuilder valueBuilder,
|
|
|
|
|
List<Object> params) {
|
|
|
|
|
if (value != null) {
|
|
|
|
|
if (columnBuilder.length() > 0 && !columnBuilder.toString().endsWith("ts")) {
|
|
|
|
|
columnBuilder.append(", ");
|
|
|
|
|
valueBuilder.append(", ");
|
|
|
|
|
} else if (columnBuilder.length() > 0) {
|
|
|
|
|
columnBuilder.append(", ");
|
|
|
|
|
valueBuilder.append(", ");
|
|
|
|
|
}
|
|
|
|
|
columnBuilder.append(columnName);
|
|
|
|
|
valueBuilder.append("?");
|
|
|
|
|
params.add(value);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 批量查询设备最新一条运行记录
|
|
|
|
|
*/
|
|
|
|
|
@DS("tdengine")
|
|
|
|
|
public List<DeviceOperationRecordDO> selectLatestByDeviceAndRuleMinimal(
|
|
|
|
|
List<Long> deviceIds,
|
|
|
|
|
List<String> ruleCodes) {
|
|
|
|
|
|
|
|
|
|
if (CollectionUtils.isEmpty(deviceIds)) {
|
|
|
|
|
return Collections.emptyList();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
List<Object> params = new ArrayList<>();
|
|
|
|
|
StringBuilder sql = new StringBuilder(
|
|
|
|
|
"SELECT * FROM besure_server.iot_device_operation_record " +
|
|
|
|
|
"WHERE deleted = 0 AND device_id IN ("
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
for (int i = 0; i < deviceIds.size(); i++) {
|
|
|
|
|
if (i > 0) sql.append(", ");
|
|
|
|
|
sql.append("?");
|
|
|
|
|
params.add(deviceIds.get(i));
|
|
|
|
|
}
|
|
|
|
|
sql.append(") ");
|
|
|
|
|
|
|
|
|
|
if (CollectionUtils.isNotEmpty(ruleCodes)) {
|
|
|
|
|
sql.append("AND rule IN (");
|
|
|
|
|
for (int i = 0; i < ruleCodes.size(); i++) {
|
|
|
|
|
if (i > 0) sql.append(", ");
|
|
|
|
|
sql.append("?");
|
|
|
|
|
params.add(ruleCodes.get(i));
|
|
|
|
|
}
|
|
|
|
|
sql.append(") ");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
sql.append("ORDER BY create_time DESC");
|
|
|
|
|
|
|
|
|
|
try {
|
|
|
|
|
return jdbcTemplate.query(sql.toString(), params.toArray(), (rs, rowNum) -> {
|
|
|
|
|
DeviceOperationRecordDO d = new DeviceOperationRecordDO();
|
|
|
|
|
// d.setTs(rs.getTimestamp("ts") != null ? rs.getTimestamp("ts").toLocalDateTime() : null);
|
|
|
|
|
// d.setId(rs.getLong("id"));
|
|
|
|
|
d.setDeviceId(rs.getLong("device_id"));
|
|
|
|
|
d.setModelId(rs.getLong("model_id"));
|
|
|
|
|
d.setRule(rs.getString("rule"));
|
|
|
|
|
d.setAddressValue(rs.getString("address_value"));
|
|
|
|
|
d.setCreator(rs.getString("creator"));
|
|
|
|
|
d.setCreateTime(rs.getTimestamp("create_time") != null ? rs.getTimestamp("create_time").toLocalDateTime() : null);
|
|
|
|
|
d.setUpdater(rs.getString("updater"));
|
|
|
|
|
d.setUpdateTime(rs.getTimestamp("update_time") != null ? rs.getTimestamp("update_time").toLocalDateTime() : null);
|
|
|
|
|
d.setDeleted(rs.getBoolean("deleted"));
|
|
|
|
|
d.setTenantId(String.valueOf(rs.getLong("tenant_id")));
|
|
|
|
|
d.setRuleId(rs.getLong("rule_id"));
|
|
|
|
|
return d;
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
} catch (Exception e) {
|
|
|
|
|
log.error("查询失败", e);
|
|
|
|
|
return Collections.emptyList();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 从 TDengine 批量查询设备运行记录表最新状态
|
|
|
|
|
*/
|
|
|
|
|
@DS("tdengine")
|
|
|
|
|
public Map<Long, String> getLatestDeviceStatusAlternative(List<Long> deviceIds) {
|
|
|
|
|
if (CollectionUtils.isEmpty(deviceIds)) {
|
|
|
|
|
return Collections.emptyMap();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
Map<Long, String> statusMap = new HashMap<>();
|
|
|
|
|
|
|
|
|
|
// 分批查询,每批50个设备
|
|
|
|
|
int batchSize = 50;
|
|
|
|
|
for (int i = 0; i < deviceIds.size(); i += batchSize) {
|
|
|
|
|
int end = Math.min(i + batchSize, deviceIds.size());
|
|
|
|
|
List<Long> batchIds = deviceIds.subList(i, end);
|
|
|
|
|
|
|
|
|
|
// 为每批设备构建查询
|
|
|
|
|
batchIds.forEach(deviceId -> {
|
|
|
|
|
String status = getSingleDeviceStatus(deviceId);
|
|
|
|
|
if (status != null) {
|
|
|
|
|
statusMap.put(deviceId, status);
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return statusMap;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 查询单个设备的最新状态
|
|
|
|
|
*/
|
|
|
|
|
@DS("tdengine")
|
|
|
|
|
private String getSingleDeviceStatus(Long deviceId) {
|
|
|
|
|
String sql = "SELECT rule " +
|
|
|
|
|
"FROM besure_server.iot_device_operation_record " +
|
|
|
|
|
"WHERE device_id = ? " +
|
|
|
|
|
" AND deleted = 0 " +
|
|
|
|
|
" AND rule IN ('1', '2', '3', '4') " +
|
|
|
|
|
"ORDER BY create_time DESC " +
|
|
|
|
|
"LIMIT 1";
|
|
|
|
|
|
|
|
|
|
try {
|
|
|
|
|
return jdbcTemplate.queryForObject(sql, String.class, deviceId);
|
|
|
|
|
} catch (EmptyResultDataAccessException e) {
|
|
|
|
|
// 没有记录
|
|
|
|
|
return null;
|
|
|
|
|
} catch (Exception e) {
|
|
|
|
|
log.error("查询设备 {} 状态失败: {}", deviceId, e.getMessage());
|
|
|
|
|
return null;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@DS("tdengine")
|
|
|
|
|
public Map<Long, DeviceTotalTimeRecordRespVO> getDeviceTimeStatsFromTD(List<Long> deviceIds, String startTime, String endTime) {
|
|
|
|
|
if (CollectionUtils.isEmpty(deviceIds)) {
|
|
|
|
|
return Collections.emptyMap();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
StringBuilder sql = new StringBuilder();
|
|
|
|
|
List<Object> params = new ArrayList<>();
|
|
|
|
|
|
|
|
|
|
sql.append("SELECT ")
|
|
|
|
|
.append(" device_id, ")
|
|
|
|
|
.append(" SUM(CASE WHEN rule = '0' THEN 1 ELSE 0 END) * 60 AS totalOfflineTime, ")
|
|
|
|
|
.append(" SUM(CASE WHEN rule = '1' THEN 1 ELSE 0 END) * 60 AS totalRunningTime, ")
|
|
|
|
|
.append(" SUM(CASE WHEN rule = '2' THEN 1 ELSE 0 END) * 60 AS totalStandbyTime, ")
|
|
|
|
|
.append(" SUM(CASE WHEN rule = '3' THEN 1 ELSE 0 END) * 60 AS totalFaultTime ")
|
|
|
|
|
.append("FROM besure_server.iot_device_operation_record ")
|
|
|
|
|
.append("WHERE deleted = 0 ")
|
|
|
|
|
.append(" AND device_id IN (");
|
|
|
|
|
|
|
|
|
|
for (int i = 0; i < deviceIds.size(); i++) {
|
|
|
|
|
if (i > 0) sql.append(", ");
|
|
|
|
|
sql.append("?");
|
|
|
|
|
params.add(deviceIds.get(i));
|
|
|
|
|
}
|
|
|
|
|
sql.append(") ");
|
|
|
|
|
|
|
|
|
|
if (startTime != null) {
|
|
|
|
|
sql.append(" AND create_time >= ? ");
|
|
|
|
|
params.add(Timestamp.valueOf(startTime));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (endTime != null) {
|
|
|
|
|
sql.append(" AND create_time <= ? ");
|
|
|
|
|
params.add(Timestamp.valueOf(endTime));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
sql.append("GROUP BY device_id");
|
|
|
|
|
|
|
|
|
|
try {
|
|
|
|
|
List<Map<String, Object>> result = jdbcTemplate.queryForList(
|
|
|
|
|
sql.toString(), params.toArray()
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
return convertStatsToMap(result);
|
|
|
|
|
|
|
|
|
|
} catch (Exception e) {
|
|
|
|
|
log.error("TDengine 查询设备运行时间失败", e);
|
|
|
|
|
return Collections.emptyMap();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 转换统计结果
|
|
|
|
|
*/
|
|
|
|
|
private Map<Long, DeviceTotalTimeRecordRespVO> convertStatsToMap(
|
|
|
|
|
List<Map<String, Object>> result) {
|
|
|
|
|
|
|
|
|
|
Map<Long, DeviceTotalTimeRecordRespVO> statsMap = new HashMap<>();
|
|
|
|
|
|
|
|
|
|
for (Map<String, Object> row : result) {
|
|
|
|
|
Long deviceId = ((Number) row.get("device_id")).longValue();
|
|
|
|
|
|
|
|
|
|
DeviceTotalTimeRecordRespVO vo = new DeviceTotalTimeRecordRespVO();
|
|
|
|
|
vo.setId(deviceId);
|
|
|
|
|
vo.setTotalOfflineTime(getIntValue(row, "totalofflinetime"));
|
|
|
|
|
vo.setTotalRunningTime(getIntValue(row, "totalrunningtime"));
|
|
|
|
|
vo.setTotalStandbyTime(getIntValue(row, "totalstandbytime"));
|
|
|
|
|
vo.setTotalFaultTime(getIntValue(row, "totalfaulttime"));
|
|
|
|
|
|
|
|
|
|
statsMap.put(deviceId, vo);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return statsMap;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 安全获取整数值
|
|
|
|
|
*/
|
|
|
|
|
private Integer getIntValue(Map<String, Object> map, String key) {
|
|
|
|
|
Object value = map.get(key);
|
|
|
|
|
if (value == null) return 0;
|
|
|
|
|
if (value instanceof Number) return ((Number) value).intValue();
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//=============================== 告警记录表 ===============================
|
|
|
|
|
/**
|
|
|
|
|
* 插入告警记录到 TDengine(使用已有的辅助方法)
|
|
|
|
|
*/
|
|
|
|
|
@DS("tdengine")
|
|
|
|
|
public boolean insertDeviceWarningRecord(DeviceWarinningRecordDO deviceWarningRecordDO) {
|
|
|
|
|
if (deviceWarningRecordDO == null) {
|
|
|
|
|
log.warn("告警记录参数为空");
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
String tableName = "besure_server.iot_device_warning_record";
|
|
|
|
|
|
|
|
|
|
StringBuilder columnBuilder = new StringBuilder();
|
|
|
|
|
StringBuilder valueBuilder = new StringBuilder();
|
|
|
|
|
List<Object> params = new ArrayList<>();
|
|
|
|
|
|
|
|
|
|
// 1. 必须字段: 时间戳
|
|
|
|
|
columnBuilder.append("ts");
|
|
|
|
|
valueBuilder.append("?");
|
|
|
|
|
params.add(new Timestamp(System.currentTimeMillis()));
|
|
|
|
|
|
|
|
|
|
// 2. 设备信息
|
|
|
|
|
// addFieldIfNotNull(deviceWarningRecordDO.getId(), "id", columnBuilder, valueBuilder, params);
|
|
|
|
|
addFieldIfNotNull(deviceWarningRecordDO.getDeviceId(), "device_id", columnBuilder, valueBuilder, params);
|
|
|
|
|
addFieldIfNotNull(deviceWarningRecordDO.getModelId(), "model_id", columnBuilder, valueBuilder, params);
|
|
|
|
|
|
|
|
|
|
// 3. 规则和告警信息
|
|
|
|
|
addFieldIfNotNull(deviceWarningRecordDO.getRule(), "rule", columnBuilder, valueBuilder, params);
|
|
|
|
|
addFieldIfNotNull(deviceWarningRecordDO.getAlarmLevel(), "alarm_level", columnBuilder, valueBuilder, params);
|
|
|
|
|
addFieldIfNotNull(deviceWarningRecordDO.getAddressValue(), "address_value", columnBuilder, valueBuilder, params);
|
|
|
|
|
addFieldIfNotNull(deviceWarningRecordDO.getRuleId(), "rule_id", columnBuilder, valueBuilder, params);
|
|
|
|
|
|
|
|
|
|
// 4. 名称信息
|
|
|
|
|
addFieldIfNotNull(deviceWarningRecordDO.getDeviceName(), "device_name", columnBuilder, valueBuilder, params);
|
|
|
|
|
addFieldIfNotNull(deviceWarningRecordDO.getModelName(), "model_name", columnBuilder, valueBuilder, params);
|
|
|
|
|
addFieldIfNotNull(deviceWarningRecordDO.getRuleName(), "rule_name", columnBuilder, valueBuilder, params);
|
|
|
|
|
|
|
|
|
|
// 5. 创建者和更新者
|
|
|
|
|
//TODO 待优化
|
|
|
|
|
addFieldIfNotNull("1", "creator", columnBuilder, valueBuilder, params);
|
|
|
|
|
addFieldIfNotNull("1", "updater", columnBuilder, valueBuilder, params);
|
|
|
|
|
|
|
|
|
|
// 6. 时间字段
|
|
|
|
|
addFieldIfNotNull(new Timestamp(System.currentTimeMillis()), "create_time", columnBuilder, valueBuilder, params);
|
|
|
|
|
addFieldIfNotNull(new Timestamp(System.currentTimeMillis()), "update_time", columnBuilder, valueBuilder, params);
|
|
|
|
|
|
|
|
|
|
// 7. 删除标志
|
|
|
|
|
addFieldIfNotNull(0, "deleted", columnBuilder, valueBuilder, params);
|
|
|
|
|
|
|
|
|
|
// 8. 租户ID
|
|
|
|
|
//TODO 待优化
|
|
|
|
|
addFieldIfNotNull("1", "tenant_id", columnBuilder, valueBuilder, params);
|
|
|
|
|
|
|
|
|
|
// 构建完整 SQL
|
|
|
|
|
String sql = String.format("INSERT INTO %s (%s) VALUES (%s)",
|
|
|
|
|
tableName, columnBuilder.toString(), valueBuilder.toString());
|
|
|
|
|
|
|
|
|
|
try {
|
|
|
|
|
int rows = jdbcTemplate.update(sql, params.toArray());
|
|
|
|
|
log.info("告警记录插入成功: deviceId={}, rule={}",
|
|
|
|
|
deviceWarningRecordDO.getDeviceId(),
|
|
|
|
|
deviceWarningRecordDO.getRule());
|
|
|
|
|
return rows > 0;
|
|
|
|
|
} catch (Exception e) {
|
|
|
|
|
log.error("告警记录插入失败: deviceId={}, sql={}",
|
|
|
|
|
deviceWarningRecordDO.getDeviceId(), sql, e);
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* TDengine 分页查询告警记录
|
|
|
|
|
*/
|
|
|
|
|
@DS("tdengine")
|
|
|
|
|
public PageResult<DeviceWarinningRecordDO> selectRunngingRecordPage(DeviceWarinningRecordPageReqVO reqVO) {
|
|
|
|
|
|
|
|
|
|
// 构建查询 SQL
|
|
|
|
|
StringBuilder sql = new StringBuilder("SELECT * FROM besure_server.iot_device_warning_record ");
|
|
|
|
|
StringBuilder countSql = new StringBuilder("SELECT COUNT(*) FROM besure_server.iot_device_warning_record ");
|
|
|
|
|
List<Object> params = new ArrayList<>();
|
|
|
|
|
List<Object> countParams = new ArrayList<>();
|
|
|
|
|
|
|
|
|
|
// 添加 WHERE 条件
|
|
|
|
|
String whereCondition = buildWhereCondition(reqVO, params);
|
|
|
|
|
String countWhereCondition = buildWhereCondition(reqVO, countParams);
|
|
|
|
|
|
|
|
|
|
sql.append(whereCondition);
|
|
|
|
|
countSql.append(countWhereCondition);
|
|
|
|
|
|
|
|
|
|
// 添加排序
|
|
|
|
|
sql.append(" ORDER BY create_time DESC");
|
|
|
|
|
|
|
|
|
|
// 添加分页
|
|
|
|
|
if (reqVO.getPageNo() != null && reqVO.getPageSize() != null) {
|
|
|
|
|
int offset = (reqVO.getPageNo() - 1) * reqVO.getPageSize();
|
|
|
|
|
sql.append(" LIMIT ").append(reqVO.getPageSize()).append(" OFFSET ").append(offset);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
try {
|
|
|
|
|
// 1. 查询总数
|
|
|
|
|
Long total = jdbcTemplate.queryForObject(countSql.toString(), Long.class, countParams.toArray());
|
|
|
|
|
|
|
|
|
|
if (total == null || total == 0) {
|
|
|
|
|
return new PageResult<>(Collections.emptyList(), 0L);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 2. 查询数据
|
|
|
|
|
List<DeviceWarinningRecordDO> records = jdbcTemplate.query(
|
|
|
|
|
sql.toString(),
|
|
|
|
|
params.toArray(),
|
|
|
|
|
(rs, rowNum) -> mapRowToDO(rs)
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
return new PageResult<>(records, total);
|
|
|
|
|
|
|
|
|
|
} catch (Exception e) {
|
|
|
|
|
log.error("TDengine 分页查询告警记录失败", e);
|
|
|
|
|
return new PageResult<>(Collections.emptyList(), 0L);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 构建 WHERE 条件
|
|
|
|
|
*/
|
|
|
|
|
private String buildWhereCondition(DeviceWarinningRecordPageReqVO reqVO, List<Object> params) {
|
|
|
|
|
StringBuilder where = new StringBuilder(" WHERE deleted = 0 ");
|
|
|
|
|
|
|
|
|
|
// 设备ID
|
|
|
|
|
if (reqVO.getDeviceId() != null) {
|
|
|
|
|
where.append(" AND device_id = ? ");
|
|
|
|
|
params.add(reqVO.getDeviceId());
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 模型ID
|
|
|
|
|
if (reqVO.getModelId() != null) {
|
|
|
|
|
where.append(" AND model_id = ? ");
|
|
|
|
|
params.add(reqVO.getModelId());
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 规则
|
|
|
|
|
if (StringUtils.isNotBlank(reqVO.getRule())) {
|
|
|
|
|
where.append(" AND rule = ? ");
|
|
|
|
|
params.add(reqVO.getRule());
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 告警级别
|
|
|
|
|
if (StringUtils.isNotBlank(reqVO.getAlarmLevel())) {
|
|
|
|
|
where.append(" AND alarm_level = ? ");
|
|
|
|
|
params.add(reqVO.getAlarmLevel());
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 地址值
|
|
|
|
|
if (StringUtils.isNotBlank(reqVO.getAddressValue())) {
|
|
|
|
|
where.append(" AND address_value = ? ");
|
|
|
|
|
params.add(reqVO.getAddressValue());
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 创建时间范围
|
|
|
|
|
if (reqVO.getCreateTime() != null && reqVO.getCreateTime().length == 2) {
|
|
|
|
|
LocalDateTime startTime = reqVO.getCreateTime()[0];
|
|
|
|
|
LocalDateTime endTime = reqVO.getCreateTime()[1];
|
|
|
|
|
|
|
|
|
|
if (startTime != null) {
|
|
|
|
|
where.append(" AND create_time >= ? ");
|
|
|
|
|
params.add(Timestamp.valueOf(startTime));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (endTime != null) {
|
|
|
|
|
where.append(" AND create_time <= ? ");
|
|
|
|
|
params.add(Timestamp.valueOf(endTime));
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 规则ID
|
|
|
|
|
if (reqVO.getRuleId() != null) {
|
|
|
|
|
where.append(" AND rule_id = ? ");
|
|
|
|
|
params.add(reqVO.getRuleId());
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return where.toString();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 映射查询结果到 DO
|
|
|
|
|
*/
|
|
|
|
|
private DeviceWarinningRecordDO mapRowToDO(ResultSet rs) throws SQLException {
|
|
|
|
|
DeviceWarinningRecordDO record = new DeviceWarinningRecordDO();
|
|
|
|
|
|
|
|
|
|
// 时间戳
|
|
|
|
|
Timestamp ts = rs.getTimestamp("ts");
|
|
|
|
|
// if (ts != null) {
|
|
|
|
|
// record.setTs(ts.toLocalDateTime());
|
|
|
|
|
// }
|
|
|
|
|
|
|
|
|
|
// 其他字段
|
|
|
|
|
// record.setId(rs.getLong("id"));
|
|
|
|
|
record.setDeviceId(rs.getLong("device_id"));
|
|
|
|
|
record.setModelId(rs.getLong("model_id"));
|
|
|
|
|
record.setRule(rs.getString("rule"));
|
|
|
|
|
record.setAlarmLevel(rs.getString("alarm_level"));
|
|
|
|
|
record.setAddressValue(rs.getString("address_value"));
|
|
|
|
|
record.setCreator(rs.getString("creator"));
|
|
|
|
|
|
|
|
|
|
Timestamp createTime = rs.getTimestamp("create_time");
|
|
|
|
|
if (createTime != null) {
|
|
|
|
|
record.setCreateTime(createTime.toLocalDateTime());
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
record.setUpdater(rs.getString("updater"));
|
|
|
|
|
|
|
|
|
|
Timestamp updateTime = rs.getTimestamp("update_time");
|
|
|
|
|
if (updateTime != null) {
|
|
|
|
|
record.setUpdateTime(updateTime.toLocalDateTime());
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
record.setDeleted(rs.getInt("deleted") == 1);
|
|
|
|
|
// record.setTenantId(rs.getLong("tenant_id"));
|
|
|
|
|
record.setRuleId(rs.getLong("rule_id"));
|
|
|
|
|
record.setDeviceName(rs.getString("device_name"));
|
|
|
|
|
record.setModelName(rs.getString("model_name"));
|
|
|
|
|
record.setRuleName(rs.getString("rule_name"));
|
|
|
|
|
|
|
|
|
|
return record;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 查询设备告警记录列表(限制100条)
|
|
|
|
|
*/
|
|
|
|
|
@DS("tdengine")
|
|
|
|
|
public List<DeviceWarinningRecordDO> selectDeviceWarningList(Long deviceId) {
|
|
|
|
|
|
|
|
|
|
StringBuilder sql = new StringBuilder();
|
|
|
|
|
List<Object> params = new ArrayList<>();
|
|
|
|
|
|
|
|
|
|
sql.append("SELECT * FROM besure_server.iot_device_warning_record ")
|
|
|
|
|
.append("WHERE deleted = 0 ");
|
|
|
|
|
|
|
|
|
|
if (deviceId != null) {
|
|
|
|
|
sql.append("AND device_id = ? ");
|
|
|
|
|
params.add(deviceId);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
sql.append("ORDER BY create_time DESC ")
|
|
|
|
|
.append("LIMIT 100");
|
|
|
|
|
|
|
|
|
|
try {
|
|
|
|
|
return jdbcTemplate.query(sql.toString(), params.toArray(), (rs, rowNum) -> {
|
|
|
|
|
return mapRowToWarningRecordDO(rs);
|
|
|
|
|
});
|
|
|
|
|
} catch (Exception e) {
|
|
|
|
|
log.error("查询设备告警记录失败: deviceId={}", deviceId, e);
|
|
|
|
|
return Collections.emptyList();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 映射查询结果
|
|
|
|
|
*/
|
|
|
|
|
private DeviceWarinningRecordDO mapRowToWarningRecordDO(ResultSet rs) throws SQLException {
|
|
|
|
|
DeviceWarinningRecordDO record = new DeviceWarinningRecordDO();
|
|
|
|
|
|
|
|
|
|
// 时间戳
|
|
|
|
|
Timestamp ts = rs.getTimestamp("ts");
|
|
|
|
|
// if (ts != null) {
|
|
|
|
|
// record.setTs(ts.toLocalDateTime());
|
|
|
|
|
// }
|
|
|
|
|
|
|
|
|
|
// 其他字段
|
|
|
|
|
// record.setId(rs.getLong("id"));
|
|
|
|
|
record.setDeviceId(rs.getLong("device_id"));
|
|
|
|
|
record.setModelId(rs.getLong("model_id"));
|
|
|
|
|
record.setRule(rs.getString("rule"));
|
|
|
|
|
record.setAlarmLevel(rs.getString("alarm_level"));
|
|
|
|
|
record.setAddressValue(rs.getString("address_value"));
|
|
|
|
|
record.setCreator(rs.getString("creator"));
|
|
|
|
|
|
|
|
|
|
Timestamp createTime = rs.getTimestamp("create_time");
|
|
|
|
|
if (createTime != null) {
|
|
|
|
|
record.setCreateTime(createTime.toLocalDateTime());
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
record.setUpdater(rs.getString("updater"));
|
|
|
|
|
|
|
|
|
|
Timestamp updateTime = rs.getTimestamp("update_time");
|
|
|
|
|
if (updateTime != null) {
|
|
|
|
|
record.setUpdateTime(updateTime.toLocalDateTime());
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
record.setDeleted(rs.getInt("deleted") == 1);
|
|
|
|
|
// record.setTenantId(rs.getLong("tenant_id"));
|
|
|
|
|
record.setRuleId(rs.getLong("rule_id"));
|
|
|
|
|
record.setDeviceName(rs.getString("device_name"));
|
|
|
|
|
record.setModelName(rs.getString("model_name"));
|
|
|
|
|
record.setRuleName(rs.getString("rule_name"));
|
|
|
|
|
|
|
|
|
|
return record;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|