采购、采购退货与采购入库

模块职责

采购模块负责服务站向供应商、云仓、活动、订单中心等来源采购商品。它覆盖草稿、提交、审核、在线支付、待出库、配送、完成、关闭、退货、入库和补偿。

主要入口

  • PC 老采购入口:application/controllers/scm/InvPo.php
  • 新采购入口:application/controllers/po/PurchaseOrder.php
  • 采购购物车:application/controllers/po/Cart.php
  • 采购退货:application/controllers/po/AfterSale.php
  • 采购关闭和任务:application/controllers/tasks/PoCloseOrder.php
  • 订单中心 MQ 消费:application/controllers/tasks/OrderCenterNotify.php
  • 支付中心 MQ 消费:application/controllers/tasks/PayCenterNotify.php

关键 Service

  • application/service/scm/InvPoService.php:采购列表、详情、待办、关闭可操作性、退货详情展示。
  • application/Services/PoOrders/PoOrderSer.php:新采购创建、校验、自制订单同步、关闭、待支付取消。
  • application/Services/PoOrders/PoOrderInfoSer.php:采购明细。
  • application/Services/PoOrders/PoOrderQuerySer.php:采购查询。
  • application/Services/PoOrders/PoMaterielSer.php:采购商品查询、物料口径。
  • application/Services/InvPo/NormalSer.php:普通采购单保存。
  • application/Services/InvPo/PoOrderReceiveSer.php:采购收货/入库相关。
  • application/Services/InvPo/PoReturnCloseSer.php:采购退货关闭。
  • application/Services/Payment/PaymentSer.php:付款业务。

关键模型

  • 主表:application/models/orders/PoOrderModel.php
  • 明细:application/models/orders/PoOrderInfoModel.php
  • 数量拆分:application/models/orders/PoOrderInfoQtyModel.php
  • 支付信息:application/models/orders/PoOrderPayInfoModel.php
  • 关闭明细:application/models/orders/PoCloseInfoModel.php
  • 采购出库:application/models/orders/PoOutInfoModel.php
  • 采购退货物流/仓库:PoReturnOrderLogisticsModel.phpPoReturnOrderWarehouseModel.php

采购单状态

状态定义在 application/KzData/Enums/PoOrderEnums.php

  • 0 草稿:只保存不提交,可编辑。
  • 1 待处理:提交后等待处理。
  • 2 审核中:进入审核流程。
  • 3 待出库:审核或支付通过后,等待仓库/供应方发货。
  • 4 配送中:已出库或配送中。
  • 5 已完成:采购履约完成。
  • 8 审核不通过:审核失败。
  • 9 已关闭:整单或业务关闭。
  • 10 待支付:在线支付单待支付。
  • 11 待退款:在线支付退货或关闭后等待退款。
  • 12 已过期:支付超时消息推送关闭订单。
  • 13 待仓库入库:采购退货单等待仓库确认入库。

常见采购类型

采购类型也在 PoOrderEnums.php

  • 30-Cxx-01:普通采购订单。
  • 30-Cxx-07:急件到付订单。
  • 30-Cxx-70:急件自提订单。
  • 30-Cxx-08:服务站预订采购。
  • 30-Cxx-05:滞销品退货。
  • 30-Cxx-06:不良品退货。
  • 30-Cxx-16:直采退货。
  • 30-Cxx-17:未发货退货。
  • 30-Cxx-75:赠品活动订单。
  • 30-Cxx-77:秒杀采购订单。

新增采购流程

PC/APP/活动提交采购
  -> InvPo::saveInvPo 或 PoOrderSer
  -> PoOrderEntry / PoOrderInfoEntryList 组装主表和明细
  -> PoOrderSer::checkOrderGoods 校验商品、数量、供应、库存、订单类型
  -> NormalOrderSaveService 保存草稿
  -> InvPo::submitInvPo 提交
  -> InvPoService / 订单中心 / OA / 支付中心推进状态

