文件:src/modules/project/pages/project-detail/project-detail.component.ts (Line 81)
当前配置:
stages = [
{ id: 'order', name: '订单分配', icon: 'document-text-outline', number: 1 },
{ id: 'requirements', name: '确认需求', icon: 'checkmark-circle-outline', number: 2 },
{ id: 'delivery', name: '交付执行', icon: 'rocket-outline', number: 3 }, // ✅ 统一显示
{ id: 'aftercare', name: '售后归档', icon: 'archive-outline', number: 4 }
];
显示效果:
文件:src/modules/project/components/project-bottom-card/project-bottom-card.component.ts (Line 100-112)
实现逻辑:
getProjectStatus(): string {
const currentStage = this.project?.get('currentStage') || '订单分配';
const corePhase = mapStageToCorePhase(currentStage);
// 🔥 交付执行阶段统一显示"交付执行"
if (corePhase === 'delivery') {
return '交付执行';
}
return currentStage;
}
显示效果:
currentStage 是"白膜"或"软装",也统一显示"交付执行"文件:src/app/pages/admin/project-management/project-management.ts (Line 220-244)
实现逻辑:
// 获取项目阶段
const currentStage = json.currentStage || json.stage || '订单分配';
// 根据阶段自动判断状态
const autoStatus = getProjectStatusByStage(currentStage, json.status);
return {
currentStage: currentStage, // 显示实际阶段
status: autoStatus // "进行中"
};
配合阶段映射:
// src/app/utils/project-stage-mapper.ts
export function mapStageToCorePhase(stageId: string): CorePhase {
const normalizedStage = normalizeStageInternal(stageId);
// 所有子阶段映射到 'delivery'
if (normalizedStage === '白膜' ||
normalizedStage === '软装' ||
normalizedStage === '渲染' ||
normalizedStage === '后期') {
return 'delivery';
}
}
export function getProjectStatusByStage(stageId: string): string {
const corePhase = mapStageToCorePhase(stageId);
if (corePhase === 'delivery') {
return '进行中'; // ✅ 状态正确
}
}
显示效果:
文件:src/modules/project/pages/project-detail/stages/stage-delivery.component.ts (Line 520-537)
自动统一逻辑:
async unifyDeliveryStageForOldData(): Promise<void> {
if (!this.project) return;
const currentStage = this.project.get('currentStage');
const validDeliveryStages = ['白膜', '软装', '渲染', '后期'];
// 检测到子阶段,自动统一为"交付执行"
if (validDeliveryStages.includes(currentStage)) {
console.log(`统一阶段: "${currentStage}" → "交付执行"`);
const data = this.project.get('data') || {};
data.deliverySubStage = currentStage; // 保存子阶段信息
this.project.set('currentStage', '交付执行'); // 统一主阶段
this.project.set('data', data);
await this.project.save();
}
}
执行时机:
效果:
// 修改前
{
currentStage: "软装" // ❌ 子阶段
}
// 修改后
{
currentStage: "交付执行", // ✅ 统一
data: {
deliverySubStage: "软装" // 子阶段信息保留
}
}
文件:stage-delivery.component.ts (Line 115-143)
deliveryTypes = [
{ id: 'white_model', name: '白膜', icon: 'cube-outline' },
{ id: 'soft_decor', name: '软装', icon: 'color-palette-outline' },
{ id: 'rendering', name: '渲染', icon: 'image-outline' },
{ id: 'post_process', name: '后期', icon: 'color-wand-outline' }
];
为什么保留?
显示位置:
| 显示位置 | 显示内容 | 状态 |
|---|---|---|
| 项目详情页顶部进度条 | 交付执行 | ✅ 已统一 |
| 项目底部卡片标签 | 交付执行 | ✅ 已统一 |
| 项目管理页面-当前阶段列 | 交付执行 | ✅ 已统一 |
| 项目管理页面-状态列 | 进行中 | ✅ 正确 |
| Parse数据库-currentStage字段 | 交付执行 | ✅ 自动统一 |
| 交付执行页面内部-工作流程 | 白膜/软装/渲染/后期 | ✅ 保留(正确) |
打开任意项目详情页
查看顶部进度条
预期:第3步显示"交付执行" ✅
打开交付执行阶段的项目
查看页面底部红色标签
预期:显示"交付执行"而不是"软装" ✅
打开 /admin/project-management
查看交付执行阶段的项目
预期:
- 当前阶段列:交付执行 ✅
- 状态列:进行中 ✅
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 // 保留子阶段信息
});
打开处于交付执行的项目
查看浏览器控制台
预期日志:
✅ [统一阶段] currentStage 已为"交付执行"
或
🔥 统一阶段: "软装" → "交付执行"
✅ 阶段已统一为"交付执行"
用户操作
↓
交付执行页面加载
↓
检测 currentStage 是否为子阶段
↓ (如果是)
自动统一为"交付执行"
↓
保存子阶段到 data.deliverySubStage
↓
项目管理页面读取 currentStage
↓
显示"交付执行" + 状态"进行中"
↓
底部卡片通过 mapStageToCorePhase 映射
↓
统一显示"交付执行"
所有显示位置已统一为"交付执行"! 🎉
交付执行页面内部的4个子阶段(白膜、软装、渲染、后期)保留用于工作流程管理,这是正确的设计。