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
|
{
|
/// <summary>
|
/// 任务验收命令处理器
|
/// </summary>
|
public class TaskCheckReceiveCommandHandler(
|
IRepository<TaskInfo> repTaskInfo,
|
IRepository<TaskInfoUser> repTaskInfoUser,
|
IRepository<TaskInfoUserSubmit> repTaskInfoUserSubmit
|
) :
|
IRequestHandler<SubmitCheckReceiveTaskCommand, Guid>,
|
IRequestHandler<CheckReceiveTaskCommand, Guid>,
|
IRequestHandler<ExportTaskCheckReceiveTaskUsersCommand, string>
|
{
|
private readonly IRepository<TaskInfo> repTaskInfo = repTaskInfo;
|
private readonly IRepository<TaskInfoUser> repTaskInfoUser = repTaskInfoUser;
|
private readonly IRepository<TaskInfoUserSubmit> repTaskInfoUserSubmit = repTaskInfoUserSubmit;
|
|
/// <summary>
|
/// 任务提交验收
|
/// </summary>
|
/// <param name="request"></param>
|
/// <param name="cancellationToken"></param>
|
/// <returns></returns>
|
[UnitOfWork]
|
public async Task<Guid> 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 (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;
|
}
|
}
|
|
/// <summary>
|
/// 任务验收
|
/// </summary>
|
/// <param name="request"></param>
|
/// <param name="cancellationToken"></param>
|
/// <returns></returns>
|
[UnitOfWork]
|
public async Task<Guid> 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<DateTime>();
|
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)
|
.Select(it => it.CheckReceiveStatus)
|
.ToListAsync();
|
taskUserCheckReceiveStatuses.Add(EnumTaskCheckReceiveStatus.Completed);
|
if (taskUserCheckReceiveStatuses.All(it => it == EnumTaskCheckReceiveStatus.Completed))
|
{
|
task.CheckReceiveStatus = EnumTaskCheckReceiveStatus.Completed;
|
}
|
|
await repTaskInfoUserSubmit.UpdateAsync(submit);
|
return submit.Id;
|
}
|
|
/// <summary>
|
/// 导出验收记录
|
/// </summary>
|
/// <param name="request"></param>
|
/// <param name="cancellationToken"></param>
|
/// <returns></returns>
|
public async Task<string> 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<UserBankCard>().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;
|
}
|
}
|
}
|