优化领取页角色绑定校验

This commit is contained in:
yml
2026-05-31 23:39:15 +08:00
parent 9172e1f98e
commit 60cf7c2bbd
10 changed files with 398 additions and 65 deletions
@@ -248,6 +248,16 @@ export function mapClaimKuaishouCloudFulfillment(task: TaskRow, order: OrderRow)
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 : {}
const roleName = String(role.name || binding.roleName || '').trim()
const roleId = String(role.rid || binding.roleId || '').trim()
const defaultRoleName = String(role.defaultName || role.defaultRoleName || '').trim()
const defaultRoleId = String(role.defaultRid || role.defaultRoleId || '').trim()
const isDefaultRole =
Boolean(roleName || roleId) &&
isSameClaimKuaishouCloudRole(
{ name: roleName, rid: roleId },
{ name: defaultRoleName, rid: defaultRoleId },
)
return {
flowType: 'kuaishou_cloud',
@@ -288,10 +298,16 @@ export function mapClaimKuaishouCloudFulfillment(task: TaskRow, order: OrderRow)
},
role: {
status: String(role.status || 'pending').trim() || 'pending',
name: String(role.name || binding.roleName || '').trim(),
rid: String(role.rid || binding.roleId || '').trim(),
name: roleName,
rid: roleId,
refreshedAt: role.refreshedAt || null,
errorMessage: String(role.errorMessage || '').trim(),
defaultName: defaultRoleName,
defaultRid: defaultRoleId,
defaultCapturedAt: role.defaultCapturedAt || null,
defaultCaptureStatus: String(role.defaultCaptureStatus || '').trim(),
defaultErrorMessage: String(role.defaultErrorMessage || '').trim(),
isDefaultRole,
},
purchase: {
autoBuyEnabled: purchase.autoBuyEnabled !== false,
@@ -351,6 +367,28 @@ function isPlainObject(value: unknown): value is JsonObject {
return Object.prototype.toString.call(value) === '[object Object]'
}
function isSameClaimKuaishouCloudRole(
left: { name?: unknown; rid?: unknown },
right: { name?: unknown; rid?: unknown },
) {
const leftRid = String(left.rid || '').trim()
const rightRid = String(right.rid || '').trim()
if (leftRid && rightRid) {
return leftRid === rightRid
}
const leftName = normalizeClaimRoleNameForCompare(left.name)
const rightName = normalizeClaimRoleNameForCompare(right.name)
return Boolean(leftName && rightName && leftName === rightName)
}
function normalizeClaimRoleNameForCompare(value: unknown) {
return String(value || '')
.trim()
.toLowerCase()
.replace(/\s+/g, '')
}
function normalizeClaimDeliveryItems(value: unknown, binding: JsonObject) {
const rawItems = Array.isArray(value) ? value : []
const items = rawItems
@@ -26,6 +26,8 @@ import {
import { isKuaishouEticketMockTicketCode } from '../platforms/kuaishou-eticket/mock-ticket-service.js'
import {
dispatchKuaishouCloudFulfillmentTask,
hasKuaishouCloudCustomerRole,
hasKuaishouCloudDefaultRoleSnapshot,
maskCode,
normalizeKuaishouCloudFlow,
prepareKuaishouCloudFulfillmentTask,
@@ -478,6 +480,19 @@ export async function confirmKuaishouCloudClaimRole(token: unknown) {
})
}
const hasDefaultRoleSnapshot = hasKuaishouCloudDefaultRoleSnapshot(flow)
if (!mockMode && !hasKuaishouCloudCustomerRole(flow)) {
const message = hasDefaultRoleSnapshot
? '当前仍是虚拟机默认角色,请先重新绑定自己的角色信息'
: '系统还未获取到虚拟机默认角色信息,请稍后刷新角色信息后再试'
throw createHttpError(message, {
statusCode: 409,
errorCode: hasDefaultRoleSnapshot
? 'claim_kuaishou_cloud_default_role_not_rebound'
: 'claim_kuaishou_cloud_default_role_not_ready',
})
}
await updateTask(context.task.id, {
task_status: TASK_STATUS.ROLE_CONFIRMED,
role_id: flow.binding.roleId,
@@ -36,6 +36,7 @@ export async function syncKuaishouCloudRoleInfo(task: TaskRow) {
source: 'claim_page_polling',
actor: { source: 'system' },
recordEvent: false,
forceProbe: flow.role.isDefaultRole === true,
})
return result.task || task
} catch {