send_gift();//小时榜 送礼物 echo "发礼物结束 \n"; } public function send_gift() { //获取上一个小时的开始时间和结束时间 $start_time = strtotime(date('Y-m-d H:00:00', strtotime('-1 hour'))); $end_time = strtotime(date('Y-m-d H:00:00')); echo "开始时间:" .$start_time."\n"; echo "结束时间:" .$end_time."\n"; //当前小时的前一个小时(24小时计时法,0-23) $pre_hour = date('H', strtotime('-1 hour')); echo "上个时间段:" .$pre_hour."\n"; $is_open_time = db::name('vs_hour_ranking_config')->where('id', 1)->value('open_time'); if ($is_open_time == 0) { echo "未开启时间段:" .$is_open_time."\n"; return; } //是否全局飘瓶 $is_public_server = db::name('vs_hour_ranking_config')->where('id', 1)->value('is_public_server'); if ($is_public_server == 1) { //全局飘瓶时间段 $xlh_time_range = db::name('vs_hour_ranking_config')->where('id', 1)->value('broadcast_times'); if($xlh_time_range){ if($xlh_time_range == 25){ $is_piao = 1; }else{ //当前的前一个小时是否在 $xlh_time_range中 if (in_array($pre_hour, explode(',', $xlh_time_range))) { $is_piao = 1; } else { $is_piao = 0; } } }else{ $is_piao = 0; } }else{ $is_piao = 0; } //获取上一个时间段的配置 // $gift_list = db::name('vs_hour_ranking_gift_config')->where('time_id',$pre_hour)->group('ranking')->order('id', 'desc')->select(); $gift_list = $this->get_hour_ranking($pre_hour); // echo "上个时间段的配置:" .json_encode($gift_list)."\n"; // 提取所有有奖励的内容 $allRewards = $this->extractAllRewards($gift_list); // 按index分组 $groupedRewards = $this->groupRewardsByIndex($allRewards); // 按名次顺序分配奖励 $distributionResult = $this->distributeByRank($groupedRewards); //获取上个数组的个数,从而获取配置了多少个名次 $count = count($distributionResult); echo "上个时间段的配置总数:" .$count."\n"; //获取前一个小时的 前$count名房间排行 $room_list = model('api/RoomHourRanking')->room_hour_ranking(1, $count, $start_time, $end_time); $room_owner = []; if ($room_list['code'] == 1) { //获取房间排行奖励最低值 $min_price = db::name('vs_hour_ranking_config')->where('id', 1)->value('min_price'); if ($room_list['data']['lists']) { echo "房间列表:" .json_encode($room_list['data']['lists'])."\n"; foreach ($room_list['data']['lists'] as $v){ if ($v['total_price'] >= $min_price) { $room_owner[] = [ 'user_id' => $v['user_id'], 'room_name' => $v['room_name'], 'room_id' => $v['room_id'], 'total_price' => $v['total_price'] ]; } } } } if ($distributionResult && $room_owner) { $text_list_new = []; echo "礼物数:" .json_encode($distributionResult)."\n"; echo "房主:" .json_encode($room_owner)."\n"; foreach ($distributionResult as $k => $value) { //礼物全部给他偷偷放在装扮表及金额 中 //有几个用户就发几个 if(count($room_owner) > $k){ // 为每个房间添加一个标志,表示是否已处理推送信息 $hasProcessedPush = false; foreach ($value['rewards'] as $v){ if($v['type'] == 0){//1金币2礼物3头像4坐骑 echo "发金币:" .$v['value'].'==>'.$room_owner[$k]['user_id']."\n"; $res = $this->add_coin($v['value'], $room_owner[$k]['user_id'],$k + 1,$room_owner[$k]['room_id'],$room_owner[$k]['total_price'],$is_piao); }elseif ($v['type'] == 1){ echo "发礼物:" .$v['value'].'==>'.$room_owner[$k]['user_id']."\n"; $res = $this->add_gift($v['value'], $room_owner[$k]['user_id'],$k + 1,$room_owner[$k]['room_id'],$room_owner[$k]['total_price'],$is_piao); }elseif ($v['type'] == 2){ $res = $this->add_decorate($v['value'], $room_owner[$k]['user_id'],$k + 1,$room_owner[$k]['room_id'],$room_owner[$k]['total_price'],$is_piao,3); }elseif ($v['type'] == 3){ $res = $this->add_decorate($v['value'], $room_owner[$k]['user_id'],$k + 1,$room_owner[$k]['room_id'],$room_owner[$k]['total_price'],$is_piao,4); } // 只有在第一次处理奖励时添加推送信息,避免重复推送 if(!$hasProcessedPush && $is_piao == 1) { $room_name = $room_owner[$k]['room_name']; //推送礼物横幅 if ($k == 0) { $text = '新科状元!【' . $room_name . '】独占鳌头!'; } elseif ($k == 1) { $text = '金榜榜眼!【' . $room_name . '】才气逼人!'; } elseif ($k == 2) { $text = '风采探花!【' . $room_name . '】实力绽放!'; } $text_list_new[] = [ 'text' => $text ?? '恭喜【' . $room_name . '】获得礼物!', 'room_id' => $room_owner[$k]['room_id'], 'room_name' => $room_name, 'rank_number' => $k + 1, ]; $hasProcessedPush = true; // 标记已处理推送 } } } } if(!empty($text_list_new)){ $push = new Push(); $push->hourRanking($text_list_new); } } echo "送礼-共" . count($room_owner) . "个房间房主获益\n"; } //添加金币到钱包 public function add_coin($coin,$user_id,$ranking,$room_id,$total_price,$is_piao){ if($coin > 0){ $data = [ 'user_id' => $user_id, 'change_value' => $coin, // 'room_id' => $room_ids, 'money_type' => 1, 'change_type' => 27, 'from_id' => 0, 'remarks' => '小时榜获得', 'createtime' => time() ]; //开启事务 Db::startTrans(); $res = Db::name('vs_user_money_log')->insert($data); if(!$res){ Db::rollback(); } //增加用户金币 $res1 = Db::name('user_wallet')->where(['user_id'=>$user_id])->setInc('coin',$coin); if(!$res1){ Db::rollback(); } //添加到排行表 $start_time = strtotime(date('Y-m-d H:00:00', strtotime('-1 hour'))); $end_time = strtotime(date('Y-m-d H:00:00')) - 1; $res2 = db::name('vs_hour_ranking')->insert([ 'ranking' => $ranking, 'room_id' => $room_id, 'flowing_water' => $total_price, 'coin' => $coin, 'time_id' => date('H', strtotime('-1 hour')), 'stime' => $start_time, 'etime' => $end_time, 'createtime' => time(), 'updatetime' => time(), 'is_public_server' => $is_piao ]); if(!$res2){ Db::rollback(); } Db::commit(); } return true; } //添加礼物到背包 public function add_gift($gift_id,$user_id,$ranking,$room_id,$total_price,$is_piao){ $res = model('api/UserGiftPack')->change_user_gift_pack($user_id,$gift_id,1,model('UserGiftPack')::HOUR_RANK_GET,"小时榜获得"); if($res['code'] == 0){ Log::record("小时榜获取礼物失败:".$res['msg'],"info"); } //添加到排行表 $start_time = strtotime(date('Y-m-d H:00:00', strtotime('-1 hour'))); $end_time = strtotime(date('Y-m-d H:00:00')) - 1; $res2 = db::name('vs_hour_ranking')->insert([ 'ranking' => $ranking, 'room_id' => $room_id, 'flowing_water' => $total_price, 'gift_id' => $gift_id, 'gift_type' => 2, 'time_id' => date('H', strtotime('-1 hour')), 'stime' => $start_time, 'etime' => $end_time, 'createtime' => time(), 'updatetime' => time(), 'is_public_server' => $is_piao ]); if(!$res2){ Log::record("小时榜礼物锁定失败","info"); } return true; } //添加装扮到背包 public function add_decorate($avatar_id,$user_id,$ranking,$room_id,$total_price,$is_piao,$type){ $decorate_price_info = db::name('vs_decorate_price')->where(['id'=>$avatar_id])->find(); if(empty($decorate_price_info)){ Log::record("小时榜获取装扮失败:没有找到装扮!".$avatar_id,"info"); } $res = model('api/Decorate')->pay_decorate($user_id,$decorate_price_info['did'],$decorate_price_info['day'],2); if($res['code'] == 0){ Log::record("小时榜获取装扮失败:".$res['msg']."-".$avatar_id,"info"); } //添加到排行表 $start_time = strtotime(date('Y-m-d H:00:00', strtotime('-1 hour'))); $end_time = strtotime(date('Y-m-d H:00:00')) - 1; $res2 = db::name('vs_hour_ranking')->insert([ 'ranking' => $ranking, 'room_id' => $room_id, 'flowing_water' => $total_price, 'gift_id' => $avatar_id, 'gift_type' => $type, 'time_id' => date('H', strtotime('-1 hour')), 'stime' => $start_time, 'etime' => $end_time, 'createtime' => time(), 'updatetime' => time(), 'is_public_server' => $is_piao, ]); if(!$res2){ Log::record("小时榜咋装扮锁定失败","info"); } return true; } /** * 提取所有有奖励的内容 */ private function extractAllRewards($responseData) { $allRewards = []; foreach ($responseData as $timeSlot) { foreach ($timeSlot['reward'] as $rewardItem) { $index = $rewardItem['index']; $content = $rewardItem['content']; // 只处理有奖励内容的数据 if (!empty($content)) { foreach ($content as $rewardContent) { $allRewards[] = [ 'index' => $index, 'type' => $rewardContent['type'], 'value' => $rewardContent['value'], 'name' => $rewardContent['name'] ?? '' ]; } } } } return $allRewards; } /** * 按index分组奖励 */ private function groupRewardsByIndex($allRewards) { $grouped = []; foreach ($allRewards as $reward) { $index = $reward['index']; if (!isset($grouped[$index])) { $grouped[$index] = []; } $grouped[$index][] = $reward; } // 按index排序 ksort($grouped); return $grouped; } /** * 按名次顺序分配奖励 */ private function distributeByRank($groupedRewards) { $distribution = []; $currentRank = 0; // 从第1名开始 // 按index顺序分配(index 0 = 第1名,index 1 = 第2名,以此类推) foreach ($groupedRewards as $index => $rewards) { // 确保名次连续,如果有空缺则填充空名次 while ($currentRank < $index) { $distribution[] = [ 'rank' => $currentRank + 1, 'rewards' => [] ]; $currentRank++; } // 分配当前名次的奖励 $distribution[] = [ 'rank' => $currentRank + 1, 'rewards' => $rewards ]; $currentRank++; } return $distribution; } public function get_hour_ranking($time){ // 先按时间段和排名索引分组查询 $timeRanges = db::name('vs_hour_ranking_gift_config')->distinct(true) ->where('time_id', '=', $time) ->order('time_id') ->column('time_id'); $result = []; foreach ($timeRanges as $timeRange) { // 查询该时间段的所有数据 $rewards = db::name('vs_hour_ranking_gift_config')->where('time_id', $timeRange) ->field('ranking, gift_type, gift_id,coin,name') ->order('ranking') ->select(); $rewardMap = []; foreach ($rewards as $reward) { $rankIndex = $reward['ranking']; if (!isset($rewardMap[$rankIndex])) { $rewardMap[$rankIndex] = [ 'index' => $rankIndex, // 'name' => $reward['rank_name'], 'content' => [] ]; } // 添加奖励内容到content数组 if ($reward['gift_id'] != 0 || $reward['coin'] != 0) { if($reward['gift_id'] != 0){ $rewardMap[$rankIndex]['content'][] = [ 'type' => $reward['gift_type'], 'value' => $reward['gift_id'], // 'coin' => $reward['coin'], 'name' => $reward['name'], ]; } if($reward['coin'] != 0){ $rewardMap[$rankIndex]['content'][] = [ 'type' => $reward['gift_type'], 'value' => $reward['coin'], 'name' => $reward['name'], ]; } } } // 按index排序 ksort($rewardMap); $result[] = [ 'time' => $timeRange, 'reward' => array_values($rewardMap) ]; } return $result; } }