diff --git a/AGENTS.md b/AGENTS.md index 3af178dd..231d6785 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -55,10 +55,10 @@ | 平台仓库与仓储资源 | `modules/warehouses/`、`modules/warehouse-resources/` | `warehouse/` | | 订单列表、详情与入库费用 | `modules/unified-orders/`、`modules/first-leg-orders/`;费用入口 `modules/unified-orders/components/InboundFeeDetailManager.vue`、`modules/unified-orders/api/inboundFeeDetails.ts` | `order/`、`firstleg/`;费用来源审核发布联查 `firstleg/AGENTS.md` | | 入库、箱唛、手工/设备测量和计费工作流 | `modules/inbounds/pages/InboundOrdersView.vue`;测量接口与页面从 `modules/inbounds/measurement/` 进入;审核、称重和费用继续按 `modules/inbounds/` 相邻子域定位;计价主数据在 `modules/fba-pricing/`、`modules/dimension-config/`、`modules/fee-items/` | `firstleg/`、`order/`、`file/`、`integration-service/`;箱码生成、打印与测量绑定先读 `firstleg/AGENTS.md` | -| 财务账户、账单、收款与成本 | `modules/finance/` | `finance/`;费用来源与柜次成本快照联查 `firstleg/`,凭证联查 `file/` | +| 财务账户、费用来源、应收统计、对账单、收付款与成本 | `modules/finance/`;应收统计从 `pages/FinanceReceivableStatisticsView.vue`、`api/finance.ts` 进入 | `finance/`;应收统计只汇总指定生成月份的 CNY 正式应收结算单,导出使用 `FINANCE_RECEIVABLE_STATISTICS` 进入 File 下载中心;费用来源与柜次成本快照联查 `firstleg/`,凭证联查 `file/` | | 货柜与智能排柜 | `modules/container-loading/` | `firstleg/loading/`、`firstleg/split/` | | 预装详情、装柜清单与柜次费用 | `modules/loading-lists/pages/PreloadPlanDetailView.vue`、`modules/loading-lists/components/LoadingListDetailDrawer.vue`、`modules/loading-lists/components/ContainerFeesPanel.vue`、`modules/loading-lists/api/containerFees.ts` | `firstleg/loading/`、`firstleg` 柜次费用、`finance/` 成本分摊、`file/`、`warehouse/` | -| 海运订舱与船期 | `modules/ocean-bookings/`、`modules/port-schedules/` | `firstleg/oceanbooking/`、`firstleg/portschedule/`、`integration-service/`;订舱代理联查 `modules/suppliers/` 与 `warehouse/src/main/resources/openapi/supplier-v1.yaml`,服务端契约见 `firstleg/src/main/resources/openapi/ocean-bookings-v1.yaml` | +| 海运订舱与船期 | `modules/ocean-bookings/`、`modules/port-schedules/`;订舱状态、柜型需求和 API 分别从 `status.ts`、`containerRequirements.ts`、`api/platformOceanBookings.ts` 进入 | `firstleg/oceanbooking/`、`firstleg/portschedule/`、`integration-service/`;订舱仅有 `DRAFT`、`RELEASED`,草稿可编辑/删除,放舱后永久只读;创建和放舱只保存订舱聚合与柜型需求,不生成真实柜号或货柜分配。渠道来自起运仓当前 ACTIVE 价格版本;订舱代理联查 `modules/suppliers/` 与 `warehouse/src/main/resources/openapi/supplier-v1.yaml`,服务端契约见 `firstleg/src/main/resources/openapi/ocean-bookings-v1.yaml` | | 拖车预约 | `modules/trucking/` | `firstleg/outbound/dispatch/`、`firstleg/`;承运商联查 `modules/suppliers/` 与 `warehouse/src/main/resources/openapi/supplier-v1.yaml`,服务端契约见 `firstleg/src/main/resources/openapi/truck-appointments-v1.yaml` | | 报关协同 | `modules/customs/` | `firstleg/customs/`、`file/`;报关代理联查 `modules/suppliers/` 与 `warehouse/src/main/resources/openapi/supplier-v1.yaml`,服务端契约见 `firstleg/src/main/resources/openapi/customs-v1.yaml` | | 国内出仓确认 | `modules/outbound-dispatch/` | `firstleg/outbound/dispatch/` | @@ -92,7 +92,7 @@ - 删除、停用、改权限等高风险操作必须有明确确认、处理中、成功和失败反馈;失败时保留用户上下文,避免误以为已生效。 - 日志、提示和示例数据不得包含真实账号、令牌、客户隐私或生产数据。 - Admin 维护客户专属数据时,必须通过平台客户列表显式选择目标客户,不得从本地存储推断客户。平台仓库等公共主数据不要求先选择客户;切换客户时不得保留上一客户的编辑、详情或导入上下文。 -- Finance 五个正式列表页(客户账户、客户应收应付、客户对账单、应收结算单、应付结算单)的客户筛选统一加载全部 `ACTIVE` 客户并使用可筛选下拉框;用户可见选项只显示客户名称 `tenantName`,以 `customerId` 作为接口筛选值。不得恢复自由输入客户关键词,也不得把客户编码、联系人或手机号拼入下拉标签。业务单号、费用项目等非客户关键词仍使用各自独立筛选字段。 +- Finance 六个正式列表页(客户账户、客户应收应付、应收款统计表、客户对账单、应收结算单、应付结算单)的客户筛选统一加载全部 `ACTIVE` 客户并使用可筛选下拉框;用户可见选项只显示客户名称 `tenantName`,以 `customerId` 作为接口筛选值。不得恢复自由输入客户关键词,也不得把客户编码、联系人或手机号拼入下拉标签。应收款统计表必须按 `yyyy-MM` 统计月份查询,可按当前页打印,并通过 File 下载中心异步导出;业务单号、费用项目等非客户关键词仍使用各自独立筛选字段。 ## UI 与交互 diff --git a/src/core/navigation/adminNavigation.test.ts b/src/core/navigation/adminNavigation.test.ts index 7b21bc1f..640ef4c5 100644 --- a/src/core/navigation/adminNavigation.test.ts +++ b/src/core/navigation/adminNavigation.test.ts @@ -103,6 +103,7 @@ describe('adminNavigation', () => { expect(paths).toEqual(expect.arrayContaining([ '/finance/customer-accounts', '/finance/customer-arap', + '/finance/receivable-statistics', '/finance/customer-statements', '/finance/settlement-receivables', '/finance/settlement-payables', @@ -116,10 +117,11 @@ describe('adminNavigation', () => { expect(leaves.every((item) => Boolean(item.icon))).toBe(true) }) - it('shows the five formal finance pages with their real backend permissions', () => { + it('shows the five formal finance pages plus receivable statistics with real backend permissions', () => { const filtered = filterAdminNavigation(adminNavigation, new Set([ 'platform:finance:customer-account:list', 'platform:finance:customer-arap:list', + 'platform:finance:receivable-statistics:list', 'platform:finance:customer-statement:list', 'platform:finance:settlement-ar:list', 'platform:finance:settlement-ap:list', @@ -128,6 +130,7 @@ describe('adminNavigation', () => { expect(getNavigationLeaves(filtered).map((item) => item.path).filter((path) => path.startsWith('/finance/'))).toEqual([ '/finance/customer-accounts', '/finance/customer-arap', + '/finance/receivable-statistics', '/finance/customer-statements', '/finance/settlement-receivables', '/finance/settlement-payables', diff --git a/src/modules/finance/pages/FinancePresentation.test.ts b/src/modules/finance/pages/FinancePresentation.test.ts index 509f7682..94b1a895 100644 --- a/src/modules/finance/pages/FinancePresentation.test.ts +++ b/src/modules/finance/pages/FinancePresentation.test.ts @@ -19,6 +19,8 @@ describe('finance presentation governance', () => { it('uses prototype-defined standalone settlement details and modal partial payments', () => { expect(financeRoutes).toContain("finance/settlement-receivables/:settlementId") expect(financeRoutes).toContain("finance/settlement-payables/:settlementId") + expect(financeRoutes).toContain("finance/receivable-statistics") + expect(financeRoutes).toContain("platform:finance:receivable-statistics:list") expect(financeRoutes).toContain('showPageHeading: false') expect(settlement).toContain('class="settlement-detail-page surface-panel"') expect(settlement).toContain('返回列表')