RemedicalManager.cs 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355
  1. using Dicom;
  2. using FISLib.Connect;
  3. using FISLib.Remedical;
  4. using System;
  5. using System.Collections.Generic;
  6. using System.IO;
  7. using System.Linq;
  8. using System.Threading;
  9. using Vinno.FIS.Sonopost.Common;
  10. using Vinno.FIS.Sonopost.Features.Dicom;
  11. using Vinno.FIS.Sonopost.Helpers;
  12. using Vinno.FIS.Sonopost.Managers.Interfaces;
  13. using Vinno.IUS.Common.Log;
  14. namespace Vinno.FIS.Sonopost.Managers
  15. {
  16. internal class RemedicalManager : SonopostManager, IRemedicalManager
  17. {
  18. private readonly IRemedicalService _fisRemedicalService;
  19. private readonly ILoginManager _loginManager;
  20. public RemedicalManager()
  21. {
  22. _fisRemedicalService = AppManager.Instance.GetManager<IFISManager>().FISRemedicalService;
  23. _fisRemedicalService.FISScanDataChanged += OnFISScanDataChanged;
  24. _loginManager = AppManager.Instance.GetManager<ILoginManager>();
  25. }
  26. private void OnFISScanDataChanged(object sender, FISVidDataChangedEventArgs e)
  27. {
  28. try
  29. {
  30. var scanDataId = e.FISVidData.Id;
  31. Logger.WriteLineInfo($"Scan data id: {scanDataId},Status:{e.FISVidData?.Status},ChangeType:{e.ChangeType}");
  32. if (e.FISVidData.Status == FISUploadStatus.Fail && e.ChangeType == FISVidDataChangeType.Update)
  33. {
  34. DicomUploadContextOperator.Instance.UpdateStatusByScanId(scanDataId, DicomUploadStatus.UploadFail);
  35. }
  36. else if (e.FISVidData.Status == FISUploadStatus.FailBecauseExamIsFinished && e.ChangeType == FISVidDataChangeType.Update)
  37. {
  38. DicomUploadContextOperator.Instance.UpdateStatusByScanId(scanDataId, DicomUploadStatus.UploadFailBecauseExamIsFinished);
  39. }
  40. else if ((e.FISVidData.Status == FISUploadStatus.Uploaded && e.ChangeType == FISVidDataChangeType.Removed) || e.FISVidData.Status == FISUploadStatus.Deleted && e.ChangeType == FISVidDataChangeType.Update)
  41. {
  42. var item = DicomUploadContextOperator.Instance.GetCacheByScanId(scanDataId);
  43. if (item == null)
  44. {
  45. return;
  46. }
  47. RemoveByScanDataId(scanDataId);
  48. FileHelper.DeleteFile(item.DicomPath);
  49. }
  50. else if (e.FISVidData.Status == FISUploadStatus.Uploading && e.ChangeType == FISVidDataChangeType.Update)
  51. {
  52. DicomUploadContextOperator.Instance.UpdateStatusByScanId(scanDataId, DicomUploadStatus.Uploading);
  53. }
  54. else if ((e.FISVidData.Status == FISUploadStatus.Waiting || e.FISVidData.Status == FISUploadStatus.Idle) && (e.ChangeType == FISVidDataChangeType.Update || e.ChangeType == FISVidDataChangeType.Added))
  55. {
  56. DicomUploadContextOperator.Instance.UpdateStatusByScanId(scanDataId, DicomUploadStatus.Waiting);
  57. }
  58. }
  59. catch (Exception ex)
  60. {
  61. Logger.WriteLineError($"On scan data changed error {e.ChangeType} - {e.FISVidData.Id} : {ex}");
  62. }
  63. }
  64. /// <summary>
  65. /// Delete OverDueRecords
  66. /// </summary>
  67. /// <param name="tempFileDays"></param>
  68. public void DeleteOverDueRecords(int tempFileDays)
  69. {
  70. if (_loginManager.DeviceStatus != DeviceStatus.Logon)
  71. {
  72. return;
  73. }
  74. var failList = DicomUploadContextOperator.Instance.GetAll();
  75. var failScanDatas = _fisRemedicalService.LoadFailedScanDatas();
  76. if (failScanDatas != null && failList != null)
  77. {
  78. foreach (var failScanData in failScanDatas)
  79. {
  80. if (!failList.Any(x => x.ScanId == failScanData.Id))
  81. {
  82. _fisRemedicalService.DeleteScanDataById(failScanData.Id);
  83. }
  84. }
  85. }
  86. }
  87. /// <summary>
  88. /// upload dicom
  89. /// </summary>
  90. /// <param name="uploadVidPath"></param>
  91. /// <param name="patientId"></param>
  92. public void UploadWorkFlow(string uploadVidPath, string patientId)
  93. {
  94. Logger.WriteLineInfo($"Start Upload to Server,patientId:{patientId}");
  95. var content = UploadContent.Parse(uploadVidPath);
  96. if (content != null)
  97. {
  98. try
  99. {
  100. if (!content.IsVidFile)
  101. {
  102. var originalDicomPath = Path.Combine(SonopostConstants.DataFolder, SonopostConstants.OriginalDicomFolder, content.Date, $"{content.Id}.{SonopostConstants.DicomFileName}");
  103. if (File.Exists(originalDicomPath))
  104. {
  105. var dicomFile = DicomFile.Open(originalDicomPath);
  106. var patientInfo = PatientScanInfoHelper.CreatePatientScanInfo(dicomFile.Dataset);
  107. var examId = dicomFile.Dataset.GetSingleValueOrDefault(DicomTag.StudyInstanceUID, string.Empty);
  108. if (_loginManager.DeviceStatus != DeviceStatus.Logon)
  109. {
  110. DicomUploadContextOperator.Instance.UpdateStatus(content.Id, DicomUploadStatus.CreateScanDataFail);
  111. Logger.WriteLineError($"Upload vinno dicom file failed,Because the Remedical is null.PatientId:{patientId},OriginalDicomPath:{originalDicomPath}");
  112. return;
  113. }
  114. var scanDataId = _fisRemedicalService.UploadScanData(examId, string.Empty, content.UploadFilePath, content.VidType, "FromSonopost", patientInfo, string.Empty);
  115. if (!string.IsNullOrEmpty(scanDataId))
  116. {
  117. DicomUploadContextOperator.Instance.UpdateScanId(content.Id, scanDataId);
  118. return;
  119. }
  120. else
  121. {
  122. DicomUploadContextOperator.Instance.UpdateStatus(content.Id, DicomUploadStatus.CreateScanDataFail);
  123. Logger.WriteLineError($"ScanData is null.PatientId:{patientId},OriginalDicomPath:{originalDicomPath}");
  124. return;
  125. }
  126. }
  127. else
  128. {
  129. throw new Exception($"Original Dicom File is not exist {originalDicomPath}");
  130. }
  131. }
  132. else
  133. {
  134. if (_loginManager.DeviceStatus != DeviceStatus.Logon)
  135. {
  136. DicomUploadContextOperator.Instance.UpdateStatus(content.Id, DicomUploadStatus.CreateScanDataFail);
  137. Logger.WriteLineError($"Upload vinno dicom file failed,Because the Remedical is null.PatientId:{patientId}");
  138. return;
  139. }
  140. var scanDataId = _fisRemedicalService.UploadScanData(string.Empty, string.Empty, content.UploadFilePath, content.VidType, "FromSonopost", new FISPatientScanInfo(), content.ExamRecordId);
  141. if (!string.IsNullOrEmpty(scanDataId))
  142. {
  143. DicomUploadContextOperator.Instance.UpdateScanId(content.Id, scanDataId);
  144. return;
  145. }
  146. else
  147. {
  148. DicomUploadContextOperator.Instance.UpdateStatus(content.Id, DicomUploadStatus.CreateScanDataFail);
  149. Logger.WriteLineError($"ScanData is null.PatientId:{patientId},ExanRecordId:{content.ExamRecordId}");
  150. return;
  151. }
  152. }
  153. }
  154. catch (Exception ex)
  155. {
  156. DicomUploadContextOperator.Instance.UpdateStatus(content.Id, DicomUploadStatus.Unknown);
  157. Logger.WriteLineError($"Upload vinno dicom file failed,PatientId:{patientId}:{ex}.");
  158. }
  159. }
  160. else
  161. {
  162. Logger.WriteLineError("Parse Upload content Fail");
  163. }
  164. }
  165. public void Delete(string id)
  166. {
  167. try
  168. {
  169. var item = DicomUploadContextOperator.Instance.GetCacheById(id);
  170. if (item == null)
  171. {
  172. return;
  173. }
  174. if (string.IsNullOrEmpty(item.ScanId))
  175. {
  176. RemoveById(id);
  177. }
  178. else
  179. {
  180. if (_loginManager.DeviceStatus == DeviceStatus.Logon)
  181. {
  182. _fisRemedicalService.DeleteScanDataById(item.ScanId);
  183. }
  184. RemoveByScanDataId(item.ScanId);
  185. }
  186. FileHelper.DeleteFile(item.DicomPath);
  187. }
  188. catch (Exception ex)
  189. {
  190. Logger.WriteLineError($"RemedicalManager Delete Error:{ex}");
  191. }
  192. }
  193. public void Retry(string id)
  194. {
  195. var retryItem = DicomUploadContextOperator.Instance.GetCacheById(id);
  196. if (retryItem == null)
  197. return;
  198. if (retryItem.Status == DicomUploadStatus.ConvertFail)
  199. {
  200. Logger.WriteLineWarn($"Convert Fail,Can not Retry,DicomPath:{retryItem.DicomPath}");
  201. return;
  202. }
  203. else if (retryItem.Status == DicomUploadStatus.CreateScanDataFail)
  204. {
  205. var count = retryItem.Count + 1;
  206. DicomUploadContextOperator.Instance.UpdateRetryCount(retryItem, count);
  207. Thread.Sleep(1000);
  208. DicomUploadContextOperator.Instance.UpdateStatus(id, DicomUploadStatus.Waiting);
  209. UploadWorkFlow(retryItem.VidPath, retryItem.PatientId);
  210. }
  211. else if (retryItem.Status == DicomUploadStatus.UploadFail || retryItem.Status == DicomUploadStatus.UploadFailBecauseExamIsFinished)
  212. {
  213. var count = retryItem.Count + 1;
  214. DicomUploadContextOperator.Instance.UpdateRetryCount(retryItem, count);
  215. Thread.Sleep(1000);
  216. DicomUploadContextOperator.Instance.UpdateStatus(id, DicomUploadStatus.Waiting);
  217. RetryUploadByScanId(retryItem.ScanId);
  218. }
  219. }
  220. public string GetDicomFilePath(string id)
  221. {
  222. var cache = DicomUploadContextOperator.Instance.GetCacheById(id);
  223. if (cache != null)
  224. {
  225. return cache.DicomPath;
  226. }
  227. return string.Empty;
  228. }
  229. public IList<DicomUploadContext> GetConvertFailContexts()
  230. {
  231. return DicomUploadContextOperator.Instance.GetAll();
  232. }
  233. private void RetryUploadByScanId(string scanDataId)
  234. {
  235. if (_loginManager.DeviceStatus != DeviceStatus.Logon)
  236. {
  237. Logger.WriteLineError($"Reupload vinno dicom file failed,Because the Remedical is null.");
  238. return;
  239. }
  240. var scanData = _fisRemedicalService.LoadFailedScanDatas().FirstOrDefault(m => m.Id == scanDataId);
  241. if (scanData != null)
  242. {
  243. Reupload(scanData.Id);
  244. }
  245. else
  246. {
  247. Logger.WriteLineError($"RetryUploadByScanId Can't find ScanDataId{scanDataId} and Delete Automatically");
  248. var item = DicomUploadContextOperator.Instance.GetCacheByScanId(scanDataId);
  249. if (item == null)
  250. {
  251. return;
  252. }
  253. RemoveByScanDataId(scanDataId);
  254. FileHelper.DeleteFile(item.DicomPath);
  255. }
  256. }
  257. private void Reupload(string scanDataId)
  258. {
  259. _fisRemedicalService.ReUploadScanDataByIds(new List<string> { scanDataId });
  260. }
  261. private void RemoveByScanDataId(string scanDataId)
  262. {
  263. DicomUploadContextOperator.Instance.DeleteByScanId(scanDataId);
  264. }
  265. private void RemoveById(string id)
  266. {
  267. DicomUploadContextOperator.Instance.DeleteById(id);
  268. }
  269. public string GetCollcetingRecordCode()
  270. {
  271. if (_loginManager.DeviceStatus != DeviceStatus.Logon)
  272. {
  273. Logger.WriteLineError($"GetCollcetingRecordCode failed,please connect the vcloud server first.");
  274. return null;
  275. }
  276. return _fisRemedicalService.GetCollcetingRecordCode();
  277. }
  278. public FISvCloudExamPatientDetailInfo GetvCloudExamDetailInfoByExamRecordId(string examRecordId)
  279. {
  280. if (_loginManager.DeviceStatus != DeviceStatus.Logon)
  281. {
  282. Logger.WriteLineError($"GetvCloudExamDetailInfoByExamRecordId failed,please connect the vcloud server first.");
  283. return null;
  284. }
  285. return _fisRemedicalService.GetvCloudExamDetailInfoByExamRecordId(examRecordId);
  286. }
  287. public void ClearRemedicalCache()
  288. {
  289. try
  290. {
  291. if (_loginManager.DeviceStatus == DeviceStatus.Logon)
  292. {
  293. _fisRemedicalService.ClearExamRecorderCache(); ;
  294. }
  295. }
  296. catch (Exception ex)
  297. {
  298. Logger.WriteLineError($"LivePushManager ClearRemedicalCache Error:{ex}");
  299. }
  300. }
  301. public override void DoDispose()
  302. {
  303. try
  304. {
  305. _fisRemedicalService.FISScanDataChanged -= OnFISScanDataChanged;
  306. }
  307. catch (Exception ex)
  308. {
  309. Logger.WriteLineError($"RemedicalManager DoDispose Error:{ex}");
  310. }
  311. base.DoDispose();
  312. }
  313. public void ReUploadAll()
  314. {
  315. try
  316. {
  317. if (_loginManager.DeviceStatus == DeviceStatus.Logon)
  318. {
  319. var failList = _fisRemedicalService.LoadFailedScanDatas();
  320. if (failList != null)
  321. {
  322. foreach (var fail in failList)
  323. {
  324. RetryUploadByScanId(fail.Id);
  325. }
  326. }
  327. }
  328. }
  329. catch (Exception ex)
  330. {
  331. Logger.WriteLineError($"RemedicalManager DoDispose Error:{ex}");
  332. }
  333. base.DoDispose();
  334. }
  335. }
  336. }