现象:
用户反馈:
"我现在需要你把订单分配阶段的生成报价的数据问题,可以恢复到之前版本正常进行报价数据的显示,现在一个空间数量不能从报价管理器组件进行使用自动生成报价,数量一开始是为0的"
用户截图显示:
订单分配阶段加载
↓
QuotationEditorComponent
↓ ngOnInit/ngOnChanges
loadProjectDataFromProject()
↓ 加载产品
await this.loadProjectProducts()
↓ 从Product表查询
products = [product1, product2, ...]
↓ ❌ 问题:只检查是否有 data.quotation
if (data.quotation) {
this.quotation = data.quotation;
}
↓ ❌ 如果没有quotation数据,就不生成报价
↓ 结果:空间数量为0,报价总价为0
缺少自动生成逻辑:
loadProjectDataFromProject() 方法只会加载已有的 quotation 数据project.data.quotation 不存在或为空,不会自动生成条件判断不完整:
// ❌ 旧代码:只检查是否有quotation
if (data.quotation) {
this.quotation = data.quotation;
this.updateProductsFromQuotation();
}
// ❌ 如果没有quotation,什么都不做
Product表已有数据:
修改文件:quotation-editor.component.ts
修改方法:
loadProjectDataFromProject() - 第240-279行loadProjectData() - 第198-244行原代码:
await this.loadProjectProducts();
if (data.quotation) {
this.quotation = data.quotation;
this.updateProductsFromQuotation();
}
修复后:
await this.loadProjectProducts();
// 🔥 关键修复:自动生成或加载报价
if (data.quotation && data.quotation.spaces && data.quotation.spaces.length > 0) {
// 如果已有报价数据,直接加载
console.log('✅ [报价组件] 从项目数据加载现有报价:', data.quotation.spaces.length, '个空间');
this.quotation = data.quotation;
this.updateProductsFromQuotation();
} else if (this.products.length > 0) {
// 🔥 如果没有报价数据但有产品,自动生成报价
console.log('🔄 [报价组件] 未找到报价数据,自动生成报价... 产品数量:', this.products.length);
await this.generateQuotationFromProducts();
} else {
console.log('⚠️ [报价组件] 没有产品,无法生成报价');
}
检查是否有现有报价:
data.quotation && data.quotation.spaces && data.quotation.spaces.length > 0检查是否有产品:
this.products.length > 0generateQuotationFromProducts()没有产品的情况:
同样的逻辑应用到另一个加载路径
await this.loadProjectProducts();
// 🔥 关键修复:自动生成或加载报价
if (data.quotation && data.quotation.spaces && data.quotation.spaces.length > 0) {
console.log('✅ [报价组件] 从项目数据加载现有报价:', data.quotation.spaces.length, '个空间');
this.quotation = data.quotation;
this.updateProductsFromQuotation();
} else if (this.products.length > 0) {
console.log('🔄 [报价组件] 未找到报价数据,自动生成报价... 产品数量:', this.products.length);
await this.generateQuotationFromProducts();
} else {
console.log('⚠️ [报价组件] 没有产品,无法生成报价');
}
加载项目
↓
loadProjectDataFromProject()
↓
loadProjectProducts() → 从Product表加载产品
this.products = [product1, product2, ...]
↓
检查 data.quotation.spaces.length > 0
↓ ✅ 有报价数据
加载现有报价
this.quotation = data.quotation
↓
updateProductsFromQuotation()
↓
显示报价:设计产品(2个空间) ✅
加载项目
↓
loadProjectDataFromProject()
↓
loadProjectProducts() → 从Product表加载产品
this.products = [主卧, 厨房]
↓
检查 data.quotation.spaces.length
↓ ❌ 没有报价数据或为空
检查 this.products.length > 0
↓ ✅ 有产品
自动生成报价
await this.generateQuotationFromProducts()
↓ 遍历产品
for (const product of this.products) {
检查 quotation.price
↓ 如果为0,重新计算(之前的修复)
basePrice = calculateBasePrice(...)
↓ 生成工序明细
processes = generateDefaultProcesses(basePrice)
↓ 添加到报价空间
this.quotation.spaces.push({
name: product.productName,
productId: product.id,
processes: processes,
subtotal: calculateProductSubtotal(processes)
})
}
↓
计算总价
calculateTotal() → this.quotation.total = 总和
↓
保存到项目
saveQuotationToProject()
↓
发送事件
quotationChange.emit(this.quotation)
totalChange.emit(this.quotation.total)
↓
父组件接收并同步
StageOrderComponent.onQuotationChange(quotation)
↓
显示报价:设计产品(2个空间) ✅
总报价:¥12,800 ✅
加载项目
↓
loadProjectDataFromProject()
↓
loadProjectProducts() → 从Product表查询
this.products = []
↓
检查 this.products.length === 0
↓ ✅ 没有产品
创建默认产品
await this.createDefaultProducts()
↓ 创建家装/工装默认空间
↓ 递归调用 loadProjectProducts()
↓ 然后自动生成报价(场景2)
在Parse Dashboard中:
quotation 字段在Parse Dashboard中:
project 等于测试项目打开浏览器控制台(F12)
刷新页面,查看日志:
✅ [报价组件] 加载产品列表完成: 2 个产品
🔄 [报价组件] 未找到报价数据,自动生成报价... 产品数量: 2
📊 [报价生成] 产品"主卧"价格检查: {quotationPrice: 0, productId: "xxx", ...}
⚠️ 产品"主卧"价格为0,重新计算...
💰 [计算基础价格] 输入参数: {priceLevel: "一级", projectType: "家装", ...}
💰 [计算基础价格] getBasePrice返回: 12800
✅ 重新计算价格: 12800
✅ 产品"主卧"价格已更新到Product表: 12800
📊 [报价生成] 产品"厨房"价格检查: {quotationPrice: 0, productId: "yyy", ...}
⚠️ 产品"厨房"价格为0,重新计算...
💰 [计算基础价格] 输入参数: {priceLevel: "一级", projectType: "家装", ...}
💰 [计算基础价格] getBasePrice返回: 12800
✅ 重新计算价格: 12800
✅ 产品"厨房"价格已更新到Product表: 12800
✅ 报价空间生成完成: 2 个唯一空间 (原始产品: 2 个)
💾 [报价管理器] 开始保存报价数据...
✅ [报价管理器] 报价数据已保存,空间数: 2
📊 [订单分配] 报价数据更新: {total: 25600, spaces: [...]}
✅ 报价数据已同步到项目对象 {total: 25600, spaces: 2}
💰 [订单分配] 总报价更新: 25600
✅ 总报价已同步到项目对象: 25600
刷新页面:
检查Parse Dashboard:
Product {
objectId: "xxx",
productName: "主卧",
productType: "bedroom",
project: Pointer<Project>,
quotation: {
price: 12800, // 产品价格
basePrice: 12800, // 基础价格
priceLevel: "一级",
currency: "CNY",
status: "draft"
},
space: {
spaceName: "主卧",
spaceType: "平层",
styleLevel: "基础风格组",
area: 0,
priority: 5,
complexity: "medium"
},
status: "not_started"
}
Project.data.quotation = {
spaces: [
{
name: "主卧", // 对应 Product.productName
productId: "xxx", // 对应 Product.objectId
processes: {
modeling: { // 建模阶段10%
enabled: true,
amount: 1280,
percentage: 10
},
decoration: { // 软装渲染40%
enabled: true,
amount: 5120,
percentage: 40
},
company: { // 公司分配50%
enabled: true,
amount: 6400,
percentage: 50
}
},
subtotal: 12800 // 空间小计
},
{
name: "厨房",
productId: "yyy",
processes: { /*...*/ },
subtotal: 12800
}
],
total: 25600, // 总报价
allocation: { // 项目级别分配
modeling: 2560, // 10%
decoration: 10240, // 40%
company: 12800 // 50%
},
generatedAt: Date,
validUntil: Date
}
Product → Quotation.spaces
Product.productName → space.nameProduct.objectId → space.productIdProduct.quotation.price → 用于计算 space.processes 和 space.subtotalQuotation → Project.data
this.quotation → project.data.quotationsaveQuotationToProject() 保存Quotation → StageOrderComponent
quotationChange.emit(this.quotation)totalChange.emit(this.quotation.total)generateQuotationFromProducts()QUOTATION_ZERO_FIX.md - 修复报价为¥0的问题
QUOTATION_SYNC_FIX.md - 修复报价同步问题
AUTO_GENERATE_QUOTATION_FIX.md(本文档)- 修复自动生成报价
修复完成时间:2024年11月15日 10:50 修复人员:Cascade AI Assistant