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; } } } } }