sunpengfei
2025-08-15 8cb3856a913d593bc875fba07c3e3459f566d640
feat:开发
13个文件已添加
8个文件已修改
894 ■■■■■ 已修改文件
FlexJobApi.CommonServer.Application/FileUtils/Commands/FileCommandHandler.cs 32 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
FlexJobApi.CommonServer.Application/FileUtils/Queries/FileQueryHandler.cs 29 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
FlexJobApi.CommonServer.Application/FlexJobApi.CommonServer.Application.xml 44 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
FlexJobApi.CommonServer.Application/OcrUtils/Commands/OcrCommandHandler.cs 30 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
FlexJobApi.Core/Enums/Common/EnumOcrAccess.cs 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
FlexJobApi.Core/Enums/Common/EnumResourceController.cs 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
FlexJobApi.Core/FlexJobApi.Core.csproj 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
FlexJobApi.Core/FlexJobApi.Core.xml 279 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
FlexJobApi.Core/Models/CommonServer/FileUtils/Commands/UploadFileCommand.cs 38 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
FlexJobApi.Core/Models/CommonServer/FileUtils/Queries/GetFileUrlQuery.cs 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
FlexJobApi.Core/Models/CommonServer/OcrUtils/Commands/OcrCommand.cs 53 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
FlexJobApi.Core/Utils/AliyunUtils/AliyunOSSUploadResult.cs 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
FlexJobApi.Core/Utils/AliyunUtils/AliyunOSSUtils.cs 23 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
FlexJobApi.Core/Utils/BaiduUtils/BaiduOcrBusinessLicenseResult.cs 90 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
FlexJobApi.Core/Utils/BaiduUtils/BaiduOcrResultWord.cs 57 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
FlexJobApi.Core/Utils/BaiduUtils/BaiduOcrUtils.cs 70 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
FlexJobApi.Core/Utils/BaiduUtils/BaiduOptions.cs 36 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
FlexJobApi.Core/Utils/BaiduUtils/OcrResult.cs 26 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
FlexJobApi.Core/Utils/ExcelUtils/ExcelUtils.cs 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
FlexJobApi.Web.Entry/Startup.cs 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
FlexJobApi.Web.Entry/appsettings.json 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
FlexJobApi.CommonServer.Application/FileUtils/Commands/FileCommandHandler.cs
New file
@@ -0,0 +1,32 @@
using FlexJobApi.Core;
using Mapster;
using MediatR;
using Microsoft.AspNetCore.Http;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace FlexJobApi.CommonServer.Application
{
    /// <summary>
    /// 上传文件
    /// </summary>
    public class FileCommandHandler :
        IRequestHandler<UploadFileCommand, UploadFileCommandResult>
    {
        /// <summary>
        /// 上传文件
        /// </summary>
        /// <param name="request"></param>
        /// <param name="cancellationToken"></param>
        /// <returns></returns>
        public Task<UploadFileCommandResult> Handle(UploadFileCommand request, CancellationToken cancellationToken)
        {
            var upload = AliyunOSSUtils.Upload(request.Scene, request.File);
            var result = upload.Adapt<UploadFileCommandResult>();
            return Task.FromResult(result);
        }
    }
}
FlexJobApi.CommonServer.Application/FileUtils/Queries/FileQueryHandler.cs
New file
@@ -0,0 +1,29 @@
using FlexJobApi.Core;
using MediatR;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace FlexJobApi.CommonServer.Application
{
    /// <summary>
    /// 文件查询处理器
    /// </summary>
    public class FileQueryHandler :
        IRequestHandler<GetFileUrlQuery, string>
    {
        /// <summary>
        /// 获取文件地址
        /// </summary>
        /// <param name="request"></param>
        /// <param name="cancellationToken"></param>
        /// <returns></returns>
        public Task<string> Handle(GetFileUrlQuery request, CancellationToken cancellationToken)
        {
            var url = AliyunOSSUtils.GetUrl(request.Url);
            return Task.FromResult(url);
        }
    }
}
FlexJobApi.CommonServer.Application/FlexJobApi.CommonServer.Application.xml
@@ -141,6 +141,50 @@
            <param name="models"></param>
            <param name="all"></param>
        </member>
        <member name="T:FlexJobApi.CommonServer.Application.FileCommandHandler">
            <summary>
            上传文件
            </summary>
        </member>
        <member name="M:FlexJobApi.CommonServer.Application.FileCommandHandler.Handle(FlexJobApi.Core.UploadFileCommand,System.Threading.CancellationToken)">
            <summary>
            上传文件
            </summary>
            <param name="request"></param>
            <param name="cancellationToken"></param>
            <returns></returns>
        </member>
        <member name="T:FlexJobApi.CommonServer.Application.FileQueryHandler">
            <summary>
            文件查询处理器
            </summary>
        </member>
        <member name="M:FlexJobApi.CommonServer.Application.FileQueryHandler.Handle(FlexJobApi.Core.GetFileUrlQuery,System.Threading.CancellationToken)">
            <summary>
            获取文件地址
            </summary>
            <param name="request"></param>
            <param name="cancellationToken"></param>
            <returns></returns>
        </member>
        <member name="T:FlexJobApi.CommonServer.Application.OcrCommandHandler">
            <summary>
            文字识别营业执照
            </summary>
        </member>
        <member name="M:FlexJobApi.CommonServer.Application.OcrCommandHandler.#ctor">
            <summary>
            文字识别营业执照
            </summary>
        </member>
        <member name="M:FlexJobApi.CommonServer.Application.OcrCommandHandler.Handle(FlexJobApi.Core.GetLicenseOcrCommand,System.Threading.CancellationToken)">
            <summary>
            文字识别营业执照
            </summary>
            <param name="request"></param>
            <param name="cancellationToken"></param>
            <returns></returns>
        </member>
        <member name="T:FlexJobApi.UserServer.Application.GetResourceFieldsQueryHandler">
            <summary>
            获取资源字段
