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.

827 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
4 weeks 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. public async Task ImportDianResultByPatientRegisterIdAsync(PatientRegisterIdInputDto input)
  321. {
  322. var patientRegister = await _patientRegisterRepository.GetAsync(input.PatientRegisterId);
  323. var thirdInterfaces = await _thirdInterfaceRepository.GetListAsync(o =>
  324. o.ThirdInterfaceType == ThirdInterfaceTypeFlag.OutSend
  325. && o.MedicalCenterId == patientRegister.MedicalCenterId
  326. && o.IsActive == 'Y');
  327. foreach (var thirdInterface in thirdInterfaces)
  328. {
  329. var parmValue = thirdInterface.ParmValue;
  330. var configurationBuilder = new ConfigurationBuilder()
  331. .AddJsonStream(new MemoryStream(System.Text.Encoding.UTF8.GetBytes(parmValue)));
  332. var config = configurationBuilder.Build();
  333. var assemblyName = config.GetSection("Interface").GetSection("AssemblyName").Value;
  334. var className = config.GetSection("Interface").GetSection("ClassName").Value;
  335. object[] objects = new object[] { input.PatientRegisterId };
  336. var pluginsOut = await Utilities.ReflectionHelper.InvokeAsync<ImportLisResultPlugInsOut>(assemblyName,
  337. className, [thirdInterface.Id], "ImportOueSendResultByPatientRegisterIdAsync", objects);
  338. }
  339. }
  340. /// <summary>
  341. /// 根据lis传过来的参考范围更新体检系统的值
  342. /// </summary>
  343. /// <param name="itemId"></param>
  344. /// <param name="sexId"></param>
  345. /// <param name="age"></param>
  346. /// <param name="referenceRangeValue"></param>
  347. /// <param name="criticalRangeValue"></param>
  348. /// <returns></returns>
  349. private async Task UpdateItemReferenceRangeValueAsync(Guid itemId, char sexId, int? age, string referenceRangeValue, string criticalRangeValue)
  350. {
  351. var referenceRanges = _referenceRanges.Where(o => o.ItemId == itemId).ToList();
  352. if (age == null) age = 30;
  353. if (string.IsNullOrWhiteSpace(referenceRangeValue))
  354. {
  355. return;
  356. }
  357. var item = await _itemRepository.GetAsync(itemId);
  358. ReferenceRange referenceRange = null;
  359. if (_referenceRangeManager.IsNumberReferenceRange(referenceRangeValue))
  360. {
  361. //数字型
  362. item.ReferenceRangeTypeFlag = ItemReferenceRangeTypeFlag.Number;
  363. await _itemRepository.UpdateAsync(item);
  364. referenceRange = referenceRanges.Where(o => o.ForSexId == sexId
  365. && age >= o.AgeLowerLimit && age <= o.AgeUpperLimit
  366. && o.ReferenceRangeTypeFlag == ItemReferenceRangeTypeFlag.Number).FirstOrDefault();
  367. if (referenceRange != null)
  368. {
  369. referenceRange.ReferenceRangeTypeFlag = ItemReferenceRangeTypeFlag.Number;
  370. referenceRange.ReferenceRangeValue = referenceRangeValue;
  371. if (!string.IsNullOrWhiteSpace(criticalRangeValue))
  372. {
  373. referenceRange.CriticalRangeValue = criticalRangeValue;
  374. referenceRange.FollowUpRangeValue = criticalRangeValue;
  375. }
  376. await _referenceRangeRepository.UpdateAsync(referenceRange);
  377. return;
  378. }
  379. referenceRange = referenceRanges.Where(o => o.ForSexId == ForSexFlag.All
  380. && age >= o.AgeLowerLimit && age <= o.AgeUpperLimit
  381. && o.ReferenceRangeTypeFlag == ItemReferenceRangeTypeFlag.Number).FirstOrDefault();
  382. if (referenceRange != null)
  383. {
  384. referenceRange.ReferenceRangeTypeFlag = ItemReferenceRangeTypeFlag.Number;
  385. referenceRange.ReferenceRangeValue = referenceRangeValue;
  386. if (!string.IsNullOrWhiteSpace(criticalRangeValue))
  387. {
  388. referenceRange.CriticalRangeValue = criticalRangeValue;
  389. referenceRange.FollowUpRangeValue = criticalRangeValue;
  390. }
  391. await _referenceRangeRepository.UpdateAsync(referenceRange);
  392. return;
  393. }
  394. referenceRange = new ReferenceRange()
  395. {
  396. ItemId = itemId,
  397. AgeLowerLimit = 0,
  398. AgeUpperLimit = 200,
  399. ReferenceRangeTypeFlag = ItemReferenceRangeTypeFlag.Number,
  400. ReferenceRangeValue = referenceRangeValue,
  401. CriticalRangeValue = criticalRangeValue,
  402. ForSexId = ForSexFlag.All
  403. };
  404. referenceRange = _referenceRangeManager.Create(referenceRange);
  405. await _referenceRangeRepository.InsertAsync(referenceRange);
  406. referenceRanges.Add(referenceRange);
  407. return;
  408. }
  409. item.ReferenceRangeTypeFlag = ItemReferenceRangeTypeFlag.Character;
  410. await _itemRepository.UpdateAsync(item);
  411. referenceRange = referenceRanges.Where(o => o.ReferenceRangeTypeFlag == ItemReferenceRangeTypeFlag.Character).FirstOrDefault();
  412. if (referenceRange != null)
  413. {
  414. referenceRange.ReferenceRangeTypeFlag = ItemReferenceRangeTypeFlag.Character;
  415. referenceRange.ReferenceRangeValue = referenceRangeValue;
  416. await _referenceRangeRepository.UpdateAsync(referenceRange);
  417. return;
  418. }
  419. referenceRange = new ReferenceRange()
  420. {
  421. ItemId = itemId,
  422. AgeLowerLimit = 0,
  423. AgeUpperLimit = 200,
  424. ReferenceRangeTypeFlag = ItemReferenceRangeTypeFlag.Character,
  425. ReferenceRangeValue = referenceRangeValue,
  426. ForSexId = ForSexFlag.All
  427. };
  428. referenceRange = _referenceRangeManager.Create(referenceRange);
  429. await _referenceRangeRepository.InsertAsync(referenceRange);
  430. referenceRanges.Add(referenceRange);
  431. return;
  432. }
  433. private async Task UpdateItemUnitAsync(Guid itemId, string unitName)
  434. {
  435. if (string.IsNullOrWhiteSpace(unitName))
  436. {
  437. return;
  438. }
  439. unitName = unitName.Trim();
  440. var item = await _itemRepository.GetAsync(itemId);
  441. var unit = _units.Where(o => o.DisplayName.Trim().ToLower() == unitName.ToLower()).FirstOrDefault();
  442. if (unit != null)
  443. {
  444. if (item.UnitId == unit.Id)
  445. {
  446. return;
  447. }
  448. item.UnitId = unit.Id;
  449. await _itemRepository.UpdateAsync(item);
  450. return;
  451. }
  452. unit = new Unit()
  453. {
  454. DisplayName = unitName,
  455. };
  456. unit = await _unitManager.CreateAsync(unit);
  457. await _unitRepository.InsertAsync(unit);
  458. _units.Add(unit);
  459. }
  460. #region 蓝豚lis结果导入
  461. /// <summary>
  462. /// 根据lis检验单号导入结果
  463. /// </summary>
  464. /// <returns></returns>
  465. [HttpPost("api/app/ImportLisResult/ImportResultByLisRequestNo")]
  466. public async Task ImportResultByLisRequestNoAsync(List<ImportResultByLisRequestNoInputDto> input)
  467. {
  468. if (!input.Any())
  469. throw new UserFriendlyException("请求参数无效");
  470. var thirdInterface = await _thirdInterfaceRepository.FirstOrDefaultAsync(o => o.ThirdInterfaceType == ThirdInterfaceTypeFlag.ImportLisResult);
  471. if (thirdInterface == null)
  472. throw new UserFriendlyException($"未配置检验导入的参数");
  473. var parmValue = thirdInterface.ParmValue;
  474. var configurationBuilder = new ConfigurationBuilder()
  475. .AddJsonStream(new MemoryStream(System.Text.Encoding.UTF8.GetBytes(parmValue)));
  476. var config = configurationBuilder.Build();
  477. Guid execOrganizationUnitId = Guid.Parse(config.GetSection("Interface").GetSection("ExecOrganizationUnitId").Value);
  478. Guid columnReferenId = Guid.Parse(config.GetSection("Interface").GetSection("ColumnReferenId").Value);
  479. Guid userColumnReferenId = Guid.Parse(config.GetSection("Interface").GetSection("UserColumnReferenId").Value);
  480. List<CreateImportLisResultDto> inputDtoList = new List<CreateImportLisResultDto>();
  481. foreach (var item in input)
  482. {
  483. var codeValues = await _columnReferenceCodeManager.GetColumnReferenCodeValueAsync(columnReferenId, item.ItemId);
  484. if (!codeValues.Any())
  485. {
  486. throw new UserFriendlyException($"项目编号:{item.ItemId}没有对照");
  487. }
  488. //转换检查医生ID
  489. var checkDoctorUserId = (await _columnReferenceCodeManager.GetColumnReferenCodeValueAsync(userColumnReferenId, item.CheckDoctorName)).FirstOrDefault();
  490. if (!string.IsNullOrWhiteSpace(checkDoctorUserId))
  491. {
  492. item.CheckDoctorName = checkDoctorUserId;
  493. }
  494. //转换审核医生ID
  495. var lisAuditorDoctorUserId = (await _columnReferenceCodeManager.GetColumnReferenCodeValueAsync(userColumnReferenId, item.AuditorName)).FirstOrDefault();
  496. if (!string.IsNullOrWhiteSpace(lisAuditorDoctorUserId))
  497. {
  498. item.AuditorName = lisAuditorDoctorUserId;
  499. }
  500. foreach (var codeValue in codeValues)
  501. {
  502. Guid itemId = Guid.Parse(codeValue);
  503. var inputDto = new CreateImportLisResultDto
  504. {
  505. CheckDate = item.CheckDate,
  506. CheckDoctorName = item.CheckDoctorName,
  507. CriticalRangeValue = item.CriticalRangeValue,
  508. CriticalValue = item.CriticalValue,
  509. ExecOrganizationUnitId = execOrganizationUnitId,
  510. ItemId = itemId,
  511. ItemName = item.ItemName,
  512. LisRequestNo = item.LisRequestNo,
  513. ReferenceRangeValue = item.ReferenceRangeValue,
  514. ReportPrompt = "",
  515. ResultStatusId = null,
  516. Result = item.Result,
  517. Unit = item.Unit,
  518. AuditorName = item.AuditorName,
  519. LisSampleNo = item.LisSampleNo,
  520. AuditorTime = item.AuditorTime,
  521. SubmissionTime = item.SubmissionTime
  522. };
  523. inputDtoList.Add(inputDto);
  524. }
  525. }
  526. var lisRequestNoPrintMode = await _sysParmValueManager.GetSysParmValueAsync(Guid.Empty, "lis_request_no_print_mode");
  527. if (string.IsNullOrWhiteSpace(lisRequestNoPrintMode))
  528. lisRequestNoPrintMode = "0";
  529. if (lisRequestNoPrintMode == "0")
  530. await ImportResultAsync(inputDtoList);
  531. else
  532. await ImportResultByPatientRegisterNoAsync(inputDtoList);
  533. }
  534. /// <summary>
  535. /// 从第三方接口导入结果
  536. /// </summary>
  537. /// <param name="input"></param>
  538. /// <returns></returns>
  539. /// <exception cref="UserFriendlyException"></exception>
  540. private async Task ImportResultByPatientRegisterNoAsync(List<CreateImportLisResultDto> input)
  541. {
  542. //设置结果
  543. var list = (from patientRegister in await _patientRegisterRepository.GetQueryableAsync()
  544. join registerCheck in await _registerCheckRepository.GetQueryableAsync()
  545. on patientRegister.Id equals registerCheck.PatientRegisterId
  546. join registerCheckAsbitem in await _registerCheckAsbitemRepository.GetQueryableAsync()
  547. on registerCheck.Id equals registerCheckAsbitem.RegisterCheckId
  548. join registerCheckItem in await _registerCheckItemRepository.GetQueryableAsync()
  549. on registerCheck.Id equals registerCheckItem.RegisterCheckId
  550. join item in await _itemRepository.GetQueryableAsync()
  551. on registerCheckItem.ItemId equals item.Id
  552. join lisRequest in await _lisRequestRepository.GetQueryableAsync()
  553. on registerCheckAsbitem.LisRequestId equals lisRequest.Id
  554. where input.Select(o => o.LisRequestNo).FirstOrDefault() == patientRegister.PatientRegisterNo
  555. select new
  556. {
  557. patientRegister,
  558. registerCheck,
  559. registerCheckAsbitem,
  560. registerCheckItem,
  561. item,
  562. lisRequest,
  563. }).ToList();
  564. var registerChecks = new List<RegisterCheck>();
  565. _referenceRanges = _referenceRangeRepository.GetListAsync().Result;
  566. input = input.Where(o => !string.IsNullOrWhiteSpace(o.Result)
  567. && !string.IsNullOrWhiteSpace(o.LisRequestNo)
  568. && o.ItemId != Guid.Empty).ToList();
  569. foreach (var inputItem in input)
  570. {
  571. if (string.IsNullOrWhiteSpace(inputItem.CheckDoctorName))
  572. {
  573. throw new UserFriendlyException("检查医生不能为空");
  574. }
  575. var lisRequestItems = list.Where(o => o.patientRegister.PatientRegisterNo == inputItem.LisRequestNo
  576. && o.registerCheckItem.ItemId == inputItem.ItemId).ToList();
  577. foreach (var lisRequestItem in lisRequestItems)
  578. {
  579. if (lisRequestItem == null)
  580. {
  581. continue;
  582. }
  583. lisRequestItem.registerCheckItem.Result = inputItem.Result;
  584. //var itemSource = new RegisterCheckItem()
  585. //{
  586. // Result = inputItem.Result,
  587. // ReferenceRangeValue = inputItem.ReferenceRangeValue,
  588. // Unit = inputItem.Unit,
  589. // CriticalRangeValue = inputItem.CriticalRangeValue
  590. //};
  591. if (lisRequestItem.item.ReferenceRangeTypeFlag != ItemReferenceRangeTypeFlag.SexHormone)
  592. {
  593. //修改参考范围
  594. await UpdateItemReferenceRangeValueAsync(inputItem.ItemId, lisRequestItem.patientRegister.SexId,
  595. lisRequestItem.patientRegister.Age, inputItem.ReferenceRangeValue, inputItem.CriticalRangeValue);
  596. }
  597. //修改单位
  598. await UpdateItemUnitAsync(inputItem.ItemId, inputItem.Unit);
  599. //await _registerCheckItemManager.UpdateRegisterCheckItemAsync(itemSource, lisRequestItem.registerCheckItem);
  600. //await _registerCheckItemRepository.UpdateAsync(lisRequestItem.registerCheckItem,true);
  601. if (!registerChecks.Where(o => o.Id == lisRequestItem.registerCheck.Id).ToList().Any())
  602. {
  603. lisRequestItem.registerCheck.CheckDoctorId = inputItem.CheckDoctorName;
  604. lisRequestItem.registerCheck.CheckDate = inputItem.CheckDate;
  605. lisRequestItem.registerCheck.ExecOrganizationUnitId = inputItem.ExecOrganizationUnitId;
  606. lisRequestItem.registerCheck.AuditorName = inputItem.AuditorName;
  607. lisRequestItem.registerCheck.LisSampleNo = inputItem.LisSampleNo;
  608. lisRequestItem.registerCheck.SubmissionTime = inputItem.SubmissionTime;
  609. lisRequestItem.registerCheck.AuditorTime = inputItem.AuditorTime;
  610. registerChecks.Add(lisRequestItem.registerCheck);
  611. }
  612. }
  613. }
  614. List<RegisterCheckAsbitem> updateRegisterCheckAsbitem = new List<RegisterCheckAsbitem>();
  615. //更新参考范围和单位
  616. foreach (var registerCheck in registerChecks)
  617. {
  618. var lisRequestItems = list.Where(o => o.registerCheck.Id == registerCheck.Id).ToList();
  619. foreach (var lisRequestItem in lisRequestItems)
  620. {
  621. var referenceRange = _referenceRangeManager.GetReferenceRangeBySexAgeTemp(_referenceRanges,
  622. lisRequestItem.item, lisRequestItem.patientRegister.SexId, lisRequestItem.patientRegister.Age, lisRequestItem.patientRegister.SexHormoneTermId);
  623. if (referenceRange != null)
  624. {
  625. lisRequestItem.registerCheckItem.ReferenceRangeValue = referenceRange.ReferenceRangeValue;
  626. lisRequestItem.registerCheckItem.CriticalRangeValue = referenceRange.CriticalRangeValue;
  627. }
  628. else
  629. {
  630. lisRequestItem.registerCheckItem.ReferenceRangeValue = "";
  631. lisRequestItem.registerCheckItem.CriticalRangeValue = "";
  632. }
  633. var unit = _units.Where(o => o.Id == lisRequestItem.item.UnitId).FirstOrDefault();
  634. if (unit != null)
  635. {
  636. lisRequestItem.registerCheckItem.Unit = unit.DisplayName;
  637. }
  638. else
  639. {
  640. lisRequestItem.registerCheckItem.Unit = "";
  641. }
  642. await _registerCheckItemRepository.UpdateAsync(lisRequestItem.registerCheckItem);
  643. }
  644. }
  645. await CurrentUnitOfWork.SaveChangesAsync();
  646. //保存结果
  647. foreach (var registerCheck in registerChecks)
  648. {
  649. var updateCheckResultDto = new UpdateCheckResultDto()
  650. {
  651. RegisterCheckId = registerCheck.Id,
  652. CheckDoctorId = registerCheck.CheckDoctorId,
  653. CheckDate = registerCheck.CheckDate,
  654. ExecOrganizationUnitId = registerCheck.ExecOrganizationUnitId,
  655. RegisterCheckItems = list.Where(o => o.registerCheck.Id == registerCheck.Id)
  656. .Select(o => new UpdateRegisterCheckItemDetail()
  657. {
  658. ItemId = o.registerCheckItem.ItemId,
  659. Result = o.registerCheckItem.Result,
  660. }).ToList(),
  661. LisSampleNo = registerCheck.LisSampleNo,
  662. AuditorName = registerCheck.AuditorName,
  663. AuditorTime = registerCheck.AuditorTime,
  664. SubmissionTime = registerCheck.SubmissionTime
  665. };
  666. var getDiagnosisResultRequestDto = new GetDiagnosisResultRequestDto()
  667. {
  668. RegisterCheckId = registerCheck.Id,
  669. Items = list.Where(o => o.registerCheck.Id == registerCheck.Id)
  670. .Select(o => new GetDiagnosisResultRequest_Item()
  671. {
  672. ItemId = o.registerCheckItem.ItemId,
  673. Result = o.registerCheckItem.Result,
  674. }).ToList()
  675. };
  676. //生成小结
  677. var summarry = await _diagnosisFunctionAppService.GetDoctorCheckDiagnosisResultAsync(getDiagnosisResultRequestDto);
  678. for (var i = 0; i < summarry.DiagnosisResultDetails.Count; i++)
  679. {
  680. updateCheckResultDto.Summarys.Add(new UpdateRegisterCheckSummaryDetail()
  681. {
  682. Summary = summarry.DiagnosisResultDetails[i].DiagnosisResult,
  683. SummaryFlag = '0'
  684. });
  685. }
  686. await _registerCheckAppService.UpdateCheckResult(updateCheckResultDto);
  687. }
  688. }
  689. #endregion
  690. #region 批量导入lis结果 需要单独对照
  691. /// <summary>
  692. /// 按excel批量导入检验结果
  693. /// </summary>
  694. /// <param name="input"></param>
  695. /// <returns></returns>
  696. /// <exception cref="UserFriendlyException"></exception>
  697. [HttpPost("api/app/ImportLisResult/ImportResultExcelByLisRequestNo")]
  698. public async Task ImportResultExcelByLisRequestNoAsync(ImportResultExcelByLisRequestNoInputDto input)
  699. {
  700. List<CreateImportLisResultDto> inputDtoList = new List<CreateImportLisResultDto>();
  701. //对照主表Id
  702. var columnReferenceId = await _sysParmValueManager.GetSysParmValueAsync(Guid.Empty, "import_file_lis_result");
  703. if (string.IsNullOrWhiteSpace(columnReferenceId))
  704. throw new UserFriendlyException("未找到对照主表Id,请到系统参数配置");
  705. foreach (var item in input.Details)
  706. {
  707. var codeValues = await _columnReferenceCodeManager.GetColumnReferenCodeValueAsync(Guid.Parse(columnReferenceId), item.ItemName);
  708. if (!codeValues.Any())
  709. {
  710. throw new UserFriendlyException($"项目名称:{item.ItemName}没有对照");
  711. }
  712. foreach (var codeValue in codeValues)
  713. {
  714. Guid itemId = Guid.Parse(codeValue);
  715. var inputDto = new CreateImportLisResultDto
  716. {
  717. CheckDate = string.IsNullOrWhiteSpace(item.CheckDate) ? null : Convert.ToDateTime(item.CheckDate),
  718. CheckDoctorName = item.CheckDoctorName,
  719. CriticalRangeValue = "",
  720. CriticalValue = "",
  721. ExecOrganizationUnitId = Guid.Empty,
  722. ItemId = itemId,
  723. ItemName = item.ItemName,
  724. LisRequestNo = input.BarCode,
  725. ReferenceRangeValue = "",
  726. ReportPrompt = "",
  727. ResultStatusId = null,
  728. Result = item.ItemResult,
  729. Unit = "",
  730. AuditorName = "",
  731. LisSampleNo = input.SampleNo
  732. };
  733. inputDtoList.Add(inputDto);
  734. }
  735. }
  736. if (input.BarcodeMode == '0')
  737. {
  738. if (await _patientRegisterRepository.CountAsync(f => f.PatientRegisterNo == input.BarCode) == 0)
  739. throw new UserFriendlyException($"条码号{input.BarCode}不正确");
  740. await ImportResultByPatientRegisterNoAsync(inputDtoList);
  741. }
  742. else if (input.BarcodeMode == '1')
  743. {
  744. var isBarCode = await (from registerCheckAsbitem in await _registerCheckAsbitemRepository.GetQueryableAsync()
  745. join lisRequest in await _lisRequestRepository.GetQueryableAsync() on registerCheckAsbitem.LisRequestId equals lisRequest.Id
  746. where lisRequest.LisRequestNo == input.BarCode
  747. select lisRequest.LisRequestNo).CountAsync();
  748. if (isBarCode == 0)
  749. throw new UserFriendlyException($"条码号{input.BarCode}不正确");
  750. await ImportResultAsync(inputDtoList);
  751. }
  752. }
  753. #endregion
  754. }
  755. }