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 TaskInfoQueryHandler( IRepository rep, IRepository repDictionaryData ) : IRequestHandler, IRequestHandler, IRequestHandler, IRequestHandler, IRequestHandler, IRequestHandler, IRequestHandler, IRequestHandler, IRequestHandler>> { private readonly IRepository rep = rep; private readonly IRepository repDictionaryData = repDictionaryData; /// /// 查询任务详情 /// /// /// /// public async Task Handle(GetTaskInfoQuery request, CancellationToken cancellationToken) { var now = DateTime.Now; var logier = JwtUtils.GetCurrentLogier(); var model = await TaskInfoRepository.GetQueryable(rep) .Where(it => it.Id == request.Id) .GetDetail(cancellationToken); model.TaskCount = await rep.AsQueryable().AsNoTracking() .Where(it => it.EnterpriseId == model.EnterpriseId && it.ReleaseStatus == EnumTaskReleaseStatus.InProcess) .CountAsync(); model.ApplyCount = await rep.Change().AsQueryable().AsNoTracking() .CountAsync(it => it.TaskInfoId == model.Id); if (logier != null && logier.Type == EnumUserType.Personal) { var taskUser = await rep.Change().AsQueryable().AsNoTracking() .Include(it => it.EnterpriseEmployee) .Where(it => it.TaskInfoId == model.Id && it.EnterpriseEmployee.UserId == logier.Id) .Select(it => new { it.Id, it.HireStatus, it.EnterpriseEmployeeId, it.EnterpriseEmployee.UserSignContractStatus }) .FirstOrDefaultAsync(); if (taskUser != null) { model.EnterpriseEmployeeId = taskUser.EnterpriseEmployeeId; model.HireStatus = taskUser.HireStatus; model.ApplyButton = taskUser.HireStatus == EnumTaskUserHireStatus.Wait ? GetTaskInfoQueryResultApplyButton.WaitHire : taskUser.UserSignContractStatus == EnumTaskUserSignContractStatus.Wait ? GetTaskInfoQueryResultApplyButton.WaitSignContract : null; model.HireButton = now < model.BeginTime ? GetTaskInfoQueryResultHireButton.Wait : model.BeginTime <= now && now <= model.EndTime ? GetTaskInfoQueryResultHireButton.InProcess : GetTaskInfoQueryResultHireButton.Completed; if (model.HireButton == GetTaskInfoQueryResultHireButton.InProcess) { var submit = await rep.Change().AsQueryable().AsNoTracking() .AnyAsync(it => it.TaskInfoUserId == taskUser.Id && it.CheckReceiveStatus >= EnumTaskUserSubmitCheckReceiveStatus.WaitCheckReceive); if (!submit) { model.HireButton = GetTaskInfoQueryResultHireButton.ApplyCheckReceive; } } } model.IsCollected = await rep.Change().AsQueryable().AsNoTracking() .AnyAsync(it => it.TaskInfoId == request.Id && it.UserId == logier.Id); } return model; } /// /// 查询开放任务分页列表 /// /// /// /// public Task Handle(GetOpenTaskInfosQuery request, CancellationToken cancellationToken) { return Handle(request.Adapt(), cancellationToken); } /// /// 查询任务分页列表 /// /// /// /// public async Task Handle(GetTaskInfosQuery request, CancellationToken cancellationToken) { var logier = JwtUtils.GetCurrentLogier(); var q = TaskInfoRepository.GetQueryable(rep, true, logier); if (request.Keywords.IsNotNull()) { q = q.Where(it => it.Name.Contains(request.Keywords)); } if (request.EnterpriseId.HasValue) { q = q.Where(it => it.EnterpriseId == request.EnterpriseId); } if (request.BeginTime.HasValue && request.EndTime.HasValue) { q = q.Where(it => request.BeginTime <= it.CreatedTime && it.CreatedTime <= request.EndTime); } if (request.CityCode.IsNotNull()) { q = q.Where(it => it.CityCode == request.CityCode); } if (request.SettlementCycle.HasValue) { q = q.Where(it => it.SettlementCycle == request.SettlementCycle); } if (request.BenefitCodes.IsNotNull()) { q = q.Where(it => it.Benefits.Any(b => request.BenefitCodes.Contains(b.BenefitCode))); } if (request.GenderLimit.HasValue) { q = q.Where(it => it.GenderLimit == request.GenderLimit); } if (logier != null && logier.Type == EnumUserType.Personal && request.IsCollected == true) { q = q.Where(it => it.TaskUserCollects.Any(c => c.UserId == logier.Id)); } var count = new GetTaskInfosQueryResultObjectData { WaitAssignCount = await q.CountAsync(it => it.ReleaseStatus == EnumTaskReleaseStatus.InProcess && it.Status == EnumTaskStatus.Wait), CompletedAssignCount = await q.CountAsync(it => it.Status == EnumTaskStatus.Complete), InProcessReleaseCount = await q.CountAsync(it => it.ReleaseStatus == EnumTaskReleaseStatus.InProcess), StoppedReleaseCount = await q.CountAsync(it => it.ReleaseStatus == EnumTaskReleaseStatus.Stopped), }; if (request.Status.HasValue) { if (request.Status == EnumTaskStatus.Wait) { q = q.Where(it => it.ReleaseStatus == EnumTaskReleaseStatus.InProcess && it.Status == EnumTaskStatus.Wait); } else { q = q.Where(it => it.Status == request.Status); } } if (request.ReleaseStatus.HasValue) { q = q.Where(it => it.ReleaseStatus == request.ReleaseStatus); } if (request.RecommendStatus.HasValue) { q = q.Where(it => it.RecommendStatus == request.RecommendStatus); } if (request.CheckReceiveStatus.HasValue) { q = q.Where(it => it.CheckReceiveStatus == request.CheckReceiveStatus); } var s = from t in q select new GetTaskInfosQueryResultItem { Id = t.Id, Name = t.Name, Code = t.Code, EnterpriseName = t.Enterprise.EnterpriseName, UserName = t.Enterprise.Users.Where(u => u.Id == t.CreatedUserId).Select(u => u.UserName).FirstOrDefault(), BillingMethod = t.BillingMethod, ServiceFee = t.ServiceFee, SettlementCycle = t.SettlementCycle, Benefits = t.Benefits.Select(it => new GetTaskInfoQueryResultBenefit { BenefitCode = it.BenefitCode, BenefitContent = it.Benefit.Content }).ToList(), GenderLimit = t.GenderLimit, CredentialLimits = t.CredentialLimits.Select(it => new GetTaskInfoQueryResultCredentialLimit { TypeCode = it.TypeCode, TypeContent = it.Type.Content }).ToList(), ProvinceCode = t.ProvinceCode, ProvinceContent = t.Province.Content, CityCode = t.CityCode, CityContent = t.City.Content, AddressName = t.AddressName, AddressDetail = t.AddressDetail, Latitude = t.Latitude, Longitude = t.Longitude, UserCount = t.TaskInfoUsers.Count(), Status = t.Status, BeginTime = t.BeginTime, EndTime = t.EndTime, ReleaseStatus = t.ReleaseStatus, CheckReceiveStatus = t.CheckReceiveStatus, CreatedTime = t.CreatedTime, RecommendStatus = t.RecommendStatus, RecommendTime = t.RecommendTime, SettlementStatus = t.SettlementStatus, HireStatus = logier != null && logier.Type == EnumUserType.Personal ? t.TaskInfoUsers .Where(tu => tu.EnterpriseEmployee.UserId == logier.Id) .Select(tu => tu.HireStatus as EnumTaskUserHireStatus?) .FirstOrDefault() : null, }; var result = await request.PageModel.GetPagedListAsync(s, cancellationToken); result.ObjectData = count; return result; } /// /// 我的报名分页列表 /// /// /// /// public async Task Handle(GetPersonalApplyTaskInfosQuery request, CancellationToken cancellationToken) { var logier = JwtUtils.GetCurrentLogier(); var q = TaskInfoRepository.GetQueryable(rep, true, logier); if (request.Status.HasValue) { switch (request.Status.Value) { case GetPersonalApplyTaskInfosQueryStatus.WaitHire: q = q.Where(it => it.TaskInfoUsers.Any(tu => tu.EnterpriseEmployee.UserId == logier.Id && tu.HireStatus == EnumTaskUserHireStatus.Wait)); break; case GetPersonalApplyTaskInfosQueryStatus.WaitSignContract: q = q.Where(it => it.TaskInfoUsers.Any(tu => tu.EnterpriseEmployee.UserId == logier.Id && tu.EnterpriseEmployee.UserSignContractStatus == EnumTaskUserSignContractStatus.Wait)); break; default: break; } } else { q = q.Where(it => it.TaskInfoUsers.Any(tu => tu.EnterpriseEmployee.UserId == logier.Id && (tu.HireStatus == EnumTaskUserHireStatus.Wait || tu.EnterpriseEmployee.UserSignContractStatus == EnumTaskUserSignContractStatus.Wait))); } var s = q.Select(it => new GetPersonalApplyTaskInfosQueryResultItem { Id = it.Id, Name = it.Name, BeginTime = it.BeginTime, EndTime = it.EndTime, BillingMethod = it.BillingMethod, ServiceFee = it.ServiceFee, SettlementCycle = it.SettlementCycle, Benefits = it.Benefits.Select(it => new GetTaskInfoQueryResultBenefit { BenefitCode = it.BenefitCode, BenefitContent = it.Benefit.Content }).ToList(), AddressName = it.AddressName, Status = it.TaskInfoUsers.Any(it => it.EnterpriseEmployee.UserId == logier.Id && it.HireStatus == EnumTaskUserHireStatus.Wait) ? GetPersonalApplyTaskInfosQueryStatus.WaitHire : GetPersonalApplyTaskInfosQueryStatus.WaitSignContract }); return await request.PageModel.GetPagedListAsync(s, cancellationToken); } /// /// 我的已录用分页列表 /// /// /// /// public async Task Handle(GetPersonalHireTaskInfosQuery request, CancellationToken cancellationToken) { var now = DateTime.Now; var logier = JwtUtils.GetCurrentLogier(); var q = TaskInfoRepository.GetQueryable(rep, true, logier).Where(it => it.TaskInfoUsers.Any(tu => tu.EnterpriseEmployee.UserId == logier.Id && tu.ArrangeStatus == EnumTaskUserArrangeStatus.Complete)); if (request.Status.HasValue) { switch (request.Status.Value) { case GetPersonalHireTaskInfosQueryStatus.Wait: q = q.Where(it => now < it.BeginTime); break; case GetPersonalHireTaskInfosQueryStatus.InProcess: q = q.Where(it => it.BeginTime <= now && now <= it.EndTime); break; case GetPersonalHireTaskInfosQueryStatus.Completed: q = q.Where(it => it.EndTime < now); break; default: break; } } var s = q.Select(it => new GetPersonalHireTaskInfosQueryResultItem { Id = it.Id, Name = it.Name, BeginTime = it.BeginTime, EndTime = it.EndTime, BillingMethod = it.BillingMethod, ServiceFee = it.ServiceFee, SettlementCycle = it.SettlementCycle, Benefits = it.Benefits.Select(it => new GetTaskInfoQueryResultBenefit { BenefitCode = it.BenefitCode, BenefitContent = it.Benefit.Content }).ToList(), AddressName = it.AddressName, Status = now < it.BeginTime ? GetPersonalHireTaskInfosQueryStatus.Wait : it.BeginTime <= now && now <= it.EndTime ? GetPersonalHireTaskInfosQueryStatus.InProcess : GetPersonalHireTaskInfosQueryStatus.Completed }); return await request.PageModel.GetPagedListAsync(s, cancellationToken); } /// /// 我的已取消分页列表 /// /// /// /// public async Task Handle(GetPersonalCancelTaskInfosQuery request, CancellationToken cancellationToken) { var now = DateTime.Now; var logier = JwtUtils.GetCurrentLogier(); var q = TaskInfoRepository.GetQueryable(rep, true, logier).Where(it => it.TaskInfoUsers.Any(tu => tu.EnterpriseEmployee.UserId == logier.Id && (tu.HireStatus == EnumTaskUserHireStatus.Refuse || tu.EnterpriseEmployee.UserSignContractStatus == EnumTaskUserSignContractStatus.Refuse || tu.EnterpriseEmployee.EnterpriseSignContractStatus == EnumTaskUserSignContractStatus.Refuse))); var s = q.Select(it => new GetPersonalCancelTaskInfosQueryResultItem { Id = it.Id, Name = it.Name, BeginTime = it.BeginTime, EndTime = it.EndTime, BillingMethod = it.BillingMethod, ServiceFee = it.ServiceFee, SettlementCycle = it.SettlementCycle, Benefits = it.Benefits.Select(it => new GetTaskInfoQueryResultBenefit { BenefitCode = it.BenefitCode, BenefitContent = it.Benefit.Content }).ToList(), AddressName = it.AddressName, }); return await request.PageModel.GetPagedListAsync(s, cancellationToken); } /// /// 查询结算任务分页列表数据 /// /// /// /// public async Task Handle(GetSettlementTasksQuery request, CancellationToken cancellationToken) { var logier = JwtUtils.GetCurrentLogier(); var q = TaskInfoRepository.GetQueryable(rep, true, logier) .Where(it => it.SettlementOrderStatus.HasValue); if (request.Keywords.IsNotNull()) { q = q.Where(it => it.Name.Contains(request.Keywords) || it.Code.Contains(request.Keywords)); } if (request.SettlementOrderStatus.HasValue) { q = q.Where(it => it.SettlementOrderStatus == request.SettlementOrderStatus); } if (request.SettlementStatus.HasValue) { q = q.Where(it => it.SettlementStatus == request.SettlementStatus); } var s = q .Select(it => new GetSettlementTasksQueryResultItem { Id = it.Id, Name = it.Name, Code = it.Code, SettlementOrderStatus = it.SettlementOrderStatus, SettlementOrderName = it.SettlementOrderName, SettlementOrderTime = it.SettlementOrderTime, ActualSettlementAmount = it.ActualSettlementAmount, SettlementAmount = it.SettlementAmount, SettlementStatus = it.SettlementStatus, SettlementTime = it.SettlementTime, SettlementRemark = it.SettlementRemark, SettlementUserCount = it.SettlementUserCount }); return await request.PageModel.GetPagedListAsync(s, cancellationToken); } /// /// 查询结算单详情 /// /// /// /// public Task Handle(GetSettlementTaskQuery request, CancellationToken cancellationToken) { var logier = JwtUtils.GetCurrentLogier(); var model = TaskInfoRepository.GetQueryable(rep, true, logier) .Where(it => it.Id == request.Id) .GetDetail(); return model; } /// /// 查询任务选择器数据 /// /// /// /// public async Task>> Handle(GetTaskSelectQuery request, CancellationToken cancellationToken) { return await request.GetSelect( it => it.Id, it => it.Name, q => { q = TaskInfoRepository.GetQueryable(rep, true); if (request.Keywords.IsNotNull()) { q = q.Where(it => it.Code.Contains(request.Keywords) || it.Name.Contains(request.Keywords)); } return q; }, cancellationToken); } } }