FlexJobApi.CommonServer.Application/OcrUtils/Commands/OcrCommandHandler.cs
New file
@@ -0,0 +1,30 @@
using FlexJobApi.Core;
using Mapster;
using MediatR;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace FlexJobApi.CommonServer.Application
{
    /// <summary>
    /// 文字识别营业执照
    /// </summary>
    public class OcrCommandHandler() :
        IRequestHandler<GetLicenseOcrCommand, GetLicenseOcrCommandResult>
    {
        /// <summary>
        /// 文字识别营业执照
        /// </summary>
        /// <param name="request"></param>
        /// <param name="cancellationToken"></param>
        /// <returns></returns>
        public async Task<GetLicenseOcrCommandResult> Handle(GetLicenseOcrCommand request, CancellationToken cancellationToken)
        {
            var result = await request.Url.OcrBusinessLicense(request.Scene, request.IsOssUrl);
            return result.Adapt<GetLicenseOcrCommandResult>();
        }
    }
}
FlexJobApi.Core/Enums/Common/EnumOcrAccess.cs
New file
@@ -0,0 +1,19 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace FlexJobApi.Core
{
    /// <summary>
    /// 文字识别通道
    /// </summary>
    public enum EnumOcrAccess
    {
        /// <summary>
        /// 百度
        /// </summary>
        Baidu = 10
    }
}
FlexJobApi.Core/Enums/Common/EnumResourceController.cs
@@ -33,6 +33,17 @@
        TaskCheckReceive,
        /// <summary>
        /// 文字识别
        /// </summary>
        [ResourceController(Service = EnumResourceService.CommonServer)]
        FileUtils,
        /// <summary>
        /// 文字识别
        /// </summary>
        [ResourceController(Service = EnumResourceService.CommonServer)]
        OcrUtils,
        /// <summary>
        /// 用户认证
        /// </summary>
        [ResourceController(Service = EnumResourceService.UserServer)]
