Files
yusheng-php/application/api/model/Ranking.php
2026-01-16 17:10:05 +08:00

261 lines
11 KiB
PHP

<?php
namespace app\api\model;
use think\Db;
use think\Model;
class Ranking extends Model
{
protected $begin_time, $end_time, $type,$user_id, $lable, $page, $page_limit;
public function __construct($user_id,$type,$room_id,$page=1, $page_limit=30)
{
parent::__construct();
$this->type = $type;
$this->user_id = $user_id;
$this->room_id = $room_id;
$this->page = $page;
$this->page_limit = $page_limit;
switch ($type) {
case 1://日榜
$this->begin_time = mktime(0, 0, 0, date('m'), date('d'), date('Y'));
$this->end_time = mktime(0, 0, 0, date('m'), date('d') + 1, date('Y')) - 1;
break;
case 2://本周榜
$this->begin_time = mktime(0, 0, 0, date('m'), date('d') - (date('w') ?: 7) + 1, date('Y'));
$this->end_time = mktime(23, 59, 59, date('m'), date('d') - (date('w') ?: 7) + 7, date('Y'));
break;
case 3://本月榜
$this->begin_time = mktime(0, 0, 0, date('m'), 1, date('Y'));
$this->end_time = mktime(23, 59, 59, date('m'), date('t'), date('Y'));
break;
default://总榜
$this->begin_time = 0;
$this->end_time = time();
}
}
//财富、魅力榜
public function ranking($ranking_type)
{
$where['a.createtime'] = ['between', [$this->begin_time, $this->end_time]];
$params['start_time']=$this->begin_time;
$params['end_time']=$this->end_time;
if($ranking_type == 1){//1财富榜
$lists = model('GiveGiftBases')->getGiftRanking($params,1);
//把$lists 根据total倒序并只取前20名
usort($lists, function($a, $b) {
return $b['total'] <=> $a['total']; // 按total降序排序
});
$lists = array_slice($lists, 0, 20); // 取前20名
if($lists){
$my_ranking = [];
foreach ($lists as $key => &$value) {
$value['total'] = $value['total'] * 10;
$value['nickname'] = db::name('user')->where('id',$value['user_id'])->value('nickname');
$value['user_code'] = db::name('user')->where('id',$value['user_id'])->value('user_code');
$value['avatar'] = db::name('user')->where('id',$value['user_id'])->value('avatar');
$lists[$key]['rank'] = $key + 1;
if ($this->user_id == $value['user_id']) {
$my_ranking = $lists[$key];
$my_ranking['diff'] = $key == 0 ? 0 : ($lists[$key - 1]['total'] - $value['total']);
}
}
//自己不在前20名
if (!$my_ranking) {
$lists_last_number = $lists[count($lists) - 1]['total'] ?? 0;
//获取自己的送礼记录
$params['user_id'] = $this->user_id;
$my_ranking_datas = model('GiveGiftBases')->getUserStatistics($params,1);
$my_ranking['user_id'] = $my_ranking_datas['user_id'];
$my_ranking['total'] = $my_ranking_datas['total_price']??0;
$my_ranking['nickanme'] = db::name('user')->where('id',$this->user_id)->value('nickname');
$my_ranking['user_code'] = db::name('user')->where('id',$this->user_id)->value('user_code');
$my_ranking['avatar'] = db::name('user')->where('id',$this->user_id)->value('avatar');
$my_ranking['rank'] = -1;
$my_ranking['diff'] = numberFormat($lists_last_number - ($my_ranking['total'] ?: 0));
}
}else{
$my_ranking = db::name('user')
->field('user_code,avatar,nickname,id as user_id,sex')
->where('id',$this->user_id)->find();
$my_ranking['total'] = 0;
$my_ranking['rank'] = -1;
$my_ranking['diff'] = 0;
}
//2魅力榜
}else{
$lists = model('GiveGiftBases')->getGiftRanking($params,2);
//把$lists 根据total倒序并只取前20名
usort($lists, function($a, $b) {
return $b['total'] <=> $a['total']; // 按total降序排序
});
$lists = array_slice($lists, 0, 20); // 取前20名
if($lists){
$my_ranking = [];
foreach ($lists as $key => &$value) {
$value['nickname'] = db::name('user')->where('id',$value['gift_user'])->value('nickname');
$value['user_code'] = db::name('user')->where('id',$value['gift_user'])->value('user_code');
$value['avatar'] = db::name('user')->where('id',$value['gift_user'])->value('avatar');
$value['user_id'] = $value['gift_user'];
$lists[$key]['rank'] = $key + 1;
if ($this->user_id == $value['gift_user']) {
$my_ranking = $lists[$key];
$my_ranking['diff'] = $key == 0 ? 0 : ($lists[$key - 1]['total'] - $value['total']);
}
}
//自己不在前20名
if (!$my_ranking) {
$lists_last_number = $lists[count($lists) - 1]['total'] ?? 0;
//获取自己的收礼记录
$params['gift_user'] = $this->user_id;
$my_ranking_datas = model('GiveGiftBases')->getUserStatistics($params,2);
$my_ranking['user_id'] = $my_ranking_datas['user_id'];
$my_ranking['total'] = $my_ranking_datas['total_price']??0;
$my_ranking['nickname'] = db::name('user')->where('id',$this->user_id)->value('nickname');
$my_ranking['user_code'] = db::name('user')->where('id',$this->user_id)->value('user_code');
$my_ranking['avatar'] = db::name('user')->where('id',$this->user_id)->value('avatar');
$my_ranking['rank'] = -1;
$my_ranking['diff'] = numberFormat($lists_last_number - ($my_ranking['total'] ?: 0));
}
}else{
$my_ranking = db::name('user')
->field('user_code,avatar,nickname,id as user_id,sex')
->where('id',$this->user_id)->find();
$my_ranking['total'] = 0;
$my_ranking['rank'] = -1;
$my_ranking['diff'] = 0;
}
}
$data = [
'my_ranking' => $my_ranking,
'lists' => $lists
];
return ['code'=>1,'msg'=>'获取成功','data'=>$data];
}
//房间榜
public function room_ranking()
{
//金币与魅力比例
$ratio = get_system_config_value('coin_charm_exp');
//时间转为天
$begin_time = date('Y-m-d',$this->begin_time);
$end_time = date('Y-m-d',$this->end_time);
//获取当前用户的房间id
$myRoom = db::name('vs_room')->where(['user_id' => UID ,'room_status' => 1])->find();
if($myRoom){
$my_ranking['rank'] = -1;
$totla = db::name('room_daily_income')
->where(['room_id' => $myRoom['id'],'date' => ['between', [$begin_time, $end_time]]])->sum('income')??0 ;
$my_ranking['total'] = $totla * $ratio;
$my_ranking['diff'] = 0;
$my_ranking['room_name'] = $myRoom['room_name'];
$my_ranking['room_cover'] = $myRoom['room_cover'];
}else{
$myRoom['id'] = 0;
$my_ranking['rank'] = -1;
$my_ranking['total'] = 0;
$my_ranking['diff'] = 0;
$my_ranking['room_name'] = '';
$my_ranking['room_cover'] = '';
}
$lists = db::name('room_daily_income')->alias('a')
->join('vs_room b','a.room_id = b.id','left')
->field('a.room_id,sum(a.income) * ' . $ratio . ' as total,b.room_name,b.room_cover,b.room_number')
->where(['a.date' => ['between', [$begin_time, $end_time]]])
->group('a.room_id')
->order('total desc')
->limit(20)
->select();
// var_dump($lists);exit;
if($lists){
foreach ($lists as $key => $value) {
$lists[$key]['rank'] = $key + 1;
if ($myRoom['id'] == $value['room_id']) {
$my_ranking = $lists[$key];
$my_ranking['diff'] = $key == 0 ? 0 : ($lists[$key - 1]['total'] - $value['total']);
}
}
}
$data = [
'my_ranking' => $my_ranking,
'lists' => $lists
];
return ['code'=>1,'msg'=>'获取成功','data'=>$data];
}
//真爱榜
public function love_rankings()
{
$lists = db::name('user_cp_zone')->alias('a')
->join('user b','a.user_id1 = b.id','left')
->join('user c','a.user_id2 = c.id','left')
->where(['a.status' => 1])
->field('a.exp,a.id,a.level as total,a.user_id1,a.user_id2 as user_id,b.nickname as nickname1,c.nickname as nickname,b.avatar as user_avatar1,c.avatar as user_avatar')
->order('a.level desc')
->page($this->page, $this->page_limit)
->select();
$my_ranking = null;
if($lists){
//获取当前用户的房间id $this->user_id
$myRoom = db::name('user_cp_zone')->where(['user_id1' => UID ,'status' => 1])->find();
if(!$myRoom){
$myRoom = db::name('user_cp_zone')->where(['user_id2' => UID ,'status' => 1])->find();
}
if($myRoom){
foreach ($lists as $key => $value) {
$lists[$key]['rank'] = $key + 1;
if ($myRoom['id'] == $value['id']) {
$my_ranking = $lists[$key];
$my_ranking['diff'] = $key == 0 ? 0 : ($lists[$key - 1]['exp'] - $value['exp']);
}
}
}else{
foreach ($lists as $key => $value) {
$lists[$key]['rank'] = $key + 1;
}
}
}else{
$my_ranking = [
'user_id' => UID,
'user_id1' => 0,
'nickname' => db::name('user')->where(['id' => UID])->value('nickname'),
'nickname1' => '',
'user_avatar' => db::name('user')->where(['id' => UID])->value('avatar'),
'user_avatar1' => '',
'exp' => 0,
'diff' => 0,
'rank' => -1,
'total' => 0
];
}
$data = [
'my_ranking' => $my_ranking,
'lists' => $lists
];
return ['code'=>1,'msg'=>'获取成功','data'=>$data];
}
}