|
@@ -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;
|
|
|
+ }
|
|
|
|
|
|
}
|