销售、出库、配送与收款
模块职责
销售模块负责服务站向修理厂、E站、小程序、APP、机器人、渠道等客户销售商品。核心链路是销售开单、待出库、部分出库、全部出库、配送、送达、对账、核销和撤销。
主要入口
- PC 销售入口:
application/controllers/scm/InvSa.php - 销售出库入口:
application/controllers/sale/OutOrder.php - 销售报价入口:
application/controllers/sale/Offer.php、RapidOffer.php - App 销售 API 映射:
application/config/appapis.php中appsale* - 销售任务:
application/controllers/tasks/SaOrder.php、SaInvoice.php、SaleReturn.php
关键 Service
application/service/scm/InvSaService.php:销售出库列表、详情、导出、对账、核销。application/Services/SaOrders/SaOrderSer.php:销售单创建、出库、库存扣减、来源场景映射。application/Services/SaOrders/SaInvoiceSer.php:销售出库单、撤销、列表、出库状态。application/Services/SaOrders/ThirdDeliverySer.php:第三方配送。application/Services/Transport/TransportSer.php:配送业务。application/Services/Payment/PaymentSer.php:收款和付款。application/Services/SyncOrder/SyncOrderSer.php:销售单/出库单同步到下游。
关键模型
- 销售订单:
application/models/saOrders/SaInvoiceModel.php - 销售订单明细:
SaInvoiceInfoModel.php - 销售异常和出库提醒:
SaAbnormalReturnLogModel.php、OutboundReminderLog.php - 收付款:
application/models/payment/PaymentModel.php、PaymentInfoModel.php - 库存:
InventorySubModel.php、InventoryRealTimeModel.php
销售单状态
状态定义在 application/KzData/Enums/SaOrderEnums.php:
- 销售单状态:
0待出库。1部分出库。2已完成。3已关闭。
销售出库单状态:
0老单据已出库或销退单已出库。1已出库。2派送中。3已送达。4已对账。5已核销。6已撤销。
收款方式:
0挂账。1现金。2微信。
收款状态:
0未收款。1部分收款。2全部收款。
销售来源类型
SaOrderEnums.php 中的 sourceType 决定订单来自哪里:
0销售开单。1ERP订单。8E站商城挂账。9E站商城微信支付。10E站维修挂账。15E站维修微信支付。14E站活动。16AI助手订单。17、18E站 APP IM 订单。19、20E站 APP 商城订单。21、22E站 APP 活动订单。
销售开单流程
用户创建销售单
-> InvSa::add / SaOrderSer::saCreate
-> validform 校验订单号、客户、商品、库存、金额
-> saOrderMainFields 根据 order_scene/payMode 映射 sourceType/payType/is_pay
-> 写销售主单和明细
-> 库存不一定立即扣减,取决于是否同时出库
-> SyncOrderSer::syncOrderCreate 可同步下游
SaOrderSer::saOrderMainFields() 是理解销售来源的关键方法,它把移动商城、E站维修、E站活动、E站 APP、机器人等场景映射成站管家的 sourceType 和 payType。
销售出库流程
销售单待出库
-> 用户选择仓库/货位/出库数量
-> SaOrderSer::saOrderOut
-> 生成销售出库单和明细
-> InventorySer::save 写出库库存流水
-> MqSer::sendInventoryEvent 发送库存事件
-> SyncOrderSer::syncOutboundCreate 同步出库
-> 销售单状态变为部分出库或已完成
业务注意点:
- 出库要按仓库和货位扣减实时库存。
- 明细数量不能超过销售单剩余可出数量。
- 赠品、折扣、历史售价、客户价格会影响展示和金额。
- 维修厂 APP、E站、机器人等来源可能需要把出库结果同步回 SAAS 或 APP。
配送和签收流程
已出库
-> 派送中
-> 已送达
-> 对账
-> 核销
相关入口:
application/Services/Transport/TransportSer.phpapplication/controllers/app和appapis.php中transport*application/Services/SaOrders/ThirdDeliverySer.php
配送状态变化会通过 MqSer::sendSaOrderStatusToMq() 或类似方法通知 APP/SAAS。
收款、对账和核销
销售出库后,财务状态和业务状态不是一回事:
- 挂账销售会形成客户应收。
- 现金/微信可能在出库或支付回调后形成收款明细。
- 对账把出库单纳入客户对账口径。
- 核销表示金额已经处理完。
InvSaService 中的 reconciliation()、batchReconciliation()、autoBatchReconciliation() 会根据付款金额、差额和单据状态把出库单推进到已对账或已核销。
销售退货和撤销
销售退货可能表现为:
transType = 150602的销售退货单。transType = 150601且billStatus = 6的销售单据撤销,列表中会展示为销售退货单。
退货入库会增加库存,并影响原销售单、收款状态和报表口径。
与其他模块的关系
- 库存:销售出库扣库存,销售退货增库存。
- 财务:销售形成收款、应收、对账、核销。
- 移动商城/E站:订单创建和出库结果需要同步。
- 报表:销售明细、销售对账、客户销售统计依赖销售单和出库单。
- MQ:销售创建、更新、关闭、出库、撤销都可能发下游事件。
排查建议
- 销售单不能出库:查销售单状态、剩余可出数量、实时库存、货位库存。
- 出库后库存没变:查
InventorySer::save()是否执行,以及库存流水是否写入。 - 下游没收到出库:查
SyncOrderSer::syncOutboundCreate()和dgj_notify事件。 - 对账/核销状态不对:查
PaymentInfoModel、出库单billStatus和InvSaService的对账逻辑。 - E站订单来源混乱:看
SaOrderEnums::ORDER_SOURCE_TYPE_MAP和SaOrderSer::saOrderMainFields()。