关键点:

  • 草稿只能在 BILLSTATUS_DRAFT 下编辑。
  • 保存会带上 orderTypetransType、供应商、仓库、金额、折扣、发货方式。
  • 提交后是否进入待支付,取决于 paymentType 和来源业务。
  • 在线支付单会写 PoOrderPayInfoModel,支付中心回调后再生成付款单和付款明细。

采购支付流程

采购单待支付
  -> 支付中心发送 paycenter_pay_result
  -> tasks/PayCenterNotify::paycenterPayResult
  -> 校验 payStatus == 02
  -> 生成 payment / payment_info
  -> 写 po_order_pay_info
  -> 更新采购单支付状态和后续单据状态
  -> 秒杀来源订单调用 FlashSaleSer::markPaidByPoOrder

支付中心消费者入口:

  • application/controllers/tasks/PayCenterNotify.php
  • 注册事件:paycenter_pay_resultpaycenter_pay_exceptionpaycenter_refund_resultpaycenter_baitiao_return_pay_result 等。

采购关闭流程

采购关闭常见在未发货、支付超时、活动关闭、用户主动取消、订单中心关闭等场景触发。

关闭请求
  -> InvPoService 判断是否可关闭
  -> 普通订单检查状态、发货方式、供应商、自营直发、已出库数量
  -> 写 po_close_info
  -> 更新 po_order closeStatus / billStatus
  -> 必要时发 MQ:po_close_order_confirm、normal_order_cancel
  -> 秒杀采购单释放秒杀码

特殊限制:

  • 赠品订单和赠品活动订单一般不允许普通关闭。
  • 秒杀订单不允许从普通采购明细直接关闭商品,要走秒杀生命周期。
  • 自营直发挂账订单关闭口径特殊。
  • 已进入出库、配送或完成的订单不能按待支付单方式取消。

采购退货流程

用户选择可退商品
  -> InvPo::saveOrderBack / saveOrderBack_unsale
  -> 根据退货类型组装采购退货单
  -> submitOrderBack 提交售后
  -> 订单中心审核或仓库确认
  -> 等待仓库入库 / 退款 / 关闭

退货类型:

  • 滞销品退货:ORDERTYPE_RETURN_UNSALABLE
  • 不良品退货:ORDERTYPE_RETURN_BADGOODS
  • 直采退货:ORDERTYPE_RETURN_DIRECT
  • 未发货退货:ORDERTYPE_RETURN_UNFILLED
  • 首配退货:ORDERTYPE_RETURN_FIRST

采购入库流程

采购入库常见入口:

  • application/controllers/scm/InvPu.php
  • application/service/scm/InvPuService.php
  • App/WMS 入库接口在 application/config/appapis.phpappwmsinsto*

业务动作:

  • 采购单或物流单确认入库。
  • 写采购入库单和明细。
  • 调用 InventorySer::save() 写库存流水并增加实时库存。
  • 入库数量会影响采购明细的已入库、待入库、关闭数量。

与其他模块的关系

  • 库存:采购入库增加库存,采购退货和关闭根据场景影响库存或锁定数量。
  • 财务:在线支付生成付款单,退货生成退款或待退款。
  • 活动:赠品活动、秒杀活动都可能创建特殊采购单。
  • 订单中心:正向采购审核、售后审核、取消、关闭和自制订单同步。
  • 报表:采购明细报表走 PurchaseReportSer,关注采购数量、入库数量、出库数量、关闭数量。

排查建议

  • 采购单状态异常:先查 PoOrderEnums::BILL_STATUS_MAP,再查 PoOrderModel 当前 billStatus
  • 支付成功但订单未推进:看 PayCenterNotify::paycenterPayResult 日志和 po_order_pay_info
  • 关闭失败:看 InvPoService::getInvPoInfo 返回的 can_closecan_not_close_reason
  • 秒杀采购关闭异常:看 srcOrderType = SRC_ORDER_TYPE_FLASH_ACTIVITY,再查 FlashSaleSer::releaseByPoOrder
  • 报表显示超入或数量不一致:同时查采购明细、采购入库明细、关闭明细和 Hologres 报表表。