diff --git a/src/main/java/com/genersoft/iot/vmp/aiot/controller/AiAlertController.java b/src/main/java/com/genersoft/iot/vmp/aiot/controller/AiAlertController.java index 6eb75c1c2..7b6d8c0ad 100644 --- a/src/main/java/com/genersoft/iot/vmp/aiot/controller/AiAlertController.java +++ b/src/main/java/com/genersoft/iot/vmp/aiot/controller/AiAlertController.java @@ -1,5 +1,6 @@ package com.genersoft.iot.vmp.aiot.controller; +import com.alibaba.fastjson2.JSON; import com.genersoft.iot.vmp.aiot.bean.AiAlert; import com.genersoft.iot.vmp.aiot.service.IAiAlertService; import com.github.pagehelper.PageInfo; @@ -58,4 +59,54 @@ public class AiAlertController { @Parameter(description = "统计起始时间") @RequestParam(required = false, defaultValue = "2020-01-01 00:00:00") String startTime) { return alertService.statistics(startTime); } + + // ==================== Edge 告警上报 ==================== + + @Operation(summary = "Edge 告警上报") + @PostMapping("/edge/report") + public void edgeReport(@RequestBody Map body) { + String alarmId = (String) body.get("alarm_id"); + if (alarmId == null || alarmId.isEmpty()) { + log.warn("[AiAlert] Edge 上报缺少 alarm_id"); + return; + } + + AiAlert alert = new AiAlert(); + alert.setAlertId(alarmId); + alert.setCameraId((String) body.get("device_id")); + alert.setRoiId((String) body.get("scene_id")); + alert.setAlertType((String) body.get("algorithm_code")); + alert.setImagePath((String) body.get("snapshot_url")); + alert.setReceivedAt((String) body.get("event_time")); + + Object conf = body.get("confidence_score"); + if (conf instanceof Number) { + alert.setConfidence(((Number) conf).doubleValue()); + } + + Object extData = body.get("ext_data"); + if (extData != null) { + alert.setExtraData(JSON.toJSONString(extData)); + } + + alertService.save(alert); + log.info("[AiAlert] Edge 告警入库: alarmId={}, camera={}", alarmId, alert.getCameraId()); + } + + @Operation(summary = "Edge 告警结束上报") + @PostMapping("/edge/resolve") + public void edgeResolve(@RequestBody Map body) { + String alarmId = (String) body.get("alarm_id"); + if (alarmId == null || alarmId.isEmpty()) { + log.warn("[AiAlert] Edge resolve 缺少 alarm_id"); + return; + } + + Object durationMs = body.get("duration_ms"); + if (durationMs instanceof Number) { + double minutes = ((Number) durationMs).doubleValue() / 60_000.0; + alertService.updateDuration(alarmId, minutes); + log.info("[AiAlert] Edge 告警结束: alarmId={}, durationMin={}", alarmId, minutes); + } + } } diff --git a/src/main/java/com/genersoft/iot/vmp/aiot/dao/AiAlertMapper.java b/src/main/java/com/genersoft/iot/vmp/aiot/dao/AiAlertMapper.java index 36e587894..cbd830c4e 100644 --- a/src/main/java/com/genersoft/iot/vmp/aiot/dao/AiAlertMapper.java +++ b/src/main/java/com/genersoft/iot/vmp/aiot/dao/AiAlertMapper.java @@ -67,4 +67,7 @@ public interface AiAlertMapper { @Select("SELECT camera_id, COUNT(*) as cnt FROM wvp_ai_alert " + "WHERE received_at >= #{startTime} GROUP BY camera_id ORDER BY cnt DESC") List> statisticsByCamera(@Param("startTime") String startTime); + + @Update("UPDATE wvp_ai_alert SET duration_minutes=#{durationMinutes} WHERE alert_id=#{alertId}") + int updateDuration(@Param("alertId") String alertId, @Param("durationMinutes") double durationMinutes); } diff --git a/src/main/java/com/genersoft/iot/vmp/aiot/service/IAiAlertService.java b/src/main/java/com/genersoft/iot/vmp/aiot/service/IAiAlertService.java index a8791340e..d257b18dd 100644 --- a/src/main/java/com/genersoft/iot/vmp/aiot/service/IAiAlertService.java +++ b/src/main/java/com/genersoft/iot/vmp/aiot/service/IAiAlertService.java @@ -19,4 +19,6 @@ public interface IAiAlertService { void deleteBatch(List alertIds); Map statistics(String startTime); + + void updateDuration(String alertId, double durationMinutes); } diff --git a/src/main/java/com/genersoft/iot/vmp/aiot/service/impl/AiAlertServiceImpl.java b/src/main/java/com/genersoft/iot/vmp/aiot/service/impl/AiAlertServiceImpl.java index 1c462c6db..cacdff3dd 100644 --- a/src/main/java/com/genersoft/iot/vmp/aiot/service/impl/AiAlertServiceImpl.java +++ b/src/main/java/com/genersoft/iot/vmp/aiot/service/impl/AiAlertServiceImpl.java @@ -68,4 +68,9 @@ public class AiAlertServiceImpl implements IAiAlertService { result.put("by_camera", alertMapper.statisticsByCamera(startTime)); return result; } + + @Override + public void updateDuration(String alertId, double durationMinutes) { + alertMapper.updateDuration(alertId, durationMinutes); + } }