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
tengyufan
8701bd8c44
fix(ClientBlack): 修正黑名单删除结果提示
...
- 根据本次实际进入删除审批的记录数返回删除结果
- 未提交、新增已拒绝直接删除时提示“删除成功”
- 已生效记录进入删除审批时提示“已经提交删除审批”
- 批量混合删除时提示部分记录已提交删除审批
2026-08-19 10:16:51 +08:00
tengyufan
87a8b90eaf
fix(ClientBlack): 支持删除未生效黑名单记录
...
- 未提交、新增已拒绝的黑名单记录可直接删除,不进入删除审批
- 已加入、删除已拒绝仍按原逻辑发起删除审批
- 新增审批中、删除审批中仍禁止删除
- 补充未生效状态可直接删除的状态机单测,45/45 通过
2026-08-19 10:07:39 +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
1e6abb4547
refactor(swap): 重置日判定收口 IsResetDay 私有谓词(零行为变更)
...
EQD-6968 三判定之一的"是否重置日"公式原在 GetFloatRate(days%period) 与
CalcUnwindInterest 当日归周期判定(daysFromStart%rest_days) 各写一遍,
收口为单一谓词;锚点差异(td.StartDate vs position.PosiStartDate,
非初始持仓两锚点可能不同)在注释中显式注记,只收口公式不统一锚点——
统一锚点属行为变更需业务定调。
验证:内存套件 102/102 全绿
2026-08-19 09:33:15 +08:00
hjhan
0418d9f3d3
refactor(swap): InterestCalcMode 算头算尾解析收口至 TradeExtendJson.CalcFirst/CalcLast
...
三处重复的 StartsWith/EndsWith 字符串解析(GetInterests / InitInterestDate /
SwapEodPositionService EOD平仓后结息)收口为 TradeExtendJson 计算属性:
- [JsonIgnore] 保证 ExtendJson 序列化字节不变;
- InitInterestDate 原写法在 InterestCalcMode 为显式 null 时会 NRE,
收口后与其他两处 null-安全语义对齐(缺省=算头算尾,实际不可达,属性缺省 11)。
EQD-6968 三判定之一的"算不算尾"至此单点可查。
验证:内存套件 102/102 全绿(GLMS20260817Fr007 23 + Cache 7 + CloseInterest/
InterestScenario/TailSnapshot/EntrySemantics 72)
2026-08-19 09:31:38 +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
hjhan
e94c8c25e2
Merge branch 'glms/feature/1.4.2' of http://git.yiliantech.com/gitlab/otc-dev/zszq-trs into glms/feature/1.4.2
2026-08-18 20:17:16 +08:00
tengyufan
274a93b328
更改黑名单审批导入格式为.xlsx
2026-08-18 16:56:29 +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
7a5089555d
fix(fr007-cache): 直查命中失效快照+去冗余排序+重载失败保旧快照防重试风暴
...
- EodPriceQueryService.TryGetPrice: FR007 快照 miss 直查库命中后 Invalidate,
下次访问整表重载回 O(1),否则该键 TTL 窗口内每次读取都退化为点查
- 移除点查多余的 OrderByDescending(主键等值查询取首行即可)
- Fr007FixingCache.EnsureFresh: 重载失败(DB抖动)保留旧快照不抛并重置TTL时钟
——历史定盘不可变旧值依旧正确,同时防重试风暴;版本失效路径不受TTL掩盖
- 补两测试: 重载失败保快照窗口内不重试 / 首次装载失败miss不抛窗口内不重试
2026-08-18 09:33:28 +08:00
hjhan
e219bdae18
feat(swap): FR007定盘整表快照缓存——预载全历史O(1)命中,miss不缓存,写侧失效+1min TTL兜底
...
数据形态:每工作日一行、发布后不变、全历史仅数千行 → 整表快照优于逐键缓存。
① Fr007FixingCache:首次访问批量SELECT全历史进字典,此后读取O(1)零查询;
快照以引用替换发布(Volatile),读侧无撕裂,重载加锁去抖;
② 负缓存防线:miss(当日~11:15未发布/补录历史)永不进快照,TryGetPrice 回退直查库——
否则发布后TTL窗口内仍查不到,上午平仓会一直用回退利率;
③ 写侧版本失效:SwapFlowService 新增/修改/删除 FR007 后 Invalidate,下次访问立即
整表重载不等TTL;其余通用写入口(导入/复制/合成/直改库)靠TTL兜底,可见性≤1分钟;
④ TryGetPrice 仅 FR007 走缓存路由(全仓生产调用方仅 SwapDealService.TryGetFloatRate
与 Fr007IndexFixer 两处,均定盘链),其他标的照旧直查,零影响;
⑤ YLErpDAL 增加 InternalsVisibleTo("UnitTestProject"),时钟/装载器测试接缝保持 internal。
验证:Fr007FixingCacheTest 5/5(预载命中/miss不缓存/写侧立即生效/TTL过期重载/稳态零重载);
GLMS20260817Fr007UnwindMorningTest 等内存套件 55/55 全绿。
2026-08-18 08:24:21 +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 and Claude Opus 4.7
cb5ba86d85
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)。
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com >
2026-08-17 22:21:55 +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
fc4c93c47a
docs(adjudication): 手算完成 Excel↔确认书对账——两者等同;修正封案推理
...
以 20260421-0004 输入按确认书公式 ∏(1+(FR007i+利差)×di/365)−1 精确手算:
- BL(部分平仓)=平掉额×利率(4/22→5/11)=-37,119.14,与 Excel 完全一致(差0.00)
- BN(最终全平)=剩余额×利率(4/22→5/19)=-123,280.18,与 Excel 差0.01(分步舍入)
=> Excel 金标准就是确认书公式本身;系统旧链端到端结果(BL/BN)已契约精确正确。
修正 2026-08-17 封案推理:分叉破坏的是实现不变量(最终全平须 reconcile 到
剩余×∏利率),而非修复方向被证伪——251,355 是被丢弃的中间值,不在结果链上。
结果层已无契约偏差可修,§六仅剩内部卫生价值,终局不修;未来动此链(含罚息)
硬性验收=DI_EXCEL_SCENARIO4 全绿+∏恒等式不变(手算模板已留文档)。
2026-08-17 13:08:11 +08:00
hjhan
55363e9f51
EQD-6968: 重命名 FR007 不计尾放宽取率参数为准确语义命名,提升可读性
...
纯改名与化简:BuildSegmentRates 的 includeEnd 别名->calcLast、exclusionEndDate->relaxedFixingFromDate(语义=从该日起放宽定盘缺失拦截而非排除某日);GetFloatRate 不算尾回退改正向结构;GetInterests 抽出 effectiveCalcLast 替代重复 calcLast||newCalcLast。计息逻辑不变,12 用例内存单测全绿。
2026-08-17 13:00:08 +08:00
hjhan
56c9a0652b
docs(adjudication): 终局封禁——§六方案被 Excel 金标准证伪(验收门实证)
...
2026-08-17 实施§六(autoSwap分叉)并执行全量验收门:DI_EXCEL_SCENARIO4 家族
(20260421-0001~0012,业务 Excel BL/BN 列)失败——0004 最终全平期望 -123280.17(Excel BN)
vs 修复后 -120922.50(差-2357.67);DI_MANUAL_PARTIAL_CLOSE 语义钉子同破。已回滚,
基线 145/771/12 恢复(含 FR007 新套件全绿)。
根因认知升级:恒1重算直接金额虽被丢弃,但其快照种子链是 20260421 系列调优到与
业务 Excel 精确一致的整体——动一环破全局。'恒1无契约依据'仅对直接金额成立。
未来根治前置条件升级:先完成 Excel 模型↔确认书公式 reconcile 并经业务书面确认;
罚息等新需求触及该链时同样必须过 Excel 金标准。
2026-08-17 12:31:17 +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
hjhan
feee779994
docs(adjudication): §六封案——条件触发默认不修(终局定性)
...
终局查实危害边界:分歧(251,355 无契约依据)止于【零结算现金流 + 单个内部页面
(日终持仓风险)两列展示字段】,不进结算书/对账单,客户不可见;TdInterestPrincipal
种子链被 20260421 特判块转换兜住。修复属高危区卫生项,单独立项风险大于收益。
触发条件(满足其一才执行§六):①罚息需求落地时顺手修正(同一计息路径同一验收);
②内部风控页展示列被业务投诉;③20260421 类事故复发。
§六方案与回归网作为触发时现成材料封存,勿删。
2026-08-17 10:57:27 +08:00
tengyufan
35096b8726
Merge remote-tracking branch 'origin/glms/feature/1.4.2' into glms/feature/1.4.2
2026-08-17 10:52:54 +08:00
hjhan
97aff02e1d
test(infra): P0——ModuleInitializer 初始化段容错,测试库不可达不再连坐全部测试
...
问题(2026-08-16 栈实证):M1→AppManager.Initialize→InitializePsConfig→
InnerAppConfigService.ConfigDic 读 AppConfig 表→ServerVersion.AutoDetect 连库,
库不可达时 ModuleInitializer 抛异常→903 个测试全部'Unable to create instance'全红,
DB 断网期间阻塞全部开发(本周实证两天)。
修复:初始化段(AppManager.Initialize + DataCacheManager.UpdateOnce)包 try-catch,
失败降级为醒目警告(Console+NLog),纯内存测试照常可跑;依赖配置/缓存/库的测试
以各自连接错误失败(与降级前一致,不再伪装成类创建失败)。
完全跳过初始化仍用 YLErp_UNIT_TEST_SKIP_INITIALIZATION=1。
仅测试工程 Program.cs,零生产代码改动。
验证(库不可达、不开逃生门):修复前 0/17 类创建全失败;修复后 17/17 通过;
扩大集 48/48 通过(147ms)。常量类不受影响已证(ConsTrade.InterestMarginModels
为编译期常量,MarginModesTest 离线绿)。
2026-08-17 10:00:09 +08:00
tengyufan
4f68233f14
Merge remote-tracking branch 'origin/glms/feature/1.4.2' into glms/feature/1.4.2
...
# Conflicts:
# UnitTestProject/Modules/SwapModule/DividendEodNoDoubleCountTest.cs
2026-08-17 10:00:00 +08:00
hjhan
97c6dc6bb6
docs(adjudication): 修正§1.1③快照影响表述——重算结果非完全丢弃,accrual字段确被改写
...
复核修正(代码级验证,行号为9efaa1b5):
- '不进快照'过宽:TdInterestIncome 四分支中三分支(!hasPreviousEod/全平/默认)直接写
重算值,仅'有历史已结且算尾'分支被 DailyAccrual 干净覆盖;复利mode2/9的
TdInterestPrincipal 取重算值(次日复利种子);FloatRate 同
- '零生产资金后果'严格=【零结算现金流后果】(TdCloseInterest/autoSettled不受影响成立)
- 新增落地审查清单:关联 GLMS-20260421-0004(同方法本金反推膨胀~2.3倍历史事故),
:1413+复利部分平仓特判块消费 InterestPrincipal,§六实施时须验证两请求形状下
反推链路等价,accrual 字段改写须进黄金回放 diff 白名单
2026-08-16 15:50:12 +08:00
hjhan
9efaa1b5cc
chore(swap)+test: 删分红EOD历史死代码 + 补计算过程常驻日志(零行为语义变更);契约修复转为暂缓
...
死代码删除(SwapEodPositionService.UpdateEodPosition,论证+实证链完整):
- todayConsumedDividend/originNotional/totalPayment/totalInterest 自 0910969e(7/2 改递推式)
起计算结果从未被消费,仅残留全历史 CalcBondPayment 只读查询+日志副作用,且构成
脏数据(OriginalStockEqvNotional=null/PosiNetPrice=0)下 EOD 崩溃点(除零,实测复现)
- 配套边界测试 DividendEodNoDoubleCountTest.脏数据边界_*:删除前红(崩溃)→删除后绿
(不抛异常+四输出字段与正常数据逐字段一致);stash 基线对比确认离线套件无其他差异
- 止血预案:git revert 本提交即回到已验证态
计算过程常驻日志(快速定位,纯增):
- [EOD平仓后收盘结息]:口径/autoSwap/平仓前/剩余/平掉额——排障第一入口
- [分红-EOD计提Copy/Update]:窗口/qty/税率/当日新计/账面前值→后值——与
[分红-登记日口径]窗口命中日志构成分红计算全链
- [利息-全平专属分支]:全平分支触发标记,兼作契约修复落地后的验证哨兵
契约修复(EOD传真实比例)转为暂缓:影响快照种子,黄金回放验收门因96库网络未恢复
无法执行,按风险优先级撤回行为变更;方案+回归网(同形状等价oracle)+落地哨兵已
全部就绪并留档于裁决文档,DB恢复后可直接落地。
2026-08-16 15:47:09 +08:00
hjhan
c9f44d4fde
revert(test-infra): 测试库连接超时回退 2s→30s(恢复 8/14 前配置)
...
04b52061 将 Connection Timeout 30→2 属离线排障场景的急速失败配置,
对正常连库环境过紧(慢网/高延迟下秒死,且 ModuleInitializer 预热失败
拖垮整个测试程序集)。经实证:恢复 30s 后本机仍无法连库(秒败,
Unable to connect to any of the specified MySQL hosts),确认超时配置
非本次全红根因——根因为本机到 192.168.2.96 网络不可达(TCP/ICMP/ARP
三重验证)。2s 改动本身仍应回退以免放大慢网故障。.runsettings 为
opt-in(仅 --settings 显式启用)保留不动。
2026-08-16 13:25:50 +08:00
hjhan
eb9591e212
chore(build): nuget.config 内网 Nexus HTTP 源补 allowInsecureConnections,修复 NU1302
...
NuGet 新版(VS 设计时 restore / SDK 7+)强制 HTTPS 源,内网
git.yiliantech.com/nexus 仅有 HTTP,导致 YLErp.Resources/MailKit/Security/Cache/Core
还原报 NU1302。按官方指定开关显式放行该源;nuget.org 仍走 HTTPS 不受影响。
验证:dotnet restore --force 真实触源成功,全解决方案编译 0 错误。
2026-08-16 12:57:06 +08:00
hjhan and Claude Opus 4.7
07764e7e3f
test(swap): 契约参考实现落地,引擎主力族盘中重放首次对齐确认书公式 oracle
...
ContractReferenceCalc 独立实现 §8a 确认书公式(∏/重置期切分/末段收口/
利率确定日=重置日上一营业日),禁止引用生产计息类防同源;4 例手算锚点
自验证(真实规模 5000万/2.05%/90天=75999.04 与玩具锚点)。
引擎对照首批 3 例全绿:mode9/mode2 × 复利 × "10" × T+0 部分平仓30%,
盘中重放与契约 oracle 容差 0.01 元内逐分吻合——盘中口径=确认书公式
自此有机器强制,后续补格直接复用 oracle 供给(TEST-MATRIX §7.5 已登记)。
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com >
2026-08-16 12:19:28 +08:00
hjhan and Claude Opus 4.7
f596bd80bc
docs(adjudication): 影响面最终关闭——EOD重算结果被丢弃,零生产后果
...
DealInterests hasClose 分支未接收 SaveAutoEodWithCloseInterestPosition 返回值,
UpdateDbOption 仅打审计字段不落库,快照滚动盘中实结金额——错误的251,355
只存在于内存与日志。内网查证与数据修正清单取消,修复定性为重构卫生项。
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com >
2026-08-16 11:53:15 +08:00
hjhan and Claude Opus 4.7
a5684022fa
docs(adjudication): 裁定资金面无影响——EOD重算不动钱,修复性质降为排雷
...
代码级核查:当日平仓后的EOD重算路径(autoSwap=false)无AddClientCash调用,
快照当日结出与累计已结均滚动盘中实落库金额,剩余待实现亦正确;
错误金额仅存在于重算写入的利息流水记录。撤回"双重结算敞口"表述,
内网查询目的改为确认流水记录无消费方+生成数据修正清单。
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com >
2026-08-16 11:48:52 +08:00
hjhan and Claude Opus 4.7
f75792b45b
docs(adjudication): 裁决材料升级为确认书生产参数规模并钉清触发链
...
- 分歧表新增真实规模复算(5000万/2.05%/7天重置/90天):应结75,999 vs 现结251,355,
单笔多结175,356(3.3倍);玩具参数降级为可复现实测锚点
- 新增触发链一节:EOD平仓后收盘=收盘归档对当日平仓事件的重算(非自动平仓本身),
人工/自动平仓当下结息均正确,分歧仅在当晚归档重算
- TEST-MATRIX §9 增补规则5:oracle与裁决材料一律用生产参数,玩具参数仅限字符化钉子
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com >
2026-08-16 11:26:42 +08:00
hjhan and Claude Opus 4.7
5a92709c42
docs(swap): 双入口口径分歧裁决申请——复利mode2部分平仓(EOD多结63%)
...
- 契约验算:盘中口径0.036165=确认书∏复利公式手算值(3.7e-7舍入差)
- 机制定位:SwapDealService:1220 closePrecent==1 分支是全平专属设计,
但EOD入口传参惯例percent恒1→EOD部分平仓30%掉进全平分支,
剩余100%持仓待实现利息被一次结走
- 待业务裁决两项:部分平仓应结口径(推荐=契约公式/盘中口径)、全平维持现公式
- 裁决后修复方案已就绪:EOD传真实比例+1220分支回归全平专属+2035e1df粘合退役
- 附生产影响面查证建议(EOD自动部分平仓×复利mode2/9存量事件比对)
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com >
2026-08-16 11:18:15 +08:00
hjhan
c94a3e8c97
test(swap): 铺 §7-1 守恒不变量护栏,守 EOD平仓后收盘×部分平仓 裸格(§6 空洞1)
...
新增 4 个免库纯内存测试(GetInterestsEntrySemanticsTest):①部分平仓 剩余持仓前递且 期初=剩余+平掉;②全平 剩余前递=0;③两次部分平仓 逐日守恒 期初-剩余前递=平掉;④ClosePercentMath 多次平仓累计比例=1-∏(1-各次剩余口径)纯数学。
守恒断言落在 preEod.PosiNotionalValue(剩余前递)而非 InterestPrincipal——后者在 InitSwapDealInterest:1164 后被利息算法重赋值(1197 复利特判/1266 单利路径),语义随入口/模式变,非稳健观测点;剩余前递由 CalcUnwindInterest:1084 在 preEod.id==0 时写入,与利息算法无关,最稳健。
用途:作为 GetInterests 早路由(Tier A)合入的前置护栏——funding-leg(mode2)不触发早路由 continue,故本类任何回归都直接暴露早路由对 EOD平仓后收盘路径的破坏。验证:YLErp_UNIT_TEST_SKIP_INITIALIZATION=1 dotnet test --filter Name~守恒 全过;整类仅 2 个旧复利测试因无 96 库失败,与本次无关。
2026-08-16 11:17:37 +08:00
hjhan and Claude Opus 4.7
73264a30e2
docs(swap): 新增融资腿计息测试矩阵 TEST-MATRIX.md
...
- 主力族(mode9×FR007×复利×算头不算尾)7 维矩阵 + 4 入口枚举 + 近 6 周 fix 热力图定位
(全部落在 CalcUnwindInterest 与 SaveAutoEodWithCloseInterestPosition 两个带)
- 确认书契约公式提取为 oracle:∏[1+(FR007i+利差)×di/365]−1、重置期含首不含尾、
利率确定日=重置日上一营业日、末段 di 按实际日历日收口(来源 GuoLian 插件 4 份模板)
- 生产参数定格:重置频率 7 天/年化 365,唯一组合
- 保证金 5/6 声明不在矩阵内(独立余额模型+专属黄金回放护栏)
- 4 条合入硬规则:失败测试先行/扫兄弟格/黄金回放门禁/断言投影优先
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com >
2026-08-16 11:03:21 +08:00
hjhan and Claude Opus 4.7
db447aa584
refactor(swap): 保证金腿在 GetInterests 循环入口提前路由,融资腿分支树去除 MarginModes 依赖
...
- 保证金腿(5/6)在最外层路由并 continue:本金(InterestPrincipalFix×closePrecent)、
方向翻转、CalcMarginInterest 收口一处;newClosePercent 在保证金腿恒等于
closePrecent,直接传参
- 融资腿(1/2/9)分支树内 3 处 MarginModes.Contains 归零,后续融资腿改动与保证金解耦
- GetFixedRate 前移为两路共用(纯读函数,已验证无副作用)
- 有意跳过 GetFloatRate:CalcMarginInterest 纯固定利率(FundingLegRate.Fixed/
FloatRate 恒 0),浮动取价对保证金无意义;脏数据 FloatRateUnderlyingCode
缺价时不再阻断保证金结算(唯一行为变化,方向更安全)
- 验证:SwapModule 537 用例 A/B(带改/不带改)摘要完全一致(71F/459P/7S),
失败项均为本机无库环境失败;内网全量单测待跑
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com >
2026-08-16 11:03:11 +08:00
hjhan
44e24b3172
refactor(margin): MarginModes 反转依赖 ConsTrade.InterestMarginModels 并删除 premiumModes 硬编码副本
...
- MarginModes.All/ForLinq/FixedAmountAndMargin 改为由框架常量 ConsTrade.InterestMarginModels 派生,消除 DAL 层独立重写集合(单一真源在 Core 层,本类退化为形态包装,避免新增保证金形态时口径分裂)
- SwapEodPositionService.premiumModes 局部 new List 字面量替换为 MarginModes.ForLinq(DAL 内部冗余副本消除)
- 重写 MarginModes.cs 过时的“复制 6 次/待收敛”注释,改为记录依赖方向与收敛历史;ForLinq 注释改为“派生自框架常量,仅做形态适配”
- 更新 MarginModesTest 类注释与一致性测试注释以反映派生关系
- 验证:YLErpDAL/UnitTestProject 编译 0 错误;MarginModesTest 5/5 通过
2026-08-16 10:47:45 +08:00
hjhan
04b5206134
test(infra): 缩短测试库连接超时 30s→2s 并加入 MSTest 并行 .runsettings
...
UnitTestProject/appsettings.json: 四个连接串 Connection Timeout=30→2,无库环境连不上 2 秒即失败,避免逐个 DB 测试 30s 空转;有库时 LAN 连接<1s 不受影响。新增 .runsettings: Workers=0(自动取 CPU 核数)+Scope=TestClass 类级并行,opt-in(仅 --settings 生效);共享静态单例(LogFactory/DataCacheManager/YLServiceLocator)启用前先跑串行基线确认无交叉污染。
2026-08-16 10:30:39 +08:00
hjhan
1d9bac4dd6
refactor(swap): 提取 EodSwapPositionQueries.ActiveByTradeAndDate 收口日终有效持仓查询
...
将 eod_swap_position 上'SwapTradeId + ValueDate + !Invalid'的 5 处重复谓词
(SwapEodPositionService.cs:2133/2195/2246/2487、ConfirmationGenerateContext.cs:2868)
收口到 EodSwapPositionQueries.ActiveByTradeAndDate(tradeId, valueDate),
与 SwapPositionQueries.ActiveByTrade 同构,零逻辑变更。
2026-08-15 13:44:53 +08:00
hjhan
3505e40c7e
build(nuget): 新增仓库级 nuget.config 注册 Nexus 私有源
...
仓库此前无 nuget.config,全局 NuGet.Config 仅含 nuget.org,
导致沙箱/CI/新机器 dotnet restore 因找不到 Qdp.Pricing.*、YieldChain.Core
等带 -glms 后缀私有包而 NU1101。注册 Nexus nuget-group(v3, 匿名可读)
源后 build 可在任意环境复现。
2026-08-15 13:38:08 +08:00
hjhan
f2c2f6052c
refactor(swap): 提取 SwapPositionQueries.ActiveByTrade 收口有效持仓查询
...
- 新增 SwapPositionQueries.ActiveByTrade 静态扩展,收口 'SwapTradeId==X && !Invalid' 规则到单一真相
- 替换 SwapDealService/SwapEodPositionService/SwapTradeService 共 7 处纯重复谓词
- 仅返回 IQueryable,不调 SaveChanges,不动 FindTrade seam / 事务边界;行为保持等价
2026-08-15 12:48:44 +08:00