Files
zszq-trs/YLErpDAL/Modules/TradeModule/TradeBLL.cs
T

3478 lines
177 KiB
C#

using BaseOUDAL;
using Org.BouncyCastle.Ocsp;
using System;
using System.Drawing;
using System.Linq;
using System.Linq.Expressions;
using YLErp.DBModels.Consts;
using YLErp.DBModels.Helpers;
using YLErp.Helpers;
using YLErp.Model;
using YLErp.Model.Enum;
using YLErp.Modules;
using YLErp.Modules.TradeDalModule;
using YLErp.Modules.TradeModule;
using YLErp.QdpModule;
namespace YLErp.BLL
{
public class tradeBLL
{
private readonly YLContext db = new();
/// <summary>
/// 确认成交过程中额外的处理
/// </summary>
public const string LackOfMoney = "LackOfMoney";
public const string RiskWarningConfirm = "RiskWarningConfirm";
public const string IgnoreBreak = "IgnoreBreak";
/// <summary>
/// 根据交易的类型设置其特有的字段
/// 此方法不能在循环中使用
/// </summary>
public static void SetFieldsByTradeType(trade r, DateTime? settleDate = null)
{
if (settleDate == null)
{
settleDate = valuedateBLL.ValueDate;
}
if (r.TradeType == null || r.id <= 0 || !r.EnableSetFieldsByTradeType)
{
return;
}
using var db = DbContextFactory.GetYLDbContext();
switch (r.TradeType == "结构化交易" ? r.StructureType : r.TradeType)
{
case "香草期权":
break;
case "障碍期权":
if (r.trade_barrier_option == null || r.trade_barrier_option.id == 0)
{
r.trade_barrier_option = db.trade_barrier_option.FirstOrDefault(t => t.TradeId == r.id);
}
break;
case "Risky期权":
if (r.trade_risky_option == null || r.trade_risky_option.id == 0)
{
r.trade_risky_option = db.trade_risky_option.FirstOrDefault(t => t.TradeId == r.id);
}
break;
case "二元期权":
if (r.trade_binary_option == null || r.trade_binary_option.id == 0)
{
r.trade_binary_option = db.trade_binary_option.FirstOrDefault(t => t.TradeId == r.id);
}
break;
case "亚式期权":
if (r.trade_asian_option == null || r.trade_asian_option.id == 0)
{
r.trade_asian_option = db.trade_asian_option.FirstOrDefault(t => t.TradeId == r.id);
}
break;
case "彩虹期权":
if (r.trade_rainbow_option == null || r.trade_rainbow_option.id == 0)
{
r.trade_rainbow_option = db.trade_rainbow_option.FirstOrDefault(t => t.TradeId == r.id);
}
break;
case "价差期权":
if (r.trade_spread_option == null || r.trade_spread_option.id == 0)
{
r.trade_spread_option = db.trade_spread_option.FirstOrDefault(t => t.TradeId == r.id);
}
break;
case "合成价差期权":
break;
case "双鲨期权":
if (r.trade_double_sharkfin_option == null || r.trade_double_sharkfin_option.id == 0)
{
r.trade_double_sharkfin_option = db.trade_double_sharkfin_option.FirstOrDefault(t => t.TradeId == r.id);
}
break;
case "区间累积期权":
if (r.trade_rangeaccrual == null || r.trade_rangeaccrual.id == 0)
{
r.trade_rangeaccrual = db.trade_rangeaccrual.FirstOrDefault(t => t.TradeId == r.id);
}
if (r.trade_rangeaccrual != null && r.trade_rangeaccrual.HappenedObservations == null && r.id > 0)
{
r.trade_rangeaccrual.HappenedObservations = db.autocall_observation.Where(t => t.TradeId == r.id).ToList();
}
break;
case "收益增强结构":
if (r.trade_underlying_enhance == null || r.trade_underlying_enhance.id == 0)
{
r.trade_underlying_enhance = db.trade_underlying_enhance.FirstOrDefault(t => t.TradeId == r.id);
}
break;
case "气囊结构":
if (r.trade_airbag == null || r.trade_airbag.id == 0)
{
r.trade_airbag = db.trade_airbag.FirstOrDefault(t => t.TradeId == r.id);
}
break;
case "凤凰期权":
if (r.trade_autocall == null || r.trade_autocall.id == 0)
{
r.trade_autocall = db.trade_autocall.FirstOrDefault(t => t.TradeId == r.id);
}
if (r.trade_autocall != null && r.trade_autocall.HappenedObservations == null && r.id > 0)
{
r.trade_autocall.HappenedObservations = db.autocall_observation.Where(t => t.TradeId == r.id)?.ToList();
}
break;
case "雪球期权":
if (r.trade_snowball == null || r.trade_snowball.id == 0)
{
r.trade_snowball = db.trade_snowball.FirstOrDefault(t => t.TradeId == r.id);
}
break;
case "远期":
if (r.trade_forward == null || r.trade_forward.id == 0)
{
r.trade_forward = db.trade_forward.FirstOrDefault(t => t.TradeId == r.id);
}
break;
case "收益互换":
//if (r.trade_swap == null || r.trade_swap.id == 0)
//{
// r.trade_swap = db.trade_swap.FirstOrDefault(t => t.TradeId == r.id);
// var trade_cash = db.trade_cash.Where(x => x.TradeId == r.id && x.ValueDate <= settleDate && x.Action == ClientCashInCashOut.系统操作_互换 && x.ValidState != "InValid" && !x.IsDeleted)
// .OrderByDescending(x => x.ValueDate).Select(n => new { n.id, n.ValueDate }).FirstOrDefault();
// if (trade_cash != null)
// {
// r.UnWindDate = trade_cash.ValueDate;
// var trade_cash_swap = db.trade_cash_swap.Where(x => x.TradeCashId == trade_cash.id)
// .Select(n => new { n.GetFinalPrice, n.PayFinalPrice }).FirstOrDefault();
// if (trade_cash_swap != null)
// {
// r.trade_swap.GetFinalPrice = trade_cash_swap.GetFinalPrice;
// r.trade_swap.PayFinalPrice = trade_cash_swap.PayFinalPrice;
// }
// }
// else
// {
// r.trade_swap.GetFinalPrice = null;
// r.trade_swap.PayFinalPrice = null;
// }
// if (r.trade_swap.IsGetFloatingProfit)
// {
// var underlying = DataCacheProvider.GetUnderlyingDataSource().GetData(r.trade_swap.GetUnderlyingId ?? 0);
// if (underlying != null && underlying.ContractSize > 0)
// {
// r.trade_swap.GetOpenPrice = r.trade_swap.GetSpotPrice + ((r.trade_swap.GetLongShort == "多头" ? 1 : -1) * (((r.trade_swap.PaySingleFee ?? 0) / underlying.ContractSize) + (r.trade_swap.GetSpotPrice * r.trade_swap.PayUnAnnualRate ?? 0)));
// r.trade_swap.GetLot = r.trade_swap.GetNotional / underlying.ContractSize;
// r.trade_swap.GetContractSize = underlying.ContractSize;
// r.trade_swap.GetCountRatio = underlying.CountRatio;
// }
// }
// else if (r.trade_swap.IsPayFloatingProfit)
// {
// var underlying = DataCacheProvider.GetUnderlyingDataSource().GetData(r.trade_swap.PayUnderlyingId ?? 0);
// if (underlying != null && underlying.ContractSize > 0)
// {
// r.trade_swap.PayOpenPrice = r.trade_swap.PaySpotPrice + ((r.trade_swap.PayLongShort == "多头" ? 1 : -1) * (((r.trade_swap.GetSingleFee ?? 0) / underlying.ContractSize) + (r.trade_swap.PaySpotPrice * r.trade_swap.GetUnAnnualRate ?? 0)));
// r.trade_swap.PayLot = r.trade_swap.PayNotional / underlying.ContractSize;
// r.trade_swap.PayContractSize = underlying.ContractSize;
// r.trade_swap.PayCountRatio = underlying.CountRatio;
// }
// }
// r.get_trade_swap_details = db.trade_swap_detail.Where(x => x.TradeId == r.id && x.IsForGet && x.ValidState != "InValid").ToList();
// r.get_trade_swap_details.ForEach(x => x.ChildTradeNumber = x.ChildTradeId > 0 ? db.trade.Find(x.ChildTradeId).TradeNumber : "");
// r.pay_trade_swap_details = db.trade_swap_detail.Where(x => x.TradeId == r.id && !x.IsForGet && x.ValidState != "InValid").ToList();
// r.pay_trade_swap_details.ForEach(x => x.ChildTradeNumber = x.ChildTradeId > 0 ? db.trade.Find(x.ChildTradeId).TradeNumber : "");
//}
//var customizedResultsGet = QdpHelper.ParseAutocallCustomizedInfo(r.trade_swap.GetSwapTimeAndRate);
//if (customizedResultsGet.Item2 != null)
//{
// var getSwapRates = customizedResultsGet.Item2.Distinct();
// if (getSwapRates != null && getSwapRates.Count() == 1)
// {
// r.trade_swap.GetSwapRate = getSwapRates.First();
// }
//}
//var customizedResultsPay = QdpHelper.ParseAutocallCustomizedInfo(r.trade_swap.PaySwapTimeAndRate);
//if (customizedResultsPay.Item2 != null)
//{
// var paySwapRates = customizedResultsPay.Item2.Distinct();
// if (paySwapRates != null && paySwapRates.Count() == 1)
// {
// r.trade_swap.PaySwapRate = paySwapRates.First();
// }
//}
break;
case "现金流交易":
if (r.trade_cashflow == null || r.trade_cashflow.id == 0)
{
r.trade_cashflow = db.trade_cashflow.FirstOrDefault(t => t.TradeId == r.id);
}
break;
case "累计期权":
if (r.trade_accumulator_option == null || r.trade_accumulator_option.id == 0)
{
r.trade_accumulator_option = db.trade_accumulator_option.FirstOrDefault(t => t.TradeId == r.id);
}
break;
case "自定义交易":
if (r.trade_custom == null || r.trade_custom.id == 0)
{
r.trade_custom = db.trade_custom.FirstOrDefault(t => t.TradeId == r.id);
}
break;
}
if (r.StructureType == "亚式熊市价差")
{
if (r.trade_asian_option == null || r.trade_asian_option.id == 0)
{
r.trade_asian_option = db.trade_asian_option.FirstOrDefault(t => t.TradeId == r.id);
}
}
}
/// <summary>
/// 批量设置期权的详情信息
/// </summary>
public static void SetFieldsByTradeType(IEnumerable<trade> tradeList)
{
new TradeExtendService(OptUserInfo.SystemUser).SetTradeExtend(tradeList);
}
/// <summary>
/// 交易审批列表
/// </summary>
public SearchListResult<TradeLinq> tradeOpeningProcessQuery(TradeReq req, int userId, out tradeGridSum gsum, bool isUnionToday = false, bool isExerciseDateReport = false)
{
req.TradeStatus = "审批中,平仓待复核,行权待复核,互换待复核";
var query = TradeOfQuery(req, userId, isUnionToday, isExerciseDateReport);
var retListResult = query.ToSearchList(req);
gsum = new tradeGridSum();
if (retListResult.records > 0)//if (query.Any())
{
gsum.TradePriceSum = query.Sum(q => q.TradePrice);
}
retListResult.Sum = gsum;
var listRoles = new ErpBaseContext().Roles.Select(n => new { n.Id, n.Name }).ToDictionary(n => n.Id, m => m.Name);
var swapTradeIds = retListResult.rows.Where(r => r.TradeType == "收益互换").Select(r => r.id).Distinct().ToList();
if (!swapTradeIds.Any())
{
swapTradeIds = new List<int>(){ 0 };
}
var swapPositions = db.Set<swap_position>()
.Where(sp => swapTradeIds.Contains(sp.SwapTradeId) && sp.IsInitial && sp.UnderlyingCode != null)
.Select(sp => new { sp.SwapTradeId, sp.PosiNetPrice, sp.UnderlyingCode })
.ToList();
var logger = LogFactory.GetLogger<tradeBLL>();
var posDict = swapPositions.GroupBy(sp => sp.SwapTradeId).ToDictionary(g => g.Key, g => g.First().PosiNetPrice);
var umProvider = DataCacheProvider.GetUnderlyingDataSource();
foreach (var tradeLinq in retListResult.rows)
{
if (tradeLinq.ProcessRoleId != null && listRoles.TryGetValue(tradeLinq.ProcessRoleId.Value, out var name))
{
tradeLinq.ProcessRoleName = name;
}
if (tradeLinq.TradeType == "远期" || tradeLinq.TradeType == "掉期")
{
var option = db.trade_forward.FirstOrDefault(x => x.TradeId == tradeLinq.id);
//远期交易“权利金(成交)” 取“远期开仓费”
tradeLinq.TradeSinglePrice = option.OpenCommission;
}
// --- 新增逻辑:针对收益互换类型,用 swap_position.PosiNetPrice 覆盖展示用的期初标的价格 ---
try
{
if (tradeLinq.TradeType == "收益互换" && posDict.TryGetValue(tradeLinq.id, out var netPrice) && netPrice > 0)
{
// 将期初价格覆盖为互换持仓的 PosiNetPrice(仅使用 PosiDirection != 0 的期初持仓)
logger.Info($"tradeOpeningProcessQuery.DAL override: tradeId={tradeLinq.id} beforeInitialSpot={tradeLinq.InitialSpotPrice} dbPosi={netPrice}");
tradeLinq.InitialSpotPrice = Convert.ToDouble(netPrice);
}
}
catch (Exception ex)
{
// DAL 层不抛出异常以保证查询稳定性,记录错误供排查
LogFactory.GetLogger<tradeBLL>().Error("tradeOpeningProcessQuery.FillSwapPositionPrice", ex);
}
//else if (tradeLinq.TradeType == "收益互换")
//{
// var option = db.trade_swap.FirstOrDefault(x => x.TradeId == tradeLinq.id);
// tradeLinq.PremiumRate = null;
// tradeLinq.TradeSinglePrice = null;
// if (option.SwapType != "多空组合")
// {
// //收益互换“权利金(成交)” 取“互换交易单位交易费用”
// if (option.IsPayFloatingProfit)
// {
// if (option.GetUnAnnualRate > 0) { tradeLinq.PremiumRate = option.GetUnAnnualRate; }
// else
// {
// var PayContractSize = umProvider.GetData(option.PayUnderlyingCode).ContractSize;
// tradeLinq.TradeSinglePrice = (option.GetSingleFee ?? 0) / PayContractSize;
// }
// }
// else
// {
// if (option.PayUnAnnualRate > 0) { tradeLinq.PremiumRate = option.PayUnAnnualRate; }
// else
// {
// var GetContractSize = umProvider.GetData(option.GetUnderlyingCode).ContractSize;
// tradeLinq.TradeSinglePrice = (option.PaySingleFee ?? 0) / GetContractSize;
// }
// }
// }
//}
}
return retListResult;
}
/// <summary>
/// 查询trade
/// </summary>
public List<trade> SearchTradeList(TradeReq req, bool isExerciseDateReport = true, bool isWithStructTrade = false)
{
var query = CreateTradeQuery(req, out _, isExerciseDateReport);
req.rows = 0;
req.page = 1;
var tradeList = query.Take(10000).ToList();
SetFieldsByTradeType(tradeList);
return tradeList;
}
/// <summary>
/// 查询trade 适用于当日交易查询
/// 交易搜索,当日成交显示结构化交易父节点,
/// 当日到期平仓不显示父节点,只显示子节点
/// </summary>
/// isShowOnlyParent 默认为 true
/// isShowOnlyChild 默认为false
/// <param name="req"></param
public SearchListResult<trade> SearchListForTradeConfirm(TradeReq req)
{
var query = CreateValueDateQuery(req, false, true, true);
return query.ToSearchList(req);
}
/// <summary>
/// 只用于交易确认书查询
/// </summary>
public IQueryable<trade> CreateValueDateQuery(TradeReq req, bool isShowOnlyParent,
bool isShowOnlyChild, bool isShowGroupTrade = false)
{
//簿记账户
var query = db.trade.AsNoTracking().AsQueryable();
if (req.UserAssets != null && req.UserClients != null)
{
query = query.Where(t => req.UserAssets.Contains(t.AssetId) || req.UserClients.Contains(t.ClientId));
}
if (PS.Config.Is物产中大)
{
if (!string.IsNullOrEmpty(req.ContractCode))
{
query = from source in query
join tcrConfirm in db.trade_contract_r_number.Where(aa => aa.TradeConfirmNumberType == "C")
on source.id equals tcrConfirm.TradeId into tcrConfirms
from tcrConfirm in tcrConfirms.DefaultIfEmpty()
where tcrConfirm.TradeConfirmNumber == req.ContractCode
select source;
}
}
else
{
if (!string.IsNullOrEmpty(req.ContractCode))
{
query = from source in query
join tcrConfirm in db.trade_contract_r.Where(aa => aa.Type == ContractTypeEnum.Trade && aa.IsValid)
on source.id equals tcrConfirm.TradeId into tcrConfirms
from tcrConfirm in tcrConfirms.DefaultIfEmpty()
where tcrConfirm.ContractCode == req.ContractCode
select source;
}
}
if (req.SealResults != null || req.SealDateStart != null || req.SealDateEnd != null)
{
var docQuery = from source in query
join tcrConfirm in (from aa in db.trade_contract_r where (aa.Type == ContractTypeEnum.Trade && aa.IsValid) select aa) on source.id equals tcrConfirm.TradeId into tcrConfirms
from tcrConfirm in tcrConfirms.DefaultIfEmpty()
join tradeContractDoc in (from tradeContractDocTemp in db.trade_contract_document where ContractTypeEnum.Trade == tradeContractDocTemp.Type select tradeContractDocTemp)
on tcrConfirm.ContractCode equals tradeContractDoc.Code into tradeContractDoc1
from tradeContractDoc2 in tradeContractDoc1.DefaultIfEmpty()
select new
{
source,
tradeContractDoc2
};
if (req.SealResults != null)
{
if (req.SealResults.Contains(2))
{
docQuery = docQuery.Where(t => req.SealResults.Contains((int)t.tradeContractDoc2.SealResult) || t.tradeContractDoc2.SealResult == null);
}
else
{
docQuery = docQuery.Where(t => req.SealResults.Contains((int)t.tradeContractDoc2.SealResult));
}
}
if (req.SealDateStart != null)
{
docQuery = docQuery.Where(t => t.tradeContractDoc2.SealResult == (int)SealResultEnum.成功 && t.tradeContractDoc2.OptDate != null && t.tradeContractDoc2.OptDate >= req.SealDateStart);
}
if (req.SealDateEnd != null)
{
var dateTemp = req.SealDateEnd.Value.AddDays(1);
docQuery = docQuery.Where(t => t.tradeContractDoc2.SealResult == (int)SealResultEnum.成功 && t.tradeContractDoc2.OptDate != null && t.tradeContractDoc2.OptDate < dateTemp);
}
query = docQuery.Select(d => d.source);
}
query = query.Where(td => !ConsTrade.TradeTypesForHedge.Contains(td.TradeType));
if (!string.IsNullOrEmpty(req.TradeTypes))
{
if (PS.Config.Is渤海)
{
req.TradeTypesList.Add("远期");
}
query = query.Where(d => req.TradeTypesList.Contains(d.TradeType) || req.TradeTypesList.Contains(d.StructureType) || (req.TradeTypesList.Contains("黑箱结构") && d.IsGroup != 0));
if (req.TradeTypesList.Contains("远期") && !req.TradeTypesList.Contains("掉期"))
{
query = query.Where(d => d.StructureType != "掉期");
}
}
if (req.NotInTradeTypes != null && req.NotInTradeTypes.Any())
{
query = query.Where(d => !req.NotInTradeTypes.Contains(d.TradeType));
}
if (req.TabIndex == (int)TradeTabIndexEnum.今日成交 || req.TabIndex == (int)TradeTabIndexEnum.今日到期 || req.TabIndex == (int)TradeTabIndexEnum.明日到期)
{
query = query.Where(d => d.TradeType != "股票" && d.TradeType != "商品期货" && d.TradeType != "场内期权");
}
if (!string.IsNullOrEmpty(req.UnderlyingInstrumentTypes))
{
query = query.Where(d => req.UnderlyingInstrumentTypesList.Contains(d.UnderlyingAssetClass));
}
if (!string.IsNullOrEmpty(req.UnderlyingAssetClass))
{
query = query.Where(d => req.UnderlyingAssetClass == d.UnderlyingAssetClass);
}
if (!string.IsNullOrEmpty(req.OptIds))
{
query = query.Where(d => req.OptIdsList.Contains(d.OptId + ""));
}
if (!string.IsNullOrEmpty(req.Comments))
{
query = query.Where(d => d.Comments.Contains(req.Comments));
}
if (!string.IsNullOrEmpty(req.UnderlyingIds))
{
query = query.Where(d => req.UnderlyingIdsInt.Contains(d.UnderlyingId));
}
if (req.AssetIdList.Any())
{
query = query.Where(d => req.AssetIdList.Contains(d.AssetId));
}
if (req.ClientIdsInt.Any())
{
query = query.Where(d => req.ClientIdsInt.Contains(d.ClientId));
}
if (req.TraderId != null)
{
query = query.Where(d => d.TraderId == req.TraderId);
}
if (!string.IsNullOrEmpty(req.TraderNames))
{
query = query.Where(d => req.TraderNamesList.Contains(d.TraderId));
}
if (isShowOnlyChild && isShowGroupTrade)
{
query = query.Where(q => (!"结构化交易".Equals(q.TradeType) || q.IsGroup == 1) && q.IsGroup != 2);
}
else if (isShowOnlyChild)
{
//若是从当日到期平仓界面进入,则只显示结构化交易中的子交易
query = query.Where(q => !"结构化交易".Equals(q.TradeType));
}
if (!string.IsNullOrEmpty(req.TradeNumber))
{
query = query.Where(d => d.TradeNumber.Contains(req.TradeNumber));
}
if (!string.IsNullOrEmpty(req.TradeNumber))
{
var childquery = from source in db.trade
where source.TradeNumber.Contains(req.TradeNumber) && source.ParentTradeId != 0
select source;
query = query.Where(d =>
d.TradeNumber.Contains(req.TradeNumber) || childquery.Select(x => x.ParentTradeId).Contains(d.id));
}
if (req.ClientId != null)
{
query = query.Where(d => d.ClientId == req.ClientId);
}
if (!string.IsNullOrEmpty(req.ClientName))
{
query = query.Where(d => d.ClientName.Contains(req.ClientName));
}
if (!string.IsNullOrEmpty(req.UnderlyingCode))
{
query = query.Where(d => d.UnderlyingCode.Contains(req.UnderlyingCode));
}
if (req.UnderlyingId != null)
{
query = query.Where(d => d.UnderlyingId == req.UnderlyingId);
}
if (!string.IsNullOrEmpty(req.TradeType))
{
query = query.Where(d => d.TradeType.Contains(req.TradeType));
}
if (!string.IsNullOrEmpty(req.BuySell))
{
query = query.Where(d => d.BuySell.Contains(req.BuySell));
}
if (!string.IsNullOrEmpty(req.OptionType))
{
query = query.Where(d => d.OptionType == req.OptionType);
}
if (req.StartDateStart != DateTime.MinValue)
{
query = query.Where(d => d.StartDate >= req.StartDateStart);
}
if (req.StartDateEnd != DateTime.MinValue)
{
var StartDateTemp = req.StartDateEnd.AddDays(1);
query = query.Where(d => d.StartDate < StartDateTemp);
}
if (req.ExerciseDateStart == null)
{
req.ExerciseDateStart = DateTime.MinValue;
}
if (req.ExerciseDateEnd == null)
{
req.ExerciseDateEnd = DateTime.MaxValue;
}
//获取当日到期日数据
if (req.TabIndex == (int)TradeTabIndexEnum.今日到期)
{
//如果前一天是假日,要显示包含假日的交易
var preday = valuedateBLL.ValueDate.AddDays(-1);
var nonHolidayAddOne = QdpCalendarHelper.GetNonHolidayDefore(preday).AddDays(1);
query = query.Where(d => d.ExerciseDate >= nonHolidayAddOne && d.ExerciseDate <= valuedateBLL.ValueDate);
var tcQuery = from tradeCash in db.trade_cash
where tradeCash.ExerciseWay != TradeCashExerciseWayEnum.提前终止行权 && tradeCash.Action == ClientCashInCashOut.系统操作_行权费
&& tradeCash.ValidState != ConsGlobal.InValid && !tradeCash.IsDeleted
select tradeCash;
query = from trade in query
join tradeCash in tcQuery on trade.id equals tradeCash.TradeId into tradeCashes
from tradeCash in tradeCashes.DefaultIfEmpty()
where ConsTrade.NeedMarginTradeStatusList.Contains(trade.TradeStatus) || tradeCash != null
select trade;
}
//获取明日到期日数据
else if (req.TabIndex == (int)TradeTabIndexEnum.明日到期)
{
var tommorow = QdpCalendarHelper.GetNonHoliday(valuedateBLL.ValueDate.AddDays(1));
query = query.Where(d => d.ExerciseDate == tommorow);
}
else
{
if (req.ExerciseDateStart != null || req.ExerciseDateEnd != null)
{
if (req.ExerciseDateEnd == null)
{
req.ExerciseDateEnd = DateTime.MaxValue;
}
if (req.ExerciseDateStart == null)
{
req.ExerciseDateStart = DateTime.MinValue;
}
//股票的到期日为null
query = query.Where(d => string.IsNullOrEmpty(d.ExerciseMode) || d.ExerciseDate == null ||
(d.ExerciseMode == "European" && d.ExerciseDate >= req.ExerciseDateStart &&
d.ExerciseDate <= req.ExerciseDateEnd)
|| (d.ExerciseMode == "American" &&
((d.ExerciseDate >= req.ExerciseDateStart &&
d.ExerciseDate <= req.ExerciseDateEnd)
|| (d.StartDate >= req.ExerciseDateStart &&
d.StartDate <= req.ExerciseDateEnd)
|| (d.StartDate <= req.ExerciseDateStart &&
d.ExerciseDate >= req.ExerciseDateEnd)
))
);
}
}
if (!string.IsNullOrEmpty(req.ExerciseMode))
{
query = query.Where(d => d.ExerciseMode == req.ExerciseMode);
}
if (isShowOnlyParent)
{
//当日成交界面结构化交易的子交易不显示
query = query.Where(d => d.ParentTradeId == 0);
}
//明日到期过滤已平仓,已到期,已执行数据
if (req.TabIndex == (int)TradeTabIndexEnum.明日到期)
{
query = query.Where(d =>
d.TradeStatus != ConsTrade.已平仓 && d.TradeStatus != ConsTrade.已到期 && d.TradeStatus != ConsTrade.已执行);
}
if (!string.IsNullOrEmpty(req.TradeStatus))
{
var statuses = req.TradeStatus.Split(',').ToList();
query = query.Where(d => statuses.Contains(d.TradeStatus));
}
if (req.TradeStatusList != null)
{
query = query.Where(d => req.TradeStatusList.Contains(d.TradeStatus));
}
if (req.OptId != null)
{
query = query.Where(d => d.OptId == req.OptId);
}
if (!string.IsNullOrEmpty(req.OptName))
{
query = query.Where(d => d.OptName.Contains(req.OptName));
}
//获取当日成交的数据
//当日成交包括操作日期和交易日为当前系统日期的数据
if (req.TabIndex == (int)TradeTabIndexEnum.今日成交)
{
var optDateStart = valuedateBLL.ValueDate;
var optDateEnd = valuedateBLL.ValueDate.AddDays(1);
var tradeDateStart = valuedateBLL.ValueDate;
var tradeDateEnd = valuedateBLL.ValueDate.AddDays(1);
query = query.Where(d => d.TradeDate >= tradeDateStart && d.TradeDate < tradeDateEnd);
}
else
{
if (req.TradeDateStart != DateTime.MinValue)
{
query = query.Where(d => d.TradeDate >= req.TradeDateStart);
}
if (req.TradeDateEnd != DateTime.MinValue)
{
var TradeDateTemp = req.TradeDateEnd.AddDays(1);
query = query.Where(d => d.TradeDate < TradeDateTemp);
}
if (req.OptDateStart != DateTime.MinValue)
{
query = query.Where(d => d.OptDate >= req.OptDateStart);
}
if (req.OptDateEnd != DateTime.MinValue)
{
var OptDateTemp = req.OptDateEnd.AddDays(1);
query = query.Where(d => d.OptDate < OptDateTemp);
}
//新增到期日期筛选
if (req.ExerciseDateStart != DateTime.MinValue)
{
query = query.Where(d => d.ExerciseDate >= req.ExerciseDateStart);
}
if (req.ExerciseDateEnd != DateTime.MaxValue)
{
var ExerciseDateTemp = ((DateTime)req.ExerciseDateEnd).AddDays(1);
query = query.Where(d => d.ExerciseDate < ExerciseDateTemp);
}
}
query = query.Where(d => !d.ValidState.Equals("InValid"));
if (!string.IsNullOrEmpty(req.TradeIds))
{
query = query.Where(d => req.TradeIdList.Contains(d.id));
}
if (string.IsNullOrEmpty(req.sidx))
{
req.sidx = "TradeNumber";
req.sord = "desc";
}
return query;
}
/// <summary>
/// 查询trade 到期结算报告
/// </summary>
public SearchListResult<trade_contract_group> SearchTradeWithCashList(TradeReq req, out tradeGridSum gsum, bool isShowAll)
{
var actionList = new List<string>() { ClientCashInCashOut.系统操作_行权费 };
var tcPredicate = PredicateBuilder.Create<trade_cash>(tc => tc.ValidState != ConsGlobal.InValid && !tc.IsDeleted);
//使用Action等于票息并且IsLastAction检索数据,逻辑是存在问题的,敲出平仓+票息是没问题的, 到期+票息应该会取出多条,需要梳理逻辑后调整
if (req.TradeStatusList != null && !req.TradeStatusList.Contains(ConsTrade.已平仓))
{
actionList.Add(ClientCashInCashOut.系统操作_平仓费); //存在ExerciseWay为到期的平仓费数据,该行为也属于到期行为,是收盘观察时产生的到期平仓数据
var exeriseWayList = new List<string> { TradeCashExerciseWayEnum.到期行权 };
if (PS.Config.Company == Configuration.CompanyEnum.广发商贸)
{
tcPredicate = tcPredicate.And(tc => actionList.Contains(tc.Action) && (tc.ExerciseWay == TradeCashExerciseWayEnum.到期行权 || (tc.ExerciseWay == TradeCashExerciseWayEnum.提前终止行权 && tc.IsLastAction))
|| tc.Action == ClientCashInCashOut.系统操作_票息 && tc.IsLastAction);
}
else
{
tcPredicate = tcPredicate.And(tc => actionList.Contains(tc.Action) && tc.ExerciseWay == TradeCashExerciseWayEnum.到期行权
|| tc.Action == ClientCashInCashOut.系统操作_票息 && tc.IsLastAction);
}
}
else
{
//判断状态列表中如果包含已平仓状态则增加平仓费获取
//req.TradeStatusList.Contains(ConsTrade.已平仓)
if (req.TradeStatusList != null)
{
actionList.Add(ClientCashInCashOut.系统操作_平仓费);
}
tcPredicate = tcPredicate.And(tc => actionList.Contains(tc.Action) || tc.Action == ClientCashInCashOut.系统操作_票息 && tc.IsLastAction);
}
if (req.UnWindDateStart != null || req.UnWindDateEnd != null)
{
if (req.UnWindDateEnd == null)
{
req.UnWindDateEnd = DateTime.MaxValue;
}
if (req.UnWindDateStart == null)
{
req.UnWindDateStart = DateTime.MinValue;
}
tcPredicate = tcPredicate.And(d => d.ValueDate >= req.UnWindDateStart && d.ValueDate <= req.UnWindDateEnd);
}
var tradeQuery = db.trade.Where(x => x.IsGroup != 2).AsQueryable();
if (req.UserAssets != null && req.UserClients != null)
{
tradeQuery = tradeQuery.Where(x => req.UserAssets.Contains(x.AssetId) || req.UserClients.Contains(x.ClientId));
}
var query = from trade in tradeQuery
join tradeCash in db.trade_cash.Where(tcPredicate) on trade.id equals tradeCash.TradeId
//from tradeCash in tradeCashes.DefaultIfEmpty()
join underlyingInfo in db.underlying_manager on trade.UnderlyingId equals underlyingInfo.id
join tcrConfirm in db.trade_contract_r.Where(aa => aa.Type == ContractTypeEnum.Trade && aa.IsValid)
on trade.id equals tcrConfirm.TradeId into tcrConfirms
from tcrConfirm in tcrConfirms.DefaultIfEmpty()
join tcr in db.trade_contract_r.Where(aa => (aa.Type == ContractTypeEnum.Clearing || aa.Type == ContractTypeEnum.UnWind) && aa.IsValid)
on new { tradeId = trade.id, tradeCashId = tradeCash.id } equals new { tradeId = tcr.TradeId, tradeCashId = tcr.TradeCashId.Value } into tcr1
from tempTcr in tcr1.DefaultIfEmpty()
where trade.ValidState != "InValid"
select new trade_contract_group
{
id = tradeCash.id,
trade = trade,
trade_cash = tradeCash,
underlying_manager = underlyingInfo,
ConfirmContractR = tcrConfirm,
trade_contract_r = tempTcr,
ContractCode = tempTcr.ContractCode
};
if (req.SealResults != null || req.SealDateStart != null || req.SealDateEnd != null)
{
var docQuery = from t in query
join doc in db.trade_contract_document
on t.ContractCode equals doc.Code into tempDoc
from doc in tempDoc.DefaultIfEmpty()
select new
{
t,
doc
};
if (req.SealResults != null)
{
if (req.SealResults.Contains(2))
{
docQuery = docQuery.Where(t => req.SealResults.Contains((int)t.doc.SealResult) || t.doc.SealResult == null);
}
else
{
docQuery = docQuery.Where(t => req.SealResults.Contains((int)t.doc.SealResult));
}
}
if (req.SealDateStart != null)
{
docQuery = docQuery.Where(t => t.doc.SealResult == (int)SealResultEnum.成功 && t.doc.OptDate != null && t.doc.OptDate >= req.SealDateStart);
}
if (req.SealDateEnd != null)
{
var dateTemp = req.SealDateEnd.Value.AddDays(1);
docQuery = docQuery.Where(t => t.doc.SealResult == (int)SealResultEnum.成功 && t.doc.OptDate != null && t.doc.OptDate < dateTemp);
}
query = docQuery.Select(d => d.t);
}
if (!string.IsNullOrEmpty(req.ClientIds))
{
query = query.Where(d => req.ClientIdsInt.Contains(d.trade.ClientId));
}
if (!string.IsNullOrEmpty(req.ExerciseMode))
{
query = query.Where(d => d.trade.ExerciseMode.Contains(req.ExerciseMode));
}
if (!string.IsNullOrEmpty(req.TradeTypes))
{
query = query.Where(d => req.TradeTypesList.Contains(d.trade.TradeType) || req.TradeTypesList.Contains(d.trade.StructureType));
if (req.TradeTypesList.Contains("远期") && !req.TradeTypesList.Contains("掉期"))
{
query = query.Where(d => d.trade.StructureType != "掉期");
}
}
if (!string.IsNullOrEmpty(req.UnderlyingIds))
{
query = query.Where(d => req.UnderlyingIdsInt.Contains(d.trade.UnderlyingId));
}
if (!string.IsNullOrEmpty(req.TradeIds))
{
query = query.Where(d => req.TradeIdList.Contains(d.trade.id));
}
if (req.AssetIdList.Any())
{
query = query.Where(d => req.AssetIdList.Contains(d.trade.AssetId));
}
if (!string.IsNullOrEmpty(req.TraderNames))
{
query = query.Where(d => req.TraderNamesList.Contains(d.trade.TraderId));
}
if (!string.IsNullOrEmpty(req.TradeNumber))
{
query = query.Where(d => d.trade.TradeNumber == req.TradeNumber);
}
if (!string.IsNullOrEmpty(req.ContractCode))
{
query = query.Where(d => d.ConfirmContractR.ContractCode == req.ContractCode);
}
if (req.ExerciseDateStart != null || req.ExerciseDateEnd != null)
{
if (req.ExerciseDateEnd == null)
{
req.ExerciseDateEnd = DateTime.MaxValue;
}
if (req.ExerciseDateStart == null)
{
req.ExerciseDateStart = DateTime.MinValue;
}
query = query.Where(d => d.trade.ExerciseDate >= req.ExerciseDateStart && d.trade.ExerciseDate <= req.ExerciseDateEnd);
}
if (req.TradeStatusList != null)
{
if (PS.Config.Company == Configuration.CompanyEnum.广发商贸)
{
query = query.Where(d => req.TradeStatusList.Contains(d.trade.TradeStatus) || (d.trade.TradeType == "远期" && d.trade.UnWindDate == d.trade.ExerciseDate && d.trade.TradeStatus == ConsTrade.已平仓));
}
else
{
query = query.Where(d => req.TradeStatusList.Contains(d.trade.TradeStatus));
}
}
query = query.OrderByDescending(s => s.trade_cash.ValueDate).ThenByDescending(s => s.trade_cash.id);
var retListResult = query.ToSearchList(req, isWithOrder: false);
gsum = new tradeGridSum();
if (query.Any())
{
gsum.TradePriceSum = query.Sum(q => q.trade.TradePrice);
gsum.AllTradeCashIds = string.Join(",", query.Select(t => t.trade_cash.id).ToList());
}
retListResult.Sum = gsum;
return retListResult;
}
/// <summary>
/// 查询 提前终止报告列表
/// </summary>
public SearchListResult<trade_contract_group> SearchTerminationTradeWithCashList(TradeReq req, out tradeGridSum gsum)
{
var actionList = new List<string>() { ClientCashInCashOut.系统操作_行权费, ClientCashInCashOut.系统操作_平仓费 };
if (PS.Config.TradeElement.IsSingleExecutionTemplate)
{
actionList = new List<string>() { ClientCashInCashOut.系统操作_平仓费 };
}
if (req.TradeStatusList != null && req.TradeStatusList.Any(n => !string.IsNullOrEmpty(n)))
{
if (!req.TradeStatusList.Contains(ConsTrade.已执行))
{
actionList.Remove(ClientCashInCashOut.系统操作_行权费);
}
if (!req.TradeStatusList.Contains(ConsTrade.已平仓))
{
actionList.Remove(ClientCashInCashOut.系统操作_平仓费);
}
}
var tcPredicate = PredicateBuilder.Create<trade_cash>(tc => tc.ValidState != ConsGlobal.InValid && !tc.IsDeleted
&& (actionList.Contains(tc.Action) && tc.ExerciseWay == TradeCashExerciseWayEnum.提前终止行权 || tc.Action == ClientCashInCashOut.系统操作_票息 && tc.IsLastAction));
if (req.UnWindDateStart != null || req.UnWindDateEnd != null)
{
if (req.UnWindDateEnd == null)
{
req.UnWindDateEnd = DateTime.MaxValue;
}
if (req.UnWindDateStart == null)
{
req.UnWindDateStart = DateTime.MinValue;
}
tcPredicate = tcPredicate.And(d => d.ValueDate >= req.UnWindDateStart && d.ValueDate <= req.UnWindDateEnd);
}
var tradeQuery = db.trade.Where(x => x.ValidState != "InValid" && x.IsGroup != 2).AsQueryable();
if (req.UserAssets != null && req.UserClients != null)
{
tradeQuery = tradeQuery.Where(x => req.UserAssets.Contains(x.AssetId) || req.UserClients.Contains(x.ClientId));
}
if (PS.Config.Is渤海)
{
tradeQuery = tradeQuery.Where(x => x.TradeType != "远期");
}
var query = from trade in tradeQuery
join tradeCash in db.trade_cash.Where(tcPredicate) on trade.id equals tradeCash.TradeId
join underlyingInfo in db.underlying_manager on trade.UnderlyingId equals underlyingInfo.id
join tcrConfirm in db.trade_contract_r.Where(aa => aa.Type == ContractTypeEnum.Trade && aa.IsValid)
on trade.id equals tcrConfirm.TradeId into tcrConfirms
from tcrConfirm in tcrConfirms.DefaultIfEmpty()
join tcr in db.trade_contract_r.Where(aa => aa.Type == ContractTypeEnum.UnWind && aa.IsValid) on new { tradeId = trade.id, tradeCashId = tradeCash.id }
equals new { tradeId = tcr.TradeId, tradeCashId = tcr.TradeCashId.Value } into tcr1
from tempTcr in tcr1.DefaultIfEmpty()
select new trade_contract_group
{
id = tradeCash.id,
trade = trade,
trade_cash = tradeCash,
underlying_manager = underlyingInfo,
ConfirmContractR = tcrConfirm,
trade_contract_r = tempTcr,
ContractCode = tempTcr.ContractCode
};
if (req.SealResults != null || req.SealDateStart != null || req.SealDateEnd != null)
{
var docQuery = from t in query
join doc in db.trade_contract_document
on t.ContractCode equals doc.Code into tempDoc
from doc in tempDoc.DefaultIfEmpty()
select new
{
t,
doc
};
if (req.SealResults != null)
{
if (req.SealResults.Contains(2))
{
docQuery = docQuery.Where(t => req.SealResults.Contains((int)t.doc.SealResult) || t.doc.SealResult == null);
}
else
{
docQuery = docQuery.Where(t => req.SealResults.Contains((int)t.doc.SealResult));
}
}
if (req.SealDateStart != null)
{
docQuery = docQuery.Where(t => t.doc.SealResult == (int)SealResultEnum.成功 && t.doc.OptDate != null && t.doc.OptDate >= req.SealDateStart);
}
if (req.SealDateEnd != null)
{
var dateTemp = req.SealDateEnd.Value.AddDays(1);
docQuery = docQuery.Where(t => t.doc.SealResult == (int)SealResultEnum.成功 && t.doc.OptDate != null && t.doc.OptDate < dateTemp);
}
query = docQuery.Select(d => d.t);
}
if (!string.IsNullOrEmpty(req.TradeNumber))
{
query = query.Where(d => d.trade.TradeNumber.Contains(req.TradeNumber));
}
if (!string.IsNullOrEmpty(req.BuySell))
{
query = query.Where(d => d.trade.BuySell.Contains(req.BuySell));
}
if (!string.IsNullOrEmpty(req.UnderlyingAssetClass))
{
query = query.Where(d => req.UnderlyingAssetClass == d.trade.UnderlyingAssetClass);
}
if (req.StartDateStart != DateTime.MinValue)
{
query = query.Where(d => d.trade.StartDate >= req.StartDateStart);
}
if (req.StartDateEnd != DateTime.MinValue)
{
var StartDateTemp = req.StartDateEnd.AddDays(1);
query = query.Where(d => d.trade.StartDate < StartDateTemp);
}
if (!string.IsNullOrEmpty(req.ClientIds))
{
query = query.Where(d => req.ClientIdsInt.Contains(d.trade.ClientId));
}
if (!string.IsNullOrEmpty(req.ExerciseMode))
{
query = query.Where(d => d.trade.ExerciseMode.Contains(req.ExerciseMode));
}
if (!string.IsNullOrEmpty(req.TradeTypes))
{
query = query.Where(d => req.TradeTypesList.Contains(d.trade.TradeType) || req.TradeTypesList.Contains(d.trade.StructureType));
if (req.TradeTypesList.Contains("远期") && !req.TradeTypesList.Contains("掉期"))
{
query = query.Where(d => d.trade.StructureType != "掉期");
}
}
if (!string.IsNullOrEmpty(req.UnderlyingIds))
{
query = query.Where(d => req.UnderlyingIdsInt.Contains(d.trade.UnderlyingId));
}
if (!string.IsNullOrEmpty(req.TradeIds))
{
query = query.Where(d => req.TradeIdList.Contains(d.trade.id));
}
if (req.AssetIdList.Any())
{
query = query.Where(d => req.AssetIdList.Contains(d.trade.AssetId));
}
if (!string.IsNullOrEmpty(req.TraderNames))
{
query = query.Where(d => req.TraderNamesList.Contains(d.trade.TraderId));
}
if (req.ExerciseDateStart != null || req.ExerciseDateEnd != null)
{
if (req.ExerciseDateEnd == null)
{
req.ExerciseDateEnd = DateTime.MaxValue;
}
if (req.ExerciseDateStart == null)
{
req.ExerciseDateStart = DateTime.MinValue;
}
query = query.Where(d => d.trade.ExerciseDate >= req.ExerciseDateStart && d.trade.ExerciseDate <= req.ExerciseDateEnd);
}
query = query.OrderByDescending(s => s.trade.OptDate);
var retListResult = query.ToSearchList(req, isWithOrder: false);
foreach (var x in retListResult.rows)
{
if (x.trade_contract_r != null)
{
GetTradeDocumentResults(req, x);
}
}
gsum = new tradeGridSum();
if (query.Any())
{
gsum.TradePriceSum = query.Sum(q => q.trade.TradePrice);
}
retListResult.Sum = gsum;
return retListResult;
}
/// <summary>
/// 查询 到期结算报告和提前终止报告
/// </summary>
public SearchListResult<trade_contract_group> SearchEitherTradeWithCashList(TradeReq req, out tradeGridSum gsum)
{
var actionList = new List<string>() { ClientCashInCashOut.系统操作_行权费, ClientCashInCashOut.系统操作_平仓费, ClientCashInCashOut.系统操作_互换, ClientCashInCashOut.系统操作_票息 };
var types = new List<string>() { ContractTypeEnum.Clearing, ContractTypeEnum.UnWind };
var tradeQuery = db.trade.Where(x => x.ValidState != "InValid" && x.IsGroup != 2).AsQueryable();
if (req.UserAssets != null && req.UserClients != null)
{
tradeQuery = tradeQuery.Where(x => req.UserAssets.Contains(x.AssetId) || req.UserClients.Contains(x.ClientId));
}
var query = from trade in tradeQuery
join tradeCash in db.trade_cash.Where(O => actionList.Contains(O.Action) && O.ValidState != ConsGlobal.InValid && !O.IsDeleted) on trade.id equals tradeCash.TradeId
join underlyingInfo in db.underlying_manager on trade.UnderlyingId equals underlyingInfo.id
join tcrConfirm in db.trade_contract_r.Where(O => O.Type == ContractTypeEnum.Trade && O.IsValid) on trade.id equals tcrConfirm.TradeId into tcrConfirms
from tcrConfirm in tcrConfirms.DefaultIfEmpty()
join tcr in db.trade_contract_r.Where(O => types.Contains(O.Type) && O.IsValid) on new { tradeId = trade.id, tradeCashId = tradeCash.id } equals new { tradeId = tcr.TradeId, tradeCashId = tcr.TradeCashId.Value } into tcr1
from tempTcr in tcr1.DefaultIfEmpty()
where trade.ValidState != "InValid"
select new trade_contract_group
{
id = tradeCash.id,
trade = trade,
trade_cash = tradeCash,
underlying_manager = underlyingInfo,
ConfirmContractR = tcrConfirm,
trade_contract_r = tempTcr,
ContractCode = tempTcr.ContractCode
};
if (req.SealResults != null || req.SealDateStart != null || req.SealDateEnd != null)
{
var docQuery = from t in query
join doc in db.trade_contract_document
on t.ContractCode equals doc.Code into tempDoc
from doc in tempDoc.DefaultIfEmpty()
select new
{
t,
doc
};
if (req.SealResults != null)
{
if (req.SealResults.Contains(2))
{
docQuery = docQuery.Where(t => req.SealResults.Contains((int)t.doc.SealResult) || t.doc.SealResult == null);
}
else
{
docQuery = docQuery.Where(t => req.SealResults.Contains((int)t.doc.SealResult));
}
}
if (req.SealDateStart != null)
{
docQuery = docQuery.Where(t => t.doc.SealResult == (int)SealResultEnum.成功 && t.doc.OptDate != null && t.doc.OptDate >= req.SealDateStart);
}
if (req.SealDateEnd != null)
{
var dateTemp = req.StartDateEnd.AddDays(1);
docQuery = docQuery.Where(t => t.doc.SealResult == (int)SealResultEnum.成功 && t.doc.OptDate != null && t.doc.OptDate < dateTemp);
}
query = docQuery.Select(d => d.t);
}
if (!string.IsNullOrEmpty(req.TradeNumber))
{
query = query.Where(d => d.trade.TradeNumber.Contains(req.TradeNumber));
}
if (!string.IsNullOrEmpty(req.BuySell))
{
query = query.Where(d => d.trade.BuySell.Contains(req.BuySell));
}
query = query.Where(d => !d.trade.ValidState.Equals("InValid"));
if (!string.IsNullOrEmpty(req.UnderlyingAssetClass))
{
query = query.Where(d => req.UnderlyingAssetClass == d.trade.UnderlyingAssetClass);
}
if (req.StartDateStart != DateTime.MinValue)
{
query = query.Where(d => d.trade.StartDate >= req.StartDateStart);
}
if (req.StartDateEnd != DateTime.MinValue)
{
var StartDateTemp = req.StartDateEnd.AddDays(1);
query = query.Where(d => d.trade.StartDate < StartDateTemp);
}
if (!string.IsNullOrEmpty(req.ClientIds))
{
query = query.Where(d => req.ClientIdsInt.Contains(d.trade.ClientId));
}
if (!string.IsNullOrEmpty(req.ExerciseMode))
{
query = query.Where(d => d.trade.ExerciseMode.Contains(req.ExerciseMode));
}
if (!string.IsNullOrEmpty(req.TradeTypes))
{
query = query.Where(d => req.TradeTypesList.Contains(d.trade.TradeType) || req.TradeTypesList.Contains(d.trade.StructureType) || (req.TradeTypesList.Contains("黑箱结构") && d.trade.IsGroup != 0));
if (req.TradeTypesList.Contains("远期") && !req.TradeTypesList.Contains("掉期"))
{
query = query.Where(d => d.trade.StructureType != "掉期");
}
}
if (!string.IsNullOrEmpty(req.UnderlyingIds))
{
query = query.Where(d => req.UnderlyingIdsInt.Contains(d.trade.UnderlyingId));
}
if (!string.IsNullOrEmpty(req.TradeIds))
{
query = query.Where(d => req.TradeIdList.Contains(d.trade.id));
}
if (req.AssetIdList.Any())
{
query = query.Where(d => req.AssetIdList.Contains(d.trade.AssetId));
}
if (!string.IsNullOrEmpty(req.TraderNames))
{
query = query.Where(d => req.TraderNamesList.Contains(d.trade.TraderId));
}
if (req.ExerciseDateStart != null || req.ExerciseDateEnd != null)
{
if (req.ExerciseDateEnd == null)
{
req.ExerciseDateEnd = DateTime.MaxValue;
}
if (req.ExerciseDateStart == null)
{
req.ExerciseDateStart = DateTime.MinValue;
}
query = query.Where(d => d.trade.ExerciseDate >= req.ExerciseDateStart && d.trade.ExerciseDate <= req.ExerciseDateEnd);
}
if (req.UnWindDateEnd == null)
{
req.UnWindDateEnd = DateTime.MaxValue;
}
if (req.UnWindDateStart == null)
{
req.UnWindDateStart = DateTime.MinValue;
}
query = query.Where(d => d.trade_cash.ValueDate >= req.UnWindDateStart && d.trade_cash.ValueDate <= req.UnWindDateEnd);
if (req.TradeStatusList != null)
{
query = query.Where(d => req.TradeStatusList.Contains(ConsTrade.已执行) && d.trade_cash.Action == ClientCashInCashOut.系统操作_行权费 || req.TradeStatusList.Contains(ConsTrade.已平仓) && d.trade_cash.Action == ClientCashInCashOut.系统操作_平仓费);
}
query = query.OrderByDescending(s => s.trade.OptDate);
var retListResult = query.ToSearchList(req, isWithOrder: false);
foreach (var x in retListResult.rows)
{
if (x.trade_contract_r != null)
{
GetTradeDocumentResults(req, x);
}
if (PS.Config.Is物产中大)
{
if (x.ConfirmContractR != null)
{
x.ConfirmContractR.ContractCode = db.trade_contract_r_number.Where(n => n.TradeId == x.trade.id && n.TradeConfirmNumberType == "C").FirstOrDefault()?.ShowTradeConfirmNumber;
}
x.ContractCode = db.trade_contract_r_number.Where(n => n.TradeCashId == x.trade_cash.id && (n.TradeConfirmNumberType == "U" || n.TradeConfirmNumberType == "S")).FirstOrDefault()?.ShowTradeConfirmNumber;
}
if (x.trade_cash.HappenedDate == null)
{
x.trade_cash.HappenedDate = x.trade_cash.ValueDate;
}
}
gsum = new tradeGridSum();
if (query.Any())
{
gsum.TradePriceSum = query.Sum(q => q.trade.TradePrice);
}
retListResult.Sum = gsum;
return retListResult;
}
/// <summary>
/// 风险自查报告
/// </summary>
public RiskCheckReportSumModel SearchRiskCheckReportSumInfo(SuperviseReportReq req)
{
var sumModel = new RiskCheckReportSumModel();
var noAssetId = req.AssetIds == null || !req.AssetIds.Any();
if (noAssetId)
{
req.AssetIds = Array.Empty<int>();
}
var strAssetIds = req.AssetIds.ToArray();
//-------------------------------------
//求取场外交易风险值
var riskQuery = from eodrisk in db.eod_trade_risk
join trad in db.trade on new { id = eodrisk.TradeId } equals new { trad.id }
where eodrisk.ValueDate == req.ValueDate && (noAssetId || strAssetIds.Contains(eodrisk.BookId))
select new
{
key = 0,
eodrisk.Delta,
eodrisk.Gamma,
eodrisk.Vega,
eodrisk.Theta,
BuyDeltaCash = trad.BuySell == "买入" ? eodrisk.DeltaCash : 0,
SellDeltaCash = trad.BuySell == "卖出" ? eodrisk.DeltaCash : 0
};
var riskSumQuery = from n in riskQuery
group n by n.key into g
select new
{
Delta = g.Sum(n => n.Delta),
Gamma = g.Sum(n => n.Gamma),
Vega = g.Sum(n => n.Vega),
Theta = g.Sum(n => n.Theta),
BuyDeltaCash = g.Sum(n => n.BuyDeltaCash),
SellDeltaCash = g.Sum(n => n.SellDeltaCash)
};
var riskSum = riskSumQuery.FirstOrDefault();
if (riskSum != null)
{
sumModel.Delta = riskSum.Delta;
sumModel.Gamma = riskSum.Gamma;
sumModel.Vega = riskSum.Vega;
sumModel.Theta = riskSum.Theta;
sumModel.BuyDeltaCash = riskSum.BuyDeltaCash;
sumModel.SellDeltaCash = riskSum.SellDeltaCash;
}
var predicate = PredicateBuilder.Create<eod_trade_position>(eodpos => eodpos.ValueDate == req.ValueDate
&& eodpos.TradeId == 0 && eodpos.TradeType != "场内期权");
if (!noAssetId)
{
predicate = predicate.And(eodpos => req.AssetIds.Contains(eodpos.BookId));
}
//求取非场内期权的对冲交易delta
var posSumQuery = from a in
db.eod_trade_position.Where(predicate)
.Select(eodpos => new
{
key = 0,
eodpos.BuySell,
Pv = (double)eodpos.Pv
})
group a by a.key into g
select new
{
BuyDeltaCash = g.Sum(n => n.BuySell == "买入" ? n.Pv : 0),
SellDeltaCash = g.Sum(n => n.BuySell == "卖出" ? n.Pv : 0)
};
var posSum = posSumQuery.FirstOrDefault();
if (posSum != null)
{
sumModel.BuyDeltaCash += posSum.BuyDeltaCash;
sumModel.SellDeltaCash += posSum.SellDeltaCash;
}
//-------------------------------------
//求取业务盈亏
var pnlQuery = from eodpnl in db.eod_trade_position
where eodpnl.ValueDate == req.ValueDate && (noAssetId || req.AssetIds.Contains(eodpnl.BookId))
select new
{
key = 0,
OptionWinLoss = eodpnl.TradeId > 0 ? eodpnl.DailyPnL : 0,
HedgeWinLoss = eodpnl.TradeId == 0 ? eodpnl.DailyPnL : 0,
};
var pnlSumQuery = from n in pnlQuery
group n by n.key into g
select new
{
OptionWinLoss = g.Sum(n => n.OptionWinLoss),
HedgeWinLoss = g.Sum(n => n.HedgeWinLoss)
};
var pnlSum = pnlSumQuery.FirstOrDefault();
if (pnlSum != null)
{
sumModel.OptionWinLoss = pnlSum.OptionWinLoss;
sumModel.HedgeWinLoss = pnlSum.HedgeWinLoss;
}
sumModel.TotalWinLoss = sumModel.OptionWinLoss + sumModel.HedgeWinLoss;
//-------------------------------------
//求取当日预付金情况
var clientIdQuery = from eodpos in db.eod_trade_position
where eodpos.ValueDate == req.ValueDate && eodpos.TradeType != "场内期权"
&& (noAssetId || req.AssetIds.Contains(eodpos.BookId)) && eodpos.ClientId > 0
group eodpos by eodpos.ClientId into g
select g.Key;
var clientQuery = from clientbalance in db.ClientBalanceDaily
join cid in clientIdQuery on clientbalance.ClientId equals cid
where clientbalance.BalanceDate == req.ValueDate
select new
{
key = 0,
AvailableFund = (clientbalance.MarginBalance ?? 0) + (clientbalance.CashDeposit ?? 0),
CashDeposit = clientbalance.CashDeposit ?? 0,
};
var clientSumQuery = from a in clientQuery
group a by a.key into g
select new RiskCheckReportSumModel
{
AvailableFund = g.Sum(n => n.AvailableFund),
CashDeposit = g.Sum(n => n.CashDeposit),
};
var clientSum = clientSumQuery.FirstOrDefault();
if (clientSum != null)
{
sumModel.AvailableFund = clientSum.AvailableFund;
sumModel.CashDeposit = clientSum.CashDeposit;
}
return sumModel;
}
public List<RiskCheckReportItem> SearchRiskCheckReportListInfo(SuperviseReportReq req)
{
var tradeQuery = from t in db.trade
where t.ValidState != "InValid" && t.TradeType.Contains("期权")
&& t.TradeType != "场内期权" && t.TradeDate <= req.ValueDate && t.ExerciseDate >= req.ValueDate
&& (t.TradeStatus == "确认成交" || t.UnWindDate >= req.ValueDate)
select t;
var query = from trade in tradeQuery
join clientbalancedaily in db.ClientBalanceDaily.Where(cbd => cbd.BalanceDate == req.ValueDate) on trade.ClientId equals clientbalancedaily.ClientId
join eodtraderisk in db.eod_trade_risk.Where(etr => etr.ValueDate == req.ValueDate) on new { id = trade.id } equals new { id = eodtraderisk.TradeId }
select new RiskCheckReportItem
{
ClientName = trade.ClientName,
AvailableFund = clientbalancedaily.MarginBalance + clientbalancedaily.CashDeposit,
CashDeposit = clientbalancedaily.CashDeposit,
OptionPremium = -clientbalancedaily.OptionPremium,
SettlementBalance = -clientbalancedaily.SettlementBalance,
TotalPv = -clientbalancedaily.Pv,
DailyPnl = -clientbalancedaily.DailyPnl,
PayableMargin = clientbalancedaily.PayableMargin,
ToDayRemainFund = clientbalancedaily.ToDayRemainFund,
TodayRemianFundProduct = clientbalancedaily.TodayRemianFundProduct,
Credit = clientbalancedaily.Credit,
TradeNumber = trade.TradeNumber,
Pv = eodtraderisk.Pv,
Delta = eodtraderisk.Delta,
Gamma = eodtraderisk.Gamma,
Vega = eodtraderisk.Vega,
Theta = eodtraderisk.Theta
};
var resiltList = query.OrderBy(x => x.ClientName).ToList();
// 追保金额(维持预付金欠缺的金额)
resiltList.ForEach(x => x.Margin = Math.Max(-(x.PayableMargin ?? 0) - Math.Max(x.ToDayRemainFund ?? 0, 0) - (x.TodayRemianFundProduct ?? 0) - x.Credit ?? 0, 0));
return resiltList;
}
public static SearchListResult<FinancialSummaryExchangeModel> SearchExchangeTrade(FinancialSummaryModelReq req)
{
var openPositionTag = new List<string>() { "多头开仓", "空头开仓" };
var closePositionTag = new List<string>() { "多头平仓", "空头平仓" };
var startDate = QdpCalendarHelper.GetNonHoliday(req.CurrentPeriodDateStart);
req.PreLastPartDate = startDate.AddMonths(-1).AddDays(-startDate.Day);
req.PreLastPartDate = QdpCalendarHelper.GetNonHolidayDefore(req.PreLastPartDate);
req.LastPartDate = startDate.AddDays(-startDate.Day);
req.LastPartDate = QdpCalendarHelper.GetNonHolidayDefore(req.LastPartDate);
if (req.sidx.IsNullOrWhiteSpace())
{ req.sidx = "TradeDate"; }
var result = new SearchListResult<FinancialSummaryExchangeModel>();
using (var dbContext = new YLContext())
{
var predicate = PredicateBuilder.Create<Exchange_Option_Trade>(n => n.TradeStatus== "确认成交" || n.TradeStatus == "已平仓");
//簿记账户
if (req.BookIds != null && req.BookIds.Any(x => x > 0))
{
predicate = predicate.And(a => req.BookIds.Contains(a.AssetId));
}
var mainQuery =
(from open in dbContext.Exchange_Option_Trade.Where(predicate)
join lastP in dbContext.eod_exchange_option_price.Where(p => p.ValueDate == req.PreLastPartDate)
on open.Code equals lastP.ContractCode into lastP
from lastPrice in lastP.DefaultIfEmpty()
join endP in dbContext.eod_exchange_option_price.Where(p => p.ValueDate == req.LastPartDate)
on open.Code equals endP.ContractCode into endP
from endPrice in endP.DefaultIfEmpty()
join settlementP in dbContext.eod_exchange_option_price.Where(p => p.ValueDate == req.CurrentPeriodDateEnd)
on open.Code equals settlementP.ContractCode into settlementP
from settlementPrice in settlementP.DefaultIfEmpty()
join asset in dbContext.assetunit on open.AssetId equals asset.id
where open.TradeStatus == "确认成交"
&& open.TradeDate <= req.CurrentPeriodDateEnd
&& open.ExerciseDate == DateTime.MinValue
select new FinancialSummaryExchangeModel()
{
TradeDate = open.TradeDate,
ExchangeOptionCode = open.Code,
UnderlyingCode = open.UnderlyingCode,
OptionType = open.OptionType,
Strike = open.Strike,
TradeDirection = open.TradeType == "空头" ? "卖" : "买",
Notional = open.TradeAmount / open.TradeUnitValue,
TradeUnit = open.TradeUnitValue,
TradePrice = open.TradePrice,
ServiceFee = open.ServiceFee,
PreLastDate = req.PreLastPartDate,
PrePotionLastPrice = lastPrice.SettlePrice,
PreDate = req.LastPartDate,
PrePotionEndPrice = endPrice.SettlePrice,
ClearDate = null,
UnwindTradeDirection = null,
UnwindNotional = null,
ClearPrice = null,
UnwindServiceFee = null,
PositionEndSettlementPrice = settlementPrice.SettlePrice,
PositionNotional = open.TradeAmount / open.TradeUnitValue,
SurvivingNominalPrincipal = open.TradeAmount / open.TradeUnitValue * open.Strike,
AssetBookName=asset.Name
})
.Concat
(from close in dbContext.Exchange_Option_Trade.Where(predicate)
join lastP in dbContext.eod_exchange_option_price.Where(p => p.ValueDate == req.PreLastPartDate)
on close.Code equals lastP.ContractCode into lastP
from lastPrice in lastP.DefaultIfEmpty()
join endP in dbContext.eod_exchange_option_price.Where(p => p.ValueDate == req.LastPartDate)
on close.Code equals endP.ContractCode into endP
from endPrice in endP.DefaultIfEmpty()
join asset in dbContext.assetunit on close.AssetId equals asset.id
where close.TradeStatus == "已平仓"
&& close.ExerciseDate >= req.CurrentPeriodDateStart
&& close.ExerciseDate <= req.CurrentPeriodDateEnd
select new FinancialSummaryExchangeModel()
{
TradeDate = close.TradeDate,
ExchangeOptionCode = close.Code,
UnderlyingCode = close.UnderlyingCode,
OptionType = close.OptionType,
Strike = close.Strike,
TradeDirection = close.TradeType == "空头" ? "卖" : "买",
Notional = close.TradeAmount / close.TradeUnitValue,
TradeUnit = close.TradeUnitValue,
TradePrice = close.TradePrice,
ServiceFee = close.ServiceFee,
PreLastDate = req.PreLastPartDate,
PrePotionLastPrice = lastPrice.SettlePrice,
PreDate = req.LastPartDate,
PrePotionEndPrice = endPrice.SettlePrice,
ClearDate = close.ExerciseDate,
UnwindTradeDirection = close.TradeType == "空头" ? "买" : "卖",
UnwindNotional = close.TradeAmount / close.TradeUnitValue,
ClearPrice = close.ExercisePrice,
UnwindServiceFee = close.ExerciseServiceFee,
PositionEndSettlementPrice = null,
PositionNotional = 0,
SurvivingNominalPrincipal = 0,
AssetBookName = asset.Name
});
result = mainQuery.ToSearchList(req);
}
result.Sum = new { PreLastPartDate = req.PreLastPartDate.ToString("yyyy/M/dd"), LastPartDate = req.LastPartDate.ToString("yyyy/M/dd") };
return result;
}
public static SearchListResult<FinancialSummaryExchangeModel> SearchExchangeTrade_GF(FinancialSummaryModelReq req)
{
var openPositionTag = new List<string>() { "多头开仓", "空头开仓" };
var closePositionTag = new List<string>() { "多头平仓", "空头平仓" };
var startDate = QdpCalendarHelper.GetNonHoliday(req.CurrentPeriodDateStart);
req.PreLastPartDate = startDate.AddMonths(-1).AddDays(-startDate.Day);
req.PreLastPartDate = QdpCalendarHelper.GetNonHolidayDefore(req.PreLastPartDate);
req.LastPartDate = startDate.AddDays(-startDate.Day);
req.LastPartDate = QdpCalendarHelper.GetNonHolidayDefore(req.LastPartDate);
if (req.sidx.IsNullOrWhiteSpace())
{ req.sidx = "TradeDate"; }
var result = new SearchListResult<FinancialSummaryExchangeModel>();
using (var dbContext = new YLContext())
{
var predicate = PredicateBuilder.Create<Exchange_Option_Trade>(n => n.TradeStatus == "确认成交" || n.TradeStatus == "已平仓");
//簿记账户
if (req.BookIds != null && req.BookIds.Any(x => x > 0))
{
predicate = predicate.And(a => req.BookIds.Contains(a.AssetId));
}
//var aa = (from eod in dbContext.eod_trade_position_s );
var mainQuery =
(from open in dbContext.Exchange_Option_Trade.Where(predicate)
join lastP in dbContext.eod_exchange_option_price.Where(p => p.ValueDate == req.PreLastPartDate)
on open.Code equals lastP.ContractCode into lastP
from lastPrice in lastP.DefaultIfEmpty()
join endP in dbContext.eod_exchange_option_price.Where(p => p.ValueDate == req.LastPartDate)
on open.Code equals endP.ContractCode into endP
from endPrice in endP.DefaultIfEmpty()
join settlementP in dbContext.eod_exchange_option_price.Where(p => p.ValueDate == req.CurrentPeriodDateEnd)
on open.Code equals settlementP.ContractCode into settlementP
from settlementPrice in settlementP.DefaultIfEmpty()
join asset in dbContext.assetunit on open.AssetId equals asset.id
where open.TradeStatus == "确认成交"
&& open.TradeDate <= req.CurrentPeriodDateEnd
&& open.ExerciseDate == DateTime.MinValue
select new FinancialSummaryExchangeModel()
{
TradeDate = open.TradeDate,
ExchangeOptionCode = open.Code,
UnderlyingCode = open.UnderlyingCode,
OptionType = open.OptionType,
Strike = open.Strike,
TradeDirection = open.TradeType == "空头" ? "卖" : "买",
Notional = open.TradeAmount / open.TradeUnitValue,
TradeUnit = open.TradeUnitValue,
TradePrice = open.TradePrice,
ServiceFee = open.ServiceFee,
PreLastDate = req.PreLastPartDate,
PrePotionLastPrice = lastPrice.SettlePrice,
PreDate = req.LastPartDate,
PrePotionEndPrice = endPrice.SettlePrice,
ClearDate = null,
UnwindTradeDirection = null,
UnwindNotional = null,
ClearPrice = null,
UnwindServiceFee = null,
PositionEndSettlementPrice = settlementPrice.SettlePrice,
PositionNotional = open.TradeAmount / open.TradeUnitValue,
SurvivingNominalPrincipal = open.TradeAmount / open.TradeUnitValue * open.Strike,
AssetBookName = asset.Name
})
.Concat
(from close in dbContext.Exchange_Option_Trade.Where(predicate)
join lastP in dbContext.eod_exchange_option_price.Where(p => p.ValueDate == req.PreLastPartDate)
on close.Code equals lastP.ContractCode into lastP
from lastPrice in lastP.DefaultIfEmpty()
join endP in dbContext.eod_exchange_option_price.Where(p => p.ValueDate == req.LastPartDate)
on close.Code equals endP.ContractCode into endP
from endPrice in endP.DefaultIfEmpty()
join asset in dbContext.assetunit on close.AssetId equals asset.id
where close.TradeStatus == "已平仓"
&& close.ExerciseDate >= req.CurrentPeriodDateStart
&& close.ExerciseDate <= req.CurrentPeriodDateEnd
select new FinancialSummaryExchangeModel()
{
TradeDate = close.TradeDate,
ExchangeOptionCode = close.Code,
UnderlyingCode = close.UnderlyingCode,
OptionType = close.OptionType,
Strike = close.Strike,
TradeDirection = close.TradeType == "空头" ? "卖" : "买",
Notional = close.TradeAmount / close.TradeUnitValue,
TradeUnit = close.TradeUnitValue,
TradePrice = close.TradePrice,
ServiceFee = close.ServiceFee,
PreLastDate = req.PreLastPartDate,
PrePotionLastPrice = lastPrice.SettlePrice,
PreDate = req.LastPartDate,
PrePotionEndPrice = endPrice.SettlePrice,
ClearDate = close.ExerciseDate,
UnwindTradeDirection = close.TradeType == "空头" ? "买" : "卖",
UnwindNotional = close.TradeAmount / close.TradeUnitValue,
ClearPrice = close.ExercisePrice,
UnwindServiceFee = close.ExerciseServiceFee,
PositionEndSettlementPrice = null,
PositionNotional = 0,
SurvivingNominalPrincipal = 0,
AssetBookName = asset.Name
});
result = mainQuery.ToSearchList(req);
}
result.Sum = new { PreLastPartDate = req.PreLastPartDate.ToString("yyyy/M/dd"), LastPartDate = req.LastPartDate.ToString("yyyy/M/dd") };
return result;
}
private class tempClass
{
public int? clientId { get; set; }
public DateTime tradeDate { get; set; }
public DateTime clearDate { get; set; }
public int underlyingId { get; set; }
/// <summary>
///
/// </summary>
public int CountRatio { get; set; }
public FinancialSummaryOptionModel trade { get; set; }
public trade_cash tradeCash { get; set; }
}
public static SearchListResult<FinancialSummaryOptionModel> SearchOptionTrade(FinancialSummaryModelReq req)
{
var actions = new List<string> { "系统操作-平仓费", "系统操作-行权费", "系统操作-互换" };
if (req.sidx.IsNullOrWhiteSpace())
{ req.sidx = "trade.TradeId"; }
var result = new SearchListResult<FinancialSummaryOptionModel>() { rows = new List<FinancialSummaryOptionModel>() };
List<int> tagClientIds = null;
if (req.ClientTagIds != null && req.ClientTagIds.Count > 0)
{
using (var clientDb = DbContextFactory.GetClientDbContext(null))
{
tagClientIds = (from tt in clientDb.client_tag
where req.ClientTagIds.Contains(tt.TagId)
select tt.ClientId).ToList();
}
if (tagClientIds == null || tagClientIds.Count == 0)
{
return result;
}
}
List<int> queryClientIds = null;
if (req.ClientIdList != null && req.ClientIdList.Count > 0 && tagClientIds != null && tagClientIds.Count > 0)
{
queryClientIds = req.ClientIdList.Intersect(tagClientIds).ToList();
if (queryClientIds == null || queryClientIds.Count == 0)
{
return result;
}
}
else
{
queryClientIds = (req.ClientIdList != null && req.ClientIdList.Count > 0) ? req.ClientIdList : tagClientIds;
}
using (var dbContext = new YLContext())
{
var tempTrade =
from t in dbContext.trade
where t.ValidState == null || t.ValidState != "InValid"
select t;
if (req.UserAssets != null && req.UserClients != null)
{
tempTrade = tempTrade.Where(a => req.UserAssets.Contains(a.AssetId) || req.UserClients.Contains(a.ClientId));
}
if (queryClientIds != null && queryClientIds.Count > 0)
{ tempTrade = tempTrade.Where(O => queryClientIds.Contains(O.ClientId)); }
if (!string.IsNullOrWhiteSpace(req.TradeNumber))
{
tempTrade = tempTrade.Where(O => O.TradeNumber == req.TradeNumber);
}
if (req.TradeTypeList != null && req.TradeTypeList.Count > 0)
{
if (req.TradeTypeList.Count() == 1 && req.TradeTypeList.Contains("收益互换"))
{
tempTrade = tempTrade.Where(O => req.TradeTypeList.Contains(O.TradeType) && O.IsGroup != 1);
}
else
{
tempTrade = tempTrade.Where(O => req.TradeTypeList.Contains(O.TradeType));
}
}
if (req.TradeDateStart != default)
{ tempTrade = tempTrade.Where(O => req.TradeDateStart <= O.TradeDate); }
if (req.TradeDateEnd != default)
{ tempTrade = tempTrade.Where(O => req.TradeDateEnd >= O.TradeDate); }
if (req.ExerciseDateStart != default)
{ tempTrade = tempTrade.Where(O => req.ExerciseDateStart <= O.ExerciseDate); }
if (req.ExerciseDateEnd != default)
{ tempTrade = tempTrade.Where(O => req.ExerciseDateEnd >= O.ExerciseDate); }
if (req.TagIds != null && req.TagIds.Count > 0)
{
var tradeTagIdQuery = from tt in dbContext.trade_tag
where req.TagIds.Contains(tt.TagId)
select tt.TradeId;
tempTrade = tempTrade.Where(p => tradeTagIdQuery.Contains(p.id));
}
var tempTradeCash =
from tc in dbContext.trade_cash.AsNoTracking()
where !tc.IsDeleted
&& (tc.ValidState == null || tc.ValidState != "InValid")
&& req.CurrentPeriodDateEnd >= tc.ValueDate
select tc;
if (req.ClearDateStart != default)
{ tempTradeCash = tempTradeCash.Where(O => O.UnwindNotional == null || req.ClearDateStart <= O.ValueDate); }
if (req.ClearDateEnd != default)
{ tempTradeCash = tempTradeCash.Where(O => O.UnwindNotional == null || req.ClearDateEnd >= O.ValueDate); }
var querys = new List<IQueryable<tempClass>>();
if (req.TradeStatus != "已完结")//未完结
{
querys.Add(from t in tempTrade.Where(t => t.UnWindDate == null || t.UnWindDate > req.CurrentPeriodDateEnd || ConsTrade.LiveTradeStatusList.Contains(t.TradeStatus))
join tc in tempTradeCash.Where(tc => tc.Action == "系统操作-期权费")
on new { tradeId = t.id, tradeDate = t.TradeDate ?? DateTime.Now } equals new { tradeId = tc.TradeId, tradeDate = tc.HappenedDate ?? tc.ValueDate }
select new tempClass()
{
clientId = t.ClientId,
tradeDate = tc.ConfirmDate == default ? t.TradeDate.Value : tc.ConfirmDate,
clearDate = DateTime.MaxValue,
underlyingId = t.UnderlyingId,
///CountRatio = (v.QuoteUnit ?? "").Contains("500千克") ? 2 : 1,
CountRatio = 1,
tradeCash = tc,
trade = new FinancialSummaryOptionModel()
{
ClientId = t.ClientId,
TradeId = t.id,
ParentTradeId = t.ParentTradeId,
TradeOpenCashId = tc.id,
TradeCloseCashId = 0,
ClientFullName = t.ClientName,
TradeNumber = t.TradeNumber,
OptionType = t.OptionType,
///ContractCode = tradeContractR == null ? "" : tradeContractR.Code,
ContractCode = "",
SettlementCode = "",
Status = false,
TradeDate = t.TradeDate,
ExerciseDate = t.ExerciseDate,
ClearDate = default,
TradeDirection = t.BuySell,
UnderlyingCode = t.UnderlyingCode,
ExerciseMode = t.ExerciseMode == "American" ? "美式" : "欧式",
TradeConfirmDate = tc.ConfirmDate == default ? tc.ValueDate : tc.ConfirmDate,
ClearConfirmDate = default,
///TradeConfirmFileStatus = tradeContractR == null ? "" : tradeContractR.Status,
TradeConfirmFileStatus = "",
ClearConfirmFileStatus = "",
///ContractSize = u.ContractSize,
ContractSize = 0,
StructureType = t.StructureType,
UnderlyingInstrumentType = t.UnderlyingInstrumentType,
TradeType = t.TradeType
}
});
}
if (req.TradeStatus != "未完结")//已完结
{
var tQuery = from t in tempTrade
join tc in tempTradeCash.Where(tc => actions.Contains(tc.Action) || tc.IsLastAction)
on t.id equals tc.TradeId
where tc.ValueDate <= req.CurrentPeriodDateEnd || !ConsTrade.LiveTradeStatusList.Contains(t.TradeStatus)
select t;
var tcOpenQuery = from tc_Open in tempTradeCash
where tc_Open.Action == "系统操作-期权费"
&& (req.TradeConfirmDateStart == default || (tc_Open.ConfirmDate == default && req.TradeConfirmDateStart <= tc_Open.ValueDate) || (tc_Open.ConfirmDate != default && req.TradeConfirmDateStart <= tc_Open.ConfirmDate))
&& (req.TradeConfirmDateEnd == default || (tc_Open.ConfirmDate == default && req.TradeConfirmDateEnd >= tc_Open.ValueDate) || (tc_Open.ConfirmDate != default && req.TradeConfirmDateEnd >= tc_Open.ConfirmDate))
select tc_Open;
var tcTempQuery = from tc in tempTradeCash
where actions.Contains(tc.Action) || tc.IsLastAction
&& (req.ClearConfirmDateStart == default || (tc.ConfirmDate == default && req.ClearConfirmDateStart <= tc.ValueDate) || (tc.ConfirmDate != default && req.ClearConfirmDateStart <= tc.ConfirmDate))
&& (req.ClearConfirmDateEnd == default || (tc.ConfirmDate == default && req.ClearConfirmDateEnd >= tc.ValueDate) || (tc.ConfirmDate != default && req.ClearConfirmDateEnd >= tc.ConfirmDate))
select tc;
querys.Add(from t in tQuery
join tc_Open in tcOpenQuery on new { tradeId = t.id, tradeDate = t.TradeDate ?? DateTime.Now } equals new { tradeId = tc_Open.TradeId, tradeDate = tc_Open.ValueDate }
join tc in tcTempQuery on t.id equals tc.TradeId
select new tempClass()
{
clientId = t.ClientId,
tradeDate = tc_Open.ConfirmDate == default ? tc_Open.ValueDate : tc_Open.ConfirmDate,
clearDate = tc.ConfirmDate == default ? tc.ValueDate : tc.ConfirmDate,
underlyingId = t.UnderlyingId,
//CountRatio = (v.QuoteUnit ?? "").Contains("500千克") ? 2 : 1,
CountRatio = 1,
tradeCash = tc,
trade = new FinancialSummaryOptionModel()
{
ClientId = t.ClientId,
TradeId = t.id,
ParentTradeId = t.ParentTradeId,
TradeOpenCashId = tc_Open.id,
TradeCloseCashId = tc.id,
ClientFullName = t.ClientName,
TradeNumber = t.TradeNumber,
OptionType = t.OptionType,
//ContractCode = tradeContractR == null ? "" : tradeContractR.Code,
ContractCode = "",
//SettlementCode = clearContractR == null ? "" : clearContractR.Code,
SettlementCode = "",
Status = true,
//ClientShortName = c.Abbreviation,
TradeDate = t.TradeDate,
ExerciseDate = t.ExerciseDate,
ClearDate = tc.ValueDate,
TradeDirection = t.BuySell,
UnderlyingCode = t.UnderlyingCode,
ExerciseMode = t.ExerciseMode == "American" ? "美式" : "欧式",
TradeConfirmDate = tc_Open.ConfirmDate == default ? tc_Open.ValueDate : tc_Open.ConfirmDate,
ClearConfirmDate = tc.ConfirmDate == default ? tc.ValueDate : tc.ConfirmDate,
TradeConfirmFileStatus = "",
ClearConfirmFileStatus = "",
ContractSize = 0,
StructureType = t.StructureType,
UnderlyingInstrumentType = t.UnderlyingInstrumentType,
TradeType = t.TradeType
}
});
}
var queryTrade = querys[0];
if (querys.Count > 1)
{
queryTrade = queryTrade.Union(querys[1]);
}
if (!req.ContractCode.IsNullOrWhiteSpace())
{
queryTrade = queryTrade.Where(O => O.trade.ContractCode.Contains(req.ContractCode));
}
if (req.CurrentPeriodDateStart != default && req.CurrentPeriodDateEnd != default)
{
var startDate = req.CurrentPeriodDateStart.AddDays(-1);
var endDate = req.CurrentPeriodDateEnd.AddDays(1);
queryTrade = queryTrade.Where(
O => O.tradeDate < endDate
&& O.clearDate > startDate);
}
if (req.TradeConfirmDateStart != default && req.TradeConfirmDateEnd != default)
{
var startDate = req.TradeConfirmDateStart.AddDays(-1);
var endDate = req.TradeConfirmDateEnd.AddDays(1);
queryTrade = queryTrade.Where(
O => O.tradeDate > startDate
&& O.tradeDate < endDate);
}
else
{
if (req.TradeConfirmDateStart != default)
{
var startDate = req.TradeConfirmDateStart.AddDays(-1);
queryTrade = queryTrade.Where(O => O.tradeDate > startDate);
}
if (req.TradeConfirmDateEnd != default)
{
var endDate = req.TradeConfirmDateEnd.AddDays(1);
queryTrade = queryTrade.Where(O => O.tradeDate < endDate);
}
}
if (req.ClearConfirmDateStart != default && req.ClearConfirmDateEnd != default)
{
var startDate = req.ClearConfirmDateStart.AddDays(-1);
var endDate = req.ClearConfirmDateEnd.AddDays(1);
queryTrade = queryTrade.Where(
O => O.clearDate > startDate
&& O.clearDate < endDate);
}
else
{
if (req.ClearConfirmDateStart != default)
{
var startDate = req.ClearConfirmDateStart.AddDays(-1);
queryTrade = queryTrade.Where(O => O.clearDate >= startDate);
}
if (req.ClearConfirmDateEnd != default)
{
var endDate = req.ClearConfirmDateEnd.AddDays(1);
queryTrade = queryTrade.Where(O => O.clearDate <= endDate);
}
}
queryTrade = queryTrade.Distinct();
var temp = queryTrade.ToSearchList(req);
var currentDate = QdpCalendarHelper.GetNonHolidayDefore(req.CurrentPeriodDateEnd);
var umProvider = DataCacheProvider.GetUnderlyingDataSource();
var service = new TradeDalService(OptUserInfo.SystemUser);
var tcQuery = dbContext.trade_cash.Where(O => !O.IsDeleted && O.ValidState != ConsGlobal.InValid);
var tradeTypes = new List<string> { "雪球期权", "凤凰期权", "区间累积期权" };
Dictionary<int, underlying_manager> underlyingDic = null;
Dictionary<int, Variety> verietyDic = null;
List<trade_contract_r> tradeContractList = null;
List<trade_contract_document> tradeDocumentList = null;
if (temp != null && temp.rows != null && temp.rows.Any())
{
var underlyingIds = temp.rows.Where(p => p.underlyingId > 0).Select(p => p.underlyingId).Distinct().ToList();
if (underlyingIds != null && underlyingIds.Count > 0)
{
underlyingDic = dbContext.underlying_manager.AsNoTracking().Where(p => underlyingIds.Contains(p.id)).ToDictionary(p => p.id);
}
if (underlyingDic != null && underlyingDic.Keys.Any())
{
var verietyIds = underlyingDic.Values.Select(p => p.UnderlyingTypeId).Distinct().ToList();
if (verietyIds != null && verietyIds.Count > 0)
{
verietyDic = dbContext.variety.AsNoTracking().Where(p => verietyIds.Contains(p.id)).ToDictionary(p => p.id);
}
}
var tradeOpenCashIds = temp.rows.Where(p => p.trade != null && p.trade.TradeOpenCashId > 0).Select(p => p.trade.TradeOpenCashId).Distinct().ToList();
var tradeCloseCashIds = temp.rows.Where(p => p.trade != null && p.trade.TradeCloseCashId > 0).Select(p => p.trade.TradeCloseCashId).Distinct().ToList();
var tradeCashIds = new List<int>();
if (tradeOpenCashIds != null && tradeOpenCashIds.Count > 0)
{
tradeCashIds.AddRange(tradeOpenCashIds);
}
if (tradeCloseCashIds != null && tradeCloseCashIds.Count > 0)
{
tradeCashIds.AddRange(tradeCloseCashIds);
}
if (tradeCashIds != null && tradeCashIds.Count > 0)
{
tradeCashIds = tradeCashIds.Distinct().ToList();
tradeContractList = dbContext.trade_contract_r.AsNoTracking().Where(p => p.TradeCashId > 0 && tradeCashIds.Contains((int)p.TradeCashId) && p.IsValid).ToList();
}
if (tradeContractList != null && tradeContractList.Count > 0)
{
var contractCodeList = tradeContractList.Select(p => p.ContractCode).Distinct().ToList();
if (contractCodeList != null && contractCodeList.Count > 0)
{
tradeDocumentList = dbContext.trade_contract_document.AsNoTracking().Where(p => contractCodeList.Contains(p.Code)).ToList();
}
}
}
underlyingDic ??= new Dictionary<int, underlying_manager>();
verietyDic ??= new Dictionary<int, Variety>();
tradeContractList ??= new List<trade_contract_r>();
tradeDocumentList ??= new List<trade_contract_document>();
foreach (var item in temp.rows)
{
var tids = new[] { item.trade.TradeId };
var date = (item.trade.Status ? item.trade.ExerciseDate : currentDate) ?? currentDate;
var trade = service.GetTradeOrEodTrade(tids, date).FirstOrDefault();
if (trade == null)
{
throw new Exception($"交易id为{item.trade.TradeId}的数据不存在");
}
double contractSize = 1;
if (underlyingDic.ContainsKey(item.underlyingId))
{
var um = underlyingDic[item.underlyingId];
if (um != null && um.ContractSize > 0)
{
contractSize = um.ContractSize;
item.trade.ContractSize = um.ContractSize;
}
else
{
contractSize = 1;
item.trade.ContractSize = 1;
}
if (um != null && um.UnderlyingTypeId > 0 && verietyDic.ContainsKey(um.UnderlyingTypeId))
{
item.CountRatio = (verietyDic[um.UnderlyingTypeId].QuoteUnit ?? "").Contains("500千克") ? 2 : 1;
}
}
if (item.trade != null && item.trade.TradeOpenCashId > 0)
{
var tradeContract = tradeContractList.FirstOrDefault(p => p.TradeCashId == item.trade.TradeOpenCashId && p.Type == ContractTypeEnum.Trade);
if (tradeContract != null && !string.IsNullOrEmpty(tradeContract.ContractCode))
{
var tradeDocument = tradeDocumentList.FirstOrDefault(p => tradeContract.ContractCode.Equals(p.Code) && p.Type == ContractTypeEnum.Trade);
if (tradeDocument != null)
{
item.trade.ContractCode = tradeDocument.Code;
item.trade.TradeConfirmFileStatus = tradeDocument.Status;
}
}
}
if (item.trade != null && item.trade.TradeCloseCashId > 0)
{
var tradeContract = tradeContractList.FirstOrDefault(p => p.TradeCashId == item.trade.TradeCloseCashId && p.Type != ContractTypeEnum.Trade);
if (tradeContract != null && !string.IsNullOrEmpty(tradeContract.ContractCode))
{
var tradeDocument = tradeDocumentList.FirstOrDefault(p => tradeContract.ContractCode.Equals(p.Code) && p.Type != ContractTypeEnum.Trade);
if (tradeDocument != null)
{
item.trade.SettlementCode = tradeDocument.Code;
item.trade.ClearConfirmFileStatus = tradeDocument.Status;
}
}
}
if (!item.trade.Status)
{
var coupon = tradeTypes.Contains(trade.TradeType) ? tcQuery.Where(O => O.TradeId == trade.id && O.ValueDate >= req.CurrentPeriodDateStart && O.ValueDate <= req.CurrentPeriodDateEnd && O.Action == "系统操作-票息").Sum(O => (double?)O.Amount) : null;
item.trade.TradePrice = ((item.trade.TradeType != "远期" ? ((trade.BuySell == "卖出" ? 1 : -1) * trade.TradePrice) : trade.TradePrice) * trade.Notional / trade.OriginalNotional).OtcFormatValue(OtcFormatFlag.umprice);
item.trade.ClearPrice = coupon;
item.trade.Notional = trade.Notional;
item.trade.StockEqvNotional = TradeHelper.GetStockEqvNotional(trade.SpotPrice * trade.Notional, trade.ParticipationRate, trade.AnnualizeFactor);
item.trade.StockEqvNotional2 = (trade.IsMoneynessOptionData ? trade.Strike * trade.SpotPrice : trade.Strike) * trade.Notional;
item.trade.StockEqvNotional3 = trade.OriginalStockEqvNotionalV2 ?? 0;
item.trade.OriginalNotional = trade.OriginalNotional ?? 0;
item.trade.OriginalAmount = (trade.OriginalNotional ?? 0) / item.CountRatio;
item.trade.PositionAmount = trade.Notional / item.CountRatio;
item.trade.PositionLots = trade.Notional / item.CountRatio / contractSize;
item.trade.OriginalLots = (trade.OriginalNotional ?? 0) / contractSize;
item.trade.Lots = trade.Notional / contractSize;
item.trade.TradeAmount = trade.Notional / item.CountRatio;
}
else
{
var coupon = tradeTypes.Contains(trade.TradeType) ? tcQuery.Where(O => O.TradeId == trade.id && O.ValueDate >= req.CurrentPeriodDateStart && O.ValueDate <= req.CurrentPeriodDateEnd && O.Action != "系统操作-期权费").Sum(O => (double?)O.Amount) : null;
item.trade.TradePrice = ((item.trade.TradeType != "远期" ? ((trade.BuySell == "卖出" ? 1 : -1) * trade.TradePrice) : trade.TradePrice) * item.tradeCash.UnwindPercentRate).OtcFormatValue(OtcFormatFlag.umprice);
item.trade.ClearPrice = item.tradeCash.Amount;
item.trade.Notional = item.tradeCash.UnwindPercentRate * trade.OriginalNotional;
item.trade.StockEqvNotional = item.tradeCash.UnwindPercentRate * trade.OriginalStockEqvNotional;
item.trade.StockEqvNotional2 = (trade.IsMoneynessOptionData ? trade.SpotPrice * trade.Strike : trade.Strike) * item.trade.Notional;
item.trade.StockEqvNotional3 = trade.OriginalStockEqvNotionalV2 ?? 0;
item.trade.OriginalNotional = trade.OriginalNotional ?? 0;
item.trade.OriginalAmount = (trade.OriginalNotional ?? 0) / item.CountRatio;
item.trade.PositionAmount = item.tradeCash.IsLastAction ? 0 : ((item.tradeCash.Notional - (item.tradeCash.UnwindNotional ?? 0)) / item.CountRatio);
item.trade.PositionLots = item.tradeCash.IsLastAction ? 0 : ((item.tradeCash.Notional - (item.tradeCash.UnwindNotional ?? 0)) / item.CountRatio/ contractSize);
item.trade.OriginalLots = (trade.OriginalNotional ?? 0) / contractSize;
item.trade.Lots = item.trade.Notional / contractSize ?? 0;
item.trade.TradeAmount /= item.CountRatio;
}
var client = DataCacheProvider.GetClientDataSource().GetData(item.clientId ?? 0);
item.trade.ClientShortName = client?.Abbreviation;
}
result.Msg = temp.Msg;
result.page = temp.page;
result.records = temp.records;
result.rows = temp.rows.Select(O => O.trade);
result.Sum = temp.Sum;
result.total = temp.total;
}
return result;
}
/// <summary>
/// 广发定制 财务汇总数据
/// </summary>
/// <param name="req"></param>
/// <returns></returns>
/// <exception cref="Exception"></exception>
public static List<FinancialSummaryOptionModel> SearchOptionTrade_GF(FinancialSummaryModelReq req)
{
var actions = new List<string> { "系统操作-平仓费", "系统操作-行权费", "系统操作-互换" };
if (req.sidx.IsNullOrWhiteSpace())
{ req.sidx = "trade.TradeId"; }
var result = new List<FinancialSummaryOptionModel>();
List<int> tagClientIds = null;
if (req.ClientTagIds != null && req.ClientTagIds.Count > 0)
{
using (var clientDb = DbContextFactory.GetClientDbContext(null))
{
tagClientIds = (from tt in clientDb.client_tag
where req.ClientTagIds.Contains(tt.TagId)
select tt.ClientId).ToList();
}
if (tagClientIds == null || tagClientIds.Count == 0)
{
return result;
}
}
List<int> queryClientIds = null;
if (req.ClientIdList != null && req.ClientIdList.Count > 0 && tagClientIds != null && tagClientIds.Count > 0)
{
queryClientIds = req.ClientIdList.Intersect(tagClientIds).ToList();
if (queryClientIds == null || queryClientIds.Count == 0)
{
return result;
}
}
else
{
queryClientIds = (req.ClientIdList != null && req.ClientIdList.Count > 0) ? req.ClientIdList : tagClientIds;
}
using (var dbContext = new YLContext())
{
var tempTrade =
from t in dbContext.trade
where t.ValidState == null || t.ValidState != "InValid"
select t;
if (req.UserAssets != null && req.UserClients != null)
{
tempTrade = tempTrade.Where(a => req.UserAssets.Contains(a.AssetId) || req.UserClients.Contains(a.ClientId));
}
//簿记账户
if (req.BookIds!=null && req.BookIds.Any())
{
tempTrade = tempTrade.Where(a => req.BookIds.Contains(a.AssetId));
}
if (!string.IsNullOrEmpty(req.VarietyCode))
{
var reqUnderlyingCodes= dbContext.underlying_manager.AsNoTracking().Where(l => l.CommodityCode == req.VarietyCode).Select(l => l.UnderlyingCode).ToList();
tempTrade = tempTrade.Where(a => reqUnderlyingCodes.Contains(a.UnderlyingCode));
}
if (!string.IsNullOrEmpty(req.VarietyName))
{
var reqUnderlyingCodes = dbContext.underlying_manager.AsNoTracking().Where(l => l.CommodityCode == req.VarietyName).Select(l => l.UnderlyingCode).ToList();
tempTrade = tempTrade.Where(a => reqUnderlyingCodes.Contains(a.UnderlyingCode));
}
if (queryClientIds != null && queryClientIds.Count > 0)
{ tempTrade = tempTrade.Where(O => queryClientIds.Contains(O.ClientId)); }
if (!string.IsNullOrWhiteSpace(req.TradeNumber))
{
tempTrade = tempTrade.Where(O => O.TradeNumber == req.TradeNumber);
}
if (req.TradeTypeList != null && req.TradeTypeList.Count > 0)
{
if (req.TradeTypeList.Count() == 1 && req.TradeTypeList.Contains("收益互换"))
{
tempTrade = tempTrade.Where(O => req.TradeTypeList.Contains(O.TradeType) && O.IsGroup != 1);
}
else
{
tempTrade = tempTrade.Where(O => req.TradeTypeList.Contains(O.TradeType));
}
}
if (req.TradeDateStart != default)
{ tempTrade = tempTrade.Where(O => req.TradeDateStart <= O.TradeDate); }
if (req.TradeDateEnd != default)
{ tempTrade = tempTrade.Where(O => req.TradeDateEnd >= O.TradeDate); }
if (req.ExerciseDateStart != default)
{ tempTrade = tempTrade.Where(O => req.ExerciseDateStart <= O.ExerciseDate); }
if (req.ExerciseDateEnd != default)
{ tempTrade = tempTrade.Where(O => req.ExerciseDateEnd >= O.ExerciseDate); }
if (req.TagIds != null && req.TagIds.Count > 0)
{
var tradeTagIdQuery = from tt in dbContext.trade_tag
where req.TagIds.Contains(tt.TagId)
select tt.TradeId;
tempTrade = tempTrade.Where(p => tradeTagIdQuery.Contains(p.id));
}
var tempTradeCash =
from tc in dbContext.trade_cash.AsNoTracking()
where !tc.IsDeleted
&& (tc.ValidState == null || tc.ValidState != "InValid")
&& req.CurrentPeriodDateEnd >= tc.ValueDate
select tc;
if (req.ClearDateStart != default)
{ tempTradeCash = tempTradeCash.Where(O => O.UnwindNotional == null || req.ClearDateStart <= O.ValueDate); }
if (req.ClearDateEnd != default)
{ tempTradeCash = tempTradeCash.Where(O => O.UnwindNotional == null || req.ClearDateEnd >= O.ValueDate); }
var querys = new List<IQueryable<tempClass>>();
if (req.TradeStatus != "已完结")//未完结
{
querys.Add(from t in tempTrade.Where(t => t.UnWindDate == null || t.UnWindDate > req.CurrentPeriodDateEnd || ConsTrade.LiveTradeStatusList.Contains(t.TradeStatus))
join tc in tempTradeCash.Where(tc => tc.Action == "系统操作-期权费")
on new { tradeId = t.id, tradeDate = t.TradeDate ?? DateTime.Now } equals new { tradeId = tc.TradeId, tradeDate = tc.HappenedDate ?? tc.ValueDate }
select new tempClass()
{
clientId = t.ClientId,
tradeDate = tc.ConfirmDate == default ? t.TradeDate.Value : tc.ConfirmDate,
clearDate = DateTime.MaxValue,
underlyingId = t.UnderlyingId,
///CountRatio = (v.QuoteUnit ?? "").Contains("500千克") ? 2 : 1,
CountRatio = 1,
tradeCash = tc,
trade = new FinancialSummaryOptionModel()
{
ClientId = t.ClientId,
TradeId = t.id,
ParentTradeId = t.ParentTradeId,
TradeOpenCashId = tc.id,
TradeCloseCashId = 0,
ClientFullName = t.ClientName,
TradeNumber = t.TradeNumber,
OptionType = t.OptionType,
///ContractCode = tradeContractR == null ? "" : tradeContractR.Code,
ContractCode = "",
SettlementCode = "",
Status = false,
TradeDate = t.TradeDate,
ExerciseDate = t.ExerciseDate,
ClearDate = default,
TradeDirection = t.BuySell,
UnderlyingCode = t.UnderlyingCode,
ExerciseMode = t.ExerciseMode == "American" ? "美式" : "欧式",
TradeConfirmDate = tc.ConfirmDate == default ? tc.ValueDate : tc.ConfirmDate,
ClearConfirmDate = default,
///TradeConfirmFileStatus = tradeContractR == null ? "" : tradeContractR.Status,
TradeConfirmFileStatus = "",
ClearConfirmFileStatus = "",
///ContractSize = u.ContractSize,
ContractSize = 0,
StructureType = t.StructureType,
UnderlyingInstrumentType = t.UnderlyingInstrumentType,
TradeType = t.TradeType,
AssetBookName = t.AssetBookName,
AssetId = t.AssetId
}
});
}
if (req.TradeStatus != "未完结")//已完结
{
var tQuery = from t in tempTrade
join tc in tempTradeCash.Where(tc => actions.Contains(tc.Action) || tc.IsLastAction)
on t.id equals tc.TradeId
where tc.ValueDate <= req.CurrentPeriodDateEnd || !ConsTrade.LiveTradeStatusList.Contains(t.TradeStatus)
select t;
var tcOpenQuery = from tc_Open in tempTradeCash
where tc_Open.Action == "系统操作-期权费"
&& (req.TradeConfirmDateStart == default || (tc_Open.ConfirmDate == default && req.TradeConfirmDateStart <= tc_Open.ValueDate) || (tc_Open.ConfirmDate != default && req.TradeConfirmDateStart <= tc_Open.ConfirmDate))
&& (req.TradeConfirmDateEnd == default || (tc_Open.ConfirmDate == default && req.TradeConfirmDateEnd >= tc_Open.ValueDate) || (tc_Open.ConfirmDate != default && req.TradeConfirmDateEnd >= tc_Open.ConfirmDate))
select tc_Open;
var tcTempQuery = from tc in tempTradeCash
where actions.Contains(tc.Action) || tc.IsLastAction
&& (req.ClearConfirmDateStart == default || (tc.ConfirmDate == default && req.ClearConfirmDateStart <= tc.ValueDate) || (tc.ConfirmDate != default && req.ClearConfirmDateStart <= tc.ConfirmDate))
&& (req.ClearConfirmDateEnd == default || (tc.ConfirmDate == default && req.ClearConfirmDateEnd >= tc.ValueDate) || (tc.ConfirmDate != default && req.ClearConfirmDateEnd >= tc.ConfirmDate))
select tc;
querys.Add(from t in tQuery
join tc_Open in tcOpenQuery on new { tradeId = t.id, tradeDate = t.TradeDate ?? DateTime.Now } equals new { tradeId = tc_Open.TradeId, tradeDate = tc_Open.ValueDate }
join tc in tcTempQuery on t.id equals tc.TradeId
select new tempClass()
{
clientId = t.ClientId,
tradeDate = tc_Open.ConfirmDate == default ? tc_Open.ValueDate : tc_Open.ConfirmDate,
clearDate = tc.ConfirmDate == default ? tc.ValueDate : tc.ConfirmDate,
underlyingId = t.UnderlyingId,
//CountRatio = (v.QuoteUnit ?? "").Contains("500千克") ? 2 : 1,
CountRatio = 1,
tradeCash = tc,
trade = new FinancialSummaryOptionModel()
{
ClientId = t.ClientId,
TradeId = t.id,
ParentTradeId = t.ParentTradeId,
TradeOpenCashId = tc_Open.id,
TradeCloseCashId = tc.id,
ClientFullName = t.ClientName,
TradeNumber = t.TradeNumber,
OptionType = t.OptionType,
//ContractCode = tradeContractR == null ? "" : tradeContractR.Code,
ContractCode = "",
//SettlementCode = clearContractR == null ? "" : clearContractR.Code,
SettlementCode = "",
Status = true,
//ClientShortName = c.Abbreviation,
TradeDate = t.TradeDate,
ExerciseDate = t.ExerciseDate,
ClearDate = tc.ValueDate,
TradeDirection = t.BuySell,
UnderlyingCode = t.UnderlyingCode,
ExerciseMode = t.ExerciseMode == "American" ? "美式" : "欧式",
TradeConfirmDate = tc_Open.ConfirmDate == default ? tc_Open.ValueDate : tc_Open.ConfirmDate,
ClearConfirmDate = tc.ConfirmDate == default ? tc.ValueDate : tc.ConfirmDate,
TradeConfirmFileStatus = "",
ClearConfirmFileStatus = "",
ContractSize = 0,
StructureType = t.StructureType,
UnderlyingInstrumentType = t.UnderlyingInstrumentType,
TradeType = t.TradeType,
AssetBookName = t.AssetBookName,
AssetId = t.AssetId
}
});
}
var queryTrade = querys[0];
if (querys.Count > 1)
{
queryTrade = queryTrade.Union(querys[1]);
}
if (!req.ContractCode.IsNullOrWhiteSpace())
{
queryTrade = queryTrade.Where(O => O.trade.ContractCode.Contains(req.ContractCode));
}
if (req.CurrentPeriodDateStart != default && req.CurrentPeriodDateEnd != default)
{
var startDate = req.CurrentPeriodDateStart.AddDays(-1);
var endDate = req.CurrentPeriodDateEnd.AddDays(1);
queryTrade = queryTrade.Where(
O => O.tradeDate < endDate
&& O.clearDate > startDate);
}
if (req.TradeConfirmDateStart != default && req.TradeConfirmDateEnd != default)
{
var startDate = req.TradeConfirmDateStart.AddDays(-1);
var endDate = req.TradeConfirmDateEnd.AddDays(1);
queryTrade = queryTrade.Where(
O => O.tradeDate > startDate
&& O.tradeDate < endDate);
}
else
{
if (req.TradeConfirmDateStart != default)
{
var startDate = req.TradeConfirmDateStart.AddDays(-1);
queryTrade = queryTrade.Where(O => O.tradeDate > startDate);
}
if (req.TradeConfirmDateEnd != default)
{
var endDate = req.TradeConfirmDateEnd.AddDays(1);
queryTrade = queryTrade.Where(O => O.tradeDate < endDate);
}
}
if (req.ClearConfirmDateStart != default && req.ClearConfirmDateEnd != default)
{
var startDate = req.ClearConfirmDateStart.AddDays(-1);
var endDate = req.ClearConfirmDateEnd.AddDays(1);
queryTrade = queryTrade.Where(
O => O.clearDate > startDate
&& O.clearDate < endDate);
}
else
{
if (req.ClearConfirmDateStart != default)
{
var startDate = req.ClearConfirmDateStart.AddDays(-1);
queryTrade = queryTrade.Where(O => O.clearDate >= startDate);
}
if (req.ClearConfirmDateEnd != default)
{
var endDate = req.ClearConfirmDateEnd.AddDays(1);
queryTrade = queryTrade.Where(O => O.clearDate <= endDate);
}
}
queryTrade = queryTrade.Distinct();
var temp = queryTrade.ToSearchList(req);
var currentDate = QdpCalendarHelper.GetNonHolidayDefore(req.CurrentPeriodDateEnd);
var umProvider = DataCacheProvider.GetUnderlyingDataSource();
var service = new TradeDalService(OptUserInfo.SystemUser);
var tcQuery = dbContext.trade_cash.Where(O => !O.IsDeleted && O.ValidState != ConsGlobal.InValid);
var tradeTypes = new List<string> { "雪球期权", "凤凰期权", "区间累积期权" };
Dictionary<int, underlying_manager> underlyingDic = null;
Dictionary<int, Variety> verietyDic = null;
List<trade_contract_r> tradeContractList = null;
List<trade_contract_document> tradeDocumentList = null;
if (temp != null && temp.rows != null && temp.rows.Any())
{
var underlyingIds = temp.rows.Where(p => p.underlyingId > 0).Select(p => p.underlyingId).Distinct().ToList();
if (underlyingIds != null && underlyingIds.Count > 0)
{
underlyingDic = dbContext.underlying_manager.AsNoTracking().Where(p => underlyingIds.Contains(p.id)).ToDictionary(p => p.id);
}
if (underlyingDic != null && underlyingDic.Keys.Any())
{
var verietyIds = underlyingDic.Values.Select(p => p.UnderlyingTypeId).Distinct().ToList();
if (verietyIds != null && verietyIds.Count > 0)
{
verietyDic = dbContext.variety.AsNoTracking().Where(p => verietyIds.Contains(p.id)).ToDictionary(p => p.id);
}
}
var tradeOpenCashIds = temp.rows.Where(p => p.trade != null && p.trade.TradeOpenCashId > 0).Select(p => p.trade.TradeOpenCashId).Distinct().ToList();
var tradeCloseCashIds = temp.rows.Where(p => p.trade != null && p.trade.TradeCloseCashId > 0).Select(p => p.trade.TradeCloseCashId).Distinct().ToList();
var tradeCashIds = new List<int>();
if (tradeOpenCashIds != null && tradeOpenCashIds.Count > 0)
{
tradeCashIds.AddRange(tradeOpenCashIds);
}
if (tradeCloseCashIds != null && tradeCloseCashIds.Count > 0)
{
tradeCashIds.AddRange(tradeCloseCashIds);
}
if (tradeCashIds != null && tradeCashIds.Count > 0)
{
tradeCashIds = tradeCashIds.Distinct().ToList();
tradeContractList = dbContext.trade_contract_r.AsNoTracking().Where(p => p.TradeCashId > 0 && tradeCashIds.Contains((int)p.TradeCashId) && p.IsValid).ToList();
}
if (tradeContractList != null && tradeContractList.Count > 0)
{
var contractCodeList = tradeContractList.Select(p => p.ContractCode).Distinct().ToList();
if (contractCodeList != null && contractCodeList.Count > 0)
{
tradeDocumentList = dbContext.trade_contract_document.AsNoTracking().Where(p => contractCodeList.Contains(p.Code)).ToList();
}
}
}
underlyingDic ??= new Dictionary<int, underlying_manager>();
verietyDic ??= new Dictionary<int, Variety>();
tradeContractList ??= new List<trade_contract_r>();
tradeDocumentList ??= new List<trade_contract_document>();
foreach (var item in temp.rows)
{
var tids = new[] { item.trade.TradeId };
var date = (item.trade.Status ? item.trade.ExerciseDate : currentDate) ?? currentDate;
var trade = service.GetTradeOrEodTrade(tids, date).FirstOrDefault();
if (trade == null)
{
throw new Exception($"交易id为{item.trade.TradeId}的数据不存在");
}
double contractSize = 1;
if (underlyingDic.ContainsKey(item.underlyingId))
{
var um = underlyingDic[item.underlyingId];
if (um != null && um.ContractSize > 0)
{
contractSize = um.ContractSize;
item.trade.ContractSize = um.ContractSize;
}
else
{
contractSize = 1;
item.trade.ContractSize = 1;
}
if (um != null && um.UnderlyingTypeId > 0 && verietyDic.ContainsKey(um.UnderlyingTypeId))
{
item.CountRatio = (verietyDic[um.UnderlyingTypeId].QuoteUnit ?? "").Contains("500千克") ? 2 : 1;
}
}
if (item.trade != null && item.trade.TradeOpenCashId > 0)
{
var tradeContract = tradeContractList.FirstOrDefault(p => p.TradeCashId == item.trade.TradeOpenCashId && p.Type == ContractTypeEnum.Trade);
if (tradeContract != null && !string.IsNullOrEmpty(tradeContract.ContractCode))
{
var tradeDocument = tradeDocumentList.FirstOrDefault(p => tradeContract.ContractCode.Equals(p.Code) && p.Type == ContractTypeEnum.Trade);
if (tradeDocument != null)
{
item.trade.ContractCode = tradeDocument.Code;
item.trade.TradeConfirmFileStatus = tradeDocument.Status;
}
}
}
if (item.trade != null && item.trade.TradeCloseCashId > 0)
{
var tradeContract = tradeContractList.FirstOrDefault(p => p.TradeCashId == item.trade.TradeCloseCashId && p.Type != ContractTypeEnum.Trade);
if (tradeContract != null && !string.IsNullOrEmpty(tradeContract.ContractCode))
{
var tradeDocument = tradeDocumentList.FirstOrDefault(p => tradeContract.ContractCode.Equals(p.Code) && p.Type != ContractTypeEnum.Trade);
if (tradeDocument != null)
{
item.trade.SettlementCode = tradeDocument.Code;
item.trade.ClearConfirmFileStatus = tradeDocument.Status;
}
}
}
if (!item.trade.Status)
{
var coupon = tradeTypes.Contains(trade.TradeType) ? tcQuery.Where(O => O.TradeId == trade.id && O.ValueDate >= req.CurrentPeriodDateStart && O.ValueDate <= req.CurrentPeriodDateEnd && O.Action == "系统操作-票息").Sum(O => (double?)O.Amount) : null;
item.trade.TradePrice = ((item.trade.TradeType != "远期" ? ((trade.BuySell == "卖出" ? 1 : -1) * trade.TradePrice) : trade.TradePrice) * trade.Notional / trade.OriginalNotional).OtcFormatValue(OtcFormatFlag.umprice);
item.trade.ClearPrice = coupon;
item.trade.Notional = trade.Notional;
item.trade.StockEqvNotional = TradeHelper.GetStockEqvNotional(trade.SpotPrice * trade.Notional, trade.ParticipationRate, trade.AnnualizeFactor);
item.trade.StockEqvNotional2 = (trade.IsMoneynessOptionData ? trade.Strike * trade.SpotPrice : trade.Strike) * trade.Notional;
item.trade.StockEqvNotional3 = trade.OriginalStockEqvNotionalV2 ?? 0;
item.trade.OriginalNotional = trade.OriginalNotional ?? 0;
item.trade.OriginalAmount = (trade.OriginalNotional ?? 0) / item.CountRatio;
item.trade.PositionAmount = trade.Notional / item.CountRatio;
item.trade.OriginalLots = (trade.OriginalNotional ?? 0) / contractSize;
item.trade.Lots = trade.Notional / contractSize;
item.trade.TradeAmount = trade.Notional / item.CountRatio;
}
else
{
var coupon = tradeTypes.Contains(trade.TradeType) ? tcQuery.Where(O => O.TradeId == trade.id && O.ValueDate >= req.CurrentPeriodDateStart && O.ValueDate <= req.CurrentPeriodDateEnd && O.Action != "系统操作-期权费").Sum(O => (double?)O.Amount) : null;
item.trade.TradePrice = ((item.trade.TradeType != "远期" ? ((trade.BuySell == "卖出" ? 1 : -1) * trade.TradePrice) : trade.TradePrice) * item.tradeCash.UnwindPercentRate).OtcFormatValue(OtcFormatFlag.umprice);
item.trade.ClearPrice = item.tradeCash.Amount;
item.trade.Notional = item.tradeCash.UnwindPercentRate * trade.OriginalNotional;
item.trade.StockEqvNotional = item.tradeCash.UnwindPercentRate * trade.OriginalStockEqvNotional;
item.trade.StockEqvNotional2 = (trade.IsMoneynessOptionData ? trade.SpotPrice * trade.Strike : trade.Strike) * item.trade.Notional;
item.trade.StockEqvNotional3 = trade.OriginalStockEqvNotionalV2 ?? 0;
item.trade.OriginalNotional = trade.OriginalNotional ?? 0;
item.trade.OriginalAmount = (trade.OriginalNotional ?? 0) / item.CountRatio;
item.trade.PositionAmount = item.tradeCash.IsLastAction ? 0 : ((item.tradeCash.Notional - (item.tradeCash.UnwindNotional ?? 0)) / item.CountRatio);
item.trade.OriginalLots = (trade.OriginalNotional ?? 0) / contractSize;
item.trade.Lots = item.trade.Notional / contractSize ?? 0;
item.trade.TradeAmount /= item.CountRatio;
}
var client = DataCacheProvider.GetClientDataSource().GetData(item.clientId ?? 0);
item.trade.PreLastDate = QdpCalendarHelper.GetNonHolidayDefore(req.CurrentPeriodDateStart.AddDays(-1));
item.trade.ClientShortName = client?.Abbreviation;
item.trade.AssetBookName = trade.AssetBookName;
item.trade.AssetId = trade.AssetId;
item.trade.VarietyCode = DataCacheProvider.GetVariety(trade.UnderlyingCode)?.VarietyCode;
}
result = temp.rows.Select(O => O.trade).ToList();
}
return result;
}
#region Private Methods
private void GetTradeDocumentResults(TradeReq req, trade_contract_group x)
{
var documentQuery = (from trade in db.trade_contract_document where trade.Code == x.trade_contract_r.ContractCode && trade.Type == x.trade_contract_r.Type select trade);
x.trade_contract_document = documentQuery.FirstOrDefault();
x.ContractDocUrl = x.trade_contract_document?.RelativePath;
x.ContractCode = x.trade_contract_r.ContractCode;
var sealResult = x.trade_contract_document?.SealResult;
x.SealResult = sealResult != null ? Enum.GetName(typeof(SealResultEnum), sealResult) : "";
x.SealTime = x.trade_contract_document?.SealResult == (int)SealResultEnum.成功 ? x.trade_contract_document?.OptDate.Value.ToString("yyyy-MM-dd HH:mm:ss") : "";
}
/// <summary>
/// isWithStructTrade 是否 查找结构化交易的子交易默认false
/// </summary>
private IQueryable<trade> CreateTradeQuery(TradeReq req, out YLContext dbUsed, bool isExerciseDateReport = false)
{
var db = new YLContext();
dbUsed = db;
var query = db.trade.AsQueryable();
if (req.UserAssets != null && req.UserClients != null)
{
query = query.Where(a => req.UserAssets.Contains(a.AssetId) || req.UserClients.Contains(a.ClientId));
}
if (!string.IsNullOrEmpty(req.ContractCode))
{
query = from source in query
join tcrConfirm in db.trade_contract_r.Where(aa => aa.Type == ContractTypeEnum.Trade && aa.IsValid) on new { id = source.ParentTradeId > 0 ? source.ParentTradeId : source.id } equals new { id = tcrConfirm.TradeId } into tcrConfirms
from tcrConfirm in tcrConfirms.DefaultIfEmpty()
where tcrConfirm.ContractCode.Contains(req.ContractCode)
select source;
}
if (req.ParentTradeId != null)
{
query = query.Where(q => q.ParentTradeId == req.ParentTradeId);
}
if (!string.IsNullOrEmpty(req.GroupNames))
{
query = query.Where(d => req.GroupNamesList.Contains(d.GroupName));
}
if (!string.IsNullOrEmpty(req.ExerciseMode))
{
query = query.Where(d => d.ExerciseMode.Contains(req.ExerciseMode));
}
if (!string.IsNullOrEmpty(req.UnderlyingAssetClass))
{
query = query.Where(d => d.UnderlyingAssetClass.Contains(req.UnderlyingAssetClass));
}
if (!string.IsNullOrEmpty(req.ClientIds))
{
query = query.Where(d => req.ClientIdsInt.Contains(d.ClientId));
}
if (req.TabIndex == (int)TradeTabIndexEnum.今日成交)
{
query = query.Where(d => d.TradeType != "股票" && d.TradeType != "商品期货");
}
if (!string.IsNullOrEmpty(req.TradeTypes))
{
var typeList = req.TradeTypesList;
query = query.Where(d => typeList.Contains(d.TradeType) || typeList.Contains(d.StructureType) || (typeList.Contains("黑箱结构") && d.IsGroup == 1));
}
if (!string.IsNullOrEmpty(req.StructureType))
{
query = query.Where(d => d.StructureType.Contains(req.StructureType));
}
if (req.TabIndex == (int)TradeTabIndexEnum.场外成交记录)
{
var typeList = ConsTrade.OptionTradeTypes;
var struTypeList = typeList.Concat(new string[] { "结构化交易" }).ToArray();
if (req.IsContainsGroup)
{
query = query.Where(d => typeList.Contains(d.TradeType) || struTypeList.Contains(d.StructureType) || d.IsGroup == 1);
}
else
{
query = query.Where(d => typeList.Contains(d.TradeType) || struTypeList.Contains(d.StructureType));
}
}
else if (req.TabIndex == (int)TradeTabIndexEnum.场外衍生品交易)
{
query = query.Where(d => d.TradeType == "远期");
}
else
{
var typeList = ConsTrade.AllTradeTypes;
var struTypeList = typeList.Concat(new string[] { "结构化交易" }).ToArray();
if (req.IsContainsGroup)
{
query = query.Where(d => typeList.Contains(d.TradeType) || struTypeList.Contains(d.StructureType) || d.IsGroup == 1);
}
else
{
query = query.Where(d => typeList.Contains(d.TradeType) || struTypeList.Contains(d.StructureType));
}
}
if (!string.IsNullOrEmpty(req.UnderlyingInstrumentTypes))
{
query = query.Where(d => req.UnderlyingInstrumentTypesList.Contains(d.UnderlyingInstrumentType));
}
if (!string.IsNullOrEmpty(req.OptIds))
{
query = query.Where(d => req.OptIdsList.Contains(d.OptId + ""));
}
if (!string.IsNullOrEmpty(req.Comments))
{
query = query.Where(d => d.Comments.Contains(req.Comments));
}
if (!string.IsNullOrEmpty(req.UnderlyingIds))
{
query = query.Where(d => req.UnderlyingIdsInt.Contains(d.UnderlyingId));
}
if (!string.IsNullOrEmpty(req.TradeIds))
{
query = query.Where(d => req.TradeIdList.Contains(d.id));
}
if (req.AssetIdList.Any())
{
query = query.Where(d => req.AssetIdList.Contains(d.AssetId));
}
//获取当日成交的数据
//当日成交包括操作日期和交易日为当前系统日期的数据
if (req.TabIndex == (int)TradeTabIndexEnum.今日成交)
{
var optDateStart = valuedateBLL.ValueDate;
var optDateEnd = valuedateBLL.ValueDate.AddDays(1);
var tradeDateStart = valuedateBLL.ValueDate;
var tradeDateEnd = valuedateBLL.ValueDate.AddDays(1);
query = query.Where(d => (d.TradeDate >= tradeDateStart && d.TradeDate < tradeDateEnd) || (d.OptDate >= optDateStart && d.OptDate < tradeDateEnd));
}
else
{
if (req.TradeDateStart != DateTime.MinValue)
{
query = query.Where(d => d.TradeDate >= req.TradeDateStart);
}
if (req.TradeDateEnd != DateTime.MinValue)
{
var TradeDateTemp = req.TradeDateEnd.AddDays(1);
query = query.Where(d => d.TradeDate < TradeDateTemp);
}
if (req.OptDateStart != DateTime.MinValue)
{
query = query.Where(d => d.OptDate >= req.OptDateStart);
}
if (req.OptDateEnd != DateTime.MinValue)
{
var OptDateTemp = req.OptDateEnd.AddDays(1);
query = query.Where(d => d.OptDate < OptDateTemp);
}
}
//获取当日到期日数据
if (req.TabIndex == (int)TradeTabIndexEnum.今日到期)
{
query = query.Where(d => d.ExerciseDate == valuedateBLL.ValueDate);
}
//获取明日到期日数据
else if (req.TabIndex == (int)TradeTabIndexEnum.明日到期)
{
var tommorow = QdpCalendarHelper.GetNonHoliday(valuedateBLL.ValueDate.AddDays(1));
query = query.Where(d => d.ExerciseDate == tommorow);
}
else
{
if (isExerciseDateReport)
{
if (req.ExerciseDateStart != null || req.ExerciseDateEnd != null)
{
if (req.ExerciseDateEnd == null)
{
req.ExerciseDateEnd = DateTime.MaxValue;
}
if (req.ExerciseDateStart == null)
{
req.ExerciseDateStart = DateTime.MinValue;
}
query = query.Where(d => d.ExerciseDate >= req.ExerciseDateStart && d.ExerciseDate <= req.ExerciseDateEnd);
}
}
else
{
if (req.ExerciseDateStart != null || req.ExerciseDateEnd != null)
{
if (req.ExerciseDateEnd == null)
{
req.ExerciseDateEnd = DateTime.MaxValue;
}
if (req.ExerciseDateStart == null)
{
req.ExerciseDateStart = DateTime.MinValue;
}
query = query.Where(d => d.ExerciseDate == null || (d.ExerciseDate >= req.ExerciseDateStart && d.ExerciseDate <= req.ExerciseDateEnd));
}
}
}
if (!string.IsNullOrEmpty(req.TraderNames))
{
query = query.Where(d => req.TraderNamesList.Contains(d.TraderId));
}
if (!string.IsNullOrEmpty(req.TradeNumber))
{
var childquery = from source in db.trade where source.TradeNumber.Equals(req.TradeNumber) && source.ParentTradeId != 0 select source;
query = query.Where(d => d.TradeNumber.Contains(req.TradeNumber) || childquery.Select(x => x.ParentTradeId).Contains(d.id));
}
if (req.ClientId != null)
{
query = query.Where(d => d.ClientId == req.ClientId);
}
if (!string.IsNullOrEmpty(req.ClientName))
{
query = query.Where(d => d.ClientName.Contains(req.ClientName));
}
if (!string.IsNullOrEmpty(req.UnderlyingCode))
{
query = query.Where(d => d.UnderlyingCode.Contains(req.UnderlyingCode));
}
if (req.UnderlyingCodeList != null)
{
query = query.Where(d => req.UnderlyingCodeList.Contains(d.UnderlyingCode));
}
if (req.UnderlyingId != null)
{
query = query.Where(d => d.UnderlyingId == req.UnderlyingId);
}
if (!string.IsNullOrEmpty(req.TradeType))
{
query = query.Where(d => d.TradeType.Contains(req.TradeType));
}
if (!string.IsNullOrEmpty(req.BuySell))
{
query = query.Where(d => d.BuySell.Contains(req.BuySell));
}
if (!string.IsNullOrEmpty(req.OptionType))
{
query = query.Where(d => d.OptionType == req.OptionType);
}
if (req.StartDateStart != DateTime.MinValue)
{
query = query.Where(d => d.StartDate >= req.StartDateStart);
}
if (req.StartDateEnd != DateTime.MinValue)
{
var StartDateTemp = req.StartDateEnd.AddDays(1);
query = query.Where(d => d.StartDate < StartDateTemp);
}
//过滤已平仓,已到期,已执行数据
else if (req.TabIndex == (int)TradeTabIndexEnum.今日到期 || req.TabIndex == (int)TradeTabIndexEnum.明日到期)
{
query = query.Where(d => d.TradeStatus != ConsTrade.已平仓 && d.TradeStatus != ConsTrade.已到期 && d.TradeStatus != ConsTrade.已执行);
}
if (!string.IsNullOrEmpty(req.TradeStatus))
{
var statuses = req.TradeStatus.Split(',').ToList();
query = query.Where(d => statuses.Contains(d.TradeStatus));
}
if (req.TradeStatusList != null)
{
query = query.Where(d => req.TradeStatusList.Contains(d.TradeStatus));
}
if (req.OptId != null)
{
query = query.Where(d => d.OptId == req.OptId);
}
if (!string.IsNullOrEmpty(req.OptName))
{
query = query.Where(d => d.OptName.Contains(req.OptName));
}
if (req.IsPairTrade != null)
{
if (req.IsPairTrade.Value)
{
query = query.Where(q => !string.IsNullOrEmpty(q.PairTrade));
}
else
{
query = query.Where(q => string.IsNullOrEmpty(q.PairTrade));
}
}
query = query.Where(d => !d.ValidState.Equals("InValid"));
if (req.UnWindDateStart != null || req.UnWindDateEnd != null)
{
if (req.UnWindDateEnd == null)
{
req.UnWindDateEnd = DateTime.MaxValue;
}
if (req.UnWindDateStart == null)
{
req.UnWindDateStart = DateTime.MinValue;
}
query = query.Where(d => d.UnWindDate >= req.UnWindDateStart && d.UnWindDate <= req.UnWindDateEnd);
}
//根据了结日期,了结次数进行筛选
var tradecashGpQuery = from tc in db.trade_cash
where tc.ValidState != "Invalid" && !tc.IsDeleted && (tc.Action == "系统操作-行权费" || tc.Action == "系统操作-平仓费")
group tc by tc.TradeId into tcgp
select new
{
Key = tcgp.Key,
UnWindTimes = tcgp.Count()
};
var tradecashParentGpQuery = from tc in db.trade_cash
where tc.ValidState != "Invalid" && !tc.IsDeleted && (tc.Action == "系统操作-行权费" || tc.Action == "系统操作-平仓费")
group tc by tc.ParentTradeId into tcpgp
select new
{
Key = tcpgp.Key,
UnWindTimes = tcpgp.Count()
};
if (req.UnWindTimes != null)
{
if (req.UnWindTimes == 0)
{
var tdids = from tcgp in tradecashGpQuery
where tcgp.UnWindTimes >= 1
select tcgp.Key;
var tdParentIds = from tcpgp in tradecashParentGpQuery
where tcpgp.UnWindTimes >= 1
select tcpgp.Key;
query = from q in query
where !tdids.Contains(q.id) && !tdParentIds.Contains(q.id)
select q;
}
else
{
query = from q in query
join tcgp in tradecashGpQuery on q.id equals tcgp.Key into tcgps
from tcgp in tcgps.DefaultIfEmpty()
join tcpgp in tradecashParentGpQuery on q.id equals tcpgp.Key into tcpgps
from tcpgp in tcpgps.DefaultIfEmpty()
where tcgp != null && tcgp.UnWindTimes == req.UnWindTimes || tcpgp != null && tcpgp.UnWindTimes == req.UnWindTimes
select q;
}
}
if (string.IsNullOrEmpty(req.sidx))
{
req.sidx = "id";
req.sord = "desc";
}
query = query.OrderByDescending(s => s.OptDate);
return query;
}
private IQueryable<TradeLinq> TradeOfQuery(TradeReq req, int userId, bool isUnionToday = false, bool isExerciseDateReport = false)
{
//如果是审批组
var approvalprocessQuery = db.approvalprocess.Where(a => a.processType == "TradeProcess");
var tradeOpenProcessOrder = approvalprocessQuery.Count();
// 需求②:了结流程节点数(用于平仓/行权/互换交易展示正确的审批进度)
var closeProcessOrder = db.approvalprocess.Count(a => a.processType == "CloseProcess");
var branch = approvalprocessQuery.FirstOrDefault(x => x.approvalGroupId != 0);//审批流程有分支情况
var firstBranch = approvalprocessQuery.Where(x => (x.node == 1 && x.approvalGroupId == 0) || x.node == 0);//分支一总流程
var secondBranch = approvalprocessQuery.Where(x => (x.node == 2 && x.approvalGroupId == 0) || x.node == 0);//分支二总流程
var firstCount = firstBranch.Count();
var secondCount = secondBranch.Count();
var groupId = UserBLL.GetApprovalProcessGroup(userId);
#region---predicate---
var predicate = PredicateBuilder.Create<trade>(t => t.ValidState != "InValid");
//平仓行权审批时,结构化交易,按子交易来审批
//2020-10-28 暂时结构化交易都按子交易审批复核
predicate = predicate.And(q => (!"结构化交易".Equals(q.TradeType) || q.IsGroup == 1) && (q.IsGroup != 2 || q.IsGroup == 2 && q.TradeType != "收益互换") && (q.TradeStatus == ConsTrade.平仓待复核 || q.TradeStatus == ConsTrade.行权待复核 || q.TradeStatus == ConsTrade.互换待复核 || q.TradeStatus == ConsTrade.审批中));
if (req.UserAssets != null && req.UserClients != null)
{
predicate = predicate.And(q => req.UserAssets.Contains(q.AssetId) || req.UserClients.Contains(q.ClientId));
}
if (!string.IsNullOrEmpty(req.GroupNames))
{
predicate = predicate.And(d => req.GroupNamesList.Contains(d.GroupName));
}
if (!string.IsNullOrEmpty(req.ExerciseMode))
{
predicate = predicate.And(d => d.ExerciseMode.Contains(req.ExerciseMode));
}
if (!string.IsNullOrEmpty(req.UnderlyingAssetClass))
{
predicate = predicate.And(d => d.UnderlyingAssetClass.Contains(req.UnderlyingAssetClass));
}
if (!string.IsNullOrEmpty(req.TradeTypes))
{
predicate = predicate.And(d => req.TradeTypesList.Contains(d.TradeType) || req.TradeTypesList.Contains(d.StructureType));
}
if (!string.IsNullOrEmpty(req.UnderlyingInstrumentTypes))
{
predicate = predicate.And(d => req.UnderlyingInstrumentTypesList.Contains(d.UnderlyingAssetClass));
}
if (!string.IsNullOrEmpty(req.OptIds))
{
predicate = predicate.And(d => req.OptIdsList.Contains(d.OptId.ToString()));
}
if (!string.IsNullOrEmpty(req.Comments))
{
predicate = predicate.And(d => d.Comments.Contains(req.Comments));
}
if (!string.IsNullOrEmpty(req.UnderlyingIds))
{
predicate = predicate.And(d => req.UnderlyingIdsInt.Contains(d.UnderlyingId));
}
if (!string.IsNullOrEmpty(req.TradeIds))
{
predicate = predicate.And(d => req.TradeIdList.Contains(d.id));
}
if (req.AssetIdList.Any())
{
predicate = predicate.And(d => req.AssetIdList.Contains(d.AssetId));
}
if (req.ClientIdsInt.Any())
{
predicate = predicate.And(d => req.ClientIdsInt.Contains(d.ClientId));
}
if (!string.IsNullOrEmpty(req.TraderNames))
{
predicate = predicate.And(d => req.TraderNamesList.Contains(d.TraderId));
}
if (!string.IsNullOrEmpty(req.TradeNumber))
{
var childquery = from source in db.trade where source.TradeNumber.Contains(req.TradeNumber) && source.ParentTradeId != 0 select source;
predicate = predicate.And(d => d.TradeNumber.Contains(req.TradeNumber) || childquery.Select(x => x.ParentTradeId).Contains(d.id));
}
if (req.ClientId != null)
{
predicate = predicate.And(d => d.ClientId == req.ClientId);
}
if (!string.IsNullOrEmpty(req.ClientName))
{
predicate = predicate.And(d => d.ClientName.Contains(req.ClientName));
}
if (!string.IsNullOrEmpty(req.UnderlyingCode))
{
predicate = predicate.And(d => d.UnderlyingCode.Contains(req.UnderlyingCode));
}
if (req.UnderlyingId != null)
{
predicate = predicate.And(d => d.UnderlyingId == req.UnderlyingId);
}
if (!string.IsNullOrEmpty(req.TradeType))
{
predicate = predicate.And(d => d.TradeType.Contains(req.TradeType));
}
if (req.TradeDateStart != DateTime.MinValue)
{
predicate = predicate.And(d => d.TradeDate >= req.TradeDateStart);
}
if (req.TradeDateEnd != DateTime.MinValue)
{
var TradeDateTemp = req.TradeDateEnd.AddDays(1);
predicate = predicate.And(d => d.TradeDate < TradeDateTemp);
}
if (!string.IsNullOrEmpty(req.BuySell))
{
predicate = predicate.And(d => d.BuySell.Contains(req.BuySell));
}
if (req.StartDateStart != DateTime.MinValue)
{
predicate = predicate.And(d => d.StartDate >= req.StartDateStart);
}
if (req.StartDateEnd != DateTime.MinValue)
{
var StartDateTemp = req.StartDateEnd.AddDays(1);
predicate = predicate.And(d => d.StartDate < StartDateTemp);
}
if (isExerciseDateReport)
{
if (req.ExerciseDateStart != null || req.ExerciseDateEnd != null)
{
if (req.ExerciseDateEnd == null)
{
req.ExerciseDateEnd = DateTime.MaxValue;
}
if (req.ExerciseDateStart == null)
{
req.ExerciseDateStart = DateTime.MinValue;
}
predicate = predicate.And(d => d.ExerciseDate >= req.ExerciseDateStart && d.ExerciseDate <= req.ExerciseDateEnd);
}
}
else
{
if (req.ExerciseDateStart != null || req.ExerciseDateEnd != null)
{
if (req.ExerciseDateEnd == null)
{
req.ExerciseDateEnd = DateTime.MaxValue;
}
if (req.ExerciseDateStart == null)
{
req.ExerciseDateStart = DateTime.MinValue;
}
predicate = predicate.And(d => ((d.ExerciseMode == "European" || d.ExerciseMode == null || "".Equals(d.ExerciseMode)) && d.ExerciseDate >= req.ExerciseDateStart && d.ExerciseDate <= req.ExerciseDateEnd) || (d.ExerciseMode == "American" && ((d.ExerciseDate >= req.ExerciseDateStart && d.ExerciseDate <= req.ExerciseDateEnd) || (d.StartDate >= req.ExerciseDateStart && d.StartDate <= req.ExerciseDateEnd) || (d.StartDate <= req.ExerciseDateStart && d.ExerciseDate >= req.ExerciseDateEnd))));
}
}
if (!string.IsNullOrEmpty(req.TradeStatus))
{
var statuses = req.TradeStatus.Split(',').ToList();
//IsApproval代表黑箱交易是主或者子交易分组了结,IsGroup代表除黑箱的情况,审批中代表 黑箱开仓审批。
predicate = predicate.And(d => statuses.Contains(d.TradeStatus) && (d.IsApproval == true || d.IsGroup == 0 || d.TradeStatus == "审批中"));
}
if (req.TradeStatusList != null)
{
predicate = predicate.And(d => req.TradeStatusList.Contains(d.TradeStatus));
}
if (!string.IsNullOrEmpty(req.OptName))
{
predicate = predicate.And(d => d.OptName.Contains(req.OptName));
}
if (req.OptDateStart != DateTime.MinValue)
{
predicate = predicate.And(d => d.OptDate >= req.OptDateStart);
}
if (req.OptDateEnd != DateTime.MinValue)
{
var OptDateTemp = req.OptDateEnd.AddDays(1);
predicate = predicate.And(d => d.OptDate < OptDateTemp);
}
if (req.AssetIdList.Any())
{
predicate = predicate.And(d => req.AssetIdList.Contains(d.AssetId));
}
if (req.ClientIdsInt.Any())
{
predicate = predicate.And(d => req.ClientIdsInt.Contains(d.ClientId));
}
#endregion
IQueryable<TradeLinq> query = null;
if (branch == null)
{
query = GetTradeLinqQuery(predicate, approvalprocessQuery, tradeOpenProcessOrder, 0, closeProcessOrder);
}
else
{
var branchIndex = branch.order;
var approvalConditionFirst = approvalprocessQuery.FirstOrDefault(x => x.approvalGroupId == groupId && x.approvalCondition == 1);//属于某个审批组
var approvalConditionSecend = approvalprocessQuery.FirstOrDefault(x => x.approvalGroupId != groupId && x.approvalCondition == 2);//不属于某个审批组
var nodeArr = new List<int?> { 0 };
if (approvalConditionFirst != null)
{
nodeArr.Add(approvalConditionFirst.node);
}
if (approvalConditionSecend != null)
{
nodeArr.Add(approvalConditionSecend.node);
}
query = GetTradeLinqQuery(predicate, firstBranch, firstCount, 1, branchIndex, nodeArr, closeProcessOrder);
var secondQuery = GetTradeLinqQuery(predicate, secondBranch, secondCount, 2, branchIndex, nodeArr, closeProcessOrder);
query = query.Union(secondQuery);
}
if (string.IsNullOrEmpty(req.sidx))
{
req.sidx = "id";
req.sord = "desc";
}
query = query.OrderByDescending(s => s.OptDate);
return query;
}
private IQueryable<TradeLinq> GetTradeLinqQuery(Expression<Func<trade, bool>> predicate, IQueryable<approvalprocess> approvalprocessQuery, int tradeOpenProcessOrder, int branchOrder, int closeProcessOrder = 0)
{
var query = from source in db.trade.Where(predicate)
join process in approvalprocessQuery on source.ProcessOrderId equals process.order into pro
from proce in pro.DefaultIfEmpty()
select new TradeLinq
{
id = source.id,
TradeSinglePrice = source.TradeSinglePrice,
GroupId = source.GroupId,
GroupName = source.GroupName,
NumOfSmoothingDays = source.NumOfSmoothingDays,
ParentTradeId = source.ParentTradeId,
TradeCloseVolatility = source.TradeCloseVolatility,
TradeOpenVolatility = source.TradeOpenVolatility,
UnWindDate = source.UnWindDate,
UnWindNotional = source.UnWindNotional,
SpotPrice = source.SpotPrice,
IsMoneynessOption = source.IsMoneynessOption,
TradeAmount = source.TradeAmount,
TradeUnit = source.TradeUnit,
StockEqvNotional = source.StockEqvNotional,
VolType = source.VolType,
UnderlyingInstrumentType = source.UnderlyingInstrumentType,
ExerciseDate = source.ExerciseDate,
TradeType = source.TradeType,
TraderName = source.TraderName,
TraderId = source.TraderId,
Vol = source.Vol,
Strike = source.Strike,
UnderlyingId = source.UnderlyingId,
AssetBookName = source.AssetBookName,
AssetId = source.AssetId,
Notional = source.Notional,
OptionType = source.OptionType,
PricingModel = source.PricingModel,
ExerciseMode = source.ExerciseMode,
NoRiskRate = source.NoRiskRate,
TradeNumber = source.TradeNumber,
ClientId = source.ClientId,
ClientName = source.ClientName,
UnderlyingCode = source.UnderlyingCode,
UnderlyingAssetClass = source.UnderlyingAssetClass,
TradeDate = source.TradeDate,
BuySell = source.BuySell,
StartDate = source.StartDate,
MaturityDate = source.MaturityDate,
TradePrice = source.TradePrice,
TradeStatus = source.TradeStatus,
OptId = source.OptId,
OptName = source.OptName,
OptDate = source.OptDate,
ProcessStatus = source.ProcessStatus == "审批中" ? source.ProcessStatus + " 流程" + (branchOrder != 0 && source.ProcessOrderId > branchOrder ? source.ProcessOrderId - 2 : source.ProcessOrderId - 1) + "/" + (source.TradeStatus == "平仓待复核" || source.TradeStatus == "行权待复核" || source.TradeStatus == "互换待复核" ? (closeProcessOrder > 0 ? closeProcessOrder : tradeOpenProcessOrder) : tradeOpenProcessOrder) : source.ProcessStatus,
ProcessOrderId = source.ProcessOrderId,
ProcessOrderBranch = source.ProcessOrderBranch,
ProcessRoleId = proce.roleId,
ProcessOptDate = source.ProcessOptDate,
ProcessRoleName = "",
ValidState = source.ValidState,
Comments = source.Comments,
SentMailCount = source.SentMailCount,
PremiumPayDate = source.PremiumPayDate,
//TradeInstruction = source.TradeInstruction,
PremiumRate = source.PremiumRate,
UnderlyingAssetName = source.UnderlyingAssetName,
ContractVersion = source.ContractVersion,
CheckTradeUpdate = source.CheckTradeUpdate,
CheckStatus = source.CheckStatus,
StructureType = source.StructureType,
IsGroup = source.IsGroup,
ApprovalRules = proce.ruleType
};
return query;
}
private IQueryable<TradeLinq> GetTradeLinqQuery(Expression<Func<trade, bool>> predicate, IQueryable<approvalprocess> approvalprocessQuery, int tradeOpenProcessOrder, int node, int branchOrder, List<int?> nodeArr, int closeProcessOrder = 0)
{
var tradeStatus = new string[] { "平仓待复核", "行权待复核", "互换待复核" };
var query = from source in db.trade.Where(predicate)
join process in approvalprocessQuery on source.ProcessOrderId equals process.order into pro
from proce in pro.DefaultIfEmpty()
where (source.ProcessOrderBranch == node && nodeArr.Contains(proce.node)) || (tradeStatus.Contains(source.TradeStatus) && valuedateBLL.SystemDate.CloseReApprove == 0)
select new TradeLinq
{
id = source.id,
TradeSinglePrice = source.TradeSinglePrice,
GroupId = source.GroupId,
GroupName = source.GroupName,
NumOfSmoothingDays = source.NumOfSmoothingDays,
ParentTradeId = source.ParentTradeId,
TradeCloseVolatility = source.TradeCloseVolatility,
TradeOpenVolatility = source.TradeOpenVolatility,
UnWindDate = source.UnWindDate,
UnWindNotional = source.UnWindNotional,
SpotPrice = source.SpotPrice,
IsMoneynessOption = source.IsMoneynessOption,
TradeAmount = source.TradeAmount,
TradeUnit = source.TradeUnit,
StockEqvNotional = source.StockEqvNotional,
VolType = source.VolType,
UnderlyingInstrumentType = source.UnderlyingInstrumentType,
ExerciseDate = source.ExerciseDate,
TradeType = source.TradeType,
TraderName = source.TraderName,
TraderId = source.TraderId,
Vol = source.Vol,
Strike = source.Strike,
UnderlyingId = source.UnderlyingId,
AssetBookName = source.AssetBookName,
AssetId = source.AssetId,
Notional = source.Notional,
OptionType = source.OptionType,
PricingModel = source.PricingModel,
ExerciseMode = source.ExerciseMode,
NoRiskRate = source.NoRiskRate,
TradeNumber = source.TradeNumber,
ClientId = source.ClientId,
ClientName = source.ClientName,
UnderlyingCode = source.UnderlyingCode,
UnderlyingAssetClass = source.UnderlyingAssetClass,
TradeDate = source.TradeDate,
BuySell = source.BuySell,
StartDate = source.StartDate,
MaturityDate = source.MaturityDate,
TradePrice = source.TradePrice,
TradeStatus = source.TradeStatus,
OptId = source.OptId,
OptName = source.OptName,
OptDate = source.OptDate,
ProcessStatus = source.ProcessStatus == "审批中" ? source.ProcessStatus + " 流程" + (branchOrder != 0 && source.ProcessOrderId > branchOrder ? source.ProcessOrderId - 2 : source.ProcessOrderId - 1) + "/" + (source.TradeStatus == "平仓待复核" || source.TradeStatus == "行权待复核" || source.TradeStatus == "互换待复核" ? (closeProcessOrder > 0 ? closeProcessOrder : tradeOpenProcessOrder) : tradeOpenProcessOrder) : source.ProcessStatus,
ProcessOrderId = source.ProcessOrderId,
ProcessOrderBranch = source.ProcessOrderBranch,
ProcessRoleId = proce.roleId,
ProcessOptDate = source.ProcessOptDate,
ProcessRoleName = "",
ValidState = source.ValidState,
Comments = source.Comments,
SentMailCount = source.SentMailCount,
PremiumPayDate = source.PremiumPayDate,
//TradeInstruction = source.TradeInstruction,
PremiumRate = source.PremiumRate,
UnderlyingAssetName = source.UnderlyingAssetName,
ContractVersion = source.ContractVersion,
CheckTradeUpdate = source.CheckTradeUpdate,
CheckStatus = source.CheckStatus,
StructureType = source.StructureType,
IsGroup = source.IsGroup,
ApprovalRules = proce.ruleType
};
return query;
}
#endregion
}
}