Files
yusheng-php/application/api/model/UserCp.php

314 lines
13 KiB
PHP
Raw Normal View History

2025-08-07 20:21:47 +08:00
<?php
namespace app\api\model;
2025-11-14 14:49:38 +08:00
use think\Db;
2025-08-07 20:21:47 +08:00
use think\Model;
class UserCp extends Model
{
2025-11-14 14:49:38 +08:00
/*
* 检测是否赠送的Cp礼物
* @param $from_user_id 送礼用户ID
* @param $gift_id 礼物ID
* @param $to_user_id 接收用户ID
* @param $room_id 房间ID
2025-11-18 19:09:17 +08:00
* @return int 0-1-等待回应2-已建立Cp空间
2025-11-14 14:49:38 +08:00
*/
2025-11-20 10:37:08 +08:00
public function checkGift($from_user_id, $gift_id, $to_user_id, $room_id, $num)
2025-11-14 14:49:38 +08:00
{
2025-11-18 19:09:17 +08:00
//查询是否已经存在Cp空间
2025-11-14 14:49:38 +08:00
$rees = Db::name('user_cp_zone')->where(['user_id1' => $from_user_id,'user_id2' => $to_user_id,'status' => 1])->find();
if(!$rees){
$rees = Db::name('user_cp_zone')->where(['user_id1' => $to_user_id,'user_id2' => $from_user_id,'status' => 1])->find();
}
if($rees){
2025-11-20 10:37:08 +08:00
$this->addCpLevel($from_user_id, $to_user_id, $room_id, $gift_id, $rees['id'], $num);
2025-11-18 19:09:17 +08:00
return 0;
2025-11-14 14:49:38 +08:00
}
2025-11-18 19:09:17 +08:00
$cp_gift_id = explode(',', get_system_config_value('cp_gift_id'));
if(!in_array($gift_id, $cp_gift_id)){
return 0;
}
//查询收礼人有没有给送礼人送过cp礼物 status0-待回应1-建交成功2-已取消
2025-11-14 14:49:38 +08:00
$res = Db::name('user_cp_find')->where(['from_user_id' => $to_user_id, 'to_user_id' => $from_user_id,'status' => 0])->find();
if($res){
//创建推送信息1回应送礼 并创建Cp空间
$data = [
'from_user_id' => $from_user_id,
'to_user_id' => $to_user_id,
'gift_id' => $gift_id,
'createtime' => time(),
'status' => 1
];
Db::name('user_cp_find')->insert($data);
//修改状态
Db::name('user_cp_find')->where(['id' => $res['id']])->update(['status' => 1]);
2025-11-18 19:09:17 +08:00
//创建Cp空间
2025-11-14 14:49:38 +08:00
$data = [
'user_id1' => $from_user_id,
'user_id2' => $to_user_id,
'createtime' => time(),
'status' => 1,//1-已建立Cp空间2-已取消
'level' => 1,
//经验值
'exp' => 0,
];
2025-11-19 18:15:14 +08:00
$re = Db::name('user_cp_zone')->insertGetId($data);
2025-11-14 14:49:38 +08:00
2025-11-22 15:18:21 +08:00
//添加一个记录
$datas = [
'room_id' => $room_id,
'from_user_id' => $from_user_id,
'to_user_id' => $to_user_id,
'gift_id' => 0,
'num' => 0,
'cp_zone_id' => $re,
'exp' => 0,
'exp_total' => 0,
'remark' => '建立了心动空间,让我们相爱每一天吧!',
'createtime' => time(),
];
Db::name('user_cp_gift_log')->insert($datas);
2025-11-19 15:16:20 +08:00
$rees = Db::name('user_cp_zone')->where(['user_id1' => $from_user_id,'user_id2' => $to_user_id,'status' => 1])->find();
if(!$rees){
$rees = Db::name('user_cp_zone')->where(['user_id1' => $to_user_id,'user_id2' => $from_user_id,'status' => 1])->find();
}
2025-11-19 18:15:14 +08:00
if($rees && $re != $rees['id']){
2025-11-19 15:16:20 +08:00
//修改状态
Db::name('user_cp_zone')->where(['id' => $rees['id']])->update(['status' => 2]);
}
2025-11-22 17:56:15 +08:00
// 给两个用户添加CP装扮
2025-11-21 19:03:01 +08:00
$pendant_ids = Db::name('user_cp_level')->where(['deletetime' => 0])->order('level asc')->value('pendant_id');
$pendant_id = Db::name('vs_decorate_price')->where(['id' => $pendant_ids])->value('did');
2025-11-22 17:56:15 +08:00
if($pendant_id){
$this->assignCpDecoration([$from_user_id, $to_user_id], 11, $pendant_id); // 11为CP装扮类型
2025-11-21 18:32:29 +08:00
}
2025-11-22 17:56:15 +08:00
// 给两个用户添加CP特效
$rights_icon_ids = Db::name('user_cp_level')->where(['deletetime' => 0])->order('level asc')->value('rights_icon_id');
$rights_icon_id = Db::name('vs_decorate_price')->where(['id' => $rights_icon_ids])->value('did');
if($rights_icon_id){
$this->assignCpDecoration([$from_user_id, $to_user_id], 10, $rights_icon_id); // 10为CP特效类型
2025-11-21 16:11:22 +08:00
}
2025-11-22 17:56:15 +08:00
2025-11-14 14:49:38 +08:00
//给前端推送
2025-11-18 19:09:17 +08:00
return 2;
2025-11-14 14:49:38 +08:00
}else{//创建推送信息2表达心动信号
//查询是否有相应的Cp空间
$ress = Db::name('user_cp_find')
->where(['status' => ['in',[0,1]]])
->whereOr(['from_user_id' => $from_user_id])
->whereOr(['to_user_id' => $from_user_id])
->select();
if($ress){
//把状态改为2 status0-待回应1-建交成功2-已取消,
foreach ($ress as $v){
Db::name('user_cp_find')->where(['id' => $v['id']])->update(['status' => 2]);
}
}
$data = [
'from_user_id' => $from_user_id,
'to_user_id' => $to_user_id,
'gift_id' => $gift_id,
'createtime' => time(),
];
Db::name('user_cp_find')->insert($data);
//给前端推送
2025-11-18 19:09:17 +08:00
return 1;
2025-11-14 14:49:38 +08:00
}
}
2025-11-22 17:56:15 +08:00
/*
* 为CP用户分配装扮或特效
* @param array $user_ids 用户ID数组
* @param int $type 装扮类型(10-特效, 11-装扮)
* @param int $did 装扮ID
*/
private function assignCpDecoration($user_ids, $type, $did)
{
// 先检查用户是否已有该装扮,如果有则设为未使用
foreach ($user_ids as $user_id) {
$existing_decoration = Db::name('vs_user_decorate')
->where([
'user_id' => $user_id,
'type' => $type,
'did' => $did,
'is_using' => 1
])
->find();
if ($existing_decoration) {
Db::name('vs_user_decorate')
->where(['id' => $existing_decoration['id']])
->update(['is_using' => 2]);
}
}
// 给用户添加新装扮
$decorate_data = [
'type' => $type,
'did' => $did,
'is_using' => 1,
'end_time' => 0,
'is_perpetual' => 1,
'createtime' => time(),
];
foreach ($user_ids as $user_id) {
$insert_data = array_merge(['user_id' => $user_id], $decorate_data);
Db::name('vs_user_decorate')->insert($insert_data);
}
}
2025-11-14 14:49:38 +08:00
/*
* 送Cp礼物 增加Cp 经验 判断是否升级
* @param $from_user_id 送礼用户ID
* @param $to_user_id 接收用户ID
* @param $gift_id 礼物ID
* @param $room_id 房间ID
* @param $cp_zone_id Cp空间ID
*/
2025-11-20 10:37:08 +08:00
public function addCpLevel($from_user_id, $to_user_id, $room_id, $gift_id, $cp_zone_id, $num)
2025-08-07 20:21:47 +08:00
{
2025-11-14 14:49:38 +08:00
$jinbi_arr = explode(',', get_system_config_value('cp_exp_rate'));
$jinbi = $jinbi_arr[0];
$jinyan = $jinbi_arr[1];
2025-11-20 10:37:08 +08:00
$exp = round(db::name('vs_gift')->where(['gid' => $gift_id])->value('gift_price') * $num / $jinbi * $jinyan, 2);
2025-11-14 14:49:38 +08:00
$yuan_exp = Db::name('user_cp_zone')->where(['id' => $cp_zone_id])->value('exp');
2025-11-21 17:23:50 +08:00
$zone_level = Db::name('user_cp_zone')->where(['id' => $cp_zone_id])->value('level');
2025-11-22 15:18:21 +08:00
$toUserNickname =db::name('user')->where(['id' => $to_user_id])->value('nickname')??'未知用户';
$giftName = db::name('vs_gift')->where(['gid' => $gift_id])->value('gift_name')??'未知礼物';
2025-11-14 14:49:38 +08:00
//添加一个记录
$datas = [
'room_id' => $room_id,
'from_user_id' => $from_user_id,
'to_user_id' => $to_user_id,
'gift_id' => $gift_id,
2025-11-22 14:51:28 +08:00
'num' => $num,
2025-11-14 14:49:38 +08:00
'cp_zone_id' => $cp_zone_id,
'exp' => $exp,
'exp_total' => $yuan_exp + $exp,
2025-11-22 15:18:21 +08:00
'remark' => '送给'.$toUserNickname.$num.'个'.$giftName.',获得'.$exp.'经验值,总经验值增加至'.($yuan_exp + $exp),
2025-11-14 14:49:38 +08:00
'createtime' => time(),
];
Db::name('user_cp_gift_log')->insert($datas);
//判断是否升级
2025-11-21 17:23:50 +08:00
$level = Db::name('user_cp_level')->where(['change_value' => ['<=', $yuan_exp + $exp],'deletetime' => 0])
->order('change_value desc')->field('level,pendant_id')->find();
if($level['level'] != $zone_level){//登记不一致 (升级)
2025-11-14 14:49:38 +08:00
//修改Cp空间等级
2025-11-21 17:23:50 +08:00
$data['level'] = $level['level'];
//给用户修改Cp装扮
if($level['pendant_id']){
2025-11-21 18:35:38 +08:00
//先检查该用户是否已有该装扮
2025-11-21 19:03:01 +08:00
$pendant_id = Db::name('vs_decorate_price')->where(['id' => $level['pendant_id']])->value('did');
2025-11-21 18:35:38 +08:00
foreach ([$from_user_id, $to_user_id] as $user_id) {
$zhuangban = Db::name('vs_user_decorate')
->where([
'user_id' => $user_id,
'type' => 11,
2025-11-21 19:03:01 +08:00
'did' => $pendant_id,
2025-11-21 18:35:38 +08:00
'is_using' => 1
])
->find();
if ($zhuangban) {
// 修改状态为未使用
Db::name('vs_user_decorate')
->where(['id' => $zhuangban['id']])
->update(['is_using' => 2]);
}
}
2025-11-21 17:23:50 +08:00
// 给两个用户添加CP装扮
$decorate_data = [
'type' => 11, // 装扮类型11-cp装扮
2025-11-21 19:03:01 +08:00
'did' => $pendant_id,
2025-11-21 17:23:50 +08:00
'is_using' => 1, // 1-使用中2-未使用
'end_time' => 0, // 0-永久
'is_perpetual' => 1, // 1-永久2-限时
'createtime' => time(),
];
foreach ([$from_user_id, $to_user_id] as $user_id) {
$insert_data = array_merge(['user_id' => $user_id], $decorate_data);
Db::name('vs_user_decorate')->insert($insert_data);
}
2025-11-21 17:54:02 +08:00
}else{//把原有的装扮取消掉
$decorate_data = [
'type' => 11, // 装扮类型11-cp装扮
'is_using' => 2, // 1-使用中2-未使用
'updatetime' => time(),
];
foreach ([$from_user_id, $to_user_id] as $user_id) {
$insert_data = array_merge(['user_id' => $user_id], $decorate_data);
Db::name('vs_user_decorate')->where(['type' => 11])->update($insert_data);
}
2025-11-21 17:23:50 +08:00
}
2025-11-22 15:18:21 +08:00
//添加一个记录
$pendant = db::name('vs_decorate_price')->where('id',$level['pendant_id'])->field('did,day')->find();
$pendant_title = '装扮-'.$pendant['day'].'天-'.db::name('vs_decorate')->where('did',$pendant['did'])->value('title');
$datas = [
'room_id' => $room_id,
'from_user_id' => $from_user_id,
'to_user_id' => $to_user_id,
'gift_id' => 0,
'num' => 0,
'cp_zone_id' => $cp_zone_id,
'exp' => 0,
'exp_total' => 0,
'remark' => '我们等级达到了'.$level['level'].'级,获得奖励'.$pendant_title,
'createtime' => time(),
];
Db::name('user_cp_gift_log')->insert($datas);
2025-11-14 14:49:38 +08:00
}
2025-11-19 14:54:24 +08:00
$data['exp'] = $yuan_exp + $exp;
2025-11-14 14:49:38 +08:00
Db::name('user_cp_zone')->where(['id' => $cp_zone_id])->update($data);
return true;
2025-08-07 20:21:47 +08:00
}
2025-11-14 15:26:04 +08:00
/*
* Cp空间
* @param $user_id 用户ID
*/
2025-11-22 11:12:27 +08:00
public function cpZone($user_id, $page, $page_limit)
2025-11-14 15:26:04 +08:00
{
2025-11-20 15:55:53 +08:00
$res = Db::name('user_cp_zone')->where(['user_id1' => $user_id,'status' => 1])->find();
2025-11-14 15:26:04 +08:00
if(!$res){
2025-11-20 15:55:53 +08:00
$res = Db::name('user_cp_zone')->where(['user_id2' => $user_id,'status' => 1])->find();
2025-11-14 15:26:04 +08:00
}
if($res){
$res['user_info1'] = Db::name('user')->where(['id' => $res['user_id1']])->field('id user_id,nickname,avatar')->find();
$res['user_info2'] = Db::name('user')->where(['id' => $res['user_id2']])->field('id user_id,nickname,avatar')->find();
//升下一级所需经验值
2025-11-19 14:47:19 +08:00
$next_level_exp = Db::name('user_cp_level')->where(['level' => ['>',$res['level']]])->order('level asc')->value('change_value');
2025-11-14 15:26:04 +08:00
$res['next_level_exp'] = $next_level_exp - $res['exp'];
2025-11-22 11:27:22 +08:00
$res['pendant'] = model('api/Decorate')->user_decorate_detail($user_id, 11);//挂件(装扮)
2025-11-14 15:26:04 +08:00
//送礼记录
2025-11-22 15:24:04 +08:00
$res['gift_log'] = Db::name('user_cp_gift_log')->where(['cp_zone_id' => $res['id']])->order('id desc')->page($page,$page_limit)->select();
2025-11-14 15:26:04 +08:00
foreach ($res['gift_log'] as &$v){
2025-11-22 15:18:21 +08:00
if($v['gift_id']){
$v['gift_name'] = Db::name('vs_gift')->where(['gid' => $v['gift_id']])->value('gift_name');
}
2025-11-14 15:26:04 +08:00
$v['from_user_info'] = Db::name('user')->where(['id' => $v['from_user_id']])->field('id user_id,nickname,avatar')->find();
$v['to_user_info'] = Db::name('user')->where(['id' => $v['to_user_id']])->field('id user_id,nickname,avatar')->find();
}
return ['code' => 1, 'msg' => '成功', 'data' => $res ];
}else{
return ['code' => 0, 'msg' => '暂无Cp空间', 'data' => null];
}
}
2025-11-14 15:33:23 +08:00
2025-08-07 20:21:47 +08:00
}