Example #1
0
        /// <summary>
        /// for batch task
        /// </summary>
        /// <param name="nlpEngine"></param>
        /// <param name="patientEMRDetail"></param>
        /// <returns></returns>
        public List <HPODataModel> GetNlpHPOResultBatch(string patientEMRDetail)
        {
            var hpoList = new List <HPODataModel>();

            if (!string.IsNullOrWhiteSpace(patientEMRDetail))
            {
                try
                {
                    var    clientName = "HPOStringMatchHost";
                    var    api        = _config.GetValue <string>("NLPAddress:HPOStringMatchApi");
                    var    client     = _clientFactory.CreateClient(clientName);
                    string boundary   = DateTime.Now.Ticks.ToString("X");
                    var    formData   = new MultipartFormDataContent(boundary);
                    patientEMRDetail = "{\"text\":\"" + patientEMRDetail + "\"}";
                    formData.Add(new StringContent(patientEMRDetail), "texts");
                    var response      = client.PostAsync(api, formData);
                    var result        = response.Result.Content.ReadAsStringAsync().Result.ToString();
                    var hpoEngineList = JsonConvert.DeserializeObject <List <HPOAPIEngineResultModel> >(result);
                    foreach (var r in hpoEngineList)
                    {
                        if (r.Positivie == 0)
                        {
                            continue;
                        }
                        foreach (var hpo in r.Similarchpoid)
                        {
                            var data = new HPODataModel();
                            data.HPOId = hpo;
                            var item = hpoList.FirstOrDefault(x => x.HPOId == data.HPOId);
                            if (item == null)
                            {
                                hpoList.Add(data);
                            }
                        }
                    }
                }
                catch (Exception ex)
                {
                    _logger.LogError("NLPSystemRepository GetPatientHPOResult报错:" + ex.ToString());
                }
            }
            return(hpoList);
        }
Example #2
0
        public List <HPODataModel> GetExamHPOResultBatch(string patientVisitId)
        {
            var result = new List <HPODataModel>();

            if (!string.IsNullOrWhiteSpace(patientVisitId))
            {
                //获取所有检验HPO规则
                var examBase = _localMemoryCache.GetExamBaseDataList();
                //获取所有检验数据
                var    examList = new List <ExamBaseDataModel>();
                string sql      = GetSqlText("home-get-exam-data-sql.txt");
                sql = string.Format(sql, patientVisitId);
                using (var reader = dbgp.Ado.GetDataReader(sql))
                {
                    while (reader.Read())
                    {
                        var data = new ExamBaseDataModel();
                        data.ExamCode    = reader["exam_code"] == DBNull.Value ? "" : reader["exam_code"].ToString();
                        data.ExamName    = reader["exam_name"] == DBNull.Value ? "" : reader["exam_name"].ToString();
                        data.SampleCode  = reader["sample_code"] == DBNull.Value ? "" : reader["sample_code"].ToString();
                        data.SampleName  = reader["sample_name"] == DBNull.Value ? "" : reader["sample_name"].ToString();
                        data.Range       = reader["range"] == DBNull.Value ? "" : reader["range"].ToString();
                        data.ExamValue   = reader["value"] == DBNull.Value ? 0 : Convert.ToDecimal(reader["value"]);
                        data.ExamTimeStr = reader["examTimeStr"] == DBNull.Value ? "" : reader["examTimeStr"].ToString();
                        examList.Add(data);
                    }
                }
                //遍历每条规则,查看检验数据里面是否有符合规则的数据
                foreach (var r in examBase)
                {
                    var subList = examList.Where(x => x.ExamCode == r.ExamCode && x.SampleCode.ToUpper() == r.SampleCode.ToUpper()).ToList();
                    if (subList.Count == 0)
                    {
                        continue;
                    }
                    var list = new List <ExamBaseDataModel>();
                    //区间命中
                    if (r.Maxinum > 0 && r.Minimum > 0)
                    {
                        list = subList.Where(x => x.ExamValue > r.Minimum && x.ExamValue < r.Maxinum).ToList();
                    }
                    //低于最小值命中
                    else if (r.Maxinum == 0 && r.Minimum > 0)
                    {
                        list = subList.Where(x => x.ExamValue < r.Minimum).ToList();
                    }
                    //大于最大值命中
                    else if (r.Maxinum > 0 && r.Minimum == 0)
                    {
                        list = subList.Where(x => x.ExamValue > r.Maxinum).ToList();
                    }
                    if (list != null && list.Any())
                    {
                        if (list.Count >= r.MatchTime)
                        {
                            if (!result.Any(x => x.HPOId == r.HPOId))
                            {
                                var hpoItem = new HPODataModel();
                                hpoItem.HPOId = r.HPOId;
                                result.Add(hpoItem);
                            }
                        }
                    }
                }
            }
            else
            {
            }

            return(result);
        }
