db->close(); $trans = Yii::$app->db->beginTransaction(); try { $user = User::find()->select('id,mall_id,parent_id')->where(['id' => $params['user_id']])->one(); if (empty($user)) throw new \Exception('用户查询失败'); $mall_id = $user['mall_id']; $user_id = $user['id']; $parent_id = $user['parent_id']; // 没有推荐人的情况下不做处理 if (empty($parent_id)) { return true; } //查询现在正在进行的活动 $time = time(); $where[] = ['<', 'start_time', $time]; $where[] = ['>', 'end_time', $time]; $where[] = ['=', 'status', StatusEnum::ENABLED]; $where[] = ['=', 'mall_id', $mall_id]; $where[] = ['=', 'settle_type', $type]; $order = 'id desc'; $params = array('where' => $where, 'order'=>$order); $list = Recommen::lists($params); $parent_child_user_ids = User::find() ->where(['parent_id' => $parent_id]) ->andWhere(['status' => StatusEnum::ENABLED]) ->select('id')->column(); $parent_child_pay_amounts = []; foreach ($parent_child_user_ids as $child_user_id) { $amount = Order::find()->where(['user_id' => $child_user_id]) ->andWhere(['order_status' => OrderStatusEnum::ACCOMPLISH]) ->sum('pay_money'); $parent_child_pay_amounts[$child_user_id] = bcmul(empty($amount) ? 0 : $amount, 100); } if($list){ foreach($list as $k=>$v){ //遍历活动 $add['mall_id'] = $mall_id; $add['user_id'] = $user_id; $add['parent_id'] = $parent_id; $add['active_id'] = $v['id']; $addrecommen = RecommenLog::setData($add, $type, $v['settle_type'] == $type); // 如果存在了那肯定不能再领取了 || 如果类型不一致,那么也不能获得奖励 - 如果一个人连续下两单,那么就会被拒绝奖励 if (!$addrecommen) continue; $is_be_status = true; if (is_array($addrecommen) && !empty($addrecommen[0]) && $addrecommen[0] instanceof RecommenLog) { $addrecommen = $addrecommen[0]; $is_be_status = false; } //达到添加则赠送奖励 $recommen_reward = Json::decode($v['recommen_reward']); // $recommen_reward = array_reverse($recommen_reward); //阶梯奖励 $arrive_nums = array_column($recommen_reward,'arrive_num'); $consumption_amounts = array_column($recommen_reward,'consumption_amount'); // var_dump('$consumption_amounts ->', $arrive_nums, $consumption_amounts ); if($arrive_nums){ // 已经领取奖励次数 $reward_list = RecommenReward::find()->where(['mall_id' => $mall_id]) ->andWhere(['user_id' => $parent_id, 'be_reward' => 2])->andWhere(['active_id' => $v['id']]) ->andWhere(['status' => [StatusEnum::ENABLED, StatusEnum::DISABLED]])->select('id, index, active_id')->indexBy('index')->asArray()->all(); $reward_total = count($reward_list); //推荐者奖励 $index = null; foreach($arrive_nums as $key => $value){ //如果阶梯奖励已领取奖励,则跳过此条规则 if (!empty($reward_list[$key]) && $v['type'] == 2 ) { echo "{$v['id']} 1 \n"; continue; } // 判断数量是否已经达标? 推荐数量/单次推荐多少人可以领奖 $can_reward_num = floor(count($parent_child_user_ids) / $value); // $v['type'] == 1 每推荐1人 每人消费满 N 元进行奖励 - 条件奖励 // $v['type'] == 2 推荐N人 每人消费满 N 元进行奖励 - 找到最大的一个值 - 满足第一个 -> 满足第二个 -> 满足第三个 - 阶梯奖励 //检查是否符合当前规则推荐人数 if ($can_reward_num < 1) { echo "{$v['id']} 1 \n"; continue; } if ($v['type'] == 1 && $can_reward_num <= $reward_total) { echo "{$v['id']} 1 \n"; continue; } $consumption_amount = $consumption_amounts[$key] ?? 0; // 默认是0元,也就是说默认没有消费门槛 // 判断消费是否满足 if ($consumption_amount > 0 && $v['settle_type'] == RecommenEnum::RECOMMEND_TYPE_ORDER_FINISH) { $tmp_parent_child_pay_amounts = array_values(array_filter($parent_child_pay_amounts, function ($val) use ($consumption_amount) { return $val >= bcmul($consumption_amount, 100); })); // 如果支付人数达不到要求,那么就不做奖励 $order_cnt = count($tmp_parent_child_pay_amounts); if (empty($order_cnt) || $order_cnt%$value != 0) { continue; } // 每推荐1人 每人消费满 N 元进行奖励 - 条件奖励 if (floor($order_cnt / $value) <= $reward_total && $v['type'] == 1) { continue; } // 推荐N人 每人消费满 N 元进行奖励 - 找到最大的一个值 - 满足第一个 -> 满足第二个 -> 满足第三个 - 阶梯奖励 if ($v['type'] == 2) { $index_cnt = RecommenReward::find()->where(['user_id' => $parent_id, 'be_reward' => 2]) ->andWhere(['active_id' => $v['id']])->andWhere(['index' => $key])->count(); if ($index_cnt > 0 && floor($order_cnt / $value) <= $index_cnt) { continue; } } } $index = $key; } if ($index !== null) self::reward($v, $mall_id, $add, $recommen_reward, $parent_id, $index, $v['type']); } //被推荐者奖励 $be_recommen_reward = json_decode($v['be_recommen_reward'],true); if($v['be_status'] == 2 && $is_be_status){ $reward_data = []; $reward_data['active_id'] = $v['id']; $reward_data['mall_id'] = $mall_id; $reward_data['user_id'] = $user_id; $reward_data['is_frozen'] = false; $reward_data['be_reward'] = 1; $balance = 0; $sorce = 0; $reward_list = RecommenReward::find()->where(['mall_id' => $mall_id]) ->andWhere(['user_id' => $user_id, 'be_reward' => 1])->andWhere(['active_id' => $v['id']]) ->andWhere(['status' => [StatusEnum::ENABLED, StatusEnum::DISABLED]])->select('id, index, active_id')->one(); if (!empty($reward_list)) continue; //var_dump($v['id'],$be_recommen_reward);die; if($be_recommen_reward){//推荐者奖励 foreach($be_recommen_reward as $kp => $vp){ //奖励的上一层 foreach($vp['data'] as $k_reward => $v_reward){ $reward_data['num'] = $v_reward['data']; switch ($v_reward['type']) { case RecommenEnum::REWARD_BALANCE:// 奖励余额 $balance += $v_reward['data']; $res_reward = self::rewardBalance($reward_data); break; case RecommenEnum::REWARD_SCORE:// 奖励积分 $sorce += $v_reward['data']; $res_reward = self::rewardScore($reward_data); break; case RecommenEnum::REWARD_COUPON:// 奖励优惠券 $coupon_data['data'] = $v_reward['data']; //var_dump($v_reward['data'],$v['id'],999); $coupon_data['mall_id'] = $mall_id; $coupon_data['user_id'] = $user_id; $res_data = self::rewardCoupon($coupon_data); if($res_data){ $reward_data['reward'][]= $res_data; } break; } } } if($balance>0) $reward_data['reward'][] = "奖励余额".$balance."元"; if($sorce>0) $reward_data['reward'][] = "奖励积分".$sorce; //发放奖励 $reward = RecommenReward::setData($reward_data); } } } } $trans->commit(); } catch (\Exception $e) { $trans->rollBack(); $exception = FormatHelper::exception($e, "用户注册异步事件"); echo $exception; Yii::error($exception); return false; } return true; } protected static function reward($v, $mall_id, $add, $recommen_reward, $parent_id, $index, $type) { $reward_data = []; $reward_data['active_id'] = $v['id']; $reward_data['mall_id'] = $mall_id; $reward_data['user_id'] = $add['parent_id']; $reward_data['be_reward'] = 2; $reward_data['index'] = $index; if($recommen_reward){//推荐者奖励 $reward_data['reward'] = []; $balance = 0; $sorce = 0; foreach($recommen_reward as $kp => $vp){ //奖励的上一层 if ($type == 2 && $index != $kp) continue; foreach($vp['data'] as $k_reward => $v_reward){ $reward_data['num'] = $v_reward['data']; switch ($v_reward['type']) { case RecommenEnum::REWARD_BALANCE:// 奖励余额 $balance += $v_reward['data']; self::rewardBalance($reward_data); break; case RecommenEnum::REWARD_SCORE:// 奖励积分 $sorce += $v_reward['data']; self::rewardScore($reward_data); break; case RecommenEnum::REWARD_COUPON:// 奖励优惠券 $coupon_data['data'] = $v_reward['data']; //var_dump($v_reward['data'],$v['id'],88); $coupon_data['mall_id'] = $mall_id; $coupon_data['user_id'] = $parent_id; $res_data = self::rewardCoupon($coupon_data); if($res_data){ $reward_data['reward'][]= $res_data; } break; } } } if($balance>0) $reward_data['reward'][] = "奖励余额".$balance."元"; if($sorce>0) $reward_data['reward'][] = "奖励积分".$sorce; //发放奖励 $reward = RecommenReward::setData($reward_data); } } /** * 奖励余额 * @Author: ltm * @DateTime: 2022/5/17 19:03 * @Copyright: copyright (c) 2021 广东七件事集团 * @param $data * @throws \Exception */ protected static function rewardBalance($data){ //转到用户账号 $insert_wallet [] = ['mall_id' => $data['mall_id'], 'user_id' => $data['user_id'], 'is_frozen' => false, 'wallet_type' => UserWalletService::WALLET_TYPE_BALANCE, 'money' => $data['num'], 'desc' => "推荐有礼奖励", 'source_table' => RecommenReward::tableName(), 'source_table_id' => $data['user_id'], 'from_type' => UserWalletEnum::REWARD, 'capital_type' => UserWalletEnum::RECOMMEND, ]; $res = UserWalletService::batchHandleByQueue($insert_wallet); } /** * 奖励积分 * @Author: ltm * @DateTime: 2022/5/17 19:03 * @Copyright: copyright (c) 2021 广东七件事集团 * @param $data * @throws \Exception */ protected static function rewardScore($data){ //转到用户账号 $insert_wallet [] = ['mall_id' => $data['mall_id'], 'user_id' => $data['user_id'], 'is_frozen' => false, 'wallet_type' => UserWalletService::WALLET_TYPE_SCORE, 'money' => $data['num'], 'desc' => "推荐有礼奖励", 'source_table' => RecommenReward::tableName(), 'source_table_id' => $data['user_id'], 'from_type' => UserWalletEnum::REWARD, 'capital_type' => UserWalletEnum::RECOMMEND, ]; //var_dump($insert_wallet);die; $res = UserWalletService::batchHandleByQueue($insert_wallet); } /** * 奖励积分 * @Author: ltm * @DateTime: 2022/5/17 19:03 * @Copyright: copyright (c) 2021 广东七件事集团 * @param $data * @return string */ protected static function rewardCoupon($data){ $is_install = MallAddons::isInstall($data['mall_id'], AddonsEnum::ADDONS_NAME_COUPON); $reward_text = ''; if($is_install){ // 赠送优惠券 if($data['data']){ $give_coupon_arr = []; foreach ($data['data'] as $coupon) { $give_coupon_arr[$coupon['relevant_id']] = $coupon['num']; } $coupon_arr = AddonsCouponUserRelate::giveCoupon($data['mall_id'], $data['user_id'], $give_coupon_arr, AddonsCouponEnum::SEND_FROM15); if ($coupon_arr) { $coupon_text = []; foreach ($coupon_arr as $info) { $coupon_text[] = $info['name'].$info['num'].'张'; } $reward_text.= "优惠券:[" . implode(',', $coupon_text) .']'; } } } return $reward_text; } }