Files
zszq-trs/YLErpDAL/Modules/IntradayModule/IntradayCloseInfoQueryService.cs
2024-05-09 14:06:26 +08:00

159 lines
5.6 KiB
C#

namespace YLErp.Modules.IntradayModule
{
/// <summary>
/// 日终清算--了结信息流水
/// </summary>
public class IntradayCloseInfoQueryService : YLBaseService<IntradaySettleInfoQueryContext>
{
public IntradayCloseInfoQueryService(IntradaySettleInfoQueryContext context) : base(context)
{
}
public IEnumerable<IntradayCloseInfoField> GetIntradayCloseInfoList(DateTime valueDate, List<int> clientIdsOfInside = null)
{
valueDate = valueDate.Date;
var tradeQuery = DbContext.trade.AsQueryable();
if (clientIdsOfInside != null)
{
tradeQuery = tradeQuery.Where(a => !clientIdsOfInside.Contains(a.ClientId));
}
var query = from tc in DbContext.trade_cash
join td in tradeQuery on tc.TradeId equals td.id
//join tcSwap in DbContext.trade_cash_swap on tc.id equals tcSwap.TradeId into tcSwap_t
//from tcSwap in tcSwap_t.DefaultIfEmpty()
where tc.ValueDate == valueDate && tc.ValidState != ConsGlobal.InValid && !tc.IsDeleted
&& (tc.Action == ClientCashInCashOut.系统操作_行权费 || tc.Action == ClientCashInCashOut.系统操作_平仓费
|| tc.Action == ClientCashInCashOut.系统操作_票息 && tc.IsLastAction)
&& td.ValidState != ConsGlobal.InValid && td.IsGroup != 2
select new
{
td.ClientId,
td.TradeNumber,
td.TradeType,
td.StructureType,
td.TradePrice,
td.BuySell,
td.TradeDate,
td.OptionType,
td.UnderlyingCode,
tcAction = tc.Action,
tcAmount = tc.Amount,
tc.UnwindPercentRate
};
var datas = query.ToArray();
var list = new List<IntradayCloseInfoField>(datas.Length);
var tradeNumberList = datas.Where(O => O.TradeType == "收益互换").Select(O => O.TradeNumber).ToHashSet();
var swapDict = (from t in DbContext.trade
join ts in DbContext.trade_swap
on t.id equals ts.TradeId
where tradeNumberList.Contains(t.TradeNumber)
select
new
{
t.TradeNumber,
LongShort = ts.IsGetFloatingProfit ? ts.GetLongShort : ts.PayLongShort,
}
).ToDictionary(K => K.TradeNumber, V => V.LongShort);
foreach (var n in datas)
{
var um = DataCacheProvider.GetUnderlyingDataSource().GetData(n.UnderlyingCode);
var f = new IntradayCloseInfoField
{
TradeNumber = n.TradeNumber,
TradeType = n.TradeType,
StructureType = n.StructureType,
TradeSide = n.BuySell,
TradeDate = n.TradeDate.OtcFormatDate(),
CallPut = n.TradeType == "收益互换" && swapDict.ContainsKey(n.TradeNumber) ? swapDict[n.TradeNumber] : ConsGlobal.CallPut.IsCall(n.OptionType) ? "多头" : "空头",
UnderlyingCode = n.UnderlyingCode,
UnderlyingName = um.UnderlyingName,
CloseFee = 0,
ClientNumber = null,
CloseProfit = CalculationModule.TradeCalcHelper.CalcWinLoss(tradeType: n.TradeType, buySell: n.BuySell, tradePrice: n.TradePrice ?? 0, tcUnwindPercent: n.UnwindPercentRate ?? 0, tcAmount: n.tcAmount)
};
if (_context.TryGetClientInfo(n.ClientId, out var clientInfo))
{
f.ClientNumber = clientInfo.Number;
}
list.Add(f);
}
return list;
}
}
/// <summary>
/// 日终清算--了结信息流水
/// </summary>
public class IntradayCloseInfoField
{
/// <summary>
/// 交易编号
/// </summary>
public string TradeNumber { get; set; }
/// <summary>
/// 子账户编码
/// </summary>
public string ClientNumber { get; set; }
/// <summary>
/// 交易类型
/// </summary>
public string TradeType { get; set; }
/// <summary>
/// 交易日期
/// </summary>
public string TradeDate { get; set; }
/// <summary>
/// 交易方向
/// </summary>
public string TradeSide { get; set; }
/// <summary>
/// 看涨看跌
/// </summary>
public string CallPut { get; set; }
/// <summary>
/// 标的代码
/// </summary>
public string UnderlyingCode { get; set; }
/// <summary>
/// 标的名称
/// </summary>
public string UnderlyingName { get; set; }
/// <summary>
/// 结构类型
/// </summary>
public string StructureType { get; set; }
/// <summary>
/// 平仓盈亏
/// </summary>
public double CloseProfit { get; set; }
/// <summary>
/// 手续费
/// </summary>
public double CloseFee { get; set; }
}
}