using Furion.DataEncryption; using Furion.DependencyInjection; using Furion.DynamicApiController; using Furion.FriendlyException; using Mapster; using Microsoft.AspNetCore.Mvc; using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; namespace Admin.NET.Core.Service { /// /// 系统用户服务 /// [ApiDescriptionSettings(Name = "系统用户", Order = 199)] public class SysUserService : IDynamicApiController, ITransient { private readonly SqlSugarRepository _sysUserRep; private readonly IUserManager _userManager; private readonly ISysCacheService _sysCacheService; private readonly SysOrgService _sysOrgService; private readonly SysUserOrgService _sysUserOrgService; private readonly SysUserRoleService _sysUserRoleService; private readonly SysUserExtOrgPosService _sysUserExtOrgPosService; public SysUserService(SqlSugarRepository sysUserRep, IUserManager userManager, ISysCacheService sysCacheService, SysOrgService sysOrgService, SysUserOrgService sysUserOrgService, SysUserRoleService sysUserRoleService, SysUserExtOrgPosService sysUserExtOrgPosService) { _sysUserRep = sysUserRep; _userManager = userManager; _sysOrgService = sysOrgService; _sysUserOrgService = sysUserOrgService; _sysUserRoleService = sysUserRoleService; _sysCacheService = sysCacheService; _sysUserExtOrgPosService = sysUserExtOrgPosService; } /// /// 获取用户分页列表 /// /// /// [HttpGet("/sysUser/pageList")] public async Task> GetUserPageList([FromQuery] PageUserInput input) { var orgList = input.OrgId > 0 ? await _sysOrgService.GetChildIdListWithSelfById(input.OrgId) : null; return await _sysUserRep.AsQueryable() .WhereIF(!string.IsNullOrWhiteSpace(input.UserName), u => u.UserName.Contains(input.UserName)) .WhereIF(!string.IsNullOrWhiteSpace(input.Phone), u => u.Phone.Contains(input.Phone)) .WhereIF(input.OrgId > 0, u => orgList.Contains(u.OrgId)) .WhereIF(!_userManager.SuperAdmin, u => u.UserType != UserTypeEnum.SuperAdmin) .ToPagedListAsync(input.Page, input.PageSize); } /// /// 增加用户 /// /// /// [HttpPost("/sysUser/add")] public async Task AddUser(AddUserInput input) { CheckDataScope(input.OrgId); // 数据范围检查 var isExist = await _sysUserRep.IsAnyAsync(u => u.UserName == input.UserName); if (isExist) throw Oops.Oh(ErrorCodeEnum.D1003); var user = input.Adapt(); user.Password = MD5Encryption.Encrypt(CommonConst.SysPassword); await _sysUserRep.InsertAsync(user); } /// /// 更新用户 /// /// /// [HttpPost("/sysUser/update")] public async Task UpdateUser(UpdateUserInput input) { CheckDataScope(input.OrgId); // 数据范围检查 var isExist = await _sysUserRep.IsAnyAsync(u => u.UserName == input.UserName && u.Id != input.Id); if (isExist) throw Oops.Oh(ErrorCodeEnum.D1003); var user = input.Adapt(); await _sysUserRep.AsUpdateable(user).IgnoreColumns(true) .IgnoreColumns(u => new { u.UserType }).ExecuteCommandAsync(); } /// /// 删除用户 /// /// /// [HttpPost("/sysUser/delete")] public async Task DeleteUser(DeleteUserInput input) { CheckDataScope(input.OrgId); // 数据范围检查 var user = await _sysUserRep.GetFirstAsync(u => u.Id == input.Id); if (user == null) throw Oops.Oh(ErrorCodeEnum.D1002); if (user.UserType == UserTypeEnum.SuperAdmin) throw Oops.Oh(ErrorCodeEnum.D1014); //if (user.UserType == UserTypeEnum.Admin) // throw Oops.Oh(ErrorCodeEnum.D1018); if (user.Id == _userManager.UserId) throw Oops.Oh(ErrorCodeEnum.D1001); await _sysUserRep.DeleteAsync(user); //// 删除用户-附属机构职位信息 await _sysUserExtOrgPosService.DeleteEmpExtByUserId(input.Id); //删除用户-角色关联信息 await _sysUserRoleService.DeleteUserRoleByUserId(input.Id); //删除用户-机构关联信息 await _sysUserOrgService.DeleteUserOrgByUserId(input.Id); } /// /// 查看用户 /// /// [HttpGet("/sysUser/detail")] public async Task GetUser(long id) { return await _sysUserRep.GetFirstAsync(u => u.Id == id); } /// /// 设置用户状态 /// /// /// [HttpPost("/sysUser/setStatus")] public async Task SetUserStatus(UserInput input) { var user = await _sysUserRep.GetFirstAsync(u => u.Id == input.Id); if (user.UserType == UserTypeEnum.SuperAdmin) throw Oops.Oh(ErrorCodeEnum.D1015); if (!Enum.IsDefined(typeof(StatusEnum), input.Status)) throw Oops.Oh(ErrorCodeEnum.D3005); user.Status = (StatusEnum)input.Status; return await _sysUserRep.AsUpdateable(user) .UpdateColumns(u => new { u.Status }).ExecuteCommandAsync(); } /// /// 授权用户角色 /// /// /// [HttpPost("/sysUser/grantRole")] public async Task GrantUserRole(UserRoleInput input) { var user = await _sysUserRep.GetFirstAsync(u => u.Id == input.Id); if (user.UserType == UserTypeEnum.SuperAdmin) throw Oops.Oh(ErrorCodeEnum.D1022); //if (user.UserType == UserTypeEnum.Admin) // throw Oops.Oh(ErrorCodeEnum.D1008); CheckDataScope(input.OrgId); // 数据范围检查 await _sysUserRoleService.GrantUserRole(input); } /// /// 授权用户机构 /// /// /// [HttpPost("/sysUser/grantOrg")] public async Task GrantUserOrg(UserOrgInput input) { await _sysCacheService.RemoveAsync(CacheConst.KeyOrgIdList + $"{input.Id}"); // 清除缓存 CheckDataScope(input.OrgId); // 数据范围检查 await _sysUserOrgService.GrantUserOrg(input); } /// /// 修改用户密码 /// /// /// [HttpPost("/sysUser/changeUserPwd")] public async Task ChangeUserPwd(ChangePwdInput input) { var user = await _sysUserRep.GetFirstAsync(u => u.Id == _userManager.UserId); if (MD5Encryption.Encrypt(input.PasswordOld) != user.Password) throw Oops.Oh(ErrorCodeEnum.D1004); user.Password = MD5Encryption.Encrypt(input.PasswordNew); return await _sysUserRep.AsUpdateable(user).UpdateColumns(u => u.Password).ExecuteCommandAsync(); } /// /// 重置用户密码 /// /// /// [HttpPost("/sysUser/resetPwd")] public async Task ResetUserPwd(ResetPwdUserInput input) { var user = await _sysUserRep.GetFirstAsync(u => u.Id == input.Id); user.Password = MD5Encryption.Encrypt(CommonConst.SysPassword); return await _sysUserRep.AsUpdateable(user).UpdateColumns(u => u.Password).ExecuteCommandAsync(); } /// /// 获取用户拥有角色 /// /// /// [HttpGet("/sysUser/ownRole")] public async Task> GetUserOwnRole([FromQuery] UserInput input) { return await _sysUserRoleService.GetUserRoleIdList(input.Id); } /// /// 获取用户拥有机构 /// /// /// [HttpGet("/sysUser/ownOrg")] public async Task> GetUserOwnOrg([FromQuery] UserInput input) { return await _sysUserOrgService.GetUserOrgIdList(input.Id); } /// /// 获取当前用户机构列表权限 /// /// [NonAction] public async Task> GetUserOrgIdList() { return await _sysOrgService.GetUserOrgIdList(); } /// /// 检查用户数据范围 /// 当有多个机构时,在登录时选择一个组织,所以组织Id/OrgId从前端传过来 /// /// /// private async void CheckDataScope(long orgId) { if (!_userManager.SuperAdmin) { var dataScopes = await GetUserOrgIdList(); if (!dataScopes.Any(u => u == orgId)) throw Oops.Oh(ErrorCodeEnum.D1013); } } } }