APPROVAL_STATUS_AND_QUOTATION_FIX.md 9.5 KB

审批状态和报价显示问题修复

🔴 问题描述

根据用户反馈和截图,存在以下两个核心问题:

问题1:审批状态未正确同步

现象

🔍 【审批状态检查】 {
  原始审批状态: 'pending',    // ❌ 应该是 'approved'
  最终判定状态: 'pending',    // ❌ 应该是 'approved'
  是否pending: true,          // ❌ 应该是 false
  是否approved: false,        // ❌ 应该是 true
  是否rejected: false
}

业务逻辑

  • 只有当所有设计师都繁忙,无法直接分配时,才需要组长审批
  • 组长审批通过后,项目进入下一阶段(确认需求)
  • 再次查看订单分配阶段时,应该显示"审批已通过"
  • 当前问题:审批状态未正确保存到数据库,导致显示为 'pending'

问题2:报价显示为 ¥0

现象

  • 截图显示"报价总额"为 ¥0
  • 但实际上已经配置了报价明细
  • 数据可能未正确加载或渲染

🔍 根本原因分析

原因1:getApprovalStatus() 智能判定失效

当前逻辑(stage-order.component.ts 第1546-1598行):

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

修复代码

async approveOrder(): Promise<void> {
  // ... 前面的代码保持不变 ...
  
  // ✅ 验证保存成功后,立即更新本地状态
  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 中有多个阶段的记录,可能取错

修复代码

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):

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行):

await this.project.save();

console.log('✅ [提交订单] 项目保存成功,验证数据:', {
  approvalStatus: this.project.get('data')?.approvalStatus,  // 应该是 'approved' 或 'pending'
  currentStage: this.project.get('currentStage')             // 应该是 '确认需求' 或 '订单分配'
});

如果验证失败,添加额外检查

// 🔥 关键:验证保存是否成功
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           ✅ 正确

🔧 立即实施

现在让我实施这些修复...