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.
wkcrm_web/src/views/bi/customer/CustomerTotalStatistics.vue

266 lines
6.7 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

<template>
<div
v-loading="loading"
class="main-container">
<filtrate-handle-view
title="客户总量分析"
class="filtrate-bar"
module-type="customer"
@load="loading=true"
@change="searchClick"/>
<div class="content">
<div class="axis-content">
<div id="axismain"/>
</div>
<div class="table-content">
<div class="handle-bar">
<el-button
class="export-btn"
@click="exportClick">导出</el-button>
</div>
<el-table
v-if="showTable"
ref="tableRef"
:data="list"
:summary-method="getSummaries"
height="400"
show-summary
stripe
border
highlight-current-row
@sort-change="({ prop, order }) => mixinSortFn(list, prop, order)">
<el-table-column
v-for="(item, index) in fieldList"
:key="index"
:prop="item.field"
:label="item.name"
min-width="130"
sortable="custom"
align="center"
header-align="center"
show-overflow-tooltip/>
</el-table>
</div>
</div>
</div>
</template>
<script>
import BaseMixin from '../mixins/Base'
import SortMixin from '../mixins/Sort'
import SummaryMixin from '../mixins/Summary'
import echarts from 'echarts'
import {
biCustomerTotalListAPI,
biCustomerTotalAPI,
biCustomerTotalListExportAPI
} from '@/api/bi/customer'
export default {
/** 客户总量分析 */
name: 'CustomerTotalStatistics',
mixins: [BaseMixin, SortMixin, SummaryMixin],
data() {
return {
loading: false,
axisOption: null,
postParams: {}, // 筛选参数
dataIndex: null,
list: [],
axisList: [],
fieldList: [
{ field: 'realname', name: '员工姓名', sortable: true },
{ field: 'customer_num', name: '新增客户数', sortable: true },
{ field: 'deal_customer_num', name: '成交客户数', sortable: true },
{ field: 'deal_customer_rate', name: '客户成交率(%)', sortable: true },
{ field: 'contract_money', name: '合同总金额', sortable: true },
{ field: 'receivables_money', name: '回款金额', sortable: true }
]
}
},
computed: {
// 列表请求参数
listPostParams() {
const params = { ...this.postParams }
if (this.dataIndex !== undefined && this.dataIndex !== null) {
const dataItem = this.axisList[this.dataIndex]
delete params.type
params.start_time = dataItem.type
params.end_time = dataItem.type
}
return params
}
},
mounted() {
this.initAxis()
},
methods: {
/**
* 搜索点击
*/
searchClick(params) {
this.postParams = params
this.getDataList()
this.getRecordList()
},
/**
* 图表数据
*/
getDataList() {
this.loading = true
biCustomerTotalAPI(this.postParams)
.then(res => {
this.loading = false
const list = res.data || []
this.axisList = list
const dealData = []
const numData = []
const legendData = []
for (let index = 0; index < list.length; index++) {
const element = list[index]
dealData.push(element.deal_customer_num)
numData.push(element.customer_num)
legendData.push(element.type)
}
this.axisOption.xAxis[0].data = legendData
this.axisOption.series[0].data = dealData
this.axisOption.series[1].data = numData
this.chartObj.setOption(this.axisOption, true)
})
.catch(() => {
this.loading = false
})
},
/**
* 获取相关列表
*/
getRecordList(dataIndex) {
this.dataIndex = dataIndex
this.list = []
this.loading = true
biCustomerTotalListAPI(this.listPostParams)
.then(res => {
this.loading = false
const data = res.data || {}
this.list = data.list || []
this.getSummariesData(data.total)
})
.catch(() => {
this.loading = false
})
},
/** 柱状图 */
initAxis() {
this.chartObj = echarts.init(document.getElementById('axismain'))
this.chartObj.on('click', params => {
// seriesIndex 1跟进客户数 2:跟进次数 dataIndex 具体的哪条数据
this.getRecordList(params.dataIndex)
})
this.axisOption = {
color: ['#6ca2ff', '#ff7474'],
toolbox: this.toolbox,
tooltip: {
trigger: 'axis',
axisPointer: {
// 坐标轴指示器,坐标轴触发有效
type: 'shadow' // 默认为直线,可选为:'line' | 'shadow'
}
},
legend: {
data: ['成交客户数', '新增客户数'],
bottom: '0px',
itemWidth: 14
},
grid: {
top: '40px',
left: '20px',
right: '20px',
bottom: '40px',
containLabel: true,
borderColor: '#fff'
},
xAxis: [
{
type: 'category',
data: [],
axisTick: {
alignWithLabel: true,
lineStyle: { width: 0 }
},
axisLabel: {
color: '#333'
},
/** 坐标轴轴线相关设置 */
axisLine: {
lineStyle: { color: '#333' }
},
splitLine: {
show: false
}
}
],
yAxis: [
{
type: 'value',
name: '新增客户数',
axisTick: {
alignWithLabel: true,
lineStyle: { width: 0 }
},
axisLabel: {
color: '#333',
formatter: '{value} 个'
},
/** 坐标轴轴线相关设置 */
axisLine: {
lineStyle: { color: '#333' }
},
splitLine: {
show: false
}
}
],
series: [
{
name: '成交客户数',
type: 'bar',
yAxisIndex: 0,
barMaxWidth: 15,
data: []
},
{
name: '新增客户数',
type: 'bar',
yAxisIndex: 0,
barMaxWidth: 15,
data: []
}
]
}
},
/**
* 导出点击
*/
exportClick() {
this.requestExportInfo(biCustomerTotalListExportAPI, this.listPostParams, 'statistics')
}
}
}
</script>
<style rel="stylesheet/scss" lang="scss" scoped>
@import '../styles/detail.scss';
</style>