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 TaskCheckReceiveQueryHandler(
IRepository repTaskInfo,
IRepository repTaskInfoUser,
IRepository repTaskInfoUserSubmit) :
IRequestHandler,
IRequestHandler,
IRequestHandler,
IRequestHandler
{
private readonly IRepository repTaskInfo = repTaskInfo;
private readonly IRepository repTaskInfoUser = repTaskInfoUser;
private readonly IRepository repTaskInfoUserSubmit = repTaskInfoUserSubmit;
///
/// 查询验收任务分页列表
///
///
///
///
public async Task Handle(GetCheckReceiveTasksQuery 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 (request.Keywords.IsNotNull())
{
q = q.Where(it =>
it.TaskInfoUsers.Any(tu =>
tu.EnterpriseEmployee.User.Name.Contains(request.Keywords)
|| tu.EnterpriseEmployee.User.PhoneNumber.Contains(request.Keywords)
|| tu.EnterpriseEmployee.User.Identity.Contains(request.Keywords)));
}
if (logier.ClientType == EnumClientType.Wxmp)
{
if (request.CheckReceiveStatus == null)
{
throw Oops.Oh(EnumErrorCodeType.s400, "请选择验收状态");
}
if (request.Date == null)
{
throw Oops.Oh(EnumErrorCodeType.s400, "请选择日期");
}
q = q.Where(it =>
it.TaskInfoUsers.Any(tu =>
tu.EnterpriseEmployee.UserId == logier.Id
&& (request.CheckReceiveStatus == EnumTaskCheckReceiveStatus.WaitSubmit
? !tu.Submits.Any(s => s.Date.Date == request.Date.Value.Date)
: tu.Submits.Any(s =>
s.Date.Date == request.Date.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.CheckReceiveTimeBegin.HasValue && request.CheckReceiveTimeEnd.HasValue)
{
q = q.Where(it => request.CheckReceiveTimeBegin <= it.LastCheckReceiveTime && it.LastCheckReceiveTime <= request.CheckReceiveTimeEnd);
}
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(GetCheckReceiveTaskQuery request, CancellationToken cancellationToken)
{
var logier = JwtUtils.GetCurrentLogier();
var q = repTaskInfoUser.AsQueryable().AsNoTracking()
.OrderBy(it => it.CreatedTime)
.Where(it => it.TaskInfoId == request.TaskInfoId);
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);
}
var s = q.Select(it => new GetCheckReceiveTaskQueryResultItem
{
Id = it.Id,
TaskInfoCode = it.TaskInfo.Code,
TaskInfoName = it.TaskInfo.Name,
Avatar = it.EnterpriseEmployee.User.Avatar,
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,
IsReal = it.EnterpriseEmployee.User.IsReal,
RealMethod = it.EnterpriseEmployee.User.RealMethod,
CheckReceiveStatus = it.CheckReceiveStatus,
LastSubmitTime = it.LastSubmitTime,
});
var result = await request.PageModel.GetPagedListAsync(s, cancellationToken);
result.ObjectData = await repTaskInfo.AsQueryable().AsNoTracking()
.Where(it => it.Id == request.TaskInfoId)
.GetDetail();
return result;
}
///
/// 查询验收详情
///
///
///
///
public async Task Handle(GetCheckReceiveTaskUserSubmitsQuery request, CancellationToken cancellationToken)
{
var logier = JwtUtils.GetCurrentLogier();
var q = repTaskInfoUserSubmit.AsQueryable().AsNoTracking()
.OrderByDescending(it => it.CreatedTime)
.Where(it => it.TaskInfoUserId == request.Id);
var s = q.Select(it => new GetCheckReceiveTaskUserSubmitsQueryResultItem
{
Id = it.Id,
CreatedTime = it.CreatedTime,
Files = it.Files.Select(f => f.File).ToList(),
CheckReceiveStatus = it.CheckReceiveStatus,
CheckReceiveTime = it.CheckReceiveTime,
});
var result = await request.PageModel.GetPagedListAsync(s, cancellationToken);
result.ObjectData = await repTaskInfoUser.AsQueryable().AsNoTracking()
.Where(it => it.Id == request.Id)
.GetDetail();
result.ObjectData.EnterpriseEmployeeUser.IsBindBankCard = await repTaskInfo.Change().AsQueryable().AsNoTracking()
.AnyAsync(it => it.UserId == result.ObjectData.EnterpriseEmployeeUser.Id);
return result;
}
///
/// 查询验收提交详情
///
///
///
///
public Task Handle(GetCheckReceiveTaskUserSubmitQuery request, CancellationToken cancellationToken)
{
var q = repTaskInfoUserSubmit.AsQueryable().AsNoTracking();
if (request.SubmitId.HasValue)
{
q = q.Where(it => it.Id == request.SubmitId.Value);
}
else if (request.Date.HasValue && request.TaskInfoId.HasValue)
{
q = q.Where(it => it.Date.Date == request.Date.Value.Date && it.TaskInfoUser.TaskInfoId == request.TaskInfoId.Value);
}
else if (request.Date.HasValue && request.TaskInfoUserId.HasValue)
{
q = q.Where(it => it.Date.Date == request.Date.Value.Date && it.TaskInfoUserId == request.TaskInfoUserId.Value);
}
return q.GetDetail();
}
}
}