前面的ok了, 绑定与角色

This commit is contained in:
yml
2026-05-03 20:58:18 +08:00
parent dd2192b6ae
commit 0f0253bffe
30 changed files with 1900 additions and 409 deletions
@@ -29,6 +29,7 @@ import { nowIso } from '../../utils/time.js'
const CLAIM_TERMINAL_STATUSES = new Set(['expired', 'closed'])
const REDEEM_REPLACEMENT_LIMIT = 10
const KUAISHOU_CLOUD_CLAIM_GUIDE_BASE_PATH = '/kuaishou-cloud-guide'
export async function getClaimDetail(token, { includeQrImage = true } = {}) {
const context = await getClaimContext(token)
@@ -574,7 +575,7 @@ export async function getClaimScreenshotPath(token) {
return getTencentBrowserSessionScreenshotPath(context.task.browser_session_id)
}
async function getClaimContext(token) {
export async function getClaimContext(token) {
const normalized = String(token || '').trim()
if (!normalized) {
@@ -818,10 +819,12 @@ function buildClaimDetailPayload({ claimToken, task, order, orderItem, session }
const screenshotReady = Boolean(task.screenshot_path) || Boolean(session?.artifacts?.hasScreenshot)
const screenshotUrl = screenshotReady ? `/api/v1/claim/${claimToken.token}/screenshot` : ''
const finalRedeem = session?.redeem?.final?.redeem || null
const kuaishouCloudFulfillment = mapClaimKuaishouCloudFulfillment(task, order)
return {
tokenStatus: claimToken.status,
claimUrl: buildClaimUrl(claimToken.token),
flowType: kuaishouCloudFulfillment ? 'kuaishou_cloud' : 'tencent_claim',
task: {
taskId: task.id,
taskNo: task.task_no,
@@ -853,6 +856,7 @@ function buildClaimDetailPayload({ claimToken, task, order, orderItem, session }
quantity: orderItem.quantity,
},
session,
kuaishouCloudFulfillment,
result: task.redeemed_at || session?.status === 'redeemed'
? {
resultCode: String(task.result_code || finalRedeem?.iRet || finalRedeem?.ret || ''),
@@ -864,6 +868,62 @@ function buildClaimDetailPayload({ claimToken, task, order, orderItem, session }
}
}
function mapClaimKuaishouCloudFulfillment(task, order) {
if (String(task?.executor_key || '').trim() !== 'kuaishou_ct_assisted') {
return null
}
const source = parseTaskContext(task).kuaishouCloudFulfillment
if (!source || typeof source !== 'object') {
return null
}
const binding = source.binding && typeof source.binding === 'object' ? source.binding : {}
const ticket = source.ticket && typeof source.ticket === 'object' ? source.ticket : {}
const dispatch = source.dispatch && typeof source.dispatch === 'object' ? source.dispatch : {}
const returnNumber = source.returnNumber && typeof source.returnNumber === 'object' ? source.returnNumber : {}
const consume = source.consume && typeof source.consume === 'object' ? source.consume : {}
return {
flowType: 'kuaishou_cloud',
shopId: String(order?.shop_id || '').trim(),
shopName: String(order?.shop_name || '').trim(),
guideImages: [
`${KUAISHOU_CLOUD_CLAIM_GUIDE_BASE_PATH}/1.png`,
`${KUAISHOU_CLOUD_CLAIM_GUIDE_BASE_PATH}/2.png`,
`${KUAISHOU_CLOUD_CLAIM_GUIDE_BASE_PATH}/3.png`,
],
ticket: {
code: String(ticket.code || '').trim(),
status: String(ticket.status || 'pending').trim() || 'pending',
capturedAt: ticket.capturedAt || null,
verifiedAt: ticket.verifiedAt || null,
goodsTitle: String(ticket.goodsTitle || '').trim(),
leftCount: Number(ticket.leftCount || 0) || 0,
},
binding: {
prepareStatus: String(binding.prepareStatus || 'pending').trim() || 'pending',
bindUrl: String(binding.bindUrl || '').trim(),
bindPreparedAt: binding.bindPreparedAt || null,
vnPhone: String(binding.vnPhone || '').trim(),
},
dispatch: {
status: String(dispatch.status || 'pending').trim() || 'pending',
dispatchAt: dispatch.dispatchAt || null,
note: String(dispatch.note || '').trim(),
},
returnNumber: {
status: String(returnNumber.status || 'pending').trim() || 'pending',
returnedAt: returnNumber.returnedAt || null,
},
consume: {
status: String(consume.status || 'pending').trim() || 'pending',
consumedAt: consume.consumedAt || null,
errorMessage: String(consume.errorMessage || '').trim(),
},
}
}
async function redeemClaimTaskWithInventoryFallback(context, initialInventoryItem) {
return redeemClaimTaskWithInventoryFallbackWithDeps(context, initialInventoryItem)
}