using JNPF.Common.Const; using JNPF.Common.Core.Manager; using JNPF.Common.Extension; using JNPF.Common.Filter; using JNPF.Common.Manager; using JNPF.Common.Models.User; using JNPF.DependencyInjection; using JNPF.DynamicApiController; using JNPF.Message.Entitys.Dto.IM; using JNPF.Message.Interfaces; using JNPF.Systems.Entitys.Dto.OnlineUser; using Mapster; using Microsoft.AspNetCore.Mvc; namespace JNPF.Systems; /// /// 业务实现:在线用户. /// [ApiDescriptionSettings(Tag = "System", Name = "OnlineUser", Order = 176)] [Route("api/system/[controller]")] public class OnlineUserService : IDynamicApiController, ITransient { /// /// IM回应服务. /// private readonly IImReplyService _imReplyService; /// /// 缓存管理器. /// private readonly ICacheManager _cacheManager; /// /// 用户管理. /// private readonly IUserManager _userManager; /// /// 初始化一个类型的新实例. /// public OnlineUserService( IImReplyService imReplyService, ICacheManager cacheManager, IUserManager userManager) { _imReplyService = imReplyService; _cacheManager = cacheManager; _userManager = userManager; } /// /// 获取在线用户列表. /// /// 参数. /// [HttpGet("")] public async Task GetList([FromQuery] KeywordInput input) { var tenantId = _userManager.TenantId; var userOnlineList = new List(); var onlineKey = string.Format("{0}{1}", CommonConst.CACHEKEYONLINEUSER, tenantId); if (_cacheManager.Exists(onlineKey)) { userOnlineList = await GetOnlineUserList(tenantId); if (!input.keyword.IsNullOrEmpty()) userOnlineList = userOnlineList.FindAll(x => x.userName.Contains(input.keyword)); } return userOnlineList.Adapt>(); } /// /// 强制下线. /// /// [HttpDelete("{id}")] public async Task ForcedOffline(string id) { var tenantId = _userManager.TenantId; var list = await GetOnlineUserList(tenantId); if (list == null) return; var user = list.Find(it => it.tenantId == tenantId && it.userId == id); if (user != null) { _imReplyService.ForcedOffline(user.connectionId); await DelOnlineUser(tenantId, user.userId); await DelUserInfo(tenantId, user.userId); } } /// /// 批量下线在线用户. /// /// /// 下线用户信息. [HttpDelete("")] public async Task Clear(string id, [FromBody] BatchOnlineInput input) { var tenantId = _userManager.TenantId; var list = await GetOnlineUserList(tenantId); var userList = list.FindAll(it => it.tenantId == tenantId && input.ids.Contains(it.userId)); userList.ForEach(async item => { _imReplyService.ForcedOffline(item.connectionId); await DelOnlineUser(tenantId, item.userId); await DelUserInfo(tenantId, item.userId); }); } /// /// 获取在线用户列表. /// /// 租户ID. /// public async Task> GetOnlineUserList(string tenantId) { var cacheKey = string.Format("{0}{1}", CommonConst.CACHEKEYONLINEUSER, tenantId); return await _cacheManager.GetAsync>(cacheKey); } /// /// 删除在线用户ID. /// /// 租户ID. /// 用户ID. /// public async Task DelOnlineUser(string tenantId, string userId) { var cacheKey = string.Format("{0}{1}", CommonConst.CACHEKEYONLINEUSER, tenantId); var list = await _cacheManager.GetAsync>(cacheKey); var online = list.Find(it => it.userId == userId); list.RemoveAll((x) => x.connectionId == online.connectionId); return await _cacheManager.SetAsync(cacheKey, list); } /// /// 删除用户登录信息缓存. /// /// 租户ID. /// 用户ID. /// public async Task DelUserInfo(string tenantId, string userId) { var cacheKey = string.Format("{0}:{1}:{2}", tenantId, CommonConst.CACHEKEYUSER, userId); return await _cacheManager.DelAsync(cacheKey); } }