From e962577eca0d2399e31b268f28b44a1048182e77 Mon Sep 17 00:00:00 2001 From: ouyangxq <775153912@qq.com> Date: Mon, 28 Sep 2026 15:24:33 +0800 Subject: [PATCH] fix(admin): align test contracts and sailing integrations --- AGENTS.md | 1 + src/app/DomesticOutboundListLayout.test.ts | 2 +- .../components/ContainerCustomsPanel.vue | 6 +- src/modules/container-loading/index.ts | 1 + .../pages/ContainerDetailView.test.ts | 3 +- src/modules/customers/pages/CustomersView.vue | 2 +- src/modules/fba-pricing/public.ts | 2 + .../finance/pages/FinancePresentation.test.ts | 2 +- .../measurement/InboundMeasurementDialog.vue | 2 +- .../review/MeasurementReviewPanel.vue | 8 +-- .../pages/OceanBookingDetailView.vue | 2 +- .../lastMilePresentation.test.ts | 2 +- .../pages/InboundOrderDetailView.vue | 2 +- .../pages/LastMileOrdersView.vue | 12 ++-- .../pages/MojiaSkuSyncView.vue | 12 ++-- .../pages/RelabelOrdersView.test.ts | 2 +- src/modules/overseas-warehouse/routes.test.ts | 2 + .../pages/SailingCalendarView.vue | 63 +++++++++---------- src/modules/sailing-calendar/types.ts | 8 +-- .../pages/UnifiedOrdersView.test.ts | 2 +- .../pages/UnifiedOrdersView.vue | 2 +- src/styles/adminDensity.test.ts | 9 +-- 22 files changed, 74 insertions(+), 73 deletions(-) diff --git a/AGENTS.md b/AGENTS.md index ba341794..b39a57b2 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -43,6 +43,7 @@ | 登录、会话与双区域 Token | `modules/auth/`、`core/auth/` | 国内 `auth/`、`iam/`;海外请求客户端再读 `shared/api/AGENTS.md` | | 启动与懒加载资源恢复 | `main.ts`、`core/routing/navigationRecovery.ts` | 仅识别动态模块/Chunk 资源过期;30 秒内同目标最多自动恢复一次,存在未保存编辑时必须先确认 | | 工作台与指标 | `modules/dashboard/` | 指标所属模块与服务端,不复制领域契约 | +| 船期日历 | `modules/sailing-calendar/` | 当前日历入口覆盖渠道、周模板、单次船期、收货截止时间和按渠道货量统计;后端按 `firstleg/` 船期接口定位,不读取已归档的货柜开发规划 | | FBA 无匹配价格、人工定价 | `modules/inbounds/fee/api.ts` 的 `createManualInboundQuote`、`types.ts`;页面消费沿 `InboundFeePanel.vue` 核对 | `POST /manual-quote` 提交计费重量、体积、单价、原因和 `Idempotency-Key`;Backend `PlatformFbaPricingController.manualQuote` → `FbaPricingService.manualQuote`,权限 `firstleg:inbound:confirm-send-fee`。仅 FBA、已有实际测量且当前价格未命中时允许,客户已确认费用禁止改价;`MANUAL_QUOTE` 快照允许价格记录与版本为空,不伪造价格簿关联。API 回归 `modules/inbounds/fee/api.test.ts`,不能以 API 存在代替页面接入完成 | | PDA版本、APK下载、WGT热更新发布与停发 | `modules/pda-releases/pages/PdaReleasesView.vue`、`modules/pda-releases/api/pdaReleases.ts`、`modules/pda-releases/routes.ts` | 系统菜单 `/system/pda-releases`;列表权限 `platform:pda-release:list`,上传/发布/停发权限 `platform:pda-release:manage`。国内/海外按 `domestic/overseas` 分开查询,上传只创建草稿,发布与停发需确认;管理请求使用国内 HTTP 的 `/platform/v1/files/pda-releases`,后端见 `file/AGENTS.md`,设备安装与重启查对应 PDA 的更新工具 | | 客户、企业审核、客户统计 | `modules/customers/` | `iam/`、`auth/`、`file/`、`firstleg/customerstatistics/`;公司联系电话只作企业联系信息,不修改管理员/成员登录手机号且不要求跨企业唯一。审核必填资质仅营业执照与统一社会信用代码;法人身份证选填,可随资质包提交,也可在已有营业执照后单独补传或替换 | diff --git a/src/app/DomesticOutboundListLayout.test.ts b/src/app/DomesticOutboundListLayout.test.ts index 56b5c209..9c55b44d 100644 --- a/src/app/DomesticOutboundListLayout.test.ts +++ b/src/app/DomesticOutboundListLayout.test.ts @@ -31,7 +31,7 @@ describe('domestic outbound list responsive contracts', () => { const content = source(path) const columns = [...content.matchAll(/\{[^{}]*(?:key|prop): '[^']+'[^{}]*label: '[^']+'[^{}]*\}/g)] .map((match) => match[0]) - .filter((column) => !column.includes("type: 'input'") && !column.includes("type: 'select'") && !column.includes("type: 'daterange'")) + .filter((column) => !column.includes("type: 'input'") && !column.includes("type: 'select'") && !column.includes("type: 'daterange'") && !column.includes('priority:') && !column.includes("key: 'view'")) expect(columns.length).toBeGreaterThan(1) for (const column of columns) expect(column).toMatch(/\b(?:width|minWidth):\s*\d+/) }) diff --git a/src/modules/container-loading/components/ContainerCustomsPanel.vue b/src/modules/container-loading/components/ContainerCustomsPanel.vue index d02b4a41..ed95c2d7 100644 --- a/src/modules/container-loading/components/ContainerCustomsPanel.vue +++ b/src/modules/container-loading/components/ContainerCustomsPanel.vue @@ -112,7 +112,7 @@ async function createFormalDeclaration() { async function submitFormalDeclaration(batch: DeclarationBatch) { try { - const answer = await ElMessageBox.prompt('请输入报关单号', '提交正式申报', { inputValidator: (value) => value.trim() ? true : '请输入报关单号', confirmButtonText: '确认提交' }) + const answer = await ElMessageBox.prompt('请输入报关单号', '提交正式申报', { customClass: 'admin-density-confirm', inputValidator: (value) => value.trim() ? true : '请输入报关单号', confirmButtonText: '确认提交' }) actionLoading.value = true; actionError.value = null await submitDeclarationBatch(batch, answer.value) await load(); ElMessage.success('正式申报已提交') @@ -124,7 +124,7 @@ async function submitFormalDeclaration(batch: DeclarationBatch) { async function recordFormalResult(batch: DeclarationBatch) { try { - const answer = await ElMessageBox.prompt('可填写查验处理说明,没有说明可直接确认', '录入海关查验结果', { inputPlaceholder: '处理说明(可选)', confirmButtonText: '确认录入' }) + const answer = await ElMessageBox.prompt('可填写查验处理说明,没有说明可直接确认', '录入海关查验结果', { customClass: 'admin-density-confirm', inputPlaceholder: '处理说明(可选)', confirmButtonText: '确认录入' }) actionLoading.value = true; actionError.value = null await recordClearanceResult(batch, 'INSPECTION', answer.value) await load(); ElMessage.success('海关结果已录入') @@ -136,7 +136,7 @@ async function recordFormalResult(batch: DeclarationBatch) { async function resolveFormalResult(batch: DeclarationBatch, result: DeclarationBatch['results'][number]) { try { - const answer = await ElMessageBox.prompt('请输入处理说明', '处理海关结果', { inputValue: result.resolution || '', inputValidator: (value) => value.trim() ? true : '请输入处理说明', confirmButtonText: '确认处理' }) + const answer = await ElMessageBox.prompt('请输入处理说明', '处理海关结果', { customClass: 'admin-density-confirm', inputValue: result.resolution || '', inputValidator: (value) => value.trim() ? true : '请输入处理说明', confirmButtonText: '确认处理' }) actionLoading.value = true; actionError.value = null await resolveClearanceResult(result, batch.version, answer.value) await load(); ElMessage.success('海关结果已处理') diff --git a/src/modules/container-loading/index.ts b/src/modules/container-loading/index.ts index da4036f4..b37f139a 100644 --- a/src/modules/container-loading/index.ts +++ b/src/modules/container-loading/index.ts @@ -1,4 +1,5 @@ export * from './api/platformContainerLoading' export * from './types' +export { getSmartLoadingChannelGroup, isSeaRailChannel, SMART_LOADING_CHANNEL_GROUPS } from './smartLoadingChannelGroups' export { default as SmartLoadingDialog } from './components/SmartLoadingDialog.vue' export { default as ContainerSimulationCreate } from './components/ContainerSimulationCreate.vue' diff --git a/src/modules/container-loading/pages/ContainerDetailView.test.ts b/src/modules/container-loading/pages/ContainerDetailView.test.ts index 0b5c40d0..a5a6ef3e 100644 --- a/src/modules/container-loading/pages/ContainerDetailView.test.ts +++ b/src/modules/container-loading/pages/ContainerDetailView.test.ts @@ -47,7 +47,8 @@ describe('ContainerDetailView customs integration', () => { expect(source).toContain(' { void loadCustomers() }) - + diff --git a/src/modules/fba-pricing/public.ts b/src/modules/fba-pricing/public.ts index e0e6fc2b..922fdac3 100644 --- a/src/modules/fba-pricing/public.ts +++ b/src/modules/fba-pricing/public.ts @@ -5,3 +5,5 @@ export { setCustomerChargeRuleDefault, } from './customer-rules/api' export type { CustomerChargeRule, CreateCustomerChargeRuleRequest } from './customer-rules/api' +export { getPlatformPriceBook, listPlatformPriceBooks } from './carrier-rates/api/platformPriceBooks' +export type { PlatformPriceBookParsedChannel } from './carrier-rates/api/platformPriceBooks' diff --git a/src/modules/finance/pages/FinancePresentation.test.ts b/src/modules/finance/pages/FinancePresentation.test.ts index a3a262af..170aaff5 100644 --- a/src/modules/finance/pages/FinancePresentation.test.ts +++ b/src/modules/finance/pages/FinancePresentation.test.ts @@ -123,7 +123,7 @@ describe('finance presentation governance', () => { expect(statements).toContain('createReconciliationStatement') expect(statements).toContain('actionReconciliationStatement') expect(statements).toContain(' - + - - diff --git a/src/modules/sailing-calendar/types.ts b/src/modules/sailing-calendar/types.ts index 0e582108..723249e2 100644 --- a/src/modules/sailing-calendar/types.ts +++ b/src/modules/sailing-calendar/types.ts @@ -25,8 +25,8 @@ export interface SailingCalendarEntry { warehouseName: string channelCode: string channelName: string - vesselName: string - voyageNo: string + vesselName: string | null + voyageNo: string | null departurePortCode: string departurePortName?: string | null destinationPortCode: string @@ -85,8 +85,8 @@ export interface SailingSaveRequest { warehouseName?: string | null channelCode: string channelName: string - vesselName: string - voyageNo: string + vesselName: string | null + voyageNo: string | null departurePortCode: string departurePortName?: string | null destinationPortCode: string diff --git a/src/modules/unified-orders/pages/UnifiedOrdersView.test.ts b/src/modules/unified-orders/pages/UnifiedOrdersView.test.ts index 09f8a540..a815ebb7 100644 --- a/src/modules/unified-orders/pages/UnifiedOrdersView.test.ts +++ b/src/modules/unified-orders/pages/UnifiedOrdersView.test.ts @@ -249,7 +249,7 @@ describe('UnifiedOrdersView contract', () => { it('counts detail in the three directly visible row actions', () => { expect(source).toContain("{ key: 'detail', label: '详情', priority: 500 }") expect(source).toContain('...unifiedOrderSecondaryActions(row).map') - expect(source).toContain(' { 打印箱唛({{ selectedCartonLabelOrders.length }}) 智能装柜 - +