Commit 88443ad6 authored by 吴春's avatar 吴春

1

parent f676b355
......@@ -238,6 +238,21 @@ export function querySupplierType() {
data
})
}
/**
* 获取已报名学员列表
*/
export function GetStudentMonthList(data) {
return request({
url: '/StudentStat/GetStudentMonthList',
method: 'post',
data
})
}
/**
* 获取客人咨询分页列表
*/
......
<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="monthStatisticslist">
<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" style="min-width: 110px;">学生</th>
<th width="200" style="min-width: 110px;z-index: 999;">时间</th>
<th width="120" style="min-width: 110px;">类型</th>
<th width="120" style="min-width: 110px;">学历</th>
<th width="100" style="min-width: 100px;">目的</th>
<th width="200" style="min-width: 200px;">是否签合同</th>
<th width="200" style="min-width: 200px;">来源</th>
<th width="200" style="min-width: 200px;">来源人</th>
<th width="200" style="min-width: 200px;">课程名称</th>
<th width="200" style="min-width: 80px;">订单金额</th>
</tr>
<template v-if='dataObj&&dataObj.list && dataObj.list.length>0'>
<tr v-for=" ( item , index ) in dataObj.list " :key="index">
<td style=" border: 1px solid #d2d2d2;">
<div class="text-blue cursor-pointer" @click="getStuRight(item)">
{{ item.StuName }}
</div>
</td>
<td>
<span>{{ item.CreateTimeStr }}</span>
</td>
<td>
<span>{{ item.JoinType==3?"内产":"新生" }}</span>
</td>
<td>
<span>{{item.StuEducationName}}</span>
</td>
<td>
<span>{{item.StuProfession}}</span>
</td>
<!-- <td>
<span>{{ item.CourseName }}</span>
</td> -->
<td>
<span>{{ item.AdvisorStatusName }}</span>
</td>
<td>{{item.CreateTypeStr}}</td>
<td>
<span v-if="item.CreateType==2 && item.EnterpriseName">{{item.EnterpriseName}}:</span>
<span>{{item.StuSourceIdName?item.StuSourceIdName:(item.StuChannelName+"-"+item.CreateByName) }}</span>
</td>
<td>{{item.CourseName}}</td>
<td>
<span>{{ item.OrderIncome }}{{item.Refund>0?",已退款"+item.Refund:""}}</span>
</td>
</tr>
</template>
</table>
</div>
<div v-if='dataObj&&dataObj.list && dataObj.list.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,
},
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;
},
//点击学生姓名弹出
getStuRight(obj) {
console.log("我进来啦",obj);
if (obj) {
this.stuOption = obj;
this.BelongType = 3;
}
this.isShowStuRight = true;
},
//关闭弹窗
closeStuForm() {
this.isShowStuRight = false;
this.isShowStuFU = false
},
}
};
</script>
\ No newline at end of file
......@@ -53,86 +53,25 @@
<div class="page-search row items-center">
<div class="col row wrap q-mr-lg q-col-gutter-md">
<div class="col-3">
<!-- <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="msg.StartTime" type="month" value-format="yyyy-MM" placeholder="订单日期"
size="small" style="border:none;" @change="resetSearch" clear-icon="iconfont icon-guanbi">
</el-date-picker>
</template>
</q-field>
</div>
<template v-if="morequery">
<div class="col-3">
<q-select @input="resetSearch" dense filled option-value="SId" option-label="SName" v-model="msg.School_Id"
:options="CompanyList" emit-value map-options label="校区" />
</div>
<div class="col-3">
<q-select @input="resetSearch" filled option-value="CourseId" option-label="CourseName"
v-model="msg.CourseId" clearable emit-value use-input :options="myCourseList" label="课程" dense map-options
@filter="filterFnkec" />
</div>
<div class="col-3">
<q-select @input="resetSearch" dense filled option-value="Id" option-label="EmployeeName"
v-model="msg.ConsultantId" clearable :options="RoleListData" emit-value map-options label="课程顾问" />
</div>
<div class="col-3">
<q-select @input="resetSearch" dense filled option-value="Id" option-label="Name"
v-model="msg.StuGuestState" clearable :options="hetongList" emit-value map-options label="合同状态" />
</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">
<q-select @input="msg.StuSourceId='',msg.StuChannel='',resetSearch()" dense clearable filled
option-value="Id" option-label="Name" v-model="msg.CreateType" :options="customFromList" emit-value
map-options label="客户来源" />
</div>
<div class="col-3" v-if="msg.CreateType==1">
<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
@filter="filterStuChannel">
<template v-slot:no-option>
<q-item>
<q-item-section class="text-grey">
未找到相关数据
</q-item-section>
</q-item>
</template>
</q-select>
</div>
<div class="col-3" v-if="msg.CreateType==2">
<q-select filled v-model="msg.StuSourceId" dense :options="customList" use-input label="关联同行"
@filter="filterFn" option-label="CustomerName" @input="resetSearch" clearable option-value="CustomerId"
emit-value map-options>
<template v-slot:no-option>
<q-item>
<q-item-section class="text-grey">
未找到相关数据
</q-item-section>
</q-item>
</template>
</q-select>
</div>
<div class="col-3" v-if="msg.CreateType==3">
<q-select filled v-model="msg.StuSourceId" dense @filter="filterEmployee" label="介绍人" use-input
:options="myEmployeeList" option-label="EmployeeName" @input="resetSearch" clearable option-value="Id"
emit-value map-options />
</div>
<div class="col-3" v-if="msg.CreateType==4">
<q-select filled v-model="msg.StuSourceId" dense use-input @filter="filterStudent" label="转介人"
:options="MyTransListData" option-label="StuName" @input="resetSearch" clearable option-value="StuId"
emit-value map-options />
</div>
<div class="col-3">
</div> -->
(
<q-radio size="xs" v-model="msg.Q_FType" val="1" label="范围内有跟进记录" @input='resetSearch' />
<q-radio size="xs" v-model="msg.Q_FType" val="2" label="范围内没有跟进记录" @input='resetSearch' />
<div class="col-2" style="width: 13%">
<q-field filled dense>
<el-date-picker v-model="msg.StartTime" type="month" value-format="yyyy-MM" placeholder="订单日期" size="small"
style="width: 100%" @change="resetSearch" clear-icon="iconfont icon-guanbi" >
</el-date-picker>
</q-field>
</div>
</template>
</div>
</div>
......@@ -140,53 +79,52 @@
<span @click="morequery=!morequery" style="display:inline-flex;align-items:center;cursor: pointer;">
<q-btn color="accent" class="q-mr-md" size="sm" icon="download" label="下载" v-if="isHaveDownLoad"
@click="downloadStudentFollow" />
<span style="margin-right:5px;color: #089bab;">高级查询</span>
<img v-show="!morequery" style="width:12px;height:12px" src="../../assets/images/more.png" alt="">
<img v-show="morequery" class="roatImg" style="width:12px;height:12px" src="../../assets/images/more.png"
alt="">
</span>
</div>
<div class="col row wrap q-gutter-x-md" v-if="dataList&&dataList.Stat">
<div class="col row wrap q-gutter-x-md" v-if="dataList">
<div class="col stics">
<span class="stics-name">学生总数</span>
<span>{{dataList.Stat.StuTNum?dataList.Stat.StuTNum:0}}人</span>
<span class="stics-name">订单总价</span>
<span>{{dataList.totalPrice}}</span>
</div>
<div class="col stics">
<span class="stics-name">续费数量</span>
<span style="color: #F72E52">{{dataList.Stat.RenewNum?dataList.Stat.RenewNum:0}}人</span>
<span class="stics-name">总单数</span>
<span>{{dataList.orderNum}}</span>
</div>
<div class="col stics">
<span class="stics-name">新生数量</span>
<span style="color:#2961FE;">{{dataList.Stat.NewNum?dataList.Stat.NewNum:0}}人</span>
<span class="stics-name">上旬总价</span>
<span style="color: #F72E52">{{dataList.totalPriceShang}}</span>
</div>
<div class="col stics">
<span class="stics-name">学习中数量</span>
<span>{{dataList.Stat.StudyNum?dataList.Stat.StudyNum:0}}人</span>
<span class="stics-name">中旬总价</span>
<span style="color:#2961FE;">{{dataList.totalPriceZhong}}</span>
</div>
<div class="col stics">
<span class="stics-name">毕业数量</span>
<span>{{dataList.Stat.GraduateNum?dataList.Stat.GraduateNum:0}}人</span>
<span class="stics-name">下旬总价</span>
<span>{{dataList.totalPriceXia}}</span>
</div>
<div v-if="dataList.sourceList&&dataList.sourceList.length>0" v-for=" ( itemSource , indexSource ) in dataList.sourceList " :key="indexSource">
<div class="col stics">
<span class="stics-name">停课数量</span>
<span>{{dataList.Stat.SuspendNum?dataList.Stat.SuspendNum:0}}人</span>
<span class="stics-name">{{itemSource.CreateTypeStr}}</span>
<span>{{itemSource.OrderNum}}单</span>
<span>占比{{itemSource.PriceRate*100}}%</span>
</div>
<div class="col stics">
<span class="stics-name">退学数量</span>
<span>{{dataList.Stat.DropOutNum?dataList.Stat.DropOutNum:0}}人</span>
</div>
</div>
<div style="width: 100%;margin-top: 20px">
<stufollowlist :dataObj="dataList" :RListlength="RListlength" @success="refreshPage" :titlelist="titlelist"
:loading="loading" ref="stuFollowList"></stufollowlist>
<q-pagination v-if='dataList&&dataList.RList && dataList.RList.length>0' class="full-width justify-end"
v-model="msg.pageIndex" color="primary" :max="PageCount" :input="true" @input="changePage" />
<monthStatisticslist :dataObj="dataList" @success="refreshPage"
:loading="loading" ref="monthStatisticslist"></monthStatisticslist>
</div>
</div>
</template>
<script>
import {
getStudentFollowUpPageList,
GetStudentMonthList,
} from '../../api/studyabroad/index'
import {
queryCourseDropdownList,
......@@ -214,7 +152,7 @@
import {
EduDownLoad
} from "../../api/common/common";
import stufollowlist from "../../components/school/student/stufollowlist";
import monthStatisticslist from "../../components/school/student/monthStatisticslist";
import {
mapState
} from "vuex";
......@@ -224,105 +162,24 @@
title: "市场部学员跟踪"
},
components: {
stufollowlist
monthStatisticslist
},
data() {
return {
msg: {
pageIndex: 1,
pageSize: 10,
rowsPerPage: 10,
StuName: "",
StuRealMobile: '',
QQ: '',
WeChatNo: '',
StuType: '', //学生类型
StuGuestState: '', //合同状态
SFTime: '',
EFTime: '',
StuStage: '', //客户状态
Q_FType: '1', //跟进类型 1范围内有跟进记录 2范围内没有跟进记录
CreateIds: [],
School_Id: '-1', //校区
CourseId: '', //课程
ConsultantId: '', //课程顾问
CreateType: '', //客户来源
StuChannel: "", //收客渠道
StuSourceId: '',
StuPurpose: '', //学习目的
QueryTpye: 3, //市场部查询
AdvisorStatus: "", //当前状态
CreateBy: "", //创建人员
StartTime: '',
},
loading: false,
dataList: null, //列表数据
PageCount: 0,
customTypeList: [], //客户类型
customState: [],
isMyStuList: [{
Id: '-1',
Name: '不限'
}, {
Id: '1',
Name: '是'
}, {
Id: '0',
Name: '否'
}, ],
hetongList: [{
Id: '1',
Name: '正常'
}, {
Id: '2',
Name: '退学'
}, {
Id: '5',
Name: '停课'
}, {
Id: '7',
Name: '毕业'
}, ],
dateArray: [], //日期数组
RListlength: 0,
titlelist: [],
SubordList: [], //我的下属数据
AllSubordList: [],
morequery: true,
CompanyList: [],
allCourseList: [], //课程
myCourseList: [],
RoleListData: [], //课程顾问下拉数据
customFromList: [], //客户来源
StuChannelList: [], //收客渠道
allStuChannelList: [], //所有收客渠道
customList: [], //同行列表
allCustomList: [], //所有同行列表
//员工列表
employeeList: [],
myEmployeeList: [],
TransListData: [], //转介人数据
MyTransListData: [],
goalsList: [], //学习目的列表
AdvConfigList: [], //客户状态列表
MarketList: [], //市场人员列表
}
},
created() {
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()
let firstDay = new Date();
var year = firstDay.getFullYear(); //年
var month = firstDay.getMonth() + 1-2; //月
this.msg.StartTime=year + '-' + month;
},
computed: mapState({
//是否有下载权限
......@@ -343,28 +200,7 @@
this.getList(); //获取列表
},
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()
......@@ -373,110 +209,17 @@
var msg = JSON.parse(JSON.stringify(this.msg));
this.loading = true;
EduDownLoad(
"/StudentStat/DownLoadStudentFollowUp",
"/StudentStat/DownLoadStudentMonth",
msg,
"市场部学员跟踪.xls", res => {
"已报名学员.xls", res => {
this.loading = false;
}
);
},
//获取学习目的列表
queryGoalsList() {
getGuestLearningGoalsEnumList({}).then(res => {
this.goalsList = res.Data;
});
},
//获取收客渠道
GetStuChannelList() {
GetStuChannelList({}).then(res => {
if (res.Code == 1) {
this.StuChannelList = res.Data;
this.allStuChannelList = res.Data;
}
});
},
//筛选渠道
filterStuChannel(val, update) {
update(() => {
if (val === "") {
this.StuChannelList = JSON.parse(
JSON.stringify(this.allStuChannelList)
);
} else {
const needle = val.toLowerCase();
this.StuChannelList = this.allStuChannelList.filter(
v => v.Name.toLowerCase().indexOf(needle) > -1
);
}
});
},
//获取客户来源
getCustomFrom() {
CreateTypeList({}).then(res => {
if (res.Code == 1) {
this.customFromList = res.Data;
}
});
},
//获取客户下拉数据
GetCustomerList() {
let msg = {
QCreateBy: 0
};
GetCustomerList(msg).then(res => {
if (res.Code == 1) {
this.customList = res.Data;
this.allCustomList = res.Data;
}
});
},
//筛选客户
filterFn(val, update) {
update(() => {
if (val === "") {
this.customList = JSON.parse(JSON.stringify(this.allCustomList));
} else {
const needle = val.toLowerCase();
this.customList = this.allCustomList.filter(
v => v.CustomerName.toLowerCase().indexOf(needle) > -1
);
}
});
},
//获取员工列表
getEmployeeList() {
queryEmployee({
IsLeave: 1
}).then(res => {
this.employeeList = res.Data;
this.myEmployeeList = res.Data;
});
},
//筛选员工
filterEmployee(val, update, abort) {
update(() => {
this.myEmployeeList = this.employeeList.filter(
v => v.EmployeeName.indexOf(val) > -1
);
});
},
//获取转介人下拉
getStudentDorpDown() {
getStudentDorpDownList().then(res => {
if (res.Code == 1) {
this.TransListData = res.Data;
this.MyTransListData = res.Data;
}
});
},
//筛选转介人
filterStudent(val, update, abort) {
update(() => {
this.MyTransListData = this.TransListData.filter(
v => v.StuName.indexOf(val) > -1
);
});
},
getRole() {
queryEmployee({
IsLeave: 1,
......@@ -485,126 +228,18 @@
this.RoleListData = res.Data;
});
},
getBranchList() { //获取校区
getSchoolDropdown({}).then(res => {
var tempArray = res.Data;
if (!tempArray) {
tempArray = [];
}
tempArray.unshift({
SId: '-1',
SName: "不限"
})
this.CompanyList = tempArray;
}).catch(() => {
})
},
//获取课程
getCourseList() {
queryCourseDropdownList({
IsQPrice: 1
}).then(res => {
if (res.Code == 1) {
let data = res.Data
this.allCourseList = JSON.parse(JSON.stringify(data));
this.myCourseList = JSON.parse(JSON.stringify(data));
}
})
},
//获取我下属的下拉数据
GetSubordList() {
GetPersonalDimension().then(res => {
if (res.Code == 1) {
this.SubordList = res.Data;
this.AllSubordList = res.Data;
}
});
},
//筛选转介人
filterSubord(val, update, abort) {
update(() => {
this.SubordList = this.AllSubordList.filter(
v => v.EmployeeName.indexOf(val) > -1
);
});
},
resetSearch() {
this.msg.pageIndex = 1;
this.getList();
},
//翻页
changePage(val) {
this.msg.pageIndex = val;
this.getList()
},
getList() {
this.loading = true;
let msg = JSON.parse(JSON.stringify(this.msg))
if (this.dateArray && this.dateArray.length > 0) {
msg.SFTime = this.dateArray[0];
msg.EFTime = this.dateArray[1];
} else {
msg.SFTime = "";
msg.EFTime = "";
}
if (msg.StuType == '' || msg.StuType == null) {
msg.StuType = 0
}
if (msg.StuGuestState == '' || msg.StuGuestState == null) {
msg.StuGuestState = 0
}
if (msg.StuStage == '' || msg.StuStage == null) {
msg.StuStage = 0
}
if (msg.ConsultantId == '' || msg.ConsultantId == null) {
msg.ConsultantId = 0
}
if (msg.StuChannel == '' || msg.StuChannel == null) {
msg.StuChannel = 0
}
if (msg.CreateType == '' || msg.CreateType == null) {
msg.CreateType = 0
}
if (msg.StuSourceId == '' || msg.StuSourceId == null) {
msg.StuSourceId = 0
}
getStudentFollowUpPageList(msg).then(res => {
GetStudentMonthList(msg).then(res => {
this.loading = false;
this.RListlength = res.Data.PageData && res.Data.PageData.MaxMonth ? res.Data.PageData.MaxMonth : 1;
var titlelist = [{
Name: '月份/续费/转介',
Id: 1,
index: 0
}, {
Name: '教师跟踪时间及情况说明',
Id: 2,
index: 0
}, {
Name: '顾问跟踪时间及情况说明',
Id: 3,
index: 0
}, ];
this.dataList = res.Data.PageData;
this.PageCount = res.Data.PageCount;
titlelist = [];
for (let i = 0; i < this.RListlength; i++) {
let obj = [{
Name: '月份/续费/转介',
Id: 1,
index: i
}, {
Name: '教师跟踪时间及情况说明',
Id: 2,
index: i
}, {
Name: '顾问跟踪时间及情况说明',
Id: 3,
index: i
}, ]
titlelist = [...titlelist, ...obj]
}
this.titlelist = titlelist;
console.log("res.Data",res.Data.list);
this.dataList = res.Data;
})
.catch(() => {
this.loading = false;
......
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