using FlexJobApi.Core;
using Furion.DatabaseAccessor;
using MediatR;
using Microsoft.EntityFrameworkCore;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace FlexJobApi.User.Application
{
///
/// 获取运营端用户分页列表
///
public class GetOperationUserInfosQueryHandler(
IRepository repUser,
IRepository repUserInfoRole
) : IRequestHandler>
{
private readonly IRepository repUser = repUser;
private readonly IRepository repUserInfoRole = repUserInfoRole;
///
public async Task> Handle(GetOperationUserInfosQuery request, CancellationToken cancellationToken)
{
var q = repUser.AsQueryable().AsNoTracking()
.OrderByDescending(it => it.Level).ThenByDescending(it => it.CreatedTime)
.Where(it => it.Type == EnumUserType.Operation);
if (request.Keywords.IsNotNull())
{
q = q.Where(it =>
it.UserAuth.Name.Contains(request.Keywords)
|| it.UserAuth.UserName.Contains(request.Keywords)
|| it.UserAuth.PhoneNumber.Contains(request.Keywords)
|| it.Remark.Contains(request.Keywords));
}
var result = await q
.Select(it => new GetOperationUserInfosQueryResultItem
{
Id = it.Id,
Name = it.UserAuth.Name,
UserName = it.UserAuth.UserName,
PhoneNumber = it.UserAuth.PhoneNumber,
Remark = it.Remark
})
.ToPagedListAsync(request.PageModel, cancellationToken);
if (result.Data.Any())
{
var ids = result.Data.DistinctSelect(it => it.Id);
var userRoles = await repUserInfoRole.AsQueryable().AsNoTracking()
.Include(it => it.Role)
.Where(it => ids.Contains(it.UserInfoId))
.Select(it => new GetOperationUserInfosQueryResultItemRole
{
UserInfoId = it.UserInfoId,
Id = it.RoleId,
Name = it.Role.Name
})
.ToListAsync(cancellationToken);
foreach (var item in result.Data)
{
item.Roles = userRoles.Where(it => it.UserInfoId == item.Id).ToList();
}
}
return result;
}
}
}