Browse Source

Merge branch '02/23reviewBUG' into 11/24SAAS

mo 3 years ago
parent
commit
4a07c61227

+ 3 - 1
src/constant/index.js

@@ -294,7 +294,9 @@ export const downListType = {
   5: 'VIP课学员课程',
   6: 'VIP学员课程管理',
   7: '学员小课数据统计',
-  8: '订单汇总'
+  8: '订单汇总',
+  9:'乐团课表详情',
+  10:'乐团数据导出'
 }
 
 export const withdrawalStatus = {

+ 69 - 3
src/views/reportForm/index.vue

@@ -205,7 +205,8 @@
             $helpers.permission('studentInstrument/export') ||
             $helpers.permission('export/studentVipPractice') ||
             $helpers.permission('export/exercisesSituation') ||
-            $helpers.permission('export/exportIndexErrData')
+            $helpers.permission('export/exportIndexErrData') ||
+            $helpers.permission('export/exportMusicGroupCourseList')
           "
         >
           <template slot="title">
@@ -541,6 +542,52 @@
               :isDownList="true"
             />
           </div>
+
+          <div class="m-wrap" v-permission="'export/exportMusicGroupCourseList'">
+            <div class="title">乐团数据导出:</div>
+            <select-all
+              v-model.trim="teamOrganId"
+              class="organSelect"
+              style="width: 100%"
+              filterable
+              multiple
+              placeholder="请选择分部"
+              clearable
+            >
+              <el-option
+                v-for="(item, index) in selects.branchs"
+                :key="index"
+                :label="item.name"
+                :value="item.id"
+              ></el-option>
+            </select-all>
+            <el-date-picker
+              v-model.trim="teamTimer"
+              style="width: 360px; margin-left: 15px"
+              type="daterange"
+              value-format="yyyy-MM-dd"
+              range-separator="至"
+              start-placeholder="开始日期"
+              end-placeholder="结束日期"
+              @change="getWeekTime"
+              :picker-options="{
+                firstDayOfWeek: 1,
+              }"
+            ></el-date-picker>
+            <el-button
+              style="margin-left: 10px"
+              type="primary"
+              @click="exportMusicGroup"
+              >导出</el-button
+            >
+            <!-- <ExportChiose
+              style="margin-left: 10px"
+              ExportEnum="EXERCISES_SITUATION"
+              :exportData="exportDetailService"
+              fileName="服务指标明细"
+              errorMsg="请选择导出月份"
+            /> -->
+          </div>
         </el-collapse-item>
         <el-collapse-item
           name="3"
@@ -742,6 +789,7 @@ import qs from "qs";
 import dayjs from "dayjs";
 import axios from "axios";
 import { getToken, getTenantId } from "@/utils/auth";
