diff --git a/apps/backend/src/services/claim/kuaishou-cloud-claim-service.ts b/apps/backend/src/services/claim/kuaishou-cloud-claim-service.ts index 2e0334d7..295c2231 100644 --- a/apps/backend/src/services/claim/kuaishou-cloud-claim-service.ts +++ b/apps/backend/src/services/claim/kuaishou-cloud-claim-service.ts @@ -1,5 +1,5 @@ import { createTaskEvent } from '../../repositories/task-event-repo.js' -import { updateTask } from '../../repositories/task-repo.js' +import { getTaskById, updateTask } from '../../repositories/task-repo.js' import { createHttpError } from '../../utils/http.js' import { parseTaskContext as parseTaskContextValue } from '../../utils/task-json.js' import { nowIso } from '../../utils/time.js' @@ -456,6 +456,15 @@ export async function submitAffiliateDashClaim( now, ) + // 平台已返回 delivered:立即用本地快照收敛任务为成功,不等平台回调(避免结果页等数秒)。 + // delivered 回调到达时 sync 幂等短路(已 REDEEMED 且 delivered 仍会刷新,无副作用)。 + if (result.status === 'delivered') { + const refreshedTask = await getTaskById(task.id) + if (refreshedTask) { + await syncAffiliateDashTaskStatus(refreshedTask, { snapshotOnly: true }) + } + } + return getKuaishouCloudClaimDetail(token) } diff --git a/apps/backend/src/services/fulfillment/affiliate-dash/index.ts b/apps/backend/src/services/fulfillment/affiliate-dash/index.ts index d0a4b90b..501980ce 100644 --- a/apps/backend/src/services/fulfillment/affiliate-dash/index.ts +++ b/apps/backend/src/services/fulfillment/affiliate-dash/index.ts @@ -154,7 +154,10 @@ export async function prepareAffiliateDashTask(task: TaskRow) { * delivered → 核销行业电子凭证 → redeemed / manual_review; * ship_failed → retry_pending;cancelled → closed。 */ -export async function syncAffiliateDashTaskStatus(task: TaskRow) { +export async function syncAffiliateDashTaskStatus( + task: TaskRow, + options: { snapshotOnly?: boolean } = {}, +) { if (!isAffiliateDashTask(task)) { return task } @@ -166,8 +169,10 @@ export async function syncAffiliateDashTaskStatus(task: TaskRow) { } const now = nowIso() - // dev-mock 任务:不请求 affiliate-dash 平台,直接用本地快照(flow 自身)收敛状态 - const order = flow.mock?.enabled + // dev-mock 任务或 snapshotOnly(如 submit 已拿到 delivered)不请求 affiliate-dash 平台, + // 直接用本地快照(flow 自身)收敛状态。 + const useSnapshot = Boolean(flow.mock?.enabled) || options.snapshotOnly + const order = useSnapshot ? ({ orderNo: flow.orderNo, orderStatus: flow.orderStatus, @@ -249,6 +254,16 @@ export async function syncAffiliateDashTaskStatus(task: TaskRow) { break } + const isAlreadyTerminal = ( + [TASK_STATUS.REDEEMED, TASK_STATUS.MANUAL_REVIEW, TASK_STATUS.CLOSED, TASK_STATUS.FAILED] as string[] + ).includes(task.task_status) + // 终态保护:已收敛成功的任务,非 delivered 状态不允许降级(如轮询时平台详情短暂返回 + // delivering/paid 会把 REDEEMED 打回 REDEEMING,导致结果页闪烁/倒退)。 + const shouldApply = !isAlreadyTerminal || order.orderStatus === 'delivered' + if (!shouldApply) { + return task + } + const updatedTask = await updateTask(task.id, { task_status: nextTaskStatus, delivery_status: deliveryStatus,