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
{
///
/// 个人实名
///
///
///
public class PersonalUserRealCommandHandler(
IRepository repUser
) :
IRequestHandler,
IRequestHandler,
IRequestHandler
{
private readonly IRepository repUser = repUser;
///
/// 发送个人三要素实名短信
///
///
///
///
public async Task 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>(EnumResourceHttpProvider.ElectronSignServerCustomer);
if (result?.Success == true)
{
user.UserAuth.ElectronSignUserId = result.Result;
}
else
{
throw Oops.Oh(EnumErrorCodeType.s510, result?.Message ?? "注册实名账号异常");
}
}
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>(EnumResourceHttpProvider.ElectronSignServerCustomer);
if (sendRealSmsResult?.Success != true)
throw Oops.Oh(EnumErrorCodeType.s510, sendRealSmsResult?.Message ?? "发送实名短信异常");
PersonalReal(
EnumPersonalUserRealStatus.Checking,
EnumUserRealMethod.Identity3,
user,
new List(),
request.Name,
request.Identity,
phoneNumber: request.PhoneNumber);
return user.Id;
}
///
/// 个人三要素实名认证
///
///
///
///
public async Task 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, "用户已实名,请勿重复申请");
if (user.UserAuth == null)
{
user.UserAuth = new UserAuth();
}
if (user.UserAuth.ElectronSignUserId == null)
{
var resultRegOrUpdateUser = await new RegOrUpdateUserInput
{
OutUserId = user.Id.ToString(),
UserType = EnumElectronSignUserType.Personal,
Name = request.Name,
Identity = request.Identity,
Mobile = request.PhoneNumber
}.SendHttpAsync>(EnumResourceHttpProvider.ElectronSignServerCustomer);
if (resultRegOrUpdateUser?.Success == true)
{
user.UserAuth.ElectronSignUserId = resultRegOrUpdateUser.Result;
}
else
{
throw Oops.Oh(EnumErrorCodeType.s510, resultRegOrUpdateUser?.Message ?? "注册实名账号异常");
}
}
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>(EnumResourceHttpProvider.ElectronSignServerCustomer);
if (result?.Success != true || result.Result?.Status != EnumElectronSignRealStatus.Real)
throw Oops.Oh(EnumErrorCodeType.s510, result?.Message ?? "实名异常");
var enterpriseEmployees = await repUser.Change().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;
}
///
/// 个人人脸实名认证
///
///
///
///
public async Task 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.ElectronSignUserId == null)
{
var resultRegOrUpdateUser = await new RegOrUpdateUserInput
{
OutUserId = user.Id.ToString(),
UserType = EnumElectronSignUserType.Personal,
Name = request.Name,
Identity = request.Identity,
Mobile = user.PhoneNumber
}.SendHttpAsync>(EnumResourceHttpProvider.ElectronSignServerCustomer);
if (resultRegOrUpdateUser?.Success == true)
{
user.UserAuth.ElectronSignUserId = resultRegOrUpdateUser.Result;
}
else
{
throw Oops.Oh(EnumErrorCodeType.s510, resultRegOrUpdateUser?.Message ?? "注册实名账号异常");
}
}
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>(EnumResourceHttpProvider.ElectronSignServerCustomer);
if (result?.Success != true || result.Result?.Status != EnumElectronSignRealStatus.Checking)
throw Oops.Oh(EnumErrorCodeType.s510, result?.Message ?? "实名异常");
var enterpriseEmployees = await repUser.Change().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
.Replace("https://h5-v2.kych5.com", "https://wx05.ssqian.com.cn")
.Replace("https://openapi.bestsign.info", "https://wx115.bestsign.info")
.Replace("https://openapi.bestsign.cn", "https://wx115.bestsign.cn");
}
///
/// 个人实名
///
public static void PersonalReal(
EnumPersonalUserRealStatus status,
EnumUserRealMethod method,
User user,
List 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;
}
}
}
}
}