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->hourRankingcs($text_list_new); Log::record("小时榜推送:".json_encode($text_list_new),"infos"); } } 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; } public function give_gifts(){ $data = db::name('vs_give_gift')->where('from_id',5483)->select(); $num = 0; $i=0; $j = 0; foreach($data as $v){ $j += $v['total_price']; $nuu = db::name('vs_give_gift_ratio_log')->where('give_gift_id',$v['id'])->value('room_owner_earning'); $id = db::name('vs_give_gift_ratio_log')->where('give_gift_id',$v['id'])->value('id'); // echo $id."--".$nuu."\n"; $num += $nuu; $i++; } echo $num; echo "==".$i."==".$j; // echo db::name()->where(['user_id' => 10857,'money_type' =>2,'change_type' =>18])-sum('change_value'); } public function room_liushui(){ // $room = db::name('vs_give_gift')->where(['from_id' => ['<>',5418],'from' => 2])->group('from_id'); $dd = db::name('vs_user_gift_pack')->alias('a')->join('vs_gift b','a.gid = b.gid')->field('a.gid,a.num,b.gift_price')->where(['a.num' =>['>',0]])->select(); $count = 0; foreach ($dd as $v){ $count += $v['gift_price'] * $v['num']; } echo $count; } }