using Azure.Core;
|
using FlexJobApi.Core;
|
using FlexJobApi.Core.Models.ElectronSignServer.Common;
|
using FlexJobApi.Core.Models.ElectronSignServer.ContractTemplates;
|
using FlexJobApi.Core.Models.ElectronSignServer.PersonalUserReals;
|
using FlexJobApi.Core.Models.ElectronSignServer.Users;
|
using Furion;
|
using Furion.DatabaseAccessor;
|
using Furion.FriendlyException;
|
using Mapster;
|
using MediatR;
|
using Microsoft.AspNetCore.Components.Forms;
|
using Microsoft.EntityFrameworkCore;
|
using System;
|
using System.Collections.Generic;
|
using System.Linq;
|
using System.Text;
|
using System.Threading.Tasks;
|
using static Microsoft.EntityFrameworkCore.DbLoggerCategory;
|
|
namespace FlexJobApi.UserServer.Application
|
{
|
/// <summary>
|
/// 合同模板命令处理器
|
/// </summary>
|
public class ContractTemplateCommandHandler(
|
IMediator mediator,
|
IRepository<ContractTemplate> rep,
|
WxmpUtils wxmpUtils
|
) :
|
IRequestHandler<SaveContractTemplateCommand, Guid>,
|
IRequestHandler<SaveContractTemplateValuesCommand, Guid>,
|
IRequestHandler<SetIsDisabledContractTemplateCommand, int>,
|
IRequestHandler<CheckContractTemplateCommand, bool>
|
{
|
private readonly IMediator mediator = mediator;
|
private readonly IRepository<ContractTemplate> rep = rep;
|
private readonly WxmpUtils wxmpUtils = wxmpUtils;
|
|
/// <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, "请选择企业");
|
|
if (request.Code.IsNotNull())
|
{
|
var existCode = await rep.AsQueryable().AsNoTracking()
|
.AnyAsync(it => it.Code == request.Code && !it.IsDisabled && it.Id != request.Id);
|
if (existCode) throw Oops.Oh(EnumErrorCodeType.s405, "业务编码");
|
}
|
|
if (request.Access.HasValue)
|
{
|
await mediator.Send(new CheckElectronSignAccessEnabledsCommand
|
{
|
Accesses = new List<EnumElectronSignAccess>
|
{
|
request.Access.Value
|
}
|
}, cancellationToken);
|
}
|
|
var entity = await request.SaveData<ContractTemplate, SaveContractTemplateCommand>(
|
q => q
|
.Include(it => it.Values)
|
.Where(it => it.EnterpriseId == request.EnterpriseId && !it.IsDisabled),
|
null,
|
entity =>
|
{
|
if (entity.Code.IsNotNull() && entity.Name.IsNotNull() && (entity.Code != request.Code || entity.Name != request.Name || entity.WxmpQrCode.IsNull()))
|
{
|
entity.WxmpQrCode = wxmpUtils.GetQrCodeOssUrl(new WxmpGetQrCodeCommand
|
{
|
UserType = EnumUserType.Personal,
|
OssScene = "Wxmp/QrCode/ContractTemplate",
|
OssFileName = $"{request.Name}.png",
|
Page = "subpackages/mine/mineAgreementSignDetail/mineAgreementSignDetail",
|
CheckPath = false,
|
Scene = $"{request.Code}",
|
}).Result;
|
}
|
|
request.Adapt(entity);
|
|
if (request.Id == null)
|
{
|
entity.Status = EnumContractTemplateStatus.Wait;
|
}
|
else if (entity.Access.HasValue && entity.TemplateId.IsNotNull() && entity.Values.IsNotNull())
|
{
|
entity.Status = EnumContractTemplateStatus.Completed;
|
entity.CompletedTime = DateTime.Now;
|
}
|
},
|
cancellationToken);
|
|
await SyncElectronSignContractTemplate(entity);
|
|
return entity.Id;
|
}
|
|
/// <summary>
|
/// 合同制版
|
/// </summary>
|
/// <param name="request"></param>
|
/// <param name="cancellationToken"></param>
|
/// <returns></returns>
|
public async Task<Guid> Handle(SaveContractTemplateValuesCommand request, CancellationToken cancellationToken)
|
{
|
var logier = JwtUtils.GetCurrentLogier();
|
var entity = await rep.AsQueryable()
|
.Include(it => it.Values)
|
.Where(it => it.Id == request.Id && !it.IsDisabled)
|
.FirstOrDefaultAsync();
|
if (entity == null)
|
{
|
throw Oops.Oh(EnumErrorCodeType.s404, "合同模板");
|
}
|
|
if (entity.Access.HasValue)
|
{
|
await mediator.Send(new CheckElectronSignAccessEnabledsCommand
|
{
|
Accesses = new List<EnumElectronSignAccess>
|
{
|
entity.Access.Value
|
}
|
}, cancellationToken);
|
}
|
|
request.Adapt(entity);
|
|
if (entity.Values.Count != request.Values.Count
|
|| entity.Values.Any(ov =>
|
request.Values.Count(nv =>
|
ov.Id == nv.Id
|
&& ov.Name == nv.Name
|
&& ov.Type == nv.Type
|
&& ov.Recorder == nv.Recorder
|
&& ov.UserType == nv.UserType
|
&& ov.Label == nv.Label
|
&& ov.BindProperty == nv.BindProperty
|
&& 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() && request.Values.IsNotNull())
|
{
|
entity.Status = EnumContractTemplateStatus.Completed;
|
entity.CompletedTime = DateTime.Now;
|
}
|
|
await SyncElectronSignContractTemplate(entity);
|
|
return entity.Id;
|
}
|
|
/// <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();
|
var q = rep.AsQueryable();
|
if (logier.Type == EnumUserType.Enterprise)
|
{
|
q = q.Where(it => it.EnterpriseId == logier.EnterpriseId);
|
}
|
var entities = await q
|
.Where(it => request.Ids.Contains(it.Id) && it.IsDisabled != request.IsDisabled)
|
.ToListAsync();
|
foreach (var entity in entities)
|
{
|
entity.IsDisabled = request.IsDisabled;
|
}
|
var ids = entities.DistinctSelect(it => it.ElectronSignContractTemplateId.HasValue, it => it.ElectronSignContractTemplateId!.Value);
|
if (ids.IsNotNull())
|
{
|
var result = await new DeleteContractTemplateInput
|
{
|
Ids = ids
|
}.SendHttpAsync<DeleteContractTemplateInput, ElectronSignServerResult<object>>(EnumResourceHttpProvider.ElectronSignServerCustomer);
|
if (result?.Success != true)
|
{
|
throw Oops.Oh(EnumErrorCodeType.s510, result?.Message ?? "删除电子签合同模板异常");
|
}
|
}
|
return entities.Count;
|
}
|
|
/// <summary>
|
/// 校验合同模是否可用
|
/// </summary>
|
/// <param name="request"></param>
|
/// <param name="cancellationToken"></param>
|
/// <returns></returns>
|
public async Task<bool> Handle(CheckContractTemplateCommand request, CancellationToken cancellationToken)
|
{
|
var model = await rep.AsQueryable().AsNoTracking()
|
.Where(it => it.Id == request.Id && !it.IsDisabled)
|
.Select(it => new
|
{
|
it.Access,
|
it.Status
|
})
|
.FirstOrDefaultAsync();
|
if (model == null) throw Oops.Oh(EnumErrorCodeType.s404, "合同模板");
|
if (model.Status != EnumContractTemplateStatus.Completed) throw Oops.Oh(EnumErrorCodeType.s510, "未制版");
|
await mediator.Send(new CheckElectronSignAccessEnabledsCommand
|
{
|
Accesses = new List<EnumElectronSignAccess>
|
{
|
model.Access!.Value
|
}
|
}, cancellationToken);
|
return true;
|
|
}
|
|
/// <summary>
|
/// 同步电子签合同模板
|
/// </summary>
|
/// <param name="entity"></param>
|
/// <returns></returns>
|
private async Task SyncElectronSignContractTemplate(ContractTemplate entity)
|
{
|
if (entity.Status == EnumContractTemplateStatus.Completed)
|
{
|
var enterprise = await rep.Change<Enterprise>().AsQueryable()
|
.Include(it => it.EnterpriseAuth)
|
.Where(it => it.Id == entity.EnterpriseId)
|
.FirstOrDefaultAsync();
|
if (enterprise == null) throw Oops.Oh(EnumErrorCodeType.s404, "企业");
|
if (enterprise.EnterpriseAuth == null)
|
{
|
enterprise.EnterpriseAuth = new EnterpriseAuth();
|
}
|
if (enterprise.EnterpriseAuth.ElectronSignEnterpriseId == null)
|
{
|
throw Oops.Oh(EnumErrorCodeType.s510, "未注册电子签账号,请重新同步818账号信息");
|
}
|
var result = await new CreateOrUpdateContractTemplateInput
|
{
|
CustomerId = App.GetConfig<Guid>("ElectronSignServer:AppId"),
|
UserId = enterprise.EnterpriseAuth.ElectronSignEnterpriseId,
|
Supplier = (EnumElectronSignContractSupplier)entity.Access!,
|
Name = entity.Name,
|
TemplateCode = entity.TemplateId,
|
Values = entity.Values.Adapt<List<CreateOrUpdateContractTemplateValueInput>>()
|
}.SendHttpAsync<CreateOrUpdateContractTemplateInput, ElectronSignServerResult<Guid>>(EnumResourceHttpProvider.ElectronSignServerCustomer);
|
if (result?.Success == true)
|
{
|
entity.ElectronSignContractTemplateId = result.Result;
|
}
|
}
|
}
|
}
|
}
|