diff --git a/DM_Weight/App.xaml.cs b/DM_Weight/App.xaml.cs index c9a5bdd..8368c92 100644 --- a/DM_Weight/App.xaml.cs +++ b/DM_Weight/App.xaml.cs @@ -293,6 +293,13 @@ namespace DM_Weight containerRegistry.RegisterForNavigation(); containerRegistry.RegisterDialog(); containerRegistry.RegisterForNavigation(); + + //药品转移药箱 + containerRegistry.RegisterForNavigation(); + containerRegistry.RegisterForNavigation(); + containerRegistry.RegisterForNavigation(); + containerRegistry.RegisterDialog(); + containerRegistry.RegisterDialog(); #endregion // 设备记录页面 diff --git a/DM_Weight/Models/ChannelList.cs b/DM_Weight/Models/ChannelList.cs index df22bd6..1ae6f9b 100644 --- a/DM_Weight/Models/ChannelList.cs +++ b/DM_Weight/Models/ChannelList.cs @@ -210,7 +210,7 @@ namespace DM_Weight.Models [SugarColumn(ColumnName = "drug_manu_no")] public string DrugSpec { get=> _drugSpec;set=>SetProperty(ref _drugSpec, value); } - + //药箱对应药品基数 [SugarColumn(ColumnName = "Stock_Quantity")] public int BaseQuantity { diff --git a/DM_Weight/Models/MachineRecord.cs b/DM_Weight/Models/MachineRecord.cs index c84bb7f..51c90d7 100644 --- a/DM_Weight/Models/MachineRecord.cs +++ b/DM_Weight/Models/MachineRecord.cs @@ -73,7 +73,7 @@ namespace DM_Weight.Models [SugarColumn(ColumnName = "eff_date")] public DateTime? EffDate { get; set; } /// - /// 出库入库类型(1入库2出库31还药32还空瓶) + /// 出库入库类型(1入库2出库31还药32还空瓶,21药箱移出移入,69药箱替换) /// [SugarColumn(ColumnName = "type")] public int Type { get; set; } diff --git a/DM_Weight/Models/MoveChannelStock.cs b/DM_Weight/Models/MoveChannelStock.cs new file mode 100644 index 0000000..3d363f5 --- /dev/null +++ b/DM_Weight/Models/MoveChannelStock.cs @@ -0,0 +1,39 @@ +using SqlSugar; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace DM_Weight.Models +{ + /// + /// 药箱药品移动记录表 + /// + [SugarTable("move_channel_stock")] + public class MoveChannelStock + { + //[SugarColumn(ColumnName ="id",IsPrimaryKey =true)] + //public int Id { get; set; } + [SugarColumn(ColumnName = "machine_id")] + public string MachineId{get;set;} + [SugarColumn(ColumnName = "drug_id")] + public string DrugId { get; set; } + [SugarColumn(ColumnName = "quantity")] + public int Quantity { get; set; } + [SugarColumn(ColumnName = "From_manu_no")] + public string FromManuNo { get; set; } + [SugarColumn(ColumnName = "operator")] + public int? Operator { get; set; } + [SugarColumn(ColumnName = "reviewer")] + public int? Reviewer { get; set; } + [SugarColumn(ColumnName = "type")] + public int Type { get; set; } + [SugarColumn(ColumnName = "FromDrawer")] + public int FromDrawer { get; set; } + [SugarColumn(ColumnName = "ToDrawer")] + public int ToDrawer { get; set; } + [SugarColumn(ColumnName = "To_manu_no")] + public string ToManuNo { get; set; } + } +} diff --git a/DM_Weight/ViewModels/CheckSelfOrderWindowViewModel.cs b/DM_Weight/ViewModels/CheckSelfOrderWindowViewModel.cs index e2ddd05..0cf66ac 100644 --- a/DM_Weight/ViewModels/CheckSelfOrderWindowViewModel.cs +++ b/DM_Weight/ViewModels/CheckSelfOrderWindowViewModel.cs @@ -1050,6 +1050,33 @@ namespace DM_Weight.ViewModels //更新处方状态 if (oi.DmStatus == 0) { + //查询该药箱是否有该批次的药品,没有则无法确认(避免管理进行确认时确认不过去) + if(oi.OrderDetailList!=null) + { + for (int j = 0; j < oi.OrderDetailList.Count; j++) + { + oi._OrderDetail = oi.OrderDetailList[j]; + int drawerNo = DrawerNo + 1; + ChannelStock cs = SqlSugarHelper.Db.Queryable() + .Where(cs => cs.DrugId == oi._OrderDetail.DrugId + && cs.ManuNo == oi._OrderDetail.SetManuNo + && cs.MachineId.Equals(ConfigurationManager.AppSettings["machineId"] ?? "DM5") + && cs.DrawerNo == drawerNo).First(); + if (cs == null) + { + AlertMsg alertMsg = new AlertMsg + { + Message = $"处方{oi.OrderNo}应药品批次{oi._OrderDetail.SetManuNo}无库存,无法确认", + Type = MsgType.ERROR, + }; + _eventAggregator.GetEvent().Publish(alertMsg); + return false; + } + } + } + + + SqlSugarHelper.Db.Updateable(new OrderInfo() { DmStatus = 1, diff --git a/DM_Weight/ViewModels/CheckStockWindowViewModel.cs b/DM_Weight/ViewModels/CheckStockWindowViewModel.cs index d150187..fe85c94 100644 --- a/DM_Weight/ViewModels/CheckStockWindowViewModel.cs +++ b/DM_Weight/ViewModels/CheckStockWindowViewModel.cs @@ -56,6 +56,12 @@ namespace DM_Weight.ViewModels get => _channelStocks; set => SetProperty(ref _channelStocks, value); } + private ChannelStock _channelStock; + public ChannelStock _ChannelStock + { + get => _channelStock; + set => SetProperty(ref _channelStock, value); + } private bool _isEnable = true; public bool IsEnable { get => _isEnable; set => SetProperty(ref _isEnable, value); } private int _status = 0; @@ -244,5 +250,16 @@ namespace DM_Weight.ViewModels { get => new DelegateCommand(RequestData); } + + public DelegateCommand RowSelected + { + get => new DelegateCommand(() => + { + if (_channelStock != null) + { + + } + }); + } } } diff --git a/DM_Weight/ViewModels/ExchangeDialogViewModel.cs b/DM_Weight/ViewModels/ExchangeDialogViewModel.cs new file mode 100644 index 0000000..03c2049 --- /dev/null +++ b/DM_Weight/ViewModels/ExchangeDialogViewModel.cs @@ -0,0 +1,470 @@ +using Common.Logging; +using DM_Weight.Models; +using DM_Weight.msg; +using DM_Weight.Port; +using DM_Weight.select; +using DM_Weight.util; +using Prism.Commands; +using Prism.Events; +using Prism.Mvvm; +using Prism.Regions; +using Prism.Services.Dialogs; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading; +using System.Threading.Tasks; + +namespace DM_Weight.ViewModels +{ + public class ExchangeDialogViewModel : BindableBase, IDialogAware, IRegionMemberLifetime + { + private readonly ILog logger = LogManager.GetLogger(typeof(RemoveDialogViewModel)); + public string Title => "替换药品"; + + public event Action RequestClose; + + private static readonly DateTime Jan1st1970 = new DateTime + (1970, 1, 1, 0, 0, 0, DateTimeKind.Utc); + + IEventAggregator _eventAggregator; + + private List _channelStocks = new(); + public List _ChannelStocks + { + get => _channelStocks; + set { SetProperty(ref _channelStocks, value); } + } + + private ChannelStock _csStock; + public ChannelStock _ChannelStock + { + get { return _csStock; } + set { SetProperty(ref _csStock, value); } + } + SocketHelper _socketHelper; + public ExchangeDialogViewModel(IEventAggregator eventAggregator, SocketHelper socketHelper) + { + _eventAggregator = eventAggregator; + _socketHelper = socketHelper; + } + + + private int _status = 0; + + public int Status + { + get => _status; set => SetProperty(ref _status, value); + } + + + static List StaticSelects = new List() + { + new OrderTakeSelect{Name="一号手术间",Code="1"}, + new OrderTakeSelect{Name="二号手术间",Code="2"}, + new OrderTakeSelect{Name="三号手术间",Code="3"}, + new OrderTakeSelect{Name="四号手术间",Code="4"}, + new OrderTakeSelect{Name="五号手术间",Code="5"}, + new OrderTakeSelect{Name="六号手术间",Code="6"}, + new OrderTakeSelect{Name="七号手术间",Code="7"}, + new OrderTakeSelect{Name="八号手术间",Code="8"}, + new OrderTakeSelect{Name="九号手术间",Code="9"}, + new OrderTakeSelect{Name="十号手术间",Code="10"}, + new OrderTakeSelect{Name="十一号手术间",Code="11"}, + new OrderTakeSelect{Name="十二号手术间",Code="12"}, + new OrderTakeSelect{Name="十三号手术间",Code="13"}, + new OrderTakeSelect{Name="十四号手术间",Code="14"}, + new OrderTakeSelect{Name="十五号手术间",Code="15"}, + new OrderTakeSelect{Name="十六号手术间",Code="16"}, + new OrderTakeSelect{Name="十七号手术间",Code="17"}, + new OrderTakeSelect{Name="十八号手术间",Code="18"}, + }; + + private List _selects = StaticSelects; + + public List Selects + { + get { return _selects; } + set + { + SetProperty(ref _selects, value); + } + } + + private OrderTakeSelect _selectedItem = StaticSelects[0]; + public OrderTakeSelect SelectedItem + { + get => _selectedItem; + set + { + RequestData(value.Code); + SetProperty(ref _selectedItem, value); + } + } + //去掉移出的药箱号 + private OrderTakeSelect _removeItem = new(); + public OrderTakeSelect RemoveItem + { + get => _removeItem; + set + { + SetProperty(ref _removeItem, value); + } + } + + public bool CanCloseDialog() + { + return Status == 0; + } + + public void OnDialogClosed() + { + Selects.Insert(_ChannelStock.DrawerNo - 1, RemoveItem); + } + + public void OnDialogOpened(IDialogParameters parameters) + { + ChannelStock _csStock = parameters.GetValue("csStock"); + _ChannelStock = _csStock; + RemoveItem = Selects[_ChannelStock.DrawerNo - 1]; + Selects.Remove(RemoveItem); + + //RequestData(); + } + + public void RequestData(string code) + { + _ChannelStocks = SqlSugarHelper.Db.Queryable() + .Where(cl => cl.MachineId == "DM5") + .WhereIF(!string.IsNullOrEmpty(code), cl => cl.DrawerNo == Convert.ToInt32(code)) + .Where(cl => cl.DrawerType == 1) + .Where(cl => cl.DrugId == _ChannelStock.DrugId && cl.ManuNo != _ChannelStock.ManuNo) + .Includes(cs => cs.DrugInfo) + .ToList(); + } + //开药盒 + public DelegateCommand OpenDrawer + { + get => new DelegateCommand(async () => + { + if (SelectedItem.Code != null) + { + await OpenBox(); + } + else + { + AlertMsg alertMsg = new AlertMsg + { + Message = "请选择要替换的药箱!", + Type = MsgType.ERROR, + }; + _eventAggregator.GetEvent().Publish(alertMsg); + } + + }, () => Status == 0); + } + + private async Task OpenBox() + { + if (_socketHelper.OpenStatus) + { + _socketHelper.speechSynthesizer.SpeakAsyncCancelAll(); + _socketHelper.speechSynthesizer.Resume(); + _socketHelper.SpeakAsync("请关闭手术间后再打开"); + return; + } + MachineRecord machineRecord = new MachineRecord(); + machineRecord.MachineId = "DM5"; + machineRecord.DrawerNo = Convert.ToInt32(SelectedItem.Code); + machineRecord.Operator = HomeWindowViewModel.Operator?.Id; + machineRecord.OperationTime = DateTime.Now; + machineRecord.Type = 55; + machineRecord.InvoiceId = $"打开{Convert.ToInt32(SelectedItem.Code)}号手术间"; + + + if (Convert.ToInt32(SelectedItem.Code) > 0) + { + Status = 1; + _socketHelper.speechSynthesizer.SpeakAsyncCancelAll(); + _socketHelper.speechSynthesizer.Resume(); + _socketHelper.SpeakAsync($"正在打开{SelectedItem.Code}号手术间"); + logger.Info($"正在打开{SelectedItem.Code}号手术间"); + //记录开药箱日志 + SqlSugarHelper.Db.Insertable(machineRecord).ExecuteCommand(); + try + { + _socketHelper.SendMessage(new MyBaseMessage() { lockNo = (short)(Convert.ToInt32(SelectedItem.Code) - 1) }); + _socketHelper.dateTime = DateTime.Now; + } + catch (Exception ex) + { + AlertMsg alertMsg = new AlertMsg + { + Message = $"网口连接异常,正在重试{ex.Message}", + Type = MsgType.ERROR, + }; + _eventAggregator.GetEvent().Publish(alertMsg); + logger.Info($"网口连接异常,正在重试{ex.Message}"); + return; + } + _socketHelper.OpenStatus = true; + //记录药箱打开时间 + ChannelList channelList = SqlSugarHelper.Db.Queryable().Where(cl => cl.MachineId == "DM5" && cl.DrawerNo == _ChannelStock.DrawerNo).First(); + if (channelList != null && (channelList.EffDate is null || Convert.ToDateTime(channelList.EffDate).ToString("yyyy-MM-dd") != DateTime.Now.ToString("yyyy-MM-dd"))) + { + + channelList.EffDate = DateTime.Now.ToString(); + SqlSugarHelper.Db.Updateable(channelList).UpdateColumns(it => new { it.EffDate }).ExecuteCommand(); + } + Thread.Sleep(200); + int iException = 0; + await new PromiseUtil().taskAsyncLoop(500, 0, async (options, next, stop) => + { + try + { + if (_socketHelper.OpenStatus) + { + _socketHelper.SendMessage(new MyBaseMessage() { lockNo = 0x33, functionCode = 4, delay = 2 }); + if (_socketHelper.OpenStatus) + { + next(); + } + else + { + _socketHelper.IsMultiThread = false; + _socketHelper.dateTime = DateTime.Now; + Status = 0; + stop(); + } + } + else + { + _socketHelper.IsMultiThread = false; + _socketHelper.dateTime = DateTime.Now; + Status = 0; + stop(); + } + iException = 0; + } + catch (Exception ex) + { + iException++; + if (iException >= 3) + { + _socketHelper.OpenStatus = false; + } + AlertMsg alertMsg = new AlertMsg + { + Message = $"网口连接异常,正在重试{ex.Message}", + Type = MsgType.ERROR, + }; + _eventAggregator.GetEvent().Publish(alertMsg); + logger.Info($"网口连接异常,正在重试{ex.Message}"); + next(); + } + }); + } + } + + private bool _isFinishClick = false; + + public bool IsFinishClick { get => _isFinishClick; set => SetProperty(ref _isFinishClick, value); } + // 完成按钮 + public DelegateCommand FinishCommand + { + get => new DelegateCommand(() => + { + try + { + + + List saveChannelStock = _ChannelStocks.Where(cs => cs.TakeQuantity > 0).ToList(); + if (saveChannelStock == null || saveChannelStock.Count <= 0) + { + AlertMsg alertMsg = new AlertMsg + { + Message = "请填写要交换药品的交换数量", + Type = MsgType.ERROR, + }; + _eventAggregator.GetEvent().Publish(alertMsg); + return; + } + int sumQuantity = saveChannelStock.Sum(cs => cs.TakeQuantity); + if (sumQuantity > _ChannelStock.Quantity) + { + AlertMsg alertMsg = new AlertMsg + { + Message = "交换总数不能大于库存", + Type = MsgType.ERROR, + }; + _eventAggregator.GetEvent().Publish(alertMsg); + return; + } + + IsFinishClick = true; + var f = SqlSugarHelper.Db.UseTran(() => + { + for (int i = 0; i < saveChannelStock.Count; i++) + { + ChannelStock currentChannelStock = saveChannelStock[i]; + if (currentChannelStock.Quantity < currentChannelStock.TakeQuantity) + { + AlertMsg alertMsg = new AlertMsg + { + Message = $"药品{currentChannelStock.DrugInfo.DrugName}交换数量不能大于库存", + Type = MsgType.ERROR, + }; + _eventAggregator.GetEvent().Publish(alertMsg); + return false; + } + + string csId = Guid.NewGuid().ToString(); + //查询【出药】的药箱中是否有该批次药品 + ChannelStock ReplaceChannelStockList = SqlSugarHelper.Db.Queryable() + .Where(cs => cs.MachineId.Equals(_ChannelStock.MachineId)) + .Where(cs => cs.DrawerNo == _ChannelStock.DrawerNo) + .Where(cs => cs.DrugId.Equals(currentChannelStock.DrugId)) + .Where(cs => cs.ManuNo.Equals(currentChannelStock.ManuNo)) + .First(); + //修改已替换的药品批次数量(现库存数-已替换总数) + _ChannelStock.Quantity = _ChannelStock.Quantity - sumQuantity; + SqlSugarHelper.Db.Updateable(_ChannelStock).UpdateColumns(it => new { it.Quantity }).ExecuteCommand(); + + if (ReplaceChannelStockList != null) + { + //有该批次药品则更新 + csId = ReplaceChannelStockList.Id; + ReplaceChannelStockList.Quantity = ReplaceChannelStockList.Quantity + currentChannelStock.TakeQuantity; + SqlSugarHelper.Db.Updateable(ReplaceChannelStockList).UpdateColumns(it => new { it.Quantity }).ExecuteCommand(); + + } + else + { + //没有该批次药品则插入 + SqlSugarHelper.Db.Insertable(new ChannelStock() + { + MachineId = _ChannelStock.MachineId, + DrawerNo = _ChannelStock.DrawerNo, + DrugId = _ChannelStock.DrugId, + ManuNo = currentChannelStock.ManuNo, + Quantity = currentChannelStock.TakeQuantity, + DrawerType = 1, + Chnguid = _ChannelStock.Chnguid, + Id = csId, + }).ExecuteCommand(); + } + + // 保存数据 替换药记录 + SqlSugarHelper.Db.Insertable(new MoveChannelStock() + { + MachineId = _ChannelStock.MachineId, + FromDrawer = _ChannelStock.DrawerNo, + ToDrawer = currentChannelStock.DrawerNo, + DrugId = _ChannelStock.DrugId, + FromManuNo = _ChannelStock.ManuNo, + ToManuNo = currentChannelStock.ManuNo, + Operator = HomeWindowViewModel.Operator?.Id, + Reviewer = HomeWindowViewModel.Reviewer?.Id, + Quantity = currentChannelStock.TakeQuantity, + Type = 69, + }).ExecuteCommand(); + + //查询【入药】的药箱中是否有该批次药品 + ChannelStock Replace2ChannelStockList = SqlSugarHelper.Db.Queryable() + .Where(cs => cs.MachineId.Equals(_ChannelStock.MachineId)) + .Where(cs => cs.DrawerNo == currentChannelStock.DrawerNo) + .Where(cs => cs.DrugId.Equals(_ChannelStock.DrugId)) + .Where(cs => cs.ManuNo.Equals(_ChannelStock.ManuNo)) + .First(); + //修改替换的药品批次数量(现库存数-已替换总数) + currentChannelStock.Quantity = currentChannelStock.Quantity - currentChannelStock.TakeQuantity; + SqlSugarHelper.Db.Updateable(currentChannelStock).UpdateColumns(it => new { it.Quantity }).ExecuteCommand(); + + if (Replace2ChannelStockList!=null) + { + //有该批次药品则更新库存 + Replace2ChannelStockList.Quantity = Replace2ChannelStockList.Quantity + currentChannelStock.TakeQuantity; + SqlSugarHelper.Db.Updateable(Replace2ChannelStockList).UpdateColumns(it => new { it.Quantity }).ExecuteCommand(); + } + else + { + //没有该批次药品则插入 + SqlSugarHelper.Db.Insertable(new ChannelStock() + { + MachineId = _ChannelStock.MachineId, + DrawerNo = _ChannelStock.DrawerNo, + DrugId = _ChannelStock.DrugId, + ManuNo = _ChannelStock.ManuNo, + Quantity = currentChannelStock.TakeQuantity, + DrawerType = 1, + Chnguid = currentChannelStock.Chnguid, + Id = csId, + }).ExecuteCommand(); + } + } + return true; + }); + if (f.Data) + { + AlertMsg alertMsg = new AlertMsg + { + Message = "操作完成,库存已更新", + Type = MsgType.SUCCESS, + }; + _eventAggregator.GetEvent().Publish(alertMsg); + } + if (!f.IsSuccess) + { + AlertMsg alertMsg = new AlertMsg + { + Message = "库存更新失败!", + Type = MsgType.ERROR, + }; + _eventAggregator.GetEvent().Publish(alertMsg); + } + Status = 0; + IsFinishClick = false; + RequestClose?.Invoke(new DialogResult(ButtonResult.OK)); + } + catch (Exception ex) + { + AlertMsg alertMsg = new AlertMsg + { + Message = "替换药品异常", + Type = MsgType.ERROR, + }; + _eventAggregator.GetEvent().Publish(alertMsg); + } + }, () => !IsFinishClick); + } + + public long CurrentTimeMillis() + { + return (long)(DateTime.UtcNow - Jan1st1970).TotalMilliseconds; + } + + // 取消按钮 + public DelegateCommand CancleCommand + { + get => new DelegateCommand(() => + { + IsFinishClick = false; + Status = 0; + // 关闭当前窗口 + RequestClose?.Invoke(new DialogResult(ButtonResult.Cancel)); + }); + } + + public DelegateCommand BtnCloseCommand + { + get => new DelegateCommand(() => + { + // 关闭当前窗口 + RequestClose?.Invoke(new DialogResult(ButtonResult.Cancel)); + }, () => Status == 0).ObservesProperty(() => Status); + } + + public bool KeepAlive => false; + } +} diff --git a/DM_Weight/ViewModels/ExchangeWindowViewModel.cs b/DM_Weight/ViewModels/ExchangeWindowViewModel.cs new file mode 100644 index 0000000..49b9524 --- /dev/null +++ b/DM_Weight/ViewModels/ExchangeWindowViewModel.cs @@ -0,0 +1,251 @@ +using Common.Logging; +using DM_Weight.Models; +using DM_Weight.msg; +using DM_Weight.Port; +using DM_Weight.util; +using Prism.Commands; +using Prism.Events; +using Prism.Mvvm; +using Prism.Regions; +using Prism.Services.Dialogs; +using System; +using System.Collections.Generic; +using System.Configuration; +using System.Drawing.Printing; +using System.Linq; +using System.Text; +using System.Threading; +using System.Threading.Tasks; + +namespace DM_Weight.ViewModels +{ + public class ExchangeWindowViewModel : BindableBase, INavigationAware, IRegionMemberLifetime + { + public bool KeepAlive => false; + + private readonly ILog logger = LogManager.GetLogger(typeof(CheckOrderNewWindowViewModel)); + + private List _channelStocks=new List(); + public List _ChannelStocks + { + get => _channelStocks; + set=>SetProperty(ref _channelStocks, value); + } + + private ChannelStock _selectedChannelStock=new ChannelStock(); + public ChannelStock _ChannelStock + { + get=>_selectedChannelStock; + set=>SetProperty(ref _selectedChannelStock, value); + } + //所选药箱号 + private int _drawerNo = -1; + + public int DrawerNo + { + get => _drawerNo; + set => SetProperty(ref _drawerNo, value); + } + + IDialogService _dialogService; + SocketHelper _socketHelper; + IEventAggregator _eventAggregator; + public ExchangeWindowViewModel(IEventAggregator eventAggregator, IDialogService DialogService, SocketHelper socketHelper) + { + _dialogService = DialogService; + _socketHelper = socketHelper; + _eventAggregator = eventAggregator; + } + public DelegateCommand UpdateDrawerNo + { + get => new DelegateCommand(OpenBoxAction); + } + public async void OpenBoxAction(string strDrawerNo) + { + if (_socketHelper.OpenStatus) + { + _socketHelper.speechSynthesizer.SpeakAsyncCancelAll(); + _socketHelper.speechSynthesizer.Resume(); + _socketHelper.SpeakAsync("请关闭手术间后再打开"); + return; + } + DrawerNo = Convert.ToInt32(strDrawerNo); + MachineRecord machineRecord = new MachineRecord(); + machineRecord.MachineId = "DM5"; + machineRecord.DrawerNo = DrawerNo; + machineRecord.Operator = HomeWindowViewModel.Operator?.Id; + machineRecord.OperationTime = DateTime.Now; + machineRecord.Type = 55; + machineRecord.InvoiceId = $"打开{DrawerNo}号手术间"; + + + if (DrawerNo > 0) + { + RequestData(); + _socketHelper.speechSynthesizer.SpeakAsyncCancelAll(); + _socketHelper.speechSynthesizer.Resume(); + _socketHelper.SpeakAsync($"正在打开{DrawerNo+1}号手术间"); + logger.Info($"正在打开{DrawerNo+1}号手术间"); + //记录开药箱日志 + SqlSugarHelper.Db.Insertable(machineRecord).ExecuteCommand(); + try + { + _socketHelper.SendMessage(new MyBaseMessage() { lockNo = (short)(DrawerNo - 1) }); + _socketHelper.dateTime = DateTime.Now; + } + catch (Exception ex) + { + AlertMsg alertMsg = new AlertMsg + { + Message = $"网口连接异常,正在重试{ex.Message}", + Type = MsgType.ERROR, + }; + _eventAggregator.GetEvent().Publish(alertMsg); + logger.Info($"网口连接异常,正在重试{ex.Message}"); + return; + } + _socketHelper.OpenStatus = true; + //记录药箱打开时间 + ChannelList channelList = SqlSugarHelper.Db.Queryable().Where(cl => cl.MachineId == "DM5" && cl.DrawerNo == DrawerNo).First(); + if (channelList != null && (channelList.EffDate is null || Convert.ToDateTime(channelList.EffDate).ToString("yyyy-MM-dd") != DateTime.Now.ToString("yyyy-MM-dd"))) + { + + channelList.EffDate = DateTime.Now.ToString(); + SqlSugarHelper.Db.Updateable(channelList).UpdateColumns(it => new { it.EffDate }).ExecuteCommand(); + } + Thread.Sleep(200); + int iException = 0; + await new PromiseUtil().taskAsyncLoop(500, 0, async (options, next, stop) => + { + try + { + if (_socketHelper.OpenStatus) + { + _socketHelper.SendMessage(new MyBaseMessage() { lockNo = 0x33, functionCode = 4, delay = 2 }); + + if (_socketHelper.OpenStatus) + { + next(); + } + else + { + _socketHelper.IsMultiThread = false; + _socketHelper.dateTime = DateTime.Now; + stop(); + } + } + else + { + _socketHelper.IsMultiThread = false; + _socketHelper.dateTime = DateTime.Now; + stop(); + } + iException = 0; + } + catch (Exception ex) + { + iException++; + if (iException >= 3) + { + _socketHelper.OpenStatus = false; + } + AlertMsg alertMsg = new AlertMsg + { + Message = $"网口连接异常,正在重试{ex.Message}", + Type = MsgType.ERROR, + }; + _eventAggregator.GetEvent().Publish(alertMsg); + logger.Info($"网口连接异常,正在重试{ex.Message}"); + next(); + } + }); + } + } + + private void RequestData() + { + List queryData = SqlSugarHelper.Db.Queryable() + .Includes(cs => cs.DrugInfo) + .Where(cs => cs.DrawerNo == DrawerNo + 1) + .Where(cs => cs.DrugId != null) + .Where(cs => cs.MachineId.Equals(ConfigurationManager.AppSettings["machineId"] ?? "DM5")) + .OrderBy(cs => cs.DrugId) + .ToList(); + _ChannelStocks = queryData.Select(it => { it.CheckQuantity = it.Quantity; return it; }).ToList(); + } + public bool IsNavigationTarget(NavigationContext navigationContext) + { + return true; + } + + public void OnNavigatedFrom(NavigationContext navigationContext) + { + } + + public void OnNavigatedTo(NavigationContext navigationContext) + { + + } + + public DelegateCommand ExchangeCommand + { + get =>new DelegateCommand(Exchange); + } + //替换 + private async void Exchange() + { + if (_ChannelStock == null) + { + logger.Error("请选择要交换的药品"); + return; + } + if (_ChannelStock.DrugInfo == null) + { + logger.Error("请选��要交换的药品"); + return; + } + // 此处延时1毫秒,等待页面渲染 + await Task.Delay(TimeSpan.FromMilliseconds(1)); + //选中药箱号下的所有药品id + DialogParameters dialogParameters = new DialogParameters(); + dialogParameters.Add("csStock", _ChannelStock); + DialogServiceExtensions.ShowDialogHost(_dialogService, "ExchangeDialog", dialogParameters, DoDialogResult, "RootDialog"); + } + //移出 + public DelegateCommand RemoveCommand + { + get => new DelegateCommand(Remove); + } + private async void Remove() + { + // 此处延时1毫秒,等待页面渲染 + await Task.Delay(TimeSpan.FromMilliseconds(1)); + //选中药箱号下的所有药品id + DialogParameters dialogParameters = new DialogParameters(); + dialogParameters.Add("csStock", _ChannelStock); + DialogServiceExtensions.ShowDialogHost(_dialogService, "RemoveDialog", dialogParameters, DoDialogResult, "RootDialog"); + } + private void DoDialogResult(IDialogResult dialogResult) + { + RequestData(); + } + + private DelegateCommand _rowSelected; + + public DelegateCommand RowSelected => _rowSelected ??= new DelegateCommand(OpenOrderDialog); + public async void OpenOrderDialog() + { + //if (_ChannelStock != null) + //{ + // // 此处延时1毫秒,等待页面渲染 + // await Task.Delay(TimeSpan.FromMilliseconds(1)); + // //选中药箱号下的所有药品id + // DialogParameters dialogParameters = new DialogParameters(); + // dialogParameters.Add("_ChannelStock", _ChannelList.channelStocks); + // DialogServiceExtensions.ShowDialogHost(_dialogService, "AddToJiaoJieDialog", dialogParameters, DoDialogResult, "RootDialog"); + + //} + + } + } +} diff --git a/DM_Weight/ViewModels/RemoveDialogViewModel.cs b/DM_Weight/ViewModels/RemoveDialogViewModel.cs new file mode 100644 index 0000000..2419c28 --- /dev/null +++ b/DM_Weight/ViewModels/RemoveDialogViewModel.cs @@ -0,0 +1,438 @@ +using Common.Logging; +using DM_Weight.Models; +using DM_Weight.msg; +using DM_Weight.Port; +using DM_Weight.select; +using DM_Weight.util; +using Prism.Commands; +using Prism.Events; +using Prism.Mvvm; +using Prism.Regions; +using Prism.Services.Dialogs; +using System; +using System.Collections.Generic; +using System.Configuration; +using System.Linq; +using System.Text; +using System.Threading; +using System.Threading.Tasks; + +namespace DM_Weight.ViewModels +{ + public class RemoveDialogViewModel : BindableBase, IDialogAware, IRegionMemberLifetime + { + private readonly ILog logger = LogManager.GetLogger(typeof(RemoveDialogViewModel)); + public string Title => "药品移出药箱"; + + public event Action RequestClose; + + private static readonly DateTime Jan1st1970 = new DateTime + (1970, 1, 1, 0, 0, 0, DateTimeKind.Utc); + + IEventAggregator _eventAggregator; + + private ChannelStock _csStock; + public ChannelStock _ChannelStock + { + get { return _csStock; } + set { SetProperty(ref _csStock, value); } + } + SocketHelper _socketHelper; + public RemoveDialogViewModel(IEventAggregator eventAggregator, SocketHelper socketHelper) + { + _eventAggregator = eventAggregator; + _socketHelper = socketHelper; + } + + + private int _status = 0; + + public int Status + { + get => _status; set => SetProperty(ref _status, value); + } + + + static List StaticSelects = new List() + { + new OrderTakeSelect{Name="一号手术间",Code="1"}, + new OrderTakeSelect{Name="二号手术间",Code="2"}, + new OrderTakeSelect{Name="三号手术间",Code="3"}, + new OrderTakeSelect{Name="四号手术间",Code="4"}, + new OrderTakeSelect{Name="五号手术间",Code="5"}, + new OrderTakeSelect{Name="六号手术间",Code="6"}, + new OrderTakeSelect{Name="七号手术间",Code="7"}, + new OrderTakeSelect{Name="八号手术间",Code="8"}, + new OrderTakeSelect{Name="九号手术间",Code="9"}, + new OrderTakeSelect{Name="十号手术间",Code="10"}, + new OrderTakeSelect{Name="十一号手术间",Code="11"}, + new OrderTakeSelect{Name="十二号手术间",Code="12"}, + new OrderTakeSelect{Name="十三号手术间",Code="13"}, + new OrderTakeSelect{Name="十四号手术间",Code="14"}, + new OrderTakeSelect{Name="十五号手术间",Code="15"}, + new OrderTakeSelect{Name="十六号手术间",Code="16"}, + new OrderTakeSelect{Name="十七号手术间",Code="17"}, + new OrderTakeSelect{Name="十八号手术间",Code="18"}, + }; + + private List _selects = StaticSelects; + + public List Selects + { + get { return _selects; } + set + { + SetProperty(ref _selects, value); + } + } + + + private OrderTakeSelect _selectedItem = StaticSelects[0]; + public OrderTakeSelect SelectedItem + { + get => _selectedItem; + set => SetProperty(ref _selectedItem, value); + } + //去掉移出的药箱号 + private OrderTakeSelect _removeItem = new(); + public OrderTakeSelect RemoveItem + { + get => _removeItem; + set => SetProperty(ref _removeItem, value); + } + + private int _removeQuantity; + + public int RemoveQuantity + { + get => _removeQuantity; + set + { + if (value < 0) + { + throw new ArgumentException("移入数量不能是负数"); + } + if (value > _ChannelStock.Quantity) + { + throw new ArgumentException("移入数量超出库存数"); + } + SetProperty(ref _removeQuantity, value); + } + } + + + public bool CanCloseDialog() + { + return Status == 0; + } + + public void OnDialogClosed() + { + Selects.Insert(_ChannelStock.DrawerNo - 1, RemoveItem); + } + + public void OnDialogOpened(IDialogParameters parameters) + { + ChannelStock _csStock = parameters.GetValue("csStock"); + _ChannelStock = _csStock; + RemoveItem = Selects[_ChannelStock.DrawerNo - 1]; + Selects.Remove(RemoveItem); + RemoveQuantity = _ChannelStock.Quantity; + + RequestData(); + } + + public void RequestData() + { + } + //开药盒 + public DelegateCommand OpenDrawer + { + get => new DelegateCommand(async () => + { + if (SelectedItem != null) + { + await OpenBox(); + } + else + { + AlertMsg alertMsg = new AlertMsg + { + Message = "请选择要移入的药箱!", + Type = MsgType.ERROR, + }; + _eventAggregator.GetEvent().Publish(alertMsg); + } + + }, () => Status == 0); + } + + private async Task OpenBox() + { + if (_socketHelper.OpenStatus) + { + _socketHelper.speechSynthesizer.SpeakAsyncCancelAll(); + _socketHelper.speechSynthesizer.Resume(); + _socketHelper.SpeakAsync("请关闭手术间后再打开"); + return; + } + MachineRecord machineRecord = new MachineRecord(); + machineRecord.MachineId = "DM5"; + machineRecord.DrawerNo = Convert.ToInt32(SelectedItem.Code); + machineRecord.Operator = HomeWindowViewModel.Operator?.Id; + machineRecord.OperationTime = DateTime.Now; + machineRecord.Type = 55; + machineRecord.InvoiceId = $"打开{Convert.ToInt32(SelectedItem.Code)}号手术间"; + + + if (Convert.ToInt32(SelectedItem.Code) > 0) + { + RequestData(); + Status = 1; + _socketHelper.speechSynthesizer.SpeakAsyncCancelAll(); + _socketHelper.speechSynthesizer.Resume(); + _socketHelper.SpeakAsync($"正在打开{SelectedItem.Code}号手术间"); + logger.Info($"正在打开{SelectedItem.Code}号手术间"); + //记录开药箱日志 + SqlSugarHelper.Db.Insertable(machineRecord).ExecuteCommand(); + try + { + _socketHelper.SendMessage(new MyBaseMessage() { lockNo = (short)(Convert.ToInt32(SelectedItem.Code) - 1) }); + _socketHelper.dateTime = DateTime.Now; + } + catch (Exception ex) + { + AlertMsg alertMsg = new AlertMsg + { + Message = $"网口连接异常,正在重试{ex.Message}", + Type = MsgType.ERROR, + }; + _eventAggregator.GetEvent().Publish(alertMsg); + logger.Info($"网口连接异常,正在重试{ex.Message}"); + return; + } + _socketHelper.OpenStatus = true; + //记录药箱打开时间 + ChannelList channelList = SqlSugarHelper.Db.Queryable().Where(cl => cl.MachineId == "DM5" && cl.DrawerNo == _ChannelStock.DrawerNo).First(); + if (channelList != null && (channelList.EffDate is null || Convert.ToDateTime(channelList.EffDate).ToString("yyyy-MM-dd") != DateTime.Now.ToString("yyyy-MM-dd"))) + { + + channelList.EffDate = DateTime.Now.ToString(); + SqlSugarHelper.Db.Updateable(channelList).UpdateColumns(it => new { it.EffDate }).ExecuteCommand(); + } + Thread.Sleep(200); + int iException = 0; + await new PromiseUtil().taskAsyncLoop(500, 0, async (options, next, stop) => + { + try + { + if (_socketHelper.OpenStatus) + { + _socketHelper.SendMessage(new MyBaseMessage() { lockNo = 0x33, functionCode = 4, delay = 2 }); + if (_socketHelper.OpenStatus) + { + next(); + } + else + { + _socketHelper.IsMultiThread = false; + _socketHelper.dateTime = DateTime.Now; + Status = 0; + stop(); + } + } + else + { + _socketHelper.IsMultiThread = false; + _socketHelper.dateTime = DateTime.Now; + Status = 0; + stop(); + } + iException = 0; + } + catch (Exception ex) + { + iException++; + if (iException >= 3) + { + _socketHelper.OpenStatus = false; + } + AlertMsg alertMsg = new AlertMsg + { + Message = $"网口连接异常,正在重试{ex.Message}", + Type = MsgType.ERROR, + }; + _eventAggregator.GetEvent().Publish(alertMsg); + logger.Info($"网口连接异常,正在重试{ex.Message}"); + next(); + } + }); + } + } + + private bool _isFinishClick = false; + + public bool IsFinishClick { get => _isFinishClick; set => SetProperty(ref _isFinishClick, value); } + // 完成按钮 + public DelegateCommand FinishCommand + { + get => new DelegateCommand(() => + { + try + { + IsFinishClick = true; + var f = SqlSugarHelper.Db.UseTran(() => + { + //查询要移入的药箱中是否有该药品 + List RemoveChannelStockList = SqlSugarHelper.Db.Queryable() + .Where(cs => cs.MachineId.Equals(_ChannelStock.MachineId)) + .Where(cs => cs.DrawerNo == Convert.ToInt32(SelectedItem.Code)) + .Where(cs => cs.DrugId.Equals(_ChannelStock.DrugId)) + //.Where(cs => cs.ManuNo.Equals(_ChannelStock.ManuNo)) + .ToList(); + ChannelList channelList = SqlSugarHelper.Db.Queryable() + .Where(cl => cl.MachineId.Equals(_ChannelStock.MachineId)) + .Where(cs => cs.DrawerNo == Convert.ToInt32(SelectedItem.Code)) + .Where(cs => cs.DrugId.Equals(_ChannelStock.DrugId)).First(); + if (RemoveChannelStockList != null&& RemoveChannelStockList.Count>0&& channelList!=null&&!string.IsNullOrEmpty(channelList.Id)) + { + //查询药品总数(移入后是否超基数) + + int sumQuantity = RemoveChannelStockList.Sum(rs => rs.Quantity); + if (sumQuantity + RemoveQuantity > channelList.BaseQuantity) + { + AlertMsg alertMsg = new AlertMsg + { + Message = "移入数量超出药箱基数,请重新选择", + Type = MsgType.ERROR, + }; + _eventAggregator.GetEvent().Publish(alertMsg); + return false; + } + + //减当前药箱的数量,添加需要加药数量 + _ChannelStock.Quantity = _ChannelStock.Quantity - RemoveQuantity; + _ChannelStock.NeedNum = RemoveQuantity; + SqlSugarHelper.Db.Updateable(_ChannelStock).UpdateColumns(it => new { it.Quantity,it.NeedNum }).ExecuteCommand(); + + string csId = Guid.NewGuid().ToString(); + //查询要移动的药箱是否有该批次 + ChannelStock removeChannelStock = RemoveChannelStockList.Where(it => it.ManuNo == _ChannelStock.ManuNo).First(); + //有该药品且有该批次 + if (removeChannelStock != null) + { + csId = removeChannelStock.Id; + removeChannelStock.Quantity = removeChannelStock.Quantity + RemoveQuantity; + SqlSugarHelper.Db.Updateable(removeChannelStock).UpdateColumns(it => new { it.Quantity }).ExecuteCommand(); + } + else + { + //有该药品但没有该批次 + SqlSugarHelper.Db.Insertable(new ChannelStock() + { + MachineId = _ChannelStock.MachineId, + DrawerNo = Convert.ToInt32(SelectedItem.Code), + ColNo = _ChannelStock.ColNo, + DrugId = _ChannelStock.DrugId, + ManuNo = _ChannelStock.ManuNo, + Quantity = RemoveQuantity, + DrawerType = 1, + Chnguid = _ChannelStock.Chnguid, + Id = csId, + }).ExecuteCommand(); + } + + // 保存数据 药品移出记录 + SqlSugarHelper.Db.Insertable(new MachineRecord() + { + MachineId = _ChannelStock.MachineId, + DrawerNo = _ChannelStock.DrawerNo, + ColNo = _ChannelStock.ColNo, + DrugId = _ChannelStock.DrugId, + ManuNo = _ChannelStock.ManuNo, + EffDate = !String.IsNullOrEmpty(_ChannelStock.EffDate) ? DateTime.ParseExact(_ChannelStock.EffDate, "yyyy-MM-dd", System.Globalization.CultureInfo.CurrentCulture) : null, + Operator = HomeWindowViewModel.Operator?.Id, + OperationTime = DateTime.Now, + Quantity = RemoveQuantity, + Type = 21, + InvoiceId = _ChannelStock.Id, + DepartmentId = csId //要移入的药箱的channelStock的id + }).ExecuteCommand(); + } + else + { + //没有绑定该药品 + AlertMsg alertMsg = new AlertMsg + { + Message = "药箱没有绑定该药品,请先绑定", + Type = MsgType.ERROR, + }; + _eventAggregator.GetEvent().Publish(alertMsg); + return false; + } + return true; + }); + if (f.Data) + { + AlertMsg alertMsg = new AlertMsg + { + Message = "操作完成,库存已更新", + Type = MsgType.SUCCESS, + }; + _eventAggregator.GetEvent().Publish(alertMsg); + } + if (!f.IsSuccess) + { + AlertMsg alertMsg = new AlertMsg + { + Message = "库存更新失败!", + Type = MsgType.ERROR, + }; + _eventAggregator.GetEvent().Publish(alertMsg); + } + Status = 0; + IsFinishClick = false; + RequestClose?.Invoke(new DialogResult(ButtonResult.OK)); + } + catch (Exception ex) + { + AlertMsg alertMsg = new AlertMsg + { + Message = $"操作异常!{ex.Message}", + Type = MsgType.ERROR, + }; + _eventAggregator.GetEvent().Publish(alertMsg); + } + + }, () => !IsFinishClick && RemoveQuantity > 0).ObservesProperty(() => IsFinishClick).ObservesProperty(() => RemoveQuantity); + } + + public long CurrentTimeMillis() + { + return (long)(DateTime.UtcNow - Jan1st1970).TotalMilliseconds; + } + + // 取消按钮 + public DelegateCommand CancleCommand + { + get => new DelegateCommand(() => + { + IsFinishClick = false; + Status = 0; + // 关闭当前窗口 + RequestClose?.Invoke(new DialogResult(ButtonResult.Cancel)); + }); + } + + public DelegateCommand BtnCloseCommand + { + get => new DelegateCommand(() => + { + // 关闭当前窗口 + RequestClose?.Invoke(new DialogResult(ButtonResult.Cancel)); + }, () => Status == 0).ObservesProperty(() => Status); + } + + public bool KeepAlive => false; + } +} diff --git a/DM_Weight/ViewModels/RoleManagerWindowViewModel.cs b/DM_Weight/ViewModels/RoleManagerWindowViewModel.cs index 3ac2852..a0f4b0b 100644 --- a/DM_Weight/ViewModels/RoleManagerWindowViewModel.cs +++ b/DM_Weight/ViewModels/RoleManagerWindowViewModel.cs @@ -526,6 +526,12 @@ namespace DM_Weight.ViewModels PremissionName = "盘点", PremissionPath = "CheckStockWindow", }; + PremissionDm sysset5 = new PremissionDm + { + Id = 58, + PremissionName = "药箱药品调整", + PremissionPath = "ExchangeWindow", + }; syssetChild.Add(sysset1); syssetChild.Add(sysset2); syssetChild.Add(syssetLogin); @@ -534,6 +540,7 @@ namespace DM_Weight.ViewModels syssetChild.Add(wSDRecord); syssetChild.Add(sysset3); syssetChild.Add(sysset4); + syssetChild.Add(sysset5); sysset.Children = syssetChild; defaultAll.Add(sysset); #endregion diff --git a/DM_Weight/Views/AdditionWindow.xaml b/DM_Weight/Views/AdditionWindow.xaml index 5f827ce..a94a844 100644 --- a/DM_Weight/Views/AdditionWindow.xaml +++ b/DM_Weight/Views/AdditionWindow.xaml @@ -194,11 +194,11 @@ - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +