diff --git a/src/modules/finance/pages/FinanceCustomerArapView.test.ts b/src/modules/finance/pages/FinanceCustomerArapView.test.ts index 36f461b3..7acd50a5 100644 --- a/src/modules/finance/pages/FinanceCustomerArapView.test.ts +++ b/src/modules/finance/pages/FinanceCustomerArapView.test.ts @@ -179,18 +179,19 @@ describe('FinanceCustomerArapView G2 operations', () => { it('hides technical source identifiers and versions from list rows', async () => { vi.mocked(listFinanceFeePool).mockResolvedValue([ - { poolItemId: 'PAYABLE:358', feeSourceId: '358', customerId: '10001', direction: 'PAYABLE', sourceType: 'CONTAINER_FEE', sourceId: '2088285842638942210', sourceVersion: 1, orderId: null, inboundId: null, containerId: '2088285834627821569', feeItemName: '吊机费', amount: 300, currency: 'CNY', status: 'AVAILABLE', createdAt: '2026-08-14T23:25:19.684' }, + { poolItemId: 'PAYABLE:358', feeSourceId: '358', customerId: '10001', direction: 'PAYABLE', sourceType: 'CONTAINER_FEE', sourceId: '2088285842638942210', sourceVersion: 1, orderId: null, inboundId: null, containerId: '2088285834627821569', feeItemName: 'ADMIN-API-20260814152244615-整柜成本', amount: 300, currency: 'CNY', status: 'AVAILABLE', createdAt: '2026-08-14T23:25:19.684' }, ]) const wrapper = await mountView(['platform:finance:customer-arap:list']) await (wrapper.vm as unknown as { load(model: Record): Promise }).load({ customerId: '', direction: '', status: '', keyword: '' }) const text = wrapper.text() - expect(text).toContain('应付费用 · 吊机费') + expect(text).toContain('应付费用 · 整柜成本') expect(text).toContain('柜次费用 · 关联柜次') expect(text).toContain('2026/8/14 23:25:19') expect(text).not.toContain('PAYABLE:358') expect(text).not.toContain('2088285842638942210') expect(text).not.toContain('/v1') expect(text).not.toContain('CONTAINER_FEE') + expect(text).not.toContain('ADMIN-API-20260814152244615') }) it.each(['10001', '客户 10001', '客户10001'])('never displays customer id placeholder %s as a customer name', async (customerName) => { diff --git a/src/modules/finance/pages/FinanceG3G4Operations.test.ts b/src/modules/finance/pages/FinanceG3G4Operations.test.ts index bd96399d..9dcaa175 100644 --- a/src/modules/finance/pages/FinanceG3G4Operations.test.ts +++ b/src/modules/finance/pages/FinanceG3G4Operations.test.ts @@ -1,6 +1,7 @@ import ElementPlus, { ElMessageBox } from 'element-plus' import { createPinia, setActivePinia } from 'pinia' import { enableAutoUnmount, flushPromises, mount } from '@vue/test-utils' +import { createMemoryHistory, createRouter } from 'vue-router' import { afterAll, afterEach, beforeEach, describe, expect, it, vi } from 'vitest' import { useAccessPreviewStore } from '@/core/access/accessPreview' import { useAuthStore } from '@/core/auth/auth' @@ -19,6 +20,7 @@ import { import type { FinanceReconciliationDetail, FinanceSettlementDetail, FinanceStatementReadModel } from '../types' import FinanceCustomerStatementsView from './FinanceCustomerStatementsView.vue' import FinanceFormalSettlementPage from './FinanceFormalSettlementPage.vue' +import FinanceSettlementReceivablesView from './FinanceSettlementReceivablesView.vue' vi.mock('@/modules/iam', () => ({ listPlatformTenants: vi.fn() })) vi.mock('../api/finance', () => ({ @@ -189,6 +191,26 @@ describe('finance G3/G4 page operations', () => { expect(vm.customerName('2088')).toBe('—') }) + it('navigates from the receivable list to its independent detail route', async () => { + const pinia = piniaWithPermissions(['platform:finance:settlement-ar:list']) + const router = createRouter({ + history: createMemoryHistory(), + routes: [ + { path: '/finance/settlement-receivables', component: { template: '
' } }, + { path: '/finance/settlement-receivables/:settlementId', component: { template: '
' } }, + ], + }) + await router.push('/finance/settlement-receivables') + await router.isReady() + const wrapper = mount(FinanceSettlementReceivablesView, { global: { plugins: [pinia, router, ElementPlus] } }) + await flushPromises() + + wrapper.findComponent(FinanceFormalSettlementPage).vm.$emit('openDetail', '63') + await flushPromises() + + expect(router.currentRoute.value.fullPath).toBe('/finance/settlement-receivables/63') + }) + it('keeps settled settlements readable and exportable while hiding receipt actions', async () => { vi.mocked(getFinanceSettlement).mockResolvedValue({ ...receivable, status: 'PAID', paidAmount: 300, outstandingAmount: 0 }) const pinia = piniaWithPermissions(['platform:finance:settlement-ar:list', 'platform:finance:receipt:create']) diff --git a/src/modules/finance/pages/FinanceSettlementReceivablesView.vue b/src/modules/finance/pages/FinanceSettlementReceivablesView.vue index 756b6a01..b6f6a5b4 100644 --- a/src/modules/finance/pages/FinanceSettlementReceivablesView.vue +++ b/src/modules/finance/pages/FinanceSettlementReceivablesView.vue @@ -6,7 +6,7 @@ import FinanceFormalSettlementPage from './FinanceFormalSettlementPage.vue' const route = useRoute() const router = useRouter() const settlementId = computed(() => String(route.params.settlementId || '')) -function openDetail(id: string) { void router.push({ name: 'finance-settlement-receivable-detail', params: { settlementId: id } }) } +function openDetail(id: string) { void router.push(`/finance/settlement-receivables/${encodeURIComponent(id)}`) } function back() { void router.push({ name: 'finance-settlement-receivables' }) }