428 lines
19 KiB
C#
428 lines
19 KiB
C#
using DM_Weight.Models;
|
||
using DM_Weight.msg;
|
||
using DM_Weight.Port;
|
||
using DM_Weight.util;
|
||
using log4net;
|
||
using Prism.Commands;
|
||
using Prism.Events;
|
||
using Prism.Mvvm;
|
||
using Prism.Regions;
|
||
using Prism.Services.Dialogs;
|
||
using System;
|
||
using System.Collections.Generic;
|
||
using System.ComponentModel;
|
||
using System.Configuration;
|
||
using System.Linq;
|
||
using System.Text;
|
||
using System.Threading;
|
||
using System.Threading.Tasks;
|
||
using System.Windows;
|
||
using System.Windows.Data;
|
||
|
||
namespace DM_Weight.ViewModels
|
||
{
|
||
public class AdditionWindowViewModel : BindableBase, INavigationAware, IRegionMemberLifetime
|
||
{
|
||
public bool KeepAlive => false;
|
||
|
||
private readonly ILog logger = LogManager.GetLogger(typeof(AdditionWindowViewModel));
|
||
|
||
private List<ChannelStock>? channelStocks;
|
||
public List<ChannelStock>? ChannelStocks
|
||
{
|
||
get => channelStocks;
|
||
set => SetProperty(ref channelStocks, value);
|
||
}
|
||
private List<ChannelList>? _channelLists;
|
||
public List<ChannelList>? _ChannelLists
|
||
{
|
||
get => _channelLists;
|
||
set => SetProperty(ref _channelLists, value);
|
||
}
|
||
private ChannelList? _channelList;
|
||
public ChannelList? _ChannelList
|
||
{
|
||
get => _channelList;
|
||
set => SetProperty(ref _channelList, value);
|
||
}
|
||
|
||
List<ChannelStock> selectedStock = new List<ChannelStock>();
|
||
private object _finishStatus = Visibility.Collapsed;
|
||
public object FinishStatus
|
||
{
|
||
get => _finishStatus;
|
||
set => SetProperty(ref _finishStatus, value);
|
||
}
|
||
private bool _openStatusBtn = false;
|
||
public bool OpenStatusBtn
|
||
{
|
||
get => _openStatusBtn;
|
||
set => SetProperty(ref _openStatusBtn, value);
|
||
}
|
||
IDialogService _dialogService;
|
||
IEventAggregator _eventAggregator;
|
||
//private PortUtil _portUtil;
|
||
SocketHelper _socketHelper;
|
||
private static readonly DateTime Jan1st1970 = new DateTime
|
||
(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc);
|
||
public AdditionWindowViewModel(IEventAggregator eventAggregator, SocketHelper socketHelper)
|
||
{
|
||
//_dialogService = dialogService;
|
||
_eventAggregator = eventAggregator;
|
||
//_portUtil = portUtil;
|
||
_socketHelper = socketHelper;
|
||
}
|
||
public bool IsNavigationTarget(NavigationContext navigationContext)
|
||
{
|
||
return true;
|
||
}
|
||
|
||
public void OnNavigatedFrom(NavigationContext navigationContext)
|
||
{
|
||
_eventAggregator.GetEvent<IsSelectedEvent>().Unsubscribe(SetIsSelected);
|
||
}
|
||
|
||
public void OnNavigatedTo(NavigationContext navigationContext)
|
||
{
|
||
//_eventAggregator.GetEvent<IsSelectedEvent>().Subscribe(SetIsSelected);
|
||
RequestData();
|
||
}
|
||
private void RequestData()
|
||
{
|
||
_ChannelLists?.Clear();
|
||
ChannelStocks?.Clear();
|
||
ChannelStocks = SqlSugarHelper.Db.Queryable<ChannelStock>()
|
||
.Includes<ChannelList>(cs => cs.ChannelLst)
|
||
.Includes<DrugInfo>(cs => cs.DrugInfo)
|
||
.Where(cs => cs.MachineId == (ConfigurationManager.AppSettings["machineId"] ?? "DM5") && cs.AddToJJNum > 0)
|
||
|
||
.OrderBy(cs => cs.DrawerNo)
|
||
.OrderBy(cs => cs.DrugId)
|
||
.ToList();
|
||
if (ChannelStocks != null && ChannelStocks.Count > 0)
|
||
{
|
||
//2)查询channel_list将1)中查询的添加到channel_list的channel_stock里供页面呈现显示
|
||
List<int> DrawerNoList = ChannelStocks.Select(cs => cs.DrawerNo).Distinct().ToList();
|
||
List<ChannelList> channelLists = new List<ChannelList>();
|
||
for (int i = 0; i < DrawerNoList.Count; i++)
|
||
{
|
||
ChannelList channelList = SqlSugarHelper.Db.Queryable<ChannelList>()
|
||
.Where(cl => cl.MachineId == (ConfigurationManager.AppSettings["jj_machineId"] ?? "DM5") && cl.DrawerNo == DrawerNoList[i])
|
||
.OrderBy(cl => cl.Id)
|
||
.OrderBy(cl => cl.DrawerNo)
|
||
.First();
|
||
if (channelList.channelStocks == null)
|
||
{
|
||
channelList.channelStocks = new List<ChannelStock>();
|
||
}
|
||
channelList.channelStocks.AddRange(ChannelStocks.Where(cs => cs.DrawerNo == DrawerNoList[i]).ToList());
|
||
//if (channelList != null)
|
||
//{
|
||
// channelList.State = 1;//统一将所有的状态设置为已取药待入库
|
||
channelLists.Add(channelList);
|
||
//}
|
||
}
|
||
_ChannelLists = channelLists;
|
||
}
|
||
else
|
||
{
|
||
_ChannelLists = null;
|
||
}
|
||
|
||
}
|
||
//开药箱放入药品
|
||
public DelegateCommand OpenBoxCommand
|
||
{
|
||
get => new DelegateCommand(() =>
|
||
{
|
||
if (_ChannelList == null || _ChannelList.channelStocks == null)
|
||
{
|
||
AlertMsg alertMsg = new AlertMsg
|
||
{
|
||
Message = "请先选择数据行",
|
||
Type = MsgType.ERROR,
|
||
};
|
||
_eventAggregator.GetEvent<SnackbarEvent>().Publish(alertMsg);
|
||
return;
|
||
}
|
||
//selectedStock = ChannelStocks.FindAll(cs => cs.ChannelLst.IsSelected).ToList();
|
||
selectedStock = _ChannelList.channelStocks.ToList();
|
||
if (selectedStock != null && selectedStock.Count > 0)
|
||
{
|
||
//selectedStock.ForEach(cs => cs.ChannelLst.State = 2);
|
||
|
||
int drawerNo = -1;
|
||
for (int i = 0; i < selectedStock.Count; i++)
|
||
{
|
||
if (!(drawerNo == selectedStock[i].DrawerNo))
|
||
{
|
||
drawerNo = selectedStock[i].DrawerNo;
|
||
|
||
// 保存数据 入库记录
|
||
SqlSugarHelper.Db.Insertable(new MachineRecord()
|
||
{
|
||
MachineId = "DM5",
|
||
DrawerNo = drawerNo,
|
||
Operator = HomeWindowViewModel.Operator?.Id,
|
||
OperationTime = DateTime.Now,
|
||
Type = 55,
|
||
InvoiceId = "手术间补药",
|
||
}).ExecuteCommand();
|
||
_socketHelper.OpenStatus = true;
|
||
//_socketHelper.speechSynthesizer.SpeakAsyncCancelAll();
|
||
//_socketHelper.speechSynthesizer.Resume();
|
||
_socketHelper.SpeakAsync($"正在打开{selectedStock[i].DrawerNo}号手术间");
|
||
|
||
//ModbusHelper.GetInstance().OpenBoxDoor(selectedStock[i].DrawerNo - 1);
|
||
try
|
||
{
|
||
_socketHelper.SendMessage(new MyBaseMessage() { lockNo = (short)(selectedStock[i].DrawerNo - 1) });
|
||
}
|
||
catch (Exception ex)
|
||
{
|
||
AlertMsg alertMsg = new AlertMsg
|
||
{
|
||
Message = $"网口连接异常,正在重试{ex.Message}",
|
||
Type = MsgType.ERROR,
|
||
};
|
||
_eventAggregator.GetEvent<SnackbarEvent>().Publish(alertMsg);
|
||
logger.Info($"网口连接异常,正在重试{ex.Message}");
|
||
_socketHelper.OpenStatus = false;
|
||
return;
|
||
}
|
||
Thread.Sleep(100);
|
||
}
|
||
}
|
||
int iException = 0;
|
||
Thread.Sleep(200);
|
||
new PromiseUtil<int>().taskAsyncLoop(200, 0, async (options, next, stop) =>
|
||
{
|
||
|
||
_socketHelper.IsMultiThread = true;
|
||
try
|
||
{
|
||
if (_socketHelper.OpenStatus)
|
||
{
|
||
|
||
//bool[] boolsl = ModbusHelper.GetInstance().GetAllBoxState();
|
||
_socketHelper.SendMessage(new MyBaseMessage() { lockNo = 0x33, functionCode = 4, delay = 2 });
|
||
|
||
//ModbusHelper.SpeakAsync($"i为{i};状态为:{_socketHelper.OpenStatus}");
|
||
//bool state = Array.TrueForAll(boolsl, b => b == false);
|
||
if (_socketHelper.OpenStatus)
|
||
{
|
||
logger.Info($"OpenStatus:{_socketHelper.OpenStatus}");
|
||
//if (i == 0)
|
||
//{
|
||
// //ModbusHelper.SpeakAsync("请及时关闭药箱");
|
||
// i = 10;
|
||
//}
|
||
OpenStatusBtn = true;
|
||
next();
|
||
}
|
||
else
|
||
{
|
||
logger.Info($"OpenStatus:{_socketHelper.OpenStatus}");
|
||
|
||
_socketHelper.dateTime = DateTime.Now;
|
||
_socketHelper.IsMultiThread = false;
|
||
FinishStatus = Visibility.Visible;
|
||
OpenStatusBtn = false;
|
||
stop();
|
||
}
|
||
}
|
||
else
|
||
{
|
||
_socketHelper.dateTime = DateTime.Now;
|
||
_socketHelper.IsMultiThread = false;
|
||
FinishStatus = Visibility.Visible;
|
||
OpenStatusBtn = false;
|
||
stop();
|
||
}
|
||
|
||
iException = 0;
|
||
}
|
||
catch (Exception ex)
|
||
{
|
||
iException++;
|
||
if (iException >= 3)
|
||
{
|
||
_socketHelper.OpenStatus = false;
|
||
FinishStatus = Visibility.Visible;
|
||
OpenStatusBtn = false;
|
||
}
|
||
// _socketHelper.OpenStatus = false;
|
||
AlertMsg alertMsg = new AlertMsg
|
||
{
|
||
Message = $"网口连接异常,正在重试{ex.Message}",
|
||
Type = MsgType.ERROR,
|
||
};
|
||
_eventAggregator.GetEvent<SnackbarEvent>().Publish(alertMsg);
|
||
logger.Info($"网口连接异常,正在重试{ex.Message}");
|
||
next();
|
||
}
|
||
});
|
||
}
|
||
else
|
||
{
|
||
AlertMsg alertMsg = new AlertMsg
|
||
{
|
||
Message = $"未选择手术间,请先选择手术间",
|
||
Type = MsgType.ERROR,
|
||
};
|
||
_eventAggregator.GetEvent<SnackbarEvent>().Publish(alertMsg);
|
||
return;
|
||
}
|
||
//FinishStatus = Visibility.Visible;
|
||
});
|
||
}
|
||
//完成按钮
|
||
public DelegateCommand AddFinish
|
||
{
|
||
get => new DelegateCommand(() =>
|
||
{
|
||
var f = SqlSugarHelper.Db.UseTran(() =>
|
||
{
|
||
//更新 交接柜 库存信息
|
||
if (selectedStock != null && selectedStock.Count > 0)
|
||
{
|
||
//for (int j = 0; j < selectedStock.Count; j++)
|
||
//{
|
||
|
||
// // 更新数据 交接柜 库存信息
|
||
// ChannelStock jiaojie_it = selectedStock[j];
|
||
// jiaojie_it.Quantity = jiaojie_it.AddToJJNum;
|
||
// jiaojie_it.NeedNum = 0;
|
||
// jiaojie_it.AddToJJNum = 0;
|
||
//SqlSugarHelper.Db.Updateable(new ChannelStock()
|
||
//{
|
||
// Quantity = jiaojie_it.AddToJJNum,
|
||
// ManuNo = jiaojie_it.ManuNo,
|
||
// //EffDate = it.EffDate,
|
||
// //Id = jiaojie_it.Id,
|
||
// DrugId=jiaojie_it.DrugId,
|
||
// DrawerNo=jiaojie_it.DrawerNo,
|
||
// MachineId=jiaojie_it.MachineId,
|
||
//}).UpdateColumns(jiaojie_it => new { jiaojie_it.Quantity }).WhereColumns(jiaojie_it=>new { jiaojie_it.DrugId, jiaojie_it.DrawerNo, jiaojie_it.MachineId }).ExecuteCommand();
|
||
//}
|
||
selectedStock.ForEach(cs =>
|
||
{
|
||
cs.Quantity = cs.Quantity + cs.AddToJJNum;
|
||
//cs.NeedNum = 0;
|
||
cs.AddToJJNum = 0;
|
||
//cs.State = 0;
|
||
});
|
||
SqlSugarHelper.Db.Updateable(selectedStock).ExecuteCommand();
|
||
// 更新交接柜状态为 已取药未入库
|
||
//SqlSugarHelper.Db.Updateable(new ChannelList()
|
||
//{
|
||
// State = 0
|
||
//}).UpdateColumns(it => it.State).Where(it => it.DrawerNo == _ChannelList.DrawerNo).ExecuteCommand();
|
||
for (int i = 0; i < selectedStock.Count; i++)
|
||
{
|
||
int iUpdateResult = SqlSugarHelper.Db.Updateable<ChannelStock>()
|
||
.SetColumns(cs => new ChannelStock() { State = 0 })
|
||
.Where(cs => cs.DrawerNo == selectedStock[i].DrawerNo && cs.DrugId == selectedStock[i].DrugId && cs.MachineId == selectedStock[i].MachineId)
|
||
.ExecuteCommand();
|
||
string InvoiceId = "AddJiaoJieFromDM_" + CurrentTimeMillis();
|
||
// 保存记录
|
||
SqlSugarHelper.Db.Insertable(new MachineRecord()
|
||
{
|
||
MachineId = selectedStock[i].MachineId,
|
||
DrawerNo = selectedStock[i].DrawerNo,
|
||
ColNo = selectedStock[i].ColNo,
|
||
DrugId = selectedStock[i].DrugId,
|
||
ManuNo = selectedStock[i].ManuNo,
|
||
EffDate = !String.IsNullOrEmpty(selectedStock[i].EffDate) ? DateTime.ParseExact(selectedStock[i].EffDate, "yyyy-MM-dd", System.Globalization.CultureInfo.CurrentCulture) : null,
|
||
Operator = HomeWindowViewModel.Operator?.Id,
|
||
Reviewer = HomeWindowViewModel.Reviewer?.Id,
|
||
OperationTime = DateTime.Now,
|
||
Quantity = selectedStock[i].Quantity,
|
||
Type = 2,
|
||
InvoiceId = InvoiceId
|
||
//,StockQuantity = nowChannels.Sum(it => it.Quantity),
|
||
//CheckQuantity = it.CheckQuantity
|
||
}).ExecuteCommand();
|
||
}
|
||
//List<ChannelStock> jiaojie = selectedStock.GroupBy(cs => cs.DrugId).Select(cs => cs.FirstOrDefault()).ToList();
|
||
//if (jiaojie != null && jiaojie.Count > 0)
|
||
//{
|
||
// for (int j = 0; j < jiaojie.Count; j++)
|
||
// {
|
||
// ChannelStock jiaojie_it = jiaojie[j];
|
||
// ChannelList jiaojieList = new ChannelList();
|
||
// jiaojieList.State = 0;
|
||
// jiaojieList.Id = jiaojie_it.ChannelLst.Id;
|
||
// //更新交接柜状态为0
|
||
// var result = SqlSugarHelper.Db.Updateable(jiaojieList)
|
||
// .UpdateColumns(it => new { it.State, it.Id }).ExecuteCommand();
|
||
// }
|
||
//}
|
||
|
||
}
|
||
});
|
||
if (f.Data)
|
||
{
|
||
FinishStatus = Visibility.Collapsed;
|
||
RequestData();
|
||
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);
|
||
}
|
||
});
|
||
}
|
||
public long CurrentTimeMillis()
|
||
{
|
||
return (long)(DateTime.UtcNow - Jan1st1970).TotalMilliseconds;
|
||
}
|
||
//刷新
|
||
public DelegateCommand QueryCommand
|
||
{
|
||
get => new DelegateCommand(() => RequestData());
|
||
}
|
||
//设置选中药箱的复选框状态
|
||
private void SetIsSelected(ChannelStock channelStock)
|
||
{
|
||
if (channelStock != null)
|
||
{
|
||
if (channelStock.State == 1)
|
||
{
|
||
channelStock.ChannelLst.IsSelected = !channelStock.ChannelLst.IsSelected;
|
||
}
|
||
else
|
||
{
|
||
return;
|
||
}
|
||
if (channelStock != null && ChannelStocks != null)
|
||
{
|
||
ChannelStocks = ChannelStocks.Select(x =>
|
||
{
|
||
for (int i = 0; i < ChannelStocks.Count; i++)
|
||
{
|
||
if (ChannelStocks[i].DrawerNo == channelStock.DrawerNo)
|
||
{
|
||
ChannelStocks[i].ChannelLst = channelStock.ChannelLst;
|
||
}
|
||
}
|
||
return x;
|
||
}).ToList();
|
||
}
|
||
ICollectionView vw = CollectionViewSource.GetDefaultView(ChannelStocks);
|
||
vw.GroupDescriptions.Add(new PropertyGroupDescription("ChannelLst"));
|
||
}
|
||
}
|
||
}
|
||
}
|