wesmiler 1 year ago
parent
commit
359a12cf41

+ 1 - 0
app/Http/Controllers/Admin/IndexController.php

@@ -110,6 +110,7 @@ class IndexController extends Backend
         RedisService::keyDel("caches:index*");
         RedisService::keyDel("caches:config*");
         RedisService::keyDel("caches:m_collect*");
+        RedisService::keyDel("caches:task:scene*");
 
         return message(MESSAGE_OK, true);
     }

+ 72 - 0
app/Services/Api/FinanceService.php

@@ -11,8 +11,12 @@
 
 namespace App\Services\Api;
 
+use App\Models\AccountLogModel;
 use App\Models\FinanceModel;
+use App\Models\MemberModel;
 use App\Services\BaseService;
+use App\Services\RedisService;
+use Illuminate\Support\Facades\DB;
 
 /**
  * 平台账户(财务)-服务类
@@ -127,4 +131,72 @@ class FinanceService extends BaseService
         }
     }
 
+    /**
+     * 任务算力奖励
+     * @param $userId 用户ID
+     * @param $power 算力
+     * @param $type 类型
+     * @param int $sourceId 任务ID
+     * @param string $remark 备注说明
+     * @return false
+     */
+    public function settleTaskPower($userId, $power, $sourceId=0, $remark='')
+    {
+        if($power<=0){
+            $this->error = 2014;
+            return false;
+        }
+
+        $userInfo = MemberModel::where(['id'=> $userId, 'status'=>1,'mark'=>1])
+            ->select(['id','nickname','usdt','power_num','status'])
+            ->first();
+        $userPower = isset($userInfo['power_num'])? $userInfo['power_num'] : 0;
+        if(empty($userInfo) || $userId<=0)
+        {
+            $this->error = 1041;
+            return false;
+        }
+
+        DB::beginTransaction();
+        // 更新账户算力
+        $updateData = ['power_num'=> DB::raw("power_num + {$power}"),'update_time'=>time()];
+        if(!MemberModel::where(['id'=> $userId])->update($updateData)){
+            DB::rollBack();
+            $this->error = 1042;
+            return false;
+        }
+
+        // 明细
+        $orderNo = get_order_num('TS');
+        $log = [
+            'user_id' => $userId,
+            'source_id' => $sourceId,
+            'source_order_no' => $orderNo,
+            'type' => 9,
+            'coin_type' => 3,
+            'user_type'=> 1,
+            'money' => $power,
+            'actual_money' => $power,
+            'balance' => $userPower,
+            'create_time' => time(),
+            'update_time' => time(),
+            'remark' => $remark? $remark : '算力奖励',
+            'status' => 1,
+            'mark' => 1,
+        ];
+
+        if (!AccountLogModel::insertGetId($log)) {
+            $this->error = 2407;
+            DB::rollBack();
+            return false;
+        }
+
+        DB::commit();
+
+        // 站内消息
+        $dateTime = date('Y-m-d H:i:s');
+        MessageService::make()->pushMessage($userId,   $log['remark'] , "您在{$dateTime}(UTC+8){$log['remark']}{$power}算力已到账,请及时查看账户!!!");
+
+    }
+
 }

+ 3 - 0
app/Services/Api/MemberCollectService.php

@@ -220,6 +220,9 @@ class MemberCollectService extends BaseService
         $this->model->where(['user_id'=> $collectUid,'collect_uid'=> $userId])->update(['is_return'=> $data['is_return'],'update_time'=>time()]);
         if($status == 1){
             MessageService::make()->pushMessage($collectUid, '有人对你感兴趣','有人关注了你', 5, $userId);
+
+            // 关注用户任务处理
+            TaskService::make()->updateTask($userId,3, $collectUid);
         }
 
         return ['is_fans'=>$isFansId? 1:0];

+ 4 - 64
app/Services/Api/MemberService.php

@@ -1152,6 +1152,10 @@ class MemberService extends BaseService
         MessageService::make()->pushMessage($userId,'星豆余额充值成功',"您在{$dateTime}(UTC+8)成功支付{$usdt}USDT充值{$money}星豆",3);
 
         DB::commit();
