init
This commit is contained in:
@@ -0,0 +1,536 @@
|
||||
<!-- 话数库 -->
|
||||
<template>
|
||||
<div class="scriptLibary_container" :style="{ 'max-height': maxHeight, height: height,'min-height': minWidth, width: width }">
|
||||
<div class="script_group">
|
||||
<scroll-view scroll-y="true" class="script_group_scroll">
|
||||
<div class="tag_list flex-center" @click="addGroup" v-if="speechArtType == 1">
|
||||
<span class="iconfont"></span>
|
||||
<span class="title_value">分组</span>
|
||||
</div>
|
||||
<div class="tag_list tag_list_group" v-for="(item, index) in tagList" :key="index" :class="{ selectEdTag: cateId == item.id }" @click="selectTags(item)">
|
||||
<div class="tag_list_tag" v-if="cateId == item.id"></div>
|
||||
<div class="tag_list_label">{{ item.name }}</div>
|
||||
</div>
|
||||
</scroll-view>
|
||||
</div>
|
||||
<div class="script_list">
|
||||
<scroll-view scroll-y="true" class="script_list_scroll">
|
||||
<div class="add_script" v-if="speechArtType == 1" @click="addSpeech">
|
||||
<div><span class="iconfont"></span></div>
|
||||
<div><span>添加话术</span></div>
|
||||
</div>
|
||||
<div class="script_list_item" v-for="(item, index) in scriptList" :key="index" @click="selectScript(item)">
|
||||
<div class="script_list_item_label">{{ item.title }}</div>
|
||||
<div class="script_list_item_value line2">{{ item.message }}</div>
|
||||
<div class="edit_box" v-if="speechArtType == 1">
|
||||
<div @click.stop="editSpeech(item)"><span class="iconfont"></span></div>
|
||||
<div @click.stop="handleDeleteServiceSpeechcraft(item)"><span class="iconfont"></span></div>
|
||||
</div>
|
||||
</div>
|
||||
</scroll-view>
|
||||
</div>
|
||||
|
||||
<uni-popup ref="addEdGroup" animation type="center">
|
||||
<div class="addGroup_container">
|
||||
<div class="addGroup_container_title">
|
||||
<div></div>
|
||||
<div>添加话术</div>
|
||||
<div @click="closeAddGroup"><span class="iconfont"></span></div>
|
||||
</div>
|
||||
|
||||
<div class="addGroup_form">
|
||||
<div class="input_box"><input class="inp_title" maxlength="20" v-model="speechData.title" type="text" placeholder="请输入标题名称" /></div>
|
||||
<div class="input_box"><textarea v-model="speechData.message" type="text" placeholder="请输入您的话术"></textarea></div>
|
||||
<div class="button_box" :class="{ canInput: speechData.title && speechData.message }" @click="handleSubmiteditAdd"><div>确定</div></div>
|
||||
</div>
|
||||
</div>
|
||||
</uni-popup>
|
||||
|
||||
<uni-popup ref="addEdUserGroups" animation type="center">
|
||||
<div class="addGroup_container">
|
||||
<div class="addGroup_container_title">
|
||||
<div></div>
|
||||
<div>{{handleGroupTitle}}</div>
|
||||
<div @click="closeUserGroups"><span class="iconfont"></span></div>
|
||||
</div>
|
||||
|
||||
<div class="addGroup_form">
|
||||
<div class="input_box"><input v-model.trim="userGroupData.name" maxlength="4" type="text" placeholder="请输入分组名称" /></div>
|
||||
<div class="input_box"><input v-model="userGroupData.sort" type="text" placeholder="请输入分组排序"></input></div>
|
||||
<div class="button_box" :class="{ canInput: userGroupData.name }" @click="handleSubmitUserGroup"><div>确定</div></div>
|
||||
</div>
|
||||
</div>
|
||||
</uni-popup>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import { Toast, throttle, serialize, Modal, ActionSheet } from 'pages/utils/uniApi.js';
|
||||
import http from 'pages/api/index';
|
||||
import api from 'pages/api/api.js';
|
||||
export default {
|
||||
props: {
|
||||
// 话术库分类
|
||||
speechArtType: {
|
||||
type: Number | String,
|
||||
default: '1'
|
||||
},
|
||||
// 话术检索
|
||||
title: {
|
||||
type: String,
|
||||
default: ''
|
||||
},
|
||||
// 是否展示添加话术
|
||||
icCanEdit: {
|
||||
type: Boolean,
|
||||
default: false
|
||||
},
|
||||
maxHeight: {
|
||||
type: String,
|
||||
default: ''
|
||||
},
|
||||
height: {
|
||||
type: String,
|
||||
default: ''
|
||||
},
|
||||
minWidth: {
|
||||
type: String,
|
||||
default: ''
|
||||
},
|
||||
width: {
|
||||
type: String,
|
||||
default: ''
|
||||
},
|
||||
|
||||
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
// 话术分类
|
||||
tagList: {
|
||||
type: Array,
|
||||
default() {
|
||||
return [];
|
||||
}
|
||||
},
|
||||
scriptList: [],
|
||||
pageData: {
|
||||
page: 1,
|
||||
limit: '200'
|
||||
},
|
||||
cateId: '', // 选中的侧边栏ID
|
||||
speechData: {
|
||||
title: '',
|
||||
message: ''
|
||||
},
|
||||
userGroupData: {
|
||||
name: '',
|
||||
sort: ''
|
||||
},
|
||||
handleAdEdType: 1, // 1新增 2修改
|
||||
handleGroupTitle: '新增分组',
|
||||
groupType: 1, // 1新增 2修改
|
||||
|
||||
};
|
||||
},
|
||||
watch: {
|
||||
speechArtType: {
|
||||
handler(val) {
|
||||
this.selectScriptLibary();
|
||||
// this.getSpeechArtList('init');
|
||||
console.log(this.tagList);
|
||||
}
|
||||
},
|
||||
title: {
|
||||
handler(val) {
|
||||
setTimeout(() => {
|
||||
this.getSpeechArtList();
|
||||
}, 500);
|
||||
}
|
||||
},
|
||||
tagList: {
|
||||
handler(val) {
|
||||
this.getSpeechArtList('init');
|
||||
}
|
||||
}
|
||||
},
|
||||
created() {
|
||||
this.selectScriptLibary();
|
||||
},
|
||||
methods: {
|
||||
// 查询话术类
|
||||
selectScriptLibary() {
|
||||
http(api.kefuServiceCate, {
|
||||
type: this.speechArtType
|
||||
}).then(res => {
|
||||
this.tagList = res.data;
|
||||
this.getSpeechArtList('init');
|
||||
});
|
||||
},
|
||||
// 获取话术列表
|
||||
getSpeechArtList(type = 'select') {
|
||||
if (this.tagList.length) {
|
||||
if (type == 'init') {
|
||||
this.cateId = this.tagList[0].id;
|
||||
}
|
||||
http(api.serviceSpeechcraft, {
|
||||
cate_id: this.cateId,
|
||||
type: this.speechArtType,
|
||||
...this.pageData,
|
||||
title: this.title
|
||||
}).then(res => {
|
||||
this.scriptList = res;
|
||||
this.speechData = {
|
||||
title: '',
|
||||
message: ''
|
||||
}
|
||||
console.log(this.scriptList);
|
||||
});
|
||||
} else {
|
||||
// setTimeout(() => {
|
||||
// this.getSpeechArtList(type);
|
||||
// }, 500);
|
||||
}
|
||||
},
|
||||
// 选择标签
|
||||
selectTags(item) {
|
||||
if(this.cateId == item.id) {
|
||||
console.log(item);
|
||||
this.userGroupData = serialize(item);
|
||||
ActionSheet(['编辑', '删除']).then(res => {
|
||||
console.log(res)
|
||||
switch(res) {
|
||||
case 0:
|
||||
this.groupType = 2;
|
||||
this.handleGroupTitle = '编辑分组';
|
||||
this.$refs.addEdUserGroups.open();
|
||||
break;
|
||||
case 1:
|
||||
Modal('温馨提示', `分组 "${item.name}"将被删除, 请问是否继续?`).then(() => {
|
||||
http(api.deleteServiceCate, item).then(res => {
|
||||
Toast('删除成功');
|
||||
this.selectScriptLibary('init');
|
||||
})
|
||||
})
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
})
|
||||
} else {
|
||||
this.cateId = item.id;
|
||||
this.getSpeechArtList();
|
||||
}
|
||||
},
|
||||
// 选择话术
|
||||
selectScript(item) {
|
||||
this.$emit('sendSpeechMessage', item);
|
||||
},
|
||||
// 添加话术
|
||||
addSpeech() {
|
||||
this.speechData.title = '';
|
||||
this.speechData.message = '';
|
||||
this.handleAdEdType = 1;
|
||||
this.$refs.addEdGroup.open();
|
||||
},
|
||||
// 修改话术
|
||||
editSpeech(item) {
|
||||
this.handleAdEdType = 2;
|
||||
this.speechData = serialize(item);
|
||||
this.$refs.addEdGroup.open();
|
||||
},
|
||||
// 确认新增,修改话术
|
||||
handleSubmiteditAdd() {
|
||||
if (this.handleAdEdType == 1) {
|
||||
this.addSpeechClass();
|
||||
return;
|
||||
}
|
||||
if ((this.handleAdEdType = 2)) {
|
||||
this.editSpeechClass();
|
||||
return;
|
||||
}
|
||||
},
|
||||
// 修改话术事件
|
||||
editSpeechClass() {
|
||||
let canInput = true;
|
||||
console.log(this.speechData);
|
||||
|
||||
Object.keys(this.speechData).forEach(item => {
|
||||
if (!this.speechData.title || !this.speechData.message) {
|
||||
canInput = false;
|
||||
}
|
||||
});
|
||||
|
||||
if (!canInput) {
|
||||
Toast('请将内容填写完整');
|
||||
return;
|
||||
}
|
||||
|
||||
http(api.putServiceSpeechcraft, this.speechData).then(res => {
|
||||
Toast('修改成功');
|
||||
this.getSpeechArtList();
|
||||
this.$refs.addEdGroup.close();
|
||||
});
|
||||
},
|
||||
// 新增话术事件
|
||||
addSpeechClass() {
|
||||
let canInput = true;
|
||||
|
||||
Object.keys(this.speechData).forEach(item => {
|
||||
if (!this.speechData[item]) {
|
||||
canInput = false;
|
||||
}
|
||||
});
|
||||
if (!canInput) {
|
||||
Toast('请将内容填写完整');
|
||||
return;
|
||||
}
|
||||
http(api.postServiceSpeechcraft, {
|
||||
...this.speechData,
|
||||
cate_id: this.cateId
|
||||
}).then(res => {
|
||||
Toast('新增成功');
|
||||
this.getSpeechArtList();
|
||||
this.$refs.addEdGroup.close();
|
||||
});
|
||||
},
|
||||
// 删除话术
|
||||
handleDeleteServiceSpeechcraft(item) {
|
||||
Modal('温馨提示', `话术"${item.title}"将被删除,请问是否继续?`).then(res => {
|
||||
http(api.deleteServiceSpeechcraft, item).then(res => {
|
||||
Toast('删除成功');
|
||||
this.getSpeechArtList();
|
||||
});
|
||||
});
|
||||
},
|
||||
closeAddGroup() {
|
||||
this.$refs.addEdGroup.close();
|
||||
},
|
||||
// 新增分组
|
||||
addGroup() {
|
||||
this.groupType = 1;
|
||||
this.$refs.addEdUserGroups.open();
|
||||
},
|
||||
// 确定新增 或 修改 分组 1增 2改
|
||||
async handleSubmitUserGroup() {
|
||||
if(this.groupType == 1) {
|
||||
await http(api.serviceCate, {
|
||||
...this.userGroupData
|
||||
}).then(res => {
|
||||
Toast('添加成功');
|
||||
})
|
||||
}
|
||||
|
||||
if(this.groupType == 2) {
|
||||
console.log(this.userGroupData);
|
||||
await http(api.putServiceCate, this.userGroupData).then(res => {
|
||||
Toast('修改成功');
|
||||
this.selectScriptLibary();
|
||||
this.$refs.addEdUserGroups.close();
|
||||
})
|
||||
}
|
||||
|
||||
this.selectScriptLibary();
|
||||
this.$refs.addEdUserGroups.close();
|
||||
this.userGroupData = {
|
||||
name: '',
|
||||
sort: ''
|
||||
}
|
||||
},
|
||||
// 关闭分组弹框
|
||||
closeUserGroups() {
|
||||
this.$refs.addEdUserGroups.close();
|
||||
}
|
||||
}
|
||||
};
|
||||
</script>
|
||||
|
||||
<style lang="less" scoped>
|
||||
.scriptLibary_container {
|
||||
display: flex;
|
||||
overflow: hidden;
|
||||
.script_group {
|
||||
// width: 176rpx;
|
||||
width: 20%;
|
||||
position: fixed;
|
||||
background: #f5f6f9;
|
||||
.script_group_scroll {
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
.tag_list {
|
||||
width: 100%;
|
||||
height: 109rpx;
|
||||
.iconfont {
|
||||
color: #9f9f9f;
|
||||
font-size: 11px;
|
||||
margin-right: 4rpx;
|
||||
}
|
||||
.title_value {
|
||||
color: #9f9f9f;
|
||||
font-size: 13px;
|
||||
position: relative;
|
||||
top: 2rpx;
|
||||
}
|
||||
.tag_list_tag {
|
||||
width: 6rpx;
|
||||
height: 46rpx;
|
||||
background: @primaryColor;
|
||||
opacity: 1;
|
||||
border-radius: 0px 4px 4px 0px;
|
||||
}
|
||||
}
|
||||
|
||||
.flex-center {
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
}
|
||||
|
||||
.tag_list_group {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: flex-start;
|
||||
position: relative;
|
||||
|
||||
.tag_list_label {
|
||||
position: absolute;
|
||||
top: 50%;
|
||||
left: 50%;
|
||||
transform: translate(-50%, -50%);
|
||||
white-space: nowrap;
|
||||
color: #282828;
|
||||
font-size: 13px;
|
||||
font-weight: bold;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.script_list {
|
||||
// flex: 1;
|
||||
width: 80%;
|
||||
position: absolute;
|
||||
right: 0;
|
||||
.add_script {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: flex-end;
|
||||
padding: 0 30rpx;
|
||||
height: 109rpx;
|
||||
}
|
||||
.script_list_scroll {
|
||||
height: 100%;
|
||||
.script_list_item {
|
||||
padding: 25rpx 30rpx;
|
||||
&_label {
|
||||
color: #282828;
|
||||
font-size: 14px;
|
||||
font-weight: bold;
|
||||
}
|
||||
&_value {
|
||||
font-size: 14px;
|
||||
color: #9f9f9f;
|
||||
}
|
||||
}
|
||||
.edit_box {
|
||||
display: flex;
|
||||
justify-content: flex-end;
|
||||
> div {
|
||||
margin-left: 48rpx;
|
||||
}
|
||||
.iconfont {
|
||||
font-size: 16px;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
.selectEdTag {
|
||||
background: #fff !important;
|
||||
.tag_list_label {
|
||||
color: @primaryColor !important;
|
||||
}
|
||||
}
|
||||
|
||||
.addGroup_container {
|
||||
width: 690rpx;
|
||||
background: #fff;
|
||||
border-radius: 12px;
|
||||
&_title {
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
align-items: center;
|
||||
position: relative;
|
||||
padding: 30rpx 30rpx 50rpx 0;
|
||||
.iconfont {
|
||||
font-size: 22px;
|
||||
color: #c8cad0;
|
||||
}
|
||||
> div {
|
||||
flex: 1;
|
||||
text-align: center;
|
||||
}
|
||||
> div:nth-child(3) {
|
||||
text-align: right;
|
||||
}
|
||||
}
|
||||
|
||||
.addGroup_form {
|
||||
padding: 0 30rpx;
|
||||
padding-bottom: 69rpx;
|
||||
.input_box {
|
||||
margin-bottom: 32rpx;
|
||||
background: #f5f5f5;
|
||||
border-radius: 14rpx;
|
||||
|
||||
display: flex;
|
||||
align-items: center;
|
||||
padding: 0 20rpx;
|
||||
input {
|
||||
font-size: 14px;
|
||||
height: 68rpx;
|
||||
}
|
||||
textarea {
|
||||
padding: 8px 0;
|
||||
font-size: 14px;
|
||||
height: 192rpx;
|
||||
}
|
||||
}
|
||||
|
||||
.button_box {
|
||||
margin-top: 60rpx;
|
||||
> div {
|
||||
height: 86rpx;
|
||||
background: #c8cad0;
|
||||
opacity: 1;
|
||||
border-radius: 43px;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
color: #ffffff;
|
||||
}
|
||||
}
|
||||
.canInput {
|
||||
> div {
|
||||
height: 86rpx;
|
||||
background: @primaryColor;
|
||||
opacity: 1;
|
||||
border-radius: 43px;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
color: #ffffff;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
.line2 {
|
||||
display: -webkit-box;
|
||||
overflow: hidden;
|
||||
-webkit-box-orient: vertical;
|
||||
-webkit-line-clamp: 2;
|
||||
}
|
||||
.inp_title {
|
||||
width: 600rpx;
|
||||
}
|
||||
</style>
|
||||
@@ -0,0 +1,176 @@
|
||||
<template>
|
||||
<div class="transfer_container">
|
||||
<div class="transfer_container_title">
|
||||
<div class="transfer_container_title_value"><span>转接客服</span></div>
|
||||
<div class="transfer_container_title_icon" @click="close"><span class="iconfont"></span></div>
|
||||
</div>
|
||||
|
||||
<div class="customerServer_list">
|
||||
<scroll-view scroll-y="true" class="max_height">
|
||||
<div class="customerServer_list_item" v-for="(item, index) in serverList" :key="index" @click="selectCustomerServer(item)">
|
||||
<div class="customerServer_list_item_radio">
|
||||
<div><div v-if="item.select"></div></div>
|
||||
</div>
|
||||
<div class="customerServer_list_item_avar"><image :src="item.avatar" mode=""></image></div>
|
||||
<div class="customerServer_list_item_nickName">
|
||||
<span>{{ item.nickname }}</span>
|
||||
</div>
|
||||
</div>
|
||||
</scroll-view>
|
||||
</div>
|
||||
|
||||
<div class="handle_box" @click="handleSubmit"><div>确定</div></div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import { Toast } from 'pages/utils/uniApi.js';
|
||||
import http from 'pages/api/index';
|
||||
import api from 'pages/api/api.js';
|
||||
export default {
|
||||
props:{
|
||||
userInfo:{
|
||||
type:Object,
|
||||
default:{}
|
||||
}
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
serverList: []
|
||||
};
|
||||
},
|
||||
created() {
|
||||
this.initData();
|
||||
},
|
||||
methods: {
|
||||
// 查询其他客服
|
||||
initData() {
|
||||
http(api.serviceTransferList).then(res => {
|
||||
this.serverList = res.list;
|
||||
this.serverList.forEach(item => {
|
||||
this.$set(item, 'select', false);
|
||||
});
|
||||
console.log(this.serverList);
|
||||
});
|
||||
},
|
||||
// 选择客服
|
||||
selectCustomerServer(item) {
|
||||
if (item.select) {
|
||||
item.select = false;
|
||||
} else {
|
||||
this.serverList.forEach(item => {
|
||||
item.select = false;
|
||||
});
|
||||
item.select = true;
|
||||
}
|
||||
},
|
||||
// 确认转接
|
||||
handleSubmit() {
|
||||
http(api.serviceTransfer, {
|
||||
kefuToUserId: this.serverList.find(item => item.select).user_id, // 转接人id
|
||||
user_id: this.userInfo.id
|
||||
}).then(res => {
|
||||
Toast('转接成功');
|
||||
this.$emit('handleSubmit');
|
||||
});
|
||||
},
|
||||
close() {
|
||||
this.$emit('close');
|
||||
}
|
||||
}
|
||||
};
|
||||
</script>
|
||||
|
||||
<style lang="less" scoped>
|
||||
.transfer_container {
|
||||
padding: 40rpx 0 68rpx 0;
|
||||
background: #fff;
|
||||
border-radius: 12rpx 12rpx 0px 0px;
|
||||
&_title {
|
||||
position: relative;
|
||||
display: flex;
|
||||
justify-content: flex-end;
|
||||
padding: 0 30rpx;
|
||||
&_value {
|
||||
position: absolute;
|
||||
top: 50%;
|
||||
left: 50%;
|
||||
transform: translate(-50%, -50%);
|
||||
color: #282828;
|
||||
font-weight: 600;
|
||||
font-size: 16px;
|
||||
}
|
||||
&_icon {
|
||||
.iconfont {
|
||||
font-size: 22px;
|
||||
color: #c8cad0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.customerServer_list {
|
||||
&_item {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
padding: 0 30px;
|
||||
height: 122rpx;
|
||||
border-bottom: 1px solid #f0f2f7;
|
||||
&_radio {
|
||||
margin-right: 38rpx;
|
||||
> div {
|
||||
width: 34rpx;
|
||||
height: 34rpx;
|
||||
border: 1px solid @primaryColor;
|
||||
border-radius: 50%;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
> div {
|
||||
width: 18rpx;
|
||||
height: 18rpx;
|
||||
background: @primaryColor;
|
||||
border-radius: 50%;
|
||||
}
|
||||
}
|
||||
}
|
||||
&_avar {
|
||||
width: 90rpx;
|
||||
height: 90rpx;
|
||||
border-radius: 6px;
|
||||
overflow: hidden;
|
||||
margin-right: 28rpx;
|
||||
image {
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
}
|
||||
}
|
||||
&_nickName {
|
||||
color: #282828;
|
||||
font-size: 15px;
|
||||
font-weight: bold;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.handle_box {
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
margin-top: 80rpx;
|
||||
> div {
|
||||
width: 690rpx;
|
||||
height: 86rpx;
|
||||
background: #3875ea;
|
||||
opacity: 1;
|
||||
border-radius: 43px;
|
||||
color: #ffffff;
|
||||
font-size: 15px;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
}
|
||||
}
|
||||
}
|
||||
.max_height {
|
||||
max-height: 772rpx;
|
||||
}
|
||||
</style>
|
||||
Reference in New Issue
Block a user