Browse Source

pacs结果导入

bjmzak
DESKTOP-G961P6V\Zhh 2 years ago
parent
commit
73cc2f1b71
  1. 28
      ThirdPlugIns/Shentun.Peis.PlugIns.Gem/PacsImportResultInterfaceInput.cs
  2. 74
      ThirdPlugIns/Shentun.Peis.PlugIns.Gem/PacsImportResultInterfaceOut.cs
  3. 110
      ThirdPlugIns/Shentun.Peis.PlugIns.Gem/PacsImportResultPlugInsGem.cs
  4. 37
      ThirdPlugIns/Shentun.Peis.PlugIns.Gem/test/Shentun.Peis.PlugIns.Gem.Test/PacsImportResultPlugInsGemTest.cs
  5. 6
      ThirdPlugIns/Shentun.Peis.PlugIns.Gem/test/Shentun.Peis.PlugIns.Gem.Test/appsettings.json
  6. 9
      src/Shentun.ColumnReferencePlugIns/LisResultImportPlugInsBase.cs
  7. 8
      src/Shentun.ColumnReferencePlugIns/PacsImportResultPlugInsBase.cs
  8. 4
      src/Shentun.ColumnReferencePlugIns/PacsRequestForImportResultPlugIns.cs
  9. 39
      src/Shentun.ColumnReferencePlugIns/PlugInsBase.cs
  10. 2
      src/Shentun.ColumnReferencePlugIns/ThirdPlugInsBase.cs
  11. 87
      src/Shentun.Peis.Application.Contracts/ImportPacsResults/CreateImportPacsResultDto.cs
  12. 259
      src/Shentun.Peis.Application/ImportPacsResults/ImportPacsResultAppService.cs
  13. 61
      src/Shentun.Peis.Domain/ImageHelper.cs
  14. 42
      src/Shentun.Utilities/FileHelper.cs
  15. 40
      src/Shentun.Utilities/PDFHelper.cs
  16. 3
      src/Shentun.Utilities/Shentun.Utilities.csproj
  17. 83
      test/Shentun.Peis.Application.Tests/ImportPacsResultAppServiceTest.cs

28
ThirdPlugIns/Shentun.Peis.PlugIns.Gem/PacsImportResultInterfaceInput.cs

@ -0,0 +1,28 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Shentun.Peis.PlugIns.Gem
{
public class PacsImportResultInterfaceInput
{
public string tjNum { get; set; }
public string checkupItemId { get; set; }
public string organizeCode { get; set; }
public string examTypeCode { get; set; }
public string idCard { get; set; }
public string patientType { get; set; }
public string patientId { get; set; }
public string requestId { get; set; }
public string clinicId { get; set; }
public string hospizationId { get; set; }
public string visitId { get; set; }
public long? examRequestId { get; set; }
public string beginTime { get; set; }
public string endTime { get; set; }
public int pageNo { get; set; }
public int pageSize { get; set; }
}
}

74
ThirdPlugIns/Shentun.Peis.PlugIns.Gem/PacsImportResultInterfaceOut.cs

@ -0,0 +1,74 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Shentun.Peis.PlugIns.Gem
{
public class PacsImportResultInterfaceOut
{
public string code { get; set; }
public string msg { get; set; }
public List<PacsImportResultInterfaceData> data { get; set; }
}
public class PacsImportResultInterfaceData
{
/// <summary>
/// 姓名
/// </summary>
public string patientName { get; set; }
/// <summary>
/// 科室名称
/// </summary>
public string reportDeptName { get; set; }
/// <summary>
/// 放射DICOM影像浏览地址
/// </summary>
public string webPacsURL { get; set; }
/// <summary>
/// 1阳性 0阴性
/// </summary>
public int malignant { get; set; }
/// <summary>
/// 结论
/// </summary>
public string examDiagnosis { get; set; }
/// <summary>
/// 描述
/// </summary>
public string examDescript { get; set; }
/// <summary>
/// 建议
/// </summary>
public string suggestion { get; set; }
/// <summary>
/// 报告医生
/// </summary>
public string reportDoctorName { get; set; }
/// <summary>
/// 审核医生
/// </summary>
public string reviewDoctorName { get; set; }
/// <summary>
/// 报告时间
/// </summary>
public string reportDateTime { get; set; }
/// <summary>
/// 审核时间
/// </summary>
public string reviewDateTime { get; set; }
/// <summary>
/// 图文报告浏览地址
/// </summary>
public string reportUrl { get; set; }
/// <summary>
/// 超声打印图片列表,字符串base64数组
/// </summary>
public List<string> imageList { get; set; }
}
}

110
ThirdPlugIns/Shentun.Peis.PlugIns.Gem/PacsImportResultPlugInsGem.cs

