From 527f17527ea98b8759e3c460c317e8d1f9a3b7e8 Mon Sep 17 00:00:00 2001
From: tony.cheng <chengmingwei_1984122@126.com>
Date: Tue, 03 Mar 2026 18:36:49 +0800
Subject: [PATCH] fix: 优化调解进度组件和案件数据上下文处理

---
 web-app/src/contexts/CaseDataContext.jsx |   34 ++++++++++++++++++++++++++++++++--
 1 files changed, 32 insertions(+), 2 deletions(-)

diff --git a/web-app/src/contexts/CaseDataContext.jsx b/web-app/src/contexts/CaseDataContext.jsx
index 6c21aab..e860cec 100644
--- a/web-app/src/contexts/CaseDataContext.jsx
+++ b/web-app/src/contexts/CaseDataContext.jsx
@@ -69,6 +69,16 @@
    */
   const triggerOutboundCall = async (timeline) => {
     try {
+      const { mediation } = timeline;
+      if (!mediation) {
+        console.warn('缺少必要参数:timeline.mediation,跳过外呼触发:', timeline);
+        return;
+      }
+      const { state } = mediation;
+      if (state >= 2) { // 2:调解成功,3:调解失败,4:人工接管
+        console.warn('调解状态已结束,mediation.state:', state);
+        return;
+      }
       // 检查是否已有活跃任务,如有则跳过
       if (hasActiveOutboundJobs()) {
         console.log('检测到活跃外呼任务,跳过发起新外呼');
@@ -129,6 +139,17 @@
         if (successJobs.length > 0) {
           localStorage.setItem(OUTBOUND_JOBS_KEY, JSON.stringify(successJobs));
           console.log('存储外呼任务成功,数量:', successJobs.length);
+          
+          // 外呼成功后,清除对应的失败记录
+          const storedFailedJobs = JSON.parse(localStorage.getItem(`${OUTBOUND_JOBS_KEY}_failed`) || '[]');
+          if (storedFailedJobs.length > 0) {
+            // 获取成功任务的 personId 列表
+            const successPersonIds = successJobs.map(job => job.personId);
+            // 过滤掉已成功的 personId 对应的失败记录
+            const remainingFailedJobs = storedFailedJobs.filter(job => !successPersonIds.includes(job.personId));
+            localStorage.setItem(`${OUTBOUND_JOBS_KEY}_failed`, JSON.stringify(remainingFailedJobs));
+            console.log('外呼成功后清除失败记录,清除数量:', storedFailedJobs.length - remainingFailedJobs.length);
+          }
         }
 
         // 存储失败的任务到 localStorage(用于气泡显示)
@@ -246,8 +267,8 @@
       // 提取timeline数据
       const timelineData = response.timeline || response.data?.timeline || response;
       
-      // 提取nodes数据(确保为数组)
-      const nodesData = response.nodes || response.data?.nodes || [];
+      // 提取nodes数据(确保为数组),兼容 nodeList 和 nodes 两种字段名
+      const nodesData = response.data?.nodeList || response.data?.nodes || response.nodes || [];
       
       console.log('API Response:', response);
       console.log('Extracted nodesData:', nodesData);
@@ -257,6 +278,15 @@
       setProcessNodes(Array.isArray(nodesData) ? nodesData : []);  // 确保为数组
       setHasLoaded(true);  // 标记已加载
       
+      // 检查终态状态(调解成功/失败/人工接管),终态不执行外呼和存储
+      const mediationState = timelineData.mediation?.state;
+      const isTerminalState = [2, 3, 4].includes(mediationState);
+      
+      if (isTerminalState) {
+        console.log('案件已处于终态状态:', mediationState, ',跳过外呼和存储');
+        return;
+      }
+      
       // 保存到localStorage
       saveToStorage(timelineData);
       

--
Gitblit v1.8.0