sunpengfei
2025-08-21 8c5cc69cb04feef035f27e05cbaabda42bd8155c
FlexJobApi.UserServer.Application/Users/Commands/SyncUserCommandHandler.cs
@@ -1,4 +1,7 @@
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;
@@ -20,13 +23,15 @@
    /// </summary>
    public class SyncUserCommandHandler(
            IRepository<User> repUser,
            IRepository<Enterprise> repEnterprise
            IRepository<Enterprise> repEnterprise,
            IRepository<Role> repRole
        ) :
        IRequestHandler<SyncEnterpriseUserCommand, Guid>,
        IRequestHandler<SyncOperationUserCommand, Guid>
    {
        private readonly IRepository<User> repUser = repUser;
        private readonly IRepository<Enterprise> repEnterprise = repEnterprise;
        private readonly IRepository<Role> repRole = repRole;
        /// <summary>
        /// 同步企业用户
@@ -37,26 +42,68 @@
        public async Task<Guid> 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.EnterpriseAuth != null)
            if (enterprise.LicenseImage.IsNotNull() && enterprise.EnterpriseType.IsNull())
            {
                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);
                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<RegOrUpdateUserInput, ElectronSignServerResult<Guid?>>(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()
                    .Where(it => it.Type == EnumUserType.Enterprise && it.UserName == request.UserName)
                    .Include(it => it.UserRoles)
                    .Where(it => it.Type == EnumUserType.Enterprise && it.DataSource == request.DataSource && it.DataSourceId == request.DataSourceId)
                    .FirstOrDefaultAsync(cancellationToken);
            if (user == null)
            {
@@ -67,12 +114,27 @@
            {
                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;
        }
@@ -85,8 +147,9 @@
        public async Task<Guid> 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.UserName == request.UserName)
                .Where(it => it.Type == EnumUserType.Operation && it.DataSource == request.DataSource && it.DataSourceId == request.DataSourceId)
                .FirstOrDefaultAsync(cancellationToken);
            if (user == null)
            {
@@ -94,11 +157,22 @@
                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