feat(api, i18n): add agent_node_id to various admin queries and enhance multi-language support

Introduced the agent_node_id field in AdminDrawListQuery, AdminPlayerListQuery, AdminSettlementBatchListQuery, TicketItemsListQuery, and TransferOrderListQuery to improve filtering capabilities. Updated the admin-breadcrumb and admin-sidebar components to include new translations for agent-related terms in English, Nepali, and Chinese, enhancing the overall user experience and multi-language support across the admin interface.
This commit is contained in:
2026-06-02 14:37:08 +08:00
parent a4e7a2d228
commit b15e377187
105 changed files with 5305 additions and 1596 deletions

View File

@@ -24,6 +24,7 @@ import enTickets from "@/i18n/locales/en/tickets.json";
import enReconcile from "@/i18n/locales/en/reconcile.json";
import enReports from "@/i18n/locales/en/reports.json";
import enWallet from "@/i18n/locales/en/wallet.json";
import enAgents from "@/i18n/locales/en/agents.json";
import neAudit from "@/i18n/locales/ne/audit.json";
import neAdminUsers from "@/i18n/locales/ne/adminUsers.json";
import neAuth from "@/i18n/locales/ne/auth.json";
@@ -39,6 +40,7 @@ import neTickets from "@/i18n/locales/ne/tickets.json";
import neReconcile from "@/i18n/locales/ne/reconcile.json";
import neReports from "@/i18n/locales/ne/reports.json";
import neWallet from "@/i18n/locales/ne/wallet.json";
import neAgents from "@/i18n/locales/ne/agents.json";
import zhAudit from "@/i18n/locales/zh/audit.json";
import zhAdminUsers from "@/i18n/locales/zh/adminUsers.json";
import zhAuth from "@/i18n/locales/zh/auth.json";
@@ -54,12 +56,13 @@ import zhTickets from "@/i18n/locales/zh/tickets.json";
import zhReconcile from "@/i18n/locales/zh/reconcile.json";
import zhReports from "@/i18n/locales/zh/reports.json";
import zhWallet from "@/i18n/locales/zh/wallet.json";
import zhAgents from "@/i18n/locales/zh/agents.json";
export const ADMIN_SUPPORTED_LANGUAGES = ["en", "ne", "zh"] as const;
export type AdminLanguage = (typeof ADMIN_SUPPORTED_LANGUAGES)[number];
export const ADMIN_DEFAULT_LANGUAGE: AdminLanguage = "zh";
const namespaces = ["common", "auth", "dashboard", "audit", "draws", "settlement", "risk", "jackpot", "players", "tickets", "reconcile", "reports", "wallet", "adminUsers", "config"] as const;
const namespaces = ["common", "auth", "dashboard", "audit", "draws", "settlement", "risk", "jackpot", "players", "tickets", "reconcile", "reports", "wallet", "adminUsers", "agents", "config"] as const;
const resources = {
en: {
@@ -78,6 +81,7 @@ const resources = {
audit: enAudit,
settlement: enSettlement,
wallet: enWallet,
agents: enAgents,
},
ne: {
common: neCommon,
@@ -95,6 +99,7 @@ const resources = {
audit: neAudit,
settlement: neSettlement,
wallet: neWallet,
agents: neAgents,
},
zh: {
common: zhCommon,
@@ -112,6 +117,7 @@ const resources = {
audit: zhAudit,
settlement: zhSettlement,
wallet: zhWallet,
agents: zhAgents,
},
} satisfies Record<AdminLanguage, Record<(typeof namespaces)[number], Record<string, unknown>>>;

View File

@@ -0,0 +1,61 @@
{
"title": "Agents",
"treeTitle": "Agent tree",
"detailTitle": "Node details",
"selectNode": "Select an agent node from the tree",
"loadFailed": "Failed to load agent tree",
"siteLabel": "Site",
"createChild": "Add child agent",
"editNode": "Edit node",
"deleteNode": "Delete node",
"deleteNodeConfirm": "This action cannot be undone. Make sure the node has no children, users, or roles.",
"code": "Code",
"name": "Name",
"depth": "Depth",
"path": "Path",
"status": "Status",
"isRoot": "Root",
"createSuccess": "Created agent {{name}}",
"updateSuccess": "Updated {{name}}",
"deleteSuccess": "Deleted agent {{name}}",
"saveFailed": "Save failed",
"codeRequired": "Code and name are required",
"tabs": {
"overview": "Overview",
"roles": "Roles",
"users": "Accounts",
"delegation": "Delegation ceiling"
},
"delegation": {
"title": "Delegation ceiling",
"hint": "Select actions this child agent may grant to its own subordinates. Agent roles cannot exceed this ceiling.",
"permission": "Action",
"canDelegate": "May delegate further",
"save": "Save ceiling",
"saveSuccess": "Delegation ceiling saved",
"empty": "No actions available to assign",
"rootDenied": "Root nodes do not use delegation ceilings"
},
"roles": {
"title": "Agent roles",
"create": "Create role",
"permissions": "Permissions",
"slug": "Slug",
"userCount": "Users",
"createSuccess": "Created role {{name}}",
"updateSuccess": "Updated role {{name}}",
"deleteSuccess": "Deleted role {{name}}",
"permissionSaveSuccess": "Permissions updated",
"readOnlyTemplate": "Read-only template",
"permissionSubsetHint": "Only permissions you hold can be assigned"
},
"users": {
"title": "Agent accounts",
"create": "Create account",
"username": "Username",
"password": "Password",
"roles": "Roles",
"createSuccess": "Created account {{name}}",
"roleSaveSuccess": "Roles updated for {{name}}"
}
}

View File

@@ -125,6 +125,11 @@
"display": "Player",
"sitePlayerId": "Player ID"
},
"agentColumns": {
"agent": "Agent",
"filter": "Agent",
"filterAll": "All agents"
},
"toolbar": {
"defaultAdmin": "Administrator",
"notifications": "Notifications",
@@ -155,10 +160,19 @@
"settings": "Settings",
"account": "Account settings",
"integration": "Integration sites",
"agents": "Agents",
"config": "Operations config"
},
"sidebar": {
"workspace": "Workspace"
"workspace": "Workspace",
"group": {
"overview": "Overview",
"agent": "Agent organization",
"operations": "Operations",
"finance": "Finance & reports",
"rules": "Rules & parameters",
"platform": "Platform"
}
},
"auth": {
"checking": "Checking sign-in status…",

View File

@@ -178,7 +178,18 @@
"loadFailed": "Failed to load system settings",
"saveSuccess": "System settings saved",
"saveRuntimeSuccess": "Draw and settlement parameters saved",
"saveDrawSuccess": "Draw parameters saved",
"saveCurrencyFormatSuccess": "Currency display format saved",
"saveSettlementSuccess": "Settlement automation saved",
"saveFrontendSuccess": "Front-end display settings saved",
"sections": {
"draw": "Draw schedule and review",
"drawDescription": "Controls draw timing, close window, manual review, and cooldown. Only changed fields in this block are submitted.",
"currencyFormat": "Currency display format",
"currencyFormatDescription": "Decimals and separators for amounts across the site (separate from currency master data).",
"settlement": "Settlement automation",
"settlementDescription": "Controls whether tick auto-runs settlement, approval, and payout. Only changed fields in this block are submitted."
},
"saveFailed": "Failed to save system settings",
"unsavedChanges": "Unsaved changes",
"frontendConfig": "Front-end configuration",
@@ -217,6 +228,12 @@
"confirmSaveDescription": "This updates draw review, cooldown, auto settlement/approval/payout, and play-rules display. It may affect site-wide operation.",
"confirmSaveRuntimeTitle": "Save draw and settlement parameters?",
"confirmSaveRuntimeDescription": "This updates draw review, schedule timing, cooldown, and auto settlement/approval/payout. Play-rules HTML is not changed.",
"confirmSaveDrawTitle": "Save draw parameters?",
"confirmSaveDrawDescription": "This updates draw review, schedule timing, and cooldown in this block only.",
"confirmSaveCurrencyFormatTitle": "Save currency display format?",
"confirmSaveCurrencyFormatDescription": "This updates decimal places and separators.",
"confirmSaveSettlementTitle": "Save settlement automation?",
"confirmSaveSettlementDescription": "This updates auto settlement, approval, and payout switches.",
"confirmSaveFrontendTitle": "Save front-end display settings?",
"confirmSaveFrontendDescription": "This updates play-rules HTML on the player site. Draw and settlement logic are not changed."
},

View File

@@ -29,6 +29,7 @@
"granularityDay": "By day",
"playBreakdown": "Play breakdown",
"playRanking": "Top 5 plays",
"agentRanking": "Top 5 agents",
"rankingMetricLabel": "Ranking metric",
"rankingMetrics": {
"bet": "By bet amount",
@@ -37,6 +38,7 @@
},
"periodDistribution": "Period structure",
"noPlayData": "No play data in this period",
"noAgentData": "No agent data in this period",
"periods": {
"today": "Today",
"last_7_days": "Last 7 days",
@@ -90,6 +92,7 @@
"batchPendingDraws": "Draws involved",
"batchPendingDrawsCount": "{{count}} draws pending",
"platformLockedAndCap": "Site locked {{locked}} / cap {{cap}}",
"platformCapNotConfigured": "Site locked {{locked}} · cap not configured",
"platformOrderAndTicket": "Site-wide {{orders}} orders · {{tickets}} lines",
"platformBetTotal": "Lifetime bet",
"platformNoFinanceActivity": "No bets site-wide yet",

View File

@@ -2,10 +2,13 @@
"title": "Reconcile",
"createTitle": "Create reconcile job",
"createDesc": "Manually check abnormal transfers by date range and optional player. Scheduled reconciliation still runs automatically.",
"scopeTitle": "Define the reconcile scope",
"scopeDescription": "Choose the business type and date range first, then decide whether to narrow it to one player.",
"reconcileType": "Reconcile type",
"reconcileTypeFixed": "Wallet transfer (main site ⇄ lottery)",
"reconcileTypeHint": "Only wallet transfer is currently supported.",
"dateRange": "Reconcile date range",
"dateRangeHint": "Start with a shorter period to spot concentrated issues before widening the search.",
"createTask": "Create reconcile job",
"submitting": "Submitting…",
"loadFailed": "Failed to load",
@@ -20,13 +23,21 @@
"createSuccess": "Reconcile job created",
"createFailed": "Failed to create job",
"noCreatePermission": "Current account cannot create reconcile jobs.",
"playerScopeTitle": "Optionally narrow to one player",
"playerAllPlayersHint": "If no player is selected, the reconcile job will cover all players in the chosen date range.",
"createSummaryAll": "A manual reconcile will run for all players from {{from}} to {{to}}.",
"createSummaryPlayer": "A manual reconcile will run for player {{player}} from {{from}} to {{to}}.",
"jobsTitle": "Reconcile jobs",
"jobsDesc": "Use the action on the right to open paginated item details.",
"refresh": "Refresh",
"jobNo": "Job no.",
"type": "Type",
"status": "Status",
"itemCount": "Items",
"mismatchCount": "Mismatches",
"matchedCount": "Matched",
"period": "Period",
"finishedAt": "Finished at",
"createdAt": "Created at",
"operate": "Action",
"view": "View",
@@ -34,6 +45,7 @@
"sideARef": "Lottery ref",
"sideBRef": "Main site ref",
"differenceAmount": "Difference (cent)",
"detectedAt": "Detected at",
"noDetails": "No details",
"playerSearch": "Player (optional)",
"playerSearchPlaceholder": "Search by player ID / username / nickname",

View File

@@ -84,15 +84,109 @@
"subtitle": "Results appear below. Export as CSV or Excel.",
"empty": "No data. Adjust filters and try again.",
"exportableRows": "rows exportable",
"summaryScopeHint": "Except for the total record count, the stat cards above summarize the current preview page. Use full CSV/Excel export for full-range numbers.",
"scope": {
"currentPage": "Current page"
},
"columns": {
"primary": "",
"secondary": "",
"metricA": "",
"metricB": "",
"metricC": "",
"status": "",
"extra": "",
"time": ""
"primary": "Primary",
"secondary": "Secondary",
"metricA": "Metric A",
"metricB": "Metric B",
"metricC": "Metric C",
"status": "Status",
"extra": "Extra",
"time": "Time",
"drawProfit": {
"primary": "Draw / Batch",
"secondary": "Draw / Settlement status",
"metricA": "Orders / Tickets",
"metricB": "Tickets / Winners",
"metricC": "Bet / House P&L",
"status": "Payout / Jackpot",
"extra": "Batch count",
"time": "Finished"
},
"dailyProfit": {
"primary": "Business date",
"secondary": "Note",
"metricA": "Bet",
"metricB": "Payout",
"metricC": "House P&L",
"status": "Refund",
"extra": "Net",
"time": "Updated"
},
"playerWinLoss": {
"primary": "Player",
"secondary": "Player ID",
"metricA": "Bet",
"metricB": "Payout",
"metricC": "Net win/loss",
"status": "Tier",
"extra": "Note",
"time": "Time"
},
"playerTransfer": {
"primary": "Transfer no.",
"secondary": "Player",
"metricA": "Direction",
"metricB": "Status",
"metricC": "Amount",
"status": "External ref",
"extra": "Failure reason",
"time": "Created"
},
"hotNumberRisk": {
"primary": "Number / Log",
"secondary": "Draw / Action",
"metricA": "Cap / Amount",
"metricB": "Locked / Play",
"metricC": "Remaining / Ticket",
"status": "Sold out / Player",
"extra": "Usage / Reason",
"time": "Version / Time"
},
"playDimension": {
"primary": "Play",
"secondary": "Dimension",
"metricA": "Bet",
"metricB": "Payout",
"metricC": "House P&L",
"status": "Share",
"extra": "Note",
"time": "Time"
},
"soldOut": {
"primary": "Number",
"secondary": "Draw",
"metricA": "Cap",
"metricB": "Locked",
"metricC": "Remaining",
"status": "Sold out",
"extra": "Usage",
"time": "Version"
},
"rebateCommission": {
"primary": "Play",
"secondary": "Orders",
"metricA": "Rebate",
"metricB": "Ticket items",
"metricC": "Commission",
"status": "Rule hit",
"extra": "Note",
"time": "Time"
},
"adminAudit": {
"primary": "Log ID",
"secondary": "Operator type",
"metricA": "Operator ID",
"metricB": "Module",
"metricC": "Action",
"status": "Target type",
"extra": "IP",
"time": "Time"
}
},
"stats": {
"records": "Records",
@@ -179,7 +273,7 @@
},
"daily_profit": {
"title": "Daily P&L summary",
"summary": "Summarize bets, payouts, refunds, P&L, and net amount by date."
"summary": "Summarize bet amount, payout, and house P&L by business date. Refund and standalone net amount are not included yet."
},
"player_win_loss": {
"title": "Player win/loss report",

View File

@@ -0,0 +1,61 @@
{
"title": "Agents",
"treeTitle": "Agent tree",
"detailTitle": "Node details",
"selectNode": "Select an agent node from the tree",
"loadFailed": "Failed to load agent tree",
"siteLabel": "Site",
"createChild": "Add child agent",
"editNode": "Edit node",
"deleteNode": "Delete node",
"deleteNodeConfirm": "This action cannot be undone. Make sure the node has no children, users, or roles.",
"code": "Code",
"name": "Name",
"depth": "Depth",
"path": "Path",
"status": "Status",
"isRoot": "Root",
"createSuccess": "Created agent {{name}}",
"updateSuccess": "Updated {{name}}",
"deleteSuccess": "Deleted agent {{name}}",
"saveFailed": "Save failed",
"codeRequired": "Code and name are required",
"tabs": {
"overview": "Overview",
"roles": "Roles",
"users": "Accounts",
"delegation": "Delegation ceiling"
},
"delegation": {
"title": "Delegation ceiling",
"hint": "Select actions this child agent may grant to subordinates.",
"permission": "Action",
"canDelegate": "May delegate further",
"save": "Save ceiling",
"saveSuccess": "Delegation ceiling saved",
"empty": "No actions available",
"rootDenied": "Root nodes do not use delegation ceilings"
},
"roles": {
"title": "Agent roles",
"create": "Create role",
"permissions": "Permissions",
"slug": "Slug",
"userCount": "Users",
"createSuccess": "Created role {{name}}",
"updateSuccess": "Updated role {{name}}",
"deleteSuccess": "Deleted role {{name}}",
"permissionSaveSuccess": "Permissions updated",
"readOnlyTemplate": "Read-only template",
"permissionSubsetHint": "Only permissions you hold can be assigned"
},
"users": {
"title": "Agent accounts",
"create": "Create account",
"username": "Username",
"password": "Password",
"roles": "Roles",
"createSuccess": "Created account {{name}}",
"roleSaveSuccess": "Roles updated for {{name}}"
}
}

View File

@@ -125,6 +125,11 @@
"display": "खेलाडी",
"sitePlayerId": "खेलाडी ID"
},
"agentColumns": {
"agent": "एजेन्ट",
"filter": "एजेन्ट",
"filterAll": "सबै एजेन्ट"
},
"toolbar": {
"defaultAdmin": "प्रशासक",
"notifications": "सूचना",
@@ -155,10 +160,19 @@
"settings": "सेटिङ",
"account": "खाता सेटिङ",
"integration": "मुख्य साइट एकीकरण",
"agents": "एजेन्ट व्यवस्थापन",
"config": "सञ्चालन कन्फिगरेसन"
},
"sidebar": {
"workspace": "कार्यस्थान"
"workspace": "कार्यस्थान",
"group": {
"overview": "सारांश",
"agent": "एजेन्ट संगठन",
"operations": "दैनिक सञ्चालन",
"finance": "वित्त र रिपोर्ट",
"rules": "नियम र प्यारामिटर",
"platform": "प्लेटफर्म"
}
},
"auth": {
"checking": "लगइन स्थिति जाँच हुँदैछ…",

View File

@@ -29,6 +29,7 @@
"granularityDay": "दैनिक",
"playBreakdown": "प्ले विभाजन",
"playRanking": "शीर्ष ५ प्ले",
"agentRanking": "शीर्ष ५ एजेन्ट",
"rankingMetricLabel": "रैंकिङ मेट्रिक",
"rankingMetrics": {
"bet": "बेट रकम",
@@ -37,6 +38,7 @@
},
"periodDistribution": "अवधि संरचना",
"noPlayData": "यस अवधिमा प्ले डाटा छैन",
"noAgentData": "यस अवधिमा एजेन्ट डाटा छैन",
"periods": {
"today": "आज",
"last_7_days": "पछिल्लो ७ दिन",
@@ -90,6 +92,7 @@
"batchPendingDraws": "सम्बन्धित ड्रअ",
"batchPendingDrawsCount": "{{count}} ड्रअ पेन्डिङ",
"platformLockedAndCap": "साइट लक {{locked}} / क्याप {{cap}}",
"platformCapNotConfigured": "साइट लक {{locked}} · क्याप कन्फिगर गरिएको छैन",
"platformOrderAndTicket": "साइटव्यापी {{orders}} अर्डर · {{tickets}} लाइन",
"platformBetTotal": "जम्मा बेट",
"platformNoFinanceActivity": "साइटव्यापी अहिले बेट छैन",

View File

@@ -2,10 +2,13 @@
"title": "मिलान",
"createTitle": "म्यानुअल मिलान कार्य",
"createDesc": "मिति दायरा र वैकल्पिक खेलाडी चयनबाट असामान्य ट्रान्सफर म्यानुअल रूपमा जाँच गर्नुहोस्। scheduled reconciliation स्वतः चलिरहन्छ।",
"scopeTitle": "पहिले मिलानको दायरा तय गर्नुहोस्",
"scopeDescription": "पहिले व्यवसाय प्रकार र मिति दायरा रोज्नुहोस्, त्यसपछि आवश्यक परे एक खेलाडीमा सीमित गर्नुहोस्।",
"reconcileType": "मिलान प्रकार",
"reconcileTypeFixed": "वालेट ट्रान्सफर (मुख्य साइट ⇄ लटरी)",
"reconcileTypeHint": "हाल वालेट ट्रान्सफर मात्र समर्थित छ।",
"dateRange": "मिलान मिति दायरा",
"dateRangeHint": "पहिले छोटो समयावधि रोजेर समस्या कहाँ केन्द्रित छ हेर्नुहोस्, त्यसपछि आवश्यक परे दायरा बढाउनुहोस्।",
"createTask": "मिलान कार्य सिर्जना",
"submitting": "पेश हुँदैछ…",
"loadFailed": "लोड असफल भयो",
@@ -16,13 +19,21 @@
"createSuccess": "मिलान कार्य सिर्जना भयो",
"createFailed": "कार्य सिर्जना असफल भयो",
"noCreatePermission": "हालको खातासँग मिलान कार्य सिर्जना गर्ने अनुमति छैन।",
"playerScopeTitle": "आवश्यक परे एक खेलाडीमा सीमित गर्नुहोस्",
"playerAllPlayersHint": "खेलाडी नछानेमा, छनोट गरिएको मिति दायराभित्र सबै खेलाडीका लागि मिलान चलाइनेछ।",
"createSummaryAll": "{{from}} देखि {{to}} सम्म सबै खेलाडीका लागि म्यानुअल मिलान चलाइनेछ।",
"createSummaryPlayer": "खेलाडी {{player}} का लागि {{from}} देखि {{to}} सम्म म्यानुअल मिलान चलाइनेछ।",
"jobsTitle": "मिलान कार्यहरू",
"jobsDesc": "दायाँपट्टिको कार्यबाट विवरण खोल्नुहोस्।",
"refresh": "रिफ्रेस",
"jobNo": "कार्य नं.",
"type": "प्रकार",
"status": "स्थिति",
"itemCount": "विवरण संख्या",
"mismatchCount": "असंगति",
"matchedCount": "मेल खाएका",
"period": "अवधि",
"finishedAt": "समाप्त समय",
"createdAt": "सिर्जना समय",
"operate": "कार्य",
"view": "हेर्नुहोस्",
@@ -30,6 +41,7 @@
"sideARef": "लटरी साइड सन्दर्भ",
"sideBRef": "मुख्य साइट सन्दर्भ",
"differenceAmount": "अन्तर (cent)",
"detectedAt": "फेला परेको समय",
"noDetails": "विवरण छैन",
"playerSearch": "खेलाडी (वैकल्पिक)",
"playerSearchPlaceholder": "player ID / username / nickname बाट खोज्नुहोस्",

View File

@@ -84,15 +84,109 @@
"subtitle": "तल तालिकामा नतिजा देखिन्छ।",
"empty": "डाटा छैन।",
"exportableRows": "पङ्क्ति निर्यात योग्य",
"summaryScopeHint": "कुल रेकर्ड बाहेक माथिका कार्डहरू हालको पूर्वावलोकन पृष्ठको योग हुन्। पूर्ण दायराको संख्या चाहिँ पूर्ण CSV/Excel निर्यात प्रयोग गर्नुहोस्।",
"scope": {
"currentPage": "हालको पृष्ठ"
},
"columns": {
"primary": "",
"secondary": "",
"metricA": "",
"metricB": "",
"metricC": "",
"status": "",
"extra": "",
"time": ""
"primary": "मुख्य",
"secondary": "सहायक",
"metricA": "सूचक A",
"metricB": "सूचक B",
"metricC": "सूचक C",
"status": "स्थिति",
"extra": "थप",
"time": "समय",
"drawProfit": {
"primary": "ड्र / ब्याच",
"secondary": "ड्र / सेटलमेन्ट स्थिति",
"metricA": "अर्डर / टिकट",
"metricB": "टिकट / विजेता",
"metricC": "बेट / हाउस P&L",
"status": "पेआउट / ज्याकपोट",
"extra": "ब्याच संख्या",
"time": "समाप्त"
},
"dailyProfit": {
"primary": "व्यावसायिक मिति",
"secondary": "टिप्पणी",
"metricA": "बेट",
"metricB": "पेआउट",
"metricC": "हाउस P&L",
"status": "रिफन्ड",
"extra": "नेट",
"time": "अपडेट"
},
"playerWinLoss": {
"primary": "खेलाडी",
"secondary": "खेलाडी ID",
"metricA": "बेट",
"metricB": "पेआउट",
"metricC": "नेट जित/हार",
"status": "स्तर",
"extra": "टिप्पणी",
"time": "समय"
},
"playerTransfer": {
"primary": "ट्रान्सफर नं.",
"secondary": "खेलाडी",
"metricA": "दिशा",
"metricB": "स्थिति",
"metricC": "रकम",
"status": "बाह्य सन्दर्भ",
"extra": "असफल कारण",
"time": "सिर्जना"
},
"hotNumberRisk": {
"primary": "नम्बर / लग",
"secondary": "ड्र / कार्य",
"metricA": "क्याप / रकम",
"metricB": "लक / खेल",
"metricC": "बाँकी / टिकट",
"status": "सोल्ड आउट / खेलाडी",
"extra": "प्रयोग / कारण",
"time": "संस्करण / समय"
},
"playDimension": {
"primary": "खेल",
"secondary": "आयाम",
"metricA": "बेट",
"metricB": "पेआउट",
"metricC": "हाउस P&L",
"status": "अनुपात",
"extra": "टिप्पणी",
"time": "समय"
},
"soldOut": {
"primary": "नम्बर",
"secondary": "ड्र",
"metricA": "क्याप",
"metricB": "लक",
"metricC": "बाँकी",
"status": "सोल्ड आउट",
"extra": "प्रयोग",
"time": "संस्करण"
},
"rebateCommission": {
"primary": "खेल",
"secondary": "अर्डर",
"metricA": "रिबेट",
"metricB": "टिकट आइटम",
"metricC": "कमिसन",
"status": "नियम मिलान",
"extra": "टिप्पणी",
"time": "समय"
},
"adminAudit": {
"primary": "लग ID",
"secondary": "अपरेटर प्रकार",
"metricA": "अपरेटर ID",
"metricB": "मोड्युल",
"metricC": "कार्य",
"status": "लक्ष्य प्रकार",
"extra": "IP",
"time": "समय"
}
},
"stats": {
"records": "रेकर्ड",
@@ -179,7 +273,7 @@
},
"daily_profit": {
"title": "दैनिक P&L सारांश",
"summary": "मिति अनुसार बेट, पेआउट,िफन्ड, P&L र नेट रकम सारांश गर्नुहोस्।"
"summary": "व्यावसायिक मितिअनुसार बेट रकम, पेआउट र हाउस P&L सारांश गर्नुहोस्। रिफन्ड र छुट्टै नेट रकम अहिले समावेश छैन।"
},
"player_win_loss": {
"title": "खेलाडी जित/हार रिपोर्ट",

View File

@@ -0,0 +1,61 @@
{
"title": "代理管理",
"treeTitle": "代理树",
"detailTitle": "节点详情",
"selectNode": "请从左侧选择代理节点",
"loadFailed": "加载代理树失败",
"siteLabel": "站点",
"createChild": "添加下级代理",
"editNode": "编辑节点",
"deleteNode": "删除节点",
"deleteNodeConfirm": "删除后不可恢复,请确认该节点无下级、无账号、无角色绑定。",
"code": "编码",
"name": "名称",
"depth": "层级",
"path": "路径",
"status": "状态",
"isRoot": "根节点",
"createSuccess": "已创建代理 {{name}}",
"updateSuccess": "已更新 {{name}}",
"deleteSuccess": "已删除代理 {{name}}",
"saveFailed": "保存失败",
"codeRequired": "请填写编码与名称",
"tabs": {
"overview": "概况",
"roles": "角色",
"users": "账号",
"delegation": "下放权限"
},
"delegation": {
"title": "下放权限上限",
"hint": "勾选允许该下级代理继续下放的操作;保存后创建角色时不可超出此范围。",
"permission": "操作",
"canDelegate": "可继续下放",
"save": "保存上限",
"saveSuccess": "下放上限已保存",
"empty": "暂无可配置的操作",
"rootDenied": "根节点无需配置下放上限"
},
"roles": {
"title": "代理角色",
"create": "创建角色",
"permissions": "权限",
"slug": "标识",
"userCount": "人数",
"createSuccess": "已创建角色 {{name}}",
"updateSuccess": "已更新角色 {{name}}",
"deleteSuccess": "已删除角色 {{name}}",
"permissionSaveSuccess": "权限已更新",
"readOnlyTemplate": "只读模板",
"permissionSubsetHint": "只能分配您当前拥有的权限"
},
"users": {
"title": "代理账号",
"create": "创建账号",
"username": "登录名",
"password": "密码",
"roles": "角色",
"createSuccess": "已创建账号 {{name}}",
"roleSaveSuccess": "已更新 {{name}} 的角色"
}
}

View File

@@ -125,6 +125,11 @@
"display": "玩家",
"sitePlayerId": "玩家 ID"
},
"agentColumns": {
"agent": "所属代理",
"filter": "代理",
"filterAll": "全部代理"
},
"toolbar": {
"defaultAdmin": "管理员",
"notifications": "通知",
@@ -155,10 +160,19 @@
"settings": "系统设置",
"account": "账号设置",
"integration": "接入站点",
"agents": "代理管理",
"config": "运营配置"
},
"sidebar": {
"workspace": "工作台"
"workspace": "工作台",
"group": {
"overview": "总览",
"agent": "代理组织",
"operations": "日常运营",
"finance": "资金与报表",
"rules": "规则与参数",
"platform": "平台管理"
}
},
"auth": {
"checking": "正在校验登录状态…",

View File

@@ -178,7 +178,18 @@
"loadFailed": "系统设置加载失败",
"saveSuccess": "系统设置已保存",
"saveRuntimeSuccess": "开奖与结算参数已保存",
"saveDrawSuccess": "开奖参数已保存",
"saveCurrencyFormatSuccess": "金额显示格式已保存",
"saveSettlementSuccess": "结算自动化参数已保存",
"saveFrontendSuccess": "前端展示配置已保存",
"sections": {
"draw": "开奖节奏与审核",
"drawDescription": "控制期号节奏、封盘与开奖后人工审核、冷静期。仅保存本区块内修改过的项。",
"currencyFormat": "金额显示格式",
"currencyFormatDescription": "全站金额展示的小数位与分隔符,与币种主数据无关。",
"settlement": "结算自动化",
"settlementDescription": "控制 tick 是否自动结算、审核与派彩。修改后只提交本区块变更项。"
},
"saveFailed": "系统设置保存失败",
"unsavedChanges": "有未保存的更改",
"frontendConfig": "前端配置",
@@ -217,6 +228,12 @@
"confirmSaveDescription": "将更新开奖审核、冷静期、自动结算/审核/派彩及玩法规则展示,可能影响全站运行。",
"confirmSaveRuntimeTitle": "确认保存开奖与结算参数?",
"confirmSaveRuntimeDescription": "将更新开奖审核、期号节奏、冷静期、自动结算/审核/派彩等,不影响玩法规则 HTML。",
"confirmSaveDrawTitle": "确认保存开奖参数?",
"confirmSaveDrawDescription": "将更新开奖审核、期号节奏与冷静期等本区块字段。",
"confirmSaveCurrencyFormatTitle": "确认保存金额显示格式?",
"confirmSaveCurrencyFormatDescription": "将更新小数位与千分位/小数分隔符。",
"confirmSaveSettlementTitle": "确认保存结算自动化?",
"confirmSaveSettlementDescription": "将更新自动结算、审核与派彩相关开关。",
"confirmSaveFrontendTitle": "确认保存前端展示配置?",
"confirmSaveFrontendDescription": "将更新玩家端玩法规则页面 HTML不影响开奖与结算逻辑。"
},

View File

@@ -29,6 +29,7 @@
"granularityDay": "按天",
"playBreakdown": "玩法拆解 Top",
"playRanking": "玩法排行榜 Top 5",
"agentRanking": "代理排行榜 Top 5",
"rankingMetricLabel": "排行维度",
"rankingMetrics": {
"bet": "按投注金额",
@@ -37,6 +38,7 @@
},
"periodDistribution": "区间结构对比",
"noPlayData": "该区间暂无玩法数据",
"noAgentData": "该区间暂无代理数据",
"periods": {
"today": "今日",
"last_7_days": "近 7 天",
@@ -90,6 +92,7 @@
"batchPendingDraws": "涉及期数",
"batchPendingDrawsCount": "{{count}} 期待审",
"platformLockedAndCap": "全站已占用 {{locked}} / 封顶 {{cap}}",
"platformCapNotConfigured": "全站已占用 {{locked}} · 尚未配置封顶",
"platformOrderAndTicket": "全站 {{orders}} 单 · {{tickets}} 笔",
"platformBetTotal": "累计投注",
"platformNoFinanceActivity": "全站暂无投注",

View File

@@ -2,10 +2,13 @@
"title": "对账",
"createTitle": "人工发起对账",
"createDesc": "用于按日期范围并可选指定玩家,人工核对异常转账。系统定时对账仍会自动执行。",
"scopeTitle": "先定义对账范围",
"scopeDescription": "先确定要核对的业务类型和日期区间,再决定是否缩小到单个玩家。",
"reconcileType": "对账类型",
"reconcileTypeFixed": "钱包划转(主站 ⇄ 彩票)",
"reconcileTypeHint": "当前仅支持钱包划转。",
"dateRange": "对账日期范围",
"dateRangeHint": "建议优先选较短时间段,先看异常是否集中,再按需扩大范围。",
"createTask": "创建对账任务",
"submitting": "提交中…",
"loadFailed": "加载失败",
@@ -20,13 +23,21 @@
"createSuccess": "已创建对账任务",
"createFailed": "创建失败",
"noCreatePermission": "当前账号无新建对账任务权限。",
"playerScopeTitle": "再决定是否指定玩家",
"playerAllPlayersHint": "不选择玩家时,会按日期范围对全量玩家做一次人工对账。",
"createSummaryAll": "将对 {{from}} 至 {{to}} 的全量玩家发起人工对账。",
"createSummaryPlayer": "将对玩家 {{player}} 在 {{from}} 至 {{to}} 的数据发起人工对账。",
"jobsTitle": "对账任务",
"jobsDesc": "在右侧操作中查看差异明细与分页。",
"refresh": "刷新",
"jobNo": "任务号",
"type": "类型",
"status": "状态",
"itemCount": "明细数",
"mismatchCount": "异常数",
"matchedCount": "一致数",
"period": "对账周期",
"finishedAt": "完成时间",
"createdAt": "创建时间",
"operate": "操作",
"view": "查看",
@@ -34,6 +45,7 @@
"sideARef": "彩票侧引用",
"sideBRef": "主站侧引用",
"differenceAmount": "差额(分)",
"detectedAt": "发现时间",
"noDetails": "无明细",
"playerSearch": "指定玩家(可选)",
"playerSearchPlaceholder": "输入玩家 ID / 用户名 / 昵称搜索",

View File

@@ -84,15 +84,109 @@
"subtitle": "查询结果将显示在下方表格,可导出 CSV 或 Excel。",
"empty": "暂无数据,请调整筛选条件后重试。",
"exportableRows": "行可导出",
"summaryScopeHint": "上方统计卡除“记录数”外,默认按当前预览页汇总;需要全量口径请使用“导出 CSV/Excel全量”。",
"scope": {
"currentPage": "当前页"
},
"columns": {
"primary": "",
"secondary": "",
"metricA": "",
"metricB": "",
"metricC": "",
"status": "",
"extra": "",
"time": ""
"primary": "主字段",
"secondary": "辅助字段",
"metricA": "指标 A",
"metricB": "指标 B",
"metricC": "指标 C",
"status": "状态",
"extra": "补充信息",
"time": "时间",
"drawProfit": {
"primary": "期号 / 批次",
"secondary": "期状态 / 结算状态",
"metricA": "订单 / 票数",
"metricB": "票数 / 中奖数",
"metricC": "下注 / 平台盈亏",
"status": "派彩 / Jackpot",
"extra": "结算批次数",
"time": "完成时间"
},
"dailyProfit": {
"primary": "业务日",
"secondary": "说明",
"metricA": "下注",
"metricB": "派彩",
"metricC": "平台盈亏",
"status": "退款",
"extra": "净额",
"time": "更新时间"
},
"playerWinLoss": {
"primary": "玩家",
"secondary": "玩家 ID",
"metricA": "下注",
"metricB": "派彩",
"metricC": "净输赢",
"status": "层级",
"extra": "备注",
"time": "时间"
},
"playerTransfer": {
"primary": "转账单号",
"secondary": "玩家",
"metricA": "方向",
"metricB": "状态",
"metricC": "金额",
"status": "外部流水",
"extra": "失败原因",
"time": "创建时间"
},
"hotNumberRisk": {
"primary": "号码 / 日志",
"secondary": "期号 / 动作",
"metricA": "封顶 / 金额",
"metricB": "已占用 / 玩法",
"metricC": "剩余 / 注单",
"status": "售罄 / 玩家",
"extra": "使用率 / 原因",
"time": "版本 / 时间"
},
"playDimension": {
"primary": "玩法",
"secondary": "维度",
"metricA": "下注",
"metricB": "派彩",
"metricC": "平台盈亏",
"status": "占比",
"extra": "备注",
"time": "时间"
},
"soldOut": {
"primary": "号码",
"secondary": "期号",
"metricA": "封顶",
"metricB": "已占用",
"metricC": "剩余",
"status": "是否售罄",
"extra": "使用率",
"time": "版本"
},
"rebateCommission": {
"primary": "玩法",
"secondary": "订单数",
"metricA": "回水",
"metricB": "注单数",
"metricC": "佣金",
"status": "配置命中",
"extra": "备注",
"time": "时间"
},
"adminAudit": {
"primary": "日志 ID",
"secondary": "操作者类型",
"metricA": "操作者 ID",
"metricB": "模块",
"metricC": "动作",
"status": "目标类型",
"extra": "IP",
"time": "时间"
}
},
"stats": {
"records": "记录数",
@@ -179,7 +273,7 @@
},
"daily_profit": {
"title": "每日盈亏汇总",
"summary": "按自然日汇总投注、派奖、退款、盈亏和净额。"
"summary": "按业务日汇总投注、派彩与平台盈亏,当前不包含退款与单独净额字段。"
},
"player_win_loss": {
"title": "玩家输赢报表",