using FlexJobApi.Core;
using Furion.DatabaseAccessor;
using Furion.FriendlyException;
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 ApplyTaskCommandHandler(
IRepository repTaskInfoUser,
IRepository repUser,
IRepository repTaskInfo,
IRepository repEnterpriseEmployee
) :
IRequestHandler
{
private readonly IRepository repTaskInfoUser = repTaskInfoUser;
private readonly IRepository repUser = repUser;
private readonly IRepository repTaskInfo = repTaskInfo;
private readonly IRepository repEnterpriseEmployee = repEnterpriseEmployee;
///
/// 报名任务
///
///
///
///
public async Task Handle(ApplyTaskCommand request, CancellationToken cancellationToken)
{
var logier = JwtUtils.GetCurrentLogier();
var applyTaskIds = await repTaskInfoUser.AsQueryable().AsNoTracking()
.Include(it => it.TaskInfo)
.Where(it => request.Ids.Contains(it.TaskInfoId) && it.EnterpriseEmployee.UserId == logier.Id)
.Select(it => it.TaskInfoId)
.ToListAsync(cancellationToken);
var taskIds = request.Ids.Where(it => !applyTaskIds.Contains(it)).ToList();
if (taskIds.IsNotNull())
{
var user = await repUser.AsQueryable().AsNoTracking()
.Include(it => it.UserAuth)
.Where(it => it.Id == logier.Id)
.Select(it => new
{
it.Name,
it.Identity,
it.ContactPhoneNumber,
it.Gender,
it.Age,
it.UserAuth.IdentityImg,
it.UserAuth.IdentityBackImg,
it.IsReal
})
.FirstOrDefaultAsync(cancellationToken);
if (user == null) throw Oops.Oh(EnumErrorCodeType.s404, "账号");
if (!user.IsReal) throw Oops.Oh(EnumErrorCodeType.s510, "请先实名");
var tasks = await repTaskInfo.AsQueryable().AsNoTracking()
.Where(it => taskIds.Contains(it.Id))
.Select(it => new
{
it.Id,
it.EnterpriseId,
it.ReleaseStatus
})
.ToListAsync(cancellationToken);
var enterpriseIds = tasks.DistinctSelect(it => it.EnterpriseId);
var employees = await repEnterpriseEmployee.AsQueryable()
.Where(it =>
enterpriseIds.Contains(it.EnterpriseId)
&& (it.UserId == logier.Id
|| it.Name == user.Name
&& it.Identity == user.Identity))
.ToListAsync();
foreach (var taskId in taskIds)
{
var task = tasks.FirstOrDefault(it => it.Id == taskId);
if (task == null) throw Oops.Oh(EnumErrorCodeType.s404, "任务");
if (task.ReleaseStatus == EnumTaskReleaseStatus.Stopped)
throw Oops.Oh(EnumErrorCodeType.s510, "任务已停止");
var employee = employees.FirstOrDefault(it => it.EnterpriseId == task.EnterpriseId && it.UserId == logier.Id);
if (employee == null)
{
employee = employees.FirstOrDefault(it => it.EnterpriseId == task.EnterpriseId && it.Name == user.Name && it.Identity == user.Name);
}
if (employee == null)
{
employee = new EnterpriseEmployee
{
EnterpriseId = task.EnterpriseId,
UserId = logier.Id,
Name = user.Name,
Identity = user.Identity,
ContactPhoneNumber = user.ContactPhoneNumber,
Gender = user.Gender,
Age = user.Age,
IdentityImg = user.IdentityImg,
IdentityBackImg = user.IdentityBackImg,
};
await repEnterpriseEmployee.InsertAsync(employee);
}
else
{
employee.UserId = logier.Id;
await repEnterpriseEmployee.UpdateAsync(employee);
}
var entity = new TaskInfoUser
{
TaskInfoId = taskId,
EnterpriseEmployeeId = employee.Id,
HireStatus = EnumTaskUserHireStatus.Wait
};
await repTaskInfoUser.InsertAsync(entity);
}
}
return taskIds.Count;
}
}
}