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.

828 lines
41 KiB

2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
6 months ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
3 months ago
2 years ago
2 years ago
2 years ago
1 year ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
3 months ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
1 year ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
6 months ago
1 month ago
6 months ago
3 months ago
6 months ago
1 month ago
6 months ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
1 year ago
2 years ago
2 years ago
1 year ago
3 months ago
1 year ago
3 months ago
1 year ago
3 months ago
1 year ago
2 years ago
2 years ago
2 years ago
2 years ago
  1. using Microsoft.AspNetCore.Authorization;
  2. using Microsoft.AspNetCore.Mvc;
  3. using Microsoft.EntityFrameworkCore;
  4. using Microsoft.Extensions.Configuration;
  5. using NPOI.SS.Formula.Functions;
  6. using NPOI.Util;
  7. using Shentun.Peis.ColumnReferenceCodes;
  8. using Shentun.Peis.DiagnosisFunctions;
  9. using Shentun.Peis.Enums;
  10. using Shentun.Peis.Items;
  11. using Shentun.Peis.LisRequests;
  12. using Shentun.Peis.Models;
  13. using Shentun.Peis.PatientRegisters;
  14. using Shentun.Peis.PlugIns.ImportLisResults;
  15. using Shentun.Peis.PlugIns.LisRequests;
  16. using Shentun.Peis.ReferenceRanges;
  17. using Shentun.Peis.RegisterCheckItems;
  18. using Shentun.Peis.RegisterChecks;
  19. using Shentun.Peis.SysParmValues;
  20. using Shentun.Peis.Units;
  21. using SqlSugar;
  22. using System;
  23. using System.Collections.Generic;
  24. using System.IO;
  25. using System.Linq;
  26. using System.Text;
  27. using System.Text.Json;
  28. using System.Threading.Tasks;
  29. using Volo.Abp;
  30. using Volo.Abp.Application.Services;
  31. using Volo.Abp.Domain.Repositories;
  32. using Volo.Abp.Guids;
  33. using Volo.Abp.Identity;
  34. using Volo.Abp.Users;
  35. using static Microsoft.EntityFrameworkCore.DbLoggerCategory;
  36. namespace Shentun.Peis.ImportLisResults
  37. {
  38. [ApiExplorerSettings(GroupName = "Work")]
  39. [Authorize]
  40. public class ImportLisResultAppService : ApplicationService, IImportLisResultAppService
  41. {
  42. private readonly IRepository<ThirdInterface> _thirdInterfaceRepository;
  43. private readonly IRepository<RegisterCheckItem> _registerCheckItemRepository;
  44. private readonly IRepository<PatientRegister, Guid> _patientRegisterRepository;
  45. private readonly IRepository<ReferenceRange, Guid> _referenceRangeRepository;
  46. private readonly IRepository<RegisterCheck, Guid> _registerCheckRepository;
  47. private readonly IRepository<RegisterCheckAsbitem, Guid> _registerCheckAsbitemRepository;
  48. private readonly IRepository<LisRequest, Guid> _lisRequestRepository;
  49. private readonly IRepository<Item, Guid> _itemRepository;
  50. private readonly IRepository<RegisterCheckSummary, Guid> _registerCheckSummaryRepository;
  51. private readonly IRepository<RegisterCheckSuggestion, Guid> _registerCheckSuggestionRepository;
  52. private readonly IRepository<IdentityUser, Guid> _userRepository;
  53. private readonly IRepository<Unit, Guid> _unitRepository;
  54. private readonly RegisterCheckManager _registerCheckManager;
  55. private readonly RegisterCheckItemManager _registerCheckItemManager;
  56. private readonly CacheService _cacheService;
  57. private readonly IGuidGenerator _guidGenerator;
  58. private readonly IConfiguration _configuration;
  59. private readonly ICurrentUser _currentUser;
  60. private readonly IRepository<UserItemType> _userItemTypeRepository;
  61. private readonly IRepository<Asbitem, Guid> _asbitemRepository;
  62. private readonly DiagnosisFunctionAppService _diagnosisFunctionAppService;
  63. private readonly ReferenceRangeManager _referenceRangeManager;
  64. private readonly ItemManager _itemManager;
  65. private readonly UnitManager _unitManager;
  66. private readonly RegisterCheckAppService _registerCheckAppService;
  67. private List<Unit> _units;
  68. private List<ReferenceRange> _referenceRanges;
  69. private static bool _isRunning = false;
  70. private static readonly object lockObject = new object();
  71. private readonly ColumnReferenceCodeManager _columnReferenceCodeManager;
  72. private readonly SysParmValueManager _sysParmValueManager;
  73. public ImportLisResultAppService(IRepository<RegisterCheck, Guid> registerCheckRepository,
  74. IRepository<RegisterCheckItem> registerCheckItemRepository,
  75. IRepository<PatientRegister, Guid> patientRegisterRepository,
  76. IRepository<ReferenceRange, Guid> referenceRangeRepository,
  77. IRepository<RegisterCheckSummary, Guid> registerCheckSummaryRepository,
  78. IRepository<RegisterCheckSuggestion, Guid> registerCheckSuggestionRepository,
  79. IRepository<IdentityUser, Guid> userRepository,
  80. RegisterCheckManager registerCheckManager,
  81. RegisterCheckItemManager registerCheckItemManager,
  82. CacheService cacheService,
  83. IGuidGenerator guidGenerator,
  84. IConfiguration configuration,
  85. ICurrentUser currentUser,
  86. IRepository<UserItemType> userItemTypeRepository,
  87. IRepository<Asbitem, Guid> asbitemRepository,
  88. IRepository<RegisterCheckAsbitem, Guid> registerCheckAsbitemRepository,
  89. IRepository<LisRequest, Guid> lisRequestRepository,
  90. IRepository<Unit, Guid> unitRepository,
  91. DiagnosisFunctionAppService diagnosisFunctionAppService,
  92. ReferenceRangeManager referenceRangeManager,
  93. IRepository<Item, Guid> itemRepository,
  94. ItemManager itemManager,
  95. UnitManager unitManager,
  96. RegisterCheckAppService registerCheckAppService,
  97. IRepository<ThirdInterface> thirdInterfaceRepository,
  98. ColumnReferenceCodeManager columnReferenceCodeManager,
  99. SysParmValueManager sysParmValueManager)
  100. {
  101. _registerCheckRepository = registerCheckRepository;
  102. _userRepository = userRepository;
  103. _registerCheckManager = registerCheckManager;
  104. _patientRegisterRepository = patientRegisterRepository;
  105. _referenceRangeRepository = referenceRangeRepository;
  106. _registerCheckItemRepository = registerCheckItemRepository;
  107. _registerCheckSummaryRepository = registerCheckSummaryRepository;
  108. _registerCheckSuggestionRepository = registerCheckSuggestionRepository;
  109. _registerCheckItemManager = registerCheckItemManager;
  110. _cacheService = cacheService;
  111. _guidGenerator = guidGenerator;
  112. _configuration = configuration;
  113. _currentUser = currentUser;
  114. _userItemTypeRepository = userItemTypeRepository;
  115. _asbitemRepository = asbitemRepository;
  116. _registerCheckAsbitemRepository = registerCheckAsbitemRepository;
  117. _lisRequestRepository = lisRequestRepository;
  118. _diagnosisFunctionAppService = diagnosisFunctionAppService;
  119. _referenceRangeManager = referenceRangeManager;
  120. _itemRepository = itemRepository;
  121. _itemManager = itemManager;
  122. _unitRepository = unitRepository;
  123. _units = _unitRepository.GetListAsync().Result;
  124. _unitManager = unitManager;
  125. _registerCheckAppService = registerCheckAppService;
  126. _thirdInterfaceRepository = thirdInterfaceRepository;
  127. _columnReferenceCodeManager = columnReferenceCodeManager;
  128. _sysParmValueManager = sysParmValueManager;
  129. }
  130. /// <summary>
  131. /// 从第三方接口导入结果
  132. /// </summary>
  133. /// <param name="input"></param>
  134. /// <returns></returns>
  135. /// <exception cref="UserFriendlyException"></exception>
  136. [HttpPost("api/app/ImportLisResult/ImportResult")]
  137. public async Task ImportResultAsync(List<CreateImportLisResultDto> input)
  138. {
  139. //设置结果
  140. var list = (from patientRegister in await _patientRegisterRepository.GetQueryableAsync()
  141. join registerCheck in await _registerCheckRepository.GetQueryableAsync()
  142. on patientRegister.Id equals registerCheck.PatientRegisterId
  143. join registerCheckAsbitem in await _registerCheckAsbitemRepository.GetQueryableAsync()
  144. on registerCheck.Id equals registerCheckAsbitem.RegisterCheckId
  145. join registerCheckItem in await _registerCheckItemRepository.GetQueryableAsync()
  146. on registerCheck.Id equals registerCheckItem.RegisterCheckId
  147. join item in await _itemRepository.GetQueryableAsync()
  148. on registerCheckItem.ItemId equals item.Id
  149. join lisRequest in await _lisRequestRepository.GetQueryableAsync()
  150. on registerCheckAsbitem.LisRequestId equals lisRequest.Id
  151. where input.Select(o => o.LisRequestNo).ToList().Contains(lisRequest.LisRequestNo)
  152. select new
  153. {
  154. patientRegister,
  155. registerCheck,
  156. registerCheckAsbitem,
  157. registerCheckItem,
  158. item,
  159. lisRequest,
  160. }).ToList();
  161. var lisRequestNos = input.Select(o => o.LisRequestNo).Distinct().ToList();
  162. var registerChecks = new List<RegisterCheck>();
  163. _referenceRanges = _referenceRangeRepository.GetListAsync().Result;
  164. input = input.Where(o => !string.IsNullOrWhiteSpace(o.Result)
  165. && !string.IsNullOrWhiteSpace(o.LisRequestNo)
  166. && o.ItemId != Guid.Empty).ToList();
  167. foreach (var inputItem in input)
  168. {
  169. if (string.IsNullOrWhiteSpace(inputItem.CheckDoctorName))
  170. {
  171. throw new UserFriendlyException("检查医生不能为空");
  172. }
  173. var lisRequestItems = list.Where(o => o.lisRequest.LisRequestNo == inputItem.LisRequestNo
  174. && o.registerCheckItem.ItemId == inputItem.ItemId).ToList();
  175. foreach (var lisRequestItem in lisRequestItems)
  176. {
  177. if (lisRequestItem == null)
  178. {
  179. continue;
  180. }
  181. lisRequestItem.registerCheckItem.Result = inputItem.Result;
  182. //var itemSource = new RegisterCheckItem()
  183. //{
  184. // Result = inputItem.Result,
  185. // ReferenceRangeValue = inputItem.ReferenceRangeValue,
  186. // Unit = inputItem.Unit,
  187. // CriticalRangeValue = inputItem.CriticalRangeValue
  188. //};
  189. //项目如果是性激素参考范围,不更新
  190. if (lisRequestItem.item.ReferenceRangeTypeFlag != ItemReferenceRangeTypeFlag.SexHormone)
  191. {
  192. //修改参考范围
  193. await UpdateItemReferenceRangeValueAsync(inputItem.ItemId, lisRequestItem.patientRegister.SexId,
  194. lisRequestItem.patientRegister.Age, inputItem.ReferenceRangeValue, inputItem.CriticalRangeValue);
  195. }
  196. //修改单位
  197. await UpdateItemUnitAsync(inputItem.ItemId, inputItem.Unit);
  198. //await _registerCheckItemManager.UpdateRegisterCheckItemAsync(itemSource, lisRequestItem.registerCheckItem);
  199. //await _registerCheckItemRepository.UpdateAsync(lisRequestItem.registerCheckItem,true);
  200. if (!registerChecks.Where(o => o.Id == lisRequestItem.registerCheck.Id).ToList().Any())
  201. {
  202. lisRequestItem.registerCheck.CheckDoctorId = inputItem.CheckDoctorName;
  203. lisRequestItem.registerCheck.CheckDate = inputItem.CheckDate;
  204. lisRequestItem.registerCheck.ExecOrganizationUnitId = inputItem.ExecOrganizationUnitId;
  205. lisRequestItem.registerCheck.AuditorName = inputItem.AuditorName;
  206. lisRequestItem.registerCheck.LisSampleNo = inputItem.LisSampleNo;
  207. lisRequestItem.registerCheck.AuditorTime = inputItem.AuditorTime;
  208. lisRequestItem.registerCheck.SubmissionTime = inputItem.SubmissionTime;
  209. registerChecks.Add(lisRequestItem.registerCheck);
  210. }
  211. }
  212. }
  213. List<RegisterCheckAsbitem> updateRegisterCheckAsbitem = new List<RegisterCheckAsbitem>();
  214. //更新参考范围和单位
  215. foreach (var registerCheck in registerChecks)
  216. {
  217. var lisRequestItems = list.Where(o => o.registerCheck.Id == registerCheck.Id).ToList();
  218. foreach (var lisRequestItem in lisRequestItems)
  219. {
  220. var referenceRange = _referenceRangeManager.GetReferenceRangeBySexAgeTemp(_referenceRanges,
  221. lisRequestItem.item, lisRequestItem.patientRegister.SexId, lisRequestItem.patientRegister.Age, lisRequestItem.patientRegister.SexHormoneTermId);
  222. if (referenceRange != null)
  223. {
  224. lisRequestItem.registerCheckItem.ReferenceRangeValue = referenceRange.ReferenceRangeValue;
  225. lisRequestItem.registerCheckItem.CriticalRangeValue = referenceRange.CriticalRangeValue;
  226. }
  227. else
  228. {
  229. lisRequestItem.registerCheckItem.ReferenceRangeValue = "";
  230. lisRequestItem.registerCheckItem.CriticalRangeValue = "";
  231. }
  232. var unit = _units.Where(o => o.Id == lisRequestItem.item.UnitId).FirstOrDefault();
  233. if (unit != null)
  234. {
  235. lisRequestItem.registerCheckItem.Unit = unit.DisplayName;
  236. }
  237. else
  238. {
  239. lisRequestItem.registerCheckItem.Unit = "";
  240. }
  241. await _registerCheckItemRepository.UpdateAsync(lisRequestItem.registerCheckItem);
  242. }
  243. }
  244. await CurrentUnitOfWork.SaveChangesAsync();
  245. //保存结果
  246. foreach (var registerCheck in registerChecks)
  247. {
  248. var updateCheckResultDto = new UpdateCheckResultDto()
  249. {
  250. RegisterCheckId = registerCheck.Id,
  251. CheckDoctorId = registerCheck.CheckDoctorId,
  252. CheckDate = registerCheck.CheckDate,
  253. ExecOrganizationUnitId = registerCheck.ExecOrganizationUnitId,
  254. RegisterCheckItems = list.Where(o => o.registerCheck.Id == registerCheck.Id)
  255. .Select(o => new UpdateRegisterCheckItemDetail()
  256. {
  257. ItemId = o.registerCheckItem.ItemId,
  258. Result = o.registerCheckItem.Result,
  259. }).ToList(),
  260. LisSampleNo = registerCheck.LisSampleNo,
  261. AuditorName = registerCheck.AuditorName,
  262. AuditorTime = registerCheck.AuditorTime,
  263. SubmissionTime = registerCheck.SubmissionTime
  264. };
  265. var getDiagnosisResultRequestDto = new GetDiagnosisResultRequestDto()
  266. {
  267. RegisterCheckId = registerCheck.Id,
  268. Items = list.Where(o => o.registerCheck.Id == registerCheck.Id)
  269. .Select(o => new GetDiagnosisResultRequest_Item()
  270. {
  271. ItemId = o.registerCheckItem.ItemId,
  272. Result = o.registerCheckItem.Result,
  273. }).ToList()
  274. };
  275. //生成小结
  276. var summarry = await _diagnosisFunctionAppService.GetDoctorCheckDiagnosisResultAsync(getDiagnosisResultRequestDto);
  277. for (var i = 0; i < summarry.DiagnosisResultDetails.Count; i++)
  278. {
  279. updateCheckResultDto.Summarys.Add(new UpdateRegisterCheckSummaryDetail()
  280. {
  281. Summary = summarry.DiagnosisResultDetails[i].DiagnosisResult,
  282. SummaryFlag = '0'
  283. });
  284. }
  285. await _registerCheckAppService.UpdateCheckResult(updateCheckResultDto);
  286. }
  287. }
  288. /// <summary>
  289. /// 导入某个人的结果
  290. /// </summary>
  291. /// <param name="input"></param>
  292. /// <returns></returns>
  293. [HttpPost("api/app/ImportLisResult/ImportResultByPatientRegisterId")]
  294. public async Task ImportResultByPatientRegisterIdAsync(PatientRegisterIdInputDto input)
  295. {
  296. var patientRegister = await _patientRegisterRepository.GetAsync(input.PatientRegisterId);
  297. var thirdInterfaces = await _thirdInterfaceRepository.GetListAsync(o =>
  298. o.ThirdInterfaceType == ThirdInterfaceTypeFlag.ImportLisResult
  299. && o.MedicalCenterId == patientRegister.MedicalCenterId
  300. && o.IsActive == 'Y');
  301. foreach (var thirdInterface in thirdInterfaces)
  302. {
  303. var parmValue = thirdInterface.ParmValue;
  304. var configurationBuilder = new ConfigurationBuilder()
  305. .AddJsonStream(new MemoryStream(System.Text.Encoding.UTF8.GetBytes(parmValue)));
  306. var config = configurationBuilder.Build();
  307. var assemblyName = config.GetSection("Interface").GetSection("AssemblyName").Value;
  308. var className = config.GetSection("Interface").GetSection("ClassName").Value;
  309. object[] objects = new object[] { input.PatientRegisterId };
  310. var pluginsOut = await Utilities.ReflectionHelper.InvokeAsync<ImportLisResultPlugInsOut>(assemblyName,
  311. className, [thirdInterface.Id], "ImportResultByPatientRegisterIdAsync", objects);
  312. }
  313. }
  314. /// <summary>
  315. /// 导入迪安结果 外检
  316. /// </summary>
  317. /// <param name="input"></param>
  318. /// <returns></returns>
  319. [HttpPost("api/app/ImportLisResult/ImportDianResultByPatientRegisterId")]
  320. [AllowAnonymous]
  321. public async Task ImportDianResultByPatientRegisterIdAsync(PatientRegisterIdInputDto input)
  322. {
  323. var patientRegister = await _patientRegisterRepository.GetAsync(input.PatientRegisterId);
  324. var thirdInterfaces = await _thirdInterfaceRepository.GetListAsync(o =>
  325. o.ThirdInterfaceType == ThirdInterfaceTypeFlag.OutSend
  326. && o.MedicalCenterId == patientRegister.MedicalCenterId
  327. && o.IsActive == 'Y');
  328. foreach (var thirdInterface in thirdInterfaces)
  329. {
  330. var parmValue = thirdInterface.ParmValue;
  331. var configurationBuilder = new ConfigurationBuilder()
  332. .AddJsonStream(new MemoryStream(System.Text.Encoding.UTF8.GetBytes(parmValue)));
  333. var config = configurationBuilder.Build();
  334. var assemblyName = config.GetSection("Interface").GetSection("AssemblyName").Value;
  335. var className = config.GetSection("Interface").GetSection("ClassName").Value;
  336. object[] objects = new object[] { input.PatientRegisterId };
  337. var pluginsOut = await Utilities.ReflectionHelper.InvokeAsync<ImportLisResultPlugInsOut>(assemblyName,
  338. className, [thirdInterface.Id], "ImportOueSendResultByPatientRegisterIdAsync", objects);
  339. }
  340. }
  341. /// <summary>
  342. /// 根据lis传过来的参考范围更新体检系统的值
  343. /// </summary>
  344. /// <param name="itemId"></param>
  345. /// <param name="sexId"></param>
  346. /// <param name="age"></param>
  347. /// <param name="referenceRangeValue"></param>
  348. /// <param name="criticalRangeValue"></param>
  349. /// <returns></returns>
  350. private async Task UpdateItemReferenceRangeValueAsync(Guid itemId, char sexId, int? age, string referenceRangeValue, string criticalRangeValue)
  351. {
  352. var referenceRanges = _referenceRanges.Where(o => o.ItemId == itemId).ToList();
  353. if (age == null) age = 30;
  354. if (string.IsNullOrWhiteSpace(referenceRangeValue))
  355. {
  356. return;
  357. }
  358. var item = await _itemRepository.GetAsync(itemId);
  359. ReferenceRange referenceRange = null;
  360. if (_referenceRangeManager.IsNumberReferenceRange(referenceRangeValue))
  361. {
  362. //数字型
  363. item.ReferenceRangeTypeFlag = ItemReferenceRangeTypeFlag.Number;
  364. await _itemRepository.UpdateAsync(item);
  365. referenceRange = referenceRanges.Where(o => o.ForSexId == sexId
  366. && age >= o.AgeLowerLimit && age <= o.AgeUpperLimit
  367. && o.ReferenceRangeTypeFlag == ItemReferenceRangeTypeFlag.Number).FirstOrDefault();
  368. if (referenceRange != null)
  369. {
  370. referenceRange.ReferenceRangeTypeFlag = ItemReferenceRangeTypeFlag.Number;
  371. referenceRange.ReferenceRangeValue = referenceRangeValue;
  372. if (!string.IsNullOrWhiteSpace(criticalRangeValue))
  373. {
  374. referenceRange.CriticalRangeValue = criticalRangeValue;
  375. referenceRange.FollowUpRangeValue = criticalRangeValue;
  376. }
  377. await _referenceRangeRepository.UpdateAsync(referenceRange);
  378. return;
  379. }
  380. referenceRange = referenceRanges.Where(o => o.ForSexId == ForSexFlag.All
  381. && age >= o.AgeLowerLimit && age <= o.AgeUpperLimit
  382. && o.ReferenceRangeTypeFlag == ItemReferenceRangeTypeFlag.Number).FirstOrDefault();
  383. if (referenceRange != null)
  384. {
  385. referenceRange.ReferenceRangeTypeFlag = ItemReferenceRangeTypeFlag.Number;
  386. referenceRange.ReferenceRangeValue = referenceRangeValue;
  387. if (!string.IsNullOrWhiteSpace(criticalRangeValue))
  388. {
  389. referenceRange.CriticalRangeValue = criticalRangeValue;
  390. referenceRange.FollowUpRangeValue = criticalRangeValue;
  391. }
  392. await _referenceRangeRepository.UpdateAsync(referenceRange);
  393. return;
  394. }
  395. referenceRange = new ReferenceRange()
  396. {
  397. ItemId = itemId,
  398. AgeLowerLimit = 0,
  399. AgeUpperLimit = 200,
  400. ReferenceRangeTypeFlag = ItemReferenceRangeTypeFlag.Number,
  401. ReferenceRangeValue = referenceRangeValue,
  402. CriticalRangeValue = criticalRangeValue,
  403. ForSexId = ForSexFlag.All
  404. };
  405. referenceRange = _referenceRangeManager.Create(referenceRange);
  406. await _referenceRangeRepository.InsertAsync(referenceRange);
  407. referenceRanges.Add(referenceRange);
  408. return;
  409. }
  410. item.ReferenceRangeTypeFlag = ItemReferenceRangeTypeFlag.Character;
  411. await _itemRepository.UpdateAsync(item);
  412. referenceRange = referenceRanges.Where(o => o.ReferenceRangeTypeFlag == ItemReferenceRangeTypeFlag.Character).FirstOrDefault();
  413. if (referenceRange != null)
  414. {
  415. referenceRange.ReferenceRangeTypeFlag = ItemReferenceRangeTypeFlag.Character;
  416. referenceRange.ReferenceRangeValue = referenceRangeValue;
  417. await _referenceRangeRepository.UpdateAsync(referenceRange);
  418. return;
  419. }
  420. referenceRange = new ReferenceRange()
  421. {
  422. ItemId = itemId,
  423. AgeLowerLimit = 0,
  424. AgeUpperLimit = 200,
  425. ReferenceRangeTypeFlag = ItemReferenceRangeTypeFlag.Character,
  426. ReferenceRangeValue = referenceRangeValue,
  427. ForSexId = ForSexFlag.All
  428. };
  429. referenceRange = _referenceRangeManager.Create(referenceRange);
  430. await _referenceRangeRepository.InsertAsync(referenceRange);
  431. referenceRanges.Add(referenceRange);
  432. return;
  433. }
  434. private async Task UpdateItemUnitAsync(Guid itemId, string unitName)
  435. {
  436. if (string.IsNullOrWhiteSpace(unitName))
  437. {
  438. return;
  439. }
  440. unitName = unitName.Trim();
  441. var item = await _itemRepository.GetAsync(itemId);
  442. var unit = _units.Where(o => o.DisplayName.Trim().ToLower() == unitName.ToLower()).FirstOrDefault();
  443. if (unit != null)
  444. {
  445. if (item.UnitId == unit.Id)
  446. {
  447. return;
  448. }
  449. item.UnitId = unit.Id;
  450. await _itemRepository.UpdateAsync(item);
  451. return;
  452. }
  453. unit = new Unit()
  454. {
  455. DisplayName = unitName,
  456. };
  457. unit = await _unitManager.CreateAsync(unit);
  458. await _unitRepository.InsertAsync(unit);
  459. _units.Add(unit);
  460. }
  461. #region 蓝豚lis结果导入
  462. /// <summary>
  463. /// 根据lis检验单号导入结果
  464. /// </summary>
  465. /// <returns></returns>
  466. [HttpPost("api/app/ImportLisResult/ImportResultByLisRequestNo")]
  467. public async Task ImportResultByLisRequestNoAsync(List<ImportResultByLisRequestNoInputDto> input)
  468. {
  469. if (!input.Any())
  470. throw new UserFriendlyException("请求参数无效");
  471. var thirdInterface = await _thirdInterfaceRepository.FirstOrDefaultAsync(o => o.ThirdInterfaceType == ThirdInterfaceTypeFlag.ImportLisResult);
  472. if (thirdInterface == null)
  473. throw new UserFriendlyException($"未配置检验导入的参数");
  474. var parmValue = thirdInterface.ParmValue;
  475. var configurationBuilder = new ConfigurationBuilder()
  476. .AddJsonStream(new MemoryStream(System.Text.Encoding.UTF8.GetBytes(parmValue)));
  477. var config = configurationBuilder.Build();
  478. Guid execOrganizationUnitId = Guid.Parse(config.GetSection("Interface").GetSection("ExecOrganizationUnitId").Value);
  479. Guid columnReferenId = Guid.Parse(config.GetSection("Interface").GetSection("ColumnReferenId").Value);
  480. Guid userColumnReferenId = Guid.Parse(config.GetSection("Interface").GetSection("UserColumnReferenId").Value);
  481. List<CreateImportLisResultDto> inputDtoList = new List<CreateImportLisResultDto>();
  482. foreach (var item in input)
  483. {
  484. var codeValues = await _columnReferenceCodeManager.GetColumnReferenCodeValueAsync(columnReferenId, item.ItemId);
  485. if (!codeValues.Any())
  486. {
  487. throw new UserFriendlyException($"项目编号:{item.ItemId}没有对照");
  488. }
  489. //转换检查医生ID
  490. var checkDoctorUserId = (await _columnReferenceCodeManager.GetColumnReferenCodeValueAsync(userColumnReferenId, item.CheckDoctorName)).FirstOrDefault();
  491. if (!string.IsNullOrWhiteSpace(checkDoctorUserId))
  492. {
  493. item.CheckDoctorName = checkDoctorUserId;
  494. }
  495. //转换审核医生ID
  496. var lisAuditorDoctorUserId = (await _columnReferenceCodeManager.GetColumnReferenCodeValueAsync(userColumnReferenId, item.AuditorName)).FirstOrDefault();
  497. if (!string.IsNullOrWhiteSpace(lisAuditorDoctorUserId))
  498. {
  499. item.AuditorName = lisAuditorDoctorUserId;
  500. }
  501. foreach (var codeValue in codeValues)
  502. {
  503. Guid itemId = Guid.Parse(codeValue);
  504. var inputDto = new CreateImportLisResultDto
  505. {
  506. CheckDate = item.CheckDate,
  507. CheckDoctorName = item.CheckDoctorName,
  508. CriticalRangeValue = item.CriticalRangeValue,
  509. CriticalValue = item.CriticalValue,
  510. ExecOrganizationUnitId = execOrganizationUnitId,
  511. ItemId = itemId,
  512. ItemName = item.ItemName,
  513. LisRequestNo = item.LisRequestNo,
  514. ReferenceRangeValue = item.ReferenceRangeValue,
  515. ReportPrompt = "",
  516. ResultStatusId = null,
  517. Result = item.Result,
  518. Unit = item.Unit,
  519. AuditorName = item.AuditorName,
  520. LisSampleNo = item.LisSampleNo,
  521. AuditorTime = item.AuditorTime,
  522. SubmissionTime = item.SubmissionTime
  523. };
  524. inputDtoList.Add(inputDto);
  525. }
  526. }
  527. var lisRequestNoPrintMode = await _sysParmValueManager.GetSysParmValueAsync(Guid.Empty, "lis_request_no_print_mode");
  528. if (string.IsNullOrWhiteSpace(lisRequestNoPrintMode))
  529. lisRequestNoPrintMode = "0";
  530. if (lisRequestNoPrintMode == "0")
  531. await ImportResultAsync(inputDtoList);
  532. else
  533. await ImportResultByPatientRegisterNoAsync(inputDtoList);
  534. }
  535. /// <summary>
  536. /// 从第三方接口导入结果
  537. /// </summary>
  538. /// <param name="input"></param>
  539. /// <returns></returns>
  540. /// <exception cref="UserFriendlyException"></exception>
  541. private async Task ImportResultByPatientRegisterNoAsync(List<CreateImportLisResultDto> input)
  542. {
  543. //设置结果
  544. var list = (from patientRegister in await _patientRegisterRepository.GetQueryableAsync()
  545. join registerCheck in await _registerCheckRepository.GetQueryableAsync()
  546. on patientRegister.Id equals registerCheck.PatientRegisterId
  547. join registerCheckAsbitem in await _registerCheckAsbitemRepository.GetQueryableAsync()
  548. on registerCheck.Id equals registerCheckAsbitem.RegisterCheckId
  549. join registerCheckItem in await _registerCheckItemRepository.GetQueryableAsync()
  550. on registerCheck.Id equals registerCheckItem.RegisterCheckId
  551. join item in await _itemRepository.GetQueryableAsync()
  552. on registerCheckItem.ItemId equals item.Id
  553. join lisRequest in await _lisRequestRepository.GetQueryableAsync()
  554. on registerCheckAsbitem.LisRequestId equals lisRequest.Id
  555. where input.Select(o => o.LisRequestNo).FirstOrDefault() == patientRegister.PatientRegisterNo
  556. select new
  557. {
  558. patientRegister,
  559. registerCheck,
  560. registerCheckAsbitem,
  561. registerCheckItem,
  562. item,
  563. lisRequest,
  564. }).ToList();
  565. var registerChecks = new List<RegisterCheck>();
  566. _referenceRanges = _referenceRangeRepository.GetListAsync().Result;
  567. input = input.Where(o => !string.IsNullOrWhiteSpace(o.Result)
  568. && !string.IsNullOrWhiteSpace(o.LisRequestNo)
  569. && o.ItemId != Guid.Empty).ToList();
  570. foreach (var inputItem in input)
  571. {
  572. if (string.IsNullOrWhiteSpace(inputItem.CheckDoctorName))
  573. {
  574. throw new UserFriendlyException("检查医生不能为空");
  575. }
  576. var lisRequestItems = list.Where(o => o.patientRegister.PatientRegisterNo == inputItem.LisRequestNo
  577. && o.registerCheckItem.ItemId == inputItem.ItemId).ToList();
  578. foreach (var lisRequestItem in lisRequestItems)
  579. {
  580. if (lisRequestItem == null)
  581. {
  582. continue;
  583. }
  584. lisRequestItem.registerCheckItem.Result = inputItem.Result;
  585. //var itemSource = new RegisterCheckItem()
  586. //{
  587. // Result = inputItem.Result,
  588. // ReferenceRangeValue = inputItem.ReferenceRangeValue,
  589. // Unit = inputItem.Unit,
  590. // CriticalRangeValue = inputItem.CriticalRangeValue
  591. //};
  592. if (lisRequestItem.item.ReferenceRangeTypeFlag != ItemReferenceRangeTypeFlag.SexHormone)
  593. {
  594. //修改参考范围
  595. await UpdateItemReferenceRangeValueAsync(inputItem.ItemId, lisRequestItem.patientRegister.SexId,
  596. lisRequestItem.patientRegister.Age, inputItem.ReferenceRangeValue, inputItem.CriticalRangeValue);
  597. }
  598. //修改单位
  599. await UpdateItemUnitAsync(inputItem.ItemId, inputItem.Unit);
  600. //await _registerCheckItemManager.UpdateRegisterCheckItemAsync(itemSource, lisRequestItem.registerCheckItem);
  601. //await _registerCheckItemRepository.UpdateAsync(lisRequestItem.registerCheckItem,true);
  602. if (!registerChecks.Where(o => o.Id == lisRequestItem.registerCheck.Id).ToList().Any())
  603. {
  604. lisRequestItem.registerCheck.CheckDoctorId = inputItem.CheckDoctorName;
  605. lisRequestItem.registerCheck.CheckDate = inputItem.CheckDate;
  606. lisRequestItem.registerCheck.ExecOrganizationUnitId = inputItem.ExecOrganizationUnitId;
  607. lisRequestItem.registerCheck.AuditorName = inputItem.AuditorName;
  608. lisRequestItem.registerCheck.LisSampleNo = inputItem.LisSampleNo;
  609. lisRequestItem.registerCheck.SubmissionTime = inputItem.SubmissionTime;
  610. lisRequestItem.registerCheck.AuditorTime = inputItem.AuditorTime;
  611. registerChecks.Add(lisRequestItem.registerCheck);
  612. }
  613. }
  614. }
  615. List<RegisterCheckAsbitem> updateRegisterCheckAsbitem = new List<RegisterCheckAsbitem>();
  616. //更新参考范围和单位
  617. foreach (var registerCheck in registerChecks)
  618. {
  619. var lisRequestItems = list.Where(o => o.registerCheck.Id == registerCheck.Id).ToList();
  620. foreach (var lisRequestItem in lisRequestItems)
  621. {
  622. var referenceRange = _referenceRangeManager.GetReferenceRangeBySexAgeTemp(_referenceRanges,
  623. lisRequestItem.item, lisRequestItem.patientRegister.SexId, lisRequestItem.patientRegister.Age, lisRequestItem.patientRegister.SexHormoneTermId);
  624. if (referenceRange != null)
  625. {
  626. lisRequestItem.registerCheckItem.ReferenceRangeValue = referenceRange.ReferenceRangeValue;
  627. lisRequestItem.registerCheckItem.CriticalRangeValue = referenceRange.CriticalRangeValue;
  628. }
  629. else
  630. {
  631. lisRequestItem.registerCheckItem.ReferenceRangeValue = "";
  632. lisRequestItem.registerCheckItem.CriticalRangeValue = "";
  633. }
  634. var unit = _units.Where(o => o.Id == lisRequestItem.item.UnitId).FirstOrDefault();
  635. if (unit != null)
  636. {
  637. lisRequestItem.registerCheckItem.Unit = unit.DisplayName;
  638. }
  639. else
  640. {
  641. lisRequestItem.registerCheckItem.Unit = "";
  642. }
  643. await _registerCheckItemRepository.UpdateAsync(lisRequestItem.registerCheckItem);
  644. }
  645. }
  646. await CurrentUnitOfWork.SaveChangesAsync();
  647. //保存结果
  648. foreach (var registerCheck in registerChecks)
  649. {
  650. var updateCheckResultDto = new UpdateCheckResultDto()
  651. {
  652. RegisterCheckId = registerCheck.Id,
  653. CheckDoctorId = registerCheck.CheckDoctorId,
  654. CheckDate = registerCheck.CheckDate,
  655. ExecOrganizationUnitId = registerCheck.ExecOrganizationUnitId,
  656. RegisterCheckItems = list.Where(o => o.registerCheck.Id == registerCheck.Id)
  657. .Select(o => new UpdateRegisterCheckItemDetail()
  658. {
  659. ItemId = o.registerCheckItem.ItemId,
  660. Result = o.registerCheckItem.Result,
  661. }).ToList(),
  662. LisSampleNo = registerCheck.LisSampleNo,
  663. AuditorName = registerCheck.AuditorName,
  664. AuditorTime = registerCheck.AuditorTime,
  665. SubmissionTime = registerCheck.SubmissionTime
  666. };
  667. var getDiagnosisResultRequestDto = new GetDiagnosisResultRequestDto()
  668. {
  669. RegisterCheckId = registerCheck.Id,
  670. Items = list.Where(o => o.registerCheck.Id == registerCheck.Id)
  671. .Select(o => new GetDiagnosisResultRequest_Item()
  672. {
  673. ItemId = o.registerCheckItem.ItemId,
  674. Result = o.registerCheckItem.Result,
  675. }).ToList()
  676. };
  677. //生成小结
  678. var summarry = await _diagnosisFunctionAppService.GetDoctorCheckDiagnosisResultAsync(getDiagnosisResultRequestDto);
  679. for (var i = 0; i < summarry.DiagnosisResultDetails.Count; i++)
  680. {
  681. updateCheckResultDto.Summarys.Add(new UpdateRegisterCheckSummaryDetail()
  682. {
  683. Summary = summarry.DiagnosisResultDetails[i].DiagnosisResult,
  684. SummaryFlag = '0'
  685. });
  686. }
  687. await _registerCheckAppService.UpdateCheckResult(updateCheckResultDto);
  688. }
  689. }
  690. #endregion
  691. #region 批量导入lis结果 需要单独对照
  692. /// <summary>
  693. /// 按excel批量导入检验结果
  694. /// </summary>
  695. /// <param name="input"></param>
  696. /// <returns></returns>
  697. /// <exception cref="UserFriendlyException"></exception>
  698. [HttpPost("api/app/ImportLisResult/ImportResultExcelByLisRequestNo")]
  699. public async Task ImportResultExcelByLisRequestNoAsync(ImportResultExcelByLisRequestNoInputDto input)
  700. {
  701. List<CreateImportLisResultDto> inputDtoList = new List<CreateImportLisResultDto>();
  702. //对照主表Id
  703. var columnReferenceId = await _sysParmValueManager.GetSysParmValueAsync(Guid.Empty, "import_file_lis_result");
  704. if (string.IsNullOrWhiteSpace(columnReferenceId))
  705. throw new UserFriendlyException("未找到对照主表Id,请到系统参数配置");
  706. foreach (var item in input.Details)
  707. {
  708. var codeValues = await _columnReferenceCodeManager.GetColumnReferenCodeValueAsync(Guid.Parse(columnReferenceId), item.ItemName);
  709. if (!codeValues.Any())
  710. {
  711. throw new UserFriendlyException($"项目名称:{item.ItemName}没有对照");
  712. }
  713. foreach (var codeValue in codeValues)
  714. {
  715. Guid itemId = Guid.Parse(codeValue);
  716. var inputDto = new CreateImportLisResultDto
  717. {
  718. CheckDate = string.IsNullOrWhiteSpace(item.CheckDate) ? null : Convert.ToDateTime(item.CheckDate),
  719. CheckDoctorName = item.CheckDoctorName,
  720. CriticalRangeValue = "",
  721. CriticalValue = "",
  722. ExecOrganizationUnitId = Guid.Empty,
  723. ItemId = itemId,
  724. ItemName = item.ItemName,
  725. LisRequestNo = input.BarCode,
  726. ReferenceRangeValue = "",
  727. ReportPrompt = "",
  728. ResultStatusId = null,
  729. Result = item.ItemResult,
  730. Unit = "",
  731. AuditorName = "",
  732. LisSampleNo = input.SampleNo
  733. };
  734. inputDtoList.Add(inputDto);
  735. }
  736. }
  737. if (input.BarcodeMode == '0')
  738. {
  739. if (await _patientRegisterRepository.CountAsync(f => f.PatientRegisterNo == input.BarCode) == 0)
  740. throw new UserFriendlyException($"条码号{input.BarCode}不正确");
  741. await ImportResultByPatientRegisterNoAsync(inputDtoList);
  742. }
  743. else if (input.BarcodeMode == '1')
  744. {
  745. var isBarCode = await (from registerCheckAsbitem in await _registerCheckAsbitemRepository.GetQueryableAsync()
  746. join lisRequest in await _lisRequestRepository.GetQueryableAsync() on registerCheckAsbitem.LisRequestId equals lisRequest.Id
  747. where lisRequest.LisRequestNo == input.BarCode
  748. select lisRequest.LisRequestNo).CountAsync();
  749. if (isBarCode == 0)
  750. throw new UserFriendlyException($"条码号{input.BarCode}不正确");
  751. await ImportResultAsync(inputDtoList);
  752. }
  753. }
  754. #endregion
  755. }
  756. }