Bläddra i källkod

Merge branch '03/08IndexAtten' into online

mo 4 år sedan
förälder
incheckning
0c9af19116

+ 3 - 1
src/components/remote-search/index.vue

@@ -31,7 +31,8 @@
 <script>
 const placeholder = {
   setTeachers: "请选择老师",
-  setEducations: "请选乐团主管"
+  setEducations: "请选乐团主管",
+  setEmploys:"请选择操作人"
 };
 import { throttle, slice, uniqBy } from "lodash";
 import selects from "@/store/modules/selects";
@@ -131,6 +132,7 @@ export default {
       return {
         setTeachers: "teachers",
         setEducations: "educations",
+        setEmploys:'employs'
       };
     },
   },

+ 2 - 0
src/router/index.js

@@ -382,6 +382,8 @@ export const asyncRoutes = {
   WithdrawalApplication:()=>import('@/views/withdrawal-application'),
   // 欠费学员列表
   ArrearageStudents: () => import('@/views/arrearage-students'),
+  // 服务指标明细
+  serverDetail:()=>import('@/views/serverDetail')
 }
 
 export default router

+ 2 - 1
src/router/notKeepAliveList.js

@@ -97,6 +97,7 @@ export default [
   '/business/auditFailed',
   '/business/resetTeaming', // 进行中修改
   '/business/teacherOperationUpdate',
-  '/business/ArrearageStudents'
+  '/business/ArrearageStudents',
+  '/operateManager/serverDetail', // 服务指标明细
   // '/business/feeAudit',
 ]

+ 3 - 2
src/store/modules/app.js

@@ -15,6 +15,7 @@ const state = {
     musicPatrol: false,
     studentInfo: false,
     teacherInfo: false,
+    attendanceServe:false
   },
 }
 
@@ -38,10 +39,10 @@ const mutations = {
     state.device = device
   },
   COMMIT_DOT_STATUS: (state, status) => {
-    const { musicPatrol, studentInfo, teacherInfo } = status
+    const { musicPatrol, studentInfo, teacherInfo,attendanceServe } = status
     state.status = {
       ...status,
-      indexErrData: musicPatrol || studentInfo || teacherInfo
+      indexErrData: musicPatrol || studentInfo || teacherInfo || attendanceServe
     }
     toggleDot(state.status)
   }

+ 25 - 2
src/store/modules/selects.js

@@ -1,7 +1,7 @@
 /* eslint-disable no-empty */
 // import { branchQueryPage } from '@/api/specialSetting'
 import { getSubject, getTeacher,findEducationUsers,getEmployeeOrgan } from '@/api/buildTeam'
-import { getSchool } from '@/api/systemManage'
+import { getSchool,queryEmployByOrganId } from '@/api/systemManage'
 import { vipGroupCategory } from "@/api/vipSeting"
 import { findTechnician } from '@/api/repairManager'
 
@@ -26,7 +26,8 @@ export default {
     schools: [],
     vipGroupCategory: [],
     educations:[],
-    technician: []
+    technician: [],
+    employs:[],
   },
   mutations: {
     commit_branchs: (state, branchs) => {
@@ -57,6 +58,17 @@ export default {
     },
     commit_technician: (state, technician) => {
       state.technician = technician
+    },
+    commit_employs:(state,employs)=>{
+      state.employs = employs.map(emloys=>{
+        return {
+          ...emloys,
+          id:emloys.id,
+          userId:emloys.id,
+          userName:emloys.realName,
+          realName:emloys.realName
+        }
+      })
     }
   },
   actions: {
@@ -131,6 +143,17 @@ export default {
         loadings.commit_technician = false
       }
 
+    },
+    async setEmploys({commit,state},force){
+      if ((!state.employs.length || force === true) && !loadings.commit_employs) {
+        loadings.commit_employs = queryEmployByOrganId({rows:99999})
+        try {
+          const res = await loadings.commit_employs
+          commit('commit_employs', res.data.rows)
+        } catch (error) {}
+        loadings.commit_employs = false
+      }
+
     }
   }
 }

+ 10 - 1
src/views/main/abnormal/index.vue

@@ -110,11 +110,15 @@ export default {
           name: '日常行政',
           num: status.teacherInfo || false,
         },