+
+        // 充值星豆任务
+        TaskService::make()->updateTask($userId,9, 0);
+
         $this->error = 2037;
         return ['order_id'=> $orderId,'balance'=> moneyFormat($balance + $money,2),'usdt'=> moneyFormat($userUsdt-$usdt, 2)];
     }
@@ -1389,70 +1393,6 @@ class MemberService extends BaseService
     }
 
     /**
-     * 分销佣金入账
-     * @param $info
-     * @return false
-     */
-    public function settleBonus($info, $level=1)
-    {
-        $money = isset($info['money'])? floatval($info['money']) : 0;
-        $merchId = isset($info['merch_id'])? intval($info['merch_id']) : 0;
-        $userId = isset($info['user_id'])? intval($info['user_id']) : 0;
-
-        // 分销佣金
-        $settleUserId = isset($info["bonus_level{$level}_id"])? $info["bonus_level{$level}_id"] : 0;
-        $settleMoney = isset($info["bonus_level{$level}_money"])? $info["bonus_level{$level}_money"] : 0;
-        if($settleUserId>0 && $settleMoney>0){
-            $userInfo = $this->model->where(['id'=> $settleUserId,'mark'=>1])
-                ->select(['id','nickname','balance'])
-                ->first();
-
-            $balance = isset($userInfo['balance'])? $userInfo['balance'] : 0;
-            if($settleUserId && $userInfo){
-                // 更新账户
-                $updateData = [
-                    'balance'=>DB::raw("balance + {$settleMoney}"),
-                    'bonus_total'=>DB::raw("bonus_total + {$settleMoney}"),
-                    "bonus_level{$level}_total"=>DB::raw("bonus_level{$level}_total + {$settleMoney}"),
-                    'update_time'=> time()
-                ];
-                if(!MemberModel::where(['id'=> $settleUserId,'mark'=>1])->update($updateData)){
-                    $this->error = lang(3413, ['level'=> $level]);
-                    return false;
-                }
-
-                $log = [
-                    'user_id'=> $settleUserId,
-                    'merch_id'=> $merchId,
-                    'source_uid'=> $userId,
-                    'source_order_no'=> isset($info['order_no'])? $info['order_no'] :'',
-                    'type'=> 3,
-                    'coin_type'=> 2,
-                    'user_type'=> 1,
-                    'money'=> $settleMoney,
-                    'balance'=>$balance? $balance : 0.00,
-                    'create_time'=> time(),
-                    'update_time'=> time(),
-                    'remark'=> "服务订单[{$money}]元的{$level}级分销佣金",
-                    'status'=>1,
-                    'mark'=>1
-                ];
-                if(!AccountLogModel::insertGetId($log)){
-                    $this->error = lang(3414, ['level'=> $level]);
-                    return false;
-                }
-
-                $this->error = lang(3415, ['level'=> $level]);
-                return true;
-            }
-        }
-
-
-        $this->error = lang(3412, ['level'=> $level]);
-        return true;
-    }
-
-    /**
      * 获取点对点上级节点
      * @param $userId 推荐人ID
      * @return int|mixed

+ 174 - 29
app/Services/Api/TaskService.php

@@ -14,6 +14,8 @@ use App\Models\TaskLogModel;
 use App\Models\TaskModel;
 use App\Services\BaseService;
 use App\Services\RedisService;
+use BN\Red;
+use Illuminate\Support\Facades\DB;
 
 /**
  * 任务管理-服务类
@@ -127,55 +129,198 @@ class TaskService extends BaseService
     }
 
     /**
-     * 状态设置
-     * @return bool
+     * 获取对应场景下的任务列表
+     * @param $scene 场景
+     * @return array|mixed
      */
