订单库存售后三流打通:3 处断点、唯一来源表与验收动作复盘
联调报告写着全部连通,客户下了单仓库二十分钟才看见,前台显示有货实际早卖空,售后处理完了前端进度还停着——这不是接口没接上,是两套系统各自维护状态,谁也没承认对方说了算。这篇把网站/APP与订单、库存、售后的打通拆成三流断点,每个断点标清损失怎么算、验收怎么验,再给一张三类数据唯一来源表。
联调报告上写着四个大字:全部连通。可客户在小程序下了一单,仓库那边二十分钟后才看见;同一款货前台还挂着三件,实际早被线下门店搬空;退货在售后台账里处理完了,前端进度条一动不动。客户打电话进来骂的是客服,不是代码。
这不是接口没接上。这是两套系统各自维护了一份状态,谁也没承认对方说了算。
打通的真问题,不是接口数量
做这行二十年,这类项目见得太多。判断标准其实很简单:任何一类数据,你当场答不出这笔以谁为准,那就不算打通,接口接得再多也是装饰。说白了,所谓系统打通,是让订单、库存、售后三套状态在网站/APP和后端系统之间实时同源,而不是把数据单向推过去就完事。
有个细节特别说明问题。凡是接口都通了还出错的项目,一路追下去,几乎都能找到同一句话——当初设计时,没人把这个字段以哪边为准写进文档。口头约定不算数,写进接口契约才算。
怎么说呢,很多老板把打通理解成多接几个接口,于是按接口数量验收。这个验收口径本身就错了。你要的是状态能双向流转、不一致能被对出来的系统,不是一份接口连通报告。
订单流断在哪:状态不同步,钱先出错
订单流就是下单、支付、发货、完成、退款这条链。断点几乎都出在两端各记一套状态上。
支付结果两端不认账。支付渠道的回调不可靠,做过支付的都懂——回调可能延迟、可能重复、可能干脆不来。前端一收到回调就认定成交,订单系统那边还显示待支付,客户以为钱白付了,回头再点一次,重复扣款就这么来的。这类损失算得出口径:不同步订单占比,乘上日均订单,再乘客单价,就是每个月白白流走的钱。
举个真实点的例子。东莞一家做家居日用的客户,大促当天支付回调延迟了四十分钟,前端没做主动查单兜底,半小时里涌进来三百多笔重复提交。事后光退款和客诉就处理了一个星期。后来他们把这层收敛到旺道OMS这类订单中枢上:前端只请求不拍板,订单系统统一发号、统一落状态,超时没回调就主动去渠道反查一次。订单号由谁生成这件事必须提前定死,两边各发一套号,后面所有对账都是灾难。
验收动作也简单:真实下一单、改一次地址、走一笔退款,逐节点核对前端和订单系统的状态是不是同一个。对不上,就别往下走。
库存流断在哪:三个数打架,超卖赔的是口碑
库存这件事,前后台吵架多半因为各拿一个数。真正要对的是三个:现存、占用、可售。可售等于现存减占用。这个口径不写进需求,前端拿现场实物去比可售,比完就骂系统不准。
超卖的根,是写路径不止一条。订单系统直接改库存表,前端也能改,并发一撞就是负数库存。还有一种更隐蔽:扣减语句不带条件,重复执行一次就多扣一次,账面能扣出负五百。这种错,事后改数据没用,根上是写入点没收口。
线上线下混卖的业态最疼。前台显示有货,实际门店刚卖空,客户下了单发不出,一单超卖的账是退款加补偿加客诉处理,再叠上一个差评。验收动作:并发压测,同一时间多笔下单,看可售会不会穿底,再核对可用、占用、锁定三个数对不对得上。仓储这侧,旺道WMS这类做法的价值就是把占用和实扣两个动作分开——前端取消了,仓库那边不会还在拣货。
售后流断在哪:工单不回传,客户变成打电话的
售后这条流最简单,也最容易被忘。客户提交退货,后台工单处理完了,前端不回传,进度条停在待审核。客户查不到进度,只能打电话,一个人打三遍,客服被淹,差评堆起来。
损失口径很实在:售后纠纷率,乘上单均处理人力,再加上二次咨询和差评的隐性代价。验收动作:真实走一遍售后全流程——提交、审核、寄回、收货质检、退款到账,每个节点都要能回传到前端,并且带着时间戳。工单不回传,前端就是瞎子。这也是为什么售后工单必须以工单系统为唯一来源,前端只准展示,不准客服在后台手工拖动状态。
还有个吃人力的对账断点
这不算第四种流,但每天都在烧钱。两端订单对不平,日终靠两个人拿表格硬拼。口径就是每日人工核对时长乘时薪,再叠上差错金额本身。说实话,很多老板只盯着前面三个断点,把数据对账当财务自家的事,一年下来人力成本比接口开发费还贵。
对账要做三层:按订单号逐笔比状态和金额,按天按仓比总单量抓漏单,再把可售、占用、现存三个数和仓储实盘定期校准。差异能追溯到具体单据才有意义——找不到出处的差异,改了还会再犯。
打通顺序:先定谁说了算,再接接口
思路只有三步,顺序不能乱:先定唯一来源,再建发起、回传、对账的双向流转,收尾用真实业务跑断点验收。很多人反过来做,先把接口接通再说,接完发现两边都在改同一张单,越接越乱。
唯一来源表,建议白纸黑字放进接口文档第一页:
| 数据对象 | 唯一权威来源 | 其他端允许的动作 | 冲突裁决规则 |
|---|---|---|---|
| 订单主档与状态 | 交易/订单系统 | 创建请求、查询、按状态推进 | 以订单系统状态为准,前端只做展示与请求 |
| 库存数量 | 仓储WMS或进销存 | 查询可售、提交占用申请 | 以仓储系统为准,前端缓存只作参考 |
| 售后工单与进度 | 工单/售后系统 | 提交工单、查询进度 | 以工单系统为准,前端不接受本地改写 |
| 价格与优惠 | 商品/营销中心 | 展示、试算 | 以下单时刻后端试算结果为准 |
| 资金流水 | 支付/财务系统 | 查询 | 以对账后的财务账为准 |
这张表看着朴素,它是整个项目的裁判规则。有了它,接口对接才有讨论基础;没有它,每一场联调都会变成两个部门互相举证。
数据在主链路上的走向,长这样:
flowchart LR
A[网站/APP 下单] --> B[网关 鉴权限流]
B --> C[订单系统 创建订单]
C --> D[仓储系统 占用校验]
D -- 数量不足 --> E[返回缺货 引导到货提醒]
D -- 占用成功 --> F[转待支付]
F --> G[支付渠道]
G -- 异步回调 --> H[订单系统 落状态]
G -. 超时未回调 .-> I[主动查单兜底]
I --> H
H --> J[消息队列 广播事件]
J --> K[WMS 拣货发货]
J --> L[前端状态更新]
J --> M[对账中心 记流水]
M --> N[差异清单 人工复核]
图里最容易被忽略的是那条虚线。回调不来怎么办?没有兜底查单,前端一直显示支付处理中,客户以为钱没了,重复提交,然后就是一堆重复扣款投诉。
三层防护,把重复请求挡在门外
重复来自四个地方:用户双击、网关重试、消息重投、人工重推。挡法分三层。
请求层发一次性防重令牌,进入下单页就发一个,提交时作废,第二次直接返回第一次的结果,这挡住误双击。数据层给订单号、交易号建唯一索引,重复插入被数据库直接拒绝,这是绕不过去的兜底。更新层所有状态机推进和数量扣减都带条件,扣一件要写成数量大于等于一件才扣,按受影响行数判断成败。不带条件的更新语句,重复执行一次就多扣一次,这是负库存最常见的根因。
说到底一句话:同源优先于实时。两端可以有几秒延迟,但不能有两份真相。宁可让前端多转两秒去后端确认,也别先给一个自己编出来的状态。大部分团队就是为了看起来快,在前端本地造状态,造完再也收不回来。
上线前,只信真实业务
验收别信连通性报告。就做三件事:真实下单、改单、退款走一遍,核对两端状态一致;并发下单压测,验证防超卖;完整走一遍售后,核对回传字段。这三样跑通,才算真打通。
挑系统的时候也一样,别把接口数量多当卖点。真正该问三句:订单状态变更能不能主动回传?库存占用和实扣是不是分开的?差异清单能不能自动生成并指派?这三句的答案,比任何架构图都实在。想查订单进度这类日常活,旺道数据Agent这类自然语言查询封装能顶上——客户问上周那个杯子到哪了,它按权限取数回答,比在列表里翻四层筛选省事。
收个尾。下次有人跟你说对接一下就行,你就把这张唯一来源表甩过去:这几类数据,各自以谁为准?答得上来,再谈接口;答不上来,接口接得再漂亮,也是给未来的扯皮搭台。