Browse Source

人寿

master
wxd 1 year ago
parent
commit
b0f9e2bde1
  1. 16
      src/Shentun.Peis.Application.Contracts/CustomerOrgGroups/CustomerOrgGroupSimpleDto.cs
  2. 18
      src/Shentun.Peis.Application.Contracts/ThirdBookingPushs/DecryptBaseDto.cs
  3. 73
      src/Shentun.Peis.Application.Contracts/ThirdBookingPushs/PushMedicalReportInputDto.cs
  4. 19
      src/Shentun.Peis.Application.Contracts/ThirdBookingPushs/PushReportDecryptDto.cs
  5. 20
      src/Shentun.Peis.Application.Contracts/ThirdBookingPushs/PushReportFileInputDto.cs
  6. 306
      src/Shentun.Peis.Application/ThirdBookingPushs/ThirdBookingPushAppService.cs
  7. 6
      src/Shentun.Peis.Application/ThirdBookings/ThirdBookingAppService.cs
  8. 52
      src/Shentun.Peis.Application/ThirdMedicalCenters/ThirdMedicalCenterAppService.cs
  9. 119
      src/Shentun.Peis.Domain/AesHelper.cs
  10. 2
      src/Shentun.Peis.Domain/PatientRegisters/PatientRegister.cs
  11. 2
      src/Shentun.Peis.Domain/ThirdBookings/ThirdBooking.cs
  12. 2
      src/Shentun.Peis.Domain/ThirdInterfaces/ThirdInterface.cs
  13. 70
      src/Shentun.Peis.Domain/newRsaHelper.cs
  14. 15959
      src/Shentun.Peis.EntityFrameworkCore/Migrations/20240928015112_update_third_interface_parm_value_length.Designer.cs
  15. 37
      src/Shentun.Peis.EntityFrameworkCore/Migrations/20240928015112_update_third_interface_parm_value_length.cs
  16. 15959
      src/Shentun.Peis.EntityFrameworkCore/Migrations/20240928035619_update_patient_register_zimu.Designer.cs
  17. 25
      src/Shentun.Peis.EntityFrameworkCore/Migrations/20240928035619_update_patient_register_zimu.cs
  18. 6
      src/Shentun.Peis.EntityFrameworkCore/Migrations/PeisDbContextModelSnapshot.cs

16
src/Shentun.Peis.Application.Contracts/CustomerOrgGroups/CustomerOrgGroupSimpleDto.cs

@ -0,0 +1,16 @@
using System;
using System.Collections.Generic;
using System.Text;
namespace Shentun.Peis.CustomerOrgGroups
{
public class CustomerOrgGroupSimpleDto
{
public Guid Id { get; set; }
/// <summary>
/// 分组名称
/// </summary>
public string DisplayName { get; set; }
}
}

18
src/Shentun.Peis.Application.Contracts/ThirdBookingPushs/DecryptBaseDto.cs

@ -0,0 +1,18 @@
using System;
using System.Collections.Generic;
using System.Text;
namespace Shentun.Peis.ThirdBookingPushs
{
public class DecryptBaseDto
{
/// <summary>
/// 0:接收成功
/// 1:(体检预约类型:体检人员信息匹配失败、上门体检类型:信息已接收,不可变更)
/// 2:系统异常
/// </summary>
public int STATUS { get; set; }
public string MESSAGE { get; set; }
}
}

73
src/Shentun.Peis.Application.Contracts/ThirdBookingPushs/PushMedicalReportInputDto.cs

@ -0,0 +1,73 @@
using System;
using System.Collections.Generic;
using System.Text;
namespace Shentun.Peis.ThirdBookingPushs
{
public class PushMedicalReportInputDto
{
/// <summary>
/// 体检年度
/// </summary>
public string YEAR { get; set; }
/// <summary>
/// 客户来源
/// </summary>
public string SOURCE { get; set; }
/// <summary>
/// 体检机构
/// </summary>
public string ORGCODE { get; set; }
/// <summary>
/// 第三方报告ID
/// </summary>
public string BUSINESSID { get; set; }
/// <summary>
/// 姓名
/// </summary>
public string NAME { get; set; }
/// <summary>
/// 证件类型
/// </summary>
public string IDTYPE { get; set; }
/// <summary>
/// 证件号
/// </summary>
public string IDNO { get; set; }
/// <summary>
/// 体检套餐编码
/// </summary>
public string EXAMPACKAGECODE { get; set; }
/// <summary>
/// 推送时间
/// </summary>
public string PUSHTIME { get; set; }
/// <summary>
/// 体检报告pdf文件base64
/// </summary>
public string PDFBASE64 { get; set; }
/// <summary>
/// 体检报告pdf文件ID
/// </summary>
public string PDFFILEID { get; set; }
/// <summary>
/// 体检报告json数据
/// </summary>
public string JSONBASE64 { get; set; }
}
}

