我们会梳理 贵公司的销售流程 , 提出 系统架构
商品目录、订单、支付以及与财务系统的数据交换,在动手开发之前先画成图。
电子商务系统把一件商品从目录页一路带到已付款、已送达的订单。以下是系统的模块、它所覆盖的流程,以及与 CRM、ERP、仓储和收银系统的连接。
电子商务软件 — 一套系统,保存商品、价格和库存数据,通过互联网接收订单,完成支付,并把订单交给仓库、配送和财务去执行。
它与普通网站的区别在于:处理的不是页面,而是业务记录——商品、价格、库存、订单、支付、发货、退货,每一项都有自己的状态和历史。同一笔订单可能来自应用、售货机、业务员,也可能来自电商平台。
它是门店前台背后的业务记录层,而不是门店前台本身。更换前台或再加一个前台,都不必重写底层记录。
企业上电子商务平台的六个理由。没有平台时,每一项都要靠表格、消息和电话人工处理。
规格、图片、价格和库存集中保存,并分发到所有销售渠道。网站、应用和收银台的数据不会互相打架。
订单全天候自动创建、校验和收款。只有需要判断时才由人介入:特殊配送、有争议的退货、批发订单。
下单时预留库存,同一件商品不会被卖两次。因仓库缺货导致的取消从常态变成个别情况。
价格和折扣由规则决定,而不是逐个手工改商品页。上千个商品的调价只需几分钟,而且可以回退。
订单、支付和发货无需二次录入即可进入财务和仓储系统。对账不再是一项单独的工作。
能看到顾客买了什么、搜索什么却找不到、在结算的哪一步离开、退回了哪些商品。选品决策有数据支撑。
自动化不是「用机器人取代售货员」,而是把重复操作变成规则,由系统一致地执行,并把结果写进历史记录。
规则一直生效,直到条件被修改。控制并没有丢失:每一个自动动作在日志里都有操作者、时间和修改前的数值。
转为自动执行的操作:
| 时间 | 系统自动完成的动作 |
|---|---|
| 09:41 | 加价 18%:重算了 1 240 个商品 |
| 10:00 | 「茶叶 8.5 折」促销按计划启动 |
| 10:03 | 订单 № 14 190 被拒付:2 件退回库存 |
| 10:06 | SKU 77-1043 库存偏低:已通知采购 |
商品目录 — 一个结构化的商品数据仓库:卖的是什么、商品之间有何差别、顾客用哪些属性来找到它们。
一个能用的商品目录包含:

商品目录的基本单位是带唯一货号(SKU)的商品项:不可变的标识、可编辑的描述,以及关联的图片、文档、价格和库存记录。
批量操作通过导入导出完成:文件、API 或从财务系统取数。每次导入都先校验:将新建什么、修改什么、拒绝什么以及为什么。
已拒绝:货号重复 — 9,必填属性「品牌」为空 — 5,类目不存在 — 3。在确认之前,没有任何一行被写入商品目录。
价格 — 它不是商品页上的一个字段,而是请求发生时按规则计算出的结果。同一件商品可以同时存在多个价格,系统会选出适用的那一个。
因此不必到上千个商品页里改价:改一条规则或基础价目表就够了。
定价的层次:
每一次价格变动都写入历史:谁改的、何时改的、依据哪条规则、原值是多少。毛利报表和争议订单的复盘都依赖这段历史。
规则按优先级裁决,而不是盲目叠加。单个商品的价格通常按以下顺序计算:
兼容关系写得很明确:哪些折扣可以叠加、哪些互斥、允许的最低价是多少。最低价规则可以避免多个单独看都合规的折扣叠在一起,把商品卖成亏本。
促销 — 一条规则,系统会自动套用到符合条件的订单上。 优惠码 — 同一类规则,由顾客输入口令来启用。两者的定义方式一致:条件、玩法、有效期、限制。
订单里必须具备什么:商品、类目、品牌、最低金额、配送方式、客户分层、销售渠道、时段或星期几。
百分比、固定金额、指定新价、组合中最低价商品打折、免运费、赠品,或者用积分代替折扣。
起止日期、周期性时间窗(例如每周五),无需员工干预即可自动启动和停止。
总使用次数上限、单个客户上限、一次性专属码、与其他促销互斥、商品最低价。
用于群发的单一口令,或按收件人生成的一批唯一码。整批可导出为文件,并逐码追踪。
每个促销都能看到:产生了多少订单、折扣总额、折后收入与毛利、核销了多少码、还剩多少。
购物车 — 订单的草稿:一组商品,对顾客和商家都还没有产生义务。其中的商品没有被预留,价格也没有锁定,因此每次打开购物车都会重新计算。
重新计算会检查四件事:商品仍在售、库存足够、价格没变、折扣仍有效。任何变化顾客都在付款前看到,而不是在扣款之后。
购物车必须做到:
结算合计:3 件商品,11 640 索姆。两处差异都在付款前告知顾客,而不是在扣款之后。

