using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Http; using Microsoft.Extensions.Options; using ZhonTai.Admin.Core.Attributes; using ZhonTai.Admin.Core.Configs; using ZhonTai.Common.Helpers; using ZhonTai.Admin.Core.Dto; using ZhonTai.Admin.Domain.Api; using ZhonTai.Admin.Domain.PermissionApi; using ZhonTai.Admin.Domain.Role; using ZhonTai.Admin.Domain.RolePermission; using ZhonTai.Admin.Domain.Tenant; using ZhonTai.Admin.Domain.User; using ZhonTai.Admin.Domain.UserRole; using ZhonTai.Admin.Services.Auth.Dto; using ZhonTai.Admin.Services.User.Dto; using ZhonTai.DynamicApi; using ZhonTai.DynamicApi.Attributes; using ZhonTai.Admin.Core.Helpers; using ZhonTai.Admin.Core.Consts; using ZhonTai.Admin.Domain.UserStaff; using ZhonTai.Admin.Domain.Org; using System.Data; using ZhonTai.Admin.Domain.TenantPermission; using FreeSql; using ZhonTai.Admin.Domain.User.Dto; using ZhonTai.Admin.Domain.RoleOrg; using ZhonTai.Admin.Domain.UserOrg; namespace ZhonTai.Admin.Services.User; /// /// 用户服务 /// [DynamicApi(Area = AdminConsts.AreaName)] public class UserService : BaseService, IUserService, IDynamicApi { private AppConfig _appConfig => LazyGetRequiredService(); private IUserRepository _userRepository => LazyGetRequiredService(); private IOrgRepository _orgRepository => LazyGetRequiredService(); private ITenantRepository _tenantRepository => LazyGetRequiredService(); private IApiRepository _apiRepository => LazyGetRequiredService(); private IUserStaffRepository _staffRepository => LazyGetRequiredService(); private IUserRoleRepository _userRoleRepository => LazyGetRequiredService(); private IRoleOrgRepository _roleOrgRepository => LazyGetRequiredService(); private IUserOrgRepository _userOrgRepository => LazyGetRequiredService(); public UserService() { } /// /// 查询用户 /// /// /// public async Task GetAsync(long id) { var userEntity = await _userRepository.Select .WhereDynamic(id) .IncludeMany(a => a.Roles.Select(b => new RoleEntity { Id = b.Id, Name = b.Name })) .IncludeMany(a => a.Orgs.Select(b => new OrgEntity { Id = b.Id, Name = b.Name })) .ToOneAsync(a => new { a.Id, a.UserName, a.Name, a.Mobile, a.Email, a.Roles, a.Orgs, a.OrgId, a.ManagerUserId, ManagerUserName = a.ManagerUser.Name, Staff = new { a.Staff.JobNumber, a.Staff.Sex, a.Staff.Position, a.Staff.Introduce } }); var output = Mapper.Map(userEntity); return output; } /// /// 查询分页 /// /// /// [HttpPost] public async Task> GetPageAsync(PageInput input) { var orgId = input.Filter?.OrgId; var list = await _userRepository.Select .WhereIf(orgId.HasValue && orgId > 0, a => _userOrgRepository.Where(b => b.UserId == a.Id && b.OrgId == orgId).Any()) .Where(a=>a.Type != UserType.Member) .WhereDynamicFilter(input.DynamicFilter) .Count(out var total) .OrderByDescending(true, a => a.Id) .IncludeMany(a => a.Roles.Select(b => new RoleEntity { Name = b.Name })) .Page(input.CurrentPage, input.PageSize) .ToListAsync(a => new UserGetPageOutput { Roles = a.Roles }); if(orgId.HasValue && orgId > 0) { var managerUserIds = await _userOrgRepository.Select.Where(a => a.OrgId == orgId && a.IsManager == true).ToListAsync(a => a.UserId); if (managerUserIds.Any()) { var managerUsers = list.Where(a => managerUserIds.Contains(a.Id)); foreach (var managerUser in managerUsers) { managerUser.IsManager = true; } } } var data = new PageOutput() { List = Mapper.Map>(list), Total = total }; return data; } /// /// 查询登录用户信息 /// /// /// [NonAction] public async Task GetLoginUserAsync(long id) { var output = new ResultOutput(); var entityDto = await _userRepository.Select.DisableGlobalFilter(FilterNames.Tenant) .WhereDynamic(id).ToOneAsync(); if (_appConfig.Tenant && entityDto?.TenantId.Value > 0) { var tenant = await _tenantRepository.Select.DisableGlobalFilter(FilterNames.Tenant) .WhereDynamic(entityDto.TenantId).ToOneAsync(a => new { a.TenantType, a.DbKey }); entityDto.TenantType = tenant.TenantType; entityDto.DbKey = tenant.DbKey; } return entityDto; } /// /// 获得数据权限 /// /// [NonAction] public async Task GetDataPermissionAsync() { if (!(User?.Id > 0)) { return null; } var key = CacheKeys.DataPermission + User.Id; return await Cache.GetOrSetAsync(key, async () => { using (_userRepository.DataFilter.Disable(FilterNames.Self, FilterNames.Data)) { var user = await _userRepository.Select .IncludeMany(a => a.Roles.Select(b => new RoleEntity { Id = b.Id, DataScope = b.DataScope })) .WhereDynamic(User.Id) .ToOneAsync(a => new { a.OrgId, a.Roles }); if (user == null) return null; //数据范围 DataScope dataScope = DataScope.Self; var customRoleIds = new List(); user.Roles?.ToList().ForEach(role => { if (role.DataScope == DataScope.Custom) { customRoleIds.Add(role.Id); } else if (role.DataScope <= dataScope) { dataScope = role.DataScope; } }); //部门列表 var orgIds = new List(); if (dataScope != DataScope.All) { //本部门 if (dataScope == DataScope.Dept) { orgIds.Add(user.OrgId); } //本部门和下级部门 else if (dataScope == DataScope.DeptWithChild) { orgIds = await _orgRepository .Where(a => a.Id == user.OrgId) .AsTreeCte() .ToListAsync(a => a.Id); } //指定部门 if (customRoleIds.Count > 0) { var customRoleOrgIds = await _roleOrgRepository.Select.Where(a => customRoleIds.Contains(a.RoleId)).ToListAsync(a => a.OrgId); orgIds = orgIds.Concat(customRoleOrgIds).ToList(); } } return new DataPermissionDto { OrgId = user.OrgId, OrgIds = orgIds.Distinct().ToList(), DataScope = dataScope }; } }); } /// /// 查询用户基本信息 /// /// [Login] public async Task GetBasicAsync() { if (!(User?.Id > 0)) { throw ResultOutput.Exception("未登录!"); } var data = await _userRepository.GetAsync(User.Id); return data; } /// /// 查询用户权限信息 /// /// public async Task> GetPermissionsAsync() { var key = CacheKeys.UserPermissions + User.Id; var result = await Cache.GetOrSetAsync(key, async () => { if (User.TenantAdmin) { var cloud = LazyGetRequiredService(); var db = cloud.Use(DbKeys.AppDb); return await db.Select() .Where(a => db.Select() .InnerJoin((b, c) => b.PermissionId == c.PermissionId && b.TenantId == User.TenantId) .Where((b, c) => c.ApiId == a.Id).Any()) .ToListAsync(); } return await _apiRepository .Where(a => _apiRepository.Orm.Select() .InnerJoin((b, c, d) => b.RoleId == c.RoleId && b.UserId == User.Id) .InnerJoin((b, c, d) => c.PermissionId == d.PermissionId) .Where((b, c, d) => d.ApiId == a.Id).Any()) .ToListAsync(); }); return result; } /// /// 新增用户 /// /// /// [AdminTransaction] public virtual async Task AddAsync(UserAddInput input) { if (await _userRepository.Select.AnyAsync(a => a.UserName == input.UserName)) { throw ResultOutput.Exception($"账号已存在"); } if (input.Mobile.NotNull() && await _userRepository.Select.AnyAsync(a => a.Mobile == input.Mobile)) { throw ResultOutput.Exception($"手机号已存在"); } if (input.Email.NotNull() && await _userRepository.Select.AnyAsync(a => a.Email == input.Email)) { throw ResultOutput.Exception($"邮箱已存在"); } // 用户信息 if (input.Password.IsNull()) { input.Password = _appConfig.DefaultPassword; } input.Password = MD5Encrypt.Encrypt32(input.Password); var entity = Mapper.Map(input); entity.Type = UserType.DefaultUser; var user = await _userRepository.InsertAsync(entity); var userId = user.Id; //用户角色 if (input.RoleIds != null && input.RoleIds.Any()) { var roles = input.RoleIds.Select(roleId => new UserRoleEntity { UserId = userId, RoleId = roleId }).ToList(); await _userRoleRepository.InsertAsync(roles); } // 员工信息 var staff = input.Staff == null ? new UserStaffEntity() : Mapper.Map(input.Staff); staff.Id = userId; await _staffRepository.InsertAsync(staff); //所属部门 if (input.OrgIds != null && input.OrgIds.Any()) { var orgs = input.OrgIds.Select(orgId => new UserOrgEntity { UserId = userId, OrgId = orgId }).ToList(); await _userOrgRepository.InsertAsync(orgs); } return userId; } /// /// 新增会员 /// /// /// public virtual async Task AddMemberAsync(UserAddMemberInput input) { using (_userRepository.DataFilter.DisableAll()) { if (await _userRepository.Select.AnyAsync(a => a.UserName == input.UserName)) { throw ResultOutput.Exception($"账号已存在"); } if (input.Mobile.NotNull() && await _userRepository.Select.AnyAsync(a => a.Mobile == input.Mobile)) { throw ResultOutput.Exception($"手机号已存在"); } if (input.Email.NotNull() && await _userRepository.Select.AnyAsync(a => a.Email == input.Email)) { throw ResultOutput.Exception($"邮箱已存在"); } // 用户信息 if (input.Password.IsNull()) { input.Password = _appConfig.DefaultPassword; } input.Password = MD5Encrypt.Encrypt32(input.Password); var entity = Mapper.Map(input); entity.Type = UserType.Member; var user = await _userRepository.InsertAsync(entity); return user.Id; } } /// /// 修改会员 /// /// /// [AdminTransaction] public virtual async Task UpdateMemberAsync(UserUpdateMemberInput input) { var user = await _userRepository.GetAsync(input.Id); if (!(user?.Id > 0)) { throw ResultOutput.Exception("用户不存在"); } if (await _userRepository.Select.AnyAsync(a => a.Id != input.Id && a.UserName == input.UserName)) { throw ResultOutput.Exception($"账号已存在"); } if (input.Mobile.NotNull() && await _userRepository.Select.AnyAsync(a => a.Id != input.Id && a.Mobile == input.Mobile)) { throw ResultOutput.Exception($"手机号已存在"); } if (input.Email.NotNull() && await _userRepository.Select.AnyAsync(a => a.Id != input.Id && a.Email == input.Email)) { throw ResultOutput.Exception($"邮箱已存在"); } Mapper.Map(input, user); await _userRepository.UpdateAsync(user); } /// /// 修改用户 /// /// /// [AdminTransaction] public virtual async Task UpdateAsync(UserUpdateInput input) { var user = await _userRepository.GetAsync(input.Id); if (!(user?.Id > 0)) { throw ResultOutput.Exception("用户不存在"); } if (input.Id == input.ManagerUserId) { throw ResultOutput.Exception("直属主管不能是自己"); } if (await _userRepository.Select.AnyAsync(a => a.Id != input.Id && a.UserName == input.UserName)) { throw ResultOutput.Exception($"账号已存在"); } if (input.Mobile.NotNull() && await _userRepository.Select.AnyAsync(a => a.Id != input.Id && a.Mobile == input.Mobile)) { throw ResultOutput.Exception($"手机号已存在"); } if (input.Email.NotNull() && await _userRepository.Select.AnyAsync(a => a.Id != input.Id && a.Email == input.Email)) { throw ResultOutput.Exception($"邮箱已存在"); } Mapper.Map(input, user); await _userRepository.UpdateAsync(user); var userId = user.Id; // 用户角色 await _userRoleRepository.DeleteAsync(a => a.UserId == userId); if (input.RoleIds != null && input.RoleIds.Any()) { var roles = input.RoleIds.Select(roleId => new UserRoleEntity { UserId = userId, RoleId = roleId }).ToList(); await _userRoleRepository.InsertAsync(roles); } // 员工信息 var staff = await _staffRepository.GetAsync(userId); if(staff == null) { staff = new UserStaffEntity(); } Mapper.Map(input.Staff, staff); staff.Id = userId; await _staffRepository.InsertOrUpdateAsync(staff); //所属部门 await _userOrgRepository.DeleteAsync(a => a.UserId == userId); if (input.OrgIds != null && input.OrgIds.Any()) { var orgs = input.OrgIds.Select(orgId => new UserOrgEntity { UserId = userId, OrgId = orgId }).ToList(); await _userOrgRepository.InsertAsync(orgs); } await Cache.DelAsync(CacheKeys.DataPermission + user.Id); } /// /// 更新用户基本信息 /// /// /// [Login] public async Task UpdateBasicAsync(UserUpdateBasicInput input) { var entity = await _userRepository.GetAsync(input.Id); entity = Mapper.Map(input, entity); await _userRepository.UpdateAsync(entity); } /// /// 修改用户密码 /// /// /// [Login] public async Task ChangePasswordAsync(UserChangePasswordInput input) { if (input.ConfirmPassword != input.NewPassword) { throw ResultOutput.Exception("新密码和确认密码不一致"); } var entity = await _userRepository.GetAsync(input.Id); var oldPassword = MD5Encrypt.Encrypt32(input.OldPassword); if (oldPassword != entity.Password) { throw ResultOutput.Exception("旧密码不正确"); } entity.Password = MD5Encrypt.Encrypt32(input.NewPassword); await _userRepository.UpdateAsync(entity); } /// /// 重置密码 /// /// /// public async Task ResetPasswordAsync(UserResetPasswordInput input) { var entity = await _userRepository.GetAsync(input.Id); var password = input.Password; if (password.IsNull()) { password = _appConfig.DefaultPassword; } if (password.IsNull()) { password = "111111"; } entity.Password = MD5Encrypt.Encrypt32(password); await _userRepository.UpdateAsync(entity); return password; } /// /// 设置主管 /// /// /// public async Task SetManagerAsync(UserSetManagerInput input) { var entity = await _userOrgRepository.Where(a => a.UserId == input.UserId && a.OrgId == input.OrgId).FirstAsync(); entity.IsManager = input.IsManager; await _userOrgRepository.UpdateAsync(entity); } /// /// 彻底删除用户 /// /// /// [AdminTransaction] public virtual async Task DeleteAsync(long id) { var user = await _userRepository.Select.WhereDynamic(id).ToOneAsync(a => new { a.Type }); if(user == null) { throw ResultOutput.Exception("用户不存在"); } if(user.Type == UserType.PlatformAdmin || user.Type == UserType.TenantAdmin) { throw ResultOutput.Exception("平台管理员禁止删除"); } //删除用户角色 await _userRoleRepository.DeleteAsync(a => a.UserId == id); //删除用户所属部门 await _userOrgRepository.DeleteAsync(a => a.UserId == id); //删除员工 await _staffRepository.DeleteAsync(a => a.Id == id); //删除用户 await _userRepository.DeleteAsync(a => a.Id == id); await Cache.DelAsync(CacheKeys.DataPermission + id); } /// /// 批量彻底删除用户 /// /// /// [AdminTransaction] public virtual async Task BatchDeleteAsync(long[] ids) { var admin = await _userRepository.Select.Where(a => ids.Contains(a.Id) && (a.Type == UserType.PlatformAdmin || a.Type == UserType.TenantAdmin)).AnyAsync(); if (admin) { throw ResultOutput.Exception("平台管理员禁止删除"); } //删除用户角色 await _userRoleRepository.DeleteAsync(a => ids.Contains(a.UserId)); //删除用户所属部门 await _userOrgRepository.DeleteAsync(a => ids.Contains(a.UserId)); //删除员工 await _staffRepository.DeleteAsync(a => ids.Contains(a.Id)); //删除用户 await _userRepository.DeleteAsync(a => ids.Contains(a.Id)); foreach (var userId in ids) { await Cache.DelAsync(CacheKeys.DataPermission + userId); } } /// /// 删除用户 /// /// /// [AdminTransaction] public virtual async Task SoftDeleteAsync(long id) { var user = await _userRepository.Select.WhereDynamic(id).ToOneAsync(a => new { a.Type }); if (user == null) { throw ResultOutput.Exception("用户不存在"); } if (user.Type == UserType.PlatformAdmin || user.Type == UserType.TenantAdmin) { throw ResultOutput.Exception("平台管理员禁止删除"); } await _userRoleRepository.DeleteAsync(a => a.UserId == id); await _userOrgRepository.DeleteAsync(a => a.UserId == id); await _staffRepository.SoftDeleteAsync(a => a.Id == id); await _userRepository.SoftDeleteAsync(id); await Cache.DelAsync(CacheKeys.DataPermission + id); } /// /// 批量删除用户 /// /// /// [AdminTransaction] public virtual async Task BatchSoftDeleteAsync(long[] ids) { var admin = await _userRepository.Select.Where(a => ids.Contains(a.Id) && (a.Type == UserType.PlatformAdmin || a.Type == UserType.TenantAdmin)).AnyAsync(); if (admin) { throw ResultOutput.Exception("平台管理员禁止删除"); } await _userRoleRepository.DeleteAsync(a => ids.Contains(a.UserId)); await _userOrgRepository.DeleteAsync(a => ids.Contains(a.UserId)); await _staffRepository.SoftDeleteAsync(a => ids.Contains(a.Id)); await _userRepository.SoftDeleteAsync(ids); foreach (var userId in ids) { await Cache.DelAsync(CacheKeys.DataPermission + userId); } } /// /// 上传头像 /// /// /// [HttpPost] [Login] public async Task AvatarUpload([FromForm] IFormFile file) { var uploadConfig = LazyGetRequiredService>().CurrentValue; var uploadHelper = LazyGetRequiredService(); var config = uploadConfig.Avatar; var fileInfo = await uploadHelper.UploadAsync(file, config, new { User.Id }); return fileInfo.FileRelativePath; } }