Browse Source

需求挖掘功能

yun
corala 1 year ago
parent
commit
6491b2f54a
9 changed files with 956 additions and 42 deletions
  1. +10
    -1
      pages.json
  2. +636
    -0
      pages/center/Piabodata/requireminingAnalysis.vue
  3. +176
    -9
      pages/center/consumer/consumerDetail.vue
  4. +5
    -2
      pages/center/consumer/index.vue
  5. +3
    -1
      pages/center/records/index.vue
  6. +16
    -18
      pages/index/index.vue
  7. +2
    -2
      pages/login/index.vue
  8. +105
    -6
      pages/mine/details2.vue
  9. +3
    -3
      utils/domain.js

+ 10
- 1
pages.json View File

@@ -484,6 +484,15 @@
"enablePullDownRefresh": true
}
},
{
"path": "Piabodata/requireminingAnalysis",
"style": {
"navigationBarTitleText": "需求挖掘分析",
"navigationBarBackgroundColor": "#FFFFFF",
"navigationBarTextStyle": "black",
"enablePullDownRefresh": true
}
},
{
"path": "records/index",
@@ -629,4 +638,4 @@
"query": "" //启动参数,在页面的onLoad函数里面得到
}]
}
}
}

+ 636
- 0
pages/center/Piabodata/requireminingAnalysis.vue View File

@@ -0,0 +1,636 @@
<template>
<view class="box">
<!-- 选择器 -->
<view class="boxtittab">
<view class="tabbox" @click="timeshow=true">
{{ time }}
<u-icon name="arrow-down" size="24" style="padding-left: 12rpx;"></u-icon>
</view>
<view class="tabbox" @click="deptshow=true">
{{ dept}}
<u-icon name="arrow-down" size="24" style="padding-left: 12rpx;"></u-icon>
</view>
<view class="tabbox" @click="guwenshow=true">
{{ guwen}}
<u-icon name="arrow-down" size="24" style="padding-left: 12rpx;"></u-icon>
</view>
<!-- <view class="tabbox" @click="taptimetuisshow">
{{ huashu}}
<u-icon name="arrow-down" size="24" style="padding-left: 12rpx;"></u-icon>
</view> -->
<!-- <view class="tabbox" @click="screenshow">
更多筛选<u-icon name="arrow-down" size="24" style="padding-left: 12rpx;"></u-icon>
</view> -->
</view>
<view style="width: 100%;height: 20rpx;background: #FAFAFA;"></view>
<view class="boxzonglan" style="min-height: 400rpx;">
<view class="zonglantitle">简报 <text @click="showDesc=true">统计说明</text></view>
<view class="zonglanbox">
<view class="grid" v-for="(item,index) in numlist" :key="index">
<view class="audonum">{{item.name}}</view>
<view class="num">{{item.num}}</view>
</view>
</view>
</view>
<!-- 统计说明 -->
<view class="black-bg" v-if="showDesc" >
<view class="tongjiDesc">
<view class="tongji-title">统计说明</view>
<view class="text">
<view><text class="bold">平均需求挖掘率:</text>筛选时间内,有效接待中已标记顾问的需求挖掘执行率的平均值;</view>
<view><text class="bold">未标记:</text>筛选时间内,有效接待中未标记顾问的接待数;</view>
<view><text class="bold">有效接待:</text>筛选时间内,标记为有效的接待数,不包含待接单;</view>
<view><text class="bold">未挖掘需求数:</text>筛选时间内,需求挖掘平均执行率未0 的需求数;</view>
</view>
</view>
<view class="close" @click="showDesc=false">X</view>
</view>
<view style="width: 100%;height: 20rpx;background: #FAFAFA;"></view>
<view class="single">
<view class="title">
<view class="title1">平均需求挖掘率趋势</view>
</view>
<view class="uchaserbox">
<qiun-data-charts type="line" :chartData="lineOptsect" :opts="lineOpts" background="none"
:ontouch="true" canvasId="wangxiaohuaerlingilingwuyiba1" :canvas2d="true" />
</view>
</view>
<view style="width: 100%;height: 20rpx;background: #FAFAFA;"></view>
<view class="single">
<view class="title">
<view class="title1">平均需求挖掘分布</view>
</view>
<view class="uchaserbox">
<qiun-data-charts
type="ring"
:chartData="ringChartData"
:canvas2d="true"
:canvasId="ChartBoxIdwangxiaohuaerlingilingwuyiba1"
:opts='opts'
background="none" />
</view>
</view>
<view style="width: 100%;height: 20rpx;background: #FAFAFA;"></view>
<view class="single">
<view class="title">
<view class="title1">需求挖掘排名</view>
</view>
<view class="tabdada">
<view class="tabth">
<view>排名</view>
<view>需求类型/挖掘执行接待数</view>
<view>执行率</view>
<view>操作</view>
</view>
<view v-if="total==0" style="color: #999999;width: 100%;height: 500rpx;line-height: 500rpx;text-align: center;" >暂无数据</view>
<view class="tabtd" v-for="(item,i) in sortList" :key="i">
<view>
<image v-if="i==0" class="ranking" src="../../../static/images/ranking1.png" mode=""></image>
<image v-else-if="i==1" class="ranking" src="../../../static/images/ranking2.png" mode=""></image>
<image v-else-if="i==2" class="ranking" src="../../../static/images/ranking3.png" mode=""></image>
<view class="ranking1" v-else>{{i+1}}</view>
</view>
<view class="u-line-1">{{item.name}}({{item.selected}})</view>
<view>{{item.fraction}}%</view>
<view @click="Toview(item,i)">查看</view>
</view>
</view>
</view>
<u-popup v-model="timeshow" mode="bottom">
<view class="timeview" :style="{ color: activeTotal == 4 ? '#2B6EFF' : '#333333' }"
@click="tabtimetap(4, '近7天')">
近7天</view>
<view class="timeview" :style="{ color: activeTotal == 5 ? '#2B6EFF' : '#333333' }"
@click="tabtimetap(5, '近15天')">
近15天</view>
<view class="timeview" :style="{ color: activeTotal == 6 ? '#2B6EFF' : '#333333' }"
@click="tabtimetap(6, '近30天')">
近30天</view>
<view class="timeview" :style="{ color: activeTotal == 3 ? '#2B6EFF' : '#333333' }" @click="tabtimetap(3,'自定义')">
自定义</view>
</u-popup>
<u-calendar v-model="calendarShow" mode="range" @change="calendarTimeChange"></u-calendar>
<u-select v-model="guwenshow" :list="staffList" @confirm="staffSelectCallback($event,0)"
:default-value='selindex'></u-select>
<u-select v-model="deptshow" :list="teamList" @confirm="staffSelectCallback($event,1)"
:default-value='selindex'></u-select>
<!-- 加载组件 -->
<loading v-model="LOADING"></loading>
</view>
</template>

