Commit Graph
136 Commits
Author SHA1 Message Date
hjhan ef1a126b8f refactor(margin): 4处散落marginTypes收敛到MarginModes
SwapEodPositionService: 删除 marginTypes 字段(13处.Contains全改MarginModes.Contains)
SwapEventEmailService: marginTypes 字段改为 MarginModes.All.ToList()
EodClientBalanceCalc: 删除未使用的 marginTypes 局部变量(死代码)
ClientBalanceUtility: 删除未使用的 marginTypes 局部变量(死代码)

收敛后 {初始预付金,追加预付金} 集合只在 MarginModes.All 一处定义,
消除6处副本口径分裂风险。

验证: sln编译0错误, 全量485测试7失败(基线一致,零回归)。
注: 上次27失败是stash残留导致的状态不一致,本次从干净状态逐步改。
2026-08-11 09:40:48 +08:00
张名锐 8fdf2417f4 fix(swap): 修复日终持仓风险_互换 利息金额方向处理逻辑 2026-08-10 17:59:30 +08:00
张名锐 2c4cd56111 feat(swap): 添加收益互换利息计算功能及Excel场景测试
- 新增ExecuteSaveEodInterestPositionCopy方法用于保存日终利息持仓副本
- 添加ExcelScenario4Case类和相关测试数据用于验证利息计算准确性
- 实现DI_EXCEL_SCENARIO4_PartialCloseAndFinalCloseMatchBlAndBn测试方法
- 优化SwapDealService中的利息计算逻辑和平仓处理
- 添加详细的注释说明利息计算的核心业务规则
- 完善SwapEodPositionService中的日终持仓处理逻辑
- 修复部分平仓和最终平仓时的利息金额计算问题
2026-08-09 22:07:19 +08:00
张名锐 48e8447925 fix(swap): 修复复利重置日部分平仓后本金计算逻辑
- 修复复利重置日部分平仓后当日利息计算,使用已结转待实现利息的剩余复利本金
- 修复算尾部分平仓后EOD保留剩余复利本金的逻辑,按计息模式返回口径处理
- 修复模式2和模式9在部分平仓时的本金计算差异,避免重复比例调整
- 修复不算尾情况下重置日后已并入本金的待实现利息遗漏问题
- 新增对话案例回归测试验证部分平仓后最终全平场景的正确性
- 添加多种计息模式和交易类型的回归测试用例
2026-08-09 16:06:09 +08:00
张名锐 7528670e8b fix(swap): 修复部分平仓后算尾利息计算问题(算头算尾T+0合约单利)
- 将测试方法改为数据驱动测试以覆盖不同利息模式
- 在测试中添加对不同利息模式的验证逻辑
- 修复平仓后EOD本金只携带剩余持仓的计算逻辑
- 添加对算尾部分平仓后EOD本金的断言验证
- 优化单利算尾当日按平仓前全额计提的处理逻辑
2026-08-09 13:42:59 +08:00
张名锐 691054c57e fix(swap): 修复部分平仓后跨日复利本金计算逻辑(算头算尾T+1复利合约)
- 修复了5/11 EOD跨日复利本金应保留剩余70%动态本金的计算
- 调整了calcLast=true时已平部分动态本金的处理逻辑
- 修正了部分平仓后剩余仓位跨日携带的本金缩放算法
- 添加了针对不同计算路径的本金比例调整机制
2026-08-08 18:09:31 +08:00
张名锐 d3afa6d27c fix(swap): 修复部分平仓后复利本金计算逻辑(修复T+1)
- 修复部分平仓后下一日复利本金未按剩余比例继承的问题
- 添加对最终日不算尾时历史差分重放的日期边界控制
- 修复算头不算尾快速路径中已平部分进入下一日复利的错误
- 确保重置日动态本金不会被二次缩放导致剩余本金计算错误
- 添加单元测试验证部分平仓后复利本金按剩余70%本金计提的逻辑
- 补充最终全平重放时历史终点包含当日利息后再做差额的测试用例
2026-08-08 17:10:29 +08:00
张名锐 aa5a5ed879 fix(swap): 修复复利计算中部分平仓场景下的利息处理逻辑(算头不算尾期初复利)
- 修改单元测试为数据驱动测试,支持多种利息模式验证
- 更新复利计算注释,明确最终日重放时的calcLast规则
- 扩展复利计算条件判断,支持合约名义本金规模和标的期初全价两种模式
- 优化部分平仓日终复利计算逻辑,确保未平仓本金贡献正确保留
2026-08-08 16:32:50 +08:00
张名锐 54a86fccc1 fix(swap): 修复部分平仓后复利计算问题(算头不算尾合约复利)
- 当calcLast为false时,部分平仓日终新增复利使用剩余本金计算
- 修复最终全平仓时历史终点利息计算逻辑
- 添加测试用例验证部分平仓后复利计算准确性
- 修正日终待实现利息累加时的历史终点处理方式
- 调整复利部分平仓金额计算方式,确保未平仓部分正确参与后续计算
2026-08-08 16:11:53 +08:00
张名锐 6fdc7d80b2 fix(swap): 修复复利计算和部分平仓处理中的多个问题(算头算尾合约复利平仓)
- 修复合约名义本金规模模式下部分平仓时名义本金计算错误
- 修复最终全平时复利利息计算中历史平仓尾差处理问题
- 修复复利重置日处理中利息重复注入历史本金的错误
- 修复部分平仓后日终待实现利息计算中本金比例应用问题
- 修复全平且实际金额覆盖应结利息后待实现利息清零逻辑
- 新增复合复利交换服务用于单元测试验证
- 添加多个测试用例覆盖复利计算边界场景
2026-08-08 15:51:29 +08:00
张名锐 5539bd9c9a ```
fix(swap): 修复复利模式下部分平仓后EOD本金计算问题

- 在复利模式部分平仓场景中确保使用计算得出的复利本金
- 添加了针对复利重置日期部分平仓的单元测试验证
- 修复了EOD本金重置逻辑,避免复利计算被错误覆盖
- 确保CloseInterestPosition执行后保留正确的复利本金值
```
2026-08-07 20:51:56 +08:00
张名锐 6d6729cf9c test(swap): 添加部分平仓利息计算测试用例
- 添加算尾部分平仓当日新计利息包含已平仓部分的测试
- 添加不算尾部分平仓当日新计利息只包含剩余持仓部分的测试
- 验证部分平仓待实现收益计算的正确性
2026-08-07 15:05:04 +08:00
张名锐 01d7f0c55e fix(swap): 修复部分平仓计息计算中的尾差处理问题
- 修正了部分平仓后待实现利息收入的预期值从 0.006383561644 到 -0.010438356164
- 修正了预期待实现利息值从 0.820569301369 到 0.410474008219
- 在 SwapDealService 中添加了已完成平仓事件的查询逻辑,排除已平仓头寸的本金计算
- 重构了 SwapEodPositionService 中的待结算利息计算逻辑,区分自动互换和平仓场景
- 在测试类中添加了已完成流程事件的查找方法和相关测试数据
- 更新了测试用例以验证平仓事件对利息计算的影响
2026-08-06 21:35:13 +08:00
张名锐 c425594833 feat(swap): 实现预付金模式下部分平仓的待实现收益计算
- 添加DI_MANUAL_PREPAY_PARTIAL_CLOSE_UsesHistoryPlusRemainingDailyInterest测试方法
- 验证预付金部分平仓待实现收益为历史待实现加平仓后当日新增减平仓实现
- 修改ExecuteSaveAutoEodWithCloseInterestPosition方法中待实现收益计算逻辑
- 新增useAccrualBalance标识判断是否使用应计余额计算方式
- 对于预付金模式使用历史待实现收益加当日新增减平仓实现的方式计算
2026-08-06 18:39:20 +08:00
张名锐 9ef45650c7 feat(swap): 实现预付金利息腿实时剩余本金计算功能
- 新增 ResolveInterestLegPositionsAsOf 方法处理预付金利息腿实时本金计算
- 添加 FindCompletedFlowEvents 方法查询已完成的现金流事件
- 在日终持仓服务中集成实时剩余本金计算逻辑
- 移除日终重复扣减预付金本金的逻辑
- 优化利息端估值计算方式
- 添加部分平仓后预付金日终按实时剩余本金计息的测试用例
- 增加平仓日预付金日终不得重复扣减实时剩余本金的验证
- 完善历史回放场景下的本金调整功能
2026-08-06 14:32:38 +08:00
张名锐 3670dde9bf fix(swap): 修复利息互换平仓结算中的尾差处理和本金计算问题
- 修复ExecuteSaveAutoEodInterestPosition方法参数传递,添加lastEodSwap、posiLongNotional和orginPv参数
- 修正平仓利息计算逻辑,区分手动结算和平仓后自动结算的利息处理
- 新增ResolveUnwindPreviousNotional静态方法,优化平仓前本金计算逻辑
- 修复部分平仓后利息累积边界问题,确保仅从上次EOD快照后开始计算
- 完善自动结算利息的四舍五入处理,避免精度丢失
- 修正支付端方向符号应用,确保方向只应用一次
- 更新TdInterestPrincipal计算逻辑,处理不同利息模式下的本金赋值
- 修复TdCloseInterest计算,合并手动和自动结算利息金额
- 优化InterestIncomeSum计算,正确处理结算后剩余未实现利息
2026-07-30 23:29:07 +08:00
张名锐 db46e48ec5 fix(swap): 修复互换产品到期结算和利息计算逻辑
- 优化到期日最终结算判断逻辑,确保只有完全覆盖才清零待实现余额
- 引入利息金额舍入处理,避免精度差异导致的结算误差
- 完善自动互换流水处理,确保实际结算金额与待实现计算分离
- 修复部分平仓后日终持仓继承逻辑,保持利息累计连续性
- 调整到期自动互换处理,确保最后结算后待实现余额正确归零
- 优化利息收入和费用的独立计算,避免历史数据重复计算问题
2026-07-29 17:37:57 +08:00
张名锐 3d73835be5 fix(swap): 结算或全部平仓后,待实现置0
- 添加 NormalizeSettledInterestAmounts 方法处理手工平仓和互换的利息事件精度
- 添加 NormalizeManualSettlementAmounts 方法在手工结算前收敛流水金额
- 将利息计算精度从 ConsGlobal.PriceRound 统一调整为 InterestCalculationPrecision(12位)
- 在日终持仓快照中添加精度标准化处理,利息腿保留12位精度
- 修复全量平仓时待实现利息和费用的清零逻辑
- 在收益结算事件后清空待实现利息余额避免重复计算
- 更新单元测试验证现金与两位利息事件的一致性
2026-07-29 14:42:03 +08:00
张名锐 32af85d35c Merge branch 'glms/feature/dotnumber' into glms/feature/1.4.2
# Conflicts:
#	YLErpWeb/Views/SwapTrade2/TradeEdit.cshtml
#	YLErpWeb/wwwroot/Scripts/app/swaptrade/swapTradeEdit.js
2026-07-23 17:53:37 +08:00
张名锐 c4379d4b90 fix(swap): 修正日终保证金本金计算逻辑
- 移除保证金本金的1/10缩放处理,改为直接使用实际本金数值
- 修正了保证金本金计算中的除以10逻辑,确保显示正确的本金金额
- 保持利息计算使用原始本金累积值,避免破坏保证金利息金额准确性
- 更新注释说明,明确当前风险页按日终保证金
2026-07-23 17:49:02 +08:00
张名锐 32a3a45c85 refactor(swap): 修复债券日终价格映射
- 移除 GetSwapValuationPrice 方法中的 posiGrossPrice 参数
- 删除债券价格转换相关的注释代码和日志记录
- 简化债券价格处理逻辑,直接使用原始价格进行四舍五入
- 更新所有调用 GetSwapValuationPrice 的地方以匹配新方法签名
- 移除多余的价格转换和展示态判断逻辑
2026-07-23 14:17:26 +08:00
hjhan 7b007bddfa refactor(swap-test): 抽取 TestableSwapEodPositionService 公共基类收敛重复 Stub
- 新建 TestableSwapEodPositionService 收敛 8/8 Stub 重复的高频 override
  (PersistEodSwapPosition/SaveAllChanges/GetCurrencyRate/AddClientCash)
  + 统一 OptUserInfo 构造 + PersistedPositions/SaveChangesCount 输出捕获
