Browse Source

Merge remote-tracking branch 'origin/yuetuan' into LAOMO

mo 4 years ago
parent
commit
7c0fbedc81
28 changed files with 2345 additions and 217 deletions
  1. 81 0
      src/api/specialSetting.js
  2. 38 0
      src/constant/index.js
  3. 1 1
      src/layout/components/AppMain.vue
  4. 26 0
      src/utils/index.js
  5. 4 2
      src/utils/request2.js
  6. 11 6
      src/views/categroyManager/globalConfig.vue
  7. 64 67
      src/views/categroyManager/specialSetup/chargesList.vue
  8. 326 0
      src/views/categroyManager/specialSetup/discountManage.vue
  9. 325 0
      src/views/categroyManager/specialSetup/modals/chargesForm.vue
  10. 108 0
      src/views/categroyManager/specialSetup/modals/create-discount.vue
  11. 18 77
      src/views/categroyManager/specialSetup/typesManager.vue
  12. 14 0
      src/views/resetTeaming/api.js
  13. 49 4
      src/views/resetTeaming/components/resetPayList.vue
  14. 8 2
      src/views/resetTeaming/index.vue
  15. 50 0
      src/views/resetTeaming/modals/classrooms.vue
  16. 141 0
      src/views/resetTeaming/modals/extra-class.vue
  17. 87 0
      src/views/resetTeaming/modals/payment-cycle.vue
  18. 11 0
      src/views/resetTeaming/modals/school-pay-form.vue
  19. 127 0
      src/views/resetTeaming/modals/user-baseinfo.vue
  20. 244 0
      src/views/resetTeaming/modals/user-pay-form.vue
  21. 2 1
      src/views/teamBuild/components/teamBaseInfo.vue
  22. 110 0
      src/views/teamDetail/components/modals/classroom-setting-item.vue
  23. 92 0
      src/views/teamDetail/components/modals/classroom-setting.vue
  24. 161 0
      src/views/teamDetail/components/modals/select-student.vue
  25. 49 0
      src/views/teamDetail/components/modals/view-student-list.vue
  26. 108 39
      src/views/teamDetail/components/resetClass.vue
  27. 89 17
      src/views/teamDetail/components/studentList.vue
  28. 1 1
      vue.config.js

+ 81 - 0
src/api/specialSetting.js

@@ -1,5 +1,6 @@
 // 系统专项设置api文件
 // 系统专项设置api文件
 import request from '@/utils/request'
 import request from '@/utils/request'
+import request2 from '@/utils/request2'
 import qs from 'qs'
 import qs from 'qs'
 let api = '/api-web'
 let api = '/api-web'
 // 分页查询分部列表
 // 分页查询分部列表
@@ -180,3 +181,83 @@ export function findEducationTeacher (data) {
     params: data
     params: data
   })
   })
 }
 }
+
+// 获取收费类型与科目的关联服务
+export function chargeTypeSubjectMapper (data) {
+  return request2({
+    url: api + '/chargeTypeSubjectMapper/queryPage',
+    method: 'get',
+    data: {},
+    params: data,
+    requestType: 'form',
+  })
+}
+
+// 新增收费类型与科目的关联服务
+export function insertChargeTypeSubjectMapper (data) {
+  return request2({
+    url: api + '/chargeTypeSubjectMapper/insert',
+    method: 'post',
+    data,
+  })
+}
+
+// 修改收费类型与科目的关联服务
+export function updateChargeTypeSubjectMapper (data) {
+  return request2({
+    url: api + '/chargeTypeSubjectMapper/update',
+    method: 'post',
+    data,
+  })
+}
+
+// 删除收费类型与科目的关联服务
+export function delChargeTypeSubjectMapper (data) {
+  const { id, ...rest } = data
+  return request2({
+    url: api + '/chargeTypeSubjectMapper/del/' + id,
+    method: 'post',
+    params: rest,
+  })
+}
+
+// 收费方式添加
+export function musicGroupOrganizationCourseSettingsAdd (data) {
+  return request2({
+    url: api + '/musicGroupOrganizationCourseSettings/add',
+    method: 'post',
+    data
+  })
+}
+
+// 收费方式修改
+export function musicGroupOrganizationCourseSettingsUpdate (data) {
+  return request2({
+    url: api + '/musicGroupOrganizationCourseSettings/update',
+    method: 'post',
+    data
+  })
+}
+
+// 收费方式删除
+export function musicGroupOrganizationCourseSettingsDel (data) {
+  return request2({
+    url: api + '/musicGroupOrganizationCourseSettings/delSetting',
+    method: 'post',
+    data: {},
+    params: data,
+    requestType: 'form',
+  })
+}
+
+// 收费方式列表
+export function musicGroupOrganizationCourseSettingsQueryPage (data) {
+  return request2({
+    url: api + '/musicGroupOrganizationCourseSettings/queryPage',
+    method: 'get',
+    data: {},
+    params: data,
+    requestType: 'form',
+  })
+}
+

+ 38 - 0
src/constant/index.js

@@ -26,9 +26,47 @@ export const feeProject = {
   19: '退费',
   19: '退费',
 }
 }
 
 
+export const courseType = {
+  SINGLE: '单技课',
+  MIX: '合奏课',
+  HIGH: '基础训练课',
+  COMPREHENSIVE: '综合课',
+  ENLIGHTENMENT: '启蒙课',
+  TRAINING_SINGLE: '集训单技课',
+  TRAINING_MIX: '集训合奏课',
+  HIGH_ONLINE: '网络基础训练课',
+  MUSIC_NETWORK: '乐团网管课',
+}
+
+export const boolOptions = {
+  false: '否',
+  true: '是',
+}
+
 export const saleType = {
 export const saleType = {
   INSTRUMENT: '乐器销售',
   INSTRUMENT: '乐器销售',
   ACCESSORIES: '配件销售',
   ACCESSORIES: '配件销售',
   SCHOOL_BUY: '学校采购',
   SCHOOL_BUY: '学校采购',
   OTHER: '其他',
   OTHER: '其他',
 }
 }
+
+export const genderType = {
+  1: '男',
+  0: '女',
+}
+
+export const paymentPatternType = {
+  0: '按月',
+  1: '按季',
+  2: '一次性',
+}
+
+export const payUserType = {
+  STUDENT: '学员',
+  SCHOOL: '学校',
+}
+
+export const paymentType = {
+  0: '续费',
+  1: '报名',
+}

+ 1 - 1
src/layout/components/AppMain.vue

@@ -3,7 +3,7 @@
     <!--   -->
     <!--   -->
     <transition name="fade-transform"
     <transition name="fade-transform"
                 mode="out-in">
                 mode="out-in">
-      <keep-alive>
+      <keep-alive exclude="modal-chargesForm">
         <router-view :key="key" />
         <router-view :key="key" />
       </keep-alive>
       </keep-alive>
     </transition>
     </transition>

+ 26 - 0
src/utils/index.js

@@ -8,6 +8,7 @@
  * @param {string} cFormat
  * @param {string} cFormat
  * @returns {string}
  * @returns {string}
  */
  */
+import dayjs from 'dayjs'
 export function parseTime (time, cFormat) {
 export function parseTime (time, cFormat) {
   if (arguments.length === 0) {
   if (arguments.length === 0) {
     return null
     return null
@@ -135,3 +136,28 @@ export function formatDuring (mss) {
   return hours + ":" + minutes + ":" + seconds;
   return hours + ":" + minutes + ":" + seconds;
 
 
 }
 }
+
+export const objectToOptions = data => {
+  const options = []
+  for (const key in data) {
+    if (data.hasOwnProperty(key)) {
+      const item = data[key]
+      const upkey = key.toLocaleUpperCase()
+      options.push({
+        label: item,
+        value: (upkey === 'TRUE' || upkey === 'FALSE' ? upkey === 'TRUE' : key)
+      })
+    }
+  }
+  return options
+}
+
+export const getTimes = (times, keys = []) => {
+  if (times && times.length) {
+    return {
+      [keys[0] || 'start']: dayjs(times[0]).format('YYYY-MM-DD'),
+      [keys[1] || 'start']: dayjs(times[1]).format('YYYY-MM-DD'),
+    }
+  }
+  return {}
+}

+ 4 - 2
src/utils/request2.js

@@ -96,10 +96,12 @@ service.interceptors.request.use(
       // ['X-Token'] is a custom headers key
       // ['X-Token'] is a custom headers key
       // please modify it according to the actual situation
       // please modify it according to the actual situation
       config.headers['Authorization'] = getToken()
       config.headers['Authorization'] = getToken()
-      // config.headers['content-type'] = "application/x-www-form-urlencoded"
+      if (config.requestType === 'form') {
+        config.headers['Content-Type'] = 'application/x-www-form-urlencoded'
+      }
     }
     }
     config.params = cleanDeep(config.params)
     config.params = cleanDeep(config.params)
-    //  params: cleanDeep(options.params),
+    config.data = cleanDeep(config.data)
     return config
     return config
   },
   },
   error => {
   error => {

+ 11 - 6
src/views/categroyManager/globalConfig.vue

@@ -6,7 +6,7 @@
     <div class="m-core">
     <div class="m-core">
       <!-- navMenu -->
       <!-- navMenu -->
       <el-tabs v-model.trim="activeIndex" type="card" @tab-click="handleClick">
       <el-tabs v-model.trim="activeIndex" type="card" @tab-click="handleClick">
-        
+
         <el-tab-pane label="声部设置(对内)" name="0" v-if="permissionList.musicalManager">
         <el-tab-pane label="声部设置(对内)" name="0" v-if="permissionList.musicalManager">
             <musicalManager v-if="activeIndex == 0" />
             <musicalManager v-if="activeIndex == 0" />
         </el-tab-pane>
         </el-tab-pane>
@@ -16,6 +16,9 @@
         <el-tab-pane label="乐团收费类型" name="2" v-if="permissionList.typesManager">
         <el-tab-pane label="乐团收费类型" name="2" v-if="permissionList.typesManager">
             <typesManager v-if="activeIndex == 2" />
             <typesManager v-if="activeIndex == 2" />
         </el-tab-pane>
         </el-tab-pane>
+        <el-tab-pane label="折扣设置" name="9" v-if="permissionList.typesManager">
+            <discountManage v-if="activeIndex == 9" />
+        </el-tab-pane>
         <el-tab-pane label="乐团收费标准" name="3" v-if="permissionList.chargesList">
         <el-tab-pane label="乐团收费标准" name="3" v-if="permissionList.chargesList">
           <chargesList v-if="activeIndex == 3" />
           <chargesList v-if="activeIndex == 3" />
         </el-tab-pane>
         </el-tab-pane>
@@ -46,6 +49,7 @@ import holidaySetting from './generalSettings/holidaySetting'
 import musicalManager from './specialSetup/musicalManager'
 import musicalManager from './specialSetup/musicalManager'
 import musicalManagerOut from './specialSetup/musicalManagerOut'
 import musicalManagerOut from './specialSetup/musicalManagerOut'
 import typesManager from './specialSetup/typesManager'
 import typesManager from './specialSetup/typesManager'
+import discountManage from './specialSetup/discountManage'
 import jobTemplateSetting from './specialSetup/jobTemplateSetting'
 import jobTemplateSetting from './specialSetup/jobTemplateSetting'
 import errorManager from './generalSettings/errorManager'
 import errorManager from './generalSettings/errorManager'
 import chargesList from './specialSetup/chargesList'
 import chargesList from './specialSetup/chargesList'
@@ -55,10 +59,11 @@ export default {
     overallManager,
     overallManager,
     overallManagerTwo,
     overallManagerTwo,
     holidaySetting,
     holidaySetting,
-    musicalManager, 
-    musicalManagerOut, 
-    typesManager, 
-    jobTemplateSetting, 
+    musicalManager,
+    musicalManagerOut,
+    typesManager,
+    discountManage,
+    jobTemplateSetting,
     errorManager,
     errorManager,
     chargesList
     chargesList
   },
   },
@@ -90,4 +95,4 @@ export default {
 /deep/.m-container {
 /deep/.m-container {
   padding: 0 10px 40px
   padding: 0 10px 40px
 }
 }
-</style>
+</style>

+ 64 - 67
src/views/categroyManager/specialSetup/chargesList.vue

@@ -7,14 +7,35 @@
       <div class="tableWrap">
       <div class="tableWrap">
         <el-table :data="dataList"
         <el-table :data="dataList"
                   :header-cell-style="{background:'#EDEEF0',color:'#444'}">
                   :header-cell-style="{background:'#EDEEF0',color:'#444'}">
-          <el-table-column prop="organName"
+          <el-table-column prop="organId"
                            label="所属分部">
                            label="所属分部">
+            <template slot-scope="scope">
+              {{ branchById[scope.row.organId] }}
+            </template>
+          </el-table-column>
+          <el-table-column prop="chargeTypeId"
+                    label="乐团模式">
+            <template slot-scope="scope">
+              {{ typesById[scope.row.chargeTypeId] }}
+            </template>
           </el-table-column>
           </el-table-column>
-          <el-table-column prop="chargeTypeName"
-                           label="收费类型">
+          <el-table-column prop="name"
+                           label="收费方式名称">
           </el-table-column>
           </el-table-column>
-          <el-table-column prop="courseFee"
-                           label="课程费用">
+          <el-table-column prop="totalCurrentPrice"
+                           label="现价(元)">
+            <template slot-scope="scope">
+              {{ scope.row.totalCurrentPrice | moneyFormat }}
+            </template>
+          </el-table-column>
+          <el-table-column prop="totalOriginalPrice"
+                           label="原价(元)">
+            <template slot-scope="scope">
+              {{ scope.row.totalOriginalPrice | moneyFormat }}
+            </template>
+          </el-table-column>
+          <el-table-column prop="updateTime"
+                           label="修改时间">
           </el-table-column>
           </el-table-column>
           <el-table-column align='center'
           <el-table-column align='center'
                            label="操作">
                            label="操作">
@@ -37,68 +58,39 @@
 
 
       <el-dialog :title="formTitle[formActionTitle]"
       <el-dialog :title="formTitle[formActionTitle]"
                  :visible.sync="chargeStatus"
                  :visible.sync="chargeStatus"
-                 @close="onFormClose('ruleForm')"
-                 width="500px">
-        <el-form :model="form"
-                 :rules="rules"
-                 ref="ruleForm">
-          <el-form-item label="所属分部"
-                        prop="organId"
-                        :label-width="formLabelWidth">
-            <el-select v-model.trim="form.organId"
-                       clearable
-                       filterable>
-              <el-option v-for="(item, index) in branchList"
-                         :key="index"
-                         :label="item.label"
-                         :value="item.value">
-              </el-option>
-            </el-select>
-          </el-form-item>
-          <el-form-item label="收费类型"
-                        prop="chargeTypeId"
-                        :label-width="formLabelWidth">
-            <el-select v-model.trim="form.chargeTypeId"
-                       clearable
-                       filterable>
-              <el-option v-for="(item, index) in typesList"
-                         :key="index"
-                         :label="item.label"
-                         :value="item.value">
-              </el-option>
-            </el-select>
-          </el-form-item>
-          <el-form-item label="课程费用"
-                        prop="courseFee"
-                        :label-width="formLabelWidth">
-            <el-input type="number"
-                      @mousewheel.native.prevent
-                      v-model.trim="form.courseFee"
-                      autocomplete="off"></el-input>
-          </el-form-item>
-        </el-form>
-        <span slot="footer"
-              class="dialog-footer">
-          <el-button @click="chargeStatus = false">取 消</el-button>
-          <el-button @click="onTypesSubmit('ruleForm')"
-                     type="primary">确 定</el-button>
-        </span>
+                 @close="closeModal"
+                 destroy-on-close
+                 width="850px">
+        <chargesForm
+          :typesList="typesList"
+          :branchList.sync="branchList"
+          :rowDetail="rowDetail"
+          @close="closeModal"
+          @submited="getList"
+        />
       </el-dialog>
       </el-dialog>
     </div>
     </div>
   </div>
   </div>
 </template>
 </template>
 <script>
 <script>
 import pagination from '@/components/Pagination/index'
 import pagination from '@/components/Pagination/index'
-import { chargeTypeList, chargeTypeOrganizationFeeAdd, chargeTypeOrganizationFeeDelete, chargeTypeOrganizationFeeUpdate, chargeTypeOrganizationFee, branchQueryPage } from '@/api/specialSetting'
+import { chargeTypeList, chargeTypeOrganizationFeeAdd, musicGroupOrganizationCourseSettingsDel, chargeTypeOrganizationFeeUpdate, chargeTypeOrganizationFee, branchQueryPage, musicGroupOrganizationCourseSettingsQueryPage } from '@/api/specialSetting'
+import chargesForm from './modals/chargesForm'
 export default {
 export default {
-  components: { pagination },
+  components: {
+    pagination,
+    chargesForm
+  },
   name: 'chargesList',
   name: 'chargesList',
   data () {
   data () {
     return {
     return {
       id: null,
       id: null,
+      rowDetail: null,
       dataList: [],
       dataList: [],
       typesList: [], // 分部列表
       typesList: [], // 分部列表
       branchList: [], // 分部列表
       branchList: [], // 分部列表
+      typesById: {},
+      branchById: {},
       formActionTitle: 'create',
       formActionTitle: 'create',
       formTitle: {
       formTitle: {
         create: '添加乐团收费标准',
         create: '添加乐团收费标准',
@@ -124,7 +116,7 @@ export default {
       }
       }
     }
     }
   },
   },
-  mounted () {
+  async mounted () {
     this.getList()
     this.getList()
 
 
     // 收费类型
     // 收费类型
@@ -133,12 +125,15 @@ export default {
       page: 1
       page: 1
     }).then(res => {
     }).then(res => {
       if (res.code == 200) {
       if (res.code == 200) {
+        const typesById = {}
         res.data.rows.forEach(item => {
         res.data.rows.forEach(item => {
+          typesById[item.id] = item.name
           this.typesList.push({
           this.typesList.push({
             label: item.name,
             label: item.name,
             value: item.id
             value: item.id
           })
           })
         })
         })
+        this.typesById = typesById
       }
       }
     })
     })
 
 
@@ -148,12 +143,15 @@ export default {
       page: 1
       page: 1
     }).then(res => {
     }).then(res => {
       if (res.code == 200) {
       if (res.code == 200) {
-        res.data.rows.forEach(item => {
-          this.branchList.push({
+        const branchById = {}
+        this.branchList = res.data.rows.map(item => {
+          branchById[item.id] = item.name
+          return ({
             label: item.name,
             label: item.name,
             value: item.id
             value: item.id
           })
           })
         })
         })
+        this.branchById = branchById
       }
       }
     })
     })
   },
   },
