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/api/platformContainerLoading.test.ts b/src/modules/container-loading/api/platformContainerLoading.test.ts index df860ff6..812ad0ff 100644 --- a/src/modules/container-loading/api/platformContainerLoading.test.ts +++ b/src/modules/container-loading/api/platformContainerLoading.test.ts @@ -4,7 +4,7 @@ import { resolve } from 'node:path' import { http } from '@/shared/api/http' import { adjustSmartLoadingItem, assignPendingReviewSmartLoadingOrder, assignSmartLoadingGroup, assignSmartLoadingItem, assignSmartLoadingPallet, getContainer, - listContainers, listSmartLoadingCandidates, listSmartLoadingWorkbenchContainers, removeAllUnpickedSmartLoadingItems, removeSmartLoadingGroup, removeSmartLoadingItem, + listContainers, listSmartLoadingCandidates, listSmartLoadingWorkbenchContainers, removeAllUnpickedSmartLoadingItems, removeSmartLoadingGroup, removeSmartLoadingItem, removeSmartLoadingPallet, getContainerClearance, downloadContainerClearance, uploadContainerClearance, completeContainerClearance, getContainerOverview, updateContainerPickupCode, markContainerException, cancelContainerException, uploadContainerDocument, downloadContainerDocument, downloadContainerPdaPhoto, getCustomerContainerTransitSummary, @@ -131,6 +131,17 @@ describe('platform container loading API', () => { ) }) + it('removes a sealed pallet through the whole-pallet command', async () => { + vi.mocked(http.delete).mockResolvedValue({ code: '200', data: plan }) + + await removeSmartLoadingPallet('10', '9007199254740998', 6) + + expect(http.delete).toHaveBeenCalledWith( + '/platform/v1/first-leg/smart-loading/plans/10/pallet-assignments/9007199254740998', + { data: { expectedPlanVersion: 6, operationId: expect.stringContaining('remove-pallet-') } }, + ) + }) + it('uses the dedicated provisional assignment command for a pending-review order', async () => { vi.mocked(http.post).mockResolvedValue({ code: '200', data: plan }) diff --git a/src/modules/container-loading/api/platformContainerLoading.ts b/src/modules/container-loading/api/platformContainerLoading.ts index 19c383ac..c5c163ca 100644 --- a/src/modules/container-loading/api/platformContainerLoading.ts +++ b/src/modules/container-loading/api/platformContainerLoading.ts @@ -395,6 +395,14 @@ export async function removeSmartLoadingItem(planId: string, itemId: string, exp return plan(unwrapApiResponse(response)) } +export async function removeSmartLoadingPallet(planId: string, palletId: string, expectedPlanVersion: number) { + const response = await http.delete, ApiEnvelope>( + `${smartLoadingPath}/plans/${encodeURIComponent(planId)}/pallet-assignments/${encodeURIComponent(palletId)}`, + { data: { expectedPlanVersion, operationId: operationId('remove-pallet') } }, + ) + return plan(unwrapApiResponse(response)) +} + export async function removeSmartLoadingGroup(planId: string, groupId: string, expectedPlanVersion: number) { const response = await http.delete, ApiEnvelope>( `${smartLoadingPath}/plans/${encodeURIComponent(planId)}/group-assignments/${encodeURIComponent(groupId)}`, 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 @@ + 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/first-leg-orders/api/platformFirstLegOrders.test.ts b/src/modules/first-leg-orders/api/platformFirstLegOrders.test.ts index c76bf7a8..c141fa9c 100644 --- a/src/modules/first-leg-orders/api/platformFirstLegOrders.test.ts +++ b/src/modules/first-leg-orders/api/platformFirstLegOrders.test.ts @@ -3,7 +3,6 @@ import { http } from '@/shared/api/http' import { getPlatformTenantOrderStatistics, acceptPlatformFirstLegOrder, - addPlatformFirstLegOrderNote, approvePlatformFirstLegOrder, cancelPlatformFirstLegOrder, completePlatformFirstLegOrder, @@ -85,7 +84,6 @@ describe('platform first-leg order API', () => { await startPlatformFirstLegOrder('10001', '90001') await completePlatformFirstLegOrder('10001', '90001') await cancelPlatformFirstLegOrder('10001', '90001', '客户取消') - await addPlatformFirstLegOrderNote('10001', '90001', '已联系客户确认') expect(http.get).toHaveBeenCalledWith('/platform/v1/orders/first-leg/90001', { params: { tenantId: '10001' } }) expect(http.post).toHaveBeenNthCalledWith(1, '/platform/v1/orders/first-leg/90001/approve', undefined, { params: { tenantId: '10001' } }) @@ -93,7 +91,6 @@ describe('platform first-leg order API', () => { expect(http.post).toHaveBeenNthCalledWith(3, '/platform/v1/orders/first-leg/90001/start', undefined, { params: { tenantId: '10001' } }) expect(http.post).toHaveBeenNthCalledWith(4, '/platform/v1/orders/first-leg/90001/complete', undefined, { params: { tenantId: '10001' } }) expect(http.post).toHaveBeenNthCalledWith(5, '/platform/v1/orders/first-leg/90001/cancel', { reason: '客户取消' }, { params: { tenantId: '10001' } }) - expect(http.post).toHaveBeenNthCalledWith(6, '/platform/v1/orders/first-leg/90001/internal-notes', { content: '已联系客户确认' }, { params: { tenantId: '10001' } }) }) it('writes the backend express contract as names, not a guessed master-data ID', async () => { diff --git a/src/modules/first-leg-orders/api/platformFirstLegOrders.ts b/src/modules/first-leg-orders/api/platformFirstLegOrders.ts index 22ce4117..45a9d704 100644 --- a/src/modules/first-leg-orders/api/platformFirstLegOrders.ts +++ b/src/modules/first-leg-orders/api/platformFirstLegOrders.ts @@ -192,10 +192,6 @@ export function cancelPlatformFirstLegOrder(tenantId: string, orderId: string, r return postData(`/platform/v1/orders/first-leg/${orderId}/cancel`, { reason }, { tenantId }) } -export function addPlatformFirstLegOrderNote(tenantId: string, orderId: string, content: string) { - return postData(`/platform/v1/orders/first-leg/${orderId}/internal-notes`, { content }, { tenantId }) -} - export function updatePlatformFirstLegOrderExpress( tenantId: string, orderId: string, 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..b4612a97 100644 --- a/src/modules/inbounds/components/InboundTaskList.vue +++ b/src/modules/inbounds/components/InboundTaskList.vue @@ -1,4 +1,6 @@