'立刻', 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 + 1200; // 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' => $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; $text = [ 'redpacketInfo' => $data, 'text' => '' ]; model('api/Chat')->sendMsg(1060,$data['room_id'],$text); 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; } }