- SwapEodPositionService.DealInterests 改 protected virtual(行为零变化)
- 8 个 ScenarioTest 改为继承基类,删除重复 override
- 消灭 DealInterestsScenarioTest/DealInterestsGoldenReplayTest 的反射调用
  (typeof().GetMethod().Invoke → 直接调用 DealInterests)

验证:dotnet build 0 错误;dotnet test SwapModule 284通过/6跳过/0失败
2026-07-23 11:16:11 +08:00
张名锐 bc961c3411 fix(swap): 修复互换交易中债券价格精度处理问题,扩充到11位计算
- 统一债券价格四舍五入规则,使用AwayFromZero模式
- 为债券类型添加特殊的精度处理逻辑
- 修复前端价格显示精度计算问题
- 优化价格存储精度控制,区分债券和其他产品类型
- 修复初始化YTM和净价精度处理问题
- 更新价格验证逻辑以支持动态精度设置
2026-07-23 11:06:50 +08:00
张名锐 018136c615 fix(swap): 修复收益互换价格转换和初始保证金计算问题
- 移除债券价格显示态和存储态转换的错误判断逻辑
- 简化债券价格转换条件,只对债券标的进行存储态转换
- 添加初始保证金计算前的金额精度统一处理
- 重构初始保证金准备逻辑到独立方法中
- 修复因价格单位不一致导致的浮动损益计算错误
2026-07-23 10:13:09 +08:00
张名锐 c58a9d40c4 feat(swap): 统一【期初、期末交割价格】精度处理
- 在ConsGlobal中新增SwapDeliveryPriceRound常量定义为9位小数
- 更新incomeSwapTrade.js中交割价格计算逻辑,添加getStorageDeliveryPrice方法
- 修改SwapConsumerService中TradingAmountAvg字段的精度处理
- 添加ValidateDeliveryPrices和NormalizeDeliveryPrices方法进行交割价格验证和标准化
- 在SwapEodPositionService中对PosiGrossPrice和UnderlyingPrice进行精度处理
- 更新SwapFlowEventService中TradingAmountAvg字段的精度处理
- 在SwapFlowImportService中添加交割价格精度处理
- 更新前端界面中的输入格式配置,使用新的交割价格精度设置
- 修改SwapflowList.js中交割价格精度处理逻辑
- 在SwapFlowService中添加交割价格验证和精度处理
- 更新SwapTradeAutoService中交割价格精度处理
- 修改SwapTradeService中PosiGrossPrice字段的精度处理
- 更新unwindSwapTrade.js中交割价格计算逻辑
2026-07-22 14:53:46 +08:00
张名锐 0755233ab6 fix(swap): 统一处理【名义本金】数值精度舍入问题
- 在多个位置添加 Math.Round 函数确保金额计算精度
- 新增 NormalizeNotionalValues 方法统一处理 UnwindData 中的名义本金舍入
- 修复交易平仓时 StockEqvNotional 扣减计算的精度问题
- 解决持仓数据 PosiNotionalValue 的精度舍入处理
- 修复前端页面显示格式化问题
- 添加单元测试验证名义本金舍入逻辑正确性
2026-07-22 13:05:49 +08:00
hjhan a153a1d1a6 refactor(swap-eod): 抽出期末头寸纯函数并放宽可见性
SetFixedLegRealizedPnl 替换4处复制粘贴(清理L1296双分号); NormalizeInterestSignForReport 替换16行内联报表分支; CalculateWeightedMarginInterest private->public static。均为纯静态无实例依赖,配套无库单测锁定行为。
2026-07-21 15:28:13 +08:00
张名锐 f4ffe71071 fix(swap): 修复期末头寸已实现盈亏计算问题
- 在新创建的期末付款头寸中添加已实现盈亏字段计算
- 对历史数据的利息和已实现利息进行符号标准化处理
- 添加预付金腿利息方向与保证金本金方向的反向逻辑
- 兼容修复前已落库的利息腿数据缺失已实现盈亏字段问题
- 统一风险报表按绝对金额和业务方向的数据口径
2026-07-20 15:28:40 +08:00
张名锐 a0f8dc9df7 refactor(SwapModule): 简化预付金利息计算逻辑
- 移除本金绝对值加权平均的复杂计算方式
- 直接对各腿利息金额进行轧差求和
- 保留收取为正、支付为负的方向转换逻辑
- 删除不再使用的本金权重计算代码
- 简化方法实现并提高计算效率
2026-07-20 09:30:01 +08:00
张名锐 f37a5b997c Merge remote-tracking branch 'origin/glms/feature/1.4.2' into glms/feature/1.4.2 2026-07-17 10:02:18 +08:00
张名锐 ce0908c53b fix(swap): 修复浮动端已实现盈亏计算逻辑
- 添加了SetFloatingRealizedPnl方法统一计算已实现盈亏
- 已实现盈亏现在正确包含盯市、分红和费用三个组成部分
- 修复了多处RealizedPnl计算错误,确保数值准确性
- 为DF_008测试场景添加了专门的单元测试验证
- 移除了重复的盈亏计算代码,提高代码可维护性
2026-07-17 10:02:06 +08:00
hjhan 2395aa9856 test(swap): 补 6676b625 掉期保证金利息方向反向单元测试
抽 CalculateSwapRealizedPnl 为 public static 纯函数(用 ConsTrade.InterestMarginModels 替代实例 marginTypes), 新增 8 个单元测试覆盖: 非保证金腿收取/支付原向, 保证金腿(初始预付金/追加预付金)收取/支付反向, 完整 5 字段汇总两种方向, RealizedInterest=0 边界. 锁定 6676b625 修复的保证金腿利息方向反向契约, 防止后续误改回归.
2026-07-17 08:40:19 +08:00
张名锐 6676b62573 fix(swap): 修正掉期产品保证金利息计算逻辑
- 修正FloatingUnrealizedPnl字段定义,包含未结交易费用
- 更新MarginInterestGain和MarginInterestLoss字段的文档说明
- 添加CalculateSwapRealizedPnl方法处理保证金腿利息现金流方向
- 修正RealizedPnL计算逻辑,避免保证金利息重复计算
- 调整保证金本金和利息计算口径的一致性处理
- 修正保证金利息现金流方向与本金方向的相反关系
2026-07-16 19:55:44 +08:00
张名锐 076a846cb9 fix(swap): 修复互换模块债券日终估值价格转换问题
- 新增 GetSwapValuationPrice 方法处理债券价格格式转换
- 解决新录入页面全价按小数保存与历史数据格式不一致问题
- 当期初价为小数口径且当前债券价为展示态时进行格式转换
- 避免因价格格式差异导致的浮动损益计算错误
- 在三个关键位置替换原有价格获取方法调用
- 添加详细的日志记录用于跟踪价格转换过程
2026-07-14 10:55:47 +08:00
张名锐 4449bd5824 feat(swap): 更新互换估值功能并优化数据模型
- 添加互换估值V1配置常量以支持新版本
- 将PeriodAmount和DividendAmount字段改为可空decimal类型
- 更新字段注释说明预付金利率和利息的计算方式
- 修改净额结算金额定义,排除期初和追加预付金本金
- 在报表服务中添加安全求和操作防止空值异常
- 增加多个汇总字段包括股息、保证金利息等统计
- 重构预付金处理逻辑,改用加权平均计算方式
- 新增加权保证金利率和利息计算辅助方法
- 调整前端表格列顺序,优化交易编号显示位置
- 更新数值格式化器以支持空值处理和精度控制
- 添加文档列顺序恢复功能确保表格一致性
2026-07-14 09:46:54 +08:00
张名锐 7df9e8060e feat(swap): 添加互换合约估值功能和优化数据模型
- 在ClientSwapPositionRequest中新增BookId字段用于资产分类查询
- 新增FloatingUnrealizedPnl、InterestPaymentMethod、MaturityNettingValuation等估值相关字段
- 添加MaturitySettlementDate、DividendAmount、AdditionalMarginAmount等持仓详情字段
- 更新前端表格列模型,调整浮动端和估值实现收益分组显示
- 实现框架合约导出功能,支持完整数据筛选结果导出
- 优化名义本金计算逻辑,修复长短仓数值处理问题
- 完善付息方式和估值口径的业务逻辑处理
- 添加TRS估值、期间分红等关键业务字段计算
- 实现Excel导出时分组表头格式化功能
- 修复框架合约列排序和分组表头显示问题
2026-07-10 18:20:20 +08:00
张名锐 358993bedb feat(swaptrade): 添加期末头寸风险表新字段支持
- 在EodSwap实体模型中新增标的类型、期间付息/分红、保证金利息收支字段
- 在前端表格列模型中添加标的类型、期间付息/分红列定义
- 在前端表格分组配置中将新字段归入对应分组显示
- 实现后端服务中对新字段的数据查询和计算逻辑
- 添加保证金利息收入支出的分类汇总功能
- 完善标的类型字段的数据源获取和展示逻辑
2026-07-09 15:11:58 +08:00
hjhan 86825cb2a1 test(swap): SwapPositionComposeScenarioTest(4场景)+CopyEodPosition/UpdateEodPosition/SaveCurrentEodInitalPosi走PersistEodSwapPosition seam
借鉴 testable 分支 SwapPositionComposeScenarioTest,基于当前分支 seam 重写4场景:
- SPC_001 首次归档(无前日eod):PosiQuantity=初始持仓
- SPC_002 Copy分支(有前日eod无事件):PosiGrossPrice原样复制
- SPC_003 Update分支(有平仓事件):PosiQuantity=1000-400=600, TdCloseQty=400
- SPC_004 未收盘抛异常(非交易首日无前日eod)

