From d317a290c03d4c40687fcd01efc6c22304874e87 Mon Sep 17 00:00:00 2001
From: sunpengfei <i@angelzzz.com>
Date: 星期五, 05 九月 2025 10:24:24 +0800
Subject: [PATCH] feat:开发

---
 FlexJobApi.Core/Utils/ResourceUtils/ResourceHttpUtils.cs |  173 ++++++++++++++++++++++++++++++++++++++-------------------
 1 files changed, 114 insertions(+), 59 deletions(-)

diff --git a/FlexJobApi.Core/Utils/ResourceUtils/ResourceHttpUtils.cs b/FlexJobApi.Core/Utils/ResourceUtils/ResourceHttpUtils.cs
index 40da33e..04199ce 100644
--- a/FlexJobApi.Core/Utils/ResourceUtils/ResourceHttpUtils.cs
+++ b/FlexJobApi.Core/Utils/ResourceUtils/ResourceHttpUtils.cs
@@ -1,94 +1,149 @@
 锘縰sing Azure;
 using Consul;
 using Furion;
+using Furion.DatabaseAccessor;
 using Furion.FriendlyException;
 using Furion.HttpRemote;
+using Microsoft.EntityFrameworkCore;
 using Microsoft.Extensions.Caching.Distributed;
+using RabbitMQ.Client;
+using RTools_NTS.Util;
 using System;
 using System.Collections.Generic;
 using System.ComponentModel.Design;
 using System.Linq;
 using System.Net.Http;
