using Furion.DatabaseAccessor.Extensions; using Microsoft.Extensions.Options; using NPOI.SS.Formula.Functions; using YBEE.EQM.Core; namespace YBEE.EQM.Application; /// /// 系统用户服务 /// public class SysUserService(IRepository userRep, IOptions options, ISysRoleUserService sysRoleUserService, ISysOrgService sysOrgService) : ISysUserService, ITransient { private readonly AuthOptions _authOptions = options.Value; /// /// 获取所有用户列表 /// /// public async Task> GetAllList() { var items = await userRep.DetachedEntities.Where(u => u.Status == CommonStatus.ENABLE) .ProjectToType() .ToListAsync(); return items; } /// /// 修改密码 /// /// /// public async Task ChangePassword(ChangeSysUserPasswordInput input) { string oldPwd = RSAEncryption.Decrypt(input.OldPassword, _authOptions.RsaPrivateKey); string newPwd = RSAEncryption.Decrypt(input.NewPassword, _authOptions.RsaPrivateKey); if (newPwd.Length < 6 || newPwd.Length > 32) { throw Oops.Oh(ErrorCode.E1006); } //if ((await _userRep.DetachedEntities.AsQueryable().ToListAsync()).Any(t => t.Id == CurrentSysUserInfo.SysUserId && AESEncryption.Decrypt(t.Password, _authOptions.AesPassword).Equals(oldPwd))) if ((await userRep.DetachedEntities.AsQueryable().ToListAsync()).Any(t => t.Id == CurrentSysUserInfo.SysUserId && PBKDF2Encryption.Compare(oldPwd, t.Password))) { var user = await userRep.FirstOrDefaultAsync(t => t.Id == CurrentSysUserInfo.SysUserId); //user.Password = AESEncryption.Encrypt(newPwd, _authOptions.AesPassword); user.Password = PBKDF2Encryption.Encrypt(newPwd); await user.UpdateIncludeNowAsync(["Password"]); } else { throw Oops.Oh(ErrorCode.E1005); } } /// /// 查询简要用户列表 /// /// /// public async Task> QueryUserSimplePageList(SysUserPageInput input) { input.SysOrgIds = await sysOrgService.GetOrgDescendantList(input.SysOrgId ?? 0); input.SysOrgId = null; var query = GetQueryBase(input); query = query.Where(!string.IsNullOrEmpty(input.SysOrgName?.Trim()), u => EF.Functions.Like(u.SysOrg.Name, $"%{input.SysOrgName}%")); var ret = await query.OrderBy(t => t.Name).ProjectToType().ToADPagedListAsync(input.PageIndex, input.PageSize); foreach (var item in ret.Items) { item.SysRoles = await sysRoleUserService.GetUserRoleList(item.Id); } return ret; } ///// ///// 更换密码加密方式 ///// ///// //public async Task UpdatePassword() //{ // var items = await userRep.Where(t => t.Id > 1).ToListAsync(); // foreach (var item in items) // { // string pwd = AESEncryption.Decrypt(item.Password, _authOptions.AesPassword); // item.Password = PBKDF2Encryption.Encrypt(pwd); // await item.UpdateIncludeAsync(["Password"]); // } //} /// /// 重置密码 /// /// 用户ID /// 新密码 public async Task ResetPassword(int id) { var item = await userRep.FirstOrDefaultAsync(t => t.Id == id) ?? throw Oops.Oh(ErrorCode.E2001); var rand = new Random(); var newPwd = $"{rand.Next(100000, 1000000)}"; item.Password = PBKDF2Encryption.Encrypt(newPwd); item.IsActivated = false; await item.UpdateIncludeNowAsync([nameof(item.Password), nameof(item.IsActivated)]); return newPwd; } /// /// 修改用户状态 /// /// /// public async Task UpdateStatus(UpdateSysUserStatusInput input) { var item = await userRep.FirstOrDefaultAsync(t => t.Id == input.Id) ?? throw Oops.Oh(ErrorCode.E2001); if (item.Status != input.Status) { item.Status = input.Status; await item.UpdateIncludeNowAsync([nameof(item.Status)]); } } #region 私有方法 private IQueryable GetQueryBase(SysUserPageInput input) { var name = !string.IsNullOrEmpty(input.Name?.Trim()); var mobile = !string.IsNullOrEmpty(input.Mobile?.Trim()); var account = !string.IsNullOrEmpty(input.Account?.Trim()); var email = !string.IsNullOrEmpty(input.Email?.Trim()); var searchValue = !string.IsNullOrEmpty(input.SearchValue?.Trim()); var query = userRep.DetachedEntities.Where(t => t.IsDeleted == false) .Where((searchValue, u => EF.Functions.Like(u.Name, $"%{input.SearchValue.Trim()}%") || EF.Functions.Like(u.Account, $"%{input.SearchValue.Trim()}%"))) .Where(name, u => EF.Functions.Like(u.Name, $"%{input.Name.Trim()}%")) .Where(mobile, u => EF.Functions.Like(u.Mobile, $"%{input.Mobile.Trim()}%")) .Where(account, u => EF.Functions.Like(u.Account, $"%{input.Account.Trim()}%")) .Where(email, u => EF.Functions.Like(u.Email, $"%{input.Email.Trim()}%")) .Where(input.SysOrgId.HasValue, t => t.SysOrgId == input.SysOrgId) .Where(input.SysOrgIds.Count > 0, t => input.SysOrgIds.Contains(t.SysOrgId)); return query; } #endregion }