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
|
{
|
/// <summary>
|
/// 同步用户命令处理器
|
/// </summary>
|
public class SyncUserCommandHandler(
|
IRepository<User> repUser,
|
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>
|
/// 同步企业用户
|
/// </summary>
|
/// <param name="request"></param>
|
/// <param name="cancellationToken"></param>
|
/// <returns></returns>
|
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.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<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()
|
.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;
|
}
|
|
/// <summary>
|
/// 同步运营用户
|
/// </summary>
|
/// <param name="request"></param>
|
/// <param name="cancellationToken"></param>
|
/// <returns></returns>
|
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.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;
|
}
|
}
|
}
|