using FlexJobApi.Core; using Furion.DatabaseAccessor; 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 TaskUserCommandHandler( IRepository rep, IRepository repUserTaskCollect ) : IRequestHandler, IRequestHandler, IRequestHandler { private readonly IRepository rep = rep; private readonly IRepository repUserTaskCollect = repUserTaskCollect; /// /// 收藏任务 /// /// /// /// public async Task Handle(CollectTaskCommand request, CancellationToken cancellationToken) { var logier = JwtUtils.GetCurrentLogier(); var collects = await repUserTaskCollect.AsQueryable().AsNoTracking() .Where(it => request.Ids.Contains(it.TaskInfoId) && it.UserId == logier.Id) .ToListAsync(cancellationToken); if (request.IsCollect) { var addIds = request.Ids.Where(it => !collects.Any(c => c.TaskInfoId == it)).ToList(); foreach (var addId in addIds) { var entity = new UserTaskCollect { TaskInfoId = addId, UserId = logier.Id }; await repUserTaskCollect.InsertAsync(entity); } return addIds.Count; } else { await repUserTaskCollect.DeleteAsync(collects); return collects.Count; } } /// /// 报名任务 /// /// /// /// public async Task Handle(ApplyTaskCommand request, CancellationToken cancellationToken) { var logier = JwtUtils.GetCurrentLogier(); var applyIds = await rep.AsQueryable().AsNoTracking() .Where(it => request.Ids.Contains(it.TaskInfoId) && it.UserId == logier.Id) .Select(it => it.TaskInfoId) .ToListAsync(cancellationToken); var addIds = request.Ids.Where(it => !applyIds.Contains(it)).ToList(); foreach (var addId in addIds) { var entity = new TaskInfoUser { TaskInfoId = addId, UserId = logier.Id, HireStatus = EnumTaskUserHireStatus.Wait }; await rep.InsertAsync(entity); } return addIds.Count; } /// /// 任务录用 /// /// /// /// public async Task Handle(SetTaskUserHireCommand request, CancellationToken cancellationToken) { var logier = JwtUtils.GetCurrentLogier(); var entities = await rep.AsQueryable() .Where(it => it.TaskInfo.EnterpriseId == logier.Id && it.TaskInfoId == request.Id && request.UserIds.Contains(it.UserId) && it.HireStatus != request.HireStatus) .ToListAsync(cancellationToken); if (entities.IsNotNull()) { foreach (var entity in entities) { entity.HireStatus = request.HireStatus; if (entity.HireStatus == EnumTaskUserHireStatus.Pass) { entity.SignContractStatus = EnumTaskUserSignContractStatus.Pass; } } await rep.UpdateAsync(entities); } return entities.Count; } } }