fix:优化采集设备分页查询接口

main
HuangHuiKang 3 weeks ago
parent fcc3cf46c0
commit b67ff2879c

@ -361,7 +361,7 @@ public class DeviceServiceImpl implements DeviceService {
// .orderByDesc(DeviceOperationRecordDO::getCreateTime) // .orderByDesc(DeviceOperationRecordDO::getCreateTime)
// ); // );
List<DeviceOperationRecordDO> operationRecords = tdengineService.selectLatestByDeviceAndRuleMinimal(deviceIds,ruleCodes); List<DeviceOperationRecordDO> operationRecords = tdengineService.selectLatestByDeviceAndRuleMinimal(deviceIds,null);
// 按 deviceId 分组,取最新一条 // 按 deviceId 分组,取最新一条
Map<Long, DeviceOperationRecordDO> latestRecordMap = operationRecords.stream() Map<Long, DeviceOperationRecordDO> latestRecordMap = operationRecords.stream()

@ -2009,7 +2009,8 @@ public class TDengineService {
/** /**
* * 使TDengineLAST
* GROUP BY device_id
*/ */
@DS("tdengine") @DS("tdengine")
public List<DeviceOperationRecordDO> selectLatestByDeviceAndRuleMinimal( public List<DeviceOperationRecordDO> selectLatestByDeviceAndRuleMinimal(
@ -2020,59 +2021,84 @@ public class TDengineService {
return Collections.emptyList(); return Collections.emptyList();
} }
// 优化:分组查询每个设备的最新记录 // 构建SQL查询使用TDengine的LAST函数
List<DeviceOperationRecordDO> allResults = new ArrayList<>(); StringBuilder sql = new StringBuilder(
"SELECT device_id, " +
for (Long deviceId : deviceIds) { "LAST(device_id) as last_device_id, " +
StringBuilder sql = new StringBuilder( "LAST(rule) as rule, " +
"SELECT * FROM besure_server.iot_device_operation_record " + "LAST(address_value) as address_value, " +
"WHERE deleted = 0 AND device_id = ? " "LAST(create_time) as create_time, " +
); "LAST(model_id) as model_id, " +
"LAST(creator) as creator, " +
"LAST(updater) as updater, " +
"LAST(update_time) as update_time, " +
"LAST(deleted) as deleted, " +
"LAST(tenant_id) as tenant_id, " +
"LAST(rule_id) as rule_id " +
"FROM besure_server.iot_device_operation_record " +
"WHERE deleted = 0 "
);
// 添加设备ID条件
sql.append("AND device_id IN (");
List<Object> params = new ArrayList<>();
List<Object> params = new ArrayList<>(); for (int i = 0; i < deviceIds.size(); i++) {
params.add(deviceId); if (i > 0) {
sql.append(", ");
}
sql.append("?");
params.add(deviceIds.get(i));
}
sql.append(") ");
if (CollectionUtils.isNotEmpty(ruleCodes)) { // 添加规则代码条件
sql.append("AND rule IN ("); if (CollectionUtils.isNotEmpty(ruleCodes)) {
for (int i = 0; i < ruleCodes.size(); i++) { sql.append("AND rule IN (");
if (i > 0) sql.append(", "); for (int i = 0; i < ruleCodes.size(); i++) {
sql.append("?"); if (i > 0) {
params.add(ruleCodes.get(i)); sql.append(", ");
} }
sql.append(") "); sql.append("?");
params.add(ruleCodes.get(i));
} }
sql.append(") ");
}
sql.append("ORDER BY create_time DESC LIMIT 1"); // 每个设备只取最新1条 // 使用GROUP BY device_id获取每个设备的最新记录
sql.append("GROUP BY device_id ");
try { // // 添加INTERVAL(0)确保正确处理时间窗口
List<DeviceOperationRecordDO> deviceResults = jdbcTemplate.query( // sql.append("INTERVAL(0) ");
sql.toString(),
params.toArray(),
(rs, rowNum) -> {
DeviceOperationRecordDO d = new DeviceOperationRecordDO();
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;
});
allResults.addAll(deviceResults);
} catch (Exception e) { // 按设备ID排序
log.error("查询设备{}的最新记录失败", deviceId, e); sql.append("ORDER BY device_id");
}
try {
return jdbcTemplate.query(
sql.toString(),
params.toArray(),
(rs, rowNum) -> {
DeviceOperationRecordDO d = new DeviceOperationRecordDO();
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("查询设备最新记录失败设备ID: {}, 错误: {}", deviceIds, e.getMessage(), e);
return Collections.emptyList();
} }
return allResults;
} }
/** /**

Loading…
Cancel
Save