19
src/Shentun.Peis.Application.Contracts/ThirdBookingPushs/PushReportDecryptDto.cs

@ -0,0 +1,19 @@
using System;
using System.Collections.Generic;
using System.Text;
namespace Shentun.Peis.ThirdBookingPushs
{
public class PushReportDecryptDto
{
/// <summary>
/// 接口调用状态
/// </summary>
public bool FLAG { get; set; }
/// <summary>
/// 接口调用结果信息
/// </summary>
public string MESSAGE { get; set; }
}
}

20
src/Shentun.Peis.Application.Contracts/ThirdBookingPushs/PushReportFileInputDto.cs

@ -0,0 +1,20 @@
using System;
using System.Collections.Generic;
using System.Text;
namespace Shentun.Peis.ThirdBookingPushs
{
public class PushReportFileInputDto
{
/// <summary>
/// 人员id
/// </summary>
public Guid PatientRegisterId { get; set; }
/// <summary>
/// 报告base64
/// </summary>
public string ReportBase64 { get; set; }
}
}

306
src/Shentun.Peis.Application/ThirdBookingPushs/ThirdBookingPushAppService.cs

@ -17,6 +17,8 @@ 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
{
@ -65,7 +67,7 @@ namespace Shentun.Peis.ThirdBookingPushs
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 iCode = interfaceConfig.GetSection("Interface").GetSection("ICODE").Value;
var medicalYear = interfaceConfig.GetSection("Interface").GetSection("MedicalYear").Value;
var isActive = interfaceConfig.GetSection("Interface").GetSection("IsActive").Value;
if (!string.IsNullOrWhiteSpace(isActive)
&& isActive == "Y")
@ -73,37 +75,51 @@ namespace Shentun.Peis.ThirdBookingPushs
var patientRegisterEnt = await _patientRegisterRepository.GetAsync(input.PatientRegisterId);
if (patientRegisterEnt != null && string.IsNullOrWhiteSpace(patientRegisterEnt.ThirdBookingId))
if (patientRegisterEnt != null
&& !string.IsNullOrWhiteSpace(patientRegisterEnt.ThirdBookingId))
{
var thirdBookingEnt = await _thirdBookingRepository.FirstOrDefaultAsync(f => f.Id == Guid.Parse(patientRegisterEnt.ThirdBookingId));
var customerOrgGroupEnt = await _customerOrgGroupRepository.GetAsync(g => g.Id == Guid.Parse(thirdBookingEnt.CustomerOrgGroupId));
var pushRegisterInput = new PushRegisterInputDto
string iCode = thirdBookingEnt.ICode;
if (thirdBookingEnt.MedicalStatus == '0')
{
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 = "2024"
};
var inputPara = GetEncryptData(JsonConvert.SerializeObject(pushRegisterInput), iCode, publicKey, privateKey);
await CallBookingAppServiceAsync<EncryDataRequstDto, EncryDataResultDto>(baseApiAddress, registerApiAddress, inputPara);
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<EncryDataRequstDto, EncryDataResultDto>(baseApiAddress, registerApiAddress, inputPara, "application/json;charset=utf-8");
if (resultPara.FLAG)
{
var decryptDataPara = GetDecryptData<DecryptBaseDto>(resultPara, publicKey, privateKey);
if (decryptDataPara.STATUS == 0)
{
thirdBookingEnt.MedicalStatus = '1';
await _thirdBookingRepository.UpdateAsync(thirdBookingEnt);
}
}
}
}
}
@ -131,58 +147,193 @@ namespace Shentun.Peis.ThirdBookingPushs
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 iCode = interfaceConfig.GetSection("Interface").GetSection("ICODE").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))
//已总检才能上传
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<EncryDataRequstDto, EncryDataResultDto>(baseApiAddress, completeApiAddress, inputPara, "application/json;charset=utf-8");
if (resultPara.FLAG)
{
var decryptDataPara = GetDecryptData<DecryptBaseDto>(resultPara, publicKey, privateKey);
if (decryptDataPara.STATUS == 0)
{
thirdBookingEnt.MedicalStatus = '2';
await _thirdBookingRepository.UpdateAsync(thirdBookingEnt);
}
}
}
}
}
}
}
/// <summary>
/// 推送体检报告
/// </summary>
/// <returns></returns>
[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 customerOrgGroupEnt = await _customerOrgGroupRepository.GetAsync(g => g.Id == Guid.Parse(thirdBookingEnt.CustomerOrgGroupId));
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 pushCompletePhysicalInput = new PushCompletePhysicalInputDto
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')
{
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 = "2024",
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);
await CallBookingAppServiceAsync<EncryDataRequstDto, EncryDataResultDto>(baseApiAddress, completeApiAddress, inputPara);
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<EncryDataRequstDto, EncryDataResultDto>(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<EncryDataRequstDto, EncryDataResultDto>(baseApiAddress, completeApiAddress, pushMedicalReportInputEncrypt, "application/json;charset=utf-8");
if (reportResultPara.FLAG)
{
var decryptDataPara = GetDecryptData<PushReportDecryptDto>(reportResultPara, publicKey, privateKey);
if (decryptDataPara.FLAG == true)
{
thirdBookingEnt.MedicalStatus = '3';
await _thirdBookingRepository.UpdateAsync(thirdBookingEnt);
}
}
#endregion
}
}
#endregion
}
}
}
}
}
/// <summary>
/// 发起请求
/// </summary>
@ -191,10 +342,10 @@ namespace Shentun.Peis.ThirdBookingPushs
/// <param name="baseApiAddress"></param>
/// <param name="url"></param>
/// <param name="data"></param>
/// <param name="contentType"></param>
/// <param name="method"></param>
/// <returns></returns>
/// <exception cref="Exception"></exception>
private async Task<TOut> CallBookingAppServiceAsync<TInput, TOut>(string baseApiAddress, string url, TInput data, string method = "post")
private async Task<TOut> CallBookingAppServiceAsync<TInput, TOut>(string baseApiAddress, string url, TInput data, string contentType, string method = "post")
{
using (var httpClientHandler = new HttpClientHandler())
{
@ -208,7 +359,7 @@ namespace Shentun.Peis.ThirdBookingPushs
var sendData = JsonConvert.SerializeObject(data);
using (HttpContent httpContent = new StringContent(sendData))
{
httpContent.Headers.ContentType = new MediaTypeHeaderValue("application/json;charset=utf-8");
httpContent.Headers.ContentType = new MediaTypeHeaderValue(contentType);
HttpResponseMessage response = null;
if (method == "post")
{
@ -260,6 +411,31 @@ namespace Shentun.Peis.ThirdBookingPushs
return result;
}
/// <summary>
/// 返回数据密文解密
/// </summary>
/// <param name="encryDataResultDto">返回的密文对象</param>
/// <param name="publicKey">对方公钥</param>
/// <param name="privateKey">自己私钥</param>
/// <returns></returns>
private static TOut GetDecryptData<TOut>(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<TOut>(resultStr);
return resultDto;
}
else
{
return default(TOut);
}
}
/// <summary>
/// 转换性别
/// </summary>

6
src/Shentun.Peis.Application/ThirdBookings/ThirdBookingAppService.cs

@ -10,6 +10,7 @@ using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Volo.Abp;
using Volo.Abp.Application.Services;
using Volo.Abp.Domain.Repositories;
@ -64,7 +65,10 @@ namespace Shentun.Peis.ThirdBookings
customerOrgId = Guid.Parse(customerOrgIdPara);
}
}
else
{
throw new UserFriendlyException("请开启第三方预约");
}
var query = await _thirdBookingRepository.GetQueryableAsync();
if (!string.IsNullOrWhiteSpace(input.StartDate) && !string.IsNullOrWhiteSpace(input.StartDate))
{

52
src/Shentun.Peis.Application/ThirdMedicalCenters/ThirdMedicalCenterAppService.cs

@ -10,6 +10,11 @@ using System.Text;
using System.Threading.Tasks;
using Volo.Abp.Application.Services;
using Volo.Abp.Domain.Repositories;
using Shentun.Peis.CustomerOrgRegisters;
using Shentun.Peis.CustomerOrgGroups;
using Microsoft.Extensions.Configuration;
using Shentun.Peis.Enums;
using System.IO;
namespace Shentun.Peis.ThirdMedicalCenters
{
@ -26,16 +31,22 @@ namespace Shentun.Peis.ThirdMedicalCenters
private readonly CacheService _cacheService;
private readonly ThirdMedicalCenterManager _thirdMedicalCenterManager;
private readonly IRepository<ThirdMedicalCenterBookingDate, Guid> _thirdMedicalCenterBookingDateRepository;
private readonly IRepository<CustomerOrgGroup, Guid> _customerOrgGroupRepository;
private readonly IRepository<ThirdInterface, Guid> _thirdInterfaceRepository;
public ThirdMedicalCenterAppService(
IRepository<ThirdMedicalCenter, Guid> thirdMedicalCenterRepository,
CacheService cacheService,
ThirdMedicalCenterManager thirdMedicalCenterManager,
IRepository<ThirdMedicalCenterBookingDate, Guid> thirdMedicalCenterBookingDateRepository)
IRepository<ThirdMedicalCenterBookingDate, Guid> thirdMedicalCenterBookingDateRepository,
IRepository<CustomerOrgGroup, Guid> customerOrgGroupRepository,
IRepository<ThirdInterface, Guid> thirdInterfaceRepository)
{
_thirdMedicalCenterRepository = thirdMedicalCenterRepository;
_cacheService = cacheService;
_thirdMedicalCenterManager = thirdMedicalCenterManager;
_thirdMedicalCenterBookingDateRepository = thirdMedicalCenterBookingDateRepository;
_customerOrgGroupRepository = customerOrgGroupRepository;
_thirdInterfaceRepository = thirdInterfaceRepository;
}
/// <summary>
@ -162,6 +173,45 @@ namespace Shentun.Peis.ThirdMedicalCenters
}
/// <summary>
/// 获取特定单位分组
/// </summary>
/// <returns></returns>
[HttpPost("api/app/ThirdMedicalCenter/GetCustomerOrgGroupList")]
public async Task<List<CustomerOrgGroupSimpleDto>> GetCustomerOrgGroupListAsync()
{
Guid? customerOrgRegisterId = null;
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 customerOrgRegisterIdPara = interfaceConfig.GetSection("Interface").GetSection("CustomerOrgRegisterId").Value;
if (!string.IsNullOrWhiteSpace(customerOrgRegisterIdPara))
{
customerOrgRegisterId = Guid.Parse(customerOrgRegisterIdPara);
}
}
var query = await _customerOrgGroupRepository.GetQueryableAsync();
if (customerOrgRegisterId != null)
{
query = query.Where(m => m.CustomerOrgRegisterId == customerOrgRegisterId.Value);
}
var entListDto = query.OrderBy(o => o.DisplayOrder).Select(s => new CustomerOrgGroupSimpleDto
{
DisplayName = s.DisplayName,
Id = s.Id
}).ToList();
return entListDto;
}
/// <summary>
/// 根据体检中心获取可预约日期
/// </summary>

