lex 2 년 전
부모
커밋
86d0f390a5

+ 1 - 1
src/layout/components/components/message-editor.vue

@@ -82,7 +82,7 @@ export default {
   },
   mounted() {
     this.conversation = core.currentConversation;
-    console.log(core.currentConversation, "1212");
+    // console.log(core.currentConversation, "1212");
     // 系统消息,不显示编辑器
     if (
       (core.currentConversation &&

+ 4 - 1
src/router/index.js

@@ -504,6 +504,8 @@ export const asyncRoutes = {
   childrensdayDetail: () => import("@/views/childrensDay/detail"),
   // 异常数据
   indexErrDataRecord: () => import("@/views/indexErrDataRecord"),
+  // 团练宝数据
+  cloudDate: () => import("@/views/main/cloudDate"),
   dictionaryManager: () => import("@/views/dictionaryManager"),
   // 会员排课列表
   memberClassList: () =>
@@ -628,6 +630,7 @@ export const asyncRoutes = {
   branchPayManager: () => import("@/views/branchPayManager/payList"),
   // 合作单位分润 payShareList
   branchShareManager: () => import("@/views/branchPayManager/payShareList"),
-  smallCourseConsumption:()=>import("@/views/smallCourseConsumption/index.vue")
+  smallCourseConsumption: () =>
+    import("@/views/smallCourseConsumption/index.vue")
 };
 export default router;

+ 22 - 28
src/utils/request-loading.js

@@ -1,45 +1,39 @@
-import load from '@/utils/loading'
+import load from "@/utils/loading";
 // isLoading
 
 // let times = store.getters.loadCount;
-let timer = null
+let timer = null;
 export async function showFullScreenLoading(store) {
-
   if (store.getters.loadCount === 0 && !store.getters.isLoading) {
-    await store.dispatch('app/setLoadCount', 1)
-    await store.dispatch('app/setLoadStatus', true)
-    load.startLoading()
+    await store.dispatch("app/setLoadCount", 1);
+    await store.dispatch("app/setLoadStatus", true);
+    load.startLoading();
   } else {
-    if(store.getters.loadCount < 0){
-      await store.dispatch('app/resetLoadCount')
-      await store.dispatch('app/setLoadCount', 1)
-      clearTimeout(timer)
-      timer = null
-    }else{
-      await store.dispatch('app/setLoadCount', 1)
-      clearTimeout(timer)
-      timer = null
+    if (store.getters.loadCount < 0) {
+      await store.dispatch("app/resetLoadCount");
+      await store.dispatch("app/setLoadCount", 1);
+      clearTimeout(timer);
+      timer = null;
+    } else {
+      await store.dispatch("app/setLoadCount", 1);
+      clearTimeout(timer);
+      timer = null;
     }
-
   }
-
-
 }
 
 export async function tryHideFullScreenLoading(store) {
-  console.log(store.getters.loadCount)
-  await store.dispatch('app/setLoadCount', -1)
+  // console.log(store.getters.loadCount)
+  await store.dispatch("app/setLoadCount", -1);
 
   if (store.getters.loadCount <= 0 && store.getters.isLoading) {
-    if(timer)return
+    if (timer) return;
     timer = setTimeout(async () => {
-      await store.dispatch('app/resetLoadCount')
-      await store.dispatch('app/setLoadStatus', false)
+      await store.dispatch("app/resetLoadCount");
+      await store.dispatch("app/setLoadStatus", false);
       load.endLoading();
-      clearTimeout(timer)
-      timer = null
-    }, 100)
-
+      clearTimeout(timer);
+      timer = null;
+    }, 100);
   }
-
 }

+ 183 - 141
src/views/main/api.js

@@ -1,191 +1,233 @@
-import request2 from '@/utils/request2'
+import request2 from "@/utils/request2";
 
 // 获取首页数据
-export const getIndex = data => request2({
-  url: '/api-web/newIndex',
-  params: data,
-  method: 'get',
-})
-export const getInspectionItem = data => request2({
-  url: '/api-web/inspectionItem/queryPage',
-  params: data,
-  method: 'get',
-})
+export const getIndex = data =>
+  request2({
+    url: "/api-web/newIndex",
+    params: data,
+    method: "get"
+  });
+export const getInspectionItem = data =>
+  request2({
+    url: "/api-web/inspectionItem/queryPage",
+    params: data,
+    method: "get"
+  });
 // 获取异常处理
-export const getIndexError = data => request2({
-  url: '/api-web/getIndexErrData',
-  params: data,
-  method: 'get',
-})
+export const getIndexError = data =>
+  request2({
+    url: "/api-web/getIndexErrData",
+    params: data,
+    method: "get"
+  });
 
 // 获取事项提醒
-export const getRemindMatterData = data => request2({
-  url: '/api-web/getRemindMatterData',
-  params: data,
-  method: 'get',
-})
+export const getRemindMatterData = data =>
+  request2({
+    url: "/api-web/getRemindMatterData",
+    params: data,
+    method: "get"
+  });
 
 // 处理乐团主管日程安排
-export const resetInspectionItem = data => request2({
-  url: '/api-web/inspectionItem/update',
-  data: data,
-  method: 'post',
-  requestType:'form'
-})
+export const resetInspectionItem = data =>
+  request2({
+    url: "/api-web/inspectionItem/update",
+    data: data,
+    method: "post",
+    requestType: "form"
+  });
 
 // 获取乐团主管巡查任务
-export const getInspectionItemPlan =data => request2({
-  url: '/api-web/inspectionItemPlan/queryPage',
-  params: data,
-  method: 'get',
-})
+export const getInspectionItemPlan = data =>
+  request2({
+    url: "/api-web/inspectionItemPlan/queryPage",
+    params: data,
+    method: "get"
+  });
 // 获取乐团主管乐团
-export const getMusicGroup =data => request2({
-  url: '/api-web/inspectionItemPlan/getMusicGroup',
-  params: data,
-  method: 'get',
-})
+export const getMusicGroup = data =>
+  request2({
+    url: "/api-web/inspectionItemPlan/getMusicGroup",
+    params: data,
+    method: "get"
+  });
 // 添加乐团主管巡查任务
-export const addInspectionItemPlan = data => request2({
-  url: '/api-web/inspectionItemPlan/add',
-  data: data,
-  method: 'post',
-  requestType:'form'
-})
+export const addInspectionItemPlan = data =>
+  request2({
+    url: "/api-web/inspectionItemPlan/add",
+    data: data,
+    method: "post",
+    requestType: "form"
+  });
 
 // 修改乐团主管巡查任务
-export const resetInspectionItemPlan = data => request2({
-  url: '/api-web/inspectionItemPlan/update',
-  data: data,
-  method: 'post',
-  requestType:'form'
-})
+export const resetInspectionItemPlan = data =>
+  request2({
+    url: "/api-web/inspectionItemPlan/update",
+    data: data,
+    method: "post",
+    requestType: "form"
+  });
 
 // 添加巡查任务
-export const inspectionAdd = data => request2({
-  url: '/api-web/inspection/add',
-  data: data,
-  method: 'post',
-})
+export const inspectionAdd = data =>
+  request2({
+    url: "/api-web/inspection/add",
+    data: data,
+    method: "post"
+  });
 
 // 删除巡查任务
-export const inspectionDelete = data => request2({
-  url: '/api-web/inspection/delete',
-  params: data,
-  method: 'post',
-})
+export const inspectionDelete = data =>
+  request2({
+    url: "/api-web/inspection/delete",
+    params: data,
+    method: "post"
+  });
 
 // 查看巡查任务详情
-export const inspectionGetInfo = data => request2({
-  url: '/api-web/inspection/getInfo',
-  params: data,
-  method: 'get',
-})
+export const inspectionGetInfo = data =>
+  request2({
+    url: "/api-web/inspection/getInfo",
+    params: data,
+    method: "get"
+  });
 
 // 巡查任务列表
-export const inspectionQueryPage = data => request2({
-  url: '/api-web/inspection/queryPage',
-  params: data,
-  method: 'get',
-})
+export const inspectionQueryPage = data =>
+  request2({
+    url: "/api-web/inspection/queryPage",
+    params: data,
+    method: "get"
+  });
 
 // 修改巡查任务
-export const inspectionUpdate = data => request2({
-  url: '/api-web/inspection/update',
-  data: data,
-  method: 'post',
-})
+export const inspectionUpdate = data =>
+  request2({
+    url: "/api-web/inspection/update",
+    data: data,
+    method: "post"
+  });
 
 // 获取乐团主管
 
-export const getMusicGroupEduTeacher = data => request2({
-  url: '/api-web/inspection/getMusicGroupEduTeacher',
-  params: data,
-  method: 'get'
-})
+export const getMusicGroupEduTeacher = data =>
+  request2({
+    url: "/api-web/inspection/getMusicGroupEduTeacher",
+    params: data,
+    method: "get"
+  });
 
 // 获取统计数据
-export const hasIndexErrData = () => request2({
-  url: '/api-web/hasIndexErrData',
-  method: 'get',
-  loading: false,
-})
+export const hasIndexErrData = () =>
+  request2({
+    url: "/api-web/hasIndexErrData",
+    method: "get",
+    loading: false
+  });
 
 // 查询乐团中未加入班级学员信息
-export const queryNoClassMusicStudentInfo = (data) => request2({
-  url: '/api-web/studentRegistration/queryNoClassMusicStudentInfo',
-  method: 'get',
-  params: data
-})
+export const queryNoClassMusicStudentInfo = data =>
+  request2({
+    url: "/api-web/studentRegistration/queryNoClassMusicStudentInfo",
+    method: "get",
+    params: data
+  });
 
 // 获取学生请假异常列表
-export const queryStudentErrorLeaveList = (data) => request2({
-  url: '/api-web/studentManage/queryStudentErrorLeaveList',
-  method: 'get',
-  params: data
-})
+export const queryStudentErrorLeaveList = data =>
+  request2({
+    url: "/api-web/studentManage/queryStudentErrorLeaveList",
+    method: "get",
+    params: data
+  });
 
 // 获取学生请假课程列表
-export const queryStudentLeaveCourseList = (data) => request2({
-  url: '/api-web/studentManage/queryStudentLeaveCourseList',
-  method: 'get',
-  params: data
-})
-
+export const queryStudentLeaveCourseList = data =>
+  request2({
+    url: "/api-web/studentManage/queryStudentLeaveCourseList",
+    method: "get",
+    params: data
+  });
 
 // 获取乐团展演列表
-export const getMusicGroupPerformance = (data) => request2({
-  url: '/api-web/musicGroupPerformance/queryNoStartPage',
-  method: 'post',
-  params: data
-})
+export const getMusicGroupPerformance = data =>
+  request2({
+    url: "/api-web/musicGroupPerformance/queryNoStartPage",
+    method: "post",
+    params: data
+  });
 
 // 获取云教练首页数据汇总
-export const getCloudStudyStudentOverView = (data) => request2({
-  url: '/api-web/studentManage/getCloudStudyStudentOverView',
-  method: 'get',
-  params: data
-})
+export const getCloudStudyStudentOverView = data =>
+  request2({
+    url: "/api-web/studentManage/getCloudStudyStudentOverView",
+    method: "get",
+    params: data
+  });
 
 // 分部数据
-export const organStudentOverView = (data) => request2({
-  url: '/api-web/studentManage/organStudentOverView',
-  method: 'get',
-  params: data
-})
+export const organStudentOverView = data =>
+  request2({
+    url: "/api-web/studentManage/organStudentOverView",
+    method: "get",
+    params: data
+  });
 
 // 分部老师数据
-export const queryMemberStudentData = (data) => request2({
-  url: '/api-web/teacher/queryMemberStudentData',
-  method: 'get',
-  params: data
-})
+export const queryMemberStudentData = data =>
+  request2({
+    url: "/api-web/teacher/queryMemberStudentData",
+    method: "get",
+    params: data
+  });
 
 // 分部排行  organStudentOverView
-export const indexStudentOverView = (data) => request2({
-  url: '/api-web/organStudentOverView',
-  method: 'get',
-  params: data
-})
+export const indexStudentOverView = data =>
+  request2({
+    url: "/api-web/organStudentOverView",
+    method: "get",
+    params: data
+  });
 
 // 获取动态的配置项
-export const getSysConfigName = (data) => request2({
-  url: '/api-web/sysConfig/queryByParamName',
-  method: 'get',
-  params: data
-})
+export const getSysConfigName = data =>
+  request2({
+    url: "/api-web/sysConfig/queryByParamName",
+    method: "get",
+    params: data
+  });
 
 // 学员已排课时长未消耗完
-export const getHasFreeCourseList = (data) => request2({
-  url: '/api-web/musicGroupPaymentCalender/queryHasFreeCourseTimesStudent',
-  method: 'get',
-  params: data
-})
+export const getHasFreeCourseList = data =>
+  request2({
+    url: "/api-web/musicGroupPaymentCalender/queryHasFreeCourseTimesStudent",
+    method: "get",
+    params: data
+  });
 
 // 学员会员数
-export const getOrganMemberList = (data) => request2({
-  url: '/api-web/studentManage/getCloudStudyStudentOverViewList',
-  method: 'get',
-  params: data,
-  requestType:'form'
-})
+export const getOrganMemberList = data =>
+  request2({
+    url: "/api-web/studentManage/getCloudStudyStudentOverViewList",
+    method: "get",
+    params: data,
+    requestType: "form"
+  });
+
+// 列表
+export const cloudTeacherNum = data =>
+  request2({
+    url: "/api-web/studentManage/cloudTeacherSum",
+    method: "post",
+    data
+  });
+
+// 详情
+export const cloudTeacherSumDetail = data =>
+  request2({
+    url: "/api-web/studentManage/cloudTeacherSumDetail",
+    method: "post",
+    data
+  });

+ 51 - 50
src/views/main/baseinfo/student.vue

@@ -1,7 +1,8 @@
 <template
-v-loading="loading"
-    element-loading-spinner="el-icon-loading"
-    element-loading-background="rgba(0, 0, 0, 0.8)">
+  v-loading="loading"
+  element-loading-spinner="el-icon-loading"
+  element-loading-background="rgba(0, 0, 0, 0.8)"
+>
   <el-card>
     <div slot="header" class="clearfix">
       <searchHeader
@@ -38,7 +39,7 @@ v-loading="loading"
     </statistic>
     <div class="wrap">
       <div class="chioseBox">
-        <el-radio-group v-model="timer" >
+        <el-radio-group v-model="timer">
           <el-radio-button label="day">按天</el-radio-button>
           <el-radio-button label="month">按月</el-radio-button>
         </el-radio-group>
@@ -70,12 +71,12 @@ export default {
     "ve-funnel": veFunnel,
     "ve-line": veLine,
     "count-to": countTo,
-    searchHeader,
+    searchHeader
   },
   computed: {
     legend() {
       return {
-        left: "10px",
+        left: "10px"
       };
     },
     items() {
@@ -86,9 +87,9 @@ export default {
         "NEWLY_STUDENT_NUM",
         "QUIT_MUSIC_GROUP_STUDENT_NUM",
         "VIP_PRACTICE_STUDENT_NUM",
-        "VIP_PRACTICE_ADD_STUDENT_NUM",
+        "VIP_PRACTICE_ADD_STUDENT_NUM"
       ];
-      arr.forEach((str) => {
+      arr.forEach(str => {
         if (this.data[str]) {
           obj[str] = this.data[str];
         }
@@ -108,16 +109,16 @@ export default {
        */
       return obj;
     },
-    noQuitStudentItem(){
-            let obj = {};
+    noQuitStudentItem() {
+      let obj = {};
       let arr = [
         "ADD_STUDENT_REGISTRATION_NUM",
         "MUSIC_GROUP_STUDENT",
         "NEWLY_STUDENT_NUM",
         "VIP_PRACTICE_STUDENT_NUM",
-        "VIP_PRACTICE_ADD_STUDENT_NUM",
+        "VIP_PRACTICE_ADD_STUDENT_NUM"
       ];
-      arr.forEach((str) => {
+      arr.forEach(str => {
         if (this.data[str]) {
           obj[str] = this.data[str];
         }
@@ -133,30 +134,29 @@ export default {
           scale: true,
           min: 0,
           axisLabel: {
-            formatter: "{value}人",
-          },
+            formatter: "{value}人"
+          }
         },
         series: {
           type: "line",
-          smooth: false,
+          smooth: false
         },
         tooltip: {
           axisPointer: {
             type: "shadow",
             shadowStyle: {
-              color: "rgba(150,150,150,0.2)",
-            },
+              color: "rgba(150,150,150,0.2)"
+            }
           },
-          formatter: (item) => {
+          formatter: item => {
             return [
               item[0].axisValueLabel,
-              ...item.map(
-                (d) => {
-                  return `<br/>${d.marker}${d.seriesName}: ${d.value[1]}人`}
-              ),
+              ...item.map(d => {
+                return `<br/>${d.marker}${d.seriesName}: ${d.value[1]}人`;
+              })
             ].join("");
-          },
-        },
+          }
+        }
       };
     },
     dataZoom() {
@@ -164,8 +164,8 @@ export default {
         {
           type: "slider",
           start: 60,
-          end: 100,
-        },
+          end: 100
+        }
       ];
     },
     chartData() {
@@ -176,15 +176,16 @@ export default {
           const key = this.$helpers.dayjs(row.month).format("YYYY-MM-DD");
           if (!months[key]) {
             months[key] = {
-              日期: key,
+              日期: key
             };
           }
           months[key][item.title] = row.percent;
         }
       }
+
       return {
-        columns: ["日期", ...values.map((item) => item.title)],
-        rows: Object.values(months),
+        columns: ["日期", ...values.map(item => item.title)],
+        rows: Object.values(months)
       };
     },
     chartDataForMoth() {
@@ -196,7 +197,7 @@ export default {
 
           if (!months[key]) {
             months[key] = {
-              月份: key,
+              月份: key
             };
             months[key][item.title] = row.percent;
           } else {
@@ -214,23 +215,23 @@ export default {
       }
 
       return {
-        columns: ["月份", ...values.map((item) => item.title)],
-        rows: Object.values(months),
+        columns: ["月份", ...values.map(item => item.title)],
+        rows: Object.values(months)
       };
     },
     funnelData() {
       const { indexMonthData = [] } = this.data["STUDENT_CONVERSION"] || {};
       return {
         columns: ["类型", "数值"],
-        rows: indexMonthData.map((item) => ({
+        rows: indexMonthData.map(item => ({
           类型: item.title,
-          数值: item.percent,
-        })),
+          数值: item.percent
+        }))
       };
     },
     dataEmpty() {
       return !this.chartData.rows.length;
-    },
+    }
   },
   data() {
     return {
@@ -238,15 +239,15 @@ export default {
       isHistogram: true,
       timer: "day",
       mdate: this.search?.dates,
-      loading: false,
+      loading: false
     };
   },
-    mounted(){
-     this.$refs.searchHeader.initStatue('month');
+  mounted() {
+    this.$refs.searchHeader.initStatue("month");
   },
   methods: {
-    init(){
-      this.FetchDetail()
+    init() {
+      this.FetchDetail();
     },
     changeValue(date) {
       // 请求更改数据
@@ -263,17 +264,17 @@ export default {
           ...rest,
           ...getTimes(this.mdate, ["startDate", "endDate"]),
           dataTypes:
-            "ADD_STUDENT_REGISTRATION_NUM,MUSIC_GROUP_STUDENT,NEWLY_STUDENT_NUM,QUIT_MUSIC_GROUP_STUDENT_NUM,VIP_PRACTICE_STUDENT_NUM,VIP_PRACTICE_ADD_STUDENT_NUM",
+            "ADD_STUDENT_REGISTRATION_NUM,MUSIC_GROUP_STUDENT,NEWLY_STUDENT_NUM,QUIT_MUSIC_GROUP_STUDENT_NUM,VIP_PRACTICE_STUDENT_NUM,VIP_PRACTICE_ADD_STUDENT_NUM"
         });
         for (const item of res.data) {
           // 再循环一遍
           // for (const key in this.items) {
           //   // console.log(key);
           //   if (item.dataType == key) {
-              data[item.dataType] = {
-                ...item,
-                desc: descs[item.dataType],
-              };
+          data[item.dataType] = {
+            ...item,
+            desc: descs[item.dataType]
+          };
           //   }
           // }
         }
@@ -296,7 +297,7 @@ export default {
           ? (this.timer = "month")
           : (this.timer = "day");
       }
-    },
+    }
   },
   watch: {
     search: {
@@ -305,9 +306,9 @@ export default {
         this.mdate = val.dates;
         this.timer = "day";
         this.$refs.searchHeader.initStatue();
-      },
-    },
-  },
+      }
+    }
+  }
 };
 </script>
 <style lang="less" scoped>

+ 189 - 0
src/views/main/cloudDate/exerciseDuration.vue

@@ -0,0 +1,189 @@
+<template>
+  <div class="m-container">
+    <!-- 搜索标题 -->
+    <saveform
+      :inline="true"
+      ref="searchForm"
+      class="searchForm"
+      :model.sync="searchForm"
+    >
+      <el-form-item prop="dates">
+        <el-date-picker
+          v-model="searchForm.dates"
+          type="daterange"
+          style="width: 405px"
+          range-separator="至"
+          start-placeholder="开始日期"
+          end-placeholder="结束日期"
+        >
+        </el-date-picker>
+      </el-form-item>
+
+      <el-form-item>
+        <el-button @click="search" type="danger">搜索</el-button>
+        <el-button @click="onReSet" type="primary">重置</el-button>
+      </el-form-item>
+    </saveform>
+
+    <div class="tableWrap">
+      <el-table
+        :data="tableList"
+        :header-cell-style="{ background: '#EDEEF0', color: '#444' }"
+      >
+        <el-table-column
+          width="120px"
+          align="center"
+          prop="id"
+          label="排名"
+        ></el-table-column>
+        <el-table-column
+          align="center"
+          prop="id"
+          label="分部名称"
+        ></el-table-column>
+        <el-table-column
+          align="center"
+          prop="id"
+          label="会员人数"
+        ></el-table-column>
+        <el-table-column
+          align="center"
+          prop="id"
+          label="练习人数"
+        ></el-table-column>
+        <el-table-column
+          align="center"
+          prop="id"
+          label="练习率"
+        ></el-table-column>
+        <el-table-column
+          align="center"
+          prop="id"
+          label="≤60分钟"
+        ></el-table-column>
+        <el-table-column
+          align="center"
+          prop="id"
+          label="60~120分钟"
+        ></el-table-column>
+        <el-table-column
+          align="center"
+          prop="id"
+          label="120~240分钟"
+        ></el-table-column>
+        <el-table-column
+          align="center"
+          prop="id"
+          label=">240分钟"
+        ></el-table-column>
+        <el-table-column
+          align="center"
+          prop="id"
+          label="平均练习时长"
+        ></el-table-column>
+        <el-table-column
+          align="center"
+          prop="id"
+          label="练习达标占比"
+        ></el-table-column>
+
+        <el-table-column align="center" label="操作" fixed="right">
+          <template slot-scope="scope">
+            <el-button
+              v-permission="'employeeInfo/update'"
+              @click="openTypes('update', scope.row)"
+              type="text"
+              >详情</el-button
+            >
+          </template>
+        </el-table-column>
+      </el-table>
+    </div>
+  </div>
+</template>
+<script>
+import saveform from "@/components/save-form";
+import dayjs from "dayjs";
+import { cloudTeacherNum } from "../api";
+export const getTimes = (times, keys = []) => {
+  if (times && times.length) {
+    return {
+      [keys[0] || "start"]: dayjs(times[0]).format("YYYY-MM-DD"),
+      [keys[1] || "start"]: dayjs(times[1]).format("YYYY-MM-DD")
+    };
+  }
+  return {};
+};
+export default {
+  components: { saveform },
+  name: "helpCategory",
+  data() {
+    return {
+      searchForm: {
+        dates: []
+      },
+      tableList: []
+    };
+  },
+  async mounted() {
+    this.getList();
+  },
+  methods: {
+    search() {
+      // this.$refs.searchForm.validate((valid) => {
+      //   this.pageInfo = {
+      //     ...this.pageInfo,
+      //     page: 1,
+      //   };
+      //   this.getList();
+      // });
+    },
+    onReSet() {
+      // this.pageInfo = {
+      //   ...this.pageInfo,
+      //   page: 1,
+      // };
+      // this.$refs.searchForm.resetFields();
+      // this.getList();
+    },
+    async getList() {
+      // cloudTeacherNum
+      try {
+        const { dates } = this.searchForm;
+        let params = {
+          ...getTimes(dates, ["startDate", "endDate"])
+        };
+        const res = await cloudTeacherNum({
+          page: 1,
+          rows: 10,
+          ...params
+        });
+        this.tableList = [];
+        this.tableList = res.data.list;
+      } catch {}
+    }
+  }
+};
+</script>
+<style lang="scss" scoped>
+::v-deep .el-date-editor.el-input {
+  width: 100% !important;
+}
+::v-deep .el-select {
+  width: 100% !important;
+}
+::v-deep .el-table .cell {
+  display: -webkit-box;
+  overflow: hidden;
+  max-height: 45px;
+  text-overflow: ellipsis;
+  -webkit-line-clamp: 3;
+  -webkit-box-orient: vertical;
+}
+::v-deep .el-dialog__body {
+  padding: 10px 20px;
+}
+.newBand {
+  display: inline-block;
+}
+</style>

+ 34 - 20
src/views/main/cloudDate/index.vue

@@ -1,36 +1,50 @@
 <template>
-  <div>
-    <!-- <allDate v-permission="'studentManage/getCloudStudyStudentOverView'" class="marginBottom20" /> -->
-    <organMemberList v-permission="'studentManage/getCloudStudyStudentOverView'"/>
-    <!-- <organDate  v-permission="'studentManage/organStudentOverView'"  class="marginBottom20"/>
-    <activeUserNum  v-permission="'newIndex/clound'"  class="marginBottom20" />
-    <organRanking  v-permission="'organStudentOverView'" /> -->
+  <div class="m-container">
+    <h2>
+      <div class="squrt"></div>
+      团练宝数据
+    </h2>
+    <div class="m-core">
+      <tab-router @change="changeKey">
+        <el-tab-pane lazy label="数据总览" name="memberList">
+          <organMemberList
+            v-permission="'studentManage/getCloudStudyStudentOverView'"
+          />
+        </el-tab-pane>
+        <el-tab-pane lazy label="练习时长" name="exerciseDuration">
+          <exerciseDuration />
+        </el-tab-pane>
+      </tab-router>
+    </div>
   </div>
 </template>
 <script>
-import allDate from './allDate.vue'
-import organDate from './organDate.vue'
-import activeUserNum from './activeUserNum.vue'
-import organRanking from './organRanking.vue'
-import organMemberList from './organMemberList.vue'
+import { permission } from "@/utils/directivePage";
+// exerciseDuration
+import allDate from "./allDate.vue";
+import organMemberList from "./organMemberList.vue";
+import exerciseDuration from "./exerciseDuration.vue";
 export default {
-  components:{
+  components: {
     allDate,
     organMemberList,
-    // organDate,
-    // activeUserNum,
-    // organRanking
+    exerciseDuration
   },
-  data(){
-    return{
-
+  data() {
+    return {
+      activeKey: ""
+    };
+  },
+  methods: {
+    permission,
+    changeKey(val) {
+      this.activeKey = val;
     }
   }
-}
+};
 </script>
 <style lang="scss" scoped>
 .marginBottom20 {
   margin-bottom: 20px;
 }
-
 </style>

+ 208 - 66
src/views/main/cloudDate/organMemberList.vue

@@ -1,7 +1,7 @@
 <template>
   <div>
     <el-card style="margin-bottom: 20px">
-      <headers title="数据总览"  @changeOrgan="changeOrgan" :special="true"/>
+      <!-- <headers title="数据总览" @changeOrgan="changeOrgan" :special="true" /> -->
       <div
         class="wall"
         style="height: 68px"
@@ -11,14 +11,14 @@
       </div>
       <!--
           -->
-      <statistic :col="4" class="statistic" :cols="0">
+      <statistic :col="3" class="statistic" :cols="0">
         <statistic-item
           v-for="(item, key) in items"
           :key="key"
           @click="active = key"
           :class="{ active: active === key }"
         >
-          <span v-if="key=='againBuyRate' || key=='buyRate'">
+          <span v-if="key == 'againBuyRate' || key == 'buyRate'">
             {{ item.title + "(%)" }}
             <el-tooltip
               v-if="item.desc"
@@ -47,16 +47,34 @@
             </el-tooltip>
           </span>
 
-          <span v-if="key=='againBuyRate' || key=='buyRate'"> <count-to :endVal="item.percent || 0"    :decimals="2" /> </span>
+          <span v-if="key == 'againBuyRate' || key == 'buyRate'">
+            <count-to :endVal="item.percent || 0" :decimals="2" />
+          </span>
           <span v-else> <count-to :endVal="item.percent || 0" /> </span>
-
-
         </statistic-item>
       </statistic>
+
+      <ve-histogram
+        style="width: 100%"
+        height="350px"
+        :data="chartData"
+        :data-empty="dataEmpty"
+        :extend="chartExtend"
+        :legend="legend"
+        :data-zoom="dataZoom"
+      ></ve-histogram>
     </el-card>
 
     <el-card>
-      <headers title="分部数据"  :hidenOrgan="true"/>
+      <!-- <headers title="分部数据" :hidenOrgan="true" /> -->
+      <ExportChiose
+        style="margin-top: 16px"
+        ExportEnum="CLOUD_STUDY_STUDENT_OVER_VIEW"
+        :exportData="exporyun"
+        fileName="云教练数据汇总"
+        errorMsg="请选择分部"
+        :isDownList="true"
+      />
       <div class="tableWrap">
         <el-table
           style="width: 100%"
@@ -65,7 +83,7 @@
           @sort-change="sortChang"
           :default-sort="{
             prop: 'cloudStudyUseStudentDuty',
-            order: 'descending',
+            order: 'descending'
           }"
           sortable="custom"
         >
@@ -82,7 +100,7 @@
           <el-table-column
             align="center"
             prop="totalStudentNum"
-            label="在读学员总数"
+            label="在读数"
           >
             <!-- <template slot="header" slot-scope="slot">
               <div class="titleCell">
@@ -113,57 +131,70 @@
           <el-table-column
             align="center"
             prop="vipStudentNum"
-            label="会员总人数"
+            label="生效待激活总人数"
           >
           </el-table-column>
 
           <el-table-column
             align="center"
-            prop="activeStudentNum"
-            label="活跃会员"
+            prop="vipStudentRate"
+            label="会员占比"
           >
             <template slot="header" slot-scope="slot">
               <div class="titleCell">
-                <span>活跃学员人数</span>
+                <span>会员人数占比</span>
                 <el-tooltip placement="top" popper-class="mTooltip">
                   <div slot="content">
-                    过去四周内有三周及以上每周训练时长超过60分钟为活跃学员
+                    会员总人数/有效学员数
                   </div>
                   <i
                     class="el-icon-question micon el-tooltip"
-                    style="
-                      font-size: 18px;
-                      color: #f56c6c;
-                      top: 2px;
-                      position: relative;
-                    "
+                    style=" font-size: 18px;color: #f56c6c;top: 2px;position: relative;"
                   ></i>
                 </el-tooltip>
               </div>
             </template>
+            <template slot-scope="scope">
+              <div>
+                {{ numeral(scope.row.vipStudentRate || 0).format("0.00") }}%
+              </div>
+            </template>
           </el-table-column>
+
           <el-table-column
             align="center"
             prop="effectiveVipStudentNum"
-            label="生效中会员人数"
+            label="生效会员"
           ></el-table-column>
           <el-table-column
             align="center"
             prop="waitActivateVipStudentNum"
-            label="待激活会员人数"
+            label="待激活会员"
           ></el-table-column>
 
+          <el-table-column align="center" prop="buyRate" label="覆盖率">
+            <template slot-scope="scope">
+              {{ numeral(scope.row.buyRate || 0).format("0.00") }}%
+            </template>
+          </el-table-column>
+
+          <el-table-column align="center" prop="againBuyRate" label="复购率">
+            <template slot-scope="scope">
+              {{ numeral(scope.row.againBuyRate || 0).format("0.00") }}%
+            </template>
+          </el-table-column>
+
           <el-table-column
             align="center"
-            prop="vipStudentRate"
-            label="会员人数占比"
+            prop="activeStudentNum"
+            label="活跃会员"
           >
-          <template slot="header" slot-scope="slot">
+            <template slot="header" slot-scope="slot">
               <div class="titleCell">
-                <span>会员人数占比</span>
+                <span>近一月活跃人数</span>
                 <el-tooltip placement="top" popper-class="mTooltip">
                   <div slot="content">
-                    会员总人数/有效学员数
+                    过去四周内有三周及以上每周训练时长超过60分钟为活跃学员
                   </div>
                   <i
                     class="el-icon-question micon el-tooltip"
@@ -177,17 +208,13 @@
                 </el-tooltip>
               </div>
             </template>
-            <template slot-scope="scope">
-              <div>
-                {{ numeral(scope.row.vipStudentRate || 0).format("0.00") }}%
-              </div>
-            </template>
           </el-table-column>
-          <!-- <el-table-column
+
+          <el-table-column
             align="center"
-            prop="totalStudentNum"
+            prop="cloudStudyTodayUseStudentNum"
             label="今日使用人数"
-          ></el-table-column> -->
+          ></el-table-column>
         </el-table>
         <!-- <pagination
           :autoScroll="false"
@@ -202,8 +229,11 @@
   </div>
 </template>
 <script>
+import ExportChiose from "@/components/Export-chiose";
 import pagination from "@/components/Pagination/index";
 import { getOrganMemberList } from "../api";
+import "echarts/lib/component/dataZoom";
+import histogram from "v-charts/lib/histogram.common";
 import { Export } from "@/utils/downLoadFile";
 import headers from "./modals/headers.vue";
 import countTo from "vue-count-to";
@@ -216,7 +246,9 @@ export default {
   components: {
     headers,
     pagination,
+    "ve-histogram": histogram,
     countTo,
+    ExportChiose
   },
   data() {
     return {
@@ -227,14 +259,14 @@ export default {
         limit: 10, // 限制显示条数
         page: 1, // 当前页
         total: 0, // 总条数
-        page_size: [10, 20, 40, 50], // 选择限制显示条数
+        page_size: [10, 20, 40, 50] // 选择限制显示条数
       },
       searchList: {
-        cloudStudyUseStudentDuty: "DESC",
+        cloudStudyUseStudentDuty: "DESC"
       },
       tenantId: "",
       dataList: {},
-      active: "",
+      active: ""
     };
   },
   mounted() {
@@ -253,13 +285,27 @@ export default {
        */
       try {
         const arr = [
-          36, 39, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 52, 54, 56,
+          36,
+          39,
+          41,
+          42,
+          43,
+          44,
+          45,
+          46,
+          47,
+          48,
+          49,
+          50,
+          52,
+          54,
+          56
         ];
         const res = await getCloudStudyStudentOverView({
           page: 1,
           rows: 10,
           ...this.searchList,
-          organIds: this.organId,
+          organIds: this.organId
         });
         this.tableList = [];
         //  res.data.forEach(ele => {
@@ -268,9 +314,9 @@ export default {
         //    }
         //  });
         this.tableList = res.data.list;
+        console.log(this.tableList, "tableList");
         // this.rules.total = res.data.list?.total;
         this.dataList = res.data?.overView || {};
-        // console.log(this.tableList)
       } catch (e) {
         console.log(e);
       }
@@ -278,7 +324,7 @@ export default {
     sortChang(val) {
       const dates = {
         ascending: "ASC",
-        descending: "DESC",
+        descending: "DESC"
       };
       this.searchList = {};
       if (val.prop && val.order) {
@@ -291,7 +337,7 @@ export default {
       // 跳转到分部数据详情 row.organId
       this.$router.push({
         name: "organDateDetail",
-        params: { organId: row.organId },
+        params: { organId: row.organId }
       });
     },
     changeOrgan(val) {
@@ -299,28 +345,28 @@ export default {
       this.rules.page = 1;
       this.getList();
     },
-    organDateExport() {
-      let params = { ...this.searchList, organIds: this.organId };
-      Export(
-        this,
-        {
-          url: "/api-web/export/organStudentOverView",
-          fileName: "分部云教练数据.xls",
-          method: "post",
-          params: qs.stringify(params),
-        },
-        "您确定导出分部云教练数据列表?"
-      );
-    },
+    // organDateExport() {
+    //   let params = { ...this.searchList, organIds: this.organId };
+    //   Export(
+    //     this,
+    //     {
+    //       url: "/api-web/export/organStudentOverView",
+    //       fileName: "分部云教练数据.xls",
+    //       method: "post",
+    //       params: qs.stringify(params)
+    //     },
+    //     "您确定导出分部云教练数据列表?"
+    //   );
+    // },
 
     gotoAll() {
       this.$router.push({
-        name: "organRankDetail",
+        name: "organRankDetail"
       });
     },
     numeral(val) {
       return numeral(val);
-    },
+    }
   },
   computed: {
     items() {
@@ -328,30 +374,126 @@ export default {
       //        "eVipStudentNum",
       let arr = [
         "totalStudentNum",
+        "vipStudentNum",
+        "vipStudentRate",
+        "effectiveVipStudentNum",
+        "waitActivateVipStudentNum",
         "buyRate",
         "againBuyRate",
         // "effectiveStudentNum",
-        "vipStudentNum",
         "cloudStudyLivelyStudentNum",
-        "effectiveVipStudentNum",
-        "waitActivateVipStudentNum",
         // "newCloudStudyStudentNum",
-        // "vipStudentRate",
         // "cloudStudyUseStudentNum",
-        "cloudStudyTodayUseStudentNum",
+        "cloudStudyTodayUseStudentNum"
       ];
-      arr.forEach((str) => {
+      arr.forEach(str => {
         if (this.dataList[str] + "") {
           obj[str] = {
             title: titles[str],
             percent: this.dataList[str],
-            desc: descs[str],
+            desc: descs[str]
           };
         }
       });
+
       return obj;
     },
-  },
+    legend() {
+      return {
+        left: "10px"
+      };
+    },
+    chartData() {
+      const temp = {
+        totalStudentNum: "在读人数",
+        vipStudentNum: "会员人数",
+        effectiveVipStudentNum: "生效会员",
+        waitActivateVipStudentNum: "待激活",
+        activeStudentNum: "近一月活跃人数",
+        cloudStudyTodayUseStudentNum: "今日使用人数"
+      };
+      const values = Object.values(this.tableList);
+      const months = {};
+      for (const key in temp) {
+        for (const item of values) {
+          if (!months[item.organId]) {
+            months[item.organId] = {
+              分部: item.organName
+            };
+          }
+          months[item.organId][temp[key]] = item[key] || 0;
+        }
+      }
+
+      return {
+        columns: [
+          "分部",
+          "在读人数",
+          "会员人数",
+          "生效会员",
+          "待激活",
+          "近一月活跃人数",
+          "今日使用人数"
+        ],
+        rows: Object.values(months)
+      };
+    },
+    chartExtend() {
+      return {
+        yAxis: {
+          //纵轴标尺固定
+          minInterval: 1,
+          type: "value",
+          scale: true,
+          min: 0,
+          axisLabel: {
+            formatter: "{value}人"
+          }
+        },
+        series: {
+          type: "bar",
+          smooth: false
+        },
+        tooltip: {
+          axisPointer: {
+            type: "shadow",
+            shadowStyle: {
+              color: "rgba(150,150,150,0.2)"
+            }
+          },
+          formatter: item => {
+            return [
+              item[0].axisValueLabel,
+              ...item.map(d => {
+                return `<br/>${d.marker}${d.seriesName}: ${d.value}人`;
+              })
+            ].join("");
+          }
+        }
+      };
+    },
+    dataZoom() {
+      return [
+        {
+          show: true,
+          type: "slider",
+          start: 0,
+          end: 30,
+          filterMode: "empty",
+          zoomLock: true,
+          handleSize: 0
+        }
+      ];
+    },
+    dataEmpty() {
+      return !this.chartData.rows.length;
+    },
+    exporyun() {
+      return {
+        organId: this.organId
+      };
+    }
+  }
 };
 </script>
 <style lang="scss" scoped>

+ 283 - 248
src/views/main/constant.js

@@ -1,252 +1,272 @@
-import dayjs from 'dayjs'
+import dayjs from "dayjs";
 
 export const descs = {
-  STUDENT_REGISTRATION_NUM: '截止到昨日,系统注册学员总数',
-  CHARGE_STUDENT_CHANGE_RATE: '截止到昨日,注册学员现金付费率(有订单交易成功的都算,导入的也算)',
-  ACTIVATION_RATE: '截止到昨日,筹备中或进行中乐团在读学员和有VIP或网管课学员激活率(VIP网管课最后一节课在6个月前则不纳入统计)',
-  SCHOOL: '截止到昨日,存在【进行中】乐团的【合作单位】总数',
-  PROGRESS_MUSIC_GROUP_NUM: '截止到昨日,【进行中】乐团总数',
-  TEACHER_NUM: '截止到昨日,非冻结,且离职时间在昨日之后的老师总数',
-  FULL_TIME_NUM: '截止到昨日,非冻结、离职时间在昨日之后,且工作类型为【全职】的老师总数',
-  PART_TIME_NUM: '截止到昨日,非冻结、离职时间在昨日之后,且工作类型为【兼职】的老师总数',
-  SURPLUS_COURSE_NUM: '截止到昨日,系统中【未开始】课程总数(乐团+VIP+网管)【不包括试听课】',
-  SURPLUS_MUSIC_COURSE_NUM: '截止到昨日,系统乐团【未开始】课程总数',
-  SURPLUS_VIP_COURSE_NUM: '截止到昨日,系统中【未开始】VIP课程总数',
-  SURPLUS_PRACTICE_COURSE_NUM: '截止到昨日,系统中【未开始】网管课程总数',
-  OVER_COURSE_NUM: '截止到昨日,系统中【已结束】课程总数(乐团+VIP+网管)【不包括试听课】',
-  OVER_MUSIC_COURSE_NUM: '截止到昨日,系统中乐团【已结束】课程总数',
-  OVER_VIP_COURSE_NUM: '截止到昨日,系统中【已结束】VIP课程总数',
-  OVER_PRACTICE_COURSE_NUM: '截止到昨日,系统中【已结束】网管课程总数',
-  FINANCE_PAY: '筛选时间段内支出金额总和',
-  FINANCE_BALANCE_AMOUNT: '筛选时间段内余额消耗总和',
-  FINANCE_AMOUNT: '筛选时间段内现金收入总和',
-  HOMEWORK_CREATE_RATE: '筛选时间段内,服务指标训练总布置率',
-  HOMEWORK_SUBMIT_RATE: '筛选时间段内,已布置的训练学员总提交率(包括服务指标外的训练)',
-  HOMEWORK_COMMENT_RATE: '筛选时间段内,学员已提交的训练老师总点评率',
-  MUSIC_GROUP_COURSE: '筛选时间段内,乐团课程总数',
-  VIP_GROUP_COURSE: '筛选时间段内,VIP课程总数',
-  PRACTICE_GROUP_COURSE: '筛选时间段内,网管课程总数',
-  ADD_STUDENT_REGISTRATION_NUM: '筛选时间段内,新注册学员总数',
-  MUSIC_GROUP_STUDENT: '筛选时间段中最后一日,【进行中】乐团【在读】学员总数,分部下去重',
-  NEWLY_STUDENT_NUM: '筛选时间段内,新增的【进行中】乐团【在读】学员总数(学员当前无在读乐团则记为新增)',
-  QUIT_MUSIC_GROUP_STUDENT_NUM: '筛选时间段内,乐团退团学员总数(学员无在读乐团,则记为退团)',
-  VIP_PRACTICE_STUDENT_NUM: '筛选时间段中最后一日,学员有剩余VIP或网管未上课时的总人数(分部下去重)',
-  VIP_PRACTICE_ADD_STUDENT_NUM: '筛选时间段内,新增的VIP/网管课付费学员总数',
-  MUSIC_PATROL_ITEM: '乐团主管提交的巡查表中有未勾选事项',
-  HIGH_CLASS_STUDENT_LESS_THAN_THREE: '基础技能班学员数量<3且没有备注',
-  HIGH_CLASS_STUDENT_LESS_THAN_THREE_INFO:'基础技能班学员数量<3且有备注',
-  STUDENT_NOT_PAYMENT: '已添加到缴费项目中,未排课且未缴费学员数量',
-  STUDENT_APPLY_FOR_QUIT_MUSIC_GROUP: '未处理的学员退团申请数量',
-  TEACHER_EXPECT_SALARY_BE_LOW: '本月预计课酬未达到系统设置的分部基本课酬标准的老师人数',
-  INSPECTION_ITEM: '乐团主管未完成巡查计划安排',
-  INSPECTION_ITEM_PLAN: '乐团主管已安排的巡查任务未提交',
-  STUDENT_VISIT: '乐团主管未完成回访任务',
-  TEACHER_EXCEPTION_ATTENDANCE: '有老师考勤的课程中,老师异常考勤的课程数量',
-  STUDENT_EXCEPTION_ATTENDANCE:'有老师考勤的课程中,学员异常考勤的课程数量',
-  TEACHER_NOT_A_CLASS: '课程无老师考勤',
-  TEACHER_SERVE_ERROR: '服务指标生成的训练未布置',
-  WAIT_CREATE_PAYMENT_CALENDER: '缴费项目有效期结束前7天',
-  NO_CLASS_MUSIC_GROUP_STUDENT_INFO: '进行中且未开课乐团,未加入任何班级的学员数量',
-  NO_CLASS_MUSIC_GROUP_STUDENT_ERROR:'进行中且已开课乐团,未加入任何班级的学员数量',
-  COURSE_TIME_ERROR: '上课时间在21:00~06:00时间段内为时间安排异常',
-  TOTAL_AMOUNT: '总收入:现金收入 + 余额收入',
-  STUDENT_ERROR_LEAVE: '当月请假2次及以上',
-  STUDENT_ARREARAGE: '已加入缴费项目,已排课且未缴费学员数量',
-  NO_MEMBER_STUDENT_INFO: '进行中会员收费乐团中会员已过期在读学生数量',
+  STUDENT_REGISTRATION_NUM: "截止到昨日,系统注册学员总数",
+  CHARGE_STUDENT_CHANGE_RATE:
+    "截止到昨日,注册学员现金付费率(有订单交易成功的都算,导入的也算)",
+  ACTIVATION_RATE:
+    "截止到昨日,筹备中或进行中乐团在读学员和有VIP或网管课学员激活率(VIP网管课最后一节课在6个月前则不纳入统计)",
+  SCHOOL: "截止到昨日,存在【进行中】乐团的【合作单位】总数",
+  PROGRESS_MUSIC_GROUP_NUM: "截止到昨日,【进行中】乐团总数",
+  TEACHER_NUM: "截止到昨日,非冻结,且离职时间在昨日之后的老师总数",
+  FULL_TIME_NUM:
+    "截止到昨日,非冻结、离职时间在昨日之后,且工作类型为【全职】的老师总数",
+  PART_TIME_NUM:
+    "截止到昨日,非冻结、离职时间在昨日之后,且工作类型为【兼职】的老师总数",
+  SURPLUS_COURSE_NUM:
+    "截止到昨日,系统中【未开始】课程总数(乐团+VIP+网管)【不包括试听课】",
+  SURPLUS_MUSIC_COURSE_NUM: "截止到昨日,系统乐团【未开始】课程总数",
+  SURPLUS_VIP_COURSE_NUM: "截止到昨日,系统中【未开始】VIP课程总数",
+  SURPLUS_PRACTICE_COURSE_NUM: "截止到昨日,系统中【未开始】网管课程总数",
+  OVER_COURSE_NUM:
+    "截止到昨日,系统中【已结束】课程总数(乐团+VIP+网管)【不包括试听课】",
+  OVER_MUSIC_COURSE_NUM: "截止到昨日,系统中乐团【已结束】课程总数",
+  OVER_VIP_COURSE_NUM: "截止到昨日,系统中【已结束】VIP课程总数",
+  OVER_PRACTICE_COURSE_NUM: "截止到昨日,系统中【已结束】网管课程总数",
+  FINANCE_PAY: "筛选时间段内支出金额总和",
+  FINANCE_BALANCE_AMOUNT: "筛选时间段内余额消耗总和",
+  FINANCE_AMOUNT: "筛选时间段内现金收入总和",
+  HOMEWORK_CREATE_RATE: "筛选时间段内,服务指标训练总布置率",
+  HOMEWORK_SUBMIT_RATE:
+    "筛选时间段内,已布置的训练学员总提交率(包括服务指标外的训练)",
+  HOMEWORK_COMMENT_RATE: "筛选时间段内,学员已提交的训练老师总点评率",
+  MUSIC_GROUP_COURSE: "筛选时间段内,乐团课程总数",
+  VIP_GROUP_COURSE: "筛选时间段内,VIP课程总数",
+  PRACTICE_GROUP_COURSE: "筛选时间段内,网管课程总数",
+  ADD_STUDENT_REGISTRATION_NUM: "筛选时间段内,新注册学员总数",
+  MUSIC_GROUP_STUDENT:
+    "筛选时间段中最后一日,【进行中】乐团【在读】学员总数,分部下去重",
+  NEWLY_STUDENT_NUM:
+    "筛选时间段内,新增的【进行中】乐团【在读】学员总数(学员当前无在读乐团则记为新增)",
+  QUIT_MUSIC_GROUP_STUDENT_NUM:
+    "筛选时间段内,乐团退团学员总数(学员无在读乐团,则记为退团)",
+  VIP_PRACTICE_STUDENT_NUM:
+    "筛选时间段中最后一日,学员有剩余VIP或网管未上课时的总人数(分部下去重)",
+  VIP_PRACTICE_ADD_STUDENT_NUM: "筛选时间段内,新增的VIP/网管课付费学员总数",
+  MUSIC_PATROL_ITEM: "乐团主管提交的巡查表中有未勾选事项",
+  HIGH_CLASS_STUDENT_LESS_THAN_THREE: "基础技能班学员数量<3且没有备注",
+  HIGH_CLASS_STUDENT_LESS_THAN_THREE_INFO: "基础技能班学员数量<3且有备注",
+  STUDENT_NOT_PAYMENT: "已添加到缴费项目中,未排课且未缴费学员数量",
+  STUDENT_APPLY_FOR_QUIT_MUSIC_GROUP: "未处理的学员退团申请数量",
+  TEACHER_EXPECT_SALARY_BE_LOW:
+    "本月预计课酬未达到系统设置的分部基本课酬标准的老师人数",
+  INSPECTION_ITEM: "乐团主管未完成巡查计划安排",
+  INSPECTION_ITEM_PLAN: "乐团主管已安排的巡查任务未提交",
+  STUDENT_VISIT: "乐团主管未完成回访任务",
+  TEACHER_EXCEPTION_ATTENDANCE: "有老师考勤的课程中,老师异常考勤的课程数量",
+  STUDENT_EXCEPTION_ATTENDANCE: "有老师考勤的课程中,学员异常考勤的课程数量",
+  TEACHER_NOT_A_CLASS: "课程无老师考勤",
+  TEACHER_SERVE_ERROR: "服务指标生成的训练未布置",
+  WAIT_CREATE_PAYMENT_CALENDER: "缴费项目有效期结束前7天",
+  NO_CLASS_MUSIC_GROUP_STUDENT_INFO:
+    "进行中且未开课乐团,未加入任何班级的学员数量",
+  NO_CLASS_MUSIC_GROUP_STUDENT_ERROR:
+    "进行中且已开课乐团,未加入任何班级的学员数量",
+  COURSE_TIME_ERROR: "上课时间在21:00~06:00时间段内为时间安排异常",
+  TOTAL_AMOUNT: "总收入:现金收入 + 余额收入",
+  STUDENT_ERROR_LEAVE: "当月请假2次及以上",
+  STUDENT_ARREARAGE: "已加入缴费项目,已排课且未缴费学员数量",
+  NO_MEMBER_STUDENT_INFO: "进行中会员收费乐团中会员已过期在读学生数量",
   MEMBER_STUDENT_INFO: "进行中会员收费乐团中会员有效期≤15天的在读学生数量",
   APPLY_AMOUNT: "乐团报名缴费、新增学员缴费收入金额总和",
   PRACTICE_AMOUNT: "网管课购买、续费金额总和",
   OTHER_AMOUNT: "其他收入金额总和",
   RENEW_AMOUNT: "乐团续费、临时加课、合班缴费金额总和",
   VIP_AMOUNT: "VIP课购买、续费、复学、课程组新增学员收入金额总和",
-  CURRENT_COURSE_ERROR:"剩余课时(未开始+排课资格)大于4的学员,本月排课节数少于4节",
-  "vipStudentNum":'待激活及生效中的会员人数(去重)',
-  "eVipStudentNum":'如果是试用会员又是付费会员,则不算试用会员数',
-  "cloudStudyLivelyStudentNum":'过去四周内有三周及以上每周训练时长超过60分钟为活跃学员',
-  "newCloudStudyStudentNum":'第一次使用云教练的人数',
-  // "cloudStudyTodayUseStudentNum":'今日使用的总人数',
+  CURRENT_COURSE_ERROR:
+    "剩余课时(未开始+排课资格)大于4的学员,本月排课节数少于4节",
+  vipStudentNum: "待激活及生效中的会员人数(去重)",
+  eVipStudentNum: "如果是试用会员又是付费会员,则不算试用会员数",
+  cloudStudyLivelyStudentNum:
+    "过去四周内有三周及以上每周训练时长超过60分钟为活跃学员",
+  newCloudStudyStudentNum: "第一次使用云教练的人数",
+  cloudStudyTodayUseStudentNum: "今日有练习记录的学员人数",
   // "cloudStudyUseStudentNum":'累计使用的总人数',
-  "totalStudentNum":"进行中、暂停的乐团的在读学员总数",
-  "againBuyRate":"在读学员且云教练生效或待激活学员中,有多次付费订单的学员数 / 乐团在读有云教练并且有付费订单的学员数",
-  "buyRate":"在读学员中云教练生效或待激活学员占比",
-  // "waitActivateVipStudentNum":'待激活会员人数',
-  // "effectiveVipStudentNum":"生效中会员人数",
-  "vipStudentRate":"会员总人数/有效学员数",
-  "effectiveStudentNum":"(进行中乐团在读学员+有剩余课时的学员+有排课次数的学员)去重"
-}
+  totalStudentNum: "进行中、暂停的乐团的在读学员总数",
+  againBuyRate:
+    "在读学员且云教练生效或待激活学员中,有多次付费订单的学员数 / 乐团在读有云教练并且有付费订单的学员数",
+  buyRate: "在读学员中云教练生效或待激活学员占比",
+  waitActivateVipStudentNum: "待激活会员人数",
+  effectiveVipStudentNum: "在读学员中会员生效人数",
+  vipStudentRate: "会员总人数/有效学员数",
+  effectiveStudentNum:
+    "(进行中乐团在读学员+有剩余课时的学员+有排课次数的学员)去重"
+};
 export const titles = {
-  "waitActivateVipStudentNum":'待激活会员人数',
-  "effectiveVipStudentNum":"生效中会员人数",
-  "vipStudentNum":'会员总人数',
-  "eVipStudentNum":'试用会员人数',
-  "totalStudentNum":"在读学员总数",
-  "cloudStudyLivelyStudentNum":'活跃学员人数 ',
-  "newCloudStudyStudentNum":'今日新增使用人数',
-  "cloudStudyTodayUseStudentNum":'今日使用人数',
-  "cloudStudyUseStudentNum":'累计使用人数',
-  "effectiveStudentNum":'有效学员数',
-  "vipStudentRate":'会员人数占比',
-  "againBuyRate":'重复购买率',
-  "buyRate":'覆盖率'
-}
-
+  waitActivateVipStudentNum: "待激活",
+  effectiveVipStudentNum: "生效会员",
+  vipStudentNum: "生效待激活总人数",
+  eVipStudentNum: "试用会员人数",
+  totalStudentNum: "在读人数",
+  cloudStudyLivelyStudentNum: "近一月活跃人数",
+  newCloudStudyStudentNum: "今日新增使用人数",
+  cloudStudyTodayUseStudentNum: "今日使用人数",
+  cloudStudyUseStudentNum: "累计使用人数",
+  effectiveStudentNum: "有效学员数",
+  vipStudentRate: "会员人数占比",
+  againBuyRate: "复购率",
+  buyRate: "覆盖率"
+};
 
 const dates = {
-  start: dayjs().subtract(1, 'month').set('date', 1).format('YYYY-MM-DD'),
-  end: dayjs().format('YYYY-MM-DD'),
-}
+  start: dayjs()
+    .subtract(1, "month")
+    .set("date", 1)
+    .format("YYYY-MM-DD"),
+  end: dayjs().format("YYYY-MM-DD")
+};
 
 export const errorType = {
   COURSE_TIME_ERROR: {
-    name: '课程时间安排异常',
+    name: "课程时间安排异常",
     isError: false,
-    url: '/teamCourseList',
-    permission: '/teamCourseList',
+    url: "/teamCourseList",
+    permission: "/teamCourseList",
     always: true,
     query: {
-      searchType: 'COURSE_TIME_ERROR',
+      searchType: "COURSE_TIME_ERROR"
       // ...dates
-    },
+    }
   },
   MUSIC_PATROL_ITEM: {
-    name: '乐团巡查事项异常',
+    name: "乐团巡查事项异常",
     isError: false,
-    url: '/musicInspection',
-    permission: '/musicInspection',
+    url: "/musicInspection",
+    permission: "/musicInspection",
     always: true,
     query: {
-      tabrouter: 'teamSchedule',
-      searchType: 'MUSIC_PATROL_ITEM',
-      ...dates,
-    },
+      tabrouter: "teamSchedule",
+      searchType: "MUSIC_PATROL_ITEM",
+      ...dates
+    }
   },
   HIGH_CLASS_STUDENT_LESS_THAN_THREE: {
-    name: '基础技能班学员数量异常',
+    name: "基础技能班学员数量异常",
     isError: true,
-    url: '/teamCLassList',
-    permission: '/teamCLassList',
+    url: "/teamCLassList",
+    permission: "/teamCLassList",
     always: true,
     query: {
-      lessThenThreeHighOnline: 'false',
-    },
+      lessThenThreeHighOnline: "false"
+    }
   },
   HIGH_CLASS_STUDENT_LESS_THAN_THREE_INFO: {
-    name: '基础技能班学员数量提醒',
+    name: "基础技能班学员数量提醒",
     isError: true,
-    url: '/teamCLassList',
-    permission: '/teamCLassList',
+    url: "/teamCLassList",
+    permission: "/teamCLassList",
     always: true,
     query: {
-      lessThenThreeHighOnline: 'true',
-    },
+      lessThenThreeHighOnline: "true"
+    }
   },
 
   NO_MEMBER_STUDENT_INFO: {
-    name: '当前共有{0}个乐团共{1}名学员会员已过期',
+    name: "当前共有{0}个乐团共{1}名学员会员已过期",
     isError: true,
-    url: '/main/teamMemberList',
-    permission: '/teamMemberList',
+    url: "/main/teamMemberList",
+    permission: "/teamMemberList",
     always: true,
     query: {
-      hasMember: '0'
+      hasMember: "0"
     }
   },
   MUSIC_GROUP_PERFORMANCE: {
-    name: '当前共有{0}个乐团共{1}次展演计划',
+    name: "当前共有{0}个乐团共{1}次展演计划",
     isError: false,
-    url: '/main/teamShowList',
-    permission: '/teamShowList',
-    always: true,
+    url: "/main/teamShowList",
+    permission: "/teamShowList",
+    always: true
   },
   MEMBER_STUDENT_INFO: {
-    name: '当前共有{0}个乐团共{1}名学员会员即将过期',
+    name: "当前共有{0}个乐团共{1}名学员会员即将过期",
     isError: true,
-    url: '/main/teamMemberList',
-    permission: '/teamMemberList',
+    url: "/main/teamMemberList",
+    permission: "/teamMemberList",
     always: true,
     query: {
-      hasMember: '1'
+      hasMember: "1"
     }
   },
   NO_CLASS_MUSIC_GROUP_STUDENT_INFO: {
-    name: '当前有{0}个未开课乐团共{1}名学员未加入任何班级',
-    filterName:'仅显示未开课乐团学员',
+    name: "当前有{0}个未开课乐团共{1}名学员未加入任何班级",
+    filterName: "仅显示未开课乐团学员",
     isError: false,
-    url: '/main/notClassStudent',
-    permission: '/notClassStudent',
+    url: "/main/notClassStudent",
+    permission: "/notClassStudent",
     always: true,
     query: {
-      hasCourse: 'false'
+      hasCourse: "false"
     }
   },
   NO_CLASS_MUSIC_GROUP_STUDENT_ERROR: {
-    name: '当前有{0}个已开课乐团共{1}名学员未加入任何班级',
-    filterName:'仅显示已开课乐团学员',
+    name: "当前有{0}个已开课乐团共{1}名学员未加入任何班级",
+    filterName: "仅显示已开课乐团学员",
     isError: true,
-    url: '/main/notClassStudent',
-    permission: '/notClassStudent',
+    url: "/main/notClassStudent",
+    permission: "/notClassStudent",
     always: true,
     query: {
-      hasCourse: 'true'
+      hasCourse: "true"
     }
   },
 
   STUDENT_ERROR_LEAVE: {
-    name: '学员异常请假',
+    name: "学员异常请假",
     isError: true,
-    url: '/main/studentLeaveList',
-    permission: '/studentLeaveList',
-    always: true,
+    url: "/main/studentLeaveList",
+    permission: "/studentLeaveList",
+    always: true
   },
   STUDENT_ARREARAGE: {
-    name: '已排课未缴费学员数',
+    name: "已排课未缴费学员数",
     isError: true,
-    url: '/studentManager/ArrearageStudents',
-    permission: '/ArrearageStudents',
+    url: "/studentManager/ArrearageStudents",
+    permission: "/ArrearageStudents",
     always: true,
     query: {
-      hasCourse: 'true'
+      hasCourse: "true"
     }
   },
   STUDENT_NOT_PAYMENT: {
-    name: '未排课未缴费学员数',
+    name: "未排课未缴费学员数",
     isError: true,
-    url: '/studentManager/ArrearageStudents',
-    permission: '/ArrearageStudents',
+    url: "/studentManager/ArrearageStudents",
+    permission: "/ArrearageStudents",
     always: true,
     query: {
-      hasCourse: 'false'
+      hasCourse: "false"
     }
   },
   STUDENT_APPLY_FOR_QUIT_MUSIC_GROUP: {
-    name: '申请退团学员数',
+    name: "申请退团学员数",
     isError: true,
-    url: '/journal/WithdrawalApplication',
-    permission: '/WithdrawalApplication',
+    url: "/journal/WithdrawalApplication",
+    permission: "/WithdrawalApplication",
     always: true,
     query: {
-      visitFlag: '0',
-    },
+      visitFlag: "0"
+    }
   },
   COOPERATION_PAYMENT_ERROR: {
-    name: '合作单位回款异常',
+    name: "合作单位回款异常",
     isError: true,
-    url: '/branchPayManager',
-    permission: '/branchPayManager',
+    url: "/branchPayManager",
+    permission: "/branchPayManager",
     always: true,
     query: {
-      searchType: 'COOPERATION_PAYMENT_ERROR',
-    },
+      searchType: "COOPERATION_PAYMENT_ERROR"
+    }
   },
   COOPERATION_PAYMENT_ALERT: {
-    name: '合作单位回款提醒',
+    name: "合作单位回款提醒",
     isError: true,
-    url: '/branchPayManager',
-    permission: '/branchPayManager',
+    url: "/branchPayManager",
+    permission: "/branchPayManager",
     always: true,
     query: {
-      searchType: 'COOPERATION_PAYMENT_ALERT',
-    },
+      searchType: "COOPERATION_PAYMENT_ALERT"
+    }
   },
   // WAIT_CREATE_PAYMENT_CALENDER: {
   //   name: '待创建缴费项目',
@@ -258,182 +278,197 @@ export const errorType = {
   //   }
   // },
   COURSE_TRUANT_STUDENT_NUM: {
-    name: '学员考勤异常旷课',
+    name: "学员考勤异常旷课",
     isError: true,
-    url: '/stuRecodeManager',
-    permission: '/stuRecodeManager',
+    url: "/stuRecodeManager",
+    permission: "/stuRecodeManager",
     always: true,
     query: {
-      visitFlag: '0',
-      status: 'TRUANT',
-      ...dates,
+      visitFlag: "0",
+      status: "TRUANT",
+      ...dates
     }
   },
   COURSE_LEAVE_STUDENT_NUM: {
-    name: '学员请假',
+    name: "学员请假",
     isError: true,
-    url: '/stuRecodeManager',
-    permission: '/stuRecodeManager',
+    url: "/stuRecodeManager",
+    permission: "/stuRecodeManager",
     always: true,
     query: {
       visitFlag: 0,
-      status: 'LEAVE',
-      ...dates,
+      status: "LEAVE",
+      ...dates
     }
   },
   TEACHER_EXCEPTION_ATTENDANCE: {
-    name: '老师考勤异常',
+    name: "老师考勤异常",
     isError: true,
     always: true,
-    url: '/teamCourseList',
-    permission: '/teamCourseList',
+    url: "/teamCourseList",
+    permission: "/teamCourseList",
     query: {
-      searchType: 'TEACHER_ERR_ATTENDANCE',
+      searchType: "TEACHER_ERR_ATTENDANCE",
       ...dates,
-      start: dayjs().subtract(1, 'month').set('date', 1).format('YYYY-MM-DD'),
-    },
+      start: dayjs()
+        .subtract(1, "month")
+        .set("date", 1)
+        .format("YYYY-MM-DD")
+    }
   },
   STUDENT_EXCEPTION_ATTENDANCE: {
-    name: '学生考勤异常',
+    name: "学生考勤异常",
     isError: true,
     always: true,
-    url: '/teamCourseList',
-    permission: '/teamCourseList',
+    url: "/teamCourseList",
+    permission: "/teamCourseList",
     query: {
-      searchType: 'STUDENT_ERR_ATTENDANCE',
+      searchType: "STUDENT_ERR_ATTENDANCE",
       ...dates,
-      start: dayjs().subtract(1, 'month').set('date', 1).format('YYYY-MM-DD'),
-    },
+      start: dayjs()
+        .subtract(1, "month")
+        .set("date", 1)
+        .format("YYYY-MM-DD")
+    }
   },
-  CURRENT_COURSE_ERROR:{
-    name: '当月排课异常',
+  CURRENT_COURSE_ERROR: {
+    name: "当月排课异常",
     isError: true,
     always: true,
-    url: '/smallCourseConsumption',
-    permission: '/smallCourseConsumption',
+    url: "/smallCourseConsumption",
+    permission: "/smallCourseConsumption",
     query: {
-      searchType: 'CURRENT_COURSE_ERROR',
+      searchType: "CURRENT_COURSE_ERROR",
       ...dates,
-      tabrouter:'2'
-    },
+      tabrouter: "2"
+    }
   },
   //   start: '2021-02-01',  start: '2021-02-01',
   TEACHER_NOT_A_CLASS: {
-    name: '课程异常',
+    name: "课程异常",
     isError: true,
     always: true,
-    url: '/teamCourseList',
-    permission: '/teamCourseList',
+    url: "/teamCourseList",
+    permission: "/teamCourseList",
     query: {
-      searchType: 'NO_ATTENDANCE',
+      searchType: "NO_ATTENDANCE",
       ...dates,
-      start: dayjs().subtract(1, 'month').set('date', 1).format('YYYY-MM-DD'),
-    },
+      start: dayjs()
+        .subtract(1, "month")
+        .set("date", 1)
+        .format("YYYY-MM-DD")
+    }
   },
-  WAIT_RENEW_INFO:{
-    name: '待续费学员',
+  WAIT_RENEW_INFO: {
+    name: "待续费学员",
     isError: false,
     always: true,
-    url: '/studentManager/smallStudentManager',
-    permission: '/smallStudentManager',
+    url: "/studentManager/smallStudentManager",
+    permission: "/smallStudentManager",
 
     query: {
       ...dates,
-      start: dayjs().subtract(1, 'month').set('date', 1).format('YYYY-MM-DD'),
-      subCourseMaxNum:3,
-      studentStatus:'NORMAL'
-    },
+      start: dayjs()
+        .subtract(1, "month")
+        .set("date", 1)
+        .format("YYYY-MM-DD"),
+      subCourseMaxNum: 3,
+      studentStatus: "NORMAL"
+    }
   },
   TEACHER_LEAVE: {
-    name: '老师请假',
+    name: "老师请假",
     isError: false,
-    url: '/journal/journal',
-    permission: '/leaveOperation',
-    resultKey: 'search',
+    url: "/journal/journal",
+    permission: "/leaveOperation",
+    resultKey: "search",
     query: {
-      tabrouter: 'LEAVE'
+      tabrouter: "LEAVE"
     }
   },
   TEACHER_EXPECT_SALARY_BE_LOW: {
-    name: '预计课酬较低',
+    name: "预计课酬较低",
     isError: false,
-    url: '/operateManager/operationalList',
-    permission: '/operationalList',
+    url: "/operateManager/operationalList",
+    permission: "/operationalList",
     always: true,
     query: {
       lowSalary: 1
     }
   },
   INSPECTION_ITEM: {
-    name: '乐团巡查任务未计划',
+    name: "乐团巡查任务未计划",
     isError: true,
     always: true,
-    url: '/workbench',
-    permission: '/workbench',
-    resultKey: 'ids',
+    url: "/workbench",
+    permission: "/workbench",
+    resultKey: "ids",
     query: {
-      tabrouter: 'teamSchedule',
-      searchType: 'INSPECTION_ITEM',
-      start:dayjs().subtract(1, 'month').set('date', 1).format('YYYY-MM'),
-      end:dayjs().format('YYYY-MM')
-    },
+      tabrouter: "teamSchedule",
+      searchType: "INSPECTION_ITEM",
+      start: dayjs()
+        .subtract(1, "month")
+        .set("date", 1)
+        .format("YYYY-MM"),
+      end: dayjs().format("YYYY-MM")
+    }
   },
   INSPECTION_ITEM_PLAN: {
-    name: '乐团巡查任务未提交',
+    name: "乐团巡查任务未提交",
     isError: true,
-    url: '/musicInspection',
-    permission: '/musicInspection',
+    url: "/musicInspection",
+    permission: "/musicInspection",
     always: true,
     query: {
-      searchType: 'INSPECTION_ITEM_PLAN',
+      searchType: "INSPECTION_ITEM_PLAN",
       ...dates
-    },
+    }
   },
   STUDENT_VISIT: {
-    name: '回访任务未完成',
+    name: "回访任务未完成",
     isError: true,
-    url: '/workbench',
-    permission: '/workbench',
+    url: "/workbench",
+    permission: "/workbench",
     always: true,
     query: {
-      tabrouter: 'teamSchedule',
-      searchType: 'STUDENT_VISIT',
+      tabrouter: "teamSchedule",
+      searchType: "STUDENT_VISIT",
       ...dates
-    },
+    }
   },
   TEACHER_SERVE_ERROR: {
-    name: '服务指标异常',
+    name: "服务指标异常",
     isError: true,
     always: true,
-    url: '/serverIndexManager/serverDetail',
-    permission: '/serverDetail',
+    url: "/serverIndexManager/serverDetail",
+    permission: "/serverDetail",
     query: {
-      searchType: 'TEACHER_SERVE_ERROR',
+      searchType: "TEACHER_SERVE_ERROR",
       unDone: 1,
       reminded: 0
-    },
+    }
   },
