Пример #1
0
        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);
        }
Пример #2
0
        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
                }
            }
        }