feat(swap): 新增基础费率字段,支持百分比/单位数量模式切换及自动计算

- 浮动收益端新增基础费率列(原单位交易费用),位于数量与交易费用后付之间
- 支持百分比模式(4位小数)与单位数量模式(2位小数)切换,默认百分比
- 填入基础费率后自动计算交易费用后付,手动修改后反算基础费率
- 平仓时根据 PosiFeeType 自动计算平仓交易费用,支持全部/部分平仓联动
- 收益结算(手动互换)不自动填充平仓交易费用
- 查看交易页面新增基础费率展示(百分比带%后缀4位,单位数量2位)
- swap_position 表新增 PosiFeeType 字段标识费率模式(0=百分比 1=单位数量)
- 切换模式时基础费率和交易费用归零,避免精度冲突
- 修复 TradeView.cshtml 引用了不存在字段 category_tag 的编译错误
This commit is contained in:
tengyufan
2026-07-24 17:32:07 +08:00
parent d0693b2192
commit c9071a4eff
8 changed files with 146 additions and 54 deletions
@@ -291,6 +291,11 @@ namespace YLErp.Modules.SwapModule
floatEvent.UnderlyingInstrumentType = position.UnderlyingInstrumentType;
floatEvent.CloseFee = 0;
floatEvent.BeforeCloseFee = oriPosition.PosiTradingFeePending;
//自动计算平仓交易费用
floatEvent.TradingFee = CalcInitTradingFee(oriPosition, unwindData);
//向前端传递单位交易费用和模式标记(NotMapped,不存库)
floatEvent.PosiTradingFeeUnit = oriPosition.PosiTradingFeeUnit;
floatEvent.PosiFeeType = oriPosition.PosiFeeType;
floatEvent.MarkClosePnl = 0;
floatEvent.PayDirection = position.PosiDirection;
floatEvent.PosiGrossPrice = position.PosiGrossPrice;
@@ -314,6 +319,22 @@ namespace YLErp.Modules.SwapModule
return unwindData;
}
/// <summary>
/// 计算初始平仓交易费用
/// </summary>
private decimal CalcInitTradingFee(swap_position oriPosition, UnwindData unwindData)
{
if (oriPosition.PosiFeeType == 0)
{
//百分比模式:费率%/100 × 平仓名义本金
return Math.Round(oriPosition.PosiTradingFeeUnit / 100m * (decimal)unwindData.CloseNotionalValue, 2, MidpointRounding.AwayFromZero);
}
else
{
//单位数量模式:单位费率 × 平仓数量
return Math.Round(oriPosition.PosiTradingFeeUnit * (decimal)unwindData.CloseQty, 2, MidpointRounding.AwayFromZero);
}
}
/// <summary>
/// 校验上日是否收盘
/// </summary>
/// <param name="tradeId"></param>