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.

1914 lines
81 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
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
1 year ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
1 year ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
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 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. var reslist = new List<GetDiagnosisResult_Detail>();
  116. var suggestionlist = new List<GetDiagnosisSuggestion_Detail>();
  117. //根据检查单ID查询
  118. var query = (from registerCheck in await _registerCheckRepository.GetQueryableAsync()
  119. join registerAsbitem in await _registerAsbitemRepository.GetQueryableAsync() on registerCheck.Id equals registerAsbitem.RegisterCheckId
  120. join registerCheckItem in await _registerCheckItemRepository.GetQueryableAsync() on registerCheck.Id equals registerCheckItem.RegisterCheckId
  121. join asbitem in await _asbitemRepository.GetQueryableAsync() on registerAsbitem.AsbitemId equals asbitem.Id
  122. join item in (await _itemRepository.GetQueryableAsync()).Include(x => x.ReferenceRanges).Include(x => x.ItemResultMatches).Include(x => x.ItemResultTemplates)
  123. on registerCheckItem.ItemId equals item.Id
  124. join unit in await _unitRepository.GetQueryableAsync()
  125. on item.UnitId equals unit.Id into unitExist
  126. from unitHaveEmpty in unitExist.DefaultIfEmpty()
  127. join patientRegister in await _patientRegisterRepository.GetQueryableAsync() on registerCheck.PatientRegisterId equals patientRegister.Id
  128. where registerCheck.Id == input.RegisterCheckId
  129. select new
  130. {
  131. registerCheck,
  132. registerAsbitem,
  133. registerCheckItem,
  134. asbitem,
  135. item,
  136. unitHaveEmpty,
  137. patientRegister
  138. }).AsNoTracking().ToList();
  139. var resultDto = new GetDiagnosisResultDto
  140. {
  141. DiagnosisResultDetails = reslist,
  142. DiagnosisSuggestionDetails = suggestionlist,
  143. };
  144. if (query.Count() == 0)
  145. {
  146. return resultDto;
  147. }
  148. await LoadSysParm(query[0].patientRegister.MedicalCenterId);
  149. /*:
  150. * 1,
  151. * 2
  152. * 3
  153. * 4
  154. * 5
  155. * */
  156. //设置基本参数
  157. var doctorCheckDiagnosisInput = new DoctorCheckDiagnosisInput()
  158. {
  159. SexId = query[0].patientRegister.SexId,
  160. SexName = _cacheService.GetSexNameAsync(query[0].patientRegister.SexId).Result,
  161. Age = query[0].patientRegister.Age
  162. };
  163. foreach (var item in query)
  164. {
  165. //组合项目参数
  166. if (doctorCheckDiagnosisInput.Asbitems.Where(o => o.AsbitemId == item.asbitem.Id).Count() == 0)
  167. {
  168. var asbitemInput = new AsbitemInput()
  169. {
  170. RegisterCheckId = item.registerCheck.Id,
  171. AsbitemId = item.asbitem.Id,
  172. AsbitemName = item.asbitem.DisplayName,
  173. IsDiagnosisFunction = item.asbitem.IsDiagnosisFunction,
  174. DiagnosisFunction = item.asbitem.DiagnosisFunction,
  175. IsContinueProcess = item.asbitem.IsContinueProcess,
  176. DefaultResult = item.asbitem.DefaultResult,
  177. CriticalValueFunction = item.asbitem.CriticalValueFunction,
  178. FollowUpFunction = item.asbitem.FollowUpFunction,
  179. IsCriticalValueFunction = item.asbitem.IsCriticalValueFunction,
  180. IsFollowUpFunction = item.asbitem.IsFollowUpFunction
  181. };
  182. doctorCheckDiagnosisInput.Asbitems.Add(asbitemInput);
  183. }
  184. //项目参数
  185. if (doctorCheckDiagnosisInput.Items.Where(o => o.ItemId == item.item.Id).Count() == 0)
  186. {
  187. var inputItem = input.Items.Where(o => o.ItemId == item.item.Id).FirstOrDefault();
  188. var inputResult = "";
  189. if (inputItem != null)
  190. {
  191. inputResult = inputItem.Result;
  192. }
  193. var itemInput = new ItemInput()
  194. {
  195. RegisterCheckId = item.registerCheck.Id,
  196. ItemId = item.item.Id,
  197. ItemName = item.item.DisplayName,
  198. Unit = (item.unitHaveEmpty == null) ? "" : item.unitHaveEmpty.DisplayName,
  199. IsDiagnosisFunction = item.item.IsDiagnosisFunction,
  200. DiagnosisFunction = item.item.DiagnosisFunction,
  201. IsContinueProcess = item.item.IsContinueProcess,
  202. IsNameIntoSummary = item.item.IsNameIntoSummary,
  203. IsProduceSummary = item.item.IsProduceSummary,
  204. ReferenceRangeTypeFlag = item.item.ReferenceRangeTypeFlag,
  205. DefaultResult = item.item.DefaultResult,
  206. Result = inputResult,
  207. DisplayOrder = item.item.DisplayOrder,
  208. ItemResultMatches = item.item.ItemResultMatches.ToList(),
  209. ItemResultTemplates = item.item.ItemResultTemplates.ToList(),
  210. ReferenceRanges = item.item.ReferenceRanges.ToList(),
  211. CriticalValueFunction = item.item.CriticalValueFunction,
  212. FollowUpFunction = item.item.FollowUpFunction,
  213. IsFollowUpFunction = item.item.IsFollowUpFunction,
  214. IsCriticalValueFunction = item.item.IsCriticalValueFunction
  215. };
  216. doctorCheckDiagnosisInput.Items.Add(itemInput);
  217. }
  218. }
  219. doctorCheckDiagnosisInput.Items = doctorCheckDiagnosisInput.Items.OrderBy(o => o.DisplayOrder).ToList();
  220. //处理组合项目诊断函数
  221. List<string> diagnosisList = new List<string>();
  222. List<string> asbitemDiagnosisList;
  223. var isContinueProcess = GetAsbitemDiagnosisByFunction(doctorCheckDiagnosisInput, out asbitemDiagnosisList);
  224. diagnosisList.AddRange(asbitemDiagnosisList);
  225. if (isContinueProcess)
  226. {
  227. //处理项目诊断
  228. var itemDiagnosisList = await GetItemDiagnosis(doctorCheckDiagnosisInput);
  229. var itemDiagnosisStringList = GetItemDiagnosisStringList(itemDiagnosisList);
  230. diagnosisList.AddRange(itemDiagnosisStringList);
  231. }
  232. //设置返回值
  233. //去掉空结果数据
  234. diagnosisList = diagnosisList.Where(o => !string.IsNullOrWhiteSpace(o)).ToList();
  235. //去掉重复结果数据
  236. diagnosisList = diagnosisList.Distinct().ToList();
  237. if (!diagnosisList.Any())
  238. {
  239. //设置组合项目默认小结
  240. diagnosisList.Add(doctorCheckDiagnosisInput.Asbitems[0].DefaultResult);
  241. }
  242. foreach (var diagnosis in diagnosisList)
  243. {
  244. var getDiagnosisResult_Detail = new GetDiagnosisResult_Detail()
  245. {
  246. DiagnosisResult = diagnosis
  247. };
  248. resultDto.DiagnosisResultDetails.Add(getDiagnosisResult_Detail);
  249. }
  250. #region 处理危急值函数
  251. List<GetCriticalResultDto> criticalResultDtoList = new List<GetCriticalResultDto>();
  252. var isCritical = await GetPatientRegisterIsCriticalAsync(doctorCheckDiagnosisInput, resultDto, criticalResultDtoList);
  253. var isFollowUp = await GetPatientRegisterIsFollowUpAsync(doctorCheckDiagnosisInput, resultDto, criticalResultDtoList);
  254. await HandCriticalResult(criticalResultDtoList, query[0].patientRegister.Id);
  255. #endregion
  256. return resultDto;
  257. }
  258. #region 小结方法
  259. private List<string> GetItemDiagnosisStringList(List<DoctorCheckItemDiagnosisResult> itemDiagnosisList)
  260. {
  261. var diagnosisList = new List<string>();
  262. foreach (var itemDiagnosis in itemDiagnosisList)
  263. {
  264. if (!itemDiagnosis.ItemDiagnosisTypeResults.Any())
  265. {
  266. continue;
  267. }
  268. string diagnosis = "";
  269. foreach (var itemDiagnosisType in itemDiagnosis.ItemDiagnosisTypeResults)
  270. {
  271. if (itemDiagnosisType.DiagnosisType == '1')
  272. {
  273. //数字型检验参考范围
  274. diagnosisList.AddRange(itemDiagnosisType.Diagnosis);
  275. }
  276. else
  277. {
  278. itemDiagnosisType.Diagnosis = itemDiagnosisType.Diagnosis.Where(o => !string.IsNullOrWhiteSpace(o)).ToList();
  279. if (itemDiagnosisType.Diagnosis.Count() > _numArry.Count())
  280. {
  281. throw new UserFriendlyException($"诊断数量超过{_numArry.Count()}个,不支持");
  282. }
  283. if (itemDiagnosisType.Diagnosis.Count() == 0)
  284. {
  285. continue;
  286. }
  287. for (int i = 0; i < itemDiagnosisType.Diagnosis.Count(); i++)
  288. {
  289. if (string.IsNullOrWhiteSpace(itemDiagnosisType.Diagnosis[i]))
  290. {
  291. continue;
  292. }
  293. if (itemDiagnosisType.Diagnosis.Count() == 1)
  294. {
  295. diagnosis = diagnosis + itemDiagnosisType.Diagnosis[i] + ";";
  296. }
  297. else
  298. {
  299. diagnosis = diagnosis + _numArry[i] + itemDiagnosisType.Diagnosis[i] + ";";
  300. }
  301. }
  302. }
  303. }
  304. if (!string.IsNullOrWhiteSpace(diagnosis))
  305. {
  306. if (itemDiagnosis.IsNameIntoSummary == 'Y' && !diagnosis.StartsWith(itemDiagnosis.ItemName))
  307. {
  308. diagnosis = itemDiagnosis.ItemName + ":" + diagnosis;
  309. }
  310. diagnosisList.Add(diagnosis);
  311. }
  312. }
  313. return diagnosisList;
  314. }
  315. /// <summary>
  316. /// 加载系统参数
  317. /// </summary>
  318. /// <param name="medicalCenterId"></param>
  319. /// <returns></returns>
  320. private async Task LoadSysParm(Guid medicalCenterId)
  321. {
  322. _isAddAbnormalResult = await _sysParmValueManager.GetSysParmValueAsync(
  323. medicalCenterId, "doctor_check_lis_summary_mode_add_abnormal_result");
  324. _isAddReferenceRange = await _sysParmValueManager.GetSysParmValueAsync(
  325. medicalCenterId, "doctor_check_lis_summary_mode_add_reference_range");
  326. _isAutoAddSuffix = await _sysParmValueManager.GetSysParmValueAsync(
  327. medicalCenterId, "doctor_check_lis_summary_mode_auto_add_suffix");
  328. _lowerSuffix = await _sysParmValueManager.GetSysParmValueAsync(
  329. medicalCenterId, "doctor_check_lis_summary_mode_lower_suffix");
  330. _highSuffix = await _sysParmValueManager.GetSysParmValueAsync(
  331. medicalCenterId, "doctor_check_lis_summary_mode_high_suffix");
  332. }
  333. /// <summary>
  334. /// 获取组合项目诊断通过诊断函数
  335. /// </summary>
  336. /// <param name="doctorCheckDiagnosisInput"></param>
  337. /// <param name="diagnosisList"></param>
  338. /// <returns></returns>
  339. private bool GetAsbitemDiagnosisByFunction(DoctorCheckDiagnosisInput doctorCheckDiagnosisInput, out List<string> diagnosisList)
  340. {
  341. var patientAsbitemDiagnosisInput = new PatientAsbitemDiagnosisInput()
  342. {
  343. SexName = doctorCheckDiagnosisInput.SexName,
  344. Age = doctorCheckDiagnosisInput.Age
  345. };
  346. foreach (var item in doctorCheckDiagnosisInput.Items)
  347. {
  348. var itemResult = new ItemResultInput()
  349. {
  350. ItemId = item.ItemId,
  351. ItemName = item.ItemName,
  352. Result = item.Result
  353. };
  354. patientAsbitemDiagnosisInput.Items.Add(itemResult);
  355. }
  356. var diagnosisBuilder = new DiagnosisBuilder();
  357. diagnosisList = new List<string>();
  358. bool isContinueProcess = true;
  359. foreach (var asbitem in doctorCheckDiagnosisInput.Asbitems)
  360. {
  361. if (asbitem.IsDiagnosisFunction == 'Y' && !string.IsNullOrWhiteSpace(asbitem.DiagnosisFunction))
  362. {
  363. var diagnosis = diagnosisBuilder.GetAsbitemDiagnosisResult(patientAsbitemDiagnosisInput, asbitem.DiagnosisFunction);
  364. diagnosisList.Add(diagnosis);
  365. if (asbitem.IsContinueProcess != 'Y')
  366. {
  367. //有一个不允许继续处理,则不允许继续处理
  368. isContinueProcess = false;
  369. }
  370. }
  371. }
  372. return isContinueProcess;
  373. }
  374. /// <summary>
  375. /// 获取项目诊断
  376. /// </summary>
  377. /// <param name="doctorCheckDiagnosisInput"></param>
  378. /// <returns></returns>
  379. private async Task<List<DoctorCheckItemDiagnosisResult>> GetItemDiagnosis(DoctorCheckDiagnosisInput doctorCheckDiagnosisInput)
  380. {
  381. var patientItemDiagnosisInput = new PatientItemDiagnosisInput()
  382. {
  383. SexName = doctorCheckDiagnosisInput.SexName,
  384. Age = doctorCheckDiagnosisInput.Age
  385. };
  386. var diagnosisBuilder = new DiagnosisBuilder();
  387. var diagnosisList = new List<DoctorCheckItemDiagnosisResult>();
  388. foreach (var item in doctorCheckDiagnosisInput.Items)
  389. {
  390. if (string.IsNullOrWhiteSpace(item.Result))
  391. {
  392. continue;
  393. }
  394. if (!string.IsNullOrWhiteSpace(item.DefaultResult) && item.Result == item.DefaultResult)
  395. {
  396. continue;
  397. }
  398. if (item.IsProduceSummary != 'Y')
  399. {
  400. continue;
  401. }
  402. var doctorCheckItemDiagnosisResult = new DoctorCheckItemDiagnosisResult()
  403. {
  404. IsNameIntoSummary = item.IsNameIntoSummary,
  405. ItemName = item.ItemName,
  406. };
  407. diagnosisList.Add(doctorCheckItemDiagnosisResult);
  408. if (item.IsDiagnosisFunction == 'Y' && !string.IsNullOrWhiteSpace(item.DiagnosisFunction))
  409. {
  410. var itemResult = new ItemResultInput()
  411. {
  412. ItemId = item.ItemId,
  413. ItemName = item.ItemName,
  414. Result = item.Result
  415. };
  416. patientItemDiagnosisInput.Item = itemResult;
  417. //通过计算获取诊断
  418. var diagnosis = diagnosisBuilder.GetItemDiagnosisResult(patientItemDiagnosisInput, item.DiagnosisFunction);
  419. var itemDiagnosisTypeResult = new ItemDiagnosisTypeResult()
  420. {
  421. DiagnosisType = '0'
  422. };
  423. itemDiagnosisTypeResult.Diagnosis.Add(diagnosis);
  424. doctorCheckItemDiagnosisResult.ItemDiagnosisTypeResults.Add(itemDiagnosisTypeResult);
  425. }
  426. if (item.IsDiagnosisFunction == 'Y' && item.IsContinueProcess != 'Y')
  427. {
  428. continue;
  429. }
  430. //通过参考范围获取诊断
  431. if (item.ReferenceRangeTypeFlag == ItemReferenceRangeTypeFlag.Number)
  432. {
  433. var referenceRangeDiagnosis = await GetItemDiagnosisByReferenceRanges(doctorCheckDiagnosisInput.SexId, doctorCheckDiagnosisInput.Age, item);
  434. if (!string.IsNullOrWhiteSpace(referenceRangeDiagnosis))
  435. {
  436. var itemDiagnosisTypeResult = new ItemDiagnosisTypeResult()
  437. {
  438. DiagnosisType = '1'
  439. };
  440. itemDiagnosisTypeResult.Diagnosis.Add(referenceRangeDiagnosis);
  441. doctorCheckItemDiagnosisResult.ItemDiagnosisTypeResults.Add(itemDiagnosisTypeResult);
  442. }
  443. }
  444. else
  445. {
  446. //通过结果模板获取诊断
  447. var templateList = await GetItemDiagnosisByTemplate(item);
  448. var itemDiagnosisTypeResult = new ItemDiagnosisTypeResult()
  449. {
  450. DiagnosisType = '2'
  451. };
  452. itemDiagnosisTypeResult.Diagnosis.AddRange(templateList);
  453. //通过匹配关系获取诊断
  454. var matcheList = await GetItemDiagnosisByMatche(item);
  455. itemDiagnosisTypeResult.Diagnosis.AddRange(matcheList);
  456. if (!templateList.Any() && !matcheList.Any())
  457. {
  458. //获取异常结果
  459. itemDiagnosisTypeResult.Diagnosis.Add(item.Result);
  460. }
  461. //去掉重复诊断
  462. itemDiagnosisTypeResult.Diagnosis = itemDiagnosisTypeResult.Diagnosis.Distinct().ToList();
  463. doctorCheckItemDiagnosisResult.ItemDiagnosisTypeResults.Add(itemDiagnosisTypeResult);
  464. }
  465. }
  466. return diagnosisList;
  467. }
  468. /// <summary>
  469. /// 通过参考范围获取项目诊断列表
  470. /// </summary>
  471. /// <param name="sexId"></param>
  472. /// <param name="age"></param>
  473. /// <param name="itemInput"></param>
  474. /// <returns></returns>
  475. private async Task<string> GetItemDiagnosisByReferenceRanges(char sexId, short? age, ItemInput itemInput)
  476. {
  477. var diagnosisList = new List<string>();
  478. if (string.IsNullOrWhiteSpace(itemInput.Result))
  479. {
  480. return null;
  481. }
  482. decimal resultDecimal;
  483. if (!decimal.TryParse(itemInput.Result, out resultDecimal))
  484. {
  485. return null;
  486. }
  487. var referenceRangeList = itemInput.ReferenceRanges.Where(o => o.ReferenceRangeTypeFlag == ItemReferenceRangeTypeFlag.Number).ToList();
  488. if (!referenceRangeList.Any())
  489. {
  490. return null;
  491. }
  492. if (age == null)
  493. {
  494. age = 30;
  495. }
  496. var referenceRange = referenceRangeList.Where(o => o.ForSexId == sexId && age >= o.AgeLowerLimit && age <= o.AgeUpperLimit).FirstOrDefault();
  497. if (referenceRange == null)
  498. {
  499. referenceRange = referenceRangeList.Where(o => o.ForSexId == ForSexFlag.All && age >= o.AgeLowerLimit && age <= o.AgeUpperLimit).FirstOrDefault();
  500. if (referenceRange == null)
  501. {
  502. return null;
  503. }
  504. }
  505. string diagnosis = null;
  506. // var pos = referenceRange.ReferenceRangeValue.IndexOf("-");
  507. string resultStatusId = _registerCheckItemManager.GetNumberResultStatusId(itemInput.Result, referenceRange.ReferenceRangeValue);
  508. if (resultStatusId == ResultStatusFlag.Low)
  509. {
  510. diagnosis = await GetNumberDiagnosis(itemInput.ItemName, itemInput.Result, itemInput.Unit, true, referenceRange);
  511. }
  512. else if (resultStatusId == ResultStatusFlag.High)
  513. {
  514. diagnosis = await GetNumberDiagnosis(itemInput.ItemName, itemInput.Result, itemInput.Unit, false, referenceRange);
  515. }
  516. return diagnosis;
  517. }
  518. private async Task<string> GetNumberDiagnosis(string itemName, string result, string unit, bool isLower,
  519. ReferenceRange referenceRange)
  520. {
  521. string diagnosis = null;
  522. if (isLower)
  523. {
  524. //偏低诊断
  525. if (referenceRange.LowerDiagnosisId != null && referenceRange.LowerDiagnosisId != Guid.Empty)
  526. {
  527. var diagnosisEntity = await _diagnosisRepository.FindAsync(o => o.Id == referenceRange.LowerDiagnosisId);
  528. if (diagnosisEntity != null)
  529. {
  530. diagnosis = diagnosisEntity.DisplayName + "↓";
  531. }
  532. else
  533. {
  534. if (_isAutoAddSuffix == "Y")
  535. {
  536. diagnosis = itemName + _lowerSuffix + "↓";
  537. }
  538. }
  539. }
  540. else
  541. {
  542. if (_isAutoAddSuffix == "Y")
  543. {
  544. diagnosis = itemName + _lowerSuffix + "↓";
  545. }
  546. }
  547. }
  548. else
  549. {
  550. //偏高诊断
  551. if (referenceRange.UpperDiagnosisId != null && referenceRange.UpperDiagnosisId != Guid.Empty)
  552. {
  553. var diagnosisEntity = await _diagnosisRepository.FindAsync(o => o.Id == referenceRange.UpperDiagnosisId);
  554. if (diagnosisEntity != null)
  555. {
  556. diagnosis = diagnosisEntity.DisplayName + "↑";
  557. }
  558. else
  559. {
  560. if (_isAutoAddSuffix == "Y")
  561. {
  562. diagnosis = itemName + _highSuffix + "↑";
  563. }
  564. }
  565. }
  566. else
  567. {
  568. if (_isAutoAddSuffix == "Y")
  569. {
  570. diagnosis = itemName + _highSuffix + "↑";
  571. }
  572. }
  573. }
  574. if (!string.IsNullOrWhiteSpace(diagnosis))
  575. {
  576. if (_isAddAbnormalResult == "Y")
  577. {
  578. if (string.IsNullOrEmpty(unit))
  579. {
  580. unit = "";
  581. }
  582. diagnosis = diagnosis + $"(结果:{result} {unit},参考范围: {referenceRange.ReferenceRangeValue})";
  583. }
  584. }
  585. return diagnosis;
  586. }
  587. /// <summary>
  588. /// 通过模板获取诊断
  589. /// </summary>
  590. /// <param name="itemInput"></param>
  591. /// <returns></returns>
  592. private async Task<List<string>> GetItemDiagnosisByTemplate(ItemInput itemInput)
  593. {
  594. List<string> diagnosisList = new List<string>();
  595. //将结果解析到数组中
  596. string[] resultArry = GetResultArry(itemInput.Result);
  597. //结果模板中的结果去掉数字,* /等符号
  598. foreach (var template in itemInput.ItemResultTemplates)
  599. {
  600. if (!string.IsNullOrWhiteSpace(template.Result))
  601. {
  602. //template.Result = Regex.Replace(template.Result, @"\d+", "").Replace("*", "").Replace("/", "").Replace(" ", "");
  603. }
  604. }
  605. foreach (var resultSplit in resultArry)
  606. {
  607. if (string.IsNullOrWhiteSpace(resultSplit) || resultSplit.StartsWith("余未见异常"))
  608. {
  609. continue;
  610. }
  611. var templatesList = itemInput.ItemResultTemplates.Where(o => o.Result == resultSplit && o.IsResultIntoSummary == 'Y').ToList();
  612. foreach (var template in templatesList)
  613. {
  614. if (template != null && template.DiagnosisId != null && template.DiagnosisId != Guid.Empty)
  615. {
  616. var temp_diagnosis = await _diagnosisRepository.FirstOrDefaultAsync(m => m.Id == template.DiagnosisId);
  617. if (temp_diagnosis != null)
  618. {
  619. diagnosisList.Add(temp_diagnosis.DisplayName);
  620. }
  621. }
  622. else
  623. {
  624. diagnosisList.Add(resultSplit);
  625. }
  626. }
  627. }
  628. return diagnosisList.Distinct().ToList();
  629. }
  630. /// <summary>
  631. /// 获取项目诊断通过匹配关系
  632. /// </summary>
  633. /// <param name="itemInput"></param>
  634. /// <returns></returns>
  635. private async Task<List<string>> GetItemDiagnosisByMatche(ItemInput itemInput)
  636. {
  637. List<string> diagnosisList = new List<string>();
  638. //将结果解析到数组中
  639. string[] resultArry = GetResultArry(itemInput.Result);
  640. foreach (var resultSplit in resultArry)
  641. {
  642. if (string.IsNullOrWhiteSpace(resultSplit) || resultSplit.StartsWith("余未见异常"))
  643. {
  644. continue;
  645. }
  646. var templatesList = itemInput.ItemResultMatches.Where(o => resultSplit.Contains(o.Result)).ToList();
  647. foreach (var template in templatesList)
  648. {
  649. if (template != null && template.DiagnosisId != Guid.Empty)
  650. {
  651. var temp_diagnosis = await _diagnosisRepository.FirstOrDefaultAsync(m => m.Id == template.DiagnosisId);
  652. if (temp_diagnosis != null)
  653. {
  654. diagnosisList.Add(temp_diagnosis.DisplayName);
  655. }
  656. }
  657. }
  658. }
  659. return diagnosisList.Distinct().ToList();
  660. }
  661. /// <summary>
  662. /// 去掉结果中的数字符号和分号
  663. /// </summary>
  664. /// <param name="result"></param>
  665. /// <returns></returns>
  666. private string[] GetResultArry(string result)
  667. {
  668. result = result.Trim().Replace(";", ";");
  669. foreach (var num in _numArry)
  670. {
  671. result = result.Replace(num, "");
  672. }
  673. //将结果通过英文;解析到数组中
  674. string[] resultArry = result.Split(";");
  675. return resultArry;
  676. }
  677. #region 执行项目计算函数
  678. /// <summary>
  679. /// 生成计算函数值
  680. /// </summary>
  681. /// <param name="input"></param>
  682. /// <returns></returns>
  683. [HttpPost("api/app/diagnosisfunction/getcalculationfunctionresult")]
  684. public async Task<GetDiagnosisResultRequestDto> GetCalculationFunctionResultAsync(GetDiagnosisResultRequestDto input)
  685. {
  686. await GetItemResultByCalculationFunctionAsync(input);
  687. return input;
  688. }
  689. private async Task GetItemResultByCalculationFunctionAsync(GetDiagnosisResultRequestDto input)
  690. {
  691. //根据检查单ID查询
  692. var list = (
  693. from patientRegister in await _patientRegisterRepository.GetQueryableAsync()
  694. join registerCheck in await _registerCheckRepository.GetQueryableAsync()
  695. on patientRegister.Id equals registerCheck.PatientRegisterId
  696. join registerCheckItem in await _registerCheckItemRepository.GetQueryableAsync()
  697. on registerCheck.Id equals registerCheckItem.RegisterCheckId
  698. join item in await _itemRepository.GetQueryableAsync()
  699. on registerCheckItem.ItemId equals item.Id
  700. where registerCheck.Id == input.RegisterCheckId
  701. select new
  702. {
  703. PatientRegister = patientRegister,
  704. Item = item
  705. }
  706. ).ToList();
  707. var diagnosisBuilder = new DiagnosisBuilder();
  708. var patientItemCalculateInput = new PatientItemCalculateInput()
  709. {
  710. SexName = _cacheService.GetSexNameAsync(list[0].PatientRegister.SexId).Result,
  711. Age = list[0].PatientRegister.Age
  712. };
  713. foreach (var item in input.Items)
  714. {
  715. var itemResult = new ItemResultInput()
  716. {
  717. ItemId = item.ItemId,
  718. Result = item.Result
  719. };
  720. itemResult.ItemName = list.Where(o => o.Item.Id == item.ItemId).First().Item.DisplayName;
  721. patientItemCalculateInput.Items.Add(itemResult);
  722. }
  723. foreach (var item in list)
  724. {
  725. if (item.Item.IsCalculationItem == 'Y' && !string.IsNullOrEmpty(item.Item.CalculationFunction))
  726. {
  727. //计算函数
  728. //计算结果
  729. string CalculationFunctionValue = diagnosisBuilder.GetItemCalculateResult(patientItemCalculateInput, item.Item.CalculationFunction);
  730. //CalculationFunctionValue = GetCodeResult(input, item.CalculationFunction, list);
  731. input.Items.Where(m => m.ItemId == item.Item.Id).FirstOrDefault().Result = CalculationFunctionValue; //赋值
  732. }
  733. }
  734. }
  735. #endregion
  736. /// <summary>
  737. /// 执行项目 诊断函数
  738. /// </summary>
  739. /// <param name="input"></param>
  740. /// <param name="item_datas"></param>
  741. /// <param name="patientRegister_data"></param>
  742. /// <param name="diagnosisTrips"></param>
  743. /// <returns></returns>
  744. private async Task<List<GetDiagnosisResult_Detail>> GetDiagnosisResultInItemAsync(GetDiagnosisResultRequestDto input, List<Item> item_datas, PatientRegister patientRegister_data, List<string> diagnosisTrips)
  745. {
  746. var reslist = new List<GetDiagnosisResult_Detail>();
  747. if (input.Items.Count > 0)
  748. {
  749. foreach (var item_data in item_datas)
  750. {
  751. if (item_data.IsDiagnosisFunction == 'Y' && !string.IsNullOrEmpty(item_data.DiagnosisFunction))
  752. {
  753. var DiagnosisFunctionResult_Item = GetCodeResult(input, item_data.DiagnosisFunction, item_datas);
  754. if (!string.IsNullOrEmpty(DiagnosisFunctionResult_Item))
  755. {
  756. reslist.Add(new GetDiagnosisResult_Detail
  757. {
  758. DiagnosisResult = DiagnosisFunctionResult_Item
  759. });
  760. }
  761. //是否继续执行参考范围规则
  762. if (item_data.IsContinueProcess == 'Y' && item_data.IsProduceSummary == 'Y')
  763. {
  764. string itemResult_Request = input.Items.Where(m => m.ItemId == item_data.Id).FirstOrDefault().Result; //项目结果
  765. //执行参考范围
  766. string referenceRangesResult = await GetDiagnosisResultInReferenceRangesAsync(item_data, itemResult_Request, patientRegister_data, diagnosisTrips);
  767. if (!string.IsNullOrEmpty(referenceRangesResult))
  768. {
  769. if (item_data.IsNameIntoSummary == 'Y')
  770. DiagnosisFunctionResult_Item = item_data.DisplayName + DiagnosisFunctionResult_Item;
  771. reslist.Add(new GetDiagnosisResult_Detail { DiagnosisResult = referenceRangesResult });
  772. }
  773. }
  774. }
  775. }
  776. }
  777. return reslist;
  778. }
  779. /// <summary>
  780. /// 执行项目 参考范围获取结果
  781. /// </summary>
  782. /// <param name="item"></param>
  783. /// <param name="itemResult"></param>
  784. /// <param name="patientRegister_data"></param>
  785. /// <param name="diagnosisTrips"></param>
  786. /// <returns></returns>
  787. private async Task<string> GetDiagnosisResultInReferenceRangesAsync(Item item, string itemResult, PatientRegister patientRegister_data, List<string> diagnosisTrips)
  788. {
  789. string referenceRangesResult = "";
  790. string diagnosisTrip = ""; //诊断提示,参考范围性别、年龄 异常时出现
  791. var item_ReferenceRangeList = item.ReferenceRanges.Where(m => m.ReferenceRangeTypeFlag == item.ReferenceRangeTypeFlag).ToList();
  792. if (item_ReferenceRangeList.Any() && item.ReferenceRangeTypeFlag == ItemReferenceRangeTypeFlag.Number)
  793. {
  794. //数字参考范围
  795. List<ReferenceRange> referenceRanges = new List<ReferenceRange>();
  796. if (patientRegister_data.Age != null)
  797. {
  798. referenceRanges = item_ReferenceRangeList.Where(m => m.AgeLowerLimit <= patientRegister_data.Age
  799. && m.AgeUpperLimit >= patientRegister_data.Age).ToList();
  800. }
  801. else
  802. {
  803. //if (string.IsNullOrEmpty(DiagnosisTrip))
  804. //{
  805. // DiagnosisTrip += "未登记年龄";
  806. //}
  807. //else
  808. //{
  809. // DiagnosisTrip += ",未登记年龄";
  810. //}
  811. diagnosisTrip = "未登记年龄";
  812. //找出默认的0-200
  813. referenceRanges = item_ReferenceRangeList.Where(m => m.AgeLowerLimit == 0
  814. && m.AgeUpperLimit == 200).ToList();
  815. }
  816. if (referenceRanges.Any())
  817. {
  818. //比对性别
  819. var referenceRanges2 = referenceRanges.Where(m => patientRegister_data.SexId != null && m.ForSexId == patientRegister_data.SexId).ToList();
  820. if (!referenceRanges2.Any())
  821. {
  822. //未找到,去匹配适用性别为A的
  823. referenceRanges2 = referenceRanges.Where(m => m.ForSexId == ForSexFlag.All).ToList();
  824. if (referenceRanges2.Any())
  825. {
  826. //数字参考范围类型
  827. referenceRangesResult = await GetDiagnosisResultInNumRangeAsync(item, itemResult, referenceRanges2[0]);
  828. }
  829. }
  830. }
  831. //////符合条件的参考范围
  832. //var item_ReferenceRange = item_ReferenceRangeList.Where(m =>
  833. //(m.ForSexId.ToString() == ForSexFlag.All || (patientRegister_data.SexId != null && m.ForSexId == patientRegister_data.SexId))
  834. // && patientRegister_data.Age != null
  835. // && m.AgeLowerLimit <= patientRegister_data.Age
  836. // && m.AgeUpperLimit >= patientRegister_data.Age).ToList();
  837. //if (item_ReferenceRange.Count > 0)
  838. //{
  839. // if (item_ReferenceRange.Count == 1)
  840. // {
  841. // //数字参考范围类型
  842. // result = await GetDiagnosisResultInNumRangeAsync(item, itemResult, item_ReferenceRange[0]);
  843. // }
  844. //}
  845. }
  846. else
  847. {
  848. //无参考范围或者字符参考范围
  849. referenceRangesResult = await GetDiagnosisResultInItemResultTemplateAsync(item, itemResult);
  850. if (string.IsNullOrEmpty(referenceRangesResult))
  851. {
  852. //未匹配上,继续
  853. referenceRangesResult = await GetDiagnosisResultInItemResultMatchAsync(item, itemResult);
  854. if (string.IsNullOrEmpty(referenceRangesResult))
  855. {
  856. //未匹配上,继续
  857. //对比项目默认结果,如果不是默认结果则直接用结果做为小结。
  858. if (item.DefaultResult != itemResult)
  859. {
  860. referenceRangesResult = itemResult;
  861. }
  862. }
  863. }
  864. }
  865. if (!string.IsNullOrEmpty(diagnosisTrip))
  866. diagnosisTrips.Add(diagnosisTrip);
  867. return referenceRangesResult;
  868. }
  869. /// <summary>
  870. /// 根据项目结果模板生成
  871. /// 检查项目结果模板,如果和项目结果模板一致,则根据对应的诊断生成小结 完全匹配
  872. /// </summary>
  873. /// <returns></returns>
  874. private async Task<string> GetDiagnosisResultInItemResultTemplateAsync(Item item, string itemResult)
  875. {
  876. string result = "";
  877. var temp_itemResultTemplate = await _itemResultTemplateRepository.FirstOrDefaultAsync(m => m.ItemId == item.Id && m.Result == itemResult);
  878. if (temp_itemResultTemplate != null && temp_itemResultTemplate.DiagnosisId != null && temp_itemResultTemplate.DiagnosisId != Guid.Empty)
  879. {
  880. var temp_diagnosis = await _diagnosisRepository.FirstOrDefaultAsync(m => m.Id == temp_itemResultTemplate.DiagnosisId);
  881. if (temp_diagnosis != null)
  882. {
  883. result = temp_diagnosis.DisplayName;
  884. }
  885. }
  886. return result;
  887. }
  888. /// <summary>
  889. /// 根据项目项目结果匹配(诊断匹配) 生成
  890. /// </summary>
  891. /// <returns></returns>
  892. private async Task<string> GetDiagnosisResultInItemResultMatchAsync(Item item, string itemResult)
  893. {
  894. string result = "";
  895. var temp_itemResultMatch = await _itemResultMatchRepository.FirstOrDefaultAsync(m => m.ItemId == item.Id && itemResult.Contains(m.Result));
  896. if (temp_itemResultMatch != null && temp_itemResultMatch.DiagnosisId != Guid.Empty)
  897. {
  898. var temp_diagnosis = await _diagnosisRepository.FirstOrDefaultAsync(m => m.Id == temp_itemResultMatch.DiagnosisId);
  899. if (temp_diagnosis != null)
  900. {
  901. result = temp_diagnosis.DisplayName;
  902. }
  903. }
  904. return result;
  905. }
  906. /// <summary>
  907. /// 根据数字型范围值对应的诊断匹配 生成
  908. /// 如果在范围外又没有设置诊断,则用项目名称加偏高偏低后缀生成小结(需要根据系统参数)。
  909. /// </summary>
  910. /// <param name="item"></param>
  911. /// <param name="itemResult"></param>
  912. /// <param name="item_ReferenceRange">当前匹配的参考范围</param>
  913. /// <returns></returns>
  914. private async Task<string> GetDiagnosisResultInNumRangeAsync(Item item, string itemResult, ReferenceRange item_ReferenceRange)
  915. {
  916. string result = "";
  917. string diagnosisFlag = "1"; //1=正常 2=偏高 0=偏低
  918. #region 处理异常结果 > < = 剔除
  919. itemResult = itemResult.Replace(">", "").Replace("<", "").Replace("=", "");
  920. try
  921. {
  922. var tempConvert = Convert.ToDecimal(itemResult);
  923. }
  924. catch (Exception ex)
  925. {
  926. return result;
  927. }
  928. #endregion
  929. #region 匹配参考范围
  930. string item_referenceRangeValue = item_ReferenceRange.ReferenceRangeValue;
  931. if (item_referenceRangeValue.IndexOf("-") > -1)
  932. {
  933. var value_ary = item_referenceRangeValue.Split('-');
  934. if (value_ary.Length == 2)
  935. {
  936. decimal minvalue = Convert.ToDecimal(value_ary[0]);
  937. decimal maxvalue = Convert.ToDecimal(value_ary[1]);
  938. if (Convert.ToDecimal(itemResult) > maxvalue)
  939. {
  940. //偏高
  941. diagnosisFlag = "2";
  942. }
  943. else if (Convert.ToDecimal(itemResult) < minvalue)
  944. {
  945. //偏低
  946. diagnosisFlag = "0";
  947. }
  948. }
  949. }
  950. else if (item_referenceRangeValue.IndexOf(">=") > -1)
  951. {
  952. if (Convert.ToDecimal(itemResult) < Convert.ToDecimal(item_referenceRangeValue.Replace(">=", "")))
  953. {
  954. //偏低
  955. diagnosisFlag = "0";
  956. }
  957. }
  958. else if (item_referenceRangeValue.IndexOf("<=") > -1)
  959. {
  960. if (Convert.ToDecimal(itemResult) > Convert.ToDecimal(item_referenceRangeValue.Replace("<=", "")))
  961. {
  962. //偏高
  963. diagnosisFlag = "2";
  964. }
  965. }
  966. else if (item_referenceRangeValue.IndexOf(">") > -1)
  967. {
  968. if (Convert.ToDecimal(itemResult) <= Convert.ToDecimal(item_referenceRangeValue.Replace(">", "")))
  969. {
  970. //偏低
  971. diagnosisFlag = "0";
  972. }
  973. }
  974. else if (item_referenceRangeValue.IndexOf("<") > -1)
  975. {
  976. if (Convert.ToDecimal(itemResult) >= Convert.ToDecimal(item_referenceRangeValue.Replace("<", "")))
  977. {
  978. //偏高
  979. diagnosisFlag = "2";
  980. }
  981. }
  982. if (diagnosisFlag == "2")
  983. {
  984. //偏高
  985. if (item_ReferenceRange.UpperDiagnosisId != null)
  986. {
  987. var temp_diagnosis = await _diagnosisRepository.FirstOrDefaultAsync(m => m.Id == item_ReferenceRange.UpperDiagnosisId);
  988. if (temp_diagnosis != null)
  989. {
  990. result = temp_diagnosis.DisplayName;
  991. }
  992. else
  993. {
  994. result = $"{item.DisplayName}偏高";
  995. }
  996. }
  997. else
  998. {
  999. result = $"{item.DisplayName}偏高";
  1000. }
  1001. }
  1002. else if (diagnosisFlag == "0")
  1003. {
  1004. //偏低
  1005. if (item_ReferenceRange.LowerDiagnosisId != null)
  1006. {
  1007. var temp_diagnosis = await _diagnosisRepository.FirstOrDefaultAsync(m => m.Id == item_ReferenceRange.LowerDiagnosisId);
  1008. if (temp_diagnosis != null)
  1009. {
  1010. result = temp_diagnosis.DisplayName;
  1011. }
  1012. else
  1013. {
  1014. result = $"{item.DisplayName}偏低";
  1015. }
  1016. }
  1017. else
  1018. {
  1019. result = $"{item.DisplayName}偏低";
  1020. }
  1021. }
  1022. #endregion
  1023. return result;
  1024. }
  1025. /// <summary>
  1026. /// 动态编译代码 返回string
  1027. /// </summary>
  1028. /// <param name="input"></param>
  1029. /// <param name="DiagnosisFunctionCode"></param>
  1030. /// <param name="item_datas"></param>
  1031. /// <returns></returns>
  1032. private string GetCodeResult(GetDiagnosisResultRequestDto input, string DiagnosisFunctionCode, List<Item> item_datas)
  1033. {
  1034. string result = "";
  1035. string DiagnosisFunctionCode_Replace = ReplaceFunctionLabel(input, DiagnosisFunctionCode, item_datas);
  1036. //拼接动态代码
  1037. string code = @"
  1038. public class DiagnosisResultInAsbitemHeight
  1039. {
  1040. public string AutoDiagnosisResultInAsbitemHeight()
  1041. {
  1042. var msg="""";"
  1043. + DiagnosisFunctionCode_Replace + @"
  1044. return msg;
  1045. }
  1046. }";
  1047. CompileHelper compileHelper = new CompileHelper();
  1048. var assembly = compileHelper.GenerateAssemblyFromCode(code, Assembly.Load(new AssemblyName("System.Runtime")), typeof(object).Assembly);
  1049. if (assembly != null)
  1050. {
  1051. // 反射获取程序集中 的类
  1052. Type type = assembly.GetType("DiagnosisResultInAsbitemHeight");
  1053. // 创建该类的实例
  1054. object obj = Activator.CreateInstance(type);
  1055. var msg = type.InvokeMember("AutoDiagnosisResultInAsbitemHeight",
  1056. BindingFlags.Default | BindingFlags.InvokeMethod,
  1057. null,
  1058. obj,
  1059. null);
  1060. if (!string.IsNullOrEmpty(msg.ToString()))
  1061. {
  1062. result = msg.ToString();
  1063. }
  1064. }
  1065. return result;
  1066. }
  1067. /// <summary>
  1068. /// 替换函数中的标签
  1069. /// </summary>
  1070. /// <param name="input"></param>
  1071. /// <param name="DiagnosisFunctionCode"></param>
  1072. /// <param name="item_datas"></param>
  1073. /// <returns></returns>
  1074. private string ReplaceFunctionLabel(GetDiagnosisResultRequestDto input, string DiagnosisFunctionCode, List<Item> item_datas)
  1075. {
  1076. string tempcode = DiagnosisFunctionCode;
  1077. //替换诊断函数中的标签
  1078. foreach (var item in input.Items)
  1079. {
  1080. if (item.ItemId != null)
  1081. {
  1082. var itement = item_datas.Where(m => m.Id == item.ItemId).FirstOrDefault(); //查询项目信息
  1083. if (itement != null)
  1084. {
  1085. //根据项目的名称 替换对应传过来的值
  1086. tempcode = tempcode.Replace($"[{itement.DisplayName}]", item.Result);
  1087. }
  1088. }
  1089. }
  1090. if (tempcode.IndexOf('[') != -1)
  1091. {
  1092. throw new UserFriendlyException("函数中有未识别的语法");
  1093. }
  1094. return tempcode;
  1095. }
  1096. #endregion
  1097. #region 危急值函数
  1098. /// <summary>
  1099. /// 获取人员是否有危急值项目
  1100. /// 【优先处理组合项目危急值函数
  1101. /// 未触发时执行项目危急值函数
  1102. /// 未触发项目检索危急值关键字
  1103. /// 未触发检索小结是否包含危急值关键字】
  1104. /// </summary>
  1105. /// <param name="doctorCheckDiagnosisInput"></param>
  1106. /// <param name="resultDto"></param>
  1107. /// <param name="criticalResultDtoList"></param>
  1108. /// <returns></returns>
  1109. public async Task<bool> GetPatientRegisterIsCriticalAsync(
  1110. DoctorCheckDiagnosisInput doctorCheckDiagnosisInput,
  1111. GetDiagnosisResultDto resultDto,
  1112. List<GetCriticalResultDto> criticalResultDtoList)
  1113. {
  1114. var isCritical = false;
  1115. isCritical = GetAsbitemCriticalFunction(doctorCheckDiagnosisInput, criticalResultDtoList);
  1116. if (isCritical)
  1117. {
  1118. return isCritical;
  1119. }
  1120. var criticalFollowValueList = await _criticalFollowValueRepository.GetListAsync(m => m.CriticalFollowValueFlag == CriticalFollowValueFlag.Critical);
  1121. //检索项目函数+关键字
  1122. isCritical = GetItemCriticalFunction(doctorCheckDiagnosisInput, criticalFollowValueList, criticalResultDtoList);
  1123. if (isCritical)
  1124. {
  1125. return isCritical;
  1126. }
  1127. //检索小结
  1128. foreach (var diagnosisResult in resultDto.DiagnosisResultDetails)
  1129. {
  1130. isCritical = criticalFollowValueList.Count(m => diagnosisResult.DiagnosisResult.Contains(m.DisplayName)) > 0 ? true : false;
  1131. if (isCritical)
  1132. break;
  1133. }
  1134. return isCritical;
  1135. }
  1136. /// <summary>
  1137. /// 获取人员是否有需要随访的项目
  1138. /// 【优先处理组合项目随访函数
  1139. /// 未触发时执行项目随访函数
  1140. /// 未触发项目检索随访关键字
  1141. /// 未触发检索小结是否包含随访关键字】
  1142. /// </summary>
  1143. /// <param name="doctorCheckDiagnosisInput"></param>
  1144. /// <param name="resultDto"></param>
  1145. /// <param name="criticalResultDtoList"></param>
  1146. /// <returns></returns>
  1147. public async Task<bool> GetPatientRegisterIsFollowUpAsync(
  1148. DoctorCheckDiagnosisInput doctorCheckDiagnosisInput,
  1149. GetDiagnosisResultDto resultDto,
  1150. List<GetCriticalResultDto> criticalResultDtoList)
  1151. {
  1152. var isCritical = false;
  1153. isCritical = GetAsbitemFollowUpFunction(doctorCheckDiagnosisInput, criticalResultDtoList);
  1154. if (isCritical)
  1155. {
  1156. return isCritical;
  1157. }
  1158. var criticalFollowValueList = await _criticalFollowValueRepository.GetListAsync(m => m.CriticalFollowValueFlag == CriticalFollowValueFlag.FollowUp);
  1159. //检索项目函数+关键字
  1160. isCritical = GetItemFollowUpFunction(doctorCheckDiagnosisInput, criticalFollowValueList, criticalResultDtoList);
  1161. if (isCritical)
  1162. {
  1163. return isCritical;
  1164. }
  1165. //检索小结
  1166. foreach (var diagnosisResult in resultDto.DiagnosisResultDetails)
  1167. {
  1168. isCritical = criticalFollowValueList.Count(m => diagnosisResult.DiagnosisResult.Contains(m.DisplayName)) > 0 ? true : false;
  1169. if (isCritical)
  1170. break;
  1171. }
  1172. return isCritical;
  1173. }
  1174. /// <summary>
  1175. /// 组合项目危急值函数
  1176. /// </summary>
  1177. /// <param name="doctorCheckDiagnosisInput"></param>
  1178. /// <param name="criticalResultDtoList"></param>
  1179. /// <returns></returns>
  1180. private bool GetAsbitemCriticalFunction(DoctorCheckDiagnosisInput doctorCheckDiagnosisInput, List<GetCriticalResultDto> criticalResultDtoList)
  1181. {
  1182. bool isCritical = false;
  1183. var patientAsbitemDiagnosisInput = new PatientAsbitemDiagnosisInput()
  1184. {
  1185. SexName = doctorCheckDiagnosisInput.SexName,
  1186. Age = doctorCheckDiagnosisInput.Age
  1187. };
  1188. foreach (var item in doctorCheckDiagnosisInput.Items)
  1189. {
  1190. var itemResult = new ItemResultInput()
  1191. {
  1192. ItemId = item.ItemId,
  1193. ItemName = item.ItemName,
  1194. Result = item.Result
  1195. };
  1196. patientAsbitemDiagnosisInput.Items.Add(itemResult);
  1197. }
  1198. var diagnosisBuilder = new DiagnosisBuilder();
  1199. foreach (var asbitem in doctorCheckDiagnosisInput.Asbitems)
  1200. {
  1201. if (asbitem.IsCriticalValueFunction == 'Y' && !string.IsNullOrWhiteSpace(asbitem.CriticalValueFunction))
  1202. {
  1203. isCritical = diagnosisBuilder.GetAsbitemCriticalResult(patientAsbitemDiagnosisInput, asbitem.DiagnosisFunction);
  1204. if (isCritical)
  1205. {
  1206. UpdateRegisterCheckCriticalResult(criticalResultDtoList, asbitem.RegisterCheckId, 'Y', 'Y', "");
  1207. //await CreateRegisterCheckCritical(asbitem.RegisterCheckId, 'Y', "");
  1208. break;
  1209. }
  1210. else
  1211. {
  1212. UpdateRegisterCheckCriticalResult(criticalResultDtoList, asbitem.RegisterCheckId, 'N', null, "");
  1213. }
  1214. }
  1215. }
  1216. return isCritical;
  1217. }
  1218. /// <summary>
  1219. /// 项目危急值函数
  1220. /// </summary>
  1221. /// <param name="doctorCheckDiagnosisInput"></param>
  1222. /// <param name="criticalFollowValueList"></param>
  1223. /// <param name="criticalResultDtoList"></param>
  1224. /// <returns></returns>
  1225. private bool GetItemCriticalFunction(
  1226. DoctorCheckDiagnosisInput doctorCheckDiagnosisInput,
  1227. List<CriticalFollowValue> criticalFollowValueList,
  1228. List<GetCriticalResultDto> criticalResultDtoList
  1229. )
  1230. {
  1231. bool isCritical = false;
  1232. var patientItemDiagnosisInput = new PatientItemDiagnosisInput()
  1233. {
  1234. SexName = doctorCheckDiagnosisInput.SexName,
  1235. Age = doctorCheckDiagnosisInput.Age
  1236. };
  1237. var diagnosisBuilder = new DiagnosisBuilder();
  1238. foreach (var item in doctorCheckDiagnosisInput.Items)
  1239. {
  1240. if (string.IsNullOrWhiteSpace(item.Result))
  1241. {
  1242. continue;
  1243. }
  1244. if (item.IsCriticalValueFunction == 'Y' && !string.IsNullOrWhiteSpace(item.CriticalValueFunction))
  1245. {
  1246. var itemResult = new ItemResultInput()
  1247. {
  1248. ItemId = item.ItemId,
  1249. ItemName = item.ItemName,
  1250. Result = item.Result
  1251. };
  1252. patientItemDiagnosisInput.Item = itemResult;
  1253. isCritical = diagnosisBuilder.GetItemCriticalResult(patientItemDiagnosisInput, item.CriticalValueFunction);
  1254. if (isCritical)
  1255. {
  1256. UpdateRegisterCheckItemCriticalResult(criticalResultDtoList, item.RegisterCheckId, item.ItemId, 'Y', 'Y', "");
  1257. //await CreateRegisterCheckItemCritical(item.RegisterCheckId, item.ItemId, 'Y', "");
  1258. break;
  1259. }
  1260. else
  1261. {
  1262. UpdateRegisterCheckItemCriticalResult(criticalResultDtoList, item.RegisterCheckId, item.ItemId, 'N', null, "");
  1263. }
  1264. }
  1265. #region 执行项目参考范围
  1266. var referenceRange = item.ReferenceRanges.Where(o => o.ForSexId == doctorCheckDiagnosisInput.SexId && doctorCheckDiagnosisInput.Age >= o.AgeLowerLimit && doctorCheckDiagnosisInput.Age <= o.AgeUpperLimit).FirstOrDefault();
  1267. if (referenceRange == null)
  1268. {
  1269. referenceRange = item.ReferenceRanges.Where(o => o.ForSexId == ForSexFlag.All && doctorCheckDiagnosisInput.Age >= o.AgeLowerLimit && doctorCheckDiagnosisInput.Age <= o.AgeUpperLimit).FirstOrDefault();
  1270. if (referenceRange != null && !string.IsNullOrWhiteSpace(referenceRange.CriticalRangeValue))
  1271. {
  1272. isCritical = _registerCheckItemManager.GetNumberResultIsCritical(item.Result, referenceRange.CriticalRangeValue);
  1273. if (isCritical)
  1274. {
  1275. UpdateRegisterCheckItemCriticalResult(criticalResultDtoList, item.RegisterCheckId, item.ItemId, 'Y', 'Y', referenceRange.CriticalRangeValue);
  1276. //await CreateRegisterCheckItemCritical(item.RegisterCheckId, item.ItemId, 'Y', "");
  1277. break;
  1278. }
  1279. else
  1280. {
  1281. UpdateRegisterCheckItemCriticalResult(criticalResultDtoList, item.RegisterCheckId, item.ItemId, 'N', null, "");
  1282. }
  1283. }
  1284. }
  1285. #endregion
  1286. var isCriticalFollowValue = criticalFollowValueList.FirstOrDefault(m => item.Result.Contains(m.DisplayName));
  1287. //关键字检索
  1288. if (isCriticalFollowValue != null)
  1289. {
  1290. isCritical = true;
  1291. }
  1292. if (isCritical)
  1293. {
  1294. UpdateRegisterCheckItemCriticalResult(criticalResultDtoList, item.RegisterCheckId, item.ItemId, 'Y', 'Y', isCriticalFollowValue.DisplayName);
  1295. //await CreateRegisterCheckItemCritical(item.RegisterCheckId, item.ItemId, 'Y', isCriticalFollowValue.DisplayName);
  1296. break;
  1297. }
  1298. else
  1299. {
  1300. UpdateRegisterCheckItemCriticalResult(criticalResultDtoList, item.RegisterCheckId, item.ItemId, 'N', null, "");
  1301. }
  1302. }
  1303. return isCritical;
  1304. }
  1305. /// <summary>
  1306. /// 组合项目随访函数
  1307. /// </summary>
  1308. /// <param name="doctorCheckDiagnosisInput"></param>
  1309. /// <param name="criticalResultDtoList"></param>
  1310. /// <returns></returns>
  1311. private bool GetAsbitemFollowUpFunction(DoctorCheckDiagnosisInput doctorCheckDiagnosisInput, List<GetCriticalResultDto> criticalResultDtoList)
  1312. {
  1313. bool isFollowUp = false;
  1314. var patientAsbitemDiagnosisInput = new PatientAsbitemDiagnosisInput()
  1315. {
  1316. SexName = doctorCheckDiagnosisInput.SexName,
  1317. Age = doctorCheckDiagnosisInput.Age
  1318. };
  1319. foreach (var item in doctorCheckDiagnosisInput.Items)
  1320. {
  1321. var itemResult = new ItemResultInput()
  1322. {
  1323. ItemId = item.ItemId,
  1324. ItemName = item.ItemName,
  1325. Result = item.Result
  1326. };
  1327. patientAsbitemDiagnosisInput.Items.Add(itemResult);
  1328. }
  1329. var diagnosisBuilder = new DiagnosisBuilder();
  1330. foreach (var asbitem in doctorCheckDiagnosisInput.Asbitems)
  1331. {
  1332. if (asbitem.IsFollowUpFunction == 'Y' && !string.IsNullOrWhiteSpace(asbitem.FollowUpFunction))
  1333. {
  1334. isFollowUp = diagnosisBuilder.GetAsbitemFollowUpResult(patientAsbitemDiagnosisInput, asbitem.DiagnosisFunction);
  1335. if (isFollowUp)
  1336. {
  1337. UpdateRegisterCheckCriticalResult(criticalResultDtoList, asbitem.RegisterCheckId, null, 'Y', "");
  1338. //await CreateRegisterCheckCritical(asbitem.RegisterCheckId, 'Y', "");
  1339. break;
  1340. }
  1341. else
  1342. {
  1343. UpdateRegisterCheckCriticalResult(criticalResultDtoList, asbitem.RegisterCheckId, null, 'N', "");
  1344. }
  1345. }
  1346. }
  1347. return isFollowUp;
  1348. }
  1349. /// <summary>
  1350. /// 项目随访函数
  1351. /// </summary>
  1352. /// <param name="doctorCheckDiagnosisInput"></param>
  1353. /// <param name="criticalFollowValueList"></param>
  1354. /// <param name="criticalResultDtoList"></param>
  1355. /// <returns></returns>
  1356. private bool GetItemFollowUpFunction(
  1357. DoctorCheckDiagnosisInput doctorCheckDiagnosisInput,
  1358. List<CriticalFollowValue> criticalFollowValueList,
  1359. List<GetCriticalResultDto> criticalResultDtoList
  1360. )
  1361. {
  1362. bool isFollowUp = false;
  1363. var patientItemDiagnosisInput = new PatientItemDiagnosisInput()
  1364. {
  1365. SexName = doctorCheckDiagnosisInput.SexName,
  1366. Age = doctorCheckDiagnosisInput.Age
  1367. };
  1368. var diagnosisBuilder = new DiagnosisBuilder();
  1369. foreach (var item in doctorCheckDiagnosisInput.Items)
  1370. {
  1371. if (string.IsNullOrWhiteSpace(item.Result))
  1372. {
  1373. continue;
  1374. }
  1375. if (item.IsFollowUpFunction == 'Y' && !string.IsNullOrWhiteSpace(item.FollowUpFunction))
  1376. {
  1377. var itemResult = new ItemResultInput()
  1378. {
  1379. ItemId = item.ItemId,
  1380. ItemName = item.ItemName,
  1381. Result = item.Result
  1382. };
  1383. patientItemDiagnosisInput.Item = itemResult;
  1384. isFollowUp = diagnosisBuilder.GetItemFollowUpResult(patientItemDiagnosisInput, item.FollowUpFunction);
  1385. if (isFollowUp)
  1386. {
  1387. UpdateRegisterCheckItemCriticalResult(criticalResultDtoList, item.RegisterCheckId, item.ItemId, null, 'Y', "");
  1388. // await CreateRegisterCheckItemCritical(item.RegisterCheckId, item.ItemId, 'N', "");
  1389. break;
  1390. }
  1391. else
  1392. {
  1393. UpdateRegisterCheckItemCriticalResult(criticalResultDtoList, item.RegisterCheckId, item.ItemId, null, 'N', "");
  1394. }
  1395. }
  1396. #region 执行项目参考范围
  1397. var referenceRange = item.ReferenceRanges.Where(o => o.ForSexId == doctorCheckDiagnosisInput.SexId && doctorCheckDiagnosisInput.Age >= o.AgeLowerLimit && doctorCheckDiagnosisInput.Age <= o.AgeUpperLimit).FirstOrDefault();
  1398. if (referenceRange == null)
  1399. {
  1400. referenceRange = item.ReferenceRanges.Where(o => o.ForSexId == ForSexFlag.All && doctorCheckDiagnosisInput.Age >= o.AgeLowerLimit && doctorCheckDiagnosisInput.Age <= o.AgeUpperLimit).FirstOrDefault();
  1401. if (referenceRange != null && !string.IsNullOrWhiteSpace(referenceRange.FollowUpRangeValue))
  1402. {
  1403. isFollowUp = _registerCheckItemManager.GetNumberResultIsFollow(item.Result, referenceRange.FollowUpRangeValue);
  1404. if (isFollowUp)
  1405. {
  1406. UpdateRegisterCheckItemCriticalResult(criticalResultDtoList, item.RegisterCheckId, item.ItemId, null, 'Y', referenceRange.FollowUpRangeValue);
  1407. //await CreateRegisterCheckItemCritical(item.RegisterCheckId, item.ItemId, 'N', referenceRange.FollowUpRangeValue);
  1408. break;
  1409. }
  1410. else
  1411. {
  1412. UpdateRegisterCheckItemCriticalResult(criticalResultDtoList, item.RegisterCheckId, item.ItemId, null, 'N', "");
  1413. }
  1414. }
  1415. }
  1416. #endregion
  1417. var isCriticalFollowValue = criticalFollowValueList.FirstOrDefault(m => item.Result.Contains(m.DisplayName));
  1418. if (isCriticalFollowValue != null)
  1419. {
  1420. isFollowUp = true;
  1421. }
  1422. if (isFollowUp)
  1423. {
  1424. UpdateRegisterCheckItemCriticalResult(criticalResultDtoList, item.RegisterCheckId, item.ItemId, null, 'Y', isCriticalFollowValue.DisplayName);
  1425. // await CreateRegisterCheckItemCritical(item.RegisterCheckId, item.ItemId, 'N', isCriticalFollowValue.DisplayName);
  1426. break;
  1427. }
  1428. else
  1429. {
  1430. UpdateRegisterCheckItemCriticalResult(criticalResultDtoList, item.RegisterCheckId, item.ItemId, null, 'N', "");
  1431. }
  1432. }
  1433. return isFollowUp;
  1434. }
  1435. /// <summary>
  1436. /// 生成危急值标记、随访记录
  1437. /// </summary>
  1438. /// <param name="patientRegisterId"></param>
  1439. private async Task CreateFollowUpAsync(Guid patientRegisterId)
  1440. {
  1441. var isFollowUp = await _followUpRepository.FirstOrDefaultAsync(f => f.PatientRegisterId == patientRegisterId);
  1442. if (isFollowUp == null)
  1443. {
  1444. var followUpEnt = new FollowUp
  1445. {
  1446. IsPhoneComplete = 'N',
  1447. IsSmsComplete = 'N',
  1448. PatientRegisterId = patientRegisterId
  1449. };
  1450. await _followUpRepository.InsertAsync(followUpEnt);
  1451. }
  1452. }
  1453. /// <summary>
  1454. /// 生成明细表危急值相关数据
  1455. /// </summary>
  1456. /// <param name="registerCheckId"></param>
  1457. /// <param name="itemId"></param>
  1458. /// <param name="isCriticalValue"></param>
  1459. /// <param name="isFollowUp"></param>
  1460. /// <param name="CriticalRangeValue"></param>
  1461. /// <returns></returns>
  1462. private async Task CreateRegisterCheckItemCritical(Guid registerCheckId, Guid itemId, char? isCriticalValue, char? isFollowUp, string CriticalRangeValue)
  1463. {
  1464. var registerCheckItemEnt = await _registerCheckItemRepository.FirstOrDefaultAsync(m => m.RegisterCheckId == registerCheckId
  1465. && m.ItemId == itemId);
  1466. if (registerCheckItemEnt != null)
  1467. {
  1468. registerCheckItemEnt.CriticalRangeValue = CriticalRangeValue;
  1469. registerCheckItemEnt.IsCriticalValue = isCriticalValue;
  1470. if (isCriticalValue == 'Y')
  1471. {
  1472. registerCheckItemEnt.CriticalValueCreatorId = _currentUser.Id;
  1473. registerCheckItemEnt.CriticalValueCreationTime = DateTime.Now;
  1474. }
  1475. if (isFollowUp == 'Y')
  1476. {
  1477. registerCheckItemEnt.FollowUpCreatorId = _currentUser.Id;
  1478. registerCheckItemEnt.FollowUpCreationTime = DateTime.Now;
  1479. }
  1480. //registerCheckItemEnt.IsCriticalValueAudit = 'N';
  1481. //registerCheckItemEnt.IsReview = 'N';
  1482. registerCheckItemEnt.IsFollowUp = isFollowUp;
  1483. await _registerCheckItemRepository.UpdateAsync(registerCheckItemEnt);
  1484. }
  1485. }
  1486. /// <summary>
  1487. /// 生成registerCheck表危急值相关数据
  1488. /// </summary>
  1489. /// <param name="registerCheckId"></param>
  1490. /// <param name="isCriticalValue"></param>
  1491. /// <param name="isFollowUp"></param>
  1492. /// <param name="CriticalRangeValue"></param>
  1493. /// <returns></returns>
  1494. private async Task CreateRegisterCheckCritical(Guid registerCheckId, char? isCriticalValue, char? isFollowUp, string CriticalRangeValue)
  1495. {
  1496. var registerCheckEnt = await _registerCheckRepository.FirstOrDefaultAsync(m => m.Id == registerCheckId);
  1497. if (registerCheckEnt != null)
  1498. {
  1499. registerCheckEnt.CriticalRangeValue = CriticalRangeValue;
  1500. if (isCriticalValue == 'Y')
  1501. {
  1502. registerCheckEnt.CriticalValueCreatorId = _currentUser.Id;
  1503. registerCheckEnt.CriticalValueCreationTime = DateTime.Now;
  1504. registerCheckEnt.IsCriticalValue = isCriticalValue;
  1505. }
  1506. if (isFollowUp == 'Y')
  1507. {
  1508. registerCheckEnt.FollowUpCreatorId = _currentUser.Id;
  1509. registerCheckEnt.FollowUpCreationTime = DateTime.Now;
  1510. }
  1511. //registerCheckEnt.IsCriticalValueAudit = 'N';
  1512. //registerCheckEnt.IsReview = 'N';
  1513. registerCheckEnt.IsFollowUp = isFollowUp;
  1514. await _registerCheckRepository.UpdateAsync(registerCheckEnt);
  1515. }
  1516. }
  1517. /// <summary>
  1518. /// 临时更新危急值状态 registerCheck
  1519. /// </summary>
  1520. /// <param name="criticalResultDtoList"></param>
  1521. /// <param name="registerCheckId"></param>
  1522. /// <param name="isCritical"></param>
  1523. /// <param name="isFollowUp"></param>
  1524. /// <param name="criticalRangeValue"></param>
  1525. private void UpdateRegisterCheckCriticalResult(List<GetCriticalResultDto> criticalResultDtoList, Guid registerCheckId, char? isCritical, char? isFollowUp, string criticalRangeValue)
  1526. {
  1527. if (criticalResultDtoList.Where(m => m.RegisterCheckId == registerCheckId).Count() == 0)
  1528. {
  1529. criticalResultDtoList.Add(new GetCriticalResultDto
  1530. {
  1531. RegisterCheckId = registerCheckId
  1532. });
  1533. }
  1534. else
  1535. {
  1536. foreach (var criticalResultDto in criticalResultDtoList)
  1537. {
  1538. if (criticalResultDto.RegisterCheckId == registerCheckId)
  1539. {
  1540. if (isCritical != null && criticalResultDto.IsCritical != 'Y')
  1541. {
  1542. criticalResultDto.IsCritical = isCritical;
  1543. }
  1544. if (isFollowUp != null && criticalResultDto.IsFollowUp != 'Y')
  1545. {
  1546. criticalResultDto.IsFollowUp = isFollowUp;
  1547. }
  1548. if (!string.IsNullOrWhiteSpace(criticalRangeValue))
  1549. {
  1550. criticalResultDto.CriticalRangeValue = criticalRangeValue;
  1551. }
  1552. }
  1553. }
  1554. }
  1555. }
  1556. /// <summary>
  1557. /// 临时更新危急值状态 registerCheckItem
  1558. /// </summary>
  1559. /// <param name="criticalResultDtoList"></param>
  1560. /// <param name="registerCheckId"></param>
  1561. /// <param name="itemId"></param>
  1562. /// <param name="isCritical"></param>
  1563. /// <param name="isFollowUp"></param>
  1564. /// <param name="criticalRangeValue"></param>
  1565. private void UpdateRegisterCheckItemCriticalResult(List<GetCriticalResultDto> criticalResultDtoList, Guid registerCheckId, Guid itemId, char? isCritical, char? isFollowUp, string criticalRangeValue)
  1566. {
  1567. //先增加registerCheck
  1568. if (criticalResultDtoList.Where(m => m.RegisterCheckId == registerCheckId).Count() == 0)
  1569. {
  1570. criticalResultDtoList.Add(new GetCriticalResultDto
  1571. {
  1572. RegisterCheckId = registerCheckId
  1573. });
  1574. }
  1575. foreach (var criticalResultDto in criticalResultDtoList)
  1576. {
  1577. if (criticalResultDto.RegisterCheckId == registerCheckId)
  1578. {
  1579. if (criticalResultDto.ItemDetails.Where(m => m.ItemId == itemId).Count() == 0)
  1580. {
  1581. var itemCriticalResultDto = new GetItemCriticalResultDto();
  1582. itemCriticalResultDto.RegisterCheckId = registerCheckId;
  1583. itemCriticalResultDto.ItemId = itemId;
  1584. if (isFollowUp != null && itemCriticalResultDto.IsFollowUp != 'Y')
  1585. {
  1586. itemCriticalResultDto.IsFollowUp = isFollowUp;
  1587. }
  1588. if (isCritical != null && itemCriticalResultDto.IsCritical != 'Y')
  1589. {
  1590. itemCriticalResultDto.IsCritical = isCritical;
  1591. }
  1592. if (!string.IsNullOrWhiteSpace(criticalRangeValue))
  1593. {
  1594. itemCriticalResultDto.CriticalRangeValue = criticalRangeValue;
  1595. }
  1596. criticalResultDto.ItemDetails.Add(itemCriticalResultDto);
  1597. }
  1598. else
  1599. {
  1600. foreach (var itemCriticalResultDto in criticalResultDto.ItemDetails)
  1601. {
  1602. if (itemCriticalResultDto.ItemId == itemId)
  1603. {
  1604. itemCriticalResultDto.RegisterCheckId = registerCheckId;
  1605. itemCriticalResultDto.ItemId = itemId;
  1606. if (isFollowUp != null && itemCriticalResultDto.IsFollowUp != 'Y')
  1607. {
  1608. itemCriticalResultDto.IsFollowUp = isFollowUp;
  1609. }
  1610. if (isCritical != null && itemCriticalResultDto.IsCritical != 'Y')
  1611. {
  1612. itemCriticalResultDto.IsCritical = isCritical;
  1613. }
  1614. if (!string.IsNullOrWhiteSpace(criticalRangeValue))
  1615. {
  1616. itemCriticalResultDto.CriticalRangeValue = criticalRangeValue;
  1617. }
  1618. }
  1619. }
  1620. }
  1621. }
  1622. }
  1623. }
  1624. /// <summary>
  1625. /// 处理危急值记录
  1626. /// </summary>
  1627. /// <param name="criticalResultDtoList"></param>
  1628. /// <param name="patientRegisterId"></param>
  1629. /// <returns></returns>
  1630. private async Task HandCriticalResult(List<GetCriticalResultDto> criticalResultDtoList, Guid patientRegisterId)
  1631. {
  1632. bool isCreateFollowUp = false;
  1633. foreach (var criticalResultDto in criticalResultDtoList)
  1634. {
  1635. foreach (var itemCriticalResultDto in criticalResultDto.ItemDetails)
  1636. {
  1637. if (itemCriticalResultDto.IsCritical == 'Y' || itemCriticalResultDto.IsFollowUp == 'Y')
  1638. {
  1639. isCreateFollowUp = true;
  1640. if (itemCriticalResultDto.IsCritical == 'Y')
  1641. {
  1642. criticalResultDto.IsCritical = itemCriticalResultDto.IsCritical;
  1643. }
  1644. if (itemCriticalResultDto.IsFollowUp == 'Y')
  1645. {
  1646. criticalResultDto.IsFollowUp = itemCriticalResultDto.IsFollowUp;
  1647. }
  1648. }
  1649. await CreateRegisterCheckItemCritical(itemCriticalResultDto.RegisterCheckId, itemCriticalResultDto.ItemId, itemCriticalResultDto.IsCritical, itemCriticalResultDto.IsFollowUp, itemCriticalResultDto.CriticalRangeValue);
  1650. }
  1651. if (criticalResultDto.IsCritical == 'Y' || criticalResultDto.IsFollowUp == 'Y')
  1652. {
  1653. isCreateFollowUp = true;
  1654. }
  1655. await CreateRegisterCheckCritical(criticalResultDto.RegisterCheckId, criticalResultDto.IsCritical, criticalResultDto.IsFollowUp, criticalResultDto.CriticalRangeValue);
  1656. }
  1657. if (isCreateFollowUp)
  1658. {
  1659. //增加随访主表记录
  1660. await _followUpAppService.CreateAsync(new PatientRegisterIdInputDto
  1661. {
  1662. PatientRegisterId = patientRegisterId
  1663. });
  1664. }
  1665. else
  1666. {
  1667. //删除随访表记录
  1668. await _followUpAppService.DeleteByPatientRegisterId(new PatientRegisterIdInputDto
  1669. {
  1670. PatientRegisterId = patientRegisterId
  1671. });
  1672. }
  1673. }
  1674. #endregion
  1675. }
  1676. }