From 1305753b715811516217b4f8bad6e0bf4c981437 Mon Sep 17 00:00:00 2001
From: ouyangxq <775153912@qq.com>
Date: Sun, 20 Sep 2026 10:06:23 +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/core/navigation/adminNavigation.test.ts | 2 +-
src/core/navigation/adminNavigation.ts | 2 +-
src/modules/container-loading/routes.ts | 2 +-
.../pages/UnifiedOrdersView.coLoad.test.ts | 15 ++++++++++++++-
.../pages/UnifiedOrdersView.test.ts | 2 ++
.../unified-orders/pages/UnifiedOrdersView.vue | 11 +++++++++--
6 files changed, 28 insertions(+), 6 deletions(-)
diff --git a/src/core/navigation/adminNavigation.test.ts b/src/core/navigation/adminNavigation.test.ts
index eec419ae..79180a7d 100644
--- a/src/core/navigation/adminNavigation.test.ts
+++ b/src/core/navigation/adminNavigation.test.ts
@@ -41,7 +41,7 @@ describe('adminNavigation', () => {
expect(adminNavigation.find((item) => item.key === 'container-management')?.children?.map((item) => item.title)).toEqual([
'订舱列表',
'拖车列表',
- '送柜报关',
+ '货柜列表',
'清关提柜',
])
expect(adminNavigation.find((item) => item.key === 'overseas-inventory')?.children?.map((item) => item.title)).toEqual([
diff --git a/src/core/navigation/adminNavigation.ts b/src/core/navigation/adminNavigation.ts
index e4c2b908..e5574aef 100644
--- a/src/core/navigation/adminNavigation.ts
+++ b/src/core/navigation/adminNavigation.ts
@@ -91,7 +91,7 @@ export const adminNavigation: AdminNavigationNode[] = [
children: [
{ key: 'booking-list', title: '订舱列表', icon: ClipboardList, path: '/ocean-bookings', permission: 'platform:firstleg:ocean-booking:list' },
{ key: 'truck-list', title: '拖车列表', icon: Truck, path: '/trucking', permission: 'platform:firstleg:truck-appointment:list' },
- { key: 'domestic-container-workbench', title: '送柜报关', icon: WarehouseIcon, path: '/container-loading/domestic', permission: 'platform:firstleg:container:list' },
+ { key: 'domestic-container-workbench', title: '货柜列表', icon: WarehouseIcon, path: '/container-loading/domestic', permission: 'platform:firstleg:container:list' },
{ key: 'overseas-container-workbench', title: '清关提柜', icon: ClipboardList, path: '/container-loading/overseas', permission: 'platform:firstleg:terminal-drayage:list' },
],
},
diff --git a/src/modules/container-loading/routes.ts b/src/modules/container-loading/routes.ts
index c7c45dd4..a7e6c5d9 100644
--- a/src/modules/container-loading/routes.ts
+++ b/src/modules/container-loading/routes.ts
@@ -5,7 +5,7 @@ export const containerLoadingRoutes = [
path: 'container-loading/domestic',
name: 'domestic-container-workbench',
component: () => import('./pages/DomesticContainersView.vue'),
- meta: { title: '送柜报关', description: '管理国内送柜、装柜、出口报关与出仓', permission: 'platform:firstleg:container:list' },
+ meta: { title: '货柜列表', description: '管理国内送柜、装柜、出口报关与出仓', permission: 'platform:firstleg:container:list' },
},
{
path: 'container-loading/domestic/:containerId',
diff --git a/src/modules/unified-orders/pages/UnifiedOrdersView.coLoad.test.ts b/src/modules/unified-orders/pages/UnifiedOrdersView.coLoad.test.ts
index 3852fc22..f2551cba 100644
--- a/src/modules/unified-orders/pages/UnifiedOrdersView.coLoad.test.ts
+++ b/src/modules/unified-orders/pages/UnifiedOrdersView.coLoad.test.ts
@@ -39,7 +39,7 @@ function mountView() {
AdminPage: { template: '' },
ListPageLayout: { template: '' },
QueryToolbar: { template: '
' },
- DataTable: { name: 'DataTable', props: ['data', 'columns'], emits: ['selection-change'], template: '' },
+ DataTable: { name: 'DataTable', props: ['data', 'columns', 'rowClassName'], emits: ['selection-change'], template: '' },
AppDialog: { name: 'AppDialog', props: ['modelValue', 'confirmText', 'confirmDisabled', 'confirmLoading'], emits: ['confirm', 'update:modelValue'], methods: { close() { this.$emit('update:modelValue', false) } }, template: '' },
ApiErrorMeta: { props: ['details'], template: '{{ details.code }} {{ details.requestId }} {{ details.traceId }}
' },
CopyButton: { props: ['value', 'label'], template: '' },
@@ -199,6 +199,19 @@ describe('UnifiedOrdersView co-load group behavior', () => {
expect(wrapper.text()).not.toContain('5001')
})
+ it('highlights rows in a current co-load group but not cancelled groups', async () => {
+ const activeRow = { ...rows[0], coLoadGroup: { status: 'ACTIVE', memberCount: 2, memberInboundCodes: ['IN-1', 'IN-2'] } }
+ const cancelledRow = { ...rows[1], coLoadGroup: { status: 'CANCELLED', memberCount: 2, memberInboundCodes: ['IN-1', 'IN-2'] } }
+ vi.mocked(listPlatformUnifiedOrders).mockResolvedValue({ records: [activeRow, cancelledRow], page: 1, size: 20, total: 2, pages: 1 })
+ const wrapper = mountView()
+ await flushPromises()
+ const rowClassName = wrapper.findComponent({ name: 'DataTable' }).props('rowClassName') as (scope: { row: UnifiedOrderResource }) => string
+
+ expect(rowClassName({ row: activeRow })).toBe('is-coload-group-row')
+ expect(rowClassName({ row: cancelledRow })).toBe('')
+ expect(rowClassName({ row: rows[0] })).toBe('')
+ })
+
it('cancels an ACTIVE group by the clicked member inbound code and preserves dialog error evidence', async () => {
const rowsWithGroup = rows.map((row) => ({ ...row, coLoadGroup: { status: 'ACTIVE', memberCount: 2, memberInboundCodes: ['IN-1', 'IN-2'] } }))
vi.mocked(listPlatformUnifiedOrders).mockResolvedValue({ records: rowsWithGroup, page: 1, size: 20, total: 2, pages: 1 })
diff --git a/src/modules/unified-orders/pages/UnifiedOrdersView.test.ts b/src/modules/unified-orders/pages/UnifiedOrdersView.test.ts
index f37ad3c5..7249a96e 100644
--- a/src/modules/unified-orders/pages/UnifiedOrdersView.test.ts
+++ b/src/modules/unified-orders/pages/UnifiedOrdersView.test.ts
@@ -232,6 +232,8 @@ describe('UnifiedOrdersView contract', () => {
expect(source).toContain("{ key: 'detail', label: '详情', priority: 500 }")
expect(source).toContain('...unifiedOrderSecondaryActions(row).map')
expect(source).toContain(' {
diff --git a/src/modules/unified-orders/pages/UnifiedOrdersView.vue b/src/modules/unified-orders/pages/UnifiedOrdersView.vue
index 95a4b80e..86f0e4ff 100644
--- a/src/modules/unified-orders/pages/UnifiedOrdersView.vue
+++ b/src/modules/unified-orders/pages/UnifiedOrdersView.vue
@@ -1811,6 +1811,10 @@ function coLoadGroup(row: UnifiedOrderResource) {
return row.coLoadGroup || null
}
+function unifiedOrderRowClassName({ row }: { row: UnifiedOrderResource }) {
+ return row.coLoadGroup && row.coLoadGroup.status !== 'CANCELLED' ? 'is-coload-group-row' : ''
+}
+
function coLoadGroupMemberLabel(group: CoLoadGroup) {
const orderCount = new Set(group.members.map((member) => member.orderId)).size
return group.members.length === orderCount
@@ -2009,7 +2013,7 @@ function moreUnifiedOrderActionsLabel(row: UnifiedOrderResource) {
}
function unifiedOrderActionLabel(action: UnifiedOrderRowAction) {
if (action === 'note') return '备注'
- if (action === 'approve') return '通过'
+ if (action === 'approve') return '审核'
return '测量'
}
function unifiedOrderRowActions(row: UnifiedOrderResource): RowActionItem[] {
@@ -2648,7 +2652,7 @@ onBeforeUnmount(() => {
{{ coLoadError.message }}
-
+
导出(已选 {{ selectedOrders.length }})
批量审核通过({{ selectedApprovalOrders.length }})
@@ -2884,6 +2888,9 @@ onBeforeUnmount(() => {
.order-code-cell { display: grid; justify-items: start; gap: var(--admin-space-1, 4px); }
.coload-tag-trigger { margin: 0; padding: 0; border: 0; background: transparent; cursor: pointer; }
.coload-tag-trigger:focus-visible { outline: 2px solid var(--el-color-primary); outline-offset: 2px; border-radius: 3px; }
+.table-card :deep(.el-table__row.is-coload-group-row > .el-table__cell) { background: #fff6df; color: #7a4b00; }
+.table-card :deep(.el-table__row.is-coload-group-row:hover > .el-table__cell) { background: #ffedbd; }
+.table-card :deep(.el-table__row.is-coload-group-row > .el-table__cell:first-child) { box-shadow: inset 3px 0 0 #e6a23c; }
.coload-selection { display: flex; flex-wrap: wrap; gap: var(--admin-space-2, 6px); margin-top: var(--admin-space-5, 12px); }
.coload-selection > span { padding: var(--admin-space-1, 4px) 7px; border: 1px solid var(--cc-border); border-radius: var(--admin-radius, 4px); background: var(--cc-surface-muted); font-size: var(--admin-font-caption, 12px); }
.coload-detail-summary { display: flex; align-items: center; justify-content: space-between; gap: var(--admin-space-5, 12px); margin-bottom: var(--admin-space-4, 10px); }
--
2.54.0