Commit ac6bdfa2 by liuchenxi

update: 触达效果

parent 7385aa28
<template>
<i class="iconfont icon-xinxixianshi"></i>
<el-tooltip placement="top">
<template slot="content">
<p class="tip-popover">{{ text }}</p>
</template>
<i class="iconfont icon-xinxixianshi"></i>
</el-tooltip>
</template>
<script>
export default {};
export default {
name: 'tip',
props: {
text: String
}
};
</script>
<style scoped>
......@@ -12,4 +22,8 @@ i {
font-size: 13px;
color: #909399;
}
.tip-popover {
max-width: 400px;
color: #ffffff;
}
</style>
......@@ -50,26 +50,20 @@ export const exportCurrentSendDetails = config.api + PREFIX + 'export-current-se
export const ecmTouchEffectColumnDiagram = params => requests(PREFIX + 'ecmTouchEffectColumnDiagram', params);
export const ecmTouchEffectTable = params => requests(PREFIX + 'ecmTouchEffectTable', params);
export const ecmTouchTypeTableList = params => requests(PREFIX + 'ecmTouchTypeTableList', params); // 获取(1 群发任务、2 群发失败-话务、3 群发失败-短信、4 话务、5 短信、6 微信)列表
// export const ecmTouchEffectFunnelChart = params => requests(PREFIX + 'ecmTouchEffectFunnelChart', params);
export const ecmPlanTouchConfig = params => requests(PREFIX + 'ecmPlanTouchConfig', params);
export const getCardLeads = params => requests(PREFIX + 'getCardLeads', params); // 卡券收益
export const getCardLeadsList = params => requests(PREFIX + 'getCardLeadsList', params); // 卡券收益表格
// 智能营销--导购线索
export const ecmGuideCluesColumnDiagram = params => requests(PREFIX + 'ecmGuideCluesColumnDiagram', params);
export const ecmGuideCluesTable = params => requests(PREFIX + 'ecmGuideCluesTable', params);
export const ecmGuideCluesTaskTable = params => requests(PREFIX + 'ecmGuideCluesTaskTable', params); // 任务完成情况表格
export const ecmGuideCluesTouchEffectTotalTab = params => requests(PREFIX + 'ecmGuideCluesTouchEffectTotalTab', params); // 触达效果-整体转化-表格
export const ecmGuideCluesTouchEffectTab = params => requests(PREFIX + 'ecmGuideCluesTouchEffectTab', params); // 触达效果-其他tab-表格
// 智能营销--后台线索
export const ecmHeadCluesColumnDiagram = params => requests(PREFIX + 'ecmHeadCluesColumnDiagram', params);
export const ecmHeadGuideCluesTable = params => requests(PREFIX + 'ecmHeadGuideCluesTable', params);
export const ecmHeadCluesTaskTab = params => requests(PREFIX + 'ecmHeadCluesTaskTab', params); // 表格
// 智能营销--表格的合计和计划整体数据
export const ecmGuideCluesTouchEffectTotalTabHead = params => requests(PREFIX + 'ecmGuideCluesTouchEffectTotalTabHead', params); // 导购线索-触达效果整体计划表头
export const ecmGuideCluesTouchEffectTabHead = params => requests(PREFIX + 'ecmGuideCluesTouchEffectTabHead', params); //导购线索--触达效果其他表格表头
export const ecmGuideCluesTaskTableHead = params => requests(PREFIX + 'ecmGuideCluesTaskTableHead', params); // 触达效果-导购线索-任务完成情况表头
export const ecmHeadCluesTaskTabHead = params => requests(PREFIX + 'ecmHeadCluesTaskTabHead', params); // 总部线索表头
// 计划整体详情
export const overAllList = params => requests(PREFIX + 'ecmOverAllTable', params); // 单独数据
export const overAllTable = params => requests(PREFIX + 'ecmOverAllPage', params); // 下钻表格
// 话务详情
export const telTaskDiagram = params => requests(PREFIX + 'ecmTelTaskColumnDiagram', params); // 柱线图
export const telTaskList = params => requests(PREFIX + 'ecmTelTaskTable', params); // 单独数据
export const telTaskTable = params => requests(PREFIX + 'ecmTelTaskPage', params); // 下钻表格
// 群发详情
export const massDiagram = params => requests(PREFIX + 'ecmMassColumnDiagram', params); // 柱线图
export const massList = params => requests(PREFIX + 'ecmMassTaskTable', params); // 单独数据
export const massTable = params => requests(PREFIX + 'ecmMassTaskPage', params); // 下钻表格
// 智能营销线索页tree
export const getGroupTree = params => requests(PREFIX + 'getGroupTree', params);
// export
......
......@@ -3,7 +3,7 @@
<div class="middle">
<div class="item-bg bg-purper center_flex min-w-173">
<div>
<p>计划触达人数<tip /></p>
<p>计划触达人数<tip :text="tipText.planMbrNum" /></p>
<p>{{ formatterNum(data.planMbrNum) }}</p>
</div>
</div>
......@@ -13,7 +13,7 @@
</div>
<div class="item-bg bg-purper center_flex min-w-173">
<div>
<p>实际触达人数<tip /></p>
<p>实际触达人数<tip :text="tipText.touchMbrNum" /></p>
<p>{{ formatterNum(data.touchMbrNum) }}</p>
</div>
</div>
......@@ -23,17 +23,17 @@
</div>
<div class="item-bg bg-purper center_flex min-w-212">
<div>
<p>触达顾客转化人数<tip /></p>
<p>触达顾客转化人数<tip :text="tipText.convMbrNum" /></p>
<p>{{ formatterNum(data.convMbrNum) }}</p>
</div>
</div>
<div class="item-bg bg-purper min-w-489">
<div>
<p>触达顾客订单数 <tip /></p>
<p>触达顾客订单数 <tip :text="tipText.convOrderCnt" /></p>
<p>{{ formatterNum(data.convOrderCnt) }}</p>
</div>
<div>
<p>触达顾客转化收益(元)<tip /></p>
<p>触达顾客转化收益(元)<tip :text="tipText.convSalesAmt" /></p>
<p>{{ formatterNumAndFixed(data.convSalesAmt) }}</p>
</div>
</div>
......@@ -52,6 +52,17 @@ export default {
default: () => {}
}
},
data() {
return {
tipText: {
planMbrNum: '计划使用短信触达的顾客人数。如果当前计划在不同时间用短信多次触达同一个顾客,会进行去重统计,仅计算为1个人。',
touchMbrNum: '发送短信成功的顾客人数。如果当前计划在不同时间用短信多次触达同一个顾客,会进行去重统计,仅计算为1个人。',
convMbrNum: '发送短信成功的顾客中,在收益有效期内消费的顾客人数。无论顾客消费了几次,会进行去重统计,仅计算为1个人。',
convOrderCnt: '发送短信成功的顾客中,在收益有效期内消费的顾客订单数。',
convSalesAmt: '发送短信成功的顾客中,在收益有效期内消费的顾客订单金额。'
}
};
},
mixins: [formatterNum]
};
</script>
......
......@@ -3,7 +3,7 @@
<div class="middle">
<div class="item-bg bg-purper center_flex min-w-173">
<div>
<p class="key">计划触达人数<tip /></p>
<p class="key">计划触达人数<tip :text="tipText.planMbrNum" /></p>
<p class="value">{{ formatterNum(data.planMbrNum) }}</p>
</div>
<div class="item-arrow purper">
......@@ -13,7 +13,7 @@
</div>
<div class="item-bg bg-purper center_flex min-w-173">
<div>
<p class="key">任务执行人数<tip /></p>
<p class="key">任务执行顾客数<tip :text="tipText.taskExecuteNum" /></p>
<p class="value">{{ formatterNum(data.taskExecuteNum) }}</p>
</div>
<div class="item-arrow purper">
......@@ -23,7 +23,7 @@
</div>
<div class="item-bg bg-purper center_flex min-w-173">
<div>
<p class="key">实际触达人数<tip /></p>
<p class="key">实际触达人数<tip :text="tipText.touchMbrNum" /></p>
<p class="value">{{ formatterNum(data.touchMbrNum) }}</p>
</div>
<div class="item-arrow green">
......@@ -33,17 +33,17 @@
</div>
<div class="item-bg bg-green center_flex min-w-200">
<div style="padding-left: 10px">
<p class="key">触达顾客转化人数<tip /></p>
<p class="key">触达顾客转化人数<tip :text="tipText.convMbrNum" /></p>
<p class="value">{{ formatterNum(data.convMbrNum) }}</p>
</div>
</div>
<div class="item-bg bg-green min-w-403">
<div>
<p class="key">触达顾客订单数<tip /></p>
<p class="key">触达顾客订单数<tip :text="tipText.convOrderCnt" /></p>
<p class="value">{{ formatterNum(data.convOrderCnt) }}</p>
</div>
<div>
<p class="key">触达顾客转化收益(元)<tip /></p>
<p class="key">触达顾客转化收益(元)<tip :text="tipText.convSalesAmt" /></p>
<p class="value">{{ formatterNumAndFixed(data.convSalesAmt) }}</p>
</div>
</div>
......@@ -54,7 +54,7 @@
import formatterNum from '@/mixins/validateNum';
import tip from '@/components/tip';
export default {
name: 'batch-send-phone',
name: 'batch-fail-phone',
components: { tip },
props: {
data: {
......@@ -62,6 +62,18 @@ export default {
default: () => {}
}
},
data() {
return {
tipText: {
planMbrNum: '计划使用话务任务触达的顾客人数。如果当前计划在不同时间,通过不同区域(门店),用话务任务多次触达同一个顾客,会进行去重统计,仅计算为1个人。',
taskExecuteNum: '导购实际执行话务任务的顾客人数,包括“完成”任务和“放弃”任务的人数。如果当前计划在不同时间,通过不同区域(门店),用话务任务多次触达同一个顾客,会进行去重统计,仅计算为1个人。',
touchMbrNum: '导购执行并完成话务任务的顾客人数。如果当前计划在不同时间,通过不同区域(门店),用话务任务多次触达同一个顾客,会进行去重统计,仅计算为1个人。',
convMbrNum: '导购执行并完成话务任务的顾客人数,在收益有效期内消费的顾客人数。无论顾客消费了几次,会进行去重统计,仅计算为1个人。',
convOrderCnt: '导购执行并完成话务任务的顾客中,在收益有效期内消费的顾客订单数。',
convSalesAmt: '导购执行并完成话务任务的顾客中,在收益有效期内消费的顾客订单金额。'
}
};
},
mixins: [formatterNum]
};
</script>
......
......@@ -3,7 +3,7 @@
<div class="middle">
<div class="item-bg bg-purper center_flex min-w-173">
<div>
<p class="key">计划触达人数<tip /></p>
<p class="key">计划触达人数<tip :text="tipText.planMbrNum" /></p>
<p class="value">{{ formatterNum(data.planMbrNum) }}</p>
</div>
<div class="item-arrow purper">
......@@ -13,7 +13,7 @@
</div>
<div class="item-bg bg-purper center_flex min-w-173">
<div style="padding-left: 20px">
<p class="key">任务创建成功顾客数<tip /></p>
<p class="key">任务创建成功顾客数<tip :text="tipText.taskCreateNum" /></p>
<p class="value">{{ formatterNum(data.taskCreateNum) }}</p>
</div>
<div class="item-arrow purper">
......@@ -23,7 +23,7 @@
</div>
<div class="item-bg bg-purper center_flex min-w-173">
<div>
<p class="key">群发执行顾客数<tip /></p>
<p class="key">群发执行顾客数<tip :text="tipText.massExecuteNum" /></p>
<p class="value">{{ formatterNum(data.massExecuteNum) }}</p>
</div>
<div class="item-arrow purper">
......@@ -33,7 +33,7 @@
</div>
<div class="item-bg bg-purper center_flex min-w-173">
<div>
<p class="key">实际触达人数<tip /></p>
<p class="key">实际触达人数<tip :text="tipText.touchMbrNum" /></p>
<p class="value">{{ formatterNum(data.touchMbrNum) }}</p>
</div>
<div class="item-arrow green">
......@@ -43,18 +43,18 @@
</div>
<div class="item-bg bg-green center_flex min-w-188 h143">
<div style="padding-left: 10px">
<p class="key">触达顾客转化人数<tip /></p>
<p class="key">触达顾客转化人数<tip :text="tipText.convMbrNum" /></p>
<p class="value">{{ formatterNum(data.convMbrNum) }}</p>
</div>
</div>
<div class="item-bg bg-green min-w-235 h143">
<div class="center_wrap">
<div>
<p class="key">触达顾客订单数<tip /></p>
<p class="key">触达顾客订单数<tip :text="tipText.convOrderCnt" /></p>
<p class="value">{{ formatterNum(data.convOrderCnt) }}</p>
</div>
<div>
<p class="key">触达顾客转化收益(元)<tip /></p>
<p class="key">触达顾客转化收益(元)<tip :text="tipText.convSalesAmt" /></p>
<p class="value">{{ formatterNumAndFixed(data.convSalesAmt) }}</p>
</div>
</div>
......@@ -74,6 +74,19 @@ export default {
default: () => {}
}
},
data() {
return {
tipText: {
planMbrNum: '计划使用群发任务触达的顾客人数。如果当前计划在不同时间,通过不同区域(门店),用群发多次触达同一个顾客,会进行去重统计,仅计算为1个人。',
taskCreateNum: '成功创建群发任务的人数。若该计划在不同时间通过不同区域(门店)用群发多次触达同一个顾客,仅计算为1个人。导致群发任务创建不成功的原因可能是:①非所选企业下的客户好友;②该好友每月群发消息接收次数已达上限',
massExecuteNum: '导购使用企业微信执行群发的顾客人数。如果当前计划在不同时间,通过不同区域(门店),用群发多次触达同一个顾客,会进行去重统计,仅计算为1个人。点击“查看详情”可以找到群发任务执行率较低的门店,推动门店导购在企业微信中执行群发。',
touchMbrNum: '导购执行群发后,群发消息发送成功的顾客数,按照顾客人数进行统计。如果当前计划在不同时间,通过不同区域(门店),用群发多次触达同一个顾客,会进行去重统计,仅计算为1个人。可能导致群发消息发送失败的原因是:①群发任务下发后,到导购执行群发的时间段内,顾客删除了企业微信好友,使得发送失败。②顾客是多个门店导购的企微好友,已经有某一导购群发成功,其他导购执行群发会发送失败',
convMbrNum: '导购执行群发消息发送成功的顾客中,在收益有效期内消费的顾客人数。无论顾客消费了几次,会进行去重统计,仅计算为1个人。',
convOrderCnt: '导购执行群发消息发送成功的顾客中,在收益有效期内消费的顾客订单数。',
convSalesAmt: '导购执行群发消息发送成功的顾客中,在收益有效期内消费的顾客订单金额。'
}
};
},
mixins: [formatterNum]
};
</script>
......
......@@ -6,16 +6,19 @@
<img :src="require('@/assets/img/icon-send.png')" class="img" />
<h2>群发任务</h2>
</div>
<el-link type="primary" :underline="false" style="color: #1890ff">查看详情<i class="el-icon-arrow-right" style="margin-left: 10px"></i></el-link>
<el-link type="primary" :underline="false" style="color: #1890ff" @click="$emit('toClue', '群发')">查看详情<i class="el-icon-arrow-right" style="margin-left: 10px"></i></el-link>
</div>
<batch-send-sum v-if="taskList" :data="taskList" />
<div class="wrap">
<div v-if="telTrafficList">
<h3>群发失败-话务</h3>
<div class="flex_between" style="margin-bottom: 12px;padding-right: 20px">
<h3>群发失败-话务</h3>
<el-link type="primary" :underline="false" style="color: #1890ff" @click="$emit('toClue', '群发转话务')">查看详情<i class="el-icon-arrow-right" style="margin-left: 10px"></i></el-link>
</div>
<div style="padding: 0px 20px"><batch-fail-phone :data="telTrafficList" /></div>
</div>
<div v-if="msgList" :style="{ marginTop: telTrafficList ? '26px' : '0' }">
<h3>群发失败-话务</h3>
<h3 style="margin-bottom: 12px">群发失败-话务</h3>
<div style="padding: 0px 20px"><batch-fail-msg :data="msgList" /></div>
</div>
</div>
......@@ -44,8 +47,7 @@ export default {
msgList: {
type: Object || undefined
}
},
methods: {}
}
};
</script>
......@@ -91,7 +93,6 @@ export default {
color: #303133;
font-family: PingFangSC-Medium, PingFang SC;
font-weight: 600;
margin-bottom: 12px;
}
}
</style>
......@@ -3,7 +3,7 @@
<div class="middle">
<div class="item-bg bg-purper center_flex min-w-173">
<div>
<p>触达人数<tip /></p>
<p>触达人数<tip :text="tipText.touchMbrNum" /></p>
<p>{{ formatterNum(list.touchMbrNum) }}</p>
</div>
</div>
......@@ -13,7 +13,7 @@
</div>
<div class="item-bg bg-purper center_flex min-w-173">
<div>
<p>领取人数<tip /></p>
<p>领取人数<tip :text="tipText.getMbrNum" /></p>
<p>{{ formatterNum(list.getMbrNum) }}</p>
</div>
</div>
......@@ -23,17 +23,17 @@
</div>
<div class="item-bg bg-purper center_flex min-w-214">
<div>
<p>使用人数<tip /></p>
<p>使用人数<tip :text="tipText.useMbrNum" /></p>
<p>{{ formatterNum(list.useMbrNum) }}</p>
</div>
</div>
<div class="item-bg bg-purper min-w-527">
<div>
<p>销售单数 <tip /></p>
<p>销售单数 <tip :text="tipText.orderCnt" /></p>
<p>{{ formatterNum(list.orderCnt) }}</p>
</div>
<div>
<p>销售单金额(元)<tip /></p>
<p>销售单金额(元)<tip :text="tipText.salesAmt" /></p>
<p>{{ formatterNumAndFixed(list.salesAmt) }}</p>
</div>
</div>
......@@ -52,6 +52,17 @@ export default {
default: () => {}
}
},
data() {
return {
tipText: {
touchMbrNum: '当前智能营销计划发出优惠券的顾客数,如果对同一个顾客发送了超过1张优惠券,仅计算为1个人。',
getMbrNum: '当前智能营销计划发出优惠券后,领取优惠券的顾客人数。如果同一个顾客领取了超过1张优惠券,仅计算为1个人。',
useMbrNum: '"当前智能营销计划发出优惠券后,使用优惠券的顾客人数。如果同一个顾客使用了超过1张优惠券,仅计算为1个人。由于是单独从“卡券”维度统计,因此只要是使用了该计划所发送优惠券的都会计入,即使顾客使用该优惠券的订单超过了收益有效期"',
orderCnt: '"当前智能营销计划发出优惠券后,使用优惠券的订单数。如果一个订单使用了超过1张优惠券,仅计算为1个订单。由于是单独从“卡券”维度统计,因此只要是使用了该计划所发送优惠券的订单都会计入,即使该订单超过了收益有效期,也会将该订单计入销售单数。"',
salesAmt: '"当前智能营销计划发出优惠券后,使用优惠券的订单金额。如果一笔订单使用了超过1张优惠券,该金额仅计算一次。由于是单独从“卡券”维度统计,因此只要是使用了该计划所发送优惠券的订单都会计入,即使该订单超过了收益有效期,也会将该订单金额计入。"'
}
};
},
mixins: [formatterNum]
};
</script>
......
......@@ -6,45 +6,41 @@
<li>
<span class="squre"></span>
<div class="text">
<p>1.转化效果趋势图</p>
<p>按日展示。当天转化人数可能是因为之前的触达影响的,所以当日触达转化额人数可能大于触达人数</p>
<p>1.转化收益计算方式</p>
<p>通过智能营销触达到顾客后,顾客在收益有效期内进行消费,会被视为该智能营销计划的转化。如:1月1日智能营销计划下发话务任务,让导购联系1月生日会员到店消费,收益有效期设置为14天。导购在1月3日完成任务联系到顾客。如果该顾客在1月17日前来店消费,则将该顾客记入触达顾客转化人数,该顾客消费订单数和金额记入触达顾客订单数和转化收益。如果顾客在消费后退单,该订单数据仍然会被计算在转化收益中。如果出现补单,补单时间在七天以内的订单,会按照收益计算规则进行统计,其它订单不统计入转化收益</p>
</div>
</li>
<li>
<span class="squre"></span>
<div class="text">
<p>2.计划整体效果</p>
<p>配置了参照组的,展示参照组转化情况,即计划中设定的非触达人群的转化情况;</p>
</div>
</li>
<li>
<span class="squre"></span>
<div class="text">
<p>3.线索转化对比</p>
<p>导购线索:计划中触达到门店导购端的都归入导购线索,包括话务、企微任务;<br />后台线索:计划中非导购线索的触达,包括图文、文本、小程序、图片、卡券等。</p>
<p>统计整个计划的营销效果。任意一个渠道触达顾客即视为触达。如果计划中多个渠道触达同一个顾客,统计人数时会进行去重,仅计算为1个人</p>
</div>
</li>
<li>
<span class="squre"></span>
<div class="text">
<p>4.转化收益</p>
<p>3.卡券收益</p>
<p>
① 触达后产生的消费在触达收益计算有效期内的,计入转化效益,有效期见计划配置;<br />
② 导购和后台线索均有触达,消费在两者触达的有效期内的,收益归给导购线索;<br />
③ 一个触达转化消费,在多个导购触达任务的收益计算有效期内的,该笔转化只记给第一个触达任务;<br />
④ 转化收益只计销售单,不看退货单和换货单;金额是应付还是实付看ERP传入的值。<br />
⑤『触达率』:触达人数 / 计划触达人数 <br />
⑥『转化率』:转化人数 / 触达人数; 参照组不存在触达人数,转化率 = 转化人数 / 计划人数
①智能营销计划中投放卡券所产生的营销效果,仅有通过当前智能营销任务发出的卡券才会被统计,其他渠道投放卡券的数据不会包含。<br />
②由于是单独从“卡券”维度统计,因此只要是使用了该计划所发送优惠券的都会计入,即使顾客使用该优惠券的订单超过了收益有效期,比如实际使用该卡券发生在被触达之后很久,远远超过了收益有效期,在此收益模块中,也会将该订单纳入统计,而“计划整体效果”中不会包含该超过了收益有效期的订单相关数据。<br />
③如果一个顾客使用了多张卡券,在统计单个卡券效果时,会根据实际情况分别计算(这可能导致每个优惠券的数据相加求和大于计划整体)。
</p>
</div>
</li>
<li>
<span class="squre"></span>
<div class="text">
<p>5. 卡券收益</p>
<p>4.各渠道触达效果(企微群发任务、话务任务、短信、微信)</p>
<p>
① 计划中的卡券,计划中卡券触达的人群使用该卡券消费的收益,包含已过计划收益有效期的数据。<br />
② 一个计划中使用多张卡券的,计划粒度上卡券收益去重,各卡券数据相加可能不等于整体数据。
① 计划中触达渠道的营销效果,会对每个触达渠道分别进行统计。<br />
② 如果计划中使用了多种触达渠道触达了某个顾客,且该顾客在收益有效期内进行了消费。在统计单个触达渠道的效果时,会在每个触达渠道中都算上该顾客(这可能导致每个渠道的数据相加求和大于计划整体,因为“计划整体”的触达转化效果是会去重的)。<br />
各触达渠道“实际触达”的定义如下:<br />
③ 一个触达转化消费,在多个导购触达任务的收益计算有效期内的,该笔转化只记给第一个触达任务;<br />
④ 群发任务:通过企业微信实际发送群发消息成功即视为触达<br />
⑤ 短信:运营商返回发送成功的即视为触达 <br />
⑥ 微信:微信发送接口返回成功即视为触达。<br />
⑦ 话务:导购完成话务任务(不含放弃)即视为触达。
</p>
</div>
</li>
......@@ -188,6 +184,7 @@ export default {
}
.h790 {
height: 790px !important;
overflow-y: scroll;
}
.h762 {
height: 762px !important;
......
......@@ -27,7 +27,7 @@
<div class="right">
<div class="item-bg bg-purper center_flex min-w-173">
<div>
<p>{{ item.isSales == 1 ? '计划触达人数' : '参照组人数' }}<tip /></p>
<p>{{ item.isSales == 1 ? '计划触达人数' : '参照组人数' }}<tip :text="item.isSales == 1 ? experText.planMbrText : controText.planMbrText" /></p>
<p>{{ formatterNum(item.planMbrNum) }}</p>
</div>
</div>
......@@ -38,7 +38,7 @@
<div v-else style="width: 96px"></div>
<div class="item-bg bg-purper center_flex min-w-173" v-if="item.isSales == 1">
<div>
<p>实际触达人数<tip /></p>
<p>实际触达人数<tip :text="experText.touchMbrText" /></p>
<p>{{ formatterNum(item.touchMbrNum) }}</p>
</div>
</div>
......@@ -49,17 +49,17 @@
</div>
<div class="item-bg bg-green center_flex min-w-206">
<div>
<p>{{ item.isSales == 1 ? '触达顾客转化人数' : '转化人数' }}<tip /></p>
<p>{{ item.isSales == 1 ? '触达顾客转化人数' : '转化人数' }}<tip :text="item.isSales == 1 ? experText.convMbrText : controText.convMbrText" /></p>
<p>{{ formatterNum(item.convMbrNum) }}</p>
</div>
</div>
<div class="item-bg bg-green min-w-389">
<div>
<p>{{ item.isSales == 1 ? '触达顾客订单数' : '转化订单数' }}<tip /></p>
<p>{{ item.isSales == 1 ? '触达顾客订单数' : '转化订单数' }}<tip :text="item.isSales == 1 ? experText.convOrderText : controText.convOrderText" /></p>
<p>{{ formatterNum(item.convOrderCnt) }}</p>
</div>
<div>
<p>{{ item.isSales == 1 ? '触达顾客转化收益' : '转化收益' }}<tip /></p>
<p>{{ item.isSales == 1 ? '触达顾客转化收益' : '转化收益' }}<tip :text="item.isSales == 1 ? experText.convOrderText : controText.convSalesText" /></p>
<p>{{ formatterNumAndFixed(item.convSalesAmt) }}</p>
</div>
</div>
......@@ -98,6 +98,25 @@ export default {
batchTimes: String,
batchNum: Number | String
},
data() {
return {
// 实验组tip
experText: {
planMbrText: '当前智能营销在计划创建时,按照条件圈选的顾客人数。如果当前计划中,通过不同触达方式或不同时间,计划触达同一个顾客,会进行去重统计,仅计算为1个人。',
touchMbrText: '当前智能营销通过指定触达方式,实际触达到的顾客数。如果当前计划中,通过不同触达方式或不同时间,实际触达了同一个顾客,会进行去重统计,仅计算为1个人。',
convMbrText: '当前智能营销实际触达顾客中,在收益有效期内消费的顾客人数。无论顾客消费了几次,会进行去重统计,仅计算为1个人。',
convOrderText: '当前智能营销实际触达顾客中,在收益有效期内消费的顾客订单数。',
convSalesText: '当前智能营销实际触达顾客中,在收益有效期内消费的顾客订单金额。'
},
// 参照组tip
controText: {
planMbrText: '当前智能营销计划选择顾客范围中,未进行营销触达的顾客人数。用于与实验组进行对比,评估营销/未营销所带来的转化效果差异。',
convMbrText: '当前智能营销计划选择顾客范围中,未进行营销触达的顾客人数,在收益有效期内产生消费的顾客人数。收益有效期按照实验组首次进行营销触达时间加收益分析天数统计。',
convOrderText: '当前智能营销计划选择顾客范围中,未进行营销触达的顾客,在收益有效期内产生消费的订单数量。收益有效期按照实验组首次进行营销触达时间加收益分析天数统计。',
convSalesText: '当前智能营销计划选择顾客范围里,未进行营销触达的顾客,在收益有效期内产生消费的订单金额。收益有效期按照实验组首次进行营销触达时间加收益分析天数统计。'
}
};
},
mixins: [formatterNum]
};
</script>
......
......@@ -5,7 +5,7 @@
<img :src="require('@/assets/img/icon-phone.png')" class="img" />
<h2>话务</h2>
</div>
<el-link type="primary" :underline="false" style="color: #1890ff">查看详情<i class="el-icon-arrow-right" style="margin-left: 10px"></i></el-link>
<el-link type="primary" :underline="false" style="color: #1890ff" @click="$emit('toClue', '话务')">查看详情<i class="el-icon-arrow-right" style="margin-left: 10px"></i></el-link>
</div>
<phone-traffic-sum v-bind="$attrs" />
</div>
......
......@@ -3,7 +3,7 @@
<div class="middle">
<div class="item-bg bg-purper center_flex min-w-173">
<div>
<p class="key">计划触达人数<tip /></p>
<p class="key">计划触达人数<tip :text="tipText.planMbrNum" /></p>
<p class="value">{{ formatterNum(data.planMbrNum) }}</p>
</div>
<div class="item-arrow purper">
......@@ -13,7 +13,7 @@
</div>
<div class="item-bg bg-purper center_flex min-w-173">
<div>
<p class="key">任务执行人数<tip /></p>
<p class="key">任务执行顾客数<tip :text="tipText.taskExecuteNum" /></p>
<p class="value">{{ formatterNum(data.taskExecuteNum) }}</p>
</div>
<div class="item-arrow purper">
......@@ -23,7 +23,7 @@
</div>
<div class="item-bg bg-purper center_flex min-w-173">
<div>
<p class="key">实际触达人数<tip /></p>
<p class="key">实际触达人数<tip :text="tipText.touchMbrNum" /></p>
<p class="value">{{ formatterNum(data.touchMbrNum) }}</p>
</div>
<div class="item-arrow green">
......@@ -33,17 +33,17 @@
</div>
<div class="item-bg bg-green center_flex min-w-210">
<div>
<p class="key">触达顾客转化人数<tip /></p>
<p class="key">触达顾客转化人数<tip :text="tipText.convMbrNum" /></p>
<p class="value">{{ formatterNum(data.convMbrNum) }}</p>
</div>
</div>
<div class="item-bg bg-green min-w-433">
<div>
<p class="key">触达顾客订单数<tip /></p>
<p class="key">触达顾客订单数<tip :text="tipText.convOrderCnt" /></p>
<p class="value">{{ formatterNum(data.convOrderCnt) }}</p>
</div>
<div>
<p class="key">触达顾客转化收益(元)<tip /></p>
<p class="key">触达顾客转化收益(元)<tip :text="tipText.convSalesAmt" /></p>
<p class="value">{{ formatterNumAndFixed(data.convSalesAmt) }}</p>
</div>
</div>
......@@ -62,6 +62,18 @@ export default {
default: () => {}
}
},
data() {
return {
tipText: {
planMbrNum: '计划使用话务任务触达的顾客人数。如果当前计划在不同时间,通过不同区域(门店),用话务任务多次触达同一个顾客,会进行去重统计,仅计算为1个人。',
taskExecuteNum: '导购实际执行话务任务的顾客人数,包括“完成”任务和“放弃”任务的人数。如果当前计划在不同时间,通过不同区域(门店),用话务任务多次触达同一个顾客,会进行去重统计,仅计算为1个人。',
touchMbrNum: '导购执行并完成话务任务的顾客人数。如果当前计划在不同时间,通过不同区域(门店),用话务任务多次触达同一个顾客,会进行去重统计,仅计算为1个人。',
convMbrNum: '导购执行并完成话务任务的顾客人数,在收益有效期内消费的顾客人数。无论顾客消费了几次,会进行去重统计,仅计算为1个人。',
convOrderCnt: '导购执行并完成话务任务的顾客中,在收益有效期内消费的顾客订单数。',
convSalesAmt: '导购执行并完成话务任务的顾客中,在收益有效期内消费的顾客订单金额。'
}
};
},
mixins: [formatterNum]
};
</script>
......
......@@ -3,7 +3,7 @@
<div class="middle">
<div class="item-bg bg-purper center_flex min-w-173">
<div>
<p>计划触达人数<tip /></p>
<p>计划触达人数<tip :text="tipText.planMbrNum" /></p>
<p>{{ formatterNum(data.planMbrNum) }}</p>
</div>
</div>
......@@ -13,7 +13,7 @@
</div>
<div class="item-bg bg-purper center_flex min-w-173">
<div>
<p>实际触达人数<tip /></p>
<p>实际触达人数<tip :text="tipText.touchMbrNum" /></p>
<p>{{ formatterNum(data.touchMbrNum) }}</p>
</div>
</div>
......@@ -23,17 +23,17 @@
</div>
<div class="item-bg bg-green center_flex min-w-214">
<div>
<p>触达顾客转化人数<tip /></p>
<p>触达顾客转化人数<tip :text="tipText.convMbrNum" /></p>
<p>{{ formatterNum(data.convMbrNum) }}</p>
</div>
</div>
<div class="item-bg bg-green min-w-527">
<div>
<p>触达顾客订单数 <tip /></p>
<p>触达顾客订单数 <tip :text="tipText.convOrderCnt" /></p>
<p>{{ formatterNum(data.convOrderCnt) }}</p>
</div>
<div>
<p>触达顾客转化收益(元)<tip /></p>
<p>触达顾客转化收益(元)<tip :text="tipText.convSalesAmt" /></p>
<p>{{ formatterNumAndFixed(data.convSalesAmt) }}</p>
</div>
</div>
......@@ -52,6 +52,17 @@ export default {
default: () => {}
}
},
data() {
return {
tipText: {
planMbrNum: '计划使用短信触达的顾客人数。如果当前计划在不同时间用短信多次触达同一个顾客,会进行去重统计,仅计算为1个人。',
touchMbrNum: '发送短信成功的顾客人数。如果当前计划在不同时间用短信多次触达同一个顾客,会进行去重统计,仅计算为1个人。',
convMbrNum: '发送短信成功的顾客中,在收益有效期内消费的顾客人数。无论顾客消费了几次,会进行去重统计,仅计算为1个人。',
convOrderCnt: '发送短信成功的顾客中,在收益有效期内消费的顾客订单数。',
convSalesAmt: '发送短信成功的顾客中,在收益有效期内消费的顾客订单金额。'
}
};
},
mixins: [formatterNum]
};
</script>
......
......@@ -9,11 +9,11 @@
</template>
<script>
import * as G2 from '@antv/g2';
import { ecmTouchEffectColumnDiagram, ecmGuideCluesColumnDiagram, ecmHeadCluesColumnDiagram } from '@/service/api/ecmApi.js';
import { ecmTouchEffectColumnDiagram, telTaskDiagram, massDiagram } from '@/service/api/ecmApi.js';
export default {
name: 'touch-charts',
props: {
type: String, // 0是触达效果 1导购线索 2后台线索
type: String,
createTime: Number
},
data() {
......@@ -115,10 +115,21 @@ export default {
},
getChartData() {
let meth;
if (this.type == 0) meth = ecmTouchEffectColumnDiagram;
else if (this.type == 1) meth = ecmGuideCluesColumnDiagram;
else meth = ecmHeadCluesColumnDiagram;
meth({ ecmPlanId: this.$route.query.id || this.$route.params.id }).then(res => {
let params = {
ecmPlanId: this.$route.query.id || this.$route.params.id
};
if (!this.type) {
meth = ecmTouchEffectColumnDiagram;
} else if (this.type == '话务') {
meth = telTaskDiagram;
params.convType = 1;
} else if (this.type == '群发转话务') {
meth = telTaskDiagram;
params.convType = 2;
} else if (this.type == '群发') {
meth = massDiagram;
}
meth(params).then(res => {
if (!res.result || !res.result.length) {
// 没数据的情况
this.isNone = true;
......
......@@ -8,11 +8,11 @@
</div>
<div v-if="customServiceData">
<h3>{{ $route.query.effectType == 0 ? '客服接口(文本、图文、图片、小程序)' : '客服接口(小程序)' }}</h3>
<wechat-sum :data="customServiceData" />
<wechat-sum :data="customServiceData" :tipText="customText" />
</div>
<div v-if="batchData" style="margin-top: 30px">
<h3>群发接口(文本、图文、图片)</h3>
<wechat-sum :data="batchData" />
<wechat-sum :data="batchData" :tipText="batchText" />
</div>
</div>
</template>
......@@ -29,6 +29,24 @@ export default {
batchData: {
type: Object || undefined
}
},
data() {
return {
customText: {
planMbrNum: '计划使用微信客服接口触达的顾客人数。如果当前计划在不同时间用微信客服接口触达多次触达同一个顾客,会进行去重统计,仅计算为1个人。',
touchMbrNum: '使用微信客服接口成功推送触达的顾客人数。如果当前计划在不同时间用微信客服接口触达多次触达同一个顾客,会进行去重统计,仅计算为1个人。微信客服接口成功推送触达需要严格的前置条件,也有相应限制,可能导购触达人数过低。',
convMbrNum: '使用微信客服接口成功推送触达的顾客中,在收益有效期内消费的顾客人数。无论顾客消费了几次,会进行去重统计,仅计算为1个人。',
convOrderCnt: '使用微信客服接口成功推送触达的顾客中,在收益有效期内消费的顾客订单数。',
convSalesAmt: '使用微信客服接口成功推送触达的顾客中,在收益有效期内消费的顾客订单金额。'
},
batchText: {
planMbrNum: '计划使用微信服务号群发接口进行推送触达的顾客人数。如果当前计划在不同时间用微信服务号群发接口多次触达同一个顾客,会进行去重统计,仅计算为1个人。',
touchMbrNum: '使用微信服务号群发接口成功推送的顾客人数。如果当前计划在不同时间用微信服务号群发接口触达多次触达同一个顾客,会进行去重统计,仅计算为1个人。由于微信系统限制,无法获取发送的消息是否成功到达顾客手机,所以只要成功向微信接口发出消息,即视为实际触达。',
convMbrNum: '使用微信服务号群发接口触达的顾客中,在收益有效期内消费的顾客人数。无论顾客消费了几次,会进行去重统计,仅计算为1个人。',
convOrderCnt: '使用微信服务号群发接口触达的顾客中,在收益有效期内消费的顾客订单数。',
convSalesAmt: '使用微信服务号群发接口触达的顾客中,在收益有效期内消费的顾客订单金额。'
}
};
}
};
</script>
......
......@@ -3,7 +3,7 @@
<div class="middle">
<div class="item-bg bg-purper center_flex min-w-173">
<div>
<p>计划触达人数<tip /></p>
<p>计划触达人数<tip :text="tipText.planMbrNum" /></p>
<p>{{ formatterNum(data.planMbrNum) }}</p>
</div>
</div>
......@@ -13,7 +13,7 @@
</div>
<div class="item-bg bg-purper center_flex min-w-173">
<div>
<p>实际触达人数<tip /></p>
<p>实际触达人数<tip :text="tipText.touchMbrNum" /></p>
<p>{{ formatterNum(data.touchMbrNum) }}</p>
</div>
</div>
......@@ -23,17 +23,17 @@
</div>
<div class="item-bg bg-green center_flex min-w-214">
<div>
<p>触达顾客转化人数<tip /></p>
<p>触达顾客转化人数<tip :text="tipText.convMbrNum" /></p>
<p>{{ formatterNum(data.convMbrNum) }}</p>
</div>
</div>
<div class="item-bg bg-green min-w-527">
<div>
<p>触达顾客订单数 <tip /></p>
<p>触达顾客订单数 <tip :text="tipText.convOrderCnt" /></p>
<p>{{ formatterNum(data.convOrderCnt) }}</p>
</div>
<div>
<p>触达顾客转化收益(元)<tip /></p>
<p>触达顾客转化收益(元)<tip :text="tipText.convSalesAmt" /></p>
<p>{{ formatterNumAndFixed(data.convSalesAmt) }}</p>
</div>
</div>
......@@ -50,7 +50,8 @@ export default {
data: {
type: Object,
default: () => {}
}
},
tipText: Object
},
mixins: [formatterNum]
};
......
......@@ -3,13 +3,14 @@
<div class="dm-wrap effect">
<div class="title">
<h2>计划整体效果</h2>
<el-link type="primary" :underline="false" style="color: #1890ff" @click="toClue('计划整体')">查看详情<i class="el-icon-arrow-right" style="margin-left: 10px"></i></el-link>
</div>
<touch-charts :type="0" :createTime="$route.query.createTime" />
<market-list v-if="marketListData.length" :isRepeat="isRepeat" :data="marketListData" :isReference="isReference" :batchNum="batchNum" :batchTimes="batchTime" />
<market-list v-if="marketListData.length" :isRepeat="isRepeat" :data="marketListData" :isReference="isReference" :batchNum="batchNum" :batchTimes="batchTime" @toClue="toClue" />
</div>
<card-profit v-if="cardLeadTable.length" :list="cardLead" :tableData="cardLeadTable" />
<batch-send v-if="findTypeIsExist(1) || findTypeIsExist(2) || findTypeIsExist(3)" :task-list="findTypeObj(optionsList, 1)" :tel-traffic-list="findTypeObj(optionsList, 2)" :msg-list="findTypeObj(optionsList, 3)" />
<phone-traffic v-if="findTypeIsExist(4)" :data="findTypeObj(optionsList, 4)" />
<batch-send v-if="findTypeIsExist(1) || findTypeIsExist(2) || findTypeIsExist(3)" :task-list="findTypeObj(optionsList, 1)" :tel-traffic-list="findTypeObj(optionsList, 2)" :msg-list="findTypeObj(optionsList, 3)" @toClue="toClue" />
<phone-traffic v-if="findTypeIsExist(4)" :data="findTypeObj(optionsList, 4)" @toClue="toClue" />
<short-msg v-if="findTypeIsExist(5)" :data="findTypeObj(optionsList, 5)" />
<wechat v-if="findTypeIsExist(6) || findTypeIsExist(7)" :custom-service-data="findTypeObj(optionsList, 6)" :batch-data="findTypeObj(optionsList, 7)" />
</div>
......@@ -59,14 +60,14 @@ export default {
this.getCardLeadTable();
},
methods: {
// toClue(type) {
// let planName = this.$route.query.name;
// let id = this.$route.params.id;
// let createTime = this.$route.query.createTime;
// this.ecmPlanId = id;
// // type 1为导购线索 2为后台线索
// this.$router.push({ path: '/ecm/clue', query: { planName, id, type, createTime } });
// },
toClue(type) {
let planName = this.$route.query.name;
let id = this.$route.params.id;
let createTime = this.$route.query.createTime;
this.ecmPlanId = id;
let effectType = this.$route.query.effectType;
this.$router.push({ path: '/ecm/clue', query: { planName, id, type, createTime, effectType } });
},
// 获取计划整体效果的总数据
getMarketList() {
ecmTouchEffectTable({ ecmPlanId: this.ecmPlanId }).then(res => {
......@@ -138,8 +139,11 @@ export default {
padding: 25px 20px 27px !important;
margin-bottom: 10px !important;
.title {
padding-left: 12px;
margin-bottom: 27px;
padding: 0 37px 0 12px;
margin-bottom: 37px;
display: flex;
align-items: center;
justify-content: space-between;
h2 {
font-size: 16px;
font-family: PingFangSC-Medium, PingFang SC;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment