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
|
{
|
/// <summary>
|
/// 合同模板命令处理器
|
/// </summary>
|
public class ContractTemplateCommandHandler(
|
IRepository<ContractTemplate> rep
|
) :
|
IRequestHandler<SaveContractTemplateCommand, Guid>,
|
IRequestHandler<SetIsDisabledContractTemplateCommand, int>
|
{
|
private readonly IRepository<ContractTemplate> rep = rep;
|
|
/// <summary>
|
/// 保存合同模板
|
/// </summary>
|
/// <param name="request"></param>
|
/// <param name="cancellationToken"></param>
|
/// <returns></returns>
|
public async Task<Guid> 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<ContractTemplate, SaveContractTemplateCommand>(
|
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() && entity.Status == EnumContractTemplateStatus.Wait)
|
{
|
entity.Status = EnumContractTemplateStatus.Completed;
|
entity.CompletedTime = DateTime.Now;
|
}
|
},
|
cancellationToken);
|
}
|
|
/// <summary>
|
/// 禁用合同模板
|
/// </summary>
|
/// <param name="request"></param>
|
/// <param name="cancellationToken"></param>
|
/// <returns></returns>
|
public async Task<int> Handle(SetIsDisabledContractTemplateCommand request, CancellationToken cancellationToken)
|
{
|
var logier = JwtUtils.GetCurrentLogier();
|
return await request.SetIsDisabled<ContractTemplate>(q =>
|
{
|
if (logier.Type == EnumUserType.Enterprise)
|
{
|
q = q.Where(it => it.EnterpriseId == logier.EnterpriseId);
|
}
|
return q;
|
}, cancellationToken);
|
}
|
}
|
}
|