SwapEodPositionService 改动(零行为变更):
- CopyEodPosition/UpdateEodPosition/SaveCurrentEodInitalPosi 的 DbContext.eod_swap_position.Add
  改为调 PersistEodSwapPosition seam(3处),使测试可拦截持久化

利息腿场景(自动互换)因 CalcSwapInterests 参数适配复杂留后续。
SwapModule 177测试全绿(+4),无回归。
2026-07-03 18:37:46 +08:00
hjhan cbb5c88aa8 refactor(swap): SwapPositionCompose补5个seam+事务重构为ExecuteInTransaction
SwapEodPositionService 新增5个 protected virtual seam(SwapPositionCompose路径):
- FindActiveSwapTrades(DateTime, IEnumerable<int>): 查活跃互换交易
- FindAllSwapPositions(List<int>): 查所有持仓(含初始+实际)
- FindTradeExtends(List<int>): 批量查交易扩展
- FindEodSwapsByDate(DateTime): 查指定日期日终汇总
- FindFlowEvents(int, DateTime): 查交易指定日期的完成流水事件

SwapPositionCompose 方法体重构:
- 5处内联DbContext查询替换为seam调用
- 事务(BeginTransaction/Commit/Rollback)重构为ExecuteInTransaction lambda
- SaveChanges替换为SaveAllChanges seam
- 复用已有FindEodSwapPositions seam(替代内联eod_swap_position查询)

