Commit 186605a9 authored by 罗超's avatar 罗超

调整流程

parent 2ae2c1a9
......@@ -50,7 +50,7 @@ export function getMyOrderPageList(data) {
* 销售 报名统计
*
*/
export function getMyOrderStatisticsPageList(data) {
export function getMyOrderStatisticsPageList(data) {
return request({
url: '/order/GetOrderPageListStatistics',
method: 'post',
......@@ -61,7 +61,7 @@ export function getMyOrderPageList(data) {
* 销售 留学就业统计
*
*/
export function getMyStudyOrderStatisticsPageList(data) {
export function getMyStudyOrderStatisticsPageList(data) {
return request({
url: '/order/GetStudyOrderPageListStatistics',
method: 'post',
......@@ -122,7 +122,7 @@ export function getGuestEducationEnumList(data) {
export function getGuestLearningGoalsEnumList(data) {
return request({
// url: '/order/GetGuestLearningGoalsEnumList',
url:'/CustomerStudent/GetLearningGoalsList',
url: '/CustomerStudent/GetLearningGoalsList',
method: 'post',
data
})
......@@ -349,7 +349,7 @@ export function GetSelectClassOrderList(data) {
* 今日订单 修改订单的关联老师
*
*/
export function setOrderHelpEnterId(data) {
export function setOrderHelpEnterId(data) {
return request({
url: '/Order/SetOrderHelpEnterId',
method: 'post',
......@@ -390,7 +390,7 @@ export function getMyCustomerList(data) {
export function GetStuChannelList(data) {
return request({
// url: '/User/GetStuChannelList',
url:"/CustomerStudent/GetChannelList",
url: "/CustomerStudent/GetChannelList",
method: 'post',
data
});
......@@ -432,6 +432,14 @@ export function SetStudentAssist(data) {
});
}
export function SetStudentAssistBatch(data) {
return request({
url: '/CustomerStudent/SetStudentAssistBatch',
method: 'post',
data
});
}
// 删除协助数据
export function RemoveStudentAssist(data) {
return request({
......
<style>
.choiceappoval .ApprovalProcessBg {
.choiceappoval .ApprovalProcessBg {
background: #f8f8f8;
max-height: 400px;
overflow-y: auto;
}
}
.choiceappoval .Approval_yxList {
.choiceappoval .Approval_yxList {
width: 300px;
background: #f8f8f8;
min-height: 400px;
max-height: 400px;
overflow-y: auto;
}
}
.choiceappoval .Approval_yxList li {
.choiceappoval .Approval_yxList li {
display: inline-block;
width: 100%;
line-height: 40px;
text-indent: 15px;
border-bottom: 1px dotted #eee;
}
}
</style>
<template>
......@@ -29,67 +29,90 @@
<q-card-section class="row items-center q-pb-none ">
<div class="text-h6">选择企业成员</div>
<q-space />
<q-btn icon="close" flat round dense v-close-popup />
<!-- <q-btn
icon="close"
flat
round
dense
v-close-popup
@click="closeEditOrder"
/> -->
</q-card-section>
<q-separator />
<q-card-section class="q-pt-none" style="padding: 20px 0;">
<div style="display: flex;align-items: flex-start;justify-content: space-between;">
<div
style="display: flex;align-items: flex-start;justify-content: space-between;"
>
<div style="width: 300px; margin: 0 20px;">
<p style="margin: 0 0 10px 0;display: flex;align-items: center;">选择:<el-input
style="width: 200px;" placeholder="输入关键字进行过滤" v-model="filterText">
<p style="margin: 0 0 10px 0;display: flex;align-items: center;">
选择:<el-input
style="width: 200px;"
placeholder="输入关键字进行过滤"
v-model="filterText"
>
</el-input>
</p>
<el-tree class='ApprovalProcessBg' :filter-node-method="filterNode" :data="memberList"
show-checkbox ref="treeUser" :props="defaultProps" :render-after-expand="false"
node-key="DeptId" @check-change="handleNodeChange">
<el-tree
class="ApprovalProcessBg"
:filter-node-method="filterNode"
:data="memberList"
show-checkbox
ref="treeUser"
:props="defaultProps"
:render-after-expand="false"
node-key="DeptId"
@check-change="handleNodeChange"
>
</el-tree>
</div>
<div style="width: 300px; margin: 0 20px;">
<p style="margin: 0 0 20px 0;">已选:</p>
<div class="Approval_yxList">
<li v-for="item in showMember">{{item.DeptName}}
<i @click="mySetCheckedKeys(item.DeptId)"
class="el-icon-circle-close showMemberIcon"></i>
<li v-for="item in showMember">
{{ item.DeptName }}
<i
@click="mySetCheckedKeys(item.DeptId)"
class="el-icon-circle-close showMemberIcon"
></i>
</li>
</div>
</div>
</div>
</q-card-section>
<q-separator />
<q-card-actions align="right" class="bg-white">
<q-btn class="q-mr-md" label="取消" @click="closeEditOrder" />
<q-btn color="accent" class="q-mr-md" label="确定" @click="saveOrderInfo()" />
<q-btn
color="accent"
class="q-mr-md"
label="确定"
@click="saveOrderInfo()"
/>
</q-card-actions>
</q-card>
</q-dialog>
</div>
</template>
<script>
import {
getEmployeeAddrBook
} from '../../api/users/user'
import selectMaterial from "./selectMaterial"
export default {
import { getEmployeeAddrBook } from "../../api/users/user";
import selectMaterial from "./selectMaterial";
export default {
props: {
outerindex: {
type: String,
default: '',
default: ""
},
byval:{
byval: {
type: Array,
default: [],
default: []
},
cptype:{//1是列表上使用2 新增使用
type:String,
default: '1',
cptype: {
//1是列表上使用2 新增使用
type: String,
default: "1"
}
},
data() {
......@@ -98,45 +121,43 @@
memberList: [],
filterText: "",
defaultProps: {
children: 'ChildList',
label: 'DeptName',
children: "ChildList",
label: "DeptName"
},
userList: [],
showMember: [],
memberSetCheckedKeys: [],
sysUserKeys: [],
}
sysUserKeys: []
};
},
created() {
if(this.byval.length>0){
if (this.byval.length > 0) {
this.memberSetCheckedKeys = [];
this.showMember = JSON.parse(JSON.stringify(this.byval))
this.byval.forEach(x=>{
this.memberSetCheckedKeys.push(x.DeptId)
})
this.showMember = JSON.parse(JSON.stringify(this.byval));
this.byval.forEach(x => {
this.memberSetCheckedKeys.push(x.DeptId);
});
}
this.getMember()//部门下面选择员工
},
mounted() {
this.getMember(); //部门下面选择员工
},
mounted() {},
watch: {
filterText(val) {
this.$refs.treeUser.filter(val);
},
}
},
methods: {
getMember() {
let _arr = this.sysUserKeys.concat(this.memberSetCheckedKeys)
getEmployeeAddrBook({}).then(res => {
let _arr = this.sysUserKeys.concat(this.memberSetCheckedKeys);
getEmployeeAddrBook({})
.then(res => {
if (res.Code == 1) {
this.memberList = res.Data
this.memberList = res.Data;
let _this = this;
_this.$refs.treeUser.setCheckedKeys(_arr);
}
}).catch(() => {
})
.catch(() => {});
},
filterNode(value, data) {
......@@ -146,64 +167,100 @@
handleNodeChange(data, checked) {
data.IsCheck = checked;
if (data.DataType == 2 && data.IsCheck) { //是员工且选中
let isExsit = false
if (data.DataType == 2 && data.IsCheck) {
//是员工且选中
let isExsit = false;
this.showMember.forEach(x => {
if (x.DeptId == data.DeptId) {
isExsit = true
return false
isExsit = true;
return false;
}
})
});
if (!isExsit) {
this.showMember.push({
DeptName: data.DeptName,
DeptId: data.DeptId
})
this.memberSetCheckedKeys.push(data.DeptId)
});
this.memberSetCheckedKeys.push(data.DeptId);
}
} else if (data.DataType == 2 && !data.IsCheck) {
if (this.showMember.findIndex(item => item.DeptId === data.DeptId) != -1) {
this.showMember.splice(this.showMember.findIndex(item => item.DeptId === data.DeptId), 1)
this.memberSetCheckedKeys.splice(this.memberSetCheckedKeys.findIndex(item => item === data.DeptId), 1)
if (this.showMember.findIndex(item => item.DeptId === data.ParentId) != -1) {
this.memberSetCheckedKeys.splice(this.memberSetCheckedKeys.findIndex(item => item === data.ParentId), 1)
if (
this.showMember.findIndex(item => item.DeptId === data.DeptId) != -1
) {
this.showMember.splice(
this.showMember.findIndex(item => item.DeptId === data.DeptId),
1
);
this.memberSetCheckedKeys.splice(
this.memberSetCheckedKeys.findIndex(item => item === data.DeptId),
1
);
if (
this.showMember.findIndex(item => item.DeptId === data.ParentId) !=
-1
) {
this.memberSetCheckedKeys.splice(
this.memberSetCheckedKeys.findIndex(
item => item === data.ParentId
),
1
);
}
}
}
if (data.DataType != 2 && data.IsCheck) {
if (this.memberSetCheckedKeys.findIndex(item => item === data.DeptId) == -1) {
this.memberSetCheckedKeys.push(data.DeptId)
if (
this.memberSetCheckedKeys.findIndex(item => item === data.DeptId) ==
-1
) {
this.memberSetCheckedKeys.push(data.DeptId);
}
} else if (data.DataType == 2 && !data.IsCheck) {
if (this.memberSetCheckedKeys.findIndex(item => item === data.DeptId) != -1) {
this.memberSetCheckedKeys.splice(this.memberSetCheckedKeys.findIndex(item => item === data.DeptId), 1)
if (this.showMember.findIndex(item => item.DeptId === data.ParentId) != -1) {
this.memberSetCheckedKeys.splice(this.memberSetCheckedKeys.findIndex(item => item === data.ParentId), 1)
if (
this.memberSetCheckedKeys.findIndex(item => item === data.DeptId) !=
-1
) {
this.memberSetCheckedKeys.splice(
this.memberSetCheckedKeys.findIndex(item => item === data.DeptId),
1
);
if (
this.showMember.findIndex(item => item.DeptId === data.ParentId) !=
-1
) {
this.memberSetCheckedKeys.splice(
this.memberSetCheckedKeys.findIndex(
item => item === data.ParentId
),
1
);
}
}
}
},
mySetCheckedKeys(id) {
if (this.memberSetCheckedKeys.length == 0)
return
if (this.memberSetCheckedKeys.length == 0) return;
if (id == -1) {
this.$refs.treeUser.setCheckedKeys(this.memberSetCheckedKeys)
return
this.$refs.treeUser.setCheckedKeys(this.memberSetCheckedKeys);
return;
}
this.showMember.splice(this.showMember.findIndex(item => item.DeptId === id), 1)
this.memberSetCheckedKeys.splice(this.memberSetCheckedKeys.findIndex(item => item === id), 1)
this.showMember.splice(
this.showMember.findIndex(item => item.DeptId === id),
1
);
this.memberSetCheckedKeys.splice(
this.memberSetCheckedKeys.findIndex(item => item === id),
1
);
this.$refs.treeUser.setCheckedKeys(this.memberSetCheckedKeys);
},
//关闭弹窗
closeEditOrder() {
this.$emit('close')
this.$emit("close");
},
saveOrderInfo() {
this.$emit('success',this.showMember,this.cptype)
this.$emit("success", this.showMember, this.cptype);
}
}
}
};
</script>
<style scoped>
.Student_Date .el-input__inner {
.Student_Date .el-input__inner {
background: transparent !important;
border: 0 !important;
padding-right: 0 !important;
}
}
</style>
<template>
<div>
<div class="row wrap">
<q-btn label="选择试听课" color="accent q-mb-lg" size="sm" @click="isShowTeacher=true" />
<q-btn
label="选择试听课"
color="accent q-mb-lg"
size="sm"
@click="isShowTeacher = true"
/>
</div>
<template v-if="false">
<div class="row studentDate">
<q-field filled class="col-6 q-pb-lg q-pr-lg" dense>
 <template v-slot:control>
<el-date-picker v-model="addMsg.ClassDate" ref="ClassDate" :rules="[val => !!val || '请选择预约日期']"
style="width:225px" size="mini" type="date" placeholder="预约日期" value-format="yyyy-MM-dd">
<template v-slot:control>
<el-date-picker
v-model="addMsg.ClassDate"
ref="ClassDate"
:rules="[val => !!val || '请选择预约日期']"
style="width:225px"
size="mini"
type="date"
placeholder="预约日期"
value-format="yyyy-MM-dd"
>
</el-date-picker>
</template>
</q-field>
<div class="col-6 q-pr-lg Student_Date ">
<q-field filled class="q-pb-lg" dense>
 <template v-slot:control>
<el-time-select v-model="addMsg.ClassTime" size="mini" ref="ClassTime" style="width:50%" :picker-options="{
<template v-slot:control>
<el-time-select
v-model="addMsg.ClassTime"
size="mini"
ref="ClassTime"
style="width:50%"
:picker-options="{
start: '09:00',
step: '00:15',
end: '21:00',
maxTime:addMsg.EndTime
}" placeholder="预约开始时间">
maxTime: addMsg.EndTime
}"
placeholder="预约开始时间"
>
</el-time-select>
<el-time-select v-model="addMsg.EndTime" size="mini" dense ref="EndTime" style="width:50%" :picker-options="{
<el-time-select
v-model="addMsg.EndTime"
size="mini"
dense
ref="EndTime"
style="width:50%"
:picker-options="{
start: '09:00',
step: '00:15',
end: '21:00',
minTime:addMsg.ClassTime
}" placeholder="预约结束时间">
</el-time-select>  
minTime: addMsg.ClassTime
}"
placeholder="预约结束时间"
>
</el-time-select>
</template>
</q-field>
</div>
</div>
<div class="row wrap">
<q-select filled stack-label option-value="Name" dense option-label="Name"
@input="getTeacherChoose(addMsg.ClassContent)" v-model="addMsg.ClassContent" ref="ClassContent"
:options="ContentList" :rules="[val => !!val || '请选择主讲内容']" label="主讲内容" class="col-6 q-pb-lg q-pr-lg"
emit-value map-options />
<q-select filled stack-label option-value="TId" option-label="TeacherName" v-model="addMsg.TeacherId"
ref="TeacherId" :options="TeacherList" label="选择教师" dense class="col-6 q-pb-lg q-pr-lg" emit-value
map-options />
<q-select
filled
stack-label
option-value="Name"
dense
option-label="Name"
@input="getTeacherChoose(addMsg.ClassContent)"
v-model="addMsg.ClassContent"
ref="ClassContent"
:options="ContentList"
:rules="[val => !!val || '请选择主讲内容']"
label="主讲内容"
class="col-6 q-pb-lg q-pr-lg"
emit-value
map-options
/>
<q-select
filled
stack-label
option-value="TId"
option-label="TeacherName"
v-model="addMsg.TeacherId"
ref="TeacherId"
:options="TeacherList"
label="选择教师"
dense
class="col-6 q-pb-lg q-pr-lg"
emit-value
map-options
/>
</div>
<div class="row wrap">
<q-select filled stack-label option-value="RoomId" dense option-label="RoomName" v-model="addMsg.ClassRoomId"
ref="ClassRoomId" :options="ClassRoomList" label="关联教室" class="col-6 q-pb-lg q-pr-lg" emit-value map-options />
<q-select filled stack-label option-value="Id" dense option-label="LessonName" v-model="addMsg.TrialLessonId"
:options="TrialList" label="试听课程" class="col-6 q-pb-lg q-pr-lg" emit-value map-options />
<q-select
filled
stack-label
option-value="RoomId"
dense
option-label="RoomName"
v-model="addMsg.ClassRoomId"
ref="ClassRoomId"
:options="ClassRoomList"
label="关联教室"
class="col-6 q-pb-lg q-pr-lg"
emit-value
map-options
/>
<q-select
filled
stack-label
option-value="Id"
dense
option-label="LessonName"
v-model="addMsg.TrialLessonId"
:options="TrialList"
label="试听课程"
class="col-6 q-pb-lg q-pr-lg"
emit-value
map-options
/>
</div>
<div class="row wrap justify-end q-pr-lg" style="margin-bottom:10px;">
<q-btn label="关闭" flat color="accent q-mb-lg" size="md" style="margin-right:10px;" @click="closeClassForm" />
<q-btn label="保存" color="accent q-mb-lg" size="md" @click="saveAppointForm()" />
<q-btn
label="关闭"
flat
color="accent q-mb-lg"
size="md"
style="margin-right:10px;"
@click="closeClassForm"
/>
<q-btn
label="保存"
color="accent q-mb-lg"
size="md"
@click="saveAppointForm()"
/>
</div>
<audition-form v-if="isShowTeacher" @close="closeAuditForm" @getchildInfo="getchildInfo"></audition-form>
</template>
<audition-form
v-if="isShowTeacher"
@close="closeAuditForm"
@getchildInfo="getchildInfo"
></audition-form>
</div>
</template>
<script>
import {
SetVisitorReserve,
} from "../../../api/scheduling/schedu";
import {
import { SetVisitorReserve } from "../../../api/scheduling/schedu";
import {
getTeacherDropDownList,
queryClassRoomList,
GetTrialLessonList
} from "../../../api/school/index";
import auditionForm from '../../schedul/audition-form'
export default {
} from "../../../api/school/index";
import auditionForm from "../../schedul/audition-form";
export default {
components: {
auditionForm
},
......@@ -93,27 +183,34 @@
TeacherId: 0, //教师编号
ClassRoomId: 0, //教室编号
ClassContent: "", //主讲内容
TrialLessonId: ''
TrialLessonId: ""
},
ContentList: [{
ContentList: [
{
Id: 1,
Name: '少儿类:主要以丰富可与时间和兴趣为主,要求课堂轻松活跃。趣味性十足'
}, {
Name:
"少儿类:主要以丰富可与时间和兴趣为主,要求课堂轻松活跃。趣味性十足"
},
{
Id: 2,
Name: '兴趣类:成年人,对日语学习从兴趣开始,要求课堂丰富有趣'
}, {
Name: "兴趣类:成年人,对日语学习从兴趣开始,要求课堂丰富有趣"
},
{
Id: 3,
Name: '实用类:对于日语学习有一定的需求(考研、就业等),要求学习过程专业,干货多'
}, {
Name:
"实用类:对于日语学习有一定的需求(考研、就业等),要求学习过程专业,干货多"
},
{
Id: 4,
Name: '留学类:打算去往日本留学(本科、硕士、语言学校、私塾等)'
}],
Name: "留学类:打算去往日本留学(本科、硕士、语言学校、私塾等)"
}
],
ClassRoomList: [], //教师列表
TeacherList: [], //教师列表
AllTeacherList: [], //全部教师列表
TrialList: [], //试听课程列表
isShowTeacher: false, //是否显示试听课弹窗
}
isShowTeacher: false //是否显示试听课弹窗
};
},
created() {
this.GetTrialDrop();
......@@ -133,7 +230,7 @@
//选择主讲内容赋值选择教师
getTeacherChoose(content) {
var TList = [];
this.addMsg.TeacherId = '';
this.addMsg.TeacherId = "";
this.TeacherList = this.AllTeacherList;
this.TeacherList.forEach(x => {
this.ContentList.forEach(y => {
......@@ -144,8 +241,8 @@
}
}
}
})
})
});
});
this.TeacherList = TList;
},
//试听课程列表
......@@ -162,12 +259,12 @@
if (res.Code == 1) {
this.ClassRoomList = res.Data;
var obj = {
RoomName: '请选择',
RoomName: "请选择",
RoomId: 0
}
};
this.ClassRoomList.unshift(obj);
}
})
});
},
//获取教师下拉
GetTeacherList() {
......@@ -176,9 +273,9 @@
this.TeacherList = res.Data;
this.AllTeacherList = res.Data;
var obj = {
TeacherName: '请选择',
TeacherName: "请选择",
TId: 0
}
};
this.TeacherList.unshift(obj);
this.AllTeacherList.unshift(obj);
}
......@@ -188,64 +285,64 @@
clearMsg() {
this.addMsg.Id = 0;
this.addMsg.ReserveClassId = 0;
this.addMsg.ClassDate = '';
this.addMsg.ClassTime = '';
this.addMsg.EndTime = '';
this.addMsg.ClassDate = "";
this.addMsg.ClassTime = "";
this.addMsg.EndTime = "";
this.addMsg.TeacherId = 0;
this.addMsg.ClassRoomId = 0;
this.addMsg.ClassContent = '';
this.addMsg.ClassContent = "";
this.addMsg.TrialLessonId = "";
},
//保存
saveAppointForm() {
if (this.addMsg.ClassDate == '') {
if (this.addMsg.ClassDate == "") {
this.$q.notify({
type: 'negative',
type: "negative",
position: "top",
timeout: 2000,
message: '请选择预约日期!',
})
message: "请选择预约日期!"
});
return;
}
if (this.addMsg.ClassTime == '') {
if (this.addMsg.ClassTime == "") {
this.$q.notify({
type: 'negative',
type: "negative",
position: "top",
timeout: 2000,
message: '请选择预约开始时间!',
})
message: "请选择预约开始时间!"
});
return;
}
if (this.addMsg.EndTime == '') {
if (this.addMsg.EndTime == "") {
this.$q.notify({
type: 'negative',
type: "negative",
position: "top",
timeout: 2000,
message: '请选择预约结束时间!',
})
message: "请选择预约结束时间!"
});
return;
}
if (!this.$refs.ClassContent.hasError) {
SetVisitorReserve(this.addMsg).then(res => {
if (res.Code == 1) {
this.$q.notify({
icon: 'iconfont icon-chenggong',
color: 'accent',
icon: "iconfont icon-chenggong",
color: "accent",
timeout: 2000,
message: res.Message,
position: 'top'
})
position: "top"
});
this.$emit("success");
} else {
this.$q.notify({
type: 'negative',
type: "negative",
position: "top",
timeout: 2000,
message: res.Message,
})
message: res.Message
});
}
this.clearMsg();
})
});
}
},
closeAuditForm() {
......@@ -263,7 +360,7 @@
this.addMsg.ClassContent = obj.ClassContent;
this.addMsg.TrialLessonId = obj.TrialLessonId;
}
},
}
}
};
</script>
<style>
.delAssist {
.delAssist {
position: absolute;
right: -16px;
top: -12px;
display: inline-block;
background: red;
border-radius: 50%;
color: #FFF;
color: #fff;
width: 20px;
height: 20px;
text-align: center;
line-height: 20px;
cursor: pointer;
}
}
.studentAssitTable {
.studentAssitTable {
width: 100%;
text-align: center;
}
}
.studentAssitTable td {
.studentAssitTable td {
height: 40px;
line-height: 40px;
border: 1px solid #f2f2f2;
}
}
.studentAssitTable th {
.studentAssitTable th {
height: 40px;
background-color: #f2f2f2;
}
}
</style>
<template>
<div>
<q-btn label="新增" color="accent q-mb-lg" size="sm" v-if="BelongType!=3" @click="isShowAdd=true" />
<q-btn label="取消" style="margin-left:20px;" v-if="isShowAdd" flat color="grey-10 q-mb-lg" size="sm"
@click="isShowAdd=false" />
<q-btn
label="新增"
color="accent q-mb-lg"
size="sm"
v-if="userInfo.IsCourseConsultant == 1"
@click="isShowAdd = true"
/>
<span class="text-grey-4" v-else>抱歉,你没有权限邀请其他服务人员</span>
<q-btn
label="取消"
style="margin-left:20px;"
v-if="isShowAdd"
flat
color="grey-10 q-mb-lg"
size="sm"
@click="isShowAdd = false"
/>
<template v-if="isShowAdd">
<div class="row wrap">
<q-select filled stack-label option-label="Name" @input="getRole" v-model="AssitMsg.AssistType" option-value="Id"
:options="AssistDropList" label="角色" dense class="col-6 q-pb-lg q-pr-lg" emit-value map-options />
<q-select filled dense v-if="AssitMsg.AssistType==2" v-model="AssitMsg.AssistId" :options="RoleListData"
option-label="EmployeeName" class="col-6 q-pb-lg" option-value="Id" emit-value map-options />
<q-select filled dense v-else v-model="AssitMsg.AssistId" @filter="filterEmployee" use-input :options="myEmployeeList"
option-label="EmployeeName" class="col-6 q-pb-lg" option-value="Id" emit-value map-options />
<q-select
filled
stack-label
option-label="Name"
@input="getRole"
v-model="AssitMsg.AssistType"
option-value="Id"
:options="AssistDropList"
label="角色"
dense
class="col-6 q-pb-lg q-pr-lg"
emit-value
map-options
/>
<q-select
filled
dense
v-if="AssitMsg.AssistType == 2"
v-model="AssitMsg.AssistId"
:options="RoleListData"
option-label="EmployeeName"
class="col-6 q-pb-lg"
option-value="Id"
emit-value
map-options
/>
<q-select
filled
dense
v-else
v-model="AssitMsg.AssistId"
@filter="filterEmployee"
use-input
:options="myEmployeeList"
option-label="EmployeeName"
class="col-6 q-pb-lg"
option-value="Id"
emit-value
map-options
/>
<i class="iconfont icon-close delAssist"></i>
</div>
<div class="row wrap" style="margin-bottom:10px;float:right;">
<q-btn label="保存" color="accent q-mb-lg" size="md" @click="saveAssit()" />
<q-btn
label="保存"
color="accent q-mb-lg"
size="md"
@click="saveAssit()"
/>
</div>
</template>
<div v-if="dataList.length>0">
<table class="studentAssitTable" style="border:1px solid #f2f2f2;border-collapse:collapse;" cellspacing="0"
cellpadding="0">
<div v-if="dataList.length > 0">
<table
class="studentAssitTable"
style="border:1px solid #f2f2f2;border-collapse:collapse;"
cellspacing="0"
cellpadding="0"
>
<tr>
<th style="width:180px;">角色</th>
<th style="width:180px;">人员</th>
<th v-if="BelongType!=3">操作</th>
<th v-if="userInfo.IsCourseConsultant == 1">操作</th>
</tr>
<tr v-for="(item,index) in dataList" :key="index">
<td>{{item.AssistTypeName}}</td>
<td>{{item.AssistName}}</td>
<td v-if="BelongType!=3">
<q-btn flat size="xs" icon="edit" color="accent" style="font-weight:400" label="修改"
@click="getEditInfo(item)"></q-btn>
<q-btn flat size="xs" icon="delete" color="negative" style="font-weight:400" label="删除"
@click="deleteAssits(item.Id)" />
<tr v-for="(item, index) in dataList" :key="index">
<td>{{ item.AssistTypeName }}</td>
<td>{{ item.AssistName }}</td>
<td v-if="userInfo.IsCourseConsultant == 1">
<div v-if="item.AssistType != 2 && item.AssistType != 4">
<q-btn
flat
size="xs"
icon="edit"
color="accent"
style="font-weight:400"
label="修改"
@click="getEditInfo(item)"
></q-btn>
<q-btn
flat
size="xs"
icon="delete"
color="negative"
style="font-weight:400"
label="删除"
@click="deleteAssits(item.Id)"
/>
</div>
</td>
</tr>
</table>
......@@ -74,23 +146,19 @@
</div>
</template>
<script>
import {
import {
GetAssistTypeList,
SetStudentAssist,
GetStudentAssistList,
RemoveStudentAssist
} from '../../../api/sale/sale'
import {
queryEmployee
} from '../../../api/users/user'
} from "../../../api/sale/sale";
import { queryEmployee } from "../../../api/users/user";
export default {
export default {
meta: {
title: ""
},
components: {
},
components: {},
props: {
saveObj: {
type: Object,
......@@ -107,8 +175,8 @@
AssitMsg: {
StuId: 1, //学员编号
Id: 0, //编号
AssistId: '', //员工编号
AssistType: '' //类型
AssistId: "", //员工编号
AssistType: "" //类型
},
msg: {
StuId: 1
......@@ -117,12 +185,14 @@
dataList: [],
page_Count: 0,
AssistDropList: [], //下拉数据
RoleListData:[], //课程顾问下拉数据
RoleListData: [], //课程顾问下拉数据
employeeList: [],
myEmployeeList: [],
}
userInfo: {}
};
},
created() {
this.userInfo = this.getLocalStorage();
if (this.saveObj && this.saveObj.StuId) {
this.AssitMsg.StuId = this.saveObj.StuId;
this.msg.StuId = this.saveObj.StuId;
......@@ -140,13 +210,13 @@
GetAssistTypeList({}).then(res => {
if (res.Code == 1) {
let template = res.Data;
template.forEach(x=>{
if(x.Id!=1){
template.forEach(x => {
if (x.Id != 1 && x.Id != 2 && x.Id != 4) {
this.AssistDropList.push(x);
}
})
});
}
})
});
},
//获取员工列表
getEmployeeList() {
......@@ -156,7 +226,7 @@
}).then(res => {
this.employeeList = res.Data;
this.myEmployeeList = res.Data;
})
});
},
//切换课程顾问
getRole() {
......@@ -165,7 +235,7 @@
UserRole: 2
}).then(res => {
this.RoleListData = res.Data;
})
});
},
//筛选员工
......@@ -178,22 +248,22 @@
},
//保存协同人员
saveAssit() {
SetStudentAssist(this.AssitMsg).then(res => {
SetStudentAssist(this.AssitMsg)
.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.getList();
this.isShowAdd = false;
this.clearMsg();
}
}).catch(() => {
})
.catch(() => {});
},
clearMsg() {
this.AssitMsg.Id = 0;
......@@ -202,46 +272,48 @@
},
//获取数据
getList() {
GetStudentAssistList(this.msg).then(res => {
GetStudentAssistList(this.msg)
.then(res => {
if (res.Code == 1) {
this.dataList = res.Data;
}
}).catch(() => {
})
.catch(() => {});
},
//删除协同
deleteAssits(Id) {
let that = this
this.$q.dialog({
title: '提示信息',
message: '是否确定删除?',
let that = this;
this.$q
.dialog({
title: "提示信息",
message: "是否确定删除?",
cancel: true,
persistent: true,
ok: "确定",
cancel: "取消",
}).onOk(() => {
cancel: "取消"
})
.onOk(() => {
RemoveStudentAssist({
Id: Id
}).then((res) => {
}).then(res => {
that.$q.notify({
icon: 'iconfont icon-chenggong',
icon: "iconfont icon-chenggong",
timeout: 2000,
message: res.Message,
position: 'top'
})
that.getList()
position: "top"
});
that.getList();
});
})
}).onCancel(() => {});
.onCancel(() => {});
},
//获取修改数据
getEditInfo(obj) {
this.AssitMsg.Id = obj.Id;
this.AssitMsg.AssistId = obj.AssistId;
this.AssitMsg.AssistType = obj.AssistType;
this.isShowAdd=true;
}
this.isShowAdd = true;
}
}
};
</script>
<style>
</style>
<style></style>
<template>
<div>
<div class="row wrap">
<q-btn label="新增" color="accent q-mb-lg" size="sm" @click="isShowAdd=true" />
<q-btn label="取消" style="margin-left:20px;" v-if="isShowAdd" flat color="grey-10 q-mb-lg" size="sm"
@click="isShowAdd=false" />
<q-btn
label="新增"
color="accent q-mb-lg"
size="sm"
v-if="!saveObj.IsHaveCurseManager || userInfo.IsCourseConsultant == 1"
@click="isShowAdd = true"
/>
<span v-else class="text-grey-4">学员已推送课程顾问,只能进行查看</span>
<q-btn
label="取消"
style="margin-left:20px;"
v-if="isShowAdd"
flat
color="grey-10 q-mb-lg"
size="sm"
@click="isShowAdd = false"
/>
</div>
<template v-if="isShowAdd">
<UeEditor v-if="isShowAdd" v-model="flowMsg.Remark" class="q-pb-sm" :config="config"></UeEditor>
<UeEditor
v-if="isShowAdd"
v-model="flowMsg.Remark"
class="q-pb-sm"
:config="config"
></UeEditor>
<div class="row q-mb-lg flex justify-between items-center">
<q-select filled v-model="stuStageId" dense :options="cusStateList" option-label="Name" option-value="Id"
emit-value map-options label="客户状态" class="col-6" />
<q-select
filled
v-model="stuStageId"
dense
:options="cusStateList"
option-label="Name"
option-value="Id"
emit-value
map-options
label="客户状态"
class="col-6"
/>
<div>
<q-btn label="保存" color="accent " size="md" @click="saveFlow()" />
</div>
</div>
</template>
<div style="display:flex;flex:1;flex-direction: column;overflow:hidden;">
<div class="TimeLineDiv">
<q-timeline color="primary">
<q-timeline-entry v-for="(tItem,tIndex) in dataList" :key="tIndex">
<q-timeline-entry v-for="(tItem, tIndex) in dataList" :key="tIndex">
<template v-slot:title>
<div class="visit_Cont">
<div class="Log_Content" v-html="tItem.Remark"></div>
<div @click="delFollow(tItem.Id)" style="margin-top:10px;" class="visit_delete text-negative">删除</div>
<div
@click="delFollow(tItem.Id)"
style="margin-top:10px;"
class="visit_delete text-negative"
>
删除
</div>
</div>
</template>
<template v-slot:subtitle>
......@@ -41,21 +72,27 @@
</div>
</div>
<div style="margin-bottom:20px;">
<q-pagination class="full-width justify-end" v-model="msg.pageIndex" color="primary" :max="page_Count" input
@input="changePage" />
<q-pagination
class="full-width justify-end"
v-model="msg.pageIndex"
color="primary"
:max="page_Count"
input
@input="changePage"
/>
</div>
</div>
</template>
<script>
import UeEditor from '../../editor/UeEditor'
import {
import UeEditor from "../../editor/UeEditor";
import {
queryStudentFollowPage, //获取到访列表
saveStudentFollow,
deleteStudentFollow,
SetStuStage
} from '../../../api/customerstudent/customerstudent';
} from "../../../api/customerstudent/customerstudent";
export default {
export default {
meta: {
title: ""
},
......@@ -63,9 +100,9 @@
UeEditor
},
props: {
stateId:{
type:Number,
default:0
stateId: {
type: Number,
default: 0
},
stateList: {
type: Array,
......@@ -85,8 +122,8 @@
},
flowMsg: {
StuId: 0,
Remark: '',
stuState: 0,
Remark: "",
stuState: 0
},
msg: {
pageIndex: 1,
......@@ -95,70 +132,72 @@
},
dataList: [],
page_Count: 0,
stuStageId:0,
stuStageId: 0,
cusStateList: [],
}
userInfo: {}
};
},
created() {
if (this.saveObj && this.saveObj.StuId) {
this.msg.StuId = this.saveObj.StuId;
this.flowMsg.StuId = this.saveObj.StuId;
this.userInfo = this.getLocalStorage();
}
},
watch:{
stateId(val){
this.stuStageId=val
watch: {
stateId(val) {
this.stuStageId = val;
}
},
mounted() {
this.stuStageId=this.stateId
this.stuStageId = this.stateId;
this.cusStateList = this.stateList;
this.getList();
},
methods: {
//保存跟进
saveFlow() {
if (this.flowMsg.Remark == '') {
if (this.flowMsg.Remark == "") {
this.$q.notify({
type: 'negative',
type: "negative",
position: "top",
timeout: 2000,
message: '请输入内容!',
})
message: "请输入内容!"
});
return;
}
saveStudentFollow(this.flowMsg).then(res => {
saveStudentFollow(this.flowMsg)
.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.getList();
this.clearMsg();
}
}).catch(() => {
})
if(this.stuStageId??0>0){
this.setStuStage()
.catch(() => {});
if (this.stuStageId ?? 0 > 0) {
this.setStuStage();
}
},
getList() {
queryStudentFollowPage(this.msg).then(res => {
queryStudentFollowPage(this.msg)
.then(res => {
if (res.Code == 1) {
this.dataList = res.Data.PageData;
this.page_Count = res.Data.PageCount;
}
}).catch(() => {
})
.catch(() => {});
},
//清除
clearMsg() {
this.flowMsg.Remark = '';
this.flowMsg.Remark = "";
this.isShowAdd = false;
},
changePage(val) {
......@@ -167,38 +206,40 @@
},
//删除跟进
delFollow(Id) {
let that = this
this.$q.dialog({
title: '提示信息',
message: '是否确定删除?',
let that = this;
this.$q
.dialog({
title: "提示信息",
message: "是否确定删除?",
cancel: true,
persistent: true,
ok: "确定",
cancel: "取消",
}).onOk(() => {
cancel: "取消"
})
.onOk(() => {
deleteStudentFollow({
Id: Id
}).then((res) => {
}).then(res => {
that.$q.notify({
icon: 'iconfont icon-chenggong',
icon: "iconfont icon-chenggong",
timeout: 2000,
message: res.Message,
position: 'top'
position: "top"
});
that.getList();
});
})
that.getList()
})
}).onCancel(() => {});
},
setStuStage(){
const msg={
StuId:this.saveObj.StuId,
StuStage:this.stuStageId,
.onCancel(() => {});
},
setStuStage() {
const msg = {
StuId: this.saveObj.StuId,
StuStage: this.stuStageId
};
SetStuStage(msg).then(res => {
this.$emit("update");
});
}
SetStuStage(msg).then(res=>{
this.$emit('update')
})
},
},
}
};
</script>
<style>
</style>
<style></style>
<template>
<div>
<div class="row wrap">
<q-btn label="新增" color="accent q-mb-lg" size="sm" @click="isShowAdd=true" />
<q-btn label="取消" style="margin-left:20px;" v-if="isShowAdd" flat color="grey-10 q-mb-lg" size="sm"
@click="isShowAdd=false" />
</div>
<template v-if="isShowAdd">
<reserveclass-form :saveObj="saveObj" @close="closeReserveForm" @success="closeReserveForm"></reserveclass-form>
</template>
<!-- <div class="row wrap">
<q-btn
label="新增"
color="accent q-mb-lg"
size="sm"
@click="isShowAdd = true"
/>
<q-btn
label="取消"
style="margin-left:20px;"
v-if="isShowAdd"
flat
color="grey-10 q-mb-lg"
size="sm"
@click="isShowAdd = false"
/>
</div> -->
<reserveclass-form
:saveObj="saveObj"
@close="closeReserveForm"
@success="closeReserveForm"
v-if="!saveObj.IsHaveCurseManager || userInfo.IsCourseConsultant == 1"
></reserveclass-form>
<span v-else class="text-grey-4 q-mb-md"
>学员已推送课程顾问,只能进行查看</span
>
<div style="display:flex;flex:1;flex-direction: column;overflow:hidden;">
<div class="TimeLineDiv">
<q-timeline color="primary">
<q-timeline-entry v-for="(tItem,tIndex) in dataList" :key="tIndex">
<q-timeline-entry v-for="(tItem, tIndex) in dataList" :key="tIndex">
<template v-slot:title>
<div class="visit_Cont">
<div class="Log_Content">
<div>预约时间:{{tItem.ClassDateStr}} {{tItem.ClassTime}}-{{tItem.EndTime}}</div>
<div>
预约时间:{{ tItem.ClassDateStr }} {{ tItem.ClassTime }}-{{
tItem.EndTime
}}
</div>
<div class="StuCom_Remark">
<div style="flex-shrink:0">主讲内容:</div>
<div class="StuCom_Inner">{{tItem.ClassContent}}</div>
<div class="StuCom_Inner">{{ tItem.ClassContent }}</div>
</div>
<div>主讲老师:{{tItem.TeacherName}}</div>
<div>课程名称:{{tItem.LessonName}}</div>
<div>主讲老师:{{ tItem.TeacherName }}</div>
<div>课程名称:{{ tItem.LessonName }}</div>
<div class="StuCom_Remark">
<span class="StuCom_Left">教室</span>{{tItem.RoomName}}
<span class="StuCom_Left">教室</span>{{ tItem.RoomName }}
</div>
</div>
<div @click="DeleteVisitorReserve(tItem.Id)" style="margin-top:10px;"
class="visit_delete text-negative">删除</div>
<div
@click="DeleteVisitorReserve(tItem.Id)"
style="margin-top:10px;"
class="visit_delete text-negative"
>
删除
</div>
</div>
</template>
<template v-slot:subtitle>
......@@ -45,26 +69,31 @@
</div>
</div>
<div style="margin:20px 0;">
<q-pagination class="full-width justify-end" v-model="qMsg.pageIndex" color="primary" :max="page_Count" input
@input="changePage" />
<q-pagination
class="full-width justify-end"
v-model="qMsg.pageIndex"
color="primary"
:max="page_Count"
input
@input="changePage"
/>
</div>
</div>
</template>
<script>
import {
import {
SetVisitorReserve,
queryVisitorReservePage,
RemoveVisitorReserve
} from "../../../api/scheduling/schedu";
} from "../../../api/scheduling/schedu";
import {
import {
getTeacherDropDownList,
queryClassRoomList,
GetTrialLessonList
} from "../../../api/school/index";
import reserveclassForm from './reserveclass-form'
export default {
} from "../../../api/school/index";
import reserveclassForm from "./reserveclass-form";
export default {
meta: {
title: ""
},
......@@ -83,15 +112,17 @@
qMsg: {
pageIndex: 1,
pageSize: 12,
Visitor_Id: 0,
Visitor_Id: 0
},
dataList: [],
page_Count: 0,
}
userInfo: {}
};
},
created() {
if (this.saveObj) {
this.qMsg.Visitor_Id = this.saveObj.StuId;
this.userInfo = this.getLocalStorage();
}
},
mounted() {
......@@ -105,7 +136,7 @@
this.dataList = res.Data.PageData;
this.page_Count = res.Data.PageCount;
}
})
});
},
changePage(val) {
this.qMsg.pageIndex = val;
......@@ -113,32 +144,35 @@
},
//删除试听
DeleteVisitorReserve(Id) {
let that = this
this.$q.dialog({
title: '提示信息',
message: '是否确定此试听信息删除?',
let that = this;
this.$q
.dialog({
title: "提示信息",
message: "是否确定此试听信息删除?",
cancel: true,
persistent: true,
ok: "确定",
cancel: "取消",
}).onOk(() => {
cancel: "取消"
})
.onOk(() => {
RemoveVisitorReserve({
Id: Id
}).then((res) => {
}).then(res => {
that.$q.notify({
icon: 'iconfont icon-chenggong',
icon: "iconfont icon-chenggong",
timeout: 2000,
message: res.Message,
position: 'top'
})
that.getList()
position: "top"
});
that.getList();
});
})
}).onCancel(() => {});
.onCancel(() => {});
},
closeReserveForm() {
this.isShowAdd = false;
this.getList();
},
},
}
}
};
</script>
<style>
.studentDate .el-input__inner {
.studentDate .el-input__inner {
background-color: transparent;
border: 0;
height: 28px !important;
}
}
.studentDate .el-input {
.studentDate .el-input {
height: 28px !important;
}
}
.el-select-dropdown {
.el-select-dropdown {
z-index: 8888 !important;
}
}
</style>
<template>
<div>
<q-btn label="新增" color="accent q-mb-lg" size="sm" @click="isShowAdd=true" />
<q-btn label="取消" style="margin-left:20px;" v-if="isShowAdd" flat color="grey-10 q-mb-lg" size="sm"
@click="isShowAdd=false" />
<q-btn
label="新增"
color="accent q-mb-lg"
size="sm"
v-if="!saveObj.IsHaveCurseManager || userInfo.IsCourseConsultant == 1"
@click="isShowAdd = true"
/>
<span v-else class="text-grey-4">学员已推送课程顾问,只能进行查看</span>
<q-btn
label="取消"
style="margin-left:20px;"
v-if="isShowAdd"
flat
color="grey-10 q-mb-lg"
size="sm"
@click="isShowAdd = false"
/>
<template v-if="isShowAdd">
<div class="row wrap studentDate">
<q-select filled option-value="SId" dense class="col-6 q-pb-lg q-pr-lg" option-label="SName"
v-model="VisitMsg.School_Id" :options="schoolList" emit-value map-options label="到访校区" />
<q-select
filled
option-value="SId"
dense
class="col-6 q-pb-lg q-pr-lg"
option-label="SName"
v-model="VisitMsg.School_Id"
:options="schoolList"
emit-value
map-options
label="到访校区"
/>
<q-field filled class="q-pb-lg" dense>
 <template v-slot:control>
