This commit is contained in:
2026-08-15 11:36:53 +08:00
parent 282eb73371
commit 46cb95db15
6 changed files with 119 additions and 26 deletions
@@ -2,6 +2,7 @@ const MODULE = 'truck-appointments'
const OPTIONS = { scenario: 'truck-appointment-lifecycle', deploymentBlocker: true }
const BASE = '/api/platform/v1/truck-appointments'
const OCEAN_BOOKING_BASE = '/api/platform/v1/ocean-bookings'
const SUPPLIER_BASE = '/api/platform/v1/suppliers?tenantId=0'
function id(value) { return value == null ? '' : String(value) }
function codeOf(response) { return response?.body?.code == null ? 'missing' : String(response.body.code) }
@@ -67,10 +68,11 @@ export function inspectOceanBookingIdentity(marker, resource, detail = null) {
}
export function truckAppointmentPayload(context, suffix, identity, version = 0) {
const supplier = context.createdResources?.truckSupplier || {}
return {
outboundOrderId: null, oceanBookingId: identity.oceanBookingId, containerBookingId: null, loadingPlanId: null,
warehouseId: identity.warehouseId, customerId: identity.customerId, customerName: identity.customerName,
carrierId: null, carrierName: `承运商-${suffix}`, fleetContact: '车队联系人', fleetPhone: '13800000004',
carrierId: supplier.supplierId || null, carrierName: supplier.supplierName || `承运商-${suffix}`, fleetContact: '车队联系人', fleetPhone: '13800000004',
driverName: '司机验收', driverPhone: '13800000005', driverIdCard: null, vehicleNo: `粤B-${suffix.slice(-6)}`,
storeName: `门店-${suffix}`, storeContact: '门店联系人', storePhone: '13800000006', storeAddress: '深圳市南山区验收地址',
storeCity: '深圳市', storeZipcode: '518000', packageCount: 10, grossWeightKg: 100, volumeCbm: 2.5,
@@ -79,6 +81,30 @@ export function truckAppointmentPayload(context, suffix, identity, version = 0)
}
}
async function ensureTruckSupplier(context, suffix) {
const response = await request(context, 'POST', SUPPLIER_BASE, {
name: `拖车供应商-${suffix}`.slice(0, 128), category: 'TRUCKING', scope: null,
region: '深圳', legalRepresentative: '验收法人', contactName: '拖车联系人',
phone: '13800000000', email: 'trucking-acceptance@example.com', address: '深圳市验收地址',
businessLicenseNo: `TRUCK${suffix}`.slice(0, 64), licenseFileId: null,
status: 'ACTIVE', settlementPeriod: 'MONTHLY_30', remark: context.marker,
})
const supplierValue = data(response)
const supplierId = id(typeof supplierValue === 'object' ? supplierValue?.id : supplierValue)
let supplier = typeof supplierValue === 'object' ? supplierValue : null
if (supplierId) {
const detailResponse = await request(context, 'GET', `/api/platform/v1/suppliers/${encodeURIComponent(supplierId)}?tenantId=0`)
supplier = data(detailResponse)
}
context.addStep(MODULE, '创建本轮有效拖车供应商', response,
Boolean(supplierId) && supplier?.category === 'TRUCKING' && supplier?.status === 'ACTIVE',
`supplierId=${supplierId || 'missing'}, category=${supplier?.category || 'missing'}, status=${supplier?.status || 'missing'}`, OPTIONS)
if (supplierId) context.createdResources.truckSupplier = {
marker: context.marker, supplierId, supplierName: supplier.name, finalStatus: 'ACTIVE', retained: true,
}
return context.createdResources.truckSupplier || null
}
export async function run(context) {
const suffix = context.marker.replace(/\D/g, '').slice(-10)
const list = await request(context, 'GET', `${BASE}?page=1&size=5&keyword=${encodeURIComponent(context.marker)}`)
@@ -122,6 +148,9 @@ export async function run(context) {
}
const bookingIdentity = Object.freeze({ ...identityResult.identity })
const truckSupplier = await ensureTruckSupplier(context, suffix)
if (!truckSupplier) return
const createResponse = await request(context, 'POST', BASE, truckAppointmentPayload(context, suffix, bookingIdentity)); const appointment = context.apiSuccess(MODULE, '创建隔离拖车预约', createResponse, '', OPTIONS)
const appointmentId = id(appointment?.id)
context.assert(MODULE, '拖车预约费用、司机车辆和地址字段完整', createResponse, Boolean(appointmentId) && appointment?.status === 'DRAFT' && appointment?.payableAmount != null && appointment?.receivableAmount != null, `id=${appointmentId || 'missing'}, status=${appointment?.status || 'missing'}`, OPTIONS)