<template>
|
<div class="main_app1">
|
<div class="main_head">
|
<div class="main_head_item blue">
|
<span>{{totalList.total}}</span>
|
<span>总隐患数</span>
|
</div>
|
<div class="main_head_item red">
|
<span>{{totalList.waitDeal}}</span>
|
<span>待处理</span>
|
</div>
|
<div class="main_head_item yellow">
|
<span>{{totalList.dealFinish}}</span>
|
<span>已整改</span>
|
</div>
|
<div class="main_head_item orange">
|
<span>{{totalList.back}}</span>
|
<span>已退回</span>
|
</div>
|
<div class="main_head_item darkBlue">
|
<span>{{totalList.todayNew}}</span>
|
<span>今日新增</span>
|
</div>
|
</div>
|
<!-- <QueryForm v-model="filters" :query-form-config="queryFormConfig" @handleQuery="getData(1)" @clear="clear"-->
|
<!-- @changeForm='changeForm'>-->
|
<!-- <template #fastdate>-->
|
<!-- <el-radio-group v-model="filters.fastdate" size="small" @input="changeRadio">-->
|
<!-- <el-radio-button label="0">当天</el-radio-button>-->
|
<!-- <el-radio-button label="6">近7天</el-radio-button>-->
|
<!-- <el-radio-button label="29">近30天</el-radio-button>-->
|
<!-- </el-radio-group>-->
|
<!-- </template>-->
|
<!-- </QueryForm>-->
|
<div class="main_content">
|
<div class="type_wrap">
|
<div class="title">隐患类型统计</div>
|
<div v-show="typeList && typeList.length > 0" class="echart1" ref="typeRef"></div>
|
<div v-show="typeList.length == 0" style="width: 100%;height: 100%;display: flex;align-items: center;justify-content: center;">
|
<img style="width: 240px;" src="@/assets/images/default_homeimg.png" alt="">
|
</div>
|
|
</div>
|
<div class="dept_wrap">
|
<div class="title">隐患归属部门统计</div>
|
<div v-show="deptList && deptList.length > 0" class="echart2" ref="deptRef"></div>
|
<div v-show="deptList.length == 0" style="width: 100%;height: 100%;display: flex;align-items: center;justify-content: center;">
|
<img style="width: 240px;" src="@/assets/images/default_homeimg.png" alt="">
|
</div>
|
</div>
|
</div>
|
<div class="main_table">
|
<div class="main_table_echart">
|
<div class="title">本年隐患趋势</div>
|
<div id="echart3" v-show="yearList.length > 0"></div>
|
<div style="width: 100%;height: 100%;display: flex;align-items: center;justify-content: center;" v-show="yearList.length === 0">
|
<img style="width: 240px;" src="@/assets/images/default_homeimg.png" alt="">
|
</div>
|
</div>
|
<div class="main_table_list">
|
<div class="title">本月频繁发生隐患区域Top10</div>
|
<div class="list_head">
|
<div class="list_head_item">责任部门</div>
|
<div class="list_head_item">隐患区域</div>
|
<div class="list_head_item">隐患数量</div>
|
</div>
|
<div class="table_box">
|
<div class="list_content" v-for="(item, index) in departmentList" :key="index">
|
<div class="list_head_item">{{item.name}}</div>
|
<div class="list_head_item">{{item.categoryName}}</div>
|
<div class="list_head_item">{{item.total}}</div>
|
</div>
|
</div>
|
</div>
|
</div>
|
</div>
|
</template>
|
|
<script>
|
import QueryForm from '@/components/common/QueryForm'
|
import * as echarts from 'echarts'
|
import { hiddenDangerDataPost } from '@/api/business/hiddenDanger'
|
import dayjs from 'dayjs'
|
export default {
|
components: {
|
QueryForm,
|
},
|
data() {
|
return {
|
filters: {
|
fastdate: '29',
|
queryStartTime: '',
|
queryEndTime: ''
|
},
|
queryFormConfig: {
|
formItems: [
|
{
|
filed: 'status',
|
type: 'select',
|
label: '状态',
|
options: [
|
{ label: '待处理', value: '0' },
|
{ label: '已处理', value: '1' },
|
{ label: '已退回', value: '2' },
|
]
|
},
|
{
|
filed1: 'queryStartTime',
|
filed2: 'queryEndTime',
|
type: 'datetime',
|
label: '提报时间'
|
},
|
{
|
type: 'slot',
|
filed: 'fastdate',
|
label: ''
|
}
|
],
|
online: true
|
},
|
typeList: [],
|
deptList: [],
|
totalList: {
|
total: 0,
|
waitDeal: 0,
|
dealFinish: 0,
|
back: 0,
|
todayNew: 0
|
},
|
yearList: [],
|
departmentList: []
|
}
|
},
|
mounted() {
|
this.changeRadio('29')
|
this.initDept3()
|
// this.getData()
|
},
|
methods: {
|
changeRadio(day) {
|
const arr = [dayjs().subtract(day, 'day').format('YYYY-MM-DD') + ' 00:00:00', dayjs().format('YYYY-MM-DD') + ' 23:59:59']
|
this.filters.queryStartTime = arr[0]
|
this.filters.queryEndTime = arr[1]
|
this.getData()
|
},
|
getData(page) {
|
hiddenDangerDataPost({ ...this.filters }).then(res => {
|
if (res) {
|
this.totalList.total = res.total || 0
|
this.totalList.waitDeal = res.waitDeal || 0
|
this.totalList.dealFinish = res.dealFinish || 0
|
this.totalList.back = res.back || 0
|
this.totalList.todayNew = res.todayNew || 0
|
|
this.yearList = res.yearList
|
|
this.departmentList = res.departmentList.slice(0, 10)
|
|
this.typeList = res.cateList || []
|
this.deptList = res.departmentList || []
|
this.$nextTick(() => {
|
this.initType()
|
this.initDept()
|
this.initDept3()
|
})
|
|
}
|
})
|
|
},
|
changeForm(e) {
|
this.getData()
|
},
|
initType() {
|
const myChart = echarts.init(document.querySelector('.echart1'))
|
let total = 0
|
this.typeList.forEach(i => {
|
total += i.total
|
})
|
let colors = ['#d75a44', '#e39f4d', '#f0d05f', '#7ac7f6', '#4469ee', '#698af0','#86a2f1','#a1b4f6','#a0b5f5', '#9fb5f4', '#b6c7f7', '#c8d5f8']
|
let option = {
|
grid: {
|
left: '0%',
|
right: '0%',
|
bottom: '0%',
|
top: '0%',
|
containLabel: true
|
},
|
title: [
|
{
|
text: '隐患总数',
|
top: '46%',
|
left: '45%',
|
textStyle: {
|
color: '#666666',
|
fontSize: 13,
|
},
|
}, {
|
text: total,
|
top: '50%',
|
left: '47.6%',
|
textStyle: {
|
color: '#080404',
|
fontSize: 16,
|
fontWeight: 'bold',
|
},
|
}],
|
legend: {
|
left: 'center',
|
bottom: '8%',
|
itemGap: 30,
|
itemWidth: 30,
|
icon: 'circle',
|
formatter: (name) => {
|
const item = this.typeList.filter((item) => item.name === name)[0]
|
|
if (item) {
|
return ` ${name} ${item.total} | ${item.rata}%`
|
} else {
|
return ` ${name} 0 | 0%`
|
}
|
}
|
},
|
series: [
|
{
|
type: 'pie',
|
radius: ['34%', '50%'],
|
label: {
|
formatter: "{a|{b}}\n\n{c} | {d}%",
|
rich: {
|
a: {
|
color: '#333333',
|
fontSize: 14,
|
fontWeight: 500
|
}
|
}
|
},
|
labelLine: {
|
showAbove: true,
|
show: true,
|
length: 24,
|
length2: 64,
|
lineStyle: {
|
width: 2 // 线条宽度
|
}
|
},
|
data: this.typeList.map((i, index) => {
|
return {
|
value: i.total,
|
name: i.name,
|
itemStyle: {
|
color: colors[index]
|
}
|
}
|
})
|
}
|
]
|
}
|
myChart.setOption(option)
|
window.addEventListener('resize', function () { // 执行
|
myChart.resize()
|
})
|
},
|
initDept() {
|
const myChart = echarts.init(document.querySelector('.echart2'))
|
|
let option = {
|
grid: {
|
left: '10%',
|
right: '10%',
|
bottom: '10%',
|
top: '20%',
|
containLabel: true
|
},
|
xAxis: {
|
type: 'category',
|
data: this.deptList.map(i => i.name),
|
axisLabel: {
|
color: '#333333',
|
fontSize: 14,
|
fontWeight: 'bold'
|
}
|
},
|
yAxis: {
|
type: 'value',
|
name: '隐患数',
|
minInterval: 1,
|
axisLine: {
|
show: true,
|
}
|
},
|
series: [
|
{
|
data: this.deptList.map(i => i.total),
|
type: 'bar',
|
barWidth: 40,
|
itemStyle: {
|
color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
|
{ offset: 0, color: '#d75e45' }, // 渐变起始色
|
{ offset: 1, color: '#db924c' } // 渐变终止色
|
])
|
},
|
|
label: {
|
show: true, // 显示标签
|
position: 'top', // 让标签显示在柱子顶部
|
color: '#666666', // 文字颜色
|
fontSize: 14, // 文字大小
|
}
|
}
|
]
|
}
|
myChart.setOption(option)
|
window.addEventListener('resize', function () { // 执行
|
myChart.resize()
|
})
|
},
|
initDept3() {
|
if (this.yearList.length === 0) return
|
|
const myChart = echarts.init(document.querySelector('#echart3'))
|
|
let names = this.yearList.map(item => item.name)
|
let datas = this.yearList.map(item => item.total)
|
|
let option = {
|
tooltip: {
|
trigger: 'axis',
|
axisPointer: {
|
type: 'line'
|
}
|
},
|
grid: {
|
left: '5%',
|
right: '10%',
|
bottom: '0%',
|
top: '20%',
|
containLabel: true
|
},
|
xAxis: {
|
type: 'category',
|
data: names
|
},
|
yAxis: {
|
type: 'value',
|
axisLine: {
|
show: true
|
},
|
axisLabel: {
|
formatter: function (value) {
|
// 四舍五入到最近的整数
|
return Math.round(value);
|
}
|
}
|
},
|
series: [
|
{
|
data: datas,
|
type: 'line',
|
areaStyle: {
|
normal: {
|
color: {
|
x: 0,
|
y: 0,
|
x2: 0,
|
y2: 1,
|
colorStops: [{
|
offset: 0,
|
color: '#207FF7' // 0% 处的颜色
|
}, {
|
offset: 1,
|
color: 'rgba(255,255,255,.2)' // 100% 处的颜色
|
}],
|
globalCoord: false // 缺省为 false
|
}
|
}
|
},
|
lineStyle: { // 线条样式
|
color: {
|
type: 'linear',
|
x: 0,
|
y: 0,
|
x2: 0,
|
y2: 1,
|
colorStops: [{
|
offset: 0, color: '#207FF7' // 0% 处的颜色
|
}, {
|
offset: 1, color: '#207FF7' // 100% 处的颜色
|
}]
|
},
|
width: 2 // 线条粗细
|
},
|
symbol: 'circle',
|
symbolSize: 10,
|
itemStyle: {
|
borderWidth: 1,
|
borderColor: '#fff',
|
color: '#207FF7'
|
},
|
smooth: false
|
}
|
]
|
}
|
myChart.setOption(option)
|
window.addEventListener('resize', function () { // 执行
|
myChart.resize()
|
})
|
},
|
clear() {
|
this.filters = {}
|
this.getData()
|
}
|
}
|
}
|
</script>
|
|
<style lang="scss" scoped>
|
/*.main_app {
|
height: 100%;
|
}*/
|
.main_app1 {
|
width: 100%;
|
height: calc(100% - 44px);
|
overflow-y: auto;
|
overflow-x: hidden;
|
padding: 15px;
|
box-sizing: border-box;
|
background-color: #F4F7FC;
|
.main_head {
|
width: 100%;
|
display: flex;
|
align-items: center;
|
justify-content: space-between;
|
margin-bottom: 10px;
|
background-color: #ffffff;
|
padding: 20px;
|
box-sizing: border-box;
|
.blue {
|
border-left: 8px solid #12BB8B;
|
}
|
.red {
|
border-left: 8px solid #F6CF46;
|
}
|
.yellow {
|
border-left: 8px solid #5DC9FB;
|
}
|
.orange {
|
border-left: 8px solid #FF9E56;
|
}
|
.darkBlue {
|
border-left: 8px solid #6B6EFF;
|
}
|
.main_head_item {
|
width: 19%;
|
height: 112px;
|
display: flex;
|
flex-direction: column;
|
align-items: center;
|
justify-content: center;
|
box-sizing: border-box;
|
border-radius: 5px;
|
background: #F4F7FC;
|
span {
|
&:nth-child(1) {
|
font-weight: 600;
|
font-size: 30px;
|
color: #222222;
|
}
|
&:nth-child(2) {
|
font-weight: 400;
|
font-size: 14px;
|
color: #222222;
|
margin-top: 10px;
|
}
|
}
|
}
|
}
|
|
.main_table {
|
display: flex;
|
align-items: start;
|
justify-content: space-between;
|
.main_table_echart {
|
width: 64%;
|
height: 400px;
|
background-color: #ffffff;
|
padding: 20px;
|
box-sizing: border-box;
|
.title {
|
font-weight: 600;
|
font-size: 16px;
|
color: #222222;
|
}
|
#echart3 {
|
width: 100%;
|
height: calc(100% - 33px);
|
}
|
}
|
.main_table_list {
|
flex-shrink: 0;
|
width: 35%;
|
padding: 20px;
|
box-sizing: border-box;
|
background-color: #ffffff;
|
.title {
|
font-weight: 600;
|
font-size: 16px;
|
color: #222222;
|
}
|
.list_head {
|
width: 100%;
|
height: 50px;
|
display: flex;
|
align-items: center;
|
background-color: #F7F7F7;
|
border-left: 1px solid #DFE2E8;
|
border-top: 1px solid #DFE2E8;
|
margin-top: 15px;
|
.list_head_item {
|
flex: 1;
|
height: 100%;
|
display: flex;
|
align-items: center;
|
justify-content: center;
|
font-size: 13px;
|
color: #222222;
|
border-right: 1px solid #DFE2E8;
|
}
|
}
|
.table_box {
|
width: 100%;
|
border-bottom: 1px solid #DFE2E8;
|
.list_content {
|
width: 100%;
|
height: 50px;
|
display: flex;
|
align-items: center;
|
border-left: 1px solid #DFE2E8;
|
border-top: 1px solid #DFE2E8;
|
.list_head_item {
|
flex: 1;
|
height: 100%;
|
display: flex;
|
align-items: center;
|
justify-content: center;
|
font-size: 13px;
|
color: #222222;
|
border-right: 1px solid #DFE2E8;
|
}
|
}
|
}
|
}
|
}
|
|
.main_content {
|
display: flex;
|
align-items: start;
|
justify-content: space-between;
|
height: 500px;
|
margin-bottom: 10px;
|
.title {
|
font-weight: 600;
|
font-size: 16px;
|
color: #222222;
|
/*margin-bottom: 20px;*/
|
}
|
|
.type_wrap {
|
width: 49.5%;
|
flex-shrink: 0;
|
height: 100%;
|
/*border-right: 12px solid #f7f7f7;*/
|
background-color: #ffffff;
|
padding: 20px;
|
box-sizing: border-box;
|
|
.echart1 {
|
width: 100%;
|
height: 100%;
|
}
|
}
|
|
.dept_wrap {
|
width: 49.5%;
|
flex-shrink: 0;
|
height: 100%;
|
background-color: #ffffff;
|
padding: 20px;
|
box-sizing: border-box;
|
.echart2 {
|
width: 100%;
|
height: 100%;
|
}
|
}
|
}
|
}
|
|
</style>
|