From 9161ffccb37c3e707f746674b2bace107bb1014f Mon Sep 17 00:00:00 2001
From: tony.cheng <chengmingwei_1984122@126.com>
Date: Thu, 12 Feb 2026 18:06:49 +0800
Subject: [PATCH] feat: 实现通话状态变化时更新API并刷新页面

---
 web-app/src/components/common/OutboundCallWidget.jsx |   80 +++++++++++++++++++++++++++++++++++++++-
 1 files changed, 78 insertions(+), 2 deletions(-)

diff --git a/web-app/src/components/common/OutboundCallWidget.jsx b/web-app/src/components/common/OutboundCallWidget.jsx
index f5bdce5..33ed299 100644
--- a/web-app/src/components/common/OutboundCallWidget.jsx
+++ b/web-app/src/components/common/OutboundCallWidget.jsx
@@ -8,11 +8,17 @@
 // 活跃状态列表
 const ACTIVE_STATUSES = ['Scheduling', 'InProgress', 'Calling', 'Ringing', 'Answered'];
 
+// Scheduling 状态 - 此状态变化不需要调用更新API
+const SCHEDULING_STATUS = 'Scheduling';
+
 /**
  * 智能外呼通话显示组件
  * 显示在页面右下角的气泡组件,支持多人通话
+ * @param {Object} props
+ * @param {Function} props.onSwitchTab - Tab切换回调
+ * @param {Function} props.onRefreshData - 数据刷新回调
  */
-const OutboundCallWidget = () => {
+const OutboundCallWidget = ({ onSwitchTab, onRefreshData }) => {
   const { caseData } = useCaseData();
   const [isVisible, setIsVisible] = useState(false); // 默认隐藏
   const [isMinimized, setIsMinimized] = useState(true);
@@ -121,6 +127,55 @@
   };
 
   /**
+   * 批量更新通话状态到后端
+   * @param {Array} jobsToUpdate - 需要更新的任务列表
+   * @returns {Promise<boolean>} 是否有成功的更新
+   */
+  const updateCallStatusToBackend = async (jobsToUpdate) => {
+    if (!jobsToUpdate || jobsToUpdate.length === 0) return false;
+
+    try {
+      // 并行调用所有任务的更新API
+      const results = await Promise.all(
+        jobsToUpdate.map(async (job) => {
+          try {
+            await OutboundBotAPIService.updateCallStatus({
+              jobId: job.jobId,
+              callStatus: job.newStatus
+            });
+            console.log(`状态更新成功: ${job.jobId} -> ${job.newStatus}`);
+            return { success: true, job };
+          } catch (err) {
+            console.error(`状态更新失败: ${job.jobId}`, err);
+            return { success: false, job };
+          }
+        })
+      );
+
+      // 检查是否有成功的更新
+      const hasSuccess = results.some(r => r.success);
+      return hasSuccess;
+    } catch (err) {
+      console.error('批量更新状态失败:', err);
+      return false;
+    }
+  };
+
+  /**
+   * 触发页面更新(刷新数据 + 切换Tab)
+   */
+  const triggerPageUpdate = useCallback(() => {
+    // 刷新案件数据
+    if (onRefreshData) {
+      onRefreshData();
+    }
+    // 切换到AI调解实时看板
+    if (onSwitchTab) {
+      onSwitchTab('mediation-board');
+    }
+  }, [onRefreshData, onSwitchTab]);
+
+  /**
    * 移除终态或超时的任务
    * @param {Array} jobs - 当前任务数组
    * @returns {Array} 清理后的任务数组
@@ -164,6 +219,9 @@
       return;
     }
 
+    // 收集需要更新到后端的任务(状态变化且原状态不是Scheduling)
+    const jobsNeedBackendUpdate = [];
+
     // 并行查询所有任务的状态
     const updatedJobs = await Promise.all(
       successJobs.map(async (job) => {
@@ -180,6 +238,14 @@
             // 如果状态发生变化,更新任务
             if (newStatus !== job.callStatus) {
               console.log(`任务 ${job.jobId} 状态更新: ${job.callStatus} -> ${newStatus}`);
+              
+              // 检查是否需要调用后端更新API(排除Scheduling状态)
+              if (job.callStatus !== SCHEDULING_STATUS) {
+                jobsNeedBackendUpdate.push({
+                  ...job,
+                  newStatus
+                });
+              }
               
               // 如果是终态,可以从轮询中移除
               if (!ACTIVE_STATUSES.includes(newStatus)) {
@@ -224,6 +290,16 @@
     // 清理超时任务
     const cleanedJobs = cleanupJobs(filteredJobs);
 
+    // 如果有需要更新到后端的任务,批量调用更新API
+    if (jobsNeedBackendUpdate.length > 0) {
+      const hasUpdateSuccess = await updateCallStatusToBackend(jobsNeedBackendUpdate);
+      
+      // 如果有成功的更新,触发页面更新
+      if (hasUpdateSuccess) {
+        triggerPageUpdate();
+      }
+    }
+
     // 保存到 localStorage
     saveJobsToStorage(cleanedJobs);
 
@@ -238,7 +314,7 @@
         setIsVisible(true);
       }
     }
-  }, [isVisible]);
+  }, [isVisible, triggerPageUpdate]);
 
   // 定时轮询通话状态
   useEffect(() => {

--
Gitblit v1.8.0