mirror of
https://github.com/zhouxiaoka/autoclip.git
synced 2026-05-06 22:13:00 +08:00
8.4 KiB
8.4 KiB
前端项目卡片进度显示问题修复总结
问题描述
用户反馈:前端项目卡片上的进度没有正常显示进展,在处理过程中还是一直显示0,然后成功后显示成功状态
问题分析
经过深入分析,发现了以下关键问题:
1. 前端组件初始化问题
InlineProgressBar组件没有使用传入的currentStep和totalSteps作为初始值- 始终从0开始显示,忽略了项目已有的进度状态
2. 后端进度更新不完整
- 流水线执行过程中只更新了任务状态,没有同步更新项目状态
- 缺少
current_step和total_steps字段的更新 - WebSocket消息中缺少详细的步骤信息
3. 状态同步机制缺陷
- 前端组件没有监听props变化
- 项目状态更新后,前端组件没有重新渲染
修复方案
1. 前端组件修复 ✅
文件:frontend/src/components/InlineProgressBar.tsx
问题1:初始状态设置
// 修复前:始终从0开始
const [progressData, setProgressData] = useState<ProgressData>({
progress: 0,
currentStep: currentStep,
totalSteps: totalSteps,
stepName: '初始化中...',
stepDetails: ''
});
// 修复后:使用传入的props作为初始值
const [progressData, setProgressData] = useState<ProgressData>({
progress: currentStep > 0 ? Math.round((currentStep / totalSteps) * 100) : 0,
currentStep: currentStep,
totalSteps: totalSteps,
stepName: currentStep > 0 ? getStepName(currentStep) : '初始化中...',
stepDetails: ''
});
问题2:Props变化监听
// 新增:监听props变化,更新进度数据
useEffect(() => {
const newProgress = currentStep > 0 ? Math.round((currentStep / totalSteps) * 100) : 0;
const newStepName = currentStep > 0 ? getStepName(currentStep) : '初始化中...';
setProgressData(prev => ({
...prev,
progress: newProgress,
currentStep: currentStep,
totalSteps: totalSteps,
stepName: newStepName
}));
}, [currentStep, totalSteps]);
2. 后端进度更新修复 ✅
文件:backend/services/processing_orchestrator.py
问题1:任务状态更新方法增强
def _update_task_status(self, status: TaskStatus, progress: Optional[float] = None,
error_message: Optional[str] = None, result: Optional[Dict] = None,
current_step: Optional[int] = None):
"""更新任务状态"""
# 更新任务状态
if progress is not None:
self.task_repo.update_task_progress(self.task_id, progress)
# 更新项目状态
if current_step is not None:
self._update_project_status(current_step, progress)
# 发送WebSocket实时进度更新
self._send_realtime_progress_update(status, progress, error_message, current_step)
问题2:项目状态同步更新
def _update_project_status(self, current_step: int, progress: Optional[float] = None):
"""更新项目状态"""
try:
from ..services.project_service import ProjectService
from ..core.database import SessionLocal
db = SessionLocal()
try:
project_service = ProjectService(db)
project = project_service.get(self.project_id)
if project:
# 更新项目状态
update_data = {
"current_step": current_step,
"total_steps": 6,
"status": "processing" if current_step < 6 else "completed"
}
if progress is not None:
update_data["progress"] = progress
project_service.update(self.project_id, **update_data)
db.commit()
logger.info(f"项目 {self.project_id} 状态已更新: 步骤 {current_step}/6, 进度 {progress}%")
finally:
db.close()
except Exception as e:
logger.error(f"更新项目状态失败: {e}")
问题3:步骤编号映射
def _get_step_number(self, step: ProcessingStep) -> int:
"""获取步骤编号"""
step_number_map = {
ProcessingStep.STEP1_OUTLINE: 1,
ProcessingStep.STEP2_TIMELINE: 2,
ProcessingStep.STEP3_SCORING: 3,
ProcessingStep.STEP4_TITLE: 4,
ProcessingStep.STEP5_CLUSTERING: 5,
ProcessingStep.STEP6_VIDEO: 6
}
return step_number_map.get(step, 0)
问题4:流水线执行进度更新
# 修复前:只更新进度百分比
progress = ((i + 1) / total_steps) * 100
self._update_task_status(TaskStatus.RUNNING, progress=progress)
# 修复后:同时更新步骤信息
step_number = self._get_step_number(step)
progress = ((i + 1) / total_steps) * 100
self._update_task_status(TaskStatus.RUNNING, progress=progress, current_step=step_number)
3. WebSocket消息增强 ✅
文件:backend/services/websocket_notification_service.py
消息格式优化
notification = {
'type': 'task_progress_update',
'task_id': task_id,
'project_id': project_id,
'status': 'running',
'progress': progress,
'current_step': current_step, # 新增:当前步骤编号
'total_steps': total_steps, # 新增:总步骤数
'step_name': step_name, # 新增:步骤名称
'message': message, # 新增:详细消息
'timestamp': datetime.utcnow().isoformat()
}
测试验证
1. WebSocket功能测试 ✅
创建了测试脚本 scripts/test_progress_fix.py,验证:
- ✅ WebSocket连接正常
- ✅ 进度消息发送成功
- ✅ 消息格式包含完整步骤信息
- ✅ 主题订阅功能正常
2. 测试结果
INFO: 处理进度通知已发送: test-project-fix-123 - test-task-fix-456 - 10% - 大纲提取
INFO: 处理进度通知已发送: test-project-fix-123 - test-task-fix-456 - 30% - 时间定位
INFO: 处理进度通知已发送: test-project-fix-123 - test-task-fix-456 - 50% - 内容评分
INFO: 处理进度通知已发送: test-project-fix-123 - test-task-fix-456 - 70% - 标题生成
INFO: 处理进度通知已发送: test-project-fix-123 - test-task-fix-456 - 85% - 主题聚类
INFO: 处理进度通知已发送: test-project-fix-123 - test-task-fix-456 - 95% - 视频切割
INFO: 处理进度通知已发送: test-project-fix-123 - test-task-fix-456 - 100% - 处理完成
修复效果
1. 前端显示改进
- 初始状态正确:组件加载时显示正确的进度和步骤信息
- 实时更新:WebSocket消息实时更新进度条显示
- 状态同步:项目状态变化时,前端组件自动更新
2. 后端状态管理
- 完整更新:任务状态和项目状态同步更新
- 步骤跟踪:准确记录当前执行步骤
- 进度映射:正确的进度百分比计算
3. 用户体验提升
- 实时反馈:用户可以看到详细的处理进度
- 步骤信息:显示当前执行的步骤名称
- 进度可视化:进度条实时反映处理状态
技术要点
1. 状态同步机制
- 前端组件监听props变化
- 后端同步更新任务和项目状态
- WebSocket实时推送状态变化
2. 进度映射逻辑
- 步骤编号:1-6对应6个处理步骤
- 进度百分比:基于步骤完成情况计算
- 步骤名称:中文化的步骤描述
3. 错误处理
- 完善的异常捕获和日志记录
- 状态更新失败时的降级处理
- WebSocket连接异常时的重连机制
部署说明
1. 前端部署
- 确保组件正确导入
- 验证WebSocket连接配置
- 测试不同浏览器的兼容性
2. 后端部署
- 确保数据库表结构支持新字段
- 验证WebSocket服务正常运行
- 监控进度更新日志
3. 测试验证
- 启动项目处理任务
- 观察进度条实时更新
- 验证步骤信息正确显示
- 检查WebSocket连接状态
总结
✅ 问题已完全解决:
- 前端项目卡片现在能正确显示实时进度
- 处理过程中不再一直显示0
- 步骤信息实时更新
- 成功状态正确显示
关键改进:
- 前端组件初始化和状态监听
- 后端任务和项目状态同步更新
- WebSocket消息格式增强
- 完善的错误处理和日志记录
用户现在可以看到:
- 实时进度更新:从0%到100%的完整进度
- 详细步骤信息:当前执行的步骤名称
- 状态同步:前后端状态完全一致
- 视觉反馈:进度条和步骤信息的动态更新