lex-xin 5 rokov pred
rodič
commit
73faf17f7b

+ 61 - 1
src/api/businessManager.js

@@ -8,4 +8,64 @@ export function goodsQuery(data) {
         method: 'get',
         params: data
     })
-}
+}
+
+// 根据商品(教材、辅件)编号查询商品(教材、辅件)
+export function goodsSingleQuery(data) {
+    return request({
+        url: `/web-server/goods/get/${data}`,
+        method: 'get'
+    })
+}
+
+// 新增商品(教材、辅件)
+export function goodsAdd(data) {
+    return request({
+        url: '/web-server/goods/add',
+        method: 'post',
+        data: qs.stringify(data)
+    })
+}
+
+// 修改商品(教材、辅件)
+export function goodsUpdate(data) {
+    return request({
+        url: '/web-server/goods/update',
+        method: 'post',
+        data: qs.stringify(data)
+    })
+}
+
+// 删除商品(教材、辅件)
+export function goodsDelete(data) {
+    return request({
+        url: `/web-server/goods/del/${data}`,
+        method: 'post'
+    })
+}
+
+// 参数列表
+export function categoryListTree(data) {
+    return request({
+        url: '/web-server/category/queryPage',
+        method: 'get',
+        params: data
+    })
+}
+
+// 新增、修改商品类型
+export function categoryUpSet(data) {
+    return request({
+        url: '/web-server/category/upset',
+        method: 'post',
+        data: data
+    })
+}
+
+// 删除商品分类
+export function categoryDel(id) {
+    return request({
+        url: `/web-server/category/del/${id}`,
+        method: 'post'
+    })
+}

+ 0 - 34
src/api/shopManager.js

@@ -1,34 +0,0 @@
-// 通用设置api文件
-import request from '@/utils/request'
-import qs from 'qs'
-// 参数列表
-export function categoryListTree(data) {
-    return request({
-        url: '/web-server/category/queryPage',
-        method: 'get',
-        params: data
-    })
-}
-// 新增商品类型
-export function categoryAdd(data) {
-    return request({
-        url: '/web-server/category/add',
-        method: 'post',
-        data: qs.stringify(data)
-    })
-}
-// 修改商品类型
-export function categoryUpdate(data) {
-    return request({
-        url: '/web-server/category/update',
-        method: 'post',
-        data: qs.stringify(data)
-    })
-}
-// 删除商品分类
-export function categoryDel(id) {
-    return request({
-        url: `/web-server/category/del/${id}`,
-        method: 'post'
-    })
-}

+ 54 - 0
src/api/studentManager.js

@@ -11,3 +11,57 @@ export function queryStudentList(data) {
     })
 }
 
+// 根据学生ID获取学生基本报名信息
+export function findStudentBaseInfo(data) {
+    return request({
+        url: '/web-server/studentManage/findStudentBaseInfo',
+        method: 'get',
+        params: data
+    })
+}
+
+// 根据学生ID获取其所在的乐团
+export function findStudentMusicGroups(data) {
+    return request({
+        url: `/web-server/studentManage/findStudentMusicGroups`,
+        method: 'get',
+        params: data
+    })
+}
+
+// 根据乐团获取排课列表
+export function findStudentCourses(data) {
+    return request({
+        url: `/web-server/studentManage/findStudentCourses`,
+        method: 'get',
+        params: data
+    })
+}
+
+// 获取学生vip课
+export function findStudentVipGroups(data) {
+    return request({
+        url: `/web-server/studentManage/findStudentVipGroups`,
+        method: 'get',
+        params: data
+    })
+}
+
+// 获取学生签到列表
+export function findStudentAttendances(data) {
+    return request({
+        url: `/web-server/studentManage/findStudentAttendances`,
+        method: 'get',
+        params: data
+    })
+}
+
+// 提现分页查询
+export function studentWithdraw(data) {
+    return request({
+        url: `/web-server/studentWithdraw/queryPage`,
+        method: 'get',
+        params: data
+    })
+}
+

+ 1 - 1
src/utils/request.js

@@ -80,7 +80,7 @@ service.interceptors.response.use(
         type: 'error',
         duration: 5 * 1000
       })
