之前的版本中,点击导航栏会错误地推进项目阶段,导致:
currentStage 被错误地设置为"确认需求"approvalStatus 仍然是 'pending'项目列表显示:
阶段: 确认需求 ✓ ← 错误
进入项目后:
导航栏: 订单分配 ● 红色 ← 混乱
页面: 订单分配页面
提示: 待组长审批
组长端:
状态: 待审批 ← 正确
在 project-detail.component.ts 的 loadData() 方法中,添加自动回退检查:
// 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 |
空间需求数据 |
如果两个条件都不满足:
用户打开项目
↓
loadData() 加载项目数据
↓
检查项目阶段:currentStage = '确认需求'
↓
检查订单分配完成条件:
├─ title: ✓ 有
├─ projectType: ✓ 有
├─ demoday: ✓ 有
├─ quotation.total: ✓ > 0
└─ approvalStatus: ❌ 'pending' ← 未通过
↓
⚠️ 检测到阶段错误!
↓
自动回退:
├─ currentStage: '确认需求' → '订单分配'
├─ approvalStatus: 保持 'pending'
└─ 保存到数据库
↓
显示提示:
"检测到项目阶段错误,已自动回退到订单分配阶段
原因:订单分配阶段未完成: 待组长审批
请完成该阶段的必填项后再推进到下一阶段。"
↓
导航到订单分配页面
↓
✅ 项目现在处于正确的阶段
用户打开项目
↓
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
// 如果从确认需求回退到订单分配,检查审批状态
if (correctStage === '订单分配' && data.approvalStatus === 'approved') {
// ⚠️ 这种情况理论上不应该发生
// 如果审批通过了,应该已经推进到确认需求
// 但如果真的遇到,为安全起见清除审批状态
data.approvalStatus = 'pending';
}
实际情况:
approvalStatus 已经是 'pending'如果有大量历史数据需要修复,可以使用之前创建的脚本:
// 1. 打开项目管理页面
// 2. 打开控制台(F12)
// 3. 粘贴 repair-project-stages-browser.js
// 4. 执行修复
// 预览
repairProjectStages()
// 执行
repairProjectStages(false)
🔧 执行模式:开始修复项目阶段数据
================================================================================
📊 共找到 150 个项目
────────────────────────────────────────────────────────────
📋 项目: 李四的办公室设计
ID: abc123
当前阶段: 确认需求
应该阶段: 订单分配
回退原因: 待组长审批
🧹 已清除错误的审批状态
✅ 已回退到"订单分配"阶段
================================================================================
✅ 修复完成!共回退 15 个项目到正确阶段
================================================================================
准备测试数据
// 在控制台手动创建一个错误状态的项目
const project = await new Parse.Query('Project').get('项目ID');
project.set('currentStage', '确认需求');
project.set('data', {
...project.get('data'),
approvalStatus: 'pending' // 待审批
});
await project.save();
打开项目
预期结果
currentStage = '订单分配'准备测试数据
// 创建一个正常的项目
const project = await new Parse.Query('Project').get('项目ID');
project.set('currentStage', '确认需求');
project.set('data', {
...project.get('data'),
approvalStatus: 'approved' // 已审批
});
await project.save();
打开项目
预期结果
currentStage 保持为 '确认需求'现在,所有错误推进的项目都会在打开时自动回退到正确的阶段!🎊