public DiseaseHPOSummaryBarModel GetDiseaseHPOSummaryBar(string name, string hideHpoStr, int nlpMinCount) { name = name.Trim(); var summaryBar = new DiseaseHPOSummaryBarModel(); var result = new DiseaseHPOSummaryModel(); result.HPOList = new List <DiseaseHPOSummaryHPOModel>(); var fileName = _config.GetValue <string>("GlobalSetting:HPOExcelPath"); FileInfo file = new FileInfo(fileName); using (ExcelPackage package = new ExcelPackage(file)) { var mapping = new DiseaseHPOSummaryLibraryMappingModel(); //获取当前疾病和知识库的关系 var librarySheet = package.Workbook.Worksheets[2]; int row = librarySheet.Dimension.Rows; for (int i = 1; i <= row; i++) { if (librarySheet.Cells[i, 1].Value.ToString().Trim() == name) { result.DiseaseName = name; result.CasesCount = Convert.ToInt32(librarySheet.Cells[i, 3].Value.ToString()); mapping.ChineseName = name; mapping.CasesCount = librarySheet.Cells[i, 3].Value.ToString(); mapping.EramId = librarySheet.Cells[i, 4].Value.ToString(); mapping.OMIMId = librarySheet.Cells[i, 5].Value.ToString(); mapping.ORPHAId = librarySheet.Cells[i, 6].Value.ToString(); break; } } //获取疾病所有case 和hpo if (!_config.GetValue <bool>("GlobalSetting:UseCache")) { var workSheet = package.Workbook.Worksheets[1]; row = workSheet.Dimension.Rows; for (int i = 2; i <= row; i++) { if (workSheet.Cells[i, 2].Value != null && workSheet.Cells[i, 2].Value.ToString().Trim() == name) { result.DiseaseName = name; result.CasesCount++; //NLP hpo if (workSheet.Cells[i, 3].Value != null) { var arr = workSheet.Cells[i, 3].Value.ToString().Split(","); foreach (var r in arr) { var hpo = result.HPOList.FirstOrDefault(x => x.HPOId == r); if (hpo != null) { hpo.NlpCount++; } else { result.HPOList.Add(new DiseaseHPOSummaryHPOModel { HPOId = r, NlpCount = 1 }); } } } //检验 hpo if (workSheet.Cells[i, 4].Value != null) { var arr = workSheet.Cells[i, 4].Value.ToString().Split(","); foreach (var r in arr) { var hpo = result.HPOList.FirstOrDefault(x => x.HPOId == r); if (hpo != null) { hpo.ExamCount++; } else { result.HPOList.Add(new DiseaseHPOSummaryHPOModel { HPOId = r, ExamCount = 1 }); } } } } } } //获取各个知识库 var summarySheet = package.Workbook.Worksheets[3]; row = summarySheet.Dimension.Rows; for (int i = 1; i <= row; i++) { if (summarySheet.Cells[i, 1].Value != null && summarySheet.Cells[i, 4].Value != null) { var hpoId = summarySheet.Cells[i, 4].Value.ToString(); var source = summarySheet.Cells[i, 1].Value.ToString().ToUpper(); hpoId = string.IsNullOrEmpty(hpoId) ? "" : hpoId.Trim(); var hpo = result.HPOList.FirstOrDefault(x => x.HPOId == hpoId); if (_config.GetValue <bool>("GlobalSetting:UseCache") && summarySheet.Cells[i, 2].Value != null) { var diseaseName = summarySheet.Cells[i, 2].Value.ToString(); if (source == "EMR" && diseaseName == name) { var type = summarySheet.Cells[i, 5].Value.ToString(); var count = Convert.ToInt32(summarySheet.Cells[i, 6].Value.ToString()); if (hpo != null) { if (type == "NLP") { hpo.NlpCount = count; } if (type == "LAB") { hpo.ExamCount = count; } } else { hpo = new DiseaseHPOSummaryHPOModel(); hpo.HPOId = hpoId; if (type == "NLP") { hpo.NlpCount = count; } if (type == "LAB") { hpo.ExamCount = count; } result.HPOList.Add(hpo); } } } if (summarySheet.Cells[i, 3].Value != null) { var linkedId = summarySheet.Cells[i, 3].Value.ToString(); if (source == "ERAM" && linkedId == mapping.EramId) { if (hpo != null) { hpo.EramCount = -1; } else { result.HPOList.Add(new DiseaseHPOSummaryHPOModel { HPOId = hpoId, EramCount = -1 }); } } if (source == "OMIM" && linkedId == mapping.OMIMId) { if (hpo != null) { hpo.OMIMCount = -1; } else { result.HPOList.Add(new DiseaseHPOSummaryHPOModel { HPOId = hpoId, OMIMCount = -1 }); } } if (source == "ORPHA" && linkedId == mapping.ORPHAId) { if (hpo != null) { hpo.ORPHACount = -1; } else { result.HPOList.Add(new DiseaseHPOSummaryHPOModel { HPOId = hpoId, ORPHACount = -1 }); } } } } } } result.HPOList = result.HPOList.OrderByDescending(x => x.NlpCount).ThenByDescending(x => x.ExamCount).ToList(); var chpoList = from T1 in _localMemoryCache.GetCHPO2020StandardList() join T2 in result.HPOList.Select(x => x.HPOId) on T1.HpoId equals T2 select new CHPO2020Model { NameChinese = T1.NameChinese, HpoId = T1.HpoId, NameEnglish = T1.NameEnglish }; summaryBar.HPOItem = new List <CHPO2020Model>(); var maxCount = result.HPOList.First().NlpCount; var ratio = maxCount / 15; foreach (var hpo in result.HPOList) { if (!string.IsNullOrWhiteSpace(hideHpoStr) && hideHpoStr.ToLower().Contains(hpo.HPOId.ToLower())) { continue; } if (hpo.NlpCount < nlpMinCount && hpo.ExamCount == 0 && hpo.EramCount == 0 && hpo.OMIMCount == 0 && hpo.ORPHACount == 0) { continue; } var chpo = chpoList.FirstOrDefault(x => x.HpoId == hpo.HPOId); if (chpo != null) { if (string.IsNullOrWhiteSpace(chpo.NameChinese)) { chpo.NameChinese = hpo.HPOId; } else { if (chpo.NameChinese.Length > 50) { chpo.NameChinese = chpo.NameChinese.Substring(0, 50) + "..."; } chpo.NameChinese = chpo.NameChinese + ":" + hpo.HPOId; } if (string.IsNullOrWhiteSpace(chpo.NameEnglish)) { chpo.NameEnglish = hpo.HPOId; } else { if (chpo.NameEnglish.Length > 70) { chpo.NameEnglish = chpo.NameEnglish.Substring(0, 70) + "..."; } chpo.NameEnglish = chpo.NameEnglish + ":" + hpo.HPOId; } } else { chpo = new CHPO2020Model { HpoId = hpo.HPOId, NameChinese = hpo.HPOId, NameEnglish = hpo.HPOId }; } if (ratio > 0) { if (hpo.EramCount == -1) { hpo.EramCount = hpo.EramCount * ratio; } if (hpo.OMIMCount == -1) { hpo.OMIMCount = hpo.OMIMCount * ratio; } if (hpo.ORPHACount == -1) { hpo.ORPHACount = hpo.ORPHACount * ratio; } } hpo.Display = true; summaryBar.HPOItem.Add(chpo); } summaryBar.CasesCount = result.CasesCount; summaryBar.SeriesDataModel = new List <SeriesData>(); result.HPOList = result.HPOList.Where(x => x.Display == true).ToList(); summaryBar.SeriesDataModel.Add(new SeriesData { Name = "NLP命中", Value = result.HPOList.Select(x => x.NlpCount).ToList() }); summaryBar.SeriesDataModel.Add(new SeriesData { Name = "检验命中", Value = result.HPOList.Select(x => x.ExamCount).ToList() }); summaryBar.SeriesDataModel.Add(new SeriesData { Name = "eRAM命中", Value = result.HPOList.Select(x => x.EramCount).ToList() }); summaryBar.SeriesDataModel.Add(new SeriesData { Name = "OMIM命中", Value = result.HPOList.Select(x => x.OMIMCount).ToList() }); summaryBar.SeriesDataModel.Add(new SeriesData { Name = "Orphanet命中", Value = result.HPOList.Select(x => x.ORPHACount).ToList() }); return(summaryBar); }
/// <summary> /// patientEmpiId can be empiid or cardNo /// </summary> /// <param name="nlpEngine"></param> /// <param name="patientEMRDetail"></param> /// <param name="patientEmpiId"></param> /// <returns></returns> public List <HPODataModel> GetPatientHPOResult(string nlpEngine, string patientEMRDetail, string patientVisitIds) { var hpoList = new List <HPODataModel>(); //首先获取检验数据HPO if (!string.IsNullOrWhiteSpace(patientVisitIds)) { hpoList.AddRange(_rdrDataRepository.GetPatientExamDataResult(patientVisitIds)); } if (!string.IsNullOrWhiteSpace(patientEMRDetail)) { //如果API 启用,就调用API 否则取数据库跑出来的结果 if (_config.GetValue <bool>("NLPAddress:HPOApiEnable")) { try { var clientName = "HPOStringMatchHost"; var api = _config.GetValue <string>("NLPAddress:HPOStringMatchApi"); if (nlpEngine.Equals("Spacy")) { clientName = "HPOSpacyMatchHost"; api = _config.GetValue <string>("NLPAddress:HPOSpacyMatchApi"); } var client = _clientFactory.CreateClient(clientName); string boundary = DateTime.Now.Ticks.ToString("X"); var formData = new MultipartFormDataContent(boundary); patientEMRDetail = "{\"text\":\"" + patientEMRDetail + "\"}"; _logger.LogError($"GetPatientHPOResult request,HPO engine:{nlpEngine},api:{api} 请求数据:" + patientEMRDetail); formData.Add(new StringContent(patientEMRDetail), "texts"); var response = client.PostAsync(api, formData); var result = response.Result.Content.ReadAsStringAsync().Result.ToString(); _logger.LogError($"GetPatientHPOResult result,HPO engine:{nlpEngine},api:{api} 返回数据:" + result); var hpoEngineList = JsonConvert.DeserializeObject <List <HPOAPIEngineResultModel> >(result); var subList = new List <HPODataModel>(); foreach (var r in hpoEngineList) { foreach (var hpo in r.Similarchpoid) { var data = new HPODataModel(); if (nlpEngine.Equals("Spacy")) { data.Name = r.Emrword + ":" + r.Similarchpoterm; } else { data.Name = r.Emrword; } data.Positivie = r.Positivie; data.StartIndex = r.Start; data.EndIndex = r.End; data.HPOId = hpo; data.TermSource = r.TermSource == null ? "" : string.Join(",", r.TermSource); data.Editable = true; data.IndexList = new List <HPOMatchIndexModel>(); data.IndexList.Add(new HPOMatchIndexModel { StartIndex = data.StartIndex, EndIndex = data.EndIndex }); var item = subList.FirstOrDefault(x => x.HPOId == data.HPOId && x.Name == data.Name && x.Positivie == data.Positivie); if (item != null) { item.IndexList.AddRange(data.IndexList); } else { subList.Add(data); } } } var chpoList = from T1 in _localMemoryCache.GetCHPO2020StandardList() join T2 in subList.Select(x => x.HPOId) on T1.HpoId equals T2 select new CHPO2020Model { NameChinese = T1.NameChinese, HpoId = T1.HpoId, NameEnglish = T1.NameEnglish }; foreach (var r in subList) { r.IndexList = r.IndexList.OrderBy(x => x.StartIndex).ToList(); var chpo2020Data = chpoList.FirstOrDefault(x => x.HpoId == r.HPOId); if (chpo2020Data != null) { r.CHPOName = chpo2020Data.NameChinese; r.NameEnglish = chpo2020Data.NameEnglish; } } hpoList.AddRange(subList); } catch (Exception ex) { _logger.LogError("NLPSystemRepository GetPatientHPOResult报错:" + ex.ToString()); } } else { hpoList.Add(new HPODataModel { Name = "僵硬", NameEnglish = "Rigors", HPOId = "HP:0025145", Editable = true, CHPOName = "运动迟缓", TermSource = "hpo,omaha" }); hpoList[1].IndexList = new List <HPOMatchIndexModel>(); hpoList[1].IndexList.Add(new HPOMatchIndexModel { StartIndex = 23, EndIndex = 25 }); hpoList[1].IndexList.Add(new HPOMatchIndexModel { StartIndex = 113, EndIndex = 115 }); hpoList[1].IndexList.Add(new HPOMatchIndexModel { StartIndex = 722, EndIndex = 724 }); hpoList.Add(new HPODataModel { Name = "抖动", NameEnglish = "Tremor", HPOId = "HP:0001337", Editable = true, CHPOName = "震颤", TermSource = "umls" }); hpoList[2].IndexList = new List <HPOMatchIndexModel>(); hpoList[2].IndexList.Add(new HPOMatchIndexModel { StartIndex = 20, EndIndex = 22 }); hpoList.Add(new HPODataModel { Name = "运动迟缓", NameEnglish = "Bradykinesia", HPOId = "HP:0002067", Editable = true, TermSource = "umls,hpo,omaha", CHPOName = "运动迟缓" }); hpoList[3].IndexList = new List <HPOMatchIndexModel>(); hpoList[3].IndexList.Add(new HPOMatchIndexModel { StartIndex = 160, EndIndex = 163 }); hpoList.Add(new HPODataModel { Name = "构音障碍", NameEnglish = "Dysarthria", HPOId = "HP:0001260", Editable = true, Positivie = 0, TermSource = "umls,hpo,omaha", CHPOName = "构音障碍" }); hpoList[4].IndexList = new List <HPOMatchIndexModel>(); hpoList[4].IndexList.Add(new HPOMatchIndexModel { StartIndex = 334, EndIndex = 338 }); } } return(hpoList); }