private ASTMManager.ASTMPatientInfo ASTM_ParesrPatientInfo(string astmdata) { ASTMManager.ASTMPatientInfo pi = new ASTMManager.ASTMPatientInfo(); pi.SampleInfo = new List <ASTMManager.ASTMSampleInfo>(); #region 解析ASTM申请样本信息 ASTM_Parser parser = new ASTM_Parser(); List <ASTM_Message> message = new List <ASTM_Message>(); parser.parse(astmdata, ref message); foreach (ASTM_Message am in message) { string[] tempdevice = am.f_sender.Split(new char[] { '^' }); pi.Device = tempdevice[0];//仪器 foreach (ASTM_Patient ap in am.patientRecords) { pi.PatientID = ap.f_laboratory_id;//病人ID string[] tempname = ap.f_name.Split(new char[] { '^' }); pi.PatientName = tempname.Length > 1 ? tempname[1] + tempname[0] : tempname[0]; string[] tempage = ap.f_birthdate.Split(new char[] { '^' }); pi.Age = tempage.Length > 1 ? Convert.ToInt16(tempage[1]) : -1; //年龄 pi.Sex = ap.f_sex; //性别 pi.ReservedField = ap.f_reserved; //血型 pi.Doctor = ap.f_physician_id; //医生 pi.SpecialField = ap.f_special_1; //症状 pi.Bed = ap.f_dialogCode; //病床 pi.PatientDiet = ap.f_diet; //血袋编号 pi.Location = ap.f_location; //病区 foreach (ASTM_Order ao in ap.orderRecords) { ASTMManager.ASTMSampleInfo si = new ASTMManager.ASTMSampleInfo(); si.ExtraInfo = new List <ASTMManager.ASTMExtraInfo>(); string[] tempid = ao.f_sample_id.Split(new char[] { '^' }); si.SampleID = tempid[0]; //样本ID si.BarCode = ao.f_sampled_at; //样本条形码 try { si.RequestedTime = DateTime.ParseExact(ao.f_created_at, "yyyyMMddHHmmss", System.Globalization.CultureInfo.CurrentCulture);//样本请求时间 } catch { si.RequestedTime = DateTime.Now; } try { si.TestTime = DateTime.ParseExact(ao.f_sampled_at, "yyyyMMddHHmmss", System.Globalization.CultureInfo.CurrentCulture);//样本测试时间 } catch { si.TestTime = DateTime.Now; } si.CollectedName = ao.f_collector; //样本采集者 si.SampleType = ao.f_biomaterial; //样本类型 string[] tempordername = ao.f_physician.Split(new char[] { '^' }); si.OrderingDoctor = tempordername.Length > 1 ? tempordername[1] + tempordername[0] : tempordername[0]; //送检医生 si.Department = ao.f_physician_phone; //送检科室 si.OfflineDilutionfactor = ao.f_user_field_1 == string.Empty ? 0 : Convert.ToInt16(ao.f_user_field_1); si.ReportType = ao.f_report_type; //报告类型 string[] temptest = ao.f_test.Split(new char[] { '\\' }); foreach (string temp in temptest) { ASTMManager.ASTMExtraInfo ex = new ASTMManager.ASTMExtraInfo(); string[] assay = temp.Split(new char[] { '^' }); switch (assay.Length) { case 1: { ex.ItemID = assay[0]; } break; case 2: { ex.ItemID = assay[0]; ex.ItemName = assay[1]; } break; case 3: { ex.ItemID = assay[0]; ex.ItemName = assay[1]; ex.ItemDilutionRate = assay[2]; } break; case 4: { ex.ItemID = assay[0]; ex.ItemName = assay[1]; ex.ItemDilutionRate = assay[2]; ex.ItemRepeatNum = assay[3]; } break; default: break; } si.ExtraInfo.Add(ex); } pi.SampleInfo.Add(si); } } } #endregion return(pi); }
private void sendSocket()//通过socket发送 { string ASTMMessage = string.Empty; string receiveString; byte receiveByte; string EndJudge = string.Empty;//字段检查 while (!ProcessASTMCancel.IsCancellationRequested) { if (astmManager.IsASTMAvailable) { #region 向ASTM发送样本测试结果 Statusbar.SBar.SoftStatus = GlobalVariable.miniBusy; // mini mode ASTMMessage = astmManager.GetASTMMessage(); //先把要发送的数据取出来 if (!GlobalVariable.IsOneWay) { #region 双向通信 Connect.sendSocketByte(ASTM_Commands.ENQ);//先发送ENQ receiveByte = Connect.receiveSocketByet(); if (receiveByte == ASTM_Commands.ENQ) { //此时双方都在发送ENQ命令争夺主模式,遵循仪器优先原则 Connect.sendSocketByte(ASTM_Commands.NAK); //发送NAK表示不接受LIS的主模式 receiveByte = Connect.receiveSocketByet(); //等待LIS发送ACK } if (receiveByte == ASTM_Commands.ACK) { //LIS应答ACK //此时仪器为主模式,仪器是从模式 if (Connect.sendSocket(ASTMMessage)) { ++Statusbar.SBar.SendNum; receiveByte = Connect.receiveSocketByet();//等待LIS发送应答ACK if (receiveByte == ASTM_Commands.ACK) { //如果应答ACK,则表示接受成功 //发送结束标识符EOT Connect.sendSocketByte(ASTM_Commands.EOT); ProcessASTMMessage.Invoke(astmManager.GetASTMSample_ID() + "Lis服务器接收成功\r\n", "LIS"); //发送成功 Statusbar.SBar.SoftStatus = GlobalVariable.miniWaiting; // mini mode Statusbar.SBar.SampleId = astmManager.GetASTMSample_ID(); // mini mode ++Statusbar.SBar.ReplyNum; UpdateDB.Invoke(astmManager.GetASTMSample_ID(), astmManager.GetASTMItem(), astmManager.GetASTMDevice(), astmManager.GetASTMSample_SendTime());//回调 } else { Statusbar.SBar.SoftStatus = GlobalVariable.miniError;// mini mode ProcessASTMMessage.Invoke(astmManager.GetASTMSample_ID() + "Lis服务器发送失败\r\n", "LIS"); } } else { Statusbar.SBar.SoftStatus = GlobalVariable.miniError;// mini mode ProcessASTMMessage.Invoke(astmManager.GetASTMSample_ID() + "Lis服务器发送失败\r\n", "LIS"); } } else { //LIS没有应答ACK,LIS连接错误 Statusbar.SBar.SoftStatus = GlobalVariable.miniError;// mini mode ProcessASTMMessage.Invoke(astmManager.GetASTMSample_ID() + "Lis服务器连接错误\r\n", "LIS"); } #endregion } else { #region 单向通信 if (Connect.sendSocket(ASTMMessage)) { ++Statusbar.SBar.SendNum; ProcessASTMMessage.Invoke(astmManager.GetASTMSample_ID() + "Lis服务器发送成功\r\n", "LIS"); //发送成功 Statusbar.SBar.SoftStatus = GlobalVariable.miniWaiting; // mini mode Statusbar.SBar.SampleId = astmManager.GetASTMSample_ID(); // mini mode UpdateDB.Invoke(astmManager.GetASTMSample_ID(), astmManager.GetASTMItem(), astmManager.GetASTMDevice(), astmManager.GetASTMSample_SendTime()); //回调 } else { Statusbar.SBar.SoftStatus = GlobalVariable.miniError; // mini mode ProcessASTMMessage.Invoke(astmManager.GetASTMSample_ID() + "Lis服务器发送失败\r\n", "LIS"); //发送成功 } #endregion } astmManager.RemoveASTM();//无论如何,最后都在队列删除掉这条数据 #endregion } else if (astmManager.IsASTMRequestSampleDataAvailable) { #region 向ASTM请求样本信息 Connect.sendSocketByte(ASTM_Commands.ENQ);//先发送ENQ receiveByte = Connect.receiveSocketByet(); if (receiveByte == ASTM_Commands.ENQ) { //此时双方都在发送ENQ命令争夺主模式,遵循仪器优先原则 Connect.sendSocketByte(ASTM_Commands.NAK); //发送NAK表示不接受LIS的主模式 receiveByte = Connect.receiveSocketByet(); //等待LIS发送ACK Statusbar.SBar.SoftStatus = GlobalVariable.miniBusy; // mini mode } if (receiveByte == ASTM_Commands.ACK) { //LIS应答ACK //此时仪器为主模式,仪器是从模式 ASTMMessage = astmManager.GetASTMRequestSampleDataMessage(); Connect.sendSocket(ASTMMessage); ++Statusbar.SBar.SendNum; receiveByte = Connect.receiveSocketByet();//等待LIS发送应答ACK if (receiveByte == ASTM_Commands.ACK) { //如果应答ACK,则表示接受成功 //发送结束标识符EOT Connect.sendSocketByte(ASTM_Commands.EOT); //此时进入中立模式 receiveByte = Connect.receiveSocketByet();//测试等待接收LIS发回来样本信息 if (receiveByte == ASTM_Commands.ENQ) { //应答ACK Connect.sendSocketByte(ASTM_Commands.ACK); //LIS开始为主模式,仪器为从模式 receiveString = Connect.receiveSocket();//接收样本申请信息 //接收到样本消息后,应答ACK Connect.sendSocketByte(ASTM_Commands.ACK); //然后等待LIS发送EOT结束命令 receiveByte = Connect.receiveSocketByet(); if (receiveByte == ASTM_Commands.EOT) { //样本查询和下载结束 //此时来验证是否有相应的样本信息 ASTM_Parser parser = new ASTM_Parser(); List <ASTM_Message> message = new List <ASTM_Message>(); try { parser.parse(receiveString, ref message); EndJudge = message[0].terminatorRecords[0].f_terminatorcode;//检查L字段 } catch { //解析出现异常 ProcessASTMMessage.Invoke(astmManager.GetASTMRequestSampleDataSample_ID() + "Lis服务器申请样本异常\r\n", "LIS"); Statusbar.SBar.SoftStatus = GlobalVariable.miniError;// mini mode } if (EndJudge == "I") { //LIS无相应样本信息 ProcessASTMMessage.Invoke(astmManager.GetASTMRequestSampleDataSample_ID() + "Lis服务器无相关样本信息\r\n", "LIS"); Statusbar.SBar.SoftStatus = GlobalVariable.miniError;// mini mode } else if (EndJudge == "N") { //LIS内有相应样本信息 ASTMManager.ASTMPatientInfo pi = ASTM_ParesrPatientInfo(receiveString); if (pi.SampleInfo.Count >= 1) { Statusbar.SBar.SampleId = pi.SampleInfo[0].SampleID; // mini mode } Statusbar.SBar.SoftStatus = GlobalVariable.miniWaiting; // mini mode RequestSampleData.BeginInvoke(pi, null, null); //委托出去 } else { //LIS 异常 Statusbar.SBar.SoftStatus = GlobalVariable.miniError;// mini mode ProcessASTMMessage.Invoke(astmManager.GetASTMRequestSampleDataSample_ID() + "Lis服务器申请样本异常\r\n", "LIS"); } } } } } astmManager.RemoveASTMRequestSampleData(); #endregion } else { #region LIS主动发送样本信息 //astmManager.ASTMSignal.Reset(); //持续监听LIS服务器 //LIS为主模式 仪器为从模式 receiveString = Connect.receiveSocket(); //接收到样本消息后,应答ACK Connect.sendSocketByte(ASTM_Commands.ACK); if (receiveString.Length > 10 && receiveString.IndexOf("H") != -1) { Statusbar.SBar.SoftStatus = GlobalVariable.miniBusy;// mini mode //传回来标准消息 //然后等待LIS发送EOT结束命令 receiveByte = Connect.receiveSocketByet(); if (receiveByte == ASTM_Commands.EOT) { //样本查询和下载结束 //此时来验证是否有相应的样本信息 ASTM_Parser parser = new ASTM_Parser(); List <ASTM_Message> message = new List <ASTM_Message>(); try { parser.parse(receiveString, ref message); EndJudge = message[0].patientRecords[0].orderRecords[0].f_report_type;//检查O字段的第26字段 } catch { //解析出现异常 Statusbar.SBar.SoftStatus = GlobalVariable.miniError;// mini mode ProcessASTMMessage.Invoke(astmManager.GetASTMRequestSampleDataSample_ID() + "Lis服务器主动发送样本信息异常\r\n", "LIS"); } if (EndJudge == "O") { //LIS内有相应样本信息 ASTMManager.ASTMPatientInfo pi = ASTM_ParesrPatientInfo(receiveString); if (pi.SampleInfo.Count >= 1) { Statusbar.SBar.SampleId = pi.SampleInfo[0].SampleID; // mini mode } Statusbar.SBar.SoftStatus = GlobalVariable.miniWaiting; // mini mode RequestSampleData.BeginInvoke(pi, null, null); //委托出去 } else { //LIS 异常 Statusbar.SBar.SoftStatus = GlobalVariable.miniError;// mini mode ProcessASTMMessage.Invoke(astmManager.GetASTMRequestSampleDataSample_ID() + "Lis服务器主动发送样本信息异常\r\n", "LIS"); } } } #endregion } } }