| | |
| | | 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 |
| | | { |
| | |
| | | /// 合同模板命令处理器 |
| | | /// </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> |
| | | /// 保存合同模板 |
| | |
| | | } |
| | | 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)) |
| | | entity.WxmpQrCode = wxmpUtils.GetQrCodeOssUrl(new WxmpGetQrCodeCommand |
| | | { |
| | | 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; |
| | | 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; |
| | | } |
| | | if (entity.Access.HasValue && entity.TemplateId.IsNotNull() && 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> |
| | |
| | | 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; |
| | | } |
| | | } |
| | | } |
| | | } |
| | | } |