lip 5 日 前
コミット
7ca09ccbdc

+ 102 - 22
app/Console/Commands/Sport.php

@@ -41,6 +41,40 @@ class Sport extends Command
             'WO' => 4,
             'LIVE' => 1,
         ];
+    protected $long_status = [
+        'Time To Be Defined' => 0,
+        'Not Started' => 0,
+        'First Half' => 1,
+        'First Half, Kick Off' => 1,
+        'Halftime' => 1,
+        'Second Half' => 1,
+        'Second Half, 2nd Half Started' => 1,
+        'Extra Time' => 1,
+        'Break Time' => 1,
+        'Penalty In Progress' => 1,
+        'Match Suspended' => 1,
+        'Match Interrupted' => 1,
+        'Match Finished' => 2,
+        'Match Finished' => 2,
+        'Match Finished' => 2,
+        'Match Postponed' => 3,
+        'Match Cancelled' => 4,
+        'Match Abandoned' => 4,
+        'Technical Loss' => 4,
+        'WalkOver' => 4,
+        'In Progress' => 1,
+    ];        
+    
+    protected $fixture_status = [
+        'First Half' => 1,
+        'First Half, Kick Off' => 1,
+        'Halftime' => 1,
+        'Second Half' => 1,
+        'Second Half, 2nd Half Started' => 1,
+        'Extra Time' => 1,
+        'Break Time' => 1,
+        'Penalty In Progress' => 1,
+    ];     
    
 
     /**
@@ -56,35 +90,57 @@ class Sport extends Command
      */
     public function handle()
     {
-        // $data = SportClientService::odds([
-        //     'fixture' => 1517485,
-        // ]);
-        
-        
-        // $data = SportClientService::oddsLive();
-        // // file_put_contents("1517485.json", json_encode($data));
-        // print_r($data);
-        // die;
-        
-        $this->info('开始执行统计比赛数据任务...');
-        
+        // $this->info('开始执行统计比赛数据任务...');
         $this->is_live = $this->argument('is_live');
         if ($this->is_live == 1) {
             //进行中的赛事,定时更新
             $this->liveFixtures();
-        } else {
+        } elseif ($this->is_live == 0) {
             //未开始的赛事拉取
             $this->fixtures();
-        }
+        } elseif ($this->is_live == 2){
+            // $data = SportClientService::fixtures([
+            //     'id' => 1534923,
+            // ]);
+            // $data = SportClientService::fixtures(['live' => 'all']);
+            // // $data = SportClientService::oddsLive();
+            // file_put_contents("1534923.json", json_encode($data));
+            // print_r($data);
+            // die;
+            
+            $this->checkLiveFixtures();
+        } 
+    }
+
+    //进行中超过3分钟没有更新数据的赛事,检查比赛是否结束
+    public function checkLiveFixtures()
+    { 
+        //体育赛事结束前几(分钟)锁盘,90分钟结束
+        $sport_locked = Config::where('field', 'sport_locked')->first()->val ?? 1;
+
+        $end_time = date("Y-m-d H:i:s", time() - 180);
+        
+        $ids = SportModel::where('status', 1)->where('state', 1)->where('updated_at', '<=', $end_time)->pluck('data_id')->toArray();
+        $ids = implode('-', $ids);
         
-        $this->info('结束执行统计比赛数据任务');
+        echo $end_time."\r\n";
+        echo $ids;
+        $data = SportClientService::fixtures(['ids' => $ids]);
+        $this->updateOrCreateSport($data, $sport_locked, 1);
     }
     
     //更新进行中的赛事
     public function liveFixtures()
     {
+        //体育赛事结束前几(分钟)锁盘,90分钟结束
+        $sport_locked = Config::where('field', 'sport_locked')->first()->val ?? 1;
         $data = SportClientService::fixtures(['live' => 'all']);
         file_put_contents("fixturesLive.json", json_encode($data));
+        $this->updateOrCreateSport($data, $sport_locked);
+        return true;
+    }
+
+    private function updateOrCreateSport($data, $sport_locked, $is_check = 0) {
         $data = $data['response'];
         $tableData = [];
         $status = $this->short_status;
@@ -104,7 +160,7 @@ class Sport extends Command
                 'guest_team_logo' => $item['teams']['away']['logo'],
                 'half_score' => "{$item['score']['halftime']['home']}-{$item['score']['halftime']['away']}",
                 'rbt' => $item['fixture']['timestamp'],
-                'score' => isset($item['score']['fulltime']) ? "{$item['score']['fulltime']['home']}-{$item['score']['fulltime']['away']}":'-',
+                'score' => isset($item['goals']) ? "{$item['goals']['home']}-{$item['goals']['away']}":'-',
                 'extra_score' => isset($item['score']['extratime']) ? "{$item['score']['extratime']['home']}-{$item['score']['extratime']['away']}" : "",//加时赛比分
                 'league' => lang($item['league']['name']),
                 'league_en' => $item['league']['name'],
@@ -113,7 +169,28 @@ class Sport extends Command
                 'updated_at' => now(),
                 'home_statistics' => $home_statistics,
                 'away_statistics' => $away_statistics,
+                'is_send' => 0,
             ];
