using FlexJobApi.Core; using FlexJobApi.Core.Models.ElectronSignServer.Common; using FlexJobApi.Core.Models.ElectronSignServer.PersonalUserReals; using FlexJobApi.Core.Models.ElectronSignServer.Users; using Furion; using Furion.DatabaseAccessor; using Furion.DataEncryption; using Furion.DistributedIDGenerator; using Furion.FriendlyException; using Mapster; using MediatR; using Microsoft.AspNetCore.Components.Forms; using Microsoft.AspNetCore.Identity; using Microsoft.EntityFrameworkCore; using System; using System.Collections.Generic; using System.Linq; using System.Security.Cryptography; using System.Text; using System.Threading.Tasks; namespace FlexJobApi.UserServer.Application { /// /// 同步用户命令处理器 /// public class SyncUserCommandHandler( IMediator mediator, IRepository repUser, IRepository repEnterprise, IRepository repElectronSignSetting, IRepository repRole ) : IRequestHandler, IRequestHandler { private readonly IMediator mediator = mediator; private readonly IRepository repUser = repUser; private readonly IRepository repEnterprise = repEnterprise; private readonly IRepository repElectronSignSetting = repElectronSignSetting; private readonly IRepository repRole = repRole; /// /// 同步企业用户 /// /// /// /// public async Task Handle(SyncEnterpriseUserCommand request, CancellationToken cancellationToken) { var enterprise = await repEnterprise.AsQueryable() .Include(it => it.EnterpriseAuth) .Include(it => it.ElectronSignSettings) .Where(it => it.SocietyCreditCode == request.Enterprise.SocietyCreditCode) .FirstOrDefaultAsync(cancellationToken); var add = false; if (enterprise == null) { add = true; enterprise = new Enterprise(); enterprise.Id = IDGen.NextID(); if (request.Enterprise.ElectronSignAccesses.IsNotNull()) { request.Enterprise.ElectronSignAccesses = await repElectronSignSetting.AsQueryable().AsNoTracking() .Where(it => request.Enterprise.ElectronSignAccesses.Contains(it.Access) && !it.IsDisabled) .Select(it => it.Access) .ToListAsync(); } enterprise.ElectronSignSettings = request.Enterprise.ElectronSignAccesses .Select(it => new EnterpriseElectronSignSetting { ElectronSignAccess = it }) .ToList(); } if (request.Enterprise.EnterpriseAuth == null) { request.Enterprise.EnterpriseAuth = new SyncEnterpriseUserCommandEnterpriseAuth(); } request.Enterprise.Adapt(enterprise); enterprise.LicenseImage = GetOssUrl(enterprise.LicenseImage, request.Enterprise.LicenseImage); if (enterprise.LicenseImage.IsNotNull() && enterprise.EnterpriseType.IsNull()) { var result = await BaiduOcrUtils.OcrBusinessLicense(enterprise.LicenseImage); if (result?.Model != null) { enterprise.EnterpriseType = result.Model.EnterpriseType; enterprise.RegisteredCapital = result.Model.RegisteredCapital; enterprise.EstablishmentDate = result.Model.EstablishmentDate; enterprise.Address = result.Model.Address; enterprise.MainBusiness = result.Model.MainBusiness; } } if (enterprise.EnterpriseAuth == null) { enterprise.EnterpriseAuth = new EnterpriseAuth(); } enterprise.EnterpriseAuth.EnterpriseName = enterprise.EnterpriseName; enterprise.EnterpriseAuth.SocietyCreditCode = enterprise.SocietyCreditCode; enterprise.EnterpriseAuth.LicenseImage = enterprise.LicenseImage; enterprise.EnterpriseAuth.LegalPerson = enterprise.LegalPerson; enterprise.EnterpriseAuth.LegalIdentity = enterprise.LegalIdentity; if (request.Enterprise.EnterpriseAuth != null) { enterprise.EnterpriseAuth.IdentityImg = GetOssUrl(enterprise.EnterpriseAuth.IdentityImg, request.Enterprise.EnterpriseAuth.IdentityImg); enterprise.EnterpriseAuth.IdentityBackImg = GetOssUrl(enterprise.EnterpriseAuth.IdentityBackImg, request.Enterprise.EnterpriseAuth.IdentityBackImg); enterprise.EnterpriseAuth.BankCardImg = GetOssUrl(enterprise.EnterpriseAuth.BankCardImg, request.Enterprise.EnterpriseAuth.BankCardImg); } if (enterprise.EnterpriseAuth.ElectronSignEnterpriseId == null) { var resultRegOrUpdateUser = await new RegOrUpdateUserInput { OutUserId = enterprise.Id.ToString(), UserType = EnumElectronSignUserType.Company, EnterpriseName = enterprise.EnterpriseName, SocietyCreditCode = enterprise.SocietyCreditCode, Name = enterprise.EnterpriseAuth.Name ?? enterprise.Contacts, Identity = enterprise.EnterpriseAuth.Identity, Mobile = enterprise.EnterpriseAuth.PhoneNumber, CertAccount = enterprise.EnterpriseAuth.CertAccount }.SendHttpAsync>(EnumResourceHttpProvider.ElectronSignServerCustomer); if (resultRegOrUpdateUser?.Success == true) { enterprise.EnterpriseAuth.ElectronSignEnterpriseId = resultRegOrUpdateUser.Result; } else { throw Oops.Oh(EnumErrorCodeType.s510, resultRegOrUpdateUser?.Message ?? "注册电子签账号异常"); } } if (enterprise.IsReal) { var resultReal = await new RealEnterpriseInputByCertAccountInput { CustomerId = App.GetConfig("ElectronSignServer:AppId"), OutUserId = enterprise.Id.ToString(), EnterpriseName = enterprise.EnterpriseName, SocietyCreditCode = enterprise.SocietyCreditCode, Name = enterprise.EnterpriseAuth.Name ?? enterprise.Contacts, Identity = enterprise.EnterpriseAuth.Identity, Mobile = enterprise.EnterpriseAuth.PhoneNumber, BankCard = enterprise.EnterpriseAuth.BankCard, BankCardImgUrl = enterprise.EnterpriseAuth.BankCardImg, LicenseUrl = enterprise.EnterpriseAuth.LicenseImage, IdentityImgUrl = enterprise.EnterpriseAuth.IdentityImg, IdentityBackImgUrl = enterprise.EnterpriseAuth.IdentityBackImg, ProxyPowerAttorneyUrl = enterprise.EnterpriseAuth.ProxyPowerAttorneyUrl, LegalPerson = enterprise.EnterpriseAuth.LegalPerson, Proxy = enterprise.EnterpriseAuth.Proxy ?? false, RealMethod = (EnumElectronSignPersonalRealMethod)enterprise.EnterpriseAuth.EnterpriseRealMethod!.Value, CertAccount = enterprise.EnterpriseAuth.CertAccount }.SendHttpAsync>(EnumResourceHttpProvider.ElectronSignServerCustomer); if (resultReal?.Success != true || resultReal?.Result.Status != EnumElectronSignRealStatus.Real) { throw Oops.Oh(EnumErrorCodeType.s510, resultReal?.Message ?? "账号实名异常"); } enterprise.EnterpriseAuth.CertAccount = resultReal.Result.CertAccount; } if (add) await repEnterprise.InsertNowAsync(enterprise); else await repEnterprise.UpdateNowAsync(enterprise); var user = await repUser.AsQueryable() .Include(it => it.UserRoles) .Where(it => it.Type == EnumUserType.Enterprise && it.DataSource == request.DataSource && it.DataSourceId == request.DataSourceId) .FirstOrDefaultAsync(cancellationToken); if (user == null) { user = new User(); user.Type = EnumUserType.Enterprise; } else if (user.EnterpriseId != enterprise.Id) { throw Oops.Oh(EnumErrorCodeType.s405, "账号"); } var checkUserNameExist = await repUser.AsQueryable().AsNoTracking() .AnyAsync(it => it.Type == EnumUserType.Enterprise && it.UserName == request.UserName && it.Id != user.Id); if (checkUserNameExist) throw Oops.Oh(EnumErrorCodeType.s405, "账号"); user.EnterpriseId = enterprise.Id; user.Level = 100; user.UserRoles = await repRole.AsQueryable().AsNoTracking() .Where(it => it.UserType == user.Type && it.MinLevel == 100) .Select(it => new UserRole { RoleId = it.Id }) .ToListAsync(); request.Adapt(user); if (user.Id == Guid.Empty) await repUser.InsertAsync(user); else await repUser.UpdateAsync(user); return user.Id; } /// /// 同步运营用户 /// /// /// /// public async Task Handle(SyncOperationUserCommand request, CancellationToken cancellationToken) { var user = await repUser.AsQueryable() .Include(it => it.UserRoles) .Include(it => it.UserManageIndustrialParks) .Where(it => it.Type == EnumUserType.Operation && it.DataSource == request.DataSource && it.DataSourceId == request.DataSourceId) .FirstOrDefaultAsync(cancellationToken); if (user == null) { user = new User(); user.Type = EnumUserType.Operation; user.Status = EnumUserStatus.Normal; } var checkUserNameExist = await repUser.AsQueryable().AsNoTracking() .AnyAsync(it => it.Type == EnumUserType.Operation && it.UserName == request.UserName && it.Id != user.Id); if (checkUserNameExist) throw Oops.Oh(EnumErrorCodeType.s405, "账号"); request.Adapt(user); user.UserManageIndustrialParks = request.IndustrialParkIds.Select(it => new UserManageIndustrialPark { IndustrialParkId = it }).ToList(); user.Level = 100; user.UserRoles = await repRole.AsQueryable().AsNoTracking() .Where(it => it.UserType == user.Type && it.MinLevel == 100) .Select(it => new UserRole { RoleId = it.Id }) .ToListAsync(); if (user.Id == Guid.Empty) await repUser.InsertAsync(user); else await repUser.UpdateAsync(user); return user.Id; } private string GetOssUrl(string fromUrl, string toUrl) { if (toUrl.IsNotNull()) { var domain = ".aliyuncs.com"; if (toUrl.Contains(domain)) { var key = toUrl.Substring(toUrl.IndexOf(domain) + domain.Length + 1).TrimStart('/'); key = $"Resource/FlexJob/SyncFromHumanResources/{key}"; if (key != fromUrl) { toUrl = AliyunOSSUtils.Upload(toUrl, key).Url; } } } return toUrl; } } }