为零行为变更(seam生产实现=原代码,ExecuteInTransaction=原事务逻辑)。
SwapModule 173测试全绿,无回归。为SwapPositionComposeScenarioTest铺路。
2026-07-03 18:31:01 +08:00
hjhan 32bcf9beb9 refactor(swap): FindTrade seam上提基类消除三子类重复
SwapDealService/SwapEodPositionService/SwapFlowEventService 三处 FindTrade(int)
签名和实现完全一致(DbContext.trade.Find),上提到 SwapTradeBaseService 基类。

核对确认可安全上提的只有 FindTrade(三者逐字一致):
- FindTradeExtend 不可上提: SwapEodPositionService 用 FirstOrDefault,
  SwapFlowEventService 用 First(找不到抛异常),语义不同。
- FindPositions 不可上提: SwapEodPositionService 含 IsInitial 持仓,
  SwapFlowEventService 排除 IsInitial + AsNoTracking,语义不同。

测试 stub override FindTrade 跨基类层级正常工作,C# virtual 多态不受影响。
SwapModule 171测试全绿,无回归。
2026-07-03 09:52:57 +08:00
锦麟 王 365711b5ff 自动互换分红时,期末结算全价使用PosiGrossPrice 2026-07-02 13:02:14 +08:00
hjhan 0910969e3f fix(swap): PosiDividendSum精度差异修复(GLMS-20260105-0007)
问题:互换后PosiDividendSum=-89999.64(应为-90000),差0.36元。
根因:UpdateEodPosition cs:1635从头重算PosiDividendSum
  (Round(全程,2)-已实现),与CopyEodPosition逐天递增
  (每天Round(增量,2)累积)产生舍入误差累积。

