using System; using System.Text; using System.Net.Http; using System.Text.Json; using System.Threading.Tasks; using System.Collections.Generic; using System.Diagnostics; using Microsoft.Extensions.Logging; using Newtonsoft.Json.Linq; using ReZero.DependencyInjection; using medical.transfomer.business; using medical.transfomer.entity; using SqlSugar; namespace medical.transfomer.service { /// /// 医保交易服务,提供医保接口的请求处理功能 /// public class MedicalInsuranceTransactionService : IScopeContract { private readonly TransformerFactory _transformerFactory; private readonly ILogger _logger; private readonly ISqlSugarClient _db; private readonly IHttpClientFactory _httpClientFactory; public MedicalInsuranceTransactionService( TransformerFactory transformerFactory, ILogger logger, ISqlSugarClient db, IHttpClientFactory httpClientFactory) { _transformerFactory = transformerFactory; _logger = logger; _db = db; _httpClientFactory = httpClientFactory; } /// /// 执行医保交易 /// /// 方法名称 /// 输入数据 /// 处理结果 public async Task ExecuteTransaction(string methodName, JObject inputData) { Stopwatch stopwatch = new Stopwatch(); stopwatch.Start(); try { _logger.LogInformation($"开始执行医保交易: {methodName}"); // 调用转换工厂执行方法 var result = await _transformerFactory.ExecuteMethod(methodName, inputData); _logger.LogInformation($"医保交易执行完成: {methodName}"); // 计算耗时 stopwatch.Stop(); long elapsedTime = stopwatch.ElapsedMilliseconds; // 保存成功日志 await SaveTransactionLog( methodName, inputData.ToString(), result == null ? null : JsonSerializer.Serialize(result), 1, "", elapsedTime); return result; } catch (Exception ex) { _logger.LogError(ex, $"执行医保交易异常: {methodName}"); // 计算耗时 stopwatch.Stop(); long elapsedTime = stopwatch.ElapsedMilliseconds; // 保存失败日志 await SaveTransactionLog( methodName, inputData.ToString(), null, 0, ex.Message, elapsedTime); return new { code = -1, msg = $"交易执行异常: {ex.Message}" }; } } /// /// 根据方法ID获取方法配置信息 /// /// 方法ID /// 方法配置信息 public async Task GetMethodConfigById(string methodId) { return await _db.Queryable() .FirstAsync(m => m.METHOD_ID == methodId); } /// /// 根据方法名称获取方法配置信息 /// /// 方法名称 /// 方法配置信息 public async Task GetMethodConfigByName(string methodName) { return await _db.Queryable() .FirstAsync(m => m.METHOD_NAME == methodName); } /// /// 获取方法的映射配置 /// /// 方法ID /// 参数类型(1:入参, 2:出参) /// 对象装配配置列表 public async Task> GetMethodAssemblies(string methodId, int parameterType) { return await _db.Queryable() .Where(a => a.METHOD_REF == methodId && a.PARAMETR_TYPE == parameterType) .ToListAsync(); } /// /// 获取映射表的字段映射关系 /// /// 表名 /// 是否为系统到接口的映射 /// 字段映射关系列表 public async Task> GetFieldMappings(string tableName, bool isSystemToInterface) { if (isSystemToInterface) { return await _db.Queryable() .Where(m => m.SYSTEM_TABLE_NAME == tableName) .ToListAsync(); } else { return await _db.Queryable() .Where(m => m.OBJECT_TABLE_NAME == tableName) .ToListAsync(); } } /// /// 保存交易日志 /// /// 方法名称 /// 请求数据 /// 响应数据 /// 状态(1:成功, 0:失败) /// 错误信息 /// 耗时(毫秒) /// public async Task SaveTransactionLog( string methodName, string requestData, string responseData, int status, string errorMessage, long elapsedTime) { try { // 获取方法配置 var methodConfig = await GetMethodConfigByName(methodName); if (methodConfig == null) { _logger.LogWarning($"未找到方法配置,无法保存交易日志: {methodName}"); return; } // 创建日志实体 var transLog = new STD_TRANSACTION_LOG { METHOD_ID = methodConfig.METHOD_ID, METHOD_NAME = methodName, REQUEST_TIME = DateTime.Now, REQUEST_DATA = methodConfig.SAVE_INPUT == 1 ? requestData : null, RESPONSE_TIME = DateTime.Now, RESPONSE_DATA = methodConfig.SAVE_OUTPUT == 1 ? responseData : null, STATUS = status, ERROR_MESSAGE = errorMessage, ELAPSED_TIME = elapsedTime, CLIENT_IP = "", // TODO: 获取客户端IP USER_ID = "" // TODO: 获取当前用户ID }; // 保存到数据库 await _db.Insertable(transLog).ExecuteCommandAsync(); _logger.LogInformation($"保存交易日志成功: {methodName}, 状态: {status}"); } catch (Exception ex) { _logger.LogError(ex, "保存交易日志异常"); } } /// /// 直接调用医保接口 /// /// 接口地址 /// 请求数据 /// 响应结果 public async Task CallMedicalInsuranceApi(string endpoint, JObject requestData) { try { var httpClient = _httpClientFactory.CreateClient("MedicalInsurance"); var content = new StringContent( requestData.ToString(), Encoding.UTF8, "application/json"); var response = await httpClient.PostAsync(endpoint, content); response.EnsureSuccessStatusCode(); var responseString = await response.Content.ReadAsStringAsync(); return JObject.Parse(responseString); } catch (Exception ex) { _logger.LogError(ex, $"调用医保接口异常: {endpoint}"); throw; } } } }