wesmiler 1 year ago
parent
commit
97a54d36fc

+ 2 - 2
app/Console/Commands/SocketServer.php

@@ -277,11 +277,11 @@ class SocketServer extends Command
 
                     // 推送消息给对方
                     $msgData['time_text'] = dateFormat($msgData['create_time']);
-                    $this->sendMsg($frameId, ['success' => true, 'op' => 'push', 'scene'=> $scene, 'data' => $msgData, 'message' => '发送成功:' . $frameId]);
+                    $this->sendMsg($frameId, ['success' => true, 'op' => 'push_live', 'scene'=> $scene, 'data' => $msgData, 'message' => '发送成功:' . $frameId]);
                     $toBindData = RedisService::get("chats:bind:{$scene}_{$toUid}");
                     $toFd = isset($toBindData['fd']) ? $toBindData['fd'] : 0;
                     if ($toBindData && $toFd) {
-                        $this->sendMsg($toFd, ['success' => true, 'op' => 'push' ,'scene'=> $scene, 'data' => $msgData, 'message' => '推送消息成功:' . $toFd]);
+                        $this->sendMsg($toFd, ['success' => true, 'op' => 'push_live' ,'scene'=> $scene, 'data' => $msgData, 'message' => '推送消息成功:' . $toFd]);
                         $this->info("【{$scene} {$date}】Socket:客户端【{$frameId}-{$fromUid}】推送消息给【{$toFd}-{$toUid}。");
                     }
 

+ 14 - 0
app/Http/Controllers/Api/v1/LiveController.php

@@ -131,4 +131,18 @@ class LiveController extends webApp
             return message(LiveService::make()->getError(),true, $result);
         }
     }
+
+    /**
+     * 礼物打赏
+     * @return array
+     */
+    public function reward()
+    {
+        $params = request()->all();
+        if(!$result = LiveService::make()->reward($this->userId, $params)){
+            return message(LiveService::make()->getError(),false);
+        }else{
+            return message(LiveService::make()->getError(),true, $result);
+        }
+    }
 }

+ 2 - 1
app/Models/LiveModel.php

@@ -29,6 +29,7 @@ class LiveModel extends BaseModel
     public function member()
     {
         return $this->hasOne(MemberModel::class, 'id','user_id')
-            ->select(['id','nickname','avatar','status']);
+            ->where(['mark'=>1])
+            ->select(['id','nickname','parent_id','balance','usdt','avatar','status']);
     }
 }

+ 44 - 0
app/Models/RewardOrderModel.php

@@ -0,0 +1,44 @@
+<?php
+// +----------------------------------------------------------------------
+// | LARAVEL8.0 框架 [ LARAVEL ][ RXThinkCMF ]
+// +----------------------------------------------------------------------
+// | 版权所有 2017~2021 LARAVEL研发中心
+// +----------------------------------------------------------------------
+// | 官方网站: http://www.laravel.cn
+// +----------------------------------------------------------------------
+// | Author: laravel开发员 <laravel.qq.com>
+// +----------------------------------------------------------------------
+
+namespace App\Models;
+
+/**
+ * 打赏订单-模型
+ * @author laravel开发员
+ * @since 2020/11/11
+ * @package App\Models
+ */
+class RewardOrderModel extends BaseModel
+{
+    // 设置数据表
+    protected $table = 'reward_order';
+
+    /**
+     * 打赏用户
+     * @return \Illuminate\Database\Eloquent\Relations\HasOne
+     */
+    public function member()
+    {
+        return $this->hasOne(MemberModel::class, 'id','user_id')
+            ->select(['id','nickname','parent_id','balance','avatar','status']);
+    }
+
+    /**
+     * 被打赏用户
+     * @return \Illuminate\Database\Eloquent\Relations\HasOne
+     */
+    public function liveUser()
+    {
+        return $this->hasOne(MemberModel::class, 'id','live_user_id')
+            ->select(['id','nickname','parent_id','balance','avatar','status']);
+    }
+}

+ 212 - 0
app/Services/LiveService.php

@@ -13,11 +13,14 @@ namespace App\Services;
 
 use AlibabaCloud\Tea\Exception\TeaUnableRetryError;
 use AlibabaCloud\SDK\Dysmsapi\V20170525\Dysmsapi;
+use App\Models\AccountLogModel;
 use App\Models\LiveGiftModel;
 use App\Models\LiveModel;
 use App\Models\MemberModel;
+use App\Models\RewardOrderModel;
 use App\Models\VideoCollectModel;
 use App\Services\Api\MemberCollectService;
+use App\Services\Api\MessageService;
 use App\Services\Api\VideoCollectService;
 use Darabonba\OpenApi\Models\Config;
 use AlibabaCloud\SDK\Dysmsapi\V20170525\Models\SendSmsRequest;
@@ -579,5 +582,214 @@ class LiveService extends BaseService
         return $data;
     }
 
