浏览代码

Merge branch 'wxl_01_15' into online

lex-xin 4 年之前
父节点
当前提交
3d6bb3552a
共有 30 个文件被更改,包括 892 次插入81 次删除
  1. 18 0
      src/components/Auth/index.md
  2. 78 0
      src/components/Auth/index.vue
  3. 2 0
      src/components/install.js
  4. 2 0
      src/router/index.js
  5. 1 0
      src/router/notKeepAliveList.js
  6. 6 4
      src/utils/searchArray.js
  7. 2 0
      src/utils/vueFilter.js
  8. 8 1
      src/views/adapayAccount/form.vue
  9. 7 0
      src/views/app/entryOperation.vue
  10. 1 1
      src/views/businessManager/orderManager/incomeOut.vue
  11. 10 0
      src/views/businessManager/shopManager/shopList.vue
  12. 7 0
      src/views/businessManager/shopManager/shopOperation.vue
  13. 8 1
      src/views/categroyManager/vipNewActive.vue
  14. 7 0
      src/views/contentManager/contentOperation.vue
  15. 1 1
      src/views/operateManager/operateStudent.vue
  16. 4 4
      src/views/resetTeaming/components/resetPayList.vue
  17. 4 4
      src/views/resetTeaming/components/resetPayListSchool.vue
  18. 1 0
      src/views/studentManager/studentList.vue
  19. 5 3
      src/views/teacherManager/teacherOperation/components/accompanySet.vue
  20. 10 0
      src/views/teacherManager/teacherOperation/components/teacherOperation.vue
  21. 16 0
      src/views/teamBuild/api.js
  22. 29 3
      src/views/teamBuild/components/soundSetComponents/soundSetCore.vue
  23. 37 23
      src/views/teamBuild/components/teamBaseInfo.vue
  24. 23 7
      src/views/teamBuild/components/teamSoundSet.vue
  25. 74 0
      src/views/teamBuild/createPayment.vue
  26. 335 0
      src/views/teamBuild/forecastName.vue
  27. 4 4
      src/views/teamBuild/index.vue
  28. 135 0
      src/views/teamBuild/modals/visit.vue
  29. 29 7
      src/views/teamDetail/teamList.vue
  30. 28 18
      src/views/workBenchManager/classFeesIsOk.vue

+ 18 - 0
src/components/Auth/index.md

@@ -0,0 +1,18 @@
+#### auth
+
+权限控制组件
+
+###### 使用方法:
+
+``` html
+<auth auths="/main" :router="['main']" mulit>
+  Node
+</auth>
+
+<auth :auths="['/main']" :router="['main']" mulit>
+  Node
+</auth>
+```
+
+权限使用的是`localStorage`
+

+ 78 - 0
src/components/Auth/index.vue

@@ -0,0 +1,78 @@
+<template>
+  <div class="auth" v-if="isAuth">
+    <slot></slot>
+  </div>
+</template>
+
+<script>
+  import store from '@/store'
+  export default {
+    name: 'auth',
+    props: {
+      auths: {
+        type: String | Array
+      },
+      router: {
+        type: Array
+      },
+      mulit: {
+        type: Boolean,
+        default() {
+          return false
+        }
+      }
+    },
+    data() {
+      return {
+        isAuth: false
+      }
+    },
+    async mounted() {
+      let permission = window.localStorage.getItem('permission')
+      permission = permission.split(',')
+      this.isAuth = this.hasAuths(permission) && this.hasRouters() ? true : false
+    },
+    methods: {
+      hasAuths(menus) {
+        const auths = this.auths
+        if(!auths) { // 判断是否有权限
+          return false
+        }
+        // console.log(auths)
+        if(typeof auths === 'object') {
+          let sum = 0
+          for(const auth of auths) {
+            if(this.mulit) {
+               if(menus.includes(auth)) {
+                 sum ++
+               }
+            } else {
+              return menus.includes(auth)
+            }
+          }
+          if(sum === auths.length) {
+            return true
+          }
+        } else {
+          return menus.includes(auths)
+        }
+      },
+      hasRouters() {
+        const path = this.$route.path
+        if(this.router) {
+          return this.router.includes(path)
+        }
+        return true
+      }
+    }
+  }
+</script>
+
+<style scoped lang="less">
+  .auth {
+    display: inline-block;
+    & + .auth {
+      margin-left: 10px;
+    }
+  }
+</style>

+ 2 - 0
src/components/install.js

@@ -14,6 +14,7 @@ import descriptions from '@/components/Descriptions/Descriptions.vue'
 import remoteSearch from "@/components/remote-search"
 import tabRouter from '@/components/tab-router'
 import empty from '@/components/empty'
