web-app/src/utils/urlParams.jsparseUrlParams()函数,解析URL查询参数getDefaultParams()函数,返回默认参数对象getMergedParams()函数,合并URL参数和默认值web-app/src/utils/stateTranslator.jstranslateMediationState(state):0→待调解, 1→调解中, 2→调解成功, 3→调解失败formatDuration(before_duration):格式化时间显示(如“3小时前更新”)formatSuccessRate(success_rate):格式化成功率显示(如“68%”)formatRoundCount(count):格式化轮次显示(如“第6轮”)web-app/src/contexts/CaseDataContext.jsxCaseDataContextCaseDataProvider组件{ caseData, loading, error, refreshData, loadCaseData }useCaseData Hook方便组件使用web-app/src/App.jsCaseDataProvider和useCaseData Hook<CaseDataProvider>包裹整个应用currentStep静态stateAppContent子组件web-app/src/App.js (AppContent组件内)修改点:
```javascript
// 原代码
function App() {
const [currentStep, setCurrentStep] = useState(1);
// ...
}
// 修改后
import { CaseDataProvider } from './contexts/CaseDataContext';
function App() {
return (
);
}
function AppContent() {
// 原有逻辑
}
```
web-app/src/App.js (AppContent组件内)useEffect中调用URL参数解析ProcessAPIService.getCaseProcessInfo伪代码:javascript useEffect(() => { const loadCaseData = async () => { setLoading(true); try { const params = getMergedParams(); const response = await ProcessAPIService.getCaseProcessInfo( params.caseId, { caseTypeFirst: params.caseTypeFirst, platform_code: params.platform_code } ); // 存储到Context和localStorage updateCaseData(response.timeline); } catch (error) { message.error('加载案件数据失败,请稍后重试'); console.error('Load case data error:', error); } finally { setLoading(false); } }; loadCaseData(); }, []);
web-app/src/components/dashboard/TopSection.jsxuseCaseData Hook和translateMediationStatecaseNumber ← timeline.case_refdisputeType ← timeline.case_type_first_namestartTime ← timeline.mediation.start_dateendTime ← timeline.mediation.end_dateaiStatus ← translateMediationState(timeline.mediation.state)web-app/src/components/dashboard/MediationProgress.jsxuseCaseData Hooktimeline.current_node.order_no动态计算currentStepweb-app/src/components/dashboard/FloatingControlPanel.jsxuseCaseData和translateMediationStatetimeline.before_duration作为已进行时间web-app/src/components/dashboard/TabContainer.jsxuseCaseData和工具函数timeline.resultformatDuration(timeline.before_duration)formatSuccessRate(timeline.mediation.success_rate)formatRoundCount(timeline.mediation.mediation_count)web-app/src/utils/urlParams.js - URL参数解析工具web-app/src/utils/stateTranslator.js - 状态翻译工具web-app/src/contexts/CaseDataContext.jsx - 案件数据Contextweb-app/src/App.js - 集成Context Provider和Loading状态web-app/src/components/dashboard/TopSection.jsx - 绑定案件信息数据web-app/src/components/dashboard/MediationProgress.jsx - 绑定进度条数据web-app/src/components/dashboard/FloatingControlPanel.jsx - 绑定控制面板状态web-app/src/components/dashboard/TabContainer.jsx - 绑定调解数据看板web-app/src/services/ProcessAPIService.js - 删除mediationId未定义变量的引用axios@1.13.4 - HTTP请求库请用户点击工具面板中的按钮打开预览浏览器,验证以下功能:
1. 页面加载时显示Loading状态
2. 顶部区域显示案件信息(事项编号、纠纷类型、调解时间、AI状态)
3. 进度条显示当前节点
4. 悬浮控制面板显示调解状态和时间
5. 调解分析Tab中显示分歧分析、成功率和轮次