|
|
using Azure.Core;using Dapper;using Microsoft.Extensions.Configuration;using Newtonsoft.Json;using Newtonsoft.Json.Converters;using Npgsql;using Shentun.Peis.ImportLisResults;using Shentun.Peis.PlugIns.Extensions.ChargeRequests.YinHai;using Shentun.Peis.PlugIns.Extensions.ChargeRequests.YinHai.FeeBacks;using Shentun.Peis.PlugIns.Extensions.ImportLisResults.YinHai.ResultCalls;using Shentun.Peis.PlugIns.Extensions.LisRequests.YinHai;using Shentun.Peis.ThirdInterfaces;using Shentun.Utilities;using System;using System.Collections.Generic;using System.Data.Common;using System.IdentityModel.Tokens.Jwt;using System.Linq;using System.Net.Http.Headers;using System.Text;using System.Threading.Tasks;using System.Xml;using Volo.Abp.Application.Dtos;
namespace Shentun.Peis.PlugIns.Extensions.ImportLisResults.YinHai{
public class ImportLisResultPlugInsYinHai {
protected IConfiguration? AppConfig; private readonly string AppConnctionStr; private readonly IConfiguration? InterfaceConfig; private readonly ThirdInterfaceDto? _thirdInterfaceDto; private readonly PluginLogger _logger; // 添加日志实例
private string? _appBaseAddress; private static string? _accesToken; protected string? AppUser; protected string? AppPassword;
static ImportLisResultPlugInsYinHai() { Dapper.DefaultTypeMap.MatchNamesWithUnderscores = true;
}
public ImportLisResultPlugInsYinHai(Guid thirdInterfaceId) { _logger = new PluginLogger(); AppConfig = new ConfigurationBuilder() .SetBasePath(DirectoryHelper.GetAppDirectory()) // 设置基础路径为当前目录
.AddJsonFile("appsettings.json", optional: true, reloadOnChange: true) .Build(); AppConnctionStr = AppConfig.GetSection("ConnectionStrings") .GetSection("Default").Value;
using (DbConnection conn = new NpgsqlConnection(AppConnctionStr)) { string sql; sql = @"
SELECT * from third_interface where id =@ThirdInterfaceId ";
_thirdInterfaceDto = (conn.Query<ThirdInterfaceDto>(sql, new { ThirdInterfaceId = thirdInterfaceId })).Single();
}
var configurationBuilder = new ConfigurationBuilder() .AddJsonStream(new MemoryStream(System.Text.Encoding.UTF8.GetBytes(_thirdInterfaceDto.ParmValue))); InterfaceConfig = configurationBuilder.Build();
_appBaseAddress = AppConfig.GetSection("App") .GetSection("SelfUrl").Value; AppUser = AppConfig.GetSection("App") .GetSection("SelfUser").Value; AppPassword = AppConfig.GetSection("App") .GetSection("SelfPassword").Value; } public ImportLisResultPlugInsYinHai(string parmValue) { _logger = new PluginLogger(); AppConfig = new ConfigurationBuilder().SetBasePath(DirectoryHelper.GetAppDirectory()) // 设置基础路径为当前目录
.AddJsonFile("appsettings.json", optional: true, reloadOnChange: true).Build(); AppConnctionStr = AppConfig.GetSection("ConnectionStrings") .GetSection("Default").Value;
var configurationBuilder = new ConfigurationBuilder() .AddJsonStream(new MemoryStream(System.Text.Encoding.UTF8.GetBytes(parmValue))); InterfaceConfig = configurationBuilder.Build();
_appBaseAddress = AppConfig.GetSection("App") .GetSection("SelfUrl").Value; AppUser = AppConfig.GetSection("App") .GetSection("SelfUser").Value; AppPassword = AppConfig.GetSection("App") .GetSection("SelfPassword").Value; }
/// <summary>
/// 接收lis检查结果
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
/// <exception cref="Exception"></exception>
public async Task<CallBussinessResponseDetailDto> SendResultRequestAsync(InferfaceXmlDataDto input) { var res = new CallBussinessResponseDetailDto { msg = "失败", status_code = "-1" };
#region 解析xml
var lisResultCallRequestData = GetLisResultCallRequestData(input.message);
#endregion
_logger.LogResult("银海接收lis检查结果", $"请求数据:{input.message}");
try { var execDoctorUser = InterfaceConfig.GetValue("Interface:ExecDoctorUser", ""); var commonTableTypeId = InterfaceConfig.GetValue("Interface:CommonTableTypeId", ""); var execOrganizationUnitId = InterfaceConfig.GetValue("Interface:ExecOrganizationUnitId", ""); var checkDoctorName = InterfaceConfig.GetValue("Interface:CheckDoctorName", "");
string actionName = "result_call"; string codeName = "lis_server";
var bodyData = lisResultCallRequestData.body.data.request_details;
var createImportLisResultDtos = new List<CreateImportLisResultDto>();
if (bodyData.detail.Any()) {
var lisItemCommonTableList = await GetCommonTableByTypeId(commonTableTypeId);
foreach (var item in bodyData.detail) { var dzFirst = lisItemCommonTableList.FirstOrDefault(f => f.ThirdCode == item.examine_code.ToString());
if (dzFirst == null) { _logger.LogResult("银海接收lis检查结果", $"Lis明细项目【{item.examine_name},编码:{item.examine_code}】没有对照"); // throw new Exception($"Lis明细项目【{item.examine_name},编码:{item.examine_code}】没有对照");
} else { var createImportLisResultDto = new CreateImportLisResultDto() { LisRequestNo = item.request_no, ItemId = Guid.Parse(dzFirst.DisplayName), ItemName = item.examine_name, Result = item.examine_result, Unit = item.computing_unit, ReferenceRangeValue = item.reference_range, //CriticalRangeValue = "",
//ResultStatusId = "",
//ReportPrompt = "",
CheckDoctorName = checkDoctorName, //CheckDate = lisResult.CheckDate,
ExecOrganizationUnitId = Guid.Parse(execOrganizationUnitId) }; createImportLisResultDtos.Add(createImportLisResultDto); }
}
} else { throw new Exception("无结果数据"); }
//发送数据
var callResult = await CallAppServiceAsync<List<CreateImportLisResultDto>, object>("api/app/ImportLisResult/ImportResult", createImportLisResultDtos);
_logger.LogResult("银海接收lis检查结果", $"处理成功,Lis申请单号【{createImportLisResultDtos.FirstOrDefault().LisRequestNo}】");
var yinHaiSendInterfaceLogDto = new YinHaiSendInterfaceLogDto { LogName = "接收lis检查结果", ExecDoctorUser = Guid.Parse(execDoctorUser), InterfaceName = $"{codeName}_{actionName}", ParaValue = input.message, RequestNo = createImportLisResultDtos.FirstOrDefault().LisRequestNo, ReturnParaValue = "" };
await AddSendLog(yinHaiSendInterfaceLogDto);
res = new CallBussinessResponseDetailDto { status_code = "1", msg = "成功" };
} catch (Exception ex) { _logger.LogResult("银海接收lis检查结果", ex, $"接收lis检查结果异常"); }
return res; }
/// <summary>
/// 获取对照数据
/// </summary>
/// <param name="commonTableTypeId"></param>
/// <returns></returns>
private async Task<List<YinHaiItemCommonTableDto>> GetCommonTableByTypeId(string commonTableTypeId) { var thirdCode = InterfaceConfig.GetValue("Interface:ThirdCode", "");
using (DbConnection conn = new NpgsqlConnection(AppConnctionStr)) { string sql; sql = $@"select display_name,{thirdCode} as thirdCode from common_table where common_table_type_id='{commonTableTypeId}' "; var yinHaiAsbitemCommonTableList = (await conn.QueryAsync<YinHaiItemCommonTableDto>(sql)).ToList();
return yinHaiAsbitemCommonTableList; } }
/// <summary>
/// 添加日志
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
private async Task AddSendLog(YinHaiSendInterfaceLogDto input) { using (DbConnection conn = new NpgsqlConnection(AppConnctionStr)) { string sql; sql = $@" insert into interface_send_log (id,log_name,request_no,interface_name,para_value,return_para_value,concurrency_stamp,
creation_time,creator_id,last_modification_time,last_modifier_id) values (@id,@log_name,@request_no,@interface_name,@para_value,@return_para_value,@concurrency_stamp, @creation_time,@creator_id,@last_modification_time,@last_modifier_id) ";
await conn.ExecuteAsync(sql, new { id = Guid.NewGuid(), log_name = input.LogName, request_no = input.RequestNo, interface_name = input.InterfaceName, para_value = input.ParaValue, return_para_value = input.ReturnParaValue, concurrency_stamp = Guid.NewGuid().ToString("N"), creation_time = DateTime.Now, creator_id = input.ExecDoctorUser, last_modification_time = DateTime.Now, last_modifier_id = input.ExecDoctorUser });
} }
#region 解析xml
private LisResultCallRequestDto GetLisResultCallRequestData(string message) { try { var doc = new XmlDocument(); doc.LoadXml(message);
var request = new LisResultCallRequestDto(); var root = doc.DocumentElement;
if (root == null) return null;
// 解析 head
var headNode = root.SelectSingleNode("head"); if (headNode != null) { request.head = new CallBussinessRequestHeadDto { version = GetNodeValue(headNode, "version"), timestamp = GetNodeValue(headNode, "timestamp"), sign = GetNodeValue(headNode, "sign"), request_id = GetNodeValue(headNode, "request_id"), source_system = GetNodeValue(headNode, "source_system"), object_system = GetNodeValue(headNode, "object_system"), action = GetNodeValue(headNode, "action"), code = GetNodeValue(headNode, "code") }; }
// 解析 body
var bodyNode = root.SelectSingleNode("body"); if (bodyNode != null) { request.body = new LisResultCallRequestBodyDto(); var dataNode = bodyNode.SelectSingleNode("data"); if (dataNode != null) { request.body.data = new LisResultCallRequestBodyDataDto(); var requestDetailsNode = dataNode.SelectSingleNode("request_details"); if (requestDetailsNode != null) { // 创建 detail 列表
request.body.data.request_details = new LisResultCallRequestBodyDataRequestDetails { detail = new List<LisResultCallRequestBodyDataRequestDetail>() };
// 获取所有 detail 节点
var detailNodes = requestDetailsNode.SelectNodes("detail"); if (detailNodes != null) { foreach (XmlNode detailNode in detailNodes) { var detail = new LisResultCallRequestBodyDataRequestDetail { hos_id = GetNodeValue(detailNode, "hos_id"), request_no = GetNodeValue(detailNode, "request_no"), patient_type = GetNodeValue(detailNode, "patient_type"), report_serial_no = GetNodeValue(detailNode, "report_serial_no"), org_code = GetNodeValue(detailNode, "org_code"), system_source = GetNodeValue(detailNode, "system_source"), org_name = GetNodeValue(detailNode, "org_name"), patient_id = GetNodeValue(detailNode, "patient_id"), visit_id = GetNodeValue(detailNode, "visit_id"), order_id = GetNodeValue(detailNode, "order_id"), item_serial_no = GetNodeValue(detailNode, "item_serial_no"), print_no = GetNodeValue(detailNode, "print_no"), examine_way_name = GetNodeValue(detailNode, "examine_way_name"), examine_no = GetNodeValue(detailNode, "examine_no"), examine_code = GetNodeValue(detailNode, "examine_code"), examine_name = GetNodeValue(detailNode, "examine_name"), examine_en_name = GetNodeValue(detailNode, "examine_en_name"), examine_result_type = GetNodeValue(detailNode, "examine_result_type"), examine_result = GetNodeValue(detailNode, "examine_result"), computing_unit = GetNodeValue(detailNode, "computing_unit"), abnormal_tip = GetNodeValue(detailNode, "abnormal_tip"), reference_range = GetNodeValue(detailNode, "reference_range"), remark = GetNodeValue(detailNode, "remark"), batch_no = GetNodeValue(detailNode, "batch_no"), report_url = GetNodeValue(detailNode, "report_url") }; request.body.data.request_details.detail.Add(detail); } } } } }
return request; } catch (Exception ex) { //_logger.LogError(ex, "解析 XML 失败");
return null; } }
private string GetNodeValue(XmlNode parent, string nodeName) { var node = parent.SelectSingleNode(nodeName); return node?.InnerText ?? ""; } #endregion
private async Task<TOut> CallAppServiceAsync<TInput, TOut>(string url, TInput data, string method = "post") {
if (string.IsNullOrWhiteSpace(_appBaseAddress)) { throw new Exception("_appBaseAddress不能为空"); } string baseAddress = _appBaseAddress; await CheckLoginAsync(); using (var httpClientHandler = new HttpClientHandler()) { using (var httpClient = new HttpClient(httpClientHandler)) { httpClient.BaseAddress = new Uri(baseAddress);
httpClient.DefaultRequestHeaders.Accept.Add( new MediaTypeWithQualityHeaderValue("application/json"));//设置accept标头,告诉JSON是可接受的响应类型
httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", _accesToken); IsoDateTimeConverter timeFormat = new IsoDateTimeConverter(); timeFormat.DateTimeFormat = "yyyy-MM-dd HH:mm:ss"; var sendData = JsonConvert.SerializeObject(data, Newtonsoft.Json.Formatting.Indented, timeFormat); using (HttpContent httpContent = new StringContent(sendData)) { httpContent.Headers.ContentType = new MediaTypeHeaderValue("application/json"); HttpResponseMessage response = null; if (method == "post") { response = await httpClient.PostAsync(url, httpContent); } else { response = await httpClient.GetAsync(url); }
string result; if (!response.IsSuccessStatusCode) { result = response.Content.ReadAsStringAsync().Result; throw new Exception("http通信错误:" + response.StatusCode + ",结果:" + result); } result = await response.Content.ReadAsStringAsync();
var resultDto = JsonConvert.DeserializeObject<WebApiOutDto<TOut>>(result);
if (resultDto.Code == -1) { throw new Exception($"调用WebApi失败,返回-1,消息:" + resultDto.Message); } return resultDto.Data;
}
} } }
#region 获取token
private async Task<WebApiOutDto<LoginOutDataDto>> LoginAsync(string userId, string password) { if (string.IsNullOrWhiteSpace(userId)) { throw new Exception("用户ID不能为空"); } if (string.IsNullOrWhiteSpace(password)) { throw new Exception("密码不能为空"); } using (var httpClientHandler = new HttpClientHandler()) { using (var httpClient = new HttpClient(httpClientHandler)) { httpClient.BaseAddress = new Uri(_appBaseAddress);
httpClient.DefaultRequestHeaders.Accept.Add( new MediaTypeWithQualityHeaderValue("application/json"));//设置accept标头,告诉JSON是可接受的响应类型
var url = "api/identity/users/login"; var loginUser = new LoginInputDto() { UserName = userId, Password = password }; var sendData = JsonConvert.SerializeObject(loginUser); using (HttpContent httpContent = new StringContent(sendData)) { httpContent.Headers.ContentType = new MediaTypeHeaderValue("application/json"); HttpResponseMessage response = await httpClient.PostAsync(url, httpContent); string result; if (!response.IsSuccessStatusCode) { result = response.Content.ReadAsStringAsync().Result; throw new Exception("http通信错误:" + response.StatusCode + ",结果:" + result); } result = await response.Content.ReadAsStringAsync(); var restultDto = JsonConvert.DeserializeObject<WebApiOutDto<LoginOutDataDto>>(result); if (restultDto == null) { throw new Exception("返回结果是空"); } if (restultDto.Code != 1) { throw new Exception($"登录失败{restultDto.Message}"); } _accesToken = restultDto.Data.access_token; return restultDto; }
} } }
private async Task CheckLoginAsync() { if (string.IsNullOrWhiteSpace(_accesToken)) { await LoginAsync(); } else { var handler = new JwtSecurityTokenHandler(); var payload = handler.ReadJwtToken(_accesToken).Payload; var claims = payload.Claims; var exp = claims.First(claim => claim.Type == "exp").Value; if (exp == null) { await LoginAsync(); } else { if (long.TryParse(exp, out var expires)) { var expireTime = DateTimeOffset.FromUnixTimeSeconds(expires).LocalDateTime; if (expireTime <= DateTime.Now) { await LoginAsync(); } } else { await LoginAsync(); }
}
} }
private async Task<WebApiOutDto<LoginOutDataDto>> LoginAsync() { if (string.IsNullOrWhiteSpace(AppUser)) { throw new Exception("SelfUser不能为空"); } if (string.IsNullOrWhiteSpace(AppPassword)) { throw new Exception("SelfPassword不能为空"); } var relult = await LoginAsync(AppUser, AppPassword); return relult; } #endregion
}}
|