+import auth from '@/components/Auth'
 
 export default {
   install(Vue) {
@@ -28,5 +29,6 @@ export default {
     Vue.component(remoteSearch.name, remoteSearch)
     Vue.component(tabRouter.name, tabRouter)
     Vue.component(empty.name, empty)
+    Vue.component(auth.name, auth)
   }
 }

+ 2 - 0
src/router/index.js

@@ -159,6 +159,8 @@ export const asyncRoutes = {
   // 乐团管理
   teamDetail: () => import('@/views/teamDetail/teamList'),
   teamBuild: () => import('@/views/teamBuild/index'),
+  forecastName: () => import('@/views/teamBuild/forecastName'), // 预报名页面
+  createPayment: () => import('@/views/teamBuild/createPayment'), // 创建缴费页面
   // VIP管理
   vipList: () => import('@/views/vipClass/vipList'),
   // vip修改

+ 1 - 0
src/router/notKeepAliveList.js

@@ -4,6 +4,7 @@ export default [
   '/orderList/orderAudit', // 订单管理 订单审核
   '/business/teamCourseList', // 课表列表
   '/business/auditList', // 费用审核列表
+  '/business/forecastName', // 预报名
   '/orderList/financeManager', // 财务管理
   '/vipClassSet/vipParameterManager', // VIP参数设置
   '/vipClassSet/branchActive', // VIP分部活动列表

+ 6 - 4
src/utils/searchArray.js

@@ -97,16 +97,18 @@ export const dealStatus = [
 ]
 
 export const musicGroupStatus = [
+  { value: 'DRAFT', text: '编辑中' },
+  { value: 'AUDIT', text: '审核中' },
   { value: 'APPLY', text: '报名中' },
+  { value: 'PRE_APPLY', text: '预报名中' },
+  { value: 'PRE_BUILD_FEE', text: '创建缴费中' },
   { value: 'PAY', text: '缴费中' },
   { value: 'PREPARE', text: '筹备中' },
   { value: 'PROGRESS', text: '进行中' },
-  { value: 'PAUSE', text: '暂停' },
-  { value: 'DRAFT', text: '编辑中' },
-  { value: 'AUDIT', text: '审核中' },
+  { value: 'FEE_AUDIT', text: '费用审核中' },
   { value: 'AUDIT_FAILED', text: '审核失败' },
+  { value: 'PAUSE', text: '暂停' },
   { value: 'CANCELED', text: '取消' },
-  { value: 'FEE_AUDIT', text: '费用审核中' },
   { value: 'CLOSE', text: '已关闭' },
 ]
 

+ 2 - 0
src/utils/vueFilter.js

@@ -316,10 +316,12 @@ Vue.filter('paymentStatus', value => {
 // 乐团状态
 Vue.filter('teamStatus', value => {
   let template = {
+    PRE_APPLY: "预报名中",
     APPLY: "报名中",
     PAY: "缴费中",
     PREPARE: "筹备中",
     PROGRESS: "进行中",
+    PRE_BUILD_FEE: '创建缴费中',
     CANCELED: '取消',
     PAUSE: '暂停',
     AUDIT: '乐团审核中',

+ 8 - 1
src/views/adapayAccount/form.vue

@@ -159,9 +159,9 @@
                       placeholder="请输入邮编"></el-input>
           </el-form-item>
           <el-form-item>
-            <el-button @click="onCancel">取 消</el-button>
             <el-button type="primary"
                        @click="onSubmit('accountForm')">确 定</el-button>
+            <el-button @click="onCancel">取 消</el-button>
           </el-form-item>
         </el-form>
       </el-col>
@@ -340,6 +340,13 @@ export default {
             })
           }
         } else {
+          this.$nextTick(() => {
+            let isError = document.getElementsByClassName('is-error')
+            isError[0].scrollIntoView({
+              block: 'center',
+              behavior: 'smooth',
+            })
+          })
           return false;
         }
       });

+ 7 - 0
src/views/app/entryOperation.vue

@@ -335,6 +335,13 @@ export default {
             });
           }
         } else {
+          this.$nextTick(() => {
+            let isError = document.getElementsByClassName('is-error')
+            isError[0].scrollIntoView({
+              block: 'center',
+              behavior: 'smooth',
+            })
+          })
           return false;
         }
       });

+ 1 - 1
src/views/businessManager/orderManager/incomeOut.vue

@@ -112,7 +112,7 @@
               scope.row.createTime | dateForMinFormat
             }}</template>
           </el-table-column>
-          <el-table-column align="center" width="100px" label="时间/分钟">
+          <el-table-column align="center" width="125px" label="时间/分钟">
             <template slot-scope="scope">
               <p>{{ "购买" + scope.row.transMinutes + "分钟" }}</p>
               <p>{{ "赠送" + scope.row.giveMinutes + "分钟" }}</p>

+ 10 - 0
src/views/businessManager/shopManager/shopList.vue

@@ -134,6 +134,9 @@
           <el-table-column align='center'
                            prop="name"
                            label="商品名称">
+            <template slot-scope="scope">
+              <overflow-text :text="scope.row.name" width="100%" />
+            </template>
           </el-table-column>
           <el-table-column align='center'
                            label="是否组合商品">
@@ -1045,6 +1048,13 @@ export default {
             })
           }
         } else {
+          this.$nextTick(() => {
+            let isError = document.getElementsByClassName('is-error')
+            isError[0].scrollIntoView({
+              block: 'center',
+              behavior: 'smooth',
+            })
+          })
           return false
         }
       })

+ 7 - 0
src/views/businessManager/shopManager/shopOperation.vue

@@ -408,6 +408,13 @@ export default {
             })
           }
         } else {
+          this.$nextTick(() => {
+            let isError = document.getElementsByClassName('is-error')
+            isError[0].scrollIntoView({
+              block: 'center',
+              behavior: 'smooth',
+            })
+          })
           return false
         }
       })

+ 8 - 1
src/views/categroyManager/vipNewActive.vue

@@ -432,7 +432,14 @@ export default {
             }
           });
         } else {
-          this.$message.error("请填写必要参数");
+          this.$nextTick(() => {
+            let isError = document.getElementsByClassName('is-error')
+            isError[0].scrollIntoView({
+              block: 'center',
+              behavior: 'smooth',
+            })
+          })
+          // this.$message.error("请填写必要参数");
         }
       });
 

+ 7 - 0
src/views/contentManager/contentOperation.vue

