{{userInfo.nickname}}
用户设置 退出登录

{{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.like_num}}人点赞
0人点赞
评论({{cateWiki.comment_num}}) {{commentWhere.order ? '评论从旧到新':'评论从新到旧'}} {{cateWiki.page_view_num}}人看过该文档
评论(0) {{commentWhere.order ? '评论从旧到新':'评论从新到旧'}} 310人看过该文档
评论
{{item.user ? item.user.nickname : ''}} (自评)
{{item.content}}
{{item.create_time}} 删除
{{item.like ? item.like.like_num : 0}} {{replyIndex == index ? '取消回复' : '回复'}}
评论
{{items.user ? items.user.nickname : '暂无昵称'}} (自评)
{{items.content}}
{{items.create_time}} 删除
{{items.like ? items.like.like_num : 0}} {{replyIndexJ == (index+'|'+indexJ) ? '取消回复' : '回复'}}
评论
目录
  • {{item}}