sunpengfei
2025-08-22 f7441ac8e0ef8778c4271d4ffec890a7e39bd3ab
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,6 +24,7 @@
    /// 合同模板命令处理器
    /// </summary>
    public class ContractTemplateCommandHandler(
            IMediator mediator,
            IRepository<ContractTemplate> rep,
            WxmpUtils wxmpUtils
        ) :
@@ -30,6 +32,7 @@
        IRequestHandler<SaveContractTemplateValuesCommand, Guid>,
        IRequestHandler<SetIsDisabledContractTemplateCommand, int>
    {
        private readonly IMediator mediator = mediator;
        private readonly IRepository<ContractTemplate> rep = rep;
        private readonly WxmpUtils wxmpUtils = wxmpUtils;
@@ -53,6 +56,17 @@
                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>(
@@ -103,44 +117,56 @@
        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.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;
            }
            await SyncElectronSignContractTemplate(entity);