-    public function status()
+    public function getTaskByScene($scene)
     {
-        $id = request()->post('id', 0);
-        $status = request()->post('status', 1);
-        if ($id && !$this->model->where(['id' => $id, 'mark' => 1])->value('id')) {
-            $this->error = 2981;
-            return false;
+        $cacheKey = "caches:task:scene_{$scene}";
+        $datas = RedisService::get($cacheKey);
+        if($datas){
+            return $datas;
+        }
+        $datas = $this->model->where(['scene'=> $scene,'status'=>1,'mark'=>1])
+            ->select(['id','name','type','num','power','sort','check_type','scene'])
+            ->orderBy('sort','desc')
+            ->orderBy('id','desc')
+            ->get();
+        $datas = $datas? $datas->toArray() : [];
+        if($datas)
+        {
+            RedisService::set($cacheKey, $datas, rand(300,600));
         }
 
-        if($this->model->where(['id'=> $id,'mark'=>1])->update(['status'=>$status, 'update_time'=> time()])){
-            $this->error = 1002;
-            return true;
+        return $datas;
+    }
+
+    /**
+     * 获取对应类型的任务列表
+     * @param $type 类型:1-每日任务,2-新手任务
+     * @return array|mixed
+     */
+    public function getTaskByType($type)
+    {
+        $cacheKey = "caches:task:type_{$type}";
+        $datas = RedisService::get($cacheKey);
+        if($datas){
+            return $datas;
+        }
+        $datas = $this->model->where(['type'=> $type,'status'=>1,'mark'=>1])
+            ->select(['id','name','type','num','power','sort','check_type','scene'])
+            ->orderBy('sort','desc')
+            ->orderBy('id','desc')
+            ->get();
+        $datas = $datas? $datas->toArray() : [];
+        if($datas)
+        {
+            RedisService::set($cacheKey, $datas, rand(300,600));
         }
 
-        $this->error = 1003;
-        return true;
+        return $datas;
     }
 
     /**
-     * 删除
-     * @return bool
+     * 验证更新任务完成记录数据
+     * @param $userId 用户ID
+     * @param $taskId 任务ID
+     * @param int $type 任务类型:1-每日,2-新手
+     * @param int $checkType 任务验证类型:1-次数,2-时长
+     * @param int $sourceId 任务完成对象来源ID
+     * @return false
      */
-    public function delete()
+    public function updateLogData($userId, $taskId, $type=1, $checkType=1, $sourceId=0)
     {
-        // 参数
-        $param = request()->all();
-        $id   = getter($param, "id");
-        if (empty($id)) {
-            $this->error = 2014;
+        $cacheKey = "caches:task:scene_update_{$userId}_{$taskId}_{$type}";
+        if(RedisService::get($cacheKey)){
             return false;
         }
 
-        if(!$this->model->where(['id'=> $id])->value('id')){
-            $this->error = 1039;
+        // 是否已经完成
+        $checkData = TaskLogModel::where(['task_id'=> $taskId,'user_id'=> $userId,'is_complete'=>1,'status'=>1,'mark'=>1])
+            ->where(function($query) use($type){
+                // 每日任务
+                if($type == 1){
+                    $query->where('date','=', date('Y-m-d'));
+                }
+            })->select(['id','task_id','user_id'])->orderBy('id','desc')->first();
+        if($checkData){
+            RedisService::set($cacheKey, $checkData, rand(300,600));
             return false;
         }
 
+        $logId = TaskLogModel::where(['task_id'=> $taskId,'user_id'=> $userId,'status'=>1,'mark'=>1])
+            ->where(function($query) use($type){
+                // 每日任务
+                if($type == 1){
+                    $query->where('date','=', date('Y-m-d'));
+                }
+            })->value('id');
+        if($logId){
+            if($checkType == 1){
+                $updateData = ['num'=> DB::raw('num + 1'),'update_time'=>time()];
+            }else{
+                $updateData = ['num'=> 1,'update_time'=>time()];
+            }
 
-        if($this->model->where(['id'=> $id])->update(['mark'=>0,'update_time'=>time()])){
-            $this->model->where(['mark'=> 0])->where('update_time','<=', time() - 3 * 86400)->delete();
-            $this->error = 1025;
-            return true;
+           return TaskLogModel::where(['id'=> $logId])->update($updateData);
         }else{
-            $this->error = 1026;
-            return false;
+            return TaskLogModel::insert([
+                'user_id'=> $userId,
+                'task_id'=> $taskId,
+                'source_id'=> $sourceId,
+                'num'=> 1,
+                'date'=> date('Y-m-d'),
+                'create_time'=> time(),
+                'update_time'=> time(),
+                'status'=>1,
+                'mark'=>1,
+            ]);
         }
     }
 
+    /**
+     * 验证更新任务完成状态,并结算
+     * @param $userId 用户ID
+     * @param $scene 场景
+     * @param int $sourceId 来源ID
+     * @return false
+     */
+    public function updateTask($userId, $scene, $sourceId=0)
+    {
+        $taskList = $this->getTaskByScene($scene);
+        if($taskList){
+            $hasDay = false;
+            foreach ($taskList as $item){
+                $item['status'] = 1;
+                $taskId = isset($item['id'])? $item['id'] : 0;
+                $checkType = isset($item['check_type'])? $item['check_type'] : 1;
+                $type = isset($item['type'])? $item['type'] : 1;
+                $num = isset($item['num'])? $item['num'] : 1;
+                $taskName = isset($item['name']) && $item['name']? $item['name'] : '任务';
+                $power = isset($item['power'])? floatval($item['power']) : 0;
+
+                // 验证更新完成记录,若无数据更新则跳过
+                $errorKey = "caches:task:scene_error:{$taskId}_{$userId}";
+                if(!$this->updateLogData($userId, $taskId, $type, $checkType, $sourceId)){
+                    RedisService::set("{$errorKey}_error", ['info'=> $item,'user_id'=> $userId,'source_id'=> $sourceId,'error'=>'该任务已完成'], rand(300, 600));
+                    continue;
+                }
+
+                // 获取验证数据
+                $logNum = $this->getLogNum($userId, $taskId, $type);
+                // 次数
+                if($item['check_type'] == 1 && $num<=$logNum){
+                    $item['status'] = 2;
+                    $item['log_num'] = $logNum;
+                }
+                // 时长
+                else if($item['check_type'] == 2 && $logNum>0){
+                    $item['status'] = 2;
+                    $item['log_num'] = $logNum;
+                }
+
+                // 新手任务奖励
+                if($type == 2 && $item['status'] == 2) {
+                    FinanceService::make()->settleTaskPower($userId, $power, $taskId, "完成{$taskName}任务奖励");
+                }else if($type == 1 && $item['status'] == 2){
+                    $hasDay = true;
+                }
+            }
+
+            // 当前有每日任务,处理
+            if($hasDay){
+                $dayTaskList = $this->getTaskByType(1);
+                if($dayTaskList){
+                    $power = 0;
+                    $completeCount = 0;
+                    foreach ($dayTaskList as $item){
+                        $taskId = isset($item['id'])? $item['id'] : 0;
+                        $type = isset($item['type'])? $item['type'] : 1;
+                        $num = isset($item['num'])? $item['num'] : 1;
+                        // 获取验证数据
+                        $logNum = $this->getLogNum($userId, $taskId, $type);
+                        // 次数
+                        if($item['check_type'] == 1 && $num<=$logNum){
+                           $completeCount++;
+                        }
+                        // 时长
+                        else if($item['check_type'] == 2 && $logNum>0){
+                            $completeCount++;
+                        }
+
+                        if($power<=0){
+                            $power = isset($item['power'])? $item['power'] : 0;
+                        }
+                    }
+
+                    // 所有任务完成
+                    if($completeCount == count($dayTaskList)){
+                        FinanceService::make()->settleTaskPower($userId, $power, 0, "完成每日任务奖励");
+                    }
+                }
+            }
+
+        }
+    }
 }

+ 7 - 2
app/Services/Api/VideoCollectService.php

@@ -344,6 +344,9 @@ class VideoCollectService extends BaseService
                 return false;
             }
 
+            $this->error = 1002;
+            DB::commit();
+
             // 消息
             if($status == 1){
                 if($type == 2){
@@ -351,10 +354,12 @@ class VideoCollectService extends BaseService
                 }else if($type == 3){
                     MessageService::make()->pushMessage($collectUid, '有人点赞了你的视频','有人点赞了你的视频', 5, $userId);
                 }
+
+                // 收藏/点赞视频任务处理
+                TaskService::make()->updateTask($userId,$type==2?11:6, $collectId);
             }
 
-            $this->error = 1002;
-            DB::commit();
+
             RedisService::clear("caches:videos:collect:u{$userId}_c{$collectId}_{$type}");
             RedisService::clear("caches:videos:collect:temp_{$userId}_{$collectId}_{$type}_1");
             RedisService::clear("caches:videos:recommend:{$userId}_1");

+ 4 - 0
app/Services/Api/VideoService.php

@@ -406,6 +406,8 @@ class VideoService extends BaseService
             return false;
         }
 
+        // 浏览视频任务处理
+        TaskService::make()->updateTask($userId,2, $id);
         $data = $this->model->where(['id'=> $id])->update(['views'=>DB::raw('views + 1'),'update_time'=>time()]);
         RedisService::set($cacheKey, $id, rand(1,3)*3600);
         return $data;
@@ -507,6 +509,8 @@ class VideoService extends BaseService
         RedisService::set('caches:videos:publish', ['params'=> $params,'data'=> $data], 600);
         if($id = $this->model->insertGetId($data)){
             $this->error = 1023;
+            // 发布视频任务处理
+            TaskService::make()->updateTask($userId,5, $id);
             return ['id'=> $id];
         }
 

+ 10 - 0
app/Services/LiveService.php

@@ -21,6 +21,7 @@ use App\Models\RewardOrderModel;
 use App\Models\VideoCollectModel;
 use App\Services\Api\MemberCollectService;
 use App\Services\Api\MessageService;
+use App\Services\Api\TaskService;
 use App\Services\Api\VideoCollectService;
 use Darabonba\OpenApi\Models\Config;
 use AlibabaCloud\SDK\Dysmsapi\V20170525\Models\SendSmsRequest;
@@ -232,6 +233,9 @@ class LiveService extends BaseService
                 $this->model->where(['id'=> $id])->update(['views'=>DB::raw('views + 1'),'update_time'=>time()]);
                 RedisService::set("caches:live:player:{$userId}_{$id}", ['user_id'=> $userId,'id'=>$id], rand(600, 1800));
                 $info['views'] += 1;
+
+                // 观看直播任务
+                TaskService::make()->updateTask($userId,1, $id);
             }
 
             // 结束直播
@@ -403,6 +407,9 @@ class LiveService extends BaseService
         if(!RedisService::get("caches:player:live:{$userId}_{$id}")){
             $this->model->where(['id'=> $id])->update(['views'=>DB::raw('views + 1'),'update_time'=>time()]);
             RedisService::set("caches:player:live:{$userId}_{$id}", ['user_id'=> $userId,'id'=>$id], rand(6*3600, 86400));
+
+            // 观看直播任务
+            TaskService::make()->updateTask($userId,1, $id);
         }
         $this->error = 1010;
         return true;
@@ -897,6 +904,9 @@ class LiveService extends BaseService
         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);
 
