fix: 免审验收容错与成本中心归一回填超时修复

- worker:等级升级计数移出验收事务,瞬时错误重试一次,最终失败转人工待办且不再返回 500
- worker:待验收阶段修改验收资料时保留 reviewMode/evidenceStatus/evidenceDueAt
- cost-center:迁移 107 新增人工待归一覆盖部分索引(生产实测候选聚合 19.6s → 391ms)
- cost-center:归一人工商品/按工单回填商品/模板预览前端超时放宽到 300s
- cost-center:批处理接口语句超时放宽到 60s(SET LOCAL,在线接口仍为 15s)
This commit is contained in:
yml2213
2026-10-29 14:33:35 +08:00
parent 814b357d46
commit 979a1bfa41
13 changed files with 617 additions and 68 deletions
@@ -1,6 +1,9 @@
import assert from 'node:assert/strict'
import test from 'node:test'
import { hasAcceptanceEvidence } from './work-order-acceptance-evidence.js'
import {
hasAcceptanceEvidence,
resolveVipAutoAcceptEvidencePatch,
} from './work-order-acceptance-evidence.js'
const VIDEO = { url: 'https://example.com/worker-acceptance-video/a.mp4', durationSeconds: 12 }
@@ -29,3 +32,51 @@ test('验收证据:兼容非数组的 imageUrls(脏数据按无图片处理
assert.equal(hasAcceptanceEvidence({ imageUrls: null, video: VIDEO }), true)
assert.equal(hasAcceptanceEvidence({ imageUrls: null, video: null }), false)
})
test('VIP 免审:待验收阶段改写验收资料后仍保留免审标记并清空补图期限', () => {
const patch = resolveVipAutoAcceptEvidencePatch(
{
reviewMode: 'vip_auto',
evidenceStatus: 'pending',
evidenceDueAt: '2026-10-30T06:00:00.000Z',
},
hasAcceptanceEvidence({ imageUrls: ['https://example.com/a.jpg'] }),
)
assert.deepEqual(patch, {
reviewMode: 'vip_auto',
evidenceStatus: 'complete',
evidenceDueAt: null,
})
})
test('VIP 免审:仍无证据时保留原 24 小时补图期限', () => {
const patch = resolveVipAutoAcceptEvidencePatch(
{
reviewMode: 'vip_auto',
evidenceStatus: 'pending',
evidenceDueAt: '2026-10-30T06:00:00.000Z',
},
hasAcceptanceEvidence({}),
)
assert.deepEqual(patch, {
reviewMode: 'vip_auto',
evidenceStatus: 'pending',
evidenceDueAt: '2026-10-30T06:00:00.000Z',
})
})
test('VIP 免审:改写资料时补图期限缺失也按无期限处理', () => {
const patch = resolveVipAutoAcceptEvidencePatch({ reviewMode: 'vip_auto' }, false)
assert.deepEqual(patch, {
reviewMode: 'vip_auto',
evidenceStatus: 'pending',
evidenceDueAt: null,
})
})
test('非 VIP 免审订单不写入免审标记', () => {
assert.deepEqual(resolveVipAutoAcceptEvidencePatch({ evidenceStatus: 'complete' }, true), {})
})
@@ -13,3 +13,26 @@ export function hasAcceptanceEvidence(input: {
const imageCount = Array.isArray(imageUrls) ? imageUrls.length : 0
return imageCount > 0 || Boolean(input.video)
}
/**
* 免审核验收的结算标记。
*
* 打手在「待验收」阶段改写验收资料时会整体重建 `acceptance_json`,
* 这里把 `reviewMode` / `evidenceStatus` / `evidenceDueAt` 一起带回去,
* 否则「VIP 免审核,待补图」标记、列表筛选和 24 小时补图期限都会丢。
*/
export function resolveVipAutoAcceptEvidencePatch(
previous: Record<string, unknown>,
hasEvidence: boolean,
): Record<string, unknown> {
if (String(previous.reviewMode || '') !== 'vip_auto') return {}
return {
reviewMode: 'vip_auto',
evidenceStatus: hasEvidence ? 'complete' : 'pending',
evidenceDueAt: hasEvidence
? null
: typeof previous.evidenceDueAt === 'string'
? previous.evidenceDueAt
: null,
}
}