症状:
currentStage 字段被设置为子阶段(如"白模"、"软装"等)根本原因:
ensureDeliveryStageInitialized() 方法在初始化时会将 currentStage 设置为具体的子阶段(Line 507),这与我们统一显示"交付执行"的目标冲突。
代码位置:
src/modules/project/pages/project-detail/stages/stage-delivery.component.tsensureDeliveryStageInitialized() (Line 467-518)async ensureDeliveryStageInitialized(): Promise<void> {
if (!this.project) return;
const currentStage = this.project.get('currentStage');
const validDeliveryStages = ['白模', '软装', '渲染', '后期'];
// 如果 currentStage 是"交付执行"或其他非具体子阶段,需要初始化
if (currentStage === '交付执行' || !validDeliveryStages.includes(currentStage)) {
// ...找到第一个未完成的子阶段
let targetStage = '白模';
// ...
// ❌ 问题:将 currentStage 设置为子阶段
this.project.set('currentStage', targetStage); // targetStage = "白模"
await this.project.save();
}
}
问题:
currentStage 设置为"白模"等子阶段unifyDeliveryStageForOldData() 的统一逻辑冲突async ensureDeliveryStageInitialized(): Promise<void> {
if (!this.project) return;
const currentStage = this.project.get('currentStage');
const data = this.project.get('data') || {};
// 如果 currentStage 是"交付执行"且没有 deliverySubStage,需要初始化子阶段
if (currentStage === '交付执行' && !data.deliverySubStage) {
console.log('🔥 初始化交付执行子阶段信息...');
const deliveryStageStatus = data.deliveryStageStatus || {};
// 找到第一个未完成的子阶段
const stageOrder = ['white_model', 'soft_decor', 'rendering', 'post_process'];
const stageNameMap: Record<string, string> = {
'white_model': '白模',
'soft_decor': '软装',
'rendering': '渲染',
'post_process': '后期'
};
let targetSubStage = '白模'; // 默认从白模开始
for (const stageId of stageOrder) {
const stageKey = stageId.replace('_', '');
const status = deliveryStageStatus[stageKey]?.status;
if (status !== 'approved') {
targetSubStage = stageNameMap[stageId];
break;
}
}
// ✅ 正确:只设置 deliverySubStage,currentStage 保持为"交付执行"
console.log(`🔥 设置 deliverySubStage 为: ${targetSubStage}`);
data.deliverySubStage = targetSubStage;
this.project.set('data', data);
// currentStage 保持为"交付执行",不修改
await this.project.save();
console.log('✅ deliverySubStage 初始化成功');
}
}
改进:
currentStage 始终保持为"交付执行"data.deliverySubStage{
currentStage: "白模", // ❌ 设置为子阶段
data: {
deliveryStageStatus: {
whitemodel: { status: "pending" }
}
}
}
问题:
{
currentStage: "交付执行", // ✅ 统一为交付执行
data: {
deliverySubStage: "白模", // ✅ 子阶段信息保留
deliveryStageStatus: {
whitemodel: { status: "pending" }
}
}
}
效果:
交付执行页面 ngOnInit
↓
ensureDeliveryStageInitialized()
├─ 检测 currentStage === "交付执行"
├─ 检测 data.deliverySubStage 是否存在
└─ 如果不存在,初始化为第一个未完成的子阶段
└─ data.deliverySubStage = "白模"
└─ currentStage 保持为"交付执行" ✅
↓
unifyDeliveryStageForOldData()
├─ 检测 currentStage 是否为子阶段
└─ 如果是,统一为"交付执行"
└─ data.deliverySubStage = currentStage
└─ currentStage = "交付执行" ✅
组长审批通过某个子阶段
↓
approveDelivery()
├─ 检查是否所有子阶段都已通过
├─ 如果是:currentStage = "尾款结算"
└─ 如果否:
├─ currentStage 保持为"交付执行" ✅
└─ data.deliverySubStage 更新为下一个子阶段 ✅
步骤:
1. 创建新项目
2. 推进到交付执行阶段
3. 打开交付执行页面
预期结果:
- currentStage: "交付执行" ✅
- data.deliverySubStage: "白模" ✅
验证方法(浏览器控制台):
const Parse = window.Parse;
const query = new Parse.Query('Project');
query.equalTo('objectId', '项目ID');
const project = await query.first();
console.log({
currentStage: project.get('currentStage'),
deliverySubStage: project.get('data')?.deliverySubStage
});
步骤:
1. 找一个 currentStage = "软装" 的旧项目
2. 打开交付执行页面
3. 查看控制台日志
预期日志:
🔥 统一阶段: "软装" → "交付执行"
✅ 阶段已统一为"交付执行"
预期结果:
- currentStage: "交付执行" ✅
- data.deliverySubStage: "软装" ✅
步骤:
1. 打开管理员端项目管理
2. 查看交付执行阶段的项目
预期结果:
- 当前阶段列:交付执行 ✅
- 状态列:进行中 ✅
步骤:
1. 打开交付执行阶段的项目
2. 查看页面底部红色标签
预期结果:
- 显示:交付执行 ✅
- 不显示:白膜、软装等子阶段
| 改进项 | 修改前 | 修改后 |
|---|---|---|
currentStage 字段 |
"白模"等子阶段 ❌ | "交付执行" ✅ |
| 子阶段信息 | 丢失 ❌ | 保存在 data.deliverySubStage ✅ |
| 显示一致性 | 不一致 ❌ | 完全一致 ✅ |
| 数据结构 | 混乱 ❌ | 清晰规范 ✅ |
ensureDeliveryStageInitialized() 方法修复currentStage 始终保持为"交付执行"data.deliverySubStage修复完成!所有位置都将统一显示"交付执行"! 🎉
现在 currentStage 字段将始终保持为"交付执行",不会再被设置为子阶段。