From 4bf66d957173768b834dac2f63355670d7a03ed9 Mon Sep 17 00:00:00 2001 From: ouyangxq <775153912@qq.com> Date: Tue, 15 Sep 2026 09:58:15 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/app/components/WorkspaceTabs.vue | 3 +- src/app/layouts/AppLayout.vue | 4 +- src/app/router/index.ts | 3 +- src/main.ts | 3 +- .../dashboard/pages/DashboardView.test.ts | 54 +++- src/modules/dashboard/pages/DashboardView.vue | 88 +++---- .../pages/DownloadCenterView.test.ts | 3 +- .../downloads/pages/DownloadCenterView.vue | 56 ++--- .../pages/CarrierRateDetailView.vue | 100 ++++---- .../pages/CarrierRatesView.test.ts | 16 +- .../carrier-rates/pages/CarrierRatesView.vue | 48 ++-- .../fee-items/pages/FeeItemsView.test.ts | 17 +- src/modules/fee-items/pages/FeeItemsView.vue | 43 ++-- src/modules/finance/financeDensity.css | 17 ++ .../pages/FinanceCustomerAccountsView.test.ts | 53 ++-- .../pages/FinanceCustomerAccountsView.vue | 231 +++--------------- .../pages/FinanceCustomerArapView.test.ts | 43 +++- .../finance/pages/FinanceCustomerArapView.vue | 207 ++++------------ .../FinanceCustomerStatementsView.test.ts | 29 ++- .../pages/FinanceCustomerStatementsView.vue | 185 +++++--------- .../FinanceFormalSettlementExport.test.ts | 2 +- .../FinanceFormalSettlementLayout.test.ts | 27 +- .../pages/FinanceFormalSettlementPage.vue | 178 +++++--------- .../finance/pages/FinancePresentation.test.ts | 57 ++--- .../pages/FinanceReceivableStatisticsView.vue | 39 ++- .../pages/FinanceSettlementPayablesView.vue | 15 -- .../FinanceSettlementReceivablesView.vue | 15 -- .../FinanceSettlementRouteLayout.test.ts | 14 +- src/modules/iam/iamDensity.css | 8 + .../iam/pages/InternalUsersView.test.ts | 10 +- src/modules/iam/pages/InternalUsersView.vue | 30 +-- .../pages/PermissionsDialog.behavior.test.ts | 69 ++++++ src/modules/iam/pages/PermissionsView.test.ts | 22 +- src/modules/iam/pages/PermissionsView.vue | 40 +-- src/modules/iam/pages/RolesView.test.ts | 12 +- src/modules/iam/pages/RolesView.vue | 27 +- .../measurement/InboundMeasurementDialog.vue | 2 +- .../measurement/InboundMeasurementPanel.vue | 4 +- .../weight/components/WeightOcrPanel.vue | 2 +- .../counterparties/pages/PartnersView.test.ts | 19 +- .../counterparties/pages/PartnersView.vue | 53 ++-- .../pages/ExpressCompaniesView.test.ts | 14 +- .../pages/ExpressCompaniesView.vue | 55 ++--- src/modules/notifications/PROTOTYPE_MATRIX.md | 10 +- .../components/MessageComposerDialog.vue | 7 +- .../components/TemplateEditorDialog.vue | 7 +- .../notificationsDensity.behavior.test.ts | 135 ++++++++++ .../pages/MessageManagementView.vue | 15 +- .../pages/MessageTemplatesView.vue | 8 +- .../pages/PlatformNotificationsView.vue | 19 +- .../overseasBusinessDensity.css | 11 + .../pages/OverseasBusinessViews.test.ts | 41 +++- .../pages/PurchaseOrderDetailView.vue | 37 ++- .../pages/PurchaseOrderEditView.vue | 28 ++- .../pages/PurchaseOrdersView.vue | 8 +- .../pages/TransportOrderFormView.vue | 24 +- .../pages/TransportOrdersView.vue | 7 +- .../pages/ExchangeRatesView.vue | 17 +- .../pages/OverseasMasterDataMount.test.ts | 13 +- .../pages/OverseasMasterDataViews.test.ts | 4 +- .../OverseasMasterDataWriteBehavior.test.ts | 14 ++ .../pages/OverseasQuotesView.vue | 15 +- .../pages/VehicleDetailView.vue | 7 +- .../pages/VehiclesView.vue | 12 +- .../overseas-master-data/presentation.ts | 9 + .../pages/CustomerVisitsView.test.ts | 4 + .../pages/CustomerVisitsView.vue | 58 ++--- .../pages/ExceptionOrdersView.vue | 18 +- .../components/SupplierLicenseDialog.vue | 13 +- .../suppliers/pages/SupplierDetailView.vue | 14 +- .../suppliers/pages/SupplierFormView.vue | 24 +- .../pages/SupplierRouteReuse.behavior.test.ts | 14 ++ .../suppliers/pages/SuppliersView.test.ts | 8 +- src/modules/suppliers/pages/SuppliersView.vue | 29 +-- src/modules/suppliers/routes.ts | 6 +- .../InboundFeeDetailManager.test.ts | 41 +++- .../components/InboundFeeDetailManager.vue | 57 +++-- .../OrderDeclarationEditorDialog.test.ts | 37 ++- .../OrderDeclarationEditorDialog.vue | 21 +- .../pages/UnifiedOrdersView.vue | 2 +- .../locations/pages/LocationsView.vue | 2 +- .../pallets/pages/PalletsView.vue | 2 +- .../warehouses/pages/WarehousesView.test.ts | 10 +- .../warehouses/pages/WarehousesView.vue | 67 +++-- .../components/BatchImportDialog.test.ts | 4 +- src/shared/components/BatchImportDialog.vue | 26 +- .../exportTaskCreatedDialog.test.ts | 6 + .../components/exportTaskCreatedDialog.ts | 2 + src/styles/adminDensity.css | 29 ++- src/styles/adminDensity.test.ts | 128 +++++++++- 90 files changed, 1599 insertions(+), 1388 deletions(-) create mode 100644 src/modules/finance/financeDensity.css create mode 100644 src/modules/iam/iamDensity.css create mode 100644 src/modules/iam/pages/PermissionsDialog.behavior.test.ts create mode 100644 src/modules/notifications/notificationsDensity.behavior.test.ts create mode 100644 src/modules/overseas-business/overseasBusinessDensity.css create mode 100644 src/modules/overseas-master-data/presentation.ts diff --git a/src/app/components/WorkspaceTabs.vue b/src/app/components/WorkspaceTabs.vue index 8007dda5..1dc761e1 100644 --- a/src/app/components/WorkspaceTabs.vue +++ b/src/app/components/WorkspaceTabs.vue @@ -1,4 +1,5 @@ - - + {{ metricsError ? '部分核心指标加载失败,可刷新重试。' : '核心指标来自实时业务数据。' }} 数据更新时间:{{ metricsUpdatedAt ? dayjs(metricsUpdatedAt).format('YYYY-MM-DD HH:mm') : '加载中' }} - + 刷新数据 - - + + {{ isFullscreen ? '退出全屏' : '全屏展示' }} - + - - - - {{ metric.label }} - {{ metric.value }} {{ metric.unit }} - {{ metric.note }} - - + + + {{ metric.label }} + + {{ metric.value }} {{ metric.unit }} + {{ metric.note }} + + + diff --git a/src/modules/downloads/pages/DownloadCenterView.test.ts b/src/modules/downloads/pages/DownloadCenterView.test.ts index fc5ec843..00901441 100644 --- a/src/modules/downloads/pages/DownloadCenterView.test.ts +++ b/src/modules/downloads/pages/DownloadCenterView.test.ts @@ -161,7 +161,8 @@ describe('DownloadCenterView', () => { expect(document.body.textContent).toContain('任务详情 · EXP9') expect(document.body.textContent).toContain('客户列表.xlsx') expect(document.querySelector('.el-drawer')).toBeNull() - expect(document.querySelector('.el-dialog')).not.toBeNull() + expect(document.querySelector('.el-dialog.admin-density-dialog')).not.toBeNull() + expect(document.querySelectorAll('.task-detail-grid.density-fields > div')).toHaveLength(11) const detailDownload = [...document.querySelectorAll('button')] .find((item) => item.textContent?.trim() === '下载文件') detailDownload?.click() diff --git a/src/modules/downloads/pages/DownloadCenterView.vue b/src/modules/downloads/pages/DownloadCenterView.vue index 2ba8b3b1..3f887a34 100644 --- a/src/modules/downloads/pages/DownloadCenterView.vue +++ b/src/modules/downloads/pages/DownloadCenterView.vue @@ -1,6 +1,6 @@ - + @@ -284,10 +284,10 @@ onBeforeUnmount(() => { 共 {{ tableTotal }} 个任务 - - 详情 - 下载 - {{ retryLabel(row as PlatformExportTask) }} + + 详情 + 下载 + {{ retryLabel(row as PlatformExportTask) }} {{ typeLabel((row as PlatformExportTask).exportType) }} {{ taskStatusMeta(row as PlatformExportTask).label }} @@ -300,7 +300,7 @@ onBeforeUnmount(() => { - { {{ taskStatusMeta(detailTask).label }} - + 任务编号{{ detailTask.taskNo }} 申请人{{ detailTask.requestedUsername || detailTask.requestedBy }} 申请时间{{ formatDate(detailTask.requestedAt) }} @@ -363,34 +363,28 @@ onBeforeUnmount(() => { diff --git a/src/modules/finance/pages/FinanceSettlementReceivablesView.vue b/src/modules/finance/pages/FinanceSettlementReceivablesView.vue index 4c56d224..aecfb8fa 100644 --- a/src/modules/finance/pages/FinanceSettlementReceivablesView.vue +++ b/src/modules/finance/pages/FinanceSettlementReceivablesView.vue @@ -10,18 +10,3 @@ function openDetail(id: string) { void router.push({ name: 'finance-settlement-r function back() { void router.push({ name: 'finance-settlement-receivables' }) } - - diff --git a/src/modules/finance/pages/FinanceSettlementRouteLayout.test.ts b/src/modules/finance/pages/FinanceSettlementRouteLayout.test.ts index 8376b6b1..aef1d8b6 100644 --- a/src/modules/finance/pages/FinanceSettlementRouteLayout.test.ts +++ b/src/modules/finance/pages/FinanceSettlementRouteLayout.test.ts @@ -9,11 +9,15 @@ describe('Finance settlement route 1920px layout', () => { it.each([ ['应收', receivableSource, 'finance-settlement-route--receivable'], ['应付', payableSource, 'finance-settlement-route--payable'], - ])('uses the full detail workspace and a readable two-field information grid for %s', (_label, source, routeClass) => { + ])('delegates the detail grid to the shared settlement page for %s', (_label, source, routeClass) => { expect(source).toContain(routeClass) - expect(source).toContain('@media (min-width: 1920px)') - expect(source).toContain('.finance-settlement-route :deep(.settlement-detail-page) { width: 100%; max-width: none; }') - expect(source).toContain('grid-template-columns: minmax(110px, .35fr) minmax(0, 1fr) minmax(110px, .35fr) minmax(0, 1fr)') - expect(source).toContain('> tbody > tr) { display: contents; }') + expect(source).toContain(' vi.unstubAllGlobals()) describe('InternalUsersView platform internal user management', () => { - it('renders row business actions as colored outlined buttons with prototype icons', () => { - expect(internalUsersSource).toContain('size="small" plain type="primary" @click="openEdit') - expect(internalUsersSource).toContain('size="small" plain :type="(row as PlatformManagedUser).status') - expect(internalUsersSource).toContain('编辑') - expect(internalUsersSource).toContain('') + it('renders row business actions as shared outlined text buttons', () => { + expect(internalUsersSource).toContain('size="small" data-tone="neutral" @click="openEdit') + expect(internalUsersSource).toContain('size="small" :data-tone="(row as PlatformManagedUser).status') + expect(internalUsersSource).toMatch(/>\s*编辑\s*<\/el-button>/) + expect(internalUsersSource).toContain(':data-tone=') expect(internalUsersSource).not.toContain('v-if="canChangeStatus" link') }) diff --git a/src/modules/iam/pages/InternalUsersView.vue b/src/modules/iam/pages/InternalUsersView.vue index 72c42fbf..dbb66ecd 100644 --- a/src/modules/iam/pages/InternalUsersView.vue +++ b/src/modules/iam/pages/InternalUsersView.vue @@ -1,7 +1,9 @@ - + 新增用户 - - - 编辑 + + + 编辑 - - {{ (row as PlatformManagedUser).status === 'ACTIVE' ? '禁用' : '启用' }} + {{ (row as PlatformManagedUser).status === 'ACTIVE' ? '禁用' : '启用' }} @@ -391,9 +393,9 @@ onMounted(loadInitialData) - - - + + + @@ -439,7 +441,7 @@ onMounted(loadInitialData) - + 同时重置密码 @@ -456,8 +458,8 @@ onMounted(loadInitialData) diff --git a/src/modules/inbounds/measurement/InboundMeasurementDialog.vue b/src/modules/inbounds/measurement/InboundMeasurementDialog.vue index 03c96865..36f92ba6 100644 --- a/src/modules/inbounds/measurement/InboundMeasurementDialog.vue +++ b/src/modules/inbounds/measurement/InboundMeasurementDialog.vue @@ -28,7 +28,7 @@ const title = computed(() => `测量 · ${props.inboundCode?.trim() || '入仓 async function mayClose() { if (!measurementPanelRef.value?.isDirty) return true try { - await ElMessageBox.confirm('当前测量数据尚未保存,关闭后将丢失修改。确定关闭吗?', '关闭测量', { + await ElMessageBox.confirm('当前测量数据尚未保存,关闭后将丢失修改。确定关闭吗?', '关闭测量', { customClass: 'admin-density-confirm', type: 'warning', confirmButtonText: '放弃修改并关闭', cancelButtonText: '继续编辑', diff --git a/src/modules/inbounds/measurement/InboundMeasurementPanel.vue b/src/modules/inbounds/measurement/InboundMeasurementPanel.vue index 05a99f21..06e3a55f 100644 --- a/src/modules/inbounds/measurement/InboundMeasurementPanel.vue +++ b/src/modules/inbounds/measurement/InboundMeasurementPanel.vue @@ -371,7 +371,7 @@ async function loadMeasurement() { async function reloadLatest() { if (isDirty.value) { try { - await ElMessageBox.confirm('加载最新版本会丢弃当前尚未保存的修改。确定继续吗?', '重新加载测量数据', { + await ElMessageBox.confirm('加载最新版本会丢弃当前尚未保存的修改。确定继续吗?', '重新加载测量数据', { customClass: 'admin-density-confirm', type: 'warning', confirmButtonText: '加载最新版本', cancelButtonText: '继续编辑', @@ -520,7 +520,7 @@ async function submitForReview() { await ElMessageBox.confirm( '提交后将校验测量图片和全部称重结果,并由后端准备托盘与库位占用。提交成功后本批次不能继续编辑,设备也不能再覆盖已提交数据。', '提交测量审核', - { type: 'warning', confirmButtonText: '确认提交', cancelButtonText: '取消' }, + { customClass: 'admin-density-confirm', type: 'warning', confirmButtonText: '确认提交', cancelButtonText: '取消' }, ) } catch { return diff --git a/src/modules/inbounds/weight/components/WeightOcrPanel.vue b/src/modules/inbounds/weight/components/WeightOcrPanel.vue index fa01d8a8..e64efb09 100644 --- a/src/modules/inbounds/weight/components/WeightOcrPanel.vue +++ b/src/modules/inbounds/weight/components/WeightOcrPanel.vue @@ -425,7 +425,7 @@ async function removeResult(row: WeightResultResource) { ? '删除后将重新计算货物总重量;对应库位仍为本票保留,不会释放给其他订单。确认删除这张称重图片吗?' : '对应库位仍为本票保留,不会释放给其他订单。确认删除这张称重图片吗?', '删除称重图片', - { type: 'warning', confirmButtonText: '删除', cancelButtonText: '取消' }, + { customClass: 'admin-density-confirm', type: 'warning', confirmButtonText: '删除', cancelButtonText: '取消' }, ) } catch { return diff --git a/src/modules/master-data/counterparties/pages/PartnersView.test.ts b/src/modules/master-data/counterparties/pages/PartnersView.test.ts index f0b39b09..aaac30ce 100644 --- a/src/modules/master-data/counterparties/pages/PartnersView.test.ts +++ b/src/modules/master-data/counterparties/pages/PartnersView.test.ts @@ -195,6 +195,8 @@ describe('PartnersView real API integration', () => { const sections = detailContent?.querySelectorAll('section') const otherInfo = sections?.item(sections.length - 1) expect(detailContent).not.toBeNull() + expect(detailContent?.closest('.el-drawer')?.classList.contains('admin-density-drawer')).toBe(true) + expect(detailContent?.querySelectorAll('.density-fields')).toHaveLength(3) expect(otherInfo?.querySelectorAll('.detail-grid > .detail-span')).toHaveLength(2) expect(otherInfo?.textContent).toContain('更新时间') expect(otherInfo?.textContent).toContain('长期合作单位') @@ -278,13 +280,10 @@ describe('PartnersView real API integration', () => { }) it('keeps all three row actions visible without a premature more menu', () => { - expect(source).toContain('详情') - expect(source).toContain('编辑') - expect(source).toContain('') - expect(source).not.toContain('MoreHorizontal') - expect(source).not.toContain('', source.indexOf('详情') + expect(actions).toContain('>编辑') + expect(actions).toContain(':data-tone=') + expect(actions).not.toMatch(/<(?:el-dropdown|Pencil|Power|Eye|Trash2|Download|CircleX)\b/) + })}) diff --git a/src/modules/master-data/counterparties/pages/PartnersView.vue b/src/modules/master-data/counterparties/pages/PartnersView.vue index bf1662a7..274c6676 100644 --- a/src/modules/master-data/counterparties/pages/PartnersView.vue +++ b/src/modules/master-data/counterparties/pages/PartnersView.vue @@ -1,7 +1,8 @@ - + @@ -403,10 +404,10 @@ onMounted(() => { > 批量导入新增往来单位 - - 详情 - 编辑 - {{ (row as PlatformPartnerResource).status === 'ACTIVE' ? '停用' : '启用' }} + + 详情 + 编辑 + {{ (row as PlatformPartnerResource).status === 'ACTIVE' ? '停用' : '启用' }} @@ -422,30 +423,30 @@ onMounted(() => { v-model="editorOpen" :title="editorLabel" size="min(680px, 94vw)" - class="business-drawer editor-drawer" + class="editor-drawer admin-density admin-density-drawer" :confirm-loading="saving" > - - + + 启用停用 - + - + - +
{{ metricsError ? '部分核心指标加载失败,可刷新重试。' : '核心指标来自实时业务数据。' }}
{{ metric.label }}