<template>
|
<div class="main_app1" v-if="info">
|
<div class="main_head">
|
<div class="main_head_title">
|
<span>入园人员统计总览</span>
|
<el-radio-group v-model="isGroupBy" @change="getData(), getRataLists(), getReportLists()">
|
<el-radio-button :label="0">按人次统计</el-radio-button>
|
<el-radio-button :label="1">按人员统计</el-radio-button>
|
</el-radio-group>
|
</div>
|
<div class="main_head_bottom">
|
<div class="main_head_item blue">
|
<span>{{info.todayTotal}}</span>
|
<span>今日</span>
|
</div>
|
<div class="main_head_item red">
|
<span>{{info.yesterdayTotal}}</span>
|
<span>昨日</span>
|
</div>
|
<div class="main_head_item yellow">
|
<span>{{info.weekTotal}}</span>
|
<span>本周</span>
|
</div>
|
<div class="main_head_item orange">
|
<span>{{info.monthTotal}}</span>
|
<span>本月</span>
|
</div>
|
<div class="main_head_item darkBlue">
|
<span>{{info.yearTotal}}</span>
|
<span>本年</span>
|
</div>
|
</div>
|
</div>
|
<div class="main_content">
|
<div class="type_wrap">
|
<div class="title">全年入园人员趋势</div>
|
<div class="echart1" ref="typeRef" v-show="info.cumulativeDataList"></div>
|
<div style="width: 100%;height: 100%;display: flex;align-items: center;justify-content: center;" v-show="!info.cumulativeDataList">
|
<img style="width: 200px;" src="@/assets/images/default_homeimg.png" alt="">
|
</div>
|
</div>
|
<div class="dept_wrap">
|
<div class="title">
|
<span>人员分类统计</span>
|
<el-radio-group style="margin-left: 43px;" v-model="dateType" @change="changeDateType">
|
<el-radio-button label="month">月度</el-radio-button>
|
<el-radio-button label="year">年度</el-radio-button>
|
</el-radio-group>
|
<el-date-picker
|
v-model="value"
|
:type="dateType"
|
:clearable="false"
|
@change="getRataLists()"
|
:value-format="dateType === 'month' ? 'yyyy-MM' : 'yyyy'"
|
style="margin-left: 10px; width: 130px;"
|
placeholder="请选择">
|
</el-date-picker>
|
</div>
|
<div id="echart2" v-show="listZB.length > 0"></div>
|
<div style="width: 100%;height: 100%;display: flex;align-items: center;justify-content: center;" v-show="listZB.length === 0">
|
<img style="width: 200px;" src="@/assets/images/default_homeimg.png" alt="">
|
</div>
|
</div>
|
</div>
|
<div class="main_table">
|
<div class="main_table_list">
|
<div class="title" style="display: flex; align-items: center; justify-content: space-between;">
|
<div style="display: flex; align-items: center;">
|
<span>入园人员统计表</span>
|
<el-radio-group style="margin-left: 43px;" v-model="radio" @change="changeBB">
|
<el-radio-button label="month">月度</el-radio-button>
|
<el-radio-button label="year">年度</el-radio-button>
|
</el-radio-group>
|
<el-date-picker
|
v-model="date1"
|
:type="radio"
|
:clearable="false"
|
@change="getReportLists()"
|
:value-format="radio === 'month' ? 'yyyy-MM' : 'yyyy'"
|
style="margin-left: 10px; width: 130px;"
|
placeholder="请选择">
|
</el-date-picker>
|
</div>
|
<el-button type="primary" icon="el-icon-upload2" style="margin-left: 20px;" @click="daochu">导出</el-button>
|
</div>
|
<template v-if="column.length > 0">
|
<el-table
|
style="width: 100%; margin-top: 15px;"
|
:data="list"
|
header-row-style="background-color: #F7F7F7;"
|
border
|
>
|
<el-table-column :prop="item" :label="item" align="center" :fixed="index === 0 ? true : index === column.length - 1 ? 'right' : false" v-for="(item, index) in column" :key="index"></el-table-column>
|
</el-table>
|
</template>
|
<div class="list_wu" v-else>暂无数据</div>
|
</div>
|
<div class="main_table_list1">
|
<div class="title">
|
<span>本年人员累计入园统计</span>
|
</div>
|
<el-table
|
style="width: 100%; margin-top: 15px;"
|
:data="info.yearSortList"
|
header-row-style="background-color: #F7F7F7;"
|
border
|
>
|
<el-table-column prop="name" label="人员分类" align="center"></el-table-column>
|
<el-table-column prop="total" label="入园次数" align="center"></el-table-column>
|
</el-table>
|
</div>
|
</div>
|
</div>
|
</template>
|
|
<script>
|
import * as echarts from 'echarts'
|
import { getInParkUserData, getRataList, getReportList, reportExportExcel } from '@/api/business'
|
export default {
|
data() {
|
return {
|
info: null,
|
isGroupBy: 0,
|
radio: 'month',
|
value: '',
|
dateType: 'month',
|
date: '',
|
date1: '',
|
|
listZB: [],
|
column: [],
|
list: []
|
}
|
},
|
mounted() {
|
var now = new Date();
|
var year = now.getFullYear();
|
var month = now.getMonth() + 1 > 9 ? now.getMonth() + 1 : `0${now.getMonth() + 1}`;
|
this.value = `${year}-${month}`
|
this.date1 = `${year}-${month}`
|
|
this.getData()
|
this.getRataLists()
|
this.getReportLists()
|
},
|
methods: {
|
// 导出
|
daochu() {
|
reportExportExcel({ dateStr: this.date1, isGroupBy: this.isGroupBy, type: 1 }).then(res => {
|
this.download(res)
|
})
|
},
|
changeBB() {
|
if (this.radio === 'month') {
|
let now = new Date();
|
let year = now.getFullYear();
|
let month = now.getMonth() + 1 > 9 ? now.getMonth() + 1 : `0${now.getMonth() + 1}`;
|
this.date1 = `${year}-${month}`
|
} else {
|
let now = new Date();
|
let year = now.getFullYear();
|
this.date1 = `${year}`
|
}
|
this.getReportLists()
|
},
|
// 入园车辆统计表
|
getReportLists() {
|
getReportList({ dateStr: this.date1, isGroupBy: this.isGroupBy, type: 1 })
|
.then(res => {
|
|
this.column = res[0]
|
|
this.list = res.slice(1).map(row => {
|
const obj = {};
|
this.column.forEach((header, index) => {
|
obj[header] = row[index];
|
});
|
return obj;
|
});
|
|
// if (res.length === 0) {
|
// this.column = []
|
// this.list = []
|
// return
|
// }
|
//
|
// this.column = res[0]
|
// this.list = res.slice(1, res.length);
|
})
|
},
|
changeDateType() {
|
if (this.dateType === 'month') {
|
let now = new Date();
|
let year = now.getFullYear();
|
let month = now.getMonth() + 1 > 9 ? now.getMonth() + 1 : `0${now.getMonth() + 1}`;
|
this.value = `${year}-${month}`
|
} else {
|
let now = new Date();
|
let year = now.getFullYear();
|
this.value = `${year}`
|
}
|
this.getRataLists()
|
},
|
// 车辆分类统计
|
getRataLists() {
|
getRataList({ dateStr: this.value, isGroupBy: this.isGroupBy, type: 1 })
|
.then(res => {
|
this.listZB = res
|
// this.$nextTick(() => {
|
// this.initDept()
|
// })
|
setTimeout(() => {
|
this.initDept()
|
}, 1000)
|
})
|
},
|
// 基础数据
|
getData() {
|
getInParkUserData({ isGroupBy: this.isGroupBy, type: 1 }).then(res => {
|
this.info = res
|
// this.$nextTick(() => {
|
// this.initType()
|
// })
|
setTimeout(() => {
|
this.initType()
|
}, 1000)
|
})
|
},
|
// 全年入园车辆趋势
|
initType() {
|
if (!this.info.cumulativeDataList) return
|
|
const myChart = echarts.init(document.querySelector('.echart1'))
|
|
let names = this.info.cumulativeDataList.map(item => item.name)
|
let datas = this.info.cumulativeDataList.map(item => item.total)
|
|
let option = {
|
grid: {
|
left: '0%',
|
right: '5%',
|
bottom: '10%',
|
top: '10%',
|
containLabel: true
|
},
|
tooltip: {
|
trigger: 'axis',
|
axisPointer: {
|
type: 'line'
|
}
|
},
|
xAxis: {
|
type: 'category',
|
data: names
|
},
|
yAxis: {
|
type: 'value',
|
axisLine: {
|
show: true
|
},
|
axisLabel: {
|
formatter: function (value) {
|
// 四舍五入到最近的整数
|
return Math.round(value);
|
}
|
}
|
},
|
graphic: {
|
elements: [
|
{
|
type: 'text',
|
left: 'left',
|
top: 'top',
|
style: {
|
text: '人员数',
|
textAlign: 'center',
|
fill: '#333'
|
}
|
}
|
]
|
},
|
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()
|
})
|
},
|
// 车辆分类统计
|
initDept() {
|
if (!this.listZB) return
|
|
const dom = document.getElementById('echart2')
|
console.log(dom)
|
const myChart = echarts.init(dom)
|
|
let data = this.listZB.map(item => {
|
return {
|
value: item.total,
|
name: item.name
|
}
|
})
|
|
let option = {
|
tooltip: {
|
trigger: 'item',
|
},
|
legend: {
|
show: false,
|
orient: 'vertical',
|
left: 'left'
|
},
|
series : [
|
{
|
name: '访问来源',
|
type: 'pie',
|
radius: ['34%', '50%'],
|
labelLine: {
|
normal: {
|
length: 30,
|
length2: 70,
|
}
|
},
|
label: {
|
formatter: "{a|{b}} {d}%",
|
rich: {
|
a: {
|
color: '#333333',
|
fontSize: 14,
|
fontWeight: 500
|
}
|
},
|
padding: [0,-50,20,-100]
|
},
|
data: data
|
}
|
]
|
}
|
myChart.setOption(option)
|
window.addEventListener('resize', function () { // 执行
|
myChart.resize()
|
})
|
},
|
initDept3() {
|
const myChart = echarts.init(document.querySelector('#echart3'))
|
|
let option = {
|
grid: {
|
left: '5%',
|
right: '10%',
|
bottom: '0%',
|
top: '20%',
|
containLabel: true
|
},
|
xAxis: {
|
type: 'category',
|
data: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun']
|
},
|
yAxis: {
|
type: 'value'
|
},
|
series: [
|
{
|
data: [150, 230, 224, 218, 135, 147, 260],
|
type: 'line'
|
}
|
]
|
}
|
myChart.setOption(option)
|
window.addEventListener('resize', function () { // 执行
|
myChart.resize()
|
})
|
}
|
}
|
}
|
</script>
|
|
<style lang="scss" scoped>
|
.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;
|
flex-direction: column;
|
margin-bottom: 10px;
|
background-color: #ffffff;
|
padding: 20px;
|
box-sizing: border-box;
|
.main_head_title {
|
width: 100%;
|
display: flex;
|
align-items: center;
|
margin-bottom: 20px;
|
span {
|
font-weight: 500;
|
font-size: 18px;
|
color: #222222;
|
margin-right: 30px;
|
}
|
}
|
.main_head_bottom {
|
width: 100%;
|
display: flex;
|
align-items: center;
|
justify-content: space-between;
|
.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-color: #F4F7FC;
|
span {
|
&:nth-child(1) {
|
font-weight: 600;
|
font-size: 30px;
|
color: #222222;
|
}
|
&:nth-child(2) {
|
font-weight: 400;
|
font-size: 14px;
|
color: #222222;
|
}
|
}
|
}
|
}
|
}
|
|
.main_table {
|
display: flex;
|
align-items: start;
|
justify-content: space-between;
|
margin-top: 10px;
|
.main_table_list {
|
background-color: #ffffff;
|
padding: 20px;
|
box-sizing: border-box;
|
width: 69%;
|
.title {
|
display: flex;
|
align-items: center;
|
span {
|
font-weight: 500;
|
font-size: 18px;
|
color: #222222;
|
}
|
}
|
.list_wu {
|
width: 100%;
|
height: 100px;
|
line-height: 100px;
|
text-align: center;
|
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;
|
font-weight: 500;
|
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;
|
border-right: 1px solid #DFE2E8;
|
align-items: center;
|
justify-content: center;
|
font-size: 13px;
|
color: #222222;
|
}
|
}
|
}
|
}
|
.main_table_list1 {
|
margin-left: 10px;
|
width: 30%;
|
padding: 20px;
|
box-sizing: border-box;
|
flex-shrink: 0;
|
background-color: #ffffff;
|
.title {
|
font-weight: 500;
|
font-size: 18px;
|
color: #222222;
|
}
|
.list_wu {
|
width: 100%;
|
height: 100px;
|
line-height: 100px;
|
text-align: center;
|
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.8;
|
height: 100%;
|
display: flex;
|
align-items: center;
|
justify-content: center;
|
font-size: 13px;
|
color: #222222;
|
font-weight: 500;
|
border-right: 1px solid #DFE2E8;
|
&:last-child {
|
flex: 1;
|
}
|
}
|
}
|
.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.8;
|
height: 100%;
|
display: flex;
|
align-items: center;
|
border-right: 1px solid #DFE2E8;
|
justify-content: center;
|
text-align: center;
|
font-size: 13px;
|
color: #222222;
|
&:last-child {
|
flex: 1;
|
}
|
}
|
}
|
}
|
}
|
}
|
|
.main_content {
|
display: flex;
|
align-items: center;
|
justify-content: space-between;
|
height: 350px;
|
|
.title {
|
font-weight: 500;
|
font-size: 18px;
|
color: #222222;
|
}
|
|
.type_wrap {
|
flex: 1;
|
height: 100%;
|
background-color: #ffffff;
|
padding: 20px;
|
box-sizing: border-box;
|
/*border-right: 12px solid #f7f7f7;*/
|
|
|
.echart1 {
|
width: 100%;
|
height: 100%;
|
margin-top: 18px;
|
}
|
}
|
|
.dept_wrap {
|
width: 520px;
|
flex-shrink: 0;
|
height: 100%;
|
background-color: #ffffff;
|
padding: 20px;
|
box-sizing: border-box;
|
margin-left: 10px;
|
#echart2 {
|
width: 100%;
|
height: 100%;
|
}
|
}
|
}
|
}
|
</style>
|