2025-10-10 19:15:41 +08:00
|
|
|
|
<?php
|
|
|
|
|
|
|
|
|
|
|
|
namespace app\common\model;
|
|
|
|
|
|
|
|
|
|
|
|
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)
|
|
|
|
|
|
{
|
|
|
|
|
|
Db::startTrans();
|
2025-10-11 14:54:43 +08:00
|
|
|
|
try {
|
2025-10-10 19:15:41 +08:00
|
|
|
|
// 验证用户余额
|
|
|
|
|
|
$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']) {
|
2025-10-11 15:08:25 +08:00
|
|
|
|
return ['code' => 0, 'msg' => '余额不足', 'data' => null];
|
2025-10-10 19:15:41 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// 扣除余额
|
2025-10-11 14:49:25 +08:00
|
|
|
|
$delres = Db::name('user_wallet')
|
2025-10-10 19:15:41 +08:00
|
|
|
|
->where('user_id', $data['user_id'])
|
|
|
|
|
|
->dec($coinField, $data['total_amount'])
|
|
|
|
|
|
->update();
|
2025-10-11 14:49:25 +08:00
|
|
|
|
//记录日志 32-发红包(金币),29-发红包(钻石),30-抢红包(金币),31-抢红包(钻石)
|
|
|
|
|
|
//记录用户金币日志
|
|
|
|
|
|
$data = [
|
|
|
|
|
|
'user_id' => $data['user_id'],
|
|
|
|
|
|
'change_value' => $data['total_amount'],
|
|
|
|
|
|
'room_id' => $data['room_id'],
|
|
|
|
|
|
'money_type' => $data['coin_type'],
|
|
|
|
|
|
'change_type' => $coinField == self::COIN_GOLD ? 32 : 29,
|
|
|
|
|
|
'from_id' => $data['room_id'],
|
|
|
|
|
|
'remarks' => $coinField == self::COIN_GOLD ? '金币(发红包)' : '钻石(发红包)',
|
|
|
|
|
|
'createtime' => time()
|
|
|
|
|
|
];
|
2025-10-10 19:15:41 +08:00
|
|
|
|
|
2025-10-11 14:49:25 +08:00
|
|
|
|
$res = Db::name('vs_user_money_log')->insert($data);
|
|
|
|
|
|
if(!$res || !$delres){
|
|
|
|
|
|
Db::rollback();
|
|
|
|
|
|
}
|
2025-10-10 19:15:41 +08:00
|
|
|
|
// 计算开始时间
|
|
|
|
|
|
$startTime = $data['countdown'] > 0 ? (time() + $data['countdown']) : time();
|
|
|
|
|
|
$endTime = $startTime + 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()
|
|
|
|
|
|
];
|
|
|
|
|
|
|
|
|
|
|
|
$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();
|
2025-10-11 15:08:25 +08:00
|
|
|
|
return ['code' => 1, 'msg' => '发红包成功', 'data' => $redpacketId];
|
2025-10-10 19:15:41 +08:00
|
|
|
|
|
2025-10-11 14:54:43 +08:00
|
|
|
|
} catch (\Exception $e) {
|
|
|
|
|
|
Db::rollback();
|
2025-10-11 15:08:25 +08:00
|
|
|
|
return ['code' => 0, 'msg' => $e->getMessage(), 'data' => null];
|
2025-10-11 14:54:43 +08:00
|
|
|
|
}
|
2025-10-10 19:15:41 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* 获取红包信息
|
|
|
|
|
|
*/
|
|
|
|
|
|
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');
|
|
|
|
|
|
|
|
|
|
|
|
return $redpacket;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|