using Aop.Api.Domain;
using FlexJobApi.Core;
using Furion.DatabaseAccessor;
using Furion.DistributedIDGenerator;
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;
using TaskInfo = FlexJobApi.Core.TaskInfo;
namespace FlexJobApi.FlexJobServer.Application
{
///
/// 任务验收查询处理器
///
public class TaskCheckReceiveQueryHandler(
IRepository repTaskInfo,
IRepository repTaskInfoUser,
IRepository repUser,
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 now = DateTime.Now;
var logier = JwtUtils.GetCurrentLogier();
IQueryable q = repTaskInfo.AsQueryable().AsNoTracking()
.OrderBy(it => it.CreatedTime);
if (logier.Type == EnumUserType.Personal)
{
q = q.Where(it => it.TaskInfoUsers.Any(tu =>
tu.EnterpriseEmployee.UserId == logier.Id
&& tu.ArrangeStatus == EnumTaskUserArrangeStatus.Complete));
}
else if (logier.Type == EnumUserType.Enterprise)
{
q = q.Where(it =>
it.EnterpriseId == logier.EnterpriseId
&& it.Status == EnumTaskStatus.Complete);
}
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.BeginTime.Date <= request.Date.Value && request.Date.Value <= it.EndTime.Date
&& 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(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);
}
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(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)
.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,
Date = it.Date,
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);
if (request.Id.HasValue)
{
result.ObjectData = await repTaskInfoUser.AsQueryable().AsNoTracking()
.Where(it => it.Id == request.Id)
.GetDetail();
}
else if (request.TaskInfoId.HasValue)
{
result.ObjectData = await repTaskInfoUser.AsQueryable().AsNoTracking()
.Where(it => it.TaskInfoId == request.TaskInfoId)
.GetDetail();
}
if (result.ObjectData != null)
{
result.ObjectData.EnterpriseEmployeeUser.IsBindBankCard = await repTaskInfo.Change()
.AsQueryable().AsNoTracking()
.AnyAsync(it => it.UserId == result.ObjectData.EnterpriseEmployeeUser.Id);
}
return result;
}
///
/// 查询验收提交详情
///
///
///
///
public async Task Handle(GetCheckReceiveTaskUserSubmitQuery request, CancellationToken cancellationToken)
{
var logier = JwtUtils.GetCurrentLogier();
TaskInfoUserSubmit? entity = null;
var q = repTaskInfoUserSubmit.AsQueryable();
if (request.SubmitId.HasValue)
{
q = q.Where(it => it.Id == request.SubmitId.Value);
entity = await q.FirstOrDefaultAsync();
if (entity == null)
{
throw Oops.Oh(EnumErrorCodeType.s404, "提交信息");
}
}
else if (request.Date.HasValue && request.TaskInfoId.HasValue)
{
var taskUser = await repTaskInfoUser.AsQueryable().AsNoTracking()
.Where(it =>
it.EnterpriseEmployee.UserId == logier.Id
&& it.TaskInfoId == request.TaskInfoId)
.FirstOrDefaultAsync();
if (taskUser == null) throw Oops.Oh(EnumErrorCodeType.s404, "任务");
q = q.Where(it =>
it.Date.Date == request.Date.Value.Date
&& it.TaskInfoUserId == taskUser.Id);
entity = await q.FirstOrDefaultAsync();
if (entity == null)
{
entity = new TaskInfoUserSubmit
{
Id = IDGen.NextID(),
TaskInfoUserId = taskUser.Id,
Date = request.Date.Value.Date,
CheckReceiveStatus = EnumTaskUserSubmitCheckReceiveStatus.WaitSubmit,
CreatedTime = DateTime.Now
};
await repTaskInfoUserSubmit.InsertAsync(entity);
}
}
else if (request.Date.HasValue && request.TaskInfoUserId.HasValue)
{
q = q.Where(it =>
it.Date.Date == request.Date.Value.Date
&& it.TaskInfoUserId == request.TaskInfoUserId.Value);
entity = await q.FirstOrDefaultAsync();
if (entity == null)
{
entity = new TaskInfoUserSubmit
{
Id = IDGen.NextID(),
TaskInfoUserId = request.TaskInfoUserId.Value,
Date = request.Date.Value.Date,
CheckReceiveStatus = EnumTaskUserSubmitCheckReceiveStatus.WaitSubmit,
CreatedTime = DateTime.Now
};
await repTaskInfoUserSubmit.InsertAsync(entity);
}
}
if (entity == null)
{
throw Oops.Oh(EnumErrorCodeType.s404, "提交信息");
}
var model = new GetCheckReceiveTaskUserSubmitQueryResult
{
Id = entity.Id,
Date = entity.Date,
CreatedTime = entity.CreatedTime,
};
model.TaskInfoUserEnterpriseEmployeeUser = await repUser.AsQueryable().AsNoTracking()
.Where(it => it.EnterpriseEmployees.Any(ee => ee.TaskInfoUsers.Any(tu => tu.Id == entity.TaskInfoUserId)))
.ProjectToType()
.FirstOrDefaultAsync();
model.Files = await repTaskInfoUserSubmit.Change().AsQueryable().AsNoTracking()
.Where(it => it.SubmitId == model.Id)
.Select(it => it.File)
.ToListAsync();
return model;
}
}
}