APPROVAL_AND_QUOTATION_TEST_GUIDE.md 9.4 KB

审批状态和报价显示修复 - 测试指南

✅ 已完成的修复

1. 增强审批状态智能判定

修改文件stage-order.component.ts (第1546-1654行)

修复内容

  • ✅ 优先级1:直接读取 data.approvalStatus 字段
  • ✅ 优先级2:检查审批历史中"订单分配"阶段的记录
  • ✅ 优先级3:如果项目已推进到后续阶段,自动判定为 'approved'
  • ✅ 增加详细的调试日志

关键代码

getApprovalStatus(): 'pending' | 'approved' | 'rejected' | null {
  const data = this.project.get('data') || {};
  
  // 优先级1:直接读取 approvalStatus
  if (data.approvalStatus) {
    return data.approvalStatus;
  }
  
  // 优先级2:检查"订单分配"阶段的审批历史
  const orderApprovals = data.approvalHistory.filter(h => h.stage === '订单分配');
  if (orderApprovals.length > 0) {
    return orderApprovals[orderApprovals.length - 1].status;
  }
  
  // 优先级3:项目已推进到后续阶段
  if (currentStage && !['订单分配', '未分配', '新建'].includes(currentStage)) {
    return 'approved';
  }
  
  return null;
}

2. 增强报价数据加载

修改文件stage-order.component.ts (第466-489行)

修复内容

  • ✅ 添加详细的报价数据加载日志
  • ✅ 如果没有报价数据,初始化默认结构
  • ✅ 输出报价总额、空间数量、空间名称

关键代码

const data = this.project.get('data') || {};
if (data.quotation) {
  this.quotation = data.quotation;
  console.log('✅ [loadData] 报价数据加载成功:', {
    total: this.quotation.total,
    spaces: this.quotation.spaces?.length || 0,
    spaceNames: this.quotation.spaces?.map(s => s.name) || []
  });
} else {
  console.warn('⚠️ [loadData] 项目没有报价数据,初始化默认结构');
  this.quotation = { spaces: [], total: 0, spaceBreakdown: [] };
}

🔍 测试步骤

测试场景1:组长审批通过后再次查看订单分配

步骤

  1. 客服端创建项目

    • 所有设计师都繁忙
    • 无法自动分配设计师
  2. 提交订单

    • 点击"确认订单"
    • 查看控制台:

      💾 [提交订单] 准备保存项目数据:
      approvalStatus: 'pending'
      pendingApprovalBy: 'team-leader'
           
      ✅ [提交订单] 项目保存成功
      
  3. 组长端审批通过

    • 打开项目
    • 点击"通过审批"
    • 查看控制台:

      📝 [审批通过] 准备保存项目数据
      💾 [审批通过] 项目已保存到数据库
      ✅ [审批通过] 数据验证成功:
      approvalStatus: 'approved'
      currentStage: '确认需求'
      
  4. 再次进入订单分配页面

    • 从项目列表点击进入订单分配
    • 查看控制台:

      🔍 [loadData] 项目审批状态详情:
      审批状态: 'approved'
           
      ✅ [审批状态] 直接读取 data.approvalStatus: approved
           
      🔍 【审批状态检查】
      原始审批状态: 'approved'    ✅ 正确!
      最终判定状态: 'approved'    ✅ 正确!
      是否pending: false          ✅ 正确!
      是否approved: true          ✅ 正确!
      
  5. 页面显示验证

    • ✅ 应该显示绿色横幅:"审批已通过"
    • ✅ 不应该显示黄色横幅:"等待组长审批"
    • ❌ 不应该显示审批按钮

测试场景2:自动审批(已分配设计师)

步骤

  1. 客服端创建项目

    • 有空闲设计师
    • 成功分配设计师
  2. 提交订单

    • 点击"确认订单"
    • 查看控制台:

      ✅ 已分配设计师,订单直接通过,进入"确认需求"阶段
           
      💾 [提交订单] 准备保存项目数据:
      approvalStatus: 'approved'    ✅ 自动审批
      currentStage: '确认需求'
           
      ✅ [提交订单] 项目保存成功
      
  3. 再次进入订单分配页面

    • 查看控制台:

      ✅ [智能判定] 从审批历史中找到订单分配审批状态: approved
      审批人: 自动审批
      是否自动审批: true
           
      🔍 【审批状态检查】
      最终判定状态: 'approved'    ✅ 正确!
      
  4. 页面显示验证

    • ✅ 显示绿色横幅:"审批已通过"

测试场景3:报价显示验证

