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);
if (enterprise == null)
{
enterprise = new Enterprise();
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();
}
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;
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.Id == Guid.Empty)
await repEnterprise.InsertAsync(enterprise);
else
await repEnterprise.UpdateAsync(enterprise);
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 ?? 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;
}
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;
}
}
}