feat(api, i18n): add admin report job functionalities and enhance locale support

- Introduced new API functions for managing admin report jobs, including download and post operations.
- Updated English, Nepali, and Chinese locale files to include new messages related to report job actions and rollback confirmations.
- Enhanced user experience by providing clearer instructions and feedback in the admin interface.
- Refactored related components to integrate new functionalities and improve overall usability.
This commit is contained in:
2026-05-26 11:48:51 +08:00
parent 7fb5ec6dff
commit a76b681828
21 changed files with 1139 additions and 118 deletions

View File

@@ -56,7 +56,7 @@ const ROUTE_PATTERNS: RoutePattern[] = [
},
{
test: (p) => /^\/admin\/draws\/\d+\/risk\/occupancy$/.test(p) || /^\/admin\/risk\/draws\/\d+\/occupancy$/.test(p),
resolve: () => ({ ns: "draws", key: "subnav.riskOccupancy" }),
resolve: () => ({ ns: "draws", key: "subnav.riskLockLogs" }),
},
{
test: (p) => /^\/admin\/draws\/\d+\/risk\/hot$/.test(p) || /^\/admin\/risk\/draws\/\d+\/hot$/.test(p),

View File

@@ -0,0 +1,89 @@
export type ReportFilterSnapshot = {
dateFrom: string;
dateTo: string;
playerId: number | null;
play: string;
operatorId: number | null;
drawId: number | null;
drawNo: string;
number: string;
};
/** UI report keys used in reports-console */
export type ReportUiKey =
| "draw_profit"
| "daily_profit"
| "player_win_loss"
| "player_transfer"
| "hot_number_risk"
| "play_dimension"
| "sold_out_number"
| "rebate_commission"
| "admin_audit";
/** Maps UI keys to POST /admin/report-jobs `report_type` */
export const REPORT_UI_TO_JOB_TYPE: Record<ReportUiKey, string> = {
draw_profit: "draw_profit_summary",
daily_profit: "daily_profit_summary",
player_win_loss: "player_win_loss",
player_transfer: "wallet_transfer_report",
hot_number_risk: "hot_number_risk_report",
play_dimension: "play_dimension_report",
sold_out_number: "sold_out_number_report",
rebate_commission: "rebate_commission_report",
admin_audit: "audit_operation_report",
};
/** Report types with full server-side export (POST /admin/report-jobs). */
export const REPORT_UI_SERVER_FULL_EXPORT = new Set<ReportUiKey>([
"draw_profit",
"daily_profit",
"player_win_loss",
"player_transfer",
"hot_number_risk",
"play_dimension",
"sold_out_number",
"rebate_commission",
"admin_audit",
]);
export function buildReportJobParameters(
key: ReportUiKey,
filters: ReportFilterSnapshot,
): Record<string, unknown> {
const params: Record<string, unknown> = {};
if (filters.dateFrom) {
params.date_from = filters.dateFrom;
}
if (filters.dateTo) {
params.date_to = filters.dateTo;
}
if (filters.playerId != null && filters.playerId > 0) {
params.player_id = filters.playerId;
}
if (filters.operatorId != null && filters.operatorId > 0) {
params.operator_id = filters.operatorId;
}
if (filters.play.trim()) {
params.play_code = filters.play.trim();
}
if (key === "draw_profit" || key === "hot_number_risk" || key === "sold_out_number") {
if (filters.drawId != null && filters.drawId > 0) {
params.draw_id = filters.drawId;
}
if (filters.drawNo.trim()) {
params.draw_no = filters.drawNo.trim();
}
}
if (key === "hot_number_risk" && filters.number.trim()) {
const digits = filters.number.trim();
if (/^\d{4}$/.test(digits)) {
params.normalized_number = digits;
}
}
return params;
}