You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

262 lines
12 KiB

2 years ago
2 years ago
  1. using Microsoft.AspNetCore.Authorization;
  2. using Microsoft.AspNetCore.Mvc;
  3. using Microsoft.Extensions.Configuration;
  4. using NPOI.SS.Formula.Functions;
  5. using NUglify.Helpers;
  6. using Shentun.Peis.DiagnosisFunctions;
  7. using Shentun.Peis.ImportLisResults;
  8. using Shentun.Peis.Items;
  9. using Shentun.Peis.Models;
  10. using Shentun.Peis.ReferenceRanges;
  11. using Shentun.Peis.RegisterCheckItems;
  12. using Shentun.Peis.RegisterChecks;
  13. using Shentun.Peis.Units;
  14. using Shentun.Utilities;
  15. using System;
  16. using System.Collections.Generic;
  17. using System.IO;
  18. using System.Linq;
  19. using System.Text;
  20. using System.Threading.Tasks;
  21. using Volo.Abp;
  22. using Volo.Abp.Application.Services;
  23. using Volo.Abp.Domain.Repositories;
  24. using Volo.Abp.Guids;
  25. using Volo.Abp.Identity;
  26. using Volo.Abp.Users;
  27. namespace Shentun.Peis.ImportPacsResults
  28. {
  29. [ApiExplorerSettings(GroupName = "Work")]
  30. [Authorize]
  31. public class ImportPacsResultAppService : ApplicationService
  32. {
  33. private readonly IRepository<RegisterCheckItem> _registerCheckItemRepository;
  34. private readonly IRepository<RegisterCheckPicture> _registerCheckPictureRepository;
  35. private readonly IRepository<PatientRegister, Guid> _patientRegisterRepository;
  36. private readonly IRepository<ReferenceRange, Guid> _referenceRangeRepository;
  37. private readonly IRepository<RegisterCheck, Guid> _registerCheckRepository;
  38. private readonly IRepository<RegisterCheckAsbitem, Guid> _registerCheckAsbitemRepository;
  39. private readonly IRepository<LisRequest, Guid> _lisRequestRepository;
  40. private readonly IRepository<Item, Guid> _itemRepository;
  41. private readonly IRepository<RegisterCheckSummary, Guid> _registerCheckSummaryRepository;
  42. private readonly IRepository<RegisterCheckSuggestion, Guid> _registerCheckSuggestionRepository;
  43. private readonly IRepository<IdentityUser, Guid> _userRepository;
  44. private readonly IRepository<Unit, Guid> _unitRepository;
  45. private readonly RegisterCheckManager _registerCheckManager;
  46. private readonly RegisterCheckItemManager _registerCheckItemManager;
  47. private readonly CacheService _cacheService;
  48. private readonly IGuidGenerator _guidGenerator;
  49. private readonly IConfiguration _configuration;
  50. private readonly ICurrentUser _currentUser;
  51. private readonly IRepository<UserItemType> _userItemTypeRepository;
  52. private readonly IRepository<Asbitem, Guid> _asbitemRepository;
  53. private readonly DiagnosisFunctionAppService _diagnosisFunctionAppService;
  54. private readonly ReferenceRangeManager _referenceRangeManager;
  55. private readonly ItemManager _itemManager;
  56. private readonly UnitManager _unitManager;
  57. private readonly RegisterCheckAppService _registerCheckAppService;
  58. private List<Unit> _units;
  59. private List<ReferenceRange> _referenceRanges;
  60. private static bool _isRunning = false;
  61. private static readonly object lockObject = new object();
  62. public ImportPacsResultAppService(IRepository<RegisterCheck, Guid> registerCheckRepository,
  63. IRepository<RegisterCheckItem> registerCheckItemRepository,
  64. IRepository<PatientRegister, Guid> patientRegisterRepository,
  65. IRepository<ReferenceRange, Guid> referenceRangeRepository,
  66. IRepository<RegisterCheckSummary, Guid> registerCheckSummaryRepository,
  67. IRepository<RegisterCheckSuggestion, Guid> registerCheckSuggestionRepository,
  68. IRepository<IdentityUser, Guid> userRepository,
  69. RegisterCheckManager registerCheckManager,
  70. RegisterCheckItemManager registerCheckItemManager,
  71. CacheService cacheService,
  72. IGuidGenerator guidGenerator,
  73. IConfiguration configuration,
  74. ICurrentUser currentUser,
  75. IRepository<UserItemType> userItemTypeRepository,
  76. IRepository<Asbitem, Guid> asbitemRepository,
  77. IRepository<RegisterCheckAsbitem, Guid> registerCheckAsbitemRepository,
  78. IRepository<LisRequest, Guid> lisRequestRepository,
  79. IRepository<Unit, Guid> unitRepository,
  80. DiagnosisFunctionAppService diagnosisFunctionAppService,
  81. ReferenceRangeManager referenceRangeManager,
  82. IRepository<Item, Guid> itemRepository,
  83. ItemManager itemManager,
  84. UnitManager unitManager,
  85. RegisterCheckAppService registerCheckAppService,
  86. IRepository<RegisterCheckPicture> registerCheckPictureRepository)
  87. {
  88. _registerCheckRepository = registerCheckRepository;
  89. _userRepository = userRepository;
  90. _registerCheckManager = registerCheckManager;
  91. _patientRegisterRepository = patientRegisterRepository;
  92. _referenceRangeRepository = referenceRangeRepository;
  93. _registerCheckItemRepository = registerCheckItemRepository;
  94. _registerCheckSummaryRepository = registerCheckSummaryRepository;
  95. _registerCheckSuggestionRepository = registerCheckSuggestionRepository;
  96. _registerCheckItemManager = registerCheckItemManager;
  97. _cacheService = cacheService;
  98. _guidGenerator = guidGenerator;
  99. _configuration = configuration;
  100. _currentUser = currentUser;
  101. _userItemTypeRepository = userItemTypeRepository;
  102. _asbitemRepository = asbitemRepository;
  103. _registerCheckAsbitemRepository = registerCheckAsbitemRepository;
  104. _lisRequestRepository = lisRequestRepository;
  105. _diagnosisFunctionAppService = diagnosisFunctionAppService;
  106. _referenceRangeManager = referenceRangeManager;
  107. _itemRepository = itemRepository;
  108. _itemManager = itemManager;
  109. _unitRepository = unitRepository;
  110. _units = _unitRepository.GetListAsync().Result;
  111. _unitManager = unitManager;
  112. _registerCheckAppService = registerCheckAppService;
  113. _registerCheckPictureRepository = registerCheckPictureRepository;
  114. }
  115. [HttpPost("api/app/ImportPacsResult/ImportResult")]
  116. public async Task ImportResultAsync(CreateImportPacsResultDto input)
  117. {
  118. //设置结果
  119. var list = (from patientRegister in await _patientRegisterRepository.GetQueryableAsync()
  120. join registerCheck in await _registerCheckRepository.GetQueryableAsync()
  121. on patientRegister.Id equals registerCheck.PatientRegisterId
  122. join registerCheckItem in await _registerCheckItemRepository.GetQueryableAsync()
  123. on registerCheck.Id equals registerCheckItem.RegisterCheckId
  124. join item in await _itemRepository.GetQueryableAsync()
  125. on registerCheckItem.ItemId equals item.Id
  126. where registerCheck.CheckRequestNo == input.CheckRequestNo
  127. select new
  128. {
  129. patientRegister,
  130. registerCheck,
  131. registerCheckItem,
  132. item,
  133. }).ToList();
  134. if (!list.Any())
  135. {
  136. return;
  137. }
  138. var firstEntity = list.First();
  139. if (string.IsNullOrWhiteSpace(input.Result))
  140. {
  141. return;
  142. }
  143. if (string.IsNullOrWhiteSpace(input.CheckDoctorName))
  144. {
  145. throw new UserFriendlyException("检查医生不能为空");
  146. }
  147. if (string.IsNullOrWhiteSpace(input.PatientName))
  148. {
  149. throw new UserFriendlyException("姓名不能为空");
  150. }
  151. if (input.PatientName != firstEntity.patientRegister.PatientName)
  152. {
  153. throw new UserFriendlyException($"Pacs姓名{input.PatientName}和体检系统姓名{firstEntity.patientRegister.PatientName}不一致");
  154. }
  155. var updateCheckResultDto = new UpdateCheckResultDto()
  156. {
  157. RegisterCheckId = firstEntity.registerCheck.Id,
  158. CheckDoctorId = input.CheckDoctorName,
  159. CheckDate = input.CheckDate,
  160. ExecOrganizationUnitId = input.ExecOrganizationUnitId,
  161. RegisterCheckItems = list
  162. .Select(o => new UpdateRegisterCheckItemDetail()
  163. {
  164. ItemId = o.registerCheckItem.ItemId,
  165. Result = input.Result,
  166. }).ToList()
  167. };
  168. //生成小结
  169. updateCheckResultDto.Summarys.Add(new UpdateRegisterCheckSummaryDetail()
  170. {
  171. Summary = input.Summary,
  172. SummaryFlag = '0'
  173. });
  174. //保存明细结果和小结
  175. await _registerCheckAppService.UpdateCheckResult(updateCheckResultDto);
  176. //保存图片
  177. string absolutePath = _configuration.GetValue<string>("VirtualPath:RealPath");
  178. //删除以前的图片
  179. var registerCheckPictures = await _registerCheckPictureRepository.GetListAsync(o => o.RegisterCheckId == firstEntity.registerCheck.Id);
  180. await _registerCheckPictureRepository.DeleteManyAsync(registerCheckPictures);
  181. //插入新图片
  182. string pictureUrl;
  183. foreach (var file in input.Files)
  184. {
  185. string fileName;
  186. if (string.IsNullOrWhiteSpace(file.FileName))
  187. {
  188. fileName = Guid.NewGuid().ToString();
  189. }
  190. else
  191. {
  192. fileName = Path.GetFileNameWithoutExtension(file.FileName);
  193. }
  194. //0-图片,1-PDF
  195. if (file.FileFormat == "0")
  196. {
  197. pictureUrl = ImageHelper.Base64StrToImageInAbsolutePath(absolutePath, fileName, file.FileBase64, firstEntity.patientRegister.Id.ToString(),
  198. firstEntity.registerCheck.Id.ToString());
  199. }
  200. else if (file.FileFormat == "1")
  201. {
  202. byte[] pdfBytes = Convert.FromBase64String(file.FileBase64);
  203. var tempFilePath = DirectoryHelper.GetAppDirectory() + "\\temp-files";
  204. if (!Directory.Exists(tempFilePath))
  205. {
  206. Directory.CreateDirectory(tempFilePath);
  207. }
  208. string tempPdf = tempFilePath + "\\temp.pdf";
  209. using (System.IO.FileStream stream = new System.IO.FileStream(tempPdf, System.IO.FileMode.Create))
  210. {
  211. //通过流的方式写入
  212. using(System.IO.BinaryWriter writer = new System.IO.BinaryWriter(stream) )
  213. {
  214. writer.Write(pdfBytes, 0, pdfBytes.Length);
  215. writer.Close();
  216. }
  217. }
  218. PDFHelper.ConvertPdfToImage(tempPdf, tempFilePath ,"tempImage");
  219. pictureUrl = ImageHelper.SavePacsFile(absolutePath, tempFilePath + "\\tempImage_0.jpg", firstEntity.patientRegister.Id.ToString(),
  220. firstEntity.registerCheck.Id.ToString(), fileName);
  221. }
  222. else
  223. {
  224. throw new UserFriendlyException("不支持的文件类型");
  225. }
  226. if (string.IsNullOrEmpty(pictureUrl))
  227. {
  228. throw new UserFriendlyException("pictureUrl是空值");
  229. }
  230. var registerCheckPicture = new RegisterCheckPicture
  231. {
  232. DisplayOrder = input.Files.IndexOf(file) + 1,
  233. IsPrint = file.IsPrint,
  234. PictureFilename = pictureUrl,
  235. RegisterCheckId = firstEntity.registerCheck.Id,
  236. };
  237. await _registerCheckPictureRepository.InsertAsync(registerCheckPicture);
  238. }
  239. }
  240. }
  241. }