From d6fd286227d56d63a6958d12d5ebad4b1dc8bc28 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=B5=B5=E9=92=8A?= Date: Mon, 25 Aug 2025 19:31:12 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E9=9C=80=E6=B1=82=EF=BC=9A=20?= =?UTF-8?q?=E7=9B=B2=E7=9B=92=E8=BD=AC=E7=9B=98=E5=BC=80=E5=8F=91-?= =?UTF-8?q?=E8=BD=AC=E7=9B=98=E6=8A=BD=E5=A5=96=E6=8E=A5=E5=8F=A3=E5=BC=80?= =?UTF-8?q?=E5=8F=91-=E7=9B=B2=E7=9B=92=E8=BD=AC=E7=9B=98=E6=8E=A5?= =?UTF-8?q?=E5=8F=A3=E5=88=97=E8=A1=A8=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- application/adminapi/controller/BlindBox.php | 181 +++++++++++++++++- application/adminapi/controller/Room.php | 12 +- application/adminapi/model/Room.php | 18 ++ .../api/controller/BlindBoxTurntable.php | 3 +- .../api/model/BlindBoxTurntableGift.php | 87 ++++++++- application/cron/controller/Subsidy.php | 22 ++- 6 files changed, 301 insertions(+), 22 deletions(-) diff --git a/application/adminapi/controller/BlindBox.php b/application/adminapi/controller/BlindBox.php index 3758880..1e6c885 100644 --- a/application/adminapi/controller/BlindBox.php +++ b/application/adminapi/controller/BlindBox.php @@ -40,7 +40,8 @@ class BlindBox extends adminApi if(empty($gift_bag_id)){ return V(0,"请选择盲盒类型"); } - $bag_list = db::name("vs_gift_bag")->field('id,name')->where(['activities_id'=>4,'status'=>1])->select(); + $bag_data = db::name("vs_gift_bag")->find($gift_bag_id); + $bag_list = db::name("vs_gift_bag")->field('id,name')->where(['activities_id'=>$bag_data['activities_id'],'status'=>1])->select(); foreach ($bag_list as &$v) { $v['default'] = $gift_bag_id == $v['id'] ? 1 : 0; } @@ -66,6 +67,7 @@ class BlindBox extends adminApi $lists[$key]['remaining_number'] = $value['remaining_number']; $lists[$key]['is_public_screen'] = $gift_data['is_public_screen']; $lists[$key]['is_public_server'] = $gift_data['is_public_server']; + $lists[$key]['is_world_show'] = $value['is_world_show']; $lists[$key]['createtime'] = date('Y-m-d H:i:s', $value['createtime']); } @@ -412,5 +414,182 @@ class BlindBox extends adminApi $bag_list = db::name("vs_gift_bag")->field('id,name')->where(['activities_id'=>$activities_id,'status'=>1])->select(); return V(1,"成功", $bag_list); } + //--------------------------盲盒转盘与巡乐会------------------------------------------------------- + /* + * 巡乐会规则详情 + */ + public function xunlehui_rule_detail(){ + $gift_bag_id = 13; + $gift_bag = db::name('vs_gift_bag')->where(['id'=>$gift_bag_id])->find(); + $ext_data = json_decode($gift_bag['ext'],true); + $ext_data['introd'] = stripcslashes($ext_data['introd']); + $bag_list = db::name("vs_gift_bag")->field('id,name')->where(['activities_id'=>5,'status'=>1])->select(); + foreach ($bag_list as &$value) { + $value['is_default'] = 0; + if($value['id'] == $ext_data['inlet_bag_id']){ + $value['is_default'] = 1; + } + } + $ext_data['bag_list'] = $bag_list; + if($gift_bag){ + return V(1,"成功",$ext_data); + }else{ + return V(0,"失败"); + } + } + /* + * 巡乐会规则设置 + */ + public function xunlehui_set_rule(){ + $gift_bag_id = 13; + $inlet_bag_id = input('inlet_bag_id', ''); + $waiting_start_num = input('waiting_start_num', ''); + $start_num = input('start_num', ''); + $selected_gift_id = input('selected_gift_id', ''); + $locking_gift_id = input('locking_gift_id', ''); + $give_homeowner_gift_id = input('give_homeowner_gift_id', ''); + $end_time = input('end_time', ''); + $tow_no_locking_time = input('tow_no_locking_time', ''); + $next_time = input('next_time', ''); + $introd =$_POST['introd']??""; + if(empty($inlet_bag_id)){ + return V(0,"请选择巡乐会绑定入口"); + } + $ext =[ + 'inlet_bag_id' => $inlet_bag_id, + 'gift_id' => $selected_gift_id, + 'open_condition' => [ + 'waiting_start_num' => $waiting_start_num, + 'start_num' => $start_num, + ], + 'locking_condition' => [ + 'selected_gift_id' => $selected_gift_id, + 'locking_gift_id' => $locking_gift_id, + 'give_homeowner_gift_id' => $give_homeowner_gift_id, + ], + 'locking_time' => [ + 'end_time' => $end_time, + 'tow_no_locking_time' => $tow_no_locking_time, + 'next_time' => $next_time, + ], + 'introd' => $introd, + ]; + $ext = json_encode($ext); + $res = db::name('vs_gift_bag')->where(['id'=>$gift_bag_id])->update(['ext'=>$ext]); + if($res){ + return V(1,"成功"); + }else{ + return V(0,"失败"); + } + } + /* + * 盲盒转盘统计 + * + */ + public function blind_box_turntable_lists(){ + $page = input('page', 1); + $page_limit = input('page_limit', 30); + $gift_id = input('gift_id', ''); + $gift_name = input('gift_name', ''); + $gift_bag_id = input('gift_bag_id', 10); + $room_id = input('room_id', ''); + if(empty($gift_bag_id)){ + return V(0,"请选择盲盒类型"); + } + $room = db::name('vs_room')->where(['id'=>$room_id])->find(); + if(empty($room)){ + return V(0,"房间不存在"); + } + if($room['is_open_blind_box_turntable'] !=1){ + return V(0,"该房间未开启盲盒转盘"); + } + $bag_data = db::name("vs_gift_bag")->find($gift_bag_id); + $bag_list = db::name("vs_gift_bag")->field('id,name')->where(['activities_id'=>$bag_data['activities_id'],'status'=>1])->select(); + foreach ($bag_list as &$v) { + $v['default'] = $gift_bag_id == $v['id'] ? 1 : 0; + } + $where=[]; + $where['gift_bag_id'] = $gift_bag_id; + if($gift_id!==''){ + $where['foreign_id'] =$gift_id; + } + if($gift_name!==''){ + $where['name'] = ['like', '%'.$gift_name.'%']; + } + $count = db::name($this->table)->where($where)->count(); + $lists_data = db::name($this->table)->where($where)->page($page, $page_limit)->order("id desc")->select(); + $lists = []; + foreach ($lists_data as $key => $value) { + $lists[$key]['id'] = $value['id']; + $lists[$key]['gift_id'] = $value['foreign_id']; + $lists[$key]['gift_name'] = $value['name']; + $gift_data = db::name('vs_gift')->where(['gid'=>$value['foreign_id']])->find(); + $lists[$key]['base_image'] = $gift_data['base_image']; + $lists[$key]['gift_price'] = $gift_data['gift_price']; + $lists[$key]['quantity'] = $value['quantity']; + $room_pan = db::name('vs_room_pan')->where(['room_id'=>$room_id,'gift_bag_detail_id'=>$value['id']])->find(); + $lists[$key]['remaining_number'] = $room_pan['remaining_number'] ?? 0; + $lists[$key]['is_public_screen'] = $gift_data['is_public_screen']; + $lists[$key]['is_public_server'] = $gift_data['is_public_server']; + $lists[$key]['is_world_show'] = $value['is_world_show']; + $lists[$key]['createtime'] = date('Y-m-d H:i:s', $value['createtime']); + } + //统计 + $total_data = []; + //每期总次数 + $total_count = db::name($this->table)->where(['gift_bag_id'=>$gift_bag_id])->sum('quantity'); + //每期总礼物价值 + $total_price_data = db::name($this->table)->alias('a') + ->field('a.quantity,b.gift_price,b.gift_price * a.quantity as total_price') + ->join('vs_gift b','a.foreign_id = b.gid') + ->where(['a.gift_bag_id'=>$gift_bag_id]) + ->select(); + $total_price = array_sum(array_column($total_price_data,'total_price')); + //每期总抽奖花费(支出) + $bag_data = db::name("vs_gift_bag")->field('id,name,ext')->where(['id'=>$gift_bag_id])->find(); + $ext = json_decode($bag_data['ext'],true); + $c_gift_id = $ext['gift_id']; + $c_gift_data = db::name('vs_gift')->where(['gid'=>$c_gift_id])->find(); + $gift_price = $c_gift_data['gift_price']??0; + $total_cost = $total_count * $gift_price; + //每期统计(收入/支出) + if($total_cost==0 || $total_price==0){ + $profit_loss_ratio = 0; + }else{ + $profit_loss_ratio =round(($total_price / $total_cost ),2); + } + //今天抽奖人数 + $today_count_user = db::name('vs_gift_bag_receive_log') + ->where(['gift_bag_id'=>$gift_bag_id,'createtime'=>['between',[strtotime(date('Y-m-d')),time()]]]) + ->group('user_id') + ->count(); + //今日抽奖总次数 + $today_total_count = db::name('vs_gift_bag_receive_log') + ->where(['gift_bag_id'=>$gift_bag_id,'createtime'=>['between',[strtotime(date('Y-m-d')),time()]]]) + ->count(); + //今日抽奖收入 + $today_total_price = db::name('vs_gift_bag_receive_log') + ->where(['gift_bag_id'=>$gift_bag_id,'createtime'=>['between',[strtotime(date('Y-m-d')),time()]]]) + ->sum('bag_price'); + $return_data = [ + 'page' =>$page, + 'page_limit' => $page_limit, + 'count' => $count, + 'lists' => $lists, + 'bag_list' => $bag_list, + 'total_data' => [ + 'blind_box_turntable_periods' => $room['blind_box_turntable_periods']??'0', //当前期数 + 'remaining_number' => db::name('vs_room_pan')->where(['room_id'=>$room_id,'gift_bag_id'=>$gift_bag_id])->sum('remaining_number')??'0', + 'total_count' => $total_count, + 'total_price' => $total_price, + 'total_cost' => $total_cost, + 'profit_loss_ratio' => $profit_loss_ratio, + 'today_count_user' => $today_count_user, + 'today_total_count' => $today_total_count, + 'today_total_price' => $today_total_price, + ] + ]; + return V(1,"成功", $return_data); + } } \ No newline at end of file diff --git a/application/adminapi/controller/Room.php b/application/adminapi/controller/Room.php index c62e219..505c833 100644 --- a/application/adminapi/controller/Room.php +++ b/application/adminapi/controller/Room.php @@ -469,6 +469,7 @@ class Room extends adminApi $lists[$key]['room_status_str'] = model('Room')->room_status[$value['room_status']]; $lists[$key]['createtime'] = date('Y-m-d H:i:s', $value['createtime']); $lists[$key]['is_robot_num'] = $value['robot_num']==0 ? 1 : 2; + $lists[$key]['is_open_blind_box_turntable_str'] = $value['is_open_blind_box_turntable'] == 1 ? '是' : '否'; } $return_data = [ 'page' =>$page, @@ -843,7 +844,16 @@ class Room extends adminApi } } } - + $is_open_blind_box_turntable = input('is_open_blind_box_turntable', '');//是否开启盲盒转盘:0 否 1是 + if($is_open_blind_box_turntable !== ""){ + $data['is_open_blind_box_turntable'] = $is_open_blind_box_turntable; + if($is_open_blind_box_turntable == 1){ + $room_data = db::name('vs_room')->find($room_id); + if($room_data['is_open_blind_box_turntable'] == 0){ + model('Room')->bindPan($room_id); + } + } + } $res = db::name('vs_room')->where('id',$room_id)->update($data); if($res){ return V(1,"成功"); diff --git a/application/adminapi/model/Room.php b/application/adminapi/model/Room.php index 825d0c9..8b3f77b 100644 --- a/application/adminapi/model/Room.php +++ b/application/adminapi/model/Room.php @@ -88,6 +88,24 @@ class Room extends Model return $total_price; } + /* + * 房间绑定盘 + */ + public function bindPan($room_id){ + db::name('vs_room_pan')->where(['room_id'=>$room_id])->delete(); + $gift_bag = db::name('vs_gift_bag_detail')->where(['gift_bag_id'=>['in',[10,11,12,13]]])->select(); + foreach ($gift_bag as $k=>$v){ + $data = [ + 'room_id'=>$room_id, + 'gift_bag_id'=>$v['gift_bag_id'], + 'gift_bag_detail_id'=>$v['id'], + 'remaining_number'=>$v['quantity'], + 'createtime'=>time() + ]; + db::name('vs_room_pan')->insert($data); + } + return ['code' => 1, 'msg' => '成功', 'data' => null]; + } } diff --git a/application/api/controller/BlindBoxTurntable.php b/application/api/controller/BlindBoxTurntable.php index aa1eb35..d71f214 100644 --- a/application/api/controller/BlindBoxTurntable.php +++ b/application/api/controller/BlindBoxTurntable.php @@ -24,7 +24,8 @@ class BlindBoxTurntable extends BaseCom */ public function get_gift_list(){ $gift_bag_id = input('gift_bag_id',0); - $reslut = model('BlindBoxTurntableGift')->get_gift_list($gift_bag_id); + $room_id = input('room_id',0); + $reslut = model('BlindBoxTurntableGift')->get_gift_list($gift_bag_id,$room_id); return v($reslut['code'], $reslut['msg'], $reslut['data']); } /* diff --git a/application/api/model/BlindBoxTurntableGift.php b/application/api/model/BlindBoxTurntableGift.php index e8ea952..656ae6b 100644 --- a/application/api/model/BlindBoxTurntableGift.php +++ b/application/api/model/BlindBoxTurntableGift.php @@ -1,6 +1,7 @@ where('id',$gift_bag_id)->find(); $gifts = db::name('vs_gift_bag_detail')->where('gift_bag_id',$gift_bag_id)->order("id desc")->select(); @@ -34,14 +35,40 @@ class BlindBoxTurntableGift extends Model $gift_list[$key]['gift_price'] = $gift_data['gift_price']; } } - $ext = json_decode($box['ext'],true); $box_gift = Db::name('vs_gift')->where('gid',$ext['gift_id'])->find(); + + //巡乐会 + $is_xlh = 0; + $xlh_box = db::name('vs_gift_bag')->where('id',13)->find(); + $xlh_ext = json_decode($xlh_box['ext'],true); + $xlh = []; + if($xlh_ext['inlet_bag_id'] == $box['id']){ + $is_xlh = 1; + $xlh['waiting_start_num'] = $xlh_ext['open_condition']['waiting_start_num'];//等待开奖次数 + $xlh['start_num'] = $xlh_ext['open_condition']['start_num'];//开始开奖次数 + //本期总次数 + $total_number = db::name('vs_gift_bag_detail')->where(['gift_bag_id'=>$gift_bag_id])->sum('quantity')??0; + //本期剩余次数 + $remaining_number = db::name('vs_room_pan')->where(['room_id'=>$room_id,'gift_bag_id'=>$gift_bag_id])->sum('remaining_number')??'0'; + //当前抽奖次数 + $xlh['current_num'] = $total_number - $remaining_number; + //状态 + if($xlh['current_num'] >= $xlh_ext['open_condition']['start_num']){ + $xlh['status'] = 1;//状态 1:巡乐会开始 2:即将开始开始 0:等待开始 + } elseif($xlh['current_num'] >= $xlh_ext['open_condition']['waiting_start_num'] && $xlh['current_num'] < $xlh_ext['open_condition']['start_num']){ + $xlh['status'] = 2;//状态 1:巡乐会开始 2:即将开始开始 0:等待开始 + }else{ + $xlh['status'] = 0; + } + } $result_data = [ 'title' => $box['name'], 'rule_url' => get_system_config_value('web_site')."/api/Page/get_gift_box_rule?box_id=".$box["id"], 'rule' => $ext['introd'], 'box_price' => $box_gift['gift_price'], + 'is_xlh' => $is_xlh, + 'xlh_data' => $xlh, 'gift_list' => $gift_list, ]; return ['code' => 1, 'msg' => '获取成功', 'data' => $result_data]; @@ -60,6 +87,10 @@ class BlindBoxTurntableGift extends Model if ($user_waller['coin'] < $bag_gift['gift_price'] * $num) { return ['code' => 0, 'msg' => '用户金币不足', 'data' => null]; } + $room = db::name('vs_room')->where(['id'=>$room_id])->find(); + if ($room['is_open_blind_box_turntable'] != 1) { + return ['code' => 0, 'msg' => '该房间未开启盲盒转盘', 'data' => null]; + } //盲盒转盘抽奖记录 $box_turntable_log = db::name('vs_blind_box_turntable_log')->insertGetId([ 'user_id' => $user_id, @@ -126,12 +157,18 @@ class BlindBoxTurntableGift extends Model public function draw_gift_one($gift_bag_id, $user_id, $gift_user_id,$gift_price,$periods,$room_id=0,$box_turntable_log=0){ //随机获取一个礼物 $where = [ - 'gift_bag_id' => $gift_bag_id, - 'quantity' => ['>',0], - 'remaining_number' => ['>',0] + 'a.gift_bag_id' => $gift_bag_id, + 'a.quantity' => ['>',0], + 'b.remaining_number' => ['>',0], + 'b.room_id' => $room_id ]; // 优化:基于剩余数量的加权随机选择 - $gift_bag_details = db::name("vs_gift_bag_detail")->where($where)->select(); + $gift_bag_details = db::name("vs_gift_bag_detail") + ->field('a.id,a.quantity,b.remaining_number,a.weight,a.foreign_id') + ->alias('a') + ->join('vs_room_pan b','b.gift_bag_detail_id = a.id','left') + ->where($where) + ->select(); if (empty($gift_bag_details)) { return ['code' => 0, 'msg' => '当前盲盒无可用礼物', 'data' => []]; } @@ -181,19 +218,51 @@ class BlindBoxTurntableGift extends Model return ['code' => 0, 'msg' => '失败,', 'data' => []]; } //减去盲盒包礼物数量 - $ret = db::name("vs_gift_bag_detail")->where('id',$gift_bag_detail['id'])->setDec('remaining_number'); +// $ret = db::name("vs_gift_bag_detail")->where('id',$gift_bag_detail['id'])->setDec('remaining_number'); + $ret = db::name("vs_room_pan")->where(['room_id'=>$room_id,'gift_bag_detail_id'=>$gift_bag_detail['id']])->setDec('remaining_number',1); if(!$ret){ return ['code' => 0, 'msg' => '失败.', 'data' => []]; } //判断剩余数量是否为0 为0重置,进入下一期 - $gift_bag_num = db::name("vs_gift_bag_detail")->where('gift_bag_id',$gift_bag_id)->sum('remaining_number'); + $gift_bag_num = db::name("vs_room_pan")->where(['room_id'=>$room_id,'gift_bag_id'=>$gift_bag_id])->sum('remaining_number'); if($gift_bag_num <= 0){ db::name("vs_gift_bag")->where('id',$gift_bag_id)->setInc('periods'); - db::name("vs_gift_bag_detail")->where('gift_bag_id',$gift_bag_id)->update(['remaining_number'=>db::raw('quantity')]); + db::name("vs_room")->where('id',$room_id)->setInc('blind_box_turntable_periods'); + db::name("vs_room_pan")->where(['room_id'=>$room_id,'gift_bag_id'=>$gift_bag_id])->update( + ['remaining_number' => db::raw('(SELECT quantity FROM fa_vs_gift_bag_detail WHERE id = fa_vs_room_pan.gift_bag_detail_id)')]); } }else{ return ['code' => 0, 'msg' => '失败!', 'data' => []]; } + //巡乐会飘屏 + $xlh_box = db::name('vs_gift_bag')->where('id',13)->find(); + $xlh_ext = json_decode($xlh_box['ext'],true); + if($xlh_ext['inlet_bag_id'] == $gift_bag_id['id']){ + $room_name = Db::name('vs_room')->where(['id' => $room_id, 'apply_status' => 2])->value('room_name'); + if($total_draw_times == $xlh_ext['open_condition']['waiting_start_num']){ + //即将开始推送飘屏 + $text = $room_name."的巡乐会即将开始,请大家尽快参与哦!"; + } + if($total_draw_times == $xlh_ext['open_condition']['start_num']){ + //正式开始推送飘屏 + $text = $room_name."的巡乐会正式开始,请大家尽快参与哦!"; + } + //推送礼物横幅 + $push = new Push(UID, $room_id); + $room_name = Db::name('vs_room')->where(['id' => $room_id, 'apply_status' => 2])->value('room_name'); + $text_list_new = [ + 'text' => $text, + 'gift_picture' => "", + 'room_id' => $room_id, + 'fromUserName' => "", + 'toUserName' => "", + 'giftName' => "", + 'roomId' => $room_id, + 'number' => "", + ]; + $push->giftBanner($text_list_new); + } + $result_data = [ 'user_id' => $user_id, 'gift_user_id'=>$gift_user_id, diff --git a/application/cron/controller/Subsidy.php b/application/cron/controller/Subsidy.php index 00e44dc..8f232b0 100644 --- a/application/cron/controller/Subsidy.php +++ b/application/cron/controller/Subsidy.php @@ -30,12 +30,13 @@ class Subsidy */ public function createGuildSubsidyData(){ //获取上周第一天时间 - $week_start_time = strtotime('-1 weeklast monday'); - $week_end_time = strtotime('last sunday'); -// $week_start_time = strtotime('this week monday'); -// $week_end_time = strtotime('sunday'); + $week_start_time = strtotime('last monday'); + $week_end_time = strtotime(date('Y-m-d 23:59:59',strtotime('last sunday'))); + // $week_start_time = strtotime('2025-08-11'); + // $week_end_time = strtotime('2025-08-17 23:59:59'); + //获取上周时间 - $time_value = date('o-W', strtotime('-1 week')); + $time_value = date('o-W', $week_start_time); echo $time_value . "工会周补贴数据生成开始\n"; //查询所有工会 $guild_list = db::name('vs_guild')->where(['delete_time'=>0])->field('id')->select(); @@ -97,12 +98,13 @@ class Subsidy */ public function createRoomSubsidyData(){ //获取上周第一天时间 - $week_start_time = strtotime('-1 weeklast monday'); - $week_end_time = strtotime('last sunday'); -// $week_start_time = strtotime('this week monday'); -// $week_end_time = strtotime('sunday'); + $week_start_time = strtotime('last monday'); + $week_end_time = strtotime(date('Y-m-d 23:59:59',strtotime('last sunday'))); + // $week_start_time = strtotime('2025-08-11'); + // $week_end_time = strtotime('2025-08-17 23:59:59'); + //获取上周时间 - $time_value = date('o-W', strtotime('-1 week')); + $time_value = date('o-W', $week_start_time); echo $time_value . "房间周补贴数据生成开始\n"; //查询所有房间 $room_list = db::name('vs_room')->where(['delete_time'=>0,'is_earnings'=>1])->field('id')->select();