Files
midi-php/application/cron/controller/RoomHourRanking.php

405 lines
15 KiB
PHP
Raw Normal View History

2025-09-29 16:27:36 +08:00
<?php
namespace app\cron\controller;
2025-09-29 18:29:08 +08:00
use app\common\controller\Push;
2025-09-29 16:27:36 +08:00
use think\Db;
2025-09-29 18:29:08 +08:00
use think\Log;
2025-09-29 16:27:36 +08:00
class RoomHourRanking
{
/*
* 运行函数
*/
function index()
{
echo "小时榜 开始发礼物:\n";
$this->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'));
2025-09-30 21:10:48 +08:00
echo "开始时间:" .$start_time."\n";
echo "结束时间:" .$end_time."\n";
2025-09-29 18:29:08 +08:00
//当前小时的前一个小时24小时计时法0-23
$pre_hour = date('H', strtotime('-1 hour'));
2025-09-30 21:10:48 +08:00
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;
}
2025-09-29 16:27:36 +08:00
//是否全局飘瓶
2025-09-30 21:10:48 +08:00
$is_public_server = db::name('vs_hour_ranking_config')->where('id', 1)->value('is_public_server');
2025-09-29 16:27:36 +08:00
if ($is_public_server == 1) {
//全局飘瓶时间段
2025-09-30 21:10:48 +08:00
$xlh_time_range = db::name('vs_hour_ranking_config')->where('id', 1)->value('broadcast_times');
2025-09-29 16:27:36 +08:00
if($xlh_time_range){
if($xlh_time_range == 25){
$is_piao = 1;
}else{
2025-09-29 18:29:08 +08:00
2025-09-29 16:27:36 +08:00
//当前的前一个小时是否在 $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;
}
2025-09-29 18:29:08 +08:00
//获取上一个时间段的配置
2025-09-30 21:10:48 +08:00
// $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);
2025-09-29 18:29:08 +08:00
//获取上个数组的个数,从而获取配置了多少个名次
2025-09-30 22:36:27 +08:00
$count = count($distributionResult);
echo "上个时间段的配置总数:" .$count."\n";
2025-09-29 18:29:08 +08:00
//获取前一个小时的 前$count名房间排行
$room_list = model('api/RoomHourRanking')->room_hour_ranking(1, $count, $start_time, $end_time);
$room_owner = [];
if ($room_list['code'] == 1) {
//获取房间排行奖励最低值
2025-09-30 21:10:48 +08:00
$min_price = db::name('vs_hour_ranking_config')->where('id', 1)->value('min_price');
2025-09-29 18:29:08 +08:00
if ($room_list['data']['lists']) {
2025-09-30 22:36:27 +08:00
echo "房间列表:" .json_encode($room_list['data']['lists'])."\n";
foreach ($room_list['data']['lists'] as $v){
2025-09-29 18:29:08 +08:00
if ($v['total_price'] >= $min_price) {
2025-09-30 22:36:27 +08:00
$room_owner[] = [
'user_id' => $v['user_id'],
'room_name' => $v['room_name'],
'room_id' => $v['room_id'],
'total_price' => $v['total_price']
];
2025-09-29 18:29:08 +08:00
}
}
}
}
2025-09-29 19:11:57 +08:00
2025-09-30 21:10:48 +08:00
if ($distributionResult && $room_owner) {
2025-09-29 19:11:57 +08:00
$text_list_new = [];
2025-09-30 22:36:27 +08:00
echo "礼物数:" .json_encode($distributionResult)."\n";
echo "房主:" .json_encode($room_owner)."\n";
2025-09-30 21:10:48 +08:00
foreach ($distributionResult as $k => $value) {
2025-09-29 18:29:08 +08:00
//礼物全部给他偷偷放在装扮表及金额 中
//有几个用户就发几个
if(count($room_owner) > $k){
2025-09-30 22:36:27 +08:00
// 为每个房间添加一个标志,表示是否已处理推送信息
$hasProcessedPush = false;
2025-09-30 21:10:48 +08:00
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);
}
2025-09-30 22:36:27 +08:00
// 只有在第一次处理奖励时添加推送信息,避免重复推送
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 . '】实力绽放!';
}
2025-09-29 16:27:36 +08:00
2025-09-30 22:36:27 +08:00
$text_list_new[] = [
'text' => $text ?? '恭喜【' . $room_name . '】获得礼物!',
'room_id' => $room_owner[$k]['room_id'],
'room_name' => $room_name,
'rank_number' => $k + 1,
];
2025-09-29 19:11:57 +08:00
2025-09-30 22:36:27 +08:00
$hasProcessedPush = true; // 标记已处理推送
2025-09-29 18:29:08 +08:00
}
}
2025-09-30 21:10:48 +08:00
2025-09-29 18:29:08 +08:00
}
}
2025-09-29 19:11:57 +08:00
if(!empty($text_list_new)){
$push = new Push();
$push->hourRanking($text_list_new);
}
2025-09-29 18:29:08 +08:00
}
2025-09-29 18:41:37 +08:00
echo "送礼-共" . count($room_owner) . "个房间房主获益\n";
2025-09-29 16:27:36 +08:00
}
2025-09-29 18:29:08 +08:00
//添加金币到钱包
2025-09-29 21:00:30 +08:00
public function add_coin($coin,$user_id,$ranking,$room_id,$total_price,$is_piao){
2025-09-30 21:10:48 +08:00
if($coin > 0){
$data = [
'user_id' => $user_id,
'change_value' => $coin,
2025-09-29 18:29:08 +08:00
// 'room_id' => $room_ids,
2025-09-30 21:10:48 +08:00
'money_type' => 1,
'change_type' => 27,
'from_id' => 0,
'remarks' => '小时榜获得',
'createtime' => time()
];
2025-09-29 18:29:08 +08:00
2025-09-30 21:10:48 +08:00
//开启事务
Db::startTrans();
$res = Db::name('vs_user_money_log')->insert($data);
if(!$res){
Db::rollback();
}
2025-09-29 19:50:09 +08:00
2025-09-30 21:10:48 +08:00
//增加用户金币
$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();
2025-09-29 19:50:09 +08:00
}
2025-09-30 21:10:48 +08:00
2025-09-29 18:29:08 +08:00
return true;
}
//添加礼物到背包
2025-09-29 21:00:30 +08:00
public function add_gift($gift_id,$user_id,$ranking,$room_id,$total_price,$is_piao){
2025-09-29 18:29:08 +08:00
$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");
}
2025-09-29 19:50:09 +08:00
//添加到排行表
$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(),
2025-09-29 21:00:30 +08:00
'is_public_server' => $is_piao
2025-09-29 19:50:09 +08:00
]);
if(!$res2){
Log::record("小时榜礼物锁定失败","info");
}
2025-09-29 18:29:08 +08:00
return true;
}
//添加装扮到背包
2025-09-29 21:00:30 +08:00
public function add_decorate($avatar_id,$user_id,$ranking,$room_id,$total_price,$is_piao,$type){
2025-09-29 18:29:08 +08:00
$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");
}
2025-09-29 19:50:09 +08:00
//添加到排行表
$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,
2025-09-29 21:00:30 +08:00
'gift_type' => $type,
2025-09-29 19:50:09 +08:00
'time_id' => date('H', strtotime('-1 hour')),
'stime' => $start_time,
'etime' => $end_time,
'createtime' => time(),
'updatetime' => time(),
2025-09-29 21:00:30 +08:00
'is_public_server' => $is_piao,
2025-09-29 19:50:09 +08:00
]);
if(!$res2){
Log::record("小时榜咋装扮锁定失败","info");
}
2025-09-29 18:29:08 +08:00
return true;
}
2025-09-30 21:10:48 +08:00
/**
* 提取所有有奖励的内容
*/
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++;
}
2025-09-29 18:29:08 +08:00
2025-09-30 21:10:48 +08:00
// 分配当前名次的奖励
$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;
}
2025-09-29 18:29:08 +08:00
2025-09-29 16:27:36 +08:00
}