using FLY.OBJComponents.IService; using MultiLayout.UiModule; using Misc; using System; using System.Collections.Generic; using System.Globalization; using System.Linq; using System.Text; using System.Threading; using System.Threading.Tasks; using FLY.Thick.Base.UI; using Unity; using FLY.Thick.Base.Common; using MultiLayout; using System.Windows.Threading; using System.ComponentModel; using System.Collections.ObjectModel; using System.Windows; namespace FLY.Thick.Base.UI.OnInit { /// /// 监听 WarningSystemManager 的报警。 周期一个个显示 报警列表的内容 /// public class OnInitWarnings : IOnInit { public int Level { get; private set; } WarningSystemManager warningSystemManager; IUnityContainer container; FlyLayoutManager flyLayoutManager; DispatcherTimer timer_error; int reason_list_index = -1; public OnInitWarnings( IUnityContainer container, FlyLayoutManager flyLayoutManager, WarningSystemManager warningSystemManager, ParamDictionary paramDictionary, int lv = 1) { Level = lv; this.container = container; this.flyLayoutManager = flyLayoutManager; this.warningSystemManager = warningSystemManager; if (warningSystemManager.Warnings.Count() == 0) return; this.flyLayoutManager.ErrMsgClick = ErrMsg_OnClick; } public void OnInit() { if (warningSystemManager.Warnings.Count() == 0) return; warningSystemManager.PropertyChanged += WarningSystemManager_PropertyChanged; //报警原因轮流显示 timer_error = new DispatcherTimer(); timer_error.Interval = TimeSpan.FromSeconds(3); timer_error.Tick += (s, e) => { reason_list_index--; if (reason_list_index < 0) reason_list_index = warningSystemManager.Errors.Count(); UpdateError(); }; UpdateError(); } private void WarningSystemManager_PropertyChanged(object sender, PropertyChangedEventArgs e) { if (e.PropertyName == nameof(warningSystemManager.Errors)) { reason_list_index = warningSystemManager.Errors.Count() - 1; UpdateError(); } } void UpdateError() { if (warningSystemManager.Errors.Count() == 0) { flyLayoutManager.ErrMsg = null; timer_error.Stop(); } else { if (reason_list_index < 0) reason_list_index = 0; else if (reason_list_index > warningSystemManager.Errors.Count() - 1) { reason_list_index = warningSystemManager.Errors.Count() - 1; } var err = warningSystemManager.Errors[reason_list_index]; flyLayoutManager.ErrMsg = $"{err.DevName} {err.Description}"; timer_error.Start(); } } private void ErrMsg_OnClick() { //打开管理页面 //当管理页面已经打开,不能再次执行 if (FlyLayoutManager.NavigationService.Content is PgErrorsTable) { return; } var p = container.Resolve(); FlyLayoutManager.NavigationService.Navigate(p); } } /// /// 从 warnings.service 容器获取全部 报警服务, 把 全部报警服务的报警内容 整合到 Errors /// public class WarningSystemManager : INotifyPropertyChanged { public event PropertyChangedEventHandler PropertyChanged; public List Warnings { get; private set; } = new List(); public List Errors { get; private set; } = new List(); public bool IsRinging { get; set; } /// /// 报警服务容器 /// IUnityContainer warning_container; ParamDictionary paramDictionary; [InjectionMethod] public void Init(IUnityContainer container, ParamDictionary paramDictionary) { //找到 warnings.service 容器 if (!container.IsRegistered("warnings.service")) return; this.warning_container = container.Resolve("warnings.service"); this.paramDictionary = paramDictionary; //不需要关注的 报警服务,不需要 resolve //获取 不需要关注 的报警服务 在容器中的名字 var skipWarningUnityNames = paramDictionary.GetValue>(ParamDistItemKeys.SkipWarningUnityNames, null); if (skipWarningUnityNames == null || skipWarningUnityNames.Count() == 0) { //全部获取 Warnings.AddRange(warning_container.ResolveAll()); } else { Warnings = new List(); foreach (var registration in warning_container.Registrations) { if (registration.RegisteredType == typeof(WarningSystem2ServiceClientWithName)) { if (!skipWarningUnityNames.Contains(registration.Name)) { //没有被 忽略 var warning = warning_container.Resolve(registration.Name); Warnings.Add(warning); } } } } IsRinging = Warnings.Any(w => w.IsRinging); foreach (var warning in Warnings) { warning.PropertyChanged += WarningService_PropertyChanged; } updateErrors(); } private void WarningService_PropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e) { if ((e.PropertyName == nameof(WarningSystem2ServiceClientWithName.ReasonList)) || (e.PropertyName == nameof(WarningSystem2ServiceClientWithName.IsConnected))) { updateErrors(); } else if (e.PropertyName == nameof(WarningSystem2ServiceClientWithName.IsRinging)) { IsRinging = Warnings.Any(w => w.IsRinging); } } void updateErrors() { List errors = new List(); foreach (var warning in Warnings) { if (!warning.IsConnected) { string errMsg = (string)Application.Current.FindResource("str.CtMicroGage.ServerDisconnected"); errors.Add(new ErrorWithName() { DevName = warning.DevName, Time = DateTime.Now, ErrCode = 0, Description = errMsg }); } else if (warning.ReasonList != null && warning.ReasonList.Count() > 0) { errors.AddRange(warning.ReasonList.Select(e => new ErrorWithName() { DevName = warning.DevName, Time = e.Time, ErrCode = e.ErrCode, Description = e.Description, Accessory = e.Accessory })); } } if (errors.Count > 0) { errors.Sort((e1, e2) => { return e1.Time.CompareTo(e2.Time); }); Errors = errors; } else { Errors = new List(); } } /// /// 返回 报警服务名字 /// /// public List GetWarningNames() { List warningNames = new List(); foreach (var registration in warning_container.Registrations) { if (registration.RegisteredType == typeof(WarningSystem2ServiceClientWithName)) { //没有被 忽略 //var warning = warning_container.Resolve(registration.Name); warningNames.Add(new WarningName() { //DevName = warning.DevName, UnityName = registration.Name }); } } var skipWarningUnityNames = paramDictionary.GetValue>(ParamDistItemKeys.SkipWarningUnityNames, null); if (skipWarningUnityNames != null && skipWarningUnityNames.Count() > 0) { foreach (var unityName in skipWarningUnityNames) { var wn = warningNames.Find(w => w.UnityName == unityName); if (wn != null) wn.IsRegistered = false; } } return warningNames; } public void SetSkipWarningName(List unityNames) { paramDictionary.SetValue(ParamDistItemKeys.SkipWarningUnityNames, unityNames); } } public class WarningName:INotifyPropertyChanged { /// /// 设备名称 /// //public string DevName { get; set; } public string UnityName { get; set; } public bool IsRegistered { get; set; } = true; public event PropertyChangedEventHandler PropertyChanged; } public class ErrorWithName:INotifyPropertyChanged { public event PropertyChangedEventHandler PropertyChanged; /// /// 设备名称 /// public string DevName { get; set; } /// /// 时间 /// public DateTime Time { get; set; } /// /// 出错码 /// public int ErrCode { get; set; } /// /// 描述 /// public string Description { get; set; } /// /// 附加信息 /// public string Accessory { get; set; } } }