修复:cs:1635改为递增模式
  PosiDividendSum = eod.PosiDividendSum + TdPosiDividend - TdCloseDividend
  与InterestIncomeSum的递增模式一致,避免从头重算的精度差异。

验证(golden录制/回放TDD):
- 真实数据录制GLMS-20260105-0007的eod快照+输入数据
- 回放重新调UpdateEodPosition:修复前=-89999.64(红灯),
  修复后=-90000(绿灯,精确匹配)
- 121个测试全通过,无回归
2026-07-02 10:47:23 +08:00
hjhan 7c993f7bb2 refactor(swap): DealFloatPositions外部依赖虚方法接缝(分红场景准备)
加3个protected virtual虚方法:
- GetUnderlyingPrice: 标的市场价格(原UnderlyingCodePrice)
- GetUnderlyingData: 标的缓存数据(原DataCacheProvider)
- CalcBondPayment: 债券付息(原new BondPaymentService)

替换CopyEodPosition/UpdateEodPosition/SaveCurrentEodInitalPosi
内部的外部调用为调虚方法,生产代码行为不变。

这3个接缝使浮动腿归档的分红计算可测(TdPosiDividend/PosiDividendSum)。
验证: 108个测试全通过。
2026-07-02 08:57:55 +08:00
hjhan 4138a6ec36 refactor(swap): DealFloatPositions浮动腿归档方法可见性放开(testable迁移)
4个方法private→protected,不改变生产行为:
- DealFloatPositions(浮动腿归档主调度)
- CopyEodPosition(无平仓复制前日)
- UpdateEodPosition(有平仓更新)
- SaveCurrentEodInitalPosi(首日初始化)

