fix(admin): restore loading list detail page navigation

This commit is contained in:
2026-10-08 13:59:20 +08:00
parent d7911ad09d
commit f24b592705
8 changed files with 123 additions and 76 deletions
@@ -1,7 +1,6 @@
<script setup lang="ts">
import '@/styles/adminDensity.css'
import { computed, nextTick, onMounted, reactive, ref, watch } from 'vue'
import LoadingListDetailDrawer from './LoadingListDetailDrawer.vue'
import { computed, onMounted, reactive, ref, watch } from 'vue'
import { useRoute, useRouter } from 'vue-router'
import { ContainerSimulationCreate } from '@/modules/container-loading'
@@ -19,8 +18,6 @@ import StatusBadge from '@/shared/components/StatusBadge.vue'
import { loadingListStatusLabel } from '../status'
import {
listConfirmedLoadingLists,
getConfirmedLoadingList,
type LoadingDetail,
listPreloadPlans,
type ConfirmedSummary,
type LoadingListMode,
@@ -43,44 +40,8 @@ const customers = ref<PlatformTenantResource[]>([])
const customersLoading = ref(false)
const query = reactive<QueryModel>({ customerId: '', keyword: '', createdRange: [] })
const handledDeepLink = ref('')
const selectedPlan = ref<{ planId: string; warehouseId: string } | null>(null)
const confirmedDetail = ref<LoadingDetail<ConfirmedSummary> | null>(null)
const detailLoading = ref(false)
const detailError = ref<ApiErrorDetails | null>(null)
let detailSequence = 0
function closeConfirmedDetail() {
++detailSequence
selectedPlan.value = null
confirmedDetail.value = null
detailError.value = null
detailLoading.value = false
}
async function loadConfirmedDetail(planId: string, warehouseId: string) {
const sequence = ++detailSequence
selectedPlan.value = { planId, warehouseId }
confirmedDetail.value = null
detailError.value = null
detailLoading.value = true
try {
if (!warehouseId) throw new Error('该清单缺少所属仓库信息,无法查询详情')
const result = await getConfirmedLoadingList(planId, warehouseId)
if (sequence !== detailSequence) return
if (result.summary.status !== 'COMPLETED') throw new Error('该计划尚未形成正式装柜清单')
confirmedDetail.value = result
} catch (cause) {
if (sequence === detailSequence) detailError.value = getApiErrorDetails(cause, '装柜清单明细加载失败')
} finally {
if (sequence === detailSequence) detailLoading.value = false
}
}
async function printConfirmed(row: LoadingListSummary) {
await loadConfirmedDetail(String(row.planId), String(row.warehouseId || ''))
if (!confirmedDetail.value || confirmedDetail.value.summary.planId !== String(row.planId)) return
await nextTick()
window.print()
function printConfirmed(row: LoadingListSummary) {
void router.push({ name: 'loading-list-detail', params: { planId: String(row.planId) }, query: { warehouseId: String(row.warehouseId || ''), print: '1' } })
}
const isPreload = computed(() => props.mode === 'preload')
@@ -180,7 +141,7 @@ async function openDeepLinkedDetail() {
await router.replace({ name: 'preload-plan-detail', params: { planId }, query: { warehouseId } })
return
}
await loadConfirmedDetail(planId, warehouseId)
await router.replace({ name: 'loading-list-detail', params: { planId }, query: { warehouseId } })
}
function onSimulationCreated() {
@@ -200,7 +161,7 @@ function openDetail(rowValue: object) {
void router.push({ name: 'preload-plan-detail', params: { planId: String(row.planId) }, query: { warehouseId: String(row.warehouseId || '') } })
return
}
void loadConfirmedDetail(String(row.planId), String(row.warehouseId || ''))
void router.push({ name: 'loading-list-detail', params: { planId: String(row.planId) }, query: { warehouseId: String(row.warehouseId || '') } })
}
async function loadCustomers() {
@@ -265,7 +226,7 @@ onMounted(() => {
</template>
<template #actions="{ row }"><div class="row-actions density-actions admin-text-actions" :class="{ 'density-actions': isPreload }">
<el-button v-if="canView" :class="{ 'density-action': isPreload }" size="small" :type="isPreload ? undefined : 'primary'" :plain="!isPreload" @click="openDetail(row)">查看</el-button>
<el-button v-if="canView && !isPreload" class="density-action" size="small" :disabled="detailLoading" @click="printConfirmed(row as LoadingListSummary)">打印</el-button>
<el-button v-if="canView && !isPreload" class="density-action" size="small" @click="printConfirmed(row as LoadingListSummary)">打印</el-button>
</div></template>
<template #customers="{ row }"><LineClampText :content="(row as PreloadSummary).customers.map((item) => item.customerName || '客户信息缺失').join('、')" /></template>
<template #vesselVoyage="{ row }">{{ (row as PreloadSummary).vesselName || '—' }} / {{ (row as PreloadSummary).voyageNo || '—' }}</template>
@@ -276,10 +237,6 @@ onMounted(() => {
<template #createdAt="{ row }">{{ formatDateTime(row.createdAt) }}</template>
</DataTable></section>
</ListPageLayout>
<section v-if="!isPreload && canView && selectedPlan" class="confirmed-inline-detail" aria-label="装柜清单明细">
<h2>装柜清单明细 {{ confirmedDetail?.summary.loadingListNo || '' }}</h2>
<LoadingListDetailDrawer dense embedded mode="confirmed" :loading="detailLoading" :detail="confirmedDetail" :error="detailError" :can-edit="false" @back="closeConfirmedDetail" @retry="loadConfirmedDetail(selectedPlan.planId, selectedPlan.warehouseId)" />
</section>
</div>
</AdminPage>
@@ -287,7 +244,6 @@ onMounted(() => {
<style scoped>
.loading-lists-page { display: grid; min-width: 0; gap: var(--admin-space-6, 16px); }
@media print { .loading-lists-page :deep(.list-page-layout) { display: none; } }
.table-panel { min-width: 0; overflow: hidden; border: 1px solid var(--cc-border); background: var(--admin-surface, #fff); }
.row-actions { display: flex; align-items: center; flex-wrap: wrap; gap: var(--admin-space-2, 6px); }
.row-actions :deep(.el-button) { margin-left: 0; }