fix(aiot): 修复自动推送参数错误 - 使用deviceId而不是cameraId

问题:
- 自动推送配置时传入错误的参数:cameraId(如:cam_xxx)
- 但 writeDeviceAggregatedConfig() 期望的是 deviceId(如:edge-001)
- 导致Edge端收不到配置更新通知,仍然显示"有ROI但未找到配置"

根本原因:
- writeDeviceAggregatedConfig(deviceId, action) 方法:
  - 参数deviceId指的是Edge设备ID(edge-001)
  - 通过deviceId查询该设备下的所有摄像头
  - 发送Redis Stream通知:device_id=deviceId
- Edge端监听 device_id="edge-001" 的消息
- 但我们传入的是 cameraId="cam_xxx",导致通知发送到错误的频道

错误调用链:
save() → writeDeviceAggregatedConfig(cameraId, "UPDATE") 
       → Redis Stream: device_id="cam_xxx" 
       → Edge监听 device_id="edge-001"  收不到!

修复方案:
- 所有自动推送调用改为使用 roi.getDeviceId()
- 修复的方法:save(), delete(), bindAlgo(), unbindAlgo(), updateAlgoParams()
- 添加device_id为空的警告日志
- 日志中同时显示camera_id和device_id,便于调试

正确调用链:
save() → writeDeviceAggregatedConfig(deviceId, "UPDATE") 
       → Redis Stream: device_id="edge-001" 
       → Edge监听 device_id="edge-001"  正常接收!

影响:
- 现在自动推送会正确工作,无需手动推送
- Edge端能实时接收配置更新
- 新增/修改ROI后立即生效
This commit is contained in:
2026-02-25 13:39:35 +08:00
parent 4dff9b58f5
commit 8a540d59ba

View File

