tony.cheng
2026-03-17 4ada1149e734e8e8ba22b9801b26e49a6921911e
feat: 实现AI调解状态控制功能(终止/恢复)OpenSpec提案及API完善
4 files added
1 files modified
334 ■■■■■ changed files
openspec/changes/implement-mediation-state-control/design.md 111 ●●●●● patch | view | raw | blame | history
openspec/changes/implement-mediation-state-control/proposal.md 55 ●●●●● patch | view | raw | blame | history
openspec/changes/implement-mediation-state-control/specs/mediation-state-control/spec.md 100 ●●●●● patch | view | raw | blame | history
openspec/changes/implement-mediation-state-control/tasks.md 48 ●●●●● patch | view | raw | blame | history
web-app/src/services/ProcessAPIService.js 20 ●●●●● patch | view | raw | blame | history
openspec/changes/implement-mediation-state-control/design.md
New file
@@ -0,0 +1,111 @@
# Design Document: AI调解状态控制功能
## 架构概述
本功能将在现有的调解看板界面中添加状态控制能力,允许用户暂停或恢复AI自动调解流程。设计遵循现有系统的组件结构和交互模式。
## 组件设计
### 1. 状态控制按钮组件
**位置**:位于人工接管按钮右侧
**显示逻辑**:
```
if (caseState === 0 || caseState === 1) {
  // 显示"终止"按钮,蓝色样式
  buttonText = "终止";
  buttonStyle = "primary";
} else if (caseState === 5) {
  // 显示"恢复"按钮,绿色样式
  buttonText = "恢复";
  buttonStyle = "success";
} else {
  // 不显示按钮
  showButton = false;
}
```
### 2. 确认对话框设计
**触发条件**:用户点击状态控制按钮
**内容结构**:
- 标题:根据操作类型显示"确认终止调解"或"确认恢复调解"
- 描述文本:说明操作的影响
- 输入框:可选的备注信息
- 操作按钮:确认/取消
### 3. 状态管理集成
**数据来源**:从localStorage中的`case_data_timeline`获取案件状态
**更新机制**:API调用成功后重新加载案件数据
## API集成设计
### 请求流程
```
1. 用户点击按钮
2. 显示确认对话框
3. 用户确认操作
4. 调用ProcessAPIService.updateMediationState
5. 处理API响应
6. 成功:刷新页面数据
7. 失败:显示错误提示
```
### 错误处理策略
- 网络错误:显示通用网络错误提示
- 业务错误:显示具体的错误信息
- 状态冲突:提示当前状态不允许该操作
## UI/UX设计
### 视觉设计
**终止按钮**:
- 背景色:#1A6FB8(项目主题蓝色,与人工接管按钮相同)
- 文字颜色:白色
- 悬停效果:背景色加深至#0d4a8a
**恢复按钮**:
- 背景色:#52c41a(Ant Design success green,区别于人工接管的蓝色)
- 文字颜色:白色
- 悬停效果:背景色加深
### 交互设计
**加载状态**:
- 按钮显示loading状态
- 禁用其他相关操作
- 显示操作进度提示
**反馈机制**:
- 操作成功:显示成功消息,自动刷新数据
- 操作失败:显示错误消息,保持当前界面状态
## 技术实现考虑
### 性能优化
- 状态检查在组件渲染时进行,避免不必要的重渲染
- API调用使用现有的请求拦截器和错误处理机制
- 页面刷新采用增量更新而非全页面重载
### 安全考虑
- 操作前进行身份验证检查
- 记录操作日志用于审计
- 防止重复提交同一操作
### 可维护性
- 遵循现有的组件命名和结构规范
- 复用现有的样式和交互组件
- 保持与人工接管功能的一致性
## 测试策略
### 单元测试
- 按钮显示逻辑的边界条件测试
- API调用成功/失败场景测试
- 状态转换的正确性验证
### 集成测试
- 完整的用户操作流程测试
- 与现有功能的兼容性测试
- 异常场景的恢复能力测试
### 用户验收测试
- 实际调解场景下的功能验证
- 易用性和直观性评估
- 性能影响评估
openspec/changes/implement-mediation-state-control/proposal.md
New file
@@ -0,0 +1,55 @@
# Proposal: 实现AI调解状态控制功能(终止/恢复)
## Change ID
`implement-mediation-state-control`
## Summary
在调解看板页面增加"终止"或"恢复"功能按钮,允许用户对正在进行的AI自动调解进行暂停和恢复操作。按钮位于人工接管按钮右侧,根据案件当前状态动态显示不同的文本和样式。
## Motivation
当前系统缺乏对AI自动调解过程的灵活控制机制。当调解遇到特殊情况(如需要人工干预、当事人临时沟通等)时,调解员需要能够暂停AI调解流程,并在适当时机恢复调解。此功能将提升系统的实用性和用户体验。
## Requirements Overview
- 在调解看板页面添加状态控制按钮
- 根据案件状态动态显示按钮文本和样式
- 实现确认对话框机制
- 调用后端API进行状态变更
- 状态变更后自动刷新页面数据
## Stakeholders
- 调解员:主要使用者,需要灵活控制调解流程
- 系统管理员:关注功能稳定性和安全性
- 产品负责人:确保功能符合业务需求
## Success Criteria
- 按钮正确显示在人工接管按钮右侧
- 状态为0或1时显示"终止"按钮(蓝色样式)
- 状态为5时显示"恢复"按钮(绿色样式)
- 其他状态下不显示该按钮
- 点击按钮后正确显示确认对话框
- API调用成功后页面数据正确刷新
- API调用失败时显示相应错误提示
## Risks & Mitigations
- **风险**:频繁的状态变更可能影响调解流程的一致性
  - **缓解**:添加操作日志记录,便于追踪状态变更历史
