diff --git a/src/main/java/com/genersoft/iot/vmp/aiot/service/impl/AiScreenshotServiceImpl.java b/src/main/java/com/genersoft/iot/vmp/aiot/service/impl/AiScreenshotServiceImpl.java index 42e2cd489..8de97a5a7 100644 --- a/src/main/java/com/genersoft/iot/vmp/aiot/service/impl/AiScreenshotServiceImpl.java +++ b/src/main/java/com/genersoft/iot/vmp/aiot/service/impl/AiScreenshotServiceImpl.java @@ -156,9 +156,12 @@ public class AiScreenshotServiceImpl implements IAiScreenshotService { JSONObject res = JSON.parseObject(resultJson); result.put("status", res.getString("status")); if ("ok".equals(res.getString("status"))) { - result.put("url", res.getString("url")); + String url = res.getString("url"); + result.put("url", url); // 降级成功,写入缓存 - writeCache(cameraCode, res.getString("url")); + writeCache(cameraCode, url); + // 降级路径也要持久化 cos_key 到 DB,否则后续 proxyImage 会找不到记录 + persistCosKey(cameraCode, url, requestId); } else { result.put("message", res.getString("message")); } @@ -209,26 +212,7 @@ public class AiScreenshotServiceImpl implements IAiScreenshotService { if ("ok".equals(status) && cameraCode != null) { String url = (String) data.get("url"); writeCache(cameraCode, url); - - // 从URL解析cos_key(优先),失败时降级使用pendingCosKeys - String cosKey = extractCosKeyFromUrl(url); - if (cosKey == null) { - cosKey = pendingCosKeys.remove(requestId); - } else { - // 解析成功,也要清理pendingCosKeys避免内存泄漏 - pendingCosKeys.remove(requestId); - } - - if (cosKey != null) { - try { - snapshotMapper.upsert(cameraCode, cosKey); - log.info("[AI截图] cos_key 已持久化: cameraCode={}, cosKey={}", cameraCode, cosKey); - } catch (Exception e) { - log.error("[AI截图] 持久化 cos_key 失败: cameraCode={}, error={}", cameraCode, e.getMessage()); - } - } else { - log.warn("[AI截图] 无法获取cos_key: cameraCode={}, url={}", cameraCode, url); - } + persistCosKey(cameraCode, url, requestId); } else { pendingCosKeys.remove(requestId); } @@ -284,6 +268,30 @@ public class AiScreenshotServiceImpl implements IAiScreenshotService { return null; } + /** + * 持久化 cos_key 到 DB(从 URL 解析或从 pendingCosKeys 获取) + * 供降级路径和回调路径共用 + */ + private void persistCosKey(String cameraCode, String url, String requestId) { + String cosKey = extractCosKeyFromUrl(url); + if (cosKey == null) { + cosKey = pendingCosKeys.remove(requestId); + } else { + pendingCosKeys.remove(requestId); + } + + if (cosKey != null) { + try { + snapshotMapper.upsert(cameraCode, cosKey); + log.info("[AI截图] cos_key 已持久化(降级路径): cameraCode={}, cosKey={}", cameraCode, cosKey); + } catch (Exception e) { + log.error("[AI截图] 持久化 cos_key 失败(降级路径): cameraCode={}, error={}", cameraCode, e.getMessage()); + } + } else { + log.warn("[AI截图] 降级路径无法获取cos_key: cameraCode={}, url={}", cameraCode, url); + } + } + /** * 写入截图缓存 */