This commit is contained in:
2026-08-10 18:12:20 +08:00
parent 9689522041
commit 5e71b17733
6 changed files with 62 additions and 19 deletions
+23 -11
View File
@@ -9,6 +9,17 @@
财务域新增独立 `finance-service`,拥有独立财务数据库。不得把应收、应付、对账单、收付款、核销、客户账户、发票、费用分析或利润继续放入 `firstleg-service`。
身份与主体边界补充确认:产品层只有“平台、客户”两种身份。平台可以管理平台角色和平台用户;客户可以在本客户范围内管理客户角色和客户用户。客户用户是财务操作人,不因创建或操作财务单据而成为新的财务主体。
Finance 中必须分开建模:
- **客户企业/客户范围**:业务数据归属和客户侧结算对象,服务端从登录授权上下文确定,不能由前端任意切换;
- **平台财务主体/账套**:平台收款、付款、开票和核算的法律/账务主体;即使当前只有一个,也保留独立对象;
- **客户用户/成员**:制单、复核、确认、收款登记等操作人,保存 `userId/memberId` 和当时的姓名快照;
- **角色与权限**:平台角色由平台维护,客户角色由客户在允许的权限目录内维护,任何角色都不能越过客户范围。
若业务口语中的“客户就是主体”是指“客户是业务数据主体/结算对象”,可以采用;若指“财务法律主体/账套”,则不能直接等同,需由 F0-02 单独确认。
`firstleg-service` 保持现有业务边界,只负责:
- 入库单、测量、称重和审核;
@@ -110,30 +121,31 @@ Firstleg 通过本地 Outbox 发布:
- `FIRSTLEG_FEE_ADJUSTED`
- `FIRSTLEG_FEE_VOIDED`
事件至少包含:
以上是目标事件名。当前 Firstleg 已存在 `FIRSTLEG_FEE_SENT` 和 `FIRSTLEG_FEE_ADJUSTED`;实施时将 `FIRSTLEG_FEE_SENT` 兼容映射为 `FIRSTLEG_FEE_PUBLISHED`,并补充明确的作废事件,不能把规划事件误写成当前已上线能力。
事件采用“统一信封 + 轻量来源引用”,不直接承载完整金额和计费明细。至少包含:
```text
eventId
eventType
eventVersion
occurredAt
customerId
producer
tenantId
inboundId
sourceFeeId
sourceFeeVersion
sourceFeeNo
feeDetailId
direction
businessDate
currency
amount
sourceHash
sequence
idempotencyKey
payloadHash
traceId
```
Finance 使用 `eventId + sourceType + sourceId + sourceVersion` 幂等消费。重复相同事件返回第一次处理结果;同一幂等键对应不同内容时拒绝处理并记录冲突。
Finance 以 `eventId` 做投递幂等,并以 `sourceType + sourceFeeId + sourceFeeVersion` 做业务唯一约束。重复相同事件返回第一次处理结果;同一业务键对应不同哈希时拒绝处理并记录冲突。金额、币种、方向、业务日期、费用明细和业务快照必须通过内部快照接口核验后保存,不能只信任事件载荷。
### 5.2 内部查询
Finance 接收事件后,通过服务令牌调用 Firstleg 内部接口核验完整来源快照。内部接口返回 DTO,不返回或共享 Entity。
Finance 接收事件后,通过服务令牌调用 Firstleg 内部接口核验完整来源快照。内部接口返回 DTO,不返回或共享 Entity。接口路径、信封字段、重试和兼容规则以《Firstleg-Finance 跨服务契约》为准。
Finance 保存来源快照后,不依赖 Firstleg 当前表数据实时计算历史账单。已出账来源发生调整时,Finance 生成补差或冲销来源,不覆盖原账单明细。