张名锐
|
0e2aaa57b2
|
Merge branch 'glms/feature/0812_zmr_divPower' into 'glms/feature/1.4.2'
fix(swap): 修复公司行为事件生命周期管理问题
See merge request otc-dev/zszq-trs!15
|
2026-08-25 09:59:30 +00:00 |
|
张名锐
|
aa87d69999
|
fix(swap): 修复公司行为事件生命周期管理问题
- 添加了股权登记日日期格式化显示功能
- 实现了公司行为类型的动态描述逻辑(配股、送股、拆分、分红)
- 新增了过滤待生效公司行为事件的操作历史机制
- 修正了操作历史中隐藏未应用公司行为事件的逻辑
- 完善了公司行为事件原因描述的构建方法
- 添加了针对不同公司行为类型的单元测试验证
|
2026-08-25 17:58:51 +08:00 |
|
张名锐
|
147bcf4bf7
|
Merge branch 'glms/feature/0828_EQD-7084' into 'glms/feature/1.4.2'
feat(eodswapposition): 新增框架合约新口径展示功能
See merge request otc-dev/zszq-trs!14
|
2026-08-25 07:40:56 +00:00 |
|
张名锐
|
76a491a388
|
Merge branch 'glms/feature/0812_zmr_divPower' into 'glms/feature/1.4.2'
refactor(swap): 统一债券价格处理逻辑
See merge request otc-dev/zszq-trs!13
|
2026-08-25 07:39:53 +00:00 |
|
张名锐
|
f7766fb723
|
fix(dividend): 公司行为优化
- 债券付息查询/BondPayment/BondPaymentList这个界面 不再查询公司行为除权表
- 公司行为事件的说明 格式化一下变为:调整前:名义本金:XXXX 期初标的价格:XXXX 持仓数量:XXXX
调整后:名义本金:XXXX 期初标的价格:XXXX 持仓数量:XXXX
- 报错信息修改:当某个标的的除权除息数据仍有交易引用时
则修改标的公司行为数据时则提示“不可修改,有交易【交易编号】使用了该条除权除息数据”。
|
2026-08-25 15:39:01 +08:00 |
|
张名锐
|
7d0eb16f64
|
feat(eodswapposition): 新增框架合约新口径展示功能
- 在EodPnlCalculator中添加CalculateEodSwapRiskNewFields方法,实现新口径计算逻辑
- 创建EodSwapRiskNewFields和EodSwapRiskNewResponse模型类,支持新的展示字段
- 实现SearchEodSwapNewList查询方法,复用旧查询权限控制并计算新字段
- 添加index=3的新框架合约Tab页面,使用独立查询接口和列配置
- 前端JavaScript中实现colModelGridEodSwapNew列模型,替换旧字段并新增9个字段
- 完善导出功能支持新Tab的标准格式导出,保持与旧口径分离
- 更新测试用例验证新框架合约前端接线正确性
|
2026-08-25 13:49:30 +08:00 |
|
锦麟 王
|
c35befbe8f
|
#EQD-6948 国联民生-实现保证金规则(2)追保金额的产生与收盘计算 收盘计算和授信占用
|
2026-08-24 16:34:18 +08:00 |
|
张名锐
|
657c44b8f4
|
refactor(test): 优化自动互换测试中的流水事件持久化逻辑
- 移除多余的 PersistFlowEvent 方法重写
- 更新 PersistedFlowEvents 属性实现以直接使用 FlowEvents
- 添加详细注释说明测试接缝的设计意图
- 简化测试代码结构提高可维护性
|
2026-08-21 17:28:09 +08:00 |
|
张名锐
|
8efb468c56
|
Merge branch 'glms/feature/1.4.2' into glms/feature/0812_zmr_divPower
|
2026-08-21 09:50:12 +08:00 |
|
hjhan
|
640c78b5a9
|
refactor(swap): EQD-6977 trace可读性第二批:①②与p{id}语义化——承接①→已并复利本金(capitalized)、②→段内已计利息(carryIn),日志/类头注/方法注/测试断言四处同步,运维凭日志即知两承接量含义;SwapDealService×12+SwapEodPositionService×1的p{position.id}统一改融资腿{position.id}(FIX GetFloatRate/Resolve/Segments/EodCloseRefix全系列);测试断言同步更新(此前漏查到一处trace断言已一并改);27/27罚息单测通过,Swap全套644例中仅2例DB依赖失败(干净树复验为既有环境问题)
|
2026-08-21 08:54:47 +08:00 |
|
hjhan
|
6e76f1c10d
|
fix(swap): EQD-6977 无preEod兜底①=0且账龄超重置周期补退化告警trace——interestWindowEmpty(当日已结息)早退不重放覆盖种子值时①静默0(重置日分支本有同类告警,段中分支漏)复利每周期并本理应①>0;trace含事件基数/平仓本金两侧对比值+账龄天数+重置周期+疑似成因指向(interestWindowEmpty种子未重放/日终归档缺失)足够事后定位根因;承接块抽为ResolveCompoundCarry私有纯方法(Merge瘦身,三分支数据契约注释随行,行为零变化);TDD先行3例trace钉子:退化必告警(先红)/兜底>0不告警/真首日不告警;罚息域27例+GetInterests入口语义9例全绿
|
2026-08-21 07:10:04 +08:00 |
|
hjhan
|
8b66875098
|
test(swap): EQD-6977 罚息兜底补share<1恒等式用例——50%平仓+无preEod场景钉merger复刻GetInterests本金口径的接缝(标的期初全价CalcNotional=posiNotional×closePercent vs 重放基数按closePosiNotionalValue缩放);现有用例全closePercent=1m,两处口径若有偏差在share=1下不可见、share<1时①混入本金差;变异验证:CalcNotional临时忽略closePercent唯此用例红(1败7过)证明鉴别力;RunFee加closePercent参数默认1m存量调用零影响
|
2026-08-21 07:09:57 +08:00 |
|
张名锐
|
039415d44c
|
fix(swap): 修复股票基金类互换合约平仓时公司行为处理逻辑
- 优化 FindFundCorporateActions 方法,明确查询范围为严格大于 eodDate 的开区间,并添加日志记录
- 重命名 TryRestoreEffectiveFundPosition
|
2026-08-20 17:31:02 +08:00 |
|
张名锐
|
582cb2c7c5
|
Merge branch 'glms/feature/1.4.2' into glms/feature/0812_zmr_divPower
# Conflicts:
# YLErpDAL/Modules/EodModule/BondPaymentService.cs
# YLErpDAL/Modules/SwapModule/SwapDealService.cs
|
2026-08-20 16:21:13 +08:00 |
|
张名锐
|
ff7e540084
|
refactor(swap): 优化基金公司行为处理逻辑 - finished001
- 修改 FindFundCorporateActions 方法以支持查询跨日期范围的公司行为记录
- 实现按生效日期和ID顺序稳定排序的多条公司行为记录处理
- 更新平仓时基金基线恢复逻辑以正确处理跨多个生效日的场景
- 在测试类中重写 FindFundCorporateActions 方法以支持单元测试验证
- 添加完整的跨非交易日公司行为恢复功能测试用例
|
2026-08-20 16:10:56 +08:00 |
|
hjhan
|
286a834aa5
|
fix(swap): EQD-6977 无日终快照时承接①兜底取事件基数——复利重放把 normalEvent.InterestPrincipal 写为末次并本金后基数(=被平份额本金+①),同为实际值;UAT实测(无快照+已有8/19重置)原①=0少算≈3.17元已消除;重置日+无快照退化场景补告警trace;新增兜底路径恒等式测试(23/23)
|
2026-08-20 16:09:43 +08:00 |
|
hjhan
|
d6646f9c90
|
fix(swap): EQD-6977 重置日当天平仓承接①修正——快照基数还是上一段的,须改取 InterestIncomeSum(昨日全部待实现于今日并入);新增边界矩阵测试:重置日当天(算尾/不算尾)/重置日前一日/到期日=重置日/锚点偏离(延期腿)/起息日当天,恒等式 22/22 全绿
|
2026-08-20 15:46:57 +08:00 |
|
hjhan
|
ffffe842c6
|
fix(swap): EQD-6977 罚息精确续接落地——承接量改用实际计息状态(preEod基数+事件实结,弃冻结重放)、锚点统一PosiStartDate、罚息并入既有利息流InterestFee(去独立事件/去is_penalty_interest列及DDL/回退closeList与EOD两处守护)、接缝加eventType==平仓守卫、trace逐腿全程落盘、新增多区间不同定盘恒等式测试(旧冻结重放实现必挂)
|
2026-08-20 15:11:33 +08:00 |
|
hjhan
|
09660fffea
|
test(swap): EQD-6977 同步金标准测试——删除CalcPenalty valueDate具名实参
|
2026-08-20 13:37:26 +08:00 |
|
张名锐
|
b2f4e16782
|
feat(bond): 支持股票和基金现金分红纳入债券支付计算 - 收紧过度开发行为
- 实现股票/基金现金分红数据从 ex_dividend_info 同步到 BondPayment
- 新增公司行为去重机制,避免镜像任务完成后重复计息
- 统一现金分红存储口径为"每 10 份派现金额",保持与同步任务一致性
- 修改 CalcPayment 方法,股票/基金分红需除以 10 转换实际现金金额
- 添加单元测试验证债券票息和股票/基金分红的不同计算方式
- 更新文档注释说明"每 10 份派现金额"存储规范
- 修复公司行为生效日处理逻辑,确保正确应用除权系数
- 扩展测试覆盖股票类证券的公司行为处理场景
|
2026-08-20 13:30:36 +08:00 |
|
hjhan
|
bb8130698f
|
test(swap): EQD-6977 罚息接缝 headless 单测——固定/浮动腿追加 IsPenaltyInterest 标记 + 承接恒等式(全期=已结+罚息)
|
2026-08-20 13:23:12 +08:00 |
|
hjhan
|
ed86402aba
|
test(swap): EQD-6977 罚息契约钉死——金标准恒等式(全期=已结+罚息,含不算尾/中段平仓双承接量) + 边界四象限 + 部分平仓 + 冻结取率规则
|
2026-08-20 11:51:25 +08:00 |
|
hjhan
|
d1985231ee
|
feat(swap): EQD-6977 复利纯函数支持 carryInInterest——窗口前已结利息随首个重置日资本化并持续留在基数(与全窗口重放轨迹严格一致);默认0零行为变化,含数学不变量测试
|
2026-08-20 11:43:27 +08:00 |
|
张名锐
|
aa3548e77f
|
feat(bond): 支持债券与股票基金公司行为现金流计算的差异化处理 - init2
- 修改 CalcPayment 方法添加 useBondPriceScale 参数区分债券和股票/基金的金额计算口径
- 债券利息按每100元面值票息通过BondPriceConverter转为入库金额,股票基金分红直接计算
- 在BondPaymentService中添加详细的参数说明文档注释
- 更新SwapDealService中分红计算逻辑,根据标的类型自动选择合适的金额转换方式
- 新增CorporateActionEventLifecycleTest单元测试验证公司行为事件生命周期管理
- 添加SplitCorporateActionTddTest测试验证拆合股功能
- 优化FundCorporateActionRollbackAndUnwindTest扩展到股票类型测试
- 更新前端OperationHistory页面表格列宽和显示格式支持更长的说明信息
|
2026-08-19 17:48:34 +08:00 |
|
hjhan
|
952295a78a
|
fix(fr007): 界面手工录入定盘精度 4→6 位——1.4150% 不再被截成 1.4200%
UAT 实测发现(EQD-6968 测试期间):录入 1.4150 落库变 0.0142。两层拆解:
- ÷100 为设计(界面按百分数录入,SwapflowList.js toNumber(value/100,6) 已传 6 位)
- Math.Round(price,4) 为精度截断:FR007 官方发布百分数下 4 位=小数 6 位,
4 位舍入只保百分数下 2 位,丢 0.5bp(1 亿本金 7 天约 96 元)
修复:抽 RoundFr007Price(6位) 替换三处 Round(,4),与前端 6 位对齐;
DB 列 double(18,10) 已验证容纳;bond-sync 自动同步链(BigDecimal 全精度透传)
不经此路径零影响。已截断的历史行(如 2026-08-19 的 0.0142)不自愈,需重录。
附带修复 GLMS20260819Fr007TradeDiscoveryTest 编译错误:@"" 逐字字符串内
应用 "" 转义、UnderlyingCode→FutureContractId(实际列名)、EF6 Database.Connection
→ EF Core GetDbConnection()。
验证:SwapFlowFr007EntryPrecisionTest 2/2;全量 985 例 145 败与基线 diff=0
|
2026-08-19 14:29:16 +08:00 |
|
hjhan
|
43fb83ed00
|
refactor(swap): relaxedFixingFromDate 改名 exclusionStart——名实归位
该参数诞生于"有价则取/缺价回退"口径(55363e9f 由 exclusionEndDate 改名而来),
自洽化(fafae5ca)后排除日一概不取价,"放宽取价"语义已不存在——名字回到
排除区间本义,并与 FIX 日志既有用词"排除起点"对齐:
- BuildSegmentRates/CalcDailyCompoundInterest/CalcDailySimpleInterest 三签名
+ 全平重放传参点 + 方法摘要补 exclusionStart 参数语义文档
零行为变更。
验证:内存套件 113/113;全量 981 例 145 败与基线 diff=0
|
2026-08-19 11:41:18 +08:00 |
|
hjhan
|
f8049f81f8
|
refactor(swap): InitInterestDate 删除死子句 td.StartDate>interestStart + 触发场景注释归因修正
分析定谳:interestStart 经三条赋值路径(=开始日/不算头+1天/preSettleDate 且仅当
≥interestStart 才覆盖)恒 ≥ td.StartDate,第二 OR 子句恒 false——死代码删除。
注释归因同时修正两侧旧错误:
- 原注释把"不算头首日"笼统挂在返回 true 上——实际由第一子句
interestStart>interestEnd 兜住(StartDate+1>StartDate);
- 候选修正案"观察日当日已结息(preSettleDate 覆盖窗口末)"亦不精确——日期相等
时函数返回 false,当日已结息的利息归零在 GetInterests closeList 净额层;
只有相等叠加到期日不算尾回拨(endDate-1)才严格大于而触发。
新增三条 InitInterestDate 直测钉边界:不算头首日空窗/同日已结息日期相等非空/
同日已结息+到期日回拨空窗。
验证:GLMS20260817Fr007UnwindMorningTest 36/36;全量 981 例 145 败与基线 diff=0
|
2026-08-19 11:36:53 +08:00 |
|
hjhan
|
7b70030216
|
test(swap): 补快照利率携带契约——单利+不算头+有preEod 盲区定谳
该组合此前零覆盖。定谳结论:带 preEod 时 fetchAfter=preEod.ValueDate +
seed=preEod.FloatRate 是设计分工(≤上一日终的重置日沿用快照携带利率,>的重新
取价),与无日终场景的根本区别是种子有正确来源——开始日EOD因窗口为空走正常
取价,快照 FloatRate=开始日定盘(链条起点),并非旧 bug 复发。
- CarryForward_Simple_NoHead_PreEodAtStartCarriesFirstPeriodRate:
preEod{ValueDate=开始日, FloatRate=开始日定盘} → PricedDates=0(不重复取价)、
事件利率=快照利率、金额=上日待实现+3天×(spread+快照利率) 精确断言
- Eod_NoHead_StartDay_SnapshotRateCarriesFirstFixing:开始日EOD("00",窗口
为空)→快照利率=首重置日定盘,钉死携带链条起点
Run 扩展:Outcome 暴露 Svc(取价审计) + BuildPreEod 支持指定利率。
验证:GLMS20260817Fr007UnwindMorningTest 33/33;全量 978 例 145 败与基线 diff=0
|
2026-08-19 11:31:19 +08:00 |
|
hjhan
|
decbd83d0b
|
refactor(swap): 误导布尔 swap 改名 interestWindowEmpty——按"计息窗口为空"本质命名
InitInterestDate 返回 true 的语义是"计息窗口为空→不计利息"(利率与金额归零),
判定只看日期窗口(interestStart>interestEnd)、与事件类型无关;旧名 swap 把
典型原因(互换当日已结息)当成了效果的名字,读者会误读为事件类型判断。
- SwapDealService: GetInterests 局部变量 + GetFloatRate/CalcUnwindInterest/
InitSwapDealInterest/CalcMarginInterest 四个签名参数及分支/日志/注释同步
- SwapTradeBaseService.InitInterestDate 返回值语义补入 XML 文档
- MarginInterestGoldenReplay/Shadow 测试命名参数同步
零行为变更。
验证:相关套件 51/51;全量 978 例 145 败与基线 diff=0
|
2026-08-19 11:31:03 +08:00 |
|
hjhan
|
6e2cae7c1f
|
test(swap): EQD-6968 自洽化契约钉死——事件利率确定性+快照再定盘载体+CI_007/008 新口径
- Determinism_NoTail_EventFloatRateIndependentOfPublishTime:尾日价缺(上午) vs
有(下午)两世界,金额与事件 FloatRate 完全一致(=末段已消费利率0.01425)
- CloseOnly_平仓日为重置日_剩余持仓快照再定盘(+非重置日反例):经 DealInterests
真路由断言快照 FloatRate=当日新定盘(RefixCalls 计数)——载体职责显式化验收
- CalcFirst 用例去掉 closeRate 免疫 hack:priorValueDate 根治后首重置日恒取价
- CI_007 更名+断言翻转:平仓日=重置日+不算尾 → 事件利率=末段已消费利率(旧);
原断言(取新定盘)正是被替换的旧口径契约,根因注释留痕 GLMS-JIATT-20260805
- CI_008:本金结转断言保留,利率断言改为末段旧利率
验证:ConsumedInterestScenario 9/9、InterestEodTailSnapshot+Fr007 36/36、
全量 976 例 145 败与基线 diff=0
|
2026-08-19 11:07:10 +08:00 |
|
hjhan
|
e779347488
|
test(swap): EQD-6968 补到期日当天全平补计分支——replayEndDate+1 的尾日取价豁免
relaxedFixingFromDate 的存在理由回归钉死:不算尾时 InitInterestDate 回拨
endDate 一天,最终全平的历史差分重放需补回真实平仓日(replayEndDate=endDate+1),
该边界日定盘经 relaxedFixingFromDate 走"有价则取/缺价跳过"——
否则到期日上午全平被尾日价误拦(EQD-6968 在到期日当天的镜像场景)。
- FinalClose_OnMaturityDay_NoTail_...Succeeds:不算尾+到期日缺价 → 放行
- Guard_FinalClose_OnMaturityDay_Tail_...StillThrows:算尾+到期日缺价 → 仍拦
注:全平重放分支 relaxedFixingFromDate 恒非 null(Red_Compound_FullClose_WithPreEod
已覆盖),本提交补的是 endDate<valueDate 时的 +1 补计子分支。
验证:GLMS20260817Fr007UnwindMorningTest 30/30 内存全绿
|
2026-08-19 10:53:34 +08:00 |
|
hjhan
|
bf2adf0fae
|
test(swap): EQD-6968 补 EOD 收盘归档取价链——此前 settment=true 零覆盖
EOD 不取尾日价靠两道闸:InitInterestDate 到期日回拨(endDate=D-1) +
CalcEodInterest calcToday=false(到期日且不算尾)跳过 ByEod 重算——ByEod 的
isResetDay→ResolveFloatRate 不看 calcLast,任一环回归即到期日收盘重新索要尾日价。
- Eod_NoTail_MaturityDayFr007Missing_Succeeds:不算尾+到期日(重置日)缺价 → 放行
- Eod_Tail_MaturityDayFr007Missing_StillThrows:算尾+到期日缺价 → 仍拦
- Eod_MidTradeResetDayFr007Missing_StillThrows:非到期重置日缺价 → 仍拦
(盘中重置日新利率被持续持仓消费,ByEod 取价链是真实依赖,不算尾也不豁免)
验证:GLMS20260817Fr007UnwindMorningTest 28/28 内存全绿
|
2026-08-19 10:53:34 +08:00 |
|
hjhan
|
4d68133dcb
|
test(swap): EQD-6968 补不算头不算尾(00)组合——CalcFirst=false 零覆盖盲区
- Red_Compound_NoHeadNoTail:00+缺平仓日价 → 放行(calcLast 同 false,与 10 同口径)
- CalcFirst_Simple_NoHeadDropsExactlyStartDayInterest:单利下 00 与 10 利息差
恰好=开始日一天利息(精确断言,钉 CalcFirst 回归)。closeRate 取 7/6 定盘同值,
免疫既有取价细节——排查中发现:无日终快照+00 时 fetchAfter=interestStart-1 会
跳过开始日取价、首段利率用种子(GetFloatRate 回写的尾日定盘),与 10 的
fetchAfter=开始日-1 不同(FIX 日志可复现,niche 场景:首个日终前平仓)。
Run 运行器扩参:settment / exerciseDate(供后续 EOD 与到期日用例)。
验证:GLMS20260817Fr007UnwindMorningTest 25/25 内存全绿
|
2026-08-19 10:53:34 +08:00 |
|
hjhan
|
54c4bf21c6
|
test(swap): PrevBizDay 用例对进程内 QDP 日历状态脱敏(修全量运行偶发红)
全量运行实测:其他用例会把 QDP "chn" 日历替换为"全营业日"退化态
(GetNonHolidayDefore(7/19)=7/19 不再回拨周五),三个 PrevBizDay 放行用例
单跑绿、全量红(取价日 7/19 不在市场)。生产库恒有真实日历无此问题。
- Fr007MarketPrevBizDay 同时供回拨日(7/3、7/10、7/17)与退化日(7/5、7/12、7/19)
两套价——被测对象是取价放宽语义,不是日历本身;
- FixingDayMissing 守卫同时扣 7/17+7/19,两种日历态下都缺价仍拦。
验证:套件 23/23;全量 960 例 145 败与改动前基线失败名单 diff=0,11 个新用例全绿
|
2026-08-19 09:44:59 +08:00 |
|
hjhan
|
7cfa85a7cc
|
test(swap): EQD-6968 补前一营业日基准组合+算尾非重置日放行(方案一场景2/3落格)
- PrevBizDay_TailCalced×2:算尾(11)+rule=-1+当日(7/20)未发布 → 放行(取价日回拨至7/17已发布)
- PrevBizDay_NoTail:不算尾(10)+rule=-1+当日未发布 → 放行
- PrevBizDay_FixingDayMissing:rule=-1 但取价日(7/17)本身缺价 → 仍拦(真实依赖守卫)
- TailCalced_NonResetDay×2:算尾(11)+当日非重置日(7/22)+当日缺价 → 放行(非重置日不取当日价)
新增 Fr007MarketPrevBizDay 市场:重置日7/6、7/13、7/20 回拨取价日7/3、7/10、7/17
验证:GLMS20260817Fr007UnwindMorningTest 23/23 内存全绿
|
2026-08-19 09:28:27 +08:00 |
|
hjhan
|
f069c38d48
|
test(swap): EQD-6968 补算尾依赖守卫——重置日缺价仍拦+newCalcLast覆盖算尾仍拦
防'不算尾放宽'误扩到依赖场景(方案一场景4):
- Guard_TailCalced×2:算尾(11)+当日重置日+当日缺价 → 必须仍抛(复利/单利)
- Baseline_TailCalced:算尾+当日有价 → 成功(对照)
- Guard_NewCalcLast:交易10不算尾但本次平仓指定算尾 → effectiveCalcLast=true 仍拦
- Baseline_NewCalcLast:指定算尾+有价 → 成功
Run 运行器扩参:calcMode/interestRule/newCalcLast/market(本提交仅用 calcMode/newCalcLast)
验证:GLMS20260817Fr007UnwindMorningTest 17/17 内存全绿
|
2026-08-19 09:26:30 +08:00 |
|
张名锐
|
ddf233678d
|
feat(swap): 添加基金现金分红处理功能
- 实现 ApplyFundCashDividends 方法处理基金现金分红逻辑
- 现金分红在生效日 EOD 即执行,计入已实现分红字段
- 从盯市盈亏中分离分红金额,避免收益重复计算
- 更新测试用例验证现金分红正确记入已实现分红
- 修正测试方法名称反映实际功能变更
- 完善单元测试验证分红金额计算准确性
|
2026-08-18 15:43:11 +08:00 |
|
张名锐
|
aa1a13d7a3
|
feat(trade): 新增真实除权日字段并完善基金公司行为处理 init
- 添加 EffectiveDate 字段用于标识真实除权生效日
- 实现公司行为价格系数和数量系数统一计算方法
- 增加基金除权回退和平仓基线恢复功能
- 完善除权日验证逻辑,确保真实除权日不早于股权登记日
- 重构平仓流程,支持按有效EOD基线重新计算损益和现金
- 添加基金拆合股和现金分红的特殊处理逻辑
- 增加单元测试验证各种公司行为场景下的正确性
|
2026-08-18 11:20:56 +08:00 |
|
hjhan
|
90d1d85b4a
|
test(infra): DbDiagnose 用例库不可达自守卫——真探测一次+进程级缓存结论
原守卫 try 挂在 GetYLDbContext() 上永远打不中(EF context 构造不连库,
Connect Timeout 发生在首个查询),无库裸跑 14 个用例逐个假红且各耗 15s。
改为 DbDiagnoseGuard.RequireTestDb():CanConnect 真探测一次并缓存,
不可达全批 Inconclusive——裸跑不再有假失败噪音,探测成本 14×15s→1×15s。
连上库的机器行为不变(照常真跑)。
|
2026-08-18 09:58:16 +08:00 |
|
hjhan
|
a97476c4da
|
EQD-6968: 不算尾缺价改沿用已有利率(删期初回退) + 取价决策FIX常驻日志
① GetFloatRate 不算尾缺价不再回退取期初定盘,改沿用已有利率
(preEod.FloatRate/position.FloatRate)——其返回值仅作 preEod.id==0 的种子
且会被分段首段强制取价覆盖,期初取价是无消费者的多余DB读且语义误导;
② BuildSegmentRates 等价重排为 if/else-if 结构,注释改"跳过取价/沿用"准确措辞
(行为不变:排除日有价仍取新利率,缺价沿用上一重置日利率);
③ 防历史bug"取错重置日利率"复发:GetFloatRate/ResolveFloatRate/BuildSegmentRates
三处取价决策经 SwapCalcTrace.Critical 常驻 Info 落盘——重置日判定、取价日
(interest_rule回拨)、命中/缺失、不算尾缺价沿用来源、排除日跳过全程可审计;
④ 测试真内存化:Stub 补 GetConsumedInterest=>0 override(复利路径原偷连96库,
与类注释"内存,不连库"矛盾);一致性断言措辞对齐新语义;
⑤ 修复 SwapDealService.cs 文件头双 BOM 损坏。
验证:GLMS20260817Fr007UnwindMorningTest 12/12 内存全绿;
邻近套件 67过/15败与改动前基线完全一致(15败均为沙箱无96库 Connect Timeout)。
|
2026-08-18 08:10:30 +08:00 |
|
hjhan
|
fb5bbfaa99
|
test(swap-eod): 场景4 跨日毒链携带守卫改为生产自身 DailyAccrual 不变量(真捕获 mode9 误反推)
- 原引擎级差分版(734683ea)为假绿:固定 obsDate=2026-05-12 在 td.StartDate 重置日判定下恒为重置日,
basis=notional+priorAccrued 不取 priorNotional(被误反推的 TdInterestPrincipal),故未捕获 bug。
- 现改为直接复用生产单一真相源 SwapEodPositionService:1388 的 TdInterestIncome=DailyAccrual(TdInterestPrincipal,…)
纯函数:正确本金与“生产实际”本金各算一次 D+1 应计,二者唯一差异即 TdInterestPrincipal;误反推(膨胀~2.3x)
使 D+1 应计同步膨胀,差远超容差→红。该不变量与重置日/平仓比例无关,稳健。
- 守卫置于单日 TdInterestPrincipal 不变量之前,使其成为首要捕获点(实跑验证:注入 mode9 误反推后
首失败点即“场景4[跨日] 毒链携带 D+1 应计偏差 -5501.96”,correct=-4126.47 / poisoned=-9628.43)。
- 移除不再使用的 CalcNextDayInterest 引擎级辅助方法。
|
2026-08-17 18:53:30 +08:00 |
|
hjhan
|
734683eaca
|
test(swap-eod): 场景4 跨日毒链携带断言——引擎级差分(正确本金 vs 生产实际本金各喂一次 GetInterests)
- 前一版在 rollforward eod 层断言 TdInterestPrincipal 被证伪(该 harness 中 DealInterests 收到 eodPosition=null,rollforward eod 恒 0;复利写带符号重放值)——正常日该字段非计息基数载体,断言选错层
- 现改为引擎级差分:partialEod.Clone() 修正 TdInterestPrincipal=expectedTdPrincipal 作对照组,与生产实际 partialEod 各喂 GetInterests(05-12,settment:true),比对次日本金 InterestPrincipal——经 SwapDealService:1045 priorNotional 通道验证携带,容差 max(0.01, 5%)
- 变异验证(已还原):临时令 :1422 守卫放行 mode9 复现 GLMS-20260421-0004 → 三守卫齐红:本文件不变量断言(Expected 212135529.97 / Actual 494982903.27 精确命中历史签名值)、DI_GLMS_20260421_0004、DI_EXCEL_SCENARIO4;还原后 24/24 + 全量 576/566/10/0 复绿
- 生产代码零变更
|
2026-08-17 18:36:54 +08:00 |
|
hjhan
|
c42335363b
|
test(swap-eod): SwapInterestScenario3And4FloatingTest 的 TdInterestPrincipal 改独立不变量(封死假绿)
场景4 原 TdInterestPrincipal 断言 = 生产公式镜像(reverseMode2 ? base*(1-cp)/cp : base),
与生产 if(calcLast && mode2) TdInterestPrincipal *= (1-cp)/cp 逐字同构,永远跟自己一致,
故 mode9 被错误反推(GLMS-20260421-0004 膨胀 ~2.3x)时测试仍绿——假绿。
改为:mode9 用独立 else if 锁死 expected=LastBaseInterestPrincipal(反推前 base),
彻底脱离 reverseMode2 布尔拼写,封死重基线陷阱。已实跑证明:注入 mode9 反推 bug 后
唯一变红 T+1浮动减点算头算尾(实测 TdInterestPrincipal=494982903.27),回滚生产恢复 24/24。
零生产改动。
|
2026-08-17 18:18:02 +08:00 |
|
hjhan
|
09fa96a93f
|
refactor(swap-eod): L1 类内去重——CopyInterestLegFields/FinalizeInterestEodRoll 收口四 Save* 重复段(行为保真)
- 腿字段拷贝 3 处×14 行 → 入参化 helper(FloatRate 来源随场景传入,勿统一)
- 滚存收尾 4 处 → FinalizeInterestEodRoll(方向源参数化:三处 position、Copy 一处 eodPayPosition,勿统一;Persist 与日志留调用点保持原序)
- 差异保真:WithClose 不设 InterestFeePending;勿缩放注释保留升级
- 安全网:InterestEodTailSnapshotTest 三格尾部快照(AutoSettle/AutoSettleWithClose/CloseOnly,钉值特征化)+ golden 两格 + DI_EXCEL 家族
- 验证:快照 3/3 逐字段一致;全量 SwapModule 576/566/10/0 与去重前基线完全相同
- 注:本提交为工作区被还原后按原编辑重放,验证结果与首次执行一致
|
2026-08-17 18:15:09 +08:00 |
|
hjhan
|
65a367e139
|
test(swap-eod): 补 A 三个路由分支断言 DI_BRANCH_003/004/005(经真实 DealInterests 路由器,零生产改动)
|
2026-08-17 17:43:25 +08:00 |
|
hjhan
|
9ae2e66b75
|
refactor(swap-eod): L0 纯函数出仓——InterestEodScenario/ResolveInterestScenario/FindObservationInterval 移至独立 InterestEodScenarioDispatch(零行为变更)
- 上帝类减重 42 行;枚举与两个纯函数零实例状态、零 DB 依赖,符合 Accrual/ 既有纯函数迁移模式
- 测试不再继承 TestableSwapEodPositionService(原仅为够到 protected),plain 测试类
- SwapEodPositionService 两处调用点改为 InterestEodScenarioDispatch.FindObservationInterval 限定名
- 编译 0 错误;表驱动 8/8 通过
|
2026-08-17 17:36:41 +08:00 |
|
hjhan
|
ec9c493420
|
refactor(swap-eod): 利息腿分派可读性收口——观察日命名统一+命名参数+查找助手+分派规格纯函数(零行为变更)
- insterval/autoInterval → observationInterval,SwapIntervalList→FindObservationInterval→形参 interval 全链同名
- :512/:525 调用点命名参数 autoSwap: true/false,签名未动
- 抽取 FindObservationInterval 消除两处重复观察日谓词(表达式逐字保留,null 语义不变)
- 新增 InterestEodScenario 枚举 + ResolveInterestScenario 影子纯函数 + 8 组合表驱动 InterestEodScenarioDispatchTest(分派结构未接线,生产执行路径不变)
- 编译 0 错误;表驱动 8/8 通过
|
2026-08-17 16:25:08 +08:00 |
|
hjhan
|
b94cce68ee
|
chore(cleanup): 删除裁决文档与 saga 注释——保留技术事实,剥离过程叙事(零逻辑改动)
删除 项目文档/双入口口径裁决-复利mode2部分平仓-20260816.md:
四轮状态改写的过程文档,终态有价值的技术事实已转移到代码注释与测试锚点。
保留的技术事实(新家):
- SwapEodPositionService:1325:恒1重算中间值不进结算现金流;系统端到端结果由
DI_EXCEL_SCENARIO4 家族对账确认书公式保障(最终全平=剩余额×∏利率,2026-08-18
手算复核);改动口径前必读该测试家族——破坏 ∏ 恒等式的调整会被其拦截
- ContractReferenceOracleTest:13:Excel 金标准期望值亦符合确认书公式(复核记录)
- EntrySemanticsTest 手算锚点 0.036165 保留(公式自含,去文档引用)
清理的 saga 痕迹:契约修复/裁决文档/暂缓/证伪 等过程性话语全部移除,
测试方法名与注释改为中性事实描述;[EOD平仓后收盘结息] 日志文案
'恒1全额结息(历史行为,契约修复暂缓)'→'全额结息(恒1惯例)'。
验证:编译 0 错误;EntrySemantics+Oracle 16/16 绿;全量 928=145/771/12
与基线逐位一致——纯注释/文档/日志文案改动,零逻辑变更。
|
2026-08-17 13:30:10 +08:00 |
|
hjhan
|
305f8a0322
|
EQD-6968: 补强 FR007 不算尾平仓误拦截回归套件(单利Red/数值一致性/非整倍数边界,重构为 Run 运行器)
|
2026-08-17 11:42:41 +08:00 |
|
hjhan
|
bc401bd687
|
EQD-6968: 不算尾计息不再因平仓日FR007未发布误拦平仓(缺价回退上一重置日利率,有价仍取新利率)
|
2026-08-17 11:22:37 +08:00 |
|