using YLErp.BLL; using YLErp.DBModels.Consts; using YLErp.Model; using YLErp.Models; using YLErp.Modules.TradeDalModule; using YLErp.Plugins.TradeDocGenerator.Abstracts; namespace YLErp.Modules.TradeModule.DocGenerateModule { /// /// 根据传入的TradeCashIds生成文档,不检查TradeCash状态 /// public class RDBatchEndBillGenerateService : BatchUnwindReportGenerateService { public RDBatchEndBillGenerateService(OptUserInfo userInfo) : base(userInfo) { } public IEnumerable Generate(IEnumerable tradeCashIds, IEnumerable tradeIds, string docType, int userId, string userName, DateTime? startDate = null, DateTime? endDate = null) { if (tradeCashIds != null && tradeCashIds.Any()) { tradeIds = DbContext.trade_cash.Where(x => tradeCashIds.Contains(x.id) && !x.IsDeleted).Select(x => x.TradeId).Distinct(); } if (tradeIds == null) { throw new ArgumentNullException(nameof(tradeIds)); } if (docType == null) { throw new ArgumentNullException(nameof(docType)); } var valueDate = valuedateBLL.ValueDate; var tradeCashStatus = new string[] { ClientCashInCashOut.系统操作_行权费, ClientCashInCashOut.系统操作_平仓费, ClientCashInCashOut.系统操作_互换, ClientCashInCashOut.系统操作_票息 }; //---------------------------------- // 获取当日行权 平仓 到期的有效交易 //---------------------------------- TradeDalService service = new TradeDalService(this); var allTrade = service .GetTradeOrEodTrade(tradeIds, valueDate) .Where(O => (O.UnWindDate <= valueDate || O.UnWindDate == null) && O.ClientId != 0).ToList(); if (!allTrade.Any()) { throw new ServiceException("当日没有要结算的记录信息!"); } var tradeList = allTrade/*.Where(O => O.ParentTradeId == 0)*/; tradeIds = allTrade.Select(O => O.id).ToArray(); //var parentTradeIds = allTrade.Where(O => O.ParentTradeId != 0).Distinct().ToDictionary(K => K.id, V => V.ParentTradeId); //var parentTrades = service // .GetTradeOrEodTrade(parentTradeIds.Values, valueDate) // .Where(O => // O.UnWindDate <= valueDate // && O.ClientId != 0); var tradeDic = tradeList./*Concat(parentTrades).*/ToDictionary(n => n.id, n => new trade_contract_group { trade = n }); //---------------------------------- // 交易确认书数据 //---------------------------------- var tcrQuery = from aa in DbContext.trade_contract_r where (tradeIds.Contains(aa.TradeId) && aa.IsValid //|| parentTradeIds.Values.Contains(aa.TradeId) ) && aa.Type == ContractTypeEnum.Trade select aa; var tcrDatas = tcrQuery.ToDictionary(K => K.TradeId, V => V); foreach (var data in tradeDic) { int id = data.Key; if (data.Value.trade.ParentTradeId != 0) { id = data.Value.trade.ParentTradeId; } if (tcrDatas.TryGetValue(id, out var tcr)) { data.Value.ConfirmContractR = tcr; } } //---------------------------------- // 找到TradeCashId对应的TradeCash //---------------------------------- var cashQuery = from tradeCash in DbContext.trade_cash where tradeCashIds.Contains(tradeCash.id) && tradeCash.ValidState != ConsGlobal.InValid && !tradeCash.IsDeleted && tradeCashStatus.Contains(tradeCash.Action) select tradeCash; //var cashDatas = cashQuery.GroupBy(O => O.TradeId).ToDictionary(K => K.Key, V => V); List tradelist = new List(); foreach (var data in cashQuery) { trade t = tradeDic[data.TradeId].trade.Clone(); t.trade_cash = data; tradelist.Add(t); } var resultList = new List(); AppManager.TryResolve(out ITradeUnwindReportGenerator generatorV2); if (generatorV2 != null) { var result = base.GenerateSingleV2(generatorV2, tradelist, tradeCashIds, docType, startDate, endDate); resultList.Add(result); } else { foreach (var item in tradeDic) { resultList.Add(base.GenerateSingleV1(item.Value, OptUser.UserId, OptUser.UserName, docType)); } } return resultList; } } }