You need to enable JavaScript to run this app. Frappe自定义字段变更后如何触发Quotation全局金额的默认计算逻辑
优惠活动
大模型
产品
解决方案
定价
更多

Frappe自定义字段变更后如何触发Quotation全局金额的默认计算逻辑

问题根因

你当前编写的脚本仅完成了子表行项目的rate、amount值更新与子表UI刷新,没有触发Quotation主文档内置的全量金额汇总计算逻辑。
系统默认的汇总计算本来是监听标准字段(如qty、rate)的变更事件自动触发的,你手动修改子表行字段值时,没有走系统的标准事件链路,因此net_total、grand_total这类顶层汇总值不会自动联动更新。

正确的内置触发方式
  • 负责计算Quotation全局汇总值的内置函数,是挂载在主文档frm对象上的_calculate_totals方法,该函数会自动遍历所有行项目的金额、税费、折扣字段,完成net_total、grand_total等所有关联汇总值的重算与UI刷新,不需要手动重写汇总规则。
  • 在自定义字段变更、完成行项目金额计算的逻辑末尾,直接调用frm._calculate_totals(),即可对齐系统默认的联动行为。
  • 建议保留原有refresh_field("items")逻辑,但要将其放在汇总计算调用之后,避免出现UI渲染顺序的异常。
修正后的可用脚本
frappe.ui.form.on("Quotation Item", "paint", function(frm, doctype, name) {
  let row = locals[doctype][name];
  // 用内置flt做数值兜底,避免空值参与计算产生NaN
  row.rate = flt(row.labour) + flt(row.trim) + flt(row.paint) + flt(row.spares);
  row.amount = flt(row.rate) * flt(row.qty);

  // 触发内置全局金额汇总计算
  frm._calculate_totals();
  // 刷新子表UI展示
  refresh_field("items");
});
额外注意事项

如果其他新增的自定义字段(如labour、trim、spares)的变更也会影响行项目金额,需要把相同的计算与触发逻辑,挂到这些字段的变更事件上,避免用户修改其他关联字段时,全局汇总值不更新。


内容的提问来源于stack exchange,提问作者Redgren Grumbholdt

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.11.04 11:15:00