Browse Source

Merge branch '11/24SAAS' into 02/23reviewBUG

mo 3 years ago
parent
commit
70e94428ba
55 changed files with 2605 additions and 1214 deletions
  1. 0 0
      dist/index.html
  2. 0 0
      dist/static/css/app.30dc046c.css
  3. 0 0
      dist/static/css/app.416c85f7.css
  4. 0 1
      dist/static/css/chunk-08976328.60f9a880.css
  5. 1 0
      dist/static/css/chunk-0e4763dd.e7812bd3.css
  6. 1 0
      dist/static/css/chunk-1ffc3572.fb509993.css
  7. 0 0
      dist/static/css/chunk-3b9aae1a.afcf54b5.css
  8. 1 0
      dist/static/css/chunk-41561464.224948e4.css
  9. 1 1
      dist/static/css/chunk-4adcf490.dcfb8b49.css
  10. 0 0
      dist/static/css/chunk-5ecb2731.ba9905cb.css
  11. 0 1
      dist/static/css/chunk-62739240.c511ac1f.css
  12. 1 0
      dist/static/css/chunk-79538aeb.74862bc3.css
  13. 0 1
      dist/static/css/chunk-ba20fc96.d3672746.css
  14. 0 0
      dist/static/css/chunk-eb7e35dc.9baa566f.css
  15. BIN
      dist/static/fonts/iconfont.9052f547.ttf
  16. 0 0
      dist/static/js/app.901638b6.js
  17. 0 0
      dist/static/js/app.bf3aadeb.js
  18. 0 0
      dist/static/js/chunk-0220734c.5a91fdbf.js
  19. 0 0
      dist/static/js/chunk-08976328.e6f83553.js
  20. 0 0
      dist/static/js/chunk-0e4763dd.cf7bd4d6.js
  21. 0 0
      dist/static/js/chunk-1ffc3572.050e0360.js
  22. 0 0
      dist/static/js/chunk-2773e604.70328ab5.js
  23. 0 0
      dist/static/js/chunk-3b9aae1a.74db4afe.js
  24. 0 0
      dist/static/js/chunk-41561464.98c65fcd.js
  25. 0 0
      dist/static/js/chunk-4adcf490.0ef6cb42.js
  26. 1 1
      dist/static/js/chunk-5ecb2731.e2d69a25.js
  27. 0 0
      dist/static/js/chunk-62739240.4ed00c53.js
  28. 0 0
      dist/static/js/chunk-79538aeb.3203f9da.js
  29. 0 0
      dist/static/js/chunk-82cc728c.ce36b406.js
  30. 0 0
      dist/static/js/chunk-a5501100.fb2b6d84.js
  31. 0 0
      dist/static/js/chunk-aac933f0.4d0e7022.js
  32. 0 0
      dist/static/js/chunk-ab1f41b4.ba9859b7.js
  33. 0 0
      dist/static/js/chunk-ba20fc96.a5c0edd0.js
  34. 0 0
      dist/static/js/chunk-dca7045c.1008223f.js
  35. 0 0
      dist/static/js/chunk-eb7e35dc.f38e7a75.js
  36. 19 7
      src/components/remote-search/index.vue
  37. 4 0
      src/router/index.js
  38. 3 1
      src/router/notKeepAliveList.js
  39. 123 105
      src/store/modules/selects.js
  40. 9 1
      src/styles/iconfont/iconfont.css
  41. BIN
      src/styles/iconfont/iconfont.ttf
  42. 53 9
      src/templateList.vue
  43. 335 0
      src/views/agentManager/agentList.vue
  44. 104 0
      src/views/agentManager/api.js
  45. 252 0
      src/views/agentManager/memberShareList.vue
  46. 117 0
      src/views/agentManager/modals/eidtAgentMager.vue
  47. 108 0
      src/views/agentManager/modals/eidthStaff.vue
  48. 7 0
      src/views/main/api.js
  49. 6 3
      src/views/main/cloudDate/allDate.vue
  50. 9 6
      src/views/main/cloudDate/index.vue
  51. 2 2
      src/views/main/cloudDate/modals/headers.vue
  52. 353 0
      src/views/main/cloudDate/organMemberList.vue
  53. 16 6
      src/views/main/constant.js
  54. 11 2
      src/views/organManager/components/organInfo.vue
  55. 1068 1067
      src/views/sporadicManager/sporadicList.vue

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


File diff suppressed because it is too large
+ 0 - 0
dist/static/css/app.30dc046c.css


File diff suppressed because it is too large
+ 0 - 0
dist/static/css/app.416c85f7.css


+ 0 - 1
dist/static/css/chunk-08976328.60f9a880.css

