You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 

366 lines
8.5 KiB

<template>
<section class="left-wrapper" ref="leftWrapperRef">
<TitleBox>
<Charts :options="row1Options" ref="row1Chart" />
</TitleBox>
<TitleBox title="各大队企业数量" isRight>
<Charts :options="row2Options" ref="row2Chart" />
</TitleBox>
<TitleBox title="各大队任务进度" isRight>
<Charts :options="row3Options" ref="row3Chart" />
</TitleBox>
</section>
</template>
<script setup lang="ts">
import TitleBox from './titleBox.vue'
import { ScreenApi } from '@/api/screen'
const leftWrapperRef = ref()
let observer: Nullable<ResizeObserver> = null
const row1Options = ref({
grid: {
top: 40,
bottom: 0,
left: 10,
right: 10,
containLabel: true
},
xAxis: {
type: 'category',
data: ['一大队', '二大队', '三大队', '四大队', '五大队'],
axisTick: {
show: false
},
splitLine: {
show: false
},
axisLine: {
lineStyle: {
color: 'rgba(255, 255, 255, 0.20)'
}
},
axisLabel: {
color: '#fff',
fontSize: 12
}
},
yAxis: {
type: 'value',
axisTick: {
show: false,
lineStyle: {
color: '#fff'
}
},
axisLabel: {
show: false
},
splitLine: {
show: true,
lineStyle: {
color: 'rgba(255,255,255,0.2)'
}
}
},
series: [
{
type: 'bar',
data: [100, 10],
barWidth: 5,
itemStyle: {
color: {
type: 'linear',
x: 0,
y: 1,
x2: 0,
y2: 0,
colorStops: [
{
offset: 0,
color: 'rgba(50, 215, 75, 0)'
},
{
offset: 1,
color: 'rgba(50, 215, 75, 0.4)'
}
]
}
}
},
{
name: '主要任务类型占比',
type: 'scatter',
data: [100, 90, 10, 90, 90, 20, 56, 89],
symbol:
'image://data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACQAAAAkCAYAAADhAJiYAAAACXBIWXMAABYlAAAWJQFJUiTwAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAASOSURBVHgBzVhBbBNHFP0z610Ht4SkIieSxrRSpZJIlEOpzKElUlult1SFtjcKSs9FIucW7iCFM2mhtxSomlur5hDSQ61yaQ5JD0hVHBxOICVxkIN3vTP8N95dDMTJrOJEPMmenfXszvOfP///N4JSYqRI+aygESXpqCA6ybe6og+wqolKQpvPbE3T1FSBSpQCwnbg6bv0DTdnIhLWYIJzFNLVWwW6YTN+W0KninRSOnSdL/PRI5WQ5B+h8Io+7V/Y8LrvV9x8Bb90BqXOff7Km55YP5JR/glJapgpdUbMSlrRpe2ItSQ08i91eT79wCPOR0PLAWUnVrP9v8QEbNBX/etLTz+5QFr3RcTGfY8uTR2jVWtCX7OfhA79xj++B4somb28mPtognaAw9WZUamCMWMxtpavaGgz/xKbkVEOzZBZIlGuuL1fPMweWaY24KC/0HcgeHDbWKsFKdncwTIlZISYbycZ4JE3UF5zD53SJBbYFHmXVwFztiRkfCa2TKb3XDvJNJOqeIfO8R8uwyWiORMkS4ZtzZ3r8Bm2zMe7QaYZZvn8B9PwKRXS0O0C3cF92cTMMIUD7zYZAJZS0r1sSEgTVighFAW9PJZqp7spDRZzQxNYOvjT6aLh0CDE1vkOrU8dV2iPEehswwAOnTFcom2+yEzX/n/t03dtX4So/EZQGhWqzhE5PIF7vHvmA+qYKL/+4c007+mp3bsLX/JDOiw1J0r8gHRg+xI4ZI9/b9pRtbGYjPl3pAc92hh/+/Gf//TU/uu1eReifjx3hrlIJRrJMtRekSyRBLeW0H2dwfKv+PdkAeRFtIIrCCkE9aMTZPYv2DyM3LQ1mWekumulb8kCgZObN4S4koBT59GpOt1lm4dd9cRqEsAR9YLNuKpz0MzNpUoXCJnQbZvB2U8GyBJCP/OvrRDPLSJCrxRAyNQltg6ohfibLKFIWvllPDcv2ark2ncNnVy4YuGo2I0Z691Yp+w1m3G58JGZm5esJJnVHXTc+rqVb6xk37pmwv22EGXbAOmqqpmbS9wlWGgOHYd8qx0BB0RNszWpRmFHlshwtDeE2DggNGUICTVs60fI1JxmPvDlvvOm2IrA10XO4FceZt/5JE3FIKk+jLbOXEw9xNl+BkGpLju+X9rDbA8YEaA2xvly7uZxOhZv+5/xlVE166DXLhhFwtCs3dAaQreOG61UQrjvr86O0h7BzBUV/LFeSwIjl5Fn0WZ07YJtpt4JUDHwiozhGgIyvp8QQk3LXn6VGR9Apt5NUokc4hoIczar2edSR+DSRYIWR/lQX/5pN0hFZH6MlyqakzYlBHkrQ/qc4E9aD7bbUk1CcTARii9I6peS6yQrSSY1RJGTs6Wm2+HoeIeRPWwZnIhYS+kYUJRuQBdjAYDoCxGQtl7uqi195YraaFzUwWewTKkOG5oRCchI0ZpHKqHI/I4kiyoThV3zcQyStKvWBxzlFxxSnzUfx7D+Ojv5fiN3tkKqAysejKOZo5QOsxz0brTtwOpFQDYZpcLigNs830JNnhzpoZxBkkTSRp6cTHmk9xRXBRnSHOR+CgAAAABJRU5ErkJggg==',
symbolSize: 15
}
],
legend: {
top: 0,
left: 'center',
show: true,
itemWidth: 15,
itemHeight: 15,
textStyle: {
color: '#fff'
}
}
})
const row2Options = ref({
color: [
'rgba(4, 180, 64, 1)',
'rgba(4, 180, 64, .8)',
'rgba(4, 180, 64, .6)',
'rgba(4, 180, 64, .4)',
'rgba(4, 180, 64, .2)'
],
title: {
text: '500',
subtext: '入驻企业',
left: '49%',
top: '35%',
textAlign: 'center',
textStyle: {
color: '#fff',
fontSize: 26,
fontWeight: 'normal'
},
subtextStyle: {
color: '#fff',
fontSize: 14,
fontWeight: 'normal'
}
},
series: [
{
type: 'pie',
itemStyle: {
},
radius: ['55%', '75%'],
center: ['50%', '50%'],
label: {
show: true,
position: 'outside',
formatter: '{b} : {c}',
color: '#fff'
},
data: [
{
value: 335,
name: '一大队'
},
{
value: 310,
name: '二大队'
},
{
value: 234,
name: '三大队'
},
{
value: 135,
name: '四大队'
},
{
value: 1548,
name: '五大队'
}
]
}
]
})
const row3Options = ref({
grid: {
top: 10,
bottom: 10,
left: 10,
right: 10,
containLabel: true
},
yAxis: [
{
type: 'category',
data: ['一大队', '二大队', '三大队', '四大队', '五大队'],
axisTick: {
show: false
},
splitLine: {
show: false
},
axisLine: {
show: false
},
axisLabel: {
color: '#fff',
fontSize: 12
}
},
{
type: 'category',
data: ['1', '2', '3', '4', '5'],
axisTick: {
show: false
},
splitLine: {
show: false
},
axisLine: {
show: false
},
axisLabel: {
color: '#fff',
fontSize: 12
}
}
],
xAxis: {
max: 110,
type: 'value',
axisTick: {
show: false
},
axisLabel: {
show: false
},
splitLine: {
show: false
}
},
tooltip: {
show: true,
trigger: 'item',
backgroundColor: 'rgba(25, 119, 43,1)',
axisPointer: {
type: 'shadow'
},
textStyle: {
color: '#fff'
}
},
series: [
{
type: 'bar',
data: [110, 110, 110, 110, 110],
barWidth: 15,
itemStyle: {
color: 'rgba(255, 255, 255, 0.05)',
borderRadius: [5, 5, 5, 5]
},
xAxisIndex: 0,
yAxisIndex: 1,
tooltip: {
show: false
}
},
{
xAxisIndex: 0,
type: 'bar',
yAxisIndex: 0,
data: [90, 80, 50, 20, 10],
barWidth: 15,
itemStyle: {
color: {
type: 'linear',
x: 0,
y: 0,
x2: 1,
y2: 0,
colorStops: [
{
offset: 0,
color: 'rgba(86, 202, 0, 0.00)'
},
{
offset: 1,
color: 'rgba(86, 202, 0, 0.50)'
}
]
},
borderRadius: [5, 0, 0, 5]
}
},
{
type: 'pictorialBar',
yAxisIndex: 0,
symbolPosition: 'end',
symbolSize: [10, 15],
symbolOffset: [5, 0],
itemStyle: {
shadowColor: 'rgba(0, 0, 0, .3)',
shadowBlur: 5,
shadowOffsetY: 3,
shadowOffsetX: 0,
color: 'rgba(86, 202, 0, 1)'
},
data: [90, 80, 50, 20, 10]
}
]
})
const row1Chart = ref()
const row2Chart = ref()
const row3Chart = ref()
const initChart = () => {}
const handlerResize = () => {
unref(row1Chart).resizeHandler()
unref(row2Chart).resizeHandler()
unref(row3Chart).resizeHandler()
}
const queryParams:any = ref();
//左一数据
const leftFirst = async() => {
const data:any = await ScreenApi.getLeftFirst(queryParams.value);
row1Options.value.xAxis.data = data.map(i=>i.name)
row1Options.value.series[0].data = data.map(i=>i.value)
}
//左二数据
const leftSecond = async() => {
const data = await ScreenApi.getLeftSecond(queryParams.value);
row2Options.value.title.text = data.enterpriseCount
row2Options.value.series[0].data = data.enterpriseCountGroup
}
//左三数据
const leftThird = async() => {
const data = await ScreenApi.getLeftThird(queryParams.value);
row3Options.value.yAxis[0].data = data.map(i=>i.name)
row3Options.value.yAxis[1].data = data.map(i=>i.finishCount)
}
onMounted(() => {
leftFirst()
leftSecond()
leftThird()
initChart()
observer = new ResizeObserver(handlerResize)
observer.observe(leftWrapperRef.value)
handlerResize()
})
onUnmounted(() => {
observer?.disconnect()
})
</script>
<style scoped lang="scss">
.left-wrapper {
width: 100%;
height: 100%;
display: grid;
grid-template-rows: 1fr 1fr 1fr;
grid-template-columns: 1fr;
grid-gap: 20px;
}
</style>