@@ -188,17 +186,13 @@ export default {
       }
       }
     },
     },
     onChargeOperation (type, row) {
     onChargeOperation (type, row) {
-      this.chargeStatus = true
       this.formActionTitle = type
       this.formActionTitle = type
-
       if (type == 'update') {
       if (type == 'update') {
-        this.form = {
-          chargeTypeId: row.chargeTypeId,
-          courseFee: row.courseFee,
-          organId: row.organId,
-          id: row.id
-        }
+        this.rowDetail = { ...row }
+      } else {
+        this.rowDetail = null
       }
       }
+      this.chargeStatus = true
     },
     },
     onChargeDelete (row) { // 删除
     onChargeDelete (row) { // 删除
       this.$confirm('您确定删除该收费标准?', '提示', {
       this.$confirm('您确定删除该收费标准?', '提示', {
@@ -206,14 +200,14 @@ export default {
         cancelButtonText: '取消',
         cancelButtonText: '取消',
         type: 'warning'
         type: 'warning'
       }).then(() => {
       }).then(() => {
-        chargeTypeOrganizationFeeDelete({ id: row.id }).then(res => {
+        musicGroupOrganizationCourseSettingsDel({ id: row.id }).then(res => {
           this.messageTips('删除', res)
           this.messageTips('删除', res)
         })
         })
       }).catch(() => { })
       }).catch(() => { })
 
 
     },
     },
     getList () {
     getList () {
-      chargeTypeOrganizationFee({
+      musicGroupOrganizationCourseSettingsQueryPage({
         rows: this.pageInfo.limit,
         rows: this.pageInfo.limit,
         page: this.pageInfo.page
         page: this.pageInfo.page
       }).then(res => {
       }).then(res => {
@@ -230,6 +224,9 @@ export default {
       }
       }
       this.$refs[formName].resetFields()
       this.$refs[formName].resetFields()
     },
     },
+    closeModal() {
+      this.chargeStatus = false
+    }
   }
   }
 }
 }
 </script>
 </script>
