feat(admin,api,player): 返水流程优化、账单详情与数据库重置

优化返水预览/确认/作废,新增玩家账变详情与后台一键重置为 seed 数据,并修复 dev 启动时 3000 端口占用。

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
2026-06-08 11:14:22 +08:00
parent 24fa1b275c
commit b2216abd0c
24 changed files with 2253 additions and 849 deletions

View File

@@ -63,6 +63,14 @@ export const adminPagesMs: Record<string, string> = {
'user.page_settings': 'Tetapan global',
'user.global_settings': 'Kata laluan & akaun (global)',
'user.global_settings_hint': 'Kawal sama ada semua pemain boleh ubah kata laluan/nama akaun dalam app',
'user.reset_database': 'Set semula pangkalan data',
'user.reset_database_hint': 'Padam semua data perniagaan dan pulihkan data demo awal. Tidak boleh dibatalkan.',
'user.reset_database_confirm_label': 'Taip RESET untuk sahkan',
'user.reset_database_confirm_ph': 'RESET',
'user.reset_database_btn': 'Set semula ke data awal',
'user.reset_database_disabled_prod': 'Dilumpuhkan dalam produksi melainkan ALLOW_DB_RESET=true',
'user.reset_database_success': 'Pangkalan data diset semula. Sila log masuk semula.',
'user.reset_database_accounts': 'Akaun demo',
'user.section.password_mgmt': 'Pengurusan kata laluan',
'user.field.current_password': 'Kata laluan semasa',
'user.msg.created_with_password': 'Pemain dicipta. Kata laluan: {password}',
@@ -226,7 +234,24 @@ export const adminPagesMs: Record<string, string> = {
'cashback.stat.players': 'Pemain',
'cashback.stat.total': 'Jumlah rebat',
'cashback.stat.lines': 'Baris butiran',
'cashback.stat.effective_stake': 'Jumlah stake berkesan',
'cashback.stat.bet_count': 'Bil. pertaruhan',
'cashback.stat.avg_rate': 'Kadar purata',
'cashback.batch_no': 'No. kelompok',
'cashback.history_title': 'Rekod rebat',
'cashback.history_empty': 'Tiada kelompok rebat',
'cashback.filter_status': 'Status',
'cashback.status.PREVIEW': 'Menunggu',
'cashback.status.CONFIRMED': 'Dibayar',
'cashback.col.period': 'Tempoh',
'cashback.col.status': 'Status',
'cashback.col.bet_count': 'Pertaruhan',
'cashback.col.created_at': 'Dicipta',
'cashback.col.confirmed_at': 'Dibayar pada',
'cashback.col.operator': 'Operator',
'cashback.view_detail': 'Butiran',
'cashback.detail_title': 'Butiran kelompok',
'cashback.detail_summary': 'Ringkasan kelompok',
'cashback.table_title': 'Butiran rebat pemain',
'cashback.table_total': 'Jumlah',
'cashback.empty_items': 'Tiada rebat layak dalam tempoh ini',
@@ -237,12 +262,16 @@ export const adminPagesMs: Record<string, string> = {
'cashback.col.rate': 'Kadar',
'cashback.col.amount': 'Rebat',
'cashback.confirm_issue': 'Sahkan bayaran',
'cashback.cancel_issue': 'Batalkan',
'cashback.confirm_prompt': 'Bayar rebat kelompok ini ke dompet pemain? Tindakan ini tidak boleh dibatalkan.',
'cashback.cancel_prompt': 'Batalkan kelompok menunggu ini? Tiada kredit dompet; boleh pratonton semula.',
'cashback.status.CANCELLED': 'Dibatalkan',
'cashback.rules_title': 'Peraturan rebat',
'cashback.rule_period': 'Pilih julat tarikh. Taruhan dikira mengikut masa penyelesaian dalam tempoh tersebut.',
'cashback.rule_eligible': 'Termasuk: taruhan selesai WON/LOST (tunggal ikut stake; parlay sekali ikut stake parlay). Tidak termasuk: belum selesai, dibatalkan, batal, push, dan kadar 0.',
'cashback.rule_formula': 'Setiap taruhan: stake × kadar rebat. Jumlah diagregat mengikut pemain.',
'cashback.rule_rate': 'Keutamaan kadar: pemain > ejen > global > kadar lalai ejen (cth. 0.01 = 1%).',
'cashback.rule_flow': 'Aliran: pratonton → semak jumlah → sahkan bayaran (kredit dompet, entri CASHBACK).',
'cashback.rule_flow': 'Aliran: pratonton (satu menunggu setiap tempoh) → semak → sahkan bayaran; batalkan jika tidak perlu. Tempoh dibayar tidak boleh pratonton semula.',
'cashback.rule_note_zero': 'Jika 0, semak taruhan WON/LOST dalam tempoh dan kadar rebat > 0.',
'user.field.player_id': 'ID pemain',
@@ -532,6 +561,9 @@ export const adminPagesMs: Record<string, string> = {
'msg.outright_teams_added': '{n} pasukan ditambah ({skipped} dilangkau)',
'msg.load_matches_failed': 'Gagal memuatkan perlawanan',
'msg.cashback_issued': 'Rebat telah dikeluarkan',
'msg.cashback_cancelled': 'Kelompok rebat dibatalkan',
'msg.cashback_preview_ready': 'Pratonton sedia — semak dan sahkan bayaran',
'msg.cashback_preview_replaced': 'Menggantikan {n} pratonton lama untuk tempoh ini',
'msg.freeze_confirm_title': '{action} akaun',
'msg.freeze_confirm_body': '{action} pemain "{name}"?{extra}',
'msg.freeze_extra': ' Mereka tidak akan dapat log masuk.',