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