| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488 | using Aitex.Core.UI.MVVM;using Aitex.Core.Util;using Aitex.Core.Utilities;using MECF.Framework.Common.DataCenter;using MECF.Framework.Common.Equipment;using MECF.Framework.Common.OperationCenter;using OpenSEMI.ClientBase;using System;using System.Collections.Concurrent;using System.Collections.Generic;using System.Linq;using System.Reflection;using System.Threading.Tasks;using System.Windows;using System.Windows.Input;using Aitex.Core.RT.Log;using MECF.Framework.UI.Client.ClientBase;using MessageBox = Xceed.Wpf.Toolkit.MessageBox;using SCValue = MECF.Framework.UI.Core.View.Common.SCValue;using MECF.Framework.UI.Core.View.Common;namespace MECF.Framework.UI.Client.CenterViews.Operations.FA{    public enum FACommunicationState    {        Disabled,        Enabled,        EnabledNotCommunicating,        EnabledCommunicating,        WaitCRA,        WaitDelay,        WaitCRFromHost,    }    public enum FAControlState    {        Unknown,        EquipmentOffline,        AttemptOnline,        HostOffline,        OnlineLocal,        OnlineRemote,    }    public enum FAControlSubState    {        Local,        Remote,    }    public enum FASpoolingState    {        Active = 1,        Inactive    }    public class FACommandName    {        public const string FAEnable = "FAEnable";        public const string FADisable = "FADisable";        public const string FAOnline = "FAOnline";        public const string FAOffline = "FAOffline";        public const string FALocal = "FALocal";        public const string FARemote = "FARemote";        public const string FAEnableSpooling = "FAEnableSpooling";        public const string FADisableSpooling = "FADisableSpooling";        public const string FASendTerminalMessage = "FASendTerminalMessage";    }    public class FAViewModel : UiViewModelBase    {        public bool IsPermission { get => this.Permission == 3; }        private class DataName        {            public const string CommunicationStatus = "CommunicationStatus";            public const string ControlStatus = "ControlStatus";            public const string ControlSubStatus = "ControlSubStatus";            public const string SpoolingState = "SpoolingState";            public const string SpoolingActual = "SpoolingActual";            public const string SpoolingTotal = "SpoolingTotal";            public const string SpoolingFullTime = "SpoolingFullTime";            public const string SpoolingStartTime = "SpoolingStartTime";            public const string IsSpoolingEnable = "IsSpoolingEnable";            //EFEM        }        public FAViewModel()        {            this.DisplayName = "FA";            ConfigFeedback = new PageSCFA();            ConfigSetPoint = new PageSCFA();            SetConfigCommand = new DelegateCommand<object>(SetConfig);            SetConfig2Command = new DelegateCommand<object>(SetConfig2);            InitializeCommand = new DelegateCommand<object>(InitializeFa);            InvokeCommand = new DelegateCommand<object>(Invoke);        }        protected override void OnInitialize()        {            base.OnInitialize();            _isSubscriptionAttribute = attribute => attribute is SubscriptionAttribute;            _hasSubscriptionAttribute = mi => mi.GetCustomAttributes(false).Any(_isSubscriptionAttribute);            Parallel.ForEach(this.GetType().GetProperties().Where(_hasSubscriptionAttribute),                property =>                {                    SubscriptionAttribute subscription = property.GetCustomAttributes(false).First(_isSubscriptionAttribute) as SubscriptionAttribute;                    string key = subscription.ModuleKey;                    if (!_subscribedKeys.Contains(key))                        _subscribedKeys.Add(key);                });            _timer = new PeriodicJob(1000, this.OnTimer, "UIUpdaterThread - " + GetType().Name, true);        }        #region subscrib        [Subscription(DataName.IsSpoolingEnable, ModuleNameString.System)]        public bool IsSpoolingEnable        {            get;            set;        }        [Subscription("System.SpoolingState")]        public string SpoolingState        {            get;            set;        }        [Subscription(DataName.SpoolingActual, ModuleNameString.System)]        public string SpoolingActual        {            get;            set;        }        [Subscription(DataName.SpoolingTotal, ModuleNameString.System)]        public string SpoolingTotal        {            get;            set;        }        [Subscription(DataName.SpoolingFullTime, ModuleNameString.System)]        public string SpoolingFullTime        {            get;            set;        }        [Subscription(DataName.SpoolingStartTime, ModuleNameString.System)]        public string SpoolingStartTime        {            get;            set;        }        [Subscription(DataName.ControlStatus, ModuleNameString.System)]        public string HostControlStatus        {            get;            set;        }        [Subscription(DataName.CommunicationStatus, ModuleNameString.System)]        public string HostCommunicationStatus        {            get;            set;        }        #endregion        #region  logic        public FACommunicationState FACommunicationState        {            get            {                return string.IsNullOrEmpty(HostCommunicationStatus) ? FACommunicationState.Disabled              : (FACommunicationState)Enum.Parse(typeof(FACommunicationState), HostCommunicationStatus);            }        }        public FAControlState FAControlState        {            get            {                return string.IsNullOrEmpty(HostControlStatus) ? FAControlState.Unknown              : (FAControlState)Enum.Parse(typeof(FAControlState), HostControlStatus);            }        }        //Disabled,        //Enabled,        //EnabledNotCommunicating,        //EnabledCommunicating,        //WaitCRA,        //WaitDelay,        //WaitCRFromHost,        public bool IsEnableEnableButton        {            get { return FACommunicationState == FACommunicationState.Disabled; }        }        public bool IsEnableDisableButton        {            get { return FACommunicationState != FACommunicationState.Disabled; }        }        //Unknown,        //EquipmentOffline,        //AttemptOnline,        //HostOffline,        //OnlineLocal,        //OnlineRemote,        public bool IsEnableOnlineButton        {            get { return FACommunicationState == FACommunicationState.EnabledCommunicating && (FAControlState == FAControlState.Unknown || FAControlState == FAControlState.EquipmentOffline); }        }        public bool IsEnableOfflineButton        {            get { return FACommunicationState == FACommunicationState.EnabledCommunicating && (FAControlState == FAControlState.Unknown || FAControlState != FAControlState.EquipmentOffline); }        }        public bool IsEnableLocalButton        {            get { return FACommunicationState == FACommunicationState.EnabledCommunicating && (FAControlState == FAControlState.OnlineRemote); }        }        public bool IsEnableRemoteButton        {            get { return FACommunicationState == FACommunicationState.EnabledCommunicating && (FAControlState == FAControlState.OnlineLocal); }        }        public bool IsEnableSpoolingEnableButton        {            get            {                return !IsSpoolingEnable;//SpoolingState == FASpoolingState.Inactive.ToString();            }        }        public bool IsEnableSpoolingDisableButton        {            get            {                return IsSpoolingEnable;// SpoolingState == FASpoolingState.Active.ToString();            }        }        #endregion        [IgnorePropertyChange]        public PageSCFA ConfigFeedback        {            get;            set;        }        [IgnorePropertyChange]        public PageSCFA ConfigSetPoint        {            get;            set;        }        [IgnorePropertyChange]        public ICommand SetConfigCommand        {            get;            private set;        }        [IgnorePropertyChange]        public ICommand SetConfig2Command        {            get;            private set;        }        [IgnorePropertyChange]        public ICommand InitializeCommand        {            get;            private set;        }        [IgnorePropertyChange]        public ICommand InvokeCommand        {            get;            private set;        }        PeriodicJob _timer;        //protected ConcurrentBag<string> _subscribedKeys = new ConcurrentBag<string>();        //protected Func<object, bool> _isSubscriptionAttribute;        //protected Func<MemberInfo, bool> _hasSubscriptionAttribute;        private void Invoke(object param)        {            InvokeClient.Instance.Service.DoOperation("FACommand", ((string)param).Split(',')[1]);        }        private void InitializeFa(object obj)        {            if (MessageBox.Show("Are you sure you want to re-initialize FA connection?",                    "Confirm", MessageBoxButton.YesNo, MessageBoxImage.Question) == MessageBoxResult.Yes)            {                InvokeClient.Instance.Service.DoOperation("Fa.Initialize");            }        }        void SetConfig(object param)        {            object[] sc = (object[])param;            InvokeClient.Instance.Service.DoOperation("System.SetConfig", sc[0].ToString(), sc[1].ToString());            UpdateConfig();        }        void SetConfig2(object param)        {            string id = (string)param;            string key = id.Replace("Fa.", "Fa_");            PropertyInfo[] property = typeof(PageSCFA).GetProperties();            foreach (PropertyInfo prop in property)            {                if (prop.Name == key)                {                    InvokeClient.Instance.Service.DoOperation("System.SetConfig", id, prop.GetValue(ConfigSetPoint, null).ToString());                    break;                }            }            UpdateConfig();        }        public void UpdateConfig()        {            ConfigFeedback.Update(QueryDataClient.Instance.Service.PollConfig(ConfigFeedback.GetKeys()));            NotifyOfPropertyChange("ConfigFeedback");            ConfigSetPoint.Update(QueryDataClient.Instance.Service.PollConfig(ConfigSetPoint.GetKeys()));        }        bool OnTimer()        {            try            {                Poll();                UpdateConfig();            }            catch (Exception ex)            {                LOG.Error(ex.Message);            }            return true;        }        void Poll()        {            if (_subscribedKeys.Count > 0)            {                Dictionary<string, object> result = QueryDataClient.Instance.Service.PollData(_subscribedKeys);                if (result == null)                {                    LOG.Error("获取RT数据失败");                    return;                }                if (result.Count != _subscribedKeys.Count)                {                    string unknowKeys = string.Empty;                    foreach (string key in _subscribedKeys)                    {                        if (!result.ContainsKey(key))                        {                            unknowKeys += key + "\r\n";                        }                    }                    //System.Diagnostics.Debug.Assert(false, unknowKeys);                }                UpdateValue(result);            }        }        void UpdateValue(Dictionary<string, object> data)        {            if (data == null)                return;            UpdateSubscribe(data, this);        }        void UpdateSubscribe(Dictionary<string, object> data, object target, string module = null)        {            Parallel.ForEach(target.GetType().GetProperties().Where(_hasSubscriptionAttribute),                property =>                {                    PropertyInfo pi = (PropertyInfo)property;                    SubscriptionAttribute subscription = property.GetCustomAttributes(false).First(_isSubscriptionAttribute) as SubscriptionAttribute;                    string key = subscription.ModuleKey;                    key = module == null ? key : string.Format("{0}.{1}", module, key);                    if (_subscribedKeys.Contains(key) && data.ContainsKey(key))                    {                        try                        {                            var convertedValue = Convert.ChangeType(data[key], pi.PropertyType);                            var originValue = Convert.ChangeType(pi.GetValue(target, null), pi.PropertyType);                            if (originValue != convertedValue)                            {                                pi.SetValue(target, convertedValue, null);                                NotifyOfPropertyChange(pi.Name);                            }                        }                        catch (Exception ex)                        {                            LOG.Error("由RT返回的数据更新失败" + key, ex);                        }                    }                });        }        //protected override void InvokeBeforeUpdateProperty(Dictionary<string, object> data)        //{        //}    }    public class PageSCFA : PageSCValue    {        public string Fa_ConnectionMode { get; set; }        public string Fa_LocalIpAddress { get; set; }        public int Fa_LocalPortNumber { get; set; }        public string Fa_RemoteIpAddress { get; set; }        public int Fa_RemotePortNumber { get; set; }        public int Fa_T3Timeout { get; set; }        public int Fa_T5Timeout { get; set; }        public int Fa_T6Timeout { get; set; }        public int Fa_T7Timeout { get; set; }        public int Fa_T8Timeout { get; set; }        public bool Fa_EnableSpooling { get; set; }        public int Fa_LinkTestInterval { get; set; }        public string Fa_DefaultCommunicationState { get; set; }        public string Fa_DefaultControlState { get; set; }        public string Fa_DefaultControlSubState { get; set; }        public string Fa_DeviceId { get; set; }        public PageSCFA()        {            UpdateKeys(typeof(PageSCFA).GetProperties());        }    }}
 |