-  MUSIC_GROUP_HAS_COURSE_TIMES:{
-    name: '乐团剩余时长未排课',
+  MUSIC_GROUP_HAS_COURSE_TIMES: {
+    name: "乐团剩余时长未排课",
     isError: true,
-    url: '/teamList',
-    permission: '/teamList',
+    url: "/teamList",
+    permission: "/teamList",
     query: {
-      searchType: 'MUSIC_GROUP_HAS_COURSE_TIMES'
+      searchType: "MUSIC_GROUP_HAS_COURSE_TIMES"
     }
   },
   HAS_FREE_COURSE_TIMES: {
-    name: '排课时长消耗异常',
+    name: "排课时长消耗异常",
     isError: true,
-    url: '/hasfreeCourse',
-    permission: '/hasfreeCourse',
-    always: true,
-  },
-}
+    url: "/hasfreeCourse",
+    permission: "/hasfreeCourse",
+    always: true
+  }
+};
 
 export const matterTypes = {
-  INSPECT: '下校巡查',
-  VISIT: '学员回访',
-}
+  INSPECT: "下校巡查",
+  VISIT: "学员回访"
+};
 
-export const chioseNum = 31
+export const chioseNum = 31;

+ 16 - 13
src/views/main/index.vue

@@ -4,9 +4,12 @@
       <div class="squrt"></div>
       工作台
       <filter-search