@@ -256,4 +253,4 @@ export default {
 /deep/.el-table {
 /deep/.el-table {
   display: inline-block;
   display: inline-block;
 }
 }
-</style>
+</style>

+ 326 - 0
src/views/categroyManager/specialSetup/discountManage.vue

@@ -0,0 +1,326 @@
+<template>
+  <div class='m-container'>
+    <!-- <h2>折扣设置</h2> -->
+    <div class="m-core">
+      <div class='newBand' v-permission="'chargeType/upSet'"
+           @click="createVisible = true">添加</div>
+      <!-- 列表 -->
+      <div class="tableWrap">
+        <el-table :data='tableList'
+                  :header-cell-style="{background:'#EDEEF0',color:'#444'}">
+          <el-table-column align='center'
+                           prop="chargeTypeId"
+                           label="收费类型">
+                           <template slot-scope="scope">{{ typesListById[scope.row.chargeTypeId] }}</template>
+          </el-table-column>
+          <el-table-column align='center'
+                           prop="subjectId"
+                           label="声部组合">
+                           <template slot-scope="scope">{{ subjectListById[scope.row.subjectId] }}</template>
+          </el-table-column>
+          <el-table-column align='center'
+                  prop="goodsDiscountRate"
+                  label="折扣(%)">
+          </el-table-column>
+          <el-table-column align='center'
+                           label="操作">
+            <template slot-scope="scope">
+              <el-button @click="openTypes('update', scope.row)" v-permission="'chargeType/upSet'"
+                         type="text">修改</el-button>
+              <el-button @click="onTypesDel(scope.row)" v-permission="'chargeType/del'"
+                         type="text">删除</el-button>
+            </template>
+          </el-table-column>
+        </el-table>
+        <pagination :total="pageInfo.total"
+                    :page.sync="pageInfo.page"
+                    :limit.sync="pageInfo.limit"
+                    :page-sizes="pageInfo.page_size"
+                    @pagination="getList" />
+      </div>
+    </div>
+    <el-dialog :title="formTitle[formActionTitle]"
+               :visible.sync="typeStatus"
+               @close="onFormClose('ruleForm')"
+               width="500px">
+      <el-form :model="form"
+               :rules="rules"
+               ref="ruleForm">
+        <el-form-item label="收费类型"
+                      prop="chargeTypeId"
+                      :label-width="formLabelWidth">
+          <el-select v-model.trim="form.chargeTypeId"
+                     filterable
+                     placeholder="请选择收费类型"
+                     clearable>
+            <el-option v-for="item in typesList"
+                        :key="item.value"
+                        :label="item.label"
+                        :value="item.value">
+            </el-option>
+          </el-select>
+        </el-form-item>
+        <el-form-item label="声部选择"
+                      v-if="form.classGroupType != 'MIX'"
+                      prop="subjectId"
+                      :label-width="formLabelWidth">
+          <el-select v-model.trim="form.subjectId"
+                     filterable
+                     placeholder="请选择声部组合"
+                     clearable>
+            <el-option-group v-for="group in subjectList"
+                             :key="group.label"
+                             :label="group.label">
+              <el-option v-for="item in group.options"
+                         :key="item.value"
+                         :label="item.label"
+                         :value="item.value">
+              </el-option>
+            </el-option-group>
+          </el-select>
+        </el-form-item>
+        <el-form-item label="折扣(%)"
+                      prop="goodsDiscountRate"
+                      :label-width="formLabelWidth">
+          <el-input-number v-model.trim="form.goodsDiscountRate"
+            autocomplete="off"
+            placeholder="请输入折扣 1%-100%"
+            controls-position="right"
+            class="number-input"
+            :min="1"
+            :max="100"
+            :precision="0"
+          ></el-input-number>
+        </el-form-item>
+      </el-form>
+      <span slot="footer"
+            class="dialog-footer">
+        <el-button @click="typeStatus = false">取 消</el-button>
+        <el-button type="primary"
+                   @click="onTypesSubmit('ruleForm')">确 定</el-button>
+      </span>
+    </el-dialog>
+    <el-dialog
+      :visible.sync="createVisible"
+      title="添加折扣"
+      width="400px"
+    >
+      <createDiscount
+        @close="createVisible = false"
+        :typesList="typesList"
+        :subjectList="subjectList"
+      />
+    </el-dialog>
+  </div>
+</template>
+<script>
+import pagination from '@/components/Pagination/index'
+import { chargeTypeList, subjectListTree, insertChargeTypeSubjectMapper, updateChargeTypeSubjectMapper, delChargeTypeSubjectMapper, chargeTypeSubjectMapper } from '@/api/specialSetting'
+import createDiscount from './modals/create-discount'
+export default {
+  name: 'typesManager',
+  components: { pagination, createDiscount },
+  data () {
+    return {
+      tableList: [],
+      typesList: [],
+      typesListById: {},
+      subjectList: [], // 声部列表
+      subjectListById: {}, // 声部列表
+      formActionTitle: 'create',
+      formTitle: {
+        create: '添加折扣',
+        update: '修改折扣'
+      },
+      createVisible: false,
+      typeStatus: false, // 添加教学点
+      formLabelWidth: '100px',
+      form: {
+        name: null, //
+        subjectId: null,
+        goodsDiscountRate: null,
+      },
+      rules: {
+        chargeTypeId: [{ required: true, message: '请选择收费类型', trigger: 'blur' }],
+        subjectId: [{ required: true, message: '请选择声部组合', trigger: 'change' }],
+        goodsDiscountRate: [{ required: true, message: '请输入折扣', trigger: 'blur' }],
+      },
+      pageInfo: {
+        // 分页规则
+        limit: 10, // 限制显示条数
+        page: 1, // 当前页
+        total: 0, // 总条数
+        page_size: [10, 20, 40, 50] // 选择限制显示条数
+      }
+    }
+  },
+  mounted () {
+    this.getList()
+    this.getChargeTypeList()
+    this.getSubjectTree()
+  },
+  methods: {
+    onTypesSubmit (formName) { // 添加数据
+      this.$refs[formName].validate((valid) => {
+        if (valid) {
+          if (this.formActionTitle == 'create') {
+            if (this.form.id) { // 判断有没有Id,如果有则删除
+              delete this.form.id
+            }
+            insertChargeTypeSubjectMapper(this.form).then(res => {
+              this.messageTips('添加', res)
+            })
+          } else if (this.formActionTitle == 'update') {
+            updateChargeTypeSubjectMapper([this.form]).then(res => {
+              this.messageTips('修改', res)
+            })
+          }
+        } else {
+          return false;
+        }
+      })
+    },
+    messageTips (title, res) {
+      if (res.code == 200) {
+        this.$message.success(title + '成功')
+        this.typeStatus = false
+        this.getList()
+      } else {
+        this.$message.error(res.msg)
+      }
+    },
+    async onTypesDel (row) {
+      try {
+        await this.$confirm('是否删除此条数据?', '提示', {
+          confirmButtonText: '确定',
+          cancelButtonText: '取消',
+          type: 'warning'
+        })
+        delChargeTypeSubjectMapper({id: row.id}).then(res => {
+          this.messageTips('删除', res)
+        })
+      } catch (error) {}
+    },
+    getChargeTypeList() {
+      chargeTypeList({
+        rows: 9999,
+        page: 1
+      }).then(res => {
+        if (res.code == 200) {
+          const typesListById = {}
+          res.data.rows.forEach(item => {
+            typesListById[item.id] = item.name
+            this.typesList.push({
+              label: item.name,
+              value: item.id
+            })
+          })
+          this.typesListById = typesListById
+        }
+      })
+    },
+    getList () {
+      chargeTypeSubjectMapper({
+        rows: this.pageInfo.limit,
+        page: this.pageInfo.page
+      }).then(res => {
+        let result = res.data
+        this.tableList = result.rows
+        // if (res.code == 200) {
+        //   result.data.rows.forEach(row => {
+        //     let subjectname = [],
+        //       subjectIds = []
+        //     row.subjects.forEach(item => {
+        //       subjectname.push(item.name)
+        //       subjectIds.push(item.id)
+        //     })
+        //     row.subjectName = subjectname
+        //     row.subjectIds = subjectIds
+        //   })
+        //   this.tableList = result.rows
+          this.pageInfo.total = result.total
+        // }
+      })
+    },
+    openTypes (type, row) {
+      this.typeStatus = true
+      this.formActionTitle = type
+      // 修改的时候赋值
+      if (type == 'update') {
+        this.form = {
+          id: row.id,
+          chargeTypeId: row.chargeTypeId,
+          subjectId: row.subjectId,
+          goodsDiscountRate: row.goodsDiscountRate,
+        }
+      }
+    },
+    onFormClose (formName) { // 关闭弹窗重置验证
+      this.form = {
+        name: null, // 作业模块名称
+        subjectId: null,
+        goodsDiscountRate: null,
+      }
+      this.$refs[formName].resetFields()
+    },
+    getSubjectTree () { // 获取声部列表
+      subjectListTree({
+        delFlag: 0,
+        rows: 9999
+      }).then(res => {
+        const subjectListById = {}
+        let result = res.data
+        if (res.code == 200) {
+          let tempArray = []
+          result.rows.forEach((item, index) => {
+            let subject = []
+            if (item.subjects) {
+              item.subjects.forEach(s => {
+                subjectListById[s.id] = s.name
+                subject.push({
+                  value: s.id,
+                  label: s.name
+                })
+              })
+            }
+
+            tempArray[index] = {
+              label: item.name,
+              options: subject
+            }
+          })
+          this.subjectListById = subjectListById
+          this.subjectList = tempArray
+        }
+      })
+    }
+  }
+}
+</script>
+<style lang="scss" scoped>
+.el-button--primary {
+  background: #14928a;
+  border-color: #14928a;
+  color: #fff;
+  &:hover,
+  &:active,
+  &:focus {
+    background: #14928a;
+    border-color: #14928a;
+    color: #fff;
+  }
+}
+/deep/.el-date-editor.el-input {
+  width: 100% !important;
+}
+.el-select {
+  width: 100% !important;
+}
+.number-input{
+  /deep/ .el-input__inner {
+    text-align: left;
+  }
+
+  width: 100%;
+}
+</style>

+ 325 - 0
src/views/categroyManager/specialSetup/modals/chargesForm.vue

@@ -0,0 +1,325 @@
+<template>
+  <div>
+    <el-form :model="form"
+              label-suffix=": "
+              ref="form">
+      <el-form-item label="所属分部"
+                    prop="organId"
+                    :rules="[{required: true, message: '请选择所属分部', trigger: 'change'}]"
+                    :label-width="formLabelWidth">
+        <el-select v-model.trim="form.organId"
+                    clearable
+                    placeholder="请选择所属分部"
+                    filterable>
+          <el-option v-for="(item, index) in branchList"
+                      :key="index"
+                      :label="item.label"
+                      :value="item.value">
+          </el-option>
+        </el-select>
+      </el-form-item>
+      <el-form-item label="乐团模式"
+                    prop="chargeTypeId"
+                    :rules="[{required: true, message: '请选择乐团模式', trigger: 'change'}]"
+                    :label-width="formLabelWidth">
+        <el-select v-model.trim="form.chargeTypeId"
+                    clearable
+                    placeholder="请选择乐团模式"
+                    filterable>
+          <el-option v-for="(item, index) in typesList"
+                      :key="index"
+                      :label="item.label"
+                      :value="item.value">
+          </el-option>
+        </el-select>
+      </el-form-item>
+      <el-form-item label="收费方式名称"
+                    prop="name"
+                    :rules="[{required: true, message: '请输入收费方式名称', trigger: 'blur'}]"
+                    :label-width="formLabelWidth">
+        <el-input v-model.trim="form.name"
+                  placeholder="请输入收费方式名称"
+                  clearable>
+        </el-input>
+      </el-form-item>
+      <div class="class-items">
+        <div class="items">
+          <div class="items-header">
+            <span class="name">课程类型</span>
+            <span class="name">是否可选</span>
+            <span class="name">课程总时长(分钟)</span>
+            <span class="name">现价(元)</span>
+            <span class="name">原价(元)</span>
+            <span class="ctrl"></span>
+          </div>
+          <div class="item" v-for="(item, index) in form.details" :key="index">
+            <el-form-item
+              :prop="`details.${index}.courseType`"
+              :rules="[{required: true, message: '请选择课程类型', trigger: 'change'}]"
+            >
+              <el-select v-model.trim="item.courseType"
+                          size="mini"
+                          clearable
+                          filterable>
+                <el-option  v-for="item in courseTypeOptions"
+                            :key="item.value"
+                            :label="item.label"
+                            :disabled="isOptionDisabled(item.value)"
+                            :value="item.value">
+                </el-option>
+              </el-select>
+            </el-form-item>
+            <el-form-item
+              :prop="`details.${index}.isStudentOptional`"
+              :rules="[{required: true, message: '请选择是否可选', trigger: 'change'}]"
+            >
+              <el-select v-model.trim="item.isStudentOptional"
+                          size="mini"
+                          clearable
+                          filterable>
+                <el-option  v-for="item in boolOptions"
+                            :key="item.value"
+                            :label="item.label"
+                            :value="item.value">
+                </el-option>
+              </el-select>
+            </el-form-item>
+            <el-form-item
+              :prop="`details.${index}.courseTotalMinuties`"
+              :rules="[{required: true, message: '请输入课程总时长', trigger: 'blur'}]"
+            >
+              <el-input-number
+                size="mini"
+                style="width: 90%!important;"
+                class="number-input"
+                v-model="item.courseTotalMinuties"
+                :controls="false"
+                :precision="0"
+                :min="1"
+                placeholder="课程总时长"
+              />
+            </el-form-item>
+            <el-form-item
+              :prop="`details.${index}.courseOriginalPrice`"
+              :rules="[{required: true, message: '请输入课程原价', trigger: 'blur'}]"
+            >
+              <el-input-number
+                size="mini"
+                style="width: 90%!important;"
+                class="number-input"
+                v-model="item.courseOriginalPrice"
+                :controls="false"
+                :precision="0"
+                :min="1"
+                placeholder="课程原价"
+              />
+            </el-form-item>
+            <el-form-item
+              :prop="`details.${index}.courseCurrentPrice`"
+              :rules="[{required: true, message: '请输入课程现价', trigger: 'blur'}]"
+            >
+              <el-input-number
+                size="mini"
+                style="width: 90%!important;"
+                class="number-input"
+                v-model="item.courseCurrentPrice"
+                :controls="false"
+                :precision="0"
+                :min="1"
+                placeholder="课程现价"
+              />
+            </el-form-item>
+            <span class="ctrl">
+              <i @click="removeItem(index)" v-if="form.details.length > 1" class="el-icon-circle-close" />
+            </span>
+          </div>
+        </div>
+        <el-button
+          icon="el-icon-circle-plus-outline"
+          plain class="create-type-button"
+          type="info"
+          size="small"
+          @click="addItem"
+        >新增课程类型</el-button>
+      </div>
+      <el-row>
+        <el-col :span="6">
+          <el-form-item label="原价"
+                        prop="totalOriginalPrice"
+                        label-width="50px">
+                        {{ totalOriginalPrice | moneyFormat}}
+          </el-form-item>
+        </el-col>
+        <el-col :span="6">
+          <el-form-item label="现价"
+                        prop="totalCurrentPrice"
+                        label-width="50px">
+                        {{ totalCurrentPrice | moneyFormat}}
+          </el-form-item>
+        </el-col>
+      </el-row>
+    </el-form>
+    <span slot="footer"
+          class="dialog-footer">
+      <el-button @click="$listeners.close">取 消</el-button>
+      <el-button @click="submit"
+                  type="primary">确 定</el-button>
+    </span>
+  </div>
+</template>
+<script>
+const initItem = {
+  courseType: '',
+  isStudentOptional: '',
+  courseTotalMinuties: '',
+  courseOriginalPrice: '',
+  courseCurrentPrice: '',
+}
+import { musicGroupOrganizationCourseSettingsAdd, musicGroupOrganizationCourseSettingsUpdate } from '@/api/specialSetting'
+import { classTimeList } from '@/utils/searchArray'
+import { courseType, boolOptions } from '@/constant'
+import { objectToOptions }  from '@/utils'
+import numeral from 'numeral'
+
+const plusNum = (items = [], key) => {
+  let money = 0
+  const _items = items.filter(item => item.isStudentOptional < 1)
+  for (const item of _items) {
+    money += parseFloat(item[key] || 0).toFixed(2) || 0
+  }
+  return money
+}
+
+const initForm = {
+  organId: '',
+  classTimeList: '',
+  chargeTypeId: '',
+  name: '',
+  details: [{}],
+}
+
+export default {
+  name: 'modal-chargesForm',
+  props: ['branchList', 'typesList', 'rowDetail'],
+  data() {
+    return {
+      form: {...initForm},
+      formLabelWidth: '120px',
+      courseTypeOptions: objectToOptions(courseType),
+      boolOptions: objectToOptions(boolOptions),
+    }
+  },
+  computed: {
+    totalOriginalPrice() {
+      return plusNum(this.form.details, 'courseOriginalPrice')
+    },
+    totalCurrentPrice() {
+      return plusNum(this.form.details, 'courseCurrentPrice')
+    }
+  },
+  watch: {
+    rowDetail() {
+      console.log({...this.rowDetail})
+      this.updateForm()
+    }
+  },
+  mounted() {
+    this.updateForm()
+  },
+  methods: {
+    updateForm() {
+      if (this.rowDetail) {
+        const { organId, classTimeList, chargeTypeId, name, details } = this.rowDetail
+        this.form = {
+          organId,
+          classTimeList,
+          chargeTypeId,
+          name,
+          details: details.map(item => ({
+            ...item,
+            isStudentOptional: String(item.isStudentOptional)
+          }))
+        }
+      } else {
+        this.form = {...initForm}
+      }
+    },
+    isOptionDisabled(key) {
+      const selected = this.form.details.map(item => item.courseType)
+      return selected.includes(key)
+    },
+    addItem() {
+      const _items = [...this.form.details, {}]
+      this.form.details = _items
+    },
+    removeItem(index) {
+      const _items = [...this.form.details]
+      _items[index] = null
+      this.form.details = _items.filter(item => !!item)
+    },
+    submit() {
+      this.$refs.form.validate(async (valid) => {
+        if (valid) {
+          try {
+            if (this.rowDetail) {
+              const res = await musicGroupOrganizationCourseSettingsUpdate({
+                id: this.rowDetail.id,
+                ...this.form
+              })
+              this.$message.success('更新成功')
+            } else {
+              const res = await musicGroupOrganizationCourseSettingsAdd(this.form)
+              this.$message.success('提交成功')
+            }
+            this.$listeners.close()
+            this.$listeners.submited()
+          } catch (error) {}
+        }
+      })
+    }
+  },
+}
+</script>
+<style lang="less" scoped>
+  .dialog-footer{
+    display: block;
+    text-align: right;
+  }
+  .items{
+    .items-header,
+    .item{
+      display: flex;
+      >.el-form-item,
+      >span{
+        width: 100%;
+        text-align: center;
+        padding: 0 10px;
+        &.ctrl{
+          width: 300px;
+        }
+      }
+    }
+    .items-header{
+      background-color: #f1f1f1;
+      padding: 10px 0;
+      margin-bottom: 10px;
+      >span{
+        line-height: 26px;
+      }
+    }
+  }
+  .create-type-button{
+    width: 100%;
+    margin-bottom: 20px;
+  }
+  .ctrl{
+    display: flex;
+    align-items: center;
+    justify-content: center;
+    margin-bottom: 26px;
+    i{
+      cursor: pointer;
+      font-size: 18px;
+    }
+  }
+</style>

+ 108 - 0
src/views/categroyManager/specialSetup/modals/create-discount.vue

@@ -0,0 +1,108 @@
+<template>
+  <div>
+    <el-form :model="form" ref="form">
+      <el-form-item
+        label="声部选择"
+        prop="subjectId"
+        :label-width="formLabelWidth"
+        :rules="[{ required: true, message: '请选择声部', trigger: 'change' }]"
+      >
+        <el-select
+          v-model.trim="form.subjectId"
+          filterable
+          style="width: 100%!important;"
+          placeholder="请选择声部组合"
+          clearable
+        >
+          <el-option-group
+            v-for="group in subjectList"
+            :key="group.label"
+            :label="group.label"
+          >
+            <el-option
+              v-for="item in group.options"
+              :key="item.value"
+              :label="item.label"
+              :value="item.value"
+            >
+            </el-option>
+          </el-option-group>
+        </el-select>
+      </el-form-item>
+      <el-form-item
+        v-for="item in typesList"
+        :key="item.value"
+        :label="item.label + '模式折扣(%)'"
+        :prop="`types.${item.value}`"
+        :label-width="formLabelWidth"
+        :rules="[{ required: true, message: '请输入折扣', trigger: 'blur' }]"
+      >
+        <el-input-number v-model.trim="form.types[item.value]"
+          autocomplete="off"
+          placeholder="请输入折扣 1%-100%"
+          controls-position="right"
+          class="number-input"
+          :min="1"
+          :max="100"
+          :precision="0"
+        ></el-input-number>
+      </el-form-item>
+    </el-form>
+    <span slot="footer" class="dialog-footer">
+      <el-button @click="$listeners.close">取 消</el-button>
+      <el-button type="primary" @click="submit">确 定</el-button>
+    </span>
+  </div>
+</template>
+<script>
+import { insertChargeTypeSubjectMapper } from '@/api/specialSetting'
+export default {
+  props: ['typesList', 'subjectList'],
+  data() {
+    return {
+      formLabelWidth: '130px',
+      form: {
+        subjectId: '',
+        types: {},
+      }
+    }
+  },
+  methods: {
+    submit() {
+      this.$refs.form.validate(async valid => {
+        if (valid) {
+          const data = []
+          for (const key in this.form.types) {
+            if (this.form.types.hasOwnProperty(key)) {
+              const item = this.form.types[key];
+              data.push({
+                chargeTypeId: key,
+                subjectId: this.form.subjectId,
+                goodsDiscountRate: item
+              })
+            }
+          }
+          try {
+            await insertChargeTypeSubjectMapper(data)
+            this.$message.success('创建成功')
+            this.$listeners.close()
+          } catch (error) {}
+        }
+      })
+    }
+  },
+};
+</script>
+<style lang="less" scoped>
+  .dialog-footer{
+    display: block;
+    text-align: right;
+  }
+  .number-input{
+    /deep/ .el-input__inner {
+      text-align: left;
+    }
+
+    width: 100%;
+  }
+</style>

+ 18 - 77
src/views/categroyManager/specialSetup/typesManager.vue

@@ -13,18 +13,13 @@
                            label="收费类型">
                            label="收费类型">
           </el-table-column>
           </el-table-column>
           <el-table-column align='center'
           <el-table-column align='center'
-                           label="声部组合">
-            <template slot-scope="scope">
-              {{ scope.row.subjectName | joinArray(',') }}
-            </template>
-          </el-table-column>
-          <el-table-column align='center'
                            label="操作">
                            label="操作">
             <template slot-scope="scope">
             <template slot-scope="scope">
               <el-button @click="openTypes('update', scope.row)" v-permission="'chargeType/upSet'"
               <el-button @click="openTypes('update', scope.row)" v-permission="'chargeType/upSet'"
                          type="text">修改</el-button>
                          type="text">修改</el-button>
-              <el-button @click="onTypesDel(scope.row)" v-permission="'chargeType/del'"
-                         type="text">删除</el-button>
+              <el-button slot="reference" v-permission="'chargeType/del'"
+                  @click="onTypesDel(scope.row)"
+                  type="text">删除</el-button>
             </template>
             </template>
           </el-table-column>
           </el-table-column>
         </el-table>
         </el-table>
@@ -46,27 +41,9 @@
                       prop="name"
                       prop="name"
                       :label-width="formLabelWidth">
                       :label-width="formLabelWidth">
           <el-input v-model.trim="form.name"
           <el-input v-model.trim="form.name"
+                    placeholder="请输入收费类型"
                     autocomplete="off"></el-input>
                     autocomplete="off"></el-input>
         </el-form-item>
         </el-form-item>
-        <el-form-item label="声部选择"
-                      v-if="form.classGroupType != 'MIX'"
-                      prop="subjectIds"
-                      :label-width="formLabelWidth">
-          <el-select v-model.trim="form.subjectIds"
-                     filterable
-                     clearable
-                     multiple>
-            <el-option-group v-for="group in subjectList"
-                             :key="group.label"
-                             :label="group.label">
-              <el-option v-for="item in group.options"
-                         :key="item.value"
-                         :label="item.label"
-                         :value="item.value">
-              </el-option>
-            </el-option-group>
-          </el-select>
-        </el-form-item>
       </el-form>
       </el-form>
       <span slot="footer"
       <span slot="footer"
             class="dialog-footer">
             class="dialog-footer">
@@ -92,15 +69,13 @@ export default {
         create: '添加收费类型',
         create: '添加收费类型',
         update: '修改收费类型'
         update: '修改收费类型'
       },
       },
