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.

1578 lines
66 KiB

2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
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. using Microsoft.AspNetCore.Authorization;
  2. using Microsoft.AspNetCore.Mvc;
  3. using Microsoft.CodeAnalysis;
  4. using Microsoft.CodeAnalysis.CSharp.Syntax;
  5. using Microsoft.EntityFrameworkCore;
  6. using NPOI.DDF;
  7. using NUglify.Helpers;
  8. using Shentun.Peis.Enums;
  9. using Shentun.Peis.Models;
  10. using Shentun.Peis.Sexs;
  11. using Shentun.Peis.SumDiagnosises;
  12. using Shentun.Peis.SysParmValues;
  13. using System;
  14. using System.Collections.Generic;
  15. using System.Linq;
  16. using System.Reflection;
  17. using System.Text;
  18. using System.Text.RegularExpressions;
  19. using System.Threading.Tasks;
  20. using TencentCloud.Cdn.V20180606.Models;
  21. using TencentCloud.Pts.V20210728.Models;
  22. using Volo.Abp;
  23. using Volo.Abp.Application.Services;
  24. using Volo.Abp.Domain.Repositories;
  25. using Volo.Abp.Uow;
  26. using Xceed.Document.NET;
  27. using static Microsoft.EntityFrameworkCore.DbLoggerCategory;
  28. namespace Shentun.Peis.DiagnosisFunctions
  29. {
  30. [ApiExplorerSettings(GroupName = "Work")]
  31. [Authorize]
  32. public class DiagnosisFunctionAppService : ApplicationService
  33. {
  34. private readonly IRepository<PatientRegister, Guid> _patientRegisterRepository;
  35. private readonly IRepository<RegisterCheckAsbitem, Guid> _registerAsbitemRepository;
  36. private readonly IRepository<Asbitem, Guid> _asbitemRepository;
  37. private readonly IRepository<Item, Guid> _itemRepository;
  38. private readonly IRepository<AsbitemDetail> _asbitemDetailRepository;
  39. private readonly IRepository<RegisterCheck, Guid> _registerCheckRepository;
  40. private readonly IRepository<RegisterCheckItem> _registerCheckItemRepository;
  41. private readonly IRepository<Diagnosis, Guid> _diagnosisRepository;
  42. private readonly IRepository<ItemResultTemplate, Guid> _itemResultTemplateRepository;
  43. private readonly IRepository<ItemResultMatch, Guid> _itemResultMatchRepository;
  44. private readonly IRepository<Suggestion, Guid> _suggestionRepository;
  45. private readonly CacheService _cacheService;
  46. private SysParmValueManager _sysParmValueManager;
  47. private string _isAddAbnormalResult;
  48. private string _isAddReferenceRange;
  49. private string _isAutoAddSuffix;
  50. private string _lowerSuffix;
  51. private string _highSuffix;
  52. string[] _numArry = { "①", "②", "③", "④", "⑤", "⑥", "⑦", "⑧", "⑨", "⑩",
  53. "⑪", "⑫", "⑬", "⑭", "⑮", "⑯", "⑰", "⑱", "⑲", "⑳" };
  54. public DiagnosisFunctionAppService(
  55. IRepository<PatientRegister, Guid> patientRegisterRepository,
  56. IRepository<RegisterCheckAsbitem, Guid> registerAsbitemRepository,
  57. IRepository<Asbitem, Guid> asbitemRepository,
  58. IRepository<Item, Guid> itemRepository,
  59. IRepository<AsbitemDetail> asbitemDetailRepository,
  60. IRepository<RegisterCheck, Guid> registerCheckRepository,
  61. IRepository<RegisterCheckItem> registerCheckItemRepository,
  62. IRepository<Diagnosis, Guid> diagnosisRepository,
  63. IRepository<ItemResultTemplate, Guid> itemResultTemplateRepository,
  64. IRepository<ItemResultMatch, Guid> itemResultMatchRepository,
  65. IRepository<Suggestion, Guid> suggestionRepository,
  66. CacheService cacheService,
  67. SysParmValueManager sysParmValueManager)
  68. {
  69. this._patientRegisterRepository = patientRegisterRepository;
  70. this._registerAsbitemRepository = registerAsbitemRepository;
  71. this._asbitemRepository = asbitemRepository;
  72. this._itemRepository = itemRepository;
  73. this._asbitemDetailRepository = asbitemDetailRepository;
  74. this._registerCheckRepository = registerCheckRepository;
  75. this._registerCheckItemRepository = registerCheckItemRepository;
  76. this._diagnosisRepository = diagnosisRepository;
  77. this._itemResultTemplateRepository = itemResultTemplateRepository;
  78. this._itemResultMatchRepository = itemResultMatchRepository;
  79. this._suggestionRepository = suggestionRepository;
  80. _cacheService = cacheService;
  81. _sysParmValueManager = sysParmValueManager;
  82. }
  83. #region hide
  84. ///// <summary>
  85. ///// 医生诊台生成小结
  86. ///// </summary>
  87. ///// <param name="input"></param>
  88. ///// <returns></returns>
  89. //[HttpPost("api/app/diagnosisfunction/getdiagnosisresult")]
  90. //public async Task<List<GetDiagnosisResultDto>> GetDiagnosisResultAsync(GetDiagnosisResultRequestDto input)
  91. //{
  92. // var reslist = new List<GetDiagnosisResultDto>();
  93. // var registerAsbitems = from a in await _registerAsbitemRepository.GetListAsync()
  94. // join b in await _asbitemRepository.GetListAsync() on a.AsbitemId equals b.Id into bb
  95. // from ab in bb.DefaultIfEmpty()
  96. // where a.PatientRegisterId == input.PatientRegisterId
  97. // select ab;
  98. // foreach (var item in registerAsbitems)
  99. // {
  100. // if (item.IsDiagnosisFunction == 'Y' && !string.IsNullOrEmpty(item.DiagnosisFunction))
  101. // {
  102. // if (item.DisplayName == "身高体重")
  103. // {
  104. // var res = await GetDiagnosisResultInAsbitemHeightAsync(input, item.DiagnosisFunction, item.IsContinueProcess);
  105. // if (res.Count > 0)
  106. // {
  107. // reslist.AddRange(res);
  108. // }
  109. // }
  110. // }
  111. // }
  112. // return reslist;
  113. //}
  114. ///// <summary>
  115. ///// 组合函数 身高体重 生成
  116. ///// </summary>
  117. ///// <param name="input"></param>
  118. ///// <param name="DiagnosisFunction">诊断函数</param>
  119. ///// <param name="IsContinueProcess">处理完是否继续执行项目的诊断函数</param>
  120. ///// <returns></returns>
  121. //private async Task<List<GetDiagnosisResultDto>> GetDiagnosisResultInAsbitemHeightAsync(GetDiagnosisResultRequestDto input, string DiagnosisFunction, char IsContinueProcess)
  122. //{
  123. // var reslist = new List<GetDiagnosisResultDto>();
  124. // if (input.Items.Count > 0)
  125. // {
  126. // var itemList = await _itemRepository.GetListAsync();
  127. // string DiagnosisFunctionCode = DiagnosisFunction;
  128. // foreach (var item in input.Items)
  129. // {
  130. // if (item.ItemId != null)
  131. // {
  132. // var itement = itemList.Where(m => m.Id == item.ItemId).FirstOrDefault();
  133. // if (itement != null)
  134. // {
  135. // DiagnosisFunctionCode = DiagnosisFunctionCode.Replace($"[{itement.DisplayName}]", item.Result);
  136. // }
  137. // }
  138. // }
  139. // ////拼接动态代码
  140. // //string code = @"
  141. // // using System;
  142. // // namespace Shentun.Peis
  143. // // {
  144. // // public class DiagnosisResultInAsbitemHeight
  145. // // {
  146. // // public string AutoDiagnosisResultInAsbitemHeight()
  147. // // {
  148. // // var msg="""";"
  149. // // + DiagnosisFunctionCode + @"
  150. // // return msg;
  151. // // }
  152. // // }
  153. // // }";
  154. // //拼接动态代码
  155. // string code = @"
  156. // public class DiagnosisResultInAsbitemHeight
  157. // {
  158. // public string AutoDiagnosisResultInAsbitemHeight()
  159. // {
  160. // var msg="""";"
  161. // + DiagnosisFunctionCode + @"
  162. // return msg;
  163. // }
  164. // }";
  165. // CompileHelper compileHelper = new CompileHelper();
  166. // var assembly = compileHelper.GenerateAssemblyFromCode(code, Assembly.Load(new AssemblyName("System.Runtime")), typeof(object).Assembly);
  167. // if (assembly != null)
  168. // {
  169. // // 反射获取程序集中 的类
  170. // Type type = assembly.GetType("DiagnosisResultInAsbitemHeight");
  171. // // 创建该类的实例
  172. // object obj = Activator.CreateInstance(type);
  173. // var msg = type.InvokeMember("AutoDiagnosisResultInAsbitemHeight",
  174. // BindingFlags.Default | BindingFlags.InvokeMethod,
  175. // null,
  176. // obj,
  177. // null);
  178. // if (!string.IsNullOrEmpty(msg.ToString()))
  179. // {
  180. // reslist.Add(new GetDiagnosisResultDto { DiagnosisResult = msg.ToString() });
  181. // }
  182. // }
  183. // }
  184. // return reslist;
  185. //}
  186. #endregion
  187. /// <summary>
  188. /// 医生诊台生成小结
  189. /// </summary>
  190. /// <param name="input"></param>
  191. /// <returns></returns>
  192. [HttpPost("api/app/diagnosisfunction/getdiagnosisresult")]
  193. public async Task<OkObjectResult> GetDiagnosisResultAsync(GetDiagnosisResultRequestDto input)
  194. {
  195. throw new Exception("禁止使用");
  196. var reslist = new List<GetDiagnosisResult_Detail>();
  197. var suggestionlist = new List<GetDiagnosisSuggestion_Detail>();
  198. // await GetCalculationFunctionAsync(input); //取消计算函数计算
  199. //根据检查单ID查询
  200. var query = (from a in await _registerCheckRepository.GetQueryableAsync()
  201. join b in await _registerAsbitemRepository.GetQueryableAsync() on a.Id equals b.RegisterCheckId
  202. join c in await _registerCheckItemRepository.GetQueryableAsync() on a.Id equals c.RegisterCheckId
  203. join d in await _asbitemRepository.GetQueryableAsync() on b.AsbitemId equals d.Id
  204. join e in (await _itemRepository.GetQueryableAsync()).Include(x => x.ReferenceRanges) on c.ItemId equals e.Id
  205. join f in await _patientRegisterRepository.GetQueryableAsync() on b.PatientRegisterId equals f.Id
  206. where a.Id == input.RegisterCheckId
  207. select new { a, b, c, d, e, f }).ToList();
  208. List<string> diagnosisTrips = new List<string>(); //异常提示
  209. if (query.Count() > 0)
  210. {
  211. //组合项目数据
  212. // var asbitem_Data = query.GroupBy(g => g.b.Id).Select(s=>new )
  213. var asbitem_Group = query.GroupBy(g => g.b.Id);
  214. //正常是一个,合并过项目可能存在多个
  215. foreach (var item in asbitem_Group)
  216. {
  217. var asbitem_data = item.Select(s => s.d).FirstOrDefault(); //组合项目信息
  218. var item_datas = item.Select(s => s.e).ToList(); //项目信息
  219. var patientRegister_data = item.Select(s => s.f).FirstOrDefault();
  220. //是否开启组合项目诊断函数
  221. if (asbitem_data.IsDiagnosisFunction == 'Y' && !string.IsNullOrEmpty(asbitem_data.DiagnosisFunction))
  222. {
  223. var res = await GetDiagnosisResultInAsbitemAsync(input, asbitem_data, item_datas, patientRegister_data, diagnosisTrips);
  224. if (res.Count > 0)
  225. {
  226. reslist.AddRange(res);
  227. }
  228. }
  229. else
  230. {
  231. //查找项目诊断函数
  232. var itemResult = await GetDiagnosisResultInItemAsync(input, item_datas, patientRegister_data, diagnosisTrips); //执行项目诊断函数
  233. if (itemResult.Any())
  234. {
  235. reslist.AddRange(itemResult);
  236. }
  237. }
  238. if (!reslist.Any())
  239. {
  240. //未生成小结,继续根据参考范围生成
  241. foreach (var item_data in item_datas)
  242. {
  243. if (item_data.IsProduceSummary == 'Y')
  244. {
  245. string itemResult_Request = input.Items.Where(m => m.ItemId == item_data.Id).FirstOrDefault()?.Result; //项目结果
  246. string referenceRangesResult = await GetDiagnosisResultInReferenceRangesAsync(item_data, itemResult_Request, patientRegister_data, diagnosisTrips);
  247. if (!string.IsNullOrEmpty(referenceRangesResult))
  248. {
  249. if (item_data.IsNameIntoSummary == 'Y')
  250. referenceRangesResult = item_data.DisplayName + referenceRangesResult;
  251. reslist.Add(new GetDiagnosisResult_Detail { DiagnosisResult = referenceRangesResult });
  252. }
  253. }
  254. }
  255. }
  256. }
  257. }
  258. //无结果 加未见异常
  259. if (!reslist.Any())
  260. reslist.Add(new GetDiagnosisResult_Detail { DiagnosisResult = "未见异常" });
  261. else
  262. {
  263. //小结内容去重
  264. reslist = reslist.Where((x, i) => reslist.FindIndex(z => z.DiagnosisResult == x.DiagnosisResult) == i).ToList();
  265. //生成建议
  266. var suggestion_query = from a in await _suggestionRepository.GetQueryableAsync()
  267. join b in await _diagnosisRepository.GetQueryableAsync() on a.DiagnosisId equals b.Id
  268. where reslist.Select(s => s.DiagnosisResult).Contains(b.DisplayName)
  269. select a;
  270. if (suggestion_query.Count() > 0)
  271. {
  272. suggestionlist = suggestion_query.Select(s => new GetDiagnosisSuggestion_Detail
  273. {
  274. DiagnosisSuggestion = s.SuggestionContent
  275. }).ToList();
  276. }
  277. }
  278. string diagnosisTrip = "";
  279. if (diagnosisTrips.Any())
  280. {
  281. diagnosisTrip = string.Join(",", diagnosisTrips.Distinct().ToList());
  282. }
  283. var resdto = new GetDiagnosisResultDto
  284. {
  285. DiagnosisResultDetails = reslist,
  286. DiagnosisSuggestionDetails = suggestionlist,
  287. };
  288. if (!string.IsNullOrEmpty(diagnosisTrip))
  289. {
  290. return new OkObjectResult(CustomerReturnValue.CreateInstance(0, diagnosisTrip, resdto));
  291. }
  292. else
  293. {
  294. return new OkObjectResult(CustomerReturnValue.CreateInstance(1, "Success", resdto));
  295. }
  296. }
  297. [HttpPost("api/app/DiagnosisFunction/GetDoctorCheckDiagnosisResultAsync")]
  298. public async Task<GetDiagnosisResultDto> GetDoctorCheckDiagnosisResultAsync(GetDiagnosisResultRequestDto input)
  299. {
  300. var reslist = new List<GetDiagnosisResult_Detail>();
  301. var suggestionlist = new List<GetDiagnosisSuggestion_Detail>();
  302. //根据检查单ID查询
  303. var query = (from registerCheck in await _registerCheckRepository.GetQueryableAsync()
  304. join registerAsbitem in await _registerAsbitemRepository.GetQueryableAsync() on registerCheck.Id equals registerAsbitem.RegisterCheckId
  305. join registerCheckItem in await _registerCheckItemRepository.GetQueryableAsync() on registerCheck.Id equals registerCheckItem.RegisterCheckId
  306. join asbitem in await _asbitemRepository.GetQueryableAsync() on registerAsbitem.AsbitemId equals asbitem.Id
  307. join item in (await _itemRepository.GetQueryableAsync()).Include(x => x.ReferenceRanges).Include(x => x.ItemResultMatches).Include(x => x.ItemResultTemplates)
  308. on registerCheckItem.ItemId equals item.Id
  309. join patientRegister in await _patientRegisterRepository.GetQueryableAsync() on registerCheck.PatientRegisterId equals patientRegister.Id
  310. where registerCheck.Id == input.RegisterCheckId
  311. select new { registerCheck, registerAsbitem, registerCheckItem, asbitem, item, patientRegister }).ToList();
  312. var resultDto = new GetDiagnosisResultDto
  313. {
  314. DiagnosisResultDetails = reslist,
  315. DiagnosisSuggestionDetails = suggestionlist,
  316. };
  317. if (query.Count() == 0)
  318. {
  319. return resultDto;
  320. }
  321. await LoadSysParm(query[0].patientRegister.MedicalCenterId);
  322. /*:
  323. * 1,
  324. * 2
  325. * 3
  326. * 4
  327. * 5
  328. * */
  329. //设置基本参数
  330. var doctorCheckDiagnosisInput = new DoctorCheckDiagnosisInput()
  331. {
  332. SexId = query[0].patientRegister.SexId,
  333. SexName = _cacheService.GetSexNameAsync(query[0].patientRegister.SexId).Result,
  334. Age = query[0].patientRegister.Age
  335. };
  336. foreach (var item in query)
  337. {
  338. //组合项目参数
  339. if (doctorCheckDiagnosisInput.Asbitems.Where(o => o.AsbitemId == item.asbitem.Id).Count() == 0)
  340. {
  341. var asbitemInput = new AsbitemInput()
  342. {
  343. AsbitemId = item.asbitem.Id,
  344. AsbitemName = item.asbitem.DisplayName,
  345. IsDiagnosisFunction = item.asbitem.IsDiagnosisFunction,
  346. DiagnosisFunction = item.asbitem.DiagnosisFunction,
  347. IsContinueProcess = item.asbitem.IsContinueProcess,
  348. DefaultResult = item.asbitem.DefaultResult,
  349. };
  350. doctorCheckDiagnosisInput.Asbitems.Add(asbitemInput);
  351. }
  352. //项目参数
  353. if (doctorCheckDiagnosisInput.Items.Where(o => o.ItemId == item.item.Id).Count() == 0)
  354. {
  355. var inputItem = input.Items.Where(o => o.ItemId == item.item.Id).FirstOrDefault();
  356. var inputResult = "";
  357. if(inputItem != null)
  358. {
  359. inputResult = inputItem.Result;
  360. }
  361. var itemInput = new ItemInput()
  362. {
  363. ItemId = item.item.Id,
  364. ItemName = item.item.DisplayName,
  365. IsDiagnosisFunction = item.item.IsDiagnosisFunction,
  366. DiagnosisFunction = item.item.DiagnosisFunction,
  367. IsContinueProcess = item.item.IsContinueProcess,
  368. IsNameIntoSummary = item.item.IsNameIntoSummary,
  369. IsProduceSummary = item.item.IsProduceSummary,
  370. ReferenceRangeTypeFlag = item.item.ReferenceRangeTypeFlag,
  371. DefaultResult = item.item.DefaultResult,
  372. Result = inputResult,
  373. DisplayOrder = item.item.DisplayOrder,
  374. ItemResultMatches = item.item.ItemResultMatches.ToList(),
  375. ItemResultTemplates = item.item.ItemResultTemplates.ToList(),
  376. ReferenceRanges = item.item.ReferenceRanges.ToList()
  377. };
  378. doctorCheckDiagnosisInput.Items.Add(itemInput);
  379. }
  380. }
  381. doctorCheckDiagnosisInput.Items = doctorCheckDiagnosisInput.Items.OrderBy(o=>o.DisplayOrder).ToList();
  382. //处理组合项目诊断函数
  383. List<string> diagnosisList = new List<string>();
  384. List<string> asbitemDiagnosisList;
  385. var isContinueProcess = GetAsbitemDiagnosisByFunction(doctorCheckDiagnosisInput, out asbitemDiagnosisList);
  386. diagnosisList.AddRange(asbitemDiagnosisList);
  387. if (isContinueProcess)
  388. {
  389. //处理项目诊断
  390. var itemDiagnosisList = await GetItemDiagnosis(doctorCheckDiagnosisInput);
  391. var itemDiagnosisStringList = GetItemDiagnosisStringList(itemDiagnosisList);
  392. diagnosisList.AddRange(itemDiagnosisStringList);
  393. }
  394. //设置返回值
  395. //去掉空结果数据
  396. diagnosisList = diagnosisList.Where(o => !string.IsNullOrWhiteSpace(o)).ToList();
  397. //去掉重复结果数据
  398. diagnosisList = diagnosisList.Distinct().ToList();
  399. if (!diagnosisList.Any())
  400. {
  401. //设置组合项目默认小结
  402. diagnosisList.Add(doctorCheckDiagnosisInput.Asbitems[0].DefaultResult);
  403. }
  404. foreach(var diagnosis in diagnosisList)
  405. {
  406. var getDiagnosisResult_Detail = new GetDiagnosisResult_Detail()
  407. {
  408. DiagnosisResult = diagnosis
  409. };
  410. resultDto.DiagnosisResultDetails.Add(getDiagnosisResult_Detail);
  411. }
  412. return resultDto;
  413. }
  414. private List<string> GetItemDiagnosisStringList(List<DoctorCheckItemDiagnosisResult> itemDiagnosisList)
  415. {
  416. var diagnosisList = new List<string>();
  417. foreach (var itemDiagnosis in itemDiagnosisList)
  418. {
  419. if (!itemDiagnosis.ItemDiagnosisTypeResults.Any())
  420. {
  421. continue;
  422. }
  423. string diagnosis = "";
  424. foreach (var itemDiagnosisType in itemDiagnosis.ItemDiagnosisTypeResults)
  425. {
  426. if (itemDiagnosisType.DiagnosisType == '1')
  427. {
  428. //数字型检验参考范围
  429. diagnosisList.AddRange(itemDiagnosisType.Diagnosis);
  430. }
  431. else
  432. {
  433. if (itemDiagnosisType.Diagnosis.Count() > _numArry.Count())
  434. {
  435. throw new UserFriendlyException($"诊断数量超过{_numArry.Count()}个,不支持");
  436. }
  437. if (itemDiagnosisType.Diagnosis.Count() == 0)
  438. {
  439. continue;
  440. }
  441. for (int i = 0; i < itemDiagnosisType.Diagnosis.Count(); i++)
  442. {
  443. if (string.IsNullOrWhiteSpace(itemDiagnosisType.Diagnosis[i]))
  444. {
  445. continue;
  446. }
  447. diagnosis = diagnosis + _numArry[i] + itemDiagnosisType.Diagnosis[i] + ";";
  448. }
  449. }
  450. }
  451. if (!string.IsNullOrWhiteSpace(diagnosis))
  452. {
  453. diagnosis = itemDiagnosis.ItemName + ";" + diagnosis;
  454. diagnosisList.Add(diagnosis);
  455. }
  456. }
  457. return diagnosisList;
  458. }
  459. /// <summary>
  460. /// 加载系统参数
  461. /// </summary>
  462. /// <param name="medicalCenterId"></param>
  463. /// <returns></returns>
  464. private async Task LoadSysParm(Guid medicalCenterId)
  465. {
  466. _isAddAbnormalResult = await _sysParmValueManager.GetSysParmValueInMedicalCenterId(
  467. medicalCenterId, "doctor_check_lis_summary_mode_add_abnormal_result");
  468. _isAddReferenceRange = await _sysParmValueManager.GetSysParmValueInMedicalCenterId(
  469. medicalCenterId, "doctor_check_lis_summary_mode_add_reference_range");
  470. _isAutoAddSuffix = await _sysParmValueManager.GetSysParmValueInMedicalCenterId(
  471. medicalCenterId, "doctor_check_lis_summary_mode_auto_add_suffix");
  472. _lowerSuffix = await _sysParmValueManager.GetSysParmValueInMedicalCenterId(
  473. medicalCenterId, "doctor_check_lis_summary_mode_lower_suffix");
  474. _highSuffix = await _sysParmValueManager.GetSysParmValueInMedicalCenterId(
  475. medicalCenterId, "doctor_check_lis_summary_mode_high_suffix");
  476. }
  477. /// <summary>
  478. /// 获取组合项目诊断通过诊断函数
  479. /// </summary>
  480. /// <param name="doctorCheckDiagnosisInput"></param>
  481. /// <param name="diagnosisList"></param>
  482. /// <returns></returns>
  483. private bool GetAsbitemDiagnosisByFunction(DoctorCheckDiagnosisInput doctorCheckDiagnosisInput, out List<string> diagnosisList)
  484. {
  485. var patientAsbitemDiagnosisInput = new PatientAsbitemDiagnosisInput()
  486. {
  487. SexName = doctorCheckDiagnosisInput.SexName,
  488. Age = doctorCheckDiagnosisInput.Age
  489. };
  490. foreach (var item in doctorCheckDiagnosisInput.Items)
  491. {
  492. var itemResult = new ItemResultInput()
  493. {
  494. ItemId = item.ItemId,
  495. ItemName = item.ItemName,
  496. Result = item.Result
  497. };
  498. patientAsbitemDiagnosisInput.Items.Add(itemResult);
  499. }
  500. var diagnosisBuilder = new DiagnosisBuilder();
  501. diagnosisList = new List<string>();
  502. bool isContinueProcess = true;
  503. foreach (var asbitem in doctorCheckDiagnosisInput.Asbitems)
  504. {
  505. if (asbitem.IsDiagnosisFunction == 'Y' && !string.IsNullOrWhiteSpace(asbitem.DiagnosisFunction))
  506. {
  507. var diagnosis = diagnosisBuilder.GetAsbitemDiagnosisResult(patientAsbitemDiagnosisInput, asbitem.DiagnosisFunction);
  508. diagnosisList.Add(diagnosis);
  509. if (asbitem.IsContinueProcess != 'Y')
  510. {
  511. //有一个不允许继续处理,则不允许继续处理
  512. isContinueProcess = false;
  513. }
  514. }
  515. }
  516. return isContinueProcess;
  517. }
  518. /// <summary>
  519. /// 获取项目诊断
  520. /// </summary>
  521. /// <param name="doctorCheckDiagnosisInput"></param>
  522. /// <returns></returns>
  523. private async Task<List<DoctorCheckItemDiagnosisResult>> GetItemDiagnosis(DoctorCheckDiagnosisInput doctorCheckDiagnosisInput)
  524. {
  525. var patientItemDiagnosisInput = new PatientItemDiagnosisInput()
  526. {
  527. SexName = doctorCheckDiagnosisInput.SexName,
  528. Age = doctorCheckDiagnosisInput.Age
  529. };
  530. var diagnosisBuilder = new DiagnosisBuilder();
  531. var diagnosisList = new List<DoctorCheckItemDiagnosisResult>();
  532. foreach (var item in doctorCheckDiagnosisInput.Items)
  533. {
  534. if (string.IsNullOrWhiteSpace(item.Result))
  535. {
  536. continue;
  537. }
  538. if (string.IsNullOrWhiteSpace(item.DefaultResult) && item.Result == item.DefaultResult)
  539. {
  540. continue;
  541. }
  542. if (item.IsProduceSummary != 'Y')
  543. {
  544. continue;
  545. }
  546. var doctorCheckItemDiagnosisResult = new DoctorCheckItemDiagnosisResult()
  547. {
  548. ItemName = item.ItemName,
  549. };
  550. diagnosisList.Add(doctorCheckItemDiagnosisResult);
  551. if (item.IsDiagnosisFunction == 'Y' && !string.IsNullOrWhiteSpace(item.DiagnosisFunction))
  552. {
  553. var itemResult = new ItemResultInput()
  554. {
  555. ItemId = item.ItemId,
  556. ItemName = item.ItemName,
  557. Result = item.Result
  558. };
  559. patientItemDiagnosisInput.Item = itemResult;
  560. //通过计算获取诊断
  561. var diagnosis = diagnosisBuilder.GetItemDiagnosisResult(patientItemDiagnosisInput, item.DiagnosisFunction);
  562. var itemDiagnosisTypeResult = new ItemDiagnosisTypeResult()
  563. {
  564. DiagnosisType = '0'
  565. };
  566. itemDiagnosisTypeResult.Diagnosis.Add(diagnosis);
  567. doctorCheckItemDiagnosisResult.ItemDiagnosisTypeResults.Add(itemDiagnosisTypeResult);
  568. }
  569. if (item.IsDiagnosisFunction == 'Y' && item.IsContinueProcess != 'Y')
  570. {
  571. continue;
  572. }
  573. //通过参考范围获取诊断
  574. if(item.ReferenceRangeTypeFlag == ItemReferenceRangeTypeFlag.Number)
  575. {
  576. var referenceRangeDiagnosis = await GetItemDiagnosisByReferenceRanges(doctorCheckDiagnosisInput.SexId, doctorCheckDiagnosisInput.Age, item);
  577. if (!string.IsNullOrWhiteSpace(referenceRangeDiagnosis))
  578. {
  579. var itemDiagnosisTypeResult = new ItemDiagnosisTypeResult()
  580. {
  581. DiagnosisType = '1'
  582. };
  583. itemDiagnosisTypeResult.Diagnosis.Add(referenceRangeDiagnosis);
  584. doctorCheckItemDiagnosisResult.ItemDiagnosisTypeResults.Add(itemDiagnosisTypeResult);
  585. }
  586. }
  587. else
  588. {
  589. //通过结果模板获取诊断
  590. var templateList = await GetItemDiagnosisByTemplate(item);
  591. var itemDiagnosisTypeResult = new ItemDiagnosisTypeResult()
  592. {
  593. DiagnosisType = '2'
  594. };
  595. itemDiagnosisTypeResult.Diagnosis.AddRange(templateList);
  596. //通过匹配关系获取诊断
  597. var matcheList = await GetItemDiagnosisByMatche(item);
  598. itemDiagnosisTypeResult.Diagnosis.AddRange(matcheList);
  599. if (!templateList.Any() && !matcheList.Any())
  600. {
  601. //获取异常结果
  602. itemDiagnosisTypeResult.Diagnosis.Add(item.Result);
  603. }
  604. //去掉重复诊断
  605. itemDiagnosisTypeResult.Diagnosis = itemDiagnosisTypeResult.Diagnosis.Distinct().ToList();
  606. doctorCheckItemDiagnosisResult.ItemDiagnosisTypeResults.Add(itemDiagnosisTypeResult);
  607. }
  608. }
  609. return diagnosisList;
  610. }
  611. /// <summary>
  612. /// 通过参考范围获取项目诊断列表
  613. /// </summary>
  614. /// <param name="sexId"></param>
  615. /// <param name="age"></param>
  616. /// <param name="itemInput"></param>
  617. /// <returns></returns>
  618. private async Task<string> GetItemDiagnosisByReferenceRanges(char sexId, short? age, ItemInput itemInput)
  619. {
  620. var diagnosisList = new List<string>();
  621. if (string.IsNullOrWhiteSpace(itemInput.Result))
  622. {
  623. return null;
  624. }
  625. decimal resultDecimal;
  626. if (!decimal.TryParse(itemInput.Result, out resultDecimal))
  627. {
  628. return null;
  629. }
  630. var referenceRangeList = itemInput.ReferenceRanges.Where(o => o.ReferenceRangeTypeFlag == ItemReferenceRangeTypeFlag.Number).ToList();
  631. if (!referenceRangeList.Any())
  632. {
  633. return null;
  634. }
  635. if (age == null)
  636. {
  637. age = 30;
  638. }
  639. var referenceRange = referenceRangeList.Where(o => o.ForSexId == sexId && age >= o.AgeLowerLimit && age <= o.AgeUpperLimit).FirstOrDefault();
  640. if (referenceRange == null)
  641. {
  642. referenceRange = referenceRangeList.Where(o => o.ForSexId == ForSexFlag.All && age >= o.AgeLowerLimit && age <= o.AgeUpperLimit).FirstOrDefault();
  643. if (referenceRange == null)
  644. {
  645. return null;
  646. }
  647. }
  648. string lowReferenceRangeValueStr;
  649. string hegihtReferenceRangeValueStr;
  650. decimal lowReferenceRangeValue;
  651. decimal hegihtReferenceRangeValue;
  652. string diagnosis = null;
  653. var pos = referenceRange.ReferenceRangeValue.IndexOf("-");
  654. if (pos > 0)
  655. {
  656. //参考范围形式:10-30
  657. lowReferenceRangeValueStr = referenceRange.ReferenceRangeValue.Substring(0, pos);
  658. hegihtReferenceRangeValueStr = referenceRange.ReferenceRangeValue.Substring(pos + 1);
  659. if (!decimal.TryParse(lowReferenceRangeValueStr, out lowReferenceRangeValue))
  660. {
  661. return null;
  662. }
  663. if (!decimal.TryParse(hegihtReferenceRangeValueStr, out hegihtReferenceRangeValue))
  664. {
  665. return null;
  666. }
  667. if (resultDecimal < lowReferenceRangeValue)
  668. {
  669. diagnosis = await GetNumberDiagnosis(itemInput.ItemName, itemInput.Result, true, referenceRange);
  670. }
  671. else if (resultDecimal > hegihtReferenceRangeValue)
  672. {
  673. diagnosis = await GetNumberDiagnosis(itemInput.ItemName, itemInput.Result, false, referenceRange);
  674. }
  675. return diagnosis;
  676. }
  677. pos = referenceRange.ReferenceRangeValue.IndexOf(">=");
  678. var charLength = ">=".Length;
  679. if (pos == 0)
  680. {
  681. pos = referenceRange.ReferenceRangeValue.IndexOf("≥");
  682. charLength = "≥".Length;
  683. if (pos == 0)
  684. {
  685. pos = referenceRange.ReferenceRangeValue.IndexOf("≧");
  686. charLength = "≧".Length;
  687. }
  688. }
  689. if (pos > 0)
  690. {
  691. //参考范围形式:>=
  692. lowReferenceRangeValueStr = referenceRange.ReferenceRangeValue.Substring(pos + charLength);
  693. if (!decimal.TryParse(lowReferenceRangeValueStr, out lowReferenceRangeValue))
  694. {
  695. return null;
  696. }
  697. if (resultDecimal < lowReferenceRangeValue)
  698. {
  699. diagnosis = await GetNumberDiagnosis(itemInput.ItemName, itemInput.Result, true, referenceRange);
  700. }
  701. return diagnosis;
  702. }
  703. pos = referenceRange.ReferenceRangeValue.IndexOf(">");
  704. charLength = ">".Length;
  705. if (pos > 0)
  706. {
  707. //参考范围形式:>
  708. lowReferenceRangeValueStr = referenceRange.ReferenceRangeValue.Substring(pos + charLength);
  709. if (!decimal.TryParse(lowReferenceRangeValueStr, out lowReferenceRangeValue))
  710. {
  711. return null;
  712. }
  713. if (resultDecimal <= lowReferenceRangeValue)
  714. {
  715. diagnosis = await GetNumberDiagnosis(itemInput.ItemName, itemInput.Result, true, referenceRange);
  716. }
  717. return diagnosis;
  718. }
  719. pos = referenceRange.ReferenceRangeValue.IndexOf("<=");
  720. charLength = "<=".Length;
  721. if (pos == 0)
  722. {
  723. pos = referenceRange.ReferenceRangeValue.IndexOf("≤");
  724. charLength = "≤".Length;
  725. if (pos == 0)
  726. {
  727. pos = referenceRange.ReferenceRangeValue.IndexOf("≦");
  728. charLength = "≦".Length;
  729. }
  730. }
  731. if (pos > 0)
  732. {
  733. //参考范围形式:<=
  734. hegihtReferenceRangeValueStr = referenceRange.ReferenceRangeValue.Substring(pos + charLength);
  735. if (!decimal.TryParse(hegihtReferenceRangeValueStr, out hegihtReferenceRangeValue))
  736. {
  737. return null;
  738. }
  739. if (resultDecimal >= hegihtReferenceRangeValue)
  740. {
  741. diagnosis = await GetNumberDiagnosis(itemInput.ItemName, itemInput.Result, false, referenceRange);
  742. }
  743. return diagnosis;
  744. }
  745. pos = referenceRange.ReferenceRangeValue.IndexOf("<");
  746. charLength = "<".Length;
  747. if (pos > 0)
  748. {
  749. //参考范围形式:<
  750. hegihtReferenceRangeValueStr = referenceRange.ReferenceRangeValue.Substring(pos + charLength);
  751. if (!decimal.TryParse(hegihtReferenceRangeValueStr, out hegihtReferenceRangeValue))
  752. {
  753. return null;
  754. }
  755. if (resultDecimal >= hegihtReferenceRangeValue)
  756. {
  757. diagnosis = await GetNumberDiagnosis(itemInput.ItemName, itemInput.Result, false, referenceRange);
  758. }
  759. return diagnosis;
  760. }
  761. return diagnosis;
  762. }
  763. private async Task<string> GetNumberDiagnosis(string itemName, string result, bool isLower,
  764. ReferenceRange referenceRange)
  765. {
  766. string diagnosis = null;
  767. if (isLower)
  768. {
  769. if (referenceRange.LowerDiagnosisId != null && referenceRange.LowerDiagnosisId != Guid.Empty)
  770. {
  771. var diagnosisEntity = await _diagnosisRepository.FindAsync(o => o.Id == referenceRange.LowerDiagnosisId);
  772. if (diagnosisEntity != null)
  773. {
  774. diagnosis = diagnosisEntity.DisplayName + "↓";
  775. }
  776. else
  777. {
  778. if (_isAutoAddSuffix == "Y")
  779. {
  780. diagnosis = itemName + _lowerSuffix + "↓";
  781. }
  782. }
  783. }
  784. else
  785. {
  786. if (_isAutoAddSuffix == "Y")
  787. {
  788. diagnosis = itemName + _lowerSuffix + "↓";
  789. }
  790. }
  791. }
  792. else
  793. {
  794. if (referenceRange.UpperDiagnosisId != null && referenceRange.UpperDiagnosisId != Guid.Empty)
  795. {
  796. var diagnosisEntity = await _diagnosisRepository.FindAsync(o => o.Id == referenceRange.UpperDiagnosisId);
  797. if (diagnosisEntity != null)
  798. {
  799. diagnosis = diagnosisEntity.DisplayName + "↑";
  800. }
  801. else
  802. {
  803. if (_isAutoAddSuffix == "Y")
  804. {
  805. diagnosis = itemName + _highSuffix + "↑";
  806. }
  807. }
  808. }
  809. else
  810. {
  811. if (_isAutoAddSuffix == "Y")
  812. {
  813. diagnosis = itemName + _highSuffix + "↑";
  814. }
  815. }
  816. }
  817. if (!string.IsNullOrWhiteSpace(diagnosis))
  818. {
  819. if (_isAddAbnormalResult == "Y")
  820. {
  821. diagnosis = diagnosis + "(结果:" + result + ",参考范围:" + referenceRange.ReferenceRangeValue + ")";
  822. }
  823. }
  824. return diagnosis;
  825. }
  826. /// <summary>
  827. /// 通过模板获取诊断
  828. /// </summary>
  829. /// <param name="itemInput"></param>
  830. /// <returns></returns>
  831. private async Task<List<string>> GetItemDiagnosisByTemplate(ItemInput itemInput)
  832. {
  833. List<string> diagnosisList = new List<string>();
  834. //将结果解析到数组中
  835. string[] resultArry = GetResultArry(itemInput.Result);
  836. //结果模板中的结果去掉数字,* /等符号
  837. foreach (var template in itemInput.ItemResultTemplates)
  838. {
  839. if (!string.IsNullOrWhiteSpace(template.Result))
  840. {
  841. template.Result = Regex.Replace(template.Result, @"\d+", "").Replace("*", "").Replace("/", "").Replace(" ", "");
  842. }
  843. }
  844. foreach (var resultSplit in resultArry)
  845. {
  846. if (string.IsNullOrWhiteSpace(resultSplit) || resultSplit.StartsWith("余未见异常"))
  847. {
  848. continue;
  849. }
  850. var templatesList = itemInput.ItemResultTemplates.Where(o => o.Result == resultSplit && o.IsResultIntoSummary == 'Y').ToList();
  851. foreach (var template in templatesList)
  852. {
  853. if (template != null && template.DiagnosisId != null && template.DiagnosisId != Guid.Empty)
  854. {
  855. var temp_diagnosis = await _diagnosisRepository.FirstOrDefaultAsync(m => m.Id == template.DiagnosisId);
  856. if (temp_diagnosis != null)
  857. {
  858. diagnosisList.Add(temp_diagnosis.DisplayName);
  859. }
  860. }
  861. else
  862. {
  863. diagnosisList.Add(resultSplit);
  864. }
  865. }
  866. }
  867. return diagnosisList.Distinct().ToList();
  868. }
  869. /// <summary>
  870. /// 获取项目诊断通过匹配关系
  871. /// </summary>
  872. /// <param name="itemInput"></param>
  873. /// <returns></returns>
  874. private async Task<List<string>> GetItemDiagnosisByMatche(ItemInput itemInput)
  875. {
  876. List<string> diagnosisList = new List<string>();
  877. //将结果解析到数组中
  878. string[] resultArry = GetResultArry(itemInput.Result);
  879. foreach (var resultSplit in resultArry)
  880. {
  881. if (string.IsNullOrWhiteSpace(resultSplit) || resultSplit.StartsWith("余未见异常"))
  882. {
  883. continue;
  884. }
  885. var templatesList = itemInput.ItemResultMatches.Where(o => resultSplit.Contains(o.Result)).ToList();
  886. foreach (var template in templatesList)
  887. {
  888. if (template != null && template.DiagnosisId != Guid.Empty)
  889. {
  890. var temp_diagnosis = await _diagnosisRepository.FirstOrDefaultAsync(m => m.Id == template.DiagnosisId);
  891. if (temp_diagnosis != null)
  892. {
  893. diagnosisList.Add(temp_diagnosis.DisplayName);
  894. }
  895. }
  896. }
  897. }
  898. return diagnosisList.Distinct().ToList();
  899. }
  900. /// <summary>
  901. /// 去掉结果中的数字符号和分号
  902. /// </summary>
  903. /// <param name="result"></param>
  904. /// <returns></returns>
  905. private string[] GetResultArry(string result)
  906. {
  907. result = result.Trim().Replace(";", ";");
  908. foreach (var num in _numArry)
  909. {
  910. result = result.Replace(num, "");
  911. }
  912. //将结果通过英文;解析到数组中
  913. string[] resultArry = result.Split(";");
  914. return resultArry;
  915. }
  916. #region 执行项目计算函数
  917. /// <summary>
  918. /// 生成计算函数值
  919. /// </summary>
  920. /// <param name="input"></param>
  921. /// <returns></returns>
  922. [HttpPost("api/app/diagnosisfunction/getcalculationfunctionresult")]
  923. public async Task<GetDiagnosisResultRequestDto> GetCalculationFunctionResultAsync(GetDiagnosisResultRequestDto input)
  924. {
  925. await GetItemResultByCalculationFunctionAsync(input);
  926. return input;
  927. }
  928. private async Task GetItemResultByCalculationFunctionAsync(GetDiagnosisResultRequestDto input)
  929. {
  930. //根据检查单ID查询
  931. var list = (
  932. from patientRegister in await _patientRegisterRepository.GetQueryableAsync()
  933. join registerCheck in await _registerCheckRepository.GetQueryableAsync()
  934. on patientRegister.Id equals registerCheck.PatientRegisterId
  935. join registerCheckItem in await _registerCheckItemRepository.GetQueryableAsync()
  936. on registerCheck.Id equals registerCheckItem.RegisterCheckId
  937. join item in await _itemRepository.GetQueryableAsync()
  938. on registerCheckItem.ItemId equals item.Id
  939. where registerCheck.Id == input.RegisterCheckId
  940. select new
  941. {
  942. PatientRegister = patientRegister,
  943. Item = item
  944. }
  945. ).ToList();
  946. var diagnosisBuilder = new DiagnosisBuilder();
  947. var patientItemCalculateInput = new PatientItemCalculateInput()
  948. {
  949. SexName = _cacheService.GetSexNameAsync(list[0].PatientRegister.SexId).Result,
  950. Age = list[0].PatientRegister.Age
  951. };
  952. foreach (var item in input.Items)
  953. {
  954. var itemResult = new ItemResultInput()
  955. {
  956. ItemId = item.ItemId,
  957. Result = item.Result
  958. };
  959. itemResult.ItemName = list.Where(o => o.Item.Id == item.ItemId).First().Item.DisplayName;
  960. patientItemCalculateInput.Items.Add(itemResult);
  961. }
  962. foreach (var item in list)
  963. {
  964. if (item.Item.IsCalculationItem == 'Y' && !string.IsNullOrEmpty(item.Item.CalculationFunction))
  965. {
  966. //计算函数
  967. //计算结果
  968. string CalculationFunctionValue = diagnosisBuilder.GetItemCalculateResult(patientItemCalculateInput, item.Item.CalculationFunction);
  969. //CalculationFunctionValue = GetCodeResult(input, item.CalculationFunction, list);
  970. input.Items.Where(m => m.ItemId == item.Item.Id).FirstOrDefault().Result = CalculationFunctionValue; //赋值
  971. }
  972. }
  973. }
  974. #endregion
  975. /// <summary>
  976. /// 执行组合项目 诊断函数
  977. /// </summary>
  978. /// <param name="input"></param>
  979. /// <param name="asbitem_data"></param>
  980. /// <param name="item_datas"></param>
  981. /// <param name="patientRegister_data"></param>
  982. /// <param name="diagnosisTrips"></param>
  983. /// <returns></returns>
  984. private async Task<List<GetDiagnosisResult_Detail>> GetDiagnosisResultInAsbitemAsync(GetDiagnosisResultRequestDto input, Asbitem asbitem_data, List<Item> item_datas, PatientRegister patientRegister_data, List<string> diagnosisTrips)
  985. {
  986. var reslist = new List<GetDiagnosisResult_Detail>();
  987. if (input.Items.Count > 0)
  988. {
  989. //执行函数 返回结果
  990. string DiagnosisFunctionResult_Asbitem = GetCodeResult(input, asbitem_data.DiagnosisFunction, item_datas);
  991. if (!string.IsNullOrEmpty(DiagnosisFunctionResult_Asbitem))
  992. {
  993. reslist.Add(new GetDiagnosisResult_Detail
  994. {
  995. DiagnosisResult = DiagnosisFunctionResult_Asbitem
  996. });
  997. }
  998. //是否继续执行项目诊断函数
  999. if (asbitem_data.IsContinueProcess == 'Y')
  1000. {
  1001. var itemResult = await GetDiagnosisResultInItemAsync(input, item_datas, patientRegister_data, diagnosisTrips); //执行项目诊断函数
  1002. if (itemResult.Any())
  1003. {
  1004. reslist.AddRange(itemResult);
  1005. }
  1006. }
  1007. }
  1008. return reslist;
  1009. }
  1010. /// <summary>
  1011. /// 执行项目 诊断函数
  1012. /// </summary>
  1013. /// <param name="input"></param>
  1014. /// <param name="item_datas"></param>
  1015. /// <param name="patientRegister_data"></param>
  1016. /// <param name="diagnosisTrips"></param>
  1017. /// <returns></returns>
  1018. private async Task<List<GetDiagnosisResult_Detail>> GetDiagnosisResultInItemAsync(GetDiagnosisResultRequestDto input, List<Item> item_datas, PatientRegister patientRegister_data, List<string> diagnosisTrips)
  1019. {
  1020. var reslist = new List<GetDiagnosisResult_Detail>();
  1021. if (input.Items.Count > 0)
  1022. {
  1023. foreach (var item_data in item_datas)
  1024. {
  1025. if (item_data.IsDiagnosisFunction == 'Y' && !string.IsNullOrEmpty(item_data.DiagnosisFunction))
  1026. {
  1027. var DiagnosisFunctionResult_Item = GetCodeResult(input, item_data.DiagnosisFunction, item_datas);
  1028. if (!string.IsNullOrEmpty(DiagnosisFunctionResult_Item))
  1029. {
  1030. reslist.Add(new GetDiagnosisResult_Detail
  1031. {
  1032. DiagnosisResult = DiagnosisFunctionResult_Item
  1033. });
  1034. }
  1035. //是否继续执行参考范围规则
  1036. if (item_data.IsContinueProcess == 'Y' && item_data.IsProduceSummary == 'Y')
  1037. {
  1038. string itemResult_Request = input.Items.Where(m => m.ItemId == item_data.Id).FirstOrDefault().Result; //项目结果
  1039. //执行参考范围
  1040. string referenceRangesResult = await GetDiagnosisResultInReferenceRangesAsync(item_data, itemResult_Request, patientRegister_data, diagnosisTrips);
  1041. if (!string.IsNullOrEmpty(referenceRangesResult))
  1042. {
  1043. if (item_data.IsNameIntoSummary == 'Y')
  1044. DiagnosisFunctionResult_Item = item_data.DisplayName + DiagnosisFunctionResult_Item;
  1045. reslist.Add(new GetDiagnosisResult_Detail { DiagnosisResult = referenceRangesResult });
  1046. }
  1047. }
  1048. }
  1049. }
  1050. }
  1051. return reslist;
  1052. }
  1053. /// <summary>
  1054. /// 执行项目 参考范围获取结果
  1055. /// </summary>
  1056. /// <param name="item"></param>
  1057. /// <param name="itemResult"></param>
  1058. /// <param name="patientRegister_data"></param>
  1059. /// <param name="diagnosisTrips"></param>
  1060. /// <returns></returns>
  1061. private async Task<string> GetDiagnosisResultInReferenceRangesAsync(Item item, string itemResult, PatientRegister patientRegister_data, List<string> diagnosisTrips)
  1062. {
  1063. string referenceRangesResult = "";
  1064. string diagnosisTrip = ""; //诊断提示,参考范围性别、年龄 异常时出现
  1065. var item_ReferenceRangeList = item.ReferenceRanges.Where(m => m.ReferenceRangeTypeFlag == item.ReferenceRangeTypeFlag).ToList();
  1066. if (item_ReferenceRangeList.Any() && item.ReferenceRangeTypeFlag == ItemReferenceRangeTypeFlag.Number)
  1067. {
  1068. //数字参考范围
  1069. List<ReferenceRange> referenceRanges = new List<ReferenceRange>();
  1070. if (patientRegister_data.Age != null)
  1071. {
  1072. referenceRanges = item_ReferenceRangeList.Where(m => m.AgeLowerLimit <= patientRegister_data.Age
  1073. && m.AgeUpperLimit >= patientRegister_data.Age).ToList();
  1074. }
  1075. else
  1076. {
  1077. //if (string.IsNullOrEmpty(DiagnosisTrip))
  1078. //{
  1079. // DiagnosisTrip += "未登记年龄";
  1080. //}
  1081. //else
  1082. //{
  1083. // DiagnosisTrip += ",未登记年龄";
  1084. //}
  1085. diagnosisTrip = "未登记年龄";
  1086. //找出默认的0-200
  1087. referenceRanges = item_ReferenceRangeList.Where(m => m.AgeLowerLimit == 0
  1088. && m.AgeUpperLimit == 200).ToList();
  1089. }
  1090. if (referenceRanges.Any())
  1091. {
  1092. //比对性别
  1093. var referenceRanges2 = referenceRanges.Where(m => patientRegister_data.SexId != null && m.ForSexId == patientRegister_data.SexId).ToList();
  1094. if (!referenceRanges2.Any())
  1095. {
  1096. //未找到,去匹配适用性别为A的
  1097. referenceRanges2 = referenceRanges.Where(m => m.ForSexId == ForSexFlag.All).ToList();
  1098. if (referenceRanges2.Any())
  1099. {
  1100. //数字参考范围类型
  1101. referenceRangesResult = await GetDiagnosisResultInNumRangeAsync(item, itemResult, referenceRanges2[0]);
  1102. }
  1103. }
  1104. }
  1105. //////符合条件的参考范围
  1106. //var item_ReferenceRange = item_ReferenceRangeList.Where(m =>
  1107. //(m.ForSexId.ToString() == ForSexFlag.All || (patientRegister_data.SexId != null && m.ForSexId == patientRegister_data.SexId))
  1108. // && patientRegister_data.Age != null
  1109. // && m.AgeLowerLimit <= patientRegister_data.Age
  1110. // && m.AgeUpperLimit >= patientRegister_data.Age).ToList();
  1111. //if (item_ReferenceRange.Count > 0)
  1112. //{
  1113. // if (item_ReferenceRange.Count == 1)
  1114. // {
  1115. // //数字参考范围类型
  1116. // result = await GetDiagnosisResultInNumRangeAsync(item, itemResult, item_ReferenceRange[0]);
  1117. // }
  1118. //}
  1119. }
  1120. else
  1121. {
  1122. //无参考范围或者字符参考范围
  1123. referenceRangesResult = await GetDiagnosisResultInItemResultTemplateAsync(item, itemResult);
  1124. if (string.IsNullOrEmpty(referenceRangesResult))
  1125. {
  1126. //未匹配上,继续
  1127. referenceRangesResult = await GetDiagnosisResultInItemResultMatchAsync(item, itemResult);
  1128. if (string.IsNullOrEmpty(referenceRangesResult))
  1129. {
  1130. //未匹配上,继续
  1131. //对比项目默认结果,如果不是默认结果则直接用结果做为小结。
  1132. if (item.DefaultResult != itemResult)
  1133. {
  1134. referenceRangesResult = itemResult;
  1135. }
  1136. }
  1137. }
  1138. }
  1139. if (!string.IsNullOrEmpty(diagnosisTrip))
  1140. diagnosisTrips.Add(diagnosisTrip);
  1141. return referenceRangesResult;
  1142. }
  1143. /// <summary>
  1144. /// 根据项目结果模板生成
  1145. /// 检查项目结果模板,如果和项目结果模板一致,则根据对应的诊断生成小结 完全匹配
  1146. /// </summary>
  1147. /// <returns></returns>
  1148. private async Task<string> GetDiagnosisResultInItemResultTemplateAsync(Item item, string itemResult)
  1149. {
  1150. string result = "";
  1151. var temp_itemResultTemplate = await _itemResultTemplateRepository.FirstOrDefaultAsync(m => m.ItemId == item.Id && m.Result == itemResult);
  1152. if (temp_itemResultTemplate != null && temp_itemResultTemplate.DiagnosisId != null && temp_itemResultTemplate.DiagnosisId != Guid.Empty)
  1153. {
  1154. var temp_diagnosis = await _diagnosisRepository.FirstOrDefaultAsync(m => m.Id == temp_itemResultTemplate.DiagnosisId);
  1155. if (temp_diagnosis != null)
  1156. {
  1157. result = temp_diagnosis.DisplayName;
  1158. }
  1159. }
  1160. return result;
  1161. }
  1162. /// <summary>
  1163. /// 根据项目项目结果匹配(诊断匹配) 生成
  1164. /// </summary>
  1165. /// <returns></returns>
  1166. private async Task<string> GetDiagnosisResultInItemResultMatchAsync(Item item, string itemResult)
  1167. {
  1168. string result = "";
  1169. var temp_itemResultMatch = await _itemResultMatchRepository.FirstOrDefaultAsync(m => m.ItemId == item.Id && itemResult.Contains(m.Result));
  1170. if (temp_itemResultMatch != null && temp_itemResultMatch.DiagnosisId != Guid.Empty)
  1171. {
  1172. var temp_diagnosis = await _diagnosisRepository.FirstOrDefaultAsync(m => m.Id == temp_itemResultMatch.DiagnosisId);
  1173. if (temp_diagnosis != null)
  1174. {
  1175. result = temp_diagnosis.DisplayName;
  1176. }
  1177. }
  1178. return result;
  1179. }
  1180. /// <summary>
  1181. /// 根据数字型范围值对应的诊断匹配 生成
  1182. /// 如果在范围外又没有设置诊断,则用项目名称加偏高偏低后缀生成小结(需要根据系统参数)。
  1183. /// </summary>
  1184. /// <param name="item"></param>
  1185. /// <param name="itemResult"></param>
  1186. /// <param name="item_ReferenceRange">当前匹配的参考范围</param>
  1187. /// <returns></returns>
  1188. private async Task<string> GetDiagnosisResultInNumRangeAsync(Item item, string itemResult, ReferenceRange item_ReferenceRange)
  1189. {
  1190. string result = "";
  1191. string diagnosisFlag = "1"; //1=正常 2=偏高 0=偏低
  1192. #region 处理异常结果 > < = 剔除
  1193. itemResult = itemResult.Replace(">", "").Replace("<", "").Replace("=", "");
  1194. try
  1195. {
  1196. var tempConvert = Convert.ToDecimal(itemResult);
  1197. }
  1198. catch (Exception ex)
  1199. {
  1200. return result;
  1201. }
  1202. #endregion
  1203. #region 匹配参考范围
  1204. string item_referenceRangeValue = item_ReferenceRange.ReferenceRangeValue;
  1205. if (item_referenceRangeValue.IndexOf("-") > -1)
  1206. {
  1207. var value_ary = item_referenceRangeValue.Split('-');
  1208. if (value_ary.Length == 2)
  1209. {
  1210. decimal minvalue = Convert.ToDecimal(value_ary[0]);
  1211. decimal maxvalue = Convert.ToDecimal(value_ary[1]);
  1212. if (Convert.ToDecimal(itemResult) > maxvalue)
  1213. {
  1214. //偏高
  1215. diagnosisFlag = "2";
  1216. }
  1217. else if (Convert.ToDecimal(itemResult) < minvalue)
  1218. {
  1219. //偏低
  1220. diagnosisFlag = "0";
  1221. }
  1222. }
  1223. }
  1224. else if (item_referenceRangeValue.IndexOf(">=") > -1)
  1225. {
  1226. if (Convert.ToDecimal(itemResult) < Convert.ToDecimal(item_referenceRangeValue.Replace(">=", "")))
  1227. {
  1228. //偏低
  1229. diagnosisFlag = "0";
  1230. }
  1231. }
  1232. else if (item_referenceRangeValue.IndexOf("<=") > -1)
  1233. {
  1234. if (Convert.ToDecimal(itemResult) > Convert.ToDecimal(item_referenceRangeValue.Replace("<=", "")))
  1235. {
  1236. //偏高
  1237. diagnosisFlag = "2";
  1238. }
  1239. }
  1240. else if (item_referenceRangeValue.IndexOf(">") > -1)
  1241. {
  1242. if (Convert.ToDecimal(itemResult) <= Convert.ToDecimal(item_referenceRangeValue.Replace(">", "")))
  1243. {
  1244. //偏低
  1245. diagnosisFlag = "0";
  1246. }
  1247. }
  1248. else if (item_referenceRangeValue.IndexOf("<") > -1)
  1249. {
  1250. if (Convert.ToDecimal(itemResult) >= Convert.ToDecimal(item_referenceRangeValue.Replace("<", "")))
  1251. {
  1252. //偏高
  1253. diagnosisFlag = "2";
  1254. }
  1255. }
  1256. if (diagnosisFlag == "2")
  1257. {
  1258. //偏高
  1259. if (item_ReferenceRange.UpperDiagnosisId != null)
  1260. {
  1261. var temp_diagnosis = await _diagnosisRepository.FirstOrDefaultAsync(m => m.Id == item_ReferenceRange.UpperDiagnosisId);
  1262. if (temp_diagnosis != null)
  1263. {
  1264. result = temp_diagnosis.DisplayName;
  1265. }
  1266. else
  1267. {
  1268. result = $"{item.DisplayName}偏高";
  1269. }
  1270. }
  1271. else
  1272. {
  1273. result = $"{item.DisplayName}偏高";
  1274. }
  1275. }
  1276. else if (diagnosisFlag == "0")
  1277. {
  1278. //偏低
  1279. if (item_ReferenceRange.LowerDiagnosisId != null)
  1280. {
  1281. var temp_diagnosis = await _diagnosisRepository.FirstOrDefaultAsync(m => m.Id == item_ReferenceRange.LowerDiagnosisId);
  1282. if (temp_diagnosis != null)
  1283. {
  1284. result = temp_diagnosis.DisplayName;
  1285. }
  1286. else
  1287. {
  1288. result = $"{item.DisplayName}偏低";
  1289. }
  1290. }
  1291. else
  1292. {
  1293. result = $"{item.DisplayName}偏低";
  1294. }
  1295. }
  1296. #endregion
  1297. return result;
  1298. }
  1299. /// <summary>
  1300. /// 动态编译代码 返回string
  1301. /// </summary>
  1302. /// <param name="input"></param>
  1303. /// <param name="DiagnosisFunctionCode"></param>
  1304. /// <param name="item_datas"></param>
  1305. /// <returns></returns>
  1306. private string GetCodeResult(GetDiagnosisResultRequestDto input, string DiagnosisFunctionCode, List<Item> item_datas)
  1307. {
  1308. string result = "";
  1309. string DiagnosisFunctionCode_Replace = ReplaceFunctionLabel(input, DiagnosisFunctionCode, item_datas);
  1310. //拼接动态代码
  1311. string code = @"
  1312. public class DiagnosisResultInAsbitemHeight
  1313. {
  1314. public string AutoDiagnosisResultInAsbitemHeight()
  1315. {
  1316. var msg="""";"
  1317. + DiagnosisFunctionCode_Replace + @"
  1318. return msg;
  1319. }
  1320. }";
  1321. CompileHelper compileHelper = new CompileHelper();
  1322. var assembly = compileHelper.GenerateAssemblyFromCode(code, Assembly.Load(new AssemblyName("System.Runtime")), typeof(object).Assembly);
  1323. if (assembly != null)
  1324. {
  1325. // 反射获取程序集中 的类
  1326. Type type = assembly.GetType("DiagnosisResultInAsbitemHeight");
  1327. // 创建该类的实例
  1328. object obj = Activator.CreateInstance(type);
  1329. var msg = type.InvokeMember("AutoDiagnosisResultInAsbitemHeight",
  1330. BindingFlags.Default | BindingFlags.InvokeMethod,
  1331. null,
  1332. obj,
  1333. null);
  1334. if (!string.IsNullOrEmpty(msg.ToString()))
  1335. {
  1336. result = msg.ToString();
  1337. }
  1338. }
  1339. return result;
  1340. }
  1341. /// <summary>
  1342. /// 替换函数中的标签
  1343. /// </summary>
  1344. /// <param name="input"></param>
  1345. /// <param name="DiagnosisFunctionCode"></param>
  1346. /// <param name="item_datas"></param>
  1347. /// <returns></returns>
  1348. private string ReplaceFunctionLabel(GetDiagnosisResultRequestDto input, string DiagnosisFunctionCode, List<Item> item_datas)
  1349. {
  1350. string tempcode = DiagnosisFunctionCode;
  1351. //替换诊断函数中的标签
  1352. foreach (var item in input.Items)
  1353. {
  1354. if (item.ItemId != null)
  1355. {
  1356. var itement = item_datas.Where(m => m.Id == item.ItemId).FirstOrDefault(); //查询项目信息
  1357. if (itement != null)
  1358. {
  1359. //根据项目的名称 替换对应传过来的值
  1360. tempcode = tempcode.Replace($"[{itement.DisplayName}]", item.Result);
  1361. }
  1362. }
  1363. }
  1364. if (tempcode.IndexOf('[') != -1)
  1365. {
  1366. throw new UserFriendlyException("函数中有未识别的语法");
  1367. }
  1368. return tempcode;
  1369. }
  1370. }
  1371. }