LiveController.php 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184
  1. <?php
  2. declare(strict_types=1);
  3. namespace App\Controller\Api\v1;
  4. use App\Controller\AbstractController;
  5. use App\Controller\Business\GiftBusiness;
  6. use App\Master\Framework\Library\Tencent\TencentIm;
  7. use App\Model\Arts\LiveGiftLogModel;
  8. use App\Model\Arts\LiveGiftModel;
  9. use App\Model\Arts\LiveRoomModel;
  10. use App\Model\Arts\UserModel;
  11. use App\Model\Arts\UserWalletModel;
  12. use App\Request\Api\v1\DemoIndexRequest;
  13. use App\Request\Api\v1\Live\GiveGiftsRequest;
  14. use App\Request\Api\v1\Live\LikeRequest;
  15. use App\Service\QueueService;
  16. use App\Utils\AppResult;
  17. use App\Utils\Control\AuthUser;
  18. use App\Utils\LogUtil;
  19. use Hyperf\DbConnection\Db;
  20. use Hyperf\Di\Annotation\Inject;
  21. /**
  22. * Demo
  23. * 示例
  24. */
  25. class LiveController extends AbstractController
  26. {
  27. // 日志模块名称
  28. const LOG_MODULE = 'v1/LiveController';
  29. #[Inject]
  30. protected QueueService $service;
  31. public function index()
  32. {
  33. return AppResult::response200('success',(new LiveGiftLogModel())->getPkTopList());
  34. }
  35. /**
  36. * 直播间观众列表
  37. * @param LikeRequest $request
  38. * @return string
  39. * @throws \Exception
  40. */
  41. public function audience(LikeRequest $request)
  42. {
  43. $params = $request->validated();// 获取校验参数结果
  44. $user = AuthUser::getInstance()->get();
  45. $model = new LiveRoomModel();
  46. $room = $model->getDetailOne((int)$params['room_no']);
  47. if (!$room) {
  48. return AppResult::error('直播间异常');
  49. }
  50. $model = new LiveGiftLogModel();
  51. $list = $model->getTopList($room);
  52. return AppResult::success('success', $list);
  53. }
  54. /**
  55. * 点赞
  56. * @param LikeRequest $request
  57. * @return string
  58. */
  59. public function like(LikeRequest $request)
  60. {
  61. $params = $request->validated();// 获取校验参数结果
  62. $user = AuthUser::getInstance()->get();
  63. $model = new LiveRoomModel();
  64. $room = $model->getDetailOne((int)$params['room_no']);
  65. if (!$room) {
  66. return AppResult::error('直播间异常');
  67. }
  68. // 不可以赠送给自己
  69. if ($user['id'] == $room['user_id']) {
  70. return AppResult::error('不可以给自己点赞');
  71. }
  72. // 加入点赞队列
  73. $this->service->likePush([
  74. 'room_no' => $room['room_no'],
  75. 'session' => $room['session']
  76. ]);
  77. return AppResult::success('success');
  78. }
  79. /**
  80. * 送礼物
  81. * @param GiveGiftsRequest $request
  82. * @return string
  83. */
  84. public function giveGifts(GiveGiftsRequest $request)
  85. {
  86. $params = $request->validated();// 获取校验参数结果
  87. $user = AuthUser::getInstance()->get();
  88. $model = new LiveRoomModel();
  89. $room = $model->getDetailOne((int)$params['room_no']);
  90. if (!$room) {
  91. return AppResult::error('直播间异常');
  92. }
  93. // 不可以赠送给自己
  94. if ($user['id'] == $room['user_id']) {
  95. return AppResult::error('不可以给自己送礼物');
  96. }
  97. // 获取礼物信息
  98. if (!$giftInfo = (new LiveGiftModel())->getDetail(['id' => $params['gift_id']])) {
  99. return AppResult::error('请选择礼物');
  100. }
  101. // 被赠送人信息
  102. if (!$toUserInfo = (new UserModel())->getDetail(['id' => $room['user_id']])) {
  103. return AppResult::error('不存在的用户');
  104. }
  105. // 礼物价值
  106. $giftValue = bcmul((string)$giftInfo['value'], (string)$params['number']);
  107. // 用户钱包
  108. $wallet = new UserWalletModel();
  109. if (!$wallet->getOne($user['id'])) {
  110. return AppResult::error($wallet->getMessage());
  111. }
  112. $user_gold = $wallet->getData()['gold'] ?? 0;
  113. if ($user_gold < $giftValue) {
  114. return AppResult::error('您的金币余额不足');
  115. }
  116. Db::beginTransaction();
  117. try {
  118. // 添加礼物赠送记录表
  119. $data = [
  120. 'user_id' => $user['id'],
  121. 'user_to_id' => $toUserInfo['id'],
  122. 'room_id' => $room['id'],
  123. 'room_no' => $room['room_no'],
  124. 'session' => $room['session'],
  125. 'gift_id' => $giftInfo['id'],
  126. 'gift_name' => $giftInfo['name'],
  127. 'number' => $params['number'],
  128. 'price' => $giftValue,
  129. 'is_pk' => $room['is_pk'],
  130. 'pk_id' => $room['pk_id'],
  131. 'pk_type' => $room['pk_type'],
  132. 'create_time' => time()
  133. ];
  134. if (!$log_id = (new LiveGiftLogModel())->insertGetId($data)) {
  135. Db::rollback();
  136. return AppResult::error('赠送失败');
  137. }
  138. if ($giftValue > 0) {
  139. // 扣除当前用户余额
  140. if (!$wallet->change($user['id'], $toUserInfo['id'], 'gold', -$giftValue, 53, "赠送礼物:{$giftInfo['name']}*{$params['number']}", 'gift_user_typing', $log_id)) {
  141. Db::rollBack();
  142. return AppResult::error($wallet->getMessage());
  143. }
  144. // $business = new GiftBusiness();
  145. // if (!$business->LiveGiftDeal($log_id)){
  146. // LogUtil::info('同步执行成交收益', self::LOG_MODULE, __FUNCTION__,$business->getMessage());
  147. // Db::rollBack();
  148. // return AppResult::error($business->getMessage());
  149. // }
  150. }
  151. Db::commit();
  152. } catch (\Throwable $e) {
  153. Db::rollBack();
  154. return AppResult::error($e->getMessage());
  155. }
  156. if ($giftValue > 0) {
  157. // 队列中处理:添加礼物赠送记录;添加pk数据;添加赠送用户余额;增加赠送用户上级余额;增加亲密度
  158. $this->service->liveGiftPush([
  159. 'log_id' => $log_id
  160. ]);
  161. }
  162. return AppResult::success('赠送成功');
  163. }
  164. }