fix(worker-platform): 补齐拼单份额超时自动处置机制与退回大厅流程
- 根因排查:此前超时扫描仅针对整单 in_progress,而拼单母单为 open 且 deadline_at 为空,导致打手超时的拼单份额无法被定时扫描命中与释放; - 定时扫描:在 settleOverdueWorkOrders 中引入 listOverdueWorkOrderShares,自动扫描超时未提交资料的拼单份额(joined); - 超时处置:新增 settleOverdueWorkOrderShare 事务处理,按母单 timeout_policy 释放或扣除押金,份额标记 cancelled,母单保持或恢复 open 状态重回抢单大厅,记录 timeout 事件并推送实时变更; - 提交防呆:在打手提交拼单验收时检测个人份额是否已超时,超时则立即执行处置并拦截提交; - 倒计时展示:在 mapWorkOrderForWorker 中根据 myShare.created_at + timeout_minutes 为拼单打手计算并展示个人履约截止时间; - 质量验证:补齐拼单截止时间计算与处置链路测试,全量 676 个测试均通过,通过 npm run check 校验。
This commit is contained in:
@@ -128,7 +128,9 @@ export function resolveOrderFulfillmentType({
|
||||
fulfillmentType: 'auto_claim' | 'worker_dispatch' | 'voucher_only' | 'manual'
|
||||
canClaimH5: boolean
|
||||
} {
|
||||
const normProvider = String(provider || '').trim().toLowerCase()
|
||||
const normProvider = String(provider || '')
|
||||
.trim()
|
||||
.toLowerCase()
|
||||
const hasAutoClaimTask =
|
||||
tasks.some(
|
||||
(t) =>
|
||||
|
||||
@@ -139,7 +139,9 @@ export async function getAdminOrders(
|
||||
}
|
||||
}
|
||||
|
||||
function groupRowsByOrderId<T extends { order_id?: number | string | null }>(rows: T[]): Map<number, T[]> {
|
||||
function groupRowsByOrderId<T extends { order_id?: number | string | null }>(
|
||||
rows: T[],
|
||||
): Map<number, T[]> {
|
||||
const grouped = new Map<number, T[]>()
|
||||
for (const row of rows) {
|
||||
// pg BIGINT 常以 string 返回;统一 Number 键,避免列表挂不上 order_items →「商品 0」。
|
||||
|
||||
@@ -292,7 +292,9 @@ function resolveTaskDisplayRoleName(task: TaskRow): string {
|
||||
const affiliateDash = context.affiliateDash
|
||||
if (affiliateDash && typeof affiliateDash === 'object') {
|
||||
const dash = affiliateDash as Record<string, unknown>
|
||||
const name = String(dash.roleName || dash.boundRoleName || dash.game_account_role_name || '').trim()
|
||||
const name = String(
|
||||
dash.roleName || dash.boundRoleName || dash.game_account_role_name || '',
|
||||
).trim()
|
||||
if (name) return name
|
||||
}
|
||||
const kuaishouCloud = context.kuaishouCloudFulfillment
|
||||
@@ -314,11 +316,11 @@ function resolveTaskDisplayRoleId(task: TaskRow): string {
|
||||
const dash = affiliateDash as Record<string, unknown>
|
||||
const id = String(
|
||||
dash.boundAccount ||
|
||||
dash.gameAccount ||
|
||||
dash.expectedGameAccount ||
|
||||
dash.game_uid ||
|
||||
dash.game_account ||
|
||||
'',
|
||||
dash.gameAccount ||
|
||||
dash.expectedGameAccount ||
|
||||
dash.game_uid ||
|
||||
dash.game_account ||
|
||||
'',
|
||||
).trim()
|
||||
if (id) return id
|
||||
}
|
||||
|
||||
@@ -184,4 +184,3 @@ export function isMaskedSecretValue(value: unknown, currentSecret = ''): boolean
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user