cdss_service.py 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  1. from sqlalchemy.orm import Session
  2. from typing import Optional
  3. from model.kg_node import KGNode
  4. from db.session import get_db
  5. import logging
  6. from sqlalchemy.exc import IntegrityError
  7. from service.kg_node_service import KGNodeService
  8. # from tests.service.test_kg_node_service import kg_node_service
  9. from utils import vectorizer
  10. from utils.vectorizer import Vectorizer
  11. from sqlalchemy import func
  12. from service.kg_prop_service import KGPropService
  13. from service.kg_edge_service import KGEdgeService
  14. from cachetools import TTLCache
  15. from cachetools.keys import hashkey
  16. logger = logging.getLogger(__name__)
  17. DISTANCE_THRESHOLD = 0.65
  18. class CdssService:
  19. _cache = TTLCache(maxsize=100000, ttl=60*60*24*30)
  20. kgPropService = KGPropService(next(get_db()))
  21. def get_disease_detail(self, diease_name: str,category: str):
  22. nodeService = KGNodeService(next(get_db()))
  23. diseases = nodeService.search_title_index("", diease_name, category, 1, 0)
  24. if diseases is None:
  25. return None
  26. disease_id = diseases[0]["id"]
  27. edgeService = KGEdgeService(next(get_db()))
  28. #category='疾病相关实验室检查项目'
  29. laboratoryTests = edgeService.get_edges_by_nodes(src_id=disease_id, category='疾病相关实验室检查项目')
  30. #category='疾病相关辅助检查项目'
  31. examinations = edgeService.get_edges_by_nodes(src_id=disease_id, category='疾病相关辅助检查项目')
  32. # category='疾病相关鉴别诊断'
  33. differential_diagnosis = edgeService.get_edges_by_nodes(src_id=disease_id, category='疾病相关鉴别诊断')
  34. if laboratoryTests:
  35. self.add_props_to_edges(laboratoryTests,True,['sysjclcmd','timelimit'])
  36. if examinations:
  37. self.add_props_to_edges(examinations,True,['fzjclcmd','timelimit'])
  38. if differential_diagnosis:
  39. self.add_props_to_edges(differential_diagnosis, True, ['keydiagnosis'])
  40. return {
  41. 'disease':diseases[0],
  42. 'laboratory_tests': laboratoryTests,
  43. 'examinations': examinations,
  44. 'differential_diagnosis': differential_diagnosis,
  45. 'treatments':self.get_disease_treatments(disease_id)
  46. }
  47. def get_disease_treatments(self, disease_id: str):
  48. treatment = self.kgPropService.get_props_by_ref_id(disease_id, ['distreatment'])
  49. drug_treatments = []
  50. non_drug_treatments = []
  51. if treatment and treatment[0] and treatment[0]['prop_value']:
  52. treatments = treatment[0]['prop_value'].split('^|~|^')
  53. type_groups = {}
  54. for temp in treatments:
  55. splits = temp.split('---')
  56. splits_len = len(splits)
  57. if splits_len >= 5:
  58. if splits_len == 5:
  59. type_key = tuple([splits[1], splits[-3]])
  60. else:
  61. type_key = tuple([splits[1], splits[-4], splits[-3]])
  62. if type_key not in type_groups:
  63. type_groups[type_key] = []
  64. type_groups[type_key].append({
  65. 'order': splits[0],
  66. 'name': splits[-2],
  67. 'reference': splits[-1],
  68. 'type': splits[1:-2]
  69. })
  70. # 将type_groups转换为树状结构
  71. tree = {}
  72. for type_key, items in type_groups.items():
  73. current_level = tree
  74. for level in type_key:
  75. if level not in current_level:
  76. current_level[level] = {}
  77. current_level = current_level[level]
  78. # 对叶子节点按照order升序排列
  79. current_level['items'] = sorted(items, key=lambda x: int(x['order']))
  80. return tree
  81. def add_props_to_edges(self, edges,edge_prop,prop_names=None):
  82. for edge in edges:
  83. if edge_prop:
  84. props = self.kgPropService.get_props_by_ref_id(edge['id'],prop_names)
  85. else:
  86. props = self.kgPropService.get_props_by_ref_id(edge['dest_node']['id'],prop_names)
  87. if props:
  88. for p in props:
  89. if p['prop_name']=='timelimit':
  90. p['prop_value'] = p['prop_value'].split('---')[0]
  91. continue
  92. p['prop_value'] = p['prop_value'].split('^|~|^')
  93. if edge_prop:
  94. edge['props'] = props
  95. else:
  96. edge['dest_node']['props'] = props