434 lines
17 KiB
PHP
434 lines
17 KiB
PHP
<?php
|
||
|
||
namespace app\api\controller;
|
||
|
||
use think\Controller;
|
||
use think\Db;
|
||
use think\Log;
|
||
|
||
use app\common\controller\Push;
|
||
|
||
class Xxiaoshi extends Controller
|
||
{
|
||
|
||
|
||
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->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;
|
||
}
|
||
|
||
|
||
|
||
|
||
|
||
|
||
} |