FlexJobApi.Core/FlexJobApi.Core.csproj
@@ -19,6 +19,7 @@
    <ItemGroup>
        <PackageReference Include="aliyun-net-sdk-core" Version="1.5.6" />
        <PackageReference Include="Aliyun.OSS.SDK.NetCore" Version="2.14.1" />
        <PackageReference Include="Baidu.AI" Version="4.15.16" />
        <PackageReference Include="Consul" Version="1.7.14.8" />
        <PackageReference Include="EFCore.BulkExtensions" Version="9.0.1" />
        <PackageReference Include="Furion" Version="4.9.7.106" />
FlexJobApi.Core/FlexJobApi.Core.xml
@@ -2387,6 +2387,16 @@
            严重
            </summary>
        </member>
        <member name="T:FlexJobApi.Core.EnumOcrAccess">
            <summary>
            文字识别通道
            </summary>
        </member>
        <member name="F:FlexJobApi.Core.EnumOcrAccess.Baidu">
            <summary>
            百度
            </summary>
        </member>
        <member name="T:FlexJobApi.Core.EnumPagedListOrder">
            <summary>
            分页列表排序
@@ -2450,6 +2460,16 @@
        <member name="F:FlexJobApi.Core.EnumResourceController.TaskCheckReceive">
            <summary>
            任务验收
            </summary>
        </member>
        <member name="F:FlexJobApi.Core.EnumResourceController.FileUtils">
            <summary>
            文字识别
            </summary>
        </member>
        <member name="F:FlexJobApi.Core.EnumResourceController.OcrUtils">
            <summary>
            文字识别
            </summary>
        </member>
        <member name="F:FlexJobApi.Core.EnumResourceController.Auth">
@@ -3711,6 +3731,81 @@
        <member name="P:FlexJobApi.Core.GetDictionaryDatasQueryResultItemCategory.Name">
            <summary>
            名称
            </summary>
        </member>
        <member name="T:FlexJobApi.Core.UploadFileCommand">
            <summary>
            上传文件
            </summary>
        </member>
        <member name="P:FlexJobApi.Core.UploadFileCommand.Scene">
            <summary>
            场景
            </summary>
        </member>
        <member name="P:FlexJobApi.Core.UploadFileCommand.File">
            <summary>
            文件
            </summary>
        </member>
        <member name="T:FlexJobApi.Core.UploadFileCommandResult">
            <summary>
            上传文件-结果
            </summary>
        </member>
        <member name="P:FlexJobApi.Core.UploadFileCommandResult.Url">
            <summary>
            地址
            </summary>
        </member>
        <member name="T:FlexJobApi.Core.GetFileUrlQuery">
            <summary>
            获取文件地址
            </summary>
        </member>
        <member name="P:FlexJobApi.Core.GetFileUrlQuery.Url">
            <summary>
            地址
            </summary>
        </member>
        <member name="T:FlexJobApi.Core.GetLicenseOcrCommand">
            <summary>
            文字识别营业执照
            </summary>
        </member>
        <member name="P:FlexJobApi.Core.GetLicenseOcrCommand.Access">
            <summary>
            通道
            </summary>
        </member>
        <member name="P:FlexJobApi.Core.GetLicenseOcrCommand.Scene">
            <summary>
            场景
            </summary>
        </member>
        <member name="P:FlexJobApi.Core.GetLicenseOcrCommand.Url">
            <summary>
            链接地址
            </summary>
        </member>
        <member name="P:FlexJobApi.Core.GetLicenseOcrCommand.IsOssUrl">
            <summary>
            是否为云存储相对地址
            </summary>
        </member>
        <member name="T:FlexJobApi.Core.GetLicenseOcrCommandResult">
            <summary>
            文字识别营业执照
            </summary>
        </member>
        <member name="P:FlexJobApi.Core.GetLicenseOcrCommandResult.Url">
            <summary>
            地址
            </summary>
        </member>
        <member name="P:FlexJobApi.Core.GetLicenseOcrCommandResult.Model">
            <summary>
            模型
            </summary>
        </member>
        <member name="T:FlexJobApi.Core.GetResourceFieldsQuery">
