zn-admin-vue3-wcs/src/views/statisticalView/index.vue
2025-02-22 17:06:16 +08:00

460 lines
10 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<template>
<ContentWrap>
<div class="top-box">
<div class="top-box-left"> 统计视图 </div>
<div class="top-box-right">
<div class="top-box-right-title"> 统计方式 </div>
<el-select v-model="type" placeholder="请选择" style="width: 100px; margin-left: 10px">
<el-option :label="'天'" :value="1" />
<el-option :label="'周'" :value="2" />
<el-option :label="'月'" :value="3" />
</el-select>
<el-button style="margin-left: 16px">看板管理</el-button>
</div>
</div>
</ContentWrap>
<div class="">
<el-row :gutter="16">
<el-col :span="12">
<el-card style="width: 100%">
<div class="charts-title"> 任务总览 </div>
<div ref="chartDom" style="width: 100%; height: 400px"></div>
</el-card>
</el-col>
<el-col :span="12">
<el-card style="width: 100%">
<div class="charts-title"> 任务完成率 </div>
<div ref="chartDomFinish" style="width: 100%; height: 400px"></div>
</el-card>
</el-col>
</el-row>
<el-row :gutter="16" style="margin-top: 12px">
<el-col :span="12">
<el-card style="width: 100%">
<div class="charts-title"> AGV工作利用率统计 </div>
<div ref="chartDomAgv" style="width: 100%; height: 400px"></div>
</el-card>
</el-col>
<el-col :span="12">
<el-card style="width: 100%">
<div class="charts-title"> 任务异常数 </div>
<div ref="chartDomError" style="width: 100%; height: 400px"></div>
</el-card>
</el-col>
</el-row>
</div>
</template>
<script setup>
import { ref, onMounted, onUnmounted, nextTick, reactive } from 'vue'
import * as echarts from 'echarts'
// 创建一个响应式引用来保存DOM元素
const chartDom = ref(null)
const chartDomFinish = ref(null)
const chartDomError = ref(null)
const chartDomAgv = ref(null)
// 初始化ECharts实例并设置配置项这里以折线图为例但可灵活替换
onMounted(async () => {
await nextTick() // 确保DOM已经渲染完成
initEcharts()
})
const initEcharts = () => {
initOne()
initTwo()
initFour()
}
const chartInstance = ref(null)
const initOne = () => {
chartInstance.value = echarts.init(chartDom.value)
let ydata = [
{
name: '执行中',
value: 18
},
{
name: '已完成',
value: 16
},
{
name: '已取消',
value: 15
},
{
name: '未开始',
value: 14
},
{
name: '异常',
value: 10
}
]
let color = ['#0147EB', '#01BCEB', '#C800FF', '#F1CD0B', '#EB0000']
let xdata = ['执行中', '已完成', '已取消', '未开始', '异常']
const option = {
backgroundColor: 'rgba(255,255,255,1)',
color: color,
// tooltip: {
// trigger: 'item',
// // formatter: '{a} <br/>{b} : {c} ({d}%)'
// },
legend: {
orient: 'vartical',
x: 'left',
top: 'center',
left: '60%',
bottom: '0%',
data: xdata,
itemWidth: 10,
itemHeight: 10,
itemGap: 16,
formatter: function (name) {
let str = ''
ydata.forEach((item) => {
if (item.name == name) {
str = `{c|${item.name}} {a|${item.value}}`
}
})
return str
},
textStyle: {
rich: {
a: {
color: '#0D162A',
fontSize: 18
},
c: {
color: '#536387',
fontSize: 12
}
}
}
},
series: [
{
type: 'pie',
clockwise: false, //饼图的扇区是否是顺时针排布
minAngle: 2, //最小的扇区角度0 ~ 360
radius: ['50%', '65%'],
center: ['30%', '50%'],
avoidLabelOverlap: false,
itemStyle: {
//图形样式
normal: {
borderColor: '#ffffff',
borderWidth: 6
}
},
label: {
// '{text|{b}}\n{c} ({d}%)'
normal: {
show: true,
position: 'center',
formatter: '{c|234,12} \n {a|任务总数}',
rich: {
c: {
color: '#0D162A',
fontSize: 15,
fontWeight: 'bold',
height: 30
},
a: {
align: 'center',
color: '#727272',
fontSize: 12
}
}
}
},
labelLine: {
length: 15,
length2: 0,
maxSurfaceAngle: 80
},
data: ydata
}
]
}
chartInstance.value.setOption(option)
}
const chartInstanceTwo = ref(null)
const initTwo = () => {
chartInstanceTwo.value = echarts.init(chartDomFinish.value)
let option = {
backgroundColor: '#fff',
grid: {
top: '9%',
bottom: '19%',
left: '6%',
right: '4%'
},
tooltip: {
trigger: 'axis',
label: {
show: true
}
},
xAxis: {
boundaryGap: true, //默认,坐标轴留白策略
axisLine: {
show: false
},
splitLine: {
show: false
},
axisTick: {
show: false,
alignWithLabel: true
},
data: [
'武汉',
'襄阳',
'黄冈',
'荆门',
'十堰',
'随州',
'鄂州',
'恩施',
'宜昌',
'孝感',
'咸宁',
'仙桃',
'潜江',
'天门',
'黄石',
'荆州',
'神农架'
]
},
yAxis: {
axisLine: {
show: false
},
splitLine: {
show: true,
lineStyle: {
type: 'solid',
color: '#E2E7F5'
}
},
axisTick: {
show: false
},
splitArea: {
show: true,
areaStyle: {
color: 'rgb(245,250,254)'
}
}
},
series: [
{
type: 'line',
symbol: 'circle',
symbolSize: 1,
lineStyle: {
color: '#0147EB'
},
label: {
show: false,
distance: 1,
emphasis: {
show: true,
offset: [25, -2],
backgroundColor: 'rgba(0,0,0,0.7)',
color: '#FFF',
padding: [8, 20, 8, 6],
//width:60,
height: 36,
formatter: function (params) {
var name = params.name
var value = params.data
var str = name + '\n数据量' + value
return str
},
rich: {
bg: {
width: 78,
//height:42,
color: '#FFF',
padding: [20, 0, 20, 10]
},
br: {
width: '100%',
height: '100%'
}
}
}
},
data: [
2000, 1800, 2800, 900, 1600, 2000, 3000, 2030, 1356, 1900, 4000, 3000, 2000, 3000, 4200,
3200, 3800
]
}
]
}
chartInstanceTwo.value.setOption(option)
}
const chartInstanceFour = ref(null)
const initFour = () => {
chartInstanceFour.value = echarts.init(chartDomError.value)
let option = {
backgroundColor: '#fff',
grid: {
top: '9%',
bottom: '19%',
left: '6%',
right: '4%'
},
tooltip: {
trigger: 'axis',
label: {
show: true
}
},
xAxis: {
boundaryGap: true, //默认,坐标轴留白策略
axisLine: {
show: false
},
splitLine: {
show: false
},
axisTick: {
show: false,
alignWithLabel: true
},
data: [
'武汉',
'襄阳',
'黄冈',
'荆门',
'十堰',
'随州',
'鄂州',
'恩施',
'宜昌',
'孝感',
'咸宁',
'仙桃',
'潜江',
'天门',
'黄石',
'荆州',
'神农架'
]
},
yAxis: {
axisLine: {
show: false
},
splitLine: {
show: true,
lineStyle: {
type: 'solid',
color: '#E2E7F5'
}
},
axisTick: {
show: false
},
splitArea: {
show: true,
areaStyle: {
color: 'rgb(245,250,254)'
}
}
},
series: [
{
type: 'line',
symbol: 'circle',
symbolSize: 1,
lineStyle: {
color: '#0147EB'
},
label: {
show: false,
distance: 1,
emphasis: {
show: true,
offset: [25, -2],
backgroundColor: 'rgba(0,0,0,0.7)',
color: '#FFF',
padding: [8, 20, 8, 6],
//width:60,
height: 36,
formatter: function (params) {
var name = params.name
var value = params.data
var str = name + '\n数据量' + value
return str
},
rich: {
bg: {
width: 78,
//height:42,
color: '#FFF',
padding: [20, 0, 20, 10]
},
br: {
width: '100%',
height: '100%'
}
}
}
},
data: [
2000, 1800, 2800, 900, 1600, 2000, 3000, 2030, 1356, 1900, 4000, 3000, 2000, 3000, 4200,
3200, 3800
]
}
]
}
chartInstanceFour.value.setOption(option)
}
// 销毁ECharts实例
onUnmounted(() => {
if (chartInstance.value != null && chartInstance.value.dispose) {
chartInstance.value.dispose()
}
})
const type = ref(1)
</script>
<style lang="scss" scoped>
.top-box {
width: 100%;
display: flex;
justify-content: space-between;
align-items: center;
}
.top-box-left {
color: #0d162a;
font-size: 18px;
}
.top-box-right {
display: flex;
align-items: center;
}
.top-box-right-title {
font-family:
PingFangSC,
PingFang SC;
font-weight: 400;
font-size: 14px;
color: #0d162a;
}
</style>