跨订单部分提货:把灵活的提货方式做成一个流程
Impact
| 指标 | 数值 |
|---|---|
| 项目规模 | 小规模定制项目(含开发、测试、部署文档、一次交付;合同金额不公开) |
| 付款方式 | 50% 首付 + 50% 验收款 |
| 免费质保 | 3 个月(功能性缺陷免费修) |
| 交付包大小 | 32.1 MB(33,613,783 字节,现场可部署) |
| 端到端验证 | 跨 3 张订单(含多规格 + 畸形编码)部分出库一次全过 |
| 客户环境 | Windows 10 + 8G 内存 |
| 项目周期 | 约 3 周 |
The challenge:客户原来怎么做
客户是一位做社区团购/自提的批发商贸企业,用订货系统管理订单。
但他们的提货方式非常灵活:
- 同一个客户可能有多张订单
- 每张订单有多个商品
- 提货时可能只提"某几单里的某几个商品"
- 而且每个商品可能只提一部分数量——车装不下,剩下的下次再提
标准的订货系统不支持这种操作。 系统里的出库/发货接口都是订单维度的:要出库,必须指定订单号,按订单整单出。
于是客户只能这么干:
- 在系统里查这个客户有哪些待出库商品
- 人工判断哪些已经到货、能提多少
- 到系统里一张张订单去做出库
- 打印小票给提货人
问题在于:第 2 步全靠人判断,第 3 步要来回切换订单。 一个客户提一次货,可能要操作 3–5 张订单,每张都要选商品、填数量。提货高峰期根本忙不过来,而且容易出错。
The solution:我们做了什么
我们做了一个跨订单拣货台,把整个流程压成一个连续动作:
① 输入提货人手机号
↓
② 跨订单列出该客户所有"待出库"商品
(自动聚合多张订单,标明每行来自哪张订单)
↓
③ 勾选已到货的商品行 + 填本次实际提货量
↓
④ 本地生成出库单 → 打印小票(此时不碰订货系统)
↓
⑤ 客户确认无误、离开后 → 点【确认发货】一次性回传
对操作员和提货人来说,这就是"一次提货、一张单子"。
底层实际发生的是:订货系统侧针对涉及的每张订单,各产生一张"部分出库单"——但这个细节客户看不见,也不需要知道。
两阶段设计:先打印,后回传
| 阶段 | 做什么 | 是否碰订货系统 |
|---|---|---|
| 第一阶段 | 本地生成出库单、打印小票 | 完全不碰 |
| 第二阶段 | 点【确认发货】,一次性回传 | 碰,且不可逆 |
为什么这样设计:
提货现场变数很多——客户临时改主意、车装不下、临时加单。如果一开始就回传,任何调整都要走退货流程,极其麻烦。
先打印后回传,所有调整都发生在本地,对订货系统零副作用。改到满意了,客户走了,再一次性回传。
关键设计决策
决策一:不改动系统本体,走官方开放接口
为什么:改本体的话,官方升级一次就可能全部推倒,而且没有技术支持。
不这样选会怎样:系统升级后插件失效,客户业务停摆,责任在我们。
决策二:出库接口用 addConsignmentByNum,不用 addConsignment
这是整个项目最关键的技术决策。
| 接口 | 定位依据 | 在客户环境的结果 |
|---|---|---|
addConsignment | 商品档案的 ERP 外码(guid) | ❌ 100% 失败,返回 204 未查询到待出库商品信息 |
addConsignmentByNum | 规格商品编码(options_goods_num) | ✅ 全通 |
原因:客户环境里的商品全部是手工创建的(不是从 ERP 同步过来的),没有真正的 ERP 外码。系统里那个 guid 字段只是内部 ID 的回退值。
实测数据:待出库数据 2930 行,options_goods_num 100% 非空。手工商品、ERP 商品、单规格、多规格全部通过。
不这样选会怎样:如果用直觉选的 addConsignment,在客户环境下会 100% 失败,而且错误信息是误导性的——它说"未查询到待出库商品信息",看起来像是没有数据,实际是参数定位方式错了。这种坑不踩过一次是想不到的。
决策三:跨订单在插件侧聚合,不追求系统内合并
问题:客户想要"一次提货、一张单子"。但订货系统的出库/发货接口全是订单维度,做不到跨订单物理合并成一张出库单。
我们的选择:插件侧把多张订单的部分出库归入同一张本地出库单。
效果:对操作员和提货人而言就是"一次提货、一张单子"。你不说,客户看不出底层是几张。
不这样选会怎样:要么放弃"一张单子"的体验(客户不满意),要么尝试在系统里重建订单(会改动业务数据,风险极高)。
决策四:本地只记"操作事实",不记"派生状态"
原则:
- 记:每次提货实际提了多少(哪张订单、哪个商品、提了多少)——这是我方事实,不会与系统冲突
- 不记:剩余待出库数量——这是系统状态,本地存一份历史,一旦不一致就成了脏数据
要查"还剩多少",一律实时从订货系统拉取。
为什么:本地存派生状态,必然会出现"本地以为还剩 10 个,系统里其实只剩 8 个"的情况。这种不一致极难排查,而且会导致超卖。
能力清单
这个项目体现了四项能力:
| 能力 | 具体表现 |
|---|---|
| 第三方 API 深度对接 | 120+ 接口里选对出库接口,绕开"手工商品无 ERP 外码"的陷阱 |
| 流程设计 | 两阶段设计(先打印后回传),把不可逆操作的风险降到最低 |
| 现场部署交付 | 32.1MB 可部署包,含运行环境、数据库脚本、配置文件、启动脚本、使用说明 |
| 异常处理 | 处理多规格、畸形编码、超时重试、部分失败等边界情况 |
交付时间线
| 日期 | 事件 |
|---|---|
| 2026-09-30 | 需求书 v0.1、接口调研启动 |
| 2026-10-01 | 出库回传端到端打通;客户同构测试账套复验通过 |
| 2026-10-02 | 开发合同定稿(按项目包干 / 3 个月质保) |
| 2026-10-08 | 客户环境确认:Win10 + 8G;隐藏调试功能与库存台账 |
| 2026-10-10 | 现场部署试用版(拣货 / 打印 / 出库回传主线) |
| 2026-10-17 | 整体回归测试通过(修 4 个问题) |
| 2026-10-19 | 正式交付打包(32.1MB,含批量回传、到点标红、手机端排版修复) |
边界:我们没做什么
这一节比上面所有内容都重要。
| 没做 | 原因 |
|---|---|
| 没有改动订货系统本体 | 只通过官方开放接口扩展,不影响系统升级 |
| 没有做跨订单物理合并 | 系统接口做不到,硬做会改动业务数据,风险极高 |
| 没有做中单位/大单位换算 | 实测把中单位数据拿去回传会直接报错,规则未明确前宁可不做 |
| 没有做库存台账推算 | 系统有现成库存接口,不需要自建台账(自建反而容易不准) |
| 回传后不支持撤销 | 回传即锁定,退单走系统的退货单流程 |
关于"中单位/大单位":客户的商品有些是多单位的(小单位/中单位/大单位)。实测把中单位数据拿去回传,系统直接返回错误。规则没搞清楚之前,宁可不做,也不做错——这一条我们写进了交付文档,明确告诉客户"当前不支持,等确认规则后再开放"。
这个案例说明了什么
一、标准功能不支持的情况,能不能做?
能。 但要看是不是真的需要"改系统本体"——这个案例里我们没有改动系统本身,而是通过官方开放接口做扩展。
二、技术路径选错会怎样?
这个项目里,如果按直觉选错接口,在客户环境下会 100% 失败,而且错误信息是误导性的。
这种坑不踩过一次是想不到的。 我们在接口调研阶段花了整整两天,测了各种参数组合,才确认哪条路是通的。
三、交付物是什么样子?
不是一个"能跑的 demo",是一个 32.1MB 的 Windows 可部署包:
| 包内文件 | 作用 |
|---|---|
node.exe | 运行环境(客户机器不用装 Node) |
app.mjs | 主程序 |
public/ | 前端页面 |
schema.sql | 数据库建表脚本 |
.env | 配置文件(凭证现场填,不预置) |
三个 .bat | 启动 / 停止 / 安装服务 |
| 使用说明 | 图文操作指引 |
客户现场装上就能用,不需要装任何开发环境。
如果你有类似需求
这个案例的典型特征:标准系统功能不支持某种灵活的业务操作,但业务又必须这么做。
如果你遇到类似情况,先问三个问题:
- 这个操作是"偶尔特殊"还是"每天都要做"?(偶尔特殊的,人工扛过去可能更划算)
- 系统的开放接口能不能覆盖?(能覆盖就别改本体)
- 能不能用"两阶段"设计把不可逆操作的风险降下来?(能降就别一步到位)
答完这三个问题,再考虑要不要做。不确定的话,约一次免费诊断,我们帮你判断。
常见问题
这个项目解决什么问题?
客户提货非常灵活:同一个客户有多张订单,每单多个商品,提货时可能只提某几单里的某几个商品,而且每个商品可能只提一部分数量(车装不下,剩下的下次再提)。标准订货系统不支持「跨订单、按商品行、按数量」的拣货,所以需要做扩展。
为什么不直接改造订货系统?
不改动系统本体是刻意的选择。订货宝有官方开放接口,通过接口做扩展既能满足需求,又不影响系统的稳定性和后续升级。改本体的话,官方升级一次就可能全部推倒。
为什么用 addConsignmentByNum 而不是 addConsignment?
因为客户环境的商品全部是手工创建的,没有 ERP 外码。addConsignment 按商品档案的 ERP 外码定位,对手工创建的商品会 100% 失败。addConsignmentByNum 按规格商品编码定位,实测 2930 行待出库数据 100% 非空,手工商品、ERP 商品、单规格、多规格全通。
为什么先打印后回传?
因为回传是不可逆的。客户临场可能改主意、车装不下、临时加单——这些情况如果已经回传,就只能走退货流程,非常麻烦。先打印、后回传的设计,让所有调整都发生在本地,对订货系统零副作用。
这个项目花了多久?
从需求与接口调研启动到正式交付打包,约 3 周(2026-09-30 到 2026-10-19)。中间包括接口调研、端到端打通、现场部署试用、整体回归测试等环节。
先聊清楚问题,
再谈要不要做
90 分钟诊断会,免费。我们会告诉你这件事值不值得做、大概多少钱、以及——如果结论是"不该做",也会直接说。
