From 12acdf14fcddae8d16e00b7b981559da67ce60ea Mon Sep 17 00:00:00 2001 From: Chr <haoran.cheng@skonda.com.cn> Date: 星期五, 23 八月 2024 08:53:20 +0800 Subject: [PATCH] 完善消息通知程序; --- PdmAlert/MainWindow.xaml.cs | 328 ++++++++++++++++++++++++++++++++++++++++++++++-------- 1 files changed, 278 insertions(+), 50 deletions(-) diff --git a/PdmAlert/MainWindow.xaml.cs b/PdmAlert/MainWindow.xaml.cs index 8d0f0e9..84f3b61 100644 --- a/PdmAlert/MainWindow.xaml.cs +++ b/PdmAlert/MainWindow.xaml.cs @@ -2,16 +2,19 @@ using DevComponents.DotNetBar; using System.Windows; using System.Drawing; -using System.Net.WebSockets; using System; using System.Threading.Tasks; -using System.Text; -using System.Diagnostics; using System.Timers; using System.Collections.ObjectModel; using System.ComponentModel; using System.Runtime.CompilerServices; using PdmAlert.Entity; +using System.Threading; +using System.Net.Http; +using PdmAlert.Util; +using log4net; +using WebSocketSharp; +using System.Windows.Controls; namespace PdmAlert { @@ -38,10 +41,17 @@ } #endregion - private ClientWebSocket socket; + private static ILog Logger = LogManager.GetLogger("MsgAlert"); + + // private ClientWebSocket socket; + private WebSocket socket; private Task readTask; - private Task writeTask; private System.Timers.Timer heartbeatTimer; + private CancellationTokenSource cancelTokenSource; + private CancellationToken cancelToken; + private ToolSetting setting; + private HttpClient client; + private volatile bool IsRefreshing = false; private string _messageTitle = "鍏辨湁 0 鏉℃湭璇绘秷鎭�"; @@ -50,6 +60,31 @@ get => _messageTitle; set => RaiseAndSetIfChanged(ref _messageTitle, value); } + + private string _statusMessage = "鍚姩涓�..."; + + public string statusMessage + { + get => _statusMessage; + set => RaiseAndSetIfChanged(ref _statusMessage, value); + } + + private string _userInfo = ""; + + public string userInfo + { + get => _userInfo; + set => RaiseAndSetIfChanged(ref _userInfo, value); + } + + private string _socketStatus = ""; + + public string socketStatus + { + get => _socketStatus; + set => RaiseAndSetIfChanged(ref _socketStatus, value); + } + private ObservableCollection<MsgData> _messages; @@ -61,19 +96,104 @@ public MainWindow() { + cancelTokenSource = new CancellationTokenSource(); + cancelToken = cancelTokenSource.Token; + setting = ToolSetting.Instance; + client = new HttpClient + { + BaseAddress = new Uri($"http://{setting.Ip}:{setting.Port}/{setting.BaseUrl}/"), + Timeout = TimeSpan.FromSeconds(setting.TimeOut), + }; + client.DefaultRequestHeaders.Add("Client-Access-Token", LoginUser.CurrentUser.username); + userInfo = $"鐢ㄦ埛:{LoginUser.CurrentUser.realName}"; + DataContext = this; InitializeComponent(); + } + + private void ShowStatus(string status, string message) + { + Dispatcher.Invoke(() => + { + socketStatus = status; + statusMessage = message; + }); } private void Refresh_Click(object sender, RoutedEventArgs e) { + MaskAdorner.ShowMask(mainContent); + Task.Run(() => + { + try + { + RefreshData(); + } + catch (Exception ex) + { + Logger.Error("Request Unread Message Failed.", ex); + } + finally + { + MaskAdorner.HideMask(mainContent); + } + }); + } + public void RefreshData() + { + try + { + IsRefreshing = true; + Result<Page<MsgData>> res = client.GetSyncAction<Page<MsgData>>("pdm/annountCement/listSysMsgByUser", new Page<object> + { + pageNo = 1, + pageSize = 100 + }); + Page<MsgData> pageList = res.HandleResult(); + Dispatcher.Invoke(() => + { + messageTitle = $"鍏辨湁 {pageList.total} 鏉℃湭璇绘秷鎭�"; + this.messages = new ObservableCollection<MsgData>(pageList.records); + }); + } + finally + { + IsRefreshing = false; + } + } + private void FirstRefreshMsg() + { + try + { + Result<Page<MsgData>> res = client.GetSyncAction<Page<MsgData>>("pdm/annountCement/listSysMsgByUser", new Page<object> + { + pageNo = 1, + pageSize = 100 + }); + Page<MsgData> pageList = res.HandleResult(); + messageTitle = $"鍏辨湁 {pageList.total} 鏉℃湭璇绘秷鎭�"; + this.messages = new ObservableCollection<MsgData>(pageList.records); + if (pageList.total > 0) + { + Dispatcher.Invoke(() => + { + eDesktopAlertColor color = eDesktopAlertColor.Default; + eAlertPosition position = eAlertPosition.BottomRight; + DesktopAlert.Show($"鎮ㄦ湁{pageList.total}鏉℃湭璇绘秷鎭紝璇锋鏌�", "\uf005", eSymbolSet.Awesome, Color.Empty, color, position, 5, + DateTimeOffset.UtcNow.ToUnixTimeMilliseconds(), AlertClicked); + }); + } + } + catch (Exception ex) + { + Logger.Error("First Request Unread Message Failed.", ex); + } } private void SwitchUser_Click(object sender, RoutedEventArgs e) { - - + ((App)Application.Current).SwithUser(); } private void AlertClicked(long alertId) @@ -85,33 +205,97 @@ { var screeWidth = SystemParameters.WorkArea.Width; var sHeight = SystemParameters.WorkArea.Height; - this.Left = screeWidth - this.Width; this.Top = sHeight - this.Height; + + FirstRefreshMsg(); ConnectWebSocket(); } - private async Task ConnectWebSocket() + private void ConnectWebSocket() { try { - ClientWebSocket ws = new ClientWebSocket(); - await ws.ConnectAsync(new Uri($"ws://localhost:8888/pdm-web/daws/{LoginUser.CurrentUser?.id}"), default); + socket = new WebSocket($"ws://{setting.Ip}:{setting.Port}/{setting.BaseUrl}/daws/{LoginUser.CurrentUser?.id}"); + socket.OnOpen += Socket_OnOpen; + socket.OnClose += Socket_OnClose; + socket.OnMessage += Socket_OnMessage; + socket.OnError += Socket_OnError; + socket.Connect(); + StartHeartBeat(); + /*await ws.ConnectAsync(new Uri($"ws://{setting.Ip}:{setting.Port}/{setting.BaseUrl}/daws/{LoginUser.CurrentUser?.id}"), default); socket = ws; ReadMsg(); - StartHeartbeat(); + StartHeartbeat();*/ } catch (Exception ex) { - await ConnectWebSocket(); + Logger.Error("Connect Websocket Failed.", ex); + ShowStatus("Error", "涓庢湇鍔¤繛鎺ヨ繛鎺ュけ璐ワ紝灏濊瘯閲嶈繛..."); } } - private void ReadMsg() + private void Socket_OnError(object sender, ErrorEventArgs e) + { + Logger.Error("Websocket On Error.", e.Exception); + //ResetSocket(); + //ConnectWebSocket(); + } + + private void Socket_OnMessage(object sender, MessageEventArgs e) + { + HandleMsg(e.Data); + } + + private void Socket_OnClose(object sender, CloseEventArgs e) + { + Logger.Info("Websocket On Close."); + StopHeartBeat(); + } + + private void Socket_OnOpen(object sender, EventArgs e) + { + Logger.Info("Websocket On Open."); + ShowStatus("Success", "涓庢湇鍔″櫒杩炴帴鐘舵�佹甯�"); + // StartHeartBeat(); + } + + public void StartHeartBeat() + { + if (heartbeatTimer == null) + { + heartbeatTimer = new System.Timers.Timer(30 * 1000); + heartbeatTimer.Elapsed += HeartbeatTimer_Elapsed; + heartbeatTimer.AutoReset = true; + heartbeatTimer.Start(); + } + } + + private void HeartbeatTimer_Elapsed(object sender, ElapsedEventArgs e) + { + if (socket == null || !socket.IsAlive) + { + Logger.Error($"Websocket HeartBeat Error. Socket is NULL:{socket == null}; IsAlive:{socket.IsAlive}"); + ShowStatus("Error", "涓庢湇鍔″櫒閫氳涓柇锛屾鍦ㄥ皾璇曢噸杩�..."); + ResetSocket(); + ConnectWebSocket(); + } + else + { + socket.Send("HeartBeat"); + } + } + + public void StopHeartBeat() + { + + } + + /*private void ReadMsg() { readTask = Task.Run(() => { - while (socket.State == WebSocketState.Open) + while (socket.State == WebSocketState.Open && !cancelToken.IsCancellationRequested) { byte[] buffer = new byte[1024]; var task = socket.ReceiveAsync(new ArraySegment<byte>(buffer), default); @@ -119,9 +303,10 @@ var res = task.Result; var msg = Encoding.UTF8.GetString(buffer, 0, res.Count); HandleMsg(msg); + Thread.Sleep(100); } - }); - } + }, cancelToken); + }*/ private void HandleMsg(string msg) { @@ -129,35 +314,39 @@ { return; } - Debug.WriteLine(msg); Dispatcher.Invoke(() => { eDesktopAlertColor color = eDesktopAlertColor.Default; eAlertPosition position = eAlertPosition.BottomRight; DesktopAlert.Show(msg, "\uf005", eSymbolSet.Awesome, Color.Empty, color, position, 5, DateTimeOffset.UtcNow.ToUnixTimeMilliseconds(), AlertClicked); + Refresh_Click(null, null); }); } - private void StartHeartbeat() + public void ResetSocket() { - heartbeatTimer = new System.Timers.Timer(30 * 1000); - heartbeatTimer.Elapsed += HeartbeatTimer_Elapsed; - heartbeatTimer.AutoReset = true; - heartbeatTimer.Start(); - } - - private void HeartbeatTimer_Elapsed(object sender, ElapsedEventArgs e) - { - if (socket == null || socket.State != WebSocketState.Open) + if (readTask != null) { - DoDispose(); - ConnectWebSocket().Wait(); + cancelTokenSource.Cancel(); + readTask = null; } - else + if (socket != null) { - byte[] buffer = Encoding.UTF8.GetBytes("test"); - socket.SendAsync(new ArraySegment<byte>(buffer), WebSocketMessageType.Text, true, default); + using (var _socketServer = socket) + { + try + { + _socketServer.Close(); + socket = null; + /*socket.CloseAsync(WebSocketCloseStatus.NormalClosure, "DoDispose", default).Wait(); + socket.Dispose();*/ + } + catch (Exception ex) + { + Logger.Error("Websocket Close Error.", ex); + } + } } } @@ -169,25 +358,13 @@ heartbeatTimer.Dispose(); heartbeatTimer = null; } - if (readTask != null) - { - readTask.Dispose(); - readTask = null; - } - if (socket != null) - { - try - { - socket.CloseAsync(WebSocketCloseStatus.NormalClosure, "DoDispose", default).Wait(); - socket.Dispose(); - } - catch (Exception ex) - { + ResetSocket(); - } - finally + if (client != null) + { + using (var _client = client) { - socket = null; + client = null; } } } @@ -201,5 +378,56 @@ { this.Hide(); } + + private void ReadAll_Click(object sender, RoutedEventArgs e) + { + MaskAdorner.ShowMask(mainContent); + Task.Run(() => + { + try + { + Result<object> res = client.PutSyncAction<object>("pdm/sysAnnouncementSend/readAll"); + _ = res.HandleResult(); + RefreshData(); + } + catch (Exception ex) + { + Logger.Error("Read All Fail.", ex); + } + finally + { + MaskAdorner.HideMask(mainContent); + } + }); + } + + private void SingleRead_Click(object sender, RoutedEventArgs e) + { + Button button = sender as Button; + MsgData msg = button.DataContext as MsgData; + if (msg == null) return; + + MaskAdorner.ShowMask(mainContent); + Task.Run(() => + { + try + { + Result<object> res = client.PutSyncAction<object>("pdm/sysAnnouncementSend/editByAnntIdAndUserId", new MsgData + { + anntId = msg.id + }); + _ = res.HandleResult(); + RefreshData(); + } + catch (Exception ex) + { + Logger.Error("Read All Fail.", ex); + } + finally + { + MaskAdorner.HideMask(mainContent); + } + }); + } } } -- Gitblit v1.9.1