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)));
}
}
}
}