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
{
///
/// 合同模板命令处理器
///
public class ContractTemplateCommandHandler(
IMediator mediator,
IRepository rep,
WxmpUtils wxmpUtils
) :
IRequestHandler,
IRequestHandler,
IRequestHandler,
IRequestHandler
{
private readonly IMediator mediator = mediator;
private readonly IRepository rep = rep;
private readonly WxmpUtils wxmpUtils = wxmpUtils;
///
/// 保存合同模板
///
///
///
///
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, "请选择企业");
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
{
request.Access.Value
}
}, cancellationToken);
}
var entity = await request.SaveData(
q => q
.Include(it => it.Values)
.Where(it => it.EnterpriseId == request.EnterpriseId && !it.IsDisabled),
null,
entity =>
{
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;
}
///
/// 合同制版
///
///
///
///
public async Task 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
{
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;
}
///
/// 禁用合同模板
///
///
///
///
public async Task 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>(EnumResourceHttpProvider.ElectronSignServerCustomer);
if (result?.Success != true)
{
throw Oops.Oh(EnumErrorCodeType.s510, result?.Message ?? "删除电子签合同模板异常");
}
}
return entities.Count;
}
///
/// 校验合同模是否可用
///
///
///
///
public async Task 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
{
model.Access!.Value
}
}, cancellationToken);
return true;
}
///
/// 同步电子签合同模板
///
///
///
private async Task SyncElectronSignContractTemplate(ContractTemplate entity)
{
if (entity.Status == EnumContractTemplateStatus.Completed)
{
var enterprise = await rep.Change().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("ElectronSignServer:AppId"),
UserId = enterprise.EnterpriseAuth.ElectronSignEnterpriseId,
Supplier = (EnumElectronSignContractSupplier)entity.Access!,
Name = entity.Name,
TemplateCode = entity.TemplateId,
Values = entity.Values.Adapt>()
}.SendHttpAsync>(EnumResourceHttpProvider.ElectronSignServerCustomer);
if (result?.Success == true)
{
entity.ElectronSignContractTemplateId = result.Result;
}
}
}
}
}