using System.ComponentModel.DataAnnotations.Schema;
using YLErp.BLL;
using YLErp.DBModels.Enums;
using YLErp.Modules.ExcelAddinModule.Model;
namespace YLErp.Modules.ExcelAddinModule.Service
{
public class TradeQueryService : YLBaseService
{
///
/// 分隔符
///
private readonly char[] separator = ",".ToArray();
///
/// 无效日期
///
private readonly DateTime InValidDate = DateTime.Now.AddYears(-10);
public TradeQueryService(OptUserInfo userInfo) : base(userInfo)
{
}
private bool SplitParame(string str, out string[] arr)
{
bool result = false;
arr = null;
if (!string.IsNullOrWhiteSpace(str))
{
arr = str.Split(separator, StringSplitOptions.RemoveEmptyEntries);
result = arr.Length > 0;
}
return result;
}
public List SearchTradeList(TradeQueryReq req)
{
List results = null;
try
{
var query = from source in DbContext.trade where source.ValidState != "InValid" select source;
string[] payoffTypeArr = null, strikeTypeArr = null;
if (req.AveragingPeriodStartDateStart > InValidDate ||
req.AveragingPeriodStartDateEnd > InValidDate ||
SplitParame(req.PayoffTypeStr, out payoffTypeArr) ||
SplitParame(req.StrikeTypeStr, out strikeTypeArr))
{
var queryEx = from source in query join ex in DbContext.trade_asian_option on source.id equals ex.TradeId select new { source, ex };
if (req.AveragingPeriodStartDateStart > InValidDate)
{
queryEx = queryEx.Where(O => O.ex.AveragingPeriodStartDate >= req.AveragingPeriodStartDateStart);
}
if (req.AveragingPeriodStartDateEnd > InValidDate)
{
queryEx = queryEx.Where(O => O.ex.AveragingPeriodStartDate <= req.AveragingPeriodStartDateEnd);
}
if (payoffTypeArr?.Length > 0)
{
queryEx = queryEx.Where(O => payoffTypeArr.Contains(O.ex.PayoffType));
}
if (strikeTypeArr?.Length > 0)
{
queryEx = queryEx.Where(O => strikeTypeArr.Contains(O.ex.StrikeType));
}
query = queryEx.Select(O => O.source);
}
if (req.TradeDateStart > InValidDate)
{
query = query.Where(O => O.TradeDate >= req.TradeDateStart);
}
if (req.TradeDateEnd > InValidDate)
{
query = query.Where(O => O.TradeDate <= req.TradeDateEnd);
}
if (SplitParame(req.TradeTypes, out var tradeTypeArr))
{
query = query.Where(O => tradeTypeArr.Contains(O.TradeType));
}
if (req.ExerciseDateStart > InValidDate)
{
query = query.Where(O => O.ExerciseDate >= req.ExerciseDateStart);
}
if (req.ExerciseDateEnd > InValidDate)
{
query = query.Where(O => O.ExerciseDate <= req.ExerciseDateEnd);
}
if (SplitParame(req.TradeStatusStr, out var tradeStatusArr))
{
query = query.Where(O => tradeStatusArr.Contains(O.TradeStatus));
}
if (SplitParame(req.AssetBookNameStr, out var assetBookNameArr))
{
query = query.Where(O => assetBookNameArr.Contains(O.AssetBookName));
}
if (SplitParame(req.TradeNumberStr, out var tradeNumberArr))
{
query = query.Where(O => tradeNumberArr.Contains(O.TradeNumber));
}
if (SplitParame(req.UnderlyingCodeStr, out var underlyingCodeArr))
{
query = query.Where(O => underlyingCodeArr.Contains(O.UnderlyingCode));
}
if (SplitParame(req.BuySellStr, out var buySellArr))
{
query = query.Where(O => buySellArr.Contains(O.BuySell));
}
if (SplitParame(req.OptionTypeStr, out var optionTypeArr))
{
query = query.Where(O => optionTypeArr.Contains(O.OptionType));
}
if (SplitParame(req.ExerciseModeStr, out var exerciseModeArr))
{
query = query.Where(O => exerciseModeArr.Contains(O.ExerciseMode));
}
if (SplitParame(req.ClientNameStr, out var clientNameArr))
{
query = query.Where(O => clientNameArr.Contains(O.ClientName));
}
if (SplitParame(req.TraderNameStr, out var traderNameArr))
{
query = query.Where(O => traderNameArr.Contains(O.TraderName));
}
if (req.StartDateStart > InValidDate)
{
query = query.Where(O => O.StartDate >= req.StartDateStart);
}
if (req.StartDateEnd > InValidDate)
{
query = query.Where(O => O.StartDate <= req.StartDateEnd);
}
results = query.ToList();
tradeBLL.SetFieldsByTradeType(results);
}
catch (Exception ex)
{
LogFactory.GetLogger().Error(ex);
throw;
}
return results ?? new List();
}
public List SearchExchangeTradeList(TradeQueryReq req)
{
try
{
var query = from source in DbContext.ExchangeTrade
join book in DbContext.assetunit on source.AssetBookId equals book.id
join underlying in DbContext.underlying_manager on source.UnderlyingId equals underlying.id
where source.IsValid
select new InnerExchangeTradeDto
{
id = source.id,
AssetBookName = book.Name,
AssetId = source.AssetBookId,
BuySell = source.TradeSide,
OptionType = source.OptionType,
Comments = source.Comments,
Commission = source.Commission,
CommissionType = source.CommissionType,
CreateDate = source.CreateTime,
ExchangeAccountCode = source.ExchangeAccountCode,
ExchangeAccountId = source.ExchangeAccountId,
ExchangeOptionCode = source.OptionCode,
ExerciseMode = source.ExerciseMode,
ExerciseDate = source.MaturityDate,
Lots = source.TradeLots,
Notional = source.Notional,
OptDate = source.OptDate,
OptId = source.OptId ?? 0,
OptName = source.OptName,
OriginalNotional = source.Notional,
SpotPrice = source.TradeSinglePrice,
TradeSinglePrice = source.TradeSinglePrice,
StartDate = source.TradeDate,
TradeNumber = source.TradeNumber,
TradeDate = source.TradeDate,
Strike = source.OptionStrike,
TradeAmount = source.TradeAmount,
TradePrice = source.TradeSinglePrice * source.Notional,
TradeType = source.TradeType,
UnderlyingAssetClass = underlying.UnderlyingType,
UnderlyingAssetName = underlying.UnderlyingName,
UnderlyingCode = source.UnderlyingCode,
UnderlyingId = source.UnderlyingId,
};
if (req.TradeDateStart > InValidDate)
{
query = query.Where(O => O.TradeDate >= req.TradeDateStart);
}
if (req.TradeDateEnd > InValidDate)
{
query = query.Where(O => O.TradeDate <= req.TradeDateEnd);
}
if (SplitParame(req.TradeTypes, out var tradeTypeArr))
{
query = query.Where(O => tradeTypeArr.Contains(O.TradeType));
}
if (req.ExerciseDateStart > InValidDate)
{
query = query.Where(O => O.ExerciseDate >= req.ExerciseDateStart);
}
if (req.ExerciseDateEnd > InValidDate)
{
query = query.Where(O => O.ExerciseDate <= req.ExerciseDateEnd);
}
if (SplitParame(req.AssetBookNameStr, out var assetBookNameArr))
{
query = query.Where(O => assetBookNameArr.Contains(O.AssetBookName));
}
if (SplitParame(req.TradeNumberStr, out var tradeNumberArr))
{
query = query.Where(O => tradeNumberArr.Contains(O.TradeNumber));
}
if (SplitParame(req.UnderlyingCodeStr, out var underlyingCodeArr))
{
query = query.Where(O => underlyingCodeArr.Contains(O.UnderlyingCode));
}
if (SplitParame(req.BuySellStr, out var buySellArr))
{
query = query.Where(O => buySellArr.Contains(O.BuySell));
}
if (SplitParame(req.OptionTypeStr, out var optionTypeArr))
{
query = query.Where(O => optionTypeArr.Contains(O.OptionType));
}
if (SplitParame(req.ExerciseModeStr, out var exerciseModeArr))
{
query = query.Where(O => exerciseModeArr.Contains(O.ExerciseMode));
}
if (req.StartDateStart > InValidDate)
{
query = query.Where(O => O.StartDate >= req.StartDateStart);
}
if (req.StartDateEnd > InValidDate)
{
query = query.Where(O => O.StartDate <= req.StartDateEnd);
}
if (SplitParame(req.ExchangeOptionCodeStr, out var exchangeOptionCodeArr))
{
query = query.Where(O => exchangeOptionCodeArr.Contains(O.ExchangeOptionCode));
}
return query.ToList().Select(O =>
{
var td = new InnerTradeDto();
YLAutoMapper.Map(O, td);
td.ExchangeAccountId = O.ExchangeAccountId;
td.ExchangeAccountCode = O.ExchangeAccountCode;
td.Commission = O.Commission;
td.CommissionType = O.CommissionType;
return (trade)td;
}).ToList();
}
catch (Exception ex)
{
LogFactory.GetLogger().Error(ex);
throw;
}
}
class InnerExchangeTradeDto : OtcTradeBase
{
private string exchangeAccountCode;
///
/// 对冲账户
///
public int? ExchangeAccountId { get; set; }
///
/// 对冲账户
///
public string ExchangeAccountCode
{
get => exchangeAccountCode;
set => exchangeAccountCode = value ?? "";
}
///
/// 手续费
///
public double? Commission { get; set; }
///
/// 手续费计算方式
///
public CommissionType? CommissionType { get; set; }
}
[NotMapped]
class InnerTradeDto : trade
{
///
/// 对冲账户
///
public int? ExchangeAccountId { get; set; }
///
/// 对冲账户
///
public string ExchangeAccountCode { get; set; }
///
/// 手续费
///
public double? Commission { get; set; }
///
/// 手续费计算方式
///
public CommissionType? CommissionType { get; set; }
}
}
}