378 lines
16 KiB
C#
378 lines
16 KiB
C#
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 变量
|
||
/// <summary>
|
||
/// 同步锁
|
||
/// </summary>
|
||
private static object syncRoot = new object();
|
||
/// <summary>
|
||
/// 日志文件路径
|
||
/// </summary>
|
||
private string logPath = Application.StartupPath + @"\Log";
|
||
|
||
/// <summary>
|
||
/// 日志文件
|
||
/// </summary>
|
||
FileClass fileClass = new FileClass();
|
||
|
||
/// <summary>
|
||
/// 时间格式字符
|
||
/// </summary>
|
||
private string timeToString = "yyyy-MM-dd HH:mm:ss fff";
|
||
/// <summary>
|
||
/// 初始化配置文件
|
||
/// </summary>
|
||
Config config = new Config();
|
||
SqlDBHelper sqlDBHelp = new SqlDBHelper();
|
||
/// <summary>
|
||
/// UDP网络层套接字
|
||
/// </summary>
|
||
static Socket udpSocket;
|
||
/// <summary>
|
||
/// TCP网络层套接字
|
||
/// </summary>
|
||
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);
|
||
}
|
||
/// <summary>
|
||
/// 系统关闭
|
||
/// </summary>
|
||
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;
|
||
}
|
||
|
||
}
|
||
|
||
/// <summary>
|
||
/// 接收发送给本机ip对应端口号的数据报
|
||
/// </summary>
|
||
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);
|
||
}
|
||
}
|
||
}
|
||
|
||
/// <summary>
|
||
/// 服务器端不停的接收客户端发来的消息
|
||
/// </summary>
|
||
/// <param name="o"></param>
|
||
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));
|
||
}
|
||
}
|
||
/// <summary>
|
||
/// 开始数据处理
|
||
/// </summary>
|
||
/// <param name="dataStr">接收的字符</param>
|
||
/// <param name="time">时间:统一各步骤时间</param>
|
||
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
|
||
{
|
||
}
|
||
}
|
||
/// <summary>
|
||
/// xml方式处理数据
|
||
/// </summary>
|
||
/// <param name="document">xml文档</param>
|
||
/// <param name="time">时间</param>
|
||
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);
|
||
}
|
||
}
|
||
/// <summary>
|
||
/// 日志记录
|
||
/// </summary>
|
||
/// <param name="serviceName">内容</param>
|
||
public void MessageAdd(string str)
|
||
{
|
||
try
|
||
{
|
||
fileClass.WriteLogFile(logPath, str);//写入记录日志
|
||
}
|
||
catch
|
||
{
|
||
|
||
}
|
||
}
|
||
/// <summary>
|
||
/// 更新
|
||
/// </summary>
|
||
/// <param name="name"></param>
|
||
/// <param name="itemName"></param>
|
||
/// <param name="result"></param>
|
||
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)));
|
||
}
|
||
}
|
||
}
|
||
}
|