lex-xin 4 years ago
parent
commit
f6568eaa4a
80 changed files with 3241 additions and 1996 deletions
  1. 0 0
      dist/index.html
  2. 5 0
      dist/static/css/chunk-27d213b0.5fb79823.css
  3. 0 0
      dist/static/css/chunk-35005cb0.4da03be6.css
  4. 0 0
      dist/static/css/chunk-62a7845a.ab7964a8.css
  5. 0 0
      dist/static/css/chunk-999e9a5c.0161fe92.css
  6. 5 0
      dist/static/css/chunk-ba2bab20.6c4a215b.css
  7. 0 0
      dist/static/css/chunk-eaa0afec.238b85ee.css
  8. 0 0
      dist/static/js/app.03d9b0da.js
  9. 0 0
      dist/static/js/chunk-1445e5ae.679bed79.js
  10. 0 0
      dist/static/js/chunk-14af6d4a.33877683.js
  11. 0 0
      dist/static/js/chunk-29a09b8f.97f7e729.js
  12. 1 0
      dist/static/js/chunk-47c365ea.db2aefd4.js
  13. 2 0
      dist/static/js/chunk-5e069291.0954878e.js
  14. 0 0
      dist/static/js/chunk-6af53446.afb9d41f.js
  15. 0 0
      dist/static/js/chunk-704289ef.33729d94.js
  16. 0 0
      dist/static/js/chunk-7e9b0612.9786dcbb.js
  17. 1 0
      dist/static/js/chunk-f55f91f0.dfd1737f.js
  18. 0 0
      dist/static/js/chunk-f55f91f0.fd7a57c8.js
  19. 1 1
      src/components/Descriptions/Descriptions.vue
  20. 28 0
      src/components/LocationHash/index.vue
  21. 10 2
      src/components/Pagination/index.vue
  22. 36 0
      src/components/form-item/index.vue
  23. 8 0
      src/components/install.js
  24. 1 0
      src/components/overflow-text/index.vue
  25. 22 10
      src/components/save-form/index.vue
  26. 96 0
      src/components/statistic/index.vue
  27. 15 2
      src/constant/index.js
  28. 1 0
      src/helpers/index.js
  29. 1 1
      src/layout/components/AppMain.vue
  30. 5 4
      src/layout/components/TagsView.vue
  31. 6 0
      src/main.js
  32. 0 1
      src/permission.js
  33. 25 7
      src/router/notKeepAliveList.js
  34. 14 1
      src/store/modules/selects.js
  35. 3 1
      src/store/modules/tagsView.js
  36. 3 3
      src/styles/transition.scss
  37. 3 2
      src/utils/searchArray.js
  38. 8 0
      src/utils/vueFilter.js
  39. 21 13
      src/views/accompanyManager/accompanyBuys.vue
  40. 36 38
      src/views/accompanyManager/accompanyList.vue
  41. 6 3
      src/views/accompanyManager/index.vue
  42. 162 126
      src/views/attendanceManager/attendanceList/index.vue
  43. 3 3
      src/views/businessManager/shopManager/shopCategory.vue
  44. 204 0
      src/views/categroyManager/generalSettings/vipCourseTimeSet.vue
  45. 273 0
      src/views/categroyManager/generalSettings/vipCourseType.vue
  46. 25 371
      src/views/categroyManager/generalSettings/vipParameterManager.vue
  47. 50 74
      src/views/categroyManager/insideSetting/branchActive.vue
  48. 41 97
      src/views/categroyManager/insideSetting/branchActiveOperation.vue
  49. 36 25
      src/views/categroyManager/vipActiveList.vue
  50. 25 27
      src/views/categroyManager/vipChargeSeting.vue
  51. 44 28
      src/views/categroyManager/vipNewActive.vue
  52. 34 26
      src/views/levelManager/levelManager.vue
  53. 1 9
      src/views/resetTeaming/index.vue
  54. 84 55
      src/views/returnVisitManager/returnVisitList.vue
  55. 1 1
      src/views/save-form-test/index.vue
  56. 1 4
      src/views/studentManager/components/studentInfo.vue
  57. 94 19
      src/views/studentManager/components/studentOrder.vue
  58. 93 85
      src/views/studentManager/components/teamAndcourse.vue
  59. 16 31
      src/views/studentManager/studentList.vue
  60. 0 189
      src/views/teamBuild/components/teamBaseInfo.vue
  61. 1 11
      src/views/teamBuild/index.vue
  62. 1 10
      src/views/teamBuild/signupList.vue
  63. 16 24
      src/views/teamDetail/components/studentList.vue
  64. 4 11
      src/views/teamDetail/index.vue
  65. 3 9
      src/views/teamDetail/indexCourse.vue
  66. 36 8
      src/views/teamDetail/teamCourseList.vue
  67. 3 11
      src/views/teamDetail/teamInfo.vue
  68. 28 28
      src/views/teamDetail/teamList.vue
  69. 4 4
      src/views/timedTask/index.vue
  70. 29 3
      src/views/vipClass/vipDetail/components/fnanceInfo.vue
  71. 21 3
      src/views/vipClass/vipDetail/components/teacherRecord.vue
  72. 307 217
      src/views/vipClass/vipList.vue
  73. 332 241
      src/views/workBenchManager/classFeesIsOk.vue
  74. 51 0
      src/views/workBenchManager/journal/index111.vue
  75. 182 0
      src/views/workBenchManager/journal/model/leave.vue
  76. 179 0
      src/views/workBenchManager/journal/model/list.vue
  77. 171 0
      src/views/workBenchManager/journal/model/student.vue
  78. 122 0
      src/views/workBenchManager/journal/model/vipApply.vue
  79. 1 1
      src/views/workBenchManager/journal/studentComplain.vue
  80. 200 156
      src/views/workBenchManager/requestProcessing.vue

File diff suppressed because it is too large
+ 0 - 0
dist/index.html


+ 5 - 0
dist/static/css/chunk-27d213b0.5fb79823.css