-        v-if="$route.query.tabrouter === 'teamSchedule'&&permission('/teamSchedule/abnormal')"
+        v-if="
+          $route.query.tabrouter === 'teamSchedule' &&
+            permission('/teamSchedule/abnormal')
+        "
         :keys="['searchType']"
-        :moreKeys="['organId','start','end']"
+        :moreKeys="['organId', 'start', 'end']"
         @reload="reloadItem"
       />
     </h2>
@@ -20,14 +23,14 @@
         >
           <baseinfo v-if="activeKey === 'baseinfo'" />
         </el-tab-pane>
-        <el-tab-pane
+        <!-- <el-tab-pane
           v-if="permission('/cloudDate')"
           lazy
           label="云教练数据"
           name="cloudDate"
         >
-         <cloudDate v-if="activeKey === 'cloudDate'" />
-        </el-tab-pane>
+          <cloudDate v-if="activeKey === 'cloudDate'" />
+        </el-tab-pane> -->
         <el-tab-pane v-if="permission('/getIndexErrData')" lazy name="abnormal">
           <el-badge
             slot="label"
@@ -78,7 +81,7 @@ import abnormal from "./abnormal";
 import teamSchedule from "./teamSchedule";
 import ScheduleBranch from "./schedule-branch";
 import reminders from "./reminders";
