sunpengfei
2025-08-21 c108924b578a76c3152cbc569d3995d35130a505
feat:开发
1个文件已添加
4个文件已修改
329 ■■■■■ 已修改文件
FlexJobApi.Core/FlexJobApi.Core.xml 115 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
FlexJobApi.Core/Models/ElectronSignServer/Common/ElectronSignServerResult.cs 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
FlexJobApi.Core/Models/ElectronSignServer/PersonalUserReals/RealEnterpriseInputByCertAccountInput.cs 143 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
FlexJobApi.Core/Models/UserServer/Users/Commands/SyncEnterpriseUserCommand.cs 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
FlexJobApi.UserServer.Application/Users/Commands/SyncUserCommandHandler.cs 58 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
FlexJobApi.Core/FlexJobApi.Core.xml
@@ -4918,6 +4918,111 @@
            个人
            </summary>
        </member>
        <member name="T:FlexJobApi.Core.Models.ElectronSignServer.PersonalUserReals.RealEnterpriseInputByCertAccountInput">
            <summary>
            根据证书账号企业实名
            </summary>
        </member>
        <member name="P:FlexJobApi.Core.Models.ElectronSignServer.PersonalUserReals.RealEnterpriseInputByCertAccountInput.CustomerId">
            <summary>
            客户Id
            </summary>
        </member>
        <member name="P:FlexJobApi.Core.Models.ElectronSignServer.PersonalUserReals.RealEnterpriseInputByCertAccountInput.CertAccount">
            <summary>
            上上签证书账号(选填)
            </summary>
        </member>
        <member name="P:FlexJobApi.Core.Models.ElectronSignServer.PersonalUserReals.RealEnterpriseInputByCertAccountInput.OutUserId">
            <summary>
            外部企业Id
            </summary>
        </member>
        <member name="P:FlexJobApi.Core.Models.ElectronSignServer.PersonalUserReals.RealEnterpriseInputByCertAccountInput.Proxy">
            <summary>
            是否委托经办人
            </summary>
        </member>
        <member name="P:FlexJobApi.Core.Models.ElectronSignServer.PersonalUserReals.RealEnterpriseInputByCertAccountInput.RealMethod">
            <summary>
            法人/经办人实名认证方式(10个人手机号三要素 20银行卡多要素 30刷脸认证)
            </summary>
        </member>
        <member name="P:FlexJobApi.Core.Models.ElectronSignServer.PersonalUserReals.RealEnterpriseInputByCertAccountInput.EnterpriseName">
            <summary>
            企业全称
            </summary>
        </member>
        <member name="P:FlexJobApi.Core.Models.ElectronSignServer.PersonalUserReals.RealEnterpriseInputByCertAccountInput.SocietyCreditCode">
            <summary>
            统一社会信用代码
            </summary>
        </member>
        <member name="P:FlexJobApi.Core.Models.ElectronSignServer.PersonalUserReals.RealEnterpriseInputByCertAccountInput.LicenseUrl">
            <summary>
            营业执照文件地址
            </summary>
        </member>
        <member name="P:FlexJobApi.Core.Models.ElectronSignServer.PersonalUserReals.RealEnterpriseInputByCertAccountInput.LegalPerson">
            <summary>
            法人姓名
            </summary>
        </member>
        <member name="P:FlexJobApi.Core.Models.ElectronSignServer.PersonalUserReals.RealEnterpriseInputByCertAccountInput.Name">
            <summary>
            法人或经办人姓名
            </summary>
        </member>
        <member name="P:FlexJobApi.Core.Models.ElectronSignServer.PersonalUserReals.RealEnterpriseInputByCertAccountInput.Identity">
            <summary>
            法人或经办人身份证号
            </summary>
        </member>
        <member name="P:FlexJobApi.Core.Models.ElectronSignServer.PersonalUserReals.RealEnterpriseInputByCertAccountInput.IdentityImgUrl">
            <summary>
            身份证人像面Url
            </summary>
        </member>
        <member name="P:FlexJobApi.Core.Models.ElectronSignServer.PersonalUserReals.RealEnterpriseInputByCertAccountInput.IdentityBackImgUrl">
            <summary>
            身份证国徽面Url
            </summary>
        </member>
        <member name="P:FlexJobApi.Core.Models.ElectronSignServer.PersonalUserReals.RealEnterpriseInputByCertAccountInput.BankCard">
            <summary>
            法人或经办人银行卡号
            </summary>
        </member>
        <member name="P:FlexJobApi.Core.Models.ElectronSignServer.PersonalUserReals.RealEnterpriseInputByCertAccountInput.BankCardImgUrl">
            <summary>
            银行卡照片
            </summary>
        </member>
        <member name="P:FlexJobApi.Core.Models.ElectronSignServer.PersonalUserReals.RealEnterpriseInputByCertAccountInput.Mobile">
            <summary>
            法人或经办人手机号
            </summary>
        </member>
        <member name="P:FlexJobApi.Core.Models.ElectronSignServer.PersonalUserReals.RealEnterpriseInputByCertAccountInput.ProxyPowerAttorneyUrl">
            <summary>
            企业授权书
            </summary>
        </member>
        <member name="P:FlexJobApi.Core.Models.ElectronSignServer.PersonalUserReals.RealEnterpriseInputByCertAccountOutput.Id">
            <summary>
            认证流水号
            </summary>
        </member>
        <member name="P:FlexJobApi.Core.Models.ElectronSignServer.PersonalUserReals.RealEnterpriseInputByCertAccountOutput.Status">
            <summary>
            状态(0未实名 10校验中 99实名失败 100已实名)
            </summary>
        </member>
        <member name="P:FlexJobApi.Core.Models.ElectronSignServer.PersonalUserReals.RealEnterpriseInputByCertAccountOutput.CertAccount">
            <summary>
            上上签证书账号(选填)
            </summary>
        </member>
        <member name="T:FlexJobApi.Core.Models.ElectronSignServer.PersonalUserReals.RealPersonalInput">
            <summary>
            个人用户实名