+        // TODO 打赏直播任务
+        TaskService::make()->updateTask($userId,7, $liveId);
+
         $this->error = 2306;
         return ['id'=>$orderId];
     }

+ 5 - 0
app/Services/WalletService.php

@@ -17,6 +17,7 @@ use App\Models\MemberModel;
 use App\Models\WalletLogModel;
 use App\Models\WalletModel;
 use App\Services\Api\FinanceService;
+use App\Services\Api\TaskService;
 use GuzzleHttp\Client;
 use IEXBase\TronAPI\Tron;
 use Illuminate\Support\Facades\DB;
@@ -636,6 +637,10 @@ class WalletService extends BaseService
 
                         // 邮件消息
                         DB::commit();
+
+                        // 充值星豆/USDT任务
+                        TaskService::make()->updateTask($userId,$accountType==1?10:9, 0);
+
                         $total = moneyFormat($total,2);
                         $amount = moneyFormat($amount,2);
                         $coinName = $accountType==1?'USDT':'星豆';

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

@@ -40,6 +40,9 @@ return [
     '1038' => '出账钱包地址未配置或余额不足,请先充值',
     '1039' => '数据不存在',
     '1040' => '请先设置交易密码',
+    '1041' => '账户不存在',
+    '1042' => '账户处理失败',
+    '1043' => '账户明细处理失败',
 
     // 登录注册
     '2001'=> '账号非法或未注册',