<el-date-picker v-model="VisitMsg.Date" size="mini" style="width:228px" type="date" placeholder="到访日期">
<template v-slot:control>
<el-date-picker
v-model="VisitMsg.Date"
size="mini"
style="width:228px"
type="date"
placeholder="到访日期"
>
</el-date-picker>
</template>
</q-field>
</div>
<div class="row warp studentDate">
<q-field filled class="q-pb-lg q-pr-lg" dense>
 <template v-slot:control>
<el-time-select v-model="VisitMsg.VisitTime" size="mini" ref="ClassTime" style="width:230px"
<template v-slot:control>
<el-time-select
v-model="VisitMsg.VisitTime"
size="mini"
ref="ClassTime"
style="width:230px"
:picker-options="{
start: '09:00',
step: '00:15',
end: '21:00',
}" placeholder="到访时间">
end: '21:00'
}"
placeholder="到访时间"
>
</el-time-select>
</template>
</q-field>
<q-field filled class="q-pb-lg" dense>
 <template v-slot:control>
<el-select v-model="VisitMsg.ReceptionPersion" filterable style="width:230px;" size="mini"
placeholder="接待人">
<el-option v-for="item in myEmployeeList" :key="item.Id" :label="item.EmployeeName" :value="item.Id">
<template v-slot:control>
<el-select
v-model="VisitMsg.ReceptionPersion"
filterable
style="width:230px;"
size="mini"
placeholder="接待人"
>
<el-option
v-for="item in myEmployeeList"
:key="item.Id"
:label="item.EmployeeName"
:value="item.Id"
>
</el-option>
</el-select>
 
