test(fba): preserve verified fleet and fulfillment acceptance workflows

This commit is contained in:
2026-10-03 06:26:33 +08:00
parent c55bd7f4b6
commit d858357c5d
52 changed files with 4217 additions and 103 deletions
@@ -1,3 +1,5 @@
import { verifyVehicleCare } from './vehicle-care.mjs'
const MODULE = 'phase4-overseas-master-data'
const DOMESTIC_BASE = '/api/platform/v1/warehouse-admin'
const OVERSEAS_BASE = '/api/platform/v1/last-leg/master-data'
@@ -298,6 +300,7 @@ function vehiclePayload(context, edited = false) {
plateNumber: `QA-${suffix}`.slice(0, 64),
model: edited ? 'Phase4 QA Truck Edited' : 'Phase4 QA Truck',
fuelConsumptionPer100Km: edited ? 18.75 : 18.5,
maxPalletSpaces: edited ? 28 : 30, maxLoadKg: edited ? 17500 : 18000, maxVolumeCbm: edited ? 88 : 90,
mileageKm: edited ? 101 : 100,
driverOrDispatchCompany: `${context.marker} Carrier`, phone: '12135550188',
region: 'OVERSEAS', ownership: 'OWNED',
@@ -306,6 +309,19 @@ function vehiclePayload(context, edited = false) {
}
}
export function vehicleCapacityMatches(actual, expected) {
return ['maxPalletSpaces', 'maxLoadKg', 'maxVolumeCbm'].every(key =>
['number', 'string'].includes(typeof actual?.[key]) && String(actual[key]).trim() !== ''
&& Number.isFinite(Number(actual[key])) && Number(actual[key]) > 0
&& Number(actual[key]) === Number(expected[key]))
}
function assertVehicleCapacity(context, name, response, actual, expected) {
context.assert(MODULE, name, response, vehicleCapacityMatches(actual, expected),
`palletSpaces=${actual?.maxPalletSpaces ?? 'missing'}, loadKg=${actual?.maxLoadKg ?? 'missing'}, volumeCbm=${actual?.maxVolumeCbm ?? 'missing'}`,
BLOCKER)
}
async function vehicleLifecycle(context, resource) {
const createPayload = vehiclePayload(context)
const createResponse = await context.request('POST', `${OVERSEAS_BASE}/vehicles`, createPayload)
@@ -313,10 +329,12 @@ async function vehicleLifecycle(context, resource) {
const id = asId(vehicle.id)
if (!id || !recordVersion(vehicle.recordVersion)) throw new Error('车辆创建响应缺少字符串ID或recordVersion')
resource.vehicle = { id, plateNumber: createPayload.plateNumber, recordVersion: Number(vehicle.recordVersion), finalStatus: vehicle.status }
assertVehicleCapacity(context, '新建车辆保存三项实际容量', createResponse, vehicle, createPayload)
const path = `${OVERSEAS_BASE}/vehicles/${encodeURIComponent(id)}`
const detailResponse = await context.request('GET', path)
vehicle = requireData(context, '查询marker车辆详情', detailResponse)
assertVehicleCapacity(context, '车辆详情回显三项实际容量', detailResponse, vehicle, createPayload)
context.assert(MODULE, '车辆详情长ID、五态字段与版本', detailResponse,
asId(vehicle.id) === id && ['IN_SERVICE', 'DISPATCHED', 'MAINTENANCE', 'INACTIVE', 'RETURNED'].includes(vehicle.status)
&& recordVersion(vehicle.recordVersion),
@@ -329,6 +347,7 @@ async function vehicleLifecycle(context, resource) {
const updatedVersion = Number(vehicle.recordVersion)
const updatedMileage = Number(vehicle.mileageKm)
resource.vehicle.recordVersion = updatedVersion
assertVehicleCapacity(context, '车辆编辑保持三项实际容量', updateResponse, vehicle, updatePayload)
context.assert(MODULE, '车辆编辑版本递增', updateResponse,
vehicle.model === updatePayload.model && updatedMileage === Number(updatePayload.mileageKm)
&& updatedVersion === Number(staleVersion) + 1,
@@ -353,14 +372,18 @@ async function vehicleLifecycle(context, resource) {
const listResponse = await context.request('GET', `${OVERSEAS_BASE}/vehicles?page=1&size=20&keyword=${encodeURIComponent(createPayload.plateNumber)}`)
const page = requireData(context, '分页查询marker车辆', listResponse)
assertVehicleCapacity(context, '车辆列表回显三项实际容量', listResponse,
page?.records?.find(item => asId(item.id) === id), updatePayload)
context.assert(MODULE, '车辆列表包含本轮长ID与recordVersion', listResponse,
Array.isArray(page?.records) && page.records.some((item) => asId(item.id) === id && recordVersion(item.recordVersion)),
`id=${id}, total=${page?.total ?? 'missing'}`, BLOCKER)
const csv = await context.requestBinary('GET', `${OVERSEAS_BASE}/vehicles/export?keyword=${encodeURIComponent(createPayload.plateNumber)}`)
assertBinaryCsv(context, '导出marker车辆CSV', csv,
'车辆ID,车牌号,车型,油耗(L/100km),当前公里码(km),司机或外派单位,联系电话,区域,车辆归属,状态,更新时间',
[id, createPayload.plateNumber, 'MAINTENANCE'])
'车牌号,车型,油耗(L/100km),当前公里码(km),司机或外派单位,联系电话,区域,车辆归属,状态,最大托位,最大载重(kg),可用容积(m³),更新时间',
[createPayload.plateNumber, 'MAINTENANCE', String(updatePayload.maxLoadKg)])
resource.vehicle.care = {}
await verifyVehicleCare(context, MODULE, vehicle, resource.vehicle.care)
}
async function verifyCanonicalPermissionDenial(context, resource) {