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; using TeamAAS_VP.Resources.Languages; 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 = Lang.添加动作, Item = Lang.持续时长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(Lang.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(Lang.AfagFeeder参数界面移除振动盘任务时出错, 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 = Lang.添加动作, Item = Lang.持续时长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(Lang.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(Lang.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 = Lang.添加动作, Item = Lang.持续时长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(Lang.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(Lang.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(Lang.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(Lang.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(Lang.TeamAfag界面进入时出错, ex); } } /// /// 是否允许导航到此视图模型。 /// /// /// public bool IsNavigationTarget(NavigationContext navigationContext) { return true; } /// /// 导航离开此视图模型时调用。您可以在此处执行清理操作或保存状态。 /// /// public void OnNavigatedFrom(NavigationContext navigationContext) { } #endregion } }