Commit 0ce4d62a authored by zhengke's avatar zhengke

增加统计

parent ae8c5321
......@@ -530,6 +530,54 @@ export function GetStudentStaticYearRate(data) {
});
}
//获取市场每日成长数据
export function GetStudentMarket(data) {
return request({
url: '/StudentStat/GetStudentMarket',
method: 'post',
data
});
}
//获取市场月度数据
export function GetStudentMarketMonth(data) {
return request({
url: '/StudentStat/GetStudentMarketMonth',
method: 'post',
data
});
}
//获取市场月度成长率数据
export function GetStudentMarketMonthRate(data) {
return request({
url: '/StudentStat/GetStudentMarketMonthRate',
method: 'post',
data
});
}
//获取市场年度成长率数据
export function GetStudentMarketYear(data) {
return request({
url: '/StudentStat/GetStudentMarketYear',
method: 'post',
data
});
}
//获取市场年度成长率数据
export function GetStudentMarketYearRate(data) {
return request({
url: '/StudentStat/GetStudentMarketYearRate',
method: 'post',
data
});
}
......
<style>
.Sysuser_Date .el-input__inner {
background: transparent !important;
border: 0 !important;
}
.myTable_Zk tbody tr:first-child td {
background: yellow !important;
}
.myTable_Zk tbody tr:first-child {
background: yellow !important;
z-index: 1 !important;
}
.TotalredClass{
color:red;
}
</style>
<template>
<div class="page-body">
<div class="col row wrap q-mb-lg" style="justify-content:space-between;">
<div class="col-3 Sysuser_Date q-mr-lg">
<q-field filled dense>
<template v-slot:control>
<el-date-picker v-model="myDate" style="width:100%" value-format="yyyy-MM" @change="getCheckDate()" size="small" type="month" placeholder="选择年月">
</el-date-picker>
</template>
</q-field>
</div>
<div style="display:none">
<q-btn color="accent" class="q-mr-md" size="sm" icon="download" style="margin-top:15px;"
label="下载" />
</div>
</div>
<div class="page-content">
<q-table :pagination="msg" ref="table" :loading="loading" :style="{'height':tableHeight+'px'}" no-data-label="暂无相关数据" flat
class="sticky-column-table sticky-header-column-table no-bottom-table myTable_Zk" separator="none" :data="dataList" :columns="columns" row-key="">
<template v-slot:bottom>
</template>
</q-table>
</div>
</div>
</template>
<script>
import {
GetStudentMarket
} from '../../api/sale/sale';
export default {
props: {},
meta: {
title: "每日统计"
},
components: {},
data() {
return {
columns: [{
name: 'DateStr',
label: '日期',
field: 'DateStr',
align: 'left'
},
{
name: 'PushCount',
label: '进单人数',
field: 'PushCount',
align: 'left'
},
{
name: 'TrainCount',
label: '语培需求',
field: 'TrainCount',
align: 'left',
},
{
name: 'StudyCount',
label: '留学需求',
field: 'StudyCount',
align: 'left',
},
{
name: 'MeiTuanCount',
label: '美团点评',
field: 'MeiTuanCount',
align: 'left'
},
{
name: 'EduCustomerSign',
label: '教育同行(签约)',
field: 'EduCustomerSign',
align: 'left'
},
{
name: 'EduCustomerNotSign',
label: '教育同行(未签约)',
field: 'EduCustomerNotSign',
align: 'left'
},
{
name: 'PassBy',
label: '过路客(直客)',
field: 'PassBy',
align: 'left'
},
{
name: 'WeChatFriend',
label: '朋友圈',
field: 'WeChatFriend',
align: 'left'
},
{
name: 'TransCount',
label: '学员转介绍',
field: 'TransCount',
align: 'left'
},
{
name: 'SchoolPromote',
label: '校园推广',
field: 'SchoolPromote',
align: 'left'
},
{
name: 'SchoolAgent',
label: '校园代理',
field: 'SchoolAgent',
align: 'left'
},
{
name: 'OfflineActivity',
label: '线下活动',
field: 'OfflineActivity',
align: 'left'
},
{
name: 'OfficialAccount',
label: '公众号',
field: 'OfficialAccount',
align: 'left'
},
{
name: 'TeacherRecommend',
label: '教师推荐',
field: 'TeacherRecommend',
align: 'left'
},
{
name: 'ByteDance',
label: '字节跳动',
field: 'ByteDance',
align: 'left'
},
{
name: 'ThirdPartyPlatform',
label: '第三方平台',
field: 'ThirdPartyPlatform',
align: 'left'
},
{
name: 'Other',
label: '其他',
field: 'Other',
align: 'left'
},
{
name: 'ClassACount',
label: 'A类客户',
field: 'ClassACount',
align: 'left'
},
{
name: 'ClassBCount',
label: 'B类客户',
field: 'ClassBCount',
align: 'left'
},
{
name: 'ClassCCount',
label: 'C类客户',
field: 'ClassCCount',
align: 'left'
},
{
name: 'ClassDCount',
label: 'D类客户',
field: 'ClassDCount',
align: 'left'
},
{
name: 'InvalidCount',
label: '无效',
field: 'InvalidCount',
align: 'left'
},
{
name: 'ContractCount',
label: '签约(成交.续费)',
field: 'ContractCount',
align: 'left'
},
{
name: 'OrderMoney',
label: '语培签约金额',
field: 'OrderMoney',
align: 'left'
},
{
name: 'StudyOrderMoney',
label: '留学签约金额',
field: 'StudyOrderMoney',
align: 'left'
}
],
dataList: [],
loading: false,
myDate:'',
tableHeight:500,
msg: {
YearStr: '',
MonthStr: '',
rowsPerPage: 0
},
}
},
created() {
setTimeout(() => {
this.tableHeight = window.innerHeight - this.$refs.table.$el.offsetTop - 90;
}, 100)
},
mounted() {
let d = new Date();
this.msg.YearStr = d.getFullYear().toString();
this.msg.MonthStr = (d.getMonth()+1).toString();
this.myDate = this.msg.YearStr+'-'+this.msg.MonthStr
this.getList();
},
methods: {
getCheckDate(){
if(this.myDate){
this.msg.YearStr = this.myDate.split('-')[0];
this.msg.MonthStr = this.myDate.split('-')[1];
this.getList();
}
},
//获取数据
getList() {
this.loading=true;
GetStudentMarket(this.msg).then(res => {
this.loading=false;
if (res.Code == 1) {
this.dataList = res.Data;
}
})
}
}
}
</script>
<style lang="sass">
@import url('~assets/css/table.sass')
</style>
<style>
.Sysuser_Date .el-input__inner {
background: transparent !important;
border: 0 !important;
}
</style>
<template>
<div>
<div class="col row wrap q-mb-lg" style="justify-content:space-between;">
<div class="col-3 Sysuser_Date q-mr-lg">
<q-field filled dense>
<template v-slot:control>
<el-date-picker v-model="msg.YearStr" @change="getList" style="width:100%" value-format="yyyy" size="small" type="year" placeholder="选择年">
</el-date-picker>
</template>
</q-field>
</div>
<div>
<q-btn color="accent" class="q-mr-md" size="sm" icon="download" style="margin-top:15px;display:none;"
label="下载" />
</div>
</div>
<div class="page-content">
<q-table :pagination="msg" ref="table" :loading="loading" :style="{'height':tableHeight+'px'}" no-data-label="暂无相关数据" flat
class="sticky-column-table sticky-header-column-table no-bottom-table" separator="none" :data="dataList" :columns="columns" row-key="">
<template v-slot:bottom>
</template>
</q-table>
</div>
</div>
</template>
<script>
import {
GetStudentMarketMonth
} from '../../api/sale/sale';
export default {
props: {},
meta: {
title: "月度统计"
},
components: {},
data() {
return {
columns: [{
name: 'DateStr',
label: '日期',
field: 'DateStr',
align: 'left'
},
{
name: 'PushCount',
label: '进单人数',
field: 'PushCount',
align: 'left'
},
{
name: 'TrainCount',
label: '培训需求',
field: 'TrainCount',
align: 'left',
},
{
name: 'StudyCount',
label: '留学需求',
field: 'StudyCount',
align: 'left',
},
{
name: 'MeiTuanCount',
label: '美团点评',
field: 'MeiTuanCount',
align: 'left'
},
{
name: 'EduCustomerSign',
label: '教育同行(签约)',
field: 'EduCustomerSign',
align: 'left'
},
{
name: 'EduCustomerNotSign',
label: '教育同行(未签约)',
field: 'EduCustomerNotSign',
align: 'left'
},
{
name: 'PassBy',
label: '过路客(直客)',
field: 'PassBy',
align: 'left'
},
{
name: 'WeChatFriend',
label: '朋友圈',
field: 'WeChatFriend',
align: 'left'
},
{
name: 'TransCount',
label: '学员转介绍',
field: 'TransCount',
align: 'left'
},
{
name: 'SchoolPromote',
label: '校园推广',
field: 'SchoolPromote',
align: 'left'
},
{
name: 'SchoolAgent',
label: '校园代理',
field: 'SchoolAgent',
align: 'left'
},
{
name: 'OfflineActivity',
label: '线下活动',
field: 'OfflineActivity',
align: 'left'
},
{
name: 'OfficialAccount',
label: '公众号',
field: 'OfficialAccount',
align: 'left'
},
{
name: 'TeacherRecommend',
label: '教师推荐',
field: 'TeacherRecommend',
align: 'left'
},
{
name: 'ByteDance',
label: '字节跳动',
field: 'ByteDance',
align: 'left'
},
{
name: 'ThirdPartyPlatform',
label: '第三方平台',
field: 'ThirdPartyPlatform',
align: 'left'
},
{
name: 'Other',
label: '其他',
field: 'Other',
align: 'left'
},
{
name: 'ClassACount',
label: 'A类客户',
field: 'ClassACount',
align: 'left'
},
{
name: 'ClassBCount',
label: 'B类客户',
field: 'ClassBCount',
align: 'left'
},
{
name: 'ClassCCount',
label: 'C类客户',
field: 'ClassCCount',
align: 'left'
},
{
name: 'ClassDCount',
label: 'D类客户',
field: 'ClassDCount',
align: 'left'
},
{
name: 'InvalidCount',
label: '无效',
field: 'InvalidCount',
align: 'left'
},
{
name: 'ContractCount',
label: '签约(成交.续费)',
field: 'ContractCount',
align: 'left'
},
{
name: 'OrderMoney',
label: '语培签约金额',
field: 'OrderMoney',
align: 'left'
},
{
name: 'StudyOrderMoney',
label: '留学签约金额',
field: 'StudyOrderMoney',
align: 'left'
}
],
dataList: [],
loading: false,
myDate:'',
tableHeight:500,
msg: {
YearStr: '',
rowsPerPage: 0
},
}
},
created() {
setTimeout(() => {
this.tableHeight = window.innerHeight - this.$refs.table.$el.offsetTop - 90;
}, 100)
},
mounted() {
let d = new Date();
this.msg.YearStr = d.getFullYear().toString();
this.getList();
},
methods: {
//获取数据
getList() {
this.loading=true;
GetStudentMarketMonth(this.msg).then(res => {
this.loading=false;
if (res.Code == 1) {
this.dataList = res.Data;
}
})
}
}
}
</script>
<style lang="sass">
@import url('~assets/css/table.sass')
</style>
<style>
.Sysuser_Date .el-input__inner {
background: transparent !important;
border: 0 !important;
}
.TotalredClass{
color:red;
}
</style>
<template>
<div>
<div class="col row wrap q-mb-lg" style="justify-content:space-between;">
<div class="col-3 Sysuser_Date q-mr-lg">
<q-field filled dense>
<template v-slot:control>
<el-date-picker v-model="msg.YearStr" @change="getList" style="width:100%" value-format="yyyy" size="small"
type="year" placeholder="选择年">
</el-date-picker>
</template>
</q-field>
</div>
<div>
<q-btn color="accent" class="q-mr-md" size="sm" icon="download" style="margin-top:15px;display:none;"
label="下载" />
</div>
</div>
<div class="page-content">
<q-table :pagination="msg" ref="table" :loading="loading" :style="{'height':tableHeight+'px'}"
no-data-label="暂无相关数据" flat class="sticky-column-table sticky-header-column-table no-bottom-table"
separator="none" :data="dataList" :columns="columns" row-key="">
<template v-slot:body-cell-JanuaryRate="props">
<q-td>
<span :class="{'TotalredClass':props.row.JanuaryRate<0}">{{props.row.JanuaryRate}}%</span>
</q-td>
</template>
<template v-slot:body-cell-FebruaryRate="props">
<q-td>
<span :class="{'TotalredClass':props.row.FebruaryRate<0}">{{props.row.FebruaryRate}}%</span>
</q-td>
</template>
<template v-slot:body-cell-MarchRate="props">
<q-td>
<span :class="{'TotalredClass':props.row.MarchRate<0}">{{props.row.MarchRate}}%</span>
</q-td>
</template>
<template v-slot:body-cell-AprilRate="props">
<q-td>
<span :class="{'TotalredClass':props.row.AprilRate<0}">{{props.row.AprilRate}}%</span>
</q-td>
</template>
<template v-slot:body-cell-MayRate="props">
<q-td>
<span :class="{'TotalredClass':props.row.MayRate<0}">{{props.row.MayRate}}%</span>
</q-td>
</template>
<template v-slot:body-cell-JuneRate="props">
<q-td>
<span :class="{'TotalredClass':props.row.JuneRate<0}">{{props.row.JuneRate}}%</span>
</q-td>
</template>
<template v-slot:body-cell-JulyRate="props">
<q-td>
<span :class="{'TotalredClass':props.row.JulyRate<0}">{{props.row.JulyRate}}%</span>
</q-td>
</template>
<template v-slot:body-cell-AugustRate="props">
<q-td>
<span :class="{'TotalredClass':props.row.AugustRate<0}">{{props.row.AugustRate}}%</span>
</q-td>
</template>
<template v-slot:body-cell-SeptemberRate="props">
<q-td>
<span :class="{'TotalredClass':props.row.SeptemberRate<0}">{{props.row.SeptemberRate}}%</span>
</q-td>
</template>
<template v-slot:body-cell-OctoberRate="props">
<q-td>
<span :class="{'TotalredClass':props.row.OctoberRate<0}">{{props.row.OctoberRate}}%</span>
</q-td>
</template>
<template v-slot:body-cell-NovemberRate="props">
<q-td>
<span :class="{'TotalredClass':props.row.NovemberRate<0}">{{props.row.NovemberRate}}%</span>
</q-td>
</template>
<template v-slot:body-cell-DecemberRate="props">
<q-td>
<span :class="{'TotalredClass':props.row.DecemberRate<0}">{{props.row.DecemberRate}}%</span>
</q-td>
</template>
<template v-slot:body-cell-AvgRate="props">
<q-td>
<span :class="{'TotalredClass':props.row.AvgRate<0}">{{props.row.AvgRate}}%</span>
</q-td>
</template>
<template v-slot:bottom>
</template>
</q-table>
</div>
</div>
</template>
<script>
import {
GetStudentMarketMonthRate
} from '../../api/sale/sale';
export default {
props: {},
meta: {
title: "月度统计"
},
components: {},
data() {
return {
tabCheck: 1,
dataList: [],
loading:false,
tableHeight:500,
msg: {
YearStr: '',
rowsPerPage:0
},
columns: [{
name: 'ItemName',
label: '名称',
field: 'ItemName',
align: 'left'
},
{
name: 'JanuaryRate',
label: '1月',
field: 'JanuaryRate',
align: 'left'
},
{
name: 'FebruaryRate',
label: '2月',
field: 'FebruaryRate',
align: 'left',
},
{
name: 'MarchRate',
label: '3月',
field: 'MarchRate',
align: 'left',
},
{
name: 'AprilRate',
label: '4月',
field: 'AprilRate',
align: 'left'
},
{
name: 'MayRate',
label: '5月',
field: 'MayRate',
align: 'left'
},
{
name: 'JuneRate',
label: '6月',
field: 'JuneRate',
align: 'left'
},
{
name: 'JulyRate',
label: '7月',
field: 'JulyRate',
align: 'left'
},
{
name: 'AugustRate',
label: '8月',
field: 'AugustRate',
align: 'left'
},
{
name: 'SeptemberRate',
label: '9月',
field: 'SeptemberRate',
align: 'left'
},
{
name: 'OctoberRate',
label: '10月',
field: 'OctoberRate',
align: 'left'
},
{
name: 'NovemberRate',
label: '11月',
field: 'NovemberRate',
align: 'left'
},
{
name: 'DecemberRate',
label: '12月',
field: 'DecemberRate',
align: 'left'
},
{
name: 'AvgRate',
label: '平均',
field: 'AvgRate',
align: 'left'
}
],
}
},
created() {
setTimeout(() => {
this.tableHeight = window.innerHeight - this.$refs.table.$el.offsetTop - 90;
}, 100)
},
mounted() {
let d = new Date();
this.msg.YearStr = d.getFullYear().toString();
this.getList();
},
methods: {
getList() {
this.loading=true;
GetStudentMarketMonthRate(this.msg).then(res => {
this.loading=false;
if (res.Code == 1) {
this.dataList = res.Data;
}
})
}
}
}
</script>
<template>
<div class="page-body">
<q-tabs v-model="tabCheck" narrow-indicator dense align="left" class="text-primary q-mb-sm">
<q-tab :ripple="false" :name="1" label="月份统计" />
<q-tab :ripple="false" :name="2" label="成长率" />
</q-tabs>
<template v-if="tabCheck==1">
<customMonthFirst></customMonthFirst>
</template>
<template v-if="tabCheck==2">
<customMonthSecond></customMonthSecond>
</template>
</div>
</template>
<script>
import customMonthFirst from '../sale/customMonthFirst';
import customMonthSecond from '../sale/customMonthSecond';
export default {
props: {},
meta: {
title: "月度统计"
},
components: {
customMonthFirst,
customMonthSecond
},
data() {
return {
tabCheck: 1,
}
},
created() {
},
mounted() {},
methods: {
}
}
</script>
<style>
.Sysuser_Date .el-input__inner {
background: transparent !important;
border: 0 !important;
}
.zk_Table thead tr:last-child th{
top:35px!important;
z-index:1!important;
}
.zk_Table thead tr{
height:35px;
}
.TotalredClass {
color: red;
}
</style>
<template>
<div>
<div class="page-content">
<q-table :pagination="msg" ref="table" :loading="loading" :style="{'height':tableHeight+'px'}"
no-data-label="暂无相关数据" flat class="sticky-header-column-table no-bottom-table zk_Table"
separator="none" :data="dataList" :columns="columns" row-key="">
<tr slot="header">
<q-th rowspan="2" style="text-align:left;width:300px;">
名称
</q-th>
<q-th colspan="2">年份</q-th>
<q-th rowspan="2">成长率</q-th>
</tr>
<tr slot="header">
<q-th>
<span v-if="dataList&&dataList.length>0">{{dataList[0].FirstYearStr}}</span>
</q-th>
<q-th>
<span v-if="dataList&&dataList.length>0">{{dataList[0].SecondYearStr}}</span>
</q-th>
</tr>
<template v-slot:body-cell-FirstYear="props" v-if="tabCheck==2">
<q-td style="text-align:center;">
{{props.row.FirstYear}}%
</q-td>
</template>
<template v-slot:body-cell-SecondYear="props" v-if="tabCheck==2">
<q-td style="text-align:center;">
{{props.row.SecondYear}}%
</q-td>
</template>
<template v-slot:body-cell-YearRate="props">
<q-td style="text-align:center;">
{{props.row.YearRate}}%
</q-td>
</template>
<template v-slot:body-cell-FirstYear="props">
<q-td>
<span :class="{'TotalredClass':props.row.FirstYear<0}">{{props.row.FirstYear}}%</span>
</q-td>
</template>
<template v-slot:body-cell-SecondYear="props">
<q-td>
<span :class="{'TotalredClass':props.row.SecondYear<0}">{{props.row.SecondYear}}%</span>
</q-td>
</template>
<template v-slot:body-cell-YearRate="props">
<q-td>
<span :class="{'TotalredClass':props.row.YearRate<0}">{{props.row.YearRate}}%</span>
</q-td>
</template>
<!-- <template v-slot:header-cell-FirstYear="props">
<q-th :props="props">
<span v-if="dataList&&dataList.length>0">{{dataList[0].FirstYearStr}}</span>
</q-th>
</template>
<template v-slot:header-cell-SecondYear="props">
<q-th :props="props">
<span v-if="dataList&&dataList.length>0">{{dataList[0].SecondYearStr}}</span>
</q-th>
</template> -->
<template v-slot:bottom>
</template>
</q-table>
</div>
</div>
</template>
<script>
export default {
props: {
dataList: {
type: Array,
default: null
},
tabCheck: {
type: Number,
default: null
}
},
meta: {
title: "年度统计"
},
components: {},
data() {
return {
columns: [{
name: 'ItemName',
label: '名称',
field: 'ItemName',
align: 'left'
},
{
name: 'FirstYear',
label: '第一条',
field: 'FirstYear',
align: 'center'
},
{
name: 'SecondYear',
label: '第二条',
field: 'SecondYear',
align: 'center',
},
{
name: 'YearRate',
label: '成长率',
field: 'YearRate',
align: 'center',
}
],
loading: false,
msg:{
rowsPerPage: 0
},
tableHeight: 500,
}
},
created() {
setTimeout(() => {
this.tableHeight = window.innerHeight - this.$refs.table.$el.offsetTop - 90;
}, 100)
},
mounted() {
},
methods: {
}
}
</script>
<style lang="sass">
@import url('~assets/css/table.sass')
</style>
<template>
<div class="page-body">
<q-tabs v-model="tabCheck" @input="getList" narrow-indicator dense align="left" class="text-primary q-mb-sm">
<q-tab :ripple="false" :name="1" label="年份统计" />
<q-tab :ripple="false" :name="2" label="成长率" />
</q-tabs>
<div class="col row wrap q-mb-lg">
<div class="col-3 Sysuser_Date q-mr-lg" style="display:none;">
<q-field filled dense>
<template v-slot:control>
<el-date-picker v-model="msg.YearStr" @change="getList" style="width:100%" value-format="yyyy" size="small"
type="year" placeholder="选择年">
</el-date-picker>
</template>
</q-field>
</div>
<div style="display:none;">
<q-btn color="accent" class="q-mr-md" size="sm" icon="download" style="margin-top:15px;" label="下载"
@click="downloadStudentStaticYear" />
</div>
</div>
<customYearFirst :dataList="dataList" :tabCheck="tabCheck"></customYearFirst>
</div>
</template>
<script>
import {
EduDownLoad
} from "../../api/common/common";
import customYearFirst from '../sale/customYearFirst';
import {
GetStudentMarketYear
} from '../../api/sale/sale';
import {
GetStudentMarketYearRate
} from '../../api/sale/sale';
export default {
props: {},
meta: {
title: "年度统计"
},
components: {
customYearFirst
},
data() {
return {
tabCheck: 1,
dataList: [],
msg: {
YearStr: '',
rowsPerPage: 0
}
}
},
created() {
},
mounted() {
let d = new Date();
this.msg.YearStr = d.getFullYear().toString();
this.getList();
},
methods: {
//下载文件
downloadStudentStaticYear() {
this.loading = true;
var msg = JSON.parse(JSON.stringify(this.msg));
var url = "/StudentStat/DownLoadStudentStaticYear";
var fileName = "课程顾问部年数据统计.xls";
if (this.tabCheck == 2) {
url = "/StudentStat/DownLoadStudentStaticYearRate";
fileName = "课程顾问部年成长率数据统计.xls";
}
EduDownLoad(
url,
msg,
fileName, res => {
this.loading = false;
}
);
},
//获取数据
getList() {
if (this.tabCheck == 1) {
this.loading = true;
GetStudentMarketYear(this.msg).then(res => {
this.loading = false;
if (res.Code == 1) {
this.dataList = res.Data;
}
})
} else {
this.loading = true;
GetStudentMarketYearRate(this.msg).then(res => {
this.loading = false;
if (res.Code == 1) {
this.dataList = res.Data;
}
})
}
}
}
}
</script>
\ No newline at end of file
......@@ -1075,6 +1075,21 @@ const routes = [{
component: ()=>
import("pages/sale/yearTotal.vue")
},
{
path: "/sale/customDailyTotal", //市场部每日统计
component: ()=>
import("pages/sale/customDailyTotal.vue")
},
{
path: "/sale/customMonthlyTotal", //市场部月度统计
component: ()=>
import("pages/sale/customMonthlyTotal.vue")
},
{
path: "/sale/customyearTotal", //市场部年度统计
component: ()=>
import("pages/sale/customyearTotal.vue")
},
{
path: "/sale/everyMonthTotal", //每月统计
component: ()=>
......
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