using HL7toXDocumentParser; using System; using System.Data; using System.Net; using System.Net.Sockets; using System.ServiceProcess; using System.Text; using System.Threading; using System.Windows.Forms; using System.Xml.Linq; namespace HL_FristAidPlatform_POCTWindowsService { public partial class POCTService : ServiceBase { #region 变量 /// /// 同步锁 /// private static object syncRoot = new object(); /// /// 日志文件路径 /// private string logPath = Application.StartupPath + @"\Log"; /// /// 日志文件 /// FileClass fileClass = new FileClass(); /// /// 时间格式字符 /// private string timeToString = "yyyy-MM-dd HH:mm:ss fff"; /// /// 初始化配置文件 /// Config config = new Config(); SqlDBHelper sqlDBHelp = new SqlDBHelper(); /// /// UDP网络层套接字 /// static Socket udpSocket; /// /// TCP网络层套接字 /// private static Socket tcpSocket; #endregion public POCTService() { InitializeComponent(); InitService(); } private void InitService() { StarServer(config.StrPort); } protected override void OnStart(string[] args) { MessageAdd(config.ServiceName + "已成功启动!"); } protected override void OnStop() { MessageAdd(config.ServiceName + "已停止!"); } protected override void OnContinue() { StarServer(config.StrPort); } /// /// 系统关闭 /// protected override void OnShutdown() { base.OnShutdown(); } private void StarServer(int strPort) { try { //点击开始监听时 在服务端创建一个负责监听IP和端口号的Socket tcpSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); IPAddress ip = IPAddress.Any; //创建对象端口 IPEndPoint point = new IPEndPoint(ip, strPort); tcpSocket.Bind(point);//绑定端口号 MessageAdd(string.Format("端口{0}监听成功! {1}", strPort, DateTime.Now.ToString(timeToString))); tcpSocket.Listen(100);//设置监听 //创建监听线程 Thread thread = new Thread(Listen); thread.IsBackground = true; thread.Start(tcpSocket); ////UDP接受消息 //udpSocket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); ////udpSocket.Bind(new IPEndPoint(IPAddress.Parse("192.168.1.113"), strPort)); //udpSocket.Bind(new IPEndPoint(IPAddress.Any, strPort)); //MessageAdd(string.Format("UDP端口{0}监听成功! {1}", strPort, DateTime.Now.ToString(timeToString))); //Thread t = new Thread(ReciveMsg); //t.Start(); } catch (Exception ex) { MessageAdd(string.Format("错误:端口{0}监听失败! {1},详细信息如下:\r\n{2}", strPort, DateTime.Now.ToString(timeToString), ex)); } } Socket socketSend; private void Listen(object o) { try { Socket socketWatch = o as Socket; socketSend = socketWatch.Accept(); MessageAdd(socketSend.RemoteEndPoint.ToString() + ":" + "连接成功!" + " " + DateTime.Now.ToString(timeToString)); //开启一个新线程,执行接收消息方法 Thread r_thread = new Thread(Received); r_thread.IsBackground = true; r_thread.Start(socketSend); } catch (Exception) { throw; } } /// /// 接收发送给本机ip对应端口号的数据报 /// private void ReciveMsg() { while (true) { MessageAdd("UDP线程启动"); EndPoint point = new IPEndPoint(IPAddress.Any, 0);//用来保存发送方的ip和端口号 byte[] buffer = new byte[1024]; int length = udpSocket.ReceiveFrom(buffer, ref point);//接收数据报 string str = Encoding.ASCII.GetString(buffer, 0, length); MessageAdd("UDP接受消息:" + point.ToString() + str); //时间统一 DateTime RecordingTime = DateTime.Now; string[] sHL7Lines = str.Split('\r'); MessageAdd(" 接收时间【 " + RecordingTime.ToString() + "】" + str); if (sHL7Lines.Length > 3) { //数据处理 DataProcessing(str, RecordingTime); } } } /// /// 服务器端不停的接收客户端发来的消息 /// /// private void Received(object o) { try { Socket socketSend = o as Socket; while (true) { DateTime RecordingTime = DateTime.Now; //客户端连接服务器成功后,服务器接收客户端发送的消息 byte[] buffer = new byte[1024]; //实际接收到的有效字节数 int len = socketSend.Receive(buffer, buffer.Length, 0); string str = ""; str += Encoding.UTF8.GetString(buffer, 0, len); if (str.Contains("PID")) { str = str.Replace("\v", ""); MessageAdd(" 接收时间【 " + RecordingTime.ToString() + "】" + str); Parser parser = new Parser(); XDocument xML = new XDocument(); xML = parser.Parse(str); if (xML.Root.Element("PID") != null) { MessageAdd(xML.ToString()); //数据处理 DataProcessing(xML, RecordingTime); } } } } catch (Exception ex) { MessageAdd(string.Format("错误:{0}:接收信息失败! {1},详细信息如下:\r\n{2}", socketSend.RemoteEndPoint, DateTime.Now.ToString(timeToString), ex)); } } /// /// 开始数据处理 /// /// 接收的字符 /// 时间:统一各步骤时间 private void DataProcessing(string dataStr, DateTime time) { string resultStr = ""; //开始数据处理 if (!string.IsNullOrEmpty(dataStr)) { string[] sHL7Lines = dataStr.Split('\r'); //单项目结果 if (sHL7Lines.Length == 10) { //病人信息 string[] PIDValueStr = sHL7Lines[1].Split('|'); string name = PIDValueStr[4].ToString();//姓名 //POCT结果 string[] OBXValueStr = sHL7Lines[3].Split('|'); string itemName = OBXValueStr[4].ToString();//项目名称 string result = OBXValueStr[5].ToString();//结果 string unit = OBXValueStr[6].ToString();//单位 string referenceRanges = OBXValueStr[7].ToString();//参考值范围 string notNormal = OBXValueStr[8].ToString();//不正常标记 string checkTime = OBXValueStr[14] + "";//检查时间 resultStr ="姓名"+ name +" 项目名称"+ itemName + " 项目结果" + result + " 检查时间" + checkTime+ " 参考值范围" + referenceRanges; MessageAdd(resultStr); Update(name, itemName, result, checkTime); } //肌钙三项结果 if (sHL7Lines.Length == 7) { string name = ""; for (int i = 0; i < sHL7Lines.Length; i++) { if (i==1) { string[] PIDValueStr = sHL7Lines[1].Split('|'); name = PIDValueStr[5].ToString();//姓名 } if (i == 3) { //POCT cTnI结果 string[] OBXValueStr = sHL7Lines[3].Split('|'); string itemName = OBXValueStr[4].ToString();//项目名称 string result = OBXValueStr[5].ToString();//结果 string unit = OBXValueStr[6].ToString();//单位 string referenceRanges = OBXValueStr[7].ToString();//参考值范围 string notNormal = OBXValueStr[8].ToString();//不正常标记 string checkTime = OBXValueStr[14] + "";//检查时间 Update(name, itemName, result, checkTime); } if (i == 4) { //POCT CK-MB结果 string[] OBXValueStr = sHL7Lines[3].Split('|'); string itemName = OBXValueStr[4].ToString();//项目名称 string result = OBXValueStr[5].ToString();//结果 string unit = OBXValueStr[6].ToString();//单位 string referenceRanges = OBXValueStr[7].ToString();//参考值范围 string notNormal = OBXValueStr[8].ToString();//不正常标记 string checkTime = OBXValueStr[14] + "";//检查时间 Update(name, itemName, result, checkTime); } if (i == 5) { //POCT Myo结果 string[] OBXValueStr = sHL7Lines[3].Split('|'); string itemName = OBXValueStr[4].ToString();//项目名称 string result = OBXValueStr[5].ToString();//结果 string unit = OBXValueStr[6].ToString();//单位 string referenceRanges = OBXValueStr[7].ToString();//参考值范围 string notNormal = OBXValueStr[8].ToString();//不正常标记 string checkTime = OBXValueStr[14] + "";//检查时间 Update(name, itemName, result, checkTime); } } } } else { } } /// /// xml方式处理数据 /// /// xml文档 /// 时间 private void DataProcessing(XDocument document, DateTime time) { string resultStr = ""; //病人信息 string name = document.Root.Element("PID").Element("PID.5").Value;//姓名 //开始数据处理 foreach (XElement item in document.Root.Elements("OBX")) { //POCT结果 string itemName = item.Element("OBX.4").Value; //项目名称 string result = item.Element("OBX.5").Value;//结果 string unit = item.Element("OBX.6").Value;//单位 string referenceRanges = item.Element("OBX.7").Value;//参考值范围 string checkTime = item.Element("OBX.14").Value;//检查时间 resultStr = "姓名" + name + " 项目名称" + itemName + " 项目结果" + result + " 检查时间" + checkTime + " 参考值范围" + referenceRanges; MessageAdd(resultStr); Update(name, itemName, result, checkTime); } } /// /// 日志记录 /// /// 内容 public void MessageAdd(string str) { try { fileClass.WriteLogFile(logPath, str);//写入记录日志 } catch { } } /// /// 更新 /// /// /// /// public void Update(string name,string itemName,string result,string time) { try { DataTable PatientDT = new DataTable(); string SqlStr = @"select top 1 GUID from T_Service_Patient where Name='{0}' order by ID desc"; SqlStr = string.Format(SqlStr, name); PatientDT = sqlDBHelp.GetDT(SqlStr, config.StrCon); if (PatientDT!=null) { if (itemName.ToUpper() == "CTNI") { sqlDBHelp.DoCom(@"update T_Service_ChestPain_CTNT set Value='" + result + "',Report_Time='" + time + "' where PatientGuid='" + PatientDT.Rows[0][0].ToString() + "'", config.StrCon); } if (itemName.ToUpper() == "CK-MB") { sqlDBHelp.DoCom(@"update T_Service_ChestPain_TreatmentInfo set CKMB_Value='" + result + "',Report_Time='" + time + "' where PatientGuid='" + PatientDT.Rows[0][0].ToString() + "'", config.StrCon); } if (itemName.ToUpper() == "MYO") { sqlDBHelp.DoCom(@"update T_Service_ChestPain_TreatmentInfo set MYO_Value='" + result + "',Report_Time='" + time + "' where PatientGuid='" + PatientDT.Rows[0][0].ToString() + "'", config.StrCon); } if (itemName.ToUpper() == "NT-PROBNP") { sqlDBHelp.DoCom(@"update T_Service_ChestPain_TreatmentInfo set NTproBNP_Value='" + result + "',Report_Time='" + time + "' where PatientGuid='" + PatientDT.Rows[0][0].ToString() + "'", config.StrCon); } if (itemName.ToUpper() == "BNP") { sqlDBHelp.DoCom(@"update T_Service_ChestPain_TreatmentInfo set BNP_Value='" + result + "',Report_Time='" + time + "' where PatientGuid='" + PatientDT.Rows[0][0].ToString() + "'", config.StrCon); } if (itemName.ToUpper() == "D-Dimer") { sqlDBHelp.DoCom(@"update T_Service_ChestPain_TreatmentInfo set Ddimer_Value='" + result + "',Report_Time='" + time + "' where PatientGuid='" + PatientDT.Rows[0][0].ToString() + "'", config.StrCon); } if (itemName.ToUpper() == "PCT") { } if (itemName.ToUpper() == "CRP") { } } } catch (Exception e) { MessageAdd(string.Format("更新数据库错误:{0} 时间: {1}", e.Message.ToString(), DateTime.Now.ToString(timeToString))); } } } }