Commit Graph
969 Commits
Author SHA1 Message Date
张名锐 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
hjhan e1e65929f1 债券互换三字段互算:手动编辑标识由文字改为铅笔图标+hover说明
- 三列(DP/CP/YD)的橙色"手动"文字 span 改为 glyphicon-pencil 图标,
  配 title="手动编辑:该字段由您填写,不会被计算器反算覆盖",
  对应需求3的"单独编辑"语义,hover 即可见说明,比纯文字更直观。
- 复用项目既有 Bootstrap Glyphicons + title 原生 tooltip 约定,零新依赖。
- 顺带修复 451 行"发行信息"图标重复 class(glyphicon glyphicon glyphicon-edit→glyphicon glyphicon-edit)笔误。
2026-07-23 16:53:07 +08:00
hjhan 8694e6e3f4 债券互换三字段互算:估值日(开始日)缺失报错 + 补提漏交回归用例
- 估值日严格取互换起始日 StartDate,去掉"悄悄回退交易日(TradeDate)":
  真的为空时返回错误提示("请先填写开始日…或手动填写三项数值")并 return,
  不调用计算器、不覆盖手工输入,与需求(按开始日估值)完全一致。
- 抽纯函数 getBondStartDateMissingMsg(StartDate 空→文案/null) + 导出;
  复用 D3 的 shouldShowBondErr 去重,避免空开始日时价格格逐键连刷。
- BondCalcHepler.cs 仅补 XML 注释说明前端已强制 StartDate 必填;
  targetDate 空→代理默认 T+1 行为不变(兜底 RealtimePnlCalc 旧链路)。
- 补提此前漏提交的回归用例:bondCalc.test.js(×100/÷100 端到端 + 逐字段手动锁定)、
  swapCalc.test.js(D1/D2/D3 + 本次估值日缺失守卫)。
- jest bondCalc+swapCalc 全绿(68 passed)。
2026-07-23 16:49:40 +08:00
hjhan 8b8fee9306 债券互换三字段互算:修复单位换算与重开覆盖/提示噪声(D1/D2/D3)
- 发计算器前×100、回写÷100(bondPriceToCalc/bondCalcPriceToStorage),
  根治 -117.93/378543 离谱值(存储态小数↔展示态百分比对齐)
- D1:setUnderlyingCode 切债券清空 bondManual/bondDriverType,
  避免旧债券手填态污染新债券
- D2:重开(刷新/审批重开)已保存债券单时,加载路径对三字段齐全的
  标的锁为手动态,编辑某格不联动另两格(手动覆盖跨会话 sticky)
- D3:不可算债券逐键手填时,同一失败提示只弹一次,抑制 toast 连刷
- fe-tests:+9 用例覆盖 D1/D2/D3 边界(切标的清标志/重开锁定/失败提示去重)

jest bondCalc+swapCalc 全绿(62 passed)
2026-07-23 16:37:13 +08:00
张名锐 7475bddc44 fix(tradeHelper): 无法修改后端Bonds->Bond 采用前端兼容,修复债券类型判断逻辑
- 添加了 Bond 类型到 IsBond 函数的判断条件中
- 确保 Bond 类型能够被正确识别为债券产品
2026-07-23 16:23:52 +08:00
张名锐 32a3a45c85 refactor(swap): 修复债券日终价格映射
- 移除 GetSwapValuationPrice 方法中的 posiGrossPrice 参数
- 删除债券价格转换相关的注释代码和日志记录
- 简化债券价格处理逻辑,直接使用原始价格进行四舍五入
- 更新所有调用 GetSwapValuationPrice 的地方以匹配新方法签名
- 移除多余的价格转换和展示态判断逻辑
2026-07-23 14:17:26 +08:00
张名锐 a91010589a fix: Bonds枚举对应的值改回Bond 2026-07-23 14:16:50 +08:00
hjhan 185a23e978 fix(swap-trade): 修复新增互换交易时 InitYtm 为 null 触发数据库约束报错
根因:InnerSaveNewTrade 只做 req.Clone() 直接入库,未给 trade.InitYtm 赋值;
而编辑场景(InnerSaveEditTrade:582)有从 swap_positions 取 InitYtm 的逻辑,
新增场景漏了。前端填的"成交收益率"存在 swap_position.InitYtm 上,但 trade
表 InitYtm 列要求 NOT NULL,新增时为 null 直接报错。

