From 8cb3856a913d593bc875fba07c3e3459f566d640 Mon Sep 17 00:00:00 2001
From: sunpengfei <i@angelzzz.com>
Date: 星期五, 15 八月 2025 09:44:10 +0800
Subject: [PATCH] feat:开发

---
 FlexJobApi.Core/Utils/AliyunUtils/AliyunOSSUtils.cs                          |   23 +
 FlexJobApi.Web.Entry/Startup.cs                                              |    3 
 FlexJobApi.Core/Models/CommonServer/FileUtils/Commands/UploadFileCommand.cs  |   38 ++
 FlexJobApi.Core/Utils/BaiduUtils/OcrResult.cs                                |   26 +
 FlexJobApi.Core/Utils/BaiduUtils/BaiduOcrBusinessLicenseResult.cs            |   90 ++++++
 FlexJobApi.Core/Utils/BaiduUtils/BaiduOptions.cs                             |   36 ++
 FlexJobApi.Web.Entry/appsettings.json                                        |    6 
 FlexJobApi.Core/Enums/Common/EnumOcrAccess.cs                                |   19 +
 FlexJobApi.Core/Models/CommonServer/FileUtils/Queries/GetFileUrlQuery.cs     |   21 +
 FlexJobApi.Core/Utils/AliyunUtils/AliyunOSSUploadResult.cs                   |   24 +
 FlexJobApi.Core/Models/CommonServer/OcrUtils/Commands/OcrCommand.cs          |   53 +++
 FlexJobApi.CommonServer.Application/FlexJobApi.CommonServer.Application.xml  |   44 ++
 FlexJobApi.CommonServer.Application/FileUtils/Commands/FileCommandHandler.cs |   32 ++
 FlexJobApi.CommonServer.Application/OcrUtils/Commands/OcrCommandHandler.cs   |   30 ++
 FlexJobApi.CommonServer.Application/FileUtils/Queries/FileQueryHandler.cs    |   29 +
 FlexJobApi.Core/Utils/BaiduUtils/BaiduOcrResultWord.cs                       |   57 +++
 FlexJobApi.Core/FlexJobApi.Core.xml                                          |  279 ++++++++++++++++++
 FlexJobApi.Core/Utils/BaiduUtils/BaiduOcrUtils.cs                            |   70 ++++
 FlexJobApi.Core/Enums/Common/EnumResourceController.cs                       |   11 
 FlexJobApi.Core/Utils/ExcelUtils/ExcelUtils.cs                               |    2 
 FlexJobApi.Core/FlexJobApi.Core.csproj                                       |    1 
 21 files changed, 887 insertions(+), 7 deletions(-)

diff --git a/FlexJobApi.CommonServer.Application/FileUtils/Commands/FileCommandHandler.cs b/FlexJobApi.CommonServer.Application/FileUtils/Commands/FileCommandHandler.cs
new file mode 100644
index 0000000..b663d75
--- /dev/null
+++ b/FlexJobApi.CommonServer.Application/FileUtils/Commands/FileCommandHandler.cs
@@ -0,0 +1,32 @@
+锘縰sing 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);
+        }
+    }
+}
diff --git a/FlexJobApi.CommonServer.Application/FileUtils/Queries/FileQueryHandler.cs b/FlexJobApi.CommonServer.Application/FileUtils/Queries/FileQueryHandler.cs
new file mode 100644
index 0000000..a09f511
--- /dev/null
+++ b/FlexJobApi.CommonServer.Application/FileUtils/Queries/FileQueryHandler.cs
@@ -0,0 +1,29 @@
+锘縰sing 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);
+        }
+    }
+}
diff --git a/FlexJobApi.CommonServer.Application/FlexJobApi.CommonServer.Application.xml b/FlexJobApi.CommonServer.Application/FlexJobApi.CommonServer.Application.xml
index f4cc7bc..cff76e9 100644
--- a/FlexJobApi.CommonServer.Application/FlexJobApi.CommonServer.Application.xml
+++ b/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>
             鑾峰彇璧勬簮瀛楁
