Files
thebet365/apps/admin/src/views/agent-form.ts
Mars 414998ce36 feat(admin,api,player): 代理层级管理、额度上下分与玩家钱包详情
新增代理管理器与二级代理体系,完善信用额度/上下分上下文与冻结策略;代理端玩家与子代理管理增强;玩家端新增钱包详情页与交易筛选优化。

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-06-08 15:34:12 +08:00

170 lines
4.1 KiB
TypeScript

import { FormValidationError } from '../i18n/form-validation';
export interface PromotableUserOption {
id: string;
username: string;
status: string;
parentId: string | null;
parentUsername: string | null;
phone: string | null;
email: string | null;
}
export interface AgentCreateForm {
userId: string;
creditLimit: number;
cashbackRate: number;
maxSingleDeposit: number;
maxDailyDeposit: number;
phone: string;
email: string;
}
export interface AgentEditForm {
id: string;
username: string;
status: string;
phone: string;
email: string;
cashbackRate: number;
maxSingleDeposit: number;
maxDailyDeposit: number;
managedPassword: string | null;
newPassword: string;
loginFailCount: number;
lastLoginAt: string | null;
creditLimit: string;
usedCredit: string;
availableCredit: string;
directPlayerCount: number;
childAgentCount: number;
level: number;
parentUsername: string | null;
createdAt: string;
}
export interface AgentRow {
userId: string;
username: string;
userStatus: string;
level: number;
status: string;
creditLimit: string;
usedCredit: string;
availableCredit: string;
directPlayerCount: number;
childAgentCount: number;
cashbackRate: string;
maxSingleDeposit: string | null;
maxDailyDeposit: string | null;
phone: string | null;
email: string | null;
locale: string;
createdAt: string;
}
export interface AgentDetail extends AgentRow {
parentAgentId: string | null;
parentUsername: string | null;
directPlayerLiability: string;
childAgentExposure: string;
managedPassword: string | null;
loginFailCount: number;
lastLoginAt: string | null;
updatedAt: string;
recentCreditTransactions: {
id: string;
transactionType: string;
amount: string;
creditBefore: string;
creditAfter: string;
remark: string | null;
createdAt: string;
}[];
}
export function emptyAgentCreateForm(): AgentCreateForm {
return {
userId: '',
creditLimit: 50000,
cashbackRate: 0,
maxSingleDeposit: 0,
maxDailyDeposit: 0,
phone: '',
email: '',
};
}
export function emptyAgentEditForm(): AgentEditForm {
return {
id: '',
username: '',
status: 'ACTIVE',
phone: '',
email: '',
cashbackRate: 0,
maxSingleDeposit: 0,
maxDailyDeposit: 0,
managedPassword: null,
newPassword: '',
loginFailCount: 0,
lastLoginAt: null,
creditLimit: '0',
usedCredit: '0',
availableCredit: '0',
directPlayerCount: 0,
childAgentCount: 0,
level: 1,
parentUsername: null,
createdAt: '',
};
}
export function editFormFromAgentDetail(d: AgentDetail): AgentEditForm {
return {
id: d.userId,
username: d.username,
status: d.status,
phone: d.phone ?? '',
email: d.email ?? '',
cashbackRate: Number(d.cashbackRate),
maxSingleDeposit: d.maxSingleDeposit ? Number(d.maxSingleDeposit) : 0,
maxDailyDeposit: d.maxDailyDeposit ? Number(d.maxDailyDeposit) : 0,
managedPassword: d.managedPassword ?? null,
newPassword: '',
loginFailCount: d.loginFailCount ?? 0,
lastLoginAt: d.lastLoginAt ?? null,
creditLimit: d.creditLimit,
usedCredit: d.usedCredit,
availableCredit: d.availableCredit,
directPlayerCount: d.directPlayerCount,
childAgentCount: d.childAgentCount ?? 0,
level: d.level,
parentUsername: d.parentUsername ?? null,
createdAt: d.createdAt,
};
}
export function applyPromotableUserToForm(
form: AgentCreateForm,
user: PromotableUserOption,
): void {
form.userId = user.id;
form.phone = user.phone ?? '';
form.email = user.email ?? '';
}
export function buildCreateAgentPayload(form: AgentCreateForm) {
if (!form.userId) throw new FormValidationError('err.user_required');
if (form.creditLimit < 0) throw new FormValidationError('err.credit_negative');
return {
userId: form.userId,
creditLimit: form.creditLimit,
cashbackRate: form.cashbackRate,
maxSingleDeposit: form.maxSingleDeposit > 0 ? form.maxSingleDeposit : undefined,
maxDailyDeposit: form.maxDailyDeposit > 0 ? form.maxDailyDeposit : undefined,
phone: form.phone.trim() || undefined,
email: form.email.trim() || undefined,
};
}