using FlexJobApi.Core; using Furion.DatabaseAccessor; using Furion.DistributedIDGenerator; 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.Application { /// /// 任务命令处理器 /// public class TaskInfoCommandHandler( IRepository rep ) : IRequestHandler { private readonly IRepository rep = rep; /// /// 保存任务 /// /// /// /// /// [UnitOfWork] public async Task Handle(SaveTaskInfoCommand request, CancellationToken cancellationToken) { var logier = JwtUtils.GetCurrentLogier(); return await request.SaveData( q => TaskInfoRepository.GetQueryable( rep, q => q .Include(it => it.Benefits) .Include(it => it.CredentialLimits), logier), null, (entity) => { if (request.Id == null) { entity.EnterpriseId = logier.EnterpriseId.Value; BuildCode(entity).Wait(); } entity.Benefits = request.Benefits .Select(it => new TaskInfoBenefit { BenefitCode = it }) .ToList(); entity.CredentialLimits = request.CredentialLimits .Select(it => new TaskInfoCredentialLimit { TypeCode = it }) .ToList(); request.Adapt(entity); }, 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); } } }