107 lines
4.2 KiB
C#
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>();
|
|
}
|
|
} |