feat(admin): 后台可配领取链接/发消息模板 + 可见买家账号 + 修正皮肤领取链接

**面板新增三项(抖音码速达接入配置)**
- 领取链接基址 (claimLinkBase):带实时预览「皮肤订单最终链接」,并拦截两类误配 ——
  带 `#`(`#/claim` 是打手领取页,会把买家带进绑定 UID 流程)、缺 http(s) 协议
- 发消息模板 (messageTemplate):提示可用占位符;模板里没有 `{link}` 直接报错提示
- 付款后发领取消息开关 (claimMessageEnabled)
- 顺带把默认出网超时的展示值对齐后端(10s → 20s)

**后台可见买家提交的账号(运营发货依据)**
- `getAdminTaskDetail` 新增 `claimSubmission`,按 `canViewSensitiveTaskData` 门禁下发
  (与 claimToken 明文同一门禁);任务详情新增「买家提交信息」卡片(可一键复制账号)

**修正:皮肤任务的领取链接**
- 详情接口原来用全局 `buildClaimUrl`(默认 hash 形式 `…/#/claim/…`),那是**打手**领取页;
  皮肤任务改用 `claimLinkBase + '/' + token`,运营复制给买家的链接才是买家页
- 顺带把「履约渠道」筛选项加上「皮肤自动发货」、任务详情执行器标签加上它、
  「来源渠道」加上「抖音码速达」(此前筛不出来抖音订单)
This commit is contained in:
yml2213
2026-10-09 15:06:49 +08:00
parent 56a8184576
commit b70741daec
9 changed files with 269 additions and 7 deletions
+4
View File
@@ -10,10 +10,14 @@ export const adminOrderProviderOptions = [
{ label: '拼多多', value: 'pdd' },
{ label: '91卡券', value: '91kaquan' },
{ label: '快手', value: 'kuaishou' },
// 抖音码速达:订单落在 orders.provider='douyin_mashida'(platform='doudian')
{ label: '抖音码速达', value: 'douyin_mashida' },
]
export const adminOrderExecutorOptions = [
{ label: '联盟发货', value: 'affiliate_dash' },
// 抖音码速达皮肤类:建任务 + 生成领取链接,买家自己填账号领取
{ label: '皮肤自动发货', value: 'douyin_mashida_skin' },
{ label: '行业凭证', value: 'kuaishou-industry' },
{ label: '人工履约', value: 'manual_dispatch' },
]
+50
View File
@@ -62,3 +62,53 @@ export function describeMissingConfigFields(config: MissingConfigCheck): string[
return missing
}
/**
* 面板预览用的示例 token(48 位 hex,与真实 claim token 形态一致)。
*/
const CLAIM_LINK_PREVIEW_TOKEN = 'a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6'
/**
* 拼一条领取链接预览:`claimLinkBase` 去尾斜杠 + '/' + token。
* 规则与后端拼装一致(后端用配置里的 `claimLinkBase`)。
* 基址为空返回空串(后端会回退到通用兑换链接)。
*/
export function buildDouyinMashidaClaimLinkPreview(
claimLinkBase: string,
token = CLAIM_LINK_PREVIEW_TOKEN,
): string {
const base = String(claimLinkBase ?? '')
.trim()
.replace(/\/+$/, '')
if (!base) return ''
return `${base}/${String(token ?? '').trim()}`
}
/**
* 领取链接基址的误配提示(无问题返回空串)。
*
* 重点拦 `#`:`#/claim/{token}` 是**打手**领取页(要绑游戏 UID),
* 皮肤买家链接必须是路径式,配错会把买家带到打手流程里。
*/
export function describeClaimLinkBaseWarning(claimLinkBase: string): string {
const text = String(claimLinkBase ?? '').trim()
if (!text) return ''
if (text.includes('#')) {
return '不要带 #:#/claim 是打手领取页,皮肤买家链接请用路径式,例如 https://你的域名/claim'
}
if (!/^https?:\/\//i.test(text)) {
return '请填完整地址(http:// 或 https:// 开头),例如 https://你的域名/claim'
}
return ''
}
/**
* 发消息模板提示(无问题返回空串):模板里没有 {link} 就等于没把领取链接给买家。
*/
export function describeMessageTemplateWarning(messageTemplate: string): string {
const text = String(messageTemplate ?? '').trim()
if (text && !text.includes('{link}')) {
return '模板里没有 {link} 占位符,买家将拿不到领取链接'
}
return ''
}