using JNPF.Common.Const; using JNPF.Common.Core.Handlers; using JNPF.Common.Core.Manager; using JNPF.Common.Enums; using JNPF.Common.Extension; using JNPF.Common.Manager; using JNPF.Common.Models.User; using JNPF.Common.Security; using JNPF.DependencyInjection; using JNPF.DynamicApiController; using JNPF.FriendlyException; using JNPF.LinqBuilder; using JNPF.Systems.Entitys.Dto.System.System; using JNPF.Systems.Entitys.Permission; using JNPF.Systems.Entitys.System; using Mapster; using Microsoft.AspNetCore.Mvc; using SqlSugar; namespace JNPF.Systems.System; /// /// 系统功能. /// [ApiDescriptionSettings(Tag = "System", Name = "System", Order = 200)] [Route("api/system/[controller]")] public class SystemService : IDynamicApiController, ITransient { /// /// 系统功能表仓储. /// private readonly ISqlSugarRepository _repository; /// /// 缓存管理器. /// private readonly ICacheManager _cacheManager; /// /// IM中心处理程序. /// private IMHandler _imHandler; /// /// 用户管理. /// private readonly IUserManager _userManager; /// /// 初始化一个类型的新实例. /// public SystemService( ISqlSugarRepository repository, ICacheManager cacheManager, IMHandler imHandler, IUserManager userManager) { _repository = repository; _cacheManager = cacheManager; _imHandler = imHandler; _userManager = userManager; } #region Get /// /// 列表. /// /// 参数. /// [HttpGet("")] public async Task GetList([FromQuery] SystemQuery input) { var authorIds = await _repository.AsSugarClient().Queryable() .Where(x => x.ItemType.Equals("system") && x.ObjectType.Equals("Role") && _userManager.Roles.Contains(x.ObjectId)).Select(x => x.ItemId).ToListAsync(); var whereLambda = LinqExpression.And(); whereLambda = whereLambda.And(x => x.DeleteMark == null); if (!_userManager.IsAdministrator) whereLambda = whereLambda.And(x => authorIds.Contains(x.Id)); if (input.keyword.IsNotEmptyOrNull()) whereLambda = whereLambda.And(x => x.FullName.Contains(input.keyword) || x.EnCode.Contains(input.keyword)); if (input.enableMark.IsNotEmptyOrNull()) whereLambda = whereLambda.And(x => x.EnabledMark == SqlFunc.ToInt32(input.enableMark)); var output = (await _repository.AsQueryable().Where(whereLambda).OrderBy(a => a.SortCode).OrderByDescending(a => a.CreatorTime).ToListAsync()).Adapt>(); return new { list = output }; } /// /// 获取信息. /// /// 主键id. /// [HttpGet("{id}")] public async Task GetInfo(string id) { var data = await _repository.GetFirstAsync(x => x.Id == id && x.DeleteMark == null); return data.Adapt(); } #endregion #region Post /// /// 新建. /// /// 实体对象. /// [HttpPost("")] public async Task Create([FromBody] SystemCrInput input) { if (await _repository.IsAnyAsync(x => (x.EnCode == input.enCode || x.FullName == input.fullName) && x.DeleteMark == null)) throw Oops.Oh(ErrorCode.COM1004); var entity = input.Adapt(); var isOk = await _repository.AsInsertable(entity).IgnoreColumns(ignoreNullColumn: true).CallEntityMethod(m => m.Creator()).ExecuteCommandAsync(); if (isOk < 1) throw Oops.Oh(ErrorCode.COM1000); } /// /// 修改. /// /// 主键值. /// 实体对象. /// [HttpPut("{id}")] public async Task Update(string id, [FromBody] SystemCrInput input) { if (await _repository.IsAnyAsync(x => x.Id != id && (x.EnCode == input.enCode || x.FullName == input.fullName) && x.DeleteMark == null)) throw Oops.Oh(ErrorCode.COM1004); var mainSystem = await _repository.GetFirstAsync(it => it.IsMain.Equals(1) && it.EnabledMark.Equals(1) && it.DeleteMark == null); // 判断主系统是否被禁用. if (input.id.Equals(mainSystem.Id) && input.enabledMark.Equals(0)) throw Oops.Oh(ErrorCode.D1036); // 判断主系统是否有修改系统编码. if (input.id.Equals(mainSystem.Id) && !input.enCode.Equals(mainSystem.EnCode)) throw Oops.Oh(ErrorCode.D1037); var isOk = await _repository.AsUpdateable().SetColumns(it => new SystemEntity() { FullName = input.fullName, EnCode = input.enCode, Icon = input.icon, SortCode = input.sortCode, Description = input.description, EnabledMark = input.enabledMark, LastModifyUserId = _userManager.UserId, LastModifyTime = SqlFunc.GetDate(), }).Where(it => it.Id.Equals(id)).ExecuteCommandAsync(); if (!(isOk > 0)) throw Oops.Oh(ErrorCode.COM1001); // 当用户的子系统被禁用时,更换成其他未被禁用的系统. if (!input.id.Equals(mainSystem.Id) && input.enabledMark.Equals(0)) { var systemUser = await _repository.AsSugarClient().Queryable() .Where(it => it.DeleteMark == null && input.id.Equals(it.SystemId)) .Select(x => new UserEntity() { Id = x.Id, SystemId = x.SystemId }).ToListAsync(); // 获取用户所有角色id. var userRoleIdList = await _repository.AsSugarClient().Queryable() .Where(it => systemUser.Select(s => s.Id).ToList().Contains(it.UserId) && it.ObjectType.Equals("Role")) .Select(x => x.ObjectId) .ToListAsync(); var authorizeList = await _repository.AsSugarClient().Queryable() .Where(it => it.ItemType.Equals("module") && it.ObjectType.Equals("Role")) .ToListAsync(); var moduleList = await _repository.AsSugarClient().Queryable() .Where(it => !it.SystemId.Equals(mainSystem.Id) && !it.SystemId.Equals(input.id) && it.DeleteMark == null) .ToListAsync(); systemUser.ForEach(async item => { // 获取用户所有角色的菜单. var moduleIdList = authorizeList .Where(x => userRoleIdList.Contains(x.ObjectId)) .Select(s => s.ItemId); // 获取用户所有有权限的系统id. var systemId = moduleList .Where(x => moduleIdList.Contains(x.Id)) .Select(s => s.SystemId).FirstOrDefault(); if (systemId == null) systemId = mainSystem.Id; // 更新用户的系统id. var res = await _repository.AsSugarClient().Updateable() .Where(x => item.Id.Equals(x.Id)) .SetColumns(x => new UserEntity() { SystemId = systemId }).ExecuteCommandAsync(); if (!(res > 0)) throw Oops.Oh(ErrorCode.COM1001); }); var tenantId = _userManager.TenantId; var cacheKey = string.Format("{0}{1}", CommonConst.CACHEKEYONLINEUSER, tenantId); var allUserOnlineList = await _cacheManager.GetAsync>(cacheKey); var userOnlineList = allUserOnlineList.FindAll(it => systemUser.Select(s => s.Id).ToList().Contains(it.userId)); userOnlineList.ForEach(async item => { await _imHandler.SendMessageAsync(item.connectionId, new { method = "logout", msg = "此系统已被禁用" }.ToJsonString()); // 删除在线用户ID. allUserOnlineList.RemoveAll((x) => x.connectionId == item.connectionId); // 删除用户登录信息缓存. var mCacheKey = string.Format("{0}:{1}:{2}", tenantId, CommonConst.CACHEKEYUSER, item.userId); await _cacheManager.DelAsync(mCacheKey); }); await _cacheManager.SetAsync(cacheKey, allUserOnlineList); } } /// /// 删除. /// /// 主键. /// [HttpDelete("{id}")] public async Task Delete(string id) { var entity = await _repository.GetFirstAsync(x => x.Id == id && x.DeleteMark == null); if (entity == null) throw Oops.Oh(ErrorCode.COM1005); var isOk = await _repository.AsUpdateable(entity).CallEntityMethod(m => m.Delete()).UpdateColumns(it => new { it.DeleteMark, it.DeleteTime, it.DeleteUserId }).ExecuteCommandHasChangeAsync(); if (!isOk) throw Oops.Oh(ErrorCode.COM1002); } #endregion }