119
src/Shentun.Peis.Domain/AesHelper.cs

@ -0,0 +1,119 @@
using Microsoft.EntityFrameworkCore.Metadata.Internal;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Security.Cryptography;
using System.IO;
using Org.BouncyCastle.Crypto.Parameters;
using Org.BouncyCastle.Crypto;
using Org.BouncyCastle.Security;
using Org.BouncyCastle.Utilities;
namespace Shentun.Peis
{
public class AesHelper
{
private static readonly byte[] Key = Encoding.UTF8.GetBytes("1234567812345678"); // 16字节密钥
private static readonly byte[] Iv = Encoding.UTF8.GetBytes("1234567812345678"); // 16字节初始化向量
/// <summary>
/// MD5加密
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
public static string GetMD5Hash(string input)
{
using (MD5 md5 = MD5.Create())
{
byte[] inputBytes = Encoding.UTF8.GetBytes(input);
byte[] hashBytes = md5.ComputeHash(inputBytes);
// Convert byte array to a hexadecimal string
StringBuilder sb = new StringBuilder();
for (int i = 0; i < hashBytes.Length; i++)
{
sb.Append(hashBytes[i].ToString("x2"));
}
return sb.ToString();
}
}
/// <summary>
/// 解密
/// </summary>
/// <param name="strinput"></param>
/// <param name="strkey"></param>
/// <returns></returns>
public static string AESDecrypt(string strinput, string strkey)
{
try
{
//string dummyData = strinput.Trim().Replace("%", "").Replace(",", "").Replace(" ", "+").Replace("_", "/").Replace("-", "+");
//if (dummyData.Length % 4 > 0)
//{
// dummyData = dummyData.PadRight(dummyData.Length + 4 - dummyData.Length % 4, '=');
//}
byte[] inputArray = Convert.FromBase64String(strinput);
byte[] key = Encoding.UTF8.GetBytes(strkey);
IBufferedCipher cipher = CipherUtilities.GetCipher("AES/ECB/PKCS5Padding");
cipher.Init(false, AesKey(strkey));
// cipher.Init(false, new ParametersWithIV(new DesParameters(key), key)); 带IV向量的算法可以用到。
byte[] rv = new byte[cipher.GetOutputSize(inputArray.Length)];
int tam = cipher.ProcessBytes(inputArray, 0, inputArray.Length, rv, 0);
cipher.DoFinal(rv, tam);
return Encoding.UTF8.GetString(rv);
}
catch (Exception ex)
{
return "";
}
}
/// <summary>
/// 加密
/// </summary>
/// <param name="inputArray"></param>
/// <param name="strkey"></param>
/// <returns></returns>
public static string AESEncrypt(byte[] inputArray, string strkey)
{
try
{
//byte[] inputArray = Encoding.UTF8.GetBytes(strinput);
byte[] key = Encoding.UTF8.GetBytes(strkey);
IBufferedCipher cipher = CipherUtilities.GetCipher("AES/ECB/PKCS5Padding");
//cipher.Init(true, new ParametersWithIV(new DesParameters(key), key));
cipher.Init(true, AesKey(strkey));
byte[] rv = new byte[cipher.GetOutputSize(inputArray.Length)];
int tam = cipher.ProcessBytes(inputArray, 0, inputArray.Length, rv, 0);
cipher.DoFinal(rv, tam);
return Convert.ToBase64String(rv);
}
catch (Exception ex)
{
return "";
}
}
public static KeyParameter AesKey(String key)
{
byte[] bs = Encoding.Default.GetBytes(key);
if (bs.Length != 16)
{
bs = Arrays.CopyOf(bs, 16);// 处理数组长度为16(不足16位,不空;超过16位取前16位)
}
return new KeyParameter(bs);
}
}
}

