using FlexJobApi.Core;
using Furion.DatabaseAccessor;
using Furion.FriendlyException;
using Mapster;
using MediatR;
using Microsoft.EntityFrameworkCore;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace FlexJobApi.FlexJobServer.Application
{
///
/// 任务查询处理器
///
public class TaskInfoQueryHandler(
IRepository rep
) :
IRequestHandler,
IRequestHandler>
{
private readonly IRepository rep = rep;
///
/// 查询任务详情
///
///
///
///
public async Task Handle(GetTaskInfoQuery request, CancellationToken cancellationToken)
{
var model = await TaskInfoRepository.GetQueryable(rep)
.Where(it => it.Id == request.Id)
.ProjectToType()
.FirstOrDefaultAsync(cancellationToken);
model.TaskCount = await rep.AsQueryable().AsNoTracking()
.Where(it => it.EnterpriseId == model.EnterpriseId && it.ReleaseStatus == EnumTaskReleaseStatus.Stopped)
.CountAsync();
return model;
}
///
/// 查询任务分页列表
///
///
///
///
public Task> Handle(GetTaskInfosQuery request, CancellationToken cancellationToken)
{
var q = TaskInfoRepository.GetQueryable(rep);
if (request.Keywords.IsNotNull())
{
q = q.Where(it => it.Name.Contains(request.Keywords));
}
if (request.Time.HasValue)
{
q = q.Where(it => it.BeginTime <= request.Time && request.Time <= it.EndTime);
}
if (request.CityCode.IsNotNull())
{
q = q.Where(it => it.CityCode == request.CityCode);
}
if (request.SettlementCycle.HasValue)
{
q = q.Where(it => it.SettlementCycle == request.SettlementCycle);
}
if (request.BenefitCodes.IsNotNull())
{
q = q.Where(it => it.Benefits.Any(b => request.BenefitCodes.Contains(b.BenefitCode)));
}
if (request.GenderLimit.HasValue)
{
q = q.Where(it => it.GenderLimit == request.GenderLimit);
}
if (request.Status.HasValue)
{
q = q.Where(it => it.Status == request.Status);
}
if (request.ReleaseStatus.HasValue)
{
q = q.Where(it => it.ReleaseStatus == request.ReleaseStatus);
}
if (request.RecommendStatus.HasValue)
{
q = q.Where(it => it.RecommendStatus == request.RecommendStatus);
}
var s = from t in q
join tu in rep.Change().AsQueryable().AsNoTracking() on t.Id equals tu.TaskInfoId into tug
select new GetTaskInfosQueryResultItem
{
Id = t.Id,
Name = t.Name,
Code = t.Code,
BillingMethod = t.BillingMethod,
ServiceFee = t.ServiceFee,
SettlementCycle = t.SettlementCycle,
GenderLimit = t.GenderLimit,
UserCount = tug.Count(),
Status = t.Status,
BeginTime = t.BeginTime,
EndTime = t.EndTime,
ReleaseStatus = t.ReleaseStatus
};
return request.PageModel.GetPagedListAsync(s, cancellationToken);
}
}
}