一、背景与技术挑战
私域团购系统本质上是一套多级分销 + 动态定价 + 自动分佣的电商平台。与普通商城相比,它有三个核心技术挑战:
-
五级定价引擎:同一商品需根据用户身份动态展示不同价格,且价格层级可配置。
-
自动结算与分佣:订单完成后需按身份差、团队关系、销售贡献自动计算多方佣金,且要保证高并发下的幂等与一致性。
-
合规硬约束:必须在系统层面锁定分销层级(默认三级),杜绝多级计酬、拉人头奖励,并实现全链路数据留痕。
本文从技术视角拆解这套系统的架构设计与关键实现。数据来自公开媒体报道,仅供参考,不构成收益承诺。
二、总体架构
采用前后端分离 + 微服务架构:
┌─────────────────────────────────────────────────────┐
│ 前端层 │
│ 小程序 / H5 / APP │ 管理后台 │ 分销商工作台 │
└─────────────────────────────────────────────────────┘
│
┌─────────────────────────────────────────────────────┐
│ API 网关 │
│ 鉴权 / 限流 / 路由 / 日志 │
└─────────────────────────────────────────────────────┘
│
┌──────────┬──────────┬──────────┬──────────┬─────────┐
│ 用户服务 │ 商品服务 │ 订单服务 │ 佣金服务 │ 合规服务 │
│ User │ Product │ Order │ Commission│ Compliance│
└──────────┴──────────┴──────────┴──────────┴─────────┘
│
┌─────────────────────────────────────────────────────┐
│ MySQL / Redis / MQ / 对象存储 / 审计日志 │
└─────────────────────────────────────────────────────┘
核心服务说明:
-
用户服务:管理用户身份等级(L1-L5)、上下级关系(仅三级)。
-
商品服务:商品基础价、五级价格表。
-
订单服务:下单、支付、发货、签收状态机。
-
佣金服务:佣金计算、分账、结算、提现。
-
合规服务:层级校验、计酬规则校验、全链路审计。
三、五级定价引擎设计
3.1 数据模型
商品价格表 product_price:
| 字段 | 类型 | 说明 |
|---|---|---|
| id | bigint | 主键 |
| product_id | bigint | 商品ID |
| base_price | decimal(10,2) | 基准零售价(如89.00) |
| level_1_price | decimal(10,2) | 团购用户价 |
| level_2_price | decimal(10,2) | 分销商价 |
| level_3_price | decimal(10,2) | 小批发价 |
| level_4_price | decimal(10,2) | 中批发价 |
| level_5_price | decimal(10,2) | 大批发价 |
| status | tinyint | 启用状态 |
用户身份表 user_identity:
| 字段 | 类型 | 说明 |
|---|---|---|
| user_id | bigint | 用户ID |
| level | tinyint | 1-5,对应五级 |
| parent_id | bigint | 直接上级ID |
| grandparent_id | bigint | 上上级ID(仅存两级,第三级通过查询) |
| path | varchar(255) | 层级路径,如 1/10/25 |
3.2 价格查询逻辑
java
public BigDecimal getPrice(Long userId, Long productId) {
UserIdentity identity = userIdentityMapper.selectByUserId(userId);
ProductPrice price = productPriceMapper.selectByProductId(productId);
switch (identity.getLevel()) {
case 1: return price.getLevel1Price();
case 2: return price.getLevel2Price();
case 3: return price.getLevel3Price();
case 4: return price.getLevel4Price();
case 5: return price.getLevel5Price();
default: throw new BizException("未知身份等级");
}
}
前端展示时,同一商品对五级用户展示不同价格,实现"身份越高,进价越低"。
四、自动结算与分佣引擎
4.1 订单归属
订单创建时记录 distributor_id(推广分销商),通过分享链接或邀请码绑定。订单表关键字段:
sql
CREATE TABLE `order` (
`id` bigint NOT NULL AUTO_INCREMENT,
`order_no` varchar(64) NOT NULL,
`user_id` bigint NOT NULL COMMENT '下单用户',
`distributor_id` bigint NOT NULL COMMENT '归属分销商',
`product_id` bigint NOT NULL,
`quantity` int NOT NULL,
`unit_price` decimal(10,2) NOT NULL COMMENT '实际成交单价',
`total_amount` decimal(10,2) NOT NULL,
`status` tinyint NOT NULL COMMENT '0待支付 1已支付 2已发货 3已签收 4已完成',
`created_at` datetime,
`signed_at` datetime,
PRIMARY KEY (`id`),
UNIQUE KEY `uk_order_no` (`order_no`)
);
4.2 佣金计算模型
佣金来源分为四类:
| 类型 | 计算方式 | 约束 |
|---|---|---|
| 零售差价 | 成交价 - 本人进价 | 仅本人订单 |
| 层级差价 | 下级进价 - 本人进价 | 仅直接下级、二级内 |
| 团队管理收益 | 直属团队真实销售额 × 比例 | 三级内,按销售计酬 |
| 奖励活动 | 后台配置 | 不挂钩人头 |
层级差价示例(以基准价89元为例):
-
大批发(64元)供货给中批发(67元),赚3元/件
-
中批发(67元)供货给小批发(71元),赚4元/件
-
小批发(71元)供货给分销商(75元),赚4元/件
佣金计算伪代码:
java
public CommissionResult calculateCommission(Order order) {
CommissionResult result = new CommissionResult();
Long distributorId = order.getDistributorId();
// 1. 零售差价:分销商本人进价与成交价差额
BigDecimal selfPrice = getPrice(distributorId, order.getProductId());
BigDecimal retailDiff = order.getUnitPrice().subtract(selfPrice)
.multiply(BigDecimal.valueOf(order.getQuantity()));
result.addRetailCommission(distributorId, retailDiff);
// 2. 层级差价:仅计算直接上级和上上级,最多两级
UserIdentity distributor = getIdentity(distributorId);
Long parentId = distributor.getParentId();
if (parentId != null) {
BigDecimal parentPrice = getPrice(parentId, order.getProductId());
BigDecimal parentDiff = selfPrice.subtract(parentPrice)
.multiply(BigDecimal.valueOf(order.getQuantity()));
result.addSpreadCommission(parentId, parentDiff);
// 上上级
UserIdentity parent = getIdentity(parentId);
Long grandId = parent.getParentId();
if (grandId != null) {
BigDecimal grandPrice = getPrice(grandId, order.getProductId());
BigDecimal grandDiff = parentPrice.subtract(grandPrice)
.multiply(BigDecimal.valueOf(order.getQuantity()));
result.addSpreadCommission(grandId, grandDiff);
}
}
// 3. 团队管理收益:按直属团队真实销售额计算,三级内
// 此处省略具体实现,核心是只统计真实成交订单,不统计人头
// ...
return result;
}
4.3 幂等与并发
佣金计算在订单签收后触发,通过消息队列异步处理:
订单签收 → 发送MQ消息 → 佣金服务消费 → 计算佣金 → 写入佣金流水 → 更新账户余额
幂等保证 :以 order_no + commission_type + user_id 作为唯一键,防止重复计算。
sql
CREATE TABLE `commission_flow` (
`id` bigint NOT NULL AUTO_INCREMENT,
`order_no` varchar(64) NOT NULL,
`user_id` bigint NOT NULL,
`commission_type` tinyint NOT NULL COMMENT '1零售差 2层级差 3团队收益 4奖励',
`amount` decimal(10,2) NOT NULL,
`status` tinyint NOT NULL COMMENT '0待结算 1已结算 2已失效',
`created_at` datetime,
PRIMARY KEY (`id`),
UNIQUE KEY `uk_order_user_type` (`order_no`, `user_id`, `commission_type`)
);
五、合规技术实现:三道硬约束
5.1 层级上限锁定
在用户注册和绑定上下级时,强制校验层级深度:
java
public void bindParent(Long userId, Long parentId) {
// 查询parent的层级深度
int parentDepth = getDepth(parentId);
if (parentDepth >= 3) {
throw new BizException("分销层级已达上限,无法继续绑定");
}
// 绑定关系
userIdentityMapper.updateParent(userId, parentId);
}
后台可配置最大层级,默认三级。超出层级无法发放佣金,从结构上杜绝多级计酬。
5.2 按真实销售计酬
佣金引擎只读取 order 表中状态为"已签收"的真实成交订单,不读取任何"拉人头""团队人数"数据。计酬科目仅包含:
-
零售差价
-
层级差价(仅两级)
-
团队销售服务费(按真实销售额)
-
平级/培育奖励(挂钩真实销售)
-
团队冲量奖(后台设上限,不挂钩人头)
禁止的计酬科目:人头奖励、入门费返利、多级提成。
5.3 零门槛 + 全链路留痕
-
零门槛:注册即成为L1团购用户,无需付费、无需强制购货。
-
数据留痕:所有订单、佣金、结算、层级变更均写入审计日志表:
sql
CREATE TABLE `audit_log` (
`id` bigint NOT NULL AUTO_INCREMENT,
`user_id` bigint,
`action` varchar(64) COMMENT '操作类型',
`target_id` bigint COMMENT '目标ID',
`before_data` json,
`after_data` json,
`ip` varchar(45),
`created_at` datetime,
PRIMARY KEY (`id`)
);
审计日志不可篡改,支持按用户、时间、操作类型检索,便于配合监管核查。
六、数据库设计要点
6.1 用户层级关系表
sql
CREATE TABLE `user_relation` (
`user_id` bigint NOT NULL,
`parent_id` bigint DEFAULT NULL,
`grandparent_id` bigint DEFAULT NULL,
`level` tinyint NOT NULL COMMENT '1-5身份等级',
`path` varchar(255) COMMENT '层级路径',
`created_at` datetime,
`updated_at` datetime,
PRIMARY KEY (`user_id`),
KEY `idx_parent` (`parent_id`),
KEY `idx_grand` (`grandparent_id`)
);
6.2 佣金流水表
sql
CREATE TABLE `commission_flow` (
`id` bigint NOT NULL AUTO_INCREMENT,
`order_no` varchar(64) NOT NULL,
`user_id` bigint NOT NULL,
`commission_type` tinyint NOT NULL,
`amount` decimal(10,2) NOT NULL,
`status` tinyint NOT NULL DEFAULT 0,
`settled_at` datetime,
`created_at` datetime,
PRIMARY KEY (`id`),
UNIQUE KEY `uk_order_user_type` (`order_no`, `user_id`, `commission_type`),
KEY `idx_user` (`user_id`),
KEY `idx_status` (`status`)
);
七、性能与扩展考虑
-
缓存:商品五级价格、用户身份信息放入 Redis,减少数据库压力。
-
异步结算:佣金计算走 MQ,避免阻塞订单主流程。
-
分库分表:订单表和佣金流水表按用户ID哈希分片,支撑高并发。
-
对账系统:每日定时对账,确保订单金额、佣金金额、账户余额一致。
-
合规审计:审计日志独立存储,保留至少3年,支持导出。
八、总结
私域团购系统的技术核心在于:动态定价、自动分佣、合规硬约束。
-
五级定价通过价格表和身份表联动实现;
-
自动结算通过订单归属 + 层级关系 + 佣金引擎实现,并用幂等和 MQ 保证一致性;
-
合规通过层级上限锁定、按真实销售计酬、全链路留痕三道硬约束实现。