3535 lines
180 KiB
C#
3535 lines
180 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";
|
||
|
||
/// <summary>
|
||
/// 保存交易时预付金授信不足:UI 确认后按 剩余授信+现金差额 拆分预付金腿再保存(§2.3 保存前拆单)
|
||
/// </summary>
|
||
public const string MarginCreditSplit = "MarginCreditSplit";
|
||
|
||
public const string RiskWarningConfirm = "RiskWarningConfirm";
|
||
|
||
/// <summary>
|
||
/// 老风控交易特批与新风控需审批同时放行
|
||
/// </summary>
|
||
public const string OldNewRiskConfirm = "OldNewRiskConfirm";
|
||
|
||
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.PosiGrossPrice, sp.UnderlyingCode })
|
||
.ToList();
|
||
var logger = LogFactory.GetLogger<tradeBLL>();
|
||
var posDict = swapPositions.GroupBy(sp => sp.SwapTradeId).ToDictionary(g => g.Key, g => g.First().PosiGrossPrice);
|
||
var umProvider = DataCacheProvider.GetUnderlyingDataSource();
|
||
// 需求②:平仓/行权/互换交易,审批角色应取 CloseProcess 流程的节点角色,而非 TradeProcess
|
||
var closeProcessRoles = db.approvalprocess
|
||
.Where(a => a.processType == "CloseProcess")
|
||
.Select(a => new { a.order, a.roleId })
|
||
.ToList()
|
||
.ToDictionary(a => a.order, a => a.roleId);
|
||
var approvalNodes = db.approvalprocess
|
||
.Select(a => new { a.id, a.processType, a.order, a.node })
|
||
.ToList();
|
||
var oaRecords = db.tradeApprovalOaResult
|
||
.Where(x => swapTradeIds.Contains(x.trade_id) && x.is_valid)
|
||
.Select(x => new { x.id, x.trade_id, x.approval_process_id, x.status, x.oa_msg })
|
||
.ToList();
|
||
|
||
foreach (var tradeLinq in retListResult.rows)
|
||
{
|
||
// 了结类交易:用 CloseProcess 的角色覆盖
|
||
if (tradeLinq.TradeStatus == "平仓待复核" || tradeLinq.TradeStatus == "行权待复核" || tradeLinq.TradeStatus == "互换待复核"
|
||
&& closeProcessRoles.Count > 0)
|
||
{
|
||
if (closeProcessRoles.TryGetValue(tradeLinq.ProcessOrderId, out var closeRoleId))
|
||
{
|
||
tradeLinq.ProcessRoleId = closeRoleId;
|
||
}
|
||
}
|
||
|
||
if (tradeLinq.ProcessRoleId != null && listRoles.TryGetValue(tradeLinq.ProcessRoleId.Value, out var name))
|
||
{
|
||
tradeLinq.ProcessRoleName = name;
|
||
}
|
||
|
||
if (tradeLinq.TradeType == "收益互换")
|
||
{
|
||
var processType = tradeLinq.TradeStatus == "平仓待复核" || tradeLinq.TradeStatus == "行权待复核" || tradeLinq.TradeStatus == "互换待复核"
|
||
? "CloseProcess"
|
||
: "TradeProcess";
|
||
var currentNode = approvalNodes
|
||
.Where(x => x.processType == processType
|
||
&& x.order == tradeLinq.ProcessOrderId
|
||
&& (x.node == tradeLinq.ProcessOrderBranch || x.node == 0))
|
||
.OrderByDescending(x => x.node == tradeLinq.ProcessOrderBranch)
|
||
.FirstOrDefault();
|
||
var oa = currentNode == null ? null : oaRecords
|
||
.Where(x => x.trade_id == tradeLinq.id && x.approval_process_id == currentNode.id)
|
||
.OrderByDescending(x => x.id)
|
||
.FirstOrDefault();
|
||
if (oa != null)
|
||
{
|
||
tradeLinq.OaRemark = string.IsNullOrWhiteSpace(oa.oa_msg)
|
||
? oa.status
|
||
: oa.status + ":" + oa.oa_msg;
|
||
}
|
||
}
|
||
|
||
if (tradeLinq.TradeType == "远期" || tradeLinq.TradeType == "掉期")
|
||
{
|
||
var option = db.trade_forward.FirstOrDefault(x => x.TradeId == tradeLinq.id);
|
||
//远期交易“权利金(成交)” 取“远期开仓费”
|
||
tradeLinq.TradeSinglePrice = option.OpenCommission;
|
||
}
|
||
|
||
// --- 针对收益互换类型,用 swap_position.PosiGrossPrice 覆盖展示用的期初标的价格 ---
|
||
try
|
||
{
|
||
if (tradeLinq.TradeType == "收益互换" && posDict.TryGetValue(tradeLinq.id, out var grossPrice) && grossPrice > 0)
|
||
{
|
||
// 将期初价格覆盖为互换持仓的 PosiGrossPrice(仅使用 PosiDirection != 0 的期初持仓)
|
||
logger.Info($"tradeOpeningProcessQuery.DAL override: tradeId={tradeLinq.id} beforeInitialSpot={tradeLinq.InitialSpotPrice} dbPosi={grossPrice}");
|
||
tradeLinq.InitialSpotPrice = Convert.ToDouble(grossPrice);
|
||
}
|
||
}
|
||
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
|
||
}
|
||
}
|