+using System.Reflection;
 using System.Text;
 using System.Threading.Tasks;
 
 namespace FlexJobApi.Core
 {
-    public class ResourceHttpUtils
+    public static class ResourceHttpUtils
     {
-        private readonly IDistributedCache distributedCache;
-        private readonly IHttpRemoteService httpRemoteService;
-        private readonly IConsulClient consulClient;
-
-        public ResourceHttpUtils(
-            IDistributedCache distributedCache,
-            IHttpRemoteService httpRemoteService,
-            IConsulClient consulClient)
+        /// <summary>
+        /// 鍙戦�佽姹�
+        /// </summary>
+        /// <param name="request">璇锋眰鍙傛暟</param>
+        /// <param name="serviceName">鏈嶅姟鍚嶇О</param>
+        /// <param name="route">璺敱</param>
+        /// <param name="method">璇锋眰鏂瑰紡</param>
+        /// <param name="provider">璧勬簮鎻愪緵鑰�</param>
+        /// <param name="accessToken">璁块棶浠ょ墝</param>
+        /// <param name="refreshToken">鍒锋柊浠ょ墝</param>
+        /// <returns></returns>
+        public static async Task<string> SendHttpAsync(
+            this object request, 
+            string serviceName, 
+            string route, 
+            EnumResourceMethod method, 
+            EnumResourceHttpProvider? provider = null, 
+            string accessToken = null,
+            string refreshToken = null)
         {
-            this.distributedCache = distributedCache;
-            this.httpRemoteService = httpRemoteService;
-            this.consulClient = consulClient;
+            serviceName = App.GetConfig<string>($"{serviceName}:ServiceName");
+            var url = await GetUrl(serviceName, route);
+            var builder = HttpRequestBuilder.Create(method.GetHttpMethod(), url);
+
+            if (method == EnumResourceMethod.Get)
+                builder = builder.WithQueryParameters(request);
+            else
+                builder = builder.SetJsonContent(request);
+
+            if (accessToken.IsNotNull())
+            {
+                builder = builder.WithHeader("Authorization", accessToken);
+            }
+            if (refreshToken.IsNotNull())
+            {
+                builder = builder.WithHeader("X-Authorization", refreshToken);
+            }
+
+            IResourceHttpProvider httpProvider =
+                provider == EnumResourceHttpProvider.SystemUser
+                ? new SystemUserResourceHttpProvider()
+                : provider == EnumResourceHttpProvider.ElectronSignServer
+                ? new ElectronSignServerResourceHttpProvider()
+                : provider == EnumResourceHttpProvider.ElectronSignServerCustomer
+                ? new ElectronSignServerCustomerResourceHttpProvider()
+                : new DefaultResourceHttpProvider();
+            var response = await httpProvider.SendAsStringAsync(builder);
+            return response;
         }
 
         /// <summary>
-        /// 鍙戦�丠TTP璇锋眰
+        /// 鍙戦�佽姹�
         /// </summary>
         /// <typeparam name="TRequest"></typeparam>
         /// <typeparam name="TResponse"></typeparam>
         /// <param name="request"></param>
         /// <param name="provider"></param>
         /// <returns></returns>
-        public async Task<TResponse> SendHttpAsync<TRequest, TResponse>(
-            TRequest request,
-            IResourceHttpProvider provider = null)
-            where TRequest : class, new()
+        public static async Task<TResponse> SendHttpAsync<TRequest, TResponse>(
+            this TRequest request, 
+            EnumResourceHttpProvider? provider = null)
         {
-            var requestTypeFullName = typeof(TRequest).FullName;
-
-            var jsonResourceModels = await distributedCache.GetStringAsync($"ResourceModel|{requestTypeFullName}");
-            var resource = jsonResourceModels.JsonTo<ResourceModel>();
-            var url = await GetUrl(resource.ServiceName, resource.Route);
-            var builder = HttpRequestBuilder.Create(resource.GetHttpMethod(), url);
-            if (resource.Method == EnumResourceMethod.Get)
-                builder = builder.WithQueryParameters(request);
-            else
-                builder = builder.SetJsonContent(request);
-            provider = provider ?? new DefaultResourceHttpProvider();
-            builder = provider.AddAuthentication(builder);
-            var response = await provider.SendAsAsync<TResponse>(httpRemoteService, builder);
+            var requestType = typeof(TRequest);
+            var resourceAttribute = requestType.GetCustomAttribute<ResourceAttribute>();
+            if (resourceAttribute == null) throw Oops.Oh(EnumErrorCodeType.s400, "缂哄け璧勬簮鐗规��");
+            var controller = resourceAttribute.Controllers.FirstOrDefault();
+            var resourceControllerAttribute = controller.GetCustomAttribute<EnumResourceController, ResourceControllerAttribute>();
+            if (resourceAttribute == null) throw Oops.Oh(EnumErrorCodeType.s400, "缂哄け鎺у埗鍣ㄧ壒鎬�");
+            var serviceName = resourceControllerAttribute.Service.ToString();
+            var route = resourceAttribute.Route;
+            var method = resourceAttribute.Method;
+            var requestXmlDoc = await requestType.GetXmlDocMemberAsync();
+            if (route.IsNull() || method == EnumResourceMethod.None)
+            {
+                var resource = await Db.GetRepository<Resource>().AsQueryable().AsNoTracking()
+                    .Where(it =>
+                        it.ServiceName == serviceName
+                        && it.ControllerName == resourceControllerAttribute.ControllerName
+                        && it.Code == requestXmlDoc.Name)
+                    .Select(it => new
+                    {
+                        it.Route,
+                        it.Method
+                    })
+                    .FirstOrDefaultAsync();
+                if (resource == null) throw Oops.Oh(EnumErrorCodeType.s404, "璧勬簮");
+                route = resource.Route;
+                method = resource.Method;
+            }
+            var responseJson = await request.SendHttpAsync(serviceName, route, method, provider);
+            var response = responseJson.JsonTo<TResponse>();
             return response;
         }
 
-        public async Task<string> SendHttpAsync(Resource resource, string request, IResourceHttpProvider provider = null)
+        /// <summary>
+        /// 鑾峰彇璇锋眰鏂瑰紡
+        /// </summary>
+        /// <param name="method"></param>
+        /// <returns></returns>
+        public static HttpMethod GetHttpMethod(this EnumResourceMethod method)
         {
-            var url = await GetUrl(resource.ServiceName, resource.Route);
-            var builder = HttpRequestBuilder.Create(resource.GetHttpMethod(), url);
-            if (resource.Method == EnumResourceMethod.Get)
-                builder = builder.WithQueryParameters(request);
-            else
-                builder = builder.SetJsonContent(request);
-            provider = provider ?? new DefaultResourceHttpProvider();
-            builder = provider.AddAuthentication(builder);
-            var response = await provider.SendAsStringAsync(httpRemoteService, builder);
-            return response;
+            switch (method)
+            {
+                case EnumResourceMethod.Get:
+                    return HttpMethod.Get;
+                case EnumResourceMethod.Post:
+                    return HttpMethod.Post;
+                case EnumResourceMethod.Put:
+                    return HttpMethod.Put;
+                case EnumResourceMethod.Delete:
+                    return HttpMethod.Delete;
+                default:
+                    throw Oops.Oh(EnumErrorCodeType.s400, "涓嶆敮鎸佺殑璇锋眰绫诲瀷");
+            }
         }
 
-        public async Task<string> SendHttpAsync(EnumResourceService service, HttpMethod method, string route, string request, IResourceHttpProvider provider = null)
-        {
-            var serviceName = service.GetCustomAttribute<EnumResourceService, ResourceServiceAttribute>().ServiceName;
-            var url = await GetUrl(serviceName, route);
-            var builder = HttpRequestBuilder.Create(method, url);
-            if (method == HttpMethod.Get)
-                builder = builder.WithQueryParameters(request);
-            else
-                builder = builder.SetJsonContent(request);
-            provider = provider ?? new DefaultResourceHttpProvider();
-            builder = provider.AddAuthentication(builder);
-            var response = await provider.SendAsStringAsync(httpRemoteService, builder);
-            return response;
-        }
-
-        public async Task<string> GetUrl(string serviceName, string route)
+        /// <summary>
+        /// 鑾峰彇鍋ュ悍鏈嶅姟鍦板潃
+        /// </summary>
+        /// <param name="serviceName"></param>
+        /// <param name="route"></param>
+        /// <returns></returns>
+        public static async Task<string> GetUrl(string serviceName, string route)
         {
             var domain = await GetHealthyServiceDomain(serviceName);
             return $"{domain}{route}";
@@ -99,12 +154,12 @@
         /// </summary>
         /// <param name="serviceName"></param>
         /// <returns></returns>
-        public async Task<string> GetHealthyServiceDomain(string serviceName)
+        public static async Task<string> GetHealthyServiceDomain(string serviceName)
         {
             var env = App.GetConfig<string>("Environment");
             serviceName = $"{env}_{serviceName}";
 
-            var queryResult = await consulClient.Health.Service(serviceName, null, true);
+            var queryResult = await App.GetRequiredService<IConsulClient>().Health.Service(serviceName, null, true);
             if (queryResult.StatusCode != System.Net.HttpStatusCode.OK)
                 throw Oops.Oh(EnumErrorCodeType.s404, $"寰湇鍔serviceName}");
 

--
Gitblit v1.9.1