@@ -10595,6 +10700,16 @@
            法人或经办人实名方式
            </summary>
        </member>
        <member name="P:FlexJobApi.Core.SyncEnterpriseUserCommandEnterpriseAuth.LegalPerson">
            <summary>
            法人姓名
            </summary>
        </member>
        <member name="P:FlexJobApi.Core.SyncEnterpriseUserCommandEnterpriseAuth.LegalIdentity">
            <summary>
            法人身份证号
            </summary>
        </member>
        <member name="P:FlexJobApi.Core.SyncEnterpriseUserCommandEnterpriseAuth.Name">
            <summary>
            法人或经办人姓名
FlexJobApi.Core/Models/ElectronSignServer/Common/ElectronSignServerResult.cs
@@ -19,5 +19,6 @@
    {
        public string Code { get; set; }
        public string Message { get; set; }
        public object Data { get; set; }
    }
}
FlexJobApi.Core/Models/ElectronSignServer/PersonalUserReals/RealEnterpriseInputByCertAccountInput.cs
New file
@@ -0,0 +1,143 @@
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.ComponentModel.DataAnnotations;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace FlexJobApi.Core.Models.ElectronSignServer.PersonalUserReals
{
    /// <summary>
    /// 根据证书账号企业实名
    /// </summary>
    [Resource([EnumResourceController.ElectronSignServerElectronSign], Method = EnumResourceMethod.Post, Route = "/api/ElectronSign/RealEnterpriseByCertAccount")]
    public class RealEnterpriseInputByCertAccountInput
    {
        /// <summary>
        /// 客户Id
        /// </summary>
        public Guid CustomerId { get; set; }
        /// <summary>
        /// 上上签证书账号(选填)
        /// </summary>
        [DisplayName("上上签证书账号")]
        [Required(ErrorMessage = "{0}不能为空")]
        public string CertAccount { get; set; }
        /// <summary>
        /// 外部企业Id
        /// </summary>
        [DisplayName("外部企业Id")]
        [Required(ErrorMessage = "{0}不能为空")]
        public string OutUserId { get; set; }
        /// <summary>
        /// 是否委托经办人
        /// </summary>
        public bool Proxy { get; set; }
        /// <summary>
        /// 法人/经办人实名认证方式(10个人手机号三要素 20银行卡多要素 30刷脸认证)
        /// </summary>
        [DisplayName("法人/经办人实名认证方式")]
        [Required(ErrorMessage = "{0}不能为空")]
        public EnumElectronSignPersonalRealMethod RealMethod { get; set; }
        /// <summary>
        /// 企业全称
        /// </summary>
        [DisplayName("企业全称")]
        [Required(ErrorMessage = "{0}不能为空")]
        public string EnterpriseName { get; set; }
        /// <summary>
        /// 统一社会信用代码
        /// </summary>
        [DisplayName("统一社会信用代码")]
        [Required(ErrorMessage = "{0}不能为空")]
        public string SocietyCreditCode { get; set; }
        /// <summary>
        /// 营业执照文件地址
        /// </summary>
        [DisplayName("营业执照")]
        [Required(ErrorMessage = "{0}不能为空")]
        public string LicenseUrl { get; set; }
        /// <summary>
        /// 法人姓名
        /// </summary>
        [DisplayName("法人姓名")]
        [Required(ErrorMessage = "{0}不能为空")]
        public string LegalPerson { get; set; }
        /// <summary>
        /// 法人或经办人姓名
        /// </summary>
        [DisplayName("法人或经办人姓名")]
        [Required(ErrorMessage = "{0}不能为空")]
        public string Name { get; set; }
        /// <summary>
        /// 法人或经办人身份证号
        /// </summary>
        [DisplayName("法人或经办人身份证号")]
        [Required(ErrorMessage = "{0}不能为空")]
        public string Identity { get; set; }
        /// <summary>
        /// 身份证人像面Url
        /// </summary>
        [DisplayName("身份证人像面Url")]
        [Required(ErrorMessage = "{0}不能为空")]
        public string IdentityImgUrl { get; set; }
        /// <summary>
        /// 身份证国徽面Url
        /// </summary>
        [DisplayName("身份证国徽面Url")]
        [Required(ErrorMessage = "{0}不能为空")]
        public string IdentityBackImgUrl { get; set; }
        /// <summary>
        /// 法人或经办人银行卡号
        /// </summary>
        public string BankCard { get; set; }
        /// <summary>
        /// 银行卡照片
        /// </summary>
        public string BankCardImgUrl { get; set; }
        /// <summary>
        /// 法人或经办人手机号
        /// </summary>
        [DisplayName("法人或经办人手机号")]
        public string Mobile { get; set; }
        /// <summary>
        /// 企业授权书
        /// </summary>
        public string ProxyPowerAttorneyUrl { get; set; }
    }
    public class RealEnterpriseInputByCertAccountOutput
    {
        /// <summary>
        /// 认证流水号
        /// </summary>
        public Guid Id { get; set; }
        /// <summary>
        /// 状态(0未实名 10校验中 99实名失败 100已实名)
        /// </summary>
        public EnumElectronSignRealStatus Status { get; set; }
        /// <summary>
        /// 上上签证书账号(选填)
        /// </summary>
        public string CertAccount { get; set; }
    }
}
FlexJobApi.Core/Models/UserServer/Users/Commands/SyncEnterpriseUserCommand.cs
@@ -200,6 +200,18 @@
        public EnumPersonalRealMethod? PersonalRealMethod { get; set; }
        /// <summary>
        /// 法人姓名
        /// </summary>
        [MaxLength(32)]
        public string LegalPerson { get; set; }
        /// <summary>
        /// 法人身份证号
        /// </summary>
        [MaxLength(18)]
        public string LegalIdentity { get; set; }
        /// <summary>
        /// 法人或经办人姓名
        /// </summary>
        [MaxLength(32)]
