跨公司采购最容易被低估的,不是自动生成对方公司的单据,而是生成以后能不能双向追得回来。企业版在 sale_purchase_inter_company_rules 里做的重点,正是让采购单和销售单之间形成可回溯、可防环的文档对链。
从采购侧看,button_approve() 审批通过后才会在目标公司生成销售单;从销售侧看,_action_confirm() 也可能反向生成采购单。于是系统必须同时维护两种引用:让对方公司知道“这张单来自谁”,也让原公司知道“我已经在对面生成了什么”。partner_ref 和 client_order_ref 的存在,就是为了让双方不是各自孤立。
但只做回链还不够。跨公司单据如果没有防环,SO 生成 PO,PO 又回头生成 SO,很快就会进入死循环。所以源码里会给自动生成的单据打上 auto_generated,并用公司参数 intercompany_document_state 控制生成后是保持草稿还是进一步自动确认/过账。这里的重点不是自动化越多越好,而是自动化必须被拦在受控状态机里。
这条链还包含公司、用户和权限切换。单据不是以当前审批人的身份直接写进对方公司,而是切到对方公司的 intercompany user,再在那个公司上下文里落单。也就是说,回链信息和权限切换是绑在一起设计的。
因此,跨公司采购真正要守住的是四件事:源单和目标单之间能互认;自动生成的单据不会再次触发同类生成;目标公司确认策略可控;以及整个过程始终发生在正确的公司身份下。只做到“自动建单”,远远不够。
遇到链路异常时,最应该查的是引用字段有没有写回、auto_generated 是否被自定义逻辑覆盖、intercompany_document_state 配置是否超出了团队预期。很多所谓“跨公司自动单失控”,根因其实是防环机制被破坏。
DISCUSSION
评论区