doge 2 日 前
親
コミット
0ec9db3d86

+ 35 - 12
app/Http/Controllers/admin/Sport.php

@@ -125,7 +125,7 @@ class Sport extends Controller
             $limit = request()->input('limit', 15);
             $order = 'asc';
 
-            $query = new SportModel();
+            $query = SportModel::query();
             if (!empty($params['data_id'])) {
                 $query = $query->where('data_id', $params['data_id']);
             }
@@ -145,17 +145,20 @@ class Sport extends Controller
                     ->orWhere('league_en', 'like', "%{$league}%");
                 });
             }
-            if (isset($params['state']) && $params['state'] !== null) {
-                $query = $query->where('state', $params['state']);
-                if ($params['state'] >= 2) {
+            $stateFilter = $this->appliedQueryInt('state');
+            if ($stateFilter !== null) {
+                $query = $query->where('state', $stateFilter);
+                if ($stateFilter >= 2) {
                     $order = 'desc';
                 }
             }
-            if (isset($params['status']) && $params['status'] !== null) {
-                $query = $query->where('status', $params['status']);
+            $statusFilter = $this->appliedQueryInt('status');
+            if ($statusFilter !== null) {
+                $query = $query->where('status', $statusFilter);
             }
-            if (isset($params['is_locked']) && $params['is_locked'] !== null) {
-                $query = $query->where('is_locked', $params['is_locked']);
+            $isLockedFilter = $this->appliedQueryInt('is_locked');
+            if ($isLockedFilter !== null) {
+                $query = $query->where('is_locked', $isLockedFilter);
             }
             if (!empty($params['start_time'])) {
                 $query = $query->where('game_time', '>=', strtotime($params['start_time'].' 00:00:00'));
@@ -163,8 +166,9 @@ class Sport extends Controller
             if (!empty($params['end_time'])) {
                 $query = $query->where('game_time', '<', strtotime($params['end_time'].' 23:59:59'));
             }
-            if (isset($params['error']) && $params['error'] !== null) {
-                $query = $query->where('error', $params['error']);
+            $errorFilter = $this->appliedQueryInt('error');
+            if ($errorFilter !== null) {
+                $query = $query->where('error', $errorFilter);
                 $order = 'desc';
             }
             if (isset($params['odds'])) {
@@ -174,8 +178,9 @@ class Sport extends Controller
                     $query = $query->whereNull('odds');
                 }
             }
-            if (isset($params['is_rec']) && $params['is_rec'] !== null) {
-                $query = $query->where('is_rec', $params['is_rec']);
+            $isRecFilter = $this->appliedQueryInt('is_rec');
+            if ($isRecFilter !== null) {
+                $query = $query->where('is_rec', $isRecFilter);
             }
 
             $count = $query->count();
@@ -184,10 +189,12 @@ class Sport extends Controller
                 ->orderBy('game_time', $order)
                 ->orderBy('is_roll', 'desc')
                 ->get();
+            $stateLabels = [0 => '未开始', 1 => '进行中', 2 => '已结束', 3 => '延期', 4 => '取消'];
             foreach($list as &$item) {
                 $item['game_time'] = date('Y-m-d H:i:s', $item['game_time']);
                 $item['rbt'] = date('Y-m-d H:i:s', $item['rbt']);
                 $item['fixture_status'] = json_decode($item['fixture_status'], true);
+                $item['state_text'] = $stateLabels[(int) $item['state']] ?? (string) $item['state'];
                 
                 $item['home_team'] = SportTeam::getTeamName($item['home_team_id']) ?? $item['home_team_en'];
                 $item['guest_team'] = SportTeam::getTeamName($item['guest_team_id']) ?? $item['guest_team_en'];
@@ -392,6 +399,22 @@ class Sport extends Controller
         return $this->success($result);
     }
 
+    /**
+     * GET 查询整型筛选;0 为合法值,仅当 query 未带该键时不筛选。
+     */
+    private function appliedQueryInt(string $key): ?int
+    {
+        if (!request()->query->has($key)) {
+            return null;
+        }
+        $value = request()->query($key);
+        if ($value === null || $value === '') {
+            return null;
+        }
+
+        return (int) $value;
+    }
+
     private function doEvent($events, $data_id) {
         if (empty($events)) return [];
         $result = [];

+ 13 - 0
docs/前端交付/bot-28/后台/赛事列表-置顶筛选.md

@@ -9,9 +9,20 @@
 | 参数 | 类型 | 说明 |
 |---|---|---|
 | `is_rec` | int,可选 | `1` 仅置顶赛事;`0` 仅未置顶;不传或清空筛选项时不带该参数,表示不按置顶过滤 |
+| `state` | int,可选 | `0` 未开始,`1` 进行中,`2` 已结束… 与页签/筛选项同时生效,可与 `is_rec` 组合 |
 
 与其它整型筛选项(如 `state`、`is_locked`)一致:下拉清空后请求里不要传 `is_rec=""`,避免校验失败。
 
+组合示例(置顶且未开始):
+
+```http
+GET /admin/sport/list?page=1&limit=15&is_rec=1&state=0
+```
+
+**注意:`state=0` 必须出现在 URL 上。** 前端组装参数时不要用 `if (params.state)` 或 `if (params.is_rec)` 这类判断,否则 `0` 会被当成“未传”而丢掉 `state` 条件,列表会混入进行中赛事。
+
+赛程状态列请用返回的 **`state` / `state_text`**(与筛选字段一致)。`fixture_status.long` 可能滞后于 `state`,单独展示会出现“筛未开始却显示进行中”的错觉。
+
 示例:
 
 ```http
@@ -24,6 +35,8 @@ GET /admin/sport/list?page=1&limit=15&is_rec=0
 | 字段 | 说明 |
 |---|---|
 | `data.data[].is_rec` | `1` 置顶,`0` 未置顶 |
+| `data.data[].state` | 与筛选 `state` 一致:`0` 未开始,`1` 进行中… |
+| `data.data[].state_text` | 上列中文文案,便于表格展示 |
 
 ## 批量设置置顶