/// <summary> /// Создание отказов для логов. /// </summary> /// <param name="session">Сессия Nhibernate</param> /// <param name="log">Лог, о получении документа</param> /// <param name="metaForRedmineErrorIssueList"></param> private static void ProcessReject(ISession session, DocumentReceiveLog log, List <MetadataOfLog> metaForRedmineErrorIssueList) { RejectHeader reject; //если есть назначенные поставщику правила разбора var parsers = session.Query <RejectDataParser>().Where(x => x.Supplier.Id == log.Supplier.Id).ToList(); //попытка распарсить ими reject = RejectDataParser.Parse(log, parsers); //иначе, выбор из имеющихся парсеров if (reject == null) { var parser = GetRejectParser(log); if (parser == null) { if (log.DocumentType == DocType.Reject) { //создаем задачу на Redmine, прикрепляя файлы Redmine.CreateIssueForLog(ref metaForRedmineErrorIssueList, log); } return; } reject = parser.CreateReject(log); if (reject == null) { if (log.DocumentType == DocType.Reject) { //создаем задачу на Redmine, прикрепляя файлы Redmine.CreateIssueForLog(ref metaForRedmineErrorIssueList, log); } return; } } if (reject.Lines.Count > 0) { try { reject.Normalize(session); } catch (Exception e) { _log.Error(string.Format("Не удалось идентифицировать товары отказа {0}", log.GetFileName()), e); } session.Save(reject); } }
private IEnumerable <Document> ParseWaybills(List <DocumentReceiveLog> logs) { var metaForRedmineErrorIssueList = new List <MetadataOfLog>(); var rejects = logs.Where(l => l.DocumentType == DocType.Reject).ToArray(); foreach (var reject in rejects) { if (WaybillExcludeFile(reject)) { continue; } try { SessionHelper.WithSession(s => ProcessReject(s, reject, metaForRedmineErrorIssueList)); } catch (Exception e) { _log.Error(string.Format("Не удалось разобрать отказ {0}", reject.FileName), e); //создаем задачу на Redmine, прикрепляя файлы Redmine.CreateIssueForLog(ref metaForRedmineErrorIssueList, reject); } } var docsForParsing = MultifileDocument.Merge(logs); var docs = docsForParsing.Select(d => { try { if (WaybillExcludeFile(d.DocumentLog)) { return(null); } var docToReturn = ProcessWaybill(d.DocumentLog, d.FileName); //если не получилось распарсить документ if (docToReturn == null && d.DocumentLog?.DocumentType == DocType.Waybill) { //создаем задачу на Redmine, прикрепляя файлы Redmine.CreateIssueForLog(ref metaForRedmineErrorIssueList, d.DocumentLog); } return(docToReturn); } catch (Exception e) { var filename = d.FileName; var errorTitle = string.Format("Не удалось разобрать накладную {0}", filename); _log.Error(errorTitle, e); SaveWaybill(filename); if (d.DocumentLog?.DocumentType == DocType.Waybill) { //создаем задачу на Redmine, прикрепляя файлы Redmine.CreateIssueForLog(ref metaForRedmineErrorIssueList, d.DocumentLog); } return(null); } }).Where(d => d != null).ToList(); MultifileDocument.DeleteMergedFiles(docsForParsing); docs.Each(d => { if (d.Log.IsFake) { d.Log.Save(); } d.Save(); d.CreateCertificateTasks(); }); return(docs); }