80 lines
4.5 KiB
JavaScript
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 })
|
||
|
|
}
|