优化 affiliate-dash 商户单号
This commit is contained in:
@@ -0,0 +1,77 @@
|
||||
import assert from 'node:assert/strict'
|
||||
import test from 'node:test'
|
||||
|
||||
import { buildAffiliateDashClientOrderNo } from './index.js'
|
||||
import type { TaskRow } from '../../../types/repository/rows.js'
|
||||
|
||||
function buildTask(overrides: Partial<TaskRow> = {}): TaskRow {
|
||||
return {
|
||||
id: 101,
|
||||
order_id: 10,
|
||||
order_item_id: 20,
|
||||
unit_index: 1,
|
||||
platform_order_id: '2622300001260431',
|
||||
profile_id: 1,
|
||||
task_no: 'DTeb37abafd722',
|
||||
executor_key: 'affiliate_dash',
|
||||
task_status: 'pending_payment',
|
||||
delivery_status: 'pending',
|
||||
result_code: '',
|
||||
result_message: '',
|
||||
automation_mode: 'automatic',
|
||||
requires_claim: true,
|
||||
user_action_status: 'pending_claim',
|
||||
attempt_count: 0,
|
||||
runtime_session_id: '',
|
||||
login_type: '',
|
||||
nickname: '',
|
||||
role_name: '',
|
||||
role_id: '',
|
||||
area: '',
|
||||
partition_name: '',
|
||||
claim_token: '',
|
||||
primary_claim_token: '',
|
||||
primary_claim_token_id: null,
|
||||
primary_claim_token_status: '',
|
||||
artifacts_json: '{}',
|
||||
context_json: '{}',
|
||||
screenshot_path: '',
|
||||
last_error: '',
|
||||
retry_count: 0,
|
||||
created_at: '2026-08-11T00:00:00.000Z',
|
||||
updated_at: '2026-08-11T00:00:00.000Z',
|
||||
claimed_at: null,
|
||||
role_confirmed_at: null,
|
||||
redeemed_at: null,
|
||||
...overrides,
|
||||
}
|
||||
}
|
||||
|
||||
test('buildAffiliateDashClientOrderNo uses the platform order number for a single task', () => {
|
||||
const task = buildTask()
|
||||
|
||||
assert.equal(
|
||||
buildAffiliateDashClientOrderNo(task, [task]),
|
||||
'2622300001260431',
|
||||
)
|
||||
})
|
||||
|
||||
test('buildAffiliateDashClientOrderNo appends a stable position for split affiliate-dash tasks', () => {
|
||||
const firstTask = buildTask({ id: 101, unit_index: 1 })
|
||||
const secondTask = buildTask({ id: 102, order_item_id: 21, unit_index: 1 })
|
||||
|
||||
assert.equal(
|
||||
buildAffiliateDashClientOrderNo(firstTask, [secondTask, firstTask]),
|
||||
'2622300001260431-1',
|
||||
)
|
||||
assert.equal(
|
||||
buildAffiliateDashClientOrderNo(secondTask, [secondTask, firstTask]),
|
||||
'2622300001260431-2',
|
||||
)
|
||||
})
|
||||
|
||||
test('buildAffiliateDashClientOrderNo falls back to the task number without a platform order number', () => {
|
||||
const task = buildTask({ platform_order_id: '' })
|
||||
|
||||
assert.equal(buildAffiliateDashClientOrderNo(task, [task]), 'DTeb37abafd722')
|
||||
})
|
||||
@@ -1,5 +1,5 @@
|
||||
import { createTaskEvent } from '../../../repositories/task-event-repo.js'
|
||||
import { updateTask } from '../../../repositories/task-repo.js'
|
||||
import { listTasksByOrderId, updateTask } from '../../../repositories/task-repo.js'
|
||||
import { createHttpError } from '../../../utils/http.js'
|
||||
import { logIntegration } from '../../../utils/logger.js'
|
||||
import { parseTaskContext } from '../../../utils/task-json.js'
|
||||
@@ -58,7 +58,8 @@ export async function prepareAffiliateDashTask(task: TaskRow) {
|
||||
})
|
||||
}
|
||||
|
||||
const clientOrderNo = buildAffiliateDashClientOrderNo(task)
|
||||
const siblingTasks = await listTasksByOrderId(task.order_id)
|
||||
const clientOrderNo = buildAffiliateDashClientOrderNo(task, siblingTasks)
|
||||
const data = buildAffiliateDashOrderData(task, taskContext)
|
||||
const buyerReference = String(task.platform_order_id || task.task_no || '').trim()
|
||||
|
||||
@@ -356,9 +357,26 @@ export function normalizeAffiliateDashFlow(value: unknown): AffiliateDashFlow {
|
||||
}
|
||||
}
|
||||
|
||||
/** client_order_no = task_no(每 task 唯一,幂等键;勿用 91 单号——拆单会冲突)。 */
|
||||
export function buildAffiliateDashClientOrderNo(task: TaskRow) {
|
||||
return String(task.task_no || `OS-AD-${task.id}`).trim()
|
||||
/**
|
||||
* client_order_no 优先使用平台订单号,方便商户侧直接按订单对账。
|
||||
* affiliate-dash 要求该字段唯一;同一订单拆成多笔 affiliate-dash 任务时追加稳定序号。
|
||||
*/
|
||||
export function buildAffiliateDashClientOrderNo(task: TaskRow, siblingTasks: TaskRow[] = []) {
|
||||
const platformOrderId = String(task.platform_order_id || '').trim()
|
||||
if (!platformOrderId) {
|
||||
return String(task.task_no || `OS-AD-${task.id}`).trim()
|
||||
}
|
||||
|
||||
const affiliateDashTasks = siblingTasks
|
||||
.filter((candidate) => isAffiliateDashTask(candidate))
|
||||
.sort((left, right) => Number(left.id) - Number(right.id))
|
||||
|
||||
if (affiliateDashTasks.length <= 1) {
|
||||
return platformOrderId
|
||||
}
|
||||
|
||||
const position = affiliateDashTasks.findIndex((candidate) => candidate.id === task.id) + 1
|
||||
return `${platformOrderId}-${position > 0 ? position : task.id}`
|
||||
}
|
||||
|
||||
async function preflightAffiliateDashWallet(sku: string) {
|
||||
|
||||
Reference in New Issue
Block a user