@@ -599,6 +599,13 @@ export default {
             });
           }
         } else {
+          this.$nextTick(() => {
+            let isError = document.getElementsByClassName('is-error')
+            isError[0].scrollIntoView({
+              block: 'center',
+              behavior: 'smooth',
+            })
+          })
           return false;
         }
       });

+ 1 - 1
src/views/operateManager/operateStudent.vue

@@ -141,7 +141,7 @@
           </el-table-column>
           <el-table-column align="center" prop="groupNames" label="乐团名称">
             <template slot-scope="scope">
-              <overflow-text width="165px" :text="scope.row.groupNames" />
+              <overflow-text width="100%" :text="scope.row.groupNames" />
             </template>
           </el-table-column>
           <el-table-column

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

@@ -500,12 +500,12 @@ export default {
     },
     teamStatus () {
       let type = this.$route.query.type;
-      return type == 'teamDraft' || type == 'resetTeam'
+      return type == 'teamDraft' || type == 'resetTeam' || type == 'PRE_BUILD_FEE'
     }
   },
-  activated () {
-    this.init();
-  },
+  // activated () {
+  //   this.init();
+  // },
   methods: {
     async init () {
       try {

+ 4 - 4
src/views/resetTeaming/components/resetPayListSchool.vue

@@ -505,12 +505,12 @@ export default {
     },
     teamStatus () {
       let type = this.$route.query.type;
-      return type == 'teamDraft' || type == 'resetTeam'
+      return type == 'teamDraft' || type == 'resetTeam' || type == 'PRE_BUILD_FEE'
     }
   },
-  activated () {
-    this.init();
-  },
+  // activated () {
+  //   this.init();
+  // },
   methods: {
     async init () {
       try {

+ 1 - 0
src/views/studentManager/studentList.vue

@@ -257,6 +257,7 @@
               >
               <el-button
                 type="text"
+                style="padding-left: 10px;"
                 v-permission="'studentManage/studentUpdate'"
                 @click="resetStudent(scope.row)"
                 >修改</el-button

+ 5 - 3
src/views/teacherManager/teacherOperation/components/accompanySet.vue

@@ -103,11 +103,13 @@
       </div>
     </el-dialog>
     <div class="btnWrap">
-      <div class="newBand"
+      <el-button type="primary" v-permission="'teacherFreeTime/updateSet'" @click="submitOk">确定</el-button>
+      <el-button type="primary" @click="resetTime">重置</el-button>
+      <!-- <div class="newBand"
            @click="submitOk"
            v-permission="'teacherFreeTime/updateSet'">确定</div>
       <div class="newBand"
-           @click="resetTime">重置</div>
+           @click="resetTime">重置</div> -->
     </div>
   </div>
 </template>
@@ -529,4 +531,4 @@ export default {
   background-color: #14928a;
   border-color: #14928a;
 }
-</style>
+</style>

+ 10 - 0
src/views/teacherManager/teacherOperation/components/teacherOperation.vue

@@ -598,6 +598,16 @@ export default {
             });
           }
         } else {
+          this.$nextTick(() => {
+            let isError = document.getElementsByClassName('is-error')
+            isError[0].scrollIntoView({
+              // 滚动到指定节点
+              // 值有start,center,end,nearest,当前显示在视图区域中间
+              block: 'center',
+              // 值有auto、instant,smooth,缓动动画(当前是慢速的)
+              behavior: 'smooth',
+            })
+          })
           return false;
         }
       });

+ 16 - 0
src/views/teamBuild/api.js

@@ -38,3 +38,19 @@ export const closeMusicGroup = data => request2({
   method: 'post',
   requestType: 'json'
 })
+
+// 开启缴费
+export const finishPreApply = data => request2({
+  url: '/api-web/musicGroup/finishPreApply',
+  data,
+  method: 'post',
+  requestType: 'form'
+})
+
+// 预报名列表
+export const queryPreApplyList = data => request2({
+  url: '/api-web/studentRegistration/queryPreApplyList',
+  params: data,
+  method: 'get',
+  requestType: 'json'
+})

+ 29 - 3
src/views/teamBuild/components/soundSetComponents/soundSetCore.vue

@@ -454,9 +454,26 @@ export default {
                 id: res.data,
               },
             });
-            this.$emit("chiosetab", 2);
-            this.$emit("getBaseInfo", obj);
+            // this.$emit("chiosetab", 2);
+            // this.$emit("getBaseInfo", obj);
             //  zheli
+
+            // 把第3步单独拆出来做成独立的模块
+            this.$confirm('乐团是否提交审核?', '提示', {
+              confirmButtonText: '确定',
+              cancelButtonText: '取消',
+              type: 'warning'
+            }).then(() => {
+              this.teamStatus = 'teamDraft'
+              this.submitInfo(1)
+            }).catch(() => {
+              this.$router.push({
+                path: '/business/teamDetail',
+                query: {
+                  ...query
+                }
+              })
+            });
           }
         });
       } else {
@@ -471,7 +488,16 @@ export default {
         updateSubjectInfo(obj).then((res) => {
           if (res.code == 200) {
             this.$message.success("提交成功");
-            this.$emit("chiosetab", 2);
+            // this.$emit("chiosetab", 2);
+
+            // 创建乐团,只会到声部了
+            let query = this.$route.query
+            this.$router.push({
+              path: '/business/teamDetail',
+              query: {
+                ...query
+              }
+            })
           }
         });
       }

+ 37 - 23
src/views/teamBuild/components/teamBaseInfo.vue

@@ -158,6 +158,20 @@
             ></el-option>
           </el-select>
         </el-form-item>
+        <!-- <el-form-item
+          label="预报名截止时间"
+          prop="time"
+          :rules="[{ required: true, message: '请输入预报名截止时间' }]"
+        >
+          <el-date-picker
+            v-model.trim="topFrom.time"
+            :disabled="basdisabled"
+            type="date"
+            value-format="yyyy-MM-dd"
+            :picker-options="beginDate()"
+            placeholder="选择日期"
+          ></el-date-picker>
+        </el-form-item> -->
         <el-form-item
           label="报名截止时间"
           prop="time"
@@ -450,29 +464,29 @@ export default {
     };
   },
   created() {},
