批发分销商订单管理系统
批发分销靠的是在微薄利润上跑起来的巨大出货量,而它遵循的那套规则,是零售或电商工具从来不会去假设的:同一个 SKU 卖给每一个客户的价格都不一样,订单是按箱下、而不是按件下,而且几乎从来不会在第一次发货时就把整单发齐。美国的批发商一年的销售额超过十一万亿美元,而这其中的每一美元,都流经因客户而异的定价、赊销账期和分批发货。本指南将带你走一遍分销商真正需要的那套订单管理系统,以及如何把它作为一个可运行的托管应用搭在 ybuild 上、通过你自己的域名对外提供服务。
痛点
- 每一个客户都有自己谈下来的价格。零售收银机只认一个 SKU 一个价,但你跑的是合同价、量价折扣和客户分级,所以一行的价格,实际上是“谁买、买什么、买多少、什么时候买”的函数。
- 你进货、存货、发货用的是不同的计量单位。一件商品放在货架上是按“件”,卖出去是按 24 件一箱,走量是按托盘,而一个只存一个数字的系统,根本分不清“订 3”到底是三件还是三箱。
- 你很少能把整单发齐。总有东西缺货,于是你先把手上有的发出去、剩下的挂缺货待补,而一个想当然的系统会假设整单都能履约,结果要么把库存多扣了,要么把没发的需求悄无声息地丢掉了。
- 你做的是账期生意,不是一手交钱一手交货。客户按 Net 30 的账期、在授信额度内付款,你按实际发出去的货开票,而一张放行时突破了客户授信额度的订单,就是一笔你可能永远收不回来的钱。
你能搭什么
一条 B2B 客户记录,带着分配给它的价目表或价格分级、付款账期、授信额度、未结应收余额、多个收货地址和一位业务员。当你为这个客户开始一张订单时,录入界面会自动加载他们的价目表,于是每一行都按他们谈下来的价格定价,而不是按标价。从第一次搭建起,它就在 ybuild 上实时上线、托管运行。
一个订单界面,你可以用任意单位录入行——按箱或按件——系统用装箱规格换算成基本单位,执行最小起订量和整箱起订规则,核对可承诺数量,把手上有的分配掉,并把任何缺口拆成一条缺货待补行,好让订单的其余部分今天就能发出去。
一条履约流程,把一张已放行的订单变成仓库拣货单,记录实际拣出的数量,用装箱单确认发货,只从库存里扣掉发出去的部分,并按客户的账期和一个到期日、针对已发货数量生成发票——全都在你实时运行的 ybuild 应用上完成。
数据模型
系统里的一天
- 早上:一位业务员或一位客户下了一张订单。你选中这个客户,录入界面就加载出该客户的价目表,于是每一行都按他们谈下来的价格定价,而不是按标价。
- 你按箱录入行,“SKU 4247 三箱”,系统用装箱规格把它换算成件,核对任何最小起订量和整箱起订规则,并按他们的合同价显示这一行的金额小计。
- 订单会拿客户的授信额度与他们未结的应收余额核对。如果这一单会让他们超限,订单就落到授信冻结上,而不是放行到仓库。
- 一放行,手上有的库存就分配到订单上;缺的那部分自动拆成一条缺货待补行,好让一件缺货的商品不会把其余一切都卡住。
- 仓库按货位分组的拣货单来干活。拣货员确认数量——可能少于所订的——任何短拣都回流到缺货待补行上。
- 发货确认生成装箱单,只从库存里扣掉已发货数量,并针对实际发出去的货生成发票,盖上客户的账期和一个到期日。
- 缺货待补的行仍挂在订单上处于打开状态。当补货采购单到货时,它们会出现在一张“补发缺货”队列里,作为第二次发货发出、单独开票。
- 每天收工时,应收账龄和未结订单报表会显示:谁已经超期、哪些订单挂在授信冻结上、以及有多少库存被占用、对着即将到来的补货。
AI 容易出错的地方
- 按商品记录定价,而不是按客户的价目表定价。在批发里,价格是客户、SKU、数量和日期的函数:合同价、分级折扣和促销全都同时存在。只存一个 SKU 一个价,你就会在不知不觉中对一些客户多收、对另一些客户少收,而每一场发票纠纷都能一路追回到这里。
- 用单一单位来建模数量。你进货、存货、卖货、发货用的是不同单位——件、内包装、箱和托盘。如果表结构不存基本单位和装箱规格、不在两者之间换算,就会有人下“3”是指三箱、你却发了三件,或者反过来。
- 假设整单都能履约。零售在结账时就把整单扣掉;批发是先发一部分、其余挂缺货待补。如果一条订单行不能把 qty_ordered、qty_shipped、qty_backordered 当作三个独立的数字来记,缺货待补就消失了,你要么把库存多扣了,要么彻底丢掉了没发的需求。
- 按订单开票,而不是按发货开票。你该按发出去的货、而不是按订的货开票,否则客户会为他们从没收到的缺货待补商品被开票。发票必须在发货确认时、按已发货数量、连同账期和到期日一起生成,而不是在订单录入时。
- 跳过授信管控与库存分配。放行一张远远突破客户授信额度的订单,或者因为手上库存没做分配、把同一批货同时承诺给两张订单,是批发系统悄无声息亏钱的两种方式。可承诺量等于在手减去已分配,而授信冻结必须是一个真实的订单状态,是仓库无法据以拣货的。
- 定价主干:把客户挂到价目表上,以及一个能按该客户的价目表、用装箱规格数量解析出每一行价格的订单界面。价格错了,其余一切都一文不值。
- 从下单到发货、带分批履约:录入一张订单,分配在手库存,把缺口拆成缺货待补,发货确认,并按已发货数量生成发票。
- 授信管控:一项授信额度与未结应收的核对,把订单挂起、而不是放行到仓库现场。
- 一套完整的总账和应付账款。把发票导给你的会计或 QuickBooks,而不是在应用里重新造一套会计系统。
- EDI 数据对接和一个客户自助门户。先从你的团队录入订单做起,等核心流程稳固了再加电子下单。
- 线路规划、运费比价和仓库自动化。v1 只做发货确认和打印装箱单;把 TMS 和 WMS 集成留到以后。
常见问题
我怎么给每一个客户各自的价格?
把每一个客户都挂到一张价目表或一个价格分级上,并在 price_list_items 里存下因客户而异的单价,连同量价折扣。订单界面随后会根据客户的价目表、SKU、数量和日期解析出价格,于是一个合同客户和一个全新客户可以订同一个 SKU,各自看到自己的价格。商品上的标价,只是在没有任何价目表条目适用时的兜底。
我们按箱卖、按件存货。这怎么处理?
每件商品都带一个基本单位和一个装箱规格,比方说 24。你可以用任意单位下单和定价,系统会为了库存换算成基本单位。订 3 箱会分配 72 件,而最小起订量和整箱起订规则在录入时就被执行,谁也订不了半箱。
当我没法把整单发齐时会怎样?
这一行会拆开。可用的数量分配掉、现在就发,而缺口变成一条缺货待补行,仍挂在订单上处于打开状态。当你的补货到货时,它会出现在一张“补发缺货”队列里,作为第二次发货发出、单独开票,于是你绝不会去承诺你手上实际没有的货。
客户到底什么时候被开票?
在发货确认时,针对实际发出去的货,而不是在订单录入时。发票会带上客户的付款账期——比如 Net 30——和一个到期日,并计入他们的应收余额。缺货待补的货只有在发出去时才开票,所以客户绝不会为一件还躺在你仓库里的东西被开票。
我怎么阻止给一个还没付款的客户发货?
订单会拿客户的授信额度与他们未结的应收余额核对。一张会让他们超限的订单会落到授信冻结上——一个仓库无法据以拣货的真实状态——直到有人复核并放行它。正是这一道核对,把一套真正的批发系统和一个花哨的记单本区分开来。
参考来源
- 美国人口普查局:2022 年度批发贸易调查 — 官方政府数据显示,2022 年美国批发商销售额达 11.3823 万亿美元,正是这个应用所服务的分销渠道的体量。
- 美国劳工统计局:批发贸易(NAICS 42) — 批发贸易行业的官方“行业概览”(Industry at a Glance)画像,涵盖耐用品和非耐用品的批发商。
- NetSuite:最小起订量(MOQ)公式、技巧与好处 — 一份实用指南,讲清 MOQ 和整箱数量规则如何运作,以及为什么它们在分销生意里属于订单录入环节。
描述它,一次性上线到你自己的域名——托管、全栈、无需服务器。免费开始。