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