销售、出库、配送与收款

模块职责

销售模块负责服务站向修理厂、E站、小程序、APP、机器人、渠道等客户销售商品。核心链路是销售开单、待出库、部分出库、全部出库、配送、送达、对账、核销和撤销。

主要入口

  • PC 销售入口:application/controllers/scm/InvSa.php
  • 销售出库入口:application/controllers/sale/OutOrder.php
  • 销售报价入口:application/controllers/sale/Offer.phpRapidOffer.php
  • App 销售 API 映射:application/config/appapis.phpappsale*
  • 销售任务:application/controllers/tasks/SaOrder.phpSaInvoice.phpSaleReturn.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.phpOutboundReminderLog.php
  • 收付款:application/models/payment/PaymentModel.phpPaymentInfoModel.php
  • 库存:InventorySubModel.phpInventoryRealTimeModel.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 销售开单。
  • 1 ERP订单。
  • 8 E站商城挂账。
  • 9 E站商城微信支付。
  • 10 E站维修挂账。
  • 15 E站维修微信支付。
  • 14 E站活动。
  • 16 AI助手订单。
  • 1718 E站 APP IM 订单。
  • 1920 E站 APP 商城订单。
  • 2122 E站 APP 活动订单。

销售开单流程

用户创建销售单
  -> InvSa::add / SaOrderSer::saCreate
  -> validform 校验订单号、客户、商品、库存、金额
  -> saOrderMainFields 根据 order_scene/payMode 映射 sourceType/payType/is_pay
  -> 写销售主单和明细
  -> 库存不一定立即扣减,取决于是否同时出库
  -> SyncOrderSer::syncOrderCreate 可同步下游

SaOrderSer::saOrderMainFields() 是理解销售来源的关键方法,它把移动商城、E站维修、E站活动、E站 APP、机器人等场景映射成站管家的 sourceTypepayType

销售出库流程

销售单待出库
  -> 用户选择仓库/货位/出库数量
  -> SaOrderSer::saOrderOut
  -> 生成销售出库单和明细
  -> InventorySer::save 写出库库存流水
  -> MqSer::sendInventoryEvent 发送库存事件
  -> SyncOrderSer::syncOutboundCreate 同步出库
  -> 销售单状态变为部分出库或已完成

业务注意点:

  • 出库要按仓库和货位扣减实时库存。
  • 明细数量不能超过销售单剩余可出数量。
  • 赠品、折扣、历史售价、客户价格会影响展示和金额。
  • 维修厂 APP、E站、机器人等来源可能需要把出库结果同步回 SAAS 或 APP。

配送和签收流程

已出库
  -> 派送中
  -> 已送达
  -> 对账
  -> 核销

相关入口:

  • application/Services/Transport/TransportSer.php
  • application/controllers/appappapis.phptransport*
  • application/Services/SaOrders/ThirdDeliverySer.php

配送状态变化会通过 MqSer::sendSaOrderStatusToMq() 或类似方法通知 APP/SAAS。

收款、对账和核销

销售出库后,财务状态和业务状态不是一回事:

  • 挂账销售会形成客户应收。
  • 现金/微信可能在出库或支付回调后形成收款明细。
  • 对账把出库单纳入客户对账口径。
  • 核销表示金额已经处理完。

InvSaService 中的 reconciliation()batchReconciliation()autoBatchReconciliation() 会根据付款金额、差额和单据状态把出库单推进到已对账或已核销。

销售退货和撤销

销售退货可能表现为:

  • transType = 150602 的销售退货单。
  • transType = 150601billStatus = 6 的销售单据撤销,列表中会展示为销售退货单。

退货入库会增加库存,并影响原销售单、收款状态和报表口径。

与其他模块的关系

  • 库存:销售出库扣库存,销售退货增库存。
  • 财务:销售形成收款、应收、对账、核销。
  • 移动商城/E站:订单创建和出库结果需要同步。
  • 报表:销售明细、销售对账、客户销售统计依赖销售单和出库单。
  • MQ:销售创建、更新、关闭、出库、撤销都可能发下游事件。

排查建议

  • 销售单不能出库:查销售单状态、剩余可出数量、实时库存、货位库存。
  • 出库后库存没变:查 InventorySer::save() 是否执行,以及库存流水是否写入。
  • 下游没收到出库:查 SyncOrderSer::syncOutboundCreate()dgj_notify 事件。
  • 对账/核销状态不对:查 PaymentInfoModel、出库单 billStatusInvSaService 的对账逻辑。
  • E站订单来源混乱:看 SaOrderEnums::ORDER_SOURCE_TYPE_MAPSaOrderSer::saOrderMainFields()