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