fix: restore original-container sailing schedule editing
This commit is contained in:
@@ -4,3 +4,16 @@ import { createPortSchedule, listPortSchedules, updatePortSchedule } from './pla
|
||||
vi.mock('@/shared/api/http', async () => { const actual = await vi.importActual<typeof import('@/shared/api/http')>('@/shared/api/http'); return { ...actual, http: { get: vi.fn(), post: vi.fn(), put: vi.fn() } } })
|
||||
const data = { customerId: '1', oceanBookingId: '2', sourceType: 'MANUAL', sourceName: '美森', sourceRef: 'web', vesselName: 'MATSON', voyageNo: 'V1', departurePortCode: 'CNSHA', destinationPortCode: 'USLAX', observedAt: '2026-08-11T10:00:00', expiresAt: '2026-08-14T10:00:00' }
|
||||
describe('platformPortSchedules', () => { beforeEach(() => vi.clearAllMocks()); it('normalizes long ids in pages', async () => { vi.mocked(http.get).mockResolvedValue({ code: '200', data: { records: [{ schedule: { ...data, id: 9, scheduleNo: 'PS1', customerId: 1, oceanBookingId: 2, version: '3' }, expired: false }], page: 1, size: 20, total: 1, pages: 1 } }); const result = await listPortSchedules({ page: 1, size: 20 }); expect(result.records[0]?.schedule).toMatchObject({ id: '9', customerId: '1', oceanBookingId: '2', version: 3 }) }); it('uses idempotency and expectedVersion for writes', async () => { vi.mocked(http.post).mockResolvedValue({ code: '200', data: { portSchedule: { schedule: { ...data, id: 9, scheduleNo: 'PS1', version: 0 }, expired: false }, histories: [] } }); vi.mocked(http.put).mockResolvedValue({ code: '200', data: { portSchedule: { schedule: { ...data, id: 9, scheduleNo: 'PS1', version: 2 }, expired: false }, histories: [] } }); await createPortSchedule(data); await updatePortSchedule('9', { expectedVersion: 1, data }); expect(vi.mocked(http.post).mock.calls[0]?.[2]).toMatchObject({ headers: { 'Idempotency-Key': expect.any(String) } }); expect(vi.mocked(http.put).mock.calls[0]?.[1]).toMatchObject({ expectedVersion: 1 }) }) })
|
||||
|
||||
it('passes exact container filters and caller-frozen keys and creation reason', async () => {
|
||||
vi.mocked(http.get).mockResolvedValue({ code: '200', data: { records: [], page: 1, size: 1, total: 0, pages: 0 } })
|
||||
const query = { page: 1, size: 1, customerId: '1', oceanBookingId: '2', containerBookingId: '3' }
|
||||
await listPortSchedules(query)
|
||||
expect(http.get).toHaveBeenLastCalledWith('/platform/v1/port-schedules', { params: query })
|
||||
const response = { code: '200', data: { portSchedule: { schedule: { ...data, id: '9', scheduleNo: 'PS1', version: 1 }, expired: false }, histories: [] } }
|
||||
vi.mocked(http.post).mockResolvedValue(response); vi.mocked(http.put).mockResolvedValue(response)
|
||||
await createPortSchedule({ ...data, containerBookingId: '3' }, 'create-frozen', '人工确认')
|
||||
expect(http.post).toHaveBeenLastCalledWith('/platform/v1/port-schedules', { expectedVersion: 0, data: { ...data, containerBookingId: '3' }, reason: '人工确认' }, { headers: { 'Idempotency-Key': 'create-frozen' } })
|
||||
await updatePortSchedule('9', { expectedVersion: 1, data, reason: '甩柜改配' }, 'edit-frozen')
|
||||
expect(http.put).toHaveBeenLastCalledWith('/platform/v1/port-schedules/9', { expectedVersion: 1, data, reason: '甩柜改配' }, { headers: { 'Idempotency-Key': 'edit-frozen' } })
|
||||
})
|
||||
|
||||
@@ -20,5 +20,5 @@ export async function listPortSchedules(query: PortScheduleQuery) {
|
||||
return { ...data, records: (data.records || []).map(view), page: Number(data.page), size: Number(data.size), total: Number(data.total), pages: Number(data.pages) }
|
||||
}
|
||||
export async function getPortSchedule(id: string) { const response = await http.get<ApiEnvelope<PortScheduleDetail>, ApiEnvelope<PortScheduleDetail>>(`${basePath}/${encodeURIComponent(id)}`); return detail(unwrapApiResponse(response)) }
|
||||
export async function createPortSchedule(data: PortScheduleData) { const response = await http.post<ApiEnvelope<PortScheduleDetail>, ApiEnvelope<PortScheduleDetail>>(basePath, { expectedVersion: 0, data }, { headers: { 'Idempotency-Key': idem() } }); return detail(unwrapApiResponse(response)) }
|
||||
export async function updatePortSchedule(id: string, request: PortScheduleSaveRequest) { const response = await http.put<ApiEnvelope<PortScheduleDetail>, ApiEnvelope<PortScheduleDetail>>(`${basePath}/${encodeURIComponent(id)}`, request, { headers: { 'Idempotency-Key': idem() } }); return detail(unwrapApiResponse(response)) }
|
||||
export async function createPortSchedule(data: PortScheduleData, idempotencyKey = idem(), reason?: string) { const response = await http.post<ApiEnvelope<PortScheduleDetail>, ApiEnvelope<PortScheduleDetail>>(basePath, { expectedVersion: 0, data, ...(reason ? { reason } : {}) }, { headers: { 'Idempotency-Key': idempotencyKey } }); return detail(unwrapApiResponse(response)) }
|
||||
export async function updatePortSchedule(id: string, request: PortScheduleSaveRequest, idempotencyKey = idem()) { const response = await http.put<ApiEnvelope<PortScheduleDetail>, ApiEnvelope<PortScheduleDetail>>(`${basePath}/${encodeURIComponent(id)}`, request, { headers: { 'Idempotency-Key': idempotencyKey } }); return detail(unwrapApiResponse(response)) }
|
||||
|
||||
Reference in New Issue
Block a user