<script>
var app = getApp();
var config = require("../../../config");
import loading from "@/components/loading/index.vue"
export default {
components: {
loading
},
data() {
return {
selindex: '',
guwenshow: false,
timeshow: false,
selectshow: false,
deptshow: false,
deptVal: '',
guwenVal: '',
// 筛选文字展示
time: '近7天',
dept: '部门',
guwen: '顾问',
huashu: '话术',
showDesc: false,
sortList: [],
ringChartData: {
},
// ring图 分布图
opts: {
rotate: false,
rotateLock: false,
color: ["#1890FF","#91CB74","#FAC858","#EE6666"],
padding: [5,5,5,5],
dataLabel: true,
legend: {
show: true,
position: "right",
lineHeight: 25
},
title: {
name: "",
fontSize: 15,
color: "#666666"
},
subtitle: {
name: "",
fontSize: 25,
color: "#7cb5ec"
},
extra: {
ring: {
ringWidth: 60,
activeOpacity: 0.5,
activeRadius: 10,
offsetAngle: 0,
labelWidth: 15,
border: false,
borderWidth: 3,
borderColor: "#FFFFFF"
}
}
},
activeTotal: 4,
houseId: '',
// 员工列表
staffList: [],
// 团队列表
teamList: [],
team: {
value: '',
label: ''
},
startDate: '',
endDate: '',
calendarShow: false,
activeTab: 0,
numlist: [{
name: '平均需求挖掘率',
num: '',
setName: 'wordFraction'
}, {
name: '未挖掘需求',
num: '',
setName: 'noFinishWord'
},
{
name: '有效接待',
num: '',
setName: 'activeCustomer'
},
{
name: '未标记',
num: '',
setName: 'markAdvisor'
},
],
lineOptsect: {
"categories": [],
"series": [{
"name": "第一段",
"data": []
},{
"name": "第二段",
"data": []
}
]
},
Theteamcomparedisshow: false,
Groupcontrastisshow: false,
allList: [],
lineOpts: {
yAxis: {
data: [{
max: 100,
min: 0,
}]
}
},
};
},
onShow() {
// this.LOADING = true
// 获取项目id
this.houseId = uni.getStorageSync('buildingID').id;
// 获取员工
this.getStaffList()
// 获取团队
this.getSectionList()
this.getdata()
},
onReady: function(){
this.getRingData()
},
onPullDownRefresh() {
},
methods: {
getdata(){
// 需求挖掘分析-简报
this.wordMiningAnalyze()
// 挖掘趋势图
this.getwordMiningAnalyzePercentage()
//需求挖掘排行
this.getwordMiningRank()
},
// 需求挖掘排行
getwordMiningRank(){
this.$u.post('/cusLvStatistics/wordMiningRank', {
houseId: this.houseId,
"dateType":this.activeTotal,
"firstStartDate":!this.activeTotal?this.startDate:'',
"firstEndDate":!this.activeTotal?this.endDate:''
})
.then(res => {
console.log(res)
if(res.length){
this.sortList = res.map(item=>{
return {
name: item.name,
id: item.id,
fraction: item.fraction,
selected: item.selected
}
})
}
})
},
// 需求挖掘分布图
getRingData(){
this.$u.post('/cusLvStatistics/wordMiningAnalyzeFenbu', {
houseId: this.houseId,
"firstStartDate":!this.activeTotal?this.startDate:'',
"firstEndDate":!this.activeTotal?this.endDate:'',
"dateType":this.activeTotal
})
.then(res => {
console.log(res)
this.ringChartData = { series: [
{
data: [
{"name":"30%以下","value":res.a},
{"name":"30%~50%","value":res.b},
{"name":"50%~70%","value":res.c},
{"name":"70%以上","value":res.d},
]
}
]}
})
},
Toview(){
//跳转到接待记录
uni.navigateTo({
url: '/pages/center/records/index'
});
},
// 需求挖掘分析-简报
wordMiningAnalyze() {
let params = {
"houseId":this.houseId,
"deptId":this.deptVal,
"userId":this.guwenVal,
"dateType": this.activeTotal,
"firstStartDate":!this.activeTotal?this.startDate:'',
"firstEndDate":!this.activeTotal?this.endDate:''
}
this.$u.post("/cusLvStatistics/wordMiningAnalyze",params).then(res => {
console.log(res.contrast)
res.contrast.wordFraction = (res.contrast.fraction || 0) + '%'
this.numlist.forEach(item => {
item.num = res.contrast[item.setName]
})
})
},
// 获取员工列表
getStaffList() {
this.$u.post('/cusLvStatistics/selectAllAccountIdByHouseId', {
houseId: this.houseId
})
.then(res => {
// console.log(res)
if(res.length){
this.staffList = res.map(item => {
return {
label: item.name,
value: item.accountId
}
})
}
})
},
// 需求挖掘率趋势图
getwordMiningAnalyzePercentage() {
this.$u.post('/cusLvStatistics/wordMiningAnalyzePercentage', {
houseId: this.houseId,
"dateType": this.activeTotal,
"firstStartDate":!this.activeTotal?this.startDate:'',
"firstEndDate":!this.activeTotal?this.endDate:''
})
.then(res => {
let categories1 = []
let categories2 = []
if(res.first&&res.first.length){
categories1 = res.first.map(item=> item.statDate.substring(0,10))
this.lineOptsect.series[0].data=res.first.map(item=> item.wordFraction)
}else{
categories1= []
this.lineOptsect.series[0] = []
}
if(res.end&&res.end.length){
this.lineOptsect.series[1].data=res.end.map(item=> item.wordFraction)
categories2 = res.end.map(item => item.statDate.substring(0,10))
}else{
categories2 = []
}
let categories3 =[]
categories1.forEach(item1=>{
categories2.forEach(item2=>{
categories3.push(item1+ 'vs' + item2)
})
})
this.lineOptsect.categories = categories3
console.log(this.lineOptsect.categories)
})
},
// 获取团队列表
getSectionList() {
this.$u.post('/cusLvStatistics/findAllDeptIdByHouseId', {
houseId: this.houseId
})
.then(res => {
this.teamList = []
if(res.length){
this.teamList = res.map(item=> {
return {
label: item.deptName,
value: item.deptId
}
})
}
})
},
//时间切换
tabtimetap(index, text) {
if (index == 3) {
this.calendarShow = true;
this.activeTotal = null
} else {
this.activeTotal = index;
this.endDate = ''
this.startDate = ''
this.time = text
}
this.timeshow = false
this.getdata()
},
staffSelectCallback(e, idx) {
if (idx == 0) {
this.guwenVal = e[0].value
this.guwen = e[0].label
} else { // 部门
this.dept = e[0].label
this.deptVal = e[0].value
}
this.getdata()

},
//自定义时间
calendarTimeChange(e) {
// console.log(e.startDate, e.endDate)
this.activeTotal = null;
this.endDate = e.endDate
this.startDate = e.startDate
this.time = '自定义'
this.getdata()
}
}
};
</script>
<style lang="scss" scoped>
.box {
width: 100%;
height: 100%;
background: #FAFAFA;
}
//时间切换的样式
.boxtittab {
position: sticky;
top: var(--window-top);
z-index: 999;
width: 100;
height: 92rpx;
background: #FFFFFF;
border: 1px solid #E0E0E0;
display: flex;
align-items: center;

.tabbox {
flex: 1;
height: 100%;
text-align: center;
line-height: 92rpx;
color: #666666;
font-size: 28rpx;
overflow: hidden;
text-overflow: ellipsis;
display: -webkit-box;
/* 将对象作为弹性伸缩盒子模型显示 */
-webkit-line-clamp: 1;
/* 控制最多显示几行 */
-webkit-box-orient: vertical;
/* 设置或检索伸缩盒对象的子元素的排列方式 */
}
}
.timeview {
height: 80rpx;
line-height: 80rpx;
width: 100%;
text-align: center;
border-bottom: 1px solid #F8F8F8;
}
.black-bg{
position: fixed;
background: rgba(0,0,0,0.6);
left: 0;
right: 0;
top: 0;
bottom: 0;
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
z-index: 9999;
.tongjiDesc{
width: 80%;
background: #FFFFFF;
border-radius: 4rpx;
padding: 30rpx;
}
.close{
background: #fff;
border-radius: 50%;
width: 80rpx;
height: 80rpx;
margin-top: 30rpx;
display: flex;
justify-content: center;
align-items: center;
}
.tongji-title{
text-align: center;
font-size: 30rpx;
margin-bottom: 20rpx;
}
.text view{
margin-bottom: 24rpx;
}
.bold{
font-weight: bold;
}
}

