fix(base): 优化设备参数最新值查询及异常处理

- 修改selectLatestBaseDeviceParamValList SQL,限制最多返回200条最新记录
- 调整SQL排序和过滤条件,提升查询准确性和性能
- 在BaseDeviceParamValServiceImpl中添加异常捕获,防止查询失败导致程序崩溃
- 如果查询结果为空或异常,返回空列表,保证调用方安全
- 增加日志输出,方便定位查询异常原因
master
zangch@mesnac.com 2 weeks ago
parent e73d1823f7
commit 4b859aa828

@ -1,6 +1,9 @@
package com.aucma.base.service.impl;
import java.util.Collections;
import java.util.List;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.aucma.base.mapper.BaseDeviceParamValMapper;
@ -16,6 +19,8 @@ import com.aucma.base.service.IBaseDeviceParamValService;
@Service
public class BaseDeviceParamValServiceImpl implements IBaseDeviceParamValService
{
private static final Logger log = LoggerFactory.getLogger(BaseDeviceParamValServiceImpl.class);
@Autowired
private BaseDeviceParamValMapper baseDeviceParamValMapper;
@ -52,7 +57,16 @@ public class BaseDeviceParamValServiceImpl implements IBaseDeviceParamValService
@Override
public List<BaseDeviceParamVal> selectLatestBaseDeviceParamValList(BaseDeviceParamVal baseDeviceParamVal)
{
return baseDeviceParamValMapper.selectLatestBaseDeviceParamValList(baseDeviceParamVal);
try {
if (baseDeviceParamVal == null) {
baseDeviceParamVal = new BaseDeviceParamVal();
}
List<BaseDeviceParamVal> list = baseDeviceParamValMapper.selectLatestBaseDeviceParamValList(baseDeviceParamVal);
return list != null ? list : Collections.emptyList();
} catch (Exception e) {
log.error("查询设备参数最新值失败: {}", e.getMessage());
return Collections.emptyList();
}
}
/**

@ -91,34 +91,24 @@
</foreach>
</delete>
<!-- 最新参数聚合查询:每设备每参数取最新一条记录 -->
<!-- 最新参数聚合查询:每设备每参数取最新一条记录限制返回200条 -->
<select id="selectLatestBaseDeviceParamValList" parameterType="BaseDeviceParamVal" resultMap="BaseDeviceParamValResult">
WITH t AS (
SELECT * FROM (
SELECT
record_id,
param_code,
device_code,
device_id,
param_name,
param_value,
collect_time,
record_time,
ROW_NUMBER() OVER (PARTITION BY device_code, device_id, param_code ORDER BY NVL(record_time, collect_time) DESC, record_id DESC) AS rn
FROM base_device_param_val
<where>
<if test="paramCode != null and paramCode != ''"> and param_code = #{paramCode}</if>
<if test="deviceCode != null and deviceCode != ''"> and device_code = #{deviceCode}</if>
<if test="deviceId != null "> and device_id = #{deviceId}</if>
<if test="paramName != null and paramName != ''"> and param_name like concat(concat('%', #{paramName}), '%')</if>
<if test="paramValue != null and paramValue != ''"> and param_value = #{paramValue}</if>
<!-- 时间条件若提供,将在给定范围内取最新记录 -->
<if test="collectTime != null "> and collect_time = #{collectTime}</if>
<if test="recordTime != null "> and record_time = #{recordTime}</if>
</where>
)
SELECT record_id, param_code, device_code, device_id, param_name, param_value, collect_time, record_time
FROM t
WHERE rn = 1
ORDER BY device_code, device_id, param_code
record_id, param_code, device_code, device_id, param_name, param_value, collect_time, record_time,
ROW_NUMBER() OVER (ORDER BY device_code, param_code) AS row_num
FROM (
SELECT
record_id, param_code, device_code, device_id, param_name, param_value, collect_time, record_time,
ROW_NUMBER() OVER (PARTITION BY device_code, param_code ORDER BY NVL(record_time, collect_time) DESC) AS rn
FROM base_device_param_val
<where>
<if test="deviceCode != null and deviceCode != ''">and device_code = #{deviceCode}</if>
<if test="paramCode != null and paramCode != ''">and param_code = #{paramCode}</if>
<if test="deviceId != null">and device_id = #{deviceId}</if>
<if test="paramName != null and paramName != ''">and param_name like '%' || #{paramName} || '%'</if>
</where>
) WHERE rn = 1
) WHERE row_num &lt;= 200
</select>
</mapper>
Loading…
Cancel
Save