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
相关产品推荐
相关产品推荐

