# Proposal: implement-manual-takeover ## 概述 实现首页"人工接管"按钮的完整功能,包括API对接、状态更新、UI反馈和状态持久化。 ## 背景 当前首页已存在"人工接管"按钮(位于 `FloatingControlPanel` 组件),但仅有简单的确认对话框和提示,未对接真实API,也未实现状态持久化和UI状态展示。 ## 目标 - 对接 `ProcessAPIService.takeover` API 实现真实的人工接管功能 - 实现接管成功后的"印章效果"状态展示,替换原按钮 - 支持状态持久化,页面刷新后保持"已人工接管"状态显示 - 完善错误处理和用户交互体验 ## 用户价值 - **调解员**:可以通过点击按钮快速将AI调解案件转为人工处理 - **系统管理员**:能够追踪案件接管状态,避免重复接管 - **用户体验**:清晰的状态展示和友好的错误提示 ## 技术方案 ### 1. API参数获取 **caseId 获取策略(按优先级):** 1. URL 参数 `caseId` 2. localStorage `case_data_timeline.case_id` 3. Context `caseData.case_id` **userName 获取策略:** - localStorage `currentUser.user_name`,不存在时默认 `"No User"` ### 2. 状态判断逻辑 根据案件 `state` 字段判断按钮显示状态: - `state === 1`(调解中):显示"人工接管"按钮 - `state === 2`(调解成功):隐藏按钮 - `state === 3`(调解失败):隐藏按钮 - `state === 4`(人工接管):显示"已人工接管"印章 ### 3. 印章效果 UI 设计 **CSS 实现方案:** ```css .takeover-stamp { position: relative; display: inline-flex; align-items: center; justify-content: center; padding: 10px 24px; font-size: 1rem; font-weight: 600; color: #e63946; background: linear-gradient(135deg, #ffeaea 0%, #ffe0e0 100%); border: 3px solid #e63946; border-radius: 8px; box-shadow: 0 2px 8px rgba(230, 57, 70, 0.2); transform: rotate(-3deg); user-select: none; cursor: default; } .takeover-stamp::before { content: ''; position: absolute; inset: 2px; border: 1px solid rgba(230, 57, 70, 0.3); border-radius: 6px; } .takeover-stamp-text { display: flex; align-items: center; gap: 8px; letter-spacing: 2px; } ``` **HTML 结构:** ```jsx
已人工接管
``` ### 4. 交互流程 ```mermaid graph TD A[用户点击人工接管按钮] --> B{显示确认对话框} B -->|取消| Z[结束] B -->|确认| C[显示Loading状态] C --> D[调用ProcessAPIService.takeover] D --> E{API响应} E -->|成功200| F[隐藏按钮] F --> G[显示印章效果] G --> H[刷新案件数据] H --> I[显示成功提示] E -->|失败400| J{错误类型判断} J -->|已被接管| K[隐藏按钮] K --> L[重新加载页面] J -->|其他错误| M[显示错误提示] M --> N[恢复按钮状态] ``` ### 5. 错误处理策略 | 错误场景 | HTTP状态码 | 处理方式 | |---------|-----------|---------| | 案件已被接管 | 400 | 隐藏按钮 + 重新加载页面 | | 调解已成功/失败 | 400 | 隐藏按钮(不提示) | | 网络错误 | - | 显示错误提示 + 恢复按钮 | | 其他错误 | 4xx/5xx | 显示错误提示 + 恢复按钮 | ## 影响范围 ### 修改文件 - `web-app/src/components/dashboard/FloatingControlPanel.jsx` - 核心逻辑实现 - `web-app/src/App.css` - 新增印章样式 ### 依赖组件 - `web-app/src/contexts/CaseDataContext.jsx` - 案件数据Context - `web-app/src/services/ProcessAPIService.js` - API服务(已存在) - `web-app/src/utils/stateTranslator.js` - 状态翻译工具 ## 风险评估 ### 低风险 - ✅ API已经实现(`ProcessAPIService.takeover`) - ✅ 组件结构清晰,改动范围小 - ✅ 状态字段已在案件数据中存在 ### 需要注意 - ⚠️ 确保 localStorage 数据格式一致性 - ⚠️ 页面刷新时的状态同步时序 - ⚠️ 多标签页场景下的状态一致性 ## 验收标准 - [ ] 点击"人工接管"按钮显示确认对话框,文案为"确定人工接管本调解案件吗?" - [ ] 确认后显示 Loading 状态,并调用 API - [ ] API 调用成功后,按钮替换为印章效果,显示"已人工接管" - [ ] 接管成功后刷新案件数据 - [ ] 页面刷新后,state=4 的案件显示印章而非按钮 - [ ] state=2/3 的案件隐藏按钮 - [ ] 400 错误(已被接管)时隐藏按钮并重新加载页面 - [ ] 其他错误时显示友好的错误提示 - [ ] 印章效果符合设计规范,有明显的视觉区分 ## 待办任务 见 [tasks.md](./tasks.md) ## 相关文档 - API文档: `API文档.md` - `PUT /api/v1/mediation-timeline/v2/case/{caseId}/takeover` - 组件设计: `web-app/src/components/dashboard/FloatingControlPanel.jsx` - 状态管理: `web-app/src/contexts/CaseDataContext.jsx`