Merge branch 'glms/feature/1.4.2' of http://git.yiliantech.com/gitlab/otc-dev/zszq-trs into glms/feature/1.4.2

This commit is contained in:
锦麟 王
2026-04-14 11:24:11 +08:00
4 changed files with 42 additions and 28 deletions
+35 -22
View File
@@ -181,8 +181,8 @@ namespace YLErp.Modules.SwapModule
unwindData.StartDate = preDealDate.Value;
}
unwindData.ValueDate = dealDate;
unwindData.UnwindDate = unwindData.UnwindDate;
unwindData.PayDate = QdpCalendarHelper.GetNonHoliday(unwindData.UnwindDate.Value.AddDays(td.trade_extend.ExtendObj.SettlementRules));
unwindData.UnwindDate = dealDate;
unwindData.PayDate = QdpCalendarHelper.GetNonHoliday(dealDate.AddDays(td.trade_extend.ExtendObj.SettlementRules));
unwindData.SwapTradeId = tradeId;
unwindData.NotionalValue = Convert.ToDecimal(td.OriginalStockEqvNotional ?? 0);
unwindData.NotionalQty = positions.Sum(s => s.PosiQuantity);
@@ -610,17 +610,17 @@ namespace YLErp.Modules.SwapModule
DateTime lastSwapDate = preEodPosition.ValueDate;
decimal interestProfitSum = preEodPosition.InterestProfitSum;
var TdInterestPrincipal = preEodPosition.TdInterestPrincipal;
decimal interest = 0;
decimal tdinterest = 0;
decimal interest = interestProfitSum * closePercent;
decimal tdinterest = interestProfitSum * closePercent;
int interestPeriod = position.interest_rest_days ?? 1;
decimal dynomicPrincipal = principal;
decimal tdDynomicPrincipal = posiPrincipal;
var calcDays = (endDate - tradeDate).Days;
var calcDays = (endDate - lastSwapDate).Days;
double floatRate = Convert.ToDouble(floateRate);
for (int i = 0; i <= calcDays; i++)
{
var rateDate = tradeDate.AddDays(i);
if (rateDate > lastSwapDate || endDate == tradeDate)
var rateDate = lastSwapDate.AddDays(i);
if (rateDate > lastSwapDate || endDate == lastSwapDate)
{
if (i % interestPeriod == 0)
{
@@ -663,11 +663,6 @@ namespace YLErp.Modules.SwapModule
tdinterest += tdinterest1;
}
else if (lastSwapDate >= rateDate)
{
interest = interestProfitSum * closePercent;
tdinterest = interestProfitSum * closePercent;
}
}
InterestAmount = Math.Round(interest, ConsGlobal.PriceRound, MidpointRounding.AwayFromZero);
@@ -1150,8 +1145,8 @@ namespace YLErp.Modules.SwapModule
});
}
unwindData.SwapCloseAmount = decimal.Parse(unwindData.SwapCloseAmount.ToString("0.00"));
unwindData.SwapRealizedPnL = unwindData.SwapCloseAmount;
unwindData.SwapCloseAmount = Math.Round(unwindData.SwapCloseAmount, 2, MidpointRounding.AwayFromZero);
unwindData.SwapRealizedPnL = Math.Round(unwindData.SwapRealizedPnL, 2, MidpointRounding.AwayFromZero);
}
/// <summary>
/// 多空组合平仓
@@ -1188,7 +1183,7 @@ namespace YLErp.Modules.SwapModule
catch (Exception ex)
{
trans.Rollback();
throw ex;
throw;
}
finally
{
@@ -1214,12 +1209,20 @@ namespace YLErp.Modules.SwapModule
{
int clientCashId = AddClientCashInCashOut(td, Convert.ToDouble(unwindData.SwapCloseAmount), ClientCashInCashOut._互换, unwindData.ValueDate);
SaveSwapDeal(unwindData, (int)SwapEventTypeEnum., clientCashId, "系统操作_互换");
td.UnWindDate = unwindData.UnwindDate;
if (td.ExerciseDate <= unwindData.ValueDate)
{
td.Notional = 0;
td.StockEqvNotional = 0;
td.TradeStatus = "已到期";
}
DbContext.SaveChanges();
trans.Commit();
}
catch (Exception ex)
{
trans.Rollback();
throw ex;
throw;
}
finally
{
@@ -1267,7 +1270,7 @@ namespace YLErp.Modules.SwapModule
catch (Exception ex)
{
trans.Rollback();
throw ex;
throw;
}
finally
{
@@ -1345,7 +1348,7 @@ namespace YLErp.Modules.SwapModule
catch (Exception ex)
{
trans.Rollback();
throw ex;
throw;
}
finally
{
@@ -1412,10 +1415,20 @@ namespace YLErp.Modules.SwapModule
{
if (!string.IsNullOrEmpty(position.UnderlyingCode))
{
position.PosiQuantity -= unwindData.CloseQty;
position.PosiNotionalValue = unwindData.PosiNotionalValue - unwindData.CloseNotionalValue;
position.PosiTradingFee -= position.PosiTradingFee * unwindData.ClosePercent;
position.PosiTradingFeePending -= position.PosiTradingFeePending * unwindData.ClosePercent;
// 收益结算(互换)不改变持仓数量和名义本金,只更新费用
if (eventType == (int)SwapEventTypeEnum.)
{
position.PosiTradingFee -= position.PosiTradingFee * unwindData.ClosePercent;
position.PosiTradingFeePending -= position.PosiTradingFeePending * unwindData.ClosePercent;
}
else
{
// 平仓时才扣减持仓
position.PosiQuantity -= unwindData.CloseQty;
position.PosiNotionalValue -= unwindData.CloseNotionalValue;
position.PosiTradingFee -= position.PosiTradingFee * unwindData.ClosePercent;
position.PosiTradingFeePending -= position.PosiTradingFeePending * unwindData.ClosePercent;
}
}
else
{
+2 -2
View File
@@ -940,8 +940,8 @@
<td class="@fbgclass" style="width:116px !important;">@((SwapDirectionEnum)closeFloat.PayDirection)</td>
<td>@(closeFloat.PositionType == (int)PositionTypeFlag.Long ? "多头" : "空头")</td>
<td>@closeFloat.UnderlyingCode</td>
<td>@(closeFloat.PosiGrossPrice * multiplier).OtcFormat(OtcFormatFlag.umpriceP)</td>
<td>@((closeFloat.TradingAmountNetAvg ?? 0) * multiplier).OtcFormat(OtcFormatFlag.umpriceP)</td>
<td>@((closeFloat.PosiGrossPrice * multiplier).OtcFormat(OtcFormatFlag.umpriceP))</td>
<td>@(((closeFloat.TradingAmountNetAvg ?? 0) * multiplier).OtcFormat(OtcFormatFlag.umpriceP))</td>
<td>@((closeFloat.TradingAmountAvg * multiplier).OtcFormat(OtcFormatFlag.umpriceP))</td>
<td>@((closeFloat.PositionQty??0).OtcFormat(OtcFormatFlag.StockEqvNotional))</td>
<td>@(closeFloat.TradingFee.OtcFormat(OtcFormatFlag.StockEqvNotional))</td>
@@ -144,10 +144,10 @@ const vue = new Vue({
thisObj.deal.SwapMarginAmount = 0;
thisObj.floatPosition.TradingAmount = parseFloat(thisObj.floatPosition.TradingAmountAvg) * parseFloat(thisObj.deal.CloseNotionalValue) * 0.01;
thisObj.floatPosition.CloseFee = TradingFee;
if (thisObj.deal.PositionQty == 0) {
thisObj.floatPosition.TradingAmountFeeAvg = 0;
} else {
if (thisObj.deal.CloseQty > 0) {
thisObj.floatPosition.TradingAmountFeeAvg = parseFloat(thisObj.floatPosition.TradingAmountAvg) * 0.01 + (TradingFee / thisObj.deal.CloseQty) * floatRatio;
} else {
thisObj.floatPosition.TradingAmountFeeAvg = parseFloat(thisObj.floatPosition.TradingAmountAvg) * 0.01;
}
this.interestList.forEach(x => {
//let interestRatio = x.InterestDirection == 1 ? 1 : -1;
@@ -113,7 +113,8 @@ const vue = new Vue({
}
let reqObj = _.cloneDeep(thisObj.deal);
let marginCloneList = _.cloneDeep(thisObj.marginList);
reqObj.FlowEvents = thisObj.interestList;
reqObj.FlowEvents = _.cloneDeep(thisObj.interestList);
marginCloneList.forEach((item) => {
reqObj.FlowEvents.push(item);
})