@ -1,8 +1,14 @@
using System;
using Newtonsoft.Json.Converters;
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net.Http.Headers;
using System.Text;
using System.Threading.Tasks;
using Shentun.Peis.ImportPacsResults;
using NPOI.SS.Formula.Functions;
using Shentun.Peis.ImportLisResults;
namespace Shentun.Peis.PlugIns.Gem
{
@ -12,11 +18,109 @@ namespace Shentun.Peis.PlugIns.Gem
{
}
public override Task<PacsImportResultPlugInsOut> ImportResultAsync(PacsImportResultPlugInsInput input)
public override async Task<PacsImportResultPlugInsOut> ImportResultAsync(PacsImportResultPlugInsInput input)
{
//if (DepartmentColumnReferenceId == null || DepartmentColumnReferenceId == Guid.Empty)
//{
// throw new Exception("没有设置科室编码对照");
//}
var pacsRequests = await GetPacsRequestForImportResultPlugInssAsync(input.PatientRegisterId);
var beginTime = DateTime.Now.Date.AddDays(-30);
foreach (var pacsRequest in pacsRequests)
{
var interfaceInpu = new PacsImportResultInterfaceInput()
{
tjNum = pacsRequest.CheckRequestNo,
organizeCode = "1",
patientType = "3",
//requestId = pacsRequest.CheckRequestNo,
beginTime = beginTime.ToString("yyyy-MM-dd HH:mm:ss"),
pageNo = 1,
pageSize = 20
};
var apiResult = await CallInterfaceServiceAsync<PacsImportResultInterfaceInput,
PacsImportResultInterfaceOut>(interfaceInpu);
if(!apiResult.data.Any())
{
continue;
}
var firstData = apiResult.data[0];
if(!DateTime.TryParse(firstData.reportDateTime,out var checkDate))
{
throw new Exception("报告时间格式不正确");
}
var createImportPacsResultDto = new CreateImportPacsResultDto()
{
CheckRequestNo = pacsRequest.CheckRequestNo,
PatientName = pacsRequest.PatientName,
Result = firstData.examDescript,
Summary = firstData.examDiagnosis,
Suggestion = firstData.suggestion,
CheckDate = checkDate,
CheckDoctorName = firstData.reportDoctorName,
Files = new List<CreateImportPacsResultPictureDto>()
{
new CreateImportPacsResultPictureDto()
{
IsPrint = 'Y',
FileTransMode = "0",
FileName = firstData.reportUrl,
FileFormat = "1",
FileBase64 = Shentun.Utilities.FileHelper.ToBase64(firstData.reportUrl)
},
}
};
return base.ImportResultAsync(input);
var callResult = await CallAppServiceAsync<CreateImportPacsResultDto, object>("api/app/ImportLisResult/ImportResult", createImportPacsResultDto);
}
var result = new PacsImportResultPlugInsOut();
return result;
}
public async Task<TOut> CallInterfaceServiceAsync<TInput, TOut>( TInput data)
{
string baseAddress = InterfaceWebApiAddress;
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 = await httpClient.PostAsync("", httpContent);
string result;
if (!response.IsSuccessStatusCode)
{
result = response.Content.ReadAsStringAsync().Result;
throw new Exception("http通信错误:" + response.StatusCode + ",结果:" + result);
}
result = await response.Content.ReadAsStringAsync();
dynamic resultDto = JsonConvert.DeserializeObject<TOut>(result);
if (resultDto != null)
{
if (resultDto.code!= "200")
{
throw new Exception($"调用WebApi失败,返回错误,消息:" + resultDto.code + resultDto.msg);
}
}
return resultDto;
}
}
}
}
}
}

37
ThirdPlugIns/Shentun.Peis.PlugIns.Gem/test/Shentun.Peis.PlugIns.Gem.Test/PacsImportResultPlugInsGemTest.cs

@ -0,0 +1,37 @@
using Shentun.Utilities;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Xunit.Abstractions;
namespace Shentun.Peis.PlugIns.Gem.Test
{
public class PacsImportResultPlugInsGemTest
{
private readonly ITestOutputHelper _output;
public PacsImportResultPlugInsGemTest(ITestOutputHelper testOutputHelper)
{
_output = testOutputHelper;
}
[Fact]
public async Task ImportResultAsync()
{
string configParm;
string filePath = DirectoryHelper.GetAppDirectory() + "/appsettings.json";
configParm = File.ReadAllText(filePath);
var input = new PacsImportResultPlugInsGem(configParm);
var item = await input.ImportResultAsync(
new PacsImportResultPlugInsInput()
{
PatientRegisterId = new Guid("3a1277ab-376c-fbdb-4419-92bbb4594607")
});
}
}
}

