FIX_DELIVERY_STAGE_INITIALIZATION.md 7.2 KB

修复交付执行阶段初始化逻辑 - currentStage 统一为"交付执行"

🐛 问题描述

症状

  • 项目管理页面显示的当前阶段是"白膜"而不是"交付执行"
  • 项目底部卡片可能显示子阶段名称
  • currentStage 字段被设置为子阶段(如"白模"、"软装"等)

根本原因ensureDeliveryStageInitialized() 方法在初始化时会将 currentStage 设置为具体的子阶段(Line 507),这与我们统一显示"交付执行"的目标冲突。

代码位置

  • 文件:src/modules/project/pages/project-detail/stages/stage-delivery.component.ts
  • 方法:ensureDeliveryStageInitialized() (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();
  }
}

问题

  1. currentStage 设置为"白模"等子阶段
  2. 导致项目管理页面显示子阶段而非"交付执行"
  3. 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 初始化成功');
  }
}

改进

  1. currentStage 始终保持为"交付执行"
  2. ✅ 子阶段信息存储在 data.deliverySubStage
  3. ✅ 与统一显示逻辑完全一致

📊 数据结构对比

修改前 (❌ 错误)

{
  currentStage: "白模",  // ❌ 设置为子阶段
  data: {
    deliveryStageStatus: {
      whitemodel: { status: "pending" }
    }
  }
}

问题

  • 项目管理页面显示:"白模" → 映射为"delivery" → 状态"进行中"
  • 底部卡片显示:"白模" → 映射为"交付执行"(已修复)
  • 不一致:数据库存储的是子阶段

修改后 (✅ 正确)

{
  currentStage: "交付执行",  // ✅ 统一为交付执行
  data: {
    deliverySubStage: "白模",  // ✅ 子阶段信息保留
    deliveryStageStatus: {
      whitemodel: { status: "pending" }
    }
  }
}

效果

  • 项目管理页面显示:"交付执行" + 状态"进行中" ✅
  • 底部卡片显示:"交付执行" ✅
  • 顶部进度条显示:"交付执行" ✅
  • 一致性:所有位置都显示"交付执行"

🔄 完整数据流

1. 页面加载流程

交付执行页面 ngOnInit
  ↓
ensureDeliveryStageInitialized()
  ├─ 检测 currentStage === "交付执行"
  ├─ 检测 data.deliverySubStage 是否存在
  └─ 如果不存在,初始化为第一个未完成的子阶段
      └─ data.deliverySubStage = "白模"
      └─ currentStage 保持为"交付执行" ✅
  ↓
unifyDeliveryStageForOldData()
  ├─ 检测 currentStage 是否为子阶段
  └─ 如果是,统一为"交付执行"
      └─ data.deliverySubStage = currentStage
      └─ currentStage = "交付执行" ✅

2. 审批通过流程

组长审批通过某个子阶段
  ↓
approveDelivery()
  ├─ 检查是否所有子阶段都已通过
  ├─ 如果是:currentStage = "尾款结算"
  └─ 如果否:
      ├─ currentStage 保持为"交付执行" ✅
      └─ data.deliverySubStage 更新为下一个子阶段 ✅

🧪 测试验证

1. 测试新项目初始化

步骤:
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
});

2. 测试旧数据统一

步骤:
1. 找一个 currentStage = "软装" 的旧项目
2. 打开交付执行页面
3. 查看控制台日志

预期日志:
🔥 统一阶段: "软装" → "交付执行"
✅ 阶段已统一为"交付执行"

预期结果:
- currentStage: "交付执行" ✅
- data.deliverySubStage: "软装" ✅

3. 测试项目管理页面显示

步骤:
1. 打开管理员端项目管理
2. 查看交付执行阶段的项目

预期结果:
- 当前阶段列:交付执行 ✅
- 状态列:进行中 ✅

4. 测试底部卡片显示

步骤:
1. 打开交付执行阶段的项目
2. 查看页面底部红色标签

预期结果:
- 显示:交付执行 ✅
- 不显示:白膜、软装等子阶段

📌 关键改进点

改进项 修改前 修改后
currentStage 字段 "白模"等子阶段 ❌ "交付执行" ✅
子阶段信息 丢失 ❌ 保存在 data.deliverySubStage
显示一致性 不一致 ❌ 完全一致 ✅
数据结构 混乱 ❌ 清晰规范 ✅

✅ 修复完成确认

  • ensureDeliveryStageInitialized() 方法修复
  • currentStage 始终保持为"交付执行"
  • 子阶段信息存储在 data.deliverySubStage
  • 项目管理页面显示正确
  • 底部卡片显示正确
  • 数据结构清晰统一

修复完成!所有位置都将统一显示"交付执行"! 🎉

现在 currentStage 字段将始终保持为"交付执行",不会再被设置为子阶段。