这4个方法本身无直接DB调用(数据从参数传入),
但CopyEodPosition/UpdateEodPosition依赖外部数据源
(UnderlyingCodePrice/BondPaymentService/DataCacheProvider),
需后续加接缝才能完整测试。
SaveCurrentEodInitalPosi是纯计算可直接测。

验证: 104个测试全通过。
2026-07-02 08:47:30 +08:00
hjhan 7f0529bbed test(swap): ComposePage流水合成持仓合成测试(testable迁移)
新增4个ComposePage场景测试(参考testable分支ComposePageScenarioTest):
- CP_001: 空事件→不创建持仓
- CP_002: 单条开仓→创建1条持仓,均价=开仓价
- CP_003: 两条开仓(同标的)→加权均价
- CP_004: 开仓+平仓→平仓扣减数量+产生资金记录

改动(SwapEodPositionService.cs):
- SaveEodPosition改为protected virtual(可override绕过UpdateSwapPosition连库)
- SaveEodPosition内部DbContext.Add替换为PersistEodSwapPosition

StubEodPositionService override 12个虚方法:
FindTrade/FindTradeExtend/FindEodSwapPositions/FindSwapPositions/
FindEodSwap/AddSwapEvent/AddClientCash/SaveEodSwapRecord/
ClearSwapPositionsForCompose/PersistEodSwapPosition/SaveAllChanges/
GetCurrencyRate + SaveEodPosition

