fix(aiot): 修复告警 SQL 引用不存在的 gb_name 列
- queryByAlertId/queryList 的 COALESCE 去掉 sp.gb_name(该列属于 device_channel 表,不在 stream_proxy 表中),改用 sp.name - 新增轻量 countByAlertId 方法,save() 去重改用 COUNT 查询 避免触发带 JOIN 的复杂 SQL Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -15,8 +15,11 @@ public interface AiAlertMapper {
|
||||
@Options(useGeneratedKeys = true, keyProperty = "id", keyColumn = "id")
|
||||
int add(AiAlert alert);
|
||||
|
||||
@Select("SELECT COUNT(1) FROM wvp_ai_alert WHERE alert_id=#{alertId}")
|
||||
int countByAlertId(@Param("alertId") String alertId);
|
||||
|
||||
@Select("SELECT a.*, r.name AS roi_name, " +
|
||||
"COALESCE(SUBSTRING_INDEX(sp.gb_name, '/', 1), sp.name, sp.app) AS camera_name " +
|
||||
"COALESCE(sp.name, sp.app) AS camera_name " +
|
||||
"FROM wvp_ai_alert a " +
|
||||
"LEFT JOIN wvp_ai_roi r ON a.roi_id = r.roi_id " +
|
||||
"LEFT JOIN wvp_stream_proxy sp ON a.camera_id = sp.camera_code " +
|
||||
@@ -29,7 +32,7 @@ public interface AiAlertMapper {
|
||||
|
||||
@Select(value = {"<script>" +
|
||||
"SELECT a.*, r.name AS roi_name, " +
|
||||
"COALESCE(SUBSTRING_INDEX(sp.gb_name, '/', 1), sp.name, sp.app) AS camera_name " +
|
||||
"COALESCE(sp.name, sp.app) AS camera_name " +
|
||||
"FROM wvp_ai_alert a " +
|
||||
"LEFT JOIN wvp_ai_roi r ON a.roi_id = r.roi_id " +
|
||||
"LEFT JOIN wvp_stream_proxy sp ON a.camera_id = sp.camera_code " +
|
||||
|
||||
@@ -27,9 +27,8 @@ public class AiAlertServiceImpl implements IAiAlertService {
|
||||
if (alert.getReceivedAt() == null) {
|
||||
alert.setReceivedAt(LocalDateTime.now().format(FORMATTER));
|
||||
}
|
||||
// 防止重复插入
|
||||
AiAlert existing = alertMapper.queryByAlertId(alert.getAlertId());
|
||||
if (existing != null) {
|
||||
// 防止重复插入(轻量查询,不做 JOIN)
|
||||
if (alertMapper.countByAlertId(alert.getAlertId()) > 0) {
|
||||
log.debug("[AiAlert] 告警已存在, 跳过: alertId={}", alert.getAlertId());
|
||||
return;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user