新需求:巡乐会相关代码提交

This commit is contained in:
2025-08-26 16:19:26 +08:00
parent 42aa6e4276
commit b053867e25
3 changed files with 233 additions and 19 deletions

View File

@@ -453,12 +453,14 @@ class BlindBox extends adminApi
$tow_no_locking_time = input('tow_no_locking_time', ''); $tow_no_locking_time = input('tow_no_locking_time', '');
$next_time = input('next_time', ''); $next_time = input('next_time', '');
$introd =$_POST['introd']??""; $introd =$_POST['introd']??"";
$price = input('price', '');
if(empty($inlet_bag_id)){ if(empty($inlet_bag_id)){
return V(0,"请选择巡乐会绑定入口"); return V(0,"请选择巡乐会绑定入口");
} }
$ext =[ $ext =[
'inlet_bag_id' => $inlet_bag_id, 'inlet_bag_id' => $inlet_bag_id,
'gift_id' => $selected_gift_id, 'gift_id' => $selected_gift_id,
'xlh_box_price' => $price,
'open_condition' => [ 'open_condition' => [
'waiting_start_num' => $waiting_start_num, 'waiting_start_num' => $waiting_start_num,
'start_num' => $start_num, 'start_num' => $start_num,

View File

@@ -72,4 +72,23 @@ class BlindBoxTurntable extends BaseCom
$reslut = model('BlindBoxTurntableGift')->get_all_record($gift_bag_id,$page,$page_size); $reslut = model('BlindBoxTurntableGift')->get_all_record($gift_bag_id,$page,$page_size);
return v($reslut['code'], $reslut['msg'], $reslut['data']); return v($reslut['code'], $reslut['msg'], $reslut['data']);
} }
/*
* 巡乐会
*/
public function xlh(){
$room_id = input('room_id',0);
$reslut = model('BlindBoxTurntableGift')->xlh_gift_list($room_id);
return v($reslut['code'], $reslut['msg'], $reslut['data']);
}
/*
* 巡乐会抽奖
*/
public function xlh_draw_gift(){
$user_id = $this->uid;
$room_id = input('room_id',0);
$num = input('num',1);
$reslut = model('BlindBoxTurntableGift')->xlh_draw_gift($user_id,$num,$room_id);
return v($reslut['code'], $reslut['msg'], $reslut['data']);
}
} }

View File

