using FlexJobApi.Core;
using Furion.DatabaseAccessor;
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.UserServer.Application
{
///
/// 合同模板命令处理器
///
public class ContractTemplateCommandHandler(
IRepository rep
) :
IRequestHandler,
IRequestHandler
{
private readonly IRepository rep = rep;
///
/// 保存合同模板
///
///
///
///
public async Task Handle(SaveContractTemplateCommand request, CancellationToken cancellationToken)
{
var logier = JwtUtils.GetCurrentLogier();
if (logier.Type == EnumUserType.Enterprise)
{
request.EnterpriseId = logier.EnterpriseId;
}
if (request.EnterpriseId == null) throw Oops.Oh(EnumErrorCodeType.s400, "请选择企业");
return await request.SaveData(
q => q
.Include(it => it.Values)
.Where(it => it.EnterpriseId == request.EnterpriseId && !it.IsDisabled),
it => it.EnterpriseId == request.EnterpriseId && it.Name == request.Name && !it.IsDisabled && it.Id != request.Id,
entity =>
{
request.Adapt(entity);
if (entity.Values.Count != request.Values.Count
|| entity.Values.Any(ov =>
request.Values.Count(nv =>
ov.Id == nv.Id
&& ov.Type == nv.Type
&& ov.Recorder == nv.Recorder
&& ov.UserType == nv.UserType
&& ov.Label == nv.Label
&& ov.Required == nv.Required) != 1))
{
entity.Values = request.Values.Select(it =>
{
var value = entity.Values.FirstOrDefault(v => v.Id == it.Id);
if (value == null)
{
value = new ContractTemplateValue();
}
it.Adapt(value);
return value;
}).ToList();
entity.UpdatedUserId = logier.Id;
entity.UpdatedTime = DateTime.Now;
}
if (entity.Access.HasValue && entity.TemplateId.IsNotNull())
{
if (entity.Status == EnumContractTemplateStatus.Wait)
{
entity.Status = EnumContractTemplateStatus.Completed;
entity.CompletedTime = DateTime.Now;
}
}
else
{
entity.Status = EnumContractTemplateStatus.Wait;
entity.CompletedTime = null;
}
},
cancellationToken);
}
///
/// 禁用合同模板
///
///
///
///
public async Task Handle(SetIsDisabledContractTemplateCommand request, CancellationToken cancellationToken)
{
var logier = JwtUtils.GetCurrentLogier();
return await request.SetIsDisabled(q =>
{
if (logier.Type == EnumUserType.Enterprise)
{
q = q.Where(it => it.EnterpriseId == logier.EnterpriseId);
}
return q;
}, cancellationToken);
}
}
}