2
src/Shentun.Peis.Domain/PatientRegisters/PatientRegister.cs

@ -318,7 +318,7 @@ namespace Shentun.Peis.Models
/// <summary>
/// 第三方预约登记ID
/// </summary>
[Column("Third_Booking_Id")]
[Column("third_booking_id")]
public string ThirdBookingId { get; set; }
[Column("concurrency_stamp")]

2
src/Shentun.Peis.Domain/ThirdBookings/ThirdBooking.cs

@ -101,7 +101,7 @@ namespace Shentun.Peis.Models
public string MaritalStatusName { get; set; }
/// <summary>
/// 体检状态 0未开始 1已登记 2已完成体检
/// 体检状态 0未开始 1已登记 2已完成体检 3已推送报告
/// </summary>
[Column("medical_status")]
public char MedicalStatus { get; set; }

2
src/Shentun.Peis.Domain/ThirdInterfaces/ThirdInterface.cs

@ -36,7 +36,7 @@ namespace Shentun.Peis.Models
/// 配置参数
/// </summary>
[Column("parm_value")]
[StringLength(2000)]
[StringLength(6000)]
public string ParmValue { get; set; }
/// <summary>

70
src/Shentun.Peis.Domain/newRsaHelper.cs

@ -127,6 +127,76 @@ namespace Shentun.Peis
/// <summary>
/// 验签
/// </summary>
/// <param name="message"></param>
/// <param name="signature"></param>
/// <param name="publicKey">对方公钥</param>
/// <returns></returns>
public static bool VerifySignature(string message, byte[] signature,string publicKey)
{
bool isValid = false;
string yuanFuPublicKey_Net = RSAPublicKeyJava2DotNet(publicKey);
using (RSACryptoServiceProvider rsa = new RSACryptoServiceProvider())
{
try
{
rsa.FromXmlString(yuanFuPublicKey_Net);
// 验证签名
isValid = rsa.VerifyData(Encoding.UTF8.GetBytes(message), CryptoConfig.MapNameToOID("MD5"), signature);
// 验证签名
}
catch (Exception ex)
{
}
finally
{
rsa.PersistKeyInCsp = false;
}
}
return isValid;
}
/// <summary>
/// 解密
/// </summary>
/// <param name="bizContent"></param>
/// <param name="privateKey">自己私钥</param>
/// <returns></returns>
public static string RSADecrypt(string bizContent,string privateKey)
{
string minZhongPrivateKey_Net = RSAPrivateKeyJava2DotNet(privateKey);
//此处请根据需要设置集合capacity,也可不指定
var encryptedData = new List<byte>(45000);
using (RSACryptoServiceProvider rsa = new RSACryptoServiceProvider())
{
rsa.FromXmlString(minZhongPrivateKey_Net);
int start = 0;
var bytes = Convert.FromBase64String(bizContent).AsSpan();
while (start < bytes.Length)
{
var buffer = bytes.Length - start <= _maxDecryptSize
? bytes.Slice(start).ToArray() : bytes.Slice(start, _maxDecryptSize).ToArray();
encryptedData.AddRange(rsa.Decrypt(buffer, false));
start += _maxDecryptSize;
};
}
return Encoding.UTF8.GetString(encryptedData.ToArray());
}
}
}

