using FlexJobApi.Core; using Furion.DatabaseAccessor; using Furion.DistributedIDGenerator; 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 TaskInfoCommandHandler( IRepository rep ) : IRequestHandler, IRequestHandler, IRequestHandler, IRequestHandler { private readonly IRepository rep = rep; /// /// 保存任务 /// /// /// /// /// [UnitOfWork] public async Task Handle(SaveTaskInfoCommand request, CancellationToken cancellationToken) { var logier = JwtUtils.GetCurrentLogier(); if (logier.EnterpriseId == null) throw Oops.Oh(EnumErrorCodeType.s400, "当前登录用户必须为企业用户才可以创建任务"); var entity = await request.SaveData( q => { q = TaskInfoRepository.GetQueryable(rep, false) .Include(it => it.Benefits) .Include(it => it.CredentialLimits); return q; }, null, (entity) => { if (request.Id == null) { entity.EnterpriseId = logier.EnterpriseId.Value; entity.Status = EnumTaskStatus.Wait; entity.ReleaseStatus = EnumTaskReleaseStatus.InProcess; entity.RecommendStatus = EnumTaskRecommendStatus.No; BuildCode(entity).Wait(); } request.Adapt(entity); entity.Benefits = request.Benefits .Select(it => new TaskInfoBenefit { BenefitCode = it }) .ToList(); entity.CredentialLimits = request.CredentialLimits .Select(it => new TaskInfoCredentialLimit { TypeCode = it }) .ToList(); }, cancellationToken); return entity.Id; } /// /// 设置任务发布状态 /// /// /// /// public async Task Handle(SetTaskInfoReleaseStatusCommand request, CancellationToken cancellationToken) { var entities = await TaskInfoRepository.GetQueryable(rep, false) .Where(it => request.Ids.Contains(it.Id)) .ToListAsync(); foreach (var entity in entities) { entity.ReleaseStatus = request.ReleaseStatus; } await rep.UpdateAsync(entities); return entities.Count; } /// /// 设置任务是否推荐 /// /// /// /// public async Task Handle(SetTaskInfoRecommendStatusCommand request, CancellationToken cancellationToken) { var entities = await TaskInfoRepository.GetQueryable(rep, false) .Where(it => request.Ids.Contains(it.Id) && it.RecommendStatus != request.RecommendStatus) .ToListAsync(); if (entities.IsNotNull()) { foreach (var entity in entities) { entity.RecommendStatus = request.RecommendStatus; if (entity.RecommendStatus == EnumTaskRecommendStatus.Yes) { entity.RecommendTime = DateTime.Now; } } await rep.UpdateAsync(entities); } return entities.Count; } /// /// 删除任务 /// /// /// /// public Task Handle(DeleteTaskInfoCommand request, CancellationToken cancellationToken) { return request.DeleteData( q => { q = TaskInfoRepository.GetQueryable(rep, false); if (q.AsNoTracking().Any(it => request.Ids.Contains(it.Id) && it.Status == EnumTaskStatus.Complete)) { throw Oops.Oh(EnumErrorCodeType.s510, "已安排的任务无法删除"); } return q; }, cancellationToken); } private async Task BuildCode(TaskInfo entity) { entity.Code = $"{DateTime.Now:yyyyMMddHHmm}{new Random(IDGen.NextID().GetHashCode()).Next(1000, 9999)}"; var exist = await rep.AsQueryable().AsNoTracking() .AnyAsync(it => it.EnterpriseId == entity.EnterpriseId && it.Code == entity.Code); if (exist) await BuildCode(entity); } } }