|
@@ -1,27 +1,15 @@
|
|
|
<template>
|
|
|
<div class="_running">
|
|
|
<HeadlineTag value="运行统计"></HeadlineTag>
|
|
|
-
|
|
|
- <div class="_running_mains">
|
|
|
- <div class="_running_mains_left">
|
|
|
- <div class="_running_mains_left_tuan"></div>
|
|
|
- <div class="_running_mains_left_conter">
|
|
|
- <div class="_running_mains_left_conter_num">62</div>
|
|
|
- <div class="_running_mains_left_conter_text">设备总数</div>
|
|
|
- </div>
|
|
|
+ <div class="_running_mains">
|
|
|
+ <div class="flex_person">
|
|
|
+ <div ref="chartAccessLeft" style="width: 100%;height: 100%;"></div>
|
|
|
</div>
|
|
|
- <div class="_running_mains_right">
|
|
|
- <div class="_running_mains_right_item" v-for="item,index in runningList" :key="index">
|
|
|
- <div class="_running_mains_right_item_tuan">
|
|
|
- <span class="_running_mains_right_item_tuan_flag" :style="{backgroundColor: item.color}"></span>
|
|
|
- <el-text class="w-150px mb-2" truncated style="color: #ccc;">
|
|
|
- {{item.name}}
|
|
|
- </el-text>
|
|
|
- </div>
|
|
|
- <div class="_running_mains_right_item__txt">
|
|
|
- {{item.state}}
|
|
|
- </div>
|
|
|
- </div>
|
|
|
+ <!-- <div class="flex_person">
|
|
|
+ <div ref="chartAccessCenter" style="width: 100%;height: 100%;"></div>
|
|
|
+ </div> -->
|
|
|
+ <div class="flex_person">
|
|
|
+ <div ref="chartAccessRight" style="width: 100%;height: 100%;"></div>
|
|
|
</div>
|
|
|
</div>
|
|
|
</div>
|
|
@@ -30,22 +18,186 @@
|
|
|
<script setup>
|
|
|
import { ref } from "vue";
|
|
|
import HeadlineTag from '@/components/HeadlineTag'
|
|
|
+import * as echarts from 'echarts'
|
|
|
const runningList = ref([
|
|
|
{ name:'开启数量', state:'61', color:'#15acaa'},
|
|
|
- { name:'关闭数量', state:'1', color:'#FFC107'},
|
|
|
- { name:'故障数量', state:'0', color:'#F44336'}
|
|
|
+ // { name:'关闭数量', state:'14', color:'#FFC107'},
|
|
|
+ { name:'故障数量', state:'34', color:'#F44336'}
|
|
|
])
|
|
|
+
|
|
|
+// 计算比例的函数
|
|
|
+const calculateRatios = () => {
|
|
|
+ const total = runningList.value.reduce((sum, item) => sum + parseInt(item.state, 10), 0);
|
|
|
+ return runningList.value.map(item => ({
|
|
|
+ ...item,
|
|
|
+ ratio: total > 0 ? (parseInt(item.state, 10) / total) * 100 : 0
|
|
|
+ }));
|
|
|
+};
|
|
|
+
|
|
|
+const chartAccessLeft = ref(null);
|
|
|
+const chartAccessRight = ref(null);
|
|
|
+
|
|
|
+let chartLeft = null;
|
|
|
+let chartRight = null;
|
|
|
+const initAccess = () => {
|
|
|
+ const ratios = calculateRatios();
|
|
|
+ ratios.forEach((item,index)=>{
|
|
|
+ console.log('比列',ratios)
|
|
|
+ const datas = {
|
|
|
+ value: item.ratio,
|
|
|
+ text: item.name
|
|
|
+ }
|
|
|
+ chartLeft = echarts.init(chartAccessLeft.value);
|
|
|
+ chartRight = echarts.init(chartAccessRight.value);
|
|
|
+ let option = {
|
|
|
+ series: [
|
|
|
+ /*仪表盘图,做中间刻度线*/
|
|
|
+ {
|
|
|
+ type: 'gauge',
|
|
|
+ name: '',
|
|
|
+ radius: '86%',
|
|
|
+ startAngle: '0',
|
|
|
+ endAngle: '-359.99',
|
|
|
+ center: ['50%', '50%'],
|
|
|
+ splitNumber: '80',
|
|
|
+ pointer: {
|
|
|
+ show: false
|
|
|
+ },
|
|
|
+ title: {
|
|
|
+ show: false
|
|
|
+ },
|
|
|
+ detail: {
|
|
|
+ show: false
|
|
|
+ },
|
|
|
+ axisLine: {
|
|
|
+ lineStyle: {
|
|
|
+ width: 20,
|
|
|
+ opacity: 0
|
|
|
+ }
|
|
|
+ },
|
|
|
+ axisTick: {
|
|
|
+ show: false
|
|
|
+ },
|
|
|
+ splitLine: {
|
|
|
+ show: true,
|
|
|
+ length: 7,
|
|
|
+ lineStyle: {
|
|
|
+ color: {
|
|
|
+ type: 'linear',
|
|
|
+ colorStops: [{//内圆颜色
|
|
|
+ offset: 0, color: 'rgba(21, 172, 170, 0.32)' // 0% 处的颜色
|
|
|
+ }, {
|
|
|
+ offset: 1, color: 'rgba(21, 172, 170, 1)' // 100% 处的颜色
|
|
|
+ }],
|
|
|
+ },
|
|
|
+ width: 2,
|
|
|
+ type: 'solid',
|
|
|
+ },
|
|
|
+ },
|
|
|
+ axisLabel: {
|
|
|
+ show: false
|
|
|
+ }
|
|
|
+ },
|
|
|
+ /*内心原型图,展示整体数据概览*/
|
|
|
+ {
|
|
|
+ name: 'pie',
|
|
|
+ type: 'pie',
|
|
|
+ roundCap: true,
|
|
|
+ clockWise: true,
|
|
|
+ startAngle: 260,
|
|
|
+ labelLine: {
|
|
|
+ show: false
|
|
|
+ },
|
|
|
+ radius: ['60%', '63%'],
|
|
|
+ hoverAnimation: false,
|
|
|
+ center: ['50%', '50%'],
|
|
|
+ data: [
|
|
|
+ {
|
|
|
+ value: datas.value,
|
|
|
+ label: {
|
|
|
+ normal: {
|
|
|
+ formatter: '{d}{cell|%}\n{text| ' + datas.text + '}',
|
|
|
+ // formatter: item.state+ '\n{text|' + datas.text + '}',
|
|
|
+
|
|
|
+ position: 'center',
|
|
|
+ show: true,
|
|
|
+ textStyle: {//心内文字颜色
|
|
|
+ fontSize: '20',
|
|
|
+ fontWeight: 'normal',
|
|
|
+ color: '#15acaa',
|
|
|
+ lineHeight: 14,
|
|
|
+ rich: {
|
|
|
+ cell: {
|
|
|
+ fontSize: '14',
|
|
|
+ fontWeight: 'normal',
|
|
|
+ color: '#15acaa',
|
|
|
+ padding: [0, 0, 0, 5]
|
|
|
+ },
|
|
|
+ text: {//里面文字的颜色
|
|
|
+ fontSize: 12,
|
|
|
+ fontFamily: 'FZLanTingHeiS-L-GB',
|
|
|
+ color: '#15acaa',
|
|
|
+ padding: [5, 35, 0, 10]
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ },
|
|
|
+ itemStyle: {
|
|
|
+ normal: {
|
|
|
+ color: new echarts.graphic.LinearGradient(0, 1, 1, 0, [{
|
|
|
+ offset: 0,
|
|
|
+ color: 'rgba(21, 172, 170,0.1)'
|
|
|
+ }]),
|
|
|
+ shadowColor: 'rgba(244, 67, 54,0.5)',
|
|
|
+ shadowBlur: 1
|
|
|
+ }
|
|
|
+ }
|
|
|
+ },
|
|
|
+ {
|
|
|
+ value: 100 - datas.value,
|
|
|
+ name: '',
|
|
|
+ itemStyle: {
|
|
|
+ normal: {
|
|
|
+ color: 'RGBA(5, 44, 78, 1)', // 已完成的圆环的颜色
|
|
|
+ label: {
|
|
|
+ show: false
|
|
|
+ },
|
|
|
+ labelLine: {
|
|
|
+ show: false
|
|
|
+ }
|
|
|
+ },
|
|
|
+ emphasis: {
|
|
|
+ color: 'RGBA(21, 172, 170, 1)' // 未完成的圆环的颜色
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }]
|
|
|
+ }
|
|
|
+ ]
|
|
|
+ };
|
|
|
+ if(index==0)chartLeft.setOption(option)
|
|
|
+ if(index==1)chartRight.setOption(option)
|
|
|
+ })
|
|
|
+
|
|
|
+
|
|
|
+};
|
|
|
+// 生命周期
|
|
|
+onMounted(() => {
|
|
|
+ initAccess()
|
|
|
+});
|
|
|
+// 窗口自适应
|
|
|
+window.addEventListener('resize', () => {
|
|
|
+ chartLeft?.resize();
|
|
|
+ chartRight?.resize();
|
|
|
+});
|
|
|
</script>
|
|
|
<style lang="scss" scoped>
|
|
|
._running {
|
|
|
display: flex;
|
|
|
- align-items: center;
|
|
|
flex-direction: column;
|
|
|
&_mains {
|
|
|
flex: 1;
|
|
|
- margin: 30px;
|
|
|
display: flex;
|
|
|
- align-items: center;
|
|
|
&_left {
|
|
|
width: 150px;
|
|
|
height: 150px;
|
|
@@ -105,10 +257,13 @@ const runningList = ref([
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
-
|
|
|
-
|
|
|
}
|
|
|
}
|
|
|
+.flex_person {
|
|
|
+ flex: 1;
|
|
|
+ width: 100%;
|
|
|
+ height: 100%;
|
|
|
+}
|
|
|
@keyframes scanning {
|
|
|
to {
|
|
|
transform: rotate(1turn);
|