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 TaskInfoQueryHandler(
|
IRepository<TaskInfo> rep,
|
IRepository<DictionaryData> repDictionaryData
|
) :
|
IRequestHandler<GetTaskInfoQuery, GetTaskInfoQueryResult>,
|
IRequestHandler<GetOpenTaskInfosQuery, GetTaskInfosQueryResult>,
|
IRequestHandler<GetTaskInfosQuery, GetTaskInfosQueryResult>,
|
IRequestHandler<GetPersonalApplyTaskInfosQuery, GetPersonalApplyTaskInfosQueryResult>,
|
IRequestHandler<GetPersonalHireTaskInfosQuery, GetPersonalHireTaskInfosQueryResult>,
|
IRequestHandler<GetPersonalCancelTaskInfosQuery, GetPersonalCancelTaskInfosQueryResult>
|
|
{
|
private readonly IRepository<TaskInfo> rep = rep;
|
private readonly IRepository<DictionaryData> repDictionaryData = repDictionaryData;
|
|
/// <summary>
|
/// 查询任务详情
|
/// </summary>
|
/// <param name="request"></param>
|
/// <param name="cancellationToken"></param>
|
/// <returns></returns>
|
public async Task<GetTaskInfoQueryResult> 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<TaskInfo, GetTaskInfoQueryResult>(cancellationToken);
|
model.TaskCount = await rep.AsQueryable().AsNoTracking()
|
.Where(it => it.EnterpriseId == model.EnterpriseId && it.ReleaseStatus == EnumTaskReleaseStatus.InProcess)
|
.CountAsync();
|
model.ApplyCount = await rep.Change<TaskInfoUser>().AsQueryable().AsNoTracking()
|
.CountAsync(it => it.TaskInfoId == model.Id);
|
if (logier != null && logier.Type == EnumUserType.Personal)
|
{
|
var taskUser = await rep.Change<TaskInfoUser>().AsQueryable().AsNoTracking()
|
.Include(it => it.EnterpriseEmployee)
|
.Where(it => it.TaskInfoId == model.Id && it.EnterpriseEmployee.UserId == logier.Id)
|
.Select(it => new
|
{
|
it.Id,
|
it.EnterpriseEmployee.HireStatus,
|
it.EnterpriseEmployee.UserSignContractStatus
|
})
|
.FirstOrDefaultAsync();
|
if (taskUser != null)
|
{
|
model.HireStatus = taskUser.HireStatus;
|
model.ApplyButton = taskUser.HireStatus == EnumTaskUserHireStatus.Wait
|
? GetTaskInfoQueryResultApplyButton.WaitHire
|
: taskUser.UserSignContractStatus == EnumTaskUserSignContractStatus.Wait
|
? GetTaskInfoQueryResultApplyButton.WaitSignContract
|
: null;
|
model.HireButton = now <= model.EndTime
|
? GetTaskInfoQueryResultHireButton.InProcess
|
: GetTaskInfoQueryResultHireButton.Completed;
|
if (model.HireButton == GetTaskInfoQueryResultHireButton.InProcess && model.BeginTime <= now)
|
{
|
var submit = await rep.Change<TaskInfoUserSubmit>().AsQueryable().AsNoTracking()
|
.AnyAsync(it => it.TaskInfoUserId == taskUser.Id && it.CheckReceiveStatus >= EnumTaskUserSubmitCheckReceiveStatus.WaitCheckReceive);
|
if (!submit)
|
{
|
model.HireButton = GetTaskInfoQueryResultHireButton.ApplyCheckReceive;
|
}
|
}
|
}
|
model.IsCollected = await rep.Change<TaskUserCollect>().AsQueryable().AsNoTracking()
|
.AnyAsync(it => it.TaskInfoId == request.Id && it.UserId == logier.Id);
|
}
|
return model;
|
}
|
|
/// <summary>
|
/// 查询开放任务分页列表
|
/// </summary>
|
/// <param name="request"></param>
|
/// <param name="cancellationToken"></param>
|
/// <returns></returns>
|
public Task<GetTaskInfosQueryResult> Handle(GetOpenTaskInfosQuery request, CancellationToken cancellationToken)
|
{
|
return Handle(request.Adapt<GetTaskInfosQuery>(), cancellationToken);
|
}
|
|
/// <summary>
|
/// 查询任务分页列表
|
/// </summary>
|
/// <param name="request"></param>
|
/// <param name="cancellationToken"></param>
|
/// <returns></returns>
|
public async Task<GetTaskInfosQueryResult> 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.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)
|
{
|
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,
|
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,
|
SettlementStatus = t.SettlementStatus,
|
};
|
var result = await request.PageModel.GetPagedListAsync<GetTaskInfosQueryResult, GetTaskInfosQueryResultItem>(s, cancellationToken);
|
result.ObjectData = count;
|
return result;
|
}
|
|
/// <summary>
|
/// 我的报名分页列表
|
/// </summary>
|
/// <param name="request"></param>
|
/// <param name="cancellationToken"></param>
|
/// <returns></returns>
|
public async Task<GetPersonalApplyTaskInfosQueryResult> 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.EnterpriseEmployee.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.EnterpriseEmployee.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.EnterpriseEmployee.HireStatus == EnumTaskUserHireStatus.Wait)
|
? GetPersonalApplyTaskInfosQueryStatus.WaitHire
|
: GetPersonalApplyTaskInfosQueryStatus.WaitSignContract
|
});
|
return await request.PageModel.GetPagedListAsync<GetPersonalApplyTaskInfosQueryResult, GetPersonalApplyTaskInfosQueryResultItem>(s, cancellationToken);
|
}
|
|
/// <summary>
|
/// 我的已录用分页列表
|
/// </summary>
|
/// <param name="request"></param>
|
/// <param name="cancellationToken"></param>
|
/// <returns></returns>
|
public async Task<GetPersonalHireTaskInfosQueryResult> 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.InProcess:
|
q = q.Where(it => 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.EndTime
|
? GetPersonalHireTaskInfosQueryStatus.InProcess
|
: GetPersonalHireTaskInfosQueryStatus.Completed
|
});
|
return await request.PageModel.GetPagedListAsync<GetPersonalHireTaskInfosQueryResult, GetPersonalHireTaskInfosQueryResultItem>(s, cancellationToken);
|
}
|
|
/// <summary>
|
/// 我的已取消分页列表
|
/// </summary>
|
/// <param name="request"></param>
|
/// <param name="cancellationToken"></param>
|
/// <returns></returns>
|
public async Task<GetPersonalCancelTaskInfosQueryResult> 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.EnterpriseEmployee.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<GetPersonalCancelTaskInfosQueryResult, GetPersonalCancelTaskInfosQueryResultItem>(s, cancellationToken);
|
}
|
|
}
|
}
|