@@ -8879,6 +8974,21 @@
            模板代码
            </summary>
        </member>
        <member name="T:FlexJobApi.Core.AliyunOSSUploadResult">
            <summary>
            阿里云OSS上传结果
            </summary>
        </member>
        <member name="P:FlexJobApi.Core.AliyunOSSUploadResult.Url">
            <summary>
            相对路径
            </summary>
        </member>
        <member name="P:FlexJobApi.Core.AliyunOSSUploadResult.Buffer">
            <summary>
            字节
            </summary>
        </member>
        <member name="T:FlexJobApi.Core.AliyunOSSUtils">
            <summary>
            阿里云OSS工具
@@ -8919,6 +9029,175 @@
            <param name="process"></param>
            <returns></returns>
        </member>
        <member name="T:FlexJobApi.Core.BaiduOcrBusinessLicenseResult">
            <summary>
            百度文字识别结果
            </summary>
        </member>
        <member name="P:FlexJobApi.Core.BaiduOcrBusinessLicenseResult.Url">
            <summary>
            地址
            </summary>
        </member>
        <member name="P:FlexJobApi.Core.BaiduOcrBusinessLicenseResult.Model">
            <summary>
            模型
            </summary>
        </member>
        <member name="P:FlexJobApi.Core.BaiduOcrBusinessLicenseResult.ErrorCode">
            <summary>
            错误码
            </summary>
        </member>
        <member name="P:FlexJobApi.Core.BaiduOcrBusinessLicenseResult.ErrorMessage">
            <summary>
            错误消息
            </summary>
        </member>
        <member name="P:FlexJobApi.Core.BaiduOcrBusinessLicenseResult.WordsResult">
            <summary>
            文字结果
            </summary>
        </member>
        <member name="T:FlexJobApi.Core.BaiduOcrBusinessLicenseResultModel">
            <summary>
            百度文字识别结果
            </summary>
        </member>
        <member name="P:FlexJobApi.Core.BaiduOcrBusinessLicenseResultModel.EnterpriseName">
            <summary>
            企业全称
            </summary>
        </member>
        <member name="P:FlexJobApi.Core.BaiduOcrBusinessLicenseResultModel.SocietyCreditCode">
            <summary>
            统一社会信用代码
            </summary>
        </member>
        <member name="P:FlexJobApi.Core.BaiduOcrBusinessLicenseResultModel.LegalPerson">
            <summary>
            法人姓名
            </summary>
        </member>
        <member name="P:FlexJobApi.Core.BaiduOcrBusinessLicenseResultModel.EnterpriseType">
            <summary>
            企业类型
            </summary>
        </member>
        <member name="P:FlexJobApi.Core.BaiduOcrBusinessLicenseResultModel.RegisteredCapital">
            <summary>
            注册资本
            </summary>
        </member>
        <member name="P:FlexJobApi.Core.BaiduOcrBusinessLicenseResultModel.EstablishmentDate">
            <summary>
            成立日期
            </summary>
        </member>
        <member name="P:FlexJobApi.Core.BaiduOcrBusinessLicenseResultModel.Address">
            <summary>
            企业地址
            </summary>
        </member>
        <member name="P:FlexJobApi.Core.BaiduOcrBusinessLicenseResultModel.BusinessScope">
            <summary>
            经营范围
            </summary>
        </member>
        <member name="T:FlexJobApi.Core.BaiduOcrResultWord">
            <summary>
            百度文字识别结果
            </summary>
        </member>
        <member name="P:FlexJobApi.Core.BaiduOcrResultWord.Location">
            <summary>
            定位
            </summary>
        </member>
        <member name="P:FlexJobApi.Core.BaiduOcrResultWord.Words">
            <summary>
            文字
            </summary>
        </member>
        <member name="T:FlexJobApi.Core.BaiduOcrResultWordLocation">
            <summary>
            百度文字识别结果
            </summary>
        </member>
        <member name="P:FlexJobApi.Core.BaiduOcrResultWordLocation.Top">
            <summary>
            距离顶部
            </summary>
        </member>
        <member name="P:FlexJobApi.Core.BaiduOcrResultWordLocation.Left">
            <summary>
            距离左边
            </summary>
        </member>
        <member name="P:FlexJobApi.Core.BaiduOcrResultWordLocation.Width">
            <summary>
            宽度
            </summary>
        </member>
        <member name="P:FlexJobApi.Core.BaiduOcrResultWordLocation.Height">
            <summary>
            高度
            </summary>
        </member>
        <member name="T:FlexJobApi.Core.BaiduOcrUtils">
            <summary>
            百度文字识别工具
            </summary>
        </member>
        <member name="M:FlexJobApi.Core.BaiduOcrUtils.OcrBusinessLicense(System.String,System.String,System.Boolean)">
            <summary>
            营业执照OCR
            </summary>
            <param name="url"></param>
            <param name="scene"></param>
            <param name="isOssUrl"></param>
        </member>
        <member name="T:FlexJobApi.Core.BaiduOptions">
            <summary>
            百度配置
            </summary>
        </member>
        <member name="P:FlexJobApi.Core.BaiduOptions.Ocr">
            <summary>
            文字识别
            </summary>
        </member>
        <member name="T:FlexJobApi.Core.BaiduOcrOptions">
            <summary>
            百度文字识别配置
            </summary>
        </member>
        <member name="P:FlexJobApi.Core.BaiduOcrOptions.Key">
            <summary>
            键
            </summary>
        </member>
        <member name="P:FlexJobApi.Core.BaiduOcrOptions.Secret">
            <summary>
            秘钥
            </summary>
        </member>
        <member name="T:FlexJobApi.Core.OcrResult`1">
            <summary>
            OCR识别结果
            </summary>
            <typeparam name="T"></typeparam>
        </member>
        <member name="P:FlexJobApi.Core.OcrResult`1.Url">
            <summary>
            地址
            </summary>
        </member>
        <member name="P:FlexJobApi.Core.OcrResult`1.Data">
            <summary>
            数据
            </summary>
        </member>
        <member name="M:FlexJobApi.Core.CollectionUtils.DistinctAdd``1(System.Collections.Generic.List{``0},``0,System.Collections.Generic.IEqualityComparer{``0})">
            <summary>
            去重添加
