ORDER_STAGE_FIXES.md 13 KB

订单分配阶段问题修复总结

📋 问题描述

从用户反馈和日志分析,订单分配阶段存在以下问题:

问题1:审批状态显示异常

现象

🔍 【审批状态检查】 {原始审批状态: undefined, 最终判定状态: null, ...}
  • 审批状态为undefined或null
  • 没有正确加载审批状态
  • 导致审批相关功能异常

问题2:报价价格全部为¥0

现象

  • 所有产品(客厅、餐厅、主卧等)价格都显示为¥0
  • 总报价显示为¥0
  • 虽然之前修复了价格计算逻辑,但没有生效

问题3:默认创建9个空间

现象

  • 一开始就创建了9个空间(客厅、餐厅、主卧、次卧、儿童房、书房、厨房、卫生间、阳台)
  • 应该只创建1-2个空间,让用户根据需要添加更多

用户期望

"现在存在一些问题订单分配阶段审批状态没有进行同步,审批状态结果没有正确加载,还有的就是请你将这个报价数据价格没有正确加载出来,都是0,而且是默认九个空间,一开始可以是一两个,且需要同步获取渲染到报价"


✅ 修复方案

修复1:默认空间数量从9个改为1个

修改文件quotation-editor.component.ts

第105-117行:添加defaultInitialSpaces配置

// 预设场景列表(完整列表,用于下拉选择)
presetScenes: { [key: string]: string[] } = {
  '家装': ['客厅', '餐厅', '主卧', '次卧', '儿童房', '书房', '厨房', '卫生间', '阳台'],
  '工装': ['大堂', '接待区', '会议室', '办公区', '休息区', '展示区', '洽谈区'],
  '建筑类': ['门头', '小型单体', '大型单体', '鸟瞰']
};

// 🔥 默认初始空间(只创建1个空间,用户可以手动添加更多)
defaultInitialSpaces: { [key: string]: string[] } = {
  '家装': ['客厅'],
  '工装': ['大堂'],
  '建筑类': ['门头']
};

第357-362行:修改getDefaultRoomsForProjectType()方法

private getDefaultRoomsForProjectType(): string[] {
  console.log('🏠 [创建默认产品] 项目类型:', this.projectInfo.projectType);
  const defaultSpaces = this.defaultInitialSpaces[this.projectInfo.projectType] || ['空间1'];
  console.log('🏠 [创建默认产品] 将创建空间:', defaultSpaces);
  return defaultSpaces;
}

效果

  • ✅ 家装项目:默认创建1个空间(客厅)
  • ✅ 工装项目:默认创建1个空间(大堂)
  • ✅ 建筑类项目:默认创建1个空间(门头)
  • ✅ 用户可以手动点击"添加产品"增加更多空间
  • presetScenes保留用于下拉选择列表

修复2:审批状态初始化

修改文件stage-order.component.ts

第482-489行:在加载项目数据时初始化审批状态

// 🔥 修复:如果项目处于订单分配阶段但没有approvalStatus,初始化为null(未提交状态)
const currentStage = this.project.get('currentStage');
if (currentStage === '订单分配' && data.approvalStatus === undefined) {
  console.log('🔧 [初始化] 订单分配阶段但无审批状态,初始化为null(未提交)');
  data.approvalStatus = null;
  data.approvalHistory = data.approvalHistory || [];
  // 不保存到数据库,等用户提交订单时再保存
}

逻辑说明

  1. undefined状态:项目刚创建,还没有提交过订单分配
  2. null状态:初始化为null,表示"未提交"
  3. pending状态:用户点击"确认订单"后,提交组长审批
  4. approved状态:组长审批通过,或设计师已分配自动通过
  5. rejected状态:组长驳回

审批状态流转

undefined (刚创建)
    ↓ loadData时初始化
null (未提交)
    ↓ 点击"确认订单"
pending (待审批)
    ↓ 组长审批
approved (已通过) 或 rejected (已驳回)

修复3:价格计算日志追踪

修改文件quotation-editor.component.ts

第407-448行:在createProduct()方法中添加详细日志

// 计算基础价格(使用重构后的方法)
console.log('🏗️ [创建产品] 准备计算价格:', {
  productName,
  priceLevel: this.projectInfo.priceLevel,
  projectType: this.projectInfo.projectType,
  renderType: this.projectInfo.renderType,
  spaceType,
  styleLevel,
  businessType,
  architectureType
});

const basePrice = this.calculateBasePrice({
  priceLevel: this.projectInfo.priceLevel,
  projectType: this.projectInfo.projectType,
  renderType: this.projectInfo.renderType,
  spaceType: spaceType,
  styleLevel: styleLevel,
  businessType: businessType,
  architectureType: architectureType
});

