using Common; using Common.Models; using CommunityToolkit.Mvvm.Input; using CommunityToolkit.Mvvm.Messaging; using MegaRobo.C00225155.AppServer; using MegaRobo.C00225155.DataAccess; using MegaRobo.C00225155.Entities; using MegaRobo.Contract; using MegaRobo.ControlDevices.Models; using MegaRobo.Entities; using MegaRobo.WpfInfrastructure.Abstractions; using NPOI.HSSF.UserModel; using NPOI.SS.Formula.Functions; using NPOI.SS.UserModel; using NPOI.XSSF.UserModel; using System; using System.Collections.Generic; using System.Collections.ObjectModel; using System.ComponentModel; using System.IO; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; using System.Windows.Input; namespace MegaRobo.C00225155App.MenuViewModels { public class FlowConfigViewModel : ViewModelBaseEx { #region 8个缓存位置 public ObservableCollection BoxIndexList { get; set; } = new ObservableCollection(); private int selectedBoxIndex; public int SelectedBoxIndex { get { return selectedBoxIndex; } set { SetProperty(ref selectedBoxIndex, value); } } private BoxTypeEnum selectedboxtype; public BoxTypeEnum SelectedBoxType { get { return selectedboxtype; } set { SetProperty(ref selectedboxtype, value); if (selectedboxtype == BoxTypeEnum._40mL原液工装) { BoxIndexList.Clear(); BoxIndexList.Add(1); BoxIndexList.Add(5); } else { BoxIndexList.Clear(); BoxIndexList.Add(3); BoxIndexList.Add(4); BoxIndexList.Add(7); BoxIndexList.Add(8); } } } #endregion private ObservableCollection samplelist = new ObservableCollection(); private ObservableCollection liquidlist = new ObservableCollection(); private ObservableCollection powderlist = new ObservableCollection(); private ObservableCollection powderlist_125 = new ObservableCollection(); private WorkService workService; private IDataAccessService dataAccessService; public ProjectProperty ProjectPro { get => workService.ProjectPro; set { if (workService.ProjectPro != value) { workService.ProjectPro = value; OnPropertyChanged(nameof(ProjectPro)); } } } #region 方案按钮操作 public ICommand NewProjectCommand { get; set; } public ICommand OpenProjectCommand { get; set; } public ICommand SaveAsCommand { get; set; } public ICommand SaveCommand { get; set; } public ICommand ExportExcelCommand { get; set; } public ICommand ImportExcelCommand { get; set; } #endregion #region 样品工装参数 /// /// 更新指定工装的所有配方 /// public ICommand UpdateSampleBoxPropertyCommand { get; set; } /// /// 清空指定工装的所有配方 /// public ICommand ClearSampleBoxPropertyCommand { get; set; } /// /// 瓶子都置为空 /// public ICommand ResetAllSampleBottlesCommand { get; set; } /// /// 瓶子都置为满瓶子 /// public ICommand FillAllSampleBottlesCommand { get; set; } public ICommand ResetSampleBottlesCommand { get; set; } #endregion #region Tip头工装 /// /// Tip头工装置为空 /// public ICommand ResetAllTipHeadCommand { get; set; } /// /// Tip头工装置为满 /// public ICommand FillAllTipHeadCommand { get; set; } #endregion // 命令:加载工装(参数为BoxTypeEnum) public ICommand LoadBoxCommand { get; set; } public FlowConfigViewModel() { } public override void Initialize(ICoreService coreService, string title, params object[] args) { base.Initialize(coreService, title, args); samplelist = new ObservableCollection(); for (int i = 0; i < 12; i++) { samplelist.Add(new SampleBottleModel() { SampleBottleLidState = SampleBottleLidStateEnum.Close, PosId_InBox = i + 1, HaveBottle = true, bDoseFinish = false, SNCode = string.Empty, }); } liquidlist = new ObservableCollection(); for (int i = 0; i < 8; i++) { liquidlist.Add(new SourceLiquidBottleModel() { LiquidBottleLidState = SourceBottleLidStateEnum.Close, PosId_InBox = i + 1, HaveBottle = true, RemainVolume = 0, SNCode = string.Empty, SourceLiquidBottleState = SourceBottleStateEnum.Idl, }); } powderlist = new ObservableCollection(); for (int i = 0; i < 4; i++) { powderlist.Add(new SourcePowderBottleModel() { PosId_InBox = i + 1, HaveBottle = true, RemainWeight = 0, SNCode = string.Empty, SourcePowderBottleState = SourceBottleStateEnum.Idl, }); } powderlist_125 = new ObservableCollection(); for (int i = 0; i < 2; i++) { powderlist_125.Add(new SourcePowderBottleModel() { PosId_InBox = i + 1, HaveBottle = true, RemainWeight = 0, SNCode = string.Empty, SourcePowderBottleState = SourceBottleStateEnum.Idl, }); } //InitialProject(); } protected override void LoadServices() { base.LoadServices(); this.workService = this.CoreService.GetServiceInstance(); if (workService != null) { workService.ProjectProChanged += OnProjectProChanged; } this.dataAccessService = this.CoreService.GetServiceInstance(); } public new event PropertyChangedEventHandler PropertyChanged; // 当ProjectPro变更时调用此方法 private void OnProjectProChanged() { // 通知视图ProjectPro属性已变更 PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(ProjectPro))); } protected override void LoadDatas() { base.LoadDatas(); BoxIndexList.Clear(); //BoxIndexList.AddRange(new int[] { 1, 2, 3, 4, 5, 6, 7, 8 }); } protected override void Register() { base.Register(); NewProjectCommand = new RelayCommand(NewProject); OpenProjectCommand = new RelayCommand(OpenProject); SaveAsCommand = new RelayCommand(SaveAsProject); SaveCommand = new RelayCommand(SaveProject); ImportExcelCommand = new RelayCommand(ImportExcel); ExportExcelCommand = new RelayCommand(ExportExcel); UpdateSampleBoxPropertyCommand = new RelayCommand(UpdateSampleBoxProperty); ClearSampleBoxPropertyCommand = new RelayCommand(ClearSampleBoxProperty); ResetAllSampleBottlesCommand = new RelayCommand(ClearSampleBottles); FillAllSampleBottlesCommand = new RelayCommand(FillSampleBottles); ResetSampleBottlesCommand = new RelayCommand(ResetSampleBottles); ResetAllTipHeadCommand = new RelayCommand(ResetAllTipHead); FillAllTipHeadCommand = new RelayCommand(FillAllTipHead); LoadBoxCommand = new RelayCommand(LoadBox); } /// /// 设置某类型的工装到选中位置 /// private void LoadBox() { if (SelectedBoxIndex < 0 || SelectedBoxIndex > 8) { MessageBox.Show("请先选择一个缓存工装位置(1-8)!"); return; } switch (SelectedBoxType) { case BoxTypeEnum._40mL原液工装: SourceLiquidBottleBoxModel newBox = new SourceLiquidBottleBoxModel { FixtureType = SelectedBoxType, BoxSNCode = string.Empty, SourceLiquidBottleCollection = liquidlist, IsDoseFinish = false, IsEmpty = false, IsUseFinsh = false, BoxArea = BoxAreaEnum._托盘存放平台, BoxId_inDosingStation = selectedBoxIndex }; // 更新选中位置的工装 ProjectPro.FixtureCacheArea[SelectedBoxIndex - 1] = File_Operator.DeepCopy(newBox); break; case BoxTypeEnum._12mL样品工装: for (int i = 0; i < samplelist.Count; i++) { samplelist[i].SampleBottleType = SampleBottleTypeEnum._12mL; } SampleBottleBoxModel newBox1 = new SampleBottleBoxModel { FixtureType = SelectedBoxType, BoxSNCode = string.Empty, SampleBottleList = samplelist, IsDoseFinish = false, SampleBottleType = SampleBottleTypeEnum._12mL, IsEmpty = false, IsUseFinsh = false, BoxId_inDosingStation = selectedBoxIndex, BoxArea = BoxAreaEnum._托盘存放平台 }; // 更新选中位置的工装 ProjectPro.FixtureCacheArea[SelectedBoxIndex - 1] = File_Operator.DeepCopy(newBox1); //var a = File_Operator.DeepCopyEx(newBox1); break; case BoxTypeEnum._5mL样品工装: for (int i = 0; i < samplelist.Count; i++) { samplelist[i].SampleBottleType = SampleBottleTypeEnum._5mL; } SampleBottleBoxModel newBox2 = new SampleBottleBoxModel { FixtureType = SelectedBoxType, BoxSNCode = string.Empty, SampleBottleList = samplelist, IsDoseFinish = false, IsEmpty = false, IsUseFinsh = false, SampleBottleType = SampleBottleTypeEnum._5mL, BoxId_inDosingStation = selectedBoxIndex, BoxArea = BoxAreaEnum._托盘存放平台 }; // 更新选中位置的工装 ProjectPro.FixtureCacheArea[SelectedBoxIndex - 1] = File_Operator.DeepCopy(newBox2); break; case BoxTypeEnum._16mL粉末瓶工装: break; case BoxTypeEnum._125mL粉末瓶工装: break; } OnPropertyChanged(nameof(ProjectPro)); } ///// ///// 移除选中位置的工装 ///// //private void RemoveSelectedBox() //{ // if (SelectedBoxIndex >= 0 && SelectedBoxIndex < 8) // { // ProjectPro.FixtureCacheArea[SelectedBoxIndex] = null; // } //} /// /// 按照瓶1配置信息更新样品工装 /// /// private void UpdateSampleBoxProperty(int sampleboxIdParam) { int index = 0; index = sampleboxIdParam; BaseBottleBox box = workService.ProjectPro.FixtureCacheArea.FirstOrDefault(f => f.BoxId_inDosingStation == index); if (!(box is SampleBottleBoxModel)) return; SampleBottleBoxModel sampleBottlebox = box as SampleBottleBoxModel; if (sampleBottlebox != null) { for (int i = 0; i < sampleBottlebox.SampleBottleList.Count; i++) { SampleBottleModel sampleBottle = File_Operator.DeepCopy(sampleBottlebox.SampleBottleList[0]); SampleBottleModel needtochangemodel = sampleBottlebox.SampleBottleList.FirstOrDefault(f => f.PosId_InBox == (i + 1)); needtochangemodel.SampleBottleType = sampleBottle.SampleBottleType; needtochangemodel.MaterialDoseFlowList = sampleBottle.MaterialDoseFlowList; needtochangemodel.HaveBottle = sampleBottle.HaveBottle; //needtochangemodel.SampleFunctionFlowList = sampleBottle.SampleFunctionFlowList; //needtochangemodel.AddLiquidFunctionFlowList = sampleBottle.AddLiquidFunctionFlowList; } } OnPropertyChanged(nameof(ProjectPro)); } /// /// 清空样品工装配置 /// /// private void ClearSampleBoxProperty(int sampleboxIdParam) { int index = 0; index = sampleboxIdParam; BaseBottleBox box = workService.ProjectPro.FixtureCacheArea.FirstOrDefault(f => f.BoxId_inDosingStation == index); if (!(box is SampleBottleBoxModel)) return; SampleBottleBoxModel sampleBottlebox = box as SampleBottleBoxModel; if (sampleBottlebox != null) { for (int i = 0; i < sampleBottlebox.SampleBottleList.Count; i++) { SampleBottleModel bottle = sampleBottlebox.SampleBottleList.FirstOrDefault(f => f.PosId_InBox == i + 1); if (bottle != null) { bottle.MaterialDoseFlowList.Clear(); bottle.SampleFunctionFlowList.Clear(); bottle.AddLiquidFunctionFlowList.Clear(); } } } OnPropertyChanged(nameof(ProjectPro)); } private async void ResetSampleBottles(int pos) { workService.ProjectPro.FixtureCacheArea[pos - 1] = new BaseBottleBox() { BoxArea = BoxAreaEnum._自动加样模块内, BoxId_inDosingStation = pos, IsEmpty = true }; } /// /// 装置为满 /// /// private void FillSampleBottles(int sampleboxIdParam) { int index = 0; index = sampleboxIdParam; BaseBottleBox box = workService.ProjectPro.FixtureCacheArea.FirstOrDefault(f => f.BoxId_inDosingStation == index); if (!(box is SampleBottleBoxModel)) return; SampleBottleBoxModel sampleBottlebox = box as SampleBottleBoxModel; if (sampleBottlebox != null) { for (int i = 0; i < sampleBottlebox.SampleBottleList.Count; i++) { SampleBottleModel model = sampleBottlebox.SampleBottleList.FirstOrDefault(f => f.PosId_InBox == i + 1); model.HaveBottle = true; } } OnPropertyChanged(nameof(ProjectPro)); } /// /// 将样品工装置为空 /// /// private void ClearSampleBottles(int sampleboxIdParam) { int index = 0; index = sampleboxIdParam; BaseBottleBox box = workService.ProjectPro.FixtureCacheArea.FirstOrDefault(f => f.BoxId_inDosingStation == index); if (!(box is SampleBottleBoxModel)) return; SampleBottleBoxModel sampleBottlebox = box as SampleBottleBoxModel; if (sampleBottlebox != null) { for (int i = 0; i < sampleBottlebox.SampleBottleList.Count; i++) { SampleBottleModel model = sampleBottlebox.SampleBottleList.FirstOrDefault(f => f.PosId_InBox == i + 1); model.HaveBottle = false; } } OnPropertyChanged(nameof(ProjectPro)); } private async void ResetAllTipHead(int id) { int index = 0; index = id; TipBoxModel tipBox = workService.ProjectPro.TipHeadArea.FirstOrDefault(c => c.BoxId_inDosingStation == index); if (tipBox != null) { foreach (var tip in tipBox.TipItems) { tip.IsAvailable = false; } tipBox.HaveBox = false; tipBox.IsEmpty = true; //await workService.stationService_Dose.UpdateTipBox(tipBox); } } private async void FillAllTipHead(int id) { int index = 0; index = id; TipBoxModel tipBox = workService.ProjectPro.TipHeadArea.FirstOrDefault(c => c.BoxId_inDosingStation == index); tipBox.BoxArea = BoxAreaEnum._Tip托盘存放平台; if (tipBox != null) { foreach (var tip in tipBox.TipItems) { tip.IsAvailable = true; } tipBox.HaveBox = true; tipBox.IsEmpty = false; //await workService.stationService_Dose.UpdateTipBox(tipBox); } } private void InitialProject() { string projectAddress = IniHelper.IniRead(Application.StartupPath + "\\projectOpen.ini", "OpenProject", "LastOpenProject", ""); if (!string.IsNullOrWhiteSpace(projectAddress) && File.Exists(projectAddress)) { bool readOk = false; workService.ProjectPro = File_Operator.Xml_Serialize(projectAddress, false, workService.ProjectPro, out readOk); if (readOk) { workService.ProjectPro.LastOpenProject = projectAddress; workService.ProjectPro.NowOpenProjectFile = projectAddress.Substring(projectAddress.LastIndexOf("\\") + 1).Trim(); } else { //InitialProjectProperty(); } } else { //InitialProjectProperty(); } OnPropertyChanged(nameof(ProjectPro)); } private void InitialProjectProperty() { //加载传送平台 7个工装 workService.ProjectPro.TransferArea.Clear(); for (int i = 0; i < 7; i++) { workService.ProjectPro.TransferArea.Add(new BaseBottleBox() { //FixtureType = BoxTypeEnum._40mL原液工装, BoxId_inDoseDnload = i + 1, BoxId_inDoseUpload = i + 1, IsEmpty = true, IsDoseFinish = false, IsUseFinsh = false, BoxArea = BoxAreaEnum._手套箱传送平台, }); } workService.ProjectPro.FixtureCacheArea.Clear(); //加载工装暂存区域 8个工装 暂定6个区域可用 for (int i = 0; i < 8; i++) { workService.ProjectPro.FixtureCacheArea.Add(new BaseBottleBox() { BoxId_inDosingStation = i + 1, BoxArea = BoxAreaEnum._托盘存放平台, IsEmpty = true, IsDoseFinish = false, IsUseFinsh = false, }); } // 初始化10个粉末瓶 暂存位置 workService.ProjectPro.PowderHeaderCacheArea.Clear(); for (int i = 0; i < 10; i++) { workService.ProjectPro.PowderHeaderCacheArea.Add(new SourcePowderBottleModel { HaveBottle = false, Pos_InDosePowderHC = i + 1, SNCode = string.Empty, PowderBottleType = PowderBottleTypeEnum._125mL, SourcePowderBottleState = SourceBottleStateEnum.Idl, OriginWeight = 0, }); } // 3个tip头工装 workService.ProjectPro.TipHeadArea.Clear(); for (int i = 0; i < 3; i++) { TipBoxModel tipBox = new TipBoxModel() { TipType = i switch { 0 => TipTypeEnum._1000UL, 1 => TipTypeEnum._300UL, 2 => TipTypeEnum._50UL, _ => TipTypeEnum._300UL }, HaveBox = false, UseIndex = 0, BoxId_inDosingStation = i + 1, IsEmpty = true, // 初始无工装(可根据需求调整) }; // 添加96个可用Tip头(避免序列化空引用) for (int j = 0; j < 8 * 12; j++) { tipBox.TipItems.Add(new TipHeadItem { IsAvailable = true, UseIndex = j + 1 }); } workService.ProjectPro.TipHeadArea.Add(tipBox); } OnPropertyChanged(nameof(ProjectPro)); } /// /// 新建项目文件 /// private void NewProject() { workService.ProjectPro.LastOpenProject = string.Empty; workService.ProjectPro.NowOpenProjectFile = string.Empty; InitialProjectProperty(); } /// /// 打开项目文件 /// private void OpenProject() { OpenFileDialog dlgopen = new OpenFileDialog(); dlgopen.Filter = "pro文件(*.pro)|*.pro"; if (!Directory.Exists(Application.StartupPath + @"\Projects")) Directory.CreateDirectory(Application.StartupPath + @"\Projects"); dlgopen.InitialDirectory = Application.StartupPath + @"\Projects"; if (dlgopen.ShowDialog() == DialogResult.OK) { ProjectProperty project = new ProjectProperty(); bool readOk = false; project = File_Operator.Xml_Serialize(dlgopen.FileName, false, project, out readOk); if (readOk) { workService.ProjectPro = project; workService.ProjectPro.LastOpenProject = dlgopen.FileName; IniHelper.IniWrite(Application.StartupPath + "\\projectOpen.ini", "OpenProject", "LastOpenProject", dlgopen.FileName); workService.ProjectPro.NowOpenProjectFile = dlgopen.FileName.Substring(dlgopen.FileName.LastIndexOf("\\") + 1).Trim(); OnPropertyChanged(nameof(ProjectPro)); WeakReferenceMessenger.Default.Send(new DesktopAlertMessage { Content = "打开项目文件成功!" }); } } } /// /// 项目文件另存为 /// private void SaveAsProject() { try { SaveFileDialog dlg = new SaveFileDialog(); dlg.Filter = "pro文件(*.pro)|*.pro"; if (!Directory.Exists(Application.StartupPath + @"\Projects")) Directory.CreateDirectory(Application.StartupPath + @"\Projects"); dlg.InitialDirectory = Application.StartupPath + @"\Projects"; if (dlg.ShowDialog() == DialogResult.OK) { workService.ProjectPro.LastOpenProject = dlg.FileName; IniHelper.IniWrite(Application.StartupPath + "\\projectOpen.ini", "OpenProject", "LastOpenProject", dlg.FileName); workService.ProjectPro.NowOpenProjectFile = dlg.FileName.Substring(dlg.FileName.LastIndexOf("\\") + 1).Trim(); bool bReadOk = false; File_Operator.Xml_Serialize(workService.ProjectPro.LastOpenProject, true, workService.ProjectPro, out bReadOk); Application.DoEvents(); WeakReferenceMessenger.Default.Send(new DesktopAlertMessage { Content = "另存成功!" }); } else { return; } } catch (Exception) { throw; } } /// /// 保存项目文件 /// private void SaveProject() { try { if (string.IsNullOrEmpty(workService.ProjectPro.LastOpenProject) || !File.Exists(workService.ProjectPro.LastOpenProject)) { SaveFileDialog dlg = new SaveFileDialog(); dlg.Filter = "pro文件(*.pro)|*.pro"; if (!Directory.Exists(Application.StartupPath + @"\Projects")) Directory.CreateDirectory(Application.StartupPath + @"\Projects"); dlg.InitialDirectory = Application.StartupPath + @"\Projects"; if (dlg.ShowDialog() == DialogResult.OK) { workService.ProjectPro.LastOpenProject = dlg.FileName; IniHelper.IniWrite(Application.StartupPath + "\\projectOpen.ini", "OpenProject", "LastOpenProject", dlg.FileName); workService.ProjectPro.NowOpenProjectFile = dlg.FileName.Substring(dlg.FileName.LastIndexOf("\\") + 1).Trim(); } else { return; } } bool bReadOk = false; File_Operator.Xml_Serialize(workService.ProjectPro.LastOpenProject, true, workService.ProjectPro, out bReadOk); Application.DoEvents(); WeakReferenceMessenger.Default.Send(new DesktopAlertMessage { Content = "保存成功!" }); } catch (Exception) { throw; } } private void ImportExcel() { try { OpenFileDialog openFileDialog = new OpenFileDialog(); openFileDialog.Title = "选择要导入的Excel文件"; openFileDialog.Filter = "Excel文件(*.xlsx;*.xls)|*.xlsx;*.xls"; openFileDialog.Multiselect = false; // 只允许选择一个文件 if (openFileDialog.ShowDialog() == DialogResult.OK) { IWorkbook workbook; using (FileStream fileStream = new FileStream(openFileDialog.FileName, FileMode.Open, FileAccess.Read)) { // 根据Excel文件的格式(.xlsx或.xls)选择不同的加载方式 if (openFileDialog.FileName.EndsWith(".xlsx")) { workbook = new XSSFWorkbook(fileStream); } else { workbook = new HSSFWorkbook(fileStream); } //解析excel文档 } OnPropertyChanged(nameof(ProjectPro)); WeakReferenceMessenger.Default.Send(new DesktopAlertMessage { Content = "导入配方Excel文件成功!" }); } } catch (Exception) { throw; } } private void ExportExcel() { } } }