FlexJobApi.Core/Models/CommonServer/FileUtils/Commands/UploadFileCommand.cs
New file
@@ -0,0 +1,38 @@
using MediatR;
using Microsoft.AspNetCore.Http;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace FlexJobApi.Core
{
    /// <summary>
    /// 上传文件
    /// </summary>
    [Resource([EnumResourceController.FileUtils], FileUpload = true)]
    public class UploadFileCommand : IRequest<UploadFileCommandResult>
    {
        /// <summary>
        /// 场景
        /// </summary>
        public string Scene { get; set; }
        /// <summary>
        /// 文件
        /// </summary>
        public IFormFile File { get; set; }
    }
    /// <summary>
    /// 上传文件-结果
    /// </summary>
    public class UploadFileCommandResult
    {
        /// <summary>
        /// 地址
        /// </summary>
        public string Url { get; set; }
    }
}
FlexJobApi.Core/Models/CommonServer/FileUtils/Queries/GetFileUrlQuery.cs
New file
@@ -0,0 +1,21 @@
using MediatR;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace FlexJobApi.Core
{
    /// <summary>
    /// 获取文件地址
    /// </summary>
    [Resource([EnumResourceController.FileUtils])]
    public class GetFileUrlQuery : IRequest<string>
    {
        /// <summary>
        /// 地址
        /// </summary>
        public string Url { get; set; }
    }
}
FlexJobApi.Core/Models/CommonServer/OcrUtils/Commands/OcrCommand.cs
New file
@@ -0,0 +1,53 @@
using MediatR;
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace FlexJobApi.Core
{
    /// <summary>
    /// 文字识别营业执照
    /// </summary>
    [Resource([EnumResourceController.OcrUtils])]
    public class GetLicenseOcrCommand : IRequest<GetLicenseOcrCommandResult>
    {
        /// <summary>
        /// 通道
        /// </summary>
        public EnumOcrAccess Access { get; set; }
        /// <summary>
        /// 场景
        /// </summary>
        public string Scene { get; set; }
        /// <summary>
        /// 链接地址
        /// </summary>
        public string Url { get; set; }
        /// <summary>
        /// 是否为云存储相对地址
        /// </summary>
        public bool IsOssUrl { get; set; }
    }
    /// <summary>
    /// 文字识别营业执照
    /// </summary>
    public class GetLicenseOcrCommandResult
    {
        /// <summary>
        /// 地址
        /// </summary>
        public string Url { get; set; }
        /// <summary>
        /// 模型
        /// </summary>
        public BaiduOcrBusinessLicenseResultModel Model { get; set; }
    }
}
FlexJobApi.Core/Utils/AliyunUtils/AliyunOSSUploadResult.cs
New file
@@ -0,0 +1,24 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace FlexJobApi.Core
{
    /// <summary>
    /// 阿里云OSS上传结果
    /// </summary>
    public class AliyunOSSUploadResult
    {
        /// <summary>
        /// 相对路径
        /// </summary>
        public string Url { get; set; }
        /// <summary>
        /// 字节
        /// </summary>
        public byte[] Buffer { get; set; }
    }
}
FlexJobApi.Core/Utils/AliyunUtils/AliyunOSSUtils.cs
@@ -4,6 +4,7 @@
using Aliyun.Acs.Core.Profile;
using Aliyun.OSS;
using Furion;
using Furion.DistributedIDGenerator;
using Furion.HttpRemote;
using Microsoft.AspNetCore.Http;
using Microsoft.CodeAnalysis;
@@ -51,8 +52,12 @@
        /// <param name="url"></param>
        /// <param name="filename"></param>
        /// <returns></returns>
        public static string Upload(string scene, string url, string filename = null)
        public static AliyunOSSUploadResult Upload(string scene, string url, string filename = null)
        {
            if (filename.IsNull())
            {
                filename = url.Substring(url.LastIndexOf('/') + 1);
            }
            var stream = App.GetRequiredService<IHttpRemoteService>().GetAsStream(url);
            return Upload(scene, stream, filename);
        }
