using Cognex.VisionPro; using Cognex.VisionPro.ToolBlock; using MahApps.Metro.Controls; using MaterialDesignThemes.Wpf; using NPOI.SS.Formula.Functions; 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.Diagnostics; using System.IO; using System.Linq; using System.Threading.Tasks; using System.Windows; using Team.FFFeederService.Interfaces; using TeamAAS_VP; using TeamAAS_VP.Controls; using TeamAAS_VP.Core; using TeamAAS_VP.Events; using TeamAAS_VP.Interfaces; using TeamAAS_VP.Models; using TeamAAS_VP.Models.Product; using TeamAAS_VP.Models.Robot; using TeamAAS_VP.Resources.Languages; using TeamAAS_VP.Services; using TeamAAS_VP.Views.Product; using TouchSocket.Core; using static MaterialDesignThemes.Wpf.Theme.ToolBar; using static System.Windows.Forms.VisualStyles.VisualStyleElement.StartPanel; using static System.Windows.Forms.VisualStyles.VisualStyleElement.Window; namespace TeamAAS_VP.ViewModels.Product { public class ProductHomeViewModel : BindableBase, IConfirmNavigationRequest { IRegionManager _regionManager; IEventAggregator _eventAggregator; IContainerProvider _container; IDialogService _dialogService; IConfigService _configService; IRobotService _robotService; ICameraService _cameraService; IFeederService _feederService; IPlcService _plcService; IProductService _productService; ISystemDatabaseService _systemDatabaseService; #region 属性 private ObservableCollection _Products; /// /// 产品列表 /// public ObservableCollection Products { get { return _Products; } set { SetProperty(ref _Products, value); } } private ProductModel _SelectProduct; /// /// 选中的产品 /// public ProductModel SelectProduct { get { return _SelectProduct; } set { SetProperty(ref _SelectProduct, value); } } #endregion #region 命令 private DelegateCommand _CreateCommand; public DelegateCommand CreateCommand => _CreateCommand ?? (_CreateCommand = new DelegateCommand(ExecuteCreateCommand)); private DelegateCommand _RemoveCommand; public DelegateCommand RemoveCommand => _RemoveCommand ?? (_RemoveCommand = new DelegateCommand(ExecuteRemoveCommand, CanExt).ObservesProperty(() => SelectProduct)); private DelegateCommand _EditCommand; public DelegateCommand EditCommand => _EditCommand ?? (_EditCommand = new DelegateCommand(ExecuteEditCommand, CanExt).ObservesProperty(() => SelectProduct)); private DelegateCommand _CopyCommand; public DelegateCommand CopyCommand => _CopyCommand ?? (_CopyCommand = new DelegateCommand(ExecuteCopyCommand).ObservesProperty(() => SelectProduct)); private DelegateCommand _EditNameCommand; public DelegateCommand EditNameCommand => _EditNameCommand ?? (_EditNameCommand = new DelegateCommand(ExecuteEditNameCommand, CanExt).ObservesProperty(() => SelectProduct)); private DelegateCommand _SaveCommand; public DelegateCommand SaveCommand => _SaveCommand ?? (_SaveCommand = new DelegateCommand(ExecuteSaveCommand, CanExt).ObservesProperty(() => SelectProduct)); private DelegateCommand _SaveTemplateCommand; public DelegateCommand SaveTemplateCommand => _SaveTemplateCommand ?? (_SaveTemplateCommand = new DelegateCommand(ExecuteSaveTemplateCommand, CanExt).ObservesProperty(() => SelectProduct)); private DelegateCommand _LoadedCommand; public DelegateCommand LoadedCommand => _LoadedCommand ?? (_LoadedCommand = new DelegateCommand(ExecuteLoadedCommand)); #endregion #region 事件 #endregion public ProductHomeViewModel(IRegionManager regionManager, IEventAggregator ea, IContainerProvider container, IDialogService dialogService, IConfigService configService, IRobotService robotService, ICameraService cameraService, IFeederService feederService, IPlcService plcService, IProductService productService, ISystemDatabaseService systemDatabaseService) { _regionManager = regionManager; _eventAggregator = ea; _container = container; _dialogService = dialogService; _configService = configService; _robotService = robotService; _cameraService = cameraService; _feederService = feederService; _plcService = plcService; _productService = productService; _systemDatabaseService = systemDatabaseService; //订阅权限登录事件 _eventAggregator.GetEvent().Subscribe(LoginChange); } #region 方法 void ExecuteLoadedCommand() { if (_systemDatabaseService.GetCurrentUser().userPart == Enums.UserPart.Operator) { IsAllowEdit = false; } else { IsAllowEdit = true; } } /// /// 新建产品 /// async void ExecuteCreateCommand() { try { var view = new CreateProductPage(); //show the dialog var result = await DialogHost.Show(view, "RootDialog", ExtendedOpenedEventHandler, ExtendedClosingEventHandler, ExtendedClosedEventHandler); if (result != null) { string productname = ((CreateProductPageViewModel)result).ProductName; string template = ((CreateProductPageViewModel)result).SelectTemplate; if (!FileHelper.CheckFileName(productname)) { _eventAggregator.GetEvent().Publish(new MessageParameter() { Msg = Lang.输入的名称不符合文件名命名规则, Duration = 1 }); return; } if (Products.FirstOrDefault(p => p.Name == productname) != null) { _eventAggregator.GetEvent().Publish(new MessageParameter() { Msg = Lang.已存在同名产品, Duration = 1 }); return; } if (template != "空白" && !string.IsNullOrEmpty(template)) { //通过模板创建产品 var product1 = _productService.CreateProductByTemplateName(template, productname); var products = _productService.GetAllProducts(); Products=new ObservableCollection(products); SelectProduct=Products.FirstOrDefault(p => p.ID == product1.ID); _regionManager.RequestNavigate("ProductRegionContext", "ProductDescription"); return; } //创建新产品 var newproduct = new ProductModel() { Name = productname, ID = Guid.NewGuid(), DateTime = DateTime.Now, CameraProcedures = new ObservableCollection(), RobotPoint = new RobotPoint(_configService.GetAllRobots().ToArray()), IsLoad = false, IsCreate = true, Speed = 20, Accel = 50, Speeds = 500, Accels = 10000, Power = false, IsUserUpCamera = false, GlobalParamListCollection = new ObservableCollection(), PickCameraPoints = new ObservableCollection(), PickPoints = new ObservableCollection(), SecPosCameraPoints = new ObservableCollection(), ScrewCameraPoints = new ObservableCollection(), ScrewPoints = new ObservableCollection(), CheckCameraPoints = new ObservableCollection(), QrCodePoints = new ObservableCollection() }; var cameras = _configService.GetAllCameras(); foreach (var item in cameras) { newproduct.CameraProcedures.Add(new CameraProcedure() { Camera = item.CameraName, ID = item.Id, ProcedureModels = new ObservableCollection() }); } _productService.CreateProduct(newproduct); Products = new ObservableCollection(_productService.GetAllProducts()); SelectProduct = Products.FirstOrDefault(p => p.ID == newproduct.ID); NavigationParameters param = new NavigationParameters(); param.Add("SelectProduct", SelectProduct); _regionManager.RequestNavigate("ProductRegionContext", "ProductDescription", param); } } catch (Exception ex) { LogHelper.WriteLogError(Lang.产品界面新建产品时出错, ex); MessageBox.Show(ex.Message); } } /// /// 移除产品 /// void ExecuteRemoveCommand(object product) { try { if (!(product is ProductModel)) return; if (MessageBox.Show($"{Lang.移除}[{((ProductModel)product).Name}]?", Lang.移除产品, MessageBoxButton.YesNo, MessageBoxImage.Question) == MessageBoxResult.Yes) { _productService.DeleteProduct(((ProductModel)product).ID); Products = new ObservableCollection(_productService.GetAllProducts()); SelectProduct = null; } } catch (Exception ex) { LogHelper.WriteLogError(Lang.产品界面移除产品时出错, ex); MessageBox.Show(ex.Message); } } /// /// 编辑产品 /// void ExecuteEditCommand(object product) { if (!(product is ProductModel)) return; NavigationParameters parameters = new NavigationParameters(); parameters.Add("SelectProduct", SelectProduct); _regionManager.RequestNavigate("ProductRegionContext", "ProductDescription", parameters); } /// /// 复制产品 /// async void ExecuteCopyCommand(object product) { if (!(product is ProductModel)) return; try { var view = new AddProduct() { Title = $"{Lang.复制产品}:", Item = "Name" }; //show the dialog var result = await DialogHost.Show(view, "RootDialog", ExtendedOpenedEventHandler, ExtendedClosingEventHandler, ExtendedClosedEventHandler); if (result != null && !string.IsNullOrEmpty(result.ToString())) { if (!FileHelper.CheckFileName(result.ToString())) { _eventAggregator.GetEvent().Publish(new MessageParameter() { Msg = Lang.输入的名称不符合文件名命名规则, Duration = 1 }); return; } if (Products.FirstOrDefault(pr => pr.Name == result.ToString()) != null) { _eventAggregator.GetEvent().Publish(new MessageParameter() { Msg = Lang.已存在同名产品, Duration = 1 }); return; } Guid id = _productService.CopyProduct(((ProductModel)product).ID, result.ToString().Trim()); Products = new ObservableCollection(_productService.GetAllProducts()); SelectProduct = Products.FirstOrDefault(p => p.ID == id); _eventAggregator.GetEvent().Publish(new MessageParameter() { Msg = Lang.复制完成, Duration = 1 }); } } catch (Exception ex) { LogHelper.WriteLogError("产品界面-复制产品时出错", ex); MessageBox.Show(ex.Message); } } /// /// 修改产品名称 /// async void ExecuteEditNameCommand(object product) { try { if (!(product is ProductModel)) return; var view = new AddProduct() { Title = $"{Lang.修改产品名称}:", Item = "Name" }; //show the dialog var result = await DialogHost.Show(view, "RootDialog", ExtendedOpenedEventHandler, ExtendedClosingEventHandler, ExtendedClosedEventHandler); if (result != null && !string.IsNullOrEmpty(result.ToString())) { if (!FileHelper.CheckFileName(result.ToString())) { _eventAggregator.GetEvent().Publish(new MessageParameter() { Msg = Lang.输入的名称不符合文件名命名规则, Duration = 1 }); return; } if (Products.FirstOrDefault(pr => pr.Name == result.ToString()) != null) { _eventAggregator.GetEvent().Publish(new MessageParameter() { Msg = Lang.已存在同名产品, Duration = 1 }); return; } _productService.RenameProduct(((ProductModel)product).ID, result.ToString().Trim()); Products = new ObservableCollection(_productService.GetAllProducts()); SelectProduct = Products.FirstOrDefault(p => p.ID == ((ProductModel)product).ID); _eventAggregator.GetEvent().Publish(new MessageParameter() { Msg = Lang.修改完成, Duration = 1 }); } } catch (Exception ex) { LogHelper.WriteLogError(Lang.产品界面修改产品名称时出错, ex); MessageBox.Show(ex.Message); } } /// /// 保存产品 /// /// void ExecuteSaveCommand(object product) { try { if (!(product is ProductModel)) return; if (MessageBox.Show(Lang.是否保存产品.Replace("{0}", ((ProductModel)product).Name), Lang.保存产品, MessageBoxButton.OKCancel, MessageBoxImage.Question) == MessageBoxResult.OK) { _productService.UpdateProduct((ProductModel)product); _eventAggregator.GetEvent().Publish(new MessageParameter() { Msg = $"{Lang.完成}!", Duration = 1 }); } } catch (Exception ex) { LogHelper.WriteLogError(Lang.产品界面保存产品时出错, ex); MessageBox.Show(ex.Message); } } /// /// 保存产品模板 /// /// void ExecuteSaveTemplateCommand(object product) { try { if (!(product is ProductModel)) return; if (MessageBox.Show(Lang.是否保存产品为模板.Replace("{0}", ((ProductModel)product).Name), Lang.保存产品模板, MessageBoxButton.OKCancel, MessageBoxImage.Question) == MessageBoxResult.OK) { string templatePath = FilePath.ProductTemplatePath + "//" + ((ProductModel)product).Name; _productService.SaveProduct(((ProductModel)product).ID, templatePath); _eventAggregator.GetEvent().Publish(new MessageParameter() { Msg = $"{Lang.完成}!", Duration = 1 }); } } catch (Exception ex) { LogHelper.WriteLogError(Lang.产品界面保存产品至模板时出错, ex); MessageBox.Show(ex.Message); } } private void ExtendedOpenedEventHandler(object sender, DialogOpenedEventArgs eventArgs) { } private void ExtendedClosingEventHandler(object sender, DialogClosingEventArgs eventArgs) { } private void ExtendedClosedEventHandler(object sender, DialogClosedEventArgs eventArgs) { } private bool CanExt(object obg) { return SelectProduct != null ? true : false; } #endregion #region 继承 /// /// 确认导航请求时调用。此方法允许您在导航之前执行一些操作。 /// /// /// public void ConfirmNavigationRequest(NavigationContext navigationContext, Action continuationCallback) { continuationCallback(true); } /// /// 接收导航请求时调用。传入导航参数,包含有关导航目标的信息。 /// /// /// public async void OnNavigatedTo(NavigationContext navigationContext) { if (Products==null) { var products = _productService.GetAllProducts(); Products = new ObservableCollection(products); } } /// /// 是否允许导航到此视图模型。 /// /// /// public bool IsNavigationTarget(NavigationContext navigationContext) { return true; } /// /// 导航离开此视图模型时调用。您可以在此处执行清理操作或保存状态。 /// /// public void OnNavigatedFrom(NavigationContext navigationContext) { } #endregion private bool _IsAllowEdit = false; public bool IsAllowEdit { get { return _IsAllowEdit; } set { SetProperty(ref _IsAllowEdit, value); } } private void LoginChange(Models.User user) { if (user.userPart == Enums.UserPart.Operator) { IsAllowEdit = false; } else { IsAllowEdit = true; } } } }