-  activated() {
-    this.payList = {
-      school: {
-        ischeck: false,
-        value: "",
-        price: "",
-        chiose: "",
-      },
-      company: {
-        ischeck: false,
-        value: "",
-        price: "",
-        chiose: "",
-      },
-      student: {
-        ischeck: true,
-        chiose: "loop",
-      },
-      chioseMonth: [], // 选中的月份
-    };
-    this.init();
-    this.$forceUpdate();
-  },
+  // activated() {
+  //   this.payList = {
+  //     school: {
+  //       ischeck: false,
+  //       value: "",
+  //       price: "",
+  //       chiose: "",
+  //     },
+  //     company: {
+  //       ischeck: false,
+  //       value: "",
+  //       price: "",
+  //       chiose: "",
+  //     },
+  //     student: {
+  //       ischeck: true,
+  //       chiose: "loop",
+  //     },
+  //     chioseMonth: [], // 选中的月份
+  //   };
+  //   this.init();
+  //   this.$forceUpdate();
+  // },
   mounted() {
     this.init();
     this.$forceUpdate();

+ 23 - 7
src/views/teamBuild/components/teamSoundSet.vue

@@ -9,25 +9,41 @@
                   @getBaseInfo="getBaseInfo"
                   @getNumber="getNumber" />
     <div class="btnWrap">
-      <el-button type="primary" @click="goback" style="margin-right: 10px;">上一步</el-button>
+      <el-button type="primary" @click="goback">上一步</el-button>
+
+      <el-button type="primary"
+        v-if="teamStatus == 'newTeam'"
+        @click="submitInfo()"
+        v-permission="{
+          child: 'musicGroup/createGroup',
+          parent: '/teamBuild/soundMoney',
+        }">提交</el-button>
+      <el-button type="primary" @click="submitAudit(1)" v-if="teamStatus == 'teamDraft'">提交审核</el-button>
+      <el-button type="primary" @click="approval"
+           v-if="teamStatus == 'teamAudit'"
+           v-permission="{child: 'musicGroup/auditSuccess', parent: '/teamBuild/teamAudit/soundMoney'}">审核通过</el-button>
+      <el-button type="danger" @click="refuse"
+           v-if="teamStatus == 'teamAudit'"
+           v-permission="{child: 'musicGroup/auditFailed', parent: '/teamBuild/teamAudit/soundMoney'}">驳回</el-button>
       <!--  v-if="teamStatus != 'teamAudit'" -->
-      <div
+      <!-- <div
         class="submitBtn"
+        v-if="teamStatus == 'newTeam'"
         v-permission="{
           child: 'musicGroup/createGroup',
           parent: '/teamBuild/soundMoney',
         }"
         @click="submitInfo()"
       >
-        下一步
+        提交
       </div>
-      <!-- <div
+      <div
         class="submitBtn"
         @click="submitAudit(1)"
-        v-if="teamStatus != 'teamAudit'"
+        v-if="teamStatus == 'teamDraft'"
       >
         提交审核
-      </div> -->
+      </div>
       <div class="submitBtn"
            @click="approval"
            v-if="teamStatus == 'teamAudit'"
@@ -39,7 +55,7 @@
            v-if="teamStatus == 'teamAudit'"
            v-permission="{child: 'musicGroup/auditFailed', parent: '/teamBuild/teamAudit/soundMoney'}">
         驳回
-      </div>
+      </div> -->
     </div>
   </div>
 </template>

+ 74 - 0
src/views/teamBuild/createPayment.vue

@@ -0,0 +1,74 @@
+<template>
+    <div class="m-container">
+        <h2>
+          <el-page-header @back="onCancel" :content="teamName"></el-page-header>
+        </h2>
+        <el-tabs v-model.trim="activeIndex"
+             type="card"
+                    @tab-click="handleClick">
+            <el-tab-pane label="学员缴费"
+                        v-if="permission('/resetTeaming/teamBaseInfo')"
+                        name="1">
+                <resetPayList :isNewGropu="true"
+                            :baseInfo="baseInfo" />
+            </el-tab-pane>
+            <el-tab-pane label="学校缴费"
+                        v-if="permission('/resetTeaming/resetSound')"
+                        name="2">
+                <resetPayListSchool :isNewGropu="true"
+                                    :baseInfo="baseInfo"
+                                    v-if="activeIndex == 2" />
+            </el-tab-pane>
+        </el-tabs>
+        <el-button type="primary" @click="goHome"></el-button>
+    </div>
+</template>
+
+<script>
+import resetPayList from "@/views/resetTeaming/components/resetPayList";
+import resetPayListSchool from '@/views/resetTeaming/components/resetPayListSchool'
+import { permission } from "@/utils/directivePage";
+import { getTeamBaseInfo } from "@/api/buildTeam";
+export default {
+    name: 'createPayment',
+    components: { resetPayList, resetPayListSchool },
+    data () {
+        const query = this.$route.query
+        return {
+            teamName: query.name,
+            musicGroupId: query.id,
+            activeIndex: '1',
+            baseInfo: {}
+        };
+    },
+    mounted() {
+        // getTeamBaseInfo
+        this.getList()
+    },
+    methods: {
+        permission,
+        handleClick (val) {
+            this.activeIndex = val.name
+        },
+        onCancel() {
+            this.$router.push({ path: "/business/teamDetail" });
+        },
+        async getList() {
+            await getTeamBaseInfo({ musicGroupId: this.musicGroupId }).then((res) => {
+                if (res.code == 200) {
+                    this.baseInfo = res.data
+                }
+            });
+        },
+        goHome () {
+            let query = this.$route.query
+            this.$router.push({
+                path: '/business/teamDetail',
+                query: {
+                ...query
+                }
+            })
+        }
+    }
+}
+</script>

