blob: aaef6bd7b56ac92919d349feb70121bea4df575e [file] [log] [blame]
<template>
<div id="mains" class="mains-contain"></div>
</template>
<script>
// @ is an alias to /src
import { onMounted, ref, onActivated, onDeactivated } from 'vue';
import * as echarts from 'echarts';
// import { ElButton } from 'element-plus';
import { useI18n } from 'vue-i18n';
import axios from '@/util/axios.js';
// import { useStore } from 'vuex';
//, useRoute
import { useRouter } from 'vue-router';
import img1 from '../../../assets/storage.png';
import img2 from '../../../assets/data.png';
import img3 from '../../../assets/device.png';
var MyChart = '';
export default {
name: 'DataModals',
// props: ['func'],
// setup(props) {
setup() {
const { t } = useI18n();
const x = ref(0);
const router = useRouter();
// const route = useRoute();
const datas = ref({});
const getModalTreeData = (func) => {
axios.get(`/servers/${router.currentRoute.value.params.serverid}/dataModel`, {}).then((res) => {
if (res && res.code == 0) {
// dealData(res.data, (res.data && res.data.children) || [], 0);
dealData([res.data] || {}, 0);
datas.value = res.data || {};
func && func();
}
});
};
/**
* data current level data
* index level num
*/
const dealData = (data, index) => {
for (let i = 0; i < data.length; i++) {
if (index < initialTreeDepth.value) {
data[i].collapsed = false;
} else {
data[i].collapsed = true;
}
if (data[i].children && data[i].children.length) {
if (data[i].children.length > 10) {
data[i].pageNum = 1;
data[i].totalPage = Math.ceil(data[i].children.length / 10);
data[i].childrensTemp = JSON.parse(JSON.stringify(data[i].children));
data[i].children = data[i].children.splice((data[i].pageNum - 1) * 10, 10);
data[i].children.push({ name: t('sourcePage.nextPage'), parentName: data[i].path, type: 'next', pageNum: 1, totalPage: Math.ceil(data[i].childrensTemp.length / 10) });
data[i].children.unshift({ name: t('sourcePage.prePage'), parentName: data[i].path, type: 'pre', pageNum: 1, totalPage: Math.ceil(data[i].childrensTemp.length / 10) });
} else {
data[i].pageNum = 1;
data[i].totalPage = 1;
}
index += 1;
dealData(data[i].children, index);
}
}
};
const clickFunction = (params) => {
let data = params.data || {};
if (data.type) {
//do next if has 'type' key;
if (data.type == 'pre') {
if (data.pageNum == 1) {
return;
} else {
circulateData(data, 'pre');
}
} else if (data.type == 'next') {
if (data.pageNum == data.totalPage) {
return;
} else {
circulateData(data, 'next');
}
}
} else {
if (params.data.children && params.data.children.length) {
circulateDataSelf(data);
}
}
};
const circulateDataSelf = (data) => {
let name = data.path;
// let dataAll = datas.value;
let index = 1;
deepSearchSelf(datas.value, name, index);
};
const deepSearchSelf = (data, name, index) => {
if (data.path == name) {
//do it
data.collapsed = !data.collapsed;
initialTreeDepth.value = index;
MyChart.clear();
setOption();
return;
} else {
index++;
if (data.children && data.children.length) {
for (let i = 0; i < data.children.length; i++) {
deepSearchSelf(data.children[i], name, index);
}
}
}
};
const circulateData = (data, type) => {
let name = data.parentName;
let dataAll = datas.value;
let index = 1;
deepSearch(dataAll, name, type, index);
};
const initialTreeDepth = ref(1);
const deepSearch = (data, name, type, index) => {
if (data.path == name) {
//do it
// data.collapsed = false;
let temp = JSON.parse(JSON.stringify(data.childrensTemp));
initialTreeDepth.value = index;
if (type == 'next') {
data.pageNum += 1;
temp = temp.splice((data.pageNum - 1) * 10, 10);
data.children[0].pageNum += 1;
data.children[data.children.length - 1].pageNum += 1;
} else {
data.pageNum -= 1;
temp = temp.splice((data.pageNum - 1) * 10, 10);
data.children[0].pageNum -= 1;
data.children[data.children.length - 1].pageNum -= 1;
}
temp.unshift(data.children[0]);
temp.push(data.children[data.children.length - 1]);
data.children = temp;
for (let i = 0; i < temp.length; i++) {
if (temp[i].children && temp[i].children.length) {
dealData(temp[i], temp[i].children || []);
}
}
MyChart.clear();
setOption();
return;
} else {
index++;
if (data.children && data.children.length) {
for (let i = 0; i < data.children.length; i++) {
deepSearch(data.children[i], name, type, index);
}
}
}
};
const initCharts = () => {
// init charts
MyChart = echarts.init(document.getElementById('mains'));
MyChart.on('click', function (params) {
clickFunction(params);
});
// set option
setOption();
};
const setOption = () => {
let option = {
tooltip: {
trigger: 'item',
triggerOn: 'mousemove',
formatter: (params) => {
let data = params.data;
if (data.name == 'root') {
//root
return t('sourcePage.storageNum') + ':' + data.groupCount || 0;
} else if (data.isGroup) {
return t('sourcePage.entityNum') + ':' + data.deviceCount || 0;
} else if (data.isDevice) {
return t('sourcePage.physicalNum') + ':' + data.measurementCount || 0;
} else if (data.isMeasurement) {
return (
t('device.datatype') + ':' + data.dataInfo.dataType + '</Br>' + t('sourcePage.dataNum') + ':' + data.dataInfo.dataCount + '</Br>' + t('device.newValue') + ':' + data.dataInfo.newValue
);
} else {
return data.name;
}
},
},
series: [
{
type: 'tree',
edgeShape: 'polyline',
data: [datas.value],
left: '2%',
// right: '2%',
top: '8%',
bottom: '8%',
roam: true,
symbol: 'emptyCircle',
symbolSize: 0,
// orient: 'vertical',
// rootLocation: { x: 'center', y: '6%' },
nodePadding: 80,
// layerPadding: 33,
expandAndCollapse: true,
initialTreeDepth: initialTreeDepth.value,
itemStyle: {
normal: {
color: '#fff',
borderWidth: 0,
borderColor: '#000',
lineStyle: {
color: '#DBDFEAFF',
width: 1,
type: 'broken', // 'curve'|'broken'|'solid'|'dotted'|'dashed'
},
},
},
label: {
position: 'bottom',
rotate: 0,
verticalAlign: 'middle',
align: 'center',
fontSize: 9,
borderWidth: 1,
borderColor: '#EAEDF2FF',
padding: [4, 10, 4, 10],
textStyle: {
color: '#000',
backgroundColor: '#fff',
fontSize: 12,
fontWeight: 500,
baseline: 'middle',
},
rich: {
img: {
backgroundColor: {
image: img1,
},
},
img1: {
backgroundColor: {
image: img2,
},
},
img2: {
backgroundColor: {
image: img3,
},
},
style: {
padding: [0, 0, 0, 6],
},
},
formatter: (params) => {
if (params.data.isGroup && params.data.isDevice) {
return '{img|}{img2|}' + '{style|' + `${params.data.name}` + '}';
} else if (params.data.isGroup) {
return '{img|}' + '{style|' + `${params.data.name}` + '}';
} else if (params.data.isDevice) {
return '{img2|}' + '{style|' + `${params.data.name}` + '}';
} else if (params.data.isMeasurement) {
return '{img1|}' + '{style|' + `${params.data.name}` + '}';
}
},
},
leaves: {
label: {
position: 'bottom',
rotate: 0,
verticalAlign: 'middle',
align: 'center',
},
},
animationDurationUpdate: 750,
},
],
};
// show echart
MyChart.setOption(option);
};
onMounted(() => {
// getModalTreeData(() => {
// initCharts();
// });
});
onActivated(() => {
initialTreeDepth.value = 1;
getModalTreeData(() => {
initCharts();
});
});
onDeactivated(() => {
MyChart && MyChart.dispose();
});
return {
t,
x,
datas,
getModalTreeData,
initCharts,
};
},
components: {
// ElButton,
},
};
</script>
<style scoped lang="scss">
.mains-contain {
width: 100%;
height: 100%;
overflow: auto;
}
</style>