MessageProcessingService.cs 7.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210
  1. using Avalonia.Threading;
  2. using EdTestEmulator.Models;
  3. using System;
  4. using System.Collections.Generic;
  5. using System.Diagnostics;
  6. using System.IO;
  7. using System.Linq;
  8. using System.Threading.Tasks;
  9. using System.Xml;
  10. namespace EdTestEmulator.Services
  11. {
  12. internal class MessageProcessingService
  13. {
  14. private ICollection<ProcedureRow> _procedures;
  15. private ICollection<MessageRow> _messages;
  16. private IDictionary<MessageRow, string> _xmlMessages;
  17. private FileSystemWatcher _watcher;
  18. private string _dirPath;
  19. public MessageProcessingService(ICollection<ProcedureRow> procedures, ICollection<MessageRow> messages, IDictionary<MessageRow,string> _xmlMessageMap, string directory)
  20. {
  21. this._procedures = procedures;
  22. this._messages = messages;
  23. this._xmlMessages = _xmlMessageMap;
  24. if (!Directory.Exists(directory))
  25. Directory.CreateDirectory(directory);
  26. _dirPath = directory;
  27. _watcher = new FileSystemWatcher(directory);
  28. _watcher.EnableRaisingEvents = true;
  29. _watcher.Created += _watcher_Created;
  30. }
  31. private void _watcher_Created(object sender, FileSystemEventArgs e)
  32. {
  33. Task.Delay(300).Wait();
  34. var fileContent = File.ReadAllText(e.FullPath);
  35. var doc = new XmlDocument();
  36. doc.LoadXml(fileContent);
  37. var elementList = doc.GetElementsByTagName("Header");
  38. if (elementList.Count == 0) elementList = doc.GetElementsByTagName("env:Header");
  39. XmlNode header;
  40. if (elementList.Count > 0)
  41. {
  42. header = elementList.Item(0);
  43. var edHeader = header.ChildNodes.OfType<XmlNode>().FirstOrDefault(x=>x.Name.Contains("EDHeader"));
  44. var routingInf = header.ChildNodes.OfType<XmlNode>().FirstOrDefault(x => x.Name.Contains("RoutingInf"));
  45. var envelopeId = string.Empty;
  46. var initEnvelopeId = string.Empty;
  47. var messageType = string.Empty;
  48. var procUuid = string.Empty;
  49. if (routingInf is not null)
  50. {
  51. envelopeId = routingInf.OfType<XmlNode>().FirstOrDefault(x=>x.Name.Contains("EnvelopeID"))?.InnerText;
  52. initEnvelopeId = routingInf.OfType<XmlNode>().FirstOrDefault(x => x.Name.Contains("InitialEnvelopeID"))?.InnerText;
  53. Debug.WriteLine(envelopeId);
  54. Debug.WriteLine(initEnvelopeId);
  55. }
  56. if (edHeader is not null)
  57. {
  58. messageType = edHeader.OfType<XmlNode>().FirstOrDefault(x => x.Name.Contains("MessageType"))?.InnerText;
  59. procUuid = edHeader.OfType<XmlNode>().FirstOrDefault(x => x.Name.Contains("ProccessID"))?.InnerText;
  60. Debug.WriteLine(messageType);
  61. }
  62. if (messageType == "ED.11001")
  63. {
  64. procUuid = CreateProcedure(envelopeId, doc);
  65. SendMessageArrivedNotify(procUuid,doc);
  66. SendSuccessProcCreateMessage(procUuid, envelopeId);
  67. SendAwaitDocsMessage(procUuid, envelopeId);
  68. return;
  69. }
  70. if (messageType == "CMN.11023")
  71. {
  72. SendMessageArrivedNotify(procUuid, doc);
  73. SendMessageDT(procUuid,doc);
  74. }
  75. }
  76. }
  77. private void SendMessageDT(string procUuid, XmlDocument doc)
  78. {
  79. var newMessage = new MessageRow();
  80. //_procedures.First(x => x.ProcedureUUID == procUuid).Type = "ДТ";
  81. newMessage.ProcedureUUID = procUuid;
  82. newMessage.MessageUUID = Guid.NewGuid().ToString();
  83. newMessage.Date
  84. = DateTime.Now;
  85. newMessage.Type = "ED.11006";
  86. newMessage.Description = "Уведомление об оформлении ДТ в рамках технологии удаленного выпуска.";
  87. Dispatcher.UIThread.Invoke(new Action(() =>
  88. {
  89. _messages.Add(newMessage);
  90. }));
  91. var esdOut = doc.GetElementsByTagName("Body")[0].ChildNodes[0].ChildNodes[3].ChildNodes[0].ChildNodes[1].ChildNodes[0].ChildNodes[0].ChildNodes[3].ChildNodes[0];
  92. _xmlMessages.Add(newMessage,esdOut.OuterXml);
  93. }
  94. private void SendMessageArrivedNotify(string procUuid, XmlDocument doc)
  95. {
  96. var newMessage = new MessageRow();
  97. newMessage.ProcedureUUID = procUuid;
  98. newMessage.MessageUUID = Guid.NewGuid().ToString();
  99. newMessage.Date
  100. = DateTime.Now;
  101. newMessage.Type = "CMN.00002";
  102. newMessage.Description = "Уведомление о получении сообщения.";
  103. Dispatcher.UIThread.Invoke(new Action(() =>
  104. {
  105. _messages.Add(newMessage);
  106. }));
  107. }
  108. private void SendAwaitDocsMessage(string procUuid, string? envelopeId)
  109. {
  110. var newMessage = new MessageRow();
  111. newMessage.ProcedureUUID = procUuid;
  112. newMessage.MessageUUID = Guid.NewGuid().ToString();
  113. newMessage.Date
  114. = DateTime.Now;
  115. newMessage.Type = "ED.00003";
  116. newMessage.Description = "Требование на представление электронных документов.";
  117. Dispatcher.UIThread.Invoke(new Action(() =>
  118. {
  119. _messages.Add(newMessage);
  120. }));
  121. }
  122. private void SendSuccessProcCreateMessage(string procUuid, string? envelopeId)
  123. {
  124. var newMessage = new MessageRow();
  125. newMessage.ProcedureUUID = procUuid;
  126. newMessage.MessageUUID = Guid.NewGuid().ToString();
  127. newMessage.Date
  128. = DateTime.Now;
  129. newMessage.Type = "ED.11002";
  130. newMessage.Description = "Уведомление об открытии процедуры декларирования.";
  131. Dispatcher.UIThread.Invoke(new Action(() =>
  132. {
  133. _messages.Add(newMessage);
  134. }));
  135. }
  136. private string CreateProcedure(string? envelopeId, XmlDocument doc)
  137. {
  138. var newUuid = Guid.NewGuid();
  139. var procedure = new ProcedureRow();
  140. procedure.ProcedureUUID = newUuid.ToString();
  141. var reqOpenProc = doc.GetElementsByTagName("ReqOpenProc")[0];
  142. var declarant = reqOpenProc.OfType<XmlNode>().FirstOrDefault(x => x.Name.Contains("Declarant"));
  143. var orgName = declarant.OfType<XmlNode>().FirstOrDefault(x => x.Name.Contains("OrganizationName")).InnerText;
  144. procedure.AwaitStatus = 1;
  145. procedure.RequiredDocs = 1;
  146. procedure.Organization = orgName;
  147. procedure.DateStart = DateTime.Now;
  148. var appVer = doc.GetElementsByTagName("app:SoftVersion").Count > 0 ? doc.GetElementsByTagName("app:SoftVersion")[0] : doc.GetElementsByTagName("SoftVersion")[0];
  149. procedure.EdVersion = appVer.InnerText;
  150. Dispatcher.UIThread.Invoke(new Action(() =>
  151. {
  152. _procedures.Add(procedure);
  153. }));
  154. return newUuid.ToString();
  155. }
  156. }
  157. }