-import cloudDate from './cloudDate'
+import cloudDate from "./cloudDate";
 export default {
   name: "Main",
   components: {
@@ -91,7 +94,7 @@ export default {
   },
   data() {
     return {
-      activeKey: "",
+      activeKey: ""
     };
   },
   mounted() {
@@ -100,7 +103,7 @@ export default {
   computed: {
     status() {
       return this.$store.state.app.status || {};
-    },
+    }
   },
   watch: {
     "$route.query"(newValue, oldValue) {
@@ -108,7 +111,7 @@ export default {
         this.$forceUpdate();
         this.$store.dispatch("app/setDotStatus");
       }
-    },
+    }
   },
   methods: {
     permission,
@@ -116,7 +119,7 @@ export default {
       this.activeKey = val;
     },
     __init() {
-      getIndex().then((res) => {
+      getIndex().then(res => {
         if (res.code == 200) {
           // this.dataInfo = res.data
           let md = res.data.musicDatas || {},
@@ -139,7 +142,7 @@ export default {
               (dd.booked_num_ ? dd.booked_num_ : 0) +
               (dd.unbooked_num_ ? dd.unbooked_num_ : 0),
             booked_num_: dd.booked_num_ >= 0 ? dd.booked_num_ : "--",
-            unbooked_num_: dd.unbooked_num_ >= 0 ? dd.unbooked_num_ : "--",
+            unbooked_num_: dd.unbooked_num_ >= 0 ? dd.unbooked_num_ : "--"
           };
           this.dataInfo = Object.assign(res.data, tempDate);
         }
@@ -149,8 +152,8 @@ export default {
       if (this.$refs.teamSchedule) {
         this.$refs.teamSchedule.getList();
       }
-    },
-  },
+    }
+  }
 };
 </script>
 <style lang="scss" scope>

+ 73 - 67
src/views/reportForm/index.vue

@@ -10,9 +10,9 @@
           name="1"
           v-if="
             $helpers.permission('export/musicGroupRegister') ||
-            $helpers.permission('export/musicGroupNormalStudentNum') ||
-            $helpers.permission('export/exportStudentAttendances') ||
-            $helpers.permission('export/cloudStudyStudentTrainData')
+              $helpers.permission('export/musicGroupNormalStudentNum') ||
+              $helpers.permission('export/exportStudentAttendances') ||
+              $helpers.permission('export/cloudStudyStudentTrainData')
           "
         >
           <template slot="title">
@@ -144,7 +144,7 @@
               start-placeholder="上课开始日期"
               end-placeholder="上课结束日期"
               :picker-options="{
-                firstDayOfWeek: 1,
+                firstDayOfWeek: 1
               }"
             ></el-date-picker>
             <!-- <el-button
@@ -190,7 +190,7 @@
               start-placeholder="开始日期"
               end-placeholder="结束日期"
               :picker-options="{
-                firstDayOfWeek: 1,
+                firstDayOfWeek: 1
               }"
             ></el-date-picker>
             <!-- <el-button
@@ -213,16 +213,16 @@
           name="2"
           v-if="
             $helpers.permission('export/teacherDefaultSalary') ||
-            $helpers.permission('export/studentOrder') ||
-            $helpers.permission('studentInstrument/export') ||
-            $helpers.permission('export/studentVipPractice') ||
-            $helpers.permission('export/exercisesSituation') ||
-            $helpers.permission('export/exportIndexErrData') ||
-            $helpers.permission('export/exportMusicGroupCourseList') ||
-            $helpers.permission('export/EXPORT_INDEX_HISTORY_ERR_DATA') ||
-            $helpers.permission('export/EXPORT_STUDENT_SUBCOURSE') ||
-            $helpers.permission('export/EXPORT_TRAINING_STATISTICS') ||
-            $helpers.permission('export/EXPORT_OPERATING_VISIT_STATISTICS')
+              $helpers.permission('export/studentOrder') ||
+              $helpers.permission('studentInstrument/export') ||
+              $helpers.permission('export/studentVipPractice') ||
+              $helpers.permission('export/exercisesSituation') ||
+              $helpers.permission('export/exportIndexErrData') ||
+              $helpers.permission('export/exportMusicGroupCourseList') ||
+              $helpers.permission('export/EXPORT_INDEX_HISTORY_ERR_DATA') ||
+              $helpers.permission('export/EXPORT_STUDENT_SUBCOURSE') ||
+              $helpers.permission('export/EXPORT_TRAINING_STATISTICS') ||
+              $helpers.permission('export/EXPORT_OPERATING_VISIT_STATISTICS')
           "
         >
           <template slot="title">
@@ -446,7 +446,7 @@
               start-placeholder="开始日期"
               end-placeholder="结束日期"
               :picker-options="{
-                firstDayOfWeek: 1,
+                firstDayOfWeek: 1
               }"
             ></el-date-picker>
             <!-- <el-button
@@ -590,7 +590,7 @@
               end-placeholder="结束日期"
               @change="getWeekTime"
               :picker-options="{
-                firstDayOfWeek: 1,
+                firstDayOfWeek: 1
               }"
             ></el-date-picker>
             <el-button
