using Hg.Core.Domain.Impl; using Microsoft.AspNetCore.SignalR; using Microsoft.Extensions.DependencyInjection; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Hg.Core.Domain { public class NotificationHub : Hub { private readonly IRedisManager _redisManager; private readonly IServiceProvider _serviceProvider; public NotificationHub(IRedisManager redisManager, IServiceProvider serviceProvider) { _redisManager = redisManager; _serviceProvider = serviceProvider; } public async Task Send(CsvrMessage csvrMessage, string title) { var list = await GetList(); var connectionIds = list.Where(x => x.Eid == csvrMessage.Eid).Select(x => x.ConnectionId ?? "").ToList(); if (connectionIds != null && connectionIds.Any()) { var clients = Clients.Clients(connectionIds); Log.Information($"发送消息:{csvrMessage.Message}"); await clients.SendAsync("ReceiveMessage", title, csvrMessage.Message, csvrMessage.Id); } } public async Task SendHgReport(int? eid, string msg) { var list = await GetList(); var connectionIds = list.Where(x => x.Eid == eid).Select(x => x.ConnectionId ?? "").ToList(); if (connectionIds != null && connectionIds.Any()) { try { if (Clients != null) { var clients = Clients.Clients(connectionIds); Log.Information($"发送消息:{msg}"); await clients.SendAsync("ReceivehgbbMessage", "审核提醒", msg); } } catch (Exception ex) { Log.Error($"发送通知失败{ex.Message}"); } } } public async Task LoginUser(string userInfo) { var user = JsonSerializer.Deserialize(userInfo); if (user == null) return; user.LoginTime = DateTime.Now; var list = await GetList(); var existModel = list.Where(n => n.Eid == user.Eid && n.ConnectionId != user.ConnectionId).ToList(); if (existModel.Count() > 0) { foreach (var item in existModel) { list.Remove(item); } } list.Add(user); await _redisManager.SetAsync(CacheKeys.UserListKey, list, TimeSpan.FromDays(1)); await SendUserMessage(user); } public async Task SendUserMessage(OnlineUserInfoDto user) { using IServiceScope scope = _serviceProvider.CreateScope(); var cacheDomain = scope.ServiceProvider.GetRequiredService(); var csvrMessageDomain = scope.ServiceProvider.GetRequiredService(); var count = await csvrMessageDomain.GetMessageCount(user.Eid); if (count > 0 && !string.IsNullOrEmpty(user.ConnectionId)) { var client = Clients.Client(user.ConnectionId); await client.SendAsync("LoginUser", $"总部系统消息通知", $"您有{count}条未读通知,请尽快处理。"); } } public override async Task OnDisconnectedAsync(Exception? exception) { var connectionId = Context.ConnectionId; var list = await GetList(); var user = list.Where(x => x.ConnectionId == connectionId).FirstOrDefault(); if (user != null) { list.Remove(user); await _redisManager.SetAsync(CacheKeys.UserListKey, list, TimeSpan.FromDays(1)); } } private async Task> GetList() => await _redisManager.ExistsAsync(CacheKeys.UserListKey) ? await _redisManager.GetListAsync(CacheKeys.UserListKey) : new List(); } }