+            
+            $fixture_status = null;
+            if (isset($item['fixture']['status']['long']) ) {
+                $long = $item['fixture']['status']['long'];
+                if (isset($this->fixture_status[$long])) {
+                    $fixture_status = json_encode($item['fixture']['status']);
+                    $sport_data['fixture_status'] = $fixture_status;
+                } 
+                if (isset($this->long_status[$long])) {
+                    $sport_data['state'] = $this->long_status[$long];
+                }
+            }
+            //提前锁盘(比赛进行时长,分钟)
+            if (isset($item['fixture']['status']['elapsed'])) {
+                $elapsed = $item['fixture']['status']['elapsed'];
+                if ((int)$elapsed >= 90 - $sport_locked ) {
+                   $sport_data['is_locked'] = 1;
+                }
+            }
+            
             $sport_data['score'] = $sport_data['score'] == '-' ? '' : $sport_data['score'];
             $sport_data['half_score'] = $sport_data['half_score'] == '-' ? '' : $sport_data['half_score'];
             $sport_data['extra_score'] = $sport_data['extra_score'] == '-' ? '' : $sport_data['extra_score'];
@@ -126,12 +203,18 @@ class Sport extends Command
             if (isset($item['fixture']['status']['finished']) && $item['fixture']['status']['finished']) {
                 $sport_data['state'] = 2;
             }
-                
-            if (!SportModel::where('data_id', $item['fixture']['id'])->exists()) {
+            
+            $info = SportModel::where('data_id', $item['fixture']['id'])->first();
+            if (!$info) {
                 $sport_data['created_at'] = now();
                 $sport_data['status'] = 1;
                 $tableData[] = $sport_data;
             } else {
+                //比赛开始前一分钟,锁盘
+                if ($info->is_locked == 0 && $info->is_roll == 0 && $info->game_time < time() - 60) {
+                    $sport_data['is_locked'] = 1;
+                }
+
                 SportModel::where('data_id', $item['fixture']['id'])->update($sport_data);
             }
             //比赛结束,插入比赛事件
@@ -149,13 +232,12 @@ class Sport extends Command
                         'assist' => $event['assist'] ? json_encode($event['assist']) : $event['assist'],
                     ]);
                 }
-
             }
         }
         if ($tableData) {
             SportModel::insert($tableData);
         }
