Files
zszq-trs/YLErpDAL/Modules/SwapModule/ARCHITECTURE.md
T
hjhan dafc06793e refactor: AddClientCashInCashOut 加 virtual + 修正架构文档
AddClientCashInCashOut 从 public 改为 public virtual,
使测试可 override, 消除 RecordMarginCashFlow 迁出的阻塞。
AddClientCash 已是 virtual, 这是统一两者。

修正 ARCHITECTURE.md: 保证金有余额和返息(非'没有计息基数')。

验证: 编译0错误, 全量513测试7失败(基线一致)。
2026-08-11 17:09:13 +08:00

139 lines
5.9 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# SwapModule 架构说明
> 本文档描述 2026-08 重构后的模块结构。所有改动均通过编译 + 全量测试验证(零回归)。
## 三大限界上下文
TRS 的三类业务各自独立,通过 SwapInterest 纯函数库共享计息能力:
```
SwapInterest (Core 纯函数)
"本金 × 利率 × 天数 / 年化"
不依附于任何腿
┌──────────────┼──────────────┐
│ 谁需要算利息就调它 │
│ │
┌─────┴──────┐ ┌──────┴───────┐
│ FundingLeg │ │ Margin │
│ 融资腿 │ │ 保证金 │
│ │ │ │
│ 客户付券商 │ │ 客户交的抵押品│
│ 的融资成本 │ │ │
│ spread+FR007│ │ 余额/追保/返还│
│ mode 1/2/9 │ │ mode 5/6 │
└─────────────┘ └──────────────┘
┌─────────────┐
│ ReturnLeg │
│ 标的端 │
│ │
│ 标的总回报 │
│ 价格+分红 │
└─────────────┘
```
**命名规则(防歧义)**
- `Funding` = 融资成本(不用 Interest,避免和通用"利息"混)
- `Return` = 标的总回报(不用 Float,避免和 FR007 浮动利率混)
- `Margin` = 保证金(客户交的抵押品,有余额和返息,不走融资腿的计息基数框架)
- `FloatRate` = FR007 浮动利率(唯一含义)
## 目录结构
```
SwapModule/
├── FundingLegs/ 融资腿(mode 1/2/9
│ ├── IFundingLegStrategy 策略接口 + NotionalResult 值对象
│ ├── FixedAmountLeg mode 1 固定值(恒=Fix 不随比例变)
│ ├── ContractNotionalLeg mode 2 合约名义本金规模
│ ├── UnderlyingEntryFullPriceLeg mode 9 标的期初全价
│ └── FundingLegStrategyFactory 按 mode 分发
├── Margin/ 保证金(mode 5/6
│ ├── MarginModes mode 判断(含 ForLinq for EF Core
│ ├── MarginBalance 保证金余额(值对象)
│ ├── MarginAccount 余额管理 + AccrueInterest 计息入口
│ ├── MarginCalc 纯函数(PreviousBalance/FlipDirection/AccumulateSettlement
│ ├── IMarginResolver 保证金形态接口
│ └── Cash/Credit/Guarantee 三种形态实现
├── ReturnLegs/ 标的端
│ ├── ReturnLegSummary 标的端汇总值
│ ├── QtyRollforward 数量递推(预留 corpActionDeltaQty 给公司行为)
│ ├── MtmCalc 盯市(MarketValue + UnrealizedPnl
│ ├── DividendCalc 增值税后票息(AfterTax + AfterTaxRaw
│ ├── DirectionRatio 方向因子(LongShort + ReceivePay
│ └── PositionValueCalc 持仓价值汇总(利息端 + 浮动端)
├── SwapDealService.cs 盘中平仓/互换主逻辑
├── SwapEodPositionService.cs EOD 日终归档主逻辑
├── SwapDealIndexFixer.cs SwapDealService 专用取价器(委托 TryGetFloatRate
└── Fr007IndexFixer.cs FR007 取价生产实现
```
## Core 层(Framework/YLErp.Core/Interest/
```
Interest/
├── SwapInterest.cs 纯函数库(AccrueSimple/AccrueCompound/ApplyUnwind
├── IIndexFixer.cs 取价接口
├── IndexFixerBase.cs 取价日计算工具
└── Fr007IndexFixer.cs FR007 取价生产实现(调 EodPriceQueryService
```
## InterestModeEnum(显式赋值,DB 契约)
```
Unknown = 0
固定值 = 1 → FundingLeg
合约名义本金规模 = 2 → FundingLeg
初始预付金 = 5 → Margin
追加预付金 = 6 → Margin
标的期初全价 = 9 → FundingLeg
已删除(无历史数据):
3 = 持仓名义本金(死代码)
4 = 持仓市值(死代码)
7 = 多头存续名义本金(界面已禁用)
8 = 空头存续名义本金(界面已禁用)
```
## 已消除的 inline 重复
| 公式 | 原重复 | 收敛到 |
|---|---|---|
| FR007 取价 | 6处 | IIndexFixer |
| 保证金 mode 判断 | 10处 | MarginModes |
| UnderlyingMarketValue | 4处 | MtmCalc.MarketValue |
| PosiMtmPnL | 4处 | MtmCalc.UnrealizedPnl |
| PosiQuantity 递推 | 2行 | QtyRollforward.Calc |
| 增值税公式 | 5处 | DividendCalc |
| 方向因子三元式 | 7处 | DirectionRatio |
| SwapPositionValue | 8处 | PositionValueCalc |
| CalcNotionalByMode | 整个方法 | 已删除(融资腿走工厂,保证金内联) |
## 方向因子类型规范
所有方向因子(多空 +1/-1、收付 +1/-1)统一用 **int**,不用 decimal
| 纯函数 | 参数 | 类型 |
|---|---|---|
| MtmCalc.MarketValue | shortRatio | int |
| MtmCalc.UnrealizedPnl | shortRatio, ratio | int |
| DirectionRatio.LongShort | 返回值 | int |
| DirectionRatio.ReceivePay | 返回值 | int |
| MarginCalc.FlipDirection | 返回值 | int |
| PositionValueCalc.Calc | ratio | int |
## 待后续改造
| 项目 | 依赖 | 接缝已预留 |
|---|---|---|
| 公司行为(送股/拆股) | QtyRollforward.corpActionDeltaQty | ✅ |
| 公司行为(登记日快照) | DividendCalc + BondPayment | 见 corp-action-refactor-proposal.md |
| 保证金配置/规则/占用 | MarginAccount + MarginCalc | ✅ |
| RecordMarginCashFlow 迁入 Margin | AddClientCash 加 virtual | 待做 |
| EOD 编排拆分 | SwapPositionCompose | 待业务需求驱动 |
```