15959
src/Shentun.Peis.EntityFrameworkCore/Migrations/20240928015112_update_third_interface_parm_value_length.Designer.cs
File diff suppressed because it is too large
View File

37
src/Shentun.Peis.EntityFrameworkCore/Migrations/20240928015112_update_third_interface_parm_value_length.cs

@ -0,0 +1,37 @@
using Microsoft.EntityFrameworkCore.Migrations;
#nullable disable
namespace Shentun.Peis.Migrations
{
public partial class update_third_interface_parm_value_length : Migration
{
protected override void Up(MigrationBuilder migrationBuilder)
{
migrationBuilder.AlterColumn<string>(
name: "parm_value",
table: "third_interface",
type: "character varying(6000)",
maxLength: 6000,
nullable: true,
oldClrType: typeof(string),
oldType: "character varying(2000)",
oldMaxLength: 2000,
oldNullable: true);
}
protected override void Down(MigrationBuilder migrationBuilder)
{
migrationBuilder.AlterColumn<string>(
name: "parm_value",
table: "third_interface",
type: "character varying(2000)",
maxLength: 2000,
nullable: true,
oldClrType: typeof(string),
oldType: "character varying(6000)",
oldMaxLength: 6000,
oldNullable: true);
}
}
}

15959
src/Shentun.Peis.EntityFrameworkCore/Migrations/20240928035619_update_patient_register_zimu.Designer.cs
File diff suppressed because it is too large
View File