-        return $tableData;
+        return true;
     }
     
     /**
@@ -238,8 +320,6 @@ class Sport extends Command
         
         return true;
     }
-    
-    
     public function initOdds(){
         $page = 1;
         $limit = 10;

+ 17 - 20
app/Console/Commands/SportOdds.php

@@ -69,45 +69,36 @@ class SportOdds extends Command
     {
         $this->is_live = $this->argument('is_live');
         if ($this->is_live == 1) {
-            $this->info('直播赔率开始执行任务...');
+            // $this->info('直播赔率开始执行任务...');
             $this->sportOddsData($this->is_live);
         } else {
-            $this->info('开赛前赔率开始执行任务...');
+            // $this->info('开赛前赔率开始执行任务...');
             $this->sportOddsData($this->is_live);
         }
         
-        $this->info('结束执行赔率任务');
+        // $this->info('结束执行赔率任务');
     }
 
     public function sportOddsData($is_live)
     {
         try {
-            $limit = 100;
+            $limit = 3000;
             //直播赔率(获取正在直播的所有赛事的赔率)
             if ($is_live == 1) {
                 $data = SportClientService::oddsLive([]);
                 // $data = SportClientService::oddsLive(['fixture' => '1537245']);
-                // $data = SportClientService::odds(['fixture' => '1537245']);
                 // die;
                     
-                file_put_contents("oddsLive.json",json_encode($data));
+                // file_put_contents("oddsLive.json",json_encode($data));
                 $this->updateOddsLive($data);
             } else {
-                //按照日期获取赔率
-                // $data = SportClientService::odds([
-                //     'date' => date('Y-m-d'),
-                // ]);
-                // die;
-                
                 //普通球赛是开赛前购买,更新数据
                 $where['state'] = 0;  //比赛状态:0未开始1进行中2已完场3延期4取消
                 $list = SportModel::where($where)->where('odds',null)->limit($limit)->get()->toArray();
-                // $list = SportModel::whereIn('data_id', [1512757, 1525674])->get()->toArray();
                 foreach($list as $item) {
                     $data = SportClientService::odds([
                         'fixture' => $item['data_id'],
                     ]);
-                // file_put_contents("oddsToday.json",json_encode($data));
                     $this->updateOdds($item['data_id'],$data);
                 }
             }
@@ -128,15 +119,20 @@ class SportOdds extends Command
                 $odds = json_encode($item['odds']);
                 
                 $update_data = [
-                    'odds' => $odds,
                     'is_send' => 0,
+                    'is_roll' => 1,
+                    'is_locked' => 0,
                 ];
                 $fixture_status = null;
-                if (isset($item['fixture']['status']['long']) && isset($this->$fixture_status[$item['fixture']['status']['long']])) {
-                    $fixture_status = json_encode($item['fixture']['status']);
-                    $update_data['fixture_status'] = $fixture_status;
-                    if (isset($this->long_status[$item['fixture']['status']['long']])) {
-                        $update_data['state'] = $this->long_status[$item['fixture']['status']['long']];
+                if (isset($item['fixture']['status']['long']) ) {
+                    $long = $item['fixture']['status']['long'];
+                    if (isset($this->fixture_status[$long])) {
+                        $fixture_status = json_encode($item['fixture']['status']);
+                        $update_data['fixture_status'] = $fixture_status;
+                    } 
+                    
+                    if (isset($this->long_status[$long])) {
+                        $update_data['state'] = $this->long_status[$long];
                     }
                 }
                 if (isset($item['teams']['home']['goals'])) {
@@ -158,6 +154,7 @@ class SportOdds extends Command
                 if (isset($item['fixture']['status']['finished']) && $item['fixture']['status']['finished']) {
                     $update_data['state'] = 2;
                 }
+                $update_data['odds'] = $odds;
                 SportModel::where('data_id',$data_id)->update($update_data);
                 echo $data_id.": 更新成功\r\n";
             }

+ 4 - 2
app/Http/Controllers/admin/Sport.php

@@ -4,6 +4,7 @@ namespace App\Http\Controllers\admin;
 
 use App\Http\Controllers\Controller;
 use App\Models\Sport as SportModel;
+use App\Models\SportEvent;
 use Exception;
 use App\Constants\HttpStatus;
 
@@ -72,7 +73,7 @@ class Sport extends Controller
         } catch (Exception $e) {
             return $this->error(HttpStatus::CUSTOM_ERROR,$e->getMessage());
         }
-        return $this->success(['total' => $count, 'data' => $list]);
+        return $this->success(['total' => $count, 'data' => $list,'start_time' => $query]);
 
     }
 
@@ -94,6 +95,7 @@ class Sport extends Controller
             $info['fixture_status'] = json_decode($info['fixture_status'], true);
 
             $info['odds'] = $info['odds'] ? json_decode($info['odds'], true) : null;
+            $info['event'] = SportEvent::where('data_id', $info['data_id'])->get();
 
         } catch (Exception $e) {
             return $this->error(HttpStatus::CUSTOM_ERROR,$e->getMessage());
@@ -105,7 +107,7 @@ class Sport extends Controller
     {
         try {
             $params = request()->validate([
-                'id' => ['required', 'integer'],
+                'id' => ['required','array'],
                 'status' => ['nullable', 'integer'],
                 'state' => ['nullable', 'integer'],
                 'is_locked' => ['nullable', 'integer'],