采购完整排查手册

本文围绕一个采购单号,从创建、审核、支付、出库、配送、入库、关闭、退货一路排查。适用于“采购单状态不对”“支付成功但订单未推进”“采购入库数量异常”“关闭/退款没同步”等问题。

适用场景

  • 服务站采购单无法提交、无法支付、无法关闭。
  • 订单中心审核通过/驳回后 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_invoicet_scm_pu_invoice_info
  • 库存流水:t_scm_inventoryt_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

主流程排查

  1. 定位采购主单。
  • 用采购单号、orderIdsidt_scm_po_order
  • 记录 billStatusorderTypesrcOrderType、支付类型、总金额、创建时间。
  1. 查采购明细和数量拆分。
  • t_scm_po_order_info 看商品、采购数量、价格。
  • t_scm_po_order_info_qty 看已发、已收、已关、已退等数量。
  • 如果主单状态已完成但明细未收齐,优先怀疑回调或补偿推进异常。
  1. 查审核链路。
  • 待审核/审核中问题看 tasks/OrderCenterNotify.php 的订单中心回调。
  • 审核通过后通常应推进到待支付或待出库,取决于支付类型。
  • 审核驳回要确认状态是否为审核不通过,并且是否允许重新提交。
  1. 查支付链路。
  • 在线支付订单先查 t_scm_po_order_payinfo
  • 再查 t_scm_paymentt_scm_payment_info
  • 对照 PayCenterNotify.phppaycenter_pay_result 消费日志。
  • 支付成功但状态未推进时,重点看支付状态值、业务单号、幂等判断是否命中。
  1. 查出库和配送。
  • 待出库/配送中异常看 t_scm_po_out_info
  • 对照 DispatchCenterNotify.php 的出库、物流、自提事件。
  • 如果外部已出库但 DGJ 无记录,查 MQ 是否到达;如果 DGJ 有出库但状态没变,查状态推进条件。
  1. 查入库和库存。
  • t_scm_pu_invoicet_scm_pu_invoice_info
  • 按入库单号查库存流水 t_scm_inventoryt_scm_inventory_info
  • sid + invId/skuId + warehouse/locationt_scm_inventory_real_time
  1. 查关闭和退款。
  • t_scm_po_close_info 看整单关闭还是部分关闭。
  • 在线支付关闭要查退款结果和待退款状态。
  • 活动/秒杀订单关闭还要查活动订单、秒杀订单数量是否释放。

异常流程

  • 支付超时:采购单可能变成 12,秒杀或活动来源还要回滚锁定量。
  • 部分关闭:主单不一定直接关闭,要看剩余明细是否还有可执行数量。
  • 采购退货:可能进入 13 待仓库入库,不能按普通采购完成逻辑判断。
  • 自制订单:订单中心下发/关闭可能改变采购行,排查 ordercenter_order_sync_dgjordercenter_order_close
  • 秒杀采购:orderType = 30-Cxx-77srcOrderType = 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

改动风险和回归清单

  • 普通采购:草稿、提交、审核、挂账、出库、入库、完成。
  • 在线支付采购:待支付、支付成功、超时取消、退款。
  • 采购退货:退货申请、仓库入库、退款、关闭。
  • 活动采购:赠品活动、秒杀活动转采购单。
  • 外部回调:订单中心、支付中心、配送中心重复回调和延迟回调。