feat: 新增玩家管理模块,完善钱包转账单操作能力

1. 重构玩家模块导航与元信息,将原玩家查询改为玩家列表
2. 新增完整的玩家CRUD API与前端管理页面,支持搜索、新建、编辑、删除玩家
3. 为转账单新增冲正与人工处理操作,补充状态显示与对应枚举
4. 优化用户列表表格空值展示与样式细节
5. 调整钱包子导航,移除旧的玩家钱包入口
This commit is contained in:
2026-05-14 10:42:43 +08:00
parent c4d566fc48
commit 2dfffd1fd1
9 changed files with 755 additions and 45 deletions

41
src/api/admin-player.ts Normal file
View File

@@ -0,0 +1,41 @@
import { adminRequest } from "@/lib/admin-http";
import { API_V1_PREFIX } from "./paths";
import type {
AdminPlayerListData,
AdminPlayerRow,
AdminPlayerCreatePayload,
AdminPlayerUpdatePayload,
AdminPlayerDeleteResult,
} from "@/types/api/admin-player";
const A = `${API_V1_PREFIX}/admin`;
export async function getAdminPlayers(params?: {
page?: number;
per_page?: number;
keyword?: string;
status?: number;
}): Promise<AdminPlayerListData> {
return adminRequest.get<AdminPlayerListData>(`${A}/players`, { params });
}
export async function getAdminPlayer(playerId: number): Promise<AdminPlayerRow> {
return adminRequest.get<AdminPlayerRow>(`${A}/players/${playerId}`);
}
export async function postAdminPlayer(body: AdminPlayerCreatePayload): Promise<AdminPlayerRow> {
return adminRequest.post<AdminPlayerRow>(`${A}/players`, body);
}
export async function putAdminPlayer(
playerId: number,
body: AdminPlayerUpdatePayload,
): Promise<AdminPlayerRow> {
return adminRequest.put<AdminPlayerRow>(`${A}/players/${playerId}`, body);
}
export async function deleteAdminPlayer(playerId: number): Promise<AdminPlayerDeleteResult> {
return adminRequest.delete<AdminPlayerDeleteResult>(`${A}/players/${playerId}`);
}

View File

@@ -64,3 +64,28 @@ export async function getAdminPlayerWallets(
`${A}/players/${playerId}/wallets`,
);
}
export type TransferOrderActionResult = {
transfer_no: string;
status: string;
};
export async function reverseTransferOrder(
transferNo: string,
remark?: string,
): Promise<TransferOrderActionResult> {
return adminRequest.post<TransferOrderActionResult>(
`${A}/wallet/transfer-orders/${transferNo}/reverse`,
remark ? { remark } : {},
);
}
export async function manuallyProcessTransferOrder(
transferNo: string,
remark?: string,
): Promise<TransferOrderActionResult> {
return adminRequest.post<TransferOrderActionResult>(
`${A}/wallet/transfer-orders/${transferNo}/manually-process`,
remark ? { remark } : {},
);
}