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.FriendlyException;
|
using Mapster;
|
using MediatR;
|
using Microsoft.EntityFrameworkCore;
|
using System;
|
using System.Collections.Generic;
|
using System.Linq;
|
using System.Text;
|
using System.Threading.Tasks;
|
|
namespace FlexJobApi.UserServer.Application
|
{
|
/// <summary>
|
/// 个人实名
|
/// </summary>
|
/// <param name="repUser"></param>
|
/// <param name="resourceHttpUtils"></param>
|
public class PersonalUserRealCommandHandler(
|
IRepository<User> repUser
|
) :
|
IRequestHandler<SendPersonalUserIdentity3RealSmsCommand, Guid>,
|
IRequestHandler<PersonalUserIdentity3RealCommand, Guid>,
|
IRequestHandler<PersonalUserFaceRealCommand, string>
|
{
|
private readonly IRepository<User> repUser = repUser;
|
|
/// <summary>
|
/// 发送个人三要素实名短信
|
/// </summary>
|
/// <param name="request"></param>
|
/// <param name="cancellationToken"></param>
|
/// <returns></returns>
|
public async Task<Guid> Handle(SendPersonalUserIdentity3RealSmsCommand request, CancellationToken cancellationToken)
|
{
|
var logier = JwtUtils.GetCurrentLogier();
|
var user = await repUser.AsQueryable()
|
.Include(it => it.UserAuth)
|
.Where(it => it.Id == logier.Id)
|
.FirstOrDefaultAsync();
|
if (user == null) throw Oops.Oh(EnumErrorCodeType.s404, "用户");
|
if (user.IsReal) throw Oops.Oh(EnumErrorCodeType.s510, "用户已实名,请勿重复申请");
|
if (user.UserAuth == null)
|
{
|
user.UserAuth = new UserAuth();
|
}
|
if (user.UserAuth.ElectronSignUserId == null)
|
{
|
var result = await new RegOrUpdateUserInput
|
{
|
OutUserId = user.Id.ToString(),
|
UserType = EnumElectronSignUserType.Personal,
|
Name = request.Name,
|
Identity = request.Identity,
|
Mobile = request.PhoneNumber
|
}.SendHttpAsync<RegOrUpdateUserInput, ElectronSignServerResult<Guid?>>(EnumResourceHttpProvider.ElectronSignServerCustomer);
|
|
if (result?.Success == true)
|
{
|
user.UserAuth.ElectronSignUserId = result.Result;
|
}
|
else
|
{
|
throw Oops.Oh(EnumErrorCodeType.s510, result?.Msg ?? "注册实名账号异常");
|
}
|
}
|
var sendRealSmsResult = await new SendRealSmsInput
|
{
|
UserType = EnumElectronSignUserType.Personal,
|
OutUserId = user.Id.ToString(),
|
RealMethod = EnumElectronSignPersonalRealMethod.Identity3,
|
Name = request.Name,
|
Identity = request.Identity,
|
Mobile = request.PhoneNumber
|
}.SendHttpAsync<SendRealSmsInput, ElectronSignServerResult<object>>(EnumResourceHttpProvider.ElectronSignServerCustomer);
|
if (sendRealSmsResult?.Success != true)
|
throw Oops.Oh(EnumErrorCodeType.s510, sendRealSmsResult?.Msg ?? "发送实名短信异常");
|
|
PersonalReal(
|
EnumPersonalUserRealStatus.Checking,
|
EnumUserRealMethod.Identity3,
|
user,
|
new List<EnterpriseEmployee>(),
|
request.Name,
|
request.Identity,
|
phoneNumber: request.PhoneNumber);
|
|
return user.Id;
|
}
|
|
/// <summary>
|
/// 个人三要素实名认证
|
/// </summary>
|
/// <param name="request"></param>
|
/// <param name="cancellationToken"></param>
|
/// <returns></returns>
|
public async Task<Guid> Handle(PersonalUserIdentity3RealCommand request, CancellationToken cancellationToken)
|
{
|
var logier = JwtUtils.GetCurrentLogier();
|
var user = await repUser.AsQueryable()
|
.Include(it => it.UserAuth)
|
.Where(it => it.Id == logier.Id)
|
.FirstOrDefaultAsync();
|
if (user == null) throw Oops.Oh(EnumErrorCodeType.s404, "用户");
|
if (user.IsReal) throw Oops.Oh(EnumErrorCodeType.s510, "用户已实名,请勿重复申请");
|
var result = await new RealPersonalInput
|
{
|
OutUserId = user.Id.ToString(),
|
RealMethod = EnumElectronSignPersonalRealMethod.Identity3,
|
Name = request.Name,
|
Identity = request.Identity,
|
IdentityImgUrl = request.IdentityImg,
|
IdentityBackImgUrl = request.IdentityBackImg,
|
Mobile = request.PhoneNumber,
|
VCode = request.VerifyCode
|
}.SendHttpAsync<RealPersonalInput, ElectronSignServerResult<RealPersonalOutput>>(EnumResourceHttpProvider.ElectronSignServerCustomer);
|
if (result?.Success != true || result.Result?.Status != EnumElectronSignRealStatus.Real)
|
throw Oops.Oh(EnumErrorCodeType.s510, result?.Msg ?? "实名异常");
|
|
var enterpriseEmployees = await repUser.Change<EnterpriseEmployee>().AsQueryable()
|
.Where(it => it.UserId == user.Id)
|
.ToListAsync();
|
PersonalReal(
|
EnumPersonalUserRealStatus.Real,
|
EnumUserRealMethod.Identity3,
|
user,
|
enterpriseEmployees,
|
request.Name,
|
request.Identity,
|
request.IdentityImg,
|
request.IdentityBackImg,
|
request.PhoneNumber);
|
await repUser.UpdateAsync(user);
|
|
return user.Id;
|
}
|
|
/// <summary>
|
/// 个人人脸实名认证
|
/// </summary>
|
/// <param name="request"></param>
|
/// <param name="cancellationToken"></param>
|
/// <returns></returns>
|
public async Task<string> Handle(PersonalUserFaceRealCommand request, CancellationToken cancellationToken)
|
{
|
var logier = JwtUtils.GetCurrentLogier();
|
var user = await repUser.AsQueryable()
|
.Include(it => it.UserAuth)
|
.Where(it => it.Id == logier.Id)
|
.FirstOrDefaultAsync();
|
if (user == null) throw Oops.Oh(EnumErrorCodeType.s404, "用户");
|
if (user.IsReal) throw Oops.Oh(EnumErrorCodeType.s510, "用户已实名,请勿重复申请");
|
if (user.UserAuth == null)
|
{
|
user.UserAuth = new UserAuth();
|
}
|
if (user.UserAuth.Name == request.Name
|
&& user.UserAuth.Identity == request.Identity
|
&& user.UserAuth.RealStatus == EnumPersonalUserRealStatus.Checking
|
&& user.UserAuth.FaceRealUrl.IsNotNull())
|
return user.UserAuth.FaceRealUrl;
|
|
var result = await new RealPersonalInput
|
{
|
OutUserId = user.Id.ToString(),
|
RealMethod = EnumElectronSignPersonalRealMethod.Face,
|
Name = request.Name,
|
Identity = request.Identity,
|
IdentityImgUrl = request.IdentityImg,
|
IdentityBackImgUrl = request.IdentityBackImg,
|
}.SendHttpAsync<RealPersonalInput, ElectronSignServerResult<RealPersonalOutput>>(EnumResourceHttpProvider.ElectronSignServerCustomer);
|
if (result?.Success != true || result.Result?.Status != EnumElectronSignRealStatus.Checking)
|
throw Oops.Oh(EnumErrorCodeType.s510, result?.Msg ?? "实名异常");
|
|
var enterpriseEmployees = await repUser.Change<EnterpriseEmployee>().AsQueryable()
|
.Where(it => it.UserId == user.Id)
|
.ToListAsync();
|
PersonalReal(
|
EnumPersonalUserRealStatus.Checking,
|
EnumUserRealMethod.Face,
|
user,
|
enterpriseEmployees,
|
request.Name,
|
request.Identity,
|
request.IdentityImg,
|
request.IdentityBackImg,
|
faceRealUrl: result.Result.FaceUrl);
|
await repUser.UpdateAsync(user);
|
|
return result.Result.FaceUrl;
|
}
|
|
/// <summary>
|
/// 个人实名
|
/// </summary>
|
public static void PersonalReal(
|
EnumPersonalUserRealStatus status,
|
EnumUserRealMethod method,
|
User user,
|
List<EnterpriseEmployee> enterpriseEmployees,
|
string name,
|
string identity,
|
string? identityImg = null,
|
string? identityBackImg = null,
|
string? phoneNumber = null,
|
string? faceRealUrl = null)
|
{
|
user.UserAuth.Name = name;
|
user.UserAuth.Identity = identity;
|
user.UserAuth.Gender = user.UserAuth.Identity.GetGender();
|
user.UserAuth.Birthday = user.UserAuth.Identity.GetBirthday();
|
user.UserAuth.Age = user.UserAuth.Identity.GetAge();
|
user.UserAuth.IdentityImg = identityImg;
|
user.UserAuth.IdentityBackImg = identityBackImg;
|
user.UserAuth.RealAccess = EnumRealAccess.BestSign;
|
user.UserAuth.RealStatus = status;
|
user.RealMethod = method;
|
if (user.RealMethod == EnumUserRealMethod.Identity3)
|
{
|
user.UserAuth.PhoneNumber = phoneNumber;
|
}
|
else
|
{
|
user.UserAuth.FaceRealUrl = faceRealUrl;
|
}
|
if (user.UserAuth.RealStatus == EnumPersonalUserRealStatus.Real)
|
{
|
user.IsReal = true;
|
user.RealTime = DateTime.Now;
|
user.Name = user.UserAuth.Name;
|
if (user.PhoneNumber.IsNull())
|
{
|
user.PhoneNumber = phoneNumber;
|
user.IsCheckPhoneNumber = true;
|
}
|
if (user.ContactPhoneNumber.IsNull())
|
{
|
user.PhoneNumber = phoneNumber;
|
}
|
user.Identity = user.UserAuth.Identity;
|
user.Age = user.UserAuth.Age;
|
user.Gender = user.UserAuth.Gender;
|
user.Birthday = user.UserAuth.Birthday;
|
foreach (var enterpriseEmployee in enterpriseEmployees)
|
{
|
enterpriseEmployee.Name = user.UserAuth.Name;
|
enterpriseEmployee.Identity = user.UserAuth.Identity;
|
enterpriseEmployee.IdentityImg = user.UserAuth.IdentityImg;
|
enterpriseEmployee.IdentityBackImg = user.UserAuth.IdentityBackImg;
|
enterpriseEmployee.Age = user.UserAuth.Age;
|
enterpriseEmployee.Gender = user.UserAuth.Gender;
|
enterpriseEmployee.Birthday = user.UserAuth.Birthday;
|
}
|
}
|
}
|
}
|
}
|