Files
baiyue-firstleg/scripts/admin-test-env-modules/fleet-management.mjs
T
2026-10-20 14:22:55 +08:00

80 lines
4.5 KiB
JavaScript

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 })
}