签约房相关

This commit is contained in:
2025-11-26 11:36:08 +08:00
parent acfda2f044
commit 8dbbe1e2b3
7 changed files with 447 additions and 6 deletions

View File

@@ -0,0 +1,68 @@
<?php
namespace app\api\controller;
use app\common\controller\BaseCom;
use think\Db;
class Sign extends BaseCom
{
//签约出价列表
public function sign_coin_list()
{
$user_id = input('user_id', 0);//签约麦 用户id
//获取当前用户的身价
$market_value = db::name('user')->where('id', $user_id)->value('market_value');
$sign_market_value = get_system_config_value('sign_market_value');
//组个列表
$sign_coin_list = [];
$first_value = $market_value + $sign_market_value; // 第一个值是身价加上sign_market_value
for ($i = 0; $i < 8; $i++) {
$sign_coin_list[] = $first_value + $i; // 每个值在第一个值的基础上加i0到7
}
return ['code' => 1, 'msg' => '成功', 'data' => $sign_coin_list];
}
//签约开始
public function start_sign()
{
$room_id = input('room_id', 0);
if ($room_id <= 0) {
return ['code' => 0, 'msg' => '参数错误'];
}
$reslut = model('Sign')->start_sign($this->uid, $room_id);
return V($reslut['code'], $reslut['msg'], $reslut['data']);
}
//签约出价
public function sign_coin()
{
$user_id = input('user_id', 0);
$sign_value = input('sign_value', 0);
$room_id = input('room_id', 0);
$sign_time = input('sign_time', 0);
if ($sign_value <= 0 || $user_id <= 0 || $room_id <= 0) {
return ['code' => 0, 'msg' => '参数错误'];
}
$reslut = model('Sign')->sign_coin($this->uid, $room_id, $user_id, $sign_value,$sign_time);
return V($reslut['code'], $reslut['msg'], $reslut['data']);
}
//签约结束
public function end_sign()
{
$sign_time = input('sign_time', 0);
$room_id = input('room_id', 0);
$user_id = input('user_id', 0);
if ($sign_time <= 0 || $room_id <= 0) {
return ['code' => 0, 'msg' => '参数错误'];
}
$reslut = model('Sign')->end_sign($this->uid, $room_id, $sign_time,$user_id);
return V($reslut['code'], $reslut['msg'], $reslut['data']);
}
}

View File

@@ -136,6 +136,14 @@ class Chat extends Model
// CP进入房间触发特效 // CP进入房间触发特效
// CPRoomEffect = 1080, // CPRoomEffect = 1080,
//签约房推送信息
//开始签约
// SignRoomStart = 1090,
//签约房签约出价最高用户
// SignRoomSignUser = 1091,
//签约房间结束
// SignRoomEnd = 1092,

View File