@@ -664,7 +664,7 @@
               end-placeholder="结束日期"
               @change="getStudentWeekTime"
               :picker-options="{
-                firstDayOfWeek: 1,
+                firstDayOfWeek: 1
               }"
             ></el-date-picker>
             <ExportChiose
@@ -708,7 +708,7 @@
               start-placeholder="开始日期"
               end-placeholder="结束日期"
               :picker-options="{
-                firstDayOfWeek: 1,
+                firstDayOfWeek: 1
               }"
             ></el-date-picker>
             <!-- @change="getStudentWeekTime" -->
@@ -768,10 +768,7 @@
               ></i>
             </el-tooltip> -->
           </div>
-          <div
-            class="m-wrap"
-            v-permission="'export/EXPORT_CLOUD_TEACHER_SUM'"
-          >
+          <div class="m-wrap" v-permission="'export/EXPORT_CLOUD_TEACHER_SUM'">
             <div class="title">云教练统计导出:</div>
             <select-all
               v-model.trim="yunOrganId"
@@ -799,7 +796,7 @@
               end-placeholder="结束日期"
               :clearable="false"
               :picker-options="{
-                firstDayOfWeek: 1,
+                firstDayOfWeek: 1
               }"
             ></el-date-picker>
             <!-- @change="getStudentWeekTime" -->
