feat(admin+api+player): 优胜赛结算态、禁止新增单场与钱包流水展示优化

- API/管理端:优胜赛 SETTLED 后禁止新增单场,列表与子页展示结算状态
- 玩家端:已结算 outright 只读展示并高亮冠军
- 管理端:结算后 stale 标记驱动列表刷新;财务流水时间与备注 i18n 优化
- shared:txDisplayAmount 与 LEAGUE_OUTRIGHT_SETTLED 错误码
This commit is contained in:
2026-06-23 12:20:40 +08:00
parent ce84226219
commit d3c211411b
36 changed files with 525 additions and 128 deletions

View File

@@ -1,3 +1,5 @@
export { txDisplayAmount } from '@thebet365/shared';
export const TX_KEY_MAP: Record<string, string> = {
MANUAL_DEPOSIT: 'finance.tx.deposit',
ADMIN_DEPOSIT: 'finance.tx.admin_deposit',
@@ -64,3 +66,45 @@ export function walletDepositMethodLabel(
if (type === 'PLAYER_DEPOSIT') return t('finance.tx.player_deposit');
return '—';
}
const WALLET_REMARK_EXACT: Record<string, string> = {
'Agent deposit': 'finance.remark.agent_deposit',
'Agent withdraw': 'finance.remark.agent_withdraw',
'代理上分': 'finance.remark.agent_deposit',
'代理下分': 'finance.remark.agent_withdraw',
'管理员上分': 'finance.remark.admin_deposit',
'管理员下分': 'finance.remark.admin_withdraw',
'开户初始余额': 'finance.remark.initial_balance',
'Resettlement adjustment': 'finance.tx.resettle',
};
/** 钱包流水备注:系统英文/中文模板按当前语言展示 */
export function walletRemarkLabel(
remark: string | null | undefined,
transactionType: string,
t: (key: string, params?: Record<string, unknown>) => string,
): string {
const raw = remark?.trim();
if (!raw) {
if (transactionType === 'MANUAL_DEPOSIT') return t('finance.remark.agent_deposit');
if (transactionType === 'MANUAL_WITHDRAW') return t('finance.remark.agent_withdraw');
return '—';
}
const exactKey = WALLET_REMARK_EXACT[raw];
if (exactKey) return t(exactKey);
const revokeEn = raw.match(/^Revoke approved deposit\s+([A-Z0-9]+)$/i);
if (revokeEn) return t('finance.remark.revoke_deposit', { orderNo: revokeEn[1] });
const revokeZh = raw.match(/^撤销已通过充值\s+([A-Z0-9]+)$/);
if (revokeZh) return t('finance.remark.revoke_deposit', { orderNo: revokeZh[1] });
const depositOrder = raw.match(/^Deposit order\s+([A-Z0-9]+)$/i);
if (depositOrder) return t('finance.remark.deposit_order', { orderNo: depositOrder[1] });
const cashbackBatch = raw.match(/^Cashback batch\s+(.+)$/i);
if (cashbackBatch) return t('finance.remark.cashback_batch', { batchNo: cashbackBatch[1].trim() });
return raw;
}