+        ATTENDANCE_SERVE:{
+          name:'考勤及服务',
+          num: status.attendanceServe || false,
+        }
       }
     },
     permissionTags() {
       const url = 'getIndexErrData?errorType='
-      const permissions = ['MUSIC_PATROL', 'STUDENT_INFO', 'TEACHER_INFO']
+      const permissions = ['MUSIC_PATROL', 'STUDENT_INFO', 'TEACHER_INFO','ATTENDANCE_SERVE']
       return permissions.filter(item => {
         return this.permission(url + item)
       })
@@ -134,6 +138,7 @@ export default {
       return tags
     },
     activeList() {
+
       const list = this.listByType[this.activeKey] || []
       return list
     },
@@ -167,9 +172,11 @@ export default {
       this.FetchList()
     },
     formatData(data) {
+      console.log(data,'格式化方法')
       const list = {}
       for (const item of data) {
         const row = errorType[item.errorType] || {}
+        console.log(row)
         const key = row.parent || item.errorType
         if (!list[key]) {
           list[key] = []
@@ -180,7 +187,9 @@ export default {
             ...row,
           }
         )
+
       }
+       console.log(list)
       return Object.values(list)
     },
     async FetchList() {

+ 0 - 3
src/views/main/baseinfo/modals/searchHeader.vue

@@ -51,10 +51,8 @@
 </template>
 <script>
 import {
-
   getNowDateAndSunday,
   getNowDateAndMonday,
-
 } from "@/utils/date";
 export default {
   props:['title','dates','isShowQuert'],
@@ -67,7 +65,6 @@ export default {
   methods: {
     changeWeek(val){
       this.date = [getNowDateAndMonday(val[0]),getNowDateAndSunday(val[1])]
-      console.log( this.date)
        this.submitDate( this.date)
     },
     changeValue(val) {

+ 40 - 31
src/views/main/constant.js

@@ -1,37 +1,37 @@
 import dayjs from 'dayjs'
 
 export const descs = {
-  STUDENT_REGISTRATION_NUM:'截止到昨日,系统注册学员总数',
-  CHARGE_STUDENT_CHANGE_RATE:'截止到昨日,在册学员付费率(有订单交易成功的都算,导入的也算)',
-  ACTIVATION_RATE:'截止到昨日,筹备中&进行中乐团在读学员和有VIP或网管课学员激活率',
-  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课时:截止到昨日,系统中【已结束】&【已结算】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/网管课付费学员总数'
+  STUDENT_REGISTRATION_NUM: '截止到昨日,系统注册学员总数',
+  CHARGE_STUDENT_CHANGE_RATE: '截止到昨日,在册学员付费率(有订单交易成功的都算,导入的也算)',
+  ACTIVATION_RATE: '截止到昨日,筹备中&进行中乐团在读学员和有VIP或网管课学员激活率',
+  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课时:截止到昨日,系统中【已结束】&【已结算】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/网管课付费学员总数'
 }
 
 const dates = {
@@ -175,6 +175,15 @@ export const errorType = {
       ...dates
     },
   },
+  TEACHER_SERVE_ERROR: {
+    name: '服务指标异常',
+    isError: true,
+    always: true,
+    url: '/operateManager/serverDetail',
+    query: {
+      searchType: 'TEACHER_SERVE_ERROR',
+    },
+  }
 }
 
 export const matterTypes = {

+ 26 - 0
src/views/serverDetail/api.js

@@ -0,0 +1,26 @@
+import request2 from '@/utils/request2'
+
+export const getTeacherServeInfo = data => request2({
+  url: '/api-web/exercisesSituation/queryTeacherServeInfo',
+  params: data,
+  method: 'get',
+})
+
+// exercisesSituation/teacherServeRemindPush
+export const teacherServeRemindPush = data => request2({
+  url: '/api-web/exercisesSituation/teacherServeRemindPush',
+  data: data,
+  method: 'post',
+})
+
+export const getTeacherServeHomeworkDetail = data => request2({
+  url: '/api-web/exercisesSituation/queryTeacherServeHomeworkDetail',
+  params: data,
+  method: 'get',
+})
+
+export const getTeacherServeExtraDetail = data => request2({
+  url: '/api-web/exercisesSituation/queryTeacherServeExtraDetail',
+  params: data,
+  method: 'get',
+})

+ 125 - 0
src/views/serverDetail/conponent/afterWork.vue

@@ -0,0 +1,125 @@
+<template>
+  <div>
+    <el-table
+      style="width: 100%"
+      :header-cell-style="{ background: '#EDEEF0', color: '#444' }"
+      :data="tableList"
+    >
+      <el-table-column
+        align="center"
+        prop="id"
+        label="课程编号"
+      ></el-table-column>
+      <el-table-column
+        align="center"
+        prop="name"
+        label="服务课程"
+      ></el-table-column>
+      <el-table-column
+        align="center"
+        prop="groupType"
+        label="课程类型"
+      >
+      <template slot-scope="scope">
+        <div>
+          {{scope.row.groupType | coursesType}}
+        </div>
+      </template>
+      </el-table-column>
+      <el-table-column
+        align="center"
+        prop="studentNum"
+        label="学员数量"
+      ></el-table-column>
+      <el-table-column
+        align="center"
+        prop="subjectName"
+        label="专业"
+      ></el-table-column>
+      <el-table-column
+        align="center"
+        prop="status"
+        label="课程状态"
+      >
+      <template slot-scope="scope">
+        <div>
+          {{scope.row.status | coursesStatus}}
+        </div>
+      </template>
+      </el-table-column>
+      <el-table-column
+        align="center"
+        prop="homeworkExist"
+        label="是否布置作业"
+      >
+      <template slot-scope="scope">
+        <div>
+          {{scope.row.homeworkExist?'是':'否'}}
+        </div>
+      </template>
+      </el-table-column>
+    </el-table>
+    <pagination
+      sync
+      :total.sync="rules.total"
+      :page.sync="rules.page"
+      :limit.sync="rules.limit"
+      :page-sizes="rules.page_size"
+      @pagination="getList"
+    />
+  </div>
+</template>
+<script>
+import pagination from "@/components/Pagination/index";
+import { getTeacherServeHomeworkDetail } from "../api";
+export default {
+  components: { pagination },
+  props: ["detail"],
+  data() {
+    return {
+      tableList: [],
+      rules: {
+        // 分页规则
+        limit: 10, // 限制显示条数
+        page: 1, // 当前页
+        total: 0, // 总条数
+        page_size: [10, 20, 40, 50], // 选择限制显示条数
+      },
+    };
+  },
+  mounted() {
+    // 获取分部
+
+    this.init();
+  },
+  methods: {
+    init() {
+      this.getList();
+    },
+    async getList() {
+      console.log(this.detail)
+      try {
+      const dayjs = this.$helpers.dayjs
+     const ruselt =  await getTeacherServeHomeworkDetail({
+          page: this.rules.page,
+          rows: this.rules.limit,
+          monday: dayjs(this.detail.monday).format("YYYY-MM-DD"),
+          sunday: dayjs(this.detail.sunday).format("YYYY-MM-DD"),
+          teacherId:this.detail.teacherId
+        });
+        this.tableList = ruselt.data.rows
+        this.rules.total = ruselt.data.total
+      } catch (e) {
+        console.log(e)
+      }
+    },
+    search() {
+      this.rules.page = 1;
+      this.getList();
+    },
+    onReSet() {},
+  },
+};
+</script>
+<style lang="scss" scoped>
+</style>

+ 97 - 0
src/views/serverDetail/conponent/outWork.vue

@@ -0,0 +1,97 @@
+<template>
+  <div>
+    <el-table
+      style="width: 100%"
+      :header-cell-style="{ background: '#EDEEF0', color: '#444' }"
+      :data="tableList"
+    >
+      <el-table-column
+        align="center"
+        prop="userId"
+        label="学员编号"
+      ></el-table-column>
+      <el-table-column
+        align="center"
+        prop="username"
+        label="学员姓名"
+      ></el-table-column>
+      <el-table-column
+        align="center"
+        prop="subjectNames"
+        label="专业"
+      ></el-table-column>
+      <el-table-column
+        align="center"
+        prop="studentId"
+        label="是否布置作业"
+      >
+       <template slot-scope="scope">
+        <div>
+          {{scope.row.homeworkExist?'是':'否'}}
+        </div>
+      </template>
+      </el-table-column>
+    </el-table>
+    <pagination
+      sync
+      :total.sync="rules.total"
+      :page.sync="rules.page"
+      :limit.sync="rules.limit"
+      :page-sizes="rules.page_size"
+      @pagination="getList"
+    />
+  </div>
+</template>
+<script>
+import pagination from "@/components/Pagination/index";
+import { getTeacherServeExtraDetail } from "../api";
+export default {
+  props:['detail'],
+    components:{pagination},
+  data() {
+    return {
+       tableList:[],
+      rules: {
+        // 分页规则
+        limit: 10, // 限制显示条数
+        page: 1, // 当前页
+        total: 0, // 总条数
+        page_size: [10, 20, 40, 50], // 选择限制显示条数
+      },
+    };
+  },
+  mounted() {
+    // 获取分部
+    this.init();
+  },
+  methods: {
+    init() {
+      this.getList()
+    },
+    async getList() {
+      console.log(this.detail)
+      try {
+      const dayjs = this.$helpers.dayjs
+     const ruselt =  await getTeacherServeExtraDetail({
+          page: this.rules.page,
+          rows: this.rules.limit,
+          monday: dayjs(this.detail.monday).format("YYYY-MM-DD"),
+          sunday: dayjs(this.detail.sunday).format("YYYY-MM-DD"),
+          teacherId:this.detail.teacherId
+        });
+        this.tableList = ruselt.data.rows
+        this.rules.total = ruselt.data.total
+      } catch (e) {
+        console.log(e)
+      }
+    },
+    search() {
+      this.rules.page = 1;
+      this.getList();
+    },
+    onReSet() {},
+  },
+};
+</script>
+<style lang="scss" scoped>
+</style>

+ 26 - 0
src/views/serverDetail/conponent/serverMask.vue

@@ -0,0 +1,26 @@
+<template>
+  <div>
+    <el-tabs v-model="activeName">
+      <el-tab-pane label="课后作业" name="first" lazy ><afterWork v-if="activeName=='first'" v-permission="'exercisesSituation/queryTeacherServeHomeworkDetail'" :detail='detail' /></el-tab-pane>
+      <el-tab-pane label="课外训练" name="second" lazy ><outWork  v-if="activeName=='second'" v-permission="'exercisesSituation/queryTeacherServeExtraDetail'" :detail='detail' /> </el-tab-pane>
+    </el-tabs>
+  </div>
+</template>
+<script>
+import afterWork from './afterWork'
+import outWork from './outWork'
+export default {
+  props:['detail'],
+  components:{afterWork,outWork},
+  data() {
+    return {
+      activeName: "first",
+    };
+  },
+  mounted(){
+    console.log(this.detail)
+  }
+};
+</script>
+<style lang="scss" scoped>
+</style>

+ 355 - 0
src/views/serverDetail/index.vue

@@ -0,0 +1,355 @@
+<!--  -->
+<template>
+  <div class="m-container">
+    <h2>
+      <div class="squrt"></div>
+      服务指标明细<filter-search
+        ref="filterSearch"
+        @reload="reloadSearch"
+        :keys="['searchType']"
+        :moreKeys="['organId']"
+      />
+    </h2>
+    <div class="m-core">
+      <save-form
+        :inline="true"
+        :model="searchForm"
+        @submit="search"
+        @reset="onReSet"
+        ref="form"
+      >
+        <el-form-item prop="organId">
+          <el-select
+            class="multiple"
+            v-model.trim="searchForm.organId"
+            filterable
+            clearable
+            placeholder="请选择分部"
+          >
+            <el-option
+              v-for="(item, index) in selects.branchs"
+              :key="index"
+              :label="item.name"
+              :value="item.id"
+            ></el-option>
+          </el-select>
+        </el-form-item>
+        <el-form-item prop="teacherId">
+          <remote-search
+            :commit="'setTeachers'"
+            v-model="searchForm.teacherId"
+          />
+        </el-form-item>
+        <el-form-item prop="unDone">
+          <el-select
+            class="multiple"
+            v-model.trim="searchForm.unDone"
+            clearable
+            placeholder="是否异常"
+          >
+            <el-option label="是" :value="1"></el-option>
+            <el-option label="否" :value="0"></el-option>
+          </el-select>
+        </el-form-item>
+        <el-form-item prop="reminded">
+          <el-select
+            class="multiple"
+            v-model.trim="searchForm.reminded"
+            clearable
+            placeholder="是否提醒"
+          >
+            <el-option label="是" :value="1"></el-option>
+            <el-option label="否" :value="0"></el-option>
+          </el-select>
+        </el-form-item>
+        <el-form-item prop="operatorId">
+          <remote-search
+            :commit="'setEmploys'"
+            v-model.trim="searchForm.operatorId"
+          />
+        </el-form-item>
+        <el-form-item>
+          <el-date-picker
+            style="width: 410px"
+            v-model.trim="orderDate"
+            type="daterange"
+            value-format="yyyy-MM-dd"
+            range-separator="至"
+            start-placeholder="开始日期"
+            end-placeholder="结束日期"
+            :clearable="false"
+            @change="changeWeek"
+            :picker-options="{ firstDayOfWeek: 1 }"
+          >
+          </el-date-picker>
+        </el-form-item>
+        <el-form-item>
+          <el-button native-type="submit" type="primary">搜索</el-button>
+          <el-button native-type="reset" type="danger">重置</el-button>
+        </el-form-item>
+      </save-form>
+      <div class="btnWraps" style="margin-bottom: 20px">
+        <el-button
+          type="primary"
+          v-permission="'exercisesSituation/teacherServeRemindPush'"
+          @click="remindTeachers"
+          >批量提醒</el-button
+        >
+      </div>
+      <div class="tableWrap">
+        <el-table
+          style="width: 100%"
+          :header-cell-style="{ background: '#EDEEF0', color: '#444' }"
+          :data="tableList"
+          @selection-change="handleSelectionChange"
+        >
+          <el-table-column
+            type="selection"
+            width="55"
+            :selectable="checkSelectable"
+          >
+          </el-table-column>
+          <el-table-column
+            align="center"
+            prop="organName"
+            label="分部"
+          ></el-table-column>
+          <el-table-column
+            align="center"
+            prop="teacherId"
+            label="老师编号"
+          ></el-table-column>
+          <el-table-column
+            align="center"
+            prop="teacherName"
+            label="老师姓名"
+          ></el-table-column>
+          <el-table-column
+            align="center"
+            prop="homeworkNum"
+            label="课后作业(节)"
+          ></el-table-column>
+          <el-table-column
+            align="center"
+            prop="exerciseNum"
+            label="课外作业(人)"
+          ></el-table-column>
+          <el-table-column align="center" prop="studentId" label="是否异常">
+            <template slot-scope="scope">
+              {{ scope.row.unDone ? "是" : "否" }}
+            </template>
+          </el-table-column>
+          <el-table-column
+            align="center"
+            prop="remindDate"
+            label="提醒时间"
+          ></el-table-column>
+          <el-table-column
+            align="center"
+            prop="operatorName"
+            label="操作人"
+          ></el-table-column>
+          <el-table-column align="center" prop="studentId" label="操作">
+            <template slot-scope="scope">
+              <div>
+                <el-button type="text" @click="gotoDteail(scope.row)"
+                  >查看</el-button
+                >
+                <el-button
+                  type="text"
+                  v-if="scope.row.unDone"
+                  v-permission="'exercisesSituation/teacherServeRemindPush'"
+                  @click="remindTeacher(scope.row)"
+                  >提醒老师</el-button
+                >
+              </div>
+            </template>
+          </el-table-column>
+        </el-table>
+        <pagination
+          sync
+          :total.sync="rules.total"
+          :page.sync="rules.page"
+          :limit.sync="rules.limit"
+          :page-sizes="rules.page_size"
+          @pagination="getList"
+        />
+      </div>
+      <el-dialog
+        title="查看"
+        destroy-on-close
+        :close-on-click-modal="false"
+        :visible.sync="lookVisible"
+        v-if="lookVisible"
+      >
+        <serverMask
+          :detail="activeRow"
+          @close="lookVisible = false"
+          @submited="getList"
+        />
+        <span slot="footer" class="dialog-footer">
+          <el-button type="primary" @click="lookVisible = false"
+            >确 定</el-button
+          >
+        </span>
+      </el-dialog>
+    </div>
+  </div>
+</template>
+
+<script>
+import axios from "axios";
+import { getToken } from "@/utils/auth";
+import pagination from "@/components/Pagination/index";
+import serverMask from "./conponent/serverMask";
+import load from "@/utils/loading";
+import { getTeacherServeInfo, teacherServeRemindPush } from "./api";
+import { getTimes } from "@/utils";
+import { getNowDateAndSunday, getNowDateAndMonday } from "@/utils/date";
+export default {
+  components: { pagination, serverMask },
+  data() {
+    return {
+      searchForm: {
+        organId: "",
+        teacherId: "",
+        operatorId: "",
+        reminded: "",
+        unDone: "",
+        operatorId: "",
+      },
+      orderDate: [],
+      tableList: [],
+      organList: [],
+      rules: {
+        // 分页规则
+        limit: 10, // 限制显示条数
+        page: 1, // 当前页
+        total: 0, // 总条数
+        page_size: [10, 20, 40, 50], // 选择限制显示条数
+      },
+      lookVisible: false,
+      activeRow: null,
+      chioseList: [],
+    };
+  },
+  //生命周期 - 创建完成(可以访问当前this实例)
+  created() {},
+  //生命周期 - 挂载完成(可以访问DOM元素)
+  mounted() {
+    // 获取分部
+
+    this.init();
+  },
+  methods: {
+    init() {
+      this.$store.dispatch("setBranchs");
+      this.$store.dispatch("setEmploys");
+      this.getDefaultTime();
+      if (this.$route.query.searchType) {
+        console.log();
+        this.searchForm.organId = this.$route.query.organId * 1 || "";
+        const dayjs = this.$helpers.dayjs;
+        let nowDate = dayjs(new Date()).format("YYYY-MM-DD");
+        this.orderDate = [
+          getNowDateAndMonday(nowDate),
+          getNowDateAndSunday(nowDate),
+        ];
+      }
+
+      this.getList();
+    },
+    async getList() {
+
+      try {
+        const {orderDate, ...rest} = this.searchForm;
+        const result = await getTeacherServeInfo({
+          ...rest,
+          ...getTimes(this.orderDate, ["monday", "sunday"]),
+          rows: this.rules.limit,
+          page: this.rules.page,
+        });
+        this.rules.total = result.data.total;
+        this.tableList = result.data.rows;
+      } catch (e) {}
+    },
+    search() {
+      this.rules.page = 1;
+      this.getList();
+    },
+    onReSet() {
+      this.$refs.form.resetFields();
+      this.getDefaultTime();
+      this.search();
+    },
+    gotoDteail(row) {
+      this.activeRow = row;
+      this.lookVisible = true;
+    },
+    reloadSearch() {
+      this.getList();
+    },
+    getDefaultTime() {
+      const dayjs = this.$helpers.dayjs;
+      let nowDate = dayjs(new Date()).format("YYYY-MM-DD");
+      let lastWeek = dayjs(nowDate).subtract(1, "week").format("YYYY-MM-DD");
+      this.orderDate = [
+        getNowDateAndMonday(lastWeek),
+        getNowDateAndSunday(nowDate),
+      ];
+    },
+    changeWeek(val) {
+      if (val) {
+        this.orderDate =  [
+          getNowDateAndMonday(val[0]),
+          getNowDateAndSunday(val[1]),
+        ]
+      } else {
+        this.getDefaultTime();
+      }
+    },
+    remindTeacher(row) {
+      this.$confirm("是否给老师发送提醒?", "提示", {
+        confirmButtonText: "确定",
+        cancelButtonText: "取消",
+        type: "warning",
+      }).then(async () => {
+        try {
+          const result = await teacherServeRemindPush([row]);
+          this.getList();
+          this.$message.success("提醒成功");
+        } catch (e) {
+          console.log(e);
+        }
+      });
+    },
+    remindTeachers() {
+      if (this.chioseList.length <= 0) {
+        this.$message.error("请至少选择一条信息");
+        return;
+      }
+      this.$confirm("是否批量给老师发送提醒?", "提示", {
+        confirmButtonText: "确定",
+        cancelButtonText: "取消",
+        type: "warning",
+      }).then(async () => {
+        try {
+          const result = await teacherServeRemindPush(this.chioseList);
+          this.getList();
+          this.$message.success("提醒成功");
+        } catch (e) {
+          console.log(e);
+        }
+      });
+    },
+    checkSelectable(row) {
+      return row.unDone;
+    },
+    handleSelectionChange(arr) {
+      this.chioseList = arr;
+    },
+  },
+};
+</script>
+<style lang='scss' scoped>
+</style>

+ 3 - 1
vue.config.js

@@ -61,8 +61,10 @@ module.exports = {
       // detail: https://cli.vuejs.org/config/#devserver-proxy
       // http://47.99.212.176:8000
       // http://192.168.3.28:8000
+      // http://192.168.3.134
+      // http://47.114.176.40:8000
       '/api-auth': {
-        target: 'http://47.114.176.40:8000',
+        target: 'http://192.168.3.134',
         changeOrigin: true,
         pathRewrite: {
           '^api-auth': ''