3476 lines
177 KiB
C#
3476 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 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
|
|
}
|
|
}
|