using FlexJobApi.Core; using FlexJobApi.Core.Models.ElectronSignServer.Common; using FlexJobApi.Core.Models.ElectronSignServer.PersonalUserReals; using FlexJobApi.Core.Models.ElectronSignServer.Users; using Furion.DatabaseAccessor; using Furion.DataEncryption; using Furion.FriendlyException; using Mapster; using MediatR; 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( IRepository repUser, IRepository repEnterprise, IRepository repRole ) : IRequestHandler, IRequestHandler { private readonly IRepository repUser = repUser; private readonly IRepository repEnterprise = repEnterprise; private readonly IRepository repRole = repRole; /// /// 同步企业用户 /// /// /// /// public async Task Handle(SyncEnterpriseUserCommand request, CancellationToken cancellationToken) { var enterprise = await repEnterprise.AsQueryable() .Include(it => it.EnterpriseAuth) .Where(it => it.SocietyCreditCode == request.Enterprise.SocietyCreditCode) .FirstOrDefaultAsync(cancellationToken); if (enterprise == null) { enterprise = new Enterprise(); } if (enterprise.EnterpriseAuth == null) { enterprise.EnterpriseAuth = new EnterpriseAuth(); } 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) { result.Model.Adapt(enterprise); } } 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; 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.Personal, EnterpriseName = enterprise.EnterpriseName, SocietyCreditCode = enterprise.SocietyCreditCode, Name = enterprise.EnterpriseAuth.Name, 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.Id == Guid.Empty) await repEnterprise.InsertAsync(enterprise); else await repEnterprise.UpdateAsync(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; } } }