ERPNext v14客户端脚本:报价项Amount计算函数覆盖失效求助
解决ERPNext v14报价项Amount自定义计算被覆盖的问题
问题原因
ERPNext默认会在qty、rate字段变更时自动调用内置的calculate_amount方法,重新计算amount为qty*rate,这个内置方法的执行时机晚于你的自定义脚本,导致你的计算结果被覆盖。
修改后的代码
function calculateAmount(frm, cdt, cdn) { var item = locals[cdt][cdn]; // 避免字段为空时计算出NaN var length = item.length || 0; var width = item.width || 0; var quantity = item.qty || 0; var rate = item.rate || 0; var amount = length * width * quantity * rate; // 直接修改本地数据并刷新字段,跳过系统默认计算 item.amount = amount; frm.refresh_field('items'); } frappe.ui.form.on('Quotation Item', { length: function(frm, cdt, cdn) { calculateAmount(frm, cdt, cdn); }, width: function(frm, cdt, cdn) { calculateAmount(frm, cdt, cdn); }, qty: function(frm, cdt, cdn) { calculateAmount(frm, cdt, cdn); }, rate: function(frm, cdt, cdn) { calculateAmount(frm, cdt, cdn); }, // 阻止系统默认的amount计算逻辑 amount: function(frm, cdt, cdn) { // 空函数覆盖默认绑定的calculate_amount方法 } });
关键改动说明
- 添加rate字段监听:rate变化也会触发自定义计算,确保所有影响amount的字段都被覆盖。
- 直接修改本地数据+刷新字段:相比
frappe.model.set_value,直接修改item.amount后刷新整个items表格,能更快更新UI,减少被系统默认逻辑覆盖的概率。 - 覆盖amount字段默认事件:ERPNext的
amount字段默认绑定了内置计算方法,通过定义空的amount事件处理函数,阻止系统默认计算逻辑执行。 - 字段值容错处理:给字段加上
|| 0,避免字段为空时计算出无效值。
额外注意事项
- 确保
Quotation Item文档类型中已添加length和width字段,且字段类型为数值型(Float/Int)。 - 若使用新版ERPNext,可替换
locals[cdt][cdn]为frm.get_doc(cdt, cdn),写法更规范:var item = frm.get_doc(cdt, cdn);
内容的提问来源于stack exchange,提问作者imo
相关产品推荐
相关产品推荐

