perf(F5+): 行数据按需拉取(结果行版本信号)+ 修复 progress/light 恒判 missing
行数据按需拉取(审查 F5 后续): - V125 给 biz_file_result 补 updated_at(DEFAULT/ON UPDATE 由数据库维护, 实体标注 insertStrategy/updateStrategy=NEVER —— 否则 selectById→updateById 的 写回会把旧值写回去、ON UPDATE 不触发,版本信号静默冻结) - 装配器回传 rowsVersion=「最后变更时间毫秒#行数」,5 个品牌工具页版本未变即跳过 带行明细的重型 batch;前端变更信号为 rowsVersion + status/fileStatus/fileReady 复合 (任务收尾常见「行早写完、之后才置成功」,只看行版本会把界面卡在旧状态) 修复线上缺陷(同一功能验证时暴露): - TaskProgressLightAssembler 列裁剪漏选 module_type 却用它做模块过滤 → getModuleType() 恒为 null → light 恒把任务判成 missing;第七批把 light 接进 跟价/定时匹配/商品风险的轮询后,消费方会把运行中任务判为 FAILED - 补选中列 + 守卫用例 taskQueryMustSelectModuleType(已反向验证:去掉修复即红) - 前端 lightClaimsAllTasksMissing:整体性 missing 结论用重型端点复核后再采信 契约与文档:light 白名单补 rowsVersion(Java 契约测试 / spec 06 §2 / 12 个端点描述) 测试:mvn test 2901 全绿;前端 npm test 765 全绿
This commit is contained in:
@@ -7,6 +7,10 @@ import {
|
||||
type ProgressLightModule,
|
||||
type TaskProgressLightItem,
|
||||
} from '../src/shared/api/progress-light.ts'
|
||||
import {
|
||||
getPollingProgressBatch,
|
||||
lightClaimsAllTasksMissing,
|
||||
} from '../src/shared/api/task-progress-polling.ts'
|
||||
import type { TaskProgressBatchVo } from '../src/shared/api/types/task.ts'
|
||||
|
||||
function setupWindow() {
|
||||
@@ -164,3 +168,58 @@ test('test_light_reexport', async () => {
|
||||
assert.equal(javaModules.getModuleProgressLight, direct.getModuleProgressLight, 'java-modules 应 re-export getModuleProgressLight')
|
||||
assert.equal(javaModules.TaskProgressLightItem, direct.TaskProgressLightItem, '类型应同一引用')
|
||||
})
|
||||
|
||||
test('test_light_all_missing_needs_heavy_recheck', async (t) => {
|
||||
setupWindow()
|
||||
// light 恒判 missing(2026-09-14 线上真实故障形态)→ 必须用重型端点复核,不能直接采信
|
||||
mockRequest(t, () => okResponse({ items: [], missingTaskIds: [9101] }))
|
||||
let heavyCalls = 0
|
||||
const heavy = { items: [{ taskId: 9101, status: 'RUNNING' }], missingTaskIds: [] }
|
||||
|
||||
const batch = await getPollingProgressBatch<{ items: unknown[]; missingTaskIds: number[] }>(
|
||||
'priceTrack',
|
||||
[9101],
|
||||
{ fallback: () => { heavyCalls += 1; return Promise.resolve(heavy) } },
|
||||
)
|
||||
|
||||
assert.equal(heavyCalls, 1, '整体性 missing 结论必须复核')
|
||||
assert.deepEqual(batch, heavy, '以重型端点结果为准')
|
||||
})
|
||||
|
||||
test('test_light_all_missing_confirmed_by_heavy', async (t) => {
|
||||
setupWindow()
|
||||
mockRequest(t, () => okResponse({ items: [], missingTaskIds: [9102] }))
|
||||
const heavy = { items: [], missingTaskIds: [9102] }
|
||||
|
||||
const batch = await getPollingProgressBatch<{ items: unknown[]; missingTaskIds: number[] }>(
|
||||
'withdraw',
|
||||
[9102],
|
||||
{ fallback: () => Promise.resolve(heavy) },
|
||||
)
|
||||
|
||||
assert.deepEqual(batch, heavy, '重型端点也判不存在时结论一致')
|
||||
})
|
||||
|
||||
test('test_light_with_items_skips_recheck', async (t) => {
|
||||
setupWindow()
|
||||
mockRequest(t, () => okResponse({ items: [{ taskId: 9103, status: 'RUNNING' }], missingTaskIds: [] }))
|
||||
let heavyCalls = 0
|
||||
|
||||
const batch = await getPollingProgressBatch<{ items: unknown[]; missingTaskIds: number[] }>(
|
||||
'shopMatch',
|
||||
[9103],
|
||||
{ fallback: () => { heavyCalls += 1; return Promise.resolve({ items: [], missingTaskIds: [] }) } },
|
||||
)
|
||||
|
||||
assert.equal(heavyCalls, 0, '有条目时不做复核,保持省流')
|
||||
assert.equal((batch.items || []).length, 1)
|
||||
})
|
||||
|
||||
test('test_light_claims_all_missing_semantics', () => {
|
||||
assert.equal(lightClaimsAllTasksMissing({ items: [], missingTaskIds: [1] }, [1]), true)
|
||||
assert.equal(lightClaimsAllTasksMissing({ items: [], missingTaskIds: [1] }, [1, 2]), false, '部分缺失不算整体性结论')
|
||||
assert.equal(lightClaimsAllTasksMissing({ items: [{ taskId: 1 }], missingTaskIds: [] }, [1]), false, '有条目即不成立')
|
||||
assert.equal(lightClaimsAllTasksMissing({ items: [], missingTaskIds: [] }, [1]), false)
|
||||
assert.equal(lightClaimsAllTasksMissing(null, [1]), false)
|
||||
assert.equal(lightClaimsAllTasksMissing({ items: [], missingTaskIds: [1] }, []), false)
|
||||
})
|
||||
|
||||
Reference in New Issue
Block a user