修复:新增场景同样从 req.swap_positions 取 InitYtm,无则默认 0(与
PrepareTrade:353 的 flowMerge.InitYtm ?? 0 处理一致)。

验证:dotnet build 0 错误
2026-07-23 13:52:04 +08:00
hjhan d0c170c2a1 fix(log): 修复 DbUpdateException 日志丢失 InnerException 的问题
- NLog.config: exception layout 从 format=Message 改为 format=toString
  原配置只渲染外层异常 Message,不递归 InnerException。DbUpdateException
  外层 Message 永远是 "See the inner exception for details.",真正的 SQL
  错误(主键冲突/字段超长/外键约束)全在 InnerException 里被吞掉。
  改为 toString 后输出完整异常链(含 InnerException + 堆栈),全局生效。
- SwapTrade2Controller.tradeEditJson catch 块对齐其他 Controller:
  e.Message → e.GetBaseException().Message,并补上 e.ToJson() 数据参数,
  让前端也能拿到最内层错误信息。

验证:dotnet build 0 错误
2026-07-23 13:43:43 +08:00
hjhan d768a83387 test(swap-calc): 补充债券计算器单位换算端到端测试 + 精化错误提示文案
- bondCalc.test.js 新增 3 个测试:bondPriceToCalc/bondCalcPriceToStorage
  单位换算边界 + 复刻 -117.93/378543 离谱值根因验证
- swapCalc.js 注释从"主数据量纲错误"改为"前端↔计算器单位换算不匹配",
  错误提示文案优化(无逻辑变更)
