现象:
现象:
QuotationEditorComponent (报价组件)
↓ 计算报价
calculateTotal() → this.quotation.total = xxx
↓ 发送事件
quotationChange.emit(this.quotation)
totalChange.emit(this.quotation.total)
↓ 父组件接收
StageOrderComponent.onQuotationChange(quotation)
StageOrderComponent.onTotalChange(total)
↓ ❌ 问题:只更新了本地变量,没有同步到项目对象
this.quotation = quotation
this.quotation.total = total
↓ 保存时
saveDraft() / submitForOrder()
data.quotation = this.quotation // ← 保存到项目
await this.project.save()
↓ 尾款阶段读取
StageAftercareComponent.getQuotationTotalAmount()
const quotationTotal = project.data.quotation.total // ← 读取报价总金额
在 StageOrderComponent 中:
接收报价数据(第785-821行):
onQuotationChange(quotation: any): void {
this.quotation = quotation; // ✅ 更新本地变量
// ❌ 但没有同步到 project.data.quotation
}
onTotalChange(total: number): void {
this.quotation.total = total; // ✅ 更新本地变量
// ❌ 但没有同步到 project.data.quotation
}
保存时机延迟:
this.quotation 保存到 project.data.quotation尾款阶段获取数据(stage-aftercare.component.ts 第708-718行):
// 使用订单模块的报价总金额作为总金额
const quotationTotal = this.getQuotationTotalAmount(); // ← 从 project.data.quotation.total 读取
const chooseTotal = quotationTotal > 0 ? quotationTotal : voucherPaidSum;
this.finalPayment = {
totalAmount: chooseTotal, // ← 如果报价为0,则使用凭证金额
paidAmount: choosePaid,
remainingAmount: chooseRemain,
// ...
};
修改文件:stage-order.component.ts
修改的方法:
onQuotationChange() - 报价数据变化时实时同步onQuotationChange(quotation: any): void {
console.log('📊 [订单分配] 报价数据更新:', quotation);
this.quotation = quotation;
// 🔥 关键修复:立即保存到项目数据,确保数据不丢失
if (this.project && quotation) {
const data = this.project.get('data') || {};
data.quotation = quotation;
this.project.set('data', data);
console.log('✅ 报价数据已同步到项目对象', {
total: quotation.total,
spaces: quotation.spaces?.length || 0
});
}
this.cdr.markForCheck();
}
onTotalChange() - 总价变化时实时同步onTotalChange(total: number): void {
console.log('💰 [订单分配] 总报价更新:', total);
this.quotation.total = total;
// 🔥 关键修复:同步更新项目数据中的总价
if (this.project && this.quotation) {
const data = this.project.get('data') || {};
if (data.quotation) {
data.quotation.total = total;
this.project.set('data', data);
console.log('✅ 总报价已同步到项目对象:', total);
}
}
this.cdr.markForCheck();
}
project.data.quotationproject.data.quotation.total 读取正确的报价总金额QuotationEditorComponent
↓ 计算报价
calculateTotal() → this.quotation.total = xxx
↓ 发送事件
quotationChange.emit(this.quotation)
totalChange.emit(this.quotation.total)
↓ 父组件接收
StageOrderComponent.onQuotationChange(quotation)
↓ ✅ 立即同步到项目对象
project.data.quotation = quotation
project.set('data', data)
↓ 尾款阶段读取
StageAftercareComponent.getQuotationTotalAmount()
↓ ✅ 读取到正确的报价总金额
const quotationTotal = project.data.quotation.total
查看控制台日志:
📊 [订单分配] 报价数据更新: {total: 12800, spaces: [...]}
✅ 报价数据已同步到项目对象 {total: 12800, spaces: 3}
💰 [订单分配] 总报价更新: 12800
✅ 总报价已同步到项目对象: 12800
验证页面显示正确的总价
查看控制台日志:
📊 从项目数据加载订单总金额: 12800
✅ 尾款数据加载完成: {totalAmount: 12800, paidAmount: 0, ...}
saveDraft() 和 submitForOrder() 仍然会保存报价数据订单分配阶段报价组件事件接收
onQuotationChange(), onTotalChange() 等方法尾款结算数据获取降级方案
aftercare-data.service.tsProjectPayment 表改为从 Project.data.payments 读取onQuotationChange() 中添加实时同步逻辑onTotalChange() 中添加实时同步逻辑修复完成时间:2024年11月15日 10:30 修复人员:Cascade AI Assistant