AUTO_ROLLBACK_STAGE_FIX.md 11 KB

项目阶段自动回退修复

🎯 问题描述

历史遗留问题

之前的版本中,点击导航栏会错误地推进项目阶段,导致:

  1. ❌ 项目在订单分配阶段还未完成(缺少必填项、待组长审批)
  2. ❌ 用户点击导航栏"确认需求"
  3. ❌ 项目 currentStage 被错误地设置为"确认需求"
  4. ❌ 但订单分配阶段的 approvalStatus 仍然是 'pending'
  5. ❌ 组长端看到的还是待审批状态
  6. ❌ 其他端进入项目时跳转到订单分配页面,但项目实际阶段是确认需求

症状表现

项目列表显示:
  阶段: 确认需求 ✓  ← 错误

进入项目后:
  导航栏: 订单分配 ● 红色  ← 混乱
  页面: 订单分配页面
  提示: 待组长审批

组长端:
  状态: 待审批  ← 正确

✅ 解决方案

自动回退检查机制

project-detail.component.tsloadData() 方法中,添加自动回退检查

// 5. 验证项目阶段是否正确,自动回退错误推进的项目
let projectStage = this.project.get('currentStage');
const data = this.project.get('data') || {};

// ⚠️ 自动回退检查:如果项目阶段与实际完成情况不符
let needRollback = false;
let correctStage = projectStage;
let rollbackReason = '';

// 检查1:如果在"确认需求"或更后面的阶段,但订单分配未完成
if (projectStage && ['确认需求', '交付执行', '售后归档', ...].includes(projectStage)) {
  const title = this.project.get('title');
  const projectType = this.project.get('projectType');
  const demoday = this.project.get('demoday');
  const quotationTotal = data.quotation?.total || 0;
  const approvalStatus = data.approvalStatus;
  
  // 检查订单分配阶段是否完成
  const orderStageIncomplete = !title || !projectType || !demoday || quotationTotal <= 0;
  const notApproved = approvalStatus !== 'approved';
  
  if (orderStageIncomplete || notApproved) {
    needRollback = true;
    correctStage = '订单分配';
    rollbackReason = `订单分配阶段未完成: ${缺失项}`;
  }
}

// 如果需要回退,自动修正项目阶段
if (needRollback && correctStage !== projectStage) {
  this.project.set('currentStage', correctStage);
  
  // 清除错误的审批状态
  if (correctStage === '订单分配' && data.approvalStatus === 'approved') {
    data.approvalStatus = 'pending';
    this.project.set('data', data);
  }
  
  await this.project.save();
  
  // 显示提示
  window?.fmode?.alert(
    `检测到项目阶段错误,已自动回退到"${correctStage}"阶段\n\n` +
    `原因:${rollbackReason}\n\n` +
    `请完成该阶段的必填项后再推进到下一阶段。`
  );
}

🔍 回退检查条件

订单分配阶段完成条件

项目必须满足以下所有条件才算完成订单分配:

字段 必填 说明
project.title 项目名称
project.projectType 项目类型(家装/工装)
project.demoday 小图日期
data.quotation.total 报价总额 > 0
data.approvalStatus 审批状态 = 'approved'

如果任一条件不满足

  • ✅ 自动回退到"订单分配"阶段
  • ✅ 清除错误的审批状态
  • ✅ 显示友好提示

确认需求阶段完成条件

项目必须满足以下任一条件才算完成确认需求:

字段 说明
data.requirementsAnalysis 需求分析数据
data.spaceRequirements 空间需求数据

如果两个条件都不满足

  • ✅ 自动回退到"确认需求"阶段
  • ✅ 显示友好提示

📊 回退流程图

场景1:订单分配未完成,错误推进到确认需求

用户打开项目
    ↓
loadData() 加载项目数据
    ↓
检查项目阶段:currentStage = '确认需求'
    ↓
检查订单分配完成条件:
  ├─ title: ✓ 有
  ├─ projectType: ✓ 有
  ├─ demoday: ✓ 有
  ├─ quotation.total: ✓ > 0
  └─ approvalStatus: ❌ 'pending'  ← 未通过
    ↓
⚠️ 检测到阶段错误!
    ↓
自动回退:
  ├─ currentStage: '确认需求' → '订单分配'
  ├─ approvalStatus: 保持 'pending'
  └─ 保存到数据库
    ↓
显示提示:
  "检测到项目阶段错误,已自动回退到订单分配阶段
   原因:订单分配阶段未完成: 待组长审批
   请完成该阶段的必填项后再推进到下一阶段。"
    ↓
导航到订单分配页面
    ↓
✅ 项目现在处于正确的阶段

场景2:项目已正常推进

用户打开项目
    ↓
loadData() 加载项目数据
    ↓
检查项目阶段:currentStage = '确认需求'
    ↓
检查订单分配完成条件:
  ├─ title: ✓ 有
  ├─ projectType: ✓ 有
  ├─ demoday: ✓ 有
  ├─ quotation.total: ✓ > 0
  └─ approvalStatus: ✓ 'approved'  ← 通过
    ↓
✅ 订单分配阶段已完成
    ↓
检查确认需求完成条件:(不检查,因为当前在确认需求)
    ↓
无需回退
    ↓
导航到确认需求页面
    ↓
✅ 项目处于正确的阶段

🎯 修复效果

修复前

项目A:
  currentStage: '确认需求'  ← 错误
  approvalStatus: 'pending'  ← 待审批
  
用户体验:
  ❌ 进入项目跳转到订单分配
  ❌ 显示"待组长审批"
  ❌ 无法继续推进
  ❌ 项目列表显示"确认需求"但实际在订单分配

修复后

