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;
}
}
}