From d12a76dd9a01b4c3fb893901f969bd16281d0bd9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=B5=B5=E9=B9=8F?= Date: Fri, 16 May 2025 11:40:43 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AF=B9=E8=B1=A1=E8=BD=AC=E6=8D=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ApiProvider/Helper/InstanceManager.cs | 12 ++- SuperAPI/Controllers/MedCommonController.cs | 48 ---------- .../Controllers/MedicalInsuranceController.cs | 6 +- SuperAPI/NoAuthPaths.cs | 40 +++++++- SuperAPI/appsettings.json | 4 +- .../wwwroot/rezero/default_ui/add_filed.html | 30 ++---- .../TransformerFactory.cs | 94 ++++++++++++++----- .../MedicalInsuranceTransactionService.cs | 20 +++- 8 files changed, 141 insertions(+), 113 deletions(-) delete mode 100644 SuperAPI/Controllers/MedCommonController.cs diff --git a/ReZero/SuperAPI/ApiProvider/Helper/InstanceManager.cs b/ReZero/SuperAPI/ApiProvider/Helper/InstanceManager.cs index 8d06c88..926407e 100644 --- a/ReZero/SuperAPI/ApiProvider/Helper/InstanceManager.cs +++ b/ReZero/SuperAPI/ApiProvider/Helper/InstanceManager.cs @@ -28,6 +28,14 @@ namespace ReZero.SuperAPI } public static async Task AuthorizationAsync(HttpContext context, InterfaceContext dynamicInterfaceContext) { + // 添加对医保接口的特殊判断 + var url = context.Request.Path.ToString().ToLower(); + if (url.Contains("/medicalinsurancecontroller/")) + { + Console.WriteLine($"医保接口跳过JWT验证: {url}"); + return true; + } + if (SuperAPIModule._apiOptions!.InterfaceOptions!.NoAuthorizationFunc != null) { if (SuperAPIModule._apiOptions!.InterfaceOptions!.NoAuthorizationFunc(dynamicInterfaceContext) == true) @@ -51,7 +59,6 @@ namespace ReZero.SuperAPI throw new Exception(TextHandler.GetCommonText("系统接口被禁用无法访问,修改JWT参数DisableSystemInterface", "If the system interface is disabled and cannot be accessed, modify the JWT parameter DisableSystemInterface")); } } - var url = context.Request.Path.ToString().ToLower(); if (url.StartsWith("/public/")) { return true; @@ -103,9 +110,10 @@ namespace ReZero.SuperAPI throw new Exception(TextHandler.GetCommonText("用户未通过身份验证", "The user is not authenticated")); } } - catch (Exception) + catch (Exception ex) { // JWT验证失败 + Console.WriteLine($"JWT验证失败详情: {ex.Message}"); context.Response.StatusCode = 401; throw new Exception(TextHandler.GetCommonText("JWT验证失败", "JWT authentication failed")); } diff --git a/SuperAPI/Controllers/MedCommonController.cs b/SuperAPI/Controllers/MedCommonController.cs deleted file mode 100644 index 816a65d..0000000 --- a/SuperAPI/Controllers/MedCommonController.cs +++ /dev/null @@ -1,48 +0,0 @@ -using Microsoft.AspNetCore.Http; -using Microsoft.AspNetCore.Mvc; -using Newtonsoft.Json.Linq; -using ReZero.DependencyInjection; -using ReZero.SuperAPI; -using System; -using System.Threading.Tasks; -using medical.transfomer.business; - -namespace medical.insu.transfomer.Controllers -{ - [Api(200100, GroupName = "分组0")] - public class MedCommonController - { - [DI] - public TransformerFactory? transformerFactory { get; set; } - - //执行国家医保接口 - [HttpPost] - public async Task execPublic(JObject value) - { - try - { - if (transformerFactory == null) - { - return new { code = -1, msg = "医保转换服务未初始化" }; - } - - string action = value["action"]?.ToString(); - if (string.IsNullOrEmpty(action)) - { - return new { code = -1, msg = "缺少action参数" }; - } - - // 获取数据部分 - JObject data = value["data"] as JObject ?? new JObject(); - - // 使用转换工厂处理医保交易 - return await transformerFactory.ExecuteMethod(action, data); - } - catch (Exception ex) - { - return new { code = -1, msg = $"处理请求发生异常: {ex.Message}" }; - } - } - } -} - diff --git a/SuperAPI/Controllers/MedicalInsuranceController.cs b/SuperAPI/Controllers/MedicalInsuranceController.cs index 3dce999..b001edb 100644 --- a/SuperAPI/Controllers/MedicalInsuranceController.cs +++ b/SuperAPI/Controllers/MedicalInsuranceController.cs @@ -55,11 +55,11 @@ namespace medical.insu.transfomer.Controllers return new { code = -1, msg = "缺少methodName参数" }; } + JToken jToken = value.GetValue("data"); + // 获取数据部分 - JObject data = value["data"] as JObject ?? new JObject(); - // 使用医保交易服务处理 - return await MedicalInsuranceService.ExecuteTransaction(methodName, data); + return await MedicalInsuranceService.ExecuteTransaction(methodName, jToken); } catch (Exception ex) { diff --git a/SuperAPI/NoAuthPaths.cs b/SuperAPI/NoAuthPaths.cs index b9e4740..83aec41 100644 --- a/SuperAPI/NoAuthPaths.cs +++ b/SuperAPI/NoAuthPaths.cs @@ -28,11 +28,19 @@ namespace medical.insu.transfomer // 检查是否匹配医保交易接口 if (path.Contains(MedicalInsuranceExecuteTransaction)) { + Console.WriteLine($"路径匹配医保交易接口: {path}"); return true; } // 如果需要添加更多免验证路径,可以在这里扩展 + // 添加更多需要跳过验证的接口 + if (path.Contains("/api/200100/medicalinsurancecontroller/")) + { + Console.WriteLine($"所有医保接口跳过验证: {path}"); + return true; + } + return false; } @@ -43,9 +51,13 @@ namespace medical.insu.transfomer /// true表示不需要验证 public static bool IsSkipAuthByAttribute(InterfaceContext context) { + var path = context.HttpContext.Request.Path; + Console.WriteLine($"检查路径是否需要验证: {path}"); + // 先检查路径 - if (IsNoAuthPath(context.HttpContext.Request.Path)) + if (IsNoAuthPath(path)) { + Console.WriteLine($"路径已跳过验证: {path}"); return true; } @@ -58,6 +70,8 @@ namespace medical.insu.transfomer var classFullName = methodInfo.MethodClassFullName; var methodName = methodInfo.MethodName; + Console.WriteLine($"检查接口信息: {classFullName}.{methodName}"); + if (!string.IsNullOrEmpty(classFullName) && !string.IsNullOrEmpty(methodName)) { // 获取所有程序集 @@ -68,12 +82,19 @@ namespace medical.insu.transfomer try { // 查找类型 + if (!assembly.FullName.Contains("medical") && + !assembly.FullName.Contains("SuperAPI")) + continue; + var type = assembly.GetType(classFullName); if (type != null) { + Console.WriteLine($"找到类型: {type.FullName}"); + // 检查类是否有SkipAuthAttribute if (type.GetCustomAttributes(typeof(SkipAuthAttribute), true).Any()) { + Console.WriteLine($"类型有SkipAuthAttribute: {type.FullName}"); return true; } @@ -81,29 +102,42 @@ namespace medical.insu.transfomer var method = type.GetMethod(methodName); if (method != null) { + Console.WriteLine($"找到方法: {method.Name}"); + // 检查方法是否有SkipAuthAttribute if (method.GetCustomAttributes(typeof(SkipAuthAttribute), true).Any()) { + Console.WriteLine($"方法有SkipAuthAttribute: {method.Name}"); return true; } } + else + { + Console.WriteLine($"找不到方法: {methodName}"); + } } } - catch + catch (Exception ex) { // 忽略查找过程中的异常 + Console.WriteLine($"查找程序集时发生异常: {assembly.FullName}, 错误: {ex.Message}"); continue; } } } } + else + { + Console.WriteLine("接口信息为空"); + } } catch (Exception ex) { // 捕获任何异常,防止验证过程崩溃 - Console.WriteLine($"检查免验证特性时发生异常: {ex.Message}"); + Console.WriteLine($"检查免验证特性时发生异常: {ex.Message}, 堆栈: {ex.StackTrace}"); } + Console.WriteLine($"需要验证: {path}"); return false; } } diff --git a/SuperAPI/appsettings.json b/SuperAPI/appsettings.json index 0e3f2bb..33195ba 100644 --- a/SuperAPI/appsettings.json +++ b/SuperAPI/appsettings.json @@ -27,7 +27,7 @@ //设置true会启用自带的jwt授权 "Enable": true, //jwt密钥 - "Secret": "C0mPl3xS3cr3tK3yF0rJWT@DEVELOPMENT", + "Secret": "MEDICAL_INSURANCE_TRANSACTION_SECRET_KEY_2023", //用户表的表名 (实体管理可以创建表,操作步骤:1.创建实体 2.同步生成表 ) "UserTableName": "user", //用户名字段名称 (是名称不是值) @@ -35,7 +35,7 @@ //密码字段名称 (是名称不是值) "PasswordFieldName": "password", //分钟 - "Expires": 1000, + "Expires": 10000, // 数据库操作会用到Claim中的值作为条件 "Claim": [ { diff --git a/SuperAPI/wwwroot/rezero/default_ui/add_filed.html b/SuperAPI/wwwroot/rezero/default_ui/add_filed.html index 8207051..25c0bd4 100644 --- a/SuperAPI/wwwroot/rezero/default_ui/add_filed.html +++ b/SuperAPI/wwwroot/rezero/default_ui/add_filed.html @@ -594,26 +594,8 @@ }, isEditing: true, data: [ - { - SYSTEM_NAME: "测试1", - SYSTEM_FIELD: "test1", - INTERFACE_NAME: "测试2", - INTERFACE_FIELD: "test2", - SYSTEM_FIELD_TYPE: "value", - SYSTEM_DICT_NAME: "", - OBJECT_FIELD_TYPE: "value", - OBJECT_DICT_NAME: "", - }, - { - SYSTEM_NAME: "测试2", - SYSTEM_FIELD: "test2", - INTERFACE_NAME: "测试3", - INTERFACE_FIELD: "test3", - SYSTEM_FIELD_TYPE: "value", - SYSTEM_DICT_NAME: "", - OBJECT_FIELD_TYPE: "value", - OBJECT_DICT_NAME: "", - }, + + ], localJsonData: {}, localJosnName: "", @@ -631,10 +613,10 @@ }, cachesData: { - OBJECT_TABLE_NAME: "test2", - OBJECT_TABLE_CNNAME: "测试2", - SYSTEM_TABLE_CNNAME: "测试1", - SYSTEM_TABLE_NAME: "test1", + OBJECT_TABLE_NAME: "", + OBJECT_TABLE_CNNAME: "", + SYSTEM_TABLE_CNNAME: "", + SYSTEM_TABLE_NAME: "", }, }; }, diff --git a/medical.transfomer.business/TransformerFactory.cs b/medical.transfomer.business/TransformerFactory.cs index afa16d7..879a47c 100644 --- a/medical.transfomer.business/TransformerFactory.cs +++ b/medical.transfomer.business/TransformerFactory.cs @@ -166,7 +166,7 @@ namespace medical.transfomer.business foreach (var path in paths) { - if (currentToken[path] != null) + if (currentToken != null && currentToken[path] != null) { currentToken = currentToken[path]; } @@ -218,7 +218,7 @@ namespace medical.transfomer.business foreach (var path in paths) { - if (currentToken[path] != null) + if (currentToken != null && currentToken[path] != null) { currentToken = currentToken[path]; } @@ -229,25 +229,46 @@ namespace medical.transfomer.business } } - if (currentToken != null && currentToken is JArray sourceArray) + if (currentToken != null) { - foreach (JObject sourceItem in sourceArray) + JArray sourceArray; + + // 处理不同类型的JToken + if (currentToken is JArray jArray) { - JObject targetItem = new JObject(); - - foreach (var mapping in mappings) + sourceArray = jArray; + } + else if (currentToken is JObject jObject) + { + // 如果是JObject,将其作为单个元素的数组处理 + sourceArray = new JArray { jObject }; + } + else + { + // 创建包含当前Token的数组 + sourceArray = new JArray { currentToken }; + } + + foreach (JToken sourceItem in sourceArray) + { + if (sourceItem is JObject sourceObject) { - if (mapping.SYSTEM_FIELD != null && mapping.INTERFACE_FIELD != null && - !string.IsNullOrEmpty(mapping.SYSTEM_FIELD) && !string.IsNullOrEmpty(mapping.INTERFACE_FIELD)) + JObject targetItem = new JObject(); + + foreach (var mapping in mappings) { - if (sourceItem[mapping.SYSTEM_FIELD] != null) + if (mapping.SYSTEM_FIELD != null && mapping.INTERFACE_FIELD != null && + !string.IsNullOrEmpty(mapping.SYSTEM_FIELD) && !string.IsNullOrEmpty(mapping.INTERFACE_FIELD)) { - targetItem[mapping.INTERFACE_FIELD] = sourceItem[mapping.SYSTEM_FIELD]; + if (sourceObject[mapping.SYSTEM_FIELD] != null) + { + targetItem[mapping.INTERFACE_FIELD] = sourceObject[mapping.SYSTEM_FIELD]; + } } } + + targetArray.Add(targetItem); } - - targetArray.Add(targetItem); } } @@ -304,7 +325,7 @@ namespace medical.transfomer.business foreach (var path in paths) { - if (currentToken[path] != null) + if (currentToken != null && currentToken[path] != null) { currentToken = currentToken[path]; } @@ -343,7 +364,7 @@ namespace medical.transfomer.business foreach (var path in paths) { - if (currentToken[path] != null) + if (currentToken != null && currentToken[path] != null) { currentToken = currentToken[path]; } @@ -354,25 +375,46 @@ namespace medical.transfomer.business } } - if (currentToken != null && currentToken is JArray sourceArray) + if (currentToken != null) { - foreach (JObject sourceItem in sourceArray) + JArray sourceArray; + + // 处理不同类型的JToken + if (currentToken is JArray jArray) { - JObject targetItem = new JObject(); - - foreach (var mapping in mappings) + sourceArray = jArray; + } + else if (currentToken is JObject jObject) + { + // 如果是JObject,将其作为单个元素的数组处理 + sourceArray = new JArray { jObject }; + } + else + { + // 创建包含当前Token的数组 + sourceArray = new JArray { currentToken }; + } + + foreach (JToken sourceItem in sourceArray) + { + if (sourceItem is JObject sourceObject) { - if (mapping.INTERFACE_FIELD != null && mapping.SYSTEM_FIELD != null && - !string.IsNullOrEmpty(mapping.INTERFACE_FIELD) && !string.IsNullOrEmpty(mapping.SYSTEM_FIELD)) + JObject targetItem = new JObject(); + + foreach (var mapping in mappings) { - if (sourceItem[mapping.INTERFACE_FIELD] != null) + if (mapping.INTERFACE_FIELD != null && mapping.SYSTEM_FIELD != null && + !string.IsNullOrEmpty(mapping.INTERFACE_FIELD) && !string.IsNullOrEmpty(mapping.SYSTEM_FIELD)) { - targetItem[mapping.SYSTEM_FIELD] = sourceItem[mapping.INTERFACE_FIELD]; + if (sourceObject[mapping.INTERFACE_FIELD] != null) + { + targetItem[mapping.SYSTEM_FIELD] = sourceObject[mapping.INTERFACE_FIELD]; + } } } + + targetArray.Add(targetItem); } - - targetArray.Add(targetItem); } } diff --git a/medical.transfomer.service/MedicalInsuranceTransactionService.cs b/medical.transfomer.service/MedicalInsuranceTransactionService.cs index fda1c6d..b1cc6ac 100644 --- a/medical.transfomer.service/MedicalInsuranceTransactionService.cs +++ b/medical.transfomer.service/MedicalInsuranceTransactionService.cs @@ -42,7 +42,7 @@ namespace medical.transfomer.service /// 方法名称 /// 输入数据 /// 处理结果 - public async Task ExecuteTransaction(string methodName, JObject inputData) + public async Task ExecuteTransaction(string methodName, JToken inputData) { Stopwatch stopwatch = new Stopwatch(); stopwatch.Start(); @@ -51,8 +51,16 @@ namespace medical.transfomer.service { _logger.LogInformation($"开始执行医保交易: {methodName}"); + // 将JToken转换为JObject传递给转换工厂 + JObject inputObject = inputData as JObject; + if (inputObject == null && inputData != null) + { + inputObject = new JObject(); + inputObject["data"] = inputData; + } + // 调用转换工厂执行方法 - var result = await _transformerFactory.ExecuteMethod(methodName, inputData); + var result = await _transformerFactory.ExecuteMethod(methodName, inputObject); _logger.LogInformation($"医保交易执行完成: {methodName}"); @@ -211,14 +219,16 @@ namespace medical.transfomer.service /// 接口地址 /// 请求数据 /// 响应结果 - public async Task CallMedicalInsuranceApi(string endpoint, JObject requestData) + public async Task CallMedicalInsuranceApi(string endpoint, JToken requestData) { try { var httpClient = _httpClientFactory.CreateClient("MedicalInsurance"); + // 将JToken转换为字符串 + string requestContent = requestData.ToString(); var content = new StringContent( - requestData.ToString(), + requestContent, Encoding.UTF8, "application/json"); @@ -226,7 +236,7 @@ namespace medical.transfomer.service response.EnsureSuccessStatusCode(); var responseString = await response.Content.ReadAsStringAsync(); - return JObject.Parse(responseString); + return JToken.Parse(responseString); } catch (Exception ex) {