console.log('🏗️ [创建产品] 价格计算完成:', {
  productName,
  basePrice,
  roundedPrice: Math.round(basePrice)
});

// 设置报价信息
product.set('quotation', {
  priceLevel: this.projectInfo.priceLevel,
  basePrice: Math.round(basePrice),
  price: Math.round(basePrice),
  currency: 'CNY',
  breakdown: this.calculatePriceBreakdown(basePrice),
  status: 'draft',
  validUntil: new Date(Date.now() + 30 * 24 * 60 * 60 * 1000)
});

console.log('🏗️ [创建产品] 报价信息已设置:', {
  productName,
  quotation: product.get('quotation')
});

日志输出示例

🏗️ [创建产品] 准备计算价格: {
  productName: "客厅",
  priceLevel: "一级",
  projectType: "家装",
  renderType: "静态单张",
  spaceType: "平层",
  styleLevel: "基础风格组",
  ...
}

💰 [计算基础价格] 输入参数: {...}
💰 [计算基础价格] getBasePrice返回: 12800
💰 [计算基础价格] 最终价格: 12800

🏗️ [创建产品] 价格计算完成: {
  productName: "客厅",
  basePrice: 12800,
  roundedPrice: 12800
}

🏗️ [创建产品] 报价信息已设置: {
  productName: "客厅",
  quotation: {
    price: 12800,
    basePrice: 12800,
    priceLevel: "一级",
    ...
  }
}

🔍 价格为0的原因分析

可能原因1:项目信息缺失

检查项

  • projectInfo.priceLevel 是否为空或无效值(如"默认")
  • projectInfo.projectType 是否为"家装"、"工装"或"建筑类"
  • projectInfo.renderType 是否有效

解决方案

  1. 在订单分配阶段,先设置项目类型和价格级别
  2. 然后再创建产品
  3. 确保priceLevel在价格表中存在

可能原因2:getBasePrice返回0

检查项

  • quotation-rules.ts中的价格表是否有对应的价格
  • 参数组合是否在价格表中
  • 日志中的"getBasePrice返回"值是多少

调试步骤

  1. 打开浏览器控制台(F12)
  2. 刷新订单分配页面
  3. 查看日志输出:

    💰 [计算基础价格] 输入参数: {...}
    💰 [计算基础价格] getBasePrice返回: ???
    
  4. 如果返回0,检查价格表配置

可能原因3:Product表权限问题

现象

❌ 保存产品"客厅"价格失败: Permission denied

解决方案

  1. 检查Parse Server的ACL设置
  2. 确保当前用户有Product表的写权限
  3. 检查beforeSave/afterSave钩子

📊 完整数据流(修复后)

场景1:新建项目

创建项目
    ↓
进入订单分配阶段
    ↓ loadData()
检查 data.approvalStatus
    ↓ undefined
初始化为 null(未提交)
    ↓
检查是否有Product
    ↓ 没有
创建默认产品(1个空间:客厅)
    ↓ createProduct('客厅')
计算价格:priceLevel + projectType + spaceType
    ↓ calculateBasePrice()
getBasePrice('一级', '家装', '静态单张', '平层', ...)
    ↓ 返回 12800
设置 Product.quotation.price = 12800
    ↓ product.save()
保存到Parse Server
    ↓
自动生成报价
    ↓ generateQuotationFromProducts()
遍历Product,生成报价空间
    ↓ calculateTotal()
计算总报价
    ↓
显示在页面
✅ 设计产品(1个空间)
✅ 客厅 ¥12,800
✅ 当前总报价 ¥12,800

场景2:提交订单分配

点击"确认订单"
    ↓ submitForOrder()
检查是否已分配设计师
    ↓ 查询ProjectTeam表
hasAssignedDesigners = true/false
    ↓
情况1:已分配设计师
    ↓
设置 data.approvalStatus = 'approved'
自动通过,进入"确认需求"阶段
    ↓
情况2:未分配设计师
    ↓
设置 data.approvalStatus = 'pending'
提交组长审批,保持在"订单分配"阶段
    ↓
保存到Parse Server
project.save()
    ↓
页面刷新
    ↓ loadData()
加载 data.approvalStatus
    ↓ 'pending'
禁用"确认订单"按钮
显示"待审批"状态

🎯 验证步骤

1. 验证默认空间数量

操作

  1. 创建新项目
  2. 进入订单分配阶段
  3. 查看"设计产品(X个空间)"

