Merge branch 'glms/feature/1.4.2' into glms/feature/dotnumber

# Conflicts:
#	YLErpWeb/App_Data/Config/otcformat.js
#	YLErpWeb/Views/SwapTrade2/TradeEdit.cshtml
#	YLErpWeb/wwwroot/Scripts/app/swaptrade/swapTradeEdit.js
This commit is contained in:
张名锐
2026-07-30 10:50:44 +08:00
64 changed files with 4259 additions and 497 deletions
@@ -17,16 +17,29 @@ namespace YLErp.Modules.SwapModule
return (decimal)method.Invoke(null, new object[] { position, unwindData });
}
private static decimal InvokeCalcInitTradingFeePending(swap_position oriPosition, swap_position position, UnwindData unwindData)
{
var method = typeof(SwapDealService).GetMethod(
"CalcInitTradingFeePending",
BindingFlags.NonPublic | BindingFlags.Static);
Assert.IsNotNull(method, "CalcInitTradingFeePending was not found");
return (decimal)method.Invoke(null, new object[] { oriPosition, position, unwindData });
}
[TestMethod]
public void _按平仓名义本金计算并四舍五入到两位()
{
var position = new swap_position
{
PosiFeeType = 0,
PosiTradingFeeUnit = 0.1234m
PosiTradingFeeUnit = 0.1234m,
PosiTradingFeePending = 1234.00m
};
var unwindData = new UnwindData
{
NotionalValue = 1_000_000m,
CloseNotionalValue = 1_000_000m,
CloseQty = 8888m
};
@@ -42,10 +55,12 @@ namespace YLErp.Modules.SwapModule
var position = new swap_position
{
PosiFeeType = 1,
PosiTradingFeeUnit = 1.235m
PosiTradingFeeUnit = 1.235m,
PosiTradingFeePending = 12.35m
};
var unwindData = new UnwindData
{
NotionalQty = 10m,
CloseNotionalValue = 1_000_000m,
CloseQty = 10m
};
@@ -61,5 +76,73 @@ namespace YLErp.Modules.SwapModule
Assert.AreEqual(0m, InvokeCalcInitTradingFee(null, new UnwindData()));
Assert.AreEqual(0m, InvokeCalcInitTradingFee(new swap_position(), null));
}
[TestMethod]
public void BaseRatePendingFeeUsesTheSameActualCloseAmountAsCloseFee()
{
var oriPosition = new swap_position
{
PosiFeeType = 1,
PosiTradingFeeUnit = 0.2m
};
oriPosition.PosiTradingFeePending = 2000m;
var position = new swap_position { PosiTradingFeePending = 840m };
var unwindData = new UnwindData { NotionalQty = 10000m, CloseQty = 3000m, CloseNotionalValue = 4200m };
var fee = InvokeCalcInitTradingFeePending(oriPosition, position, unwindData);
Assert.AreEqual(600m, fee);
}
[TestMethod]
public void BaseRatePendingFeeAllocatesManuallyAdjustedOriginalPendingFee()
{
var oriPosition = new swap_position
{
PosiFeeType = 1,
PosiTradingFeeUnit = 0.2m,
PosiTradingFeePending = 1500m
};
var unwindData = new UnwindData { NotionalQty = 10000m, CloseQty = 3000m };
var fee = InvokeCalcInitTradingFeePending(oriPosition, new swap_position(), unwindData);
Assert.AreEqual(450m, fee);
}
[TestMethod]
public void PartialCloseTradingFeeAndPendingFeeUseTheSameRoundedOriginalFeeAllocation()
{
var oriPosition = new swap_position
{
PosiFeeType = 0,
PosiTradingFeeUnit = 1.1234m,
PosiTradingFeePending = 113.46m
};
var unwindData = new UnwindData
{
NotionalValue = 10098m,
CloseNotionalValue = 4039.2m,
NotionalQty = 10000m,
CloseQty = 4000m
};
var tradingFee = InvokeCalcInitTradingFee(oriPosition, unwindData);
var pendingFee = InvokeCalcInitTradingFeePending(oriPosition, new swap_position(), unwindData);
Assert.AreEqual(45.38m, tradingFee);
Assert.AreEqual(45.38m, pendingFee);
}
[TestMethod]
public void LegacyPendingFeeKeepsCurrentPositionValueWhenNoBaseRateIsConfigured()
{
var oriPosition = new swap_position { PosiTradingFeeUnit = 0m };
var position = new swap_position { PosiTradingFeePending = 840m };
var fee = InvokeCalcInitTradingFeePending(oriPosition, position, new UnwindData());
Assert.AreEqual(840m, fee);
}
}
}