using JJMediSys.cs; using JJServer; using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Runtime.InteropServices; using System.Text; using System.Threading; using System.Threading.Tasks; using System.Windows.Forms; //using BLECom; using static JJMediSys.AlertForm; using static JJMediSys.SystemSet; using Timer = System.Windows.Forms.Timer; namespace JJMediSys { public partial class Dispensing : Form { public static int JyxxId = 0; public const int HTCAPTION = 0x0002; public bool DispenseCancel =false; public bool DispenseRetry = false; public bool DispenseNext = false; public bool isStop = false; public bool WinClose = false; public int TimeDelay = 8; public string ErrorInfoStr = ""; public SystemSet fm1; public List mpatientDatails; //public BLECom.JJBLE jJBLE ; Timer timer2; [DllImport("Gdi32.dll", EntryPoint = "CreateRoundRectRgn")] private static extern IntPtr CreateRoundRectRgn ( int nLeftRect, // x-coordinate of upper-left corner int nTopRect, // y-coordinate of upper-left corner int nRightRect, // x-coordinate of lower-right corner int nBottomRect, // y-coordinate of lower-right corner int nWidthEllipse, // height of ellipse int nHeightEllipse // width of ellipse ); [DllImport("dwmapi.dll")] public static extern int DwmExtendFrameIntoClientArea(IntPtr hWnd, ref MARGINS pMarInset); [DllImport("dwmapi.dll")] public static extern int DwmSetWindowAttribute(IntPtr hwnd, int attr, ref int attrValue, int attrSize); [DllImport("dwmapi.dll")] public static extern int DwmIsCompositionEnabled(ref int pfEnabled); private bool m_aeroEnabled; // variables for box shadow private const int CS_DROPSHADOW = 0x00020000; private const int WM_NCPAINT = 0x0085; private const int WM_ACTIVATEAPP = 0x001C; public struct MARGINS // struct for box shadow { public int leftWidth; public int rightWidth; public int topHeight; public int bottomHeight; } private const int WM_NCHITTEST = 0x84; // variables for dragging the form private const int HTCLIENT = 0x1; protected override CreateParams CreateParams { get { m_aeroEnabled = CheckAeroEnabled(); CreateParams cp = base.CreateParams; if (!m_aeroEnabled) cp.ClassStyle |= CS_DROPSHADOW; return cp; } } private bool CheckAeroEnabled() { if (Environment.OSVersion.Version.Major >= 6) { int enabled = 0; DwmIsCompositionEnabled(ref enabled); return (enabled == 1) ? true : false; } return false; } protected override void WndProc(ref Message m) { switch (m.Msg) { case WM_NCPAINT: // box shadow if (m_aeroEnabled) { var v = 2; DwmSetWindowAttribute(this.Handle, 2, ref v, 4); MARGINS margins = new MARGINS() { bottomHeight = 1, leftWidth = 1, rightWidth = 1, topHeight = 1 }; DwmExtendFrameIntoClientArea(this.Handle, ref margins); } break; default: break; } base.WndProc(ref m); if (m.Msg == WM_NCHITTEST && (int)m.Result == HTCLIENT) // drag the form m.Result = (IntPtr)HTCAPTION; } public Dispensing(SystemSet form1,List patientDatails) { m_aeroEnabled = false; InitializeComponent(); fm1 = form1; mpatientDatails = patientDatails; ItemDetail.GetType().GetProperty ("DoubleBuffered", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic) .SetValue(ItemDetail, true, null); } private async void Dispensing_Load(object sender, EventArgs e) { IsDispensing = true; logger.Info("IsDispensing = true"); ItemDetail.AutoScroll = true; // 设置FlowLayoutPanel的内容自动换行 ItemDetail.WrapContents = true; if (SystemSet.DispenseWindowLocation.X == 9999) { int x = (Screen.PrimaryScreen.WorkingArea.Width - this.Width) / 2; int y = (Screen.PrimaryScreen.WorkingArea.Height - this.Height) / 2; SystemSet.DispenseWindowLocation = new Point(x, y); } SystemSet.CancelDispensing = false; // 设置窗口位置 this.Location = SystemSet.DispenseWindowLocation; TimeDelay = SystemSet.TimeDelay; Timer timer1 = new Timer(); timer1.Interval = 500; // 每隔500毫秒触发一次 timer1.Tick += timerforflash_Tick; // 绑定事件处理程序 timer1.Start(); // 启动定时器 int TotalPidCount = 0; int TotalNum = 0; foreach (PatientDatail patientDatail in mpatientDatails) { TotalPidCount++; TotalNum += patientDatail.ItemCount; } LabPIdTotal.Text = TotalPidCount.ToString(); LabSGTotal.Text = TotalNum.ToString(); LabMsg.Text = "请放入接管盒"; timer2 = new Timer(); timer2.Interval = 100; // 每隔500毫秒触发一次 timer2.Tick += timerforTask_Tick; // 绑定事件处理程序 timer2.Start(); // 启动定时器 } private void timerforTask_Tick(object sender, EventArgs e) { timer2.Stop(); Dispense(); } public async void Dispense() { int CurPersonID = 0; int CurTotalSgCount = 0; for (int i = 0; i < mpatientDatails.Count; i++) { DispenseCancel = false; DispenseRetry = false; DispenseNext = false; PatientDatail patientDatail = mpatientDatails[i]; List itemsShows = new List(); int SGcount = 0; int BQcount = 0; bool isAllRecp = true; foreach (JJServer.jyData jyData in patientDatail.jyDatas) { ItemsShow itemsShow = new ItemsShow(jyData); itemsShows.Add(itemsShow); if (jyData.bqtype==2) { BQcount++; } else { SGcount++; isAllRecp = false; } } //fm1.GetDeviceStatusNoUI(); StartCheckBox: this.Invoke((MethodInvoker)delegate { LabMsg.Text = "请放入接管盒"; labCurName.Text = patientDatail.PatientInfo.Name; labCurBed.Text = patientDatail.PatientInfo.BedNo; LabPIdCur.Text = (++CurPersonID).ToString(); labcurcount.Text = patientDatail.ItemCount.ToString(); labcurSGcount.Text = SGcount.ToString(); labcurBQcount.Text = BQcount.ToString(); ItemDetail.Controls.Clear(); ItemDetail.Controls.AddRange(itemsShows.ToArray()); ItemDetail.WrapContents = false; this.Update(); }); if(!isAllRecp) { while (!mTubeLabelTool.WaitTubeTakeBox() && !DispenseCancel) { await Task.Delay(500); } if (DispenseCancel) //手动取消 { logger.Info("取消发管!"); Task.Run(() => PublicStatic.EventMgr.ExcuteCmd($"insert into EVENTINFOLIST(Msg,Details,Time) Values('{"取消发管"}','发管信息 \r\n患者姓名:{patientDatail.PatientInfo.Name} \r\n试管数量:{ SGcount.ToString()} \r\n标签数量:{ BQcount.ToString()}','{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")}')")); this.Invoke((MethodInvoker)delegate { AlertForm.ShowAlert("取消发管", AlertType.Info, 3); }); this.Invoke((MethodInvoker)delegate { this.Closewin(); }); return; } } this.Invoke((MethodInvoker)delegate { LabMsg.Text = "正在处理中"; }); //if (SystemSet.UseBle) //{ // BleTask bleTask = new BleTask(); // if (!fm1.ExtBle) // { // jJBLE = new JJBLE(); // //扫码 获取盒子蓝牙地址 // JJBLE.BLEConnectionResult bleResult = await jJBLE.Matching(mTubeLabelTool.BleBarcodeStr); //连接蓝牙 // if (bleResult != JJBLE.BLEConnectionResult.Success) // { // ErrMsgShow errMsgShow = new ErrMsgShow(this); // ErrorInfoStr = "试管盒蓝牙连接失败,请重试"; // DialogResult result = errMsgShow.ShowDialog(); // if (result == DialogResult.Retry) // goto StartCheckBox; // else // { // this.Invoke((MethodInvoker)delegate // { // this.Closewin(); // }); // return; // } // } // bleTask.TargDevice = jJBLE.currentDevice; // } // bleTask.MACstr = mTubeLabelTool.BleBarcodeStr.Substring(mTubeLabelTool.BleBarcodeStr.Length - 17, 17); // string Bedno = ""; // if (patientDatail.PatientInfo.BedNo.Length == 6) // { // Bedno = patientDatail.PatientInfo.BedNo.Substring(3, 2) + "-" + patientDatail.PatientInfo.BedNo.Substring(5, 1); // } // else // Bedno = patientDatail.PatientInfo.BedNo; // bleTask.CodeStr = "D000000125040|#000000@D125000125040|#FF0000@D000045080030|#000000@TB16000010125030|C^#FFFFFF^24楼病区@T 10125002130020|C^#FFFFFF^浙江大学医学院附属@TB16125015130030|C^#FFFFFF^邵逸夫医院@TB16000050080030|R^#FFFFFF^床位号@TB16080050080040|L^#FF0000^" + Bedno + "@TB18150060110060|L^" + patientDatail.PatientInfo.Name + "@TB18120100150040|C^#FF0000^" + SGcount.ToString() + "管" + BQcount.ToString() + "签@B000085120025|J" + patientDatail.PatientInfo.CardNo + "@T 10015110120020|C^J" + patientDatail.PatientInfo.CardNo; // logger.Info("BLEImage:" + bleTask.CodeStr); // SystemSet.bleTaskQueue.Enqueue(bleTask); //} CurTotalSgCount = CurTotalSgCount + patientDatail.ItemCount; LabSgCur.Text = CurTotalSgCount.ToString(); string Result = ""; lock (locker) { if(patientDatail.jyDatas[0].bqtype==3) { Result = "0|"; } else { Result = mTubeLabelTool.Dispense(patientDatail); } } string[] Arr = Result.Split('|'); if (Arr[0] == "0") { logger.Info("发管成功!"); Task.Run(() => PublicStatic.EventMgr.ExcuteCmd($"insert into EVENTINFOLIST(Msg,Details,Time) Values('{"发管成功"}','发管信息 \r\n患者姓名:{patientDatail.PatientInfo.Name} \r\n试管数量:{ SGcount.ToString()} \r\n标签数量:{ BQcount.ToString()}','{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")}')")); this.Invoke((MethodInvoker)delegate { AlertForm.ShowAlert("发管成功", AlertType.Success, 3); }); this.Invoke((MethodInvoker)delegate { LabMsg.Text = "当前患者发管完成,共【" + patientDatail.ItemCount.ToString() + "】管,请取走接管盒"; logger.Info($"发管成功!i={i} mpatientDatails.Count={mpatientDatails.Count-1}"); if (fm1.AutoClose && i == mpatientDatails.Count-1) EnableTimer(); }); if(MainForm.ifWindowOpen("门诊采血")) { MZCY.ConformTask conformTask = new MZCY.ConformTask(); conformTask.orginDatas = patientDatail.OrginDatas; MZCY.ConformTaskQueue.Enqueue(conformTask); } while (!mTubeLabelTool.WaitTubeTakeBoxTaken() && !isCancel() && !isClose()) { await Task.Delay(500); } if (isCancel()) { logger.Info("取消发管!"); this.Invoke((MethodInvoker)delegate { AlertForm.ShowAlert("取消发管", AlertType.Info, 3); }); this.Invoke((MethodInvoker)delegate { Closewin(); }); return; } else if(isClose()|| i == mpatientDatails.Count - 1) { this.Invoke((MethodInvoker)delegate { logger.Info("CLose Window"); Closewin(); }); return; } } else { if (MainForm.ifWindowOpen("门诊采血")) { MZCY.ConformTask conformTask = new MZCY.ConformTask(); conformTask.orginDatas = patientDatail.OrginDatas; MZCY.ConformTaskQueue.Enqueue(conformTask); } logger.Info(string.Format("发管失败:{0}", Arr[1])); Task.Run(() => PublicStatic.EventMgr.ExcuteCmd($"insert into EVENTINFOLIST(Msg,Details,Time) Values('{"发管失败"}','发管信息 \r\n患者姓名:{patientDatail.PatientInfo.Name} \r\n试管数量:{ SGcount.ToString()} \r\n标签数量:{ BQcount.ToString()} \r\n错误信息:{ Arr[1]}','{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")}')")); this.Invoke((MethodInvoker)delegate { AlertForm.ShowAlert(string.Format("发管失败:{0}", Arr[1]), AlertType.Error, 3); }); this.Invoke((MethodInvoker)delegate { ErrorInfoStr = Arr[1];// "当前患者发管失败,共【" + patientDatail.ItemCount.ToString() + "】管,请核查"; LabMsg.Text = ErrorInfoStr; DispenseMsg dispenseMsg = new DispenseMsg(this); dispenseMsg.Show(); }); while (!isCancel() && !isRetry() && !isNext()) { await Task.Delay(500); } if (isNext()) continue; if (isRetry()) //重试 { logger.Info("isRetry"); i--; LabPIdCur.Text = (--CurPersonID).ToString(); CurTotalSgCount = CurTotalSgCount - patientDatail.ItemCount; LabSgCur.Text = CurTotalSgCount.ToString(); } if (isCancel()) { logger.Info("取消发管!"); Task.Run(() => PublicStatic.EventMgr.ExcuteCmd($"insert into EVENTINFOLIST(Msg,Details,Time) Values('{"取消发管"}','发管信息 \r\n患者姓名:{patientDatail.PatientInfo.Name} \r\n试管数量:{ SGcount.ToString()} \r\n标签数量:{ BQcount.ToString()}','{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")}')")); this.Invoke((MethodInvoker)delegate { AlertForm.ShowAlert("取消发管", AlertType.Info, 3); }); this.Invoke((MethodInvoker)delegate { Closewin(); }); return; } } } this.Invoke((MethodInvoker)delegate { Closewin(); }); return; } private void button1_Click(object sender, EventArgs e) { /*Form1.CancelDispensing = true; //手动点击终止后 ,TubeLabelTool.cs中的循环将退出 并返回手动取消状态 if (!isStop)//处于可手动终止状态 DispenseCancel = true; //*/ DispenseCancel = true; //Closewin(); } public bool isCancel() { return DispenseCancel; } public bool isRetry() { return DispenseRetry; } public bool isNext() { return DispenseNext; } public void EnableTimer() { timerForClose.Enabled = true; } public bool isClose() { return WinClose; } public void Closewin() { SystemSet.DispenseWindowLocation = new Point(this.Location.X, this.Location.Y); IsDispensing = false; logger.Info("IsDispensing = false"); this.Close(); } private void timerForClose_Tick(object sender, EventArgs e) { if (TimeDelay > 0) { LabTime.Text = TimeDelay.ToString(); } else { WinClose = true; } TimeDelay--; } private void timerforflash_Tick(object sender, EventArgs e) { try { this.Invoke((MethodInvoker)delegate { if (LabMsg.ForeColor == Color.Red) { LabMsg.ForeColor = Color.Black; } else { LabMsg.ForeColor = Color.Red; } }); } catch(Exception ex) { Console.WriteLine("timerforflash:" + ex.Message); } } private void LabMsg_Click(object sender, EventArgs e) { } } }