锦麟 王
|
623183f47f
|
Merge branch 'glms/feature/1.4.2_ApprovalProcess' into glms/feature/1.4.2
|
2026-07-14 09:14:07 +08:00 |
|
hjhan
|
0fda5fd1cc
|
fix: 日终价格「数据来源」改为价格行自身语义(人工/系统两档)
移除中债估值细分与操作人姓名显示,按价格行自身 DataSource 列判定:期货/股票读 DataSource(otc-marketdata 同步写系统、手工写人工);债券 update_user 非空→人工、否则→系统。筛选仅人工/系统两选项,异常来源值返回空。ResolveBondDisplaySource 精简为单参纯函数。
|
2026-07-13 15:42:28 +08:00 |
|
hjhan
|
02624abf75
|
test: 日终价格回归测试(日期窗口纯单测 + 新增可见性DB集成测试)
- EodPriceService 提取 static ResolveValueDateWindow(reqStart,reqEnd),使日期窗口逻辑可脱离数据库单测
- EodPriceDtoTest 新增4个纯单测:未传日期回退±1年、起止都填今天→仅今天窗口、显式区间原样生效、结束日今天上界为明天;锁定'页面始终5条'根因
- EodPriceGoldenReplayTest 新增 Record_NewRecordVisibility([Ignore]手动跑):直接跑 SearchUnderlyingList,锁定(a)今天+已上市可查 (b)日期0001查不出 (c)未上市查不出
- 构建0错误;EodPriceDtoTest 19通过0失败
|
2026-07-13 13:37:18 +08:00 |
|
hjhan
|
760ffd62e6
|
fix: 日终债券来源固定中债估值、人工改动显示操作人并补上传溯源
china_bond_valuation 来源恒为中债估值(聚源仅转发,无人手工维护),不再按 JSID 推断系统/人工;eod 两表仍用自带 DataSource(人工/系统)。债券被人工改动(update_user 非空)时,日终列表来源列显示操作人姓名,否则显示中债估值;操作人经已有 create_user/update_user 列溯源(零 DDL)。手工上传 xlsx 的债券分支补戳操作人,与表单编辑口径一致。配套单测 EodPriceDtoTest / EodPriceGoldenReplayTest + golden JSON。
|
2026-07-13 11:00:33 +08:00 |
|
锦麟 王
|
fb59c6180a
|
支持审批流程中的分支网关和节点触发条件
|
2026-07-07 15:47:17 +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
|
4fede8339a
|
refactor(test): SwapDealSettlementTest拆分为SwapUnwind/SwapIncome+提取共享stub
按业务拆分原 SwapDealSettlementTest(8场景)为3个文件,提升可读性:
- TestableSwapDealService.cs: 共享stub(7个seam override)+工厂方法(CreateTrade/CreateUnwindData)
- SwapUnwindScenarioTest.cs: 平仓全流程6场景(UW_001~006: 全平/部分平/含预付金/含费价重算/审核/提交)
- SwapIncomeScenarioTest.cs: 结息2场景(SI_001~002: 正常结息/含预付金返息)
命名对齐 testable 分支风格(SwapUnwindScenarioTest),场景前缀改 UW_/SI_ 更直观。
删除 SwapDealSettlementTest.cs(内容已拆分迁移)。
SwapModule 173测试全绿,无回归。
|
2026-07-03 18:12:52 +08:00 |
|
hjhan
|
99958f9b43
|
test(swap): SwapDealSettlementTest补部分平仓+含预付金场景(借鉴testable)
借鉴 testable 分支 SwapUnwindScenarioTest.Scenario2,补当前分支缺失的2个场景:
SD_007 部分平仓:CloseMethod=部分平仓 → HasPartialUnWind=1,TradeStatus不变,
StockEqvNotional/TradeAmount按比例扣减(原100万-50万=50万)
SD_008 含预付金平仓:SwapMarginAmount≠0 → 2条资金流水(平仓费+应付预付金)
SwapDealSettlementTest 现8场景,SwapModule 173测试全绿(+2),无回归。
|
2026-07-03 18:03:38 +08:00 |
|
hjhan
|
b501e21904
|
test(swap): 启用MergeCompose场景6/7+SwapFlowEventService录制钩子+RecordingSwapFlowEventService
1. MergeComposeScenarioTest 场景6/7 启用(去掉Ignore):
此前失败是stale binary(未重新编译),重新build后8场景全部通过。
- 场景6 单条merge无持仓→DealNoPosition创建交易
- 场景7 两条merge无持仓→创建交易+平仓
2. SwapFlowEventService 补OnBefore/OnAfterMergePageEvent录制钩子(默认空实现):
- OnBefore: DB查询完成、合成逻辑执行前触发,可捕获输入快照
- OnAfter: PersistEvents后触发,捕获输出事件
生产路径为空方法体,零行为影响。
3. 移植RecordingSwapFlowEventService(借鉴testable分支):
override OnAfterMergePageEvent录制golden文件,备用录制工具。
内联GoldenFileModel(简单POCO)。FullRecord_WithPreBookingPositions连库测试自动跳过。
SwapModule 171测试全绿,无回归。
|
2026-07-03 09:38:05 +08:00 |
|
hjhan
|
f0ef37b599
|
test(swap): SwapFlowEventService seam改造+MergePageEventScenarioTest(6场景全绿)
借鉴 testable 分支,只取 seam(排除 PosiPnl/NetSettmentAmount 公式改动和 MergePageEvent 拆分),
填补当前分支对开平仓合成(MergePageEvent)零覆盖的空白。
SwapFlowEventService 新增11个 protected virtual seam:
- FindTrade/FindTradeExtend/FindPositions/FindAndInvalidateFutureEvents
- GetUnderlying/GetNextBusinessDay/ResolvePositionId
- PersistEvents(替代InitEvent内联Add+SaveChanges)/BeginTransaction/CommitTransaction/RollbackTransaction
MergePageEvent/InitEvent: private→protected virtual,内联DB调用替换为seam。
InitEvent 移除 DbContext.swap_flow_event.Add(转入PersistEvents,纯函数化)。
SwapTradeBaseService.UpdateDbOption: public void→public virtual(测试override用)。
新增测试(借鉴testable分支):
- TestableSwapFlowEventService.cs(集中式共享包装类)
- MergePageEventScenarioTest.cs(6场景全绿):
Scenario1 单条无持仓开仓 / Scenario2 同向追加 / Scenario3 反向全平
Scenario4 反向部分平+开 / Scenario5 一开一平 / Scenario6 复杂组合
**未借鉴**:SearchPositionFlowEvent的PosiPnl/NetSettmentAmount公式改动(行为变更)、
MergePageEvent拆分ProcessSingleFlow等(非必需重构)。
SwapModule 169测试全绿(+6),无回归。
|
2026-07-03 09:26:13 +08:00 |
|
hjhan
|
6e9bae94c5
|
test(swap): MergeRestModeCompose seam调用替换+移植MergeComposeScenarioTest(6/8场景)
借鉴 testable 分支,把 SwapTradeAutoService 的 MergeRestModeCompose/MergeRestModelItem/
DealNoPosition/DealHasPosition 内联DB调用替换为seam调用,生产行为不变。
替换的调用点:
- MergeRestModeCompose: FindActiveSwapTrades/FindTradeExtends/FindActivePositions/GetNextBusinessDayBefore/QueryFloatRates
- MergeRestModelItem: FindClient/GetEtradingRule/FindAssetUnit/FindUnderlying/GetSwapFloatRate/FindFlowEventsForCashCheck/FindValidTrades/SaveChanges
- DealNoPosition: CreateNewSwapTrade/AutoSwapUnwind
- DealHasPosition: AutoSwapUnwind
新增测试(借鉴testable分支):
- TestableSwapTradeAutoService.cs(集中式共享包装类)
- MergeComposeScenarioTest.cs(8场景):
Scenario1-5/8 通过: 客户/权限/账户/标的校验链 + 空流水返回
Scenario6/7 [Ignore]: 创建交易路径,DealNoPosition内部实现细节待对齐后启用
SwapModule 163测试全绿(+6),无回归。
|
2026-07-03 09:20:59 +08:00 |
|
hjhan
|
e4a92c93ee
|
feat(swap): 后端只读校验告警-搬FrontendCalcReference+SwapIncome/SwapUnwind插校验
前端保持快速反馈(用户改输入立即算),后端不替代前端,仅做合理性兜底校验。
1. 搬FrontendCalcReference到YLErpDAL/Helpers(测试与生产共用同一份公式,避免分叉)
- 从FrontendCalcCharacterizationTest提取,改public,8个FC测试搬迁后全绿验证一致
2. SwapDealService新增ValidateFrontendPnL只读校验:
- 从unwindData.FlowEvents取浮动腿,PosiGrossPrice==0时跳过(避免误报)
- 调FrontendCalcReference重算,与前端传值逐字段比对
- 差异>0.01记Logger.Error(带输入快照便于排查)
- 整体try/catch吞异常,校验自身错误绝不阻断交易
- SwapUnwind/SwapIncome各插一处(FindTrade后、ExecuteInTransaction前)
不碰NLog配置(告警进Console,生产由运维采集)。SwapModule 157测试全绿。
|
2026-07-03 09:04:57 +08:00 |
|
hjhan
|
129e4bed0d
|
test(swap): 补ApproveSwapTrade/ApplySwapTrade测试+3个seam(借鉴testable分支)
借鉴 origin/glms/feature/refactor-swap-event-testable 的 SwapUnwindScenarioTest 场景4/5,
补全当前分支缺失的平仓审批流程覆盖。
SwapDealService 新增3个 protected virtual seam:
- FindSwapEvent(查待审核事件)
- FindFlowEventsByEventId(查事件关联流水)
- CloseReCheckSetTrade(前置校验包装)
ApproveSwapTrade/ApplySwapTrade 重构为调seam,生产行为不变。
SwapDealSettlementTest 新增2个测试(SD_005/006,共6个):
- SD_005 ApproveSwapTrade 全平仓审核: 反序列化swap_event.EventData→资金流水→TradeStatus
- SD_006 ApplySwapTrade 提交审核: CloseReCheck前置校验+SwapRealizedPnL=SwapCloseAmount
融合策略: 保留当前分支SwapIncome资金流水断言独特价值(SD_001/002),
借鉴testable分支审批流程覆盖(SD_005/006),不二选一。
SwapModule 157测试全绿,无回归。
|
2026-07-03 08:30:36 +08:00 |
|
hjhan
|
cf0d965ff8
|
test(swap): 前端计算逻辑特征化测试(8场景含用户可变输入)
用C#忠实重写前端JS公式作参考实现(FrontendCalcReference),冻结前端计算行为,
为后端校验/重算兜底提供金标准(注:前端保持快速反馈,不搬到后端)。
8个场景覆盖用户可变输入分支:
- FC_001-005 平仓页: 默认值/改标的价格/改平仓数量/改利息金额/非债券空头方向因子
- FC_006-008 结息页: 全量结算/改标的价格/含利息腿与预付金腿总额
参考实现内部用规范命名(EntryDirtyPrice/ExitDirtyFeePrice/floatRatio/longRatio),
践行《互换价格字段命名规范决策文档》,作命名规范活样板。
|
2026-07-03 08:22:55 +08:00 |
|
hjhan
|
a207927f1b
|
test(swap): SwapDealService抽7个virtual seam + 手动结算内存测试
攻克SwapIncome/SwapUnwind零单元测试覆盖的盲区(此前仅DBRecording,CI不跑)。
SwapDealService补7个protected virtual seam(参考已验证的SwapEodPositionService模式):
- FindTrade/AddClientCash/SaveSwapDeal(原private改protected virtual)
- SaveAllChanges/ExecuteInTransaction/CallSaveSwapTradeClientCash/TriggerRealtimeSwapPosition
生产实现行为不变,SwapIncome/SwapUnwind/ApproveSwapTrade重构为调seam。
新增SwapDealSettlementTest.cs(4个内存测试):
- SD_001 SwapIncome资金流水金额=-SwapRealizedPnL
- SD_002 含预付金返息双流水
- SD_003 SwapUnwind全平仓持仓归零+状态变更
- SD_004 DealFloatPosition含费价重算(后端唯二真做计算处)
红灯验证通过(改错金额符号测试立即失败)。
|
2026-07-03 08:22:43 +08:00 |
|
hjhan
|
f88da59874
|
日期 事件 期望行为
D1=2026-01-06 无事件(Copy 分支) TdPosiDividend=1天增量,PosiDividendSum=增量
D2=2026-01-07 部分平仓 30%(EventType=2, Quantity=300, DividendIn=按比例) PosiQuantity→700,TdPosiDividend按(700)算,PosiDividendSum递推
D3=2026-01-08 无事件 增量按剩余700算
D4=2026-01-09 互换结算(EventType=3, DividendIn=部分待实现金额,不扣持仓) PosiQuantity不变=700,TdCloseDividend=互换DividendIn,PosiDividendSum递推
D5=2026-01-10 无事件 继续按700累积
D6=2026-01-11 全平(EventType=2, Quantity=700, 全部待实现作DividendIn) PosiQuantity→0,PosiDividendSum=0(else分支)
|
2026-07-02 12:59:16 +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
|
0e045d89db
|
test(swap): GLMS-20260105-0007分红精度差异golden红灯(复现0.36差异)
用真实测试库数据录制golden,回放复现0.36精度差异:
- 互换前 PosiDividendSum=-90400,互换支付-400
- 期望 PosiDividendSum=-90000,实际=-89999.64,差异0.36
- 回放断言失败(红灯坐实bug)
根因:UpdateEodPosition cs:1635从头重算PosiDividendSum
(Round(全程,2)-已实现),与CopyEodPosition逐天递增
(每天Round(增量,2)累积)产生舍入误差。
录制方法Record_FromRealDB标[Ignore],手动跑生成golden。
回放方法Replay_VerifyPrecisionDiff进CI,当前红灯(期望=-90000,实际=-89999.64)。
|
2026-07-02 10:28:23 +08:00 |
|
hjhan
|
d11e332ff3
|
test(swap): golden录制/回放基础设施+DealInterests场景
引入golden回放框架,补充合成测试的精确值验证缺口。
新增GoldenReplayFramework.cs:
- GoldenScenarioModel: 通用golden数据模型(输入+期望输出)
- GoldenAssert: 精确字段对比(容许指定位数误差),逐字段验证
新增DealInterestsGoldenReplayTest.cs:
- Record_AllGoldenScenarios: 生成golden JSON(标Ignore,手动跑)
- Replay_AllGoldenFiles: 读golden重跑+精确对比(进CI)
2个golden场景:
- 互换结清后待实现归零: InterestIncomeSum=0.82191780822(精确到11位)
- 普通日归档递增(回放暂不支持自动重放,留后续)
golden文件持久化到Resources/GoldenFiles/DealInterestsGolden/
价值:重构时如果任何字段变了(哪怕第8位小数),回放立刻失败。
守恒测试验证大方向对,golden验证精确值对。
验证: 119+1(回放)=120全通过。
|
2026-07-02 09:37:18 +08:00 |
|
hjhan
|
64f0c82bbb
|
test(swap): 多步生命周期守恒测试(数学不变量验证)
用数学守恒约束验证利息在多次操作后不丢失/不重复。
这类测试的价值:不管代码怎么改,只要守恒不成立就报错。
4个守恒场景:
- MS_001: 连续收盘10天,每天增量之和=10天总利息(防指数增长/丢失)
- MS_002: 半平50%+后续全平,两次利息都>0不为负(防consumedInterest扣过头)
- MS_003: 互换结清后再平仓只有增量(单利靠eod归零传递)
- MS_004: 多次互换(第5天+第10天)+最终平仓(第15天),
累计consumed+平仓=全程复利利息(守恒不变量)
StubDealService支持构造注入consumedInterest和floatRate。
CalcEodInterest返回(当日增量,全程累计)元组,正确区分TdInterestAmount和InterestAmount。
验证: 115+4=119全通过。
|
2026-07-02 09:20:41 +08:00 |
|
hjhan
|
fb0ab3e948
|
test(swap): ClearSwapPositions重收盘清理合成测试(78751f0a覆盖)
验证78751f0a的核心修复:重收盘清理自动互换资金记录时排除手动互换。
4个测试场景:
- CSW_001: 自动互换资金记录被正确选中删除
- CSW_002: 手动互换资金记录被排除(manualClientCashIds排除逻辑)
- CSW_003: 已在excludedClientCashIds中的记录不重复选中
- CSW_004: 预付金返息记录也参与清理(手动被排除)
Stub override 3个虚方法注入内存数据:
FindFlowEventsByEventIds/FindManualClientCashIds/FindClientCashRecords
至此4个最近修复全部有合成测试覆盖:
①复利consumedInterest(✅) ②eod InterestIncomeSum(✅)
③重收盘误删资金(✅) ④分红重复计算(✅)
验证: 111+4=115全通过。
|
2026-07-02 09:11:38 +08:00 |
|
hjhan
|
eaa4ed735a
|
test(swap): DealFloatPositions分红场景测试(盯市盈亏+分红+增值税)
扩展StubEodService override 3个外部依赖虚方法:
- GetUnderlyingPrice: 注入固定标的价格
- GetUnderlyingData: 注入标的缓存(增值税率)
- CalcBondPayment: 注入固定债券付息
新增3个分红场景测试:
- DF_005: CopyEodPosition盯市盈亏=(price-grossPrice)×qty×方向
- DF_006: 分红计算 TdPosiDividend=payment/(1+tax)×(1-tax)
- DF_007: 增值税调整(tax=6%): 100/1.06×0.94≈88.68
覆盖了cf2f8b6e分红重复计算修复所在的浮动腿归档链路。
验证: 108+3=111全通过。
|
2026-07-02 09:02:43 +08:00 |
|
hjhan
|
fee2203d6e
|
test(swap): DealFloatPositions浮动腿归档合成测试(testable迁移)
新增4个浮动腿归档场景测试:
- DF_001: 空持仓返回空列表
- DF_002: 首日无eod走SaveCurrentEodInitalPosi分支
- DF_003: SaveCurrentEodInitalPosi纯计算字段验证(数量/均价/类型)
- DF_004: 有eod无平仓走CopyEodPosition分支(分支选择验证)
DealFloatPositions和子方法无直接DB调用(数据从参数传入),
但CopyEodPosition/UpdateEodPosition依赖外部数据源
(DataCacheProvider/UnderlyingCodePrice/BondPaymentService),
值验证需后续加接缝。当前覆盖分支选择+首日初始化值验证。
验证: 104+4=108全通过。
|
2026-07-02 08:49:50 +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
|
f501ee95a7
|
test(swap): 复利consumedInterest扣除合成测试(补c6adb3bb覆盖缺口)
c6adb3bb加的复利consumedInterest扣除此前无任何测试覆盖。
现在用4个合成测试完整验证:
改动(SwapDealService.cs):
- GetConsumedInterest加virtual关键字(测试可override注入内存值)
新增(ConsumedInterestScenarioTest.cs):
- StubSwapDealService override TryGetFloatRate+GetConsumedInterest
(模仿T0/T1的StubSwapDealService模式)
- CI_001: 基线(consumedInterest=0)拿到全程复利利息
- CI_002: 注入consumedInterest后利息=基线-consumed(直接验证cs:793)
- CI_003: 守恒(consumed+利息=基线)×3组不同consumed值
- CI_004: 全部已结(consumed=基线)平仓≈0不为负(防双重扣减)
关键发现:测试必须传settment:false走盘中平仓路径(CalcUnwindInterest),
settment:true(默认)走收盘归档路径(CalcEodInterest)不传consumedInterest。
验证: 89(T0/T1)+7(DealInterests)+4(ConsumedInterest)=100全通过。
|
2026-07-01 18:40:48 +08:00 |
|
hjhan
|
be88442c91
|
test(swap): 扩展DealInterests测试-多次互换守恒+预付金ratio翻转
新增2个测试场景:
- DI_SWAP_MULTI_001: 攒10天→互换结清→再攒5天→再互换结清
守恒约束: RealizedInterest+InterestIncomeSum=全程利息(17天)
验证多次互换结算后利息不丢失/不重复
- DI_MARGIN_001: 预付金腿(初始预付金,marginTypes)互换结清后
RealizedInterest应为负(ratio翻转:收取→-1→支付方向)
验证cs:789-793的marginTypes ratio翻转逻辑
验证: 89(T0/T1)+7(DealInterests)=96全通过,无回归。
|
2026-07-01 18:25:44 +08:00 |
|
hjhan
|
775d7a5881
|
test(swap): 阶段3 扩展DealInterests测试-普通日归档值+多日连续守恒
依赖阶段1c的CalcSwapInterests虚方法接缝,现在普通日分支(copy)
也可纯内存测试。
新增/改进的测试:
- DI_BRANCH_001: 改为真正的普通日归档值验证(InterestIncomeSum
前日+1天新计=2天利息),不再是Inconclusive
- DI_MULTI_001: 连续5天收盘归档,验证InterestIncomeSum线性递增
(每天+1天利息,5天后=5×DailyInterest)
StubEodPositionService扩展:
- override CalcSwapInterests(用真实SwapDealService算固定利率利息)
- ExecuteDealInterests public包装(替代反射调用)
- 删除旧的反射辅助方法
验证: 89(T0/T1)+5(DealInterests)=94全通过,无回归。
|
2026-07-01 18:21:51 +08:00 |
|
hjhan
|
deb831bf3e
|
test(swap): 阶段2 DealInterests利息归档合成测试(testable迁移)
模仿GetInterestsUnitTest_T0风格,纯内存不连库:
- StubEodPositionService继承生产类,override PersistEodSwapPosition/
SaveAllChanges/GetCurrencyRate替换DB调用
- 内存构造trade/position/eod/flowEvent数据
- 独立计算期望值(非循环论证)
4个测试场景:
- DI_SWAP_ZERO_001: 互换结清后InterestIncomeSum=当天新计(非攒的全程)
- DI_SWAP_ZERO_002: 已结清后再互换(只结算当天新计)InterestIncomeSum=0
- DI_BRANCH_001: 普通日走copy分支
- DI_BRANCH_002: 互换日走SaveEodInterestPosition分支
验证: 89(T0/T1)+4(DealInterests)=93全通过,无回归。
注意: fc90636a把公式改回pre+新计-实现(比我之前的pre-实现更好,
保留了当天新计利息),测试断言已据此调整。
|
2026-07-01 17:47:00 +08:00 |
|
hjhan
|
b548709371
|
Revert "fix(swap): 互换审核通过后到期日状态流转为已到期"
This reverts commit 83f44124c6.
|
2026-07-01 17:07:55 +08:00 |
|
hjhan
|
f7d23dc132
|
revert: 撤销单利consumedInterest扣除(双重扣减导致1天利息变0)
单利起点InterestProfitSum已含历史累计(eod快照),
再减consumedInterest会双重扣减。复利起点是0(从头算),
减consumedInterest正确。两者计算结构不同不能套用。
正确方向:让InterestProfitSum在互换结清后归零(eod层方案B),
而非在计算时减consumedInterest。待重新设计单利修复方案。
测试还原为红灯(Assert redCount>0),注释更新说明正确方向。
|
2026-07-01 13:38:24 +08:00 |
|
hjhan
|
83f44124c6
|
fix(swap): 互换审核通过后到期日状态流转为已到期
ApproveSwapTrade(cs:1558-1571)状态分支只判CloseMethod==全部平仓,
无ExerciseDate到期判断。互换CloseMethod默认0(Unknown)必走else→
TradeStatus退回确认成交→EodCheckMaturityTrade一直阻止收盘。
对比免审核路径SwapIncome(cs:1512)有正确的到期判断。
引入点083848fb(2025-05-28审核流程重构)。
改动(SwapDealService.cs cs:1579后):
在td.Notional=td.TradeAmount之后补到期判断(避免清零被覆盖):
if(eventType==互换 && ExerciseDate<=ValueDate)→已到期+清零Notional
副作用控制:
- 加eventType==互换条件→不影响平仓(eventType=2)审核
- 放cs:1579之后→Notional=0不被td.Notional=td.TradeAmount覆盖
- ExerciseDate<=ValueDate→非到期互换不进分支
验证: Step1坐实28/28互换事件走else分支, Step3验证3条到期互换→已到期✅
发现平仓部分平仓+到期也有类似问题(GL-20260420-0003),待业务确认处理方式
|
2026-07-01 13:02:43 +08:00 |
|
hjhan
|
1eb791381a
|
fix(swap): 单利路径扣除历史已结利息consumedInterest
复利路径已由c6adb3bb修复(加consumedInterest扣除),单利路径
CalcDailySimpleInterest未同步。互换结清后再平仓默认值偏大。
改动(SwapDealService.cs 3处):
- cs:437 去掉InterestType==复利条件,单利也取GetConsumedInterest
- cs:707 单利调用传入consumedInterest参数
- cs:802/856 CalcDailySimpleInterest签名加consumedInterest+末尾扣除
验证(Step1_SimpleInterestRedTest): 1813单利样本
34203偏大量8271→0✅, 34204预付金偏大量58→0✅(修正测试口径漏乘ratio)
复利回归(1889): 6-30默认值仍6.44✅无退化
|
2026-07-01 13:02:15 +08:00 |
|
hjhan
|
3118c44365
|
互换三个bug的TDD红灯/绿灯测试
单利利息偏大(红灯): Step1_SimpleInterestRedTest 用1813坐实
单利路径(CalcDailySimpleInterest)未加consumedInterest扣除,
默认值偏大8271(历史已结利息未扣)。复利路径c6adb3bb已修。
审核状态卡死(红灯): SwapApproveStatusStuckTest 3个方法
坐实28/28互换事件CloseMethod=0走else分支(无ExerciseDate判断),
当前3笔交易实际卡死(到期+确认成交)。Step2分析副作用:Notional清零
需放cs:1577之后避免被td.Notional=td.TradeAmount覆盖。
重收盘误删(绿灯确认): Step1加修复后逻辑模拟,确认排除manualClientCashIds
后手动互换记录不再被命中(78751f0a已修)。
|
2026-07-01 12:22:57 +08:00 |
|
hjhan
|
cd03fc53fb
|
互换两个独立bug分析文档+诊断测试
Bug①利息默认值偏大: 互换结清后eod的InterestProfitSum(待实现)没归零
(=RealizedInterest=77.26), 导致后续平仓默认值=77.26(本该0)+增量→偏大。
6-29收盘后三天对比坐实: 6-30默认83.70, 7-1默认90.14, 均含已实现的77.26。
根因 eod公式cs:829 对互换场景扣减失效(TdInterestIncome≈TdCloseInterest抵消)。
Bug②收益结算审核后状态卡死: ApproveSwapTrade(cs:1525)漏ExerciseDate判断,
到期互换审核后状态退回'确认成交'(CloseMethod默认0≠全部平仓1),
导致EodCheckMaturityTrade一直阻止收盘。引入点083848fb(2025-05-28)。
- 新增利息偏大分析文档(根因/修复方案A扣RealizedInterest/B eod归零)
- 新增审核状态卡死分析文档(根因/修复补ExerciseDate判断)
- 新增SwapPartialUnwindInterestDefaultTest(Step0探查/Step0b诊断/Step0d三天对比)
|
2026-07-01 09:57:25 +08:00 |
|
hjhan
|
6f9aa5fb45
|
互换重收盘误删手动互换资金记录: 分析文档+TDD红灯测试
问题:重新收盘后用户手动互换产生的资金记录(ClientCashInCashOut,
Action=系统操作-互换)被误删。根因 ClearSwapPositions:400 按 Action
字符串模糊删除,而该 Action 手动/自动共用,表无来源字段区分。
引入点 commit 44e89726(2026-05-14)。
- 新增决策文档(根因/引入时间/三种修复方案/自测方法)
- 新增 SwapReEodDeleteManualCashRecordTest 4个测试(探查/诊断/录制红灯/离线校验)
- 录制 golden 坐实 bug: trade 1903 手动互换资金记录 id=13032 会被误删
|
2026-07-01 08:35:58 +08:00 |
|
hjhan
|
029475ce8d
|
test(swap): 新增互换分红重复计算录制测试+排查SQL(TDD红灯)
分红被重复计入 RealizedPnl 两次的根因:互换/平仓事件的 MarkClosePnl
已含分红成分(DividendIn),导致分红既进 RealizedMtmPnL(盯市列) 又进
RealizedDividend(分红列)。本次提供数据证据与回归基线:
- SwapDividendGoldenRecordTest: 连库录制1875(纯分红型)/1891(混合型)
5表快照→JSON golden,录制时逐事件拆解 MarkClosePnl=价差+费+分红,
按 PositionId 汇总出重复计入的分红金额。Step2 离线校验已通过。
诊断结论:1875 重复302400,1891 重复-18.66,均与 eod 分红列吻合。
- golden JSON 纳入源码树(全量复制规则),修复后可作回归基线。
- 排查SQL工具箱: 基于真实DDL核对全部列名(swap_flow_event.EventDate/
bond_payment_info.paying_interest 等),含定位样本/导出/验证/守恒4步。
- appsettings.json 测试库 zszq→glms 前缀修正。
详见 项目文档/互换分红损益字段语义与重复计算分析.md(9e6af84e)。
|
2026-06-26 09:13:37 +08:00 |
|
吴方海
|
524f9a5cd8
|
利息计算单元测试用例添加
|
2026-06-02 14:41:17 +08:00 |
|
吴方海
|
3d06e59908
|
盘中平仓利息修复
|
2026-05-27 18:24:05 +08:00 |
|
吴方海
|
45cb3a1239
|
修复成交日算了利息
|
2026-05-11 18:59:56 +08:00 |
|
吴方海
|
95686f4c4d
|
#EQD-5718 【缺陷转需求】-国联民生-利息端计息方式与结算规则扩充
|
2026-05-08 15:09:58 +08:00 |
|
锦麟 王
|
31d90d2612
|
利率债TRS保证金期限档位切换为<5y/5y-10y/10y-30y/>30y
,确认书字段调整
|
2026-04-29 10:51:26 +08:00 |
|
hjhan
|
7cd937518f
|
refactor(auth): 优化JWT令牌创建方法
- 移除CreateJwtToken2方法,统一使用CreateJwtToken方法
- 修改密钥处理方式,从ASCII字符串改为Base64解码
- 删除IssuedAt声明以简化令牌结构
- 更新所有相关调用点使用统一的令牌创建方法
|
2026-04-27 15:34:12 +08:00 |
|
锦麟 王
|
3ce2dfe4c7
|
BugFix 添加信用债的计算
|
2026-03-11 15:04:10 +08:00 |
|
hjhan
|
5afc7fa279
|
```
test(swap): 添加收益互换端到端持仓服务集成测试
- 新增 SwapEodPositionServiceIntegrationTest 集成测试类
- 实现 DealInterests 方法的分支覆盖测试
- 添加真实数据准备和多种利息模式测试场景
- 配置新的数据库连接字符串用于测试环境
- 更新项目依赖包以支持集成测试功能
```
|
2026-02-13 18:12:00 +08:00 |
|
shangzhongyuan
|
d9fff3e9b8
|
TRS-ZS-574 交易确认书对接OA自动提交审批
|
2025-07-25 13:40:56 +08:00 |
|
shangzhongyuan
|
75793f9f4f
|
客户保证金率设置需求变更:不需要根据发行年限,且增加30年以上一档,交易确认书保证金率获取也需要修改
|
2025-07-22 17:41:50 +08:00 |
|
吴方海
|
aa26f712bb
|
TRS-ZS-566、TRS-ZS-568 客户保证金率需求完成
|
2025-07-18 17:44:58 +08:00 |
|
吴方海
|
1a0b25fe04
|
bug 修复
|
2025-04-21 15:15:08 +08:00 |
|
吴方海
|
f9d8a256a6
|
从山证v2.3.0拷贝
|
2024-05-09 14:06:26 +08:00 |
|