Files
zhouxiaoka--autoclip/docs/PROGRESS_SYSTEM_FIXES.md
wehub-resource-sync 41b710f9c7
CI / Frontend checks (push) Failing after 0s
CI / Backend tests (push) Failing after 1s
I18n Documentation Sync / sync-docs (push) Failing after 0s
chore: import upstream snapshot with attribution
2026-07-13 12:28:40 +08:00

178 lines
4.9 KiB
Markdown

# 进度系统修复总结
## 问题描述
1. **前端进度显示问题**: 前端始终显示0%进度,然后直接变成已完成,没有中间进度
2. **WebSocket系统复杂**: 旧的WebSocket进度系统过于复杂,难以维护
3. **UI状态不统一**: 下载中、处理中的状态色块UI不统一,高度不一致
4. **下载进度不同步**: 下载进度没有正常同步显示
## 解决方案
### 1. 实现简化的后端进度系统
**文件**: `backend/services/simple_progress.py`
- 6个固定阶段,每个阶段有固定权重
- 简单的百分比计算逻辑
- Redis存储和事件发布
- 支持子进度(可选)
**文件**: `backend/api/v1/simple_progress.py`
- 进度快照查询API接口
- 批量获取多个项目进度
- 阶段配置查询
**文件**: `backend/services/simple_pipeline_adapter.py`
- 在现有流水线中集成进度上报
- 每个阶段切换时自动发送事件
- 最多只发送6次事件
### 2. 前端状态管理重构
**文件**: `frontend/src/stores/useSimpleProgressStore.ts`
- Zustand状态管理
- 轮询控制机制
- 进度数据缓存
- 支持批量轮询
### 3. 统一UI组件设计
**文件**: `frontend/src/components/UnifiedStatusBar.tsx`
- 统一的状态栏组件
- 支持下载中、处理中、完成、失败等状态
- 固定高度32px,不会超出卡片
- 渐变背景,视觉效果统一
- 自动轮询下载进度和处理进度
**文件**: `frontend/src/components/SimpleProgressDisplay.tsx`
- 详细的进度条显示
- 仅在处理中时显示
- 支持阶段信息和消息显示
### 4. 主组件集成
**文件**: `frontend/src/components/ProjectCard.tsx`
- 移除旧的复杂进度系统
- 集成新的统一状态栏
- 支持下载进度轮询
- 简化状态显示逻辑
## 核心特性
### 固定阶段定义
```python
STAGES = [
("INGEST", 10), # 下载/就绪
("SUBTITLE", 15), # 字幕/对齐
("ANALYZE", 20), # 语义分析/大纲
("HIGHLIGHT", 25), # 片段定位/打分
("EXPORT", 20), # 导出/封装
("DONE", 10), # 校验/归档
]
```
### 进度计算逻辑
```python
def compute_percent(stage: str, subpercent: Optional[float] = None) -> int:
# 累加之前阶段权重
done = 0
for s in ORDER:
if s == stage:
break
done += WEIGHTS[s]
# 当前阶段
cur = WEIGHTS.get(stage, 0)
if subpercent is None:
return min(100, done + cur) if stage == "DONE" else min(99, done)
else:
return min(99, done + int(cur * subpercent / 100))
```
### 事件格式
```json
{
"project_id": "46ab50a6-....",
"stage": "HIGHLIGHT",
"percent": 70,
"message": "已完成片段定位,共 12 段候选",
"ts": 1640995200
}
```
## UI设计改进
### 统一状态栏样式
- **高度**: 固定32px,不会超出卡片
- **背景**: 渐变背景,根据状态使用不同颜色
- **布局**: 左侧图标+文字,右侧百分比
- **颜色方案**:
- 下载中: 蓝色渐变 (#1890ff#40a9ff)
- 处理中: 根据阶段动态颜色
- 完成: 绿色渐变 (#52c41a#73d13d)
- 失败: 红色渐变 (#ff4d4f#ff7875)
- 等待: 灰色渐变 (#d9d9d9#f0f0f0)
### 响应式设计
- 支持不同屏幕尺寸
- 文字大小和间距适配
- 图标和文字对齐
## 轮询机制
### 下载进度轮询
- 每2秒轮询项目API获取下载进度
- 自动更新进度显示
- 下载完成后自动切换到处理状态
### 处理进度轮询
- 每2秒轮询简化进度API
- 获取最新阶段和进度信息
- 支持批量轮询多个项目
## 测试和验证
**文件**: `frontend/src/pages/ProgressTestPage.tsx`
- 提供完整的测试界面
- 可以模拟各种状态和进度
- 验证轮询机制和UI显示
## 迁移指南
### 后端迁移
1. 使用`SimplePipelineAdapter`替换旧的流水线适配器
2. 在流水线关键点调用`emit_progress()`
3. 移除复杂的WebSocket进度发布
### 前端迁移
1. 使用`UnifiedStatusBar`替换旧的进度组件
2. 使用`useSimpleProgressStore`管理状态
3. 配置轮询替代WebSocket订阅
## 性能优化
1. **批量轮询**: 一次请求获取多个项目进度
2. **智能缓存**: 避免重复请求相同数据
3. **条件轮询**: 只在需要时启动轮询
4. **自动清理**: 定期清理过期进度数据
## 故障处理
1. **Redis连接失败**: 记录警告日志,跳过进度发送
2. **网络中断**: 前端轮询自动重试,数据缓存在本地
3. **阶段异常**: 支持失败状态检测,提供重试机制
## 总结
通过这次修复,我们实现了:
**可靠性**: 基于HTTP轮询,不依赖WebSocket
**简单性**: 固定阶段,易于理解和维护
**统一性**: UI样式统一,高度一致
**实时性**: 下载和处理进度都能实时同步
**扩展性**: 易于添加新阶段和功能
**调试性**: 完整的日志和状态追踪
相比之前的复杂系统,这个方案更加稳定可靠,易于维护和扩展。