巡乐会抽奖接口提交.-代码优化

This commit is contained in:
2025-08-30 15:31:45 +08:00
parent 4c70b4b09d
commit 3994a7ad14

View File

@@ -88,60 +88,79 @@ class BlindBoxTurntableGift extends Model
if ($room['is_open_blind_box_turntable'] != 1) { if ($room['is_open_blind_box_turntable'] != 1) {
return ['code' => 0, 'msg' => '该房间未开启盲盒转盘', 'data' => null]; return ['code' => 0, 'msg' => '该房间未开启盲盒转盘', 'data' => null];
} }
//盲盒转盘抽奖记录 db::startTrans();
$box_turntable_log = db::name('vs_blind_box_turntable_log')->insertGetId([ try{
'user_id' => $user_id, //盲盒转盘抽奖记录
'gift_bag_id' => $gift_bag_id, $box_turntable_log = db::name('vs_blind_box_turntable_log')->insertGetId([
'num' => $num, 'user_id' => $user_id,
'room_id' => $room_id, 'gift_bag_id' => $gift_bag_id,
'bag_price' => $bag_gift['gift_price'], 'num' => $num,
'createtime' => time() 'room_id' => $room_id,
]); 'bag_price' => $bag_gift['gift_price'],
foreach ($toarray as $gift_user_id){
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'],$room['blind_box_turntable_periods'],$room_id,$box_turntable_log);
$reslut_draw_gift[] = $reslut_draw_gift_data['data'];
}
}
$reslut_gift = [];
$reslut_data = [];
foreach ($reslut_draw_gift as $key => $value) {
$gift_user_id = $value['gift_user_id'];
$gift_id = $value['gift_id'];
// 以 gift_user_id 和 gift_id 作为键进行分组
$group_key = $gift_user_id . '_' . $gift_id;
if (!isset($reslut_gift[$group_key])) {
$reslut_gift[$group_key] = [
'gift_user_id' => $gift_user_id,
'gift_id' => $gift_id,
'count' => 1,
'gift_price' => $value['gift_price']
];
} else {
$reslut_gift[$group_key]['count']++;
}
if (!isset($reslut_data[$gift_id])) {
$reslut_data[$gift_id] = [
'gift_id' => $gift_id,
'count' => 1
];
}else {
$reslut_data[$gift_id]['count']++;
}
}
$reslut_gift = array_values($reslut_gift);
foreach ($reslut_gift as $key => $value) {
db::name('vs_blind_box_turntable_results_log')->insert([
'tid' => $box_turntable_log,
'gift_user_id' => $value['gift_user_id'],
'gift_id' => $value['gift_id'],
'count' => $value['count'],
'gift_price' => $value['gift_price'],
'all_gift_price' => $value['gift_price'] * $value['count'],
'createtime' => time() 'createtime' => time()
]); ]);
if (!$box_turntable_log) {
db::rollback();
return ['code' => 0, 'msg' => '添加盲盒转盘记录失败', 'data' => null];
}
foreach ($toarray as $gift_user_id){
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'],$room['blind_box_turntable_periods'],$room_id,$box_turntable_log);
if($reslut_draw_gift_data['code'] != 1){
db::rollback();
return ['code' => 0, 'msg' => $reslut_draw_gift_data['msg'], 'data' => null];
}
$reslut_draw_gift[] = $reslut_draw_gift_data['data'];
}
}
$reslut_gift = [];
$reslut_data = [];
foreach ($reslut_draw_gift as $key => $value) {
$gift_user_id = $value['gift_user_id'];
$gift_id = $value['gift_id'];
// 以 gift_user_id 和 gift_id 作为键进行分组
$group_key = $gift_user_id . '_' . $gift_id;
if (!isset($reslut_gift[$group_key])) {
$reslut_gift[$group_key] = [
'gift_user_id' => $gift_user_id,
'gift_id' => $gift_id,
'count' => 1,
'gift_price' => $value['gift_price']
];
} else {
$reslut_gift[$group_key]['count']++;
}
if (!isset($reslut_data[$gift_id])) {
$reslut_data[$gift_id] = [
'gift_id' => $gift_id,
'count' => 1
];
}else {
$reslut_data[$gift_id]['count']++;
}
}
$reslut_gift = array_values($reslut_gift);
foreach ($reslut_gift as $key => $value) {
$ret = db::name('vs_blind_box_turntable_results_log')->insert([
'tid' => $box_turntable_log,
'gift_user_id' => $value['gift_user_id'],
'gift_id' => $value['gift_id'],
'count' => $value['count'],
'gift_price' => $value['gift_price'],
'all_gift_price' => $value['gift_price'] * $value['count'],
'createtime' => time()
]);
if (!$ret) {
db::rollback();
return ['code' => 0, 'msg' => '添加盲盒转盘结果记录失败', 'data' => null];
}
}
db::commit();
} catch(\Exception $e) {
db::rollback();
return V(0,$e->getMessage());
} }
//巡乐会 //巡乐会
$xlh_box = db::name('vs_gift_bag')->where('id',13)->find(); $xlh_box = db::name('vs_gift_bag')->where('id',13)->find();
@@ -324,8 +343,6 @@ class BlindBoxTurntableGift extends Model
return ['code' => 0, 'msg' => '开奖数据不存在','data' => null]; return ['code' => 0, 'msg' => '开奖数据不存在','data' => null];
} }
//获取盲盒配置 //获取盲盒配置
// $bag_data = db::name("vs_gift_bag")->field('id,name,ext,periods')->where('id',$blind_box_turntable['gift_bag_id'])->find();
// $ext = json_decode($bag_data['ext'],true);
foreach ($blind_box_turntable_log as $key => $value) { foreach ($blind_box_turntable_log as $key => $value) {
$give_gift_ext['gift_id'] = $value['gift_id']; $give_gift_ext['gift_id'] = $value['gift_id'];
$give_gift_ext['count'] = $value['count']; $give_gift_ext['count'] = $value['count'];
@@ -474,149 +491,160 @@ class BlindBoxTurntableGift extends Model
return ['code' => 0, 'msg' => '未开始', 'data' => null]; return ['code' => 0, 'msg' => '未开始', 'data' => null];
} }
$is_zhong_jiang = 0; $is_zhong_jiang = 0;
for($i = 0; $i < $num; $i++){ db::startTrans();
//随机获取一个礼物 try{
$where = [ for($i = 0; $i < $num; $i++){
'a.gift_bag_id' => $gift_bag_id, //随机获取一个礼物
'a.quantity' => ['>',0], $where = [
'b.remaining_number' => ['>',0], 'a.gift_bag_id' => $gift_bag_id,
'b.room_id' => $room_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') $gift_bag_details = db::name("vs_gift_bag_detail")
->join('vs_room_pan b','b.gift_bag_detail_id = a.id','left') ->field('a.id,a.quantity,b.remaining_number,a.weight,a.foreign_id')
->where($where) ->alias('a')
->select(); ->join('vs_room_pan b','b.gift_bag_detail_id = a.id','left')
if (empty($gift_bag_details)) { ->where($where)
return ['code' => 0, 'msg' => '当前盲盒无可用礼物', 'data' => []]; ->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; $total_quantity = db::name("vs_gift_bag_detail")->where(['gift_bag_id' => $gift_bag_id])->sum('quantity');
foreach ($gift_bag_details as $gift) { // 实现加权随机算法:剩余数量越多,被抽中的概率越大
$total_remaining += $gift['remaining_number']; $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); $total_draw_times = $total_quantity - $total_remaining;
$current_sum = 0;
$gift_bag_detail = null; $rand_value = mt_rand(1, $total_remaining);
foreach ($gift_bag_details as $gift) { $current_sum = 0;
if($gift['remaining_number'] <= 0){ $gift_bag_detail = null;
continue; foreach ($gift_bag_details as $gift) {
} if($gift['remaining_number'] <= 0){
if($total_draw_times < $gift['weight']){ continue;
continue; }
} if($total_draw_times < $gift['weight']){
$current_sum += $gift['remaining_number']; continue;
if ($rand_value <= $current_sum) { }
$gift_bag_detail = $gift; $current_sum += $gift['remaining_number'];
break; 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(); if($gift_bag_detail){
//抽中礼物落包 //获取开出礼物的信息
$res = model('UserGiftPack')->change_user_gift_pack($user_id,$gift_bag_detail['foreign_id'],1,model('UserGiftPack')::XLH_DRAW_GIFT_GET,$bag_data['name']."抽奖所得"); $gift = db::name("vs_gift")->where(['gid'=>$gift_bag_detail['foreign_id']])->find();
if ($res['code'] != 1) { //抽中礼物落包
return ['code' => 0, 'msg' => $res['msg'], 'data' => null]; $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) {
//处理抽中礼物命中主奖品逻辑 db::rollback();
if($gift_bag_detail['foreign_id'] == $ext['locking_condition']['selected_gift_id']){ return ['code' => 0, 'msg' => $res['msg'], 'data' => null];
//中奖 }
$pan_xlh_num = $pan_xlh['num']+1; //处理抽中礼物命中主奖品逻辑
if($pan_xlh_num <= 1){ if($gift_bag_detail['foreign_id'] == $ext['locking_condition']['selected_gift_id']){
$end_time = time() + $ext['locking_time']['tow_no_locking_time'] * 60; //中奖
}else{ $pan_xlh_num = $pan_xlh['num']+1;
$end_time = time() + ($ext['locking_time']['tow_no_locking_time']-$ext['locking_time']['next_time']) * 60; if($pan_xlh_num <= 1){
} $end_time = time() + $ext['locking_time']['tow_no_locking_time'] * 60;
db::name('vs_room_pan_xlh')->where('id',$pan_xlh['id'])->update([ }else{
'user_id' => $user_id, $end_time = time() + ($ext['locking_time']['tow_no_locking_time']-$ext['locking_time']['next_time']) * 60;
'pay_price' =>$ext['xlh_box_price'], }
'locking_gift_id' =>$gift_bag_detail['foreign_id'], db::name('vs_room_pan_xlh')->where('id',$pan_xlh['id'])->update([
'num' => $pan_xlh_num, 'user_id' => $user_id,
'end_time' => $end_time, 'pay_price' =>$ext['xlh_box_price'],
'updatetime' => time() 'locking_gift_id' =>$gift_bag_detail['foreign_id'],
]); 'num' => $pan_xlh_num,
db::name('vs_room_pan_xlh_log')->insertGetId([ 'end_time' => $end_time,
'xlh_id' => $pan_xlh['id'], 'updatetime' => time()
'user_id' => $user_id, ]);
'num' => $pan_xlh_num, db::name('vs_room_pan_xlh_log')->insertGetId([
'locking_end_time' => $end_time, 'xlh_id' => $pan_xlh['id'],
'createtime' => time() 'user_id' => $user_id,
]); 'num' => $pan_xlh_num,
$is_zhong_jiang = 1; 'locking_end_time' => $end_time,
} 'createtime' => time()
//减去盲盒包礼物数量 ]);
$ret = db::name("vs_room_pan")->where(['room_id'=>$room_id,'gift_bag_detail_id'=>$gift_bag_detail['id']])->setDec('remaining_number',1); $is_zhong_jiang = 1;
if(!$ret){ }
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);
//判断剩余数量是否为0 为0重置进入下一期 if(!$ret){
$gift_bag_num = db::name("vs_room_pan")->where(['room_id'=>$room_id,'gift_bag_id'=>$gift_bag_id])->sum('remaining_number'); db::rollback();
if($gift_bag_num <= 0){ return ['code' => 0, 'msg' => '失败.', 'data' => []];
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)')]); //判断剩余数量是否为0 为0重置进入下一期
} $gift_bag_num = db::name("vs_room_pan")->where(['room_id'=>$room_id,'gift_bag_id'=>$gift_bag_id])->sum('remaining_number');
}else{ if($gift_bag_num <= 0){
return ['code' => 0, 'msg' => '失败!', 'data' => []]; 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)')]);
$result_data[] = [ }
'user_id' => $user_id, }else{
'gift_id'=>$gift_bag_detail['foreign_id'], db::rollback();
'gift_price'=>$gift['gift_price'], return ['code' => 0, 'msg' => '失败!', 'data' => []];
'is_public_screen'=>$gift['is_public_screen'], }
]; $result_data[] = [
} 'user_id' => $user_id,
$reslut_data = []; 'gift_id'=>$gift_bag_detail['foreign_id'],
foreach ($result_data as $key => $value) { 'gift_price'=>$gift['gift_price'],
$gift_id = $value['gift_id']; 'is_public_screen'=>$gift['is_public_screen'],
if (!isset($reslut_data[$gift_id])) {
$reslut_data[$gift_id] = [
'gift_id' => $gift_id,
'gift_price'=>$value['gift_price'],
'count' => 1
]; ];
}else {
$reslut_data[$gift_id]['count']++;
} }
} $reslut_data = [];
foreach ($reslut_data as $key => $value) { foreach ($result_data as $key => $value) {
//处理礼包发放记录表 $gift_id = $value['gift_id'];
$data = []; if (!isset($reslut_data[$gift_id])) {
$data['user_id'] = $user_id; $reslut_data[$gift_id] = [
$data['parent_id'] = $pan_xlh['id']; 'gift_id' => $gift_id,
$data['gift_bag_id'] = $gift_bag_id; 'gift_price'=>$value['gift_price'],
$data['gift_id'] = $value['gift_id']; 'count' => 1
$data['periods'] = $room['blind_box_turntable_periods']; ];
$data['room_id'] = $room_id; }else {
$data['num'] = $value['count']; $reslut_data[$gift_id]['count']++;
$data['gift_price'] = $value['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' => []];
} }
foreach ($reslut_data as $key => $value) {
//处理礼包发放记录表
$data = [];
$data['user_id'] = $user_id;
$data['parent_id'] = $pan_xlh['id'];
$data['gift_bag_id'] = $gift_bag_id;
$data['gift_id'] = $value['gift_id'];
$data['periods'] = $room['blind_box_turntable_periods'];
$data['room_id'] = $room_id;
$data['num'] = $value['count'];
$data['gift_price'] = $value['gift_price'];
$data['bag_price'] = $ext['xlh_box_price'];
$data['createtime'] = time();
$result = db::name("vs_gift_bag_receive_log")->insert($data);
if(!$result){
db::rollback();
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()
]);
db::commit();
} catch(\Exception $e) {
db::rollback();
return V(0,$e->getMessage());
} }
// 添加活动记录
$reslut = Db::name('vs_activities_receive')->insert([
'user_id' => $user_id,
'activities_id' => 6,
'room_id' => $room_id,
'createtime' => time(),
'updatetime' => time()
]);
if($is_zhong_jiang == 1){ if($is_zhong_jiang == 1){
//推送 //推送
$FromUserInfo = db::name('user')->field('nickname,avatar')->where(['id'=>$user_id])->find(); $FromUserInfo = db::name('user')->field('nickname,avatar')->where(['id'=>$user_id])->find();
$room_name = db::name('vs_room')->where(['id'=>$room_id])->value('room_name'); $room_name = db::name('vs_room')->where(['id'=>$room_id])->value('room_name');
$gift_name = db::name('vs_gift')->where(['id'=>$value['gift_id']])->value('gift_name'); $gift_name = db::name('vs_gift')->where(['gid'=>$value['gift_id']])->value('gift_name');
$text = $FromUserInfo['nickname'] . ' 用户在 ' . $room_name.' 房间巡乐会中 ' .$gift_name.'礼物 x ' .$value['count']." 已收入背包"; $text = $FromUserInfo['nickname'] . ' 用户在 ' . $room_name.' 房间巡乐会中 ' .$gift_name.'礼物 x ' .$value['count']." 已收入背包";
$text = [ $text = [
'gift_num' => $pan_xlh_num, 'gift_num' => $pan_xlh_num,