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; } } }