From 2cfe2f7e5c51dc4cb2c312bb8acc4d664779005d Mon Sep 17 00:00:00 2001
From: shimai <shimai@example.com>
Date: Mon, 09 Mar 2026 14:58:05 +0800
Subject: [PATCH] refactor:重构状态等逻辑
---
web-app/src/contexts/CaseDataContext.jsx | 62 +++++++++++++++++++++++++++++-
1 files changed, 59 insertions(+), 3 deletions(-)
diff --git a/web-app/src/contexts/CaseDataContext.jsx b/web-app/src/contexts/CaseDataContext.jsx
index 6c21aab..723ed7b 100644
--- a/web-app/src/contexts/CaseDataContext.jsx
+++ b/web-app/src/contexts/CaseDataContext.jsx
@@ -52,7 +52,16 @@
if (!stored) return false;
const jobs = JSON.parse(stored);
- const activeStatuses = ['Scheduling', 'Executing', 'Paused', 'Drafted'];
+ const activeStatuses = [
+ 'Scheduling',
+ 'Executing',
+ 'Paused',
+ 'Drafted',
+ 'InProgress',
+ 'Calling',
+ 'Ringing',
+ 'Answered'
+ ];
// 过滤出活跃状态的任务
const activeJobs = jobs.filter(job => activeStatuses.includes(job.callStatus));
@@ -69,6 +78,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 +148,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(用于气泡显示)
@@ -234,6 +264,23 @@
console.log('Loading case data with params:', params);
+ if (!params.caseId) {
+ setError('caseId缺失');
+ setLoading(false);
+ return;
+ }
+
+ try {
+ await OutboundBotAPIService.syncStatusByCase({ caseId: params.caseId });
+ } catch (syncError) {
+ console.error('同步外呼状态失败:', syncError);
+ }
+ try {
+ await OutboundBotAPIService.backfillConversationByCase({ caseId: params.caseId });
+ } catch (backfillError) {
+ console.error('回补通话记录失败:', backfillError);
+ }
+
// 调用API获取数据
const response = await ProcessAPIService.getCaseProcessInfo(
params.caseId,
@@ -246,8 +293,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 +304,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