tony.cheng
2026-02-04 ce77556eebb6896903be1dc8ac3202b42b96649d
web-app/src/contexts/CaseDataContext.jsx
@@ -7,6 +7,8 @@
import { message } from 'antd';
import ProcessAPIService from '../services/ProcessAPIService';
import { getMergedParams } from '../utils/urlParams';
import { mockTimelineData } from '../mocks/timeline';
import { getFallbackStartTime, parseTimeString } from '../utils/timeFormatter';
// 创建Context
const CaseDataContext = createContext(null);
@@ -22,6 +24,8 @@
  const [caseData, setCaseData] = useState(null);
  const [loading, setLoading] = useState(false);
  const [error, setError] = useState(null);
  const [taskStartTime, setTaskStartTime] = useState(null);  // 任务开始时间
  const [isTaskTimeFallback, setIsTaskTimeFallback] = useState(false);  // 是否降级模式
  /**
   * 从localStorage读取数据
@@ -49,6 +53,46 @@
    }
  };
  /**
   * 加载任务时间数据
   */
  const loadTaskTime = async (timeline) => {
    try {
      const mediationId = timeline.id;
      const nodeId = timeline.current_node?.id;
      if (!mediationId || !nodeId) {
        throw new Error('缺少必要的参数: mediation_id 或 node_id');
      }
      console.log('Loading task time with:', { mediationId, nodeId });
      const response = await ProcessAPIService.getTaskTime(mediationId, nodeId);
      // 解析API返回的开始时间
      const startTimeStr = response.data?.startTime;
      if (startTimeStr) {
        const startTime = parseTimeString(startTimeStr);
        if (startTime) {
          setTaskStartTime(startTime);
          setIsTaskTimeFallback(false);
          console.log('Task start time loaded:', new Date(startTime).toLocaleString());
          return;
        }
      }
      throw new Error('无法解析开始时间');
    } catch (err) {
      console.error('Failed to load task time:', err);
      // 降级到本地计时
      const fallbackTime = getFallbackStartTime();
      setTaskStartTime(fallbackTime);
      setIsTaskTimeFallback(true);
      message.warning('任务时间API不可用,使用本地计时');
      console.log('Using fallback start time:', new Date(fallbackTime).toLocaleString());
    }
  };
  /**
   * 加载案件数据
   */
@@ -89,6 +133,9 @@
      // 保存到localStorage
      saveToStorage(timelineData);
      // 加载任务时间数据
      await loadTaskTime(timelineData);
      console.log('Case data loaded successfully:', timelineData);
    } catch (err) {
      console.error('Failed to load case data:', err);
@@ -102,6 +149,17 @@
      if (cachedData && !forceRefresh) {
        message.warning('已加载历史数据');
        setCaseData(cachedData);
        // 缓存数据也加载任务时间
        await loadTaskTime(cachedData);
      } else {
        // 使用Mock数据
        console.log('使用Mock数据');
        const mockData = mockTimelineData.data.timeline;
        setCaseData(mockData);
        saveToStorage(mockData);
        // Mock数据也加载任务时间
        await loadTaskTime(mockData);
      }
    } finally {
      setLoading(false);
@@ -129,7 +187,9 @@
    loading,
    error,
    refreshData,
    loadCaseData
    loadCaseData,
    taskStartTime,      // 任务开始时间
    isTaskTimeFallback  // 是否降级模式
  };
  return (