From 9c40f7215701ab14eb82b6bea6e47f27366eeb18 Mon Sep 17 00:00:00 2001 From: maqiao <625215135@qq.com> Date: Tue, 25 Jun 2024 11:36:56 +0800 Subject: [PATCH 1/3] =?UTF-8?q?secondMaster=E5=88=86=E6=94=AF=E5=85=A8?= =?UTF-8?q?=E9=83=A8=E6=8F=90=E4=BA=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- DM_Weight/App.config | 4 +- DM_Weight/App.xaml.cs | 8 +- DM_Weight/DM_Weight.csproj | 4 +- DM_Weight/Finger/FingerprintUtil.cs | 4 +- DM_Weight/Services/UserService.cs | 154 +++++++++--------- .../ViewModels/AddDrugControlViewModel.cs | 13 +- .../BindingChannelDialogViewModel.cs | 9 +- .../BindingChannelNewDialogViewModel.cs | 4 +- .../CheckRecordDetailDialogViewModel.cs | 4 + .../CheckRecordNewWindowViewModel.cs | 4 + .../CheckStockNew2WindowViewModel.cs | 4 +- .../CheckStockNewWindowViewModel.cs | 6 +- .../DrawerAddDrugWindowViewModel.cs | 1 + .../DrawerTakeDrugWindowViewModel.cs | 1 + .../ViewModels/InvoiceInNewWindowViewModel.cs | 5 +- DM_Weight/ViewModels/LoginWindowViewModel.cs | 16 +- .../ViewModels/OrderTakeDialogViewModel.cs | 17 +- .../OrderTakeDrugWindowViewModel.cs | 8 +- .../ViewModels/ReturnDrugWindow2ViewModel.cs | 3 +- .../ViewModels/ReturnDrugWindowViewModel.cs | 3 +- .../SelfAddWindowViewModel - 复制.cs | 3 +- .../ViewModels/SelfAddWindowViewModel.cs | 54 +++++- .../ViewModels/SelfTakeDrugWindowViewModel.cs | 57 ++++++- .../ViewModels/StockListWindowViewModel.cs | 50 +++++- DM_Weight/Views/LoginWindow.xaml | 2 +- DM_Weight/Views/SelfAddWindow.xaml | 9 +- DM_Weight/Views/SelfTakeDrugWindow.xaml | 13 +- DM_Weight/Views/StockListWindow.xaml | 8 + DM_Weight/util/SqlSugarHelper.cs | 2 +- 29 files changed, 333 insertions(+), 137 deletions(-) diff --git a/DM_Weight/App.config b/DM_Weight/App.config index eab09b1..6f88165 100644 --- a/DM_Weight/App.config +++ b/DM_Weight/App.config @@ -3,7 +3,7 @@ - + - + diff --git a/DM_Weight/App.xaml.cs b/DM_Weight/App.xaml.cs index 94b1199..ef15acf 100644 --- a/DM_Weight/App.xaml.cs +++ b/DM_Weight/App.xaml.cs @@ -90,10 +90,10 @@ namespace DM_Weight foreach (Exception item in e.Exception.InnerExceptions) { logger.Error($"异常类型:{item.StackTrace};{item.GetType()}{Environment.NewLine}来自:{item.Source}{Environment.NewLine}异常内容:{item.Message}"); - if (item.GetType() == typeof(SqlSugar.SqlSugarException)) - { - UserList userList = new UserService().CheckUserByFingerPrinter(1); - } + //if (item.GetType() == typeof(SqlSugar.SqlSugarException)) + //{ + // UserList userList = new UserService().CheckUserByFingerPrinter(1); + //} } //将异常标识为已经观察到 diff --git a/DM_Weight/DM_Weight.csproj b/DM_Weight/DM_Weight.csproj index 58922b8..a1f2c7a 100644 --- a/DM_Weight/DM_Weight.csproj +++ b/DM_Weight/DM_Weight.csproj @@ -71,11 +71,9 @@ - - - + diff --git a/DM_Weight/Finger/FingerprintUtil.cs b/DM_Weight/Finger/FingerprintUtil.cs index 6388b71..9922740 100644 --- a/DM_Weight/Finger/FingerprintUtil.cs +++ b/DM_Weight/Finger/FingerprintUtil.cs @@ -20,7 +20,7 @@ namespace DM_Weight.Finger { private readonly ILog logger = LogManager.GetLogger(typeof(FingerprintUtil)); - public zkemkeeper.CZKEMClass axCZKEM1;// = new zkemkeeper.CZKEMClass(); + public zkemkeeper.CZKEMClass axCZKEM1= new zkemkeeper.CZKEMClass(); public bool bIsConnected = false; private string fingerIp = ConfigurationManager.AppSettings["fingerIp"]?.ToString() ?? ""; @@ -42,7 +42,7 @@ namespace DM_Weight.Finger { try { - axCZKEM1 = new CZKEMClass(); + //axCZKEM1 = new CZKEMClass(); bIsConnected = axCZKEM1.Connect_Net(fingerIp, fingerPort); logger.Info($"连接指纹机,IP:{fingerIp},端口:{fingerPort},机器号:{machineNumber},连接结果:{bIsConnected}"); if (bIsConnected) diff --git a/DM_Weight/Services/UserService.cs b/DM_Weight/Services/UserService.cs index 1609283..08cb6fc 100644 --- a/DM_Weight/Services/UserService.cs +++ b/DM_Weight/Services/UserService.cs @@ -1,7 +1,7 @@ using DM_Weight.Models; using log4net; using log4net.Repository.Hierarchy; -using MySql.Data.MySqlClient; +//using MySql.Data.MySqlClient; //using MySql.Data.MySqlClient; //using MySqlConnector; using Newtonsoft.Json; @@ -17,86 +17,86 @@ namespace DM_Weight.Services { public class UserService { - private readonly ILog logger = LogManager.GetLogger(typeof(UserService)); - //public static string connStr = ConfigurationManager.AppSettings["database"].ToString(); - public static string connStr = ConfigurationManager.ConnectionStrings["database"].ToString(); - public UserList CheckUserByFingerPrinter(int fingerPrinterId) - { - UserList? user = null; + //private readonly ILog logger = LogManager.GetLogger(typeof(UserService)); + ////public static string connStr = ConfigurationManager.AppSettings["database"].ToString(); + //public static string connStr = ConfigurationManager.ConnectionStrings["database"].ToString(); + //public UserList CheckUserByFingerPrinter(int fingerPrinterId) + //{ + // UserList? user = null; - using (MySqlConnection con = new MySqlConnection(connStr)) - { - logger.Info($"connStr:{connStr}"); - try - { - con.Open(); - } - catch (Exception ex) - { - con.Close(); - logger.Info($"Open失败:{ex.ToString()};连接状态:{con.State}"); - logger.Info("再次Open"); - con.Open(); - } - //connOpen(con); - //Thread.Sleep(10); - //while (con.State != System.Data.ConnectionState.Open) - //{ - // logger.Info($"再次Open:{con.State}"); - // connOpen(con); - // Thread.Sleep(10); - //} + // //using (MySqlConnection con = new MySqlConnection(connStr)) + // //{ + // // logger.Info($"connStr:{connStr}"); + // // try + // // { + // // con.Open(); + // // } + // // catch (Exception ex) + // // { + // // con.Close(); + // // logger.Info($"Open失败:{ex.ToString()};连接状态:{con.State}"); + // // logger.Info("再次Open"); + // // con.Open(); + // // } + // //connOpen(con); + // //Thread.Sleep(10); + // //while (con.State != System.Data.ConnectionState.Open) + // //{ + // // logger.Info($"再次Open:{con.State}"); + // // connOpen(con); + // // Thread.Sleep(10); + // //} - logger.Info($"数据库连接状态{con.State}"); - //string sql = @"select ul.id as id,ul.User_name as userName,r.id,r.role_name,r.permissions,r.machine_id from user_list ul - // INNER JOIN role r on ul.machine_role_id=r.id where ul.Id=@ID and ul.machine_id=@machine_id and r.machine_id=@machine_id;"; - //MySqlCommand cmd = new MySqlCommand(sql, con); - //cmd.Parameters.Clear(); - //MySqlParameter[] mySqlParameter = new MySqlParameter[] { new MySqlParameter("ID", fingerPrinterId), new MySqlParameter("machine_id", (ConfigurationManager.AppSettings["machineId"] ?? "DM1")) }; - //cmd.Parameters.AddRange(mySqlParameter); - ////执行语句 - //MySqlDataReader reader = cmd.ExecuteReader(); - //logger.Info("MySqlDataReader读数据"); - //while (reader.Read()) - //{ - // user = new UserList(); - // user.Id = reader.GetInt32("id"); - // user.UserName = reader["userName"] is DBNull ? "" : reader.GetString("userName"); - // //user.UserName = reader["id"] is DBNull ? "" : reader.GetString("id"); - // user.Nickname = reader["userName"] is DBNull ? "" : reader.GetString("userName"); - // user.MachineId = reader["machine_id"] is DBNull ? "" : reader.GetString("machine_id"); - // RoleDm role = new RoleDm(); - // role.Id = reader.GetInt32("id"); - // //role.Permissions = reader["permissions"] is DBNull ? "" : reader.GetString("permissions"); - // role.RoleName = reader["role_name"] is DBNull ? "" : reader.GetString("role_name"); - // role.Permissions = JsonConvert.DeserializeObject>(reader["permissions"] is DBNull ? "" : reader.GetString("permissions")); // JsonConvert.SerializeObject(reader.GetString("permissions")).ToList(); - // user.Role = role; - //} + // //logger.Info($"数据库连接状态{con.State}"); + // //string sql = @"select ul.id as id,ul.User_name as userName,r.id,r.role_name,r.permissions,r.machine_id from user_list ul + // // INNER JOIN role r on ul.machine_role_id=r.id where ul.Id=@ID and ul.machine_id=@machine_id and r.machine_id=@machine_id;"; + // //MySqlCommand cmd = new MySqlCommand(sql, con); + // //cmd.Parameters.Clear(); + // //MySqlParameter[] mySqlParameter = new MySqlParameter[] { new MySqlParameter("ID", fingerPrinterId), new MySqlParameter("machine_id", (ConfigurationManager.AppSettings["machineId"] ?? "DM1")) }; + // //cmd.Parameters.AddRange(mySqlParameter); + // ////执行语句 + // //MySqlDataReader reader = cmd.ExecuteReader(); + // //logger.Info("MySqlDataReader读数据"); + // //while (reader.Read()) + // //{ + // // user = new UserList(); + // // user.Id = reader.GetInt32("id"); + // // user.UserName = reader["userName"] is DBNull ? "" : reader.GetString("userName"); + // // //user.UserName = reader["id"] is DBNull ? "" : reader.GetString("id"); + // // user.Nickname = reader["userName"] is DBNull ? "" : reader.GetString("userName"); + // // user.MachineId = reader["machine_id"] is DBNull ? "" : reader.GetString("machine_id"); + // // RoleDm role = new RoleDm(); + // // role.Id = reader.GetInt32("id"); + // // //role.Permissions = reader["permissions"] is DBNull ? "" : reader.GetString("permissions"); + // // role.RoleName = reader["role_name"] is DBNull ? "" : reader.GetString("role_name"); + // // role.Permissions = JsonConvert.DeserializeObject>(reader["permissions"] is DBNull ? "" : reader.GetString("permissions")); // JsonConvert.SerializeObject(reader.GetString("permissions")).ToList(); + // // user.Role = role; + // //} - //reader.Close(); - //logger.Info($"sql:{sql}"); - return user; - } + // //reader.Close(); + // //logger.Info($"sql:{sql}"); + // return user; + // } - } - private Task connOpen(MySqlConnection con) - { - return Task.Run(() => - { - if (con.State != System.Data.ConnectionState.Closed) - { - con.Close(); - } - try - { - con.Open(); - } - catch (Exception ex) - { - logger.Info($"Open失败:{ex.Message}"); - } - }); - } + //} + //private Task connOpen(MySqlConnection con) + //{ + // return Task.Run(() => + // { + // if (con.State != System.Data.ConnectionState.Closed) + // { + // con.Close(); + // } + // try + // { + // con.Open(); + // } + // catch (Exception ex) + // { + // logger.Info($"Open失败:{ex.Message}"); + // } + // }); + //} } } diff --git a/DM_Weight/ViewModels/AddDrugControlViewModel.cs b/DM_Weight/ViewModels/AddDrugControlViewModel.cs index 9ac77bc..dbbca7d 100644 --- a/DM_Weight/ViewModels/AddDrugControlViewModel.cs +++ b/DM_Weight/ViewModels/AddDrugControlViewModel.cs @@ -252,11 +252,13 @@ namespace DM_Weight.ViewModels Id = it.Id, DrugId= it.DrugId, }).UpdateColumns(it => new { it.Quantity, it.ManuNo, it.EffDate,it.DrugId }).ExecuteCommand(); + } else { //如果批号重复则不让添加 List csCount = SqlSugarHelper.Db.Queryable().Where(cs => cs.DrawerNo == it.DrawerNo && cs.ManuNo == it.ManuNo && cs.MachineId.Equals(ConfigurationManager.AppSettings["machineId"] ?? "DM1")).ToList(); + if (csCount.Count > 0) { //repeatList.Add(it.ManuNo); @@ -279,6 +281,8 @@ namespace DM_Weight.ViewModels Id = Guid.NewGuid().ToString(), MachineId = ConfigurationManager.AppSettings["machineId"] ?? "DM1" }).ExecuteCommand(); + + } // 获取更新完库存后的药品库存 List nowChannels = SqlSugarHelper.Db.Queryable() @@ -307,7 +311,8 @@ namespace DM_Weight.ViewModels }).ExecuteCommand(); } return true; - }); + }); + //ChannelStocks.Clear(); if (stockRepeats.Count == record.Count) { @@ -486,7 +491,9 @@ namespace DM_Weight.ViewModels { //删除ChannelStock表中该批次数据 int isOk = SqlSugarHelper.Db.Deleteable().Where(cs => cs.DrugId == cstock.DrugId && cs.ManuNo == cs.ManuNo).ExecuteCommand(); - if(isOk>0 ) + + + if (isOk>0 ) { logger.Info($"删除{cstock.DrawerNo}-{cstock.ColNo}抽屉中药品{cstock.DrugId}下的批次{cstock.ManuNo},"); AlertMsg alertMsg = new AlertMsg @@ -519,6 +526,8 @@ namespace DM_Weight.ViewModels Is8Drawer = count < 9; Is16Drawer = count >= 16; Is17Drawer = count > 16; + + } //这个方法用于拦截请求,continuationCallback(true)就是不拦截,continuationCallback(false)拦截本次操作 diff --git a/DM_Weight/ViewModels/BindingChannelDialogViewModel.cs b/DM_Weight/ViewModels/BindingChannelDialogViewModel.cs index ef6f52a..3feeab6 100644 --- a/DM_Weight/ViewModels/BindingChannelDialogViewModel.cs +++ b/DM_Weight/ViewModels/BindingChannelDialogViewModel.cs @@ -23,7 +23,7 @@ namespace DM_Weight.ViewModels { public class BindingChannelDialogViewModel : BindableBase, IDialogAware { - + private readonly ILog logger = LogManager.GetLogger(typeof(HomeWindowViewModel)); public string Title => "库位绑定"; public event Action RequestClose; @@ -112,6 +112,8 @@ namespace DM_Weight.ViewModels { //DrugList = SqlSugarHelper.Db.Queryable().Includes(di => di.DrugManuNos).Where(di => di.PyCode.Contains(pycode)).OrderBy(di => di.DrugId).ToList(); DrugList = SqlSugarHelper.Db.Queryable().Includes(di => di.DrugManuNos).Where(di => di.PyCode.Contains(pycode)).OrderBy(di => di.DrugId).ToList(); + + } else { @@ -212,7 +214,8 @@ namespace DM_Weight.ViewModels //var list = SqlSugarHelper.Db.Queryable().Includes(di => di.DrugManuNos).OrderBy(di => di.DrugId).ToList(); var list = SqlSugarHelper.Db.Queryable().Includes(di => di.DrugManuNos).OrderBy(di => di.DrugId).ToList(); DrugInfos = list; - DrugInfos_PY = list; + DrugInfos_PY = list; + } private void GetChannelsByDrawerNo() @@ -235,6 +238,7 @@ namespace DM_Weight.ViewModels .ToPageList(PageNum, PageSize, ref totalCount); Channels = list; TotalCount = totalCount; + } public void OnDialogOpened(IDialogParameters parameters) { @@ -269,6 +273,7 @@ namespace DM_Weight.ViewModels if (DrugInfo != null) { int count = SqlSugarHelper.Db.Queryable().Where(cs => cs.DrugId.Equals(DrugInfo.DrugId.ToString())).Where(cs => cs.DrawerType != 1).Where(cs => cs.MachineId.Equals(ConfigurationManager.AppSettings["machineId"] ?? "DM1")).Count(); + if (count == 0) { var item = SelectChannels[0]; diff --git a/DM_Weight/ViewModels/BindingChannelNewDialogViewModel.cs b/DM_Weight/ViewModels/BindingChannelNewDialogViewModel.cs index 343ed9d..33acdc1 100644 --- a/DM_Weight/ViewModels/BindingChannelNewDialogViewModel.cs +++ b/DM_Weight/ViewModels/BindingChannelNewDialogViewModel.cs @@ -26,6 +26,7 @@ namespace DM_Weight.ViewModels { public class BindingChannelNewDialogViewModel : BindableBase, IDialogAware, IRegionMemberLifetime { + private readonly ILog logger = LogManager.GetLogger(typeof(HomeWindowViewModel)); public string Title => "库位绑定"; @@ -145,6 +146,7 @@ namespace DM_Weight.ViewModels if (string.IsNullOrEmpty(text)) { DrugInfos = SqlSugarHelper.Db.SqlQueryable(str).OrderBy(di => di.DrugName).OrderBy(di => di.DrugId).ToList(); + return; } if (DrugInfos != null) @@ -153,7 +155,7 @@ namespace DM_Weight.ViewModels } DrugInfos = SqlSugarHelper.Db.SqlQueryable(str).Where(di => di.DrugName.Contains(text) || di.PyCode.Contains(text) || di.DrugId.Contains(text)).OrderBy(di => di.DrugName).OrderBy(di => di.DrugId).ToList(); - + } //private List? _drugInfos; diff --git a/DM_Weight/ViewModels/CheckRecordDetailDialogViewModel.cs b/DM_Weight/ViewModels/CheckRecordDetailDialogViewModel.cs index f2add79..b4d4f71 100644 --- a/DM_Weight/ViewModels/CheckRecordDetailDialogViewModel.cs +++ b/DM_Weight/ViewModels/CheckRecordDetailDialogViewModel.cs @@ -3,6 +3,7 @@ using DM_Weight.msg; using DM_Weight.Port; using DM_Weight.Report; using DM_Weight.util; +using log4net; using Prism.Commands; using Prism.Events; using Prism.Mvvm; @@ -22,6 +23,8 @@ namespace DM_Weight.ViewModels { public class CheckRecordDetailDialogViewModel : BindableBase, IDialogAware, IRegionMemberLifetime { + private readonly ILog logger = LogManager.GetLogger(typeof(CheckRecordDetailDialogViewModel)); + public string Title => "盘点记录明细"; private int _pageNum = 1; public int PageNum @@ -159,6 +162,7 @@ namespace DM_Weight.ViewModels List checkList = SqlSugarHelper.Db.Queryable() .Includes(cs => cs.DrugInfo) .Where(cs => cs.optdate == OptDate).OrderByDescending(cs => cs.optdate).ToList(); + ICollectionView vw = CollectionViewSource.GetDefaultView(checkList); vw.GroupDescriptions.Add(new PropertyGroupDescription("DrugInfo")); obsCheckRecordStock = new ObservableCollection(checkList); diff --git a/DM_Weight/ViewModels/CheckRecordNewWindowViewModel.cs b/DM_Weight/ViewModels/CheckRecordNewWindowViewModel.cs index 2ca9778..9ea3683 100644 --- a/DM_Weight/ViewModels/CheckRecordNewWindowViewModel.cs +++ b/DM_Weight/ViewModels/CheckRecordNewWindowViewModel.cs @@ -2,6 +2,7 @@ using DM_Weight.Port; using DM_Weight.Report; using DM_Weight.util; +using log4net; using Prism.Commands; using Prism.Events; using Prism.Mvvm; @@ -21,6 +22,8 @@ namespace DM_Weight.ViewModels { public class CheckRecordNewWindowViewModel : BindableBase, INavigationAware, IRegionMemberLifetime { + private readonly ILog logger = LogManager.GetLogger(typeof(CheckRecordNewWindowViewModel)); + private int _pageNum = 1; public int PageNum { @@ -168,6 +171,7 @@ namespace DM_Weight.ViewModels OPTSTARTDATE = StartDate, OPTENDDATE = EndDate }).ToPageList(PageNum, PageSize, ref totalCount); + //SqlSugarHelper.Db.ThenMapper(checkList, item => //{ // //item.drugDetails = SqlSugarHelper.Db.Queryable().SetContext(x => x.optdate, () => item.optdate, item).ToList(); diff --git a/DM_Weight/ViewModels/CheckStockNew2WindowViewModel.cs b/DM_Weight/ViewModels/CheckStockNew2WindowViewModel.cs index 23940db..b4057c0 100644 --- a/DM_Weight/ViewModels/CheckStockNew2WindowViewModel.cs +++ b/DM_Weight/ViewModels/CheckStockNew2WindowViewModel.cs @@ -590,8 +590,8 @@ namespace DM_Weight.ViewModels public void OnNavigatedTo(NavigationContext navigationContext) { _eventAggregator.GetEvent().Subscribe(DoMyPrismEvent); - Task.Factory.StartNew(() => { RequestData(); }); - //RequestData(); + //Task.Factory.StartNew(() => { RequestData(); }); + RequestData(); } diff --git a/DM_Weight/ViewModels/CheckStockNewWindowViewModel.cs b/DM_Weight/ViewModels/CheckStockNewWindowViewModel.cs index 1359dd3..5d18dc8 100644 --- a/DM_Weight/ViewModels/CheckStockNewWindowViewModel.cs +++ b/DM_Weight/ViewModels/CheckStockNewWindowViewModel.cs @@ -721,8 +721,6 @@ namespace DM_Weight.ViewModels { ChannelStocks.Clear(); - ChannelStocks.Clear(); - List q = SqlSugarHelper.Db.Queryable() .Includes(cs => cs.DrugInfo) .InnerJoin((cs, cl) => cs.Chnguid == cl.Id && cs.DrugId == cl.DrugId) @@ -746,8 +744,8 @@ namespace DM_Weight.ViewModels public void OnNavigatedTo(NavigationContext navigationContext) { _eventAggregator.GetEvent().Subscribe(DoMyPrismEvent); - Task.Factory.StartNew(() => { RequestData(); }); - //RequestData(); + //Task.Factory.StartNew(() => { RequestData(); }); + RequestData(); } diff --git a/DM_Weight/ViewModels/DrawerAddDrugWindowViewModel.cs b/DM_Weight/ViewModels/DrawerAddDrugWindowViewModel.cs index 6bfd1f4..84887d1 100644 --- a/DM_Weight/ViewModels/DrawerAddDrugWindowViewModel.cs +++ b/DM_Weight/ViewModels/DrawerAddDrugWindowViewModel.cs @@ -385,6 +385,7 @@ namespace DM_Weight.ViewModels return cs; }).ToList(); + //obChannelStock = new ObservableCollection(ChannelStocks); } diff --git a/DM_Weight/ViewModels/DrawerTakeDrugWindowViewModel.cs b/DM_Weight/ViewModels/DrawerTakeDrugWindowViewModel.cs index e279ae9..be1482c 100644 --- a/DM_Weight/ViewModels/DrawerTakeDrugWindowViewModel.cs +++ b/DM_Weight/ViewModels/DrawerTakeDrugWindowViewModel.cs @@ -382,6 +382,7 @@ namespace DM_Weight.ViewModels .OrderBy(cs => cs.EffDate) .ToList(); ChannelStocks = queryData; + } //接收导航传过来的参数 现在是在此处初始化了表格数据 diff --git a/DM_Weight/ViewModels/InvoiceInNewWindowViewModel.cs b/DM_Weight/ViewModels/InvoiceInNewWindowViewModel.cs index 7d04c32..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; @@ -804,7 +805,7 @@ namespace DM_Weight.ViewModels .Select(it => new Invoice()) .Select("*") .ToPageList(PageNum, PageSize, ref totalCount); - + TotalCount = totalCount; PageCount = (int)Math.Ceiling((double)TotalCount / PageSize); } diff --git a/DM_Weight/ViewModels/LoginWindowViewModel.cs b/DM_Weight/ViewModels/LoginWindowViewModel.cs index ebaecc4..fc705c9 100644 --- a/DM_Weight/ViewModels/LoginWindowViewModel.cs +++ b/DM_Weight/ViewModels/LoginWindowViewModel.cs @@ -43,7 +43,7 @@ namespace DM_Weight.ViewModels private int loginMode = Convert.ToInt32(ConfigurationManager.AppSettings["loginMode"]?.ToString() ?? "1"); private string firstLogin = ConfigurationManager.AppSettings["firstLogin"]?.ToString() ?? "operator"; - + public bool SingleLogin { get => ReadAppSetting("loginMode") == "1"; @@ -150,7 +150,7 @@ _exitCommand ??= new DelegateCommand(Exit); .Includes(u => u.Role) .First(u => u.UserName == username && ConfigurationManager.AppSettings["machineId"].ToString().Equals(u.MachineId)); - + //UserList userList =new UserService().CheckUserByFingerPrinter(msg.Id); //UserList userList = SqlSugarHelper.Db.Queryable() // .Includes(u => u.Role) // .InnerJoin((u, r) => u.RoleId == r.Id) @@ -342,7 +342,7 @@ _exitCommand ??= new DelegateCommand(Exit); UserList userList = SqlSugarHelper.Db.Queryable() .Includes(u => u.Role) .First(u => u.Id == msg.Id); - + //UserList userList = new UserService().CheckUserByFingerPrinter(msg.Id); logger.Info($"userList是空?{userList == null}"); @@ -378,11 +378,11 @@ _exitCommand ??= new DelegateCommand(Exit); } catch (Exception e) { - logger.Info($"LoginEvent存在异常:{e.Message}"); - if(e.GetType().Name== "SqlSugarException") - { - UserList userList = new UserService().CheckUserByFingerPrinter(1); - } + logger.Info($"LoginEvent存在异常:{e.Message};数据库连接字符串:{ConfigurationManager.ConnectionStrings["database"].ToString()}"); + //if(e.GetType().Name== "SqlSugarException") + //{ + // UserList userList = new UserService().CheckUserByFingerPrinter(1); + //} } } diff --git a/DM_Weight/ViewModels/OrderTakeDialogViewModel.cs b/DM_Weight/ViewModels/OrderTakeDialogViewModel.cs index 2518fa0..1854bda 100644 --- a/DM_Weight/ViewModels/OrderTakeDialogViewModel.cs +++ b/DM_Weight/ViewModels/OrderTakeDialogViewModel.cs @@ -21,6 +21,7 @@ using DM_Weight.Port; using DM_Weight.select; using DM_Weight.util; using System.Threading; +using System.Windows.Controls.Primitives; namespace DM_Weight.ViewModels { @@ -171,6 +172,7 @@ namespace DM_Weight.ViewModels public void RequestData() { + // orderDetails = SqlSugarHelper.Db.Queryable() .Includes(od => od.DrugInfo) .InnerJoin(SqlSugarHelper.Db.Queryable().Where(cs => cs.DrawerType == 1).Where(cs => cs.MachineId.Equals(ConfigurationManager.AppSettings["machineId"] ?? "DM1")).GroupBy(cs => cs.DrugId), (od, t) => od.DrugId == t.DrugId) @@ -330,7 +332,7 @@ namespace DM_Weight.ViewModels { string InvoiceId = OrderInfo.OrderNo; try - { + { SqlSugarHelper.Db.BeginTran(); logger.Info($"更新OrderInfo:{InvoiceId}"); SqlSugarHelper.Db.Updateable(new OrderInfo() @@ -338,7 +340,9 @@ namespace DM_Weight.ViewModels DmStatus = 1, OrderNo = OrderInfo.OrderNo }).UpdateColumns(it => new { it.DmStatus }).WhereColumns(it => new { it.OrderNo }).ExecuteCommand(); - + logger.Info($"Task.Delay前:{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff")}"); + Task.Delay(4000).Wait(); + logger.Info($"Task.Delay后:{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff")}"); logger.Info("进入record循环"); for (int i = 0; i < record.Count; i++) { @@ -389,8 +393,8 @@ namespace DM_Weight.ViewModels logger.Info("事务已提交"); // 更新屏显库存 //List singleChannels = record.FindAll(it => it.BoardType != 1); - Task.Run(() => - { + //Task.Run(() => + //{ List singleChannels = record.Where(it => it.BoardType == 5) .GroupBy(it => new { it.DrawerNo, it.ColNo }) .Select(it => @@ -439,7 +443,7 @@ namespace DM_Weight.ViewModels }; _eventAggregator.GetEvent().Publish(alertMsg); })); - }); + //}); } catch (Exception ex) @@ -451,7 +455,8 @@ namespace DM_Weight.ViewModels Message = "抽屉取药完成,库存更新失败!", Type = MsgType.ERROR, }; - _eventAggregator.GetEvent().Publish(alertMsg); + _eventAggregator.GetEvent().Publish(alertMsg); + _isFinishClick = false; } //var f = SqlSugarHelper.Db.UseTran(() => diff --git a/DM_Weight/ViewModels/OrderTakeDrugWindowViewModel.cs b/DM_Weight/ViewModels/OrderTakeDrugWindowViewModel.cs index 5d971ef..25b3c8e 100644 --- a/DM_Weight/ViewModels/OrderTakeDrugWindowViewModel.cs +++ b/DM_Weight/ViewModels/OrderTakeDrugWindowViewModel.cs @@ -225,6 +225,8 @@ namespace DM_Weight.ViewModels logger.Info("开始OrderTakeDrugWindowViewModel_查询数据"); OrderInfos.Clear(); int totalCount = 0; + //logger.Info($"SqlSugarHelper.Db.Ado.Connection.GetHashCode():{_db.Ado.Connection.GetHashCode()}"); + List queryData = SqlSugarHelper.Db.Queryable() .InnerJoin((oi, od) => oi.OrderNo == od.OrderNo) .InnerJoin(SqlSugarHelper.Db.Queryable().Where(cs => cs.DrawerType == 1).Where(cs => cs.MachineId.Equals(ConfigurationManager.AppSettings["machineId"] ?? "DM1")).GroupBy(cs => cs.DrugId), (oi, od, t) => od.DrugId == t.DrugId) @@ -242,7 +244,7 @@ namespace DM_Weight.ViewModels OrderInfos = queryData; TotalCount = totalCount; PageCount = (int)Math.Ceiling((double)TotalCount / PageSize); - + logger.Info($"_db.Ado.Connection.GetHashCode():{SqlSugarHelper.Db.Ado.Connection.GetHashCode()};{SqlSugarHelper.Db.Ado.GetHashCode()}"); logger.Info("结束OrderTakeDrugWindowViewModel_查询数据"); } @@ -251,8 +253,8 @@ namespace DM_Weight.ViewModels { logger.Info("进入OrderTakeDrugWindowViewModel_OnNavigatedTo"); _eventAggregator.GetEvent().Subscribe(DoMyPrismEvent); - //RequestData(); - Task.Factory.StartNew(() => RequestData()); + RequestData(); + //Task.Factory.StartNew(() => RequestData()); logger.Info("结束OrderTakeDrugWindowViewModel_OnNavigatedTo"); //Task t = new Task(() => { RequestData(); }); diff --git a/DM_Weight/ViewModels/ReturnDrugWindow2ViewModel.cs b/DM_Weight/ViewModels/ReturnDrugWindow2ViewModel.cs index 280ec39..f088403 100644 --- a/DM_Weight/ViewModels/ReturnDrugWindow2ViewModel.cs +++ b/DM_Weight/ViewModels/ReturnDrugWindow2ViewModel.cs @@ -238,7 +238,8 @@ namespace DM_Weight.ViewModels //接收导航传过来的参数 现在是在此处初始化了表格数据 public void OnNavigatedTo(NavigationContext navigationContext) { - Task.Factory.StartNew(() => RequestData()); + //Task.Factory.StartNew(() => RequestData()); + RequestData(); } //每次导航的时候,该实列用不用重新创建,true是不重新创建,false是重新创建 diff --git a/DM_Weight/ViewModels/ReturnDrugWindowViewModel.cs b/DM_Weight/ViewModels/ReturnDrugWindowViewModel.cs index b319fa9..9a49513 100644 --- a/DM_Weight/ViewModels/ReturnDrugWindowViewModel.cs +++ b/DM_Weight/ViewModels/ReturnDrugWindowViewModel.cs @@ -192,7 +192,8 @@ namespace DM_Weight.ViewModels //接收导航传过来的参数 现在是在此处初始化了表格数据 public void OnNavigatedTo(NavigationContext navigationContext) { - Task.Factory.StartNew(() => RequestData()); + //Task.Factory.StartNew(() => RequestData()); + RequestData(); } //每次导航的时候,该实列用不用重新创建,true是不重新创建,false是重新创建 diff --git a/DM_Weight/ViewModels/SelfAddWindowViewModel - 复制.cs b/DM_Weight/ViewModels/SelfAddWindowViewModel - 复制.cs index f99da84..c35e9c0 100644 --- a/DM_Weight/ViewModels/SelfAddWindowViewModel - 复制.cs +++ b/DM_Weight/ViewModels/SelfAddWindowViewModel - 复制.cs @@ -192,7 +192,8 @@ namespace DM_Weight.ViewModels public void OnNavigatedTo(NavigationContext navigationContext) { logger.Info("进入SelfAddWindowViewModel_OnNavigatedTo"); - Task.Factory.StartNew(() => RequestChannelData()); + //Task.Factory.StartNew(() => RequestChannelData()); + RequestChannelData(); logger.Info("结束SelfAddWindowViewModel_OnNavigatedTo"); } diff --git a/DM_Weight/ViewModels/SelfAddWindowViewModel.cs b/DM_Weight/ViewModels/SelfAddWindowViewModel.cs index 0fdf91c..604d439 100644 --- a/DM_Weight/ViewModels/SelfAddWindowViewModel.cs +++ b/DM_Weight/ViewModels/SelfAddWindowViewModel.cs @@ -21,6 +21,48 @@ namespace DM_Weight.ViewModels { public class SelfAddWindowViewModel : BindableBase, IConfirmNavigationRequest, IRegionMemberLifetime { + private int _pageNum = 1; + public int PageNum + { + get => _pageNum; + set + { + SetProperty(ref _pageNum, value); + RequestChannelData(); + } + } + + private int _pageCount = 1; + public int PageCount + { + get => _pageCount; + set + { + SetProperty(ref _pageCount, value); + } + } + + private int _pageSize = 3; + public int PageSize + { + get => _pageSize; + set + { + SetProperty(ref _pageSize, value); + } + } + + private int _totalCount = 0; + public int TotalCount + { + get => _totalCount; + set + { + SetProperty(ref _totalCount, value); + } + } + + IDialogService _dialogService; IEventAggregator _eventAggregator; @@ -210,24 +252,28 @@ namespace DM_Weight.ViewModels // .OrderBy(cs => cs.ColNo) // .ToList(); //ChannelStocks = queryData; + int totalCount = 0; List q = SqlSugarHelper.Db.Queryable() .Includes(di => di.channelStocks.Where(cs => cs.DrawerType == 1).Where(cs => cs.MachineId.Equals(ConfigurationManager.AppSettings["machineId"] ?? "DM1") && cs.DrugId != null).OrderBy(cs => cs.DrawerNo).OrderBy(cs => cs.ColNo).ToList()) - .WhereIF(!String.IsNullOrEmpty(SearchValue) && SelectedItem.Code.Equals("DrugId"), (cs) => cs.DrugId.Contains(SearchValue)) + + .Where(di => di.channelStocks.Any(cs => cs.MachineId.Equals(ConfigurationManager.AppSettings["machineId"] ?? "DM1") && cs.DrugId != null)).WhereIF(!String.IsNullOrEmpty(SearchValue) && SelectedItem.Code.Equals("DrugId"), (cs) => cs.DrugId.Contains(SearchValue)) .WhereIF(!String.IsNullOrEmpty(SearchValue) && SelectedItem.Code.Equals("DrugName"), (cs) => cs.DrugName.Contains(SearchValue)) .WhereIF(!String.IsNullOrEmpty(SearchValue) && SelectedItem.Code.Equals("PyCode"), (cs) => cs.PyCode.Contains(SearchValue)) .WhereIF(!String.IsNullOrEmpty(SearchValue) && SelectedItem.Code.Equals("DrugBarcode"), (cs) => cs.DrugBarcode.Contains(SearchValue)) - .Where(di => di.channelStocks.Any(cs => cs.MachineId.Equals(ConfigurationManager.AppSettings["machineId"] ?? "DM1") && cs.DrugId != null)) .OrderBy(cs => cs.DrugId) - .ToList(); + .ToPageList(PageNum, PageSize, ref totalCount); Drugs = q; + TotalCount = totalCount; + PageCount = (int)Math.Ceiling((double)TotalCount / PageSize); logger.Info("结束SelfAddWindowViewModel_查询数据"); + } //接收导航传过来的参数 现在是在此处初始化了表格数据 public void OnNavigatedTo(NavigationContext navigationContext) { logger.Info("进入SelfAddWindowViewModel_OnNavigatedTo"); - Task.Factory.StartNew(() => RequestChannelData()); + RequestChannelData(); logger.Info("结束SelfAddWindowViewModel_OnNavigatedTo"); } diff --git a/DM_Weight/ViewModels/SelfTakeDrugWindowViewModel.cs b/DM_Weight/ViewModels/SelfTakeDrugWindowViewModel.cs index 80769f9..d6a7e51 100644 --- a/DM_Weight/ViewModels/SelfTakeDrugWindowViewModel.cs +++ b/DM_Weight/ViewModels/SelfTakeDrugWindowViewModel.cs @@ -14,14 +14,59 @@ using DM_Weight.util; using DM_Weight.msg; using Prism.Events; using SqlSugar; +using log4net; +using System.Drawing.Printing; namespace DM_Weight.ViewModels { public class SelfTakeDrugWindowViewModel : BindableBase, IConfirmNavigationRequest, IRegionMemberLifetime { + private int _pageNum = 1; + public int PageNum + { + get => _pageNum; + set + { + SetProperty(ref _pageNum, value); + RequestChannelData(); + } + } + + private int _pageCount = 1; + public int PageCount + { + get => _pageCount; + set + { + SetProperty(ref _pageCount, value); + } + } + + private int _pageSize = 3; + public int PageSize + { + get => _pageSize; + set + { + SetProperty(ref _pageSize, value); + } + } + + private int _totalCount = 0; + public int TotalCount + { + get => _totalCount; + set + { + SetProperty(ref _totalCount, value); + } + } + + + private readonly ILog logger = LogManager.GetLogger(typeof(SelfTakeDrugWindowViewModel)); + IDialogService _dialogService; IEventAggregator _eventAggregator; - public static List StaticSelects = new() { new OrderTakeSelect @@ -49,7 +94,7 @@ namespace DM_Weight.ViewModels public SelfTakeDrugWindowViewModel(IDialogService DialogService, IEventAggregator eventAggregator, SqlSugarScope sqlSugarScope) { _dialogService = DialogService; - _eventAggregator= eventAggregator; + _eventAggregator = eventAggregator; //this.SqlSugarHelper.Db = sqlSugarScope; } @@ -195,6 +240,7 @@ namespace DM_Weight.ViewModels // .OrderBy(cs => cs.ColNo) // .ToList(); //ChannelStocks = queryData; + int totalCount = 0; List q = SqlSugarHelper.Db.Queryable() .Includes(di => di.channelStocks.Where(cs => cs.DrawerType == 1) .Where(cs => cs.MachineId.Equals(ConfigurationManager.AppSettings["machineId"] ?? "DM1") && cs.DrugId != null&&cs.Quantity>0).OrderBy(cs => cs.DrawerNo).OrderBy(cs => cs.ColNo).ToList()) @@ -202,11 +248,16 @@ namespace DM_Weight.ViewModels .WhereIF(!String.IsNullOrEmpty(SearchValue) && SelectedItem.Code.Equals("DrugName"), (cs) => cs.DrugName.Contains(SearchValue)) .WhereIF(!String.IsNullOrEmpty(SearchValue) && SelectedItem.Code.Equals("PyCode"), (cs) => cs.PyCode.Contains(SearchValue)) .WhereIF(!String.IsNullOrEmpty(SearchValue) && SelectedItem.Code.Equals("DrugBarcode"), (cs) => cs.DrugBarcode.Contains(SearchValue)) + .WhereIF(!String.IsNullOrEmpty(SearchValue) && SelectedItem.Code.Equals("DrugBarcode"), (cs) => cs.DrugBarcode.Contains(SearchValue)) .Where(di => di.channelStocks.Any(cs => cs.MachineId.Equals(ConfigurationManager.AppSettings["machineId"] ?? "DM1") && cs.DrugId != null)) .OrderBy(cs => cs.DrugId) - .ToList(); + .ToPageList(PageNum, PageSize, ref totalCount); + //.ToList(); Drugs = q.Where(di => di.channelStocks.Count() > 0).ToList(); + TotalCount = totalCount; + PageCount = (int)Math.Ceiling((double)TotalCount / PageSize); + logger.Info($"_db.Ado.Connection.GetHashCode():{SqlSugarHelper.Db.Ado.Connection.GetHashCode()};{SqlSugarHelper.Db.Ado.GetHashCode()}"); } //接收导航传过来的参数 现在是在此处初始化了表格数据 diff --git a/DM_Weight/ViewModels/StockListWindowViewModel.cs b/DM_Weight/ViewModels/StockListWindowViewModel.cs index 480340d..335a5c9 100644 --- a/DM_Weight/ViewModels/StockListWindowViewModel.cs +++ b/DM_Weight/ViewModels/StockListWindowViewModel.cs @@ -25,6 +25,47 @@ namespace DM_Weight.ViewModels { public class StockListWindowViewModel : BindableBase, IConfirmNavigationRequest, IRegionMemberLifetime { + private int _pageNum = 1; + public int PageNum + { + get => _pageNum; + set + { + SetProperty(ref _pageNum, value); + RequestData(); + } + } + + private int _pageCount = 1; + public int PageCount + { + get => _pageCount; + set + { + SetProperty(ref _pageCount, value); + } + } + + private int _pageSize = 3; + public int PageSize + { + get => _pageSize; + set + { + SetProperty(ref _pageSize, value); + } + } + + private int _totalCount = 0; + public int TotalCount + { + get => _totalCount; + set + { + SetProperty(ref _totalCount, value); + } + } + //public static StockListWindowViewModel vm; public string drugId; public static List StaticSelects = new() @@ -240,7 +281,7 @@ namespace DM_Weight.ViewModels // .OrderBy(cs => cs.DrugId) // .ToList(); //Drugs = q; - + int totalCount = 0; List q = SqlSugarHelper.Db.Queryable() .Includes(di => di.channelStocks.Where(cs => cs.DrawerType == 1) .Where(cs => cs.MachineId.Equals(ConfigurationManager.AppSettings["machineId"] ?? "DM1") && cs.DrugId != null).OrderBy(cs => cs.DrawerNo).OrderBy(cs => cs.ColNo).ToList()) @@ -250,9 +291,10 @@ namespace DM_Weight.ViewModels .WhereIF(!String.IsNullOrEmpty(SearchValue) && SelectedItem.Code.Equals("DrugBarcode"), (cs) => cs.DrugBarcode.Contains(SearchValue)) .Where(di => di.channelStocks.Any(cs => cs.MachineId.Equals(ConfigurationManager.AppSettings["machineId"] ?? "DM1") && cs.DrugId != null)) .OrderBy(cs => cs.DrugId) - .ToList(); + .ToPageList(PageNum, PageSize, ref totalCount); Drugs = q; - + TotalCount = totalCount; + PageCount = (int)Math.Ceiling((double)TotalCount / PageSize); logger.Info("结束StockListWindowViewModel_查询数据"); } @@ -261,7 +303,7 @@ namespace DM_Weight.ViewModels { logger.Info("进入StockListWindowViewModel_OnNavigatedTo"); //RequestData(); - Task.Factory.StartNew(() => RequestData()); + RequestData(); logger.Info("结束StockListWindowViewModel_OnNavigatedTo"); } diff --git a/DM_Weight/Views/LoginWindow.xaml b/DM_Weight/Views/LoginWindow.xaml index 43a95d2..bd9abf2 100644 --- a/DM_Weight/Views/LoginWindow.xaml +++ b/DM_Weight/Views/LoginWindow.xaml @@ -196,7 +196,7 @@ - + diff --git a/DM_Weight/Views/SelfAddWindow.xaml b/DM_Weight/Views/SelfAddWindow.xaml index 2a392fc..7d1fb88 100644 --- a/DM_Weight/Views/SelfAddWindow.xaml +++ b/DM_Weight/Views/SelfAddWindow.xaml @@ -8,6 +8,7 @@ xmlns:i="http://schemas.microsoft.com/xaml/behaviors" xmlns:convert="clr-namespace:DM_Weight.Converter" xmlns:prism="http://prismlibrary.com/" + xmlns:pagination="clr-namespace:DM_Weight.Components.pagination" mc:Ignorable="d"> @@ -20,6 +21,7 @@ + @@ -254,7 +256,12 @@ --> - + diff --git a/DM_Weight/Views/SelfTakeDrugWindow.xaml b/DM_Weight/Views/SelfTakeDrugWindow.xaml index ae459e2..c97c302 100644 --- a/DM_Weight/Views/SelfTakeDrugWindow.xaml +++ b/DM_Weight/Views/SelfTakeDrugWindow.xaml @@ -9,6 +9,7 @@ xmlns:i="http://schemas.microsoft.com/xaml/behaviors" xmlns:convert="clr-namespace:DM_Weight.Converter" xmlns:prism="http://prismlibrary.com/" + xmlns:pagination="clr-namespace:DM_Weight.Components.pagination" mc:Ignorable="d"> @@ -22,6 +23,7 @@ + @@ -103,7 +105,9 @@ + + + diff --git a/DM_Weight/util/SqlSugarHelper.cs b/DM_Weight/util/SqlSugarHelper.cs index 0f99316..740329f 100644 --- a/DM_Weight/util/SqlSugarHelper.cs +++ b/DM_Weight/util/SqlSugarHelper.cs @@ -11,7 +11,7 @@ namespace DM_Weight.util ConnectionString = ConfigurationManager.ConnectionStrings["database"].ToString(), DbType = DbType.MySql, - IsAutoCloseConnection = true + IsAutoCloseConnection = false }, db => { From 636bc9cd57a67657fbe500f5c5db29c1cb7c45f1 Mon Sep 17 00:00:00 2001 From: maqiao <625215135@qq.com> Date: Tue, 25 Jun 2024 13:24:48 +0800 Subject: [PATCH 2/3] =?UTF-8?q?portUtil=E6=96=87=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- DM_Weight/Port/PortUtil.cs | 1435 ++++++++++++++++++++++++++++++++++++ 1 file changed, 1435 insertions(+) create mode 100644 DM_Weight/Port/PortUtil.cs 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"]); + } +} From 134f15941a417051379dc4b21b69a706cc8019aa Mon Sep 17 00:00:00 2001 From: maqiao <625215135@qq.com> Date: Tue, 25 Jun 2024 13:25:20 +0800 Subject: [PATCH 3/3] gitignore --- .gitignore | 1 - 1 file changed, 1 deletion(-) 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