@@ -84,13 +84,19 @@ public class AiRoiServiceImpl implements IAiRoiService {
}
// 推送配置到 Edge新增/更新操作)
if (cameraId != null) {
String deviceId = roi.getDeviceId();
if (deviceId != null && !deviceId.isEmpty()) {
try {
redisConfigService.writeDeviceAggregatedConfig(cameraId, "UPDATE");
log.info("[AiRoi] {}ROI后推送配置到Edgecamera_id={}", isUpdate ? "更新" : "新增", cameraId);
redisConfigService.writeDeviceAggregatedConfig(deviceId, "UPDATE");
log.info("[AiRoi] {}ROI后推送配置到Edgecamera_id={}, device_id={}",
isUpdate ? "更新" : "新增", cameraId, deviceId);
} catch (Exception e) {
log.error("[AiRoi] {}ROI后推送配置失败camera_id={}", isUpdate ? "更新" : "新增", cameraId, e);
log.error("[AiRoi] {}ROI后推送配置失败camera_id={}, device_id={}",
isUpdate ? "更新" : "新增", cameraId, deviceId, e);
}
} else {
log.warn("[AiRoi] {}ROI但device_id为空跳过推送配置camera_id={}",
isUpdate ? "更新" : "新增", cameraId);
}
}
@@ -121,17 +127,20 @@ public class AiRoiServiceImpl implements IAiRoiService {
AiRoi old = roiMapper.queryByRoiId(roiId);
if (old != null) {
String cameraId = old.getCameraId();
String deviceId = old.getDeviceId();
bindMapper.deleteByRoiId(roiId);
roiMapper.deleteByRoiId(roiId);
configLogService.addLog("ROI", roiId, toJson(old), null, null);
// 推送配置到 Edge删除操作
if (cameraId != null) {
if (deviceId != null && !deviceId.isEmpty()) {
try {
redisConfigService.writeDeviceAggregatedConfig(cameraId, "UPDATE");
log.info("[AiRoi] 删除 ROI 后推送配置到 Edgecamera_id={}", cameraId);
redisConfigService.writeDeviceAggregatedConfig(deviceId, "UPDATE");
log.info("[AiRoi] 删除ROI后推送配置到Edgecamera_id={}, device_id={}", cameraId, deviceId);
} catch (Exception e) {
log.error("[AiRoi] 删除 ROI 后推送配置失败camera_id={}", cameraId, e);
log.error("[AiRoi] 删除ROI后推送配置失败camera_id={}, device_id={}", cameraId, deviceId, e);
}
} else {
log.warn("[AiRoi] 删除ROI但device_id为空跳过推送配置camera_id={}", cameraId);
}
}
}
@@ -196,12 +205,19 @@ public class AiRoiServiceImpl implements IAiRoiService {
String roiId = bind.getRoiId();
if (roiId != null) {
AiRoi roi = roiMapper.queryByRoiId(roiId);
if (roi != null && roi.getCameraId() != null) {
try {
redisConfigService.writeDeviceAggregatedConfig(roi.getCameraId(), "UPDATE");
log.info("[AiRoi] 绑定算法后推送配置到Edgecamera_id={}, algo={}", roi.getCameraId(), bind.getAlgoCode());
} catch (Exception e) {
log.error("[AiRoi] 绑定算法后推送配置失败camera_id={}", roi.getCameraId(), e);
if (roi != null) {
String deviceId = roi.getDeviceId();
if (deviceId != null && !deviceId.isEmpty()) {
try {
redisConfigService.writeDeviceAggregatedConfig(deviceId, "UPDATE");
log.info("[AiRoi] 绑定算法后推送配置到Edgecamera_id={}, device_id={}, algo={}",
roi.getCameraId(), deviceId, bind.getAlgoCode());
} catch (Exception e) {
log.error("[AiRoi] 绑定算法后推送配置失败camera_id={}, device_id={}",
roi.getCameraId(), deviceId, e);
}
} else {
log.warn("[AiRoi] 绑定算法但device_id为空跳过推送配置camera_id={}", roi.getCameraId());
}
}
}
@@ -218,12 +234,19 @@ public class AiRoiServiceImpl implements IAiRoiService {
// 推送配置到 Edge解绑算法
if (roiId != null) {
AiRoi roi = roiMapper.queryByRoiId(roiId);
if (roi != null && roi.getCameraId() != null) {
try {
redisConfigService.writeDeviceAggregatedConfig(roi.getCameraId(), "UPDATE");
log.info("[AiRoi] 解绑算法后推送配置到 Edgecamera_id={}", roi.getCameraId());
} catch (Exception e) {
log.error("[AiRoi] 解绑算法后推送配置失败camera_id={}", roi.getCameraId(), e);
if (roi != null) {
String deviceId = roi.getDeviceId();
if (deviceId != null && !deviceId.isEmpty()) {
try {
redisConfigService.writeDeviceAggregatedConfig(deviceId, "UPDATE");
log.info("[AiRoi] 解绑算法后推送配置到Edgecamera_id={}, device_id={}",
roi.getCameraId(), deviceId);
} catch (Exception e) {
log.error("[AiRoi] 解绑算法后推送配置失败camera_id={}, device_id={}",
roi.getCameraId(), deviceId, e);
}
} else {
log.warn("[AiRoi] 解绑算法但device_id为空跳过推送配置camera_id={}", roi.getCameraId());
}
}
}
@@ -242,6 +265,28 @@ public class AiRoiServiceImpl implements IAiRoiService {
bindMapper.updateByBindId(bind);
configLogService.addLog("BIND", bind.getBindId(), toJson(old), toJson(bind), null);
// 推送配置到 Edge更新算法参数
String roiId = old.getRoiId();
if (roiId != null) {
AiRoi roi = roiMapper.queryByRoiId(roiId);
if (roi != null) {
String deviceId = roi.getDeviceId();
if (deviceId != null && !deviceId.isEmpty()) {
try {
redisConfigService.writeDeviceAggregatedConfig(deviceId, "UPDATE");
log.info("[AiRoi] 更新算法参数后推送配置到Edgecamera_id={}, device_id={}, bind_id={}",
roi.getCameraId(), deviceId, bind.getBindId());
} catch (Exception e) {
log.error("[AiRoi] 更新算法参数后推送配置失败camera_id={}, device_id={}",
roi.getCameraId(), deviceId, e);
}
} else {
log.warn("[AiRoi] 更新算法参数但device_id为空跳过推送配置camera_id={}", roi.getCameraId());
}
}
}
}
// 推送配置到 Edge更新算法参数
String roiId = old.getRoiId();
if (roiId != null) {