using NEIntelligentControl2.Models.Messages; using NEIntelligentControl2.Models.Station; using NEIntelligentControl2.Models.Windturbine; using NEIntelligentControl2.Service.Station; using NEIntelligentControl2.Service.User; using NEIntelligentControl2.Service.WebSocket; using NEIntelligentControl2.Service.Windturbine; using NEIntelligentControl2.Views.Matrix; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows; using System.Windows.Controls; using System.Windows.Data; using System.Windows.Documents; using System.Windows.Input; using System.Windows.Media; using System.Windows.Media.Imaging; using System.Windows.Shapes; namespace NEIntelligentControl2.Windows { /// /// 推荐窗口 /// public partial class RecomendWindow : Window { private SuggestionManager _SuggestionManager; private WindturbineInfoBridge _WindturbineInfoBridge; private MessageBridge _MessageBridge; private StationManager _StationManager; private UserManager _UserManager; /// /// 矩阵块 /// private List _WindBlocks; private HashSet _WindturbineIds; private StationInfo _CurrentStationInfo; private string _OperationType; private ControlManager _ControlManager; private CacheManager _CacheManager; public RecomendWindow(SuggestionManager sm, MessageBridge mb, StationManager smm, ControlManager cm, UserManager um, CacheManager cam) { InitializeComponent(); _WindBlocks = new List(); _WindturbineIds = new HashSet(); _SuggestionManager = sm; _MessageBridge = mb; _StationManager = smm; _ControlManager = cm; _UserManager = um; _CacheManager = cam; _SuggestionManager.OnSuggestion = OnSuggestion; _WindturbineInfoBridge = new WindturbineInfoBridge() { Messaged = WindturbineMessaged }; _MessageBridge.Register(_WindturbineInfoBridge); Init(); } private void WindturbineMessaged(Dictionary obj) { Dispatcher.Invoke(() => { foreach(var v in _WindBlocks) { if (!obj.ContainsKey(v.WindturbineId)) continue; v.Update(obj[v.WindturbineId]); } }); } private void Init() { var vs = _StationManager.GetStationInfos().Where(s => s.Type == Models.Station.StationType.Wind).ToList(); vs.Add(new Models.Station.StationInfo() { Name = "全部", Id = "all" }); _LBMain.ItemsSource = vs; _LBMain.SelectedIndex = vs.Count - 1; } private void OnSuggestion(List obj) { try { if (obj == null) { obj = new List(); } var ids = obj.Select(s => s.WindturbineId).ToList(); var removed = _WindBlocks.Where(w => !ids.Contains(w.WindturbineId)).ToList(); Dispatcher.Invoke(() => { InitCount(obj); foreach (var v in obj) { if (_WindturbineIds.Contains(v.WindturbineId)) continue; _WindturbineIds.Add(v.WindturbineId); WindBlock wb = new WindBlock() { WindturbineId = v.WindturbineId, Suggestion = v }; if(_CacheManager.Windturbineinfos!=null&& _CacheManager.Windturbineinfos.ContainsKey(v.WindturbineId)) { wb.Update(_CacheManager.Windturbineinfos[v.WindturbineId]); } _WindBlocks.Add(wb); if (IsFilterOK(wb)) { _OPUGMain.Add(wb); } } foreach (var v in removed) { _WindBlocks.Remove(v); _WindturbineIds.Remove(v.WindturbineId); _OPUGMain.Remove(v); } }); } catch { } } /// /// 初始化数据 /// private void InitCount(List obj) { _TBAll.Text = obj.Count.ToString(); _TBStart.Text = obj.Where(w => w.OperateType == OperateStyle.Start).ToArray().Length.ToString(); _TBStop.Text = obj.Where(w => w.OperateType == OperateStyle.Stop).ToArray().Length.ToString(); _TBReset.Text = obj.Where(w => w.OperateType == OperateStyle.Reset).ToArray().Length.ToString(); _TBMaintain.Text = obj.Where(w => w.OperateType == OperateStyle.Maintain).ToArray().Length.ToString(); _TBUnMaintain.Text = obj.Where(w => w.OperateType == OperateStyle.UnMaintain).ToArray().Length.ToString(); } private bool IsFilterOK(WindBlock wb) { if (_OperationType != null && _OperationType != "all") { Enum.TryParse(_OperationType, out OperateStyle ot); if(_CurrentStationInfo.Id == "all") { return wb.Suggestion.OperateType == ot; } else { return wb.Suggestion.OperateType == ot && wb.WindturbineInfo?.StationId == _CurrentStationInfo.Id; } } else { if (_CurrentStationInfo.Id != "all") { return wb.WindturbineInfo?.StationId == _CurrentStationInfo.Id; } } return true; } public static void ShowWindow() { RecomendWindow rw = App.ServiceProvider.GetService(typeof(RecomendWindow)) as RecomendWindow; rw.Owner = Application.Current.MainWindow; rw.ShowDialog(); } private void Button_Click(object sender, RoutedEventArgs e) { Send(); } /// /// 发送控制指令 /// private void Send() { if (!_UserManager.IsLogined) { bool b = _UserManager.TempLogin(); if (!b) return; } var cis = GetControlInstructions(); Task.Run(send); MessageWindow.ShowMessage("指令发送成功!"); void send() { var v = _ControlManager.SendCmdNotCheck(cis); if (v == null) { return; } Dispatcher.Invoke(() => { if (v.Length > 0) { MessageWindowBig.ShowMessage(v); } }); } } private Dictionary GetControlInstructions() { Dictionary ll = new Dictionary(); List ls = GetSelectedItems(); foreach (var v in ls) { ControlInstruction ci = new ControlInstruction(); ci.WindturbineId = v.WindturbineId; ci.StationId = v.WindturbineInfo.StationId; ci.ProjectId = v.WindturbineInfo.ProjectId; ci.ModelId = v.WindturbineInfo.ModelId; ci.ControlType = v.Suggestion.OperateType; ci.LockType = v.WindturbineInfo.LockType; ll.Add(ci.WindturbineId, ci); } return ll; } private List GetSelectedItems() { List ls = new List(); foreach(var v in _WindBlocks) { if (v.IsSelected) { ls.Add(v); } } return ls; } private void Window_Closing(object sender, System.ComponentModel.CancelEventArgs e) { _MessageBridge.Unregister(_WindturbineInfoBridge); } /// /// 场站选择 /// private void _LBMain_SelectionChanged(object sender, SelectionChangedEventArgs e) { if (e.AddedItems.Count <= 0) return; var v = e.AddedItems[0] as StationInfo; if (v == null) return; _CurrentStationInfo = v; ToFilter(); } /// /// 操作选择 /// private void _LBOperation_SelectionChanged(object sender, SelectionChangedEventArgs e) { if (e.AddedItems.Count <= 0) return; var v = e.AddedItems[0] as ListBoxItem; if (v == null) return; _OperationType = v.Tag as string; ToFilter(); } private void ToFilter() { if (_WindBlocks == null) return; _OPUGMain?.Clear(); foreach(var v in _WindBlocks) { if (IsFilterOK(v)) { _OPUGMain.Add(v); } } } private void Button_Click_1(object sender, RoutedEventArgs e) { this.Close(); } private void Window_Loaded(object sender, RoutedEventArgs e) { OnSuggestion(_SuggestionManager.WindturbineSuggestions); } } }