购物车旁边还有一些不直接导向购买的清单:收藏、到货提醒、按参数比价、重复上次订单。它们是被刻意分开的——否则订单金额就不再唯一确定。
大多数购物车不会变成订单。系统会带时间戳保存它们,并有办法把顾客请回来:邮件或即时通讯提醒、恢复购物车内容的链接、专属优惠。
提醒按事件只发一次,不会变成群发广告——一次退订的代价,比一笔挽回的订单更贵。
订单 — 一份单据,锁定了购买内容、下单时的价格、顾客本人、配送和支付条件。此后订单在一组有限的状态中流转,每一次流转都会被记录。
价格和折扣在下单时锁定:之后的调价或促销结束都不会影响已生成的订单——否则应付金额就会和小票金额对不上。
下单结算的步骤:

常见状态: 新订单 → 待付款 → 已付款 → 拣货中 → 已交配送 → 已送达 → 已完成。取消和退货是并行的分支。状态集合可按公司流程配置,但始终是有限且明确的。
修改订单是一项单独的、受权限控制的操作:加商品、换商品、改数量、补款或部分退款。每次修改都会保留上一版订单内容。
呼叫中心 — 它不是一个独立的程序,而是搭在同一个订单队列之上的工作台。客服看到的记录和顾客在个人中心看到的一样,另外还有对顾客关闭的操作:修改订单内容、在授权额度内给折扣、释放预留、退款。
一次咨询和订单一样,是带状态和历史的记录:它有渠道、主题、关联订单、负责人和回复时限。因此交接班时对话不会丢失,处理结果也留在客户档案里。
一次咨询的处理路径:
外呼工作的模式相同:拣货前确认订单、就特殊配送致电、挽回弃购的购物车、就争议退货回访。每一次接触都写进与来电咨询同一段历史。

商家既不保存银行卡信息,也不自行完成扣款:它把顾客交给支付服务商,取回操作结果,并与订单关联。其余部分是对支付生命周期的管理。

