XiangTan_JiaoJie_Bak/DM_Weight/ViewModels/AdditionWindowViewModel.cs

428 lines
19 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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"));
}
}
}
}