+    /**
+     * 直播打赏
+     * @param $userId 打赏用户ID
+     * @param $params 参数
+     * @return bool
+     */
+    public function reward($userId, $params)
+    {
+        $liveId = isset($params['live_id'])? intval($params['live_id']) : 0;
+        $giftId = isset($params['gift_id'])? intval($params['gift_id']) : 0;
+        $liveInfo = $this->model->with(['member'])->where(['id'=> $liveId,'mark'=>1])
+            ->select(['id','user_id','pay_status','status'])
+            ->first();
+        $status = isset($liveInfo['status'])? $liveInfo['status'] : 0;
+        $payStatus = isset($liveInfo['pay_status'])? $liveInfo['pay_status'] : 0;
+        $liveUserId = isset($liveInfo['user_id'])? $liveInfo['user_id'] : 0;
+        $liveMember = isset($liveInfo['member'])? $liveInfo['member'] : [];
+        $liveUserUsdt = isset($liveMember['usdt'])? $liveMember['usdt'] : 0;
+        $bonusUserId = isset($liveMember['parent_id'])? $liveMember['parent_id'] : 0;
+        if(empty($liveInfo) || empty($liveMember) || $status != 1){
+            $this->error = 2301;
+            return false;
+        }
+
+        if($payStatus!=1){
+            $this->error = 2302;
+            return false;
+        }
+
+        $giftInfo = LiveGiftModel::where(['id'=> $giftId,'status'=>1,'mark'=>1])
+            ->select(['id','name','money'])
+            ->first();
+        $money = isset($giftInfo['money'])? intval($giftInfo['money']) : 0;
+        if(empty($giftInfo) || $money<=0){
+            $this->error = 2303;
+            return false;
+        }
+
+        // 用户信息
+        $userInfo = MemberModel::where(['id'=> $userId,'mark'=>1])
+            ->select(['id','nickname','parent_id','point_id','balance','status'])
+            ->first();
+        $balance = isset($userInfo['balance'])? floatval($userInfo['balance']) : 0;
+        if($balance < $money){
+            $this->error = 2304;
+            return false;
+        }
+
+        // 直播推荐人(经纪人)
+        $bounsUserInfo = [];
+        $bonusUserLevel = 0;
+        if($bonusUserId){
+            $bounsUserInfo = MemberModel::where(['id'=> $bonusUserId,'status'=>1,'mark'=>1])
+                ->select(['id','nickname','parent_id','point_id','member_level','usdt','balance','status'])
+                ->first();
+            $bonusUserLevel = isset($bounsUserInfo['member_level'])? $bounsUserInfo['member_level'] : 0;
+        }
+
+
+        // 打赏订单
+        $orderNo = get_order_num('RW');
+        $awardLevel = ConfigService::make()->getConfigByCode('live_award_level',5); // 推荐奖励等级
+        $awardLevel = $awardLevel>=1 && $awardLevel<=30? $awardLevel : 5;
+        $awardRate = ConfigService::make()->getConfigByCode('award_rewad_rate',10); // 推荐奖励比例%
+        $awardRate = $awardRate>=0 && $awardLevel<100? $awardRate : 10;
+        $xdPrice = ConfigService::make()->getConfigByCode('xd_price',100);  // 星豆价格
+        $xdPrice = $xdPrice>0.01 && $xdPrice <=10000? $xdPrice : 100;
+        $usdt = moneyFormat($money/$xdPrice,2);
+        // 推荐佣金
+        $bonusUsdt = $awardRate? moneyFormat($usdt * $awardRate/100, 4) : 0;
+        DB::beginTransaction();
+        $order = [
+            'live_id'=> $liveId,
+            'user_id'=> $userId,
+            'live_user_id'=> $liveUserId,
+            'gift_id'=> $giftId,
+            'order_no'=> $orderNo,
+            'type'=> 1,
+            'money'=> $money,
+            'usdt'=> $usdt,
+            'bonus_rate'=> $awardRate? $awardRate : 0,
+            'bonus_usdt'=> $bonusUserId>0? $bonusUsdt : 0,
+            'bonus_uid'=> $bonusUserId,
+            'bonus_status'=> $bonusUserLevel >= $awardLevel? 1 : 2,
+            'create_time'=> time(),
+            'status'=> 1,
+            'mark'=>1
+        ];
+        if(!RewardOrderModel::insertGetId($order)){
+            DB::rollBack();
+            $this->error = 2305;
+            return false;
+        }
+
+        // 扣除打赏用户余额
+        $updateData = ['balance'=>DB::raw("balance - {$money}"),'update_time'=>time()];
+        if(!MemberModel::where(['id'=> $userId,'mark'=>1])->update($updateData)){
+            DB::rollBack();
+            $this->error = 2305;
+            return false;
+        }
+
+        // 明细
+        $log = [
+            'user_id'=> $userId,
+            'source_id'=> $liveId,
+            'source_order_no'=> $orderNo,
+            'user_type'=> 1,
+            'type'=>1,
+            'coin_type'=> 2,
+            'money'=> $money,
+            'date'=> date('Y-m-d'),
+            'actual_money'=> $usdt,
+            'balance'=> $balance,
+            'create_time'=> time(),
+            'remark'=> '礼物打赏',
+            'status'=> 1,
+            'mark'=> 1,
+        ];
+
+        if(!AccountLogModel::insertGetId($log)){
+            DB::rollBack();
+            $this->error = 2305;
+            return false;
+        }
+
+        // 被打赏主播账户USDT账户进账
+        $updateData = ['usdt'=>DB::raw("usdt + {$usdt}"),'update_time'=>time()];
+        if(!MemberModel::where(['id'=> $liveUserId,'mark'=>1])->update($updateData)){
+            DB::rollBack();
+            $this->error = 2305;
+            return false;
+        }
+
+        // 明细
+        $log = [
+            'user_id'=> $liveUserId,
+            'source_id'=> $liveId,
+            'source_order_no'=> $orderNo,
+            'user_type'=> 1,
+            'type'=> 1,
+            'coin_type'=> 1,
+            'money'=> $usdt,
+            'date'=> date('Y-m-d'),
+            'actual_money'=> $usdt,
+            'balance'=> $liveUserUsdt,
+            'create_time'=> time(),
+            'remark'=> '礼物打赏',
+            'status'=> 1,
+            'mark'=> 1,
+        ];
+
+        if(!AccountLogModel::insertGetId($log)){
+            DB::rollBack();
+            $this->error = 2305;
+            return false;
+        }
+
+
+        // 推荐奖励(等级需要超过)
+        $dateTime = date('Y-m-d H:i:s');
+        $liveName = isset($liveMember['nickname']) && $liveMember['nickname']? $liveMember['nickname'] : $liveUserId;
+        $userNickname = isset($userInfo['nickname']) && $userInfo['nickname']? $userInfo['nickname'] : $userId;
+        if($bonusUserId>0 && $bonusUserLevel >= $awardLevel && $bonusUsdt>0){
+            // 账户变动
+            $updateData = ['usdt'=>DB::raw("usdt + {$bonusUsdt}"),'update_time'=>time()];
+            if(!MemberModel::where(['id'=> $bonusUserId,'mark'=>1])->update($updateData)){
+                DB::rollBack();
+                $this->error = 2305;
+                return false;
+            }
+
+            // 明细
+            $log = [
+                'user_id'=> $bonusUserId,
+                'source_id'=> $liveId,
+                'source_order_no'=> $orderNo,
+                'user_type'=> 1,
+                'type'=> 10,
+                'coin_type'=> 1,
+                'money'=> $usdt,
+                'date'=> date('Y-m-d'),
+                'actual_money'=> $usdt,
+                'balance'=> $liveUserUsdt,
+                'create_time'=> time(),
+                'remark'=> '推荐打赏奖励',
+                'status'=> 1,
+                'mark'=> 1,
+            ];
+
+            if(!AccountLogModel::insertGetId($log)){
+                DB::rollBack();
+                $this->error = 2305;
+                return false;
+            }
+
+            // 消息
+            MessageService::make()->pushMessage($userId, lang('打赏推荐奖励通知'), lang('打赏推荐奖励通知内容',['time'=> $dateTime,'usdt'=>$bonusUsdt,'live_name'=>$liveName]),3);
+        }
+
+        DB::commit();
+
+        // 用户消息
+        MessageService::make()->pushMessage($userId, lang('打赏消费通知'), lang('打赏消费通知内容',['time'=> $dateTime,'money'=>$money,'live_name'=>$liveName]),3);
+        MessageService::make()->pushMessage($liveUserId, lang('打赏通知'), lang('打赏通知内容',['time'=> $dateTime,'money'=>$money,'nickname'=>$userNickname]),3);
+
+        $this->error = 2306;
+        return true;
+    }
 
 }

+ 13 - 0
resources/lang/zh-cn/api.php

@@ -88,8 +88,21 @@ return [
     '2212'=> '保存视频文件失败,请返回重试',
     '2213'=> '请选择或拍摄视频',
 
+    '2301'=> '该直播已结束',
+    '2302'=> '该直播间未开启打赏功能',
+    '2303'=> '礼物参数错误',
+    '2304'=> '账户星豆余额不足,请先充值',
+    '2305'=> '打赏支付失败',
+    '2306'=> '打赏成功',
+
     
     '我正在直播,快来看看吧'=>'我正在直播,快来看看吧',
+    '打赏消费通知'=>'打赏消费通知',
+    '打赏消费通知内容'=>'您在:time(UTC+8)打赏了:money星豆给主播:live_name',
+    '打赏通知'=>'打赏通知',
+    '打赏通知内容'=>'用户:nickname在:time(UTC+8)给您打赏了:money星豆',
+    '打赏推荐奖励通知'=>'打赏推荐奖励通知',
+    '打赏推荐奖励通知内容'=>'您在:time(UTC+8)获得了主播:live_name的打赏奖励:usdt USDT',