using NPOI.SS.Formula.Functions;
using Org.BouncyCastle.Ocsp;
using System.Diagnostics;
using YLErp.DBModels.Consts;
using YLErp.Models;
using YLErp.Plugins.TradeDocGenerator.Abstracts;
namespace YLErp.Modules.TradeModule.DocGenerateModule
{
public class TransactionGenerateService : BatchSettlementBillGenerateService
{
public TransactionGenerateService(OptUserInfo userInfo) : base(userInfo)
{
}
///
/// 生成确认书
///
/// 要生成确认书的客户Id
/// 生成的确认书文件类型
/// 错误信息
/// 生成的确认书文件路径
/// 持仓日期区间-开始日期
/// 持仓日期区间-结束日期
/// 要包含的交易类型
///
public IEnumerable Generate(int[] clientIds, string docType, DateTime startDate, DateTime endDate, string[] TradeTypes, List sealResults)
{
var idquery = from tc in DbContext.trade_cash
join t in DbContext.trade
on tc.TradeId equals t.id
where t.TradeType == "累计期权"
&& t.ValidState != ConsGlobal.InValid
&& ConsTrade.TradeCompleteStatus.Contains(t.TradeStatus)
&& tc.Action != "系统操作-期权费"
&& tc.ValidState != ConsGlobal.InValid
&& tc.IsDeleted != true
group tc by tc.TradeId into g
select new
{
Key = g.Key,
list = g.ToList()
};
var ids = idquery.ToList().Select(x => x.list.OrderByDescending(i => i.ValueDate).FirstOrDefault()).Where(t => t.ValueDate >= startDate
&& t.ValueDate <= endDate).Select(x => x.id).ToList();
var tid2 = DbContext.trade.Where(x => x.TradeType == "累计期权" && x.ValidState != ConsGlobal.InValid && x.TradeDate >= startDate && x.TradeDate <= endDate).Select(x => x.id).ToList();
var tcid2 = DbContext.trade_cash.Where(x => x.Action == "系统操作-期权费" && x.ValidState != ConsGlobal.InValid
&& x.IsDeleted != true && tid2.Contains(x.TradeId)).AsEnumerable().GroupBy(x => x.TradeId).Select(x => x.FirstOrDefault().id).ToList();
var tcid = ids.Union(tcid2);
var query1 = (from tc in DbContext.trade_cash
join t in DbContext.trade
on tc.TradeId equals t.id
where
TradeTypes.Contains(t.TradeType)
&& tcid.Contains(tc.id)
select new { t, tc });
var query2 = (from tc in DbContext.trade_cash
join t in DbContext.trade
on tc.TradeId equals t.id
where
t.ValidState != ConsGlobal.InValid
&& tc.ValidState != ConsGlobal.InValid
&& tc.IsDeleted != true
&& tc.ValueDate >= startDate
&& tc.ValueDate <= endDate
&& TradeTypes.Contains(t.TradeType)
&& t.TradeType != "累计期权"
select new { t, tc });
var dict = query1.Union(query2);
if (sealResults != null && sealResults.Count > 0)
{
var docQuery = from dic in dict
join tcr in (from aa in DbContext.trade_contract_r
where aa.Type == ContractTypeEnum.Clearing && aa.IsValid
select aa) on dic.t.id equals tcr.TradeId into tcr1
from tcr in tcr1.DefaultIfEmpty()
join doc in DbContext.trade_contract_document
on tcr.ContractCode equals doc.Code into tempDoc
from doc in tempDoc.DefaultIfEmpty()
select new
{
t = dic.t,
tc = dic.tc,
doc
};
if (sealResults.Contains(2))
{
docQuery = docQuery.Where(t => sealResults.Contains((int)t.doc.SealResult) || t.doc.SealResult == null);
}
else
{
docQuery = docQuery.Where(t => sealResults.Contains((int)t.doc.SealResult));
}
dict = docQuery.Select(d => new { d.t, d.tc });
}
if (clientIds != null && clientIds.Any())
{
dict = dict.Where(x => clientIds.Contains(x.t.ClientId));
}
var tradelist = dict.ToList();
foreach (var trade in tradelist)
{
if (trade.t != null && trade.tc != null && trade.t.TradeType == "累计期权" && trade.tc.Action != "系统操作-期权费")
{
trade.tc.UnwindNotional = trade.t.OriginalNotional;
var amount = DbContext.trade_cash.Where(x => x.Action != "系统操作-期权费" && x.ValidState != ConsGlobal.InValid
&& x.IsDeleted != true && trade.t.id == x.TradeId).Sum(x => x.Amount);
trade.tc.Amount = amount;
}
}
var list = tradelist.Select(O => { O.t.trade_cash = O.tc.Clone(); return O.t.Clone(); }).GroupBy(O => new { O.trade_cash.ValueDate, O.ClientId })
.ToDictionary(K => K.Key, V => V.ToList());
AppManager.TryResolve(out ITradeSettleBillGenerator generatorV2);
var resultList = new List();
foreach (var item in list)
{
if (generatorV2 != null)
{
var tcIds = item.Value.Select(x => x.trade_cash.id).Distinct().ToList();
var results = base.GenerateSingleV2(generatorV2, item.Value.ToList(), tcIds, docType, startDate, endDate);
resultList.Add(results);
}
else
{
throw new ServiceException("确认书插件不存在");
}
}
return resultList;
}
}
}