.grid:nth-child(1) {
border-right: none;
border-bottom: none;
}

.grid:nth-child(2) {
border-bottom: none;
}

.grid:nth-child(3) {
border-right: none;
}
.zonglantitle{
display: flex;
justify-content: space-between;
align-items: center;
text{
color: #666666;
}
}

.uchaserbox{
width: 100%;
height: 500rpx;
}
.tabdada {
width: 100%;
height: 580rpx;
overflow-y: auto;
padding-bottom: 20rpx;
.tabth {
width: 100%;
height: 28rpx;
display: flex;
font-size: 28rpx;
line-height: 28rpx;
color: #666666;
margin-top: 28rpx;
}

.tabth>view:nth-of-type(1) {
width: 10%;
text-align: center;
}

.tabth>view:nth-of-type(2) {
width: 46%;
text-align: center;
}

.tabth>view:nth-of-type(3) {
width: 22%;
text-align: center;
}

.tabth>view:nth-of-type(4) {
width: 22%;
text-align: center;
}

.tabtd {
width: 100%;
height: 30rpx;
display: flex;
font-size: 26rpx;
line-height: 30rpx;
margin-top: 32rpx;
}

.tabtd>view:nth-of-type(1) {
width: 10%;
text-align: center;
line-height: 30rpx;
}

.tabtd>view:nth-of-type(2) {
width: 46%;
max-width: 400rpx;
text-align: center;
color: #333333;
}

.tabtd>view:nth-of-type(3) {
width: 22%;
text-align: center;
color: #333333;
}

.tabtd>view:nth-of-type(4) {
width: 22%;
text-align: center;
color: #2671E2;
}

.ranking {
width: 34rpx;
height: 34rpx;
}
.ranking1 {
width: 30rpx;
height: 30rpx;
background: #ECF1FF;
color: #424D64;
font-size: 18rpx;
text-align: center;
line-height: 30rpx;
border-radius: 50%;
margin: 0 auto;
}

.tabech {
width: 100%;
height: 600rpx;
}
}
</style>