| 订单 | 操作 | 金额 | 状态 |
|---|---|---|---|
| 14 208 | 预授权 | 12 480 | 已冻结 |
| 14 201 | 扣款 | 6 350 | 已完成 |
| 14 177 | 退款 | 2 100 | 已完成 |
| 14 206 | 撤销预授权 | 3 940 | 已解冻 |
| 14 209 | 银行拒付 05 | 890 | 重试 |
预授权已解冻,未产生退款交易:仓库无货。带幂等键重发请求不会生成第二条记录。
银行卡、二维码与快捷支付系统、电子钱包、货到付款、企业客户对公转账、分期与信贷、积分抵扣。
先做预授权:金额在卡上冻结,但不扣走。拣货完成后再扣款。若商品缺货,直接解冻,不产生退款交易。
操作结果通过独立的服务器请求送达,而不是依赖顾客跳回网站。关掉浏览器不会中断支付:状态会按通知更新。
重复发送同一笔支付请求不会产生第二笔支付。每个操作都带一个键,服务商和系统据此识别重复。
线上支付完成后,联网收银系统生成税务凭证并发送给顾客。退货时,就退回的商品生成退货凭证。
每天把系统内的操作与服务商流水和银行对账单逐笔比对。有差异的进入单独的清单,人工排查。
可售库存 — 此刻可以卖出的商品数量。它不等于仓库里的实物数量:一部分被订单预留,一部分在途,一部分作为残次品被锁定。
可售数量 = 实物库存 − 预留 − 锁定 + 已确认的在途到货(在允许预售的场景下)。
当有多个仓库和门店时,库存按每个仓库分别计算,前台展示的是能配送到所选地区的那些仓库的合计数。
数据交换的方式:
预留一定有有效期:未按时付款的订单会把商品释放回可售——否则弃购的购物车会把可售库存全部吃掉。
| 仓库 | 实物 | 预留 | 残次 | 可售 |
|---|---|---|---|---|
| 中心仓 | 1 420 | 310 | 24 | 1 086 |
| 「东方」门店 | 96 | 12 | — | 84 |
| 自提点 № 3 | 40 | 8 | 2 | 30 |
| 在途到货 | 600 | — | — | 600 |
| 可供销售 | 2 156 | 330 | 26 | 1 800 |
实物为实际在库数量,残次为被锁定的数量。只有在允许预售的地方,在途到货才计入可售。前台展示的是能配送到所选地区的那些仓库的合计数。
配送由三个对象描述:配送方式、区域和费率。退货是一个有自己单据的逆向流程,而不是「事后取消」。
配送员送货上门、自提点、快递柜、门店自提、大件走物流公司、电子商品的数字交付。
费用取决于地区、重量、体积和订单金额。规则定义免运门槛,以及上楼和超大件的附加费。
日期和时间窗根据仓库作息、拣货时长和承运商时刻表计算。已排满的档期自动关闭。
订单通过 API 交给承运商,系统取回运单号和在途状态,并展示在个人中心里。
顾客选择商品和原因,系统按商品类型核验退货期限和是否允许退货,随后生成带操作说明的单据。
验收之后,商品退回可售库存或作残次品报损,款项按原路退回,并生成退货凭证。
部分退货是常态:一张五件的订单里退回一件。因此退款按商品逐项计算,整单折扣按比例分摊到各商品上——否则退款金额会和小票对不上。
仓库员工 — 实际搬运商品的员工:验收到货、放入货位、按订单取货、把打包好的箱子交给配送员。系统了解这些动作,靠的不是员工口述:每一步操作都由扫码确认。
这个区别很关键。在清单上打勾确认的是意图,扫码确认的是事实:具体的货号、具体的货位、具体的员工,精确到秒的时间。货号打错一个月后才在盘点时暴露;条码不对,应用当场就不接受。
仓库员工一个班次要做什么:

每一次扫码都是一笔库存过账:货位余额在操作发生的那一刻就变了,而不是晚上补录单据时才变。前台、收银台和呼叫中心读的是同一份库存,因此「网上有货、货架没货」不再是日常。
拣货准确率 99.4%:本班次有 7 次扫码被拦下,全部当场纠正。数据取自同一批库存过账,而不是另一份工时表。
配送员 — 履约的最后一环,也是顾客唯一会当面见到的员工。他的应用解决两件事:带他跑完路线,并把交付这一事实固定下来,之后不必再靠打电话去确认。
关键操作是交付时扫二维码。码印在订单标签上,或由顾客在屏幕上出示。这一扫回答了原本会引发争执的问题:交出去的是不是这单、收货的是不是本人、在哪一分钟完成的。
调度员 在同一个应用的另一端工作:按区域、重量、体积和时间段编排路线,指派配送员,查看当班地图,处理异常——延误、联系不上、上门被拒。
配送员一个班次的步骤:

