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 TaskUserSubmitQueryHandler(
IRepository repTaskInfo,
IRepository repTaskInfoUser) :
IRequestHandler,
IRequestHandler
{
private readonly IRepository repTaskInfo = repTaskInfo;
private readonly IRepository repTaskInfoUser = repTaskInfoUser;
///
/// 查询验收任务分页列表
///
///
///
///
public async Task Handle(GetCheckReceiveTaskQuery request, CancellationToken cancellationToken)
{
var logier = JwtUtils.GetCurrentLogier();
var q = repTaskInfo.AsQueryable().AsNoTracking()
.OrderBy(it => it.CreatedTime)
.AsQueryable();
if (logier.Type == EnumUserType.Personal)
{
q = q.Where(it => it.TaskInfoUsers.Any(tu => tu.EnterpriseEmployee.UserId == logier.Id));
}
else if (logier.Type == EnumUserType.Enterprise)
{
q = q.Where(it => it.EnterpriseId == logier.EnterpriseId);
}
if (logier.ClientType == EnumClientType.Wxmp)
{
if (request.CheckReceiveStatus == null)
{
throw Oops.Oh(EnumErrorCodeType.s400, "请选择验收状态");
}
if (request.DateBegin == null || request.DateEnd == null)
{
throw Oops.Oh(EnumErrorCodeType.s400, "请选择日期");
}
q = q.Where(it =>
it.TaskInfoUsers.Any(tu =>
tu.Submits.Any(s =>
request.DateBegin.Value.Date <= s.Date.Date
&& s.Date.Date <= request.DateEnd.Value.Date
&& (request.CheckReceiveStatus == EnumTaskCheckReceiveStatus.WaitSubmit
? s.CheckReceiveStatus == EnumTaskUserSubmitCheckReceiveStatus.WaitSubmit
: request.CheckReceiveStatus == EnumTaskCheckReceiveStatus.WaitCheckReceive
? s.CheckReceiveStatus == EnumTaskUserSubmitCheckReceiveStatus.WaitCheckReceive
: (s.CheckReceiveStatus == EnumTaskUserSubmitCheckReceiveStatus.Success
|| s.CheckReceiveStatus == EnumTaskUserSubmitCheckReceiveStatus.Fail)))));
}
else
{
if (request.DateBegin.HasValue && request.DateEnd.HasValue)
{
q = q.Where(it =>
it.TaskInfoUsers.Any(tu =>
tu.Submits.Any(s =>
request.DateBegin.Value.Date <= s.Date.Date
&& s.Date.Date <= request.DateEnd.Value.Date)));
}
if (request.CheckReceiveStatus.HasValue)
{
q = q.Where(it => it.CheckReceiveStatus == request.CheckReceiveStatus);
}
}
var s = q.ProjectToType();
return await request.PageModel.GetPagedListAsync(s, cancellationToken);
}
///
/// 查询验收分页列表
///
///
///
///
public async Task Handle(GetCheckReceiveTaskUserQuery request, CancellationToken cancellationToken)
{
var logier = JwtUtils.GetCurrentLogier();
var q = repTaskInfoUser.AsQueryable().AsNoTracking()
.OrderBy(it => it.CreatedTime)
.AsQueryable();
if (logier.Type == EnumUserType.Personal)
{
q = q.Where(it => it.EnterpriseEmployee.UserId == logier.Id);
}
else if (logier.Type == EnumUserType.Enterprise)
{
q = q.Where(it => it.TaskInfo.EnterpriseId == logier.EnterpriseId);
}
if (request.TaskInfoId.HasValue)
{
q = q.Where(it => it.TaskInfoId == request.TaskInfoId);
}
if (request.Keywords.IsNotNull())
{
q = q.Where(it =>
it.EnterpriseEmployee.User.Name.Contains(request.Keywords)
|| it.EnterpriseEmployee.User.ContactPhoneNumber.Contains(request.Keywords)
|| it.EnterpriseEmployee.User.Identity.Contains(request.Keywords));
}
if (logier.ClientType == EnumClientType.Wxmp)
{
if (request.CheckReceiveStatus == null)
{
throw Oops.Oh(EnumErrorCodeType.s400, "请选择验收状态");
}
if (request.DateBegin == null || request.DateEnd == null)
{
throw Oops.Oh(EnumErrorCodeType.s400, "请选择日期");
}
q = q.Where(it => it.Submits.Any(s =>
request.DateBegin.Value.Date <= s.Date.Date
&& s.Date.Date <= request.DateEnd.Value.Date
&& (request.CheckReceiveStatus == EnumTaskCheckReceiveStatus.WaitSubmit
? s.CheckReceiveStatus == EnumTaskUserSubmitCheckReceiveStatus.WaitSubmit
: request.CheckReceiveStatus == EnumTaskCheckReceiveStatus.WaitCheckReceive
? s.CheckReceiveStatus == EnumTaskUserSubmitCheckReceiveStatus.WaitCheckReceive
: (s.CheckReceiveStatus == EnumTaskUserSubmitCheckReceiveStatus.Success
|| s.CheckReceiveStatus == EnumTaskUserSubmitCheckReceiveStatus.Fail))));
}
else
{
if (request.DateBegin.HasValue && request.DateEnd.HasValue)
{
q = q.Where(it => it.Submits.Any(s =>
request.DateBegin.Value.Date <= s.Date.Date
&& s.Date.Date <= request.DateEnd.Value.Date));
}
if (request.CheckReceiveStatus.HasValue)
{
q = q.Where(it => it.CheckReceiveStatus == request.CheckReceiveStatus);
}
}
var s = q.Select(it => new GetCheckReceiveTaskUserQueryResultItem
{
Id = it.TaskInfoId,
TaskName = it.TaskInfo.Name,
BeginTime = it.TaskInfo.BeginTime,
EndTime = it.TaskInfo.EndTime,
AddressName = it.TaskInfo.AddressName,
Name = it.EnterpriseEmployee.User.Name,
Identity = it.EnterpriseEmployee.User.Identity,
Age = it.EnterpriseEmployee.User.Age,
Gender = it.EnterpriseEmployee.User.Gender,
ContactPhoneNumber = it.EnterpriseEmployee.User.ContactPhoneNumber,
CheckReceiveStatus = logier.ClientType == EnumClientType.Wxmp && request.DateBegin.HasValue && request.DateEnd.HasValue
? it.Submits
.Where(s =>
request.DateBegin.Value.Date <= s.Date.Date
&& s.Date.Date <= request.DateEnd.Value.Date)
.Select(s =>
s.CheckReceiveStatus == EnumTaskUserSubmitCheckReceiveStatus.WaitSubmit
? EnumTaskCheckReceiveStatus.WaitSubmit
: s.CheckReceiveStatus == EnumTaskUserSubmitCheckReceiveStatus.WaitCheckReceive
? EnumTaskCheckReceiveStatus.WaitCheckReceive
: EnumTaskCheckReceiveStatus.Completed)
.FirstOrDefault()
: it.CheckReceiveStatus,
LastSubmitTime = it.LastSubmitTime,
});
return await request.PageModel.GetPagedListAsync(s, cancellationToken);
}
}
}