feat: WC2026 赛事 seed、生产上线初始化脚本与目录归档

重构 seed 为 WC2026 72 场小组赛与 48 强优胜盘;新增 production 模式仅保留 admin 与赛事示例;提供 prod-init-db 全量重置脚本;管理端 i18n 分包与赛事归档能力。

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
2026-06-12 18:17:00 +08:00
parent 8f14e85ebd
commit e7e938f261
94 changed files with 12332 additions and 976 deletions

View File

@@ -19,6 +19,11 @@ export const API_ERROR_MESSAGES = {
'en-US': 'Account disabled',
'ms-MY': 'Akaun telah dinyahaktifkan',
},
ACCOUNT_SUSPENDED: {
'zh-CN': '账号已冻结',
'en-US': 'Account suspended',
'ms-MY': 'Akaun digantung',
},
AGENT_ACCOUNT_SUSPENDED: {
'zh-CN': '代理账号已停用',
'en-US': 'Agent account suspended',
@@ -89,10 +94,15 @@ export const API_ERROR_MESSAGES = {
'en-US': 'League not found',
'ms-MY': 'Liga tidak dijumpai',
},
LEAGUE_UNPUBLISH_FORBIDDEN: {
'zh-CN': '已发布的联赛不可下架',
'en-US': 'Published leagues cannot be unpublished',
'ms-MY': 'Liga yang diterbitkan tidak boleh ditarik',
LEAGUE_UNPUBLISH_SETTLED: {
'zh-CN': '联赛冠军盘已结算,不可下架',
'en-US': 'Cannot unpublish league after outright market is settled',
'ms-MY': 'Liga tidak boleh ditarik selepas pasaran juara diselesaikan',
},
MATCH_UNPUBLISH_FORBIDDEN: {
'zh-CN': '当前状态不可下架',
'en-US': 'Match cannot be unpublished in current status',
'ms-MY': 'Perlawanan tidak boleh ditarik dalam status semasa',
},
TEAM_CODE_REQUIRED: {
'zh-CN': '请填写球队代码',
@@ -159,6 +169,21 @@ export const API_ERROR_MESSAGES = {
'en-US': 'Match has bets and cannot be deleted',
'ms-MY': 'Perlawanan mempunyai pertaruhan dan tidak boleh dipadam',
},
ARCHIVE_BLOCKED: {
'zh-CN': '存在未结注单或未结算状态,需确认强制删除',
'en-US': 'Unsettled bets or match state require forced archive',
'ms-MY': 'Pertaruhan belum selesai atau status perlawanan memerlukan arkib paksa',
},
LEAGUE_ARCHIVE_NOT_READY: {
'zh-CN': '联赛下仍有未结算赛事或未结注单,无法删除',
'en-US': 'League still has unsettled fixtures or pending bets',
'ms-MY': 'Liga masih mempunyai perlawanan belum selesai atau pertaruhan tertunda',
},
ALREADY_ARCHIVED: {
'zh-CN': '已删除或已隐藏',
'en-US': 'Already archived',
'ms-MY': 'Sudah diarkibkan',
},
MATCHES_ARRAY_REQUIRED: {
'zh-CN': '请提供 matches 数组',
'en-US': 'matches array is required',
@@ -194,6 +219,11 @@ export const API_ERROR_MESSAGES = {
'en-US': 'Pre-match betting only; match has started',
'ms-MY': 'Pertaruhan pra-perlawanan sahaja; perlawanan telah bermula',
},
CORRECT_SCORE_DISABLED: {
'zh-CN': '该赛事未开放波胆投注',
'en-US': 'Correct score betting is disabled for this match',
'ms-MY': 'Pertaruhan skor tepat tidak dibuka untuk perlawanan ini',
},
ODDS_CHANGED: {
'zh-CN': '赔率已变更,请重新确认',
'en-US': 'Odds changed, please confirm again',
@@ -289,6 +319,21 @@ export const API_ERROR_MESSAGES = {
'en-US': 'Player not found',
'ms-MY': 'Pemain tidak dijumpai',
},
NOT_PLAYER: {
'zh-CN': '该用户不是玩家',
'en-US': 'User is not a player',
'ms-MY': 'Pengguna bukan pemain',
},
PLAYER_HAS_PENDING_BETS: {
'zh-CN': '玩家仍有未结算注单,无法删除',
'en-US': 'Player has pending bets and cannot be deleted',
'ms-MY': 'Pemain masih ada pertaruhan belum selesai dan tidak boleh dipadam',
},
PLAYER_HAS_BALANCE: {
'zh-CN': '玩家钱包仍有余额,无法删除',
'en-US': 'Player wallet still has balance and cannot be deleted',
'ms-MY': 'Dompet pemain masih ada baki dan tidak boleh dipadam',
},
MANAGE_DIRECT_PLAYERS_ONLY: {
'zh-CN': '仅可管理直属玩家',
'en-US': 'Can only manage direct players',
@@ -609,6 +654,11 @@ export const API_ERROR_MESSAGES = {
'en-US': 'Invalid selection for this outright event',
'ms-MY': 'Pilihan tidak sah untuk outright ini',
},
OUTRIGHT_LEAGUE_FIXTURES_UNSETTLED: {
'zh-CN': '该联赛仍有未结算的单场赛事,请先完成单场结算后再结算冠军盘',
'en-US': 'This league still has unsettled fixture matches. Settle them before settling the outright market.',
'ms-MY': 'Liga ini masih ada perlawanan belum diselesaikan. Selesaikan dahulu sebelum juara.',
},
OUTRIGHT_EVENT_NOT_FOUND: {
'zh-CN': '冠军盘赛事不存在',
'en-US': 'Outright event not found',
@@ -794,6 +844,26 @@ export const API_ERROR_MESSAGES = {
'en-US': 'Order is not in pending status',
'ms-MY': 'Pesanan bukan dalam status menunggu',
},
ORDER_ALREADY_PENDING: {
'zh-CN': '订单已是待审核状态',
'en-US': 'Order is already pending review',
'ms-MY': 'Pesanan sudah menunggu semakan',
},
ORDER_NOT_APPROVED: {
'zh-CN': '仅已通过的充值订单可撤销',
'en-US': 'Only approved deposit orders can be revoked',
'ms-MY': 'Hanya pesanan deposit yang diluluskan boleh dibatalkan',
},
DEPOSIT_REVOKE_WINDOW_EXPIRED: {
'zh-CN': '批准已超过 5 分钟,无法撤回',
'en-US': 'Approval was more than 5 minutes ago; revoke is no longer allowed',
'ms-MY': 'Kelulusan melebihi 5 minit; pembatalan tidak dibenarkan',
},
DEPOSIT_REVOKE_SETTLED_BETS: {
'zh-CN': '批准后有注单已结算,无法撤回;请先处理相关注单',
'en-US': 'Bets placed after approval have already settled; revoke is blocked',
'ms-MY': 'Terdapat pertaruhan selepas kelulusan yang telah diselesaikan; pembatalan disekat',
},
REASON_REQUIRED: {
'zh-CN': '请填写拒绝原因',
'en-US': 'Rejection reason is required',