SysUserService.cs 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138
  1. using Furion.DatabaseAccessor.Extensions;
  2. using Microsoft.Extensions.Options;
  3. using NPOI.SS.Formula.Functions;
  4. using YBEE.EQM.Core;
  5. namespace YBEE.EQM.Application;
  6. /// <summary>
  7. /// 系统用户服务
  8. /// </summary>
  9. public class SysUserService(IRepository<SysUser> userRep, IOptions<AuthOptions> options, ISysRoleUserService sysRoleUserService, ISysOrgService sysOrgService) : ISysUserService, ITransient
  10. {
  11. private readonly AuthOptions _authOptions = options.Value;
  12. /// <summary>
  13. /// 获取所有用户列表
  14. /// </summary>
  15. /// <returns></returns>
  16. public async Task<List<SysUserLiteOutput>> GetAllList()
  17. {
  18. var items = await userRep.DetachedEntities.Where(u => u.Status == CommonStatus.ENABLE)
  19. .ProjectToType<SysUserLiteOutput>()
  20. .ToListAsync();
  21. return items;
  22. }
  23. /// <summary>
  24. /// 修改密码
  25. /// </summary>
  26. /// <param name="input"></param>
  27. /// <returns></returns>
  28. public async Task ChangePassword(ChangeSysUserPasswordInput input)
  29. {
  30. string oldPwd = RSAEncryption.Decrypt(input.OldPassword, _authOptions.RsaPrivateKey);
  31. string newPwd = RSAEncryption.Decrypt(input.NewPassword, _authOptions.RsaPrivateKey);
  32. if (newPwd.Length < 6 || newPwd.Length > 32)
  33. {
  34. throw Oops.Oh(ErrorCode.E1006);
  35. }
  36. //if ((await _userRep.DetachedEntities.AsQueryable().ToListAsync()).Any(t => t.Id == CurrentSysUserInfo.SysUserId && AESEncryption.Decrypt(t.Password, _authOptions.AesPassword).Equals(oldPwd)))
  37. if ((await userRep.DetachedEntities.AsQueryable().ToListAsync()).Any(t => t.Id == CurrentSysUserInfo.SysUserId && PBKDF2Encryption.Compare(oldPwd, t.Password)))
  38. {
  39. var user = await userRep.FirstOrDefaultAsync(t => t.Id == CurrentSysUserInfo.SysUserId);
  40. //user.Password = AESEncryption.Encrypt(newPwd, _authOptions.AesPassword);
  41. user.Password = PBKDF2Encryption.Encrypt(newPwd);
  42. await user.UpdateIncludeNowAsync(["Password"]);
  43. }
  44. else
  45. {
  46. throw Oops.Oh(ErrorCode.E1005);
  47. }
  48. }
  49. /// <summary>
  50. /// 查询简要用户列表
  51. /// </summary>
  52. /// <param name="input"></param>
  53. /// <returns></returns>
  54. public async Task<PageResult<SysUserSimpleOutput>> QueryUserSimplePageList(SysUserPageInput input)
  55. {
  56. input.SysOrgIds = await sysOrgService.GetOrgDescendantList(input.SysOrgId ?? 0);
  57. input.SysOrgId = null;
  58. var query = GetQueryBase(input);
  59. query = query.Where(!string.IsNullOrEmpty(input.SysOrgName?.Trim()), u => EF.Functions.Like(u.SysOrg.Name, $"%{input.SysOrgName}%"));
  60. var ret = await query.OrderBy(t => t.Name).ProjectToType<SysUserSimpleOutput>().ToADPagedListAsync(input.PageIndex, input.PageSize);
  61. foreach (var item in ret.Items)
  62. {
  63. item.SysRoles = await sysRoleUserService.GetUserRoleList(item.Id);
  64. }
  65. return ret;
  66. }
  67. ///// <summary>
  68. ///// 更换密码加密方式
  69. ///// </summary>
  70. ///// <returns></returns>
  71. //public async Task UpdatePassword()
  72. //{
  73. // var items = await userRep.Where(t => t.Id > 1).ToListAsync();
  74. // foreach (var item in items)
  75. // {
  76. // string pwd = AESEncryption.Decrypt(item.Password, _authOptions.AesPassword);
  77. // item.Password = PBKDF2Encryption.Encrypt(pwd);
  78. // await item.UpdateIncludeAsync(["Password"]);
  79. // }
  80. //}
  81. /// <summary>
  82. /// 重置密码
  83. /// </summary>
  84. /// <param name="id">用户ID</param>
  85. /// <returns>新密码</returns>
  86. public async Task<string> ResetPassword(int id)
  87. {
  88. var item = await userRep.FirstOrDefaultAsync(t => t.Id == id) ?? throw Oops.Oh(ErrorCode.E2001);
  89. var rand = new Random();
  90. var newPwd = $"{rand.Next(100000, 1000000)}";
  91. item.Password = PBKDF2Encryption.Encrypt(newPwd);
  92. item.IsActivated = false;
  93. await item.UpdateIncludeNowAsync([nameof(item.Password), nameof(item.IsActivated)]);
  94. return newPwd;
  95. }
  96. /// <summary>
  97. /// 修改用户状态
  98. /// </summary>
  99. /// <param name="input"></param>
  100. /// <returns></returns>
  101. public async Task UpdateStatus(UpdateSysUserStatusInput input)
  102. {
  103. var item = await userRep.FirstOrDefaultAsync(t => t.Id == input.Id) ?? throw Oops.Oh(ErrorCode.E2001);
  104. if (item.Status != input.Status)
  105. {
  106. item.Status = input.Status;
  107. await item.UpdateIncludeNowAsync([nameof(item.Status)]);
  108. }
  109. }
  110. #region 私有方法
  111. private IQueryable<SysUser> GetQueryBase(SysUserPageInput input)
  112. {
  113. var name = !string.IsNullOrEmpty(input.Name?.Trim());
  114. var mobile = !string.IsNullOrEmpty(input.Mobile?.Trim());
  115. var account = !string.IsNullOrEmpty(input.Account?.Trim());
  116. var email = !string.IsNullOrEmpty(input.Email?.Trim());
  117. var searchValue = !string.IsNullOrEmpty(input.SearchValue?.Trim());
  118. var query = userRep.DetachedEntities.Where(t => t.IsDeleted == false)
  119. .Where((searchValue, u => EF.Functions.Like(u.Name, $"%{input.SearchValue.Trim()}%") || EF.Functions.Like(u.Account, $"%{input.SearchValue.Trim()}%")))
  120. .Where(name, u => EF.Functions.Like(u.Name, $"%{input.Name.Trim()}%"))
  121. .Where(mobile, u => EF.Functions.Like(u.Mobile, $"%{input.Mobile.Trim()}%"))
  122. .Where(account, u => EF.Functions.Like(u.Account, $"%{input.Account.Trim()}%"))
  123. .Where(email, u => EF.Functions.Like(u.Email, $"%{input.Email.Trim()}%"))
  124. .Where(input.SysOrgId.HasValue, t => t.SysOrgId == input.SysOrgId)
  125. .Where(input.SysOrgIds.Count > 0, t => input.SysOrgIds.Contains(t.SysOrgId));
  126. return query;
  127. }
  128. #endregion
  129. }