配送员设置的状态,顾客在个人中心里看到,客服在订单里看到,都是同一个。没有单独的「配送员日志」:事件只有一份,三方读的是同一份。
仓库员工和配送员用不同的应用、在不同的地点工作,但处理的是同一笔订单。把他们连起来的不是下班后的报表,而是六条共同的规则。
拣货任务、装箱单和路线单不是各自独立的纸片,而是同一笔订单的不同视图。客服加进去的商品,无需重新录入就能传到仓库员工手上。
商品通过扫码从仓库转到配送员、再从配送员转到顾客。任何时刻都能看到订单实物在谁手上、从哪一分钟起。
谁做的动作,就由谁在做的地方打标记。调度员不用手工搬运状态,因此事实和记录之间不会隔着几个小时。
两个应用都把操作写进本地队列,等有网络时再补传。每个操作都带一个键,因此重发不会产生第二次拣货或第二次交付。
收货缺货、错发、破损、上门部分拒收——每一种情况都会成为一条带原因和责任人的独立记录,而不是悄悄改一下库存。
每小时拣货件数、拣货准确率、准时送达占比、在地址停留时长、部分拒收占比。工作量和奖金按这些事实计算,而不是凭感觉。
由此也就有了落地要求:仓库和配送要一起接入系统。只有仓库员工应用而没有配送员应用,得到的是一份精确的库存——出了发货口就再也看不见了。
个人中心 — 顾客无需找客服就能查看自己的数据:订单、单据、地址、支付方式、退货。个人中心解决的每一个问题,都是一通没有打进客服的电话。
个人中心并不另存一份数据:它展示的就是客服在管理后台看到的那些记录,只是限定为这位顾客的记录,以及他被允许执行的操作。
它包含:
B2B 的个人中心更复杂:一家企业里有多名权限不同的员工。采购负责下单,负责人审批,会计取结算单据。订单只有一笔,动作却是分开的。
支持一次性验证码或密码登录,涉及资金和更改联系方式的操作需要二次验证,会话日志可以踢掉陌生设备。更换邮箱或手机号需要在新旧两处同时确认。
客服在订单里看到的是同一批记录:事件是共用的,个人中心没有单独的日志。凭证和送货单在「单据」栏目里。
系统对接 — 与外部程序约定好的数据交换:传什么、用什么格式、多久传一次、数据归谁所有、出故障时怎么办。
常见的对接对象:

对接最关键的决定是数据归属。每一类数据都要指定一个归属系统:商品主数据和价格来自 ERP,客户来自 CRM,库存来自仓库,订单诞生在电子商务系统。同一个字段在两个系统里双向修改必然产生持续差异,所以要避免。
| 系统 | 传输内容 | 消息数 | 结果 |
|---|---|---|---|
| ERP | 商品主数据、价格 | 4 120 | 无错误 |
| 仓库 | 库存、预留 | 18 640 | 2 次重试 |
| CRM | 客户、分层 | 1 305 | 无错误 |
| 电商平台 | 订单、库存 | 2 470 | 1 条待排查 |
对接通常不是在上线时坏掉,而是半年后:外部系统升级了、链路断了一小时、或者台账里出现了没预料到的取值。有六条规则决定这样的数据交换能不能扛住。
下单结算不等外部系统回应:消息入队后单独处理。仓库系统不可用,销售照常。
传输失败会按递增的间隔重试。所有重试都失败的消息进入排查队列,而不是就此丢失。
重复投递的消息不会生成第二笔订单,也不会重复扣减库存。接收方按操作键识别重复。
格式变更以新版本发布,旧版本继续可用。外部使用方按自己的节奏迁移。
每条消息连同报文、时间、结果和重试次数一并保存。事故复盘靠日志,而不是靠回忆。
定期核对关键指标:订单、支付金额、库存。有差异就变成一个待办任务,而不是等盘点时才发现。
商品目录与订单
支付
库存与仓库
数据分析
数据分析基于自有的销售和行为数据,而不只是外部的访问量统计。访问量统计只知道浏览次数,系统知道的是钱、商品和退货。
报表可按多个维度切分:时间段、销售渠道、类目、品牌、仓库、地区、客户分层、促销活动。任何指标在每个维度上都可查看,并可导出到文件或数据仓库。