+ 335 - 0
src/views/teamBuild/forecastName.vue

@@ -0,0 +1,335 @@
+<template>
+    <div class="forecastName m-container">
+        <h2>
+          <el-page-header @back="onCancel" :content="teamName"></el-page-header>
+        </h2>
+
+        <!-- <p style="margin-bottom: 15px; font-size: 18px; font-weight: 400">
+          缴费截止时间:{{ '2020-12-12' | formatTimer }}
+        </p> -->
+
+        <div class="btnList">
+            <auth :auths="['/main']">
+              <el-button type="primary" @click="codeStatus = true">预报名链接</el-button>
+            </auth>
+            <!-- <auth>
+              <el-button type="primary" @click="extendPaymentStatus = true">预报名时间延长</el-button>
+            </auth> -->
+            <auth>
+              <el-button type="primary">家长会通知</el-button>
+            </auth>
+            <auth :auths="['musicGroup/finishPreApply']">
+              <el-button type="primary" @click="onPaymentGroup">乐团缴费</el-button>
+            </auth>
+            <auth :auths="['musicGroup/finishPreApply/item']">
+              <el-button type="primary" @click="onPaymentGroup(1)">特色乐团缴费</el-button>
+            </auth>
+        </div>
+
+        <div class="m-core">
+            <save-form
+                :inline="true"
+                @reset="onReSet"
+                @submit="search"
+                :model="searchForm"
+                ref="searchForm"
+            >
+                <el-form-item>
+                    <el-input
+                        v-model.trim="searchForm.name"
+                        clearable
+                        @keyup.enter.native="search"
+                        placeholder="学生编号/姓名/手机号"
+                    ></el-input>
+                </el-form-item>
+                <el-form-item prop="isAllowAdjust">
+                    <el-select
+                        v-model.trim="searchForm.isAllowAdjust"
+                        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-select clearable v-model="searchForm.subjectId" placeholder="所选专业">
+                        <el-option v-for="item in selects.subjects" :value="item.id" :label="item.name" :key="item.id"></el-option>
+                    </el-select>
+                </el-form-item>
+                <el-form-item>
+                    <el-button type="danger" native-type="seach">搜索</el-button>
+                    <el-button native-type="reset" type="primary">重置</el-button>
+                </el-form-item>
+            </save-form>
+            <div class="tableWrap">
+                <el-table
+                style="width: 100%"
+                :header-cell-style="{ background: '#EDEEF0', color: '#444' }"
+                :data="tableList"
+                >
+                    <el-table-column
+                        align="center"
+                        prop="userId"
+                        label="学员编号"
+                    >
+                        <template slot-scope="scope">
+                            <copy-text>{{ scope.row.userId }}</copy-text>
+                        </template>
+                    </el-table-column>
+                    <el-table-column
+                        align="center"
+                        prop="userName"
+                        label="学员姓名"
+                    ></el-table-column>
+                    <el-table-column
+                        align="center"
+                        prop="gender"
+                        label="性别"
+                    >
+                        <template slot-scope="scope">
+                            {{ scope.row.gender ? '男' : '女' }}
+                        </template>
+                    </el-table-column>
+                    <el-table-column
+                        align="center"
+                        prop="phone"
+                        label="联系电话"
+                    >
+                        <template slot-scope="scope">
+                            <copy-text>{{ scope.row.phone }}</copy-text>
+                        </template>
+                    </el-table-column>
+                    <el-table-column
+                        align="center"
+                        label="年级班级"
+                    >
+                        <template slot-scope="scope">
+                            {{ scope.row.currentGrade }}{{ scope.row.currentClass }}
+                        </template>
+                    </el-table-column>
+                    <el-table-column
+                        align="center"
+                        prop="subjectFirstName"
+                        label="选报声部1"
+                    ></el-table-column>
+                    <el-table-column
+                        align="center"
+                        prop="subjectSecondName"
+                        label="选报声部2"
+                    ></el-table-column>
+                    <el-table-column
+                        align="center"
+                        prop="isAllowAdjust"
+                        label="是否服从调剂"
+                    >
+                        <template slot-scope="scope">
+                            {{ scope.row.isAllowAdjust ? '是' : '否' }}
+                        </template>
+                    </el-table-column>
+                    <el-table-column
+                        align="center"
+                        prop="realName"
+                        label="乐器准备方式"
+                    >
+                        <template slot-scope="scope">
+                            {{ scope.row.kitPurchaseMethod == 1 ? '参与团购' : '自行准备' }}
+                        </template>
+                    </el-table-column>
+                    <el-table-column
+                        align="center"
+                        prop="courseScheduleId"
+                        width="150"
+                        label="操作"
+                    >
+                        <template slot-scope="scope">
+                            <auth :auths="['visit/add']" :router="['/business/forecastName']">
+                                <el-button
+                                type="text"
+                                @click="addVisited(scope.row)"
+                                >新增回访</el-button>
+                            </auth>
+                        </template>
+                    </el-table-column>
+                </el-table>
+                <pagination
+                    sync
+                    :total.sync="pageInfo.total"
+                    :page.sync="pageInfo.page"
+                    :limit.sync="pageInfo.limit"
+                    :page-sizes="pageInfo.page_size"
+                    @pagination="getList"
+                    />
+            </div>
+        </div>
+
+        <!-- 预报名连接 -->
+        <qr-code v-model="codeStatus" title="预报名二维码" :codeUrl="codeUrl" />
+        <!-- 预报名时间延长 -->
+        <!-- <el-dialog
+            title="预报名时间延长"
+            :visible.sync="extendPaymentStatus"
+            destroy-on-close
+            width="400px"
+        >
+            <el-form label-width="120px" :model="extendForm" ref="extendForm" :rules="extendRule">
+                <el-form-item label="延长预报名时间" prop="expireDate">
+                    <el-date-picker
+                        v-model.trim="extendForm.expireDate"
+                        value-format="yyyy-MM-dd"
+                        type="date"
+                        :picker-options="applyDates"
+                        placeholder="选择日期"
+                    >
+                    </el-date-picker>
+                </el-form-item>
+            </el-form>
+            <div slot="footer" class="dialog-footer">
+                <el-button @click="extendPaymentStatus = false">取 消</el-button>
+                <el-button
+                    type="primary"
+                    @click="onExtendPayment('extendForm')"
+                >确 定</el-button>
+            </div>
+        </el-dialog> -->
+        <!-- 回访记录 -->
+        <el-dialog
+            title="新增回访"
+            width="600px"
+            destroy-on-close
+            :close-on-click-modal="false"
+            :visible.sync="visitVisible"
+        >
+            <visit-model v-if="visitVisible" @close="visitVisible = false" :visitDetail="visitDetail" />
+        </el-dialog>
+    </div>
+</template>
+
+<script>
+import pagination from "@/components/Pagination/index";
+import qrCode from '@/components/QrCode/index';
+import { permission } from "@/utils/directivePage";
+import { vaildStudentUrl } from '@/utils/validate'
+import visitModel from './modals/visit'
+import { queryPreApplyList, finishPreApply } from './api'
+export default {
+    name: 'forecastName',
+    components: { pagination, qrCode, visitModel },
+    data() {
+        const query = this.$route.query
+        return {
+            teamName: query.name || null,
+            codeStatus: false,
+            musicGroupId: query.id,
+            codeUrl: vaildStudentUrl() + '/project/forecastName/index.html?musicGroupId=' + query.id,
+            searchForm: {
+                name: null,
+                subjectId: null,
+                isAllowAdjust: null,
+            },
+            tableList: [],
+            pageInfo: {
+                // 分页规则
+                limit: 10, // 限制显示条数
+                page: 1, // 当前页
+                total: 0, // 总条数
+                page_size: [10, 20, 40, 50], // 选择限制显示条数
+            },
+            visitVisible: false,
+            visitDetail: null,
+            extendPaymentStatus: false,
+            extendForm: {
+                expireDate: null,
+            },
+            extendRule: {
+                expireDate: [
+                    { required: true, message: "请选择延长时间", trigger: "change" },
+                ],
+            },
+        }
+    },
+    mounted() {
+        this.$store.dispatch('setSubjects')
+        this.getList()
+    },
+    methods: {
+        permission,
+        onReSet() {
+            this.$refs['searchForm'].resetFields()
+            this.search()
+        },
+        search() {
+            this.pageInfo.page = 1
+            this.getList()
+        },
+        onCancel() {
+            this.$router.push({ path: "/business/teamDetail" });
+        },
+        async getList() {
+            try {
+                const result = await queryPreApplyList({
+                    ...this.searchForm,
+                    page: this.pageInfo.page,
+                    rows: this.pageInfo.limit
+                })
+                this.tableList = result.data.rows
+                this.pageInfo.total = result.data.total
+            } catch (error) {}
+        },
+        async onPaymentGroup(type) {
+            try {
+                const result = await finishPreApply({
+                    isCheckStudentNum: type == 1  ? false : true,
+                    musicGroupId: this.musicGroupId
+                })
+                this.$router.push({
+                    path: '/business/teamDetail'
+                })
+            } catch(error) {}
+        },
+        addVisited(rows) {
+            // 新增回访
+            this.visitVisible = true
+            this.visitDetail =  {
+                musicGroupId: rows.musicGroupId,
+                overview: "",
+                purpose: "",
+                studentId: rows.userId,
+                type: "",
+                visitTime: "",
+                visitType: "",
+                feedback: "",
+                studentName: rows.userName,
+            }
+            // this.visitDetail = rows
+        },
+        onExtendPayment(formName) {
+            this.$refs[formName].validate(valid => {
+                if(valid) {
+
+                }
+            })
+        },
+        applyDates() {
+            let self = this;
+            return {
+                firstDayOfWeek: 1,
+                disabledDate(time) {
+                if (self.paymentExpireDate) {
+                    return (
+                    time.getTime() >
+                    new Date(self.paymentExpireDate.replace(/-/g, "/")).getTime()
+                    );
+                } else {
+                    return false;
+                }
+                },
+            };
+        },
+    }
+}
+</script>
+
+<style lang="less" scoped>
+
+</style>

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