@@ -64,9 +69,10 @@
        /// <param name="file"></param>
        /// <param name="filename"></param>
        /// <returns></returns>
        public static string Upload(string scene, IFormFile file, string filename = null)
        public static AliyunOSSUploadResult Upload(string scene, IFormFile file, string filename = null)
        {
            var stream = file.OpenReadStream();
            filename = filename ?? file.FileName;
            return Upload(scene, stream, filename);
        }
@@ -77,13 +83,20 @@
        /// <param name="stream"></param>
        /// <param name="filename"></param>
        /// <returns></returns>
        public static string Upload(string scene, Stream stream, string filename = null)
        public static AliyunOSSUploadResult Upload(string scene, Stream stream, string filename)
        {
            var options = App.GetOptions<AliyunOptions>().OSS;
            var client = new OssClient(options.Endpoint, options.AccessKeyId, options.AccessSecret);
            var key = $"Resource/{scene}/{DateTime.Now:yyyy-MM-dd}/{filename}";
            var key = $"Resource/FlexJob/{scene}/{DateTime.Now:yyyy-MM-dd}/{DateTime.Now.ToTimeStamp()}-{IDGen.NextID()}/{filename}";
            client.PutObject(options.BucketName, key, stream);
            return key;
            var result = new AliyunOSSUploadResult
            {
                Url = key
            };
            stream.Seek(0, SeekOrigin.Begin);
            result.Buffer = new byte[stream.Length];
            stream.ReadExactly(result.Buffer);
            return result;
        }
        /// <summary>
