Browse Source

对象转换

master
赵鹏 2 days ago
parent
commit
d12a76dd9a
  1. 12
      ReZero/SuperAPI/ApiProvider/Helper/InstanceManager.cs
  2. 48
      SuperAPI/Controllers/MedCommonController.cs
  3. 6
      SuperAPI/Controllers/MedicalInsuranceController.cs
  4. 40
      SuperAPI/NoAuthPaths.cs
  5. 4
      SuperAPI/appsettings.json
  6. 30
      SuperAPI/wwwroot/rezero/default_ui/add_filed.html
  7. 90
      medical.transfomer.business/TransformerFactory.cs
  8. 20
      medical.transfomer.service/MedicalInsuranceTransactionService.cs

12
ReZero/SuperAPI/ApiProvider/Helper/InstanceManager.cs

@ -28,6 +28,14 @@ namespace ReZero.SuperAPI
} }
public static async Task<bool> AuthorizationAsync(HttpContext context, InterfaceContext dynamicInterfaceContext) public static async Task<bool> 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 != null)
{ {
if (SuperAPIModule._apiOptions!.InterfaceOptions!.NoAuthorizationFunc(dynamicInterfaceContext) == true) 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")); 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/")) if (url.StartsWith("/public/"))
{ {
return true; return true;
@ -103,9 +110,10 @@ namespace ReZero.SuperAPI
throw new Exception(TextHandler.GetCommonText("用户未通过身份验证", "The user is not authenticated")); throw new Exception(TextHandler.GetCommonText("用户未通过身份验证", "The user is not authenticated"));
} }
} }
catch (Exception) catch (Exception ex)
{ {
// JWT验证失败 // JWT验证失败
Console.WriteLine($"JWT验证失败详情: {ex.Message}");
context.Response.StatusCode = 401; context.Response.StatusCode = 401;
throw new Exception(TextHandler.GetCommonText("JWT验证失败", "JWT authentication failed")); throw new Exception(TextHandler.GetCommonText("JWT验证失败", "JWT authentication failed"));
} }

48
SuperAPI/Controllers/MedCommonController.cs

@ -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<object> 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}" };
}
}
}
}

6
SuperAPI/Controllers/MedicalInsuranceController.cs