@@ -1 +0,0 @@
-.m-container .m-wrap[data-v-29499dec]{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row;-webkit-box-pack:start;-ms-flex-pack:start;justify-content:flex-start;width:100%;-webkit-box-align:center;-ms-flex-align:center;align-items:center;margin-bottom:16px}.m-container .m-wrap .newBand[data-v-29499dec]{margin:0 5px 0 10px}.m-container .m-wrap .title[data-v-29499dec]{width:150px;text-align:right;color:#212121;font-weight:600}.m-container .m-wrap .organSelect[data-v-29499dec]{width:260px!important}.m-container .m-wrap .el-tooltip.micon[data-v-29499dec]{width:20px;height:20px;position:relative;margin-left:8px}.m-container .formCollapse[data-v-29499dec]{border:none}.m-container .formCollapse[data-v-29499dec] .el-collapse-item__header{padding:0 15px;border-bottom:none;background-color:#f8f8f8}.m-container .formCollapse[data-v-29499dec] .el-collapse-item__wrap{padding:15px;border-bottom:none}.m-container .formCollapse[data-v-29499dec] .el-collapse-item__arrow.is-active{-webkit-transform:rotate(-90deg);transform:rotate(-90deg)}.m-container .formCollapse .el-tabs__nav[data-v-29499dec],.m-container .formCollapse[data-v-29499dec] .el-collapse-item__arrow{-webkit-transform:rotate(90deg);transform:rotate(90deg)}.m-container .formCollapse[data-v-29499dec] .el-collapse-item__content{padding-bottom:0!important}.m-container .formCollapse .wrapTitle[data-v-29499dec]{font-size:18px;position:relative;font-weight:600;margin-left:12px}.m-container .formCollapse .wrapTitle[data-v-29499dec]:after{position:absolute;width:4px;height:18px;background:var(--color-primary);border-radius:2px;left:-13px;top:14px;content:""}[data-v-29499dec] .el-input__icon.el-icon-date{height:40px!important}

+ 1 - 0
dist/static/css/chunk-0e4763dd.e7812bd3.css

@@ -0,0 +1 @@
+.theme-message,.theme-picker-dropdown{z-index:99999!important}.theme-picker .el-color-picker__trigger{height:26px!important;width:26px!important;padding:2px}.theme-picker-dropdown .el-color-dropdown__link-btn{display:none}.ant-upload-preview[data-v-10197852]{background-color:#fff}.ant-upload-preview .avatar-uploader .upload-desc[data-v-10197852]{position:absolute;bottom:0;left:0;color:#ccc;font-size:8px;right:0}[data-v-10197852] .avatar-uploader .el-upload--text{border:1px dashed #d9d9d9;border-radius:6px;margin-right:20px;cursor:pointer;position:relative;overflow:hidden}[data-v-10197852] .avatar-uploader.uploadDisabled .el-upload--text{cursor:not-allowed;background-color:#f7f7f7}[data-v-10197852] .avatar-uploader.uploadDisabled .el-upload:hover{border-color:#d9d9d9}[data-v-10197852] .avatar-uploader .el-upload:hover{border-color:#409eff}[data-v-10197852] .avatar-uploader-icon{font-size:22px;color:#ccc;width:108px;height:108px;line-height:108px;text-align:center}[data-v-10197852].avatar{width:108px;height:108px;display:block}.el-input[data-v-10197852],.el-select[data-v-10197852],.el-textarea[data-v-10197852]{width:300px!important}.el-textarea[data-v-10197852],[data-v-10197852] .el-textarea__inner{height:108px!important;min-height:108px!important}.themeColor-block[data-v-10197852]{width:30px;height:30px;border-radius:2px;display:inline-block;cursor:pointer;vertical-align:middle;overflow:hidden}.themeColor-block .el-icon-check[data-v-10197852]{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;height:31px;color:#fff}.themeColor-block+.themeColor-block[data-v-10197852]{margin-left:12px}

+ 1 - 0
dist/static/css/chunk-1ffc3572.fb509993.css

@@ -0,0 +1 @@
+.m-container .m-wrap[data-v-41db7db5]{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row;-webkit-box-pack:start;-ms-flex-pack:start;justify-content:flex-start;width:100%;-webkit-box-align:center;-ms-flex-align:center;align-items:center;margin-bottom:16px}.m-container .m-wrap .newBand[data-v-41db7db5]{margin:0 5px 0 10px}.m-container .m-wrap .title[data-v-41db7db5]{width:150px;text-align:right;color:#212121;font-weight:600}.m-container .m-wrap .organSelect[data-v-41db7db5]{width:260px!important}.m-container .m-wrap .el-tooltip.micon[data-v-41db7db5]{width:20px;height:20px;position:relative;margin-left:8px}.m-container .formCollapse[data-v-41db7db5]{border:none}.m-container .formCollapse[data-v-41db7db5] .el-collapse-item__header{padding:0 15px;border-bottom:none;background-color:#f8f8f8}.m-container .formCollapse[data-v-41db7db5] .el-collapse-item__wrap{padding:15px;border-bottom:none}.m-container .formCollapse[data-v-41db7db5] .el-collapse-item__arrow.is-active{-webkit-transform:rotate(-90deg);transform:rotate(-90deg)}.m-container .formCollapse .el-tabs__nav[data-v-41db7db5],.m-container .formCollapse[data-v-41db7db5] .el-collapse-item__arrow{-webkit-transform:rotate(90deg);transform:rotate(90deg)}.m-container .formCollapse[data-v-41db7db5] .el-collapse-item__content{padding-bottom:0!important}.m-container .formCollapse .wrapTitle[data-v-41db7db5]{font-size:18px;position:relative;font-weight:600;margin-left:12px}.m-container .formCollapse .wrapTitle[data-v-41db7db5]:after{position:absolute;width:4px;height:18px;background:var(--color-primary);border-radius:2px;left:-13px;top:14px;content:""}[data-v-41db7db5] .el-input__icon.el-icon-date{height:40px!important}

File diff suppressed because it is too large
+ 0 - 0
dist/static/css/chunk-3b9aae1a.afcf54b5.css


+ 1 - 0
dist/static/css/chunk-41561464.224948e4.css

@@ -0,0 +1 @@
+.right-code .title[data-v-1ad9b4ea]{font-size:18px;text-align:center;padding-bottom:8px}.newBand[data-v-1ad9b4ea]{display:inline-block}.el-input[data-v-1ad9b4ea]{width:180px!important}[data-v-1ad9b4ea] .el-select{width:auto!important}

+ 1 - 1
dist/static/css/chunk-aac933f0.8c9b93dd.css → dist/static/css/chunk-4adcf490.dcfb8b49.css

@@ -1 +1 @@
-.el-divider--horizontal[data-v-921f44ee]{margin-top:0!important}.titleWrap[data-v-921f44ee]{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between;-webkit-box-align:center;-ms-flex-align:center;align-items:center;height:55px}[data-v-1643a777] .el-card__body{padding-top:0!important}.titleCell[data-v-1643a777]{display:inline-block}.chioseBox[data-v-1643a777]{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:start;-ms-flex-pack:start;justify-content:flex-start;margin-bottom:30px}.chioseBox .lookOrgan[data-v-1643a777]{margin-left:10px}.wrap[data-v-1643a777]{position:relative;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between;margin-bottom:20px}
+.el-divider--horizontal[data-v-aff3d1da]{margin-top:0!important}.titleWrap[data-v-aff3d1da]{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between;-webkit-box-align:center;-ms-flex-align:center;align-items:center;height:55px}[data-v-1643a777] .el-card__body{padding-top:0!important}.titleCell[data-v-1643a777]{display:inline-block}.chioseBox[data-v-1643a777]{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:start;-ms-flex-pack:start;justify-content:flex-start;margin-bottom:30px}.chioseBox .lookOrgan[data-v-1643a777]{margin-left:10px}.wrap[data-v-1643a777]{position:relative;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between;margin-bottom:20px}

File diff suppressed because it is too large
+ 0 - 0
dist/static/css/chunk-5ecb2731.ba9905cb.css


+ 0 - 1
dist/static/css/chunk-62739240.c511ac1f.css

@@ -1 +0,0 @@
-.right-code .title[data-v-33a8d4b4]{font-size:18px;text-align:center;padding-bottom:8px}.newBand[data-v-33a8d4b4]{display:inline-block}.el-input[data-v-33a8d4b4]{width:180px!important}[data-v-33a8d4b4] .el-select{width:auto!important}

+ 1 - 0
dist/static/css/chunk-79538aeb.74862bc3.css

@@ -0,0 +1 @@
+.myCard[data-v-286dcae6]{margin-bottom:20px}.myCard[data-v-286dcae6] .el-card__body{padding:0 20px!important}

+ 0 - 1
dist/static/css/chunk-ba20fc96.d3672746.css

@@ -1 +0,0 @@
-.theme-message,.theme-picker-dropdown{z-index:99999!important}.theme-picker .el-color-picker__trigger{height:26px!important;width:26px!important;padding:2px}.theme-picker-dropdown .el-color-dropdown__link-btn{display:none}.ant-upload-preview[data-v-4b440531]{background-color:#fff}.ant-upload-preview .avatar-uploader .upload-desc[data-v-4b440531]{position:absolute;bottom:0;left:0;color:#ccc;font-size:8px;right:0}[data-v-4b440531] .avatar-uploader .el-upload--text{border:1px dashed #d9d9d9;border-radius:6px;margin-right:20px;cursor:pointer;position:relative;overflow:hidden}[data-v-4b440531] .avatar-uploader.uploadDisabled .el-upload--text{cursor:not-allowed;background-color:#f7f7f7}[data-v-4b440531] .avatar-uploader.uploadDisabled .el-upload:hover{border-color:#d9d9d9}[data-v-4b440531] .avatar-uploader .el-upload:hover{border-color:#409eff}[data-v-4b440531] .avatar-uploader-icon{font-size:22px;color:#ccc;width:108px;height:108px;line-height:108px;text-align:center}[data-v-4b440531].avatar{width:108px;height:108px;display:block}.el-input[data-v-4b440531],.el-select[data-v-4b440531],.el-textarea[data-v-4b440531]{width:300px!important}.el-textarea[data-v-4b440531],[data-v-4b440531] .el-textarea__inner{height:108px!important;min-height:108px!important}.themeColor-block[data-v-4b440531]{width:30px;height:30px;border-radius:2px;display:inline-block;cursor:pointer;vertical-align:middle;overflow:hidden}.themeColor-block .el-icon-check[data-v-4b440531]{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;height:31px;color:#fff}.themeColor-block+.themeColor-block[data-v-4b440531]{margin-left:12px}

File diff suppressed because it is too large
+ 0 - 0
dist/static/css/chunk-eb7e35dc.9baa566f.css


BIN
dist/static/fonts/iconfont.3bbc3d83.ttf → dist/static/fonts/iconfont.9052f547.ttf


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


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


File diff suppressed because it is too large
+ 0 - 0
dist/static/js/chunk-0220734c.5a91fdbf.js


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


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


File diff suppressed because it is too large
+ 0 - 0
dist/static/js/chunk-1ffc3572.050e0360.js


File diff suppressed because it is too large
+ 0 - 0
dist/static/js/chunk-2773e604.70328ab5.js


File diff suppressed because it is too large
+ 0 - 0
dist/static/js/chunk-3b9aae1a.74db4afe.js


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


File diff suppressed because it is too large
+ 0 - 0
dist/static/js/chunk-4adcf490.0ef6cb42.js


File diff suppressed because it is too large
+ 1 - 1
dist/static/js/chunk-5ecb2731.e2d69a25.js


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


File diff suppressed because it is too large
+ 0 - 0
dist/static/js/chunk-79538aeb.3203f9da.js


File diff suppressed because it is too large
+ 0 - 0
dist/static/js/chunk-82cc728c.ce36b406.js


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


File diff suppressed because it is too large
+ 0 - 0
dist/static/js/chunk-aac933f0.4d0e7022.js


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


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


File diff suppressed because it is too large
+ 0 - 0
dist/static/js/chunk-dca7045c.1008223f.js


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


+ 19 - 7
src/components/remote-search/index.vue

@@ -24,8 +24,10 @@
         :label="item.userName"
         :label="item.userName"
         :value="item.userId"
         :value="item.userId"
       >
       >
-      <span style="float: left">{{ item.userName }}</span>
-      <span style="float: right; color: #8492a6; font-size: 13px">{{ item.userId }}</span>
+        <span style="float: left">{{ item.userName }}</span>
+        <span style="float: right; color: #8492a6; font-size: 13px">{{
+          item.userId
+        }}</span>
       </el-option>
       </el-option>
     </el-select>
     </el-select>
   </div>
   </div>
@@ -34,7 +36,8 @@
 const placeholder = {
 const placeholder = {
   setTeachers: "请选择老师",
   setTeachers: "请选择老师",
   setEducations: "请选乐团主管",
   setEducations: "请选乐团主管",
-  setEmploys:"请选择操作人"
+  setEmploys: "请选择操作人",
+  setTenantUser: "请选择推荐人",
 };
 };
 import { throttle, slice, uniqBy } from "lodash";
 import { throttle, slice, uniqBy } from "lodash";
 import selects from "@/store/modules/selects";
 import selects from "@/store/modules/selects";
@@ -57,15 +60,23 @@ export default {
     // this.getList();
     // this.getList();
     //  (this.value)
     //  (this.value)
     this.getOptions(this.value || "");
     this.getOptions(this.value || "");
+
   },
   },
   methods: {
   methods: {
     async getList() {
     async getList() {
       // 处理乐团主管数据请求
       // 处理乐团主管数据请求
-      const commit = this.commit == 'setEducations' ? 'setOrganRole' : this.commit
-      await this.$store.dispatch(commit);
-      if(commit == 'setOrganRole') {
+      const commit =
+        this.commit == "setEducations" ? "setOrganRole" : this.commit;
+        if(this.commit == 'setTenantUser'){
+          await this.$store.dispatch(commit,this.value);
+        }else{
+          await this.$store.dispatch(commit);
+        }
+
+      if (commit == "setOrganRole") {
         this.list = this.selects.roles[this.enumer[commit]];
         this.list = this.selects.roles[this.enumer[commit]];
       } else {
       } else {
+
         this.list = this.selects[this.enumer[commit]];
         this.list = this.selects[this.enumer[commit]];
       }
       }
       const data = {};
       const data = {};
@@ -140,7 +151,8 @@ export default {
       return {
       return {
         setTeachers: "teachers",
         setTeachers: "teachers",
         setOrganRole: "EDUCATION",
         setOrganRole: "EDUCATION",
-        setEmploys:'employs'
+        setEmploys: "employs",
+        setTenantUser: "tenantUsers",
       };
       };
     },
     },
   },
   },

+ 4 - 0
src/router/index.js

@@ -550,6 +550,10 @@ export const asyncRoutes = {
   platformAdminManger:()=>import('@/views/platformManager/paltformAdmin'),
   platformAdminManger:()=>import('@/views/platformManager/paltformAdmin'),
   // 小课学员管理
   // 小课学员管理
   smallStudentManager:()=>import('@/views/smallStudentManager'),
   smallStudentManager:()=>import('@/views/smallStudentManager'),
+  // 代理商管理
+  agentList:()=>import('@/views/agentManager/agentList'),
+  // 团练宝分润
+  memberShareList:()=>import('@/views/agentManager/memberShareList'),
 }
 }
 
 
 export default router
 export default router

+ 3 - 1
src/router/notKeepAliveList.js

@@ -119,5 +119,7 @@ export default [
   '/liveClassManager',
   '/liveClassManager',
   '/tenantApply',
   '/tenantApply',
   '/platformAdminManger', // 平台员工管理
   '/platformAdminManger', // 平台员工管理
-  '/studentManager/smallStudentManager'
+  '/studentManager/smallStudentManager',
+  '/memberShareList',
+  '/agentList'
 ]
 ]

+ 123 - 105
src/store/modules/selects.js

@@ -6,20 +6,15 @@ import {
   findEducationUsers,
   findEducationUsers,
   getEmployeeOrgan,
   getEmployeeOrgan,
   getOrganRole
   getOrganRole
-} from '@/api/buildTeam'
-import {
-  getSchool,
-  queryEmployByOrganId
-} from '@/api/systemManage'
-import {
-  vipGroupCategory,
-
-} from "@/api/vipSeting"
+} from "@/api/buildTeam";
+import { getSchool, queryEmployByOrganId } from "@/api/systemManage";
+import { vipGroupCategory } from "@/api/vipSeting";
+import { getTenantUserList } from '@/views/agentManager/api'
 // import {
 // import {
 //   findTechnician
 //   findTechnician
 // } from '@/api/repairManager'
 // } from '@/api/repairManager'
 
 
-const loadings = {}
+const loadings = {};
 
 
 /**
 /**
  *
  *
@@ -42,14 +37,15 @@ export default {
     educations: [],
     educations: [],
     technician: [],
     technician: [],
     employs: [],
     employs: [],
-    roles: []
+    roles: [],
+    tenantUsers:[]
   },
   },
   mutations: {
   mutations: {
     commit_branchs: (state, branchs) => {
     commit_branchs: (state, branchs) => {
-      state.branchs = branchs
+      state.branchs = branchs;
     },
     },
     commit_subjects: (state, subjects) => {
     commit_subjects: (state, subjects) => {
-      state.subjects = subjects
+      state.subjects = subjects;
     },
     },
     commit_teachers: (state, teachers) => {
     commit_teachers: (state, teachers) => {
       state.teachers = teachers.map(teacher => {
       state.teachers = teachers.map(teacher => {
@@ -59,23 +55,23 @@ export default {
           userId: teacher.id,
           userId: teacher.id,
           userName: teacher.realName,
           userName: teacher.realName,
           realName: teacher.realName
           realName: teacher.realName
-        }
-      })
+        };
+      });
     },
     },
     commit_schools: (state, schools) => {
     commit_schools: (state, schools) => {
-      state.schools = schools
+      state.schools = schools;
     },
     },
     commit_vip_group_category: (state, vipGroupCategory) => {
     commit_vip_group_category: (state, vipGroupCategory) => {
-      state.vipGroupCategory = vipGroupCategory
+      state.vipGroupCategory = vipGroupCategory;
     },
     },
     commit_educations: (state, educations) => {
     commit_educations: (state, educations) => {
-      state.educations = educations
+      state.educations = educations;
     },
     },
     commit_technician: (state, technician) => {
     commit_technician: (state, technician) => {
-      state.technician = technician
+      state.technician = technician;
     },
     },
     commit_roles: (state, roles) => {
     commit_roles: (state, roles) => {
-      state.roles = roles
+      state.roles = roles;
     },
     },
     commit_employs: (state, employs) => {
     commit_employs: (state, employs) => {
       state.employs = employs.map(emloys => {
       state.employs = employs.map(emloys => {
@@ -85,123 +81,133 @@ export default {
           userId: emloys.id,
           userId: emloys.id,
           userName: emloys.realName,
           userName: emloys.realName,
           realName: emloys.realName
           realName: emloys.realName
+        };
+      });
+    },
+    commit_tenantUsers:(state,tenantUsers)=>{
+      state.tenantUsers = tenantUsers.map(tenantUser=>{
+        return {
+          ...tenantUser,
+          userId: tenantUser.id,
+          userName: tenantUser.realName,
+          realName: tenantUser.realName
         }
         }
       })
       })
     }
     }
   },
   },
   actions: {
   actions: {
-    async setBranchs({
-      commit,
-      state
-    }, force) {
-      if ((!state.branchs.length || force === true) && !loadings.commit_branchs) {
-        loadings.commit_branchs = getEmployeeOrgan()
+    async setBranchs({ commit, state }, force) {
+      if (
+        (!state.branchs.length || force === true) &&
+        !loadings.commit_branchs
+      ) {
+        loadings.commit_branchs = getEmployeeOrgan();
         try {
         try {
-          const res = await loadings.commit_branchs
-          commit('commit_branchs', res.data)
+          const res = await loadings.commit_branchs;
+          commit("commit_branchs", res.data);
         } catch (error) {}
         } catch (error) {}
-        loadings.commit_branchs = false
+        loadings.commit_branchs = false;
       }
       }
     },
     },
-    async setSubjects({
-      commit,
-      state
-    }, force) {
-      if ((!state.subjects.length || force === true) && !loadings.commit_subjects) {
+    async setSubjects({ commit, state }, force) {
+      if (
+        (!state.subjects.length || force === true) &&
+        !loadings.commit_subjects
+      ) {
         loadings.commit_subjects = getSubject({
         loadings.commit_subjects = getSubject({
           rows: 9999,
           rows: 9999,
-          tenantId: '1'
-        })
+          tenantId: "1"
+        });
         try {
         try {
-          const res = await loadings.commit_subjects
-          commit('commit_subjects', res.data)
+          const res = await loadings.commit_subjects;
+          commit("commit_subjects", res.data);
         } catch (error) {}
         } catch (error) {}
-        loadings.commit_subjects = false
+        loadings.commit_subjects = false;
       }
       }
     },
     },
-    async setTeachers({
-      commit,
-      state
-    }, force) {
-      if ((!state.teachers.length || force === true) && !loadings.commit_teachers) {
-        loadings.commit_teachers = getTeacher()
+    async setTeachers({ commit, state }, force) {
+      if (
+        (!state.teachers.length || force === true) &&
+        !loadings.commit_teachers
+      ) {
+        loadings.commit_teachers = getTeacher();
         try {
         try {
-          const res = await loadings.commit_teachers
-          commit('commit_teachers', res.data)
+          const res = await loadings.commit_teachers;
+          commit("commit_teachers", res.data);
         } catch (error) {}
         } catch (error) {}
-        loadings.commit_teachers = false
+        loadings.commit_teachers = false;
       }
       }
     },
     },
-    async setSchools({
-      commit,
-      state
-    }, force) {
-      if ((!state.schools.length || force === true) && !loadings.commit_schools) {
-        loadings.commit_schools = getSchool()
+    async setSchools({ commit, state }, force) {
+      if (
+        (!state.schools.length || force === true) &&
+        !loadings.commit_schools
+      ) {
+        loadings.commit_schools = getSchool();
         try {
         try {
-          const res = await loadings.commit_schools
-          commit('commit_schools', res.data)
+          const res = await loadings.commit_schools;
+          commit("commit_schools", res.data);
         } catch (error) {}
         } catch (error) {}
-        loadings.commit_schools = false
+        loadings.commit_schools = false;
       }
       }
-      return loadings.commit_schools
+      return loadings.commit_schools;
     },
     },
-    async setVipGroupCategory({
-      commit,
-      state
-    }, force) {
-
-      if ((!state.vipGroupCategory.length || force === true) && !loadings.commit_vip_group_category) {
-
-        loadings.commit_vip_group_category = vipGroupCategory()
+    async setVipGroupCategory({ commit, state }, force) {
+      if (
+        (!state.vipGroupCategory.length || force === true) &&
+        !loadings.commit_vip_group_category
+      ) {
+        loadings.commit_vip_group_category = vipGroupCategory();
         try {
         try {
-          const res = await loadings.commit_vip_group_category
-          commit('commit_vip_group_category', res.data)
-        } catch (error) {console.log(error)}
-        loadings.commit_vip_group_category = false
+          const res = await loadings.commit_vip_group_category;
+          commit("commit_vip_group_category", res.data);
+        } catch (error) {
+          console.log(error);
+        }
+        loadings.commit_vip_group_category = false;
       }
       }
     },
     },
-    async setEducations({
-      commit,
-      state
-    }, force) {
-      if ((!state.educations.length || force === true) && !loadings.commit_educations) {
-        loadings.commit_educations = findEducationUsers()
+    async setEducations({ commit, state }, force) {
+      if (
+        (!state.educations.length || force === true) &&
+        !loadings.commit_educations
+      ) {
+        loadings.commit_educations = findEducationUsers();
         try {
         try {
-          const res = await loadings.commit_educations
-          commit('commit_educations', res.data)
+          const res = await loadings.commit_educations;
+          commit("commit_educations", res.data);
         } catch (error) {}
         } catch (error) {}
-        loadings.commit_educations = false
+        loadings.commit_educations = false;
       }
       }
     },
     },
-    async setOrganRole({
-      commit,
-      state
-    }, force) {
-      if ((!state.educations.length || force === true) && !loadings.commit_roles) {
-        loadings.commit_roles = getOrganRole()
+    async setOrganRole({ commit, state }, force) {
+      if (
+        (!state.educations.length || force === true) &&
+        !loadings.commit_roles
+      ) {
+        loadings.commit_roles = getOrganRole();
         try {
         try {
-          const res = await loadings.commit_roles
-          const tempArr = []
-          const tempData = res.data
+          const res = await loadings.commit_roles;
+          const tempArr = [];
+          const tempData = res.data;
           // 初始化数据
           // 初始化数据
           for (let i in tempData) {
           for (let i in tempData) {
-            tempArr[i] = []
+            tempArr[i] = [];
             if (tempData[i]) {
             if (tempData[i]) {
               for (let t in tempData[i]) {
               for (let t in tempData[i]) {
                 tempArr[i].push({
                 tempArr[i].push({
                   value: tempData[i][t].userId,
                   value: tempData[i][t].userId,
                   label: tempData[i][t].realName,
                   label: tempData[i][t].realName,
                   ...tempData[i][t]
                   ...tempData[i][t]
-                })
+                });
               }
               }
             }
             }
           }
           }
-          commit('commit_roles', tempArr)
+          commit("commit_roles", tempArr);
         } catch (error) {}
         } catch (error) {}
-        loadings.commit_roles = false
+        loadings.commit_roles = false;
       }
       }
-      getOrganRole
+      getOrganRole;
     },
     },
     // async setTechnician({
     // async setTechnician({
     //   commit,
     //   commit,
@@ -217,21 +223,33 @@ export default {
     //   }
     //   }
 
 
     // },
     // },
-    async setEmploys({
-      commit,
-      state
-    }, force) {
-      if ((!state.employs.length || force === true) && !loadings.commit_employs) {
+    async setEmploys({ commit, state }, force) {
+      if (
+        (!state.employs.length || force === true) &&
+        !loadings.commit_employs
+      ) {
         loadings.commit_employs = queryEmployByOrganId({
         loadings.commit_employs = queryEmployByOrganId({
-          rows: 99999
-        })
+
+        });
         try {
         try {
-          const res = await loadings.commit_employs
-          commit('commit_employs', res.data.rows)
+          const res = await loadings.commit_employs;
+          commit("commit_employs", res.data.rows);
         } catch (error) {}
         } catch (error) {}
-        loadings.commit_employs = false
+        loadings.commit_employs = false;
+      }
+    },
+    async setTenantUser({ commit, state },value, force) {
+      if (
+        (!state.employs.length || force === true) &&
+        !loadings.commit_tenantUsers
+      ) {
+        loadings.commit_tenantUsers = getTenantUserList();
+        try {
+          const res = await loadings.commit_tenantUsers;
+          commit("commit_tenantUsers", res.data);
+        } catch (error) {}
+        loadings.commit_tenantUsers = false;
       }
       }
-
     }
     }
   }
   }
-}
+};

+ 9 - 1
src/styles/iconfont/iconfont.css

@@ -1,6 +1,6 @@
 @font-face {
 @font-face {
   font-family: "iconfont"; /* Project id  */
   font-family: "iconfont"; /* Project id  */
-  src: url('iconfont.ttf?t=1645601707072') format('truetype');
+  src: url('iconfont.ttf?t=1650868886047') format('truetype');
 }
 }
 
 
 .iconfont {
 .iconfont {
@@ -427,3 +427,11 @@
   content: "\e683";
   content: "\e683";
 }
 }
 
 
+.icon-dailishangguanli:before {
+  content: "\e684";
+}
+
+.icon-tuanlianbaofenrun:before {
+  content: "\e685";
+}
+

BIN
src/styles/iconfont/iconfont.ttf


+ 53 - 9
src/templateList.vue

@@ -6,20 +6,25 @@
       班级列表
       班级列表
     </h2>
     </h2>
     <div class="m-core">
     <div class="m-core">
-      <save-form :inline="true" :model="searchForm" @submit="search" @reset='onReSet'>
+      <save-form
+        :inline="true"
+        :model="searchForm"
+        @submit="search"
+        @reset="onReSet"
+      >
         <el-form-item>
         <el-form-item>
           <el-input
           <el-input
             v-model.trim="searchForm.search"
             v-model.trim="searchForm.search"
             clearable
             clearable
             @keyup.enter.native="search"
             @keyup.enter.native="search"
-            placeholder='请输入乐团编号'
+            placeholder="请输入乐团编号"
           ></el-input>
           ></el-input>
         </el-form-item>
         </el-form-item>
-          <el-form-item>
+        <el-form-item>
           <el-input
           <el-input
             v-model.trim="searchForm.search"
             v-model.trim="searchForm.search"
             @keyup.enter.native="search"
             @keyup.enter.native="search"
-            placeholder='请输入乐团编号'
+            placeholder="请输入乐团编号"
           ></el-input>
           ></el-input>
         </el-form-item>
         </el-form-item>
         <el-form-item>
         <el-form-item>
@@ -36,7 +41,37 @@
           <el-table-column
           <el-table-column
             align="center"
             align="center"
             prop="studentId"
             prop="studentId"
-            label="分部"
+            label="代理商编号"
+          ></el-table-column>
+          <el-table-column
+            align="center"
+            prop="studentId"
+            label="代理商名称"
+          ></el-table-column>
+          <el-table-column
+            align="center"
+            prop="studentId"
+            label="机构编号"
+          ></el-table-column>
+          <el-table-column
+            align="center"
+            prop="studentId"
+            label="机构名称"
+          ></el-table-column>
+          <el-table-column
+            align="center"
+            prop="studentId"
+            label="激活时间"
+          ></el-table-column>
+          <el-table-column
+            align="center"
+            prop="studentId"
+            label="激活数量"
+          ></el-table-column>
+                 <el-table-column
+            align="center"
+            prop="studentId"
+            label="推荐人"
           ></el-table-column>
           ></el-table-column>
         </el-table>
         </el-table>
         <pagination
         <pagination
@@ -57,6 +92,7 @@ import axios from "axios";
 import { getToken } from "@/utils/auth";
 import { getToken } from "@/utils/auth";
 import pagination from "@/components/Pagination/index";
 import pagination from "@/components/Pagination/index";
 import load from "@/utils/loading";
 import load from "@/utils/loading";
