新需求: 盲盒转盘开发-转盘抽奖接口开发-盲盒转盘接口列表调整

This commit is contained in:
2025-08-25 19:31:12 +08:00
parent e3cf4be45d
commit d6fd286227
6 changed files with 301 additions and 22 deletions

View File

@@ -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);
}
}

View File

@@ -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,"成功");

View File

@@ -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];
}
}

View File

@@ -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']);
}
/*

View File

@@ -1,6 +1,7 @@
<?php
namespace app\api\model;
use app\common\controller\Push;
use think\Model;
use think\Db;
use think\Session;
@@ -18,7 +19,7 @@ class BlindBoxTurntableGift extends Model
protected $table = 'fa_vs_gift';
//获取奖池礼物列表
public function get_gift_list($gift_bag_id)
public function get_gift_list($gift_bag_id,$room_id)
{
$box = db::name('vs_gift_bag')->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,

View File

@@ -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();