功能:選隊面板新增「同步今日場次」,從 history 表撈今天資料覆蓋本機場次

摘要:
- 選隊伍面板新增「同步今日場次」按鈕,按下後把每個人的今日場次更新成 DB 的數字
- 後端新增 GET /api/history/play-counts?from=&to=,回傳區間內每人上場場數與比賽數
- 按鈕上方顯示同步結果或錯誤訊息;手機版同步按鈕獨占一列

根本原因:
- 今日場次只存在本機 localStorage,跨裝置記分時其他裝置上傳的場次本機看不到,
  自動選擇與「今日 N 場」提示就不準

影響:
- 任一裝置按同步後,今日場次會與 DB history 表一致(以 DB 為準,覆蓋本機)
- 輪空/那個等佔位字不計場次

修法:
- server.mjs 新增 play-counts 端點,依 time 區間查 history.players 累計
- api.ts 新增 loadHistoryPlayCounts;App.tsx 以本機時區當天 00:00 起算 24 小時區間並 setPlayCounts
- ScoreboardPage 加入同步狀態與按鈕,App.css 調整按鈕列為三欄、≤720px 改兩列

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
2026-08-18 11:33:54 +08:00
co-authored by Claude Fable 5
parent d53ebbd3a8
commit 6ae1eda7e2
7 changed files with 186 additions and 1 deletions
+16
View File
@@ -3,6 +3,7 @@ import { NavLink, Route, Routes, useLocation, useNavigate } from 'react-router-d
import './App.css'
import {
createLiveRoom,
loadHistoryPlayCounts,
loadMatchResults,
releaseLiveRoom,
rememberCertNotAfter,
@@ -939,6 +940,20 @@ function App() {
})
}
// 從 DB 的 history 表撈今天(本機時區)的比賽,把每個人的今日場次覆蓋成 DB 的數字。
// 跨裝置記分時,其他裝置上傳的場次本機沒有紀錄,靠這個補齊。
const syncPlayCountsFromHistory = async () => {
const dayStart = new Date()
dayStart.setHours(0, 0, 0, 0)
const from = Math.floor(dayStart.getTime() / 1000)
const to = from + 24 * 60 * 60
const result = await loadHistoryPlayCounts(from, to)
setPlayCounts(result.counts)
return result
}
const skipUpload = () => {
void finalizeLiveRoom().finally(() => {
recordPlayedMatch()
@@ -1140,6 +1155,7 @@ function App() {
voiceAnnouncement={voiceAnnouncement}
targetDate={targetDate}
onApplyMatchup={applyMatchup}
onSyncPlayCounts={syncPlayCountsFromHistory}
onCloseFinishDialog={closeSettlementDialog}
onConfirmUpload={uploadSettledMatch}
onOpenFinishDialog={openSettlementDialog}