Example #3
0
        public List <HPODataModel> SearchStandardHPOList(string searchHPOText)
        {
            var searchedHPOList = new List <HPODataModel>();

            if (_hostingEnvironment.IsProduction())
            {
                if (!string.IsNullOrWhiteSpace(searchHPOText))
                {
                    string sql = GetSqlText("search-standard-hpo-sql.txt");
                    sql = string.Format(sql, searchHPOText);
                    using (var reader = dbgp.Ado.GetDataReader(sql))
                    {
                        while (reader.Read())
                        {
                            var data = new HPODataModel();
                            data.Name        = reader["name_cn"] == DBNull.Value ? "" : reader["name_cn"].ToString();
                            data.NameEnglish = reader["name_en"] == DBNull.Value ? "" : reader["name_en"].ToString();
                            data.HPOId       = reader["hpoid"] == DBNull.Value ? "" : reader["hpoid"].ToString();
                            searchedHPOList.Add(data);
                        }
                    }
                }
            }
            else
            {
                searchedHPOList.Add(new HPODataModel {
                    Name = "震颤", NameEnglish = "Tremor", HPOId = "HP:0001337"
                });
                searchedHPOList.Add(new HPODataModel {
                    Name = "帕金森症", NameEnglish = "Parkinsonism", HPOId = "HP:0001300"
                });
                searchedHPOList.Add(new HPODataModel {
                    Name = "运动迟缓", NameEnglish = "Bradykinesia", HPOId = "HP:0002067"
                });
                searchedHPOList.Add(new HPODataModel {
                    Name = "强直", NameEnglish = "Rigidity", HPOId = "HP:0002063"
                });
                searchedHPOList.Add(new HPODataModel {
                    Name = "姿势不稳", NameEnglish = "Postural instability", HPOId = "HP:0002172"
                });
                searchedHPOList.Add(new HPODataModel {
                    Name = "核上性凝视麻痹", NameEnglish = "Supranuclear gaze palsy", HPOId = "HP:0000605"
                });
                searchedHPOList.Add(new HPODataModel {
                    Name = "眼睑失用症", NameEnglish = "Eyelid apraxia", HPOId = "HP:0000658"
                });
                searchedHPOList.Add(new HPODataModel {
                    Name = "肌张力障碍", NameEnglish = "Dystonia", HPOId = "HP:0001332"
                });
                searchedHPOList.Add(new HPODataModel {
                    Name = "智能衰退", NameEnglish = "Mental deterioration", HPOId = "HP:0001268"
                });
                searchedHPOList.Add(new HPODataModel {
                    Name = "构音障碍", NameEnglish = "Dysarthria", HPOId = "HP:0001260"
                });
                searchedHPOList.Add(new HPODataModel {
                    Name = "曳行步态", NameEnglish = "Shuffling gait", HPOId = "HP:0002362"
                });
                searchedHPOList.Add(new HPODataModel {
                    Name = "常染色体隐性遗传", NameEnglish = "Autosomal recessive inheritance", HPOId = "HP:0000007"
                });
            }
            foreach (var r in searchedHPOList)
            {
                r.CHPOName = r.Name;
            }
            return(searchedHPOList);
        }
