diff --git a/UnitTestProject/Modules/SwapModule/ReturnLegs/DirectionRatioTest.cs b/UnitTestProject/Modules/SwapModule/ReturnLegs/DirectionRatioTest.cs
new file mode 100644
index 00000000..ac36a4f2
--- /dev/null
+++ b/UnitTestProject/Modules/SwapModule/ReturnLegs/DirectionRatioTest.cs
@@ -0,0 +1,27 @@
+using Microsoft.VisualStudio.TestTools.UnitTesting;
+using YLErp.DBModels;
+using YLErp.DBModels.Enums;
+using YLErp.Modules.SwapModule.ReturnLegs;
+
+namespace UnitTestProject.Modules.SwapModule.ReturnLegs
+{
+ [TestClass]
+ public class DirectionRatioTest
+ {
+ [TestMethod]
+ public void LongShort_多头_返回1()
+ => Assert.AreEqual(1, DirectionRatio.LongShort((int)PositionTypeFlag.Long));
+
+ [TestMethod]
+ public void LongShort_空头_返回负1()
+ => Assert.AreEqual(-1, DirectionRatio.LongShort((int)PositionTypeFlag.Short));
+
+ [TestMethod]
+ public void ReceivePay_收取_返回1()
+ => Assert.AreEqual(1, DirectionRatio.ReceivePay((int)SwapDirectionEnum.收取));
+
+ [TestMethod]
+ public void ReceivePay_支付_返回负1()
+ => Assert.AreEqual(-1, DirectionRatio.ReceivePay((int)SwapDirectionEnum.支付));
+ }
+}
diff --git a/YLErpDAL/Modules/SwapModule/ReturnLegs/DirectionRatio.cs b/YLErpDAL/Modules/SwapModule/ReturnLegs/DirectionRatio.cs
new file mode 100644
index 00000000..13808855
--- /dev/null
+++ b/YLErpDAL/Modules/SwapModule/ReturnLegs/DirectionRatio.cs
@@ -0,0 +1,22 @@
+using YLErp.DBModels;
+using YLErp.DBModels.Enums;
+
+namespace YLErp.Modules.SwapModule.ReturnLegs;
+
+///
+/// 方向因子计算。把 PositionType / SwapDirection 转成 +1/-1 乘数。
+///
+/// 多空方向(Long/Short)和收付方向(收取/支付)在代码里反复写成三元表达式,
+/// 散落在 SwapEodPositionService 15处 + SwapDealService 多处。
+/// 收敛到统一方法, 消除 +1/-1 写反的风险。
+///
+public static class DirectionRatio
+{
+ /// 多空方向因子。多头=+1, 空头=-1。
+ public static int LongShort(int positionType)
+ => positionType == (int)PositionTypeFlag.Long ? 1 : -1;
+
+ /// 收付方向因子。收取=+1, 支付=-1。
+ public static int ReceivePay(int direction)
+ => direction == (int)SwapDirectionEnum.收取 ? 1 : -1;
+}
diff --git a/YLErpDAL/Modules/SwapModule/SwapDealService.cs b/YLErpDAL/Modules/SwapModule/SwapDealService.cs
index ba511cd9..99d25b3e 100644
--- a/YLErpDAL/Modules/SwapModule/SwapDealService.cs
+++ b/YLErpDAL/Modules/SwapModule/SwapDealService.cs
@@ -1798,8 +1798,8 @@ namespace YLErp.Modules.SwapModule
BondPaymentService servie = new BondPaymentService(UserInfo);
var payments = servie.GetBondPayments(flowEvent.UnderlyingCode, td.StartDate.Value, date);
- int shortRatio = flowEvent.PositionType == (int)PositionTypeFlag.Long ? 1 : -1;
- int directionRatio = flowEvent.PayDirection == (int)SwapDirectionEnum.收取 ? 1 : -1;
+ int shortRatio = DirectionRatio.LongShort(flowEvent.PositionType);
+ int directionRatio = DirectionRatio.ReceivePay(flowEvent.PayDirection);
// + 付息日>上日日终且小于等于平仓日期的分红数据
var dividendIn = servie.CalcPayment(payments, unwindQty, shortRatio, directionRatio);
var um = DataCacheProvider.GetUnderlyingDataSource().GetData(flowEvent.UnderlyingCode);
diff --git a/YLErpDAL/Modules/SwapModule/SwapEodPositionService.cs b/YLErpDAL/Modules/SwapModule/SwapEodPositionService.cs
index c9da80f1..4aa6adc0 100644
--- a/YLErpDAL/Modules/SwapModule/SwapEodPositionService.cs
+++ b/YLErpDAL/Modules/SwapModule/SwapEodPositionService.cs
@@ -1693,7 +1693,7 @@ namespace YLErp.Modules.SwapModule
{
payQty = Math.Abs(payQty);
int ratio = eventFlow.PayDirection == (int)SwapDirectionEnum.收取 ? 1 : -1;//收取为正,支付为负
- int shortRatio = newEodPayPosition.PositionType == (int)PositionTypeFlag.Long ? 1 : -1;//多空方向
+ int shortRatio = DirectionRatio.LongShort(newEodPayPosition.PositionType);
newEodPayPosition.ValueDate = eventFlow.PayDate.Value;
newEodPayPosition.PositionId = eventFlow.PositionId;
newEodPayPosition.ClientId = td.ClientId;
@@ -1791,7 +1791,7 @@ namespace YLErp.Modules.SwapModule
return curretEod;
}
var dealDate = curretEod.ValueDate;
- int shortRatio = eod.PositionType == (int)PositionTypeFlag.Long ? 1 : -1;
+ int shortRatio = DirectionRatio.LongShort(eod.PositionType);
int directionRatio = eod.PosiDirection == (int)SwapDirectionEnum.收取 ? 1 : -1;
curretEod.PosiStatus = curretEod.PosiQuantity == 0 ? 1 : 0;
var price = GetSwapValuationPrice(eod.UnderlyingCode, dealDate, out decimal vobp);
@@ -1883,7 +1883,7 @@ namespace YLErp.Modules.SwapModule
return curretEod;
}
var dealDate = curretEod.ValueDate;
- int shortRatio = eod.PositionType == (int)PositionTypeFlag.Long ? 1 : -1;
+ int shortRatio = DirectionRatio.LongShort(eod.PositionType);
int directionRatio = eod.PosiDirection == (int)SwapDirectionEnum.收取 ? 1 : -1;
var price = GetSwapValuationPrice(eod.UnderlyingCode, dealDate, out decimal vobp);
var todayConsumedDividend = CalcConsumedDividend(curretEod, unwindEvents);
@@ -1971,7 +1971,7 @@ namespace YLErp.Modules.SwapModule
{
return;
}
- int shortRatio = eod.PositionType == (int)PositionTypeFlag.Long ? 1 : -1;
+ int shortRatio = DirectionRatio.LongShort(eod.PositionType);
int directionRatio = eod.PosiDirection == (int)SwapDirectionEnum.收取 ? 1 : -1;
var unwindFlowEvents = unwindEvents.Where(x => x.EventType == (int)SwapFlowEventTypeEnum.平仓).ToList();
var openFlowEvents = unwindEvents.Where(x => x.EventType == (int)SwapFlowEventTypeEnum.开仓).ToList();
@@ -2052,7 +2052,7 @@ namespace YLErp.Modules.SwapModule
curretEod.SwapTradeId = td.id;
curretEod.PositionId = position.id;
curretEod.ClientId = td.ClientId;
- int shortRatio = position.PositionType == (int)PositionTypeFlag.Long ? 1 : -1;
+ int shortRatio = DirectionRatio.LongShort(position.PositionType);
int directionRatio = position.PosiDirection == (int)SwapDirectionEnum.收取 ? 1 : -1;
curretEod.PositionType = position.PositionType;
var eod = new eod_swap_position()