StableVersion4.3/HL_FristAidPlatform_POCTWin.../POCTService.cs

378 lines
16 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

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