Pārlūkot izejas kodu

Merge branch '07/06musicArchives' into test

wolyshaw 4 gadi atpakaļ
vecāks
revīzija
d67896298a

+ 15 - 1
src/store/modules/permission.js

@@ -243,7 +243,7 @@ function setDetailRoute(accessedRoutes) {
           hidden: true,
           meta: {
             noCache: '1',
-            title: '乐团会员列表',
+            title: '乐团展演列表',
             belongTopMenu: "/main",
             activeMenu: '/main/main'
           }
@@ -322,6 +322,20 @@ function setDetailRoute(accessedRoutes) {
         },
         // 相册详情
         {
+          name: '全部证书',
+          path: 'performance',
+          component: () => import('@/views/photo-detail'),
+          hidden: true,
+          meta: {
+            noCache: '1',
+            title: '全部证书',
+            belongTopMenu: "/business",
+            activeMenu: '/teamList',
+            id:'xxx28'
+          }
+        },
+        // 全部证书
+        {
           name: '新建vip',
           path: 'buildVip',
           component: () => import('@/views/buildVip/index'),

+ 24 - 17
src/views/photo-detail/index.vue

@@ -1,18 +1,18 @@
 <template>
-  <div :class="{'m-container': type === 'DEFAULT'}">
-    <h2 v-if="type === 'DEFAULT'">
+  <div class="m-container">
+    <h2>
       <el-page-header @back="onCancel" :content="detailName"></el-page-header>
     </h2>
     <div class="m-core">
       <div class="buttons">
         <auth :auths="['photo/add']">
-          <el-button type="primary" @click="openUpload()">{{type === 'DEFAULT' ? '上传照片' : '上传证书'}}</el-button>
+          <el-button type="primary" @click="openUpload()">{{mergeType === 'DEFAULT' ? '上传照片' : '上传证书'}}</el-button>
         </auth>
         <auth :auths="['photo/batchUpdate']">
-          <el-button type="primary" :disabled="list.length == 0" v-if="!editing" @click="changeMode()">{{type === 'DEFAULT' ? '编辑照片' : '编辑证书'}}</el-button>
+          <el-button type="primary" :disabled="list.length == 0" v-if="!editing" @click="changeMode()">{{mergeType === 'DEFAULT' ? '编辑照片' : '编辑证书'}}</el-button>
         </auth>
         <auth :auths="['photo/del']">
-          <el-button type="danger" v-if="editing" @click="remove()">{{type === 'DEFAULT' ? '删除照片' : '删除证书'}}</el-button>
+          <el-button type="danger" v-if="editing" @click="remove()">{{mergeType === 'DEFAULT' ? '删除照片' : '删除证书'}}</el-button>
         </auth>
         <el-button type="primary" v-if="editing" @click="confirm()">确定</el-button>
         <el-button type="primary" v-if="editing" @click="cancel()">取消</el-button>
@@ -42,7 +42,7 @@
               </div>
               <div v-else class="ctrl-bar-view">
                 <el-tooltip effect="dark" content="设为封面" placement="top" :open-delay=".5">
-                  <i class="el-icon-picture-outline-round" @click="setCover(item)" v-if="type === 'DEFAULT'"></i>
+                  <i class="el-icon-picture-outline-round" @click="setCover(item)" v-if="mergeType === 'DEFAULT'"></i>
                   <i v-else></i>
                 </el-tooltip>
                 <el-tooltip effect="dark" :content="views.includes(item.id) ? '设为不可见' : '设为可见'" placement="top" :open-delay=".5">
@@ -53,19 +53,20 @@
             <el-image
               :src="item.url"
               class="img"
+              fit="contain"
               :preview-src-list="list.map(item => item.url)">
             </el-image>
             <el-tooltip v-if="!editing" class="item" effect="dark" :content="item.name" placement="top" :open-delay=".5">
               <div class="name">{{item.name}}</div>
             </el-tooltip>
-            <el-input class="nameinput" v-else v-model="item.name" size="mini" :placeholder="'请输入' + (type === 'DEFAULT' ? '照片' : '证书') + '名称'" clearable/>
+            <el-input class="nameinput" v-else v-model="item.name" size="mini" :placeholder="'请输入' + (mergeType === 'DEFAULT' ? '照片' : '证书') + '名称'" clearable/>
           </div>
         </draggable>
       </el-checkbox-group>
       <empty v-if="list.length == 0"/>
     </div>
     <el-dialog
-      :title="type === 'DEFAULT' ? '上传照片' : '上传证书'"
+      :title="mergeType === 'DEFAULT' ? '上传照片' : '上传证书'"
       :visible.sync="uploadVisible"
       v-if="uploadVisible"
     >
@@ -94,19 +95,23 @@ export default {
     draggable,
   },
   computed: {
+    mergeType() {
+      return this.$route.query.phototype || this.type
+    },
     detailName() {
-      return this.$route.query.name || '相册详情'
+      return this.$route.query.name || this.mergeType === 'DEFAULT' ?'相册详情' : '全部证书'
     },
     queryIdOrType() {
       const id = this.$route.query.pid
-      if (this.type === 'DEFAULT') {
+      if (this.mergeType === 'DEFAULT') {
         return {
           id,
-          type: this.type,
+          type: this.mergeType,
+          photoAlbumId: id,
         }
       }
       return {
-        type: this.type,
+        type: this.mergeType,
         musicGroupId: this.$route.query.id,
       }
     },
@@ -228,9 +233,10 @@ export default {
   flex-direction: column;
   text-align: center;
   position: relative;
-  cursor: move;
+  // cursor: move;
+  width: 200px;
   >.name{
-    width: 150px;
+    width: 100%;
     height: 30px;
     line-height: 30px;
     text-align: center;
@@ -242,7 +248,7 @@ export default {
     font-size: 14px;
   }
   >.nameinput{
-    width: 150px;
+    width: 100%;
     margin-top: 10px;
   }
 }
@@ -286,9 +292,10 @@ export default {
   z-index: 1;
 }
 .img{
-  width: 150px;
-  height: 150px;
+  width: 200px;
+  height: 112.5px;
   border-radius: 3px;
+  background-color: rgba(0, 0, 0, .05);
 }
 .alert{
   margin-top: 20px;

+ 38 - 0
src/views/resetTeaming/components/archicesComponents/api.js

@@ -87,6 +87,16 @@ export const getStudentAndTeacher = data => request2({
 
 })
 
+// 查询学员列表
+export const getStudentList = data => request2({
+  url: '/api-web/musicGroupRecord/queryStudentInfo',
+  data ,
+  params:data,
+  method: 'get',
+  requestType:'form'
+
+})
+
 // 获取作业情况
 export const getHomeworkStat = data => request2({
   url: '/api-web/exercisesSituation/musicGroupHomeworkStat',
@@ -194,4 +204,32 @@ export const delQuestion = data => request2({
 })
 
 
+// 获取展演信息
+export const musicGroupPerformanceQueryPage = data => request2({
+  url: '/api-web/musicGroupPerformance/queryPage',
+  data,
+  method: 'post',
+  requestType: 'form'
+})
 
+// 添加展演信息
+export const musicGroupPerformanceAdd = data => request2({
+  url: '/api-web/musicGroupPerformance/add',
+  data,
+  method: 'post',
+})
+
+// 修改展演信息
+export const musicGroupPerformanceUpdate = data => request2({
+  url: '/api-web/musicGroupPerformance/update',
+  data,
+  method: 'post',
+})
+
+// 删除展演信息
+export const musicGroupPerformanceDel = data => request2({
+  url: '/api-web/musicGroupPerformance/del',
+  data,
+  method: 'post',
+  requestType: 'form'
+})

+ 136 - 0
src/views/resetTeaming/components/archicesComponents/modals/performance-form.vue

@@ -0,0 +1,136 @@
+<template>
+  <div>
+    <el-form
+      ref="form"
+      :model="form"
+      label-width="100px"
+      @submit.stop.native="submit"
+    >
+      <el-form-item
+        label="展演名称"
+        prop="name"
+        :rules="[{required: true, message: '请输入展演名称'}]"
+      >
+        <el-input v-model="form.name" placeholder="请输入展演名称"/>
+      </el-form-item>
+      <el-form-item
+        label="预计时间"
+        prop="startTime"
+        :rules="[{required: true, message: '请选择预计时间'}]"
+      >
+        <el-date-picker
+          v-model="form.startTime"
+          style="width: 100%"
+          placeholder="请选择预计时间">
+        </el-date-picker>
+      </el-form-item>
+      <el-form-item
+        v-for="(item, index) in form.songs"
+        :key="index"
+        :label="'展演曲目' + (index + 1)"
+        :prop="'songs.' + index"
+        :rules="[{required: true, message: '请输入展演曲目'}]"
+      >
+        <div class="cont">
+          <el-input v-model="form.songs[index]" placeholder="请输入展演曲目"/>
+          <div class="ctrls">
+            <i class="el-icon-circle-plus-outline" @click="add"></i>
+            <i class="el-icon-remove-outline" v-if="form.songs.length > 1" @click="remove(index)"></i>
+          </div>
+        </div>
+      </el-form-item>
+      <div class="dialog-footer">
+        <el-button @click="$emit('close')">取 消</el-button>
+        <el-button
+          type="primary"
+          native-type="submit"
+        >确 定</el-button>
+      </div>
+    </el-form>
+  </div>
+</template>
+
+<script>
+import { musicGroupPerformanceAdd, musicGroupPerformanceUpdate} from '../api'
+export default {
+  props: {
+    detail: {
+      type: Object
+    }
+  },
+  data() {
+    return {
+      form: {
+        name: '',
+        startTime: '',
+        songs: ['']
+      }
+    }
+  },
+  mounted() {
+    if (this.detail) {
+      this.form.name = this.detail.name
+      this.form.startTime = this.detail.startTime
+      const s = (this.detail.musicScoreName || '').split(',')
+      this.form.songs = s.length ? s : ['']
+    }
+  },
+  methods: {
+    add() {
+      this.form.songs.push('')
+    },
+    remove(index) {
+      this.form.songs.splice(index, 1)
+    },
+    async submit(evt) {
+      evt.stopPropagation()
+      evt.stopImmediatePropagation()
+      evt.preventDefault()
+      this.$refs.form.validate(async (valid) => {
+        if (valid) {
+          try {
+            const {songs, ...rest} = this.form
+            if (this.detail) {
+              await musicGroupPerformanceUpdate([{
+                ...rest,
+                musicScoreNames: songs,
+                musicGroupId: this.$route.query.id,
+                id: this.detail.id
+              }])
+              this.$message.success('修改成功')
+            } else {
+              await musicGroupPerformanceAdd({
+                ...rest,
+                musicScoreNames: songs,
+                musicGroupId: this.$route.query.id
+              })
+              this.$message.success('添加成功')
+            }
+            this.$emit('close')
+            this.$emit('submited')
+          } catch (error) {}
+        }
+      })
+    },
+  }
+}
+</script>
+
+<style lang="less" scoped>
+.dialog-footer{
+  text-align: right;
+}
+.cont{
+  display: flex;
+  justify-content: space-between;
+  .ctrls{
+    width: 100px;
+    margin-left: 10px;
+    >i{
+      font-size: 20px;
+      margin-left: 10px;
+      cursor: pointer;
+    }
+  }
+}
+</style>

+ 48 - 31
src/views/resetTeaming/components/archicesComponents/modals/studentMaster.vue

@@ -1,12 +1,9 @@
 <template>
   <div>
-    <save-form
+    <el-form
       ref="searchForm"
       :inline="true"
-      save-key="studentMaster"
       class="searchForm"
-      @submit="search"
-      @reset="onReSet"
       :model="searchForm"
     >
       <el-form-item prop="search">
@@ -17,7 +14,7 @@
           @keyup.enter.native="search"
         ></el-input>
       </el-form-item>
-      <el-form-item prop="major">
+      <el-form-item prop="subjectId">
         <el-select
           v-model.trim="searchForm.subjectId"
           clearable
@@ -33,9 +30,9 @@
         </el-select>
       </el-form-item>
 
-      <el-form-item prop="currentGrade">
+      <el-form-item prop="currentGradeNum">
         <el-select
-          v-model.trim="searchForm.currentGrade"
+          v-model.trim="searchForm.currentGradeNum"
           filterable
           clearable
           placeholder="请选择年级"
@@ -44,13 +41,13 @@
             v-for="(item, index) in gradeList"
             :key="index"
             :label="item.label"
-            :value="item.label"
+            :value="item.value"
           ></el-option>
         </el-select>
       </el-form-item>
-      <el-form-item prop="oweFlag">
+      <el-form-item prop="isBuyInstrumentsInsurance">
         <el-select
-          v-model.trim="searchForm.oweFlag"
+          v-model="searchForm.isBuyInstrumentsInsurance"
           clearable
           filterable
           placeholder="是否购买月保"
@@ -60,23 +57,23 @@
         </el-select>
       </el-form-item>
       <el-form-item>
-        <el-button native-type="submit" type="danger">搜索</el-button>
-        <el-button type="primary" native-type="reset">重置</el-button>
-        <el-button
+        <el-button  type="danger" @click="search">搜索</el-button>
+        <el-button type="primary" @click="onReSet">重置</el-button>
+        <!-- <el-button
           type="primary"
           v-permission="'export/musicGroupStudent'"
           @click="onMusicGroupExport"
           >导出</el-button
-        >
+        > -->
       </el-form-item>
-    </save-form>
+    </el-form>
     <el-table
       :data="tableList"
       :header-cell-style="{ background: '#EDEEF0', color: '#444' }"
     >
       <el-table-column label="学员编号" width="120px;" prop="userId">
       </el-table-column>
-      <el-table-column label="学员姓名" width="120px;" prop="realName">
+      <el-table-column label="学员姓名" width="120px;" prop="name">
       </el-table-column>
       <el-table-column align="center" prop="phone" label="联系电话">
         <template slot-scope="scope">
@@ -88,44 +85,42 @@
       <el-table-column align="center" label="声部" prop="subjectName">
         <template slot-scope="scope">
           <copy-text>
-            {{ scope.row.regSubjectName }}
+            {{ scope.row.subjectName }}
           </copy-text>
         </template>
       </el-table-column>
       <el-table-column align="center" label="年级">
         <template slot-scope="scope">
-          <div>{{ scope.row.currentGrade + scope.row.currentClass }}</div>
+          <div>{{getGrade(scope.row.currentGradeNum)  }}</div>
         </template>
       </el-table-column>
       <el-table-column align="center" label="乐器品牌">
         <template slot-scope="scope">
-          <div>{{ scope.row.paymentStatus | paymentStatus }}</div>
+          <div>{{ scope.row.goodsBrand }}</div>
         </template>
       </el-table-column>
       <el-table-column align="center" label="乐器型号">
         <template slot-scope="scope">
-          <div>{{ scope.row.paymentStatus | paymentStatus }}</div>
+          <div>{{ scope.row.specification }}</div>
         </template>
       </el-table-column>
       <el-table-column align="center" label="购买日期">
         <template slot-scope="scope">
-          <div>{{ scope.row.paymentStatus | paymentStatus }}</div>
+          <div>{{ scope.row.goodsBuyTime | formatTimer }}</div>
         </template>
       </el-table-column>
       <el-table-column align="center" label="是否购买月保">
         <template slot-scope="scope">
-          <div>{{ scope.row.isActive ? "是" : "否" }}</div>
+          <div>{{ scope.row.insuranceStartTime ? "是" : "否" }}</div>
         </template>
       </el-table-column>
-      <el-table-column align="center" label="月保有效期">
+      <el-table-column align="center" label="月保有效期" width="100px">
         <template slot-scope="scope">
-          <div>{{ scope.row.hasCourse ? "是" : "否" }}</div>
+          <div>{{ scope.row.insuranceStartTime | formatTimer }}~{{ scope.row.insuranceEndTime | formatTimer }}</div>
         </template>
       </el-table-column>
     </el-table>
     <pagination
-      save-key="studentMaster"
-      sync
       :total.sync="rules.total"
       :page.sync="rules.page"
       :limit.sync="rules.limit"
@@ -135,9 +130,10 @@
   </div>
 </template>
 <script>
+import { getStudentList } from "../api"
 import pagination from "@/components/Pagination/index";
 export default {
-  props: ["searchForm", "soundList", "gradeList"],
+  props: ["searchForm", "soundList", "gradeList","gradeMap"],
   components:{pagination},
   data() {
     return {
@@ -151,12 +147,33 @@ export default {
       },
     };
   },
-  mounted() {},
+  mounted() {
+    this.getList()
+  },
   methods: {
-       getList(){},
+      async getList(){
+        try{
+          const res = await  getStudentList({...this.searchForm,page:this.rules.page,rows:this.rules.limit, musicGroupId: this.$route.query.id})
+          //  res.data.rows
+          this.tableList = res.data.rows
+          this.rules.total = res.data.total
+        }catch(e){
+
+        }
+
+       },
     onMusicGroupExport() {},
-    search() {},
-    onReSet() {},
+    search() {
+      this.rules.page = 1;
+      this.getList()
+    },
+    onReSet() {
+      this.$refs.searchForm.resetFields()
+      this.search()
+    },
+    getGrade(id){
+      return this.gradeMap[id]
+    }
   },
 };
 </script>

+ 0 - 1
src/views/resetTeaming/components/archicesComponents/modals/surveyMask.vue

@@ -119,7 +119,6 @@ export default {
     return {};
   },
   mounted() {
-    console.log(this.form.id);
   },
   methods: {
     submitSurvey() {

+ 263 - 0
src/views/resetTeaming/components/archicesComponents/performance.vue

@@ -0,0 +1,263 @@
+<template>
+  <div class="performance">
+    <el-alert :closable="false" class="alert" type="info">
+      <template slot="title">
+        <div class="alerTitle">
+          <div class="shapeWrap">
+            <span class="shape"></span>
+            <p style="margin-right: 5px">展演信息</p>
+          </div>
+          <auth auths="musicGroupPerformance/add">
+            <el-button type="text" @click="openForm()"
+              >+新增满意度调查</el-button
+            >
+          </auth>
+        </div>
+      </template>
+    </el-alert>
+    <div class="tableWrap">
+      <el-table
+        style="width: 100%"
+        :header-cell-style="{ background: '#EDEEF0', color: '#444' }"
+        :data="tableList"
+      >
+        <el-table-column
+          align="center"
+          prop="name"
+          label="展演名称"
+        ></el-table-column>
+        <el-table-column
+          align="center"
+          prop="startTime"
+          label="预计时间"
+        ></el-table-column>
+        <el-table-column
+          align="center"
+          prop="musicScoreName"
+          label="展演曲目"
+        ></el-table-column>
+        <el-table-column
+          align="center"
+          prop="operatorName"
+          label="添加人"
+        ></el-table-column>
+        <el-table-column
+          align="center"
+          label="操作"
+          fixed="right"
+          width="220px"
+        >
+          <template slot-scope="scope">
+            <auth auths="musicGroupPerformance/update">
+              <el-button
+                type="text"
+                @click="openForm(scope.row)"
+                >修改</el-button
+              >
+            </auth>
+            <auth auths="musicGroupPerformance/del">
+              <el-button
+                type="text"
+                @click="remove(scope.row)"
+                >删除</el-button
+              >
+            </auth>
+          </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="FetchList"
+      />
+    </div>
+    <el-alert :closable="false" class="alert" type="info">
+      <template slot="title">
+        <div class="alerTitle">
+          <div class="shapeWrap">
+            <span class="shape"></span>
+            <p style="margin-right: 5px">获奖证书</p>
+          </div>
+          <auth auths="photo/queryPage">
+            <el-button type="text"
+              @click="toPerformance"
+              >全部证书 ></el-button
+            >
+          </auth>
+        </div>
+      </template>
+    </el-alert>
+    <div
+      v-for="(item) in photos"
+      :key="item.url"
+      class="img-container"
+    >
+      <el-image
+        :src="item.url"
+        class="img"
+        fit="contain"
+        :preview-src-list="photos.map(item => item.url)">
+      </el-image>
+      <el-tooltip class="item" effect="dark" :content="item.name" placement="top" :open-delay=".5">
+        <div class="name">{{item.name}}</div>
+      </el-tooltip>
+    </div>
+    <el-dialog
+      :title="detail ? '修改展演信息' : '添加展演信息'"
+      :visible.sync="formVisible"
+      width="500px"
+    >
+      <performance-form
+        v-if="formVisible"
+        @close="formVisible = false"
+        @submited="submited"
+        :detail="detail"
+      />
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import pagination from "@/components/Pagination/index";
+import PerformanceForm from './modals/performance-form.vue'
+import { photoQueryPage } from '@/views/resetTeaming/components/training-photos/api'
+import { musicGroupPerformanceQueryPage, musicGroupPerformanceDel } from './api'
+export default {
+  components: {
+    pagination,
+    PerformanceForm
+  },
+  data() {
+    return {
+      detail: null,
+      formVisible: false,
+      tableList: [],
+      photos: [],
+      rules: {
+        // 分页规则
+        limit: 10, // 限制显示条数
+        page: 1, // 当前页
+        total: 0, // 总条数
+        page_size: [10, 20, 40, 50], // 选择限制显示条数
+      },
+    }
+  },
+  mounted() {
+    this.FetchList()
+    this.FetchPhoto()
+  },
+  methods: {
+    toPerformance() {
+      this.$router.push({
+        path: '/business/performance',
+        query: {
+          returnUrl: this.$route.fullPath,
+          phototype: 'SHOW'
+        }
+      })
+    },
+    openForm(detail) {
+      this.detail = detail
+      this.formVisible = true
+    },
+    submited() {
+      this.rules.page = 1
+      this.FetchList()
+    },
+    async remove(item) {
+      try {
+        await this.$confirm('是否确认删除此数据', '提示')
+        await musicGroupPerformanceDel({
+          id: item.id
+        })
+        this.$message.success('删除成功')
+        this.submited()
+      } catch (error) {}
+    },
+    async FetchList() {
+      try {
+        const res = await musicGroupPerformanceQueryPage({
+          page: this.rules.page
+        })
+        this.tableList = res.data.rows;
+        this.rules.total = res.data.total;
+      } catch (error) {}
+    },
+    async FetchPhoto() {
+      try {
+        const res = await photoQueryPage({
+          rows: 5,
+          type: 'SHOW',
+          musicGroupId: this.$route.query.id
+        })
+        this.photos = res.data.rows;
+      } catch (error) {}
+    }
+  }
+}
+</script>
+
+<style lang="less" scoped>
+.performance{
+  /deep/.el-alert__content{
+    width: 100%;
+  }
+}
+.shapeWrap {
+  display: flex;
+  flex-direction: row;
+  justify-content: flex-start;
+  align-items: center;
+  .shape {
+    position: relative;
+    top: -1px;
+    display: block;
+    margin-right: 10px;
+    height: 14px;
+    width: 4px;
+    background-color: #14928a;
+    z-index: 500;
+  }
+}
+.alerTitle {
+  width: 100%;
+  display: flex;
+  flex-direction: row;
+  justify-content: space-between;
+  .el-button {
+    padding: 0 20px !important;
+  }
+}
+.img-container{
+  display: inline-flex;
+  margin-right: 20px;
+  margin-top: 20px;
+  flex-direction: column;
+  text-align: center;
+  position: relative;
+  >.name{
+    width: 100%;
+    height: 30px;
+    line-height: 30px;
+    text-align: center;
+    margin-top: 10px;
+    color: rgba(0, 0, 0, .65);
+    overflow: hidden;
+    text-overflow: ellipsis;
+    white-space: pre;
+    font-size: 14px;
+  }
+}
+.img{
+  width: 200px;
+  height: 112.5px;
+  border-radius: 3px;
+  background-color: rgba(0, 0, 0, .05);
+}
+.tableWrap{
+  margin-top: 20px;
+}
+</style>

+ 45 - 33
src/views/resetTeaming/components/archicesComponents/studentAndTeacher.vue

@@ -4,9 +4,9 @@
       <template slot="title">
         <div class="shapeWrap">
           <span class="shape"></span>
-          <p style="margin-right:5px">学员分布</p>
-          <span v-if="graduateNums>0" style="color: red; font-weight: bold"
-            >该乐团当前有{{graduateNums}}名学员在毕业年级</span
+          <p style="margin-right: 5px">学员分布</p>
+          <span v-if="graduateNums > 0" style="color: red; font-weight: bold"
+            >该乐团当前有{{ graduateNums }}名学员在毕业年级</span
           >
         </div>
       </template>
@@ -32,8 +32,8 @@
     <el-divider class="divider"></el-divider>
     <el-row class="row">
       <el-col class="col" :span="6" v-for="(item, index) in grade" :key="index">
-        <span class="col-title">{{ gradeMap[item.key ]}}:</span>
-        <span class="col-value" @click="getGradeInfo(gradeMap[item.key ])"
+        <span class="col-title">{{ gradeMap[item.key] }}:</span>
+        <span class="col-value" @click="getGradeInfo(String(item.key))"
           >{{ item.value }}人</span
         >
       </el-col>
@@ -43,7 +43,7 @@
       <template slot="title">
         <div class="shapeWrap">
           <span class="shape"></span>
-          <p style="margin-right:5px">师资安排</p>
+          <p style="margin-right: 5px">师资安排</p>
           <el-tooltip placement="top" popper-class="mTooltip">
             <div slot="content">师资安排中第一位为主教老师</div>
             <i
@@ -74,9 +74,11 @@
       v-if="studentVisible"
     >
       <studentMaster
+        v-if="studentVisible"
         :searchForm="searchForm"
         :soundList="soundList"
         :gradeList="gradeList"
+        :gradeMap="gradeMap"
       />
       <div slot="footer" class="dialog-footer">
         <el-button type="primary" @click="studentVisible = false"
@@ -89,9 +91,9 @@
 <script>
 import { getStudentAndTeacher } from "./api";
 import studentMaster from "./modals/studentMaster";
-import { getMusicGroupGradeList, findSound } from "@/api/buildTeam";
+import { findSound } from "@/api/buildTeam";
 export default {
-  props:['graduateNum'],
+  props: ["graduateNum"],
   components: { studentMaster },
   data() {
     return {
@@ -102,8 +104,8 @@ export default {
       searchForm: {
         search: "",
         subjectId: "",
-        currentGrade: "",
-        oweFlag: "",
+        currentGradeNum: "",
+        isBuyInstrumentsInsurance: "",
       },
       teamid: this.$route.query.id,
       soundList: [],
@@ -116,23 +118,20 @@ export default {
         this.soundList = res.data;
       }
     });
-    getMusicGroupGradeList({ musicGroupId: this.teamid }).then((res) => {
-      let result = res.data;
-      if (res.code == 200 && result) {
-        for (let i in result) {
-          this.gradeList.push({
-            value: i,
-            label: result[i],
-          });
-        }
-      }
-    });
+
     try {
       const res = await getStudentAndTeacher({
         musicGroupId: this.$route.query.id,
       });
       this.grade = res.data.grade;
-      this.gradeMap = res.data.gradeMap
+      this.gradeMap = res.data.gradeMap;
+      this.gradeList = [];
+      for (let i in this.gradeMap) {
+        this.gradeList.push({
+          value: i,
+          label: this.gradeMap[i],
+        });
+      }
       this.subject = res.data.subject;
       this.teacher = res.data.teacher;
     } catch (e) {
@@ -141,28 +140,41 @@ export default {
   },
   methods: {
     getSoundInfo(val) {
-      this.searchForm = {
+      this.$set(this,'searchForm',{
         search: "",
         subjectId: val,
-        currentGrade: "",
-        oweFlag: "",
-      };
+        currentGradeNum: "",
+        isBuyInstrumentsInsurance: "",
+      })
+      // this.searchForm = {
+      //   search: "",
+      //   subjectId: val,
+      //   currentGradeNum: "",
+      //   isBuyInstrumentsInsurance: "",
+      // };
+
       this.studentVisible = true;
     },
     getGradeInfo(val) {
-      this.searchForm = {
+            this.$set(this,'searchForm',{
         search: "",
         subjectId: "",
-        currentGrade: val,
-        oweFlag: "",
-      };
+        currentGradeNum:val,
+        isBuyInstrumentsInsurance: "",
+      })
+      // this.searchForm = {
+      //   search: "",
+      //   subjectId: "",
+      //   currentGradeNum: val,
+      //   isBuyInstrumentsInsurance: "",
+      // };
       this.studentVisible = true;
     },
   },
   computed: {
-    graduateNums(){
-      return this.graduateNum
-    }
+    graduateNums() {
+      return this.graduateNum;
+    },
   },
 };
 </script>

+ 5 - 2
src/views/resetTeaming/components/archicesComponents/teamInfo.vue

@@ -209,8 +209,11 @@ export default {
     },
     gotoLink(url){
       var p = window.location.protocol;
-      window.open(`${p}//${url}`,"_blank")
-
+      if(url.indexOf('http')!= -1){
+         window.open(`${p}//${url}`,"_blank")
+      }else{
+         window.open(url,"_blank")
+      }
     }
   },
 };

+ 13 - 6
src/views/resetTeaming/components/archicesComponents/trainPlan.vue

@@ -179,7 +179,7 @@ import { filterCourseType } from "@/constant/index";
 import addplan from "./modals/addPlan";
 import Tooltip from "@/components/Tooltip/index";
 export default {
-  props: ["planDtosList"],
+  props: ["planDtosList", "planDtosList1"],
   components: { addplan, Tooltip },
   data() {
     return {
@@ -216,12 +216,18 @@ export default {
   },
   computed: {
     exceptionPlan() {
-      let str = "该乐团当前学期";
-      this.planDtosList.forEach((plan,index) => {
-        str += `${index+1}.${plan.classGroupName}班${filterCourseType[plan.scheduleType]}${
-          plan.num
-        }未进行教学规划; `;
+      let str = "该乐团学期";
+      this.planDtosList.forEach((plan, index) => {
+        str += `${plan.classGroupName}班${plan.num}节${
+          filterCourseType[plan.scheduleType]
+        }未进行教学规划; `;
       });
+      this.planDtosList1.forEach((plan, index) => {
+        str += `${plan.classGroupName}班${
+          filterCourseType[plan.scheduleType]
+        }训练规划与课时数不符; `;
+      });
+
       return str;
     },
   },
@@ -337,6 +343,7 @@ export default {
           this.$message.error("当前学期该班级暂无此类型课程");
           return;
         }
+
         if (classDates.length >= musicGroupTrainPlans.length) {
           this.planList = res2.data.classDates.map((time, index) => {
             let dayStr = time.substring(0, 19);

+ 15 - 3
src/views/resetTeaming/components/musicArchices.vue

@@ -27,11 +27,11 @@
           slot="label"
           class="badge"
           is-dot
-          :hidden="!planDtosList.length>0"
+          :hidden="!planDtosList.length>0&&!planDtosList1.length>0"
 
           >训练规划</el-badge
         >
-        <trainPlan :planDtosList="planDtosList" v-if="activeIndex == 3"  @getPlanError="getPlanError"/>
+        <trainPlan :planDtosList="planDtosList" :planDtosList1="planDtosList1" v-if="activeIndex == 3"  @getPlanError="getPlanError"/>
       </el-tab-pane>
       <el-tab-pane
         label="训练时长"
@@ -58,13 +58,21 @@
         <training-photos v-if="activeIndex == 6" />
       </el-tab-pane>
       <el-tab-pane
+        label="展演&证书"
+        lazy
+        v-if="permission('/archicesPhotosDetail')"
+        name="9"
+      >
+        <performance v-if="activeIndex == 9" />
+      </el-tab-pane>
+      <!-- <el-tab-pane
         label="获奖证书"
         lazy
         v-if="permission('/archicesPhotosDetail')"
         name="9"
       >
         <photo-detail type="SHOW" v-if="activeIndex == 9" />
-      </el-tab-pane>
+      </el-tab-pane> -->
       <el-tab-pane
         label="乐团资讯"
         lazy
@@ -96,6 +104,7 @@ import teamInfo from "./archicesComponents/teamInfo";
 import trainPlan from "./archicesComponents/trainPlan";
 import trainTimer from "./archicesComponents/trainTimer";
 import workStatus from "./archicesComponents/workStatus";
+import performance from './archicesComponents/performance'
 import { getExceptionPlan } from './archicesComponents/api'
 export default {
   components: {
@@ -109,11 +118,13 @@ export default {
     trainPlan,
     trainTimer,
     workStatus,
+    performance
   },
   data() {
     return {
       activeIndex: "training-photos",
     planDtosList:[],
+    planDtosList1:[],
     year:'',
     term:'',
     graduateNum:0,
@@ -144,6 +155,7 @@ export default {
      try{
        const res = await getExceptionPlan({musicGroupId:this.$route.query.id,year:this.year,term:this.term})
        this.planDtosList = res.data.waitCourseTrainPlanDtos
+        this.planDtosList1= res.data.waitCourseTrainPlanDtos1
        this.graduateNum = res.data.graduateNum
      }catch(e){
        console.log(e)

+ 6 - 4
src/views/resetTeaming/components/training-photos/group/index.vue

@@ -51,7 +51,7 @@ export default {
     cursor: pointer;
     .list{
       width: 200px;
-      padding: 10px;
+      // padding: 10px;
       background-color: rgba(0, 0, 0, .05);
       border-radius: 6px;
     }
@@ -68,8 +68,9 @@ export default {
     .img{
       width: 100%;
       // width: 130px;
-      height: 130px;
+      height: 112.5px;
       border-radius: 3px;
+      // background-color: rgba(0, 0, 0, .05);
     }
     .viewer{
       img {
@@ -84,10 +85,11 @@ export default {
   /deep/.image-slot{
     display: flex;
     height: 100%;
+    // background-color: rgba(0, 0, 0, .05);
     i{
       margin: auto;
-      font-size: 36px;
-      color: #909399;
+      font-size: 48px;
+      color: #ccc;
     }
   }
 </style>

+ 9 - 4
src/views/resetTeaming/components/training-photos/index.vue

@@ -33,7 +33,7 @@
                       <i class="el-icon-edit" @click.stop="openForm(item)"></i>
                     </el-tooltip>
                     <el-tooltip effect="dark" content="删除" placement="top" :open-delay=".5">
-                      <i style="color: #f56c6c" class="el-icon-delete" @click.stop="removeItem(item)"></i>
+                      <i class="el-icon-delete" @click.stop="removeItem(item)"></i>
                     </el-tooltip>
                   </div>
                   <!-- <el-dropdown class="dropdown" @command="command => handleCommand(command, item)">
@@ -168,7 +168,7 @@ export default {
     async removeItem(item) {
       try {
         await this.$confirm('相册内的照片将一起删除无法恢复,请谨慎操作', '提示')
-        await photoAlbumDel({id: item.id})
+        await photoAlbumDel({ids: item.id})
         this.submited()
       } catch (error) {
         console.log(error)
@@ -202,7 +202,7 @@ export default {
     top: 0;
     left: 0;
     width: 100%;
-    bottom: 40px;
+    bottom: 55px;
     visibility: hidden;
     opacity: 0;
     border-radius: 10px;
@@ -226,9 +226,10 @@ export default {
       i{
         margin-right: 5px;
         cursor: pointer;
+        font-size: 18px;
       }
       padding-right: 10px;
-      border-bottom: 1px solid #fff;
+      // border-bottom: 1px solid #fff;
       width: 100%;
       padding-bottom: 10px;
     }
@@ -252,6 +253,10 @@ export default {
 }
 .timeline{
   margin-top: 20px;
+  margin-left: 10px;
+  /deep/ .el-timeline-item__node{
+    background-color: #14928A;
+  }
 }
 // .group{
 // }

+ 8 - 1
src/views/resetTeaming/components/training-photos/upload/index.vue

@@ -30,9 +30,10 @@
         :show-file-list="false"
         multiple
         accept=".png, .jpg, .jpeg, .gif"
+        :before-upload="beforeUpload"
         :on-success="successed"
         :on-remove="handleRemove">
-        <el-button type="primary">上传图片</el-button>
+        <el-button :loading="uploading" type="primary">上传图片</el-button>
       </el-upload>
       <div class="img-container">
         <div class="list" v-if="uploaded.length > 0">
@@ -82,6 +83,7 @@ export default {
       fileList: [],
       dialogImageUrl: '',
       dialogVisible: false,
+      uploading: false,
       form: {
         photoAlbumId: ''
       },
@@ -97,7 +99,12 @@ export default {
     handleChange(file, fileList) {
       this.fileList = fileList.slice(-3);
     },
+    beforeUpload() {
+      this.uploading = true
+      return true
+    },
     successed(response, file, fileList) {
+      this.uploading = false
       if (response.code === 200) {
         this.uploaded.push({
           url: response.data.url,