+import { getTimes } from "@/utils";
 export default {
 export default {
   components: { pagination },
   components: { pagination },
   data() {
   data() {
@@ -86,12 +122,20 @@ export default {
   },
   },
   methods: {
   methods: {
     init() {},
     init() {},
-    getList() {},
-    search(){
+    getList() {
+      let { timer, ...rest } = this.searchForm;
+      let params = {
+        ...rest,
+        page: this.rules.page,
+        rows: this.rules.limit,
+        ...getTimes(timer, ["startTime", "endTime"]),
+      };
+    },
+    search() {
       this.rules.page = 1;
       this.rules.page = 1;
-      this.getList()
+      this.getList();
     },
     },
-    onReSet(){},
+    onReSet() {},
   },
   },
 };
 };
 </script>
 </script>

+ 335 - 0
src/views/agentManager/agentList.vue

@@ -0,0 +1,335 @@
+<!--  -->
+<template>
+  <div class="m-container">
+    <h2>
+      <div class="squrt"></div>
+      代理商管理
+    </h2>
+    <div class="m-core">
+      <save-form
+        :inline="true"
+        :model="searchForm"
+        @submit="search"
+        @reset="onReSet"
+      >
+        <el-form-item prop="search">
+          <el-input
+            v-model.trim="searchForm.search"
+            clearable
+            @keyup.enter.native="search"
+            placeholder="姓名/手机号"
+          ></el-input>
+        </el-form-item>
+        <el-form-item prop="state">
+          <el-select placeholder="状态" v-model="searchForm.state" clearable>
+            <el-option label="正常" value="0"></el-option>
+            <el-option label="冻结" value="1"></el-option>
+          </el-select>
+        </el-form-item>
+        <el-form-item>
+          <el-button native-type="submit" type="primary">搜索</el-button>
+          <el-button native-type="reset" type="danger">重置</el-button>
+        </el-form-item>
+      </save-form>
+      <div class="btnList">
+        <el-button type="primary" style="margin-bottom: 20px" @click="addAgent">
+          新建代理商
+        </el-button>
+        <el-button type="primary" style="margin-bottom: 20px" @click="lookH5">
+          代理商H5
+        </el-button>
+      </div>
+      <div class="tableWrap">
+        <el-table
+          style="width: 100%"
+          :header-cell-style="{ background: '#EDEEF0', color: '#444' }"
+          :data="tableList"
+          row-key="userId"
+          ref="table1"
+          type="expand"
+          lazy
+          :load="getStaffList"
+          @expand-change="hasExpandChange"
+          :tree-props="{ children: 'children', hasChildren: 'hasChildren' }"
+        >
+          <!--     -->
+          <el-table-column
+            align="center"
+            prop="userId"
+            label="代理商编号"
+          ></el-table-column>
+          <el-table-column
+            align="center"
+            prop="proxyName"
+            label="代理商名称"
+          ></el-table-column>
+          <el-table-column
+            align="center"
+            prop="name"
+            label="姓名"
+          ></el-table-column>
+          <el-table-column
+            align="center"
+            prop="phone"
+            label="手机号"
+          ></el-table-column>
+          <el-table-column
+            align="center"
+            prop="role"
+            label="角色"
+          ></el-table-column>
+          <el-table-column align="center" prop="state" label="状态">
+            <template slot-scope="scope">
+              {{ scope.row.state == "0" ? "正常" : "冻结" }}
+            </template>
+          </el-table-column>
+
+          <el-table-column
+            align="center"
+            fixed="right"
+            label="操作"
+            width="300"
+          >
+            <template slot-scope="scope">
+              <div>
+                <el-button type="text" @click="onJoinQrCode(scope.row)"
+                  >入驻二维码</el-button
+                >
+                <el-button
+                  type="text"
+                  v-if="!scope.row.parentId"
+                  @click="addAgentStaff(scope.row)"
+                  >添加员工</el-button
+                >
+                <!-- permission -->
+                <el-button
+                  type="text"
+                  v-if="!scope.row.parentId"
+                  @click="addAgent(scope.row)"
+                  >修改</el-button
+                >
+                <el-button
+                  type="text"
+                  v-if="scope.row.parentId"
+                  @click="addAgentStaff(scope.row)"
+                  >修改</el-button
+                >
+                <el-button
+                  type="text"
+                  v-if="scope.row.state == '0' && !scope.row.parentId"
+                  @click="freezeProxy(scope.row)"
+                  >冻结</el-button
+                >
+                <el-button
+                  type="text"
+                  v-if="scope.row.state != '0' && !scope.row.parentId"
+                  @click="freezeProxy(scope.row)"
+                  >启用</el-button
+                >
+              </div>
+            </template>
+          </el-table-column>
+        </el-table>
+        <pagination
+          sync
+          :total.sync="rules.total"
+          :page.sync="rules.page"
+          :limit.sync="rules.limit"
+          :page-sizes="rules.page_size"
+          @pagination="getList"
+        />
+      </div>
+    </div>
+    <eidtAgentMager ref="eidtAgentMagerRef" @getList="getList" />
+    <eidthStaff ref="eidthStaffRef" @getList="resetTreedata" />
+    <qr-code
+      v-model="codeStatus"
+      :isDown="true"
+      :title="title"
+      :codeUrl="qrCodeUrl"
+    />
+  </div>
+</template>
+
+<script>
+import axios from "axios";
+import { getToken } from "@/utils/auth";
+import pagination from "@/components/Pagination/index";
+import load from "@/utils/loading";
+import { permission } from "@/utils/directivePage";
+import {
+  getProxyUserList,
+  freezeProxyUser,
+  getProxyUserStaffList,
+} from "./api";
+import eidtAgentMager from "./modals/eidtAgentMager";
+import eidthStaff from "./modals/eidthStaff";
+import qrCode from "@/components/QrCode/index";
+import {
+  isvalidPhone,
+  vaildStudentUrl,
+  vaildTeachingUrl,
+} from "@/utils/validate";
+export default {
+  components: { pagination, eidtAgentMager, qrCode, eidthStaff },
+  data() {
+    return {
+      searchForm: {
+        search: null,
+        state: "",
+      },
+
+      tableList: [],
+      organList: [],
+      rules: {
+        // 分页规则
+        limit: 10, // 限制显示条数
+        page: 1, // 当前页
+        total: 0, // 总条数
+        page_size: [10, 20, 40, 50], // 选择限制显示条数
+      },
+      codeStatus: false,
+      qrCodeUrl: null,
+      title: "入驻二维码",
+      hasLoad: false,
+      currentLoadTreeData: null,
+      resolveObj: null,
+      treeIds: [],
+    };
+  },
+  //生命周期 - 创建完成(可以访问当前this实例)
+  created() {},
+  //生命周期 - 挂载完成(可以访问DOM元素)
+  mounted() {
+    // 获取分部
+
+    this.init();
+  },
+  methods: {
+    init() {
+      this.getList();
+    },
+    async getList() {
+      try {
+        const res = await getProxyUserList({
+          ...this.searchForm,
+          page: this.rules.page,
+          rows: this.rules.limit,
+        });
+        this.tableList = res.data.rows.map((item, index) => {
+          // console.log(this.$refs.table1["store"].states.treeData)
+          return {
+            ...item,
+            hasChildren: true,
+          };
+        });
+
+        this.refreshRow();
+        this.rules.total = res.data.total;
+      } catch (e) {}
+    },
+    search() {
+      this.rules.page = 1;
+      this.getList();
+      // this.$set(this.$refs.table1.store.states.lazyTreeNodeMap,parentId,this.childrenData)
+    },
+    onReSet() {
+      this.$nextTick(() => {
+        this.search();
+      });
+    },
+    permission(str) {
+      return permission(str);
+    },
+    addAgent(row) {
+      this.$refs.eidtAgentMagerRef.openDialog(row);
+    },
+    addAgentStaff(row) {
+      this.$refs.eidthStaffRef.openDialog(row);
+    },
+    onJoinQrCode(row) {
+      this.qrCodeUrl =
+        vaildStudentUrl() +
+        "/project/questionAsk/index.html?recommender=" +
+        row.userId;
+      this.title = "入驻二维码";
+      this.codeStatus = true;
+    },
+    lookH5() {
+      this.qrCodeUrl = vaildTeachingUrl() + "/#/saas-home";
+      this.title = "代理商H5";
+      this.codeStatus = true;
+    },
+    async freezeProxy(row) {
+      let str = "";
+      let state = "";
+      if (row.state == 0) {
+        state = 1;
+        str = "冻结";
+      } else {
+        state = 0;
+        str = "启用";
+      }
+      try {
+        await this.$confirm(`是否${str}代理商"${row.proxyName}"?`, "提示", {
+          type: "warning",
+        });
+        await freezeProxyUser({ state, id: row.userId });
+        this.$message.success(`${str}成功`);
+        this.getList();
+      } catch (e) {}
+    },
+    async getStaffList(tree, treeNode, resolve) {
+      this.hasLoad = true;
+      this.currentLoadTreeData = tree;
+      this.resolveObj = resolve;
+      if (!this.treeIds.includes(tree.userId)) {
+        this.treeIds.push(tree.userId);
+      }
+      try {
+        const res = await getProxyUserStaffList({ id: tree.userId });
+        console.log(res.data);
+        resolve(res.data || []);
+      } catch (e) {
+        //  resolve([])
+      }
+    },
+    hasExpandChange(row, expanded) {
+      if (expanded) {
+        // 当前是展开状态
+        if (this.hasLoad) {
+          // 已执行过load,则去掉执行过的标记
+          this.hasLoad = false;
+        } else {
+          // 不然,则执行load。因为load只会执行一次,所以需要在expand事件触发再次执行
+          this.getStaffList(this.currentLoadTreeData, "", this.resolveObj);
+        }
+      }
+    },
+    refreshRow() {
+      for (let i in this.treeIds) {
+        this.$refs.table1["store"].states.treeData[
+          this.treeIds[i]
+        ].loaded = false;
+        this.$refs.table1["store"].states.treeData[
+          this.treeIds[i]
+        ].expanded = false;
+      }
+    },
+    async resetTreedata(parentId) {
+      try {
+        const res = await getProxyUserStaffList({ id: parentId });
+        this.$set(
+          this.$refs.table1.store.states.lazyTreeNodeMap,
+          parentId,
+          res.data
+        );
+      } catch (e) {
+        //  resolve([])
+      }
+    },
+  },
+};
+</script>
+<style lang='scss' scoped>
+</style>

+ 104 - 0
src/views/agentManager/api.js

@@ -0,0 +1,104 @@
+
+import request from '@/utils/request2'
+
+// 分页查询代理商负责人数据
+export const getProxyUserList = data => {
+  return request({
+    url: '/api-web/tenantProxyInfo/queryProxyUser',
+    // params: data,
+    data,
+    method: 'post',
+    requestType:'json'
+  })
+}
+
+
+// 新增代理商
+export const addProxyUser = data => {
+  return request({
+    url: '/api-web/tenantProxyInfo/addProxyInfo',
+    // params: data,
+    data,
+    method: 'post',
+    requestType:'json'
+  })
+}
+
+
+// 修改代理商
+export const updateProxyUser = data => {
+  return request({
+    url: '/api-web/tenantProxyInfo/updateProxyUserInfo',
+    // params: data,
+    data,
+    method: 'post',
+    requestType:'json'
+  })
+}
+
+
+// 启用冻结
+export const freezeProxyUser = data => {
+  return request({
+    url: '/api-web/tenantProxyInfo/freezeProxy',
+    // params: data,
+    // data,
+    method: 'get',
+    params: data,
+    // requestType:'json'
+  })
+}
+
+
+export const addProxyUserStaff = data => {
+  return request({
+    url: '/api-web/tenantProxyInfo/addProxyStaff',
+    // params: data,
+    data,
+    method: 'post',
+    requestType:'json'
+  })
+}
+
+// 获取员工
+export const getProxyUserStaffList = data=>{
+  return request({
+    url: '/api-web/tenantProxyInfo/queryProxyUserStaff',
+    // params: data,
+    params: data,
+    method: 'get',
+  })
+}
+
+// 获取平台员工
+export const getTenantUserList = data=>{
+  return request({
+    url: '/api-web/tenantProxyInfo/queryUserList',
+    // params: data,
+    data,
+    method: 'post',
+    requestType:'json',
+    hideLoading:true
+  })
+}
+
+
+// 代理商分润查询
+export const getProxyDividend = data=>{
+  return request({
+    url: '/api-web/tenantProxyDividend/queryProxyDividend',
+    // params: data,
+    data,
+    method: 'post',
+    requestType:'json'
+  })
+}
+export const getProxyDividendList = data=>{
+  return request({
+    url: '/api-web/tenantProxyDividend/queryProxyDividendInfo',
+    // params: data,
+    data,
+    method: 'post',
+    requestType:'json'
+  })
+}

+ 252 - 0
src/views/agentManager/memberShareList.vue

@@ -0,0 +1,252 @@
+<!--  -->
+<template>
+  <div class="m-container">
+    <h2>
+      <div class="squrt"></div>
+      团练宝分润
+    </h2>
+    <div class="m-core">
+      <el-card header="" style="width:460px" class="myCard">
+        <statistic class="statistic" :cols="0">
+          <statistic-item>
+            <span>
+              意向机构
+            </span>
+            <span> <count-to :endVal="detail.tenantAgency"  /></span>
+          </statistic-item>
+             <statistic-item>
+            <span>
+              入驻机构
+
+            </span>
+            <span> <count-to :endVal="detail.preTenant"  /></span>
+          </statistic-item>
+             <statistic-item>
+            <span>
+              团练宝销售数(个月)
+            </span>
+            <span> <count-to :endVal="detail.memberCount"  /></span>
+          </statistic-item>
+        </statistic>
+      </el-card>
+      <save-form
+        :inline="true"
+        :model="searchForm"
+        @submit="search"
+        @reset="onReSet"
+      >
+        <el-form-item prop="proxyId">
+          <el-select
+            class="multiple"
+            v-model.trim="searchForm.proxyId"
+            filterable
+            clearable
+            placeholder="请选代理商"
+          >
+            <el-option
+              v-for="(item, index) in proxyList"
+              :key="index"
+              :label="item.proxyName"
+              :value="item.proxyId"
+            ></el-option>
+          </el-select>
+        </el-form-item>
+        <el-form-item>
+          <el-form-item prop="recommenderId">
+            <remote-search
+              :commit="'setTenantUser'"
+              aria-placeholder="请选择推荐人"
+              v-model="searchForm.recommenderId"
+            />
+          </el-form-item>
+        </el-form-item>
+        <el-form-item>
+          <el-date-picker
+            :clearable="false"
+            v-model.trim="searchForm.timer"
+            style="width: 420px"
+            type="daterange"
+            value-format="yyyy-MM-dd"
+            range-separator="至"
+            start-placeholder="开始日期"
+            end-placeholder="结束日期"
+            :picker-options="{
+              firstDayOfWeek: 1,
+            }"
+          >
+          </el-date-picker>
+        </el-form-item>
+        <el-form-item>
+          <el-button native-type="submit" type="primary">搜索</el-button>
+          <el-button native-type="reset" type="danger">重置</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="proxyId"
+            label="代理商编号"
+          ></el-table-column>
+          <el-table-column
+            align="center"
+            prop="proxyName"
+            label="代理商名称"
+          ></el-table-column>
+          <el-table-column
+            align="center"
+            prop="tenantId"
+            label="机构编号"
+          ></el-table-column>
+          <el-table-column
+            align="center"
+            prop="tenantName"
+            label="机构名称"
+          ></el-table-column>
+          <el-table-column align="center" prop="activeDate" label="激活时间">
+            <template slot-scope="scope">
+              {{ scope.row.activeDate | formatTimer }}
+            </template>
+          </el-table-column>
+          <el-table-column
+            align="center"
+            prop="activeCount"
+            label="激活数量(个月)"
+          ></el-table-column>
+          <el-table-column
+            align="center"
+            prop="recommenderName"
+            label="推荐人"
+          ></el-table-column>
+        </el-table>
+        <pagination
+          sync
+          :total.sync="rules.total"
+          :page.sync="rules.page"
+          :limit.sync="rules.limit"
+          :page-sizes="rules.page_size"
+          @pagination="getList"
+        />
+      </div>
+    </div>
+  </div>
+</template>
+
+<script>
+import axios from "axios";
+import { getToken } from "@/utils/auth";
+import pagination from "@/components/Pagination/index";
+import { getTimes } from "@/utils";
+import load from "@/utils/loading";
+import { getProxyUserList, getProxyDividend,getProxyDividendList } from "./api";
+import countTo from 'vue-count-to'
+export default {
+  components: { pagination ,   'count-to': countTo},
+  data() {
+    return {
+      searchForm: {
+        search: null,
+        timer: [],
+      },
+      detail:{
+        memberCount:0,
+          preTenant:0,
+          tenantAgency:0
+      },
+      tableList: [],
+      organList: [],
+      rules: {
+        // 分页规则
+        limit: 10, // 限制显示条数
+        page: 1, // 当前页
+        total: 0, // 总条数
+        page_size: [10, 20, 40, 50], // 选择限制显示条数
+      },
+      proxyList: [],
+    };
+  },
+  //生命周期 - 创建完成(可以访问当前this实例)
+  created() {},
+  //生命周期 - 挂载完成(可以访问DOM元素)
+  mounted() {
+    // 获取分部
+    this.searchForm.timer = this.getInitDate();
+    this.init();
+  },
+  methods: {
+    init() {
+      this.getProxList();
+      this.getProxyDividendDetail()
+      this.getList();
+    },
+    async getProxyDividendDetail(){
+      try{
+         const res = await getProxyDividend()
+          this.detail = {
+         ...res.data
+        }
+      }catch(e){
+        console.log(e)
+      }
+
+    },
+    async getProxList() {
+      try {
+        const res = await getProxyUserList({
+          page: 1,
+          rows: 9999,
+          state: "0",
+        });
+        this.proxyList = res.data.rows;
+      } catch (e) {}
+    },
+    async getList() {
+      let { timer, ...rest } = this.searchForm;
+      let params = {
+        ...rest,
+        page: this.rules.page,
+        rows: this.rules.limit,
+        ...getTimes(timer, ["startData", "endData"]),
+      };
+      try {
+        const res = await getProxyDividendList({ ...params });
+        this.tableList = res.data.rows;
+        this.rules.total = res.data.total;
+
+      } catch (e) {
+        console.log(e);
+      }
+    },
+    search() {
+      this.rules.page = 1;
+      this.getList();
+    },
+    onReSet() {
+      this.$nextTick(()=>{
+         this.searchForm.timer = this.getInitDate();
+         this.search()
+      })
+    },
+    getInitDate() {
+      const end = this.$helpers.dayjs(new Date()).format("YYYY-MM-DD");
+      const start = this.$helpers
+        .dayjs(new Date())
+        .set("date", 1)
+        .format("YYYY-MM-DD");
+      return [start, end];
+    },
+  },
+};
+</script>
+<style lang='scss' scoped>
+.myCard {
+  margin-bottom: 20px;
+ /deep/.el-card__body {
+    padding: 0 20px!important;
+  }
+}
+</style>

