项目实际阶段(project.currentStage)
当前查看阶段(this.currentStage)
导航栏上的阶段状态始终基于项目实际阶段(project.currentStage)显示:
| 状态 | 颜色 | 说明 | 可否点击 |
|---|---|---|---|
| completed(已完成) | 绿色 + ✓ | 项目已完成该阶段 | ✅ 可以点击查看 |
| active(当前) | 红色 + 脉冲 | 项目当前所在阶段 | ✅ 可以点击查看 |
| pending(未开始) | 灰色 + 半透明 | 项目还未到达该阶段 | ✅ 可以点击预览 |
// 用户点击导航栏的任何阶段
switchStage(stageId: string) {
// ✅ 允许查看所有阶段(包括未开始的)
// ⚠️ 仅改变路由,不改变 project.currentStage
this.currentStage = stageId; // 本地视图状态
this.router.navigate([stageId]);
}
效果:
// 订单分配阶段 - 点击"确认订单"
async submitForOrder() {
// 1️⃣ 验证必填项
if (!this.projectInfo.title.trim()) {
alert('请填写项目名称');
return;
}
if (!this.projectInfo.projectType) {
alert('请选择项目类型');
return;
}
// ... 其他验证
// 2️⃣ 保存数据
await this.project.save();
// 3️⃣ 推进到下一阶段(改变 project.currentStage)
this.project.set('currentStage', '确认需求');
await this.project.save();
// 4️⃣ 派发事件,触发自动跳转
document.dispatchEvent(new CustomEvent('stage:completed', {
detail: { stage: 'order', nextStage: 'requirements' }
}));
}
效果:
project.currentStage&.completed {
.stage-circle {
background: linear-gradient(135deg, #2dd36f 0%, #28ba62 100%);
border-color: var(--success-color);
color: var(--white);
box-shadow: 0 2px 8px rgba(45, 211, 111, 0.3);
}
}
&.active {
.stage-circle {
background: linear-gradient(135deg, #eb445a 0%, #d33850 100%);
border-color: var(--danger-color);
animation: pulse 2s infinite;
}
}
&.pending {
opacity: 0.7; // 提示这是预览模式
&:hover {
opacity: 1; // 悬停时变清晰
transform: translateY(-1px);
}
}
必填项:
✅ project.title // 项目名称
✅ project.projectType // 项目类型(家装/工装)
✅ project.demoday // 小图日期
✅ data.quotation.total // 报价总额 > 0
✅ ProjectTeam 记录 // 已分配设计师
或 data.approvalStatus === 'approved' // 组长已审批
提交按钮:确认订单(stage-order.component.ts 第1192行)
必填项:
✅ data.requirementsAnalysis // 需求分析数据
或 data.spaceRequirements // 空间需求数据
提交按钮:确认需求(stage-requirements.component.ts)
必填项:
✅ data.deliveryStages.modeling.approvalStatus === 'approved'
✅ data.deliveryStages.softDecor.approvalStatus === 'approved'
✅ data.deliveryStages.rendering.approvalStatus === 'approved'
✅ data.deliveryStages.postProcess.approvalStatus === 'approved'
提交方式:各子阶段逐个审批通过(stage-delivery.component.ts)
project.currentStage 才会改变项目列表 → 点击项目
↓
根据 project.currentStage 自动跳转到对应阶段
↓
例如:currentStage = '确认需求'
↓
路由:/wxwork/{cid}/project/{projectId}/requirements
↓
导航栏显示:
- 订单分配:✓ 绿色(已完成)
- 确认需求:● 红色(当前)
- 交付执行:○ 灰色(未开始)
- 售后归档:○ 灰色(未开始)
用户点击"交付执行"(未开始)
↓
switchStage('delivery')
↓
路由:/wxwork/{cid}/project/{projectId}/delivery
↓
显示:交付执行页面(可能是空白或提示)
↓
导航栏状态不变:
- 订单分配:✓ 绿色(已完成)
- 确认需求:● 红色(当前实际阶段)
- 交付执行:○ 灰色(未开始,仅在查看)
- 售后归档:○ 灰色(未开始)
↓
控制台提示:
⚠️ 正在查看未开始的阶段: 交付执行
💡 这是查看模式,项目实际阶段不会改变
💡 需要完成当前阶段的必填项才能推进到 交付执行
在浏览器控制台输入:
// 查看项目实际阶段
console.log('项目实际阶段:', project.get('currentStage'));
// 查看当前查看阶段(路由)
console.log('当前查看阶段:', this.currentStage);
// 查看各阶段状态
this.stages.forEach(stage => {
console.log(`${stage.name}:`, this.getStageStatus(stage.id));
});
🔄 用户点击切换阶段(查看模式): delivery
currentRoute: /wxwork/xxx/project/yyy/delivery
currentViewStage: delivery
projectActualStage: 确认需求
⚠️ 正在查看未开始的阶段: 交付执行
💡 提示: 这是查看模式,项目实际阶段不会改变
💡 需要完成当前阶段的必填项才能推进到 交付执行
✅ 切换到阶段视图: delivery (项目实际状态: pending)
✅ 导航成功(查看模式): delivery
/project/{id}/deliveryproject.currentStage 更新为"确认需求"查看 ≠ 推进
状态显示基于实际阶段
project.currentStage必须验证后才能推进
project.currentStage未开始的阶段可以预览
允许点击所有阶段查看
点击导航栏不改变项目阶段
project.currentStage 保持不变必须完成必填项才能推进
状态显示正确
project-detail.component.ts - 修改 switchStage 方法project-detail.component.html - 移除禁用逻辑project-detail.component.scss - 调整pending状态样式repair-project-stages.ts - 修复TypeScript错误STAGE_SWITCH_VALIDATION_FIXED.md - 之前的修复记录DATA_REPAIR_STAGE_ROLLBACK.md - 数据修复方案STAGE_NAVIGATION_LOGIC.md - 本文档