资讯详情

资讯详情

良久团购模式分佣引擎技术拆解:规则引擎、幂等设计与对账方案

一、为什么分佣引擎是私域团购系统的核心私域团购系统的技术难点不在商城前端而在后端分佣。原因有三规则复杂零售差、层级差、团队收益叠加五级身份、三级分销规则组合多。一致性要求高佣金算错、重复发放直接导致资金损失和用户投诉。合规压力大必须只按真实销售计酬层级不可超三级全链路可追溯。公开报道显示良久团购模式运营主体浙江润妍品牌管理有限公司曾披露年GMV 60亿、40万团长、600工厂。以60亿年流水估算日均约1644万月均约5亿。这个量级下分佣引擎必须做到高吞吐、最终一致、幂等、可对账。本文从技术实现角度拆解分佣引擎的设计。二、分佣引擎整体架构订单服务 → MQ订单完成事件 → 分佣引擎 分佣引擎 1. 规则加载规则引擎 2. 关系链查询三级 3. 佣金计算零售差/层级差/团队收益 4. 幂等写入commission_record 5. 发送结算MQ 结算中心 1. 签收确认 2. 佣金结算 3. 账户入账 对账系统 定时任务 离线数仓 → 三方对账 合规风控 层级校验、真实销售校验、审计日志核心原则规则可配置、计算异步化、写入幂等、对账自动化。三、规则引擎设计让佣金规则可配置佣金规则如果硬编码每次调整都要发版。用规则引擎可以做到热更新。3.1 选型对比方案优点缺点Drools功能强大社区成熟学习成本高性能一般Aviator轻量表达式简单复杂规则支持弱Groovy灵活可写脚本安全风险性能差自研规则表简单可控性能好复杂逻辑实现麻烦推荐规则表 Aviator 表达式平衡灵活性和性能。3.2 规则表设计sqlCREATE TABLE commission_rule ( id BIGINT PRIMARY KEY AUTO_INCREMENT, rule_code VARCHAR(64) NOT NULL, level_id INT NOT NULL COMMENT 身份等级L1-L5, rule_type VARCHAR(32) NOT NULL COMMENT RETAIL/SPREAD/TEAM, expression VARCHAR(512) NOT NULL COMMENT Aviator表达式, max_depth INT DEFAULT 3, status TINYINT DEFAULT 1, UNIQUE KEY uk_code_level_type (rule_code, level_id, rule_type) );示例规则rule_codelevel_idrule_typeexpressionNORMAL2RETAILprice - costPriceNORMAL3SPREAD(downPrice - costPrice) * qtyNORMAL4TEAMteamSales * 0.053.3 规则执行javapublic BigDecimal calcCommission(Order order, User promoter, Rule rule) { MapString, Object env new HashMap(); env.put(price, order.getPrice()); env.put(costPrice, order.getCostPrice()); env.put(qty, order.getQty()); env.put(teamSales, teamService.getSales(promoter.getId())); Expression exp AviatorEvaluator.compile(rule.getExpression(), true); Object result exp.execute(env); return new BigDecimal(result.toString()).setScale(2, RoundingMode.HALF_UP); }规则变更后清 Redis 缓存发 MQ 通知各节点重新加载。四、幂等设计防止佣金重复发放分佣引擎消费 MQ 时可能因重试导致重复计算。必须做幂等。4.1 幂等键设计sqlCREATE TABLE commission_record ( id BIGINT PRIMARY KEY AUTO_INCREMENT, order_id BIGINT NOT NULL, user_id BIGINT NOT NULL, from_user_id BIGINT NOT NULL, rule_type VARCHAR(32) NOT NULL, depth INT NOT NULL, amount DECIMAL(10,2) NOT NULL, status TINYINT DEFAULT 0 COMMENT 0待结算 1已结算 2已失效, unique_key VARCHAR(128) NOT NULL, created_at DATETIME DEFAULT CURRENT_TIMESTAMP, UNIQUE KEY uk_unique_key (unique_key) );unique_key order_id _ user_id _ rule_type _ depth4.2 写入幂等javaTransactional public void saveCommission(CommissionRecord record) { try { commissionRecordMapper.insert(record); } catch (DuplicateKeyException e) { log.warn(重复佣金记录忽略: {}, record.getUniqueKey()); return; } // 发送结算MQ rocketMQTemplate.send(commission_settle, record); }配合 Redis 分布式锁防止并发重复消费javaString lockKey lock:commission: orderId; Boolean locked redisTemplate.opsForValue().setIfAbsent(lockKey, 1, 30, TimeUnit.SECONDS); if (Boolean.FALSE.equals(locked)) return; try { // 计算并写入 } finally { redisTemplate.delete(lockKey); }五、对账方案保证资金安全对账是分佣引擎的最后一道防线。5.1 对账维度订单流水 vs 佣金流水每个订单产生的佣金总额是否匹配。佣金流水 vs 支付流水佣金发放金额是否与支付记录一致。账户余额 vs 汇总用户余额汇总是否与平台总账一致。5.2 技术实现T1 对账定时任务跑批比对昨日数据。javaXxlJob(commissionReconcileJob) public void reconcile() { ListOrder orders orderService.getYesterdayOrders(); for (Order order : orders) { BigDecimal expected commissionService.calcExpected(order); BigDecimal actual commissionRecordService.sumByOrderId(order.getId()); if (expected.compareTo(actual) ! 0) { alertService.send(佣金对账异常, order.getId(), expected, actual); } } }离线数仓对账用 Flink/Spark 做全量对账每日一次。5.3 分布式事务采用本地消息表 MQ保证订单与佣金最终一致。sqlCREATE TABLE local_message ( id BIGINT PRIMARY KEY AUTO_INCREMENT, biz_type VARCHAR(32), biz_id BIGINT, payload TEXT, status TINYINT DEFAULT 0 COMMENT 0待发送 1已发送 2已完成, retry_count INT DEFAULT 0, next_retry_time DATETIME );订单服务本地事务写入订单和本地消息定时任务扫描发送 MQ分佣引擎消费后回调更新状态。六、合规校验把红线写进代码合规不是口号是分佣引擎里的硬约束。6.1 层级上限锁定javaif (depth config.getMaxDepth()) { // 默认3 log.warn(超过层级上限不发放佣金: orderId{}, depth{}, orderId, depth); return BigDecimal.ZERO; }6.2 按真实销售计酬佣金规则只关联订单不关联“拉人头”“团队人数”。所有计酬科目必须绑定真实成交订单。javaif (order.getStatus() ! OrderStatus.PAID) { return BigDecimal.ZERO; } if (order.getRefundStatus() RefundStatus.REFUNDED) { return BigDecimal.ZERO; }6.3 全链路留痕sqlCREATE TABLE audit_log ( id BIGINT PRIMARY KEY AUTO_INCREMENT, biz_type VARCHAR(32), biz_id BIGINT, action VARCHAR(64), before_data TEXT, after_data TEXT, operator VARCHAR(64), ip VARCHAR(64), created_at DATETIME DEFAULT CURRENT_TIMESTAMP );订单、佣金、结算、提现、规则变更全部记录审计日志便于配合监管核查。七、性能优化实践问题方案高并发订单RocketMQ 削峰分佣异步化规则查询慢Redis 缓存规则本地 Caffeine 二级缓存关系链查询慢预计算关系链存 Redis数据库压力大ShardingSphere 分库分表按 user_id 分片对账耗时离线数仓 增量对账幂等冲突Redis 分布式锁 唯一索引八、源码交付与二次开发我们作为良久团购商业模式的系统开发商提供的不只是一套商城而是一台“五级定价 自动结算 社交裂变 合规护栏”的私域团购系统。交付内容完整源码 五级定价结算/裂变全模块技术栈Spring Cloud Alibaba、MySQL、Redis、RocketMQ、ShardingSphere、Vue/Uniapp架构图、接口文档、部署文档、对账方案客户可自主二次开发无限制如果你正在研究良久团购模式或想搭建自己的私域团购平台欢迎私信交流。我们可以把系统架构图、分佣引擎源码设计、合规配置清单发你参考。
觉得有用,分享给同行:

为您的企业打造数字门面

稳重轻奢商务风格,端正雅致视觉,长效耐看不易过时。

立即咨询 →