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.

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