Commit ed6c583e authored by 罗超's avatar 罗超

新增呼叫平台

parent 360f6033
<style>
.info_title {
.info_title {
padding: 0 22px;
margin-bottom: 20px;
flex-shrink: 0;
font-size: 16px;
font-weight: 700;
font-family: Microsoft YaHei, Avenir, Helvetica, Arial, sans-serif !important;
}
}
.customer_info_component {
.customer_info_component {
width: 100%;
}
}
.customer_info_Stage {
.customer_info_Stage {
width: 100%;
padding: 0 7px;
cursor: pointer;
......@@ -21,55 +21,54 @@
width: 100%;
padding: 12px 22px;
justify-content: space-between;
}
}
.stage_label {
.stage_label {
color: #606266;
flex-shrink: 0;
width: 65px;
text-align: right;
}
}
.stage_value {
.stage_value {
text-overflow: ellipsis;
white-space: nowrap;
}
}
.info_content {
.info_content {
margin-bottom: 30px;
}
}
.info_item {
.info_item {
position: relative;
display: flex;
padding: 12px 22px;
align-items: center;
}
}
.item_value {
.item_value {
flex: 1;
font-size: 14px;
word-break: break-all;
overflow: hidden;
}
}
.item_label {
.item_label {
color: #606266;
flex-shrink: 0;
width: 120px;
font-size: 14px;
}
}
.student_require {
.student_require {
color: red;
}
}
.stuHeadImg {
.stuHeadImg {
width: 80px;
height: 80px;
position: relative;
}
}
</style>
<template>
<div>
......@@ -80,10 +79,19 @@
<div class="stage_label">头像</div>
<div class="stage_value">
<div class="stuHeadImg">
<el-upload :before-upload="uploadFile" :multiple="false" action='' :show-file-list="false">
<el-upload
:before-upload="uploadFile"
:multiple="false"
action=""
:show-file-list="false"
>
<q-avatar size="80px" font-size="36px" text-color="white">
<img :src="customObj.StuIcon" v-if="customObj.StuIcon">
<img v-else src="../../../assets/images/administration/litheader.png" alt="" />
<img :src="customObj.StuIcon" v-if="customObj.StuIcon" />
<img
v-else
src="../../../assets/images/administration/litheader.png"
alt=""
/>
</q-avatar>
</el-upload>
</div>
......@@ -96,7 +104,14 @@
<span class="student_require">*</span>客户名称
</div>
<div class="stage_value">
<q-input filled v-model="customObj.StuName" style="width:185px;" ref="StuName" dense :disable="noEdit">
<q-input
filled
v-model="customObj.StuName"
style="width:185px;"
ref="StuName"
dense
:disable="noEdit"
>
</q-input>
</div>
</div>
......@@ -107,31 +122,53 @@
客户电话
</div>
<div class="stage_value">
<q-input filled v-model="customObj.StuTel" style="width:185px;" @blur="CheckExistsStu(1)" ref="StuTel"
:disable="noEdit" dense>
<q-input
filled
v-model="customObj.formatTel"
style="width:185px;"
@blur="CheckExistsStu(1)"
ref="StuTel"
:disable="noEdit"
dense
>
</q-input>
</div>
</div>
</div>
<div class="customer_info_component">
<div class="customer_info_component" v-if="BelongType != 3">
<div class="customer_info_Stage">
<div class="stage_label">
QQ
</div>
<div class="stage_value">
<q-input filled v-model="customObj.QQ" style="width:185px;" @blur="CheckExistsStu(2)" :disable="noEdit"
@keyup.native="checkInteger(customObj,'QQ')" ref="QQ" dense></q-input>
<q-input
filled
v-model="customObj.QQ"
style="width:185px;"
@blur="CheckExistsStu(2)"
:disable="noEdit"
@keyup.native="checkInteger(customObj, 'QQ')"
ref="QQ"
dense
></q-input>
</div>
</div>
</div>
<div class="customer_info_component">
<div class="customer_info_component" v-if="BelongType != 3">
<div class="customer_info_Stage">
<div class="stage_label">
微信号
</div>
<div class="stage_value">
<q-input filled v-model="customObj.WeChatNo" @blur="CheckExistsStu(3)" style="width:185px;" ref="WeChatNo"
:disable="noEdit" dense></q-input>
<q-input
filled
v-model="customObj.WeChatNo"
@blur="CheckExistsStu(3)"
style="width:185px;"
ref="WeChatNo"
:disable="noEdit"
dense
></q-input>
</div>
</div>
</div>
......@@ -141,57 +178,113 @@
<span class="student_require">*</span>客户状态
</div>
<div class="stage_value">
<q-select filled v-model="customObj.StuStage" dense :options="customState" option-label="Name"
:disable="noEdit" style="width:185px;" option-value="Id" emit-value map-options label="客户状态" />
</div>
</div>
</div>
<template v-if="BelongType!=3">
<q-select
filled
v-model="customObj.StuStage"
dense
:options="customState"
option-label="Name"
:disable="noEdit"
style="width:185px;"
option-value="Id"
emit-value
map-options
label="客户状态"
/>
</div>
</div>
</div>
<template v-if="BelongType != 3">
<div class="customer_info_component">
<div class="customer_info_Stage">
<div class="stage_label">
<span class="student_require">*</span>客户来源
</div>
<div class="stage_value">
<q-select filled v-model="customObj.CreateType" @change="clearStuMsg()" style="width:185px;"
:disable="(noEdit || isHaveOrder)" @input="resetStuSource()" dense :options="customFromList"
option-label="Name" option-value="Id" emit-value map-options label="客户来源" />
</div>
</div>
</div>
<div class="customer_info_component" v-if="customObj.CreateType==3">
<q-select
filled
v-model="customObj.CreateType"
@change="clearStuMsg()"
style="width:185px;"
:disable="noEdit || isHaveOrder"
@input="resetStuSource()"
dense
:options="customFromList"
option-label="Name"
option-value="Id"
emit-value
map-options
label="客户来源"
/>
</div>
</div>
</div>
<div class="customer_info_component" v-if="customObj.CreateType == 3">
<div class="customer_info_Stage">
<div class="stage_label">
<span class="student_require">*</span>介绍人
</div>
<div class="stage_value">
<q-select filled v-model="customObj.StuSourceId" style="width:185px;" dense @filter="filterEmployee"
:disable="(noEdit || isHaveOrder)" use-input :options="myEmployeeList" option-label="EmployeeName"
option-value="Id" emit-value map-options />
</div>
</div>
</div>
<div class="customer_info_component" v-if="customObj.CreateType==4">
<q-select
filled
v-model="customObj.StuSourceId"
style="width:185px;"
dense
@filter="filterEmployee"
:disable="noEdit || isHaveOrder"
use-input
:options="myEmployeeList"
option-label="EmployeeName"
option-value="Id"
emit-value
map-options
/>
</div>
</div>
</div>
<div class="customer_info_component" v-if="customObj.CreateType == 4">
<div class="customer_info_Stage">
<div class="stage_label">
<span class="student_require">*</span>转介人
</div>
<div class="stage_value">
<q-select filled v-model="customObj.StuSourceId" style="width:185px;" use-input @filter="filterStudent"
:disable="(noEdit || isHaveOrder)" dense :options="MyTransListData" option-label="StuName"
option-value="StuId" emit-value map-options />
</div>
</div>
</div>
<div class="customer_info_component" v-if="customObj.CreateType==1">
<q-select
filled
v-model="customObj.StuSourceId"
style="width:185px;"
use-input
@filter="filterStudent"
:disable="noEdit || isHaveOrder"
dense
:options="MyTransListData"
option-label="StuName"
option-value="StuId"
emit-value
map-options
/>
</div>
</div>
</div>
<div class="customer_info_component" v-if="customObj.CreateType == 1">
<div class="customer_info_Stage">
<div class="stage_label">
<span class="student_require">*</span>收客渠道
</div>
<div class="stage_value">
<q-select filled v-model="customObj.StuChannel" style="width:185px;" dense :options="StuChannelList"
:disable="(noEdit || isHaveOrder)" option-label="Name" option-value="Id" emit-value map-options
use-input @filter="filterStuChannel">
<q-select
filled
v-model="customObj.StuChannel"
style="width:185px;"
dense
:options="StuChannelList"
:disable="noEdit || isHaveOrder"
option-label="Name"
option-value="Id"
emit-value
map-options
use-input
@filter="filterStuChannel"
>
<template v-slot:no-option>
<q-item>
<q-item-section class="text-grey">
......@@ -203,15 +296,26 @@
</div>
</div>
</div>
<div class="customer_info_component" v-if="customObj.CreateType==2">
<div class="customer_info_component" v-if="customObj.CreateType == 2">
<div class="customer_info_Stage">
<div class="stage_label">
<span class="student_require">*</span>关联同行
</div>
<div class="stage_value">
<q-select filled v-model="customObj.CustomerId" style="width:185px" dense :options="customList" use-input
:disable="(noEdit || isHaveOrder)" @filter="filterFn" option-label="CustomerName"
option-value="CustomerId" emit-value map-options>
<q-select
filled
v-model="customObj.CustomerId"
style="width:185px"
dense
:options="customList"
use-input
:disable="noEdit || isHaveOrder"
@filter="filterFn"
option-label="CustomerName"
option-value="CustomerId"
emit-value
map-options
>
<template v-slot:no-option>
<q-item>
<q-item-section class="text-grey">
......@@ -223,17 +327,27 @@
</div>
</div>
</div>
<template v-if="customObj.CreateType==1">
<div class="info_item" v-if="customObj.StuChannel==6">
<template v-if="customObj.CreateType == 1">
<div class="info_item" v-if="customObj.StuChannel == 6">
<div class="item_label">第三方平台名称</div>
<div class="item_value">
<q-input filled v-model="customObj.PlatformName" dense :disable="noEdit"></q-input>
<q-input
filled
v-model="customObj.PlatformName"
dense
:disable="noEdit"
></q-input>
</div>
</div>
<div class="info_item" v-if="customObj.StuChannel==7">
<div class="info_item" v-if="customObj.StuChannel == 7">
<div class="item_label">其他平台名称</div>
<div class="item_value">
<q-input filled v-model="customObj.PlatformName" dense :disable="noEdit"></q-input>
<q-input
filled
v-model="customObj.PlatformName"
dense
:disable="noEdit"
></q-input>
</div>
</div>
</template>
......@@ -244,8 +358,19 @@
<span class="student_require">*</span>客户类型
</div>
<div class="stage_value">
<q-select filled v-model="customObj.StuType" style="width:185px" dense :options="customTypeList"
:disable="noEdit" option-label="Name" option-value="Id" emit-value map-options label="客户类型" />
<q-select
filled
v-model="customObj.StuType"
style="width:185px"
dense
:options="customTypeList"
:disable="noEdit"
option-label="Name"
option-value="Id"
emit-value
map-options
label="客户类型"
/>
</div>
</div>
</div>
......@@ -255,8 +380,19 @@
客户需求
</div>
<div class="stage_value">
<q-select filled v-model="customObj.StuNeeds" style="width:185px" dense :options="NeedData"
:disable="noEdit" option-label="Name" option-value="Id" emit-value map-options label="客户需求" />
<q-select
filled
v-model="customObj.StuNeeds"
style="width:185px"
dense
:options="NeedData"
:disable="noEdit"
option-label="Name"
option-value="Id"
emit-value
map-options
label="客户需求"
/>
</div>
</div>
</div>
......@@ -266,17 +402,33 @@
<div class="info_item">
<div class="item_label">性别</div>
<div class="item_value">
<q-radio v-model="customObj.StuSex" :val="0" label="男" :disable="noEdit" />
<q-radio v-model="customObj.StuSex" :val="1" label="女" :disable="noEdit" />
<q-radio
v-model="customObj.StuSex"
:val="0"
label="男"
:disable="noEdit"
/>
<q-radio
v-model="customObj.StuSex"
:val="1"
label="女"
:disable="noEdit"
/>
</div>
</div>
<div class="info_item studentDate">
<div class="item_label">出生日期</div>
<div class="item_value">
<q-field filled dense>
 <template v-slot:control>
