# 审批状态和报价显示问题修复 ## 🔴 问题描述 根据用户反馈和截图,存在以下两个核心问题: ### 问题1:审批状态未正确同步 **现象**: ```javascript 🔍 【审批状态检查】 { 原始审批状态: 'pending', // ❌ 应该是 'approved' 最终判定状态: 'pending', // ❌ 应该是 'approved' 是否pending: true, // ❌ 应该是 false 是否approved: false, // ❌ 应该是 true 是否rejected: false } ``` **业务逻辑**: - 只有当**所有设计师都繁忙**,无法直接分配时,才需要组长审批 - 组长审批通过后,项目进入下一阶段(确认需求) - 再次查看订单分配阶段时,应该显示"审批已通过" - **当前问题**:审批状态未正确保存到数据库,导致显示为 'pending' --- ### 问题2:报价显示为 ¥0 **现象**: - 截图显示"报价总额"为 **¥0** - 但实际上已经配置了报价明细 - 数据可能未正确加载或渲染 --- ## 🔍 根本原因分析 ### 原因1:`getApprovalStatus()` 智能判定失效 **当前逻辑**(stage-order.component.ts 第1546-1598行): ```typescript getApprovalStatus(): 'pending' | 'approved' | 'rejected' | null { const data = this.project.get('data') || {}; let status = data.approvalStatus || null; const currentStage = this.project.get('currentStage'); // ⭐ 问题:即使项目已推进到"确认需求",但如果用户再次进入"订单分配"页面 // currentStage 可能仍然读取到旧的 '订单分配',导致判定失败 if (!status && currentStage !== '订单分配') { status = 'approved'; } // ⭐ 问题:审批历史检查依赖 approvalHistory 数组,但可能没有正确保存 if (!status && currentStage === '订单分配' && data.approvalHistory?.length > 0) { const latestApproval = data.approvalHistory[data.approvalHistory.length - 1]; if (latestApproval?.status === 'approved') { status = 'approved'; } } return status; } ``` **问题**: 1. `data.approvalStatus` 字段在审批通过后没有被持久化保存 2. 项目进入下一阶段后,`currentStage` 被更新为 "确认需求" 3. 但当用户再次进入"订单分配"页面查看时,路由可能仍指向 `/order` 4. 导致智能判定逻辑失效,返回 'pending' --- ### 原因2:报价数据未正确加载 **可能原因**: 1. `quotation-editor` 组件未正确接收 `project` 对象 2. `project.data.quotation` 字段为空或未正确初始化 3. 报价组件的 `@Input()` 绑定失效 4. 数据加载时序问题(组件初始化早于数据加载) --- ## ✅ 修复方案 ### 修复1:强化审批状态保存验证 **文件**:`stage-order.component.ts` 第579-629行 **问题**:虽然已经添加了保存验证,但可能存在以下问题: 1. 验证通过后没有将 `approvalStatus` 写回本地组件状态 2. `getApprovalStatus()` 仍然读取的是旧的 `data.approvalStatus` **修复代码**: ```typescript async approveOrder(): Promise { // ... 前面的代码保持不变 ... // ✅ 验证保存成功后,立即更新本地状态 if (savedData.approvalStatus === 'approved' && savedStage === '确认需求') { console.log('✅ [审批通过] 数据验证成功,更新本地状态'); // 🔥 关键:更新本地 project 对象的引用 // 确保 getApprovalStatus() 读取的是最新数据 this.project = await query.get(this.project.id); // 🔥 强制刷新视图 this.cdr.detectChanges(); } } ``` --- ### 修复2:在智能判定中增加更强的历史审批检查 **文件**:`stage-order.component.ts` 第1546-1598行 **问题**: - 当前逻辑只检查 `approvalHistory` 的最后一条记录 - 如果 `approvalHistory` 中有多个阶段的记录,可能取错 **修复代码**: ```typescript getApprovalStatus(): 'pending' | 'approved' | 'rejected' | null { if (!this.project) return null; const data = this.project.get('data') || {}; let status = data.approvalStatus || null; const currentStage = this.project.get('currentStage'); // ✅ 修复1:明确检查 approvalStatus 字段 if (data.approvalStatus) { console.log('✅ [审批状态] 直接读取 approvalStatus:', data.approvalStatus); return data.approvalStatus; } // ✅ 修复2:检查审批历史中"订单分配"阶段的记录 if (data.approvalHistory && data.approvalHistory.length > 0) { // 🔥 关键:筛选出"订单分配"阶段的审批记录 const orderApprovals = data.approvalHistory.filter( (h: any) => h.stage === '订单分配' ); if (orderApprovals.length > 0) { const latestOrderApproval = orderApprovals[orderApprovals.length - 1]; status = latestOrderApproval.status; console.log('✅ [智能判定] 从审批历史中找到订单分配审批状态:', status); return status; } } // ✅ 修复3:如果项目已推进到后续阶段,必定已审批 if (currentStage && !['订单分配', '未分配', '新建'].includes(currentStage)) { status = 'approved'; console.log('✅ [智能判定] 项目已推进到 "' + currentStage + '" 阶段,订单分配必定已通过'); return status; } // 默认返回 null(未提交) return null; } ``` --- ### 修复3:报价数据加载问题 **问题诊断**: 1. 检查 `quotation` 对象是否正确初始化 2. 检查 `quotation-editor` 组件是否正确接收数据 **修复代码**(stage-order.component.ts): ```typescript async loadData() { // ... 前面的代码 ... if (this.project) { const data = this.project.get('data') || {}; // ✅ 修复:确保 quotation 对象被正确初始化 if (data.quotation) { this.quotation = data.quotation; console.log('✅ [加载数据] 报价数据加载成功:', { total: this.quotation.total, spaces: this.quotation.spaces?.length || 0, spaceNames: this.quotation.spaces?.map((s: any) => s.name) || [] }); } else { // 🔥 如果没有报价数据,初始化默认结构 console.warn('⚠️ [加载数据] 项目没有报价数据,初始化默认结构'); this.quotation = { spaces: [], total: 0, spaceBreakdown: [] }; data.quotation = this.quotation; this.project.set('data', data); } // ... 后续代码 ... } } ``` --- ### 修复4:`submitForOrder()` 审批流程优化 **当前问题**: - 提交订单时,如果已分配设计师,直接设置 `approvalStatus = 'approved'` - 但如果未分配设计师,设置 `approvalStatus = 'pending'` - **关键**:两种情况下都需要确保状态被正确保存 **验证代码**(stage-order.component.ts 第1345-1351行): ```typescript await this.project.save(); console.log('✅ [提交订单] 项目保存成功,验证数据:', { approvalStatus: this.project.get('data')?.approvalStatus, // 应该是 'approved' 或 'pending' currentStage: this.project.get('currentStage') // 应该是 '确认需求' 或 '订单分配' }); ``` **如果验证失败,添加额外检查**: ```typescript // 🔥 关键:验证保存是否成功 const savedData = this.project.get('data') || {}; if (hasAssignedDesigners && savedData.approvalStatus !== 'approved') { console.error('❌ [提交订单] 审批状态未正确保存!'); throw new Error('订单提交失败,请重试'); } ``` --- ## 📋 修改文件清单 | 文件 | 修改内容 | 优先级 | |------|---------|--------| | `stage-order.component.ts` | 增强 `getApprovalStatus()` 智能判定 | 🔴 高 | | `stage-order.component.ts` | 修复 `approveOrder()` 状态同步 | 🔴 高 | | `stage-order.component.ts` | 修复 `loadData()` 报价数据加载 | 🟡 中 | | `stage-order.component.ts` | 增强 `submitForOrder()` 验证 | 🟡 中 | --- ## 🎯 验证步骤 ### 测试场景1:审批通过后再次查看 1. **客服端**:创建项目,所有设计师都繁忙,无法分配 2. **提交订单**: ``` 🔍 控制台应显示: approvalStatus: 'pending' pendingApprovalBy: 'team-leader' ``` 3. **组长端**:审批通过 ``` 🔍 控制台应显示: ✅ [审批通过] 数据验证成功 approvalStatus: 'approved' currentStage: '确认需求' ``` 4. **再次进入订单分配页面**: ``` 🔍 控制台应显示: 🔍 【审批状态检查】 原始审批状态: 'approved' ✅ 正确 最终判定状态: 'approved' ✅ 正确 是否approved: true ✅ 正确 ``` 5. **页面应显示**:"审批已通过" 横幅 --- ### 测试场景2:报价显示 1. **进入订单分配页面** 2. **查看控制台**: ``` ✅ [加载数据] 报价数据加载成功: total: 5000 // 应该是实际金额,不是0 spaces: 2 // 应该有空间 ``` 3. **页面应显示**: - 报价总额:¥5000(实际金额) - 空间列表:客厅、卧室等 --- ## 🎊 预期效果 ### 修复前 ❌ ``` 组长审批通过 ↓ 项目进入确认需求 ↓ 再次查看订单分配 ↓ approvalStatus: 'pending' ❌ 错误 显示:等待组长审批 ❌ 错误 报价显示:¥0 ❌ 错误 ``` ### 修复后 ✅ ``` 组长审批通过 ↓ 项目进入确认需求 ↓ 再次查看订单分配 ↓ approvalStatus: 'approved' ✅ 正确 显示:审批已通过 ✅ 正确 报价显示:¥5000 ✅ 正确 ``` --- ## 🔧 立即实施 现在让我实施这些修复...