采购、采购退货与采购入库
模块职责
采购模块负责服务站向供应商、云仓、活动、订单中心等来源采购商品。它覆盖草稿、提交、审核、在线支付、待出库、配送、完成、关闭、退货、入库和补偿。
主要入口
- 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.php、PoReturnOrderWarehouseModel.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下编辑。 - 保存会带上
orderType、transType、供应商、仓库、金额、折扣、发货方式。 - 提交后是否进入待支付,取决于
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_result、paycenter_pay_exception、paycenter_refund_result、paycenter_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.phpapplication/service/scm/InvPuService.php- App/WMS 入库接口在
application/config/appapis.php的appwmsinsto*
业务动作:
- 采购单或物流单确认入库。
- 写采购入库单和明细。
- 调用
InventorySer::save()写库存流水并增加实时库存。 - 入库数量会影响采购明细的已入库、待入库、关闭数量。
与其他模块的关系
- 库存:采购入库增加库存,采购退货和关闭根据场景影响库存或锁定数量。
- 财务:在线支付生成付款单,退货生成退款或待退款。
- 活动:赠品活动、秒杀活动都可能创建特殊采购单。
- 订单中心:正向采购审核、售后审核、取消、关闭和自制订单同步。
- 报表:采购明细报表走
PurchaseReportSer,关注采购数量、入库数量、出库数量、关闭数量。
排查建议
- 采购单状态异常:先查
PoOrderEnums::BILL_STATUS_MAP,再查PoOrderModel当前billStatus。 - 支付成功但订单未推进:看
PayCenterNotify::paycenterPayResult日志和po_order_pay_info。 - 关闭失败:看
InvPoService::getInvPoInfo返回的can_close和can_not_close_reason。 - 秒杀采购关闭异常:看
srcOrderType = SRC_ORDER_TYPE_FLASH_ACTIVITY,再查FlashSaleSer::releaseByPoOrder。 - 报表显示超入或数量不一致:同时查采购明细、采购入库明细、关闭明细和 Hologres 报表表。