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
|
{
|
/// <summary>
|
/// 任务验收查询处理器
|
/// </summary>
|
public class TaskCheckReceiveQueryHandler(
|
IRepository<TaskInfo> repTaskInfo,
|
IRepository<TaskInfoUser> repTaskInfoUser,
|
IRepository<TaskInfoUserSubmit> repTaskInfoUserSubmit) :
|
IRequestHandler<GetCheckReceiveTasksQuery, GetCheckReceiveTasksQueryResult>,
|
IRequestHandler<GetCheckReceiveTaskQuery, GetCheckReceiveTaskQueryResult>,
|
IRequestHandler<GetCheckReceiveTaskUserSubmitsQuery, GetCheckReceiveTaskUserSubmitsQueryResult>,
|
IRequestHandler<GetCheckReceiveTaskUserSubmitQuery, GetCheckReceiveTaskUserSubmitQueryResult>
|
{
|
private readonly IRepository<TaskInfo> repTaskInfo = repTaskInfo;
|
private readonly IRepository<TaskInfoUser> repTaskInfoUser = repTaskInfoUser;
|
private readonly IRepository<TaskInfoUserSubmit> repTaskInfoUserSubmit = repTaskInfoUserSubmit;
|
|
/// <summary>
|
/// 查询验收任务分页列表
|
/// </summary>
|
/// <param name="request"></param>
|
/// <param name="cancellationToken"></param>
|
/// <returns></returns>
|
public async Task<GetCheckReceiveTasksQueryResult> 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 =>
|
(logier.Type == EnumUserType.Enterprise ? it.EnterpriseId == logier.EnterpriseId : true)
|
&& it.TaskInfoUsers.Any(tu =>
|
(logier.Type == EnumUserType.Personal ? tu.EnterpriseEmployee.UserId == logier.Id : true)
|
&& (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.Select(it => new GetCheckReceiveTasksQueryResultItem
|
{
|
Id = it.Id,
|
Name = it.Name,
|
Code = it.Code,
|
BillingMethod = it.BillingMethod,
|
ServiceFee = it.ServiceFee,
|
SettlementCycle = it.SettlementCycle,
|
CreatedTime = it.CreatedTime,
|
BeginTime = it.BeginTime,
|
EndTime = it.EndTime,
|
AddressName = it.AddressName,
|
LastCheckReceiveTime = it.LastCheckReceiveTime,
|
CheckReceiveStatus = logier.Type == EnumUserType.Enterprise && logier.ClientType == EnumClientType.Wxmp && request.Date.HasValue
|
? request.CheckReceiveStatus
|
: it.CheckReceiveStatus,
|
});
|
return await request.PageModel.GetPagedListAsync<GetCheckReceiveTasksQueryResult, GetCheckReceiveTasksQueryResultItem>(s, cancellationToken);
|
}
|
|
/// <summary>
|
/// 查询验收任务详情
|
/// </summary>
|
/// <param name="request"></param>
|
/// <param name="cancellationToken"></param>
|
/// <returns></returns>
|
public async Task<GetCheckReceiveTaskQueryResult> 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);
|
}
|
if (logier.Type == EnumUserType.Enterprise && 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.TaskInfo.EnterpriseId == logier.EnterpriseId
|
&& (request.CheckReceiveStatus == EnumTaskCheckReceiveStatus.WaitSubmit
|
? !it.Submits.Any(s => s.Date.Date == request.Date.Value.Date)
|
: it.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))))));
|
}
|
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 = logier.Type == EnumUserType.Enterprise && logier.ClientType == EnumClientType.Wxmp && request.Date.HasValue
|
? it.Submits
|
.Where(s => s.Date == request.Date)
|
.Select(s => (s.CheckReceiveStatus == EnumTaskUserSubmitCheckReceiveStatus.WaitSubmit
|
? EnumTaskCheckReceiveStatus.WaitSubmit
|
: s.CheckReceiveStatus == EnumTaskUserSubmitCheckReceiveStatus.WaitCheckReceive
|
? EnumTaskCheckReceiveStatus.WaitCheckReceive
|
: EnumTaskCheckReceiveStatus.Completed) as EnumTaskCheckReceiveStatus?)
|
.FirstOrDefault() ?? EnumTaskCheckReceiveStatus.WaitSubmit
|
: it.CheckReceiveStatus,
|
LastSubmitTime = it.LastSubmitTime,
|
});
|
var result = await request.PageModel.GetPagedListAsync<GetCheckReceiveTaskQueryResult, GetCheckReceiveTaskQueryResultItem>(s, cancellationToken);
|
result.ObjectData = await repTaskInfo.AsQueryable().AsNoTracking()
|
.Where(it => it.Id == request.TaskInfoId)
|
.GetDetail<TaskInfo, GetCheckReceiveTaskQueryResultObjectData>();
|
return result;
|
}
|
|
/// <summary>
|
/// 查询验收详情
|
/// </summary>
|
/// <param name="request"></param>
|
/// <param name="cancellationToken"></param>
|
/// <returns></returns>
|
public async Task<GetCheckReceiveTaskUserSubmitsQueryResult> Handle(GetCheckReceiveTaskUserSubmitsQuery request, CancellationToken cancellationToken)
|
{
|
var logier = JwtUtils.GetCurrentLogier();
|
var q = repTaskInfoUserSubmit.AsQueryable().AsNoTracking()
|
.OrderByDescending(it => it.CreatedTime)
|
.AsQueryable();
|
if (logier.Type == EnumUserType.Personal)
|
{
|
if (request.TaskInfoId == null) throw Oops.Oh(EnumErrorCodeType.s400, "请选择任务");
|
q = q.Where(it => it.TaskInfoUser.TaskInfoId == request.TaskInfoId && it.TaskInfoUser.EnterpriseEmployee.UserId == logier.Id);
|
}
|
else
|
{
|
if (request.Id == null) throw Oops.Oh(EnumErrorCodeType.s400, "请选择灵工");
|
q = q.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<GetCheckReceiveTaskUserSubmitsQueryResult, GetCheckReceiveTaskUserSubmitsQueryResultItem>(s, cancellationToken);
|
if (request.Id.HasValue)
|
{
|
result.ObjectData = await repTaskInfoUser.AsQueryable().AsNoTracking()
|
.Where(it => it.Id == request.Id)
|
.GetDetail<TaskInfoUser, GetCheckReceiveTaskUserSubmitsQueryResultObjectData>();
|
}
|
else if (request.TaskInfoId.HasValue)
|
{
|
result.ObjectData = await repTaskInfoUser.AsQueryable().AsNoTracking()
|
.Where(it => it.TaskInfoId == request.TaskInfoId)
|
.GetDetail<TaskInfoUser, GetCheckReceiveTaskUserSubmitsQueryResultObjectData>();
|
}
|
if (result.ObjectData != null)
|
{
|
result.ObjectData.EnterpriseEmployeeUser.IsBindBankCard = await repTaskInfo.Change<UserBankCard>()
|
.AsQueryable().AsNoTracking()
|
.AnyAsync(it => it.UserId == result.ObjectData.EnterpriseEmployeeUser.Id);
|
}
|
return result;
|
}
|
|
/// <summary>
|
/// 查询验收提交详情
|
/// </summary>
|
/// <param name="request"></param>
|
/// <param name="cancellationToken"></param>
|
/// <returns></returns>
|
public async Task<GetCheckReceiveTaskUserSubmitQueryResult> 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);
|
}
|
var model = await q.GetDetail<TaskInfoUserSubmit, GetCheckReceiveTaskUserSubmitQueryResult>();
|
model.Files = await repTaskInfoUserSubmit.Change<TaskInfoUserSubmitFile>().AsQueryable().AsNoTracking()
|
.Where(it => it.SubmitId == model.Id)
|
.Select(it => it.File)
|
.ToListAsync();
|
return model;
|
}
|
}
|
}
|