+ 117 - 0
src/views/agentManager/modals/eidtAgentMager.vue

@@ -0,0 +1,117 @@
+<template>
+  <el-dialog
+    :title="agentForm.userId ? '修改代理商' : '新建代理商'"
+    width="600px"
+    :visible.sync="agentVisible"
+  >
+    <el-form
+      :model="agentForm"
+      label-position="right"
+      label-width="120px"
+      ref="adjustmentForm"
+    >
+      <el-form-item
+        label="代理商名称"
+        prop="proxyName"
+        :rules="[
+          { required: true, message: '请输入代理商名称', trigger: 'blur' },
+        ]"
+      >
+        <el-input v-model.trim="agentForm.proxyName" class="w100"></el-input>
+      </el-form-item>
+      <el-form-item
+        label="负责人姓名"
+        prop="name"
+        :rules="[
+          { required: true, message: '请输入负责人姓名', trigger: 'blur' },
+        ]"
+      >
+        <el-input v-model.trim="agentForm.name" class="w100"></el-input>
+      </el-form-item>
+      <el-form-item
+        label="手机号"
+        prop="phone"
+        :rules="[
+          { required: true, message: '手机号不能为空', trigger: 'blur' },
+          {
+            pattern: /^1[3456789]\d{9}$/,
+            message: '请输入正确的手机号',
+            trigger: 'blur',
+          },
+        ]"
+      >
+        <el-input v-model.trim="agentForm.phone" class="w100"></el-input>
+      </el-form-item>
+    </el-form>
+    <div slot="footer" class="dialog-footer">
+      <el-button @click="agentVisible = false">取 消</el-button>
+      <el-button type="primary" @click="subEidtProxy">确 定</el-button>
+    </div>
+  </el-dialog>
+</template>
+<script>
+import { addProxyUser,updateProxyUser } from '../api'
+export default {
+  data() {
+    return {
+      agentVisible: false,
+      agentForm: {
+        name: "",
+        proxyName: "",
+        phone: "",
+        userId: "",
+      },
+    };
+  },
+  mounted() {},
+  methods: {
+    openDialog(row) {
+      if (row && row.userId) {
+        this.agentForm = { ...row };
+      } else {
+        this.agentForm = {
+          name: "",
+          proxyName: "",
+          phone: "",
+          userId: "",
+        };
+        // this.$refs.adjustmentForm.resetFields();
+      }
+      this.agentVisible = true;
+    },
+    subEidtProxy() {
+      this.$refs.adjustmentForm.validate( async(flag) => {
+        if (flag) {
+          // 验证通过
+          if (this.agentForm.userId) {
+            // 修改
+
+                   try {
+              const res = await updateProxyUser({...this.agentForm})
+              this.$message.success('修改成功')
+              this.$emit('getList')
+              this.agentVisible = false;
+            }catch(e){
+              console.log(e)
+            }
+          } else {
+            // 新增
+            try {
+              const res = await addProxyUser({...this.agentForm})
+              this.$message.success('新增成功')
+              this.$emit('getList')
+              this.agentVisible = false;
+            }catch(e){
+              console.log(e)
+            }
+
+          }
+        }
+      });
+    },
+  },
+};
+</script>
+
+<style lang="scss" scoped>
+</style>

+ 108 - 0
src/views/agentManager/modals/eidthStaff.vue

@@ -0,0 +1,108 @@
+<template>
+  <el-dialog
+    :title="agentForm.userId ? '修改员工' : '新建员工'"
+    width="600px"
+    :visible.sync="agentVisible"
+  >
+    <el-form
+      :model="agentForm"
+      label-position="right"
+      label-width="120px"
+      ref="adjustmentForm"
+    >
+      <el-form-item
+        label="姓名"
+        prop="name"
+        :rules="[
+          { required: true, message: '请输入姓名', trigger: 'blur' },
+        ]"
+      >
+        <el-input v-model.trim="agentForm.name" class="w100"></el-input>
+      </el-form-item>
+
+      <el-form-item
+        label="手机号"
+        prop="phone"
+        :rules="[
+          { required: true, message: '手机号不能为空', trigger: 'blur' },
+          {
+            pattern: /^1[3456789]\d{9}$/,
+            message: '请输入正确的手机号',
+            trigger: 'blur',
+          },
+        ]"
+      >
+        <el-input v-model.trim="agentForm.phone" class="w100"></el-input>
+      </el-form-item>
+    </el-form>
+    <div slot="footer" class="dialog-footer">
+      <el-button @click="agentVisible = false">取 消</el-button>
+      <el-button type="primary" @click="subEidtProxy">确 定</el-button>
+    </div>
+  </el-dialog>
+</template>
+<script>
+import { addProxyUserStaff,updateProxyUser } from '../api'
+export default {
+  data() {
+    return {
+      agentVisible: false,
+      agentForm: {
+        name: "",
+        phone: "",
+        userId: "",
+        parentId:""
+      },
+    };
+  },
+  mounted() {},
+  methods: {
+    openDialog(row) {
+      if (row && row.parentId) {
+        this.agentForm = { ...row };
+      } else {
+        this.agentForm = {
+           name: "",
+        phone: "",
+        userId: "",
+        parentId:row.userId
+        };
+        // this.$refs.adjustmentForm.resetFields();
+      }
+      this.agentVisible = true;
+    },
+    subEidtProxy() {
+      this.$refs.adjustmentForm.validate( async(flag) => {
+        if (flag) {
+          // 验证通过
+          if (this.agentForm.userId) {
+            // 修改
+                   try {
+              const res = await updateProxyUser({...this.agentForm})
+              this.$message.success('修改成功')
+              this.$emit('getList',this.agentForm.parentId)
+              this.agentVisible = false;
+            }catch(e){
+              console.log(e)
+            }
+          } else {
+            // 新增
+            try {
+              const res = await addProxyUserStaff({...this.agentForm})
+              this.$message.success('新增成功')
+              this.$emit('getList',this.agentForm.parentId)
+              this.agentVisible = false;
+            }catch(e){
+              console.log(e)
+            }
+
+          }
+        }
+      });
+    },
+  },
+};
+</script>
+
+<style lang="scss" scoped>
+</style>

+ 7 - 0
src/views/main/api.js

@@ -182,3 +182,10 @@ export const getHasFreeCourseList = (data) => request2({
   params: data
   params: data
 })
 })
 
 
+// 学员会员数
+export const getOrganMemberList = (data) => request2({
+  url: '/api-web/studentManage/getCloudStudyStudentOverViewList',
+  method: 'get',
+  params: data,
+  requestType:'form'
+})

+ 6 - 3
src/views/main/cloudDate/allDate.vue

@@ -27,7 +27,7 @@
               />
               />
             </el-tooltip>
             </el-tooltip>
           </span>
           </span>
-          <span> <count-to :endVal="item.percent" /> </span>
+          <span> <count-to :endVal="item.percent || 0" /> </span>
         </statistic-item>
         </statistic-item>
       </statistic>
       </statistic>
     </el-card>
     </el-card>