@@ -817,8 +814,8 @@
           name="3"
           v-if="
             $helpers.permission('export/teacherSalary') ||
-            $helpers.permission('export/userCoursesAccount/4388') ||
-            $helpers.permission('export/userCashAccountDetail/4389')
+              $helpers.permission('export/userCoursesAccount/4388') ||
+              $helpers.permission('export/userCashAccountDetail/4389')
           "
         >
           <template slot="title">
@@ -940,7 +937,7 @@
               start-placeholder="开始日期"
               end-placeholder="结束日期"
               :picker-options="{
-                firstDayOfWeek: 1,
+                firstDayOfWeek: 1
               }"
             ></el-date-picker>
             <!-- <el-button
@@ -987,7 +984,7 @@
               start-placeholder="开始日期"
               end-placeholder="结束日期"
               :picker-options="{
-                firstDayOfWeek: 1,
+                firstDayOfWeek: 1
               }"
             ></el-date-picker>
             <!-- <el-button
@@ -1064,7 +1061,7 @@ import load from "@/utils/loading";
 export default {
   name: "reportForm",
   components: {
-    ExportChiose,
+    ExportChiose
   },
   data() {
     return {
@@ -1091,7 +1088,7 @@ export default {
       serviceOrganId: [], // 服务报表
       serviceTimer: [],
       Abnormal: {
-        organIds: [],
+        organIds: []
       },
       activeName: ["1", "2", "3", "4"],
       vipStudentCourseOrganId: [],
@@ -1107,8 +1104,13 @@ export default {
       visitmouth: "",
       operatingMouth: "",
       cloudTimer: [],
-      yunOrganId:[],
-      yunTimer:[dayjs().set('date', 1).format('YYYY-MM-DD'),dayjs().format('YYYY-MM-DD')]
+      yunOrganId: [],
+      yunTimer: [
+        dayjs()
+          .set("date", 1)
+          .format("YYYY-MM-DD"),
+        dayjs().format("YYYY-MM-DD")
+      ]
     };
   },
   mounted() {
@@ -1200,29 +1202,29 @@ export default {
         method: "POST",
         headers: {
           Authorization: getToken(),
-          tenantId: getTenantId(),
+          tenantId: getTenantId()
         },
         data: qs.stringify(cleanDeep(data)),
         url,
-        responseType: "blob",
+        responseType: "blob"
       };
       this.$confirm("您确定导出招生情况汇总表", "提示", {
         confirmButtonText: "确定",
         cancelButtonText: "取消",
-        type: "warning",
+        type: "warning"
       })
         .then(() => {
           load.startLoading();
           axios(options)
-            .then((res) => {
+            .then(res => {
               let blob = new Blob([res.data], {
                 // type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=utf-8'
-                type: "application/vnd.ms-excel;charset=utf-8",
+                type: "application/vnd.ms-excel;charset=utf-8"
                 //word文档为application/msword,pdf文档为application/pdf,application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=utf-8
               });
 
               let text = new Response(blob).text();
-              text.then((res) => {
+              text.then(res => {
                 // 判断是否报错
                 if (res.indexOf("code") != -1) {
                   let json = JSON.parse(res);
@@ -1255,7 +1257,7 @@ export default {
               });
               load.endLoading();
             })
-            .catch((error) => {
+            .catch(error => {
               this.$message.error("导出数据失败,请联系管理员");
               load.endLoading();
             });
@@ -1341,29 +1343,29 @@ export default {
         method: "POST",
         headers: {
           Authorization: getToken(),
-          tenantId: getTenantId(),
+          tenantId: getTenantId()
         },
         data: qs.stringify(cleanDeep(data)),
         url,
-        responseType: "blob",
+        responseType: "blob"
       };
       this.$confirm("您确定导出乐团在读人数", "提示", {
         confirmButtonText: "确定",
         cancelButtonText: "取消",
-        type: "warning",
+        type: "warning"
       })
         .then(() => {
           load.startLoading();
           axios(options)
-            .then((res) => {
+            .then(res => {
               let blob = new Blob([res.data], {
                 // type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=utf-8'
-                type: "application/vnd.ms-excel;charset=utf-8",
+                type: "application/vnd.ms-excel;charset=utf-8"
                 //word文档为application/msword,pdf文档为application/pdf,application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=utf-8
               });
 
               let text = new Response(blob).text();
-              text.then((res) => {
+              text.then(res => {
                 // 判断是否报错
                 if (res.indexOf("code") != -1) {
                   let json = JSON.parse(res);
@@ -1396,7 +1398,7 @@ export default {
               });
               load.endLoading();
             })
-            .catch((error) => {
+            .catch(error => {
               this.$message.error("导出数据失败,请联系管理员");
               load.endLoading();
             });
@@ -1536,7 +1538,7 @@ export default {
           url: "/api-web/questionnaireUserResult/export",
           fileName: "问卷调查.xls",
           method: "get",
-          params: { activeType: this.questionActiveType },
+          params: { activeType: this.questionActiveType }
         },
         "您确定导出问卷调查?"
       );
@@ -1804,7 +1806,7 @@ export default {
     exportMusicGroup() {
       let params = {
         ...getTimes(this.teamTimer, ["startTime", "endTime"]),
-        organId: this.teamOrganId.join(","),
+        organId: this.teamOrganId.join(",")
       };
 
       Export(
@@ -1813,12 +1815,12 @@ export default {
           method: "post",
           url: "/api-web/export/exportMusicGroupCourseList",
           params: this.$helpers.qs.stringify({
-            ...params,
-          }),
+            ...params
+          })
         },
         "是否确认导出报表?"
       );
-    },
+    }
   },
   computed: {
     exportAttendance() {
@@ -1834,7 +1836,7 @@ export default {
         organId: this.attendanceOrganId.join(","),
         groupType: this.attendanceCourseType,
         classStartDate,
-        classEndDate,
+        classEndDate
       };
     },
     exportTrain() {
@@ -1847,8 +1849,12 @@ export default {
         cloudTeacherTrainEndDate = null;
       }
 
-      let obj = { organId: this.trainOrganId,cloudTeacherTrainStartDate, cloudTeacherTrainEndDate};
-      console.log(obj,'exportTrain')
+      let obj = {
+        organId: this.trainOrganId,
+        cloudTeacherTrainStartDate,
+        cloudTeacherTrainEndDate
+      };
+      console.log(obj, "exportTrain");
       return obj;
     },
     exportDefaultSalary() {
@@ -1878,19 +1884,19 @@ export default {
       //   return;
       // }
       let data = {
-        organId: this.vipOrganId.join(","),
+        organId: this.vipOrganId.join(",")
       };
       return data;
     },
     exportVipStudent() {
       let data = {
-        organId: this.VipStudentOrganId.join(","),
+        organId: this.VipStudentOrganId.join(",")
       };
       return data;
     },
     exportActive() {
       let data = {
-        organId: this.activeOrganId.join(","),
+        organId: this.activeOrganId.join(",")
       };
       return data;
     },
@@ -1907,7 +1913,7 @@ export default {
       return {
         monday,
         sunday,
-        organId: this.studentServerOrganId.join(","),
+        organId: this.studentServerOrganId.join(",")
       };
     },
 
@@ -1923,13 +1929,13 @@ export default {
       return {
         monday: monday,
         sunday: sunday,
-        organId: this.serviceOrganId.join(","),
+        organId: this.serviceOrganId.join(",")
       };
     },
     exportAbnormal() {
       console.log(this.Abnormal);
       return {
-        organIds: this.Abnormal.organIds.join(","),
+        organIds: this.Abnormal.organIds.join(",")
       };
     },
     exportSalar() {
@@ -1962,7 +1968,7 @@ export default {
       return {
         startTime: startTime,
         endTime: endTime,
-        organId: this.AccountOrganId.join(","),
+        organId: this.AccountOrganId.join(",")
       };
     },
 
@@ -1978,10 +1984,10 @@ export default {
       return {
         startDate: startTime,
         endDate: endTime,
-        organId: this.trainingOrganId.join(","),
+        organId: this.trainingOrganId.join(",")
       };
     },
-    exporyun(){
+    exporyun() {
       let endTime, startTime;
       if (this.yunTimer && this.yunTimer.length > 1) {
         startTime = this.yunTimer[0];
@@ -1993,7 +1999,7 @@ export default {
       return {
         startDate: startTime,
         endDate: endTime,
-        organId: this.yunOrganId.join(","),
+        organId: this.yunOrganId.join(",")
       };
     },
     exportDetailAccount() {
@@ -2008,10 +2014,10 @@ export default {
       return {
         startTime: startTime,
         endTime: endTime,
-        organId: this.AccountDetailOrganId.join(","),
+        organId: this.AccountDetailOrganId.join(",")
       };
-    },
-  },
+    }
+  }
   // AccountDetailTimer
 };
 </script>