更新
This commit is contained in:
171
application/common/model/Redpacket.php
Normal file
171
application/common/model/Redpacket.php
Normal file
@@ -0,0 +1,171 @@
|
||||
<?php
|
||||
|
||||
namespace app\common\model;
|
||||
|
||||
use app\common\controller\Push;
|
||||
use think\Model;
|
||||
use think\Db;
|
||||
|
||||
class Redpacket extends Model
|
||||
{
|
||||
// 红包状态
|
||||
const STATUS_PENDING = 0; // 未开始
|
||||
const STATUS_ACTIVE = 1; // 进行中
|
||||
const STATUS_FINISHED = 2; // 已结束
|
||||
const STATUS_REFUNDED = 3; // 已退回
|
||||
|
||||
// 红包类型
|
||||
const TYPE_NORMAL = 1; // 普通红包
|
||||
const TYPE_PASSWORD = 2; // 口令红包
|
||||
|
||||
// 币种类型
|
||||
const COIN_GOLD = 1; // 金币
|
||||
const COIN_DIAMOND = 2; // 钻石
|
||||
|
||||
// 倒计时选项
|
||||
public static $countdownOptions = [
|
||||
0 => '立刻',
|
||||
60 => '1分钟',
|
||||
120 => '2分钟',
|
||||
300 => '5分钟',
|
||||
600 => '10分钟'
|
||||
];
|
||||
|
||||
// 领取条件
|
||||
const CONDITION_NONE = 0;
|
||||
const CONDITION_COLLECT_ROOM = 1;
|
||||
const CONDITION_MIC_USER = 2;
|
||||
|
||||
protected $autoWriteTimestamp = true;
|
||||
protected $createTime = 'createtime';
|
||||
protected $updateTime = 'updatetime';
|
||||
|
||||
/**
|
||||
* 发红包
|
||||
*/
|
||||
public function createRedpacket($data)
|
||||
{
|
||||
// var_dump($data);exit;
|
||||
Db::startTrans();
|
||||
try {
|
||||
// 验证用户余额
|
||||
$wallet = Db::name('user_wallet')->where('user_id', $data['user_id'])->find();
|
||||
|
||||
$coinField = $data['coin_type'] == self::COIN_GOLD ? 'coin' : 'earnings';
|
||||
if ($wallet[$coinField] < $data['total_amount']) {
|
||||
return ['code' => 0, 'msg' => '余额不足', 'data' => null];
|
||||
}
|
||||
|
||||
// 扣除余额
|
||||
$delres = Db::name('user_wallet')
|
||||
->where('user_id', $data['user_id'])
|
||||
->dec($coinField, $data['total_amount'])
|
||||
->update();
|
||||
//记录日志 32-发红包(金币),29-发红包(钻石),30-抢红包(金币),31-抢红包(钻石)
|
||||
//记录用户金币日志
|
||||
$data_log = [
|
||||
'user_id' => $data['user_id'],
|
||||
'change_value' => $data['total_amount'],
|
||||
'room_id' => $data['room_id'],
|
||||
'money_type' => $data['coin_type'],
|
||||
'change_type' => $data['coin_type'] == self::COIN_GOLD ? 32 : 29,
|
||||
'from_id' => $data['room_id'],
|
||||
'remarks' => $data['coin_type'] == self::COIN_GOLD ? '金币(发红包)' : '钻石(发红包)',
|
||||
'createtime' => time()
|
||||
];
|
||||
|
||||
$res = Db::name('vs_user_money_log')->insert($data_log);
|
||||
if(!$res || !$delres){
|
||||
Db::rollback();
|
||||
}
|
||||
// 计算开始时间
|
||||
$startTime = $data['countdown'] > 0 ? (time() + $data['countdown']) : time();
|
||||
//获取配置项 红包没有抢完所展示时间
|
||||
$endTime = $startTime + get_system_config_value('red_packet_time') ?? 120; // 默认2分钟后结束
|
||||
|
||||
// 创建红包
|
||||
$redpacketData = [
|
||||
'user_id' => $data['user_id'],
|
||||
'room_id' => $data['room_id'],
|
||||
'type' => $data['type'],
|
||||
'password' => $data['password'] ?? '',
|
||||
'countdown' => $data['countdown'],
|
||||
'coin_type' => $data['coin_type'],
|
||||
'total_amount' => $data['total_amount'],
|
||||
'total_count' => $data['total_count'],
|
||||
'left_amount' => $data['total_amount'],
|
||||
'left_count' => $data['total_count'],
|
||||
'conditions' => $data['conditions'] ?? '',
|
||||
'status' => $data['countdown'] > 0 ? self::STATUS_PENDING : self::STATUS_ACTIVE,
|
||||
'start_time' => $startTime,
|
||||
'end_time' => $endTime,
|
||||
'createtime' => time(),
|
||||
'remark' => (!empty($data['remark']) && trim($data['remark']) !== '') ? trim($data['remark']) : '大吉大利,红包拿来啦!'
|
||||
];
|
||||
|
||||
$redpacketId = $this->insertGetId($redpacketData);
|
||||
|
||||
// 设置Redis缓存
|
||||
$redis = \think\Cache::store('redis')->handler();
|
||||
$redisKey = "redpacket:{$redpacketId}";
|
||||
$redis->hMSet($redisKey, [
|
||||
'total_amount' => $data['total_amount'],
|
||||
'left_amount' => $data['total_amount'],
|
||||
'total_count' => $data['total_count'],
|
||||
'left_count' => $data['total_count'],
|
||||
'status' => $redpacketData['status'],
|
||||
'start_time' => $startTime,
|
||||
'end_time' => $endTime
|
||||
]);
|
||||
|
||||
// 设置过期时间
|
||||
$redis->expireAt($redisKey, $endTime + 3600); // 结束后保留1小时
|
||||
Db::commit();
|
||||
|
||||
//给前端推送信息
|
||||
$data['nickname'] = Db::name('user')->where('id', $data['user_id'])->value('nickname');
|
||||
$data['avatar'] = Db::name('user')->where('id', $data['user_id'])->value('avatar');
|
||||
$data['redpacket_id'] = $redpacketId;
|
||||
$data['start_time'] = $startTime;//红包开抢时间
|
||||
$data['redpacket_time'] = get_system_config_value('red_packet_time');//展示时间
|
||||
$data['room_name'] = Db::name('vs_room')->where('id', $data['room_id'])->value('room_name');
|
||||
$text = [
|
||||
'redpacketInfo' => $data,
|
||||
'text' => ''
|
||||
];
|
||||
model('api/Chat')->sendMsg(1060,$data['room_id'],$text);
|
||||
$push = new Push(UID, $data['room_id']);
|
||||
$texts = [
|
||||
'room_id' => $data['room_id'],
|
||||
'text' => $data['nickname'].'在'.$data['room_name'].'房间发了一个红包!',
|
||||
'room_name' => $data['room_name'],
|
||||
'nickname' => $data['nickname']
|
||||
];
|
||||
$push->redpacketArrive($texts);
|
||||
|
||||
return ['code' => 1, 'msg' => '发红包成功', 'data' => $redpacketId];
|
||||
|
||||
} catch (\Exception $e) {
|
||||
Db::rollback();
|
||||
return ['code' => 0, 'msg' => $e->getMessage(), 'data' => null];
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取红包信息
|
||||
*/
|
||||
public function getRedpacketInfo($id)
|
||||
{
|
||||
$redpacket = $this->find($id);
|
||||
if (!$redpacket) {
|
||||
return null;
|
||||
}
|
||||
|
||||
$redpacket = $redpacket->toArray();
|
||||
$redpacket['nickname'] = Db::name('user')->where('id', $redpacket['user_id'])->value('nickname');
|
||||
$redpacket['avatar'] = Db::name('user')->where('id', $redpacket['user_id'])->value('avatar');
|
||||
$redpacket['redpacket_id'] = $redpacket['id'];
|
||||
|
||||
return $redpacket;
|
||||
}
|
||||
}
|
||||
12
application/common/model/RedpacketRecord.php
Normal file
12
application/common/model/RedpacketRecord.php
Normal file
@@ -0,0 +1,12 @@
|
||||
<?php
|
||||
|
||||
namespace app\common\model;
|
||||
|
||||
use think\Model;
|
||||
|
||||
class RedpacketRecord extends Model
|
||||
{
|
||||
protected $autoWriteTimestamp = true;
|
||||
protected $createTime = 'createtime';
|
||||
protected $updateTime = false;
|
||||
}
|
||||
Reference in New Issue
Block a user