售后申请与销售退货申请

本文整理销售退货申请、审核、退货入库、异常退货和 APP/SAAS 同步。它和普通销售退货、出库撤销、采购售后不同,排查时要先确认退货来源和原始销售出库单。

业务目标

  • 客户或服务站对已出库商品发起退货申请。
  • 后台审核退货申请。
  • 审核通过后执行退货入库,恢复库存。
  • 同步销售单、出库单、收款/退款、APP/SAAS 下游状态。

入口文件

  • 退货申请控制器:application/controllers/applyReturn/ApplyReturnOrder.php
  • 退货申请服务:application/Services/ApplyReturn/ApplyReturnSer.php
  • PC 销售:application/controllers/scm/InvSa.php
  • 销售退货任务:application/controllers/tasks/SaleReturn.php
  • 全车件销退:application/controllers/allcarpart/sale/SaReturnOrder.php
  • 同步下游:application/Services/SyncOrder/SyncOrderSer.php

核心表

| 表 | 用途 | | --- | --- | | t_scm_apply_return_order | 销售退货申请主表 | | t_scm_apply_return_order_info | 退货申请明细 | | t_scm_abnormal_return_log | 异常退货记录 | | t_scm_sa_order / t_scm_sa_order_info | 原销售单和明细 | | t_scm_sa_invoice / t_scm_sa_invoice_info | 原出库单和明细 | | t_scm_inventory / t_scm_inventory_info | 销售退货入库流水 | | t_scm_payment / t_scm_payment_info | 退款/冲账 |

核心方法

  • ApplyReturnSer::add:新增退货申请。
  • ApplyReturnSer::getList:申请列表。
  • ApplyReturnSer::detail:申请详情。
  • ApplyReturnSer::check:审核。
  • ApplyReturnSer::inStorageDetail:入库详情。
  • ApplyReturnSer::inStorage:退货入库。
  • ApplyReturnSer::cancel:取消。
  • ApplyReturnSer::orderFinish:订单完成处理。
  • ApplyReturnSer::validate:业务校验。

主流程

flowchart TD
  A["发起退货申请"] --> B["校验原销售/出库和可退数量"]
  B --> C["生成退货申请主表和明细"]
  C --> D["后台审核"]
  D -->|通过| E["退货入库"]
  E --> F["写销售退货库存流水"]
  F --> G["恢复实时库存"]
  G --> H["同步销售/出库/APP/SAAS"]
  D -->|驳回| I["申请结束"]

状态和数量口径

  • 可退数量 = 原出库数量 - 已退数量 - 已申请未完成数量。
  • 退货入库数量影响实时库存,交易类型通常看 TransTypeEnums::TRANSTYPE_SA_INVOICE_RETURN
  • 退款/冲账是否发生,取决于销售单支付方式、收款状态和业务规则。
  • 异常退货记录不一定等同于正常退货申请,需要看 t_scm_abnormal_return_log

异常流程

  • 申请失败:查原出库单是否已撤销、可退数量是否为 0。
  • 审核失败:查审核状态、退货明细、权限。
  • 入库失败:查货位、库存写入、是否重复入库。
  • 库存未恢复:查销售退货库存流水和实时库存。
  • 下游没同步:查 SyncOrderSer 事件和 APP/SAAS 消费日志。

常用 SQL

select * from t_scm_apply_return_order where sid = :sid and billNo = :return_bill_no;
select * from t_scm_apply_return_order_info where order_id = :return_order_id;
select * from t_scm_sa_invoice where sid = :sid and billNo = :invoice_bill_no;
select * from t_scm_sa_invoice_info where invoiceId = :invoice_id;
select * from t_scm_inventory where sid = :sid and srcBillNo = :return_bill_no;

常用 rg 命令

rg -n "ApplyReturnOrder|ApplyReturnSer|inStorage|orderFinish" application/controllers application/Services
rg -n "SCM_APPLY_RETURN_ORDER|SCM_SA_RETURN_LOG|TRANSTYPE_SA_INVOICE_RETURN" application
rg -n "APP_APPLY_RETURN_FINISH|APP_APPLY_RETURN_CHECKED|apply_return" application/Services application/controllers/tasks application/KzData/Enums

改动风险和回归清单

  • 正常退货申请:新增、审核通过、入库。
  • 驳回/取消:状态和可退数量恢复。
  • 部分退货:数量和金额按明细计算。
  • 重复提交:同一出库明细不能重复退超。
  • 库存:退货入库流水、实时库存、报表。
  • 下游:APP/SAAS 退货审核和完成事件。