-
+      console.log(res)
       // 50008: Illegal token; 50012: Other clients logged in; 50014: Token expired;
       if (res.code == 401 || res.code == 403) {
         this.$message({

+ 88 - 0
src/utils/vueFilter.js

@@ -20,4 +20,92 @@ Vue.filter('jobNature', (value) => {
         TEMPORARY: "零时工"
     }
     return template[value]
+})
+
+// 合作单位
+Vue.filter('branchType', (value) => {
+    let template = {
+        OWN: "自有",
+        COOPERATION: "合作",
+        LEASE: "租赁"
+    }
+    return template[value]
+})
+
+// 商品类型
+Vue.filter('shopType', (value) => {
+    let template = {
+        "INSTRUMENT": "乐器",
+        "ACCESSORIES": "辅件",
+        "TEACHING": "教材",
+        "STAFF": "教谱",
+        "OTHER": "其它",
+    }
+    return template[value]
+})
+
+// 乐团状态
+Vue.filter('musicGroupType', (value) => {
+    let template = {
+        APPLY: '报名中',
+        PAY: '缴费中',
+        PREPARE: '筹备中',
+        UNDERWAY: '进行中',
+        CANCELED: '取消'
+    }
+    return template[value]
+})
+
+// 乐团学员状态
+Vue.filter('musicGroupStudentType', (value) => {
+    let template = {
+        NORMAL: "在读", 
+        LEAVE: "请假", 
+        QUIT: "退团"
+    }
+    return template[value]
+})
+
+// 乐团学员状态
+Vue.filter('instrumentType', (value) => {
+    let template = {
+        GROUP: "团购", 
+        OWNED: "自备", 
+        LEASE: "租赁"
+    }
+    return template[value]
+})
+
+// 课程类型
+Vue.filter('coursesType', (value) => {
+    let template = {
+        NORMAL: "单技课", 
+        MIX: "合奏课", 
+        HIGH: "小班课",
+        VIP: "VIP课",
+        DEMO: "试听课"
+    }
+    return template[value]
+})
+
+// 课程状态
+Vue.filter('coursesStatus', (value) => {
+    let template = {
+        NOT_START: "未开始", 
+        UNDERWAY: "进行中", 
+        OVER: "已结束"
+    }
+    return template[value]
+})
+
+// 考勤类型
+Vue.filter('clockingIn', value => {
+    let templateStatus = {
+        NORMAL: "正常",
+        TRUANT: "旷课",
+        LEAVE: "请假",
+        QUIT_SCHOOL: "休学",
+        DROP_OUT: "退学"
+    }
+    return templateStatus[value]
 })

+ 21 - 10
src/views/businessManager/shopManager/shopCategory.vue

@@ -8,10 +8,10 @@
       <div class="tableWrap">
         <el-table :data='tableList'>
           <el-table-column align='center' prop="name"
-                           label="商品名称">
+                           label="分类名称">
           </el-table-column>
           <el-table-column align='center' 
-                           label="声部组合">
+                           label="声部属性">
             <template slot-scope="scope">
               {{ scope.row.subjectName | joinArray(',') }}
             </template>
@@ -34,10 +34,10 @@
     <el-dialog :title="formTitle[formActionTitle]" :visible.sync="typeStatus"
                @close="onFormClose('ruleForm')" width="500px">
       <el-form :model="form" :rules="rules" ref="ruleForm">
-        <el-form-item label="作业模板名称" prop="name" :label-width="formLabelWidth">
+        <el-form-item label="商品分类名称" prop="name" :label-width="formLabelWidth">
           <el-input v-model="form.name" autocomplete="off"></el-input>
         </el-form-item>
-        <el-form-item label="声部选择" v-if="form.classGroupType != 'MIX'"
+        <el-form-item label="声部属性" v-if="form.classGroupType != 'MIX'"
           prop="subjectIds" :label-width="formLabelWidth">
           <el-select v-model="form.subjectIds" multiple>
               <el-option-group
@@ -65,7 +65,8 @@
 <script>
 import pagination from '@/components/Pagination/index'
 import store from '@/store'
-import { chargeTypeList, subjectListTree, chargeTypeUpSet } from '@/api/specialSetting'
+import { subjectListTree } from '@/api/specialSetting'
+import { categoryListTree, categoryUpSet, categorydel } from '@/api/businessManager'
 export default {
   components: { pagination },
   name: 'adminManager',
@@ -75,8 +76,8 @@ export default {
       subjectList: [], // 声部列表
       formActionTitle: 'create',
       formTitle: {
-        create: '添加作业模板',
-        update: '修改作业模板'
+        create: '添加商品分类',
+        update: '修改商品分类'
       },
       typeStatus: false, // 添加教学点 
       formLabelWidth: '120px',
@@ -110,11 +111,11 @@ export default {
             if(this.form.id) { // 判断有没有Id,如果有则删除
               delete this.form.id
             }
-            chargeTypeUpSet(this.form).then(res => {
+            categoryUpSet(this.form).then(res => {
               this.messageTips('添加', res)
             })
           } else if (this.formActionTitle == 'update') {
-            chargeTypeUpSet(this.form).then(res => {
+            categoryUpSet(this.form).then(res => {
               this.messageTips('修改', res)
             })
           }
@@ -123,6 +124,11 @@ export default {
         }
       })
     },
+    onTypesDel(row) {
+      categoryDel(row.id).then(res => {
+        this.messageTips('删除', res)
+      })
+    },
     messageTips(title, res) {
       if(res.code == 200) {
         this.$message({
@@ -136,7 +142,11 @@ export default {
       }
     },
     getList () { 
-      chargeTypeList().then(res => {
+      categoryListTree({
+        delFlag: 0,
+        rows: this.pageInfo.limit,
+        page: this.pageInfo.page
+      }).then(res => {
         let result = res.data
         if(res.code == 200) {
           result.rows.forEach(row => {
@@ -150,6 +160,7 @@ export default {
             row.subjectIds = subjectIds
           })
           this.tableList = result.rows
+          this.pageInfo.total = result.total
         }
       })
     },

+ 60 - 14
src/views/businessManager/shopManager/shopList.vue

@@ -37,10 +37,13 @@
           <el-table-column align='center' prop="name"
                            label="商品名称">
           </el-table-column>
-          <el-table-column align='center' prop="goodsCategoryId"
+          <el-table-column align='center'
                            label="商品类型">
+            <template slot-scope="scope">
+              {{ scope.row.type | shopType }}
+            </template>
           </el-table-column>
-          <el-table-column align='center' prop="goodsCategoryId"
+          <el-table-column align='center' prop="goodsCategoryName"
                            label="商品分类">
           </el-table-column>
           <el-table-column align='center' prop="specification"
@@ -55,21 +58,27 @@
           <el-table-column align='center' prop="discountPrice"
                            label="商品采购价">
           </el-table-column>
-          <el-table-column align='center'
+          <el-table-column align='center' cell-style="padding: 0"
                            label="商品缩略图片">
             <template slot-scope="scope">
-              <img :src="scope.image" alt="" srcset="">
+              <img class="shopImage" :src="scope.row.image" alt="" srcset="">
             </template>
           </el-table-column>
-          <el-table-column align='center' prop="desc"
+          <el-table-column align='center'
                            label="商品明细">
+            <template slot-scope="scope">
+              <div class="shopDesc">
+                {{ scope.row.desc }}
+              </div>
+            </template>
           </el-table-column>
-          <el-table-column align='center'
+          <el-table-column align='center' width="140px"
                            label="操作">
             <template slot-scope="scope">
-              <el-button type="text">上架</el-button>
-              <el-button type="text">下架</el-button>
-              <el-button type="text">删除</el-button>
+              <el-button v-if="scope.row.status == 0" @click="onUpdate(scope.row)" type="text">上架</el-button>
+              <el-button v-if="scope.row.status == 0" @click="onShopOperation('update', scope.row)" type="text">修改</el-button>
+              <el-button v-if="scope.row.status == 1" @click="onUpdate(scope.row)" type="text">下架</el-button>
+              <el-button v-if="scope.row.status == 0" @click="onDelete(scope.row)" type="text">删除</el-button>
             </template>
           </el-table-column>
         </el-table>
@@ -84,7 +93,7 @@
 </template>
 <script>
 import pagination from '@/components/Pagination/index'
-import { goodsQuery } from '@/api/businessManager'
+import { goodsQuery, goodsUpdate, goodsDelete } from '@/api/businessManager'
 import store from '@/store'
 export default {
   components: { pagination },
@@ -109,6 +118,31 @@ export default {
     this.getList()
   },
   methods: {
+    onUpdate(row) {
+      goodsUpdate({
+        id: row.id,
+        status: row.id ? 0 : 1
+      }).then(res => {
+        this.messageTips(row.id ? '下架' : '上架', res)
+      })
+    },
+    onDelete(row) {
+      goodsDelete(row.id).then(res => {
+        this.messageTips('删除', res)
+      })
+    },
+    messageTips(title, res) {
+      if(res.code == 200) {
+        this.$message({
+          message: title + '成功',
+          type: 'success'
+        })
+        this.typeStatus = false
+        this.getList()
+      } else {
+        this.$message.error(res.msg)
+      }
+    },
     getList () { 
       goodsQuery({
         organId: this.organId,
@@ -121,16 +155,28 @@ export default {
         }
       })
     },
-    onShopOperation(type) {
+    onShopOperation(type, row) { // 添加或修改
+      let params = {
+        type: type
+      }
+      if(row) {
+        params.id = row.id
+      }
       this.$router.push({
         path: '/orderManager/shopOperation',
-        query: {
-          type: type
-        }
+        query: params
       })
     }
   }
 }
 </script>
 <style lang="scss">
+.shopImage {
+  width: 60px;
+  height: 60px;
+}
+.shopDesc {
+  max-height: 70px;
+  overflow: hidden;
+}
 </style>

+ 116 - 48
src/views/businessManager/shopManager/shopOperation.vue

@@ -1,6 +1,9 @@
 <template>
   <div class="m-container">
-    <h2>{{ pageType == "create" ? '添加' : '修改' }}商品</h2>
+    <h2>
+      <el-page-header @back="onCancel" :content="(pageType == 'create' ? '添加' : '修改') + '商品'"></el-page-header>
+    </h2>
+    
     <div class="m-core">
       <el-form :model="form" :rules="rules" ref="form" label-width="120px" style="width: 500px">
         <el-form-item label="品牌" prop="brand">
@@ -9,27 +12,23 @@
         <el-form-item label="商品名称" prop="name">
           <el-input  v-model="form.name"></el-input>
         </el-form-item>
-        <el-form-item label="商品分类" prop="goodsClassId">
-          <el-select v-model="form.goodsClassId">
-              <el-option label="乐器" value="in"></el-option>
-              <el-option label="辅件" value="in"></el-option>
-              <el-option label="教材" value="in"></el-option>
-              <el-option label="教谱" value="in"></el-option>
+        <el-form-item label="商品分类" prop="type">
+          <el-select v-model="form.type">
+              <el-option label="乐器" value="INSTRUMENT"></el-option>
+              <el-option label="辅件" value="ACCESSORIES"></el-option>
+              <el-option label="教材" value="TEACHING"></el-option>
+              <el-option label="教谱" value="STAFF"></el-option>
+              <el-option label="其它" value="OTHER"></el-option>
           </el-select>
         </el-form-item>
         <el-form-item label="商品类型" prop="goodsCategoryId">
           <el-select v-model="form.goodsCategoryId">
-              <el-option-group
-                v-for="group in categoryList"
-                :key="group.label"
-                :label="group.label">
-                <el-option
-                  v-for="item in group.options"
-                  :key="item.value"
-                  :label="item.label"
-                  :value="item.value">
-                </el-option>
-              </el-option-group>
+              <el-option
+                v-for="item in categoryList"
+                :key="item.value"
+                :label="item.label"
+                :value="item.value">
+              </el-option>
           </el-select>
         </el-form-item>
         <el-form-item label="商品型号" prop="specification">
@@ -47,7 +46,8 @@
         <el-form-item label="商品图片" prop="image">
           <el-upload
             class="avatar-uploader"
-            action="https://jsonplaceholder.typicode.com/posts/"
+            action="/web-server/uploadFile"
+            :headers="headers"
             :show-file-list="false"
             :on-success="handleAvatarSuccess"
             :before-upload="beforeAvatarUpload">
@@ -59,24 +59,40 @@
           <el-input type="textarea" v-model="form.desc" ></el-input>
         </el-form-item>
         <el-form-item>
-          <el-button @click="onSubmit" type="primary">立即{{ pageType == "create" ? '创建' : '修改' }}</el-button>
-          <el-button @click="onCancel">取消</el-button>
+          <el-button @click="onSubmit('form')" type="primary">立即{{ pageType == "create" ? '创建' : '修改' }}</el-button>
+          <el-button @click="onReSet('form')">重置</el-button>
         </el-form-item>
       </el-form>
     </div>
   </div>
 </template>
 <script>
-import { categoryListTree } from '@/api/shopManager'
+import { categoryListTree, goodsAdd, goodsUpdate, goodsSingleQuery } from '@/api/businessManager'
+import store from '@/store'
+import { getToken } from '@/utils/auth'
 export default {
   data () {
     return {
       categoryList: [],
       pageType: this.$route.query.type,
+      organId: store.getters.organ,
+      headers: {
+        Authorization: getToken()
+      },
       form: {
+        // brand: 'xxxl',
+        // name: '长号',
+        // type: 'INSTRUMENT',
+        // goodsCategoryId: 7,
+        // specification: 'xxxeed',
+        // marketPrice: 10000,
+        // groupPurchasePrice: 9000,
+        // discountPrice: 8000,
+        // image: null,
+        // desc: 'C调、法式键、曲列、E键、白铜按键、台湾镍白'
         brand: null,
         name: null,
-        goodsClassId: null,
+        type: null,
         goodsCategoryId: null,
         specification: null,
         marketPrice: null,
@@ -88,27 +104,83 @@ export default {
       rules: {
         brand: [{ required: true, message: '请输入品牌', trigger: 'blur' }],
         name: [{ required: true, message: '请输入商品名称', trigger: 'blur' }],
-        goodsClassId: [{ required: true, message: '请选择商品分类', trigger: 'change' }],
+        type: [{ required: true, message: '请选择商品分类', trigger: 'change' }],
         goodsCategoryId: [{ required: true, message: '请选择商品类型', trigger: 'change' }],
         specification: [{ required: true, message: '请输入商品型号', trigger: 'blur' }],
         marketPrice: [{ required: true, message: '请输入商品价格', trigger: 'blur' }],
         groupPurchasePrice: [{ required: true, message: '请输入商品团购价', trigger: 'blur' }],
         discountPrice: [{ required: true, message: '请输入商品采购价', trigger: 'blur' }],
-        image: [{ required: true, message: '请tfr', trigger: 'blur' }],
+        image: [{ required: true, message: '请选择图片', trigger: 'blur' }],
         desc: [{ required: true, message: '请输入商品描述', trigger: 'blur' }]
       }
     }
   },
   mounted() {
+    this.getList()
     this.getCatagory()
   },
   methods: {
-    onSubmit() {
-
+    onSubmit(formName) {
+      this.$refs[formName].validate((valid) => {
+        if (valid) {
+          if (this.pageType == 'create') {
+            if(this.form.id) { // 判断有没有Id,如果有则删除
+              delete this.form.id
+            }
+            this.form.status = 'YES' // 默认上架
+            goodsAdd(this.form).then(res => {
+              this.messageTips('添加', res)
+            })
+          } else if (this.pageType == 'update') {
+            goodsUpdate(this.form).then(res => {
+              this.messageTips('修改', res)
+            })
+          }
+        } else {
+          return false
+        }
+      })
+    },
+    messageTips(title, res) {
+      if(res.code == 200) {
+        this.$message({
+          message: title + '成功',
+          type: 'success'
+        })
+        this.$router.push('/orderManager/shopManager')
+      } else {
+        this.$message.error(res.msg)
+      }
     },
     onCancel() {
       this.$router.push('/orderManager/shopManager')
     },
+    onReSet(formName) {
+      this.$refs[formName].resetFields()
+    },
+    getList() {
+      if(this.pageType == 'create') return false
+      goodsSingleQuery(this.$route.query.id).then(res => {
+        console.log(res)
+        if(res.code == 200) {
+          let result = res.data
+          console.log(result)
+          this.form = {
+            id: result.id,
+            brand: result.brand,
+            name: result.name,
+            type: result.type,
+            goodsCategoryId: result.goodsCategoryId,
+            specification: result.specification,
+            marketPrice: result.marketPrice,
+            groupPurchasePrice: result.groupPurchasePrice,
+            discountPrice: result.discountPrice,
+            image: result.image,
+            desc: result.desc
+          }
+        }
+      })
+    },
     getCatagory() {
       categoryListTree({
         delFlag: 0,
@@ -117,39 +189,35 @@ export default {
         let result = res.data
         if(res.code == 200) {
           let tempArray = []
-          result.rows.forEach((item, index) => {
-            let subject = []
-            if(item.goodsCategories) {
-              item.goodsCategories.forEach(s => {
-                subject.push({
-                  value: s.id,
-                  label: s.name
-                })
-              })
-            }
-            tempArray[index] = {
-              label: item.name,
-              options: subject
-            }
+          result.rows.forEach(row => {
+            tempArray.push({
+              label: row.name,
+              value: row.id
+            })
           })
           this.categoryList = tempArray
         }
       })
     },
     handleAvatarSuccess(res, file) {
-      this.imageUrl = URL.createObjectURL(file.raw);
+      this.form.image = res.data.url
+        
     },
     beforeAvatarUpload(file) {
-      const isJPG = file.type === 'image/jpeg';
-      const isLt2M = file.size / 1024 / 1024 < 2;
+      const imageType = {
+        'image/png': true,
+        'image/jpeg': true 
+      }
+      const isImage = imageType[file.type]
+      const isLt2M = file.size / 1024 / 1024 < 2
 
-      if (!isJPG) {
-        this.$message.error('上传头像图片只能是 JPG 格式!');
+      if (!isImage) {
+        this.$message.error('只能上传图片格式!')
       }
       if (!isLt2M) {
-        this.$message.error('上传头像图片大小不能超过 2MB!');
+        this.$message.error('上传头像图片大小不能超过 2MB!')
       }
-      return isJPG && isLt2M;
+      return isImage && isLt2M;
     },
   }
 }

+ 10 - 1
src/views/categroyManager/generalSettings/overallManager.vue

@@ -34,7 +34,7 @@ export default {
   },
   methods: {
     __init() {
-      sysConfigList().then(res => {
+      sysConfigList({ group: 'default' }).then(res => {
         if(res.code == 200 && res.data.length > 0) {
           res.data.forEach((item, index) => {
             this.input[index] = item.paranValue
@@ -68,6 +68,15 @@ export default {
 }
 </script>
 <style lang="scss" scoped>
+/deep/.el-input-group__append {
+  background: #DCDFE6;
+  border-color: #DCDFE6;
+  &:hover, &:active, &:focus {
+    background: #DCDFE6;
+    border-color: #DCDFE6;
+    color: #FFF;
+  }
+}
 .el-button--primary {
   background: #14928a;
   border-color: #14928a;

+ 18 - 26
src/views/categroyManager/globalConfig.vue

@@ -6,21 +6,24 @@
     <div class="m-core">
       <!-- navMenu -->
       <el-tabs v-model="activeIndex" type="card" @tab-click="handleClick">
-        <el-tab-pane label="参数设置" name="z1">
+        <el-tab-pane label="参数设置" name="0">
             <overallManager v-if="activeStatus[0]" />
         </el-tab-pane>
-        <el-tab-pane label="声部设置" name="z2">
+        <el-tab-pane label="声部设置" name="1">
             <musicalManager v-if="activeStatus[1]" />
         </el-tab-pane>
-        <el-tab-pane label="建团收费类型" name="z3">
+        <el-tab-pane label="建团收费类型" name="2">
             <typesManager v-if="activeStatus[2]" />
         </el-tab-pane>
-        <el-tab-pane label="VIP课程参数设置" name="z4">
+        <el-tab-pane label="VIP课程参数设置" name="3">
           <vipParameterManager v-if="activeStatus[3]" />
         </el-tab-pane>
-        <el-tab-pane label="作业模板管理" name="z5">
+        <el-tab-pane label="作业模板管理" name="4">
             <jobTemplateSetting v-if="activeStatus[4]" />
         </el-tab-pane>
+        <el-tab-pane label="梯度结算规则设置" name="5">
+            <gradientSet v-if="activeStatus[5]" />
+        </el-tab-pane>
         <!-- <el-tab-pane label="错误类型管理" name="6">
         </el-tab-pane> -->
       </el-tabs>
@@ -33,38 +36,27 @@ import musicalManager from './specialSetup/musicalManager'
 import typesManager from './specialSetup/typesManager'
 import vipParameterManager from './generalSettings/vipParameterManager'
 import jobTemplateSetting from './specialSetup/jobTemplateSetting'
-
+import gradientSet from './insideSetting/gradientSet'
 export default {
   components: {
-      overallManager, musicalManager, typesManager, vipParameterManager, jobTemplateSetting
+    overallManager, 
+    musicalManager, 
+    typesManager, 
+    vipParameterManager, 
+    jobTemplateSetting, 
+    gradientSet
   },
   name: 'globalConfig',
   data () {
     return {
-      activeIndex: 'z1',
-      activeStatus: [true, false, false, false, false]
+      activeIndex: '5',
+      activeStatus: [false, false, false, false, false, true]
     }
   },
   methods: {
     handleClick (val) {
       this.activeIndex = val.name
-      switch(val.name) {
-        case 'z1':
-          this.activeStatus[0] = true
-        break;
-        case 'z2':
-          this.activeStatus[1] = true
-        break;
-        case 'z3':
-          this.activeStatus[2] = true
-        break;
-        case 'z4':
-          this.activeStatus[3] = true
-        break;
-        case 'z5':
-          this.activeStatus[4] = true
-        break;
-      }
+      this.activeStatus[val.name] = true
     }
   }
 }

+ 7 - 2
src/views/categroyManager/insideSetting/adminOperation.vue

@@ -1,6 +1,8 @@
 <template>
   <div class='m-container'>
-    <h2>{{ pageType == "create" ? '添加' : '修改' }}角色</h2>
+    <h2>
+      <el-page-header @back="onCancel" :content="(pageType == 'create' ? '添加' : '修改') + '角色'"></el-page-header>
+    </h2>
     <div class="m-core">
       <el-form ref="form" label-width="120px" width="500px">
         <el-form-item label="角色名称" prop="roleName">
@@ -24,7 +26,7 @@
         </el-form-item>
         <el-form-item>
           <el-button @click="onSubmit" type="primary">立即{{ pageType == "create" ? '创建' : '修改' }}</el-button>
-          <el-button @click="onCancel">取消</el-button>
+          <el-button @click="onReSet('form')">重置</el-button>
         </el-form-item>
       </el-form>
     </div>
@@ -141,6 +143,9 @@ export default {
       })
       return list
     },
+    onReSet(formName) {
+      this.$refs[formName].resetFields()
+    },
     onCancel() {
       this.$router.push('/system/insideSetting/adminManager')
     }

+ 21 - 3
src/views/categroyManager/insideSetting/branchManager.vue

@@ -46,6 +46,12 @@
           <el-table-column align='center' prop='mobileNo'
                            label="手机号">
           </el-table-column>
+          <el-table-column align='center' prop='ownershipType'
+                           label="权属类型">
+            <template slot-scope="scope">
+              {{ scope.row.ownershipType | branchType }}
+            </template>
+          </el-table-column>
           <el-table-column align='center'
                            label="操作" width='100'>
             <template slot-scope="scope">
@@ -76,6 +82,14 @@
         <el-form-item label="手机号" prop="mobileNo" :label-width="formLabelWidth">
           <el-input v-model.number="form.mobileNo" autocomplete="off"></el-input>
         </el-form-item>
+        <el-form-item label="手机号" prop="ownershipType" :label-width="formLabelWidth">
+          <el-input v-model.number="form.ownershipType" autocomplete="off"></el-input>
+          <el-select v-model="form.subjectIds">
+              <el-option label="自有" value="OWN"></el-option>
+              <el-option label="合作" value="COOPERATIO"></el-option>
+              <el-option label="租赁" value="LEASE"></el-option>
+          </el-select>
+        </el-form-item>
       </el-form>
       <span slot="footer" class="dialog-footer">
         <el-button @click="teachingStatus = false">取 消</el-button>
@@ -117,7 +131,8 @@ export default {
         name: null, // 教学点名称
         linkman: null, // 来源
         job: null,  // 费用
-        mobileNo: null, // 合作单位
+        mobileNo: null, 
+        ownershipType: null,
         organId: store.getters.organ
       },
       rules: {
@@ -126,8 +141,9 @@ export default {
         job: [{ required: true, message: '请输入职位', trigger: 'blur'}],
         mobileNo: [
           {required: true, message: '请输入手机号', trigger: 'blur'},
-          { type: 'number', message: '手机号必须为数字'}
-        ]
+          { type: 'number', message: '手机号必须为数字'},
+        ],
+        ownershipType: [{ required: true, message: '请选择权属类型' }]
       },
       
     }
@@ -195,6 +211,7 @@ export default {
         linkman: null, // 来源
         job: null,  // 费用
         mobileNo: null, // 合作单位
+        ownershipType: null
       }
       this.teachingStatus = true
       this.formActionTitle = type
@@ -206,6 +223,7 @@ export default {
           linkman: rows.linkman, // 来源
           job: rows.job,  // 费用
           mobileNo: rows.mobileNo ? Number(rows.mobileNo) : null, // 合作单位
+          ownershipType: row.ownershipType,
           organId: store.getters.organ
         }
       }

+ 215 - 0
src/views/categroyManager/insideSetting/gradientSet.vue

@@ -0,0 +1,215 @@
+<template>
+  <div class='m-container'>
+    <!-- <h2>参数设置</h2> -->
+    <div class="m-core">
+      <!-- 列表 -->
+    <el-tabs tab-position="left">
+        <el-tab-pane label="单技课">
+            <el-form :model="singleForm" ref="singleForm" label-width="100px" class="demo-dynamic">
+                <el-form-item style="margin-bottom: 0;">
+                    <span class="min">最小值</span>
+                    <span class="max">最大值</span>
+                </el-form-item>
+                <div class="moreRule">
+                    <div class="moreRuleIn" v-for="(domain, index) in singleForm.domains" :key="domain.key">
+                        <el-form-item :label="'梯度' + (index + 1)">
+                            <el-input type="number" :disabled="domain.disabled" v-model="domain.min"></el-input>
+                        </el-form-item>
+                        <el-form-item>
+                            <el-input type="number" :disabled="domain.disabled" v-model="domain.max"></el-input>
+                            <el-button v-if="index != 0 && !domain.disabled" @click.prevent="removeDomain(singleForm, domain)">删除</el-button>
+                        </el-form-item>
+                    </div>
+                    <div class="el-form-item__error" v-if="singleForm.errorText">{{ singleForm.errorText }}</div>
+                </div>
+                <el-form-item>
+                    <el-button type="primary" @click="submitForm(singleForm)">设置</el-button>
+                    <el-button @click="addDomain(singleForm)">新增梯度</el-button>
+                    <el-button @click="resetForm(singleForm)">重置</el-button>
+                </el-form-item>
+            </el-form>
+        </el-tab-pane>
+        <el-tab-pane label="合奏课">
+            
+        </el-tab-pane>
+        <el-tab-pane label="小班课">
+            
+        </el-tab-pane>
+    </el-tabs>
+    </div>
+  </div>
+</template>
+<script>
+import pagination from '@/components/Pagination/index'
+import store from '@/store'
+import { sysConfigList, sysConfigUpdate } from '@/api/generalSettings'
+export default {
+  components: { pagination },
+  name: 'gradientset',
+  data () {
+    return {
+        organId: store.getters.organ,
+        singleForm: {
+            domains: [{
+                min: null,
+                max: null,
+                disabled: false,
+                key: Date.now()
+            }],
+            errorText: null,
+            paramName: null,
+        }
+    }
+  },
+  mounted() {
+    this.__init()
+  },
+  methods: {
+    __init() {
+      sysConfigList({ group: 'settlement_rule' }).then(res => {
+        if(res.code == 200 && res.data.length > 0) {
+          res.data.forEach(item => {
+              if(item.paramName == 'sigle_gradient_settlement_rule') {
+                //   this.singleForm
+              }
+          })
+        }
+      })
+    },
+    submitForm(form) {
+        this.addDomain(form, true)
+        if(!form.errorText) {
+            console.log(JSON.stringify(form.domains))
+            let params = {
+                id: 11,
+                paranValue: JSON.stringify(form.domains),
+                paramName: 'sigle_gradient_settlement_rule'
+            }
+            sysConfigUpdate(params).then(res => {
+                if(res.code == 200) {
+                this.$message({
+                    message: '设置成功',
+                    type: 'success'
+                })
+                }
+            })
+        }
+    },
+    resetForm(form) {
+        form.domains = [{
+            min: null,
+            max: null,
+            disabled: false
+        }]
+        form.errorText = null
+    },
+    removeDomain(form, item) {
+        var index = form.domains.indexOf(item)
+        if (index !== -1) {
+            form.domains.splice(index, 1)
+            // 取消最后一个数据的禁用状态
+            form.domains[form.domains.length - 1].disabled = false
+        }
+    },
+    addDomain(form, checked) {
+        // debugger
+        let domains = form.domains,
+            singleLength = domains.length,
+            lastDate = domains[singleLength - 1] // 获取倒数一个对象
+        if(!lastDate.min) {
+            form.errorText = '最小值不能为空'
+            return
+        }
+        if(singleLength <= 1 && lastDate.min < 0) {
+            form.errorText = '最小值不能小于0'
+            return
+        } else if(singleLength > 1 && lastDate.min <= domains[singleLength - 2].max) {
+            form.errorText = '最小值不能大于或等上一个梯度的最大值'
+            return
+        }
+        if(!lastDate.max) {
+            form.errorText = '最大值不能为空'
+            return
+        } else if(lastDate.max <= lastDate.min) {
+            form.errorText = '最大值不能小于或等于最小值'
+            return
+        }
+
+        form.errorText = null
+        if(!checked) {
+            lastDate.disabled = true
+            domains.push({
+                min: null,
+                max: null,
+                disabled: false,
+                key: Date.now()
+            })
+        }
+        
+    }
+  }
+}
+</script>
+<style lang="scss" scoped>
+/deep/.el-input-group__append {
+  background: #DCDFE6;
+  border-color: #DCDFE6;
+  &:hover, &:active, &:focus {
+    background: #DCDFE6;
+    border-color: #DCDFE6;
+    color: #FFF;
+  }
+}
+.el-button--primary {
+  background: #14928a;
+  border-color: #14928a;
+  color: #fff;
+  &:hover, &:active, &:focus {
+    background: #14928a;
+    border-color: #14928a;
+    color: #FFF;
+  }
+}
+.el-row {
+  margin-top: 40px;
+}
+.el-col {
+  display: flex;
+  align-items: center;
+  margin-bottom: 20px;
+  justify-content: flex-end;
+  margin-right: 50%;
+}
+.min, .max {
+    display: inline-block;
+    width: 180px;
+    text-align: center;
+    margin-right: 10px;
+}
+.el-input-group, .el-input {
+  width: 180px;
+  margin-right: 10px;
+}
+.moreRule {
+    position: relative;
+    .el-form-item__error {
+        color: #F56C6C;
+        font-size: 12px;
+        line-height: 1;
+        position: absolute;
+        left: 100px;
+        top: 100%;
+        margin-top: -21px;
+    }
+}
+.moreRuleIn {
+    .el-form-item {
+        display: inline-block;
+        &:last-child {
+            /deep/.el-form-item__content {
+                margin-left: 0 !important;
+            }
+        }
+    }
+}
+</style>

+ 44 - 14
src/views/studentManager/components/studentCashout.vue

@@ -1,42 +1,72 @@
 <template>
   <div>
-    <el-form :inline="true"
+    <!-- <el-form :inline="true"
              :model="searceList">
       <el-form-item label="搜索字段XX">
         <el-input></el-input>
       </el-form-item>
-    </el-form>
+    </el-form> -->
     <div class="tableWrap">
-      <el-table :header-cell-style="{background:'#EDEEF0',color:'#444'}">
-        <el-table-column label=提现交易流水号>
+      <el-table :data="tableList" :header-cell-style="{background:'#EDEEF0',color:'#444'}">
+        <el-table-column label=提现交易流水号 prop="withdrawNo">
         </el-table-column>
-        <el-table-column label=申请时间>
+        <el-table-column label=申请时间 prop="createTime">
         </el-table-column>
-        <el-table-column label=提现金额>
+        <el-table-column label=提现金额 prop="amount">
         </el-table-column>
-        <el-table-column label=账户余额>
+        <el-table-column label=账户余额 prop="">
         </el-table-column>
-        <el-table-column label=提现余额>
+        <el-table-column label=账户号 prop="">
         </el-table-column>
-        <el-table-column label=账户号>
+        <el-table-column label=提现状态 prop="status">
         </el-table-column>
-        <el-table-column label=提现状态>
-        </el-table-column>
-        <el-table-column label=支付账号>
+        <el-table-column label=支付账号 prop="">
         </el-table-column>
         <el-table-column label=支付渠道>
         </el-table-column>
-        <el-table-column label=交易流水号>
+        <el-table-column label=交易流水号 prop="transNo">
         </el-table-column>
       </el-table>
+      <pagination :total="pageInfo.total"
+                  :page.sync="pageInfo.page"
+                  :limit.sync="pageInfo.limit"
+                  :page-sizes="pageInfo.page_size"
+                  @pagination="getList" />
     </div>
   </div>
 </template>
 <script>
+import pagination from '@/components/Pagination/index'
+import { studentWithdraw } from '@/api/studentManager'
 export default {
+  components: { pagination },
   data () {
     return {
-      searceList: {}
+      searceList: {},
+      tableList: [],
+      pageInfo: {
+        // 分页规则
+        limit: 10, // 限制显示条数
+        page: 1, // 当前页
+        total: 0, // 总条数
+        page_size: [10, 20, 40, 50] // 选择限制显示条数
+      },
+    }
+  },
+  mounted() {
+    this.getList()
+  },
+  methods: {
+    getList() {
+      studentWithdraw({
+        rows: this.pageInfo.limit,
+        page: this.pageInfo.page
+      }).then(res => {
+        console.log(res)
+        if(res.code == 200) {
+          this.tableList = res.data.rows
+        }
+      })
     }
   }
 }

+ 38 - 16
src/views/studentManager/components/studentInfo.vue

@@ -1,40 +1,40 @@
 <template>
   <div class='studentDetail'>
     <el-form :inline="true"
-             :model="studentForm">
+             >
       <el-form-item label="学生姓名">
-        <el-input v-model="studentForm.name"></el-input>
+        <el-input disabled :value="studentForm.realName"></el-input>
       </el-form-item>
       <el-form-item label="学生性别">
-        <el-input value="啦啦啦"
+        <el-input :value="studentForm.gender ? '男':'女'"
                   disabled></el-input>
       </el-form-item>
       <el-form-item label="出生年月">
-        <el-input value="啦啦啦"
+        <el-input :value="studentForm.birthdate"
                   disabled></el-input>
       </el-form-item>
       <el-form-item label="家长姓名">
-        <el-input value="啦啦啦"
+        <el-input :value="studentForm.parentsName"
                   disabled></el-input>
       </el-form-item>
       <el-form-item label="联系电话">
-        <el-input value="啦啦啦"
+        <el-input :value="studentForm.parentsPhone"
                   disabled></el-input>
       </el-form-item>
-      <el-form-item label="所在学校">
-        <el-input value="啦啦啦"
+      <!-- <el-form-item label="所在学校">
+        <el-input :value=""
                   disabled></el-input>
-      </el-form-item>
-      <el-form-item label="所属分部">
-        <el-input value="啦啦啦"
+      </el-form-item> -->
+      <!-- <el-form-item label="所属分部">
+        <el-input :value="1"
                   disabled></el-input>
-      </el-form-item>
+      </el-form-item> -->
       <el-form-item label="年级班级">
-        <el-input value="啦啦啦"
+        <el-input :value="studentForm.currentGrade + studentForm.currentClass"
                   disabled></el-input>
       </el-form-item>
     </el-form>
-    <div class="teamList">
+    <!-- <div class="teamList">
       <h4>乐团1</h4>
       <el-form :inline="true">
         <el-form-item label="入团日期">
@@ -59,14 +59,36 @@
           <el-input value="2019-09-26"></el-input>
         </el-form-item>
       </el-form>
-    </div>
+    </div> -->
   </div>
 </template>
 <script>
+import { findStudentBaseInfo, findStudentMusicGroups } from '@/api/studentManager'
 export default {
   data () {
     return {
-      studentForm: {}
+      userId: this.$route.query.userId,
+      studentForm: {},
+      musicGroupInfo: [] // 乐团信息
+    }
+  },
+  mounted() {
+    this.__init()
+  },
+  methods: {
+    __init() {
+      findStudentBaseInfo({ userId: this.userId }).then(res => {
+        // console.log(res)
+        if(res.code == 200) {
+          this.studentForm = res.data
+        }
+      })
+      // findStudentMusicGroups(this.userId).then(res => {
+      //   // console.log(res)
+      //   if(res.code == 200) {
+      //     this.musicGroupInfo.push(...res.data)
+      //   }
+      // })
     }
   }
 }

+ 72 - 16
src/views/studentManager/components/studentPayList.vue

@@ -5,23 +5,27 @@
              class="searchForm"
              v-model="searchForm">
       <el-form-item>
-        <el-select v-model="searchForm.status"
-                   placeholder="工作类型">
-          <el-option label="哈哈哈"
-                     value="1"></el-option>
+        <el-select v-model="searchForm.classGroupType" 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="searchForm.attendanceStatus" placeholder="考勤状态">
+          <el-option v-for="(item, index) in att" :key="index" 
+            :label="item.label" :value="item.value"></el-option>
+        </el-select>
+      </el-form-item>
+      <el-form-item>
+        <el-input placeholder="班级名称" v-model="searchForm.classGroupName"></el-input>
+      </el-form-item>
+      <el-form-item>
+        <el-button @click="getList" type="danger">搜索</el-button>
+      </el-form-item>
+      <el-form-item>
+        <el-button @click="onReSet" type="primary">重置</el-button>
+      </el-form-item>
     </el-form>
-    <!-- 查询列表 -->
-    <div class="searchWrap">
-      <p>查询条件:</p>
-      <div class="searchItem"
-           @click="closeSearch(item)"
-           v-for="(item,index) in searchLsit">
-        {{ item.key }}
-        <i class="el-icon-close"></i>
-      </div>
-    </div>
     <!-- 列表 -->
     <div class="tableWrap">
       <el-table :data='tableList'>
@@ -54,15 +58,67 @@
   </div>
 </template>
 <script>
+import pagination from '@/components/Pagination/index'
+import { findStudentAttendances } from '@/api/studentManager'
 export default {
+  components: { pagination },
   data () {
     return {
       searchForm: {
-        status: ''
+        userId: this.$route.query.userId,
+        classGroupType: null,
+        attendanceStatus: null,
+        classGroupName: null,
+      },
+      courseArray: [
+        { label: '单技课', value: 'NORMAL' },
+        { label: '合奏课', value: 'MIX' },
+        { label: '小班课', value: 'HIGH' },
+        { label: 'VIP课', value: 'VIP' },
+        { label: '试听课', value: 'DEMO' }
+      ],
+      att: [
+        // { value: "NORMAL", label: "正常" },
+        // { value: "TRUANT", label: "旷课" },
+        // { value: "LEAVE", label: "请假" },
+        // { value: "QUIT_SCHOOL", label: "休学" },
+        // { value: "DROP_OUT", label: "退学" }
+        { value: "NORMAL", label: "正常" },
+        { value: "TRUANT", label: "旷课" },
+        { value: "LEAVE", label: "请假" },
+        { value: "DROP_OUT", label: "休学" },
+      ],
+      pageInfo: {
+        // 分页规则
+        limit: 10, // 限制显示条数
+        page: 1, // 当前页
+        total: 0, // 总条数
+        page_size: [10, 20, 40, 50] // 选择限制显示条数
       },
-      searchLsit: [],
       tableList: []
     }
+  },
+  methods: {
+    getList () {
+      let params = this.searchForm
+      params.rows = this.pageInfo.limit
+      params.page = this.pageInfo.page
+      // findStudentAttendances(params).then(res => {
+      //   if(res.code == 200) {
+      //     this.tableList = res.data.rows
+      //     this.pageInfo.total = res.data.total
+      //   }
+      // })
+    },
+    onReSet() { // 重置搜索
+      this.searchForm = {
+        userId: this.$route.query.userId,
+        classGroupType: null,
+        attendanceStatus: null,
+        classGroupName: null
+      }
+      this.getList()
+    },
   }
 }
 </script>

+ 95 - 18
src/views/studentManager/components/studentRecord.vue

@@ -5,15 +5,32 @@
              class="searchForm"
              v-model="searchForm">
       <el-form-item>
-        <el-select v-model="searchForm.status"
-                   placeholder="工作类型">
-          <el-option label="哈哈哈"
-                     value="1"></el-option>
+        <el-select v-model="searchForm.classGroupType" 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="searchForm.attendanceStatus" placeholder="考勤状态">
+          <el-option v-for="(item, index) in att" :key="index" 
+            :label="item.label" :value="item.value"></el-option>
+        </el-select>
+      </el-form-item>
+      <el-form-item>
+        <el-input placeholder="班级名称" v-model="searchForm.classGroupName"></el-input>
+      </el-form-item>
+      <el-form-item>
+        <el-input placeholder="老师姓名" v-model="searchForm.teacherName"></el-input>
+      </el-form-item>
+      <el-form-item>
+        <el-button @click="getList" type="danger">搜索</el-button>
+      </el-form-item>
+      <el-form-item>
+        <el-button @click="onReSet" type="primary">重置</el-button>
+      </el-form-item>
     </el-form>
     <!-- 查询列表 -->
-    <div class="searchWrap">
+    <!-- <div class="searchWrap">
       <p>查询条件:</p>
       <div class="searchItem"
            @click="closeSearch(item)"
@@ -21,53 +38,85 @@
         {{ item.key }}
         <i class="el-icon-close"></i>
       </div>
-    </div>
+    </div> -->
     <!-- 列表 -->
     <div class="tableWrap">
       <el-table :data='tableList'>
-        <el-table-column align='center'
+        <el-table-column align='center' prop="courseDate"
                          label="上课时间">
         </el-table-column>
         <el-table-column align='center'
                          label="星期几">
+          <template slot-scope="scope">
+            {{ getWeek(scope.row.courseDate) }}
+          </template>             
         </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'
+        <el-table-column align='center' prop="classGroupName"
                          label="班级名称">
         </el-table-column>
-        <el-table-column align='center'
+        <el-table-column align='center' prop="currentCLassTimes"
                          label="当前课次">
         </el-table-column>
-        <el-table-column align='center'
+        <el-table-column align='center' prop="teacherName"
                          label="课程老师">
         </el-table-column>
-        <el-table-column align='center'
+        <el-table-column align='center' prop="attendanceStatus"
                          label="考情状态">
+          <template slot-scope="scope">
+            {{ scope.row.attendanceStatus | clockingIn }}
+          </template>
         </el-table-column>
       </el-table>
-      <pagination :total="rules.total"
-                  :page.sync="rules.page"
-                  :limit.sync="rules.limit"
-                  :page-sizes="rules.page_size"
+      <pagination :total="pageInfo.total"
+                  :page.sync="pageInfo.page"
+                  :limit.sync="pageInfo.limit"
+                  :page-sizes="pageInfo.page_size"
                   @pagination="getList" />
     </div>
   </div>
 </template>
 <script>
 import pagination from '@/components/Pagination/index'
+import { findStudentAttendances } from '@/api/studentManager'
 export default {
   name: 'studentRecord',
   components: { pagination },
   data () {
     return {
       searchForm: {
-        status: ''
+        userId: this.$route.query.userId,
+        classGroupType: null,
+        attendanceStatus: null,
+        classGroupName: null,
+        teacherName: null
       },
       searchLsit: [],
       tableList: [],
-      rules: {
+      courseArray: [
+        { label: '单技课', value: 'NORMAL' },
+        { label: '合奏课', value: 'MIX' },
+        { label: '小班课', value: 'HIGH' },
+        { label: 'VIP课', value: 'VIP' },
+        { label: '试听课', value: 'DEMO' }
+      ],
+      att: [
+        // { value: "NORMAL", label: "正常" },
+        // { value: "TRUANT", label: "旷课" },
+        // { value: "LEAVE", label: "请假" },
+        // { value: "QUIT_SCHOOL", label: "休学" },
+        // { value: "DROP_OUT", label: "退学" }
+        { value: "NORMAL", label: "正常" },
+        { value: "TRUANT", label: "旷课" },
+        { value: "LEAVE", label: "请假" },
+        { value: "DROP_OUT", label: "休学" },
+      ],
+      pageInfo: {
         // 分页规则
         limit: 10, // 限制显示条数
         page: 1, // 当前页
@@ -77,8 +126,36 @@ export default {
 
     }
   },
+  mounted() {
+    this.getList()
+  },
   methods: {
-    getList () { }
+    getList () {
+      let params = this.searchForm
+      params.rows = this.pageInfo.limit
+      params.page = this.pageInfo.page
+      findStudentAttendances(params).then(res => {
+        if(res.code == 200) {
+          this.tableList = res.data.rows
+          this.pageInfo.total = res.data.total
+        }
+      })
+    },
+    onReSet() { // 重置搜索
+      this.searchForm = {
+        userId: this.$route.query.userId,
+        classGroupType: null,
+        attendanceStatus: null,
+        classGroupName: null,
+        teacherName: null
+      }
+      this.getList()
+    },
+    getWeek(date) {
+      let nd = new Date(date) 
+      let temp = ['星期天', '星期一', '星期二', '星期三', '星期四', '星期五', '星期六']
+      return temp[nd.getDay()]
+    }
   }
 }
 </script>

+ 74 - 47
src/views/studentManager/components/studentVip.vue

@@ -1,78 +1,105 @@
 <template>
   <div class='studentvip'>
     <div class="topCard">
-      <div class="cardItem">
+      <div class="cardItem" @click="onCheckCourse(item)" :class="[item.id == checkIndex ? 'active' : '']"
+       v-for="(item, index) in courseList" :key="index">
         <div class="top">
-          <p class='name'>课程名称</p>
-          <p class="type">线上</p>
+          <p class='name'>{{ item.name }}</p>
+          <p class="type">{{ item.giveTeachMode == 'ONLINE' ? '线上' : '线下' }}</p>
         </div>
         <div class="bottom">
           <div>
             <p class="title">指导老师</p>
-            <p>王老师</p>
+            <p>{{ item.userName }}</p>
           </div>
           <div>
             <p class="title">学员数量</p>
-            <p>12</p>
+            <p>{{ item.studentNum }}</p>
           </div>
           <div>
             <p class="title">剩余课时</p>
-            <p>10</p>
-          </div>
-        </div>
-      </div>
-      <div class="cardItem active">
-        <div class="top">
-          <p class='name'>课程名称</p>
-          <p class="type">线上</p>
-        </div>
-        <div class="bottom">
-          <div>
-            <p class="title">指导老师</p>
-            <p>王老师</p>
-          </div>
-          <div>
-            <p class="title">学员数量</p>
-            <p>12</p>
-          </div>
-          <div>
-            <p class="title">剩余课时</p>
-            <p>10</p>
+            <p>{{ item.totalClassTimes - item.currentClassTimes }}</p>
           </div>
         </div>
       </div>
     </div>
-    <div class="tableWrap">
-      <el-table :header-cell-style="{background:'#EDEEF0',color:'#444'}">
-        <el-table-column label="学员姓名">
+    <div class="tableWrap" v-if="checkIndex">
+      <el-table :header-cell-style="{background:'#EDEEF0',color:'#444'}"
+         :data='tableList'>
+        <el-table-column label="时间" prop='courseDate'>
         </el-table-column>
-        <el-table-column label="性别">
+        <el-table-column label="课程类型">
+          <template slot-scope="scope">
+            {{ scope.row.classGroupType | coursesType }}
+          </template>
         </el-table-column>
-        <el-table-column label="联系电话">
-        </el-table-column>
-        <el-table-column label="所在学校">
-        </el-table-column>
-        <el-table-column label="年级班级">
-        </el-table-column>
-        <el-table-column label="报名专业">
-        </el-table-column>
-        <el-table-column label="乐团班级">
-        </el-table-column>
-        <el-table-column label="合奏团">
-        </el-table-column>
-        <el-table-column label="学员状态">
-        </el-table-column>
-        <el-table-column label="是否缴费">
-        </el-table-column>
-         <el-table-column label="操作">
+        <!-- <el-table-column label="当前课次">
+        </el-table-column> -->
+        <el-table-column label="指导老师" prop="teacherName">
         </el-table-column>
       </el-table>
+      <pagination :total="pageInfo.total"
+                  :page.sync="pageInfo.page"
+                  :limit.sync="pageInfo.limit"
+                  :page-sizes="pageInfo.page_size"
+                  @pagination="getList" />
     </div>
   </div>
 </template>
 <script>
+import pagination from '@/components/Pagination/index'
+import { findStudentVipGroups, findStudentCourses } from '@/api/studentManager'
 export default {
+  name: 'studentvip',
+  components: { pagination },
+  data () {
+    return {
+      userId: this.$route.query.userId,
+      searchForm: {
+        status: ''
+      },
+      checkIndex: null, // 选中的课程
+      searchLsit: [],
+      tableList: [],
+      courseList: [],
+      pageInfo: {
+        // 分页规则
+        limit: 10, // 限制显示条数
+        page: 1, // 当前页
+        total: 0, // 总条数
+        page_size: [10, 20, 40, 50] // 选择限制显示条数
+      },
 
+    }
+  },
+  mounted() {
+    this.getCourseList()
+  },
+  methods: {
+    onCheckCourse(item) {
+      this.checkIndex = item.id
+      this.getList()
+    },
+    getCourseList () {
+      findStudentVipGroups({ userId: this.userId }).then(res => {
+        if(res.code == 200) {
+          this.courseList = res.data
+        }
+      })
+    },
+    getList() {
+      findStudentCourses({
+        vipGroupId: this.checkIndex,
+        rows: this.pageInfo.limit,
+        page: this.pageInfo.page
+      }).then(res => {
+        if(res.code ==200) {
+          this.tableList = res.data.rows
+          this.pageInfo.total = res.data.total
+        }
+      })
+    }
+  }
 }
 </script>
 <style lang="scss">

+ 135 - 25
src/views/studentManager/components/teamAndcourse.vue

@@ -1,91 +1,201 @@
 <template>
   <div>
     <div class="tabTopWrap">
-      <el-table :data='topTable'>
-        <el-table-column align='center'
+      <el-table :data='musicGroupInfo'>
+        <el-table-column align='center' prop="musicGroupId"
                          label="乐团编号">
         </el-table-column>
-        <el-table-column align='center'
+        <el-table-column align='center' prop="joinMusicGroupDate"
                          label="入团时间">
         </el-table-column>
-        <el-table-column align='center'
+        <el-table-column align='center' prop="musicGroupName"
                          label="乐团名称">
         </el-table-column>
         <el-table-column align='center'
                          label="乐团状态">
+          <template slot-scope="scope">
+            {{ scope.row.musicGroupStatus | musicGroupType }}
+          </template>
         </el-table-column>
-        <el-table-column align='center'
+        <el-table-column align='center' prop="subjectName"
                          label="专业">
         </el-table-column>
-        <el-table-column align='center'
+        <el-table-column align='center' prop=""
                          label="乐器来源">
+          <template slot-scope="scope">
+            {{ scope.row.kitPurchaseMethod | instrumentType }}
+          </template>
         </el-table-column>
         <el-table-column align='center'
                          label="学员状态">
+          <template slot-scope="scope">
+            {{ scope.row.userMusicGroupStatus | musicGroupStudentType }}
+          </template>
         </el-table-column>
         <el-table-column align='center'
-                         label="学生来源">
+                         label="所选乐器">
+          <template slot-scope="scope">
+            <span v-for="good in scope.row.userGoodsDtos" :key="good.goodsId">
+              {{ good.goodsName | joinArray(',') }}
+            </span>
+            {{ scope.row.kitPurchaseMethod == 'LEASE' ? '(租赁:' + scope.row.depositFee + ')' : '' }}
+          </template>
         </el-table-column>
         <el-table-column align='center'
                          label="操作">
+          <template slot-scope="scope">
+            <el-button @click="onCourse(scope.row)" type="text">排课详情</el-button>
+          </template>
         </el-table-column>
       </el-table>
     </div>
     <!-- 搜索类型 -->
-    <el-form :inline="true"
+    <el-form v-if="coursesShow" :inline="true"
              class="searchForm"
              v-model="searchForm">
       <el-form-item>
-        <el-select v-model="searchForm.status"
-                   placeholder="工作类型">
-          <el-option label="哈哈哈"
-                     value="1"></el-option>
+        <el-select v-model="searchForm.classGroupType" 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="searchForm.courseStatus" 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="班级名称" v-model="searchForm.classGroupName"></el-input>
+      </el-form-item>
+      <el-form-item>
+        <el-input placeholder="老师姓名" v-model="searchForm.teacherName"></el-input>
+      </el-form-item>
+      <el-form-item>
+        <div @click="getStudentCourses" class='searchBtn'>搜索</div>
+      </el-form-item>
     </el-form>
     <!-- 查询列表 -->
-    <div class="searchWrap">
+    <!-- <div v-if="coursesShow" class="searchWrap">
       <p>查询条件:</p>
       <div class="searchItem"
            @click="closeSearch(item)"
-           v-for="(item,index) in searchLsit">
+           v-for="(item,index) in searchLsit" :key="index">
         {{ item.key }}
         <i class="el-icon-close"></i>
       </div>
-    </div>
-    <div class="tableWrap">
-      <el-table :data='topTable'>
-        <el-table-column align='center'
+    </div> -->
+    <div v-if="coursesShow" class="tableWrap">
+      <el-table :data='coursesInfo'>
+        <el-table-column align='center' prop="classGroupId"
                          label="编号">
         </el-table-column>
-        <el-table-column align='center'
+        <el-table-column align='center' prop="courseDate"
                          label="时间">
         </el-table-column>
-        <el-table-column align='center'
+        <el-table-column align='center' prop="classGroupName"
                          label="班级名称">
         </el-table-column>
         <el-table-column align='center'
-                         label="课程状态">
+                         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>
   </div>
 </template>
 <script>
+import pagination from '@/components/Pagination/index'
+import { findStudentMusicGroups, findStudentCourses } from '@/api/studentManager'
 export default {
+  components: { pagination },
   data () {
     return {
-      topTable: [],
+      userId: this.$route.query.userId,
+      musicGroupInfo: [], // 乐团列表
+      coursesInfo: [], // 排课列表
+      coursesShow: false, // 排课列表是否显示
       searchLsit: [],
       searchForm: {
-        status: ''
-      }
+        studentId: this.$route.query.userId,
+        musicGroupId: null,
+        classGroupType: null,
+        courseStatus: null,
+        classGroupName: null,
+        teacherName: null
+      },
+      courseArray: [
+        { label: '单技课', value: 'NORMAL' },
+        { label: '合奏课', value: 'MIX' },
+        { label: '小班课', value: 'HIGH' },
+        { label: 'VIP课', value: 'VIP' },
+        { label: '试听课', value: 'DEMO' }
+      ],
+      courseStatus: [
+        { value: "NOT_START", label: "未开始"},
+        { value: "UNDERWAY", label: "进行中"},
+        { value: "OVER", label: "已结束"}
+      ],
+      pageInfo: {
+        // 分页规则
+        limit: 10, // 限制显示条数
+        page: 1, // 当前页
+        total: 0, // 总条数
+        page_size: [10, 20, 40, 50] // 选择限制显示条数
+      },
 
     }
+  },
+  mounted() {
+    this.__init()
+  },
+  methods: {
+    __init() {
+      findStudentMusicGroups({ userId: this.userId }).then(res => {
+        if(res.code == 200) {
+          this.musicGroupInfo = res.data
+        }
+      })
+    },
+    onCourse(row) {
+      this.coursesShow = true
+      this.searchForm = {
+        studentId: this.$route.query.userId,
+        musicGroupId: row.musicGroupId,
+        classGroupType: null,
+        courseStatus: null,
+        classGroupName: null,
+        teacherName: null
+      }
+      this.getStudentCourses()
+    },
+    getStudentCourses() {
+      let params = this.searchForm
+      params.rows = this.pageInfo.limit
+      params.page = this.pageInfo.page
+      findStudentCourses(params).then(res => {
+        if(res.code ==200) {
+          this.coursesInfo = res.data.rows
+          this.pageInfo.total = res.data.total
+        }
+      })
+    }
   }
 }
 </script>

+ 34 - 9
src/views/studentManager/index.vue

@@ -10,31 +10,31 @@
                @tab-click="handleClick">
         <el-tab-pane label="基本信息"
                      name="1">
-          <studentInfo />
+          <studentInfo v-if="acitveStatus[0]" />
         </el-tab-pane>
         <el-tab-pane label="乐团&课程"
                      name="2">
-          <teamAndcourse />
+          <teamAndcourse v-if="acitveStatus[1]" />
         </el-tab-pane>
         <el-tab-pane label="VIP课"
                      name="3">
-          <studentVip />
+          <studentVip v-if="acitveStatus[2]" />
         </el-tab-pane>
         <el-tab-pane label="上课记录"
                      name="4">
-          <studentRecord />
+          <studentRecord v-if="acitveStatus[3]" />
         </el-tab-pane>
         <el-tab-pane label="扣费记录"
                      name="5">
-          <studentPayList />
+          <studentPayList v-if="acitveStatus[4]" />
         </el-tab-pane>
         <el-tab-pane label="学员订单"
                      name="6">
-          <studentOrder />
+          <studentOrder v-if="acitveStatus[5]" />
         </el-tab-pane>
         <el-tab-pane label="学员提现"
                      name="7">
-          <studentCashout />
+          <studentCashout v-if="acitveStatus[6]" />
         </el-tab-pane>
       </el-tabs>
     </div>
@@ -61,12 +61,37 @@ export default {
   name: 'studentDetail',
   data () {
     return {
-      activeIndex: '6'
+      activeIndex: '4',
+      acitveStatus: [false, false, false, true, false, false, false]
     }
   },
   methods: {
     handleClick (val) {
-      this.activeIndex = val.name;
+      this.activeIndex = val.name
+      this.acitveStatus[val.name - 1] = true
+      // switch(val.name) {
+      //   case '1':
+      //     this.activeStatus[0] = true
+      //   break;
+      //   case '2':
+      //     this.activeStatus[1] = true
+      //   break;
+      //   case '3':
+      //     this.activeStatus[2] = true
+      //   break;
+      //   case '4':
+      //     this.activeStatus[3] = true
+      //   break;
+      //   case '5':
+      //     this.activeStatus[4] = true
+      //   break;
+      //   case '5':
+      //     this.activeStatus[4] = true
+      //   break;
+      //   case '5':
+      //     this.activeStatus[4] = true
+      //   break;
+      // }
     }
   }
 }

+ 20 - 11
src/views/studentManager/studentList.vue

@@ -8,8 +8,8 @@
                class="searchForm"
                v-model="searchForm">
         <el-form-item>
-          <el-input placeholder="编号,姓名,电话" v-model="searchForm.name">
-            <i slot="suffix" class="el-input__icon el-icon-search"></i>
+          <el-input placeholder="姓名,电话" v-model="searchForm.name">
+            <i slot="suffix" @click="onSearch" class="el-input__icon el-icon-search"></i>
           </el-input>
         </el-form-item>
       </el-form>
@@ -29,22 +29,26 @@
           <el-table-column align='center' prop="userId"
                            label="学员编号">
           </el-table-column>
-          <el-table-column align='center' prop="userName"
+          <el-table-column align='center' prop="realName"
                            label="学员姓名">
           </el-table-column>
-          <el-table-column align='center' prop="gender"
+          <el-table-column align='center'
                            label="性别">
+            <template slot-scope="scope">
+              {{ scope.row.gender ? '男': '女' }}
+            </template>
           </el-table-column>
-          <el-table-column align='center' prop="phone"
+          <el-table-column align='center' prop="parentsName"
                            label="家长姓名">
           </el-table-column>
-          <el-table-column align='center' prop="phone"
+          <el-table-column align='center' prop="parentsPhone"
                            label="家长联系电话">
           </el-table-column>
           <el-table-column align='center'
                            label="操作">
             <template slot-scope="scope">
-              <el-button type="text">查看</el-button>
+              <!-- <el-button type="text">查看</el-button> -->
+              <router-link style="color:#409EFF" :to="`/student/studentdetaile?userId=${scope.row.userId}`">查看</router-link>
             </template>
           </el-table-column>
         </el-table>
@@ -85,12 +89,17 @@ export default {
     this.getList()
   },
   methods: {
-    getList () { 
-      queryStudentList({
+    onSearch() {
+      this.getList()
+    },
+    getList () {
+      let params = {
         organId: this.organId,
         rows: this.pageInfo.limit,
-        page: this.pageInfo.page
-      }).then(res => {
+        page: this.pageInfo.page,
+        search: this.searchForm.name
+      }
+      queryStudentList(params).then(res => {
         if(res.code == 200) {
           this.tableList = res.data.rows
           this.pageInfo.total = res.data.total

+ 2 - 2
vue.config.js

@@ -16,9 +16,9 @@ const name = defaultSettings.title || 'vue Admin Template' // page title
 // const port = process.env.port || process.env.npm_config_port || 9528 // dev port
 // http://47.99.212.176:8000
 // http://192.168.3.28:8000
-let target = 'http://192.168.3.28:8000' //邹璇
+// let target = 'http://192.168.3.28:8000' //邹璇
 // let target = 'http://192.168.3.8:8000' //勇哥
-// let target = 'http://47.99.212.176:8000' // 测试服
+let target = 'http://47.99.212.176:8000' // 测试服
 // let target = 'http://192.168.3.48:8000' // 乔
 // All configuration item explanations can be find in https://cli.vuejs.org/config/
 module.exports = {