using Microsoft.Extensions.Configuration; using Newtonsoft.Json.Converters; using Newtonsoft.Json; using Shentun.Peis.Enums; using Shentun.Peis.Models; using Shentun.Peis.PatientRegisters; using Shentun.Peis.PlugIns.Sms; using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Net.Http.Headers; using System.Net.Http; using System.Text; using System.Threading.Tasks; using Volo.Abp.Application.Services; using Volo.Abp.Domain.Repositories; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; using NPOI.POIFS.Crypt.Dsig; using NPOI.SS.Formula.Functions; namespace Shentun.Peis.ThirdBookingPushs { /// /// 推送体检信息到人寿 /// [Authorize] [ApiExplorerSettings(GroupName = "Work")] public class ThirdBookingPushAppService : ApplicationService { private readonly IRepository _thirdInterfaceRepository; private readonly IRepository _patientRegisterRepository; private readonly IRepository _thirdBookingRepository; private readonly IRepository _customerOrgGroupRepository; public ThirdBookingPushAppService( IRepository thirdInterfaceRepository, IRepository patientRegisterRepository, IRepository thirdBookingRepository, IRepository customerOrgGroupRepository ) { _thirdInterfaceRepository = thirdInterfaceRepository; _patientRegisterRepository = patientRegisterRepository; _thirdBookingRepository = thirdBookingRepository; _customerOrgGroupRepository = customerOrgGroupRepository; } /// /// 推送登记 /// /// [HttpPost("api/app/ThirdBookingPush/PushRegister")] public async Task PushRegisterAsync(PatientRegisterIdInputDto input) { var thirdBookingInterface = await _thirdInterfaceRepository.FirstOrDefaultAsync(o => o.ThirdInterfaceType == ThirdInterfaceTypeFlag.ThirdBooking); if (thirdBookingInterface != null && thirdBookingInterface.IsActive == 'Y') { var parmValue = thirdBookingInterface.ParmValue; var configurationBuilder = new ConfigurationBuilder() .AddJsonStream(new MemoryStream(System.Text.Encoding.UTF8.GetBytes(parmValue))); var interfaceConfig = configurationBuilder.Build(); var baseApiAddress = interfaceConfig.GetSection("Interface").GetSection("BaseApiAddress").Value; var registerApiAddress = interfaceConfig.GetSection("Interface").GetSection("RegisterApiAddress").Value; var publicKey = interfaceConfig.GetSection("Interface").GetSection("YuanFuPublicKey").Value; var privateKey = interfaceConfig.GetSection("Interface").GetSection("MinZhongPrivateKey").Value; var medicalYear = interfaceConfig.GetSection("Interface").GetSection("MedicalYear").Value; var isActive = interfaceConfig.GetSection("Interface").GetSection("IsActive").Value; if (!string.IsNullOrWhiteSpace(isActive) && isActive == "Y") { var patientRegisterEnt = await _patientRegisterRepository.GetAsync(input.PatientRegisterId); if (patientRegisterEnt != null && !string.IsNullOrWhiteSpace(patientRegisterEnt.ThirdBookingId)) { var thirdBookingEnt = await _thirdBookingRepository.FirstOrDefaultAsync(f => f.Id == Guid.Parse(patientRegisterEnt.ThirdBookingId)); string iCode = thirdBookingEnt.ICode; if (thirdBookingEnt.MedicalStatus == '0') { var customerOrgGroupEnt = await _customerOrgGroupRepository.GetAsync(g => g.Id == Guid.Parse(thirdBookingEnt.CustomerOrgGroupId)); var pushRegisterInput = new PushRegisterInputDto { BOOKINGDATE = thirdBookingEnt.BookingDate.ToString("yyyy-MM-dd"), BOOKINGDATEDESC = "", BOOKINGID = patientRegisterEnt.ThirdBookingId, BOOKINGTIME = thirdBookingEnt.BookingDate.ToString("HH:mm:ss"), BOOKINGTYPE = "1", BOOKINGTYPEELSEDESC = "", CONFIRMORG = "MINZ", CONFIRMORGCENTERDESC = "民众", CONFIRMTIME = patientRegisterEnt.CreationTime.ToString("yyyy-MM-dd HH:mm:ss"), CONFIRMTYPE = "1", EXAMPACKAGECODE = thirdBookingEnt.CustomerOrgGroupId, EXAMPACKAGEDESC = customerOrgGroupEnt.DisplayName, IDNO = thirdBookingEnt.IdNo, IDTYPE = thirdBookingEnt.IdType, MOBILE = thirdBookingEnt.Phone, NAME = patientRegisterEnt.PatientName, SOURCE = "BjGJ", YEAR = medicalYear }; var inputPara = GetEncryptData(JsonConvert.SerializeObject(pushRegisterInput), iCode, publicKey, privateKey); var resultPara = await CallBookingAppServiceAsync(baseApiAddress, registerApiAddress, inputPara, "application/json;charset=utf-8"); if (resultPara.FLAG) { var decryptDataPara = GetDecryptData(resultPara, publicKey, privateKey); if (decryptDataPara.STATUS == 0) { thirdBookingEnt.MedicalStatus = '1'; await _thirdBookingRepository.UpdateAsync(thirdBookingEnt); } } } } } } } /// /// 推送完成体检数据 /// /// [HttpPost("api/app/ThirdBookingPush/PushCompletePhysical")] public async Task PushCompletePhysicalAsync(PatientRegisterIdInputDto input) { var thirdBookingInterface = await _thirdInterfaceRepository.FirstOrDefaultAsync(o => o.ThirdInterfaceType == ThirdInterfaceTypeFlag.ThirdBooking); if (thirdBookingInterface != null && thirdBookingInterface.IsActive == 'Y') { var parmValue = thirdBookingInterface.ParmValue; var configurationBuilder = new ConfigurationBuilder() .AddJsonStream(new MemoryStream(System.Text.Encoding.UTF8.GetBytes(parmValue))); var interfaceConfig = configurationBuilder.Build(); var baseApiAddress = interfaceConfig.GetSection("Interface").GetSection("BaseApiAddress").Value; var completeApiAddress = interfaceConfig.GetSection("Interface").GetSection("CompleteApiAddress").Value; var publicKey = interfaceConfig.GetSection("Interface").GetSection("YuanFuPublicKey").Value; var privateKey = interfaceConfig.GetSection("Interface").GetSection("MinZhongPrivateKey").Value; var isActive = interfaceConfig.GetSection("Interface").GetSection("IsActive").Value; var medicalYear = interfaceConfig.GetSection("Interface").GetSection("MedicalYear").Value; if (!string.IsNullOrWhiteSpace(isActive) && isActive == "Y") { var patientRegisterEnt = await _patientRegisterRepository.GetAsync(input.PatientRegisterId); //已总检才能上传 if (patientRegisterEnt != null && !string.IsNullOrWhiteSpace(patientRegisterEnt.ThirdBookingId)) { var thirdBookingEnt = await _thirdBookingRepository.FirstOrDefaultAsync(f => f.Id == Guid.Parse(patientRegisterEnt.ThirdBookingId)); string iCode = thirdBookingEnt.ICode; if (thirdBookingEnt.MedicalStatus == '1') { var customerOrgGroupEnt = await _customerOrgGroupRepository.GetAsync(g => g.Id == Guid.Parse(thirdBookingEnt.CustomerOrgGroupId)); var pushCompletePhysicalInput = new PushCompletePhysicalInputDto { BOOKINGDATE = thirdBookingEnt.BookingDate.ToString("yyyy-MM-dd"), BOOKINGDATEDESC = "", BOOKINGID = patientRegisterEnt.ThirdBookingId, BOOKINGTIME = thirdBookingEnt.BookingDate.ToString("HH:mm:ss"), BOOKINGTYPE = "1", BOOKINGTYPEELSEDESC = "", CONFIRMORG = "MINZ", CONFIRMORGCENTERDESC = "民众", CONFIRMTIME = patientRegisterEnt.CreationTime.ToString("yyyy-MM-dd HH:mm:ss"), CONFIRMTYPE = "1", EXAMPACKAGECODE = thirdBookingEnt.CustomerOrgGroupId, EXAMPACKAGEDESC = customerOrgGroupEnt.DisplayName, IDNO = thirdBookingEnt.IdNo, IDTYPE = thirdBookingEnt.IdType, MOBILE = thirdBookingEnt.Phone, NAME = patientRegisterEnt.PatientName, SOURCE = "BjGJ", YEAR = medicalYear, AGE = patientRegisterEnt.Age == null ? (short)0 : patientRegisterEnt.Age.Value, BIRTHDAY = patientRegisterEnt.BirthDate != null ? patientRegisterEnt.BirthDate.Value.ToString("yyyy-MM-dd") : "", EXAMBEGINTIME = patientRegisterEnt.MedicalStartDate != null ? patientRegisterEnt.MedicalStartDate.Value.ToString("yyyy-MM-dd HH:mm:ss") : "", EXAMCOMPLETETIME = patientRegisterEnt.SummaryDate != null ? patientRegisterEnt.SummaryDate.Value.ToString("yyyy-MM-dd HH:mm:ss") : "", EXAMID = patientRegisterEnt.Id.ToString(), GENDER = GetSexId(patientRegisterEnt.SexId) }; var inputPara = GetEncryptData(JsonConvert.SerializeObject(pushCompletePhysicalInput), iCode, publicKey, privateKey); var resultPara = await CallBookingAppServiceAsync(baseApiAddress, completeApiAddress, inputPara, "application/json;charset=utf-8"); if (resultPara.FLAG) { var decryptDataPara = GetDecryptData(resultPara, publicKey, privateKey); if (decryptDataPara.STATUS == 0) { thirdBookingEnt.MedicalStatus = '2'; await _thirdBookingRepository.UpdateAsync(thirdBookingEnt); } } } } } } } /// /// 推送体检报告 /// /// [HttpPost("api/app/ThirdBookingPush/PushReportFile")] public async Task PushReportFileAsync(PushReportFileInputDto input) { var thirdBookingInterface = await _thirdInterfaceRepository.FirstOrDefaultAsync(o => o.ThirdInterfaceType == ThirdInterfaceTypeFlag.ThirdBooking); if (thirdBookingInterface != null && thirdBookingInterface.IsActive == 'Y') { var parmValue = thirdBookingInterface.ParmValue; var configurationBuilder = new ConfigurationBuilder() .AddJsonStream(new MemoryStream(System.Text.Encoding.UTF8.GetBytes(parmValue))); var interfaceConfig = configurationBuilder.Build(); var baseApiAddress = interfaceConfig.GetSection("Interface").GetSection("BaseApiAddress").Value; var completeApiAddress = interfaceConfig.GetSection("Interface").GetSection("CompleteApiAddress").Value; var publicKey = interfaceConfig.GetSection("Interface").GetSection("YuanFuPublicKey").Value; var privateKey = interfaceConfig.GetSection("Interface").GetSection("MinZhongPrivateKey").Value; var aesKey = interfaceConfig.GetSection("Interface").GetSection("AesKey").Value; var isActive = interfaceConfig.GetSection("Interface").GetSection("IsActive").Value; var medicalYear = interfaceConfig.GetSection("Interface").GetSection("MedicalYear").Value; if (!string.IsNullOrWhiteSpace(isActive) && isActive == "Y") { var patientRegisterEnt = await _patientRegisterRepository.GetAsync(input.PatientRegisterId); if (patientRegisterEnt != null && !string.IsNullOrWhiteSpace(patientRegisterEnt.ThirdBookingId) && patientRegisterEnt.CompleteFlag == PatientRegisterCompleteFlag.SumCheck) { var thirdBookingEnt = await _thirdBookingRepository.FirstOrDefaultAsync(f => f.Id == Guid.Parse(patientRegisterEnt.ThirdBookingId)); string iCode = thirdBookingEnt.ICode; if (thirdBookingEnt.MedicalStatus == '2') { var customerOrgGroupEnt = await _customerOrgGroupRepository.GetAsync(g => g.Id == Guid.Parse(thirdBookingEnt.CustomerOrgGroupId)); #region 上传文件 byte[] filebytes = Convert.FromBase64String(input.ReportBase64); string fileDataEncrypt = AesHelper.AESEncrypt(filebytes, aesKey); string fileSign = AesHelper.GetMD5Hash(fileDataEncrypt); var fileInputParm = new EncryDataRequstDto { DATA = fileDataEncrypt, SIGN = fileSign, ICODE = thirdBookingEnt.ICode }; var fileResultEncry = await CallBookingAppServiceAsync(baseApiAddress, completeApiAddress, fileInputParm, "multipart/form-data"); if (fileResultEncry.FLAG) { //验签 if (fileResultEncry.SIGN == AesHelper.GetMD5Hash(fileResultEncry.DATA)) { //解密 string fileResultStr = AesHelper.AESDecrypt(fileResultEncry.DATA, aesKey); //报文ID #region 上传报告 var pushMedicalReportInput = new PushMedicalReportInputDto { EXAMPACKAGECODE = thirdBookingEnt.CustomerOrgGroupId, IDNO = thirdBookingEnt.IdNo, IDTYPE = thirdBookingEnt.IdType, NAME = patientRegisterEnt.PatientName, SOURCE = "BjGJ", YEAR = medicalYear, BUSINESSID = patientRegisterEnt.Id.ToString(), JSONBASE64 = "", ORGCODE = "MINZ", PDFBASE64 = "", PDFFILEID = fileResultStr, PUSHTIME = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") }; var pushMedicalReportInputEncrypt = GetEncryptData(JsonConvert.SerializeObject(pushMedicalReportInput), iCode, publicKey, privateKey); var reportResultPara = await CallBookingAppServiceAsync(baseApiAddress, completeApiAddress, pushMedicalReportInputEncrypt, "application/json;charset=utf-8"); if (reportResultPara.FLAG) { var decryptDataPara = GetDecryptData(reportResultPara, publicKey, privateKey); if (decryptDataPara.FLAG == true) { thirdBookingEnt.MedicalStatus = '3'; await _thirdBookingRepository.UpdateAsync(thirdBookingEnt); } } #endregion } } #endregion } } } } } /// /// 发起请求 /// /// /// /// /// /// /// /// /// private async Task CallBookingAppServiceAsync(string baseApiAddress, string url, TInput data, string contentType, string method = "post") { using (var httpClientHandler = new HttpClientHandler()) { using (var httpClient = new HttpClient(httpClientHandler)) { httpClient.BaseAddress = new Uri(baseApiAddress); httpClient.DefaultRequestHeaders.Accept.Add( new MediaTypeWithQualityHeaderValue("application/json"));//设置accept标头,告诉JSON是可接受的响应类型 var sendData = JsonConvert.SerializeObject(data); using (HttpContent httpContent = new StringContent(sendData)) { httpContent.Headers.ContentType = new MediaTypeHeaderValue(contentType); 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(result); return resultDto; } } } } /// /// 生成请求密文数据 /// /// /// /// /// /// private static EncryDataRequstDto GetEncryptData(string resultJson, string ICODE, string publicKey, string privateKey) { string data = newRsaHelper.RSAEncrypt(resultJson, publicKey); string sign = newRsaHelper.SignData(data, privateKey); var result = new EncryDataRequstDto { DATA = data, SIGN = sign, ICODE = ICODE }; return result; } /// /// 返回数据密文解密 /// /// 返回的密文对象 /// 对方公钥 /// 自己私钥 /// private static TOut GetDecryptData(EncryDataResultDto encryDataResultDto, string publicKey, string privateKey) { bool isVerify = newRsaHelper.VerifySignature(encryDataResultDto.DATA, Convert.FromBase64String(encryDataResultDto.SIGN), publicKey); if (isVerify) { string resultStr = newRsaHelper.RSADecrypt(encryDataResultDto.DATA, privateKey); TOut resultDto = JsonConvert.DeserializeObject(resultStr); return resultDto; } else { return default(TOut); } } /// /// 转换性别 /// /// private string GetSexId(char SexId) { string SexName = ""; if (SexId == 'M') { SexName = "0"; } if (SexId == 'F') { SexName = "1"; } return SexName; } } }