采购完整排查手册
本文围绕一个采购单号,从创建、审核、支付、出库、配送、入库、关闭、退货一路排查。适用于“采购单状态不对”“支付成功但订单未推进”“采购入库数量异常”“关闭/退款没同步”等问题。
适用场景
- 服务站采购单无法提交、无法支付、无法关闭。
- 订单中心审核通过/驳回后 DGJ 状态未更新。
- 支付中心回调成功,但采购单仍待支付。
- 调拨/配送已发货,但采购单仍待出库或配送中。
- 采购入库后库存、报表、明细数量不一致。
- 秒杀、赠品活动、自制订单转采购单后状态异常。
入口文件
- PC 采购:
application/controllers/scm/InvPo.php - App 采购 code:
application/config/appapis.php - 老采购服务:
application/service/scm/InvPoService.php - 新采购服务:
application/Services/PoOrders/PoOrderSer.php - 订单中心回调:
application/controllers/tasks/OrderCenterNotify.php - 支付中心回调:
application/controllers/tasks/PayCenterNotify.php - 配送中心回调:
application/controllers/tasks/DispatchCenterNotify.php - 库存写入:
application/Services/Storage/InventorySer.php
核心表
- 采购主单:
t_scm_po_order - 采购扩展:
t_scm_po_order_ext - 采购明细:
t_scm_po_order_info - 明细数量状态:
t_scm_po_order_info_qty - 支付明细:
t_scm_po_order_payinfo - 采购出库:
t_scm_po_out_info - 关闭明细:
t_scm_po_close_info - 采购入库:
t_scm_pu_invoice、t_scm_pu_invoice_info - 库存流水:
t_scm_inventory、t_scm_inventory_info - 实时库存:
t_scm_inventory_real_time
状态和枚举
- 采购状态:
PoOrderEnums::BILLSTATUS_* - 采购类型:
PoOrderEnums::ORDERTYPE_* - 来源类型:
PoOrderEnums::SRC_ORDER_TYPE_* - 支付类型:
PAYMENT_TYPE_NORMAL线下挂账,PAYMENT_TYPE_ONLINE在线支付。 - 交易类型:采购订单
170401,采购退货170402,采购关闭170503,采购出库170410,采购入库150501。
主流程排查
- 定位采购主单。
- 用采购单号、
orderId、sid查t_scm_po_order。 - 记录
billStatus、orderType、srcOrderType、支付类型、总金额、创建时间。
- 查采购明细和数量拆分。
- 查
t_scm_po_order_info看商品、采购数量、价格。 - 查
t_scm_po_order_info_qty看已发、已收、已关、已退等数量。 - 如果主单状态已完成但明细未收齐,优先怀疑回调或补偿推进异常。
- 查审核链路。
- 待审核/审核中问题看
tasks/OrderCenterNotify.php的订单中心回调。 - 审核通过后通常应推进到待支付或待出库,取决于支付类型。
- 审核驳回要确认状态是否为审核不通过,并且是否允许重新提交。
- 查支付链路。
- 在线支付订单先查
t_scm_po_order_payinfo。 - 再查
t_scm_payment、t_scm_payment_info。 - 对照
PayCenterNotify.php的paycenter_pay_result消费日志。 - 支付成功但状态未推进时,重点看支付状态值、业务单号、幂等判断是否命中。
- 查出库和配送。
- 待出库/配送中异常看
t_scm_po_out_info。 - 对照
DispatchCenterNotify.php的出库、物流、自提事件。 - 如果外部已出库但 DGJ 无记录,查 MQ 是否到达;如果 DGJ 有出库但状态没变,查状态推进条件。
- 查入库和库存。
- 查
t_scm_pu_invoice、t_scm_pu_invoice_info。 - 按入库单号查库存流水
t_scm_inventory、t_scm_inventory_info。 - 按
sid + invId/skuId + warehouse/location查t_scm_inventory_real_time。
- 查关闭和退款。
- 查
t_scm_po_close_info看整单关闭还是部分关闭。 - 在线支付关闭要查退款结果和待退款状态。
- 活动/秒杀订单关闭还要查活动订单、秒杀订单数量是否释放。
异常流程
- 支付超时:采购单可能变成
12,秒杀或活动来源还要回滚锁定量。 - 部分关闭:主单不一定直接关闭,要看剩余明细是否还有可执行数量。
- 采购退货:可能进入
13待仓库入库,不能按普通采购完成逻辑判断。 - 自制订单:订单中心下发/关闭可能改变采购行,排查
ordercenter_order_sync_dgj和ordercenter_order_close。 - 秒杀采购:
orderType = 30-Cxx-77,srcOrderType = 13,必须串查t_flash_order。
常用 SQL 模板
把表名、字段名按实际库结构调整后执行:
-- 采购主单
select * from t_scm_po_order where sid = :sid and billNo = :bill_no;
-- 采购明细和数量状态
select * from t_scm_po_order_info where sid = :sid and orderId = :order_id;
select * from t_scm_po_order_info_qty where sid = :sid and orderId = :order_id;
-- 支付和付款单
select * from t_scm_po_order_payinfo where sid = :sid and orderId = :order_id;
select * from t_scm_payment where sid = :sid and srcOrderNo = :bill_no;
select * from t_scm_payment_info where sid = :sid and srcOrderNo = :bill_no;
-- 关闭、出库、入库
select * from t_scm_po_close_info where sid = :sid and orderId = :order_id;
select * from t_scm_po_out_info where sid = :sid and orderId = :order_id;
select * from t_scm_pu_invoice where sid = :sid and srcBillNo = :bill_no;
常用 rg 命令
rg -n "function .*Po|purOrderAdd|purCloseOrder|ORDERTYPE_FLASH_ORDER" application/controllers application/service application/Services
rg -n "ordercenter_order_audit|ordercenter_order_close|ordercenter_order_sync_dgj" application/controllers/tasks application/KzData/Enums
rg -n "paycenter_pay_result|PoOrderPayInfo|SCM_PO_ORDER_PAYINFO" application/controllers/tasks application/Services application/models
rg -n "SCM_PU_INVOICE|TRANSTYPE_PU_PURCHASE|changeInventoryQty" application
改动风险和回归清单
- 普通采购:草稿、提交、审核、挂账、出库、入库、完成。
- 在线支付采购:待支付、支付成功、超时取消、退款。
- 采购退货:退货申请、仓库入库、退款、关闭。
- 活动采购:赠品活动、秒杀活动转采购单。
- 外部回调:订单中心、支付中心、配送中心重复回调和延迟回调。