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 = $"交换药品明细{_ChannelStock?.DrawerNo},打开{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(); //修改已替换的药品批次数量(现库存数-已替换总数) if (_ChannelStock.Quantity > 0) { _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, EffDate = currentChannelStock.EffDate, Quantity = currentChannelStock.TakeQuantity, DrawerType = 1, Chnguid = _ChannelStock.Chnguid, Id = csId, BaseQuantity= _ChannelStock.BaseQuantity }).ExecuteCommand(); } string csToId = Guid.NewGuid().ToString(); // 保存数据 替换药记录 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 = currentChannelStock.DrawerNo, DrugId = _ChannelStock.DrugId, ManuNo = _ChannelStock.ManuNo, Quantity = currentChannelStock.TakeQuantity, DrawerType = 1, Chnguid = currentChannelStock.Chnguid, Id = csToId, BaseQuantity= currentChannelStock.BaseQuantity }).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; } }