You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 05:36:02