You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Laravel多级分销奖励代码如何精简重构 实现上级推荐人阶梯发奖

优化后的阶梯奖励发放实现

首先先修复原代码的明显问题:

  • 原代码嵌套层级过深,扩展等级需要手动加if判断,维护成本极高
  • 存在变量拼写错误($$member_code_first 多写了一个$符号)、查询上级时错误传入对象作为查询条件的逻辑问题
  • reward_points 方法里错误将奖励归属用户写死为当前登录用户,实际应该发放给对应的上级推荐人
  • 重复查询产品信息、当前用户信息,产生不必要的数据库查询开销

重写后的代码

奖励发放主方法

public static function reward_members()
{
    // 可配置:奖励阶梯,数组下标对应层级(0是触发奖励的用户本身,1是直接上级,以此类推),值对应奖励基数
    $rewardLadder = [5, 4, 3, 2, 1, 1];
    $maxLevel = count($rewardLadder);
    
    // 提前提取公共数据,避免重复查询
    $currentUserId = auth('api')->id() ?? auth()->id();
    $currentReferralCode = request('member_code');
    $productInfo = ProductCode::select('buyer_id', 'product_code_value')
        ->where('product_code', request('product_code'))
        ->first();
    if (!$productInfo) return; // 产品不存在直接终止流程
    
    // 先给触发奖励的用户发基础奖励
    self::reward_points($rewardLadder[0], $currentUserId, $currentUserId, $productInfo);
    
    // 循环查找上级发放对应等级奖励
    $currentCode = $currentReferralCode;
    for ($i = 1; $i < $maxLevel; $i++) {
        $parentMember = SalesMember::select('user_id', 'member_code')
            ->where('referral_code', $currentCode)
            ->first();
        if (!$parentMember) break; // 没有上级就终止循环
        
        // 给当前上级发对应等级的奖励
        self::reward_points($rewardLadder[$i], $parentMember->user_id, $currentUserId, $productInfo);
        
        // 把当前上级的推荐码作为下一轮的查询条件,找上上级
        $currentCode = $parentMember->member_code;
    }
}

优化后的奖励入账方法

/**
 * 发放奖励积分
 * @param int $point 奖励基数
 * @param int $rewardUserId 接收奖励的用户ID
 * @param int $currentUserId 触发奖励的当前消费用户ID
 * @param object $productInfo 产品信息对象
 */
public static function reward_points($point, $rewardUserId, $currentUserId, $productInfo)
{
    // 查询用户当前奖励余额
    $lastReward = RewardManage::latest()
        ->select('balance')
        ->where('user_id', $rewardUserId)
        ->first();
    $balance = $lastReward->balance ?? 0;
    
    // 计算实际奖励值
    $rewardPoint = $point * $productInfo->product_code_value;
    
    // 写入奖励记录
    RewardManage::create([
        'user_id' => $rewardUserId,
        'sales_by' => $productInfo->buyer_id,
        'product_code' => request('product_code'),
        'reward_points' => $rewardPoint,
        'balance' => $balance + $rewardPoint,
    ]);
}

配置说明

后续需要调整奖励层级和对应基数,直接修改$rewardLadder数组即可,不需要改动业务逻辑:比如要加第7级奖励直接在数组末尾加对应基数即可。相比原代码最多减少了十几次重复SQL查询,同时修复了原代码奖励发错用户的致命问题,没有上级时会自动终止循环,不会产生多余查询。

内容的提问来源于stack exchange,提问作者swatantra

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 15:39:02