{{wikiTitle}}
分销功能
目录:
分销推广订单
核心功能:实现分销体系中的佣金计算、状态流转及结算流程,包含三个阶段:
1.佣金生成 - 订单支付成功后计算分销层级佣金
2.佣金冻结 - 订单确认收货后进入冻结期
3.佣金解冻 - 冻结期满后转为可提现状态
设计亮点:
基于Redis队列的异步任务处理
佣金状态机管理(待结算 → 冻结 → 可提现)
幂等性设计防止重复计算
解冻任务定时调度
1.订单支付成功后,添加支付成功Task 到redis队列
redisUtil.lPush(TaskConstants.ORDER_TASK_PAY_SUCCESS_AFTER, storeOrder.getOrderId());
2.当定时任务 OrderPaySuccessTask 在redis队列检索到关键key时,创建佣金记录。
/**
* 支付成功处理
* @param storeOrder 订单
*/
@Override
public Boolean paySuccess(StoreOrder storeOrder) {
...
//计算佣金,生成佣金记录
List<UserBrokerageRecord> recordList = assignCommission(storeOrder);
// 分销员逻辑
if (!user.getIsPromoter()) {
...
}
...
// 佣金记录
if (CollUtil.isNotEmpty(recordList)) {
recordList.forEach(temp -> {
temp.setLinkId(storeOrder.getOrderId());
});
userBrokerageRecordService.saveBatch(recordList);
}
}
3.订单收货(主动收货、自动收货、核销订单)后,添加订单收货Task 到redis队列
redisUtil.lPush(TaskConstants.ORDER_TASK_REDIS_KEY_AFTER_TAKE_BY_USER, order.getId());
4.当定时任务 OrderReceiptTask 在redis队列检索到关键key时, 更新佣金记录-佣金进入冻结期,并计算解冻时间。
/**
* 订单收货task处理
* @param orderId 订单id
* @return Boolean
*/
@Override
public Boolean orderReceiving(Integer orderId) {
...
// 获取佣金记录
List<UserBrokerageRecord> recordList = userBrokerageRecordService.findListByLinkIdAndLinkType(storeOrder.getOrderId(), BrokerageRecordConstants.BROKERAGE_RECORD_LINK_TYPE_ORDER);
...
for (UserBrokerageRecord record : recordList) {
// 佣金进入冻结期
record.setStatus(BrokerageRecordConstants.BROKERAGE_RECORD_STATUS_FROZEN);
// 计算解冻时间
Long thawTime = cn.hutool.core.date.DateUtil.current(false);
if (record.getFrozenTime() > 0) {
DateTime dateTime = cn.hutool.core.date.DateUtil.offsetDay(new Date(), record.getFrozenTime());
thawTime = dateTime.getTime();
}
record.setThawTime(thawTime);
}
...
// 分佣-佣金进入冻结期
if (CollUtil.isNotEmpty(recordList)) {
userBrokerageRecordService.updateBatchById(recordList);
}
}
5. 定时任务 BrokerageFrozenTask 执行,检索冻结期佣金订单,并解冻。
/**
* 佣金解冻
*/
@Override
public void brokerageThaw() {
// 查询需要解冻的佣金
List<UserBrokerageRecord> thawList = findThawList();
...
for (UserBrokerageRecord record : thawList) {
// 分佣-佣金解冻
Boolean execute = transactionTemplate.execute(e -> {
updateById(record);
userService.operationBrokerage(record.getUid(), record.getPrice(), user.getBrokeragePrice(), "add");
return Boolean.TRUE;
});
}
}




评论({{cateWiki.comment_num}})
{{commentWhere.order ? '评论从旧到新':'评论从新到旧'}}
{{cateWiki.page_view_num}}人看过该文档


评论(0)
{{commentWhere.order ? '评论从旧到新':'评论从新到旧'}}
310人看过该文档




{{item.user ? item.user.nickname : ''}} (自评)
{{item.content}}
{{item.create_time}} 删除




搜索结果
为您找到{{wikiCount}}条结果
{{item.page_view_num}}
{{item.like ? item.like.like_num : 0}}
{{item.comment ? item.comment.comment_num : 0}}
位置:{{path.name}} {{(i+1) == item.catalogue.path_data.length ? '':'/'}}