FlexJobApi.UserServer.Application/Users/Commands/SyncUserCommandHandler.cs
@@ -2,8 +2,10 @@
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;
@@ -49,10 +51,6 @@
            {
                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())
@@ -60,8 +58,17 @@
                var result = await BaiduOcrUtils.OcrBusinessLicense(enterprise.LicenseImage);
                if (result?.Model != null)
                {
                    result.Model.Adapt(enterprise);
                    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;
@@ -72,6 +79,11 @@
            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
@@ -80,7 +92,7 @@
                    UserType = EnumElectronSignUserType.Personal,
                    EnterpriseName = enterprise.EnterpriseName,
                    SocietyCreditCode = enterprise.SocietyCreditCode,
                    Name = enterprise.EnterpriseAuth.Name,
                    Name = enterprise.EnterpriseAuth.Name ?? enterprise.Contacts,
                    Identity = enterprise.EnterpriseAuth.Identity,
                    Mobile = enterprise.EnterpriseAuth.PhoneNumber,
                    CertAccount = enterprise.EnterpriseAuth.CertAccount
@@ -88,7 +100,7 @@
                if (resultRegOrUpdateUser?.Success == true)
                {
                    enterprise!.EnterpriseAuth!.ElectronSignEnterpriseId = resultRegOrUpdateUser.Result;
                    enterprise.EnterpriseAuth.ElectronSignEnterpriseId = resultRegOrUpdateUser.Result;
                }
                else
                {
@@ -96,10 +108,34 @@
                }
            }
            if (enterprise.Id == Guid.Empty)
                await repEnterprise.InsertAsync(enterprise);
            else
                await repEnterprise.UpdateAsync(enterprise);
            if (enterprise.IsReal)
            {
                var resultReal = await new RealEnterpriseInputByCertAccountInput
                {
                    CustomerId = App.GetConfig<Guid>("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<RealEnterpriseInputByCertAccountInput, ElectronSignServerResult<RealEnterpriseInputByCertAccountOutput>>(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)