落差最大的一段在购物车与结算之间:注册步骤、运费计算和支付方式要先从这里查起。
安全建立在三件事上:支付数据不进入商家系统;个人数据存得少且受控;任何涉及资金和订单的动作都留下痕迹。
卡号在有资质的服务商侧输入,不会进入商家系统。用于重复扣款的是令牌,而不是卡号。
全部流量走 HTTPS。数据库中的敏感字段加密保存,备份以加密形式存放,与生产环境分离。
基于角色的权限:内容运营看不到支付,客服改不了价格。管理端登录需要双因素认证。
谁改了价格、谁取消了订单、谁导出了客户库。记录不可篡改,并与业务数据分开存放。
只采集必要的最小数据,设定保存期限,可按请求删除,处理和营销授权都带日期和来源。
限制请求频率、防止表单被穷举、控制优惠码重复使用、拣货前对订单做反欺诈校验。
恢复是单独的一环。备份在没有验证过恢复之前毫无用处:恢复演练要按计划做,而不是等出事那天才第一次做。
扩容是指在不重写的前提下扛住增长。会增长的有三样:商品目录规模、同时在线人数、每小时订单量。
商品目录的瓶颈在搜索和筛选,流量高峰的瓶颈在页面响应,订单洪峰的瓶颈在数据库和外部对接。对应的办法也不同,按需要逐步引入。
实践中常用的手段:
| 指标 | 实测 | 阈值 |
|---|---|---|
| 目录响应,p95 | 180 毫秒 | 400 毫秒 |
| 高峰每小时订单数 | 3 000 | 2 400 |
| 命中缓存的响应 | 86% | 70% |
| 目录重建索引 | 9 分钟 | 20 分钟 |
| 从备份恢复 | 22 分钟 | 60 分钟 |
系统由模块拼装而成:每个模块负责自己的一块数据和操作,模块之间的关系写得很明确。项目可以分批上线——先做商品目录和订单,再做会员、数据分析和外部渠道。
商品项、货号、描述、发布状态、商品页版本,以及已下架商品的归档。
分区树、商品挂到多个分支、排序,以及面向专题和季节栏目的落地页。
带数据类型和展示规则的属性台账,是筛选、比价和电商平台导出的基础。
尺码、颜色和容量共用一个商品页,各自有独立货号和库存。套装下单时扣减多个组成商品。
图片、视频和文档,自动生成多种格式和分辨率,加水印,并与商品关联。
价目表、加价规则、阶梯价、专属价与合同价、币种、取整、税费、变更历史。
触发条件、折扣玩法、排期、限制、批量生成优惠码、兼容关系、最低价。
跨设备购物车、价格与可售性重算、结算步骤、访客下单、弃购挽回。
来自所有渠道的统一订单队列、状态与流转、修改内容、补款、拆分发货、取消。
接入服务商、预授权与扣款、部分与全额退款、处理回调通知、对账。
销售和退货凭证、与联网收银机的数据交换、把凭证发给顾客、监控未送达的单据。
各仓库库存、带有效期的预留、残次品锁定、到货与退货验收、库存偏低阈值。
配送方式、区域、费率、时间段与档期、创建运单、状态追踪、打印单据。
按商品逐项申请、核验期限与是否允许、验收、退款、退回库存或报损。
账号、地址、法人主体与合同、订单历史、客户分层、数据处理授权。
积分、等级、累计与抵扣规则、积分有效期、专属优惠、推荐有礼。
搜索索引、词形与同义词、错别字处理、按属性筛选、排序、零结果查询。
相关商品与相似商品、「买了还买」、人工专题,以及基于订单历史的规则。
页面、文章、横幅、元标签与页面地址、商品结构化数据、站点地图、商品数据源。
按订单事件触发的邮件、短信、即时通讯和推送,消息模板、排期、送达日志。
销售、毛利、库存、漏斗和退货报表,任意维度切分,导出,数据看板。
与 CRM、ERP、仓库、收银机、支付和物流服务、电商平台的数据交换。API、Webhook、队列。
按栏目和操作划分的角色与权限、双因素认证、员工操作日志。
同一内核支撑多个前台、多语言与多币种、多个法人主体和仓库、多地区。
系统不会在一个版本里整体上线。下面的顺序体现的是依赖关系:每一步都建立在上一步产出的数据之上。
现有流程、台账,以及各类数据的归属系统。产出是实体模型和对接地图。
迁移商品主数据,配置属性和类目,打通价格和库存交换。用真实数据验证。
下单结算、状态、支付服务商、开具税务凭证、转入执行。先用部分商品上线。
配送与退货、会员、数据分析、新销售渠道。每一块都是一个可度量的独立版本。
请告诉我们现在已经有什么:财务系统、仓库、收银机、现有前台。我们会梳理流程,并提出解决方案架构。