feat(抽奖): 开放人工奖(crypto/physical/manual_other) + 领奖工单管理 + REST 对齐
- prize-form: 解禁 crypto/physical/manual_other 并加各自 config;权重改为中奖概率(%), 合计校验;vpn_duration 加"无订阅时新建订阅套餐" - prize-grid: 概率合计=100% 校验告警;卡片渲染真实 config(时长/金额) - claims-panel(新): 领奖工单列表 + 审核通过/驳回/标记发放 - activity-detail: 新增"领奖工单"Tab - service: 奖品改/删 id 走 /prizes/:id(对齐后端 REST);新增 claims 5 个接口 + 类型 - i18n: 补齐 zh-CN/en-US lottery 文案 Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -9,7 +9,8 @@
|
||||
"createSuccess": "Create Success",
|
||||
"detail": {
|
||||
"prizesTab": "Prizes",
|
||||
"rulesTab": "Rules"
|
||||
"rulesTab": "Rules",
|
||||
"claimsTab": "Claims"
|
||||
},
|
||||
"edit": "Edit",
|
||||
"editActivity": "Edit Activity",
|
||||
@@ -58,10 +59,21 @@
|
||||
"amountYuan": "Commission Amount (CNY)",
|
||||
"cancel": "Cancel",
|
||||
"centerSlotHint": "Usually the draw button",
|
||||
"claimTtlHint": "How long the user has to submit claim info. Default 168h (7 days).",
|
||||
"claimTtlHours": "Claim window (hours)",
|
||||
"claimTtlInvalid": "Claim window (hours) must be a positive integer",
|
||||
"confirm": "Confirm",
|
||||
"confirmDelete": "Delete",
|
||||
"createSuccess": "Prize created",
|
||||
"createTitle": "Add Prize",
|
||||
"cryptoAmount": "Amount",
|
||||
"cryptoAmountPlaceholder": "e.g. 0.01",
|
||||
"cryptoAmountRequired": "Amount is required",
|
||||
"cryptoCurrency": "Currency",
|
||||
"cryptoCurrencyRequired": "Currency is required",
|
||||
"cryptoNetworks": "Networks",
|
||||
"cryptoNetworksHint": "Comma-separated. The user picks one of these when claiming.",
|
||||
"cryptoNetworksRequired": "At least one network is required (comma-separated)",
|
||||
"daysSuffix": "days",
|
||||
"delete": "Delete",
|
||||
"deleteDescription": "This prize will be removed from the grid. This action cannot be undone.",
|
||||
@@ -70,13 +82,16 @@
|
||||
"durationDays": "Duration (days)",
|
||||
"durationDaysPlaceholder": "e.g. 1",
|
||||
"durationDaysRequired": "Duration days must be a positive integer",
|
||||
"durationSummary": "{{days}} days",
|
||||
"editTitle": "Edit Prize",
|
||||
"fallbackBadge": "Fallback",
|
||||
"fallbackIgnoresWeight": "Fallback prize ignores weight",
|
||||
"fallbackIgnoresWeight": "Fallback prize ignores probability (never randomly drawn)",
|
||||
"hoursSuffix": "hours",
|
||||
"iconUrl": "Icon URL",
|
||||
"iconUrlInvalid": "Must be a valid URL",
|
||||
"isFallback": "Fallback Prize",
|
||||
"isFallbackHint": "Awarded when limited prizes are sold out",
|
||||
"manualPrizeHint": "Manual prize: the winner submits claim info, then an operator approves and marks it paid/shipped under the Claims tab.",
|
||||
"name": "Prize Name",
|
||||
"namePlaceholder": "e.g. 1-Day Pass",
|
||||
"nameRequired": "Name is required",
|
||||
@@ -85,11 +100,18 @@
|
||||
"noRandomPrizes": "No prizes participate in the random draw yet",
|
||||
"noneHint": "No config needed. Consider enabling fallback so users always land on this prize when limited prizes run out.",
|
||||
"probabilityPreview": "Probability Preview",
|
||||
"probabilityTotal": "Total",
|
||||
"selectType": "Select type",
|
||||
"skuName": "Item name (optional)",
|
||||
"skuNamePlaceholder": "e.g. Limited T-shirt",
|
||||
"slotLabel": "Slot",
|
||||
"soldOutBadge": "Sold Out",
|
||||
"stage2Hint": "Available in Stage 2",
|
||||
"stockShort": "Stock",
|
||||
"subscribePlan": "New-subscription plan",
|
||||
"subscribePlanHint": "When the user has no active subscription, create one on this plan and grant the duration. Leave empty to skip granting.",
|
||||
"subscribePlanPlaceholder": "None — skip if user has no active subscription",
|
||||
"totalNot100Hint": "The drawable prizes currently total {{total}}%. Adjust each prize's win probability so they sum to exactly 100%.",
|
||||
"totalNot100Title": "Probabilities must total 100%",
|
||||
"totalStock": "Total Stock",
|
||||
"totalStockPlaceholder": "e.g. 100",
|
||||
"totalStockRequired": "Total stock must be a positive integer",
|
||||
@@ -104,11 +126,12 @@
|
||||
"typeVpnDuration": "VPN Duration",
|
||||
"unlimitedStock": "Unlimited Stock",
|
||||
"updateSuccess": "Prize updated",
|
||||
"weight": "Weight",
|
||||
"weightHint": "0 = displayed but excluded from random draw",
|
||||
"weightInteger": "Weight must be an integer",
|
||||
"weightMin": "Weight must be at least 0",
|
||||
"weightShort": "Weight",
|
||||
"weight": "Win probability (%)",
|
||||
"weightHint": "Percent chance in the grid. All drawable prizes must total 100%. 0 = shown but never drawn.",
|
||||
"weightInteger": "Probability must be an integer",
|
||||
"weightMax": "Probability cannot exceed 100",
|
||||
"weightMin": "Probability must be at least 0",
|
||||
"weightShort": "Prob",
|
||||
"yuanSuffix": "CNY"
|
||||
},
|
||||
"publish": "Publish",
|
||||
@@ -177,5 +200,50 @@
|
||||
"statusAll": "All",
|
||||
"statusLabel": "Status",
|
||||
"title": "Title",
|
||||
"updateSuccess": "Update Success"
|
||||
"updateSuccess": "Update Success",
|
||||
"claim": {
|
||||
"approve": "Approve",
|
||||
"approveDescription": "Approving moves this claim to the paying/shipping stage.",
|
||||
"approveSuccess": "Claim approved",
|
||||
"approveTitle": "Approve this claim?",
|
||||
"cancel": "Cancel",
|
||||
"claimData": "Claim info",
|
||||
"confirm": "Confirm",
|
||||
"confirmMarkPaid": "Confirm",
|
||||
"confirmReject": "Confirm reject",
|
||||
"createdAt": "Won at",
|
||||
"deliveryRef": "Delivery ref",
|
||||
"deliveryRefPlaceholder": "Tracking number",
|
||||
"deliveryRefRequired": "Delivery ref is required for physical",
|
||||
"expiresAt": "Expires",
|
||||
"filterStatus": "Status",
|
||||
"filterType": "Type",
|
||||
"filterUserId": "User ID",
|
||||
"fulfillment": "Tx / Delivery",
|
||||
"markPaid": "Mark fulfilled",
|
||||
"markPaidDescription": "Crypto requires a tx hash; physical requires a delivery ref; manual requires at least one.",
|
||||
"markPaidSuccess": "Marked as fulfilled",
|
||||
"markPaidTitle": "Mark as fulfilled",
|
||||
"oneRefRequired": "Fill at least one field",
|
||||
"prize": "Prize",
|
||||
"reason": "Reason",
|
||||
"reasonPlaceholder": "Reason shown to the user",
|
||||
"reasonRequired": "Please enter a reason",
|
||||
"reasonTooLong": "Reason cannot exceed 512 chars",
|
||||
"reject": "Reject",
|
||||
"rejectDescription": "The reason is shown to the user, who may then resubmit.",
|
||||
"rejectSuccess": "Claim rejected",
|
||||
"rejectTitle": "Reject claim",
|
||||
"status": "Status",
|
||||
"statusExpired": "Expired",
|
||||
"statusPaid": "Fulfilled",
|
||||
"statusPaying": "Paying / Shipping",
|
||||
"statusPending": "Awaiting user",
|
||||
"statusRejected": "Rejected",
|
||||
"statusReviewing": "Reviewing",
|
||||
"tableTitle": "Claims",
|
||||
"txHash": "Tx hash",
|
||||
"txHashRequired": "Tx hash is required for crypto",
|
||||
"user": "User"
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user