XiangTan_JiaoJie_Bak/DM_Weight/ViewModels/RemoveDialogViewModel.cs

466 lines
20 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.Configuration;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
namespace DM_Weight.ViewModels
{
public class RemoveDialogViewModel : 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 ChannelStock _csStock;
public ChannelStock _ChannelStock
{
get { return _csStock; }
set { SetProperty(ref _csStock, value); }
}
SocketHelper _socketHelper;
public RemoveDialogViewModel(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 => SetProperty(ref _selectedItem, value);
}
//去掉移出的药箱号
private OrderTakeSelect _removeItem = new();
public OrderTakeSelect RemoveItem
{
get => _removeItem;
set => SetProperty(ref _removeItem, value);
}
private int _removeQuantity;
public int RemoveQuantity
{
get => _removeQuantity;
set
{
if (value < 0)
{
throw new ArgumentException("移入数量不能是负数");
}
if (value > _ChannelStock.Quantity)
{
throw new ArgumentException("移入数量超出库存数");
}
SetProperty(ref _removeQuantity, 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);
RemoveQuantity = _ChannelStock.Quantity;
RequestData();
}
public void RequestData()
{
}
//开药盒
public DelegateCommand OpenDrawer
{
get => new DelegateCommand(async () =>
{
if (SelectedItem != 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)
{
RequestData();
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
{
IsFinishClick = true;
var f = SqlSugarHelper.Db.UseTran(() =>
{
//查询要移入的药箱中是否有该药品
List<ChannelStock> RemoveChannelStockList = SqlSugarHelper.Db.Queryable<ChannelStock>()
.Where(cs => cs.MachineId.Equals(_ChannelStock.MachineId))
.Where(cs => cs.DrawerNo == Convert.ToInt32(SelectedItem.Code))
.Where(cs => cs.DrugId.Equals(_ChannelStock.DrugId))
//.Where(cs => cs.ManuNo.Equals(_ChannelStock.ManuNo))
.ToList();
ChannelList channelList = SqlSugarHelper.Db.Queryable<ChannelList>()
.Where(cl => cl.MachineId.Equals(_ChannelStock.MachineId))
.Where(cs => cs.DrawerNo == Convert.ToInt32(SelectedItem.Code))
.Where(cs => cs.DrugId.Equals(_ChannelStock.DrugId)).First();
if (RemoveChannelStockList != null&& RemoveChannelStockList.Count>0&& channelList!=null&&!string.IsNullOrEmpty(channelList.Id))
{
//查询药品总数(移入后是否超基数)
int sumQuantity = RemoveChannelStockList.Sum(rs => rs.Quantity);
if (sumQuantity + RemoveQuantity > channelList.BaseQuantity)
{
AlertMsg alertMsg = new AlertMsg
{
Message = "移入数量超出药箱基数,请重新选择",
Type = MsgType.ERROR,
};
_eventAggregator.GetEvent<SnackbarEvent>().Publish(alertMsg);
return false;
}
//减当前药箱的数量,添加需要加药数量
_ChannelStock.Quantity = _ChannelStock.Quantity - RemoveQuantity;
_ChannelStock.NeedNum = RemoveQuantity;
SqlSugarHelper.Db.Updateable(_ChannelStock).UpdateColumns(it => new { it.Quantity,it.NeedNum }).ExecuteCommand();
string csId = Guid.NewGuid().ToString();
//查询要移动的药箱是否有该批次
ChannelStock removeChannelStock = RemoveChannelStockList.Where(it => it.ManuNo == _ChannelStock.ManuNo).FirstOrDefault();
//有该药品且有该批次
if (removeChannelStock != null)
{
csId = removeChannelStock.Id;
removeChannelStock.Quantity = removeChannelStock.Quantity + RemoveQuantity;
SqlSugarHelper.Db.Updateable(removeChannelStock).UpdateColumns(it => new { it.Quantity }).ExecuteCommand();
}
else
{
//有该药品但没有该批次
int iInsertResult= SqlSugarHelper.Db.Insertable(new ChannelStock()
{
MachineId = _ChannelStock.MachineId,
DrawerNo = Convert.ToInt32(SelectedItem.Code),
ColNo = _ChannelStock.ColNo,
DrugId = _ChannelStock.DrugId,
ManuNo = _ChannelStock.ManuNo,
EffDate=_ChannelStock.EffDate,
Quantity = RemoveQuantity,
DrawerType = 1,
Chnguid = RemoveChannelStockList[0].Chnguid,
CheckQuantity= RemoveChannelStockList[0].CheckQuantity,
Id = csId,
}).ExecuteCommand();
if (iInsertResult > 0)
{
//删除没有批次的数据
SqlSugarHelper.Db.Deleteable<ChannelStock>(RemoveChannelStockList.Where(cs => cs.ManuNo == null)).ExecuteCommand();
}
else
{
AlertMsg alertMsg = new AlertMsg
{
Message = "移入失败",
Type = MsgType.ERROR,
};
_eventAggregator.GetEvent<SnackbarEvent>().Publish(alertMsg);
return false;
}
}
// 保存数据 药品移出记录
int iInsertRecord= SqlSugarHelper.Db.Insertable(new MachineRecord()
{
MachineId = _ChannelStock.MachineId,
DrawerNo = _ChannelStock.DrawerNo,
ColNo = _ChannelStock.ColNo,
DrugId = _ChannelStock.DrugId,
ManuNo = _ChannelStock.ManuNo,
EffDate = !String.IsNullOrEmpty(_ChannelStock.EffDate) ? DateTime.ParseExact(_ChannelStock.EffDate, "yyyy-MM-dd", System.Globalization.CultureInfo.CurrentCulture) : null,
Operator = HomeWindowViewModel.Operator?.Id,
OperationTime = DateTime.Now,
Quantity = RemoveQuantity,
Type = 21,
InvoiceId = _ChannelStock.Id,
DepartmentId = csId //要移入的药箱的channelStock的id
}).ExecuteCommand();
if(iInsertRecord<=0)
{
AlertMsg alertMsg = new AlertMsg
{
Message = "添加记录失败",
Type = MsgType.ERROR,
};
_eventAggregator.GetEvent<SnackbarEvent>().Publish(alertMsg);
return false;
}
}
else
{
//没有绑定该药品
AlertMsg alertMsg = new AlertMsg
{
Message = "药箱没有绑定该药品,请先绑定",
Type = MsgType.ERROR,
};
_eventAggregator.GetEvent<SnackbarEvent>().Publish(alertMsg);
return false;
}
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 = $"操作异常!{ex.Message}",
Type = MsgType.ERROR,
};
_eventAggregator.GetEvent<SnackbarEvent>().Publish(alertMsg);
}
}, () => !IsFinishClick && RemoveQuantity > 0).ObservesProperty(() => IsFinishClick).ObservesProperty(() => RemoveQuantity);
}
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;
}
}