/// <summary> /// Возвращает маппинг Statement на PersonErp /// </summary> /// <param name="batch"> /// The batch. /// </param> /// <param name="statement"> /// The statement. /// </param> /// <returns> /// The <see cref="PersonErp"/>. /// </returns> public PersonErp GetPersonErp(Batch batch, Statement statement) { var personErp = new PersonErp { BeginPacket = GetBhs(batch.Id, statement), Adt_A01 = new List <ADT_A01>(), EndPacket = GetBts(statement.MedicalInsurances.Count) }; var session = ObjectFactory.GetInstance <ISessionFactory>().GetCurrentSession(); var conceptManager = ObjectFactory.GetInstance <IConceptCacheManager>(); foreach (var insurance in statement.MedicalInsurances) { // Создаем сообщение var message = new Message(); message.Batch = batch; message.Type = conceptManager.GetById(model.srz.concepts.TransactionCode.A08); message.Reason = GetReason(statement); message.IsCommit = false; message.IsError = false; session.Save(message); // Связка var messageStatement = new MessageStatement(); messageStatement.Message = message; messageStatement.Statement = statement; messageStatement.Type = conceptManager.GetById(MessageStatementType.MainStatement); messageStatement.Version = statement.Version; session.Save(messageStatement); personErp.Adt_A01.Add(GetAdtA01(statement, insurance, message)); } return(personErp); }
/// <summary> /// Обработка /// </summary> /// <param name="file"> /// Путь к файлу загрузки /// </param> /// <param name="context"> /// The context. /// </param> /// <returns> /// был ли обработан пакет /// </returns> public override bool Processing(FileInfo file, IJobExecutionContext context) { var logger = LogManager.GetCurrentClassLogger(); // Попытка десериализации файла var personErp = new PersonErp(); try { // Десериализация personErp = XmlSerializationHelper.Deserialize(file.FullName, personErp) as PersonErp; } catch (Exception ex) { // Ошибка десериализации либо создания бачта logger.Error(ex.Message, ex); throw; } // Получаем идентификатор батча var batchId = Guid.Empty; if (personErp != null && personErp.BeginPacket != null) { Guid.TryParse(personErp.BeginPacket.Identificator, out batchId); } if (batchId == Guid.Empty) { logger.Error("Не верный идентификатор пакета. Имя файла: " + file.FullName); return(false); } var session = ObjectFactory.GetInstance <ISessionFactory>().GetCurrentSession(); if (personErp == null || personErp.AckList == null) { return(false); } // Парсим ошибки ФЛК от шлюза foreach (var ack in personErp.AckList) { var messageId = Guid.Empty; Guid.TryParse(ack.Msa.ReferenceIdentificator, out messageId); // Получаем ссылку на заявление var statement = session.QueryOver <Statement>() .JoinQueryOver <MessageStatement>(s => s.MessageStatements) .Where(ms => ms.Message.Id == messageId) .List() .FirstOrDefault(); if (statement == null) { logger.Error("Отсутствует заявление"); return(false); } // Удаляем предыдущие ошибки var oldErrors = session.QueryOver <Error>() .Where(x => x.Statement.Id == statement.Id && x.Application.Id == ExchangeSubjectType.Erz) .List(); foreach (var oldError in oldErrors) { session.Delete(oldError); } session.Flush(); // Пишем ошибки в Errors var wasError = false; foreach (var uprErr in personErp.AckList.FirstOrDefault().ErrList) { // Пропускаем предупреждения if (uprErr.LevelSeriously != "E") { continue; } // Создаем запись в БД var error = new Error(); error.Statement = statement; error.Application = ObjectFactory.GetInstance <IConceptCacheManager>().GetById(ExchangeSubjectType.Erz); error.Code = uprErr.ErrorCodeApp.MessageCode; error.Message1 = uprErr.ErrorCodeApp.MessageDescription; error.Repl = "Ошибки ФЛК шлюза РС"; session.Save(error); // Взводим флаг ошибки wasError = true; } if (wasError) { // Меняем статус заявления на отклонено statement.Status = ObjectFactory.GetInstance <IConceptCacheManager>().GetById(StatusStatement.Cancelled); session.Save(statement); // Пишем ошибку в сообщение var message = ObjectFactory.GetInstance <IMessageManager>().GetById(messageId); if (message != null) { message.IsError = true; session.Save(message); } } // Чистим сессию session.Flush(); } return(true); }
/// <summary> /// Сериализация наследников PersonErp /// </summary> /// <param name="person"> /// Объект пакета /// </param> /// <param name="fileName"> /// Имя файла /// </param> public static void SerializePersonErp(PersonErp person, string fileName) { SerializeBasePersonTemplate(person, fileName, "UPRMessageBatch"); }