验证: 100+4=104全通过(T0/T1=89+DealInterests=7+ConsumedInterest=4+ComposePage=4)。
2026-07-02 08:39:39 +08:00
hjhan 886a4d3ab1 refactor(swap): ComposePage补充接缝-AddClientCash/SaveEodSwapRecord/ClearSwapPositionsForCompose
ComposePage内部还有3处DB依赖需要接缝:
- AddClientCashInCashOut(cs:804平仓资金记录) → AddClientCash虚方法
- SaveEodSwap(cs:862框架合约汇总) → SaveEodSwapRecord虚方法
- ClearSwapPositions(cs:729清理旧事件) → ClearSwapPositionsForCompose虚方法

测试时override这3个虚方法可避免连库。
验证: 100个测试全通过。
2026-07-02 08:34:49 +08:00
hjhan 014edaed45 refactor(swap): ComposePage接缝-7虚方法+DB调用替换(testable迁移)
ComposePage(流水合成持仓)是swap_flow_event→swap_position的核心转换,
每笔开仓/平仓/互换都经过这里(176行)。

新增7个protected virtual虚方法(Seams):
- FindTrade/FindTradeExtend/FindSwapPositions
- FindEodSwapPositions/FindEodSwap
- AddSwapEvent/ExecuteInTransaction

