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

4.9 KiB

进度系统修复总结

问题描述

  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

  • 移除旧的复杂进度系统
  • 集成新的统一状态栏
  • 支持下载进度轮询
  • 简化状态显示逻辑

核心特性

固定阶段定义

STAGES = [
    ("INGEST", 10),        # 下载/就绪
    ("SUBTITLE", 15),      # 字幕/对齐  
    ("ANALYZE", 20),       # 语义分析/大纲
    ("HIGHLIGHT", 25),     # 片段定位/打分
    ("EXPORT", 20),        # 导出/封装
    ("DONE", 10),          # 校验/归档
]

进度计算逻辑

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))

事件格式

{
  "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样式统一,高度一致 实时性: 下载和处理进度都能实时同步 扩展性: 易于添加新阶段和功能 调试性: 完整的日志和状态追踪

相比之前的复杂系统,这个方案更加稳定可靠,易于维护和扩展。