@@ -30,7 +30,7 @@
                class="arrow" />
         </span>
         <!--  @click="activeIndex = 2" -->
-        <span class="stepspan stepspan3"
+        <!-- <span class="stepspan stepspan3"
               v-if="showFlag?activeIndex  >=  2:true">
           <div class="step2 sptep"
                :class="activeIndex  >=  2 ? 'activestep' : ''">
@@ -39,7 +39,7 @@
           <img :src="activeIndex >= 2 ? stepImgs.nol : stepImgs.active"
                alt=""
                class="arrow" />
-        </span>
+        </span> -->
       </div>
 
       <!-- 下面显示的内容 -->
@@ -55,11 +55,11 @@
                           :getTeamList="getTeamList"
                           @getBaseInfo="getBaseInfo" />
         </div>
-        <div v-if="activeIndex == 2">
+        <!-- <div v-if="activeIndex == 2">
           <teamPayInfo @chiosetab="chiosetab"
                        :getTeamList="getTeamList"
                        :baseInfo="baseInfo" />
-        </div>
+        </div> -->
       </div>
     </div>
   </div>

+ 135 - 0
src/views/teamBuild/modals/visit.vue

@@ -0,0 +1,135 @@
+<template>
+    <div>
+        <el-form
+            :model="visitForm"
+            label-width="120px"
+            label-position="right"
+            ref="visitForm"
+            :rules="visitRules"
+        >
+            <el-form-item label="学生姓名">
+                <p>{{ visitForm.studentName }}</p>
+            </el-form-item>
+            <el-form-item label="回访类型" prop="visitType">
+                <el-cascader
+                    expand-trigger="hover"
+                    clearable
+                    placeholder="请选择回访类型"
+                    :options="visitChiose"
+                    @change="handleChange"
+                    style="width: 220px !important"
+                    v-model="visitForm.visitType"
+                >
+                </el-cascader>
+            </el-form-item>
+            <el-form-item label="回访日期" prop="visitTime">
+                <el-date-picker
+                    v-model.trim="visitForm.visitTime"
+                    align="right"
+                    style="width: 220px !important"
+                    type="date"
+                    placeholder="选择日期"
+                    :picker-options="pickerOptions"
+                    value-format="yyyy-MM-dd"
+                ></el-date-picker>
+            </el-form-item>
+            <el-form-item label="学员情况" prop="overview">
+                <el-input
+                    type="textarea"
+                    v-model="visitForm.overview"
+                    style="width: 80% !important"
+                    :rows="3"
+                    maxlength="50"
+                    show-word-limit
+                ></el-input>
+            </el-form-item>
+            <el-form-item label="家长反馈" prop="feedback">
+                <el-input
+                    type="textarea"
+                    v-model="visitForm.feedback"
+                    style="width: 80% !important"
+                    :rows="3"
+                    maxlength="50"
+                    show-word-limit
+                ></el-input>
+            </el-form-item>
+        </el-form>
+        <span slot="footer" class="dialog-footer">
+            <el-button @click="$listeners.close()">取 消</el-button>
+            <el-button type="primary" @click="submitAddVisit">确 定</el-button>
+        </span>
+    </div>
+</template>
+
+<script>
+import { visitChiose } from "@/utils/searchArray";
+import { addVisit } from "@/views/returnVisitManager/api.js";
+import cleanDeep from 'clean-deep';
+export default {
+    name: 'visit',
+    props: ['visitDetail'],
+    data() {
+        return {
+            visitForm: {
+                musicGroupId: "",
+                overview: "",
+                purpose: "",
+                studentId: "",
+                type: "",
+                visitTime: "",
+                visitType: "",
+                feedback: "",
+                studentName: "",
+            },
+            visitChiose,
+            visitRules: {
+                overview: [{ required: true, message: "请输入学生近况" }],
+                feedback: [{ required: true, message: "请输入家长反馈" }],
+                visitTime: [{ required: true, message: "请输入回访时间" }],
+                visitType: [{ required: true, message: "请选择回访类型" }],
+            },
+            pickerOptions: {}
+        }
+    },
+    async mounted() {
+        this.pickerOptions = this.beginDate(new Date());
+        this.visitForm = { ...this.visitDetail }
+    },
+    methods: {
+        handleChange(val) {
+            this.visitForm.type = val[0];
+            this.visitForm.purpose = val[1];
+        },
+        submitAddVisit() {
+            this.$refs.visitForm.validate(async (res) => {
+                if (res) {
+                    this.visitForm.visitType = null;
+                    this.visitForm.musicGroupId = this.id;
+                    await addVisit(cleanDeep(this.visitForm)).then((res) => {
+                        if (res.code === 200) {
+                            this.$message.success("新增成功");
+                            this.$listeners.close()
+                        }
+                    });
+                }
+            });
+        },
+        beginDate(date) {
+            let self = this;
+            return {
+                firstDayOfWeek: 1,
+                disabledDate(time) {
+                    return time.getTime() >= date.getTime(); //开始时间不选时,结束时间最大值小于等于当天
+                },
+            };
+        },
+    }
+}
+</script>
+
+<style lang="less" scoped>
+.dialog-footer {
+    display: block;
+    text-align: right;
+}
+</style>