ComposePage内部DB调用替换为调虚方法:
- DbContext.trade.Find → FindTrade
- DbContext.trade_extend.FirstOrDefault → FindTradeExtend
- DbContext.eod_swap_position.Where → FindEodSwapPositions
- DbContext.swap_position.Where → FindSwapPositions
- DbContext.eod_swap.FirstOrDefault → FindEodSwap
- new SwapEventService.AddSwapEventDate → AddSwapEvent
- DbContext.SaveChanges → SaveAllChanges(已有)
- ComposePage可见性private→protected

生产代码行为不变(虚方法默认实现=原逻辑)。
验证: 100个测试全通过(T0/T1=89+DealInterests=7+ConsumedInterest=4)。
2026-07-02 08:28:13 +08:00
hjhan 638803c497 refactor(swap): 阶段1c CalcSwapInterests虚方法接缝(testable迁移)
加1个protected virtual虚方法:
- CalcSwapInterests: 计算利息腿利息明细(原new SwapDealService(this).GetInterests)
  参数与GetInterests完全一致,保证行为不变

将3个分支方法里的'new SwapDealService(this).GetInterests'替换为
调用CalcSwapInterests虚方法:
- SaveAutoEodInterestPosition(自动互换分支)
- SaveAutoEodWithCloseInterestPosition(平仓分支)
- SaveEodInterestPositionCopy(普通日分支)

测试子类override CalcSwapInterests,用StubSwapDealService
(已有89个测试验证)内存算利息,即可测全部4个分支。

验证: 93个测试全通过(T0/T1=89 + DealInterests=4),无回归。
2026-07-01 18:17:47 +08:00
hjhan dc3a6e9f77 refactor(swap): 阶段1b SwapEodPositionService加虚方法接缝(testable迁移)
加3个protected virtual虚方法(Seams接缝),不改变生产行为:
- PersistEodSwapPosition: 持久化eod持仓(原DbContext.Add+UpdateDbOption)
- SaveAllChanges: 保存变更(原DbContext.SaveChanges)
- GetCurrencyRate: 获取汇率(原new EodCurrencyRateService)

将4个利息归档分支方法里的直接DB调用替换为调虚方法:
- SaveEodInterestPosition(互换分支)
- SaveAutoEodInterestPosition(自动互换分支)
- SaveAutoEodWithCloseInterestPosition(平仓分支)
- SaveEodInterestPositionCopy(普通计息分支)

测试子类override这些虚方法即可在内存中运行收盘逻辑,
不连数据库。生产代码行为完全不变(虚方法默认实现=原逻辑)。

验证: GetInterestsUnitTest_T0/T1 89个测试全通过,无回归。
2026-07-01 17:21:56 +08:00
hjhan 3e5a939689 refactor(swap): 阶段1a DealInterests利息归档方法可见性放开(testable迁移准备)
将5个利息腿归档相关方法从private改为protected,不改变生产行为:
- DealInterests(利息腿归档主调度)
- SaveEodInterestPosition(手动互换分支)
- SaveAutoEodInterestPosition(自动互换分支)
- SaveAutoEodWithCloseInterestPosition(平仓分支)
- SaveEodInterestPositionCopy(普通计息分支)

这是testable迁移第一步:先放开可见性让测试子类能调用,
后续阶段再加虚方法接缝(替换DB调用)和迁移合成测试。

参考: refactor-swap-event-testable分支 Seams模式改造
2026-07-01 16:47:26 +08:00