diff --git a/src/modules/container-loading/pages/GlobalSmartLoadingView.test.ts b/src/modules/container-loading/pages/GlobalSmartLoadingView.test.ts index 53a7c9ee..6d1ccb05 100644 --- a/src/modules/container-loading/pages/GlobalSmartLoadingView.test.ts +++ b/src/modules/container-loading/pages/GlobalSmartLoadingView.test.ts @@ -72,6 +72,16 @@ describe('GlobalSmartLoadingView', () => { expect(wrapper.text()).not.toContain('美森正班') }) + it('prefers an editable container on first load so pushed plans do not show a false editing error', async () => { + const pushed = { ...container, id: '9007199254740995', planStatus: 'LOADING' as const } + vi.mocked(listContainers).mockResolvedValue({ records: [pushed, container], page: 1, size: 100, total: 2, pages: 1 }) + const wrapper = mount(GlobalSmartLoadingView, { global: { plugins: [ElementPlus] } }) + await flushPromises() + + expect(getSmartLoadingPlanByBooking).toHaveBeenCalledWith(container.id) + expect(wrapper.text()).toContain('CB-1 装柜方案') + }) + it('refreshes the latest plan after A0409 without losing the selected container', async () => { const wrapper = mount(GlobalSmartLoadingView, { global: { plugins: [ElementPlus] } }) await flushPromises() diff --git a/src/modules/container-loading/pages/GlobalSmartLoadingView.vue b/src/modules/container-loading/pages/GlobalSmartLoadingView.vue index 2311286d..def8c584 100644 --- a/src/modules/container-loading/pages/GlobalSmartLoadingView.vue +++ b/src/modules/container-loading/pages/GlobalSmartLoadingView.vue @@ -99,6 +99,12 @@ const filteredCandidates = computed(() => { .some((value) => String(value || '').toLowerCase().includes(keyword))) }) +function preferredContainerId() { + const visible = filteredContainers.value + if (String(appliedQuery.value.status || '').trim()) return visible[0]?.id || '' + return visible.find((item) => item.planStatus === 'EDITING')?.id || visible[0]?.id || '' +} + const candidateColumns: DataTableColumn[] = [ { key: 'actions', label: '操作', width: 92, fixed: 'left', slotName: 'actions' }, { key: 'order', label: '订单/入库单', minWidth: 170, slotName: 'order' }, @@ -192,7 +198,7 @@ async function load() { ? await Promise.all(Array.from({ length: firstPage.pages - 1 }, (_, index) => listContainers({ page: index + 2, size: 100 }))) : [] containers.value = [firstPage, ...remainingPages].flatMap((page) => page.records) - if (!filteredContainers.value.some((item) => item.id === selectedContainerId.value)) selectedContainerId.value = filteredContainers.value[0]?.id || '' + if (!filteredContainers.value.some((item) => item.id === selectedContainerId.value)) selectedContainerId.value = preferredContainerId() await loadSelectedData() } catch (error) { loadError.value = getApiErrorDetails(error, '智能装柜工作台加载失败') @@ -209,7 +215,7 @@ async function selectContainer(containerId: string) { async function applyFilters(model: QueryModel) { appliedQuery.value = { ...model } if (!filteredContainers.value.some((item) => item.id === selectedContainerId.value)) { - selectedContainerId.value = filteredContainers.value[0]?.id || '' + selectedContainerId.value = preferredContainerId() await loadSelectedData() } } @@ -317,7 +323,6 @@ onMounted(load) preference-key="global-smart-loading-query" :search-on-reset="false" @search="applyFilters" - @reset="applyFilters" /> diff --git a/src/modules/loading-lists/components/LoadingListsView.test.ts b/src/modules/loading-lists/components/LoadingListsView.test.ts index 2975fd87..3f213130 100644 --- a/src/modules/loading-lists/components/LoadingListsView.test.ts +++ b/src/modules/loading-lists/components/LoadingListsView.test.ts @@ -13,9 +13,12 @@ describe('LoadingListsView', () => { expect(source.indexOf("key: 'actions'", source.indexOf("key: 'actions'") + 1)).toBeLessThan(source.indexOf("key: 'loadingListNo'")) }) - it('queries all warehouses when the warehouse filter is empty', () => { - expect(source).toContain("placeholder: loadingWarehouses.value ? '仓库加载中' : '全部仓库'") - expect(source).toContain('warehouseId: warehouseId || undefined') + it('queries all warehouses without exposing a warehouse selector', () => { + expect(source).not.toContain('listAllPlatformWarehouses') + expect(source).not.toContain("key: 'warehouseId'") + expect(source).not.toContain('loadingWarehouses') + expect(source).not.toContain('warehouseId: warehouseId || undefined') + expect(source).toContain("selectedWarehouseId.value = String(row.warehouseId || '')") expect(source).not.toContain("ElMessage.warning('请先选择仓库')") expect(source).not.toContain("'请先选择仓库后查询'") }) diff --git a/src/modules/loading-lists/components/LoadingListsView.vue b/src/modules/loading-lists/components/LoadingListsView.vue index 2723ef93..e400883e 100644 --- a/src/modules/loading-lists/components/LoadingListsView.vue +++ b/src/modules/loading-lists/components/LoadingListsView.vue @@ -3,7 +3,6 @@ import { computed, onMounted, reactive, ref, watch } from 'vue' import { ElMessage, type FormInstance, type FormRules } from 'element-plus' import { Eye } from '@lucide/vue' import { useAccessPreviewStore } from '@/core/access/accessPreview' -import { listAllPlatformWarehouses } from '@/modules/warehouses' import { getApiErrorDetails, type ApiErrorDetails } from '@/shared/api/http' import AdminPage from '@/shared/components/AdminPage.vue' import ApiErrorMeta from '@/shared/components/ApiErrorMeta.vue' @@ -31,14 +30,12 @@ import { const props = defineProps<{ mode: LoadingListMode }>() const access = useAccessPreviewStore() const rows = ref([]) -const warehouses = ref>([]) -const loadingWarehouses = ref(false) const loading = ref(false) const error = ref(null) const page = ref(1) const pageSize = ref(20) const total = ref(0) -const query = reactive({ warehouseId: '', keyword: '', createdRange: [] }) +const query = reactive({ keyword: '', createdRange: [] }) const detailOpen = ref(false) const detailLoading = ref(false) const detailError = ref(null) @@ -59,11 +56,6 @@ const canList = computed(() => access.can(listPermission.value)) const canView = computed(() => access.can(viewPermission.value)) const canEdit = computed(() => isPreload.value && access.can('platform:firstleg:preload:edit')) const fields = computed(() => [ - { - key: 'warehouseId', type: 'select', label: '仓库', placeholder: loadingWarehouses.value ? '仓库加载中' : '全部仓库', width: 220, - options: warehouses.value.map((warehouse) => ({ label: warehouse.name, value: warehouse.id })), - props: { loading: loadingWarehouses.value, clearable: true, 'aria-label': '仓库' }, - }, { key: 'keyword', type: 'input', label: '关键词', placeholder: isPreload.value ? '预装单号/集装箱号/柜号' : '装柜清单号/集装箱号/柜号', width: 250 }, { key: 'createdRange', type: 'daterange', label: '创建日期', width: 260 }, ]) @@ -116,30 +108,16 @@ function formatNumber(value?: number | null, digits = 3) { } function toQuery(): LoadingListQuery { - const warehouseId = String(query.warehouseId || '').trim() const range = Array.isArray(query.createdRange) ? query.createdRange.map(String) : [] return { page: page.value, size: pageSize.value, - warehouseId: warehouseId || undefined, keyword: String(query.keyword || '').trim() || undefined, createdFrom: range[0] ? `${range[0]}T00:00:00` : undefined, createdTo: range[1] ? `${range[1]}T23:59:59` : undefined, } } -async function loadWarehouses() { - loadingWarehouses.value = true - try { - const result = await listAllPlatformWarehouses({ status: 'ACTIVE', warehouseType: 'DOMESTIC' }) - warehouses.value = result.map((warehouse) => ({ id: String(warehouse.id), name: warehouse.warehouseName })) - } catch (cause) { - error.value = getApiErrorDetails(cause, '仓库列表加载失败,请刷新后重试') - } finally { - loadingWarehouses.value = false - } -} - async function load() { if (!canList.value) return const request = toQuery() @@ -161,10 +139,6 @@ function search() { else void load() } -function reset() { - page.value = 1 - void load() -} async function loadDetail() { if (!selectedPlanId.value || !selectedWarehouseId.value || !canView.value) return @@ -184,7 +158,7 @@ async function loadDetail() { function openDetail(rowValue: object) { const row = rowValue as LoadingListSummary selectedPlanId.value = String(row.planId) - selectedWarehouseId.value = String(row.warehouseId || query.warehouseId || '') + selectedWarehouseId.value = String(row.warehouseId || '') detail.value = null detailError.value = null detailOpen.value = true @@ -225,7 +199,6 @@ async function saveTransport() { watch([page, pageSize], () => void load()) onMounted(() => { - void loadWarehouses() void load() }) @@ -241,9 +214,7 @@ onMounted(() => { :fields="fields" :available-fields="fields" :preference-key="`loading-lists-${mode}-query`" - :search-on-reset="false" @search="search" - @reset="reset" /> diff --git a/src/modules/loading-lists/routes.ts b/src/modules/loading-lists/routes.ts index 200d0bd8..453e6f74 100644 --- a/src/modules/loading-lists/routes.ts +++ b/src/modules/loading-lists/routes.ts @@ -7,7 +7,7 @@ export const loadingListRoutes = [ component: () => import('./pages/PreloadPlansView.vue'), meta: { title: '预装清单', - description: '按仓库查看装柜中的预装计划、货物明细和操作历史', + description: '查看全部仓库装柜中的预装计划、货物明细和操作历史', permission: 'platform:firstleg:preload:list', }, },