<template>
|
<TableLayout>
|
<div slot="search-form" class="data">
|
<div class="item-title">数据看板</div>
|
<div class="data-summary">
|
<div class="data-item">
|
<div>今日活跃用户</div>
|
<div class="data-num">{{ countData.nowActivity }}</div>
|
</div>
|
<div class="parting"></div>
|
<div class="data-item">
|
<div>本月售前诊断/成交次数</div>
|
<div class="data-num">{{ countData.preSaleCount }}/{{ countData.dealCount }}</div>
|
</div>
|
<div class="parting"></div>
|
<div class="data-item">
|
<div>售后服务次数</div>
|
<div class="data-num">{{ countData.afterSaleCount }}</div>
|
</div>
|
<div class="parting"></div>
|
<div class="data-item">
|
<div>总门店数量</div>
|
<div class="data-num">{{ countData.shopCount }}</div>
|
</div>
|
<div class="parting"></div>
|
<div class="data-item">
|
<div>总用户数</div>
|
<div class="data-num">{{ countData.membercount }}</div>
|
</div>
|
<div class="parting"></div>
|
<div class="data-item">
|
<div>客户总数</div>
|
<div class="data-num">{{ countData.customerCount }}</div>
|
</div>
|
</div>
|
</div>
|
<template v-slot:table-wrap>
|
<div style="display: flex;">
|
<div class="change-item" style="flex: 1;">
|
<div class="change-style">
|
<div class="item-title">售前诊断次数/成交次数趋势</div>
|
<div>
|
<el-select v-model="preType" @change="initHome">
|
<el-option
|
label="近7天"
|
value="7">
|
</el-option>
|
<el-option
|
label="近30天"
|
value="30">
|
</el-option>
|
|
</el-select>
|
</div>
|
</div>
|
<div ref="orderChange" class="bottom"></div>
|
</div>
|
<div style="width: 5px;"></div>
|
<div class="change-item" style="flex:0.8">
|
<div class="change-style">
|
<div class="item-title">门店客户咨询排行榜</div>
|
<div>
|
<el-select v-model="shopType" @change="initShop">
|
<el-option
|
label="近7天"
|
value="7">
|
</el-option>
|
<el-option
|
label="近30天"
|
value="30">
|
</el-option>
|
|
</el-select>
|
</div>
|
</div>
|
<div ref="rank" class="bottom"></div>
|
</div>
|
</div>
|
|
</template>
|
|
</TableLayout>
|
</template>
|
|
<script>
|
import TableLayout from '@/layouts/TableLayout'
|
import { home, homeShop } from '@/api/business/home'
|
import * as echarts from 'echarts';
|
export default {
|
components: {
|
TableLayout,
|
},
|
data() {
|
return {
|
countData: {
|
nowActivity: 0,
|
membercount: 0,
|
afterSaleCount: 0,
|
preSaleCount: 0,
|
dealCount: 0,
|
customerCount: 0,
|
shopCount: 0,
|
preList: 0,
|
visList: [],
|
},
|
preType: '7',
|
shopType: '7',
|
preList: [],
|
myChart: null,
|
myHistogram: null,
|
}
|
},
|
|
mounted() {
|
this.myChart = echarts.init(this.$refs.orderChange)
|
this.myHistogram = echarts.init(this.$refs.rank)
|
window.addEventListener('resize', () => {
|
this.myChart.resize()
|
this.myHistogram.resize()
|
})
|
this.initHome(7)
|
this.initShop(7)
|
},
|
methods: {
|
initHome(mark) {
|
home({mark})
|
.then(res => {
|
this.countData = res
|
this.renderOrderChange()
|
})
|
},
|
initShop(mark) {
|
homeShop({mark})
|
.then(res => {
|
this.preList = res.preList
|
this.renderShopRank()
|
})
|
},
|
renderOrderChange() {
|
let dealCounts = []
|
let preCounts = []
|
let days = []
|
this.countData.visList.forEach(item => {
|
dealCounts.push(item.dealCount)
|
preCounts.push(item.preCount)
|
days.push(item.everyDay)
|
})
|
this.myChart.setOption({
|
title: {},
|
tooltip: {
|
trigger: 'axis'
|
},
|
grid: {
|
left: '3%',
|
right: '4%',
|
bottom: '3%',
|
containLabel: true
|
},
|
xAxis: {
|
type: 'category',
|
boundaryGap: false,
|
data: days
|
},
|
yAxis: {
|
type: 'value'
|
},
|
series: [
|
{
|
name: '成交次数趋势',
|
type: 'line',
|
stack: '总量',
|
data: dealCounts
|
},
|
{
|
name: '售前成交次数',
|
type: 'line',
|
stack: '总量',
|
data: preCounts
|
},
|
]
|
})
|
|
},
|
renderShopRank() {
|
let names = []
|
let preCounts = []
|
this.preList.forEach(item => {
|
names.push(item.name)
|
preCounts.push(item.preCount)
|
})
|
preCounts.reverse()
|
names.reverse()
|
this.myHistogram.setOption({
|
// title: {
|
// text: 'World Population'
|
// },
|
tooltip: {
|
trigger: 'axis',
|
axisPointer: {
|
type: 'shadow'
|
}
|
},
|
legend: {},
|
grid: {
|
left: '3%',
|
right: '4%',
|
bottom: '3%',
|
containLabel: true
|
},
|
xAxis: {
|
type: 'value',
|
boundaryGap: [0, 0.01]
|
},
|
yAxis: {
|
type: 'category',
|
data: names
|
},
|
series: [
|
{
|
// name: '2011',
|
type: 'bar',
|
data: preCounts,
|
barWidth: '50%'
|
}
|
]
|
})
|
},
|
getData() {
|
|
|
}
|
},
|
}
|
|
</script>
|
|
<style lang="scss" scoped>
|
.data {
|
padding-bottom: 10px;
|
}
|
.item-title {
|
font-weight: 500;
|
|
}
|
.data-summary {
|
display: flex;
|
justify-content: space-between;
|
margin-top: 10px;
|
.data-item {
|
flex: 1;
|
height: 80px;
|
box-shadow: 0px 2px 6px 0px rgba(0, 0, 0, 0.1) ;
|
box-sizing: border-box;
|
padding: 15px;
|
display: flex;
|
flex-direction: column;
|
justify-content: space-between;
|
.data-num {
|
font-size: 20px;
|
font-weight: 700;
|
color: #1457C7;
|
color: #216EEE;
|
}
|
}
|
.parting {
|
width: 20px;
|
}
|
}
|
.change-item {
|
|
box-sizing: border-box;
|
padding: 10px;
|
background-color: #fff;
|
}
|
.bottom {
|
// min-height: 500px;
|
height: 300px;
|
display: flex;
|
.item-box {
|
padding: 10px;
|
// border: 2px #ccc solid;
|
box-shadow: 0px 2px 6px 0px rgba(0, 0, 0, 0.1) ;
|
border-radius: 8px;
|
}
|
.calendar {
|
flex: 1;
|
margin-right: 10px;
|
.calendar-header {
|
display: flex;
|
justify-content: space-between;
|
// border-bottom: 5px rgb(232, 202, 122) solid;
|
padding: 10px 5px;
|
font-weight: 600;
|
}
|
}
|
.notice-meeting {
|
// flex: 0.3;
|
height: 150px;
|
width: 340px;
|
display: flex;
|
flex-direction: column;
|
.notice {
|
flex: 0.3;
|
margin-bottom: 10px;
|
.notice-header {
|
display: flex;
|
justify-content: space-between;
|
height: 30px;
|
line-height: 30px;
|
cursor: pointer;
|
// border-bottom: 5px rgb(232, 202, 122) solid;
|
// padding: 0 5px;
|
font-weight: 600;
|
.more {
|
font-weight: normal;
|
color: rgb(127, 127, 127);
|
}
|
}
|
.notice-item {
|
line-height: 24px;
|
font-size: 12px;
|
display: flex;
|
justify-content: space-between;
|
height: 24px;
|
}
|
}
|
.meeting {
|
flex: 0.7;
|
display: flex;
|
flex-direction: column;
|
|
// width: 100%;
|
.meeting-header {
|
display: flex;
|
justify-content: space-between;
|
padding: 10px 5px;
|
font-weight: 600;
|
line-height: 30px;
|
height: 30px;
|
.action {
|
font-weight: normal;
|
display: flex;
|
.type-sel {
|
color: rgb(84, 169, 235);
|
color: #216EEE;
|
text-decoration: underline;
|
}
|
}
|
}
|
.meeting-list {
|
// flex: 1;
|
height: 500px;
|
overflow-y: scroll;
|
}
|
.meeting-item {
|
display: flex;
|
font-size: 12px;
|
line-height: 24px;
|
.type-sel {
|
flex: 1;
|
// color: rgb(84, 169, 235);
|
color: #216EEE;
|
}
|
}
|
}
|
}
|
}
|
.change-style {
|
display: flex;
|
justify-content: space-between;
|
line-height: 31px;
|
}
|
.bottom {
|
height: 500px;
|
}
|
</style>
|
|
<style>
|
.available {
|
text-align: left;
|
}
|
.dateItem {
|
display: block;
|
/* display: flex;
|
flex-direction: column;
|
align-items: flex-start; */
|
height: 100%;
|
min-height:100px;
|
padding:5px;
|
box-sizing: border-box;
|
}
|
.fc .fc-daygrid-day.fc-day-today {
|
background-color: #fff;
|
}
|
/* #F7F8F9; */
|
.table-wrap {
|
background: #F7F8F9 !important;
|
padding: 0 !important;
|
}
|
</style>
|