diff --git a/FlexJobApi.CommonServer.Application/OcrUtils/Commands/OcrCommandHandler.cs b/FlexJobApi.CommonServer.Application/OcrUtils/Commands/OcrCommandHandler.cs
new file mode 100644
index 0000000..9d7840c
--- /dev/null
+++ b/FlexJobApi.CommonServer.Application/OcrUtils/Commands/OcrCommandHandler.cs
@@ -0,0 +1,30 @@
+锘縰sing 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>();
+        }
+    }
+}
diff --git a/FlexJobApi.Core/Enums/Common/EnumOcrAccess.cs b/FlexJobApi.Core/Enums/Common/EnumOcrAccess.cs
new file mode 100644
index 0000000..9ac4f81
--- /dev/null
+++ b/FlexJobApi.Core/Enums/Common/EnumOcrAccess.cs
@@ -0,0 +1,19 @@
+锘縰sing 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
+    }
+}
diff --git a/FlexJobApi.Core/Enums/Common/EnumResourceController.cs b/FlexJobApi.Core/Enums/Common/EnumResourceController.cs
index 5e24f9e..1f0180c 100644
--- a/FlexJobApi.Core/Enums/Common/EnumResourceController.cs
+++ b/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)]
diff --git a/FlexJobApi.Core/FlexJobApi.Core.csproj b/FlexJobApi.Core/FlexJobApi.Core.csproj
index a55ea21..1df082e 100644
--- a/FlexJobApi.Core/FlexJobApi.Core.csproj
+++ b/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" />
diff --git a/FlexJobApi.Core/FlexJobApi.Core.xml b/FlexJobApi.Core/FlexJobApi.Core.xml
index ba8b6c1..3061406 100644
--- a/FlexJobApi.Core/FlexJobApi.Core.xml
+++ b/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 @@
             妯℃澘浠g爜
             </summary>
         </member>
+        <member name="T:FlexJobApi.Core.AliyunOSSUploadResult">
+            <summary>
+            闃块噷浜慜SS涓婁紶缁撴灉
+            </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>
             闃块噷浜慜SS宸ュ叿
@@ -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>
+            缁熶竴绀句細淇$敤浠g爜
+            </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>
             鍘婚噸娣诲姞