@@ -64,10 +64,13 @@ export default {
       let obj = {};
       let obj = {};
       //        "eVipStudentNum",
       //        "eVipStudentNum",
       let arr = [
       let arr = [
+        "totalStudentNum",
+        "waitActivateVipStudentNum",
+        "effectiveVipStudentNum",
         "vipStudentNum",
         "vipStudentNum",
         "cloudStudyLivelyStudentNum",
         "cloudStudyLivelyStudentNum",
-        "newCloudStudyStudentNum",
-        "cloudStudyTodayUseStudentNum",
+        // "newCloudStudyStudentNum",
+        // "cloudStudyTodayUseStudentNum",
         "cloudStudyUseStudentNum",
         "cloudStudyUseStudentNum",
       ];
       ];
       arr.forEach((str) => {
       arr.forEach((str) => {

+ 9 - 6
src/views/main/cloudDate/index.vue

@@ -1,9 +1,10 @@
 <template>
 <template>
   <div>
   <div>
-    <allDate v-permission="'studentManage/getCloudStudyStudentOverView'" class="marginBottom20" />
-    <organDate  v-permission="'studentManage/organStudentOverView'"  class="marginBottom20"/>
+    <!-- <allDate v-permission="'studentManage/getCloudStudyStudentOverView'" class="marginBottom20" /> -->
+    <organMemberList v-permission="'studentManage/getCloudStudyStudentOverView'"/>
+    <!-- <organDate  v-permission="'studentManage/organStudentOverView'"  class="marginBottom20"/>
     <activeUserNum  v-permission="'newIndex/clound'"  class="marginBottom20" />
     <activeUserNum  v-permission="'newIndex/clound'"  class="marginBottom20" />
-    <organRanking  v-permission="'organStudentOverView'" />
+    <organRanking  v-permission="'organStudentOverView'" /> -->
   </div>
   </div>
 </template>
 </template>
 <script>
 <script>
@@ -11,12 +12,14 @@ import allDate from './allDate.vue'
 import organDate from './organDate.vue'
 import organDate from './organDate.vue'
 import activeUserNum from './activeUserNum.vue'
 import activeUserNum from './activeUserNum.vue'
 import organRanking from './organRanking.vue'
 import organRanking from './organRanking.vue'
+import organMemberList from './organMemberList.vue'
 export default {
 export default {
   components:{
   components:{
     allDate,
     allDate,
-    organDate,
-    activeUserNum,
-    organRanking
+    organMemberList,
+    // organDate,
+    // activeUserNum,
+    // organRanking
   },
   },
   data(){
   data(){
     return{
     return{

+ 2 - 2
src/views/main/cloudDate/modals/headers.vue

@@ -8,7 +8,7 @@
       <div class="right">
       <div class="right">
         <el-select
         <el-select
           v-if="!hidenOrgan"
           v-if="!hidenOrgan"
-          
+
           class="multiple"
           class="multiple"
           v-model.trim="organId"
           v-model.trim="organId"
           filterable
           filterable
@@ -39,7 +39,7 @@ export default {
   },
   },
   async mounted() {
   async mounted() {
     await this.$store.dispatch("setBranchs");
     await this.$store.dispatch("setBranchs");
-    const arr = [36,39,41,42,43,44,45,46,47,48,49,50,52,54,55,56]
+      const arr = [36,39,41,42,43,44,45,46,47,48,49,50,52,54,56]
     this.specialList = this.selects.branchs.filter((item) => {
     this.specialList = this.selects.branchs.filter((item) => {
       return arr.indexOf(item.id) == -1;
       return arr.indexOf(item.id) == -1;
     });
     });

+ 353 - 0
src/views/main/cloudDate/organMemberList.vue

@@ -0,0 +1,353 @@
+<template>
+  <div>
+    <el-card style="margin-bottom: 20px">
+      <headers title="数据总览"  @changeOrgan="changeOrgan" :special="true"/>
+      <div
+        class="wall"
+        style="height: 68px"
+        v-if="JSON.stringify(items) == '{}'"
+      >
+        暂无数据
+      </div>
+      <!--
+          -->
+      <statistic :col="4" class="statistic" :cols="0">
+        <statistic-item
+          v-for="(item, key) in items"
+          :key="key"
+          @click="active = key"
+          :class="{ active: active === key }"
+        >
+          <span>
+            {{ item.title + "(人)" }}
+            <el-tooltip
+              v-if="item.desc"
+              :content="item.desc"
+              :open-delay="0.3"
+              placement="top"
+            >
+              <i
+                style="margin-left: 5px; cursor: pointer"
+                class="el-icon-warning-outline"
+              />
+            </el-tooltip>
+          </span>
+
+          <span> <count-to :endVal="item.percent || 0" /> </span>
+        </statistic-item>
+      </statistic>
+    </el-card>
+
+    <el-card>
+      <headers title="分部数据"  :hidenOrgan="true"/>
+      <div class="tableWrap">
+        <el-table
+          style="width: 100%"
+          :header-cell-style="{ background: '#EDEEF0', color: '#444' }"
+          :data="tableList"
+          @sort-change="sortChang"
+          :default-sort="{
+            prop: 'cloudStudyUseStudentDuty',
+            order: 'descending',
+          }"
+          sortable="custom"
+        >
+          <el-table-column
+            align="center"
+            prop="organId"
+            label="分部编号"
+          ></el-table-column>
+          <el-table-column
+            align="center"
+            prop="organName"
+            label="分部名称"
+          ></el-table-column>
+          <el-table-column
+            align="center"
+            prop="totalStudentNum"
+            label="学员总数"
+          >
+            <!-- <template slot="header" slot-scope="slot">
+              <div class="titleCell">
+                <span>学员总数</span>
+                <el-tooltip placement="top" popper-class="mTooltip">
+                  <div slot="content">
+                    乐团在读学员+有剩余VIP课或网管课学员去重之和
+                  </div>
+                  <i
+                    class="el-icon-question micon el-tooltip"
+                    style="
+                      font-size: 18px;
+                      color: #f56c6c;
+                      top: 2px;
+                      position: relative;
+                    "
+                  ></i>
+                </el-tooltip>
+              </div>
+            </template> -->
+          </el-table-column>
+          <el-table-column
+            align="center"
+            prop="effectiveStudentNum"
+            label="有效学员数"
+          >
+          </el-table-column>
+          <el-table-column
+            align="center"
+            prop="vipStudentNum"
+            label="会员总人数"
+          >
+          </el-table-column>
+
+          <el-table-column
+            align="center"
+            prop="activeStudentNum"
+            label="活跃会员"
+          >
+            <template slot="header" slot-scope="slot">
+              <div class="titleCell">
+                <span>活跃学员人数</span>
+                <el-tooltip placement="top" popper-class="mTooltip">
+                  <div slot="content">
+                    过去四周内有三周及以上每周训练时长超过60分钟为活跃学员
+                  </div>
+                  <i
+                    class="el-icon-question micon el-tooltip"
+                    style="
+                      font-size: 18px;
+                      color: #f56c6c;
+                      top: 2px;
+                      position: relative;
+                    "
+                  ></i>
+                </el-tooltip>
+              </div>
+            </template>
+          </el-table-column>
+          <el-table-column
+            align="center"
+            prop="effectiveVipStudentNum"
+            label="生效中会员人数"
+          ></el-table-column>
+          <el-table-column
+            align="center"
+            prop="waitActivateVipStudentNum"
+            label="待激活会员人数"
+          ></el-table-column>
+
+          <el-table-column
+            align="center"
+            prop="vipStudentRate"
+            label="会员人数占比"
+          >
+          <template slot="header" slot-scope="slot">
+              <div class="titleCell">
+                <span>会员人数占比</span>
+                <el-tooltip placement="top" popper-class="mTooltip">
+                  <div slot="content">
+                    会员总人数/有效学员数
+                  </div>
+                  <i
+                    class="el-icon-question micon el-tooltip"
+                    style="
+                      font-size: 18px;
+                      color: #f56c6c;
+                      top: 2px;
+                      position: relative;
+                    "
+                  ></i>
+                </el-tooltip>
+              </div>
+            </template>
+            <template slot-scope="scope">
+              <div>
+                {{ numeral(scope.row.vipStudentRate || 0).format("0.00") }}%
+              </div>
+            </template>
+          </el-table-column>
+          <!-- <el-table-column
+            align="center"
+            prop="totalStudentNum"
+            label="今日使用人数"
+          ></el-table-column> -->
+        </el-table>
+        <!-- <pagination
+          :autoScroll="false"
+          :total.sync="rules.total"
+          :page.sync="rules.page"
+          :limit.sync="rules.limit"
+          :page-sizes="rules.page_size"
+          @pagination="getList"
+        /> -->
+      </div>
+    </el-card>
+  </div>
+</template>
+<script>
+import pagination from "@/components/Pagination/index";
+import { getOrganMemberList } from "../api";
+import { Export } from "@/utils/downLoadFile";
+import headers from "./modals/headers.vue";
+import countTo from "vue-count-to";
+import { descs, titles } from "../constant";
+import { getCloudStudyStudentOverView } from "../api";
+import numeral from "numeral";
+import qs from "qs";
+export default {
+  props: ["data"],
+  components: {
+    headers,
+    pagination,
+    countTo,
+  },
+  data() {
+    return {
+      tableList: [],
+      organId: "",
+      rules: {
+        // 分页规则
+        limit: 10, // 限制显示条数
+        page: 1, // 当前页
+        total: 0, // 总条数
+        page_size: [10, 20, 40, 50], // 选择限制显示条数
+      },
+      searchList: {
+        cloudStudyUseStudentDuty: "DESC",
+      },
+      tenantId: "",
+      dataList: {},
+      active: "",
+    };
+  },
+  mounted() {
+    this.tenantId = this.$helpers.tenantId;
+    this.getList();
+  },
+  methods: {
+    async getList() {
+      /**
+       * try {
+      const res = await getCloudStudyStudentOverView();
+      this.dataList = res.data;
+    } catch (e) {
+      console.log(e);
+    }
+       */
+      try {
+        const arr = [
+          36, 39, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 52, 54, 56,
+        ];
+        const res = await getCloudStudyStudentOverView({
+          page: 1,
+          rows: 10,
+          ...this.searchList,
+          organIds: this.organId,
+        });
+        this.tableList = [];
+        //  res.data.forEach(ele => {
+        //    if(arr.indexOf (ele.organId) == -1){
+        //      this.tableList.push(ele)
+        //    }
+        //  });
+        this.tableList = res.data.list;
+        // this.rules.total = res.data.list?.total;
+        this.dataList = res.data?.overView || {};
+        // console.log(this.tableList)
+      } catch (e) {
+        console.log(e);
+      }
+    },
+    sortChang(val) {
+      const dates = {
+        ascending: "ASC",
+        descending: "DESC",
+      };
+      this.searchList = {};
+      if (val.prop && val.order) {
+        this.searchList[val.prop] = dates[val.order];
+      }
+      this.rules.page = 1;
+      this.getList();
+    },
+    gotoDetail(row) {
+      // 跳转到分部数据详情 row.organId
+      this.$router.push({
+        name: "organDateDetail",
+        params: { organId: row.organId },
+      });
+    },
+    changeOrgan(val) {
+      this.organId = val;
+      this.rules.page = 1;
+      this.getList();
+    },
+    organDateExport() {
+      let params = { ...this.searchList, organIds: this.organId };
+      Export(
+        this,
+        {
+          url: "/api-web/export/organStudentOverView",
+          fileName: "分部团练宝数据.xls",
+          method: "post",
+          params: qs.stringify(params),
+        },
+        "您确定导出分部团练宝数据列表?"
+      );
+    },
+
+    gotoAll() {
+      this.$router.push({
+        name: "organRankDetail",
+      });
+    },
+    numeral(val) {
+      return numeral(val);
+    },
+  },
+  computed: {
+    items() {
+      let obj = {};
+      //        "eVipStudentNum",
+      let arr = [
+        "totalStudentNum",
+        "effectiveStudentNum",
+        "vipStudentNum",
+        "cloudStudyLivelyStudentNum",
+        "effectiveVipStudentNum",
+        "waitActivateVipStudentNum",
+        // "newCloudStudyStudentNum",
+        // "vipStudentRate",
+        "cloudStudyUseStudentNum",
+        "cloudStudyTodayUseStudentNum",
+      ];
+      arr.forEach((str) => {
+        if (this.dataList[str] + "") {
+          obj[str] = {
+            title: titles[str],
+            percent: this.dataList[str],
+            desc: descs[str],
+          };
+        }
+      });
+      return obj;
+    },
+  },
+};
+</script>
+<style lang="scss" scoped>
+/deep/.el-card__body {
+  padding-top: 0 !important;
+}
+.titleCell {
+  display: inline-block;
+}
+.tableWrap {
+  margin-top: 20px;
+}
+.btnList {
+  display: flex;
+  flex-direction: row;
+  justify-content: space-between;
+}
+</style>

+ 16 - 6
src/views/main/constant.js

@@ -56,20 +56,30 @@ export const descs = {
   OTHER_AMOUNT: "其他收入金额总和",
   OTHER_AMOUNT: "其他收入金额总和",
   RENEW_AMOUNT: "乐团续费、临时加课、合班缴费金额总和",
   RENEW_AMOUNT: "乐团续费、临时加课、合班缴费金额总和",
   VIP_AMOUNT: "VIP课购买、续费、复学、课程组新增学员收入金额总和",
   VIP_AMOUNT: "VIP课购买、续费、复学、课程组新增学员收入金额总和",
-  "vipStudentNum":'会员生效中或待生效总人数',
+  "vipStudentNum":'待激活及生效中的会员人数(去重)',
   "eVipStudentNum":'如果是试用会员又是付费会员,则不算试用会员数',
   "eVipStudentNum":'如果是试用会员又是付费会员,则不算试用会员数',
-  "cloudStudyLivelyStudentNum":'近15天内使用达到5天及以上的用户总数',
+  "cloudStudyLivelyStudentNum":'过去四周内有三周及以上每周训练时长超过60分钟为活跃学员',
   "newCloudStudyStudentNum":'第一次使用团练宝的人数',
   "newCloudStudyStudentNum":'第一次使用团练宝的人数',
-  "cloudStudyTodayUseStudentNum":'今日使用的总人数',
-  "cloudStudyUseStudentNum":'累计使用的总人数',
+  // "cloudStudyTodayUseStudentNum":'今日使用的总人数',
+  // "cloudStudyUseStudentNum":'累计使用的总人数',
+  "totalStudentNum":"分部注册学员总人数",
+  // "waitActivateVipStudentNum":'待激活会员人数',
+  // "effectiveVipStudentNum":"生效中会员人数",
+  "vipStudentRate":"会员总人数/有效学员数",
+  "effectiveStudentNum":"(进行中乐团在读学员+有剩余课时的学员+有排课次数的学员)去重"
 }
 }
 export const titles = {
 export const titles = {
-  "vipStudentNum":'付费会员人数',
+  "waitActivateVipStudentNum":'待激活会员人数',
+  "effectiveVipStudentNum":"生效中会员人数",
+  "vipStudentNum":'会员总人数',
   "eVipStudentNum":'试用会员人数',
   "eVipStudentNum":'试用会员人数',
-  "cloudStudyLivelyStudentNum":'活跃用户 ',
+  "totalStudentNum":"学员总数",
+  "cloudStudyLivelyStudentNum":'活跃学员人数 ',
   "newCloudStudyStudentNum":'今日新增使用人数',
   "newCloudStudyStudentNum":'今日新增使用人数',
   "cloudStudyTodayUseStudentNum":'今日使用人数',
   "cloudStudyTodayUseStudentNum":'今日使用人数',
   "cloudStudyUseStudentNum":'累计使用人数',
   "cloudStudyUseStudentNum":'累计使用人数',
+  "effectiveStudentNum":'有效学员数',
+  "vipStudentRate":'会员人数占比'
 }
 }
 
 
 
 

+ 11 - 2
src/views/organManager/components/organInfo.vue

@@ -403,6 +403,14 @@
           placeholder="请输入机构客服电话"
           placeholder="请输入机构客服电话"
         ></el-input>
         ></el-input>
       </el-form-item>
       </el-form-item>
+      <el-form-item label="推荐人" prop="recommender" v-if="tenantInfo != 'SETTING'">
+        <remote-search
+          :disabled="isDisabled"
+          :commit="'setTenantUser'"
+          aria-placeholder="请选择推荐人"
+          v-model="form.recommender"
+        />
+      </el-form-item>
     </el-form>
     </el-form>
   </div>
   </div>
 </template>
 </template>
@@ -465,6 +473,7 @@ export default {
         themeColor: "#00A79D",
         themeColor: "#00A79D",
         corporateChops: null,
         corporateChops: null,
         corporateFinanceChops: null,
         corporateFinanceChops: null,
+        recommender:null,
       },
       },
       originPhone: null, // 是否已存在手机号
       originPhone: null, // 是否已存在手机号
       errorPhone: null, // 手机号存在错误信息
       errorPhone: null, // 手机号存在错误信息
@@ -520,8 +529,8 @@ export default {
     }
     }
 
 
     this.$refs.form.clearValidate();
     this.$refs.form.clearValidate();
-    console.log(this.data,'data')
-    if (this.data.id&& this.$route.query.type == "create") { 
+    console.log(this.data, "data");
+    if (this.data.id && this.$route.query.type == "create") {
       this.checkPhone();
       this.checkPhone();
       //  验证表单 看看是否有异常
       //  验证表单 看看是否有异常
       this.onSubmit();
       this.onSubmit();

+ 1068 - 1067
src/views/sporadicManager/sporadicList.vue

@@ -1,1067 +1,1068 @@
-<template>
-  <div class="m-container">
-    <h2>
-      <div class="squrt"></div>
-      零星管理
-    </h2>
-    <div class="m-core">
-      <!-- v-permission="'sporadicChargeInfo/add'" -->
-      <save-form
-        :inline="true"
-        :model="searchForm"
-        @submit="search"
-        @reset="onReSet"
-      >
-        <el-form-item>
-          <el-input
-            placeholder="标题或学生姓名"
-            clearable
-            v-model.trim="searchForm.search"
-          ></el-input>
-        </el-form-item>
-        <el-form-item>
-          <el-select
-            v-model.trim="searchForm.organId"
-            placeholder="请选择分部"
-            clearable
-            filterable
-          >
-            <el-option
-              v-for="(item, index) in selects.branchs"
-              :key="index"
-              :value="item.id"
-              :label="item.name"
-            ></el-option>
-          </el-select>
-        </el-form-item>
-        <el-form-item>
-          <el-select
-            v-model.trim="searchForm.chargeType"
-            placeholder="请选择收费类型"
-            clearable
-          >
-            <el-option
-              v-for="item in orderType"
-              :key="item.value"
-              :label="item.label"
-              :value="item.value"
-            ></el-option>
-          </el-select>
-        </el-form-item>
-        <el-form-item>
-          <el-select
-            v-model.trim="searchForm.openFlag"
-            placeholder="收费状态"
-            clearable
-          >
-            <el-option label="关闭" value="1"></el-option>
-            <el-option label="开启" value="0"></el-option>
-          </el-select>
-        </el-form-item>
-        <el-form-item>
-          <el-select
-            v-model.trim="searchForm.type"
-            placeholder="请选择订单类型"
-            clearable
-          >
-            <el-option label="个人" value="personal"></el-option>
-            <el-option label="公用" value="common"></el-option>
-          </el-select>
-        </el-form-item>
-        <el-form-item>
-          <el-button type="danger" native-type="submit">搜索</el-button>
-          <el-button native-type="reset" type="primary">重置</el-button>
-          <el-button
-            @click="exportSporad"
-            v-permission="'export/sporadicChargeInfo'"
-            >导出</el-button
-          >
-        </el-form-item>
-      </save-form>
-      <el-button
-        v-permission="'sporadicChargeInfo/add'"
-        @click="newVisible"
-        type="primary"
-        style="margin-bottom: 20px"
-      >
-        新增公用收费
-      </el-button>
-      <el-button
-        v-permission="'sporadicChargeInfo/add'"
-        @click="newVisible1"
-        type="primary"
-        style="margin-bottom: 20px"
-      >
-        新增个人收费
-      </el-button>
-      <div class="tableWrap">
-        <el-table
-          :data="tableList"
-          :header-cell-style="{ background: '#EDEEF0', color: '#444' }"
-        >
-          <el-table-column align="center" label="分部" prop="organName">
-            <template slot-scope="scope">
-              <div>
-                <copy-text>{{ scope.row.organName }}</copy-text>
-              </div>
-            </template>
-          </el-table-column>
-          <el-table-column align="center" label="收费类型">
-            <template slot-scope="scope">
-              <div>
-                {{ scope.row.chargeType | chargeTypeFilter }}
-              </div>
-            </template>
-          </el-table-column>
-          <el-table-column align="center" label="标题" prop="title">
-            <template slot-scope="scope">
-              <div>
-                <copy-text>{{ scope.row.title }}</copy-text>
-              </div>
-            </template>
-          </el-table-column>
-          <el-table-column align="center" label="学生姓名" prop="userName">
-            <template slot-scope="scope">
-              <copy-text>{{ scope.row.userName }}</copy-text>
-            </template>
-          </el-table-column>
-          <el-table-column align="center" label="收费状态">
-            <template slot-scope="scope">
-              <div>
-                {{ scope.row.openFlag ? "关闭" : "开启" }}
-              </div>
-            </template>
-          </el-table-column>
-          <el-table-column align="center" label="金额" prop="amount">
-            <template slot-scope="scope">
-              <div>
-                {{ scope.row.amount | moneyFormat }}
-              </div>
-            </template>
-          </el-table-column>
-          <el-table-column align="center" label="时间">
-            <template slot-scope="scope">
-              <div>
-                {{ scope.row.createTime | formatTimer }}
-              </div>
-            </template>
-          </el-table-column>
-
-          <el-table-column align="center" label="订单类型">
-            <template slot-scope="scope">
-              {{ scope.row.userId ? "个人" : "公用" }}
-            </template>
-          </el-table-column>
-          <el-table-column align="center" label="创建人" prop="operatorName">
-          </el-table-column>
-          <el-table-column align="center" label="操作">
-            <template slot-scope="scope">
-              <div>
-                <el-button
-                  type="text"
-                  v-if="scope.row.chargeType == 12"
-                  key="update"
-                  v-permission="'sporadicChargeInfo/update'"
-                  @click="lookVisible(scope.row)"
-                  >修改</el-button
-                >
-                <el-button
-                  type="text"
-                  v-else
-                  key="update"
-                  v-permission="'sporadicChargeInfo/look'"
-                  @click="lookVisible(scope.row)"
-                  >查看</el-button
-                >
-
-                <el-button
-                  type="text"
-                  v-permission="'sporadicChargeInfo/delete'"
-                  @click="removeItem(scope.row)"
-                  >删除</el-button
-                >
-                <el-button
-                  type="text"
-                  v-if="scope.row.openFlag"
-                  v-permission="'sporadicChargeInfo/updateOpenFlag'"
-                  @click="setSporadic(scope.row)"
-                  >开启</el-button
-                >
-                <el-button
-                  type="text"
-                  v-else
-                  v-permission="'sporadicChargeInfo/updateOpenFlag'"
-                  @click="setSporadic(scope.row)"
-                  >关闭</el-button
-                >
-              </div>
-            </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>
-    <el-dialog
-      :title="title"
-      :visible.sync="zeroVisible"
-      @close="onFormClose('maskForm')"
-      width="650px"
-    >
-      <el-form
-        :model="maskForm"
-        :rules="maskRules"
-        label-width="110px"
-        label-position="right"
-        :inline="true"
-        ref="maskForm"
-      >
-        <el-form-item label="标题" prop="title">
-          <el-input
-            v-model.trim="maskForm.title"
-            maxlength="50"
-            :disabled="!isNew"
-          ></el-input>
-        </el-form-item>
-        <el-form-item label="收费类型" prop="type">
-          <el-select
-            v-model.trim="maskForm.type"
-            :disabled="!isNew"
-            clearable
-            filterable
-            style="width: 180px !important"
-          >
-            <el-option
-              v-for="item in isNew ? orderType1 : orderType"
-              :key="item.value"
-              :label="item.label"
-              :value="item.value"
-            ></el-option>
-          </el-select>
-        </el-form-item>
-        <el-form-item label="金额" prop="money">
-          <el-input
-            v-model.trim="maskForm.money"
-            type="number"
-            @mousewheel.native.prevent
-            :disabled="!isNew"
-          ></el-input>
-        </el-form-item>
-        <el-form-item
-          label="是否开启限制"
-          prop="openMaxTerm"
-          :rules="[
-            {
-              required: true,
-              message: '请选择是否开启目标金额',
-              trigger: 'change',
-            },
-          ]"
-          v-if="maskForm.type == 12"
-        >
-          <el-select v-model.trim="maskForm.openMaxTerm" clearable>
-            <el-option :value="1" label="是"></el-option>
-            <el-option :value="0" label="否"></el-option>
-          </el-select>
-        </el-form-item>
-        <el-form-item
-          label="目标金额"
-          prop="maxAmount"
-          :rules="[{ required: true, validator: validMaxNum, trigger: 'blur' }]"
-          v-if="maskForm.type == 12"
-        >
-          <el-input
-            v-model.trim="maskForm.maxAmount"
-            type="number"
-            @mousewheel.native.prevent
-          ></el-input>
-        </el-form-item>
-        <el-form-item label="减免金额" v-if="maskForm.type == 6" prop="money">
-          <el-input
-            v-model.trim="maskForm.subMoney"
-            type="number"
-            @mousewheel.native.prevent
-            :disabled="!isNew"
-          ></el-input>
-        </el-form-item>
-        <el-form-item label="分部" prop="organId">
-          <el-select
-            v-model.trim="maskForm.organId"
-            :disabled="!isNew"
-            clearable
-            @change="onMusicGroupChange"
-            filterable
-            style="width: 180px !important"
-          >
-            <el-option
-              v-for="(item, index) in selects.branchs"
-              :key="index"
-              :value="item.id"
-              :label="item.name"
-            ></el-option>
-          </el-select>
-        </el-form-item>
-        <el-form-item
-          label="所属乐团"
-          v-if="maskForm.type != 12"
-          prop="musicGroupId"
-        >
-          <el-select
-            v-model.trim="maskForm.musicGroupId"
-            :disabled="!isNew || !maskForm.organId"
-            clearable
-            filterable
-            style="width: 180px !important"
-          >
-            <el-option
-              v-for="item in maskMusicList"
-              :key="item.musicGroupId"
-              :value="item.musicGroupId"
-              :label="item.musicGroupName"
-            ></el-option>
-          </el-select>
-        </el-form-item>
-        <el-form-item label="查看链接" v-if="!isNew">
-          <el-input
-            style="width: 400px !important"
-            :disabled="!isNew"
-            v-model.trim="maskForm.code"
-          ></el-input>
-          <el-button type="danger" @click="qrcodeStatus = true"
-            >二维码</el-button
-          >
-        </el-form-item>
-        <el-form-item label="收费详情" prop="desc">
-          <el-input
-            type="textarea"
-            :disabled="!isNew"
-            v-model.trim="maskForm.desc"
-            style="width: 490px"
-            maxlength="300"
-            :autosize="{ minRows: 5 }"
-          ></el-input>
-        </el-form-item>
-      </el-form>
-      <span slot="footer" class="dialog-footer">
-        <el-button @click="zeroVisible = false">取 消</el-button>
-        <el-button type="primary" v-if="isNew" @click="addZero"
-          >确 定</el-button
-        >
-        <el-button v-if="!isNew" type="primary" @click="updateZero"
-          >确定</el-button
-        >
-      </span>
-    </el-dialog>
-
-    <el-dialog
-      :title="title1"
-      :visible.sync="zeroVisible1"
-      @close="onFormClose('maskForm1')"
-      width="650px"
-    >
-      <el-form
-        :model="maskForm1"
-        :rules="maskRules1"
-        label-width="100px"
-        label-position="right"
-        :inline="true"
-        ref="maskForm1"
-      >
-        <el-form-item label="标题" prop="title">
-          <el-input
-            v-model.trim="maskForm1.title"
-            maxlength="50"
-            :disabled="!isNew1"
-          ></el-input>
-        </el-form-item>
-        <el-form-item label="收费类型" prop="type">
-          <el-select
-            v-model.trim="maskForm1.type"
-            :disabled="!isNew1"
-            clearable
-            filterable
-            style="width: 180px !important"
-          >
-            <template v-for="item in isNew1 ? orderType1 : orderType">
-              <el-option
-                v-if="item.value != 12"
-                :key="item.value"
-                :label="item.label"
-                :value="item.value"
-              ></el-option>
-            </template>
-          </el-select>
-        </el-form-item>
-        <el-form-item label="学员编号" prop="studentId">
-          <el-input
-            v-model.trim="maskForm1.studentId"
-            @blur="onStudentChange"
-            type="number"
-            maxlength="10"
-            @mousewheel.native.prevent
-            :disabled="!isNew1"
-          ></el-input>
-        </el-form-item>
-        <el-form-item label="金额" prop="money">
-          <el-input
-            v-model.trim="maskForm1.money"
-            type="number"
-            @mousewheel.native.prevent
-            :disabled="!isNew1"
-          ></el-input>
-        </el-form-item>
-        <el-form-item label="学员姓名" prop="studentName">
-          <el-input
-            v-model.trim="maskForm1.studentName"
-            :disabled="true"
-          ></el-input>
-        </el-form-item>
-        <el-form-item label="所属乐团" prop="musicGroupId">
-          <el-select
-            v-model.trim="maskForm1.musicGroupId"
-            :disabled="!isNew1"
-            clearable
-            filterable
-            style="width: 180px !important"
-          >
-            <el-option
-              v-for="(item, index) in maskMusicList1"
-              :key="index"
-              :value="item.musicGroupId"
-              :label="item.musicGroupName"
-            ></el-option>
-          </el-select>
-        </el-form-item>
-        <el-form-item label="查看链接" v-if="!isNew1">
-          <el-input
-            style="width: 400px !important"
-            :disabled="!isNew1"
-            v-model.trim="maskForm1.code"
-          ></el-input>
-          <el-button type="danger" @click="qrcodeStatus = true"
-            >二维码</el-button
-          >
-        </el-form-item>
-        <el-form-item label="收费详情" prop="desc">
-          <el-input
-            type="textarea"
-            :disabled="!isNew1"
-            v-model.trim="maskForm1.desc"
-            style="width: 490px"
-            maxlength="300"
-            :autosize="{ minRows: 5 }"
-          ></el-input>
-        </el-form-item>
-      </el-form>
-      <span slot="footer" class="dialog-footer">
-        <el-button @click="zeroVisible1 = false">取 消</el-button>
-        <el-button type="primary" v-if="isNew1" @click="addZero1"
-          >确 定</el-button
-        >
-        <el-button v-if="!isNew1" type="primary" @click="zeroVisible1 = false"
-          >确定</el-button
-        >
-      </span>
-    </el-dialog>
-    <el-dialog
-      :visible.sync="qrcodeStatus"
-      center
-      width="300px"
-      title="缴费链接"
-    >
-      <div class="right-code">
-        <!-- <h2 class="title">缴费链接</h2> -->
-        <vue-qr :text="qrCodeUrl" style="width: 100%" :margin="0"></vue-qr>
-
-        <!-- <div id="qrcode"
-             class="qrcode code"
-             ref="qrCodeUrl"></div> -->
-        <!-- <p class="code-url"
-           v-if="codeUrl2">{{ codeUrl2 }}</p> -->
-      </div>
-    </el-dialog>
-  </div>
-</template>
-<script>
-import { getAgreement } from "@/api/buildTeam";
-import pagination from "@/components/Pagination/index";
-import { vaildStudentUrl } from "@/utils/validate";
-import cleanDeep from "clean-deep";
-import {
-  addZero,
-  getZero,
-  updateZero,
-  removeZero,
-  getBasic,
-  updateOpenFlag,
-  queryOrganMusicInfos,
-  queryUserMusicInfos,
-} from "@/api/zeroManager";
-import axios from "axios";
-import qs from "qs";
-import { getToken, getTenantId } from "@/utils/auth";
-import load from "@/utils/loading";
-// import QRCode from 'qrcodejs2'
-import vueQr from "vue-qr";
-let validMaxNum = (rule, value, callback) => {
-  if ((value == "" && typeof value == "string") || value == null) {
-    callback(new Error("请输入缴费金额"));
-  } else if (value < 0) {
-    callback(new Error("输入缴费金额必须大于0"));
-  } else {
-    callback();
-  }
-};
-export default {
-  name: "sporadicList",
-  components: { pagination, vueQr },
-  data() {
-    return {
-      validMaxNum: validMaxNum,
-      zeroVisible: false,
-      qrCodeUrl: null,
-      searchForm: {
-        organId: null,
-        chargeType: null,
-        type: null,
-        search: null,
-        openFlag: null,
-      },
-      tableList: [],
-      organList: [],
-      orderType: [
-        { label: "考级", value: 1 },
-        { label: "声部更改", value: 2 },
-        { label: "乐器更换", value: 3 },
-        { label: "配件销售", value: 4 },
-        { label: "维修费", value: 5 },
-        { label: "福袋活动", value: 6 },
-        { label: "双十一活动", value: 12 },
-        { label: "上门费", value: 7 },
-        { label: "账户充值", value: 9 },
-        // { label: "乐保服务", value: 10 },
-        // { label: "网基课活动", value: 13 },
-        // { label: "团练宝购买", value: 15 },
-        { label: "其它", value: 11 },
-      ],
-      orderType1: [
-        { label: "考级", value: 1 },
-        // { label: "声部更改", value: 2 },
-        // { label: '乐器更换', value: 3 },
-        // { label: '配件销售', value: 4 },
-        // { label: '双十一活动', value: 12 },
-        { label: "上门费", value: 7 },
-        { label: "账户充值", value: 9 },
-        // { label: "乐保服务", value: 10 },
-        // { label: "网基课活动", value: 13 },
-        // { label: "团练宝购买", value: 15 },
-      ],
-      maskForm: {
-        organId: "",
-        type: "",
-        money: "",
-        desc: "",
-        title: "",
-        code: "",
-        musicGroupId: "",
-        maxAmount: null,
-        openMaxTerm: null,
-        subMoney: "",
-      },
-      maskMusicList: [],
-      maskRules: {
-        organId: [{ required: true, message: "请选择分部", trigger: "change" }],
-        // musicGroupId: [{ required: true, message: '请选择所属乐团', trigger: 'change' }],
-        type: [
-          { required: true, message: "请选择收费类型", trigger: "change" },
-        ],
-        money: [
-          { required: true, message: "请输入收费金额", trigger: "change" },
-        ],
-        title: [
-          { required: true, message: "请输入标题名称", trigger: "change" },
-        ],
-        desc: [{ required: true, message: "请输入收费详情" }],
-      },
-      pageInfo: {
-        // 分页规则
-        limit: 10, // 限制显示条数
-        page: 1, // 当前页
-        total: 0, // 总条数
-        page_size: [10, 20, 40, 50], // 选择限制显示条数
-      },
-      isNew: false,
-      title: "新增收费",
-      qrcodeStatus: false,
-      qrcodes: true,
-      activeRow: null,
-      title1: "新增收费",
-      activeRow1: null,
-      zeroVisible1: false,
-      maskForm1: {
-        type: null,
-        money: null,
-        desc: null,
-        title: null,
-        code: null,
-        musicGroupId: null,
-        studentId: null,
-        studentName: null,
-      },
-      isNew1: false,
-      maskMusicList1: [],
-      maskRules1: {
-        organId: [{ required: true, message: "请选择分部", trigger: "change" }],
-        // musicGroupId: [{ required: true, message: '请选择所属乐团', trigger: 'change' }],
-        type: [
-          { required: true, message: "请选择收费类型", trigger: "change" },
-        ],
-        money: [
-          { required: true, message: "请输入收费金额", trigger: "change" },
-        ],
-        title: [
-          { required: true, message: "请输入标题名称", trigger: "change" },
-        ],
-        studentId: [
-          { required: true, message: "请输入学员编号", trigger: "blur" },
-        ],
-        desc: [{ required: true, message: "请输入收费详情" }],
-      },
-    };
-  },
-  mounted() {
-    // getEmployeeOrgan().then(res => {
-    //   if (res.code == 200) {
-    //     this.organList = res.data;
-    //   }
-    // })
-    this.$store.dispatch("setBranchs");
-    this.getList();
-    this.getAgreement ()
-  },
-  methods: {
-    search() {
-      this.pageInfo.page = 1;
-      this.getList();
-    },
-    onReSet() {
-      this.searchForm = {
-        organId: null,
-        chargeType: null,
-        type: null,
-        search: null,
-      };
-      this.search();
-    },
-    getList() {
-      let searchForm = this.searchForm;
-      let params = {
-        organId: searchForm.organId ? searchForm.organId : null,
-        chargeType: searchForm.chargeType ? searchForm.chargeType : null,
-        type: searchForm.type ? searchForm.type : null,
-        search: searchForm.search ? searchForm.search : null,
-        openFlag: searchForm.openFlag ? searchForm.openFlag * 1 : null,
-        page: this.pageInfo.page,
-        rows: this.pageInfo.limit,
-      };
-
-      getZero(params).then((res) => {
-        if (res.code == 200) {
-          this.tableList = res.data.rows;
-          this.pageInfo.total = res.data.total;
-        }
-      });
-    },
-    onFormClose(formName) {
-      // 关闭弹窗重置验证
-      if (formName == "maskForm") {
-        this.maskForm = {
-          organId: null,
-          musicGroupId: null,
-          type: null,
-          money: null,
-          maxAmount: null,
-          openMaxTerm: null,
-          desc: null,
-          title: null,
-          code: null,
-        };
-      } else if (formName == "maskForm1") {
-        this.maskForm1 = {
-          type: null,
-          musicGroupId: null,
-          money: null,
-          desc: null,
-          title: null,
-          code: null,
-          studentId: null,
-          studentName: null,
-        };
-      }
-      if (this.$refs[formName]) {
-        this.$refs[formName].resetFields();
-      }
-    },
-    newVisible() {
-      this.isNew = true;
-      this.zeroVisible = true;
-      this.title = "新增公用收费";
-    },
-    newVisible1() {
-      this.isNew1 = true;
-      this.zeroVisible1 = true;
-      this.title1 = "新增个人收费";
-    },
-    async getAgreement() {
-      try {
-        const res = await getAgreement();
-        if (!res.data) {
-          this.$bus.$emit("showguide", ["agreement"]);
-        }
-      } catch (e) {}
-    },
-    lookVisible(row) {
-      let maskForm = null;
-      if (row.userId) {
-        maskForm = this.maskForm1;
-        this.isNew1 = false;
-        this.zeroVisible1 = true;
-        this.title1 = "查看个人收费";
-        let url =
-          vaildStudentUrl() +
-          `/#/sporadicPay?id=${row.id}&userId=${row.userId}`;
-        this.qrCodeUrl = url;
-        maskForm.code = url;
-        maskForm.studentId = row.userId;
-        maskForm.studentName = row.userName;
-      } else {
-        maskForm = this.maskForm;
-        this.isNew = false;
-        this.zeroVisible = true;
-        this.title = "查看公用收费";
-        let url = vaildStudentUrl() + `/#/sporadicLogin?id=${row.id}`;
-        this.qrCodeUrl = url;
-        maskForm.code = url;
-      }
-      maskForm.type = parseInt(row.chargeType);
-      maskForm.id = row.id;
-      maskForm.desc = row.detail;
-      maskForm.title = row.title;
-      maskForm.organId = row.organId;
-      maskForm.money = row.amount;
-      maskForm.subMoney = row.discountAmount;
-      maskForm.maxAmount = row.maxAmount;
-      maskForm.openMaxTerm = row.openMaxTerm;
-      maskForm.musicGroupId = row.musicGroupId ? row.musicGroupId : null;
-      if (row.userId) {
-        queryUserMusicInfos({ userId: row.userId }).then((studentInfo) => {
-          if (studentInfo.code == 200) {
-            this.maskMusicList1 = studentInfo.data;
-          }
-        });
-      } else {
-        this.onMusicGroupChange(true);
-      }
-    },
-    onMusicGroupChange(status) {
-      let maskForm = this.maskForm;
-      if (!maskForm.organId) {
-        return;
-      }
-      if (!status) {
-        maskForm.musicGroupId = null; // 重置可能已经选中的乐团
-      }
-      queryOrganMusicInfos({ organId: maskForm.organId }).then((res) => {
-        if (res.code == 200) {
-          this.maskMusicList = res.data;
-        }
-      });
-    },
-    updateZero() {
-      let maskForm = this.maskForm;
-      if (maskForm.type != 12) {
-        this.zeroVisible = false;
-        return;
-      }
-      this.$refs["maskForm"].validate((item) => {
-        if (item) {
-          updateZero(
-            cleanDeep({
-              id: maskForm.id,
-              maxAmount: maskForm.maxAmount,
-              openMaxTerm: maskForm.openMaxTerm,
-            })
-          ).then((res) => {
-            if (res.code == 200) {
-              this.$message.success("更新成功");
-              this.zeroVisible = false;
-              this.getList();
-            }
-          });
-        }
-      });
-    },
-    addZero() {
-      this.$refs["maskForm"].validate((item) => {
-        if (item) {
-          let maskForm = this.maskForm;
-          let obj = {
-            chargeType: maskForm.type,
-            detail: maskForm.desc,
-            title: maskForm.title,
-            organId: maskForm.organId,
-            amount: maskForm.money,
-            musicGroupId: maskForm.musicGroupId,
-            discountAmount: maskForm.subMoney,
-          };
-
-          if (maskForm.type == 12) {
-            (obj.maxAmount = maskForm.maxAmount),
-              (obj.openMaxTerm = maskForm.openMaxTerm);
-          }
-          addZero(obj).then((res) => {
-            if (res.code == 200) {
-              this.$message.success("新增成功");
-              this.zeroVisible = false;
-              this.getList();
-            }
-          });
-        }
-      });
-    },
-    addZero1() {
-      this.$refs["maskForm1"].validate((item) => {
-        if (item) {
-          let maskForm1 = this.maskForm1;
-          if (!maskForm1.studentName) {
-            this.$message.error("学员信息不存在");
-            return;
-          }
-          let obj = {
-            chargeType: maskForm1.type,
-            detail: maskForm1.desc,
-            title: maskForm1.title,
-            musicGroupId: this.maskForm1.musicGroupId,
-            userId: maskForm1.studentId,
-            amount: maskForm1.money,
-          };
-          addZero(obj).then((res) => {
-            if (res.code == 200) {
-              this.$message.success("新增成功");
-              this.zeroVisible1 = false;
-              this.getList();
-            }
-          });
-        }
-      });
-    },
-    async onStudentChange() {
-      let studentId = this.maskForm1.studentId;
-      // 判断学生编号是否存在
-      if (!studentId) {
-        return;
-      }
-
-      if (studentId.length > 10) {
-        this.$message.error("学员编号不合法");
-        return;
-      }
-
-      await getBasic({ userId: studentId }).then((res) => {
-        if (res.code == 200) {
-          if (res.data) {
-            this.maskForm1.studentName = res.data.name;
-            queryUserMusicInfos({ userId: studentId }).then((studentInfo) => {
-              if (studentInfo.code == 200) {
-                this.maskMusicList1 = studentInfo.data;
-              }
-            });
-          } else {
-            this.maskForm1.studentName = null;
-          }
-        }
-      });
-    },
-    removeItem(row) {
-      this.$confirm("是否删除该收费", "提示", {
-        confirmButtonText: "确定",
-        cancelButtonText: "取消",
-        type: "warning",
-      })
-        .then(() => {
-          removeZero({ id: row.id }).then((res) => {
-            if (res.code == 200) {
-              this.$message.success("删除成功");
-              this.zeroVisible = false;
-              this.getList();
-            }
-          });
-        })
-        .catch(() => {});
-    },
-    setSporadic(row) {
-      // openFlag
-      let str = "";
-      let openFlag = "";
-      if (row.openFlag) {
-        // 关闭=>开启 1是关闭
-        openFlag = 0;
-        str = "开启";
-      } else {
-        // 开启=>关闭 0是开启
-        openFlag = 1;
-        str = "关闭";
-      }
-
-      this.$confirm(`是否${str}该收费`, "提示", {
-        confirmButtonText: "确定",
-        cancelButtonText: "取消",
-        type: "warning",
-      })
-        .then(() => {
-          updateOpenFlag({ sporadicId: row.id, openFlag }).then((res) => {
-            if (res.code == 200) {
-              this.$message.success(`${str}成功`);
-              this.getList();
-            }
-          });
-        })
-        .catch(() => {});
-    },
-    exportSporad() {
-      let url = "/api-web/export/sporadicChargeInfo";
-      let data = this.searchForm;
-      const options = {
-        method: "get",
-        headers: {
-          Authorization: getToken(),
-          tenantId: getTenantId(),
-        },
-        params: data,
-        url,
-        responseType: "blob",
-      };
-      this.$confirm("您确定导出零星缴费列表", "提示", {
-        confirmButtonText: "确定",
-        cancelButtonText: "取消",
-        type: "warning",
-      })
-        .then(() => {
-          load.startLoading();
-          axios(options)
-            .then((res) => {
-              let blob = new Blob([res.data], {
-                // type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=utf-8'
-                type: "application/vnd.ms-excel;charset=utf-8",
-                //word文档为application/msword,pdf文档为application/pdf,application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=utf-8
-              });
-
-              let text = new Response(blob).text();
-              text.then((res) => {
-                // 判断是否报错
-                if (res.indexOf("code") != -1) {
-                  let json = JSON.parse(res);
-                  if (json.code == 403) {
-                    this.$message.error(`登录过期,请重新登录!`);
-                    setTimeout(() => {
-                      this.$store.dispatch("user/resetToken").then(() => {
-                        location.reload();
-                      });
-                    }, 1000);
-                    return;
-                  }
-                  this.$message.error(json.msg);
-                } else {
-                  let objectUrl = URL.createObjectURL(blob);
-                  let link = document.createElement("a");
-                  let nowTime = new Date();
-                  let ymd =
-                    nowTime.getFullYear() +
-                    "" +
-                    (nowTime.getMonth() + 1) +
-                    "" +
-                    nowTime.getDate();
-                  let fname = ymd + "零星缴费.xls"; //下载文件的名字
-                  link.href = objectUrl;
-                  link.setAttribute("download", fname);
-                  document.body.appendChild(link);
-                  link.click();
-                }
-              });
-              load.endLoading();
-            })
-            .catch((error) => {
-              this.$message.error("导出数据失败,请联系管理员");
-              load.endLoading();
-            });
-        })
-        .catch(() => {});
-    },
-  },
-  watch: {
-    zeroVisible(val) {
-      if (!val) {
-        this.maskForm = {
-          organId: "",
-          type: "",
-          money: "",
-          desc: "",
-          title: "",
-          maxAmount: null,
-          openMaxTerm: null,
-          code: "",
-        };
-        // this.$refs['maskForm'].resetFields()
-        // console.log(this.$refs['zeroForm'].resetFields)
-      }
-    },
-  },
-  filters: {
-    chargeTypeFilter(val) {
-      let template = {
-        1: "考级",
-        2: "声部更改",
-        3: "乐器更换",
-        4: "配件销售",
-        5: "维修费",
-        6: "福袋活动",
-        7: "上门费",
-        9: "账户充值",
-        10: "乐保服务",
-        11: "其它",
-        12: "双十一活动",
-        13: "网基课活动",
-        15: "团练宝购买",
-      };
-      return template[val];
-    },
-  },
-};
-</script>
-<style lang="scss" scoped>
-.right-code {
-  // width: 50%;
-  // float: left;
-  .title {
-    font-size: 18px;
-    text-align: center;
-    padding-bottom: 8px;
-  }
-}
-.newBand {
-  display: inline-block;
-}
-
-.el-input {
-  width: 180px !important;
-}
-/deep/.el-select {
-  width: auto !important;
-}
-</style>
+<template>
+  <div class="m-container">
+    <h2>
+      <div class="squrt"></div>
+      零星管理
+    </h2>
+    <div class="m-core">
+      <!-- v-permission="'sporadicChargeInfo/add'" -->
+      <save-form
+        :inline="true"
+        :model="searchForm"
+        @submit="search"
+        @reset="onReSet"
+      >
+        <el-form-item>
+          <el-input
+            placeholder="标题或学生姓名"
+            clearable
+            v-model.trim="searchForm.search"
+          ></el-input>
+        </el-form-item>
+        <el-form-item>
+          <el-select
+            v-model.trim="searchForm.organId"
+            placeholder="请选择分部"
+            clearable
+            filterable
+          >
+            <el-option
+              v-for="(item, index) in selects.branchs"
+              :key="index"
+              :value="item.id"
+              :label="item.name"
+            ></el-option>
+          </el-select>
+        </el-form-item>
+        <el-form-item>
+          <el-select
+            v-model.trim="searchForm.chargeType"
+            placeholder="请选择收费类型"
+            clearable
+          >
+            <el-option
+              v-for="item in orderType"
+              :key="item.value"
+              :label="item.label"
+              :value="item.value"
+            ></el-option>
+          </el-select>
+        </el-form-item>
+        <el-form-item>
+          <el-select
+            v-model.trim="searchForm.openFlag"
+            placeholder="收费状态"
+            clearable
+          >
+            <el-option label="关闭" value="1"></el-option>
+            <el-option label="开启" value="0"></el-option>
+          </el-select>
+        </el-form-item>
+        <el-form-item>
+          <el-select
+            v-model.trim="searchForm.type"
+            placeholder="请选择订单类型"
+            clearable
+          >
+            <el-option label="个人" value="personal"></el-option>
+            <el-option label="公用" value="common"></el-option>
+          </el-select>
+        </el-form-item>
+        <el-form-item>
+          <el-button type="danger" native-type="submit">搜索</el-button>
+          <el-button native-type="reset" type="primary">重置</el-button>
+          <el-button
+            @click="exportSporad"
+            v-permission="'export/sporadicChargeInfo'"
+            >导出</el-button
+          >
+        </el-form-item>
+      </save-form>
+      <el-button
+        v-permission="'sporadicChargeInfo/add'"
+        @click="newVisible"
+        type="primary"
+        style="margin-bottom: 20px"
+      >
+        新增公用收费
+      </el-button>
+      <el-button
+        v-permission="'sporadicChargeInfo/add'"
+        @click="newVisible1"
+        type="primary"
+        style="margin-bottom: 20px"
+      >
+        新增个人收费
+      </el-button>
+      <div class="tableWrap">
+        <el-table
+          :data="tableList"
+          :header-cell-style="{ background: '#EDEEF0', color: '#444' }"
+        >
+          <el-table-column align="center" label="分部" prop="organName">
+            <template slot-scope="scope">
+              <div>
+                <copy-text>{{ scope.row.organName }}</copy-text>
+              </div>
+            </template>
+          </el-table-column>
+          <el-table-column align="center" label="收费类型">
+            <template slot-scope="scope">
+              <div>
+                {{ scope.row.chargeType | chargeTypeFilter }}
+              </div>
+            </template>
+          </el-table-column>
+          <el-table-column align="center" label="标题" prop="title">
+            <template slot-scope="scope">
+              <div>
+                <copy-text>{{ scope.row.title }}</copy-text>
+              </div>
+            </template>
+          </el-table-column>
+          <el-table-column align="center" label="学生姓名" prop="userName">
+            <template slot-scope="scope">
+              <copy-text>{{ scope.row.userName }}</copy-text>
+            </template>
+          </el-table-column>
+          <el-table-column align="center" label="收费状态">
+            <template slot-scope="scope">
+              <div>
+                {{ scope.row.openFlag ? "关闭" : "开启" }}
+              </div>
+            </template>
+          </el-table-column>
+          <el-table-column align="center" label="金额" prop="amount">
+            <template slot-scope="scope">
+              <div>
+                {{ scope.row.amount | moneyFormat }}
+              </div>
+            </template>
+          </el-table-column>
+          <el-table-column align="center" label="时间">
+            <template slot-scope="scope">
+              <div>
+                {{ scope.row.createTime | formatTimer }}
+              </div>
+            </template>
+          </el-table-column>
+
+          <el-table-column align="center" label="订单类型">
+            <template slot-scope="scope">
+              {{ scope.row.userId ? "个人" : "公用" }}
+            </template>
+          </el-table-column>
+          <el-table-column align="center" label="创建人" prop="operatorName">
+          </el-table-column>
+          <el-table-column align="center" label="操作">
+            <template slot-scope="scope">
+              <div>
+                <el-button
+                  type="text"
+                  v-if="scope.row.chargeType == 12"
+                  key="update"
+                  v-permission="'sporadicChargeInfo/update'"
+                  @click="lookVisible(scope.row)"
+                  >修改</el-button
+                >
+                <el-button
+                  type="text"
+                  v-else
+                  key="update"
+                  v-permission="'sporadicChargeInfo/look'"
+                  @click="lookVisible(scope.row)"
+                  >查看</el-button
+                >
+
+                <el-button
+                  type="text"
+                  v-permission="'sporadicChargeInfo/delete'"
+                  @click="removeItem(scope.row)"
+                  >删除</el-button
+                >
+                <el-button
+                  type="text"
+                  v-if="scope.row.openFlag"
+                  v-permission="'sporadicChargeInfo/updateOpenFlag'"
+                  @click="setSporadic(scope.row)"
+                  >开启</el-button
+                >
+                <el-button
+                  type="text"
+                  v-else
+                  v-permission="'sporadicChargeInfo/updateOpenFlag'"
+                  @click="setSporadic(scope.row)"
+                  >关闭</el-button
+                >
+              </div>
+            </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>
+    <el-dialog
+      :title="title"
+      :visible.sync="zeroVisible"
+      @close="onFormClose('maskForm')"
+      width="650px"
+    >
+      <el-form
+        :model="maskForm"
+        :rules="maskRules"
+        label-width="110px"
+        label-position="right"
+        :inline="true"
+        ref="maskForm"
+      >
+        <el-form-item label="标题" prop="title">
+          <el-input
+            v-model.trim="maskForm.title"
+            maxlength="50"
+            :disabled="!isNew"
+          ></el-input>
+        </el-form-item>
+        <el-form-item label="收费类型" prop="type">
+          <el-select
+            v-model.trim="maskForm.type"
+            :disabled="!isNew"
+            clearable
+            filterable
+            style="width: 180px !important"
+          >
+            <el-option
+              v-for="item in isNew ? orderType1 : orderType"
+              :key="item.value"
+              :label="item.label"
+              :value="item.value"
+            ></el-option>
+          </el-select>
+        </el-form-item>
+        <el-form-item label="金额" prop="money">
+          <el-input
+            v-model.trim="maskForm.money"
+            type="number"
+            @mousewheel.native.prevent
+            :disabled="!isNew"
+          ></el-input>
+        </el-form-item>
+        <el-form-item
+          label="是否开启限制"
+          prop="openMaxTerm"
+          :rules="[
+            {
+              required: true,
+              message: '请选择是否开启目标金额',
+              trigger: 'change',
+            },
+          ]"
+          v-if="maskForm.type == 12"
+        >
+          <el-select v-model.trim="maskForm.openMaxTerm" clearable>
+            <el-option :value="1" label="是"></el-option>
+            <el-option :value="0" label="否"></el-option>
+          </el-select>
+        </el-form-item>
+        <el-form-item
+          label="目标金额"
+          prop="maxAmount"
+          :rules="[{ required: true, validator: validMaxNum, trigger: 'blur' }]"
+          v-if="maskForm.type == 12"
+        >
+          <el-input
+            v-model.trim="maskForm.maxAmount"
+            type="number"
+            @mousewheel.native.prevent
+          ></el-input>
+        </el-form-item>
+        <el-form-item label="减免金额" v-if="maskForm.type == 6" prop="money">
+          <el-input
+            v-model.trim="maskForm.subMoney"
+            type="number"
+            @mousewheel.native.prevent
+            :disabled="!isNew"
+          ></el-input>
+        </el-form-item>
+        <el-form-item label="分部" prop="organId">
+          <el-select
+            v-model.trim="maskForm.organId"
+            :disabled="!isNew"
+            clearable
+            @change="onMusicGroupChange"
+            filterable
+            style="width: 180px !important"
+          >
+            <el-option
+              v-for="(item, index) in selects.branchs"
+              :key="index"
+              :value="item.id"
+              :label="item.name"
+            ></el-option>
+          </el-select>
+        </el-form-item>
+        <el-form-item
+          label="所属乐团"
+          v-if="maskForm.type != 12"
+          prop="musicGroupId"
+        >
+          <el-select
+            v-model.trim="maskForm.musicGroupId"
+            :disabled="!isNew || !maskForm.organId"
+            clearable
+            filterable
+            style="width: 180px !important"
+          >
+            <el-option
+              v-for="item in maskMusicList"
+              :key="item.musicGroupId"
+              :value="item.musicGroupId"
+              :label="item.musicGroupName"
+            ></el-option>
+          </el-select>
+        </el-form-item>
+        <el-form-item label="查看链接" v-if="!isNew">
+          <el-input
+            style="width: 400px !important"
+            :disabled="!isNew"
+            v-model.trim="maskForm.code"
+          ></el-input>
+          <el-button type="danger" @click="qrcodeStatus = true"
+            >二维码</el-button
+          >
+        </el-form-item>
+        <el-form-item label="收费详情" prop="desc">
+          <el-input
+            type="textarea"
+            :disabled="!isNew"
+            v-model.trim="maskForm.desc"
+            style="width: 490px"
+            maxlength="300"
+            :autosize="{ minRows: 5 }"
+          ></el-input>
+        </el-form-item>
+      </el-form>
+      <span slot="footer" class="dialog-footer">
+        <el-button @click="zeroVisible = false">取 消</el-button>
+        <el-button type="primary" v-if="isNew" @click="addZero"
+          >确 定</el-button
+        >
+        <el-button v-if="!isNew" type="primary" @click="updateZero"
+          >确定</el-button
+        >
+      </span>
+    </el-dialog>
+
+    <el-dialog
+      :title="title1"
+      :visible.sync="zeroVisible1"
+      @close="onFormClose('maskForm1')"
+      width="650px"
+    >
+      <el-form
+        :model="maskForm1"
+        :rules="maskRules1"
+        label-width="100px"
+        label-position="right"
+        :inline="true"
+        ref="maskForm1"
+      >
+        <el-form-item label="标题" prop="title">
+          <el-input
+            v-model.trim="maskForm1.title"
+            maxlength="50"
+            :disabled="!isNew1"
+          ></el-input>
+        </el-form-item>
+        <el-form-item label="收费类型" prop="type">
+          <el-select
+            v-model.trim="maskForm1.type"
+            :disabled="!isNew1"
+            clearable
+            filterable
+            style="width: 180px !important"
+          >
+            <template v-for="item in isNew1 ? orderType1 : orderType">
+              <el-option
+                v-if="item.value != 12"
+                :key="item.value"
+                :label="item.label"
+                :value="item.value"
+              ></el-option>
+            </template>
+          </el-select>
+        </el-form-item>
+        <el-form-item label="学员编号" prop="studentId">
+          <el-input
+            v-model.trim="maskForm1.studentId"
+            @blur="onStudentChange"
+            type="number"
+            maxlength="10"
+            @mousewheel.native.prevent
+            :disabled="!isNew1"
+          ></el-input>
+        </el-form-item>
+        <el-form-item label="金额" prop="money">
+          <el-input
+            v-model.trim="maskForm1.money"
+            type="number"
+            @mousewheel.native.prevent
+            :disabled="!isNew1"
+          ></el-input>
+        </el-form-item>
+        <el-form-item label="学员姓名" prop="studentName">
+          <el-input
+            v-model.trim="maskForm1.studentName"
+            :disabled="true"
+          ></el-input>
+        </el-form-item>
+        <el-form-item label="所属乐团" prop="musicGroupId">
+          <el-select
+            v-model.trim="maskForm1.musicGroupId"
+            :disabled="!isNew1"
+            clearable
+            filterable
+            style="width: 180px !important"
+          >
+            <el-option
+              v-for="(item, index) in maskMusicList1"
+              :key="index"
+              :value="item.musicGroupId"
+              :label="item.musicGroupName"
+            ></el-option>
+          </el-select>
+        </el-form-item>
+        <el-form-item label="查看链接" v-if="!isNew1">
+          <el-input
+            style="width: 400px !important"
+            :disabled="!isNew1"
+            v-model.trim="maskForm1.code"
+          ></el-input>
+          <el-button type="danger" @click="qrcodeStatus = true"
+            >二维码</el-button
+          >
+        </el-form-item>
+        <el-form-item label="收费详情" prop="desc">
+          <el-input
+            type="textarea"
+            :disabled="!isNew1"
+            v-model.trim="maskForm1.desc"
+            style="width: 490px"
+            maxlength="300"
+            :autosize="{ minRows: 5 }"
+          ></el-input>
+        </el-form-item>
+      </el-form>
+      <span slot="footer" class="dialog-footer">
+        <el-button @click="zeroVisible1 = false">取 消</el-button>
+        <el-button type="primary" v-if="isNew1" @click="addZero1"
+          >确 定</el-button
+        >
+        <el-button v-if="!isNew1" type="primary" @click="zeroVisible1 = false"
+          >确定</el-button
+        >
+      </span>
+    </el-dialog>
+    <el-dialog
+      :visible.sync="qrcodeStatus"
+      center
+      width="300px"
+      title="缴费链接"
+    >
+      <div class="right-code">
+        <!-- <h2 class="title">缴费链接</h2> -->
+        <vue-qr :text="qrCodeUrl" style="width: 100%" :margin="0"></vue-qr>
+
+        <!-- <div id="qrcode"
+             class="qrcode code"
+             ref="qrCodeUrl"></div> -->
+        <!-- <p class="code-url"
+           v-if="codeUrl2">{{ codeUrl2 }}</p> -->
+      </div>
+    </el-dialog>
+  </div>
+</template>
+<script>
+import { getAgreement } from "@/api/buildTeam";
+import pagination from "@/components/Pagination/index";
+import { vaildStudentUrl } from "@/utils/validate";
+import cleanDeep from "clean-deep";
+import {
+  addZero,
+  getZero,
+  updateZero,
+  removeZero,
+  getBasic,
+  updateOpenFlag,
+  queryOrganMusicInfos,
+  queryUserMusicInfos,
+} from "@/api/zeroManager";
+import axios from "axios";
+import qs from "qs";
+import { getToken, getTenantId } from "@/utils/auth";
+import load from "@/utils/loading";
+// import QRCode from 'qrcodejs2'
+import vueQr from "vue-qr";
+let validMaxNum = (rule, value, callback) => {
+  if ((value == "" && typeof value == "string") || value == null) {
+    callback(new Error("请输入缴费金额"));
+  } else if (value < 0) {
+    callback(new Error("输入缴费金额必须大于0"));
+  } else {
+    callback();
+  }
+};
+export default {
+  name: "sporadicList",
+  components: { pagination, vueQr },
+  data() {
+    return {
+      validMaxNum: validMaxNum,
+      zeroVisible: false,
+      qrCodeUrl: null,
+      searchForm: {
+        organId: null,
+        chargeType: null,
+        type: null,
+        search: null,
+        openFlag: null,
+      },
+      tableList: [],
+      organList: [],
+      orderType: [
+        { label: "考级", value: 1 },
+        { label: "声部更改", value: 2 },
+        { label: "乐器更换", value: 3 },
+        { label: "配件销售", value: 4 },
+        { label: "维修费", value: 5 },
+        { label: "福袋活动", value: 6 },
+        { label: "双十一活动", value: 12 },
+        { label: "上门费", value: 7 },
+        { label: "账户充值", value: 9 },
+        // { label: "乐保服务", value: 10 },
+        // { label: "网基课活动", value: 13 },
+        // { label: "团练宝购买", value: 15 },
+        { label: "其它", value: 11 },
+      ],
+      orderType1: [
+        { label: "考级", value: 1 },
+        // { label: "声部更改", value: 2 },
+        // { label: '乐器更换', value: 3 },
+        // { label: '配件销售', value: 4 },
+        // { label: '双十一活动', value: 12 },
+        { label: "上门费", value: 7 },
+        { label: "账户充值", value: 9 },
+        { label: "其它", value: 11 },
+        // { label: "乐保服务", value: 10 },
+        // { label: "网基课活动", value: 13 },
+        // { label: "团练宝购买", value: 15 },
+      ],
+      maskForm: {
+        organId: "",
+        type: "",
+        money: "",
+        desc: "",
+        title: "",
+        code: "",
+        musicGroupId: "",
+        maxAmount: null,
+        openMaxTerm: null,
+        subMoney: "",
+      },
+      maskMusicList: [],
+      maskRules: {
+        organId: [{ required: true, message: "请选择分部", trigger: "change" }],
+        // musicGroupId: [{ required: true, message: '请选择所属乐团', trigger: 'change' }],
+        type: [
+          { required: true, message: "请选择收费类型", trigger: "change" },
+        ],
+        money: [
+          { required: true, message: "请输入收费金额", trigger: "change" },
+        ],
+        title: [
+          { required: true, message: "请输入标题名称", trigger: "change" },
+        ],
+        desc: [{ required: true, message: "请输入收费详情" }],
+      },
+      pageInfo: {
+        // 分页规则
+        limit: 10, // 限制显示条数
+        page: 1, // 当前页
+        total: 0, // 总条数
+        page_size: [10, 20, 40, 50], // 选择限制显示条数
+      },
+      isNew: false,
+      title: "新增收费",
+      qrcodeStatus: false,
+      qrcodes: true,
+      activeRow: null,
+      title1: "新增收费",
+      activeRow1: null,
+      zeroVisible1: false,
+      maskForm1: {
+        type: null,
+        money: null,
+        desc: null,
+        title: null,
+        code: null,
+        musicGroupId: null,
+        studentId: null,
+        studentName: null,
+      },
+      isNew1: false,
+      maskMusicList1: [],
+      maskRules1: {
+        organId: [{ required: true, message: "请选择分部", trigger: "change" }],
+        // musicGroupId: [{ required: true, message: '请选择所属乐团', trigger: 'change' }],
+        type: [
+          { required: true, message: "请选择收费类型", trigger: "change" },
+        ],
+        money: [
+          { required: true, message: "请输入收费金额", trigger: "change" },
+        ],
+        title: [
+          { required: true, message: "请输入标题名称", trigger: "change" },
+        ],
+        studentId: [
+          { required: true, message: "请输入学员编号", trigger: "blur" },
+        ],
+        desc: [{ required: true, message: "请输入收费详情" }],
+      },
+    };
+  },
+  mounted() {
+    // getEmployeeOrgan().then(res => {
+    //   if (res.code == 200) {
+    //     this.organList = res.data;
+    //   }
+    // })
+    this.$store.dispatch("setBranchs");
+    this.getList();
+    this.getAgreement ()
+  },
+  methods: {
+    search() {
+      this.pageInfo.page = 1;
+      this.getList();
+    },
+    onReSet() {
+      this.searchForm = {
+        organId: null,
+        chargeType: null,
+        type: null,
+        search: null,
+      };
+      this.search();
+    },
+    getList() {
+      let searchForm = this.searchForm;
+      let params = {
+        organId: searchForm.organId ? searchForm.organId : null,
+        chargeType: searchForm.chargeType ? searchForm.chargeType : null,
+        type: searchForm.type ? searchForm.type : null,
+        search: searchForm.search ? searchForm.search : null,
+        openFlag: searchForm.openFlag ? searchForm.openFlag * 1 : null,
+        page: this.pageInfo.page,
+        rows: this.pageInfo.limit,
+      };
+
+      getZero(params).then((res) => {
+        if (res.code == 200) {
+          this.tableList = res.data.rows;
+          this.pageInfo.total = res.data.total;
+        }
+      });
+    },
+    onFormClose(formName) {
+      // 关闭弹窗重置验证
+      if (formName == "maskForm") {
+        this.maskForm = {
+          organId: null,
+          musicGroupId: null,
+          type: null,
+          money: null,
+          maxAmount: null,
+          openMaxTerm: null,
+          desc: null,
+          title: null,
+          code: null,
+        };
+      } else if (formName == "maskForm1") {
+        this.maskForm1 = {
+          type: null,
+          musicGroupId: null,
+          money: null,
+          desc: null,
+          title: null,
+          code: null,
+          studentId: null,
+          studentName: null,
+        };
+      }
+      if (this.$refs[formName]) {
+        this.$refs[formName].resetFields();
+      }
+    },
+    newVisible() {
+      this.isNew = true;
+      this.zeroVisible = true;
+      this.title = "新增公用收费";
+    },
+    newVisible1() {
+      this.isNew1 = true;
+      this.zeroVisible1 = true;
+      this.title1 = "新增个人收费";
+    },
+    async getAgreement() {
+      try {
+        const res = await getAgreement();
+        if (!res.data) {
+          this.$bus.$emit("showguide", ["agreement"]);
+        }
+      } catch (e) {}
+    },
+    lookVisible(row) {
+      let maskForm = null;
+      if (row.userId) {
+        maskForm = this.maskForm1;
+        this.isNew1 = false;
+        this.zeroVisible1 = true;
+        this.title1 = "查看个人收费";
+        let url =
+          vaildStudentUrl() +
+          `/#/sporadicPay?id=${row.id}&userId=${row.userId}`;
+        this.qrCodeUrl = url;
+        maskForm.code = url;
+        maskForm.studentId = row.userId;
+        maskForm.studentName = row.userName;
+      } else {
+        maskForm = this.maskForm;
+        this.isNew = false;
+        this.zeroVisible = true;
+        this.title = "查看公用收费";
+        let url = vaildStudentUrl() + `/#/sporadicLogin?id=${row.id}`;
+        this.qrCodeUrl = url;
+        maskForm.code = url;
+      }
+      maskForm.type = parseInt(row.chargeType);
+      maskForm.id = row.id;
+      maskForm.desc = row.detail;
+      maskForm.title = row.title;
+      maskForm.organId = row.organId;
+      maskForm.money = row.amount;
+      maskForm.subMoney = row.discountAmount;
+      maskForm.maxAmount = row.maxAmount;
+      maskForm.openMaxTerm = row.openMaxTerm;
+      maskForm.musicGroupId = row.musicGroupId ? row.musicGroupId : null;
+      if (row.userId) {
+        queryUserMusicInfos({ userId: row.userId }).then((studentInfo) => {
+          if (studentInfo.code == 200) {
+            this.maskMusicList1 = studentInfo.data;
+          }
+        });
+      } else {
+        this.onMusicGroupChange(true);
+      }
+    },
+    onMusicGroupChange(status) {
+      let maskForm = this.maskForm;
+      if (!maskForm.organId) {
+        return;
+      }
+      if (!status) {
+        maskForm.musicGroupId = null; // 重置可能已经选中的乐团
+      }
+      queryOrganMusicInfos({ organId: maskForm.organId }).then((res) => {
+        if (res.code == 200) {
+          this.maskMusicList = res.data;
+        }
+      });
+    },
+    updateZero() {
+      let maskForm = this.maskForm;
+      if (maskForm.type != 12) {
+        this.zeroVisible = false;
+        return;
+      }
+      this.$refs["maskForm"].validate((item) => {
+        if (item) {
+          updateZero(
+            cleanDeep({
+              id: maskForm.id,
+              maxAmount: maskForm.maxAmount,
+              openMaxTerm: maskForm.openMaxTerm,
+            })
+          ).then((res) => {
+            if (res.code == 200) {
+              this.$message.success("更新成功");
+              this.zeroVisible = false;
+              this.getList();
+            }
+          });
+        }
+      });
+    },
+    addZero() {
+      this.$refs["maskForm"].validate((item) => {
+        if (item) {
+          let maskForm = this.maskForm;
+          let obj = {
+            chargeType: maskForm.type,
+            detail: maskForm.desc,
+            title: maskForm.title,
+            organId: maskForm.organId,
+            amount: maskForm.money,
+            musicGroupId: maskForm.musicGroupId,
+            discountAmount: maskForm.subMoney,
+          };
+
+          if (maskForm.type == 12) {
+            (obj.maxAmount = maskForm.maxAmount),
+              (obj.openMaxTerm = maskForm.openMaxTerm);
+          }
+          addZero(obj).then((res) => {
+            if (res.code == 200) {
+              this.$message.success("新增成功");
+              this.zeroVisible = false;
+              this.getList();
+            }
+          });
+        }
+      });
+    },
+    addZero1() {
+      this.$refs["maskForm1"].validate((item) => {
+        if (item) {
+          let maskForm1 = this.maskForm1;
+          if (!maskForm1.studentName) {
+            this.$message.error("学员信息不存在");
+            return;
+          }
+          let obj = {
+            chargeType: maskForm1.type,
+            detail: maskForm1.desc,
+            title: maskForm1.title,
+            musicGroupId: this.maskForm1.musicGroupId,
+            userId: maskForm1.studentId,
+            amount: maskForm1.money,
+          };
+          addZero(obj).then((res) => {
+            if (res.code == 200) {
+              this.$message.success("新增成功");
+              this.zeroVisible1 = false;
+              this.getList();
+            }
+          });
+        }
+      });
+    },
+    async onStudentChange() {
+      let studentId = this.maskForm1.studentId;
+      // 判断学生编号是否存在
+      if (!studentId) {
+        return;
+      }
+
+      if (studentId.length > 10) {
+        this.$message.error("学员编号不合法");
+        return;
+      }
+
+      await getBasic({ userId: studentId }).then((res) => {
+        if (res.code == 200) {
+          if (res.data) {
+            this.maskForm1.studentName = res.data.name;
+            queryUserMusicInfos({ userId: studentId }).then((studentInfo) => {
+              if (studentInfo.code == 200) {
+                this.maskMusicList1 = studentInfo.data;
+              }
+            });
+          } else {
+            this.maskForm1.studentName = null;
+          }
+        }
+      });
+    },
+    removeItem(row) {
+      this.$confirm("是否删除该收费", "提示", {
+        confirmButtonText: "确定",
+        cancelButtonText: "取消",
+        type: "warning",
+      })
+        .then(() => {
+          removeZero({ id: row.id }).then((res) => {
+            if (res.code == 200) {
+              this.$message.success("删除成功");
+              this.zeroVisible = false;
+              this.getList();
+            }
+          });
+        })
+        .catch(() => {});
+    },
+    setSporadic(row) {
+      // openFlag
+      let str = "";
+      let openFlag = "";
+      if (row.openFlag) {
+        // 关闭=>开启 1是关闭
+        openFlag = 0;
+        str = "开启";
+      } else {
+        // 开启=>关闭 0是开启
+        openFlag = 1;
+        str = "关闭";
+      }
+
+      this.$confirm(`是否${str}该收费`, "提示", {
+        confirmButtonText: "确定",
+        cancelButtonText: "取消",
+        type: "warning",
+      })
+        .then(() => {
+          updateOpenFlag({ sporadicId: row.id, openFlag }).then((res) => {
+            if (res.code == 200) {
+              this.$message.success(`${str}成功`);
+              this.getList();
+            }
+          });
+        })
+        .catch(() => {});
+    },
+    exportSporad() {
+      let url = "/api-web/export/sporadicChargeInfo";
+      let data = this.searchForm;
+      const options = {
+        method: "get",
+        headers: {
+          Authorization: getToken(),
+          tenantId: getTenantId(),
+        },
+        params: data,
+        url,
+        responseType: "blob",
+      };
+      this.$confirm("您确定导出零星缴费列表", "提示", {
+        confirmButtonText: "确定",
+        cancelButtonText: "取消",
+        type: "warning",
+      })
+        .then(() => {
+          load.startLoading();
+          axios(options)
+            .then((res) => {
+              let blob = new Blob([res.data], {
+                // type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=utf-8'
+                type: "application/vnd.ms-excel;charset=utf-8",
+                //word文档为application/msword,pdf文档为application/pdf,application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=utf-8
+              });
+
+              let text = new Response(blob).text();
+              text.then((res) => {
+                // 判断是否报错
+                if (res.indexOf("code") != -1) {
+                  let json = JSON.parse(res);
+                  if (json.code == 403) {
+                    this.$message.error(`登录过期,请重新登录!`);
+                    setTimeout(() => {
+                      this.$store.dispatch("user/resetToken").then(() => {
+                        location.reload();
+                      });
+                    }, 1000);
+                    return;
+                  }
+                  this.$message.error(json.msg);
+                } else {
+                  let objectUrl = URL.createObjectURL(blob);
+                  let link = document.createElement("a");
+                  let nowTime = new Date();
+                  let ymd =
+                    nowTime.getFullYear() +
+                    "" +
+                    (nowTime.getMonth() + 1) +
+                    "" +
+                    nowTime.getDate();
+                  let fname = ymd + "零星缴费.xls"; //下载文件的名字
+                  link.href = objectUrl;
+                  link.setAttribute("download", fname);
+                  document.body.appendChild(link);
+                  link.click();
+                }
+              });
+              load.endLoading();
+            })
+            .catch((error) => {
+              this.$message.error("导出数据失败,请联系管理员");
+              load.endLoading();
+            });
+        })
+        .catch(() => {});
+    },
+  },
+  watch: {
+    zeroVisible(val) {
+      if (!val) {
+        this.maskForm = {
+          organId: "",
+          type: "",
+          money: "",
+          desc: "",
+          title: "",
+          maxAmount: null,
+          openMaxTerm: null,
+          code: "",
+        };
+        // this.$refs['maskForm'].resetFields()
+        // console.log(this.$refs['zeroForm'].resetFields)
+      }
+    },
+  },
+  filters: {
+    chargeTypeFilter(val) {
+      let template = {
+        1: "考级",
+        2: "声部更改",
+        3: "乐器更换",
+        4: "配件销售",
+        5: "维修费",
+        6: "福袋活动",
+        7: "上门费",
+        9: "账户充值",
+        10: "乐保服务",
+        11: "其它",
+        12: "双十一活动",
+        13: "网基课活动",
+        15: "团练宝购买",
+      };
+      return template[val];
+    },
+  },
+};
+</script>
+<style lang="scss" scoped>
+.right-code {
+  // width: 50%;
+  // float: left;
+  .title {
+    font-size: 18px;
+    text-align: center;
+    padding-bottom: 8px;
+  }
+}
+.newBand {
+  display: inline-block;
+}
+
+.el-input {
+  width: 180px !important;
+}
+/deep/.el-select {
+  width: auto !important;
+}
+</style>

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