Example #4
0
        public List <HPODataModel> GetPatientExamDataResult(string patientVisitIds)
        {
            var result = new List <HPODataModel>();

            if (_hostingEnvironment.IsProduction() && !string.IsNullOrWhiteSpace(patientVisitIds))
            {
                //获取所有检验HPO规则
                var examBase = _localMemoryCache.GetExamBaseDataList();
                //获取所有检验数据
                var    examList = new List <ExamBaseDataModel>();
                string sql      = GetSqlText("home-get-exam-data-sql.txt");
                sql = string.Format(sql, patientVisitIds);
                using (var reader = dbgp.Ado.GetDataReader(sql))
                {
                    while (reader.Read())
                    {
                        var data = new ExamBaseDataModel();
                        data.ExamCode    = reader["exam_code"] == DBNull.Value ? "" : reader["exam_code"].ToString();
                        data.ExamName    = reader["exam_name"] == DBNull.Value ? "" : reader["exam_name"].ToString();
                        data.SampleCode  = reader["sample_code"] == DBNull.Value ? "" : reader["sample_code"].ToString();
                        data.SampleName  = reader["sample_name"] == DBNull.Value ? "" : reader["sample_name"].ToString();
                        data.Range       = reader["range"] == DBNull.Value ? "" : reader["range"].ToString();
                        data.ExamValue   = reader["value"] == DBNull.Value ? 0 : Convert.ToDecimal(reader["value"]);
                        data.ExamTimeStr = reader["examTimeStr"] == DBNull.Value ? "" : reader["examTimeStr"].ToString();
                        examList.Add(data);
                    }
                }
                //遍历每条规则,查看检验数据里面是否有符合规则的数据
                foreach (var r in examBase)
                {
                    var subList = examList.Where(x => x.ExamCode == r.ExamCode && x.SampleCode.ToUpper() == r.SampleCode.ToUpper()).ToList();
                    if (subList.Count == 0)
                    {
                        continue;
                    }
                    var list = new List <ExamBaseDataModel>();
                    //区间命中
                    if (r.Maxinum > 0 && r.Minimum > 0)
                    {
                        list = subList.Where(x => x.ExamValue > r.Minimum && x.ExamValue < r.Maxinum).ToList();
                    }
                    //低于最小值命中
                    else if (r.Maxinum == 0 && r.Minimum > 0)
                    {
                        list = subList.Where(x => x.ExamValue < r.Minimum).ToList();
                    }
                    //大于最大值命中
                    else if (r.Maxinum > 0 && r.Minimum == 0)
                    {
                        list = subList.Where(x => x.ExamValue > r.Maxinum).ToList();
                    }
                    if (list != null && list.Any())
                    {
                        if (list.Count >= r.MatchTime)
                        {
                            var data = result.FirstOrDefault(x => x.HPOId == r.HPOId);
                            if (data != null)
                            {
                                data.ExamData.AddRange(list);
                            }
                            else
                            {
                                var hpoItem = new HPODataModel();
                                hpoItem.HPOId       = r.HPOId;
                                hpoItem.Name        = r.HPOName;
                                hpoItem.CHPOName    = r.HPOName;
                                hpoItem.NameEnglish = r.HPOEnglish;
                                hpoItem.TermSource  = "检验规则";
                                hpoItem.HasExam     = true;
                                hpoItem.ExamData    = new List <ExamBaseDataModel>();
                                hpoItem.ExamData.AddRange(list);
                                result.Add(hpoItem);
                            }
                        }
                    }
                }
            }
            else
            {
                var hpoItem = new HPODataModel {
                    Name = "高蛋白血症", NameEnglish = "Hyperproteinemia", HPOId = "HP:0002152", CHPOName = "高蛋白血症", TermSource = "检验规则"
                };
                var item = new ExamBaseDataModel();
                item.HPOId       = "HP:0002152";
                item.HPOName     = "高蛋白血症";
                item.HPOEnglish  = "Hyperproteinemia";
                item.ExamCode    = "2925";
                item.ExamName    = "总蛋白";
                item.SampleCode  = "LIS126";
                item.SampleName  = "血清";
                item.Range       = "60.0-83.0 g/L";
                item.ExamValue   = 121;
                item.ExamTimeStr = "2019-12-12";

                var item1 = new ExamBaseDataModel();
                item1.HPOId       = "HP:0002152";
                item1.HPOName     = "高蛋白血症";
                item1.HPOEnglish  = "Hyperproteinemia";
                item1.ExamCode    = "2925";
                item1.ExamName    = "总蛋白";
                item1.SampleCode  = "LIS126";
                item1.SampleName  = "血清";
                item1.Range       = "60.0-83.0 g/L";
                item1.ExamValue   = 99;
                item1.ExamTimeStr = "2020-01-12";

                hpoItem.HasExam  = true;
                hpoItem.ExamData = new List <ExamBaseDataModel>();
                hpoItem.ExamData.Add(item);
                hpoItem.ExamData.Add(item1);
                result.Add(hpoItem);
            }

            return(result);
        }
Example #5
0
        /// <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);
        }