diff --git a/FlexJobApi.Core/Models/CommonServer/FileUtils/Commands/UploadFileCommand.cs b/FlexJobApi.Core/Models/CommonServer/FileUtils/Commands/UploadFileCommand.cs
new file mode 100644
index 0000000..3dfc16f
--- /dev/null
+++ b/FlexJobApi.Core/Models/CommonServer/FileUtils/Commands/UploadFileCommand.cs
@@ -0,0 +1,38 @@
+锘縰sing 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; }
+    }
+}
diff --git a/FlexJobApi.Core/Models/CommonServer/FileUtils/Queries/GetFileUrlQuery.cs b/FlexJobApi.Core/Models/CommonServer/FileUtils/Queries/GetFileUrlQuery.cs
new file mode 100644
index 0000000..15d4bd2
--- /dev/null
+++ b/FlexJobApi.Core/Models/CommonServer/FileUtils/Queries/GetFileUrlQuery.cs
@@ -0,0 +1,21 @@
+锘縰sing 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; }
+    }
+}
diff --git a/FlexJobApi.Core/Models/CommonServer/OcrUtils/Commands/OcrCommand.cs b/FlexJobApi.Core/Models/CommonServer/OcrUtils/Commands/OcrCommand.cs
new file mode 100644
index 0000000..ec9cdab
--- /dev/null
+++ b/FlexJobApi.Core/Models/CommonServer/OcrUtils/Commands/OcrCommand.cs
@@ -0,0 +1,53 @@
+锘縰sing 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; }
+    }
+}
diff --git a/FlexJobApi.Core/Utils/AliyunUtils/AliyunOSSUploadResult.cs b/FlexJobApi.Core/Utils/AliyunUtils/AliyunOSSUploadResult.cs
new file mode 100644
index 0000000..e590710
--- /dev/null
+++ b/FlexJobApi.Core/Utils/AliyunUtils/AliyunOSSUploadResult.cs
@@ -0,0 +1,24 @@
+锘縰sing System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace FlexJobApi.Core
+{
+    /// <summary>
+    /// 闃块噷浜慜SS涓婁紶缁撴灉
+    /// </summary>
+    public class AliyunOSSUploadResult
+    {
+        /// <summary>
+        /// 鐩稿璺緞
+        /// </summary>
+        public string Url { get; set; }
+
+        /// <summary>
+        /// 瀛楄妭
+        /// </summary>
+        public byte[] Buffer { get; set; }
+    }
+}
diff --git a/FlexJobApi.Core/Utils/AliyunUtils/AliyunOSSUtils.cs b/FlexJobApi.Core/Utils/AliyunUtils/AliyunOSSUtils.cs
index 5a5b2d4..69ce7c8 100644
--- a/FlexJobApi.Core/Utils/AliyunUtils/AliyunOSSUtils.cs
+++ b/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>
diff --git a/FlexJobApi.Core/Utils/BaiduUtils/BaiduOcrBusinessLicenseResult.cs b/FlexJobApi.Core/Utils/BaiduUtils/BaiduOcrBusinessLicenseResult.cs
new file mode 100644
index 0000000..c9f6dc7
--- /dev/null
+++ b/FlexJobApi.Core/Utils/BaiduUtils/BaiduOcrBusinessLicenseResult.cs
@@ -0,0 +1,90 @@
+锘縰sing 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>
+        /// 缁熶竴绀句細淇$敤浠g爜
+        /// </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; }
+    }
+}
diff --git a/FlexJobApi.Core/Utils/BaiduUtils/BaiduOcrResultWord.cs b/FlexJobApi.Core/Utils/BaiduUtils/BaiduOcrResultWord.cs
new file mode 100644
index 0000000..eb66ab4
--- /dev/null
+++ b/FlexJobApi.Core/Utils/BaiduUtils/BaiduOcrResultWord.cs
@@ -0,0 +1,57 @@
+锘縰sing 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; }
+    }
+}
diff --git a/FlexJobApi.Core/Utils/BaiduUtils/BaiduOcrUtils.cs b/FlexJobApi.Core/Utils/BaiduUtils/BaiduOcrUtils.cs
new file mode 100644
index 0000000..2ee89c4
--- /dev/null
+++ b/FlexJobApi.Core/Utils/BaiduUtils/BaiduOcrUtils.cs
@@ -0,0 +1,70 @@
+锘縰sing 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["绀句細淇$敤浠g爜"].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;
+        }
+
+    }
+}
diff --git a/FlexJobApi.Core/Utils/BaiduUtils/BaiduOptions.cs b/FlexJobApi.Core/Utils/BaiduUtils/BaiduOptions.cs
new file mode 100644
index 0000000..f8b198f
--- /dev/null
+++ b/FlexJobApi.Core/Utils/BaiduUtils/BaiduOptions.cs
@@ -0,0 +1,36 @@
+锘縰sing 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; }
+    }
+}
diff --git a/FlexJobApi.Core/Utils/BaiduUtils/OcrResult.cs b/FlexJobApi.Core/Utils/BaiduUtils/OcrResult.cs
new file mode 100644
index 0000000..fcd73c9
--- /dev/null
+++ b/FlexJobApi.Core/Utils/BaiduUtils/OcrResult.cs
@@ -0,0 +1,26 @@
+锘縰sing 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; }
+    }
+}
diff --git a/FlexJobApi.Core/Utils/ExcelUtils/ExcelUtils.cs b/FlexJobApi.Core/Utils/ExcelUtils/ExcelUtils.cs
index efbe2d7..8ec4dc8 100644
--- a/FlexJobApi.Core/Utils/ExcelUtils/ExcelUtils.cs
+++ b/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;
         }
     }
 }
diff --git a/FlexJobApi.Web.Entry/Startup.cs b/FlexJobApi.Web.Entry/Startup.cs
index e392f7a..4719b1e 100644
--- a/FlexJobApi.Web.Entry/Startup.cs
+++ b/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>();
 
diff --git a/FlexJobApi.Web.Entry/appsettings.json b/FlexJobApi.Web.Entry/appsettings.json
index cc452b3..aec227c 100644
--- a/FlexJobApi.Web.Entry/appsettings.json
+++ b/FlexJobApi.Web.Entry/appsettings.json
@@ -44,6 +44,12 @@
       "DurationSeconds": 3600
     }
   },
+  "Baidu": {
+    "Ocr": {
+      "Key": "Htx3y6eFnlW92WvHx9aW44f8",
+      "Secret": "k1rDa3vjVtArrQio9LtR5AjqARSw45WO"
+    }
+  },
   "SMS": {
     "Enable": true,
     "AccessKeyId": "LTAI5tMS7qz1duiyncCqxB8H",

--
Gitblit v1.9.1