优化
This commit is contained in:
@@ -16,11 +16,11 @@ Finance 已实现内部事件 Controller、令牌鉴权、Inbox 同事件哈希
|
||||
|
||||
| 事件名 | 生产时机 | Finance 处理 | 备注 |
|
||||
|---|---|---|---|
|
||||
| `FIRSTLEG_FEE_PUBLISHED` | 入库或柜子费用审核通过、参与结算并发布;由 `aggregateType/payload` 区分来源 | 写入不可变来源版本 | 已实现并验证 |
|
||||
| `FIRSTLEG_FEE_PUBLISHED` | 入库或柜子费用审核通过后自动发布;由 `aggregateType/payload` 区分来源 | 写入不可变来源版本 | 已实现并验证 |
|
||||
| `FIRSTLEG_FEE_ADJUSTED` | 入库或柜子费用调整产生新版本 | 追加新版本并将旧 `AVAILABLE` 标为 `SUPERSEDED` | 已实现并验证 |
|
||||
| `FIRSTLEG_FEE_VOIDED` | 入库或柜子费用作废 | 将同版本来源标为 `VOIDED`,不物理删除 | 已实现并验证 |
|
||||
|
||||
事件不是“已生成应收”通知;Finance 仍按产品确认的入池条件(例如 `settlementIncluded`、审核状态和作废状态)决定是否进入可出账池。
|
||||
事件不是“已生成应收”通知;Finance 按审核、发布、来源状态、币种和正金额条件决定是否进入可出账池,不保存人工“是否结算”开关。
|
||||
|
||||
## 3. 统一事件信封
|
||||
|
||||
@@ -53,9 +53,9 @@ tenantId, sourceType, feeId, feeVersion,
|
||||
inboundId, inboundCode, orderId, containerId, containerBookingId, containerNo,
|
||||
customerId, customerName, feeItemId, feeItemCode, feeItemName,
|
||||
direction, businessDate, currency, totalAmount,
|
||||
reviewStatus, publicationStatus, settlementIncluded, publishedAt,
|
||||
reviewStatus, publicationStatus, publishedAt,
|
||||
chargeableQuantity, chargeUnit, actualGrossWeightKg, actualVolumeCbm,
|
||||
sourceHash, snapshotVersion
|
||||
supplierId, supplierName, supplierCategory, sourceHash, snapshotVersion
|
||||
```
|
||||
|
||||
Finance 将完整 DTO 和 `sourceHash` 存入自有来源池。非 `FIRSTLEG_FEE_VOIDED` 事件只接受 `publicationStatus=PUBLISHED`;未发布返回 `FIN-EVT-015`。作废事件允许读取对应作废版本,但只能把既有来源标为 `VOIDED`,不得创建新来源。
|
||||
@@ -117,6 +117,6 @@ Firstleg Outbox 发布采用至少一次投递:指数退避(建议 10s、30s
|
||||
|
||||
技术已确认:独立服务/数据库、DTO/事件通信、Outbox 至少一次、Finance Inbox 幂等、不可变来源快照、无跨库 Join、服务令牌、错误隔离和审计要求。
|
||||
|
||||
产品口径已冻结:只有 `APPROVED + PUBLISHED + settlementIncluded=true + ACTIVE + CNY` 来源可入池;一期按客户/供应商形成五页单据,出账后冻结,调整/作废重开保留版本和原因;不做汇率、月结、钱包抵扣、费用分析和利润表。事件消费者不得从历史原型推断这些已排除能力。剩余问题是来源模型、接口、事件和消费者实现,不是产品冲突。
|
||||
产品口径已冻结:只有 `APPROVED + PUBLISHED + AVAILABLE + CNY + amount>0` 来源可入池;审核通过后自动成为结算候选。PAYABLE 的 supplierId 必须是 Warehouse `ACTIVE` 供应商,supplierCategory 为空时允许任意启用供应商,非空时严格匹配且 Finance 不从费用名称猜测类别。出账后冻结,调整/作废重开保留版本和原因;不做汇率、月结、钱包抵扣、费用分析和利润表。
|
||||
|
||||
主要剩余风险:测试环境尚未完成 Firstleg Relay → Finance Inbox → `fin_fee_source` 的真实 HTTP 冒烟。产品已确认无历史财务数据,不需要历史事件回放方案。
|
||||
|
||||
@@ -5,7 +5,7 @@ info:
|
||||
description: >-
|
||||
一期领导验收 5 页目标契约:客户账户、客户应收应付、客户对账单、结算单应收、
|
||||
结算单应付。只支持 CNY。费用分析、利润表、钱包、预收和充值不属于本契约。
|
||||
本文件只冻结一期目标契约,不记录开发中间态或测试进度。11 个 P0 operation 的实现与
|
||||
本文件冻结一期目标契约及后续确认的费用编辑审核、客户确认和应收统计扩展。实现与
|
||||
Admin 接入证据单独维护在财务一期P0实现证据矩阵.md,不得因代码文件出现反复修改本契约。
|
||||
servers:
|
||||
- url: /api
|
||||
@@ -25,12 +25,11 @@ x-product-scope:
|
||||
- FOREIGN_CURRENCY
|
||||
- EXCHANGE_RATE
|
||||
x-source-gate:
|
||||
eligible: APPROVED + PUBLISHED + settlementIncluded=true + ACTIVE + CNY
|
||||
currentStatus: Finance 已显式校验非作废事件 PUBLISHED、APPROVED、参与结算、CNY、amount>0、客户/版本/方向/来源归属;Inbox 幂等及 fin_fee_source 写入/替代/作废均已验证。
|
||||
eligible: APPROVED + PUBLISHED + AVAILABLE + CNY + amount>0
|
||||
currentStatus: 审核通过后自动发布并进入结算候选;Finance 不再维护人工“是否结算”开关,并继续校验客户、版本、方向和来源归属。
|
||||
x-phase1-p0-contract:
|
||||
status: FROZEN
|
||||
operationCount: 11
|
||||
rule: 11 个 operation 均为一期 P0 目标契约;实现状态不得写入本文件。
|
||||
rule: 所有已列 operation 均为当前目标契约;实现状态不得写入本文件。
|
||||
contract: ../财务一期P0操作契约与验收用例.md
|
||||
evidenceMatrix: ../财务一期P0实现证据矩阵.md
|
||||
x-idempotency-contract:
|
||||
@@ -56,7 +55,7 @@ paths:
|
||||
summary: 消费 Firstleg 不可变费用来源事件
|
||||
description: >-
|
||||
使用内部服务令牌鉴权;按 eventId 和完整事件请求哈希幂等消费,回查 Firstleg
|
||||
入库或柜子费用快照,校验客户、版本、审核、参与结算、CNY、方向和来源类型后,
|
||||
入库或柜子费用快照,校验客户、版本、审核、发布、CNY、方向和来源类型后,
|
||||
写入 fin_inbox_event 与 fin_fee_source。调整新增版本并替代旧 AVAILABLE 版本,作废只改状态不删除历史。
|
||||
x-authentication: X-Internal-Service-Token
|
||||
x-error-codes:
|
||||
@@ -118,6 +117,7 @@ paths:
|
||||
- FINANCE_RECEIVABLE_SETTLEMENT_DETAIL
|
||||
- FINANCE_PAYABLE_SETTLEMENT_LIST
|
||||
- FINANCE_PAYABLE_SETTLEMENT_DETAIL
|
||||
- FINANCE_RECEIVABLE_STATISTICS
|
||||
requestBody:
|
||||
required: true
|
||||
content:
|
||||
@@ -241,9 +241,6 @@ paths:
|
||||
- name: reviewStatus
|
||||
in: query
|
||||
schema: {$ref: '#/components/schemas/ReviewStatus'}
|
||||
- name: settlementIncluded
|
||||
in: query
|
||||
schema: {type: boolean}
|
||||
- name: statementGenerated
|
||||
in: query
|
||||
schema: {type: boolean}
|
||||
@@ -295,6 +292,19 @@ paths:
|
||||
'200': {$ref: '#/components/responses/FeeSourceDetailResponse'}
|
||||
'403': {$ref: '#/components/responses/BusinessError'}
|
||||
'404': {$ref: '#/components/responses/BusinessError'}
|
||||
put:
|
||||
operationId: editFinanceFeeSource
|
||||
summary: 编辑草稿或驳回的费用来源
|
||||
x-permission: platform:finance:fee-source:edit
|
||||
parameters:
|
||||
- $ref: '#/components/parameters/FeeSourceId'
|
||||
- $ref: '#/components/parameters/IdempotencyKey'
|
||||
requestBody:
|
||||
required: true
|
||||
content: {application/json: {schema: {$ref: '#/components/schemas/FeeSourceEditRequest'}}}
|
||||
responses:
|
||||
'200': {$ref: '#/components/responses/FeeSourceDetailResponse'}
|
||||
'409': {$ref: '#/components/responses/BusinessError'}
|
||||
/platform/finance/v1/fee-sources/{feeSourceId}/review:
|
||||
post:
|
||||
operationId: reviewFinanceFeeSource
|
||||
@@ -323,20 +333,11 @@ paths:
|
||||
'403': {$ref: '#/components/responses/BusinessError'}
|
||||
'404': {$ref: '#/components/responses/BusinessError'}
|
||||
'409': {$ref: '#/components/responses/BusinessError'}
|
||||
/platform/finance/v1/fee-sources/{feeSourceId}/settlement-inclusion:
|
||||
put:
|
||||
operationId: updateFeeSourceSettlementInclusion
|
||||
summary: 设置参与结算或禁止结算
|
||||
x-contract-status: FROZEN
|
||||
x-delivery-priority: PHASE1_P0
|
||||
x-request-dto: SettlementInclusionRequest
|
||||
x-response-dto: FeeSourceDetailEnvelope
|
||||
x-idempotency: FULL_REQUEST_HASH_SAME_REPLAY_DIFFERENT_CONFLICT
|
||||
x-customer-isolation: 只按 feeSourceId 解析其真实客户;跨客户业务引用按 FIN_404 隐藏。
|
||||
x-state-machine: APPROVED + PUBLISHED + AVAILABLE + CNY 可切换;LOCKED/BILLED/VOIDED/SUPERSEDED 禁止修改
|
||||
x-error-codes: [FIN_400, FIN_404, FIN_409, FIN_001]
|
||||
x-acceptance-cases: [AC-08, AC-09, AC-29]
|
||||
x-permission: platform:finance:fee-source:settlement
|
||||
/platform/finance/v1/fee-sources/{feeSourceId}/submit:
|
||||
post:
|
||||
operationId: submitFinanceFeeSource
|
||||
summary: 提交费用来源审核
|
||||
x-permission: platform:finance:fee-source:edit
|
||||
parameters:
|
||||
- $ref: '#/components/parameters/FeeSourceId'
|
||||
- $ref: '#/components/parameters/IdempotencyKey'
|
||||
@@ -344,12 +345,37 @@ paths:
|
||||
required: true
|
||||
content:
|
||||
application/json:
|
||||
schema: {$ref: '#/components/schemas/SettlementInclusionRequest'}
|
||||
schema: {$ref: '#/components/schemas/FeeSourceActionRequest'}
|
||||
responses:
|
||||
'200': {$ref: '#/components/responses/FeeSourceDetailResponse'}
|
||||
'409': {$ref: '#/components/responses/BusinessError'}
|
||||
/platform/finance/v1/fee-sources/{feeSourceId}/adjust:
|
||||
post:
|
||||
operationId: adjustFinanceFeeSource
|
||||
summary: 将已审核费用调整为新草稿版本
|
||||
x-permission: platform:finance:fee-source:edit
|
||||
parameters:
|
||||
- $ref: '#/components/parameters/FeeSourceId'
|
||||
- $ref: '#/components/parameters/IdempotencyKey'
|
||||
requestBody:
|
||||
required: true
|
||||
content: {application/json: {schema: {$ref: '#/components/schemas/FeeSourceEditRequest'}}}
|
||||
responses:
|
||||
'200': {$ref: '#/components/responses/FeeSourceDetailResponse'}
|
||||
'409': {$ref: '#/components/responses/BusinessError'}
|
||||
/platform/finance/v1/fee-sources/{feeSourceId}/void:
|
||||
post:
|
||||
operationId: voidFinanceFeeSource
|
||||
summary: 作废费用来源
|
||||
x-permission: platform:finance:fee-source:edit
|
||||
parameters:
|
||||
- $ref: '#/components/parameters/FeeSourceId'
|
||||
- $ref: '#/components/parameters/IdempotencyKey'
|
||||
requestBody:
|
||||
required: true
|
||||
content: {application/json: {schema: {$ref: '#/components/schemas/FeeSourceActionRequest'}}}
|
||||
responses:
|
||||
'200': {$ref: '#/components/responses/FeeSourceDetailResponse'}
|
||||
'400': {$ref: '#/components/responses/BusinessError'}
|
||||
'403': {$ref: '#/components/responses/BusinessError'}
|
||||
'404': {$ref: '#/components/responses/BusinessError'}
|
||||
'409': {$ref: '#/components/responses/BusinessError'}
|
||||
/platform/finance/v1/statements:
|
||||
get:
|
||||
@@ -486,13 +512,13 @@ paths:
|
||||
'200': {$ref: '#/components/responses/PayableSettlementListReadResponse'}
|
||||
post:
|
||||
operationId: createPayableSettlement
|
||||
summary: 从审核通过且参与结算的应付来源生成应付结算单
|
||||
summary: 从审核通过且已发布的应付来源生成应付结算单
|
||||
x-contract-status: FROZEN
|
||||
x-delivery-priority: PHASE1_P0
|
||||
x-request-dto: CreatePayableSettlementRequest
|
||||
x-response-dto: SettlementDetailEnvelope
|
||||
x-idempotency: FULL_REQUEST_HASH_SAME_REPLAY_DIFFERENT_CONFLICT
|
||||
x-customer-isolation: 所有 PAYABLE 来源必须同 customerId、同 supplierId 且映射到同一供应商类别;supplierId 必须来自 Warehouse ACTIVE 供应商主数据并与费用类别匹配,跨客户来源按 FIN_404。
|
||||
x-customer-isolation: 所有 PAYABLE 来源必须同 customerId、同 supplierId;supplierId 必须来自 Warehouse ACTIVE 供应商主数据。费用项目 supplierCategory 非空时必须匹配,空时允许任意 ACTIVE 供应商;跨客户来源按 FIN_404。
|
||||
x-state-machine: 合格未占用 PAYABLE 来源 -> ISSUED PAYABLE settlement
|
||||
x-error-codes: [FIN_400, FIN_404, FIN_409, FIN_503, FIN_001]
|
||||
x-acceptance-cases: [AC-20, AC-21, AC-29]
|
||||
@@ -548,6 +574,45 @@ paths:
|
||||
x-permission: merchant:finance:statement:view
|
||||
responses:
|
||||
'200': {$ref: '#/components/responses/ClientReceiptListReadResponse'}
|
||||
/client/finance/v1/statements/{statementId}/confirm:
|
||||
post:
|
||||
operationId: confirmClientReconciliationStatement
|
||||
summary: 当前登录客户确认本人已出账对账单
|
||||
description: 不接收 customerId;客户范围和确认人均取自登录态。重复请求按 Idempotency-Key 幂等处理。
|
||||
x-permission: merchant:finance:statement:confirm
|
||||
parameters:
|
||||
- $ref: '#/components/parameters/StatementId'
|
||||
- $ref: '#/components/parameters/IdempotencyKey'
|
||||
requestBody:
|
||||
required: true
|
||||
content: {application/json: {schema: {$ref: '#/components/schemas/CustomerConfirmationRequest'}}}
|
||||
responses:
|
||||
'200': {description: 已确认或幂等返回原确认结果}
|
||||
'404': {$ref: '#/components/responses/BusinessError'}
|
||||
'409': {$ref: '#/components/responses/BusinessError'}
|
||||
/platform/finance/v1/receivable-statistics:
|
||||
get:
|
||||
operationId: getReceivableStatistics
|
||||
summary: 按结算单生成月份和客户统计 CNY 应收款
|
||||
description: 只统计 direction=RECEIVABLE、status!=VOIDED 的 fin_settlement;按客户汇总应收、已收和余额未收。
|
||||
x-permission: platform:finance:receivable-statistics:list
|
||||
parameters:
|
||||
- name: month
|
||||
in: query
|
||||
required: true
|
||||
schema: {type: string, pattern: '^\d{4}-\d{2}$', example: '2026-08'}
|
||||
- name: customerId
|
||||
in: query
|
||||
schema: {$ref: '#/components/schemas/Id'}
|
||||
- name: page
|
||||
in: query
|
||||
schema: {type: integer, minimum: 1, default: 1}
|
||||
- name: pageSize
|
||||
in: query
|
||||
schema: {type: integer, minimum: 1, maximum: 200, default: 20}
|
||||
responses:
|
||||
'200': {description: CNY 应收款统计结果}
|
||||
'400': {$ref: '#/components/responses/BusinessError'}
|
||||
/platform/finance/v1/settlements/{settlementId}:
|
||||
get:
|
||||
operationId: getSettlement
|
||||
@@ -683,7 +748,7 @@ components:
|
||||
type: object
|
||||
description: >-
|
||||
ACCOUNT_LIST: customerId?, status?;ACCOUNT_LEDGER: customerId, businessType?, startDate?, endDate?;
|
||||
FEE_SOURCE_LIST: customerId?, direction?, status?, reviewStatus?, settlementIncluded?, statementGenerated?,
|
||||
FEE_SOURCE_LIST: customerId?, direction?, status?, reviewStatus?, statementGenerated?,
|
||||
businessDateFrom?, businessDateTo?, keyword?;RECONCILIATION_STATEMENT_LIST: customerId?, status?, billNo?,
|
||||
containerNo?, periodStartFrom?, periodStartTo?, periodEndFrom?, periodEndTo?, settled?, lastPaymentFrom?,
|
||||
lastPaymentTo?, createdFrom?, createdTo?;AR_LIST: customerId?, status?, settlementNo?;AP_LIST 另含
|
||||
@@ -785,7 +850,7 @@ components:
|
||||
enum: [UNPAID, PARTIALLY_PAID, PAID, OVERDUE]
|
||||
LedgerBusinessType:
|
||||
type: string
|
||||
enum: [FEE_INCLUDED, FEE_EXCLUDED, RECONCILIATION_CREATED, SETTLEMENT_ISSUED, RECEIPT, PAYMENT, ADJUSTMENT, VOID]
|
||||
enum: [RECONCILIATION_CREATED, SETTLEMENT_ISSUED, RECEIPT, PAYMENT, ADJUSTMENT, VOID]
|
||||
TraceMeta:
|
||||
type: object
|
||||
required: [requestId, traceId, timestamp]
|
||||
@@ -877,7 +942,7 @@ components:
|
||||
remark: {type: string}
|
||||
FeeSource:
|
||||
type: object
|
||||
required: [feeSourceId, sourceSystem, sourceType, sourceFeeId, sourceVersion, direction, customerId, businessDate, feeItemName, amount, currency, reviewStatus, settlementIncluded, sourceStatus, statementGenerated]
|
||||
required: [feeSourceId, sourceSystem, sourceType, sourceFeeId, sourceVersion, direction, customerId, businessDate, feeItemName, amount, currency, reviewStatus, sourceStatus, statementGenerated]
|
||||
properties:
|
||||
feeSourceId: {$ref: '#/components/schemas/Id'}
|
||||
sourceSystem: {type: string, minLength: 1}
|
||||
@@ -902,7 +967,6 @@ components:
|
||||
amount: {$ref: '#/components/schemas/Money'}
|
||||
currency: {type: string, enum: [CNY]}
|
||||
reviewStatus: {$ref: '#/components/schemas/ReviewStatus'}
|
||||
settlementIncluded: {type: boolean}
|
||||
sourceStatus: {type: string, enum: [AVAILABLE, LOCKED, BILLED, VOIDED, SUPERSEDED]}
|
||||
statementGenerated: {type: boolean}
|
||||
FeeSourceDetail:
|
||||
@@ -911,7 +975,6 @@ components:
|
||||
- type: object
|
||||
properties:
|
||||
reviewReason: {type: string}
|
||||
settlementReason: {type: string}
|
||||
sourceHash: {type: string}
|
||||
operationLogs:
|
||||
type: array
|
||||
@@ -949,16 +1012,27 @@ components:
|
||||
action: {type: string, enum: [APPROVE, REJECT]}
|
||||
reason: {type: string, maxLength: 500}
|
||||
expectedVersion: {type: integer, minimum: 0}
|
||||
SettlementInclusionRequest:
|
||||
FeeSourceEditRequest:
|
||||
type: object
|
||||
required: [included, reason, expectedVersion]
|
||||
required: [amount, reason, expectedVersion]
|
||||
properties:
|
||||
included: {type: boolean}
|
||||
amount: {$ref: '#/components/schemas/Money'}
|
||||
reason: {type: string, minLength: 1, maxLength: 500}
|
||||
expectedVersion: {type: integer, minimum: 0}
|
||||
FeeSourceActionRequest:
|
||||
type: object
|
||||
required: [reason, expectedVersion]
|
||||
properties:
|
||||
reason: {type: string, minLength: 1, maxLength: 500}
|
||||
expectedVersion: {type: integer, minimum: 0}
|
||||
CustomerConfirmationRequest:
|
||||
type: object
|
||||
required: [expectedVersion]
|
||||
properties:
|
||||
expectedVersion: {type: integer, minimum: 0}
|
||||
ReconciliationSummary:
|
||||
type: object
|
||||
required: [statementId, statementNo, customerId, customerName, periodStart, periodEnd, creditDays, currency, lineCount, sourceCount, sourceAmount, adjustmentAmount, totalReceivable, receivedAmount, outstandingAmount, settled, status, version, createdBy, createdAt, updatedBy, updatedAt]
|
||||
required: [statementId, statementNo, customerId, customerName, periodStart, periodEnd, creditDays, currency, lineCount, sourceCount, sourceAmount, adjustmentAmount, totalReceivable, receivedAmount, outstandingAmount, settled, status, version, customerConfirmationStatus, createdBy, createdAt, updatedBy, updatedAt]
|
||||
properties:
|
||||
statementId: {$ref: '#/components/schemas/Id'}
|
||||
statementNo: {type: string, pattern: '^REC-\d{6}-\d{4}$', example: REC-260818-0001}
|
||||
@@ -982,6 +1056,10 @@ components:
|
||||
settled: {type: boolean}
|
||||
status: {$ref: '#/components/schemas/ReconciliationStatus'}
|
||||
version: {type: integer, minimum: 0}
|
||||
customerConfirmationStatus: {type: string, enum: [NOT_REQUIRED, PENDING_CONFIRMATION, CONFIRMED]}
|
||||
customerConfirmedBy: {$ref: '#/components/schemas/Id'}
|
||||
customerConfirmedByName: {type: string}
|
||||
customerConfirmedAt: {type: string, format: date-time}
|
||||
createdBy: {$ref: '#/components/schemas/Id'}
|
||||
createdByName: {type: string, description: 创建时操作人名称快照;历史数据可能为空}
|
||||
createdAt: {type: string, format: date-time}
|
||||
|
||||
+13
-11
@@ -1,7 +1,7 @@
|
||||
# 财务一期 P0 操作契约与验收用例
|
||||
|
||||
> 日期:2026-08-11
|
||||
> 适用范围:一期 5 页闭环中尚未实现的 11 个 operation
|
||||
> 适用范围:一期财务闭环及后续确认的费用编辑审核、客户确认操作
|
||||
> 状态口径:以下 11 项全部是一期 P0,目标契约已冻结;实现和 Admin 接入证据只维护在 `财务一期P0实现证据矩阵.md`
|
||||
> 机器契约:`openapi/finance-phase1-five-pages-v1.yaml`
|
||||
|
||||
@@ -16,19 +16,19 @@
|
||||
- 稳定错误码固定为:`FIN_400` 参数/CNY/金额错误,`FIN_404` 不存在或跨客户隐藏,`FIN_409` 状态/版本/重复占用/幂等冲突,`FIN_503` File 或内部依赖不可用,`FIN_001` 未分类服务端错误。认证和权限拒绝使用 HTTP `401/403`。
|
||||
- 所有成功和业务错误响应固定包含 `requestId`、`traceId`、`timestamp`;成功 body 使用 `code="200"`,不得返回 Entity、Map 或临时字段。
|
||||
|
||||
## 2. 11 个 P0 operation 冻结矩阵
|
||||
## 2. P0 operation 冻结矩阵
|
||||
|
||||
| P0 | operationId | 请求 DTO | 响应 DTO | 权限 | 状态/隔离与核心验收 |
|
||||
|---|---|---|---|---|---|
|
||||
| P0-01 | `listDerivedCustomerAccounts` | `AccountListQuery`(page/pageSize/keyword/status) | `AccountPageEnvelope<AccountSummary>` | `platform:finance:account:view` | 聚合未收、待出账、本期已收、应付;停用客户仍保留历史金额;无钱包字段。验收 AC-01、AC-02 |
|
||||
| P0-02 | `listDerivedCustomerAccountLedger` | `AccountLedgerQuery`(customerId path、业务类型、日期、分页) | `LedgerPageEnvelope<LedgerEntry>` | `platform:finance:account:view` | 只返回指定客户来源/单据/收付款派生流水;日期闭区间;跨客户对象不可混入。验收 AC-03、AC-04 |
|
||||
| P0-03 | `getFinanceFeeSource` | `FeeSourceIdPath` | `FeeSourceDetailEnvelope<FeeSourceDetail>` | `platform:finance:fee-source:view` | 返回业务关联、版本、审核、参与结算、占用和操作日志;不接受前端金额覆盖。验收 AC-05 |
|
||||
| P0-04 | `reviewFinanceFeeSource` | `ReviewRequest` | `FeeSourceDetailEnvelope<FeeSourceDetail>` | `platform:finance:fee-source:review` | `PENDING -> APPROVED/REJECTED`;非 PENDING、旧版本、已占用均拒绝。验收 AC-06、AC-07 |
|
||||
| P0-05 | `updateFeeSourceSettlementInclusion` | `SettlementInclusionRequest` | `FeeSourceDetailEnvelope<FeeSourceDetail>` | `platform:finance:fee-source:settlement` | 仅 `APPROVED + PUBLISHED + AVAILABLE + CNY` 可纳入;LOCKED/BILLED/VOIDED/SUPERSEDED 不可改。验收 AC-08、AC-09 |
|
||||
| P0-03 | `getFinanceFeeSource` | `FeeSourceIdPath` | `FeeSourceDetailEnvelope<FeeSourceDetail>` | `platform:finance:customer-arap:list` | 返回业务关联、版本、审核、占用和操作日志;不接受前端覆盖客户或来源标识。验收 AC-05 |
|
||||
| P0-04 | `reviewFinanceFeeSource` | `ReviewRequest` | `FeeSourceDetailEnvelope<FeeSourceDetail>` | `platform:finance:fee-source:review` | `PENDING -> APPROVED/REJECTED`;非 PENDING、旧版本、已占用均拒绝。审核通过自动发布并成为结算候选。验收 AC-06、AC-07 |
|
||||
| P0-05 | `editFinanceFeeSource` / `submitFinanceFeeSource` / `adjustFinanceFeeSource` / `voidFinanceFeeSource` | `FeeSourceEditRequest` / `FeeSourceActionRequest` | `FeeSourceDetailEnvelope<FeeSourceDetail>` | `platform:finance:fee-source:edit` | `DRAFT/REJECTED` 可编辑并提交;`APPROVED` 调整回新草稿;作废保留审计。没有“是否结算”开关。验收 AC-08、AC-09 |
|
||||
| P0-06 | `createReconciliationStatement` | `CreateReconciliationRequest` | `ReconciliationDetailEnvelope<ReconciliationDetail>` | `platform:finance:reconciliation:create` | 按截止日或勾选来源生成 DRAFT;来源须同客户、合格且未被有效单据占用,金额由服务端快照读取。验收 AC-10 至 AC-12 |
|
||||
| P0-07 | `actionReconciliationStatement` | `ReconciliationActionRequest` | `ReconciliationDetailEnvelope<ReconciliationDetail>` | 按 action 使用 review/issue/adjust/void 权限 | 提交、审核、出账、调整、作废、重开均走 revision;ISSUED 冻结来源,调整后总额不得低于已收。验收 AC-13 至 AC-17 |
|
||||
| P0-08 | `createReceivableSettlement` | `CreateReceivableSettlementRequest` | `SettlementDetailEnvelope<SettlementDetail>` | `platform:finance:settlement-ar:create` | 只从同客户 ISSUED 对账单生成,一张有效对账单只能有一个有效应收结算单;直接进入 ISSUED。验收 AC-18、AC-19 |
|
||||
| P0-09 | `createPayableSettlement` | `CreatePayableSettlementRequest` | `SettlementDetailEnvelope<SettlementDetail>` | `platform:finance:settlement-ap:create` | 同客户、同供应商的 APPROVED/INCLUDED/AVAILABLE/CNY PAYABLE 来源生成;直接进入 ISSUED。验收 AC-20、AC-21 |
|
||||
| P0-09 | `createPayableSettlement` | `CreatePayableSettlementRequest` | `SettlementDetailEnvelope<SettlementDetail>` | `platform:finance:settlement-ap:create` | 同客户、同供应商的 APPROVED/PUBLISHED/AVAILABLE/CNY PAYABLE 来源生成;供应商必须 ACTIVE,非空 supplierCategory 必须匹配。直接进入 ISSUED。验收 AC-20、AC-21 |
|
||||
| P0-10 | `getSettlement` | `SettlementIdPath` | `SettlementDetailEnvelope<SettlementDetail>` | AR/AP view 二选一并与单据方向匹配 | 返回结算单、来源快照、revision 和收付款记录;没有对应方向权限时 HTTP 403。验收 AC-22、AC-23 |
|
||||
| P0-11 | `createSettlementPayment` | `CreateSettlementPaymentRequest` | `SettlementDetailEnvelope<SettlementDetail>` | `platform:finance:payment:create` | 只允许 PAYABLE 的 ISSUED/PARTIALLY_PAID;金额不得超过余额,凭证 File fail-closed;更新为 PARTIALLY_PAID/PAID。验收 AC-24 至 AC-26 |
|
||||
|
||||
@@ -43,12 +43,12 @@
|
||||
### 3.1 费用来源
|
||||
|
||||
```text
|
||||
PENDING --APPROVE--> APPROVED
|
||||
DRAFT/REJECTED --EDIT/SUBMIT--> PENDING
|
||||
PENDING --APPROVE--> APPROVED + PUBLISHED(自动成为结算候选)
|
||||
PENDING --REJECT---> REJECTED
|
||||
|
||||
APPROVED + PUBLISHED + AVAILABLE --INCLUDE/EXCLUDE--> settlementIncluded true/false
|
||||
APPROVED --ADJUST--> DRAFT(新版本)
|
||||
AVAILABLE --对账单占用--> LOCKED --对账单出账--> BILLED
|
||||
任意未出账有效版本 --上游作废--> VOIDED
|
||||
任意未出账有效版本 --VOID--> VOIDED
|
||||
AVAILABLE --上游调整新版本--> SUPERSEDED
|
||||
```
|
||||
|
||||
@@ -66,6 +66,8 @@ DRAFT/PENDING_REVIEW/APPROVED/ISSUED --VOID--> VOIDED(已收金额=0 且无有
|
||||
|
||||
`ADJUST` 必须提交至少一条调整行和原因;新总额不得小于已收金额。`VOID/REOPEN` 必须填写原因。ISSUED 后普通编辑接口不存在。
|
||||
|
||||
客户确认状态独立于上述主状态:`NOT_REQUIRED --ISSUE--> PENDING_CONFIRMATION --客户确认--> CONFIRMED`;调整后重置为 `PENDING_CONFIRMATION` 并保留历史确认审计。
|
||||
|
||||
### 3.3 应收/应付结算单和收付款
|
||||
|
||||
```text
|
||||
@@ -94,7 +96,7 @@ VOIDED --REOPEN--> ISSUED(新 revision)
|
||||
| AC-03/04 | 客户 A 流水不出现客户 B 单据;起止日期非法返回 `FIN_400` |
|
||||
| AC-05 | 详情返回来源版本、业务对象和操作日志;不存在返回 `FIN_404` |
|
||||
| AC-06/07 | PENDING 审核成功;重复审核、旧 expectedVersion 返回 `FIN_409` |
|
||||
| AC-08/09 | 合格来源可切换参与结算;已锁定/出账/作废/替代版本返回 `FIN_409` |
|
||||
| AC-08/09 | 草稿/驳回项可编辑提交,已审核项可调整,非法状态或旧版本返回 `FIN_409`;审核通过后自动进入结算候选 |
|
||||
| AC-10/11/12 | 两种生成模式成功;跨客户、非 CNY、重复占用或不合格来源分别返回 `FIN_404/FIN_400/FIN_409`,且不产生半成品 |
|
||||
| AC-13/14 | 合法提交、审核和出账按状态迁移;非法 action/state 或并发版本返回 `FIN_409` |
|
||||
| AC-15/16/17 | ISSUED 调整产生 revision;低于已收拒绝;有收款或有效结算单时作废拒绝;重开保留历史 |
|
||||
|
||||
+13
-16
@@ -39,7 +39,7 @@
|
||||
| 指标 | 公式 |
|
||||
|---|---|
|
||||
| 未收余额 | 生效应收结算单应收金额合计 - 已收金额合计 |
|
||||
| 待出账金额 | `AVAILABLE + APPROVED + settlementIncluded=true` 且未进入有效对账单的应收费用来源金额合计 |
|
||||
| 待出账金额 | `AVAILABLE + APPROVED + PUBLISHED + CNY` 且未进入有效对账单的应收费用来源金额合计 |
|
||||
| 本期已收金额 | 查询期间内有效收款分配金额合计 |
|
||||
| 应付余额 | 生效应付结算单应付金额合计 - 已付金额合计 |
|
||||
|
||||
@@ -48,10 +48,10 @@
|
||||
| 页面 | 原型结构和筛选 | 一期字段 | 一期操作 | 状态与验收 |
|
||||
|---|---|---|---|---|
|
||||
| 客户账户 | 汇总卡、客户列表、账户详情、流水详情;客户名称/编号、账户状态、余额条件、流水类型和日期 | 客户基本信息、客户编号、联系人、电话、未收余额、待出账金额、本期已收金额、应付余额、账户状态、最后变动时间;流水号、时间、业务类型、关联单据、应收/应付变动、变动后未收余额、操作人、备注 | 详情、查询、重置、导出;**无充值、扣款或余额调整** | 客户主体正常/停用只影响访问和新业务;所有金额可由来源、单据和收付款逐笔追溯,禁止直接写余额 |
|
||||
| 客户应收应付 | 工具栏、组合查询、选中汇总、费用列表、费用详情、审核进度、关联业务、操作记录 | 客户、费用单号、是否已生成对账单、参与结算、审核状态、应收/应付、入仓码/柜次号、业务状态、费用类型、金额、业务发生日、来源类型、来源版本 | 详情、审核通过、审核拒绝、编辑未审核人工项、参与结算/禁止结算、按截止时间或勾选生成;已发布来源不可删除,只能作废/调整 | `PENDING -> APPROVED/REJECTED`;只有 `APPROVED + INCLUDED + AVAILABLE + CNY` 可生成;同一来源版本不能重复进入有效单据 |
|
||||
| 客户对账单 | 查询区、主表、账单明细、支付历史;审核状态、账单编号、客户、柜次、结算起止日、是否结清、创建日期、最后收款时间 | 对账单号、客户、期间、账期、CNY、总应收、已收、未收、最后收款时间、是否结清、备注、创建/更新人时间;明细保留入仓单/柜次、业务日、计费量、费用项、金额、来源版本 | 生成草稿、详情、导出、审核通过、审核拒绝、作废;不提供发票和汇率操作 | `DRAFT -> PENDING_REVIEW -> APPROVED/REJECTED/VOIDED`;审核通过后来源冻结,调整必须留 revision;支付历史只读展示有效收款 |
|
||||
| 客户应收应付 | 工具栏、组合查询、选中汇总、费用列表、费用详情、审核进度、关联业务、操作记录 | 客户、费用单号、是否已生成对账单、审核状态、应收/应付、入仓码/柜次号、业务状态、费用类型、金额、业务发生日、来源类型、来源版本 | 详情、编辑草稿/驳回项、提交审核、审核通过/拒绝、调整、作废、按截止时间或勾选生成;不提供“是否结算”开关 | `DRAFT/REJECTED -> PENDING -> APPROVED`;`APPROVED + PUBLISHED + AVAILABLE + CNY` 自动成为结算候选;同一来源版本不能重复进入有效单据 |
|
||||
| 客户对账单 | 查询区、主表、账单明细、支付历史;审核状态、账单编号、客户、柜次、结算起止日、是否结清、创建日期、最后收款时间 | 对账单号、客户、期间、账期、CNY、总应收、已收、未收、客户确认状态/确认人/确认时间、最后收款时间、是否结清、备注、创建/更新人时间 | 生成草稿、详情、导出、审核、出账、调整、作废;客户在 Client 确认本人已出账账单 | 主状态与客户确认状态独立;出账后 `PENDING_CONFIRMATION`,客户确认后 `CONFIRMED`,调整后重置待确认并保留历史审计 |
|
||||
| 结算单应收 | 汇总卡、筛选、列表、详情、费用明细、收款记录;收款状态、客户、结算单号 | 结算单号、客户、CNY、应收、已收、余额、关联对账单、业务期间、生成日、到期日、收款状态、制单人、状态 | 从已出账对账单生成、详情、部分收款、导出、作废/重开;不保留高级查询假入口 | 生成后直接 `ISSUED -> PARTIALLY_PAID -> PAID`;来源已在对账单阶段审核,结算单不重复增加假审批;未收款可作废,调整保留 revision |
|
||||
| 结算单应付 | 汇总卡、供应商筛选、列表、详情、费用明细、付款记录 | 结算单号、供应商、费用类型、CNY、应付、已付、余额、来源期间、生成日、到期日、付款状态、制单人、状态 | 从审核通过且参与结算的应付来源生成、详情、部分付款、导出、作废/重开;删除利润分析和利润审批按钮 | 生成后直接 `ISSUED -> PARTIALLY_PAID -> PAID`;不重复增加结算单审批;作废/重开保留 revision,付款为人工登记和凭证图片 |
|
||||
| 结算单应付 | 汇总卡、供应商筛选、列表、详情、费用明细、付款记录 | 结算单号、供应商、费用类型、CNY、应付、已付、余额、来源期间、生成日、到期日、付款状态、制单人、状态 | 从审核通过且自动发布的应付来源生成、详情、部分付款、导出、作废/重开;删除利润分析和利润审批按钮 | 生成后直接 `ISSUED -> PARTIALLY_PAID -> PAID`;不重复增加结算单审批;作废/重开保留 revision,付款为后台人工登记和凭证图片 |
|
||||
|
||||
表格“操作”列必须位于第一列。原型中未形成真实闭环的“新增、生成账单、高级查询、快捷导出”等按钮,只有在对应接口和权限完成后才显示。
|
||||
|
||||
@@ -60,7 +60,7 @@
|
||||
| 页面 | 当前仓库事实 | 一期目标 | 差异等级 |
|
||||
|---|---|---|---|
|
||||
| 客户账户 | 后端已新增 `/customer-accounts/{customerId}` 和固定读 DTO;无列表接口 | 派生财务往来汇总、详情和流水,无任何充值/余额写入口 | IMPLEMENTED(单客户查询);列表/筛选仍缺,Finance DTO 测试通过 |
|
||||
| 客户应收应付 | `/fee-pool` 固定 DTO、Firstleg 事件/快照和 `fin_fee_source` 写入均已实现并验证 | 真实入库/柜子费用来源池,支持审核、参与结算、详情和生成对账单 | 查询与来源入池已实现;详情、审核、参与结算均为一期 P0 |
|
||||
| 客户应收应付 | `/fee-sources` 固定 DTO、Firstleg 事件/快照和 `fin_fee_source` 写入均已实现 | 真实入库/柜子费用来源池,支持编辑、提交、审核、调整、作废、详情和生成对账单 | 审核通过自动成为结算候选,不提供人工结算开关 |
|
||||
| 客户对账单 | 后端已新增 `/statements` 和 `/bills/{billId}` 固定读 DTO 路径;独立生成/审核模型仍缺失 | 按截止时间或勾选合格来源生成,支持审核、明细、支付历史和 revision | IN_PROGRESS/P0 |
|
||||
| 结算单应收 | 后端已新增 `/receivable-settlements` 固定读 DTO 路径;`fin_bill + fin_receipt` 已有人工状态能力 | 关联审核通过的客户对账单,按原型结构形成应收结算页 | IN_PROGRESS/P0 适配 |
|
||||
| 结算单应付 | 后端已新增 `/payable-settlements` 固定读 DTO 路径并读取人工成本;付款单和完整供应商来源池仍缺失 | 从真实 PAYABLE 来源生成,审核后人工登记付款与凭证 | IN_PROGRESS/P0 |
|
||||
@@ -73,8 +73,7 @@ Finance 来源写入不再是阻断:内部事件入口、Inbox 幂等、Firstl
|
||||
flowchart LR
|
||||
I["入库单费用项"] --> R["审核"]
|
||||
C["柜子费用项"] --> R
|
||||
R --> S["参与结算/禁止结算"]
|
||||
S --> P["发布不可变来源版本"]
|
||||
R --> P["审核通过后自动发布不可变来源版本"]
|
||||
P --> X["Finance Inbox"]
|
||||
X --> F["fin_fee_source"]
|
||||
F --> A["客户应收应付费用池"]
|
||||
@@ -91,17 +90,17 @@ flowchart LR
|
||||
|
||||
现有 `fl_inbound_fee_detail` 已具备客户、入库单、方向、业务日、费用项快照、计费量、单价、金额、审核、发布和 `settlement_included` 字段;已有列表、新增、编辑、删除、审核通过和驳回接口。
|
||||
|
||||
当前 Firstleg 来源发布、调整/作废事件、Relay、Finance 消费者和来源快照写入已经实现并通过测试。Finance 五页内的费用来源详情、二次审核和参与结算操作仍按一期 P0 补齐;这些操作不得绕过已发布不可变来源版本或覆盖上游业务事实。
|
||||
当前 Firstleg 来源发布、调整/作废事件、Relay、Finance 消费者和来源快照写入已经实现。费用来源采用编辑、提交、审核、调整、作废闭环;审核通过后自动发布,不再提供参与结算开关。
|
||||
|
||||
### 4.2 柜子费用项
|
||||
|
||||
当前柜子费用来源表/实体、Controller、审核/参与结算/作废服务、发布事件、Relay 和内部快照已经实现,相关定向测试 17/17 通过。Firstleg 的真实柜次体积快照同时服务 Finance 整柜成本分摊,但仍不能由 Admin 手工提交的订单归属或体积替代。
|
||||
当前柜子费用来源表/实体、Controller、审核/调整/作废服务、自动发布事件、Relay 和内部快照已经实现。Firstleg 的真实柜次体积快照同时服务 Finance 整柜成本分摊,但仍不能由 Admin 手工提交的订单归属或体积替代。
|
||||
|
||||
一期至少需要业务侧模型:
|
||||
|
||||
- `containerFeeId/version`、`containerId/containerNo`、费用方向、费用项目、业务日、CNY 金额。
|
||||
- 应付来源必须有供应商;应收来源必须有客户分摊结果。
|
||||
- 审核状态、参与结算状态、发布状态、作废/调整原因和操作审计。
|
||||
- 审核状态、发布状态、作废/调整原因和操作审计。
|
||||
- 柜内跨客户时,业务侧按真实体积形成不可变客户分摊行;Finance 只接收客户级来源,不自行猜测客户归属。
|
||||
|
||||
建议新增 `fl_container_fee_detail + fl_container_fee_allocation`,或建立统一 `fl_business_fee_source`;这是技术选型,不改变上述产品字段和验收结果。
|
||||
@@ -115,7 +114,6 @@ flowchart LR
|
||||
```text
|
||||
reviewStatus = APPROVED
|
||||
publicationStatus = PUBLISHED
|
||||
settlementIncluded = true
|
||||
sourceStatus = ACTIVE
|
||||
currency = CNY
|
||||
amount > 0
|
||||
@@ -129,12 +127,11 @@ Finance 必须通过 Inbox 幂等消费来源版本,或通过受保护的快
|
||||
| 页面/链路 | 目标接口 | 当前状态 |
|
||||
|---|---|---|
|
||||
| 入库费用审核 | `POST /api/platform/v1/inbounds/{inboundId}/fee-details/{detailId}/approve|reject` | 已有 |
|
||||
| 入库费用参与结算 | `PUT /api/platform/v1/inbounds/{inboundId}/fee-details/{detailId}/settlement-inclusion` | 缺失 |
|
||||
| 入库费用发布 | `POST /api/platform/v1/inbounds/{inboundId}/fee-details/{detailId}/publish` | 通用入口缺失 |
|
||||
| 入库费用发布 | 审核通过后自动发布,无独立人工开关 | 已确认 |
|
||||
| 柜子费用 | `/api/platform/v1/loading-plans/{loadingPlanId}/fee-details/**` | 模型、审核/调整/作废、事件、Relay 和快照已实现;Firstleg 相关 17/17 定向测试通过 |
|
||||
| Finance 来源接入 | `POST /internal/finance/v1/fee-source-events` | 已实现并验证;来源专项 10/10、Finance 全量 35/35、Firstleg 相关 17/17 通过 |
|
||||
| 客户账户 | `GET /api/platform/finance/v1/customer-accounts/{customerId}` | 已实现固定 DTO 单客户查询并通过测试;列表接口仍缺失 |
|
||||
| 客户应收应付 | `GET /api/platform/finance/v1/fee-pool?customerId=&direction=` | 已实现固定 DTO 查询并通过测试;详情、审核和参与结算操作仍缺失 |
|
||||
| 客户应收应付 | `GET /api/platform/finance/v1/fee-sources` 及 edit/submit/review/adjust/void | 已实现编辑审核闭环;无“是否结算”接口 |
|
||||
| 客户对账单 | `GET /api/platform/finance/v1/statements?customerId=`、`GET /api/platform/finance/v1/bills/{billId}` | 已实现固定 DTO 查询并通过测试;生成/审核操作仍缺失 |
|
||||
| 结算单应收 | `GET /api/platform/finance/v1/receivable-settlements?customerId=` | 已实现固定 DTO 查询并通过测试;生成与页面动作仍缺失 |
|
||||
| 应收人工收款 | `GET/POST /api/platform/finance/v1/receipts` | 已实现平台固定 DTO、多账单分配、合计校验、共用凭证和 File fail-closed;测试通过 |
|
||||
@@ -144,7 +141,7 @@ Finance 必须通过 Inbox 幂等消费来源版本,或通过受保护的快
|
||||
|
||||
| 模型 | 必要字段 | 当前缺口 |
|
||||
|---|---|---|
|
||||
| `fin_fee_source` | 来源系统/类型/ID/版本/hash、方向、客户、供应商、订单/入库/柜次、业务日、费用项、数量/单价/金额、审核/参与结算快照、状态、占用单据 | 已有写入、类型、方向、柜次、费用编码、hash、完整 JSON 快照和版本状态;供应商顶层字段及对账单占用关系属于本期 P0 数据模型,不得延后 |
|
||||
| `fin_fee_source` | 来源系统/类型/ID/版本/hash、方向、客户、供应商、订单/入库/柜次、业务日、费用项、数量/单价/金额、审核、发布、状态、占用单据 | 不保存人工结算开关;供应商 ID/名称与可空类别约束均来自上游不可变快照 |
|
||||
| `fin_reconciliation_statement` | 对账单号、客户、期间、账期、CNY 总额、状态、审核、版本、备注 | 缺失 |
|
||||
| `fin_reconciliation_line` | 对账单、feeSourceId/version/hash、业务与计费快照、金额 | 缺失 |
|
||||
| `fin_settlement` | AR/AP、客户/供应商、来源对账单、期间、到期日、总额、已收付、余额、状态、版本 | 当前 `fin_bill` 仅覆盖部分 AR |
|
||||
@@ -156,7 +153,7 @@ Finance 必须通过 Inbox 幂等消费来源版本,或通过受保护的快
|
||||
|
||||
### P0:一期验收硬阻断
|
||||
|
||||
1. 以下 11 个 operation 全部实现并通过直接行为测试:账户列表/流水;费用来源详情/审核/参与结算;对账单生成及出账/调整/作废;应收/应付结算单生成;结算单详情;人工付款登记。人工收款已实现但必须继续通过 300 元分配 3 张 100 元应收单等 P0 回归。
|
||||
1. 财务 operation 全部通过直接行为测试:账户列表/流水;费用来源详情及编辑审核闭环;对账单生成、审核、出账、客户确认、调整/作废;应收/应付结算单生成与详情;人工收付款登记。人工收款继续覆盖 300 元分配 3 张 100 元应收单等回归。
|
||||
2. 对账单、应收/应付结算单、付款和 revision 所需数据模型与唯一约束同步落地,不能只做空 Controller。
|
||||
3. 详细冻结契约见 `财务一期P0操作契约与验收用例.md`;不得把其中任何一项标为 P1、后续优化或假入口。
|
||||
|
||||
|
||||
+7
-6
@@ -46,7 +46,7 @@
|
||||
| 成员停用 | 客户子用户停用只撤销访问权限;客户账单、应收、余额等仍归客户企业,不触发财务单据转交;历史保留操作人快照 |
|
||||
| 一期页面 | 只做客户账户、客户应收应付、客户对账单、结算单应收、结算单应付;费用分析和利润表不进菜单/路由 |
|
||||
| 客户账户性质 | 财务往来派生总览,不是钱包;删除手动充值、预收、可消费余额和自动扣款入口 |
|
||||
| 费用来源链路 | 入库单费用和柜子费用必须审核、标记参与结算并发布到 Finance 来源池后,才能生成对账单/结算单 |
|
||||
| 费用来源链路 | 入库单费用和柜子费用审核通过后自动发布到 Finance 来源池并成为结算候选;不保留人工“是否结算”标记 |
|
||||
|
||||
## 二、全量范围确认
|
||||
|
||||
@@ -87,7 +87,7 @@
|
||||
| F0-05 | 汇率 | 保留汇率扩展字段,首期不自动折算、不计算汇兑损益 | 首期不做汇率能力、不做汇兑损益 | 已确认 |
|
||||
| F0-06 | 财务期间 | 自定义账期;支持 OPEN/CLOSED 和重开;重开必须记录原因、操作人和前后版本 | 自定义账期,关账后允许重开 | 已确认 |
|
||||
| F0-07 | 编号 | 服务端按单据类型+年月+流水号发号;重试返回原号,作废号不回收 | 按成熟软件规则实现 | 已确认 |
|
||||
| F0-08 | 来源费用入池 | APPROVED、PUBLISHED、settlementIncluded=true 的有效来源可入池;未出账允许调整,进入有效账单后冻结 | 出账冻结,未出账允许修改 | 已确认 |
|
||||
| F0-08 | 来源费用入池 | 所有有效费用都需要结算;`APPROVED + PUBLISHED + AVAILABLE + CNY + amount>0` 自动成为结算候选,不保留“是否结算/参与结算”人工开关;未出账允许调整,进入有效账单后冻结 | 审核通过自动发布并进入结算候选;出账冻结,未出账允许修改 | 已确认 |
|
||||
| F0-09 | 事件可靠性 | Firstleg Outbox 发布费用事件,Finance 消费幂等并保存来源快照;失败可重试、可查结果 | 按现有 Outbox 与幂等模式实现 | 技术已确认 |
|
||||
| F0-10 | 审计与权限 | 首期不强制双人复核/金额分级;财务写操作仍使用独立权限、原因和审计事件 | 平台财务按最简单方式处理,不增加强制审批 | 已确认 |
|
||||
|
||||
@@ -97,21 +97,22 @@
|
||||
|---|---|---|---|---|
|
||||
| F1-01 | 账单聚合维度 | 客户 + 币种 + 账期;不同币种不合并 | 首期只支持 RMB/CNY;支持多种费用项;多笔订单分别出账 | 已确认 |
|
||||
| F1-02 | 生成方式 | 支持按筛选结果人工生成;后续可增加定时生成,但不得重复出账 | 按截止时间或财务勾选合格来源生成;同一来源版本不得重复进入有效对账单 | 已确认 |
|
||||
| F1-03 | 账单状态 | DRAFT → ISSUED → CLOSED;客户只读,异议线下反馈后由平台财务调整或作废重开 | 客户不在线确认/争议,平台财务手工处理 | 已确认 |
|
||||
| F1-03 | 账单状态 | 主状态独立于客户确认状态;平台出账后进入 `PENDING_CONFIRMATION`,客户确认后为 `CONFIRMED`,账单调整后重新待确认 | 客户确认不改变结算主状态;调整、作废和重开均保留审计 | 已确认 |
|
||||
| F1-04 | 应收状态 | OPEN → PARTIALLY_SETTLED → SETTLED;到期后增加 OVERDUE 标记,不改变余额 | 客户账期由客户配置,默认 30 天;到期日按账单日期+客户账期计算 | 已确认 |
|
||||
| F1-05 | 客户确认 | 首期不做客户在线确认/争议;客户只读查看,异议线下反馈 | 客户不能操作,由平台财务处理 | 已确认 |
|
||||
| F1-05 | 客户确认 | 客户使用登录态确认本人已出账对账单,不接受前端 customerId;使用独立权限、乐观锁和幂等键 | 客户可在线确认,平台和客户均展示确认状态、确认人和确认时间;不做在线争议 | 已确认 |
|
||||
| F1-06 | 收款登记 | 首版人工登记到账日、金额、币种、方式、凭证号、附件和登记人 | 平台财务人工填写收款表单并上传收款凭证图片 | 已确认 |
|
||||
| F1-07 | 核销关系 | 支持一笔收款核销多张应收、一张应收被多笔收款核销;禁止跨币种和超额 | 一笔客户付款可分配到多张账单;财务分别填写各账单对应金额并关联同一收款凭证;首期不处理预收、多收、手续费、退款 | 已确认 |
|
||||
| F1-08 | 反核销/作废 | 独立高风险权限,填写原因并保留原记录;不物理删除 | 首期不做复杂反核销;未收单据可作废,已出账调整/作废重开必须留原因、版本和原记录 | 已确认 |
|
||||
| F1-09 | 出账后调整 | 已出账冻结;平台财务通过调整/作废重开形成新版本,保留原金额和原因 | 仅平台财务手工调整,不允许客户修改 | 已确认 |
|
||||
| F1-10 | 预收/多收/手续费/退款 | 单独建模为预收、其他应付款或退款,不直接冲减应收金额 | 一期全部不做;不设计钱包或预收入口 | 已确认 |
|
||||
| F1-11 | 应收款统计表 | 按结算单生成自然月和客户汇总 CNY 正式应收 | 展示应收总额、已收合计、余额未收,支持打印和异步 Excel;不做 FBA 渠道拆分、USD、编辑或零头减免 | 已确认 |
|
||||
|
||||
## 五、F2 供应商应付与结算确认
|
||||
|
||||
| 编号 | 需要确认的事项 | 建议结论 | 最终结论 | 状态 |
|
||||
|---|---|---|---|---|
|
||||
| F2-01 | 成本来源 | 只有具备供应商、付款主体、成本凭证、币种金额和成本归属的来源才能进入应付池 | 一期只接具备供应商、真实业务来源、审核、参与结算和 CNY 金额的 PAYABLE 来源 | 已确认 |
|
||||
| F2-02 | 成本确认节点 | 以供应商账单/业务完成/内部审核中确定一个正式节点;确认后冻结成本快照 | 费用审核通过、参与结算并发布后进入 Finance;来源版本冻结 | 已确认 |
|
||||
| F2-01 | 成本来源 | 只有具备 Warehouse 供应商、真实业务来源、审核和 CNY 正金额的 PAYABLE 来源才能进入应付池 | 供应商必须为 `ACTIVE`,名称只取 Warehouse 快照;费用项目 `supplierCategory` 为空时允许任意启用供应商,非空时严格匹配类别 | 已确认 |
|
||||
| F2-02 | 成本确认节点 | 费用审核通过后自动发布并进入 Finance 结算候选,确认后冻结成本快照 | 不保留“参与结算”开关;来源版本冻结 | 已确认 |
|
||||
| F2-03 | 供应商账单 | DRAFT → INTERNAL_REVIEW → SENT → CONFIRMED → CLOSED;差异走争议/补差/冲销 | 一期不单独做供应商对账页,直接在结算单应付中生成、审核和付款 | 已确认 |
|
||||
| F2-04 | 应付状态 | OPEN → PARTIALLY_PAID → PAID;到期增加 OVERDUE 标记 | DRAFT → PENDING_REVIEW → ISSUED → PARTIALLY_PAID → PAID;可拒绝/作废并留痕 | 已确认 |
|
||||
| F2-05 | 付款与核销 | 付款单独登记,支持多对多付款核销;禁止跨币种和超额 | 平台财务人工登记付款表单和凭证;不得跨供应商或超额 | 已确认 |
|
||||
|
||||
Reference in New Issue
Block a user