浏览代码

云教练统计

lex-xin 3 年之前
父节点
当前提交
edbfc985f8

+ 50 - 0
src/common/common.js

@@ -3,6 +3,56 @@ export const getRandomKey = () => {
 	return key
 }
 
+export function getNowDateAndMonday(time) {
+  let timestamp = new Date(time.replace(/-/g, "/")).getTime();
+  let serverDate = new Date(time);
+  if (serverDate.getDay() == 0) {
+      timestamp -= 7 * 24 * 60 * 60 * 1000;
+  }
+  let mondayTime = timestamp - (serverDate.getDay() - 1) * 24 * 60 * 60 * 1000;
+
+  let mondayData = new Date(mondayTime);
+  //年
+  let mondayY = mondayData.getFullYear();
+  //月
+  let mondayM =
+      mondayData.getMonth() + 1 < 10
+      ? "0" + (mondayData.getMonth() + 1)
+      : mondayData.getMonth() + 1;
+  //日
+  let mondayD =
+      mondayData.getDate() < 10
+      ? "0" + mondayData.getDate()
+      : mondayData.getDate();
+
+  let str = mondayY + "-" + mondayM + "-" + mondayD;
+  return str;
+}
+export function getNowDateAndSunday(time) {
+  let timestamp = new Date(time.replace(/-/g, "/")).getTime();
+  let serverDate = new Date(time);
+
+  let num = 7 - serverDate.getDay();
+  if (num == 7) {
+      num = 0;
+  }
+  let sundayTiem = timestamp + num * 24 * 60 * 60 * 1000;
+  let SundayData = new Date(sundayTiem);
+  //年
+  let tomorrowY = SundayData.getFullYear(); //月
+  let tomorrowM =
+      SundayData.getMonth() + 1 < 10
+      ? "0" + (SundayData.getMonth() + 1)
+      : SundayData.getMonth() + 1;
+  //日
+  let tomorrowD =
+      SundayData.getDate() < 10
+      ? "0" + SundayData.getDate()
+      : SundayData.getDate();
+  let str = tomorrowY + "-" + tomorrowM + "-" + tomorrowD;
+  return str;
+}
+
 const browser = () => {
   var u = navigator.userAgent
   //   app = navigator.appVersion;

+ 29 - 12
src/views/trainStatistics/index.vue

@@ -4,10 +4,10 @@
             <m-header v-if="headerStatus" :isFixed="false" />
             <van-tabs v-model="active" @change="tabChange" title-active-color="#000000" title-inactive-color="#808080" color="#01C1B5" class="van-hairline--bottom">
                 <van-tab title="全部学员" name="all">
-                    <train-model ref="trainModel" :active="active" :defaultTime="0" />
+                    <train-model ref="trainModel1" @onLoad="onLoad" :active="active" :defaultTime="0" />
                 </van-tab>
-                <van-tab title="待回访学员" name="visited" dot>
-                    <train-model ref="trainModel" :active="active" :defaultTime="-1" />
+                <van-tab title="待回访学员" name="visited">
+                    <train-model ref="trainModel2" @onLoad="onLoad" :active="active" :defaultTime="-1" />
                 </van-tab>
             </van-tabs>
         </van-sticky>
@@ -38,7 +38,7 @@
                                 <template #icon>{{ item.totalPlayTime }}分钟</template>
                             </van-grid-item>
                             <van-grid-item text="训练次数">
-                                <template #icon><span style="color: #01C1B5">{{ item.trainDay }}次</span></template>
+                                <template #icon><span style="color: #01C1B5">{{ item.trainNum }}次</span></template>
                             </van-grid-item>
                             <van-grid-item text="训练天数">
                                 <template #icon><span style="color: #01C1B5">{{ item.trainDay }}天</span></template>
@@ -65,14 +65,15 @@ import trainModel from './trainModel.vue'
 export default {
     components: { MHeader, MEmpty, trainModel },
     data() {
+        const activeType = sessionStorage.getItem('trainTab')
+        sessionStorage.removeItem('trainTab')
         return {
             headerStatus: true,
-            active: 'all',
+            active: activeType || 'all',
             list: [],
             loading: false,
             finished: false,
             params: {
-                search: null,
                 page: 1,
                 rows: 20,
             },
@@ -92,11 +93,26 @@ export default {
             this.headerStatus = false;
         }
         document.title = '训练统计'
-        this.getList()
+
+        // this.getList()
     },
     methods: {
+        onLoad(value) {
+            this.params = Object.assign(this.params, value)
+            this.onResetList()
+        },
         tabChange() {
-            this.$refs.trainModel.changeDropDownItemStatus()
+            if(this.$refs.trainModel1) {
+                this.$refs.trainModel1.changeDropDownItemStatus()
+            }
+            if(this.$refs.trainModel2) {
+                this.$refs.trainModel2.changeDropDownItemStatus()
+            }
+            if(this.active == 'visited' && this.$refs.trainModel2) {
+                this.$refs.trainModel2.onAllFilter()
+            } else if(this.active == 'all' && this.$refs.trainModel1) {
+                this.$refs.trainModel1.onAllFilter()
+            }
         },
         search(val) {
             this.params.search = val
@@ -111,22 +127,23 @@ export default {
             this.getList()
         },
         onHref(item) {
+            sessionStorage.setItem('trainTab', this.active)
             this.$router.push({
                 path: '/trainDetail',
                 query: {
                     userId: item.userId,
                     username: item.username,
                     musicGroupName: item.musicGroupName,
-                    avatar: item.avatar
+                    avatar: item.avatar,
+                    visitFlag: item.visitFlag
                 }
             })
         },
         async getList() {
             let params = this.params;
-            params.startTime = this.formatStartTime || null
-            params.endTime = this.formatEndTime || null
+            let visitFlag = this.active != 'all' ? 1 : null
             try {
-                let res = await countStudentTrain(params)
+                let res = await countStudentTrain({...params, visitFlag})
                 let result = res.data;
                 this.loading = false;
                 params.page = result.pageNo;

+ 9 - 5
src/views/trainStatistics/trainDetail.vue

@@ -20,7 +20,7 @@
         </van-cell>
     </div>
 
-    <van-row class="dataSearch" type="flex">
+    <van-row class="dataSearch" type="flex" v-if="!visitFlag">
         <van-col span="9" offset="1">
             <van-cell @click="onChangeDate('showStart')" is-link>
                 <template #right-icon>
@@ -55,14 +55,14 @@
             @confirm="chioseDate"
         />
     </van-popup>
-    <div class="specialList">
+    <div class="specialList" :class="{'bottomHeight': visitFlag}">
         <van-list v-model="loading"  v-if="show" key="trainDetail"
             :finished="finished"
             finished-text="- 没有更多内容 -"
             :immediate-check="false"
             @load="getList()">
             <van-cell-group class="data-content" v-for="(item, index) in dataList" :key="index" @click="showDetail(item)">
-                <van-cell style="padding: 16px 12px; 12px" :center="true">
+                <van-cell style="padding: 16px 12px; 12px" :center="true" title-style="flex-basis: 45%;">
                     <template #title>
                         <span style="font-size: .17rem; color:#333333; font-weight: 500; padding-right: .05rem;padding-bottom: .05rem;">{{ item.sysMusicScoreName }}</span>
                         <p style="font-size: 14px; color: #808080;">{{ item.createTime }}</p>
@@ -95,7 +95,8 @@
         </van-list>
         <m-empty v-else key="trainDetail" msg="暂无训练详情" />
 
-        <div class="button-group">
+        <!-- 是否需要回访 -->
+        <div class="button-group" v-if="visitFlag">
             <van-button type="primary" size="large" round @click="addVisited">添加回访</van-button>
             <div class="placeholder-btn"></div>
         </div>
@@ -120,6 +121,7 @@ export default {
             avatar: query.avatar,
             username: query.username,
             musicGroupName: query.musicGroupName,
+            visitFlag: Number(query.visitFlag) || 0,
             searchList: {
                 startTime: null,
                 endTime: null,
@@ -327,8 +329,10 @@ export default {
 }
 .specialList {
     padding-top: .1rem;
-    padding-bottom: 65px;
     // padding-bottom: calc(env(safe-area-inset-bottom) / 2);
+    &.bottomHeight {
+        padding-bottom: 65px;
+    }
 }
 .dataSearch {
     padding: .12rem;

+ 70 - 70
src/views/trainStatistics/trainModel.vue

@@ -3,7 +3,7 @@
         <div class="visit-tips" v-show="activeType == 'visited'">
             <span>学员上周训练时间不足80分钟或训练次数小于4次则需要回访</span>
         </div>
-        <search @onSearch="search" placeholder="学生姓名或手机号">
+        <search @onSearch="onSearch" placeholder="学生姓名或手机号">
             <template #left>
                 <van-dropdown-menu style="padding-right: .1rem" :close-on-click-outside="false" active-color="#01C1B5">
                     <van-dropdown-item title="筛选" ref="item" class="visitTime">
@@ -13,32 +13,32 @@
             </template>
         </search>
         <van-row class="searchArray">
-            <van-col span="6" class="title-style">
+            <van-col span="6" class="title-style" @click="onSort(0)">
                 训练时长
                 <div>
-                    <i class="box box-up active" style="margin-bottom: .02rem;"></i>
-                    <i class="box box-down"></i>
+                    <i class="box box-up" :class="{'active': searchArray[0] == 'ASC'}" style="margin-bottom: .02rem;"></i>
+                    <i class="box box-down" :class="{'active': searchArray[0] == 'DESC'}"></i>
                 </div>
             </van-col>
-            <van-col span="6" class="title-style">
+            <van-col span="6" class="title-style" @click="onSort(1)">
                 训练次数
                 <div>
-                    <i class="box box-up active" style="margin-bottom: .02rem;"></i>
-                    <i class="box box-down"></i>
+                    <i class="box box-up" :class="{'active': searchArray[1] == 'ASC'}" style="margin-bottom: .02rem;"></i>
+                    <i class="box box-down" :class="{'active': searchArray[1] == 'DESC'}"></i>
                 </div>
             </van-col>
-            <van-col span="6" class="title-style">
+            <van-col span="6" class="title-style" @click="onSort(2)">
                 训练天数
                 <div>
-                    <i class="box box-up active" style="margin-bottom: .02rem;"></i>
-                    <i class="box box-down"></i>
+                    <i class="box box-up" :class="{'active': searchArray[2] == 'ASC'}" style="margin-bottom: .02rem;"></i>
+                    <i class="box box-down" :class="{'active': searchArray[2] == 'DESC'}"></i>
                 </div>
             </van-col>
-            <van-col span="6" class="title-style">
+            <van-col span="6" class="title-style" @click="onSort(3)">
                 评测次数
                 <div>
-                    <i class="box box-up active" style="margin-bottom: .02rem;"></i>
-                    <i class="box box-down"></i>
+                    <i class="box box-up" :class="{'active': searchArray[3] == 'ASC'}" style="margin-bottom: .02rem;"></i>
+                    <i class="box box-down" :class="{'active': searchArray[3] == 'DESC'}"></i>
                 </div>
             </van-col>
         </van-row>
@@ -61,55 +61,7 @@
 <script>
 import Search from '@/components/Search';
 import dayjs from "dayjs";
-export function getNowDateAndMonday(time) {
-    let timestamp = new Date(time.replace(/-/g, "/")).getTime();
-    let serverDate = new Date(time);
-    if (serverDate.getDay() == 0) {
-        timestamp -= 7 * 24 * 60 * 60 * 1000;
-    }
-    let mondayTime = timestamp - (serverDate.getDay() - 1) * 24 * 60 * 60 * 1000;
-
-    let mondayData = new Date(mondayTime);
-    //年
-    let mondayY = mondayData.getFullYear();
-    //月
-    let mondayM =
-        mondayData.getMonth() + 1 < 10
-        ? "0" + (mondayData.getMonth() + 1)
-        : mondayData.getMonth() + 1;
-    //日
-    let mondayD =
-        mondayData.getDate() < 10
-        ? "0" + mondayData.getDate()
-        : mondayData.getDate();
-
-    let str = mondayY + "-" + mondayM + "-" + mondayD;
-    return str;
-}
-export function getNowDateAndSunday(time) {
-    let timestamp = new Date(time.replace(/-/g, "/")).getTime();
-    let serverDate = new Date(time);
-
-    let num = 7 - serverDate.getDay();
-    if (num == 7) {
-        num = 0;
-    }
-    let sundayTiem = timestamp + num * 24 * 60 * 60 * 1000;
-    let SundayData = new Date(sundayTiem);
-    //年
-    let tomorrowY = SundayData.getFullYear(); //月
-    let tomorrowM =
-        SundayData.getMonth() + 1 < 10
-        ? "0" + (SundayData.getMonth() + 1)
-        : SundayData.getMonth() + 1;
-    //日
-    let tomorrowD =
-        SundayData.getDate() < 10
-        ? "0" + SundayData.getDate()
-        : SundayData.getDate();
-    let str = tomorrowY + "-" + tomorrowM + "-" + tomorrowD;
-    return str;
-}
+import { getNowDateAndMonday, getNowDateAndSunday } from '@/common/common'
 export default {
     props: {
         active: {
@@ -130,9 +82,16 @@ export default {
             // 类型为全部时
             startDay: null,
             endDay: null,
+            search: null,
+            searchArray: [null, null, null, null],
             searchType: {
-                
-            }
+                // ASC DESC
+                totalPlayTime: null,
+                trainNum: null,
+                trainDay: null,
+                recordNum: null,
+            },
+
         }
     },
     async mounted() {
@@ -149,9 +108,8 @@ export default {
         this.defaultDate = [new Date(startTime), new Date(endTime)]
         this.startDay = startTime
         this.endDay = endTime
-        // let startTime = getNowDateAndMonday(dayjs)
-        // let startTime = getNowDateAndMonday(dayjs().format("YYYY-MM-DD"));
-        // let endTime = getNowDateAndSunday(dayjs().format("YYYY-MM-DD"));
+
+        this.onSort()
     },
     computed: {
         calendarValue() {
@@ -162,9 +120,48 @@ export default {
         }
     },
     methods: {
-        search(val) {
-            this.params.search = val
-            // this.onResetList()
+        onSort(type) {
+            let searchArray = this.searchArray
+            searchArray.forEach((item, index) => {
+                if(index != type) {
+                    searchArray[index] = null
+                }
+            });
+            if(searchArray[type] == 'ASC') {
+                searchArray[type] = 'DESC'
+            } else if(searchArray[type] == 'DESC') {
+                searchArray[type] = null
+            } else {
+                searchArray[type] = 'ASC'
+            }
+            this.$forceUpdate()
+            // console.log(searchArray)
+            this.onAllFilter()
+        },
+        onSearch(val) {
+            this.search = val
+            this.onAllFilter()
+        },
+        onAllFilter() {
+            const searchArray = this.searchArray
+            let currentIndex = null
+            let currentType = null
+            searchArray.forEach((item, index) => {
+                if(item) {
+                    currentIndex = index
+                    currentType = item
+                }
+            })
+            const searchType = ['totalPlayTime', 'trainNum', 'trainDay', 'recordNum']
+            let params = {
+                search: this.search,
+                startTime: this.startDay,
+                endTime: this.endDay,
+                page: 1,
+                sort: searchType[currentIndex],
+                order: currentType
+            }
+            this.$listeners.onLoad(params)
         },
         changeDropDownItemStatus() {
             this.$refs.item.toggle(false)
@@ -206,6 +203,9 @@ export default {
             }
             this.startDay = dayjs(start).format("YYYY-MM-DD");
             this.endDay = dayjs(end).format("YYYY-MM-DD");
+            //
+            this.changeDropDownItemStatus()
+            this.onAllFilter()
         },
         onClose() {
             // 关闭弹窗时初始化默认日期

+ 7 - 3
src/views/visitManager/addVisit.vue

@@ -211,6 +211,7 @@ export default {
       id: query.id,
       name: query.name,
       userId: query.userId,
+      visitFlag: Number(query.visitFlag) || 0,
       dataForm: {
         // 时间下拉框
         status: false,
@@ -340,11 +341,13 @@ export default {
         this.$toast("添加成功");
         setTimeout(() => {
           if(this.userId) {
-            const query = this.$route.query
+            let { visitFlag ,...query } = this.$route.query
+            visitFlag = 0
             this.$router.replace({
               path: '/trainDetail',
               query: {
-                ...query
+                ...query,
+                visitFlag
               }
             });
           } else {
@@ -415,7 +418,8 @@ export default {
       this.dataForm.status = false;
     },
     onEnListShow() {
-      if (this.id) {
+      // 从云教练统计来的,不许改时间,默认当前时间
+      if (this.id || this.visitFlag) {
         return;
       }
       this.dataForm.status = true;