schangxiang@126.com
2024-06-11 bc42866b302006865a605da028a447592b5dbda9
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
using iWare.Wms.Core;
using Furion.DatabaseAccessor;
using Furion.DependencyInjection;
using Furion.DynamicApiController;
using Mapster;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.SignalR;
using Microsoft.EntityFrameworkCore;
 
namespace iWare.Wms.Application
{
    /// <summary>
    /// 在线用户服务
    /// </summary>
    [ApiDescriptionSettings(Name = "OnlineUser", Order = 100)]
    [Route("api")]
    public class SysOnlineUserService : ISysOnlineUserService, IDynamicApiController, ITransient
    {
        private readonly ISysCacheService _sysCacheService;
        private readonly IRepository<SysUser> _sysUserRep;// 用户表仓储
        //private readonly IRepository<SysTenant, MultiTenantDbContextLocator> _sysTenantRep;// 租户仓储
        private readonly IHubContext<ChatHub, IChatClient> _chatHubContext;
 
        public SysOnlineUserService(ISysCacheService sysCacheService, IRepository<SysUser> sysUerRep,
            //IRepository<SysTenant, MultiTenantDbContextLocator> sysTenantRep,
            IHubContext<ChatHub, IChatClient> chatHubContext)
        {
            _sysCacheService = sysCacheService;
            _sysUserRep = sysUerRep;
            //_sysTenantRep = sysTenantRep;
            _chatHubContext = chatHubContext;
        }
 
        /// <summary>
        /// 分页获取在线用户信息
        /// </summary>
        /// <param name="input"></param>
        /// <returns></returns>
        [HttpGet("sysOnlineUser/page")]
        public async Task<PageResult<OnlineUserOutput>> QueryOnlineUserPageList([FromQuery] PageInputBase input)
        {
            var onlineUsers = await _sysCacheService.GetAsync<List<OnlineUser>>(CommonConst.CACHE_KEY_ONLINE_USER) ?? new List<OnlineUser>();
            var currUser = _sysUserRep.FirstOrDefault(u => u.Id == CurrentUserInfo.UserId, false);
            var onlineUserOutputs = onlineUsers
                //.Where(!CurrentUserInfo.IsSuperAdmin, o => o.TenantId == currUser.TenantId)
                .Where(!string.IsNullOrWhiteSpace(input.SearchValue), o => o.Account.Contains(input.SearchValue) || o.Name.Contains(input.SearchValue))
                .Select(o => o.Adapt<OnlineUserOutput>());
 
            var currentPageData = onlineUserOutputs.ToADPagedList(input.PageNo, input.PageSize);
 
            //填充租户名称
            //var tenants = await _sysTenantRep.DetachedEntities.ToListAsync();
            //currentPageData.Rows.ToList().ForEach(o => o.TenantName = tenants.FirstOrDefault(p => p.Id == o.TenantId)?.Name);
 
            return currentPageData;
        }
 
        /// <summary>
        /// 获取在线用户信息
        /// </summary>
        /// <returns></returns>
        [HttpGet("sysOnlineUser/list")]
        public async Task<List<OnlineUserOutput>> List()
        {
            var onlineUsers = await _sysCacheService.GetAsync<List<OnlineUser>>(CommonConst.CACHE_KEY_ONLINE_USER) ?? new List<OnlineUser>();
            var currUser = _sysUserRep.FirstOrDefault(u => u.Id == CurrentUserInfo.UserId, false);
            var onlineUserOutputs = onlineUsers
                //.Where(!CurrentUserInfo.IsSuperAdmin, o => o.TenantId == currUser.TenantId)
                .Select(o => o.Adapt<OnlineUserOutput>())
                .ToList();
 
            //填充租户名称
            //var tenants = await _sysTenantRep.DetachedEntities.ToListAsync();
            //onlineUserOutputs.ForEach(o => o.TenantName = tenants.FirstOrDefault(p => p.Id == o.TenantId)?.Name);
 
            return onlineUserOutputs;
        }
 
        /// <summary>
        /// 强制下线
        /// </summary>
        /// <param name="user"></param>
        /// <returns></returns>
        [HttpPost("sysOnlineUser/forceExist")]
        public async Task ForceExist([FromBody] OnlineUser user)
        {
            await _chatHubContext.Clients.Client(user.ConnectionId).ForceExist();
        }
        /// <summary>
        /// 单用户登录强制下线
        /// </summary>
        /// <param name="user"></param>
        /// <returns></returns>
        public async Task SingleLoginForceExist([FromBody] OnlineUser user)
        {
            await _chatHubContext.Clients.Client(user.ConnectionId).SingleLoginForceExist();
        }
    }
}