')
+ expect(source).toContain('.row-actions { min-width: max-content; flex-wrap: nowrap; white-space: nowrap; }')
expect(source).toContain('.row-actions :deep(.el-button) { flex: 0 0 auto; }')
- expect(source).toContain('.row-actions :deep(.el-button + .el-button) { margin-left: 0; }')
+ expect(readFileSync(resolve(process.cwd(), 'src/styles/adminDensity.css'), 'utf8')).toContain('.density-actions > :is(.el-button, .el-dropdown) { margin-left: 0; }')
})
it('assigns explicit desktop widths to dense query inputs', () => {
@@ -55,12 +55,12 @@ describe('overseas warehouse 1920px layout acceptance', () => {
it('uses four-field desktop density and full-width form controls', () => {
const sharedDetail = component('OverseasReadOnlyDetail.vue')
expect(sharedDetail).toContain('grid-template-columns: repeat(2, minmax(0, 1fr))')
- expect(page('LastMileOrderDetailView.vue')).toContain('.detail-fields { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr))')
- expect(page('InboundOrderDetailView.vue')).toContain('.detail-group:last-child .detail-fields{grid-template-columns:repeat(4,minmax(0,1fr))}')
+ expect(page('LastMileOrderDetailView.vue')).toContain('density-fields')
+ expect(page('InboundOrderDetailView.vue')).toContain('density-fields')
expect(page('DispatchDetailView.vue')).toContain('.document-section { grid-column: 1 / -1; }')
- expect(page('DispatchDetailView.vue')).toContain('.document-section .detail-fields { grid-template-columns: repeat(3, minmax(0, 1fr)); }')
- expect(page('DeliveryOrderDetailView.vue')).toContain('.info-grid { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr))')
- expect(page('InventoryDetailView.vue')).toContain('grid-template-columns:repeat(2,minmax(0,1fr))')
+ expect(page('DispatchDetailView.vue')).toContain('density-fields')
+ expect(page('DeliveryOrderDetailView.vue')).toContain('density-fields')
+ expect(page('InventoryDetailView.vue')).toContain('density-fields')
expect(page('OutboundsView.vue')).toContain('.create-outbound-form :deep(.el-input-number) { width: 100%; }')
expect(page('RelabelOrdersView.vue')).toContain('.el-form :deep(.el-date-editor) { width: 100%; }')
expect(page('PalletsView.vue')).toContain('.el-form :deep(.el-input-number) { width: 100%; }')
diff --git a/src/modules/overseas-warehouse/pages/DeliveryOrderDetailView.vue b/src/modules/overseas-warehouse/pages/DeliveryOrderDetailView.vue
index 9a3672e7..963a8abf 100644
--- a/src/modules/overseas-warehouse/pages/DeliveryOrderDetailView.vue
+++ b/src/modules/overseas-warehouse/pages/DeliveryOrderDetailView.vue
@@ -1,4 +1,5 @@
-
+
@@ -52,7 +53,7 @@ watch([deliveryNo, customerId], () => { void load() }, { immediate: true })
派送单列表详情
-
返回
+
返回
派送单详情
派送单号 {{ deliveryNo }}
@@ -62,11 +63,10 @@ watch([deliveryNo, customerId], () => { void load() }, { immediate: true })
-
-
-
- 订单信息
-
+
+ 📋订单信息
+
+
- 派送单号
- {{ show(detail.order.deliveryNo) }}
- 状态
- {{ statusLabels[detail.order.status] || detail.order.status }}
- 仓库
- {{ show(detail.order.overseasWarehouseName) }}
- 运单号
- {{ show(detail.order.waybillNo) }}
- 派送人
- {{ show(detail.order.carrierName) }}
- 派送时间
- {{ formatOverseasDateTime(detail.order.dispatchedAt || detail.order.plannedDeliveryAt) }}
@@ -80,8 +80,8 @@ watch([deliveryNo, customerId], () => { void load() }, { immediate: true })
-
- SKU明细
+ 📦{{ `SKU明细 (${detail?.skus.length || 0})` }}
+
@@ -92,8 +92,8 @@ watch([deliveryNo, customerId], () => { void load() }, { immediate: true })
-
- 派送单费用明细
+ 💰{{ `费用明细 (${detail?.fees.length || 0})` }}
+
{{ scope.row.feeDirection === 'PAYABLE' ? '应付' : scope.row.feeDirection === 'RECEIVABLE' ? '应收' : show(scope.row.feeDirection) }}
{{ feeLabels[scope.row.feeType] || scope.row.feeType }}
@@ -102,8 +102,8 @@ watch([deliveryNo, customerId], () => { void load() }, { immediate: true })
-
- 操作记录
+ 📝{{ `操作记录 (${detail?.operations.length || 0})` }}
+
{{ formatOverseasDateTime(scope.row.operatedAt) }}
{{ operationLabels[scope.row.operationNode] || scope.row.operationNode }}
@@ -118,8 +118,16 @@ watch([deliveryNo, customerId], () => { void load() }, { immediate: true })
diff --git a/src/modules/overseas-warehouse/pages/DeliveryOrdersView.vue b/src/modules/overseas-warehouse/pages/DeliveryOrdersView.vue
index 0b99014e..c3a82d53 100644
--- a/src/modules/overseas-warehouse/pages/DeliveryOrdersView.vue
+++ b/src/modules/overseas-warehouse/pages/DeliveryOrdersView.vue
@@ -1,6 +1,7 @@
-
详情编辑状态标记退货{{ row.documentSummary ? `${row.documentSummary.uploadedCategoryCount}/3 已上传` : '资料摘要暂无' }}管理资料
{{ category.label }} · {{ row.documentSummary?.categories.find((item: { category: string }) => item.category === category.category)?.status === 'UPLOADED' ? '已上传' : '未上传' }}
共 {{ total }} 条派送单
暂无可退原出库明细
{{ item.palletNo || '—' }} · {{ item.skuCode || '—' }}(最多 {{ item.maxReturnPackages }} 箱)
+
详情编辑状态标记退货
{{ row.documentSummary ? `${row.documentSummary.uploadedCategoryCount}/3 已上传` : '资料摘要暂无' }}管理资料
{{ category.label }} · {{ row.documentSummary?.categories.find((item: { category: string }) => item.category === category.category)?.status === 'UPLOADED' ? '已上传' : '未上传' }}
共 {{ total }} 条派送单
暂无可退原出库明细
{{ item.palletNo || '—' }} · {{ item.skuCode || '—' }}(最多 {{ item.maxReturnPackages }} 箱)
-
+
diff --git a/src/modules/overseas-warehouse/pages/DispatchDetailView.vue b/src/modules/overseas-warehouse/pages/DispatchDetailView.vue
index 6717f170..4d0c0db7 100644
--- a/src/modules/overseas-warehouse/pages/DispatchDetailView.vue
+++ b/src/modules/overseas-warehouse/pages/DispatchDetailView.vue
@@ -1,4 +1,5 @@
-
+
-
车辆信息
- {{ field.label }}
- {{ field.value }}
-
排车信息
- {{ field.label }}
- {{ field.value }}
-
单据信息
- {{ field.label }}
- {{ field.value }}
+
车辆信息
- {{ field.label }}
- {{ field.value }}
+
排车信息
- {{ field.label }}
- {{ field.value }}
+
单据信息
- {{ field.label }}
- {{ field.value }}
@@ -144,21 +145,10 @@ onMounted(load)
diff --git a/src/modules/overseas-warehouse/pages/DispatchesView.vue b/src/modules/overseas-warehouse/pages/DispatchesView.vue
index ea253ca6..c5f562ec 100644
--- a/src/modules/overseas-warehouse/pages/DispatchesView.vue
+++ b/src/modules/overseas-warehouse/pages/DispatchesView.vue
@@ -1,6 +1,7 @@
-
+
- 查看打印BOL转派送更多编辑取消
+ 查看打印BOL转派送编辑取消
共 {{ total }} 条排车记录
- 派送信息
入库未逐箱绑定时,在出库前确认箱唛属于哪个实际托盘。
费用信息(USD)
-
已排车托盘
移除
+ 派送信息
入库未逐箱绑定时,在出库前确认箱唛属于哪个实际托盘。
费用信息(USD)
+
已排车托盘
移除
diff --git a/src/modules/overseas-warehouse/pages/InboundOrdersView.vue b/src/modules/overseas-warehouse/pages/InboundOrdersView.vue
index 4c970e29..517c6da4 100644
--- a/src/modules/overseas-warehouse/pages/InboundOrdersView.vue
+++ b/src/modules/overseas-warehouse/pages/InboundOrdersView.vue
@@ -1,6 +1,7 @@
-
+
预约智能排车
-
+ 查看编辑预约
共 {{ total }} 条入库单 · 已选 {{ selectedRows.length }} 条
-
+
已选择 {{ appointmentSelectedCount }} 条,FBA仓库:{{ appointmentFbaWarehouse }}
-
+
@@ -209,16 +210,15 @@ onMounted(() => { void load() })
- { const w = warehouses.find((item) => item.id === id); planEditForm.warehouseCode = w?.warehouseCode || ''; planEditForm.warehouseName = w?.warehouseName || '' }">
+ { const w = warehouses.find((item) => item.id === id); planEditForm.warehouseCode = w?.warehouseCode || ''; planEditForm.warehouseName = w?.warehouseName || '' }">
diff --git a/src/modules/overseas-warehouse/pages/InventoryDetailView.vue b/src/modules/overseas-warehouse/pages/InventoryDetailView.vue
index 89d55869..a7441dbb 100644
--- a/src/modules/overseas-warehouse/pages/InventoryDetailView.vue
+++ b/src/modules/overseas-warehouse/pages/InventoryDetailView.vue
@@ -1,4 +1,5 @@
-
- 商品信息
- {{ label }}
- {{ productValues[label as keyof typeof productValues] }}
库存状态汇总
- {{ label }}
- {{ stockValues[label as keyof typeof stockValues] }}
+
+ 商品信息
- {{ label }}
- {{ productValues[label as keyof typeof productValues] }}
库存状态汇总
- {{ label }}
- {{ stockValues[label as keyof typeof stockValues] }}
进销存单据明细
按该库存记录的入库单范围展示,出库字段仅为只读事实。
-
+
diff --git a/src/modules/overseas-warehouse/pages/InventoryTransactionsView.vue b/src/modules/overseas-warehouse/pages/InventoryTransactionsView.vue
index 5ce2eeb0..cb131063 100644
--- a/src/modules/overseas-warehouse/pages/InventoryTransactionsView.vue
+++ b/src/modules/overseas-warehouse/pages/InventoryTransactionsView.vue
@@ -1,4 +1,5 @@
-
+
本页面仅用于查询库存流水,不提供出库单跳转或库存变更操作。
- 导出记录返回库存管理关联数据共 {{ total }} 条进销存记录
-
+ 导出记录返回库存管理关联数据
共 {{ total }} 条进销存记录
+
-
+
diff --git a/src/modules/overseas-warehouse/pages/InventoryView.vue b/src/modules/overseas-warehouse/pages/InventoryView.vue
index 7baabbde..9788ffb2 100644
--- a/src/modules/overseas-warehouse/pages/InventoryView.vue
+++ b/src/modules/overseas-warehouse/pages/InventoryView.vue
@@ -1,6 +1,7 @@
-
+
{{ metric[0] }}{{ metric[1] }}
导出库存进销存记录
- 查看
+ 查看
共 {{ total }} 条库存记录
diff --git a/src/modules/overseas-warehouse/pages/LastMileOrderDetailView.vue b/src/modules/overseas-warehouse/pages/LastMileOrderDetailView.vue
index a533aaa4..fb668a88 100644
--- a/src/modules/overseas-warehouse/pages/LastMileOrderDetailView.vue
+++ b/src/modules/overseas-warehouse/pages/LastMileOrderDetailView.vue
@@ -1,4 +1,5 @@
-
+
-
-
+
+ 📋基本信息
-
订单信息
- {{ field.label }}
- {{ field.value }}
-
货柜信息
- {{ field.label }}
- {{ field.value }}
+
订单信息
- {{ field.label }}
- {{ field.value }}
+
货柜信息
- {{ field.label }}
- {{ field.value }}
-
-
- 计划信息
- {{ field.label }}
- {{ field.value }}
+ 📦货物信息
+ 🗓️计划信息
+ - {{ field.label }}
- {{ field.value }}
-
-
+ 💰费用明细
+ 📝操作记录
-
-
-
+
@@ -936,11 +937,11 @@ onMounted(() => { void load() })
-
+
-
+
@@ -955,19 +956,19 @@ onMounted(() => { void load() })
-
+
-
+
接柜仓按柜统一;如需变更,请在柜子工作台执行“变更接柜仓”。一件代发固定按头程已封托托盘数整体入库,不可增减。按柜级预览至少 {{ inboundPlanMinimumPalletCount }} 托,可增加,不能减少。仅作为现场可选提示,不强制工人合托。
-
+
- 暂扣解除暂扣是否
+ 暂扣解除暂扣是否
-
+
尾程单号{{ actionTarget?.orderNo || '—' }}
@@ -975,72 +976,73 @@ onMounted(() => { void load() })
diff --git a/src/modules/overseas-warehouse/pages/OutboundDetailView.test.ts b/src/modules/overseas-warehouse/pages/OutboundDetailView.test.ts
index 60342e81..7ecda07b 100644
--- a/src/modules/overseas-warehouse/pages/OutboundDetailView.test.ts
+++ b/src/modules/overseas-warehouse/pages/OutboundDetailView.test.ts
@@ -66,4 +66,23 @@ describe('OutboundDetailView', () => {
expect(wrapper.text()).toContain('取消出库单')
wrapper.unmount()
})
+
+ it.each([
+ ['warehouse-internal-id', '洛杉矶仓', '洛杉矶仓'],
+ ['warehouse-internal-id', null, '—'],
+ ['another-warehouse-id', '其他仓库', '—'],
+ ])('uses a matching warehouse name and never displays internal IDs (%s, %s)', async (deliveryWarehouseId, name, expected) => {
+ vi.mocked(getOutbound).mockResolvedValueOnce({
+ outbound: { id: '1', outboundNo: 'OUT/1', overseasWarehouseId: 'warehouse-internal-id' },
+ delivery: { id: '2', customerId: 'customer-1', deliveryNo: 'DEL-1', outboundNo: 'OUT/1', dispatchNo: 'PC-1', status: 'WAIT_DELIVERY', palletCount: 2, packageCount: 20, createdAt: '2026-09-01T10:00:00', version: 1, allowedActions: [], overseasWarehouseId: deliveryWarehouseId, overseasWarehouseName: name },
+ })
+ const wrapper = mount(OutboundDetailView, { global: { plugins: [ElementPlus] } })
+ await flushPromises()
+ const labels = wrapper.findAll('.el-descriptions__label')
+ const label = labels.find(item => item.text() === '海外仓')!
+ expect(label.element.nextElementSibling?.textContent?.trim()).toBe(expected)
+ expect(wrapper.text()).not.toContain('warehouse-internal-id')
+ expect(wrapper.text()).not.toContain('another-warehouse-id')
+ wrapper.unmount()
+ })
})
diff --git a/src/modules/overseas-warehouse/pages/OutboundDetailView.vue b/src/modules/overseas-warehouse/pages/OutboundDetailView.vue
index 567da71b..4bb7340c 100644
--- a/src/modules/overseas-warehouse/pages/OutboundDetailView.vue
+++ b/src/modules/overseas-warehouse/pages/OutboundDetailView.vue
@@ -1,4 +1,5 @@
-
- 返回出库单详情
出库单号 {{ outboundNo }}
取消出库单
+
+ 返回出库单详情
出库单号 {{ outboundNo }}
取消出库单
- 出库信息
{{ show(detail.outbound.outboundNo) }}{{ outboundTypeLabel(detail.outbound.outboundType) }}{{ show(detail.outbound.dispatchNo) }}{{ statusLabel(detail.outbound.status) }}{{ show(detail.outbound.overseasWarehouseId) }}{{ detail.outbound.palletCount ?? '—' }}{{ detail.outbound.packageCount ?? '—' }}{{ formatOverseasDateTime(detail.outbound.createdAt) }}关联派送
{{ show(detail.delivery.deliveryNo) }}{{ show(detail.delivery.status) }}{{ show(detail.delivery.waybillNo) }}{{ show(detail.delivery.carrierName) }}{{ show(detail.delivery.driverName) }}{{ show(detail.delivery.vehiclePlate) }}{{ formatOverseasDateTime(detail.delivery.plannedDeliveryAt) }}{{ show(detail.delivery.remark) }}
+ 出库信息
{{ show(detail.outbound.outboundNo) }}{{ outboundTypeLabel(detail.outbound.outboundType) }}{{ show(detail.outbound.dispatchNo) }}{{ statusLabel(detail.outbound.status) }}{{ warehouseLabel }}{{ detail.outbound.palletCount ?? '—' }}{{ detail.outbound.packageCount ?? '—' }}{{ formatOverseasDateTime(detail.outbound.createdAt) }}关联派送
{{ show(detail.delivery.deliveryNo) }}{{ show(detail.delivery.status) }}{{ show(detail.delivery.waybillNo) }}{{ show(detail.delivery.carrierName) }}{{ show(detail.delivery.driverName) }}{{ show(detail.delivery.vehiclePlate) }}{{ formatOverseasDateTime(detail.delivery.plannedDeliveryAt) }}{{ show(detail.delivery.remark) }}
-
+
diff --git a/src/modules/overseas-warehouse/pages/OutboundsView.vue b/src/modules/overseas-warehouse/pages/OutboundsView.vue
index 5b0478f8..347bf304 100644
--- a/src/modules/overseas-warehouse/pages/OutboundsView.vue
+++ b/src/modules/overseas-warehouse/pages/OutboundsView.vue
@@ -1,6 +1,7 @@
-
+
新建出库单
- 详情取消
+ 详情取消
{{ outboundTypeLabel(row.outboundType) }}
-
-
+
+
一件代发出库
@@ -193,25 +194,25 @@ onMounted(load)
diff --git a/src/modules/overseas-warehouse/pages/PalletDetailView.test.ts b/src/modules/overseas-warehouse/pages/PalletDetailView.test.ts
new file mode 100644
index 00000000..e634c745
--- /dev/null
+++ b/src/modules/overseas-warehouse/pages/PalletDetailView.test.ts
@@ -0,0 +1,45 @@
+import ElementPlus from 'element-plus'
+import { enableAutoUnmount, flushPromises, mount } from '@vue/test-utils'
+import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest'
+import { getPallet, listReceivingOverseasWarehouses } from '../api/pallets'
+import PalletDetailView from './PalletDetailView.vue'
+
+vi.mock('vue-router', () => ({
+ useRoute: () => ({ params: { palletId: 'internal-pallet-id' }, query: { warehouseId: 'internal-warehouse-id' } }),
+ useRouter: () => ({ push: vi.fn() }),
+}))
+vi.mock('../api/pallets', () => ({ getPallet: vi.fn(), listReceivingOverseasWarehouses: vi.fn() }))
+enableAutoUnmount(afterEach)
+
+describe('PalletDetailView business identifiers', () => {
+ beforeEach(() => {
+ vi.mocked(getPallet).mockReset()
+ vi.mocked(listReceivingOverseasWarehouses).mockResolvedValue({ records: [], page: 1, size: 200, total: 0, pages: 0 })
+ })
+
+ it('does not expose the route ID while loading or after a failed load', async () => {
+ let rejectLoad!: (cause: Error) => void
+ vi.mocked(getPallet).mockReturnValue(new Promise((_, reject) => { rejectLoad = reject }))
+ const wrapper = mount(PalletDetailView, { global: { plugins: [ElementPlus] } })
+ expect(wrapper.get('.overseas-detail-title').text()).toContain('—')
+ expect(wrapper.text()).not.toContain('internal-pallet-id')
+ rejectLoad(new Error('暂时无法加载'))
+ await flushPromises()
+ expect(wrapper.text()).toContain('托盘详情加载失败')
+ expect(wrapper.text()).not.toContain('internal-pallet-id')
+ })
+
+ it('renders the pallet code inside the dense detail and keeps unavailable location codes empty', async () => {
+ vi.mocked(getPallet).mockResolvedValue({
+ id: 'internal-pallet-id', warehouseId: 'internal-warehouse-id', customerId: 'customer-1',
+ locationId: 'internal-location-id', palletCode: 'PALLET-LAX-001', palletType: 'WOOD',
+ fbaWarehouseCode: 'ONT8', capacityCbm: 2, unitPrice: 10, status: 'IDLE', version: 1,
+ })
+ const wrapper = mount(PalletDetailView, { global: { plugins: [ElementPlus] } })
+ await flushPromises()
+ expect(wrapper.get('.admin-density .overseas-detail-title').text()).toContain('PALLET-LAX-001')
+ const location = wrapper.findAll('.density-fields dt').find(item => item.text() === '库位')!
+ expect(location.element.nextElementSibling?.textContent).toBe('—')
+ expect(wrapper.text()).not.toMatch(/internal-(pallet|warehouse|location)-id/)
+ })
+})
diff --git a/src/modules/overseas-warehouse/pages/PalletDetailView.vue b/src/modules/overseas-warehouse/pages/PalletDetailView.vue
index 3b2d44de..2ebfd009 100644
--- a/src/modules/overseas-warehouse/pages/PalletDetailView.vue
+++ b/src/modules/overseas-warehouse/pages/PalletDetailView.vue
@@ -1,4 +1,5 @@
-
+
diff --git a/src/modules/overseas-warehouse/pages/PalletsView.vue b/src/modules/overseas-warehouse/pages/PalletsView.vue
index 1a51ba69..048058dc 100644
--- a/src/modules/overseas-warehouse/pages/PalletsView.vue
+++ b/src/modules/overseas-warehouse/pages/PalletsView.vue
@@ -1,6 +1,7 @@
-
+
托盘总数{{ summary.totalCount }}闲置托盘{{ summary.idleCount }}占用托盘{{ summary.occupiedCount }}已报废{{ summary.scrappedCount }}
新增托盘
- 查看编辑
+ 查看编辑
共 {{ total }} 条托盘
-
-
+
+
@@ -153,7 +154,13 @@ onMounted(initialize)
diff --git a/src/modules/overseas-warehouse/pages/RelabelOrderDetailView.vue b/src/modules/overseas-warehouse/pages/RelabelOrderDetailView.vue
index 81d1d012..c1daf359 100644
--- a/src/modules/overseas-warehouse/pages/RelabelOrderDetailView.vue
+++ b/src/modules/overseas-warehouse/pages/RelabelOrderDetailView.vue
@@ -1,6 +1,7 @@
-
+
- PDA 换标完工证据
{{ detail?.completionEvidence?.reviewerName ? `复核人:${detail.completionEvidence.reviewerName}` : '等待仓库作业' }}共 {{ detail.completionEvidence.photoFileIds.length }} 张完工照片照片 {{ index + 1 }}
暂未上传完工照片
- 总换标 PDF
{{ detail.application.totalFileName }}直接预览
暂未上传总换标PDF
+ PDA 换标完工证据
{{ detail?.completionEvidence?.reviewerName ? `复核人:${detail.completionEvidence.reviewerName}` : '等待仓库作业' }}共 {{ detail.completionEvidence.photoFileIds.length }} 张完工照片照片 {{ index + 1 }}
暂未上传完工照片
+ 总换标 PDF
{{ detail.application.totalFileName }}直接预览
暂未上传总换标PDF
箱唛换标信息
共 {{ detail?.items.length || 0 }} 条