using iWare.Wms.Core; using Furion.DatabaseAccessor; using Furion.DatabaseAccessor.Extensions; using Furion.DataEncryption; using Furion.DependencyInjection; using Furion.DynamicApiController; using Furion.FriendlyException; using Magicodes.ExporterAndImporter.Excel; using Mapster; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; using Microsoft.EntityFrameworkCore; using Yitter.IdGenerator; namespace iWare.Wms.Application { /// /// 用户服务 /// [ApiDescriptionSettings(Name = "User", Order = 150)] [Route("api")] public class SysUserService : ISysUserService, IDynamicApiController, ITransient { private readonly IRepository _sysUserRep; // 用户表仓储 private readonly ISysCacheService _sysCacheService; private readonly ISysEmpService _sysEmpService; private readonly ISysUserDataScopeService _sysUserDataScopeService; private readonly ISysUserRoleService _sysUserRoleService; private readonly ISysOrgService _sysOrgService; public SysUserService(IRepository sysUserRep, ISysCacheService sysCacheService, ISysEmpService sysEmpService, ISysUserDataScopeService sysUserDataScopeService, ISysUserRoleService sysUserRoleService, ISysOrgService sysOrgService) { _sysUserRep = sysUserRep; _sysCacheService = sysCacheService; _sysEmpService = sysEmpService; _sysUserDataScopeService = sysUserDataScopeService; _sysUserRoleService = sysUserRoleService; _sysOrgService = sysOrgService; } /// /// 分页查询用户 /// /// /// [HttpGet("sysUser/page")] public async Task> QueryUserPageList([FromQuery] UserPageInput input) { var searchValue = input.SearchValue; var pid = input.SysEmpParam.OrgId; var sysEmpRep = Db.GetRepository(); var sysOrgRep = Db.GetRepository(); var dataScopes = await GetUserDataScopeIdList(CurrentUserInfo.UserId); var users = await _sysUserRep.DetachedEntities .Join(sysEmpRep.DetachedEntities, u => u.Id, e => e.Id, (u, e) => new { u, e }) .Join(sysOrgRep.DetachedEntities, n => n.e.OrgId, o => o.Id, (n, o) => new { n, o }) .Where(!string.IsNullOrEmpty(searchValue), x => (x.n.u.Account.Contains(input.SearchValue) || x.n.u.Name.Contains(input.SearchValue) || x.n.u.Phone.Contains(input.SearchValue))) .Where(!string.IsNullOrEmpty(pid), x => (x.n.e.OrgId == long.Parse(pid) || x.o.Pids.Contains($"[{pid.Trim()}]"))) .Where(input.SearchStatus >= 0, x => x.n.u.Status == input.SearchStatus) .Where(x => x.n.u.AdminType != AdminType.SuperAdmin)//排除超级管理员 .Where(!CurrentUserInfo.IsSuperAdmin && dataScopes.Count > 0, x => dataScopes.Contains(x.n.e.OrgId)) .Select(u => u.n.u.Adapt()) .ToADPagedListAsync(input.PageNo, input.PageSize); foreach (var user in users.Rows) { user.SysEmpInfo = await _sysEmpService.GetEmpInfo(long.Parse(user.Id)); } return users; } /// /// 增加用户 /// /// /// [HttpPost("sysUser/add")] public async Task AddUser(AddUserInput input) { // 数据范围检查 CheckDataScope(input.SysEmpParam.OrgId); var isExist = await _sysUserRep.AnyAsync(u => u.Account == input.Account && !u.IsDeleted, false, true); if (isExist) throw Oops.Oh(ErrorCode.D1003); var user = input.Adapt(); user.Password = MD5Encryption.Encrypt(input.Password); if (string.IsNullOrEmpty(user.Name)) user.Name = user.Account; if (string.IsNullOrEmpty(user.NickName)) user.NickName = user.Account; var newUser = await _sysUserRep.InsertNowAsync(user); input.SysEmpParam.Id = newUser.Entity.Id.ToString(); // 增加员工信息 await _sysEmpService.AddOrUpdate(input.SysEmpParam); } /// /// 删除用户 /// /// /// [HttpPost("sysUser/delete")] public async Task DeleteUser(DeleteUserInput input) { // 数据范围检查 CheckDataScope(input.SysEmpParam.OrgId); var user = await _sysUserRep.FirstOrDefaultAsync(u => u.Id == input.Id, false); if (user == null) throw Oops.Oh(ErrorCode.D1002); if (user.AdminType == AdminType.SuperAdmin) throw Oops.Oh(ErrorCode.D1014); if (user.AdminType == AdminType.Admin) throw Oops.Oh(ErrorCode.D1018); if (user.Id == CurrentUserInfo.UserId) throw Oops.Oh(ErrorCode.D1001); // 直接删除用户 await user.DeleteAsync(); // 删除员工及附属机构职位信息 await _sysEmpService.DeleteEmpInfoByUserId(input.Id);//empId与userId相同 //删除该用户对应的用户-角色表关联信息 await _sysUserRoleService.DeleteUserRoleListByUserId(input.Id); //删除该用户对应的用户-数据范围表关联信息 await _sysUserDataScopeService.DeleteUserDataScopeListByUserId(input.Id); } /// /// 更新用户 /// /// /// [HttpPost("sysUser/edit")] public async Task UpdateUser(UpdateUserInput input) { // 数据范围检查 CheckDataScope(input.SysEmpParam.OrgId); // 排除自己并且判断与其他是否相同 var isExist = await _sysUserRep.AnyAsync(u => u.Account == input.Account && u.Id != input.Id, false); if (isExist) throw Oops.Oh(ErrorCode.D1003); var user = input.Adapt(); await user.UpdateExcludeAsync(new[] { nameof(SysUser.Password), nameof(SysUser.Status), nameof(SysUser.AdminType) }, true); input.SysEmpParam.Id = user.Id.ToString(); // 更新员工及附属机构职位信息 await _sysEmpService.AddOrUpdate(input.SysEmpParam); } /// /// 查看用户 /// /// [HttpGet("sysUser/detail")] public async Task GetUser(long id) { var user = await _sysUserRep.DetachedEntities.FirstOrDefaultAsync(u => u.Id == id); var userDto = user.Adapt(); if (userDto != null) { userDto.SysEmpInfo = await _sysEmpService.GetEmpInfo(user.Id); } return userDto; } /// /// 修改用户状态 /// /// /// [HttpPost("sysUser/changeStatus")] public async Task ChangeUserStatus(UpdateUserStatusInput input) { var user = await _sysUserRep.FirstOrDefaultAsync(u => u.Id == input.Id); if (user.AdminType == AdminType.SuperAdmin) throw Oops.Oh(ErrorCode.D1015); if (!Enum.IsDefined(typeof(CommonStatus), input.Status)) throw Oops.Oh(ErrorCode.D3005); user.Status = input.Status; } /// /// 授权用户角色 /// /// /// [HttpPost("sysUser/grantRole")] public async Task GrantUserRole(UpdateUserRoleDataInput input) { var user = await _sysUserRep.FirstOrDefaultAsync(u => u.Id == input.Id); if (user.AdminType == AdminType.SuperAdmin) throw Oops.Oh(ErrorCode.D1022); if (user.AdminType == AdminType.Admin) throw Oops.Oh(ErrorCode.D1008); // 数据范围检查 CheckDataScope(input.SysEmpParam.OrgId); await _sysUserRoleService.GrantRole(input); //删除权限,重新加载 await _sysCacheService.RemovePermission(input.Id); } /// /// 授权用户数据范围 /// /// /// [HttpPost("sysUser/grantData")] public async Task GrantUserData(UpdateUserRoleDataInput input) { // 清除缓存 await _sysCacheService.RemoveAsync(CommonConst.CACHE_KEY_DATASCOPE + $"{input.Id}"); // 数据范围检查 CheckDataScope(input.SysEmpParam.OrgId); await _sysUserDataScopeService.GrantData(input); } /// /// 更新用户信息 /// /// /// [HttpPost("sysUser/updateInfo")] public async Task UpdateUserInfo(UpdateUserBaseInfoInput input) { var user = input.Adapt(); await user.UpdateExcludeAsync(new[] { nameof(SysUser.AdminType), nameof(SysUser.LastLoginIp), nameof(SysUser.LastLoginTime) }); } /// /// 修改用户密码 /// /// /// [HttpPost("sysUser/updatePwd")] public async Task UpdateUserPwd(ChangePasswordUserInput input) { var user = await _sysUserRep.FirstOrDefaultAsync(u => u.Id == input.Id); if (MD5Encryption.Encrypt(input.Password) != user.Password) throw Oops.Oh(ErrorCode.D1004); user.Password = MD5Encryption.Encrypt(input.NewPassword); } /// /// 获取用户拥有角色 /// /// /// [HttpGet("sysUser/ownRole")] public async Task> GetUserOwnRole([FromQuery] QueryUserInput input) { return await _sysUserRoleService.GetUserRoleIdList(input.Id); } /// /// 获取用户拥有数据 /// /// /// [HttpGet("sysUser/ownData")] public async Task> GetUserOwnData([FromQuery] QueryUserInput input) { return await _sysUserDataScopeService.GetUserDataScopeIdList(input.Id); } /// /// 重置用户密码 /// /// /// [HttpPost("sysUser/resetPwd")] public async Task ResetUserPwd(QueryUserInput input) { var user = await _sysUserRep.FirstOrDefaultAsync(u => u.Id == input.Id); user.Password = MD5Encryption.Encrypt(CommonConst.DEFAULT_PASSWORD); } /// /// 修改用户头像 /// /// /// [HttpPost("sysUser/updateAvatar")] public async Task UpdateAvatar(UploadAvatarInput input) { var user = await _sysUserRep.FirstOrDefaultAsync(u => u.Id == input.Id); user.Avatar = input.Avatar.ToString(); } /// /// 获取用户选择器 /// /// /// [AllowAnonymous] //公告中需要使用,开放权限 [HttpGet("sysUser/selector")] public async Task> GetUserSelector([FromQuery] UserSelectorInput input) { var name = !string.IsNullOrEmpty(input.Name?.Trim()); var result = await _sysUserRep.DetachedEntities .Where(name, u => EF.Functions.Like(u.Name, $"%{input.Name.Trim()}%")) .Where(u => u.Status != CommonStatus.DELETED) .Where(u => u.AdminType != AdminType.SuperAdmin) .ToListAsync(); return result.Adapt>(); } /// /// 获取用户列表 /// /// [HttpGet("sysUser/userList")] public async Task> GetSysUserList() { var userOut = await _sysUserRep.DetachedEntities.ToListAsync(); return userOut.Adapt>(); } /// /// 用户导出 /// /// [HttpGet("sysUser/export")] public async Task ExportUser() { var users = await _sysUserRep.DetachedEntities.AsQueryable() .ProjectToType() .ToListAsync(); var exporter = new ExcelExporter(); var result = await exporter.ExportAsByteArray(users); var memoryStream = new MemoryStream(result); return await Task.FromResult(new FileStreamResult(memoryStream, "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet") { FileDownloadName = $"{DateTimeOffset.Now:yyyyMMdd_HHmmss}_user.xlsx" }); } /// /// 用户导入 /// /// /// [HttpPost("sysUser/import")] public async Task ImportUser(IFormFile file) { var path = Path.Combine(Path.GetTempPath(), $"{YitIdHelper.NextId()}.xlsx"); using (var stream = File.Create(path)) { await file.CopyToAsync(stream); } //var rows = MiniExcel.Query(path); // 解析 //foreach (var row in rows) //{ // var a = row.A; // var b = row.B; // // 入库等操作 //} } /// /// 根据用户Id获取用户 /// /// /// [NonAction] public async Task GetUserById(long userId) { return await _sysUserRep.DetachedEntities.FirstOrDefaultAsync(u => u.Id == userId); } /// /// 将OAuth账号转换成账号 /// /// /// /// [NonAction] public async Task SaveAuthUserToUser(AuthUserInput authUser, CreateUserInput sysUser) { var user = sysUser.Adapt(); user.AdminType = AdminType.None; // 非管理员 // oauth账号与系统账号判断 var isExist = await _sysUserRep.DetachedEntities.AnyAsync(u => u.Account == authUser.Username); user.Account = isExist ? authUser.Username + DateTime.Now.Ticks : authUser.Username; user.Name = user.NickName = authUser.Nickname; user.Email = authUser.Email; user.Sex = authUser.Gender; await user.InsertAsync(); } /// /// 获取用户数据范围(机构Id集合)并缓存 /// /// /// [NonAction] public async Task> GetUserDataScopeIdList(long userId) { var dataScopes = await _sysCacheService.GetDataScope(userId); // 先从缓存里面读取 if (dataScopes == null || dataScopes.Count < 1) { if (!CurrentUserInfo.IsSuperAdmin) { var orgId = await _sysEmpService.GetEmpOrgId(userId); // 获取该用户对应的数据范围集合 var userDataScopeIdListForUser = await _sysUserDataScopeService.GetUserDataScopeIdList(userId); // 获取该用户的角色对应的数据范围集合 var userDataScopeIdListForRole = await _sysUserRoleService.GetUserRoleDataScopeIdList(userId, orgId); dataScopes = userDataScopeIdListForUser.Concat(userDataScopeIdListForRole).Distinct().ToList(); // 并集 } else { dataScopes = await _sysOrgService.GetAllDataScopeIdList(); } await _sysCacheService.SetDataScope(userId, dataScopes); // 缓存结果 } return dataScopes; } /// /// 获取用户数据范围(机构Id集合) /// /// [NonAction] public async Task> GetUserDataScopeIdList() { var userId = CurrentUserInfo.UserId; var dataScopes = await GetUserDataScopeIdList(userId); return dataScopes; } /// /// 检查普通用户数据范围 /// 当有用户有多个组织时,在登录时选择一个组织,所以组织id(orgId)从前端传过来 /// /// /// private async void CheckDataScope(string orgId) { // 如果当前用户不是超级管理员,则进行数据范围校验 if (!CurrentUserInfo.IsSuperAdmin) { var dataScopes = await GetUserDataScopeIdList(CurrentUserInfo.UserId); if (dataScopes == null || (orgId != null && !dataScopes.Any(u => u == long.Parse(orgId)))) throw Oops.Oh(ErrorCode.D1013); } } } }