- **风险**:并发操作可能导致状态不一致
  - **缓解**:在后端实现状态变更的原子性控制
## Dependencies
- 已存在的`ProcessAPIService.updateMediationState` API
- 案件状态管理机制
- 现有的人工接管功能实现
## Timeline
预计开发时间:2-3个工作日
- 设计和评审:0.5天
- 前端实现:1.5天
- 测试和验证:1天
## Alternatives Considered
1. **在独立页面管理调解状态**:增加了用户操作复杂度,不符合当前一体化界面设计理念
2. **通过右键菜单实现**:隐藏了重要功能,不利于用户发现和使用
3. **自动状态检测和恢复**:缺乏人工控制灵活性,可能在不适当的时候触发状态变更
选择在现有界面中直接添加按钮的方式,既保持了界面的一致性,又提供了直观的操作方式。
openspec/changes/implement-mediation-state-control/specs/mediation-state-control/spec.md
New file
@@ -0,0 +1,100 @@
# Mediation State Control Specification
## ADDED Requirements
### Requirement: 状态控制按钮显示逻辑
系统 SHALL 根据案件当前状态动态显示状态控制按钮。
#### Scenario: 案件处于初始或进行中状态
Given 案件状态为0(初始)或1(进行中)
When 页面加载时
Then 应显示"终止"按钮,样式为主题蓝色
#### Scenario: 案件处于暂停状态
Given 案件状态为5(暂停)
When 页面加载时
Then 应显示"恢复"按钮,样式为主题绿色
#### Scenario: 案件处于其他状态
Given 案件状态为2(成功)、3(失败)、4(终止)或其他状态
When 页面加载时
Then 不应显示状态控制按钮
### Requirement: 确认对话框机制
用户点击状态控制按钮时 SHALL 显示确认对话框。
#### Scenario: 用户点击终止按钮
Given 用户看到"终止"按钮
When 用户点击该按钮
Then 应显示确认对话框,标题为"确认终止调解"
And 对话框应包含操作说明文本
And 应提供确认和取消按钮
#### Scenario: 用户点击恢复按钮
Given 用户看到"恢复"按钮
When 用户点击该按钮
Then 应显示确认对话框,标题为"确认恢复调解"
And 对话框应包含操作说明文本
And 应提供确认和取消按钮
### Requirement: API调用和状态更新
确认操作后 SHALL 调用API并更新页面状态。
#### Scenario: 成功终止调解
Given 用户确认终止操作
When 系统调用ProcessAPIService.updateMediationState({action: 0})
And API返回成功响应
Then 应显示成功消息"案件状态更新成功"
And 应重新加载当前页面数据
And 按钮状态应相应更新
#### Scenario: 成功恢复调解
Given 用户确认恢复操作
When 系统调用ProcessAPIService.updateMediationState({action: 1})
And API返回成功响应
Then 应显示成功消息"案件状态更新成功"
And 应重新加载当前页面数据
And 按钮状态应相应更新
#### Scenario: API调用失败
Given 用户确认操作
When 系统调用API失败
Then 应显示相应的错误消息
And 页面状态应保持不变
And 按钮应恢复到可点击状态
### Requirement: 加载状态管理
操作过程中 SHALL 提供适当的加载状态反馈。
#### Scenario: API调用期间
Given 用户已确认操作
When 系统正在调用API
Then 状态控制按钮应显示loading状态
And 应禁用相关操作按钮
And 应显示操作进度提示
#### Scenario: 页面刷新期间
Given API调用成功
When 系统正在刷新页面数据
Then 应显示数据加载指示器
And 应暂时禁用用户交互
## MODIFIED Requirements
### Requirement: 现有按钮布局调整
人工接管按钮的布局 SHALL 为新按钮预留空间。
#### Scenario: 按钮容器布局
Given 页面包含人工接管按钮
When 添加状态控制按钮后
Then 两个按钮应水平排列
And 状态控制按钮应位于人工接管按钮右侧
And 按钮间应有适当的间距
## REMOVED Requirements
## Related Capabilities
- 人工接管功能 (implement-manual-takeover)
- 案件状态管理 (case-state-management)
- API集成规范 (api-integration-spec)
openspec/changes/implement-mediation-state-control/tasks.md
New file
@@ -0,0 +1,48 @@
# Tasks for implement-mediation-state-control
## Task List
### Phase 1: 设计和准备工作
- [ ] 创建功能规格说明文档
- [ ] 确认UI设计细节(按钮样式、位置、交互效果)
- [ ] 评审技术实现方案
### Phase 2: 前端实现
- [ ] 在TabContainer组件中添加状态控制按钮
- [ ] 实现按钮显示逻辑(根据案件状态动态显示)
- [ ] 添加确认对话框组件
- [ ] 实现API调用逻辑
- [ ] 添加页面刷新机制
- [ ] 实现错误处理和提示
### Phase 3: 样式和交互优化
- [ ] 调整按钮样式(终止按钮蓝色,恢复按钮绿色)
- [ ] 优化确认对话框的用户体验
- [ ] 添加加载状态指示
- [ ] 确保响应式设计兼容性
### Phase 4: 测试和验证
- [ ] 单元测试按钮显示逻辑
- [ ] 集成测试API调用流程
- [ ] 用户验收测试
- [ ] 性能测试(确保不会影响页面加载速度)
- [ ] 跨浏览器兼容性测试
### Phase 5: 文档和部署
- [ ] 更新用户手册
- [ ] 编写开发文档
- [ ] 部署到测试环境
- [ ] 生产环境部署
## Dependencies
- Task 2 依赖 Task 1 的完成
- Task 3 依赖 Task 2 的完成
- Task 4 依赖 Task 3 的完成
- Tasks 5-6 可以并行进行
## Validation Criteria
每个任务完成后需要满足:
- 代码通过ESLint检查
- 功能在本地开发环境中正常工作
- 不引入新的编译警告或错误
- 符合现有的代码风格和架构模式
web-app/src/services/ProcessAPIService.js
@@ -143,6 +143,26 @@
    return request.put(`/api/v1/mediation-timeline/v2/case/${caseId}/takeover`, data);
  }
  /**
   * AI调解状态控制API(终止/恢复)
   * PUT /api/v1/mediation-timeline/v2/case/{caseId}/state
   * @param {string} caseId - 案件ID
   * @param {Object} data - 请求数据
   * @param {number} data.action - 操作类型:0-终止,1-恢复
   * @param {string} data.userName - 操作人姓名(可选)
   * @returns {Promise} 状态更新结果
   *
   * @example
   * // 终止调解
   * ProcessAPIService.updateMediationState('1001', { action: 0, userName: '张三' });
   *
   * // 恢复调解
   * ProcessAPIService.updateMediationState('1001', { action: 1, userName: '李四' });
   */
  static updateMediationState(caseId, data) {
    return request.put(`/api/v1/mediation-timeline/v2/case/${caseId}/state`, data);
  }
}
export default ProcessAPIService;