Files
tj-tzhg/JJMediSys/Dispensing.cs
2025-11-26 17:21:18 +08:00

538 lines
20 KiB
C#
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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<PatientDatail> 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<PatientDatail> 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<ItemsShow> itemsShows = new List<ItemsShow>();
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)
{
}
}
}