sunpengfei
15 小时以前 d38276fb2561a2c4029229ff88864f5680b8e07c
FlexJobApi.UserServer.Application/ElectronSign/Commands/ContractTemplateCommandHandler.cs
@@ -9,6 +9,7 @@
using Furion.FriendlyException;
using Mapster;
using MediatR;
using Microsoft.AspNetCore.Components.Forms;
using Microsoft.EntityFrameworkCore;
using System;
using System.Collections.Generic;
@@ -23,13 +24,16 @@
    /// 合同模板命令处理器
    /// </summary>
    public class ContractTemplateCommandHandler(
            IMediator mediator,
            IRepository<ContractTemplate> rep,
            WxmpUtils wxmpUtils
        ) :
        IRequestHandler<SaveContractTemplateCommand, Guid>,
        IRequestHandler<SaveContractTemplateValuesCommand, Guid>,
        IRequestHandler<SetIsDisabledContractTemplateCommand, int>
        IRequestHandler<SetIsDisabledContractTemplateCommand, int>,
        IRequestHandler<CheckContractTemplateCommand, bool>
    {
        private readonly IMediator mediator = mediator;
        private readonly IRepository<ContractTemplate> rep = rep;
        private readonly WxmpUtils wxmpUtils = wxmpUtils;
@@ -55,6 +59,17 @@
                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)
@@ -62,7 +77,7 @@
                 null,
                 entity =>
                 {
                     if (entity.Code.IsNotNull() && entity.Name.IsNotNull() && (entity.Code != request.Code || entity.Name != request.Name))
                     if (request.Code.IsNotNull() && request.Name.IsNotNull())
                     {
                         entity.WxmpQrCode = wxmpUtils.GetQrCodeOssUrl(new WxmpGetQrCodeCommand
                         {
@@ -103,44 +118,58 @@
        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);
            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);
@@ -184,6 +213,35 @@
        }
        /// <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>
@@ -203,25 +261,7 @@
                }
                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 ?? "注册电子签账号异常");
                    }
                    throw Oops.Oh(EnumErrorCodeType.s510, "未注册电子签账号,请重新同步818账号信息");
                }
                var result = await new CreateOrUpdateContractTemplateInput
                {