预期

  • ✅ 显示"设计产品(1个空间)"
  • ✅ 只显示1个产品(如"客厅")
  • ✅ 可以手动点击"添加产品"增加更多空间

日志

🏠 [创建默认产品] 项目类型: 家装
🏠 [创建默认产品] 将创建空间: ['客厅']

2. 验证审批状态初始化

操作

  1. 打开浏览器控制台(F12)
  2. 进入订单分配阶段
  3. 查看日志输出

预期日志

🔧 [初始化] 订单分配阶段但无审批状态,初始化为null(未提交)

🔍 [loadData] 项目审批状态详情: {
  项目ID: "xxx",
  当前阶段: "订单分配",
  审批状态: null,
  是否pending: false,
  是否approved: false,
  是否rejected: false,
  审批历史: []
}

3. 验证价格计算

操作

  1. 打开浏览器控制台(F12)
  2. 创建新产品或刷新页面
  3. 查看价格计算日志

预期日志

🏗️ [创建产品] 准备计算价格: {
  productName: "客厅",
  priceLevel: "一级",
  projectType: "家装",
  ...
}

💰 [计算基础价格] 输入参数: {...}
💰 [计算基础价格] getBasePrice返回: 12800
💰 [计算基础价格] 最终价格: 12800

🏗️ [创建产品] 价格计算完成: {basePrice: 12800}
🏗️ [创建产品] 报价信息已设置: {quotation: {price: 12800}}

如果价格为0

💰 [计算基础价格] getBasePrice返回: 0

→ 检查priceLevelprojectTypespaceType是否正确 → 检查quotation-rules.ts中的价格表配置

4. 验证Product表保存

操作

  1. 创建产品后,打开Parse Dashboard
  2. 查看Product表
  3. 找到对应的产品记录

预期

  • quotation.price = 12800(不是0)
  • quotation.basePrice = 12800
  • quotation.priceLevel = "一级"
  • productName = "客厅"

⚠️ 常见问题

Q1:为什么我的项目还是显示9个空间?

A:这个项目可能是在修复之前创建的。修复只影响新创建的项目

解决方案

  1. 手动删除不需要的空间(点击垃圾桶图标)
  2. 或者创建一个新项目测试

Q2:价格还是0怎么办?

A:按以下步骤排查:

  1. 检查项目类型和价格级别

    • 确保已设置项目类型(家装/工装/建筑类)
    • 确保已设置价格级别(一级/二级/三级)
  2. 查看日志

    • 打开控制台(F12)
    • 查找"💰 [计算基础价格] getBasePrice返回:"
    • 如果返回0,说明价格表中没有对应的配置
  3. 检查quotation-rules.ts

    • 确认价格表中有对应的价格配置
    • 确认参数组合正确
  4. 重新创建产品

    • 删除现有产品
    • 重新添加产品
    • 查看新的价格计算日志

Q3:审批状态还是undefined怎么办?

A

  1. 确保已应用最新的代码修复
  2. 刷新页面(Ctrl+F5强制刷新)
  3. 查看日志中的"🔧 [初始化]"信息
  4. 如果还是undefined,说明代码可能没有正确应用

📝 修改文件清单

文件 修改内容 行号
quotation-editor.component.ts 添加defaultInitialSpaces配置 112-117
quotation-editor.component.ts 修改getDefaultRoomsForProjectType() 357-362
quotation-editor.component.ts 添加createProduct()价格计算日志 407-448
quotation-editor.component.ts 添加calculateBasePrice()日志 463-479(之前已修复)
stage-order.component.ts 添加审批状态初始化逻辑 482-489

🎉 修复效果总结

修复前

  • ❌ 默认创建9个空间
  • ❌ 审批状态为undefined
  • ❌ 报价价格可能为0
  • ❌ 无法追踪价格计算问题

修复后

  • ✅ 默认创建1个空间
  • ✅ 审批状态正确初始化为null
  • ✅ 详细的价格计算日志
  • ✅ 便于调试和问题排查
  • ✅ 用户体验更好(不会被9个空间吓到)

🔗 相关修复文档

  1. QUOTATION_ZERO_FIX.md - 报价为¥0问题修复

    • 价格为0时自动重新计算
    • 保存到Product表避免下次还是0
  2. AUTO_GENERATE_QUOTATION_FIX.md - 报价自动生成修复

    • 加载产品后自动生成报价
    • 完整对接Product表数据
  3. ORDER_STAGE_FIXES.md(本文档)- 订单分配阶段综合修复

    • 默认空间数量从9个改为1个
    • 审批状态初始化
    • 价格计算日志追踪

修复完成时间:2024年11月15日 11:10 修复人员:Cascade AI Assistant