25
src/Shentun.Peis.EntityFrameworkCore/Migrations/20240928035619_update_patient_register_zimu.cs

@ -0,0 +1,25 @@
using Microsoft.EntityFrameworkCore.Migrations;
#nullable disable
namespace Shentun.Peis.Migrations
{
public partial class update_patient_register_zimu : Migration
{
protected override void Up(MigrationBuilder migrationBuilder)
{
migrationBuilder.RenameColumn(
name: "Third_Booking_Id",
table: "patient_register",
newName: "third_booking_id");
}
protected override void Down(MigrationBuilder migrationBuilder)
{
migrationBuilder.RenameColumn(
name: "third_booking_id",
table: "patient_register",
newName: "Third_Booking_Id");
}
}
}

6
src/Shentun.Peis.EntityFrameworkCore/Migrations/PeisDbContextModelSnapshot.cs

@ -7616,7 +7616,7 @@ namespace Shentun.Peis.Migrations
b.Property<string>("ThirdBookingId")
.HasColumnType("text")
.HasColumnName("Third_Booking_Id");
.HasColumnName("third_booking_id");
b.Property<string>("ThirdInfo")
.HasMaxLength(20)
@ -11809,8 +11809,8 @@ namespace Shentun.Peis.Migrations
.HasColumnName("medical_center_id");
b.Property<string>("ParmValue")
.HasMaxLength(2000)
.HasColumnType("character varying(2000)")
.HasMaxLength(6000)
.HasColumnType("character varying(6000)")
.HasColumnName("parm_value");
b.Property<string>("ThirdInterfaceType")

Loading…
Cancel
Save