You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
99 lines
3.3 KiB
99 lines
3.3 KiB
using Microsoft.AspNetCore.Identity;
|
|
using Microsoft.Extensions.Logging;
|
|
using MediatR;
|
|
using CellularManagement.Domain.Entities;
|
|
using CellularManagement.Application.Features.Users.Queries.Dtos;
|
|
using Microsoft.EntityFrameworkCore;
|
|
using CellularManagement.Domain.Common;
|
|
using System.Threading.Tasks;
|
|
using System.Threading;
|
|
using System.Linq;
|
|
using System;
|
|
|
|
namespace CellularManagement.Application.Features.Users.Queries.GetAllUsers;
|
|
|
|
/// <summary>
|
|
/// 获取所有用户查询处理器
|
|
/// 处理获取系统中所有用户信息的业务逻辑
|
|
/// </summary>
|
|
public sealed class GetAllUsersQueryHandler : IRequestHandler<GetAllUsersQuery, OperationResult<GetAllUsersResponse>>
|
|
{
|
|
private readonly UserManager<AppUser> _userManager;
|
|
private readonly ILogger<GetAllUsersQueryHandler> _logger;
|
|
|
|
/// <summary>
|
|
/// 构造函数
|
|
/// </summary>
|
|
/// <param name="userManager">用户管理器,用于管理用户身份</param>
|
|
/// <param name="logger">日志记录器</param>
|
|
public GetAllUsersQueryHandler(
|
|
UserManager<AppUser> userManager,
|
|
ILogger<GetAllUsersQueryHandler> logger)
|
|
{
|
|
_userManager = userManager;
|
|
_logger = logger;
|
|
}
|
|
|
|
/// <summary>
|
|
/// 处理获取所有用户命令
|
|
/// </summary>
|
|
/// <param name="request">查询命令</param>
|
|
/// <param name="cancellationToken">取消令牌</param>
|
|
/// <returns>操作结果,包含所有用户信息列表</returns>
|
|
public async Task<OperationResult<GetAllUsersResponse>> Handle(
|
|
GetAllUsersQuery request,
|
|
CancellationToken cancellationToken)
|
|
{
|
|
try
|
|
{
|
|
// 构建基础查询
|
|
var query = _userManager.Users.AsQueryable();
|
|
|
|
// 应用条件过滤
|
|
if (!string.IsNullOrWhiteSpace(request.UserName))
|
|
{
|
|
query = query.Where(u => u.UserName.Contains(request.UserName));
|
|
}
|
|
|
|
if (!string.IsNullOrWhiteSpace(request.Email))
|
|
{
|
|
query = query.Where(u => u.Email.Contains(request.Email));
|
|
}
|
|
|
|
if (!string.IsNullOrWhiteSpace(request.PhoneNumber))
|
|
{
|
|
query = query.Where(u => u.PhoneNumber.Contains(request.PhoneNumber));
|
|
}
|
|
|
|
// 获取总记录数
|
|
var totalCount = await query.CountAsync(cancellationToken);
|
|
|
|
// 应用分页
|
|
var users = await query
|
|
.Skip((request.PageNumber - 1) * request.PageSize)
|
|
.Take(request.PageSize)
|
|
.ToListAsync(cancellationToken);
|
|
|
|
// 转换为DTO对象
|
|
var userDtos = users.Select(user => new UserDto(
|
|
user.Id,
|
|
user.UserName,
|
|
user.Email,
|
|
user.PhoneNumber)).ToList();
|
|
|
|
// 构建响应对象
|
|
var response = new GetAllUsersResponse(
|
|
userDtos,
|
|
totalCount,
|
|
request.PageNumber,
|
|
request.PageSize);
|
|
|
|
return OperationResult<GetAllUsersResponse>.CreateSuccess(response);
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
_logger.LogError(ex, "获取所有用户时发生错误");
|
|
return OperationResult<GetAllUsersResponse>.CreateFailure("获取用户列表失败");
|
|
}
|
|
}
|
|
}
|