@@ -908,6 +908,7 @@ class GiveGift extends Model
// 1.系统调节 2.充值 3.提现 4.金币转增(送出) 5.每日任务奖励 6.充值返利 7.购买装扮 // 1.系统调节 2.充值 3.提现 4.金币转增(送出) 5.每日任务奖励 6.充值返利 7.购买装扮
// 8.礼盒奖励 9.房间补贴 10.购买礼物 11.收礼增加收益 12.工会补贴 13.转赠金币(接收) 14.收益兑换 // 8.礼盒奖励 9.房间补贴 10.购买礼物 11.收礼增加收益 12.工会补贴 13.转赠金币(接收) 14.收益兑换
// 15.首充 16.天降好礼充值 17.退出工会扣款 18.房主收益 19.主持人收益 20.抢头条 21.公会长收益22.提现驳回或提现失败返还23.财富等级奖励金币领取24.删除关系扣金币, // 15.首充 16.天降好礼充值 17.退出工会扣款 18.房主收益 19.主持人收益 20.抢头条 21.公会长收益22.提现驳回或提现失败返还23.财富等级奖励金币领取24.删除关系扣金币,
//50-签约,51-签约失败退回,52-首次被签约收入
if(in_array($change_type,[1,2,3,4,5,6,7,8,12,13,14,15,16,17,20])){ if(in_array($change_type,[1,2,3,4,5,6,7,8,12,13,14,15,16,17,20])){
$room_ids = 0; $room_ids = 0;
}else{ }else{
@@ -932,9 +933,9 @@ class GiveGift extends Model
//根据类型判断是操作金币还是钻石得增加或减少 //根据类型判断是操作金币还是钻石得增加或减少
if($money_type == 1){//1金币 if($money_type == 1){//1金币
//增加用户金币类型 //增加用户金币类型
$in_types = [2,5,6,8,13,14,15,16]; $in_types = [2,5,6,8,13,14,15,16,51];
//减少用户金币类型 //减少用户金币类型
$out_types = [4,7,10,17,20]; $out_types = [4,7,10,17,20,50];
if(in_array($change_type,$in_types)){ if(in_array($change_type,$in_types)){
//增加用户金币 //增加用户金币
$res1 = Db::name('user_wallet')->where(['user_id'=>$user_id])->setInc('coin',$money); $res1 = Db::name('user_wallet')->where(['user_id'=>$user_id])->setInc('coin',$money);
@@ -950,7 +951,7 @@ class GiveGift extends Model
} }
}elseif ($money_type == 2){//2钻石 }elseif ($money_type == 2){//2钻石
//增加用户钻石类型 //增加用户钻石类型
$in_types = [9,11,12,18,19,21]; $in_types = [9,11,12,18,19,21,52];
//减少用户钻石类型 //减少用户钻石类型
$out_types = [3,14]; $out_types = [3,14];
if(in_array($change_type,$in_types)){ if(in_array($change_type,$in_types)){

View File

@@ -0,0 +1,61 @@
<?php
namespace app\api\model;
use think\Db;
use think\Model;
class MarketValue extends Model
{
/*
* 身价变化
* @param int $user_id 用户id
* @param int $change_value 身价变化值
* @param int $type 0-升值1-系统降身价2-使用降身卡
* * @return array
*/
public function change($user_id,$change_value,$type){
//判断是否为整数
if(!is_int($change_value)){
return ['code' => 0, 'msg' => '参数错误'];
}
$before = db::name('user')->where('id',$user_id)->value('market_value');
if($type == 0){
$result = db::name('user')->where('id',$user_id)->setInc('market_value',$change_value);
if($result){
//记录一条日志
db::name('vs_user_market_value_log')->insert([
'user_id' => $user_id,
'before' => $before,
'change_value' => $change_value,
'afterwards' => $before + $change_value,
'type' => $type,
'createtime' => time()
]);
}
}else{
//降身价
$change = $before-$change_value;
if($change <= 1){
$afterwards = 1;
$result = db::name('user')->where('id',$user_id)->update(['market_value' => 1]);
}else{
$afterwards = $change;
$result = db::name('user')->where('id',$user_id)->setDec('market_value',$change_value);
}
if($result){
//记录一条日志
db::name('vs_user_market_value_log')->insert([
'user_id' => $user_id,
'before' => $before,
'change_value' => $change_value,
'afterwards' => $afterwards,
'type' => $type,
'createtime' => time()
]);
}
}
return ['code' => 1, 'msg' => '成功'];
}
}

View File

@@ -0,0 +1,291 @@
<?php
namespace app\api\model;
use think\Db;
use think\Model;
class Sign extends Model
{
/*
* 开始签约
* @param int $user_id 用户id
* @param int $room_id 房间id
* @param int $sign_user_id 签约麦的用户id
*/
public function start_sign($user_id,$room_id){
//权限判断主持及以上才可操作
$owner = db::name('vs_room')->where(['id' => $room_id, 'user_id' => $user_id])->field('id')->find();
$host = db::name('vs_room_host')->where(['room_id' => $room_id, 'user_id' => $user_id,'delete_time' => null])->find();
if(!$owner && !$host){
return ['code' => 0, 'msg' => '没有权限操作', 'data' => null];
}
//修改房间状态
$sign_time = db::name('vs_room')->where('id',$room_id)->value('sign_time') + 1;
$result = db::name('vs_room')->where('id',$room_id)->update([
'sign_type' => 1,
'sign_time' => $sign_time,
'updatetime' => time()
]);
if($result){
//给前端推送数据
$text['text'] = '开始签约';
$text['sign_time'] = $sign_time;
model('api/Chat')->sendMsg(1090,$room_id,$text);
return ['code' => 1, 'msg' => '成功','data' => $sign_time];
}else{
return ['code' => 0, 'msg' => '网络错误,请重试','data' => null];
}
}
/*
* 签约出价
* @param int $user_id 用户id
* @param int $room_id 房间id
* @param int $sign_user_id 签约麦的用户id
* @param int $sign_value 出价
* @param int $sign_time 签约场次
* @return array
*/
public function sign_coin($user_id,$room_id,$sign_user_id,$sign_value,$sign_time){
//查询用户金币
$user_coin = db::name('user_wallet')->where('user_id',$user_id)->value('coin');
if($user_coin < $sign_value){
return ['code' => 0, 'msg' => '金币不足','data' => null];
}
//开启事务
db::startTrans();
//扣除用户金币并记录日志
$wallet_update = model('api/GiveGift') -> change_user_cion_or_earnings_log($user_id,$sign_value,$room_id,1,50,'用户签约关系');
if(!$wallet_update){
Db::rollback();
return ['code' => 0, 'msg' => '扣除用户金币失败', 'data' => null];
}
//用户财富等级更新
$user_level = model('Level')->user_level_data_update($user_id,$sign_value,1,$room_id);
if(!$user_level){
Db::rollback();
return ['code' => 0, 'msg' => '用户等级更新失败', 'data' => null];
}
//记录签约出价
$data = [
'user_id' => $user_id,
'room_id' => $room_id,
'sign_time' => $sign_time,
'sign_user_id' => $sign_user_id,
'sign_value' => $sign_value,
'createtime' => time(),
];
$result = db::name('vs_user_sign_auction')->insert($data);
if(!$result){
db::rollback();
return ['code' => 0, 'msg' => '网络错误,请重试!','data' => null];
}
//记录房间流水及明细
//收礼记录行为日志
$give_gift = model('api/GiveGift') -> change_user_give_gift_log($user_id,0,$sign_value,0,0,2,1,$room_id,0);
if(!$give_gift){
Db::rollback();
return ['code' => 0, 'msg' => '出价失败', 'data' => null];
}
//增加房间火热值hot_value
$gift_totalaa = $sign_value * get_system_config_value('coin_charm_exp');
db::name('vs_room')->where(['id' => $room_id])->inc('hot_value', $gift_totalaa)->inc('today_hot_value', $gift_totalaa)->update();
//获取出价最高用户
$sign_user = db::name('vs_user_sign_auction')->where(['room_id' => $room_id,'sign_time' => $sign_time,'type' => 0])->order('sign_value desc')->field('user_id,sign_value')->find();
//其他的出价退回到用户的钱包
$refund = db::name('vs_user_sign_auction')->where(['room_id' => $room_id,'sign_time' => $sign_time,'type' => 0])->select();
if($refund){
foreach ($refund as $k => $v){
if($v['id'] != $sign_user['id']){
//给用户退回签约金额记录行为日志
$result2[$k] = model('api/GiveGift') -> change_user_cion_or_earnings_log($v['user_id'],$v['sign_value'],$room_id,1,51,'签约失败退款');
if(!$result2[$k]){
db::rollback();
return ['code' => 0, 'msg' => '网络错误,请重试,', 'data' => null];
}
$result3[$k] = db::name('vs_user_sign_auction')->where('id',$v['id'])->update(['type' => 2,'refundtime' => time()]);
if(!$result3[$k]){
db::rollback();
return ['code' => 0, 'msg' => '网络错误,请重试。', 'data' => null];
}
}
}
}
//提交数据
db::commit();
//给前端推送数据
$FromUserInfo = db::name('user')->where('id',$sign_user['user_id'])->field('id as user_id,nickname,avatar,sex')->find();
$FromUserInfo['icon'][0] = model('api/UserData')->user_wealth_icon($sign_user['user_id']);//财富图标
$FromUserInfo['icon'][1] = model('api/UserData')->user_charm_icon($sign_user['user_id']);//魅力图标
//判断是否是歌手 如果是 返回等级图标
$isSinnger = db::name('vs_singer')->where(['user_id' => $sign_user['user_id'],'status' => 1])->value('level');
if($isSinnger){
$FromUserInfo['icon'][2] = db::name('vs_singer_level')->where(['level' => $isSinnger,'deletetime' => 0])->value('image');//等级图标
}
$text['text'] = '签约出价最高用户';
$text['FromUserInfo'] = $FromUserInfo;
$text['sign_value'] = $sign_user['sign_value'];
$text['sign_time'] = $sign_time;
model('api/Chat')->sendMsg(1091,$room_id,$text);
return ['code' => 1, 'msg' => '成功','data' => null];
}
/*
* 签约结束
* @param int $user_id 用户id
* @param int $room_id 房间id
* @param int $sign_time 签约场次
* @param int $sign_user_id 签约麦的用户id
*/
public function end_sign($user_id,$room_id,$sign_time,$sign_user_id){
//权限判断主持及以上才可操作
$owner = db::name('vs_room')->where(['id' => $room_id, 'user_id' => $user_id])->field('id')->find();
$host = db::name('vs_room_host')->where(['room_id' => $room_id, 'user_id' => $user_id,'delete_time' => null])->find();
if(!$owner && !$host){
return ['code' => 0, 'msg' => '没有权限操作', 'data' => null];
}
//根据场次判断是否结束
$sign = db::name('vs_user_sign_auction')->where(['room_id' => $room_id,'sign_time' => $sign_time])->select();
if($sign){
foreach ($sign as $k => $v){
if($v['type'] == 1){
return ['code' => 0, 'msg' => '该场次签约已结束', 'data' => null];
}
}
}
//查询签约用户的身份 是否是第一次被签 是否当前有签
$is_first_sign = db::name('vs_user_sign')->where('sign_user_id',$sign_user_id)->count();
$before_sign_user = null;
if($is_first_sign < 1){
//第一次被签平台抽成
$sign_app_ratio = get_system_config_value('first_sign_app_ratio');
$sign_user_type = 0;
}else{
//不是第一次被签平台抽成
$sign_app_ratio = get_system_config_value('sign_app_ratio');
//查找该用户是否在约
$sign_user_type = 1;
$is_sign = db::name('vs_user_sign')->where(['sign_user_id' => $sign_user_id])->select();
if($is_sign){
foreach ($is_sign as $k => $v){
if($v['end_time'] >= time()){
$sign_user_type = 2;
$before_sign_user = $v['user_id'];
}
}
}
}
//获取签约出价最高的
$max_sign_user = db::name('vs_user_sign_auction')->where(['room_id' => $room_id,'sign_time' => $sign_time])->order('sign_value desc')->find();
//开启事务
db::startTrans();
//修改他的状态
$result = db::name('vs_user_sign_auction')->where(['id' => $max_sign_user['id']])->update(['type' => 1,'signtime' => time()]);
//给fa_vs_user_sign 添加信息
$data = [
'parent_user_id' => $max_sign_user['user_id'],
'sign_user_id' => $max_sign_user['sign_user_id'],
'sign_user_type' => $sign_user_type,
'sign_times' => get_system_config_value('sign_times')*24*60*60,
'end_time' => time() + get_system_config_value('sign_times')*24*60*60,
'createtime' => time(),
];
$result1 = db::name('vs_user_sign')->insert($data);
if(!$result || !$result1){
db::rollback();
return ['code' => 0, 'msg' => '网络错误,请重试', 'data' => null];
}
//其他的出价退回到用户的钱包 这个是为了防止上面并发产生的没退款用户
$refund = db::name('vs_user_sign_auction')->where(['room_id' => $room_id,'sign_time' => $sign_time,'type' => 0])->select();
if($refund){
foreach ($refund as $k => $v){
if($v['id'] != $max_sign_user['id']){
//给用户退回签约金额记录行为日志
$result2[$k] = model('api/GiveGift') -> change_user_cion_or_earnings_log($v['user_id'],$v['sign_value'],$room_id,1,51,'签约失败退款');
if(!$result2[$k]){
db::rollback();
return ['code' => 0, 'msg' => '网络错误,请重试', 'data' => null];
}
$result3[$k] = db::name('vs_user_sign_auction')->where('id',$v['id'])->update(['type' => 2,'refundtime' => time()]);
if(!$result3[$k]){
db::rollback();
return ['code' => 0, 'msg' => '网络错误,请重试', 'data' => null];
}
}
}
}
//根据被签约的用户类型计算给响应用户的金额
//减去平台抽成 剩余的给相应的人
$sign_user_cion = $max_sign_user['sign_value'] * (100 - $sign_app_ratio) / 100;//金币数
//计算收益
$shouyizs = coin_earning($sign_user_cion,100 - $sign_app_ratio);
if($sign_user_type == 0){
//首次签约 给被签约的人
$result4 = model('api/GiveGift') -> change_user_cion_or_earnings_log($max_sign_user['sign_user_id'],$shouyizs,$room_id,2,52,'被首次签约成功收入');
if(!$result4){
db::rollback();
return ['code' => 0, 'msg' => '网络错误,请重试', 'data' => null];
}
}elseif ($sign_user_type == 1){
//签过 给被签约的人分七天给他
// 数据插入 循环插入7条数据 day 取值是今天开始连续七天 的每一天的值 到天
for ($i = 0; $i < 7; $i++){
$data = [
'user_id' => $max_sign_user['sign_user_id'],
'value' => round($shouyizs/7, 4),
'day' => date('Y-m-d', strtotime("+$i days")), // 从今天开始连续七天的日期
'createtime' => time()
];
// 插入数据库
$result[$i] = db::name('vs_user_sign_task')->insert($data);
if(!$result[$i]){
db::rollback();
return ['code' => 0, 'msg' => '网络错误,请重试', 'data' => null];
}
}
}elseif ($sign_user_type == 2){
//签过没过期 给上任签约者
$result4 = model('api/GiveGift') -> change_user_cion_or_earnings_log($before_sign_user,$shouyizs,$room_id,2,52,'被首次签约成功收入');
if(!$result4){
db::rollback();
return ['code' => 0, 'msg' => '网络错误,请重试', 'data' => null];
}
}
db::commit();
//给前端推送
$FromUserInfo = db::name('user')->where('id',$max_sign_user['user_id'])->field('id as user_id,nickname,avatar,sex')->find();
$FromUserInfo['icon'][0] = model('api/UserData')->user_wealth_icon($max_sign_user['user_id']);//财富图标
$FromUserInfo['icon'][1] = model('api/UserData')->user_charm_icon($max_sign_user['user_id']);//魅力图标
//判断是否是歌手 如果是 返回等级图标
$isSinnger = db::name('vs_singer')->where(['user_id' => $max_sign_user['user_id'],'status' => 1])->value('level');
if($isSinnger){
$FromUserInfo['icon'][2] = db::name('vs_singer_level')->where(['level' => $isSinnger,'deletetime' => 0])->value('image');//等级图标
}
$ToUserInfo = db::name('user')->where('id',$max_sign_user['sign_user_id'])->field('id as user_id,nickname,avatar,sex')->find();
$ToUserInfo['icon'][0] = model('api/UserData')->user_wealth_icon($max_sign_user['sign_user_id']);//财富图标
$ToUserInfo['icon'][1] = model('api/UserData')->user_charm_icon($max_sign_user['sign_user_id']);//魅力图标
//判断是否是歌手 如果是 返回等级图标
$isSinnger = db::name('vs_singer')->where(['user_id' => $max_sign_user['sign_user_id'],'status' => 1])->value('level');
if($isSinnger){
$ToUserInfo['icon'][2] = db::name('vs_singer_level')->where(['level' => $isSinnger,'deletetime' => 0])->value('image');//等级图标
}
$text['text'] = '签约出价最高用户';
$text['FromUserInfo'] = $FromUserInfo;
$text['ToUserInfo'] = $ToUserInfo;
$text['sign_value'] = $max_sign_user['sign_value'];
model('api/Chat')->sendMsg(1092,$room_id,$text);
return ['code' => 1, 'msg' => '操作成功', 'data' => null];
}
}

View File

@@ -51,15 +51,16 @@ class UserWallet extends Model
// 8.礼盒奖励 9.房间补贴 10.购买礼物 11.收礼增加收益 12.工会补贴 13.转赠金币(接收) 14.收益兑换 // 8.礼盒奖励 9.房间补贴 10.购买礼物 11.收礼增加收益 12.工会补贴 13.转赠金币(接收) 14.收益兑换
// 15.首充 16.天降好礼充值 17.退出工会扣款 18.房主收益 19.主持人收益20.发布头条扣除余额,21.公会长收益,22.提现驳回或提现失败返还,23.财富等级奖励金币领取,24.删除关系扣金币 // 15.首充 16.天降好礼充值 17.退出工会扣款 18.房主收益 19.主持人收益20.发布头条扣除余额,21.公会长收益,22.提现驳回或提现失败返还,23.财富等级奖励金币领取,24.删除关系扣金币
//27.小时榜获得28-新人充值好礼,32-发红包金币29-发红包钻石30-抢红包金币31-抢红包(钻石) 33-红包剩余退回金币34-红包剩余退回(钻石) //27.小时榜获得28-新人充值好礼,32-发红包金币29-发红包钻石30-抢红包金币31-抢红包(钻石) 33-红包剩余退回金币34-红包剩余退回(钻石)
//50-签约 51-签约失败退回,52-首次被签约收入
if($gift_type == 1){ //1金币2收益钻石 if($gift_type == 1){ //1金币2收益钻石
if($in_out_type == 1){//1收入 if($in_out_type == 1){//1收入
$in_out_types = [2,5,6,8,13,14,15,16,22,23,26,27,30,28,33]; $in_out_types = [2,5,6,8,13,14,15,16,22,23,26,27,30,28,33,51];
}elseif($in_out_type == 2){//2支出 }elseif($in_out_type == 2){//2支出
$in_out_types = [4,7,10,17,20,24,25,32]; $in_out_types = [4,7,10,17,20,24,25,32,50];
} }
}elseif($gift_type == 2){ //1金币2收益钻石 }elseif($gift_type == 2){ //1金币2收益钻石
if($in_out_type == 1){//1收入 if($in_out_type == 1){//1收入
$in_out_types = [6,9,11,12,18,19,21,22,31,28,34]; $in_out_types = [6,9,11,12,18,19,21,22,31,28,34,52];
}elseif($in_out_type == 2){//2支出 }elseif($in_out_type == 2){//2支出
$in_out_types = [3,14,29]; $in_out_types = [3,14,29];
} }

View File

@@ -92,6 +92,13 @@ class UserWallet extends Model
const RED_PACKET_LEFT_DIAMOND = 34; const RED_PACKET_LEFT_DIAMOND = 34;
//爵位购买赠送金币(金币) //爵位购买赠送金币(金币)
const NOBILITY_PURCHASE_COIN = 35; const NOBILITY_PURCHASE_COIN = 35;
//签约支出
const SIGN = 50;
//签约失败退回
const SIGN_FAILURE = 51;
//首次被签约收入
const FIRST_SIGN_INCOME = 52;
//金币支出类型数组 //金币支出类型数组
public $coin_consumption_type_array = [ public $coin_consumption_type_array = [
@@ -102,6 +109,7 @@ class UserWallet extends Model
self::HEADLINE_REWARD, self::HEADLINE_REWARD,
self::TRANSFER_COIN, self::TRANSFER_COIN,
self::RED_PACKET_COIN, self::RED_PACKET_COIN,
self::SIGN,
]; ];
//钻石支出类型数组 //钻石支出类型数组
public $diamond_consumption_type_array = [ public $diamond_consumption_type_array = [
@@ -165,6 +173,9 @@ class UserWallet extends Model
self::RED_PACKET_LEFT_COIN => '红包剩余退回(金币)', self::RED_PACKET_LEFT_COIN => '红包剩余退回(金币)',
self::RED_PACKET_LEFT_DIAMOND => '红包剩余退回(钻石)', self::RED_PACKET_LEFT_DIAMOND => '红包剩余退回(钻石)',
self::NOBILITY_PURCHASE_COIN => '爵位购买赠送(金币)', self::NOBILITY_PURCHASE_COIN => '爵位购买赠送(金币)',
self::SIGN => '签约支出',
self::SIGN_FAILURE => '签约失败退回',
self::FIRST_SIGN_INCOME => '首次被签约收入'
]; ];
if($type){ if($type){
return $status[$type] ?? ''; return $status[$type] ?? '';