950 lines
40 KiB
C#
950 lines
40 KiB
C#
using DM_Weight.Models;
|
||
using DM_Weight.msg;
|
||
using DM_Weight.Port;
|
||
using DM_Weight.select;
|
||
using DM_Weight.util;
|
||
using log4net;
|
||
using MaterialDesignThemes.Wpf;
|
||
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;
|
||
using System.Windows.Media;
|
||
|
||
namespace DM_Weight.ViewModels
|
||
{
|
||
public class AddSurgeryDialogViewModel : BindableBase, IDialogAware, IRegionMemberLifetime
|
||
{
|
||
public string Title => "录入手术";
|
||
|
||
public bool KeepAlive => false;
|
||
|
||
private List<MachineRecord> machineRecordList;
|
||
public List<MachineRecord> MachineRecordList { get => machineRecordList; set => SetProperty(ref machineRecordList, value); }
|
||
|
||
private SolidColorBrush _colorBrush;
|
||
|
||
public SolidColorBrush SnackbarBackground
|
||
{
|
||
get => _colorBrush;
|
||
set => SetProperty(ref _colorBrush, value);
|
||
}
|
||
|
||
private ISnackbarMessageQueue _snackbarMessageQueue = new SnackbarMessageQueue(TimeSpan.FromSeconds(3));
|
||
|
||
public ISnackbarMessageQueue SnackbarMessageQueue
|
||
{
|
||
get => _snackbarMessageQueue;
|
||
set => SetProperty(ref _snackbarMessageQueue, value);
|
||
}
|
||
|
||
|
||
private string? _searchValue;
|
||
|
||
/// <summary>
|
||
/// 查询条件 查询字段值
|
||
/// </summary>
|
||
public string? SearchValue
|
||
{
|
||
get { return _searchValue; }
|
||
set
|
||
{
|
||
SetProperty(ref _searchValue, value);
|
||
RequestData();
|
||
}
|
||
}
|
||
|
||
public static List<OrderTakeSelect> StaticSelects = new()
|
||
{
|
||
new OrderTakeSelect
|
||
{
|
||
Code = "DrugName",
|
||
Name = "药品名称"
|
||
},
|
||
new OrderTakeSelect
|
||
{
|
||
Code = "PyCode",
|
||
Name = "拼音码"
|
||
},
|
||
new OrderTakeSelect
|
||
{
|
||
Code = "DrugBarcode",
|
||
Name = "药品条码"
|
||
},
|
||
new OrderTakeSelect
|
||
{
|
||
Code = "DrugId",
|
||
Name = "药品编码"
|
||
}
|
||
};
|
||
|
||
|
||
private List<OrderTakeSelect> _selects = StaticSelects;
|
||
|
||
public List<OrderTakeSelect> Selects
|
||
{
|
||
get { return _selects; }
|
||
set
|
||
{
|
||
SetProperty(ref _selects, value);
|
||
}
|
||
}
|
||
|
||
|
||
private static List<Dictionary<int, string>> keyValuePairs = new List<Dictionary<int, string>>()
|
||
{
|
||
new Dictionary<int, string>(){ {0,"男"} },new Dictionary<int, string>(){ { 1, "女" } }
|
||
};
|
||
public List<Dictionary<int, string>> SexKeyValue
|
||
{
|
||
get { return keyValuePairs; }
|
||
set { SetProperty(ref keyValuePairs, value); }
|
||
}
|
||
private Dictionary<int, string> _selectedSex = keyValuePairs[0];
|
||
public Dictionary<int, string> SelectedSex
|
||
{
|
||
get => _selectedSex;
|
||
set => SetProperty(ref _selectedSex, value);
|
||
}
|
||
|
||
private SurgicalSchedule surgicalSchedule = new SurgicalSchedule();
|
||
|
||
public SurgicalSchedule _SurgicalSchedule
|
||
{
|
||
get => surgicalSchedule;
|
||
set => SetProperty(ref surgicalSchedule, value);
|
||
}
|
||
|
||
|
||
private int _totalCount = 0;
|
||
public int TotalCount { get => _totalCount; set => SetProperty(ref _totalCount, value); }
|
||
|
||
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 = 5;
|
||
public int PageSize
|
||
{
|
||
get => _pageSize;
|
||
set
|
||
{
|
||
SetProperty(ref _pageSize, value);
|
||
}
|
||
}
|
||
|
||
private int _status = 0;
|
||
|
||
public int Status
|
||
{
|
||
get => _status; set => SetProperty(ref _status, value);
|
||
}
|
||
|
||
|
||
List<ChannelStock> ReturnStockLst;
|
||
|
||
private IEnumerable<IGrouping<int, ChannelStock>> enumerable;
|
||
private IEnumerator<IGrouping<int, ChannelStock>> enumerator;
|
||
|
||
private OrderTakeSelect _selectedItem = StaticSelects[0];
|
||
/// <summary>
|
||
/// 查询条件 查询字段
|
||
/// </summary>
|
||
public OrderTakeSelect SelectedItem
|
||
{
|
||
get { return _selectedItem; }
|
||
set
|
||
{
|
||
SetProperty(ref _selectedItem, value);
|
||
RequestData();
|
||
}
|
||
}
|
||
|
||
private MachineRecord selectedRecord;
|
||
public MachineRecord SelectedRecord { get => selectedRecord; set => SetProperty(ref selectedRecord, value); }
|
||
|
||
|
||
private static readonly DateTime Jan1st1970 = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc);
|
||
private readonly ILog logger = LogManager.GetLogger(typeof(OrderTakeDialogViewModel));
|
||
|
||
|
||
public event Action<IDialogResult> RequestClose;
|
||
|
||
public bool CanCloseDialog()
|
||
{
|
||
return Status == 0;
|
||
}
|
||
|
||
public void OnDialogClosed()
|
||
{
|
||
// 取消消息订阅
|
||
_eventAggregator.GetEvent<PortUtilEvent>().Unsubscribe(DoMyPrismEvent);
|
||
}
|
||
|
||
public void OnDialogOpened(IDialogParameters parameters)
|
||
{
|
||
_eventAggregator.GetEvent<PortUtilEvent>().Subscribe(DoMyPrismEvent);
|
||
RequestData();
|
||
}
|
||
private PortUtil _portUtil;
|
||
IEventAggregator _eventAggregator;
|
||
IDialogService _dialogService;
|
||
public AddSurgeryDialogViewModel(PortUtil portUtil, IEventAggregator eventAggregator, IDialogService DialogService)
|
||
{
|
||
surgicalSchedule.ScheduleTime= DateTime.Now;
|
||
_SurgicalSchedule.Indate = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
|
||
_dialogService = DialogService;
|
||
_portUtil = portUtil;
|
||
_eventAggregator = eventAggregator;
|
||
}
|
||
public async void RequestData()
|
||
{
|
||
int totalCount = 0;
|
||
MachineRecordList = SqlSugarHelper.Db.Queryable<MachineRecord>()
|
||
.Includes<DrugInfo>(mr => mr.DrugInfo)
|
||
.Includes<UserList>(mr => mr.User)
|
||
.Includes<SurgicalScheduleDetail>(mr => mr._SurgicalScheduleDetailLst)
|
||
.Where(mr => mr.Type == 2)
|
||
.Where(mr => mr.Status < 2)
|
||
.Where(mr => mr.MachineId.Equals(ConfigurationManager.AppSettings["machineId"] ?? "DM3"))
|
||
//.WhereIF(QueryDate != null, mr => mr.OperationTime.ToString("yyyy-MM-dd") == QueryDate)
|
||
.WhereIF(!String.IsNullOrEmpty(SearchValue) && SelectedItem.Code.Equals("DrugId"), (mr) => mr.DrugInfo.DrugId.ToString().Contains(SearchValue))
|
||
.WhereIF(!String.IsNullOrEmpty(SearchValue) && SelectedItem.Code.Equals("DrugName"), (mr) => mr.DrugInfo.DrugName.Contains(SearchValue))
|
||
.WhereIF(!String.IsNullOrEmpty(SearchValue) && SelectedItem.Code.Equals("PyCode"), (mr) => mr.DrugInfo.PyCode.Contains(SearchValue))
|
||
.WhereIF(!String.IsNullOrEmpty(SearchValue) && SelectedItem.Code.Equals("DrugBarcode"), (mr) => mr.DrugInfo.DrugBarcode.Contains(SearchValue))
|
||
.OrderBy(mr => mr.OperationTime)
|
||
.ToPageList(PageNum, PageSize, ref totalCount);
|
||
|
||
MachineRecordList.ForEach(mr => mr.HasCheckNum = mr._SurgicalScheduleDetailLst.Sum(sd => sd.Quantity));
|
||
TotalCount = totalCount;
|
||
}
|
||
|
||
public DelegateCommand BtnCloseCommand
|
||
{
|
||
get => new DelegateCommand(() =>
|
||
{
|
||
// 关闭当前窗口
|
||
RequestClose?.Invoke(new DialogResult(ButtonResult.Cancel));
|
||
});
|
||
}
|
||
|
||
/// <summary>
|
||
/// 选中行事件
|
||
/// </summary>
|
||
public DelegateCommand RowSelected
|
||
{
|
||
get => new DelegateCommand(() =>
|
||
{
|
||
if (SelectedRecord != null && selectedRecord.Id != null)
|
||
{
|
||
MachineRecordList = MachineRecordList.Select(x =>
|
||
{
|
||
if (x.Id == SelectedRecord.Id)
|
||
{
|
||
x.IsSelected = !x.IsSelected;
|
||
if (x.IsSelected)
|
||
{
|
||
if (SelectedRecord._SurgicalScheduleDetailLst != null && SelectedRecord._SurgicalScheduleDetailLst.Count > 0)
|
||
{
|
||
//已经核销数
|
||
int HasCheckNum = SelectedRecord._SurgicalScheduleDetailLst.Sum(sd => sd.Quantity);
|
||
x.CheckQuantity = SelectedRecord.Quantity - HasCheckNum;
|
||
x.ReturnQuantity1 = SelectedRecord.Quantity - HasCheckNum - x.CheckQuantity;
|
||
x.ReturnQuantity2 = HasCheckNum + x.CheckQuantity;
|
||
}
|
||
else
|
||
{
|
||
x.CheckQuantity = SelectedRecord.Quantity;
|
||
x.ReturnQuantity1 = 0;
|
||
x.ReturnQuantity2 = SelectedRecord.Quantity;
|
||
}
|
||
}
|
||
else
|
||
{
|
||
x.CheckQuantity = 0;
|
||
x.ReturnQuantity1 = 0;
|
||
x.ReturnQuantity2 = 0;
|
||
}
|
||
}
|
||
return x;
|
||
}).ToList();
|
||
|
||
|
||
}
|
||
});
|
||
}
|
||
|
||
/// <summary>
|
||
/// 保存并核销
|
||
/// </summary>
|
||
public DelegateCommand AddSurgeryCommand
|
||
{
|
||
get => new DelegateCommand(() =>
|
||
{
|
||
if (!string.IsNullOrEmpty(_SurgicalSchedule.OperationId))
|
||
{
|
||
//检查是否有该手术号,手术号不能重复
|
||
int iCount= SqlSugarHelper.Db.Queryable<SurgicalSchedule>().Where(ss => ss.OperationId == _SurgicalSchedule.OperationId).Count();
|
||
if(iCount>0)
|
||
{
|
||
SnackbarBackground = new SolidColorBrush((Color)ColorConverter.ConvertFromString("#b71c1c"));
|
||
SnackbarMessageQueue.Enqueue("该手术号已添加,请勿重复创建");
|
||
return;
|
||
}
|
||
List<MachineRecord> RecordsLst = MachineRecordList.FindAll(rl => rl.IsSelected && rl.CheckQuantity > 0).ToList();
|
||
if (RecordsLst.Count > 0)
|
||
{
|
||
|
||
//string operationId = Guid.NewGuid().ToString();
|
||
var f = SqlSugarHelper.Db.UseTran(() =>
|
||
{
|
||
SqlSugarHelper.Db.Insertable(new SurgicalSchedule()
|
||
{
|
||
PName = _SurgicalSchedule.PName,
|
||
Sex = SelectedSex.ContainsKey(0) is true ? SelectedSex[0] : SelectedSex[1],
|
||
Age = _SurgicalSchedule.Age,
|
||
IdNumber = _SurgicalSchedule.IdNumber,
|
||
OpRoomCode = _SurgicalSchedule.OpRoomCode,
|
||
OpRoomName = _SurgicalSchedule.OpRoomName,
|
||
OperationId = _SurgicalSchedule.OperationId,
|
||
ScheduleTime = _SurgicalSchedule.ScheduleTime,
|
||
InsertTime=DateTime.Now,
|
||
Indiagnosis=_SurgicalSchedule.Indiagnosis,
|
||
Indate=_SurgicalSchedule.Indate,
|
||
DmStatus = 1,
|
||
}).ExecuteCommand();
|
||
for (int i = 0; i < RecordsLst.Count; i++)
|
||
{
|
||
SqlSugarHelper.Db.Insertable(new SurgicalScheduleDetail()
|
||
{
|
||
OperationId = _SurgicalSchedule.OperationId,
|
||
GetRecordId = RecordsLst[i].Id,
|
||
Quantity = RecordsLst[i].CheckQuantity,
|
||
DrugId = RecordsLst[i].DrugId,
|
||
ManuNo = RecordsLst[i].ManuNo,
|
||
EffDate = RecordsLst[i].EffDate.ToString(),
|
||
InsertUserId = HomeWindowViewModel.Operator?.Id,
|
||
}).ExecuteCommand();
|
||
|
||
int hasQuantity = RecordsLst[i]._SurgicalScheduleDetailLst.Sum(sd => sd.Quantity);
|
||
int dmStatus = 0;
|
||
//已经全部挂上钩,修改dm_machine_record状态为完成
|
||
//if (hasQuantity + RecordsLst[i].CheckQuantity == RecordsLst[i].Quantity)
|
||
//{
|
||
// dmStatus = 2;
|
||
//}
|
||
//else
|
||
{
|
||
dmStatus = 1;
|
||
}
|
||
SqlSugarHelper.Db.Updateable(new MachineRecord()
|
||
{
|
||
Status = dmStatus,
|
||
Id = RecordsLst[i].Id
|
||
}).UpdateColumns(it => new { it.Status }).WhereColumns(it => new { it.Id }).ExecuteCommand();
|
||
|
||
|
||
}
|
||
});
|
||
if (f.IsSuccess)
|
||
{
|
||
AlertMsg alertMsg = new AlertMsg
|
||
{
|
||
Message = "核销完成",
|
||
Type = MsgType.SUCCESS,
|
||
};
|
||
_eventAggregator.GetEvent<SnackbarEvent>().Publish(alertMsg);
|
||
// 关闭当前窗口
|
||
RequestClose?.Invoke(new DialogResult(ButtonResult.Cancel));
|
||
}
|
||
else
|
||
{
|
||
SnackbarBackground = new SolidColorBrush((Color)ColorConverter.ConvertFromString("#b71c1c"));
|
||
SnackbarMessageQueue.Enqueue("核销异常,未核销数据");
|
||
}
|
||
}
|
||
else
|
||
{
|
||
int iRet = SqlSugarHelper.Db.Insertable(new SurgicalSchedule()
|
||
{
|
||
PName = _SurgicalSchedule.PName,
|
||
Sex = SelectedSex.ContainsKey(0) is true ? SelectedSex[0] : SelectedSex[1],
|
||
Age = _SurgicalSchedule.Age,
|
||
IdNumber = _SurgicalSchedule.IdNumber,
|
||
OpRoomCode = _SurgicalSchedule.OpRoomCode,
|
||
OpRoomName = _SurgicalSchedule.OpRoomName,
|
||
OperationId = _SurgicalSchedule.OperationId,
|
||
ScheduleTime= _SurgicalSchedule.ScheduleTime,
|
||
Indiagnosis = _SurgicalSchedule.Indiagnosis,
|
||
Indate = _SurgicalSchedule.Indate,
|
||
InsertTime = DateTime.Now,
|
||
DmStatus = 0,
|
||
HisState=1
|
||
}).ExecuteCommand();
|
||
if (iRet > 0)
|
||
{
|
||
AlertMsg alertMsg = new AlertMsg
|
||
{
|
||
Message = "手术录入成功,未核销药品",
|
||
Type = MsgType.SUCCESS,
|
||
};
|
||
_eventAggregator.GetEvent<SnackbarEvent>().Publish(alertMsg);
|
||
// 关闭当前窗口
|
||
RequestClose?.Invoke(new DialogResult(ButtonResult.Cancel));
|
||
|
||
}
|
||
else
|
||
{
|
||
|
||
SnackbarBackground = new SolidColorBrush((Color)ColorConverter.ConvertFromString("#b71c1c"));
|
||
SnackbarMessageQueue.Enqueue("手术录入失败");
|
||
}
|
||
}
|
||
}
|
||
else
|
||
{
|
||
|
||
SnackbarBackground = new SolidColorBrush((Color)ColorConverter.ConvertFromString("#b71c1c"));
|
||
SnackbarMessageQueue.Enqueue("手术号不能为空");
|
||
}
|
||
});
|
||
}
|
||
/// <summary>
|
||
/// 全部归还(还药、还空瓶)
|
||
/// </summary>
|
||
public DelegateCommand ReturnCommand
|
||
{
|
||
get => new DelegateCommand(() =>
|
||
{
|
||
List<MachineRecord> RecordsLst = MachineRecordList.FindAll(rl => rl.IsSelected && rl.CheckQuantity == 0).ToList();
|
||
ReturnStockLst = new List<ChannelStock>();
|
||
if (RecordsLst.Count > 0)
|
||
{
|
||
|
||
//待还药的记录
|
||
List<MachineRecord> ReturnDrugLst = RecordsLst.Where(rl => rl.ReturnQuantity1 > 0).ToList();
|
||
//待还空瓶的记录
|
||
List<MachineRecord> ReturnEmptyLst = RecordsLst.Where(rl => rl.ReturnQuantity2 > 0).ToList();
|
||
|
||
|
||
for (int i = 0; i < ReturnDrugLst.Count; i++)
|
||
{
|
||
ChannelStock queryData = SqlSugarHelper.Db.Queryable<ChannelStock>()
|
||
.Includes<DrugInfo>(cs => cs.DrugInfo)
|
||
.Where(cs => cs.DrugId == ReturnDrugLst[i].DrugId)
|
||
.Where(cs => cs.MachineId.Equals(ConfigurationManager.AppSettings["machineId"] ?? "DM3"))
|
||
.Where(cs => cs.ManuNo == ReturnDrugLst[i].ManuNo)
|
||
.OrderBy(cs => cs.Quantity).First();
|
||
if (queryData != null)
|
||
{
|
||
queryData.AddQuantity = ReturnDrugLst[i].ReturnQuantity1;
|
||
queryData.MachineRecordId = ReturnDrugLst[i].Id;
|
||
ReturnStockLst.Add(queryData);
|
||
}
|
||
}
|
||
for (int j = 0; j < ReturnEmptyLst.Count; j++)
|
||
{
|
||
ChannelStock queryData = SqlSugarHelper.Db.Queryable<ChannelStock>()
|
||
.Includes<DrugInfo>(cs => cs.DrugInfo)
|
||
.Where(cs => cs.DrugId == ReturnEmptyLst[j].DrugId)
|
||
.Where(cs => cs.MachineId.Equals(ConfigurationManager.AppSettings["machineId"] ?? "DM3"))
|
||
//.Where(cs => cs.ManuNo == ReturnEmptyLst[j].ManuNo)
|
||
.Where(cs => cs.DrawerType == 2)
|
||
.OrderBy(cs => cs.Quantity).First();
|
||
if (queryData != null)
|
||
{
|
||
queryData.ReturnQuantity = ReturnEmptyLst[j].ReturnQuantity2;
|
||
queryData.MachineRecordId = ReturnEmptyLst[j].Id;
|
||
ReturnStockLst.Add(queryData);
|
||
}
|
||
}
|
||
if (ReturnStockLst != null && ReturnStockLst.Count > 0)
|
||
{
|
||
ReturnStockLst = ReturnStockLst.OrderBy(cls => cls.DrawerNo).ToList();
|
||
//还药时AddQuantity有值;还空瓶时ReturnQuantity有值
|
||
enumerable = ReturnStockLst.GroupBy(cs => cs.DrawerNo, cs => cs);
|
||
enumerator = enumerable.GetEnumerator();
|
||
enumerator.MoveNext();
|
||
Status = 1;
|
||
OpenOneByOne();
|
||
}
|
||
else
|
||
{
|
||
|
||
SnackbarBackground = new SolidColorBrush((Color)ColorConverter.ConvertFromString("#b71c1c"));
|
||
SnackbarMessageQueue.Enqueue("选中数据未绑定库位,请先进行绑定库位");
|
||
}
|
||
}
|
||
else
|
||
{
|
||
SnackbarBackground = new SolidColorBrush((Color)ColorConverter.ConvertFromString("#b71c1c"));
|
||
SnackbarMessageQueue.Enqueue("未选中数据,或选中数据核销数量不为0");
|
||
}
|
||
});
|
||
}
|
||
/// <summary>
|
||
/// 刷新
|
||
/// </summary>
|
||
public DelegateCommand QueryCommand
|
||
{
|
||
get => new DelegateCommand(() =>
|
||
{
|
||
RequestData();
|
||
});
|
||
}
|
||
void DoMyPrismEvent(DeviceMsg msg)
|
||
{
|
||
|
||
if (msg.WindowName == "SurgeryTakeWindow")
|
||
{
|
||
IGrouping<int, ChannelStock> grouping = enumerator.Current;
|
||
int DrawerNo = grouping.Key;
|
||
List<ChannelStock> channelStocks = grouping.ToList();
|
||
|
||
switch (msg.EventType)
|
||
{
|
||
// 抽屉打开
|
||
case EventType.DRAWEROPEN:
|
||
if (Status == 1)
|
||
{
|
||
if (channelStocks[0].process == 1)
|
||
{
|
||
channelStocks.ForEach(it => it.process = 2);
|
||
}
|
||
}
|
||
|
||
break;
|
||
// 抽屉关闭
|
||
case EventType.DRAWERCLOSE:
|
||
if (Status == 1)
|
||
{
|
||
if (channelStocks[0].process == 2)
|
||
{
|
||
channelStocks.ForEach(it => it.process = 3);
|
||
}
|
||
IGrouping<int, ChannelStock> groupingBefore = enumerator.Current;
|
||
int DrawerNoBefore = groupingBefore.Key;
|
||
if (enumerator.MoveNext())
|
||
{
|
||
IGrouping<int, ChannelStock> groupingAfter = enumerator.Current;
|
||
int DrawerNoAfter = groupingAfter.Key;
|
||
if (DrawerNoBefore < 9 && DrawerNoAfter > 8)
|
||
{
|
||
Thread.Sleep(50);
|
||
}
|
||
OpenOneByOne();
|
||
}
|
||
// 已经全部取出
|
||
else
|
||
{
|
||
Status = 3;
|
||
|
||
//保存数据
|
||
|
||
//TakeFinish();
|
||
}
|
||
}
|
||
break;
|
||
// 数量变化
|
||
case EventType.UPDATEQUANTITY:
|
||
if (Status == 1)
|
||
{
|
||
logger.Info($"抽屉【{DrawerNo}】库位取药数量【{msg.Quantitys}】");
|
||
}
|
||
break;
|
||
// 打开失败
|
||
case EventType.OPENERROR:
|
||
AlertMsg alertMsg = new AlertMsg
|
||
{
|
||
Message = msg.Message,
|
||
Type = MsgType.ERROR,
|
||
};
|
||
_eventAggregator.GetEvent<SnackbarEvent>().Publish(alertMsg);
|
||
Status = 0;
|
||
break;
|
||
}
|
||
}
|
||
|
||
}
|
||
|
||
private void OpenOneByOne()
|
||
{
|
||
IGrouping<int, ChannelStock> grouping = enumerator.Current;
|
||
int DrawerNo = grouping.Key;
|
||
List<ChannelStock> channelStocks = grouping.ToList();
|
||
channelStocks.ForEach(it => it.process = 1);
|
||
|
||
string drugName = channelStocks[0].DrugInfo.DrugName;
|
||
|
||
int drugQuantity = channelStocks.Sum(cs => cs.AddQuantity);
|
||
|
||
int emptyQuantity = channelStocks.Sum(cs => cs.ReturnQuantity);
|
||
string speakTxt = $"正在打开{DrawerNo}号抽屉,请将{drugName}的";
|
||
if (drugQuantity > 0)
|
||
{
|
||
speakTxt += $"{drugQuantity}个药放入抽屉!";
|
||
}
|
||
if (emptyQuantity > 0)
|
||
{
|
||
speakTxt += $"{emptyQuantity}个空瓶放入抽屉!";
|
||
}
|
||
_portUtil.SpeakAsync(speakTxt);
|
||
|
||
//List<ChannelStock> singleChannels = channelStocks.FindAll(it => it.BoardType != 1);
|
||
|
||
// 发送取药数量
|
||
//singleChannels.ForEach(it =>
|
||
//{
|
||
// try
|
||
// {
|
||
|
||
// _portUtil.TakeQuantity(DrawerNo, it.ColNo, it.TakeQuantity, it.Quantity - it.TakeQuantity);
|
||
// }
|
||
// catch (Exception ex)
|
||
// {
|
||
// AlertMsg alertMsg = new AlertMsg
|
||
// {
|
||
// Message = $"打开抽屉异常{ex.Message}",
|
||
// Type = MsgType.ERROR,
|
||
// };
|
||
// _eventAggregator.GetEvent<SnackbarEvent>().Publish(alertMsg);
|
||
// }
|
||
//});
|
||
|
||
_portUtil.WindowName = "SurgeryTakeWindow";
|
||
_portUtil.BoardType = channelStocks.Count > 0 ? channelStocks[0].BoardType : 1;
|
||
_portUtil.ColNos = channelStocks.Select(it => it.ColNo).ToArray();
|
||
_portUtil.DrawerNo = DrawerNo;
|
||
_portUtil.Start();
|
||
}
|
||
|
||
|
||
private bool _isFinishClick = false;
|
||
|
||
public bool IsFinishClick { get => _isFinishClick; set => SetProperty(ref _isFinishClick, value); }
|
||
//完成
|
||
private void TakeFinish()
|
||
{
|
||
IsFinishClick = true;
|
||
bool bRet = false;
|
||
var f = SqlSugarHelper.Db.UseTran(() =>
|
||
{
|
||
for (int i = 0; i < ReturnStockLst.Count; i++)
|
||
{
|
||
ChannelStock it = ReturnStockLst[i];
|
||
int quantity = 0;
|
||
if (it.AddQuantity > 0) //还药
|
||
{
|
||
quantity = it.AddQuantity;
|
||
bRet = ReturnDrug(it);
|
||
|
||
}
|
||
else
|
||
{
|
||
quantity = it.ReturnQuantity;
|
||
bRet = ReturnEmpty(it);
|
||
}
|
||
if (!bRet)
|
||
{
|
||
break;
|
||
}
|
||
// 更新屏显库存
|
||
if (it.BoardType == 5)
|
||
{
|
||
_portUtil.WriteQuantity(it.DrawerNo, it.ColNo, it.Quantity + quantity);
|
||
}
|
||
|
||
AlertMsg alertMsg = new AlertMsg
|
||
{
|
||
Message = "操作完成,库存已更新",
|
||
Type = MsgType.SUCCESS,
|
||
};
|
||
_eventAggregator.GetEvent<SnackbarEvent>().Publish(alertMsg);
|
||
// 关闭当前窗口
|
||
RequestClose?.Invoke(new DialogResult(ButtonResult.Cancel));
|
||
}
|
||
return bRet;
|
||
});
|
||
if (!f.IsSuccess || !f.Data)
|
||
{
|
||
SnackbarBackground = new SolidColorBrush((Color)ColorConverter.ConvertFromString("#b71c1c"));
|
||
SnackbarMessageQueue.Enqueue("库存更新失败!");
|
||
|
||
}
|
||
Status = 0;
|
||
IsFinishClick = false;
|
||
RequestClose?.Invoke(new DialogResult(ButtonResult.OK));
|
||
}
|
||
/// <summary>
|
||
/// 还药
|
||
/// </summary>
|
||
private bool ReturnDrug(ChannelStock stock)
|
||
{
|
||
try
|
||
{
|
||
var f = SqlSugarHelper.Db.UseTran(() =>
|
||
{
|
||
string InvoiceId = "RETURN_" + CurrentTimeMillis(); ;
|
||
MachineRecord recordInfo = SqlSugarHelper.Db.Queryable<MachineRecord>().Where(rd => rd.Id == stock.MachineRecordId).First();
|
||
// 更新数据 库存信息
|
||
SqlSugarHelper.Db.Updateable(new ChannelStock()
|
||
{
|
||
Quantity = stock.Quantity + stock.AddQuantity,
|
||
Id = stock.Id,
|
||
}).UpdateColumns(it => new { it.Quantity }).ExecuteCommand();
|
||
// 获取更新完库存后的药品库存
|
||
List<ChannelStock> nowChannels = SqlSugarHelper.Db.Queryable<ChannelStock>()
|
||
.Where(cs => cs.MachineId.Equals(stock.MachineId))
|
||
.Where(cs => cs.DrugId.Equals(stock.DrugId))
|
||
.Where(cs => cs.DrawerType == 1)
|
||
.ToList();
|
||
// 更新数据 取药记录 设置还药数量、状态
|
||
SqlSugarHelper.Db.Updateable(new MachineRecord()
|
||
{
|
||
ReturnQuantity1 = recordInfo.ReturnQuantity1 + stock.AddQuantity,
|
||
Id = recordInfo.Id,
|
||
Status = (recordInfo.CanReturnQuantity - stock.AddQuantity) == 0 ? 2 : 1,
|
||
}).UpdateColumns(it => new { it.ReturnQuantity1, it.Status }).ExecuteCommand();
|
||
|
||
// 保存数据 还药记录
|
||
SqlSugarHelper.Db.Insertable(new MachineRecord()
|
||
{
|
||
MachineId = stock.MachineId,
|
||
DrawerNo = stock.DrawerNo,
|
||
ColNo = stock.ColNo,
|
||
DrugId = stock.DrugId,
|
||
ManuNo = stock.ManuNo,
|
||
EffDate = !String.IsNullOrEmpty(stock.EffDate) ? DateTime.ParseExact(stock.EffDate, "yyyy-MM-dd", System.Globalization.CultureInfo.CurrentCulture) : null,
|
||
Operator = HomeWindowViewModel.Operator?.Id,
|
||
OperationTime = DateTime.Now,
|
||
Quantity = stock.AddQuantity,
|
||
Type = 31,
|
||
InvoiceId = InvoiceId,
|
||
GetId = stock.MachineRecordId
|
||
//,StockQuantity = nowChannels.Sum(it => it.Quantity)
|
||
}).ExecuteCommand();
|
||
|
||
//保存账册
|
||
SqlSugarHelper.Db.Insertable(new AccountBookG2()
|
||
{
|
||
DrugId = stock.DrugId,
|
||
Type = 1,
|
||
Department = ConfigurationManager.AppSettings["department"].ToString(),
|
||
InvoiceNo = InvoiceId,
|
||
ManuNo = stock.ManuNo,
|
||
EffDate = stock.EffDate,
|
||
AddQuantity = stock.AddQuantity,
|
||
UserId1 = HomeWindowViewModel.Operator?.Id,
|
||
UserId2 = HomeWindowViewModel.Reviewer?.Id,
|
||
MachineId = ConfigurationManager.AppSettings["machineId"].ToString(),
|
||
CreateDate = DateTime.Now.ToString("yyyy-MM-dd"),
|
||
CreateTime = DateTime.Now
|
||
|
||
}).ExecuteCommand();
|
||
//修改凌晨生成的日结存数据
|
||
AccountBookG2 accountBookG2Day = SqlSugarHelper.Db.Queryable<AccountBookG2>()
|
||
.Where(ab => ab.MachineId.Equals(stock.MachineId))
|
||
.Where(ab => ab.Type == 3)
|
||
.Where(ab => ab.DrugId == stock.DrugId)
|
||
.Where(ab => ab.ManuNo == stock.ManuNo)
|
||
.Where(ab => ab.CreateDate == DateTime.Now.ToString("yyyy-MM-dd")).First();
|
||
if (accountBookG2Day != null)
|
||
{
|
||
accountBookG2Day.ManuStock = accountBookG2Day.ManuStock + stock.AddQuantity;
|
||
SqlSugarHelper.Db.Updateable(accountBookG2Day).ExecuteCommand();
|
||
}
|
||
else
|
||
{
|
||
//生成日结存时可能没有该库位的绑定信息,需要写入日结存
|
||
int iDayResult = SqlSugarHelper.Db.Insertable(new AccountBookG2()
|
||
{
|
||
DrugId = stock.DrugId,
|
||
Type = 3,
|
||
ManuNo = stock.ManuNo,
|
||
EffDate = stock.EffDate,
|
||
YQuantity = 0,
|
||
ManuStock = stock.ReturnQuantity,
|
||
TotalStock = stock.ReturnQuantity,
|
||
UserId1 = HomeWindowViewModel.Operator?.Id,
|
||
UserId2 = HomeWindowViewModel.Reviewer?.Id,
|
||
MachineId = ConfigurationManager.AppSettings["machineId"].ToString(),
|
||
CreateDate = DateTime.Now.ToString("yyyy-MM-dd"),
|
||
InvoiceNo = "日结存"
|
||
}).ExecuteCommand();
|
||
if (iDayResult <= 0)
|
||
{
|
||
logger.Info($"未写入日结存数据{stock.DrugId}-{stock.ManuNo}-{stock.EffDate}-{stock.AddQuantity}");
|
||
}
|
||
}
|
||
//修改凌晨生成的总结存数据
|
||
AccountBookG2 accountBookG2Total = SqlSugarHelper.Db.Queryable<AccountBookG2>()
|
||
.Where(ab => ab.MachineId.Equals(stock.MachineId))
|
||
.Where(ab => ab.Type == 4)
|
||
.Where(ab => ab.DrugId == stock.DrugId)
|
||
.Where(ab => ab.CreateDate == DateTime.Now.ToString("yyyy-MM-dd")).First();
|
||
if (accountBookG2Total != null)
|
||
{
|
||
accountBookG2Total.TotalStock = accountBookG2Total.TotalStock + stock.AddQuantity;
|
||
SqlSugarHelper.Db.Updateable(accountBookG2Total).ExecuteCommand();
|
||
}
|
||
else
|
||
{
|
||
//生成总结存时可能没有该库位的绑定信息,需要写入总结存
|
||
int iTotalResult = SqlSugarHelper.Db.Insertable(new AccountBookG2()
|
||
{
|
||
DrugId = stock.DrugId,
|
||
Type = 4,
|
||
YQuantity = 0,
|
||
ManuStock = stock.ReturnQuantity,
|
||
TotalStock = stock.ReturnQuantity,
|
||
UserId1 = HomeWindowViewModel.Operator?.Id,
|
||
UserId2 = HomeWindowViewModel.Reviewer?.Id,
|
||
MachineId = ConfigurationManager.AppSettings["machineId"].ToString(),
|
||
CreateDate = DateTime.Now.ToString("yyyy-MM-dd"),
|
||
InvoiceNo = "总结存"
|
||
}).ExecuteCommand();
|
||
if (iTotalResult <= 0)
|
||
{
|
||
logger.Info($"未写入总结存数据{stock.DrugId}-{stock.AddQuantity}");
|
||
}
|
||
}
|
||
});
|
||
if (f.IsSuccess)
|
||
{
|
||
return true;
|
||
}
|
||
else
|
||
{
|
||
return false;
|
||
}
|
||
}
|
||
catch (Exception)
|
||
{
|
||
|
||
throw;
|
||
}
|
||
}
|
||
/// <summary>
|
||
/// 还空瓶
|
||
/// </summary>
|
||
private bool ReturnEmpty(ChannelStock stock)
|
||
{
|
||
string InvoiceId = "RETURN_" + CurrentTimeMillis();
|
||
var f = SqlSugarHelper.Db.UseTran(() =>
|
||
{
|
||
|
||
// 更新数据 库存信息
|
||
SqlSugarHelper.Db.Updateable(new ChannelStock()
|
||
{
|
||
Quantity = stock.Quantity + stock.ReturnQuantity,
|
||
Id = stock.Id,
|
||
}).UpdateColumns(it => new { it.Quantity }).ExecuteCommand();
|
||
|
||
// 获取更新完库存后的药品库存
|
||
List<ChannelStock> nowChannels = SqlSugarHelper.Db.Queryable<ChannelStock>()
|
||
.Where(cs => cs.MachineId.Equals(stock.MachineId))
|
||
.Where(cs => cs.DrugId.Equals(stock.DrugId))
|
||
.Where(cs => cs.DrawerType == 1)
|
||
.ToList();
|
||
|
||
MachineRecord recordInfo = SqlSugarHelper.Db.Queryable<MachineRecord>().Where(rd => rd.Id == stock.MachineRecordId).First();
|
||
|
||
// 更新数据 取药记录 设置还药数量、状态
|
||
SqlSugarHelper.Db.Updateable(new MachineRecord()
|
||
{
|
||
ReturnQuantity2 = stock.ReturnQuantity,
|
||
Id = recordInfo.Id,
|
||
Status = 2,
|
||
}).UpdateColumns(it => new { it.ReturnQuantity2, it.Status }).ExecuteCommand();
|
||
|
||
// 保存数据 还药空瓶记录
|
||
SqlSugarHelper.Db.Insertable(new MachineRecord()
|
||
{
|
||
MachineId = stock.MachineId,
|
||
DrawerNo = stock.DrawerNo,
|
||
ColNo = stock.ColNo,
|
||
DrugId = stock.DrugId,
|
||
ManuNo = stock.ManuNo,
|
||
EffDate = !String.IsNullOrEmpty(stock.EffDate) ? DateTime.ParseExact(stock.EffDate, "yyyy-MM-dd", System.Globalization.CultureInfo.CurrentCulture) : null,
|
||
Operator = HomeWindowViewModel.Operator?.Id,
|
||
Reviewer = HomeWindowViewModel.Reviewer?.Id,
|
||
OperationTime = DateTime.Now,
|
||
Quantity = stock.ReturnQuantity, //ReturnQuantity,
|
||
Type = 32,
|
||
InvoiceId = InvoiceId,
|
||
GetId = stock.MachineRecordId
|
||
//,StockQuantity = nowChannels.Sum(it => it.Quantity)
|
||
}).ExecuteCommand();
|
||
|
||
return true;
|
||
});
|
||
|
||
if (!f.IsSuccess || !f.Data)
|
||
{
|
||
return false;
|
||
}
|
||
else
|
||
{
|
||
return true;
|
||
}
|
||
}
|
||
public long CurrentTimeMillis()
|
||
{
|
||
return (long)(DateTime.UtcNow - Jan1st1970).TotalMilliseconds;
|
||
}
|
||
/// <summary>
|
||
/// 取消
|
||
/// </summary>
|
||
public DelegateCommand CancleTake
|
||
{
|
||
get => new DelegateCommand(() =>
|
||
{
|
||
_portUtil.ResetData();
|
||
Status = 0;
|
||
});
|
||
}
|
||
// 完成按钮
|
||
public DelegateCommand TakeFinishCommand
|
||
{
|
||
get => new DelegateCommand(TakeFinish);
|
||
}
|
||
|
||
private void DoDialogResult(IDialogResult dialogResult)
|
||
{
|
||
// 委托 被动执行 被子窗口执行
|
||
// dialogResult 第一方面可以拿到任意参数 第二方面 可判断关闭状态
|
||
//if(dialogResult.Result == ButtonResult.OK)
|
||
//{
|
||
// 关闭当前窗口
|
||
//RequestClose?.Invoke(new DialogResult(ButtonResult.Cancel));
|
||
//}
|
||
//MessageBox.Show("返回值:" + dialogResult.Result.ToString());
|
||
}
|
||
}
|
||
}
|