Files
zszq-trs/YLErpDAL/Modules/TradeModule/ApiModule/TradeDetailQueryApiV2Service.cs
T
2024-05-09 14:06:26 +08:00

237 lines
8.9 KiB
C#

using System.Data;
using System.Linq.Expressions;
namespace YLErp.Modules.TradeModule.ApiModule
{
/// <summary>
/// api/v2/tradeDetailList
/// </summary>
public class TradeDetailQueryApiV2Service : YLBaseService
{
public TradeDetailQueryApiV2Service(OptUserInfo userInfo) : base(userInfo)
{
}
public TradeDetailQueryApiV2Service(YLBaseService baseService) : base(baseService)
{
}
/// <summary>
///
/// </summary>
public IEnumerable<TradeDetailQueryApiV2Result> GetList(TradeDetailQueryApiV2Request queryModel)
{
if (queryModel.OptDate == DateTime.MinValue)
{
throw new ServiceException("操作时间 必须填写");
}
var noneCashStatus = new[] { "新增待确认, 修改待确认, 审批中, 已拒绝, 平仓待复核, 行权待复核, 互换待复核, 提前终止拒绝" };
CreateTradePredicate(queryModel, out var noneCashPredicate, out var hasCashPredicate);
List<InnerDto> tempList = new List<InnerDto>();
DbContext.SetDebugLog();
if (noneCashPredicate != null)
{
var list = DbContext.trade.Where(noneCashPredicate)
.OrderBy(n => n.OptDate)
.Select(n => new InnerDto
{
td = n,
OptDate = n.OptDate
}).ToPagedList(new PagedQueryModel { GetTotal = false, PageSize = 10000 });
tempList.AddRange(list.Items);
}
if (hasCashPredicate != null)
{
var query = from tc in DbContext.trade_cash
join t in DbContext.trade.Where(hasCashPredicate) on tc.TradeId equals t.id
where tc.OptDate.Value > queryModel.OptDate && !tc.IsDeleted
&& tc.ValidState != ConsGlobal.InValid
orderby tc.OptDate.Value
select new InnerDto
{
td = t,
tc = tc.Action == "系统操作-期权费" ? null : new TradeCloseInfo
{
TcAction = tc.Action,
TcAmount = tc.Amount,
TcFinalPrice = tc.FinalPrice,
TcNotional = tc.Notional,
TcTradeAmount = tc.TradeAmount,
TcUnwindNotional = tc.UnwindNotional,
TcUnwindPercent = tc.UnwindPercentRate,
TcUnwindPrice = tc.UnwindPrice,
TcUnwindPricePercent = tc.UnwindPricePercentRate,
TcUnwindTradeAmount = tc.UnwindTradeAmount,
TcValueDate = tc.ValueDate,
TradeNumber = null,
TcTradePrice = 0,
WinLoss = 0
},
OptDate = tc.OptDate
};
var list = query.ToPagedList(new PagedQueryModel { GetTotal = false, PageSize = 10000 });
tempList.AddRange(list.Items);
}
var resultList = tempList.Select(n =>
{
var otcTrade = new TradeDetailQueryApiV2Result();
YLAutoMapper.Map<OtcTradeBase, OtcTradeBase>(n.td, otcTrade);
otcTrade.Notional = otcTrade.OriginalNotional ?? 0;
otcTrade.StockEqvNotional = otcTrade.OriginalStockEqvNotional ?? 0;
otcTrade.ClientNumber = ClientModule.ClientDataQueryService.GetClient(otcTrade.ClientId)?.Number;
if (n.tc != null)
{
var closeInfo = n.tc;
closeInfo.TradeNumber = n.td.TradeNumber;
closeInfo.TcTradePrice = (otcTrade.TradePrice ?? 0) * (closeInfo.TcUnwindPercent ?? 0) * ((otcTrade.BuySell == "卖出" || otcTrade.TradeType == "远期") ? 1 : -1);
closeInfo.WinLoss = (closeInfo.TcAmount ?? 0) + closeInfo.TcTradePrice;
otcTrade.CloseInfo = closeInfo;
}
otcTrade.OptDate = n.OptDate;
return otcTrade;
}).ToArray();
new TradeExtendService(this).SetTradeExtend(resultList, true);
return resultList;
}
/// <summary>
/// 根据查询参数拼接查询条件
/// </summary>
protected void CreateTradePredicate(TradeDetailQueryApiV2Request queryModel
, out Expression<Func<trade, bool>> noneCashPredicate
, out Expression<Func<trade, bool>> hasCashPredicate)
{
noneCashPredicate = hasCashPredicate = null;
var predicate = PredicateBuilder.Create<trade>(t => t.ValidState != ConsGlobal.InValid);
if (queryModel.IncludeGroupMain)
{
predicate = predicate.And(n => n.TradeType != "结构化交易" || n.IsGroup == 1);
}
else
{
predicate = predicate.And(n => n.TradeType != "结构化交易");
}
// 结构类型
if (queryModel.StructureTypes.HasNonEmptyItem())
{
predicate = predicate.And(d => queryModel.StructureTypes.Contains(d.TradeType)
|| queryModel.StructureTypes.Contains(d.StructureType));
}
//客户 优先使用客户编号
var clientIds = GetClientIdsByNumber(queryModel.ClientNumbers)
?? GetClientIdsByName(queryModel.ClientNames);
if (clientIds != null)
{
predicate = predicate.And(d => clientIds.Contains(d.ClientId));
}
var noneCashStatus = new[] { "新增待确认", "修改待确认", "审批中", "已拒绝", "平仓待复核", "行权待复核", "互换待复核", "提前终止拒绝" };
//交易状态:确认成交、新增待确认、已平仓、已到期。。。等等
if (queryModel.TradeStatus != null && queryModel.TradeStatus.Any())
{
noneCashStatus = noneCashStatus.Intersect(queryModel.TradeStatus).ToArray();
if (noneCashStatus.Any())
{
noneCashPredicate = predicate.And(d => noneCashStatus.Contains(d.TradeStatus));
}
var hasCashStatus = queryModel.TradeStatus.Except(noneCashStatus).ToArray();
if (hasCashStatus.Any())
{
hasCashPredicate = predicate.And(d => hasCashStatus.Contains(d.TradeStatus));
}
}
else
{
hasCashPredicate = predicate;
noneCashPredicate = predicate.And(d => noneCashStatus.Contains(d.TradeStatus));
}
if (noneCashPredicate != null)
{
noneCashPredicate = noneCashPredicate.And(n => n.OptDate.Value > queryModel.OptDate);
}
}
#region 先转换成id再构建查询条件
/// <summary>
/// 根据交易对手方编号返回交易对手方ID
/// </summary>
/// <param name="clientNumbers">交易对手方编号</param>
private List<int> GetClientIdsByNumber(IEnumerable<string> clientNumbers)
{
if (!clientNumbers.HasNonEmptyItem())
{
return null;
}
using (var clientDbContext = DbContextFactory.GetClientDbContext(OptUser))
{
return clientDbContext.client.Where(x => clientNumbers.Contains(x.Number)).Select(x => x.id).ToList();
}
}
/// <summary>
/// 根据客户名称返回客户ID
/// </summary>
private List<int> GetClientIdsByName(IEnumerable<string> clientNames)
{
if (!clientNames.HasNonEmptyItem())
{
return null;
}
using (var clientDbContext = DbContextFactory.GetClientDbContext(OptUser))
{
return clientDbContext.client.Where(x => clientNames.Contains(x.Name)).Select(x => x.id).ToList();
}
}
#endregion
class InnerDto
{
public trade td { get; set; }
public TradeCloseInfo tc { get; set; }
public DateTime? OptDate { get; set; }
}
}
/// <summary>
/// api/v2/tradeDetailList
/// </summary>
public class TradeDetailQueryApiV2Result : OtcOptionTradeFull
{
public TradeCloseInfo CloseInfo { get; set; }
}
}