@ -55,11 +55,11 @@ namespace medical.insu.transfomer.Controllers
return new { code = -1, msg = "缺少methodName参数" }; 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) catch (Exception ex)
{ {

40
SuperAPI/NoAuthPaths.cs

@ -28,11 +28,19 @@ namespace medical.insu.transfomer
// 检查是否匹配医保交易接口 // 检查是否匹配医保交易接口
if (path.Contains(MedicalInsuranceExecuteTransaction)) if (path.Contains(MedicalInsuranceExecuteTransaction))
{ {
Console.WriteLine($"路径匹配医保交易接口: {path}");
return true; return true;
} }
// 如果需要添加更多免验证路径,可以在这里扩展 // 如果需要添加更多免验证路径,可以在这里扩展
// 添加更多需要跳过验证的接口
if (path.Contains("/api/200100/medicalinsurancecontroller/"))
{
Console.WriteLine($"所有医保接口跳过验证: {path}");
return true;
}
return false; return false;
} }
@ -43,9 +51,13 @@ namespace medical.insu.transfomer
/// <returns>true表示不需要验证</returns> /// <returns>true表示不需要验证</returns>
public static bool IsSkipAuthByAttribute(InterfaceContext context) 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; return true;
} }
@ -58,6 +70,8 @@ namespace medical.insu.transfomer
var classFullName = methodInfo.MethodClassFullName; var classFullName = methodInfo.MethodClassFullName;
var methodName = methodInfo.MethodName; var methodName = methodInfo.MethodName;
Console.WriteLine($"检查接口信息: {classFullName}.{methodName}");
if (!string.IsNullOrEmpty(classFullName) && !string.IsNullOrEmpty(methodName)) if (!string.IsNullOrEmpty(classFullName) && !string.IsNullOrEmpty(methodName))
{ {
// 获取所有程序集 // 获取所有程序集
@ -68,12 +82,19 @@ namespace medical.insu.transfomer
try try
{ {
// 查找类型 // 查找类型
if (!assembly.FullName.Contains("medical") &&
!assembly.FullName.Contains("SuperAPI"))
continue;
var type = assembly.GetType(classFullName); var type = assembly.GetType(classFullName);
if (type != null) if (type != null)
{ {
Console.WriteLine($"找到类型: {type.FullName}");
// 检查类是否有SkipAuthAttribute // 检查类是否有SkipAuthAttribute
if (type.GetCustomAttributes(typeof(SkipAuthAttribute), true).Any()) if (type.GetCustomAttributes(typeof(SkipAuthAttribute), true).Any())
{ {
Console.WriteLine($"类型有SkipAuthAttribute: {type.FullName}");
return true; return true;
} }
@ -81,29 +102,42 @@ namespace medical.insu.transfomer
var method = type.GetMethod(methodName); var method = type.GetMethod(methodName);
if (method != null) if (method != null)
{ {
Console.WriteLine($"找到方法: {method.Name}");
// 检查方法是否有SkipAuthAttribute // 检查方法是否有SkipAuthAttribute
if (method.GetCustomAttributes(typeof(SkipAuthAttribute), true).Any()) if (method.GetCustomAttributes(typeof(SkipAuthAttribute), true).Any())
{ {
Console.WriteLine($"方法有SkipAuthAttribute: {method.Name}");
return true; return true;
} }
} }
else
{
Console.WriteLine($"找不到方法: {methodName}");
}
} }
} }
catch catch (Exception ex)
{ {
// 忽略查找过程中的异常 // 忽略查找过程中的异常
Console.WriteLine($"查找程序集时发生异常: {assembly.FullName}, 错误: {ex.Message}");
continue; continue;
} }
} }
} }
} }
else
{
Console.WriteLine("接口信息为空");
}
} }
catch (Exception ex) catch (Exception ex)
{ {
// 捕获任何异常,防止验证过程崩溃 // 捕获任何异常,防止验证过程崩溃
Console.WriteLine($"检查免验证特性时发生异常: {ex.Message}"); Console.WriteLine($"检查免验证特性时发生异常: {ex.Message}, 堆栈: {ex.StackTrace}");
} }
Console.WriteLine($"需要验证: {path}");
return false; return false;
} }
} }

4
SuperAPI/appsettings.json

@ -27,7 +27,7 @@
//truejwt //truejwt
"Enable": true, "Enable": true,
//jwt //jwt
"Secret": "C0mPl3xS3cr3tK3yF0rJWT@DEVELOPMENT", "Secret": "MEDICAL_INSURANCE_TRANSACTION_SECRET_KEY_2023",
// 1. 2. // 1. 2.
"UserTableName": "user", "UserTableName": "user",
// //
@ -35,7 +35,7 @@
// //
"PasswordFieldName": "password", "PasswordFieldName": "password",
// //
"Expires": 1000, "Expires": 10000,
// Claim // Claim
"Claim": [ "Claim": [
{ {

30
SuperAPI/wwwroot/rezero/default_ui/add_filed.html

@ -594,26 +594,8 @@
}, },
isEditing: true, isEditing: true,
data: [ 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: {}, localJsonData: {},
localJosnName: "", localJosnName: "",
@ -631,10 +613,10 @@
}, },
cachesData: { cachesData: {
OBJECT_TABLE_NAME: "test2", OBJECT_TABLE_NAME: "",
OBJECT_TABLE_CNNAME: "测试2", OBJECT_TABLE_CNNAME: "",
SYSTEM_TABLE_CNNAME: "测试1", SYSTEM_TABLE_CNNAME: "",
SYSTEM_TABLE_NAME: "test1", SYSTEM_TABLE_NAME: "",
}, },
}; };
}, },

90
medical.transfomer.business/TransformerFactory.cs

