function count(value) { const number = Number(value) return Number.isFinite(number) ? number : NaN } function id(value) { return value == null ? '' : String(value) } function isoInstant(offsetDays, endOfDay = false) { const day = new Date(Date.now() + offsetDays * 86_400_000).toISOString().slice(0, 10) return `${day}T${endOfDay ? '23:59:59' : '00:00:00'}Z` } function pageOf(value) { return value && Array.isArray(value.records) && Number.isFinite(count(value.total)) } export async function run(context) { const module = 'fleet-management' const base = '/api/platform/v1/last-leg/fleet' const tripsResponse = await context.request('GET', `${base}/trips?page=1&size=20`) const trips = context.apiSuccess(module, '查询车次计划列表', tripsResponse) context.assert(module, '车次分页与状态字段完整', tripsResponse, pageOf(trips) && trips.records.every((row) => id(row.tripNo) && row.status && Number.isFinite(count(row.recordVersion))), `total=${trips?.total ?? 'missing'},records=${trips?.records?.length ?? 'missing'}`) const tripNo = trips?.records?.[0]?.tripNo if (tripNo) { const detailResponse = await context.request('GET', `${base}/trips/${encodeURIComponent(tripNo)}`) const detail = context.apiSuccess(module, '查询当前车次详情', detailResponse) context.assert(module, '车次详情包含四页签所需事实', detailResponse, id(detail?.trip?.tripNo) === id(tripNo) && detail?.trip?.status && Array.isArray(detail?.dispatches) && detail?.loadingReview != null, `tripNo=${detail?.trip?.tripNo},status=${detail?.trip?.status},dispatches=${detail?.dispatches?.length ?? 'missing'}`) } else { context.addCoverageGap(module, 'fleet-management', '车次详情', '当前没有车次样本;先由海外排车/车队入口创建本轮车次后重跑', 'not-implemented', { blocking: false }) } const operationsResponse = await context.request('GET', `${base}/operations?page=1&size=20&from=${isoInstant(-30)}&to=${isoInstant(0, true)}`) const operations = context.apiSuccess(module, '查询出车记录', operationsResponse) context.assert(module, '出车记录分页、汇总与图表结构完整', operationsResponse, pageOf(operations?.page) && Number.isFinite(count(operations?.summary?.trips)) && Array.isArray(operations?.summary?.externalAgreedAmounts) && operations?.charts && Array.isArray(operations.charts.physicalPallets), `trips=${operations?.summary?.trips ?? 'missing'},pageTotal=${operations?.page?.total ?? 'missing'}`) context.assert(module, '未登记或未分摊成本不按零展示', operationsResponse, operations?.summary?.costs == null || (typeof operations.summary.costs.visible === 'boolean' && (operations.summary.costs.unrecordedTrips == null || Number.isFinite(count(operations.summary.costs.unrecordedTrips)))), JSON.stringify(operations?.summary?.costs || {}).slice(0, 200)) const quotesResponse = await context.request('GET', `${base}/quotes?page=1&size=20`) const quotes = context.apiSuccess(module, '查询车队报价', quotesResponse) context.assert(module, '车队报价分页字段完整', quotesResponse, pageOf(quotes) && quotes.records.every((row) => id(row.quoteNo) && row.status != null && (row.recordVersion == null || Number.isFinite(count(row.recordVersion)))), `total=${quotes?.total ?? 'missing'},records=${quotes?.records?.length ?? 'missing'}`) const offersResponse = await context.request('GET', `${base}/capacity-offers?page=1&size=20`) const offers = context.apiSuccess(module, '查询内部拼车需求池', offersResponse) context.assert(module, '拼车需求分页字段完整', offersResponse, pageOf(offers) && offers.records.every((row) => row.status != null), `total=${offers?.total ?? 'missing'},records=${offers?.records?.length ?? 'missing'}`) const missingResponse = await context.request('GET', `${base}/trips/FLEET-MISSING-TRIP`) context.assert(module, '不存在的车次详情被拒绝', missingResponse, (missingResponse.http === 200 && ['A0403', 'A0404'].includes(String(missingResponse.body?.code))) || missingResponse.http === 404, `HTTP=${missingResponse.http},code=${missingResponse.body?.code ?? 'missing'}`) context.addCoverageGap(module, 'fleet-management', '车次写命令', '车次计划/分配/审核/发车/结案依赖本轮排车与车辆资源;本模块只读核对列表、详情、出车记录、报价和拼车需求', 'not-implemented', { blocking: false }) }