@@ -65,7 +65,7 @@ class BlindBoxTurntableGift extends Model
$result_data = [ $result_data = [
'title' => $box['name'], 'title' => $box['name'],
'rule_url' => get_system_config_value('web_site')."/api/Page/get_gift_box_rule?box_id=".$box["id"], 'rule_url' => get_system_config_value('web_site')."/api/Page/get_gift_box_rule?box_id=".$box["id"],
'rule' => $ext['introd'], // 'rule' => $ext['introd'],
'box_price' => $box_gift['gift_price'], 'box_price' => $box_gift['gift_price'],
'is_xlh' => $is_xlh, 'is_xlh' => $is_xlh,
'xlh_data' => $xlh, 'xlh_data' => $xlh,
@@ -102,7 +102,7 @@ class BlindBoxTurntableGift extends Model
]); ]);
foreach ($toarray as $gift_user_id){ foreach ($toarray as $gift_user_id){
for($i = 0; $i < $num; $i++){ for($i = 0; $i < $num; $i++){
$reslut_draw_gift_data = $this->draw_gift_one($gift_bag_id, $user_id, $gift_user_id,$bag_gift['gift_price'],$bag_data['periods'],$room_id,$box_turntable_log); $reslut_draw_gift_data = $this->draw_gift_one($gift_bag_id, $user_id, $gift_user_id,$bag_gift['gift_price'],$room['blind_box_turntable_periods'],$room_id,$box_turntable_log);
$reslut_draw_gift[] = $reslut_draw_gift_data['data']; $reslut_draw_gift[] = $reslut_draw_gift_data['data'];
} }
} }
@@ -237,19 +237,13 @@ class BlindBoxTurntableGift extends Model
//巡乐会飘屏 //巡乐会飘屏
$xlh_box = db::name('vs_gift_bag')->where('id',13)->find(); $xlh_box = db::name('vs_gift_bag')->where('id',13)->find();
$xlh_ext = json_decode($xlh_box['ext'],true); $xlh_ext = json_decode($xlh_box['ext'],true);
if($xlh_ext['inlet_bag_id'] == $gift_bag_id['id']){ if($xlh_ext['inlet_bag_id'] == $gift_bag_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']){ if($total_draw_times == $xlh_ext['open_condition']['waiting_start_num']){
$room_name = Db::name('vs_room')->where(['id' => $room_id, 'apply_status' => 2])->value('room_name');
//即将开始推送飘屏 //即将开始推送飘屏
$text = $room_name."的巡乐会即将开始,请大家尽快参与哦!"; $text = $room_name."的巡乐会即将开始,请大家尽快参与哦!";
}
if($total_draw_times == $xlh_ext['open_condition']['start_num']){
//正式开始推送飘屏
$text = $room_name."的巡乐会正式开始,请大家尽快参与哦!";
}
//推送礼物横幅 //推送礼物横幅
$push = new Push(UID, $room_id); $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_list_new = [
'text' => $text, 'text' => $text,
'gift_picture' => "", 'gift_picture' => "",
@@ -262,7 +256,25 @@ class BlindBoxTurntableGift extends Model
]; ];
$push->giftBanner($text_list_new); $push->giftBanner($text_list_new);
} }
if($total_draw_times == $xlh_ext['open_condition']['start_num']){
$room_name = Db::name('vs_room')->where(['id' => $room_id, 'apply_status' => 2])->value('room_name');
//正式开始推送飘屏
$text = $room_name."的巡乐会正式开始,请大家尽快参与哦!";
//推送礼物横幅
$push = new Push(UID, $room_id);
$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 = [ $result_data = [
'user_id' => $user_id, 'user_id' => $user_id,
'gift_user_id'=>$gift_user_id, 'gift_user_id'=>$gift_user_id,
@@ -349,4 +361,185 @@ class BlindBoxTurntableGift extends Model
} }
return ['code' => 1, 'msg' => '成功', 'data' => $list]; return ['code' => 1, 'msg' => '成功', 'data' => $list];
} }
/*
* 巡乐会
*/
public function xlh_gift_list($room_id){
$gift_bag_id = 13;
$xlh_box = db::name('vs_gift_bag')->where('id',$gift_bag_id)->find();
$xlh_ext = json_decode($xlh_box['ext'],true);
$gifts = db::name('vs_gift_bag_detail')->where('gift_bag_id',$gift_bag_id)->order("id desc")->select();
$gift_list = [];
foreach ($gifts as $key => $value) {
$gift_data = db::name('vs_gift')->where('gid',$value['foreign_id'])->where('delete_time',0)->find();
if($gift_data){
$gift_list[$key]['number'] = $key;
$gift_list[$key]['gift_id'] = $gift_data['gid'];
$gift_list[$key]['gift_name'] = $gift_data['gift_name'];
$gift_list[$key]['base_image'] = $gift_data['base_image'];
$gift_list[$key]['play_image'] = $gift_data['play_image'];
$gift_list[$key]['gift_price'] = $gift_data['gift_price'];
}
}
//巡乐会结束时间
$xlh_end_time = time() + $xlh_ext['locking_time']['end_time'] * 60;
//房主礼物
$room_user_gift = db::name('vs_gift')->where('gid',$xlh_ext['locking_condition']['give_homeowner_gift_id'])->find();
//巡乐会主礼物
$xlh_main_gift = db::name('vs_gift')->where('gid',$xlh_ext['locking_condition']['locking_gift_id'])->find();
//中奖用户
$result_data = [
'title' => $xlh_box['name'],
'rule_url' => get_system_config_value('web_site')."/api/Page/get_gift_box_rule?box_id=".$xlh_box["id"],
'box_price' => $xlh_ext['xlh_box_price'],
'xlh_end_time' =>date('Y-m-d H:i:s',$xlh_end_time),
'give_homeowner_gift' => [
'gift_id' => $room_user_gift['gid'],
'gift_name' => $room_user_gift['gift_name'],
'base_image' => $room_user_gift['base_image'],
],
'locking_gift' => [
'gift_id' => $xlh_main_gift['gid'],
'gift_name' => $xlh_main_gift['gift_name'],
'gift_price' => $xlh_main_gift['gift_price'],
'base_image' => $xlh_main_gift['base_image'],
],
'gift_list' => $gift_list,
];
return ['code' => 1, 'msg' => '获取成功', 'data' => $result_data];
}
/*
* 巡乐会抽奖
*/
public function xlh_draw_gift($user_id,$num,$room_id){
$gift_bag_id = 13;
//获取盲盒配置
$bag_data = db::name("vs_gift_bag")->field('id,name,ext,periods')->where('id',$gift_bag_id)->find();
$ext = json_decode($bag_data['ext'],true);
//判断是否有足够的金币
$user_waller = db::name('user_wallet')->where(['user_id'=>$user_id])->find();
if ($user_waller['coin'] < $ext['xlh_box_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];
}
//开始抽奖
for($i = 0; $i < $num; $i++){
//随机获取一个礼物
$where = [
'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")
->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' => []];
}
//奖池总的抽奖次数
$total_quantity = db::name("vs_gift_bag_detail")->where(['gift_bag_id' => $gift_bag_id])->sum('quantity');
// 实现加权随机算法:剩余数量越多,被抽中的概率越大
$total_remaining = 0;
foreach ($gift_bag_details as $gift) {
$total_remaining += $gift['remaining_number'];
}
//本期当前第多少次后抽奖 总的抽奖次数- 剩余数量
$total_draw_times = $total_quantity - $total_remaining;
$rand_value = mt_rand(1, $total_remaining);
$current_sum = 0;
$gift_bag_detail = null;
foreach ($gift_bag_details as $gift) {
if($gift['remaining_number'] <= 0){
continue;
}
if($total_draw_times < $gift['weight']){
continue;
}
$current_sum += $gift['remaining_number'];
if ($rand_value <= $current_sum) {
$gift_bag_detail = $gift;
break;
}
}
if($gift_bag_detail){
//获取开出礼物的信息
$gift = db::name("vs_gift")->where(['gid'=>$gift_bag_detail['foreign_id']])->find();
//抽中礼物落包
$res = model('UserGiftPack')->change_user_gift_pack($user_id,$gift_bag_detail['foreign_id'],1,model('UserGiftPack')::XLH_DRAW_GIFT_GET,$bag_data['name']."抽奖所得");
if ($res['code'] != 1) {
return ['code' => 0, 'msg' => $res['msg'], 'data' => null];
}
//处理抽中礼物命中主奖品逻辑
if($gift_bag_detail['foreign_id'] == $ext['locking_condition']['selected_gift_id']){
//中奖
$box_turntable_log = db::name('fa_vs_room_pan_xlh')->insertGetId([
'user_id' => $user_id,
'room_id' => $room_id,
'gift_bag_id' => $gift_bag_id,
'num' => $num,
'room_id' => $room_id,
'bag_price' => $bag_gift['gift_price'],
'createtime' => time()
]);
}
//处理礼包发放记录表
$data = [];
$data['user_id'] = $user_id;
$data['parent_id'] = 0;
$data['gift_bag_id'] = $gift_bag_id;
$data['gift_id'] = $gift_bag_detail['foreign_id'];
$data['periods'] = $room['blind_box_turntable_periods'];
$data['room_id'] = $room_id;
$data['gift_price'] = $gift['gift_price'];
$data['bag_price'] = $ext['xlh_box_price'];
$data['createtime'] = time();
$result = db::name("vs_gift_bag_receive_log")->insert($data);
if(!$result){
return ['code' => 0, 'msg' => '失败,', 'data' => []];
}
//减去盲盒包礼物数量
$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_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_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' => []];
}
}
// 添加活动记录
$reslut = Db::name('vs_activities_receive')->insert([
'user_id' => $user_id,
'activities_id' => 6,
'room_id' => $room_id,
'createtime' => time(),
'updatetime' => time()
]);
$result_data = [
'user_id' => $user_id,
'gift_id'=>$gift_bag_detail['foreign_id'],
'gift_price'=>$gift['gift_price'],
'is_public_screen'=>$gift['is_public_screen'],
];
return ['code' => 1, 'msg' => '成功', 'data' => $result_data];
}
} }