diff --git a/.gitignore b/.gitignore
index 3822d4b..92c0c12 100644
--- a/.gitignore
+++ b/.gitignore
@@ -362,4 +362,3 @@ MigrationBackup/
# Fody - auto-generated XML schema
FodyWeavers.xsd
/readme.txt
-/DM_Weight/Port/PortUtil.cs
diff --git a/DM_Weight/App.config b/DM_Weight/App.config
index 1726b99..6f88165 100644
--- a/DM_Weight/App.config
+++ b/DM_Weight/App.config
@@ -24,7 +24,7 @@
-
+
diff --git a/DM_Weight/Port/PortUtil.cs b/DM_Weight/Port/PortUtil.cs
new file mode 100644
index 0000000..8474d61
--- /dev/null
+++ b/DM_Weight/Port/PortUtil.cs
@@ -0,0 +1,1435 @@
+using log4net;
+using log4net.Repository.Hierarchy;
+using NetTaste;
+using Prism.Events;
+using Prism.Ioc;
+using SqlSugar;
+using System;
+using System.Collections.Generic;
+using System.ComponentModel.Design;
+using System.Configuration;
+using System.IO.Ports;
+using System.Linq;
+using System.Reflection.Metadata;
+using System.Speech.Synthesis;
+using System.Text;
+using System.Threading.Channels;
+using System.Threading.Tasks;
+using System.Timers;
+using System.Windows;
+using System.Windows.Markup;
+using System.Windows.Media.Animation;
+using Unity;
+using DM_Weight.msg;
+using DM_Weight.Views;
+using System.Reflection;
+using System.Threading;
+
+namespace DM_Weight.Port
+{
+ public class PortUtil
+ {
+ private readonly ILog logger = LogManager.GetLogger(typeof(PortUtil));
+ // 抽屉串口
+ public SerialPort drawerSerial;
+ // can总线串口
+ public SerialPort canBusSerial;
+
+ // 条码枪串口
+ public SerialPort scanCodeSerial;
+
+
+
+
+
+
+ // 抽屉串口协议232 | 485
+ private int _drawerProtocol = Convert.ToInt32(ConfigurationManager.AppSettings["DrawerProtocol"]);
+ // can总线耗材板地址
+ private int _doorAddr = Convert.ToInt32(ConfigurationManager.AppSettings["DoorAddr"]);
+ // 储物箱地址
+ private int _storageBoxAddr = Convert.ToInt32(ConfigurationManager.AppSettings["StorageBoxAddr"]);
+
+ // can总线串口是否存在
+ public bool _canBusExsit = Convert.ToBoolean(ConfigurationManager.AppSettings["CanBusExsit"]);
+
+ // 当前操作的抽屉号
+ public int DrawerNo { get; set; }
+ // 当前操作的库位号列表
+ public int[] ColNos { get; set; } = new int[] { };
+ // 当前操作的库位号列表
+ public int[] Stocks { get; set; } = new int[] { };
+
+
+
+ // 当前操作的窗口
+ public string WindowName { get; set; }
+ // 取药操作的窗口名【处方取药、抽屉取药、自选取药、调拨出库】
+ private string[] TakeNames = new string[] { "DrawerTakeDrugWindow", "OrderTakeDrugWindow", "SelfTakeDrugWindow", "InvoiceTakeDrugWindow" };
+ // 加药操作的窗口名【自选加药、抽屉加药、还药】
+ private string[] AddNames = new string[] { "SelfAddWindow", "ReturnDrugWindow", "ReturnDrug1Window", "DrawerAddDrugWindow", "AddDrugControl" };
+ // 盘点操作的窗口名【盘点】
+ private string[] CheckNames = new string[] { "CheckStockWindow", "CheckStockNewWindow" };
+ // 归还空瓶操作的窗口名【盘点】
+ private string[] ReturnEmptyNames = new string[] { "ReturnEmptyWindow" };
+
+ public int BoardType { get; set; } = 1;
+ public int DrawerType { get; set; } = 1;
+
+ private int[] BeforeQuantity { get; set; } = new int[] { };
+ private int[] AfterQuantity { get; set; } = new int[] { };
+
+ // 整体流程状态
+ private int statue { get; set; } = 0;
+
+
+ // 是否正在操作中
+ public bool Operate { get; set; }
+
+ public DateTime dateTime { get; set; } = DateTime.Now;
+
+
+ public async Task ResetData()
+ {
+ logger.Info($"重新设置串口数据状态【{statue}】,抽屉【{DrawerNo}】");
+ if (!"HomeWindow".Equals(WindowName) && statue == 1)
+ {
+ if (BoardType == 2)
+ {
+ // 灭灯
+ AllLightOff();
+ }
+ if (BoardType == 3)
+ {
+ // 失能
+ await BoxLockLightOff();
+ }
+ if (BoardType == 4)
+ {
+ // 失能
+ CloseStorage();
+ }
+ if (BoardType == 6)
+ {
+ // 失能
+ await BoxLockLightOff2();
+ }
+ if (BoardType == 5)
+ {
+ //await WriteQuantityArray();
+ }
+ }
+ Operate = false;
+ dateTime = DateTime.Now;
+ statue = 0;
+ BeforeQuantity = new int[9];
+ AfterQuantity = new int[9];
+ BoardType = 1;
+ DrawerType = 1;
+ WindowName = "";
+ DrawerNo = 0;
+ ColNos = new int[] { };
+ Stocks = new int[] { };
+ logger.Info($"重新设置串口数据状态结束");
+ }
+
+ public async void Start()
+ {
+ logger.Info($"进行抽屉操作抽屉号【{DrawerNo}】类型【{BoardType}】库位【{string.Join(",", ColNos)}】窗口【{WindowName}】");
+ Operate = true;
+
+ try
+ {
+ // 储物箱直接开
+ if (BoardType == 4)
+ {
+ byte[] result = await OpenStorage();
+ logger.Info($"储物箱使能返回:" + Convert.ToHexString(result));
+
+ int[] r = result.Select(it => Convert.ToInt32(it)).ToArray();
+ logger.Info($"储物箱使能返回:{Convert.ToHexString(result)}");
+ if (r[4] != 0)
+ {
+ logger.Info($"储物箱使能成功");
+ Thread.Sleep(50);
+ // 查询锁状态
+ GetBackDoorState();
+ }
+ else
+ {
+ string _WindowName = WindowName;
+ logger.Info($"储物箱使能失败r:" + string.Join("", r));
+ // 重新初始化数据
+ ResetData();
+ // 指令发送错误,未打开
+ // 返回消息 抽屉打开失败
+ _eventAggregator.GetEvent().Publish(new util.DeviceMsg()
+ {
+ EventType = util.EventType.OPENERROR,
+ WindowName = _WindowName,
+ Message = "储物箱使能失败"
+ });
+ }
+ }
+ else
+ {
+ // 外置抽屉
+ if (DrawerType == 3)
+ {
+ if (BoardType == 2)
+ {
+ byte[] buffer = await OpenRecover();
+ int[] r = buffer.Select(it => Convert.ToInt32(it)).ToArray();
+ if ((ColNos[0] > 3 && r[4] == 1) || (ColNos[0] < 4 && r[3] == 1))
+ {
+
+ // 告诉前台打开成功
+ _eventAggregator.GetEvent().Publish(new util.DeviceMsg()
+ {
+ EventType = util.EventType.DRAWEROPEN,
+ WindowName = WindowName,
+ });
+ logger.Info($"回收箱打开成功");
+
+ // 查询是否关闭状态
+ GeRecoverStatus();
+ }
+ else
+ {
+ string _WindowName = WindowName;
+ logger.Info($"回收箱打开失败");
+ // 重新初始化数据
+ ResetData();
+ // 返回消息开启失败
+ // 返回消息 抽屉打开失败
+ _eventAggregator.GetEvent().Publish(new util.DeviceMsg()
+ {
+ EventType = util.EventType.OPENERROR,
+ WindowName = _WindowName,
+ Message = "回收箱打开失败"
+ });
+ }
+ }
+ }
+ // 内置抽屉
+ else
+ {
+ if (BoardType == 2)
+ {
+ byte[] quantity = await CheckQuantityByDrawer();
+ BeforeQuantity = quantity.Select(it => Convert.ToInt32(it)).ToArray().Skip(3).Take(9).ToArray();
+ logger.Info($"BeforeQuantity{string.Join(",", BeforeQuantity)}");
+ }
+ if (BoardType == 6)
+ {
+ int[] quantity = await CheckQuantityByAddr2();
+ BeforeQuantity = quantity.Select(it => Convert.ToInt32(it)).ToArray();
+ logger.Info($"BeforeQuantity{string.Join(",", BeforeQuantity)}");
+ }
+
+
+ byte[] buffer = await OpenDrawer();
+ int[] r = buffer.Select(it => Convert.ToInt32(it)).ToArray();
+
+ logger.Info($"OpenDrawer{string.Join(",", r)}");
+ if (DrawerState(r))
+ {
+ statue = 1;
+ // 是不是单支抽屉
+ if (BoardType == 2)
+ {
+ // 取药
+ if (Array.IndexOf(TakeNames, WindowName) > -1)
+ {
+ // 有药位置亮灯
+ await HasLightOnByCol();
+ }
+ // 加药
+ if (Array.IndexOf(AddNames, WindowName) > -1)
+ {
+ // 无药位置亮灯
+ await NoLightOnByCol();
+ }
+ // 盘点
+ if (Array.IndexOf(CheckNames, WindowName) > -1)
+ {
+ // 不亮灯
+ }
+ // 空瓶
+ if (Array.IndexOf(ReturnEmptyNames, WindowName) > -1)
+ {
+ // 无药位置亮灯
+ await NoLightOnByCol();
+ }
+ }
+ // 药盒
+ if (BoardType == 3)
+ {
+ // 药盒指示灯使能
+ await BoxLockLightOn();
+ }
+ if (BoardType == 6)
+ {
+ // 药盒指示灯使能
+ await BoxLockLightOn2();
+ }
+ // 返回消息 抽屉已经打开
+ _eventAggregator.GetEvent().Publish(new util.DeviceMsg()
+ {
+ EventType = util.EventType.DRAWEROPEN,
+ WindowName = WindowName,
+ });
+ logger.Info($"抽屉【{DrawerNo}】打开成功");
+ // 查询抽屉状态
+ await Task.Delay(200);
+ GetDrawerStatus();
+
+ }
+ else
+ {
+ string _WindowName = WindowName;
+ // 重新初始化数据
+ ResetData();
+ // 返回消息 抽屉打开失败
+ _eventAggregator.GetEvent().Publish(new util.DeviceMsg()
+ {
+ EventType = util.EventType.OPENERROR,
+ WindowName = _WindowName,
+ Message = $"抽屉【{DrawerNo}】打开失败"
+ });
+ logger.Info($"抽屉【{DrawerNo}】打开失败");
+ }
+ }
+
+ }
+ }
+ catch (Exception ex)
+ {
+ string _WindowName = WindowName;
+ statue = 1;
+ logger.Info(ex.Message);
+ // 重新初始化数据
+ ResetData();
+ // 返回消息 抽屉打开失败
+ _eventAggregator.GetEvent().Publish(new util.DeviceMsg()
+ {
+ EventType = util.EventType.OPENERROR,
+ WindowName = _WindowName,
+ Message = $"操作异常{ex.Message}"
+ });
+ }
+
+ }
+
+ public async void GetDrawerStatus()
+ {
+ try
+ {
+
+ if (Operate)
+ {
+ // 查询抽屉状态
+ byte[] buffer = await CheckDrawerStatus();
+
+ int[] r = buffer.Select(it => Convert.ToInt32(it)).ToArray();
+
+ logger.Info($"GetDrawerStatus{string.Join(",", r)}");
+ // 抽屉没有关闭
+ if (DrawerState(r))
+ {
+ if (BoardType == 2)
+ {
+ // 继续查询抽屉药品数量
+ // 查询抽屉药品数量
+ byte[] quantity = await CheckQuantityByDrawer();
+ AfterQuantity = quantity.Select(it => Convert.ToInt32(it)).ToArray().Skip(3).Take(9).ToArray();
+ logger.Info($"AfterQuantity{string.Join(",", AfterQuantity)}");
+ int[] Quantitys = new int[BeforeQuantity.Length];
+ for (int i = 0; i < BeforeQuantity.Length; i++)
+ {
+ // 取药
+ if (Array.IndexOf(TakeNames, WindowName) > -1)
+ {
+ Quantitys[i] = BeforeQuantity[i] - AfterQuantity[i];
+ }
+ // 加药
+ if (Array.IndexOf(AddNames, WindowName) > -1)
+ {
+ Quantitys[i] = AfterQuantity[i] - BeforeQuantity[i];
+ }
+ // 盘点
+ if (Array.IndexOf(CheckNames, WindowName) > -1)
+ {
+ Quantitys[i] = AfterQuantity[i] - BeforeQuantity[i];
+ }
+ // 空瓶
+ if (Array.IndexOf(CheckNames, WindowName) > -1)
+ {
+ Quantitys[i] = AfterQuantity[i] - BeforeQuantity[i];
+ }
+
+ }
+ // 告诉前台数据变化
+ _eventAggregator.GetEvent().Publish(new util.DeviceMsg()
+ {
+ EventType = util.EventType.UPDATEQUANTITY,
+ WindowName = WindowName,
+ Quantitys = Quantitys
+ });
+ logger.Info($"单支板数量变化【{string.Join(",", Quantitys)}】");
+
+ }
+ if (BoardType == 6)
+ {
+ // 继续查询抽屉药品数量
+ // 查询抽屉药品数量
+ int[] quantity = await CheckQuantityByAddr2();
+ AfterQuantity = quantity.Select(it => Convert.ToInt32(it)).ToArray();
+ logger.Info($"AfterQuantity{string.Join(",", AfterQuantity)}");
+ int[] Quantitys = new int[BeforeQuantity.Length];
+ for (int i = 0; i < BeforeQuantity.Length; i++)
+ {
+ // 取药
+ if (Array.IndexOf(TakeNames, WindowName) > -1)
+ {
+ Quantitys[i] = BeforeQuantity[i] - AfterQuantity[i];
+ }
+ // 加药
+ if (Array.IndexOf(AddNames, WindowName) > -1)
+ {
+ Quantitys[i] = AfterQuantity[i] - BeforeQuantity[i];
+ }
+ // 盘点
+ if (Array.IndexOf(CheckNames, WindowName) > -1)
+ {
+ Quantitys[i] = AfterQuantity[i] - BeforeQuantity[i];
+ }
+ // 空瓶
+ if (Array.IndexOf(CheckNames, WindowName) > -1)
+ {
+ Quantitys[i] = AfterQuantity[i] - BeforeQuantity[i];
+ }
+
+ }
+ // 告诉前台数据变化
+ _eventAggregator.GetEvent().Publish(new util.DeviceMsg()
+ {
+ EventType = util.EventType.UPDATEQUANTITY,
+ WindowName = WindowName,
+ Quantitys = Quantitys
+ });
+ logger.Info($"单支板数量变化【{string.Join(",", Quantitys)}】");
+
+ }
+ // 继续监听抽屉状态
+ await Task.Delay(200);
+ GetDrawerStatus();
+ }
+ else
+ {
+ statue = 2;
+ if (BoardType == 2)
+ {
+ // 关灯
+ AllLightOff();
+
+ }
+ // 药盒
+ if (BoardType == 3)
+ {
+ // 药盒指示灯失能
+ await BoxLockLightOff();
+ }
+ if (BoardType == 6)
+ {
+ // 药盒指示灯使能
+ await BoxLockLightOff2();
+ }
+ string _WindowName = WindowName;
+ logger.Info($"抽屉【{DrawerNo}】已关闭");
+
+ // 重新初始化数据
+ await ResetData();
+ // 返回消息 抽屉已经关闭
+ _eventAggregator.GetEvent().Publish(new util.DeviceMsg()
+ {
+ EventType = util.EventType.DRAWERCLOSE,
+ WindowName = _WindowName,
+ });
+ }
+ }
+
+ }
+ catch (Exception ex)
+ {
+
+ string _WindowName = WindowName;
+ logger.Info($"GetDrawerStatus异常:{ex.Message}");
+ // 重新初始化数据
+ ResetData();
+ _eventAggregator.GetEvent().Publish(new util.DeviceMsg()
+ {
+ EventType = util.EventType.OPENERROR,
+ WindowName = _WindowName,
+ Message = $"GetDrawerStatus异常:{ex.Message}"
+ });
+ }
+ }
+
+
+ public async void GeRecoverStatus()
+ {
+ if (Operate)
+ {
+ byte[] buffer = await CheckRecoverStatus();
+ int[] r = buffer.Select(it => Convert.ToInt32(it)).ToArray();
+
+ logger.Info($"GeRecoverStatus{string.Join(",", r)}");
+
+ // 回收箱关闭成功
+ if ((ColNos[0] > 3 && r[4] == 0) || (ColNos[0] < 4 && r[3] == 0))
+ {
+ logger.Info($"回收箱关闭");
+ // 查询数量
+ byte[] bytes = await CheckRecoverQuantity();
+
+ int[] r1 = bytes.Select(it => Convert.ToInt32(it)).ToArray();
+ // 返回消息库位关闭,放入空瓶数量
+ int[] quantitys = r1.Skip(3).Take(3).ToArray();
+ int index = ColNos[0] % 3 > 0 ? ColNos[0] % 3 - 1 : 2;
+
+ // 指定库位放入的药品数量
+ int InCount = quantitys[index];
+ string _WindowName = WindowName;
+ // 重新初始化数据
+ ResetData();
+
+ logger.Info($"回收板数量变化【{string.Join(",", quantitys)}】");
+ _eventAggregator.GetEvent().Publish(new util.DeviceMsg()
+ {
+ EventType = util.EventType.DRAWERCLOSE,
+ Quantitys = new int[] { InCount },
+ WindowName = _WindowName,
+ });
+ }
+ else
+ {
+ // 查询是否关闭状态
+ await Task.Delay(200);
+ GeRecoverStatus();
+ }
+ }
+ }
+
+ public async void GetBackDoorState()
+ {
+ try
+ {
+ logger.Info($"Operate:{Operate}");
+ if (Operate)
+ {
+ byte[] result = await BackDoorState();
+
+ int[] r = result.Select(it => Convert.ToInt32(it)).ToArray();
+ int[] lockStates = CheckStorageStatus(r.Skip(3).Take(2).ToArray());
+ int[] lightStates = CheckStorageStatus(r.Skip(5).Take(2).ToArray());
+ logger.Info($"GetBackDoorState,lockStates:{string.Join(",", lockStates)},lightStates:{string.Join(",", lightStates)},_storageBoxAddr:{_storageBoxAddr},statue{statue}");
+
+ // 锁处于关闭状态
+ if (lockStates[_storageBoxAddr - 1] == 0)
+ {
+ // 锁还未打开过
+ if (statue == 0)
+ {
+ // 指示灯不闪烁了,说明规定时间内没有开锁,需要给前台提示
+ if (lightStates[_storageBoxAddr - 1] == 0)
+ {
+ // 打开失败
+ logger.Info($"储物箱指示灯不闪烁,使能过期");
+ }
+ else
+ {
+ // 灯在闪烁继续监听状态
+ GetBackDoorState();
+ }
+ }
+ else if (statue == 1)
+ {
+
+ // 锁是打开状态现在关闭了,说明操作完成了,告诉前台锁已关闭
+ statue = 2;
+
+ string _WindowName = WindowName;
+ logger.Info($"储物箱关闭");
+ // 重新初始化数据
+ ResetData();
+ _eventAggregator.GetEvent().Publish(new util.DeviceMsg()
+ {
+ EventType = util.EventType.DRAWERCLOSE,
+ WindowName = _WindowName,
+ });
+ }
+ }
+ // 锁处于打开状态
+ if (lockStates[_storageBoxAddr - 1] == 1)
+ {
+ // 锁还未打开过,说明打开成功了
+ if (statue == 0)
+ {
+ statue = 1;
+ // 告诉前台打开成功
+ _eventAggregator.GetEvent().Publish(new util.DeviceMsg()
+ {
+ EventType = util.EventType.DRAWEROPEN,
+ WindowName = WindowName,
+ });
+ logger.Info($"储物箱打开成功");
+ }
+ // 灯在闪烁继续监听状态
+ GetBackDoorState();
+ }
+ }
+
+
+ }
+ catch (Exception ex)
+ {
+ logger.Info($"GetBackDoorState异常{ex.Message}");
+ // 重新初始化数据
+ ResetData();
+ }
+ }
+
+
+ private readonly IEventAggregator _eventAggregator;
+
+ public PortUtil(IEventAggregator eventAggregator)
+ {
+ _eventAggregator = eventAggregator;
+ try
+ {
+ string DrawerPortPath = ConfigurationManager.AppSettings["DrawerPortPath"];
+ logger.Info($"打开抽屉串口【{DrawerPortPath}】");
+ drawerSerial = new SerialPort(DrawerPortPath, 9600, Parity.None, 8);
+ drawerSerial.Open();
+ logger.Info($"抽屉串口打开结果【{drawerSerial.IsOpen}】");
+ }
+ catch (Exception e)
+ {
+ logger.Error("抽屉串口打开错误" + e.Message);
+ }
+
+ try
+ {
+ string ScanCodePortPath = ConfigurationManager.AppSettings["ScanCodePortPath"];
+ logger.Info($"打开条码枪串口【{ScanCodePortPath}】");
+ scanCodeSerial = new SerialPort(ScanCodePortPath, 9600, Parity.None, 8);
+ scanCodeSerial.DataReceived += (object sender, System.IO.Ports.SerialDataReceivedEventArgs e) =>
+ {
+ string code = scanCodeSerial.ReadExisting();
+ _eventAggregator.GetEvent().Publish(new util.DeviceMsg()
+ {
+ EventType = util.EventType.CODESCAN,
+ Code = code,
+ });
+ };
+ scanCodeSerial.Open();
+ logger.Info($"条码枪串口打开结果【{scanCodeSerial.IsOpen}】");
+ }
+ catch (Exception e)
+ {
+ logger.Error("条码枪串口打开错误" + e.Message);
+ }
+ if (_canBusExsit)
+ {
+ try
+ {
+ string CanBusPortPath = ConfigurationManager.AppSettings["CanBusPortPath"];
+ logger.Info($"打开can总线串口【{CanBusPortPath}】");
+ canBusSerial = new SerialPort(CanBusPortPath, 57600, Parity.None, 8);
+ canBusSerial.Open();
+ logger.Info($"can总线串口打开结果【{canBusSerial.IsOpen}】");
+ }
+ catch (Exception e)
+ {
+ logger.Error("can总线串口打开错误" + e.Message);
+ }
+
+ }
+
+ }
+
+
+ private byte[] GetBufferByPort(SerialPort serialPort, int length, int timeout)
+ {
+ byte[] buffer = new byte[length];
+ //try
+ //{
+ int _length = 0;
+ DateTime start = DateTime.Now;
+ DateTime end = DateTime.Now;
+ while (_length != length && end.Subtract(start).TotalMilliseconds < timeout)
+ {
+ _length = serialPort.BytesToRead;
+ end = DateTime.Now;
+ }
+ if (_length != length)
+ {
+ if (_length != 0)
+ {
+ byte[] _buffer = new byte[_length];
+ serialPort.Read(_buffer, 0, _length);
+ logger.Info($"交互超时回复:{Convert.ToHexString(buffer)}");
+ }
+ throw new TimeoutException($"串口【{serialPort.PortName}】交互超时");
+ }
+ serialPort.Read(buffer, 0, length);
+ //}
+ //catch (Exception ex)
+ //{
+ // logger.Error($"GetBufferByPort:{ex.Message}");
+ //}
+ return buffer;
+ }
+ private byte[] GetBufferByPort(SerialPort serialPort, int length, int timeout, string operation)
+ {
+ byte[] buffer = new byte[length];
+ //try
+ //{
+ int _length = 0;
+ DateTime start = DateTime.Now;
+ DateTime end = DateTime.Now;
+ while (_length != length && end.Subtract(start).TotalMilliseconds < timeout)
+ {
+ _length = serialPort.BytesToRead;
+ if (_length == 0&& operation.Equals("开储物箱"))
+ {
+
+ _length = serialPort.BytesToRead;
+ if (_length == 0)
+ {
+ Thread.Sleep(500);
+ byte[] bufferWrite = new byte[] { 0xaa, (byte)(_doorAddr), 0x01, (byte)_storageBoxAddr, 0x00, 0x00, 0x00, 0xee };
+ canBusSerial.Write(bufferWrite, 0, 8);
+ logger.Info($"再次发送OpenStorage:{Convert.ToHexString(bufferWrite)};{end}");
+ }
+ }
+ end = DateTime.Now;
+ }
+ if (_length != length)
+ {
+ if (_length != 0)
+ {
+ byte[] _buffer = new byte[_length];
+ serialPort.Read(_buffer, 0, _length);
+ logger.Info($"交互超时回复:{Convert.ToHexString(buffer)},{operation}");
+ }
+ throw new TimeoutException($"串口【{serialPort.PortName}】交互超时,操作为{operation}");
+ }
+ serialPort.Read(buffer, 0, length);
+ //}
+ //catch (Exception ex)
+ //{
+ // logger.Error($"GetBufferByPort:{ex.Message}");
+ //}
+ return buffer;
+ }
+ private Task GetBufferByPort(SerialPort serialPort, int length)
+ {
+
+ return Task.Run(() => GetBufferByPort(serialPort, length, 3000));
+ }
+
+ private Task GetBufferByPort(SerialPort serialPort, int length, string operation)
+ {
+
+ return Task.Run(() => GetBufferByPort(serialPort, length, 3000, operation));
+ }
+
+ public static SpeechSynthesizer speechSynthesizer = new SpeechSynthesizer();
+ public void SpeakAsync(string textinfo)
+ {
+ speechSynthesizer.SpeakAsync(textinfo);
+ }
+
+
+
+ #region 抽屉串口操作
+ // 打开抽屉
+ public async Task OpenDrawer()
+ {
+ drawerSerial.DiscardInBuffer();
+ byte[] buffer = new byte[] { 0xaa, 0x41, (byte)DrawerNo, 0xee };
+ if (_drawerProtocol == 485)
+ {
+ if (DrawerNo > 8)
+ {
+ buffer = new byte[] { 0xaa, 0x21, (byte)(DrawerNo - 8), 0xee };
+ }
+ else
+ {
+ buffer = new byte[] { 0xaa, 0x11, (byte)DrawerNo, 0xee };
+ }
+
+ }
+ logger.Info($"打开抽屉,串口数据:{Convert.ToHexString(buffer)}");
+ drawerSerial.Write(buffer, 0, 4);
+
+ return await GetBufferByPort(drawerSerial, 11);
+ }
+
+ private bool DrawerState(int[] r)
+ {
+ int index = DrawerNo > 8 ? DrawerNo - 7 : DrawerNo + 1;
+ return r[index] == 0;
+ }
+
+ // 查询抽屉状态
+ public async Task CheckDrawerStatus()
+ {
+ drawerSerial.DiscardInBuffer();
+ byte[] buffer = new byte[] { 0xaa, 0x42, 0xee };
+ if (_drawerProtocol == 485)
+ {
+ if (DrawerNo > 8)
+ {
+ buffer = new byte[] { 0xaa, 0x22, 0xee };
+ }
+ else
+ {
+ buffer = new byte[] { 0xaa, 0x12, 0xee };
+ }
+
+ }
+
+ logger.Info($"查询抽屉状态,串口数据:{Convert.ToHexString(buffer)}");
+ drawerSerial.Write(buffer, 0, 3);
+
+ return await GetBufferByPort(drawerSerial, 11);
+ }
+ #endregion
+
+ #region can总线串口操作
+ #region 耗材板操作
+ // 后门状态
+ public async Task BackDoorState()
+ {
+
+ canBusSerial.DiscardInBuffer();
+ byte[] buffer = new byte[] { 0xaa, (byte)(_doorAddr), 0x02, 0x00, 0x00, 0x00, 0x00, 0xee };
+ canBusSerial.Write(buffer, 0, 8);
+
+ return await GetBufferByPort(canBusSerial, 8);
+
+ }
+ // 打开电控门储物箱(有灯使能)
+ public async Task OpenStorage()
+ {
+ canBusSerial.DiscardInBuffer();
+ byte[] buffer = new byte[] { 0xaa, (byte)(_doorAddr), 0x01, (byte)_storageBoxAddr, 0x00, 0x00, 0x00, 0xee };
+ canBusSerial.Write(buffer, 0, 8);
+ logger.Info($"OpenStorage:{Convert.ToHexString(buffer)}");
+
+
+
+ return await GetBufferByPort(canBusSerial, 8, "开储物箱");
+ }
+ // 关闭电控门储物箱(有灯失能)
+ public void CloseStorage()
+ {
+ byte[] buffer = new byte[] { 0xaa, (byte)(_doorAddr), 0x04, 0x00, 0x00, 0x00, 0x00, 0xee };
+ canBusSerial.Write(buffer, 0, 8);
+ }
+ // 打开普通储物箱(无灯)
+ public void OpenStorageBox()
+ {
+ byte[] buffer = new byte[] { 0xaa, (byte)(_storageBoxAddr), 0x03, 0x00, 0x00, 0x00, 0x00, 0xee };
+ canBusSerial.Write(buffer, 0, 8);
+ }
+ // 关闭普通储物箱(无灯)
+ public void CloseStorageBox()
+ {
+ byte[] buffer = new byte[] { 0xaa, (byte)(_storageBoxAddr), 0x04, 0x00, 0x00, 0x00, 0x00, 0xee };
+ canBusSerial.Write(buffer, 0, 8);
+ }
+
+ private int[] CheckStorageStatus(int[] data)
+ {
+ int a = data[0];
+ int b = data[1];
+ int[] intA = Decimal2Chunks(a);
+ int[] intB = Decimal2Chunks(b);
+ int[] r = new int[intA.Length + intB.Length];
+ Array.Copy(intA, 0, r, 0, intA.Length);
+ Array.Copy(intB, 0, r, intA.Length, intB.Length);
+ return r;
+ }
+ private int[] Decimal2Chunks(int d)
+ {
+ string s = Convert.ToString(d, 2);
+ int[] chars = new int[8];
+ char[] schar = s.ToCharArray();
+ Array.Reverse(schar);
+ int[] iArray = Array.ConvertAll(schar, c => (int)Char.GetNumericValue(c));
+ int[] addArray = new int[8 - iArray.Length];
+ if (iArray.Length < 8)
+ {
+ for (int i = 0; i < 8 - iArray.Length; i++)
+ {
+ addArray[i] = 0;
+ }
+ chars = iArray.Concat(addArray).ToArray();
+ }
+ else
+ {
+ chars = iArray[0..iArray.Length];
+ }
+ return chars;
+ //List t = s.Split().Select(it => Convert.ToInt32(it)).Reverse().ToList();
+ //while (t.Count < 8)
+ //{
+ // t.Add(0);
+ //}
+ //return t.ToArray();
+ }
+
+ #endregion
+
+ #region 单支操作
+ // 以抽屉为单位获取抽屉内所有库位的药品数量
+ public async Task CheckQuantityByDrawer()
+ {
+ canBusSerial.DiscardInBuffer();
+
+ byte[] buffer = new byte[] { 0xaa, (byte)(0xf0 + DrawerNo), 0x01, 0x00, 0x00, 0x00, 0x00, 0xee };
+
+ logger.Info($"单支板发送库位数量查询【{Convert.ToHexString(buffer)}】");
+ canBusSerial.Write(buffer, 0, 8);
+
+ return await GetBufferByPort(canBusSerial, 13);
+ }
+ // 获取单个单支板药品数量
+ public async Task CheckQuantityByCol(int DrawerNo, int colNo)
+ {
+ canBusSerial.DiscardInBuffer();
+
+ var channel = Convert.ToInt32((DrawerNo * 10 + colNo).ToString(), 16);
+ byte[] buffer = new byte[] { 0xaa, (byte)channel, 0x08, 0x00, 0x00, 0x00, 0x00, 0xee };
+ canBusSerial.Write(buffer, 0, 8);
+
+ return await GetBufferByPort(canBusSerial, 8);
+
+ }
+ // 以抽屉为单位有药位置亮灯
+ public void HasLightOnByDrawer()
+ {
+ byte[] buffer = new byte[] { 0xaa, (byte)(0xf0 + DrawerNo), 0x02, 0x00, 0x00, 0x00, 0x00, 0xee };
+ canBusSerial.Write(buffer, 0, 8);
+ }
+ // 以抽屉为单位无药位置亮灯
+ public void NoLightOnByDrawer()
+ {
+ byte[] buffer = new byte[] { 0xaa, (byte)(0xf0 + DrawerNo), 0x03, 0x00, 0x00, 0x00, 0x00, 0xee };
+ canBusSerial.Write(buffer, 0, 8);
+ }
+ // 以抽屉为单位灭灯
+ public void LightOffByDrawer()
+ {
+ byte[] buffer = new byte[] { 0xaa, (byte)(0xf0 + DrawerNo), 0x06, 0x00, 0x00, 0x00, 0x00, 0xee };
+ canBusSerial.Write(buffer, 0, 8);
+ }
+ // 以单支板为单位有药位置亮灯
+ public async Task HasLightOnByCol()
+ {
+
+ for (int i = 0; i < ColNos.Length; i++)
+ {
+
+ var channel = Convert.ToInt32((DrawerNo * 10 + ColNos[i]).ToString(), 16);
+ byte[] buffer = new byte[] { 0xaa, (byte)channel, 0x0a, 0x00, 0x00, 0x00, 0x00, 0xee };
+ canBusSerial.Write(buffer, 0, 8);
+ await Task.Delay(TimeSpan.FromMilliseconds(20));
+ }
+
+ }
+ // 以单支板为单位无药位置亮灯
+ public async Task NoLightOnByCol()
+ {
+ for (int i = 0; i < ColNos.Length; i++)
+ {
+ var channel = Convert.ToInt32((DrawerNo * 10 + ColNos[i]).ToString(), 16);
+ byte[] buffer = new byte[] { 0xaa, (byte)channel, 0x0b, 0x00, 0x00, 0x00, 0x00, 0xee };
+ canBusSerial.Write(buffer, 0, 8);
+ await Task.Delay(TimeSpan.FromMilliseconds(20));
+ }
+ }
+ // 广播灭灯
+ public void AllLightOff()
+ {
+ byte[] buffer = new byte[] { 0xaa, 0xff, 0x07, 0x00, 0x00, 0x00, 0x00, 0xee };
+ canBusSerial.Write(buffer, 0, 8);
+ }
+ #endregion
+
+ #region 药盒操作
+ // 指定药盒指示灯开启使能开锁
+ public async Task BoxLockLightOn()
+ {
+ for (int i = 0; i < ColNos.Length; i++)
+ {
+
+ var channel = Convert.ToInt32((DrawerNo * 10 + ColNos[i]).ToString(), 16);
+ byte[] buffer = new byte[] { 0xaa, (byte)channel, 0x03, 0x00, 0x00, 0x00, 0x00, 0xee };
+ canBusSerial.Write(buffer, 0, 8);
+ await Task.Delay(TimeSpan.FromMilliseconds(20));
+ }
+ }
+ // 指定药盒指示灯开启失能开锁
+ public async Task BoxLockLightOff()
+ {
+ for (int i = 0; i < ColNos.Length; i++)
+ {
+ var channel = Convert.ToInt32((DrawerNo * 10 + ColNos[i]).ToString(), 16);
+ byte[] buffer = new byte[] { 0xaa, (byte)channel, 0x04, 0x00, 0x00, 0x00, 0x00, 0xee };
+ canBusSerial.Write(buffer, 0, 8);
+ await Task.Delay(TimeSpan.FromMilliseconds(20));
+ }
+ }
+ // 指定药盒状态查询
+ public async Task BoxLockState(int ColNo)
+ {
+ canBusSerial.DiscardInBuffer();
+ var channel = Convert.ToInt32((DrawerNo * 10 + ColNo).ToString(), 16);
+ byte[] buffer = new byte[] { 0xaa, (byte)channel, 0x02, 0x00, 0x00, 0x00, 0x00, 0xee };
+ canBusSerial.Write(buffer, 0, 8);
+
+ return await GetBufferByPort(canBusSerial, 8);
+
+ }
+ // 以抽屉为单位药盒指示灯开启使能开锁
+ public void BoxLockLightOnByDrawer()
+ {
+ canBusSerial.DiscardInBuffer();
+ byte[] buffer = new byte[] { 0xaa, (byte)(0xf0 + DrawerNo), 0x04, 0x00, 0x00, 0x00, 0x00, 0xee };
+ canBusSerial.Write(buffer, 0, 8);
+ }
+ // 以抽屉为单位药盒指示灯开启失能开锁
+ public void BoxLockLightOffByDrawer()
+ {
+ canBusSerial.DiscardInBuffer();
+ byte[] buffer = new byte[] { 0xaa, (byte)(0xf0 + DrawerNo), 0x05, 0x00, 0x00, 0x00, 0x00, 0xee };
+ canBusSerial.Write(buffer, 0, 8);
+ }
+ #endregion
+
+ private string trim(string text)
+ {
+ //此处使用了转义字符如:\',\",\\,分别表示单引号,双引号,反斜杠
+ char[] TrimChar = { ' ', '-', '\'', '\"', '\\', '(', ')', '(', ')', '①', '②' };
+ return text.Trim(TrimChar);
+ }
+
+ #region 2.4寸汉显屏
+ // 基础数据写入方法
+ public void WriteChannelInfo(int type, string content, int drawerNo, int colNo)
+ {
+ try
+ {
+ logger.Info($"写标签数据:{type}-{content}-{drawerNo}-{colNo}");
+ canBusSerial.DiscardInBuffer();
+ Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);
+ byte[] contentBuf = Encoding.GetEncoding("gb2312").GetBytes(trim(content));
+ int channel = ((drawerNo > 8 ? (drawerNo - 8) * 2 : (drawerNo * 2 - 1)) - 1) * this.labelCount + 10 + colNo;
+ if (contentBuf.Length % 2 != 0)
+ {
+ Array.Resize(ref contentBuf, contentBuf.Length + 1);
+ }
+ byte[] buffer = new byte[] { 0xaa, (byte)channel, 1, (byte)type, 0, 0, 0, 0xee };
+ logger.Info($"buffer:{Convert.ToHexString(buffer)}");
+ canBusSerial.Write(buffer, 0, 8);
+ //await Task.Delay(20);
+ Thread.Sleep(20);
+ buffer[4] = 1;
+ for (int i = 0; i < contentBuf.Length; i += 2)
+ {
+ buffer[5] = contentBuf[i];
+ buffer[6] = contentBuf[i + 1];
+ canBusSerial.Write(buffer, 0, 8);
+ logger.Info($"buffer:{Convert.ToHexString(buffer)}");
+ //await Task.Delay(20);
+ Thread.Sleep(20);
+ }
+ buffer[4] = 2;
+ buffer[5] = 0;
+ buffer[6] = 0;
+ canBusSerial.Write(buffer, 0, 8);
+ //await Task.Delay(20);
+ Thread.Sleep(20);
+ }
+ catch (Exception ex)
+ {
+ _eventAggregator.GetEvent().Publish(new util.DeviceMsg()
+ {
+ EventType = util.EventType.OPENERROR,
+ WindowName = WindowName,
+ Message = $"2.4寸汉显屏异常{ex.Message}"
+ });
+ logger.Info($"2.4寸汉显屏异常:ex:{ex.Message}");
+ }
+ }
+
+ // 清除显示内容
+ public void ClearContent(int drawerNo, int colNo)
+ {
+ canBusSerial.DiscardInBuffer();
+ int channel = ((drawerNo > 8 ? (drawerNo - 8) * 2 : (drawerNo * 2 - 1)) - 1) * this.labelCount + 10 + colNo;
+ byte[] buffer = new byte[] { 0xaa, (byte)channel, 4, 0, 0, 0, 0, 0xee };
+ canBusSerial.Write(buffer, 0, 8);
+ }
+ // 刷新显示内容
+ public void ShowContent(int drawerNo, int colNo)
+ {
+ try
+ {
+
+ canBusSerial.DiscardInBuffer();
+ int channel = ((drawerNo > 8 ? (drawerNo - 8) * 2 : (drawerNo * 2 - 1)) - 1) * this.labelCount + 10 + colNo;
+ byte[] buffer = new byte[] { 0xaa, (byte)channel, 2, 0, 0, 0, 0, 0xee };
+ logger.Info($"刷新显示内容buffer:{Convert.ToHexString(buffer)}");
+ canBusSerial.Write(buffer, 0, 8);
+ }
+ catch (Exception ex)
+ {
+ _eventAggregator.GetEvent().Publish(new util.DeviceMsg()
+ {
+ EventType = util.EventType.OPENERROR,
+ WindowName = WindowName,
+ Message = $"刷新显示内容异常{ex.Message}"
+ });
+ logger.Info($"刷新显示内容异常:ex:{ex.Message}");
+ }
+ }
+ // 取药或者加药亮灯
+ public void TakeQuantity(int drawerNo, int colNo, int quantity, int stock)
+ {
+ try
+ {
+ logger.Info($"TakeQuantity{drawerNo}-{colNo},操作数量{quantity},操作后数量{stock}");
+
+ canBusSerial.DiscardInBuffer();
+ //int channel = (drawerNo * 10 + colNo);
+ int channel = ((drawerNo > 8 ? (drawerNo - 8) * 2 : (drawerNo * 2 - 1)) - 1) * this.labelCount + 10 + colNo;
+ byte[] buffer = new byte[] { 0xaa, (byte)channel, 6, 0, 0, 0, 0, 0xee };
+ buffer[3] = (byte)(quantity >> 8);
+ buffer[4] = (byte)(quantity & 0xff);
+ buffer[5] = (byte)(stock >> 8);
+ buffer[6] = (byte)(stock & 0xff);
+ canBusSerial.Write(buffer, 0, 8);
+
+
+
+ }
+ catch (Exception ex)
+ {
+ _eventAggregator.GetEvent().Publish(new util.DeviceMsg()
+ {
+ EventType = util.EventType.OPENERROR,
+ WindowName = WindowName,
+ Message = $"操作发生异常{ex.Message}"
+ });
+ logger.Info($"操作发生异常:ex:{ex.Message}");
+ }
+ }
+ // 写入数量
+ public void WriteQuantity(int drawerNo, int colNo, int quantity)
+ {
+ try
+ {
+ logger.Info($"写入数量:{drawerNo}-{colNo}-{quantity}");
+ canBusSerial.DiscardInBuffer();
+ int channel = ((drawerNo > 8 ? (drawerNo - 8) * 2 : (drawerNo * 2 - 1)) - 1) * this.labelCount + 10 + colNo;
+ byte[] buffer = new byte[] { 0xaa, (byte)channel, 0x21, 0, 0, 0, 0, 0xee };
+ buffer[5] = (byte)(quantity >> 8);
+ buffer[6] = (byte)(quantity & 0xff);
+ logger.Info($"写入数量buffer:{Convert.ToHexString(buffer)}");
+ canBusSerial.Write(buffer, 0, 8);
+ //Task task = GetBufferByPort(canBusSerial, 8);
+ //if (task.Status == TaskStatus.Created)
+ //{
+ // task.Start();
+
+ //}
+ //byte[] bytes = task.Result;
+ //logger.Info($"写入数量返回:" + Convert.ToHexString(bytes));
+ }
+ catch (Exception ex)
+ {
+ _eventAggregator.GetEvent().Publish(new util.DeviceMsg()
+ {
+ EventType = util.EventType.OPENERROR,
+ WindowName = WindowName,
+ Message = $"操作发生异常{ex.InnerException}"
+ });
+ logger.Info($"操作发生异常:ex:{ex.InnerException}");
+ }
+ }
+ // 写入数量
+ public async void WriteQuantityAsync(int drawerNo, int colNo, int quantity)
+ {
+ try
+ {
+ canBusSerial.DiscardInBuffer();
+ int channel = ((drawerNo > 8 ? (drawerNo - 8) * 2 : (drawerNo * 2 - 1)) - 1) * this.labelCount + 10 + colNo;
+ byte[] buffer = new byte[] { 0xaa, (byte)channel, 0x21, 0, 0, 0, 0, 0xee };
+ buffer[5] = (byte)(quantity >> 8);
+ buffer[6] = (byte)(quantity & 0xff);
+ canBusSerial.Write(buffer, 0, 8);
+ byte[] bufferReturn = await GetBufferByPort(canBusSerial, 8);
+ logger.Info($"写入数量返回:" + Convert.ToHexString(bufferReturn));
+ }
+ catch (Exception ex)
+ {
+ _eventAggregator.GetEvent().Publish(new util.DeviceMsg()
+ {
+ EventType = util.EventType.OPENERROR,
+ WindowName = WindowName,
+ Message = $"操作发生异常{ex.Message}"
+ });
+ logger.Info($"操作发生异常:ex:{ex.Message}");
+ }
+ }
+ public async Task WriteQuantityArray()
+ {
+ for (int i = 0; i < ColNos.Length; i++)
+ {
+ WriteQuantity(DrawerNo, ColNos[i], Stocks[i]);
+ await Task.Delay(TimeSpan.FromMilliseconds(20));
+ }
+ }
+
+
+ #endregion
+
+ #region 回收箱操作
+ // 打开回收箱
+ public async Task OpenRecover()
+ {
+ try
+ {
+ canBusSerial.DiscardInBuffer();
+ byte[] buffer = new byte[] { 0xAA, 0x9A, 0x04, 0x00, 0x00, 0x00, 0x00, 0xEE };
+ canBusSerial.Write(buffer, 0, 8);
+
+ return await GetBufferByPort(canBusSerial, 8, "打开回收箱");
+ }
+ catch (Exception ex)
+ {
+ _eventAggregator.GetEvent().Publish(new util.DeviceMsg()
+ {
+ EventType = util.EventType.OPENERROR,
+ WindowName = WindowName,
+ Message = $"操作发生异常{ex.Message}"
+ });
+ logger.Info($"操作发生异常:ex:{ex.Message}");
+ return null;
+ }
+
+ }
+ // 回收箱状态查询
+ public async Task CheckRecoverStatus()
+ {
+ try
+ {
+
+ canBusSerial.DiscardInBuffer();
+ byte[] buffer = new byte[] { 0xAA, 0x9A, 0x03, 0x00, 0x00, 0x00, 0x00, 0xEE };
+ canBusSerial.Write(buffer, 0, 8);
+
+ return await GetBufferByPort(canBusSerial, 8);
+ }
+ catch (Exception ex)
+ {
+ _eventAggregator.GetEvent().Publish(new util.DeviceMsg()
+ {
+ EventType = util.EventType.OPENERROR,
+ WindowName = WindowName,
+ Message = $"操作发生异常{ex.Message}"
+ });
+ logger.Info($"操作发生异常:ex:{ex.Message}");
+ return null;
+
+ }
+ }
+ // 回收箱回收数量查询
+ public async Task CheckRecoverQuantity()
+ {
+ try
+ {
+ canBusSerial.DiscardInBuffer();
+ byte[] buffer = new byte[] { 0xAA, 0x9A, (byte)(ColNos[0] > 3 ? 2 : 1), 0x00, 0x00, 0x00, 0x00, 0xEE };
+ canBusSerial.Write(buffer, 0, 8);
+
+ return await GetBufferByPort(canBusSerial, 8);
+
+ }
+ catch (Exception ex)
+ {
+ _eventAggregator.GetEvent().Publish(new util.DeviceMsg()
+ {
+ EventType = util.EventType.OPENERROR,
+ WindowName = WindowName,
+ Message = $"操作发生异常{ex.Message}"
+ });
+ logger.Info($"操作发生异常:ex:{ex.Message}");
+ return null;
+ }
+ }
+ #endregion
+
+ #region 称重操作
+ // 以板子为单位获取抽屉内所有库位的药品数量
+ public async Task CheckQuantityByAddr()
+ {
+
+ canBusSerial.DiscardInBuffer();
+ var channel = Convert.ToInt32((DrawerNo * 10 + 1).ToString(), 16);
+ byte[] buffer = new byte[] { 0xaa, (byte)(channel), 0x28, 0x00, 0x00, 0x00, 0x00, 0xee };
+ logger.Info($"称重发送库位数量查询1【{Convert.ToHexString(buffer)}】");
+ canBusSerial.Write(buffer, 0, 8);
+ byte[] result1 = await GetBufferByPort(canBusSerial, 8);
+
+
+ var channel2 = Convert.ToInt32((DrawerNo * 10 + 2).ToString(), 16);
+ byte[] buffer2 = new byte[] { 0xaa, (byte)(channel2), 0x28, 0x00, 0x00, 0x00, 0x00, 0xee };
+ logger.Info($"称重发送库位数量查询2【{Convert.ToHexString(buffer2)}】");
+ canBusSerial.Write(buffer2, 0, 8);
+ byte[] result2 = await GetBufferByPort(canBusSerial, 8);
+
+ byte[] res = new byte[6];
+ Array.Copy(result1, 3, res, 0, 3);
+ Array.Copy(result2, 3, res, 3, 3);
+
+ return res;
+
+ }
+
+ // 以板子为单位获取抽屉内所有库位的药品数量
+ public async Task CheckQuantityByAddr2()
+ {
+
+
+ int[] res = new int[6];
+ for (int i = 0; i < ColNos.Length; i++)
+ {
+ canBusSerial.DiscardInBuffer();
+ var index = ColNos[i] > 3 ? 2 : 1;
+ var lock1 = ColNos[i] % 3 == 0 ? 3 : ColNos[i] % 3;
+ var channel = Convert.ToInt32((DrawerNo * 10 + index).ToString(), 16);
+ byte[] buffer = new byte[] { 0xaa, (byte)(channel), 0x27, (byte)lock1, 0x00, 0x00, 0x00, 0xee };
+
+ logger.Info($"称重发送库位数量查询1【{Convert.ToHexString(buffer)}】");
+ canBusSerial.Write(buffer, 0, 8);
+ byte[] result = await GetBufferByPort(canBusSerial, 8);
+ logger.Info($"称重发送库位数量查询1返回结果【{Convert.ToHexString(result)}】");
+ byte[] hl = result.Skip(3).Take(2).ToArray();
+ int quantity = BitConverter.ToInt16(hl.Reverse().ToArray(), 0);
+ res[ColNos[i] - 1] = quantity;
+ }
+
+ return res;
+
+ }
+
+ // 指定药盒指示灯开启使能开锁
+ public async Task BoxLockLightOn2()
+ {
+ for (int i = 0; i < ColNos.Length; i++)
+ {
+ var index = ColNos[i] > 3 ? 2 : 1;
+ var lock1 = ColNos[i] % 3 == 0 ? 3 : ColNos[i] % 3;
+ var channel = Convert.ToInt32((DrawerNo * 10 + index).ToString(), 16);
+ byte[] buffer = new byte[] { 0xaa, (byte)(channel), 0x03, (byte)lock1, 0x00, 0x00, 0x00, 0xee };
+ logger.Info($"称重发送药盒使能【{Convert.ToHexString(buffer)}】");
+ canBusSerial.Write(buffer, 0, 8);
+ await Task.Delay(TimeSpan.FromMilliseconds(500));
+ }
+ }
+ // 指定药盒指示灯开启失能开锁
+ public async Task BoxLockLightOff2()
+ {
+ canBusSerial.DiscardInBuffer();
+ for (int i = 0; i < ColNos.Length; i++)
+ {
+ var index = ColNos[i] > 3 ? 2 : 1;
+ var lock1 = ColNos[i] % 3 == 0 ? 3 : ColNos[i] % 3;
+ var channel = Convert.ToInt32((DrawerNo * 10 + index).ToString(), 16);
+ byte[] buffer = new byte[] { 0xaa, (byte)(channel), 0x04, (byte)lock1, 0x00, 0x00, 0x00, 0xee };
+ logger.Info($"称重发送药盒失能【{Convert.ToHexString(buffer)}】");
+ canBusSerial.Write(buffer, 0, 8);
+ await Task.Delay(TimeSpan.FromMilliseconds(50));
+ }
+ }
+
+ public void ClearCount(int DrawerNo, int ColNo)
+ {
+ try
+ {
+ canBusSerial.DiscardInBuffer();
+ var index = ColNo > 3 ? 2 : 1;
+ var lock1 = ColNo % 3 == 0 ? 3 : ColNo % 3;
+ var channel = Convert.ToInt32((DrawerNo * 10 + index).ToString(), 16);
+ byte[] buffer = new byte[] { 0xaa, (byte)(channel), 0x25, (byte)lock1, 0x00, 0x00, 0x00, 0xee };
+
+ logger.Info($"称重发送清空计数【{Convert.ToHexString(buffer)}】");
+ canBusSerial.Write(buffer, 0, 8);
+ }
+ catch (Exception ex)
+ {
+ _eventAggregator.GetEvent().Publish(new util.DeviceMsg()
+ {
+ EventType = util.EventType.OPENERROR,
+ WindowName = WindowName,
+ Message = $"操作发生异常{ex.Message}"
+ });
+ logger.Info($"操作发生异常:ex:{ex.Message},方法名:ClearCount;参数:{DrawerNo},{ColNo}");
+ }
+
+ }
+
+ public void SetNumCount(int DrawerNo, int ColNo, int Quantity)
+ {
+ try
+ {
+ canBusSerial.DiscardInBuffer();
+ var index = ColNo > 3 ? 2 : 1;
+ var lock1 = ColNo % 3 == 0 ? 3 : ColNo % 3;
+ var channel = Convert.ToInt32((DrawerNo * 10 + index).ToString(), 16);
+ byte[] buffer = new byte[] { 0xaa, (byte)(channel), 0x26, (byte)lock1, 0x00, 0x00, 0x00, 0xee };
+
+
+ buffer[4] = (byte)(Quantity >> 8);
+ buffer[5] = (byte)(Quantity & 0xff);
+
+
+ logger.Info($"称重发送数量【{Convert.ToHexString(buffer)}】");
+ canBusSerial.Write(buffer, 0, 8);
+ }
+ catch (Exception ex)
+ {
+ _eventAggregator.GetEvent().Publish(new util.DeviceMsg()
+ {
+ EventType = util.EventType.OPENERROR,
+ WindowName = WindowName,
+ Message = $"操作发生异常{ex.Message}"
+ });
+ logger.Info($"操作发生异常:ex:{ex.Message},方法名:SetNumCount;参数:{DrawerNo},{ColNo},{Quantity}");
+ }
+
+ }
+
+ #endregion
+ #endregion
+
+ public int labelCount = Convert.ToInt32(ConfigurationManager.AppSettings["labelCount"]);
+ }
+}
diff --git a/DM_Weight/ViewModels/InvoiceInNewWindowViewModel.cs b/DM_Weight/ViewModels/InvoiceInNewWindowViewModel.cs
index 0b6c6e0..7924364 100644
--- a/DM_Weight/ViewModels/InvoiceInNewWindowViewModel.cs
+++ b/DM_Weight/ViewModels/InvoiceInNewWindowViewModel.cs
@@ -533,7 +533,7 @@ namespace DM_Weight.ViewModels
if (!_isFinishClick)
{
_isFinishClick = true;
- List record = ChannelStocks.ToList();
+ List record = ChannelStocks.Where(it=>it.AddQuantity>0).ToList();
string InvoiceId = SelectedInvoice.InvoiceNo;
var f = SqlSugarHelper.Db.UseTran(() =>
{
@@ -569,6 +569,7 @@ namespace DM_Weight.ViewModels
List csCount = SqlSugarHelper.Db.Queryable().Where(cs => cs.DrawerNo == it.DrawerNo && cs.ColNo == it.ColNo && cs.ManuNo == it.ManuNo && cs.MachineId.Equals(ConfigurationManager.AppSettings["machineId"] ?? "DM1") && cs.Quantity > 0).ToList();
if (csCount.Count > 0)
{
+ logger.Info($"批号重复:{it.DrawerNo}-{it.ColNo}-{it.ManuNo}");
//repeatList.Add(it.ManuNo);
//stockRepeats.Add(it);
continue;