修复领取界面商品数量错误
This commit is contained in:
@@ -86,8 +86,14 @@ export async function getClaimContext(token: unknown) {
|
||||
}
|
||||
|
||||
export function buildClaimDetailPayload({ claimToken, task, order, orderItem }: ClaimContext) {
|
||||
const kuaishouCloudSource = resolveClaimKuaishouCloudSource(task)
|
||||
const kuaishouCloudFulfillment = mapClaimKuaishouCloudFulfillment(task, order)
|
||||
const displaySkuName = resolveClaimOrderItemDisplaySkuName(orderItem, kuaishouCloudFulfillment)
|
||||
const displaySkuName = resolveClaimOrderItemDisplaySkuName(
|
||||
orderItem,
|
||||
kuaishouCloudFulfillment,
|
||||
kuaishouCloudSource,
|
||||
)
|
||||
const product = buildClaimProductPayload(displaySkuName, orderItem, kuaishouCloudSource)
|
||||
|
||||
return {
|
||||
tokenStatus: claimToken.status,
|
||||
@@ -123,6 +129,7 @@ export function buildClaimDetailPayload({ claimToken, task, order, orderItem }:
|
||||
skuName: displaySkuName,
|
||||
quantity: orderItem.quantity,
|
||||
},
|
||||
product,
|
||||
session: null as null,
|
||||
kuaishouCloudFulfillment,
|
||||
result: task.redeemed_at
|
||||
@@ -139,6 +146,7 @@ export function buildClaimDetailPayload({ claimToken, task, order, orderItem }:
|
||||
function resolveClaimOrderItemDisplaySkuName(
|
||||
orderItem: OrderItemRow,
|
||||
kuaishouCloudFulfillment: JsonObject | null,
|
||||
kuaishouCloudSource: JsonObject = {},
|
||||
) {
|
||||
const fulfillment = isPlainObject(kuaishouCloudFulfillment) ? kuaishouCloudFulfillment : {}
|
||||
const binding = isPlainObject(fulfillment.binding) ? fulfillment.binding : {}
|
||||
@@ -146,10 +154,10 @@ function resolveClaimOrderItemDisplaySkuName(
|
||||
const skuCode = String(orderItem.sku_code || '').trim()
|
||||
const rawSkuName = String(orderItem.sku_name || '').trim()
|
||||
const candidates = [
|
||||
fulfillment.internalSkuName,
|
||||
binding.skuName,
|
||||
ticket.goodsTitle,
|
||||
kuaishouCloudSource.internalSkuName,
|
||||
rawSkuName,
|
||||
ticket.goodsTitle,
|
||||
binding.skuName,
|
||||
skuCode,
|
||||
]
|
||||
|
||||
@@ -163,6 +171,65 @@ function resolveClaimOrderItemDisplaySkuName(
|
||||
return rawSkuName || skuCode
|
||||
}
|
||||
|
||||
function buildClaimProductPayload(
|
||||
displaySkuName: string,
|
||||
orderItem: OrderItemRow,
|
||||
kuaishouCloudSource: JsonObject = {},
|
||||
) {
|
||||
const binding = isPlainObject(kuaishouCloudSource.binding) ? kuaishouCloudSource.binding : {}
|
||||
const deliveryItems = normalizeClaimDeliveryItems(kuaishouCloudSource.deliveryItems, binding)
|
||||
.map((item) => ({
|
||||
cloudSkuId: item.cloudSkuId,
|
||||
name: item.cloudSkuName,
|
||||
quantity: item.quantity,
|
||||
}))
|
||||
.filter((item) => item.name)
|
||||
const normalizedDeliveryItems = deliveryItems.length > 0
|
||||
? mergeClaimProductItems(deliveryItems)
|
||||
: [{
|
||||
cloudSkuId: 0,
|
||||
name: displaySkuName,
|
||||
quantity: Math.max(1, Number(orderItem.quantity || 1) || 1),
|
||||
}]
|
||||
|
||||
return {
|
||||
title: displaySkuName,
|
||||
skuCode: String(orderItem.sku_code || '').trim(),
|
||||
quantity: Math.max(1, Number(orderItem.quantity || 1) || 1),
|
||||
isBundle: normalizedDeliveryItems.length > 1,
|
||||
items: normalizedDeliveryItems,
|
||||
}
|
||||
}
|
||||
|
||||
function mergeClaimProductItems(
|
||||
items: Array<{ cloudSkuId: number; name: string; quantity: number }>,
|
||||
) {
|
||||
const merged = new Map<string, { cloudSkuId: number; name: string; quantity: number }>()
|
||||
|
||||
for (const item of items) {
|
||||
const key = item.cloudSkuId > 0 ? `id:${item.cloudSkuId}` : `name:${item.name}`
|
||||
const existing = merged.get(key)
|
||||
if (existing) {
|
||||
existing.quantity += item.quantity
|
||||
existing.name = existing.name || item.name
|
||||
continue
|
||||
}
|
||||
|
||||
merged.set(key, { ...item })
|
||||
}
|
||||
|
||||
return Array.from(merged.values())
|
||||
}
|
||||
|
||||
function resolveClaimKuaishouCloudSource(task: TaskRow): JsonObject {
|
||||
if (String(task?.executor_key || '').trim() !== 'kuaishou_ct_assisted') {
|
||||
return {}
|
||||
}
|
||||
|
||||
const source = parseTaskContext(task).kuaishouCloudFulfillment
|
||||
return isPlainObject(source) ? source : {}
|
||||
}
|
||||
|
||||
export function mapClaimKuaishouCloudFulfillment(task: TaskRow, order: OrderRow) {
|
||||
if (String(task?.executor_key || '').trim() !== 'kuaishou_ct_assisted') {
|
||||
return null
|
||||
@@ -279,6 +346,63 @@ function isPlainObject(value: unknown): value is JsonObject {
|
||||
return Object.prototype.toString.call(value) === '[object Object]'
|
||||
}
|
||||
|
||||
function normalizeClaimDeliveryItems(value: unknown, binding: JsonObject) {
|
||||
const rawItems = Array.isArray(value) ? value : []
|
||||
const items = rawItems
|
||||
.map((item) => normalizeClaimDeliveryItem(item))
|
||||
.filter((item): item is { cloudSkuId: number; cloudSkuName: string; quantity: number } => Boolean(item))
|
||||
|
||||
if (items.length > 0) {
|
||||
return mergeClaimDeliveryItems(items)
|
||||
}
|
||||
|
||||
const cloudSkuId = Number(binding.skuId || 0) || 0
|
||||
if (!cloudSkuId) {
|
||||
return []
|
||||
}
|
||||
|
||||
return [{
|
||||
cloudSkuId,
|
||||
cloudSkuName: String(binding.skuName || '').trim(),
|
||||
quantity: 1,
|
||||
}]
|
||||
}
|
||||
|
||||
function normalizeClaimDeliveryItem(value: unknown) {
|
||||
const source = isPlainObject(value) ? value : {}
|
||||
const cloudSkuId = Number(source.cloudSkuId || source.skuId || 0) || 0
|
||||
|
||||
if (!Number.isInteger(cloudSkuId) || cloudSkuId <= 0) {
|
||||
return null
|
||||
}
|
||||
|
||||
const quantity = Number(source.quantity || 1) || 1
|
||||
return {
|
||||
cloudSkuId,
|
||||
cloudSkuName: String(source.cloudSkuName || source.skuName || '').trim(),
|
||||
quantity: Number.isInteger(quantity) && quantity > 0 ? quantity : 1,
|
||||
}
|
||||
}
|
||||
|
||||
function mergeClaimDeliveryItems(
|
||||
items: Array<{ cloudSkuId: number; cloudSkuName: string; quantity: number }>,
|
||||
) {
|
||||
const merged = new Map<number, { cloudSkuId: number; cloudSkuName: string; quantity: number }>()
|
||||
|
||||
for (const item of items) {
|
||||
const existing = merged.get(item.cloudSkuId)
|
||||
if (existing) {
|
||||
existing.quantity += item.quantity
|
||||
existing.cloudSkuName = existing.cloudSkuName || item.cloudSkuName
|
||||
continue
|
||||
}
|
||||
|
||||
merged.set(item.cloudSkuId, { ...item })
|
||||
}
|
||||
|
||||
return Array.from(merged.values())
|
||||
}
|
||||
|
||||
function isClaimPlaceholderSkuName(value: string) {
|
||||
return ['测试链接专用', '商品领取', '测试商品'].includes(String(value || '').trim())
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user