# 修复交付执行阶段初始化逻辑 - currentStage 统一为"交付执行" ## 🐛 问题描述 **症状**: - 项目管理页面显示的当前阶段是"白膜"而不是"交付执行" - 项目底部卡片可能显示子阶段名称 - `currentStage` 字段被设置为子阶段(如"白模"、"软装"等) **根本原因**: `ensureDeliveryStageInitialized()` 方法在初始化时会将 `currentStage` 设置为具体的子阶段(Line 507),这与我们统一显示"交付执行"的目标冲突。 **代码位置**: - 文件:`src/modules/project/pages/project-detail/stages/stage-delivery.component.ts` - 方法:`ensureDeliveryStageInitialized()` (Line 467-518) --- ## ✅ 修复方案 ### 修改前的逻辑 (❌ 错误) ```typescript async ensureDeliveryStageInitialized(): Promise { 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()` 的统一逻辑冲突 --- ### 修改后的逻辑 (✅ 正确) ```typescript async ensureDeliveryStageInitialized(): Promise { 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 = { '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. ✅ 与统一显示逻辑完全一致 --- ## 📊 数据结构对比 ### 修改前 (❌ 错误) ```javascript { currentStage: "白模", // ❌ 设置为子阶段 data: { deliveryStageStatus: { whitemodel: { status: "pending" } } } } ``` **问题**: - 项目管理页面显示:"白模" → 映射为"delivery" → 状态"进行中" - 底部卡片显示:"白模" → 映射为"交付执行"(已修复) - **不一致**:数据库存储的是子阶段 ### 修改后 (✅ 正确) ```javascript { 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` ✅ | | 显示一致性 | 不一致 ❌ | 完全一致 ✅ | | 数据结构 | 混乱 ❌ | 清晰规范 ✅ | --- ## ✅ 修复完成确认 - [x] `ensureDeliveryStageInitialized()` 方法修复 - [x] `currentStage` 始终保持为"交付执行" - [x] 子阶段信息存储在 `data.deliverySubStage` - [x] 项目管理页面显示正确 - [x] 底部卡片显示正确 - [x] 数据结构清晰统一 --- **修复完成!所有位置都将统一显示"交付执行"!** 🎉 现在 `currentStage` 字段将始终保持为"交付执行",不会再被设置为子阶段。