bw/src/views/bim/bimHome/components/DeviceInfoDialog.vue

467 lines
16 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

<template>
<div class="deviceInfoDialog">
<div class="left-div">
<el-select v-model="buildValue" class="m-2" placeholder="Select" size="large">
<el-option v-for="item in buildOptions" :key="item.value" :label="item.label" :value="item.value" />
</el-select>
<el-tree ref="myTree" :data="treeData" :props="defaultProps" node-key="id" check-strictly="true"
highlight-current default-expand-all :current-node-key="checkedkeys" @node-click="handleNodeClick" />
</div>
<div class="right-div">
<div class="top-div">
<div :id="'echartDiv' + index" class="echartDiv100" v-for="(item, index) of deviceList" :key="index"
style="width: 100%;height:100%"></div>
</div>
<div class="bottom-div">
<el-table :data="tableData" border style="width: 100%" height="420">
<el-table-column label="序号" width="60" type="index" align="center"></el-table-column>
<el-table-column prop="name" label="名称" align="center" />
<el-table-column prop="num" label="编码" align="center" />
<el-table-column prop="type" label="类型" align="center" />
<el-table-column label="操作" align="center">
<template #default="scope">
<el-button type="primary" @click="viewDetail(scope.row)"></el-button>
</template>
</el-table-column>
</el-table>
</div>
</div>
</div>
</template>
<script setup>
import * as echarts from "echarts";
import bimStore from '@/store/modules/bim';
const buildOptions = [
{
value: '0',
label: '漳州工厂',
}
]
const defaultProps = {
children: 'children',
label: 'label',
}
const data = reactive({
buildValue: '0',
treeData: [
{
label: '原料糖化车间',
id: '0',
url: '/jz/glb/scene.gltf',
info: {
name: '原料糖化车间',
area: '9436 ㎡',
status: '启用',
desc: '原料糖化车间负责原料糖化启用于2011年'
},
deviceInfo: [
{
type: '生产设备',
name: '立仓',
num: 'T11',
value: 45,
id: "echartDiv0"
},
{
type: '生产设备',
name: '过滤槽',
num: 'guolvcao_1',
value: 130,
id: "echartDiv1"
},
{
type: '安防设备',
name: '摄像头',
num: 'T3',
value: 180,
id: "echartDiv2"
},
{
type: '消防设备',
name: '烟感',
num: 'T4',
value: 100,
id: "echartDiv3"
}
],
children: [
{
label: '原料糖化车间一',
id: '0-1',
url: '/jz/glb/scene.gltf',
children: [],
info: {
name: '原料糖化车间一',
area: '5200 ㎡',
status: '启用',
desc: '原料糖化车间一负责原料糖化启用于2011年'
},
deviceInfo: [
{
type: '生产设备',
name: '立仓',
num: 'T11',
value: 15,
id: "echartDiv0"
},
{
type: '生产设备',
name: '过滤槽',
num: 'guolvcao_1',
value: 50,
id: "echartDiv1"
},
{
type: '安防设备',
name: '摄像头',
num: 'T3',
value: 80,
id: "echartDiv2"
},
{
type: '消防设备',
name: '烟感',
num: 'T4',
value: 50,
id: "echartDiv3"
}
],
},
{
label: '原料糖化车间二',
id: '0-2',
url: '/jz/glb/scene.gltf',
children: [],
info: {
name: '原料糖化车间二',
area: '4236 ㎡',
status: '启用',
desc: '原料糖化车间二负责原料糖化启用于2013年'
},
deviceInfo: [
{
type: '生产设备',
name: '立仓',
num: 'T11',
value: 30,
id: "echartDiv0"
},
{
type: '生产设备',
name: '过滤槽',
num: 'guolvcao_1',
value: 80,
id: "echartDiv1"
},
{
type: '安防设备',
name: '摄像头',
num: 'T4',
value: 100,
id: "echartDiv2"
},
{
type: '消防设备',
name: '烟感',
num: 'T3',
value: 50,
id: "echartDiv3"
}
],
},
],
}
],
checkedkeys: "",
deviceList: [
{
name: '设备A',
num: 36,
id: "echartDiv0"
},
{
name: '设备B',
num: 36,
id: "echartDiv1"
},
{
name: '设备C',
num: 36,
id: "echartDiv2"
},
{
name: '设备D',
num: 36,
id: "echartDiv3"
}
],
tableData: []
});
const { buildValue, treeData, checkedkeys, deviceList, tableData } = toRefs(data);
const emit = defineEmits(['viewDetail'])
onMounted(() => {
nextTick(() => {
checkedkeys.value = treeData.value[0].id;
handleNodeClick(treeData.value[0]);
})
})
const handleNodeClick = (value) => {
value.deviceInfo.forEach(ele => {
getCharts(ele);
})
tableData.value = value.deviceInfo;
}
const getCharts = (ele) => {
var dom = document.getElementById(ele.id);
if (dom) {
// 手动移除该属性
dom.removeAttribute('_echarts_instance_')
var myChart = echarts.init(dom);
var option = {
grid: {
left: "8%", //画布左移位置
top: "10%",
width: "90%", //画布宽度
height: "65%", //画布高度
},
series: [{
name: '第二次弧形向外渐变',
type: 'gauge',
radius: '60%',
splitNumber: 0, // 刻度数量
min: 0, // 最小刻度
max: 100,
// 仪表盘轴线相关配置
axisLine: {
lineStyle: {
color: [
[
3,
{
type: 'radial',
x: 0.5,
y: 0.6,
r: 0.6,
colorStops: [
{
offset: 0.84,
color: 'rgba(50, 226, 247, 0)', // 0% 处的颜色
}, {
offset: 0.85,
color: 'rgba(29, 129, 172, 1.00)', // 0% 处的颜色
},
{
offset: 0.99,
color: 'rgba(24, 124, 165, 0.1)', // 100% 处的颜色
},
{
offset: 1,
color: 'rgba(50, 226, 247, 0)', // 100% 处的颜色
},
],
},
],
],
width: 40,
},
},
/** 分隔线样式*/
splitLine: {
show: false,
length: 9,
lineStyle: {
width: 1,
color: '#fff', // 用颜色渐变函数不起作用
},
},
/** 刻度线*/
axisTick: {
show: false,
splitNumber: 2,
lineStyle: {
color: 'rgba(255, 255, 255, 0.3)', // 用颜色渐变函数不起作用
width: 1,
},
length: 5,
},
/** 刻度标签*/
axisLabel: {
distance: 2,
show: false,
color: 'rgba(255, 255, 255, 1)',
fontSize: 12,
fontFamily: 'DIN-Bold'
},
detail: {
show: false,
},
animationDuration: 4000,
}, {
type: 'gauge',
radius: '92%',
splitNumber: 0, // 刻度数量
min: 0, // 最小刻度
max: 100,
progress: {
show: true,
roundCap: true,
width: 15,
itemStyle: {
color: '#58D9F9',
shadowColor: 'rgba(0,138,255,0.45)',
shadowBlur: 10,
shadowOffsetX: 2,
shadowOffsetY: 2
},
},
axisLine: {
lineStyle: {
color: [
[
5,
{
type: 'radial',
x: 0.5,
y: 0.6,
r: 0.6,
colorStops: [
{
offset: 0.84,
color: 'rgba(50, 226, 247, 0)', // 0% 处的颜色
}, {
offset: 0.85,
color: 'rgba(29, 129, 172, 1.00)', // 0% 处的颜色
},
{
offset: 0.99,
color: 'rgba(24, 124, 165, 0.1)', // 100% 处的颜色
},
{
offset: 1,
color: 'rgba(50, 226, 247, 0)', // 100% 处的颜色
},
],
},
],
],
width: 18,
},
},
//分隔线样式。
splitLine: {
show: false,
},
//刻度样式。
axisTick: {
show: false,
},
//刻度标签。
axisLabel: {
show: false,
},
//仪表盘指针。
pointer: {
//这个show属性好像有问题因为在这次开发中需要去掉指正我设置false的时候还是显示指针估计是BUG吧我用的echarts-3.2.3希望改进。最终我把width属性设置为0成功搞定
show: false,
//指针长度
length: '90%',
width: 0,
},
//仪表盘标题。
title: {
show: true,
offsetCenter: ['2', '55'], // x, y单位px
textStyle: {
color: '#fff',
fontSize: 14
},
backgroundColor: "#58D9F9",
borderWidth: 3, //设置边框粗细
borderRadius: 20,
lineHeight: 20,
height: 20,
width: 80
},
//仪表盘详情,用于显示数据。
detail: {
show: true,
offsetCenter: [0, '0%'],
formatter: function (value) {
return value + '台';
},
textStyle: {
fontSize: 20,
color: '#31e4f4'
}
},
data: [{
value: ele.value,
name: ele.name
},]
}]
};
option && myChart.setOption(option);
}
}
const viewDetail = (val) => {
bimStore().setDeviceNum(val.num);
emit('viewDetail', val);
}
</script>
<style lang="scss" scoped>
.deviceInfoDialog {
height: 600px;
display: flex;
justify-content: space-between;
.left-div {
width: 20%;
height: 100%;
border: 1px solid #2E6099;
.el-tree {
margin: 0 10px;
}
.el-select {
margin: 10px;
}
}
.right-div {
width: 79%;
height: 100%;
// border: 1px solid #3cbfdf;
display: flex;
flex-direction: column;
justify-content: space-between;
.top-div {
width: 100%;
height: 25%;
display: flex;
justify-content: space-between;
.echartDiv100 {
width: 22% !important;
height: 100% !important;
border: 1px solid #2E6099;
}
}
.bottom-div {
height: 74%;
border: 1px solid #2E6099;
}
}
}
</style>