$money) { if ($money <= 0) continue; $is_true = true; switch ($attend_user_type) { //1 全部 2 拼中 3 拼不中', case 1: break; case 2: $user_id = $win_user_id; $order_id = $win_order_id; break; case 3: $user_id = $loss_user_id; $order_id = $loss_order_id; break; default: $is_true = false; } if ($is_true&&$user_id) { if($wallet_type=='balance') $attend_reward+=$money; $group_buy_order_text = Customize::to($customize_arr,'group_buy_order_text'); $attend_reward_text = Customize::to($customize_arr,'attend_reward_text'); $desc = ($group_buy_order_text ?? '幸运拼团订单') . '(id:' . $order_id . ')发放' . ($attend_reward_text ?? '"参团奖励'); $insert_wallet [] = [ 'mall_id' => $mall_id, 'user_id' => $user_id, 'is_frozen' => false, 'wallet_type' => $wallet_type, 'money' => $money, 'desc' => $desc, 'source_table' => LuckyGroupOrder::tableName(), 'source_table_id' => $order_id, 'from_type' => LuckyGroupEnum::ADDONS_NAME, 'capital_type' => UserWalletEnum::ATTEND_REWARD, 'order_no' => $order_no, 'contributor_name' =>$goods_name, 'contributor_id' =>$contributor_id, 'contributor_money' =>$contributor_money, ]; } } } //拼中奖励 public static function computeWinReward($win_award_setting, $mall_id, $user_id, $order_id, $win_times, $user_win_times, &$insert_wallet,&$win_reward_scores,&$win_reward_balance,$customize_arr, $order_no='',$contributor_id=0,$contributor_money=0,$goods_name='') { foreach ($win_award_setting as $wallet_type => $money) { if ($money <= 0) continue; if($wallet_type=='score') $win_reward_scores+=$money; if($wallet_type=='balance') $win_reward_balance+=$money; if (empty($user_win_times) || empty($win_times)) continue; if ($user_win_times % $win_times != 0) continue; $group_buy_order_text = Customize::to($customize_arr,'group_buy_order_text'); $win_reward_text = Customize::to($customize_arr,'win_reward_text'); $desc = ($group_buy_order_text ?? '幸运拼团订单') . '(id:' . $order_id . ')发放' . ($win_reward_text ?? '"拼中奖励'); $insert_wallet [] = [ 'mall_id' => $mall_id, 'user_id' => $user_id, 'is_frozen' => false, 'wallet_type' => $wallet_type, 'money' => $money, 'desc' => $desc, 'source_table' => LuckyGroupOrder::tableName(), 'source_table_id' => $order_id, 'from_type' => LuckyGroupEnum::ADDONS_NAME, 'capital_type' => UserWalletEnum::WIN_REWARD, 'order_no' => $order_no, 'contributor_name' =>$goods_name, 'contributor_id' =>$contributor_id, 'contributor_money' =>$contributor_money, ]; } } //推荐奖励 public static function computeInviteReward($mall_id, $goods_price, $configs, $order_id, $user, &$insert_wallet,$customize_arr, $order_no='',$contributor_id=0,$goods_name='') { if (empty($configs['basic'])) return []; if (empty($configs['basic']['invited_award_type'])) return []; $invited_award_type = $configs['basic']['invited_award_type']??'';//奖励类型 $invited_award_mode = $configs['basic']['invited_award_mode']??0;//0固定金额;1百分比 $direct_award = $configs['basic']['direct_award']??0;//直推 $direct_award = intval($direct_award); $indirect_award = $configs['basic']['indirect_award']??0;//间推 $indirect_award = intval($indirect_award); if ($invited_award_mode == 0) { $direct_money = $direct_award; $indirect_money = $indirect_award; } else { $direct_money = bcdiv($direct_award * $goods_price,100,2); $indirect_money =bcdiv($indirect_award * $goods_price ,100,2); } $parent_id = $user['parent_id']; $second_parent_id = $user['second_parent_id']; $group_buy_order_text = Customize::to($customize_arr,'group_buy_order_text'); $invite_reward_text = Customize::to($customize_arr,'invite_reward_text'); $desc = ($group_buy_order_text ?? '幸运拼团订单') . '(id:' . $order_id . ')发放' . ($invite_reward_text ?? '"推荐奖励'); if ($direct_money > 0 && $parent_id) { $insert_wallet [] = [ 'mall_id' => $mall_id, 'user_id' => $parent_id, 'is_frozen' => false, 'wallet_type' => $invited_award_type, 'money' => $direct_money, 'desc' => $desc, 'source_table' => LuckyGroupOrder::tableName(), 'source_table_id' => $order_id, 'from_type' => LuckyGroupEnum::ADDONS_NAME, 'capital_type' => UserWalletEnum::FIRST, 'order_no' => $order_no, 'contributor_name' =>$goods_name, 'contributor_id' =>$contributor_id, 'contributor_money' =>$goods_price, ]; } if ($indirect_money > 0 && $second_parent_id) { $insert_wallet [] = [ 'mall_id' => $mall_id, 'user_id' => $second_parent_id, 'is_frozen' => false, 'wallet_type' => $invited_award_type, 'money' => $indirect_money, 'desc' => $desc, 'source_table' => LuckyGroupOrder::tableName(), 'source_table_id' => $order_id, 'from_type' => LuckyGroupEnum::ADDONS_NAME, 'capital_type' => UserWalletEnum::SECOND, 'order_no' => $order_no, 'contributor_name' =>$goods_name, 'contributor_id' =>$contributor_id, 'contributor_money' =>$goods_price, ]; } } //奖金池 public static function computePrizePool($configs, $order_id, $group_user, $time, $bonus_pool_sum, &$frozen_log_arr, &$user_frozen_arr,$customize_arr) { if (!empty($configs['bonus_pool']['every_day_bingo_prize'])) { switch ($configs['bonus_pool']['every_day_bingo_prize']) { case 1: //每次拼中奖励 self::everyBingoPrizePool($configs, $order_id, $group_user, $time, $bonus_pool_sum, $frozen_log_arr, $user_frozen_arr,$customize_arr); break; case 2: //累计拼中奖励,阶梯 self::totalBingoPrizePool($configs, $order_id, $group_user, $time, $bonus_pool_sum, $frozen_log_arr, $user_frozen_arr,$customize_arr); break; } } } //每次拼中奖励 protected static function everyBingoPrizePool($configs, $order_id, $group_user, $time, $bonus_pool_sum, &$frozen_log_arr, &$user_frozen_arr,$customize_arr) { if (!empty($group_user['win_num']) && !empty($configs['bonus_pool']['every_day_bingo_nums']) && !empty($configs['bonus_pool']['every_day_bingo_limit_prize'])) { $every_day_bingo_nums = $configs['bonus_pool']['every_day_bingo_nums']; $every_day_bingo_limit_prize = $configs['bonus_pool']['every_day_bingo_limit_prize']; $everyday_out_rate = $configs['bonus_pool']['everyday_out_rate']; $settle_type = $configs['bonus_pool']['settle_type']; if ($group_user['win_num'] % $every_day_bingo_nums == 0) { if ($every_day_bingo_limit_prize > 0) { $group_buy_order_text = Customize::to($customize_arr,'group_buy_order_text'); $every_day_bingo_prize_text = Customize::to($customize_arr,'every_day_bingo_prize_text'); $desc = ($group_buy_order_text ?? '幸运拼团订单') . '(id:' . $order_id . ')' . ($every_day_bingo_prize_text ?? '"每次拼中奖励'); $frozen_log_arr[] = [ $group_user['mall_id'], $group_user['user_id'], $group_user['level'], $order_id, LuckyGroupOrder::tableName(), $every_day_bingo_limit_prize, 0, UserWalletEnum::POOL_REWARD, 'commission', '', $desc, StatusEnum::ENABLED, $time, $time, 0, $settle_type, $bonus_pool_sum, $everyday_out_rate, 0, 0, 0 ]; if (isset($user_frozen_arr[$group_user['user_id']])) { $user_frozen_arr[$group_user['user_id']] += $every_day_bingo_limit_prize; } else { $user_frozen_arr[$group_user['user_id']] = $every_day_bingo_limit_prize; } } } } } //累计拼中奖励 protected static function totalBingoPrizePool($configs, $order_id, $group_user, $time, $bonus_pool_sum, &$frozen_log_arr, &$user_frozen_arr,$customize_arr) { if (empty($configs['bonus_pool']['win_basic_setting'])) return ''; if (empty($group_user['win_num'])) return ''; $win_num = $group_user['win_num']; $money = 0; $everyday_out_rate = $configs['bonus_pool']['everyday_out_rate']; $win_basic_setting = json_decode($configs['bonus_pool']['win_basic_setting'], true); $win_arr = array_column($win_basic_setting, 'money', 'times'); $times_arr = array_keys($win_arr); if (in_array($win_num, $times_arr)) $money = $win_arr[$win_num]; $settle_type = $configs['bonus_pool']['settle_type']; if ($money > 0) { $group_buy_order_text = Customize::to($customize_arr,'group_buy_order_text'); $pool_reward_text = Customize::to($customize_arr,'pool_reward_text'); $desc = ($group_buy_order_text ?? '幸运拼团订单') . '(id:' . $order_id . ')' . ($pool_reward_text ?? '"奖金池奖励'); $frozen_log_arr[] = [ $group_user['mall_id'], $group_user['user_id'], $group_user['level'], $order_id, LuckyGroupOrder::tableName(), $money, 0, UserWalletEnum::POOL_REWARD, 'commission', '', $desc, StatusEnum::ENABLED, $time, $time, 0, $settle_type, $bonus_pool_sum, $everyday_out_rate, 0, 0, 0 ]; if (isset($user_frozen_arr[$group_user['user_id']])) { $user_frozen_arr[$group_user['user_id']] += $money; } else { $user_frozen_arr[$group_user['user_id']] = $money; } } } // 参团等级佣金奖励发放 public static function sendGroupCommissionLog($configs, $joining_orders, $user_arr, $activity,$contributor_money=0,$goods_name='') { $user_id_arr = array_column($joining_orders, 'user_id'); $orders = array_column($joining_orders, null,'user_id'); $parent_list = self::getUserParentList($user_id_arr); $parent_ids = []; $parent_arr = []; foreach ($parent_list as $user_id => $item) { array_pop($item); $parent_id_arr = array_reverse($item); foreach ($parent_id_arr as &$parent_id) { $parent_id = Base64Helper::Base642dec($parent_id); $parent_ids [] = $parent_id; $parent_arr[$user_id][] = $parent_id; } } $group_user_list = LuckyGroupUser::lists(['where' => [['user_id' => $parent_ids]], 'index' => 'user_id'],false); //渠道佣金 $order_detail = ['level_config' => self::getLevelConfig($activity)]; $setting = [ 'equal_prize_deep' => $configs['basic']['equal_deep'], 'equal_settle_type' => $configs['basic']['equal_calculate_type']??0, 'calculation_basis' => $configs['basic']['equal_calculate_basis']??0, ]; foreach ($parent_arr as $user_id => $parent_list) { $order_detail['id'] = $user_arr[$user_id]['order_id']; $order_detail['group_user_list'] = $group_user_list; $order_detail['order_no'] = ''; $order_detail['goods_price'] = 0; if(!empty($orders[$user_id])){ $order_detail['order_no'] = $orders[$user_id]['order_no']; if(!empty($orders[$user_id]['buy_nums'])){ $order_detail['goods_price'] = bcdiv($orders[$user_id]['total_goods_price'],$orders[$user_id]['buy_nums'],2); }else{ $order_detail['goods_price'] = $orders[$user_id]['total_goods_price']; } } $order_detail['goods_name'] = $goods_name; $agent_list = []; foreach ($parent_list as $parent_id) { if (isset($group_user_list[$parent_id])) $agent_list[] = $group_user_list[$parent_id]; } if (!empty($agent_list)) { $agent_reward_obj = new AgentReward($activity['mall_id'], $user_id, $setting, $agent_list, 0); $agent_reward_obj->order_detail = $order_detail; $agent_reward_obj->addFrozenCommission(); } } } //获取上级数据 protected static function getUserParentList($user_id_arr) { $user_relation_list = UserPartitionRelationship::lists(['where' => [['user_id' => $user_id_arr]], 'order' => 'part asc']); $data = []; foreach ($user_relation_list as $key => $value) { if (isset($data[$value['user_id']])) { $data[$value['user_id']] = array_merge($data[$value['user_id']], explode(',', $value['tree'])); } else { $data[$value['user_id']] = explode(',', $value['tree']); } } return $data; } //获取等级数据 protected static function getLevelConfig($activity) { $config_arr = []; $mall_id = $activity['mall_id']; if (!empty($activity['enable_commison'])) { $team_commission_setting = json_decode($activity['team_commission_setting'], true); $equal_commission_setting = json_decode($activity['equal_commission_setting'], true); $over_commission_setting = json_decode($activity['over_commission_setting'], true); foreach ($team_commission_setting as $item) { $config_arr[$item['level']]['is_percent_team'] = 1; $config_arr[$item['level']]['agent_team_prize'] = $item['team_commission']; } foreach ($equal_commission_setting as $item) { $config_arr[$item['level']]['is_percent_equal'] = 1; $config_arr[$item['level']]['agent_equal_prize'] = $item['equal_commission']; } foreach ($over_commission_setting as $item) { $config_arr[$item['level']]['is_percent_over'] = 1; $config_arr[$item['level']]['agent_over_prize'] = $item['over_commission']; } } else { $level_list = LuckyGroupLevel::lists(['where' => [['mall_id' => $mall_id], ['status' => StatusEnum::ENABLED]]]); foreach ($level_list as $item) { $config_arr[$item['level']]['is_percent_team'] = 1; $config_arr[$item['level']]['agent_team_prize'] = $item['team_commission']; $config_arr[$item['level']]['is_percent_equal'] = 1; $config_arr[$item['level']]['agent_equal_prize'] = $item['equal_commission']; $config_arr[$item['level']]['is_percent_over'] = 1; $config_arr[$item['level']]['agent_over_prize'] = $item['over_commission']; } } return $config_arr; } }