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 { /// /// 合同模板命令处理器 /// public class ContractTemplateCommandHandler( IRepository rep, WxmpUtils wxmpUtils ) : IRequestHandler, IRequestHandler, IRequestHandler { 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, "请选择企业"); 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( q => q .Include(it => it.Values) .Where(it => it.EnterpriseId == request.EnterpriseId && !it.IsDisabled), null, entity => { 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); if (request.Id == null) { entity.WxmpQrCode = await wxmpUtils.GetQrCodeOssUrl(new WxmpGetQrCodeCommand { UserType = EnumUserType.Personal, OssScene = "Wxmp/QrCode/ContractTemplate", OssFileName = $"{entity.Name}.png", Page = "subpackages/mine/mineAgreementSignDetail/mineAgreementSignDetail", CheckPath = false, Scene = $"{entity.Code}", }); } return entity.Id; } /// /// 合同制版 /// /// /// /// public async Task Handle(SaveContractTemplateValuesCommand request, CancellationToken cancellationToken) { var logier = JwtUtils.GetCurrentLogier(); var entity = await request.SaveData( 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; } /// /// 禁用合同模板 /// /// /// /// 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; } /// /// 同步电子签合同模板 /// /// /// 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) { 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>(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("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; } } } } }