+ 176
- 9
pages/center/consumer/consumerDetail.vue View File

@@ -35,7 +35,10 @@
</view>
</view>
<view class="content-sec-lab">
顾问姓名:<view class="content-sec-lab1">{{customerInfo.ownerName}}</view>
顾问姓名:<view class="content-sec-lab1">{{customerInfo.ownerName||'--'}}</view>
</view>
<view class="content-sec-lab">
需求挖掘:<view class="content-sec-lab1">{{customerInfo.wordFraction||0}}%</view>
</view>
<view class="content-sec-lab">
添加时间:<view class="content-sec-lab1">{{customerInfo.createTime}}</view>
@@ -141,7 +144,12 @@

<!-- 评分 -->
<view class="ratecenter" v-if="activeTotal==2">
<view class="ratetetle">执行总览</view>
<view class="my-tab">
<view class="tab-item" :class="tabactive==0?'tabactive':''" @click="tabactive=0">销讲执行率</view>
<view class="tab-item" :class="tabactive==1?'tabactive':''" @click="tabactive=1">需求挖掘执行率</view>
</view>
<view class="xiaojiang" v-if="tabactive==0">
<view class="ratetetle">执行总览</view>
<view class="rateyuanbox">
<view class="rateyuanboxzuo">
<view class="boxzuoview cccccc">{{customerInfo.visitRecord || '--'}}次</view>
@@ -193,7 +201,7 @@
</view>
<view class="hhhbox" v-if="item.show" v-for="(subitem,i) in item.children" :key="i">
<view class="Level2che" @click="changeshow2(subitem,1)">
<view class="title1">{{subitem.name}}</view>
<view class="title1 u-line-1">{{subitem.name}}</view>
<view class="leve1-jindu">
<view class="zhixing" v-if="!subitem.selected">已执行</view>
<view class="zhixing2" v-else>未执行</view>
@@ -211,12 +219,113 @@
<view class="jiantobox">
<image v-if="che.selected==0" class="arrow" src="/static/images/rate-checked.png"
mode="" />
<image v-if="che.selected==1" class="arrow" src="/static/images/rate-nocheck.png"
mode="" />
</view>
</view>
<view v-if="subitem.show" style="width: 100%;height: 30rpx;"></view>
</view>
</view>