+ 29 - 7
src/views/teamDetail/teamList.vue

@@ -4,10 +4,9 @@
       <div class="squrt"></div>乐团列表
     </h2>
     <div class="m-core">
-      <div class="btnList">
-        <div class='newBand'
-             v-permission="'/teamBuild'"
-             @click="createNewTeam">新建乐团</div>
+      <div class="btnList" style="margin-bottom: 20px">
+        <el-button type="primary" v-permission="'/teamBuild'"
+             @click="createNewTeam">新建乐团</el-button>
         <!-- <div class='newBand'
              v-permission="'/teamBuild/trimming'"
              @click="resetTeam">乐团调整</div> -->
@@ -201,11 +200,21 @@
                            v-if="scope.row.status == 'PROGRESS' && permission('/teamDetails')"
                            @click="lookTeamDetail(scope.row)">查看</el-button>
 
+                <!-- 预报名中 查看 -->
+                <el-button type="text"
+                           v-if="scope.row.status == 'PRE_APPLY' && permission('studentRegistration/queryPreApplyList')"
+                           @click="lookTeamDetail(scope.row)">查看</el-button>
+
                 <!-- 暂停中 查看 -->
                 <el-button type="text"
                            v-if="scope.row.status == 'PAUSE' && permission('musicGroup/pauseMusicGroup/look')"
                            @click="lookTeamDetail(scope.row)">查看</el-button>
 
