diff --git a/src/modules/container-loading/pages/ContainerDetailView.vue b/src/modules/container-loading/pages/ContainerDetailView.vue index 61ed3153..5057d142 100644 --- a/src/modules/container-loading/pages/ContainerDetailView.vue +++ b/src/modules/container-loading/pages/ContainerDetailView.vue @@ -120,6 +120,8 @@ const feeCustomers = computed(() => { return [...customers].map(([accountId, customerName]) => ({ accountId, customerName })) }) const feeBusinessReferences = computed(() => (loadingDetail.value?.items || []).map((item) => ({ + accountId: item.accountId, + customerName: item.customerName, orderId: item.orderId, orderNo: item.orderNo, inboundId: item.inboundId, diff --git a/src/modules/finance/AGENTS.md b/src/modules/finance/AGENTS.md index 980bedce..f094898f 100644 --- a/src/modules/finance/AGENTS.md +++ b/src/modules/finance/AGENTS.md @@ -15,7 +15,7 @@ ## 费用付款与凭证快速入口 -- 入库费用的应付/直接已付表单在 `../unified-orders/components/InboundFeeDetailManager.vue`,柜次费用在 `../loading-lists/components/ContainerFeesPanel.vue`;对应 API 分别为 `../unified-orders/api/inboundFeeDetails.ts`、`../loading-lists/api/containerFees.ts`。 +- 入库费用的应付/直接已付表单在 `../unified-orders/components/InboundFeeDetailManager.vue`,柜次费用在 `../loading-lists/components/ContainerFeesPanel.vue`;柜级公共费用在同一面板按真实客户与订单分摊,入仓码按事实选填;对应 API 分别为 `../unified-orders/api/inboundFeeDetails.ts`、`../loading-lists/api/containerFees.ts`。 - `DIRECT_PAID` 必须提交已付时间、付款方式,以及付款流水号或至少一个付款凭证;凭证由费用 API 调用 `/platform/finance/v1/vouchers` 上传为 `FINANCE_VOUCHER`,并绑定当前客户。 - 后端事实入口为 Firstleg `FeePaymentSnapshotValidator`、入库/柜次费用服务,文件元数据归 File;Finance 只消费已发布的费用来源快照,不在前端或 Finance 中重建付款事实。 - 财务与柜级公共费用分摊统一从 `pages/` 和 `api/finance.ts` 进入;`allocationGroupId` 整组审核、驳回、调整或作废,不允许按单条分摊明细绕过整组状态机。 diff --git a/src/modules/finance/api/finance.ts b/src/modules/finance/api/finance.ts index 6bdada3e..28e466b4 100644 --- a/src/modules/finance/api/finance.ts +++ b/src/modules/finance/api/finance.ts @@ -66,7 +66,7 @@ function jsonRecords(value: unknown): RawResource[] { function normalizeBill(item: RawResource, customerId = stringValue(item.tenant_id ?? item.customerId)): FinanceBillResource { return { id: stringValue(item.id), billNo: stringValue(item.bill_no ?? item.billNo), customerId, - customerName: stringValue(item.customer_name_snapshot ?? item.customerName) || `客户 ${customerId}`, + customerName: stringValue(item.customer_name_snapshot ?? item.customerName), billDate: stringValue(item.bill_date ?? item.billDate), dueDate: stringValue(item.due_date ?? item.dueDate), currency: 'CNY', totalAmount: numberValue(item.total_amount ?? item.totalAmount), paidAmount: numberValue(item.received_amount ?? item.receivedAmount ?? item.paidAmount), outstandingAmount: numberValue(item.outstanding_amount ?? item.outstandingAmount), status: stringValue(item.status) as FinanceBillResource['status'], diff --git a/src/modules/finance/pages/FinanceCustomerArapView.test.ts b/src/modules/finance/pages/FinanceCustomerArapView.test.ts index 76485ea3..3365853b 100644 --- a/src/modules/finance/pages/FinanceCustomerArapView.test.ts +++ b/src/modules/finance/pages/FinanceCustomerArapView.test.ts @@ -246,9 +246,10 @@ describe('FinanceCustomerArapView G2 operations', () => { expect(page).toContain('详情') expect(page).toContain("@click=\"openMutation(row, 'SUBMIT')\"") expect(page).toContain("@click=\"openMutation(row, 'ADJUST')\"") - expect(page).toContain('!isFirstlegSource(row)') - expect(page).toContain('!isFirstlegSource(detail)') + expect(page).toContain('!isUpstreamSource(row)') + expect(page).toContain('!isUpstreamSource(detail)') expect(page).toContain("['INBOUND_FEE', 'CONTAINER_FEE'].includes(type)") + expect(page).toContain("=== 'LASTLEG'") expect(page).not.toMatch(/