const echarts = require("echarts");
const { post, api } = require('./api.js');
const iconUp = require('./../resources/images/iconUp.png');
const iconDown = require('./../resources/images/iconDown.png');
const clientHei = $(window).height()
const contentHei = clientHei - 80
//关系图
function getGraph(val, type){
return post(api.getGraph,{
"inputStr": val,
"labelName": type
}).then(res=>{
if(res.data.code == 0) {
// select_type = select_type_noSearch
$('#searchInp').val(val)
drawGraph(res.data.data)
window.graphTxt = val
window.refreshTree = true
if(type != select_type){
select_type = type
let renderTabInfo = getTab(type)
renderTab(renderTabInfo)
}
}else{
let nodeStr
nodeStr = '
暂无符合数据'
$(".tabNameList").html(nodeStr)
$(".tabNameList").show()
window.refreshTree = false
}
})
}
function drawGraph(data,resultShowId) {
// var colors = [
// '#FB95AF','#788083','#B2CCCF','#68BDF6','#FFD86E','#6DCE9F','#9BB2F0','#DBB7AC'
// ]
var myChart = echarts.init(document.getElementById('main'));
var categories = data['categories'];
var legends = categories.slice(2, categories.length);
var showLegendNum = 0;
let sum = 0
for(let i = 0; i < legends.length; i++){
sum += 2+legends[i].name.length+1
if(sum <= 60){
showLegendNum ++
}
}
var option = {
title: {
text: '医学知识图谱',
top: '10',
left: '10'
},
// color:colors,
tooltip: {
formatter: function (x) {
return x.data.label;
}
},
legend: [{
type: 'scroll',
bottom: 0,
// left: 0,
itemWidth: 8,
itemHeight: 8,
itemGap: 20,
icon: 'circle',
width: 766,
verticalAlign:'top',
borderColor:'#E6E6E6',
borderTopWidth:1,
padding:[20, 1000, 0, 1000],
backgroundColor: "#FFFFFF",
// orient: 'vertical',
data: legends.slice(0,showLegendNum).map(function (a) {
return a.name;
}),
}],
series: [
{
type: 'graph',
layout: 'force',
cursor:'pointer',
categories: categories,
symbolSize: 80,
roam: 'move',
edgeSymbol: ['circle', 'arrow'],
edgeSymbolSize: [1, 5],
edgeLabel: {
// cursor:'pointer',
normal: {
textStyle: {
fontSize: 20
}
}
},
force: {
repulsion: 500,
gravity: 0.8,
friction :0.2, //动画速度
edgeLength: [4, 7],
layoutAnimation : true
},
draggable: false,
animation: true,
hoverAnimation:false,
animationDuration:5000,
focusNodeAdjacency: true,
itemStyle: {
normal: {
width: 2,
// color: 'target',
// cursor:'pointer',
curveness: 0,
opacity: 1
}
},
lineStyle: {
normal: {
width: 2,
cursor:'default',
color: 'target'
}
},
edgeLabel: {
normal: {
show: true,
formatter: function (x) {
return x.data.value; //横线关系
}
}
},
label: {
normal: {
show: true,
textStyle: {
cursor:'pointer',
},
color:'#1E1E1E', //label字体颜色
formatter: function (x) {
var tmp = x.data.label;
if(tmp.length >= 12){
tmp = tmp.substring(0,12);
tmp = tmp + "...";
}
return tmp;
}
}
},
data: data.node,
links: data.links
}
]
};
$(window).resize(function(){
myChart.resize();
})
myChart.on('click',dataClick);
myChart.setOption(option);
if(legends.length > showLegendNum){
$('.legendSlideUp').toggleClass('legendSlideUp')
$('.legendIcon').css('display',"block")
}else{
$('.legendSlideUp').toggleClass('legendSlideUp')
$('.legendIcon').css('display',"none")
}
$('.legendIconImg').off("click").on('click',function(e){
e.stopPropagation()
$('.legendIconImg').toggleClass('legendSlideUp')
if(option.legend[0].type=='scroll'){
option.legend[0].type='plain'
option.legend[0].data = legends
}else{
option.legend[0].type='scroll'
option.legend[0].data = legends.slice(0,showLegendNum)
}
myChart.setOption(option);
})
}
function dataClick(param){
var data = param.data;
const clientHei = $(window).height()
const contentHei = clientHei - 80
// console.log('data', data,select_type)
// var nodes = option.series[0].nodes;
if(data.category == 0){
return
}else{
if(data.symbol != "circle"){
return
}else{
if(data.type == select_type){
$('#searchInp').val(data.label)
updateTree(data.label)
getGraph(data.label,select_type);
}else {
let renderTabInfo = getTab(data.type)
renderTab(renderTabInfo)
if(data.type == "疾病"){
$(".radioList").show()
$('.iconRadio').attr('src','/images/radioUnSelect.png')
$('.ICD10 img').attr('src','/images/radioSelect.png')
setTabBottomHei(1)
}else{
$(".radioList").hide()
setTabBottomHei(2)
}
select_type_noSearch = data.type
select_type = data.type
setSelectName(select_type)
$('#searchInp').val(data.label)
if(data.type == "疾病"){
getTree(1,1,data.label);
getGraph(data.label,select_type);
}else if(data.type == "药品通用名"){
getTree(0,2,data.label);
getGraph(data.label,select_type);
}else if(data.type == "症状"){
getTree(0,3,data.label);
getGraph(data.label,select_type);
}else if(data.type == "手术和操作"){
getTree(0,4,data.label);
getGraph(data.label,select_type);
}else if(data.type == "实验室检查"){
getTree(0,5,data.label);
getGraph(data.label,select_type);
}else if(data.type == "辅助检查"){
getTree(0,6,data.label);
getGraph(data.label,select_type);
}
}
}
}
}
function getTree(subType, type,showNodeName){
post(api.getTree,
{
"subType": subType, //科室subType: 2, 疾病type:1
"type": type
}
).then(res=>{
if(res.data.code == 0) {
const data = res.data.data
drawTree(data,showNodeName)
}
})
}
function drawTree(data, showNodeName){
/**
属性说明 id 当前节点的唯一ID
pId [必须大写] 代表当前节点的父节点id
name:节点名称
open:是否展开当前节点,默认为false
isParent:true 标记当前节点是否为父节点 默认为如果当前节点下有子节点 则为true 否则为false
icon:设置节点的图标地址
iconOpen:设置节点展开时的图标地址 此节点必须是父节点 isParent:true
iconClose:设置节点收起的的图标地地址 此节点必须是父节点 isParent:true
url:点击节点打开的链接地址 如果想使用onClick:zTreeOnClick事件,就不要加url属性 或者改名字 href
target:设置打开链接的方式 [在新窗口打开(_blank),要本窗口打开(_self)]
**/
var setting = {
//数据格式的设置
data:{
simpleData: {
enable: true, //使用简单的JSON格式
idKey: "id",
pIdKey: "pId",
rootPId: ""
},
},
//树的显示设置
view:{
showLine:true, //设置是否显示连线 默认为true
showTitle: true,//设置是否显示鼠标悬浮时显示title的效果
dblClickExpand: true,//设置是否支持双击展开树节点
fontCss : {color:"#333"},//设置节点样式
expandSpeed: "normal",//设置展开的速度 fast normal slow
nameIsHTML: true,//名字是否是HTML
selectedMulti: true,
},
//设置事件回调
callback:{
onClick: function (treeId, treeNode) {
const selectPId = $('.curSelectedNode').attr('id')
if(selectPId){
const selectId = selectPId.substring(0,selectPId.length-1) + 'ico'
$('#'+selectId).append('
')
}
},
beforeClick: function (treeId, treeNode) {
var zTree = $.fn.zTree.getZTreeObj("tree");
if (treeNode.isParent) {
zTree.expandNode(treeNode);
return false;
} else {
const treeNodeName = treeNode.name
let index = treeNodeName.indexOf(' ')
const name = treeNodeName.substring(index+1)
if(select_type != select_type_noSearch){
select_type_noSearch = select_type
setSelectName(select_type)
}
getGraph(name,select_type)
const selectPId = $('.curSelectedNode').attr('id')
if(selectPId){
const selectId = selectPId.substring(0,selectPId.length-1) + 'ico'
$('#'+selectId + ' .iconSelect').remove()
}
// showKnowledgeGraph(treeNode.name, 'graph', 0);
return true;
}
}
}
};
var zNodes = data.nodes;
// var zNodes = zTreeData.nodes;
$.fn.zTree.init($("#tree"), setting, zNodes);
if(showNodeName) {
updateTree(showNodeName)
}
}
function getNode(val, type){
post(api.getNode,
{
"inputStr": val,
"labelName": type
}
).then(res=>{
if(res.data.code == 0) {
const data = res.data.data
let nodeStr =''
if(data.length > 0){
for(let i = 0; i < data.length; i++){
nodeStr +=`${data[i].name}`
}
}else{
nodeStr = '暂无符合数据'
}
$(".tabNameList").html(nodeStr)
$(".tabNameList").show()
$(".tabNameList li").click(function(){
const txt = $(this).text()
if(txt !="暂无符合数据"){
$('#searchInp').val(txt)
}
const clientHei = $(window).height()
const contentHei = clientHei - 80
$(".tabNameList").hide()
getGraph(txt,select_type_noSearch).then(()=>{
if(!window.refreshTree){
return
}
select_type = select_type_noSearch
if(select_type == '疾病'){
// $('#searchInp').val("高血压3级")
getTree(1,1,txt);
}else if(select_type == '药品通用名'){
getTree(0,2,txt);
}else if(select_type == '症状'){
getTree(0,3,txt);
}else if(select_type == '手术和操作'){
getTree(0,4,txt);
}else if(select_type == '实验室检查'){
getTree(0,5,txt);
}else if(select_type == '辅助检查'){
getTree(0,6,txt);
}
if(select_type == '疾病'){
$('.iconRadio').attr('src','/images/radioUnSelect.png')
$('.ICD10 img').attr('src','/images/radioSelect.png')
$(".radioList").show()
setTabBottomHei(1)
}else{
$(".radioList").hide()
setTabBottomHei(2)
}
let renderTabInfo = getTab(select_type)
renderTab(renderTabInfo)
})
})
}
})
}
function updateTree(keyWord, txt) {
var t = $("#tree");
// if(zNodes&& zNodes.length > 0 && zNodes[0]['name'].indexOf(txt) != -1){
// $.fn.zTree.init(t, setting, zNodes);
// var zTree = $.fn.zTree.getZTreeObj("tree");
// zTree.selectNode(zTree.getNodeByParam("name", keyWord));
// }else {
var tree_select = document.getElementsByClassName("tree_selected");
for(i = 0; i < tree_select.length; i++){
tree_select[i].className = "tree_button";
}
var tree_button = document.getElementsByClassName("tree_button");
for(i = 0; i < tree_button.length; i++){
if(tree_button[i].text == txt){
tree_button[i].className = "tree_selected";
}
}
if(txt != "疾病"){
$("#radio").hide();
}else {
$("#radio").show();
}
selectedNode = keyWord;
var data = {"name":'tree'};
var zTree = $.fn.zTree.getZTreeObj("tree");
zTree.selectNode(zTree.getNodeByParam("name", keyWord));
const selectPId = $('.curSelectedNode').attr('id')
if(selectPId){
const selectId = selectPId.substring(0,selectPId.length-1) + 'ico'
$('.iconSelect').remove()
$('#'+selectId).append('
')
}
}
function isEmpty(obj){
if(typeof obj == "undefined" || obj == null || obj == ""){
return true;
}else{
return false;
}
}
function getKeyEvent(evt) {
var evt = (evt) ? evt : ((window.event) ? window.event : "");
var key = evt.keyCode?evt.keyCode:evt.which;
if(key==13){
keyDown = true;
queryGraph();
evt.cancleBubble = true;
evt.returnValue = false;
return false;
}else{
return false;
}
}
function getTab(tabName){
let tabList = ["疾病","药品通用名","症状","手术和操作","实验室检查","辅助检查"]
let tabListCopy = tabList.slice()
const index = tabList.findIndex(item => item == tabName)
if(index <= 3){
return {
activeIndex: index,
showTabList:tabListCopy.slice(0,4),
hideTabList:tabListCopy.slice(4)
}
}else{
tabListCopy.splice(index,1)
let hideTabList = tabListCopy.slice(3)
return {
activeIndex: 3,
showTabList:tabListCopy.slice(0,3).concat(tabName),
hideTabList:hideTabList
}
}
}
function renderTab(data){
const showList = data.showTabList
const hideList = data.hideTabList
const activeIndex = data.activeIndex
let showtabStr = ``
let hidetabStr = ``
for(let i = 0; i < showList.length; i++){
showtabStr +=` ${showList[i] =="药品通用名" ?"药品":showList[i]}`
if(i === activeIndex){
if(showList[i] =="药品通用名"){
$("#searchInp").attr("placeholder",`请输入药品名称`)
}else{
$("#searchInp").attr("placeholder",`请输入${showList[i]}名称`)
}
}
}
for(let i = 0; i < hideList.length; i++){
hidetabStr +=`${hideList[i]}`
}
hidetabStr += `
收起
`
// console.log('showtabStr',showtabStr)
$('.showTabList').html(showtabStr)
$('.hideTabList').html(hidetabStr)
bindTabClick()
ToggleTab()
}
ToggleTab()
function ToggleTab(){
$(".toggleTab").off("click").click(function(e){
e.stopPropagation()
hideSlide("hideTabList")
const hideTabDis = $(".hideTabList").css("display")
if(hideTabDis == "none"){
showHideTab()
}else{
hideHideTab()
}
})
}
function showHideTab(){
$(".hideTabList").show()
$(".tabList").addClass("tabListShow")
$(".toggleTab").css("display","none")
$(".hideTabList .toggleTab").css("display","inline-block")
// $(".toggleTabTxt").html("收起")
// $(".toggleArrow").attr("src",iconUp)
}
function hideHideTab(e){
$(".hideTabList").hide()
// $(".toggleTabTxt").html("展开")
// $(".toggleArrow").attr("src",iconDown)
$(".toggleTab").css("display","block")
$(".tabList").removeClass("tabListShow")
}
bindTabClick()
//切换tab
function bindTabClick(){
$('.tabList .tab').click(function(){
const id = $(this).attr('data-id')
$(this).addClass("activeTab").siblings().removeClass('activeTab')
let renderInfo = getTab(id)
renderTab(renderInfo)
if(id != select_type){
if(id != "疾病"){
$(".radioList").hide()
setTabBottomHei(2)
}else{
$(".radioList").show()
setTabBottomHei(1)
}
select_type_noSearch = id
select_type = id
setSelectName(select_type)
if(id == "疾病"){
$('#searchInp').val("急性胰腺炎")
$('.iconRadio').attr('src','/images/radioUnSelect.png')
$('.ICD10 img').attr('src','/images/radioSelect.png')
getTree(1,1,"急性胰腺炎");
getGraph("急性胰腺炎",select_type);
}else if(id=="药品通用名"){
$('#searchInp').val("地高辛(XC01AAD072A001010100372)")
getTree(0,2,"地高辛(XC01AAD072A001010100372)");
getGraph("地高辛(XC01AAD072A001010100372)",select_type);
}else if(id == "症状"){
$('#searchInp').val("背痛")
getTree(0,3,"背痛");
getGraph("背痛",select_type);
}else if(id == "手术和操作"){
$('#searchInp').val("动脉缝合术")
getTree(0,4,"动脉缝合术");
getGraph("动脉缝合术",select_type);
}else if(id == "实验室检查"){
$('#searchInp').val("白细胞计数(WBC)")
getTree(0,5,"白细胞计数(WBC)");
getGraph("白细胞计数(WBC)",select_type);
}else if(id == "辅助检查"){
$('#searchInp').val("肝彩超")
getTree(0,6,"肝彩超");
getGraph("肝彩超",select_type);
}
// getTree(1,1,""); //切换tab重新画菜单树
}
hideHideTab()
})
}
function setTabBottomHei(type){
const clientHei = $(window).height()
const contentHei = clientHei - 80
if(type==1){
$(".tabBottom").css({
'margin': '0px 0px 0px 0px'
})
$(".tabBottom").css("height",contentHei-80-43-10+'px')
$(".ztree").css("height",contentHei-80-43-60-20-24+'px')
}else if(type == 2){
$(".tabBottom").css("height",contentHei-80-43-10-20+'px')
$(".tabBottom").css({
'margin': '20px 0px 0px 0px'
})
$(".ztree").css("height",contentHei-80-43-20-20-20+'px')
}
}
function setSelectName(name){
if(name=="药品通用名"){
$('.selectedName').html("药品")
$('.selectedName').attr("title","药品")
$("#searchInp").attr("placeholder",`请输入药品名称`)
}else{
$('.selectedName').attr('title', name)
$("#searchInp").attr("placeholder",`请输入${name}名称`)
if(name.length > 4){
$('.selectedName').html(name.slice(0,4)+'...')
}else{
$('.selectedName').html(name)
}
}
}
function hideSlide(expectClass){
let hideSlideList = ['selectList', 'tabNameList','tabNameListNoSearch','hideTabList']
let index = hideSlideList.findIndex(item => item == expectClass)
for(let i = 0; i < hideSlideList.length; i++){
if(i != index){
if(hideSlideList[i] == "selectList"){
$('.'+hideSlideList[i]).hide()
$('.iconSlide').attr('src','./images/iconSlideDown.png')
}else if(hideSlideList[i] == "hideTabList"){
hideHideTab()
}else{
$('.'+hideSlideList[i]).hide()
}
}
}
}
module.exports ={
drawGraph,
updateTree,
getGraph,
getTree,
getNode,
getTab,
renderTab,
setTabBottomHei,
setSelectName,
hideHideTab,
hideSlide
}