项目A:
  currentStage: '订单分配'  ← 自动回退
  approvalStatus: 'pending'  ← 待审批
  
用户体验:
  ✅ 进入项目自动回退到订单分配
  ✅ 显示友好提示说明原因
  ✅ 可以继续填写必填项
  ✅ 组长审批后才能推进到确认需求
  ✅ 项目列表显示"订单分配"(正确)

📝 控制台日志

正常项目(无需回退)

🔍 [项目详情] 当前项目阶段: 确认需求
🔍 [项目详情] 项目数据: {
  title: "张三的家装项目",
  projectType: "家装",
  demoday: "2025-01-20",
  quotationTotal: 50000,
  approvalStatus: "approved",  ← 已审批
  requirementsAnalysis: true,
  spaceRequirements: true
}
✅ [项目详情] 已在正确阶段,无需导航

需要回退的项目

🔍 [项目详情] 当前项目阶段: 确认需求
🔍 [项目详情] 项目数据: {
  title: "李四的办公室设计",
  projectType: "工装",
  demoday: "2025-01-21",
  quotationTotal: 80000,
  approvalStatus: "pending",  ← 待审批
  requirementsAnalysis: false,
  spaceRequirements: false
}
⚠️ [自动回退] 项目阶段错误: 订单分配阶段未完成: 待组长审批
🔧 [自动回退] 检测到项目阶段错误,自动回退: {
  错误阶段: "确认需求",
  正确阶段: "订单分配",
  原因: "订单分配阶段未完成: 待组长审批"
}
✅ [自动回退] 项目阶段已回退到: 订单分配
🚀 [项目详情] 导航到正确阶段: order

⚠️ 注意事项

1. 自动回退是安全的

  • ✅ 只在打开项目时执行一次
  • ✅ 不会影响正常推进的项目
  • ✅ 只回退错误推进的项目
  • ✅ 保留所有已填写的数据

2. 审批状态处理

// 如果从确认需求回退到订单分配,检查审批状态
if (correctStage === '订单分配' && data.approvalStatus === 'approved') {
  // ⚠️ 这种情况理论上不应该发生
  // 如果审批通过了,应该已经推进到确认需求
  // 但如果真的遇到,为安全起见清除审批状态
  data.approvalStatus = 'pending';
}

实际情况

  • 大部分情况下,approvalStatus 已经是 'pending'
  • 只有极少数异常情况才需要清除

3. 不影响其他端

  • ✅ 组长端:继续显示待审批状态
  • ✅ 客服端:看到项目回到订单分配
  • ✅ 设计师端:看到项目回到订单分配
  • ✅ 项目列表:自动刷新后显示正确阶段

🔧 补充修复:批量数据修复

如果有大量历史数据需要修复,可以使用之前创建的脚本:

浏览器版本(推荐)

// 1. 打开项目管理页面
// 2. 打开控制台(F12)
// 3. 粘贴 repair-project-stages-browser.js
// 4. 执行修复

// 预览
repairProjectStages()

// 执行
repairProjectStages(false)

效果

🔧 执行模式:开始修复项目阶段数据
================================================================================

📊 共找到 150 个项目

────────────────────────────────────────────────────────────
📋 项目: 李四的办公室设计
   ID: abc123
   当前阶段: 确认需求
   应该阶段: 订单分配
   回退原因: 待组长审批
   🧹 已清除错误的审批状态
   ✅ 已回退到"订单分配"阶段

================================================================================
✅ 修复完成!共回退 15 个项目到正确阶段
================================================================================

✅ 验证方法

测试1:自动回退功能

  1. 准备测试数据

    // 在控制台手动创建一个错误状态的项目
    const project = await new Parse.Query('Project').get('项目ID');
    project.set('currentStage', '确认需求');
    project.set('data', {
     ...project.get('data'),
     approvalStatus: 'pending'  // 待审批
    });
    await project.save();
    
  2. 打开项目

    • 从项目列表点击该项目
  3. 预期结果

    • ✅ 显示提示:"检测到项目阶段错误,已自动回退到订单分配阶段"
    • ✅ 页面跳转到订单分配
    • ✅ 显示"待组长审批"
    • ✅ 数据库中 currentStage = '订单分配'

测试2:正常项目不受影响

  1. 准备测试数据

    // 创建一个正常的项目
    const project = await new Parse.Query('Project').get('项目ID');
    project.set('currentStage', '确认需求');
    project.set('data', {
     ...project.get('data'),
     approvalStatus: 'approved'  // 已审批
    });
    await project.save();
    
  2. 打开项目

    • 从项目列表点击该项目
  3. 预期结果

    • ✅ 无提示
    • ✅ 正常跳转到确认需求
    • currentStage 保持为 '确认需求'

📚 相关文档

  1. STAGE_NAVIGATION_COMPLETE.md - 阶段导航完整说明
  2. DATA_REPAIR_STAGE_ROLLBACK.md - 数据修复方案
  3. REPAIR_STAGES_QUICK_GUIDE.md - 数据修复快速指南
  4. AUTO_ROLLBACK_STAGE_FIX.md - 本文档

🎉 总结

修复内容

  1. 自动回退检查:进入项目时自动检查阶段是否正确
  2. 友好提示:告知用户回退原因和需要完成的事项
  3. 数据修复:自动修正错误的阶段和审批状态
  4. 不影响正常流程:只修复错误数据,不影响正常项目

关键特性

  • 🔒 安全:只回退明确错误的项目
  • 🚀 自动:无需手动干预
  • 💡 友好:清晰的提示信息
  • 📊 可追踪:详细的控制台日志

现在,所有错误推进的项目都会在打开时自动回退到正确的阶段!🎊