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.

2583 lines
111 KiB

1 year ago
2 years ago
2 years ago
2 years ago
2 years ago
1 year 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
1 year 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
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
1 month ago
2 years ago
2 weeks ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
1 month 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 month ago
2 weeks ago
1 month ago
2 weeks ago
1 month ago
2 years ago
2 years ago
2 years ago
2 years ago
1 month ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
1 month ago
2 years ago
1 month ago
2 years ago
1 month 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 week 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 month ago
1 week ago
1 month ago
1 week ago
2 years ago
1 month ago
2 years ago
1 month ago
1 month ago
1 month ago
1 month ago
1 month ago
1 month ago
1 month ago
1 month ago
1 month ago
1 month ago
1 month ago
1 month ago
1 month ago
1 month ago
1 month ago
1 month ago
1 month ago
1 month ago
1 month ago
1 month ago
1 month ago
2 years ago
1 month ago
1 month ago
1 month ago
2 years ago
1 month ago
2 years ago
1 month 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
1 week ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
1 month ago
2 years ago
1 month ago
2 years ago
1 month ago
2 years ago
1 month ago
2 years ago
1 month ago
2 years ago
1 month ago
1 month ago
2 years ago
1 month ago
2 years ago
1 month ago
2 years ago
1 month ago
2 years ago
1 week ago
2 years ago
1 week ago
2 years ago
1 week ago
2 years ago
4 weeks ago
2 weeks 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
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 month ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 month ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 month ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
1 year ago
2 years ago
2 years ago
  1. using Azure;
  2. using Microsoft.AspNetCore.Authorization;
  3. using Microsoft.AspNetCore.Mvc;
  4. using Microsoft.CodeAnalysis;
  5. using Microsoft.CodeAnalysis.CSharp.Syntax;
  6. using Microsoft.EntityFrameworkCore;
  7. using NPOI.DDF;
  8. using NPOI.POIFS.Properties;
  9. using NUglify.Helpers;
  10. using Shentun.Peis.Enums;
  11. using Shentun.Peis.FollowUps;
  12. using Shentun.Peis.ItemResultMatchs;
  13. using Shentun.Peis.Models;
  14. using Shentun.Peis.PatientRegisters;
  15. using Shentun.Peis.RegisterCheckItems;
  16. using Shentun.Peis.Sexs;
  17. using Shentun.Peis.SumDiagnosises;
  18. using Shentun.Peis.SysParmValues;
  19. using SqlSugar;
  20. using System;
  21. using System.Collections.Generic;
  22. using System.Linq;
  23. using System.Reflection;
  24. using System.Text;
  25. using System.Text.RegularExpressions;
  26. using System.Threading.Tasks;
  27. using Volo.Abp;
  28. using Volo.Abp.Application.Services;
  29. using Volo.Abp.Domain.Repositories;
  30. using Volo.Abp.Uow;
  31. using Volo.Abp.Users;
  32. using Xceed.Document.NET;
  33. using static Microsoft.EntityFrameworkCore.DbLoggerCategory;
  34. namespace Shentun.Peis.DiagnosisFunctions
  35. {
  36. [ApiExplorerSettings(GroupName = "Work")]
  37. [Authorize]
  38. public class DiagnosisFunctionAppService : ApplicationService
  39. {
  40. private readonly IRepository<PatientRegister, Guid> _patientRegisterRepository;
  41. private readonly IRepository<RegisterCheckAsbitem, Guid> _registerAsbitemRepository;
  42. private readonly IRepository<Asbitem, Guid> _asbitemRepository;
  43. private readonly IRepository<Item, Guid> _itemRepository;
  44. private readonly IRepository<Unit, Guid> _unitRepository;
  45. private readonly IRepository<AsbitemDetail> _asbitemDetailRepository;
  46. private readonly IRepository<RegisterCheck, Guid> _registerCheckRepository;
  47. private readonly IRepository<RegisterCheckItem> _registerCheckItemRepository;
  48. private readonly IRepository<Diagnosis, Guid> _diagnosisRepository;
  49. private readonly IRepository<ItemResultTemplate, Guid> _itemResultTemplateRepository;
  50. private readonly IRepository<ItemResultMatch, Guid> _itemResultMatchRepository;
  51. private readonly IRepository<Suggestion, Guid> _suggestionRepository;
  52. private readonly CacheService _cacheService;
  53. private SysParmValueManager _sysParmValueManager;
  54. private RegisterCheckItemManager _registerCheckItemManager;
  55. private string _isAddAbnormalResult;
  56. private string _isAddReferenceRange;
  57. private string _isAutoAddSuffix;
  58. private string _lowerSuffix;
  59. private string _highSuffix;
  60. string[] _numArry = { "①", "②", "③", "④", "⑤", "⑥", "⑦", "⑧", "⑨", "⑩",
  61. "⑪", "⑫", "⑬", "⑭", "⑮", "⑯", "⑰", "⑱", "⑲", "⑳" };
  62. private readonly IRepository<CriticalFollowValue, Guid> _criticalFollowValueRepository;
  63. private readonly ICurrentUser _currentUser;
  64. private readonly IRepository<FollowUp, Guid> _followUpRepository;
  65. private readonly FollowUpAppService _followUpAppService;
  66. public DiagnosisFunctionAppService(
  67. IRepository<PatientRegister, Guid> patientRegisterRepository,
  68. IRepository<RegisterCheckAsbitem, Guid> registerAsbitemRepository,
  69. IRepository<Asbitem, Guid> asbitemRepository,
  70. IRepository<Item, Guid> itemRepository,
  71. IRepository<AsbitemDetail> asbitemDetailRepository,
  72. IRepository<RegisterCheck, Guid> registerCheckRepository,
  73. IRepository<RegisterCheckItem> registerCheckItemRepository,
  74. IRepository<Diagnosis, Guid> diagnosisRepository,
  75. IRepository<ItemResultTemplate, Guid> itemResultTemplateRepository,
  76. IRepository<ItemResultMatch, Guid> itemResultMatchRepository,
  77. IRepository<Suggestion, Guid> suggestionRepository,
  78. IRepository<Unit, Guid> unitRepository,
  79. CacheService cacheService,
  80. SysParmValueManager sysParmValueManager,
  81. RegisterCheckItemManager registerCheckItemManager,
  82. IRepository<CriticalFollowValue, Guid> criticalFollowValueRepository,
  83. ICurrentUser currentUser,
  84. IRepository<FollowUp, Guid> followUpRepository,
  85. FollowUpAppService followUpAppService)
  86. {
  87. this._patientRegisterRepository = patientRegisterRepository;
  88. this._registerAsbitemRepository = registerAsbitemRepository;
  89. this._asbitemRepository = asbitemRepository;
  90. this._itemRepository = itemRepository;
  91. this._asbitemDetailRepository = asbitemDetailRepository;
  92. this._registerCheckRepository = registerCheckRepository;
  93. this._registerCheckItemRepository = registerCheckItemRepository;
  94. this._diagnosisRepository = diagnosisRepository;
  95. this._itemResultTemplateRepository = itemResultTemplateRepository;
  96. this._itemResultMatchRepository = itemResultMatchRepository;
  97. this._suggestionRepository = suggestionRepository;
  98. _cacheService = cacheService;
  99. _sysParmValueManager = sysParmValueManager;
  100. _registerCheckItemManager = registerCheckItemManager;
  101. _unitRepository = unitRepository;
  102. _criticalFollowValueRepository = criticalFollowValueRepository;
  103. _currentUser = currentUser;
  104. _followUpRepository = followUpRepository;
  105. _followUpAppService = followUpAppService;
  106. }
  107. /// <summary>
  108. /// 生成小结
  109. /// </summary>
  110. /// <param name="input"></param>
  111. /// <returns></returns>
  112. [HttpPost("api/app/DiagnosisFunction/GetDoctorCheckDiagnosisResultAsync")]
  113. public async Task<GetDiagnosisResultDto> GetDoctorCheckDiagnosisResultAsync(GetDiagnosisResultRequestDto input)
  114. {
  115. #region 小结
  116. var reslist = new List<GetDiagnosisResult_Detail>();
  117. var suggestionlist = new List<GetDiagnosisSuggestion_Detail>();
  118. //根据检查单ID查询
  119. var query = (from registerCheck in await _registerCheckRepository.GetQueryableAsync()
  120. join registerAsbitem in await _registerAsbitemRepository.GetQueryableAsync() on registerCheck.Id equals registerAsbitem.RegisterCheckId
  121. join registerCheckItem in await _registerCheckItemRepository.GetQueryableAsync() on registerCheck.Id equals registerCheckItem.RegisterCheckId
  122. join asbitem in await _asbitemRepository.GetQueryableAsync() on registerAsbitem.AsbitemId equals asbitem.Id
  123. join item in (await _itemRepository.GetQueryableAsync()).Include(x => x.ReferenceRanges).Include(x => x.ItemResultMatches).Include(x => x.ItemResultTemplates)
  124. on registerCheckItem.ItemId equals item.Id
  125. join unit in await _unitRepository.GetQueryableAsync()
  126. on item.UnitId equals unit.Id into unitExist
  127. from unitHaveEmpty in unitExist.DefaultIfEmpty()
  128. join patientRegister in await _patientRegisterRepository.GetQueryableAsync() on registerCheck.PatientRegisterId equals patientRegister.Id
  129. where registerCheck.Id == input.RegisterCheckId
  130. select new
  131. {
  132. registerCheck,
  133. registerAsbitem,
  134. registerCheckItem,
  135. asbitem,
  136. item,
  137. unitHaveEmpty,
  138. patientRegister
  139. }).AsNoTracking().ToList();
  140. var resultDto = new GetDiagnosisResultDto
  141. {
  142. DiagnosisResultDetails = reslist,
  143. DiagnosisSuggestionDetails = suggestionlist,
  144. };
  145. if (query.Count() == 0)
  146. {
  147. return resultDto;
  148. }
  149. await LoadSysParm(query[0].patientRegister.MedicalCenterId);
  150. /*:
  151. * 1,
  152. * 2
  153. * 3
  154. * 4
  155. * 5
  156. * */
  157. List<string> asbitemDefaultResult = new List<string>();
  158. //设置基本参数
  159. var doctorCheckDiagnosisInput = new DoctorCheckDiagnosisInput()
  160. {
  161. SexId = query[0].patientRegister.SexId,
  162. SexName = _cacheService.GetSexNameAsync(query[0].patientRegister.SexId).GetAwaiter().GetResult(),
  163. Age = query[0].patientRegister.Age
  164. };
  165. foreach (var item in query)
  166. {
  167. //组合项目参数
  168. if (doctorCheckDiagnosisInput.Asbitems.Where(o => o.AsbitemId == item.asbitem.Id).Count() == 0)
  169. {
  170. var asbitemInput = new AsbitemInput()
  171. {
  172. RegisterCheckId = item.registerCheck.Id,
  173. AsbitemId = item.asbitem.Id,
  174. AsbitemName = item.asbitem.DisplayName,
  175. IsDiagnosisFunction = item.asbitem.IsDiagnosisFunction,
  176. DiagnosisFunction = item.asbitem.DiagnosisFunction,
  177. IsContinueProcess = item.asbitem.IsContinueProcess,
  178. DefaultResult = item.asbitem.DefaultResult,
  179. CriticalValueFunction = item.asbitem.CriticalValueFunction,
  180. FollowUpFunction = item.asbitem.FollowUpFunction,
  181. IsCriticalValueFunction = item.asbitem.IsCriticalValueFunction,
  182. IsFollowUpFunction = item.asbitem.IsFollowUpFunction
  183. };
  184. doctorCheckDiagnosisInput.Asbitems.Add(asbitemInput);
  185. if (!asbitemDefaultResult.Contains(item.asbitem.DefaultResult))
  186. {
  187. asbitemDefaultResult.Add(item.asbitem.DefaultResult);
  188. }
  189. }
  190. //项目参数
  191. if (doctorCheckDiagnosisInput.Items.Where(o => o.ItemId == item.item.Id).Count() == 0)
  192. {
  193. var inputItem = input.Items.Where(o => o.ItemId == item.item.Id).FirstOrDefault();
  194. var inputResult = "";
  195. if (inputItem != null)
  196. {
  197. inputResult = inputItem.Result;
  198. }
  199. var itemInput = new ItemInput()
  200. {
  201. RegisterCheckId = item.registerCheck.Id,
  202. ItemId = item.item.Id,
  203. ItemName = item.item.DisplayName,
  204. Unit = (item.unitHaveEmpty == null) ? "" : item.unitHaveEmpty.DisplayName,
  205. IsDiagnosisFunction = item.item.IsDiagnosisFunction,
  206. DiagnosisFunction = item.item.DiagnosisFunction,
  207. IsContinueProcess = item.item.IsContinueProcess,
  208. IsNameIntoSummary = item.item.IsNameIntoSummary,
  209. IsProduceSummary = item.item.IsProduceSummary,
  210. ReferenceRangeTypeFlag = item.item.ReferenceRangeTypeFlag,
  211. DefaultResult = item.item.DefaultResult,
  212. Result = inputResult,
  213. DisplayOrder = item.item.DisplayOrder,
  214. ItemResultMatches = item.item.ItemResultMatches.ToList(),
  215. ItemResultTemplates = item.item.ItemResultTemplates.ToList(),
  216. ReferenceRanges = item.item.ReferenceRanges.ToList(),
  217. CriticalValueFunction = item.item.CriticalValueFunction,
  218. FollowUpFunction = item.item.FollowUpFunction,
  219. IsFollowUpFunction = item.item.IsFollowUpFunction,
  220. IsCriticalValueFunction = item.item.IsCriticalValueFunction
  221. };
  222. doctorCheckDiagnosisInput.Items.Add(itemInput);
  223. }
  224. }
  225. doctorCheckDiagnosisInput.Items = doctorCheckDiagnosisInput.Items.OrderBy(o => o.DisplayOrder).ToList();
  226. //处理组合项目诊断函数
  227. List<string> diagnosisList = new List<string>();
  228. List<string> asbitemDiagnosisList;
  229. var isContinueProcess = GetAsbitemDiagnosisByFunction(doctorCheckDiagnosisInput, out asbitemDiagnosisList);
  230. diagnosisList.AddRange(asbitemDiagnosisList);
  231. if (isContinueProcess)
  232. {
  233. //处理项目诊断
  234. var itemDiagnosisList = await GetItemDiagnosis(doctorCheckDiagnosisInput);
  235. var itemDiagnosisStringList = GetItemDiagnosisStringList(itemDiagnosisList);
  236. diagnosisList.AddRange(itemDiagnosisStringList);
  237. }
  238. //设置返回值
  239. //去掉空结果数据
  240. diagnosisList = diagnosisList.Where(o => !string.IsNullOrWhiteSpace(o)).ToList();
  241. //去掉重复结果数据
  242. diagnosisList = diagnosisList.Distinct().ToList();
  243. #region 有异常结论,去掉默认小结跟正常结论
  244. var defaultDiagnsis = await _sysParmValueManager.GetSysParmValueAsync(Guid.Empty, "summary_result_default_diagnsis");
  245. if (!string.IsNullOrWhiteSpace(defaultDiagnsis))
  246. {
  247. asbitemDefaultResult.AddRange(defaultDiagnsis.Split('|'));
  248. }
  249. asbitemDefaultResult = asbitemDefaultResult.Distinct().ToList();
  250. if (diagnosisList.Any())
  251. {
  252. var tempDiagnosisList = diagnosisList.Except(asbitemDefaultResult).ToList();
  253. if (tempDiagnosisList.Any())
  254. {
  255. diagnosisList = tempDiagnosisList;
  256. }
  257. }
  258. #endregion
  259. if (!diagnosisList.Any())
  260. {
  261. //设置组合项目默认小结
  262. diagnosisList.Add(doctorCheckDiagnosisInput.Asbitems[0].DefaultResult);
  263. }
  264. foreach (var diagnosis in diagnosisList)
  265. {
  266. var getDiagnosisResult_Detail = new GetDiagnosisResult_Detail()
  267. {
  268. DiagnosisResult = diagnosis
  269. };
  270. resultDto.DiagnosisResultDetails.Add(getDiagnosisResult_Detail);
  271. }
  272. #endregion
  273. #region 处理危急值函数
  274. GetCriticalResultDto criticalResultDto = new GetCriticalResultDto();
  275. //组合项目逻辑
  276. await GetPatientRegisterAsbitemIsCriticalAsync(doctorCheckDiagnosisInput, resultDto, criticalResultDto);
  277. //明细项目逻辑
  278. await GetPatientRegisterItemIsCriticalAsync(doctorCheckDiagnosisInput, resultDto, criticalResultDto);
  279. //处理数据
  280. await HandCriticalResult(criticalResultDto, query[0].patientRegister.Id);
  281. #endregion
  282. return resultDto;
  283. }
  284. #region 小结方法
  285. private List<string> GetItemDiagnosisStringList(List<DoctorCheckItemDiagnosisResult> itemDiagnosisList)
  286. {
  287. var summaryResultTemplateSplit = _sysParmValueManager.GetSysParmValueAsync(Guid.Empty, "summary_result_template_split").GetAwaiter().GetResult();
  288. var diagnosisList = new List<string>();
  289. foreach (var itemDiagnosis in itemDiagnosisList)
  290. {
  291. if (!itemDiagnosis.ItemDiagnosisTypeResults.Any())
  292. {
  293. continue;
  294. }
  295. string diagnosis = "";
  296. foreach (var itemDiagnosisType in itemDiagnosis.ItemDiagnosisTypeResults)
  297. {
  298. if (itemDiagnosisType.DiagnosisType == '1')
  299. {
  300. //数字型检验参考范围
  301. diagnosisList.AddRange(itemDiagnosisType.Diagnosis);
  302. }
  303. else
  304. {
  305. itemDiagnosisType.Diagnosis = itemDiagnosisType.Diagnosis.Where(o => !string.IsNullOrWhiteSpace(o)).ToList();
  306. if (itemDiagnosisType.Diagnosis.Count() > _numArry.Count())
  307. {
  308. throw new UserFriendlyException($"诊断数量超过{_numArry.Count()}个,不支持");
  309. }
  310. if (itemDiagnosisType.Diagnosis.Count() == 0)
  311. {
  312. continue;
  313. }
  314. for (int i = 0; i < itemDiagnosisType.Diagnosis.Count(); i++)
  315. {
  316. if (string.IsNullOrWhiteSpace(itemDiagnosisType.Diagnosis[i]))
  317. {
  318. continue;
  319. }
  320. if (itemDiagnosisType.Diagnosis.Count() == 1)
  321. {
  322. diagnosis = diagnosis + itemDiagnosisType.Diagnosis[i] + ";";
  323. }
  324. else
  325. {
  326. diagnosis = diagnosis + _numArry[i] + itemDiagnosisType.Diagnosis[i] + ";";
  327. }
  328. }
  329. }
  330. }
  331. if (!string.IsNullOrWhiteSpace(diagnosis))
  332. {
  333. if (summaryResultTemplateSplit == "Y")
  334. {
  335. var diagnosisArry = GetResultArry(diagnosis);
  336. for (int i = 0; i < diagnosisArry.Length; i++)
  337. {
  338. string diagnosisTemp = diagnosisArry[i];
  339. if (itemDiagnosis.IsNameIntoSummary == 'Y' && !diagnosisTemp.StartsWith(itemDiagnosis.ItemName))
  340. {
  341. diagnosisTemp = itemDiagnosis.ItemName + ":" + diagnosisTemp;
  342. }
  343. diagnosisList.Add(diagnosisTemp);
  344. }
  345. }
  346. else
  347. {
  348. if (itemDiagnosis.IsNameIntoSummary == 'Y' && !diagnosis.StartsWith(itemDiagnosis.ItemName))
  349. {
  350. diagnosis = itemDiagnosis.ItemName + ":" + diagnosis;
  351. }
  352. diagnosisList.Add(diagnosis);
  353. }
  354. }
  355. }
  356. return diagnosisList;
  357. }
  358. /// <summary>
  359. /// 加载系统参数
  360. /// </summary>
  361. /// <param name="medicalCenterId"></param>
  362. /// <returns></returns>
  363. private async Task LoadSysParm(Guid medicalCenterId)
  364. {
  365. _isAddAbnormalResult = await _sysParmValueManager.GetSysParmValueAsync(
  366. medicalCenterId, "doctor_check_lis_summary_mode_add_abnormal_result");
  367. _isAddReferenceRange = await _sysParmValueManager.GetSysParmValueAsync(
  368. medicalCenterId, "doctor_check_lis_summary_mode_add_reference_range");
  369. _isAutoAddSuffix = await _sysParmValueManager.GetSysParmValueAsync(
  370. medicalCenterId, "doctor_check_lis_summary_mode_auto_add_suffix");
  371. _lowerSuffix = await _sysParmValueManager.GetSysParmValueAsync(
  372. medicalCenterId, "doctor_check_lis_summary_mode_lower_suffix");
  373. _highSuffix = await _sysParmValueManager.GetSysParmValueAsync(
  374. medicalCenterId, "doctor_check_lis_summary_mode_high_suffix");
  375. }
  376. /// <summary>
  377. /// 获取组合项目诊断通过诊断函数
  378. /// </summary>
  379. /// <param name="doctorCheckDiagnosisInput"></param>
  380. /// <param name="diagnosisList"></param>
  381. /// <returns></returns>
  382. private bool GetAsbitemDiagnosisByFunction(DoctorCheckDiagnosisInput doctorCheckDiagnosisInput, out List<string> diagnosisList)
  383. {
  384. var patientAsbitemDiagnosisInput = new PatientAsbitemDiagnosisInput()
  385. {
  386. SexName = doctorCheckDiagnosisInput.SexName,
  387. Age = doctorCheckDiagnosisInput.Age
  388. };
  389. foreach (var item in doctorCheckDiagnosisInput.Items)
  390. {
  391. var itemResult = new ItemResultInput()
  392. {
  393. ItemId = item.ItemId,
  394. ItemName = item.ItemName,
  395. Result = item.Result
  396. };
  397. patientAsbitemDiagnosisInput.Items.Add(itemResult);
  398. }
  399. var diagnosisBuilder = new DiagnosisBuilder();
  400. diagnosisList = new List<string>();
  401. bool isContinueProcess = true;
  402. foreach (var asbitem in doctorCheckDiagnosisInput.Asbitems)
  403. {
  404. if (asbitem.IsDiagnosisFunction == 'Y' && !string.IsNullOrWhiteSpace(asbitem.DiagnosisFunction))
  405. {
  406. var diagnosis = diagnosisBuilder.GetAsbitemDiagnosisResult(patientAsbitemDiagnosisInput, asbitem.DiagnosisFunction);
  407. List<string> ds = diagnosis.Split("$$", StringSplitOptions.RemoveEmptyEntries).ToList();
  408. diagnosisList.AddRange(ds);
  409. if (asbitem.IsContinueProcess != 'Y')
  410. {
  411. //有一个不允许继续处理,则不允许继续处理
  412. isContinueProcess = false;
  413. }
  414. }
  415. }
  416. return isContinueProcess;
  417. }
  418. /// <summary>
  419. /// 获取项目诊断
  420. /// </summary>
  421. /// <param name="doctorCheckDiagnosisInput"></param>
  422. /// <returns></returns>
  423. private async Task<List<DoctorCheckItemDiagnosisResult>> GetItemDiagnosis(DoctorCheckDiagnosisInput doctorCheckDiagnosisInput)
  424. {
  425. var patientItemDiagnosisInput = new PatientItemDiagnosisInput()
  426. {
  427. SexName = doctorCheckDiagnosisInput.SexName,
  428. Age = doctorCheckDiagnosisInput.Age
  429. };
  430. var diagnosisBuilder = new DiagnosisBuilder();
  431. var diagnosisList = new List<DoctorCheckItemDiagnosisResult>();
  432. foreach (var item in doctorCheckDiagnosisInput.Items)
  433. {
  434. if (string.IsNullOrWhiteSpace(item.Result))
  435. {
  436. continue;
  437. }
  438. if (!string.IsNullOrWhiteSpace(item.DefaultResult) && item.Result == item.DefaultResult)
  439. {
  440. continue;
  441. }
  442. if (item.IsProduceSummary != 'Y')
  443. {
  444. continue;
  445. }
  446. var doctorCheckItemDiagnosisResult = new DoctorCheckItemDiagnosisResult()
  447. {
  448. IsNameIntoSummary = item.IsNameIntoSummary,
  449. ItemName = item.ItemName,
  450. };
  451. diagnosisList.Add(doctorCheckItemDiagnosisResult);
  452. if (item.IsDiagnosisFunction == 'Y' && !string.IsNullOrWhiteSpace(item.DiagnosisFunction))
  453. {
  454. var itemResult = new ItemResultInput()
  455. {
  456. ItemId = item.ItemId,
  457. ItemName = item.ItemName,
  458. Result = item.Result
  459. };
  460. patientItemDiagnosisInput.Item = itemResult;
  461. //通过计算获取诊断
  462. var diagnosis = diagnosisBuilder.GetItemDiagnosisResult(patientItemDiagnosisInput, item.DiagnosisFunction);
  463. var itemDiagnosisTypeResult = new ItemDiagnosisTypeResult()
  464. {
  465. DiagnosisType = '0'
  466. };
  467. itemDiagnosisTypeResult.Diagnosis.Add(diagnosis);
  468. doctorCheckItemDiagnosisResult.ItemDiagnosisTypeResults.Add(itemDiagnosisTypeResult);
  469. }
  470. if (item.IsDiagnosisFunction == 'Y' && item.IsContinueProcess != 'Y')
  471. {
  472. continue;
  473. }
  474. //通过参考范围获取诊断
  475. if (item.ReferenceRangeTypeFlag == ItemReferenceRangeTypeFlag.Number)
  476. {
  477. var referenceRangeDiagnosis = await GetItemDiagnosisByReferenceRanges(doctorCheckDiagnosisInput.SexId, doctorCheckDiagnosisInput.Age, item);
  478. if (!string.IsNullOrWhiteSpace(referenceRangeDiagnosis))
  479. {
  480. var itemDiagnosisTypeResult = new ItemDiagnosisTypeResult()
  481. {
  482. DiagnosisType = '1'
  483. };
  484. itemDiagnosisTypeResult.Diagnosis.Add(referenceRangeDiagnosis);
  485. doctorCheckItemDiagnosisResult.ItemDiagnosisTypeResults.Add(itemDiagnosisTypeResult);
  486. }
  487. }
  488. else
  489. {
  490. //区分新老系统逻辑
  491. //老系统 拆分结果后,每个结果如果匹配到了结果模板,就不继续诊断匹配
  492. //新系统 匹配到底
  493. var resultAry = GetResultArry(item.Result);
  494. List<string> templateResultList = new List<string>();
  495. for (int i = 0; i < resultAry.Length; i++)
  496. {
  497. templateResultList.Add(Regex.Replace(resultAry[0], @"\d+(\.\d+)?", "$"));
  498. }
  499. // List<string> templateResultList = new List<string>(GetResultArry(item.Result));
  500. var summaryResultMatchIsOld = await _sysParmValueManager.GetSysParmValueAsync(Guid.Empty, "summary_result_match_isold");
  501. if (summaryResultMatchIsOld == "Y")
  502. {
  503. //旧系统逻辑
  504. //通过结果模板获取诊断
  505. var itemDiagnosisTypeResult = new ItemDiagnosisTypeResult()
  506. {
  507. DiagnosisType = '2'
  508. };
  509. foreach (var itemResult in templateResultList)
  510. {
  511. List<string> tempDiagnosisList = new List<string>();
  512. if (string.IsNullOrWhiteSpace(itemResult) || itemResult.StartsWith("余未见异常"))
  513. {
  514. continue;
  515. }
  516. var templatesList = item.ItemResultTemplates.Where(o => o.Result == itemResult && o.IsResultIntoSummary == 'Y').ToList();
  517. foreach (var template in templatesList)
  518. {
  519. if (template != null && template.DiagnosisId != null && template.DiagnosisId != Guid.Empty)
  520. {
  521. var temp_diagnosis = await _diagnosisRepository.FirstOrDefaultAsync(m => m.Id == template.DiagnosisId);
  522. if (temp_diagnosis != null)
  523. {
  524. tempDiagnosisList.Add(temp_diagnosis.DisplayName);
  525. }
  526. }
  527. }
  528. if (!tempDiagnosisList.Any())
  529. {
  530. //通过匹配关系获取诊断
  531. var matcheList = await GetItemDiagnosisByMatche(item, new List<string> { itemResult });
  532. tempDiagnosisList.AddRange(matcheList);
  533. }
  534. if (!tempDiagnosisList.Any())
  535. {
  536. //获取异常结果
  537. itemDiagnosisTypeResult.Diagnosis.Add(itemResult);
  538. }
  539. else
  540. {
  541. tempDiagnosisList = tempDiagnosisList.Distinct().ToList();
  542. itemDiagnosisTypeResult.Diagnosis.AddRange(tempDiagnosisList);
  543. }
  544. }
  545. //去掉重复诊断
  546. itemDiagnosisTypeResult.Diagnosis = itemDiagnosisTypeResult.Diagnosis.Distinct().ToList();
  547. doctorCheckItemDiagnosisResult.ItemDiagnosisTypeResults.Add(itemDiagnosisTypeResult);
  548. #region ttt
  549. ////旧系统逻辑
  550. ////通过结果模板获取诊断
  551. //var templateResult = await GetItemDiagnosisByTemplate(item, templateResultList);
  552. //var templateList = templateResult.Item1;
  553. //var handResult = templateResult.Item2; //处理过的结果
  554. //templateResultList = templateResultList.Except(handResult).ToList(); //移除匹配到结果模板的结果
  555. //var itemDiagnosisTypeResult = new ItemDiagnosisTypeResult()
  556. //{
  557. // DiagnosisType = '2'
  558. //};
  559. //itemDiagnosisTypeResult.Diagnosis.AddRange(templateList);
  560. ////通过匹配关系获取诊断
  561. //var matcheList = await GetItemDiagnosisByMatche(item, templateResultList);
  562. //itemDiagnosisTypeResult.Diagnosis.AddRange(matcheList);
  563. //if (!templateList.Any() && !matcheList.Any())
  564. //{
  565. // //获取异常结果
  566. // itemDiagnosisTypeResult.Diagnosis.Add(item.Result);
  567. //}
  568. ////去掉重复诊断
  569. //itemDiagnosisTypeResult.Diagnosis = itemDiagnosisTypeResult.Diagnosis.Distinct().ToList();
  570. //doctorCheckItemDiagnosisResult.ItemDiagnosisTypeResults.Add(itemDiagnosisTypeResult);
  571. #endregion
  572. }
  573. else
  574. {
  575. //通过结果模板获取诊断
  576. var templateList = await GetItemDiagnosisByTemplate(item, templateResultList);
  577. var itemDiagnosisTypeResult = new ItemDiagnosisTypeResult()
  578. {
  579. DiagnosisType = '2'
  580. };
  581. itemDiagnosisTypeResult.Diagnosis.AddRange(templateList);
  582. //通过匹配关系获取诊断
  583. var matcheList = await GetItemDiagnosisByMatche(item, templateResultList);
  584. itemDiagnosisTypeResult.Diagnosis.AddRange(matcheList);
  585. if (!templateList.Any() && !matcheList.Any())
  586. {
  587. //获取异常结果
  588. itemDiagnosisTypeResult.Diagnosis.Add(item.Result);
  589. }
  590. //去掉重复诊断
  591. itemDiagnosisTypeResult.Diagnosis = itemDiagnosisTypeResult.Diagnosis.Distinct().ToList();
  592. doctorCheckItemDiagnosisResult.ItemDiagnosisTypeResults.Add(itemDiagnosisTypeResult);
  593. }
  594. }
  595. }
  596. return diagnosisList;
  597. }
  598. /// <summary>
  599. /// 通过参考范围获取项目诊断列表
  600. /// </summary>
  601. /// <param name="sexId"></param>
  602. /// <param name="age"></param>
  603. /// <param name="itemInput"></param>
  604. /// <returns></returns>
  605. private async Task<string> GetItemDiagnosisByReferenceRanges(char sexId, short? age, ItemInput itemInput)
  606. {
  607. var diagnosisList = new List<string>();
  608. if (string.IsNullOrWhiteSpace(itemInput.Result))
  609. {
  610. return null;
  611. }
  612. decimal resultDecimal;
  613. if (!decimal.TryParse(itemInput.Result, out resultDecimal))
  614. {
  615. return null;
  616. }
  617. var referenceRangeList = itemInput.ReferenceRanges.Where(o => o.ReferenceRangeTypeFlag == ItemReferenceRangeTypeFlag.Number).ToList();
  618. if (!referenceRangeList.Any())
  619. {
  620. return null;
  621. }
  622. if (age == null)
  623. {
  624. age = 30;
  625. }
  626. var referenceRange = referenceRangeList.Where(o => o.ForSexId == sexId && age >= o.AgeLowerLimit && age <= o.AgeUpperLimit).FirstOrDefault();
  627. if (referenceRange == null)
  628. {
  629. referenceRange = referenceRangeList.Where(o => o.ForSexId == ForSexFlag.All && age >= o.AgeLowerLimit && age <= o.AgeUpperLimit).FirstOrDefault();
  630. if (referenceRange == null)
  631. {
  632. return null;
  633. }
  634. }
  635. string diagnosis = null;
  636. // var pos = referenceRange.ReferenceRangeValue.IndexOf("-");
  637. string resultStatusId = _registerCheckItemManager.GetNumberResultStatusId(itemInput.Result, referenceRange.ReferenceRangeValue);
  638. if (resultStatusId == ResultStatusFlag.Low)
  639. {
  640. diagnosis = await GetNumberDiagnosis(itemInput.ItemName, itemInput.Result, itemInput.Unit, true, referenceRange);
  641. }
  642. else if (resultStatusId == ResultStatusFlag.High)
  643. {
  644. diagnosis = await GetNumberDiagnosis(itemInput.ItemName, itemInput.Result, itemInput.Unit, false, referenceRange);
  645. }
  646. return diagnosis;
  647. }
  648. /// <summary>
  649. /// 根据参考范围获取诊断
  650. /// </summary>
  651. /// <param name="itemName"></param>
  652. /// <param name="result"></param>
  653. /// <param name="unit"></param>
  654. /// <param name="isLower"></param>
  655. /// <param name="referenceRange"></param>
  656. /// <returns></returns>
  657. private async Task<string> GetNumberDiagnosis(string itemName, string result, string unit, bool isLower,
  658. ReferenceRange referenceRange)
  659. {
  660. string diagnosis = null;
  661. if (isLower)
  662. {
  663. //偏低诊断
  664. if (referenceRange.LowerDiagnosisId != null && referenceRange.LowerDiagnosisId != Guid.Empty)
  665. {
  666. var diagnosisEntity = await _diagnosisRepository.FindAsync(o => o.Id == referenceRange.LowerDiagnosisId);
  667. if (diagnosisEntity != null)
  668. {
  669. diagnosis = diagnosisEntity.DisplayName + "↓";
  670. }
  671. else
  672. {
  673. if (_isAutoAddSuffix == "Y")
  674. {
  675. diagnosis = itemName + _lowerSuffix + "↓";
  676. }
  677. }
  678. }
  679. else
  680. {
  681. if (_isAutoAddSuffix == "Y")
  682. {
  683. diagnosis = itemName + _lowerSuffix + "↓";
  684. }
  685. }
  686. }
  687. else
  688. {
  689. //偏高诊断
  690. if (referenceRange.UpperDiagnosisId != null && referenceRange.UpperDiagnosisId != Guid.Empty)
  691. {
  692. var diagnosisEntity = await _diagnosisRepository.FindAsync(o => o.Id == referenceRange.UpperDiagnosisId);
  693. if (diagnosisEntity != null)
  694. {
  695. diagnosis = diagnosisEntity.DisplayName + "↑";
  696. }
  697. else
  698. {
  699. if (_isAutoAddSuffix == "Y")
  700. {
  701. diagnosis = itemName + _highSuffix + "↑";
  702. }
  703. }
  704. }
  705. else
  706. {
  707. if (_isAutoAddSuffix == "Y")
  708. {
  709. diagnosis = itemName + _highSuffix + "↑";
  710. }
  711. }
  712. }
  713. if (!string.IsNullOrWhiteSpace(diagnosis))
  714. {
  715. if (_isAddAbnormalResult == "Y")
  716. {
  717. if (string.IsNullOrEmpty(unit))
  718. {
  719. unit = "";
  720. }
  721. diagnosis = diagnosis + $"(结果:{result} {unit},参考范围: {referenceRange.ReferenceRangeValue})";
  722. }
  723. }
  724. return diagnosis;
  725. }
  726. /// <summary>
  727. /// 通过模板获取诊断
  728. /// </summary>
  729. /// <param name="itemInput"></param>
  730. /// <param name="resultArry"></param>
  731. /// <returns></returns>
  732. private async Task<List<string>> GetItemDiagnosisByTemplate(ItemInput itemInput, List<string> resultArry)
  733. {
  734. List<string> diagnosisList = new List<string>();
  735. //将结果解析到数组中
  736. //结果模板中的结果去掉数字,* /等符号
  737. //foreach (var template in itemInput.ItemResultTemplates)
  738. //{
  739. // if (!string.IsNullOrWhiteSpace(template.Result))
  740. // {
  741. // //template.Result = Regex.Replace(template.Result, @"\d+", "").Replace("*", "").Replace("/", "").Replace(" ", "");
  742. // }
  743. //}
  744. foreach (var resultSplit in resultArry)
  745. {
  746. if (string.IsNullOrWhiteSpace(resultSplit) || resultSplit.StartsWith("余未见异常"))
  747. {
  748. continue;
  749. }
  750. var templatesList = itemInput.ItemResultTemplates.Where(o => o.Result == resultSplit && o.IsResultIntoSummary == 'Y').ToList();
  751. foreach (var template in templatesList)
  752. {
  753. if (template != null && template.DiagnosisId != null && template.DiagnosisId != Guid.Empty)
  754. {
  755. var temp_diagnosis = await _diagnosisRepository.FirstOrDefaultAsync(m => m.Id == template.DiagnosisId);
  756. if (temp_diagnosis != null)
  757. {
  758. diagnosisList.Add(temp_diagnosis.DisplayName);
  759. }
  760. }
  761. else
  762. {
  763. diagnosisList.Add(resultSplit);
  764. }
  765. }
  766. }
  767. return diagnosisList.Distinct().ToList();
  768. }
  769. /// <summary>
  770. /// 获取项目诊断通过匹配关系
  771. /// </summary>
  772. /// <param name="itemInput"></param>
  773. /// <param name="resultArry"></param>
  774. /// <returns></returns>
  775. private async Task<List<string>> GetItemDiagnosisByMatche(ItemInput itemInput, List<string> resultArry)
  776. {
  777. List<string> diagnosisList = new List<string>();
  778. //将结果解析到数组中
  779. //string[] resultArry = GetResultArry(itemInput.Result);
  780. foreach (var resultSplit in resultArry)
  781. {
  782. if (string.IsNullOrWhiteSpace(resultSplit) || resultSplit.StartsWith("余未见异常"))
  783. {
  784. continue;
  785. }
  786. var templatesList = itemInput.ItemResultMatches.Where(o => resultSplit.Contains(o.Result)).OrderByDescending(o => o.Result.Length).ToList();
  787. List<string> tempResultAdd = new List<string>();
  788. foreach (var template in templatesList)
  789. {
  790. if (template != null && template.DiagnosisId != Guid.Empty)
  791. {
  792. if (tempResultAdd.Count(c => c.Contains(template.Result)) == 0)
  793. {
  794. var temp_diagnosis = await _diagnosisRepository.FirstOrDefaultAsync(m => m.Id == template.DiagnosisId);
  795. if (temp_diagnosis != null)
  796. {
  797. tempResultAdd.Add(template.Result);
  798. diagnosisList.Add(temp_diagnosis.DisplayName);
  799. }
  800. }
  801. }
  802. }
  803. }
  804. return diagnosisList.Distinct().ToList();
  805. }
  806. /// <summary>
  807. /// 去掉结果中的数字符号和分号
  808. /// </summary>
  809. /// <param name="result"></param>
  810. /// <returns></returns>
  811. private string[] GetResultArry(string result)
  812. {
  813. result = result.Trim().Replace(";", ";");
  814. foreach (var num in _numArry)
  815. {
  816. result = result.Replace(num, "");
  817. }
  818. //将结果通过英文;解析到数组中
  819. //string[] resultArry = result.Split(";");
  820. string[] resultArry = result.Split(";", StringSplitOptions.RemoveEmptyEntries);
  821. return resultArry;
  822. }
  823. #region 执行项目计算函数
  824. /// <summary>
  825. /// 生成计算函数值
  826. /// </summary>
  827. /// <param name="input"></param>
  828. /// <returns></returns>
  829. [HttpPost("api/app/diagnosisfunction/getcalculationfunctionresult")]
  830. public async Task<GetDiagnosisResultRequestDto> GetCalculationFunctionResultAsync(GetDiagnosisResultRequestDto input)
  831. {
  832. await GetItemResultByCalculationFunctionAsync(input);
  833. return input;
  834. }
  835. private async Task GetItemResultByCalculationFunctionAsync(GetDiagnosisResultRequestDto input)
  836. {
  837. //根据检查单ID查询
  838. var list = (
  839. from patientRegister in await _patientRegisterRepository.GetQueryableAsync()
  840. join registerCheck in await _registerCheckRepository.GetQueryableAsync()
  841. on patientRegister.Id equals registerCheck.PatientRegisterId
  842. join registerCheckItem in await _registerCheckItemRepository.GetQueryableAsync()
  843. on registerCheck.Id equals registerCheckItem.RegisterCheckId
  844. join item in await _itemRepository.GetQueryableAsync()
  845. on registerCheckItem.ItemId equals item.Id
  846. where registerCheck.Id == input.RegisterCheckId
  847. select new
  848. {
  849. PatientRegister = patientRegister,
  850. Item = item
  851. }
  852. ).ToList();
  853. var diagnosisBuilder = new DiagnosisBuilder();
  854. var patientItemCalculateInput = new PatientItemCalculateInput()
  855. {
  856. SexName = _cacheService.GetSexNameAsync(list[0].PatientRegister.SexId).Result,
  857. Age = list[0].PatientRegister.Age
  858. };
  859. foreach (var item in input.Items)
  860. {
  861. var itemResult = new ItemResultInput()
  862. {
  863. ItemId = item.ItemId,
  864. Result = item.Result
  865. };
  866. itemResult.ItemName = list.Where(o => o.Item.Id == item.ItemId).First().Item.DisplayName;
  867. patientItemCalculateInput.Items.Add(itemResult);
  868. }
  869. foreach (var item in list)
  870. {
  871. if (item.Item.IsCalculationItem == 'Y' && !string.IsNullOrEmpty(item.Item.CalculationFunction))
  872. {
  873. //计算函数
  874. //计算结果
  875. string CalculationFunctionValue = diagnosisBuilder.GetItemCalculateResult(patientItemCalculateInput, item.Item.CalculationFunction);
  876. //CalculationFunctionValue = GetCodeResult(input, item.CalculationFunction, list);
  877. input.Items.Where(m => m.ItemId == item.Item.Id).FirstOrDefault().Result = CalculationFunctionValue; //赋值
  878. }
  879. }
  880. }
  881. #endregion
  882. /// <summary>
  883. /// 执行项目 诊断函数
  884. /// </summary>
  885. /// <param name="input"></param>
  886. /// <param name="item_datas"></param>
  887. /// <param name="patientRegister_data"></param>
  888. /// <param name="diagnosisTrips"></param>
  889. /// <returns></returns>
  890. private async Task<List<GetDiagnosisResult_Detail>> GetDiagnosisResultInItemAsync(GetDiagnosisResultRequestDto input, List<Item> item_datas, PatientRegister patientRegister_data, List<string> diagnosisTrips)
  891. {
  892. var reslist = new List<GetDiagnosisResult_Detail>();
  893. if (input.Items.Count > 0)
  894. {
  895. foreach (var item_data in item_datas)
  896. {
  897. if (item_data.IsDiagnosisFunction == 'Y' && !string.IsNullOrEmpty(item_data.DiagnosisFunction))
  898. {
  899. var DiagnosisFunctionResult_Item = GetCodeResult(input, item_data.DiagnosisFunction, item_datas);
  900. if (!string.IsNullOrEmpty(DiagnosisFunctionResult_Item))
  901. {
  902. reslist.Add(new GetDiagnosisResult_Detail
  903. {
  904. DiagnosisResult = DiagnosisFunctionResult_Item
  905. });
  906. }
  907. //是否继续执行参考范围规则
  908. if (item_data.IsContinueProcess == 'Y' && item_data.IsProduceSummary == 'Y')
  909. {
  910. string itemResult_Request = input.Items.Where(m => m.ItemId == item_data.Id).FirstOrDefault().Result; //项目结果
  911. //执行参考范围
  912. string referenceRangesResult = await GetDiagnosisResultInReferenceRangesAsync(item_data, itemResult_Request, patientRegister_data, diagnosisTrips);
  913. if (!string.IsNullOrEmpty(referenceRangesResult))
  914. {
  915. if (item_data.IsNameIntoSummary == 'Y')
  916. DiagnosisFunctionResult_Item = item_data.DisplayName + DiagnosisFunctionResult_Item;
  917. reslist.Add(new GetDiagnosisResult_Detail { DiagnosisResult = referenceRangesResult });
  918. }
  919. }
  920. }
  921. }
  922. }
  923. return reslist;
  924. }
  925. /// <summary>
  926. /// 执行项目 参考范围获取结果
  927. /// </summary>
  928. /// <param name="item"></param>
  929. /// <param name="itemResult"></param>
  930. /// <param name="patientRegister_data"></param>
  931. /// <param name="diagnosisTrips"></param>
  932. /// <returns></returns>
  933. private async Task<string> GetDiagnosisResultInReferenceRangesAsync(Item item, string itemResult, PatientRegister patientRegister_data, List<string> diagnosisTrips)
  934. {
  935. string referenceRangesResult = "";
  936. string diagnosisTrip = ""; //诊断提示,参考范围性别、年龄 异常时出现
  937. var item_ReferenceRangeList = item.ReferenceRanges.Where(m => m.ReferenceRangeTypeFlag == item.ReferenceRangeTypeFlag).ToList();
  938. if (item_ReferenceRangeList.Any() && item.ReferenceRangeTypeFlag == ItemReferenceRangeTypeFlag.Number)
  939. {
  940. //数字参考范围
  941. List<ReferenceRange> referenceRanges = new List<ReferenceRange>();
  942. if (patientRegister_data.Age != null)
  943. {
  944. referenceRanges = item_ReferenceRangeList.Where(m => m.AgeLowerLimit <= patientRegister_data.Age
  945. && m.AgeUpperLimit >= patientRegister_data.Age).ToList();
  946. }
  947. else
  948. {
  949. //if (string.IsNullOrEmpty(DiagnosisTrip))
  950. //{
  951. // DiagnosisTrip += "未登记年龄";
  952. //}
  953. //else
  954. //{
  955. // DiagnosisTrip += ",未登记年龄";
  956. //}
  957. diagnosisTrip = "未登记年龄";
  958. //找出默认的0-200
  959. referenceRanges = item_ReferenceRangeList.Where(m => m.AgeLowerLimit == 0
  960. && m.AgeUpperLimit == 200).ToList();
  961. }
  962. if (referenceRanges.Any())
  963. {
  964. //比对性别
  965. var referenceRanges2 = referenceRanges.Where(m => patientRegister_data.SexId != null && m.ForSexId == patientRegister_data.SexId).ToList();
  966. if (!referenceRanges2.Any())
  967. {
  968. //未找到,去匹配适用性别为A的
  969. referenceRanges2 = referenceRanges.Where(m => m.ForSexId == ForSexFlag.All).ToList();
  970. if (referenceRanges2.Any())
  971. {
  972. //数字参考范围类型
  973. referenceRangesResult = await GetDiagnosisResultInNumRangeAsync(item, itemResult, referenceRanges2[0]);
  974. }
  975. }
  976. }
  977. //////符合条件的参考范围
  978. //var item_ReferenceRange = item_ReferenceRangeList.Where(m =>
  979. //(m.ForSexId.ToString() == ForSexFlag.All || (patientRegister_data.SexId != null && m.ForSexId == patientRegister_data.SexId))
  980. // && patientRegister_data.Age != null
  981. // && m.AgeLowerLimit <= patientRegister_data.Age
  982. // && m.AgeUpperLimit >= patientRegister_data.Age).ToList();
  983. //if (item_ReferenceRange.Count > 0)
  984. //{
  985. // if (item_ReferenceRange.Count == 1)
  986. // {
  987. // //数字参考范围类型
  988. // result = await GetDiagnosisResultInNumRangeAsync(item, itemResult, item_ReferenceRange[0]);
  989. // }
  990. //}
  991. }
  992. else
  993. {
  994. //无参考范围或者字符参考范围
  995. referenceRangesResult = await GetDiagnosisResultInItemResultTemplateAsync(item, itemResult);
  996. if (string.IsNullOrEmpty(referenceRangesResult))
  997. {
  998. //未匹配上,继续
  999. referenceRangesResult = await GetDiagnosisResultInItemResultMatchAsync(item, itemResult);
  1000. if (string.IsNullOrEmpty(referenceRangesResult))
  1001. {
  1002. //未匹配上,继续
  1003. //对比项目默认结果,如果不是默认结果则直接用结果做为小结。
  1004. if (item.DefaultResult != itemResult)
  1005. {
  1006. referenceRangesResult = itemResult;
  1007. }
  1008. }
  1009. }
  1010. }
  1011. if (!string.IsNullOrEmpty(diagnosisTrip))
  1012. diagnosisTrips.Add(diagnosisTrip);
  1013. return referenceRangesResult;
  1014. }
  1015. /// <summary>
  1016. /// 根据项目结果模板生成
  1017. /// 检查项目结果模板,如果和项目结果模板一致,则根据对应的诊断生成小结 完全匹配
  1018. /// </summary>
  1019. /// <returns></returns>
  1020. private async Task<string> GetDiagnosisResultInItemResultTemplateAsync(Item item, string itemResult)
  1021. {
  1022. string result = "";
  1023. var temp_itemResultTemplate = await _itemResultTemplateRepository.FirstOrDefaultAsync(m => m.ItemId == item.Id && m.Result == itemResult);
  1024. if (temp_itemResultTemplate != null && temp_itemResultTemplate.DiagnosisId != null && temp_itemResultTemplate.DiagnosisId != Guid.Empty)
  1025. {
  1026. var temp_diagnosis = await _diagnosisRepository.FirstOrDefaultAsync(m => m.Id == temp_itemResultTemplate.DiagnosisId);
  1027. if (temp_diagnosis != null)
  1028. {
  1029. result = temp_diagnosis.DisplayName;
  1030. }
  1031. }
  1032. return result;
  1033. }
  1034. /// <summary>
  1035. /// 根据项目项目结果匹配(诊断匹配) 生成
  1036. /// </summary>
  1037. /// <returns></returns>
  1038. private async Task<string> GetDiagnosisResultInItemResultMatchAsync(Item item, string itemResult)
  1039. {
  1040. string result = "";
  1041. var temp_itemResultMatch = await _itemResultMatchRepository.FirstOrDefaultAsync(m => m.ItemId == item.Id && itemResult.Contains(m.Result));
  1042. if (temp_itemResultMatch != null && temp_itemResultMatch.DiagnosisId != Guid.Empty)
  1043. {
  1044. var temp_diagnosis = await _diagnosisRepository.FirstOrDefaultAsync(m => m.Id == temp_itemResultMatch.DiagnosisId);
  1045. if (temp_diagnosis != null)
  1046. {
  1047. result = temp_diagnosis.DisplayName;
  1048. }
  1049. }
  1050. return result;
  1051. }
  1052. /// <summary>
  1053. /// 根据数字型范围值对应的诊断匹配 生成
  1054. /// 如果在范围外又没有设置诊断,则用项目名称加偏高偏低后缀生成小结(需要根据系统参数)。
  1055. /// </summary>
  1056. /// <param name="item"></param>
  1057. /// <param name="itemResult"></param>
  1058. /// <param name="item_ReferenceRange">当前匹配的参考范围</param>
  1059. /// <returns></returns>
  1060. private async Task<string> GetDiagnosisResultInNumRangeAsync(Item item, string itemResult, ReferenceRange item_ReferenceRange)
  1061. {
  1062. string result = "";
  1063. string diagnosisFlag = "1"; //1=正常 2=偏高 0=偏低
  1064. #region 处理异常结果 > < = 剔除
  1065. itemResult = itemResult.Replace(">", "").Replace("<", "").Replace("=", "");
  1066. try
  1067. {
  1068. var tempConvert = Convert.ToDecimal(itemResult);
  1069. }
  1070. catch (Exception ex)
  1071. {
  1072. return result;
  1073. }
  1074. #endregion
  1075. #region 匹配参考范围
  1076. string item_referenceRangeValue = item_ReferenceRange.ReferenceRangeValue;
  1077. if (item_referenceRangeValue.IndexOf("-") > -1)
  1078. {
  1079. var value_ary = item_referenceRangeValue.Split('-');
  1080. if (value_ary.Length == 2)
  1081. {
  1082. decimal minvalue = Convert.ToDecimal(value_ary[0]);
  1083. decimal maxvalue = Convert.ToDecimal(value_ary[1]);
  1084. if (Convert.ToDecimal(itemResult) > maxvalue)
  1085. {
  1086. //偏高
  1087. diagnosisFlag = "2";
  1088. }
  1089. else if (Convert.ToDecimal(itemResult) < minvalue)
  1090. {
  1091. //偏低
  1092. diagnosisFlag = "0";
  1093. }
  1094. }
  1095. }
  1096. else if (item_referenceRangeValue.IndexOf(">=") > -1)
  1097. {
  1098. if (Convert.ToDecimal(itemResult) < Convert.ToDecimal(item_referenceRangeValue.Replace(">=", "")))
  1099. {
  1100. //偏低
  1101. diagnosisFlag = "0";
  1102. }
  1103. }
  1104. else if (item_referenceRangeValue.IndexOf("<=") > -1)
  1105. {
  1106. if (Convert.ToDecimal(itemResult) > Convert.ToDecimal(item_referenceRangeValue.Replace("<=", "")))
  1107. {
  1108. //偏高
  1109. diagnosisFlag = "2";
  1110. }
  1111. }
  1112. else if (item_referenceRangeValue.IndexOf(">") > -1)
  1113. {
  1114. if (Convert.ToDecimal(itemResult) <= Convert.ToDecimal(item_referenceRangeValue.Replace(">", "")))
  1115. {
  1116. //偏低
  1117. diagnosisFlag = "0";
  1118. }
  1119. }
  1120. else if (item_referenceRangeValue.IndexOf("<") > -1)
  1121. {
  1122. if (Convert.ToDecimal(itemResult) >= Convert.ToDecimal(item_referenceRangeValue.Replace("<", "")))
  1123. {
  1124. //偏高
  1125. diagnosisFlag = "2";
  1126. }
  1127. }
  1128. if (diagnosisFlag == "2")
  1129. {
  1130. //偏高
  1131. if (item_ReferenceRange.UpperDiagnosisId != null)
  1132. {
  1133. var temp_diagnosis = await _diagnosisRepository.FirstOrDefaultAsync(m => m.Id == item_ReferenceRange.UpperDiagnosisId);
  1134. if (temp_diagnosis != null)
  1135. {
  1136. result = temp_diagnosis.DisplayName;
  1137. }
  1138. else
  1139. {
  1140. result = $"{item.DisplayName}偏高";
  1141. }
  1142. }
  1143. else
  1144. {
  1145. result = $"{item.DisplayName}偏高";
  1146. }
  1147. }
  1148. else if (diagnosisFlag == "0")
  1149. {
  1150. //偏低
  1151. if (item_ReferenceRange.LowerDiagnosisId != null)
  1152. {
  1153. var temp_diagnosis = await _diagnosisRepository.FirstOrDefaultAsync(m => m.Id == item_ReferenceRange.LowerDiagnosisId);
  1154. if (temp_diagnosis != null)
  1155. {
  1156. result = temp_diagnosis.DisplayName;
  1157. }
  1158. else
  1159. {
  1160. result = $"{item.DisplayName}偏低";
  1161. }
  1162. }
  1163. else
  1164. {
  1165. result = $"{item.DisplayName}偏低";
  1166. }
  1167. }
  1168. #endregion
  1169. return result;
  1170. }
  1171. /// <summary>
  1172. /// 动态编译代码 返回string
  1173. /// </summary>
  1174. /// <param name="input"></param>
  1175. /// <param name="DiagnosisFunctionCode"></param>
  1176. /// <param name="item_datas"></param>
  1177. /// <returns></returns>
  1178. private string GetCodeResult(GetDiagnosisResultRequestDto input, string DiagnosisFunctionCode, List<Item> item_datas)
  1179. {
  1180. string result = "";
  1181. string DiagnosisFunctionCode_Replace = ReplaceFunctionLabel(input, DiagnosisFunctionCode, item_datas);
  1182. //拼接动态代码
  1183. string code = @"
  1184. public class DiagnosisResultInAsbitemHeight
  1185. {
  1186. public string AutoDiagnosisResultInAsbitemHeight()
  1187. {
  1188. var msg="""";"
  1189. + DiagnosisFunctionCode_Replace + @"
  1190. return msg;
  1191. }
  1192. }";
  1193. CompileHelper compileHelper = new CompileHelper();
  1194. var assembly = compileHelper.GenerateAssemblyFromCode(code, Assembly.Load(new AssemblyName("System.Runtime")), typeof(object).Assembly);
  1195. if (assembly != null)
  1196. {
  1197. // 反射获取程序集中 的类
  1198. Type type = assembly.GetType("DiagnosisResultInAsbitemHeight");
  1199. // 创建该类的实例
  1200. object obj = Activator.CreateInstance(type);
  1201. var msg = type.InvokeMember("AutoDiagnosisResultInAsbitemHeight",
  1202. BindingFlags.Default | BindingFlags.InvokeMethod,
  1203. null,
  1204. obj,
  1205. null);
  1206. if (!string.IsNullOrEmpty(msg.ToString()))
  1207. {
  1208. result = msg.ToString();
  1209. }
  1210. }
  1211. return result;
  1212. }
  1213. /// <summary>
  1214. /// 替换函数中的标签
  1215. /// </summary>
  1216. /// <param name="input"></param>
  1217. /// <param name="DiagnosisFunctionCode"></param>
  1218. /// <param name="item_datas"></param>
  1219. /// <returns></returns>
  1220. private string ReplaceFunctionLabel(GetDiagnosisResultRequestDto input, string DiagnosisFunctionCode, List<Item> item_datas)
  1221. {
  1222. string tempcode = DiagnosisFunctionCode;
  1223. //替换诊断函数中的标签
  1224. foreach (var item in input.Items)
  1225. {
  1226. if (item.ItemId != null)
  1227. {
  1228. var itement = item_datas.Where(m => m.Id == item.ItemId).FirstOrDefault(); //查询项目信息
  1229. if (itement != null)
  1230. {
  1231. //根据项目的名称 替换对应传过来的值
  1232. tempcode = tempcode.Replace($"[{itement.DisplayName}]", item.Result);
  1233. }
  1234. }
  1235. }
  1236. if (tempcode.IndexOf('[') != -1)
  1237. {
  1238. throw new UserFriendlyException("函数中有未识别的语法");
  1239. }
  1240. return tempcode;
  1241. }
  1242. #endregion
  1243. #region 危急值函数 旧
  1244. ///// <summary>
  1245. ///// 获取人员是否有危急值项目
  1246. ///// 【优先处理组合项目危急值函数
  1247. ///// 未触发时执行项目危急值函数
  1248. ///// 未触发项目检索危急值关键字
  1249. ///// 未触发检索小结是否包含危急值关键字】
  1250. ///// </summary>
  1251. ///// <param name="doctorCheckDiagnosisInput"></param>
  1252. ///// <param name="resultDto"></param>
  1253. ///// <param name="criticalResultDto"></param>
  1254. ///// <returns></returns>
  1255. //public async Task<bool> GetPatientRegisterIsCriticalAsync(
  1256. // DoctorCheckDiagnosisInput doctorCheckDiagnosisInput,
  1257. // GetDiagnosisResultDto resultDto,
  1258. // GetCriticalResultDto criticalResultDto)
  1259. //{
  1260. // var isCritical = false;
  1261. // isCritical = GetAsbitemCriticalFunction(doctorCheckDiagnosisInput, criticalResultDto);
  1262. // var criticalFollowValueList = await _criticalFollowValueRepository.GetListAsync(m => m.CriticalFollowValueFlag == CriticalFollowValueFlag.Critical);
  1263. // //检索项目函数+关键字
  1264. // isCritical = GetItemCriticalFunction(doctorCheckDiagnosisInput, criticalFollowValueList, criticalResultDto);
  1265. // if (isCritical)
  1266. // {
  1267. // return isCritical;
  1268. // }
  1269. // //检索小结
  1270. // foreach (var diagnosisResult in resultDto.DiagnosisResultDetails)
  1271. // {
  1272. // isCritical = criticalFollowValueList.Count(m => diagnosisResult.DiagnosisResult.Contains(m.DisplayName)) > 0 ? true : false;
  1273. // if (isCritical)
  1274. // break;
  1275. // }
  1276. // return isCritical;
  1277. //}
  1278. ///// <summary>
  1279. ///// 获取人员是否有需要随访的项目
  1280. ///// 【优先处理组合项目随访函数
  1281. ///// 未触发时执行项目随访函数
  1282. ///// 未触发项目检索随访关键字
  1283. ///// 未触发检索小结是否包含随访关键字】
  1284. ///// </summary>
  1285. ///// <param name="doctorCheckDiagnosisInput"></param>
  1286. ///// <param name="resultDto"></param>
  1287. ///// <param name="criticalResultDtoList"></param>
  1288. ///// <returns></returns>
  1289. //public async Task<bool> GetPatientRegisterIsFollowUpAsync(
  1290. // DoctorCheckDiagnosisInput doctorCheckDiagnosisInput,
  1291. // GetDiagnosisResultDto resultDto,
  1292. // List<GetCriticalResultDto> criticalResultDtoList)
  1293. //{
  1294. // var isCritical = false;
  1295. // isCritical = GetAsbitemFollowUpFunction(doctorCheckDiagnosisInput, criticalResultDtoList);
  1296. // if (isCritical)
  1297. // {
  1298. // return isCritical;
  1299. // }
  1300. // var criticalFollowValueList = await _criticalFollowValueRepository.GetListAsync(m => m.CriticalFollowValueFlag == CriticalFollowValueFlag.FollowUp);
  1301. // //检索项目函数+关键字
  1302. // isCritical = GetItemFollowUpFunction(doctorCheckDiagnosisInput, criticalFollowValueList, criticalResultDtoList);
  1303. // if (isCritical)
  1304. // {
  1305. // return isCritical;
  1306. // }
  1307. // //检索小结
  1308. // foreach (var diagnosisResult in resultDto.DiagnosisResultDetails)
  1309. // {
  1310. // isCritical = criticalFollowValueList.Count(m => diagnosisResult.DiagnosisResult.Contains(m.DisplayName)) > 0 ? true : false;
  1311. // if (isCritical)
  1312. // break;
  1313. // }
  1314. // return isCritical;
  1315. //}
  1316. ///// <summary>
  1317. ///// 组合项目危急值函数
  1318. ///// </summary>
  1319. ///// <param name="doctorCheckDiagnosisInput"></param>
  1320. ///// <param name="criticalResultDto"></param>
  1321. ///// <returns></returns>
  1322. //private bool GetAsbitemCriticalFunction(DoctorCheckDiagnosisInput doctorCheckDiagnosisInput, GetCriticalResultDto criticalResultDto)
  1323. //{
  1324. // bool isCritical = false;
  1325. // var patientAsbitemDiagnosisInput = new PatientAsbitemDiagnosisInput()
  1326. // {
  1327. // SexName = doctorCheckDiagnosisInput.SexName,
  1328. // Age = doctorCheckDiagnosisInput.Age
  1329. // };
  1330. // foreach (var item in doctorCheckDiagnosisInput.Items)
  1331. // {
  1332. // var itemResult = new ItemResultInput()
  1333. // {
  1334. // ItemId = item.ItemId,
  1335. // ItemName = item.ItemName,
  1336. // Result = item.Result
  1337. // };
  1338. // patientAsbitemDiagnosisInput.Items.Add(itemResult);
  1339. // }
  1340. // var diagnosisBuilder = new DiagnosisBuilder();
  1341. // foreach (var asbitem in doctorCheckDiagnosisInput.Asbitems)
  1342. // {
  1343. // if (asbitem.IsCriticalValueFunction == 'Y' && !string.IsNullOrWhiteSpace(asbitem.CriticalValueFunction))
  1344. // {
  1345. // isCritical = diagnosisBuilder.GetAsbitemCriticalResult(patientAsbitemDiagnosisInput, asbitem.DiagnosisFunction);
  1346. // if (isCritical)
  1347. // {
  1348. // UpdateRegisterCheckCriticalResult(criticalResultDto, asbitem.RegisterCheckId, 'Y', 'Y', "");
  1349. // //await CreateRegisterCheckCritical(asbitem.RegisterCheckId, 'Y', "");
  1350. // break;
  1351. // }
  1352. // else
  1353. // {
  1354. // UpdateRegisterCheckCriticalResult(criticalResultDto, asbitem.RegisterCheckId, 'N', null, "");
  1355. // }
  1356. // }
  1357. // }
  1358. // return isCritical;
  1359. //}
  1360. ///// <summary>
  1361. ///// 项目危急值函数
  1362. ///// </summary>
  1363. ///// <param name="doctorCheckDiagnosisInput"></param>
  1364. ///// <param name="criticalFollowValueList"></param>
  1365. ///// <param name="criticalResultDtoList"></param>
  1366. ///// <returns></returns>
  1367. //private bool GetItemCriticalFunction(
  1368. // DoctorCheckDiagnosisInput doctorCheckDiagnosisInput,
  1369. // List<CriticalFollowValue> criticalFollowValueList,
  1370. // List<GetCriticalResultDto> criticalResultDtoList
  1371. // )
  1372. //{
  1373. // bool isCritical = false;
  1374. // var patientItemDiagnosisInput = new PatientItemDiagnosisInput()
  1375. // {
  1376. // SexName = doctorCheckDiagnosisInput.SexName,
  1377. // Age = doctorCheckDiagnosisInput.Age
  1378. // };
  1379. // var diagnosisBuilder = new DiagnosisBuilder();
  1380. // foreach (var item in doctorCheckDiagnosisInput.Items)
  1381. // {
  1382. // if (string.IsNullOrWhiteSpace(item.Result))
  1383. // {
  1384. // continue;
  1385. // }
  1386. // if (item.IsCriticalValueFunction == 'Y' && !string.IsNullOrWhiteSpace(item.CriticalValueFunction))
  1387. // {
  1388. // var itemResult = new ItemResultInput()
  1389. // {
  1390. // ItemId = item.ItemId,
  1391. // ItemName = item.ItemName,
  1392. // Result = item.Result
  1393. // };
  1394. // patientItemDiagnosisInput.Item = itemResult;
  1395. // isCritical = diagnosisBuilder.GetItemCriticalResult(patientItemDiagnosisInput, item.CriticalValueFunction);
  1396. // if (isCritical)
  1397. // {
  1398. // UpdateRegisterCheckItemCriticalResult(criticalResultDtoList, item.RegisterCheckId, item.ItemId, 'Y', 'Y', "");
  1399. // //await CreateRegisterCheckItemCritical(item.RegisterCheckId, item.ItemId, 'Y', "");
  1400. // break;
  1401. // }
  1402. // else
  1403. // {
  1404. // UpdateRegisterCheckItemCriticalResult(criticalResultDtoList, item.RegisterCheckId, item.ItemId, 'N', null, "");
  1405. // }
  1406. // }
  1407. // #region 执行项目参考范围
  1408. // var referenceRange = item.ReferenceRanges.Where(o => o.ForSexId == doctorCheckDiagnosisInput.SexId && doctorCheckDiagnosisInput.Age >= o.AgeLowerLimit && doctorCheckDiagnosisInput.Age <= o.AgeUpperLimit).FirstOrDefault();
  1409. // if (referenceRange == null)
  1410. // {
  1411. // referenceRange = item.ReferenceRanges.Where(o => o.ForSexId == ForSexFlag.All && doctorCheckDiagnosisInput.Age >= o.AgeLowerLimit && doctorCheckDiagnosisInput.Age <= o.AgeUpperLimit).FirstOrDefault();
  1412. // if (referenceRange != null && !string.IsNullOrWhiteSpace(referenceRange.CriticalRangeValue))
  1413. // {
  1414. // isCritical = _registerCheckItemManager.GetNumberResultIsCritical(item.Result, referenceRange.CriticalRangeValue);
  1415. // if (isCritical)
  1416. // {
  1417. // UpdateRegisterCheckItemCriticalResult(criticalResultDtoList, item.RegisterCheckId, item.ItemId, 'Y', 'Y', referenceRange.CriticalRangeValue);
  1418. // //await CreateRegisterCheckItemCritical(item.RegisterCheckId, item.ItemId, 'Y', "");
  1419. // break;
  1420. // }
  1421. // else
  1422. // {
  1423. // UpdateRegisterCheckItemCriticalResult(criticalResultDtoList, item.RegisterCheckId, item.ItemId, 'N', null, "");
  1424. // }
  1425. // }
  1426. // }
  1427. // #endregion
  1428. // var isCriticalFollowValue = criticalFollowValueList.FirstOrDefault(m => item.Result.Contains(m.DisplayName));
  1429. // //关键字检索
  1430. // if (isCriticalFollowValue != null)
  1431. // {
  1432. // isCritical = true;
  1433. // }
  1434. // if (isCritical)
  1435. // {
  1436. // UpdateRegisterCheckItemCriticalResult(criticalResultDtoList, item.RegisterCheckId, item.ItemId, 'Y', 'Y', isCriticalFollowValue.DisplayName);
  1437. // //await CreateRegisterCheckItemCritical(item.RegisterCheckId, item.ItemId, 'Y', isCriticalFollowValue.DisplayName);
  1438. // break;
  1439. // }
  1440. // else
  1441. // {
  1442. // UpdateRegisterCheckItemCriticalResult(criticalResultDtoList, item.RegisterCheckId, item.ItemId, 'N', null, "");
  1443. // }
  1444. // }
  1445. // return isCritical;
  1446. //}
  1447. ///// <summary>
  1448. ///// 组合项目随访函数
  1449. ///// </summary>
  1450. ///// <param name="doctorCheckDiagnosisInput"></param>
  1451. ///// <param name="criticalResultDtoList"></param>
  1452. ///// <returns></returns>
  1453. //private bool GetAsbitemFollowUpFunction(DoctorCheckDiagnosisInput doctorCheckDiagnosisInput, List<GetCriticalResultDto> criticalResultDtoList)
  1454. //{
  1455. // bool isFollowUp = false;
  1456. // var patientAsbitemDiagnosisInput = new PatientAsbitemDiagnosisInput()
  1457. // {
  1458. // SexName = doctorCheckDiagnosisInput.SexName,
  1459. // Age = doctorCheckDiagnosisInput.Age
  1460. // };
  1461. // foreach (var item in doctorCheckDiagnosisInput.Items)
  1462. // {
  1463. // var itemResult = new ItemResultInput()
  1464. // {
  1465. // ItemId = item.ItemId,
  1466. // ItemName = item.ItemName,
  1467. // Result = item.Result
  1468. // };
  1469. // patientAsbitemDiagnosisInput.Items.Add(itemResult);
  1470. // }
  1471. // var diagnosisBuilder = new DiagnosisBuilder();
  1472. // foreach (var asbitem in doctorCheckDiagnosisInput.Asbitems)
  1473. // {
  1474. // if (asbitem.IsFollowUpFunction == 'Y' && !string.IsNullOrWhiteSpace(asbitem.FollowUpFunction))
  1475. // {
  1476. // isFollowUp = diagnosisBuilder.GetAsbitemFollowUpResult(patientAsbitemDiagnosisInput, asbitem.DiagnosisFunction);
  1477. // if (isFollowUp)
  1478. // {
  1479. // UpdateRegisterCheckCriticalResult(criticalResultDtoList, asbitem.RegisterCheckId, null, 'Y', "");
  1480. // //await CreateRegisterCheckCritical(asbitem.RegisterCheckId, 'Y', "");
  1481. // break;
  1482. // }
  1483. // else
  1484. // {
  1485. // UpdateRegisterCheckCriticalResult(criticalResultDtoList, asbitem.RegisterCheckId, null, 'N', "");
  1486. // }
  1487. // }
  1488. // }
  1489. // return isFollowUp;
  1490. //}
  1491. ///// <summary>
  1492. ///// 项目随访函数
  1493. ///// </summary>
  1494. ///// <param name="doctorCheckDiagnosisInput"></param>
  1495. ///// <param name="criticalFollowValueList"></param>
  1496. ///// <param name="criticalResultDtoList"></param>
  1497. ///// <returns></returns>
  1498. //private bool GetItemFollowUpFunction(
  1499. // DoctorCheckDiagnosisInput doctorCheckDiagnosisInput,
  1500. // List<CriticalFollowValue> criticalFollowValueList,
  1501. // List<GetCriticalResultDto> criticalResultDtoList
  1502. // )
  1503. //{
  1504. // bool isFollowUp = false;
  1505. // var patientItemDiagnosisInput = new PatientItemDiagnosisInput()
  1506. // {
  1507. // SexName = doctorCheckDiagnosisInput.SexName,
  1508. // Age = doctorCheckDiagnosisInput.Age
  1509. // };
  1510. // var diagnosisBuilder = new DiagnosisBuilder();
  1511. // foreach (var item in doctorCheckDiagnosisInput.Items)
  1512. // {
  1513. // if (string.IsNullOrWhiteSpace(item.Result))
  1514. // {
  1515. // continue;
  1516. // }
  1517. // if (item.IsFollowUpFunction == 'Y' && !string.IsNullOrWhiteSpace(item.FollowUpFunction))
  1518. // {
  1519. // var itemResult = new ItemResultInput()
  1520. // {
  1521. // ItemId = item.ItemId,
  1522. // ItemName = item.ItemName,
  1523. // Result = item.Result
  1524. // };
  1525. // patientItemDiagnosisInput.Item = itemResult;
  1526. // isFollowUp = diagnosisBuilder.GetItemFollowUpResult(patientItemDiagnosisInput, item.FollowUpFunction);
  1527. // if (isFollowUp)
  1528. // {
  1529. // UpdateRegisterCheckItemCriticalResult(criticalResultDtoList, item.RegisterCheckId, item.ItemId, null, 'Y', "");
  1530. // // await CreateRegisterCheckItemCritical(item.RegisterCheckId, item.ItemId, 'N', "");
  1531. // break;
  1532. // }
  1533. // else
  1534. // {
  1535. // UpdateRegisterCheckItemCriticalResult(criticalResultDtoList, item.RegisterCheckId, item.ItemId, null, 'N', "");
  1536. // }
  1537. // }
  1538. // #region 执行项目参考范围
  1539. // var referenceRange = item.ReferenceRanges.Where(o => o.ForSexId == doctorCheckDiagnosisInput.SexId && doctorCheckDiagnosisInput.Age >= o.AgeLowerLimit && doctorCheckDiagnosisInput.Age <= o.AgeUpperLimit).FirstOrDefault();
  1540. // if (referenceRange == null)
  1541. // {
  1542. // referenceRange = item.ReferenceRanges.Where(o => o.ForSexId == ForSexFlag.All && doctorCheckDiagnosisInput.Age >= o.AgeLowerLimit && doctorCheckDiagnosisInput.Age <= o.AgeUpperLimit).FirstOrDefault();
  1543. // if (referenceRange != null && !string.IsNullOrWhiteSpace(referenceRange.FollowUpRangeValue))
  1544. // {
  1545. // isFollowUp = _registerCheckItemManager.GetNumberResultIsFollow(item.Result, referenceRange.FollowUpRangeValue);
  1546. // if (isFollowUp)
  1547. // {
  1548. // UpdateRegisterCheckItemCriticalResult(criticalResultDtoList, item.RegisterCheckId, item.ItemId, null, 'Y', referenceRange.FollowUpRangeValue);
  1549. // //await CreateRegisterCheckItemCritical(item.RegisterCheckId, item.ItemId, 'N', referenceRange.FollowUpRangeValue);
  1550. // break;
  1551. // }
  1552. // else
  1553. // {
  1554. // UpdateRegisterCheckItemCriticalResult(criticalResultDtoList, item.RegisterCheckId, item.ItemId, null, 'N', "");
  1555. // }
  1556. // }
  1557. // }
  1558. // #endregion
  1559. // var isCriticalFollowValue = criticalFollowValueList.FirstOrDefault(m => item.Result.Contains(m.DisplayName));
  1560. // if (isCriticalFollowValue != null)
  1561. // {
  1562. // isFollowUp = true;
  1563. // }
  1564. // if (isFollowUp)
  1565. // {
  1566. // UpdateRegisterCheckItemCriticalResult(criticalResultDtoList, item.RegisterCheckId, item.ItemId, null, 'Y', isCriticalFollowValue.DisplayName);
  1567. // // await CreateRegisterCheckItemCritical(item.RegisterCheckId, item.ItemId, 'N', isCriticalFollowValue.DisplayName);
  1568. // break;
  1569. // }
  1570. // else
  1571. // {
  1572. // UpdateRegisterCheckItemCriticalResult(criticalResultDtoList, item.RegisterCheckId, item.ItemId, null, 'N', "");
  1573. // }
  1574. // }
  1575. // return isFollowUp;
  1576. //}
  1577. ///// <summary>
  1578. ///// 生成危急值标记、随访记录
  1579. ///// </summary>
  1580. ///// <param name="patientRegisterId"></param>
  1581. //private async Task CreateFollowUpAsync(Guid patientRegisterId)
  1582. //{
  1583. // var isFollowUp = await _followUpRepository.FirstOrDefaultAsync(f => f.PatientRegisterId == patientRegisterId);
  1584. // if (isFollowUp == null)
  1585. // {
  1586. // var followUpEnt = new FollowUp
  1587. // {
  1588. // IsPhoneComplete = 'N',
  1589. // IsSmsComplete = 'N',
  1590. // PatientRegisterId = patientRegisterId
  1591. // };
  1592. // await _followUpRepository.InsertAsync(followUpEnt);
  1593. // }
  1594. //}
  1595. ///// <summary>
  1596. ///// 生成明细表危急值相关数据
  1597. ///// </summary>
  1598. ///// <param name="registerCheckId"></param>
  1599. ///// <param name="itemId"></param>
  1600. ///// <param name="isCriticalValue"></param>
  1601. ///// <param name="isFollowUp"></param>
  1602. ///// <param name="CriticalRangeValue"></param>
  1603. ///// <returns></returns>
  1604. //private async Task CreateRegisterCheckItemCritical(Guid registerCheckId, Guid itemId, char? isCriticalValue, char? isFollowUp, string CriticalRangeValue)
  1605. //{
  1606. // var registerCheckItemEnt = await _registerCheckItemRepository.FirstOrDefaultAsync(m => m.RegisterCheckId == registerCheckId
  1607. // && m.ItemId == itemId);
  1608. // if (registerCheckItemEnt != null)
  1609. // {
  1610. // registerCheckItemEnt.CriticalRangeValue = CriticalRangeValue;
  1611. // registerCheckItemEnt.IsCriticalValue = isCriticalValue;
  1612. // if (isCriticalValue == 'Y')
  1613. // {
  1614. // registerCheckItemEnt.CriticalValueCreatorId = _currentUser.Id;
  1615. // registerCheckItemEnt.CriticalValueCreationTime = DateTime.Now;
  1616. // }
  1617. // if (isFollowUp == 'Y')
  1618. // {
  1619. // registerCheckItemEnt.FollowUpCreatorId = _currentUser.Id;
  1620. // registerCheckItemEnt.FollowUpCreationTime = DateTime.Now;
  1621. // }
  1622. // //registerCheckItemEnt.IsCriticalValueAudit = 'N';
  1623. // //registerCheckItemEnt.IsReview = 'N';
  1624. // registerCheckItemEnt.IsFollowUp = isFollowUp;
  1625. // await _registerCheckItemRepository.UpdateAsync(registerCheckItemEnt);
  1626. // }
  1627. //}
  1628. ///// <summary>
  1629. ///// 生成registerCheck表危急值相关数据
  1630. ///// </summary>
  1631. ///// <param name="registerCheckId"></param>
  1632. ///// <param name="isCriticalValue"></param>
  1633. ///// <param name="isFollowUp"></param>
  1634. ///// <param name="CriticalRangeValue"></param>
  1635. ///// <returns></returns>
  1636. //private async Task CreateRegisterCheckCritical(Guid registerCheckId, char? isCriticalValue, char? isFollowUp, string CriticalRangeValue)
  1637. //{
  1638. // var registerCheckEnt = await _registerCheckRepository.FirstOrDefaultAsync(m => m.Id == registerCheckId);
  1639. // if (registerCheckEnt != null)
  1640. // {
  1641. // registerCheckEnt.CriticalRangeValue = CriticalRangeValue;
  1642. // if (isCriticalValue == 'Y')
  1643. // {
  1644. // registerCheckEnt.CriticalValueCreatorId = _currentUser.Id;
  1645. // registerCheckEnt.CriticalValueCreationTime = DateTime.Now;
  1646. // registerCheckEnt.IsCriticalValue = isCriticalValue;
  1647. // }
  1648. // if (isFollowUp == 'Y')
  1649. // {
  1650. // registerCheckEnt.FollowUpCreatorId = _currentUser.Id;
  1651. // registerCheckEnt.FollowUpCreationTime = DateTime.Now;
  1652. // }
  1653. // //registerCheckEnt.IsCriticalValueAudit = 'N';
  1654. // //registerCheckEnt.IsReview = 'N';
  1655. // registerCheckEnt.IsFollowUp = isFollowUp;
  1656. // await _registerCheckRepository.UpdateAsync(registerCheckEnt);
  1657. // }
  1658. //}
  1659. ///// <summary>
  1660. ///// 临时更新危急值状态 registerCheck
  1661. ///// </summary>
  1662. ///// <param name="criticalResultDto"></param>
  1663. ///// <param name="registerCheckId"></param>
  1664. ///// <param name="isCritical"></param>
  1665. ///// <param name="isFollowUp"></param>
  1666. ///// <param name="criticalRangeValue"></param>
  1667. //private void UpdateRegisterCheckCriticalResult(GetCriticalResultDto criticalResultDto, Guid registerCheckId, char? isCritical, char? isFollowUp, string criticalRangeValue)
  1668. //{
  1669. // if (criticalResultDto.AsbitemDetails.Where(m => m.RegisterCheckId == registerCheckId).Count() == 0)
  1670. // {
  1671. // criticalResultDtoList.Add(new GetCriticalResultDto
  1672. // {
  1673. // RegisterCheckId = registerCheckId
  1674. // });
  1675. // }
  1676. // else
  1677. // {
  1678. // foreach (var criticalResultDto in criticalResultDtoList)
  1679. // {
  1680. // if (criticalResultDto.RegisterCheckId == registerCheckId)
  1681. // {
  1682. // if (isCritical != null && criticalResultDto.IsCritical != 'Y')
  1683. // {
  1684. // criticalResultDto.IsCritical = isCritical;
  1685. // }
  1686. // if (isFollowUp != null && criticalResultDto.IsFollowUp != 'Y')
  1687. // {
  1688. // criticalResultDto.IsFollowUp = isFollowUp;
  1689. // }
  1690. // if (!string.IsNullOrWhiteSpace(criticalRangeValue))
  1691. // {
  1692. // criticalResultDto.CriticalRangeValue = criticalRangeValue;
  1693. // }
  1694. // }
  1695. // }
  1696. // }
  1697. //}
  1698. ///// <summary>
  1699. ///// 临时更新危急值状态 registerCheckItem
  1700. ///// </summary>
  1701. ///// <param name="criticalResultDtoList"></param>
  1702. ///// <param name="registerCheckId"></param>
  1703. ///// <param name="itemId"></param>
  1704. ///// <param name="isCritical"></param>
  1705. ///// <param name="isFollowUp"></param>
  1706. ///// <param name="criticalRangeValue"></param>
  1707. //private void UpdateRegisterCheckItemCriticalResult(List<GetCriticalResultDto> criticalResultDtoList, Guid registerCheckId, Guid itemId, char? isCritical, char? isFollowUp, string criticalRangeValue)
  1708. //{
  1709. // //先增加registerCheck
  1710. // if (criticalResultDtoList.Where(m => m.RegisterCheckId == registerCheckId).Count() == 0)
  1711. // {
  1712. // criticalResultDtoList.Add(new GetCriticalResultDto
  1713. // {
  1714. // RegisterCheckId = registerCheckId
  1715. // });
  1716. // }
  1717. // foreach (var criticalResultDto in criticalResultDtoList)
  1718. // {
  1719. // if (criticalResultDto.RegisterCheckId == registerCheckId)
  1720. // {
  1721. // if (criticalResultDto.ItemDetails.Where(m => m.ItemId == itemId).Count() == 0)
  1722. // {
  1723. // var itemCriticalResultDto = new GetItemCriticalResultDto();
  1724. // itemCriticalResultDto.RegisterCheckId = registerCheckId;
  1725. // itemCriticalResultDto.ItemId = itemId;
  1726. // if (isFollowUp != null && itemCriticalResultDto.IsFollowUp != 'Y')
  1727. // {
  1728. // itemCriticalResultDto.IsFollowUp = isFollowUp;
  1729. // }
  1730. // if (isCritical != null && itemCriticalResultDto.IsCritical != 'Y')
  1731. // {
  1732. // itemCriticalResultDto.IsCritical = isCritical;
  1733. // }
  1734. // if (!string.IsNullOrWhiteSpace(criticalRangeValue))
  1735. // {
  1736. // itemCriticalResultDto.CriticalRangeValue = criticalRangeValue;
  1737. // }
  1738. // criticalResultDto.ItemDetails.Add(itemCriticalResultDto);
  1739. // }
  1740. // else
  1741. // {
  1742. // foreach (var itemCriticalResultDto in criticalResultDto.ItemDetails)
  1743. // {
  1744. // if (itemCriticalResultDto.ItemId == itemId)
  1745. // {
  1746. // itemCriticalResultDto.RegisterCheckId = registerCheckId;
  1747. // itemCriticalResultDto.ItemId = itemId;
  1748. // if (isFollowUp != null && itemCriticalResultDto.IsFollowUp != 'Y')
  1749. // {
  1750. // itemCriticalResultDto.IsFollowUp = isFollowUp;
  1751. // }
  1752. // if (isCritical != null && itemCriticalResultDto.IsCritical != 'Y')
  1753. // {
  1754. // itemCriticalResultDto.IsCritical = isCritical;
  1755. // }
  1756. // if (!string.IsNullOrWhiteSpace(criticalRangeValue))
  1757. // {
  1758. // itemCriticalResultDto.CriticalRangeValue = criticalRangeValue;
  1759. // }
  1760. // }
  1761. // }
  1762. // }
  1763. // }
  1764. // }
  1765. //}
  1766. ///// <summary>
  1767. ///// 处理危急值记录
  1768. ///// </summary>
  1769. ///// <param name="criticalResultDtoList"></param>
  1770. ///// <param name="patientRegisterId"></param>
  1771. ///// <returns></returns>
  1772. //private async Task HandCriticalResult(List<GetCriticalResultDto> criticalResultDtoList, Guid patientRegisterId)
  1773. //{
  1774. // bool isCreateFollowUp = false;
  1775. // foreach (var criticalResultDto in criticalResultDtoList)
  1776. // {
  1777. // foreach (var itemCriticalResultDto in criticalResultDto.ItemDetails)
  1778. // {
  1779. // if (itemCriticalResultDto.IsCritical == 'Y' || itemCriticalResultDto.IsFollowUp == 'Y')
  1780. // {
  1781. // isCreateFollowUp = true;
  1782. // if (itemCriticalResultDto.IsCritical == 'Y')
  1783. // {
  1784. // criticalResultDto.IsCritical = itemCriticalResultDto.IsCritical;
  1785. // }
  1786. // if (itemCriticalResultDto.IsFollowUp == 'Y')
  1787. // {
  1788. // criticalResultDto.IsFollowUp = itemCriticalResultDto.IsFollowUp;
  1789. // }
  1790. // }
  1791. // await CreateRegisterCheckItemCritical(itemCriticalResultDto.RegisterCheckId, itemCriticalResultDto.ItemId, itemCriticalResultDto.IsCritical, itemCriticalResultDto.IsFollowUp, itemCriticalResultDto.CriticalRangeValue);
  1792. // }
  1793. // if (criticalResultDto.IsCritical == 'Y' || criticalResultDto.IsFollowUp == 'Y')
  1794. // {
  1795. // isCreateFollowUp = true;
  1796. // }
  1797. // await CreateRegisterCheckCritical(criticalResultDto.RegisterCheckId, criticalResultDto.IsCritical, criticalResultDto.IsFollowUp, criticalResultDto.CriticalRangeValue);
  1798. // }
  1799. // if (isCreateFollowUp)
  1800. // {
  1801. // //增加随访主表记录
  1802. // await _followUpAppService.CreateAsync(new PatientRegisterIdInputDto
  1803. // {
  1804. // PatientRegisterId = patientRegisterId
  1805. // });
  1806. // }
  1807. // else
  1808. // {
  1809. // //删除随访表记录
  1810. // await _followUpAppService.DeleteByPatientRegisterId(new PatientRegisterIdInputDto
  1811. // {
  1812. // PatientRegisterId = patientRegisterId
  1813. // });
  1814. // }
  1815. //}
  1816. #endregion
  1817. #region 危急值函数相关方法 新
  1818. #region 组合项目
  1819. /// <summary>
  1820. /// 获取人员组合项目是否有危急值、随访项目
  1821. /// 【优先处理组合项目危急值、随访函数
  1822. /// 未触发检索小结是否包含危急值关键字】
  1823. /// </summary>
  1824. /// <param name="doctorCheckDiagnosisInput"></param>
  1825. /// <param name="resultDto"></param>
  1826. /// <param name="criticalResultDto"></param>
  1827. /// <returns></returns>
  1828. public async Task GetPatientRegisterAsbitemIsCriticalAsync(
  1829. DoctorCheckDiagnosisInput doctorCheckDiagnosisInput,
  1830. GetDiagnosisResultDto resultDto,
  1831. GetCriticalResultDto criticalResultDto)
  1832. {
  1833. GetAsbitemCriticalFunction(doctorCheckDiagnosisInput, criticalResultDto);
  1834. var criticalFollowValueList = await _criticalFollowValueRepository.GetListAsync();
  1835. //检索小结
  1836. foreach (var diagnosisResult in resultDto.DiagnosisResultDetails)
  1837. {
  1838. var isCritical = false;
  1839. var isFollowUp = false;
  1840. if (!isCritical)
  1841. {
  1842. var criticalKeyCount = criticalFollowValueList.Count(m => m.CriticalFollowValueFlag == CriticalFollowValueFlag.Critical
  1843. && diagnosisResult.DiagnosisResult.Contains(m.DisplayName));
  1844. if (criticalKeyCount > 0)
  1845. {
  1846. isCritical = true;
  1847. isFollowUp = true;
  1848. UpdateRegisterCheckCriticalResult(criticalResultDto, doctorCheckDiagnosisInput.Asbitems.FirstOrDefault().RegisterCheckId, 'Y', 'Y', diagnosisResult.DiagnosisResult, "");
  1849. }
  1850. }
  1851. if (!isFollowUp)
  1852. {
  1853. var followUpKeyCount = criticalFollowValueList.Count(m => m.CriticalFollowValueFlag == CriticalFollowValueFlag.FollowUp
  1854. && diagnosisResult.DiagnosisResult.Contains(m.DisplayName));
  1855. if (followUpKeyCount > 0)
  1856. {
  1857. isFollowUp = true;
  1858. UpdateRegisterCheckCriticalResult(criticalResultDto, doctorCheckDiagnosisInput.Asbitems.FirstOrDefault().RegisterCheckId, null, 'Y', diagnosisResult.DiagnosisResult, "");
  1859. }
  1860. }
  1861. }
  1862. }
  1863. /// <summary>
  1864. /// 组合项目危急值、随访函数
  1865. /// </summary>
  1866. /// <param name="doctorCheckDiagnosisInput"></param>
  1867. /// <param name="criticalResultDto"></param>
  1868. private void GetAsbitemCriticalFunction(DoctorCheckDiagnosisInput doctorCheckDiagnosisInput, GetCriticalResultDto criticalResultDto)
  1869. {
  1870. var patientAsbitemDiagnosisInput = new PatientAsbitemDiagnosisInput()
  1871. {
  1872. SexName = doctorCheckDiagnosisInput.SexName,
  1873. Age = doctorCheckDiagnosisInput.Age
  1874. };
  1875. foreach (var item in doctorCheckDiagnosisInput.Items)
  1876. {
  1877. var itemResult = new ItemResultInput()
  1878. {
  1879. ItemId = item.ItemId,
  1880. ItemName = item.ItemName,
  1881. Result = item.Result
  1882. };
  1883. patientAsbitemDiagnosisInput.Items.Add(itemResult);
  1884. }
  1885. var diagnosisBuilder = new DiagnosisBuilder();
  1886. foreach (var asbitem in doctorCheckDiagnosisInput.Asbitems)
  1887. {
  1888. var isCritical = false;
  1889. if (asbitem.IsCriticalValueFunction == 'Y' && !string.IsNullOrWhiteSpace(asbitem.CriticalValueFunction))
  1890. {
  1891. var isCriticalTemp = diagnosisBuilder.GetAsbitemCriticalResult(patientAsbitemDiagnosisInput, asbitem.CriticalValueFunction);
  1892. if (isCriticalTemp)
  1893. {
  1894. isCritical = true;
  1895. UpdateRegisterCheckCriticalResult(criticalResultDto, asbitem.RegisterCheckId, 'Y', 'Y', "", "");
  1896. break;
  1897. }
  1898. }
  1899. if (asbitem.IsFollowUpFunction == 'Y' && !string.IsNullOrWhiteSpace(asbitem.FollowUpFunction) && !isCritical)
  1900. {
  1901. var isFollowUpTemp = diagnosisBuilder.GetAsbitemFollowUpResult(patientAsbitemDiagnosisInput, asbitem.FollowUpFunction);
  1902. if (isFollowUpTemp)
  1903. {
  1904. UpdateRegisterCheckCriticalResult(criticalResultDto, asbitem.RegisterCheckId, null, 'Y', "", "");
  1905. }
  1906. }
  1907. }
  1908. }
  1909. #endregion
  1910. #region 明细项目
  1911. /// <summary>
  1912. /// 获取人员项目是否有危急值、随访项目
  1913. /// 【优先处理项目危急值、随访函数
  1914. /// 未触发时执行项目参考范围
  1915. /// 未触发项目检索危急值、随访关键字】
  1916. /// </summary>
  1917. /// <param name="doctorCheckDiagnosisInput"></param>
  1918. /// <param name="resultDto"></param>
  1919. /// <param name="criticalResultDto"></param>
  1920. /// <returns></returns>
  1921. public async Task GetPatientRegisterItemIsCriticalAsync(
  1922. DoctorCheckDiagnosisInput doctorCheckDiagnosisInput,
  1923. GetDiagnosisResultDto resultDto,
  1924. GetCriticalResultDto criticalResultDto)
  1925. {
  1926. await GetItemCriticalFunction(doctorCheckDiagnosisInput, criticalResultDto);
  1927. }
  1928. /// <summary>
  1929. /// 项目危急值、随访函数
  1930. /// </summary>
  1931. /// <param name="doctorCheckDiagnosisInput"></param>
  1932. /// <param name="criticalResultDto"></param>
  1933. /// <returns></returns>
  1934. private async Task GetItemCriticalFunction(
  1935. DoctorCheckDiagnosisInput doctorCheckDiagnosisInput,
  1936. GetCriticalResultDto criticalResultDto
  1937. )
  1938. {
  1939. var patientItemDiagnosisInput = new PatientItemDiagnosisInput()
  1940. {
  1941. SexName = doctorCheckDiagnosisInput.SexName,
  1942. Age = doctorCheckDiagnosisInput.Age
  1943. };
  1944. var diagnosisBuilder = new DiagnosisBuilder();
  1945. var criticalFollowValueList = await _criticalFollowValueRepository.GetListAsync();
  1946. foreach (var item in doctorCheckDiagnosisInput.Items)
  1947. {
  1948. var isCritical = false;
  1949. var isFollowUp = false;
  1950. if (string.IsNullOrWhiteSpace(item.Result))
  1951. {
  1952. continue;
  1953. }
  1954. var itemResult = new ItemResultInput()
  1955. {
  1956. ItemId = item.ItemId,
  1957. ItemName = item.ItemName,
  1958. Result = item.Result
  1959. };
  1960. patientItemDiagnosisInput.Item = itemResult;
  1961. #region 危急值函数
  1962. if (item.IsCriticalValueFunction == 'Y' && !string.IsNullOrWhiteSpace(item.CriticalValueFunction))
  1963. {
  1964. var isCriticalTemp = diagnosisBuilder.GetItemCriticalResult(patientItemDiagnosisInput, item.CriticalValueFunction);
  1965. if (isCriticalTemp)
  1966. {
  1967. isCritical = true;
  1968. isFollowUp = true;
  1969. UpdateRegisterCheckItemCriticalResult(criticalResultDto, item.RegisterCheckId, item.ItemId, 'Y', 'Y', "", "");
  1970. continue;
  1971. }
  1972. }
  1973. #endregion
  1974. #region 随访函数
  1975. if (item.IsFollowUpFunction == 'Y' && !string.IsNullOrWhiteSpace(item.FollowUpFunction) && !isFollowUp)
  1976. {
  1977. var isFollowUpTemp = diagnosisBuilder.GetItemCriticalResult(patientItemDiagnosisInput, item.FollowUpFunction);
  1978. if (isFollowUpTemp)
  1979. {
  1980. isFollowUp = true;
  1981. UpdateRegisterCheckItemCriticalResult(criticalResultDto, item.RegisterCheckId, item.ItemId, null, 'Y', "", "");
  1982. }
  1983. }
  1984. #endregion
  1985. #region 执行项目参考范围
  1986. var referenceRange = item.ReferenceRanges.Where(o => o.ForSexId == doctorCheckDiagnosisInput.SexId && doctorCheckDiagnosisInput.Age >= o.AgeLowerLimit && doctorCheckDiagnosisInput.Age <= o.AgeUpperLimit).FirstOrDefault();
  1987. if (referenceRange == null)
  1988. {
  1989. referenceRange = item.ReferenceRanges.Where(o => o.ForSexId == ForSexFlag.All && doctorCheckDiagnosisInput.Age >= o.AgeLowerLimit && doctorCheckDiagnosisInput.Age <= o.AgeUpperLimit).FirstOrDefault();
  1990. }
  1991. if (referenceRange != null && !string.IsNullOrWhiteSpace(referenceRange.CriticalRangeValue) && !isCritical)
  1992. {
  1993. var isCriticalTemp = _registerCheckItemManager.GetNumberResultIsCritical(item.Result, referenceRange.CriticalRangeValue);
  1994. if (isCriticalTemp)
  1995. {
  1996. isCritical = true;
  1997. isFollowUp = true;
  1998. string criticalValueContent = $"{item.ItemName}异常(结果{item.Result} {item.Unit},危急值范围{referenceRange.CriticalRangeValue})";
  1999. UpdateRegisterCheckItemCriticalResult(criticalResultDto, item.RegisterCheckId, item.ItemId, 'Y', 'Y', referenceRange.CriticalRangeValue, criticalValueContent);
  2000. continue;
  2001. }
  2002. }
  2003. if (referenceRange != null && !string.IsNullOrWhiteSpace(referenceRange.FollowUpRangeValue) && !isFollowUp)
  2004. {
  2005. var isFollowUpTemp = _registerCheckItemManager.GetNumberResultIsCritical(item.Result, referenceRange.FollowUpRangeValue);
  2006. if (isFollowUpTemp)
  2007. {
  2008. isFollowUp = true;
  2009. string criticalValueContent = $"{item.ItemName}异常(结果{item.Result} {item.Unit},随访范围{referenceRange.FollowUpRangeValue})";
  2010. UpdateRegisterCheckItemCriticalResult(criticalResultDto, item.RegisterCheckId, item.ItemId, null, 'Y', referenceRange.FollowUpRangeValue, criticalValueContent);
  2011. }
  2012. }
  2013. #endregion
  2014. #region 关键字
  2015. if (!isCritical)
  2016. {
  2017. var criticalKeyCount = criticalFollowValueList.Count(m => m.CriticalFollowValueFlag == CriticalFollowValueFlag.Critical
  2018. && item.Result.Contains(m.DisplayName));
  2019. if (criticalKeyCount > 0)
  2020. {
  2021. isCritical = true;
  2022. isFollowUp = true;
  2023. UpdateRegisterCheckItemCriticalResult(criticalResultDto, item.RegisterCheckId, item.ItemId, 'Y', 'Y', item.Result, "");
  2024. }
  2025. }
  2026. if (!isFollowUp)
  2027. {
  2028. var followUpKeyCount = criticalFollowValueList.Count(m => m.CriticalFollowValueFlag == CriticalFollowValueFlag.FollowUp
  2029. && item.Result.Contains(m.DisplayName));
  2030. if (followUpKeyCount > 0)
  2031. {
  2032. isFollowUp = true;
  2033. UpdateRegisterCheckItemCriticalResult(criticalResultDto, item.RegisterCheckId, item.ItemId, null, 'Y', item.Result, "");
  2034. }
  2035. }
  2036. #endregion
  2037. }
  2038. }
  2039. #endregion
  2040. #region 处理危急值记录临时数据
  2041. /// <summary>
  2042. /// 临时更新危急值状态 registerCheck
  2043. /// </summary>
  2044. /// <param name="criticalResultDto"></param>
  2045. /// <param name="registerCheckId"></param>
  2046. /// <param name="isCritical"></param>
  2047. /// <param name="isFollowUp"></param>
  2048. /// <param name="criticalRangeValue"></param>
  2049. /// <param name="criticalValueContent"></param>
  2050. private void UpdateRegisterCheckCriticalResult(GetCriticalResultDto criticalResultDto, Guid registerCheckId, char? isCritical, char? isFollowUp, string criticalRangeValue, string criticalValueContent)
  2051. {
  2052. if (criticalResultDto.AsbitemDetails.Where(m => m.RegisterCheckId == registerCheckId).Count() == 0)
  2053. {
  2054. criticalResultDto.AsbitemDetails.Add(new GetAsbitemCriticalResultDto
  2055. {
  2056. RegisterCheckId = registerCheckId
  2057. });
  2058. }
  2059. else
  2060. {
  2061. foreach (var asbitemDetail in criticalResultDto.AsbitemDetails)
  2062. {
  2063. if (asbitemDetail.RegisterCheckId == registerCheckId)
  2064. {
  2065. if (isCritical != null)
  2066. {
  2067. asbitemDetail.IsCritical = isCritical;
  2068. }
  2069. if (isFollowUp != null)
  2070. {
  2071. asbitemDetail.IsFollowUp = isFollowUp;
  2072. }
  2073. if (!string.IsNullOrWhiteSpace(criticalRangeValue) && string.IsNullOrWhiteSpace(asbitemDetail.CriticalRangeValue))
  2074. {
  2075. asbitemDetail.CriticalRangeValue = criticalRangeValue;
  2076. }
  2077. if (!string.IsNullOrWhiteSpace(criticalValueContent) && string.IsNullOrWhiteSpace(asbitemDetail.CriticalValueContent))
  2078. {
  2079. asbitemDetail.CriticalValueContent = criticalValueContent;
  2080. }
  2081. }
  2082. }
  2083. }
  2084. }
  2085. /// <summary>
  2086. /// 临时更新危急值状态 registerCheckItem
  2087. /// </summary>
  2088. /// <param name="criticalResultDto"></param>
  2089. /// <param name="registerCheckId"></param>
  2090. /// <param name="itemId"></param>
  2091. /// <param name="isCritical"></param>
  2092. /// <param name="isFollowUp"></param>
  2093. /// <param name="criticalRangeValue"></param>
  2094. /// <param name="criticalValueContent"></param>
  2095. private void UpdateRegisterCheckItemCriticalResult(GetCriticalResultDto criticalResultDto, Guid registerCheckId, Guid itemId, char? isCritical, char? isFollowUp, string criticalRangeValue, string criticalValueContent)
  2096. {
  2097. //先增加registerCheck
  2098. if (criticalResultDto.ItemDetails.Where(m => m.RegisterCheckId == registerCheckId && m.ItemId == itemId).Count() == 0)
  2099. {
  2100. criticalResultDto.ItemDetails.Add(new GetItemCriticalResultDto
  2101. {
  2102. RegisterCheckId = registerCheckId,
  2103. ItemId = itemId
  2104. });
  2105. }
  2106. foreach (var itemDetail in criticalResultDto.ItemDetails)
  2107. {
  2108. if (itemDetail.RegisterCheckId == registerCheckId && itemDetail.ItemId == itemId)
  2109. {
  2110. if (isCritical != null)
  2111. {
  2112. itemDetail.IsCritical = isCritical;
  2113. }
  2114. if (isFollowUp != null)
  2115. {
  2116. itemDetail.IsFollowUp = isFollowUp;
  2117. }
  2118. if (!string.IsNullOrWhiteSpace(criticalRangeValue) && string.IsNullOrWhiteSpace(itemDetail.CriticalRangeValue))
  2119. {
  2120. itemDetail.CriticalRangeValue = criticalRangeValue;
  2121. }
  2122. if (!string.IsNullOrWhiteSpace(criticalValueContent) && string.IsNullOrWhiteSpace(itemDetail.CriticalValueContent))
  2123. {
  2124. itemDetail.CriticalValueContent = criticalValueContent;
  2125. }
  2126. }
  2127. }
  2128. }
  2129. #endregion
  2130. #region 修改危急值数据
  2131. /// <summary>
  2132. /// 处理危急值记录
  2133. /// </summary>
  2134. /// <param name="criticalResultDto"></param>
  2135. /// <param name="patientRegisterId"></param>
  2136. /// <returns></returns>
  2137. private async Task HandCriticalResult(GetCriticalResultDto criticalResultDto, Guid patientRegisterId)
  2138. {
  2139. foreach (var asbitemDetail in criticalResultDto.AsbitemDetails)
  2140. {
  2141. await CreateRegisterCheckCritical(asbitemDetail.RegisterCheckId, asbitemDetail.IsCritical, asbitemDetail.IsFollowUp, asbitemDetail.CriticalRangeValue, asbitemDetail.CriticalValueContent);
  2142. }
  2143. foreach (var itemDetail in criticalResultDto.ItemDetails)
  2144. {
  2145. await CreateRegisterCheckItemCritical(itemDetail.RegisterCheckId, itemDetail.ItemId, itemDetail.IsCritical, itemDetail.IsFollowUp, itemDetail.CriticalRangeValue, itemDetail.CriticalValueContent);
  2146. }
  2147. if (criticalResultDto.AsbitemDetails.Count > 0 || criticalResultDto.ItemDetails.Count > 0)
  2148. {
  2149. //增加随访主表记录
  2150. await _followUpAppService.CreateAsync(new PatientRegisterIdInputDto
  2151. {
  2152. PatientRegisterId = patientRegisterId
  2153. });
  2154. }
  2155. //else
  2156. //{
  2157. // //删除随访表记录
  2158. // await _followUpAppService.DeleteByPatientRegisterId(new PatientRegisterIdInputDto
  2159. // {
  2160. // PatientRegisterId = patientRegisterId
  2161. // });
  2162. //}
  2163. }
  2164. /// <summary>
  2165. /// 生成registerCheck表危急值相关数据
  2166. /// </summary>
  2167. /// <param name="registerCheckId"></param>
  2168. /// <param name="isCriticalValue"></param>
  2169. /// <param name="isFollowUp"></param>
  2170. /// <param name="CriticalRangeValue"></param>
  2171. /// <param name="criticalValueContent"></param>
  2172. /// <returns></returns>
  2173. private async Task CreateRegisterCheckCritical(Guid registerCheckId, char? isCriticalValue, char? isFollowUp, string CriticalRangeValue, string criticalValueContent)
  2174. {
  2175. var registerCheckEnt = await _registerCheckRepository.FirstOrDefaultAsync(m => m.Id == registerCheckId);
  2176. if (registerCheckEnt != null)
  2177. {
  2178. if (string.IsNullOrWhiteSpace(registerCheckEnt.CriticalRangeValue) && !string.IsNullOrWhiteSpace(CriticalRangeValue))
  2179. {
  2180. registerCheckEnt.CriticalRangeValue = CriticalRangeValue;
  2181. }
  2182. if (isCriticalValue == 'Y')
  2183. {
  2184. registerCheckEnt.CriticalValueCreatorId = _currentUser.Id;
  2185. registerCheckEnt.CriticalValueCreationTime = DateTime.Now;
  2186. registerCheckEnt.IsCriticalValue = isCriticalValue;
  2187. }
  2188. if (isFollowUp == 'Y')
  2189. {
  2190. registerCheckEnt.FollowUpCreatorId = _currentUser.Id;
  2191. registerCheckEnt.FollowUpCreationTime = DateTime.Now;
  2192. registerCheckEnt.IsFollowUp = isFollowUp;
  2193. }
  2194. if (string.IsNullOrWhiteSpace(registerCheckEnt.CriticalValueContent) && !string.IsNullOrWhiteSpace(criticalValueContent))
  2195. {
  2196. registerCheckEnt.CriticalValueContent = criticalValueContent;
  2197. }
  2198. await _registerCheckRepository.UpdateAsync(registerCheckEnt);
  2199. }
  2200. }
  2201. /// <summary>
  2202. /// 生成明细表危急值相关数据
  2203. /// </summary>
  2204. /// <param name="registerCheckId"></param>
  2205. /// <param name="itemId"></param>
  2206. /// <param name="isCriticalValue"></param>
  2207. /// <param name="isFollowUp"></param>
  2208. /// <param name="criticalRangeValue"></param>
  2209. /// <param name="criticalValueContent"></param>
  2210. /// <returns></returns>
  2211. private async Task CreateRegisterCheckItemCritical(Guid registerCheckId, Guid itemId, char? isCriticalValue, char? isFollowUp, string criticalRangeValue, string criticalValueContent)
  2212. {
  2213. var registerCheckItemEnt = await _registerCheckItemRepository.FirstOrDefaultAsync(m => m.RegisterCheckId == registerCheckId
  2214. && m.ItemId == itemId);
  2215. if (registerCheckItemEnt != null)
  2216. {
  2217. if (string.IsNullOrWhiteSpace(registerCheckItemEnt.CriticalRangeValue) && !string.IsNullOrWhiteSpace(criticalRangeValue))
  2218. {
  2219. registerCheckItemEnt.CriticalRangeValue = criticalRangeValue;
  2220. }
  2221. if (isCriticalValue == 'Y')
  2222. {
  2223. registerCheckItemEnt.CriticalValueCreatorId = _currentUser.Id;
  2224. registerCheckItemEnt.CriticalValueCreationTime = DateTime.Now;
  2225. registerCheckItemEnt.IsCriticalValue = isCriticalValue;
  2226. }
  2227. if (isFollowUp == 'Y')
  2228. {
  2229. registerCheckItemEnt.FollowUpCreatorId = _currentUser.Id;
  2230. registerCheckItemEnt.FollowUpCreationTime = DateTime.Now;
  2231. registerCheckItemEnt.IsFollowUp = isFollowUp;
  2232. }
  2233. if (string.IsNullOrWhiteSpace(registerCheckItemEnt.CriticalValueContent) && !string.IsNullOrWhiteSpace(criticalValueContent))
  2234. {
  2235. registerCheckItemEnt.CriticalValueContent = criticalValueContent;
  2236. }
  2237. await _registerCheckItemRepository.UpdateAsync(registerCheckItemEnt);
  2238. }
  2239. }
  2240. #endregion
  2241. #endregion
  2242. }
  2243. }