using MaterialDesignThemes.Wpf;
using Prism.Commands;
using Prism.Events;
using Prism.Ioc;
using Prism.Mvvm;
using Prism.Regions;
using Prism.Services.Dialogs;
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq;
using System.Threading;
using System.Windows;
using Team.FFFeederService;
using Team.FFFeederService.Interfaces;
using Team.FFFeederService.Models;
using TeamAAS_VP;
using TeamAAS_VP.Controls;
using TeamAAS_VP.Core;
using TeamAAS_VP.Enums;
using TeamAAS_VP.Events;
using TeamAAS_VP.Interfaces;
using TeamAAS_VP.Models;
using TeamAAS_VP.Models.Feeder;
namespace TeamAAS_VP.ViewModels.Product
{
public class AfagFeederParamsViewModel : BindableBase, IConfirmNavigationRequest
{
IRegionManager _regionManager;
IEventAggregator _eventAggregator;
IContainerProvider _container;
IDialogService _dialogService;
IFeederService _feederService;
IRemoteCommandService _remoteCommandService;
ISystemDatabaseService _systemDatabaseService;
CancellationTokenSource TokenSource;
#region 属性
private bool _IsAllowEdit = false;
public bool IsAllowEdit
{
get { return _IsAllowEdit; }
set { SetProperty(ref _IsAllowEdit, value); }
}
private ProductModel _SelectProduct;
///
/// 选中的产品
///
public ProductModel SelectProduct
{
get { return _SelectProduct; }
set { SetProperty(ref _SelectProduct, value); }
}
private ProcedureModel _SelectProcedure;
///
/// 选中的流程
///
public ProcedureModel SelectProcedure
{
get { return _SelectProcedure; }
set { SetProperty(ref _SelectProcedure, value); }
}
public Management management { get; set; }
private AfagFeeder _Feeder;
public AfagFeeder Feeder
{
get { return _Feeder; }
set { SetProperty(ref _Feeder, value); }
}
private int _FunctionIndex;
public int FunctionIndex
{
get { return _FunctionIndex; }
set { SetProperty(ref _FunctionIndex, value); }
}
private int _FunctionIndex1;
public int FunctionIndex1
{
get { return _FunctionIndex1; }
set { SetProperty(ref _FunctionIndex1, value); }
}
private int _RegisterType;
public int RegisterType
{
get { return _RegisterType; }
set { SetProperty(ref _RegisterType, value); }
}
#endregion
#region 命令
private DelegateCommand _NextCommand;
public DelegateCommand NextCommand =>
_NextCommand ?? (_NextCommand = new DelegateCommand(ExecuteNextCommand));
private DelegateCommand _BackCommand;
public DelegateCommand BackCommand =>
_BackCommand ?? (_BackCommand = new DelegateCommand(ExecuteBackCommand));
private DelegateCommand _LoadedCommand;
public DelegateCommand LoadedCommand =>
_LoadedCommand ?? (_LoadedCommand = new DelegateCommand(ExecuteLoadedCommand));
private DelegateCommand _AddFunctionCommand;
public DelegateCommand AddFunctionCommand =>
_AddFunctionCommand ?? (_AddFunctionCommand = new DelegateCommand(ExecuteAddFunctionCommand));
private DelegateCommand _RemoveFunctionCommand;
public DelegateCommand RemoveFunctionCommand =>
_RemoveFunctionCommand ?? (_RemoveFunctionCommand = new DelegateCommand(ExecuteRemoveFunctionCommand));
private DelegateCommand _AddStockFunctionCommand;
public DelegateCommand AddStockFunctionCommand =>
_AddStockFunctionCommand ?? (_AddStockFunctionCommand = new DelegateCommand(ExecuteAddStockFunctionCommand));
private DelegateCommand _RemoveStockFunctionCommand;
public DelegateCommand RemoveStockFunctionCommand =>
_RemoveStockFunctionCommand ?? (_RemoveStockFunctionCommand = new DelegateCommand(ExecuteRemoveStockFunctionCommand));
private DelegateCommand _AddStockFeederFunctionCommand;
public DelegateCommand AddStockFeederFunctionCommand =>
_AddStockFeederFunctionCommand ?? (_AddStockFeederFunctionCommand = new DelegateCommand(ExecuteAddStockFeederFunctionCommand));
private DelegateCommand _RemoveStockFeederFunctionCommand;
public DelegateCommand RemoveStockFeederFunctionCommand =>
_RemoveStockFeederFunctionCommand ?? (_RemoveStockFeederFunctionCommand = new DelegateCommand(ExecuteRemoveStockFeederFunctionCommand));
private DelegateCommand _SettingStockCommand;
public DelegateCommand SettingStockCommand =>
_SettingStockCommand ?? (_SettingStockCommand = new DelegateCommand(ExecuteSettingStockCommand));
private DelegateCommand _RunCommandWorks;
public DelegateCommand RunCommandWorks =>
_RunCommandWorks ?? (_RunCommandWorks = new DelegateCommand(ExecuteRunCommandWorks).ObservesCanExecute(() => IsCanExecute));
#endregion
#region 事件
#endregion
public AfagFeederParamsViewModel(IRegionManager regionManager, IEventAggregator ea, IContainerProvider container, IDialogService dialogService,
IFeederService feederService, IRemoteCommandService remoteCommandService, ISystemDatabaseService systemDatabaseService)
{
_regionManager = regionManager;
_eventAggregator = ea;
_container = container;
_dialogService = dialogService;
_feederService = feederService;
_remoteCommandService= remoteCommandService;
_systemDatabaseService= systemDatabaseService;
//订阅权限登录事件
_eventAggregator.GetEvent().Subscribe(LoginChange);
management = _container.Resolve();
}
#region 方法
///
/// 下一步
///
async void ExecuteNextCommand()
{
NavigationParameters param = new NavigationParameters();
param.Add("SelectProduct", SelectProduct);
param.Add("SelectedProcedure", SelectProcedure);
_regionManager.RequestNavigate("ProductRegionContext", "ProcedureVisionOutput", param);
}
///
/// 上一步
///
void ExecuteBackCommand()
{
NavigationParameters param = new NavigationParameters();
param.Add("SelectProduct", SelectProduct);
param.Add("SelectedProcedure", SelectProcedure);
if (SelectProcedure.VisionModel == Enums.VisionModel.Simple)
{
_regionManager.RequestNavigate("ProductRegionContext", "SimpleProcedure", param);
}
else
{
_regionManager.RequestNavigate("ProductRegionContext", "AdvancedProcedure", param);
}
}
///
/// 增加振动盘振动任务
///
async void ExecuteAddFunctionCommand()
{
try
{
if (SelectProcedure.FeederWorks == null)
{
SelectProcedure.FeederWorks = new FeederWorks();
}
var view = new AddProduct() { Title = "添加动作:", Item = "持续时长(ms)" };
//show the dialog
var result = await DialogHost.Show(view, "RootDialog", null, null, null);
if (result != null && !string.IsNullOrEmpty(result.ToString()) && int.TryParse(result.ToString(), out int time))
{
if (Feeder != null && Feeder.IsConnected)
{
SelectProcedure.FeederWorks.Add(new FeederWork() { Step = SelectProcedure.FeederWorks.Count, ConfigIndex = FunctionIndex, Intensity = Feeder.Intensity, Direction = Feeder.Direction, Duration = time });
}
else
{
SelectProcedure.FeederWorks.Add(new FeederWork() { Step = SelectProcedure.FeederWorks.Count, ConfigIndex = FunctionIndex, Intensity = 0, Direction = 0, Duration = time });
}
}
}
catch (Exception ex)
{
LogHelper.WriteLogError("Feeder 参数界面增加振动盘任务时出错!", ex);
MessageBox.Show(ex.Message);
}
}
///
/// 移除振动盘振动任务
///
///
void ExecuteRemoveFunctionCommand(object index)
{
try
{
if (SelectProcedure.FeederWorks == null || SelectProcedure.FeederWorks.FeederWorkList == null)
{
return;
}
if ((int)index < 0) return;
SelectProcedure.FeederWorks.FeederWorkList.RemoveAt((int)index);
}
catch (Exception ex)
{
LogHelper.WriteLogError("Afag Feeder 参数界面移除振动盘任务时出错!", ex);
MessageBox.Show(ex.Message);
}
}
///
/// 增加料仓振动任务
///
async void ExecuteAddStockFunctionCommand()
{
try
{
if (SelectProcedure.FeederStockWorks == null)
{
SelectProcedure.FeederStockWorks = new FeederStockWorks();
SelectProcedure.FeederStockWorks.FeederStockWorkList = new ObservableCollection();
SelectProcedure.FeederStockWorks.FeederWorkList = new ObservableCollection();
}
if (SelectProcedure.FeederStockWorks.FeederStockWorkList == null)
{
SelectProcedure.FeederStockWorks.FeederStockWorkList = new ObservableCollection();
}
if (SelectProcedure.FeederStockWorks.FeederWorkList == null)
{
SelectProcedure.FeederStockWorks.FeederWorkList = new ObservableCollection();
}
var view = new AddProduct() { Title = "添加动作:", Item = "持续时长(ms)" };
//show the dialog
var result = await DialogHost.Show(view, "RootDialog", null, null, null);
if (result != null && !string.IsNullOrEmpty(result.ToString()) && int.TryParse(result.ToString(), out int time))
{
SelectProcedure.FeederStockWorks.FeederStockWorkList.Add(new FeederStockWork() { Step = SelectProcedure.FeederStockWorks.FeederStockWorkList.Count, RegisterIndex = RegisterType, Address = 1, Duration = time });
}
}
catch (Exception ex)
{
LogHelper.WriteLogError("Feeder 参数界面增加料仓任务时出错!", ex);
MessageBox.Show(ex.Message);
}
}
///
/// 移除料仓振动任务
///
///
void ExecuteRemoveStockFunctionCommand(object index)
{
try
{
if (SelectProcedure.FeederStockWorks == null || SelectProcedure.FeederStockWorks.FeederStockWorkList == null)
{
return;
}
if ((int)index < 0) return;
SelectProcedure.FeederStockWorks.FeederStockWorkList.RemoveAt((int)index);
}
catch (Exception ex)
{
LogHelper.WriteLogError("Feeder 参数界面移除料仓任务时出错!", ex);
MessageBox.Show(ex.Message);
}
}
///
/// 增加料仓振动时的振动盘振动任务
///
async void ExecuteAddStockFeederFunctionCommand()
{
try
{
if (SelectProcedure.FeederStockWorks == null)
{
SelectProcedure.FeederStockWorks = new FeederStockWorks();
SelectProcedure.FeederStockWorks.FeederStockWorkList = new ObservableCollection();
SelectProcedure.FeederStockWorks.FeederWorkList = new ObservableCollection();
}
if (SelectProcedure.FeederStockWorks.FeederStockWorkList == null)
{
SelectProcedure.FeederStockWorks.FeederStockWorkList = new ObservableCollection();
}
if (SelectProcedure.FeederStockWorks.FeederWorkList == null)
{
SelectProcedure.FeederStockWorks.FeederWorkList = new ObservableCollection();
}
var view = new AddProduct() { Title = "添加动作:", Item = "持续时长(ms)" };
//show the dialog
var result = await DialogHost.Show(view, "RootDialog", null, null, null);
if (result != null && !string.IsNullOrEmpty(result.ToString()) && int.TryParse(result.ToString(), out int time))
{
if (Feeder != null && Feeder.IsConnected)
{
SelectProcedure.FeederStockWorks.FeederWorkList.Add(new FeederWork() { Step = SelectProcedure.FeederWorks.Count, ConfigIndex = FunctionIndex1, Intensity = Feeder.Intensity, Direction = Feeder.Direction, Duration = time });
}
else
{
SelectProcedure.FeederStockWorks.FeederWorkList.Add(new FeederWork() { Step = SelectProcedure.FeederWorks.Count, ConfigIndex = FunctionIndex1, Intensity = 0, Direction = 0, Duration = time });
}
}
}
catch (Exception ex)
{
LogHelper.WriteLogError("Feeder 参数界面增加料仓动作时的振动盘任务时出错!", ex);
MessageBox.Show(ex.Message);
}
}
void ExecuteRemoveStockFeederFunctionCommand(object index)
{
try
{
if (SelectProcedure.FeederStockWorks == null || SelectProcedure.FeederStockWorks.FeederWorkList == null)
{
return;
}
if ((int)index < 0) return;
SelectProcedure.FeederStockWorks.FeederWorkList.RemoveAt((int)index);
}
catch (Exception ex)
{
LogHelper.WriteLogError("Feeder 参数界面移除料仓动作时的振动盘任务时出错!", ex);
MessageBox.Show(ex.Message);
}
}
///
/// 料仓出料时机参数设定
///
void ExecuteSettingStockCommand()
{
try
{
_dialogService.Show("FeederBlobParams", rst => {
//对话框关闭之后的回调函数,可以在这解析结果。
ButtonResult result1 = rst.Result;
if (result1 == ButtonResult.OK)
{
SelectProcedure.MinArea = rst.Parameters.GetValue("MinArea");
_eventAggregator.GetEvent().Publish(new MessageParameter() { Msg = "完成!", Duration = 1 });
}
});
}
catch (Exception ex)
{
LogHelper.WriteLogError("Feeder 参数界面打开FeederBlob参数界面时出错!", ex);
MessageBox.Show(ex.Message);
}
}
async void ExecuteLoadedCommand()
{
if (_systemDatabaseService.GetCurrentUser().userPart == Enums.UserPart.Operator)
{
IsAllowEdit = false;
}
else
{
IsAllowEdit = true;
}
}
private bool _IsCanExecute = true;
public bool IsCanExecute
{
get { return _IsCanExecute; }
set { SetProperty(ref _IsCanExecute, value); }
}
async void ExecuteRunCommandWorks(string index)
{
try
{
IsCanExecute = false;
int num = int.Parse(index);
if (num == 0)
{
TokenSource = new CancellationTokenSource();
var view = new WaitingPage();
//show the dialog
var _ = DialogHost.Show(view, "RootDialog", null, ExtendedClosingEventHandler, ExtendedClosedEventHandler);
await _remoteCommandService.ExecuteFeederWorks(Feeder, SelectProcedure.FeederWorks, TokenSource.Token, false);
if (DialogHost.IsDialogOpen("RootDialog"))
{
TokenSource = null;
DialogHost.Close("RootDialog");
}
TokenSource = null;
}
else if (num == 1)
{
TokenSource = new CancellationTokenSource();
var view = new WaitingPage();
//show the dialog
var _ = DialogHost.Show(view, "RootDialog", null, ExtendedClosingEventHandler, ExtendedClosedEventHandler);
await _remoteCommandService.ExecuteFeederStockWorks(Feeder, SelectProcedure.FeederStockWorks, TokenSource.Token, false);
if (DialogHost.IsDialogOpen("RootDialog"))
{
TokenSource = null;
DialogHost.Close("RootDialog");
}
TokenSource = null;
}
}
catch (Exception ex)
{
LogHelper.WriteLogError("Feeder 参数界面执行Feeder运动任务时出错时出错!", ex);
MessageBox.Show(ex.Message);
}
finally
{
IsCanExecute = true;
}
}
private void ExtendedClosingEventHandler(object sender, DialogClosingEventArgs eventArgs)
{
if (TokenSource != null)
{
TokenSource.Cancel();
}
}
private void ExtendedClosedEventHandler(object sender, DialogClosedEventArgs eventArgs)
{
}
private void LoginChange(Models.User user)
{
if (user.userPart == Enums.UserPart.Operator)
{
IsAllowEdit = false;
}
else
{
IsAllowEdit = true;
}
}
#endregion
#region 继承
///
/// 确认导航请求时调用。此方法允许您在导航之前执行一些操作。
///
///
///
public void ConfirmNavigationRequest(NavigationContext navigationContext, Action continuationCallback)
{
continuationCallback(true);
}
///
/// 接收导航请求时调用。传入导航参数,包含有关导航目标的信息。
///
///
///
public async void OnNavigatedTo(NavigationContext navigationContext)
{
try
{
SelectProduct = navigationContext.Parameters.GetValue("SelectProduct");
SelectProcedure = navigationContext.Parameters.GetValue("SelectedProcedure");
Feeder = _feederService.GetFeeder(SelectProcedure.FeederId) as AfagFeeder;
if (Feeder != null && Feeder.IsConnected)
{
if (SelectProcedure.FeederWorks != null && SelectProcedure.FeederWorks.FeederWorkList != null)
{
foreach (var item in SelectProcedure.FeederWorks.FeederWorkList)
{
if (item.Function == VibrationFunction.Delay) continue;
if (item.SingleAction == null) continue;
await Feeder.SetShakeParametersAsync((int)item.Function, item.SingleAction);
}
}
if (SelectProcedure.FeederStockWorks != null && SelectProcedure.FeederStockWorks.FeederWorkList != null)
{
foreach (var item in SelectProcedure.FeederStockWorks.FeederWorkList)
{
if (item.Function == VibrationFunction.Delay) continue;
if (item.SingleAction == null) continue;
await Feeder.SetShakeParametersAsync((int)item.Function, item.SingleAction);
}
}
}
}
catch (Exception ex)
{
LogHelper.WriteLogError("Team Afag界面进入时出错!", ex);
}
}
///
/// 是否允许导航到此视图模型。
///
///
///
public bool IsNavigationTarget(NavigationContext navigationContext)
{
return true;
}
///
/// 导航离开此视图模型时调用。您可以在此处执行清理操作或保存状态。
///
///
public void OnNavigatedFrom(NavigationContext navigationContext)
{
}
#endregion
}
}