Browse Source

Merge branch 'tmp_meeting_needs' into test

lex-xin 4 years ago
parent
commit
4d23a62fdf

+ 1 - 1
src/api/audition.js

@@ -98,7 +98,7 @@ const addHomeWork = (data) => {
   return axios({
       url: api + '/courseReview/addHomeWork',
       method: 'post',
-      data: qs.stringify(data)
+      data
   })
 }
 

+ 10 - 1
src/api/teacher.js

@@ -455,6 +455,14 @@ const newsList = (data) => {
     params: data
   })
 }
+// classGroup/getCourseStudents?courseScheduleId=10352
+const getCourseStudents = (data) => {
+  return axios({
+    url: '/api-teacher/classGroup/getCourseStudents',
+    method: 'get',
+    params: data
+  })
+}
 
 export {
   queryMyCreatedList,
@@ -506,5 +514,6 @@ export {
   findEducationUsers,
   queryDouble11Students,
   newsQuery,
-  newsList
+  newsList,
+  getCourseStudents
 }

+ 79 - 0
src/assets/commonLess/common.less

@@ -1,3 +1,5 @@
+@import url('./variable');
+
 // 阴影
 .m-shadow {
   box-shadow: 0 0 .17rem 0 rgba(202, 202, 202, 0.42);
@@ -88,3 +90,80 @@ textarea:-ms-input-placeholder {
   border: 1px solid #d3d3d3
 }
 
+
+.teachMode {
+  background: #F2FFFC;
+  border-radius: .03rem;
+  border: 1px solid #01C1B5;
+  font-size: 12px;
+  color: #01C1B5;
+  display: inline-block;
+  // height: 16px;
+  line-height: 16px;
+  padding: 0 5px;
+}
+.sign0, .sign3 {
+  border-color: #FFDBDB;
+  color: #FF4444;
+  background-color: #FFFBFB;
+}
+.sign1 {
+  background: #F1FCF9;
+  color: #00C988;
+  border-color: #0BE49E;
+}
+.courseType {
+  line-height: 18px;
+  // height: 18px;
+  font-size: 12px;
+  color: #fff;
+  display: inline-block;
+  border-radius: 0px 5px 0px 5px;
+  padding: 0 3px;
+  margin: 0 .05rem;
+}
+.NORMAL, .SINGLE {
+  background: @color4;
+}
+.MIX {
+  background: @color6;
+}
+.HIGH {
+  background: @color7;
+}
+.VIP {
+  background: @color1;
+}
+.DEMO {
+  background: @color3;
+}
+.COMPREHENSIVE {
+  background: @color8;
+}
+.ENLIGHTENMENT {
+  background: @color9;
+}
+.TRAINING {
+  background: @color10;
+}
+.TRAINING_SINGLE {
+  background: @color11;
+}
+.TRAINING_MIX {
+  background: @color12;
+}
+.CLASSROOM {
+  background: @color13;
+}
+.PRACTICE, .MUSIC_NETWORK {
+  background: @color2;
+}
+.COMM {
+  background: @color14;
+}
+.MUSIC {
+  background: @mColor;
+}
+.HIGH_ONLINE {
+  background: @color15;
+}

+ 15 - 1
src/assets/commonLess/variable.less

@@ -50,7 +50,21 @@
   padding-right: .15rem;
 }
 
-
+@color1: #FF8642;
+@color2: #8C98E5;
+@color3: #6FB2FF;
+@color4: #7DC0CF;
+@color5: #cfcaca;
+@color6: #FF9288;
+@color7: #AA92CF;
+@color8: #2CD3E3;
+@color9: #0684E8;
+@color10: #97C672;
+@color11: #72C67A;
+@color12: #51CF83;
+@color13: #FFA25F;
+@color14: #85BEBE;
+@color15: #7584E8;
 
 // Basic Colors
 // @black: #000;

+ 19 - 0
src/helpers/deep-clone.js

@@ -0,0 +1,19 @@
+// form: https://www.30secondsofcode.org/js/s/deep-clone
+
+const deepClone = obj => {
+    if (obj === null) return null;
+    let clone = Object.assign({}, obj);
+    Object.keys(clone).forEach(
+      key =>
+        (clone[key] =
+          typeof obj[key] === 'object' ? deepClone(obj[key]) : obj[key])
+    );
+    if (Array.isArray(obj)) {
+      clone.length = obj.length;
+      return Array.from(clone);
+    }
+    return clone;
+  };
+  
+  export default deepClone
+  

+ 176 - 30
src/views/audition/ArrangeWork.vue

@@ -1,29 +1,51 @@
 <template>
   <div class="arrangeWork">
     <m-header v-if="headerStatus" />
+    <van-cell :title="classGroupName" title-style="font-size: .18rem; color: #333333;">
+      <template #extra>
+        <van-tag type="primary" plain style="background-color: #F1FCF9">课后训练</van-tag>
+      </template>
+    </van-cell>
+    <van-cell class="endTime" readonly is-link title-style="font-size: .16rem; color: #333333;">
+      <template #title>
+        <span style="padding-right: .3rem">学员共<i style="font-style: normal; color: #01C1B5">{{ params.studentCount }}</i>人</span>
+        <span>会员 <i style="font-style: normal; color: #FF802C">{{ params.studentMemberCount }}</i>人</span>
+      </template>
+    </van-cell>
     <div class="container">
-      <!-- <div class="formGroup">
-        <div class="formTitle">课外训练标题</div>
-        <van-field type="text" placeholder="请输入(1-25字)" />
-      </div> -->
       <div class="formGroup">
-           <div class="dot"></div>
-        <div class="formTitle">作业内容</div>
-        <van-field rows="8" v-model="content" type="textarea" placeholder="请输入(1-600字)" />
+        <div class="dot"></div>
+        <div class="formTitle">训练标题</div>
+        <van-field v-model="title" type="text" maxlength="25" show-word-limit placeholder="请输入训练标题" />
+      </div>
+      <div class="formGroup">
+        <div class="dot"></div>
+        <div class="formTitle">训练内容</div>
+        <van-field rows="4" v-model="content" maxlength="600" show-word-limit type="textarea" placeholder="请输入训练内容" />
       </div>
     </div>
-    <van-cell class="endTime" title="作业提交截止时间" @click="onEndTime" is-link readonly placeholder="请选择截止时间" >
+    <van-cell class="endTime" title="训练提交截止时间" @click="onEndTime" is-link readonly placeholder="请选择截止时间" >
       <template #default>
         {{ dateSection.showStartDate }}
-         <!-- <span class="arrowDown"></span> -->
-      </template>
-    </van-cell>
-    <van-cell class="endTime" title="作业曲目" @click="accompanimentStatus = true" readonly is-link placeholder="请选择作业曲目" >
-      <template #default>
-        {{ dateSection.musicScoreName }}
-         <!-- <span class="arrowDown"></span> -->
       </template>
     </van-cell>
+
+    <div class="accompanyHeader">
+      云教练曲目选择<span>(若作业内容非云教练曲目则无需选择)</span>
+    </div>
+    <van-tabs v-model="tabActive" color="#01C1B5">
+      <van-tab v-for="(item, i) in params.subjectList" :title="item.subjectName" :name="item.id" :key="i" class="van-hairline--bottom">
+        <van-cell class="endTime" v-for="(music, index) in item.musicScoreIdList" :key="index" style="margin-top: 0;" title="训练曲目" @click="onSelectAccompany(item, index)" readonly is-link placeholder="请选择训练曲目" >
+          <template #default>
+            {{ music.name }}
+          </template>
+        </van-cell>
+        <div class="addAccompaniment" v-if="item.musicScoreIdList.length < 3" @click="addCloud(item)">
+          <van-icon name="plus" size="16px" />增加云教练训练曲目
+        </div>
+      </van-tab>
+    </van-tabs>
+
     <div class="button-group">
       <van-button type="primary" round size="large" @click="onSubmit">确定</van-button>
     </div>
@@ -45,7 +67,7 @@
       <van-sticky>
         <m-header name="作业曲目" :backUrl="backUrl" />
       </van-sticky>
-      <accompaniment-modal isHead @onSelectMusic="onSelectMusic" />
+      <accompaniment-modal isHead @onSelectMusic="onSelectMusic" :searchSubjectId="tabActive" />
     </van-popup>
   </div>
 </template>
@@ -54,16 +76,18 @@ import MHeader from "@/components/MHeader"
 import { browser, _throttle }  from '@/common/common'
 import dayjs from "dayjs";
 import { addHomeWork } from '@/api/audition'
+import { getCourseStudents } from '@/api/teacher'
 import AccompanimentModal from './modal/accompanimentModal'
 import cleanDeep from 'clean-deep'
+import deepClone from '@/helpers/deep-clone'
 export default {
   name: "teacherList",
   components: { MHeader, AccompanimentModal },
   data() {
     let tempDate = new Date() // 默认显示T+3
     tempDate.setDate(tempDate.getDate() + 3)
+    let query = this.$route.query
     return {
-      that: this,
       headerStatus: true,
       backUrl: {
         status: true,
@@ -71,6 +95,8 @@ export default {
           this.accompanimentStatus = false
         }
       },
+      classGroupName: query.classGroupName,
+      courseId: query.courseId,
       dateSection: {
         status: false,
         minDate: new Date(),
@@ -80,12 +106,23 @@ export default {
         musicScoreId: null,
         musicScoreName: null,
       },
+      title: null,
       content: null, // 课程编号
       expiryDate: null, // 作业截止日期
       accompanimentStatus: false, // 伴奏弹窗
+      tabActive: 0,
+      tabActiveList: {}, // 选中当前信息
+      tabActiveIndex: 0,
+      params: {
+        studentCount: 0, // 学员总数
+        studentMemberCount: 0, // 学员会员数
+        subjectIdList: [],
+        subjectList: []
+      }
+
     };
   },
-  mounted() {
+  async mounted() {
     let params = this.$route.query;
     if (params.Authorization) {
       localStorage.setItem("Authorization", decodeURI(params.Authorization));
@@ -95,9 +132,56 @@ export default {
     if(browser().android || browser().iPhone) {
       this.headerStatus = false
     }
-
+    await getCourseStudents({ courseScheduleId: this.courseId }).then(res => {
+      const result = res.data
+      if(result.code != 200) { return }
+      const tempData = result.data || []
+      let params = {
+        studentCount: tempData.length, // 学员总数
+        studentMemberCount: 0, // 学员会员数
+        subjectIdList: [],
+        subjectList: []
+      }
+      tempData.forEach(item => {
+        // 判断当前学员是否有会员
+        if(item.memberRankSettingId) {
+          params.studentMemberCount++
+        }
+        if(!params.subjectIdList.includes(item.subjectIdList)) {
+          params.subjectIdList.push(item.subjectIdList)
+          params.subjectList.push({
+            id: item.subjectIdList,
+            subjectName: item.subjectName,
+            userIdList: [item.userId],
+            musicScoreIdList: [{
+              id: null,
+              name: null,
+            }], // 默认加一个空的,做占位
+          })
+        } else {
+          params.subjectList.forEach(subject => {
+            if(subject.id == item.subjectIdList) {
+              subject.userIdList.push(item.userId)
+            }
+          })
+        }
+      });
+      // 默认选中第1条数据
+      this.tabActive = deepClone(params.subjectIdList[0])
+      this.params = params
+    })
   },
   methods: {
+    onSelectAccompany(item, index) {
+      this.accompanimentStatus = true
+      this.tabActiveList = item
+      this.tabActiveIndex = index
+    },
+    addCloud(item) {
+      if(item.musicScoreIdList.length < 3) {
+        item.musicScoreIdList.push('')
+      }
+    },
     formatter(type, val) {
       if (type === "year") {
         return `${val}年`
@@ -109,8 +193,10 @@ export default {
       return val
     },
     onSelectMusic(value) {
-      this.dateSection.musicScoreName = value.examSongName
-      this.dateSection.musicScoreId = value.examSongId
+      this.tabActiveList.musicScoreIdList[this.tabActiveIndex] = {
+        id: value.examSongId,
+        name: value.examSongName
+      }
       this.accompanimentStatus = false
     },
     confirmStartTime() {
@@ -121,10 +207,37 @@ export default {
       this.dateSection.status = true
     },
     onSubmit: _throttle(function() {
+      if(!this.title) {
+        this.$toast('请输入训练标题')
+        return
+      }
       if(!this.content) {
-        this.$toast('请输入作业内容')
+        this.$toast('请输入训练内容')
         return
       }
+      let tempSubjectList = this.params.subjectList
+      let musicScoreSubjectDto = []
+      let notAccompanySong = [] // 用于判断没有设置训练曲目的数据
+      let subjectLength = this.params.subjectIdList.length
+      tempSubjectList.forEach(subject => {
+        let scoreIdList = []
+        subject.musicScoreIdList.forEach(music => {
+          if(music.id) {
+            scoreIdList.push(music.id)
+          }
+        })
+        if(scoreIdList.length <= 0) {
+          notAccompanySong.push(subject.subjectName)
+        }
+        musicScoreSubjectDto.push({
+          musicScoreIdList: scoreIdList,
+          userIdList: subject.userIdList
+        })
+      })
+      if(notAccompanySong.length - subjectLength < 0 && notAccompanySong != 0) {
+        console.log('选择曲目')
+      }
+      
       this.$toast.loading({
         message: '加载中...',
         duration: 10000,
@@ -133,18 +246,26 @@ export default {
       })
       let query = this.$route.query
       let params = {
+        title: this.title,
         content: this.content,
-        courseId: query.courseId,
+        courseScheduleId: query.courseId,
         expiryDate: dayjs(this.dateSection.currentDate).format('YYYY-MM-DD'),
-        musicScoreId: this.dateSection.musicScoreId
+        musicScoreSubjectDto: musicScoreSubjectDto
       }
       addHomeWork(cleanDeep({...params})).then(res => {
         let result = res.data
         this.$toast.clear()
         if(result.code == 200) {
           this.$toast('作业布置成功')
+          let query = this.$route.query
           this.$router.replace({
-            path: '/manageEvaluation'
+            path: '/courseEvaluation',
+            query: {
+              id: query.id,
+              reviewId: query.reviewId,
+              isInside: query.isInside,
+              work: 1
+            }
           })
         } else {
           this.$toast(result.msg)
@@ -179,7 +300,11 @@ export default {
 
 
 .container {
-  background: #ffffff;
+  .formGroup {
+    position: relative;
+    margin-top: .1rem;
+    background: #ffffff;
+  }
   .formTitle {
     padding: .12rem .21rem 0;
     font-size: .16rem;
@@ -193,7 +318,6 @@ export default {
   .van-cell__title {
     font-size: .16rem;
     color: #1A1A1A;
- 
   }
 
   /deep/.van-cell__value {
@@ -224,11 +348,33 @@ export default {
   background: #01c1b5;
   border-radius: 3px;
   position: absolute;
-  z-index: 200;
+  z-index: 98;
   top: .15rem;
   left: 0.12rem;
 }
-.formGroup {
-  position: relative;
+
+/deep/.van-tab {
+  font-size: 16px;
 }
+.accompanyHeader {
+  font-size: .14rem;
+  padding: .16rem .08rem .14rem;
+  color: #333;
+  font-weight: 500;
+  span {
+    color: #808080;
+  }
+}
+.addAccompaniment {
+  width: 80%;
+  height: .42rem;
+  line-height: .42rem;
+  text-align: center;
+  margin: .1rem auto 0;
+  border: 1px dashed #CCC;
+  background: #FBFBFB;
+  font-size: .14rem;
+  color: #666666;
+}
+
 </style>

+ 144 - 93
src/views/audition/CourseEvaluation.vue

@@ -1,28 +1,37 @@
 <template>
   <div style="overflow: hidden">
     <m-header v-if="headerStatus" />
+    <div class="course-header">
+      <div class="title-info">
+        <span class="teachMode" v-if="teachMode">
+          {{ teachMode == 'ONLINE' ? '线上' : null }}
+          {{ teachMode == 'OFFLINE' ? '线下' : null }}
+        </span>
+        <span :class="['courseType', classType]">{{ classType | coursesType }}</span>
+        <span style="font-size: .18rem; font-weight: 500; color: #333;line-height: 18px;vertical-align: middle;">{{ classGroupName }}</span>
+      </div>
+      <div class="title-time">
+        {{ classTimer }}
+      </div>
+    </div>
     <van-cell-group>
-      <van-cell title="课程班名称" :value="classGroupName" />
-           <van-cell title="课程类型">
-        <template #default>
-          {{ classType | coursesType }}
-        </template>
-      </van-cell>
-      <van-cell title="上课时间" :value="classTimer" />
-        <van-cell title="乐器" :value="subjectNames" />
+      <div class="dot"></div>
+       <!-- v-if="enableAssignHomework" -->
+      <van-cell class="input" :is-link="!isAssignHomework ? true : false" title="课后训练" :value='isAssignHomework ? "已布置" : "未布置"' @click="onWork()"></van-cell>
     </van-cell-group>
     <van-cell-group>
        <div class="dot"></div>
       <van-field
         required
-        rows="4"
+        rows="3"
         class="textarea"
         v-model="teachingMaterial"
         maxlength="255"
         autosize
         label="教材内容"
         type="textarea"
-        placeholder="请输入(1-255字)"
+        placeholder="请输入本课程学习内容"
+        show-word-limit
       />
     </van-cell-group>
     <van-cell-group>
@@ -38,7 +47,7 @@
       />
     </van-cell-group>
     <!-- <van-cell-group >
- 
+
     </van-cell-group> -->
     <!--   label="评价备注" -->
     <van-cell-group>
@@ -52,6 +61,7 @@
             <van-rate
               v-model="pronunciation"
               :size="25"
+              color="#F7B500"
               void-color="#eee"
               void-icon="star"
             />
@@ -60,6 +70,7 @@
             <span class="text">节奏</span>
             <van-rate
               :size="25"
+              color="#F7B500"
               void-color="#eee"
               v-model="tempo"
               void-icon="star"
@@ -70,6 +81,7 @@
             <van-rate
               :size="25"
               v-model="musicTheory"
+              color="#F7B500"
               void-color="#eee"
               void-icon="star"
             />
@@ -77,14 +89,15 @@
         </template>
       </van-cell>
       <van-field
-        rows="4"
+        rows="3"
         required
         class="textarea"
         maxlength="255"
         v-model="memo"
         autosize
         type="textarea"
-        placeholder="请输入(1-255字)"
+        placeholder="请输入本课程学习内容"
+        show-word-limit
       />
     </van-cell-group>
     <van-cell-group v-if="classType != 'VIP'">
@@ -100,25 +113,12 @@
     </van-cell-group>
 
     <div class="button-group" v-if="!reviewId">
-      <van-button type="primary" round size="large" @click="submitReview"
-        >提交评价</van-button
-      >
-    </div>
-    <div class="button-group btn-operation" v-if="reviewId">
-      <van-button
-        type="primary"
-        :disabled="homeWork ? true : false"
-        v-if="enableAssignHomework"
-        round
-        @click="onWork(isAssignHomework)"
-        >{{ homeWork ? "已布置作业" : "布置作业" }}</van-button
-      >
-      <van-button type="primary" round class="btn-plain" @click="submitReview"
-        >修改评价</van-button
-      >
+      <van-button type="primary" round size="large" @click="submitReview">
+        {{ !reviewId ? '提交评价' : '修改评价' }}
+      </van-button>
     </div>
 
-    <van-popup v-model="showWork">
+    <!-- <van-popup v-model="showWork">
       <van-icon class="closeable" @click="onClose" name="cross" />
       <div class="popup_container">
         <p class="content">
@@ -133,7 +133,7 @@
           <span @click="onWork(0)">布置作业</span>
         </div>
       </div>
-    </van-popup>
+    </van-popup> -->
   </div>
 </template>
 <script>
@@ -143,7 +143,7 @@ import {
   courseReviewAdd,
   getReviewInfo,
   updateReviewInfo,
-  checkeIsAssignHomework,
+  checkeIsAssignHomework
 } from "@/api/teacher";
 import { browser } from "@/common/common";
 import MHeader from "@/components/MHeader";
@@ -153,13 +153,14 @@ export default {
   data() {
     return {
       headerStatus: true,
-      showWork: false, // 是否布置作业
+      // showWork: false, // 是否布置作业
       radio: 1,
       voice: 0,
       courseId: null,
       reviewId: null,
       classTimer: null,
       classGroupName: null,
+      teachMode: null,
       classType: null, // 课程类型
       teachingMaterial: null, //教材
       song: null, // 曲目
@@ -168,7 +169,6 @@ export default {
       musicTheory: null, // 乐理
       memo: null, // 备注
       homeWork: null, // 作业
-      handHomework: null, // 是否完成作业
       hasLiaison: null,
       subjectNames: null,
       // isReset: false,
@@ -178,7 +178,7 @@ export default {
       memberStatus: 0, // 是否有学生或者乐团是会员
     };
   },
-  created() {
+  async mounted() {
     let params = this.$route.query;
     if (params.Authorization) {
       localStorage.setItem("Authorization", decodeURI(params.Authorization));
@@ -190,27 +190,35 @@ export default {
     if (!this.courseId) {
       this.$toast("课程信息错误");
     }
-  },
-  mounted() {
-    let params = this.$route.query;
-    if (params.Authorization) {
-      localStorage.setItem("Authorization", decodeURI(params.Authorization));
-      localStorage.setItem("userInfo", decodeURI(params.Authorization));
-    }
     if (browser().android || browser().iPhone) {
       this.headerStatus = false;
     }
+    this.$toast.loading({
+      message: "加载中...",
+      duration: 10000,
+      forbidClick: true,
+      loadingType: "spinner",
+    });
+    await checkeIsAssignHomework({ courseScheduleId: this.courseId }).then((res) => {
+      let result = res.data;
+      if (result.code == 200) {
+        let tempData = result.data || {}
+        this.isAssignHomework = tempData.isAssignHomework;
+        this.enableAssignHomework = tempData.enableAssignHomework;
+        const memberNum = tempData.memberNum;
+        const courseStudentNum = tempData.courseStudentNum;
+        if(courseStudentNum == memberNum) {
+          this.memberStatus = 1
+        }
+      } else {
+        this.$toast(result.msg);
+      }
+    });
+
     // 获取头部信息
     if (this.reviewId) {
       // 获取老评价
-      this.$toast.loading({
-        message: "加载中...",
-        duration: 10000,
-        forbidClick: true,
-        loadingType: "spinner",
-      });
-      getReviewInfo({ id: this.reviewId }).then((res) => {
-        this.$toast.clear();
+      await getReviewInfo({ id: this.reviewId }).then((res) => {
         if (res.data.code == 200) {
           let result = res.data.data;
           let teacherClassHeadInfo = result.teacherClassHeadInfo;
@@ -221,6 +229,7 @@ export default {
             teacherClassHeadInfo.endClassTime;
           this.subjectNames = teacherClassHeadInfo.subjectNames;
           this.classGroupName = teacherClassHeadInfo.classGroupName;
+          this.teachMode = teacherClassHeadInfo.teachMode
           this.classType = teacherClassHeadInfo.courseScheduleType;
 
           // 评价内容
@@ -233,11 +242,10 @@ export default {
           this.memo = courseScheduleReview.memo;
           this.homeWork = courseScheduleReview.homeWork;
           this.hasLiaison = courseScheduleReview.hasLiaison.toString();
-          this.handHomework = courseScheduleReview.handHomework.toString();
         }
       });
     } else {
-      getCourseInfoHead({ courseId: this.courseId }).then((res) => {
+      await getCourseInfoHead({ courseId: this.courseId }).then((res) => {
         if (res.data.code == 200) {
           let result = res.data.data;
           this.classTimer =
@@ -247,26 +255,27 @@ export default {
             result.endClassTime;
           this.subjectNames = result.subjectNames;
           this.classGroupName = result.classGroupName;
+          this.teachMode = result.teachMode
           this.classType = result.courseScheduleType;
         }
       });
-    }
-    checkeIsAssignHomework({ courseScheduleId: this.courseId }).then((res) => {
-      let result = res.data;
-      if (result.code == 200) {
-        let tempData = result.data || {}
-        this.isAssignHomework = tempData.isAssignHomework;
-        this.enableAssignHomework = tempData.enableAssignHomework;
-        // const courseViewType = tempData.courseViewType || 0;
-        const memberNum = tempData.memberNum;
-        const courseStudentNum = tempData.courseStudentNum;
-        if(courseStudentNum == memberNum) {
-          this.memberStatus = 1
-        }
-      } else {
-        this.$toast(result.msg);
+
+      // 只有添加的时候才会有缓存数据
+      let courseEvaluationObj = sessionStorage.getItem('courseEvaluationObj')
+      courseEvaluationObj = courseEvaluationObj ? JSON.parse(courseEvaluationObj) : null
+      sessionStorage.removeItem('courseEvaluationObj')
+      if(courseEvaluationObj) {
+        this.teachingMaterial = courseEvaluationObj.teachingMaterial
+        this.song = courseEvaluationObj.song
+        this.pronunciation = courseEvaluationObj.pronunciation
+        this.tempo = courseEvaluationObj.tempo
+        this.musicTheory = courseEvaluationObj.musicTheory
+        this.memo = courseEvaluationObj.memo
+        this.hasLiaison = courseEvaluationObj.hasLiaison
+        this.courseId = courseEvaluationObj.courseId
       }
-    });
+    }
+    this.$toast.clear();
   },
   methods: {
     submitReview() {
@@ -279,7 +288,7 @@ export default {
         return;
       }
       if (!this.memo) {
-        this.$toast("请输入备注");
+        this.$toast("请输入本课程学习内容");
         return;
       }
       // VIP课程是没有双向沟通的
@@ -294,9 +303,7 @@ export default {
         tempo: this.tempo, //节奏
         musicTheory: this.musicTheory, // 乐理
         memo: this.memo, // 备注
-        // homeWork: this.homeWork,
         hasLiaison: this.hasLiaison,
-        handHomework: this.handHomework,
         courseScheduleId: this.courseId,
       };
       if (this.reviewId) {
@@ -314,48 +321,65 @@ export default {
       } else {
         courseReviewAdd(obj).then((res) => {
           if (res.data.code == 200) {
-            if (this.enableAssignHomework) {
-              this.showWork = true;
-            } else {
-              this.$toast("提交成功");
-              setTimeout((res) => {
-                if (this.isInside) {
-                  this.$router.push({ path: "/manageEvaluation" });
-                } else {
-                  this.onAppBack();
-                }
-              }, 1000);
-            }
+            this.$toast("提交成功");
+            setTimeout((res) => {
+              if (this.isInside) {
+                this.$router.push({ path: "/manageEvaluation" });
+              } else {
+                this.onAppBack();
+              }
+            }, 1000);
           }
         });
       }
     },
-    onWork(isAssignHomework) {
-      if (isAssignHomework == 1) {
+    onWork() {
+      const obj = {
+        teachingMaterial: this.teachingMaterial, //教材
+        song: this.song, // 曲目
+        pronunciation: this.pronunciation, // 发音
+        tempo: this.tempo, //节奏
+        musicTheory: this.musicTheory, // 乐理
+        memo: this.memo, // 备注
+        hasLiaison: this.hasLiaison,
+        handHomework: this.handHomework,
+        courseScheduleId: this.courseId,
+      }
+      if(this.isAssignHomework == 1) {
+        return
+      }
+      if (this.enableAssignHomework == 1) {
         this.$dialog
           .confirm({
             message: "您课程所在周已经布置作业,是否继续布置?",
             confirmButtonText: "布置作业",
+            confirmButtonColor: '#01C1B5'
           })
           .then(() => {
             // on confirm
-            this.$router.replace({
+            sessionStorage.setItem('courseEvaluationObj', JSON.stringify(obj))
+            this.$router.push({
               path: "/arrangeWork",
               query: {
                 courseId: this.courseId,
-                memberNum: this.memberStatus
-              },
+                memberNum: this.memberStatus,
+                classGroupName: this.classGroupName,
+                ...this.$route.query
+              }
             });
           })
           .catch(() => {
             // on cancel
           });
       } else {
-        this.$router.replace({
+        sessionStorage.setItem('courseEvaluationObj', JSON.stringify(obj))
+        this.$router.push({
           path: "/arrangeWork",
           query: {
             courseId: this.courseId,
-            memberNum: this.memberStatus
+            memberNum: this.memberStatus,
+            classGroupName: this.classGroupName,
+            ...this.$route.query
           },
         });
       }
@@ -387,7 +411,7 @@ export default {
 @import url("../../assets/commonLess/variable.less");
 
 /deep/.van-cell-group {
-  margin-top: 0.15rem;
+  margin-top: 0.1rem;
 }
 /deep/.van-cell {
   padding: 16px 16px;
@@ -417,7 +441,7 @@ export default {
 /deep/.van-field__control,
 /deep/.van-cell__value {
   font-size: 16px;
-  color: #666;
+  color: #1A1A1A !important;
   width: 70%;
   flex: auto;
 }
@@ -429,6 +453,9 @@ export default {
     width: 100%;
   }
 }
+.input {
+  padding:16px .21rem;
+}
 .twoConnect {
   width: 55%;
 }
@@ -473,6 +500,18 @@ export default {
   }
 }
 
+.course-header {
+  margin-top: .1rem;
+  background: #fff;
+  padding: 16px 0.21rem 16px .12rem;
+  .title-info {
+    padding-bottom: 10px;
+  }
+  .title-time {
+    color: #a1a1a1;
+  }
+}
+
 .van-popup {
   width: 90%;
   border-radius: 0.05rem;
@@ -530,7 +569,7 @@ export default {
   background: #01c1b5;
   border-radius: 3px;
   position: absolute;
-  z-index: 200;
+  z-index: 98;
   top: 19px;
   left: 0.12rem;
 }
@@ -563,4 +602,16 @@ textarea:-ms-input-placeholder {
   color: #777 !important;
   font-size: .14rem;
 }
+
+.teachMode {
+    background: #F2FFFC;
+    border-radius: .03rem;
+    border: 1px solid #01C1B5;
+    font-size: 12px;
+    color: #01C1B5;
+    display: inline-block;
+    // height: 16px;
+    line-height: 16px;
+    padding: 0 5px;
+}
 </style>

+ 14 - 3
src/views/audition/modal/accompanimentModal.vue

@@ -28,6 +28,7 @@
             key="data"
             :finished="finished"
             finished-text="没有更多数据了"
+            :immediate-check="false"
             @load="FetchList"
         >
             <van-cell-group>
@@ -73,13 +74,17 @@ export default {
             default() {
                 return false
             }
+        },
+        searchSubjectId: {
+            type: [Number, String],
+            default: 0
         }
     },
     data() {
         return {
             MusicIcon,
             levelId: 0,
-            subjectId: 0,
+            tempSubjectId: 0,
             levelOptions: [
                 // { text: '全部等级', value: 0 },
             ],
@@ -99,8 +104,14 @@ export default {
             list: [],
         }
     },
+    computed: {
+        subjectId() {
+            return this.tempSubjectId || Number(this.searchSubjectId)
+        }
+    },
     async mounted() {
-        this.FetchLevel()
+        await this.FetchLevel()
+        await this.FetchList()
     },
     methods: {
         async FetchLevel() {
@@ -174,7 +185,7 @@ export default {
             this.onSearch()
         },
         subjectChange(val) {
-            this.subjectId = val
+            this.tempSubjectId = val
             this.onSearch()
         },
         typeChange(val) {

+ 185 - 0
src/views/audition/modal/studentListModel.vue

@@ -0,0 +1,185 @@
+<template>
+    <div class="accompanimentModal">
+        <van-sticky :offset-top="isHead ? '.46rem' : 0">
+            <van-dropdown-menu class="cateDropDown" active-color="#01C1B5">
+                <van-dropdown-item v-model="levelId" :options="levelOptions" @change="levelChange" />
+                <van-dropdown-item v-model="subjectId" :options="subjectOptions" @change="subjectChange" />
+            </van-dropdown-menu>
+            <van-search
+                v-model="search"
+                show-action
+                placeholder="请输入搜索关键词"
+                shape="round"
+            >
+                <template #action>
+                    <div @click="onSearch">搜索</div>
+                </template>
+            </van-search>
+        </van-sticky>
+
+        <van-list
+            v-model="loading"
+            v-if="show"
+            key="data"
+            :finished="finished"
+            finished-text="没有更多数据了"
+            :immediate-check="false"
+            @load="FetchList"
+        >
+            <van-cell-group>
+                <van-cell
+                    v-for="(item, index) in list"
+                    :key="index"
+                    class="input-cell"
+                    clickable
+                    @click="onSelect(item)"
+                    :center="true"
+                >
+                    <template slot="icon">
+                        <van-icon class="iconMusic" :name="MusicIcon" />
+                        <div class='icon' v-if="item.rankIds">
+                            <img src='./icons/vip_icon.png' />
+                        </div>
+                    </template>
+                    <template slot="title">
+                        <!-- {{ item.examSongName }} -->
+                        <van-notice-bar
+                            background="none"
+                            :style="{ paddingLeft: (item.rankIds ? '.04rem' : '.15rem') + '!important' }"
+                            color="#444"
+                            :scrollable="false"
+                            :text="item.examSongName"
+                        />
+                    </template>
+                </van-cell>
+            </van-cell-group>
+        </van-list>
+        <m-empty class="empty" v-else key="data" />
+    </div>
+</template>
+
+<script>
+import { getCourseStudents } from '@/api/teacher'
+import MusicIcon from './icons/music.png'
+export default {
+    props: {
+        isHead: {
+            type: Boolean,
+            default() {
+                return false
+            }
+        },
+        subjectList: {
+            type: Array,
+            default() {
+                return []
+            }
+        }
+    },
+    data() {
+        return {
+            MusicIcon,
+            levelId: 0,
+            tempSubjectId: 0,
+            levelOptions: [
+                { text: '全部声部', value: 0 },
+                { text: '会员学员', value: 0 },
+                { text: '非会员学员', value: 0 },
+            ],
+            subjectOptions: [
+                { text: '全部声部', value: 0 }
+            ],
+            typeId: 0,
+            typeOptions: [],
+            search: null,
+            loading: false,
+            finished: false,
+            show: true,
+            params: {
+                page: 1,
+                rows: 20,
+            },
+            list: [],
+        }
+    },
+    async mounted() {
+        
+    },
+    methods: {
+        
+        subjectChange(val) {
+            this.tempSubjectId = val
+            this.onSearch()
+        },
+        typeChange(val) {
+            this.typeId = val
+            this.onSearch()
+        },
+        onSearch() {
+            this.params.page = 1
+            this.list = []
+            this.show = true
+            this.finished = false
+            this.FetchList()
+        },
+        onSelect(item) {
+            this.$emit('onSelectMusic', item)
+        }
+    }
+}
+</script>
+
+<style lang="less" scoped>
+.accompanimentModal {
+    background-color: #f5f5f5;
+    min-height: 100vh;
+
+    /deep/.van-search {
+        .van-cell {
+            font-size: 0.14rem;
+            padding: 0.05rem 0.08rem;
+            line-height: 0.24rem;
+        }
+        .van-dropdown-menu__bar {
+            height: .36rem;
+            background: transparent;
+            box-shadow: none;
+        }
+    }
+
+    .headDropDown {
+        height: .36rem;
+        background: transparent;
+        /deep/.van-dropdown-menu__title {
+            font-size: .14rem;
+        }
+    }
+    /deep/.van-field__control {
+        font-size: .14rem;
+    }
+    /deep/.van-dropdown-item .van-cell {
+        padding: 0.12rem 0.16rem;
+    }
+
+    .iconMusic {
+        /deep/.van-icon__image {
+            width: .38rem;
+            height: .38rem;
+            margin: auto;
+            vertical-align: middle;
+            // padding-right: .1rem;
+        }
+    }
+
+    .icon{
+        display: flex;
+        align-items: center;
+        margin-left: .15rem;
+        img{
+            width: .4rem;
+            // margin-top: -.02rem;
+        }
+    }
+
+}
+</style>