// <summary> /// Записва ЕИСПП Отговор /// </summary> /// <param name="correlationId">Идентификатор на съобщение</param> /// <param name="htmlCard">Получена карта</param> /// <param name="eisppNumber">ЕИСПП номер на Наказателно Производство</param> private async Task SaveResponse(string correlationId, string response, string eisppNumber) { MQEpep mq = null; try { mq = repo.All <MQEpep>() .FirstOrDefault(m => m.MQId == correlationId); string fileName = $"EISPP_Response_{eisppNumber}_{ DateTime.Today.ToString("dd.MM.yyyy_HH:mm:ss") }.xml"; CdnUploadRequest request = new CdnUploadRequest() { ContentType = System.Net.Mime.MediaTypeNames.Text.Html, FileContentBase64 = Convert.ToBase64String(Encoding.UTF8.GetBytes(response)), FileName = fileName, SourceId = correlationId, //mq.ParentSourceId.ToString(), SourceType = IOWebApplication.Infrastructure.Models.ViewModels.Common.SourceTypeSelectVM.Integration_EISPP_Response, Title = $"ОТГОВОР За Събитие НП: {eisppNumber} към { DateTime.Today.ToString("dd.MM.yyyy") }" }; if (!(await cdnService.MongoCdn_AppendUpdate(request))) { logger.LogError("Error in SaveCard with corelationId: {correlationId}!", correlationId); } } catch (Exception ex) { logger.LogError(ex, "Error in SaveCard with corelationId: {correlationId}!", correlationId);; } SetOk(correlationId, mq); }
private string GenerateXml(MQEpep mq) { string text = string.Empty; var resultCase = FillCaseAll(mq); Transfer result = new Transfer(); result.program = "EISS";// "ЕИСС"; result.version = 1.8088; result.Case = resultCase; XmlSerializerNamespaces ns = new XmlSerializerNamespaces(); ns.Add("", ""); XmlSerializer x = new XmlSerializer(typeof(Transfer)); using (var stream = new MemoryStream()) { using (TextWriter writer = new StreamWriter(stream)) { x.Serialize(writer, result, ns); stream.Position = 0; using (StreamReader reader = new StreamReader(stream)) { text = reader.ReadToEnd(); } } } return(text); }
/// <summary> /// Записва ЕИСПП карта /// </summary> /// <param name="correlationId">Идентификатор на съобщение</param> /// <param name="htmlCard">Получена карта</param> /// <param name="eisppNumber">ЕИСПП номер на Наказателно Производство</param> private async Task SaveCard(string correlationId, string htmlCard, string eisppNumber) { MQEpep mq = null; try { mq = repo.All <MQEpep>() .FirstOrDefault(m => m.MQId == correlationId); string decodedCard = "<!DOCTYPE html>\n" + WebUtility.HtmlDecode(htmlCard); string fileName = $"EISPP_Card_{eisppNumber}_{ DateTime.Today.ToString("dd.MM.yyyy") }.html"; CdnUploadRequest request = new CdnUploadRequest() { ContentType = System.Net.Mime.MediaTypeNames.Text.Html, FileContentBase64 = Convert.ToBase64String(Encoding.UTF8.GetBytes(decodedCard)), FileName = fileName, SourceId = mq.ParentSourceId.ToString(), SourceType = IOWebApplication.Infrastructure.Models.ViewModels.Common.SourceTypeSelectVM.Integration_EISPP_CardNP, Title = $"КАРТА ЗА СЪСТОЯНИЕ НА НП: {eisppNumber} към { DateTime.Today.ToString("dd.MM.yyyy") }" }; if (!(await cdnService.MongoCdn_AppendUpdate(request))) { logger.LogError("Error in SaveCard with corelationId: {correlationId}!", correlationId); } } catch (Exception ex) { logger.LogError(ex, "Error in SaveCard with corelationId: {correlationId}!", correlationId);; } SetOk(correlationId, mq); }
public CaseType FillCaseAll(MQEpep model) { var caseAll = repo.AllReadonly <Case>() .Include(x => x.Document) .Include(x => x.CaseSessions) .ThenInclude(x => x.CaseSessionActs) .ThenInclude(x => x.CaseSessionActComplains) .ThenInclude(x => x.ComplainDocument) .ThenInclude(x => x.DocumentPersons) .Include(x => x.CaseSessions) .ThenInclude(x => x.CaseSessionActs) .ThenInclude(x => x.ActComplainIndex) .Include(x => x.CaseSessions) .ThenInclude(x => x.CaseSessionResults) .Include(x => x.CasePersons) .Include(x => x.CaseLawUnits) .ThenInclude(x => x.LawUnit) .Where(x => x.Id == model.ParentSourceId) .FirstOrDefault(); var compliantDocuments = repo.AllReadonly <Document>() .Include(x => x.DocumentPersons) .Where(x => x.DocumentCaseInfo.Where(a => a.CaseId == caseAll.Id).Any()) .Where(x => x.DocumentGroup.DocumentKindId == DocumentConstants.DocumentKind.CompliantDocument) .ToList(); var migrations = repo.AllReadonly <CaseMigration>() .Include(x => x.OutDocument) .Where(x => x.CaseId == caseAll.Id) .Where(x => x.CaseSessionActId != null) .Where(x => x.OutDocumentId != null) .ToList(); return(FillCase(caseAll, compliantDocuments, migrations)); }
public new void SetErrorToMQ(MQEpep mq, int integrationState, string errorDescription) { mq.ErrorCount = (mq.ErrorCount ?? 0) + 1; mq.IntegrationStateId = integrationState; mq.ErrorDescription = errorDescription; repo.Update(mq); repo.SaveChanges(); }
protected bool RemoveIntegrationKeys(MQEpep mq) { var keys = repo.All <IntegrationKey>() .Where(x => x.IntegrationTypeId == mq.IntegrationTypeId && x.SourceId == mq.SourceId && x.SourceType == mq.SourceType) .ToList(); repo.DeleteRange(keys); return(repo.SaveChanges() > 0); }
private async Task SendSelectionProtokol(MQEpep mq) { try { var model = await initModel((int)mq.SourceId); //HttpRequester http = new HttpRequester(); //http.ValidateServerCertificate = false; //http.CertificatePath = this.CertificatePath; //http.CertificatePassword = this.CertificatePassword; //var response = http.PostAsync(serviceUri.AbsoluteUri, model).Result; var response = await requester.PostAsync(serviceUri.AbsoluteUri, model); if (response.IsSuccessStatusCode) { var content = await response.Content.ReadAsStringAsync(); if (!string.IsNullOrEmpty(content)) { long assignmentId = long.Parse(content); if (assignmentId > 0) { mq.IntegrationStateId = IntegrationStates.TransferOK; mq.DateTransfered = DateTime.Now; mq.ReturnGuidId = assignmentId.ToString(); repo.Update(mq); repo.SaveChanges(); return; } } } else { logger.LogError("CSRDService: Responce code:{code}, Message: {message}, MqID: {id}", response.StatusCode, response.ReasonPhrase, mq.Id); mq.ErrorDescription = "Грешка при извикване на услуга към ЦСРД"; } SetErrorToMQ(mq, IntegrationStates.TransferError); } catch (Exception ex) { logger.LogError(ex, ex.Message); var innerException = ex.InnerException; while (innerException != null) { logger.LogError(innerException.Message); innerException = innerException.InnerException; } mq.ErrorDescription = ex.Message; SetErrorToMQ(mq, IntegrationStates.TransferError); } }
private void AppendTimeElapsed(MQEpep model) { if (!startTime.HasValue) { return; } TimeSpan ts = DateTime.Now - startTime.Value; model.ErrorDescription = $"Elapsed:{ts.TotalSeconds:N3}s; {model.ErrorDescription}"; }
public void UpdateMQ(MQEpep mq, bool result) { if (result) { UpdateMQ(mq, Guid.NewGuid()); } else { UpdateMQ(mq, null); } }
protected override async Task SendMQ(MQEpep mq) { switch (mq.SourceType) { case SourceTypeSelectVM.CaseSessionAct: await SendAct(mq); break; default: break; } }
protected override async Task SendMQ(MQEpep mq) { switch (mq.SourceType) { case SourceTypeSelectVM.CaseSelectionProtokol: await SendSelectionProtokol(mq); break; default: break; } }
public void UpdateMQ(MQEpep mq, Guid?id) { if (id.HasValue) { mq.DateTransfered = DateTime.Now; mq.IntegrationStateId = IntegrationStates.TransferOK; repo.Update(mq); repo.SaveChanges(); } else { SetErrorToMQ(mq, IntegrationStates.TransferError); } }
/// <summary> /// Обновява съдържанието и статуса на ЕИСПП съобщение /// </summary> /// <param name="mq">Обект от опашката</param> /// <param name="message">Сериализиран ЕИСПП пакет</param> private void MarkAsSent(MQEpep mq, string message) { try { mq.DateTransfered = DateTime.Now; mq.IntegrationStateId = EpepConstants.IntegrationStates.WaitingForReply; mq.Content = Encoding.UTF8.GetBytes(message); repo.Update(mq); repo.SaveChanges(); } catch (Exception ex) { logger.LogError(ex, "Error in SetOK with MQId: {MQId}!", mq.Id); } }
private async Task SendAct(MQEpep mq) { try { var actModel = await initModel((int)mq.SourceId); await serviceClient.SendActAsync(actModel); //serviceClient.DeleteAct(actModel); UpdateMQ(mq, true); } catch (Exception ex) { SetErrorToMQ(mq, IntegrationStates.TransferError, ex.Message); } }
/// <summary> /// Записва грешка /// </summary> /// <param name="correlationId">Идентификатора на съобщението</param> /// <param name="exception">Възникнала грешка</param> private void SetError(string correlationId, string exception) { try { MQEpep mq = repo.All <MQEpep>() .FirstOrDefault(m => m.MQId == correlationId); mq.IntegrationStateId = EpepConstants.IntegrationStates.ReplyContainsError; mq.ErrorDescription = exception; repo.SaveChanges(); } catch (Exception ex) { logger.LogError(ex, "Error in SetError with corelationId: {correlationId}, error: {exception}!", correlationId, exception); } }
protected bool AddIntegrationKey(MQEpep mq, Guid?Id) { if (Id.HasValue) { if (AddIntegrationKey(mq.SourceType, mq.SourceId, Id.ToString())) { mq.IntegrationStateId = IntegrationStates.TransferOK; mq.DateTransfered = DateTime.Now; mq.ReturnGuidId = Id.ToString(); AppendTimeElapsed(mq); repo.Update(mq); switch (mq.SourceType) { case SourceTypeSelectVM.EpepUser: var epepUser = repo.GetById <EpepUser>((int)mq.SourceId); epepUser.EpepId = Id; repo.Update(epepUser); break; case SourceTypeSelectVM.EpepUserAssignment: var epepUserAssignment = repo.GetById <EpepUserAssignment>((int)mq.SourceId); epepUserAssignment.EpepId = Id; repo.Update(epepUserAssignment); break; default: break; } repo.SaveChanges(); return(true); } else { return(false); } } else { SetErrorToMQ(mq, IntegrationStates.TransferError); return(false); } }
/// <summary> /// Маркира трансфера като успешен /// </summary> /// <param name="correlationId">Идентификатора на съобщението</param> private void SetOk(string correlationId, MQEpep mq = null) { try { if (mq == null) { mq = repo.All <MQEpep>() .FirstOrDefault(m => m.MQId == correlationId); } mq.IntegrationStateId = IntegrationStates.TransferOK; repo.SaveChanges(); } catch (Exception ex) { logger.LogError(ex, "Error in SetOK with corelationId: {correlationId}!", correlationId); } }
/// <summary> /// Отменя всички неприключили заявки за добавяне/редакция на същия обект по-стари от заявката за изтриване /// </summary> /// <param name="mq"></param> protected void RemoveUnfinishedTasksBeforeDelete(MQEpep mq) { var editItem = repo.All <MQEpep>() .Where(x => x.IntegrationTypeId == mq.IntegrationTypeId && x.SourceId == mq.SourceId && x.SourceType == mq.SourceType) .Where(x => EpepConstants.IntegrationStates.UnfinishedMQStates.Contains(x.IntegrationStateId ?? 0)) .Where(x => EpepConstants.Methods.EditMethods.Contains(x.MethodName)) .Where(x => x.Id < mq.Id) .ToList(); if (editItem.Any()) { foreach (var item in editItem) { item.IntegrationStateId = EpepConstants.IntegrationStates.DisabledByDelete; item.ErrorDescription = $"Отменено поради заявка за изтриване с id={mq.Id}"; repo.Update(item); } repo.SaveChanges(); } }
public void SetErrorToMQ(MQEpep mq, int integrationState, string errorDescription = null) { if (IntegrationStates.ReturnToMQStates.Contains(integrationState)) { if (mq.ErrorCount < IntegrationMaxErrorCount) { mq.ErrorCount = (mq.ErrorCount ?? 0) + 1; } else { integrationState = IntegrationStates.TransferErrorLimitExceeded; } } mq.IntegrationStateId = integrationState; if (!string.IsNullOrEmpty(errorDescription)) { mq.ErrorDescription = errorDescription; } repo.Update(mq); repo.SaveChanges(); }
public async Task TestMQ() { var model = new MQEpep(); model.ParentSourceId = 561; var resultCase = FillCaseAll(model); Transfer result = new Transfer(); result.program = "ЕИСС"; result.version = 1.8088; result.Case = resultCase; XmlSerializerNamespaces ns = new XmlSerializerNamespaces(); ns.Add("", ""); XmlSerializer x = new XmlSerializer(typeof(Transfer)); var stream = new MemoryStream(); TextWriter writer = new StreamWriter(stream); x.Serialize(writer, result, ns); stream.Position = 0; StreamReader reader = new StreamReader(stream); string text = reader.ReadToEnd(); HttpRequester http = new HttpRequester(); var uploadUrl = new Uri(""); //още не работи var response = await http.PostAsync(uploadUrl.AbsoluteUri, text); if (response.IsSuccessStatusCode) { var content = await response.Content.ReadAsStringAsync(); } else { } }
protected virtual async Task SendMQ(MQEpep mq) { }
protected override async Task SendMQ(MQEpep mq) { var result = FillCaseAll(mq); }
protected override async Task SendMQ(MQEpep mq) { string text = mq.Content == null ? "" : Encoding.UTF8.GetString(mq.Content); if (string.IsNullOrEmpty(text)) { using (var scope = new TransactionScope()) { text = GenerateXml(mq); mq.Content = Encoding.UTF8.GetBytes(text); repo.Update(mq); repo.SaveChanges(); scope.Complete(); } } var response = await requester.PostAsyncTextXml(uploadUrl.AbsoluteUri, text); if (response.IsSuccessStatusCode) { var content = await response.Content.ReadAsStringAsync(); XElement result = null; if (!string.IsNullOrEmpty(content)) { XDocument message = XDocument.Parse(content); result = message?.Element("response")?.Element("success"); } else { content = "Получен е празен резултат от ИСПН"; } if (result != null) { mq.IntegrationStateId = IntegrationStates.TransferOK; mq.DateTransfered = DateTime.Now; mq.Content = Encoding.UTF8.GetBytes(text); repo.Update(mq); repo.SaveChanges(); if (caseMq != null) { var mqHash = caseMq.FirstOrDefault(x => x.Id == mq.Id); mqHash.Content = mq.Content; mqHash.IntegrationStateId = mq.IntegrationStateId; } string fileName = $"Ispn_{mq.Id}_{ DateTime.Today:dd.MM.yyyy}.xml"; CdnUploadRequest request = new CdnUploadRequest() { ContentType = System.Net.Mime.MediaTypeNames.Text.Html, FileContentBase64 = Convert.ToBase64String(Encoding.UTF8.GetBytes(content)), FileName = fileName, SourceId = mq.ParentSourceId.ToString(), SourceType = SourceTypeSelectVM.Integration_ISPN, Title = $"Отговор към { DateTime.Today:dd.MM.yyyy}" }; if (!(await cdnService.MongoCdn_AppendUpdate(request))) { logger.LogError("Error in SaveContent ISPN mqId {mq.Id}!", mq.Id.ToString()); } } else { SetErrorToMQ(mq, IntegrationStates.DataContentError, content); } } else { throw new Exception($"Error {response.StatusCode} : {response.ReasonPhrase} sending message ISPN!"); } }
/// <summary> /// Изпраща съобщение до ЕИСПП /// </summary> /// <param name="mq">Съобщение от опашката</param> protected override async Task SendMQ(MQEpep mq) { try { string message = null; bool isReadyMessage = false; if (mq.Content != null) { message = Encoding.UTF8.GetString(mq.Content); // isReadyMessage = true; } else { var eisppEventItem = repo.AllReadonly <EisppEventItem>() .Where(x => x.MQEpepId == mq.Id) .FirstOrDefault(); if (!string.IsNullOrEmpty(eisppEventItem.RequestXML)) { isReadyMessage = true; message = eisppEventItem.RequestXML; } else { var model = JsonConvert.DeserializeObject <EisppPackage>(eisppEventItem.RequestData); eisppRulesService.SetIsSelectedAndClear(model); message = XmlUtils.SerializeEisppPackage(model); } } if (!isReadyMessage) { if (message.StartsWith(byteOrderMarkUtf8, StringComparison.Ordinal)) { message = message.Remove(0, byteOrderMarkUtf8.Length); } EisppPackage package = XmlUtils.DeserializeXml <EisppPackage>(message); if (package != null) { var eisppEvent = package.Data.Events.Where(x => x.EventKind == EventKind.NewEvent).FirstOrDefault(); if (eisppEvent == null && package.Data.Events.Length > 0) { eisppEvent = package.Data.Events[0]; } var structureId = eisppEvent.StructureId; var eventType = eisppEvent.EventType; package.CorrelationId = mq.MQId; package.SenderNode = senderNode; package.ReceiverNode = receiverNode; package.ReceiverStructure = receiverStructure; package.MessageType = messageType; int eventTypeResSid = eventType; var eisppEventOld = package.Data.Events.Where(x => x.EventKind == EventKind.OldEvent).FirstOrDefault(); if (eisppEventOld?.EventType > 0) { eventTypeResSid = EventType.DeleteEvent; if (eisppEvent.EventKind == EventKind.NewEvent) { eventTypeResSid = EventType.ChangeEvent; } } package.Data.Context = new Context() { StructureId = structureId, EventDate = eisppEvent.EventDate, EventType = eventType > 0 ? eventType : 0, ResourceId = eisppRulesService.GetResSidFromRules(eventTypeResSid) }; if (package.Data.Context.ResourceId <= 0) { package.Data.Context.ResourceId = GetNomValueInt(EISPPConstants.EisppMapping.ResSid, eisppEvent.CriminalProceeding.Case.LegalProceedingType); } if (package.Data?.Context != null) { package.Data.Context.WorkingMode = workingMode; package.Data.Context.UserSystemId = userSystemId; package.Data.Context.WorkPlaceId = workPlaceId; } else { throw new ArgumentException("Context is required"); } foreach (var eisppEventItem in package.Data.Events) { if (eisppEventItem.CriminalProceeding?.Case?.Persons == null) { continue; } foreach (var person in eisppEventItem.CriminalProceeding.Case.Persons) { if (person.BirthPlace != null) { if ((person.BirthPlace.SettelmentAbroad == "0" || string.IsNullOrEmpty(person.BirthPlace.SettelmentAbroad)) && person.BirthPlace.SettelmentBg == 0 && person.BirthPlace.PlaceId == 0) { person.BirthPlace = null; } } } } if (eventType == EventType.GetCase) { eisppEvent.CriminalProceeding.Case.CaseSetupType = -1; eisppEvent.CriminalProceeding.Case.LegalProceedingType = -1; } message = XmlUtils.SerializeEisppPackage(package); message = await eisppRulesService.ApplyRules(structureId, message, eventType); } else { message = string.Empty; } } if (!string.IsNullOrEmpty(message)) { mq.Content = Encoding.UTF8.GetBytes(message); if (await Send(message)) { MarkAsSent(mq, message); } else { throw new ApplicationException("Error sending message!"); } } else { throw new ArgumentException("At least one Event is required"); } } catch (InvalidOperationException iop) { throw new ArgumentException("The content is not a valid EISPP package", iop); } }