-      typeStatus: false, // 添加教学点 
+      typeStatus: false, // 添加教学点
       formLabelWidth: '100px',
       formLabelWidth: '100px',
       form: {
       form: {
-        name: null, // 
-        subjectIds: []
+        name: null, //
       },
       },
       rules: {
       rules: {
         name: [{ required: true, message: '请输入类型名称', trigger: 'blur' }],
         name: [{ required: true, message: '请输入类型名称', trigger: 'blur' }],
-        subjectIds: [{ required: true, message: '请选择声部组合', trigger: 'change' }]
       },
       },
       pageInfo: {
       pageInfo: {
         // 分页规则
         // 分页规则
@@ -113,7 +88,6 @@ export default {
   },
   },
   mounted () {
   mounted () {
     this.getList()
     this.getList()
-    this.getSubjectTree()
   },
   },
   methods: {
   methods: {
     onTypesSubmit (formName) { // 添加数据
     onTypesSubmit (formName) { // 添加数据
@@ -145,10 +119,17 @@ export default {
         this.$message.error(res.msg)
         this.$message.error(res.msg)
       }
       }
     },
     },
-    onTypesDel (row) {
-      chargeTypeDel(row.id).then(res => {
-        this.messageTips('删除', res)
-      })
+    async onTypesDel (row) {
+      try {
+        await this.$confirm('是否确认删除此条数据?', '提示', {
+          confirmButtonText: '确定',
+          cancelButtonText: '取消',
+          type: 'warning'
+        })
+        chargeTypeDel(row.id).then(res => {
+          this.messageTips('删除', res)
+        })
+      } catch (error) {}
     },
     },
     getList () {
     getList () {
       chargeTypeList({
       chargeTypeList({
@@ -157,16 +138,6 @@ export default {
       }).then(res => {
       }).then(res => {
         let result = res.data
         let result = res.data
         if (res.code == 200) {
         if (res.code == 200) {
-          result.rows.forEach(row => {
-            let subjectname = [],
-              subjectIds = []
-            row.subjects.forEach(item => {
-              subjectname.push(item.name)
-              subjectIds.push(item.id)
-            })
-            row.subjectName = subjectname
-            row.subjectIds = subjectIds
-          })
           this.tableList = result.rows
           this.tableList = result.rows
           this.pageInfo.total = result.total
           this.pageInfo.total = result.total
         }
         }
@@ -180,45 +151,15 @@ export default {
         this.form = {
         this.form = {
           id: row.id,
           id: row.id,
           name: row.name,
           name: row.name,
-          subjectIds: row.subjectIds
         }
         }
       }
       }
     },
     },
     onFormClose (formName) { // 关闭弹窗重置验证
     onFormClose (formName) { // 关闭弹窗重置验证
       this.form = {
       this.form = {
         name: null, // 作业模块名称
         name: null, // 作业模块名称
-        subjectIds: []
       }
       }
       this.$refs[formName].resetFields()
       this.$refs[formName].resetFields()
     },
     },
-    getSubjectTree () { // 获取声部列表
-      subjectListTree({
-        delFlag: 0,
-        rows: 9999
-      }).then(res => {
-        let result = res.data
-        if (res.code == 200) {
-          let tempArray = []
-          result.rows.forEach((item, index) => {
-            let subject = []
-            if (item.subjects) {
-              item.subjects.forEach(s => {
-                subject.push({
-                  value: s.id,
-                  label: s.name
-                })
-              })
-            }
-
-            tempArray[index] = {
-              label: item.name,
-              options: subject
-            }
-          })
-          this.subjectList = tempArray
-        }
-      })
-    }
   }
   }
 }
 }
 </script>
 </script>
@@ -241,4 +182,4 @@ export default {
 .el-select {
 .el-select {
   width: 100% !important;
   width: 100% !important;
 }
 }
-</style>
+</style>

+ 14 - 0
src/views/resetTeaming/api.js

@@ -0,0 +1,14 @@
+import request2 from '@/utils/request2'
+
+export const musicGroupPaymentCalenderQueryPage = data => request2({
+  url: '/api-web/musicGroupPaymentCalender/queryPage',
+  data: {},
+  params: data,
+  requestType: 'form'
+})
+
+export const musicGroupPaymentCalenderAdd = data => request2({
+  url: '/api-web/musicGroupPaymentCalender/add',
+  data,
+  method: 'post',
+})

+ 49 - 4
src/views/resetTeaming/components/resetPayList.vue

@@ -2,9 +2,15 @@
 <template>
 <template>
   <div class="m-core">
   <div class="m-core">
     <div class="topWrap">
     <div class="topWrap">
-      <div class="newBand"
+      <!-- <div class="newBand"
            @click="newPay"
            @click="newPay"
-           v-permission="'musicGroupPaymentCalender/add'">新建缴费</div>
+           v-permission="'musicGroupPaymentCalender/add'">新建缴费</div> -->
+      <div class="newBand"
+           @click="newUserPay"
+           v-permission="'musicGroupPaymentCalender/add'">新建学员缴费</div>
+      <div class="newBand"
+           @click="newSchoolPay"
+           v-permission="'musicGroupPaymentCalender/add'">新建学校缴费</div>
       <div class="newBand"
       <div class="newBand"
            v-permission="'/studentPayBase'"
            v-permission="'/studentPayBase'"
            @click="setStudentPay">学员缴费设置</div>
            @click="setStudentPay">学员缴费设置</div>
@@ -213,6 +219,20 @@
                    @click="resetPayDate">确 定</el-button>
                    @click="resetPayDate">确 定</el-button>
       </div>
       </div>
     </el-dialog>
     </el-dialog>
+    <el-dialog
+      :title="payFormTitle"
+      :visible.sync="userVisible"
+      width="800px"
+      destroy-on-close
+    >
+      <userPayForm
+        @close="userVisible = false"
+        @submited="getList"
+        :type="payFormType"
+        :baseInfo="baseInfo"
+        :musicGroupId="$route.query.id"
+      />
+    </el-dialog>
 
 
     <el-dialog title="续费二维码"
     <el-dialog title="续费二维码"
                :visible.sync="qrcodeStatus"
                :visible.sync="qrcodeStatus"
@@ -251,11 +271,23 @@ import dayjs from 'dayjs'
 import QRCode from 'qrcodejs2'
 import QRCode from 'qrcodejs2'
 import { vaildStudentUrl } from '@/utils/validate'
 import { vaildStudentUrl } from '@/utils/validate'
 import { addMusicGroupPaymentCalender, getMusicGroupPaymentCalender, resetMusicGroupPaymentCalender, delMusicGroupPaymentCalender } from "@/api/buildTeam";
 import { addMusicGroupPaymentCalender, getMusicGroupPaymentCalender, resetMusicGroupPaymentCalender, delMusicGroupPaymentCalender } from "@/api/buildTeam";
+import { musicGroupPaymentCalenderQueryPage } from '../api'
 import setStudentFee from './studentPayBase'
 import setStudentFee from './studentPayBase'
+import userPayForm from '../modals/user-pay-form'
+import schoolPayForm from '../modals/school-pay-form'
 export default {
 export default {
-  components: { pagination, setStudentFee },
+  props: ['baseInfo'],
+  components: {
+    pagination,
+    setStudentFee,
+    userPayForm,
+    schoolPayForm
+  },
   data () {
   data () {
     return {
     return {
+      payFormType: 'user',
+      userVisible: false,
+      schoolVisible: false,
       searchForm: {
       searchForm: {
         search: null
         search: null
       },
       },
@@ -305,6 +337,11 @@ export default {
     this.init();
     this.init();
 
 
   },
   },
+  computed: {
+    payFormTitle() {
+      return this.payFormType === 'user' ? '新增学员缴费' : '新增学校缴费'
+    }
+  },
   activated () {
   activated () {
     this.init();
     this.init();
   },
   },
@@ -312,8 +349,16 @@ export default {
     init () {
     init () {
       this.getList()
       this.getList()
     },
     },
+    newUserPay() {
+      this.payFormType = 'user'
+      this.userVisible = true
+    },
+    newSchoolPay() {
+      this.payFormType = 'school'
+      this.userVisible = true
+    },
     getList () {
     getList () {
-      getMusicGroupPaymentCalender({ page: this.rules.page, rows: this.rules.limit, musicGroupId: this.$route.query.id }).then(res => {
+      musicGroupPaymentCalenderQueryPage({ page: this.rules.page, rows: this.rules.limit, musicGroupId: this.$route.query.id }).then(res => {
         if (res.code == 200) {
         if (res.code == 200) {
           this.rules.total = res.data.total
           this.rules.total = res.data.total
           this.tableList = res.data.rows;
           this.tableList = res.data.rows;

+ 8 - 2
src/views/resetTeaming/index.vue

@@ -14,6 +14,8 @@
                      v-if="permission('/resetTeaming/teamBaseInfo')"
                      v-if="permission('/resetTeaming/teamBaseInfo')"
                      name="1">
                      name="1">
           <teamBaseInfo v-if="activeIndex == 1"
           <teamBaseInfo v-if="activeIndex == 1"
+                        @getBaseInfo="getBaseInfo"
+                        :baseInfo="baseInfo"
                         @getName='getName' />
                         @getName='getName' />
         </el-tab-pane>
         </el-tab-pane>
         <el-tab-pane label="声部设置"
         <el-tab-pane label="声部设置"
@@ -29,7 +31,7 @@
         <el-tab-pane label="缴费设置"
         <el-tab-pane label="缴费设置"
                      v-if="permission('/resetTeaming/resetPayList')"
                      v-if="permission('/resetTeaming/resetPayList')"
                      name="3">
                      name="3">
-          <resetPayList v-if="activeIndex == 3" />
+          <resetPayList :baseInfo="baseInfo" v-if="activeIndex == 3" />
         </el-tab-pane>
         </el-tab-pane>
 
 
         <el-tab-pane label="班级调整"
         <el-tab-pane label="班级调整"
@@ -69,6 +71,7 @@ export default {
     return {
     return {
       activeIndex: '1',
       activeIndex: '1',
       teamid: '',
       teamid: '',
+      baseInfo: null,
       // permissionStatus: {
       // permissionStatus: {
       //   teamBaseInfo: true,
       //   teamBaseInfo: true,
       //   resetSound: true,
       //   resetSound: true,
@@ -114,6 +117,9 @@ export default {
     onCancel () {
     onCancel () {
       this.$router.push({ path: '/business/teamDetail', query: { search: this.Fsearch, rules: this.Frules } })
       this.$router.push({ path: '/business/teamDetail', query: { search: this.Fsearch, rules: this.Frules } })
     },
     },
+    getBaseInfo(baseInfo) {
+      this.baseInfo = baseInfo
+    },
     handleClick (val) {
     handleClick (val) {
       this.activeIndex = val.name
       this.activeIndex = val.name
     },
     },
@@ -127,4 +133,4 @@ export default {
 }
 }
 </script>
 </script>
 <style lang="scss" scoped>
 <style lang="scss" scoped>
-</style>
+</style>

+ 50 - 0
src/views/resetTeaming/modals/classrooms.vue

@@ -0,0 +1,50 @@
+<template>
+  <div>
+    <el-table
+      :data="list"
+      style="width: 100%">
+      <el-table-column
+        prop="date"
+        label="班级名称">
+      </el-table-column>
+      <el-table-column
+        prop="date"
+        label="班级类型"
+        width="180">
+      </el-table-column>
+      <el-table-column
+        prop="date"
+        label="班级人数"
+        width="180">
+      </el-table-column>
+    </el-table>
+    <div slot="footer" class="dialog-footer">
+      <el-button @click="$listeners.close">取 消</el-button>
+      <el-button
+        type="primary"
+        @click="submit"
+      >确 定</el-button>
+    </div>
+  </div>
+</template>
+<script>
+export default {
+  data() {
+    return {
+      list: []
+    }
+  },
+  methods: {
+    submit() {
+
+    }
+  },
+}
+</script>
+<style lang="less" scoped>
+  .dialog-footer{
+    margin-top: 20px;
+    display: block;
+    text-align: right;
+  }
+</style>

+ 141 - 0
src/views/resetTeaming/modals/extra-class.vue

@@ -0,0 +1,141 @@
+<template>
+  <el-form
+    ref="form"
+    :model="list"
+  >
+    <el-table
+      :data="form"
+      style="width: 100%;text-alogn: center;"
+    >
+      <el-table-column
+        label="课程类型"
+        width="150">
+        <template slot-scope="scope">
+          <el-form-item
+            :prop="'form.' + scope.$index + '.courseType'"
+            :rules="{ required: true, message: '请选择课程类型', trigger: 'change' }"
+          >
+            <el-select
+              style="width: 90%!important;"
+              size="small"
+              v-model="list.form[scope.$index].courseType"
+              placeholder="课程类型"
+              clearable
+            >
+              <el-option
+                v-for="(item, index) in courseTypeOptions"
+                :key="index"
+                :label="item.label"
+                :value="item.value"
+              ></el-option>
+            </el-select>
+          </el-form-item>
+        </template>
+      </el-table-column>
+      <el-table-column
+        label="是否可选"
+        width="150">
+        <template slot-scope="scope">
+          <el-form-item
+            :prop="'form.' + scope.$index + '.isStudentOptional'"
+            :rules="{ required: true, message: '请选择是否可选', trigger: 'change' }"
+          >
+            <el-select
+              style="width: 90%!important;"
+              size="small"
+              v-model="list.form[scope.$index].isStudentOptional"
+              placeholder="是否可选"
+              clearable
+            >
+              <el-option
+                v-for="(item, index) in boolOptionsOptions"
+                :key="index"
+                :label="item.label"
+                :value="item.value"
+              ></el-option>
+            </el-select>
+          </el-form-item>
+        </template>
+      </el-table-column>
+      <el-table-column
+        label="课程时长(分钟)"
+        width="150">
+        <template slot-scope="scope">
+          <el-form-item
+            :prop="'form.' + scope.$index + '.courseTotalMinuties'"
+            :rules="{ required: true, message: '请输入课程时长', trigger: 'blur' }"
+          >
+            <el-input-number
+              size="small"
+              style="width: 90%!important;"
+              class="number-input"
+              v-model="list.form[scope.$index].courseTotalMinuties"
+              :controls="false"
+              :precision="0"
+              :min="1"
+              placeholder="课程时长"
+            />
+          </el-form-item>
+        </template>
+      </el-table-column>
+      <el-table-column
+        label="现价(元)"
+        width="120">
+      </el-table-column>
+      <el-table-column
+        label="原价(元)"
+        width="100">
+        <template slot-scope="scope">
+          {{ getOldMoney(scope.$index) }}
+        </template>
+      </el-table-column>
+      <el-table-column
+        width="60">
+        <template slot-scope="scope">
+          <i v-if="form.length > 1" @click="$listeners.remove(scope.$index)" class="el-icon-circle-close"></i>
+        </template>
+      </el-table-column>
+    </el-table>
+    <el-button
+      icon="el-icon-circle-plus-outline"
+      plain
+      type="info"
+      size="small"
+      style="width: 100%;margin: 20px 0;"
+      @click="$listeners.create"
+    >新增课程类型</el-button>
+  </el-form>
+</template>
+<script>
+import { courseType, boolOptions } from '@/constant'
+import { objectToOptions } from '@/utils'
+import numeral from 'numeral'
+export default {
+  props: ['form'],
+  data() {
+    return {
+      courseTypeOptions: objectToOptions(courseType),
+      boolOptionsOptions: objectToOptions(boolOptions),
+    }
+  },
+  computed: {
+    list() {
+      return {
+        form: this.form
+      }
+    }
+  },
+  methods: {
+    getOldMoney(index) {
+      return numeral(this.list.form[index].courseTotalMinuties * this.list.form[index].unitPrice).format('0,0.00')
+    }
+  },
+}
+</script>
+<style lang="less" scoped>
+.number-input{
+  /deep/ .el-input__inner {
+    text-align: left;
+  }
+}
+</style>

+ 87 - 0
src/views/resetTeaming/modals/payment-cycle.vue

@@ -0,0 +1,87 @@
+<template>
+  <el-form
+    label-width="160px"
+    ref="form"
+    :class="className"
+    :model="form"
+    label-suffix=": "
+  >
+    <el-form-item
+      label="缴费金额(元)"
+      prop="money"
+      :rules="[{required: true, message: '请输入缴费金额', trigger: 'blur'}]"
+    >
+      <el-input-number
+        class="number-input"
+        v-model="form.money"
+        :controls="false"
+        :precision="2"
+        :min="1"
+        placeholder="请输入缴费金额"
+      />
+    </el-form-item>
+    <el-form-item
+      label="缴费方式"
+      prop="paymentPattern"
+      :rules="[{required: true, message: '请选择缴费方式', trigger: 'change'}]"
+    >
+      <el-select style="width: 100%!important;" v-model="form.paymentPattern" placeholder="请选择缴费方式">
+        <el-option
+          v-for="item in paymentPatternTypeOptions"
+          :key="item.value"
+          :label="item.label"
+          :value="item.value">
+        </el-option>
+      </el-select>
+    </el-form-item>
+    <el-form-item
+      label="缴费时间"
+      prop="paymentDate"
+      :rules="[{required: true, message: '请选择缴费时间', trigger: 'blur'}]"
+    >
+      <el-date-picker
+        v-model="form.paymentDate"
+        type="daterange"
+        style="width: 100%;"
+        range-separator="至"
+        start-placeholder="开始日期"
+        end-placeholder="结束日期">
+      </el-date-picker>
+    </el-form-item>
+    <el-form-item
+      label="缴费有效期"
+      prop="paymentValid"
+      :rules="[{required: true, message: '请选择缴费有效期', trigger: 'blur'}]"
+    >
+      <el-date-picker
+        v-model="form.paymentValid"
+        type="daterange"
+        style="width: 100%;"
+        range-separator="至"
+        start-placeholder="开始日期"
+        end-placeholder="结束日期">
+      </el-date-picker>
+    </el-form-item>
+  </el-form>
+</template>
+<script>
+import { paymentPatternType } from '@/constant'
+import { objectToOptions } from '@/utils'
+export default {
+  props: ['form', 'className'],
+  data() {
+    return {
+      paymentPatternTypeOptions: objectToOptions(paymentPatternType),
+    }
+  },
+}
+</script>
+<style lang="less" scoped>
+.number-input{
+  /deep/ .el-input__inner {
+    text-align: left;
+  }
+
+  width: 100%;
+}
+</style>

+ 11 - 0
src/views/resetTeaming/modals/school-pay-form.vue

@@ -0,0 +1,11 @@
+<template>
+  <div></div>
+</template>
+<script>
+export default {
+
+}
+</script>
+<style lang="less" scoped>
+
+</style>

+ 127 - 0
src/views/resetTeaming/modals/user-baseinfo.vue

@@ -0,0 +1,127 @@
+<template>
+  <el-form
+    label-width="160px"
+    :model="form"
+    ref="form"
+    label-suffix=": "
+  >
+    <el-form-item
+      label="缴费类型"
+      prop="leixing"
+      :rules="[{required: true, message: '请选择缴费类型', trigger: 'change'}]"
+    >
+      <el-radio-group style="width: 100%" v-model="form.leixing">
+        <el-radio label="1">乐团课程</el-radio>
+        <el-radio label="2">临时加课</el-radio>
+      </el-radio-group>
+    </el-form-item>
+    <el-form-item
+      label="乐团模式"
+      prop="moshi"
+      v-if="isCommon"
+      :rules="[{required: true, message: '请选择乐团模式', trigger: 'change'}]"
+    >
+      <el-select
+        style="width: 100%!important;"
+        v-model="form.moshi"
+        placeholder="请选择乐团模式"
+        @change="$listeners.getCharges"
+      >
+        <el-option
+          v-for="item in typeList"
+          :key="item.id"
+          :label="item.name"
+          :value="item.id">
+        </el-option>
+      </el-select>
+    </el-form-item>
+    <el-form-item
+      label="收费标准"
+      prop="musicGroupOrganizationCourseSettingId"
+      v-if="isCommon"
+      :rules="[{required: true, message: '请选择收费标准', trigger: 'change'}]"
+    >
+      <el-select style="width: 100%!important;" v-model="form.musicGroupOrganizationCourseSettingId" placeholder="请选择收费标准">
+        <el-option
+          v-for="item in charges"
+          :key="item.id"
+          :label="item.name"
+          :value="item.id">
+        </el-option>
+      </el-select>
+    </el-form-item>
+    <el-form-item
+      label="是否赠送乐团网管课"
+      prop="isGiveMusicNetwork"
+      :rules="[{required: true, message: '请选择是否赠送乐团网管课', trigger: 'change'}]"
+    >
+      <el-radio-group style="width: 100%" v-model="form.isGiveMusicNetwork">
+        <el-radio :label="true">是</el-radio>
+        <el-radio :label="false">否</el-radio>
+      </el-radio-group>
+    </el-form-item>
+    <el-form-item
+      label="备注"
+      prop="memo"
+      :rules="[{required: true, message: '请输入备注', trigger: 'blur'}]"
+    >
+      <el-input type="textarea" v-model="form.memo"></el-input>
+    </el-form-item>
+    <!-- <el-form-item
+      label="缴费金额(元)"
+      prop="money"
+      :rules="[{required: true, message: '请输入缴费金额', trigger: 'blur'}]"
+    >
+      <el-input-number
+        class="number-input"
+        v-model="form.money"
+        :controls="false"
+        :precision="2"
+        :min="1"
+        placeholder="请输入缴费金额"
+      />
+    </el-form-item> -->
+    <!-- <el-form-item
+      label="缴费有效期"
+      prop="value2"
+      v-if="!isUserType"
+      :rules="[{required: true, message: '请选择缴费有效期', trigger: 'blur'}]"
+    >
+      <el-date-picker
+        v-model="form.value2"
+        type="daterange"
+        style="width: 100%;"
+        range-separator="至"
+        start-placeholder="开始日期"
+        end-placeholder="结束日期">
+      </el-date-picker>
+    </el-form-item> -->
+  </el-form>
+</template>
+<script>
+export default {
+  props: ['form', 'isCommon', 'isUserType', 'typeList', 'charges'],
+  data() {
+    return {
+      options: [
+        {
+          value: 1,
+          label: 1
+        }
+      ],
+    }
+  },
+  mounted() {
+    console.log(this.form)
+  },
+}
+</script>
+<style lang="less" scoped>
+.number-input{
+  /deep/ .el-input__inner {
+    text-align: left;
+  }
+
+  width: 100%;
+}
+</style>

+ 244 - 0
src/views/resetTeaming/modals/user-pay-form.vue

@@ -0,0 +1,244 @@
+<template>
+  <div>
+    <el-alert
+      title="课程信息设置"
+      :closable="false"
+      class="alert"
+      type="info">
+    </el-alert>
+    <userBaseinfo
+      :form.sync="form"
+      :isCommon="isCommon"
+      :isUserType="isUserType"
+      @getCharges="getCharges"
+      :typeList="typeList"
+      :charges="charges"
+      ref="base"
+    />
+    <template v-if="!isCommon">
+      <el-alert
+        title="加课信息设置"
+        :closable="false"
+        class="alert"
+        type="info">
+      </el-alert>
+      <extraClass
+        :form="eclass"
+        ref="eclass"
+        @create="addExtraClass"
+        @remove="removeExtraClass"
+      />
+    </template>
+    <extraClass
+      v-else
+      :form="eclass"
+      ref="eclass"
+      @create="addExtraClass"
+      @remove="removeExtraClass"
+    />
+    <template v-if="isUserType">
+      <el-alert
+        title="缴费设置"
+        :closable="false"
+        class="alert"
+        type="info">
+      </el-alert>
+      <paymentCycle
+        ref="cycle"
+        :form.sync="cycle"
+      />
+    </template>
+    <el-alert
+      title="其它"
+      :closable="false"
+      class="alert"
+      type="info">
+    </el-alert>
+    <div slot="footer" class="dialog-footer">
+      <el-button @click="$listeners.close">取 消</el-button>
+      <el-button
+        type="primary"
+        @click="submit"
+        >下一步</el-button>
+    </div>
+    <el-dialog
+      :title="nextTitle"
+      :visible.sync="nextVisible"
+      width="600px"
+      append-to-body
+    >
+      <classrooms
+        @close="closeNext"
+      />
+    </el-dialog>
+  </div>
+</template>
+<script>
+import { chargeTypeList, musicGroupOrganizationCourseSettingsQueryPage } from '@/api/specialSetting'
+import { musicGroupPaymentCalenderAdd } from '../api'
+import { getTimes } from '@/utils'
+import userBaseinfo from './user-baseinfo'
+import paymentCycle from './payment-cycle'
+import extraClass from './extra-class'
+import classrooms from './classrooms'
+
+export default {
+  props: ['type', 'musicGroupId', 'baseInfo'],
+  components: {
+    userBaseinfo,
+    paymentCycle,
+    extraClass,
+    classrooms,
+  },
+  data() {
+    return {
+      options: [],
+      form: {
+        payUserType: this.type === 'user' ? 'STUDENT' : 'SCHOOL',
+        leixing: '0',
+      },
+      cycles: [{}],
+      cycle: {},
+      eclass: [{}],
+      collapse: [],
+      nextVisible: false,
+      typeList: [],
+      charges: [],
+    }
+  },
+  computed: {
+    isCommon() {
+      return this.form.leixing === '1'
+    },
+    isUserType() {
+      return this.type === 'user'
+    },
+    nextTitle() {
+      return this.isCommon ? '乐团课程-班级选择' : '临时加课-班级选择'
+    },
+    chargesById() {
+      const data = {}
+      for (const item of this.charges) {
+        data[item.id] = item
+      }
+      return data
+    },
+  },
+  watch: {
+    eclass() {
+      console.log([...this.eclass])
+    },
+    baseInfo() {
+      const chargeTypeId = this.baseInfo?.musicGroup?.chargeTypeId
+      this.getCharges(chargeTypeId)
+    },
+    'form.leixing'() {
+      this.cycles = [{}]
+      this.collapse = [0]
+      this.cycle = {}
+    },
+    'form.musicGroupOrganizationCourseSettingId'() {
+      this.eclass = this.chargesById[this.form.musicGroupOrganizationCourseSettingId]?.details || []
+    }
+  },
+  mounted() {
+    this.getChargeTypeList()
+  },
+  methods: {
+    async getChargeTypeList() {
+      try {
+        const res = await chargeTypeList({
+          row: 9999
+        })
+        this.typeList = res.data.rows
+      } catch (error) {}
+    },
+    async getCharges(chargeTypeId) {
+      try {
+        const res = await musicGroupOrganizationCourseSettingsQueryPage({
+          row: 9999,
+          chargeTypeId
+        })
+        this.charges = res.data.rows
+      } catch (error) {}
+    },
+    addExtraClass() {
+      this.eclass.push({})
+    },
+    removeExtraClass(index) {
+      this.eclass[index] = null
+      this.eclass = this.eclass.filter(item => !!item)
+    },
+    addCycle() {
+      this.cycles.push({})
+      this.collapse.push(this.collapse.length)
+    },
+    removeCycle(index) {
+      this.cycles[index] = null
+      this.cycles = this.cycles.filter(item => !!item)
+      this.collapse.pop()
+    },
+    collapseChange(val) {
+      this.collapse = val
+    },
+    closeNext() {
+      this.nextVisible = false
+    },
+    getForms() {
+      const { $refs: refs } = this
+      return [refs.base, refs.eclass, refs.cycle]
+        .filter(item => !!item)
+        .map(item => item.$refs.form)
+    },
+    async submit() {
+      const forms = this.getForms()
+      console.log(forms)
+      const valided = []
+      for (const form of forms) {
+        form.validate(valid => {
+          if (valid) {
+            valided.push(form)
+          }
+        })
+      }
+      if (valided.length === forms.length) {
+        const { paymentDate, paymentValid, leixing, ...rest } = {...this.form, ...this.cycle, musicGroupPaymentCalenderCourseSettingsList: this.eclass}
+        const data = {
+          ...rest,
+          paymentType: leixing,
+          musicGroupId: this.musicGroupId,
+          ...getTimes(paymentDate, ['startPaymentDate', 'deadlinePaymentDate']),
+          ...getTimes(paymentValid, ['paymentValidStartDate', 'paymentValidEndDate']),
+        }
+        try {
+          await musicGroupPaymentCalenderAdd(data)
+        } catch (error) {}
+        // this.nextVisible = true
+      }
+    }
+  },
+};
+</script>
+<style lang="less" scoped>
+  .dialog-footer{
+    margin-top: 20px;
+    display: block;
+    text-align: right;
+  }
+  .alert{
+    margin-bottom: 10px;
+  }
+  .collapse-title{
+    display: flex;
+    justify-content: space-between;
+    align-items: center;
+    width: 100%;
+    .el-icon-circle-close{
+      font-size: 16px;
+      margin-right: 10px;
+    }
+  }
+  /deep/ .el-collapse-item__wrap{
+    padding-top: 20px;
+  }
+</style>

+ 2 - 1
src/views/teamBuild/components/teamBaseInfo.vue

@@ -648,7 +648,7 @@ export default {
   },
   },
   beforeDestroy () { },
   beforeDestroy () { },
   methods: {
   methods: {
-    //|| this.teamStatus === 'teamAudit' 
+    //|| this.teamStatus === 'teamAudit'
     isNotEditing: function () {
     isNotEditing: function () {
       return !(this.teamStatus === 'teamDraft' || this.teamStatus === 'newTeam' || this.teamStatus === 'teamList')
       return !(this.teamStatus === 'teamDraft' || this.teamStatus === 'newTeam' || this.teamStatus === 'teamList')
     },
     },
@@ -761,6 +761,7 @@ export default {
         this.teamid = this.$route.query.id;
         this.teamid = this.$route.query.id;
         getTeamBaseInfo({ musicGroupId: this.teamid }).then((res) => {
         getTeamBaseInfo({ musicGroupId: this.teamid }).then((res) => {
           if (res.code == 200) {
           if (res.code == 200) {
+            this.$listeners.getBaseInfo(res.data)
             // 头部
             // 头部
             this.topFrom.name = res.data.musicGroup.name;
             this.topFrom.name = res.data.musicGroup.name;
             this.$emit("getName", this.topFrom.name);
             this.$emit("getName", this.topFrom.name);

+ 110 - 0
src/views/teamDetail/components/modals/classroom-setting-item.vue

@@ -0,0 +1,110 @@
+<template>
+  <div>
+    <el-form-item
+      label="排课次数"
+    >
+      <el-input placeholder="请输入排课次数"/>
+    </el-form-item>
+    <el-form-item
+      label="排课起始时间"
+    >
+      <el-input placeholder="请输入排课起始时间"/>
+    </el-form-item>
+    <el-form-item
+      label="跳过节假日"
+    >
+      <el-radio-group>
+        <el-radio :label="3">是</el-radio>
+        <el-radio :label="6">否</el-radio>
+      </el-radio-group>
+    </el-form-item>
+    <el-table
+      :data="form.cycle"
+    >
+      <el-table-column
+        prop="date"
+        label="循环周期"
+        width="180">
+        <template>
+          <el-form-item inline-message>
+            <el-input placeholder="请输入循环周期"/>
+          </el-form-item>
+        </template>
+      </el-table-column>
+      <el-table-column
+        prop="date"
+        label="课程时长(分)"
+        width="180">
+        <template>
+          <el-form-item inline-message>
+            <el-input placeholder="请输入课程时长"/>
+          </el-form-item>
+        </template>
+      </el-table-column>
+      <el-table-column
+        prop="date"
+        label="开始时间"
+        width="180">
+        <template>
+          <el-form-item inline-message>
+            <el-input placeholder="请输入课程时长"/>
+          </el-form-item>
+        </template>
+      </el-table-column>
+      <el-table-column
+        prop="date"
+        label="结束时间"
+        width="180">
+        <template>
+          <el-form-item inline-message>
+            <el-input  placeholder="请输入课程时长"/>
+          </el-form-item>
+        </template>
+      </el-table-column>
+      <el-table-column
+        prop="date"
+        label=""
+        width="180">
+        <template slot-scope="scope">
+          <i @click="remove(scope.$index)" v-if="form.cycle.length > 1" class="close-icon el-icon-circle-close"></i>
+        </template>
+      </el-table-column>
+    </el-table>
+    <el-button
+      icon="el-icon-circle-plus-outline"
+      type="info"
+      size="small"
+      plain
+      @click="create"
+      style="margin-top: 10px;width: 100%;"
+    >添加循环</el-button>
+  </div>
+</template>
+<script>
+export default {
+  props: ['form'],
+  created() {
+    if (!this.form) {
+      this.form = {
+        cycle: [{}]
+      }
+    }
+  },
+  methods: {
+    create() {
+      this.form.cycle.push({})
+    },
+    remove(index) {
+      const list = [...this.form.cycle]
+      list[index] = null
+      this.form.cycle = list.map(item => !!item)
+    }
+  },
+}
+</script>
+<style lang="less" scoped>
+  /deep/ .close-icon{
+    cursor: pointer;
+    font-size: 16px;
+  }
+</style>

+ 92 - 0
src/views/teamDetail/components/modals/classroom-setting.vue

@@ -0,0 +1,92 @@
+<template>
+  <div>
+    <el-form
+      :model="form"
+      inline
+      label-suffix=": "
+      label-width="100px"
+    >
+      <el-form-item label="主教老师">
+        <el-select
+          v-model.trim="form.coreTeacher"
+          placeholder="请选择主教老师"
+          clearable
+          filterable
+        >
+          <el-option
+            v-for="(item, index) in teacherList"
+            :key="index"
+            :label="item.realName"
+            :value="item.id"
+          ></el-option>
+        </el-select>
+      </el-form-item>
+      <el-form-item
+        label="助教老师"
+        prop="assistant"
+      >
+        <el-select
+          v-model.trim="form.assistant"
+          placeholder="请选择助教老师"
+          filterable
+          clearable
+          multiple
+        >
+          <el-option
+            v-for="(item, index) in cooperationList"
+            :key="index"
+            :label="item.realName"
+            :value="item.id"
+          ></el-option>
+        </el-select>
+      </el-form-item>
+      <el-collapse v-model="collapses" @change="collapseChange">
+        <el-collapse-item
+          v-for="(item, index) in courseTypeList"
+          :title="item.label"
+          :name="index"
+          :key="index"
+        >
+          <courseItem
+            :key="index"
+            :form="form.classs[item.value]"
+          />
+        </el-collapse-item>
+      </el-collapse>
+    </el-form>
+    <div slot="footer" class="dialog-footer">
+      <el-button @click="$listeners.close">取 消</el-button>
+      <el-button type="primary" @click="submit">确 定</el-button>
+    </div>
+  </div>
+</template>
+<script>
+import courseItem from "./classroom-setting-item";
+export default {
+  props: ["teacherList", "activeType", "courseTypeList", 'cooperationList'],
+  components: {
+    courseItem,
+  },
+  data() {
+    return {
+      form: {
+        coreTeacher: "",
+        assistant: '',
+        classs: {}
+      },
+      collapses: [0],
+    };
+  },
+  mounted() {
+    console.log(this.courseTypeList);
+  },
+  methods: {
+    submit() {
+
+    },
+    collapseChange(val) {
+      this.collapses = val
+    }
+  },
+};
+</script>

+ 161 - 0
src/views/teamDetail/components/modals/select-student.vue

@@ -0,0 +1,161 @@
+<template>
+  <div>
+    <el-form :model="form" ref="form" label-suffix=": " inline>
+      <el-row>
+        <el-col :span="10">
+          <el-form-item
+            label="班级名称"
+            prop="name"
+            :rules="[
+              { required: true, message: '请输入班级名称', trigger: 'blur' },
+            ]"
+          >
+            <el-input
+              v-model="form.name"
+              style="width: 100%"
+              placeholder="请输入班级名称"
+            />
+          </el-form-item>
+        </el-col>
+        <el-col :span="10" :offset="4">
+          <el-form-item label="声部">
+            <el-select
+              v-model="sound"
+              style="width: 100%"
+              clearable
+              filterable
+              placeholder="请选择声部"
+            >
+              <el-option
+                v-for="(item, index) in soundList"
+                :key="index"
+                :label="item.name"
+                :value="item.id"
+              ></el-option>
+            </el-select>
+          </el-form-item>
+        </el-col>
+      </el-row>
+      <el-transfer
+        filterable
+        :titles="['所有学员', '已选学员']"
+        filter-placeholder="请输入学生姓名"
+        :filter-method="filterStudent"
+        v-model="seleched"
+        :render-content="renderFunc"
+        :data="data"
+      >
+        <template #left-footer>
+          <div class="footer line">
+            <span>姓名</span>
+            <span>性别</span>
+            <span>专业</span>
+          </div>
+        </template>
+        <template #right-footer>
+          <div class="footer line">
+            <span>姓名</span>
+            <span>性别</span>
+            <span>专业</span>
+          </div>
+        </template>
+      </el-transfer>
+    </el-form>
+    <div slot="footer" class="dialog-footer">
+      <el-button @click="$listeners.close">取 消</el-button>
+      <el-button type="primary" @click="submit">确 定</el-button>
+    </div>
+  </div>
+</template>
+<script>
+import { genderType } from "@/constant";
+export default {
+  props: ["studentList", "soundList", "activeType"],
+  computed: {
+    data() {
+      return this.studentList.map((item) => ({
+        value: item.id,
+        key: item.id,
+        name: item.name,
+        subjectName: item.subjectName,
+        gender: genderType[item.gender],
+      }));
+    },
+  },
+  data() {
+    return {
+      sound: [],
+      form: {
+        name: '',
+      },
+      seleched: [],
+    };
+  },
+  methods: {
+    filterStudent(query, item) {
+      return (
+        item.name.indexOf(query) > -1 ||
+        item.subjectName.indexOf(query) > -1 ||
+        item.gender.indexOf(query) > -1
+      );
+    },
+    renderFunc(h, option) {
+      return (
+        <div class="line">
+          <span>{option.name}</span>
+          <span>{option.gender}</span>
+          <span>{option.subjectName}</span>
+        </div>
+      );
+    },
+    submit() {
+      if (this.activeType == 'HIGH_ONLINE' && (this.seleched.length < 3 || this.seleched.length > 5)) {
+        return this.$message.error('线上技能班必须为3-5人')
+      }
+      if (this.seleched.length < 1) {
+        return this.$message.error('请至少选择一名学生')
+      }
+      this.$refs.form.validate(valid => {
+        if (valid) {
+          this.$listeners.close()
+        }
+      })
+    }
+  },
+};
+</script>
+<style lang="less" scoped>
+/deep/ .el-transfer {
+  display: flex;
+  align-items: center;
+  .el-transfer__buttons {
+    display: flex;
+    width: 110px;
+    flex-direction: column;
+    > button {
+      &:last-child {
+        margin-left: 0;
+      }
+    }
+  }
+  .el-transfer-panel {
+    width: 300px;
+  }
+}
+.footer {
+  margin-left: 35px;
+  margin-right: auto;
+  height: 40px;
+  line-height: 40px;
+}
+/deep/ .line {
+  width: 220px;
+  display: flex;
+  justify-content: space-around;
+}
+/deep/ .dialog-footer{
+  margin-top: 20px;
+  display: block;
+  text-align: right;
+}
+</style>

+ 49 - 0
src/views/teamDetail/components/modals/view-student-list.vue

@@ -0,0 +1,49 @@
+<template>
+  <div>
+    <el-table
+      :data="list"
+      style
+      :header-cell-style="{ background: '#EDEEF0', color: '#444' }"
+      tooltip-effect="dark"
+    >
+      <el-table-column
+        prop="name"
+        align="center"
+        width="120"
+        label="学员编号"
+      ></el-table-column>
+      <el-table-column
+        prop="name"
+        align="center"
+        width="120"
+        label="学员姓名"
+      ></el-table-column>
+      <el-table-column
+        prop="name"
+        align="center"
+        width="120"
+        label="性别"
+      ></el-table-column>
+      <el-table-column
+        prop="name"
+        align="center"
+        width="120"
+        label="联系电话"
+      ></el-table-column>
+      <el-table-column
+        prop="name"
+        align="center"
+        width="120"
+        label="专业"
+      ></el-table-column>
+    </el-table>
+    <div slot="footer" class="dialog-footer">
+      <el-button type="primary" @click="$listeners.close">确 定</el-button>
+    </div>
+  </div>
+</template>
+<script>
+export default {
+  props: ['list'],
+};
+</script>

+ 108 - 39
src/views/teamDetail/components/resetClass.vue

@@ -91,14 +91,14 @@
             <template slot-scope="scope">
             <template slot-scope="scope">
               <div>
               <div>
                 <!-- v-if="scope.row.type !='MIX'" -->
                 <!-- v-if="scope.row.type !='MIX'" -->
-                <el-button type="text"
+                <!-- <el-button type="text"
                            @click="resetClass(scope.row)"
                            @click="resetClass(scope.row)"
-                           v-if="scope.row.type != 'MUSIC_NETWORK'">学员调整</el-button>
+                           v-if="scope.row.type != 'MUSIC_NETWORK'">学员调整</el-button> -->
                 <el-button type="text"
                 <el-button type="text"
                            @click="classAdjustment(scope.row)">班级调整</el-button>
                            @click="classAdjustment(scope.row)">班级调整</el-button>
                 <!--<el-button type="text"
                 <!--<el-button type="text"
                 @click="recourse(scope.row)">重新排课</el-button>-->
                 @click="recourse(scope.row)">重新排课</el-button>-->
-                <el-popover placement="top"
+                <!-- <el-popover placement="top"
                             width="160"
                             width="160"
                             :ref="`popover-${scope.$index}`">
                             :ref="`popover-${scope.$index}`">
                   <p>确定删除?</p>
                   <p>确定删除?</p>
@@ -109,14 +109,14 @@
                     <el-button type="primary"
                     <el-button type="primary"
                                size="mini"
                                size="mini"
                                @click="removeClass(scope)">确定</el-button>
                                @click="removeClass(scope)">确定</el-button>
-                  </div>
+                  </div> -->
                   <!-- v-if="scope.row.type !='MIX'" -->
                   <!-- v-if="scope.row.type !='MIX'" -->
-                  <el-button type="text"
+                  <!-- <el-button type="text"
                              v-if="scope.row.type != 'MUSIC_NETWORK'"
                              v-if="scope.row.type != 'MUSIC_NETWORK'"
                              slot="reference">删除班级</el-button>
                              slot="reference">删除班级</el-button>
-                </el-popover>
+                </el-popover> -->
 
 
-                <el-popover placement="top"
+                <!-- <el-popover placement="top"
                             width="160"
                             width="160"
                             :ref="scope.$index">
                             :ref="scope.$index">
                   <p>是否清空课表?</p>
                   <p>是否清空课表?</p>
@@ -127,11 +127,11 @@
                     <el-button type="primary"
                     <el-button type="primary"
                                size="mini"
                                size="mini"
                                @click="clearCourse(scope)">确定</el-button>
                                @click="clearCourse(scope)">确定</el-button>
-                  </div>
+                  </div> -->
                   <!-- v-if="scope.row.type !='MIX'" -->
                   <!-- v-if="scope.row.type !='MIX'" -->
-                  <el-button type="text"
+                  <!-- <el-button type="text"
                              slot="reference">清空课表</el-button>
                              slot="reference">清空课表</el-button>
-                </el-popover>
+                </el-popover> -->
               </div>
               </div>
             </template>
             </template>
           </el-table-column>
           </el-table-column>
@@ -151,7 +151,19 @@
       </div>
       </div>
     </div>
     </div>
     <!-- 学员选择 -->
     <!-- 学员选择 -->
-    <el-dialog title="学员选择"
+    <el-dialog
+      title="学员选择"
+      width="750px"
+      :visible.sync="studentVisible"
+    >
+      <selectStudent
+        :studentList="studentList"
+        :soundList="soundList"
+        :activeType="activeType"
+        @close="studentVisible = false"
+      />
+    </el-dialog>
+    <!-- <el-dialog title="学员选择"
                width="700px"
                width="700px"
                :visible.sync="studentVisible"
                :visible.sync="studentVisible"
                :modal-append-to-body="false">
                :modal-append-to-body="false">
@@ -190,10 +202,10 @@
             </div>
             </div>
           </div>
           </div>
         </div>
         </div>
-        <div class="right">
+        <div class="right"> -->
           <!--  multiple
           <!--  multiple
           collapse-tags v-if="isSearch"  -->
           collapse-tags v-if="isSearch"  -->
-          <el-select v-model.trim="activeChioseSound"
+          <!-- <el-select v-model.trim="activeChioseSound"
                      style="width:180px"
                      style="width:180px"
                      @change="searchStudent"
                      @change="searchStudent"
                      clearable
                      clearable
@@ -203,14 +215,14 @@
                        :key="index"
                        :key="index"
                        :label="item.name"
                        :label="item.name"
                        :value="item.id"></el-option>
                        :value="item.id"></el-option>
-          </el-select>
+          </el-select> -->
           <!-- <el-button v-if="isSearch"
           <!-- <el-button v-if="isSearch"
                      type="danger"
                      type="danger"
                      style="margin-left:20px;"
                      style="margin-left:20px;"
           @click="searchStudent">搜索</el-button>-->
           @click="searchStudent">搜索</el-button>-->
 
 
           <!--   列表开始  -->
           <!--   列表开始  -->
-          <div class="tableList">
+          <!-- <div class="tableList">
             <el-table tooltip-effect="dark"
             <el-table tooltip-effect="dark"
                       v-if="!isNewClass"
                       v-if="!isNewClass"
                       style="width: 100%; margin-top:10px;"
                       style="width: 100%; margin-top:10px;"
@@ -236,9 +248,9 @@
                                width="100"
                                width="100"
                                align="center"
                                align="center"
                                label="学员声部"></el-table-column>
                                label="学员声部"></el-table-column>
-            </el-table>
+            </el-table> -->
             <!-- 临时调整table -->
             <!-- 临时调整table -->
-            <el-table tooltip-effect="dark"
+            <!-- <el-table tooltip-effect="dark"
                       v-if="isNewClass"
                       v-if="isNewClass"
                       style="width: 100%; margin-top:10px;"
                       style="width: 100%; margin-top:10px;"
                       :data="studentList"
                       :data="studentList"
@@ -269,29 +281,56 @@
       </div>
       </div>
       <div slot="footer"
       <div slot="footer"
            class="dialog-footer">
            class="dialog-footer">
-        <el-button @click="studentVisible = false">取 消</el-button>
+        <el-button @click="studentVisible = false">取 消</el-button> -->
         <!-- 班级学员修改 -->
         <!-- 班级学员修改 -->
-        <el-button type="primary"
+        <!-- <el-button type="primary"
                    v-if="!isNewClass"
                    v-if="!isNewClass"
-                   @click="addSomeStudent">确 定</el-button>
+                   @click="addSomeStudent">确 定</el-button> -->
         <!-- 临时调整或者新建班级 -->
         <!-- 临时调整或者新建班级 -->
-        <el-button type="primary"
+        <!-- <el-button type="primary"
                    v-if="isNewClass"
                    v-if="isNewClass"
                    @click="setInfoMsg">确 定</el-button>
                    @click="setInfoMsg">确 定</el-button>
       </div>
       </div>
-    </el-dialog>
+    </el-dialog> -->
     <!-- 老师以及课程设置 -->
     <!-- 老师以及课程设置 -->
-    <el-dialog title="班级设置"
+    <el-dialog
+      title="班级设置"
+      width="950px"
+      :visible.sync="infoVisible"
+      :modal-append-to-body="false"
+    >
+      <classroomSetting
+        :teacherList="teacherList"
+        :activeType="activeType"
+        :courseTypeList="courseTypeList"
+        :cooperationList="cooperationList"
+        @close="infoVisible = false"
+      />
+    </el-dialog>
+    <!-- <el-dialog title="班级设置"
                width="780px"
                width="780px"
                :visible.sync="infoVisible"
                :visible.sync="infoVisible"
                :modal-append-to-body="false">
                :modal-append-to-body="false">
+      <el-alert
+        type="warning"
+        style="margin-bottom: 20px;"
+        :closable="false">
+        <template #title>
+          <div class="alert-content">
+            <span>
+              该班级剩余可排课时长:<strong>1000分钟</strong>
+            </span>
+            <strong>学员列表&gt;&gt;</strong>
+          </div>
+        </template>
+      </el-alert>
       <el-form :inline="true"
       <el-form :inline="true"
                :model="teacherForm"
                :model="teacherForm"
                ref="teacherForm"
                ref="teacherForm"
                :rules="teacherRules"
                :rules="teacherRules"
                label-position="right"
                label-position="right"
-               label-width="100px;">
-        <el-form-item label="调整方式"
+               label-width="100px;"> -->
+        <!-- <el-form-item label="调整方式"
                       v-if="!isNewClass"
                       v-if="!isNewClass"
                       prop="isAdd">
                       prop="isAdd">
           <el-radio v-model.trim="teacherForm.isAdd"
           <el-radio v-model.trim="teacherForm.isAdd"
@@ -299,7 +338,7 @@
           <el-radio v-model.trim="teacherForm.isAdd"
           <el-radio v-model.trim="teacherForm.isAdd"
                     label="renew">重新排课</el-radio>
                     label="renew">重新排课</el-radio>
           <el-radio v-model.trim="teacherForm.isAdd"
           <el-radio v-model.trim="teacherForm.isAdd"
-                    label="onlyUpdateTeacher">修改老师
+                    label="onlyUpdateTeacher">修改老师 -->
             <!-- <el-tooltip placement="top"
             <!-- <el-tooltip placement="top"
                         popper-class="mTooltip">
                         popper-class="mTooltip">
               <div slot="content">
               <div slot="content">
@@ -308,12 +347,12 @@
               <i class="el-icon-question micon el-tooltip"
               <i class="el-icon-question micon el-tooltip"
                  style="font-size: 18px; color: #F56C6C"></i>
                  style="font-size: 18px; color: #F56C6C"></i>
             </el-tooltip> -->
             </el-tooltip> -->
-          </el-radio>
+          <!-- </el-radio>
 
 
-        </el-form-item>
+        </el-form-item> -->
 
 
-        <br />
-        <el-form-item label="主教老师"
+        <!-- <br /> -->
+        <!-- <el-form-item label="主教老师"
                       prop="coreTeacher">
                       prop="coreTeacher">
           <el-select v-model.trim="teacherForm.coreTeacher"
           <el-select v-model.trim="teacherForm.coreTeacher"
                      placeholder="请选择主教老师"
                      placeholder="请选择主教老师"
@@ -355,9 +394,9 @@
                        :value="item.value"
                        :value="item.value"
                        :label="item.label"></el-option>
                        :label="item.label"></el-option>
           </el-select>
           </el-select>
-        </el-form-item>
+        </el-form-item> -->
         <!--  v-if="!isNewClass" -->
         <!--  v-if="!isNewClass" -->
-        <el-form-item label="声部"
+        <!-- <el-form-item label="声部"
                       v-if="activeType=='HIGH_ONLINE'&&isNewClass"
                       v-if="activeType=='HIGH_ONLINE'&&isNewClass"
                       prop="sound">
                       prop="sound">
           <el-select v-model.trim="teacherForm.sound"
           <el-select v-model.trim="teacherForm.sound"
@@ -461,21 +500,21 @@
         </div>
         </div>
       </div>
       </div>
       <div slot="footer"
       <div slot="footer"
-           class="dialog-footer">
+           class="dialog-footer"> -->
         <!-- 1为临时班级 -->
         <!-- 1为临时班级 -->
-        <el-button type="primary"
+        <!-- <el-button type="primary"
                    v-if="isTemporary&&isNewClass"
                    v-if="isTemporary&&isNewClass"
-                   @click="submitTemporary(1)">确 定</el-button>
+                   @click="submitTemporary(1)">确 定</el-button> -->
         <!-- 2为新增班级 -->
         <!-- 2为新增班级 -->
-        <el-button type="primary"
+        <!-- <el-button type="primary"
                    v-if="!isTemporary&&isNewClass"
                    v-if="!isTemporary&&isNewClass"
-                   @click="submitTemporary(2)">确 定</el-button>
+                   @click="submitTemporary(2)">确 定</el-button> -->
         <!-- 修改班级信息 -->
         <!-- 修改班级信息 -->
-        <el-button type="primary"
+        <!-- <el-button type="primary"
                    v-if="!isNewClass"
                    v-if="!isNewClass"
                    @click="submitTemporary(3)">确 定</el-button>
                    @click="submitTemporary(3)">确 定</el-button>
       </div>
       </div>
-    </el-dialog>
+    </el-dialog> -->
     <!-- 新增合奏班 -->
     <!-- 新增合奏班 -->
     <el-dialog title="新增合奏班"
     <el-dialog title="新增合奏班"
                width="700px"
                width="700px"
@@ -664,6 +703,15 @@
                    @click="newClassHight">确 定</el-button>
                    @click="newClassHight">确 定</el-button>
       </div>
       </div>
     </el-dialog>
     </el-dialog>
+    <el-dialog
+      title="学员列表"
+      :visible.sync="studentListModalVisible"
+    >
+      <viewStudentList
+        :list="studentListModal"
+        @close="studentListModalVisible = false"
+      />
+    </el-dialog>
   </div>
   </div>
 </template>
 </template>
 <script>
 <script>
@@ -699,9 +747,17 @@ import { diffTimerFormMinute, addTimerFormMinute } from '@/utils/date'
 import dayjs from 'dayjs'
 import dayjs from 'dayjs'
 import axios from "axios";
 import axios from "axios";
 import { classTimeList } from "@/utils/searchArray";
 import { classTimeList } from "@/utils/searchArray";
+import viewStudentList from './modals/view-student-list'
+import selectStudent from './modals/select-student'
+import classroomSetting from './modals/classroom-setting'
 import qs from "qs";
 import qs from "qs";
 export default {
 export default {
   name: "tresetClass",
   name: "tresetClass",
+  components: {
+    viewStudentList,
+    selectStudent,
+    classroomSetting
+  },
   data () {
   data () {
     return {
     return {
       pickerOptions: {
       pickerOptions: {
@@ -719,6 +775,8 @@ export default {
       tableList: [],
       tableList: [],
       maxClassList: [],
       maxClassList: [],
       activeSingleList: [],
       activeSingleList: [],
+      studentListModal: [],
+      studentListModalVisible: false,
       resetCourseVisible: false, // 重新排课弹窗
       resetCourseVisible: false, // 重新排课弹窗
       resetClassVisible: false, // 班级调整弹窗
       resetClassVisible: false, // 班级调整弹窗
       studentVisible: false,
       studentVisible: false,
@@ -1795,4 +1853,15 @@ export default {
     height: 40px !important;
     height: 40px !important;
   }
   }
 }
 }
+/deep/ .el-alert__content{
+  display: block;
+  width: 100%;
+}
+.alert-content{
+  display: flex;
+  justify-content: space-between;
+  >strong{
+    cursor: pointer;
+  }
+}
 </style>
 </style>

+ 89 - 17
src/views/teamDetail/components/studentList.vue

@@ -239,7 +239,7 @@
                   @pagination="getList" />
                   @pagination="getList" />
     </div>
     </div>
     <el-dialog title="新增学员"
     <el-dialog title="新增学员"
-               width="680px"
+               width="700px"
                class="studentInfo"
                class="studentInfo"
                :visible.sync="addStudentVisible">
                :visible.sync="addStudentVisible">
       <el-form :model="maskForm"
       <el-form :model="maskForm"
@@ -248,7 +248,12 @@
                ref="maskForm"
                ref="maskForm"
                :rules="maskRules"
                :rules="maskRules"
                :inline="true">
                :inline="true">
-        <el-divider>基本信息</el-divider>
+        <el-alert
+          title="基本信息"
+          :closable="false"
+          class="alert"
+          type="info">
+        </el-alert>
         <el-form-item label="联系电话"
         <el-form-item label="联系电话"
                       prop="phone"
                       prop="phone"
                       :rules="[{ required: true, message: '请输入手机号' }, { pattern: /^1[3456789]\d{9}$/, message: '请输入正确的手机号', trigger: 'blur' }]">
                       :rules="[{ required: true, message: '请输入手机号' }, { pattern: /^1[3456789]\d{9}$/, message: '请输入正确的手机号', trigger: 'blur' }]">
@@ -344,13 +349,6 @@
                             placeholder="选择日期"></el-date-picker>
                             placeholder="选择日期"></el-date-picker>
           </el-col>
           </el-col>
         </el-form-item>
         </el-form-item>
-        <el-form-item label="课程费用"
-                      prop="courseFee">
-          <el-input v-model.trim="maskForm.courseFee"
-                    type="number"
-                    @mousewheel.native.prevent
-                    placeholder="续费金额"></el-input>
-        </el-form-item>
         <br />
         <br />
         <el-form-item label="单技班">
         <el-form-item label="单技班">
           <el-select v-model.trim="maskForm.signClass"
           <el-select v-model.trim="maskForm.signClass"
@@ -416,7 +414,7 @@
           </el-select>
           </el-select>
         </el-form-item>-->
         </el-form-item>-->
 
 
-        <el-divider>首缴订单信息</el-divider>
+        <!-- <el-divider>首缴订单信息</el-divider>
         <el-form-item label="课程费用"
         <el-form-item label="课程费用"
                       prop="temporaryCourseFee">
                       prop="temporaryCourseFee">
           <el-input type="number"
           <el-input type="number"
@@ -488,7 +486,40 @@
                         placeholder="输入金额"></el-input>
                         placeholder="输入金额"></el-input>
             </el-form-item>
             </el-form-item>
           </el-col>
           </el-col>
-        </el-form-item>
+        </el-form-item> -->
+        <el-alert
+          title="缴费周期设置"
+          :closable="false"
+          class="alert"
+          type="info">
+        </el-alert>
+        <el-collapse :value="collapse" @change="collapseChange" >
+          <el-collapse-item
+            v-for="(item, index) in cycles"
+            :key="index"
+            :name="index"
+          >
+            <template slot="title">
+              <div class="collapse-title">
+                <span>缴费周期 {{index + 1}}</span>
+                <i v-if="cycles.length > 1" class="el-icon-circle-close" @click.stop="removeCycle(index)"></i>
+              </div>
+            </template>
+            <paymentCycle
+              ref="cycles"
+              className="cycleForm"
+              :form="item"
+            />
+          </el-collapse-item>
+        </el-collapse>
+        <el-button
+          icon="el-icon-circle-plus-outline"
+          plain
+          type="info"
+          size="small"
+          style="width: 100%;margin: 20px 0;"
+          @click="addCycle"
+        >新增缴费周期</el-button>
       </el-form>
       </el-form>
       <div slot="footer"
       <div slot="footer"
            class="dialog-footer">
            class="dialog-footer">
@@ -671,7 +702,7 @@
       </span>
       </span>
     </el-dialog>
     </el-dialog>
   </div>
   </div>
-</template> 
+</template>
 <script>
 <script>
 import {
 import {
   getTeamStudentList,
   getTeamStudentList,
@@ -700,6 +731,7 @@ import { getToken } from "@/utils/auth";
 import { permission } from "@/utils/directivePage";
 import { permission } from "@/utils/directivePage";
 import { addVisit } from "@/views/returnVisitManager/api.js"
 import { addVisit } from "@/views/returnVisitManager/api.js"
 import cleanDeep from 'clean-deep'
 import cleanDeep from 'clean-deep'
+import paymentCycle from '../../resetTeaming/modals/payment-cycle'
 export default {
 export default {
   name: "tstudentList",
   name: "tstudentList",
   data () {
   data () {
@@ -775,7 +807,7 @@ export default {
         muiscnetwork: "",
         muiscnetwork: "",
         startClass: "",
         startClass: "",
         id: "",
         id: "",
-        courseFee: null, // 声部费用
+        // courseFee: null, // 声部费用
         temporaryCourseFee: null, // 本次课程费用
         temporaryCourseFee: null, // 本次课程费用
         musicGoodsIdList: null, // 乐器商品编号
         musicGoodsIdList: null, // 乐器商品编号
         kitGroupPurchaseType: "GROUP", // 乐器购买方式
         kitGroupPurchaseType: "GROUP", // 乐器购买方式
@@ -808,7 +840,7 @@ export default {
         // price: [{ required: true, message: '请输入首缴金额' },],
         // price: [{ required: true, message: '请输入首缴金额' },],
         startClass: [{ required: true, message: "请选择年级" }],
         startClass: [{ required: true, message: "请选择年级" }],
         id: [{ required: true, message: "请输入证件号" }],
         id: [{ required: true, message: "请输入证件号" }],
-        courseFee: [{ required: true, message: "请输入声部费用" }],
+        // courseFee: [{ required: true, message: "请输入声部费用" }],
         temporaryCourseFee: [{ required: true, message: "请输课程费用" }],
         temporaryCourseFee: [{ required: true, message: "请输课程费用" }],
         musicGoodsIdList: [
         musicGoodsIdList: [
           { required: true, message: "请选择乐器", trigger: "change" }
           { required: true, message: "请选择乐器", trigger: "change" }
@@ -841,7 +873,8 @@ export default {
         feedback: '',
         feedback: '',
         studentName: ''
         studentName: ''
       },
       },
-
+      cycles: [{}],
+      collapse: [0],
       visitChiose,
       visitChiose,
       visitRules: {
       visitRules: {
         overview: [{ required: true, message: "请输入学生近况" }],
         overview: [{ required: true, message: "请输入学生近况" }],
@@ -854,7 +887,8 @@ export default {
     };
     };
   },
   },
   components: {
   components: {
-    pagination
+    pagination,
+    paymentCycle
   },
   },
   created () {
   created () {
     // 判断是否带缓存参数
     // 判断是否带缓存参数
@@ -1057,6 +1091,18 @@ export default {
         }
         }
       });
       });
     },
     },
+    addCycle() {
+      this.cycles.push({})
+      this.collapse.push(this.collapse.length)
+    },
+    removeCycle(index) {
+      this.cycles[index] = null
+      this.cycles = this.cycles.filter(item => !!item)
+      this.collapse.pop()
+    },
+    collapseChange(val) {
+      this.collapse = val
+    },
     gotoSignin () {
     gotoSignin () {
       this.$router.push({
       this.$router.push({
         path: "/business/studentSignin",
         path: "/business/studentSignin",
@@ -1533,4 +1579,30 @@ export default {
 .export {
 .export {
   background: #14928a;
   background: #14928a;
 }
 }
-</style>
+.alert{
+  margin-bottom: 10px;
+}
+.collapse-title{
+  display: flex;
+  justify-content: space-between;
+  align-items: center;
+  width: 100%;
+  .el-icon-circle-close{
+    font-size: 16px;
+    margin-right: 10px;
+  }
+}
+/deep/ .el-collapse-item__wrap{
+  padding-top: 20px;
+}
+.cycleForm{
+  /deep/ .el-form-item{
+    display: flex;
+    width: 100%;
+    /deep/ .el-form-item__content{
+      margin-left: 0!important;
+      flex: 1;
+    }
+  }
+}
+</style>

+ 1 - 1
vue.config.js

@@ -20,7 +20,7 @@ const name = defaultSettings.title || '管乐迷后台管理系统' // page titl
 // let target = 'http://dyme.utools.club' //test环境
 // let target = 'http://dyme.utools.club' //test环境
 // let target = 'http://192.168.3.139:8000' // 箭河
 // let target = 'http://192.168.3.139:8000' // 箭河
 // let target = 'http://192.168.3.248:8000' //邹璇
 // let target = 'http://192.168.3.248:8000' //邹璇
-// let target = 'http://192.168.3.8:8000' //勇哥
+// let target = 'http://192.168.3.204:8000' //勇哥
 let target = 'http://dev.dayaedu.com' // 测试服
 let target = 'http://dev.dayaedu.com' // 测试服
 // let target = 'http://192.168.3.196' // 乔
 // let target = 'http://192.168.3.196' // 乔
 // All configuration item explanations can be find in https://cli.vuejs.org/config/
 // All configuration item explanations can be find in https://cli.vuejs.org/config/