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; } } }