@@ -0,0 +1,5 @@
+<<<<<<< HEAD:dist/static/css/chunk-ba2bab20.6c4a215b.css
+.process[data-v-cd5d302a]{padding:10px;max-height:600px;overflow-y:auto}.select[data-v-57651dcb]{font-size:14px}.btnList[data-v-57651dcb]{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row;-webkit-box-pack:start;-ms-flex-pack:start;justify-content:flex-start;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.btnList div[data-v-57651dcb]{margin-right:15px}
+=======
+.process[data-v-f049a426]{padding:10px;max-height:600px;overflow-y:auto}.select[data-v-7a08b034]{font-size:14px}.btnList[data-v-7a08b034]{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row;-webkit-box-pack:start;-ms-flex-pack:start;justify-content:flex-start;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.btnList div[data-v-7a08b034]{margin-right:15px}
+>>>>>>> master:dist/static/css/chunk-27d213b0.5fb79823.css

File diff suppressed because it is too large
+ 0 - 0
dist/static/css/chunk-35005cb0.4da03be6.css


File diff suppressed because it is too large
+ 0 - 0
dist/static/css/chunk-62a7845a.ab7964a8.css


File diff suppressed because it is too large
+ 0 - 0
dist/static/css/chunk-999e9a5c.0161fe92.css


+ 5 - 0
dist/static/css/chunk-ba2bab20.6c4a215b.css

@@ -0,0 +1,5 @@
+<<<<<<< HEAD:dist/static/css/chunk-ba2bab20.6c4a215b.css
+.process[data-v-cd5d302a]{padding:10px;max-height:600px;overflow-y:auto}.select[data-v-57651dcb]{font-size:14px}.btnList[data-v-57651dcb]{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row;-webkit-box-pack:start;-ms-flex-pack:start;justify-content:flex-start;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.btnList div[data-v-57651dcb]{margin-right:15px}
+=======
+.process[data-v-f049a426]{padding:10px;max-height:600px;overflow-y:auto}.select[data-v-7a08b034]{font-size:14px}.btnList[data-v-7a08b034]{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row;-webkit-box-pack:start;-ms-flex-pack:start;justify-content:flex-start;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.btnList div[data-v-7a08b034]{margin-right:15px}
+>>>>>>> master:dist/static/css/chunk-27d213b0.5fb79823.css

File diff suppressed because it is too large
+ 0 - 0
dist/static/css/chunk-eaa0afec.238b85ee.css


File diff suppressed because it is too large
+ 0 - 0
dist/static/js/app.03d9b0da.js


File diff suppressed because it is too large
+ 0 - 0
dist/static/js/chunk-1445e5ae.679bed79.js


File diff suppressed because it is too large
+ 0 - 0
dist/static/js/chunk-14af6d4a.33877683.js


File diff suppressed because it is too large
+ 0 - 0
dist/static/js/chunk-29a09b8f.97f7e729.js


File diff suppressed because it is too large
+ 1 - 0
dist/static/js/chunk-47c365ea.db2aefd4.js


File diff suppressed because it is too large
+ 2 - 0
dist/static/js/chunk-5e069291.0954878e.js


File diff suppressed because it is too large
+ 0 - 0
dist/static/js/chunk-6af53446.afb9d41f.js


File diff suppressed because it is too large
+ 0 - 0
dist/static/js/chunk-704289ef.33729d94.js


File diff suppressed because it is too large
+ 0 - 0
dist/static/js/chunk-7e9b0612.9786dcbb.js


File diff suppressed because it is too large
+ 1 - 0
dist/static/js/chunk-f55f91f0.dfd1737f.js


File diff suppressed because it is too large
+ 0 - 0
dist/static/js/chunk-f55f91f0.fd7a57c8.js


+ 1 - 1
src/components/Descriptions/Descriptions.vue

@@ -28,7 +28,7 @@
 
 <script>
 export default {
-  name: 'Descriptions',
+  name: 'descriptions',
   components: {
     // 描述内容子组件渲染
     DescriptionContent: {

+ 28 - 0
src/components/LocationHash/index.vue

@@ -0,0 +1,28 @@
+<template>
+  <div class="location-hash">
+      <slot />
+  </div>
+</template>
+<script>
+export default {
+    name: 'location-hash',
+    props: {
+        value: {
+            type: String | Number
+        }
+    },
+    mounted() {
+    },
+    methods: {
+        onChange() {
+            this.changeHash(this.value)
+            this.$emit('onHashChange')
+        }
+    },
+    watch: {
+        value(newValue, oldValue) {
+            this.onChange()
+        }
+    }
+}
+</script>

+ 10 - 2
src/components/Pagination/index.vue

@@ -76,9 +76,17 @@ export default {
       }
     }
   },
+  watch: {
+    currentPage() {
+      this.syncStore()
+    },
+    pageSize() {
+      this.syncStore()
+    }
+  },
   mounted() {
     if (this.sync) {
-      const searchs = new Searchs(this.$route.fullPath)
+      const searchs = new Searchs(this.$route.path)
       const active = searchs.get()
       if (active && active.page) {
         for (const key in active.page) {
@@ -93,7 +101,7 @@ export default {
   methods: {
     syncStore() {
       if (this.sync) {
-        const searchs = new Searchs(this.$route.fullPath)
+        const searchs = new Searchs(this.$route.path)
         searchs.update(this._props, undefined, 'page')
       }
     },

+ 36 - 0
src/components/form-item/index.vue

@@ -0,0 +1,36 @@
+<template>
+  <el-form-item
+    class="item"
+    v-bind="{...$attrs, ...$props}"
+  >
+    <span class="name">输入内容</span>
+    <slot/>
+  </el-form-item>
+</template>
+<script>
+export default {
+  name: 'form-item',
+  mounted() {
+    console.log(this)
+  }
+}
+</script>
+<style lang="less" scoped>
+.item{
+  position: relative;
+  .name{
+    position: absolute;
+    font-size: 12px;
+    background-color: #fff;
+    padding: 3px;
+    top: -12px;
+    max-width: 90%;
+    margin: 0 5%;
+    z-index: 1;
+    height: 20px;
+    display: inline-block;
+    line-height: 20px;
+    color: #13817a;
+  }
+}
+</style>

+ 8 - 0
src/components/install.js

@@ -4,15 +4,23 @@
  */
 
 import saveform from '@/components/save-form'
+import formitem from '@/components/form-item'
 import overflowtext from '@/components/overflow-text'
+import locationHash from '@/components/LocationHash'
 import selectall from '@/components/select-all'
 import copytext from '@/components/copy-text'
+import statistic from '@/components/statistic'
+import descriptions from '@/components/Descriptions/Descriptions.vue'
 
 export default {
   install(Vue) {
     Vue.component(saveform.name, saveform)
+    Vue.component(formitem.name, formitem)
     Vue.component(overflowtext.name, overflowtext)
+    Vue.component(locationHash.name, locationHash)
     Vue.component(selectall.name, selectall)
     Vue.component(copytext.name, copytext)
+    Vue.component(statistic.name, statistic)
+    Vue.component(descriptions.name, descriptions)
   }
 }

+ 1 - 0
src/components/overflow-text/index.vue

@@ -3,6 +3,7 @@
     class="tooltip"
     effect="dark"
     placement="top"
+    :open-delay="300"
   >
     <template #content>
       <span class="tooltip-content">{{text}}</span>

+ 22 - 10
src/components/save-form/index.vue

@@ -21,17 +21,23 @@ export default {
     }
   },
   mounted() {
-    const searchs = new Searchs(this['save-key'] || this.$route.fullPath)
-    this.searchs = searchs
-    const active = searchs.get()
-    for (const key in active.form) {
-      if (active.form.hasOwnProperty(key)) {
-        const item = active.form[key]
-        this.model[key] = item
-      }
-    }
+    this.setFormValue()
   },
   methods: {
+    setFormValue() {
+      const searchs = new Searchs(this.saveKey || this.$route.path)
+      this.searchs = searchs
+      const active = searchs.get()
+      for (const key in active.form) {
+        if (active.form.hasOwnProperty(key)) {
+          const item = active.form[key]
+          this.model[key] = item
+        }
+      }
+      if (this.saveKey) {
+        this.searchs.update(this.$route.path, undefined, 'bind')
+      }
+    },
     submit(evt) {
       evt.stopPropagation()
       evt.stopImmediatePropagation()
@@ -41,17 +47,23 @@ export default {
         this.$listeners.submit(evt)
       }
     },
-    reset() {
+    reset(evt) {
+      evt.stopPropagation()
+      evt.stopImmediatePropagation()
+      evt.preventDefault()
       if (this.$listeners.reset) {
         this.$listeners.reset()
         this.$nextTick(() => {
           this.resetFields()
+          // this.setFormValue()
         })
+        console.log({...this.model})
       } else {
         this.resetFields()
       }
     },
     save(search = null, type = 'form') {
+      search = search ? search : this.model
       this.searchs.update(search, undefined, type)
     },
     validate(FC) {

+ 96 - 0
src/components/statistic/index.vue

@@ -0,0 +1,96 @@
+<template>
+  <el-row class="statistic">
+    <div v-for="(item, index) in tags" :key="index">
+      <el-col :span="(index + 1) % col === 0 ? colSpan : colSpan - 1">
+        <statistic-content :item="item"></statistic-content>
+      </el-col>
+      <el-col :key="index" :span="1" v-if="(index + 1) % col !== 0 && (index + 1) < tags.length">
+        <el-divider direction="vertical"></el-divider>
+      </el-col>
+    </div>
+  </el-row>
+</template>
+<script>
+export default {
+  name: 'statistic',
+  props: {
+    col: {
+      type: Number,
+      default: 4
+    }
+  },
+  components: {
+    // 描述内容子组件渲染
+    'statistic-content': {
+      props: {
+        item: Object
+      },
+      render(h) {
+        console.log(this.item.children)
+        return (
+          <div class="statistic-content">
+            {this.item.children}
+          </div>
+        )
+      }
+    }
+  },
+  computed: {
+    colSpan() {
+      return 24 / this.col
+    },
+  },
+  data() {
+    return {
+      tags: []
+    }
+  },
+  mounted() {
+    this.setTags()
+  },
+  beforeUpdate() {
+    this.setTags()
+  },
+  methods: {
+    setTags() {
+      this.tags = this.$slots.default.filter(item => item.tag === 'statistic-item')
+    }
+  }
+}
+</script>
+<style lang="less" scoped>
+  .statistic{
+    padding: 20px 0;
+    text-align: center;
+    /deep/ .el-icon-edit{
+      cursor: pointer;
+      color: #14928A;
+      font-size: 20px;
+    }
+    /deep/ .el-col {
+      display: flex;
+      align-items: center;
+      min-height: 60px;
+      align-items: center;
+      justify-content: center;
+      align-items: center;
+      flex-direction: column;
+    }
+    /deep/ .el-col-1{
+      font-size: 60px;
+    }
+    /deep/ .statistic-content{
+      >span{
+        display: block;
+        line-height: 1.8;
+        color: rgba(0, 0, 0, .85);
+        font-size: 24px;
+        &:first-child{
+          font-size: 14px;
+          font-weight: normal;
+          color: rgba(0, 0, 0, .45);
+        }
+      }
+    }
+  }
+</style>

+ 15 - 2
src/constant/index.js

@@ -45,8 +45,6 @@ export const courseType = {
   COMM: '对外课',
 }
 
-
-
 export const boolOptions = {
   false: '否',
   true: '是',
@@ -139,6 +137,13 @@ export const songUseType = {
   COMMON: '公用',
 }
 
+export const journalType = {
+  SYSTEM: '系统通知',
+  STUDENT: '学生申诉',
+  MUSICGROUP: '退团退课',
+  LEAVE: '请假处理',
+  VIPAPPLY: 'VIP申请审核',
+}
 export const jobNature = {
   PART_TIME: "兼职",
   FULL_TIME: "全职",
@@ -150,6 +155,10 @@ export const workType = {
   BISHOP: "主教"
 }
 
+export const rewardModeType = {
+  PER: '累计奖励',
+  STAIR: '阶梯奖励'
+}
 export const teachMode = {
   ONLINE: '线上课',
   OFFLINE: '线下课'
@@ -177,3 +186,7 @@ export const mergeCourseType = {
   MASTER: '主课',
   ASSIST: '副课',
 }
+export const mergeType = {
+  合并课: '合并课',
+  被合并课: '被合并课',
+}

+ 1 - 0
src/helpers/index.js

@@ -60,6 +60,7 @@ export class Searchs {
   }
 
   update(data, key, type) {
+    this.searchs = this.parse()
     const k = (key || this.key)
     if (!this.searchs[k]) {
       this.searchs[k] = {...initSearch}

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

@@ -20,7 +20,7 @@ export default {
       return this.$route.path
     },
     needKeep() {
-      return !notKeepAliveList.includes(this.$route.fullPath)
+      return !notKeepAliveList.includes(this.$route.path)
     },
     cachedViews () {
       return this.$store.state.tagsView.cachedViews

+ 5 - 4
src/layout/components/TagsView.vue

@@ -80,11 +80,12 @@ export default {
       return route.path === this.$route.path
     },
     syncTagViewAndSaveForm() {
-      const keys = this.$store.state.tagsView.visitedViews.map(item => item.fullPath)
+      const keys = this.$store.state.tagsView.visitedViews.map(item => item.path)
       const searchs = new Searchs()
-      const sks = Object.keys(searchs.getSearchs())
+      const allSearch = searchs.getSearchs()
+      const sks = Object.keys(allSearch)
       for (const item of sks) {
-        if (!keys.includes(item)) {
+        if (!(keys.includes(item) || keys.includes(allSearch[item].bind))) {
           searchs.removeByKey(item)
         }
       }
@@ -111,7 +112,7 @@ export default {
     },
     closeSelectedTag (view) {
       const searchs = new Searchs()
-      searchs.remove(this.$route.fullPath)
+      searchs.remove(this.$route.path)
       this.$store.dispatch('delVisitedViews', view).then((views) => {
         if (this.isActive(view)) {
           const latestView = views.slice(-1)[0]

+ 6 - 0
src/main.js

@@ -105,6 +105,12 @@ Vue.mixin({
       return store.state.selects
     }
   },
+  methods: {
+    changeHash(value) {
+      const origin = window.location.origin
+      history.replaceState("", "", `${origin}/#${this.$route.path}?opt=${value}`)
+    }
+  }
 })
 
 new Vue({

+ 0 - 1
src/permission.js

@@ -41,7 +41,6 @@ router.beforeEach(async (to, from, next) => {
   // from.query = to.query
   // start progress bar
   NProgress.start()
-
   // set page title
   // document.title = getPageTitle(to.meta.title)
   document.title = getPageTitle()

+ 25 - 7
src/router/notKeepAliveList.js

@@ -1,11 +1,29 @@
 export default [
   '/setSilder/save-form',
-  '/contentManager/accompaniment',
-  '/orderList/orderAudit',
-  '/business/teamCourseList',
-  '/business/auditList',
-  '/journal/payAppeal',
-  '/orderList/financeManager',
+  '/contentManager/accompaniment', // 教学伴奏
+  '/orderList/orderAudit', // 订单管理 订单审核
+  '/business/teamCourseList', // 课表列表
+  '/business/auditList', // 费用审核列表
+  '/orderList/financeManager', // 财务管理
+  '/vipClassSet/vipParameterManager', // VIP参数设置
+  '/vipClassSet/branchActive', // VIP分部活动列表
+  '/vipClassSet/branchActiveOperation', // VIP分部活动修改
+  '/vipClassSet/vipChargeSeting', // VIP课程收费设置
+  '/vipClassSet/vipActiveList', // VIP活动方案
+  '/vipClassSet/vipNewActive', // VIP活动方案修改
+  '/main/main', // 首页
+  '/journal/journal', // 系统日志
+  '/business/accompany', // 网管课管理
+  '/journal/classFeesIsOk', // 课酬列表
+  '/journal/requestProcessing', // 课酬申述
+  '/journal/payAppeal', // 考勤申诉
+  '/business/teamDetail', // 乐团列表
+  '/business/vipList', // vip列表
+  '/business/studentList', // 学员管理
+  '/business/studentDetail', // 学员管理详情
   // '/operateManager/HumanResources'
-  '/vipClassSet/vipNewActive'
+  '/business/attendanceList',
+  '/business/returnVisitList',
+  '/business/levelManager',
+  '/journal/journal', // 日志
 ]

+ 14 - 1
src/store/modules/selects.js

@@ -2,6 +2,7 @@
 import { branchQueryPage } from '@/api/specialSetting'
 import { getSubject, getTeacher } from '@/api/buildTeam'
 import { getSchool } from '@/api/systemManage'
+import { vipGroupCategory } from "@/api/vipSeting"
 
 /**
  *
@@ -20,6 +21,7 @@ export default {
     subjects: [],
     teachers: [],
     schools: [],
+    vipGroupCategory: []
   },
   mutations: {
     commit_branchs: (state, branchs) => {
@@ -34,6 +36,9 @@ export default {
     commit_schools: (state, schools) => {
       state.schools = schools
     },
+    commit_vip_group_category: (state, vipGroupCategory) => {
+      state.vipGroupCategory = vipGroupCategory
+    }
   },
   actions: {
     async setBranchs ({ commit, state }, force) {
@@ -44,7 +49,7 @@ export default {
         } catch (error) { }
       }
     },
-    async setSubject ({ commit, state }, force) {
+    async setSubjects ({ commit, state }, force) {
       if (!state.subjects.length || force === true) {
         try {
           const res = await getSubject({rows: 9999, tenantId: '1'})
@@ -68,5 +73,13 @@ export default {
         } catch (error) { }
       }
     },
+    async setVipGroupCategory ({ commit, state }, force) {
+      if (!state.subjects.length || force === true) {
+        try {
+          const res = await vipGroupCategory()
+          commit('commit_vip_group_category', res.data)
+        } catch (error) { }
+      }
+    },
   }
 }

+ 3 - 1
src/store/modules/tagsView.js

@@ -5,10 +5,12 @@ const tagsView = {
   },
   mutations: {
     ADD_VISITED_VIEWS: (state, view) => {
+      // console.log(view)
       if (state.visitedViews.some(v => v.path === view.path)) {
         state.visitedViews.forEach(v => {
           if (v.path === view.path) {
             v.fullPath = view.fullPath
+            v.title = view.meta.title
             if (view.query) {
               v.query = view.query
             }
@@ -80,7 +82,7 @@ const tagsView = {
     delOthersViews ({ commit, state }, view) {
       return new Promise((resolve) => {
         commit('DEL_OTHERS_VIEWS', view)
-        resolve([...state.visitedViews])
+        resolve([...state.visitedViews]) 
       })
     },
     delAllViews ({ commit, state }) {

+ 3 - 3
src/styles/transition.scss

@@ -14,7 +14,7 @@
 /* fade-transform */
 .fade-transform-leave-active,
 .fade-transform-enter-active {
-  transition: all .5s;
+  transition: all .3s;
 }
 
 .fade-transform-enter {
@@ -30,7 +30,7 @@
 /* breadcrumb transition */
 .breadcrumb-enter-active,
 .breadcrumb-leave-active {
-  transition: all .5s;
+  transition: all .3s;
 }
 
 .breadcrumb-enter,
@@ -40,7 +40,7 @@
 }
 
 .breadcrumb-move {
-  transition: all .5s;
+  transition: all .3s;
 }
 
 .breadcrumb-leave-active {

+ 3 - 2
src/utils/searchArray.js

@@ -1,5 +1,5 @@
 // 搜索用的下拉数据列表
-import { payOrderType, auditType, auditPaymentType, orderServerType, orderAuditType,classTime } from '../constant'
+import { payOrderType, auditType, auditPaymentType, orderServerType, orderAuditType, rewardModeType,classTime } from '../constant'
 // 课程类型
 export const courseType = [
   { label: "声部课", value: "SINGLE" },
@@ -202,7 +202,8 @@ export const auditTypeList = getValueForKey(auditType)
 export const auditPaymentTypeList = getValueForKey(auditPaymentType)
 export const orderServerList = getValueForKey(orderServerType)
 export const orderAuditTypeList = getValueForKey(orderAuditType)
-export function getValueForKey (obj) {
+export const rewardModeTypeList = getValueForKey(rewardModeType)
+function getValueForKey (obj) {
   let arr = []
   for (let k in obj) {
     arr.push({ label: obj[k], value: k })

+ 8 - 0
src/utils/vueFilter.js

@@ -695,3 +695,11 @@ Vue.filter('orderAuditType', value => {
 Vue.filter('songUseTypeFormat', value => {
   return constant.songUseType[value]
 })
+
+Vue.filter('rewardModeTypeFormat', value => {
+  return constant.rewardModeType[value]
+})
+// 系统日志类型
+Vue.filter('journalTypeFormat', value => {
+  return constant.journalType[value]
+})

+ 21 - 13
src/views/accompanyManager/accompanyBuys.vue

@@ -1,13 +1,15 @@
 <!--  -->
 <template>
   <div class="m-core">
-    <el-form :inline="true"
+    <save-form :inline="true"
              class="searchForm"
-             v-model.trim="searchForm">
+             @submit="search"
+             @reset="onReSet"
+             :save-key="saveKey"
+             :model.sync="searchForm">
       <!-- 状态 指导老师 活动方案-->
       <el-form-item>
         <el-input v-model.trim="searchForm.search"
-                  @keyup.enter.native="search"
                   placeholder="学员编号 学员名称"></el-input>
       </el-form-item>
       <el-form-item>
@@ -16,7 +18,7 @@
                    filterable
                    clearable
                    placeholder="请选择分部">
-          <el-option v-for="(item,index) in organList"
+          <el-option v-for="(item,index) in selects.branchs"
                      :key="index"
                      :label="item.name"
                      :value="item.id"></el-option>
@@ -36,9 +38,9 @@
         </el-select>
       </el-form-item>
       <el-form-item>
-        <el-button @click="search"
+        <el-button native-type="submit"
                    type="danger">搜索</el-button>
-        <el-button @click="onReSet"
+        <el-button native-type="reset"
                    type="primary">重置</el-button>
       </el-form-item>
       <el-form-item>
@@ -48,7 +50,7 @@
                    v-permission="'export/studentBuyPractice'"
                    style="background-color: #14928a; border: 1px solid #14928a;">导出</el-button>
       </el-form-item>
-    </el-form>
+    </save-form>
     <div class="tableWrap">
       <el-table style="width: 100%"
                 :header-cell-style="{background:'#EDEEF0',color:'#444'}"
@@ -198,14 +200,20 @@ export default {
   activated () {
     this.init();
   },
+  computed: {
+    saveKey() {
+      return this.$route.path + '/2'
+    }
+  },
   methods: {
     init () {
       // 获取分部
-      getEmployeeOrgan().then(res => {
-        if (res.code == 200) {
-          this.organList = res.data;
-        }
-      });
+      this.$store.dispatch('setBranchs')
+      // getEmployeeOrgan().then(res => {
+      //   if (res.code == 200) {
+      //     this.organList = res.data;
+      //   }
+      // });
       this.getList()
     },
     getList () {
@@ -298,4 +306,4 @@ export default {
 };
 </script>
 <style lang='scss' scoped>
-</style>
+</style>

+ 36 - 38
src/views/accompanyManager/accompanyList.vue

@@ -14,13 +14,15 @@
            style="width: 120px;">网管课导出</div>
     </div>
     <div class="m-core">
-      <el-form :inline="true"
+      <save-form :inline="true"
                class="searchForm"
-               v-model.trim="searchForm">
+               @submit="search"
+               @reset="onReSet"
+               :model.sync="searchForm">
         <!-- 状态 指导老师 活动方案-->
         <el-form-item>
           <el-input v-model.trim="searchForm.search"
-                    @keyup.enter.native="search"
+                    clearable
                     placeholder="课程组名称"></el-input>
         </el-form-item>
         <el-form-item>
@@ -29,7 +31,7 @@
                      filterable
                      clearable
                      placeholder="请选择分部">
-            <el-option v-for="(item,index) in organList"
+            <el-option v-for="(item,index) in selects.branchs"
                        :key="index"
                        :label="item.name"
                        :value="item.id"></el-option>
@@ -63,8 +65,9 @@
           <el-select v-model.trim="searchForm.teacherId"
                      clearable
                      filterable
+                     :filter-method="filterMethod"
                      placeholder="指导老师">
-            <el-option v-for="(item,index) in teacherList"
+            <el-option v-for="(item,index) in selects.teachers"
                        :key="index"
                        :value="item.id"
                        :label="item.realName"></el-option>
@@ -95,12 +98,12 @@
           </el-select>
         </el-form-item>
         <el-form-item>
-          <el-button @click="search"
+          <el-button native-type="submit"
                      type="danger">搜索</el-button>
-          <el-button @click="onReSet"
+          <el-button native-type="reset"
                      type="primary">重置</el-button>
         </el-form-item>
-      </el-form>
+      </save-form>
       <!-- tab -->
       <div class="tableWrap">
         <el-table style="width: 100%"
@@ -109,11 +112,19 @@
           <el-table-column align="center"
                            prop="id"
                            label="课程组编号"
-                           width="100"></el-table-column>
+                           width="100">
+                            <template slot-scope="scope">
+                              <copy-text>{{scope.row.id}}</copy-text>
+                            </template>
+                           </el-table-column>
           <el-table-column align="center"
                            prop="name"
                            label="课程组名称"
-                           width="100"></el-table-column>
+                           width="100">
+                           <template slot-scope="scope">
+                              <copy-text>{{scope.row.name}}</copy-text>
+                            </template>
+                          </el-table-column>
           <el-table-column align="center"
                            prop="type"
                            label="课程组类型"
@@ -193,11 +204,14 @@
               </div>
             </template>
           </el-table-column>
-          <el-table-column align="center"
-                           width="150"
+          <el-table-column width="150"
                            prop="memo"
                            label="备注"
-                           fixed="right"></el-table-column>
+                           fixed="right">
+                            <template slot-scope="scope">
+                              <overflow-text :text="scope.row.memo" width="150px"></overflow-text>
+                            </template>
+                           </el-table-column>
 
           <el-table-column align="center"
                            width="200"
@@ -326,19 +340,6 @@ export default {
       }
     };
   },
-  created () {
-    // if (this.$route.query.searchForm) {
-    //   this.$route.query.searchForm instanceof Object
-    //     ? (this.searchForm = this.$route.query.searchForm)
-    //     : (this.searchForm = JSON.parse(this.$route.query.searchForm));
-    // }
-    // if (this.$route.query.rules) {
-    //   this.$route.query.rules instanceof Object
-    //     ? (this.rules = this.$route.query.rules)
-    //     : (this.rules = JSON.parse(this.$route.query.rules));
-    // }
-    // this.init();
-  },
   mounted () {
     if (this.$route.query.searchForm) {
       this.$route.query.searchForm instanceof Object
@@ -356,18 +357,15 @@ export default {
     this.init();
   },
   methods: {
+    filterMethod(inp) {
+      this.teacherList = this.selects.teachers.filter(item => (item.realName || '').indexOf(inp) > -1).slice(0, 49)
+    },
     init () {
-      getEmployeeOrgan().then(res => {
-        if (res.code == 200) {
-          this.organList = res.data;
-        }
-      });
-      //   <!-- 状态 指导老师 活动方案-->
-      getTeacher().then(res => {
-        if (res.code == 200) {
-          this.teacherList = res.data;
-        }
-      });
+      this.$store.dispatch('setBranchs')
+      this.$store.dispatch('setTeachers')
+        .then(() => {
+          this.teacherList = [...this.selects.teachers].slice(0, 49)
+        })
       this.getList();
     },
     permission (str, parent) {
@@ -536,7 +534,7 @@ export default {
       let searchForm = JSON.stringify(this.searchForm);
       this.$router.push({
         path: "/business/accompanys",
-        query: { id: row.id, rules, searchForm, type: row.type }
+        query: { id: row.id, type: row.type }
       });
     },
     closeCrouse (row) {

+ 6 - 3
src/views/accompanyManager/index.vue

@@ -27,8 +27,9 @@ import accompanyBuys from '@/views/accompanyManager/accompanyBuys'
 export default {
   components: { accompanyList, accompanyBuys },
   data () {
+    const { query } = this.$route
     return {
-      activeIndex: "1",
+      activeIndex: query.opt || '1',
     };
   },
   //生命周期 - 创建完成(可以访问当前this实例)
@@ -40,9 +41,11 @@ export default {
 
   },
   methods: {
-    handleClick () { }
+    handleClick (evt) {
+      this.changeHash(evt.name)
+    }
   },
 }
 </script>
 <style lang='scss' scoped>
-</style>
+</style>

+ 162 - 126
src/views/attendanceManager/attendanceList/index.vue

@@ -2,117 +2,155 @@
 <template>
   <div class="m-container">
     <h2>
-      <div class="squrt"></div>作业列表
+      <div class="squrt"></div>
+      作业列表
     </h2>
     <div class="m-core">
-      <el-form :inline="true"
-               :model="searchForm">
+      <save-form
+        :inline="true"
+        :model="searchForm"
+        @submit="search"
+        @reset="onReSet"
+      >
         <el-form-item>
-          <el-input v-model.trim="searchForm.search"
-                    @keyup.enter.native="search"
-                    placeholder='课程编号、名称、乐团名称'></el-input>
+          <el-input
+            v-model.trim="searchForm.search"
+            @keyup.enter.native="search"
+            placeholder="课程编号、名称、乐团名称"
+          ></el-input>
         </el-form-item>
         <el-form-item prop="organId">
-          <el-select class="multiple"
-                     filterable
-                     v-model.trim="searchForm.organId"
-                     clearable
-                     placeholder="请选择分部">
-            <el-option v-for="(item,index) in organList"
-                       :key="index"
-                       :label="item.name"
-                       :value="item.id"></el-option>
+          <el-select
+            class="multiple"
+            filterable
+            v-model.trim="searchForm.organId"
+            clearable
+            placeholder="请选择分部"
+          >
+            <el-option
+              v-for="(item, index) in organList"
+              :key="index"
+              :label="item.name"
+              :value="item.id"
+            ></el-option>
           </el-select>
         </el-form-item>
         <el-form-item>
-          <el-select v-model.trim="searchForm.groupType"
-                     class="organSelect"
-                     style=" margin-left: 15px; width:100%"
-                     filterable
-                     placeholder="请选择课程类型">
-            <el-option v-for="(item,index) in courseListType"
-                       :key="index"
-                       :label="item.label"
-                       :value="item.value"></el-option>
+          <el-select
+            v-model.trim="searchForm.groupType"
+            class="organSelect"
+            style="margin-left: 15px; width: 100%"
+            filterable
+            placeholder="请选择课程类型"
+          >
+            <el-option
+              v-for="(item, index) in courseListType"
+              :key="index"
+              :label="item.label"
+              :value="item.value"
+            ></el-option>
           </el-select>
         </el-form-item>
         <el-form-item>
-          <el-date-picker v-model.trim="courseTimer"
-                          style="width:420px;"
-                          type="daterange"
-                          value-format="yyyy-MM-dd"
-                          range-separator="至"
-                          start-placeholder="上课开始日期"
-                          end-placeholder="上课结束日期"
-                          :picker-options="{
-        firstDayOfWeek: 1
-    }"></el-date-picker>
+          <el-date-picker
+            v-model.trim="courseTimer"
+            style="width: 420px"
+            type="daterange"
+            value-format="yyyy-MM-dd"
+            range-separator="至"
+            start-placeholder="上课开始日期"
+            end-placeholder="上课结束日期"
+            :picker-options="{
+              firstDayOfWeek: 1,
+            }"
+          ></el-date-picker>
         </el-form-item>
         <el-form-item>
-          <el-button @click="search"
-                     type="danger">搜索</el-button>
-          <el-button @click="onReSet"
-                     type="primary">重置</el-button>
+          <el-button native-type="submit" type="danger">搜索</el-button>
+          <el-button native-type="reset" type="primary">重置</el-button>
         </el-form-item>
-      </el-form>
+      </save-form>
       <div class="tableWrap">
-        <el-table style="width: 100%"
-                  :header-cell-style="{background:'#EDEEF0',color:'#444'}"
-                  :data="tableList">
-          <el-table-column align="center"
-                           prop="courseScheduleId"
-                           label="课程编号"></el-table-column>
-          <el-table-column align="center"
-                           prop="courseScheduleName"
-                           label="课程名称"></el-table-column>
-          <el-table-column align="center"
-                           prop="organName"
-                           label="分部"></el-table-column>
-          <el-table-column align="center"
-                           prop="groupName"
-                           label="课程组名称"></el-table-column>
-          <el-table-column align="center"
-                           label="布置时间">
+        <el-table
+          style="width: 100%"
+          :header-cell-style="{ background: '#EDEEF0', color: '#444' }"
+          :data="tableList"
+        >
+          <el-table-column
+            align="center"
+            prop="courseScheduleId"
+            label="课程编号"
+          ></el-table-column>
+          <el-table-column
+            align="center"
+            prop="courseScheduleName"
+            label="课程名称"
+          ></el-table-column>
+          <el-table-column
+            align="center"
+            prop="organName"
+            label="分部"
+          ></el-table-column>
+          <el-table-column
+            align="center"
+            prop="groupName"
+            label="课程组名称"
+          ></el-table-column>
+          <el-table-column align="center" label="布置时间">
             <template slot-scope="scope">
               <div>
-                {{ scope.row.createTime ? scope.row.createTime.substr(0, 16): '' }}
+                {{
+                  scope.row.createTime ? scope.row.createTime.substr(0, 16) : ""
+                }}
               </div>
             </template>
           </el-table-column>
-          <el-table-column align="center"
-                           prop="actualTeacherName"
-                           label="布置老师"></el-table-column>
-          <el-table-column align="center"
-                           prop="expectNum"
-                           label="应交人数"></el-table-column>
-          <el-table-column align="center"
-                           prop="completedNum"
-                           label="已交人数"></el-table-column>
-          <el-table-column align="center"
-                           prop="repliedNum"
-                           label="已回复数"></el-table-column>
-          <el-table-column align="center"
-                           prop="studentId"
-                           label="操作">
+          <el-table-column
+            align="center"
+            prop="actualTeacherName"
+            label="布置老师"
+          ></el-table-column>
+          <el-table-column
+            align="center"
+            prop="expectNum"
+            label="应交人数"
+          ></el-table-column>
+          <el-table-column
+            align="center"
+            prop="completedNum"
+            label="已交人数"
+          ></el-table-column>
+          <el-table-column
+            align="center"
+            prop="repliedNum"
+            label="已回复数"
+          ></el-table-column>
+          <el-table-column align="center" prop="studentId" label="操作">
             <template slot-scope="scope">
               <div>
-                <el-button type="text"
-                           v-permission="'studentManage/findStudentCourseHomeworks'"
-                           @click="lookDetail(scope.row)">查看</el-button>
+                <el-button
+                  type="text"
+                  v-permission="'studentManage/findStudentCourseHomeworks'"
+                  @click="lookDetail(scope.row)"
+                  >查看</el-button
+                >
               </div>
             </template>
           </el-table-column>
         </el-table>
-        <pagination :total="rules.total"
-                    :page.sync="rules.page"
-                    :limit.sync="rules.limit"
-                    :page-sizes="rules.page_size"
-                    @pagination="getList" />
-        <el-dialog title="作业详情"
-                   :visible.sync="classVisible"
-                   width="1000px">
-          <studentWork v-if="activeRow"
-                       :courseScheduleId="activeRow.courseScheduleId"></studentWork>
+        <pagination
+          sync
+          :total.sync="rules.total"
+          :page.sync="rules.page"
+          :limit.sync="rules.limit"
+          :page-sizes="rules.page_size"
+          @pagination="getList"
+        />
+        <el-dialog title="作业详情" :visible.sync="classVisible" width="1000px">
+          <studentWork
+            v-if="activeRow"
+            :courseScheduleId="activeRow.courseScheduleId"
+          ></studentWork>
         </el-dialog>
       </div>
     </div>
@@ -124,19 +162,19 @@ import axios from "axios";
 import { getToken } from "@/utils/auth";
 import pagination from "@/components/Pagination/index";
 import load from "@/utils/loading";
-import { courseListType } from '@/utils/searchArray'
+import { courseListType } from "@/utils/searchArray";
 import { getEmployeeOrgan } from "@/api/buildTeam";
 import studentWork from "@/views/teamDetail/componentCourse/studentWork";
-import { getHomePageList } from "./api.js"
+import { getHomePageList } from "./api.js";
 export default {
   components: { pagination, studentWork },
-  data () {
+  data() {
     return {
       courseListType,
       searchForm: {
         search: null,
         organId: null,
-        groupType: 'MUSIC'
+        groupType: "MUSIC",
       },
       courseTimer: [],
       teacherList: [],
@@ -147,17 +185,17 @@ export default {
         limit: 10, // 限制显示条数
         page: 1, // 当前页
         total: 0, // 总条数
-        page_size: [10, 20, 40, 50] // 选择限制显示条数
+        page_size: [10, 20, 40, 50], // 选择限制显示条数
       },
       activeRow: null,
-      classVisible: false
+      classVisible: false,
     };
   },
   //生命周期 - 创建完成(可以访问当前this实例)
-  created () { },
+  created() {},
   //生命周期 - 挂载完成(可以访问DOM元素)
-  mounted () {
-    getEmployeeOrgan().then(res => {
+  mounted() {
+    getEmployeeOrgan().then((res) => {
       if (res.code == 200) {
         this.organList = res.data;
       }
@@ -165,56 +203,54 @@ export default {
     // 获取分部
 
     this.init();
-
-
   },
-  activated () {
+  activated() {
     this.init();
   },
   methods: {
-    init () {
-      this.getList()
+    init() {
+      this.getList();
     },
-    getList () {
+    getList() {
       let date = this.searchForm;
       let classStartDate, classEndDate;
       if (this.courseTimer?.length > 0) {
-        classStartDate = this.courseTimer[0]
-        classEndDate = this.courseTimer[1]
+        classStartDate = this.courseTimer[0];
+        classEndDate = this.courseTimer[1];
       } else {
-        classStartDate = null
-        classEndDate = null
+        classStartDate = null;
+        classEndDate = null;
       }
-      date.classStartDate = classStartDate
-      date.classEndDate = classEndDate
-      date.page = this.rules.page
-      date.rows = this.rules.limit
-      getHomePageList(date).then(res => {
+      date.classStartDate = classStartDate;
+      date.classEndDate = classEndDate;
+      date.page = this.rules.page;
+      date.rows = this.rules.limit;
+      getHomePageList(date).then((res) => {
         if (res.code == 200) {
-          this.tableList = res.data.rows
-          this.rules.total = res.data.total
+          this.tableList = res.data.rows;
+          this.rules.total = res.data.total;
         }
-      })
+      });
     },
-    search () {
-      this.rules.page = 1
-      this.getList()
+    search() {
+      this.rules.page = 1;
+      this.getList();
     },
-    onReSet () {
+    onReSet() {
       this.searchForm = {
         search: null,
         organId: null,
-        groupType: 'MUSIC'
-      }
-      this.courseTimer = []
-      this.search()
+        groupType: "MUSIC",
+      };
+      this.courseTimer = [];
+      this.search();
     },
-    lookDetail (row) {
-      this.activeRow = row
-      this.classVisible = true
-    }
-  }
+    lookDetail(row) {
+      this.activeRow = row;
+      this.classVisible = true;
+    },
+  },
 };
 </script>
 <style lang='scss' scoped>
-</style>
+</style>

+ 3 - 3
src/views/businessManager/shopManager/shopCategory.vue

@@ -19,7 +19,7 @@
           <el-table-column align='center'
                            label="声部属性">
             <template slot-scope="scope">
-              {{ scope.row.subjectName | joinArray(',') }}
+              <overflow-text width="100%" :text="scope.row.subjectName | joinArray(',')"></overflow-text>
             </template>
           </el-table-column>
           <el-table-column align='center'
@@ -100,7 +100,7 @@ export default {
         create: '添加商品分类',
         update: '修改商品分类'
       },
-      typeStatus: false, // 添加教学点 
+      typeStatus: false, // 添加教学点
       formLabelWidth: '120px',
       form: {
         name: null, // 作业模块名称
@@ -257,4 +257,4 @@ export default {
 /deep/.el-select {
   width: 100% !important;
 }
-</style>
+</style>

+ 204 - 0
src/views/categroyManager/generalSettings/vipCourseTimeSet.vue

@@ -0,0 +1,204 @@
+<template>
+  <div>
+    <el-button
+      v-permission="'vipGroupDefaultClassesCycle/add'"
+      @click="addVipTimer"
+      type="primary"
+      style="margin-bottom: 20px"
+      >新建</el-button
+    >
+    <el-table
+      :data="rightList"
+      :header-cell-style="{ background: '#EDEEF0', color: '#444' }"
+    >
+      <el-table-column label="达到课时总数(次)" prop="maxClassTimes">
+      </el-table-column>
+      <el-table-column label="可排课时间段(月)" prop="month"> </el-table-column>
+      <el-table-column label="操作">
+        <template slot-scope="scope">
+          <div>
+            <el-button
+              type="text"
+              v-permission="'vipGroupDefaultClassesCycle/update'"
+              @click="resetTimerList(scope.row)"
+              >修改</el-button
+            >
+            <el-popover
+              placement="top"
+              width="160"
+              v-permission="'vipGroupDefaultClassesCycle/delete'"
+              :ref="scope.row.id"
+            >
+              <p>您确定删除该周期循环吗?</p>
+              <div style="text-align: right; margin: 0">
+                <el-button
+                  size="mini"
+                  type="text"
+                  @click="scope._self.$refs[scope.row.id].doClose()"
+                  >取消</el-button
+                >
+                <el-button
+                  type="primary"
+                  size="mini"
+                  @click="removeDefaultClassesCycle(scope)"
+                  >确定</el-button
+                >
+              </div>
+              <el-button type="text" slot="reference">删除</el-button>
+            </el-popover>
+          </div>
+        </template>
+      </el-table-column>
+    </el-table>
+    <!-- 周期循环新增弹窗 -->
+    <el-dialog
+      :title="(vipTimerFrom.isAdd ? '添加' : '修改') + 'VIP时间段'"
+      width="500px"
+      @close="onVipStatusClose('timerStatus')"
+      :visible.sync="timerStatus"
+    >
+      <el-form :model="vipTimerFrom" ref="timerStatus">
+        <el-form-item
+          label="达到课时总数"
+          prop="count"
+          :rules="[
+            { required: true, message: '请输入达到课时总数', trigger: 'blur' },
+          ]"
+          :label-width="formLabelWidth"
+        >
+          <el-input
+            v-model.trim="vipTimerFrom.count"
+            type="number"
+            autocomplete="off"
+          ></el-input>
+        </el-form-item>
+        <el-form-item
+          label="可排课时间段"
+          prop="timer"
+          :rules="[
+            { required: true, message: '请输入可排课时间段', trigger: 'blur' },
+          ]"
+          :label-width="formLabelWidth"
+        >
+          <el-input
+            v-model.trim="vipTimerFrom.timer"
+            type="number"
+            autocomplete="off"
+          ></el-input>
+        </el-form-item>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button @click="timerStatus = false">取 消</el-button>
+        <el-button type="primary" @click="addTimerStatus('timerStatus')"
+          >确 定</el-button
+        >
+      </div>
+    </el-dialog>
+  </div>
+</template>
+<script>
+import {
+  getDefaultClassesCycle,
+  addDefaultClassesCycle,
+  resetDefaultClassesCycle,
+  removeDefaultClassesCycle,
+} from "@/api/vipSeting";
+export default {
+  data() {
+    return {
+      formLabelWidth: "120px",
+      rightList: [],
+      timerStatus: false, //课程时间段弹窗状态
+      vipTimerFrom: {
+        count: "",
+        timer: "",
+        isAdd: true,
+        id: "",
+      },
+      dynamicTags: [],
+
+      inputValue: "",
+    };
+  },
+  mounted() {
+    this.getDefaultClassesCycle();
+  },
+  methods: {
+    async getDefaultClassesCycle() {
+      // 获取默认右边参数
+      await getDefaultClassesCycle().then((res) => {
+        this.rightList = res.data;
+      });
+    },
+
+    // 新增时间段
+    addVipTimer() {
+      this.timerStatus = true;
+      this.vipTimerFrom.isAdd = true;
+    },
+    addTimerStatus(formName) {
+      // 点击添加后 发送请求单独添加=> 刷新列表
+      // 判断是添加还是修改
+      this.$refs[formName].validate(async (valid) => {
+        if (valid) {
+          const vipTimerFrom = this.vipTimerFrom;
+          if (vipTimerFrom.isAdd) {
+            // 添加
+            await addDefaultClassesCycle({
+              organId: null,
+              maxClassTimes: vipTimerFrom.count,
+              month: vipTimerFrom.timer,
+            }).then((res) => {
+              if (res.code == 200) {
+                this.$message.success("添加成功");
+                this.getDefaultClassesCycle();
+                this.timerStatus = false;
+              }
+            });
+          } else {
+            // 修改
+            await resetDefaultClassesCycle({
+              maxClassTimes: vipTimerFrom.count,
+              month: vipTimerFrom.timer,
+              id: vipTimerFrom.id,
+            }).then((res) => {
+              this.$message.success("修改成功");
+              this.getDefaultClassesCycle();
+              this.timerStatus = false;
+            });
+          }
+        }
+      });
+    },
+    resetTimerList(row) {
+      this.timerStatus = true;
+      const vipTimerFrom = this.vipTimerFrom;
+      this.$nextTick(() => {
+        vipTimerFrom.count = row.maxClassTimes;
+        vipTimerFrom.timer = row.month;
+        vipTimerFrom.id = row.id;
+        vipTimerFrom.isAdd = false;
+      });
+    },
+    // 删除时间管理
+    removeDefaultClassesCycle(scope) {
+      removeDefaultClassesCycle({
+        id: scope.row.id,
+      }).then((res) => {
+        if (res.code == 200) {
+          scope._self.$refs[scope.row.id].doClose();
+          this.$message.success("删除成功");
+          this.getDefaultClassesCycle();
+        }
+      });
+    },
+    onVipStatusClose(formName) {
+      this.inputVisible = false;
+      this.inputValue = "";
+      this.$refs[formName].resetFields();
+    },
+  },
+};
+</script>
+<style lang="scss" scoped>
+</style>

+ 273 - 0
src/views/categroyManager/generalSettings/vipCourseType.vue

@@ -0,0 +1,273 @@
+<template>
+  <div>
+    <el-button
+      v-permission="'vipGroupCategory/add'"
+      @click="addGroupCategory"
+      type="primary"
+      style="margin-bottom: 20px"
+      >新建</el-button
+    >
+    <el-table
+      :data="leftList"
+      :header-cell-style="{ background: '#EDEEF0', color: '#444' }"
+    >
+      <el-table-column label="课程形式" prop="name"> </el-table-column>
+      <el-table-column label="班级人数(人)" prop="studentNum">
+      </el-table-column>
+      <el-table-column label="课程课时(分钟)" prop="singleClassMinutes">
+      </el-table-column>
+      <el-table-column label="操作">
+        <template slot-scope="scope">
+          <div>
+            <el-button
+              type="text"
+              v-permission="'vipGroupCategory/update'"
+              @click="resetGroupCategory(scope.row)"
+              >修改</el-button
+            >
+            <el-popover
+              placement="top"
+              width="160"
+              v-permission="'vipGroupCategory/delete'"
+              :ref="scope.row.id"
+            >
+              <p>您确定删除该课程形态吗?</p>
+              <div style="text-align: right; margin: 0">
+                <el-button
+                  size="mini"
+                  type="text"
+                  @click="scope._self.$refs[scope.row.id].doClose()"
+                  >取消</el-button
+                >
+                <el-button
+                  type="primary"
+                  size="mini"
+                  @click="removeGroupCategory(scope)"
+                  >确定</el-button
+                >
+              </div>
+              <el-button type="text" slot="reference">删除</el-button>
+            </el-popover>
+          </div>
+        </template>
+      </el-table-column>
+    </el-table>
+    <!-- 课程类型新增弹窗 -->
+    <el-dialog
+      :title="(vipStatusFrom.isAdd ? '添加' : '修改') + `VIP课程形式`"
+      class="courseMask"
+      width="500px"
+      @close="onVipStatusClose('vipStatus')"
+      :visible.sync="vipStatus"
+    >
+      <el-form :model="vipStatusFrom" ref="vipStatus">
+        <el-form-item
+          label="课程形式"
+          prop="name"
+          :rules="[
+            { required: true, message: '请输入课程形式', trigger: 'blur' },
+          ]"
+          :label-width="formLabelWidth"
+        >
+          <el-input
+            v-model.trim="vipStatusFrom.name"
+            autocomplete="off"
+          ></el-input>
+        </el-form-item>
+        <el-form-item
+          label="班级人数"
+          prop="num"
+          :rules="[
+            { required: true, message: '请输入班级人数', trigger: 'blur' },
+          ]"
+          :label-width="formLabelWidth"
+        >
+          <el-input
+            v-model.trim="vipStatusFrom.num"
+            type="number"
+            autocomplete="off"
+          ></el-input>
+        </el-form-item>
+        <el-form-item
+          label="课程课时"
+          prop="dynamicTags"
+          :rules="[
+            {
+              required: true,
+              message: '请输入课程课时',
+              trigger: 'blur, change',
+            },
+          ]"
+          :label-width="formLabelWidth"
+        >
+          <el-tag
+            :key="index"
+            effect="dark"
+            type="info"
+            v-for="(tag, index) in vipStatusFrom.dynamicTags"
+            closable
+            :disable-transitions="false"
+            @close="handleClose(tag)"
+          >
+            {{ tag }}
+          </el-tag>
+          <el-input
+            class="input-new-tag"
+            v-if="inputVisible"
+            v-model.trim="inputValue"
+            ref="saveTagInput"
+            style="width: 100px"
+            size="small"
+            @keyup.enter.native="handleInputConfirm"
+          >
+          </el-input>
+          <el-button
+            v-if="!inputVisible"
+            class="button-new-tag"
+            size="small"
+            @click="showInput"
+            >+ 添加</el-button
+          >
+          <el-button
+            v-if="inputVisible"
+            class="button-new-tag"
+            size="small"
+            @click="handleInputConfirm"
+            >保存</el-button
+          >
+        </el-form-item>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button @click="vipStatus = false">取 消</el-button>
+        <el-button type="primary" @click="addVipStatus('vipStatus')"
+          >确 定</el-button
+        >
+      </div>
+    </el-dialog>
+  </div>
+</template>
+<script>
+import { removeVipGroupCategory, vipGroupCategory, addVipGroupCategory,
+  resetVipGroupCategory, } from "@/api/vipSeting";
+export default {
+  data() {
+    return {
+      leftList: [],
+      vipStatus: false, // 课程形态弹窗状态
+      formLabelWidth: "120px",
+      inputValue:'',
+      vipStatusFrom: {
+        name: "",
+        num: "",
+        dynamicTags: [],
+        isAdd: true,
+        id: "",
+      }, // 弹窗内容
+      inputVisible: false,
+    };
+  },
+  mounted() {
+    this.getVipGroupCategoryList();
+  },
+  methods: {
+    resetGroupCategory(row) {
+      // 修改课程形式
+      const vipStatusFrom = this.vipStatusFrom;
+      this.vipStatus = true;
+      this.$nextTick(() => {
+        vipStatusFrom.name = row.name;
+        vipStatusFrom.timer = row.singleClassMinutes.split(",");
+        vipStatusFrom.dynamicTags = row.singleClassMinutes.split(",");
+        vipStatusFrom.num = row.studentNum;
+        vipStatusFrom.id = row.id;
+        vipStatusFrom.isAdd = false;
+      });
+    },
+    async removeGroupCategory(scope) {
+      await removeVipGroupCategory({
+        id: scope.row.id,
+      }).then((res) => {
+        if (res.code == 200) {
+            scope._self.$refs[scope.row.id].doClose()
+          this.$message.success("删除成功");
+          this.getVipGroupCategoryList();
+        }
+      });
+    },
+    // 新增分类
+    addGroupCategory() {
+      this.vipStatus = true;
+      this.vipStatusFrom.isAdd = true;
+    },
+    showInput() {
+      this.inputVisible = true;
+      this.$nextTick((_) => {
+        this.$refs.saveTagInput.$refs.input.focus();
+      });
+    },
+    onVipStatusClose(formName) {
+      this.inputVisible = false;
+      this.inputValue = "";
+      this.$refs[formName].resetFields();
+    },
+    async getVipGroupCategoryList() {
+      // 获取默认左边参数
+      await vipGroupCategory().then((res) => {
+        if (res.code == 200) {
+          this.leftList = res.data;
+        }
+      });
+    },
+    addVipStatus(formName) {
+      // 点击添加后 发送请求单独添加=> 刷新列表
+      // 判断是添加还是修改
+      this.$refs[formName].validate(async (valid) => {
+        console.log(valid);
+        if (valid) {
+          const vipStatusFrom = this.vipStatusFrom;
+          if (vipStatusFrom.isAdd) {
+            await addVipGroupCategory({
+              name: vipStatusFrom.name,
+              singleClassMinutes: vipStatusFrom.dynamicTags.join(","),
+              studentNum: vipStatusFrom.num,
+            }).then((res) => {
+              if (res.code == 200) {
+                this.$message.success("添加成功");
+                this.getVipGroupCategoryList();
+                this.vipStatus = false;
+              }
+            });
+          } else {
+            await resetVipGroupCategory({
+              name: vipStatusFrom.name,
+              singleClassMinutes: vipStatusFrom.dynamicTags.join(","),
+              studentNum: vipStatusFrom.num,
+              id: vipStatusFrom.id,
+            }).then((res) => {
+              this.$message.success("修改成功");
+              this.getVipGroupCategoryList();
+              this.vipStatus = false;
+            });
+          }
+        }
+      });
+    },
+    handleInputConfirm() {
+      let inputValue = this.inputValue;
+      if (inputValue) {
+        this.vipStatusFrom.dynamicTags.push(inputValue);
+      }
+      this.inputVisible = false;
+      this.inputValue = "";
+    },
+    handleClose(tag) {
+      this.vipStatusFrom.dynamicTags.splice(
+        this.vipStatusFrom.dynamicTags.indexOf(tag),
+        1
+      );
+    },
+  },
+};
+</script>
+<style lang="scss" scoped>
+</style>

+ 25 - 371
src/views/categroyManager/generalSettings/vipParameterManager.vue

@@ -1,388 +1,42 @@
 <template>
   <div class="m-container">
     <h2>
-      <div class="squrt"></div> VIP参数设置
+      <div class="squrt"></div>
+      VIP参数设置
     </h2>
     <div class="m-core">
-      <div class="listWrap">
-        <div class="left">
-          <div class="newBand" v-permission="'vipGroupCategory/add'"
-               @click="addGroupCategory">新建</div>
-          <el-table :data='leftList'
-                    :header-cell-style="{background:'#EDEEF0',color:'#444'}">
-            <el-table-column label="课程形式"
-                             prop="name"
-                             width="180">
-            </el-table-column>
-            <el-table-column label="班级人数"
-                             prop="studentNum"
-                             width="180">
-            </el-table-column>
-            <el-table-column label="课程课时"
-                             prop="singleClassMinutes"
-                             width="180">
-            </el-table-column>
-            <el-table-column label="操作"
-                             width="180">
-              <template slot-scope="scope">
-                <div>
-                  <el-button type="text" v-permission="'vipGroupCategory/update'"
-                             @click="resetGroupCategory(scope.row)">修改</el-button>
-                  <el-popover placement="top"
-                              width="160"
-                              v-permission="'vipGroupCategory/delete'"
-                              :ref="scope.row.id">
-                    <p>您确定删除该课程形态吗?</p>
-                    <div style="text-align: right; margin: 0">
-                      <el-button size="mini"
-                                 type="text"
-                                 @click="scope._self.$refs[scope.row.id].doClose()">取消</el-button>
-                      <el-button type="primary"
-                                 size="mini"
-                                 @click="removeGroupCategory(scope)">确定</el-button>
-                    </div>
-                    <el-button type="text"
-                               slot="reference">删除</el-button>
-                  </el-popover>
-
-                </div>
-              </template>
-            </el-table-column>
-          </el-table>
-        </div>
-        <div class="right">
-          <div class="newBand" v-permission="'vipGroupDefaultClassesCycle/add'"
-               @click="addVipTimer">新建</div>
-          <el-table :data='rightList'
-                    :header-cell-style="{background:'#EDEEF0',color:'#444'}">
-            <el-table-column label="达到课时总数/次"
-                             prop="maxClassTimes"
-                             width="180">
-            </el-table-column>
-            <el-table-column label="可排课时间段"
-                             prop="month"
-                             width="180">
-            </el-table-column>
-            <el-table-column label="操作"
-                             width="180">
-              <template slot-scope="scope">
-                <div>
-                  <el-button type="text" v-permission="'vipGroupDefaultClassesCycle/update'"
-                             @click="resetTimerList(scope.row)">修改</el-button>
-                  <el-popover placement="top"
-                              width="160"
-                              v-permission="'vipGroupDefaultClassesCycle/delete'"
-                              :ref="scope.row.id">
-                    <p>您确定删除该周期循环吗?</p>
-                    <div style="text-align: right; margin: 0">
-                      <el-button size="mini"
-                                 type="text"
-                                 @click="scope._self.$refs[scope.row.id].doClose()">取消</el-button>
-                      <el-button type="primary"
-                                 size="mini"
-                                 @click="removeDefaultClassesCycle(scope)">确定</el-button>
-                    </div>
-                    <el-button type="text"
-                               slot="reference">删除</el-button>
-                  </el-popover>
-
-                </div>
-              </template>
-            </el-table-column>
-          </el-table>
-        </div>
-      </div>
+      <location-hash v-model="activeIndex" @change="handleClick">
+        <el-tabs v-model.trim="activeIndex" type="card" @tab-click="handleClick">
+          <el-tab-pane lazy label="课程形式" name="1">
+            <vipCourseType />
+          </el-tab-pane>
+          <el-tab-pane lazy label="周期循环" name="2">
+            <vipCourseTimeSet />
+          </el-tab-pane>
+        </el-tabs>
+      </location-hash>
     </div>
-
-    <!-- 课程类型新增弹窗 -->
-    <el-dialog title="vip课程形式"
-               class="courseMask"
-               width="500px"
-               :visible.sync="vipStatus">
-      <el-form :model="vipStatusFrom"
-               ref='vipStatus'>
-        <el-form-item label="课程形式"
-                      prop='name'
-                      :label-width="formLabelWidth">
-          <el-input v-model.trim="vipStatusFrom.name"
-                    autocomplete="off"></el-input>
-        </el-form-item>
-        <el-form-item label="班级人数"
-                      prop="num"
-                      :label-width="formLabelWidth">
-          <el-input v-model.trim="vipStatusFrom.num"
-                    autocomplete="off"></el-input>
-        </el-form-item>
-        <el-form-item label="课程课时"
-                      prop="timer"
-                      :label-width="formLabelWidth">
-          <!-- <el-input v-model.trim="vipStatusFrom.timer" 
-                    autocomplete="off"></el-input> -->
-          <el-tag :key="index"
-                  effect="dark"
-                  type="info"
-                  v-for="(tag, index) in dynamicTags"
-                  closable
-                  :disable-transitions="false"
-                  @close="handleClose(tag)">
-            {{tag}}
-          </el-tag>
-          <el-input class="input-new-tag"
-                    v-if="inputVisible"
-                    v-model.trim="inputValue"
-                    ref="saveTagInput"
-                    style="width:100px;"
-                    size="small"
-                    @keyup.enter.native="handleInputConfirm">
-          </el-input>
-          <el-button v-if="!inputVisible"
-                     class="button-new-tag"
-                     size="small"
-                     @click="showInput">+ 添加</el-button>
-          <el-button v-if="inputVisible"
-                     class="button-new-tag"
-                     size="small"
-                     @click="handleInputConfirm">保存</el-button>
-        </el-form-item>
-      </el-form>
-      <div slot="footer"
-           class="dialog-footer">
-        <el-button @click="closeVipStatus">取 消</el-button>
-        <el-button type="primary"
-                   @click="addVipStatus">确 定</el-button>
-      </div> 
-    </el-dialog>
-
-    <!-- 周期循环新增弹窗 -->
-    <el-dialog title="vip时间段"
-               width="500px"
-               :visible.sync="timerStatus">
-      <el-form :model="vipTimerFrom"
-               ref='timerStatus'>
-        <el-form-item label="达到课时总数/次"
-                      prop='count'
-                      :label-width="formLabelWidth">
-          <el-input v-model.trim="vipTimerFrom.count"
-                    autocomplete="off"></el-input>
-        </el-form-item>
-        <el-form-item label="可排课时间段/月"
-                      prop="timer"
-                      :label-width="formLabelWidth">
-          <el-input v-model.trim="vipTimerFrom.timer"
-                    autocomplete="off"></el-input>
-        </el-form-item>
-      </el-form>
-      <div slot="footer"
-           class="dialog-footer">
-        <el-button @click="timerStatus=false">取 消</el-button>
-        <el-button type="primary"
-                   @click="addTimerStatus">确 定</el-button>
-      </div>
-    </el-dialog>
   </div>
 </template>
 <script>
-import { vipGroupCategory, getDefaultClassesCycle, addVipGroupCategory, resetVipGroupCategory, removeVipGroupCategory, addDefaultClassesCycle, resetDefaultClassesCycle, removeDefaultClassesCycle } from "@/api/vipSeting"
+import vipCourseType from "./vipCourseType";
+import vipCourseTimeSet from "./vipCourseTimeSet";
 export default {
-  name: 'vipParameterManager',
-  data () {
+  name: "vipParameterManager",
+  components: { vipCourseType, vipCourseTimeSet },
+  data() {
+    const query = this.$route.query
     return {
-      leftList: [],
-      rightList: [],
-      vipStatus: false, // 课程形态弹窗状态
-      formLabelWidth: '120px',
-      vipStatusFrom: {
-        name: '',
-        num: '',
-        timer: [],
-        isAdd: true,
-        id: ''
-      }, // 弹窗内容
-      statusRemovevisible: false,
-      timerStatus: false, //课程时间段弹窗状态
-      vipTimerFrom: {
-        count: '',
-        timer: '',
-        isAdd: true,
-        id: ''
-      },
-      dynamicTags: [],
-      inputVisible: false,
-      inputValue: ''
-    }
-  },
-  mounted () {
-    this.getVipGroupCategoryList()
-    this.getDefaultClassesCycle()
+      activeIndex: query.opt || "1",
+    };
   },
+  mounted() {},
   methods: {
-    handleClose (tag) {
-      this.dynamicTags.splice(this.dynamicTags.indexOf(tag), 1);
-    },
-
-    showInput () {
-      this.inputVisible = true;
-      this.$nextTick(_ => {
-        this.$refs.saveTagInput.$refs.input.focus();
-      });
-    },
-
-    handleInputConfirm () {
-      let inputValue = this.inputValue;
-      if (inputValue) {
-        this.dynamicTags.push(inputValue);
-      }
-      this.inputVisible = false;
-      this.inputValue = '';
-    },
-    getVipGroupCategoryList () {
-      // 获取默认左边参数
-      vipGroupCategory().then(res => {
-        if (res.code == 200) {
-          this.leftList = res.data;
-        }
-      })
-    },
-    getDefaultClassesCycle () {
-      // 获取默认右边参数
-      getDefaultClassesCycle().then(res => {
-        this.rightList = res.data;
-      })
-    },
-    // 新增分类
-    addGroupCategory () {
-      this.vipStatus = true;
-      this.vipStatusFrom.isAdd = true;
-      this.vipStatusFrom.id = '';
-      this.vipStatusFrom.name = ''
-      this.vipStatusFrom.num = ''
-      this.dynamicTags = [];
-    },
-    closeVipStatus () {
-      this.vipStatus = false;
-    },
-    addVipStatus () {
-      // 点击添加后 发送请求单独添加=> 刷新列表
-      // 判断是添加还是修改
-      if (this.vipStatusFrom.isAdd) {
-        // 添加
-        if (this.vipStatusFrom.name && this.vipStatusFrom.num && this.dynamicTags.length > 0) {
-          addVipGroupCategory({
-            name: this.vipStatusFrom.name,
-            singleClassMinutes: this.dynamicTags.join(','),
-            studentNum: this.vipStatusFrom.num
-          }).then(res => {
-            if (res.code == 200) {
-              this.getVipGroupCategoryList();
-              this.vipStatus = false;
-            }
-          })
-        } else {
-          this.$message.error('请填写参数')
-          return
-        }
-
-      } else {
-        // 修改
-        resetVipGroupCategory({
-          name: this.vipStatusFrom.name,
-          singleClassMinutes: this.dynamicTags.join(','),
-          studentNum: this.vipStatusFrom.num,
-          id: this.vipStatusFrom.id
-        }).then(res => {
-          this.getVipGroupCategoryList();
-          this.vipStatus = false;
-        })
-      }
-    },
-    resetGroupCategory (row) {
-      // 修改课程形式
-      this.vipStatus = true;
-      this.vipStatusFrom.name = row.name;
-
-      this.vipStatusFrom.timer = row.singleClassMinutes.split(',');
-      this.dynamicTags = row.singleClassMinutes.split(',');
-      this.vipStatusFrom.num = row.studentNum;
-      this.vipStatusFrom.id = row.id;
-      this.vipStatusFrom.isAdd = false;
-    },
-    removeGroupCategory (scope) {
-      // 删除 
-      removeVipGroupCategory({
-        id: scope.row.id
-      }).then(res => {
-        if (res.code == 200) {
-          // scope._self.$refs[scope.$index].doClose();
-          this.getVipGroupCategoryList();
-        }
-      })
-    },
-    // 新增时间段
-    addVipTimer () {
-      this.timerStatus = true;
-      this.vipTimerFrom.isAdd = true;
-      this.vipTimerFrom.id = '';
-    },
-    addTimerStatus () {
-      // 点击添加后 发送请求单独添加=> 刷新列表
-      // 判断是添加还是修改
-      if (this.vipTimerFrom.isAdd) {
-        // 添加
-        addDefaultClassesCycle({
-          organId: null,
-          maxClassTimes: this.vipTimerFrom.count,
-          month: this.vipTimerFrom.timer,
-        }).then(res => {
-          if (res.code == 200) {
-            this.getDefaultClassesCycle();
-            this.timerStatus = false;
-          }
-        })
-      } else {
-        // 修改
-        resetDefaultClassesCycle({
-          maxClassTimes: this.vipTimerFrom.count,
-          month: this.vipTimerFrom.timer,
-          id: this.vipTimerFrom.id
-        }).then(res => {
-          this.getDefaultClassesCycle();
-          this.timerStatus = false;
-        })
-      }
-    },
-    resetTimerList (row) {
-      this.timerStatus = true;
-      this.vipTimerFrom.count = row.maxClassTimes;
-      this.vipTimerFrom.timer = row.month;
-      this.vipTimerFrom.id = row.id;
-      this.vipTimerFrom.isAdd = false;
-    },
-    // 删除时间管理
-    removeDefaultClassesCycle (scope) {
-      removeDefaultClassesCycle({
-        id: scope.row.id
-      }).then(res => {
-        if (res.code == 200) {
-          scope._self.$refs[scope.row.id].doClose()
-          this.getDefaultClassesCycle();
-        }
-      })
+    handleClick(val) {
+      this.activeIndex = val.name;
     },
   },
-  watch: {
-    vipStatus (val) {
-      if (!val) {
-        this.$refs['vipStatus'].resetFields();
-      }
-    },
-    timerStatus (val) {
-      if (!val) {
-        this.$refs['timerStatus'].resetFields();
-      }
-    }
-  }
-
-}
+};
 </script>
 <style lang="scss" scoped>
 .left {
@@ -400,4 +54,4 @@ export default {
     margin-right: 4px;
   }
 }
-</style>
+</style>

+ 50 - 74
src/views/categroyManager/insideSetting/branchActive.vue

@@ -4,58 +4,58 @@
       <div class="squrt"></div>VIP分部活动列表
     </h2>
     <div class="m-core">
-      <div @click="openActive('create')"
-           v-permission="'/branchActiveOperationAdd'"
-           class='newBand'>新建</div>
+      <el-button type="primary" @click="openActive('create')" style="margin-bottom: 20px"
+           v-permission="'/branchActiveOperationAdd'" >新建</el-button>
       <!-- 搜索类型 -->
-      <el-form :inline="true"
-               class="searchForm"
+      <save-form :inline="true"
+               ref="searchForm"
                @submit.native.prevent
-               v-model.trim="searchForm">
-        <el-form-item>
+               @submit="onSearch"
+               @reset="onReset"
+               :model.sync="searchForm">
+        <el-form-item prop="search">
           <el-input type="text"
                     v-model.trim="searchForm.search"
                     @keyup.enter.native='getList'
                     placeholder="分部活动名"></el-input>
         </el-form-item>
-        <el-form-item>
+        <el-form-item prop="rewardMode">
           <el-select v-model.trim="searchForm.rewardMode"
                      clearable
-                     filterable
                      placeholder="分部活动类型">
-            <el-option label="累计奖励"
-                       value="PER"></el-option>
-            <el-option label="阶梯奖励"
-                       value="STAIR"></el-option>
+            <el-option v-for="(item,index) in rewardModeTypeList"
+                       :key="index"
+                       :label="item.label"
+                       :value="item.value"></el-option>
           </el-select>
         </el-form-item>
-        <el-form-item>
+        <el-form-item prop="teacherId">
           <el-select v-model.trim="searchForm.teacherId"
                      clearable
                      filterable
                      placeholder="适用老师">
-            <el-option v-for="item in teacherList"
-                       :key="item.value"
-                       :label="item.label"
-                       :value="item.value"></el-option>
+            <el-option v-for="item in selects.teachers"
+                       :key="item.id"
+                       :label="item.realName"
+                       :value="item.id"></el-option>
           </el-select>
         </el-form-item>
-        <el-form-item>
+        <el-form-item prop="vipGroupCategoryId">
           <el-select v-model.trim="searchForm.vipGroupCategoryId"
                      filterable
                      clearable
                      placeholder="课程类型">
-            <el-option v-for="item in vipGroupCategoryList"
-                       :key="item.value"
-                       :label="item.label"
-                       :value="item.value"></el-option>
+            <el-option v-for="item in selects.vipGroupCategory"
+                       :key="item.id"
+                       :label="item.name"
+                       :value="item.id"></el-option>
           </el-select>
         </el-form-item>
         <el-form-item>
-          <el-button @click="getList"
-                     type="danger">搜索</el-button>
+          <el-button native-type="submit" type="danger">搜索</el-button>
+          <el-button native-type="reset" type="primary">重置</el-button>
         </el-form-item>
-      </el-form>
+      </save-form>
       <!-- 列表 -->
       <div class="tableWrap">
         <el-table :data='tableList'
@@ -68,7 +68,7 @@
                            prop='rewardMode'
                            label="分部活动类型">
             <template slot-scope="scope">
-              {{ scope.row.rewardMode == 'PER' ? '累计奖励' : '阶梯奖励' }}
+              {{ scope.row.rewardMode | rewardModeTypeFormat }}
             </template>
           </el-table-column>
           <el-table-column align='center'
@@ -95,24 +95,23 @@
         <pagination :total="pageInfo.total"
                     :page.sync="pageInfo.page"
                     :limit.sync="pageInfo.limit"
+                    :sync="true"
                     :page-sizes="pageInfo.page_size"
                     @pagination="getList" />
       </div>
     </div>
-
   </div>
 </template>
 <script>
 import pagination from '@/components/Pagination/index'
 import { courseScheduleRewards } from '@/api/systemManage'
-import { vipGroupCategory } from "@/api/vipSeting"
-import { getTeacher } from '@/api/buildTeam'
-import store from '@/store'
+import { rewardModeTypeList } from "@/utils/searchArray";
 export default {
   name: 'branchActive',
   components: { pagination },
   data () {
     return {
+      rewardModeTypeList,
       searchForm: {
         search: null,
         rewardMode: null,
@@ -120,10 +119,7 @@ export default {
         teacherId: null,
       },
       organId: null,
-      searchLsit: [],
       tableList: [],
-      vipGroupCategoryList: [],
-      teacherList: [],
       pageInfo: {
         // 分页规则
         limit: 10, // 限制显示条数
@@ -134,46 +130,16 @@ export default {
 
     }
   },
-  created () {
-    if (this.$route.query.searchForm) {
-      this.$route.query.searchForm instanceof Object ? this.searchForm = this.$route.query.searchForm : this.searchForm = JSON.parse(this.$route.query.searchForm);
-    }
-    if (this.$route.query.rules) {
-      this.$route.query.rules instanceof Object ? this.pageInfo = this.$route.query.rules : this.pageInfo = JSON.parse(this.$route.query.rules);
-    }
-  },
-  activated () {
-    this.getList()
-    this.__init()
-  },
   mounted () {
     this.getList() // 获取列表数据
     this.__init()
-
   },
   methods: {
     async __init () {
-      let vipGroupCategoryList = await vipGroupCategory({ page: 1, rows: 9999 })
-      if (vipGroupCategoryList.code == 200) {
-        this.vipGroupCategoryList = []
-        vipGroupCategoryList.data.forEach(item => {
-          this.vipGroupCategoryList.push({
-            label: item.name,
-            value: item.id
-          })
-        })
-      }
+      // 获取类型
+      this.$store.dispatch('setVipGroupCategory')
 
-      let teacherList = await getTeacher()
-      if (teacherList.code == 200) {
-        this.teacherList = []
-        teacherList.data.forEach(item => {
-          this.teacherList.push({
-            label: item.realName,
-            value: item.id
-          })
-        })
-      }
+      this.$store.dispatch('setTeachers')
     },
     getList () {
       let params = this.searchForm
@@ -187,23 +153,33 @@ export default {
       })
     },
     openActive (type, row) {
-      let pageInfo = JSON.stringify(this.pageInfo)
-      let searchForm = JSON.stringify(this.searchForm)
       let params = {
         path: '/vipClassSet/branchActiveOperation',
         query: {
-          type: type,
-          searchForm,
-          pageInfo
-        }
+          type: type
+        },
       }
+      let tagTitle = '新建'
       if (row) {
         params.query.id = row.id
+        tagTitle = '修改'
       }
-      this.$router.push(params)
+      this.$router.push(params, (route) => {
+        route.meta.title = tagTitle + 'VIP分部活动'
+      })
     },
     onFormClose (formName) { // 关闭弹窗重置验证
       this.$refs[formName].clearValidate()
+    },
+    onSearch() {
+      this.$refs.searchForm.validate(valid => {
+        this.pageInfo.page = 1
+        this.getList()
+      })
+    },
+    onReset() {
+      this.$refs.searchForm.resetFields()
+      this.onSearch()
     }
   }
 }

+ 41 - 97
src/views/categroyManager/insideSetting/branchActiveOperation.vue

@@ -73,10 +73,10 @@
                      clearable
                      multiple
                      placeholder="请选择">
-            <el-option v-for="item in vipGroupCategoryList"
-                       :key="item.value"
-                       :label="item.label"
-                       :value="item.value.toString()"> </el-option>
+            <el-option v-for="item in selects.vipGroupCategory"
+                       :key="item.id"
+                       :label="item.name"
+                       :value="item.id.toString()"> </el-option>
           </el-select>
         </el-form-item>
 
@@ -89,10 +89,10 @@
                      @change="onSubjectChange('search')"
                      v-model.trim="result.organId"
                      placeholder="请选择">
-            <el-option v-for="item in branchList"
-                       :key="item.value"
-                       :label="item.label"
-                       :value="item.value.toString()"> </el-option>
+            <el-option v-for="item in selects.branchs"
+                       :key="item.id"
+                       :label="item.name"
+                       :value="item.id.toString()"> </el-option>
           </el-select>
         </el-form-item>
 
@@ -106,15 +106,10 @@
                      @change="onSubjectChange('search')"
                      v-model.trim="result.subjectIds"
                      placeholder="请选择">
-            <el-option-group v-for="(group, index) in subjectTreeList"
-                             :key="index"
-                             :label="group.label">
-              <el-option v-for="(item, i) in group.options"
+            <el-option v-for="(item, i) in selects.subjects"
                          :key="i"
-                         :label="item.label"
-                         :value="item.value.toString()">
-              </el-option>
-            </el-option-group>
+                         :label="item.name"
+                         :value="item.id.toString()"></el-option>
           </el-select>
         </el-form-item>
 
@@ -144,7 +139,6 @@
   </div>
 </template>
 <script>
-import store from '@/store'
 import { getEmployeeOrgan, getSoundTree } from '@/api/buildTeam'
 import { courseScheduleRewardsQuery, getUserRole, courseScheduleRewardsAdd, courseScheduleRewardsUpdate, findTeacherByOrganId } from '@/api/systemManage'
 import { vipGroupCategory } from "@/api/vipSeting"
@@ -155,12 +149,7 @@ export default {
       organId: null,
       pageType: this.$route.query.type,
       id: this.$route.query.id,
-      pageInfo: this.$route.query.pageInfo,
-      searchForm: this.$route.query.searchForm,
-      branchList: [],
       teacherList: [], // 老师列表
-      subjectTreeList: [], // 声部列表
-      vipGroupCategoryList: [],
       result: {
         name: null,
         rewardMode: null,
@@ -189,91 +178,46 @@ export default {
     }
   },
   mounted () {
-    this.pageType = this.$route.query.type
-    this.id = this.$route.query.id
-    this.pageInfo = this.$route.query.pageInfo
-    this.searchForm = this.$route.query.searchForm
-    this.__init()
-  },
-  activated () {
-    this.pageType = this.$route.query.type
-    this.id = this.$route.query.id
-    this.pageInfo = this.$route.query.pageInfo
-    this.searchForm = this.$route.query.searchForm
     this.__init()
   },
   methods: {
     async __init () {
       this.$refs.form.resetFields()
-      let vipGroupCategoryList = await vipGroupCategory({ page: 1, rows: 9999 })
-      if (vipGroupCategoryList.code == 200) {
-        this.vipGroupCategoryList = []
-        vipGroupCategoryList.data.forEach(item => {
-          this.vipGroupCategoryList.push({
-            label: item.name,
-            value: item.id
-          })
-        })
-      }
-
-      let branchList = await getEmployeeOrgan({ delFlag: 0, rows: 9999 })
-      if (branchList.code == 200) {
-        this.branchList = []
-        branchList.data.forEach(item => {
-          let tempArr = {}
-          tempArr = {
-            label: item.name,
-            value: item.id
-          }
-          this.branchList.push(tempArr)
-        })
-      }
-
-      let subjectTree = await getSoundTree({ delFlag: 0, rows: 9999 })
-      if (subjectTree.code == 200) {
-        let subjectResult = subjectTree.data
-        subjectResult.rows.forEach(element => {
-          let tempElement = {}
-          tempElement = { label: element.name, options: [] }
-          // 判断子级声部是否为空
-          if (element.subjects) {
-            element.subjects.forEach(subject => {
-              tempElement.options.push({
-                value: subject.id,
-                label: subject.name
-              })
-            })
-          }
-          this.subjectTreeList.push(tempElement)
-        })
-      }
+      // 获取类型
+      this.$store.dispatch('setVipGroupCategory')
+      // 获取分部
+      this.$store.dispatch('setBranchs')
+      // 获取声部
+      this.$store.dispatch('setSubjects')
 
       if (this.pageType == 'update') {
         let courseScheduleRewards = await courseScheduleRewardsQuery({ id: this.id })
         if (courseScheduleRewards.code == 200) {
           let data = courseScheduleRewards.data
-          this.result.organId = data.organId
-          this.result.subjectIds = data.subjectIds ? data.subjectIds.split(',') : data.subjectIds
-          this.onSubjectChange('update')
-          this.result = {
-            id: data.id,
-            name: data.name,
-            rewardMode: data.rewardMode,
-            organId: data.organId,
-            subjectIds: data.subjectIds ? data.subjectIds.split(',') : data.subjectIds,
-            vipGroupCategoryIdList: data.vipGroupCategoryIdList ? data.vipGroupCategoryIdList.split(',') : data.vipGroupCategoryIdList,
-            teacherId: data.teacherId ? data.teacherId.split(',') : data.teacherId,
-            courseScheduleType: data.courseScheduleType,
-            domains: data.rewardsRulesJson ?
-              JSON.parse(data.rewardsRulesJson) : [{
-                min: null,
-                max: null,
-                money: null,
-                disabled: false,
-                key: Date.now()
-              }],
-            errorText: null
-          }
+          this.$nextTick(() => {
+            this.result.organId = data.organId
+            this.result.subjectIds = data.subjectIds ? data.subjectIds.split(',') : data.subjectIds
+            this.onSubjectChange('update')
+            this.result = {
+              id: data.id,
+              name: data.name,
+              rewardMode: data.rewardMode,
+              organId: data.organId,
+              subjectIds: data.subjectIds ? data.subjectIds.split(',') : data.subjectIds,
+              vipGroupCategoryIdList: data.vipGroupCategoryIdList ? data.vipGroupCategoryIdList.split(',') : data.vipGroupCategoryIdList,
+              teacherId: data.teacherId ? data.teacherId.split(',') : data.teacherId,
+              courseScheduleType: data.courseScheduleType,
+              domains: data.rewardsRulesJson ?
+                JSON.parse(data.rewardsRulesJson) : [{
+                  min: null,
+                  max: null,
+                  money: null,
+                  disabled: false,
+                  key: Date.now()
+                }],
+              errorText: null
+            }
+          })
         }
       } else {
         this.resetForm()

+ 36 - 25
src/views/categroyManager/vipActiveList.vue

@@ -6,17 +6,13 @@
     </h2>
 
     <div class="m-core">
-      <div
-        class="newBand"
-        v-permission="'/vipNewActive'"
-        @click="gotoNewActive"
-      >
-        新建
-      </div>
-      <el-form
+      <el-button type="primary" style="margin-bottom: 20px" v-permission="'/vipNewActive'" @click="gotoNewActive">新建</el-button>
+      <save-form
         :inline="true"
         class="searchForm"
         ref="searchForm"
+        @submit="search"
+        @reset="onReset"
         :model="searchForm"
       >
         <el-form-item prop="search">
@@ -56,12 +52,12 @@
           </el-select>
         </el-form-item>
         <el-form-item>
-          <el-button @click="search" type="danger">搜索</el-button>
+          <el-button native-type="submit" type="danger">搜索</el-button>
         </el-form-item>
         <el-form-item>
-          <el-button type="primary" @click="onReset">重置</el-button>
+          <el-button type="primary" native-type="reset">重置</el-button>
         </el-form-item>
-      </el-form>
+      </save-form>
       <div class="tableWrap">
         <el-table
           :data="tableList"
@@ -178,8 +174,8 @@
       </div>
     </div>
     <el-dialog
-      title="活动详情"
-      width="60%"
+      title="修改VIP活动"
+      width="650px"
       :before-close="closeVipform"
       :visible.sync="dialogVisible"
     >
@@ -191,17 +187,17 @@
           :rules="resetFormRules"
           class="vipform"
         >
-          <el-form-item label="活动名称" prop="name">
+          <el-form-item label="活动名称" label-width="120px" prop="name">
             <el-input
               style="width: 400px"
               v-model.trim="resetForm.name"
             ></el-input>
           </el-form-item>
-          <el-form-item label="适用分部" prop="organ">
+          <el-form-item label="适用分部" label-width="120px" prop="organ">
             <el-select
               v-model.trim="resetForm.organ"
-              disabled
               filterable
+              disabled
               multiple
               clearable
             >
@@ -214,13 +210,13 @@
             </el-select>
             <!-- <el-button @click="onCheckAllBranch">适用所有分部</el-button> -->
           </el-form-item>
-          <el-form-item label="课程形式" prop="stauts">
+          <el-form-item label="课程形式" label-width="120px" prop="stauts">
             <el-select
               v-model.trim="resetForm.stauts"
-              disabled
               filterable
               clearable
               multiple
+              disabled
             >
               <el-option
                 v-for="(item, index) in courseStatusList"
@@ -230,7 +226,7 @@
               ></el-option>
             </el-select>
           </el-form-item>
-          <el-form-item label="活动描述" prop="desc">
+          <el-form-item label="活动描述" label-width="120px" prop="desc">
             <el-input
               type="textarea"
               v-model.trim="resetForm.desc"
@@ -239,9 +235,10 @@
               placeholder="请输入活动说明"
             ></el-input>
           </el-form-item>
-          <el-form-item label="活动时间" prop="activeTime">
+          <el-form-item label="活动时间" label-width="120px" prop="activeTime">
             <el-date-picker
               v-model.trim="resetForm.activeTime"
+              style="width: 100%"
               type="datetimerange"
               range-separator="至"
               value-format="yyyy-MM-dd HH:mm:ss"
@@ -252,9 +249,10 @@
               end-placeholder="结束日期"
             ></el-date-picker>
           </el-form-item>
-          <el-form-item label="课程时间" prop="courseTime">
+          <el-form-item label="课程时间" label-width="120px" prop="courseTime">
             <el-date-picker
               v-model.trim="resetForm.courseTime"
+              style="width: 100%"
               type="datetimerange"
               :picker-options="{
                 firstDayOfWeek: 1,
@@ -266,10 +264,16 @@
             ></el-date-picker>
           </el-form-item>
         </el-form>
+        <el-alert
+          title="活动适用范围&结算标准"
+          type="info"
+          :closable="false"
+          class="alert">
+        </el-alert>
         <div class="activeRange">
-          <div class="left">
+          <!-- <div class="left">
             <p>活动适用范围&结算标准:</p>
-          </div>
+          </div> -->
           <div class="right">
             <div class="chioseWrap">
               <el-checkbox label="线上课" v-model.trim="online"></el-checkbox>
@@ -362,10 +366,17 @@
             </div>
           </div>
         </div>
+        <el-alert
+          title="活动类型"
+          type="info"
+          :closable="false"
+          style="margin-bottom: 15px;"
+          class="alert">
+        </el-alert>
         <div class="activeType">
-          <div class="left">
+          <!-- <div class="left">
             <p style="width: 60px">活动类型</p>
-          </div>
+          </div> -->
           <div class="right">
             <div>
               <div

+ 25 - 27
src/views/categroyManager/vipChargeSeting.vue

@@ -4,37 +4,37 @@
       <div class="squrt"></div>VIP课程收费设置
     </h2>
     <div class="m-core">
-      <el-form :inline="true"
+      <save-form :inline="true"
+               ref="searchForm"
                class="searchForm"
-               v-model.trim="searchForm">
+               @submit="search"
+               :model.sync="searchForm">
         <el-form-item prop='organId'>
           <el-select class='multiple'
                      style="width:180px!important"
                      v-model.trim="searchForm.organId"
                      filterable
                      placeholder="请选择分部">
-            <el-option v-for="(item,index) in organList"
+            <el-option v-for="(item,index) in selects.branchs"
                        :key="index"
                        :label="item.name"
                        :value="item.id"></el-option>
           </el-select>
         </el-form-item>
         <el-form-item>
-          <el-button @click="search"
-                     type="danger">搜索</el-button>
+          <el-button native-type="submit"
+                     type="primary">搜索</el-button>
         </el-form-item>
-      </el-form>
+      </save-form>
       <div class="tableWrap">
         <el-table :data="dataList"
-                  style="width:720px;"
+                  style="width:100% !important;"
                   :header-cell-style="{background:'#EDEEF0',color:'#444'}">
           <el-table-column prop="name"
-                           label="课程形式"
-                           width="180">
+                           label="课程形式">
           </el-table-column>
           <el-table-column prop="onlineClassesUnitPrice"
-                           label="线上课单价"
-                           width="180">
+                           label="线上课单价">
             <template slot-scope="scope">
               <div>
                 <el-input v-model.trim="scope.row.onlineClassesUnitPrice"></el-input>
@@ -42,16 +42,14 @@
             </template>
           </el-table-column>
           <el-table-column prop="offlineClassesUnitPrice"
-                           label="线下课单价"
-                           width="180">
+                           label="线下课单价">
             <template slot-scope="scope">
               <div>
                 <el-input v-model.trim="scope.row.offlineClassesUnitPrice"></el-input>
               </div>
             </template>
           </el-table-column>
-          <el-table-column label="操作"
-                           width="180">
+          <el-table-column label="操作">
             <template slot-scope="scope">
               <div>
                 <el-button type="text" v-permission="'vipGroupDefaultClassesUnitPrice/add'"
@@ -67,6 +65,7 @@
 <script>
 import { vipGroupCategory, defaultClassesUnitPrice } from '@/api/vipSeting'
 import { getEmployeeOrgan } from '@/api/buildTeam'
+import { Searchs } from '@/helpers'
 export default {
   name: 'vipChargeSeting',
   data () {
@@ -78,23 +77,22 @@ export default {
       }
     }
   },
-  mounted () {
+  async mounted () {
     // 获取课程形态 设置vip课酬
-    getEmployeeOrgan().then(res => {
-      if (res.code == 200) {
-        this.organList = res.data;
-        this.searchForm.organId = this.organList[0].id;
-        if (this.organList[0].id) {
-          this.getList();
-        }
-      }
-    })
-    // this.getList();
+    // 获取分部
+    await this.$store.dispatch('setBranchs')
+    // 获取缓存的分部编号
+    const searchs = new Searchs(this.$route.fullPath)
+    const branchId = searchs.searchs[searchs.key]?.form.organId
+    this.searchForm.organId = branchId ? branchId : this.selects?.branchs[0]['id']
+    this.search()
 
   },
   methods: {
     search () {
-      this.getList();
+      this.$refs.searchForm.validate(valid => {
+        this.getList()
+      })
     },
     getList () {
       vipGroupCategory({ organId: this.searchForm.organId }).then(res => {

+ 44 - 28
src/views/categroyManager/vipNewActive.vue

@@ -9,6 +9,7 @@
       <el-form :label-position="labelPosition"
                :model="vipform"
                ref="vipform"
+               label-width="120px"
                :rules="vipformRules"
                class="vipform">
         <el-form-item label="活动名称"
@@ -25,7 +26,7 @@
                      @visible-change="$forceUpdate()"
                      @change="onOrganChange"
                      clearable>
-            <el-option v-for="(item,index) in organList"
+            <el-option v-for="(item,index) in selects.branchs"
                        :key="index"
                        :label="item.name"
                        :value="item.id"></el-option>
@@ -39,7 +40,7 @@
                      @visible-change="$forceUpdate()"
                      clearable
                      multiple>
-            <el-option v-for="item in courseStatusList"
+            <el-option v-for="item in selects.vipGroupCategory"
                        :key="item.id"
                        :value="item.id"
                        :label="item.name"></el-option>
@@ -77,12 +78,17 @@
                           }"
                           end-placeholder="结束日期"></el-date-picker>
         </el-form-item>
-
       </el-form>
-      <div class="activeRange">
-        <div class="left">
+      <el-alert
+        title="活动适用范围&结算标准:"
+        type="info"
+        :closable="false"
+        class="alert">
+      </el-alert>
+      <div class="activeRange" style="padding-left: 120px;">
+        <!-- <div class="left">
           <p>活动适用范围&结算标准:</p>
-        </div>
+        </div> -->
         <div class="right">
           <div class="chioseWrap">
             <el-checkbox label="线上课"
@@ -164,10 +170,17 @@
           </div> -->
         </div>
       </div>
+      <el-alert
+        title="活动类型:"
+        type="info"
+        style="margin-bottom: 15px;"
+        :closable="false"
+        class="alert">
+      </el-alert>
       <div class="activeType">
-        <div class="left">
+        <!-- <div class="left">
           <p>活动类型</p>
-        </div>
+        </div> -->
         <div class="right">
           <div>
             <div class="head"
@@ -217,12 +230,11 @@
         </div>
       </div>
     </div>
-    <div class="btnWrap"
-         style="justify-content:flex-start">
-      <div class="closeBtn"
-           @click="onReSet">重置</div>
-      <div class="okBtn"
-           @click="submitFrom">确定</div>
+    <div class="btnWrap" style="justify-content:flex-start; padding-left: 120px">
+      <el-button type="info" @click="onReSet">重置</el-button>
+      <el-button type="primary" @click="submitFrom">确定</el-button>
+      <!-- <div class="okBtn"
+           @click="submitFrom">确定</div> -->
     </div>
   </div>
 </template>
@@ -234,7 +246,7 @@ export default {
   data () {
     return {
       pageType: '',
-      labelPosition: "left",
+      labelPosition: "right",
       vipform: {
         name: "",
         desc: "",
@@ -297,19 +309,23 @@ export default {
     this.$refs.vipform.resetFields();
   },
 
-  mounted () {
+  async mounted () {
     // 首先获取课程形式
-    vipGroupCategory().then(res => {
-      if (res.code == 200) {
-        this.courseStatusList = res.data;
-      }
-    });
-    // 适用分部
-    getEmployeeOrgan().then(res => {
-      if (res.code == 200) {
-        this.organList = res.data;
-      }
-    });
+    // vipGroupCategory().then(res => {
+    //   if (res.code == 200) {
+    //     this.courseStatusList = res.data;
+    //   }
+    // });
+    // // 适用分部
+    // getEmployeeOrgan().then(res => {
+    //   if (res.code == 200) {
+    //     this.organList = res.data;
+    //   }
+    // });
+    // 获取类型
+    await this.$store.dispatch('setVipGroupCategory')
+    // 获取分部
+    await this.$store.dispatch('setBranchs')
     this.onReSet()
     // if (this.$route.query.rules) {
     //   this.rules = this.$route.query.rules;
@@ -430,7 +446,7 @@ export default {
       // 选择所有分部
       let vipform = this.vipform
       vipform.organ = [];
-      this.organList.forEach(item => {
+      this.selects.branchs.forEach(item => {
         vipform.organ.push(item.id);
       });
       this.$forceUpdate()

+ 34 - 26
src/views/levelManager/levelManager.vue

@@ -6,18 +6,21 @@
     </h2>
     <div class="m-core">
       <!-- 搜索标题 -->
-      <el-form :inline="true"
+      <save-form :inline="true"
                class="searchForm"
-               v-model.trim="searchForm">
-        <el-form-item>
+               ref='searchForm'
+               @submit="onSearch"
+               @reset="onReSet"
+               :model="searchForm">
+        <el-form-item prop="name">
           <el-input v-model.trim="searchForm.name"
                     placeholder="请输入姓名"></el-input>
         </el-form-item>
-        <el-form-item>
+        <el-form-item prop="orderNo">
           <el-input v-model.trim="searchForm.orderNo"
                     placeholder="请输入订单编号"></el-input>
         </el-form-item>
-        <el-form-item>
+        <el-form-item prop="transNo">
           <el-input v-model.trim="searchForm.transNo"
                     placeholder="请输入交易流水号"></el-input>
         </el-form-item>
@@ -26,7 +29,7 @@
                     @keyup.enter.native="city"
                     placeholder="请输入城市名"></el-input>
         </el-form-item> -->
-        <el-form-item>
+        <el-form-item prop="organId">
           <el-select v-model.trim="searchForm.organId"
                      filterable
                      clearable
@@ -37,7 +40,7 @@
                        :value="item.value"></el-option>
           </el-select>
         </el-form-item>
-        <el-form-item>
+        <el-form-item >
           <el-select class="multiple"
                      v-model.trim="searchForm.status"
                      filterable
@@ -49,7 +52,7 @@
                        label="已缴费"></el-option>
           </el-select>
         </el-form-item>
-        <el-form-item>
+        <el-form-item prop="orderDate">
           <el-date-picker v-model.trim="orderDate"
                           style="width:410px;"
                           type="daterange"
@@ -63,14 +66,14 @@
     }"></el-date-picker>
         </el-form-item>
         <el-form-item>
-          <el-button @click="onSearch"
+          <el-button native-type="submit"
                      type="danger">搜索</el-button>
-          <!-- <el-button @click="onReSet" type="primary">重置</el-button> -->
+          <el-button native-type="reset" type="primary">重置</el-button>
           <el-button @click="onExport"
                      v-permission="'export/degreeRegistration/825'"
                      type="primary">导出</el-button>
         </el-form-item>
-      </el-form>
+      </save-form>
       <div style="font-size: 14px; color: #F85043; padding-bottom: 10px;">
         报考总人数:{{ totalNumber }}人
         <i style="width: 10px; display: inline-block"></i>
@@ -79,7 +82,7 @@
       <div class="tableWrap">
         <el-table :data="tableList"
                   :header-cell-style="{background:'#EDEEF0',color:'#444'}">
-          >
+
           <el-table-column width="90px"
                            align="center"
                            prop="id"
@@ -163,7 +166,9 @@
                     </template>
           </el-table-column>-->
         </el-table>
-        <pagination :total="pageInfo.total"
+        <pagination
+        sync
+        :total.sync="pageInfo.total"
                     :page.sync="pageInfo.page"
                     :limit.sync="pageInfo.limit"
                     :page-sizes="pageInfo.page_size"
@@ -234,23 +239,26 @@ export default {
       });
     },
     onSearch () {
-      let pageInfo = this.pageInfo;
-      pageInfo.page = 1;
+      this.pageInfo.page = 1;
       this.getList();
     },
     onReSet () {
       // 重置搜索
+
       this.orderDate = null;
-      this.searchForm = {
-        orderNo: null,
-        transNo: null,
-        city: null,
-        status: null,
-        startTime: null,
-        organId: null,
-        endTime: null,
-      };
-      this.getList();
+      // this.searchForm = {
+      //   orderNo: null,
+      //   transNo: null,
+      //   city: null,
+      //   status: null,
+      //   startTime: null,
+      //   organId: null,
+      //   endTime: null,
+      // };
+         this.$refs.searchForm.resetFields()
+        //  this.$set(this.searchForm,'status','pay')
+      // this.searchForm.status = 'pay'
+      this.onSearch();
     },
     getList () {
       let searchForm = this.searchForm;
@@ -382,4 +390,4 @@ export default {
   -webkit-line-clamp: 3;
   -webkit-box-orient: vertical;
 }
-</style>
+</style>

+ 1 - 9
src/views/resetTeaming/index.vue

@@ -89,8 +89,6 @@ export default {
       //   resetSound: true,
       //   coursePlan: true,
       // }
-      Fsearch: null,
-      Frules: null,
       name: null,
       teamName: '乐团修改',
       musicGroupInfo:null
@@ -119,15 +117,9 @@ export default {
     __init () {
       this.activeIndex = sessionStorage.getItem('resetCode') || '1';
       this.teamid = this.$route.query.id;
-      if (this.$route.query.search) {
-        this.Fsearch = this.$route.query.search;
-      }
-      if (this.$route.query.rules) {
-        this.Frules = this.$route.query.rules
-      }
     },
     onCancel () {
-      this.$router.push({ path: '/business/teamDetail', query: { search: this.Fsearch, rules: this.Frules } })
+      this.$router.push({ path: '/business/teamDetail' })
     },
     getBaseInfo (baseInfo) {
       this.baseInfo = baseInfo

+ 84 - 55
src/views/returnVisitManager/returnVisitList.vue

@@ -5,7 +5,9 @@
       回访记录
     </h2>
     <div class="m-core">
-      <el-form :inline="true"
+      <save-form :inline="true"
+      @submit='search'
+      @reset="onReSet"
                :model="searchForm">
         <el-form-item>
           <el-input placeholder="请输入老师姓名"
@@ -58,11 +60,11 @@
         </el-form-item>
         <el-form-item>
           <el-button type="danger"
-                     @click="search">搜索</el-button>
-          <el-button @click="onReSet"
+                    native-type="submit">搜索</el-button>
+          <el-button native-type="reset"
                      type="primary">重置</el-button>
         </el-form-item>
-      </el-form>
+      </save-form>
       <div class="tableWrap">
         <el-table :data='tableList'
                   :header-cell-style="{background:'#EDEEF0',color:'#444'}">
@@ -119,7 +121,9 @@
             </template>
           </el-table-column>
         </el-table>
-        <pagination :total="rules.total"
+        <pagination
+        sync
+        :total.sync="rules.total"
                     :page.sync="rules.page"
                     :limit.sync="rules.limit"
                     :page-sizes="rules.page_size"
@@ -130,7 +134,32 @@
                width="700px"
                destroy-on-close
                :visible.sync="detailVisible">
-      <el-form :inline="true"
+         <descriptions :column="2" v-if="activeRow">
+      <descriptions-item label="老师姓名:">{{
+        activeRow.teacherName
+      }}</descriptions-item>
+      <descriptions-item label="所属分部:">{{
+        activeRow.organName
+      }}</descriptions-item>
+      <descriptions-item label="角色:">{{
+       activeRow.visiterType | visiterType
+      }}</descriptions-item>
+      <descriptions-item label="学生姓名:">{{
+        activeRow.studentName
+      }}岁</descriptions-item>
+      <descriptions-item label="回访类型:">{{
+        activeRow.type
+      }}</descriptions-item>
+      <descriptions-item label="回访目的:">{{
+       activeRow.purpose
+      }}</descriptions-item>
+      <descriptions-item label="回访情况:" :span="6">{{ activeRow.overview }}</descriptions-item>
+      <descriptions-item label="家长反馈" :span="6">{{ activeRow.feedback }}</descriptions-item>
+    </descriptions>
+
+
+
+      <!-- <el-form :inline="true"
                v-if="activeRow"
                ref='visitForm'>
         <el-form-item label="老师姓名">
@@ -163,26 +192,26 @@
                       prop='feedback'>
           <p class="label">{{activeRow.feedback}}</p>
         </el-form-item>
-      </el-form>
+      </el-form> -->
     </el-dialog>
   </div>
 </template>
 <script>
-import { visitChiose } from '@/utils/searchArray'
-import pagination from '@/components/Pagination/index'
-import { getEmployeeOrgan } from '@/api/buildTeam'
-import { getVisitList } from './api.js'
-import cleanDeep from 'clean-deep'
+import { visitChiose } from "@/utils/searchArray";
+import pagination from "@/components/Pagination/index";
+import { getEmployeeOrgan } from "@/api/buildTeam";
+import { getVisitList } from "./api.js";
+import cleanDeep from "clean-deep";
 export default {
   components: { pagination },
-  data () {
+  data() {
     return {
       searchForm: {
-        teacher: '',
-        organId: '',
-        visiterType: '',
-        type: '',
-        purpose: ''
+        teacher: "",
+        organId: "",
+        visiterType: "",
+        type: "",
+        purpose: "",
       },
       type: [],
       timer: [],
@@ -193,62 +222,62 @@ export default {
         limit: 10, // 限制显示条数
         page: 1, // 当前页
         total: 0, // 总条数
-        page_size: [10, 20, 40, 50] // 选择限制显示条数
+        page_size: [10, 20, 40, 50], // 选择限制显示条数
       },
       tableList: [],
       detailVisible: false,
-      activeRow: null
-    }
+      activeRow: null,
+    };
   },
-  mounted () {
-    getEmployeeOrgan().then(res => {
+  mounted() {
+    getEmployeeOrgan().then((res) => {
       if (res.code == 200) {
         this.organList = res.data;
       }
-    })
-    this.getList()
+    });
+    this.getList();
   },
-  activated () {
-    this.getList()
+  activated() {
+    this.getList();
   },
   methods: {
-    handleChange (val) {
-      this.searchForm.type = val[0]
-      this.searchForm.purpose = val[1]
+    handleChange(val) {
+      this.searchForm.type = val[0];
+      this.searchForm.purpose = val[1];
     },
-    search () {
+    search() {
       this.rules.page = 1;
-      this.getList()
+      this.getList();
     },
-    onReSet () {
-      this.type = []
-      this.timer = []
+    onReSet() {
+      this.type = [];
+      this.timer = [];
       this.searchForm = {
-        teacher: '',
-        organId: '',
-        visiterType: '',
-        type: '',
-        purpose: ''
-      }
-      this.search()
+        teacher: "",
+        organId: "",
+        visiterType: "",
+        type: "",
+        purpose: "",
+      };
+      this.search();
     },
-    getList () {
+    getList() {
       // cleanDeep
 
       this.searchForm.page = this.rules.page;
-      this.searchForm.rows = this.rules.limit
-      getVisitList(cleanDeep(this.searchForm)).then(res => {
+      this.searchForm.rows = this.rules.limit;
+      getVisitList(cleanDeep(this.searchForm)).then((res) => {
         if (res.code == 200) {
           this.tableList = res.data.rows;
-          this.rules.total = res.data.total
+          this.rules.total = res.data.total;
         }
-      })
+      });
     },
-    lookDetail (row) {
+    lookDetail(row) {
       this.activeRow = row;
       this.detailVisible = true;
     },
-    changeTimer (val) {
+    changeTimer(val) {
       if (val && val.length > 0) {
         this.searchForm.startTime = this.timer[0];
         this.searchForm.endTime = this.timer[1];
@@ -256,16 +285,16 @@ export default {
         this.searchForm.startTime = null;
         this.searchForm.endTime = null;
       }
-    }
+    },
   },
   watch: {
-    detailVisible (val) {
+    detailVisible(val) {
       if (!val) {
-        this.activeRow = null
+        this.activeRow = null;
       }
-    }
-  }
-}
+    },
+  },
+};
 </script>
 <style lang="scss" scoped>
 .msg {

+ 1 - 1
src/views/save-form-test/index.vue

@@ -142,7 +142,7 @@ export default {
   },
   mounted() {
     this.$store.dispatch('setBranchs')
-    this.$store.dispatch('setSubject')
+    this.$store.dispatch('setSubjects')
   },
   methods: {
     getList() {

+ 1 - 4
src/views/studentManager/components/studentInfo.vue

@@ -76,9 +76,6 @@ export default {
   mounted () {
     this.__init()
   },
-  activated () {
-    this.__init()
-  },
   methods: {
     __init () {
       this.userId = this.$route.query.userId
@@ -105,4 +102,4 @@ export default {
     }
   }
 }
-</style>
+</style>

+ 94 - 19
src/views/studentManager/components/studentOrder.vue

@@ -1,6 +1,65 @@
 <template>
   <div class="studentOrder">
-    <div class="headWrap">
+    <statistic>
+      <statistic-item>
+        <span>账户余额</span>
+        <span>
+          {{ dataInfo.balance | moneyFormat}}
+          <i class="el-icon-edit" v-permission="'userCashAccount/updateBalance'" @click="onMoneyOperation('recharge')"></i>
+        </span>
+      </statistic-item>
+      <statistic-item>
+        <span>课程余额</span>
+        <span>
+          {{ dataInfo.courseBalance | moneyFormat}}
+          <i class="el-icon-edit" v-permission="'userCashAccount/updateCourseBalance'" @click="onMoneyOperation('account')"></i>
+        </span>
+      </statistic-item>
+      <statistic-item>
+        <span>银行卡</span>
+        <span>{{ dataInfo.cardNo || '--' }}</span>
+      </statistic-item>
+      <statistic-item>
+        <el-button @click="onCashAccount"
+                    v-permission="'userCashAccountDetail/queryPage'"
+                    type="primary">交易明细</el-button>
+      </statistic-item>
+    </statistic>
+    <!-- <el-row class="header-items">
+      <el-col :span="5">
+        <span>账户余额</span>
+        <span>
+          {{ dataInfo.balance | moneyFormat}}
+          <i class="el-icon-edit" v-permission="'userCashAccount/updateBalance'" @click="onMoneyOperation('recharge')"></i>
+        </span>
+      </el-col>
+      <el-col :span="1">
+        <el-divider direction="vertical"></el-divider>
+      </el-col>
+      <el-col :span="5">
+        <span>课程余额</span>
+        <span>
+          {{ dataInfo.courseBalance | moneyFormat}}
+          <i class="el-icon-edit" v-permission="'userCashAccount/updateCourseBalance'" @click="onMoneyOperation('account')"></i>
+        </span>
+      </el-col>
+      <el-col :span="1">
+        <el-divider direction="vertical"></el-divider>
+      </el-col>
+      <el-col :span="5">
+        <span>银行卡</span>
+        <span>{{ dataInfo.cardNo || '--' }}</span>
+      </el-col>
+      <el-col :span="1">
+        <el-divider direction="vertical"></el-divider>
+      </el-col>
+      <el-col :span="6" style="text-align: right;">
+        <el-button @click="onCashAccount"
+                    v-permission="'userCashAccountDetail/queryPage'"
+                    type="primary">交易明细</el-button>
+      </el-col>
+    </el-row> -->
+    <!-- <div class="headWrap">
       <div class="left">
         <div class="headItem">
           <p>
@@ -12,24 +71,14 @@
                      @click="onMoneyOperation('recharge')">修改</el-button>
         </div>
         <div class="headItem">
-          <!-- v-if="amountStatus" -->
           <p>
             课程余额:
             <span>{{ dataInfo.courseBalance| moneyFormat }}</span>
           </p>
-          <!-- <p v-else>课程余额:<span>
-              <el-input style="width: 130px;"
-                        v-model.trim="dataInfo.courseBalance"
-                        placeholder="课程余额"></el-input>
-          </span></p>-->
 
           <el-button v-permission="'userCashAccount/updateCourseBalance'"
                      @click="onMoneyOperation('account')"
                      type="text">修改</el-button>
-          <!-- <el-button style="top:0;"
-                     @click="onUpdateCourse"
-                     v-else
-          type="text">保存</el-button>-->
         </div>
         <div class="headItem">
           <p>
@@ -37,17 +86,11 @@
             <span>{{ dataInfo.cardNo }}</span>
           </p>
         </div>
-        <!-- <div class="headItem">
-          <p>支付宝:<span>{{ dataInfo.zfb }}</span></p>
-        </div>
-        <div class="headItem">
-          <p>微信:<span>{{ dataInfo.wxBalance }}</span></p>
-        </div>-->
       </div>
       <el-button @click="onCashAccount"
                  v-permission="'userCashAccountDetail/queryPage'"
                  type="primary">交易明细</el-button>
-    </div>
+    </div> -->
     <!-- 搜索类型 -->
     <el-form :inline="true"
              class="searchForm"
@@ -655,6 +698,38 @@ export default {
     right: 20px;
   }
 }
+.header-items{
+  padding: 20px 0;
+  text-align: center;
+  /deep/ .el-icon-edit{
+    cursor: pointer;
+    color: #14928A;
+    font-size: 20px;
+  }
+  /deep/ .el-col {
+    display: flex;
+    align-items: center;
+    min-height: 60px;
+    align-items: center;
+    justify-content: center;
+    align-items: center;
+    flex-direction: column;
+  }
+  /deep/ .el-col-1{
+    font-size: 60px;
+  }
+  span{
+    display: block;
+    line-height: 1.8;
+    color: rgba(0, 0, 0, .85);
+    font-size: 24px;
+    &:first-child{
+      font-size: 14px;
+      font-weight: normal;
+      color: rgba(0, 0, 0, .45);
+    }
+  }
+}
 /deep/.el-table .cell {
   display: -webkit-box;
   overflow: hidden;
@@ -665,4 +740,4 @@ export default {
 
 // .studentOrder {
 // }
-</style>
+</style>

+ 93 - 85
src/views/studentManager/components/teamAndcourse.vue

@@ -59,91 +59,99 @@
         </el-table-column>
       </el-table>
     </div>
-    <!-- 搜索类型 -->
-    <el-form v-if="coursesShow"
-             :inline="true"
-             class="searchForm"
-             v-model.trim="searchForm">
-      <el-form-item>
-        <el-select v-model.trim="searchForm.classGroupType"
-                   clearable
-                   filterable
-                   placeholder="课程类型">
-          <el-option v-for="(item, index) in courseArray"
-                     :key="index"
-                     :label="item.label"
-                     :value="item.value"></el-option>
-        </el-select>
-      </el-form-item>
-      <el-form-item>
-        <el-select v-model.trim="searchForm.courseStatus"
-                   clearable
-                   filterable
-                   placeholder="课程状态">
-          <el-option v-for="(item, index) in courseStatus"
-                     :key="index"
-                     :label="item.label"
-                     :value="item.value"></el-option>
-        </el-select>
-      </el-form-item>
-      <el-form-item>
-        <el-input placeholder="班级名称"
-                  @keyup.enter.native="search"
-                  v-model.trim="searchForm.classGroupName"></el-input>
-      </el-form-item>
-      <el-form-item>
-        <el-input placeholder="老师姓名"
-                  @keyup.enter.native="search"
-                  v-model.trim="searchForm.teacherName"></el-input>
-      </el-form-item>
-      <el-form-item>
-        <div @click="search"
-             class="searchBtn">搜索</div>
-      </el-form-item>
-    </el-form>
-    <!-- 查询列表 -->
-    <!-- <div v-if="coursesShow" class="searchWrap">
-      <p>查询条件:</p>
-      <div class="searchItem"
-           @click="closeSearch(item)"
-           v-for="(item,index) in searchLsit" :key="index">
-        {{ item.key }}
-        <i class="el-icon-close"></i>
-      </div>
-    </div>-->
-    <div v-if="coursesShow"
-         class="tableWrap">
-      <el-table :data="coursesInfo"
-                :header-cell-style="{background:'#EDEEF0',color:'#444'}">
-        <el-table-column align="center"
-                         prop="classGroupId"
-                         label="编号"></el-table-column>
-        <el-table-column align="center"
-                         prop="courseDate"
-                         label="时间">
-          <template slot-scope="scope">{{ scope.row.courseDate | dateForMinFormat }}</template>
-        </el-table-column>
-        <el-table-column align="center"
-                         prop="classGroupName"
-                         label="班级名称"></el-table-column>
-        <el-table-column align="center"
-                         label="课程类型">
-          <template slot-scope="scope">{{ scope.row.classGroupType | coursesType }}</template>
-        </el-table-column>
-        <el-table-column align="center"
-                         label="课程状态">
-          <template slot-scope="scope">{{ scope.row.courseStatus | coursesStatus }}</template>
-        </el-table-column>
-        <el-table-column align="center"
-                         prop="teacherName"
-                         label="老师姓名"></el-table-column>
-      </el-table>
-      <pagination :total="pageInfo.total"
-                  :page.sync="pageInfo.page"
-                  :limit.sync="pageInfo.limit"
-                  :page-sizes="pageInfo.page_size"
-                  @pagination="getStudentCourses" />
-    </div>
+    <el-dialog
+      :visible.sync="coursesShow"
+      title="排课详情"
+      width="1000px"
+    >
+    <template>
+      <!-- 搜索类型 -->
+      <el-form v-if="coursesShow"
+              :inline="true"
+              class="searchForm"
+              v-model.trim="searchForm">
+        <el-form-item>
+          <el-select v-model.trim="searchForm.classGroupType"
+                    clearable
+                    filterable
+                    placeholder="课程类型">
+            <el-option v-for="(item, index) in courseArray"
+                      :key="index"
+                      :label="item.label"
+                      :value="item.value"></el-option>
+          </el-select>
+        </el-form-item>
+        <el-form-item>
+          <el-select v-model.trim="searchForm.courseStatus"
+                    clearable
+                    filterable
+                    placeholder="课程状态">
+            <el-option v-for="(item, index) in courseStatus"
+                      :key="index"
+                      :label="item.label"
+                      :value="item.value"></el-option>
+          </el-select>
+        </el-form-item>
+        <el-form-item>
+          <el-input placeholder="班级名称"
+                    @keyup.enter.native="search"
+                    v-model.trim="searchForm.classGroupName"></el-input>
+        </el-form-item>
+        <el-form-item>
+          <el-input placeholder="老师姓名"
+                    @keyup.enter.native="search"
+                    v-model.trim="searchForm.teacherName"></el-input>
+        </el-form-item>
+        <el-form-item>
+          <div @click="search"
+              class="searchBtn">搜索</div>
+        </el-form-item>
+      </el-form>
+      <!-- 查询列表 -->
+      <!-- <div v-if="coursesShow" class="searchWrap">
+        <p>查询条件:</p>
+        <div class="searchItem"
+            @click="closeSearch(item)"
+            v-for="(item,index) in searchLsit" :key="index">
+          {{ item.key }}
+          <i class="el-icon-close"></i>
+        </div>
+      </div>-->
+        <div v-if="coursesShow"
+            class="tableWrap">
+          <el-table :data="coursesInfo"
+                    :header-cell-style="{background:'#EDEEF0',color:'#444'}">
+            <el-table-column align="center"
+                            prop="classGroupId"
+                            label="编号"></el-table-column>
+            <el-table-column align="center"
+                            prop="courseDate"
+                            label="时间">
+              <template slot-scope="scope">{{ scope.row.courseDate | dateForMinFormat }}</template>
+            </el-table-column>
+            <el-table-column align="center"
+                            prop="classGroupName"
+                            label="班级名称"></el-table-column>
+            <el-table-column align="center"
+                            label="课程类型">
+              <template slot-scope="scope">{{ scope.row.classGroupType | coursesType }}</template>
+            </el-table-column>
+            <el-table-column align="center"
+                            label="课程状态">
+              <template slot-scope="scope">{{ scope.row.courseStatus | coursesStatus }}</template>
+            </el-table-column>
+            <el-table-column align="center"
+                            prop="teacherName"
+                            label="老师姓名"></el-table-column>
+          </el-table>
+          <pagination :total="pageInfo.total"
+                      :page.sync="pageInfo.page"
+                      :limit.sync="pageInfo.limit"
+                      :page-sizes="pageInfo.page_size"
+                      @pagination="getStudentCourses" />
+        </div>
+      </template>
+    </el-dialog>
   </div>
 </template>
 <script>

+ 16 - 31
src/views/studentManager/studentList.vue

@@ -10,9 +10,11 @@
       <div class="newBand"
            @click="onCreateQRCode">学员激活列表</div>
       <!-- 搜索标题 -->
-      <el-form :inline="true"
+      <save-form :inline="true"
                class="searchForm"
-               v-model.trim="searchForm">
+               @submit="onSearch"
+               @reset="onReSet"
+               :model.sync="searchForm">
         <el-form-item>
           <el-input placeholder="学生姓名或电话"
                     @keyup.enter.native="onSearch"
@@ -24,7 +26,7 @@
                      v-model.trim="searchForm.organId"
                      clearable
                      placeholder="请选择分部">
-            <el-option v-for="(item,index) in organList"
+            <el-option v-for="(item,index) in selects.branchs"
                        :key="index"
                        :label="item.name"
                        :value="item.id"></el-option>
@@ -36,7 +38,7 @@
                      v-model="searchForm.teacherId"
                      clearable
                      filterable>
-            <el-option v-for="(item,index) in teacherList"
+            <el-option v-for="(item,index) in selects.teachers"
                        :label="item.realName"
                        :value="item.id"
                        :key="index"></el-option>
@@ -109,15 +111,15 @@
           </el-select>
         </el-form-item>
         <el-form-item>
-          <el-button @click="onSearch"
+          <el-button native-type="submit"
                      type="danger">搜索</el-button>
-          <el-button @click="onReSet"
+          <el-button native-type="reset"
                      type="primary">重置</el-button>
           <el-button type="primary"
                      v-permission="'export/studentHasCourse'"
                      @click="downLoadStudent">导出名单</el-button>
         </el-form-item>
-      </el-form>
+      </save-form>
       <!-- 列表 -->
       <div class="tableWrap">
         <el-table :data="tableList"
@@ -204,7 +206,7 @@
             <template slot-scope="scope">
               <router-link v-permission="'/studentDetail'"
                            class="el-button--text"
-                           :to="{path:`/business/studentDetail?userId=${scope.row.userId}`,query:{search:JSON.stringify(searchForm),rules:JSON.stringify(pageInfo),studentName:scope.row.username}}">查看</router-link>
+                           :to="{path:`/business/studentDetail?userId=${scope.row.userId}`,query:{studentName:scope.row.username}}">查看</router-link>
               <el-button type="text"
                          v-permission="'studentManage/studentUpdate'"
                          @click="resetStudent(scope.row)">修改</el-button>
@@ -218,7 +220,8 @@
             </template>
           </el-table-column>
         </el-table>
-        <pagination :total="pageInfo.total"
+        <pagination sync
+                    :total.sync="pageInfo.total"
                     :page.sync="pageInfo.page"
                     :limit.sync="pageInfo.limit"
                     :page-sizes="pageInfo.page_size"
@@ -253,7 +256,7 @@
                      clearable
                      placeholder="请选择分部"
                      @change="changeStudentOrgan">
-            <el-option v-for="(item,index) in organList"
+            <el-option v-for="(item,index) in selects.branchs"
                        :key="index"
                        :label="item.name"
                        :value="item.id"></el-option>
@@ -518,26 +521,8 @@ export default {
     };
   },
   mounted () {
-    if (this.$route.query.search) {
-      this.$route.query.search instanceof Object
-        ? (this.searchForm = this.$route.query.search)
-        : (this.searchForm = JSON.parse(this.$route.query.search));
-    }
-    if (this.$route.query.rules) {
-      this.$route.query.rules instanceof Object
-        ? (this.pageInfo = this.$route.query.rules)
-        : (this.pageInfo = JSON.parse(this.$route.query.rules));
-    }
-    getEmployeeOrgan().then(res => {
-      if (res.code == 200) {
-        this.organList = res.data;
-      }
-    });
-    getTeacher().then(res => {
-      if (res.code == 200) {
-        this.teacherList = res.data;
-      }
-    });
+    this.$store.dispatch('setBranchs')
+    this.$store.dispatch('setTeachers')
     this.getList();
   },
   methods: {
@@ -666,7 +651,7 @@ export default {
         .catch(() => { });
     },
     checkPhone (val) {
-      var regu = /^1[3456789]\d{9}$/;
+      var regu = /^1\d{10}$/;
       var re = new RegExp(regu);
       if (re.test(val)) {
         getStudentInfoByPhone({ mobile: this.studentForm.phone }).then(res => {

+ 0 - 189
src/views/teamBuild/components/teamBaseInfo.vue

@@ -308,19 +308,6 @@
             ></el-option>
           </el-select>
         </el-form-item>
-        <!-- <el-form-item label="乐团网管课"
-                      :rules="[{ required: true, message: '请选择是否排乐团网管课' }]"
-                      prop="feeType">
-          <el-select v-model="topFrom.feeType"
-                     placeholder="是否排乐团网管课"
-                     :disabled="basdisabled"
-                     @change="changeFeeType">
-            <el-option label="需要排一次线上课"
-                       value="ONLINE"></el-option>
-            <el-option label="只排线下课"
-                       value="OFFLINE"></el-option>
-          </el-select>
-        </el-form-item> -->
         <el-form-item label prop="isClass">
           <el-checkbox v-model.trim="topFrom.isClass" :disabled="basdisabled"
             >课堂课乐团</el-checkbox
@@ -333,180 +320,6 @@
           </p>
         </el-form-item>
       </el-form>
-
-      <!-- <div class="checkList">
-        <div class="head noMargin">乐团课程:</div>
-        <div class="checkRow">
-          <el-checkbox label="乐团声部训练"
-                       :disabled="basdisabled"
-                       v-model.trim="checkList.soundInfo.ischeck"></el-checkbox>
-          <div class="inputWrap">
-            原价:
-            <el-input type="text"
-                      placeholder="请输入"
-                      :disabled="basdisabled"
-                      v-model.trim="checkList.soundInfo.value" />
-          </div>
-        </div>
-        <div class="checkRow">
-          <el-checkbox label="乐团合奏训练"
-                       :disabled="basdisabled"
-                       v-model.trim="checkList.allInfo.ischeck"></el-checkbox>
-          <div class="inputWrap">
-            原价:
-            <el-input type="text"
-                      placeholder="请输入"
-                      :disabled="basdisabled"
-                      v-model.trim="checkList.allInfo.value" />
-          </div>
-        </div>
-        <div class="checkRow">
-          <el-checkbox label="假期集中训练"
-                       :disabled="basdisabled"
-                       v-model.trim="checkList.holidayInfo.ischeck"></el-checkbox>
-          <div class="inputWrap">
-            原价:
-            <el-input type="number"
-                      @mousewheel.native.prevent
-                      :disabled="basdisabled"
-                      placeholder="请输入"
-                      v-model.trim="checkList.holidayInfo.value" />
-          </div>
-        </div>
-        <div class="checkRow"
-             v-if="checkList.networkInfo">
-          <el-checkbox label="乐团云课堂"
-                       :disabled="basdisabled"
-                       v-model="checkList.networkInfo.ischeck"></el-checkbox>
-          <div class="inputWrap">
-            原价:
-            <el-input type="number"
-                      :disabled="basdisabled"
-                      @mousewheel.native.prevent
-                      placeholder="请输入"
-                      v-model.trim="checkList.networkInfo.value" />
-          </div>
-        </div>
-        <div class="checkRow">
-          <el-checkbox label="网络基础训练"
-                       :disabled="basdisabled"
-                       v-model.trim="checkList.baseInfo.ischeck"></el-checkbox>
-          <div class="inputWrap">
-            原价:
-            <el-input type="number"
-                      :disabled="basdisabled"
-                      @mousewheel.native.prevent
-                      placeholder="请输入"
-                      v-model.trim="checkList.baseInfo.value" />
-          </div>
-        </div>
-        <div class="checkRow">
-          <el-checkbox label="课程提示"
-                       :disabled="basdisabled"
-                       class="classCheckBox"
-                       v-model.trim="checkList.submit.ischeck"></el-checkbox>
-          <div class="textWrap"
-               v-if="checkList.submit.ischeck">
-            <el-input type="textarea"
-                      :disabled="basdisabled"
-                      :rows="1"
-                      style="width: 500px"
-                      v-model.trim="checkList.submit.value"></el-input>
-          </div>
-        </div>
-        <div class="head noMargin">新生专享:</div>
-
-        <div class="checkRow"
-             v-if="newStudentList.baseInfo">
-          <el-checkbox label="网络基础训练"
-                       :disabled="basdisabled"
-                       v-model="newStudentList.baseInfo.ischeck"></el-checkbox>
-          <div class="inputWrap">
-            原价:
-            <el-input type="number"
-                      @mousewheel.native.prevent
-                      :disabled="basdisabled"
-                      placeholder="请输入"
-                      v-model.trim="newStudentList.baseInfo.nowValue" />
-          </div>
-          <div class="inputWrap">
-            现价:
-            <el-input type="number"
-                      :disabled="basdisabled"
-                      @mousewheel.native.prevent
-                      placeholder="请输入"
-                      v-model.trim="newStudentList.baseInfo.value" />
-          </div>
-        </div>
-        <div class="head noMargin">付费方式:</div>
-        <div class="checkRow">
-          <el-checkbox label="学校"
-                       :disabled="basdisabled"
-                       class="classCheckBox"
-                       v-model.trim="payList.school.ischeck"></el-checkbox>
-
-          <div class="chioseList">
-            <el-radio-group v-model="payList.school.chiose"
-                            size="small">
-              <el-radio-button label="ONE_OFF">一次性</el-radio-button>
-              <el-radio-button label="MONTHLY">一个月</el-radio-button>
-              <el-radio-button label="TERM">一学期</el-radio-button>
-              <el-radio-button label="YEAR">一学年</el-radio-button>
-            </el-radio-group>
-          </div>
-          <div class="inputWrap">
-            <div>
-              预计收费:
-              <el-input v-model.trim="payList.school.price"
-                        :disabled="basdisabled"
-                        placeholder="请输入" />
-            </div>
-
-          </div>
-          <div class="inputWrap">
-            <div>
-              备注:
-              <el-input v-model.trim="payList.school.value"
-                        :disabled="basdisabled"
-                        placeholder="请输入" />
-            </div>
-
-          </div>
-        </div>
-        <div class="checkRow">
-          <el-checkbox label="公司"
-                       class="classCheckBox"
-                       :disabled="basdisabled"
-                       v-model.trim="payList.company.ischeck"></el-checkbox>
-          <div class="chioseList">
-            <el-radio-group v-model="payList.company.chiose"
-                            size="small">
-              <el-radio-button label="ONE_OFF">一次性</el-radio-button>
-              <el-radio-button label="MONTHLY">一个月</el-radio-button>
-              <el-radio-button label="TERM">一学期</el-radio-button>
-              <el-radio-button label="YEAR">一学年</el-radio-button>
-            </el-radio-group>
-          </div>
-          <div class="inputWrap">
-            <div>
-              预计收费:
-              <el-input placeholder="请输入"
-                        :disabled="basdisabled"
-                        v-model.trim="payList.company.price" />
-            </div>
-
-          </div>
-          <div class="inputWrap">
-            <div>
-              备注:
-              <el-input placeholder="请输入"
-                        :disabled="basdisabled"
-                        v-model.trim="payList.company.value" />
-            </div>
-
-          </div>
-        </div>
-      </div> -->
       <div class="btnWrap">
         <div
           class="nextBtn"
@@ -768,7 +581,6 @@ export default {
       //          3.teamList  跨团修改
       //          4.teamDraft 乐团草稿
       this.teamStatus = this.$route.query.type;
-      console.log(this.teamStatus);
       // 传过来的乐团信息
       this.activeTeam = this.getTeamList;
       if (
@@ -791,7 +603,6 @@ export default {
         this.teamid = this.$route.query.id;
         getTeamBaseInfo({ musicGroupId: this.teamid }).then((res) => {
           if (res.code == 200) {
-            console.log({...res.data.musicGroup})
             // if (this.$listeners.getBaseInfo) {
             //   this.$listeners.getBaseInfo(res.data);
             // }

+ 1 - 11
src/views/teamBuild/index.vue

@@ -81,8 +81,6 @@ export default {
       pageName: "建团申请",
       getTeamList: [],
       teamStatus: "",
-      Fsearch: null,
-      Frules: null,
     };
   },
   created () {
@@ -99,13 +97,6 @@ export default {
       if (this.$route.query.teamList) {
         this.getTeamList = this.$route.query.teamList;
       }
-      // 判断是否带缓存参数
-      if (this.$route.query.search) {
-        this.Fsearch = this.$route.query.search;
-      }
-      if (this.$route.query.rules) {
-        this.Frules = this.$route.query.rules;
-      }
 
       if (this.teamStatus == "newTeam") {
         // 新建团
@@ -125,7 +116,6 @@ export default {
     goBack () {
       this.$router.push({
         path: "/business/teamDetail",
-        query: { search: this.Fsearch, rules: this.Frules },
       });
     },
     getBaseInfo (baseInfo) {
@@ -201,4 +191,4 @@ export default {
   border-top: 1px solid #dcdfe6;
   padding-top: 30px;
 }
-</style>
+</style>

+ 1 - 10
src/views/teamBuild/signupList.vue

@@ -653,8 +653,6 @@ export default {
         ],
         reason: [{ required: true, message: "请填写退团退费原因" }]
       },
-      Fsearch: null,
-      Frules: null,
       applyExpireDate: '',
       paymentExpireDate: '',
       activeRow: null,
@@ -701,12 +699,6 @@ export default {
       this.id = this.$route.query.id;
       this.teamName = this.$route.query.name
       // 判断是否带缓存参数
-      if (this.$route.query.search) {
-        this.Fsearch = this.$route.query.search;
-      }
-      if (this.$route.query.rules) {
-        this.Frules = this.$route.query.rules
-      }
       this.pickerOptions = this.beginDate(new Date());
       getTeamBaseInfo({ musicGroupId: this.id }).then(res => {
         if (res.code == 200) {
@@ -739,7 +731,7 @@ export default {
       this.getList()
     },
     onCancel () {
-      this.$router.push({ path: '/business/teamDetail', query: { search: this.Fsearch, rules: this.Frules } })
+      this.$router.push({ path: '/business/teamDetail'})
     },
     payStart () {
       this.paymentStatus = true;
@@ -978,7 +970,6 @@ export default {
             this.$message.success('停止成功')
             this.$router.push({
               path: '/business/teamDetail',
-              query: { search: this.Fsearch, rules: this.Frules }
             })
           }
         })

+ 16 - 24
src/views/teamDetail/components/studentList.vue

@@ -1,28 +1,20 @@
 <template>
   <div class="stu-container">
     <!-- 头部展示 -->
-    <div class="headWrap">
-      <div class="left">
-        <div class="headItem">
-          <p>
-            在读人数:
-            <span>{{studentListInfo.studying}}</span>
-          </p>
-        </div>
-        <div class="headItem">
-          <p>
-            退团人数:
-            <span>{{studentListInfo.quit}}</span>
-          </p>
-        </div>
-        <div class="headItem">
-          <p>
-            新增人数:
-            <span>{{studentListInfo.add}}</span>
-          </p>
-        </div>
-      </div>
-      <div class="right">
+    <statistic>
+      <statistic-item>
+        <span>在读人数</span>
+        <span>{{studentListInfo.studying}}</span>
+      </statistic-item>
+      <statistic-item>
+        <span>退团人数</span>
+        <span>{{studentListInfo.quit}}</span>
+      </statistic-item>
+      <statistic-item>
+        <span>新增人数</span>
+        <span>{{studentListInfo.add}}</span>
+      </statistic-item>
+      <statistic-item>
         <div class="newStudent"
              style="margin-bottom:10px;"
              v-permission="'studentRegistration/insertStudent'"
@@ -34,8 +26,8 @@
         <div class="newStudent"
              v-permission="'/studentSignin'"
              @click="gotoSignin">点名总览</div>
-      </div>
-    </div>
+      </statistic-item>
+    </statistic>
 
     <!-- 搜索类型 -->
     <el-form :inline="true"

+ 4 - 11
src/views/teamDetail/index.vue

@@ -84,8 +84,6 @@ export default {
         PAUSE: require('@/assets/images/base/end.png')
       },
       status: '',
-      Fsearch: null,
-      Frules: null
     }
   },
   mounted () {
@@ -108,25 +106,20 @@ export default {
       this.teamid = this.$route.query.id;
       this.name = this.$route.query.name;
       // 判断是否带缓存参数
-      if (this.$route.query.search) {
-        this.Fsearch = this.$route.query.search;
-      }
-      if (this.$route.query.rules) {
-        this.Frules = this.$route.query.rules
-      }
     },
     handleClick (val) {
       this.activeIndex = val.name;
+
     },
     onCancel () {
-      this.$router.push({ path: '/business/teamDetail', query: { search: this.Fsearch, rules: this.Frules } })
+      this.$router.push({ path: '/business/teamDetail'})
     },
     // getname (name) {
     //   this.name = name;
     //   localStorage.setItem('teamName', name);
     // },
     resetTeam () {
-      // id  type 
+      // id  type
       this.$router.push({ path: '/business/teamBuild', query: { type: 'resetTeam', id: this.teamid } })
     }
   },
@@ -189,4 +182,4 @@ export default {
 }
 </style>
 <style lang='scss'>
-</style>
+</style>

+ 3 - 9
src/views/teamDetail/indexCourse.vue

@@ -63,25 +63,19 @@ export default {
       this.teamid = teamInfo.id;
       this.name = teamInfo.name;
       // 判断是否带缓存参数
-      if (this.$route.query.search) {
-        this.Fsearch = this.$route.query.search;
-      }
-      if (this.$route.query.rules) {
-        this.Frules = this.$route.query.rules
-      }
     },
     handleClick (val) {
       this.activeIndex = val.name;
     },
     onCancel () {
-      this.$router.push({ path: '/business/teamDetail', query: { search: this.Fsearch, rules: this.Frules } })
+      this.$router.push({ path: '/business/teamDetail' })
     },
     getname (name) {
       this.name = name;
       localStorage.setItem('teamName', name);
     },
     resetTeam () {
-      // id  type 
+      // id  type
       this.$router.push({ path: '/business/teamBuild', query: { type: 'resetTeam', id: this.teamid } })
     }
   },
@@ -140,4 +134,4 @@ export default {
 }
 </style>
 <style lang='scss'>
-</style>
+</style>

+ 36 - 8
src/views/teamDetail/teamCourseList.vue

@@ -7,6 +7,8 @@
       <!-- 搜索类型 -->
       <save-form :inline="true"
                class="searchForm"
+               @submit="search"
+               @reset="reset"
                ref="searchForm"
                :model.sync="searchForm">
         <el-form-item>
@@ -60,6 +62,17 @@
           </el-select>
         </el-form-item>
         <el-form-item>
+          <el-select v-model.trim="searchForm.mergeType"
+                     clearable
+                     filterable
+                     placeholder="合并类型">
+            <el-option v-for="(item, index) in mergeTypeOpions"
+                       :key="index"
+                       :value="item.value"
+                       :label="item.label"></el-option>
+          </el-select>
+        </el-form-item>
+        <el-form-item>
           <el-select v-model.trim="searchForm.courseType"
                      clearable
                      filterable
@@ -149,11 +162,11 @@
         <el-row type="flex" justify="space-around">
           <el-col>
             <el-button
-              @click="search"
+              native-type="submit"
               type="primary"
             >搜索</el-button>
             <el-button
-              @click="reset"
+              native-type="reset"
               type="danger"
             >重置</el-button>
             <el-button
@@ -175,10 +188,19 @@
           <el-table-column align="center"
                            width="130px"
                            prop="musicGroupId"
-                           label="乐团/课程组编号"></el-table-column>
+                           label="乐团/课程组编号">
+                              <template slot-scope="scope">
+                                <copy-text>{{scope.row.musicGroupId}}</copy-text>
+                              </template>
+                           </el-table-column>
           <el-table-column align="center"
                            prop="id"
-                           label="课程编号"></el-table-column>
+                           width="100px"
+                           label="课程编号">
+                              <template slot-scope="scope">
+                                <copy-text>{{scope.row.id}}</copy-text>
+                              </template>
+                            </el-table-column>
           <el-table-column align="center"
                            width="200px"
                            label="上课时间">
@@ -187,9 +209,13 @@
           <el-table-column align="center"
                            prop="subjectName"
                            label="声部"></el-table-column>
-          <el-table-column align="center"
-                           prop="name"
-                           label="课程名称"></el-table-column>
+          <el-table-column prop="name"
+                           width="150px"
+                           label="课程名称">
+                            <template slot-scope="scope">
+                              <copy-text>{{scope.row.name}}</copy-text>
+                            </template>
+                           </el-table-column>
           <el-table-column align="center"
                            width="150px"
                            label="课程类型">
@@ -420,7 +446,7 @@ import {
   getEmployeeOrgan,
   cleanAttendance
 } from "@/api/buildTeam";
-import { workType, mergeCourseType } from '@/constant'
+import { workType, mergeCourseType, mergeType } from '@/constant'
 import { objectToOptions, getTimes } from '@/utils'
 import { getTeacherPersonalAttendanceDetail } from "@/api/teacherManager";
 import { getSchool } from "@/api/systemManage";
@@ -468,6 +494,8 @@ export default {
       courseVisible: false,
       courseType: courseType,
       mergeCourseType,
+      mergeType,
+      mergeTypeOpions: objectToOptions(mergeType),
       courseListType: courseListType,
       searchForm: {...initSearch},
       tableList: [],

+ 3 - 11
src/views/teamDetail/teamInfo.vue

@@ -52,8 +52,6 @@ export default {
         PAUSE: require('@/assets/images/base/end.png')
       },
       status: '',
-      Fsearch: null,
-      Frules: null
     }
   },
   created () {
@@ -75,25 +73,19 @@ export default {
       this.teamid = teamInfo.id;
       this.name = teamInfo.name;
       // 判断是否带缓存参数
-      if (this.$route.query.search) {
-        this.Fsearch = this.$route.query.search;
-      }
-      if (this.$route.query.rules) {
-        this.Frules = this.$route.query.rules
-      }
     },
     handleClick (val) {
       this.activeIndex = val.name;
     },
     onCancel () {
-      this.$router.push({ path: '/business/teamDetail', query: { search: this.Fsearch, rules: this.Frules } })
+      this.$router.push({ path: '/business/teamDetail'})
     },
     getname (name) {
       this.name = name;
       localStorage.setItem('teamName', name);
     },
     resetTeam () {
-      // id  type 
+      // id  type
       this.$router.push({ path: '/business/teamBuild', query: { type: 'resetTeam', id: this.teamid } })
     }
   },
@@ -153,4 +145,4 @@ export default {
 }
 </style>
 <style lang='scss'>
-</style>
+</style>

+ 28 - 28
src/views/teamDetail/teamList.vue

@@ -13,7 +13,9 @@
              @click="resetTeam">乐团调整</div> -->
       </div>
 
-      <el-form :inline="true"
+      <save-form :inline="true"
+      @submit='search'
+      @reset='reset'
                class="topForm"
                ref="topForm"
                :model="topForm">
@@ -60,13 +62,15 @@
         </el-form-item>
         <el-form-item>
           <el-button type='danger'
-                     @click="search">搜索</el-button>
+          native-type="submit"
+                     >搜索</el-button>
         </el-form-item>
         <el-form-item>
           <el-button type='primary'
-                     @click="reset">重置</el-button>
+          native-type="reset"
+                    >重置</el-button>
         </el-form-item>
-      </el-form>
+      </save-form>
       <div class="tableWrap">
         <el-table style="width: 100%"
                   @selection-change="handleSelectionChange"
@@ -248,7 +252,9 @@
         </el-table>
         <!-- 分页器 -->
         <!-- 分页 -->
-        <pagination :total="rules.total"
+        <pagination
+        sync
+        :total.sync="rules.total"
                     :page.sync="rules.page"
                     :limit.sync="rules.limit"
                     :page-sizes="rules.page_size"
@@ -317,13 +323,6 @@ export default {
   },
   methods: {
     init () {
-      if (this.$route.query.search) {
-        this.$route.query.search instanceof Object ? this.topForm = this.$route.query.search : this.topForm = JSON.parse(this.$route.query.search);
-      }
-      if (this.$route.query.rules) {
-        this.$route.query.rules instanceof Object ? this.rules = this.$route.query.rules : this.rules = JSON.parse(this.$route.query.rules);
-      }
-
       sessionStorage.setItem('resetCode', '1')
 
       getEmployeeOrgan().then(res => {
@@ -352,6 +351,7 @@ export default {
     },
     search () {
       this.rules.page = 1;
+      console.log(this.rules)
       this.getList();
     },
     getList () {
@@ -372,7 +372,7 @@ export default {
     createNewTeam () {
       let search = JSON.stringify(this.topForm)
       let rules = JSON.stringify(this.rules)
-      this.$router.push({ path: '/business/teamBuild', query: { type: 'newTeam', search, rules } })
+      this.$router.push({ path: '/business/teamBuild', query: { type: 'newTeam', } })
     },
     resetTeam () {
       // 这里还有勾选的乐团信息
@@ -382,13 +382,13 @@ export default {
       }
       let search = JSON.stringify(this.topForm)
       let rules = JSON.stringify(this.rules)
-      this.$router.push({ path: '/business/teamBuild', query: { type: 'teamList', teamList: this.passed, search, rules } })
+      this.$router.push({ path: '/business/teamBuild', query: { type: 'teamList', teamList: this.passed, } })
     },
     resetTeaming (row) {
       // 修改进行中的乐团
       let search = JSON.stringify(this.topForm)
       let rules = JSON.stringify(this.rules)
-      this.$router.push({ path: '/business/resetTeaming', query: { type: 'resetTeam', id: row.id, search, rules } })
+      this.$router.push({ path: '/business/resetTeaming', query: { type: 'resetTeam', id: row.id,} })
     },
     setSearchList (obj) {
       //
@@ -491,7 +491,7 @@ export default {
       // 查看课表
       let search = JSON.stringify(this.topForm)
       let rules = JSON.stringify(this.rules)
-      this.$router.push({ path: '/business/teamDetailCourse', query: { id: row.id, name: row.name, search, rules } })
+      this.$router.push({ path: '/business/teamDetailCourse', query: { id: row.id, name: row.name,  } })
     },
     lookTeamDetail (row) {
       let search = JSON.stringify(this.topForm)
@@ -499,43 +499,43 @@ export default {
       switch (row.status) {
         case 'DRAFT': {
           // 编辑中
-          this.$router.push({ path: '/business/teamBuild', query: { type: 'teamDraft', id: row.id, search, rules } })
+          this.$router.push({ path: '/business/teamBuild', query: { type: 'teamDraft', id: row.id,  } })
           break;
         }
         case 'AUDIT': {
           // 审核中
-          this.$router.push({ path: '/business/teamBuild', query: { type: 'teamAudit', id: row.id, search, rules } })
+          this.$router.push({ path: '/business/teamBuild', query: { type: 'teamAudit', id: row.id,  } })
           break;
         }
         case 'FEE_AUDIT': {
           // 费用审核中
-          this.$router.push({ path: '/business/teamBuild', query: { type: 'feeAudit', id: row.id, search, rules } })
+          this.$router.push({ path: '/business/teamBuild', query: { type: 'feeAudit', id: row.id,  } })
           break;
         }
         case 'AUDIT_FAILED': {
           // 审核失败
-          this.$router.push({ path: '/business/teamBuild', query: { type: 'teamDraft', id: row.id, search, rules } })
+          this.$router.push({ path: '/business/teamBuild', query: { type: 'teamDraft', id: row.id,  } })
           break;
         }
         case 'APPLY': {
           // 报名中
-          this.$router.push({ path: `/business/signupList`, query: { status: row.status, id: row.id, name: row.name, search, rules } })
+          this.$router.push({ path: `/business/signupList`, query: { status: row.status, id: row.id, name: row.name, } })
           break;
         }
         case 'PAY': {
           // 缴费中
-          this.$router.push({ path: `/business/signupList`, query: { status: row.status, id: row.id, name: row.name, search, rules } })
+          this.$router.push({ path: `/business/signupList`, query: { status: row.status, id: row.id, name: row.name,  } })
           break;
         }
         case 'PREPARE': {
           // 筹备中 跳转到乐团设置界面
-          this.$router.push({ path: `/business/teamSeting`, query: { status: row.status, id: row.id, name: row.name, search, rules } })
+          this.$router.push({ path: `/business/teamSeting`, query: { status: row.status, id: row.id, name: row.name,  } })
           break;
         }
         case 'PROGRESS': {
           // 进行中
           // 调到乐团详情 teamDetails
-          this.$router.push({ path: `/business/teamDetails`, query: { status: row.status, id: row.id, name: row.name, search, rules, organId: row.organId } })
+          this.$router.push({ path: `/business/teamDetails`, query: { status: row.status, id: row.id, name: row.name,  organId: row.organId } })
           break
         }
         case 'CANCELED': {
@@ -544,7 +544,7 @@ export default {
         }
         case 'PAUSE': {
           // 暂停
-          this.$router.push({ path: `/business/teamDetails`, query: { status: row.status, id: row.id, name: row.name, search, rules } })
+          this.$router.push({ path: `/business/teamDetails`, query: { status: row.status, id: row.id, name: row.name, } })
           break;
         }
       }
@@ -564,19 +564,19 @@ export default {
     gotodetailList (row) {
       let search = JSON.stringify(this.topForm)
       let rules = JSON.stringify(this.rules)
-      this.$router.push({ path: '/business/teamDetailedList', query: { id: row.id, search, rules } })
+      this.$router.push({ path: '/business/teamDetailedList', query: { id: row.id, } })
     },
     //
     lookTeamInfo (row) {
       let search = JSON.stringify(this.topForm)
       let rules = JSON.stringify(this.rules)
-      this.$router.push({ path: '/business/teamLookBase', query: { type: 'look', id: row.id, name: row.name, search, rules } })
+      this.$router.push({ path: '/business/teamLookBase', query: { type: 'look', id: row.id, name: row.name } })
     },
     // setImprovement 设置基础技能班
     gotoImprovement (row) {
       let search = JSON.stringify(this.topForm)
       let rules = JSON.stringify(this.rules)
-      this.$router.push({ path: '/business/setImprovement', query: { id: row.id, search, rules } })
+      this.$router.push({ path: '/business/setImprovement', query: { id: row.id,  } })
     },
     // 停止乐团
     stopTeam (row) {

+ 4 - 4
src/views/timedTask/index.vue

@@ -13,11 +13,11 @@
           </el-table-column>
           <el-table-column prop="description"
                            align='center'
-                           label="英文名">
+                           label="任务名">
           </el-table-column>
           <el-table-column prop="name"
                            align='center'
-                           label="任务名">
+                           label="英文名">
           </el-table-column>
           <el-table-column align='center'
                            prop="timeExp"
@@ -41,7 +41,7 @@
               </div>
             </template>
           </el-table-column>
-          
+
           <el-table-column align='center'
                            label="操作">
             <template slot-scope="scope">
@@ -162,4 +162,4 @@ export default {
 </script>
 <style lang="scss" scope>
 
-</style>
+</style>

+ 29 - 3
src/views/vipClass/vipDetail/components/fnanceInfo.vue

@@ -1,7 +1,33 @@
 <template>
   <div class>
     <!-- 头部展示 -->
-    <div class="headWrap">
+    <statistic :col="3">
+      <statistic-item>
+        <span>课程总价</span>
+        <span>{{ totalPrice | moneyFormat }}</span>
+      </statistic-item>
+      <statistic-item>
+        <span>实收笔数</span>
+        <span>{{ feeDeductionNum }}</span>
+      </statistic-item>
+      <statistic-item>
+        <span>线上课课酬</span>
+        <span>{{ onlineClassesUnitPrice | moneyFormat }}</span>
+      </statistic-item>
+      <statistic-item>
+        <span>课酬总额</span>
+        <span>{{ totalSalary | moneyFormat }}</span>
+      </statistic-item>
+      <statistic-item>
+        <span>实收总额</span>
+        <span>{{ totalFeeDeduction | moneyFormat }}</span>
+      </statistic-item>
+      <statistic-item>
+        <span>线下课课酬</span>
+        <span>{{ offlineClassesUnitPrice | moneyFormat }}</span>
+      </statistic-item>
+    </statistic>
+    <!-- <div class="headWrap">
       <div class="left">
         <div class="headItem">
           <p>
@@ -40,7 +66,7 @@
           </p>
         </div>
       </div>
-    </div>
+    </div> -->
     <!-- 搜索栏 -->
     <el-form :inline="true"
              :model="searchForm">
@@ -207,4 +233,4 @@ export default {
 };
 </script>
 <style lang="scss" scope>
-</style>
+</style>

+ 21 - 3
src/views/vipClass/vipDetail/components/teacherRecord.vue

@@ -1,7 +1,25 @@
 <template >
   <div>
     <!-- 头部展示 -->
-    <div class="headWrap">
+    <statistic>
+      <statistic-item>
+        <span>未上课时</span>
+        <span>{{ totalClassTimes }}</span>
+      </statistic-item>
+      <statistic-item>
+        <span>已上课时</span>
+        <span>{{ currentClassTimes }}</span>
+      </statistic-item>
+      <statistic-item>
+        <span>已结算</span>
+        <span>{{ isSalaryNum }}</span>
+      </statistic-item>
+      <statistic-item>
+        <span>被投诉</span>
+        <span>{{ complaintsNum }}</span>
+      </statistic-item>
+    </statistic>
+    <!-- <div class="headWrap">
       <div class="left">
         <div class="headItem">
           <p>未上课时:<span>{{ totalClassTimes }}</span></p>
@@ -18,7 +36,7 @@
       </div>
       <div class="right">
       </div>
-    </div>
+    </div> -->
     <!-- 搜索标题 -->
     <el-form :inline="true"
              label-position="right"
@@ -582,4 +600,4 @@ export default {
 }
 </script>
 <style lang="scss" scope>
-</style>
+</style>

+ 307 - 217
src/views/vipClass/vipList.vue

@@ -1,75 +1,106 @@
 <template>
   <div class="m-container">
     <h2>
-      <div class="squrt"></div>VIP课列表
+      <div class="squrt"></div>
+      VIP课列表
     </h2>
-    <div class="newBand"
-         v-permission="'/buildVip'"
-         @click="gotoBuildVip">新建VIP课</div>
-    <div class="newBand"
-         v-permission="'export/vipGroupList'"
-         @click="onVIPCourseExport">导出VIP课</div>
-    <div class="newBand"
-         v-permission="'export/vipGroup'"
-         @click="onStudentExport"
-         style="max-width: inherit;">VIP课程续费提醒导出</div>
+    <div class="newBand" v-permission="'/buildVip'" @click="gotoBuildVip">
+      新建VIP课
+    </div>
+    <div
+      class="newBand"
+      v-permission="'export/vipGroupList'"
+      @click="onVIPCourseExport"
+    >
+      导出VIP课
+    </div>
+    <div
+      class="newBand"
+      v-permission="'export/vipGroup'"
+      @click="onStudentExport"
+      style="max-width: inherit"
+    >
+      VIP课程续费提醒导出
+    </div>
     <div class="m-core">
       <!-- 搜索类型 -->
-      <el-form :inline="true"
-               class="searchForm"
-               v-model.trim="searchForm">
+      <save-form
+        :inline="true"
+        @submit="search"
+        @reset="onReSet"
+        class="searchForm"
+        :model="searchForm"
+      >
         <!-- 状态 指导老师 活动方案-->
         <el-form-item>
-          <el-input v-model.trim="searchForm.search"
-                    @keyup.enter.native="search"
-                    placeholder="课程名称"></el-input>
+          <el-input
+            v-model.trim="searchForm.search"
+            @keyup.enter.native="search"
+            placeholder="课程名称"
+          ></el-input>
         </el-form-item>
         <el-form-item prop="orgin">
-          <el-select class="multiple"
-                     v-model.trim="searchForm.orgin"
-                     filterable
-                     clearable
-                     placeholder="请选择分部">
-            <el-option v-for="(item,index) in organList"
-                       :key="index"
-                       :label="item.name"
-                       :value="item.id"></el-option>
+          <el-select
+            class="multiple"
+            v-model.trim="searchForm.orgin"
+            filterable
+            clearable
+            placeholder="请选择分部"
+          >
+            <el-option
+              v-for="(item, index) in organList"
+              :key="index"
+              :label="item.name"
+              :value="item.id"
+            ></el-option>
           </el-select>
         </el-form-item>
         <!-- statusList -->
         <el-form-item prop="status">
-          <el-select class="multiple"
-                     v-model.trim="searchForm.status"
-                     filterable
-                     clearable
-                     placeholder="请选课程状态">
-            <el-option v-for="(item,index) in statusList"
-                       :key="index"
-                       :label="item.lable"
-                       :value="item.value"></el-option>
+          <el-select
+            class="multiple"
+            v-model.trim="searchForm.status"
+            filterable
+            clearable
+            placeholder="请选课程状态"
+          >
+            <el-option
+              v-for="(item, index) in statusList"
+              :key="index"
+              :label="item.lable"
+              :value="item.value"
+            ></el-option>
           </el-select>
         </el-form-item>
 
         <el-form-item>
-          <el-select v-model.trim="searchForm.teacherId"
-                     clearable
-                     filterable
-                     placeholder="指导老师">
-            <el-option v-for="(item,index) in teacherList"
-                       :key="index"
-                       :value="item.id"
-                       :label="item.realName"></el-option>
+          <el-select
+            v-model.trim="searchForm.teacherId"
+            clearable
+            filterable
+            placeholder="指导老师"
+          >
+            <el-option
+              v-for="(item, index) in teacherList"
+              :key="index"
+              :value="item.id"
+              :label="item.realName"
+            ></el-option>
           </el-select>
         </el-form-item>
         <el-form-item>
-          <el-select v-model.trim="searchForm.activityId"
-                     clearable
-                     filterable
-                     placeholder="活动方案">
-            <el-option v-for="(item,index) in activeList"
-                       :key="index"
-                       :value="item.id"
-                       :label="item.name"></el-option>
+          <el-select
+            v-model.trim="searchForm.activityId"
+            clearable
+            filterable
+            placeholder="活动方案"
+          >
+            <el-option
+              v-for="(item, index) in activeList"
+              :key="index"
+              :value="item.id"
+              :label="item.name"
+            ></el-option>
           </el-select>
         </el-form-item>
         <el-form-item prop="status">
@@ -86,26 +117,30 @@
         </el-form-item>
 
         <el-form-item>
-          <el-button @click="search"
-                     type="danger">搜索</el-button>
-          <el-button @click="onReSet"
-                     type="primary">重置</el-button>
+          <el-button native-type="submit" type="danger">搜索</el-button>
+          <el-button native-type="reset" type="primary">重置</el-button>
         </el-form-item>
-      </el-form>
+      </save-form>
       <!-- 查询列表 -->
       <!-- tab -->
       <div class="tableWrap">
-        <el-table style="width: 100%"
-                  :header-cell-style="{background:'#EDEEF0',color:'#444'}"
-                  :data="tableData">
-          <el-table-column align="center"
-                           width="120px"
-                           prop="id"
-                           label="课程组编号"></el-table-column>
-          <el-table-column align="center"
-                           width="200px"
-                           prop="name"
-                           label="课程名称">
+        <el-table
+          style="width: 100%"
+          :header-cell-style="{ background: '#EDEEF0', color: '#444' }"
+          :data="tableData"
+        >
+          <el-table-column
+            align="center"
+            width="120px"
+            prop="id"
+            label="课程组编号"
+          ></el-table-column>
+          <el-table-column
+            align="center"
+            width="200px"
+            prop="name"
+            label="课程名称"
+          >
             <!-- <template slot-scope="scope">
               <el-tooltip placement="top-start">
                   <div slot="content">{{ scope.row.name }}</div>
@@ -115,14 +150,14 @@
               </el-tooltip>
             </template> -->
           </el-table-column>
-          <el-table-column align="center"
-                           prop="vipGroupCategoryName"
-                           label="课程形式"></el-table-column>
-          <el-table-column align="center"
-                           prop="status"
-                           label="课程状态">
+          <el-table-column
+            align="center"
+            prop="vipGroupCategoryName"
+            label="课程形式"
+          ></el-table-column>
+          <el-table-column align="center" prop="status" label="课程状态">
             <template slot-scope="scope">
-              <div>{{ scope.row.status | formatterStatus}}</div>
+              <div>{{ scope.row.status | formatterStatus }}</div>
             </template>
           </el-table-column>
           <el-table-column align="center"
@@ -139,118 +174,165 @@
                            label="课程单价">
             <template slot-scope="scope">
               <div>
-                <p>{{scope.row.courseUnitPrice| moneyFormat }} 元</p>
+                <p>{{ scope.row.courseUnitPrice | moneyFormat }} 元</p>
               </div>
             </template>
           </el-table-column>
-          <el-table-column align="center"
-                           prop="vipGroupActivityName"
-                           label="活动方案"></el-table-column>
-          <el-table-column align="center"
-                           label="当前课次">
+          <el-table-column
+            align="center"
+            prop="vipGroupActivityName"
+            label="活动方案"
+          ></el-table-column>
+          <el-table-column align="center" label="当前课次">
             <template slot-scope="scope">
               <div>
-                <p>{{scope.row.currentClassTimes + '/' + scope.row.totalClassTimes}}</p>
+                <p>
+                  {{
+                    scope.row.currentClassTimes +
+                    "/" +
+                    scope.row.totalClassTimes
+                  }}
+                </p>
               </div>
             </template>
           </el-table-column>
-          <el-table-column align="center"
-                           label="月均消耗">
-            <template slot-scope="scope">{{ scope.row.monthConsumeRate }}%</template>
+          <el-table-column align="center" label="月均消耗">
+            <template slot-scope="scope"
+              >{{ scope.row.monthConsumeRate }}%</template
+            >
           </el-table-column>
-          <el-table-column align="center"
-                           prop="createTime"
-                           label="上次课时间"
-                           width='100px'>
-
+          <el-table-column
+            align="center"
+            prop="createTime"
+            label="上次课时间"
+            width="100px"
+          >
             <template slot-scope="scope">
               <div>
-                <p>{{scope.row.lastOverTime | formatterTime}}</p>
+                <p>{{ scope.row.lastOverTime | formatterTime }}</p>
               </div>
             </template>
           </el-table-column>
-          <el-table-column align="center"
-                           prop="paymentExpireDate"
-                           label="开课时间"
-                           width='100px'>
+          <el-table-column
+            align="center"
+            prop="paymentExpireDate"
+            label="开课时间"
+            width="100px"
+          >
             <template slot-scope="scope">
               <div>
-                <p>{{scope.row.courseStartDate | formatterTime}}</p>
+                <p>{{ scope.row.courseStartDate | formatterTime }}</p>
               </div>
             </template>
           </el-table-column>
-          <el-table-column align="center"
-                           prop="coursesExpireDate"
-                           label="结束时间"
-                           width='100px'>
+          <el-table-column
+            align="center"
+            prop="coursesExpireDate"
+            label="结束时间"
+            width="100px"
+          >
             <template slot-scope="scope">
               <div>
-                <p>{{scope.row.coursesExpireDate | formatterTime}}</p>
+                <p>{{ scope.row.coursesExpireDate | formatterTime }}</p>
               </div>
             </template>
           </el-table-column>
-          <el-table-column align="center"
-                           prop="createTime"
-                           label="申请时间"
-                           width='100px'>
+          <el-table-column
+            align="center"
+            prop="createTime"
+            label="申请时间"
+            width="100px"
+          >
             <template slot-scope="scope">
               <div>
-                <p>{{scope.row.createTime | formatterTime}}</p>
+                <p>{{ scope.row.createTime | formatterTime }}</p>
               </div>
             </template>
           </el-table-column>
-          <el-table-column align="center"
-                           prop="stopReason"
-                           label="备注">
+          <el-table-column align="center" prop="stopReason" label="备注">
           </el-table-column>
-          <el-table-column align="center"
-                           width="150px"
-                           fixed="right"
-                           label="操作">
+          <el-table-column
+            align="center"
+            width="150px"
+            fixed="right"
+            label="操作"
+          >
             <template slot-scope="scope">
               <div>
-                <el-button type="text"
-                           v-if="permission('/vipDetail')"
-                           @click="gotoVipDetail(scope.row)">查看</el-button>
+                <el-button
+                  type="text"
+                  v-if="permission('/vipDetail')"
+                  @click="gotoVipDetail(scope.row)"
+                  >查看</el-button
+                >
                 <!--
                 <el-button type="text">启动</el-button>-->
                 <!-- <el-button type="text"
                            v-if="scope.row.status <3"
                 @click='closeVip(scope.row.id)'>关闭</el-button>-->
-                <el-popover placement="top"
-                            width="160"
-                            v-if="scope.row.status < 3 && scope.row.enableDelete != 1 && permission('vipGroupManage/stopVipGroup')"
-                            :ref="scope.$index">
-                  <p style="margin-bottom:10px;">确定停止该vip课?</p>
-                  <el-input v-model.trim="stopReason"
-                            placeholder="请输入关闭原因"></el-input>
+                <el-popover
+                  placement="top"
+                  width="160"
+                  v-if="
+                    scope.row.status < 3 &&
+                    scope.row.enableDelete != 1 &&
+                    permission('vipGroupManage/stopVipGroup')
+                  "
+                  :ref="scope.$index"
+                >
+                  <p style="margin-bottom: 10px">确定停止该vip课?</p>
+                  <el-input
+                    v-model.trim="stopReason"
+                    placeholder="请输入关闭原因"
+                  ></el-input>
                   <div style="text-align: right; margin-top: 20px">
-                    <el-button size="mini"
-                               type="text"
-                               @click="onCancelVip(scope)">取消</el-button>
-                    <el-button type="primary"
-                               size="mini"
-                               @click="closeVip(scope)">确定</el-button>
+                    <el-button
+                      size="mini"
+                      type="text"
+                      @click="onCancelVip(scope)"
+                      >取消</el-button
+                    >
+                    <el-button
+                      type="primary"
+                      size="mini"
+                      @click="closeVip(scope)"
+                      >确定</el-button
+                    >
                   </div>
-                  <el-button type="text"
-                             slot="reference">停止</el-button>
+                  <el-button type="text" slot="reference">停止</el-button>
                 </el-popover>
-                <el-button type="text"
-                           @click="onVipDelete(scope.row)"
-                           v-if="scope.row.enableDelete == 1 && permission('vipGroupManage/deleteVipGroup')">删除</el-button>
-                <el-button type="text"
-                           v-if="scope.row.status > 1&&scope.row.status != 3 && permission('/vipReset')"
-                           @click="resetVip(scope.row)">修改</el-button>
+                <el-button
+                  type="text"
+                  @click="onVipDelete(scope.row)"
+                  v-if="
+                    scope.row.enableDelete == 1 &&
+                    permission('vipGroupManage/deleteVipGroup')
+                  "
+                  >删除</el-button
+                >
+                <el-button
+                  type="text"
+                  v-if="
+                    scope.row.status > 1 &&
+                    scope.row.status != 3 &&
+                    permission('/vipReset')
+                  "
+                  @click="resetVip(scope.row)"
+                  >修改</el-button
+                >
               </div>
             </template>
           </el-table-column>
         </el-table>
         <!-- 分页器 -->
-        <pagination :total="rules.total"
-                    :page.sync="rules.page"
-                    :limit.sync="rules.limit"
-                    :page-sizes="rules.page_size"
-                    @pagination="getList" />
+        <pagination
+          sync
+          :total.sync="rules.total"
+          :page.sync="rules.page"
+          :limit.sync="rules.limit"
+          :page-sizes="rules.page_size"
+          @pagination="getList"
+        />
       </div>
     </div>
   </div>
@@ -262,18 +344,18 @@ import {
   vipGroupActivity,
   closeVip,
   getVipGroupDetail,
-  deleteVipGroup
+  deleteVipGroup,
 } from "@/api/vipSeting";
 import { getTeacher, getEmployeeOrgan } from "@/api/buildTeam";
 import store from "@/store";
 import axios from "axios";
 import { getToken } from "@/utils/auth";
 import load from "@/utils/loading";
-import { permission } from '@/utils/directivePage'
+import { permission } from "@/utils/directivePage";
 export default {
   components: { pagination },
   name: "vipList",
-  data () {
+  data() {
     return {
       organId: null,
       searchForm: {
@@ -282,7 +364,7 @@ export default {
         search: null,
         orgin: null,
         status: null,
-        hasEducationalTeacherId: null
+        hasEducationalTeacherId: null,
       },
       teacherList: [],
       activeList: [],
@@ -293,7 +375,7 @@ export default {
         limit: 10, // 限制显示条数
         page: 1, // 当前页
         total: 0, // 总条数
-        page_size: [10, 20, 40, 50] // 选择限制显示条数
+        page_size: [10, 20, 40, 50], // 选择限制显示条数
       },
       statusList: [
         { lable: "未开始", value: "0" },
@@ -302,12 +384,12 @@ export default {
         { lable: "进行中", value: "2" },
         { lable: "已结束", value: "4" },
         { lable: "取消", value: "3" },
-        { lable: "暂停", value: "6" }
+        { lable: "暂停", value: "6" },
       ],
       stopReason: null, // 停止原因
     };
   },
-  created () {
+  created() {
     if (this.$route.query.searchForm) {
       this.$route.query.searchForm instanceof Object
         ? (this.searchForm = this.$route.query.searchForm)
@@ -319,49 +401,49 @@ export default {
         : (this.rules = JSON.parse(this.$route.query.rules));
     }
   },
-  mounted () {
+  mounted() {
     this.init();
   },
-  activated () {
+  activated() {
     this.init();
   },
   methods: {
-    init () {
-      getEmployeeOrgan().then(res => {
+    init() {
+      getEmployeeOrgan().then((res) => {
         if (res.code == 200) {
           this.organList = res.data;
         }
       });
 
       //   <!-- 状态 指导老师 活动方案-->
-      getTeacher({ organId: this.organId }).then(res => {
+      getTeacher({ organId: this.organId }).then((res) => {
         if (res.code == 200) {
           this.teacherList = res.data;
         }
       });
       // 获取活动方案
-      vipGroupActivity({ organId: this.organId, rows: 9999 }).then(res => {
+      vipGroupActivity({ organId: this.organId, rows: 9999 }).then((res) => {
         if (res.code == 200) {
           this.activeList = res.data.rows;
         }
       });
       this.getList();
     },
-    search () {
+    search() {
       this.rules.page = 1;
       this.getList();
     },
-    onReSet () {
+    onReSet() {
       this.searchForm = {
         teacherId: null,
         activityId: null,
         search: null,
         orgin: null,
-        status: null
+        status: null,
       };
       this.getList();
     },
-    getList () {
+    getList() {
       let params = this.searchForm;
       params.page = this.rules.page;
       params.rows = this.rules.limit;
@@ -369,7 +451,7 @@ export default {
         this.searchForm.hasEducationalTeacherId || null;
       params.organId = this.searchForm.orgin || null;
       params.status = this.searchForm.status || null;
-      getVipList(params).then(res => {
+      getVipList(params).then((res) => {
         if (res.code == 200) {
           // this.tableData = [];
           setTimeout(() => {
@@ -380,41 +462,38 @@ export default {
       });
     },
     // 跳转到vip详情
-    gotoVipDetail (row) {
+    gotoVipDetail(row) {
       let rules = JSON.stringify(this.rules);
       let searchForm = JSON.stringify(this.searchForm);
       let id = row.id;
       let name = row.name;
       this.$router.push({
         path: "/business/vipDetail",
-        query: { id, name, rules, searchForm }
+        query: { id, name },
       });
     },
-    closeVip (scope) {
+    closeVip(scope) {
       let id = scope.row.id;
-      closeVip({ vipGroupId: id, stopReason: this.stopReason }).then(
-        res => {
-          if (res.code == 200) {
-            this.$message.success("停止课程成功");
-            scope._self.$refs[scope.$index].doClose();
-            this.getList();
-          }
+      closeVip({ vipGroupId: id, stopReason: this.stopReason }).then((res) => {
+        if (res.code == 200) {
+          this.$message.success("停止课程成功");
+          scope._self.$refs[scope.$index].doClose();
+          this.getList();
         }
-      );
+      });
     },
-    onCancelVip (scope) {
-      this.stopReason = null
-      scope._self.$refs[scope.$index].doClose()
+    onCancelVip(scope) {
+      this.stopReason = null;
+      scope._self.$refs[scope.$index].doClose();
     },
-    gotoBuildVip () {
+    gotoBuildVip() {
       let rules = JSON.stringify(this.rules);
       let searchForm = JSON.stringify(this.searchForm);
       this.$router.push({
         path: "/business/buildVip",
-        query: { rules, searchForm }
       });
     },
-    onVIPCourseExport () {
+    onVIPCourseExport() {
       // 导出VIP课
       let searchForm = this.searchForm;
       let data = {
@@ -422,35 +501,35 @@ export default {
         activityId: searchForm.activityId || null,
         organId: searchForm.orgin || null,
         status: searchForm.status || null,
-        search: searchForm.search || null
+        search: searchForm.search || null,
       };
       let url = "/api-web/export/vipGroupList";
       const options = {
         method: "get",
         headers: {
-          Authorization: getToken()
+          Authorization: getToken(),
         },
         params: data,
         url,
-        responseType: "blob"
+        responseType: "blob",
       };
       this.$confirm("您确定导出VIP课吗?", "提示", {
         confirmButtonText: "确定",
         cancelButtonText: "取消",
-        type: "warning"
+        type: "warning",
       })
         .then(() => {
           load.startLoading();
           axios(options)
-            .then(res => {
+            .then((res) => {
               let blob = new Blob([res.data], {
                 // type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=utf-8'
-                type: "application/vnd.ms-excel;charset=utf-8"
+                type: "application/vnd.ms-excel;charset=utf-8",
                 //word文档为application/msword,pdf文档为application/pdf,application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=utf-8
               });
 
               let text = new Response(blob).text();
-              text.then(res => {
+              text.then((res) => {
                 // 判断是否报错
                 if (res.indexOf("code") != -1) {
                   let json = JSON.parse(res);
@@ -467,44 +546,44 @@ export default {
               });
               load.endLoading();
             })
-            .catch(error => {
+            .catch((error) => {
               this.$message.error("导出数据失败,请联系管理员");
               load.endLoading();
             });
         })
-        .catch(() => { });
+        .catch(() => {});
     },
-    onStudentExport () {
+    onStudentExport() {
       // 导出VIP课
       // let searchForm = this.searchForm;
-      let data =  {}
+      let data = {};
       let url = "/api-web/export/vipGroup";
       const options = {
         method: "get",
         headers: {
-          Authorization: getToken()
+          Authorization: getToken(),
         },
         params: data,
         url,
-        responseType: "blob"
+        responseType: "blob",
       };
       this.$confirm("VIP课程续费提醒导出?", "提示", {
         confirmButtonText: "确定",
         cancelButtonText: "取消",
-        type: "warning"
+        type: "warning",
       })
         .then(() => {
           load.startLoading();
           axios(options)
-            .then(res => {
+            .then((res) => {
               let blob = new Blob([res.data], {
                 // type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=utf-8'
-                type: "application/vnd.ms-excel;charset=utf-8"
+                type: "application/vnd.ms-excel;charset=utf-8",
                 //word文档为application/msword,pdf文档为application/pdf,application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=utf-8
               });
 
               let text = new Response(blob).text();
-              text.then(res => {
+              text.then((res) => {
                 // 判断是否报错
                 if (res.indexOf("code") != -1) {
                   let json = JSON.parse(res);
@@ -512,7 +591,8 @@ export default {
                 } else {
                   let objectUrl = URL.createObjectURL(blob);
                   let link = document.createElement("a");
-                  let fname = "VIP课程续费提醒" + new Date().getTime() + '.xlsx'; //下载文件的名字
+                  let fname =
+                    "VIP课程续费提醒" + new Date().getTime() + ".xlsx"; //下载文件的名字
                   link.href = objectUrl;
                   link.setAttribute("download", fname);
                   document.body.appendChild(link);
@@ -521,15 +601,15 @@ export default {
               });
               load.endLoading();
             })
-            .catch(error => {
+            .catch((error) => {
               this.$message.error("导出数据失败,请联系管理员");
               load.endLoading();
             });
         })
-        .catch(() => { });
+        .catch(() => {});
     },
     // 修改vip
-    resetVip (row) {
+    resetVip(row) {
       let id = row.id;
       let organId = row.organId;
       let educationalTeacherId = row.educationalTeacherId;
@@ -537,34 +617,44 @@ export default {
       let rules = JSON.stringify(this.rules);
       let searchForm = JSON.stringify(this.searchForm);
       let name = row.name;
-      let endTimeStr = row.coursesExpireDate
-      let startTimeStr = row.courseStartDate
+      let endTimeStr = row.coursesExpireDate;
+      let startTimeStr = row.courseStartDate;
       this.$router.push({
         path: "/business/vipReset",
-        query: { id, educationalTeacherId, organId, userId, rules, searchForm, name, endTimeStr, startTimeStr }
+        query: {
+          id,
+          educationalTeacherId,
+          organId,
+          userId,
+          name,
+          endTimeStr,
+          startTimeStr,
+        },
       });
     },
     // 删除VIP
-    onVipDelete (row) {
+    onVipDelete(row) {
       this.$confirm("您确定删除该VIP课吗?", "提示", {
         confirmButtonText: "确定",
         cancelButtonText: "取消",
-        type: "warning"
-      }).then(() => {
-        deleteVipGroup({ vipGroupId: row.id }).then(res => {
-          if (res.code == 200) {
-            this.$message.success("删除成功");
-            this.getList();
-          }
+        type: "warning",
+      })
+        .then(() => {
+          deleteVipGroup({ vipGroupId: row.id }).then((res) => {
+            if (res.code == 200) {
+              this.$message.success("删除成功");
+              this.getList();
+            }
+          });
         })
-      }).catch(() => { });
+        .catch(() => {});
+    },
+    permission(str) {
+      return permission(str);
     },
-    permission (str) {
-      return permission(str)
-    }
   },
   filters: {
-    formatterTime (val) {
+    formatterTime(val) {
       let result;
       if (val) {
         result = val.split(" ")[0];
@@ -573,7 +663,7 @@ export default {
       }
       return result;
     },
-    formatterStatus (val) {
+    formatterStatus(val) {
       let arr = [
         "未开始",
         "报名中",
@@ -581,11 +671,11 @@ export default {
         "取消",
         "已结束",
         "报名结束",
-        "暂停"
+        "暂停",
       ];
       return arr[val];
-    }
-  }
+    },
+  },
 };
 </script>
 <style lang="scss" scoped>

+ 332 - 241
src/views/workBenchManager/classFeesIsOk.vue

@@ -2,252 +2,343 @@
 <template>
   <div class="m-container">
     <h2>
-      <div class="squrt"></div>课酬确认
+      <div class="squrt"></div>
+      课酬确认
     </h2>
     <div class="m-core">
-      <div @click="openSalary"
-           v-if="isOpen == 0"
-           v-permission="'courseScheduleTeacherSalary/openSalaryConfirm'"
-           class="newBand">开启课酬确认</div>
-      <div v-if="isOpen == 1"
-           @click="closeSalary"
-           v-permission="'courseScheduleTeacherSalary/closeSalaryConfirm'"
-           class="newBand">关闭课酬确认</div>
-      <el-form :inline="true"
-               :model="searchForm">
+      <div
+        @click="openSalary"
+        v-if="isOpen == 0"
+        v-permission="'courseScheduleTeacherSalary/openSalaryConfirm'"
+        class="newBand"
+      >
+        开启课酬确认
+      </div>
+      <div
+        v-if="isOpen == 1"
+        @click="closeSalary"
+        v-permission="'courseScheduleTeacherSalary/closeSalaryConfirm'"
+        class="newBand"
+      >
+        关闭课酬确认
+      </div>
+      <save-form
+        :inline="true"
+        @submit="search"
+        @reset="onReSet"
+        :model="searchForm"
+      >
         <el-form-item>
-          <el-input v-model.trim="searchForm.search"
-                    @keyup.enter.native="search"
-                    placeholder="课程编号、课程组名称"></el-input>
+          <el-input
+            v-model.trim="searchForm.search"
+            @keyup.enter.native="search"
+            placeholder="课程编号、课程组名称"
+          ></el-input>
         </el-form-item>
         <el-form-item prop="organId">
-          <el-select class="multiple"
-                     v-model.trim="searchForm.organIdList"
-                     filterable
-                     clearable
-                     placeholder="请选择分部">
-            <el-option v-for="(item,index) in organList"
-                       :key="index"
-                       :label="item.name"
-                       :value="item.id"></el-option>
+          <el-select
+            class="multiple"
+            v-model.trim="searchForm.organIdList"
+            filterable
+            clearable
+            placeholder="请选择分部"
+          >
+            <el-option
+              v-for="(item, index) in organList"
+              :key="index"
+              :label="item.name"
+              :value="item.id"
+            ></el-option>
           </el-select>
         </el-form-item>
         <el-form-item prop="organId">
-          <el-select class="multiple"
-                     v-model.trim="searchForm.groupType"
-                     filterable
-                     clearable
-                     placeholder="请选择课程组类型">
-            <el-option v-for="(item,index) in groupTypeList"
-                       :key="index"
-                       :label="item.label"
-                       :value="item.value"></el-option>
+          <el-select
+            class="multiple"
+            v-model.trim="searchForm.groupType"
+            filterable
+            clearable
+            placeholder="请选择课程组类型"
+          >
+            <el-option
+              v-for="(item, index) in groupTypeList"
+              :key="index"
+              :label="item.label"
+              :value="item.value"
+            ></el-option>
           </el-select>
         </el-form-item>
         <el-form-item>
-          <el-select placeholder="老师姓名"
-                     v-model="searchForm.teacherId"
-                     clearable
-                     filterable>
-            <el-option v-for="(item,index) in teacherList"
-                       :label="item.realName"
-                       :value="item.id"
-                       :key="index"></el-option>
+          <el-select
+            placeholder="老师姓名"
+            v-model="searchForm.teacherId"
+            clearable
+            filterable
+          >
+            <el-option
+              v-for="(item, index) in teacherList"
+              :label="item.realName"
+              :value="item.id"
+              :key="index"
+            ></el-option>
           </el-select>
         </el-form-item>
         <el-form-item>
-          <el-select placeholder="正常签到"
-                     v-model="searchForm.signInStatus"
-                     clearable>
-            <el-option label="是"
-                       value="1"></el-option>
-            <el-option label="否"
-                       value="0"></el-option>
+          <el-select
+            placeholder="正常签到"
+            v-model="searchForm.signInStatus"
+            clearable
+          >
+            <el-option label="是" value="1"></el-option>
+            <el-option label="否" value="0"></el-option>
           </el-select>
         </el-form-item>
         <el-form-item>
-          <el-select placeholder="正常签退"
-                     v-model="searchForm.signOutStatus"
-                     clearable>
-            <el-option label="是"
-                       value="1"></el-option>
-            <el-option label="否"
-                       value="0"></el-option>
+          <el-select
+            placeholder="正常签退"
+            v-model="searchForm.signOutStatus"
+            clearable
+          >
+            <el-option label="是" value="1"></el-option>
+            <el-option label="否" value="0"></el-option>
           </el-select>
         </el-form-item>
         <el-form-item>
-          <el-select placeholder="状态"
-                     v-model="searchForm.confirmStatus"
-                     clearable>
-            <el-option label="待确定"
-                       value="1"></el-option>
-            <el-option label="已确定"
-                       value="2"></el-option>
-            <el-option label="已完成"
-                       value="3"></el-option>
+          <el-select
+            placeholder="状态"
+            v-model="searchForm.confirmStatus"
+            clearable
+          >
+            <el-option label="待确定" value="1"></el-option>
+            <el-option label="已确定" value="2"></el-option>
+            <el-option label="已完成" value="3"></el-option>
           </el-select>
         </el-form-item>
         <el-form-item>
-          <el-date-picker :clearable="false"
-                          v-model="searchForm.month"
-                          type="month"
-                          value-format="yyyy-MM"
-                          placeholder="选择年月"></el-date-picker>
+          <el-date-picker
+            :clearable="false"
+            v-model="searchForm.month"
+            type="month"
+            value-format="yyyy-MM"
+            placeholder="选择年月"
+          ></el-date-picker>
         </el-form-item>
         <el-form-item>
-          <el-button type="danger"
-                     @click="search">搜索</el-button>
-          <el-button @click="onReSet"
-                     type="primary">重置</el-button>
+          <el-button type="danger" native-type="submit">搜索</el-button>
+          <el-button native-type="reset" type="primary">重置</el-button>
           <!-- export/isSettlementCourseSalarys -->
-          <el-button @click="onExport"
-                     type="primary"
-                     v-permission="'export/exercisesSituations'"
-                     style=" background: #14928a; border:1px solid #14928a;">导出</el-button>
+          <el-button
+            @click="onExport"
+            type="primary"
+            v-permission="'export/exercisesSituations'"
+            style="background: #14928a; border: 1px solid #14928a"
+            >导出</el-button
+          >
         </el-form-item>
-      </el-form>
+      </save-form>
       <div class="tableWrap">
-        <el-table style="width: 100%"
-                  :header-cell-style="{background:'#EDEEF0',color:'#444'}"
-                  :data="tableList">
-          <el-table-column align="center"
-                           prop="organName"
-                           label="分部"></el-table-column>
-          <el-table-column align="center"
-                           prop="groupType"
-                           width="100"
-                           label="课程组类型">
-            <template slot-scope="scope">{{scope.row.groupType | coursesType}}</template>
+        <el-table
+          style="width: 100%"
+          :header-cell-style="{ background: '#EDEEF0', color: '#444' }"
+          :data="tableList"
+        >
+          <el-table-column
+            align="center"
+            prop="organName"
+            label="分部"
+          ></el-table-column>
+          <el-table-column
+            align="center"
+            prop="groupType"
+            width="100"
+            label="课程组类型"
+          >
+            <template slot-scope="scope">{{
+              scope.row.groupType | coursesType
+            }}</template>
           </el-table-column>
-          <el-table-column align="center"
-                           prop="courseScheduleId"
-                           label="课程编号"></el-table-column>
-          <el-table-column align="center"
-                           prop="courseScheduleId"
-                           width="150"
-                           label="时间">
-            <template slot-scope="scope">{{scope.row.startClassTime | dateForMinFormat}}</template>
+          <el-table-column
+            align="center"
+            prop="courseScheduleId"
+            label="课程编号"
+          ></el-table-column>
+          <el-table-column
+            align="center"
+            prop="courseScheduleId"
+            width="150"
+            label="时间"
+          >
+            <template slot-scope="scope">{{
+              scope.row.startClassTime | dateForMinFormat
+            }}</template>
           </el-table-column>
-          <el-table-column align="center"
-                           prop="courseName"
-                           width="120"
-                           label="课程名称"></el-table-column>
-          <el-table-column align="center"
-                           prop="teacherId"
-                           label="老师编号"></el-table-column>
-          <el-table-column align="center"
-                           prop="teacherName"
-                           label="老师姓名"></el-table-column>
-          <el-table-column align="center"
-                           prop="courseScheduleId"
-                           width="150"
-                           label="签到时间">
+          <el-table-column
+            align="center"
+            prop="courseName"
+            width="120"
+            label="课程名称"
+          ></el-table-column>
+          <el-table-column
+            align="center"
+            prop="teacherId"
+            label="老师编号"
+          ></el-table-column>
+          <el-table-column
+            align="center"
+            prop="teacherName"
+            label="老师姓名"
+          ></el-table-column>
+          <el-table-column
+            align="center"
+            prop="courseScheduleId"
+            width="150"
+            label="签到时间"
+          >
             <template slot-scope="scope">
-              <p :class="scope.row.signInStatus == 1?'':'red'">{{scope.row.signInTime | dateForMinFormat}}</p>
-              <p :class="scope.row.signInStatus == 1?'':'red'">{{scope.row.signInStatus | attendanceType }}</p>
-              <p class="red"
-                 v-if="!scope.row.signInStatus&&scope.row.signInStatus!=0">未签到</p>
+              <p :class="scope.row.signInStatus == 1 ? '' : 'red'">
+                {{ scope.row.signInTime | dateForMinFormat }}
+              </p>
+              <p :class="scope.row.signInStatus == 1 ? '' : 'red'">
+                {{ scope.row.signInStatus | attendanceType }}
+              </p>
+              <p
+                class="red"
+                v-if="!scope.row.signInStatus && scope.row.signInStatus != 0"
+              >
+                未签到
+              </p>
             </template>
           </el-table-column>
-          <el-table-column align="center"
-                           prop="courseScheduleId"
-                           width="150"
-                           label="签退时间">
+          <el-table-column
+            align="center"
+            prop="courseScheduleId"
+            width="150"
+            label="签退时间"
+          >
             <template slot-scope="scope">
-              <p :class="scope.row.signOutStatus == 1?'':'red'">{{scope.row.signOutTime | dateForMinFormat}}</p>
-              <p :class="scope.row.signOutStatus == 1?'':'red'">{{scope.row.signOutStatus | attendanceOutType}}</p>
-              <p class="red"
-                 v-if="!scope.row.signOutStatus&&scope.row.signOutStatus!=0">未签退</p>
+              <p :class="scope.row.signOutStatus == 1 ? '' : 'red'">
+                {{ scope.row.signOutTime | dateForMinFormat }}
+              </p>
+              <p :class="scope.row.signOutStatus == 1 ? '' : 'red'">
+                {{ scope.row.signOutStatus | attendanceOutType }}
+              </p>
+              <p
+                class="red"
+                v-if="!scope.row.signOutStatus && scope.row.signOutStatus != 0"
+              >
+                未签退
+              </p>
             </template>
           </el-table-column>
           <!-- <el-table-column align="center" prop="actualReceipts" label="实际收款">
             <template slot-scope="scope">{{(scope.row.actualReceipts ? scope.row.actualReceipts : 0) + '元'}}</template>
           </el-table-column> -->
           <!-- expectSalary -->
-          <el-table-column align="center"
-                           prop="actualSalary"
-                           label="应发课酬">
-            <template slot-scope="scope">{{(scope.row.actualSalary) |moneyFormat }}元</template>
+          <el-table-column align="center" prop="actualSalary" label="应发课酬">
+            <template slot-scope="scope"
+              >{{ scope.row.actualSalary | moneyFormat }}元</template
+            >
           </el-table-column>
-          <el-table-column align="center"
-                           prop="reduceSalary"
-                           label="课酬扣款">
-            <template slot-scope="scope">{{(scope.row.reduceSalary)  | moneyFormat}}元</template>
+          <el-table-column align="center" prop="reduceSalary" label="课酬扣款">
+            <template slot-scope="scope"
+              >{{ scope.row.reduceSalary | moneyFormat }}元</template
+            >
           </el-table-column>
-          <el-table-column align="center"
-                           prop="finalSalary"
-                           label="结算课酬">
-            <template slot-scope="scope">{{(scope.row.finalSalary)  | moneyFormat}}元</template>
+          <el-table-column align="center" prop="finalSalary" label="结算课酬">
+            <template slot-scope="scope"
+              >{{ scope.row.finalSalary | moneyFormat }}元</template
+            >
           </el-table-column>
-          <el-table-column align="center"
-                           prop
-                           label="状态"
-                           fixed="right">
-            <template slot-scope="scope">{{scope.row.confirmStatus | confirmFilter }}</template>
+          <el-table-column align="center" prop label="状态" fixed="right">
+            <template slot-scope="scope">{{
+              scope.row.confirmStatus | confirmFilter
+            }}</template>
           </el-table-column>
-          <el-table-column align="center"
-                           prop="memo"
-                           label="备注"
-                           width="300"
-                           fixed="right"></el-table-column>
-          <el-table-column align="center"
-                           label="操作"
-                           fixed="right">
+          <el-table-column
+            align="center"
+            prop="memo"
+            label="备注"
+            width="300"
+            fixed="right"
+          ></el-table-column>
+          <el-table-column align="center" label="操作" fixed="right">
             <template slot-scope="scope">
-              <el-button type="text"
-                         @click="resetSalary(scope.row)">课酬调整</el-button>
+              <el-button type="text" @click="resetSalary(scope.row)"
+                >课酬调整</el-button
+              >
             </template>
           </el-table-column>
         </el-table>
-        <pagination :total="rules.total"
-                    :page.sync="rules.page"
-                    :limit.sync="rules.limit"
-                    :page-sizes="rules.page_size"
-                    @pagination="getList" />
+        <pagination
+          sync
+          :total.sync="rules.total"
+          :page.sync="rules.page"
+          :limit.sync="rules.limit"
+          :page-sizes="rules.page_size"
+          @pagination="getList"
+        />
       </div>
     </div>
-    <el-dialog title="课酬调整"
-               :visible.sync="dialogVisible"
-               width="400px">
+    <el-dialog title="课酬调整" :visible.sync="dialogVisible" width="400px">
       <div>
-        <el-form ref="visibleForm"
-                 :model="visibleForm"
-                 class="visibleForm"
-                 :inline="true"
-                 label-width="60px">
-          <el-form-item label="应发"
-                        :rules="[{ required: true, message: '请填写应发数',trigger: 'blur'}]"
-                        prop="actualSalary">
-            <el-input v-model.trim="visibleForm.actualSalary"
-                      type="number"
-                      @mousewheel.native.prevent></el-input>
+        <el-form
+          ref="visibleForm"
+          :model="visibleForm"
+          class="visibleForm"
+          :inline="true"
+          label-width="60px"
+        >
+          <el-form-item
+            label="应发"
+            :rules="[
+              { required: true, message: '请填写应发数', trigger: 'blur' },
+            ]"
+            prop="actualSalary"
+          >
+            <el-input
+              v-model.trim="visibleForm.actualSalary"
+              type="number"
+              @mousewheel.native.prevent
+            ></el-input>
           </el-form-item>
-          <el-form-item label="扣款"
-                        :rules="[{ required: true, message: '请填写扣款数',trigger: 'blur'}]"
-                        prop="reduceSalary">
-            <el-input v-model.trim="visibleForm.reduceSalary"
-                      type="number"
-                      @mousewheel.native.prevent></el-input>
+          <el-form-item
+            label="扣款"
+            :rules="[
+              { required: true, message: '请填写扣款数', trigger: 'blur' },
+            ]"
+            prop="reduceSalary"
+          >
+            <el-input
+              v-model.trim="visibleForm.reduceSalary"
+              type="number"
+              @mousewheel.native.prevent
+            ></el-input>
           </el-form-item>
           <el-form-item label="实发">
-            <el-input v-model.trim="visibleForm.finalSalary"
-                      disabled
-                      type="number"
-                      @mousewheel.native.prevent></el-input>
+            <el-input
+              v-model.trim="visibleForm.finalSalary"
+              disabled
+              type="number"
+              @mousewheel.native.prevent
+            ></el-input>
           </el-form-item>
-          <el-form-item label="说明"
-                        :rules="[{ required: true, message: '请填写说明',trigger: 'blur'}]"
-                        prop="memo">
-            <el-input type="textarea"
-                      :rows="5"
-                      v-model.trim="visibleForm.memo"></el-input>
+          <el-form-item
+            label="说明"
+            :rules="[
+              { required: true, message: '请填写说明', trigger: 'blur' },
+            ]"
+            prop="memo"
+          >
+            <el-input
+              type="textarea"
+              :rows="5"
+              v-model.trim="visibleForm.memo"
+            ></el-input>
           </el-form-item>
         </el-form>
       </div>
       <div slot="footer">
         <el-button @click="dialogVisible = false">取 消</el-button>
-        <el-button type="primary"
-                   @click="subreset">确 定</el-button>
+        <el-button type="primary" @click="subreset">确 定</el-button>
       </div>
     </el-dialog>
   </div>
@@ -263,12 +354,12 @@ import {
   findIsSettlementCourseSalarys,
   openSalaryConfirm,
   closeSalaryConfirm,
-  teacherSalaryModifyLog
+  teacherSalaryModifyLog,
 } from "@/api/journal";
 import { courseListType } from "@/utils/searchArray";
 export default {
   components: { pagination },
-  data () {
+  data() {
     return {
       searchForm: {
         search: null,
@@ -278,7 +369,7 @@ export default {
         signInStatus: null,
         signOutStatus: null,
         month: null,
-        confirmStatus: null
+        confirmStatus: null,
       },
       dialogVisible: false,
       visibleForm: {
@@ -287,7 +378,7 @@ export default {
         actualSalary: null,
         courseScheduleId: null,
         teacherId: null,
-        memo: null
+        memo: null,
       },
       isOpen: null,
       activeRow: null,
@@ -300,20 +391,20 @@ export default {
         limit: 10, // 限制显示条数
         page: 1, // 当前页
         total: 0, // 总条数
-        page_size: [10, 20, 40, 50] // 选择限制显示条数
-      }
+        page_size: [10, 20, 40, 50], // 选择限制显示条数
+      },
     };
   },
   //生命周期 - 创建完成(可以访问当前this实例)
-  created () { },
+  created() {},
   //生命周期 - 挂载完成(可以访问DOM元素)
-  mounted () {
-    getTeacher().then(res => {
+  mounted() {
+    getTeacher().then((res) => {
       if (res.code == 200) {
         this.teacherList = res.data;
       }
     });
-    getEmployeeOrgan().then(res => {
+    getEmployeeOrgan().then((res) => {
       if (res.code == 200) {
         this.organList = res.data;
       }
@@ -321,11 +412,11 @@ export default {
     // 获取分部
     this.init();
   },
-  activated () {
+  activated() {
     this.init();
   },
   methods: {
-    init () {
+    init() {
       if (!this.searchForm.month) {
         var now = new Date();
         this.searchForm.month = new Date(
@@ -337,9 +428,9 @@ export default {
 
       this.getList();
     },
-    getList () {
+    getList() {
       let obj = this.getDate();
-      findIsSettlementCourseSalarys(obj).then(res => {
+      findIsSettlementCourseSalarys(obj).then((res) => {
         if (res.code == 200) {
           this.isOpen = res.data.isOpenConfirm;
           this.tableList = res.data.pageInfo.rows;
@@ -347,11 +438,11 @@ export default {
         }
       });
     },
-    search () {
+    search() {
       this.rules.page = 1;
       this.getList();
     },
-    onReSet () {
+    onReSet() {
       this.searchForm = {
         search: null,
         organIdList: null,
@@ -360,11 +451,11 @@ export default {
         signInStatus: null,
         signOutStatus: null,
         month: null,
-        confirmStatus: null
+        confirmStatus: null,
       };
       this.search();
     },
-    getDate () {
+    getDate() {
       let obj = {
         search: this.searchForm.search,
         organIdList: this.searchForm.organIdList || null,
@@ -375,17 +466,17 @@ export default {
         month: this.searchForm.month || null,
         confirmStatus: this.searchForm.confirmStatus || null,
         page: this.rules.page,
-        rows: this.rules.limit
+        rows: this.rules.limit,
       };
       return obj;
     },
-    openSalary () {
+    openSalary() {
       this.$confirm("您确定开启课酬确认?", "提示", {
         confirmButtonText: "确定",
         cancelButtonText: "取消",
-        type: "warning"
+        type: "warning",
       }).then(() => {
-        openSalaryConfirm({ month: this.searchForm.month }).then(res => {
+        openSalaryConfirm({ month: this.searchForm.month }).then((res) => {
           if (res.code == 200) {
             this.$message.success("开启成功");
             this.getList();
@@ -393,13 +484,13 @@ export default {
         });
       });
     },
-    closeSalary () {
+    closeSalary() {
       this.$confirm("您确定关闭课酬确认?", "提示", {
         confirmButtonText: "确定",
         cancelButtonText: "取消",
-        type: "warning"
+        type: "warning",
       }).then(() => {
-        closeSalaryConfirm({ month: this.searchForm.month }).then(res => {
+        closeSalaryConfirm({ month: this.searchForm.month }).then((res) => {
           if (res.code == 200) {
             this.$message.success("关闭成功");
             this.getList();
@@ -407,35 +498,35 @@ export default {
         });
       });
     },
-    onExport () {
+    onExport() {
       let url = "/api-web/export/isSettlementCourseSalarys";
       let obj = this.getDate();
       const options = {
         method: "get",
         headers: {
-          Authorization: getToken()
+          Authorization: getToken(),
         },
         url,
         params: obj,
-        responseType: "blob"
+        responseType: "blob",
       };
 
       this.$confirm("您确定导出列表?", "提示", {
         confirmButtonText: "确定",
         cancelButtonText: "取消",
-        type: "warning"
+        type: "warning",
       })
         .then(() => {
           load.startLoading();
           axios(options)
-            .then(res => {
+            .then((res) => {
               let blob = new Blob([res.data], {
                 // type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=utf-8',
-                type: "application/vnd.ms-excel;charset=utf-8"
+                type: "application/vnd.ms-excel;charset=utf-8",
                 // word文档为application/msword,pdf文档为application/pdf,application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=utf-8
               });
               let text = new Response(blob).text();
-              text.then(res => {
+              text.then((res) => {
                 // 判断是否报错
                 if (res.indexOf("code") != -1) {
                   let json = JSON.parse(res);
@@ -464,37 +555,37 @@ export default {
 
               load.endLoading();
             })
-            .catch(error => {
+            .catch((error) => {
               this.$message.error("导出数据失败,请联系管理员");
               load.endLoading();
             });
         })
-        .catch(() => { });
+        .catch(() => {});
     },
-    resetSalary (row) {
+    resetSalary(row) {
       let obj = {
         finalSalary: row.finalSalary, // 实发
         reduceSalary: row.reduceSalary, // 扣款
         actualSalary: row.actualSalary, // 应发
         courseScheduleId: row.courseScheduleId,
         memo: row.memo,
-        teacherId: row.teacherId
+        teacherId: row.teacherId,
       };
-      this.$set(this, 'visibleForm', obj)
-      console.log(this.visibleForm.finalSalary)
+      this.$set(this, "visibleForm", obj);
+      console.log(this.visibleForm.finalSalary);
       this.dialogVisible = true;
     },
-    subreset () {
-      this.$refs["visibleForm"].validate(flag => {
+    subreset() {
+      this.$refs["visibleForm"].validate((flag) => {
         if (flag) {
           let obj = {
             courseScheduleId: this.visibleForm.courseScheduleId,
             currentExpectSalary: this.visibleForm.actualSalary,
             currentReduceSalary: this.visibleForm.reduceSalary,
             memo: this.visibleForm.memo,
-            teacherId: this.visibleForm.teacherId
+            teacherId: this.visibleForm.teacherId,
           };
-          teacherSalaryModifyLog(obj).then(res => {
+          teacherSalaryModifyLog(obj).then((res) => {
             if (res.code == 200) {
               this.dialogVisible = false;
               this.$message.success("调整成功");
@@ -503,42 +594,42 @@ export default {
           });
         }
       });
-    }
+    },
   },
   filters: {
-    confirmFilter (val) {
+    confirmFilter(val) {
       if (val) {
         let template = {
           1: "待确认",
           2: "已确认",
-          3: "已完成"
+          3: "已完成",
         };
         return template[val];
       }
-    }
+    },
   },
   computed: {
-    getActualsalary () {
+    getActualsalary() {
       // 应发
       return this.visibleForm.actualSalary;
     },
-    getReduceSalary () {
+    getReduceSalary() {
       // 扣款
       return this.visibleForm.reduceSalary;
     },
   },
   watch: {
-    getActualsalary (val) {
+    getActualsalary(val) {
       this.visibleForm.finalSalary = parseFloat(
         val - this.getReduceSalary > 0 ? val - this.getReduceSalary : 0
       );
     },
-    getReduceSalary (val) {
+    getReduceSalary(val) {
       this.visibleForm.finalSalary = parseFloat(
         this.getActualsalary - val > 0 ? this.getActualsalary - val : 0
       );
     },
-    dialogVisible (val) {
+    dialogVisible(val) {
       if (!val) {
         this.visibleForm = {
           expectSalary: null,
@@ -546,12 +637,12 @@ export default {
           actualSalary: null,
           courseScheduleId: null,
           teacherId: null,
-          memo: null
+          memo: null,
         };
         this.$refs["visibleForm"].resetFields();
       }
-    }
-  }
+    },
+  },
 };
 </script>
 <style lang='scss' scoped>
@@ -564,4 +655,4 @@ export default {
     width: 225px !important;
   }
 }
-</style>
+</style>

+ 51 - 0
src/views/workBenchManager/journal/index111.vue

@@ -0,0 +1,51 @@
+<template>
+  <div class="m-container">
+    <h2>
+      <div class="squrt"></div>系统日志
+    </h2>
+    <div class="m-core">
+      <location-hash v-model="activeIndex">
+        <el-tabs v-model="activeIndex">
+          <el-tab-pane label="系统通知" lazy v-if="permissionList.journalItem" name="SYSTEM">
+            <list :type="activeIndex" />
+          </el-tab-pane>
+          <el-tab-pane label="学生申诉" lazy v-if="permissionList.studentComplain" name="STUDENT">
+            <list :type="activeIndex" />
+          </el-tab-pane>
+          <!-- <el-tab-pane label="退团退课" value="MUSICGROUP"></el-tab-pane> -->
+          <el-tab-pane label="请假处理" lazy v-if="permissionList.leaveOperation" name="LEAVE">
+            <list :type="activeIndex" />
+          </el-tab-pane>
+          <el-tab-pane label="VIP申请审核" lazy v-if="permissionList.vipApply" name="VIPAPPLY">
+            <list :type="activeIndex" />
+          </el-tab-pane>
+        </el-tabs>
+      </location-hash>
+    </div>
+  </div>
+</template>
+<script>
+import { permission } from '@/utils/directivePage'
+import List from './model/list'
+export default {
+  name: 'journal',
+  components: { List },
+  data () {
+    const query = this.$route.query;
+    return {
+      activeIndex: query.opt || 'SYSTEM',
+      permissionList: {
+        journalItem: permission("/journalItem"),
+        studentComplain: permission("/studentComplain"),
+        musicGroupCourse: permission("/musicGroupCourse"),
+        leaveOperation: permission("/leaveOperation"),
+        vipApply: permission("/vipApply")
+      },
+    }
+  },
+  mounted() {
+  },
+  methods: {
+  }
+}
+</script>

+ 182 - 0
src/views/workBenchManager/journal/model/leave.vue

@@ -0,0 +1,182 @@
+<template>
+    <div>
+        <el-form ref="leaveForm"
+                 :model="leaveForm"
+                 class="leaveForm"
+                 label-width="100px">
+            <el-alert title="已拒绝" show-icon center v-if="leaveForm.status == 'REJECT'" :closable="false" class="alert" type="error"></el-alert>
+            <el-alert title="已同意" show-icon center v-if="leaveForm.status == 'PASS'" :closable="false" class="alert" type="success"></el-alert>
+            <el-form-item label="开始时间">
+                <el-input disabled v-model.trim="leaveForm.startTime"></el-input>
+            </el-form-item>
+            <el-form-item label="结束时间">
+                <el-input disabled v-model.trim="leaveForm.endTime"></el-input>
+            </el-form-item>
+            <el-form-item label="备注">
+                <el-input type="textarea" disabled v-model.trim="leaveForm.remark"></el-input>
+            </el-form-item>
+        </el-form>
+        <!-- vip -->
+        <el-table :data="vipCourse"
+                    style="width: 100%"
+                    :header-cell-style="{background:'#EDEEF0',color:'#444'}">
+            <el-table-column label="编号" width="100px" prop="before.id"></el-table-column>
+            <el-table-column label="类型"
+                            width="100px">
+                <template slot-scope="scope">
+                    {{ scope.row.before.type == "VIP" ? 'VIP课' : '乐团课' }}
+                </template>
+            </el-table-column>
+            <el-table-column label="班名"
+                            width="140px">
+                <template slot-scope="scope">
+                    <tooltip :content="scope.row.before.name" />
+                </template>
+            </el-table-column>
+            <el-table-column label="调整前日期">
+                <template slot-scope="scope">
+                    {{ scope.row.before.classDate | formatTimer }}
+                    {{ scope.row.before.startClassTime | getFormatTime(scope.row.before.endClassTime) }}
+                </template>
+            </el-table-column>
+            <!-- <el-table-column label="调整前时间">
+                <template slot-scope="scope">
+                    {{ scope.row.before.startClassTime | getFormatTime(scope.row.before.endClassTime) }}
+                </template>
+            </el-table-column> -->
+            <el-table-column label="调整后日期">
+            <template slot-scope="scope"
+                        v-if="scope.row.before.type == 'VIP'">
+                {{ scope.row.after.classDate | formatTimer }}
+                {{ scope.row.after.startClassTime | getFormatTime(scope.row.after.endClassTime) }}
+            </template>
+            </el-table-column>
+            <!-- <el-table-column label="调整后时间">
+                <template slot-scope="scope"
+                            v-if="scope.row.before.type == 'VIP'">
+                    {{ scope.row.after.startClassTime | getFormatTime(scope.row.after.endClassTime) }}
+                </template>
+            </el-table-column> -->
+        </el-table>
+
+        <el-table :data="musicGroupCourse"
+                    style="width: 100%; padding-top: 10px;"
+                    :header-cell-style="{background:'#EDEEF0',color:'#444'}">
+            <el-table-column label="乐团编号"
+                            prop="before.musicGroupId">
+            </el-table-column>
+            <el-table-column label="类型">
+            <template slot-scope="scope">
+                {{ scope.row.before.type == "VIP" ? 'VIP课' : '乐团课' }}
+            </template>
+            </el-table-column>
+            <el-table-column label="班名">
+                <template slot-scope="scope">
+                    <tooltip :content="scope.row.before.name" />
+                </template>
+            </el-table-column>
+            <el-table-column label="调整前日期">
+                <template slot-scope="scope">
+                    {{ scope.row.before.classDate | formatTimer }}
+                </template>
+            </el-table-column>
+            <el-table-column label="上课时间">
+                <template slot-scope="scope">
+                    {{ scope.row.before.startClassTime | getFormatTime(scope.row.before.endClassTime) }}
+                </template>
+            </el-table-column>
+        </el-table>
+        <div slot="footer" class="dialog-footer" v-permission="'teacherLeaveRecord/approve'" v-if="leaveForm.status == 'ING'">
+            <el-button type="primary" @click="onSubmit('leaveForm', 'PASS')">确 定</el-button>
+            <el-button type="danger" @click="onSubmit('leaveForm', 'REJECT')">拒 绝</el-button>
+        </div>
+    </div>
+</template>
+
+<script>
+import { leaveQueryDetail, approve } from '@/api/journal'
+import Tooltip from '@/components/Tooltip'
+import dayjs from 'dayjs'
+export default {
+    props: ['dialogDetail'],
+    components: { Tooltip },
+    data() {
+        return {
+            leaveForm: {},
+            musicGroupCourse: [],
+            vipCourse: [],
+        }
+    },
+    mounted() {
+        this.__init()
+    },
+    methods: {
+        async __init() {
+            let { memo } = this.dialogDetail
+            memo = memo ? JSON.parse(memo) : null
+            if(!memo) { // 判断是否有参数
+                this.$message.error('参数有误')
+                return
+            }
+            await leaveQueryDetail({ id: memo.leaveRecordId }).then(res => {
+                let result = res.data
+                if (res.code == 200) {
+                    this.leaveForm = result
+                    let tempJson = result.coursesScheduleJson ? JSON.parse(result.coursesScheduleJson) : []
+                    let musicGroupCourse = []
+                    let vipCourse = []
+                    tempJson.forEach(item => {
+                        if (item.before.type == 'VIP') {
+                            vipCourse.push(item)
+                        } else {
+                            musicGroupCourse.push(item)
+                        }
+                    })
+                    this.musicGroupCourse = musicGroupCourse
+                    this.vipCourse = vipCourse
+                }
+            })
+        },
+        async onSubmit(formName, type) {
+            const params = {
+                id: this.leaveForm.id,
+                status: type,
+                userId: this.leaveForm.userId
+            }
+            const str = type == 'PASS' ? '同意' : '拒绝'
+            this.$confirm(`您确定${str}该请假申请吗?`, '提示', {
+                confirmButtonText: '确定',
+                cancelButtonText: '取消',
+                type: 'warning'
+            }).then(async () => {
+                await approve(params).then(res => {
+                    if (res.code == 200) {
+                        this.$message.success('处理成功')
+                        this.$listeners.close()
+                    } else {
+                        this.$message.error(res.msg)
+                    }
+                })
+            }).catch(() => {
+                //
+            })
+        }
+    },
+    filters: {
+        getFormatTime (tempA, tempB) {
+            return dayjs(tempA).format('HH') + ':' + dayjs(tempA).format('mm') + '-' + dayjs(tempB).format('HH') + ':' + dayjs(tempB).format('mm')
+        }
+    }
+}
+</script>
+
+<style lang="less" scoped>
+.dialog-footer{
+    margin-top: 20px;
+    display: block;
+    text-align: right;
+}
+.alert {
+   margin-bottom: 10px;
+}
+</style>

+ 179 - 0
src/views/workBenchManager/journal/model/list.vue

@@ -0,0 +1,179 @@
+<template>
+  <div>
+    <save-form :inline="true" ref="searchForm" :model="searchForm">
+      <el-form-item prop="readStatus">
+        <el-select
+          v-model.trim="searchForm.readStatus"
+          clearable
+          placeholder="日志状态"
+        >
+          <el-option label="已读" :value="1"></el-option>
+          <el-option label="未读" :value="0"></el-option>
+        </el-select>
+      </el-form-item>
+      <el-form-item>
+        <el-button type="danger" @click="onSearch">搜索</el-button>
+      </el-form-item>
+    </save-form>
+    <div class="tableWrap">
+      <el-table
+        style="width: 100%"
+        :header-cell-style="{ background: '#EDEEF0', color: '#444' }"
+        :data="tableList"
+      >
+        <el-table-column label="申请人" prop="userId" width="100px">
+          <template slot-scope="scope">
+            <el-badge
+              :is-dot="!scope.row.readStatus"
+              style="vertical-align: sub;"
+            ></el-badge>
+            {{ scope.row.userId }}
+          </template>
+        </el-table-column>
+        <el-table-column
+          align="center"
+          label="申请时间"
+          prop="createOn"
+        ></el-table-column>
+        <el-table-column
+          align="center"
+          label="内容"
+          prop="content"
+        ></el-table-column>
+        <el-table-column align="center" label="操作" fixed="right">
+          <template slot-scope="scope">
+            <el-button type="text" @click="onLook(scope.row)">查看</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>
+    <el-dialog :title="dialogTitle" :visible.sync="dialogSystem" width="400px">
+      <el-row>
+        <el-col :span="24">{{ dialogDetail.content }}</el-col>
+      </el-row>
+      <div slot="footer">
+        <el-button type="primary" @click="dialogSystem = false"
+          >确 定</el-button
+        >
+      </div>
+    </el-dialog>
+
+    <el-dialog :title="dialogTitle" :visible.sync="dialogStudent" width="500px">
+      <student-model
+        v-if="dialogStudent"
+        :dialogDetail="dialogDetail"
+        @close="dialogStudent = false"
+      />
+    </el-dialog>
+    <!-- 请假 -->
+    <el-dialog :title="dialogTitle" :visible.sync="dialogLeave" width="800px">
+      <leave-model
+        v-if="dialogLeave"
+        :dialogDetail="dialogDetail"
+        @close="dialogLeave = false"
+      />
+    </el-dialog>
+    <!-- 请假 -->
+    <el-dialog
+      :title="dialogTitle"
+      :visible.sync="dialogVipApply"
+      width="500px"
+    >
+      <vip-apply-model
+        v-if="dialogVipApply"
+        :dialogDetail="dialogDetail"
+        @close="dialogVipApply = false"
+      />
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import pagination from "@/components/Pagination/index";
+import { queryCountOfUnread, sysMessageList, setRead } from "@/api/journal";
+import { journalType } from "@/constant";
+import StudentModel from "./student";
+import LeaveModel from "./leave";
+import vipApplyModel from "./vipApply";
+export default {
+  components: { pagination, StudentModel, LeaveModel, vipApplyModel },
+  props: ["type"],
+  data() {
+    return {
+      dialogSystem: false,
+      dialogStudent: false,
+      dialogLeave: false,
+      dialogVipApply: false,
+      dialogTitle: null,
+      dialogDetail: {},
+      searchForm: {
+        search: null,
+        group: "SYSTEM",
+        readStatus: 0
+      },
+      tableList: [],
+      pageInfo: {
+        // 分页规则
+        limit: 10, // 限制显示条数
+        page: 1, // 当前页
+        total: 0, // 总条数
+        page_size: [10, 20, 40, 50] // 选择限制显示条数
+      }
+    };
+  },
+  mounted() {
+    const query = this.$route.query;
+    this.searchForm.group = query.opt || this.type;
+
+    this.getList();
+  },
+  methods: {
+    onSearch() {
+      this.pageInfo.page = 1;
+      this.getList();
+    },
+    async getList() {
+      const pageInfo = this.pageInfo;
+      const params = Object.assign({}, this.searchForm);
+      params.rows = pageInfo.limit;
+      params.page = pageInfo.page;
+      await sysMessageList(params).then(res => {
+        if (res.code == 200) {
+          this.tableList = res.data.rows;
+          pageInfo.total = res.data.total;
+        }
+      });
+    },
+    async onLook(row) {
+      // 把当前消息变成已读
+      if (row.readStatus != 1) {
+        await setRead({ id: row.id });
+        row.readStatus = 1; // 手动把消息变一下状态
+      }
+      this.dialogTitle = journalType[row.group];
+      this.dialogDetail = row;
+      switch (row.group) {
+        case "SYSTEM":
+          this.dialogSystem = true;
+          break;
+        case "STUDENT":
+          this.dialogStudent = true;
+          break;
+        case "LEAVE":
+          this.dialogLeave = true;
+          break;
+        case "VIPAPPLY":
+          this.dialogVipApply = true;
+          break;
+      }
+    }
+  }
+};
+</script>

+ 171 - 0
src/views/workBenchManager/journal/model/student.vue

@@ -0,0 +1,171 @@
+<template>
+    <div>
+        <el-form ref="studentForm"
+                 :model="rateForm"
+                 v-if="studentForm"
+                 class="studentForm"
+                 label-width="110px">
+            <el-alert title="已拒绝" show-icon center v-if="studentForm.complaints.status == 'REJECT'" :closable="false" class="alert" type="error"></el-alert>
+            <el-alert title="已同意" show-icon center v-if="studentForm.complaints.status == 'PASS'" :closable="false" class="alert" type="success"></el-alert>
+            <el-form-item label="发起投诉时间">
+                <el-input disabled v-model.trim="studentForm.courseSchedule.createTime"></el-input>
+            </el-form-item>
+            <el-form-item label="学员姓名">
+                <el-input disabled v-model.trim="studentForm.complaints.user.username"></el-input>
+            </el-form-item>
+            <el-form-item label="课程名称">
+                <el-input disabled v-model.trim="studentForm.courseSchedule.name"></el-input>
+            </el-form-item>
+            <el-form-item label="课程时间">
+                <!-- {{ showMessage.courseSchedule.classDate | formatTimer }} {{ showMessage.courseSchedule.startClassTime | timer }} -->
+                <el-input disabled v-model.trim="studentForm.courseSchedule.classDate"></el-input>
+            </el-form-item>
+            <el-form-item label="老师名称">
+                <el-input disabled v-model.trim="studentForm.courseSchedule.teacher.username"></el-input>
+            </el-form-item>
+            <el-form-item label="投诉理由">
+                <el-input type="textarea" disabled v-model.trim="studentForm.complaints.reason"></el-input>
+            </el-form-item>
+            <el-alert title="责任比" :closable="false" class="alert" type="info"></el-alert>
+            <el-form-item label="老师比例"
+                          prop="teacherRate"
+                          :rules="[{ required: true, message: '请输入老师比例', trigger: 'blur'},
+                            { required: true, validator: validateRate, trigger: 'blur' }]">
+                <el-input type="number"
+                      @mousewheel.native.prevent
+                      :disabled="studentForm.complaints.status !== 'ING'"
+                      v-model.number="rateForm.teacherRate"
+                      placeholder="请输入内容">
+                    <template slot="append">%</template>
+                </el-input>
+            </el-form-item>
+            <el-form-item label="学生比例"
+                          prop="studentRate"
+                          :rules="[{ required: true, message: '请输入学生比例', trigger: 'blur'},
+                            { required: true, validator: validateRate, trigger: 'blur' }]">
+                <el-input type="number"
+                      @mousewheel.native.prevent
+                      :disabled="studentForm.complaints.status !== 'ING'"
+                      v-model.number="rateForm.studentRate"
+                      placeholder="请输入内容">
+                <template slot="append">%</template>
+              </el-input>
+            </el-form-item>
+        </el-form>
+        <div slot="footer" class="dialog-footer" v-permission="'courseSchedule/courseScheduleCommplaintAudit'" v-if="studentForm && studentForm.complaints.status === 'ING'">
+            <el-button type="primary" @click="onSubmit('studentForm', 'submit')">确 定</el-button>
+            <el-button type="danger" @click="onSubmit('studentForm', 'reject')">拒 绝</el-button>
+        </div>
+    </div>
+</template>
+
+<script>
+import { queryCourseScheduleComplaintsDetail, courseScheduleCommplaintAudit } from '@/api/journal'
+const validateRate = (rule, value, callback) => {
+    if (value == '' && typeof value == 'string' || value == null) {
+        callback(new Error('请输入比例'))
+    } else if (value < 0 || value > 100) {
+        callback(new Error('比例必须在0~100之间'))
+    } else {
+        callback()
+    }
+}
+export default {
+    props: ['dialogDetail'],
+    data() {
+        return {
+            validateRate: validateRate,
+            studentForm: null,
+            rateForm: {
+                studentRate: null,
+                teacherRate: null
+            }
+        }
+    },
+    mounted() {
+        this.__init()
+    },
+    methods: {
+        async __init() {
+            let { memo } = this.dialogDetail
+            memo = memo ? JSON.parse(memo) : null
+            if(!memo) { // 判断是否有参数
+                this.$message.error('参数有误')
+                return
+            }
+            await queryCourseScheduleComplaintsDetail({ courseScheduleComplaintsId: memo.courseScheduleComplaintsId }).then(res => {
+                let result = res.data
+                if (res.code == 200) {
+                    this.studentForm = result
+                    const { complaints } = result
+                    if (complaints.status != 'ING') {
+                        this.rateForm.teacherRate = complaints.teacherLiabilityRatio
+                        this.rateForm.studentRate = complaints.studentLiabilityRatio
+                    }
+                }
+            })
+        },
+        async onSubmit(formName, type) {
+            const params = {
+                id: this.studentForm.complaints.id
+            }
+            if(type == 'reject') {
+                this.$confirm('您确定拒绝吗?', '提示', {
+                    confirmButtonText: '确定',
+                    cancelButtonText: '取消',
+                    type: 'warning'
+                }).then(async () => {
+                    params.status = 'REJECT'
+                    params.studentLiabilityRatio = 0
+                    params.teacherLiabilityRatio = 0
+                    await this.onComm(params)
+                }).catch(() => {
+                    //
+                });
+            } else {
+                this.$refs[formName].validate(async (valid) => {
+                    if(valid) {
+                        params.status = 'PASS'
+                        params.studentLiabilityRatio = this.rateForm.studentRate
+                        params.teacherLiabilityRatio = this.rateForm.teacherRate
+                        await this.onComm(params)
+                    }
+                })
+            }
+        },
+        async onComm(params) {
+            await courseScheduleCommplaintAudit(params).then(res => {
+                if (res.code == 200) {
+                    this.$message.success('处理成功')
+                    this.$listeners.close()
+                } else {
+                    this.$message.error(res.msg)
+                }
+            })
+        }
+    },
+    watch: {
+        'rateForm.teacherRate' (newValue, old) {
+            if (newValue) {
+                this.rateForm.studentRate = parseInt(100 - newValue)
+            }
+        },
+        'rateForm.studentRate' (newValue, old) {
+            if (newValue) {
+                this.rateForm.teacherRate = parseInt(100 - newValue)
+            }
+        }
+    },
+}
+</script>
+
+<style lang="less" scoped>
+.dialog-footer{
+    margin-top: 20px;
+    display: block;
+    text-align: right;
+}
+.alert {
+   margin-bottom: 10px;
+}
+</style>

+ 122 - 0
src/views/workBenchManager/journal/model/vipApply.vue

@@ -0,0 +1,122 @@
+<template>
+    <div>
+        <el-form ref="vipForm"
+                 :model="vipForm"
+                 class="vipForm"
+                 label-width="110px">
+            <el-alert title="已拒绝" show-icon center v-if="vipForm.auditStatus == 'REJECT'" :closable="false" class="alert" type="error"></el-alert>
+            <el-alert title="已同意" show-icon center v-if="vipForm.auditStatus == 'PASS'" :closable="false" class="alert" type="success"></el-alert>
+            <el-form-item label="开始时间">
+                <el-input disabled v-model.trim="vipForm.createTime"></el-input>
+            </el-form-item>
+            <el-form-item label="老师姓名">
+                <el-input disabled v-model.trim="vipForm.userName"></el-input>
+            </el-form-item>
+            <el-form-item label="线上课数">
+                <el-input disabled v-model.trim="vipForm.onlineClassesNum"></el-input>
+            </el-form-item>
+            <el-form-item label="线上课单价">
+                <el-input disabled v-model.trim="vipForm.onlineClassesUnitPrice"></el-input>
+            </el-form-item>
+            <el-form-item label="线上课课酬">
+                <el-input disabled v-model.trim="vipForm.onlineTeacherSalary"></el-input>
+            </el-form-item>
+            <el-form-item label="线下课数">
+                <el-input disabled v-model.trim="vipForm.offlineClassesNum"></el-input>
+            </el-form-item>
+            <el-form-item label="线下课单价">
+                <el-input disabled v-model.trim="vipForm.offlineClassesUnitPrice"></el-input>
+            </el-form-item>
+            <el-form-item label="线下课课酬">
+                <el-input disabled v-model.trim="vipForm.offlineTeacherSalary"></el-input>
+            </el-form-item>
+            <el-form-item label="科目名">
+                <el-input disabled v-model.trim="vipForm.subjectName"></el-input>
+            </el-form-item>
+            <el-form-item label="活动名称">
+                <el-input disabled v-model.trim="vipForm.vipGroupActivityName"></el-input>
+            </el-form-item>
+            <el-form-item label="商品价格">
+                <el-input disabled v-model.trim="vipForm.totalPrice"></el-input>
+            </el-form-item>
+            <el-form-item label="原因" prop="memo" :rules="[{ required: true, message: '请输入原因', trigger: 'blur' }]">
+                <el-input type="textarea" :disabled="vipForm.auditStatus !== 'ING'" v-model.trim="vipForm.memo"></el-input>
+            </el-form-item>
+        </el-form>
+        <div slot="footer" class="dialog-footer" v-permission="'vipGroupManage/vipApplyAudit'" v-if="vipForm.auditStatus === 'ING'">
+            <el-button type="primary" @click="onSubmit('vipForm', 'PASS')">确 定</el-button>
+            <el-button type="danger" @click="onSubmit('vipForm', 'REJECT')">拒 绝</el-button>
+        </div>
+    </div>
+</template>
+
+<script>
+import { getVipGroupDetailForAudit } from '@/api/vipSeting'
+import { vipApplyAudit } from '@/api/journal'
+export default {
+    props: ['dialogDetail'],
+    data() {
+        return {
+            vipForm: {},
+        }
+    },
+    mounted() {
+        this.__init()
+    },
+    methods: {
+        async __init() {
+            let { memo } = this.dialogDetail
+            memo = memo ? JSON.parse(memo) : null
+            if(!memo) { // 判断是否有参数
+                this.$message.error('参数有误')
+                return
+            }
+            await getVipGroupDetailForAudit({  vipGroupId: memo.vipGroupId }).then(res => {
+                let result = res.data
+                if (res.code == 200) {
+                    this.vipForm = result
+                }
+            })
+        },
+        async onSubmit(formName, type) {
+            const params = {
+                vipGroupId: this.vipForm.id,
+                reason: this.vipForm.memo,
+                auditStatus: type,
+            }
+            this.$refs[formName].validate(async (valid) => {
+                if(valid) {
+                    const str = type == 'PASS' ? '同意' : '拒绝'
+                    this.$confirm(`您确定${str}申请吗?`, '提示', {
+                        confirmButtonText: '确定',
+                        cancelButtonText: '取消',
+                        type: 'warning'
+                    }).then(async () => {
+                        await vipApplyAudit(params).then(res => {
+                            if (res.code == 200) {
+                                this.$message.success('处理成功')
+                                this.$listeners.close()
+                            } else {
+                                this.$message.error(res.msg)
+                            }
+                        })
+                    }).catch(() => {
+                        //
+                    })
+                }
+            })
+        }
+    }
+}
+</script>
+
+<style lang="less" scoped>
+.dialog-footer{
+    margin-top: 20px;
+    display: block;
+    text-align: right;
+}
+.alert {
+   margin-bottom: 10px;
+}
+</style>

+ 1 - 1
src/views/workBenchManager/journal/studentComplain.vue

@@ -308,7 +308,7 @@ export default {
           this.$message.success('处理成功')
           this.getCourseDetail(id)
         } else {
-          this.$message.errot(res.msg)
+          this.$message.error(res.msg)
         }
       })
     }

+ 200 - 156
src/views/workBenchManager/requestProcessing.vue

@@ -2,165 +2,210 @@
 <template>
   <div class="m-container">
     <h2>
-      <div class="squrt"></div>课酬申诉
+      <div class="squrt"></div>
+      课酬申诉
     </h2>
     <div class="m-core">
-      <el-form :inline="true"
-               :model="searchForm">
+      <save-form
+        :inline="true"
+        @reset="onReSet"
+        @submit="search"
+        :model="searchForm"
+      >
         <!-- <el-form-item>
           <el-input v-model.trim="searchForm.search" @keyup.enter.native="search" placeholder></el-input>
         </el-form-item>-->
         <el-form-item prop="organId">
-          <el-select class="multiple"
-                     v-model.trim="searchForm.organId"
-                     filterable
-                     clearable
-                     placeholder="请选择分部">
-            <el-option v-for="(item,index) in organList"
-                       :key="index"
-                       :label="item.name"
-                       :value="item.id"></el-option>
+          <el-select
+            class="multiple"
+            v-model.trim="searchForm.organId"
+            filterable
+            clearable
+            placeholder="请选择分部"
+          >
+            <el-option
+              v-for="(item, index) in organList"
+              :key="index"
+              :label="item.name"
+              :value="item.id"
+            ></el-option>
           </el-select>
         </el-form-item>
         <el-form-item>
-          <el-select placeholder="老师姓名"
-                     v-model="searchForm.teacherId"
-                     clearable
-                     filterable>
-            <el-option v-for="(item,index) in teacherList"
-                       :label="item.realName"
-                       :value="item.id"
-                       :key="index"></el-option>
+          <el-select
+            placeholder="老师姓名"
+            v-model="searchForm.teacherId"
+            clearable
+            filterable
+          >
+            <el-option
+              v-for="(item, index) in teacherList"
+              :label="item.realName"
+              :value="item.id"
+              :key="index"
+            ></el-option>
           </el-select>
         </el-form-item>
         <el-form-item>
-          <el-select placeholder="状态"
-                     v-model="searchForm.statusEnum"
-                     clearable>
-            <el-option label="待处理"
-                       value="PENDING"></el-option>
-            <el-option label="已完成"
-                       value="DONE"></el-option>
-            <el-option label="已同意"
-                       value="AGREED"></el-option>
-            <el-option label="已拒绝"
-                       value="DENIED"></el-option>
-            <el-option label="已撤回"
-                       value="WITHDRAWN"></el-option>
+          <el-select
+            placeholder="状态"
+            v-model="searchForm.statusEnum"
+            clearable
+          >
+            <el-option label="待处理" value="PENDING"></el-option>
+            <el-option label="已完成" value="DONE"></el-option>
+            <el-option label="已同意" value="AGREED"></el-option>
+            <el-option label="已拒绝" value="DENIED"></el-option>
+            <el-option label="已撤回" value="WITHDRAWN"></el-option>
           </el-select>
         </el-form-item>
         <el-form-item>
-          <el-date-picker :clearable="true"
-                          v-model="searchForm.salarySettlementMonth"
-                          type="month"
-                          value-format="yyyy-MM"
-                          placeholder="选择申诉年月"></el-date-picker>
+          <el-date-picker
+            :clearable="true"
+            v-model="searchForm.salarySettlementMonth"
+            type="month"
+            value-format="yyyy-MM"
+            placeholder="选择申诉年月"
+          ></el-date-picker>
         </el-form-item>
         <el-form-item>
-          <el-button type="danger"
-                     @click="search">搜索</el-button>
-          <el-button @click="onReSet"
-                     type="primary">重置</el-button>
+          <el-button type="danger" native-type="seach">搜索</el-button>
+          <el-button native-type="reset" type="primary">重置</el-button>
           <!-- export/isSettlementCourseSalarys -->
-          <el-button @click="onExport"
-                     type="primary"
-                     v-permission="'export/teacherSalaryComplaints'"
-                     style=" background: #14928a; border:1px solid #14928a;">导出</el-button>
+          <el-button
+            @click="onExport"
+            type="primary"
+            v-permission="'export/teacherSalaryComplaints'"
+            style="background: #14928a; border: 1px solid #14928a"
+            >导出</el-button
+          >
         </el-form-item>
-      </el-form>
+      </save-form>
       <div class="tableWrap">
-        <el-table style="width: 100%"
-                  :header-cell-style="{background:'#EDEEF0',color:'#444'}"
-                  :data="tableList">
-          <el-table-column align="center"
-                           prop="organName"
-                           label="分部"></el-table-column>
-          <el-table-column align="center"
-                           prop="teacherId"
-                           label="老师编号"></el-table-column>
-          <el-table-column align="center"
-                           prop="realName"
-                           label="老师姓名"></el-table-column>
-          <el-table-column align="center"
-                           prop="salarySettlementMonth"
-                           width="150"
-                           label="课酬归属时间"></el-table-column>
-          <el-table-column align="center"
-                           prop="updateTime"
-                           width="150"
-                           label="申诉提交">
-            <template slot-scope="scope">{{scope.row.updateTime | dateForMinFormat}}</template>
+        <el-table
+          style="width: 100%"
+          :header-cell-style="{ background: '#EDEEF0', color: '#444' }"
+          :data="tableList"
+        >
+          <el-table-column
+            align="center"
+            prop="organName"
+            label="分部"
+          ></el-table-column>
+          <el-table-column
+            align="center"
+            prop="teacherId"
+            label="老师编号"
+          ></el-table-column>
+          <el-table-column
+            align="center"
+            prop="realName"
+            label="老师姓名"
+          ></el-table-column>
+          <el-table-column
+            align="center"
+            prop="salarySettlementMonth"
+            width="150"
+            label="课酬归属时间"
+          ></el-table-column>
+          <el-table-column
+            align="center"
+            prop="updateTime"
+            width="150"
+            label="申诉提交"
+          >
+            <template slot-scope="scope">{{
+              scope.row.updateTime | dateForMinFormat
+            }}</template>
           </el-table-column>
-          <el-table-column align="center"
-                           prop="statusEnum"
-                           label="状态">
-            <template slot-scope="scope">{{scope.row.statusEnum | statusEnum}}</template>
+          <el-table-column align="center" prop="statusEnum" label="状态">
+            <template slot-scope="scope">{{
+              scope.row.statusEnum | statusEnum
+            }}</template>
           </el-table-column>
-          <el-table-column align="center"
-                           prop="operatorRealName"
-                           label="申诉处理者"></el-table-column>
+          <el-table-column
+            align="center"
+            prop="operatorRealName"
+            label="申诉处理者"
+          ></el-table-column>
           <!-- <el-table-column align="center" prop="reason" width="400" label="备注"></el-table-column> -->
-          <el-table-column align="center"
-                           prop="courseScheduleId"
-                           width="150"
-                           label="操作">
+          <el-table-column
+            align="center"
+            prop="courseScheduleId"
+            width="150"
+            label="操作"
+          >
             <template slot-scope="scope">
               <div>
-                <el-button type="text"
-                           @click="lookDetail(scope.row)"
-                           v-permission="'teacherSalaryComplaints/complaintsDispose'">操作</el-button>
+                <el-button
+                  type="text"
+                  @click="lookDetail(scope.row)"
+                  v-permission="'teacherSalaryComplaints/complaintsDispose'"
+                  >操作</el-button
+                >
               </div>
             </template>
           </el-table-column>
         </el-table>
-        <pagination :total="rules.total"
-                    :page.sync="rules.page"
-                    :limit.sync="rules.limit"
-                    :page-sizes="rules.page_size"
-                    @pagination="getList" />
+        <pagination
+          sync
+          :total.sync="rules.total"
+          :page.sync="rules.page"
+          :limit.sync="rules.limit"
+          :page-sizes="rules.page_size"
+          @pagination="getList"
+        />
       </div>
     </div>
-    <el-dialog title="课酬申诉"
-               :visible.sync="dialogVisible"
-               width="400px">
+    <el-dialog title="课酬申诉" :visible.sync="dialogVisible" width="400px">
       <div>
-        <el-form ref="visibleForm"
-                 :model="visibleForm"
-                 class="visibleForm">
-          <el-form-item label="申诉内容"
-                        :rules="[{ required: true, message: '请填写申诉内容',trigger: 'blur'}]"
-                        prop="reason">
-            <el-input type="textarea"
-                      :rows="5"
-                      :disabled="visibleForm.statusEnum !='PENDING'"
-                      v-model.trim="visibleForm.reason"></el-input>
+        <el-form ref="visibleForm" :model="visibleForm" class="visibleForm">
+          <el-form-item
+            label="申诉内容"
+            :rules="[
+              { required: true, message: '请填写申诉内容', trigger: 'blur' },
+            ]"
+            prop="reason"
+          >
+            <el-input
+              type="textarea"
+              :rows="5"
+              :disabled="visibleForm.statusEnum != 'PENDING'"
+              v-model.trim="visibleForm.reason"
+            ></el-input>
           </el-form-item>
-          <el-form-item label="处理意见"
-                        :rules="[{ required: true, message: '请填写处理意见',trigger: 'blur'}]"
-                        prop="handingSuggestion">
-            <el-input type="textarea"
-                      :rows="5"
-                      :disabled="visibleForm.statusEnum !='PENDING'"
-                      v-model.trim="visibleForm.handingSuggestion"></el-input>
+          <el-form-item
+            label="处理意见"
+            :rules="[
+              { required: true, message: '请填写处理意见', trigger: 'blur' },
+            ]"
+            prop="handingSuggestion"
+          >
+            <el-input
+              type="textarea"
+              :rows="5"
+              :disabled="visibleForm.statusEnum != 'PENDING'"
+              v-model.trim="visibleForm.handingSuggestion"
+            ></el-input>
           </el-form-item>
-          <el-form-item label="处理结果"
-                        v-if="visibleForm.statusEnum !='PENDING'">
-            {{visibleForm.statusEnum | statusEnum}}
+          <el-form-item
+            label="处理结果"
+            v-if="visibleForm.statusEnum != 'PENDING'"
+          >
+            {{ visibleForm.statusEnum | statusEnum }}
           </el-form-item>
         </el-form>
       </div>
-      <div slot="footer"
-           v-if="visibleForm.statusEnum =='PENDING'">
+      <div slot="footer" v-if="visibleForm.statusEnum == 'PENDING'">
         <el-button @click="subreset('DENIED')">拒绝</el-button>
-        <el-button type="primary"
-                   @click="subreset('AGREED')">同意</el-button>
+        <el-button type="primary" @click="subreset('AGREED')">同意</el-button>
       </div>
     </el-dialog>
   </div>
 </template>
 
 <script>
-import qs from 'qs'
+import qs from "qs";
 import axios from "axios";
 import { getToken } from "@/utils/auth";
 import pagination from "@/components/Pagination/index";
@@ -169,18 +214,18 @@ import { getTeacher, getEmployeeOrgan } from "@/api/buildTeam";
 import {
   teacherSalaryComplaints,
   teacherSalaryComplaintsDetail,
-  complaintsDispose
+  complaintsDispose,
 } from "@/api/journal";
 export default {
   components: { pagination },
-  data () {
+  data() {
     return {
       searchForm: {
         search: null,
         salarySettlementMonth: null,
         statusEnum: null,
         teacherId: null,
-        organId: null
+        organId: null,
       },
       teacherList: [],
       tableList: [],
@@ -190,7 +235,7 @@ export default {
         limit: 10, // 限制显示条数
         page: 1, // 当前页
         total: 0, // 总条数
-        page_size: [10, 20, 40, 50] // 选择限制显示条数
+        page_size: [10, 20, 40, 50], // 选择限制显示条数
       },
       dialogVisible: false,
       visibleForm: {
@@ -199,20 +244,20 @@ export default {
         teacherId: null,
         salarySettlementMonth: null,
         statusEnum: null,
-        id: null
-      }
+        id: null,
+      },
     };
   },
   //生命周期 - 创建完成(可以访问当前this实例)
-  created () { },
+  created() {},
   //生命周期 - 挂载完成(可以访问DOM元素)
-  mounted () {
-    getTeacher().then(res => {
+  mounted() {
+    getTeacher().then((res) => {
       if (res.code == 200) {
         this.teacherList = res.data;
       }
     });
-    getEmployeeOrgan().then(res => {
+    getEmployeeOrgan().then((res) => {
       if (res.code == 200) {
         this.organList = res.data;
       }
@@ -221,62 +266,62 @@ export default {
     this.init();
   },
   methods: {
-    init () {
+    init() {
       this.getList();
     },
-    getList () {
+    getList() {
       this.searchForm.page = this.rules.page;
       this.searchForm.rows = this.rules.limit;
-      teacherSalaryComplaints(this.searchForm).then(res => {
+      teacherSalaryComplaints(this.searchForm).then((res) => {
         if (res.code == 200) {
           this.tableList = res.data.rows;
           this.rules.total = res.data.total;
         }
       });
     },
-    search () {
+    search() {
       this.rules.page = 1;
       this.getList();
     },
-    onReSet () {
+    onReSet() {
       this.searchForm = {
         search: null,
         salarySettlementMonth: null,
         statusEnum: null,
         teacherId: null,
-        organId: null
+        organId: null,
       };
       this.search();
     },
-    onExport () {
+    onExport() {
       let url = "/api-web/export/teacherSalaryComplaints";
       let obj = this.searchForm;
       const options = {
         method: "post",
         headers: {
-          Authorization: getToken()
+          Authorization: getToken(),
         },
         url,
         data: qs.stringify(obj),
-        responseType: "blob"
+        responseType: "blob",
       };
 
       this.$confirm("您确定导出列表?", "提示", {
         confirmButtonText: "确定",
         cancelButtonText: "取消",
-        type: "warning"
+        type: "warning",
       })
         .then(() => {
           load.startLoading();
           axios(options)
-            .then(res => {
+            .then((res) => {
               let blob = new Blob([res.data], {
                 // type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=utf-8',
-                type: "application/vnd.ms-excel;charset=utf-8"
+                type: "application/vnd.ms-excel;charset=utf-8",
                 // word文档为application/msword,pdf文档为application/pdf,application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=utf-8
               });
               let text = new Response(blob).text();
-              text.then(res => {
+              text.then((res) => {
                 // 判断是否报错
                 if (res.indexOf("code") != -1) {
                   let json = JSON.parse(res);
@@ -305,15 +350,15 @@ export default {
 
               load.endLoading();
             })
-            .catch(error => {
+            .catch((error) => {
               this.$message.error("导出数据失败,请联系管理员");
               load.endLoading();
             });
         })
-        .catch(() => { });
+        .catch(() => {});
     },
-    lookDetail (row) {
-      teacherSalaryComplaintsDetail({ id: row.id }).then(res => {
+    lookDetail(row) {
+      teacherSalaryComplaintsDetail({ id: row.id }).then((res) => {
         if (res.code == 200) {
           this.visibleForm = {
             reason: res.data.reason,
@@ -328,8 +373,8 @@ export default {
         }
       });
     },
-    subreset (str) {
-      this.$refs["visibleForm"].validate(flag => {
+    subreset(str) {
+      this.$refs["visibleForm"].validate((flag) => {
         if (flag) {
           let obj = {
             reason: this.visibleForm.reason,
@@ -338,9 +383,9 @@ export default {
             salarySettlementMonth: this.visibleForm.salarySettlementMonth,
             teacherId: this.visibleForm.teacherId,
             statusEnum: str,
-            id: this.visibleForm.id
+            id: this.visibleForm.id,
           };
-          complaintsDispose(obj).then(res => {
+          complaintsDispose(obj).then((res) => {
             if (res.code == 200) {
               this.dialogVisible = false;
               this.$message.success("处理成功");
@@ -349,22 +394,22 @@ export default {
           });
         }
       });
-    }
+    },
   },
   filters: {
-    statusEnum (val) {
+    statusEnum(val) {
       let template = {
         PENDING: "待处理",
         DONE: "已完成",
         AGREED: "已同意",
         DENIED: "已拒绝",
-        WITHDRAWN: "已撤回"
+        WITHDRAWN: "已撤回",
       };
       return template[val];
-    }
+    },
   },
   watch: {
-    dialogVisible (val) {
+    dialogVisible(val) {
       if (!val) {
         this.visibleForm = {
           reason: null,
@@ -372,14 +417,13 @@ export default {
           teacherId: null,
           salarySettlementMonth: null,
           statusEnum: null,
-          id: null
+          id: null,
         };
         this.$refs["visibleForm"].resetFields();
       }
-
-    }
-  }
+    },
+  },
 };
 </script>
 <style lang='scss' scoped>
-</style>
+</style>

Some files were not shown because too many files changed in this diff