Browse Source

worklist 增加SQLServer

fuyu 3 years ago
parent
commit
ea7d10d334

+ 6 - 0
Desktop/Worklist SCU/App.config

@@ -1,5 +1,11 @@
 <?xml version="1.0" encoding="utf-8"?>
 <configuration>
+    <appSettings>
+        <add key="IP"  value="127.0.0.1" />
+        <add key="Port"      value="108" />
+        <add key="serverAET" value="ZSKKCT"/>
+        <add key="clientAET" value="ZSKKCT"/>
+    </appSettings>
     <startup> 
         <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.6.1"/>
     </startup>

+ 19 - 4
Desktop/Worklist SCU/Program.cs

@@ -19,16 +19,31 @@ namespace Worklist_SCU
         private const string _performedStationAETitle = "Modality";
         private const string _performedStationName = "Modality";
 
+        [Obsolete]
         public static async Task Main(string[] args)
         {
             // Initialize log manager.
+            //NetworkManager.SetImplementation(new DesktopNetworkManager());
+            //Dicom.IO.IOManager.SetImplementation(new Dicom.IO.DesktopIOManager());
+            NetworkManager.SetImplementation(new DesktopNetworkManager());
+            Dicom.IO.IOManager.SetImplementation(new Dicom.IO.DesktopIOManager());
             LogManager.SetImplementation(ConsoleLogManager.Instance);
 
             // set the connection parameters
-            var serverIP = "localhost";
-            var serverPort = 8005;
-            var serverAET = "QRSCP";
-            var clientAET = "ModalityAET";
+            //var serverIP = "127.0.0.1";
+            //var serverPort = 108;
+            //var serverAET = "ZSKKCT";
+            //var clientAET = "ZSKKCT";
+
+            var serverIP = System.Configuration.ConfigurationSettings.AppSettings["IP"];
+            var serverPort = int.Parse(System.Configuration.ConfigurationSettings.AppSettings["Port"]);
+            var serverAET = System.Configuration.ConfigurationSettings.AppSettings["serverAET"];
+            var clientAET = System.Configuration.ConfigurationSettings.AppSettings["clientAET"];
+
+            //var serverIP = ConfigurationManager.AppSettings["IP"];
+            //var serverPort = ConfigurationManager.AppSettings["Port"];
+            //var serverAET = ConfigurationManager.AppSettings["serverAET"];
+            //var clientAET = ConfigurationManager.AppSettings["clientAET"];
 
             // query all worklist items from worklist server
             var worklistItems = await GetAllItemsFromWorklistAsync(serverIP, serverPort, serverAET, clientAET);

+ 5 - 4
Desktop/Worklist SCU/Worklist SCU.csproj

@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="utf-8"?>
-<Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+<Project DefaultTargets="Build" ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
   <Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
   <PropertyGroup>
     <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
@@ -38,9 +38,6 @@
     <StartupObject>Worklist_SCU.Program</StartupObject>
   </PropertyGroup>
   <ItemGroup>
-    <Reference Include="Dicom.Core, Version=4.0.4.0, Culture=neutral, PublicKeyToken=3a13f649e28eb09a, processorArchitecture=MSIL">
-      <HintPath>..\..\packages\fo-dicom.Desktop.4.0.5\lib\net45\Dicom.Core.dll</HintPath>
-    </Reference>
     <Reference Include="System" />
     <Reference Include="System.Core" />
     <Reference Include="System.ValueTuple, Version=4.0.3.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
@@ -52,6 +49,9 @@
     <Reference Include="System.Data" />
     <Reference Include="System.Net.Http" />
     <Reference Include="System.Xml" />
+    <Reference Include="Dicom.Core">
+      <HintPath>packages\fo-dicom.Desktop.4.0.7\lib\net45\Dicom.Core.dll</HintPath>
+    </Reference>
   </ItemGroup>
   <ItemGroup>
     <Compile Include="..\..\SharedAssemblyInfo.cs">
@@ -72,4 +72,5 @@
     </PropertyGroup>
     <Error Condition="!Exists('..\..\packages\fo-dicom.Desktop.4.0.5\build\net45\fo-dicom.Desktop.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\..\packages\fo-dicom.Desktop.4.0.5\build\net45\fo-dicom.Desktop.targets'))" />
   </Target>
+  <Import Project="packages\fo-dicom.Desktop.4.0.7\build\net45\fo-dicom.Desktop.targets" Condition="Exists('packages\fo-dicom.Desktop.4.0.7\build\net45\fo-dicom.Desktop.targets')" />
 </Project>

+ 17 - 0
Desktop/Worklist SCU/Worklist SCU.sln

@@ -0,0 +1,17 @@
+
+Microsoft Visual Studio Solution File, Format Version 12.00
+# Visual Studio 15
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Worklist SCU", "Worklist SCU.csproj", "{7E4D2675-91E7-4247-A511-F0AF5AB64E18}"
+EndProject
+Global
+	GlobalSection(SolutionConfigurationPlatforms) = preSolution
+		Debug|Any CPU = Debug|Any CPU
+		Release|Any CPU = Release|Any CPU
+	EndGlobalSection
+	GlobalSection(ProjectConfigurationPlatforms) = postSolution
+		{7E4D2675-91E7-4247-A511-F0AF5AB64E18}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{7E4D2675-91E7-4247-A511-F0AF5AB64E18}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{7E4D2675-91E7-4247-A511-F0AF5AB64E18}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{7E4D2675-91E7-4247-A511-F0AF5AB64E18}.Release|Any CPU.Build.0 = Release|Any CPU
+	EndGlobalSection
+EndGlobal

+ 2 - 2
Desktop/Worklist SCU/packages.config

@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
 <packages>
-  <package id="fo-dicom" version="4.0.5" targetFramework="net461" />
-  <package id="fo-dicom.Desktop" version="4.0.5" targetFramework="net461" />
+  <package id="fo-dicom" version="4.0.7" targetFramework="net461" />
+  <package id="fo-dicom.Desktop" version="4.0.7" targetFramework="net461" />
   <package id="System.ValueTuple" version="4.5.0" targetFramework="net461" />
 </packages>

+ 18 - 3
Desktop/Worklist/App.config

@@ -3,14 +3,29 @@
     <appSettings>
         <add key="AETitle"   value="ZSKKCT" />
         <add key="CallingAE" value="ZSKKCT" />
+        <add key="ScheduledAET"   value="ZSKKCT" />
+        <add key="HospitalName" value="东明县第二人民医院" />
         
         <add key="Modality"  value="CT" />
         <add key="Port"      value="108" />
         <add key="IpAddress" value="0.0.0.0"/>
         
-        <add key="Type"      value="API"/>
-        <add key="API"       value="http://192.168.10.240:12321/web/worklist/worklist"/>
-        <add key="JSON"      value="exam.json"/>
+<!--        <add key="Type"      value="API"/>-->
+<!--        <add key="API"       value="http://127.0.0.1:9999"/>-->
+        
+        
+<!--        <add key="Type"      value="JSON"/>-->
+<!--        <add key="JSON"      value="exam.json"/>-->
+        
+        
+        <add key="Type"      value="SQLServer"/>
+        <add key="SQL_IP"    value="192.168.1.52"/>
+        <add key="SQL_DB"    value="QiHIS"/>
+        <add key="SQL_USER"  value="Lis999"/>
+        <add key="SQL_Password"    value="054805"/>
+        
+        
+        
     </appSettings>
     <startup> 
         <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5.2"/>

+ 0 - 17
Desktop/Worklist/Model/WorklistItem.cs

@@ -14,39 +14,22 @@ namespace Worklist_SCP.Model
     {
 
         public string AccessionNumber { get; set; }
-
         public string PatientID { get; set; }
-
         public string Surname { get; set; }
-
         public string Forename { get; set; }
-
         public string Title { get; set; }
-
         public string Sex { get; set; }
-
         public DateTime DateOfBirth { get; set; }
-
         public string ReferringPhysician { get; set; }
-
         public string PerformingPhysician { get; set; }
-
         public string Modality { get; set; }
-
         public DateTime ExamDateAndTime { get; set; }
-
         public string ExamRoom { get; set; }
-
         public string ExamDescription { get; set; }
-
         public string StudyUID { get; set; }
-
         public string ProcedureID { get; set; }
-
         public string ProcedureStepID { get; set; }
-
         public string HospitalName { get; set; }
-
         public string ScheduledAET { get; set; }
 
     }

+ 256 - 0
Desktop/Worklist/Model/WorklistSQLServerHandler.cs

@@ -0,0 +1,256 @@
+// Copyright (c) 2012-2020 fo-dicom contributors.
+// Licensed under the Microsoft Public License (MS-PL).
+
+using Dicom;
+using System;
+using System.Data;
+
+using System.Collections.Generic;
+using System.Linq;
+using System.Text.RegularExpressions;
+
+using System.Net;
+using System.IO;
+
+using System.Security.Cryptography;
+using Newtonsoft.Json;
+
+using System.Configuration;
+using System.Globalization;
+
+namespace Worklist_SCP.Model
+{
+
+    public class WorklistSQLServerHandler
+    {
+        private static string HospitalName = ConfigurationManager.AppSettings["HospitalName"];
+        private static string ScheduledAET = ConfigurationManager.AppSettings["ScheduledAET"];
+        
+        private static List<View_PACS> getHisBeans()
+        {
+            var SQL_IP = ConfigurationManager.AppSettings["SQL_IP"];
+            var SQL_DB = ConfigurationManager.AppSettings["SQL_DB"];
+            var SQL_USER = ConfigurationManager.AppSettings["SQL_USER"];
+            var SQL_Password = ConfigurationManager.AppSettings["SQL_Password"];
+            //var dataSource = "Data Source=192.168.1.52;Initial Catalog=QiHIS;Persist Security Info=True;MultipleActiveResultSets=true;User ID=Lis999;Password=054805;Connect Timeout=30;min pool size=1;connection lifetime=15";
+            var dataSource = "Data Source=" + SQL_IP + ";Initial Catalog=" + SQL_DB + "; Persist Security Info=True;MultipleActiveResultSets=true;User ID=" + SQL_USER + ";Password=" + SQL_Password + ";Connect Timeout=30;min pool size=1;connection lifetime=15";
+            IFreeSql fsql = new FreeSql.FreeSqlBuilder()
+            .UseConnectionString(FreeSql.DataType.SqlServer, dataSource)
+            .UseAutoSyncStructure(false) //自动同步实体结构【开发环境必备】
+            //.UseMonitorCommand(cmd => Console.Write(cmd.CommandText))
+            .Build();
+
+            var hisBeans = fsql.Select<View_PACS>()
+            //.Where(b => b.Rating > 3)
+            //.OrderBy(b => b.Url)
+            //.Skip(100)
+            //.Limit(10) //第100行-110行的记录
+            .ToList();
+            return hisBeans;
+        }
+
+        private static List<WorklistItem> conversionWorklistItems(List<View_PACS> hisBeans) {
+            List<WorklistItem> exams = new List<WorklistItem>();
+            foreach (View_PACS hisBean in hisBeans) 
+            { 
+                exams.Add(conversionWorklistItem(hisBean)); 
+            } 
+            return exams;
+        }
+
+        private static WorklistItem conversionWorklistItem(View_PACS hisBean) {
+            WorklistItem exam = new WorklistItem();
+            exam.AccessionNumber = hisBean.LODGENO;
+            exam.PatientID = hisBean.INPATIENTNO;
+            exam.Surname = hisBean.NAME;
+            exam.Forename = "";
+            exam.Title = "";
+            exam.Sex = hisBean.SEX;
+            exam.DateOfBirth = DateTime.ParseExact(hisBean.BIRTHDATE, "yyyyMMdd", CultureInfo.InvariantCulture);
+            exam.ReferringPhysician = hisBean.LODGESECTION;
+            exam.PerformingPhysician = hisBean.LODGEDOCTOR;
+            exam.Modality = hisBean.CHECK_TYPE;
+            exam.ExamDateAndTime = DateTime.ParseExact(hisBean.LODGEDATE, "yyyyMMdd", CultureInfo.InvariantCulture);
+            exam.ExamRoom = hisBean.BEDNO;
+            exam.ExamDescription = "";
+            // exam.StudyUID = "1.2.840.01053932350.3.152.235.2.12.187636473";
+            // exam.StudyUID = "1.2.156.14702.3.3506.80065049053.20201024.10350685";
+            exam.StudyUID = generatStudyUid(exam.PatientID, exam.AccessionNumber, exam.ExamDateAndTime);
+            exam.ProcedureID = "";
+            exam.ProcedureStepID = "";
+            exam.HospitalName = HospitalName;
+            exam.ScheduledAET = ScheduledAET;
+            return exam;
+        }
+
+        // "1.2.840.xxxxx.3.152.235.2.12.187636473"
+        // 1 Identifies ISO
+        // 2 Identifies ANSI Member Body
+        // 840 Country code of a specific Member Body (U.S. for ANSI)
+        // xxxxx Identifies a specific Organization.(assigned by ANSI)
+        // 3 Manufacturer defined device type
+        // 152 Manufacturer defined serial number
+        // 235 Study number
+        // 2 Series number
+        // 12 Image number
+        // 187636473 Encoded date and time stamp of image acquisition
+
+        private static string generatStudyUid(string PatientID, string AccessionNumber, DateTime ExamDateAndTime) {
+            return "1.2.156.14702.3." + PatientID + "." + AccessionNumber + "." +  GetTimeStamp(ExamDateAndTime);
+        }
+
+
+        private static string GetTimeStamp()
+        {
+            TimeSpan ts = DateTime.Now - new DateTime(1970, 1, 1, 0, 0, 0, 0);
+            return Convert.ToInt64(ts.TotalSeconds).ToString();
+        } 
+
+        private static string GetTimeStamp(DateTime dateTime)
+        {
+            TimeSpan ts = dateTime - new DateTime(1970, 1, 1, 0, 0, 0, 0);
+            return Convert.ToInt64(ts.TotalSeconds).ToString();
+        } 
+
+        public static IEnumerable<DicomDataset> FilterWorklistItems(DicomDataset request)
+        {
+            var patientName = request.GetSingleValueOrDefault(DicomTag.PatientName, string.Empty);
+            var PatientID = request.GetSingleValueOrDefault(DicomTag.PatientID, string.Empty);
+            var api = ConfigurationManager.AppSettings["API"];
+            var AETitleConfig = ConfigurationManager.AppSettings["AETitle"];
+            var CallingAEConfig = ConfigurationManager.AppSettings["CallingAE"];
+            var ModalityConfig = ConfigurationManager.AppSettings["Modality"];
+            var paramStr = $"patientName={patientName}&PatientID={PatientID}";
+            DicomDataset procedureStep = null;
+
+            if (request.Contains(DicomTag.ScheduledProcedureStepSequence))
+            {
+                procedureStep = request.GetSequence(DicomTag.ScheduledProcedureStepSequence).First();
+                var scheduledStationAET = procedureStep.GetSingleValueOrDefault(DicomTag.ScheduledStationAETitle, string.Empty);
+                var performingPhysician = procedureStep.GetSingleValueOrDefault(DicomTag.PerformingPhysicianName, string.Empty);
+                var modality = procedureStep.GetSingleValueOrDefault(DicomTag.Modality, string.Empty);
+                var scheduledProcedureStepStartDateTime = procedureStep.GetSingleValueOrDefault(DicomTag.ScheduledProcedureStepStartDateTime, string.Empty);
+                var procedureStepLocation = procedureStep.GetSingleValueOrDefault(DicomTag.ScheduledProcedureStepLocation, string.Empty);
+                var procedureDescription = procedureStep.GetSingleValueOrDefault(DicomTag.ScheduledProcedureStepDescription, string.Empty);
+                paramStr = $"AETitleConfig={AETitleConfig}&CallingAEConfig={CallingAEConfig}&ModalityConfig={ModalityConfig}&patientName={patientName}&PatientID={PatientID}&scheduledStationAET={scheduledStationAET}&performingPhysician={performingPhysician}&modality={modality}&scheduledProcedureStepStartDateTime={scheduledProcedureStepStartDateTime}&procedureStepLocation={procedureStepLocation}&procedureDescription={procedureDescription}";
+            }
+            Console.Write($"Http request url: {api} paramStr: {paramStr}");
+            List<View_PACS> hisBeans = getHisBeans();
+            List<WorklistItem> exams = conversionWorklistItems(hisBeans);
+
+            var results = exams.ToList();
+            //  Parsing result 
+            foreach (var result in results)
+            {
+                var resultingSPS = new DicomDataset();
+                var resultDataset = new DicomDataset();
+                var resultingSPSSequence = new DicomSequence(DicomTag.ScheduledProcedureStepSequence, resultingSPS);
+
+                if (procedureStep != null)
+                {
+                    resultDataset.Add(resultingSPSSequence);
+                }
+
+                // add results to "main" dataset
+                AddIfExistsInRequest(resultDataset, request, DicomTag.AccessionNumber, result.AccessionNumber);    // T2
+                AddIfExistsInRequest(resultDataset, request, DicomTag.InstitutionName, result.HospitalName);
+                AddIfExistsInRequest(resultDataset, request, DicomTag.ReferringPhysicianName, result.ReferringPhysician); // T2
+
+                AddIfExistsInRequest(resultDataset, request, DicomTag.PatientName, result.Surname + "^" + result.Forename + "^^" + result.Title); //T1
+                AddIfExistsInRequest(resultDataset, request, DicomTag.PatientID, result.PatientID); // T1
+                AddIfExistsInRequest(resultDataset, request, DicomTag.PatientBirthDate, result.DateOfBirth); // T2
+                AddIfExistsInRequest(resultDataset, request, DicomTag.PatientSex, result.Sex); //T2
+
+                AddIfExistsInRequest(resultDataset, request, DicomTag.StudyInstanceUID, result.StudyUID); // T1
+
+                AddIfExistsInRequest(resultDataset, request, DicomTag.RequestingPhysician, result.ReferringPhysician); //T2
+                AddIfExistsInRequest(resultDataset, request, DicomTag.RequestedProcedureDescription, result.ExamDescription); //T1C
+
+                AddIfExistsInRequest(resultDataset, request, DicomTag.RequestedProcedureID, result.ProcedureID); // T1
+
+                // Scheduled Procedure Step sequence T1
+                // add results to procedure step dataset
+                // Return if requested
+                if (procedureStep != null)
+                {
+                    AddIfExistsInRequest(resultingSPS, procedureStep, DicomTag.ScheduledStationAETitle, result.ScheduledAET); // T1
+                    AddIfExistsInRequest(resultingSPS, procedureStep, DicomTag.ScheduledProcedureStepStartDate, result.ExamDateAndTime); //T1
+                    AddIfExistsInRequest(resultingSPS, procedureStep, DicomTag.ScheduledProcedureStepStartTime, result.ExamDateAndTime); //T1
+                    AddIfExistsInRequest(resultingSPS, procedureStep, DicomTag.Modality, result.Modality); // T1
+
+                    AddIfExistsInRequest(resultingSPS, procedureStep, DicomTag.ScheduledPerformingPhysicianName, result.PerformingPhysician); //T2
+                    AddIfExistsInRequest(resultingSPS, procedureStep, DicomTag.ScheduledProcedureStepDescription, result.ExamDescription); // T1C
+                    AddIfExistsInRequest(resultingSPS, procedureStep, DicomTag.ScheduledProcedureStepID, result.ProcedureStepID); // T1
+                    AddIfExistsInRequest(resultingSPS, procedureStep, DicomTag.ScheduledStationName, result.ExamRoom); //T2
+                    AddIfExistsInRequest(resultingSPS, procedureStep, DicomTag.ScheduledProcedureStepLocation, result.ExamRoom); //T2
+                }
+
+                // Put blanks in for unsupported fields which are type 2 (i.e. must have a value even if NULL)
+                // In a real server, you may wish to support some or all of these, but they are not commonly supported
+                AddIfExistsInRequest(resultDataset, request, DicomTag.ReferencedStudySequence, new DicomDataset());         // Ref//d Study Sequence
+                AddIfExistsInRequest(resultDataset, request, DicomTag.Priority, "");                                  // Priority
+                AddIfExistsInRequest(resultDataset, request, DicomTag.PatientTransportArrangements, "");              // Transport Arrangements
+                AddIfExistsInRequest(resultDataset, request, DicomTag.AdmissionID, "");                               // Admission ID
+                AddIfExistsInRequest(resultDataset, request, DicomTag.CurrentPatientLocation, "");                    // Patient Location
+                AddIfExistsInRequest(resultDataset, request, DicomTag.ReferencedPatientSequence, new DicomDataset());       // Ref//d Patient Sequence
+                AddIfExistsInRequest(resultDataset, request, DicomTag.PatientWeight, "");                             // Weight
+                AddIfExistsInRequest(resultDataset, request, DicomTag.ConfidentialityConstraintOnPatientDataDescription, ""); // Confidentiality Constraint
+
+                // Send Reponse Back
+                yield return resultDataset;
+            }
+        }
+
+
+        //Splits patient name into 2 separte strings surname and forename and send then to the addstringcondition subroutine.
+        internal static IQueryable<WorklistItem> AddNameCondition(IQueryable<WorklistItem> exams, string dicomName)
+        {
+            if (string.IsNullOrEmpty(dicomName) || dicomName == "*")
+            {
+                return exams;
+            }
+
+            var personName = new DicomPersonName(DicomTag.PatientName, dicomName);
+            if (dicomName.Contains("*"))
+            {
+                var firstNameRegex = new Regex("^" + Regex.Escape(personName.First).Replace("\\*", ".*") + "$");
+                var lastNameRegex = new Regex("^" + Regex.Escape(personName.Last).Replace("\\*", ".*") + "$");
+                exams = exams.Where(x => firstNameRegex.IsMatch(x.Forename) || lastNameRegex.IsMatch(x.Surname));
+            }
+            else
+            {
+                exams = exams.Where(x => (x.Forename.Equals(personName.First) && x.Surname.Equals(personName.Last)));
+            }
+
+            return exams;
+        }
+
+
+        internal static IQueryable<WorklistItem> AddDateCondition(IQueryable<WorklistItem> exams, string dateCondition)
+        {
+            if (!string.IsNullOrEmpty(dateCondition) && dateCondition != "*")
+            {
+                var range = new DicomDateTime(DicomTag.ScheduledProcedureStepStartDate, dateCondition).Get<DicomDateRange>();
+                exams = exams.Where(x => range.Contains(x.ExamDateAndTime));
+            }
+            return exams;
+        }
+
+
+        internal static void AddIfExistsInRequest<T>(DicomDataset result, DicomDataset request, DicomTag tag, T value)
+        {
+            // Only send items which have been requested
+            if (request.Contains(tag))
+            {
+                if (value == null)
+                {
+                    value = default;
+                }
+
+                result.AddOrUpdate(tag, value);
+            }
+        }
+
+
+    }
+}

+ 27 - 0
Desktop/Worklist/Model/bean/View_PACS.cs

@@ -0,0 +1,27 @@
+using FreeSql.DataAnnotations;
+using System;
+
+public class View_PACS
+{
+    public string HISID { get; set; }
+    public string INPATIENTNO { get; set; }
+    public string LODGENO { get; set; }
+    public string NAME { get; set; }
+    public string SEX { get; set; }
+    public string BIRTHDATE { get; set; }
+    public string LODGESECTION { get; set; }
+    public string LODGEDOCTOR { get; set; }
+    public string AGE { get; set; }
+    public string CHECK_TYPE { get; set; }
+    public string PARTOFCHECK { get; set; }
+    public string DIRECTION { get; set; }
+    public string ADDRESS { get; set; }
+    public string RACE { get; set; }
+    public string PROFESSION { get; set; }
+    public string MARITALSTATUS { get; set; }
+    public string TELEPHONE { get; set; }
+    public string DEGREE { get; set; }
+    public string LODGEDATE { get; set; }
+    public string BEDNO { get; set; }
+    public string TIMES { get; set; }
+}

+ 1 - 1
Desktop/Worklist/Program.cs

@@ -43,7 +43,7 @@ namespace Worklist_SCP
         {
             try
             {
-                Thread.Sleep(10000);
+                    Thread.Sleep(10000);
             }
             catch (ThreadInterruptedException e)
             {

+ 21 - 1
Desktop/Worklist/Worklist.csproj

@@ -74,7 +74,22 @@
     <Reference Include="System.Management" />
     <Reference Include="System.Transactions" />
     <Reference Include="Newtonsoft.Json">
-      <HintPath>packages\Newtonsoft.Json.12.0.3\lib\net45\Newtonsoft.Json.dll</HintPath>
+      <HintPath>packages\Newtonsoft.Json.13.0.1\lib\net45\Newtonsoft.Json.dll</HintPath>
+    </Reference>
+    <Reference Include="Owin">
+      <HintPath>packages\Owin.1.0\lib\net40\Owin.dll</HintPath>
+    </Reference>
+    <Reference Include="FreeSql">
+      <HintPath>packages\FreeSql.2.5.200\lib\net45\FreeSql.dll</HintPath>
+    </Reference>
+    <Reference Include="System.Data.Common">
+      <HintPath>packages\System.Data.Common.4.3.0\lib\net451\System.Data.Common.dll</HintPath>
+    </Reference>
+    <Reference Include="System.Data.SqlClient">
+      <HintPath>packages\System.Data.SqlClient.4.8.2\lib\net451\System.Data.SqlClient.dll</HintPath>
+    </Reference>
+    <Reference Include="FreeSql.Provider.SqlServer">
+      <HintPath>packages\FreeSql.Provider.SqlServer.2.5.200\lib\net451\FreeSql.Provider.SqlServer.dll</HintPath>
     </Reference>
   </ItemGroup>
   <ItemGroup>
@@ -93,6 +108,8 @@
     <Compile Include="WorklistService.cs" />
     <Compile Include="Model\WorklistApiHandler.cs" />
     <Compile Include="Model\WorklistHandler.cs" />
+    <Compile Include="Model\WorklistSQLServerHandler.cs" />
+    <Compile Include="Model\bean\View_PACS.cs" />
   </ItemGroup>
   <ItemGroup>
     <None Include="App.config" />
@@ -101,6 +118,9 @@
       <CopyToOutputDirectory>Always</CopyToOutputDirectory>
     </None>
   </ItemGroup>
+  <ItemGroup>
+    <Folder Include="Model\bean\" />
+  </ItemGroup>
   <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
   <Import Project="packages\fo-dicom.Desktop.4.0.7\build\net45\fo-dicom.Desktop.targets" Condition="Exists('packages\fo-dicom.Desktop.4.0.7\build\net45\fo-dicom.Desktop.targets')" />
   <Import Project="..\..\packages\fo-dicom.Desktop.4.0.7\build\net45\fo-dicom.Desktop.targets" Condition="Exists('..\..\packages\fo-dicom.Desktop.4.0.7\build\net45\fo-dicom.Desktop.targets')" />

+ 3 - 0
Desktop/Worklist/WorklistService.cs

@@ -71,6 +71,9 @@ namespace Worklist_SCP
                 case "JSON":
                     exams = WorklistJsonHandler.FilterWorklistItems(request.Dataset);
                     break;
+                case "SQLServer":
+                    exams = WorklistSQLServerHandler.FilterWorklistItems(request.Dataset);
+                    break;
                 case "DB":
                     break;
                 default:

+ 8 - 1
Desktop/Worklist/packages.config

@@ -1,5 +1,12 @@
 <?xml version="1.0" encoding="utf-8"?>
 <packages>
   <package id="fo-dicom.Desktop" version="4.0.7" targetFramework="net452" />
-  <package id="Newtonsoft.Json" version="12.0.3" targetFramework="net452" />
+  <package id="FreeSql" version="2.5.200" targetFramework="net452" />
+  <package id="FreeSql.Provider.SqlServer" version="2.5.200" targetFramework="net452" />
+  <package id="Hangfire.Core" version="1.7.24" targetFramework="net452" />
+  <package id="Hangfire.SqlServer" version="1.7.24" targetFramework="net452" />
+  <package id="Newtonsoft.Json" version="13.0.1" targetFramework="net452" />
+  <package id="Owin" version="1.0" targetFramework="net452" />
+  <package id="System.Data.Common" version="4.3.0" targetFramework="net452" />
+  <package id="System.Data.SqlClient" version="4.8.2" targetFramework="net452" />
 </packages>