FlexJobApi.Core/Utils/BaiduUtils/BaiduOcrBusinessLicenseResult.cs
New file
@@ -0,0 +1,90 @@
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace FlexJobApi.Core
{
    /// <summary>
    /// 百度文字识别结果
    /// </summary>
    public class BaiduOcrBusinessLicenseResult
    {
        /// <summary>
        /// 地址
        /// </summary>
        public string Url { get; set; }
        /// <summary>
        /// 模型
        /// </summary>
        public BaiduOcrBusinessLicenseResultModel Model { get; set; }
        /// <summary>
        /// 错误码
        /// </summary>
        [JsonProperty("error_code")]
        public string ErrorCode { get; set; }
        /// <summary>
        /// 错误消息
        /// </summary>
        [JsonProperty("error_msg")]
        public string ErrorMessage { get; set; }
        /// <summary>
        /// 文字结果
        /// </summary>
        [JsonProperty("words_result")]
        public Dictionary<string, BaiduOcrResultWord> WordsResult { get; set; }
    }
    /// <summary>
    /// 百度文字识别结果
    /// </summary>
    public class BaiduOcrBusinessLicenseResultModel
    {
        /// <summary>
        /// 企业全称
        /// </summary>
        public string EnterpriseName { get; set; }
        /// <summary>
        /// 统一社会信用代码
        /// </summary>
        public string SocietyCreditCode { get; set; }
        /// <summary>
        /// 法人姓名
        /// </summary>
        public string LegalPerson { get; set; }
        /// <summary>
        /// 企业类型
        /// </summary>
        public string EnterpriseType { get; set; }
        /// <summary>
        /// 注册资本
        /// </summary>
        public string RegisteredCapital { get; set; }
        /// <summary>
        /// 成立日期
        /// </summary>
        public string EstablishmentDate { get; set; }
        /// <summary>
        /// 企业地址
        /// </summary>
        public string Address { get; set; }
        /// <summary>
        /// 经营范围
        /// </summary>
        public string BusinessScope { get; set; }
    }
}
FlexJobApi.Core/Utils/BaiduUtils/BaiduOcrResultWord.cs
New file
@@ -0,0 +1,57 @@
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace FlexJobApi.Core
{
    /// <summary>
    /// 百度文字识别结果
    /// </summary>
    public class BaiduOcrResultWord
    {
        /// <summary>
        /// 定位
        /// </summary>
        [JsonProperty("location")]
        public BaiduOcrResultWordLocation Location { get; set; }
        /// <summary>
        /// 文字
        /// </summary>
        [JsonProperty("words")]
        public string Words { get; set; }
    }
    /// <summary>
    /// 百度文字识别结果
    /// </summary>
    public class BaiduOcrResultWordLocation
    {
        /// <summary>
        /// 距离顶部
        /// </summary>
        [JsonProperty("top")]
        public int Top { get; set; }
        /// <summary>
        /// 距离左边
        /// </summary>
        [JsonProperty("left")]
        public int Left { get; set; }
        /// <summary>
        /// 宽度
        /// </summary>
        [JsonProperty("width")]
        public int Width { get; set; }
        /// <summary>
        /// 高度
        /// </summary>
        [JsonProperty("height")]
        public int Height { get; set; }
    }
}
FlexJobApi.Core/Utils/BaiduUtils/BaiduOcrUtils.cs
New file
@@ -0,0 +1,70 @@
using Baidu.Aip.Ocr;
using Furion;
using Furion.DistributedIDGenerator;
using Furion.FriendlyException;
using Furion.HttpRemote;
using Microsoft.AspNetCore.DataProtection;
using Microsoft.Extensions.Options;
using NetTopologySuite.Operation.Buffer;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Text;
using System.Threading.Tasks;
namespace FlexJobApi.Core
{
    /// <summary>
    /// 百度文字识别工具
    /// </summary>
    public static class BaiduOcrUtils
    {
        /// <summary>
        /// 营业执照OCR
        /// </summary>
        /// <param name="url"></param>
        /// <param name="scene"></param>
        /// <param name="isOssUrl"></param>
        public static async Task<BaiduOcrBusinessLicenseResult> OcrBusinessLicense(this string url, string scene, bool isOssUrl = true)
        {
            var options = App.GetOptions<BaiduOptions>();
            var ocr = new Ocr(options.Ocr.Key, options.Ocr.Secret);
            ocr.Timeout = 60000;
            JObject value;
            if (isOssUrl)
            {
                var downloadUrl = AliyunOSSUtils.GetUrl(url);
                var buffer = await App.GetRequiredService<IHttpRemoteService>().GetAsByteArrayAsync(downloadUrl);
                value = ocr.BusinessLicense(buffer);
            }
            else
            {
                var upload = AliyunOSSUtils.Upload(scene, url);
                url = upload.Url;
                value = ocr.BusinessLicense(upload.Buffer);
            }
            var result = value.ToObject<BaiduOcrBusinessLicenseResult>();
            result.Url = url;
            if (result.ErrorCode.IsNotNull())
            {
                return result;
            }
            result.Model = new BaiduOcrBusinessLicenseResultModel
            {
                EnterpriseName = result.WordsResult["单位名称"].Words,
                SocietyCreditCode = result.WordsResult["社会信用代码"].Words,
                LegalPerson = result.WordsResult["法人"].Words,
                EnterpriseType = result.WordsResult["类型"].Words,
                RegisteredCapital = result.WordsResult["注册资本"].Words,
                EstablishmentDate = result.WordsResult["成立日期"].Words,
                Address = result.WordsResult["地址"].Words,
                BusinessScope = result.WordsResult["经营范围"].Words,
            };
            return result;
        }
    }
}
FlexJobApi.Core/Utils/BaiduUtils/BaiduOptions.cs
New file
@@ -0,0 +1,36 @@
using Furion.ConfigurableOptions;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace FlexJobApi.Core
{
    /// <summary>
    /// 百度配置
    /// </summary>
    public class BaiduOptions : IConfigurableOptions
    {
        /// <summary>
        /// 文字识别
        /// </summary>
        public BaiduOcrOptions Ocr { get; set; }
    }
    /// <summary>
    /// 百度文字识别配置
    /// </summary>
    public class BaiduOcrOptions
    {
        /// <summary>
        /// 键
        /// </summary>
        public string Key { get; set; }
        /// <summary>
        /// 秘钥
        /// </summary>
        public string Secret { get; set; }
    }
}
FlexJobApi.Core/Utils/BaiduUtils/OcrResult.cs
New file
@@ -0,0 +1,26 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace FlexJobApi.Core
{
    /// <summary>
    /// OCR识别结果
    /// </summary>
    /// <typeparam name="T"></typeparam>
    public class OcrResult<T>
        where T : class, new()
    {
        /// <summary>
        /// 地址
        /// </summary>
        public string Url { get; set; }
        /// <summary>
        /// 数据
        /// </summary>
        public T Data { get; set; }
    }
}
FlexJobApi.Core/Utils/ExcelUtils/ExcelUtils.cs
@@ -87,7 +87,7 @@
            var stream = new MemoryStream();
            await MiniExcel.SaveAsAsync(stream, models, configuration: config);
            stream.Seek(0, SeekOrigin.Begin);
            return AliyunOSSUtils.Upload(scene, stream, filename);
            return AliyunOSSUtils.Upload(scene, stream, filename).Url;
        }
    }
}
FlexJobApi.Web.Entry/Startup.cs
@@ -26,6 +26,7 @@
            services.AddConfigurableOptions<WxmpOptions>();
            services.AddConfigurableOptions<AliyunOptions>();
            services.AddConfigurableOptions<BaiduOptions>();
            services.AddComponent<LogServiceComponent>();
@@ -37,7 +38,7 @@
            services.AddHttpRemote();
            services.AddSingleton<ResourceHttpUtils>();
            services.AddSingleton<AliyunSmsUtils>();
            services.AddSingleton<AliyunSmsUtils>();
            services.AddSingleton<WxmpUtils>();
            services.AddScoped<SmsUtils>();
FlexJobApi.Web.Entry/appsettings.json
@@ -44,6 +44,12 @@
      "DurationSeconds": 3600
    }
  },
  "Baidu": {
    "Ocr": {
      "Key": "Htx3y6eFnlW92WvHx9aW44f8",
      "Secret": "k1rDa3vjVtArrQio9LtR5AjqARSw45WO"
    }
  },
  "SMS": {
    "Enable": true,
    "AccessKeyId": "LTAI5tMS7qz1duiyncCqxB8H",