</template>
</q-field>
</div>
<div class="row wrap">
<q-input filled v-model="VisitMsg.Remark" dense :rows="3" type="textarea" class="col-12 q-pb-lg q-pr-lg"
label="备注">
<q-input
filled
v-model="VisitMsg.Remark"
dense
:rows="3"
type="textarea"
class="col-12 q-pb-lg q-pr-lg"
label="备注"
>
</q-input>
</div>
<div class="row wrap justify-end q-pr-lg" style="margin-bottom:10px;">
<q-btn label="保存" color="accent q-mb-lg" size="md" @click="saveVisit()" />
<q-btn
label="保存"
color="accent q-mb-lg"
size="md"
@click="saveVisit()"
/>
</div>
</template>
<div style="display:flex;flex:1;flex-direction: column;overflow:hidden;">
<div class="TimeLineDiv">
<q-timeline color="primary">
<q-timeline-entry v-for="(tItem,tIndex) in dataList" :key="tIndex">
<q-timeline-entry v-for="(tItem, tIndex) in dataList" :key="tIndex">
<template v-slot:title>
<div class="visit_Cont">
<div class="Log_Content">
<div>到访校区:{{tItem.SchoolName}}</div>
<div>到访时间:{{tItem.Date}} {{tItem.VisitTime}}</div>
<div>到访校区:{{ tItem.SchoolName }}</div>
<div>到访时间:{{ tItem.Date }} {{ tItem.VisitTime }}</div>
<div class="StuCom_Remark">
<span class="StuCom_Left">接待人</span>
{{tItem.ReceptionPersionName}}
{{ tItem.ReceptionPersionName }}
</div>
<div class="StuCom_Remark">
<div class="StuCom_Left">备注</div>
<div class="StuCom_Inner">{{tItem.Remark}}</div>
<div class="StuCom_Left">备注</div>
<div class="StuCom_Inner">{{ tItem.Remark }}</div>
</div>
<div class="StuCom_Remark">
<div class="StuCom_Left">反馈</div>
<div class="StuCom_Inner">{{tItem.Feedback}} </div>
<div class="StuCom_Left">反馈</div>
<div class="StuCom_Inner">{{ tItem.Feedback }}</div>
</div>
<div class="StuCom_Remark">
<div class="StuCom_Left">是否到访</div>
<div class="StuCom_Left">是否到访</div>
<div class="StuCom_Inner">
<span v-if="tItem.IsVisit==0" class="text-negative">{{tItem.IsVisitStr}} </span>
<span v-if="tItem.IsVisit==1" class="text-primary">{{tItem.IsVisitStr}} </span>
<span v-if="tItem.IsVisit == 0" class="text-negative"
>{{ tItem.IsVisitStr }}
</span>
<span v-if="tItem.IsVisit == 1" class="text-primary"
>{{ tItem.IsVisitStr }}
</span>
</div>
</div>
</div>
<div style="display:flex;margin-top:10px;">
<div @click="delVisit(tItem.Id)" class="visit_delete text-negative">删除</div>
<div
@click="delVisit(tItem.Id)"
class="visit_delete text-negative"
>
删除
</div>
<div @click="clickItem(tItem)" class="stu_ComFeed">
{{tItem.Feedback==null||tItem.Feedback==''?'添加反馈':'编辑反馈'}}
{{
tItem.Feedback == null || tItem.Feedback == ""
? "添加反馈"
: "编辑反馈"
}}
<q-popup-proxy>
<q-banner v-if="isShowEdit">
<div class="row wrap" style="margin-top:10px;width:300px;">
<q-input filled v-model="feedBackMsg.Feedback" :rows="3" type="textarea"
class="col-12 q-pb-sm" label="请输入反馈内容">
<div
class="row wrap"
style="margin-top:10px;width:300px;"
>
<q-input
filled
v-model="feedBackMsg.Feedback"
:rows="3"
type="textarea"
class="col-12 q-pb-sm"
label="请输入反馈内容"
>
</q-input>
</div>
<div class="row wrap q-col-gutter-sm" style="width:300px;">
<q-select filled v-model="stuStageId" dense :options="cusStateList" option-label="Name"
option-value="Id" emit-value map-options label="客户状态" class="col-6" />
<div
class="row wrap q-col-gutter-sm"
style="width:300px;"
>
<q-select
filled
v-model="stuStageId"
dense
:options="cusStateList"
option-label="Name"
option-value="Id"
emit-value
map-options
label="客户状态"
class="col-6"
/>
<q-select filled v-model="feedBackMsg.IsVisit" dense :options="VisitList"
emit-value map-options label="是否到访" class="col-6" />
<q-select
filled
v-model="feedBackMsg.IsVisit"
dense
:options="VisitList"
emit-value
map-options
label="是否到访"
class="col-6"
/>
</div>
<div class="row wrap q-my-sm" style="float:right;">
<q-btn label="保存" color="accent" size="sm" @click="SetFeedBack()" />
<q-btn
label="保存"
color="accent"
size="sm"
@click="SetFeedBack()"
/>
</div>
</q-banner>
</q-popup-proxy>
......@@ -130,35 +237,39 @@
</div>
</div>
<div style="margin-bottom:20px;">
<q-pagination class="full-width justify-end" v-model="msg.pageIndex" color="primary" :max="page_Count" input
@input="changePage" />
<q-pagination
class="full-width justify-end"
v-model="msg.pageIndex"
color="primary"
:max="page_Count"
input
@input="changePage"
/>
</div>
</div>
</template>
<script>
import {
import {
getSchoolDropdown, //获取校区列表
queryStuStageList, //获取客户阶段列表
} from '../../../api/school/index';
import {
queryStuStageList //获取客户阶段列表
} from "../../../api/school/index";
import {
queryStudentVisitPage, //获取到访列表
saveStudentVisit,
deleteStudentVisit,
saveStudentVisitFeedback,
SetStuStage
} from '../../../api/customerstudent/customerstudent';
import {
queryEmployee
} from '../../../api/users/user'
export default {
} from "../../../api/customerstudent/customerstudent";
import { queryEmployee } from "../../../api/users/user";
export default {
meta: {
title: ""
},
props: {
stateId:{
type:Number,
default:0
stateId: {
type: Number,
default: 0
},
stateList: {
type: Array,
......@@ -177,15 +288,15 @@
Id: 0, //到访编号
StuId: 0, //学员编号
School_Id: 0, //到访校区
Date: '', //日期
VisitTime: '', //到访时间
ReceptionPersion: '', //接待人
Remark: '', //备注
Date: "", //日期
VisitTime: "", //到访时间
ReceptionPersion: "", //接待人
Remark: "" //备注
},
msg: {
pageIndex: 1,
pageSize: 12,
StuId: 0,
StuId: 0
},
isShowAdd: false,
dataList: [],
......@@ -197,33 +308,36 @@
feedBackMsg: {
Id: 0, //编号
IsVisit: 0, //到访状态(1-已到访,0-未到访)
Feedback: '', //反馈
Feedback: "" //反馈
},
VisitList: [
{
label: "未到访",
value: 0
},
VisitList:[
{
label:'未到访',
value:0
},{
label:'已到访',
value:1
label: "已到访",
value: 1
}
],
stuStageId:0,
stuStageId: 0,
cusStateList: [],
}
userInfo: {}
};
},
created() {
if (this.saveObj && this.saveObj.StuId) {
this.msg.StuId = this.saveObj.StuId;
this.userInfo = this.getLocalStorage();
}
},
watch:{
stateId(val){
this.stuStageId=val
watch: {
stateId(val) {
this.stuStageId = val;
}
},
mounted() {
this.stuStageId=this.stateId
this.stuStageId = this.stateId;
this.cusStateList = this.stateList;
this.getSchool();
this.getEmployeeList();
......@@ -245,12 +359,12 @@
saveStudentVisitFeedback(this.feedBackMsg).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.getList();
this.feedBackMsg.Id = 0;
this.feedBackMsg.Feedback = "";
......@@ -258,8 +372,8 @@
this.isShowEdit = false;
}
});
if(this.stuStageId??0>0){
this.setStuStage()
if (this.stuStageId ?? 0 > 0) {
this.setStuStage();
}
},
//获取校区列表
......@@ -272,7 +386,7 @@
}
this.schoolList = tempArray;
}
})
});
},
//获取员工列表
getEmployeeList() {
......@@ -280,106 +394,108 @@
IsLeave: 1
}).then(res => {
this.myEmployeeList = res.Data;
})
});
},
//获取到访分页
getList() {
queryStudentVisitPage(this.msg).then(res => {
queryStudentVisitPage(this.msg)
.then(res => {
if (res.Code == 1) {
this.dataList = res.Data.PageData;
this.page_Count = res.Data.PageCount;
}
}).catch(() => {
})
.catch(() => {});
},
//保存数据
saveVisit() {
this.VisitMsg.StuId = this.saveObj.StuId;
if (this.VisitMsg.Date == '') {
if (this.VisitMsg.Date == "") {
this.$q.notify({
type: 'negative',
type: "negative",
position: "top",
timeout: 2000,
message: '请选择到访日期!',
})
message: "请选择到访日期!"
});
return;
}
if (this.VisitMsg.VisitTime == '') {
if (this.VisitMsg.VisitTime == "") {
this.$q.notify({
type: 'negative',
type: "negative",
position: "top",
timeout: 2000,
message: '请选择到访时间!',
})
message: "请选择到访时间!"
});
return;
}
saveStudentVisit(this.VisitMsg).then(res => {
saveStudentVisit(this.VisitMsg)
.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.getList();
this.clearMsg();
}
}).catch(() => {
})
.catch(() => {});
},
//清除数据
clearMsg() {
this.VisitMsg.Id = 0;
this.VisitMsg.StuId = 0;
this.VisitMsg.School_Id = 0;
this.VisitMsg.Date = '';
this.VisitMsg.VisitTime = '';
this.VisitMsg.Date = "";
this.VisitMsg.VisitTime = "";
// this.VisitMsg.ReceptionPersion = '';
this.VisitMsg.Remark = '';
this.VisitMsg.Feedback = '';
this.VisitMsg.Remark = "";
this.VisitMsg.Feedback = "";
this.isShowAdd = false;
},
//删除到访
delVisit(Id) {
let that = this
this.$q.dialog({
title: '提示信息',
message: '是否确定删除?',
let that = this;
this.$q
.dialog({
title: "提示信息",
message: "是否确定删除?",
cancel: true,
persistent: true,
ok: "确定",
cancel: "取消",
}).onOk(() => {
cancel: "取消"
})
.onOk(() => {
deleteStudentVisit({
Id: Id
}).then((res) => {
}).then(res => {
that.$q.notify({
icon: 'iconfont icon-chenggong',
icon: "iconfont icon-chenggong",
timeout: 2000,
message: res.Message,
position: 'top'
})
that.getList()
position: "top"
});
that.getList();
});
})
}).onCancel(() => {});
.onCancel(() => {});
},
changePage(val) {
this.msg.pageIndex = val;
this.getList();
},
setStuStage(){
const msg={
StuId:this.saveObj.StuId,
StuStage:this.stuStageId,
setStuStage() {
const msg = {
StuId: this.saveObj.StuId,
StuStage: this.stuStageId
};
SetStuStage(msg).then(res => {
this.$emit("update");
});
}
SetStuStage(msg).then(res=>{
this.$emit('update')
})
},
},
}
};
</script>
<style>
</style>
<style></style>
<template>
<div>
<div class="row wrap">
<q-btn label="新增" color="accent q-mb-lg" size="sm" @click="isShowAdd=true" />
<q-btn label="取消" style="margin-left:20px;" v-if="isShowAdd" flat color="grey-10 q-mb-lg" size="sm"
@click="isShowAdd=false" />
<q-btn
label="新增"
color="accent q-mb-lg"
size="sm"
v-if="!saveObj.IsHaveCurseManager || userInfo.IsCourseConsultant == 1"
@click="isShowAdd = true"
/>
<span v-else class="text-grey-4">学员已推送课程顾问,只能进行查看</span>
<q-btn
label="取消"
style="margin-left:20px;"
v-if="isShowAdd"
flat
color="grey-10 q-mb-lg"
size="sm"
@click="isShowAdd = false"
/>
</div>
<template v-if="isShowAdd">
<div class="row wrap studentDate">
<q-input filled class="col-6 q-pb-lg q-pr-lg" dense v-model="yueMsg.AppointmentPoint" label="约访地点"></q-input>
<q-input
filled
class="col-6 q-pb-lg q-pr-lg"
dense
v-model="yueMsg.AppointmentPoint"
label="约访地点"
></q-input>
<q-field filled class="q-pb-lg" dense>
 <template v-slot:control>
