DicomServerManager.cs 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183
  1. using Dicom.IO;
  2. using Dicom.Network;
  3. using System;
  4. using System.IO;
  5. using System.Threading;
  6. using System.Threading.Tasks;
  7. using Vinno.FIS.Sonopost.Common;
  8. using Vinno.FIS.Sonopost.Features.Dicom;
  9. using Vinno.FIS.Sonopost.Managers.Interfaces;
  10. using Vinno.FIS.Sonopost.Settings;
  11. using Vinno.IUS.Common.Log;
  12. namespace Vinno.FIS.Sonopost.Managers
  13. {
  14. internal class DicomServerManager : SonopostManager, IDicomServerManager
  15. {
  16. private readonly IRemedicalManager _remedicalManager;
  17. private IDicomServer _server;
  18. private bool _dicomEnabled;
  19. private string _dicomTitle;
  20. private int _dicomPort;
  21. private int _dicomTempFileDays;
  22. private bool _isRunning => _server?.IsListening ?? false;
  23. private ManualResetEvent _manualResetEvent = new ManualResetEvent(false);
  24. private CancellationTokenSource _tokenSource;
  25. private Task _task;
  26. public DicomServerManager()
  27. {
  28. _remedicalManager = AppManager.Instance.GetManager<IRemedicalManager>();
  29. TemporaryFile.StoragePath = Path.Combine(SonopostConstants.DataFolder, SonopostConstants.TempFiles);
  30. _dicomEnabled = SonopostUserDefinedSettings.Instance.DicomSetting.UseDicomService;
  31. _dicomTitle = SonopostUserDefinedSettings.Instance.DicomSetting.DicomTitile;
  32. _dicomPort = SonopostUserDefinedSettings.Instance.DicomSetting.DicomPort;
  33. _dicomTempFileDays = SonopostUserDefinedSettings.Instance.DicomSetting.TempFileDays;
  34. Start();
  35. CheckOverDueFile();
  36. }
  37. private void Start()
  38. {
  39. var port = SonopostUserDefinedSettings.Instance.DicomSetting.DicomPort;
  40. if (_dicomEnabled && !_isRunning)
  41. {
  42. _server = DicomServer.Create<VinnoDicomService>(port, logger: new DicomLog());
  43. if (_isRunning)
  44. {
  45. Logger.WriteLineInfo("Dicom server started.");
  46. _manualResetEvent.Reset();
  47. }
  48. else
  49. {
  50. Logger.WriteLineWarn("Dicom server start failed.");
  51. }
  52. }
  53. }
  54. private void Stop()
  55. {
  56. if (_server != null)
  57. {
  58. _server.Stop();
  59. _server.Dispose();
  60. _server = null;
  61. Logger.WriteLineInfo("Dicom server Stoped.");
  62. }
  63. _tokenSource?.Cancel();
  64. _manualResetEvent.Set();
  65. try
  66. {
  67. _task?.Wait(1000);//因Task在Wait过程中Cancel有几率会出错
  68. }
  69. catch
  70. {
  71. }
  72. }
  73. public void ChangeValue()
  74. {
  75. var dicomEnabled = SonopostUserDefinedSettings.Instance.DicomSetting.UseDicomService;
  76. var dicomTitle = SonopostUserDefinedSettings.Instance.DicomSetting.DicomTitile;
  77. var dicomPort = SonopostUserDefinedSettings.Instance.DicomSetting.DicomPort;
  78. var dicomTempFileDays = SonopostUserDefinedSettings.Instance.DicomSetting.TempFileDays;
  79. if (_dicomEnabled != dicomEnabled || _dicomTitle != dicomTitle || _dicomPort != dicomPort || _dicomTempFileDays != dicomTempFileDays)
  80. {
  81. _dicomEnabled = dicomEnabled;
  82. _dicomTitle = dicomTitle;
  83. _dicomPort = dicomPort;
  84. _dicomTempFileDays = dicomTempFileDays;
  85. Stop();
  86. Start();
  87. CheckOverDueFile();
  88. }
  89. }
  90. private void CheckOverDueFile()
  91. {
  92. var tempFileDays = SonopostUserDefinedSettings.Instance.DicomSetting.TempFileDays;
  93. if (tempFileDays > 0)
  94. {
  95. _tokenSource = new CancellationTokenSource();
  96. _task = Task.Run(() =>
  97. {
  98. while (!_tokenSource.IsCancellationRequested)
  99. {
  100. try
  101. {
  102. var originalDicom = Path.Combine(SonopostConstants.DataFolder, SonopostConstants.OriginalDicomFolder);
  103. var originalVid = Path.Combine(SonopostConstants.DataFolder, SonopostConstants.OriginalVidFolder);
  104. var tempFiles = Path.Combine(SonopostConstants.DataFolder, SonopostConstants.TempFiles);
  105. var vinnoDicom = Path.Combine(SonopostConstants.DataFolder, SonopostConstants.VinnoDicomFolder);
  106. Logger.WriteLineInfo($"DicomServerManager Start Delete OverDue Files,TempFileDays:{tempFileDays}");
  107. DeleteOverDueFiles(originalDicom, tempFileDays);
  108. DeleteOverDueFiles(originalVid, tempFileDays);
  109. DeleteOverDueFiles(tempFiles, tempFileDays);
  110. DeleteOverDueFiles(vinnoDicom, tempFileDays);
  111. DeletetOverDueRecord(tempFileDays);
  112. _remedicalManager.DeleteOverDueRecords(tempFileDays);
  113. Logger.WriteLineInfo($"DicomServerManager Start Delete OverDue Files");
  114. }
  115. catch (Exception ex)
  116. {
  117. Logger.WriteLineError($"Delete Overdue file fail:{ex}");
  118. }
  119. finally
  120. {
  121. _manualResetEvent.WaitOne(TimeSpan.FromHours(1));
  122. }
  123. }
  124. }, _tokenSource.Token);
  125. }
  126. }
  127. private void DeletetOverDueRecord(int tempFileDays)
  128. {
  129. var failList = DicomUploadContextOperator.Instance.GetAll();
  130. foreach (var failItem in failList)
  131. {
  132. if (DateTime.Now - failItem.CreateTime >= TimeSpan.FromDays(tempFileDays))
  133. {
  134. DicomUploadContextOperator.Instance.DeleteById(failItem.Id);
  135. }
  136. }
  137. }
  138. private void DeleteOverDueFiles(string path, int tempFileDays)
  139. {
  140. if (!Directory.Exists(path))
  141. return;
  142. var files = Directory.GetFiles(path);
  143. foreach (var file in files)
  144. {
  145. FileInfo fileInfo = new FileInfo(file);
  146. if (DateTime.Now - fileInfo.CreationTime >= TimeSpan.FromDays(tempFileDays))
  147. {
  148. fileInfo.Delete();
  149. }
  150. }
  151. var directories = Directory.GetDirectories(path);
  152. foreach (var dir in directories)
  153. {
  154. DeleteOverDueFiles(dir, tempFileDays);
  155. }
  156. }
  157. public override void DoDispose()
  158. {
  159. try
  160. {
  161. Stop();
  162. }
  163. catch (Exception ex)
  164. {
  165. Logger.WriteLineError($"DicomServerManager DoDispose Error:{ex}");
  166. }
  167. base.DoDispose();
  168. }
  169. }
  170. }