From b0de9c026f6278d6e89fbe9ebec1998d1c473a0e Mon Sep 17 00:00:00 2001 From: ouyangxq <775153912@qq.com> Date: Mon, 14 Sep 2026 15:33:35 +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 --- AGENTS.md | 1 + .../components/ContainerSimulationCreate.vue | 4 +- .../pages/CustomerDetailView.test.ts | 2 +- .../customers/pages/CustomerDetailView.vue | 1 + .../customers/pages/CustomersView.test.ts | 4 +- src/modules/customers/pages/CustomersView.vue | 20 ++++-- .../DomesticContainerInventoryDetailView.vue | 23 +++--- .../pages/DomesticContainersView.test.ts | 8 ++- .../pages/DomesticContainersView.vue | 17 ++--- .../pages/domesticContainersSummary.css | 70 ++----------------- src/modules/iam/api/platformIam.test.ts | 2 +- src/modules/iam/api/platformIam.ts | 4 +- .../inbounds/components/InboundTaskList.vue | 12 ++-- .../InboundMeasurementDialog.test.ts | 4 +- .../measurement/InboundMeasurementDialog.vue | 10 +-- .../measurement/InboundMeasurementPanel.vue | 5 +- .../measurement/measurementDensity.css | 30 ++++++++ .../review/MeasurementReviewPanel.test.ts | 4 +- .../review/MeasurementReviewPanel.vue | 23 +++--- .../weight/components/WeightOcrPanel.vue | 7 +- .../components/LoadingListDetailDrawer.vue | 42 +++++++---- .../components/LoadingListsView.test.ts | 6 +- .../components/LoadingListsView.vue | 5 +- .../components/PalletLabelPrintDialog.vue | 5 +- .../pages/PreloadPlanDetailView.vue | 13 ++-- .../pages/UnifiedOrdersView.vue | 18 ++--- .../unified-orders/styles/orderDensity.css | 60 +--------------- .../locations/pages/LocationsView.vue | 21 +++--- .../pallets/pages/PalletsView.vue | 27 +++---- src/styles/adminDensity.css | 62 ++++++++++++++++ 30 files changed, 270 insertions(+), 240 deletions(-) create mode 100644 src/modules/inbounds/measurement/measurementDensity.css create mode 100644 src/styles/adminDensity.css diff --git a/AGENTS.md b/AGENTS.md index f3f769a7..4d69de1e 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -4,6 +4,7 @@ 1. 用“模块快速路由”选择最小业务模块,进入后读取该目录最近的 `AGENTS.md`;按 `routes.ts → pages/ → api/types/stores/composables` 下钻,不先扫描全部 `src/`。 2. 页面、布局或交互任务同时读取 `../../docs/Admin-Client前端原型还原验收规则.md` 和后台原型 `../../docs/悦/货代SAAS平台后台/AGENTS.md`。 + 订单样板和国内仓样式统一还须读取 `../../docs/Admin高密度界面规范.md`;以其已确认密度与彩色页签为视觉基线,逐操作保留业务语义和承载方式,公共样式按已确认菜单范围接入。 3. 标准列表或公共组件任务读取 `src/shared/components/AGENTS.md`;国内/海外 HTTP、Token 或刷新任务读取 `src/shared/api/AGENTS.md`;Finance 任务读取 `src/modules/finance/AGENTS.md`;海外仓全流程任务先读 `../../docs/海外仓业务/README.md`。 4. 平台/客户层级与权限公共语义读取 `../../docs/平台客户层级与权限契约.md`;双区域 API、海外 Token 和跨区事件读取 `../../docs/跨区域认证与服务通信契约.md`。 diff --git a/src/modules/container-loading/components/ContainerSimulationCreate.vue b/src/modules/container-loading/components/ContainerSimulationCreate.vue index 0f67a4f2..235fc793 100644 --- a/src/modules/container-loading/components/ContainerSimulationCreate.vue +++ b/src/modules/container-loading/components/ContainerSimulationCreate.vue @@ -1,4 +1,5 @@ - + 返回 {{ detail?.inventory.containerNo || '整柜库存详情' }} @@ -96,18 +97,18 @@ onMounted(load) + diff --git a/src/modules/domestic-containers/pages/domesticContainersSummary.css b/src/modules/domestic-containers/pages/domesticContainersSummary.css index b21d4173..82421555 100644 --- a/src/modules/domestic-containers/pages/domesticContainersSummary.css +++ b/src/modules/domestic-containers/pages/domesticContainersSummary.css @@ -1,67 +1,9 @@ .domestic-containers-page .table-panel .inventory-summary { - display: grid; - grid-template-columns: repeat(4, minmax(0, 1fr)); - align-items: stretch; - gap: 12px; - margin: 0; - padding: 14px 18px; - border: 0; - background: transparent; + display: flex; flex-wrap: wrap; gap: 6px 28px; margin: 0; + padding: 8px 12px; border: 0; border-bottom: 1px solid var(--cc-border); background: #fff; } - -.domestic-containers-page .table-panel .inventory-summary > div, -.domestic-containers-page .table-panel .inventory-summary > div:last-child { - display: block; - min-width: 0; - padding: 12px 14px; - border: 1px solid #e7edf5; - border-radius: 8px; - background: #f8fafc; -} - -.domestic-containers-page .table-panel .inventory-summary span { - display: block; - color: #64748b; - font-size: 12px; - line-height: 1.4; -} - -.domestic-containers-page .table-panel .inventory-summary strong { - display: block; - margin-top: 6px; - color: #1e293b; - font-size: 20px; - line-height: 1.25; -} - -@media (min-width: 721px) { - .domestic-containers-page .table-panel:has(.inventory-summary) { - position: relative; - } - - .domestic-containers-page .table-panel .inventory-summary { - padding-right: 70px; - } - - .domestic-containers-page .inventory-summary + .data-table > .data-table__toolbar { - position: absolute; - z-index: 1; - top: 35px; - right: 18px; - min-height: 34px; - padding: 0; - border-bottom: 0; - } -} - -@media (max-width: 720px) { - .domestic-containers-page .table-panel .inventory-summary { - grid-template-columns: repeat(2, minmax(0, 1fr)); - } -} - -@media (max-width: 360px) { - .domestic-containers-page .table-panel .inventory-summary { - grid-template-columns: 1fr; - } +.domestic-containers-page .table-panel .inventory-summary > div { + display: flex; align-items: baseline; min-width: 0; gap: 8px; padding: 0; border: 0; } +.domestic-containers-page .table-panel .inventory-summary span { color: var(--cc-muted); font-size: 12px; } +.domestic-containers-page .table-panel .inventory-summary strong { font-size: 14px; font-weight: 600; } diff --git a/src/modules/iam/api/platformIam.test.ts b/src/modules/iam/api/platformIam.test.ts index 4c31434a..86774b90 100644 --- a/src/modules/iam/api/platformIam.test.ts +++ b/src/modules/iam/api/platformIam.test.ts @@ -314,7 +314,7 @@ describe('platform IAM roles', () => { it('creates, updates, and changes customer status with the platform tenant contract', async () => { const tenant = { id: '8', tenantCode: 'TEN8', tenantName: '柏悦物流', status: 'ACTIVE' } const create = { - tenantName: '柏悦物流', legalName: '柏悦物流有限公司', legalRepresentative: '张三', + tenantName: '柏悦物流', customerNickname: '柏', legalName: '柏悦物流有限公司', legalRepresentative: '张三', contactName: '张三', contactPhone: '13800138000', contactEmail: 'ops@example.com', servicePackage: '标准版', contactWechat: 'baiyue-ops', salesOwnerName: '李四', paymentTermDays: 30, enterpriseType: '有限责任公司', establishedDate: '2020-01-01', registeredCapital: 1000, registeredCapitalCurrency: 'CNY', diff --git a/src/modules/iam/api/platformIam.ts b/src/modules/iam/api/platformIam.ts index 589b449e..e6f4cf31 100644 --- a/src/modules/iam/api/platformIam.ts +++ b/src/modules/iam/api/platformIam.ts @@ -28,6 +28,7 @@ export interface PlatformTenantResource { id: number | string tenantCode: string tenantName: string + customerNickname?: string | null status: PlatformTenantStatus dimensionInitializationStatus?: 'PENDING' | 'SENDING' | 'READY' | 'FAILED' | string legalName: string | null @@ -52,6 +53,7 @@ export interface PlatformTenantResource { export interface CreatePlatformTenantRequest { tenantName: string + customerNickname?: string legalName: string legalRepresentative?: string contactName: string @@ -69,7 +71,7 @@ export interface CreatePlatformTenantRequest { internalRemark: string } -export type UpdatePlatformTenantRequest = CreatePlatformTenantRequest +export type UpdatePlatformTenantRequest = Omit & { customerNickname: string } export interface PlatformTenantOrderCount { tenantId: number | string diff --git a/src/modules/inbounds/components/InboundTaskList.vue b/src/modules/inbounds/components/InboundTaskList.vue index 651cf77b..884e5421 100644 --- a/src/modules/inbounds/components/InboundTaskList.vue +++ b/src/modules/inbounds/components/InboundTaskList.vue @@ -1,4 +1,6 @@ - + { disposed = true; requestSerial += 1; optionsRequestSeria v-if="isReview" v-model="reviewDialogOpen" :title="selectedInbound ? `${taskLabel} · ${selectedInbound.inboundCode || '入仓码待补充'}` : taskLabel" - width="min(1180px, calc(100vw - 32px))" + width="min(1560px, calc(100vw - 48px))" top="4vh" destroy-on-close append-to-body :close-on-click-modal="!reviewNavigationLoading" :close-on-press-escape="!reviewNavigationLoading" - class="inbound-task-dialog" + class="inbound-task-dialog admin-density-dialog admin-density-workspace inbound-density" @closed="clearSelectedInbound" > @@ -466,8 +468,8 @@ onBeforeUnmount(() => { disposed = true; requestSerial += 1; optionsRequestSeria diff --git a/src/modules/loading-lists/components/LoadingListsView.test.ts b/src/modules/loading-lists/components/LoadingListsView.test.ts index 4fd0a1b0..0109eaff 100644 --- a/src/modules/loading-lists/components/LoadingListsView.test.ts +++ b/src/modules/loading-lists/components/LoadingListsView.test.ts @@ -229,9 +229,9 @@ describe('LoadingListsView', () => { expect(source).toContain("item.customerName || '客户信息缺失'") expect(source).not.toContain('item.customerName || item.accountId') expect(detailSource).toContain("item.customerName || '客户信息缺失'") - expect(detailSource).toContain("history.operatorName || '操作人信息缺失'") + expect(detailSource).toContain("row.operatorName || '操作人信息缺失'") expect(detailSource).not.toContain('item.customerName || item.accountId') - expect(detailSource).not.toContain('history.operatorName || history.operatorId') + expect(detailSource).not.toContain('row.operatorName || row.operatorId') }) it('does not retain the retired loading-list customs entry', () => { @@ -244,7 +244,7 @@ describe('LoadingListsView', () => { it('filters pure status no-ops and counts identity-distinct visible history events', () => { for (const marker of ['visibleHistories', 'STATUS_UPDATE', 'operationId', 'PUSH_PRELOAD']) expect(detailSource).toContain(marker) expect(detailSource).toContain('visibleHistories.length }} 条') - expect(detailSource).toContain('v-for="history in visibleHistories"') + expect(detailSource).toContain(':data="visibleHistories"') expect(detailSource).not.toContain('detail.histories.length }} 条') expect(detailSource).not.toContain('v-for="history in detail.histories"') expect(detailSource).toContain('seen.has(eventKey)') diff --git a/src/modules/loading-lists/components/LoadingListsView.vue b/src/modules/loading-lists/components/LoadingListsView.vue index f835424e..66036bfc 100644 --- a/src/modules/loading-lists/components/LoadingListsView.vue +++ b/src/modules/loading-lists/components/LoadingListsView.vue @@ -1,4 +1,5 @@ - + { v-model="editorOpen" :title="editorTitle" width="min(560px, calc(100vw - 28px))" - class="location-editor-dialog" + class="location-editor-dialog admin-density-dialog" :confirm-loading="saving" :close-on-click-modal="false" :close-on-press-escape="!saving" @@ -682,22 +683,22 @@ onMounted(() => { .location-actions { display: flex; align-items: center; gap: 4px; white-space: nowrap; } .location-actions :deep(.el-button) { margin-left: 0; } .location-cell { display: flex; min-width: 0; align-items: center; gap: 10px; } -.location-cell > span { display: grid; width: 34px; height: 34px; flex: 0 0 34px; place-items: center; border-radius: 7px; background: #eef3fa; color: var(--cc-primary); } +.location-cell > span { display: grid; width: 20px; height: 20px; flex: 0 0 20px; place-items: center; border-radius: 7px; background: #eef3fa; color: var(--cc-primary); } .location-cell > div, .stacked-value { display: flex; min-width: 0; flex-direction: column; gap: 3px; } -.location-cell strong, .stacked-value strong { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } -.location-cell small, .stacked-value small { color: var(--cc-muted); font-size: 11px; } +.location-cell strong, .stacked-value strong { overflow-wrap: anywhere; } +.location-cell small, .stacked-value small { color: var(--cc-muted); font-size: 12px; } .remark-cell { display: -webkit-box; overflow: hidden; line-height: 1.5; -webkit-box-orient: vertical; -webkit-line-clamp: 2; } :global(.location-editor-dialog) { max-height: min(760px, calc(100vh - 32px)); display: flex; flex-direction: column; } :global(.location-editor-dialog .el-dialog__body) { min-height: 0; overflow-y: auto; } :global(.location-editor-dialog .el-dialog__footer) { flex: 0 0 auto; } -.editor-form { padding: 8px 24px 12px; } +.editor-form { padding: 0; } .editor-field-grid { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 0 14px; } .editor-form :deep(.el-input-number), .editor-form :deep(.el-select) { width: 100%; } -.editor-form :deep(.el-form-item) { margin-bottom: 18px; } -.editor-form :deep(.el-form-item__label) { padding-bottom: 7px; color: #344054; font-size: 12px; font-weight: 650; line-height: 1.4; } +.editor-form :deep(.el-form-item) { margin-bottom: 14px; } +.editor-form :deep(.el-form-item__label) { padding-bottom: 4px; color: #344054; font-size: 12px; font-weight: 650; line-height: 1.4; } .editor-remark-field { margin-bottom: 0 !important; } .editor-footer { display: flex; align-items: center; justify-content: space-between; gap: 8px; } -.editor-footer > span { color: var(--cc-muted); font-size: 11px; } +.editor-footer > span { color: var(--cc-muted); font-size: 12px; } .editor-footer > span i { color: var(--el-color-danger); font-style: normal; } .editor-footer > div { display: flex; gap: 8px; } .editor-footer :deep(.el-button + .el-button) { margin-left: 0; } diff --git a/src/modules/warehouse-resources/pallets/pages/PalletsView.vue b/src/modules/warehouse-resources/pallets/pages/PalletsView.vue index e5f0cc7e..5293cbac 100644 --- a/src/modules/warehouse-resources/pallets/pages/PalletsView.vue +++ b/src/modules/warehouse-resources/pallets/pages/PalletsView.vue @@ -1,4 +1,5 @@ - + 托盘总数{{ summary.totalCount }} 闲置托盘{{ summary.idleCount }} @@ -423,7 +424,7 @@ onMounted(() => { - + @@ -478,29 +479,29 @@ onMounted(() => {