<el-date-picker v-model="yueMsg.AppointmentTime" type="datetime" size="mini" style="width:228px"
placeholder="选择约访日期时间!">
<template v-slot:control>
<el-date-picker
v-model="yueMsg.AppointmentTime"
type="datetime"
size="mini"
style="width:228px"
placeholder="选择约访日期时间!"
>
</el-date-picker>
</template>
</q-field>
</div>
<div class="row wrap">
<q-input filled v-model="yueMsg.Remark" dense :rows="3" type="textarea" class="col-12 q-pb-lg q-pr-lg"
label="备注">
<q-input
filled
v-model="yueMsg.Remark"
dense
:rows="3"
type="textarea"
class="col-12 q-pb-lg q-pr-lg"
label="备注"
>
</q-input>
</div>
<div class="row wrap justify-end q-pr-lg" style="margin-bottom:10px;">
<q-btn label="保存" color="accent q-mb-lg" size="md" @click="savePoint()" />
<q-btn
label="保存"
color="accent q-mb-lg"
size="md"
@click="savePoint()"
/>
</div>
</template>
<div style="display:flex;flex:1;flex-direction: column;overflow:hidden;">
<div class="TimeLineDiv">
<q-timeline color="primary">
<q-timeline-entry v-for="(tItem,tIndex) in dataList" :key="tIndex">
<q-timeline-entry v-for="(tItem, tIndex) in dataList" :key="tIndex">
<template v-slot:title>
<div class="visit_Cont">
<div class="Log_Content">
<div>约访时间:{{tItem.AppointmentTime}}</div>
<div>约访地点:{{tItem.AppointmentPoint}}</div>
<div>约访时间:{{ tItem.AppointmentTime }}</div>
<div>约访地点:{{ tItem.AppointmentPoint }}</div>
<div class="StuCom_Remark">
<div class="StuCom_Left">备注</div>
<div class="StuCom_Inner">{{tItem.Remark}}</div>
<div class="StuCom_Left">备注</div>
<div class="StuCom_Inner">{{ tItem.Remark }}</div>
</div>
<div class="StuCom_Remark">
<div class="StuCom_Left">反馈</div>
<div class="StuCom_Inner">{{tItem.Feedback}} </div>
<div class="StuCom_Left">反馈</div>
<div class="StuCom_Inner">{{ tItem.Feedback }}</div>
</div>
</div>
<div style="display:flex;margin-top:10px;">
<div @click="delVisit(tItem.Id)" class="visit_delete text-negative">删除</div>
<div
@click="delVisit(tItem.Id)"
class="visit_delete text-negative"
>
删除
</div>
<div @click="clickItem(tItem)" class="stu_ComFeed">
{{tItem.Feedback==null||tItem.Feedback==''?'添加反馈':'编辑反馈'}}
{{
tItem.Feedback == null || tItem.Feedback == ""
? "添加反馈"
: "编辑反馈"
}}
<q-popup-proxy>
<q-banner v-if="isShowEdit">
<div class="row wrap" style="margin-top:10px;width:300px;">
<q-input filled v-model="feedBackMsg.Feedback" :rows="3" type="textarea"
class="col-12 q-pb-sm" label="请输入反馈内容">
<div
class="row wrap"
style="margin-top:10px;width:300px;"
>
<q-input
filled
v-model="feedBackMsg.Feedback"
:rows="3"
type="textarea"
class="col-12 q-pb-sm"
label="请输入反馈内容"
>
</q-input>
<q-select filled v-model="stuStageId" dense :options="cusStateList"
option-label="Name" option-value="Id" emit-value map-options label="客户状态" class="col-12 q-pb-sm" />
<q-select
filled
v-model="stuStageId"
dense
:options="cusStateList"
option-label="Name"
option-value="Id"
emit-value
map-options
label="客户状态"
class="col-12 q-pb-sm"
/>
</div>
<div class="row wrap" style="float:right;margin-bottom:10px;">
<q-btn label="保存" color="accent" size="sm" @click="SetFeedBack()" />
<div
class="row wrap"
style="float:right;margin-bottom:10px;"
>
<q-btn
label="保存"
color="accent"
size="sm"
@click="SetFeedBack()"
/>
</div>
</q-banner>
</q-popup-proxy>
......@@ -79,32 +152,35 @@
</div>
</div>
<div style="margin-bottom:20px">
<q-pagination class="full-width justify-end" v-model="msg.pageIndex" color="primary" :max="page_Count" input
@input="changePage" />
<q-pagination
class="full-width justify-end"
v-model="msg.pageIndex"
color="primary"
:max="page_Count"
input
@input="changePage"
/>
</div>
</div>
</template>
<script>
import {
import {
saveStudentAppointment,
queryStudentAppointmentPage,
deleteStudentAppointment,
saveStudentAppointmentFeedBack,
SetStuStage
} from '../../../api/customerstudent/customerstudent';
} from "../../../api/customerstudent/customerstudent";
export default {
export default {
meta: {
title: ""
},
components: {
},
components: {},
props: {
stateId:{
type:Number,
default:0
stateId: {
type: Number,
default: 0
},
stateList: {
type: Array,
......@@ -121,39 +197,41 @@
yueMsg: {
Id: 0, //约访编号
StuId: 0, //学员编号
AppointmentPoint: '', //约访地点
AppointmentTime: '', //约访时间
Remark: '', //备注
AppointmentPoint: "", //约访地点
AppointmentTime: "", //约访时间
Remark: "" //备注
},
msg: {
pageIndex: 1,
pageSize: 12,
StuId: 0,
StuId: 0
},
//反馈信息
feedBackMsg: {
Id: 0,
Feedback: '', //反馈
Feedback: "" //反馈
},
isShowEdit: false,
dataList: [],
page_Count: 0,
cusStateList: [],
stuStageId:0,
}
stuStageId: 0,
userInfo: {}
};
},
created() {
if (this.saveObj && this.saveObj.StuId) {
this.msg.StuId = this.saveObj.StuId;
this.userInfo = this.getLocalStorage();
}
},
watch:{
stateId(val){
this.stuStageId=val
watch: {
stateId(val) {
this.stuStageId = val;
}
},
mounted() {
this.stuStageId=this.stateId
this.stuStageId = this.stateId;
this.cusStateList = this.stateList;
this.getList();
},
......@@ -168,118 +246,120 @@
saveStudentAppointmentFeedBack(this.feedBackMsg).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.getList();
this.feedBackMsg.Id = 0;
this.feedBackMsg.Feedback = "";
this.isShowEdit = false;
}
});
if(this.stuStageId??0>0){
this.setStuStage()
if (this.stuStageId ?? 0 > 0) {
this.setStuStage();
}
},
//保存约访
savePoint() {
this.yueMsg.StuId = this.saveObj.StuId;
if (this.yueMsg.AppointmentPoint == '') {
if (this.yueMsg.AppointmentPoint == "") {
this.$q.notify({
type: 'negative',
type: "negative",
position: "top",
timeout: 2000,
message: '请输入约访地点!',
})
message: "请输入约访地点!"
});
return;
}
if (this.yueMsg.AppointmentTime == '') {
if (this.yueMsg.AppointmentTime == "") {
this.$q.notify({
type: 'negative',
type: "negative",
position: "top",
timeout: 2000,
message: '请选择约访日期时间!',
})
message: "请选择约访日期时间!"
});
return;
}
saveStudentAppointment(this.yueMsg).then(res => {
saveStudentAppointment(this.yueMsg)
.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.getList();
this.clearMsg();
}
}).catch(() => {
})
.catch(() => {});
},
//获取数据
getList() {
queryStudentAppointmentPage(this.msg).then(res => {
queryStudentAppointmentPage(this.msg)
.then(res => {
if (res.Code == 1) {
this.dataList = res.Data.PageData;
this.page_Count = res.Data.PageCount;
}
}).catch(() => {
})
.catch(() => {});
},
//清除数据
clearMsg() {
this.yueMsg.Id = 0;
this.yueMsg.StuId = 0;
this.yueMsg.AppointmentPoint = '';
this.yueMsg.AppointmentTime = '';
this.yueMsg.Remark = '';
this.yueMsg.Feedback = '';
this.yueMsg.AppointmentPoint = "";
this.yueMsg.AppointmentTime = "";
this.yueMsg.Remark = "";
this.yueMsg.Feedback = "";
this.isShowAdd = false;
},
//删除到访
delVisit(Id) {
let that = this
this.$q.dialog({
title: '提示信息',
message: '是否确定删除?',
let that = this;
this.$q
.dialog({
title: "提示信息",
message: "是否确定删除?",
cancel: true,
persistent: true,
ok: "确定",
cancel: "取消",
}).onOk(() => {
cancel: "取消"
})
.onOk(() => {
deleteStudentAppointment({
Id: Id
}).then((res) => {
}).then(res => {
that.$q.notify({
icon: 'iconfont icon-chenggong',
icon: "iconfont icon-chenggong",
timeout: 2000,
message: res.Message,
position: 'top'
})
that.getList()
position: "top"
});
that.getList();
});
})
}).onCancel(() => {});
.onCancel(() => {});
},
changePage(val) {
this.msg.pageIndex = val;
this.getList();
},
setStuStage(){
const msg={
StuId:this.saveObj.StuId,
StuStage:this.stuStageId,
}
SetStuStage(msg).then(res=>{
this.$emit('update')
})
},
setStuStage() {
const msg = {
StuId: this.saveObj.StuId,
StuStage: this.stuStageId
};
SetStuStage(msg).then(res => {
this.$emit("update");
});
}
}
};
</script>
......@@ -40,6 +40,18 @@
icon="phone"
title="拨打电话"
></q-btn>
<q-btn
unelevated
color="positive"
v-if="
!baseObj.IsHaveCurseManager && userInfo.Id == baseObj.CreateBy
"
size="sm"
:loading="pushing"
class="q-mr-md"
@click="assistBatchHandler"
>推送课程顾问</q-btn
>
<q-btn
v-if="getJudgeTrans()"
color="primary"
......@@ -98,7 +110,7 @@
<q-tab name="2" label="操作" />
<q-tab name="3" label="订单" />
<q-tab name="4" label="合同" />
<q-tab v-if="!baseObj.noEdit" name="5" label="协同人员" />
<q-tab v-if="!baseObj.noEdit" name="5" label="服务人员" />
</q-tabs>
<div class="operate_Content" style="flex:1;">
<div class="detail_Main">
......@@ -208,6 +220,7 @@ import studentShiting from "../student/student-shiting";
import studentHetong from "../student/student-hetong";
import studentOrder from "../student/student-order";
import studentAssit from "../student/student-Assit";
import { SetStudentAssistBatch } from "../../../api/sale/sale";
export default {
meta: {
title: "学员管理"
......@@ -260,7 +273,7 @@ export default {
Id: 4
}
],
pushing: false,
msg: {},
baseObj: {},
transMsg: {
......@@ -284,6 +297,14 @@ export default {
},
mounted() {
this.baseObj = this.saveObj;
this.baseObj.IsHaveCurseManager = false;
if (this.baseObj.AssistList && this.baseObj.AssistList.length > 0) {
this.baseObj.AssistList.forEach(x => {
if (x.AssistType == 2) {
this.baseObj.IsHaveCurseManager = true;
}
});
}
this.getEmployeeList();
},
methods: {
......@@ -370,6 +391,19 @@ export default {
this.stateId = res.Data.StuStage;
}
});
},
assistBatchHandler() {
console.log(this.pushing || this.baseObj.IsHaveCurseManager);
if (this.pushing || this.baseObj.IsHaveCurseManager) return;
this.pushing = true;
let parameter = {
stuIds: this.baseObj.StuId
};
SetStudentAssistBatch(parameter).then(r => {
this.$emit("success");
this.baseObj.IsHaveCurseManager = true;
this.pushing = false;
});
}
}
};
......
<style lang="scss">
.stuList .q-table__bottom {
.stuList .q-table__bottom {
min-height: 0;
}
.stulistNum {
}
.stulistNum {
display: inline-block;
width: 25px;
height: 25px;
text-align: center;
line-height: 23px;
border: 1px solid #2961FE;
border: 1px solid #2961fe;
border-radius: 50%;
cursor: pointer;
color: #2961FE;
}
.stuListTable {
color: #2961fe;
}
.stuListTable {
width: 200px;
text-align: center;
}
}
.stuListTable tr td {
.stuListTable tr td {
height: 40px;
}
}
.stuListTable tr th {
.stuListTable tr th {
height: 40px;
background-color: rgb(238, 238, 239);
}
}
</style>
<template>
<div class="stuList">
<q-table :pagination="pageMsg" :loading="loading" no-data-label="暂无相关数据" flat selection="single"
:selected.sync="selection" class="sticky-right-column-table sticky-tow-column-table" separator="none"
:data="dataList" :columns="columns" row-key="StuId" hide-bottom>
<q-table
:pagination="pageMsg"
:loading="loading"
no-data-label="暂无相关数据"
flat
:selection="pushMode ? 'multiple' : 'single'"
:selected.sync="selection"
class="sticky-right-column-table sticky-tow-column-table"
separator="none"
:data="dataList"
:columns="columns"
row-key="StuId"
hide-bottom
>
<template v-slot:top>
<div class="col-2 q-table__title">学员信息</div>
<q-space />
<div class="page-option">
<q-btn color="accent" class="q-mr-md" size="sm" icon="swap_horiz" label="转订单" :disable="selection.length===0"
@click="transferOrder" />
<q-btn color="accent" class="q-mr-md" size="sm" icon="add" label="新增学员" @click="EditStudent(null)" />
<div class="page-option" v-if="!pushMode">
<q-btn
color="accent"
outline
class="q-mr-md"
size="sm"
icon="swap_horiz"
label="推送课程顾问"
v-if="userInfo.IsCourseConsultant == 0"
@click="pushMode = true"
/>
<q-btn
color="accent"
class="q-mr-md"
size="sm"
icon="swap_horiz"
label="转订单"
:disable="selection.length === 0"
@click="transferOrder"
/>
<q-btn
color="accent"
class="q-mr-md"
size="sm"
icon="add"
label="新增学员"
@click="EditStudent(null)"
/>
</div>
<div class="page-option" v-if="pushMode">
<q-btn
color="accent"
unelevated
class="q-mr-md"
size="sm"
icon="swap_horiz"
label="立即推送"
:loading="pushing"
@click="assistBatchHandler"
/>
<q-btn
color="accent"
outline
size="sm"
label="退出"
:disable="pushing"
@click="
pushMode = false;
selection = [];
"
/>
</div>
</template>
<template v-slot:body-cell-StuIcon="props">
......@@ -46,8 +104,14 @@
<q-avatar size="md" v-if="props.value">
<img :src="props.value" />
</q-avatar>
<q-avatar size="md" color="teal-10" text-color="white" v-if="!props.value">
{{ props.row.StuName.substring(0, 1) }}</q-avatar>
<q-avatar
size="md"
color="teal-10"
text-color="white"
v-if="!props.value"
>
{{ props.row.StuName.substring(0, 1) }}</q-avatar
>
</q-td>
</template>
<template v-slot:body-cell-StuName="props">
......@@ -59,30 +123,49 @@
</template>
<template v-slot:body-cell-StuSex="props">
<q-td :props="props">
<q-badge :color="props.value == 1 ? 'negative' : 'primary'" :label="props.value == 1 ? '女' : '男'" />
<q-badge
:color="props.value == 1 ? 'negative' : 'primary'"
:label="props.value == 1 ? '女' : '男'"
/>
</q-td>
</template>
<template v-slot:body-cell-CurseManager="props">
<q-td :props="props" v-html="getCurseManager(props.row)"></q-td>
</template>
<template v-slot:body-cell-TeacherManager="props">
<q-td :props="props" v-html="getTeacherManager(props.row)"></q-td>
</template>
<template v-slot:body-cell-AssistList="props">
<q-td auto-width :props="props">
<template v-if="props.row.AssistList">
<template v-if="props.row.AssistList.length==1">
{{props.row.AssistList[0].AssistName}}
<template v-if="assistListFormat[props.pageIndex].length == 1">
{{ assistListFormat[props.pageIndex][0].AssistName }}
</template>
<template v-if="props.row.AssistList.length>1">
{{props.row.AssistList[0].AssistName}}
<template v-if="assistListFormat[props.pageIndex].length > 1">
{{ assistListFormat[props.pageIndex][0].AssistName }}
<span class="stulistNum">
{{props.row.AssistList.length}}
{{ assistListFormat[props.pageIndex].length }}
<q-popup-proxy>
<q-banner>
<div style="max-height:600px;overflow-y:auto;">
<table class="stuListTable" style="border-collapse:collapse;">
<table
class="stuListTable"
style="border-collapse:collapse;"
>
<tr>
<th>角色</th>
<th>协同人</th>
</tr>
<tr v-for="(sItem,sIndex) in props.row.AssistList" style="border-bottom:1px dashed #d1d1d1;" :key="sIndex">
<td>{{sItem.AssistTypeName}}</td>
<td>{{sItem.AssistName}}</td>
<tr
v-for="(sItem, sIndex) in assistListFormat[
props.pageIndex
]"
style="border-bottom:1px dashed #d1d1d1;"
:key="sIndex"
>
<td>{{ sItem.AssistTypeName }}</td>
<td>{{ sItem.AssistName }}</td>
</tr>
</table>
</div>
......@@ -90,7 +173,7 @@
</q-popup-proxy>
</span>
</template>
<template v-if="props.row.AssistList.length==0">
<template v-if="props.row.AssistList.length == 0">
</template>
</template>
......@@ -102,31 +185,56 @@
</q-td>
</template> -->
</q-table>
<student-form v-if="isShowStuForm" :save-obj="stuOption" @close="closeStuForm" @success="refreshStuList">
<student-form
v-if="isShowStuForm"
:save-obj="stuOption"
@close="closeStuForm"
@success="refreshStuList"
>
</student-form>
<studentRight-form v-if="isShowStuRight" :isJudgeTrans="isJudgeTrans" :BelongType="BelongType" :save-obj="stuOption" @close="closeStuForm" @success="refreshStuList">
<studentRight-form
v-if="isShowStuRight"
:isJudgeTrans="isJudgeTrans"
:BelongType="BelongType"
:save-obj="stuOption"
@close="closeStuForm"
@success="refreshStuList"
@reload="referDataHandler"
>
</studentRight-form>
<studentAdd-form v-if="isShowAdd" :save-obj="stuOption" @close="closeStuForm" @success="refreshStuList">
<studentAdd-form
v-if="isShowAdd"
:save-obj="stuOption"
@close="closeStuForm"
@success="refreshStuList"
>
</studentAdd-form>
<transfer-order v-if="isShowTransfer" :select="selection" @close="closeStuForm" @success="refreshStuList">
<transfer-order
v-if="isShowTransfer"
:select="selection"
@close="closeStuForm"
@success="refreshStuList"
>
</transfer-order>
</div>
</template>
<script>
import studentForm from "./student-form";
import studentRightForm from "./studentRight-form";
import studentAddForm from "./studentAdd-form";
import transferOrder from "./transfer-order"
export default {
import studentForm from "./student-form";
import studentRightForm from "./studentRight-form";
import studentAddForm from "./studentAdd-form";
import transferOrder from "./transfer-order";
import { mapGetters } from "vuex";
import { SetStudentAssistBatch } from "../../../api/sale/sale";
export default {
props: {
dataList: {
type: Array,
default: null
},
isJudgeTrans:{
isJudgeTrans: {
type: Number,
default: null
},
}
},
components: {
studentForm,
......@@ -136,7 +244,8 @@
},
data() {
return {
columns: [{
columns: [
{
name: "StuIcon",
label: "",
field: "StuIcon",
......@@ -149,6 +258,16 @@
align: "left",
field: row => row.StuName
},
{
name: "CurseManager",
label: "课程顾问",
align: "left"
},
{
name: "TeacherManager",
label: "协助老师",
align: "left"
},
{
name: "StuSex",
label: "性别",
......@@ -211,7 +330,7 @@
},
{
name: "AssistList",
label: "协同人",
label: "其他服务人员",
align: "left",
field: "AssistList"
},
......@@ -275,25 +394,46 @@
isShowAdd: false,
selection: [],
isShowTransfer: false,
BelongType:1
BelongType: 1,
pushMode: false,
pushing: false,
assistListFormat: []
};
},
watch:{
dataList:{
handler(val){
this.selection=[];
watch: {
dataList: {
handler(val) {
this.selection = [];
this.formatAssistList();
},
deep:true
deep: true
}
},
created() {
this.formatAssistList();
this.initAuth();
},
mounted() {},
computed: {
...mapGetters(["userInfo", "logo", "name"])
},
methods: {
//初始化权限
initAuth() {},
formatAssistList() {
this.assistListFormat = [];
this.dataList.forEach(x => {
let tempArr = [];
if (x.AssistList && x.AssistList.length > 0) {
x.AssistList.forEach(y => {
if (y.AssistType != 2 && y.AssistType != 4) {
tempArr.push(y);
}
});
}
this.assistListFormat.push(tempArr);
});
},
//创建账号
createAccount(id) {
let that = this;
......@@ -367,7 +507,8 @@
this.$q
.dialog({
title: str + "学员",
message: "你正在进行" + str + "学员行为,一旦执行无法找回,是否确认执行?",
message:
"你正在进行" + str + "学员行为,一旦执行无法找回,是否确认执行?",
persistent: true,
cancel: {
label: "取消",
......@@ -401,7 +542,7 @@
},
refreshStuList() {
this.$emit("success");
this.selection = []
this.selection = [];
},
EditStudent(obj) {
if (obj) {
......@@ -428,21 +569,85 @@
this.isShowStuRight = true;
},
transferOrder() {
const firstId = this.selection[0].CustomerId
const firstId = this.selection[0].CustomerId;
const flag = this.selection.every(e => {
return e.CustomerId == firstId
})
return e.CustomerId == firstId;
});
if (!flag) {
this.$q.notify({
type: 'negative',
type: "negative",
position: "top",
message: `所属同行不一致,请重新选择`
})
return
});
return;
}
this.isShowTransfer = true
this.isShowTransfer = true;
},
getCurseManager(row) {
let managerName = "<span class='text-grey-4'>暂未推送</span>";
if (row.AssistList && row.AssistList.length > 0) {
row.AssistList.forEach(y => {
if (y.AssistType == 2) {
managerName = `<span class='text-dark'>${y.AssistName}</span>`;
}
});
}
return managerName;
},
getTeacherManager(row) {
let managerName = "<span class='text-grey-4'>暂无</span>";
if (row.AssistList && row.AssistList.length > 0) {
row.AssistList.forEach(y => {
if (y.AssistType == 4) {
managerName = `<span class='text-dark'>${y.AssistName}</span>`;
}
});
}
return managerName;
},
assistBatchHandler() {
if (this.pushing) return;
this.pushing = true;
if (this.selection.length > 0) {
let msg = "";
let parameter = {
stuIds: ""
};
this.selection.forEach(x => {
parameter.stuIds += "," + x.StuId;
if (x.AssistList && x.AssistList.length > 0) {
x.AssistList.forEach(y => {
if (y.AssistType == 2) {
msg = `客户${x.StuName}:已存在课程顾问:${y.AssistName},无法再次推送。`;
}
});
}
});
if (msg == "") {
SetStudentAssistBatch(parameter).then(r => {
this.$emit("reload");
this.selection = [];
this.pushMode = false;
});
} else {
this.pushing = false;
this.errorMsg(msg);
}
} else {
this.pushing = false;
this.errorMsg("请选择要推送的学员");
}
},
referDataHandler() {
this.$emit("reload");
},
errorMsg(msg) {
this.$q.notify({
type: "negative",
position: "top",
message: msg
});
}
}
};
</script>
......@@ -3,29 +3,96 @@
<div class="page-search row items-center">
<div class="col row wrap q-mr-lg q-col-gutter-md">
<div class="col-3">
<q-input @input="resetSearch" dense clearable filled v-model="msg.StuName" label="昵称" maxlength="20" />
<q-input
@input="resetSearch"
dense
clearable
filled
v-model="msg.StuName"
label="昵称"
maxlength="20"
/>
</div>
<div class="col-3">
<q-input @input="resetSearch" dense clearable filled v-model="msg.StuTel" label="电话" maxlength="20" />
<q-input
@input="resetSearch"
dense
clearable
filled
v-model="msg.StuTel"
label="电话"
maxlength="20"
/>
</div>
<div class="col-3">
<q-input @input="resetSearch" dense clearable filled v-model="msg.QQ" label="QQ" maxlength="20" />
<q-input
@input="resetSearch"
dense
clearable
filled
v-model="msg.QQ"
label="QQ"
maxlength="20"
/>
</div>
<div class="col-3">
<q-input @input="resetSearch" dense clearable filled v-model="msg.WechatNo" label="微信号" maxlength="20" />
<q-input
@input="resetSearch"
dense
clearable
filled
v-model="msg.WechatNo"
label="微信号"
maxlength="20"
/>
</div>
<div class="col-3">
<q-select @input="resetSearch" filled v-model="msg.StuType" dense clearable :options="customTypeList"
option-label="Name" option-value="Id" emit-value map-options label="客户类型" />
<q-select
@input="resetSearch"
filled
v-model="msg.StuType"
dense
clearable
:options="customTypeList"
option-label="Name"
option-value="Id"
emit-value
map-options
label="客户类型"
/>
</div>
<div class="col-3">
<q-select @input="resetSearch" dense filled v-model="msg.StuStage" :options="customState" option-label="Name"
option-value="Id" emit-value map-options label="客户状态" clearable />
<q-select
@input="resetSearch"
dense
filled
v-model="msg.StuStage"
:options="customState"
option-label="Name"
option-value="Id"
emit-value
map-options
label="客户状态"
clearable
/>
</div>
<div class="col-3">
<q-select @input="resetSearch" dense v-model="msg.CustomerId" :options="myCustomerList" filled use-input
label="同行" option-label="CustomerName" option-value="CustomerId" ref="CustomerName" class="col-6" emit-value
map-options @filter="cusfilterFn">
<q-select
@input="resetSearch"
dense
v-model="msg.CustomerId"
:options="myCustomerList"
filled
use-input
label="同行"
option-label="CustomerName"
option-value="CustomerId"
ref="CustomerName"
class="col-6"
emit-value
map-options
@filter="cusfilterFn"
>
<template v-slot:no-option>
<q-item>
<q-item-section class="text-grey">
......@@ -36,43 +103,97 @@
</q-select>
</div>
<div class="col-3">
<q-select @input="resetBelong" dense filled option-value="Id" option-label="Name" v-model="msg.BelongType"
:options="BelongTypeList" emit-value map-options label="归属类型" />
<q-select
@input="resetBelong"
dense
filled
option-value="Id"
option-label="Name"
v-model="msg.BelongType"
:options="BelongTypeList"
emit-value
map-options
label="归属类型"
/>
</div>
<div class="col-3">
<q-field filled dense>
<template v-slot:control>
<el-date-picker v-model="dateArray" size="mini" @change="resetSearch" value-format="yyyy-MM-dd"
type="daterange" style="border:none;" range-separator="至" start-placeholder="开始时间"
end-placeholder="结束时间" />
<el-date-picker
v-model="dateArray"
size="mini"
@change="resetSearch"
value-format="yyyy-MM-dd"
type="daterange"
style="border:none;"
range-separator="至"
start-placeholder="开始时间"
end-placeholder="结束时间"
/>
</template>
</q-field>
</div>
<div class="col-3" >
<q-select @input="resetSearch" dense filled clearable use-input option-value="Id"
option-label="Name" v-model="msg.ExistCourseConsultant" :options="consultantList" emit-value map-options
label="是否存在课程顾问" />
<div class="col-3">
<q-select
@input="resetSearch"
dense
filled
clearable
use-input
option-value="Id"
option-label="Name"
v-model="msg.ExistCourseConsultant"
:options="consultantList"
emit-value
map-options
label="是否推送程顾问"
/>
</div>
<div class="col-3" v-if="msg.BelongType==4">
<q-select @input="resetSearch" dense clearable @filter="filterSubord" use-input filled option-value="Id"
option-label="EmployeeName" v-model="msg.CreateIds" multiple :options="SubordList" emit-value map-options
label="我下属的" />
<div class="col-3" v-if="msg.BelongType == 4">
<q-select
@input="resetSearch"
dense
clearable
@filter="filterSubord"
use-input
filled
option-value="Id"
option-label="EmployeeName"
v-model="msg.CreateIds"
multiple
:options="SubordList"
emit-value
map-options
label="我下属的"
/>
</div>
</div>
</div>
<div class="page-content">
<stulist :dataList="data" @success="refreshPage" ref="stuList" :isJudgeTrans="isJudgeTrans"> </stulist>
<stulist
:dataList="data"
@reload="getStudent"
@success="refreshPage"
ref="stuList"
:isJudgeTrans="isJudgeTrans"
>
</stulist>
<div class="row" style="justify-content: flex-end;padding: 5px 20px">
<q-pagination v-model="msg.pageIndex" :max="pageCount" @input="changePage" class="full-width justify-end"
color="primary" :input="true">
<q-pagination
v-model="msg.pageIndex"
:max="pageCount"
@input="changePage"
class="full-width justify-end"
color="primary"
:input="true"
>
</q-pagination>
</div>
</div>
</div>
</template>
<script>
import {
import {
getStudentPage,
getSchoolDropdown,
deleteStudent,
......@@ -80,22 +201,14 @@
queryStuStageList,
GetStudentTypeList,
GetPersonalDimension
} from "../../api/school/index";
import {
queryEmployee
} from "../../api/users/user";
import {
resetPassword
} from "../../api/users/user.js";
} from "../../api/school/index";
import { queryEmployee } from "../../api/users/user";
import { resetPassword } from "../../api/users/user.js";
import stulist from "../../components/school/student/stulist";
import {
getMyCustomerList
} from "../../api/sale/sale";
import {
mapGetters
} from "vuex";
export default {
import stulist from "../../components/school/student/stulist";
import { getMyCustomerList } from "../../api/sale/sale";
import { mapGetters } from "vuex";
export default {
meta: {
title: "客户管理"
},
......@@ -121,11 +234,11 @@
StartTime: "", //开始时间
EndTime: "", //结束时间
CustomerId: 0,
QQ: '',
WechatNo: '',
StuType: '',
QQ: "",
WechatNo: "",
StuType: "",
CreateIds: [],
ExistCourseConsultant:"",//是否存在课程顾问(1-存在,2=不存在)
ExistCourseConsultant: "" //是否存在课程顾问(1-存在,2=不存在)
},
dateArray: [], //日期数组
pageCount: 0,
......@@ -135,7 +248,8 @@
allCustomerList: [], //所有同行列表
customTypeList: [], //客户类型
//归属类型列表
BelongTypeList: [{
BelongTypeList: [
{
Id: 1,
Name: "全部"
},
......@@ -153,14 +267,15 @@
}
],
//课程顾问
consultantList: [{
consultantList: [
{
Id: 1,
Name: "是"
},
{
Id: 2,
Name: "否"
},
}
],
isJudgeTrans: 1, //用于判断转交是否有条件
SubordList: [], //我的下属数据
......@@ -212,7 +327,7 @@
if (res.Code == 1) {
this.customTypeList = res.Data;
}
})
});
},
resetSearch() {
this.msg.pageIndex = 1;
......@@ -249,11 +364,11 @@
this.pageCount = res.Data.PageCount;
this.data.forEach(x => {
if (x.CreateBy != this.userInfo.Id) {
x.BelongType = 3
x.BelongType = 3;
} else {
x.BelongType = 1
x.BelongType = 1;
}
})
});
})
.catch(() => {
this.loading = false;
......@@ -268,8 +383,8 @@
this.allCustomerList = res.Data;
this.myCustomerList.unshift({
CustomerName: "不限",
CustomerId: 0,
})
CustomerId: 0
});
});
},
cusfilterFn(val, update) {
......@@ -287,15 +402,15 @@
});
}
}
};
};
</script>
<style lang="sass">
@import url('~assets/css/table.sass')
@import url('~assets/css/table.sass')
</style>
<style scoped>
/deep/.el-input__inner,
/deep/.el-range-input {
/deep/.el-input__inner,
/deep/.el-range-input {
background-color: transparent;
border: none;
}
}
</style>
<template>
<div>
<q-card flat class="q-pa-lg q-my-lg" v-loading="loading">
<div class="text-h6 text-weight-bold">分配给以下部门/成员</div>
<div class="text-subtitle1 text-weight-bold q-my-md">
<span>适用部门/成员</span>
<span class="text-negative">*</span>
</div>
<div class="q-mb-md row">
<div class="col">
<q-btn
outline
color="primary"
class="q-px-lg"
@click="outerVisible = true"
>选择部门/成员</q-btn
>
</div>
<div class="col">已选择:{{ chosenUser.length }}</div>
</div>
<div class="q-mb-xl">
<q-badge
color="primary"
class="q-mr-md"
v-for="(x, i) in chosenUser"
:key="i"
>
{{ x.DeptName }}
</q-badge>
</div>
<div class="text-h6 text-weight-bold q-mt-xl">设置分配规则</div>
<div class="text-subtitle1 text-weight-bold q-my-md row items-center">
<div>选择分配规则:</div>
<div class="col q-ml-md">
<q-radio v-model="ruleType" val="0" label="顺序分配" />
<q-radio v-model="ruleType" val="1" label="随机分配" />
</div>
</div>
<q-btn
class="q-mt-xl q-px-lg"
unelevated
color="primary"
:loading="saving"
@click="saveHandler"
>立即保存</q-btn
>
</q-card>
<choiceapproval
v-if="outerVisible"
@close="getclose()"
@success="getsuccess2"
:byval="chosenUser"
cptype="0"
></choiceapproval>
</div>
</template>
<script>
import choiceapproval from "../../components/enterprise/choiceapproval";
import { getDictValueList } from "../../api/administration/administration";
import { saveDict } from "../../api/system/notiveSysSet";
export default {
components: { choiceapproval },
data() {
return {
chosenUser: [],
outerVisible: false,
ruleType: "0",
saving: false,
loading: true,
dictObjEmp: {},
dictObjRule: {}
};
},
created() {
this.init();
},
methods: {
getclose() {
// 企业关闭
this.ismember = false;
this.outerVisible = false;
},
getsuccess2(list, type) {
console.log(list);
this.chosenUser = list;
this.outerVisible = false;
},
init() {
getDictValueList({ Key: "PUSH_STU_UNION_EMP" }).then(res => {
if (res.Code == 1) {
this.dictObjEmp = res.Data[0];
if (res.Data[0].Content != "" && res.Data[0].Content != null) {
let tempVal = res.Data[0].Content.split(",");
let tempLabel = res.Data[0].Mask.split(",");
tempVal.forEach((x, i) => {
let temp = {
DeptId: x,
DeptName: tempLabel[i]
};
this.chosenUser.push(temp);
});
}
getDictValueList({ Key: "PUSH_STU_RULETYPE" }).then(r => {
this.dictObjRule = r.Data[0];
if (r.Code == 1) {
if (r.Data[0].Content != "" && res.Data[0].Content != null) {
this.ruleType = r.Data[0].Content;
}
}
this.loading = false;
});
}
});
},
saveHandler() {
if (this.chosenUser.length > 0) {
this.saving = true;
let contentTemp = "";
let maskTemp = "";
this.chosenUser.forEach(x => {
contentTemp += "," + x.DeptId;
maskTemp += "," + x.DeptName;
});
this.dictObjEmp.Content = contentTemp.substring(1);
this.dictObjEmp.Mask = maskTemp.substring(1);
saveDict(this.dictObjEmp).then(r => {
if (r.Code == 1) {
setTimeout(() => {
this.dictObjRule.Content = this.ruleType;
saveDict(this.dictObjRule).then(res => {
if (r.Code == 1) {
this.$q.notify({
icon: "iconfont icon-chenggong",
color: "accent",
timeout: 2000,
message: "数据保存成功!",
position: "top"
});
}
this.saving = false;
});
}, 1000);
} else {
this.saving = false;
}
});
} else {
this.$q.notify({
icon: "",
color: "negative",
timeout: 2000,
message: "请选择适用的部门成员",
position: "top"
});
}
}
}
};
</script>
<style></style>
<template>
<div class=page-body>
<div class="page-body">
<q-tabs
v-model="tabCheck"
narrow-indicator
......@@ -12,27 +12,31 @@
<q-tab :ripple="false" :name="3" label="学习目的" />
<q-tab :ripple="false" :name="4" label="收客渠道" />
<q-tab :ripple="false" :name="5" label="客户需求"></q-tab>
<q-tab :ripple="false" :name="6" label="客户分配规则"></q-tab>
</q-tabs>
<stage v-if="tabCheck==1"></stage>
<cusType v-if="tabCheck==2"></cusType>
<aim v-if="tabCheck==3"></aim>
<channel v-if="tabCheck==4"></channel>
<customneed v-if="tabCheck==5"></customneed>
<stage v-if="tabCheck == 1"></stage>
<cusType v-if="tabCheck == 2"></cusType>
<aim v-if="tabCheck == 3"></aim>
<channel v-if="tabCheck == 4"></channel>
<customneed v-if="tabCheck == 5"></customneed>
<stu-distribution-rule v-if="tabCheck == 6"></stu-distribution-rule>
</div>
</template>
<script>
import stage from "./stage";
import cusType from "./customType"
import aim from './studyAim'
import channel from './stuReceiveChannel'
import customneed from './customneed'
import cusType from "./customType";
import aim from "./studyAim";
import channel from "./stuReceiveChannel";
import customneed from "./customneed";
import stuDistributionRule from "./stuDistributionRule";
export default {
components: {
stage,
cusType,
aim,
channel,
customneed
customneed,
stuDistributionRule
},
data() {
return {
......
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