</view>
<view class="xuqiu" v-if="tabactive==1">
<view class="ratetetle">执行总览</view>
<view class="rateyuanbox">
<view class="rateyuanboxzuo">
<view class="boxzuoview cccccc">{{customerInfo.visitRecord || '--'}}次</view>
<view style="color: #333333;font-size: 28rpx;font-weight: 400;text-align: center;">到访次数</view>
</view>
<view class="rateyuanboxyou">
<view class="boxzuoview" style="width: 100%;display: flex;justify-content: center;">
<u-circle-progress active-color="#4FC78F" width='139' :percent="customerInfo.wordFraction||0">
<view style="text-align: center;color: #4FC78F;">{{customerInfo.wordFraction||0}}%</view>
</u-circle-progress>
</view>
<view style="color: #333333;font-size: 28rpx;font-weight: 400;text-align: center;">需求挖掘执行率</view>
</view>
<view class="rateyuanboxzuo">
<view class="boxzuoview cccccc">{{customerInfo.mm}}min</view>
<view style="color: #333333;font-size: 28rpx;font-weight: 400;text-align: center;">接待时长</view>
</view>
</view>
<view
style="width: 100%;height: 80rpx;border-bottom: 1rpx solid #E0E0E0;display: flex;align-items: center;">
<view style="flex: 1;font-size: 28rpx;color: #333333;font-weight: 600;text-indent: 20rpx;">指标</view>
<view style="flex: 1;font-size: 28rpx;color: #333333;font-weight: 600;text-indent: 170rpx;">执行率
</view>
</view>
<!-- 暂无数据 -->
<view v-if="KeyWordsfractionList.length==0" style="width: 100%;height: 100%;display: flex;align-items: center;">
<view style="width: 100%;padding-top: 60rpx;">
<view style="width: 100%;text-align: center;">
<image style="width: 220rpx;height: 200rpx;"
src="https://static.quhouse.com/zhikong_xcx_img/nodatalist.png" mode=""></image>
</view>
<view style="text-align: center;width: 100%;margin-top: 20rpx;color: #999999;">暂无数据</view>
</view>
</view>
<!-- 挖掘执行话术展示 -->
<view class="Level-box" v-else v-for="(item,index) in KeyWordsfractionList" :key="index">
<view class="Level1che" @click="changeshowlevel1(item,1)">
<view class="title1">{{item.name}}</view>
<view class="leve1-jindu">
<view class="jindutiao">
<view class="huanxing" :style="{width: item.fraction||0 +'%'}"></view>
<view class="text">{{item.fraction||0}}%</view>
</view>
</view>
<view class="jiantobox">
<image v-if="!item.show" class="arrow rotatearrow" src="/static/images/down.png" mode="" />
<image v-else class="arrow" src="/static/images/up.png" mode="" />
</view>
</view>
<!-- 话术在一级下 -->
<view v-if="item.showLevel==1">
<view class="hhhbox" v-if="item.show" style="padding: 30rpx;">
<view class="hsnrtest">话术内容</view>
<view class="Level3che" @tap="clickaudeopal(che)"
v-for="(che,inc) in item.questionList" :key='inc'>
<view class="title1">{{inc+1}}.{{che.question}}</view>
<view class="jiantobox">
<image v-if="che.selected==0" class="arrow" src="/static/images/rate-checked.png"
mode="" />
<image v-else class="arrow" src="/static/images/rate-nocheck.png"
mode="" />
</view>
</view>
</view>
</view>
<!-- 话术在二级下 -->
<view v-if="item.showLevel==2">
<view class="hhhbox" v-if="item.show" v-for="(subitem,i) in item.children" :key="i">
<view class="Level2che" @click="changeshow2(subitem,1)">
<view class="title1 u-line-1">{{subitem.name}}</view>
<view class="leve1-jindu">
<view class="zhixing" v-if="!subitem.selected">已执行</view>
<view class="zhixing2" v-else>未执行</view>
</view>
<view class="jiantobox">
<image v-if="!subitem.show" class="arrow rotatearrow" src="/static/images/down.png"
mode="" />
<image v-else class="arrow" src="/static/images/up.png" mode="" />
</view>
</view>
<view v-if="subitem.show" style="padding: 30rpx 0;">
<view class="hsnrtest">话术内容</view>
<view class="Level3che" @tap="clickaudeopal(che)"
v-for="(che,inc) in subitem.questionList" :key='inc'>
<view class="title1">{{inc+1}}.{{che.question}}</view>
<view class="jiantobox">
<image v-if="che.selected==0" class="arrow" src="/static/images/rate-checked.png"
mode="" />
<image v-else class="arrow" src="/static/images/rate-nocheck.png"
mode="" />
</view>
</view>
</view>
</view>
</view>
</view>
</view>
</view>
</view>

