Commit 7c697708 authored by 黄奎's avatar 黄奎

页面修改

parent 88bf28b9
<style scoped>
@import "../../../pages/financial/css/cssReset.css";
.baseSet_Title {
width: 120px !important;
padding: 18px 0 0 16px;
text-align: right;
}
.singeRowTable tr th {
border: 1px solid #d2d2d2;
}
.studentTracking td:first-child {
background-color: #E6E6E6;
position: sticky;
left: 0px;
}
.studentTracking th:first-child {
position: sticky;
left: 0px;
}
.stulistNumber {
display: inline-block;
width: 25px;
height: 25px;
text-align: center;
line-height: 22px;
border: 1px solid #2961FE;
border-radius: 50%;
cursor: pointer;
color: #2961FE;
}
.OCourseTable {
width: 400px;
text-align: center;
}
.OCourseTable tr td {
height: 40px;
}
.OCourseTable tr th {
height: 40px;
background-color: rgb(238, 238, 239);
}
.stufollowlistNumber {
display: inline-block;
width: 25px;
height: 25px;
text-align: center;
line-height: 22px;
border: 1px solid #2961FE;
border-radius: 50%;
cursor: pointer;
color: #2961FE;
}
</style>
<template>
<div class="stufollowlist">
<div style="width: 100%;overflow-x: auto;">
<table class="po_content singeRowTable" ref="table" style="border:1px solid #E6E6E6;" cellspacing="0"
cellpadding="0" v-loading="loading">
<tr>
<th width="120" rowspan="2" style="min-width: 110px;z-index: 999;">学生</th>
<th width="120" rowspan="2" style="min-width: 110px;">电话</th>
<th width="120" rowspan="2" style="min-width: 110px;">课程顾问</th>
<th width="120" rowspan="2" style="min-width: 110px;">班主任</th>
<th width="100" rowspan="2" style="min-width: 100px;">合同时间</th>
<th width="200" rowspan="2" style="min-width: 200px;">所报课程</th>
<th width="200" rowspan="2" style="min-width: 200px;">开课时间</th>
<th width="200" rowspan="2" style="min-width: 200px;">结课时间</th>
<th width="80" rowspan="2" style="min-width: 80px;">当前级别</th>
<th width="100" rowspan="2" style="min-width: 100px;">生日</th>
<th width="100" rowspan="2" style="min-width: 100px;" v-if="ShowAuthObj.isShowSaleInfo">客户来源</th>
<th width="100" rowspan="2" style="min-width: 100px;">学习目的</th>
<th width="100" rowspan="2" style="min-width: 100px;" v-if="ShowAuthObj.isShowSaleInfo">来源关联人</th>
<th width="100" rowspan="2" style="min-width: 100px;" v-if="ShowAuthObj.isShowSaleInfo">收客渠道</th>
<th width="100" rowspan="2" style="min-width: 100px;">负责人</th>
<th width="100" rowspan="2" style="min-width: 100px;">合同状态</th>
<th width="100" rowspan="2" style="min-width: 120px;" v-if="ShowAuthObj.isShowSaleInfo">期望达成协议日期</th>
<th width="100" rowspan="2" style="min-width: 100px;" v-if="ShowAuthObj.isShowSaleInfo">目前状态</th>
<th width="100" rowspan="2" style="min-width: 100px;" v-if="ShowAuthObj.isShowSaleInfo">胜率</th>
<th width="100" rowspan="2" style="min-width: 100px;" v-if="ShowAuthObj.isShowSaleInfo">跟踪记录</th>
<th width="500" colspan="3" style="min-width: 500px;" v-for=" ( item , index ) in RListlength " :key='index'>
<div>{{index+1}}个月</div>
<div v-if="dataObj&&dataObj.MonthList">(累计续约:<span style="color: #F72E52">{{getxuyue(index).RenewNum}}
</span>
<span style="margin-left: 5px;">学员介绍:{{getxuyue(index).IntroductionNum}}</span>) </div>
</th>
</tr>
<tr>
<th v-for=" ( item , index ) in titlelist " :key='index' :width="item.Id==1?120:200">{{item.Name}}</th>
</tr>
<template v-if='dataObj&&dataObj.RList && dataObj.RList.length>0'>
<tr v-for=" ( item , index ) in dataObj.RList " :key="index">
<td style=" border: 1px solid #d2d2d2;">
<div class="text-blue cursor-pointer" @click="getStuRight(item)">
{{ item.StuName }}
</div>
</td>
<td>
<span>{{ item.StuTel }}</span>
</td>
<td>
<span v-html="getCurseManager(item)"></span>
</td>
<td>
<span v-html="getTeacherManager(item)"></span>
</td>
<td>
<span>{{ item.ContractSTime }}</span>
</td>
<td>
<span>{{ item.CourseName }}</span>
</td>
<td>
<span>{{ item.BeginClassDate }}</span>
</td>
<td>
<span>{{ item.GraduationTime }}</span>
</td>
<td>
<span>{{ item.JapanBaseInfo }}</span>
</td>
<td>
<span>{{ item.StuBirthStr }}</span>
</td>
<td v-if="ShowAuthObj.isShowSaleInfo">
<span>{{ item.CreateTypeName?item.CreateTypeName:'-' }}</span>
</td>
<td>
{{item.StuPurposeName}}
</td>
<td v-if="ShowAuthObj.isShowSaleInfo">
<span><span v-if="item.CreateType==2 && item.EnterpriseName">{{item.EnterpriseName}}:</span>
{{ item.StuSourceIdName?item.StuSourceIdName:'-' }}</span>
</td>
<td v-if="ShowAuthObj.isShowSaleInfo">
<span>{{ item.StuChannelName?item.StuChannelName:'-' }}</span>
</td>
<td>
<span>{{ item.CreateByName?item.CreateByName:'-' }}</span>
</td>
<td>
<span>{{ item.StuGuestStateName }}</span>
</td>
<td v-if="ShowAuthObj.isShowSaleInfo">
{{item.AdvisorExpectDate}}
</td>
<td v-if="ShowAuthObj.isShowSaleInfo">
{{item.AdvisorStatusName}}
</td>
<td v-if="ShowAuthObj.isShowSaleInfo">
{{item.AdvisorWinRate}}%
</td>
<td v-if="ShowAuthObj.isShowSaleInfo">
<template v-if="item.AdvisorList">
<template v-if="item.AdvisorList.length>0">
{{item.AdvisorList[0].AdvisorStatusName}}
<span class="stufollowlistNumber">
{{item.AdvisorList.length}}
<q-popup-proxy>
<q-banner>
<table class="OCourseTable" style="border-collapse:collapse;">
<tr>
<th style="width:100px">跟进状态</th>
<th style="width:120px">跟进日期</th>
<th style="width:100px">跟进比例</th>
<th style="width:300px">跟进备注</th>
</tr>
<tr v-for="(sItem,sIndex) in item.AdvisorList" style="border-bottom:1px dashed #d1d1d1;"
:key="sIndex">
<td>{{sItem.AdvisorStatusName}}</td>
<td>{{sItem.AdvisorDate}}</td>
<td>{{sItem.AdvisorRate}}</td>
<td style="text-align:left;">{{sItem.AdvisorRemark}}</td>
</tr>
</table>
</q-banner>
</q-popup-proxy>
</span>
</template>
<template v-if="item.AdvisorList.length==0">
</template>
</template>
</td>
<td v-for=" ( x , y ) in titlelist " :key="y">
<div v-if="item.MonthList[x.index]">
<div v-if="x.Id==1">
<span>{{item.MonthList[x.index].Month}}</span>
<span style="margin:0 3px">/</span>
<span v-if="item.MonthList[x.index].IsRenew==1" style="color: red;"></span>
<span v-if="item.MonthList[x.index].IsRenew==2"></span>
<span style="margin:0 3px">/</span>
<span
:style="{'color':item.MonthList[x.index].IntroductionNum>0?'red':'#111'}">{{item.MonthList[x.index].IntroductionNum}}</span>
</div>
<div v-if="x.Id==2" style="padding: 7px;">
<div v-if="item.MonthList[x.index].TeacherTime"
style="display: flex;align-items: center;justify-content: space-between;">
<div>{{item.MonthList[x.index].TeacherTime}}</div>
<span style="text-decoration: underline;cursor: pointer;color: #2961fe ;"
@click="lookgengduo(item,item.MonthList[x.index].TeacherTime)">更多</span>
</div>
<template>
<div v-if="item.MonthList[x.index].Teacher!=''" v-html="item.MonthList[x.index].Teacher"></div>
<span v-if="item.MonthList[x.index].Teacher==''">-</span>
</template>
</div>
<div v-if="x.Id==3" style="padding: 3px;">
<div v-if="item.MonthList[x.index].ConsultantTime"
style="display: flex;align-items: center;justify-content: space-between;">
<div>{{item.MonthList[x.index].ConsultantTime}}</div>
<span style="text-decoration: underline;cursor: pointer;color: #2961fe ;"
@click="lookgengduo(item,item.MonthList[x.index].ConsultantTime)">更多</span>
</div>
<template>
<div v-if="item.MonthList[x.index].Consultant" v-html="item.MonthList[x.index].Consultant"></div>
<span v-if="item.MonthList[x.index].Consultant==''">-</span>
</template>
</div>
</div>
</td>
</tr>
</template>
</table>
</div>
<div v-if='dataObj&&dataObj.RList && dataObj.RList.length>0'>
</div>
<div v-else
style="width: 100%;border:1px solid #E6E6E6;display: flex;align-items: center;justify-content: center;height: 60px;">
暂无数据
</div>
<studentRight-form v-if="isShowStuRight" :BelongType="BelongType" :save-obj="stuOption" @close="closeStuForm"
@success="refreshTable">
</studentRight-form>
<studentFUForm v-if="isShowStuFU" :save-obj="stuOption" @close="closeStuForm">
</studentFUForm>
</div>
</template>
<script>
import studentRightForm from "./studentRight-form";
import studentFUForm from "./studentFu-form";
export default {
props: {
//数据
dataObj: {
type: Object,
default: null
},
loading: {
type: Boolean,
default: false,
},
//表头数组
titlelist: {
type: Array,
default: null
},
//表头长度
RListlength: {
type: Number,
default: 0,
},
AuthObj: {
type: Object,
default: null
}
},
components: {
studentRightForm,
studentFUForm
},
data() {
return {
isShowStuFU: false,
isShowStuRight: false,
stuOption: {},
BelongType: 0,
ShowAuthObj: {
//是否显示同行、状态等信息
isShowSaleInfo: true,
},
};
},
mounted() {
if (this.AuthObj) {
this.ShowAuthObj.isShowSaleInfo = this.AuthObj.isShowSaleInfo;
}
},
methods: {
//刷新表格
refreshTable() {
this.$emit("success");
},
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;
},
lookgengduo(obj, time) { //跟进备注
//计算时间 月底日期
let Month = time.split('-')[0] + '-' + time.split('-')[1] + '-01'
let date = new Date(Month);
let currentMonth = date.getMonth();
let nextMonth = ++currentMonth;
let nextMonthFirstDay = new Date(date.getFullYear(), nextMonth, 1);
let oneDay = 1000 * 60 * 60 * 24;
let endDate = new Date(nextMonthFirstDay - oneDay)
let endMonth = time.split('-')[0] + '-' + time.split('-')[1] + '-' + endDate.getDate()
if (obj) {
this.stuOption = obj;
this.stuOption.STime = Month;
this.stuOption.ETime = endMonth;
this.BelongType = obj.BelongType;
}
this.isShowStuFU = true;
},
//点击学生姓名弹出
getStuRight(obj) {
if (obj) {
this.stuOption = obj;
this.BelongType = 3;
}
this.isShowStuRight = true;
},
//关闭弹窗
closeStuForm() {
this.isShowStuRight = false;
this.isShowStuFU = false
},
getxuyue(index) {
let obj = {
IntroductionNum: 0,
RenewNum: 0
};
this.dataObj.MonthList.forEach(x => {
if (x.MonthNum == index + 1) {
obj = x
}
})
return obj
},
}
};
</script>
\ No newline at end of file
...@@ -73,8 +73,8 @@ ...@@ -73,8 +73,8 @@
option-label="Name" option-value="Id" emit-value map-options label="客户类型" /> option-label="Name" option-value="Id" emit-value map-options label="客户类型" />
</div> </div>
<div class="col-3"> <div class="col-3">
<q-select @input="resetSearch" dense filled v-model="msg.StuStage" :options="customState" option-label="Name" <q-select @input="resetSearch" dense filled v-model="msg.AdvisorStatus" :options="AdvConfigList"
option-value="Id" emit-value map-options label="客户状态" clearable /> option-label="Name" option-value="Id" emit-value map-options label="当前状态" clearable />
</div> </div>
<div class="col-3"> <div class="col-3">
<q-select filled v-model="msg.StuPurpose" dense @input="resetSearch" clearable :options="goalsList" <q-select filled v-model="msg.StuPurpose" dense @input="resetSearch" clearable :options="goalsList"
...@@ -121,6 +121,11 @@ ...@@ -121,6 +121,11 @@
option-value="Id" option-label="Name" v-model="msg.CreateType" :options="customFromList" emit-value option-value="Id" option-label="Name" v-model="msg.CreateType" :options="customFromList" emit-value
map-options label="客户来源" /> map-options label="客户来源" />
</div> </div>
<div class="col-3">
<q-select filled v-model="msg.CreateBy" dense use-input @filter="filterStudent" label="市场"
:options="MarketList" option-label="EmployeeName" @input="resetSearch" clearable option-value="Id"
emit-value map-options />
</div>
<div class="col-3" v-if="msg.CreateType==1"> <div class="col-3" v-if="msg.CreateType==1">
<q-select filled v-model="msg.StuChannel" @input="resetSearch" label="收客渠道" dense :options="StuChannelList" <q-select filled v-model="msg.StuChannel" @input="resetSearch" label="收客渠道" dense :options="StuChannelList"
option-label="Name" option-value="Id" emit-value map-options use-input clearable option-label="Name" option-value="Id" emit-value map-options use-input clearable
...@@ -177,7 +182,7 @@ ...@@ -177,7 +182,7 @@
alt=""> alt="">
</span> </span>
</div> </div>
<div class="col row wrap q-gutter-x-md" v-if="dataList.Stat"> <div class="col row wrap q-gutter-x-md" v-if="dataList&&dataList.Stat">
<div class="col stics"> <div class="col stics">
<span class="stics-name">学生总数</span> <span class="stics-name">学生总数</span>
<span>{{dataList.Stat.StuTNum?dataList.Stat.StuTNum:0}}人</span> <span>{{dataList.Stat.StuTNum?dataList.Stat.StuTNum:0}}人</span>
...@@ -207,191 +212,12 @@ ...@@ -207,191 +212,12 @@
<span>{{dataList.Stat.DropOutNum?dataList.Stat.DropOutNum:0}}人</span> <span>{{dataList.Stat.DropOutNum?dataList.Stat.DropOutNum:0}}人</span>
</div> </div>
</div> </div>
<div style="width: 100%;margin-top: 20px"> <div style="width: 100%;margin-top: 20px">
<div style="width: 100%;overflow-x: auto;"> <stufollowlist :dataObj="dataList" :RListlength="RListlength" @success="refreshPage" :titlelist="titlelist"
<table class="po_content singeRowTable" ref="table" style="border:1px solid #E6E6E6;" cellspacing="0" :loading="loading" ref="stuFollowList"></stufollowlist>
cellpadding="0" v-loading="loading"> <q-pagination v-if='dataList&&dataList.RList && dataList.RList.length>0' class="full-width justify-end"
<tr>
<th width="120" rowspan="2" style="min-width: 110px;z-index: 999;">学生</th>
<th width="120" rowspan="2" style="min-width: 110px;">电话</th>
<th width="120" rowspan="2" style="min-width: 110px;">课程顾问</th>
<th width="120" rowspan="2" style="min-width: 110px;">班主任</th>
<th width="100" rowspan="2" style="min-width: 100px;">合同时间</th>
<th width="200" rowspan="2" style="min-width: 200px;">所报课程</th>
<th width="200" rowspan="2" style="min-width: 200px;">开课时间</th>
<th width="200" rowspan="2" style="min-width: 200px;">结课时间</th>
<th width="80" rowspan="2" style="min-width: 80px;">当前级别</th>
<th width="100" rowspan="2" style="min-width: 100px;">生日</th>
<th width="100" rowspan="2" style="min-width: 100px;">客户来源</th>
<th width="100" rowspan="2" style="min-width: 100px;">学习目的</th>
<th width="100" rowspan="2" style="min-width: 100px;">来源关联人</th>
<th width="100" rowspan="2" style="min-width: 100px;">收客渠道</th>
<th width="100" rowspan="2" style="min-width: 100px;">负责人</th>
<th width="100" rowspan="2" style="min-width: 100px;">合同状态</th>
<th width="100" rowspan="2" style="min-width: 120px;">期望达成协议日期</th>
<th width="100" rowspan="2" style="min-width: 100px;">目前状态</th>
<th width="100" rowspan="2" style="min-width: 100px;">胜率</th>
<th width="100" rowspan="2" style="min-width: 100px;">跟踪记录</th>
<th width="500" colspan="3" style="min-width: 500px;" v-for=" ( item , index ) in RListlength "
:key='index'>
<div>第{{index+1}}个月</div>
<div v-if="dataList.MonthList">(累计续约:<span style="color: #F72E52">{{getxuyue(index).RenewNum}} </span>
<span style="margin-left: 5px;">学员介绍:{{getxuyue(index).IntroductionNum}}</span>) </div>
</th>
</tr>
<tr>
<th v-for=" ( item , index ) in titlelist " :key='index' :width="item.Id==1?120:200">{{item.Name}}</th>
</tr>
<tr v-for=" ( item , index ) in dataList.RList " :key="index"
v-if='dataList.RList && dataList.RList.length>0'>
<td style=" border: 1px solid #d2d2d2;">
<div class="text-blue cursor-pointer" @click="getStuRight(item)">
{{ item.StuName }}
</div>
</td>
<td>
<span>{{ item.StuTel }}</span>
</td>
<td>
<span v-html="getCurseManager(item)"></span>
</td>
<td>
<span v-html="getTeacherManager(item)"></span>
</td>
<td>
<span>{{ item.ContractSTime }}</span>
</td>
<td>
<span>{{ item.CourseName }}</span>
</td>
<td>
<span>{{ item.BeginClassDate }}</span>
</td>
<td>
<span>{{ item.GraduationTime }}</span>
</td>
<td>
<span>{{ item.JapanBaseInfo }}</span>
</td>
<td>
<span>{{ item.StuBirthStr }}</span>
</td>
<td>
<span>{{ item.CreateTypeName?item.CreateTypeName:'-' }}</span>
</td>
<td>
{{item.StuPurposeName}}
</td>
<td>
<span><span v-if="item.CreateType==2 && item.EnterpriseName">{{item.EnterpriseName}}:</span>
{{ item.StuSourceIdName?item.StuSourceIdName:'-' }}</span>
</td>
<td>
<span>{{ item.StuChannelName?item.StuChannelName:'-' }}</span>
</td>
<td>
<span>{{ item.CreateByName?item.CreateByName:'-' }}</span>
</td>
<td>
<span>{{ item.StuGuestStateName }}</span>
</td>
<td>
{{item.AdvisorExpectDate}}
</td>
<td>
{{item.AdvisorStatusName}}
</td>
<td>
{{item.AdvisorWinRate}}%
</td>
<td>
<template v-if="item.AdvisorList">
<template v-if="item.AdvisorList.length>0">
{{item.AdvisorList[0].AdvisorStatusName}}
<span class="stulistNumber">
{{item.AdvisorList.length}}
<q-popup-proxy>
<q-banner>
<table class="OCourseTable" style="border-collapse:collapse;">
<tr>
<th>跟进状态</th>
<th>跟进日期</th>
<th>跟进比例</th>
<th>跟进备注</th>
</tr>
<tr v-for="(sItem,sIndex) in item.AdvisorList" style="border-bottom:1px dashed #d1d1d1;"
:key="sIndex">
<td>{{sItem.AdvisorStatusName}}</td>
<td>{{sItem.AdvisorDate}}</td>
<td>{{sItem.AdvisorRate}}</td>
<td>{{sItem.AdvisorRemark}}</td>
</tr>
</table>
</q-banner>
</q-popup-proxy>
</span>
</template>
<template v-if="item.AdvisorList.length==0">
</template>
</template>
</td>
<td v-for=" ( x , y ) in titlelist " :key="y">
<div v-if="item.MonthList[x.index]">
<div v-if="x.Id==1">
<span>{{item.MonthList[x.index].Month}}</span>
<span style="margin:0 3px">/</span>
<span v-if="item.MonthList[x.index].IsRenew==1" style="color: red;"></span>
<span v-if="item.MonthList[x.index].IsRenew==2"></span>
<span style="margin:0 3px">/</span>
<span
:style="{'color':item.MonthList[x.index].IntroductionNum>0?'red':'#111'}">{{item.MonthList[x.index].IntroductionNum}}</span>
</div>
<div v-if="x.Id==2" style="padding: 7px;">
<div v-if="item.MonthList[x.index].TeacherTime"
style="display: flex;align-items: center;justify-content: space-between;">
<div>{{item.MonthList[x.index].TeacherTime}}</div>
<span style="text-decoration: underline;cursor: pointer;color: #2961fe ;"
@click="lookgengduo(item,item.MonthList[x.index].TeacherTime)">更多</span>
</div>
<template>
<div v-if="item.MonthList[x.index].Teacher!=''" v-html="item.MonthList[x.index].Teacher"></div>
<span v-if="item.MonthList[x.index].Teacher==''">-</span>
</template>
</div>
<div v-if="x.Id==3" style="padding: 3px;">
<div v-if="item.MonthList[x.index].ConsultantTime"
style="display: flex;align-items: center;justify-content: space-between;">
<div>{{item.MonthList[x.index].ConsultantTime}}</div>
<span style="text-decoration: underline;cursor: pointer;color: #2961fe ;"
@click="lookgengduo(item,item.MonthList[x.index].ConsultantTime)">更多</span>
</div>
<template>
<div v-if="item.MonthList[x.index].Consultant" v-html="item.MonthList[x.index].Consultant"></div>
<span v-if="item.MonthList[x.index].Consultant==''">-</span>
</template>
</div>
</div>
</td>
</tr>
</table>
</div>
<div v-if='!dataList.RList||(dataList.RList && dataList.RList.length==0)'
style="width: 100%;border:1px solid #E6E6E6;display: flex;align-items: center;justify-content: center;height: 60px;">
暂无数据
</div>
<q-pagination v-if='dataList.RList && dataList.RList.length>0' class="full-width justify-end"
v-model="msg.pageIndex" color="primary" :max="PageCount" :input="true" @input="changePage" /> v-model="msg.pageIndex" color="primary" :max="PageCount" :input="true" @input="changePage" />
</div> </div>
<studentRight-form v-if="isShowStuRight" :isJudgeTrans="isJudgeTrans" :BelongType="BelongType" :save-obj="stuOption"
@close="closeStuForm" @success="getList" @reload="getList">
</studentRight-form>
<studentFUForm v-if="isShowStuFU" :save-obj="stuOption" @close="closeStuForm">
</studentFUForm>
</div> </div>
</template> </template>
<script> <script>
...@@ -418,30 +244,30 @@ ...@@ -418,30 +244,30 @@
getSchoolDropdown, getSchoolDropdown,
getStudentDorpDownList getStudentDorpDownList
} from "../../api/school/index"; } from "../../api/school/index";
import {
GetStudentAdvisorConfigList,
} from "../../api/customerstudent/customerstudent";
import { import {
EduDownLoad EduDownLoad
} from "../../api/common/common"; } from "../../api/common/common";
import studentRightForm from "../../components/school/student/studentRight-form"; import stufollowlist from "../../components/school/student/stufollowlist";
import studentFUForm from "../../components/school/student/studentFu-form";
import { import {
mapState mapState
} from "vuex"; } from "vuex";
export default { export default {
meta: { meta: {
title: "教师学员跟踪" title: "市场部学员跟踪"
}, },
props: {},
components: { components: {
studentRightForm, stufollowlist
studentFUForm
}, },
data() { data() {
return { return {
msg: { msg: {
pageIndex: 1, pageIndex: 1,
pageSize: 12, pageSize: 10,
rowsPerPage: 12, rowsPerPage: 10,
StuName: "", StuName: "",
StuRealMobile: '', StuRealMobile: '',
QQ: '', QQ: '',
...@@ -462,6 +288,8 @@ ...@@ -462,6 +288,8 @@
StuSourceId: '', StuSourceId: '',
StuPurpose: '', //学习目的 StuPurpose: '', //学习目的
QueryTpye: 3, QueryTpye: 3,
AdvisorStatus: "", //当前状态
CreateBy: "", //创建人员
}, },
//归属类型列表 //归属类型列表
BelongTypeList: [{ BelongTypeList: [{
...@@ -481,9 +309,8 @@ ...@@ -481,9 +309,8 @@
Name: "我下属的" Name: "我下属的"
} }
], ],
loading: false, loading: false,
dataList: [], //列表数据 dataList: null, //列表数据
PageCount: 0, PageCount: 0,
customTypeList: [], //客户类型 customTypeList: [], //客户类型
customState: [], customState: [],
...@@ -513,14 +340,8 @@ ...@@ -513,14 +340,8 @@
dateArray: [], //日期数组 dateArray: [], //日期数组
RListlength: 0, RListlength: 0,
titlelist: [], titlelist: [],
stuOption: null,
BelongType: 1,
isShowStuRight: false,
isJudgeTrans: 1,
SubordList: [], //我的下属数据 SubordList: [], //我的下属数据
AllSubordList: [], AllSubordList: [],
stuOption: null,
isShowStuFU: false,
morequery: true, morequery: true,
CompanyList: [], CompanyList: [],
allCourseList: [], //课程 allCourseList: [], //课程
...@@ -537,6 +358,8 @@ ...@@ -537,6 +358,8 @@
TransListData: [], //转介人数据 TransListData: [], //转介人数据
MyTransListData: [], MyTransListData: [],
goalsList: [], //学习目的列表 goalsList: [], //学习目的列表
AdvConfigList: [], //客户状态列表
MarketList: [], //市场人员列表
} }
}, },
created() { created() {
...@@ -547,6 +370,20 @@ ...@@ -547,6 +370,20 @@
return return
} }
}) })
this.getStuStageList();
this.getCustomTypeList();
this.GetSubordList();
this.getBranchList();
this.getCourseList(); //获取课程下拉
this.getRole();
this.getCustomFrom();
this.GetStuChannelList();
this.GetCustomerList();
this.getEmployeeList();
this.getStudentDorpDown();
this.queryGoalsList();
this.getAdvConfigList();
this.getMarketList()
}, },
computed: mapState({ computed: mapState({
//是否有下载权限 //是否有下载权限
...@@ -564,29 +401,42 @@ ...@@ -564,29 +401,42 @@
} }
}), }),
mounted() { mounted() {
this.getList(); //获取规则 this.getList(); //获取列表
this.getStuStageList();
this.getCustomTypeList();
this.GetSubordList();
this.getBranchList();
this.getCourseList(); //获取课程下拉
this.getRole();
this.getCustomFrom();
this.GetStuChannelList();
this.GetCustomerList();
this.getEmployeeList();
this.getStudentDorpDown();
this.queryGoalsList();
// this.downloadStudentFollow();
}, },
methods: { methods: {
//获取市场人员
getMarketList() {
var qMsg = {
IsLeave: 1,
Dept_Id: 4,
UserRole: 1
};
queryEmployee(qMsg).then(res => {
this.MarketList = res.Data;
});
},
//获取状态列表
getAdvConfigList() {
let msg = {
Name: ''
}
GetStudentAdvisorConfigList(msg).then(res => {
if (res.Code == 1) {
this.AdvConfigList = res.Data;
}
})
},
//刷新页面
refreshPage() {
this.getList()
},
downloadStudentFollow() { downloadStudentFollow() {
var msg = JSON.parse(JSON.stringify(this.msg)); var msg = JSON.parse(JSON.stringify(this.msg));
this.loading = true; this.loading = true;
EduDownLoad( EduDownLoad(
"/StudentStat/DownLoadStudentFollowUp", "/StudentStat/DownLoadStudentFollowUp",
msg, msg,
"学员跟踪.xls", res => { "市场部学员跟踪.xls", res => {
this.loading = false; this.loading = false;
} }
); );
...@@ -748,9 +598,8 @@ ...@@ -748,9 +598,8 @@
changePage(val) { changePage(val) {
this.msg.pageIndex = val; this.msg.pageIndex = val;
this.getList() this.getList()
}, },
getList(type) { getList() {
this.loading = true; this.loading = true;
let msg = JSON.parse(JSON.stringify(this.msg)) let msg = JSON.parse(JSON.stringify(this.msg))
if (this.dateArray && this.dateArray.length > 0) { if (this.dateArray && this.dateArray.length > 0) {
...@@ -781,11 +630,10 @@ ...@@ -781,11 +630,10 @@
if (msg.StuSourceId == '' || msg.StuSourceId == null) { if (msg.StuSourceId == '' || msg.StuSourceId == null) {
msg.StuSourceId = 0 msg.StuSourceId = 0
} }
getStudentFollowUpPageList(msg).then(res => { getStudentFollowUpPageList(msg).then(res => {
this.loading = false; this.loading = false;
this.RListlength = res.Data.PageData && res.Data.PageData.MaxMonth ? res.Data.PageData.MaxMonth : 1; this.RListlength = res.Data.PageData && res.Data.PageData.MaxMonth ? res.Data.PageData.MaxMonth : 1;
this.titlelist = [{ var titlelist = [{
Name: '月份/续费/转介', Name: '月份/续费/转介',
Id: 1, Id: 1,
index: 0 index: 0
...@@ -800,7 +648,7 @@ ...@@ -800,7 +648,7 @@
}, ]; }, ];
this.dataList = res.Data.PageData; this.dataList = res.Data.PageData;
this.PageCount = res.Data.PageCount; this.PageCount = res.Data.PageCount;
this.titlelist = []; titlelist = [];
for (let i = 0; i < this.RListlength; i++) { for (let i = 0; i < this.RListlength; i++) {
let obj = [{ let obj = [{
Name: '月份/续费/转介', Name: '月份/续费/转介',
...@@ -815,9 +663,9 @@ ...@@ -815,9 +663,9 @@
Id: 3, Id: 3,
index: i index: i
}, ] }, ]
this.titlelist = [...this.titlelist, ...obj] titlelist = [...titlelist, ...obj]
} }
this.titlelist = titlelist;
}) })
.catch(() => { .catch(() => {
this.loading = false; this.loading = false;
...@@ -838,57 +686,14 @@ ...@@ -838,57 +686,14 @@
this.customState = res.Data; this.customState = res.Data;
}); });
}, },
getxuyue(index) {
let obj = {
IntroductionNum: 0,
RenewNum: 0
};
this.dataList.MonthList.forEach(x => {
if (x.MonthNum == index + 1) {
obj = x
}
})
return obj
},
//点击学生姓名弹出
getStuRight(obj) {
if (obj) {
this.stuOption = obj;
this.BelongType = 3;
}
this.isShowStuRight = true;
},
closeStuForm() {
this.isShowStuRight = false;
this.isShowStuFU = false
},
resetBelong() { resetBelong() {
if (this.msg.BelongType != 4) { if (this.msg.BelongType != 4) {
this.msg.pageIndex = 1; this.msg.pageIndex = 1;
this.getList(); this.getList();
} }
}, },
lookgengduo(obj, time) { //跟进备注 //课程的筛选
filterFnkec(val, update) {
//计算时间 月底日期
let Month = time.split('-')[0] + '-' + time.split('-')[1] + '-01'
let date = new Date(Month);
let currentMonth = date.getMonth();
let nextMonth = ++currentMonth;
let nextMonthFirstDay = new Date(date.getFullYear(), nextMonth, 1);
let oneDay = 1000 * 60 * 60 * 24;
let endDate = new Date(nextMonthFirstDay - oneDay)
let endMonth = time.split('-')[0] + '-' + time.split('-')[1] + '-' + endDate.getDate()
if (obj) {
this.stuOption = obj;
this.stuOption.STime = Month;
this.stuOption.ETime = endMonth;
this.BelongType = obj.BelongType;
}
this.isShowStuFU = true;
},
filterFnkec(val, update) { //课程的栓选
update(() => { update(() => {
if (val === '') { if (val === '') {
this.myCourseList = this.allCourseList this.myCourseList = this.allCourseList
...@@ -898,29 +703,6 @@ ...@@ -898,29 +703,6 @@
} }
}) })
}, },
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;
},
}, },
} }
</script> </script>
......
<style scoped>
@import "../financial/css/cssReset.css";
.baseSet_Title {
width: 120px !important;
padding: 18px 0 0 16px;
text-align: right;
}
.singeRowTable tr th {
border: 1px solid #d2d2d2;
}
.studentTracking td:first-child {
background-color: #E6E6E6;
position: sticky;
left: 0px;
}
.studentTracking th:first-child {
position: sticky;
left: 0px;
}
.stulistNumber {
display: inline-block;
width: 25px;
height: 25px;
text-align: center;
line-height: 22px;
border: 1px solid #2961FE;
border-radius: 50%;
cursor: pointer;
color: #2961FE;
}
.OCourseTable {
width: 400px;
text-align: center;
}
.OCourseTable tr td {
height: 40px;
}
.OCourseTable tr th {
height: 40px;
background-color: rgb(238, 238, 239);
}
</style>
<template> <template>
<div class="page-body studentTracking"> <div class="page-body studentTracking">
<div class="page-search row items-center"> <div class="page-search row items-center">
...@@ -73,8 +23,8 @@ ...@@ -73,8 +23,8 @@
option-label="Name" option-value="Id" emit-value map-options label="客户类型" /> option-label="Name" option-value="Id" emit-value map-options label="客户类型" />
</div> </div>
<div class="col-3"> <div class="col-3">
<q-select @input="resetSearch" dense filled v-model="msg.StuStage" :options="customState" option-label="Name" <q-select @input="resetSearch" dense filled v-model="msg.AdvisorStatus" :options="AdvConfigList"
option-value="Id" emit-value map-options label="客户状态" clearable /> option-label="Name" option-value="Id" emit-value map-options label="当前状态" clearable />
</div> </div>
<div class="col-3"> <div class="col-3">
<q-select filled v-model="msg.StuPurpose" dense @input="resetSearch" clearable :options="goalsList" <q-select filled v-model="msg.StuPurpose" dense @input="resetSearch" clearable :options="goalsList"
...@@ -177,7 +127,7 @@ ...@@ -177,7 +127,7 @@
alt=""> alt="">
</span> </span>
</div> </div>
<div class="col row wrap q-gutter-x-md" v-if="dataList.Stat"> <div class="col row wrap q-gutter-x-md" v-if="dataList&&dataList.Stat">
<div class="col stics"> <div class="col stics">
<span class="stics-name">学生总数</span> <span class="stics-name">学生总数</span>
<span>{{dataList.Stat.StuTNum?dataList.Stat.StuTNum:0}}人</span> <span>{{dataList.Stat.StuTNum?dataList.Stat.StuTNum:0}}人</span>
...@@ -207,191 +157,12 @@ ...@@ -207,191 +157,12 @@
<span>{{dataList.Stat.DropOutNum?dataList.Stat.DropOutNum:0}}人</span> <span>{{dataList.Stat.DropOutNum?dataList.Stat.DropOutNum:0}}人</span>
</div> </div>
</div> </div>
<div style="width: 100%;margin-top: 20px"> <div style="width: 100%;margin-top: 20px">
<div style="width: 100%;overflow-x: auto;"> <stufollowlist :dataObj="dataList" :RListlength="RListlength" @success="refreshPage" :titlelist="titlelist"
<table class="po_content singeRowTable" ref="table" style="border:1px solid #E6E6E6;" cellspacing="0" :loading="loading" ref="stuFollowList"></stufollowlist>
cellpadding="0" v-loading="loading"> <q-pagination v-if='dataList&&dataList.RList && dataList.RList.length>0' class="full-width justify-end"
<tr>
<th width="120" rowspan="2" style="min-width: 110px;z-index: 999;">学生</th>
<th width="120" rowspan="2" style="min-width: 110px;">电话</th>
<th width="120" rowspan="2" style="min-width: 110px;">课程顾问</th>
<th width="120" rowspan="2" style="min-width: 110px;">班主任</th>
<th width="100" rowspan="2" style="min-width: 100px;">合同时间</th>
<th width="200" rowspan="2" style="min-width: 200px;">所报课程</th>
<th width="200" rowspan="2" style="min-width: 200px;">开课时间</th>
<th width="200" rowspan="2" style="min-width: 200px;">结课时间</th>
<th width="80" rowspan="2" style="min-width: 80px;">当前级别</th>
<th width="100" rowspan="2" style="min-width: 100px;">生日</th>
<th width="100" rowspan="2" style="min-width: 100px;">客户来源</th>
<th width="100" rowspan="2" style="min-width: 100px;">学习目的</th>
<th width="100" rowspan="2" style="min-width: 100px;">来源关联人</th>
<th width="100" rowspan="2" style="min-width: 100px;">收客渠道</th>
<th width="100" rowspan="2" style="min-width: 100px;">负责人</th>
<th width="100" rowspan="2" style="min-width: 100px;">合同状态</th>
<th width="100" rowspan="2" style="min-width: 120px;">期望达成协议日期</th>
<th width="100" rowspan="2" style="min-width: 100px;">目前状态</th>
<th width="100" rowspan="2" style="min-width: 100px;">胜率</th>
<th width="100" rowspan="2" style="min-width: 100px;">跟踪记录</th>
<th width="500" colspan="3" style="min-width: 500px;" v-for=" ( item , index ) in RListlength "
:key='index'>
<div>第{{index+1}}个月</div>
<div v-if="dataList.MonthList">(累计续约:<span style="color: #F72E52">{{getxuyue(index).RenewNum}} </span>
<span style="margin-left: 5px;">学员介绍:{{getxuyue(index).IntroductionNum}}</span>) </div>
</th>
</tr>
<tr>
<th v-for=" ( item , index ) in titlelist " :key='index' :width="item.Id==1?120:200">{{item.Name}}</th>
</tr>
<tr v-for=" ( item , index ) in dataList.RList " :key="index"
v-if='dataList.RList && dataList.RList.length>0'>
<td style=" border: 1px solid #d2d2d2;">
<div class="text-blue cursor-pointer" @click="getStuRight(item)">
{{ item.StuName }}
</div>
</td>
<td>
<span>{{ item.StuTel }}</span>
</td>
<td>
<span v-html="getCurseManager(item)"></span>
</td>
<td>
<span v-html="getTeacherManager(item)"></span>
</td>
<td>
<span>{{ item.ContractSTime }}</span>
</td>
<td>
<span>{{ item.CourseName }}</span>
</td>
<td>
<span>{{ item.BeginClassDate }}</span>
</td>
<td>
<span>{{ item.GraduationTime }}</span>
</td>
<td>
<span>{{ item.JapanBaseInfo }}</span>
</td>
<td>
<span>{{ item.StuBirthStr }}</span>
</td>
<td>
<span>{{ item.CreateTypeName?item.CreateTypeName:'-' }}</span>
</td>
<td>
{{item.StuPurposeName}}
</td>
<td>
<span><span v-if="item.CreateType==2 && item.EnterpriseName">{{item.EnterpriseName}}:</span>
{{ item.StuSourceIdName?item.StuSourceIdName:'-' }}</span>
</td>
<td>
<span>{{ item.StuChannelName?item.StuChannelName:'-' }}</span>
</td>
<td>
<span>{{ item.CreateByName?item.CreateByName:'-' }}</span>
</td>
<td>
<span>{{ item.StuGuestStateName }}</span>
</td>
<td>
{{item.AdvisorExpectDate}}
</td>
<td>
{{item.AdvisorStatusName}}
</td>
<td>
{{item.AdvisorWinRate}}%
</td>
<td>
<template v-if="item.AdvisorList">
<template v-if="item.AdvisorList.length>0">
{{item.AdvisorList[0].AdvisorStatusName}}
<span class="stulistNumber">
{{item.AdvisorList.length}}
<q-popup-proxy>
<q-banner>
<table class="OCourseTable" style="border-collapse:collapse;">
<tr>
<th>跟进状态</th>
<th>跟进日期</th>
<th>跟进比例</th>
<th>跟进备注</th>
</tr>
<tr v-for="(sItem,sIndex) in item.AdvisorList" style="border-bottom:1px dashed #d1d1d1;"
:key="sIndex">
<td>{{sItem.AdvisorStatusName}}</td>
<td>{{sItem.AdvisorDate}}</td>
<td>{{sItem.AdvisorRate}}</td>
<td>{{sItem.AdvisorRemark}}</td>
</tr>
</table>
</q-banner>
</q-popup-proxy>
</span>
</template>
<template v-if="item.AdvisorList.length==0">
</template>
</template>
</td>
<td v-for=" ( x , y ) in titlelist " :key="y">
<div v-if="item.MonthList[x.index]">
<div v-if="x.Id==1">
<span>{{item.MonthList[x.index].Month}}</span>
<span style="margin:0 3px">/</span>
<span v-if="item.MonthList[x.index].IsRenew==1" style="color: red;"></span>
<span v-if="item.MonthList[x.index].IsRenew==2"></span>
<span style="margin:0 3px">/</span>
<span
:style="{'color':item.MonthList[x.index].IntroductionNum>0?'red':'#111'}">{{item.MonthList[x.index].IntroductionNum}}</span>
</div>
<div v-if="x.Id==2" style="padding: 7px;">
<div v-if="item.MonthList[x.index].TeacherTime"
style="display: flex;align-items: center;justify-content: space-between;">
<div>{{item.MonthList[x.index].TeacherTime}}</div>
<span style="text-decoration: underline;cursor: pointer;color: #2961fe ;"
@click="lookgengduo(item,item.MonthList[x.index].TeacherTime)">更多</span>
</div>
<template>
<div v-if="item.MonthList[x.index].Teacher!=''" v-html="item.MonthList[x.index].Teacher"></div>
<span v-if="item.MonthList[x.index].Teacher==''">-</span>
</template>
</div>
<div v-if="x.Id==3" style="padding: 3px;">
<div v-if="item.MonthList[x.index].ConsultantTime"
style="display: flex;align-items: center;justify-content: space-between;">
<div>{{item.MonthList[x.index].ConsultantTime}}</div>
<span style="text-decoration: underline;cursor: pointer;color: #2961fe ;"
@click="lookgengduo(item,item.MonthList[x.index].ConsultantTime)">更多</span>
</div>
<template>
<div v-if="item.MonthList[x.index].Consultant" v-html="item.MonthList[x.index].Consultant"></div>
<span v-if="item.MonthList[x.index].Consultant==''">-</span>
</template>
</div>
</div>
</td>
</tr>
</table>
</div>
<div v-if='!dataList.RList||(dataList.RList && dataList.RList.length==0)'
style="width: 100%;border:1px solid #E6E6E6;display: flex;align-items: center;justify-content: center;height: 60px;">
暂无数据
</div>
<q-pagination v-if='dataList.RList && dataList.RList.length>0' class="full-width justify-end"
v-model="msg.pageIndex" color="primary" :max="PageCount" :input="true" @input="changePage" /> v-model="msg.pageIndex" color="primary" :max="PageCount" :input="true" @input="changePage" />
</div> </div>
<studentRight-form v-if="isShowStuRight" :isJudgeTrans="isJudgeTrans" :BelongType="BelongType" :save-obj="stuOption"
@close="closeStuForm" @success="getList" @reload="getList">
</studentRight-form>
<studentFUForm v-if="isShowStuFU" :save-obj="stuOption" @close="closeStuForm">
</studentFUForm>
</div> </div>
</template> </template>
<script> <script>
...@@ -421,27 +192,29 @@ ...@@ -421,27 +192,29 @@
import { import {
EduDownLoad EduDownLoad
} from "../../api/common/common"; } from "../../api/common/common";
import studentRightForm from "../../components/school/student/studentRight-form"; import {
import studentFUForm from "../../components/school/student/studentFu-form"; GetStudentAdvisorConfigList,
} from "../../api/customerstudent/customerstudent";
import stufollowlist from "../../components/school/student/stufollowlist";
import { import {
mapState mapState
} from "vuex"; } from "vuex";
export default { export default {
meta: { meta: {
title: "教师学员跟踪" title: "课程顾问学员跟踪"
}, },
props: {}, props: {},
components: { components: {
studentRightForm, stufollowlist
studentFUForm
}, },
data() { data() {
return { return {
msg: { msg: {
pageIndex: 1, pageIndex: 1,
pageSize: 12, pageSize: 10,
rowsPerPage: 12, rowsPerPage: 10,
StuName: "", StuName: "",
StuRealMobile: '', StuRealMobile: '',
QQ: '', QQ: '',
...@@ -461,7 +234,8 @@ ...@@ -461,7 +234,8 @@
StuChannel: "", //收客渠道 StuChannel: "", //收客渠道
StuSourceId: '', StuSourceId: '',
StuPurpose: '', //学习目的, StuPurpose: '', //学习目的,
QueryTpye:1, QueryTpye: 1,
AdvisorStatus: "", //当前状态
}, },
//归属类型列表 //归属类型列表
BelongTypeList: [{ BelongTypeList: [{
...@@ -483,7 +257,7 @@ ...@@ -483,7 +257,7 @@
], ],
loading: false, loading: false,
dataList: [], //列表数据 dataList: null, //列表数据
PageCount: 0, PageCount: 0,
customTypeList: [], //客户类型 customTypeList: [], //客户类型
customState: [], customState: [],
...@@ -513,14 +287,8 @@ ...@@ -513,14 +287,8 @@
dateArray: [], //日期数组 dateArray: [], //日期数组
RListlength: 0, RListlength: 0,
titlelist: [], titlelist: [],
stuOption: null,
BelongType: 1,
isShowStuRight: false,
isJudgeTrans: 1,
SubordList: [], //我的下属数据 SubordList: [], //我的下属数据
AllSubordList: [], AllSubordList: [],
stuOption: null,
isShowStuFU: false,
morequery: true, morequery: true,
CompanyList: [], CompanyList: [],
allCourseList: [], //课程 allCourseList: [], //课程
...@@ -537,6 +305,7 @@ ...@@ -537,6 +305,7 @@
TransListData: [], //转介人数据 TransListData: [], //转介人数据
MyTransListData: [], MyTransListData: [],
goalsList: [], //学习目的列表 goalsList: [], //学习目的列表
AdvConfigList: [], //客户状态列表
} }
}, },
created() { created() {
...@@ -546,7 +315,20 @@ ...@@ -546,7 +315,20 @@
this.msg.IsQueryMyStu = 0 this.msg.IsQueryMyStu = 0
return return
} }
}) });
this.getStuStageList();
this.getCustomTypeList();
this.GetSubordList();
this.getBranchList();
this.getCourseList(); //获取课程下拉
this.getRole();
this.getCustomFrom();
this.GetStuChannelList();
this.GetCustomerList();
this.getEmployeeList();
this.getStudentDorpDown();
this.queryGoalsList();
this.getAdvConfigList();
}, },
computed: mapState({ computed: mapState({
//是否有下载权限 //是否有下载权限
...@@ -564,29 +346,31 @@ ...@@ -564,29 +346,31 @@
} }
}), }),
mounted() { mounted() {
this.getList(); //获取规则 this.getList(); //获取列表
this.getStuStageList();
this.getCustomTypeList();
this.GetSubordList();
this.getBranchList();
this.getCourseList(); //获取课程下拉
this.getRole();
this.getCustomFrom();
this.GetStuChannelList();
this.GetCustomerList();
this.getEmployeeList();
this.getStudentDorpDown();
this.queryGoalsList();
// this.downloadStudentFollow();
}, },
methods: { methods: {
//获取状态列表
getAdvConfigList() {
let msg = {
Name: ''
}
GetStudentAdvisorConfigList(msg).then(res => {
if (res.Code == 1) {
this.AdvConfigList = res.Data;
}
})
},
//刷新页面
refreshPage() {
this.getList()
},
downloadStudentFollow() { downloadStudentFollow() {
var msg = JSON.parse(JSON.stringify(this.msg)); var msg = JSON.parse(JSON.stringify(this.msg));
this.loading = true; this.loading = true;
EduDownLoad( EduDownLoad(
"/StudentStat/DownLoadStudentFollowUp", "/StudentStat/DownLoadStudentFollowUp",
msg, msg,
"学员跟踪.xls", res => { "课程顾问部学员跟踪.xls", res => {
this.loading = false; this.loading = false;
} }
); );
...@@ -748,9 +532,8 @@ ...@@ -748,9 +532,8 @@
changePage(val) { changePage(val) {
this.msg.pageIndex = val; this.msg.pageIndex = val;
this.getList() this.getList()
}, },
getList(type) { getList() {
this.loading = true; this.loading = true;
let msg = JSON.parse(JSON.stringify(this.msg)) let msg = JSON.parse(JSON.stringify(this.msg))
if (this.dateArray && this.dateArray.length > 0) { if (this.dateArray && this.dateArray.length > 0) {
...@@ -781,11 +564,10 @@ ...@@ -781,11 +564,10 @@
if (msg.StuSourceId == '' || msg.StuSourceId == null) { if (msg.StuSourceId == '' || msg.StuSourceId == null) {
msg.StuSourceId = 0 msg.StuSourceId = 0
} }
getStudentFollowUpPageList(msg).then(res => { getStudentFollowUpPageList(msg).then(res => {
this.loading = false; this.loading = false;
this.RListlength = res.Data.PageData && res.Data.PageData.MaxMonth ? res.Data.PageData.MaxMonth : 1; this.RListlength = res.Data.PageData && res.Data.PageData.MaxMonth ? res.Data.PageData.MaxMonth : 1;
this.titlelist = [{ var titlelist = [{
Name: '月份/续费/转介', Name: '月份/续费/转介',
Id: 1, Id: 1,
index: 0 index: 0
...@@ -800,7 +582,7 @@ ...@@ -800,7 +582,7 @@
}, ]; }, ];
this.dataList = res.Data.PageData; this.dataList = res.Data.PageData;
this.PageCount = res.Data.PageCount; this.PageCount = res.Data.PageCount;
this.titlelist = []; titlelist = [];
for (let i = 0; i < this.RListlength; i++) { for (let i = 0; i < this.RListlength; i++) {
let obj = [{ let obj = [{
Name: '月份/续费/转介', Name: '月份/续费/转介',
...@@ -815,14 +597,13 @@ ...@@ -815,14 +597,13 @@
Id: 3, Id: 3,
index: i index: i
}, ] }, ]
this.titlelist = [...this.titlelist, ...obj] titlelist = [...titlelist, ...obj]
} }
this.titlelist = titlelist;
}) })
.catch(() => { .catch(() => {
this.loading = false; this.loading = false;
}); });
}, },
//获取客户类型 //获取客户类型
getCustomTypeList() { getCustomTypeList() {
...@@ -838,57 +619,14 @@ ...@@ -838,57 +619,14 @@
this.customState = res.Data; this.customState = res.Data;
}); });
}, },
getxuyue(index) {
let obj = {
IntroductionNum: 0,
RenewNum: 0
};
this.dataList.MonthList.forEach(x => {
if (x.MonthNum == index + 1) {
obj = x
}
})
return obj
},
//点击学生姓名弹出
getStuRight(obj) {
if (obj) {
this.stuOption = obj;
this.BelongType = 3;
}
this.isShowStuRight = true;
},
closeStuForm() {
this.isShowStuRight = false;
this.isShowStuFU = false
},
resetBelong() { resetBelong() {
if (this.msg.BelongType != 4) { if (this.msg.BelongType != 4) {
this.msg.pageIndex = 1; this.msg.pageIndex = 1;
this.getList(); this.getList();
} }
}, },
lookgengduo(obj, time) { //跟进备注 //课程的筛选
filterFnkec(val, update) {
//计算时间 月底日期
let Month = time.split('-')[0] + '-' + time.split('-')[1] + '-01'
let date = new Date(Month);
let currentMonth = date.getMonth();
let nextMonth = ++currentMonth;
let nextMonthFirstDay = new Date(date.getFullYear(), nextMonth, 1);
let oneDay = 1000 * 60 * 60 * 24;
let endDate = new Date(nextMonthFirstDay - oneDay)
let endMonth = time.split('-')[0] + '-' + time.split('-')[1] + '-' + endDate.getDate()
if (obj) {
this.stuOption = obj;
this.stuOption.STime = Month;
this.stuOption.ETime = endMonth;
this.BelongType = obj.BelongType;
}
this.isShowStuFU = true;
},
filterFnkec(val, update) { //课程的栓选
update(() => { update(() => {
if (val === '') { if (val === '') {
this.myCourseList = this.allCourseList this.myCourseList = this.allCourseList
...@@ -898,29 +636,6 @@ ...@@ -898,29 +636,6 @@
} }
}) })
}, },
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;
},
}, },
} }
</script> </script>
......
...@@ -73,8 +73,8 @@ ...@@ -73,8 +73,8 @@
option-label="Name" option-value="Id" emit-value map-options label="客户类型" /> option-label="Name" option-value="Id" emit-value map-options label="客户类型" />
</div> </div>
<div class="col-3"> <div class="col-3">
<q-select @input="resetSearch" dense filled v-model="msg.StuStage" :options="customState" option-label="Name" <q-select @input="resetSearch" dense filled v-model="msg.AdvisorStatus" :options="AdvConfigList"
option-value="Id" emit-value map-options label="客户状态" clearable /> option-label="Name" option-value="Id" emit-value map-options label="当前状态" clearable />
</div> </div>
<div class="col-3"> <div class="col-3">
<q-select filled v-model="msg.StuPurpose" dense @input="resetSearch" clearable :options="goalsList" <q-select filled v-model="msg.StuPurpose" dense @input="resetSearch" clearable :options="goalsList"
...@@ -181,7 +181,7 @@ ...@@ -181,7 +181,7 @@
alt=""> alt="">
</span> </span>
</div> </div>
<div class="col row wrap q-gutter-x-md" v-if="dataList.Stat"> <div class="col row wrap q-gutter-x-md" v-if="dataList&&dataList.Stat">
<div class="col stics"> <div class="col stics">
<span class="stics-name">学生总数</span> <span class="stics-name">学生总数</span>
<span>{{dataList.Stat.StuTNum?dataList.Stat.StuTNum:0}}人</span> <span>{{dataList.Stat.StuTNum?dataList.Stat.StuTNum:0}}人</span>
...@@ -212,130 +212,11 @@ ...@@ -212,130 +212,11 @@
</div> </div>
</div> </div>
<div style="width: 100%;margin-top: 20px"> <div style="width: 100%;margin-top: 20px">
<div style="width: 100%;overflow-x: auto;"> <stufollowlist :dataObj="dataList" :RListlength="RListlength" @success="refreshPage" :titlelist="titlelist"
<table class="po_content singeRowTable" ref="table" style="border:1px solid #E6E6E6;" cellspacing="0" :loading="loading" ref="stuFollowList" :AuthObj="AuthObj"></stufollowlist>
cellpadding="0" v-loading="loading"> <q-pagination v-if='dataList&&dataList.RList && dataList.RList.length>0' class="full-width justify-end"
<tr>
<th width="120" rowspan="2" style="min-width: 110px;z-index: 999;">学生</th>
<th width="120" rowspan="2" style="min-width: 110px;">电话</th>
<th width="120" rowspan="2" style="min-width: 110px;">课程顾问</th>
<th width="120" rowspan="2" style="min-width: 110px;">班主任</th>
<th width="100" rowspan="2" style="min-width: 100px;">合同时间</th>
<th width="200" rowspan="2" style="min-width: 200px;">所报课程</th>
<th width="100" rowspan="2" style="min-width: 100px;">开课时间</th>
<th width="100" rowspan="2" style="min-width: 100px;">结课时间</th>
<th width="80" rowspan="2" style="min-width: 80px;">当前级别</th>
<th width="100" rowspan="2" style="min-width: 100px;">生日</th>
<th width="100" rowspan="2" style="min-width: 100px;">学习目的</th>
<th width="100" rowspan="2" style="min-width: 100px;">负责人</th>
<th width="100" rowspan="2" style="min-width: 100px;">合同状态</th>
<th width="500" colspan="3" style="min-width: 500px;" v-for=" ( item , index ) in RListlength "
:key='index'>
<div>第{{index+1}}个月</div>
<div v-if="dataList.MonthList">(累计续约:<span style="color: #F72E52">{{getxuyue(index).RenewNum}} </span>
<span style="margin-left: 5px;">学员介绍:{{getxuyue(index).IntroductionNum}}</span>) </div>
</th>
</tr>
<tr>
<th v-for=" ( item , index ) in titlelist " :key='index' :width="item.Id==1?120:200">{{item.Name}}</th>
</tr>
<tr v-for=" ( item , index ) in dataList.RList " :key="index"
v-if='dataList.RList && dataList.RList.length>0'>
<td style=" border: 1px solid #d2d2d2;">
<div class="text-blue cursor-pointer" @click="getStuRight(item)">
{{ item.StuName }}
</div>
</td>
<td>
<span>{{ item.StuTel }}</span>
</td>
<td>
<span v-html="getCurseManager(item)"></span>
</td>
<td>
<span v-html="getTeacherManager(item)"></span>
</td>
<td>
<span>{{ item.ContractSTime }}</span>
</td>
<td>
<span>{{ item.CourseName }}</span>
</td>
<td>
<span>{{ item.BeginClassDate }}</span>
</td>
<td>
<span>{{ item.GraduationTime }}</span>
</td>
<td>
<span>{{ item.JapanBaseInfo }}</span>
</td>
<td>
<span>{{ item.StuBirthStr }}</span>
</td>
<td>
{{item.StuPurposeName}}
</td>
<td>
<span>{{ item.CreateByName?item.CreateByName:'-' }}</span>
</td>
<td>
<span>{{ item.StuGuestStateName }}</span>
</td>
<td v-for=" ( x , y ) in titlelist " :key="y">
<div v-if="item.MonthList[x.index]">
<div v-if="x.Id==1">
<span>{{item.MonthList[x.index].Month}}</span>
<span style="margin:0 3px">/</span>
<span v-if="item.MonthList[x.index].IsRenew==1" style="color: red;"></span>
<span v-if="item.MonthList[x.index].IsRenew==2"></span>
<span style="margin:0 3px">/</span>
<span
:style="{'color':item.MonthList[x.index].IntroductionNum>0?'red':'#111'}">{{item.MonthList[x.index].IntroductionNum}}</span>
</div>
<div v-if="x.Id==2" style="padding: 7px;">
<div v-if="item.MonthList[x.index].TeacherTime"
style="display: flex;align-items: center;justify-content: space-between;">
<div>{{item.MonthList[x.index].TeacherTime}}</div>
<span style="text-decoration: underline;cursor: pointer;color: #2961fe ;"
@click="lookgengduo(item,item.MonthList[x.index].TeacherTime)">更多</span>
</div>
<template>
<div v-if="item.MonthList[x.index].Teacher!=''" v-html="item.MonthList[x.index].Teacher"></div>
<span v-if="item.MonthList[x.index].Teacher==''">-</span>
</template>
</div>
<div v-if="x.Id==3" style="padding: 3px;">
<div v-if="item.MonthList[x.index].ConsultantTime"
style="display: flex;align-items: center;justify-content: space-between;">
<div>{{item.MonthList[x.index].ConsultantTime}}</div>
<span style="text-decoration: underline;cursor: pointer;color: #2961fe ;"
@click="lookgengduo(item,item.MonthList[x.index].ConsultantTime)">更多</span>
</div>
<template>
<div v-if="item.MonthList[x.index].Consultant" v-html="item.MonthList[x.index].Consultant"></div>
<span v-if="item.MonthList[x.index].Consultant==''">-</span>
</template>
</div>
</div>
</td>
</tr>
</table>
</div>
<div v-if='!dataList.RList||(dataList.RList && dataList.RList.length==0)'
style="width: 100%;border:1px solid #E6E6E6;display: flex;align-items: center;justify-content: center;height: 60px;">
暂无数据
</div>
<q-pagination v-if='dataList.RList && dataList.RList.length>0' class="full-width justify-end"
v-model="msg.pageIndex" color="primary" :max="PageCount" :input="true" @input="changePage" /> v-model="msg.pageIndex" color="primary" :max="PageCount" :input="true" @input="changePage" />
</div> </div>
<studentRight-form v-if="isShowStuRight" :isJudgeTrans="isJudgeTrans" :BelongType="BelongType" :save-obj="stuOption"
@close="closeStuForm" @success="getList" @reload="getList">
</studentRight-form>
<studentFUForm v-if="isShowStuFU" :save-obj="stuOption" @close="closeStuForm">
</studentFUForm>
</div> </div>
</template> </template>
<script> <script>
...@@ -365,20 +246,21 @@ ...@@ -365,20 +246,21 @@
import { import {
EduDownLoad EduDownLoad
} from "../../api/common/common"; } from "../../api/common/common";
import studentRightForm from "../../components/school/student/studentRight-form"; import {
import studentFUForm from "../../components/school/student/studentFu-form"; GetStudentAdvisorConfigList,
} from "../../api/customerstudent/customerstudent";
import stufollowlist from "../../components/school/student/stufollowlist";
import { import {
mapState mapState
} from "vuex"; } from "vuex";
export default { export default {
meta: { meta: {
title: "学员跟踪" title: "教师学员跟踪"
}, },
props: {}, props: {},
components: { components: {
studentRightForm, stufollowlist
studentFUForm
}, },
data() { data() {
return { return {
...@@ -386,8 +268,8 @@ ...@@ -386,8 +268,8 @@
IsLeave: 1, IsLeave: 1,
msg: { msg: {
pageIndex: 1, pageIndex: 1,
pageSize: 12, pageSize: 10,
rowsPerPage: 12, rowsPerPage: 10,
StuName: "", StuName: "",
StuRealMobile: '', StuRealMobile: '',
QQ: '', QQ: '',
...@@ -409,7 +291,8 @@ ...@@ -409,7 +291,8 @@
StuSourceId: '', StuSourceId: '',
StuPurpose: '', //学习目的 StuPurpose: '', //学习目的
HeadTeacherId: '', //老师 HeadTeacherId: '', //老师
QueryTpye:2, QueryTpye: 2,
AdvisorStatus: "", //当前状态
}, },
//归属类型列表 //归属类型列表
BelongTypeList: [{ BelongTypeList: [{
...@@ -431,7 +314,7 @@ ...@@ -431,7 +314,7 @@
], ],
loading: false, loading: false,
dataList: [], //列表数据 dataList: null, //列表数据
PageCount: 0, PageCount: 0,
customTypeList: [], //客户类型 customTypeList: [], //客户类型
customState: [], customState: [],
...@@ -461,14 +344,8 @@ ...@@ -461,14 +344,8 @@
dateArray: [], //日期数组 dateArray: [], //日期数组
RListlength: 0, RListlength: 0,
titlelist: [], titlelist: [],
stuOption: null,
BelongType: 1,
isShowStuRight: false,
isJudgeTrans: 1,
SubordList: [], //我的下属数据 SubordList: [], //我的下属数据
AllSubordList: [], AllSubordList: [],
stuOption: null,
isShowStuFU: false,
morequery: true, morequery: true,
CompanyList: [], CompanyList: [],
allCourseList: [], //课程 allCourseList: [], //课程
...@@ -486,6 +363,10 @@ ...@@ -486,6 +363,10 @@
MyTransListData: [], MyTransListData: [],
goalsList: [], //学习目的列表 goalsList: [], //学习目的列表
MyTeacherListData: [], //查询老师列表 MyTeacherListData: [], //查询老师列表
AdvConfigList: [], //客户状态列表
AuthObj: {
isShowSaleInfo: false,
}
} }
}, },
created() { created() {
...@@ -508,6 +389,20 @@ ...@@ -508,6 +389,20 @@
this.dateArray.push(this.$route.query.EndTime); this.dateArray.push(this.$route.query.EndTime);
} }
} }
this.getStuStageList();
this.getCustomTypeList();
this.GetSubordList();
this.getBranchList();
this.getCourseList(); //获取课程下拉
this.getRole();
this.getCustomFrom();
this.GetStuChannelList();
this.GetCustomerList();
this.getEmployeeList();
this.getStudentDorpDown();
this.queryGoalsList();
this.findData();
this.getAdvConfigList();
}, },
computed: mapState({ computed: mapState({
//是否有下载权限 //是否有下载权限
...@@ -525,22 +420,25 @@ ...@@ -525,22 +420,25 @@
} }
}), }),
mounted() { mounted() {
this.getList(); //获取规则 this.getList(); //获取列表
this.getStuStageList();
this.getCustomTypeList();
this.GetSubordList();
this.getBranchList();
this.getCourseList(); //获取课程下拉
this.getRole();
this.getCustomFrom();
this.GetStuChannelList();
this.GetCustomerList();
this.getEmployeeList();
this.getStudentDorpDown();
this.queryGoalsList();
this.findData();
}, },
methods: { methods: {
//获取状态列表
getAdvConfigList() {
let msg = {
Name: ''
}
GetStudentAdvisorConfigList(msg).then(res => {
if (res.Code == 1) {
this.AdvConfigList = res.Data;
}
})
},
//刷新页面
refreshPage() {
this.getList()
},
//获取班主任
findData() { findData() {
queryEmployee({ queryEmployee({
AccountTypeStr: "2", AccountTypeStr: "2",
...@@ -557,7 +455,7 @@ ...@@ -557,7 +455,7 @@
EduDownLoad( EduDownLoad(
"/StudentStat/DownLoadStudentFollowUp", "/StudentStat/DownLoadStudentFollowUp",
msg, msg,
"学员跟踪.xls", res => { "教师学员跟踪.xls", res => {
this.loading = false; this.loading = false;
} }
); );
...@@ -719,9 +617,8 @@ ...@@ -719,9 +617,8 @@
changePage(val) { changePage(val) {
this.msg.pageIndex = val; this.msg.pageIndex = val;
this.getList() this.getList()
}, },
getList(type) { getList() {
this.loading = true; this.loading = true;
let msg = JSON.parse(JSON.stringify(this.msg)) let msg = JSON.parse(JSON.stringify(this.msg))
if (this.dateArray && this.dateArray.length > 0) { if (this.dateArray && this.dateArray.length > 0) {
...@@ -752,11 +649,10 @@ ...@@ -752,11 +649,10 @@
if (msg.StuSourceId == '' || msg.StuSourceId == null) { if (msg.StuSourceId == '' || msg.StuSourceId == null) {
msg.StuSourceId = 0 msg.StuSourceId = 0
} }
getStudentFollowUpPageList(msg).then(res => { getStudentFollowUpPageList(msg).then(res => {
this.loading = false; this.loading = false;
this.RListlength = res.Data.PageData && res.Data.PageData.MaxMonth ? res.Data.PageData.MaxMonth : 1; this.RListlength = res.Data.PageData && res.Data.PageData.MaxMonth ? res.Data.PageData.MaxMonth : 1;
this.titlelist = [{ var titlelist = [{
Name: '月份/续费/转介', Name: '月份/续费/转介',
Id: 1, Id: 1,
index: 0 index: 0
...@@ -771,7 +667,7 @@ ...@@ -771,7 +667,7 @@
}, ]; }, ];
this.dataList = res.Data.PageData; this.dataList = res.Data.PageData;
this.PageCount = res.Data.PageCount; this.PageCount = res.Data.PageCount;
this.titlelist = []; titlelist = [];
for (let i = 0; i < this.RListlength; i++) { for (let i = 0; i < this.RListlength; i++) {
let obj = [{ let obj = [{
Name: '月份/续费/转介', Name: '月份/续费/转介',
...@@ -786,14 +682,13 @@ ...@@ -786,14 +682,13 @@
Id: 3, Id: 3,
index: i index: i
}, ] }, ]
this.titlelist = [...this.titlelist, ...obj] titlelist = [...titlelist, ...obj]
} }
this.titlelist = titlelist;
}) })
.catch(() => { .catch(() => {
this.loading = false; this.loading = false;
}); });
}, },
//获取客户类型 //获取客户类型
getCustomTypeList() { getCustomTypeList() {
...@@ -809,56 +704,12 @@ ...@@ -809,56 +704,12 @@
this.customState = res.Data; this.customState = res.Data;
}); });
}, },
getxuyue(index) {
let obj = {
IntroductionNum: 0,
RenewNum: 0
};
this.dataList.MonthList.forEach(x => {
if (x.MonthNum == index + 1) {
obj = x
}
})
return obj
},
//点击学生姓名弹出
getStuRight(obj) {
if (obj) {
this.stuOption = obj;
this.BelongType = 3;
}
this.isShowStuRight = true;
},
closeStuForm() {
this.isShowStuRight = false;
this.isShowStuFU = false
},
resetBelong() { resetBelong() {
if (this.msg.BelongType != 4) { if (this.msg.BelongType != 4) {
this.msg.pageIndex = 1; this.msg.pageIndex = 1;
this.getList(); this.getList();
} }
}, },
lookgengduo(obj, time) { //跟进备注
//计算时间 月底日期
let Month = time.split('-')[0] + '-' + time.split('-')[1] + '-01'
let date = new Date(Month);
let currentMonth = date.getMonth();
let nextMonth = ++currentMonth;
let nextMonthFirstDay = new Date(date.getFullYear(), nextMonth, 1);
let oneDay = 1000 * 60 * 60 * 24;
let endDate = new Date(nextMonthFirstDay - oneDay)
let endMonth = time.split('-')[0] + '-' + time.split('-')[1] + '-' + endDate.getDate()
if (obj) {
this.stuOption = obj;
this.stuOption.STime = Month;
this.stuOption.ETime = endMonth;
this.BelongType = obj.BelongType;
}
this.isShowStuFU = true;
},
filterFnkec(val, update) { //课程的栓选 filterFnkec(val, update) { //课程的栓选
update(() => { update(() => {
if (val === '') { if (val === '') {
...@@ -869,39 +720,6 @@ ...@@ -869,39 +720,6 @@
} }
}) })
}, },
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;
},
getClassTeacher(row) {
let managerName = "<span class='text-grey-4'>暂无</span>";
if (row.AssistList && row.AssistList.length > 0) {
row.AssistList.forEach(y => {
if (y.AssistType == 6) {
managerName = `<span class='text-dark'>${y.AssistName}</span>`;
}
});
}
return managerName;
},
} }
} }
</script> </script>
......
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