- 26 个测试全通过
2026-07-23 11:35:27 +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
张名锐 bbf98ba61c fix(data): 修正债券常量定义
- 将 Bonds 常量值从 "Bond" 更正为 "Bonds"
2026-07-22 18:08:04 +08:00
hjhan 63d9decd17 恢复对债券首次读取接口返回的 price / netPrice 本来就是存储态小数 (EodPrice 直接返回 DB 值;非 EodPrice 分支 ×bondPriceMultiple=0.01 2026-07-22 15:04:42 +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
hjhan e331c15a15 计算器 结果还是会被 不断 /100 2026-07-22 14:48:52 +08:00
hjhan 3cf06c2be7 债券计算器 返回结果后要进行 /100 * 100 处理 适配目前的 这个 /100 * 100,避免 很离谱的 值 2026-07-22 14:00:55 +08:00
张名锐 0755233ab6 fix(swap): 统一处理【名义本金】数值精度舍入问题
- 在多个位置添加 Math.Round 函数确保金额计算精度
- 新增 NormalizeNotionalValues 方法统一处理 UnwindData 中的名义本金舍入
- 修复交易平仓时 StockEqvNotional 扣减计算的精度问题
- 解决持仓数据 PosiNotionalValue 的精度舍入处理
- 修复前端页面显示格式化问题
- 添加单元测试验证名义本金舍入逻辑正确性
2026-07-22 13:05:49 +08:00
hjhan 1373f57884 feat(swap): 债券互算接入浮动收益端(期初三字段change触发+手动/源徽标+重算)
- swapTradeEdit.onBondPriceInput:编辑净价/全价/收益率之一即标记该字段为"已手动设过"(bondManual[type]=true) 并以之为源调 /Bond/CalcBond,反算仅填充未手填字段。

- calcBondForItem:估值日用整笔交易 trade.StartDate(回退 TradeDate→null/T+1);用 main.post(...,{alertFn:main.message}) 让业务/参数错误以非阻塞 toast 展示、绝不回写;未选债券标的先提示;回写前用 getBondCalcErrorMessage 判错。

- resetBondCalc:清空手动锁定、以当前某字段为源重新自动反算。

- setUnderlyingCode:标记浮动腿 isBond(债券标的) 以启用互算。

- TradeEdit.cshtml:三字段加 v-on:change 触发 + 绿色"源"/橙色"手动"徽标 + "重算"链接。
2026-07-22 11:36:00 +08:00
hjhan d3b47f6fa1 feat(swap): 债券净价/全价/收益率互算核心(逐字段手动锁定+错误不覆盖纯函数+测试)
- swapCalc.applyBondCalcResult(state, calc, manualSet):回写时跳过"用户手填过的字段"(逐字段手动锁定,永不覆盖),只反向填充未手填字段;EPS 去抖避免光标跳动。

- 纯函数 getBondCalcErrorMessage(resp):空响应/errCode!=0 返回文案、否则 null,与 C# errCode 守卫一一对应,保证"坏结果"不静默回写。

- 新增 jest 用例覆盖:三字段互算、逐字段锁定(手填全部三个无一被回写)、业务错误不覆盖手工输入、getBondCalcErrorMessage。85→86 全绿。
2026-07-22 11:35:53 +08:00
hjhan 0aad4c8040 feat(swap): 债券计算器C#契约对齐——targetDate估值日透传·错误处理透传真实原因·链路日志
- BondCalcHepler.BondCalc 新增可选 targetDate(估值日) 参数并写入请求体,透传至代理 zszq-bond-oms 的 targetDate(→bond-calc settlementDate);不传则沿用代理默认 T+1,与 bond-oms-ui 契约一致。

- 新增 out errorMsg 重载:地址未配/无响应/success=false/业务错误码 errCode!=0/异常 均返回 null 并透出真实中文原因;日志级别由 Info 升为 Error,try/catch 包裹。

- BondController.CalcBond 把 errorMsg 透传给 JsonError,不再硬编码"计算价格失败"。

- BondCalcByDate(自动结算路径) 同步加 errCode/空守卫,避免回写坏数据。
2026-07-22 11:35:41 +08:00
hjhan e7c6e432e1 test: 修复陈旧 golden 与恢复 Step1 Ignore
golden_互换结清后待实现归零.json 的 RealizedPnl 0->8.219(f4ffe710 修复后未重录,8.219为正确值); SwapReEodDeleteManualCashRecordTest.Step1 恢复 [Ignore](与类头契约一致,避免污染入库 golden)。
2026-07-21 15:28:17 +08:00
hjhan 985162242d feat(greeks): 新增 risk-factor bump 计算与注册
ParameterBase.Clone() 保留运行时类型深拷贝; ValueCalculator 两个薄接入方法; GreeksBumpCalculator/GreeksRiskFactor 引擎。加法性重定价桥,不动现有定价输出。
2026-07-21 15:28:15 +08:00
hjhan a179675efd refactor(swap-deal): 前端盈亏校验抽为 SwapFrontendPnlValidator
BuildFrontendValidationDiffs/FrontendPnlDiff/AddDiffIfOverThreshold 从2043行 SwapDealService 移至新文件,本文件仅留调用+日志。纯位置迁移,零行为变更。
2026-07-21 15:28:14 +08:00
hjhan a153a1d1a6 refactor(swap-eod): 抽出期末头寸纯函数并放宽可见性
SetFixedLegRealizedPnl 替换4处复制粘贴(清理L1296双分号); NormalizeInterestSignForReport 替换16行内联报表分支; CalculateWeightedMarginInterest private->public static。均为纯静态无实例依赖,配套无库单测锁定行为。
2026-07-21 15:28:13 +08:00
hjhan 494a7a06cc test(swap): 修正平仓利息复现用例标的代码为 2500002.IB
- 将 GLMS20260703CloseInterestTest 中 UnderlyingCode 由 511160.SH 更正为真实标的 2500002.IB
- 核心复现用例(复利真实FR007→-13667.85 / 单利→-13668.02)保留, 作为代码级验算样例
2026-07-20 18:41:16 +08:00
hjhan 98bfe8fb5d test(swap): 增加 GLMS-20260703-0002 平仓利息复现用例(真实FR007+真实函数)
- 调用系统 GetInterests 真实路径(复利/单利两条), 用截图中的真实 FR007 定盘值
  在 07-06/07-13 两个重置点真实取数, 复现系统值 -13,667.85 与业务实际值 -13,668.02
- 断言两者差异 0.17 元来自复利第二段本金并入
- 仅保留调用系统函数的断言, 不内嵌手算, 验算见 GLMS20260703_平仓利息验算.xlsx
2026-07-20 18:31:19 +08:00
张名锐 f4ffe71071 fix(swap): 修复期末头寸已实现盈亏计算问题
- 在新创建的期末付款头寸中添加已实现盈亏字段计算
- 对历史数据的利息和已实现利息进行符号标准化处理
- 添加预付金腿利息方向与保证金本金方向的反向逻辑
- 兼容修复前已落库的利息腿数据缺失已实现盈亏字段问题
- 统一风险报表按绝对金额和业务方向的数据口径
2026-07-20 15:28:40 +08:00
张名锐 a0f8dc9df7 refactor(SwapModule): 简化预付金利息计算逻辑
- 移除本金绝对值加权平均的复杂计算方式
- 直接对各腿利息金额进行轧差求和
- 保留收取为正、支付为负的方向转换逻辑
- 删除不再使用的本金权重计算代码
- 简化方法实现并提高计算效率
2026-07-20 09:30:01 +08:00
tengyufan 48742649ba 国联民生收益互换交易确认书模板字体修复 2026-07-17 16:52:59 +08:00
lisong ec5da002f4 Merge remote-tracking branch 'dest/glms/feature/1.4.2' into feature/p132_74-risk-engine 2026-07-17 15:41:32 +08:00
尹峰 cd170faf8d Merge branch 'feature/p132_74-risk-engine' of https://gitee.glmszq.com/gsty/onederiv/trs into feature/p132_74-risk-engine 2026-07-17 15:39:46 +08:00
尹峰 b2d5fb9900 修改规则&应用默认状态为停用 2026-07-17 15:39:25 +08:00
ruisu 87199f18d6 Merge branch 'feature/p132_74-risk-engine' of https://gitee.glmszq.com/gsty/onederiv/trs into feature/p132_74-risk-engine 2026-07-17 14:30:12 +08:00
ruisu 9b98a0dd88 feat:风控引擎执行异常或者现场编译异常时视为不通过,并且返回前端,落数据库 2026-07-17 14:29:44 +08:00
尹峰 b51d39e0ff 增加变量批量删除功能 2026-07-17 14:27:27 +08:00
张名锐 8aa06c1b72 ```
refactor(report): 修改山西结算报告文件生成方法

- 在GenerateFileEntry方法中添加applyFrontendColumnConfig参数,默认值为true
- 更新GenerateReportExcel方法签名以接收applyFrontendColumnConfig参数
- 将ApplySwapValuationColumnConfig调用包装在条件判断中
- 修正PDF和Excel文件生成时的参数传递
- 更新XML文档注释以反映新参数的作用
```
2026-07-17 13:35:23 +08:00
张名锐 c41e677042 Merge remote-tracking branch 'origin/glms/feature/1.4.2' into glms/feature/1.4.2 2026-07-17 13:17:39 +08:00
张名锐 7fac6e13a8 feat(swaptrade): 实现收益结算审批页面期末价格回显功能
- 在incomeSwapTrade.js中修改TradingAmountAvg赋值逻辑,区分普通打开和审批打开场景
- 新增resolveIncomeTradingAmountAvg函数处理审批回显和普通默认值的不同逻辑
- 审批打开时保留已提交的期末全价,普通打开时使用期初全价作为默认值
- 统一债券价格×100缩放到界面百分比显示格式
- 添加单元测试验证审批回显和普通打开的功能差异
2026-07-17 13:17:28 +08:00
hjhan 42602055de test(eod): 为 FR007 入库 UnderlyingId 守卫补纯函数单测
- EodPriceService 抽出纯函数 ResolveUnderlyingIdForCode(行为不变),SyncUnderlyingIdFromCode 调用之,便于无库单测
- 新增 EodPriceUnderlyingIdGuardTest:7 用例全过,覆盖空代码/标的不存在维持原值、已一致不改动、FR007 错行(511160.SH=2173889、159111.SZ=2173890)校正为 2170838、非错配不互相覆盖
- 对应根因:GLMS-20260701 FR007 价格行 UnderlyingId 错挂导致网页查得到/结算查不到
2026-07-17 11:24:11 +08:00
尹峰 b849841545 Merge branch 'feature/p132_74-risk-engine' of https://gitee.glmszq.com/gsty/onederiv/trs into feature/p132_74-risk-engine 2026-07-17 11:04:15 +08:00
尹峰 180f113433 优化变量保存校验和变量公式替换逻辑 2026-07-17 11:03:43 +08:00
hjhan e261137c1d fix(swap): 修复多次部分平仓 ClosePercent 口径(A占期初→B占剩余)转换缺失
- SwapDealService.ApplySwapTrade 入口补 ToRemainingClosePercent(A→B) 转换,与 SwapUnwind 保持一致;缺此转换导致 SaveSwapDealInternal 的 B→A 还原出错(GLMS-20260701-0006:第二次部分平仓50%被错误还原为32.5%)
- unwindSwapTrade.js 改用 swapCalc.calcCloseQtyByOriginalPercent 的 roundHalfAwayFromZero,规避 JS 浮点精度偏差(32500000*(0.5/0.65) 应为 25000000)
- SwapUnwind.cshtml 引入 swapCalc.js
- 新增 ApplySwapTradeClosePercentBugTest 回归测试;补充 swapCalc.test.js 精度用例与 GLMS20260701DbDiagnoseTest 诊断测试([Ignore])
2026-07-17 10:59:18 +08:00
张名锐 4f23ad9c0f Merge remote-tracking branch 'origin/glms/feature/1.4.2' into glms/feature/1.4.2 2026-07-17 10:58:41 +08:00
张名锐 415539704d fix(swap): 修复债券结息价差盈亏计算逻辑
- 将价差盈亏计算从使用CloseNotionalValue改为使用PositionQty和ContractSize
- 更新前端JavaScript代码中的计算公式,按持仓数量和合约乘数计算价差盈亏
- 在UnwindInput模型中添加PositionQty和ContractSize字段
- 修正后台计算服务中的数据映射逻辑
- 添加FC_009测试用例验证债券价差按数量计算的正确性
- 更新现有测试用例的输入参数以匹配新的计算方式
2026-07-17 10:58:31 +08:00
hjhan 75988a33eb fix: eod_commodity_future_price 入库前以 UnderlyingCode 重派生 UnderlyingId,防止 FR007 等价格行 UnderlyingId 与 FutureContractId 失同步
- 新增 EodPriceService.SyncUnderlyingIdFromCode:入库前以 UnderlyingCode(FutureContractId) 为准反查真实 UnderlyingId,不一致则告警并自动校正
- SaveEodFuturePrice(web编辑/新增)、SettlementPriceImportService(xlsx上传)、EodSyntheticPriceSaveService(系统合成价) 写入前调用
- 根治'网页端能查到、EOD结算查不到'的失同步问题
2026-07-17 10:32:57 +08:00
ruisu 9dad4cb8d0 fix:风控引擎的数据库对象不再采用全局,防止追踪所有查询出的对象 2026-07-17 10:28:21 +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