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,
IRepository repDictionaryData
) :
IRequestHandler,
IRequestHandler
{
private readonly IRepository rep = rep;
private readonly IRepository repDictionaryData = repDictionaryData;
///
/// 查询任务详情
///
///
///
///
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 async 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.EnterpriseId.HasValue)
{
q = q.Where(it => it.EnterpriseId == request.EnterpriseId);
}
if (request.BeginTime.HasValue && request.EndTime.HasValue)
{
q = q.Where(it => request.BeginTime <= it.BeginTime && it.BeginTime <= request.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);
}
var count = new GetTaskInfosQueryResultCount
{
WaitAssignCount = await q.CountAsync(it => it.Status == EnumTaskStatus.Wait),
CompletedAssignCount = await q.CountAsync(it => it.Status == EnumTaskStatus.Complete),
InProcessReleaseCount = await q.CountAsync(it => it.ReleaseStatus == EnumTaskReleaseStatus.InProcess),
StoppedReleaseCount = await q.CountAsync(it => it.ReleaseStatus == EnumTaskReleaseStatus.Stopped),
};
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
select new GetTaskInfosQueryResultItem
{
Id = t.Id,
Name = t.Name,
Code = t.Code,
BillingMethod = t.BillingMethod,
ServiceFee = t.ServiceFee,
SettlementCycle = t.SettlementCycle,
Benefits = t.Benefits.Select(it => new GetTaskInfoQueryResultBenefit
{
BenefitCode = it.BenefitCode,
BenefitContent = it.Benefit.Content
}).ToList(),
GenderLimit = t.GenderLimit,
CredentialLimits = t.CredentialLimits.Select(it => new GetTaskInfoQueryResultCredentialLimit
{
TypeCode = it.TypeCode,
TypeContent = it.Type.Content
}).ToList(),
ProvinceCode = t.ProvinceCode,
ProvinceContent = t.Province.Content,
CityCode = t.CityCode,
CityContent = t.City.Content,
AddressName = t.AddressName,
AddressDetail = t.AddressDetail,
Latitude = t.Latitude,
Longitude = t.Longitude,
UserCount = t.Users.Count(),
Status = t.Status,
BeginTime = t.BeginTime,
EndTime = t.EndTime,
ReleaseStatus = t.ReleaseStatus,
CheckReceiveStatus = t.CheckReceiveStatus,
CreatedTime = t.CreatedTime,
RecommendStatus = t.RecommendStatus,
SettlementStatus = t.SettlementStatus
};
var result = await request.PageModel.GetPagedListAsync(s, cancellationToken);
result.Count = count;
return result;
}
}
}