# 项目阶段自动回退修复 ## 🎯 问题描述 ### 历史遗留问题 之前的版本中,点击导航栏会**错误地推进项目阶段**,导致: 1. ❌ 项目在订单分配阶段还未完成(缺少必填项、待组长审批) 2. ❌ 用户点击导航栏"确认需求" 3. ❌ 项目 `currentStage` 被错误地设置为"确认需求" 4. ❌ 但订单分配阶段的 `approvalStatus` 仍然是 `'pending'` 5. ❌ 组长端看到的还是待审批状态 6. ❌ 其他端进入项目时跳转到订单分配页面,但项目实际阶段是确认需求 ### 症状表现 ``` 项目列表显示: 阶段: 确认需求 ✓ ← 错误 进入项目后: 导航栏: 订单分配 ● 红色 ← 混乱 页面: 订单分配页面 提示: 待组长审批 组长端: 状态: 待审批 ← 正确 ``` --- ## ✅ 解决方案 ### 自动回退检查机制 在 `project-detail.component.ts` 的 `loadData()` 方法中,添加**自动回退检查**: ```typescript // 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. 审批状态处理 ```typescript // 如果从确认需求回退到订单分配,检查审批状态 if (correctStage === '订单分配' && data.approvalStatus === 'approved') { // ⚠️ 这种情况理论上不应该发生 // 如果审批通过了,应该已经推进到确认需求 // 但如果真的遇到,为安全起见清除审批状态 data.approvalStatus = 'pending'; } ``` **实际情况**: - 大部分情况下,`approvalStatus` 已经是 `'pending'` - 只有极少数异常情况才需要清除 ### 3. 不影响其他端 - ✅ 组长端:继续显示待审批状态 - ✅ 客服端:看到项目回到订单分配 - ✅ 设计师端:看到项目回到订单分配 - ✅ 项目列表:自动刷新后显示正确阶段 --- ## 🔧 补充修复:批量数据修复 如果有大量历史数据需要修复,可以使用之前创建的脚本: ### 浏览器版本(推荐) ```javascript // 1. 打开项目管理页面 // 2. 打开控制台(F12) // 3. 粘贴 repair-project-stages-browser.js // 4. 执行修复 // 预览 repairProjectStages() // 执行 repairProjectStages(false) ``` ### 效果 ``` 🔧 执行模式:开始修复项目阶段数据 ================================================================================ 📊 共找到 150 个项目 ──────────────────────────────────────────────────────────── 📋 项目: 李四的办公室设计 ID: abc123 当前阶段: 确认需求 应该阶段: 订单分配 回退原因: 待组长审批 🧹 已清除错误的审批状态 ✅ 已回退到"订单分配"阶段 ================================================================================ ✅ 修复完成!共回退 15 个项目到正确阶段 ================================================================================ ``` --- ## ✅ 验证方法 ### 测试1:自动回退功能 1. **准备测试数据** ```javascript // 在控制台手动创建一个错误状态的项目 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. **准备测试数据** ```javascript // 创建一个正常的项目 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. ✅ **不影响正常流程**:只修复错误数据,不影响正常项目 ### 关键特性 - 🔒 **安全**:只回退明确错误的项目 - 🚀 **自动**:无需手动干预 - 💡 **友好**:清晰的提示信息 - 📊 **可追踪**:详细的控制台日志 现在,所有错误推进的项目都会在打开时**自动回退**到正确的阶段!🎊