SwapDealService的10个private static纯逻辑方法搬到两个新文件: - UnwindNormalizer.cs: NormalizeNotionalValues/FullCloseRequest/Recalculate/IsFullClose/SettledInterestAmounts/EventUnwindDate (6个) - TradingFeeCalc.cs: CalcInitTradingFee/CalcInitTradingFeePending (2个) SwapDealService内21处调用点加类名前缀, 反射测试改为直接调用(public) SwapModule零回归(7基线/510通过)
44 lines
1.6 KiB
C#
44 lines
1.6 KiB
C#
using YLErp.DBModels;
|
|
using YLErp.DBModels.Consts;
|
|
|
|
namespace YLErp.Modules.SwapModule;
|
|
|
|
/// <summary>
|
|
/// 平仓手续费计算——纯 static,无 this 依赖。
|
|
/// 从 SwapDealService 提取,零行为变更。
|
|
/// </summary>
|
|
public static class TradingFeeCalc
|
|
{
|
|
public static decimal CalcInitTradingFee(swap_position oriPosition, UnwindData unwindData)
|
|
{
|
|
if (oriPosition == null || unwindData == null)
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
if (oriPosition.PosiFeeType == 1)
|
|
{
|
|
return Math.Round(oriPosition.PosiTradingFeeUnit * unwindData.CloseQty, ConsGlobal.MoneyRound, MidpointRounding.AwayFromZero);
|
|
}
|
|
|
|
return Math.Round(oriPosition.PosiTradingFeeUnit / 100m * unwindData.CloseNotionalValue, ConsGlobal.MoneyRound, MidpointRounding.AwayFromZero);
|
|
}
|
|
|
|
public static decimal CalcInitTradingFeePending(swap_position oriPosition, swap_position position, UnwindData unwindData)
|
|
{
|
|
if (oriPosition == null || unwindData == null || oriPosition.PosiTradingFeeUnit == 0)
|
|
{
|
|
return position?.PosiTradingFeePending ?? 0;
|
|
}
|
|
|
|
var closeBase = oriPosition.PosiFeeType == 1 ? unwindData.CloseQty : unwindData.CloseNotionalValue;
|
|
var originalBase = oriPosition.PosiFeeType == 1 ? unwindData.NotionalQty : unwindData.NotionalValue;
|
|
if (originalBase <= 0)
|
|
{
|
|
return position?.PosiTradingFeePending ?? 0;
|
|
}
|
|
|
|
return Math.Round(oriPosition.PosiTradingFeePending * closeBase / originalBase, ConsGlobal.MoneyRound, MidpointRounding.AwayFromZero);
|
|
}
|
|
}
|