Files
zszq-trs/YLErpDAL/Modules/TradeModule/DocGenerateModule/SettlementBillGenerateContext.cs
T
2024-05-09 14:06:26 +08:00

96 lines
4.4 KiB
C#

using YLErp.BLL.MarginCalculation;
using YLErp.DBModels.Abstract;
using YLErp.DBModels.Consts;
using YLErp.Modules.CalculationModule;
using YLErp.Modules.DataProviderModule;
using YLErp.Plugins.TradeDocGenerator.Abstracts;
namespace YLErp.Modules.TradeModule.DocGenerateModule
{
/// <summary>
/// 交易结算生成上下文
/// </summary>
public class SettlementBillGenerateContext : ConfirmationGenerateContext, ITradeSettleBillGeneratorContext
{
public SettlementBillGenerateContext(IEnumerable<int> tradeCashIds, IEnumerable<trade> trades, string contractType, OptUserInfo userInfo, DateTime? startDate, DateTime? endDate)
: base(tradeCashIds, trades, contractType, userInfo, startDate, endDate) { }
public SettlementBillGenerateContext(int tradeCashId, trade tradeObj, string contractType, OptUserInfo userInfo)
: base(tradeCashId, tradeObj, contractType, userInfo) { }
public SettlementBillGenerateContext(Client client, List<swap_flow_event> flowEvents, List<swap_flow_event> allFlowEvents, List<trade> trades, List<swap_position> swapPositions, string contractType, OptUserInfo userInfo)
:base(client, flowEvents, allFlowEvents, trades, swapPositions, contractType, userInfo)
{
}
/// <summary>
/// 获取预付金
/// </summary>
public double? GetMargin(double endPrice)
{
var req = new RunMarginCalculationReq(UserInfo)
{
tradeList = new List<trade> { (trade)Trade },
settleDate = Trade.UnWindDate.Value,
PriceProvider = new SinglePriceProvider(Trade.UnderlyingCode, endPrice)
};
var tradeSpans = MarginDefault.RunMarginCalculation(req);
return tradeSpans?.FirstOrDefault()?.WorstCastClientPayable;
}
//交易确认书对象
trade_contract_document _contractDoc;
/// <summary>
/// 获取交易确认书
/// </summary>
public ITradeContractDocument GetTradeContractDocument(int tradeId, string tradeNumber, bool throwException = true)
{
if (_contractDoc == null)
{
var db = DbContextFactory.GetYLDbContext();
var query = from contractDoc in db.trade_contract_document
join tcr in db.trade_contract_r on contractDoc.Code equals tcr.ContractCode
where tcr.TradeId == tradeId && contractDoc.Type == ContractTypeEnum.Trade && tcr.Type == ContractTypeEnum.Trade && tcr.IsValid
select contractDoc;
_contractDoc = query.FirstOrDefault();
}
if (_contractDoc == null && throwException)
{
throw new ServiceException($"未找到交易确认书(交易编号:{tradeNumber})");
}
return _contractDoc;
}
public bool OnSettlmentBillGenerated()
{
return true;
}
public double GetAverageSpotPrice(OtcTradeBase trade, trade_swap trade_swap)
{
var trades = (from td in DbContext.trade.Where(x => x.ClientId == trade.ClientId && x.UnderlyingCode == trade.UnderlyingCode && x.BuySell == trade.BuySell && x.TradeDate == trade.TradeDate && x.ValidState != "InValid")
join swap in DbContext.trade_swap.Where(x => x.PayLongShort == trade_swap.PayLongShort && x.GetLongShort == trade_swap.GetLongShort)
on td.id equals swap.TradeId
select new { td, swap }).ToList();
var totalSpotPrice = 0.0;
var totalNotional = 0.0;
trades.ForEach(x =>
{
var tradeprice = x.swap.IsGetFloatingProfit ? (x.swap.PayTradePrice ?? 0) : (x.swap.GetTradePrice ?? 0);
var notional = x.swap.IsGetFloatingProfit ? (x.swap.GetNotional ?? 0) : (x.swap.PayNotional ?? 0);
var longshort = x.swap.IsGetFloatingProfit ? x.swap.GetLongShort : x.swap.PayLongShort;
var spotprice = x.swap.IsGetFloatingProfit ? (x.swap.GetSpotPrice ?? 0) : (x.swap.PaySpotPrice ?? 0);
var sigleprice = Math.Abs(tradeprice / notional);
totalSpotPrice += (spotprice + (longshort == "空头" ? -1 : 1) * sigleprice) * notional;
totalNotional += notional;
});
return totalNotional > 0 ? totalSpotPrice / totalNotional : 0;
}
}
}