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.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(
|
IRepository<ContractTemplate> rep,
|
WxmpUtils wxmpUtils
|
) :
|
IRequestHandler<SaveContractTemplateCommand, Guid>,
|
IRequestHandler<SaveContractTemplateValuesCommand, Guid>,
|
IRequestHandler<SetIsDisabledContractTemplateCommand, int>
|
{
|
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, "业务编码");
|
}
|
|
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 != request.Code || entity.Name != request.Name)
|
{
|
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 request.SaveData<ContractTemplate, SaveContractTemplateValuesCommand>(
|
q => q
|
.Include(it => it.Values)
|
.Where(it => !it.IsDisabled),
|
null,
|
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() && request.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<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="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)
|
{
|
var resultRegOrUpdateUser = await new RegOrUpdateUserInput
|
{
|
OutUserId = enterprise.Id.ToString(),
|
UserType = EnumElectronSignUserType.Personal,
|
EnterpriseName = enterprise.EnterpriseName,
|
SocietyCreditCode = enterprise.SocietyCreditCode,
|
Name = enterprise.EnterpriseAuth?.Name,
|
Identity = enterprise?.EnterpriseAuth?.Identity,
|
Mobile = enterprise?.EnterpriseAuth?.PhoneNumber
|
}.SendHttpAsync<RegOrUpdateUserInput, ElectronSignServerResult<Guid?>>(EnumResourceHttpProvider.ElectronSignServerCustomer);
|
|
if (resultRegOrUpdateUser?.Success == true)
|
{
|
enterprise!.EnterpriseAuth!.ElectronSignEnterpriseId = resultRegOrUpdateUser.Result;
|
}
|
else
|
{
|
throw Oops.Oh(EnumErrorCodeType.s510, resultRegOrUpdateUser?.Message ?? "注册电子签账号异常");
|
}
|
}
|
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;
|
}
|
}
|
}
|
}
|
}
|