graphMap.js 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392
  1. const echarts = require("echarts");
  2. const { post, api } = require('./api.js');
  3. //关系图
  4. function getGraph(val, type){
  5. post(api.getGraph,{
  6. "inputStr": val,
  7. "labelName": type
  8. }).then(res=>{
  9. if(res.data.code == 0) {
  10. select_type = select_type_noSearch
  11. $('#searchInp').val(val)
  12. drawGraph(res.data.data)
  13. }else{
  14. let nodeStr
  15. nodeStr = '<li class="ellipsis">暂无符合数据</li>'
  16. $(".tabNameList").html(nodeStr)
  17. $(".tabNameList").show()
  18. }
  19. })
  20. }
  21. function drawGraph(data,resultShowId) {
  22. // var colors = [
  23. // '#FB95AF','#788083','#B2CCCF','#68BDF6','#FFD86E','#6DCE9F','#9BB2F0','#DBB7AC'
  24. // ]
  25. var myChart = echarts.init(document.getElementById('main'));
  26. var categories = data['categories'];
  27. var legends = categories.slice(2, categories.length);
  28. var option = {
  29. title: {
  30. text: '医学知识图谱',
  31. top: '10',
  32. left: '10'
  33. },
  34. // color:colors,
  35. tooltip: {
  36. formatter: function (x) {
  37. return x.data.label;
  38. }
  39. },
  40. legend: [{
  41. type: 'scroll',
  42. bottom: 0,
  43. icon: 'circle',
  44. // cursor:'pointer',
  45. data: legends.map(function (a) {
  46. return a.name;
  47. })
  48. }],
  49. series: [
  50. {
  51. type: 'graph',
  52. layout: 'force',
  53. cursor:'pointer',
  54. categories: categories,
  55. symbolSize: 80,
  56. roam: 'move',
  57. edgeSymbol: ['circle', 'arrow'],
  58. edgeSymbolSize: [1, 5],
  59. edgeLabel: {
  60. // cursor:'pointer',
  61. normal: {
  62. textStyle: {
  63. fontSize: 20
  64. }
  65. }
  66. },
  67. force: {
  68. repulsion: 500,
  69. gravity: 0.8,
  70. edgeLength: [4, 7],
  71. layoutAnimation : true
  72. },
  73. draggable: false,
  74. animation: true,
  75. hoverAnimation:false,
  76. animationDuration:5000,
  77. focusNodeAdjacency: true,
  78. itemStyle: {
  79. normal: {
  80. width: 2,
  81. // color: 'target',
  82. // cursor:'pointer',
  83. curveness: 0,
  84. opacity: 1
  85. }
  86. },
  87. lineStyle: {
  88. normal: {
  89. width: 2,
  90. cursor:'default',
  91. color: 'target'
  92. }
  93. },
  94. edgeLabel: {
  95. normal: {
  96. show: true,
  97. formatter: function (x) {
  98. return x.data.value; //横线关系
  99. }
  100. }
  101. },
  102. label: {
  103. normal: {
  104. show: true,
  105. textStyle: {
  106. cursor:'pointer',
  107. },
  108. color:'#1E1E1E', //label字体颜色
  109. formatter: function (x) {
  110. var tmp = x.data.label;
  111. if(tmp.length >= 12){
  112. tmp = tmp.substring(0,12);
  113. tmp = tmp + "...";
  114. }
  115. return tmp;
  116. }
  117. }
  118. },
  119. data: data.node,
  120. links: data.links
  121. }
  122. ]
  123. };
  124. myChart.on('click',dataClick);
  125. myChart.setOption(option);
  126. }
  127. function dataClick(param){
  128. var data = param.data;
  129. const clientHei = $(window).height()
  130. const contentHei = clientHei - 80
  131. // console.log('data', data,select_type)
  132. // var nodes = option.series[0].nodes;
  133. if(data.category == 0){
  134. return
  135. }else{
  136. if(data.symbol != "circle"){
  137. return
  138. }else{
  139. if(data.type == select_type){
  140. $('#searchInp').val(data.label)
  141. updateTree(data.label)
  142. getGraph(data.label,select_type);
  143. }else {
  144. if(data.type == "疾病"){
  145. $(".radioList").show()
  146. select_type_noSearch = data.type
  147. select_type = data.type
  148. $('.selectedName').html(select_type)
  149. $(".activeTab").removeClass("activeTab")
  150. $(".diagnose").addClass("activeTab")
  151. $(".ztree").css("height",contentHei-80-43-60-20+'px')
  152. $('#searchInp').val(data.label)
  153. $('.iconRadio').attr('src','/images/radioUnSelect.png')
  154. $('.ICD10 img').attr('src','/images/radioSelect.png')
  155. getTree(1,1,data.label);
  156. getGraph(data.label,select_type);
  157. }else if(data.type == "药品通用名"){
  158. $(".radioList").hide()
  159. select_type_noSearch = data.type
  160. select_type = data.type
  161. $('.selectedName').html("药品")
  162. $(".activeTab").removeClass("activeTab")
  163. $(".drug").addClass("activeTab")
  164. $(".ztree").css("height",contentHei-80-43-20+'px')
  165. $('#searchInp').val(data.label)
  166. getTree(0,2,data.label);
  167. getGraph(data.label,select_type);
  168. }
  169. }
  170. }
  171. }
  172. }
  173. function getTree(subType, type,showNodeName){
  174. post(api.getTree,
  175. {
  176. "subType": subType, //科室subType: 2, 疾病type:1
  177. "type": type
  178. }
  179. ).then(res=>{
  180. if(res.data.code == 0) {
  181. const data = res.data.data
  182. drawTree(data,showNodeName)
  183. }
  184. })
  185. }
  186. function drawTree(data, showNodeName){
  187. /**
  188. 属性说明 id 当前节点的唯一ID
  189. pId [必须大写] 代表当前节点的父节点id
  190. name:节点名称
  191. open:是否展开当前节点,默认为false
  192. isParent:true 标记当前节点是否为父节点 默认为如果当前节点下有子节点 则为true 否则为false
  193. icon:设置节点的图标地址
  194. iconOpen:设置节点展开时的图标地址 此节点必须是父节点 isParent:true
  195. iconClose:设置节点收起的的图标地地址 此节点必须是父节点 isParent:true
  196. url:点击节点打开的链接地址 如果想使用onClick:zTreeOnClick事件,就不要加url属性 或者改名字 href
  197. target:设置打开链接的方式 [在新窗口打开(_blank),要本窗口打开(_self)]
  198. **/
  199. var setting = {
  200. //数据格式的设置
  201. data:{
  202. simpleData: {
  203. enable: true, //使用简单的JSON格式
  204. idKey: "id",
  205. pIdKey: "pId",
  206. rootPId: ""
  207. },
  208. },
  209. //树的显示设置
  210. view:{
  211. showLine:true, //设置是否显示连线 默认为true
  212. showTitle: true,//设置是否显示鼠标悬浮时显示title的效果
  213. dblClickExpand: true,//设置是否支持双击展开树节点
  214. fontCss : {color:"#333"},//设置节点样式
  215. expandSpeed: "normal",//设置展开的速度 fast normal slow
  216. nameIsHTML: true,//名字是否是HTML
  217. selectedMulti: true,
  218. },
  219. //设置事件回调
  220. callback:{
  221. onClick: function (treeId, treeNode) {
  222. const selectPId = $('.curSelectedNode').attr('id')
  223. const selectId = selectPId.substring(0,selectPId.length-1) + 'ico'
  224. $('#'+selectId).append('<img class="iconSelect" src="./images/iconSelect.png">')
  225. },
  226. beforeClick: function (treeId, treeNode) {
  227. var zTree = $.fn.zTree.getZTreeObj("tree");
  228. if (treeNode.isParent) {
  229. zTree.expandNode(treeNode);
  230. return false;
  231. } else {
  232. const treeNodeName = treeNode.name
  233. let index = treeNodeName.indexOf(' ')
  234. const name = treeNodeName.substring(index+1)
  235. if(select_type != select_type_noSearch){
  236. select_type_noSearch = select_type
  237. if(select_type == "疾病"){
  238. $(".selectedName").html("疾病")
  239. } else if(select_type == "药品通用名"){
  240. $(".selectedName").html("药品")
  241. }
  242. }
  243. getGraph(name,select_type)
  244. const selectPId = $('.curSelectedNode').attr('id')
  245. const selectId = selectPId.substring(0,selectPId.length-1) + 'ico'
  246. $('#'+selectId + ' .iconSelect').remove()
  247. // showKnowledgeGraph(treeNode.name, 'graph', 0);
  248. return true;
  249. }
  250. }
  251. }
  252. };
  253. var zNodes = data.nodes;
  254. // var zNodes = zTreeData.nodes;
  255. $.fn.zTree.init($("#tree"), setting, zNodes);
  256. if(showNodeName) {
  257. updateTree(showNodeName)
  258. }
  259. }
  260. function getNode(val, type){
  261. post(api.getNode,
  262. {
  263. "inputStr": val,
  264. "labelName": type
  265. }
  266. ).then(res=>{
  267. if(res.data.code == 0) {
  268. const data = res.data.data
  269. let nodeStr =''
  270. if(data.length > 0){
  271. for(let i = 0; i < data.length; i++){
  272. nodeStr +=`<li class="ellipsis nodeItem" title=${data[i].name}>${data[i].name}</li>`
  273. }
  274. }else{
  275. nodeStr = '<li class="ellipsis">暂无符合数据</li>'
  276. }
  277. $(".tabNameList").html(nodeStr)
  278. $(".tabNameList").show()
  279. $(".tabNameList li").click(function(){
  280. const txt = $(this).text()
  281. const clientHei = $(window).height()
  282. const contentHei = clientHei - 80
  283. $(".tabNameList").hide()
  284. if(select_type_noSearch != select_type){
  285. select_type = select_type_noSearch
  286. if(select_type == '疾病'){
  287. $(".radioList").show()
  288. $(".activeTab").removeClass("activeTab")
  289. $(".diagnose").addClass("activeTab")
  290. $(".ztree").css("height",contentHei-80-43-60-20+'px')
  291. // $('#searchInp').val("高血压3级")
  292. $('.iconRadio').attr('src','/images/radioUnSelect.png')
  293. $('.ICD10 img').attr('src','/images/radioSelect.png')
  294. getTree(1,1,txt);
  295. }else if(select_type == '药品通用名'){
  296. $(".radioList").hide()
  297. $(".ztree").css("height",contentHei-80-43-20+'px')
  298. $(".activeTab").removeClass("activeTab")
  299. $(".drug").addClass("activeTab")
  300. getTree(0,2,txt);
  301. }
  302. }else{
  303. updateTree(txt)
  304. }
  305. getGraph(txt,select_type)
  306. })
  307. }
  308. })
  309. }
  310. function updateTree(keyWord, txt) {
  311. var t = $("#tree");
  312. // if(zNodes&& zNodes.length > 0 && zNodes[0]['name'].indexOf(txt) != -1){
  313. // $.fn.zTree.init(t, setting, zNodes);
  314. // var zTree = $.fn.zTree.getZTreeObj("tree");
  315. // zTree.selectNode(zTree.getNodeByParam("name", keyWord));
  316. // }else {
  317. var tree_select = document.getElementsByClassName("tree_selected");
  318. for(i = 0; i < tree_select.length; i++){
  319. tree_select[i].className = "tree_button";
  320. }
  321. var tree_button = document.getElementsByClassName("tree_button");
  322. for(i = 0; i < tree_button.length; i++){
  323. if(tree_button[i].text == txt){
  324. tree_button[i].className = "tree_selected";
  325. }
  326. }
  327. if(txt != "疾病"){
  328. $("#radio").hide();
  329. }else {
  330. $("#radio").show();
  331. }
  332. selectedNode = keyWord;
  333. var data = {"name":'tree'};
  334. var zTree = $.fn.zTree.getZTreeObj("tree");
  335. zTree.selectNode(zTree.getNodeByParam("name", keyWord));
  336. const selectPId = $('.curSelectedNode').attr('id')
  337. const selectId = selectPId.substring(0,selectPId.length-1) + 'ico'
  338. $('.iconSelect').remove()
  339. $('#'+selectId).append('<img class="iconSelect" src="./images/iconSelect.png">')
  340. }
  341. function isEmpty(obj){
  342. if(typeof obj == "undefined" || obj == null || obj == ""){
  343. return true;
  344. }else{
  345. return false;
  346. }
  347. }
  348. function getKeyEvent(evt) {
  349. var evt = (evt) ? evt : ((window.event) ? window.event : "");
  350. var key = evt.keyCode?evt.keyCode:evt.which;
  351. if(key==13){
  352. keyDown = true;
  353. queryGraph();
  354. evt.cancleBubble = true;
  355. evt.returnValue = false;
  356. return false;
  357. }else{
  358. return false;
  359. }
  360. }
  361. module.exports ={
  362. drawGraph,
  363. updateTree,
  364. getGraph,
  365. getTree,
  366. getNode
  367. }