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"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -9,7 +9,8 @@
|
||||
"createSuccess": "创建成功",
|
||||
"detail": {
|
||||
"prizesTab": "奖品",
|
||||
"rulesTab": "规则"
|
||||
"rulesTab": "规则",
|
||||
"claimsTab": "领奖工单"
|
||||
},
|
||||
"edit": "编辑",
|
||||
"editActivity": "编辑活动",
|
||||
@@ -58,10 +59,21 @@
|
||||
"amountYuan": "佣金金额(元)",
|
||||
"cancel": "取消",
|
||||
"centerSlotHint": "通常为抽奖按钮",
|
||||
"claimTtlHint": "用户提交领奖信息的时限,缺省 168 小时(7 天)。",
|
||||
"claimTtlHours": "领奖窗口(小时)",
|
||||
"claimTtlInvalid": "领奖窗口(小时)必须为正整数",
|
||||
"confirm": "确认",
|
||||
"confirmDelete": "删除",
|
||||
"createSuccess": "奖品创建成功",
|
||||
"createTitle": "添加奖品",
|
||||
"cryptoAmount": "金额",
|
||||
"cryptoAmountPlaceholder": "例如:0.01",
|
||||
"cryptoAmountRequired": "请输入金额",
|
||||
"cryptoCurrency": "币种",
|
||||
"cryptoCurrencyRequired": "请输入币种",
|
||||
"cryptoNetworks": "网络",
|
||||
"cryptoNetworksHint": "逗号分隔,用户领奖时从中选择一个网络。",
|
||||
"cryptoNetworksRequired": "至少填写一个网络(逗号分隔)",
|
||||
"daysSuffix": "天",
|
||||
"delete": "删除",
|
||||
"deleteDescription": "该奖品将从九宫格中移除,此操作不可撤销。",
|
||||
@@ -70,13 +82,16 @@
|
||||
"durationDays": "时长(天)",
|
||||
"durationDaysPlaceholder": "例如:1",
|
||||
"durationDaysRequired": "时长天数必须为正整数",
|
||||
"durationSummary": "{{days}} 天",
|
||||
"editTitle": "编辑奖品",
|
||||
"fallbackBadge": "保底",
|
||||
"fallbackIgnoresWeight": "保底奖品不参与权重计算",
|
||||
"fallbackIgnoresWeight": "保底奖品不参与概率(永不被随机抽中)",
|
||||
"hoursSuffix": "小时",
|
||||
"iconUrl": "图标 URL",
|
||||
"iconUrlInvalid": "请输入有效的 URL",
|
||||
"isFallback": "保底奖品",
|
||||
"isFallbackHint": "限量奖品抽完后发放该奖品",
|
||||
"manualPrizeHint": "人工奖:用户先提交领奖信息,运营在「领奖工单」页审核并标记发放/发货。",
|
||||
"name": "奖品名称",
|
||||
"namePlaceholder": "例如:1 天时长卡",
|
||||
"nameRequired": "请输入奖品名称",
|
||||
@@ -85,11 +100,18 @@
|
||||
"noRandomPrizes": "暂无参与随机抽取的奖品",
|
||||
"noneHint": "无需额外配置。建议开启保底,限量奖品抽完后用户将始终抽中该奖品。",
|
||||
"probabilityPreview": "概率预览",
|
||||
"probabilityTotal": "合计",
|
||||
"selectType": "选择类型",
|
||||
"skuName": "物品名称(可选)",
|
||||
"skuNamePlaceholder": "例如:限量 T 恤",
|
||||
"slotLabel": "格子",
|
||||
"soldOutBadge": "已抽完",
|
||||
"stage2Hint": "Stage 2 开放",
|
||||
"stockShort": "库存",
|
||||
"subscribePlan": "无订阅时新建套餐",
|
||||
"subscribePlanHint": "当用户无活跃订阅时,按该套餐新建订阅并发放时长;留空则跳过发放。",
|
||||
"subscribePlanPlaceholder": "不选:用户无活跃订阅时跳过发放",
|
||||
"totalNot100Hint": "当前可抽奖品概率合计 {{total}}%。请调整各奖品的中奖概率,使其精确等于 100%。",
|
||||
"totalNot100Title": "概率合计必须为 100%",
|
||||
"totalStock": "总库存",
|
||||
"totalStockPlaceholder": "例如:100",
|
||||
"totalStockRequired": "总库存必须为正整数",
|
||||
@@ -104,11 +126,12 @@
|
||||
"typeVpnDuration": "免费时长",
|
||||
"unlimitedStock": "无限库存",
|
||||
"updateSuccess": "奖品更新成功",
|
||||
"weight": "权重",
|
||||
"weightHint": "权重为 0 时仅展示,不参与随机抽取",
|
||||
"weightInteger": "权重必须为整数",
|
||||
"weightMin": "权重不能小于 0",
|
||||
"weightShort": "权重",
|
||||
"weight": "中奖概率(%)",
|
||||
"weightHint": "九宫格内的中奖概率。所有参与随机的奖品合计须为 100%。0 = 展示但不参与随机。",
|
||||
"weightInteger": "概率必须为整数",
|
||||
"weightMax": "概率不能超过 100",
|
||||
"weightMin": "概率不能小于 0",
|
||||
"weightShort": "概率",
|
||||
"yuanSuffix": "元"
|
||||
},
|
||||
"publish": "上架",
|
||||
@@ -177,5 +200,50 @@
|
||||
"statusAll": "全部",
|
||||
"statusLabel": "状态",
|
||||
"title": "标题",
|
||||
"updateSuccess": "更新成功"
|
||||
"updateSuccess": "更新成功",
|
||||
"claim": {
|
||||
"approve": "通过",
|
||||
"approveDescription": "通过后工单进入待发放/发货阶段。",
|
||||
"approveSuccess": "工单已通过",
|
||||
"approveTitle": "确认通过该工单?",
|
||||
"cancel": "取消",
|
||||
"claimData": "领奖信息",
|
||||
"confirm": "确认",
|
||||
"confirmMarkPaid": "确认",
|
||||
"confirmReject": "确认驳回",
|
||||
"createdAt": "中奖时间",
|
||||
"deliveryRef": "物流单号",
|
||||
"deliveryRefPlaceholder": "快递单号",
|
||||
"deliveryRefRequired": "实物奖品必须填写物流单号",
|
||||
"expiresAt": "过期时间",
|
||||
"filterStatus": "状态",
|
||||
"filterType": "类型",
|
||||
"filterUserId": "用户 ID",
|
||||
"fulfillment": "交易/物流单号",
|
||||
"markPaid": "标记发放",
|
||||
"markPaidDescription": "加密货币需填交易哈希;实物需填物流单号;人工其他至少填一项。",
|
||||
"markPaidSuccess": "已标记发放",
|
||||
"markPaidTitle": "标记为已发放",
|
||||
"oneRefRequired": "至少填写一项",
|
||||
"prize": "奖品",
|
||||
"reason": "驳回原因",
|
||||
"reasonPlaceholder": "填写驳回原因,用户端会看到",
|
||||
"reasonRequired": "请填写驳回原因",
|
||||
"reasonTooLong": "驳回原因不能超过 512 字",
|
||||
"reject": "驳回",
|
||||
"rejectDescription": "驳回原因会展示给用户,用户可重新提交。",
|
||||
"rejectSuccess": "工单已驳回",
|
||||
"rejectTitle": "驳回工单",
|
||||
"status": "状态",
|
||||
"statusExpired": "已过期",
|
||||
"statusPaid": "已发放",
|
||||
"statusPaying": "待发放/发货",
|
||||
"statusPending": "待用户填写",
|
||||
"statusRejected": "已驳回",
|
||||
"statusReviewing": "待审核",
|
||||
"tableTitle": "领奖工单",
|
||||
"txHash": "交易哈希",
|
||||
"txHashRequired": "加密货币奖品必须填写交易哈希",
|
||||
"user": "用户"
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user