WorklistJsonHandler.cs 8.8 KB

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