@ -166,7 +166,7 @@ namespace medical.transfomer.business
foreach (var path in paths) foreach (var path in paths)
{ {
if (currentToken[path] != null) if (currentToken != null && currentToken[path] != null)
{ {
currentToken = currentToken[path]; currentToken = currentToken[path];
} }
@ -218,7 +218,7 @@ namespace medical.transfomer.business
foreach (var path in paths) foreach (var path in paths)
{ {
if (currentToken[path] != null) if (currentToken != null && currentToken[path] != null)
{ {
currentToken = currentToken[path]; 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)
{
sourceArray = jArray;
}
else if (currentToken is JObject jObject)
{
// 如果是JObject,将其作为单个元素的数组处理
sourceArray = new JArray { jObject };
}
else
{ {
JObject targetItem = new JObject(); // 创建包含当前Token的数组
sourceArray = new JArray { currentToken };
}
foreach (var mapping in mappings) foreach (JToken sourceItem in sourceArray)
{
if (sourceItem is JObject sourceObject)
{ {
if (mapping.SYSTEM_FIELD != null && mapping.INTERFACE_FIELD != null && JObject targetItem = new JObject();
!string.IsNullOrEmpty(mapping.SYSTEM_FIELD) && !string.IsNullOrEmpty(mapping.INTERFACE_FIELD))
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) foreach (var path in paths)
{ {
if (currentToken[path] != null) if (currentToken != null && currentToken[path] != null)
{ {
currentToken = currentToken[path]; currentToken = currentToken[path];
} }
@ -343,7 +364,7 @@ namespace medical.transfomer.business
foreach (var path in paths) foreach (var path in paths)
{ {
if (currentToken[path] != null) if (currentToken != null && currentToken[path] != null)
{ {
currentToken = currentToken[path]; 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)
{
sourceArray = jArray;
}
else if (currentToken is JObject jObject)
{
// 如果是JObject,将其作为单个元素的数组处理
sourceArray = new JArray { jObject };
}
else
{ {
JObject targetItem = new JObject(); // 创建包含当前Token的数组
sourceArray = new JArray { currentToken };
}
foreach (var mapping in mappings) foreach (JToken sourceItem in sourceArray)
{
if (sourceItem is JObject sourceObject)
{ {
if (mapping.INTERFACE_FIELD != null && mapping.SYSTEM_FIELD != null && JObject targetItem = new JObject();
!string.IsNullOrEmpty(mapping.INTERFACE_FIELD) && !string.IsNullOrEmpty(mapping.SYSTEM_FIELD))
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);
}
} }
} }

20
medical.transfomer.service/MedicalInsuranceTransactionService.cs

@ -42,7 +42,7 @@ namespace medical.transfomer.service
/// <param name="methodName">方法名称</param> /// <param name="methodName">方法名称</param>
/// <param name="inputData">输入数据</param> /// <param name="inputData">输入数据</param>
/// <returns>处理结果</returns> /// <returns>处理结果</returns>
public async Task<object> ExecuteTransaction(string methodName, JObject inputData) public async Task<object> ExecuteTransaction(string methodName, JToken inputData)
{ {
Stopwatch stopwatch = new Stopwatch(); Stopwatch stopwatch = new Stopwatch();
stopwatch.Start(); stopwatch.Start();
@ -51,8 +51,16 @@ namespace medical.transfomer.service
{ {
_logger.LogInformation($"开始执行医保交易: {methodName}"); _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}"); _logger.LogInformation($"医保交易执行完成: {methodName}");
@ -211,14 +219,16 @@ namespace medical.transfomer.service
/// <param name="endpoint">接口地址</param> /// <param name="endpoint">接口地址</param>
/// <param name="requestData">请求数据</param> /// <param name="requestData">请求数据</param>
/// <returns>响应结果</returns> /// <returns>响应结果</returns>
public async Task<JObject> CallMedicalInsuranceApi(string endpoint, JObject requestData) public async Task<JToken> CallMedicalInsuranceApi(string endpoint, JToken requestData)
{ {
try try
{ {
var httpClient = _httpClientFactory.CreateClient("MedicalInsurance"); var httpClient = _httpClientFactory.CreateClient("MedicalInsurance");
// 将JToken转换为字符串
string requestContent = requestData.ToString();
var content = new StringContent( var content = new StringContent(
requestData.ToString(), requestContent,
Encoding.UTF8, Encoding.UTF8,
"application/json"); "application/json");
@ -226,7 +236,7 @@ namespace medical.transfomer.service
response.EnsureSuccessStatusCode(); response.EnsureSuccessStatusCode();
var responseString = await response.Content.ReadAsStringAsync(); var responseString = await response.Content.ReadAsStringAsync();
return JObject.Parse(responseString); return JToken.Parse(responseString);
} }
catch (Exception ex) catch (Exception ex)
{ {

Loading…
Cancel
Save