| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372 |
- <?php
- namespace addons\LuckyGroup\common\logic\reward;
- use addons\LuckyGroup\common\enums\LuckyGroupEnum;
- use addons\LuckyGroup\common\logic\customize\Customize;
- use addons\LuckyGroup\common\models\LuckyGroupLevel;
- use addons\LuckyGroup\common\models\LuckyGroupOrder;
- use addons\LuckyGroup\common\models\LuckyGroupUser;
- use common\enums\StatusEnum;
- use common\enums\UserWalletEnum;
- use common\helpers\Base64Helper;
- use common\models\mall\MallAddons;
- use common\models\user\UserPartitionRelationship;
- class GroupRewardLogic
- {
- //参团奖励
- public static function computeJoinReward($attend_award_setting, $attend_user_type, $mall_id,
- $user_id, $order_id,
- $win_user_id, $win_order_id,
- $loss_user_id, $loss_order_id, &$insert_wallet,$customize_arr,&$attend_reward=0,
- $order_no='',$contributor_id=0,$contributor_money=0,$goods_name=''
- )
- {
- foreach ($attend_award_setting as $wallet_type => $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;
- }
- }
|