修复 affiliate-dash 提交成功(delivered)后结果页数秒后才显示成功

- syncAffiliateDashTaskStatus 新增 snapshotOnly:submit 拿到 delivered 后直接用本地快照收敛任务为 REDEEMED,不等平台回调(此前要等 delivered notify 落地,约 9 秒)
- 新增终态保护:已 REDEEMED/MANUAL_REVIEW/CLOSED/FAILED 的任务,非 delivered 状态不再降级(轮询时平台详情短暂返回 paid/delivering 会把成功任务打回 REDEEMING)
- submitAffiliateDashClaim:result.status=delivered 时重新读任务并 snapshotOnly 收敛
This commit is contained in:
yml2213
2026-08-05 20:20:10 +08:00
parent e8eab6e689
commit 541b458040
2 changed files with 28 additions and 4 deletions
@@ -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)
}
@@ -154,7 +154,10 @@ export async function prepareAffiliateDashTask(task: TaskRow) {
* delivered → 核销行业电子凭证 → redeemed / manual_review
* ship_failed → retry_pendingcancelled → 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,