XiangTan_JiaoJie_Bak/DM_Weight/ViewModels/AdditionWindowViewModel.cs

428 lines
19 KiB
C#
Raw Normal View History

2025-01-06 09:40:32 +08:00
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
2025-01-06 09:40:32 +08:00
{
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);
}
2025-01-06 09:40:32 +08:00
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);
}
2025-01-06 09:40:32 +08:00
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)
2025-01-06 09:40:32 +08:00
{
//_dialogService = dialogService;
_eventAggregator = eventAggregator;
//_portUtil = portUtil;
_socketHelper = socketHelper;
2025-01-06 09:40:32 +08:00
}
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);
2025-01-06 09:40:32 +08:00
RequestData();
}
private void RequestData()
{
_ChannelLists?.Clear();
ChannelStocks?.Clear();
2025-01-06 09:40:32 +08:00
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;
}
2025-01-06 09:40:32 +08:00
}
//开药箱放入药品
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();
2025-01-06 09:40:32 +08:00
if (selectedStock != null && selectedStock.Count > 0)
{
//selectedStock.ForEach(cs => cs.ChannelLst.State = 2);
2025-01-06 09:40:32 +08:00
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();
2025-01-06 09:40:32 +08:00
_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;
2025-01-06 09:40:32 +08:00
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();
}
});
2025-01-06 09:40:32 +08:00
}
else
{
AlertMsg alertMsg = new AlertMsg
{
Message = $"未选择手术间,请先选择手术间",
Type = MsgType.ERROR,
};
_eventAggregator.GetEvent<SnackbarEvent>().Publish(alertMsg);
return;
}
//FinishStatus = Visibility.Visible;
2025-01-06 09:40:32 +08:00
});
}
//完成按钮
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();
2025-01-06 09:40:32 +08:00
//}
selectedStock.ForEach(cs =>
{
cs.Quantity = cs.Quantity + cs.AddToJJNum;
//cs.NeedNum = 0;
2025-01-06 09:40:32 +08:00
cs.AddToJJNum = 0;
//cs.State = 0;
2025-01-06 09:40:32 +08:00
});
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();
// }
//}
2025-01-06 09:40:32 +08:00
}
});
if (f.Data)
{
FinishStatus = Visibility.Collapsed;
2025-01-06 09:40:32 +08:00
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;
}
2025-01-06 09:40:32 +08:00
//刷新
public DelegateCommand QueryCommand
{
get => new DelegateCommand(() => RequestData());
}
//设置选中药箱的复选框状态
private void SetIsSelected(ChannelStock channelStock)
{
if (channelStock != null)
{
if (channelStock.State == 1)
2025-01-06 09:40:32 +08:00
{
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"));
}
}
}
}