using YLErp.DBModels.Consts; using YLErp.Model; using YLErp.Models; using YLErp.Modules.TradeDalModule; using YLErp.Plugins.TradeDocGenerator.Abstracts; namespace YLErp.Modules.TradeModule.DocGenerateModule { /// /// 生成追保通知书 /// public class MarginReportGenerateService : YLBaseService { public MarginReportGenerateService(OptUserInfo userInfo) : base(userInfo) { } /// /// 生成追保通知书 /// public IEnumerable Generate(IEnumerable tradeIds, DateTime? valueDate, string docType) { if (tradeIds == null) { throw new ArgumentNullException(nameof(tradeIds)); } if (valueDate == null) { throw new ArgumentNullException(nameof(valueDate)); } if (docType == null) { throw new ArgumentNullException(nameof(docType)); } //---------------------------------- // 获取有效交易 //---------------------------------- //var tradeQuery = from trade in Table // where tradeIds.Contains(trade.id) && trade.ValidState != "InValid" // select trade; var tradeQuery = new TradeDalService(this).GetTradeOrEodTrade(tradeIds, SystemValueDate); var tradeDic = tradeQuery.ToDictionary(n => n.id, n => new trade_contract_group { trade = n }); tradeIds = tradeDic.Keys.ToArray(); if (tradeDic.Count < 1) { throw new ServiceException("当日没有要结算的记录信息!"); } //---------------------------------- // 交易确认书数据 //---------------------------------- var tcrQuery = from aa in DbContext.trade_contract_r where tradeIds.Contains(aa.TradeId) && aa.Type == ContractTypeEnum.Trade && aa.IsValid select aa; var tcrDatas = tcrQuery.ToArray(); foreach (var data in tcrDatas) { if (tradeDic.TryGetValue(data.TradeId, out var group)) { group.ConfirmContractR = data; } } //---------------------------------- // 交易预付金记录 //---------------------------------- var tradeSpanQuery = from tradeSpan in DbContext.trade_span where tradeIds.Contains(tradeSpan.TradeId) && tradeSpan.ValueDate == valueDate select tradeSpan; var tradeSpans = tradeSpanQuery.ToArray(); foreach (var data in tradeSpans) { if (tradeDic.TryGetValue(data.TradeId, out var group)) { group.trade_span = data; } } //---------------------------------- // 生成追保通知书 //---------------------------------- var resultList = new List(); AppManager.TryResolve(out ITradeMarginReportGenerator generator); foreach (var tradeContractGroup in tradeDic.Values) { if (generator == null) { resultList.Add(new TradeDocGenerateResult(tradeContractGroup.trade) { ErrorMessage = "此类型报告尚未实现" }); } else if (!YLErp.PS.Config.Is光大光子 && tradeContractGroup.ConfirmContractR == null) { resultList.Add(new TradeDocGenerateResult(tradeContractGroup.trade) { ErrorMessage = "缺少交易确认书" }); } else { var result = GenerateSingle(generator, tradeContractGroup, tradeContractGroup.trade_cash.id, docType); resultList.Add(result); } } return resultList; } /// /// /// private TradeDocGenerateResult GenerateSingle(ITradeMarginReportGenerator generator, trade_contract_group tradeContractGroup, int tradeCashId, string docType = "DOCX") { try { var context = new MarginReportGenerateContext( tradeCashId, tradeContractGroup.trade, tradeContractGroup.trade_span, ContractTypeEnum.Margin, OptUser); generator.Initialize(docType, context); return generator.GenerateDocument(); } catch (Exception ex) { LogFactory.GetLogger("MarginReportGenerateService").Error(ex); return new TradeDocGenerateResult(tradeContractGroup.trade) { Exception = ex, ErrorMessage = "出错:" + ex.Message }; } } } }