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);
}
}
}
}