“为什么同一张采购单,有的人看到超预算提示,有的人看不到?”这类问题通常不是前端缓存,而是采购、预算和权限三条链一起在起作用。企业版采购预算本来就不是无条件提醒。
第一道边界在预算读取权限。采购行要先通过 _compute_budget_line_ids() 找到可用的预算行,但这件事建立在当前用户能读到相关 budget.analytic / budget line 的前提上。你如果把采购权限和预算可见性拆得很开,采购页面上的行为就会出现“同单不同视角”。
第二道边界在多公司预算共享。预算行不一定绑定具体公司;有些预算会以 company_id 为空的方式做共享。这样一来,采购行匹配时并不是单纯看 po.company_id = budget.company_id,而是在公司专属预算和共享预算之间同时判断。多公司环境里,这正是很多“预算明明存在却没命中”的根源。
第三道边界在剩余未收数量。_compute_budget_line_ids() 和超预算计算都不想为已经彻底履约的采购数量继续占预算。所以当 product_qty - qty_received <= 0 时,采购行就可能不再继续维持原来的预算占用判断。这让业务侧感觉提示在“消失”,但从预算语义看它只是跟着履约状态收口。
因此,采购预算提醒本质上是采购执行事实、预算可见范围和公司边界共同决定的结果。它不是采购模块单方面发出的 UI 警告,而是预算模块授权后的业务判断。
排查顺序建议也要按链路来:先确认用户是否看得到预算对象;再确认预算是公司专属还是共享;最后看采购行还有没有未收数量。把这三件事拆开核对,往往比盯着“为什么这次没弹红字”更有效。
DISCUSSION
评论区