技术摘要
以顶俏洗衣液为代表的"积分换货"模式,通过"用户下单→门店核销→平台返积分→积分补货"的闭环,实现了平台轻库存、门店不垫资的供应链重构。本文从供应链与库存系统视角,拆解积分账户体系、核销状态机、补货引擎、反向拉动生产的完整技术实现。方案适用于快消品、日化、生鲜等高频刚需行业的分销系统与多门店零售系统。
大家好,我是微三云生态系统架构师彭丹,每天带你洞察行业新风口,拆解爆款新模式。
一、背景与痛点
传统日化分销是"进货→铺货→卖货"的正向供应链:经销商先掏钱囤货,货压在渠道里,资金卡在仓库中。这种模式有三个长期痛点:
第一,渠道资金压力大。门店每进一批货就要付一批货款,资金周转效率低,中小门店不敢大量囤货,导致铺货密度上不去。
第二,平台库存风险高。平台如果自建仓储铺货,库存占压资金、滞销风险高,还要承担物流成本,轻资产运营难以实现。
第三,动销与补货脱节。传统模式下,门店卖了多少货、该补多少货,全靠人工盘点估算,补货滞后导致断货或积压。
近年来,"积分换货"模式提供了新思路。据行业公开报道,某洗衣液品牌通过"先核销再进货"的积分动销闭环,一年拓展超6000家门店,平台全程不碰库存。其核心机制是:用户下单→就近门店核销提货→平台返还等额积分→门店用积分补货→工厂按积分消耗安排生产。
这套模式的技术核心,是"积分即货款"的闭环账户体系和"卖多少补多少"的库存拉动机制。
二、系统架构设计
2.1 整体架构
┌──────────────────────────────────────────────────────┐
│ 用户端(消费者小程序) │
│ 下单 │ 选核销门店 │ 生成核销码 │ 复购 │ 转介绍 │
├──────────────────────────────────────────────────────┤
│ 门店端(核销网点/工厂店) │
│ 扫码核销 │ 库存管理 │ 积分补货 │ 收益看板 │ 下级管理 │
├──────────────────────────────────────────────────────┤
│ 平台核心服务层 │
│ 订单中心 │ 核销引擎 │ 积分账户 │ 补货引擎 │ 生产计划 │
├──────────────────────────────────────────────────────┤
│ 数据层 │
│ 积分台账 │ 库存快照 │ 订单流水 │ 补货批次 │ 对账系统 │
└──────────────────────────────────────────────────────┘
2.2 核心模块划分
模块 职责 关键输入 关键输出
订单中心 消费者下单、分配核销门店 商品、收货方式 订单、核销码
核销引擎 门店核销确认、触发积分返还 核销码、门店身份 核销记录、积分流水
积分账户 积分发放、冻结、兑换补货 核销事件 积分余额、台账流水
补货引擎 积分换货、库存履约 积分、补货申请 补货单、发货指令
生产计划 按积分消耗拉动生产 积分消耗汇总 生产订单、原料计划
2.3 技术选型
订单与核销:订单状态机 + 核销码(短码+签名防伪),Redis缓存核销状态
积分账户:MySQL账户表 + 流水表,账实一致,双写幂等
库存引擎:分布式库存(Redis预占+DB落库),防止超卖
补货履约:积分兑换触发采购单,对接WMS/供应商系统
对账:每日三方对账(积分流水/核销记录/库存变动)
三、核心模块实现
3.1 积分账户体系:积分即货款
积分是整套模式的"货币",必须做到"1积分=1元货款,仅用于体系内补货,不可提现、不可兑换非经营商品",从根源锁定积分流转闭环。
数据结构
-- 积分账户表(每门店一个账户)
CREATE TABLE credit_account (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
merchant_id BIGINT NOT NULL COMMENT '门店ID(核销网点/工厂店)',
merchant_type VARCHAR(20) NOT NULL COMMENT 'STORE/FACTORY',
balance INT NOT NULL DEFAULT 0 COMMENT '可用积分余额',
frozen_balance INT NOT NULL DEFAULT 0 COMMENT '冻结积分(补货中)',
total_earned INT NOT NULL DEFAULT 0 COMMENT '累计获得',
total_spent INT NOT NULL DEFAULT 0 COMMENT '累计消耗',
version INT NOT NULL DEFAULT 0 COMMENT '乐观锁版本号',
updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
UNIQUE KEY uk_merchant (merchant_id)
) COMMENT '积分账户表';
-- 积分流水表(账实一致,每笔可追溯)
CREATE TABLE credit_flow (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
account_id BIGINT NOT NULL,
merchant_id BIGINT NOT NULL,
biz_type VARCHAR(30) NOT NULL COMMENT 'NUCLEAR_REBATE/ORDER_CONSUME/REFUND',
biz_no VARCHAR(64) NOT NULL COMMENT '业务单号(订单号/核销号)',
change_amount INT NOT NULL COMMENT '变动值(正负)',
balance_after INT NOT NULL COMMENT '变动后余额',
remark VARCHAR(255) NULL,
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
INDEX idx_account (account_id),
INDEX idx_biz (biz_no)
) COMMENT '积分流水表';
积分入账与乐观锁
class CreditAccountService:
def rebate_on_nuclear(self, merchant_id, order_id, nuclear_amount):
"""核销触发积分返还:1元=1积分"""
credit = int(nuclear_amount) # 1元货款=1积分
with self.db.transaction():
# 1. 幂等校验:同一核销单不重复返还
if self.flow_exists('NUCLEAR_REBATE', order_id):
return {'status': 'DUPLICATE'}
# 2. 乐观锁更新余额(防止并发覆盖)
rows = db.execute(
"UPDATE credit_account SET balance = balance + %s, "
"total_earned = total_earned + %s, version = version + 1 "
"WHERE merchant_id = %s AND version = %s",
(credit, credit, merchant_id, self.get_version(merchant_id))
)
if rows == 0:
raise ConcurrentUpdateException(merchant_id)
# 3. 记录积分流水(账实一致)
new_balance = self.get_balance(merchant_id)
db.insert_credit_flow(
account_id=self.get_account_id(merchant_id),
merchant_id=merchant_id,
biz_type='NUCLEAR_REBATE',
biz_no=order_id,
change_amount=credit,
balance_after=new_balance,
remark=f'核销返还积分{order_id}'
)
return {'status': 'SUCCESS', 'balance': new_balance}
3.2 核销引擎:从下单到积分返还的状态机
核销是整个闭环的"触发点",核销确认后才产生积分,才允许补货。
订单核销状态机
PENDING(待核销)
↓ 门店扫码核销
VERIFYING(核销校验中)
↓ 校验通过(核销码有效+门店有权限)
NUCLEARED(已核销)
↓ 触发积分返还+扣减库存
CREDIT_RETURNED(积分已返)
↓ 同步上级/工厂店积分
SYNCED(已同步)
核销码与核销流程
class NuclearEngine:
def generate_code(self, order):
"""生成带签名的核销码,防伪造"""
payload = f"{order.id}|{order.store_id}|{order.expire_time}"
sign = hmac_sha256(payload, SECRET_KEY):8
return base62_encode(payload + "|" + sign)
def verify_and_nuclear(self, code, operator_store_id):
"""门店扫码核销"""
# 1. 解码并校验签名
payload, sign = self.parse_code(code)
if not self.verify_sign(payload, sign):
return {'status': 'INVALID_CODE'}
# 2. 校验核销门店权限
order = order_service.get(order_id=payload.order_id)
if operator_store_id != order.store_id:
return {'status': 'NO_PERMISSION'}
# 3. 校验订单状态(只能核销一次)
if order.status != 'PENDING':
return {'status': 'ALREADY_NUCLEARED'}
# 4. 状态流转:PENDING → NUCLEARED
order_service.transit_status(order.id, 'PENDING', 'NUCLEARED')
# 5. 触发积分返还(异步,不阻塞核销)
mq.publish('credit_rebate_topic', {
'order_id': order.id,
'merchant_id': operator_store_id,
'amount': order.amount,
})
return {'status': 'SUCCESS'}
3.3 补货引擎:积分兑换与库存履约
门店用积分向平台申请补货,平台收到积分后履约发货。核心是"卖多少补多少"的动态补货策略。
补货流程
门店提交补货申请(消耗积分)
↓
校验积分余额充足(冻结积分)
↓
生成补货单(关联积分冻结流水)
↓
平台分配货源(工厂店/中央仓)
↓
发货履约(物流单号回填)
↓
核销积分(冻结→扣减)+ 库存入库确认
动态补货策略伪代码
class ReplenishmentEngine:
def suggest_replenish(self, store_id):
"""基于核销数据动态建议补货量"""
近7天日均核销量(滑动窗口)
daily_avg = self.nuclear_stats.daily_avg(store_id, days=7)
# 当前库存(按件)
current_stock = self.inventory.get(store_id)
# 安全库存 = 日均核销量 × 补货周期天数 × 安全系数
lead_days = 3 # 补货到货周期
safety_stock = daily_avg * lead_days * 1.5
# 建议补货量
suggest_qty = max(0, safety_stock - current_stock)
return {
'daily_avg': daily_avg,
'current_stock': current_stock,
'safety_stock': safety_stock,
'suggest_qty': suggest_qty,
'required_credit': suggest_qty * self.unit_price
}
def apply_replenish(self, store_id, items):
"""门店积分换货"""
total_credit = sum(item['qty'] * self.unit_price for item in items)
with self.db.transaction():
# 1. 冻结积分
self.credit_service.freeze(store_id, total_credit, 'REPLENISH')
# 2. 生成补货单
replenish_no = gen_no('RE')
db.insert_replenish_order(
no=replenish_no, store_id=store_id,
items=items, credit_cost=total_credit,
status='PENDING_SHIP'
)
# 3. 通知库存履约
mq.publish('replenish_topic', {'no': replenish_no, 'store_id': store_id})
return replenish_no
3.4 生产计划:按积分消耗拉动生产
积分换货模式最独特的技术点是反向拉动生产:平台不预生产,而是根据积分消耗汇总动态安排生产计划,实现"先有订单再生产"。
class ProductionPlanner:
def plan_by_credit_consumption(self):
"""按积分消耗拉动生产计划"""
1. 汇总近7日积分消耗(补货兑换量)
consumption = self.credit_flow.aggregate(
biz_type='ORDER_CONSUME',
days=7,
group_by='product_id'
)
# 2. 生产计划 = 消耗量 × 安全系数 - 在途库存 - 平台库存
plans = []
for product_id, consumed_qty in consumption.items():
in_transit = self.inventory.in_transit(product_id)
platform_stock = self.inventory.platform_stock(product_id)
plan_qty = max(0, int(consumed_qty * 1.3) - in_transit - platform_stock)
if plan_qty > 0:
plans.append({
'product_id': product_id,
'plan_qty': plan_qty,
'producer': self.route_producer(product_id), # 分配工厂店
})
# 3. 生成生产订单,下发工厂
for plan in plans:
self.production_order.create(plan)
return plans
3.5 库存引擎:防止超卖
门店核销与平台库存分离,核销时扣减门店虚拟库存,补货时平台实物库存出库。
-- 门店虚拟库存(核销扣减)
CREATE TABLE store_inventory (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
store_id BIGINT NOT NULL,
product_id BIGINT NOT NULL,
qty INT NOT NULL DEFAULT 0 COMMENT '可用库存',
UNIQUE KEY uk_store_product (store_id, product_id)
) COMMENT '门店库存表';
-- 平台实物库存(补货履约)
CREATE TABLE platform_inventory (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
product_id BIGINT NOT NULL,
available_qty INT NOT NULL DEFAULT 0,
in_transit_qty INT NOT NULL DEFAULT 0,
UNIQUE KEY uk_product (product_id)
) COMMENT '平台库存表';
四、风控与边界
4.1 合规设计
积分闭环:积分仅用于体系内补货,不可提现、不可交易、不可兑换非经营商品,避免积分金融化风险
不碰资金池:消费者付款直接进平台或受监管账户,门店通过核销积分补货,不涉及"拉人头"式资金流转
分级谨慎:推荐奖励与真实核销行为挂钩,层级设置需符合《禁止传销条例》,多级团队计酬属高风险设计,应严格规避
4.2 异常处理
异常场景 处理策略
核销码被复用 状态机保证单次核销,重复核销返回错误并告警
积分并发扣减 乐观锁+流水幂等,防止余额被并发覆盖
补货超卖 积分冻结+库存预占,库存不足自动拦截
核销后退款 回退核销状态、回收积分、恢复库存
积分入账延迟 消息队列异步入账+对账扫描兜底
4.3 性能瓶颈与优化
瓶颈 优化方案
核销高并发(大促) Redis缓存核销状态,DB异步落库
积分流水量大 按月分表,按merchant_id哈希分片
库存热点 库存按SKU拆分多分片,预占+扣减分离
对账耗时长 离线批处理+增量对账,每日凌晨跑批
4.4 适用与不适用场景
适用场景:
- 快消品、日化、生鲜等高复购、高刚需品类
- 线下门店网络密集、需要低成本铺货的渠道体系
- 平台希望轻资产运营、不承担库存风险的场景
不适用场景:
- 低复购、低频次的长尾商品(积分闭环拉动效果弱)
- 无线下门店网络、纯线上履约的场景(核销环节缺失)
- 商品毛利过薄、无法支撑积分返还的场景
五、总结与展望
积分换货系统的核心价值,是把传统"进货→铺货→卖货"的正向供应链,重构为"用户下单→核销→返积分→补货→反向生产"的拉动式闭环。平台轻库存、门店不垫资、工厂按需生产,三方资金效率都得到提升。
在微三云做分销与供应链系统架构时,我们验证了一个判断:积分闭环类系统的技术难点不在单点功能,而在"账实一致"------积分账户、核销记录、库存变动三套数据必须完全对得上。任何一环对不上,就会在月底对账时集中爆发。
未来演进方向:一是供应链金融结合,基于核销数据评估门店信用,提供合规的周转支持;二是智能补货升级,结合销量预测模型替代简单滑窗均值;三是多品类扩展,积分体系从单品类扩展到跨品类生态,但需守住"积分锚定实物"的合规底线。
常见问答
Q:积分换货系统的积分为什么不设计成可提现?
A:积分可提现会把"消费激励"变成"金融承诺",触碰非法集资红线。积分锚定实物、仅在体系内闭环流转(补货/兑换),既是合规要求,也是防止积分被炒作的核心设计。
Q:门店核销后积分返还,会不会造成门店囤积分不进货?
A:通过积分有效期管理和动态补货策略约束,同时工厂店有动力协助下级网点周转,系统可设置积分到期回收规则,防止积分沉淀失衡。
Q:平台零库存是怎么实现的?
A:用户下单后由门店核销提货(门店持有实物),平台只记录订单与积分;门店用积分向平台申请补货,平台按积分消耗安排工厂生产。平台实物库存趋近于零,只承担信息与结算。
Q:积分换货系统怎么防止刷单套积分?
A:核销码签名防伪、设备指纹风控、门店核销权限校验、异常核销模式检测(同门店集中核销、同设备批量下单),结合积分流水全程可追溯,异常触发人工审核。
Q:这套系统适合什么样的行业复制?
A:适合高频刚需、复购率高、门店密度大的快消品类(日化、粮油、生鲜)。核心前提是商品毛利足以支撑积分返还,且具备线下自提/核销场景。
📌 含AI辅助内容
本文部分内容由AI辅助整理优化,技术方案仅供参考,实际落地请结合业务场景评估。
积分换货系统 #门店核销引擎 #供应链重构 #积分账户体系 #库存引擎 #拉动式生产 #快消分销系统