2026/10/14 3:18:53

ERP采购模块实施指南:从请购到付款的状态机配置与避坑

ERP采购模块实施指南:从请购到付款的状态机配置与避坑 简介这份SAGE-ERP采购模块操作手册面向企业采购、仓储及财务岗位人员以及正在熟悉SAGE-ERP系统的实施与运维人员帮助解决采购流程中基础数据维护、订单执行、收货退货等环节的操作规范问题。资源包内含1个doc文档约220KB以图文步骤形式梳理采购全流程要点。内容覆盖产品浓度管理设置、供应商信息维护与新建、供应商报价的有效期与审核、折百与不折百两类采购订单的数量和价格计算逻辑以及采购收货时收货成本因子与浓度的对应关系、无收货来源退货的处理方式等关键知识点。手册将各环节紧密串联便于读者对照系统界面逐步操作快速掌握折百与非折百场景下的差异降低采购执行中的差错风险。目前已有209人学习下载适合需要系统梳理SAGE-ERP采购操作或查漏补缺的从业者参考。1. 采购模块为什么总在“最后一公里”翻车很多团队上 ERP 或进销存销售、库存、财务都跑通了唯独采购模块上线后怨声载道请购单走到一半卡住采购订单下了却收不了货发票和入库单对不上月底对账全靠 Excel 手工补。问题往往不在系统本身而在采购这条链路的业务分支太多——请购、询价、比价、订单、收货、退货、暂估、发票校验每一步都有状态机和审批流参数配错一个后面全乱。这篇笔记围绕采购模块的操作手册思路展开把“从请购到付款”的主线拆成可复现的配置步骤、参数说明和排错方法。适合正在做采购模块实施、二次开发或日常运维的工程师也适合刚接手采购业务、需要快速摸清单据流转关系的新手。读完你应该能独立配出一条能跑通的采购流程并知道每个环节最容易踩的坑在哪。2. 采购主线的单据流转与状态机设计采购不是一张单子而是一组单据按状态推进。理解状态机比背菜单重要得多。2.1 从请购到入库五张核心单据的职责边界常见做法是把采购主线拆成五类单据每类只干一件事单据作用关键状态下游动作请购单内部提出需求草稿/审批中/已批准/已关闭转采购订单询价单向供应商询价草稿/已发出/已报价/已比价生成比价结果采购订单对供应商的正式承诺草稿/已审核/部分收货/已收货/已关闭收货、开票收货单记录实物入库草稿/已过账/已冲销更新库存、触发暂估采购发票记录应付草稿/已校验/已过账生成应付、核销暂估这五张单据的流转关系是请购单批准后转采购订单采购订单审核后可以收货收货过账后产生暂估应付发票校验后冲回暂估、形成正式应付。任何一步状态不对下一步就推不动。我一般会先画一张状态流转图贴在实施文档里让业务方确认“什么状态下能做什么”。比如采购订单只有“已审核”才能收货“已关闭”不能再收货也不能再开票。这个边界不确认后面测试全是扯皮。2.2 状态机配置三个必须锁死的字段状态机落地到系统里核心是三个字段的控制逻辑单据状态字段控制当前单据处于哪个阶段通常用枚举值。不要用布尔值表示“是否审核”因为采购订单有“部分收货”这种中间态。可执行动作字段根据状态决定按钮是否可用。比如“收货”按钮只在订单状态为“已审核”或“部分收货”时亮起。数量控制字段已收货数量、已开票数量、已请购转单数量。这些字段决定“还能收多少”“还能开多少票”。下面是一个简化的状态判断逻辑用 Python 伪代码表示# 采购订单可收货判断 def can_receive(order): # 状态必须是已审核或部分收货 if order.status not in (APPROVED, PARTIAL_RECEIVED): return False, 订单状态不允许收货 # 已收货数量不能超过订单数量 if order.received_qty order.order_qty: return False, 订单已全部收货 # 订单未关闭 if order.is_closed: return False, 订单已关闭 return True, 可以收货 # 参数说明 # order.status订单状态枚举APPROVED 表示已审核 # order.received_qty累计已收货数量每次收货过账后累加 # order.order_qty订单原始数量不允许修改变更走订单变更单 # order.is_closed手工关闭标记关闭后不可逆这段逻辑的关键在于数量控制必须用“累计已收”而不是“本次收货”否则并发收货时会超收。很多系统翻车就翻在这里——两个人同时点收货各自校验时都发现没超过账后加起来超了。解决办法是在过账时加行级锁或数据库唯一约束。2.3 审批流配置请购单和订单的审批差异请购单和采购订单的审批逻辑不一样不能套用同一个模板。请购单审批关注“要不要买”通常按部门、金额、物料类别走审批。比如某公司规定部门内请购金额小于 5000 由部门经理批5000 到 20000 加财务批超过 20000 加总经理批。这种多级审批在系统里通常用条件分支实现。采购订单审批关注“向谁买、什么价”通常按供应商、金额、是否超预算走审批。订单审批往往还要关联比价结果没有比价记录不允许提交审批。配置审批流时我一般会先确认三件事审批层级是几级、每级的触发条件是什么、审批人不在时有没有代理规则。这三件事不确认配出来的审批流一定被业务方打回。3. 采购订单的创建、变更与关闭操作采购订单是采购模块的核心单据创建、变更、关闭三个动作各有讲究。3.1 手工创建与请购转单两种入口的字段差异采购订单有两个入口手工创建和请购单转单。手工创建时所有字段都要填请购转单时部分字段从请购单带过来不能改。常见做法是请购单转单时物料、数量、需求日期从请购单带出供应商、价格、交货条款由采购员补充。如果请购单已经指定供应商则供应商字段锁定。下面是一个请购转单的字段映射示例# 请购单转采购订单的字段映射 def convert_pr_to_po(pr_line): po_line { material_code: pr_line.material_code, # 物料编码直接带出 quantity: pr_line.approved_qty, # 批准数量不是申请数量 need_date: pr_line.need_date, # 需求日期可调整 supplier_code: pr_line.suggested_supplier, # 建议供应商可为空 price: None, # 价格必须采购员填写 tax_code: pr_line.default_tax_code, # 默认税码可改 source_pr_no: pr_line.pr_no, # 来源请购单号用于追溯 } # 如果请购单指定了供应商则锁定供应商字段 if pr_line.suggested_supplier: po_line[supplier_locked] True return po_line # 参数说明 # pr_line.approved_qty请购单批准数量不是申请数量避免超买 # pr_line.suggested_supplier请购人建议的供应商采购员可参考 # source_pr_no来源单号用于后续追溯“这笔采购是谁提的”这里有个容易忽略的点请购单的“申请数量”和“批准数量”可能不一样。审批人可能砍掉一部分数量。转单时必须用批准数量否则采购员会按申请数量下单导致超买。3.2 订单变更哪些字段能改哪些必须走变更单采购订单审核后不是所有字段都能直接改。常见规则是可直接修改交货日期、交货地址、备注、内部参考号。必须走变更单数量、价格、供应商、物料编码。完全不可改订单号、创建日期、来源请购单号。变更单的本质是生成一个订单版本保留历史版本用于审计。很多系统用“订单行版本号”实现每次变更版本号加一旧版本标记为历史新版本生效。我见过最坑的情况是订单已收货一部分采购员直接改数量导致已收货数量大于订单数量系统报错但数据已经脏了。正确做法是已收货的订单行不允许减少数量只能增加或关闭剩余数量。3.3 订单关闭手工关闭与自动关闭的触发条件订单关闭分两种手工关闭和自动关闭。手工关闭用于“不再需要收货或开票”的场景比如供应商失联、需求取消。关闭后订单不能再收货、不能再开票但已收货部分仍可开票。自动关闭通常由系统定时任务触发条件一般是订单已全部收货且已全部开票或者订单超过一定期限未收货。自动关闭的条件要配得保守一点否则容易误关。下面是一个自动关闭的检查逻辑# 采购订单自动关闭检查 def auto_close_orders(): # 查询所有未关闭的已审核订单 orders query_orders(statusAPPROVED, is_closedFalse) for order in orders: # 条件1全部收货且全部开票 if order.received_qty order.order_qty and order.invoiced_qty order.order_qty: close_order(order, reason全部收货且全部开票) continue # 条件2超过180天未收货且未开票 if days_since(order.approve_date) 180 and order.received_qty 0: close_order(order, reason超期未收货) continue # 参数说明 # days_since计算从审核日期到今天的自然日天数 # 180天是常见阈值可根据业务调整但不要低于90天 # 自动关闭前建议先发通知给采购员给一个申诉窗口自动关闭一定要留通知和申诉窗口。我见过系统半夜自动关了一堆订单采购员第二天来发现收不了货供应商已经发货了最后只能手工改数据库血泪经验。4. 收货、退货与暂估的账务处理收货是采购模块和库存模块的交汇点也是账务处理的起点。4.1 收货过账库存更新与暂估应付的生成收货过账时系统要做两件事更新库存数量生成暂估应付。库存更新逻辑收货单过账后对应物料的库存数量增加库存价值按采购订单价格暂估。如果启用了批次或序列号管理还要生成批次记录。暂估应付逻辑按收货数量和采购订单价格生成一笔暂估应付挂在供应商名下。这笔暂估应付在发票校验后冲回。下面是一个收货过账的简化逻辑# 收货过账处理 def post_goods_receipt(gr_line): # 1. 更新库存 inventory get_inventory(gr_line.material_code, gr_line.warehouse_code) inventory.qty gr_line.received_qty inventory.value gr_line.received_qty * gr_line.po_price inventory.save() # 2. 生成暂估应付 accrual AccrualPayable( supplier_codegr_line.supplier_code, po_nogr_line.po_no, gr_nogr_line.gr_no, amountgr_line.received_qty * gr_line.po_price, tax_amountgr_line.received_qty * gr_line.po_price * gr_line.tax_rate, statusOPEN ) accrual.save() # 3. 更新采购订单已收货数量 po_line get_po_line(gr_line.po_no, gr_line.po_line_no) po_line.received_qty gr_line.received_qty po_line.save() # 参数说明 # gr_line.po_price采购订单价格不是最新采购价 # gr_line.tax_rate税率从采购订单带出 # accrual.statusOPEN 表示暂估未冲回发票校验后置为 CLOSED这里的关键是暂估应付必须按订单价格不能按最新采购价或标准价。否则发票校验时冲回金额对不上财务对账会疯。4.2 退货处理红字收货单与库存回退退货分两种收货前退货和收货后退货。收货前退货直接关闭收货单行不产生库存和暂估。收货后退货生成红字收货单库存减少暂估应付冲回。红字收货单的数量是负数过账逻辑和正常收货相反。退货时要注意如果发票已经校验退货还要冲回应付和发票。这个链路更长建议退货前先确认发票状态。4.3 暂估与发票校验的差异处理暂估和发票校验的差异主要来自价格差异和数量差异。价格差异订单价格是 100发票价格是 105差异 5 要记入价格差异科目。数量差异订单数量 100收货 100发票只开 90差异 10 要挂起等供应商补票或调整。常见做法是发票校验时系统自动比对订单、收货单、发票三方的数量和价格差异在容忍范围内的自动过账超出容忍范围的挂起人工处理。容忍范围一般按金额或百分比设置比如单价差异不超过 1% 或 100 元。这个参数要财务确认不能拍脑袋。5. 采购模块避坑与排查清单采购模块的坑大多集中在状态、数量、审批和账务四类。下面是我踩过的五个典型问题。5.1 请购单转单后数量对不上现象请购单批准数量 100转成采购订单后数量变成 120。原因转单逻辑用了“申请数量”而不是“批准数量”或者请购单有多个批准版本转单时取了旧版本。解决转单时强制取最新批准版本的批准数量并在转单日志里记录来源版本号。测试时要用“部分批准”的场景验证。5.2 采购订单已收货但收不了货现象订单状态是“已审核”已收货数量 0但点收货提示“订单已关闭”。原因订单被自动关闭任务误关或者手工关闭后没有回退。解决检查订单关闭原因和关闭时间。如果是自动关闭调整自动关闭阈值如果是手工关闭走订单重开流程。重开要加审批不能随便开。5.3 发票校验时提示“暂估不存在”现象收货已过账但发票校验时找不到对应的暂估记录。原因暂估记录按“订单号行号”匹配但收货单的行号和订单行号不一致或者收货单被冲销后暂估未冲回。解决检查收货单和订单的行号映射关系确保一一对应。冲销收货单时必须同步冲销暂估。建议在收货过账和冲销的逻辑里加事务保证库存、暂估、订单数量三者一致。5.4 审批流卡在某一级不动现象请购单提交后审批流停在“部门经理”一级审批人看不到待办。原因审批人配置为空或者审批人离职后没有代理规则或者审批条件不满足导致流程无法推进。解决检查审批人配置和代理规则。建议加一个“审批流监控”页面能看到每张单据当前卡在哪一级、审批人是谁、卡了多久。超过 24 小时未处理的自动提醒。5.5 收货过账后库存数量对但金额不对现象收货 100 个库存数量 100 正确但库存金额是 0 或负数。原因采购订单价格为 0 或为空或者税率配置错误导致金额计算异常。解决收货前校验订单价格必须大于 0。如果业务允许 0 价格采购比如赠品要单独配置 0 价格处理逻辑不能直接过账。税率要在订单上明确不能依赖默认值。6. 用对账报表验证采购链路是否跑通配完采购流程怎么验证它真的跑通了我的习惯是跑一遍“从请购到付款”的完整链路然后用三张报表交叉验证。第一张是采购订单执行明细表看每张订单的订购数量、已收货数量、已开票数量、未收货数量、未开票数量。这张表能发现数量不一致的问题。第二张是暂估应付明细表看每笔暂估的来源收货单、金额、是否已冲回。这张表能发现暂估和发票校验不匹配的问题。第三张是采购价格差异表看订单价格和发票价格的差异按供应商和物料汇总。这张表能发现价格配置错误或供应商乱报价的问题。三张报表的数据来源要一致都从订单、收货单、发票三张主表取数不能各取各的。我一般会写一个对账脚本每天定时跑发现差异自动发邮件。-- 采购订单执行明细对账查询 SELECT po.po_no, po.material_code, po.order_qty, COALESCE(gr.received_qty, 0) AS received_qty, COALESCE(inv.invoiced_qty, 0) AS invoiced_qty, po.order_qty - COALESCE(gr.received_qty, 0) AS unreceived_qty, po.order_qty - COALESCE(inv.invoiced_qty, 0) AS uninvoiced_qty FROM po_line po LEFT JOIN ( SELECT po_no, po_line_no, SUM(received_qty) AS received_qty FROM gr_line WHERE status POSTED GROUP BY po_no, po_line_no ) gr ON po.po_no gr.po_no AND po.line_no gr.po_line_no LEFT JOIN ( SELECT po_no, po_line_no, SUM(invoiced_qty) AS invoiced_qty FROM invoice_line WHERE status POSTED GROUP BY po_no, po_line_no ) inv ON po.po_no inv.po_no AND po.line_no inv.po_line_no WHERE po.status APPROVED AND (po.order_qty ! COALESCE(gr.received_qty, 0) OR po.order_qty ! COALESCE(inv.invoiced_qty, 0)); -- 参数说明 -- status POSTED只统计已过账的收货和发票草稿不算 -- COALESCE处理 NULL 值避免未收货时显示 NULL -- 最后 WHERE 条件只查有差异的行方便快速定位问题这个查询跑出来如果有数据说明存在“订单数量与收货或开票不一致”的情况。常见原因是部分收货后订单被关闭或者发票分次校验。需要逐条确认是业务正常还是数据异常。对账报表的价值在于它不依赖业务人员的记忆直接用数据说话。我见过太多“我以为没问题”最后变成“月底对账差几十万”的案例。每天跑一次对账比月底加班强。最后说一个我自己的习惯每次配完采购流程先不急着上线而是自己手工跑三遍完整链路——正常收货、部分收货后退货、收货后发票价格差异。这三遍跑通基本能覆盖 80% 的日常场景。剩下的 20% 靠对账报表兜底。希望帮到你。本文还有配套的精品资源点击获取