فهرست منبع

课后作业

1
mo 2 سال پیش
والد
کامیت
b58a37ff5e

+ 1 - 1
src/api/afterSchool.js

@@ -5,7 +5,7 @@ let api = '/api-web'
 // 课外训练
 export function queryPageList(data) {
     return request({
-      url: api + '/extracurricularExercises/queryPageList',
+      url: api + '/extracurricularExercises/queryPageList/v2',
       method: 'get',
       params: data
     })

+ 6 - 0
src/constant/index.js

@@ -544,3 +544,9 @@ export const serviceProvider = {
   rongCloud: "融云",
   tencentCloud: "腾讯云"
 };
+
+export const palyLevel = {
+  "BEGINNER":'入门级',
+  "ADVANCED":'进阶级',
+  "PERFORMER":'大师级'
+}

+ 1 - 0
src/router/index.js

@@ -365,6 +365,7 @@ export const asyncRoutes = {
   // afterWorkList:()=>import('@/views/afterSchoolManager/afterWorkList'),
   // 课外管理
   afterSchoolManager: () => import("@/views/afterSchoolManager"),
+  examination:()=>import("@/views/afterSchoolManager/examination"),
   afterSchoolDetail: () =>
     import("@/views/afterSchoolManager/afterSchoolDetail"),
   // 运营管理 学员列表

+ 4 - 0
src/utils/vueFilter.js

@@ -883,6 +883,10 @@ Vue.filter("serviceProvider", value => {
   return constant.serviceProvider[value];
 });
 
+// palyLevel 难度
+Vue.filter("palyLevelFilter", value => {
+  return constant.palyLevel[value];
+});
 Vue.filter("usageStatus", value => {
   let obj = {
     0: "未使用",

+ 96 - 62
src/views/afterSchoolManager/afterSchoolList.vue

@@ -15,23 +15,26 @@
       >
         <el-form-item>
           <el-input
-            v-model.trim="searchForm.listSearch"
+            class="searchInput"
+            v-model.trim="searchForm.search"
             clearable
-            @keyup.enter.native="(e) =>{
+            @keyup.enter.native="
+              (e) => {
                 e.target.blur();
                 $refs.saveForm.save();
                 search();
-              }"
-            placeholder="请输入标题"
+              }
+            "
+            placeholder="乐团名称/老师"
           ></el-input>
         </el-form-item>
-        <el-form-item>
+        <!-- <el-form-item>
            <remote-search
             :commit="'setTeachers'"
             v-model="searchForm.teacherId"
             :isForzenWithQueryCondition="true"
           />
-        </el-form-item>
+        </el-form-item> -->
         <el-form-item prop="organIdList">
           <el-select
             class="multiple"
@@ -50,6 +53,18 @@
         </el-form-item>
         <el-form-item>
           <el-select
+            v-model.trim="searchForm.type"
+            class="organSelect"
+            filterable
+            clearable
+            placeholder="请选择类型"
+          >
+            <el-option label="课外练习" value="EXTRACURRICULAR"></el-option>
+            <el-option label="额外练习" value="EXTRA"></el-option>
+          </el-select>
+        </el-form-item>
+        <!-- <el-form-item>
+          <el-select
             v-model.trim="searchForm.cloudHomeworkFlag"
             class="organSelect"
             filterable
@@ -59,8 +74,8 @@
             <el-option label="是" :value="true"></el-option>
             <el-option label="否" :value="false"></el-option>
           </el-select>
-        </el-form-item>
-        <el-form-item>
+        </el-form-item> -->
+        <!-- <el-form-item>
           <el-date-picker
             v-model.trim="searchForm.listTimer"
             style="width: 410px"
@@ -73,7 +88,7 @@
               firstDayOfWeek: 1,
             }"
           ></el-date-picker>
-        </el-form-item>
+        </el-form-item> -->
         <el-form-item>
           <el-button type="danger" native-type="submit">搜索</el-button>
           <el-button native-type="reset" type="primary">重置</el-button>
@@ -85,42 +100,48 @@
           :header-cell-style="{ background: '#EDEEF0', color: '#444' }"
           :data="tableList"
         >
-          <el-table-column align="center" prop="teacherName" label="老师姓名">
+          <el-table-column align="center" prop="organName" label="分部">
             <template slot-scope="scope">
-              <copy-text v-if="scope.row.teacher">
-                {{ scope.row.teacher.username }}
+              <copy-text>
+                {{ scope.row.organName }}
               </copy-text>
             </template>
           </el-table-column>
+          <el-table-column align="center" prop="organName" label="乐团">
+            <template slot-scope="scope">
+              {{ scope.row.musicGroupName }}
+            </template>
+          </el-table-column>
+          <!-- <el-table-column align="center" prop="createTime" label="训练班级">
+            <template slot-scope="scope">
+              {{ scope.row.classGroupName }}
+            </template>
+          </el-table-column> -->
           <el-table-column align="center" prop="createTime" label="布置时间">
             <template slot-scope="scope">
               {{ scope.row.createTime | dateForMinFormat }}
             </template>
           </el-table-column>
-          <el-table-column align="center" prop="title" label="训练标题">
+          <el-table-column align="center" prop="createTime" label="练习类型">
             <template slot-scope="scope">
-              <copy-text>
-                {{ scope.row.title }}
-              </copy-text>
+              {{ scope.row.type == "EXTRACURRICULAR" ? "课外练习" : "额外练习" }}
             </template>
           </el-table-column>
-
-          <el-table-column align="center" prop="organName" label="老师分部">
+          <el-table-column align="center" prop="teacherName" label="布置老师">
             <template slot-scope="scope">
-              <copy-text>
-                {{ scope.row.organName }}
+              <copy-text v-if="scope.row.teacher">
+                {{ scope.row.teacher.username }}
               </copy-text>
             </template>
           </el-table-column>
-          <el-table-column
-            align="center"
-            prop="actualTeacherName"
-            label="是否云教练布置"
-          >
+
+          <el-table-column align="center" prop="title" label="应交人数">
+            <template slot-scope="scope"> {{ scope.row.expectNum || 0 }}人 </template>
+          </el-table-column>
+
+          <el-table-column align="center" prop="actualTeacherName" label="完成人数">
             <template slot-scope="scope">
-              <div>
-                {{ scope.row.musicScoreId ? "是" : "否" }}
-              </div>
+              <div>{{ scope.row.completedNum || 0 }}人</div>
             </template>
           </el-table-column>
           <el-table-column align="center" prop="expireDate" label="截止时间">
@@ -133,9 +154,7 @@
             <template slot-scope="scope">
               <div>
                 <auth auths="afterSchollList/look">
-                  <el-button type="text" @click="lookDetail(scope.row)"
-                    >查看</el-button
-                  >
+                  <el-button type="text" @click="lookDetail(scope.row)">查看</el-button>
                 </auth>
               </div>
             </template>
@@ -151,6 +170,14 @@
           @pagination="getList"
         />
       </div>
+      <el-dialog
+        title="详情"
+        :visible.sync="classVisible"
+        width="1000px"
+        v-if="classVisible"
+      >
+        <courseWorkeDetail :studentExerciseId="activeRow.id" />
+      </el-dialog>
     </div>
     <!-- <el-dialog title="课外训练详情"
                :visible.sync="afterSchoolVisible"
@@ -197,17 +224,18 @@
 <script>
 import pagination from "@/components/Pagination/index";
 import remoteSearch from "@/components/remote-search";
+import courseWorkeDetail from "@/views/afterSchoolManager/components/courseWorkeDetail.vue";
 import { queryPageList } from "@/api/afterSchool";
 export default {
-  components: { pagination, remoteSearch },
+  components: { pagination, remoteSearch, courseWorkeDetail },
   data() {
     return {
       searchForm: {
-        listSearch: null,
+        search: null,
         listTimer: [],
         teacherId: null,
         organIdList: null,
-        cloudHomeworkFlag:null
+        type: null,
       },
       rules: {
         // 分页规则
@@ -220,6 +248,8 @@ export default {
       visibleForm: {
         createTime: null,
       },
+      classVisible: false,
+      activeRow: null,
     };
   },
   //生命周期 - 创建完成(可以访问当前this实例)
@@ -236,20 +266,16 @@ export default {
   },
   methods: {
     getNow() {
-      let now = new Date();
-      let startDate = new Date(
-        Date.UTC(now.getFullYear(), now.getMonth(), now.getDate())
-      )
-        .toISOString()
-        .slice(0, 10);
-      let endDate = new Date(
-        Date.UTC(now.getFullYear(), now.getMonth(), now.getDate())
-      )
-        .toISOString()
-        .slice(0, 10);
-      this.searchForm.listTimer = [];
-      this.searchForm.listTimer.push(startDate);
-      this.searchForm.listTimer.push(endDate);
+      // let now = new Date();
+      // let startDate = new Date(Date.UTC(now.getFullYear(), now.getMonth(), now.getDate()))
+      //   .toISOString()
+      //   .slice(0, 10);
+      // let endDate = new Date(Date.UTC(now.getFullYear(), now.getMonth(), now.getDate()))
+      //   .toISOString()
+      //   .slice(0, 10);
+      // this.searchForm.listTimer = [];
+      // this.searchForm.listTimer.push(startDate);
+      // this.searchForm.listTimer.push(endDate);
     },
     init() {
       this.getList();
@@ -263,17 +289,15 @@ export default {
       }
       obj.page = this.rules.page;
       (obj.rows = this.rules.limit),
-        this.searchForm.teacherId
-          ? (obj.teacherId = this.searchForm.teacherId)
-          : null;
-      this.searchForm.listSearch
-        ? (obj.title = this.searchForm.listSearch)
-        : null;
+        this.searchForm.teacherId ? (obj.teacherId = this.searchForm.teacherId) : null;
+      this.searchForm.search ? (obj.search = this.searchForm.search) : null;
       this.searchForm.organIdList
         ? (obj.organIdList = this.searchForm.organIdList)
         : null;
 
-        obj.cloudHomeworkFlag = this.searchForm.cloudHomeworkFlag
+      obj.cloudHomeworkFlag = this.searchForm.cloudHomeworkFlag;
+      obj.studentAssignFlag = false;
+      obj.type = this.searchForm.type ? this.searchForm.type : null;
       queryPageList(obj).then((res) => {
         if (res.code == 200) {
           this.tableList = res.data.rows;
@@ -287,25 +311,35 @@ export default {
     },
     onReSet() {
       this.searchForm = {
-        listSearch: null,
+        search: null,
         listTimer: [],
         teacherId: null,
         organIdList: null,
-        cloudHomeworkFlag:null
+        type: null,
       };
       this.getNow();
       this.search();
     },
     lookDetail(row) {
-      this.$router.push({
-        path: "/business/afterSchoolDetail",
-        query: { extracurricularExercisesId: row.id, title: row.title },
-      });
+      this.activeRow = row;
+      if (row.versionTag == "v1") {
+        this.$router.push({
+          path: "/business/afterSchoolDetail",
+          query: { extracurricularExercisesId: row.id, title: row.title },
+        });
+      } else {
+        this.classVisible = true;
+      }
     },
   },
 };
 </script>
-<style lang='scss' scoped>
+<style lang="scss" scoped>
+.searchInput {
+  ::v-deep .el-input__inner {
+    width: 280px !important;
+  }
+}
 .schoolCell {
   width: 400px;
   color: #333;

+ 117 - 146
src/views/afterSchoolManager/afterWorkList.vue

@@ -25,7 +25,7 @@
               }
             "
             clearable
-            placeholder="请输入标题 学生姓名"
+            placeholder="老师"
           ></el-input>
         </el-form-item>
         <el-form-item prop="organId">
@@ -46,6 +46,18 @@
         </el-form-item>
         <el-form-item>
           <el-select
+            v-model.trim="searchForm.type"
+            class="organSelect"
+            filterable
+            clearable
+            placeholder="请选择类型"
+          >
+            <el-option label="课外练习" value="EXTRACURRICULAR"></el-option>
+            <el-option label="额外练习" value="EXTRA"></el-option>
+          </el-select>
+        </el-form-item>
+        <!-- <el-form-item>
+          <el-select
             v-model.trim="searchForm.cloudHomeworkFlag"
             class="organSelect"
             filterable
@@ -58,21 +70,13 @@
         </el-form-item>
 
         <el-form-item>
-          <el-select
-            placeholder="是否提交"
-            v-model="searchForm.status"
-            clearable
-          >
+          <el-select placeholder="是否提交" v-model="searchForm.status" clearable>
             <el-option label="是" value="1"></el-option>
             <el-option label="否" value="0"></el-option>
           </el-select>
         </el-form-item>
         <el-form-item>
-          <el-select
-            placeholder="是否评价"
-            v-model="searchForm.isReplied"
-            clearable
-          >
+          <el-select placeholder="是否评价" v-model="searchForm.isReplied" clearable>
             <el-option label="是" value="1"></el-option>
             <el-option label="否" value="0"></el-option>
           </el-select>
@@ -124,17 +128,17 @@
               firstDayOfWeek: 1,
             }"
           ></el-date-picker>
-        </el-form-item>
+        </el-form-item> -->
 
         <el-form-item>
           <el-button type="danger" native-type="submit">搜索</el-button>
           <el-button type="primary" native-type="reset">重置</el-button>
-          <el-button
+          <!-- <el-button
             @click="onExport"
             type="primary"
             v-permission="'export/extraExercisesReplys'"
             >导出</el-button
-          >
+          > -->
         </el-form-item>
       </save-form>
       <div class="tableWrap">
@@ -143,27 +147,39 @@
           :header-cell-style="{ background: '#EDEEF0', color: '#444' }"
           :data="tableList"
         >
-          <el-table-column
-            align="center"
-            prop="createTime"
-            label="布置时间"
-            width="150"
-          >
+          <el-table-column align="center" prop="organName" label="分部"></el-table-column>
+          <el-table-column align="center" prop="createTime" label="布置时间" width="150">
             <template slot-scope="scope">{{
               scope.row.createTime | dateForMinFormat
             }}</template>
           </el-table-column>
-          <el-table-column
-            align="center"
-            prop="expireDate"
-            label="截止时间"
-            width="150"
-          >
+          <el-table-column align="center" prop="createTime" label="练习类型">
+            <template slot-scope="scope">
+              {{ scope.row.type == "EXTRACURRICULAR" ? "课后练习" : "额外练习" }}
+            </template>
+          </el-table-column>
+          <el-table-column align="center" prop="teacherName" label="布置老师">
+            <template slot-scope="scope">
+              <copy-text v-if="scope.row.teacher">
+                {{ scope.row.teacher.username }}
+              </copy-text>
+            </template>
+          </el-table-column>
+          <el-table-column align="center" prop="expireDate" label="截止时间" width="150">
             <template slot-scope="scope">{{
               scope.row.expireDate | dateForMinFormat
             }}</template>
           </el-table-column>
-          <el-table-column align="center" prop="title" label="训练标题">
+          <el-table-column align="center" prop="title" label="应交人数">
+            <template slot-scope="scope"> {{ scope.row.expectNum || 0 }}人 </template>
+          </el-table-column>
+
+          <el-table-column align="center" prop="actualTeacherName" label="完成人数">
+            <template slot-scope="scope">
+              <div>{{ scope.row.completedNum || 0 }}人</div>
+            </template>
+          </el-table-column>
+          <!-- <el-table-column align="center" prop="title" label="训练标题">
             <template slot-scope="scope">
               <div>
                 <div v-if="scope.row.extracurricularExercises">
@@ -171,25 +187,16 @@
                 </div>
               </div>
             </template>
-          </el-table-column>
-          <el-table-column
-            align="center"
-            prop="teacherName"
-            label="老师"
-          ></el-table-column>
-          <el-table-column
-            align="center"
-            prop="organName"
-            label="学员分部"
-          ></el-table-column>
-          <el-table-column align="center" prop="createTime" label="学生姓名">
+          </el-table-column> -->
+
+          <!-- <el-table-column align="center" prop="createTime" label="学生姓名">
             <template slot-scope="scope">
               <div>
                 <div v-if="scope.row.user">{{ scope.row.user.username }}</div>
               </div>
             </template>
-          </el-table-column>
-          <el-table-column
+          </el-table-column> -->
+          <!-- <el-table-column
             align="center"
             prop="userId"
             label="学生编号"
@@ -199,12 +206,7 @@
               <div>{{ scope.row.status ? "是" : "否" }}</div>
             </template>
           </el-table-column>
-          <el-table-column
-            align="center"
-            prop="createTime"
-            label="提交时间"
-            width="150"
-          >
+          <el-table-column align="center" prop="createTime" label="提交时间" width="150">
             <template slot-scope="scope">{{
               scope.row.submitTime | dateForMinFormat
             }}</template>
@@ -214,12 +216,7 @@
               <div>{{ scope.row.isReplied ? "是" : "否" }}</div>
             </template>
           </el-table-column>
-          <el-table-column
-            align="center"
-            label="是否有vip"
-            width="100"
-            fixed="right"
-          >
+          <el-table-column align="center" label="是否有vip" width="100" fixed="right">
             <template slot-scope="scope">
               <div>{{ scope.row.existVipCourse ? "是" : "否" }}</div>
             </template>
@@ -235,17 +232,13 @@
               <div>{{ scope.row.isRepliedTimely ? "是" : "否" }}</div>
             </template>
           </el-table-column>
-          <el-table-column
-            align="center"
-            prop="actualTeacherName"
-            label="是否云教练布置"
-          >
+          <el-table-column align="center" prop="actualTeacherName" label="是否云教练布置">
             <template slot-scope="scope">
               <div>
                 {{ scope.row.musicScoreId ? "是" : "否" }}
               </div>
             </template>
-          </el-table-column>
+          </el-table-column> -->
           <!-- <el-table-column align="center" prop="teacherName" label="老师姓名">
             <template slot-scope="scope">
               <div v-if="scope.row.extracurricularExercises&&scope.row.extracurricularExercises.teacher">{{scope.row.extracurricularExercises.teacher.username}}</div>
@@ -274,12 +267,16 @@
           @pagination="getList"
         />
       </div>
+      <el-dialog
+        title="详情"
+        :visible.sync="classVisible"
+        width="1000px"
+        v-if="classVisible"
+      >
+        <courseWorkeDetail :studentExerciseId="activeRow.id" />
+      </el-dialog>
     </div>
-    <el-dialog
-      title="课外训练详情"
-      :visible.sync="afterSchoolVisible"
-      width="600px"
-    >
+    <el-dialog title="课外训练详情" :visible.sync="afterSchoolVisible" width="600px">
       <el-form :model="visibleForm" label-width="100px">
         <el-form-item label="老师姓名">
           <el-input v-model="visibleForm.teacherName" disabled></el-input>
@@ -312,19 +309,9 @@
         </el-form-item>
       </el-form>
     </el-dialog>
-    <el-dialog
-      title="查看训练"
-      width="680px"
-      append-to-body
-      :visible.sync="workVisible"
-    >
+    <el-dialog title="查看训练" width="680px" append-to-body :visible.sync="workVisible">
       <!-- activeUrl -->
-      <video
-        style="width: 640px"
-        :src="activeSrc"
-        ref="dialogVideo"
-        controls="controls"
-      >
+      <video style="width: 640px" :src="activeSrc" ref="dialogVideo" controls="controls">
         您的浏览器不支持视频播放
       </video>
     </el-dialog>
@@ -336,29 +323,25 @@ import pagination from "@/components/Pagination/index";
 import {
   extracurricularExercisesReply,
   findStudentExtraExerciseDetail,
+  queryPageList,
 } from "@/api/afterSchool";
+
 import { getEmployeeOrgan } from "@/api/buildTeam";
 import { Export } from "@/utils/downLoadFile";
 import axios from "axios";
 import { getToken } from "@/utils/auth";
+import courseWorkeDetail from "@/views/afterSchoolManager/components/courseWorkeDetail.vue";
 export default {
   props: ["id", "saveKey"],
-  components: { pagination },
+  components: { pagination, courseWorkeDetail },
   data() {
     const that = this;
     return {
       formSaveKey: that.saveKey || "afterWorkList",
       searchForm: {
         search: null,
-        timer: [],
-        status: null,
-        isReplied: null,
-        isRepliedTimely: null,
-        isView: null,
-        organIdList: null,
-        expireDate: [],
-        existVipCourse: null,
-        cloudHomeworkFlag: null,
+        type: null,
+        organIdList: "",
       },
       rules: {
         // 分页规则
@@ -383,6 +366,8 @@ export default {
       activeSrc: "",
       extracurricularExercisesId: null,
       show: true,
+      classVisible: false,
+      activeRow: null,
     };
   },
   //生命周期 - 创建完成(可以访问当前this实例)
@@ -394,25 +379,22 @@ export default {
   },
   methods: {
     init() {
-      this.extracurricularExercisesId =
-        this.$route.query.extracurricularExercisesId;
-      if (this.extracurricularExercisesId) {
-        this.show = false;
-      }
-      this.searchForm.search = this.$route.query.studentId;
-      if (this.$route.query.startTime && this.$route.query.endTime) {
-        this.searchForm.timer = [
-          this.$route.query.startTime,
-          this.$route.query.endTime,
-        ];
-      }
+      // this.extracurricularExercisesId = this.$route.query.extracurricularExercisesId;
+      // if (this.extracurricularExercisesId) {
+      //   this.show = false;
+      // }
+      // this.searchForm.search = this.$route.query.studentId;
+      // if (this.$route.query.startTime && this.$route.query.endTime) {
+      //   this.searchForm.timer = [this.$route.query.startTime, this.$route.query.endTime];
+      // }
       //  (this.$route.query)
       this.getList();
     },
     getList() {
       // assignStartTime  assignEndTime page search teacherId title
       let obj = this.getDate();
-      extracurricularExercisesReply(obj).then((res) => {
+      obj.studentAssignFlag = true;
+      queryPageList(obj).then((res) => {
         if (res.code == 200) {
           this.tableList = res.data.rows;
           this.rules.total = res.data.total;
@@ -423,47 +405,29 @@ export default {
       this.rules.page = 1;
       this.getList();
     },
-    // 导出
-    async onExport() {
-      let obj = this.getDate();
-      await Export(
-        this,
-        {
-          url: "/api-web/export/extraExercisesReplys",
-          fileName: "课外训练(学员).xls",
-          method: "get",
-          params: obj,
-        },
-        "您确定导出列表?"
-      );
-    },
+
     getDate() {
       let obj = {};
-      if (this.searchForm.timer && this.searchForm.timer.length > 0) {
-        obj.submitStartTime = this.searchForm.timer[0];
-        obj.submitEndTime = this.searchForm.timer[1];
-      }
-      if (this.searchForm.expireDate && this.searchForm.expireDate.length > 0) {
-        obj.expireStartDate = this.searchForm.expireDate[0];
-        obj.expireEndDate = this.searchForm.expireDate[1];
-      }
+      // if (this.searchForm.timer && this.searchForm.timer.length > 0) {
+      //   obj.submitStartTime = this.searchForm.timer[0];
+      //   obj.submitEndTime = this.searchForm.timer[1];
+      // }
+      // if (this.searchForm.expireDate && this.searchForm.expireDate.length > 0) {
+      //   obj.expireStartDate = this.searchForm.expireDate[0];
+      //   obj.expireEndDate = this.searchForm.expireDate[1];
+      // }
       obj.page = this.rules.page;
 
       (obj.rows = this.rules.limit),
-        this.searchForm.teacherId
-          ? (obj.teacherId = this.searchForm.teacherId)
-          : null;
+        this.searchForm.teacherId ? (obj.teacherId = this.searchForm.teacherId) : null;
       this.searchForm.search ? (obj.search = this.searchForm.search) : null;
       this.searchForm.status ? (obj.status = this.searchForm.status) : null;
-      this.searchForm.isReplied
-        ? (obj.isReplied = this.searchForm.isReplied)
-        : null;
+      this.searchForm.isReplied ? (obj.isReplied = this.searchForm.isReplied) : null;
       this.searchForm.isRepliedTimely
         ? (obj.isRepliedTimely = this.searchForm.isRepliedTimely)
         : null;
       this.searchForm.isView ? (obj.isView = this.searchForm.isView) : null;
-      this.extracurricularExercisesId &&
-      this.extracurricularExercisesId != "yes"
+      this.extracurricularExercisesId && this.extracurricularExercisesId != "yes"
         ? (obj.extracurricularExercisesId = this.extracurricularExercisesId)
         : null;
       this.searchForm.organIdList
@@ -473,6 +437,7 @@ export default {
         ? (obj.existVipCourse = this.searchForm.existVipCourse)
         : null;
       obj.cloudHomeworkFlag = this.searchForm.cloudHomeworkFlag;
+      obj.type = this.searchForm.type ? this.searchForm.type : null;
       return obj;
     },
     onReSet() {
@@ -487,6 +452,7 @@ export default {
         expireDate: [],
         existVipCourse: null,
         cloudHomeworkFlag: null,
+        type: null,
       };
       this.extracurricularExercisesId = null;
       this.getList();
@@ -494,22 +460,27 @@ export default {
     lookDetail(row) {
       //   this.afterSchoolVisible = true;
       //    (row)
-      findStudentExtraExerciseDetail({
-        studentExerciseId: row.id,
-      }).then((res) => {
-        if (res.code == 200) {
-          this.visibleForm = {
-            expiryDate: res.data.expiryDate,
-            teacherName: res.data.teacherName,
-            title: row.extracurricularExercises.title,
-            studentName: res.data.studentName,
-            content: res.data.content,
-            attachments: res.data.attachments.split(","),
-          };
-          //    (this.visibleForm)
-          this.afterSchoolVisible = true;
-        }
-      });
+      this.activeRow = row;
+      if (row.versionTag == "v1") {
+        findStudentExtraExerciseDetail({
+          studentExerciseId: row.id,
+        }).then((res) => {
+          if (res.code == 200) {
+            this.visibleForm = {
+              expiryDate: res.data.expiryDate,
+              teacherName: res.data.teacherName,
+              title: row.extracurricularExercises.title,
+              studentName: res.data.studentName,
+              content: res.data.content,
+              attachments: res.data.attachments.split(","),
+            };
+            //    (this.visibleForm)
+            this.afterSchoolVisible = true;
+          }
+        });
+      } else {
+        this.classVisible = true;
+      }
     },
     lookWork(src) {
       this.activeSrc = src;
@@ -525,7 +496,7 @@ export default {
   },
 };
 </script>
-<style lang='scss' scoped>
+<style lang="scss" scoped>
 .schoolCell {
   width: 400px;
   color: #333;

+ 59 - 0
src/views/afterSchoolManager/api.js

@@ -0,0 +1,59 @@
+import request from '@/utils/request2'
+import qs from 'qs'
+let api = '/api-web'
+
+
+export function findCourseHomeworkDetail (data) {
+  return request({
+    url: api + '/extracurricularExercises/findStudentExtraExerciseDetail/v2',
+    method: 'get',
+    params: data
+  })
+}
+
+
+// 获取学生列表
+export function getHomeworkStudent (data) {
+  return request({
+    url: api + '/teacher/findCourseStudentsPublic/v2',
+    method: 'post',
+    data,
+    requestType: "json"
+
+  })
+}
+
+// 获取课程声部
+
+export function getHomeworkSubjectPublic (data) {
+  return request({
+    url: api + '/teacher/findCourseStudentsSubjectPublic/v2',
+    method: 'post',
+    data,
+    requestType: "json"
+
+  })
+}
+
+// 获取进度测评列表
+export function getLessonExamination (data) {
+  return request({
+    url: api + '/lessonExamination/queryPage',
+    method: 'post',
+    data,
+    requestType: "json"
+
+  })
+}
+
+
+// 获取评测学员
+export function getLessonExaminationStudent (data) {
+  return request({
+    url: api + '/lessonExamination/queryStudentPage',
+    method: 'post',
+    data,
+    requestType: "form"
+  })
+}
+

+ 174 - 0
src/views/afterSchoolManager/components/courseWorkeDetail.vue

@@ -0,0 +1,174 @@
+<template>
+  <div>
+    <div class="teacherWrap">
+      <div class="teacherHeader">
+        <el-image
+          style="width: 50px; height: 50px"
+          :src="courseDetail.teacherImg ? courseDetail.teacherImg : tetacherIcon"
+        ></el-image>
+      </div>
+      <div class="courseInfo">
+        <h4>
+          {{ courseDetail.courseScheduleName }}
+        </h4>
+        <span>{{ courseDetail.teacherName }}</span>
+      </div>
+    </div>
+    <el-descriptions class="margin-top" :column="3" direction="vertical">
+      <el-descriptions-item
+        label="乐团"
+        label-class-name="my-label"
+        content-class-name="my-content"
+        >{{ courseDetail.musicGroupName }}</el-descriptions-item
+      >
+      <!-- <el-descriptions-item
+        label="课程编号"
+        label-class-name="my-label"
+        content-class-name="my-content"
+        >{{ courseDetail.courseScheduleId }}</el-descriptions-item
+      > -->
+      <!-- <el-descriptions-item
+        label="上课时间"
+        label-class-name="my-label"
+        content-class-name="my-content"
+      >
+        {{ courseDetail.classDate | dayjsFormat }}
+        {{ courseDetail.startTime | dayjsFormatMinute }}-{{
+          courseDetail.endTime | dayjsFormatMinute
+        }}</el-descriptions-item
+      > -->
+      <el-descriptions-item
+        label="布置时间"
+        label-class-name="my-label"
+        content-class-name="my-content"
+        >{{ courseDetail.assignTime }}</el-descriptions-item
+      >
+      <el-descriptions-item
+        label="截止时间"
+        label-class-name="my-label"
+        content-class-name="my-content"
+        >{{ courseDetail.expiryDate }}</el-descriptions-item
+      >
+      <el-descriptions-item
+        label="完成情况"
+        label-class-name="my-label"
+        content-class-name="my-content"
+        >{{ courseDetail.finishNum }} /
+        {{ courseDetail.studentNum }}</el-descriptions-item
+      >
+    </el-descriptions>
+    <el-tabs v-model.trim="activeName">
+      <el-tab-pane
+        label="学员列表"
+        name="first"
+        v-if="permission('/teamCourseListDetailStudnetList')"
+      >
+        <div v-if="activeName == 'first'">
+          <studentWroks
+            ref="studentWroksRef"
+            :courseScheduleId="studentExerciseId"
+            type="EXTRACURRICULAR"
+          />
+        </div>
+      </el-tab-pane>
+      <el-tab-pane
+        label="练习内容"
+        name="second"
+        v-if="permission('/teamCourseListDetailStudnetList')"
+      >
+        <div v-if="activeName == 'second'">
+          <textConment
+            :trainingDetailList="trainingDetailList"
+            :courseScheduleId="studentExerciseId"
+            type="EXTRACURRICULAR"
+          />
+        </div>
+      </el-tab-pane>
+    </el-tabs>
+  </div>
+</template>
+<script>
+import tetacherIcon from "@/assets/images/base/woman.png";
+import { permission } from "@/utils/directivePage";
+import { findCourseHomeworkDetail } from "../api";
+import textConment from "./textConment.vue";
+import studentWroks from "./studentWroks.vue";
+export default {
+  props: ["studentExerciseId"],
+  components: { studentWroks, textConment },
+  data() {
+    return {
+      tetacherIcon,
+      activeName: "first",
+      courseDetail: {
+        assignTime: "",
+        classDate: "",
+        startTime: "",
+        endTime: "",
+        classGroupName: "",
+        courseScheduleName: "",
+        musicGroupName: "",
+        expiryDate: "",
+        subjectName: "",
+        teacherName: "",
+        teacherImg: "",
+        courseScheduleId: "",
+        finishNum: "",
+        studentNum: "",
+      },
+      trainingDetailList: [],
+    };
+  },
+  mounted() {
+    this.getWorkerDetail();
+  },
+  methods: {
+    async getWorkerDetail() {
+      try {
+        const res = await findCourseHomeworkDetail({
+          studentExerciseId: this.studentExerciseId,
+        });
+        this.courseDetail = { ...res.data };
+        this.trainingDetailList = res.data.trainingDetailList;
+      } catch (e) {
+        console.log(e);
+      }
+    },
+    permission(str, parent) {
+      return permission(str, parent);
+    },
+  },
+};
+</script>
+<style lang="scss" scoped>
+::v-deep .my-label {
+  font-size: 12px;
+  color: #999;
+}
+
+::v-deep .my-content {
+  color: #333;
+  font-size: 14px;
+  font-weight: bold !important;
+}
+.teacherWrap {
+  display: flex;
+  flex-direction: row;
+  align-items: center;
+  margin-bottom: 20px;
+  .teacherHeader {
+    margin-right: 10px;
+  }
+  .courseInfo {
+    h4 {
+      color: #101010;
+      font-size: 14px;
+      margin-bottom: 3px;
+    }
+    span {
+      color: #999;
+      font-size: 12px;
+    }
+  }
+}
+</style>

+ 148 - 0
src/views/afterSchoolManager/components/examinationDetail.vue

@@ -0,0 +1,148 @@
+<template>
+  <div>
+    <div>
+      <!-- <el-checkbox-group
+        v-if="subjectList.length > 1"
+        @change="checkSubject"
+        v-model="subjectId"
+        size="medium"
+        :max="1"
+        style="margin-bottom: 20px"
+      >
+        <el-checkbox-button
+          :class="subjectList.length == 1 ? 'one' : ''"
+          v-for="(item, index) in subjectList"
+          :key="index"
+          :label="item.id"
+          >{{ item.name }}</el-checkbox-button
+        >
+      </el-checkbox-group> -->
+      <el-table
+        style="width: 100%"
+        max-height="300px"
+        :header-cell-style="{ background: '#EDEEF0', color: '#444' }"
+        :data="list"
+      >
+        <el-table-column type="expand">
+          <template slot-scope="props">
+            <el-row
+              :gutter="20"
+              v-for="(item, index) in props.row.detailDtos"
+              :key="index"
+            >
+              <el-col :span="12"
+                ><div class="rowFirst">{{ item.musicScoreName }}</div></el-col
+              >
+              <el-col :span="6"
+                ><div class="rowSecond">
+                  <span>{{ item.heardLevel | palyLevelFilter }}</span>
+                </div></el-col
+              >
+              <el-col :span="6"
+                ><div class="rowlast">
+                  <span :class="item.trainingScore >= item.standardScore ? '' : 'red'">{{
+                    item.trainingScore
+                  }}</span>
+                  / {{ item.standardScore }} 分
+                </div></el-col
+              >
+            </el-row>
+          </template>
+        </el-table-column>
+        <el-table-column prop="username" align="left" label="学生姓名"> </el-table-column>
+        <el-table-column prop="phone" align="left" label="手机号"> </el-table-column>
+        <el-table-column prop="subjectName" align="left" label="声部名称">
+        </el-table-column>
+        <el-table-column prop="trainingTime" align="left" label="完成时间">
+          <template slot-scope="scope">
+            <div>{{ scope.row.trainingTime | dateForMinFormat }}</div>
+          </template>
+        </el-table-column>
+        <el-table-column prop="finishFlag" align="right" label="测验分数">
+          <template slot-scope="scope">
+            <div>{{ scope.row.trainingScore }}</div>
+          </template>
+        </el-table-column>
+      </el-table>
+    </div>
+  </div>
+</template>
+<script>
+import { getLessonExaminationStudent, getHomeworkSubjectPublic } from "../api";
+export default {
+  props: ["courseScheduleId", "type"],
+  data() {
+    return {
+      subjectId: [],
+      list: [],
+      subjectList: [],
+    };
+  },
+  mounted() {
+    console.log(this.courseScheduleId, "mounted");
+    if (this.courseScheduleId) {
+      this.getStudentList(this.courseScheduleId);
+      // this.getPublicSubject();
+    }
+  },
+
+  methods: {
+    async getStudentList() {
+      try {
+        const res = await getLessonExaminationStudent({
+          lessonExaminationId: this.courseScheduleId,
+        });
+        this.list = res.data;
+      } catch (e) {
+        console.log(e);
+      }
+    },
+    async getPublicSubject() {
+      try {
+        const res = await getHomeworkSubjectPublic({
+          courseScheduleId: this.courseScheduleId,
+          type: this.type,
+        });
+        this.subjectList = res.data;
+      } catch (e) {
+        console.log(e);
+      }
+    },
+    checkSubject(val) {
+      console.log(val, "checkSubject", this.subjectId);
+      this.getStudentList();
+    },
+  },
+};
+</script>
+
+<style lang="scss" scoped>
+::v-deep.one {
+  .el-checkbox-button__inner {
+    border-radius: 4px !important;
+  }
+}
+
+::v-deep.el-row {
+  line-height: 44px;
+}
+.rowFirst {
+  padding-left: 58px;
+  color: #101010;
+}
+.rowSecond {
+  text-align: right;
+  span {
+    color: #101010;
+  }
+  color: #9a9a9a;
+}
+.rowlast {
+  text-align: right;
+  padding-right: 10px;
+  color: #101010;
+  .red {
+    color: #f44743;
+  }
+}
+</style>

+ 146 - 0
src/views/afterSchoolManager/components/studentWroks.vue

@@ -0,0 +1,146 @@
+<template>
+  <div>
+    <div>
+      <el-checkbox-group
+        v-if="subjectList.length > 1"
+        @change="checkSubject"
+        v-model="subjectId"
+        size="medium"
+        :max="1"
+        style="margin-bottom: 20px"
+      >
+        <el-checkbox-button
+          :class="subjectList.length == 1 ? 'one' : ''"
+          v-for="(item, index) in subjectList"
+          :key="index"
+          :label="item.id"
+          >{{ item.name }}</el-checkbox-button
+        >
+      </el-checkbox-group>
+      <el-table
+        style="width: 100%"
+        max-height="300px"
+        :header-cell-style="{ background: '#EDEEF0', color: '#444' }"
+        :data="list"
+      >
+        <el-table-column type="expand">
+          <template slot-scope="props">
+            <el-row
+              :gutter="20"
+              v-for="(item, index) in props.row.studentLessonTrainingDetail"
+              :key="index"
+            >
+              <el-col :span="12"
+                ><div class="rowFirst">{{ item.musicScoreName }}</div></el-col
+              >
+              <el-col :span="6"
+                ><div class="rowSecond">
+                  <span>{{ item.trainingSpeed }}</span> 速度
+                </div></el-col
+              >
+              <el-col :span="6"
+                ><div class="rowlast">
+                  <span :class="item.trainingTimes >= item.times ? '' : 'red'">{{
+                    item.trainingTimes
+                  }}</span>
+                  / {{ item.times }} 次
+                </div></el-col
+              >
+            </el-row>
+          </template>
+        </el-table-column>
+        <el-table-column prop="userName" align="left" label="学生姓名"> </el-table-column>
+        <el-table-column prop="phone" align="left" label="手机号"> </el-table-column>
+        <el-table-column prop="subjectName" align="left" label="声部名称">
+        </el-table-column>
+        <el-table-column prop="submitTime" align="left" label="完成时间">
+          <template slot-scope="scope">
+            <div>{{ scope.row.submitTime | dateForMinFormat }}</div>
+          </template>
+        </el-table-column>
+        <el-table-column prop="finishFlag" align="right" label="训练情况">
+          <template slot-scope="scope">
+            <div>{{ scope.row.finishFlag ? "已完成" : "未完成" }}</div>
+          </template>
+        </el-table-column>
+      </el-table>
+    </div>
+  </div>
+</template>
+<script>
+import { getHomeworkStudent, getHomeworkSubjectPublic } from "../api";
+export default {
+  props: ["courseScheduleId", "type"],
+  data() {
+    return {
+      subjectId: [],
+      list: [],
+      subjectList: [],
+    };
+  },
+  mounted() {
+    console.log(this.courseScheduleId, "mounted");
+    if (this.courseScheduleId) {
+      this.getStudentList(this.courseScheduleId);
+      this.getPublicSubject();
+    }
+  },
+
+  methods: {
+    async getStudentList() {
+      try {
+        const res = await getHomeworkStudent({
+          courseScheduleId: this.courseScheduleId,
+          type: this.type,
+          subjectId: this.subjectId[0] ? this.subjectId[0] : "",
+        });
+        this.list = res.data;
+      } catch (e) {
+        console.log(e);
+      }
+    },
+    async getPublicSubject() {
+      try {
+        const res = await getHomeworkSubjectPublic({
+          courseScheduleId: this.courseScheduleId,
+          type: this.type,
+        });
+        this.subjectList = res.data;
+      } catch (e) {
+        console.log(e);
+      }
+    },
+    checkSubject(val) {
+      console.log(val, "checkSubject", this.subjectId);
+      this.getStudentList();
+    },
+  },
+};
+</script>
+
+<style lang="scss" scoped>
+::v-deep.one {
+  .el-checkbox-button__inner {
+    border-radius: 4px !important;
+  }
+}
+.rowFirst {
+  padding-left: 58px;
+  color: #101010;
+}
+.rowSecond {
+  text-align: right;
+  span {
+    color: #101010;
+  }
+  color: #9a9a9a;
+}
+.rowlast {
+  text-align: right;
+  padding-right: 10px;
+  color: #101010;
+  .red {
+    color: #f44743;
+  }
+}
+</style>

+ 109 - 0
src/views/afterSchoolManager/components/textConment.vue

@@ -0,0 +1,109 @@
+<template>
+  <div>
+    <!--   -->
+    <el-checkbox-group
+      v-if="subjectList.length > 1"
+      @change="checkSubject"
+      v-model="subjectId"
+      size="medium"
+      :max="1"
+      style="margin-bottom: 20px"
+    >
+      <el-checkbox-button
+        :class="subjectList.length == 1 ? 'one' : ''"
+        v-for="(item, index) in subjectList"
+        :key="index"
+        :label="item.id"
+        >{{ item.name }}</el-checkbox-button
+      >
+    </el-checkbox-group>
+    <el-row :gutter="20" v-for="(item, index) in fitterTraining" :key="index">
+      <el-col :span="12"
+        ><div class="rowFirst">{{ item.musicScoreName }}</div></el-col
+      >
+      <el-col :span="6"
+        ><div class="rowSecond">
+          <span>{{ item.trainingSpeed }}</span> 速度
+        </div></el-col
+      >
+      <el-col :span="6"
+        ><div class="rowlast">
+          <!-- <span :class="item.trainingTimes >= item.times ? '' : 'red'">{{
+            item.trainingTimes
+          }}</span>  /-->
+          <span> {{ item.times }}</span>
+          次
+        </div></el-col
+      >
+    </el-row>
+  </div>
+</template>
+<script>
+import { getHomeworkSubjectPublic } from "../api";
+export default {
+  props: ["trainingDetailList", "courseScheduleId"],
+  data() {
+    return {
+      subjectId: [],
+      list: [],
+      subjectList: [],
+      fitterTraining: [],
+    };
+  },
+  mounted() {
+    console.log(this.trainingDetailList);
+    this.fitterTraining = this.trainingDetailList.map((item) => item);
+    this.getPublicSubject();
+  },
+
+  methods: {
+    async getPublicSubject() {
+      try {
+        const res = await getHomeworkSubjectPublic({
+          courseScheduleId: this.courseScheduleId,
+          type: "HOMEWORK",
+        });
+        this.subjectList = res.data;
+      } catch (e) {
+        console.log(e);
+      }
+    },
+    checkSubject(val) {
+      console.log(val[0], this.trainingDetailList);
+      if (val[0]) {
+        this.fitterTraining = this.trainingDetailList.filter((item) => {
+          return item.subjectId == val[0];
+        });
+      } else {
+        this.fitterTraining = this.trainingDetailList.map((item) => item);
+      }
+    },
+  },
+};
+</script>
+
+<style lang="scss" scoped>
+.rowFirst {
+  // padding-left: 58px;
+  color: #101010;
+}
+.rowSecond {
+  text-align: right;
+  span {
+    color: #101010;
+  }
+  color: #9a9a9a;
+}
+.rowlast {
+  text-align: right;
+  padding-right: 10px;
+  color: #101010;
+  .red {
+    color: #f44743;
+  }
+  span {
+    color: #101010;
+  }
+  color: #9a9a9a;
+}
+</style>

+ 331 - 0
src/views/afterSchoolManager/examination.vue

@@ -0,0 +1,331 @@
+<!--  -->
+<template>
+  <div class="m-container">
+    <h2>
+      <div class="squrt"></div>
+      进度测评
+    </h2>
+    <div class="m-core">
+      <save-form
+        :inline="true"
+        :model="searchForm"
+        @submit="search"
+        @reset="onReSet"
+        ref="saveForm"
+      >
+        <el-form-item>
+          <el-input
+            class="search"
+            v-model.trim="searchForm.search"
+            clearable
+            @keyup.enter.native="
+              (e) => {
+                e.target.blur();
+                $refs.saveForm.save();
+                search();
+              }
+            "
+            placeholder="老师名称"
+          ></el-input>
+        </el-form-item>
+        <el-form-item prop="organId">
+          <el-select
+            class="multiple"
+            filterable
+            v-model.trim="searchForm.organId"
+            clearable
+            placeholder="请选择分部"
+            @change="onBranchChange"
+          >
+            <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>
+          <el-select
+            collapse-tags
+            :disabled="!searchForm.organId"
+            v-model.trim="searchForm.musicGroupId"
+            clearable
+            filterable
+            placeholder="请选择乐团"
+          >
+            <el-option
+              v-for="(item, index) in teamList"
+              :key="index"
+              :value="item.id"
+              :label="item.name"
+            ></el-option>
+          </el-select>
+        </el-form-item>
+        <!-- <el-form-item>
+          <el-select
+            v-model.trim="searchForm.groupType"
+            class="organSelect"
+
+            filterable
+            placeholder="请选择课程类型"
+          >
+            <el-option
+              v-for="(item, index) in courseListType"
+              :key="index"
+              :label="item.label"
+              :value="item.value"
+            ></el-option>
+          </el-select>
+        </el-form-item> -->
+        <!-- <el-form-item>
+          <el-select
+            v-model.trim="searchForm.cloudHomeworkFlag"
+            class="organSelect"
+            clearable
+            filterable
+            placeholder="是否云教练布置"
+          >
+            <el-option label="是" :value="true"></el-option>
+            <el-option label="否" :value="false"></el-option>
+          </el-select>
+        </el-form-item> -->
+        <!-- <el-form-item>
+          <el-date-picker
+            v-model.trim="searchForm.courseTimer"
+            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 native-type="reset" type="primary">重置</el-button>
+        </el-form-item>
+      </save-form>
+      <div class="tableWrap">
+        <el-table
+          style="width: 100%"
+          :header-cell-style="{ background: '#EDEEF0', color: '#444' }"
+          :data="tableList"
+        >
+          <el-table-column align="center" prop="organName" label="分部"></el-table-column>
+          <el-table-column
+            align="center"
+            prop="musicGroupName"
+            label="乐团"
+          ></el-table-column>
+          <el-table-column
+            align="center"
+            prop="courseScheduleName"
+            label="班级"
+          ></el-table-column>
+          <el-table-column
+            align="center"
+            prop="actualTeacherName"
+            label="布置老师"
+          ></el-table-column>
+          <el-table-column align="center" label="布置时间">
+            <template slot-scope="scope">
+              <div>
+                {{ scope.row.createTime ? scope.row.createTime.substr(0, 16) : "" }}
+              </div>
+            </template>
+          </el-table-column>
+          <el-table-column align="center" label="截止时间">
+            <template slot-scope="scope">
+              <div>
+                {{ scope.row.createTime ? scope.row.createTime.substr(0, 16) : "" }}
+              </div>
+            </template>
+          </el-table-column>
+
+          <!-- <el-table-column align="center" prop="actualTeacherName" label="是否云教练布置">
+            <template slot-scope="scope">
+              <div>
+                {{ scope.row.musicScoreId ? "是" : "否" }}
+              </div>
+            </template>
+          </el-table-column> -->
+          <el-table-column
+            align="center"
+            prop="expectNum"
+            label="应交人数"
+          ></el-table-column>
+          <el-table-column
+            align="center"
+            prop="trainingNum"
+            label="完成人数"
+          ></el-table-column>
+          <el-table-column
+            align="center"
+            prop="standardNum"
+            label="合格人数"
+          ></el-table-column>
+          <el-table-column align="center" prop="studentId" label="操作">
+            <template slot-scope="scope">
+              <div>
+                <auth auths="/teamCourseListDetailWorkList/attendanceList">
+                  <el-button type="text" @click="lookDetail(scope.row)">查看</el-button>
+                </auth>
+              </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"
+        />
+        <el-dialog
+          title="详情"
+          :visible.sync="classVisible"
+          width="1000px"
+          v-if="classVisible"
+        >
+          <examinationDetail :courseScheduleId="activeRow.id" />
+        </el-dialog>
+      </div>
+    </div>
+  </div>
+</template>
+
+<script>
+import pagination from "@/components/Pagination/index";
+import { courseListType } from "@/utils/searchArray";
+import studentWork from "@/views/teamDetail/componentCourse/studentWork";
+import { getLessonExamination } from "./api.js";
+import { getTimes } from "@/utils";
+import examinationDetail from "./components/examinationDetail.vue";
+import { getTeamList } from "@/api/teamServer";
+export default {
+  components: { pagination, studentWork, examinationDetail },
+  data() {
+    return {
+      courseListType,
+      searchForm: {
+        search: null,
+        organId: null,
+        musicGroupId: "",
+        groupType: "MUSIC",
+        courseTimer: [],
+      },
+      teacherList: [],
+      tableList: [],
+      organList: [],
+      rules: {
+        // 分页规则
+        limit: 10, // 限制显示条数
+        page: 1, // 当前页
+        total: 0, // 总条数
+        page_size: [10, 20, 40, 50], // 选择限制显示条数
+      },
+      teamList: [],
+      activeRow: null,
+      classVisible: false,
+    };
+  },
+  //生命周期 - 创建完成(可以访问当前this实例)
+  created() {},
+  //生命周期 - 挂载完成(可以访问DOM元素)
+  mounted() {
+    // getEmployeeOrgan().then((res) => {
+    //   if (res.code == 200) {
+    //     this.organList = res.data;
+    //   }
+    // });
+    // 获取分部
+    this.$store.dispatch("setBranchs");
+    this.init();
+  },
+  activated() {
+    this.init();
+  },
+  methods: {
+    init() {
+      this.getList();
+    },
+    getList() {
+      // let date = this.searchForm;
+      // let classStartDate, classEndDate;
+      // if (this.courseTimer?.length > 0) {
+      //   classStartDate = this.courseTimer[0];
+      //   classEndDate = this.courseTimer[1];
+      // } else {
+      //   classStartDate = null;
+      //   classEndDate = null;
+      // }
+      // date.classStartDate = classStartDate;
+      // date.classEndDate = classEndDate;
+      // date.page = this.rules.page;
+      // date.rows = this.rules.limit;
+
+      let { courseTimer, ...rest } = this.searchForm;
+      let params = {
+        ...rest,
+        page: this.rules.page,
+        rows: this.rules.limit,
+        ...getTimes(courseTimer, ["classStartDate", "classEndDate"]),
+      };
+      getLessonExamination(params).then((res) => {
+        if (res.code == 200) {
+          this.tableList = res.data.rows;
+          this.rules.total = res.data.total;
+        }
+      });
+    },
+    search() {
+      this.rules.page = 1;
+      this.getList();
+    },
+    onReSet() {
+      this.searchForm = {
+        search: null,
+        organId: null,
+        groupType: "MUSIC",
+        courseTimer: [],
+        cloudHomeworkFlag: "",
+      };
+      // this.courseTimer = [];
+      this.search();
+    },
+    lookDetail(row) {
+      this.activeRow = row;
+      this.classVisible = true;
+    },
+    async onBranchChange(val) {
+      this.searchForm.musicGroupId = "";
+
+      if (val) {
+        let organId = val;
+        try {
+          await getTeamList({ organId, page: 1, rows: 9999 }).then((res) => {
+            if (res.code == 200) {
+              this.teamList = res.data.rows;
+            }
+          });
+        } catch (e) {
+          console.log(e);
+        }
+      }
+    },
+  },
+};
+</script>
+<style lang="scss" scoped>
+.search {
+  // // width: 220px!important;
+  // ::v-deep .el-input__inner {
+  //   width: 260px !important;
+  // }
+}
+</style>

+ 20 - 24
src/views/afterSchoolManager/index.vue

@@ -2,21 +2,18 @@
 <template>
   <div class="m-container">
     <h2>
-      <div class="squrt"></div>课外训练
+      <div class="squrt"></div>
+      课外练习
     </h2>
     <div class="m-core">
-        <tab-router v-model.trim="activeIndex"
-               type="card"
-               @tab-click="handleClick">
-          <el-tab-pane lazy label="课外训练"
-                      name="1">
-            <afterSchoolList v-if="activeIndex == 1"></afterSchoolList>
-          </el-tab-pane>
-          <el-tab-pane lazy label="课外训练(学员)"
-                      name="2">
-            <afterWorkList v-if="activeIndex == 2"></afterWorkList>
-          </el-tab-pane>
-        </tab-router>
+      <tab-router v-model.trim="activeIndex" type="card" @tab-click="handleClick">
+        <el-tab-pane lazy label="班级布置" name="1">
+          <afterSchoolList v-if="activeIndex == 1"></afterSchoolList>
+        </el-tab-pane>
+        <el-tab-pane lazy label="学员布置" name="2">
+          <afterWorkList v-if="activeIndex == 2"></afterWorkList>
+        </el-tab-pane>
+      </tab-router>
     </div>
   </div>
 </template>
@@ -25,29 +22,28 @@
 import afterSchoolList from "@/views/afterSchoolManager/afterSchoolList";
 import afterWorkList from "@/views/afterSchoolManager/afterWorkList";
 export default {
-  components: { afterSchoolList, afterWorkList},
-  data () {
-    const query = this.$route.query
+  components: { afterSchoolList, afterWorkList },
+  data() {
+    const query = this.$route.query;
     return {
       activeIndex: query.opt || "1",
     };
   },
   //生命周期 - 创建完成(可以访问当前this实例)
-  created () { },
+  created() {},
   //生命周期 - 挂载完成(可以访问DOM元素)
-  mounted () {
+  mounted() {
     this.init();
   },
   methods: {
-    init () {
+    init() {
       this.$route.query.activeIndex
         ? (this.activeIndex = this.$route.query.activeIndex)
         : this.activeIndex;
-
     },
-    handleClick (val) {
-      this.activeIndex = val.name
-    }
-  }
+    handleClick(val) {
+      this.activeIndex = val.name;
+    },
+  },
 };
 </script>

+ 8 - 3
src/views/attendanceManager/attendanceList/components/courseWorkeDetail.vue

@@ -72,7 +72,12 @@
         name="second"
         v-if="permission('/teamCourseListDetailStudnetList')"
       >
-        <div v-if="activeName == 'second'">练习内容</div>
+        <div v-if="activeName == 'second'">
+          <textConment
+            :trainingDetailList="trainingDetailList"
+            :courseScheduleId="courseScheduleId"
+          />
+        </div>
       </el-tab-pane>
     </el-tabs>
   </div>
@@ -81,10 +86,11 @@
 import tetacherIcon from "@/assets/images/base/woman.png";
 import { permission } from "@/utils/directivePage";
 import { findCourseHomeworkDetail } from "@/views/attendanceManager/attendanceList/api";
+import textConment from "./textConment.vue";
 import studentWroks from "./studentWroks.vue";
 export default {
   props: ["courseScheduleId"],
-  components: { studentWroks },
+  components: { studentWroks, textConment },
   data() {
     return {
       tetacherIcon,
@@ -109,7 +115,6 @@ export default {
     };
   },
   mounted() {
-    console.log("courseScheduleId", this.courseScheduleId);
     this.getWorkerDetail();
   },
   methods: {

+ 51 - 6
src/views/attendanceManager/attendanceList/components/studentWroks.vue

@@ -2,6 +2,7 @@
   <div>
     <div>
       <el-checkbox-group
+        v-if="subjectList.length > 1"
         @change="checkSubject"
         v-model="subjectId"
         size="medium"
@@ -22,17 +23,42 @@
         :header-cell-style="{ background: '#EDEEF0', color: '#444' }"
         :data="list"
       >
-        <el-table-column prop="userName" align="center" label="学生姓名">
+        <el-table-column type="expand">
+          <template slot-scope="props">
+            <el-row
+              :gutter="20"
+              v-for="(item, index) in props.row.studentLessonTrainingDetail"
+              :key="index"
+            >
+              <el-col :span="12"
+                ><div class="rowFirst">{{ item.musicScoreName }}</div></el-col
+              >
+              <el-col :span="6"
+                ><div class="rowSecond">
+                  <span>{{ item.trainingSpeed }}</span> 速度
+                </div></el-col
+              >
+              <el-col :span="6"
+                ><div class="rowlast">
+                  <span :class="item.trainingTimes >= item.times ? '' : 'red'">{{
+                    item.trainingTimes
+                  }}</span>
+                  / {{ item.times }} 次
+                </div></el-col
+              >
+            </el-row>
+          </template>
         </el-table-column>
-        <el-table-column prop="phone" align="center" label="手机号"> </el-table-column>
-        <el-table-column prop="subjectName" align="center" label="声部名称">
+        <el-table-column prop="userName" align="left" label="学生姓名"> </el-table-column>
+        <el-table-column prop="phone" align="left" label="手机号"> </el-table-column>
+        <el-table-column prop="subjectName" align="left" label="声部名称">
         </el-table-column>
-        <el-table-column prop="submitTime" align="center" label="完成时间">
+        <el-table-column prop="submitTime" align="left" label="完成时间">
           <template slot-scope="scope">
             <div>{{ scope.row.submitTime | dateForMinFormat }}</div>
           </template>
         </el-table-column>
-        <el-table-column prop="finishFlag" align="center" label="训练情况">
+        <el-table-column prop="finishFlag" align="right" label="训练情况">
           <template slot-scope="scope">
             <div>{{ scope.row.finishFlag ? "已完成" : "未完成" }}</div>
           </template>
@@ -55,7 +81,7 @@ export default {
   mounted() {
     console.log(this.courseScheduleId, "mounted");
     if (this.courseScheduleId) {
-      // this.getStudentList(this.courseScheduleId);
+      this.getStudentList(this.courseScheduleId);
       this.getPublicSubject();
     }
   },
@@ -98,4 +124,23 @@ export default {
     border-radius: 4px !important;
   }
 }
+.rowFirst {
+  padding-left: 58px;
+  color: #101010;
+}
+.rowSecond {
+  text-align: right;
+  span {
+    color: #101010;
+  }
+  color: #9a9a9a;
+}
+.rowlast {
+  text-align: right;
+  padding-right: 10px;
+  color: #101010;
+  .red {
+    color: #f44743;
+  }
+}
 </style>

+ 109 - 0
src/views/attendanceManager/attendanceList/components/textConment.vue

@@ -0,0 +1,109 @@
+<template>
+  <div>
+    <!--   -->
+    <el-checkbox-group
+      v-if="subjectList.length > 1"
+      @change="checkSubject"
+      v-model="subjectId"
+      size="medium"
+      :max="1"
+      style="margin-bottom: 20px"
+    >
+      <el-checkbox-button
+        :class="subjectList.length == 1 ? 'one' : ''"
+        v-for="(item, index) in subjectList"
+        :key="index"
+        :label="item.id"
+        >{{ item.name }}</el-checkbox-button
+      >
+    </el-checkbox-group>
+    <el-row :gutter="20" v-for="(item, index) in fitterTraining" :key="index">
+      <el-col :span="12"
+        ><div class="rowFirst">{{ item.musicScoreName }}</div></el-col
+      >
+      <el-col :span="6"
+        ><div class="rowSecond">
+          <span>{{ item.trainingSpeed }}</span> 速度
+        </div></el-col
+      >
+      <el-col :span="6"
+        ><div class="rowlast">
+          <!-- <span :class="item.trainingTimes >= item.times ? '' : 'red'">{{
+            item.trainingTimes
+          }}</span>  /-->
+          <span> {{ item.times }}</span>
+          次
+        </div></el-col
+      >
+    </el-row>
+  </div>
+</template>
+<script>
+import { getHomeworkSubjectPublic } from "../api";
+export default {
+  props: ["trainingDetailList", "courseScheduleId"],
+  data() {
+    return {
+      subjectId: [],
+      list: [],
+      subjectList: [],
+      fitterTraining: [],
+    };
+  },
+  mounted() {
+    console.log(this.trainingDetailList);
+    this.fitterTraining = this.trainingDetailList.map((item) => item);
+    this.getPublicSubject();
+  },
+
+  methods: {
+    async getPublicSubject() {
+      try {
+        const res = await getHomeworkSubjectPublic({
+          courseScheduleId: this.courseScheduleId,
+          type: "HOMEWORK",
+        });
+        this.subjectList = res.data;
+      } catch (e) {
+        console.log(e);
+      }
+    },
+    checkSubject(val) {
+      console.log(val[0], this.trainingDetailList);
+      if (val[0]) {
+        this.fitterTraining = this.trainingDetailList.filter((item) => {
+          return item.subjectId == val[0];
+        });
+      } else {
+        this.fitterTraining = this.trainingDetailList.map((item) => item);
+      }
+    },
+  },
+};
+</script>
+
+<style lang="scss" scoped>
+.rowFirst {
+  // padding-left: 58px;
+  color: #101010;
+}
+.rowSecond {
+  text-align: right;
+  span {
+    color: #101010;
+  }
+  color: #9a9a9a;
+}
+.rowlast {
+  text-align: right;
+  padding-right: 10px;
+  color: #101010;
+  .red {
+    color: #f44743;
+  }
+  span {
+    color: #101010;
+  }
+  color: #9a9a9a;
+}
+</style>

+ 4 - 4
src/views/attendanceManager/attendanceList/index.vue

@@ -167,11 +167,11 @@
           width="1000px"
           v-if="classVisible"
         >
-          <!-- <studentWork
-            v-if="activeRow"
+          <studentWork
+            v-if="activeRow.versionTag == 'v1'"
             :courseScheduleId="activeRow.courseScheduleId"
-          ></studentWork> -->
-          <courseWorkeDetail :courseScheduleId="activeRow.courseScheduleId" />
+          ></studentWork>
+          <courseWorkeDetail v-else :courseScheduleId="activeRow.courseScheduleId" />
         </el-dialog>
       </div>
     </div>

+ 7 - 1
src/views/teamDetail/teamCourseList.vue

@@ -443,7 +443,11 @@
           v-if="permission('/teamCourseListDetailWorkList') && maskForm.status == 'OVER'"
         >
           <div v-if="activeName == 'third'">
-            <studentWork :courseScheduleId="maskForm.id"></studentWork>
+            <studentWork
+              :courseScheduleId="maskForm.id"
+              v-if="maskForm.versionTag == 'v1'"
+            ></studentWork>
+            <studentWorks :courseScheduleId="maskForm.id" v-else></studentWorks>
           </div>
         </el-tab-pane>
         <el-tab-pane
@@ -707,6 +711,7 @@ import teacherList from "./componentCourse/teacherList";
 import addCompound from "./componentCourse/addCompound";
 import infoMsg from "./componentCourse/infoMsg";
 import cleanDeep from "clean-deep";
+import studentWorks from "@/views/attendanceManager/attendanceList/components/studentWroks.vue";
 let nowTime = new Date();
 nowTime =
   nowTime.getFullYear() + "-" + (nowTime.getMonth() + 1) + "-" + nowTime.getDate();
@@ -775,6 +780,7 @@ export default {
     addCompound,
     infoMsg,
     SchoolLocation,
+    studentWorks,
   },
   created() {
     // this.searchForm.timer = [nowTime, nowTime];

+ 52 - 29
src/views/withdrawal-application/modals/visit.vue

@@ -2,18 +2,16 @@
   <div>
     <div class="visitBtnWrap">
       <auth auths="studentAttendance/findStudentAttendance">
-        <el-button type="text" @click="recordVisible = true"
-          >学员考勤</el-button
-        >
+        <el-button type="text" @click="recordVisible = true">学员考勤</el-button>
       </auth>
-      <auth
+      <!-- <auth
         :auths="[
           'webCurseHomework/getStudentHomeWorks',
           'extracurricularExercisesReply/queryPageList',
         ]"
       >
         <el-button type="text" @click="workVisible = true">训练情况</el-button>
-      </auth>
+      </auth> -->
     </div>
     <el-form
       :model="visitForm"
@@ -25,7 +23,11 @@
       <el-form-item label="学生姓名">
         <p>{{ userName }}</p>
       </el-form-item>
-      <el-form-item label="回访类型" prop="visitType" :rules="[{ required: true, message: '选择回访类型' }]">
+      <el-form-item
+        label="回访类型"
+        prop="visitType"
+        :rules="[{ required: true, message: '选择回访类型' }]"
+      >
         <el-cascader
           :disabled="isMainGo || !!useVisitType"
           expand-trigger="hover"
@@ -49,7 +51,13 @@
           :picker-options="pickerOptions"
         ></el-date-picker>
       </el-form-item>
-      <el-form-item label="学员情况" prop="overview" v-if="!(visitForm.visitType[0]=='常规回访'&&visitForm.visitType[1]=='考勤申诉')">
+      <el-form-item
+        label="学员情况"
+        prop="overview"
+        v-if="
+          !(visitForm.visitType[0] == '常规回访' && visitForm.visitType[1] == '考勤申诉')
+        "
+      >
         <el-input
           type="textarea"
           v-model="visitForm.overview"
@@ -63,7 +71,10 @@
       <el-form-item
         label="家长反馈"
         prop="feedback"
-        v-if="visitForm.visitType[0] != '小课回访'&&!(visitForm.visitType[0]=='常规回访'&&visitForm.visitType[1]=='考勤申诉')"
+        v-if="
+          visitForm.visitType[0] != '小课回访' &&
+          !(visitForm.visitType[0] == '常规回访' && visitForm.visitType[1] == '考勤申诉')
+        "
       >
         <el-input
           type="textarea"
@@ -76,7 +87,6 @@
         ></el-input>
       </el-form-item>
 
-
       <el-form-item
         label="学员状态"
         prop="feedbackType"
@@ -102,10 +112,15 @@
       <el-form-item
         label="家长反馈"
         prop="feedbackTypeDesc"
-        v-if="(visitForm.visitType[0]=='常规回访'&&visitForm.visitType[1]=='考勤申诉')"
+        v-if="
+          visitForm.visitType[0] == '常规回访' && visitForm.visitType[1] == '考勤申诉'
+        "
         :rules="[{ required: true, message: '选择家长反馈' }]"
       >
-      <el-radio-group v-model="visitForm.feedbackTypeDesc" @change="changeFeedbackTypeDesc">
+        <el-radio-group
+          v-model="visitForm.feedbackTypeDesc"
+          @change="changeFeedbackTypeDesc"
+        >
           <el-radio-button
             :label="item.value"
             v-for="(item, index) in feedbackTypeDescList"
@@ -140,18 +155,27 @@
         :rules="[{ required: true, message: '选择问题状态' }]"
       >
         <el-radio-group v-model="visitForm.probStatus">
-          <el-radio-button label="1" >已解决</el-radio-button>
+          <el-radio-button label="1">已解决</el-radio-button>
           <el-radio-button label="0">待跟进</el-radio-button>
         </el-radio-group>
       </el-form-item>
 
-
       <!--   :rules="[{ required: true, message: '请输入家长反馈内容' }]" -->
       <el-form-item
         label="原因"
         prop="feedback"
-        :rules="[{ required: visitForm.feedbackTypeDesc=='OTHER'?true:false, message: '请输入家长反馈内容' }]"
-        v-if="visitForm.visitType[0] == '小课回访' || (visitForm.visitType[0]=='常规回访'&&visitForm.visitType[1]=='考勤申诉'&&visitForm.feedbackTypeDesc=='OTHER')"
+        :rules="[
+          {
+            required: visitForm.feedbackTypeDesc == 'OTHER' ? true : false,
+            message: '请输入家长反馈内容',
+          },
+        ]"
+        v-if="
+          visitForm.visitType[0] == '小课回访' ||
+          (visitForm.visitType[0] == '常规回访' &&
+            visitForm.visitType[1] == '考勤申诉' &&
+            visitForm.feedbackTypeDesc == 'OTHER')
+        "
       >
         <el-input
           type="textarea"
@@ -169,11 +193,7 @@
         </div>
       </el-form-item>
     </el-form>
-    <div
-      slot="footer"
-      class="dialog-footer"
-      style="text-align: right; margin-right: 15%"
-    >
+    <div slot="footer" class="dialog-footer" style="text-align: right; margin-right: 15%">
       <el-button @click="$emit('close')">取 消</el-button>
       <el-button type="primary" @click="submitAddVisit">确 定</el-button>
     </div>
@@ -215,10 +235,14 @@ export default {
   components: { record, studentWork },
   data() {
     return {
-      visitChiose:visitChiose1,
+      visitChiose: visitChiose1,
       feedbackTypeList,
-      feedbackTypeDescList:[{label:'生病',value:'SICK'},{label:'有事',value:'SOMETHING'},{label:'不想参加',value:'NO_PARTICIPATE'},{label:'其他',value:'OTHER'}]
-      ,
+      feedbackTypeDescList: [
+        { label: "生病", value: "SICK" },
+        { label: "有事", value: "SOMETHING" },
+        { label: "不想参加", value: "NO_PARTICIPATE" },
+        { label: "其他", value: "OTHER" },
+      ],
       visitForm: {
         musicGroupId: "",
         overview: "",
@@ -232,7 +256,7 @@ export default {
         attachments: [],
         feedbackTypeDesc: "",
         feedbackType: "",
-        probStatus:'0'
+        probStatus: "0",
       },
       visitRules: {
         // overview: [{ required: true, message: "请输入学生近况" }],
@@ -258,7 +282,7 @@ export default {
 
       this.$set(this.visitForm, "visitType", this.useVisitType);
       this.$forceUpdate();
-      console.log('useVisitType',this.useVisitType,this.visitForm)
+      console.log("useVisitType", this.useVisitType, this.visitForm);
     } else {
       this.visitChiose = visitChiose1;
     }
@@ -316,17 +340,16 @@ export default {
       });
     },
     changeVisitType(val) {
-
       this.visitForm.feedbackTypeDesc = "";
       this.visitForm.feedbackType = "";
       this.visitForm.overview = "";
       this.visitForm.feedback = "";
     },
-    changeFeedbackTypeDesc(val){
-      console.log('changeFeedbackTypeDesc')
+    changeFeedbackTypeDesc(val) {
+      console.log("changeFeedbackTypeDesc");
       this.visitForm.overview = "";
       this.visitForm.feedback = "";
-    }
+    },
   },
 };
 </script>