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 TaskCheckReceiveCommandHandler( IRepository repTaskInfo, IRepository repTaskInfoUser, IRepository repTaskInfoUserSubmit ) : IRequestHandler, IRequestHandler, IRequestHandler { private readonly IRepository repTaskInfo = repTaskInfo; private readonly IRepository repTaskInfoUser = repTaskInfoUser; private readonly IRepository repTaskInfoUserSubmit = repTaskInfoUserSubmit; /// /// 任务提交验收 /// /// /// /// [UnitOfWork] public async Task Handle(SubmitCheckReceiveTaskCommand request, CancellationToken cancellationToken) { var now = DateTime.Now; var logier = JwtUtils.GetCurrentLogier(); var task = await repTaskInfo.AsQueryable() .FirstOrDefaultAsync(it => it.Id == request.TaskInfoId, cancellationToken); if (task == null) throw Oops.Oh(EnumErrorCodeType.s404, "任务"); if (task.Status != EnumTaskStatus.Complete) throw Oops.Oh(EnumErrorCodeType.s510, "任务暂未安排人员"); if (task.ReleaseStatus != EnumTaskReleaseStatus.InProcess) throw Oops.Oh(EnumErrorCodeType.s510, "任务已结束"); if (request.Date.Date > now.Date) throw Oops.Oh(EnumErrorCodeType.s510, "任务时间未开始"); if (task.BeginTime > request.Date.Date) throw Oops.Oh(EnumErrorCodeType.s510, "任务未开始"); if (request.Date.Date > task.EndTime) throw Oops.Oh(EnumErrorCodeType.s510, "任务已结束"); var taskUser = await repTaskInfoUser.AsQueryable() .FirstOrDefaultAsync(it => it.TaskInfoId == task.Id && it.EnterpriseEmployee.UserId == logier.Id, cancellationToken); if (taskUser == null) throw Oops.Oh(EnumErrorCodeType.s404, "报名信息"); //if (taskUser.HireStatus != EnumTaskUserHireStatus.Pass) throw Oops.Oh(EnumErrorCodeType.s510, "您未录用"); if (taskUser.ArrangeStatus != EnumTaskUserArrangeStatus.Complete) throw Oops.Oh(EnumErrorCodeType.s510, "暂未安排"); task.CheckReceiveStatus = EnumTaskCheckReceiveStatus.WaitCheckReceive; task.LastSubmitTime = now; taskUser.CheckReceiveStatus = EnumTaskCheckReceiveStatus.WaitCheckReceive; taskUser.LastSubmitTime = now; var submit = await repTaskInfoUserSubmit.AsQueryable() .Include(it => it.Files) .FirstOrDefaultAsync(it => it.TaskInfoUserId == taskUser.Id && it.Date == now.Date); if (submit == null) { submit = new TaskInfoUserSubmit { TaskInfoUserId = taskUser.Id, Date = request.Date, Files = request.Files.Select(it => new TaskInfoUserSubmitFile { File = it }).ToList(), CreatedTime = now, CheckReceiveStatus = EnumTaskUserSubmitCheckReceiveStatus.WaitCheckReceive, }; await repTaskInfoUserSubmit.InsertAsync(submit); return submit.Id; } else if (submit.CheckReceiveStatus == EnumTaskUserSubmitCheckReceiveStatus.Success) { throw Oops.Oh(EnumErrorCodeType.s510, "验收已完成,无法修改"); } else { submit.Files = request.Files.Select(it => new TaskInfoUserSubmitFile { File = it }).ToList(); submit.CheckReceiveStatus = EnumTaskUserSubmitCheckReceiveStatus.WaitCheckReceive; submit.CreatedTime = now; await repTaskInfoUserSubmit.UpdateAsync(submit); return submit.Id; } } /// /// 任务验收 /// /// /// /// [UnitOfWork] public async Task Handle(CheckReceiveTaskCommand request, CancellationToken cancellationToken) { var now = DateTime.Now; var logier = JwtUtils.GetCurrentLogier(); var submit = await repTaskInfoUserSubmit.AsQueryable() .Include(it => it.Files) .FirstOrDefaultAsync(it => it.Id == request.Id); if (submit == null) throw Oops.Oh(EnumErrorCodeType.s404, "提交信息"); var taskUser = await repTaskInfoUser.AsQueryable() .FirstOrDefaultAsync(it => it.Id == submit.TaskInfoUserId, cancellationToken); if (taskUser == null) throw Oops.Oh(EnumErrorCodeType.s404, "灵工信息"); //if (taskUser.HireStatus != EnumTaskUserHireStatus.Pass) throw Oops.Oh(EnumErrorCodeType.s510, "未录用灵工"); if (taskUser.ArrangeStatus != EnumTaskUserArrangeStatus.Complete) throw Oops.Oh(EnumErrorCodeType.s510, "未安排灵工"); var task = await repTaskInfo.AsQueryable() .FirstOrDefaultAsync(it => it.Id == taskUser.TaskInfoId && it.EnterpriseId == logier.EnterpriseId, cancellationToken); if (task == null) throw Oops.Oh(EnumErrorCodeType.s404, "任务"); if (task.Status != EnumTaskStatus.Complete) throw Oops.Oh(EnumErrorCodeType.s510, "任务暂未安排人员"); if (request.CheckReceiveStatus != EnumTaskUserSubmitCheckReceiveStatus.Success && request.CheckReceiveStatus != EnumTaskUserSubmitCheckReceiveStatus.Fail) throw Oops.Oh(EnumErrorCodeType.s400, "请选择正确的验收状态"); submit.CheckReceiveStatus = request.CheckReceiveStatus; submit.CheckReceiveTime = now; taskUser.LastCheckReceiveTime = now; task.LastCheckReceiveTime = now; var dates = new List(); for (DateTime i = task.BeginTime.Date; i <= task.EndTime.Date; i = i.AddDays(1)) { dates.Add(i); } var taskUserSubmitDates = await repTaskInfoUserSubmit.AsQueryable().AsNoTracking() .Where(it => it.TaskInfoUserId == taskUser.Id && it.Id != submit.Id && (it.CheckReceiveStatus == EnumTaskUserSubmitCheckReceiveStatus.Success || it.CheckReceiveStatus == EnumTaskUserSubmitCheckReceiveStatus.Fail)) .Select(it => it.Date) .ToListAsync(); taskUserSubmitDates.Add(submit.Date); if (dates.All(taskUserSubmitDates.Contains)) { taskUser.CheckReceiveStatus = EnumTaskCheckReceiveStatus.Completed; } var taskUserCheckReceiveStatuses = await repTaskInfoUser.AsQueryable().AsNoTracking() .Where(it => it.TaskInfoId == task.Id && it.Id != taskUser.Id && it.ArrangeStatus == EnumTaskUserArrangeStatus.Complete) .Select(it => it.CheckReceiveStatus) .ToListAsync(); taskUserCheckReceiveStatuses.Add(EnumTaskCheckReceiveStatus.Completed); if (taskUserCheckReceiveStatuses.All(it => it == EnumTaskCheckReceiveStatus.Completed)) { task.CheckReceiveStatus = EnumTaskCheckReceiveStatus.Completed; task.SettlementOrderStatus = EnumTaskSettlementOrderStatus.Wait; } await repTaskInfoUserSubmit.UpdateAsync(submit); return submit.Id; } /// /// 导出验收记录 /// /// /// /// public async Task Handle(ExportTaskCheckReceiveTaskUsersCommand request, CancellationToken cancellationToken) { var models = await repTaskInfoUserSubmit.AsQueryable().AsNoTracking() .Where(it => it.TaskInfoUser.TaskInfoId == request.Id) .Select(it => new ExportTaskCheckReceiveTaskUsersCommandModel { UserId = it.TaskInfoUser.EnterpriseEmployee.UserId!.Value, Name = it.TaskInfoUser.EnterpriseEmployee.User.Name, Identity = it.TaskInfoUser.EnterpriseEmployee.User.Identity, ContactPhoneNumber = it.TaskInfoUser.EnterpriseEmployee.User.ContactPhoneNumber, CheckReceiveStatus = it.CheckReceiveStatus, CheckReceiveTime = it.CheckReceiveTime, }) .ToListAsync(cancellationToken); if (models.IsNotNull()) { var userIds = models.DistinctSelect(it => it.UserId); var bankCards = await repTaskInfoUserSubmit.Change().AsQueryable().AsNoTracking() .Where(it => userIds.Contains(it.UserId)) .Select(it => new { it.UserId, it.Bank, it.Code }) .ToListAsync(cancellationToken); foreach (var model in models) { var bankCard = bankCards.FirstOrDefault(it => it.UserId == model.UserId); model.Bank = bankCard?.Bank; model.Code = bankCard?.Code; } } var url = await models.ExportExcelToOSS("TaskCheckReceive/Export", "验收记录.xlsx"); return url; } } }