<el-date-picker v-model="customObj.StuBirth" size="mini" style="width:150px" type="date"
:disabled="noEdit" placeholder="选择日期">
<template v-slot:control>
<el-date-picker
v-model="customObj.StuBirth"
size="mini"
style="width:150px"
type="date"
:disabled="noEdit"
placeholder="选择日期"
>
</el-date-picker>
</template>
</q-field>
......@@ -286,28 +438,60 @@
<div class="info_item">
<div class="item_label">日语基础</div>
<div class="item_value">
<q-select filled v-model="customObj.JapanBaseInfo" dense :options="basicList" option-label="Name"
:disable="noEdit" option-value="Id" emit-value map-options />
<q-select
filled
v-model="customObj.JapanBaseInfo"
dense
:options="basicList"
option-label="Name"
:disable="noEdit"
option-value="Id"
emit-value
map-options
/>
</div>
</div>
<div class="info_item">
<div class="item_label">职业</div>
<div class="item_value">
<q-input filled v-model="customObj.StuProfession" dense :disable="noEdit"></q-input>
<q-input
filled
v-model="customObj.StuProfession"
dense
:disable="noEdit"
></q-input>
</div>
</div>
<div class="info_item">
<div class="item_label">学历</div>
<div class="item_value">
<q-select filled v-model="customObj.StuEducation" dense :options="educationList" option-label="Name"
:disable="noEdit" option-value="Id" emit-value map-options />
<q-select
filled
v-model="customObj.StuEducation"
dense
:options="educationList"
option-label="Name"
:disable="noEdit"
option-value="Id"
emit-value
map-options
/>
</div>
</div>
<div class="info_item">
<div class="item_label">学习目的</div>
<div class="item_value">
<q-select filled v-model="customObj.StuPurpose" dense :options="goalsList" option-label="Name"
:disable="noEdit" option-value="Id" emit-value map-options />
<q-select
filled
v-model="customObj.StuPurpose"
dense
:options="goalsList"
option-label="Name"
:disable="noEdit"
option-value="Id"
emit-value
map-options
/>
</div>
</div>
<!-- <div class="info_item">
......@@ -318,22 +502,27 @@
</div>
</div> -->
<div class="info_item" v-if="!noEdit">
<q-btn color="accent" class="q-mr-md" label="保存" @click="saveStu()" />
<q-btn
color="accent"
class="q-mr-md"
label="保存"
@click="saveStu()"
/>
</div>
</div>
</div>
</div>
</template>
<script>
import {
import {
getStudentInfo, //获取学员客户信息
queryStuStageList, //获取客户阶段列表
saveStudent, //保存学员信息
GetStudentTypeList,
getStudentDorpDownList,
GetNeedsList
} from '../../../api/school/index';
import {
} from "../../../api/school/index";
import {
getGuestBasicsEnumList,
getGuestEducationEnumList,
getGuestLearningGoalsEnumList,
......@@ -341,25 +530,18 @@
CreateTypeList,
CheckExistsStu,
GetCustomerList
} from '../../../api/sale/sale'
import {
queryEmployee
} from '../../../api/users/user'
import {
queryStuOrderPage, //学员订单分页列表
} from '../../../api/customerstudent/customerstudent';
import {
UploadSelfFile
} from '../../../api/common/common'
} from "../../../api/sale/sale";
import { queryEmployee } from "../../../api/users/user";
import {
queryStuOrderPage //学员订单分页列表
} from "../../../api/customerstudent/customerstudent";
import { UploadSelfFile } from "../../../api/common/common";
export default {
export default {
meta: {
title: "学员管理"
},
components: {
},
components: {},
props: {
stuData: {
type: Object,
......@@ -383,30 +565,30 @@
//客户阶段状态列表
customState: [],
customMsg: {
StuId: 0,
StuId: 0
},
//客户对象
customObj: {
StuId: 0,
StuIcon: '', //学院头像
StuName: '', //客户名称
StuTel: '', //客户电话
CreateType: '', //客户来源
StuSourceId: '', //介绍人
StuChannel: '', //收客渠道
PlatformName: '', //平台名称
StuIcon: "", //学院头像
StuName: "", //客户名称
StuTel: "", //客户电话
CreateType: "", //客户来源
StuSourceId: "", //介绍人
StuChannel: "", //收客渠道
PlatformName: "", //平台名称
StuSex: 0, //性别
StuBirth: '', //出生日期
StuStage: '', //客户阶段状态
JapanBaseInfo: '', //日语基础
StuProfession: '', //职业
StuEducation: '', //学历
StuPurpose: '', //学习目的
CreateBy: '', //创建人
StuBirth: "", //出生日期
StuStage: "", //客户阶段状态
JapanBaseInfo: "", //日语基础
StuProfession: "", //职业
StuEducation: "", //学历
StuPurpose: "", //学习目的
CreateBy: "", //创建人
CustomerId: 0, //关联同行
QQ: '', //qq
WeChatNo: '', //微信号
StuType: '', //客户类型
QQ: "", //qq
WeChatNo: "", //微信号
StuType: "", //客户类型
StuNeeds: 0 //客户需求
},
//日语基础列表
......@@ -429,17 +611,16 @@
MyTransListData: [],
checkMsg: {
StuId: 0,
StuTel: '',
QQ: '',
WeChatNo: ''
StuTel: "",
QQ: "",
WeChatNo: ""
},
NeedData: [],
noEdit: false,
isHaveOrder: false
}
};
},
created() {
this.getStuStageList();
this.getBasicList();
this.queryGuestEducationEnumList();
......@@ -456,13 +637,12 @@
this.customMsg.StuId = this.saveObj.StuId;
this.checkMsg.StuId = this.saveObj.StuId;
if (this.saveObj.noEdit && this.saveObj.noEdit == true) {
this.noEdit = true
this.noEdit = true;
}
}
if (this.BelongType == 3) {
this.noEdit = true
this.noEdit = true;
}
},
watch: {
stuData() {
......@@ -483,110 +663,114 @@
if (res.Code == 1) {
this.NeedData = res.Data;
}
})
});
},
//保存学员信息
saveStu() {
if (this.customObj.StuName == '') {
if (this.customObj.StuName == "") {
this.$q.notify({
type: 'negative',
type: "negative",
position: "top",
message: `请输入客户名称`
})
return
});
return;
}
if (this.customObj.StuTel == '' && this.customObj.QQ == '' && this.customObj.WeChatNo == '') {
if (
this.customObj.StuTel == "" &&
this.customObj.QQ == "" &&
this.customObj.WeChatNo == ""
) {
this.$q.notify({
type: 'negative',
type: "negative",
position: "top",
message: `请输入电话QQ微信至少一个`
})
return
});
return;
}
if (this.customObj.CreateType == '') {
if (this.customObj.CreateType == "") {
this.$q.notify({
type: 'negative',
type: "negative",
position: "top",
message: `请选择客户来源`
})
return
});
return;
}
if (this.customObj.CreateType == 1 && !this.customObj.StuChannel) {
this.$q.notify({
type: 'negative',
type: "negative",
position: "top",
message: `请选择收客渠道`
})
return
});
return;
}
if (this.customObj.CreateType == 2 && !this.customObj.CustomerId) {
this.$q.notify({
type: 'negative',
type: "negative",
position: "top",
message: `请选择关联同行`
})
return
});
return;
}
if (this.customObj.CreateType == 3 && !this.customObj.StuSourceId) {
this.$q.notify({
type: 'negative',
type: "negative",
position: "top",
message: `请选择介绍人`
})
return
});
return;
}
if (this.customObj.CreateType == 4 && !this.customObj.StuSourceId) {
this.$q.notify({
type: 'negative',
type: "negative",
position: "top",
message: `请选择转介人`
})
return
});
return;
}
if (this.customObj.StuStage == '') {
if (this.customObj.StuStage == "") {
this.$q.notify({
type: 'negative',
type: "negative",
position: "top",
message: `请选择客户状态`
})
return
});
return;
}
if (this.customObj.StuType == '') {
if (this.customObj.StuType == "") {
this.$q.notify({
type: 'negative',
type: "negative",
position: "top",
message: `请选择客户类型`
})
return
});
return;
}
if (this.customObj.StuTel != '') {
if (this.customObj.StuTel != "") {
var myreg = /^[1][3-9][\d]{9}/;
if (!myreg.test(this.customObj.StuTel)) {
this.$q.notify({
type: 'negative',
type: "negative",
position: "top",
message: `请输入正确的电话号码`
})
return
});
return;
}
}
saveStudent(this.customObj).then(res => {
if (res.Code == 1) {
this.$q.notify({
icon: 'iconfont icon-chenggong',
color: 'accent',
icon: "iconfont icon-chenggong",
color: "accent",
timeout: 2000,
message: '数据保存成功!',
position: 'top'
})
this.$emit('update');
this.$emit('success');
this.$emit('getrecord');
message: "数据保存成功!",
position: "top"
});
this.$emit("update");
this.$emit("success");
this.$emit("getrecord");
if (this.AddType == 1) {
this.$emit('close');
this.$emit("close");
}
}
})
});
},
//获取员工列表
getEmployeeList() {
......@@ -595,7 +779,7 @@
}).then(res => {
this.employeeList = res.Data;
this.myEmployeeList = res.Data;
})
});
},
//获取收客渠道
GetStuChannelList() {
......@@ -604,17 +788,19 @@
this.StuChannelList = res.Data;
this.allStuChannelList = res.Data;
}
})
});
},
//筛选渠道
filterStuChannel(val, update, ) {
filterStuChannel(val, update) {
update(() => {
if (val === "") {
this.StuChannelList = JSON.parse(JSON.stringify(this.allStuChannelList));
this.StuChannelList = JSON.parse(
JSON.stringify(this.allStuChannelList)
);
} else {
const needle = val.toLowerCase();
this.StuChannelList = this.allStuChannelList.filter(
(v) => v.Name.toLowerCase().indexOf(needle) > -1
v => v.Name.toLowerCase().indexOf(needle) > -1
);
}
});
......@@ -631,7 +817,7 @@
getBasicList() {
getGuestBasicsEnumList({}).then(res => {
this.basicList = res.Data;
})
});
},
//获取客户来源
getCustomFrom() {
......@@ -639,37 +825,37 @@
if (res.Code == 1) {
this.customFromList = res.Data;
}
})
});
},
//获取学历列表
queryGuestEducationEnumList() {
getGuestEducationEnumList({}).then(res => {
this.educationList = res.Data;
})
});
},
//获取学习目的列表
queryGoalsList() {
getGuestLearningGoalsEnumList({}).then(res => {
this.goalsList = res.Data;
})
});
},
//获取客户阶段列表
getStuStageList() {
queryStuStageList().then(res => {
this.customState = res.Data;
})
});
},
//获取客户下拉数据
GetCustomerList() {
let msg = {
QCreateBy: 0
}
};
GetCustomerList(msg).then(res => {
if (res.Code == 1) {
this.customList = res.Data;
this.allCustomList = res.Data;
}
})
});
},
//筛选客户
filterFn(val, update) {
......@@ -679,7 +865,7 @@
} else {
const needle = val.toLowerCase();
this.customList = this.allCustomList.filter(
(v) => v.CustomerName.toLowerCase().indexOf(needle) > -1
v => v.CustomerName.toLowerCase().indexOf(needle) > -1
);
}
});
......@@ -690,7 +876,7 @@
if (res.Code == 1) {
this.customTypeList = res.Data;
}
})
});
},
//获取转介人下拉
getStudentDorpDown() {
......@@ -699,7 +885,7 @@
this.TransListData = res.Data;
this.MyTransListData = res.Data;
}
})
});
},
//筛选转介人
filterStudent(val, update, abort) {
......@@ -762,7 +948,17 @@
this.customObj.WeChatNo = tempDate.WeChatNo;
this.customObj.StuNeeds = tempDate.StuNeeds;
if (this.customObj.StuId > 0) {
this.isHaveOrder = true
this.isHaveOrder = true;
}
if (this.BelongType == 3) {
this.customObj.formatTel =
this.customObj.StuTel != ""
? this.customObj.StuTel.indexOf(0, 2) +
"*****" +
this.customObj.StuTel.indexOf(8, 10)
: "";
} else {
this.customObj.formatTel = this.customObj.StuTel;
}
},
//新增协助人员
......@@ -771,8 +967,8 @@
Id: 0, //编号
AssistId: 1, //员工编号
AssistType: 1, //类型
StuId: 1, //学员编号
}
StuId: 1 //学员编号
};
this.customObj.AssistList.push(obj);
},
//删除协助人员
......@@ -783,24 +979,24 @@
CheckExistsStu(type) {
if (type == 1) {
if (this.customObj.StuTel && this.customObj.StuTel.length == 11) {
this.checkMsg.StuTel = this.customObj.StuTel
this.checkMsg.QQ = '';
this.checkMsg.WeChatNo = '';
this.checkMsg.StuTel = this.customObj.StuTel;
this.checkMsg.QQ = "";
this.checkMsg.WeChatNo = "";
CheckExistsStu(this.checkMsg).then(r => {});
}
}
if (type == 2) {
if (this.customObj.QQ) {
this.checkMsg.StuTel = '';
this.checkMsg.StuTel = "";
this.checkMsg.QQ = this.customObj.QQ;
this.checkMsg.WeChatNo = '';
this.checkMsg.WeChatNo = "";
CheckExistsStu(this.checkMsg).then(r => {});
}
}
if (type == 3) {
if (this.customObj.WeChatNo) {
this.checkMsg.StuTel = ''
this.checkMsg.QQ = '';
this.checkMsg.StuTel = "";
this.checkMsg.QQ = "";
this.checkMsg.WeChatNo = this.customObj.WeChatNo;
CheckExistsStu(this.checkMsg).then(r => {});
}
......@@ -808,17 +1004,17 @@
},
//切换客户来源重置
resetStuSource() {
this.customObj.StuChannel = '';
this.customObj.CustomerId = '';
this.customObj.StuSourceId = '';
this.customObj.PlatformName = '';
this.customObj.StuChannel = "";
this.customObj.CustomerId = "";
this.customObj.StuSourceId = "";
this.customObj.PlatformName = "";
},
getStuOrderPage() {
let customMsg = {
pageIndex: 1,
pageSize: 10,
StuId: 0
}
};
if (this.saveObj) {
customMsg.StuId = this.saveObj.StuId;
}
......@@ -833,16 +1029,13 @@
}
}
});
},
}
}
};
</script>
<style scoped>
::v-deep .el-input__inner {
::v-deep .el-input__inner {
background: transparent;
border: none;
}
}
</style>
<template>
<q-dialog v-model="persistent" full-height maximized position="right" persistent @hide="closeCutomer"
transition-show="slide-left">
<q-dialog
v-model="persistent"
full-height
maximized
position="right"
persistent
@hide="closeCutomer"
transition-show="slide-left"
>
<div class="customMain">
<div class="custom_Top">
<div class="custom_HLeft">
<div class="nameplate_avatar">
<img v-if="baseObj.StuIcon" style="width:100%;height:100%;" :src="baseObj.StuIcon" alt />
<img
v-if="baseObj.StuIcon"
style="width:100%;height:100%;"
:src="baseObj.StuIcon"
alt
/>
<div class="student_Name" v-else>
<span v-if="baseObj.StuName">{{baseObj.StuName.substring(0,1)}}</span>
<span v-if="baseObj.StuName">{{
baseObj.StuName.substring(0, 1)
}}</span>
</div>
</div>
<div class="Name_List">
<div class="F_16">{{baseObj.StuName}}</div>
<div class="F_16">{{ baseObj.StuName }}</div>
</div>
</div>
<div class="custom_HRight" v-if="getJudgeTrans()">
<q-btn color="primary" size="sm" label="转交" @click="isShowTrans=true">
<div class="custom_HRight">
<q-btn
v-if="userInfo.IsTenCccUser == 1"
@click="callUserHandler"
class="q-mr-md"
round
unelevated
color="primary"
dense
icon="phone"
title="拨打电话"
></q-btn>
<q-btn
v-if="getJudgeTrans()"
color="primary"
unelevated
size="sm"
label="转交"
@click="isShowTrans = true"
>
<q-popup-proxy :offset="[10, 10]">
<q-banner v-if="isShowTrans">
<q-select style="margin-top:20px;" filled v-model="transMsg.CreateBy" @filter="filterEmployee" use-input
:options="myEmployeeList" option-label="EmployeeName" option-value="Id" emit-value map-options />
<q-btn label="保存" style="float:right;margin-top:15px" color="accent q-mb-lg" size="sm"
@click="saveTransForm" />
<q-select
style="margin-top:20px;"
filled
v-model="transMsg.CreateBy"
@filter="filterEmployee"
use-input
:options="myEmployeeList"
option-label="EmployeeName"
option-value="Id"
emit-value
map-options
/>
<q-btn
label="保存"
style="float:right;margin-top:15px"
color="accent q-mb-lg"
size="sm"
@click="saveTransForm"
/>
</q-banner>
</q-popup-proxy>
</q-btn>
......@@ -29,11 +76,24 @@
</div>
<div class="custom_Bottom">
<div class="detail-info">
<student-left :stuData="stuData" :save-obj="saveObj" :BelongType="BelongType" @success="refreshStudentPage" @getrecord="getrecord" @update="queryStuInfo"></student-left>
<student-left
:stuData="stuData"
:save-obj="saveObj"
:BelongType="BelongType"
@success="refreshStudentPage"
@getrecord="getrecord"
@update="queryStuInfo"
></student-left>
</div>
<div class="detail-travel">
<div class="detail_first">
<q-tabs v-model="ckedTab" dense align="left" class="text-teal" style="margin-bottom:20px;">
<q-tabs
v-model="ckedTab"
dense
align="left"
class="text-teal"
style="margin-bottom:20px;"
>
<q-tab name="1" label="记录" />
<q-tab name="2" label="操作" />
<q-tab name="3" label="订单" />
......@@ -42,38 +102,84 @@
</q-tabs>
<div class="operate_Content" style="flex:1;">
<div class="detail_Main">
<div class="tripTypeContent" style="flex-shrink:0" v-if="ckedTab==2">
<div v-for="(qItem,qIndex) in visitList" :key="qIndex"
:class="{ 'StuCkedType': qIndex+1 == secondType }" @click="getckedType(qItem)">{{ qItem.Name }}
<div
class="tripTypeContent"
style="flex-shrink:0"
v-if="ckedTab == 2"
>
<div
v-for="(qItem, qIndex) in visitList"
:key="qIndex"
:class="{ StuCkedType: qIndex + 1 == secondType }"
@click="getckedType(qItem)"
>
{{ qItem.Name }}
</div>
</div>
<!-- 记录 -->
<template v-if="ckedTab==1">
<student-record :save-obj="baseObj" @success="refreshStudentPage" ref="mychild"></student-record>
<template v-if="ckedTab == 1">
<student-record
:save-obj="baseObj"
@success="refreshStudentPage"
ref="mychild"
></student-record>
</template>
<!-- 操作 -->
<template v-if="ckedTab==2">
<template v-if="ckedTab == 2">
<div class="operate_Content" style="margin-top:20px;">
<student-visit :stateId="stateId" :stateList="customStateList" @update="queryStuInfo" :save-obj="baseObj" :StuId="baseObj.StuId"
v-if="secondType==1" @success="refreshStudentPage"></student-visit>
<student-yuefang :stateId="stateId" :stateList="customStateList" @update="queryStuInfo" :save-obj="baseObj" v-if="secondType==2"
@success="refreshStudentPage"></student-yuefang>
<student-genjin :stateId="stateId" :stateList="customStateList" @update="queryStuInfo" :save-obj="baseObj" v-if="secondType==3"
@success="refreshStudentPage"></student-genjin>
<student-shiting :save-obj="baseObj" v-if="secondType==4" @success="refreshStudentPage">
<student-visit
:stateId="stateId"
:stateList="customStateList"
@update="queryStuInfo"
:save-obj="baseObj"
:StuId="baseObj.StuId"
v-if="secondType == 1"
@success="refreshStudentPage"
></student-visit>
<student-yuefang
:stateId="stateId"
:stateList="customStateList"
@update="queryStuInfo"
:save-obj="baseObj"
v-if="secondType == 2"
@success="refreshStudentPage"
></student-yuefang>
<student-genjin
:stateId="stateId"
:stateList="customStateList"
@update="queryStuInfo"
:save-obj="baseObj"
v-if="secondType == 3"
@success="refreshStudentPage"
></student-genjin>
<student-shiting
:save-obj="baseObj"
v-if="secondType == 4"
@success="refreshStudentPage"
>
</student-shiting>
</div>
</template>
<!-- 订单 -->
<template v-if="ckedTab==3">
<student-order :save-obj="baseObj" @success="refreshStudentPage"></student-order>
<template v-if="ckedTab == 3">
<student-order
:save-obj="baseObj"
@success="refreshStudentPage"
></student-order>
</template>
<!-- 合同 -->
<template v-if="ckedTab==4">
<student-hetong :save-obj="baseObj" @success="refreshStudentPage"></student-hetong>
<template v-if="ckedTab == 4">
<student-hetong
:save-obj="baseObj"
@success="refreshStudentPage"
></student-hetong>
</template>
<template v-if="ckedTab==5">
<student-Assit :save-obj="baseObj" :BelongType="BelongType" @success="refreshStudentPage"></student-Assit>
<template v-if="ckedTab == 5">
<student-Assit
:save-obj="baseObj"
:BelongType="BelongType"
@success="refreshStudentPage"
></student-Assit>
</template>
</div>
</div>
......@@ -85,29 +191,24 @@
</div>
</div>
</q-dialog>
</template>
<script>
import {
queryEmployee
} from '../../../api/users/user'
import {
ForwardStudent
} from '../../../api/customerstudent/customerstudent'
import {
getStudentInfo,//获取学员客户信息
queryStuStageList, //获取客户阶段列表
} from '../../../api/school/index';
import studentLeft from '../student/student-left';
import studentRecord from '../student/student-record';
import studentVisit from '../student/student-visit';
import studentYuefang from '../student/student-yuefang';
import studentGenjin from '../student/student-genjin';
import studentShiting from '../student/student-shiting';
import studentHetong from '../student/student-hetong';
import studentOrder from '../student/student-order';
import studentAssit from '../student/student-Assit';
export default {
import { queryEmployee } from "../../../api/users/user";
import { ForwardStudent } from "../../../api/customerstudent/customerstudent";
import {
getStudentInfo, //获取学员客户信息
queryStuStageList //获取客户阶段列表
} from "../../../api/school/index";
import studentLeft from "../student/student-left";
import studentRecord from "../student/student-record";
import studentVisit from "../student/student-visit";
import studentYuefang from "../student/student-yuefang";
import studentGenjin from "../student/student-genjin";
import studentShiting from "../student/student-shiting";
import studentHetong from "../student/student-hetong";
import studentOrder from "../student/student-order";
import studentAssit from "../student/student-Assit";
export default {
meta: {
title: "学员管理"
},
......@@ -139,68 +240,79 @@
data() {
return {
persistent: true,
ckedTab: '1',
ckedTab: "1",
secondType: 1,
visitList: [{
Name: '到访',
visitList: [
{
Name: "到访",
Id: 1
}, {
Name: '约访',
},
{
Name: "约访",
Id: 2
}, {
Name: '跟进',
},
{
Name: "跟进",
Id: 3
}, {
Name: '试听',
},
{
Name: "试听",
Id: 4
}],
msg: {
}
],
},
msg: {},
baseObj: {},
transMsg: {
StuId: 1,
CreateBy: ''
CreateBy: ""
},
//员工列表
employeeList: [],
myEmployeeList: [],
isShowTrans: false,
customStateList: [],
stateId:0,
stuData:{},
}
stateId: 0,
stuData: {},
userInfo: {}
};
},
created() {
this.getStuStageList()
this.queryStuInfo()
this.getStuStageList();
this.queryStuInfo();
this.userInfo = this.getLocalStorage();
},
mounted() {
this.baseObj = this.saveObj;
this.getEmployeeList();
},
methods: {
callUserHandler() {
tccc.callOut({
phoneNumber: this.baseObj.StuTel,
phoneDesc: this.baseObj.StuName
});
},
//判断是否显示转交
getJudgeTrans() {
let userInfo = this.getLocalStorage();
let Id = userInfo.Id;
if (this.isJudgeTrans == 1) {
if (this.baseObj.CreateBy == Id) {
return true
return true;
} else {
return false
return false;
}
} else {
return true
return true;
}
},
closeCutomer() {
this.$emit('close')
this.$emit("close");
},
//刷新列表
refreshStudentPage() {
this.$emit('success');
this.$emit("success");
},
//点击第二排
getckedType(obj) {
......@@ -213,7 +325,7 @@
}).then(res => {
this.employeeList = res.Data;
this.myEmployeeList = res.Data;
})
});
},
//筛选员工
filterEmployee(val, update, abort) {
......@@ -229,15 +341,15 @@
ForwardStudent(this.transMsg).then(res => {
if (res.Code == 1) {
this.$q.notify({
icon: 'iconfont icon-chenggong',
color: 'accent',
icon: "iconfont icon-chenggong",
color: "accent",
timeout: 2000,
message: '转交成功',
position: 'top'
})
message: "转交成功",
position: "top"
});
}
this.isShowTrans = false;
})
});
},
//保存成功后调用记录
getrecord() {
......@@ -247,38 +359,37 @@
getStuStageList() {
queryStuStageList().then(res => {
this.customStateList = res.Data;
})
});
},
queryStuInfo() {
getStudentInfo({
StuId: this.saveObj.StuId
}).then(res => {
if (res.Code == 1) {
this.stuData=res.Data
this.stuData = res.Data;
this.stateId = res.Data.StuStage;
}
});
},
},
}
}
};
</script>
<style>
.custom_RModel {
.custom_RModel {
width: 500px;
height: 100%;
}
}
.customMain {
.customMain {
width: 1000px !important;
display: flex;
flex-direction: column;
height: 100 vh;
padding: 15px 17px 0 17px;
background-color: #f4f4f6;
}
}
.custom_Top {
.custom_Top {
width: 100%;
padding: 22px;
background: #fff;
......@@ -286,47 +397,47 @@
display: flex;
justify-content: space-between;
align-items: center;
}
}
.custom_HLeft {
.custom_HLeft {
display: flex;
}
}
.nameplate_avatar {
.nameplate_avatar {
width: 60px;
height: 60px;
flex-shrink: 0;
margin-right: 14px;
border-radius: 5px;
overflow: hidden;
}
}
.F_16 {
.F_16 {
font-size: 16px;
}
}
.Name_List {
.Name_List {
display: flex;
flex-direction: column;
justify-content: space-around;
overflow: hidden;
}
}
.wechat_Name {
.wechat_Name {
color: #9999a8;
display: flex;
font-size: 14px;
}
}
.custom_Bottom {
.custom_Bottom {
margin-top: 17px;
flex: 1;
display: flex;
margin-top: 17px;
overflow: hidden;
}
}
.detail-info {
.detail-info {
flex-shrink: 0;
box-sizing: border-box;
display: flex;
......@@ -338,13 +449,13 @@
background: #fff;
border-radius: 8px 8px 0 0;
overflow: auto;
}
}
.detail-info::-webkit-scrollbar {
.detail-info::-webkit-scrollbar {
display: none;
}
}
.detail-travel {
.detail-travel {
width: 100%;
flex-grow: 1;
display: flex;
......@@ -353,30 +464,26 @@
background: #fff;
border-radius: 8px 8px 0 0;
overflow: hidden;
}
}
.edit_bar {
.edit_bar {
display: flex;
justify-content: space-between;
align-items: center;
padding: 12px 22px;
}
}
.edit_info_wrap {
.edit_info_wrap {
padding: 0 22px 12px;
}
}
.custom_Line {
.custom_Line {
width: calc(100% - 44px);
margin: 16px 22px;
border-bottom: 1px solid #d7d7d7;
}
}
.custom_Edit {
.custom_Edit {
display: flex;
justify-content: center;
align-items: center;
......@@ -387,66 +494,63 @@
border-radius: 4px;
font-size: 12px;
cursor: pointer;
}
}
.tripTypeContent {
.tripTypeContent {
display: flex;
overflow-x: auto;
white-space: nowrap;
}
}
.StuCkedType {
.StuCkedType {
color: #3470ff;
font-weight: 700;
}
}
.tripTypeContent div {
.tripTypeContent div {
margin-right: 20px;
cursor: pointer;
}
}
.q-timeline__title {
.q-timeline__title {
margin-bottom: 5px;
}
}
.customUpdateTime {
.customUpdateTime {
display: flex;
justify-content: space-between;
font-size: 14px;
color: #9696a6;
}
}
.q-timeline__subtitle {
.q-timeline__subtitle {
opacity: 1;
font-weight: normal;
}
}
.follow_Component {
.follow_Component {
padding: 0 22px;
margin-top: 10px;
width: 100%;
background-color: #f6f6f6;
border-radius: 5px;
}
}
.detail_first {
.detail_first {
margin: 0 22px;
display: flex;
flex-direction: column;
height: 100%;
}
}
.detail_Main {
.detail_Main {
display: flex;
flex-direction: column;
width: 100%;
height: 100%;
}
}
.student_Name {
.student_Name {
width: 100%;
height: 100%;
background: #004d40;
......@@ -454,96 +558,95 @@
text-align: center;
line-height: 60px;
font-size: 20px;
}
}
.TimeLineDiv {
.TimeLineDiv {
height: 620px;
flex: 1;
height: 100%;
padding-right: 20px;
}
}
.Time_TopList {
.Time_TopList {
display: flex;
justify-content: space-between;
}
}
.visit_Cont {
.visit_Cont {
font-size: 14px;
}
}
.visit_delete {
.visit_delete {
font-size: 14px;
cursor: pointer;
width: 30px;
}
}
.operate_Content {
.operate_Content {
overflow: auto;
/* padding-right: 20px; */
}
}
.operate_Content::-webkit-scrollbar {
.operate_Content::-webkit-scrollbar {
width: 6px;
height: 8px;
}
}
.operate_Content::-webkit-scrollbar-thumb {
.operate_Content::-webkit-scrollbar-thumb {
border-radius: 4px;
-webkit-box-shadow: inset 0 0 2px rgba(0, 0, 0, 0.2);
background: #c9c9c9;
}
}
.operate_Content::-webkit-scrollbar-thumb {
.operate_Content::-webkit-scrollbar-thumb {
-webkit-box-shadow: inset 0 0 2px rgba(0, 0, 0, 0.2);
border-radius: 4px;
background: #EDEDED;
}
background: #ededed;
}
.Log_Content {
.Log_Content {
padding: 10px;
border-radius: 5px;
background-color: #f4f4f6;
color: #818194;
line-height: 2;
margin-top: 10px;
}
}
.stu_ComFeed {
.stu_ComFeed {
color: #3470ff;
cursor: pointer;
margin-left: 20px;
}
}
.StuCom_Remark {
.StuCom_Remark {
display: flex;
}
}
.StuCom_Inner {
.StuCom_Inner {
width: 100%;
}
}
.StuCom_Left {
.StuCom_Left {
flex-shrink: 0;
width: 57px;
text-align-last: justify;
}
}
.Stu_OrderId {
color: #2961FE;
.Stu_OrderId {
color: #2961fe;
font-weight: bold;
text-decoration: underline;
cursor: pointer;
}
}
.Stu_HtLeft {
.Stu_HtLeft {
width: 57px;
display: inline-block;
text-align-last: justify;
}
}
.fullscreen {
.fullscreen {
z-index: 3000;
}
}
</style>
......@@ -546,6 +546,9 @@ export default {
border-radius: 50%;
z-index: 2;
}
.MuiBadge-root {
display: none !important;
}
.wave_wrapper span.wave_scale {
animation: wave_scale 2s both infinite;
......
const tencentcloud = require("tencentcloud-sdk-nodejs-ccc");
const CccClient = tencentcloud.ccc.v20200210.Client;
const clientConfig = {
credential: {
secretId: "SecretId",
secretKey: "SecretKey"
},
region: "",
profile: {
httpProfile: {
endpoint: "ccc.tencentcloudapi.com"
}
}
};
const client = new CccClient(clientConfig);
const params = {
SdkAppId: 1400617921,
SeatUserId: "alex9012@vip.qq.com"
};
client.CreateSDKLoginToken(params).then(
data => {
console.log(data);
},
err => {
console.error("error", err);
}
);
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