Преглед на файлове

修复隐患识别返回多个检测到的场景的问题

KCY преди 3 седмици
родител
ревизия
5eb88098d9
променени са 2 файла, в които са добавени 45 реда и са изтрити 20 реда
  1. 23 15
      shudao-chat-py/routers/hazard.py
  2. 22 5
      shudao-vue-frontend/src/views/HazardDetection.vue

+ 23 - 15
shudao-chat-py/routers/hazard.py

@@ -638,20 +638,28 @@ async def hazard(
                 json.dumps(record_payload, ensure_ascii=False, default=str),
             )
 
-            record = RecognitionRecord(**record_payload)
-            db.add(record)
-            logger.info("[hazard][%s] record added to session, committing db transaction", request_id)
-            db.commit()
-            logger.info("[hazard][%s] db commit success, refreshing record", request_id)
-            db.refresh(record)
-            logger.info(
-                "[hazard][%s] record saved successfully: id=%r, current_step=%r, created_at=%r, updated_at=%r",
-                request_id,
-                getattr(record, "id", None),
-                getattr(record, "current_step", None),
-                getattr(record, "created_at", None),
-                getattr(record, "updated_at", None),
-            )
+            record_id_value = None
+            if data.save_history:
+                record = RecognitionRecord(**record_payload)
+                db.add(record)
+                logger.info("[hazard][%s] record added to session, committing db transaction", request_id)
+                db.commit()
+                logger.info("[hazard][%s] db commit success, refreshing record", request_id)
+                db.refresh(record)
+                record_id_value = getattr(record, "id", None)
+                logger.info(
+                    "[hazard][%s] record saved successfully: id=%r, current_step=%r, created_at=%r, updated_at=%r",
+                    request_id,
+                    record_id_value,
+                    getattr(record, "current_step", None),
+                    getattr(record, "created_at", None),
+                    getattr(record, "updated_at", None),
+                )
+            else:
+                logger.info(
+                    "[hazard][%s] save_history=False, skipping record save",
+                    request_id,
+                )
         except Exception as e:
             logger.error(
                 "[hazard][%s] 识别失败(保存记录阶段): error=%s, traceback=%s",
@@ -694,7 +702,7 @@ async def hazard(
             "display_labels": display_labels,
             "third_scenes": third_scene_names,
             "element_hazards": element_hazards,
-            "record_id": getattr(record, "id", None),
+            "record_id": record_id_value,
         }
         logger.info(
             "[hazard][%s] response prepared successfully: %s",

+ 22 - 5
shudao-vue-frontend/src/views/HazardDetection.vue

@@ -1338,11 +1338,12 @@ const getAutoSceneCandidates = (preferredScene = "") =>
 const detectSceneAutomatically = async (baseRequestData) => {
     const sceneCandidates = getAutoSceneCandidates(baseRequestData.scene_name);
     
-    // 并行发送所有场景请求
+    // 并行发送所有场景请求(探测阶段不保存历史记录)
     const requests = sceneCandidates.map(sceneKey => 
         apis.hazardDetection({
             ...baseRequestData,
             scene_name: sceneKey,
+            save_history: false,
         })
         .then(response => ({
             sceneKey,
@@ -1395,10 +1396,26 @@ const detectSceneAutomatically = async (baseRequestData) => {
         })));
         console.log('[并行检测] 选择场景:', bestResult.sceneKey, '检测数量:', bestResult.totalCount);
         
-        return {
-            response: bestResult.response,
-            sceneKey: bestResult.sceneKey,
-        };
+        // 仅对最优场景发送一次带 save_history=true 的请求以保存记录
+        try {
+            const saveResponse = await apis.hazardDetection({
+                ...baseRequestData,
+                scene_name: bestResult.sceneKey,
+                save_history: true,
+            });
+            const saveSuccess = saveResponse.code === 200 || saveResponse.statusCode === 200;
+            console.log('[并行检测] 保存最优场景结果:', saveSuccess);
+            return {
+                response: saveSuccess ? saveResponse : bestResult.response,
+                sceneKey: bestResult.sceneKey,
+            };
+        } catch (saveError) {
+            console.warn('[并行检测] 保存最优场景失败,使用探测结果:', saveError);
+            return {
+                response: bestResult.response,
+                sceneKey: bestResult.sceneKey,
+            };
+        }
     }
 
     // 如果没有有效结果,收集错误信息