@@ -249,6 +358,7 @@
},
data() {
return {
tabactive: 0,
activeTotal: 0,
customerId: '',
tipshow: false,
@@ -261,6 +371,7 @@
totalRate: [],
ratelist: [],
fllowList: [],
KeyWordsfractionList: [],//需求挖掘话术list
userInfo: {},
buttonisshow: false
}
@@ -288,6 +399,37 @@
this.tabtimetap(0)
},
methods: {
changeshowlevel1(item,type){
console.log(item)
item.show = !item.show
},
// 客户详情需求挖掘话术
getfindKeyWordsBycusId() {
this.$u.get("/cusLvStatistics/findKeyWordsBycusId?cusId=" + this.customerId).then(res => {
console.log(res)
if(res.length){
res.forEach(item=>{
item.show = false
item.children.forEach(obj=>{
obj.show = false
if(obj.questionList.length){
obj.questionList.forEach(subobj=>{
subobj.show =false
})
}
})
if(item.questionList.length){
item.questionList.forEach(obj=>{
obj.show =false
})
}
})
this.KeyWordsfractionList = res
}else{
this.KeyWordsfractionList = []
}
})
},
// 获取到访记录
getVisitList() {
this.$u.get("/customer/findByPhoneAndProject?id=" + this.customerId, ).then(res => {
@@ -328,10 +470,10 @@
this.getFollowList()
} else {
this.getRatelist()
this.getfindKeyWordsBycusId()
}
},
tapThevisiting(item) {
console.log("11111111111111")
uni.showLoading({
title: '加载中',
mask: true
@@ -678,7 +820,7 @@
align-items: center;

.title1 {
flex: 2;
flex: 3;
font-size: 28rpx;
color: #333333;
font-weight: 400;
@@ -798,6 +940,32 @@
background-color: #FFFFFF;
padding-bottom: 30rpx;
width: 100%;
.my-tab{
padding: 20rpx 0;
display: flex;
justify-content: space-around;
align-items: center;
border-bottom: 1px solid #E0E0E0;
.tab-item{
padding: 0 30rpx;
height: 56rpx;
font-size: 28rpx;
font-family: PingFangSC-Regular, PingFang SC;
font-weight: 400;
color: #666666;
line-height: 56rpx;
text-shadow: 0px 1px 0px #E0E0E0;
}
.tabactive{
height: 56rpx;
background: rgba(38, 113, 226, 0.1);
box-shadow: 0px 1px 0px 0px #E0E0E0;
border-radius: 28rpx;
font-weight: 600;
color: #2671E2;
}

}

.ratetetle {
padding: 30rpx;
@@ -841,7 +1009,7 @@

.tab {
height: 88rpx;
border-bottom: 1px solid #E0E0E0;
// border-bottom: 1px solid #E0E0E0;
background: #FFFFFF;
display: flex;
align-items: center;
@@ -941,7 +1109,6 @@
.content-sec {
border-top: 1px solid #E0E0E0;
padding: 0 30rpx;
height: 270rpx;
position: relative;

.content-sec-lab {
@@ -984,7 +1151,7 @@
font-weight: 400;
color: #2671E2;
line-height: 45rpx;
bottom: 15rpx;
bottom: 100rpx;
right: 30rpx;
text-align: center;
}


+ 5
- 2
pages/center/consumer/index.vue View File

@@ -72,14 +72,17 @@

</view>
<view class="content-sec-lab">
顾问姓名:<view class="content-sec-lab1">{{item.agentName}}</view>
顾问姓名:<view class="content-sec-lab1">{{item.agentName||'--'}}</view>
</view>
<view class="content-sec-lab">
需求挖掘:<view class="content-sec-lab1">{{item.wordFraction||0}}%</view>
</view>
<view class="content-sec-lab">
添加时间:<view class="content-sec-lab1">{{item.createTime}}</view>
</view>
<view class="content-sec-num">
<view class="">{{item.visitRecord || '--'}}次到访</view>
<view class="">{{item.fraction || '0'}}% | {{item.mm || '0'}}<text
<view class="">{{item.fraction || 0}}% | {{item.mm || 0}}<text
style="font-size: 24rpx;">min</text></view>
</view>
</view>


+ 3
- 1
pages/center/records/index.vue View File

@@ -78,10 +78,12 @@
<view class="arriveNum">第{{item.visitRecord || "--"}}次接待</view>
</view>
<view class="right">
<!-- {{item.fraction || '0'}}% | {{item.fraction || '0'}}分 -->
{{item.fraction || '0'}}%
</view>
</view>
<view class="content-last">
需求挖掘:{{item.wordFraction|| 0}}%
</view>
<view class="content-last">
{{item.createTime}} | {{item.mm || '0'}} min
</view>


+ 16
- 18
pages/index/index.vue View File

@@ -119,31 +119,25 @@
<view class="realnum">{{realtimeobj.fraction || 0}}%</view>
<view class="realtext">平均执行率</view>
</view>
<view class="real" @click="towajue">
<view class="realnum">{{realtimeobj.wordFraction || 0}}%</view>
<view class="realtext">平均挖掘率</view>
</view>
<view class="real">
<view @click="prohibitedtap(1)" v-if="methodsisshow==true" class="realnum" style="color: red;">
{{realtimeobj.prohibitedCustomer || 0}}
</view>
<view @click="prohibitedtap(1)" v-if="methodsisshow==true" class="realtext">违禁预警</view>
</view>
<view class="real">
<view class="realnum"></view>
<view class="realtext"></view>
</view>

</view>
</view>



<view class="title" style="display: flex;">
<view style="width: 55%;">概览</view>
<view class="cet" style="display: flex;">
<view class="cetview" :class="{ activecllasscet: zhixingcenterindex == 2 }" @click="tabtimeclick(2)">近7天
</view>
<view class="cetview" :class="{ activecllasscet: zhixingcenterindex == 6 }" @click="tabtimeclick(6)">
近30天</view>
<view class="cetview" :class="{ activecllasscet: zhixingcenterindex == 7 }" @click="tabtimeclick(7)">自定义
</view>
<view class="cetview" :class="{ activecllasscet: zhixingcenterindex == 2 }" @click="tabtimeclick(2)">近7天</view>
<view class="cetview" :class="{ activecllasscet: zhixingcenterindex == 6 }" @click="tabtimeclick(6)">近30天</view>
<view class="cetview" :class="{ activecllasscet: zhixingcenterindex == 7 }" @click="tabtimeclick(7)">自定义</view>
</view>
</view>
<view class="real-timebox">
@@ -166,6 +160,10 @@
<view class="realnum">{{Thisweekobj.avgDuration|| 0}}</view>
<view class="realtext">平均接待时长</view>
</view>
<view class="real" @click="towajue">
<view class="realnum">{{Thisweekobj.wordFraction || 0}}%</view>
<view class="realtext">平均挖掘率</view>
</view>
<view class="real" @click="prohibitedtap(2)" v-if="methodsisshow==true">
<view class="realnum" style="color: red;">{{Thisweekobj.prohibitedCustomer || 0}}</view>
<view class="realtext">违禁预警</view>
@@ -174,10 +172,6 @@
<view class="realnum"></view>
<view class="realtext"></view>
</view>
<view class="real">
<view class="realnum"></view>
<view class="realtext"></view>
</view>
</view>
</view>

@@ -193,7 +187,6 @@
</view>
</view>


<!-- 项目切换 -->
<view v-if="Showhiddenunits">
<u-select :mask-close-able="false" v-model="Showhiddenunits" mode="single-column" :list="lpanlist"
@@ -396,6 +389,11 @@
}, 3000)
},
methods: {
towajue(){
uni.navigateTo({
url: "/pages/center/Piabodata/requireminingAnalysis"
})
},
close() {
this.isShowUpdate = false;
},


+ 2
- 2
pages/login/index.vue View File

@@ -41,9 +41,9 @@
export default {
data() {
return {
username: '',
username: '18831048327',//18831048327 ,18888888800
//获取到的用户名的值
password: '',
password: '123456',//123456
//获取到的密码栏中的值
passwordType: true,
agreeChecked: true


+ 105
- 6
pages/mine/details2.vue View File

@@ -241,10 +241,9 @@
</view>
</view>
<view class="pingfenbox">
<view :class="{ activecllasscet: zhixingcenterindex == 0 }" @click="recordclick(0)">销讲总执行率{{totalRate}}%
</view>
<view v-if="methodsisshow==true" :class="{ activecllasscet: zhixingcenterindex == 1 }"
@click="recordclick(1)">禁忌执行</view>
<view :class="{ activecllasscet: zhixingcenterindex == 0 }" @click="recordclick(0)">销讲总执行率{{totalRate}}%</view>
<view v-if="methodsisshow==true" :class="{ activecllasscet: zhixingcenterindex == 1 }" @click="recordclick(1)">禁忌执行</view>
<view :class="{ activecllasscet: zhixingcenterindex == 2 }" @click="recordclick(2)">需求挖掘率</view>
</view>
<view v-if="zhixingcenterindex == 0" class="cenisbox">
<view
@@ -287,6 +286,8 @@
<view class="jiantobox">
<image v-if="che.selected==0" class="arrow" src="/static/images/rate-checked.png"
mode="" />
<image v-else class="arrow" src="/static/images/rate-nocheck.png"
mode="" />
</view>
</view>
<view v-if="subitem.show" style="width: 100%;height: 30rpx;"></view>
@@ -301,6 +302,75 @@
<view v-if="prohibitedlist.length==0" style="width: 100%;text-align: center;margin-top: 60rpx;">暂无数据
</view>
</view>
<view v-if="zhixingcenterindex == 2" class="cenisbox">
<view
style="width: 100%;height: 80rpx;border-bottom: 1rpx solid #E0E0E0;display: flex;align-items: center;">
<view style="flex: 1;font-size: 28rpx;color: #333333;font-weight: 600;text-indent: 20rpx;">指标</view>
<view style="flex: 1;font-size: 28rpx;color: #333333;font-weight: 600;text-indent: 170rpx;">执行率
</view>
</view>
<view class="Level-box" v-for="(item,index) in KeyWordsfractionList" :key="index">
<view class="Level1che" @click="changeshow(item,1)">
<view class="title1">{{item.name}}</view>
<view class="leve1-jindu">
<view class="jindutiao">
<view class="huanxing" :style="{width: item.fraction||0+'%'}"></view>
<view class="text">{{item.fraction||0}}%</view>
</view>
</view>
<view class="jiantobox">
<image v-if="!item.show" class="arrow rotatearrow" src="/static/images/down.png" mode="" />
<image v-else class="arrow" src="/static/images/up.png" mode="" />
</view>
</view>
<!-- 话术在一级下 -->
<view v-if="item.showLevel==1">
<view class="hhhbox" v-if="item.show" style="padding: 30rpx;">
<view class="hsnrtest">话术内容</view>
<view class="Level3che" @tap="clickaudeopal(che)"
v-for="(che,inc) in item.questionList" :key='inc'>
<view class="title1">{{inc+1}}.{{che.question}}</view>
<view class="jiantobox">
<image v-if="che.selected==0" class="arrow" src="/static/images/rate-checked.png"
mode="" />
<image v-else class="arrow" src="/static/images/rate-nocheck.png"
mode="" />
</view>
</view>
</view>
</view>
<!-- 话术在二级下 -->
<view v-if="item.showLevel==2">
<view class="hhhbox" v-if="item.show" v-for="(subitem,i) in item.children" :key="i">
<view class="Level2che" @click="changeshow2(subitem,1)">
<view class="title1 u-line-1">{{subitem.name}}</view>
<view class="leve1-jindu">
<view class="zhixing" v-if="!subitem.selected">已执行</view>
<view class="zhixing2" v-else>未执行</view>
</view>
<view class="jiantobox">
<image v-if="!subitem.show" class="arrow rotatearrow" src="/static/images/down.png"
mode="" />
<image v-else class="arrow" src="/static/images/up.png" mode="" />
</view>
</view>
<view v-if="subitem.show" style="padding: 30rpx 0;">
<view class="hsnrtest">话术内容</view>
<view class="Level3che" @tap="clickaudeopal(che)"
v-for="(che,inc) in subitem.questionList" :key='inc'>
<view class="title1">{{inc+1}}.{{che.question}}</view>
<view class="jiantobox">
<image v-if="che.selected==0" class="arrow" src="/static/images/rate-checked.png"
mode="" />
<image v-else class="arrow" src="/static/images/rate-nocheck.png"
mode="" />
</view>
</view>
</view>
</view>
</view>
</view>
</view>
</view>

<!-- 客户意向 -->
@@ -445,6 +515,7 @@

data() {
return {
KeyWordsfractionList: [],
noClick: true,
kehuyixiangcenterindex: 0,
Acquirecustomerintentlist2: [],
@@ -698,9 +769,10 @@
this.zhixingcenterindex = i;
if (i == 0) {
this.getRatelist()
} else {
console.log('999')
} else if(i==1) {
this.huoqujinji()
}else{
this.getfindKeyWordsBycusId()
}
},
//获取禁忌
@@ -1528,6 +1600,33 @@
changeshow2(item, type) {
item.show = !item.show;
},
// 客户详情需求挖掘话术
getfindKeyWordsBycusId() {
this.$u.get("/cusLvStatistics/findKeyWordsBycusId?cusId=" + this.customerId).then(res => {
console.log(res)
if(res.length){
res.forEach(item=>{
item.show = false
item.children.forEach(obj=>{
obj.show = false
if(obj.questionList.length){
obj.questionList.forEach(subobj=>{
subobj.show =false
})
}
})
if(item.questionList.length){
item.questionList.forEach(obj=>{
obj.show =false
})
}
})
this.KeyWordsfractionList = res
}else{
this.KeyWordsfractionList = []
}
})
},
getRatelist() {
this.$u.get("/customer/findzkMByCusId", {
cusId: this.customerId


+ 3
- 3
utils/domain.js View File

@@ -1,10 +1,10 @@
// http.js使用域名
// const baseUrl = 'http://81.70.55.170:9090/autoSR/api';// 最新测试
const baseUrl = 'http://81.70.55.170:9090/autoSR/api';// 最新测试
// const baseUrl = 'http://192.168.31.148:8080/api';// 泽明
// const baseUrl = 'http://127.0.0.1:8080/autoSR/api'; // 本地
// const baseUrl = 'http://192.168.31.161:8080/autoSR/api'; // 长龙
// const baseUrl = 'http://192.168.31.169:8080/autoSR/api'; // 长龙
// const baseUrl = 'http://192.168.31.90:8080/api'; // 盛浩
const baseUrl = 'https://zkgj.quhouse.com/api'; // 质控正式
// const baseUrl = 'https://zkgj.quhouse.com/api'; // 质控正式
// const baseUrl = 'https://hfju.com/api'; // 数智正式
// const baseUrl = 'https://xitong.pachira.cn/api'; // AI营销辅助 普强使用



Loading…
Cancel
Save