WorklistJsonHandler.cs 7.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148
  1. // Copyright (c) 2012-2020 fo-dicom contributors.
  2. // Licensed under the Microsoft Public License (MS-PL).
  3. using Dicom;
  4. using System;
  5. using System.Collections.Generic;
  6. using System.Linq;
  7. using System.Text.RegularExpressions;
  8. using System.IO;
  9. using System.Configuration;
  10. using Newtonsoft.Json;
  11. namespace Worklist_SCP.Model
  12. {
  13. public class WorklistJsonHandler
  14. {
  15. public static IEnumerable<DicomDataset> FilterWorklistItems(DicomDataset request)
  16. {
  17. //var exams = allWorklistItems.AsQueryable();
  18. string jsonPath = ConfigurationManager.AppSettings["JSON"];
  19. Console.Write($"jsonPath: {jsonPath}");
  20. string json = File.ReadAllText(jsonPath);
  21. Console.Write($"json: {json}");
  22. var exams = JsonConvert.DeserializeObject<List<WorklistItem>>(json);
  23. DicomDataset procedureStep = null;
  24. if (request.Contains(DicomTag.ScheduledProcedureStepSequence))
  25. {
  26. procedureStep = request.GetSequence(DicomTag.ScheduledProcedureStepSequence).First();
  27. }
  28. var results = exams.ToList();
  29. // Parsing result
  30. foreach (var result in results)
  31. {
  32. var resultingSPS = new DicomDataset();
  33. var resultDataset = new DicomDataset();
  34. var resultingSPSSequence = new DicomSequence(DicomTag.ScheduledProcedureStepSequence, resultingSPS);
  35. if (procedureStep != null)
  36. {
  37. resultDataset.Add(resultingSPSSequence);
  38. }
  39. // add results to "main" dataset
  40. AddIfExistsInRequest(resultDataset, request, DicomTag.AccessionNumber, result.AccessionNumber); // T2
  41. AddIfExistsInRequest(resultDataset, request, DicomTag.InstitutionName, result.HospitalName);
  42. AddIfExistsInRequest(resultDataset, request, DicomTag.ReferringPhysicianName, result.ReferringPhysician); // T2
  43. AddIfExistsInRequest(resultDataset, request, DicomTag.PatientName, result.Surname + "^" + result.Forename + "^^" + result.Title); //T1
  44. AddIfExistsInRequest(resultDataset, request, DicomTag.PatientID, result.PatientID); // T1
  45. AddIfExistsInRequest(resultDataset, request, DicomTag.PatientBirthDate, result.DateOfBirth); // T2
  46. AddIfExistsInRequest(resultDataset, request, DicomTag.PatientSex, result.Sex); //T2
  47. AddIfExistsInRequest(resultDataset, request, DicomTag.StudyInstanceUID, result.StudyUID); // T1
  48. AddIfExistsInRequest(resultDataset, request, DicomTag.RequestingPhysician, result.ReferringPhysician); //T2
  49. AddIfExistsInRequest(resultDataset, request, DicomTag.RequestedProcedureDescription, result.ExamDescription); //T1C
  50. AddIfExistsInRequest(resultDataset, request, DicomTag.RequestedProcedureID, result.ProcedureID); // T1
  51. // Scheduled Procedure Step sequence T1
  52. // add results to procedure step dataset
  53. // Return if requested
  54. if (procedureStep != null)
  55. {
  56. AddIfExistsInRequest(resultingSPS, procedureStep, DicomTag.ScheduledStationAETitle, result.ScheduledAET); // T1
  57. AddIfExistsInRequest(resultingSPS, procedureStep, DicomTag.ScheduledProcedureStepStartDate, result.ExamDateAndTime); //T1
  58. AddIfExistsInRequest(resultingSPS, procedureStep, DicomTag.ScheduledProcedureStepStartTime, result.ExamDateAndTime); //T1
  59. AddIfExistsInRequest(resultingSPS, procedureStep, DicomTag.Modality, result.Modality); // T1
  60. AddIfExistsInRequest(resultingSPS, procedureStep, DicomTag.ScheduledPerformingPhysicianName, result.PerformingPhysician); //T2
  61. AddIfExistsInRequest(resultingSPS, procedureStep, DicomTag.ScheduledProcedureStepDescription, result.ExamDescription); // T1C
  62. AddIfExistsInRequest(resultingSPS, procedureStep, DicomTag.ScheduledProcedureStepID, result.ProcedureStepID); // T1
  63. AddIfExistsInRequest(resultingSPS, procedureStep, DicomTag.ScheduledStationName, result.ExamRoom); //T2
  64. AddIfExistsInRequest(resultingSPS, procedureStep, DicomTag.ScheduledProcedureStepLocation, result.ExamRoom); //T2
  65. }
  66. // Put blanks in for unsupported fields which are type 2 (i.e. must have a value even if NULL)
  67. // In a real server, you may wish to support some or all of these, but they are not commonly supported
  68. AddIfExistsInRequest(resultDataset, request, DicomTag.ReferencedStudySequence, new DicomDataset()); // Ref//d Study Sequence
  69. AddIfExistsInRequest(resultDataset, request, DicomTag.Priority, ""); // Priority
  70. AddIfExistsInRequest(resultDataset, request, DicomTag.PatientTransportArrangements, ""); // Transport Arrangements
  71. AddIfExistsInRequest(resultDataset, request, DicomTag.AdmissionID, ""); // Admission ID
  72. AddIfExistsInRequest(resultDataset, request, DicomTag.CurrentPatientLocation, ""); // Patient Location
  73. AddIfExistsInRequest(resultDataset, request, DicomTag.ReferencedPatientSequence, new DicomDataset()); // Ref//d Patient Sequence
  74. AddIfExistsInRequest(resultDataset, request, DicomTag.PatientWeight, ""); // Weight
  75. AddIfExistsInRequest(resultDataset, request, DicomTag.ConfidentialityConstraintOnPatientDataDescription, ""); // Confidentiality Constraint
  76. // Send Reponse Back
  77. yield return resultDataset;
  78. }
  79. }
  80. //Splits patient name into 2 separte strings surname and forename and send then to the addstringcondition subroutine.
  81. internal static IQueryable<WorklistItem> AddNameCondition(IQueryable<WorklistItem> exams, string dicomName)
  82. {
  83. if (string.IsNullOrEmpty(dicomName) || dicomName == "*")
  84. {
  85. return exams;
  86. }
  87. var personName = new DicomPersonName(DicomTag.PatientName, dicomName);
  88. if (dicomName.Contains("*"))
  89. {
  90. var firstNameRegex = new Regex("^" + Regex.Escape(personName.First).Replace("\\*", ".*") + "$");
  91. var lastNameRegex = new Regex("^" + Regex.Escape(personName.Last).Replace("\\*", ".*") + "$");
  92. exams = exams.Where(x => firstNameRegex.IsMatch(x.Forename) || lastNameRegex.IsMatch(x.Surname));
  93. }
  94. else
  95. {
  96. exams = exams.Where(x => (x.Forename.Equals(personName.First) && x.Surname.Equals(personName.Last)));
  97. }
  98. return exams;
  99. }
  100. internal static IQueryable<WorklistItem> AddDateCondition(IQueryable<WorklistItem> exams, string dateCondition)
  101. {
  102. if (!string.IsNullOrEmpty(dateCondition) && dateCondition != "*")
  103. {
  104. var range = new DicomDateTime(DicomTag.ScheduledProcedureStepStartDate, dateCondition).Get<DicomDateRange>();
  105. exams = exams.Where(x => range.Contains(x.ExamDateAndTime));
  106. }
  107. return exams;
  108. }
  109. internal static void AddIfExistsInRequest<T>(DicomDataset result, DicomDataset request, DicomTag tag, T value)
  110. {
  111. // Only send items which have been requested
  112. if (request.Contains(tag))
  113. {
  114. if (value == null)
  115. {
  116. value = default;
  117. }
  118. result.AddOrUpdate(tag, value);
  119. }
  120. }
  121. }
  122. }