sunpengfei
15 小时以前 d38276fb2561a2c4029229ff88864f5680b8e07c
FlexJobApi.UserServer.Application/ElectronSign/Commands/ContractTemplateCommandHandler.cs
@@ -1,14 +1,22 @@
using FlexJobApi.Core;
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
{
@@ -16,12 +24,18 @@
    /// 合同模板命令处理器
    /// </summary>
    public class ContractTemplateCommandHandler(
            IRepository<ContractTemplate> rep
            IMediator mediator,
            IRepository<ContractTemplate> rep,
            WxmpUtils wxmpUtils
        ) :
        IRequestHandler<SaveContractTemplateCommand, Guid>,
        IRequestHandler<SetIsDisabledContractTemplateCommand, int>
        IRequestHandler<SaveContractTemplateValuesCommand, Guid>,
        IRequestHandler<SetIsDisabledContractTemplateCommand, int>,
        IRequestHandler<CheckContractTemplateCommand, bool>
    {
        private readonly IMediator mediator = mediator;
        private readonly IRepository<ContractTemplate> rep = rep;
        private readonly WxmpUtils wxmpUtils = wxmpUtils;
        /// <summary>
        /// 保存合同模板
@@ -38,44 +52,128 @@
            }
            if (request.EnterpriseId == null) throw Oops.Oh(EnumErrorCodeType.s400, "请选择企业");
            return await request.SaveData<ContractTemplate, SaveContractTemplateCommand>(
            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<EnumElectronSignAccess>
                    {
                        request.Access.Value
                    }
                }, cancellationToken);
            }
            var entity = await request.SaveData<ContractTemplate, SaveContractTemplateCommand>(
                 q => q
                    .Include(it => it.Values)
                    .Where(it => it.EnterpriseId == request.EnterpriseId && !it.IsDisabled),
                 it => it.EnterpriseId == request.EnterpriseId && it.Name == request.Name && !it.IsDisabled && it.Id != request.Id,
                 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))
                     if (request.Code.IsNotNull() && request.Name.IsNotNull())
                     {
                         entity.Values = request.Values.Select(it =>
                         entity.WxmpQrCode = wxmpUtils.GetQrCodeOssUrl(new WxmpGetQrCodeCommand
                         {
                             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;
                             UserType = EnumUserType.Personal,
                             OssScene = "Wxmp/QrCode/ContractTemplate",
                             OssFileName = $"{request.Name}.png",
                             Page = "subpackages/mine/mineAgreementSignDetail/mineAgreementSignDetail",
                             CheckPath = false,
                             Scene = $"{request.Code}",
                         }).Result;
                     }
                     if (entity.Access.HasValue && entity.TemplateId.IsNotNull() && entity.Status == EnumContractTemplateStatus.Wait)
                     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 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);
            return entity.Id;
        }
        /// <summary>
@@ -87,14 +185,98 @@
        public async Task<int> Handle(SetIsDisabledContractTemplateCommand request, CancellationToken cancellationToken)
        {
            var logier = JwtUtils.GetCurrentLogier();
            return await request.SetIsDisabled<ContractTemplate>(q =>
            var q = rep.AsQueryable();
            if (logier.Type == EnumUserType.Enterprise)
            {
                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
                {
                    q = q.Where(it => it.EnterpriseId == logier.EnterpriseId);
                    Ids = ids
                }.SendHttpAsync<DeleteContractTemplateInput, ElectronSignServerResult<object>>(EnumResourceHttpProvider.ElectronSignServerCustomer);
                if (result?.Success != true)
                {
                    throw Oops.Oh(EnumErrorCodeType.s510, result?.Message ?? "删除电子签合同模板异常");
                }
                return q;
            }
            return entities.Count;
        }
        /// <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>
        /// <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)
                {
                    throw Oops.Oh(EnumErrorCodeType.s510, "未注册电子签账号,请重新同步818账号信息");
                }
                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;
                }
            }
        }
    }
}