6
ThirdPlugIns/Shentun.Peis.PlugIns.Gem/test/Shentun.Peis.PlugIns.Gem.Test/appsettings.json

@ -16,11 +16,13 @@
"Sql": "select ZHID as Code ,ZHMC as DisplayName from PORTAL56_LIS.vi_tj_testitemgroup",
"ColumnNames": "编码,名称",
"EndpointAddress": "http://10.1.12.140:8082/gemse-tj/services/bstj.bstjHttpSoap11Endpoint"
"EndpointAddress": "http://10.1.12.140:8082/gemse-tj/services/bstj.bstjHttpSoap11Endpoint",
"WebApiAddress": "http://10.1.13.18:8380/ris/findReportList"
},
"ConnectionStrings": {
"Default": "Host=140.143.162.39;Port=5432;Database=ShentunPeis070703;User ID=postgres;Password=shentun123;"
//"Default": "Host=140.143.162.39;Port=5432;Database=ShentunPeis070703;User ID=postgres;Password=shentun123;",
//"Default": "Host=localhost;Port=5432;Database=ShentunPeis1218;User ID=postgres;Password=wxd123;"
"Default": "Host=10.1.12.140;Port=5432;Database=ShentunPeis0508;User ID=postgres;Password=st123;"
},
"AuthServer": {

9
src/Shentun.ColumnReferencePlugIns/LisResultImportPlugInsBase.cs

@ -11,17 +11,12 @@ namespace Shentun.Peis.PlugIns
{
public class LisResultImportPlugInsBase : ThirdPlugInsBase
{
protected Guid ItemColumnReferenceId;
protected string AppLisUser;
protected string AppLisPassword;
public LisResultImportPlugInsBase(string parmValue) : base(parmValue)
{
var itemColumnReferenceIdStr = InterfaceConfig.GetSection("Interface")
.GetSection("ItemColumnReferenceId").Value;
if (!string.IsNullOrWhiteSpace(itemColumnReferenceIdStr))
{
ItemColumnReferenceId = new Guid(itemColumnReferenceIdStr);
}
AppLisUser = AppConfig.GetSection("App")
.GetSection("LisUser").Value;
AppLisPassword = AppConfig.GetSection("App")

8
src/Shentun.ColumnReferencePlugIns/PacsImportResultPlugInsBase.cs

@ -20,13 +20,15 @@ namespace Shentun.Peis.PlugIns
var result = new PacsImportResultPlugInsOut();
return result;
}
public async Task<List<PacsRequestForResultImportPlugIns>> GetLisRequestForResultImportPlugInssAsync(Guid patientRegisterId)
public async Task<List<PacsRequestForImportResultPlugIns>> GetPacsRequestForImportResultPlugInssAsync(Guid patientRegisterId)
{
using (DbConnection conn = new NpgsqlConnection(AppConnctionStr))
{
string sql;
sql = @"
SELECT distinct register_check.id ,
SELECT distinct patient_register.patient_register_no,
patient_register.patient_name,
register_check.id ,
register_check.check_request_no
from patient_register
JOIN register_check on patient_register.id = register_check.patient_register_id
@ -36,7 +38,7 @@ JOIN item_type on asbitem.item_type_id = item_type.id
where patient_register.id = @PatientRegisterId and
item_type.is_check_request = 'Y'
";
var pacsRequestForResultImportPlugInss = (await conn.QueryAsync<PacsRequestForResultImportPlugIns>(sql,
var pacsRequestForResultImportPlugInss = (await conn.QueryAsync<PacsRequestForImportResultPlugIns>(sql,
new { PatientRegisterId = patientRegisterId })).ToList();
return pacsRequestForResultImportPlugInss;
}

4
src/Shentun.ColumnReferencePlugIns/PacsRequestForResultImportPlugIns.cs → src/Shentun.ColumnReferencePlugIns/PacsRequestForImportResultPlugIns.cs

@ -6,8 +6,10 @@ using System.Threading.Tasks;
namespace Shentun.Peis.PlugIns
{
public class PacsRequestForResultImportPlugIns
public class PacsRequestForImportResultPlugIns
{
public string PatientRegisterNo { get; set; }
public string PatientName { get; set; }
public Guid RegisterCheckId { get; set; }
public string CheckRequestNo { get; set;}
}

39
src/Shentun.ColumnReferencePlugIns/PlugInsBase.cs

@ -29,7 +29,14 @@ namespace Shentun.Peis.PlugIns
protected string InterfaceSqlKeyColumn;
protected string InterfaceDbType;
protected string? InterfaceConnctionStr;
protected string? InterfaceWebApiAddress;
protected Guid ItemColumnReferenceId;
protected Guid AsbitemColumnReferenceId;
protected Guid DepartmentColumnReferenceId;
protected Guid UserColumnReferenceId;
static PlugInsBase()
{
Dapper.DefaultTypeMap.MatchNamesWithUnderscores = true;
@ -56,8 +63,38 @@ namespace Shentun.Peis.PlugIns
InterfaceSql = InterfaceConfig.GetSection("Interface").GetSection("Sql").Value;
InterfaceSqlKeyColumn = InterfaceConfig.GetSection("Interface").GetSection("SqlKeyColumn").Value;
InterfaceDbType = InterfaceConfig.GetSection("Interface").GetSection("DbType").Value;
InterfaceWebApiAddress = InterfaceConfig.GetSection("Interface").GetSection("WebApiAddress").Value;
InterfaceConnctionStr = InterfaceConfig.GetSection("Interface").GetSection("ConnectionStrings").Value;
var itemColumnReferenceIdStr = InterfaceConfig.GetSection("Interface")
.GetSection("ItemColumnReferenceId").Value;
if (!string.IsNullOrWhiteSpace(itemColumnReferenceIdStr))
{
ItemColumnReferenceId = new Guid(itemColumnReferenceIdStr);
}
var asbItemColumnReferenceIdStr = InterfaceConfig.GetSection("Interface")
.GetSection("AsbitemColumnReferenceId").Value;
if (!string.IsNullOrWhiteSpace(asbItemColumnReferenceIdStr))
{
AsbitemColumnReferenceId = new Guid(asbItemColumnReferenceIdStr);
}
var departmentColumnReferenceIdStr = InterfaceConfig.GetSection("Interface")
.GetSection("DepartmentColumnReferenceId").Value;
if (!string.IsNullOrWhiteSpace(departmentColumnReferenceIdStr))
{
DepartmentColumnReferenceId = new Guid(departmentColumnReferenceIdStr);
}
var userColumnReferenceIdStr = InterfaceConfig.GetSection("Interface")
.GetSection("UserColumnReferenceId").Value;
if (!string.IsNullOrWhiteSpace(userColumnReferenceIdStr))
{
UserColumnReferenceId = new Guid(userColumnReferenceIdStr);
}
}
protected DbConnection CreateInterfaceDbConnect()

2
src/Shentun.ColumnReferencePlugIns/ThirdPlugInsBase.cs

@ -16,7 +16,7 @@ namespace Shentun.Peis.PlugIns
public ThirdPlugInsBase(string parmValue):base(parmValue)
{
}
public async Task<List<ColumnReferenceInterfaceCodeValue>> GetColumnReferenceInterfaceCodeValuesAsync(Guid columnReferenceId,

87
src/Shentun.Peis.Application.Contracts/ImportPacsResults/CreateImportPacsResultDto.cs

@ -0,0 +1,87 @@
using System;
using System.Collections.Generic;
using System.Text;
namespace Shentun.Peis.ImportPacsResults
{
public class CreateImportPacsResultDto
{
public string CheckRequestNo { get; set; }
/// <summary>
/// 姓名
/// </summary>
public string PatientName { get; set; }
/// <summary>
/// 检查所见
/// </summary>
public string? Result { get; set; }
/// <summary>
/// 结论
/// </summary>
public string? Summary { get; set; }
/// <summary>
/// 结论
/// </summary>
public string? Suggestion { get; set; }
/// <summary>
/// 危急值范围
/// </summary>
public string? CriticalRangeValue { get; set; }
/// <summary>
/// 危急值
/// </summary>
public string? CriticalValue { get; set; }
/// <summary>
/// 报告单状态
/// </summary>
public string? ResultStatusId { get; set; } = "01";//01-正常
/// <summary>
/// 报告单提示
/// </summary>
public string ReportPrompt { get; set; }
/// <summary>
/// 检查医生
/// </summary>
public string? CheckDoctorName { get; set; }
/// <summary>
/// 检查日期
/// </summary>
public DateTime? CheckDate { get; set; }
public Guid ExecOrganizationUnitId { get; set; }
public List<CreateImportPacsResultPictureDto> Files { get; set; } = new List<CreateImportPacsResultPictureDto>();
}
public class CreateImportPacsResultPictureDto
{
/// <summary>
/// 文件格式,0-图片,1-pdf
/// </summary>
public string FileFormat { get; set; }
/// <summary>
/// 0-json,1-url
/// </summary>
public string FileTransMode { get; set; }
/// <summary>
/// 文件名
/// </summary>
public string FileName { get; set; }
/// <summary>
/// base64文件
/// </summary>
public string FileBase64 { get; set; }
public char IsPrint { get; set; }
}
}

259
src/Shentun.Peis.Application/ImportPacsResults/ImportPacsResultAppService.cs

@ -0,0 +1,259 @@
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Configuration;
using NPOI.SS.Formula.Functions;
using NUglify.Helpers;
using Shentun.Peis.DiagnosisFunctions;
using Shentun.Peis.ImportLisResults;
using Shentun.Peis.Items;
using Shentun.Peis.Models;
using Shentun.Peis.ReferenceRanges;
using Shentun.Peis.RegisterCheckItems;
using Shentun.Peis.RegisterChecks;
using Shentun.Peis.Units;
using Shentun.Utilities;
using System;
using System.Collections.Generic;
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;
using Volo.Abp.Guids;
using Volo.Abp.Identity;
using Volo.Abp.Users;
namespace Shentun.Peis.ImportPacsResults
{
public class ImportPacsResultAppService : ApplicationService
{
private readonly IRepository<RegisterCheckItem> _registerCheckItemRepository;
private readonly IRepository<RegisterCheckPicture> _registerCheckPictureRepository;
private readonly IRepository<PatientRegister, Guid> _patientRegisterRepository;
private readonly IRepository<ReferenceRange, Guid> _referenceRangeRepository;
private readonly IRepository<RegisterCheck, Guid> _registerCheckRepository;
private readonly IRepository<RegisterCheckAsbitem, Guid> _registerCheckAsbitemRepository;
private readonly IRepository<LisRequest, Guid> _lisRequestRepository;
private readonly IRepository<Item, Guid> _itemRepository;
private readonly IRepository<RegisterCheckSummary, Guid> _registerCheckSummaryRepository;
private readonly IRepository<RegisterCheckSuggestion, Guid> _registerCheckSuggestionRepository;
private readonly IRepository<IdentityUser, Guid> _userRepository;
private readonly IRepository<Unit, Guid> _unitRepository;
private readonly RegisterCheckManager _registerCheckManager;
private readonly RegisterCheckItemManager _registerCheckItemManager;
private readonly CacheService _cacheService;
private readonly IGuidGenerator _guidGenerator;
private readonly IConfiguration _configuration;
private readonly ICurrentUser _currentUser;
private readonly IRepository<UserItemType> _userItemTypeRepository;
private readonly IRepository<Asbitem, Guid> _asbitemRepository;
private readonly DiagnosisFunctionAppService _diagnosisFunctionAppService;
private readonly ReferenceRangeManager _referenceRangeManager;
private readonly ItemManager _itemManager;
private readonly UnitManager _unitManager;
private readonly RegisterCheckAppService _registerCheckAppService;
private List<Unit> _units;
private List<ReferenceRange> _referenceRanges;
private static bool _isRunning = false;
private static readonly object lockObject = new object();
public ImportPacsResultAppService(IRepository<RegisterCheck, Guid> registerCheckRepository,
IRepository<RegisterCheckItem> registerCheckItemRepository,
IRepository<PatientRegister, Guid> patientRegisterRepository,
IRepository<ReferenceRange, Guid> referenceRangeRepository,
IRepository<RegisterCheckSummary, Guid> registerCheckSummaryRepository,
IRepository<RegisterCheckSuggestion, Guid> registerCheckSuggestionRepository,
IRepository<IdentityUser, Guid> userRepository,
RegisterCheckManager registerCheckManager,
RegisterCheckItemManager registerCheckItemManager,
CacheService cacheService,
IGuidGenerator guidGenerator,
IConfiguration configuration,
ICurrentUser currentUser,
IRepository<UserItemType> userItemTypeRepository,
IRepository<Asbitem, Guid> asbitemRepository,
IRepository<RegisterCheckAsbitem, Guid> registerCheckAsbitemRepository,
IRepository<LisRequest, Guid> lisRequestRepository,
IRepository<Unit, Guid> unitRepository,
DiagnosisFunctionAppService diagnosisFunctionAppService,
ReferenceRangeManager referenceRangeManager,
IRepository<Item, Guid> itemRepository,
ItemManager itemManager,
UnitManager unitManager,
RegisterCheckAppService registerCheckAppService,
IRepository<RegisterCheckPicture> registerCheckPictureRepository)
{
_registerCheckRepository = registerCheckRepository;
_userRepository = userRepository;
_registerCheckManager = registerCheckManager;
_patientRegisterRepository = patientRegisterRepository;
_referenceRangeRepository = referenceRangeRepository;
_registerCheckItemRepository = registerCheckItemRepository;
_registerCheckSummaryRepository = registerCheckSummaryRepository;
_registerCheckSuggestionRepository = registerCheckSuggestionRepository;
_registerCheckItemManager = registerCheckItemManager;
_cacheService = cacheService;
_guidGenerator = guidGenerator;
_configuration = configuration;
_currentUser = currentUser;
_userItemTypeRepository = userItemTypeRepository;
_asbitemRepository = asbitemRepository;
_registerCheckAsbitemRepository = registerCheckAsbitemRepository;
_lisRequestRepository = lisRequestRepository;
_diagnosisFunctionAppService = diagnosisFunctionAppService;
_referenceRangeManager = referenceRangeManager;
_itemRepository = itemRepository;
_itemManager = itemManager;
_unitRepository = unitRepository;
_units = _unitRepository.GetListAsync().Result;
_unitManager = unitManager;
_registerCheckAppService = registerCheckAppService;
_registerCheckPictureRepository = registerCheckPictureRepository;
}
[HttpPost("api/app/ImportPacsResult/ImportResult")]
public async Task ImportResultAsync(CreateImportPacsResultDto input)
{
//设置结果
var list = (from patientRegister in await _patientRegisterRepository.GetQueryableAsync()
join registerCheck in await _registerCheckRepository.GetQueryableAsync()
on patientRegister.Id equals registerCheck.PatientRegisterId
join registerCheckItem in await _registerCheckItemRepository.GetQueryableAsync()
on registerCheck.Id equals registerCheckItem.RegisterCheckId
join item in await _itemRepository.GetQueryableAsync()
on registerCheckItem.ItemId equals item.Id
where registerCheck.CheckRequestNo == input.CheckRequestNo
select new
{
patientRegister,
registerCheck,
registerCheckItem,
item,
}).ToList();
if (!list.Any())
{
return;
}
var firstEntity = list.First();
if (string.IsNullOrWhiteSpace(input.Result))
{
return;
}
if (string.IsNullOrWhiteSpace(input.CheckDoctorName))
{
throw new UserFriendlyException("检查医生不能为空");
}
if (string.IsNullOrWhiteSpace(input.PatientName))
{
throw new UserFriendlyException("姓名不能为空");
}
if (input.PatientName != firstEntity.patientRegister.PatientName)
{
throw new UserFriendlyException($"Pacs姓名{input.PatientName}和体检系统姓名{firstEntity.patientRegister.PatientName}不一致");
}
var updateCheckResultDto = new UpdateCheckResultDto()
{
RegisterCheckId = firstEntity.registerCheck.Id,
CheckDoctorId = input.CheckDoctorName,
CheckDate = input.CheckDate,
ExecOrganizationUnitId = input.ExecOrganizationUnitId,
RegisterCheckItems = list
.Select(o => new UpdateRegisterCheckItemDetail()
{
ItemId = o.registerCheckItem.ItemId,
Result = input.Result,
}).ToList()
};
//生成小结
updateCheckResultDto.Summarys.Add(new UpdateRegisterCheckSummaryDetail()
{
Summary = input.Summary,
SummaryFlag = '0'
});
//保存明细结果和小结
await _registerCheckAppService.UpdateCheckResult(updateCheckResultDto);
//保存图片
string absolutePath = _configuration.GetValue<string>("VirtualPath:RealPath");
//删除以前的图片
var registerCheckPictures = await _registerCheckPictureRepository.GetListAsync(o => o.RegisterCheckId == firstEntity.registerCheck.Id);
await _registerCheckPictureRepository.DeleteManyAsync(registerCheckPictures);
//插入新图片
string pictureUrl;
foreach (var file in input.Files)
{
string fileName;
if (string.IsNullOrWhiteSpace(file.FileName))
{
fileName = Guid.NewGuid().ToString();
}
else
{
fileName = Path.GetFileNameWithoutExtension(file.FileName);
}
//0-图片,1-PDF
if (file.FileFormat == "0")
{
pictureUrl = ImageHelper.Base64StrToImageInAbsolutePath(absolutePath, fileName, file.FileBase64, firstEntity.patientRegister.Id.ToString(),
firstEntity.registerCheck.Id.ToString());
}
else if (file.FileFormat == "1")
{
byte[] pdfBytes = Convert.FromBase64String(file.FileBase64);
var tempFilePath = DirectoryHelper.GetAppDirectory() + "\\temp-files";
if (!Directory.Exists(tempFilePath))
{
Directory.CreateDirectory(tempFilePath);
}
string tempPdf = tempFilePath + "\\temp.pdf";
using (System.IO.FileStream stream = new System.IO.FileStream(tempPdf, System.IO.FileMode.Create))
{
//通过流的方式写入
using(System.IO.BinaryWriter writer = new System.IO.BinaryWriter(stream) )
{
writer.Write(pdfBytes, 0, pdfBytes.Length);
writer.Close();
}
}
PDFHelper.ConvertPdfToImage(tempPdf, tempFilePath ,"tempImage");
pictureUrl = ImageHelper.SavePacsFile(absolutePath, tempFilePath + "\\tempImage_0.jpg", firstEntity.patientRegister.Id.ToString(),
firstEntity.registerCheck.Id.ToString(), fileName);
}
else
{
throw new UserFriendlyException("不支持的文件类型");
}
if (string.IsNullOrEmpty(pictureUrl))
{
throw new UserFriendlyException("pictureUrl是空值");
}
var registerCheckPicture = new RegisterCheckPicture
{
DisplayOrder = input.Files.IndexOf(file) + 1,
IsPrint = file.IsPrint,
PictureFilename = pictureUrl,
RegisterCheckId = firstEntity.registerCheck.Id,
};
await _registerCheckPictureRepository.InsertAsync(registerCheckPicture);
}
}
}
}

61
src/Shentun.Peis.Domain/ImageHelper.cs

@ -2,6 +2,7 @@
using NPOI.HPSF;
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Drawing;
using System.Drawing.Imaging;
using System.IO;
@ -273,7 +274,7 @@ namespace Shentun.Peis
}
/// <summary>
@ -478,5 +479,63 @@ namespace Shentun.Peis
result = "data:image/jpeg;base64," + result;
return result;
}
public static string SavePacsFile(string absolutePath, string sourceFileFullName, string PatientRegisterId, string RegisterCheckId, string imageName)
{
var ret = "";
string savePath = "";
string hostPath = "";
if (string.IsNullOrWhiteSpace(sourceFileFullName))
{
throw new UserFriendlyException("文件名不能为空");
}
if (!File.Exists(sourceFileFullName))
{
throw new UserFriendlyException("文件名不存在");
}
var ImageSuffix = Path.GetExtension(sourceFileFullName);
if (ImageSuffix == null)
{
throw new UserFriendlyException("图片数据有误");
}
string fileFilt = ".gif|.jpg|.jpeg|.png";
if (fileFilt.IndexOf(ImageSuffix.ToLower(), StringComparison.Ordinal) <= -1)
{
throw new UserFriendlyException("请上传jpg、png、gif格式的图片");
}
savePath = absolutePath + "\\" + PatientRegisterId + "\\" + RegisterCheckId + "\\" + imageName + ImageSuffix;
hostPath = "/CheckPictureImg/" + PatientRegisterId + "/" + RegisterCheckId + "/" + imageName + ImageSuffix;
if (!Directory.Exists(absolutePath + "\\" + PatientRegisterId))
{
Directory.CreateDirectory(absolutePath + "\\" + PatientRegisterId);
}
if (!Directory.Exists(absolutePath + "\\" + PatientRegisterId + "\\" + RegisterCheckId))
{
Directory.CreateDirectory(absolutePath + "\\" + PatientRegisterId + "\\" + RegisterCheckId);
}
File.Copy(sourceFileFullName, savePath, true);//true允许覆盖
ret = hostPath;
return ret;
}
}
}

42
src/Shentun.Utilities/FileHelper.cs

@ -1,6 +1,7 @@
using System;
using System.Collections.Generic;
using System.IO;
using System.Net.Http;
using System.Text;
namespace Shentun.Utilities
@ -9,16 +10,43 @@ namespace Shentun.Utilities
{
public static string ToBase64(string filename)
{
Stream stream;
Stream stream;
string fileBase64;
using (stream = new FileStream(filename, FileMode.Open, FileAccess.Read))
if (filename.StartsWith("http"))
{
byte[] byteData = new byte[stream.Length];
stream.Read(byteData, 0, byteData.Length);
fileBase64 = Convert.ToBase64String(byteData);
stream.Close();
using (var httpClientHandler = new HttpClientHandler())
{
using (var httpClient = new HttpClient(httpClientHandler))
{
var response = httpClient.GetAsync(filename).Result;
if (response.IsSuccessStatusCode)
{
var contentStream = response.Content.ReadAsStreamAsync().Result;
using var memoryStream = new MemoryStream();
contentStream.CopyTo(memoryStream);
var fileBytes = memoryStream.ToArray();
return Convert.ToBase64String(fileBytes);
}
else
{
throw new Exception("转换base64时,返回错误:" + response.StatusCode);
}
}
}
}
return fileBase64;
else
{
using (stream = new FileStream(filename, FileMode.Open, FileAccess.Read))
{
byte[] byteData = new byte[stream.Length];
stream.Read(byteData, 0, byteData.Length);
fileBase64 = Convert.ToBase64String(byteData);
stream.Close();
}
return fileBase64;
}
}
}
}

40
src/Shentun.Utilities/PDFHelper.cs

@ -0,0 +1,40 @@
using Spire.Pdf;
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Drawing.Imaging;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Shentun.Utilities
{
public class PDFHelper
{
public static void ConvertPdfToImage(string? pdfFullPath, string? imageFilePath, string imageFileName)
{
if (string.IsNullOrWhiteSpace(pdfFullPath))
throw new ArgumentNullException(pdfFullPath);
if (string.IsNullOrWhiteSpace(imageFilePath))
throw new ArgumentNullException(imageFilePath);
if (!File.Exists(pdfFullPath))
throw new FileNotFoundException(pdfFullPath);
var doc = new PdfDocument();
doc.LoadFromFile(pdfFullPath);
var pageCount = doc.Pages.Count;
for (int i = 0; i < pageCount; i++)
{
string jpgFullName = string.Empty;
jpgFullName = imageFilePath + "\\" + imageFileName + $"_{i}" + ".jpg";
using var stream = File.Open(jpgFullName, FileMode.Create);
using Image bmp = doc.SaveAsImage(i);
bmp.Save(stream, ImageFormat.Jpeg);
}
}
}
}

3
src/Shentun.Utilities/Shentun.Utilities.csproj

@ -6,6 +6,7 @@
</PropertyGroup>
<ItemGroup>
<PackageReference Include="FreeSpire.PDF" Version="8.6.0" />
<PackageReference Include="log4net" Version="2.0.15" />
<PackageReference Include="Microsoft.Extensions.Configuration.FileExtensions" Version="6.0.0" />
<PackageReference Include="Microsoft.Extensions.Configuration.Json" Version="6.0.0" />
@ -17,7 +18,7 @@
<PackageReference Include="NPOI" Version="2.5.6" />
<PackageReference Include="OnceMi.AspNetCore.IdGenerator" Version="1.0.6" />
<PackageReference Include="PinYinConverterCore" Version="1.0.2" />
<PackageReference Include="System.Text.Encoding.CodePages" Version="4.5.1" />
<PackageReference Include="System.Text.Encoding.CodePages" Version="6.0.0" />
<PackageReference Include="ZKWeb.System.Drawing" Version="4.0.1" />
</ItemGroup>

83
test/Shentun.Peis.Application.Tests/ImportPacsResultAppServiceTest.cs

@ -0,0 +1,83 @@
using Shentun.Peis.ImportLisResults;
using Shentun.Peis.ImportPacsResults;
using Shentun.Peis.Models;
using Shentun.Utilities;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Volo.Abp.Domain.Repositories;
using Volo.Abp.Uow;
using Xunit;
using Xunit.Abstractions;
namespace Shentun.Peis
{
public class ImportPacsResultAppServiceTest : PeisApplicationTestBase
{
private readonly IRepository<ImportPacsResult> _repository;
private readonly ImportPacsResultAppService _appService;
private readonly ITestOutputHelper _output;
private readonly IUnitOfWorkManager _unitOfWorkManager;
public ImportPacsResultAppServiceTest(ITestOutputHelper testOutputHelper)
{
_output = testOutputHelper;
_unitOfWorkManager = GetRequiredService<IUnitOfWorkManager>();
_repository = GetRequiredService<IRepository<ImportPacsResult>>();
_appService = GetRequiredService<ImportPacsResultAppService>();
}
[Fact]
public async Task ImportResultAsync()
{
using (var unitOfWork = _unitOfWorkManager.Begin(isTransactional: true))
{
var entity = new CreateImportPacsResultDto()
{
CheckRequestNo = "2405112185",
PatientName = "测试pacs",
Result = "Pacs检查所见",
Summary = "Pacs结论",
Suggestion = "Pacs建议",
CheckDate = DateTime.Now,
CheckDoctorName = "张医生",
Files = new List<CreateImportPacsResultPictureDto>()
{
new CreateImportPacsResultPictureDto()
{
IsPrint = 'Y',
FileName = Guid.NewGuid().ToString(),
FileFormat = "0",
FileBase64 = Shentun.Utilities.FileHelper.ToBase64("E:\\Whitedolphins\\prog20220722\\pic\\login.png")
},
new CreateImportPacsResultPictureDto()
{
IsPrint = 'Y',
FileFormat = "0",
FileName = Guid.NewGuid().ToString(),
FileBase64 = Shentun.Utilities.FileHelper.ToBase64("E:\\Whitedolphins\\prog20220722\\pic\\首页背景图.jpg")
},
new CreateImportPacsResultPictureDto()
{
IsPrint = 'Y',
FileFormat = "1",
FileName = Guid.NewGuid().ToString(),
FileBase64 = Shentun.Utilities.FileHelper.ToBase64("E:\\Whitedolphins\\doc\\体检中心排队系统.pdf")
},
}
};
await _appService.ImportResultAsync(entity);
await unitOfWork.CompleteAsync();
}
}
[Fact]
public void ConvertPdfToImage()
{
PDFHelper.ConvertPdfToImage("E:\\Whitedolphins\\doc\\体检中心排队系统.pdf", "E:\\Whitedolphins\\prog20220722\\pic", "测试");
}
}
}
Loading…
Cancel
Save