-
{{ t('bet.bet_no') || '注单号' }}
-
{{ detail.betNo }}
+
+
+ {{ detail.betNo }}
+ {{ statusLabel(detail.status) }}
-
- {{ t('common.status') || '状态' }}
-
- {{ statusLabel(detail.status) }}
-
-
-
- {{ t('bet.stake') || '投注额' }}
- {{ detail.stake }}
-
-
- {{ t('bet.potential_payout') || '预计派彩' }}
- {{ detail.potentialReturn || '-' }}
-
-
-
{{ t('bet.placed_at') || '下注时间' }}
-
{{ detail.placedAt ? new Date(detail.placedAt).toLocaleString() : '-' }}
+
+
+ {{ t('bet.stake') }}
+ {{ formatMoney(detail.stake, locale) }}
+
+
+ {{ t('bet.potential_payout') }}
+ {{ formatMoney(detail.potentialReturn, locale) }}
+
+
+ {{ t('bet.placed_at') }}
+
+ {{ detail.placedAt ? new Date(detail.placedAt).toLocaleString() : '-' }}
+
+
-
{{ t('bet.selections') || '投注选项' }}
-
-
-
{{ leg.matchTitle || t('bet.match') }}
-
- {{ leg.marketLabel || '' }} · {{ translateSel(leg.selectionName || '') }}
-
-
{{ t('history.ft') }}: {{ leg.score.ft }}
+
{{ t('bet.selections') }}
+
+
+
{{ idx + 1 }}
+
+ {{ leg.matchTitle || t('bet.match') }}
+
+ {{ leg.marketLabel }} ·
+ {{ translateSel(leg.selectionName || '') }}
+
+ {{ t('history.ft') }}: {{ leg.score.ft }}
+
+
+
+ @{{ leg.odds ?? '-' }}
+
+ {{ legResultIcon(leg.resultStatus) }}
+
-
@{{ leg.odds }}
-
{{ t('common.not_found') || '未找到记录' }}
+
{{ t('common.not_found') }}
@@ -187,19 +231,19 @@ function translateSel(name: string): string {
align-items: center;
justify-content: center;
padding: 24px;
- background: rgba(0, 0, 0, 0.7);
+ background: rgba(0, 0, 0, 0.65);
}
.modal-container {
width: 100%;
- max-width: 520px;
- max-height: 80vh;
+ max-width: 560px;
+ max-height: 82vh;
display: flex;
flex-direction: column;
- background: var(--desktop-sidebar-bg, rgba(20, 20, 20, 0.95));
- border: 1px solid var(--desktop-border, #262626);
- border-radius: 4px;
- box-shadow: 0 4px 24px rgba(0, 0, 0, 0.5);
+ background: var(--bg-card);
+ border: 1px solid var(--border);
+ border-radius: 10px;
+ box-shadow: 0 12px 40px rgba(0, 0, 0, 0.35);
overflow: hidden;
}
@@ -207,14 +251,14 @@ function translateSel(name: string): string {
display: flex;
align-items: center;
justify-content: space-between;
- padding: 12px 16px;
- border-bottom: 1px solid var(--desktop-border, #262626);
+ padding: 14px 18px;
+ border-bottom: 1px solid var(--border);
flex-shrink: 0;
}
.modal-title {
- font-size: 14px;
- font-weight: 700;
+ font-size: 15px;
+ font-weight: 800;
color: var(--text);
}
@@ -228,26 +272,23 @@ function translateSel(name: string): string {
line-height: 1;
}
-.modal-close:hover { color: var(--text); }
+.modal-close:hover {
+ color: var(--text);
+}
.modal-body {
flex: 1;
min-height: 0;
overflow-y: auto;
- padding: 0;
}
-.modal-loading {
- display: flex;
- justify-content: center;
- align-items: center;
- padding: 48px 0;
-}
-
-.modal-error {
+.modal-loading,
+.modal-error,
+.modal-empty {
display: flex;
flex-direction: column;
align-items: center;
+ justify-content: center;
gap: 10px;
padding: 48px 20px;
color: var(--text-muted);
@@ -255,84 +296,105 @@ function translateSel(name: string): string {
}
.retry-btn {
- padding: 6px 18px;
- border-radius: 4px;
- border: 1px solid var(--border-gold-soft, rgba(212,175,55,0.25));
+ padding: 7px 18px;
+ border-radius: 6px;
+ border: 1px solid var(--border-active);
background: transparent;
- color: var(--primary-light, #F0D875);
+ color: var(--primary-light);
font-size: 12px;
font-weight: 700;
cursor: pointer;
}
-.modal-empty {
+.summary-strip {
+ padding: 16px 18px;
+ border-bottom: 1px solid var(--border);
+ background: rgba(0, 102, 204, 0.04);
+}
+
+.summary-main {
display: flex;
align-items: center;
- justify-content: center;
- padding: 48px 20px;
- color: var(--text-muted);
- font-size: 13px;
+ gap: 10px;
+ margin-bottom: 14px;
}
-/* Info rows */
-.info-rows {
- border-bottom: 1px solid var(--desktop-border, #262626);
-}
-
-.info-row {
- display: flex;
- align-items: center;
- gap: 12px;
- padding: 10px 16px;
- border-bottom: 1px solid rgba(255, 255, 255, 0.04);
-}
-
-.info-row:last-child { border-bottom: none; }
-
-.row-label {
- width: 90px;
- flex-shrink: 0;
+.bet-no {
font-size: 12px;
- color: var(--text-muted);
- font-weight: 500;
-}
-
-.row-val {
- flex: 1;
- font-size: 13px;
font-weight: 700;
- color: var(--text);
+ color: var(--text-muted);
}
-.row-val.gold { color: var(--primary-light, #F0D875); }
-.row-val.muted { color: var(--text-muted); font-weight: 500; }
+.summary-metrics {
+ display: grid;
+ grid-template-columns: repeat(3, minmax(0, 1fr));
+ gap: 12px;
+}
-.mono { font-family: 'SF Mono', 'Consolas', monospace; font-size: 12px; }
+.metric {
+ display: flex;
+ flex-direction: column;
+ gap: 4px;
+ min-width: 0;
+}
+
+.metric-label {
+ font-size: 10px;
+ font-weight: 700;
+ text-transform: uppercase;
+ letter-spacing: 0.05em;
+ color: var(--text-muted);
+}
+
+.metric-val {
+ font-size: 14px;
+ font-weight: 800;
+ color: var(--text);
+ font-variant-numeric: tabular-nums;
+}
+
+.metric-val.accent {
+ color: var(--primary);
+}
+
+.metric-val.muted {
+ font-size: 12px;
+ font-weight: 600;
+ color: var(--text-muted);
+}
+
+.mono {
+ font-family: 'SF Mono', 'Consolas', monospace;
+}
.st-badge {
display: inline-block;
padding: 2px 10px;
- border-radius: 2px;
+ border-radius: 999px;
font-size: 11px;
font-weight: 700;
}
-.st-won { background: rgba(52,199,89,0.12); color: #4cd964; }
-.st-lost { background: rgba(255,69,58,0.12); color: #ff453a; }
-.st-pending { background: rgba(212,175,55,0.12); color: var(--primary-light); }
-.st-push { background: rgba(100,100,100,0.12); color: #aaa; }
-.st-default { background: rgba(100,100,100,0.1); color: #888; }
+.st-won { background: rgba(52, 199, 89, 0.12); color: #4cd964; }
+.st-lost { background: rgba(255, 69, 58, 0.12); color: #ff453a; }
+.st-pending { background: rgba(0, 102, 204, 0.12); color: var(--primary-light); }
+.st-push { background: rgba(100, 100, 100, 0.12); color: #aaa; }
+.st-cancelled { background: rgba(100, 100, 100, 0.1); color: #888; }
+.st-default { background: rgba(100, 100, 100, 0.1); color: #888; }
-/* Selections */
-.sel-section { padding: 12px 16px 16px; }
+.sel-section {
+ padding: 14px 18px 18px;
+}
.sel-section-title {
- font-size: 12px;
- font-weight: 700;
+ font-size: 11px;
+ font-weight: 800;
color: var(--text-muted);
- margin-bottom: 8px;
+ text-transform: uppercase;
+ letter-spacing: 0.06em;
+ margin-bottom: 10px;
padding-bottom: 8px;
- border-bottom: 1px solid var(--desktop-border, #262626);
+ border-bottom: 1px solid var(--border);
}
.sel-item {
@@ -340,11 +402,34 @@ function translateSel(name: string): string {
align-items: flex-start;
justify-content: space-between;
gap: 12px;
- padding: 10px 0;
- border-bottom: 1px solid rgba(255,255,255,0.04);
+ padding: 12px 0;
+ border-bottom: 1px solid rgba(0, 0, 0, 0.04);
}
-.sel-item:last-child { border-bottom: none; }
+.sel-item:last-child {
+ border-bottom: none;
+}
+
+.sel-item-left {
+ display: flex;
+ align-items: flex-start;
+ gap: 10px;
+ min-width: 0;
+}
+
+.sel-index {
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ width: 22px;
+ height: 22px;
+ border-radius: 50%;
+ background: var(--bg-hover);
+ font-size: 11px;
+ font-weight: 700;
+ color: var(--text-muted);
+ flex-shrink: 0;
+}
.sel-item-main {
display: flex;
@@ -369,15 +454,36 @@ function translateSel(name: string): string {
color: var(--text-muted);
}
+.sel-item-right {
+ display: flex;
+ align-items: center;
+ gap: 8px;
+ flex-shrink: 0;
+}
+
.sel-item-odds {
font-size: 13px;
font-weight: 800;
- color: var(--primary-light, #F0D875);
- flex-shrink: 0;
+ color: var(--primary);
font-family: 'SF Mono', 'Consolas', monospace;
}
-/* Transition */
+.leg-result {
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ width: 22px;
+ height: 22px;
+ border-radius: 50%;
+ font-size: 12px;
+ font-weight: 800;
+}
+
+.leg-won { background: rgba(52, 199, 89, 0.15); color: #4cd964; }
+.leg-lost { background: rgba(255, 69, 58, 0.15); color: #ff453a; }
+.leg-push { background: rgba(100, 100, 100, 0.15); color: #aaa; }
+.leg-pending { background: rgba(0, 102, 204, 0.1); color: var(--primary-light); font-size: 10px; }
+
.modal-fade-enter-active,
.modal-fade-leave-active {
transition: opacity 0.15s ease;
@@ -387,4 +493,10 @@ function translateSel(name: string): string {
.modal-fade-leave-to {
opacity: 0;
}
+
+@media (max-width: 640px) {
+ .summary-metrics {
+ grid-template-columns: 1fr;
+ }
+}
diff --git a/apps/player/src/components/desktop/DesktopCashbackDetailModal.vue b/apps/player/src/components/desktop/DesktopCashbackDetailModal.vue
new file mode 100644
index 0000000..b578746
--- /dev/null
+++ b/apps/player/src/components/desktop/DesktopCashbackDetailModal.vue
@@ -0,0 +1,234 @@
+
+
+
+
+
+
+
+
+
+
+
{{ formatMoney(record.amount, locale) }}
+
{{ formatPeriod(record.periodStart, record.periodEnd) }}
+
+
+
+ {{ t('cashback.effective_stake') }}
+ {{ formatMoneyCompact(record.effectiveStake, locale) }}
+
+
+ {{ t('cashback.rate') }}
+ {{ formatRate(record.rate) }}
+
+
+ {{ t('nav.bet_history') }}
+ {{ t('cashback.bet_count', { n: record.betCount }) }}
+
+
+ {{ t('cashback.batch_no') }}
+ {{ record.batchNo }}
+
+
+ {{ t('wallet.time') }}
+ {{ formatTime(record.confirmedAt ?? record.createdAt) }}
+
+
+
+
+
{{ t('common.not_found') }}
+
+
+
+
+
+
+
diff --git a/apps/player/src/components/desktop/DesktopRechargeDetailModal.vue b/apps/player/src/components/desktop/DesktopRechargeDetailModal.vue
new file mode 100644
index 0000000..885a8a1
--- /dev/null
+++ b/apps/player/src/components/desktop/DesktopRechargeDetailModal.vue
@@ -0,0 +1,566 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ detail.orderNo }}
+ {{ statusLabel(detail.status) }}
+
+
{{ formatMoney(detail.amount, locale) }}
+
{{ methodLabel(detail) }}
+
+
+
+
+ {{ t('recharge.credited') }}
+ {{ formatMoney(detail.approvedAmount, locale) }}
+
+
+ {{ t('recharge.apply_time') }}
+ {{ new Date(detail.createdAt).toLocaleString() }}
+
+
+ {{ t('recharge.review_time') }}
+ {{ new Date(detail.reviewedAt).toLocaleString() }}
+
+
+ {{ orderNote(detail)!.label }}
+
+ {{ orderNote(detail)!.text }}
+
+
+
+
+
+
{{ t('recharge.audit_title') }}
+
+
+
+
+
+
+
+ {{ auditActionLabel(entry.log.action) }}
+
+
+
{{ entry.actor }}
+
+ {{ t('recharge.audit_credited') }} {{ formatMoney(entry.log.approvedAmount, locale) }}
+
+
+ {{ t('recharge.reject_reason') }}
+ {{ entry.remark.text }}
+
+
+ {{ auditNoteDisplayText(entry.remark) }}
+
+
+
+
+
+
+
+
+
+
+
{{ t('common.not_found') }}
+
+
+
+
+
+
+
+
diff --git a/apps/player/src/components/desktop/DesktopTxDetailModal.vue b/apps/player/src/components/desktop/DesktopTxDetailModal.vue
index c0c4914..62973be 100644
--- a/apps/player/src/components/desktop/DesktopTxDetailModal.vue
+++ b/apps/player/src/components/desktop/DesktopTxDetailModal.vue
@@ -1,10 +1,11 @@
-
+
@@ -93,51 +129,59 @@ function txLabel(tx: TxDetail): string {
{{ t('common.load_failed') }}
-
+
+
+ {{ formatMoney(detail.amount, locale) }}
+
+ {{ txLabel(detail) }}
+
- {{ t('wallet.type') || '类型' }}
- {{ txLabel(detail) }}
-
-
- {{ t('wallet.amount') || '金额' }}
- {{ formatMoney(detail.amount, locale) }}
-
-
- {{ t('wallet.note') || '备注' }}
+ {{ t('wallet.note') }}
{{ txSummaryLabel(detail, t) || '-' }}
- {{ t('wallet.balance_before') || '变动前余额' }}
+ {{ t('wallet.balance_before') }}
{{ formatMoney(detail.balanceBefore, locale) }}
- {{ t('wallet.balance_after') || '变动后余额' }}
+ {{ t('wallet.balance_after') }}
{{ formatMoney(detail.balanceAfter, locale) }}
-
-
{{ t('wallet.frozen_before') || '冻结前' }}
+
+ {{ t('wallet.frozen_before') }}
{{ formatMoney(detail.frozenBefore, locale) }}
-
-
{{ t('wallet.frozen_after') || '冻结后' }}
+
+ {{ t('wallet.frozen_after') }}
{{ formatMoney(detail.frozenAfter, locale) }}
- {{ t('wallet.time') || '时间' }}
+ {{ t('wallet.time') }}
{{ new Date(detail.createdAt).toLocaleString() }}
- {{ t('wallet.transaction_id') || '流水号' }}
+ {{ t('wallet.transaction_id') }}
{{ detail.transactionId }}
+
+
+
+
+
-
{{ t('common.not_found') || '未找到记录' }}
+
{{ t('common.not_found') }}
@@ -154,19 +198,19 @@ function txLabel(tx: TxDetail): string {
align-items: center;
justify-content: center;
padding: 24px;
- background: rgba(0, 0, 0, 0.7);
+ background: rgba(0, 0, 0, 0.65);
}
.modal-container {
width: 100%;
- max-width: 460px;
- max-height: 80vh;
+ max-width: 480px;
+ max-height: 82vh;
display: flex;
flex-direction: column;
- background: var(--desktop-sidebar-bg, rgba(20, 20, 20, 0.95));
- border: 1px solid var(--desktop-border, #262626);
- border-radius: 4px;
- box-shadow: 0 4px 24px rgba(0, 0, 0, 0.5);
+ background: var(--bg-card);
+ border: 1px solid var(--border);
+ border-radius: 10px;
+ box-shadow: 0 12px 40px rgba(0, 0, 0, 0.35);
overflow: hidden;
}
@@ -174,14 +218,14 @@ function txLabel(tx: TxDetail): string {
display: flex;
align-items: center;
justify-content: space-between;
- padding: 12px 16px;
- border-bottom: 1px solid var(--desktop-border, #262626);
+ padding: 14px 18px;
+ border-bottom: 1px solid var(--border);
flex-shrink: 0;
}
.modal-title {
- font-size: 14px;
- font-weight: 700;
+ font-size: 15px;
+ font-weight: 800;
color: var(--text);
}
@@ -195,26 +239,24 @@ function txLabel(tx: TxDetail): string {
line-height: 1;
}
-.modal-close:hover { color: var(--text); }
+.modal-close:hover {
+ color: var(--text);
+}
.modal-body {
flex: 1;
min-height: 0;
overflow-y: auto;
- padding: 0;
+ padding: 0 0 8px;
}
-.modal-loading {
- display: flex;
- justify-content: center;
- align-items: center;
- padding: 48px 0;
-}
-
-.modal-error {
+.modal-loading,
+.modal-error,
+.modal-empty {
display: flex;
flex-direction: column;
align-items: center;
+ justify-content: center;
gap: 10px;
padding: 48px 20px;
color: var(--text-muted);
@@ -222,44 +264,63 @@ function txLabel(tx: TxDetail): string {
}
.retry-btn {
- padding: 6px 18px;
- border-radius: 4px;
- border: 1px solid var(--border-gold-soft, rgba(212,175,55,0.25));
+ padding: 7px 18px;
+ border-radius: 6px;
+ border: 1px solid var(--border-active);
background: transparent;
- color: var(--primary-light, #F0D875);
+ color: var(--primary-light);
font-size: 12px;
font-weight: 700;
cursor: pointer;
}
-.modal-empty {
- display: flex;
- align-items: center;
- justify-content: center;
- padding: 48px 20px;
- color: var(--text-muted);
- font-size: 13px;
+.amount-hero {
+ padding: 20px 18px 8px;
+ font-size: 32px;
+ font-weight: 800;
+ font-variant-numeric: tabular-nums;
+ font-family: 'SF Mono', 'Consolas', monospace;
+ line-height: 1.1;
}
-/* Info rows */
-.info-rows { }
+.amount-hero.pos {
+ color: var(--primary);
+}
+
+.amount-hero.neg {
+ color: var(--danger);
+}
+
+.type-label {
+ padding: 0 18px 16px;
+ font-size: 13px;
+ font-weight: 700;
+ color: var(--text-muted);
+ border-bottom: 1px solid var(--border);
+}
+
+.info-rows {
+ padding: 4px 0;
+}
.info-row {
display: flex;
- align-items: center;
+ align-items: flex-start;
gap: 12px;
- padding: 10px 16px;
- border-bottom: 1px solid rgba(255, 255, 255, 0.04);
+ padding: 11px 18px;
+ border-bottom: 1px solid rgba(0, 0, 0, 0.04);
}
-.info-row:last-child { border-bottom: none; }
+.info-row:last-child {
+ border-bottom: none;
+}
.row-label {
- width: 100px;
+ width: 96px;
flex-shrink: 0;
font-size: 12px;
color: var(--text-muted);
- font-weight: 500;
+ font-weight: 600;
}
.row-val {
@@ -270,13 +331,41 @@ function txLabel(tx: TxDetail): string {
word-break: break-all;
}
-.row-val.pos { color: var(--primary-light, #F0D875); }
-.row-val.neg { color: var(--danger, #FF453A); }
-.row-val.muted { color: var(--text-muted); font-weight: 500; }
+.row-val.muted {
+ color: var(--text-muted);
+ font-weight: 600;
+}
-.mono { font-family: 'SF Mono', 'Consolas', monospace; font-size: 12px; }
+.mono {
+ font-family: 'SF Mono', 'Consolas', monospace;
+ font-size: 12px;
+}
+
+.link-actions {
+ display: flex;
+ flex-direction: column;
+ gap: 8px;
+ padding: 12px 18px 16px;
+ border-top: 1px solid var(--border);
+}
+
+.link-btn {
+ width: 100%;
+ padding: 9px 14px;
+ border-radius: 6px;
+ border: 1px solid var(--border-active);
+ background: rgba(0, 102, 204, 0.06);
+ color: var(--primary-light);
+ font-size: 12px;
+ font-weight: 700;
+ cursor: pointer;
+ text-align: left;
+}
+
+.link-btn:hover {
+ background: rgba(0, 102, 204, 0.12);
+}
-/* Transition */
.modal-fade-enter-active,
.modal-fade-leave-active {
transition: opacity 0.15s ease;
diff --git a/apps/player/src/i18n/en-US.ts b/apps/player/src/i18n/en-US.ts
index 05cfd76..860a4a1 100644
--- a/apps/player/src/i18n/en-US.ts
+++ b/apps/player/src/i18n/en-US.ts
@@ -305,6 +305,8 @@ export default {
transaction_detail: 'Transaction details',
balance_before: 'Balance before',
balance_after: 'Balance after',
+ frozen_before: 'Frozen before',
+ frozen_after: 'Frozen after',
transaction_id: 'Transaction ID',
detail_title: 'Wallet details',
recharge_btn: 'Deposit',
diff --git a/apps/player/src/i18n/ms-MY.ts b/apps/player/src/i18n/ms-MY.ts
index 925983d..9dde328 100644
--- a/apps/player/src/i18n/ms-MY.ts
+++ b/apps/player/src/i18n/ms-MY.ts
@@ -318,6 +318,8 @@ export default {
transaction_detail: 'Butiran transaksi',
balance_before: 'Baki sebelum',
balance_after: 'Baki selepas',
+ frozen_before: 'Beku sebelum',
+ frozen_after: 'Beku selepas',
transaction_id: 'ID transaksi',
detail_title: 'Butiran bil',
recharge_btn: 'Topup',
diff --git a/apps/player/src/i18n/zh-CN.ts b/apps/player/src/i18n/zh-CN.ts
index 21b48d0..7215626 100644
--- a/apps/player/src/i18n/zh-CN.ts
+++ b/apps/player/src/i18n/zh-CN.ts
@@ -305,6 +305,8 @@ export default {
transaction_detail: '交易详情',
balance_before: '变动前余额',
balance_after: '变动后余额',
+ frozen_before: '变动前冻结',
+ frozen_after: '变动后冻结',
transaction_id: '流水号',
detail_title: '账单明细',
recharge_btn: '充值',
diff --git a/apps/player/src/router/index.ts b/apps/player/src/router/index.ts
index cb49987..897dc72 100644
--- a/apps/player/src/router/index.ts
+++ b/apps/player/src/router/index.ts
@@ -42,6 +42,7 @@ const router = createRouter({
{ path: 'wallet/cashbacks', component: () => import('../views/CashbackRecordsView.vue'), meta: { requiresAuth: true } },
{ path: 'wallet/recharge', component: () => import('../views/RechargeView.vue'), meta: { requiresAuth: true } },
{ path: 'wallet/recharge/history', component: () => import('../views/RechargeHistoryView.vue'), meta: { requiresAuth: true } },
+ { path: 'wallet/recharge/history/:id', component: () => import('../views/RechargeDetailView.vue'), meta: { requiresAuth: true } },
{ path: 'wallet/transactions/:transactionId', component: () => import('../views/WalletTransactionDetailView.vue'), meta: { requiresAuth: true } },
{ path: 'profile', redirect: '/wallet' },
{ path: 'profile/cashbacks', redirect: '/wallet/cashbacks' },
diff --git a/apps/player/src/styles/desktop/records.css b/apps/player/src/styles/desktop/records.css
index a4b55b5..624a914 100644
--- a/apps/player/src/styles/desktop/records.css
+++ b/apps/player/src/styles/desktop/records.css
@@ -208,10 +208,23 @@
transition: background 0.15s;
}
-.desktop-records-table tbody tr.hover-row:hover {
+.desktop-records-table tbody tr.clickable-row {
+ cursor: pointer;
+}
+
+.desktop-records-table tbody tr.hover-row:hover,
+.desktop-records-table tbody tr.clickable-row:hover {
background: rgba(0, 102, 204, 0.06);
}
+.desktop-records-table .id-cell {
+ color: var(--text);
+ font-weight: 700;
+ font-family: 'SF Mono', 'Consolas', monospace;
+ font-size: 12px;
+ letter-spacing: 0.03em;
+}
+
.desktop-records-table .num-cell {
text-align: right;
font-variant-numeric: tabular-nums;
diff --git a/apps/player/src/utils/depositOrderLookup.ts b/apps/player/src/utils/depositOrderLookup.ts
new file mode 100644
index 0000000..0b1d1d6
--- /dev/null
+++ b/apps/player/src/utils/depositOrderLookup.ts
@@ -0,0 +1,63 @@
+import api from '../api';
+
+export type DepositAuditLog = {
+ id: string;
+ action: string;
+ actorType: string;
+ statusBefore: string | null;
+ statusAfter: string;
+ amount: string | null;
+ approvedAmount: string | null;
+ remark: string | null;
+ createdAt: string;
+};
+
+export type PlayerDepositOrder = {
+ id: string;
+ orderNo: string;
+ paymentMethodId?: string;
+ methodType: string;
+ amount: string;
+ status: string;
+ approvedAmount: string | null;
+ rejectReason: string | null;
+ remark: string | null;
+ createdAt: string;
+ reviewedAt: string | null;
+ paymentMethodName: string | null;
+ bankName?: string | null;
+ auditLogs?: DepositAuditLog[];
+};
+
+export async function fetchDepositOrderAuditLogs(orderId: string): Promise
{
+ try {
+ const { data } = await api.get(`/player/deposit-orders/${orderId}/audit-logs`);
+ const items = data.data?.items ?? data.data ?? [];
+ return Array.isArray(items) ? (items as DepositAuditLog[]) : [];
+ } catch {
+ return [];
+ }
+}
+
+export async function enrichDepositOrder(order: PlayerDepositOrder): Promise {
+ if (order.auditLogs?.length) return order;
+ const auditLogs = await fetchDepositOrderAuditLogs(order.id);
+ return auditLogs.length ? { ...order, auditLogs } : order;
+}
+
+export async function findDepositOrderById(orderId: string): Promise {
+ let page = 1;
+ const pageSize = 20;
+
+ while (true) {
+ const { data } = await api.get('/player/deposit-orders', { params: { page, pageSize } });
+ const result = data.data ?? { items: [], total: 0, pageSize };
+ const items = (result.items ?? []) as PlayerDepositOrder[];
+ const found = items.find((order) => order.id === orderId);
+ if (found) return enrichDepositOrder(found);
+
+ const total = result.total ?? 0;
+ if (!items.length || page * pageSize >= total) return null;
+ page += 1;
+ }
+}
diff --git a/apps/player/src/views/BetDetailView.vue b/apps/player/src/views/BetDetailView.vue
index 436662d..a4c94e0 100644
--- a/apps/player/src/views/BetDetailView.vue
+++ b/apps/player/src/views/BetDetailView.vue
@@ -1,10 +1,24 @@
+
-
-
+
diff --git a/apps/player/src/views/MobileRechargeHistoryView.vue b/apps/player/src/views/MobileRechargeHistoryView.vue
index 085a779..562f4bd 100644
--- a/apps/player/src/views/MobileRechargeHistoryView.vue
+++ b/apps/player/src/views/MobileRechargeHistoryView.vue
@@ -1,11 +1,12 @@
+
+
diff --git a/apps/player/src/views/WalletTransactionDetailView.vue b/apps/player/src/views/WalletTransactionDetailView.vue
index d2616df..f189455 100644
--- a/apps/player/src/views/WalletTransactionDetailView.vue
+++ b/apps/player/src/views/WalletTransactionDetailView.vue
@@ -1,10 +1,24 @@
+
-
-
+
diff --git a/apps/player/src/views/desktop/DesktopBetDetailView.vue b/apps/player/src/views/desktop/DesktopBetDetailView.vue
index fefdbd7..0c37af4 100644
--- a/apps/player/src/views/desktop/DesktopBetDetailView.vue
+++ b/apps/player/src/views/desktop/DesktopBetDetailView.vue
@@ -1,42 +1,25 @@
@@ -78,9 +125,9 @@ function statusLabel(status: string) {
@@ -92,42 +139,69 @@ function statusLabel(status: string) {
-
-
-