修复订单货柜预约与排车维护界面

This commit is contained in:
2026-10-21 23:20:10 +08:00
parent 93a31b3872
commit 2e26477db5
68 changed files with 602 additions and 239 deletions
@@ -24,16 +24,23 @@ it('shows readable preview requirements without exposing missing-field machine c
expect(wrapper.text()).not.toContain('CARGO_QUANTITY_REVIEW')
wrapper.unmount()
})
it('previews and creates the exact canonical external source and customer without inventing times', async () => {
async function confirmRegistration(wrapper: ReturnType<typeof render>) {
const fields = wrapper.getComponent({ name: 'FbaAppointmentFields' })
Object.assign(fields.props('model'), { confirmationNo: 'EXT-CONFIRMED', appointmentAt: '2026-10-16T09:30:00' })
fields.vm.$emit('confirmationReady', true)
await flushPromises()
}
it('previews and creates the exact canonical external source and customer with real confirmation', async () => {
const wrapper = render(); await flushPromises()
await confirmRegistration(wrapper)
expect(previewPlanningBatch).toHaveBeenCalledWith(sources)
await wrapper.get('input').setValue('2026-10-16'); await wrapper.get('button').trigger('click'); await flushPromises()
expect(createSourceAppointment).toHaveBeenCalledWith(expect.objectContaining({ sources, originWarehouseId: 'origin-1', fbaWarehouseCode: 'ONT8', details: expect.objectContaining({ plannedDate: '2026-10-16', plannedAt: null, plannedEndAt: null, appointmentStatus: 'PENDING' }) }))
expect(createSourceAppointment).toHaveBeenCalledWith(expect.objectContaining({ sources, originWarehouseId: 'origin-1', fbaWarehouseCode: 'ONT8', details: expect.objectContaining({ plannedDate: '2026-10-16', plannedAt: null, plannedEndAt: null, appointmentStatus: 'SUCCESS', confirmationNo: 'EXT-CONFIRMED' }) }))
expect(wrapper.emitted('saved')).toHaveLength(1); expect(wrapper.text()).not.toContain('external-1'); wrapper.unmount()
})
it('retains the same immutable request after an unknown outcome and blocks leaving', async () => {
vi.mocked(createSourceAppointment).mockRejectedValueOnce(new Error('connection lost'))
const wrapper = render(); await flushPromises(); await wrapper.get('button').trigger('click'); await flushPromises()
const wrapper = render(); await flushPromises(); await confirmRegistration(wrapper); await wrapper.get('button').trigger('click'); await flushPromises()
const request = vi.mocked(createSourceAppointment).mock.calls[0]![0]
expect(await guard()).toBe(false)
await wrapper.get('button').trigger('click'); await flushPromises()
@@ -42,6 +49,7 @@ it('retains the same immutable request after an unknown outcome and blocks leavi
it('refreshes qualification after conflict while keeping user-entered dates', async () => {
vi.mocked(createSourceAppointment).mockRejectedValueOnce(new ApiResponseError('来源变化', 'A0409', 409))
const wrapper = render(); await flushPromises(); await wrapper.get('input').setValue('2026-10-16')
await confirmRegistration(wrapper)
await wrapper.get('button').trigger('click'); await flushPromises()
expect(previewPlanningBatch).toHaveBeenCalledTimes(2)
expect((wrapper.get('input').element as HTMLInputElement).value).toBe('2026-10-16')