+import { getTimes } from "@/utils";
 import load from "@/utils/loading";
 export default {
   name: "reportForm",
@@ -779,6 +827,8 @@ export default {
       vipStudentCourseOrganId: [],
       musicStudentCourseOrganId: [],
       VipStudentOrganId: [],
+      teamOrganId: [],
+      teamTimer: [],
     };
   },
   mounted() {
@@ -1465,6 +1515,22 @@ export default {
     //     "是否确认导出报表?"
     //   );
     // },
+    exportMusicGroup() {
+      let params = { ...getTimes(this.teamTimer, ["startTime", "endTime"]) ,organId:this.teamOrganId.join(',')
+      };
+
+      Export(
+        this,
+        {
+          method: "post",
+          url: "/api-web/export/exportMusicGroupCourseList",
+          params: this.$helpers.qs.stringify({
+            ...params,
+          }),
+        },
+        "是否确认导出报表?"
+      );
+    },
   },
   computed: {
     exportAttendance() {
@@ -1519,8 +1585,8 @@ export default {
       };
       return data;
     },
-    exportVipStudent(){
-        let data = {
+    exportVipStudent() {
+      let data = {
         organId: this.VipStudentOrganId.join(","),
       };
       return data;

+ 8 - 4
src/views/teamDetail/api.js

@@ -33,8 +33,12 @@ export const updateMemberExperience = data => request2({
 
 
 // 添加会员
-export const cloudAddStudents = data => request2({
-  url: '/api-web/cloudTeacherOrder/addStudents',
-  data,
-  method: 'post'
+export const getMusicGroupCourseScheduleStatistics = data => request2({
+  url: '/api-web/classGroup/getMusicGroupCourseScheduleStatistics',
+  params:data,
+  method: 'get'
 })
+
+
+// 课表详情- 统计
+

+ 1247 - 981
src/views/teamDetail/components/courseList.vue

@@ -1,981 +1,1247 @@
-<template>
-  <div class="cl-container">
-    <!-- 搜索类型 -->
-    <save-form :inline="true"
-    save-key='teamDetails-courseList'
-             class="searchForm"
-             ref='searchForm'
-             :model="searchForm" @submit="search" @reset="onReSet">
-      <el-form-item prop="courseStatus">
-        <el-select v-model.trim="searchForm.courseStatus"
-                   clearable
-                   filterable
-                   placeholder="课程类型">
-            <el-option v-for="(item, index) in courseArray"
-                     :key="index"
-                     :label="item.label"
-                     :value="item.value"></el-option>
-        </el-select>
-      </el-form-item>
-      <el-form-item prop="classStatus">
-        <el-select v-model.trim="searchForm.classStatus"
-                   clearable
-                   filterable
-                   placeholder="课程状态">
-          <el-option label="未开始"
-                     value="NOT_START"></el-option>
-          <el-option label="进行中"
-                     value="UNDERWAY"></el-option>
-          <el-option label="已结束"
-                     value="OVER"></el-option>
-        </el-select>
-      </el-form-item>
-      <el-form-item prop="class">
-        <!-- getMusicGroupAllClass -->
-        <el-select v-model.trim="searchForm.class"
-                   placeholder="班级名称"
-                   filterable
-                   clearable>
-          <el-option v-for="(item,index) in classList"
-                     :key="index"
-                     :value="item.id"
-                     :label="item.name"></el-option>
-        </el-select>
-      </el-form-item>
-      <el-form-item prop="isSettlement">
-        <el-select v-model.trim="searchForm.isSettlement"
-                   placeholder="是否结算"
-                   filterable
-                   clearable>
-          <el-option value="0"
-                     label="未结算"></el-option>
-          <el-option value="1"
-                     label="已结算"></el-option>
-        </el-select>
-      </el-form-item>
-      <el-form-item prop="timer">
-        <el-date-picker v-model.trim="searchForm.timer"
-                        style="width:420px;"
-                        type="daterange"
-                        value-format="yyyy-MM-dd"
-                        range-separator="至"
-                        start-placeholder="课程开始日期"
-                        end-placeholder="课程结束日期"
-                        :picker-options="{
-        firstDayOfWeek: 1
-    }"></el-date-picker>
-      </el-form-item>
-      <el-form-item>
-        <el-button native-type="submit" type="danger">搜索</el-button>
-          <el-button type="primary" native-type="reset">重置</el-button>
-      </el-form-item>
-    </save-form>
-    <div class="btnWraps">
-      <!-- <div class="newBand"
-           @click="removeCourses"
-           v-permission="'courseSchedule/batchDelete'">批量删除</div> -->
-      <!-- <div class="newBand"
-      @click="resetTimer">修改日期</div>-->
-    </div>
-    <!-- -->
-<!--  @selection-change="handleSelectionChange" -->
-    <!-- 列表 -->
-    <div class="tableWrap">
-      <el-table :data="tableList"
-                :header-cell-style="{background:'#EDEEF0',color:'#444'}"
-               >
-        <!-- <el-table-column type="selection"
-                         width="55"
-                         :selectable="checkSelectable"></el-table-column> -->
-        <el-table-column align='center'
-                         prop="courseScheduleId"
-                         label="课程编号"></el-table-column>
-        <el-table-column align="center"
-                         width="180px"
-                         label="时间">
-          <template slot-scope="scope">{{ scope.row.classDate }} {{ scope.row.startClassTime ? scope.row.startClassTime.substr(0, 5) : '' }}-{{ scope.row.endClassTime ? scope.row.endClassTime.substr(0, 5) : '' }}</template>
-        </el-table-column>
-        <el-table-column align="center"
-                         prop="courseScheduleName"
-                         label="课程名称"></el-table-column>
-
-        <el-table-column align="center"
-                         prop="courseScheduleType"
-                         label="课程类型">
-          <template slot-scope="scope">
-            <div>{{ scope.row.courseScheduleType | coursesType}}</div>
-          </template>
-        </el-table-column>
-
-        <el-table-column align="center"
-                         prop="courseScheduleStatus"
-                         label="课程状态">s
-          <template slot-scope="scope">
-            <div>{{ scope.row.courseScheduleStatus | coursesStatus }}</div>
-          </template>
-        </el-table-column>
-        <el-table-column align="center"
-                         label="老师签到">
-          <template slot-scope="scope">
-            <div v-if="scope.row.courseScheduleStatus != 'NOT_START'">{{ scope.row.signInStatus | attendanceType}}</div>
-          </template>
-        </el-table-column>
-        <el-table-column align="center"
-                         label="老师签退">
-          <template slot-scope="scope">
-            <div v-if="scope.row.courseScheduleStatus != 'NOT_START'">{{ scope.row.signOutStatus | attendanceOutType}}</div>
-          </template>
-        </el-table-column>
-        <el-table-column align="center"
-                         prop="masterTeacherName"
-                         label="指导老师"></el-table-column>
-        <el-table-column align="center"
-                         label="结算状态">
-          <template slot-scope="scope">{{ scope.row.settlementTime ? '已结算' : '未结算' }}</template>
-        </el-table-column>
-        <el-table-column align="center"
-                         prop="remark"
-                         label="是否点名">
-          <template slot-scope="scope">
-            <div v-if="scope.row.courseScheduleStatus != 'NOT_START'">
-              {{ scope.row.isCallNames ? '已点名' : '未点名' }}
-            </div>
-          </template>
-        </el-table-column>
-        <el-table-column align="center"
-                         prop="remark"
-                         label="备注"></el-table-column>
-        <el-table-column align="center"
-                         width="280px"
-                         label="操作"
-                         fixed="right">
-          <template slot-scope="scope">
-            <div>
-              <!-- {child: 'teacherAttendance/updateTeacherAttendance', parent: '/teamDetails/courseList'} -->
-              <el-button v-if="scope.row.courseScheduleStatus == 'OVER' && !scope.row.settlementTime && permission('teacherAttendance/updateTeacherAttendance?t=568')"
-                         type="text"
-                         @click="onMarkAttendance(scope.row)">补考勤</el-button>
-              <el-button v-if="scope.row.courseScheduleStatus == 'OVER' && permission('studentAttendance/updateStudentAttendances?t=570')"
-                         type="text"
-                         @click="onCallName(scope.row)">点名表</el-button>
-              <!-- OVER -->
-              <!-- <el-button
-                v-if="scope.row.courseScheduleStatus == 'OVER' && permission('courseSchedule/classStartDateAdjust1')"
-                type="text"
-                @click="resetClass(scope.row)"
-              >调整</el-button>-->
-              <el-button v-if="!scope.row.settlementTime && permission('courseSchedule/classStartDateAdjust/teamCourseListInfo')"
-                         type="text"
-                         @click="resetClass(scope.row)">调整</el-button>
-              <!-- <el-button v-if="scope.row.courseScheduleStatus == 'NOT_START' && permission('courseSchedule/batchDelete')"
-                         type="text"
-                         @click="removeSingleClass(scope.row)">删除</el-button> -->
-              <!-- v-if="scope.row.courseScheduleStatus == 'NOT_START' && permission('courseSchedule/batchDelete')"  teamDetail/resetTpye-->
-              <!-- <el-button type="text"
-                         @click="resetType(scope.row)"
-                         v-if="permission('teamDetail/resetTpye')&&scope.row.courseScheduleType!='HIGH_ONLINE'&&scope.row.courseScheduleType!='MUSIC_NETWORK'">类型调整</el-button> -->
-              <el-button type="text"
-                         v-if="scope.row.courseScheduleStatus == 'OVER' && !scope.row.settlementTime &&permission('courseSchedule/cleanAttendancecourseSchedule/classStartDateAdjust/teamCourseListInfo')"
-                         @click="clearAttend(scope.row)">清除考勤</el-button>
-            </div>
-          </template>
-        </el-table-column>
-      </el-table>
-      <pagination
-       save-key='teamDetails-courseList'
-      sync
-      :total.sync="rules.total"
-                  :page.sync="rules.page"
-                  :limit.sync="rules.limit"
-                  :page-sizes="rules.page_size"
-                  @pagination="getList" />
-    </div>
-    <el-dialog title="课程调整"
-               width="400px"
-               :before-close="handleClose"
-               :visible.sync="courseVisible">
-      <el-form :model="maskForm"
-      v-if="courseVisible"
-               class="maskForm"
-               ref="maskForm"
-               :rules="maskRules"
-               label-position="right"
-               label-width="120px"
-               :inline="true">
-        <el-form-item label="主教老师"
-                      prop="teacher">
-         <remote-search :commit="'setTeachers'" v-model="maskForm.teacher" :width='220'/>
-        </el-form-item>
-        <el-form-item label="助教老师"
-                      v-if="maskForm.courseScheduleType != 'MUSIC_NETWORK'&&maskForm.courseScheduleType != 'HIGH_ONLINE'"
-                      prop="assistant">
-          <remote-search :commit="'setTeachers'" v-model="maskForm.assistant" :width='220'  :multiple='true'/>
-        </el-form-item>
-        <el-form-item label="上课日期"
-                      prop="date">
-          <el-date-picker v-model.trim="maskForm.date"
-                          type="date"
-                          :picker-options="beginDate()"
-                          value-format="yyyy-MM-dd"
-                          placeholder="选择日期"></el-date-picker>
-        </el-form-item>
-        <el-form-item label="课程时长"
-                      v-if="courseVisible"
-                      prop="timer">
-          <el-select v-model="maskForm.timer" @change="changeTime">
-              <el-option v-for="(item,index) in typeTimeList"
-                       :key="index"
-                       :value="parseInt(item)"
-                       :label="item"></el-option>
-          </el-select>
-        </el-form-item>
-        <el-form-item label="开始时间"
-                      v-if="courseVisible"
-                      prop="startTime">
-          <el-time-picker placeholder="起始时间"
-                          v-model.trim="maskForm.startTime"
-                          @change="changeStartTime"
-                          format='HH:mm'
-                          value-format='HH:mm'
-                          :picker-options="{
-            selectableRange: `${nowTime} - 23:30:00`,
-          }"
-
-                            ></el-time-picker>
-        </el-form-item>
-        <el-form-item label="结束时间"
-                      v-if="courseVisible"
-                      prop="endTime">
-          <el-time-select placeholder="结束时间"
-                          v-model.trim="maskForm.endTime"
-                          disabled
-                          :picker-options="{
-                            start: '04:30',
-                            step: '00:05',
-                            end: '23:30',
-                            minTime: maskForm.startTime
-                          }"></el-time-select>
-        </el-form-item>
-        <el-form-item label="教学地点"
-                      prop="schoolId"
-                      v-if="maskForm.courseScheduleType != 'HIGH_ONLINE'&&maskForm.courseScheduleType != 'MUSIC_NETWORK'">
-          <el-select v-model.trim="
-                    maskForm.schoolId"
-                     style="width:220px!important"
-                     filterable
-                     clearable>
-            <el-option v-for="(item,index) in schoolList"
-                       :key="index"
-                       :value="item.id"
-                       :label="item.name"></el-option>
-          </el-select>
-        </el-form-item>
-      </el-form>
-      <div slot="footer"
-           class="dialog-footer">
-        <el-button @click="courseVisible = false">取 消</el-button>
-        <el-button type="primary"
-                   @click="submitResetClass">确 定</el-button>
-      </div>
-    </el-dialog>
-    <el-dialog title="修改时间"
-               width="400px"
-               :before-close="handleCloseTimer"
-               :visible.sync="timerVisible">
-      <el-form :model="timerMask">
-        <el-form-item label="上课日期"
-                      :rules=" [{ required: true, message: '请选择日期', trigger: 'blur' },]">
-          <el-date-picker v-model.trim="timerMask.timer"
-                          type="date"
-                          format="yyyy-MM-dd"
-                          value-format="yyyy-MM-dd"
-                          :picker-options="{
-                            firstDayOfWeek:1
-                          }"
-                          placeholder="选择日期"></el-date-picker>
-        </el-form-item>
-      </el-form>
-      <div slot="footer"
-           class="dialog-footer">
-        <el-button @click="timerVisible = false">取 消</el-button>
-        <el-button type="primary"
-                   @click="batchAdjustmentTime">确 定</el-button>
-      </div>
-    </el-dialog>
-
-    <el-dialog title="补考勤"
-               width="400px"
-               :visible.sync="markAttendance.status">
-      <el-form>
-        <el-form-item label="签到状态">{{ markAttendance.dataInfo.signInStatus | attendanceType }}</el-form-item>
-        <el-form-item label="签到时间">{{ markAttendance.dataInfo.signInTime}}</el-form-item>
-        <el-form-item label="签退状态">{{ markAttendance.dataInfo.signOutStatus | attendanceOutType }}</el-form-item>
-        <el-form-item label="签退时间">{{ markAttendance.dataInfo.signOutTime}}</el-form-item>
-      </el-form>
-      <div slot="footer"
-           class="dialog-footer">
-        <el-button @click="markAttendance.status = false">取 消</el-button>
-        <el-button type="primary"
-                   :disabled="markAttendance.dataInfo.signOutStatus == 1 && markAttendance.dataInfo.signInStatus == 1 ? true : false"
-                   @click="batchAdjustmentTime">确定补卡</el-button>
-      </div>
-    </el-dialog>
-
-    <el-dialog title="点名表"
-               width="800px"
-               :visible.sync="rollCall.status">
-      <el-table :data="rollCall.gridData">
-        <el-table-column align="center"
-                         property="userName"
-                         label="学员姓名"></el-table-column>
-        <el-table-column align="center"
-                         property="phone"
-                         label="手机号"></el-table-column>
-        <el-table-column align="center"
-                         property="subjectName"
-                         label="学员声部"></el-table-column>
-        <el-table-column align="center"
-                         label="到课状态">
-          <template slot-scope="scope">{{ scope.row.status | studentCallName }}</template>
-        </el-table-column>
-        <el-table-column align="center"
-                         v-if="!rollCall.selectItem.settlementTime"
-                         label="操作"
-                         width="240px">
-          <template slot-scope="scope">
-            <el-button size="mini"
-                       @click="onChangeRollCall('TRUANT', scope.row)"
-                       type="primary"
-                       round>未到</el-button>
-            <el-button  size="mini"
-                       @click="onChangeRollCall('LEAVE', scope.row)"
-                       type="warning"
-                       round>请假</el-button>
-            <el-button  size="mini"
-                       @click="onChangeRollCall('NORMAL', scope.row)"
-                       type="success"
-                       round>到课</el-button>
-          </template>
-        </el-table-column>
-      </el-table>
-      <pagination
-      sync
-      :total.sync="rollCall.total"
-                  :page.sync="rollCall.page"
-                  :limit.sync="rollCall.limit"
-                  :page-sizes="rollCall.page_size"
-                  @pagination="getCallName" />
-    </el-dialog>
-  </div>
-</template>
-<script>
-import dayjs from "dayjs";
-import pagination from "@/components/Pagination/index";
-import { bathDelete } from "@/api/vipSeting";
-import {
-  resetCourse,
-  getMusicGroupAllClass,
-  getCourseSchedule,
-  updateTeacherAttendance,
-  findAttendanceStudentByCourseWithPage,
-  updateStudentAttendances,
-  cleanAttendance,
-  getOrganCourseDurationSettings,
-} from "@/api/buildTeam";
-import { permission } from "@/utils/directivePage";
-import { diffTimerFormMinute, addTimerFormMinute } from "@/utils/date";
-import { classTimeList, musicCourseType } from "@/utils/searchArray";
-import { getSchool } from "@/api/systemManage";
-import cleanDeep from "clean-deep";
-let that;
-export default {
-  name: "tcourseList",
-  data() {
-    return {
-      classTimeList,
-      courseArray: musicCourseType,
-      typeVisible: false,
-      timerVisible: false,
-      courseVisible: false,
-      searchForm: {
-        courseStatus: "", // 课程类型
-        classStatus: "", // 课程状态
-        timer: [], // 时间
-        class: "",
-        isSettlement: "",
-      },
-      tableList: [],
-      searchLsit: [],
-      rules: {
-        // 分页规则
-        limit: 10, // 限制显示条数
-        page: 1, // 当前页
-        total: 0, // 总条数
-        page_size: [10, 20, 40, 50], // 选择限制显示条数
-      },
-      maskForm: {
-        teacher: "",
-        assistant: "",
-        date: "",
-        id: "",
-        startTime: "",
-        endTime: "",
-        type: "",
-        timer: "",
-        courseScheduleType: null,
-        address: "",
-        teachMode: "",
-        schoolId: "",
-      },
-      typeForm: {
-        teacher: "",
-        assistant: "",
-        date: "",
-        startTime: "",
-        endTime: "",
-        type: null,
-        id: null,
-      },
-      maskRules: {
-        schoolId: [
-          { required: true, message: "请选教学地点", trigger: "blur" },
-        ],
-        teacher: [
-          { required: true, message: "请选择主教老师名称", trigger: "blur" },
-        ],
-        date: [{ required: true, message: "请选择上课时间", trigger: "blur" }],
-        // startTime: [{ required: true, message: '请选择上课开始时间', trigger: 'blur' },],
-        // endTime: [{ required: true, message: '请选择上课结束时间', trigger: 'blur' },],
-      },
-      typeRules: {
-        type: [{ required: true, message: "请选择课程类型", trigger: "blur" }],
-      },
-      teacherList: [],
-      classList: [],
-      activeCourseList: [],
-      timerMask: {
-        timer: "",
-      },
-      markAttendance: {
-        // 考勤状态
-        status: false,
-        dataInfo: {},
-      },
-      rollCall: {
-        // 点名表
-        status: false,
-        gridData: [],
-        selectItem: {}, // 选中状态
-        limit: 10, // 限制显示条数
-        page: 1, // 当前页
-        total: 0, // 总条数
-        page_size: [10, 20, 40, 50], // 选择限制显示条数
-      },
-      organId: "",
-      schoolList: [],
-      courseTimeList: {},
-      typeTimeList: [],
-    };
-  },
-  components: {
-    pagination,
-  },
-  created() {
-    that = this;
-  },
-  mounted() {
-    this.init();
-    getSchool({ organId: this.$route.query.organId }).then((res) => {
-      if (res.code == 200) {
-        this.schoolList = res.data;
-      }
-    });
-  },
-  activated() {
-    this.init();
-  },
-  methods: {
-    async init() {
-      this.teamid = this.$route.query.id;
-      this.organId = this.$route.query.organId;
-      try {
-        const res = await getOrganCourseDurationSettings({
-          organId: this.organId,
-        });
-        this.courseTimeList = res.data;
-      } catch {}
-
-      // MusicStore.dispatch('getBaseInfo', {
-      //     data: { musicGroupId: this.teamid }
-      //   }).then((res) => {
-      //     console.log(res)
-      //   })
-      this.getList();
-      // 获取所有老师
-      // findMusicGroupClassTeacher({ musicGroupId: this.teamid }).then(res => {
-      //   if (res.code == 200) {
-      //     this.teacherList = res.data;
-      //   }
-      // })
-      // getTeacher().then(res => {
-      //   if (res.code == 200) {
-      //     this.teacherList = res.data;
-      //   }
-      // });
-
-      // 获取班级列表
-      getMusicGroupAllClass({ musicGroupId: this.teamid }).then((res) => {
-        if (res.code == 200) {
-          this.classList = res.data;
-        }
-      });
-    },
-    onMarkAttendance(item) {
-      // 补考勤
-      this.markAttendance = {
-        status: true,
-        dataInfo: item,
-      };
-    },
-    onCallName(item) {
-      // 点名表
-      this.rollCall.page = 1;
-      this.rollCall.selectItem = item;
-      this.getCallName();
-    },
-    getCallName() {
-      let rollCall = this.rollCall;
-      let params = {
-        page: rollCall.page,
-        rows: rollCall.limit,
-        courseScheduleId: rollCall.selectItem.courseScheduleId,
-      };
-      findAttendanceStudentByCourseWithPage(params).then((res) => {
-        let result = res.data;
-        rollCall.status = true;
-        if (res.code == 200) {
-          rollCall.gridData = result.rows;
-          rollCall.total = result.total;
-        }
-      });
-    },
-    onChangeRollCall(type, row) {
-      let rollCall = this.rollCall;
-      let params = {
-        courseScheduleId: rollCall.selectItem.courseScheduleId,
-        studentAttendances: [
-          {
-            userId: row.studentId,
-            status: type,
-          },
-        ],
-      };
-      updateStudentAttendances(params).then((res) => {
-        if (res.code == 200) {
-          this.$message.success("修改成功");
-          row.status = type;
-          this.getList();
-        } else {
-          this.$message.error(res.msg);
-        }
-      });
-    },
-    permission(str, parent) {
-      return permission(str, parent);
-    },
-    search() {
-      this.rules.page = 1;
-      this.getList();
-    },
-    getList() {
-      let searchForm = this.searchForm;
-      if (!searchForm.timer) {
-        searchForm.timer = [];
-      }
-      let obj = {
-        classScheduleStatus: searchForm.classStatus || null,
-        classScheduleType: searchForm.courseStatus || null,
-        musicGroupId: this.teamid,
-        startTime: searchForm.timer[0] || null,
-        endTime: searchForm.timer[1] || null,
-        page: this.rules.page,
-        rows: this.rules.limit,
-        classGroupId: searchForm.class || null,
-        isSettlement: searchForm.isSettlement || null,
-      };
-      getCourseSchedule(obj).then((res) => {
-        if (res.code == 200) {
-          this.tableList = res.data.rows;
-          this.rules.total = res.data.total;
-        }
-      });
-    },
-    resetClass(row) {
-      this.maskForm.teacher = parseInt(row.masterTeacherId);
-      this.maskForm.courseScheduleType = row.courseScheduleType;
-      // this.courseTimeList
-      for (let key in this.courseTimeList) {
-        if (key == row.courseScheduleType) {
-          this.typeTimeList = this.courseTimeList[key].split(",");
-        }
-      }
-      // this.maskForm.type = row.courseScheduleType;
-      this.maskForm.assistant = [];
-      for (let i in row.teachingTeachers) {
-        if (row.teachingTeachers[i].teacherRole == "TEACHING") {
-          this.maskForm.assistant.push(row.teachingTeachers[i].userId);
-        }
-      }
-      this.maskForm.date = row.classDate;
-      this.$set(
-        this.maskForm,
-        "startTime",
-        row.startClassTimeStr.substring(0, 5)
-      );
-      let time = diffTimerFormMinute(
-        row.classDate,
-        row.startClassTimeStr,
-        row.endClassTimeStr
-      );
-      this.maskForm.timer = time;
-      this.maskForm.endTime = addTimerFormMinute(
-        row.classDate,
-        row.startClassTimeStr,
-        time
-      );
-      // this.maskForm.endTime = row.endClassTimeStr.substring(0, 5);
-      this.maskForm.id = row.courseScheduleId;
-      this.maskForm.schoolId = row.schoolId;
-      this.courseVisible = true;
-
-      // 修改课时
-
-      // let obj = {
-      //   actualTeacherId: this.maskForm.teacher,
-      //   classDate: this.maskForm.date,
-      //   classGroupId: row.id
-      // }
-    },
-    removeSingleClass(row) {
-      this.$confirm("是否删除该课程?", "提示", {
-        confirmButtonText: "确定",
-        cancelButtonText: "取消",
-        type: "warning",
-      })
-        .then(() => {
-          let courseScheduleIds = row.courseScheduleId;
-          bathDelete({ courseScheduleIds }).then((res) => {
-            if (res.code == 200) {
-              this.$message.success("删除成功");
-              this.getList();
-            }
-          });
-        })
-        .catch(() => {});
-    },
-    removeCourses() {
-      // 批量删除
-      if (this.activeCourseList.length < 1) {
-        this.$message.error("请至少选择一节课");
-        return;
-      }
-      let arr = [];
-      arr = this.activeCourseList.map((item) => {
-        return item.courseScheduleId;
-      });
-      this.$confirm("是否删除该课程?", "提示", {
-        confirmButtonText: "确定",
-        cancelButtonText: "取消",
-        type: "warning",
-      })
-        .then(() => {
-          let courseScheduleIds = arr.join(",");
-          bathDelete({ courseScheduleIds }).then((res) => {
-            if (res.code == 200) {
-              this.$message.success("删除成功");
-              this.getList();
-            }
-          });
-        })
-        .catch(() => {});
-    },
-    submitResetClass() {
-      let maskForm = this.maskForm;
-      let diff = dayjs(maskForm.date + " " + maskForm.startTime).diff(
-        new Date(),
-        "second"
-      );
-      if (diff <= 0) {
-        this.$message.error("课程开始时间必须大于当前时间");
-        return;
-      }
-      if (!maskForm.startTime || !maskForm.endTime) {
-        this.$message.error("请填写开始时间或结束时间");
-        return;
-      }
-      this.$confirm("是否确定?", "提示", {
-        confirmButtonText: "确定",
-        cancelButtonText: "取消",
-        type: "warning",
-      })
-        .then(() => {
-          let teachingTeacherIdList = maskForm.assistant.join(",");
-          if (teachingTeacherIdList.length <= 0) {
-            let teachingTeacherIdList = null;
-          }
-          let obj = {
-            actualTeacherId: maskForm.teacher,
-            startClassTimeStr: maskForm.startTime,
-            endClassTimeStr: maskForm.endTime,
-            id: maskForm.id,
-            teachingTeacherIdList,
-            classDate: maskForm.date,
-            type: maskForm.type,
-            groupType: "MUSIC",
-            schoolId: maskForm.schoolId,
-          };
-          resetCourse(cleanDeep(obj)).then((res) => {
-            if (res.code == 200) {
-              this.$message.success("修改成功");
-              this.getList();
-              this.courseVisible = false;
-            }
-            if (res.code == 206) {
-              this.$confirm(`当前课程课酬预计为0,是否继续`, "提示", {
-                confirmButtonText: "确定",
-                cancelButtonText: "取消",
-                type: "warning",
-              }).then((res) => {
-                obj.allowZeroSalary = true;
-                resetCourse(cleanDeep(obj)).then((res) => {
-                  if (res.code == 200) {
-                    this.$message.success("修改成功");
-                    this.getList();
-                    this.courseVisible = false;
-                  }
-                });
-              });
-            }
-          });
-        })
-        .catch(() => {});
-    },
-    handleClose() {
-      this.courseVisible = false;
-      (this.maskForm = {
-        teacher: "",
-        assistant: "",
-        date: "",
-        id: "",
-        startTime: "",
-        endTime: "",
-        schoolId: null,
-      }),
-        this.$refs["maskForm"].resetFields();
-    },
-    handleSelectionChange(val) {
-      this.activeCourseList = val;
-    },
-    checkSelectable(val) {
-      return val.courseScheduleStatus == "NOT_START";
-      // return true;
-    },
-    batchAdjustmentTime() {
-      let tempData = this.markAttendance.dataInfo;
-      let params = {
-        teacherId: tempData.masterTeacherId,
-        courseScheduleId: tempData.courseScheduleId,
-        signInStatus: 1,
-        signOutStatus: 1,
-      };
-      updateTeacherAttendance(params).then((res) => {
-        if (res.code == 200) {
-          this.$message.success("补卡成功");
-          this.markAttendance.status = false;
-          this.getList();
-        } else {
-          this.$message.error(res.msg);
-        }
-      });
-    },
-    handleCloseTimer() {
-      this.timerVisible = false;
-      this.timerMask.timer = "";
-    },
-    resetTimer() {
-      if (this.activeCourseList.length < 1) {
-        this.$message.error("请至少选择一节课");
-        return;
-      }
-      this.timerVisible = true;
-    },
-    resetType(row) {
-      this.typeForm.type = row.courseScheduleType;
-      this.typeForm.id = row.courseScheduleId;
-      this.typeForm.teacher = parseInt(row.masterTeacherId);
-      // this.maskForm.type = row.courseScheduleType;
-
-      this.typeForm.assistant = [];
-      for (let i in row.teachingTeachers) {
-        if (row.teachingTeachers[i].teacherRole == "TEACHING") {
-          this.typeForm.assistant.push(row.teachingTeachers[i].userId);
-        }
-      }
-      this.typeForm.date = row.classDate;
-      this.$set(
-        this.typeForm,
-        "startTime",
-        row.startClassTimeStr.substring(0, 5)
-      );
-      this.typeForm.endTime = row.endClassTimeStr.substring(0, 5);
-      //  console.log(row.type)
-      this.typeVisible = true;
-    },
-    submitResetType() {
-      this.$refs.typeForm.validate((res) => {
-        if (res) {
-          let teachingTeacherIdList = this.typeForm.assistant.join(",");
-          if (teachingTeacherIdList.length <= 0) {
-            let teachingTeacherIdList = null;
-          }
-          let obj = {
-            actualTeacherId: this.typeForm.teacher,
-            startClassTimeStr: this.typeForm.startTime,
-            endClassTimeStr: this.typeForm.endTime,
-            id: this.typeForm.id,
-            type: this.typeForm.type,
-            teachingTeacherIdList,
-            classDate: this.typeForm.date,
-          };
-          resetCourse(obj).then((res) => {
-            if (res.code == 200) {
-              this.$message.success("修改成功");
-              this.getList();
-              this.typeVisible = false;
-            }
-          });
-        }
-      });
-    },
-    // 清除考勤
-    clearAttend(row) {
-      this.$confirm("是否清除考勤记录?", "提示", {
-        confirmButtonText: "确定",
-        cancelButtonText: "取消",
-        type: "warning",
-      })
-        .then(() => {
-          cleanAttendance({ courseScheduleIds: row.courseScheduleId }).then(
-            (res) => {
-              if (res.code == 200) {
-                this.$message.success("清除成功");
-                this.getList();
-              } else {
-                this.$message.error(res.msg);
-              }
-            }
-          );
-        })
-        .catch(() => {});
-    },
-    changeStartTime(val) {
-      this.$nextTick((res) => {
-        this.maskForm.endTime = addTimerFormMinute(
-          this.maskForm.date,
-          val,
-          this.maskForm.timer
-        );
-      });
-    },
-    changeTime(val) {
-      this.$nextTick((res) => {
-        this.maskForm.endTime = addTimerFormMinute(
-          this.maskForm.date,
-          this.maskForm.startTime,
-          val
-        );
-      });
-    },
-    onReSet() {
-      this.$refs.searchForm.resetFields();
-      this.search()
-    },
-    beginDate() {
-      return {
-        firstDayOfWeek: 1,
-        disabledDate(time) {
-          return time.getTime() + 86400000 <= new Date().getTime();
-          //开始时间不选时,结束时间最大值小于等于当天
-        },
-      };
-    },
-  },
-  filters: {
-    studentCallName: (value) => {
-      let template = {
-        NORMAL: "到课",
-        TRUANT: "未到",
-        LEAVE: "请假",
-        DROP_OUT: "退学",
-        LATE: "迟到",
-        "": "未到",
-      };
-      return template[value];
-    },
-  },
-  watch: {
-    "maskForm.timer"(val) {
-      this.maskForm.endTime = addTimerFormMinute(
-        this.maskForm.date,
-        this.maskForm.startTime,
-        val
-      );
-    },
-  },
-  computed: {
-    nowTime() {
-      // console.log(that.maskForm.date)
-      let str = "04:30:00";
-      if (that.maskForm.date == dayjs(new Date()).format("YYYY-MM-DD")) {
-        str = dayjs(new Date()).format("HH:mm:ss");
-      }
-
-      return str;
-    },
-  },
-};
-</script>
-<style lang="scss" scoped>
-.cl-container {
-  .topFrom {
-    margin: 20px 30px 0;
-    .classlist {
-      display: flex;
-      flex-direction: row;
-      justify-content: flex-start;
-      align-items: center;
-      ul {
-        li {
-          list-style: none;
-        }
-      }
-    }
-  }
-  // .searchForm {
-  //   // margin: 0 30px;
-  // }
-}
-.btnWraps {
-  display: flex;
-  flex-direction: row;
-  justify-content: flex-start;
-  div {
-    margin-right: 20px;
-  }
-}
-.maskForm {
-  /deep/.el-input {
-    width: 220px;
-  }
-}
-</style>
+<template>
+  <div class="cl-container">
+    <!-- 搜索类型 -->
+    <save-form
+      :inline="true"
+      save-key="teamDetails-courseList"
+      class="searchForm"
+      ref="searchForm"
+      :model="searchForm"
+      @submit="search"
+      @reset="onReSet"
+    >
+      <el-form-item prop="courseStatus">
+        <el-select
+          v-model.trim="searchForm.courseStatus"
+          clearable
+          filterable
+          placeholder="课程类型"
+        >
+          <el-option
+            v-for="(item, index) in courseArray"
+            :key="index"
+            :label="item.label"
+            :value="item.value"
+          ></el-option>
+        </el-select>
+      </el-form-item>
+      <el-form-item prop="classStatus">
+        <el-select
+          v-model.trim="searchForm.classStatus"
+          clearable
+          filterable
+          placeholder="课程状态"
+        >
+          <el-option label="未开始" value="NOT_START"></el-option>
+          <el-option label="进行中" value="UNDERWAY"></el-option>
+          <el-option label="已结束" value="OVER"></el-option>
+        </el-select>
+      </el-form-item>
+      <el-form-item prop="class">
+        <!-- getMusicGroupAllClass -->
+        <el-select
+          v-model.trim="searchForm.class"
+          placeholder="班级名称"
+          filterable
+          clearable
+        >
+          <el-option
+            v-for="(item, index) in classList"
+            :key="index"
+            :value="item.id"
+            :label="item.name"
+          ></el-option>
+        </el-select>
+      </el-form-item>
+      <el-form-item prop="isSettlement">
+        <el-select
+          v-model.trim="searchForm.isSettlement"
+          placeholder="是否结算"
+          filterable
+          clearable
+        >
+          <el-option value="0" label="未结算"></el-option>
+          <el-option value="1" label="已结算"></el-option>
+        </el-select>
+      </el-form-item>
+      <el-form-item prop="homeworkFlag">
+        <el-select
+          v-model.trim="searchForm.homeworkFlag"
+          placeholder="是否布置作业"
+          filterable
+          clearable
+        >
+          <el-option :value="false" label="未布置"></el-option>
+          <el-option :value="true" label="已布置"></el-option>
+        </el-select>
+      </el-form-item>
+      <el-form-item prop="serviceFlag">
+        <el-select
+          v-model.trim="searchForm.serviceFlag"
+          placeholder="是否服务"
+          filterable
+          clearable
+        >
+          <el-option :value="true" label="是"></el-option>
+          <el-option :value="false" label="否"></el-option>
+        </el-select>
+      </el-form-item>
+      <el-form-item prop="timer">
+        <el-date-picker
+          v-model.trim="searchForm.timer"
+          style="width: 420px"
+          type="daterange"
+          value-format="yyyy-MM-dd"
+          range-separator="至"
+          start-placeholder="课程开始日期"
+          end-placeholder="课程结束日期"
+          :picker-options="{
+            firstDayOfWeek: 1,
+          }"
+        ></el-date-picker>
+      </el-form-item>
+      <el-form-item>
+        <el-button native-type="submit" type="danger">搜索</el-button>
+        <el-button type="primary" native-type="reset">重置</el-button>
+         <el-button type="primary"     v-if="
+                  permission('export/exportMusicGroupCourseScheduleDetail')
+                " @click="exportCourse">导出</el-button>
+      </el-form-item>
+    </save-form>
+    <div class="btnWraps"></div>
+
+    <div style="font-size: 14px; padding-bottom: 10px">
+      总出勤率:<span style="color: #f85043; font-weight: 600">{{
+        detail.attendanceRate
+      }}</span>
+      &nbsp;&nbsp;&nbsp;&nbsp;总达标率:<span
+        style="color: #f85043; font-weight: 600"
+        >{{ detail.standardRate }}</span
+      >
+      &nbsp;&nbsp;&nbsp;&nbsp; 总作业提交率:<span
+        style="color: #f85043; font-weight: 600"
+        >{{ detail.homeworkCommitRate }}</span
+      >
+    </div>
+    <!-- 列表 -->
+    <div class="tableWrap">
+      <el-table
+        :data="tableList"
+        :header-cell-style="{ background: '#EDEEF0', color: '#444' }"
+      >
+        <!-- <el-table-column type="selection"
+                         width="55"
+                         :selectable="checkSelectable"></el-table-column> -->
+
+        <el-table-column
+          align="center"
+          prop="courseScheduleId"
+          label="课程编号"
+        ></el-table-column>
+        <el-table-column align="center" width="180px" label="时间">
+          <template slot-scope="scope"
+            >{{ scope.row.classDate }}
+            {{
+              scope.row.startClassTime
+                ? scope.row.startClassTime.substr(0, 5)
+                : ""
+            }}-{{
+              scope.row.endClassTime ? scope.row.endClassTime.substr(0, 5) : ""
+            }}</template
+          >
+        </el-table-column>
+        <el-table-column
+          align="center"
+          prop="courseScheduleName"
+          label="课程名称"
+        ></el-table-column>
+
+        <el-table-column
+          align="center"
+          prop="courseScheduleType"
+          label="课程类型"
+        >
+          <template slot-scope="scope">
+            <div>{{ scope.row.courseScheduleType | coursesType }}</div>
+          </template>
+        </el-table-column>
+
+        <el-table-column
+          align="center"
+          prop="courseScheduleStatus"
+          label="课程状态"
+          >s
+          <template slot-scope="scope">
+            <div>{{ scope.row.courseScheduleStatus | coursesStatus }}</div>
+          </template>
+        </el-table-column>
+        <el-table-column align="center" label="老师签到">
+          <template slot-scope="scope">
+            <div v-if="scope.row.courseScheduleStatus != 'NOT_START'">
+              {{ scope.row.signInStatus | attendanceType }}
+            </div>
+            <span v-else>--</span>
+          </template>
+        </el-table-column>
+        <el-table-column align="center" label="老师签退">
+          <template slot-scope="scope">
+            <div v-if="scope.row.courseScheduleStatus != 'NOT_START'">
+              {{ scope.row.signOutStatus | attendanceOutType }}
+            </div>
+              <span v-else>--</span>
+          </template>
+        </el-table-column>
+        <el-table-column
+          align="center"
+          prop="masterTeacherName"
+          label="指导老师"
+        ></el-table-column>
+        <el-table-column align="center" label="结算状态">
+          <template slot-scope="scope">{{
+            scope.row.settlementTime ? "已结算" : "未结算"
+          }}</template>
+        </el-table-column>
+        <el-table-column align="center" prop="remark" label="是否点名">
+          <template slot-scope="scope">
+            <div v-if="scope.row.courseScheduleStatus != 'NOT_START'">
+              {{ scope.row.isCallNames ? "已点名" : "未点名" }}
+            </div>
+            <span v-else>--</span>
+          </template>
+        </el-table-column>
+        <el-table-column align="center" prop="attendanceRate" label="出勤率">
+          <template slot-scope="scope">
+            <div>
+              {{
+                scope.row.courseScheduleStatistics.attendanceRate&& scope.row.courseScheduleStatus== 'OVER'
+                  ? scope.row.courseScheduleStatistics.attendanceRate
+                  : "--"
+              }}
+            </div>
+          </template>
+        </el-table-column>
+        <el-table-column align="center" prop="standardRate" label="达标率">
+          <template slot-scope="scope">
+            <div>
+              {{
+                scope.row.courseScheduleStatistics.standardRate&& scope.row.courseScheduleStatus== 'OVER'
+                  ? scope.row.courseScheduleStatistics.standardRate
+                  : "--"
+              }}
+            </div>
+          </template>
+        </el-table-column>
+        <el-table-column align="center" prop="remark" label="是否服务">
+          <template slot-scope="scope">
+            <div>
+              {{ scope.row.courseScheduleStatistics.serviceFlag ? "是" : "否" }}
+            </div>
+          </template>
+        </el-table-column>
+        <el-table-column align="center" prop="remark" label="是否布置课后作业">
+          <template slot-scope="scope">
+            <div>
+              {{
+                scope.row.courseScheduleStatistics.homeworkFlag
+                  ? "已布置"
+                  : "未布置"
+              }}
+            </div>
+          </template>
+        </el-table-column>
+        <el-table-column align="center" prop="remark" label="作业提交率">
+          <template slot-scope="scope">
+            <div>
+              {{
+                scope.row.courseScheduleStatistics.homeworkCommitRate&&scope.row.courseScheduleStatistics.homeworkFlag
+                  ? scope.row.courseScheduleStatistics.homeworkCommitRate
+                  : "--"
+              }}
+            </div>
+          </template>
+        </el-table-column>
+        <el-table-column
+          align="center"
+          prop="remark"
+          label="备注"
+        ></el-table-column>
+        <el-table-column
+          align="center"
+          width="280px"
+          label="操作"
+          fixed="right"
+        >
+          <template slot-scope="scope">
+            <div>
+              <!-- {child: 'teacherAttendance/updateTeacherAttendance', parent: '/teamDetails/courseList'} -->
+              <el-button
+                v-if="
+                  scope.row.courseScheduleStatus == 'OVER' &&
+                  !scope.row.settlementTime &&
+                  permission('teacherAttendance/updateTeacherAttendance?t=568')
+                "
+                type="text"
+                @click="onMarkAttendance(scope.row)"
+                >补考勤</el-button
+              >
+              <el-button
+                v-if="
+                  scope.row.courseScheduleStatus == 'OVER' &&
+                  permission('studentAttendance/updateStudentAttendances?t=570')
+                "
+                type="text"
+                @click="onCallName(scope.row)"
+                >点名表</el-button
+              >
+              <!-- OVER -->
+              <!-- <el-button
+                v-if="scope.row.courseScheduleStatus == 'OVER' && permission('courseSchedule/classStartDateAdjust1')"
+                type="text"
+                @click="resetClass(scope.row)"
+              >调整</el-button>-->
+              <el-button
+                v-if="
+                  !scope.row.settlementTime &&
+                  permission(
+                    'courseSchedule/classStartDateAdjust/teamCourseListInfo'
+                  )
+                "
+                type="text"
+                @click="resetClass(scope.row)"
+                >调整</el-button
+              >
+              <!-- <el-button v-if="scope.row.courseScheduleStatus == 'NOT_START' && permission('courseSchedule/batchDelete')"
+                         type="text"
+                         @click="removeSingleClass(scope.row)">删除</el-button> -->
+              <!-- v-if="scope.row.courseScheduleStatus == 'NOT_START' && permission('courseSchedule/batchDelete')"  teamDetail/resetTpye-->
+              <!-- <el-button type="text"
+                         @click="resetType(scope.row)"
+                         v-if="permission('teamDetail/resetTpye')&&scope.row.courseScheduleType!='HIGH_ONLINE'&&scope.row.courseScheduleType!='MUSIC_NETWORK'">类型调整</el-button> -->
+              <el-button
+                type="text"
+                v-if="
+                  scope.row.courseScheduleStatus == 'OVER' &&
+                  !scope.row.settlementTime &&
+                  permission(
+                    'courseSchedule/cleanAttendancecourseSchedule/classStartDateAdjust/teamCourseListInfo'
+                  )
+                "
+                @click="clearAttend(scope.row)"
+                >清除考勤</el-button
+              >
+            </div>
+          </template>
+        </el-table-column>
+      </el-table>
+      <pagination
+        save-key="teamDetails-courseList"
+        sync
+        :total.sync="rules.total"
+        :page.sync="rules.page"
+        :limit.sync="rules.limit"
+        :page-sizes="rules.page_size"
+        @pagination="getList"
+      />
+    </div>
+    <el-dialog
+      title="课程调整"
+      width="400px"
+      :before-close="handleClose"
+      :visible.sync="courseVisible"
+    >
+      <el-form
+        :model="maskForm"
+        v-if="courseVisible"
+        class="maskForm"
+        ref="maskForm"
+        :rules="maskRules"
+        label-position="right"
+        label-width="120px"
+        :inline="true"
+      >
+        <el-form-item label="主教老师" prop="teacher">
+          <remote-search
+            :commit="'setTeachers'"
+            v-model="maskForm.teacher"
+            :width="220"
+          />
+        </el-form-item>
+        <el-form-item
+          label="助教老师"
+          v-if="
+            maskForm.courseScheduleType != 'MUSIC_NETWORK' &&
+            maskForm.courseScheduleType != 'HIGH_ONLINE'
+          "
+          prop="assistant"
+        >
+          <remote-search
+            :commit="'setTeachers'"
+            v-model="maskForm.assistant"
+            :width="220"
+            :multiple="true"
+          />
+        </el-form-item>
+        <el-form-item label="上课日期" prop="date">
+          <el-date-picker
+            v-model.trim="maskForm.date"
+            type="date"
+            :picker-options="beginDate()"
+            value-format="yyyy-MM-dd"
+            placeholder="选择日期"
+          ></el-date-picker>
+        </el-form-item>
+        <el-form-item label="课程时长" v-if="courseVisible" prop="timer">
+          <el-select v-model="maskForm.timer" @change="changeTime">
+            <el-option
+              v-for="(item, index) in typeTimeList"
+              :key="index"
+              :value="parseInt(item)"
+              :label="item"
+            ></el-option>
+          </el-select>
+        </el-form-item>
+        <el-form-item label="开始时间" v-if="courseVisible" prop="startTime">
+          <el-time-picker
+            placeholder="起始时间"
+            v-model.trim="maskForm.startTime"
+            @change="changeStartTime"
+            format="HH:mm"
+            value-format="HH:mm"
+            :picker-options="{
+              selectableRange: `${nowTime} - 23:30:00`,
+            }"
+          ></el-time-picker>
+        </el-form-item>
+        <el-form-item label="结束时间" v-if="courseVisible" prop="endTime">
+          <el-time-select
+            placeholder="结束时间"
+            v-model.trim="maskForm.endTime"
+            disabled
+            :picker-options="{
+              start: '04:30',
+              step: '00:05',
+              end: '23:30',
+              minTime: maskForm.startTime,
+            }"
+          ></el-time-select>
+        </el-form-item>
+        <el-form-item
+          label="教学地点"
+          prop="schoolId"
+          v-if="
+            maskForm.courseScheduleType != 'HIGH_ONLINE' &&
+            maskForm.courseScheduleType != 'MUSIC_NETWORK'
+          "
+        >
+          <el-select
+            v-model.trim="maskForm.schoolId"
+            style="width: 220px !important"
+            filterable
+            clearable
+          >
+            <el-option
+              v-for="(item, index) in schoolList"
+              :key="index"
+              :value="item.id"
+              :label="item.name"
+            ></el-option>
+          </el-select>
+        </el-form-item>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button @click="courseVisible = false">取 消</el-button>
+        <el-button type="primary" @click="submitResetClass">确 定</el-button>
+      </div>
+    </el-dialog>
+    <el-dialog
+      title="修改时间"
+      width="400px"
+      :before-close="handleCloseTimer"
+      :visible.sync="timerVisible"
+    >
+      <el-form :model="timerMask">
+        <el-form-item
+          label="上课日期"
+          :rules="[{ required: true, message: '请选择日期', trigger: 'blur' }]"
+        >
+          <el-date-picker
+            v-model.trim="timerMask.timer"
+            type="date"
+            format="yyyy-MM-dd"
+            value-format="yyyy-MM-dd"
+            :picker-options="{
+              firstDayOfWeek: 1,
+            }"
+            placeholder="选择日期"
+          ></el-date-picker>
+        </el-form-item>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button @click="timerVisible = false">取 消</el-button>
+        <el-button type="primary" @click="batchAdjustmentTime">确 定</el-button>
+      </div>
+    </el-dialog>
+
+    <el-dialog
+      title="补考勤"
+      width="400px"
+      :visible.sync="markAttendance.status"
+    >
+      <el-form>
+        <el-form-item label="签到状态">{{
+          markAttendance.dataInfo.signInStatus | attendanceType
+        }}</el-form-item>
+        <el-form-item label="签到时间">{{
+          markAttendance.dataInfo.signInTime
+        }}</el-form-item>
+        <el-form-item label="签退状态">{{
+          markAttendance.dataInfo.signOutStatus | attendanceOutType
+        }}</el-form-item>
+        <el-form-item label="签退时间">{{
+          markAttendance.dataInfo.signOutTime
+        }}</el-form-item>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button @click="markAttendance.status = false">取 消</el-button>
+        <el-button
+          type="primary"
+          :disabled="
+            markAttendance.dataInfo.signOutStatus == 1 &&
+            markAttendance.dataInfo.signInStatus == 1
+              ? true
+              : false
+          "
+          @click="batchAdjustmentTime"
+          >确定补卡</el-button
+        >
+      </div>
+    </el-dialog>
+
+    <el-dialog title="点名表" width="800px" :visible.sync="rollCall.status">
+      <el-table :data="rollCall.gridData">
+        <el-table-column
+          align="center"
+          property="userName"
+          label="学员姓名"
+        ></el-table-column>
+        <el-table-column
+          align="center"
+          property="phone"
+          label="手机号"
+        ></el-table-column>
+        <el-table-column
+          align="center"
+          property="subjectName"
+          label="学员声部"
+        ></el-table-column>
+        <el-table-column align="center" label="到课状态">
+          <template slot-scope="scope">{{
+            scope.row.status | studentCallName
+          }}</template>
+        </el-table-column>
+        <el-table-column
+          align="center"
+          v-if="!rollCall.selectItem.settlementTime"
+          label="操作"
+          width="240px"
+        >
+          <template slot-scope="scope">
+            <el-button
+              size="mini"
+              @click="onChangeRollCall('TRUANT', scope.row)"
+              type="primary"
+              round
+              >未到</el-button
+            >
+            <el-button
+              size="mini"
+              @click="onChangeRollCall('LEAVE', scope.row)"
+              type="warning"
+              round
+              >请假</el-button
+            >
+            <el-button
+              size="mini"
+              @click="onChangeRollCall('NORMAL', scope.row)"
+              type="success"
+              round
+              >到课</el-button
+            >
+          </template>
+        </el-table-column>
+      </el-table>
+      <pagination
+        sync
+        :total.sync="rollCall.total"
+        :page.sync="rollCall.page"
+        :limit.sync="rollCall.limit"
+        :page-sizes="rollCall.page_size"
+        @pagination="getCallName"
+      />
+    </el-dialog>
+  </div>
+</template>
+<script>
+import dayjs from "dayjs";
+import pagination from "@/components/Pagination/index";
+import { bathDelete } from "@/api/vipSeting";
+import {
+  resetCourse,
+  getMusicGroupAllClass,
+  getCourseSchedule,
+  updateTeacherAttendance,
+  findAttendanceStudentByCourseWithPage,
+  updateStudentAttendances,
+  cleanAttendance,
+  getOrganCourseDurationSettings,
+} from "@/api/buildTeam";
+import { permission } from "@/utils/directivePage";
+import { diffTimerFormMinute, addTimerFormMinute } from "@/utils/date";
+import { classTimeList, musicCourseType } from "@/utils/searchArray";
+import { getSchool } from "@/api/systemManage";
+import cleanDeep from "clean-deep";
+import { Export } from "@/utils/downLoadFile";
+import { getMusicGroupCourseScheduleStatistics } from "../api";
+let that;
+export default {
+  name: "tcourseList",
+  data() {
+    return {
+      classTimeList,
+      courseArray: musicCourseType,
+      typeVisible: false,
+      timerVisible: false,
+      courseVisible: false,
+      searchForm: {
+        courseStatus: "", // 课程类型
+        classStatus: "", // 课程状态
+        timer: [], // 时间
+        class: "",
+        isSettlement: "",
+        homeworkFlag: "",
+        serviceFlag: "",
+      },
+      tableList: [],
+      searchLsit: [],
+      rules: {
+        // 分页规则
+        limit: 10, // 限制显示条数
+        page: 1, // 当前页
+        total: 0, // 总条数
+        page_size: [10, 20, 40, 50], // 选择限制显示条数
+      },
+      maskForm: {
+        teacher: "",
+        assistant: "",
+        date: "",
+        id: "",
+        startTime: "",
+        endTime: "",
+        type: "",
+        timer: "",
+        courseScheduleType: null,
+        address: "",
+        teachMode: "",
+        schoolId: "",
+      },
+      typeForm: {
+        teacher: "",
+        assistant: "",
+        date: "",
+        startTime: "",
+        endTime: "",
+        type: null,
+        id: null,
+      },
+      maskRules: {
+        schoolId: [
+          { required: true, message: "请选教学地点", trigger: "blur" },
+        ],
+        teacher: [
+          { required: true, message: "请选择主教老师名称", trigger: "blur" },
+        ],
+        date: [{ required: true, message: "请选择上课时间", trigger: "blur" }],
+        // startTime: [{ required: true, message: '请选择上课开始时间', trigger: 'blur' },],
+        // endTime: [{ required: true, message: '请选择上课结束时间', trigger: 'blur' },],
+      },
+      typeRules: {
+        type: [{ required: true, message: "请选择课程类型", trigger: "blur" }],
+      },
+      teacherList: [],
+      classList: [],
+      activeCourseList: [],
+      timerMask: {
+        timer: "",
+      },
+      markAttendance: {
+        // 考勤状态
+        status: false,
+        dataInfo: {},
+      },
+      rollCall: {
+        // 点名表
+        status: false,
+        gridData: [],
+        selectItem: {}, // 选中状态
+        limit: 10, // 限制显示条数
+        page: 1, // 当前页
+        total: 0, // 总条数
+        page_size: [10, 20, 40, 50], // 选择限制显示条数
+      },
+      organId: "",
+      schoolList: [],
+      courseTimeList: {},
+      typeTimeList: [],
+      detail: {
+        attendanceRate: "0.00%",
+        homeworkCommitRate: "0.00%",
+        standardRate: "0.00%",
+      },
+    };
+  },
+  components: {
+    pagination,
+  },
+  created() {
+    that = this;
+  },
+  mounted() {
+    this.init();
+    getSchool({ organId: this.$route.query.organId }).then((res) => {
+      if (res.code == 200) {
+        this.schoolList = res.data;
+      }
+    });
+  },
+  activated() {
+    this.init();
+  },
+  methods: {
+    async init() {
+      this.teamid = this.$route.query.id;
+      this.organId = this.$route.query.organId;
+      try {
+        const res = await getOrganCourseDurationSettings({
+          organId: this.organId,
+        });
+        this.courseTimeList = res.data;
+      } catch {}
+
+      // MusicStore.dispatch('getBaseInfo', {
+      //     data: { musicGroupId: this.teamid }
+      //   }).then((res) => {
+      //     console.log(res)
+      //   })
+      this.getList();
+      // 获取所有老师
+      // findMusicGroupClassTeacher({ musicGroupId: this.teamid }).then(res => {
+      //   if (res.code == 200) {
+      //     this.teacherList = res.data;
+      //   }
+      // })
+      // getTeacher().then(res => {
+      //   if (res.code == 200) {
+      //     this.teacherList = res.data;
+      //   }
+      // });
+
+      // 获取班级列表
+      getMusicGroupAllClass({ musicGroupId: this.teamid }).then((res) => {
+        if (res.code == 200) {
+          this.classList = res.data;
+        }
+      });
+    },
+    onMarkAttendance(item) {
+      // 补考勤
+      this.markAttendance = {
+        status: true,
+        dataInfo: item,
+      };
+    },
+    onCallName(item) {
+      // 点名表
+      this.rollCall.page = 1;
+      this.rollCall.selectItem = item;
+      this.getCallName();
+    },
+    getCallName() {
+      let rollCall = this.rollCall;
+      let params = {
+        page: rollCall.page,
+        rows: rollCall.limit,
+        courseScheduleId: rollCall.selectItem.courseScheduleId,
+      };
+      findAttendanceStudentByCourseWithPage(params).then((res) => {
+        let result = res.data;
+        rollCall.status = true;
+        if (res.code == 200) {
+          rollCall.gridData = result.rows;
+          rollCall.total = result.total;
+        }
+      });
+    },
+    onChangeRollCall(type, row) {
+      let rollCall = this.rollCall;
+      let params = {
+        courseScheduleId: rollCall.selectItem.courseScheduleId,
+        studentAttendances: [
+          {
+            userId: row.studentId,
+            status: type,
+          },
+        ],
+      };
+      updateStudentAttendances(params).then((res) => {
+        if (res.code == 200) {
+          this.$message.success("修改成功");
+          row.status = type;
+          this.getList();
+        } else {
+          this.$message.error(res.msg);
+        }
+      });
+    },
+    permission(str, parent) {
+      return permission(str, parent);
+    },
+    search() {
+      this.rules.page = 1;
+      this.getList();
+    },
+    async getList() {
+      let searchForm = this.searchForm;
+      if (!searchForm.timer) {
+        searchForm.timer = [];
+      }
+      let obj = {
+        classScheduleStatus: searchForm.classStatus || null,
+        classScheduleType: searchForm.courseStatus || null,
+        musicGroupId: this.teamid,
+        startTime: searchForm.timer[0] || null,
+        endTime: searchForm.timer[1] || null,
+        page: this.rules.page,
+        rows: this.rules.limit,
+        classGroupId: searchForm.class || null,
+        isSettlement: searchForm.isSettlement || null,
+        homeworkFlag: searchForm.homeworkFlag,
+        serviceFlag: searchForm.serviceFlag,
+      };
+      getCourseSchedule(obj).then((res) => {
+        if (res.code == 200) {
+          this.tableList = res.data.rows;
+          this.rules.total = res.data.total;
+        }
+      });
+
+      try {
+        const res = await getMusicGroupCourseScheduleStatistics({ ...obj });
+        if(res.data){
+           this.detail = { ...res.data };
+        }
+
+      } catch (e) {
+        console.log(e);
+      }
+    },
+   async exportCourse(){
+     // 导出
+         let searchForm = this.searchForm;
+      if (!searchForm.timer) {
+        searchForm.timer = [];
+      }
+      let obj = {
+        classScheduleStatus: searchForm.classStatus || null,
+        classScheduleType: searchForm.courseStatus || null,
+        musicGroupId: this.teamid,
+        startTime: searchForm.timer[0] || null,
+        endTime: searchForm.timer[1] || null,
+        page: this.rules.page,
+        rows: this.rules.limit,
+        classGroupId: searchForm.class || null,
+        isSettlement: searchForm.isSettlement || null,
+        homeworkFlag: searchForm.homeworkFlag,
+        serviceFlag: searchForm.serviceFlag,
+      };
+      Export(
+        this,
+        {
+          url: "/api-web/export/exportMusicGroupCourseScheduleDetail",
+          fileName: "乐团课表详情.xls",
+          method: "get",
+          params: {
+            ...obj
+          },
+        },
+        "您确定导出乐团课表详情?"
+      );
+   },
+    resetClass(row) {
+      this.maskForm.teacher = parseInt(row.masterTeacherId);
+      this.maskForm.courseScheduleType = row.courseScheduleType;
+      // this.courseTimeList
+      for (let key in this.courseTimeList) {
+        if (key == row.courseScheduleType) {
+          this.typeTimeList = this.courseTimeList[key].split(",");
+        }
+      }
+      // this.maskForm.type = row.courseScheduleType;
+      this.maskForm.assistant = [];
+      for (let i in row.teachingTeachers) {
+        if (row.teachingTeachers[i].teacherRole == "TEACHING") {
+          this.maskForm.assistant.push(row.teachingTeachers[i].userId);
+        }
+      }
+      this.maskForm.date = row.classDate;
+      this.$set(
+        this.maskForm,
+        "startTime",
+        row.startClassTimeStr.substring(0, 5)
+      );
+      let time = diffTimerFormMinute(
+        row.classDate,
+        row.startClassTimeStr,
+        row.endClassTimeStr
+      );
+      this.maskForm.timer = time;
+      this.maskForm.endTime = addTimerFormMinute(
+        row.classDate,
+        row.startClassTimeStr,
+        time
+      );
+      // this.maskForm.endTime = row.endClassTimeStr.substring(0, 5);
+      this.maskForm.id = row.courseScheduleId;
+      this.maskForm.schoolId = row.schoolId;
+      this.courseVisible = true;
+
+      // 修改课时
+
+      // let obj = {
+      //   actualTeacherId: this.maskForm.teacher,
+      //   classDate: this.maskForm.date,
+      //   classGroupId: row.id
+      // }
+    },
+    removeSingleClass(row) {
+      this.$confirm("是否删除该课程?", "提示", {
+        confirmButtonText: "确定",
+        cancelButtonText: "取消",
+        type: "warning",
+      })
+        .then(() => {
+          let courseScheduleIds = row.courseScheduleId;
+          bathDelete({ courseScheduleIds }).then((res) => {
+            if (res.code == 200) {
+              this.$message.success("删除成功");
+              this.getList();
+            }
+          });
+        })
+        .catch(() => {});
+    },
+    removeCourses() {
+      // 批量删除
+      if (this.activeCourseList.length < 1) {
+        this.$message.error("请至少选择一节课");
+        return;
+      }
+      let arr = [];
+      arr = this.activeCourseList.map((item) => {
+        return item.courseScheduleId;
+      });
+      this.$confirm("是否删除该课程?", "提示", {
+        confirmButtonText: "确定",
+        cancelButtonText: "取消",
+        type: "warning",
+      })
+        .then(() => {
+          let courseScheduleIds = arr.join(",");
+          bathDelete({ courseScheduleIds }).then((res) => {
+            if (res.code == 200) {
+              this.$message.success("删除成功");
+              this.getList();
+            }
+          });
+        })
+        .catch(() => {});
+    },
+    submitResetClass() {
+      let maskForm = this.maskForm;
+      let diff = dayjs(maskForm.date + " " + maskForm.startTime).diff(
+        new Date(),
+        "second"
+      );
+      if (diff <= 0) {
+        this.$message.error("课程开始时间必须大于当前时间");
+        return;
+      }
+      if (!maskForm.startTime || !maskForm.endTime) {
+        this.$message.error("请填写开始时间或结束时间");
+        return;
+      }
+      this.$confirm("是否确定?", "提示", {
+        confirmButtonText: "确定",
+        cancelButtonText: "取消",
+        type: "warning",
+      })
+        .then(() => {
+          let teachingTeacherIdList = maskForm.assistant.join(",");
+          if (teachingTeacherIdList.length <= 0) {
+            let teachingTeacherIdList = null;
+          }
+          let obj = {
+            actualTeacherId: maskForm.teacher,
+            startClassTimeStr: maskForm.startTime,
+            endClassTimeStr: maskForm.endTime,
+            id: maskForm.id,
+            teachingTeacherIdList,
+            classDate: maskForm.date,
+            type: maskForm.type,
+            groupType: "MUSIC",
+            schoolId: maskForm.schoolId,
+          };
+          resetCourse(cleanDeep(obj)).then((res) => {
+            if (res.code == 200) {
+              this.$message.success("修改成功");
+              this.getList();
+              this.courseVisible = false;
+            }
+            if (res.code == 206) {
+              this.$confirm(`当前课程课酬预计为0,是否继续`, "提示", {
+                confirmButtonText: "确定",
+                cancelButtonText: "取消",
+                type: "warning",
+              }).then((res) => {
+                obj.allowZeroSalary = true;
+                resetCourse(cleanDeep(obj)).then((res) => {
+                  if (res.code == 200) {
+                    this.$message.success("修改成功");
+                    this.getList();
+                    this.courseVisible = false;
+                  }
+                });
+              });
+            }
+          });
+        })
+        .catch(() => {});
+    },
+    handleClose() {
+      this.courseVisible = false;
+      (this.maskForm = {
+        teacher: "",
+        assistant: "",
+        date: "",
+        id: "",
+        startTime: "",
+        endTime: "",
+        schoolId: null,
+      }),
+        this.$refs["maskForm"].resetFields();
+    },
+    handleSelectionChange(val) {
+      this.activeCourseList = val;
+    },
+    checkSelectable(val) {
+      return val.courseScheduleStatus == "NOT_START";
+      // return true;
+    },
+    batchAdjustmentTime() {
+      let tempData = this.markAttendance.dataInfo;
+      let params = {
+        teacherId: tempData.masterTeacherId,
+        courseScheduleId: tempData.courseScheduleId,
+        signInStatus: 1,
+        signOutStatus: 1,
+      };
+      updateTeacherAttendance(params).then((res) => {
+        if (res.code == 200) {
+          this.$message.success("补卡成功");
+          this.markAttendance.status = false;
+          this.getList();
+        } else {
+          this.$message.error(res.msg);
+        }
+      });
+    },
+    handleCloseTimer() {
+      this.timerVisible = false;
+      this.timerMask.timer = "";
+    },
+    resetTimer() {
+      if (this.activeCourseList.length < 1) {
+        this.$message.error("请至少选择一节课");
+        return;
+      }
+      this.timerVisible = true;
+    },
+    resetType(row) {
+      this.typeForm.type = row.courseScheduleType;
+      this.typeForm.id = row.courseScheduleId;
+      this.typeForm.teacher = parseInt(row.masterTeacherId);
+      // this.maskForm.type = row.courseScheduleType;
+
+      this.typeForm.assistant = [];
+      for (let i in row.teachingTeachers) {
+        if (row.teachingTeachers[i].teacherRole == "TEACHING") {
+          this.typeForm.assistant.push(row.teachingTeachers[i].userId);
+        }
+      }
+      this.typeForm.date = row.classDate;
+      this.$set(
+        this.typeForm,
+        "startTime",
+        row.startClassTimeStr.substring(0, 5)
+      );
+      this.typeForm.endTime = row.endClassTimeStr.substring(0, 5);
+      //  console.log(row.type)
+      this.typeVisible = true;
+    },
+    submitResetType() {
+      this.$refs.typeForm.validate((res) => {
+        if (res) {
+          let teachingTeacherIdList = this.typeForm.assistant.join(",");
+          if (teachingTeacherIdList.length <= 0) {
+            let teachingTeacherIdList = null;
+          }
+          let obj = {
+            actualTeacherId: this.typeForm.teacher,
+            startClassTimeStr: this.typeForm.startTime,
+            endClassTimeStr: this.typeForm.endTime,
+            id: this.typeForm.id,
+            type: this.typeForm.type,
+            teachingTeacherIdList,
+            classDate: this.typeForm.date,
+          };
+          resetCourse(obj).then((res) => {
+            if (res.code == 200) {
+              this.$message.success("修改成功");
+              this.getList();
+              this.typeVisible = false;
+            }
+          });
+        }
+      });
+    },
+    // 清除考勤
+    clearAttend(row) {
+      this.$confirm("是否清除考勤记录?", "提示", {
+        confirmButtonText: "确定",
+        cancelButtonText: "取消",
+        type: "warning",
+      })
+        .then(() => {
+          cleanAttendance({ courseScheduleIds: row.courseScheduleId }).then(
+            (res) => {
+              if (res.code == 200) {
+                this.$message.success("清除成功");
+                this.getList();
+              } else {
+                this.$message.error(res.msg);
+              }
+            }
+          );
+        })
+        .catch(() => {});
+    },
+    changeStartTime(val) {
+      this.$nextTick((res) => {
+        this.maskForm.endTime = addTimerFormMinute(
+          this.maskForm.date,
+          val,
+          this.maskForm.timer
+        );
+      });
+    },
+    changeTime(val) {
+      this.$nextTick((res) => {
+        this.maskForm.endTime = addTimerFormMinute(
+          this.maskForm.date,
+          this.maskForm.startTime,
+          val
+        );
+      });
+    },
+    onReSet() {
+      this.$refs.searchForm.resetFields();
+      this.search();
+    },
+    beginDate() {
+      return {
+        firstDayOfWeek: 1,
+        disabledDate(time) {
+          return time.getTime() + 86400000 <= new Date().getTime();
+          //开始时间不选时,结束时间最大值小于等于当天
+        },
+      };
+    },
+  },
+  filters: {
+    studentCallName: (value) => {
+      let template = {
+        NORMAL: "到课",
+        TRUANT: "未到",
+        LEAVE: "请假",
+        DROP_OUT: "退学",
+        LATE: "迟到",
+        "": "未到",
+      };
+      return template[value];
+    },
+  },
+  watch: {
+    "maskForm.timer"(val) {
+      this.maskForm.endTime = addTimerFormMinute(
+        this.maskForm.date,
+        this.maskForm.startTime,
+        val
+      );
+    },
+  },
+  computed: {
+    nowTime() {
+      // console.log(that.maskForm.date)
+      let str = "04:30:00";
+      if (that.maskForm.date == dayjs(new Date()).format("YYYY-MM-DD")) {
+        str = dayjs(new Date()).format("HH:mm:ss");
+      }
+
+      return str;
+    },
+  },
+};
+</script>
+<style lang="scss" scoped>
+.cl-container {
+  .topFrom {
+    margin: 20px 30px 0;
+    .classlist {
+      display: flex;
+      flex-direction: row;
+      justify-content: flex-start;
+      align-items: center;
+      ul {
+        li {
+          list-style: none;
+        }
+      }
+    }
+  }
+  // .searchForm {
+  //   // margin: 0 30px;
+  // }
+}
+.btnWraps {
+  display: flex;
+  flex-direction: row;
+  justify-content: flex-start;
+  div {
+    margin-right: 20px;
+  }
+}
+.maskForm {
+  /deep/.el-input {
+    width: 220px;
+  }
+}
+</style>