476 lines
21 KiB
C#
476 lines
21 KiB
C#
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<IDialogResult> RequestClose;
|
|
|
|
private static readonly DateTime Jan1st1970 = new DateTime
|
|
(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc);
|
|
|
|
IEventAggregator _eventAggregator;
|
|
|
|
private List<ChannelStock> _channelStocks = new();
|
|
public List<ChannelStock> _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<OrderTakeSelect> StaticSelects = new List<OrderTakeSelect>()
|
|
{
|
|
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<OrderTakeSelect> _selects = StaticSelects;
|
|
|
|
public List<OrderTakeSelect> 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<ChannelStock>("csStock");
|
|
_ChannelStock = _csStock;
|
|
RemoveItem = Selects[_ChannelStock.DrawerNo - 1];
|
|
Selects.Remove(RemoveItem);
|
|
|
|
//RequestData();
|
|
}
|
|
|
|
public void RequestData(string code)
|
|
{
|
|
_ChannelStocks = SqlSugarHelper.Db.Queryable<ChannelStock>()
|
|
.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<DrugInfo>(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<SnackbarEvent>().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<SnackbarEvent>().Publish(alertMsg);
|
|
logger.Info($"网口连接异常,正在重试{ex.Message}");
|
|
return;
|
|
}
|
|
_socketHelper.OpenStatus = true;
|
|
//记录药箱打开时间
|
|
ChannelList channelList = SqlSugarHelper.Db.Queryable<ChannelList>().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<int>().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<SnackbarEvent>().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<ChannelStock> saveChannelStock = _ChannelStocks.Where(cs => cs.TakeQuantity > 0).ToList();
|
|
if (saveChannelStock == null || saveChannelStock.Count <= 0)
|
|
{
|
|
AlertMsg alertMsg = new AlertMsg
|
|
{
|
|
Message = "请填写要交换药品的交换数量",
|
|
Type = MsgType.ERROR,
|
|
};
|
|
_eventAggregator.GetEvent<SnackbarEvent>().Publish(alertMsg);
|
|
return;
|
|
}
|
|
int sumQuantity = saveChannelStock.Sum(cs => cs.TakeQuantity);
|
|
if (sumQuantity > _ChannelStock.Quantity)
|
|
{
|
|
AlertMsg alertMsg = new AlertMsg
|
|
{
|
|
Message = "交换总数不能大于库存",
|
|
Type = MsgType.ERROR,
|
|
};
|
|
_eventAggregator.GetEvent<SnackbarEvent>().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<SnackbarEvent>().Publish(alertMsg);
|
|
return false;
|
|
}
|
|
|
|
string csId = Guid.NewGuid().ToString();
|
|
//查询【出药】的药箱中是否有该批次药品
|
|
ChannelStock ReplaceChannelStockList = SqlSugarHelper.Db.Queryable<ChannelStock>()
|
|
.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<ChannelStock>()
|
|
.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<SnackbarEvent>().Publish(alertMsg);
|
|
}
|
|
if (!f.IsSuccess)
|
|
{
|
|
AlertMsg alertMsg = new AlertMsg
|
|
{
|
|
Message = "库存更新失败!",
|
|
Type = MsgType.ERROR,
|
|
};
|
|
_eventAggregator.GetEvent<SnackbarEvent>().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<SnackbarEvent>().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;
|
|
}
|
|
}
|