| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756 | using Aitex.Core.Common;using Aitex.Core.UI.MVVM;using MECF.Framework.Common.DataCenter;using MECF.Framework.Common.Equipment;using MECF.Framework.Common.OperationCenter;using MECF.Framework.Common.SubstrateTrackings;using MECF.Framework.Common.Utilities;using Prism.Mvvm;using System;using System.Collections.Generic;using System.Collections.ObjectModel;using System.Linq;using System.Net.NetworkInformation;using System.Windows;using System.Windows.Input;using System.Windows.Threading;namespace PunkHPX8_MainPages.ViewModels{    public class MaterialMovementViewModel : BindableBase    {        #region 常量        private const int DATAGRIP_ROW_NUM = 24;                #endregion        #region 内部变量        #region system        /// <summary>        /// rt查询key        /// </summary>        private List<string> _rtDataKeys = new List<string>();        /// <summary>        /// 时钟        /// </summary>        DispatcherTimer _timer;        /// <summary>        /// rt查询数据        /// </summary>        private Dictionary<string, object> _rtDataValueDic = new Dictionary<string, object>();        /// <summary>        /// LayoutCell列表        /// </summary>        private ObservableCollection<string> _locationLst;        #endregion        #region Common        /// <summary>        /// Module        /// </summary>        private string _module;        /// <summary>        /// MaterialData Collection        /// </summary>        private List<ModuleMaterial> _materialDatas;        /// <summary>        /// MaterialData Sub Collection1        /// </summary>        private ObservableCollection<ModuleMaterial> _materialSubdatas1;        /// <summary>        /// MaterialData Sub Collection2        /// </summary>        private ObservableCollection<ModuleMaterial> _materialSubdatas2;        /// <summary>        /// MaterialData Sub Collection Buffer1        /// </summary>        private List<ModuleMaterial> _materialSubdatasBuffer1;        /// <summary>        /// MaterialData Sub Collection Buffer2        /// </summary>        private List<ModuleMaterial> _materialSubdatasBuffer2;        /// <summary>        /// Pre MaterialDatas1        /// </summary>        private List<ModuleMaterial> _preMaterialDatas1 = new List<ModuleMaterial>();        /// <summary>        /// Pre MaterialDatas2        /// </summary>        private List<ModuleMaterial> _preMaterialDatas2 = new List<ModuleMaterial>();        /// <summary>;        /// <summary>        /// From Loaction选择        /// </summary>        private string _fromLocation;        /// <summary>        /// To Location选择        /// </summary>        private string _toLocation;        /// <summary>        /// ProcessTransporter是否Busy        /// </summary>        private bool _isProcessTransBusy;        /// <summary>        /// LoaderTransporter是否Busy        /// </summary>        private bool _isLoaderTransBusy;        /// <summary>        /// 是否在Auto模式下        /// </summary>        private bool _isAutoMode;        /// <summary>        /// UpdateLocation按钮是否启用        /// </summary>        private bool _isMoveEnable;        /// <summary>        /// Remove按钮是否启用        /// </summary>        private bool _isRemoveEnable;        /// <summary>        /// Selected MaterialData        /// </summary>        private ModuleMaterial _selectedMaterialData;        /// <summary>        /// Pre Selected MaterialData        /// </summary>        private ModuleMaterial _preSelectedMaterialData;        /// <summary>        /// Selected MaterialData1        /// </summary>        private ModuleMaterial _selectedMaterialData1;        /// <summary>        /// Selected MaterialData2        /// </summary>        private ModuleMaterial _selectedMaterialData2;        /// <summary>        /// Selected ModuleName        /// </summary>        private string _selectedModuleName;        /// <summary>        /// WaferMove FromSlot列表        /// </summary>        private ObservableCollection<int> _fromSlotLst = new ObservableCollection<int>();        /// <summary>        /// WaferMove ToSlot列表        /// </summary>        private ObservableCollection<int> _toSlotLst = new ObservableCollection<int>();        /// <summary>        /// WaferMove Modules列表        /// </summary>        private ObservableCollection<ModuleName> _moduleLst = new ObservableCollection<ModuleName>();        /// <summary>        /// WaferMove From Module        /// </summary>        private ModuleName _fromModule;        /// <summary>        /// WaferMove To Module        /// </summary>        private ModuleName _toModule;        /// <summary>        /// WaferMove To Slot        /// </summary>        private int _toSlot;        /// <summary>        /// WaferMove From Slot        /// </summary>        private int _fromSlot;        /// <summary>        /// WaferMove Update按钮是否启用        /// </summary>        private bool _isWaferMoveEnable;        /// <summary>        /// MaterialDataBuffer        /// </summary>        private ModuleMaterial _materialDataBuffer;        /// <summary>        /// Grid Selection        /// </summary>        private bool _gridSelection;        #endregion        #endregion        #region 属性        #region Common        /// <summary>        /// MaterialData Collection        /// </summary>        public List<ModuleMaterial> MaterialDatas        {            get { return _materialDatas; }            set            {                SetProperty(ref _materialDatas, value);            }        }        /// <summary>        /// MaterialData Sub Collection1        /// </summary>        public ObservableCollection<ModuleMaterial> MaterialSubdatas1        {            get { return _materialSubdatas1; }            set            {                SetProperty(ref _materialSubdatas1, value);            }        }        /// <summary>        /// MaterialData Sub Collection2        /// </summary>        public ObservableCollection<ModuleMaterial> MaterialSubdatas2        {            get { return _materialSubdatas2; }            set            {                SetProperty(ref _materialSubdatas2, value);            }        }        /// <summary>        /// Selected MaterialData        /// </summary>        public ModuleMaterial SelectedMaterialData        {            get { return _selectedMaterialData; }            set            {                SetProperty(ref _selectedMaterialData, value);            }        }        /// <summary>        /// Selected MaterialData1        /// </summary>        public ModuleMaterial SelectedMaterialData1        {            get { return _selectedMaterialData1; }            set            {                SetProperty(ref _selectedMaterialData1, value);            }        }        /// <summary>        /// Selected MaterialData2        /// </summary>        public ModuleMaterial SelectedMaterialData2        {            get { return _selectedMaterialData2; }            set            {                SetProperty(ref _selectedMaterialData2, value);            }        }        /// <summary>        /// Selected ModuleName        /// </summary>        public string SelectedModuleName        {            get { return _selectedModuleName; ; }            set            {                SetProperty(ref _selectedModuleName, value);            }        }        /// <summary>        /// LayoutCell列表        /// </summary>        public ObservableCollection<string> LocationLst        {            get { return _locationLst; }            set { SetProperty(ref _locationLst, value); }        }        /// <summary>        /// From Location        /// </summary>        public string FromLocation        {            get { return _fromLocation; }            set { SetProperty(ref _fromLocation, value); }        }        /// <summary>        /// To Location        /// </summary>        public string ToLocation        {            get { return _toLocation; }            set { SetProperty(ref _toLocation, value); }        }        /// <summary>        /// UpdateLocation按钮是否启用        /// </summary>        public bool IsMoveEnable        {            get { return _isMoveEnable; }            set { SetProperty(ref _isMoveEnable, value); }        }        /// <summary>        /// Remove按钮是否启用        /// </summary>        public bool IsRemoveEnable        {            get { return _isRemoveEnable; }            set { SetProperty(ref _isRemoveEnable, value); }        }        /// <summary>        /// WaferMove FromSlot列表        /// </summary>        public ObservableCollection<int> FromSlotLst        {            get { return _fromSlotLst; }            set { SetProperty(ref _fromSlotLst, value); }        }        /// <summary>        /// WaferMove ToSlot列表        /// </summary>        public ObservableCollection<int> ToSlotLst        {            get { return _toSlotLst; }            set { SetProperty(ref _toSlotLst, value); }        }        /// <summary>        /// WaferMove Modules列表        /// </summary>        public ObservableCollection<ModuleName> ModuleLst        {            get { return _moduleLst; }            set { SetProperty(ref _moduleLst, value); }        }        /// <summary>        /// WaferMove From Module        /// </summary>        public ModuleName FromModule        {            get { return _fromModule; }            set { SetProperty(ref _fromModule, value); }        }        /// <summary>        /// WaferMove To Module        /// </summary>        public ModuleName ToModule        {            get { return _toModule; }            set { SetProperty(ref _toModule, value); }        }        /// <summary>        /// WaferMove To Slot        /// </summary>        public int ToSlot        {            get { return _toSlot; }            set { SetProperty(ref _toSlot, value); }        }        /// <summary>        /// WaferMove To Slot        /// </summary>        public int FromSlot        {            get { return _fromSlot; }            set { SetProperty(ref _fromSlot, value); }        }        /// <summary>        /// WaferMove按钮是否启用        /// </summary>        public bool IsWaferMoveEnable        {            get { return _isWaferMoveEnable; }            set { SetProperty(ref _isWaferMoveEnable, value); }        }        #endregion        #endregion        #region 命令        public ICommand UpdateLocationCommand { get; private set; }        public ICommand UpdateWaferCommand { get; private set; }        public ICommand RemoveCommand { get; private set; }        public ICommand ModuleChangeCommand { get; private set; }        public ICommand SelectionChangeCommand { get; private set; }        public ICommand ResetWafersCommand { get; private set; }        #endregion        /// <summary>        /// 构造函数        /// </summary>        public MaterialMovementViewModel()        {            _materialDatas = new List<ModuleMaterial>();            _materialSubdatas1 = new ObservableCollection<ModuleMaterial>();            _materialSubdatas2 = new ObservableCollection<ModuleMaterial>();            _materialSubdatasBuffer1 = new List<ModuleMaterial>();            _materialSubdatasBuffer2 = new List<ModuleMaterial>();            UpdateLocationCommand = new DelegateCommand<object>(UpdateLocationAction);            UpdateWaferCommand = new DelegateCommand<object>(UpdateWaferAction);            RemoveCommand = new DelegateCommand<object>(RemoveAction);            ModuleChangeCommand = new DelegateCommand<object>(ModuleChangeAction);            SelectionChangeCommand = new DelegateCommand<object>(SelectionChangeAction);            ResetWafersCommand = new DelegateCommand<object>(ResetWafersAction);            ModuleLst.Clear();            ModuleLst.Add(ModuleName.EfemRobot);            ModuleLst.Add(ModuleName.LP1);            ModuleLst.Add(ModuleName.LP2);            ModuleLst.Add(ModuleName.LP3);            ModuleLst.Add(ModuleName.Aligner1);            ModuleLst.Add(ModuleName.PUF1);            ModuleLst.Add(ModuleName.PUF2);            ModuleLst.Add(ModuleName.Dummy1);            ModuleLst.Add(ModuleName.Dummy2);            ModuleLst.Add(ModuleName.Loader1);            ModuleChangeAction("From");            ModuleChangeAction("To");            IsMoveEnable = false;            IsRemoveEnable = false;            IsWaferMoveEnable = false;        }        /// <summary>        /// 加载数据        /// </summary>        /// <param name="systemName"></param>        public void LoadData(string systemName)        {            _module = systemName;            _rtDataKeys.Clear();            _rtDataKeys.Add("System.LayoutCellItems");            _rtDataKeys.Add("System.ModuleMaterials");            _rtDataKeys.Add($"Transporter1.IsBusy");            _rtDataKeys.Add($"Transporter2.IsBusy");            _rtDataKeys.Add("System.IsAutoMode");            if (_rtDataKeys.Count != 0)            {                _rtDataValueDic = QueryDataClient.Instance.Service.PollData(_rtDataKeys);                if (_rtDataValueDic != null)                {                    LocationLst = new ObservableCollection<string>(CommonFunction.GetValue<List<string>>(_rtDataValueDic, "System.LayoutCellItems"));                    LocationLst.Add("Loader");                    LocationLst.Add(ModuleName.Transporter1.ToString());                    LocationLst.Add(ModuleName.Transporter2.ToString());                }            }            if (_timer == null)            {                _timer = new DispatcherTimer();                _timer.Interval = TimeSpan.FromMilliseconds(200);                _timer.Tick += Timer_Tick;            }            _timer.Start();                    }        /// <summary>        /// 时钟        /// </summary>        /// <param name="sender"></param>        /// <param name="e"></param>        private void Timer_Tick(object sender, EventArgs e)        {            IsMoveEnable = (FromLocation != null && ToLocation != null) ? true : false;            IsRemoveEnable = string.IsNullOrEmpty(SelectedModuleName) ? false : true;            IsWaferMoveEnable = (FromModule != ModuleName.System && ToModule != ModuleName.System && FromSlot != 0 && ToSlot != 0) ? true : false;            if (_rtDataKeys.Count != 0)            {                _rtDataValueDic = QueryDataClient.Instance.Service.PollData(_rtDataKeys);                if (_rtDataValueDic != null)                {                    _isProcessTransBusy = CommonFunction.GetValue<bool>(_rtDataValueDic, $"Transporter1.IsBusy");                    _isLoaderTransBusy = CommonFunction.GetValue<bool>(_rtDataValueDic, $"Transporter2.IsBusy");                    _isAutoMode = CommonFunction.GetValue<bool>(_rtDataValueDic, $"System.IsAutoMode");                    MaterialDatas = CommonFunction.GetValue<List<ModuleMaterial>>(_rtDataValueDic, "System.ModuleMaterials");                    int i = 0;                    _materialSubdatasBuffer1.Clear();                    _materialSubdatasBuffer2.Clear();                    for (i = 0; i < DATAGRIP_ROW_NUM; i++)                    {                        _materialSubdatasBuffer1.Add(MaterialDatas[i]);                    }                    for (; i < MaterialDatas.Count(); i++)                    {                        _materialSubdatasBuffer2.Add(MaterialDatas[i]);                    }                             //若数据变化则刷新数据                    if ((_preMaterialDatas1.Count == 0) || (_preMaterialDatas1.Count != 0 && !CompareList(_preMaterialDatas1, _materialSubdatasBuffer1)))                    {                        MaterialSubdatas1 = new ObservableCollection<ModuleMaterial>(_materialSubdatasBuffer1);                        _preMaterialDatas1 = new List<ModuleMaterial>(_materialSubdatasBuffer1);                                                                }                                       if ((_preMaterialDatas2.Count == 0) || (_preMaterialDatas2.Count != 0 && !CompareList(_preMaterialDatas2, _materialSubdatasBuffer2)))                    {                        MaterialSubdatas2 = new ObservableCollection<ModuleMaterial>(_materialSubdatasBuffer2);                        _preMaterialDatas2 = new List<ModuleMaterial>(_materialSubdatasBuffer2);                                           }                    //记忆SelectedItem                       if (SelectedMaterialData != null)                    {                        if (_gridSelection)                        {                            SelectedMaterialData1 = MaterialSubdatas1.ToList().Find(t => t.ModuleName == SelectedMaterialData.ModuleName);                            SelectedMaterialData2 = null;                                                    }                        else                        {                            SelectedMaterialData2 = MaterialSubdatas2.ToList().Find(t => t.ModuleName == SelectedMaterialData.ModuleName);                            SelectedMaterialData1 = null;                                                                                                           }                    }                }            }        }        /// <summary>        /// 隐藏        /// </summary>        public void Hide()        {            if (_timer != null)            {                _timer.Stop();            }        }        /// <summary>        /// 判断转移wafershuttle信息时fromLoaction的模块是否处于error        /// </summary>        /// <param name="fromLocation"></param>        /// <returns></returns>        private bool IsTransferFromLoactionModuleError(string fromLocation)        {            if (fromLocation.StartsWith("Buffer"))            {                return false;            }            if (fromLocation == "Loader")            {                fromLocation = "Loader1";            }            List<string> DataKeys = new List<string>();            DataKeys.Add($"{fromLocation}.IsError");            Dictionary<string, object> tmpData = QueryDataClient.Instance.Service.PollData(DataKeys);            if (tmpData != null)            {                bool isModuleError = CommonFunction.GetValue<bool>(tmpData, $"{fromLocation}.IsError");                if (isModuleError)                {                    return true;                }            }            return false;        }        #region 命令方法        private void UpdateLocationAction(object param)        {            if (!string.IsNullOrEmpty(FromLocation) && !string.IsNullOrEmpty(ToLocation))            {                if (!_isLoaderTransBusy && !_isProcessTransBusy)                {                    if (!_isAutoMode) //不是自动模式可以直接转移wafershuttle信息                    {                        InvokeClient.Instance.Service.DoOperation($"WaferHolder.TransferWaferHolder", $"{FromLocation}", $"{ToLocation}");                    }                    if(_isAutoMode)                     {                        if (IsTransferFromLoactionModuleError(FromLocation)) //自动模式并且源模块为error状态也能转移                        {                            InvokeClient.Instance.Service.DoOperation($"WaferHolder.TransferWaferHolder", $"{FromLocation}", $"{ToLocation}");                        }                        else                         {                            MessageBox.Show("Auto mode can't do this operation when fromLoaction Moudule not in error", "Update", MessageBoxButton.OK, MessageBoxImage.Error);                        }                    }                     }                else                {                    MessageBox.Show("Loader or Process Transporter is in Busy state", "Update", MessageBoxButton.OK, MessageBoxImage.Error);                }            }        }        /// <summary>        /// 删除信息        /// </summary>        /// <param name="param"></param>        private void RemoveAction(object param)        {            if (SelectedMaterialData == null)            {                MessageBox.Show("please select one data", "Delete", MessageBoxButton.OK, MessageBoxImage.Error);                return;            }            if (string.IsNullOrEmpty(SelectedMaterialData.WaferHolderId) && SelectedMaterialData.SideAWaferStatus == 0 && SelectedMaterialData.SideBWaferStatus == 0)            {                MessageBox.Show("The data is Empt", "Delete", MessageBoxButton.OK, MessageBoxImage.Error);                return;            }            if (MessageBox.Show("do you want to delete selected data", "Delete", MessageBoxButton.YesNo, MessageBoxImage.Question) == MessageBoxResult.Yes)            {                if ((LocationLst.Contains(SelectedMaterialData.ModuleName) || SelectedMaterialData.ModuleName.Contains("Transporter")                    || SelectedMaterialData.ModuleName.Contains("Loader")) && SelectedMaterialData.WaferHolderId != "")                {                }                else if (ModuleHelper.IsSRD(ModuleHelper.Converter(SelectedMaterialData.ModuleName)) || ModuleHelper.IsPUF(ModuleHelper.Converter(SelectedMaterialData.ModuleName)))                {                    if (SelectedMaterialData.SideAWaferId != "")                        InvokeClient.Instance.Service.DoOperation("WaferManager.DeleteWafer", SelectedMaterialData.SideAWaferId);                    if (SelectedMaterialData.SideBWaferId != "")                        InvokeClient.Instance.Service.DoOperation("WaferManager.DeleteWafer", SelectedMaterialData.SideBWaferId);                }                               else                {                    return;                }            }        }        /// <summary>        /// WaferMove 更新Slot列表        /// </summary>        /// <param name="obj"></param>        private void ModuleChangeAction(object obj)        {            var value = obj.ToString();            switch (value)            {                case "From":                    FromSlotLst.Clear();                    switch (FromModule)                    {                        case ModuleName.EfemRobot:                            FromSlotLst.Add(1);                            break;                        case ModuleName.LP1:                        case ModuleName.LP2:                        case ModuleName.LP3:                            for (int i = 1; i < 26; i++)                            {                                FromSlotLst.Add(i);                            }                            break;                        case ModuleName.Aligner1:                            FromSlotLst.Add(1);                            break;                        case ModuleName.PUF1:                        case ModuleName.PUF2:                            FromSlotLst.Add(1);                            FromSlotLst.Add(2);                            break;                        case ModuleName.Dummy1:                        case ModuleName.Dummy2:                            for (int i = 1; i < 17; i++)                            {                                FromSlotLst.Add(i);                            }                            break;                        case ModuleName.Loader1:                            FromSlotLst.Add(1);                            FromSlotLst.Add(2);                            break;                        default:                            break;                    }                    break;                case "To":                    ToSlotLst.Clear();                    switch (ToModule)                    {                        case ModuleName.EfemRobot:                            ToSlotLst.Add(1);                            break;                        case ModuleName.LP1:                        case ModuleName.LP2:                        case ModuleName.LP3:                            for (int i = 1; i < 26; i++)                            {                                ToSlotLst.Add(i);                            }                            break;                        case ModuleName.Aligner1:                            ToSlotLst.Add(1);                            break;                        case ModuleName.PUF1:                        case ModuleName.PUF2:                            ToSlotLst.Add(1);                            ToSlotLst.Add(2);                            break;                        case ModuleName.Dummy1:                        case ModuleName.Dummy2:                            for (int i = 1; i < 17; i++)                            {                                ToSlotLst.Add(i);                            }                            break;                        case ModuleName.Loader1:                            ToSlotLst.Add(1);                            ToSlotLst.Add(2);                            break;                        default:                            break;                    }                    break;                default:                    break;            }        }        /// <summary>        /// 更新Wafer位置        /// </summary>        /// <param name="param"></param>        private void UpdateWaferAction(object param)        {                    }        /// <summary>        /// Selection Change        /// </summary>        /// <param name="param"></param>        private void SelectionChangeAction(object param)        {            string dg = param.ToString();            if(dg == "DataGrid1")            {                               if (SelectedMaterialData1 != null)                {                    _gridSelection = true;                    SelectedModuleName = SelectedMaterialData1.ModuleName;                    SelectedMaterialData = SelectedMaterialData1;                }            }            else            {                               if (SelectedMaterialData2 != null)                {                    _gridSelection = false;                    SelectedModuleName = SelectedMaterialData2.ModuleName;                    SelectedMaterialData = SelectedMaterialData2;                }            }                    }        /// <summary>        /// 重置Wafers        /// </summary>        /// <param name="param"></param>        private void ResetWafersAction(object param)        {            InvokeClient.Instance.Service.DoOperation("WaferHolder.ResetLayoutWafers");        }        private bool CompareList(List<ModuleMaterial> list1, List<ModuleMaterial> list2)        {            for(int i = 0; i < list1.Count; i++)            {                if (list1[i].WaferHolderId != list2[i].WaferHolderId || list1[i].SideAWaferId != list2[i].SideAWaferId || list1[i].SideAWaferType != list2[i].SideAWaferType || list1[i].SideAWaferStatus != list2[i].SideAWaferStatus                || list1[i].SideBWaferId != list2[i].SideBWaferId || list1[i].SideBWaferType != list2[i].SideBWaferType || list1[i].SideBWaferStatus != list2[i].SideBWaferStatus || list1[i].ModuleName != list2[i].ModuleName)                {                    return false;                }            }            return true;        }                #endregion    }}
 |