CRM(客户关系管理)系统中的销售漏斗是一个重要的销售工具,用于反映销售机会的状态以及销售效率。它的主要作用和功能可以概括如下:
- 跟踪销售过程:销售漏斗以可视化的方式清晰呈现出销售过程中不同阶段的客户和销售状况。这加强了销售团队对整个销售流程的掌控。
- 分析及决策:通过对销售漏斗的分析,公司可以识别出哪些地方最可能出现客户流失,了解客户的购买流程,从而制定出更有效的销售策略。
- 提高销售成功率:销售漏斗可以帮助企业轻松管理和跟踪所有的销售机会,从而提高销售成功率。
- 预测销售结果:销售漏斗还可以根据当前的销售数据,预测未来的销售趋势和结果,这对于公司的销售预测和业绩评估非常重要。
例如,对于一个销售流程商机组,你可以使用 CRM 销售漏斗来跟踪商机组中的每个销售机会,从初次接触到最终成交的整个过程。你还可以基于销售漏斗的数据做出决策,比如调整销售策略、改进销售流程等。
前端代码实现
组件封装
<div
v-loading="loading"
class="sales-funnel card">
<flexbox class="card-title">
<span class="icon wk wk-funnel" />
<div class="card-title-center text-one-ellipsis">
销售漏斗
<template v-if="businessId">
(商机组:{{ businessName }})
</template>
</div>
<div class="card-title-right">
<!--<span class="box">{{ filterText }}</span>
<span class="box">{{ timeLine }}</span>-->
<el-dropdown
v-if="businessId"
trigger="click"
@command="handleCommand">
<span class="box">
{{ businessName }}<i class="el-icon-arrow-down el-icon--right" />
</span>
<el-dropdown-menu slot="dropdown">
<el-dropdown-item
v-for="(item, index) in businessOptions"
:key="index"
:command="index">
{{ item.name }}
</el-dropdown-item>
</el-dropdown-menu>
</el-dropdown>
</div>
</flexbox>
<div id="sales-funnel" />
<flexbox justify="center" class="info-box">
<flexbox direction="column" class="info-item">
<div class="label">赢单</div>
<div class="value">{{ funnelData.winSingle }}元</div>
</flexbox>
<flexbox direction="column" class="info-item">
<div class="label">输单</div>
<div class="value">{{ funnelData.loseSingle }}元</div>
</flexbox>
</flexbox>
</div>
销售漏斗的组件,其中包含了一些用户界面元素和数据绑定的内容。这里对代码进行一下解读:
- <div v-loading="loading" class="sales-funnel card">: 这是一个 div 容器,使用了 Vue 的自定义指令 v-loading 这意味着当 loading 的值为 true 时,这个容器将显示加载中的效果。
- <flexbox class="card-title">:这是使用 flexbox 进行布局的容器,包含了一些显示标题和相关信息的元素。
- <el-dropdown>: 这是一个下拉菜单组件,当选择了一个菜单项,handleCommand 方法将被触发并且传入对应的命令。下拉菜单中的选项由 businessOptions 数据提供。
- <div id="sales-funnel" />: 这个元素的 id 是 "sales-funnel",可能被用来作为一个插入销售漏斗图表的容器。
- <flexbox justify="center" class="info-box">: 这是一个居中的 flexbox 容器,包含了两组显示 "赢单" 和 "输单" 数量的元素,使用 {{ }} 插值绑定的数据 funnelData.winSingle 和 funnelData.loseSingle 来动态显示赢单和输单的数量。
使用echart实现漏斗图
initChart() {
this.chartObj = echarts.init(document.getElementById('sales-funnel'))
this.chartObj.setOption(this.chartOption, true)
this.chartObj.on('click', params => {
this.$emit('chart-click', params, this.dataList[params.dataIndex])
})
},
/**
* 获取统计数据
*/
getData() {
if (!this.businessId) return
this.loading = true
crmIndexFunnelAPI({
...this.getBaseParams(),
typeId: this.businessId
}).then(res => {
this.loading = false
const data = []
let sumCount = 0
const resData = res.data || {}
this.dataList = resData.list || []
for (let index = 0; index < this.dataList.length; index++) {
const element = this.dataList[index]
data.push({
name: (element.name || '') + '(' + element.money + '元)',
value: element.count
})
sumCount += parseFloat(element.count || 0)
}
this.chartOption.series[0].data = data
this.chartOption.legend.data = data.map(o => o.name)
this.chartOption.series[0].max = sumCount < 1 ? 1 : sumCount
this.chartObj.setOption(this.chartOption, true)
this.funnelData = {
winSingle: resData.sumYing,
loseSingle: resData.sumShu
}
}).catch(() => {
this.loading = false
})
},
这部分代码主要做了两件事情:初始化一个 ECharts 图表 (一个流行的数据可视化库),并且从服务器获取数据然后更新到这个图表上。
具体来看:
- initChart() 这个方法首先初始化一个 echarts 图表并保存到 this.chartObj 这个属性上。它然后设置这个图表的配置选项为 this.chartOption。最后,它为图表绑定一个点击事件,当点击图表时,会发出一个 'chart-click' 事件,附带点击点的参数以及对应数据列表的数据。
- getData() 这个方法主要从服务器获取数据并用这些数据来更新图表与相关的数据。首先,它检查是否已经设置了 this.businessId。如果没有,则直接返回。然后,它将 loading 设置为 true,开始从服务器获取数据。数据获取成功后,它将 loading 设置为 false,并处理获取到的数据,比如把数据插入图表等等。最后,在所有操作完成或者出现错误后,它将 loading 重置为 false。