步骤

  1. 进入订单分配页面

  2. 查看控制台日志

    ✅ [loadData] 报价数据加载成功:
     total: 5000              // 应该是实际金额,不是0
     spaces: 2                // 应该有空间
     spaceNames: ['客厅', '卧室']
    
  3. 如果报价为空

    ⚠️ [loadData] 项目没有报价数据,初始化默认结构
    total: 0
    spaces: 0
    
  4. 检查 app-quotation-editor 组件

    • 确认组件接收到 project 对象
    • 确认组件接收到 canEdit 权限
    • 查看组件内部日志
  5. 验证HTML绑定

    <app-quotation-editor
     [project]="project"
     [canEdit]="canEdit"
     [currentUser]="currentUser"
     (quotationChange)="onQuotationChange($event)"
     (totalChange)="onTotalChange($event)">
    </app-quotation-editor>
    

🐛 如果报价仍显示¥0,请检查

检查点1:数据库中是否有报价数据

方法:在浏览器控制台执行

// 查看项目数据
const query = new Parse.Query('Project');
const project = await query.get('项目ID');
const data = project.get('data');
console.log('报价数据:', data.quotation);

预期结果

{
  spaces: [
    { name: '客厅', spaceId: 'xxx', subtotal: 3000 },
    { name: '卧室', spaceId: 'yyy', subtotal: 2000 }
  ],
  total: 5000,
  spaceBreakdown: [...]
}

检查点2:quotation-editor 组件是否接收到数据

方法:在 quotation-editor.component.ts 中添加日志

ngOnInit() {
  console.log('🔍 [报价编辑器] 接收到数据:', {
    project: this.project?.id,
    projectData: this.project?.get('data')?.quotation,
    canEdit: this.canEdit
  });
}

检查点3:组件输入绑定是否正确

查看HTML

<app-quotation-editor
  [project]="project"              <!-- 是否正确传递 -->
  [canEdit]="canEdit"              <!-- 是否正确传递 -->
  [currentUser]="currentUser">     <!-- 是否正确传递 -->
</app-quotation-editor>

检查点4:报价编辑器是否正确渲染

查看 quotation-editor.component.html

  • 确认报价总额的绑定:{{ quotation.total | currency:'CNY' }}
  • 确认是否有数据加载逻辑
  • 确认是否有默认值

📊 预期效果对比

修复前 ❌

【审批状态】
控制台:
  原始审批状态: 'pending'    ❌
  最终判定状态: 'pending'    ❌
  是否approved: false        ❌

页面显示:
  ⏳ 等待组长审批             ❌

【报价显示】
页面显示:
  报价总额: ¥0              ❌

修复后 ✅

【审批状态】
控制台:
  原始审批状态: 'approved'   ✅
  最终判定状态: 'approved'   ✅
  是否approved: true         ✅

页面显示:
  ✅ 审批已通过              ✅

【报价显示】
控制台:
  ✅ [loadData] 报价数据加载成功
  total: 5000               ✅
  spaces: 2                 ✅

页面显示:
  报价总额: ¥5,000          ✅

🎯 关键控制台日志

审批状态相关

// 加载数据时
🔍 [loadData] 项目审批状态详情:
  审批状态: 'approved'

// 获取审批状态时
✅ [审批状态] 直接读取 data.approvalStatus: approved

🔍 【审批状态检查】
  原始审批状态: 'approved'
  最终判定状态: 'approved'
  是否pending: false
  是否approved: true
  是否rejected: false

报价数据相关

// 加载数据时
✅ [loadData] 报价数据加载成功:
  total: 5000
  spaces: 2
  spaceNames: ['客厅', '卧室']
  isMultiSpace: true

// 如果没有数据
⚠️ [loadData] 项目没有报价数据,初始化默认结构

🔧 故障排除

问题1:审批状态仍显示 'pending'

可能原因

  1. 数据库中 data.approvalStatus 字段未正确保存
  2. 审批历史中没有"订单分配"阶段的记录

解决方法

// 在浏览器控制台手动修复
const query = new Parse.Query('Project');
const project = await query.get('项目ID');
const data = project.get('data') || {};
data.approvalStatus = 'approved';
project.set('data', data);
await project.save();
console.log('✅ 手动修复审批状态');

问题2:报价显示¥0

可能原因

  1. 数据库中没有报价数据
  2. quotation-editor 组件未正确接收数据
  3. 报价数据格式不正确

解决方法

  1. 检查 project.data.quotation 字段
  2. 重新配置报价明细
  3. 手动修复数据结构

🎊 测试完成后

请告知以下信息:

  1. 审批状态

    • 组长审批通过后,再次进入订单分配页面显示"审批已通过"
    • 控制台显示 approvalStatus: 'approved'
  2. 报价显示

    • 报价总额显示正确金额(不是¥0)
    • 控制台显示报价数据加载成功
  3. 控制台日志

    • 请复制关键的控制台日志,帮助我进一步诊断

修复已完成,请按照上述步骤进行测试! 🚀