ComplianceServer/code/Hg.Core.Domain/NotificationHub.cs

107 lines
4.2 KiB
C#

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<OnlineUserInfoDto>(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<ICacheDomain>();
var csvrMessageDomain = scope.ServiceProvider.GetRequiredService<ICsvrMessageDomain>();
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<List<OnlineUserInfoDto>> GetList()
=> await _redisManager.ExistsAsync(CacheKeys.UserListKey) ?
await _redisManager.GetListAsync<OnlineUserInfoDto>(CacheKeys.UserListKey) :
new List<OnlineUserInfoDto>();
}
}