+                <!-- 创建缴费中 查看 -->
+                <el-button type="text"
+                           v-if="scope.row.status == 'PRE_BUILD_FEE' && permission('/createPayment')"
+                           @click="lookTeamDetail(scope.row)">查看</el-button>
+
                 <!-- <el-button type="text"
                            v-if="scope.row.status != 'PROGRESS' && scope.row.status != 'CANCELED'  && scope.row.status != 'PAUSE' && scope.row.status != 'APPLY'&& scope.row.status != 'PAY'"
                            @click="lookTeamDetail(scope.row)">编辑</el-button> -->
@@ -363,7 +372,6 @@ export default {
     },
     search () {
       this.rules.page = 1;
-      console.log(this.rules)
       this.getList();
     },
     getList () {
@@ -523,6 +531,11 @@ export default {
           this.$router.push({ path: '/business/teamBuild', query: { type: 'teamAudit', id: row.id,  } })
           break;
         }
+        case 'PRE_BUILD_FEE': {
+          // 创建缴费中
+          this.$router.push({ path: '/business/createPayment', query: { type: 'PRE_BUILD_FEE', id: row.id, name: row.name } })
+          break;
+        }
         case 'FEE_AUDIT': {
           // 费用审核中
           this.$router.push({ path: '/business/teamBuild', query: { type: 'feeAudit', id: row.id,  } })
@@ -533,14 +546,23 @@ export default {
           this.$router.push({ path: '/business/teamBuild', query: { type: 'teamDraft', id: row.id,  } })
           break;
         }
+        case 'PRE_APPLY': {
+          // 预报名
+          this.$router.push({ path: '/business/forecastName', query: { id: row.id, name: row.name  } })
+          break;
+        }
         case 'APPLY': {
           // 报名中
-          this.$router.push({ path: `/business/signupList`, query: { status: row.status, id: row.id, name: row.name, } })
+          this.$router.push({ path: `/business/signupList`, query: { status: row.status, id: row.id, name: row.name, } }, router => {
+            router.meta.title = "报名详情"
+          })
           break;
         }
         case 'PAY': {
           // 缴费中
-          this.$router.push({ path: `/business/signupList`, query: { status: row.status, id: row.id, name: row.name,  } })
+          this.$router.push({ path: `/business/signupList`, query: { status: row.status, id: row.id, name: row.name,  } }, router => {
+            router.meta.title = "缴费详情"
+          })
           break;
         }
         case 'PREPARE': {

+ 28 - 18
src/views/workBenchManager/classFeesIsOk.vue

@@ -133,6 +133,7 @@
           <el-date-picker
             :clearable="false"
             v-model="searchForm.month"
+            style="width: 100%"
             type="month"
             value-format="yyyy-MM"
             placeholder="选择年月"
@@ -591,16 +592,25 @@ export default {
         .catch(() => {});
     },
     resetSalary(row) {
-      let obj = {
-        finalSalary: row.finalSalary, // 实发
-        reduceSalary: row.reduceSalary, // 扣款
-        actualSalary: row.actualSalary, // 应发
-        courseScheduleId: row.courseScheduleId,
-        memo: row.memo,
-        teacherId: row.teacherId,
-      };
-      this.$set(this, "visibleForm", obj);
-      console.log(this.visibleForm.finalSalary);
+      this.$nextTick(() => {
+        this.visibleForm = {
+           finalSalary: row.finalSalary, // 实发
+           reduceSalary: row.reduceSalary, // 扣款
+           actualSalary: row.actualSalary, // 应发
+           courseScheduleId: row.courseScheduleId,
+           memo: row.memo,
+           teacherId: row.teacherId
+        }
+      })
+      // let obj = {
+      //   finalSalary: row.finalSalary, // 实发
+      //   reduceSalary: row.reduceSalary, // 扣款
+      //   actualSalary: row.actualSalary, // 应发
+      //   courseScheduleId: row.courseScheduleId,
+      //   memo: row.memo,
+      //   teacherId: row.teacherId,
+      // };
+      // this.$set(this, "visibleForm", obj);
       this.dialogVisible = true;
     },
     subreset() {
@@ -664,14 +674,14 @@ export default {
     },
     dialogVisible(val) {
       if (!val) {
-        this.visibleForm = {
-          expectSalary: null,
-          reduceSalary: null,
-          actualSalary: null,
-          courseScheduleId: null,
-          teacherId: null,
-          memo: null,
-        };
+        // this.visibleForm = {
+        //   expectSalary: null,
+        //   reduceSalary: null,
+        //   actualSalary: null,
+        //   courseScheduleId: null,
+        //   teacherId: null,
+        //   memo: null,
+        // };
         this.$refs["visibleForm"].resetFields();
       }
     },