Files
midi-php/application/common/model/Redpacket.php

145 lines
4.8 KiB
PHP
Raw Normal View History

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)
{
2025-10-11 15:20:49 +08:00
var_dump($data);exit;
2025-10-10 19:15:41 +08:00
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-抢红包(钻石)
//记录用户金币日志
2025-10-11 15:14:10 +08:00
$data_log = [
2025-10-11 14:49:25 +08:00
'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 15:14:10 +08:00
$res = Db::name('vs_user_money_log')->insert($data_log);
2025-10-11 14:49:25 +08:00
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;
}
}