浏览代码

Merge branch 'iteration-20241022-member' into 11/24SAAS

lex-xin 9 月之前
父节点
当前提交
a07b506971
共有 95 个文件被更改,包括 2569 次插入1387 次删除
  1. 1 1
      src/assets/icon/iconfont.json
  2. 2 2
      src/constant/guide.js
  3. 10 10
      src/constant/index.js
  4. 5 5
      src/router/index.js
  5. 2 2
      src/store/modules/permission.js
  6. 1 1
      src/utils/request2.js
  7. 3 3
      src/utils/searchArray.js
  8. 1 1
      src/utils/vueFilter.js
  9. 2 2
      src/views/accompaniment/modals/form.vue
  10. 1 1
      src/views/afterSchoolManager/afterSchoolList.vue
  11. 2 2
      src/views/afterSchoolManager/afterWorkList.vue
  12. 2 2
      src/views/afterSchoolManager/components/oldAfterWorkList.vue
  13. 2 2
      src/views/afterSchoolManager/examination.vue
  14. 2 2
      src/views/agentManager/memberShareList.vue
  15. 1 1
      src/views/app/clouldSuggestion.vue
  16. 1 1
      src/views/app/suggestionIndex.vue
  17. 1 0
      src/views/attendanceManager/attendanceList/components/courseWorkeDetail.vue
  18. 1 1
      src/views/attendanceManager/attendanceList/components/textConment.vue
  19. 2 2
      src/views/attendanceManager/attendanceList/index.vue
  20. 1 1
      src/views/auditList/index.vue
  21. 13 5
      src/views/auditList/member.vue
  22. 5 2
      src/views/auditList/memberModel.vue
  23. 4 4
      src/views/baseRulesManager/components/otherRules.vue
  24. 1 1
      src/views/businessManager/shopManager/shopOperation.vue
  25. 7 7
      src/views/categroyManager/generalSettings/groupMarkPrice.vue
  26. 1 1
      src/views/categroyManager/globalConfig.vue
  27. 1 1
      src/views/categroyManager/globalMusicGroup.vue
  28. 1 0
      src/views/categroyManager/modals/baseInfo.vue
  29. 30 20
      src/views/categroyManager/modals/payInfo.vue
  30. 48 3
      src/views/categroyManager/productSystem/api.js
  31. 87 72
      src/views/categroyManager/productSystem/memberFeeSet.vue
  32. 418 209
      src/views/categroyManager/productSystem/memberSet.vue
  33. 6 6
      src/views/categroyManager/specialSetup/cloudTeacherFee.vue
  34. 58 30
      src/views/categroyManager/vipNewActive.vue
  35. 2 2
      src/views/couponManager/couponGiveList.vue
  36. 2 2
      src/views/courseCredentials/index.vue
  37. 2 2
      src/views/courseRulersManager/components/studentAttRules.vue
  38. 1 1
      src/views/courseRulersManager/components/teamRules.vue
  39. 1 1
      src/views/dictionaryManager/index.vue
  40. 1 1
      src/views/main/api.js
  41. 2 2
      src/views/main/cloudDate/exerciseDuration.vue
  42. 2 2
      src/views/main/cloudDate/exerciseDurationDetail.vue
  43. 4 4
      src/views/main/cloudDate/organDate.vue
  44. 4 4
      src/views/main/cloudDate/organDateDetail.vue
  45. 4 4
      src/views/main/cloudDate/organMemberList.vue
  46. 5 5
      src/views/main/cloudDate/organRankDetail.vue
  47. 5 5
      src/views/main/cloudDate/organRanking.vue
  48. 3 3
      src/views/main/constant.js
  49. 4 4
      src/views/main/coursewareDate/organDateDetail.vue
  50. 4 4
      src/views/main/coursewareDate/organMemberList.vue
  51. 1 1
      src/views/main/index.vue
  52. 3 3
      src/views/organManager/components/memberSetting.vue
  53. 311 0
      src/views/organManager/components/memberSettingMore.vue
  54. 111 2
      src/views/organManager/components/openService.vue
  55. 16 8
      src/views/organManager/organOperation.vue
  56. 1 1
      src/views/platformManager/cloudTrafficPackage/index.vue
  57. 12 12
      src/views/reportForm/index.vue
  58. 11 3
      src/views/resetTeaming/api.js
  59. 34 4
      src/views/resetTeaming/components/giveMemberList.vue
  60. 128 62
      src/views/resetTeaming/components/payInfoDetail.vue
  61. 1 1
      src/views/resetTeaming/components/strudentPayInfo.vue
  62. 1 1
      src/views/resetTeaming/index.vue
  63. 7 3
      src/views/resetTeaming/modals/giveMemberModel.vue
  64. 2 2
      src/views/resetTeaming/modals/giveMemberPayment.vue
  65. 15 6
      src/views/resetTeaming/modals/instrumentModel.vue
  66. 32 18
      src/views/resetTeaming/modals/member-setting.vue
  67. 6 86
      src/views/resetTeaming/modals/member.vue
  68. 129 81
      src/views/resetTeaming/modals/payMember.vue
  69. 1 1
      src/views/resetTeaming/modals/payTeamCourse.vue
  70. 7 14
      src/views/resetTeaming/modals/review-detail.vue
  71. 22 2
      src/views/resetTeaming/modals/signUpPayment.less
  72. 77 94
      src/views/resetTeaming/modals/subject-preview.vue
  73. 1 1
      src/views/resetTeaming/modals/user-pay-form.vue
  74. 3 3
      src/views/sporadicManager/sporadicList.vue
  75. 18 3
      src/views/studentManager/api.js
  76. 3 3
      src/views/studentManager/memberList.vue
  77. 100 26
      src/views/studentManager/modals/createMember.vue
  78. 4 1
      src/views/studentManager/modals/recordDetail.vue
  79. 125 36
      src/views/studentManager/modals/setMemberDate.vue
  80. 274 0
      src/views/studentManager/modals/setMemberList.vue
  81. 44 8
      src/views/studentManager/studentGroupPractice.vue
  82. 37 7
      src/views/studentManager/studentGroupRecord.vue
  83. 86 213
      src/views/studentManager/studentList.vue
  84. 1 1
      src/views/teacherManager/teacherDetail/components/teacherInfo.vue
  85. 2 2
      src/views/teacherManager/teacherOperation/components/teacherOperation.vue
  86. 1 1
      src/views/teamBuild/components/teamBaseInfo.vue
  87. 17 28
      src/views/teamBuild/signupList.vue
  88. 9 6
      src/views/teamDetail/components/modals/create-user-pay.vue
  89. 2 2
      src/views/teamDetail/components/modals/quite-team.vue
  90. 101 173
      src/views/teamDetail/components/studentList.vue
  91. 3 3
      src/views/teamDetail/teamCourseList.vue
  92. 33 8
      src/views/tenantSetting/groupRecordManager.vue
  93. 1 1
      src/views/withdrawal-application/index.vue
  94. 4 4
      src/views/withdrawal-application/modals/quit.vue
  95. 3 3
      src/views/workBenchManager/journal/model/musicGroup.vue

+ 1 - 1
src/assets/icon/iconfont.json

@@ -455,7 +455,7 @@
     },
     {
       "icon_id": "27122005",
-      "name": "云练习反馈",
+      "name": "学练宝反馈",
       "font_class": "yunjiaolianfankui",
       "unicode": "e65c",
       "unicode_decimal": 58972

+ 2 - 2
src/constant/guide.js

@@ -46,8 +46,8 @@ export const guideList = {
     permission: "/globalConfig/chargesList"
   },
   memberList: {
-    name: "云练习定价",
-    desc: "可对不同分部设置云练习学员购买价格,若不设置则学员不可购买云练习",
+    name: "学练宝定价",
+    desc: "可对不同分部设置学练宝学员购买价格,若不设置则学员不可购买学练宝",
     path: "/memberFeeSet",
     permission: "/memberFeeSet"
   },

+ 10 - 10
src/constant/index.js

@@ -309,14 +309,14 @@ export const downListType = {
   17: "预计课耗导出",
   18: "预计课耗学员详情导出",
   19: "课耗统计导出",
-  20: "云练习统计导出",
+  20: "学练宝统计导出",
   21: "班级列表导出",
-  22: "云练习统计详情导出",
-  23: "老师云练习使用数据",
+  22: "学练宝统计详情导出",
+  23: "老师学练宝使用数据",
   24: "oa费用汇总",
   25: "oa费用明细",
   26: "经营报表收入汇总",
-  27: "云练习激活明细",
+  27: "学练宝激活明细",
   28: "课程收入明细导出",
   29: "乐团梯队数据导出",
   30: "平衡关系-乐团课",
@@ -339,7 +339,7 @@ export const withdrawalStatus = {
 
 export const clientStatus = {
   NETWORK_ROOM: "网络教室",
-  SMART_PRACTICE: "云练习"
+  SMART_PRACTICE: "学练宝"
 };
 
 export const conclusion = {
@@ -371,7 +371,7 @@ export const couponType = {
 export const orderType = {
   APPLY: "报名",
   RENEW: "续费",
-  MEMBER: "会员购买",
+  MEMBER: "学练宝购买",
   SMALL_CLASS_TO_BUY: "VIP购买",
   SPORADIC: "零星收费",
   LUCK: "福袋活动",
@@ -431,20 +431,20 @@ export const organPayState = {
 export const tenantStatus = {
   TENANT_OPEN: "机构开通缴费",
   TENANT_RENEW: "机构续费",
-  CLOUD_TEACHER: "激活云练习",
+  CLOUD_TEACHER: "激活学练宝",
   TENANT_RECHARGE: "机构充值"
 };
 //   "DAY": '天',
 export const memberEnum = {
   MONTH: "月度",
-  QUARTERLY: "季度",
+  // QUARTERLY: "季度",
   YEAR_HALF: "半年",
   YEAR: "年"
 };
 export const cloudGroupActive = {
   1: "固定天数",
   2: "月度",
-  3: "季度",
+  // 3: "季度",
   4: "半年",
   5: "年度"
 };
@@ -470,7 +470,7 @@ export const coupontypeDetail = {
   MUSIC: "乐团课",
   VIP: "VIP课",
   LIVE: "直播课",
-  MEMBER: "云练习"
+  MEMBER: "学练宝"
 };
 
 // 发券方式

+ 5 - 5
src/router/index.js

@@ -351,7 +351,7 @@ export const asyncRoutes = {
   entryOperation: () => import("@/views/app/entryOperation"),
   // 意见反馈
   suggestion: () => import("@/views/app/suggestionIndex"),
-  // 云练习意见反馈
+  // 学练宝意见反馈
   clouldSuggestion: () => import("@/views/app/clouldSuggestion"),
   // 帮助分类
   helpCategory: () => import("@/views/helpCenter/helpCategory"),
@@ -554,7 +554,7 @@ export const asyncRoutes = {
   serviceOperation: () => import("@/views/platformManager/serviceManager/form"),
   // 机构申请
   tenantApply: () => import("@/views/platformManager/tenantApply"),
-  // 云练习流量包
+  // 学练宝流量包
   cloudTrafficPackage: () =>
     import("@/views/platformManager/cloudTrafficPackage"),
   accompanyBaseConfig: () =>
@@ -582,7 +582,7 @@ export const asyncRoutes = {
   // 机构交易管理
   tenantTradeManager: () =>
     import("@/views/tenantSetting/tenantTradeManager.vue"),
-  // 云练习激活记录
+  // 学练宝激活记录
   groupRecordManager: () =>
     import("@/views/tenantSetting/groupRecordManager.vue"),
   // 扣费记录
@@ -606,7 +606,7 @@ export const asyncRoutes = {
   //
   studentGroupPractice: () =>
     import("@/views/studentManager/studentGroupPractice"),
-  // 云练习缴费记录
+  // 学练宝缴费记录
   studentGroupRecord: () => import("@/views/studentManager/studentGroupRecord"),
   // 直播课管理
   liveClassManager: () => import("@/views/liveClassManager"),
@@ -622,7 +622,7 @@ export const asyncRoutes = {
   smallStudentManager: () => import("@/views/smallStudentManager"),
   // 代理商管理
   agentList: () => import("@/views/agentManager/agentList"),
-  // 云练习分润
+  // 学练宝分润
   memberShareList: () => import("@/views/agentManager/memberShareList"),
   // 群组管理
   groupChatManager: () => import("@/views/groupChatManager"),

+ 2 - 2
src/store/modules/permission.js

@@ -270,7 +270,7 @@ function setDetailRoute(accessedRoutes) {
           hidden: true,
           meta: {
             noCache: "1",
-            title: "分部云练习数据详情",
+            title: "分部学练宝数据详情",
             belongTopMenu: "/main",
             activeMenu: "/workbench"
           }
@@ -282,7 +282,7 @@ function setDetailRoute(accessedRoutes) {
           hidden: true,
           meta: {
             noCache: "1",
-            title: "分部云练习排行",
+            title: "分部学练宝排行",
             belongTopMenu: "/main",
             activeMenu: "/workbench"
           }

+ 1 - 1
src/utils/request2.js

@@ -103,7 +103,7 @@ service.interceptors.request.use(
     } else {
       config.data = noCleanDeep ? config.data : cleanDeep(config.data);
     }
-    config.params = noCleanDeep ? config.data : cleanDeep(config.params);
+    config.params = noCleanDeep ? config.params : cleanDeep(config.params);
     return config;
   },
   async error => {

+ 3 - 3
src/utils/searchArray.js

@@ -339,7 +339,7 @@ export const orderStatus = [
   },
   {
     value: "MEMBER",
-    label: "会员购买"
+    label: "学练宝购买"
   },
   {
     value: "SMALL_CLASS_TO_BUY",
@@ -688,8 +688,8 @@ export const visitChiose1 = [
     ]
   },
   {
-    value: "云练习",
-    label: "云练习",
+    value: "学练宝",
+    label: "学练宝",
     children: [
       {
         value: "体验回访",

+ 1 - 1
src/utils/vueFilter.js

@@ -848,7 +848,7 @@ Vue.filter("cloudGroupActive", value => {
   let template = {
     1: "天数",
     2: "月度",
-    3: "季度",
+    // 3: "季度",
     4: "半年",
     5: "年度"
   };

+ 2 - 2
src/views/accompaniment/modals/form.vue

@@ -116,7 +116,7 @@
           placeholder="请选择客户端类型"
         >
           <el-option value="NETWORK_ROOM" label="网络教室"></el-option>
-          <el-option value="SMART_PRACTICE" label="云练习"></el-option>
+          <el-option value="SMART_PRACTICE" label="学练宝"></el-option>
         </el-select>
       </el-form-item> -->
       <!-- <el-form-item
@@ -465,7 +465,7 @@ export default {
           midiUrl: "",
           order: 0,
           musicScoreCategoriesId: [],
-          // 兼容之前数据,默认选择云练习
+          // 兼容之前数据,默认选择学练宝
           clientType: "SMART_PRACTICE",
           renderFrom: "",
           playMode: "MP3",

+ 1 - 1
src/views/afterSchoolManager/afterSchoolList.vue

@@ -69,7 +69,7 @@
             class="organSelect"
             filterable
             clearable
-            placeholder="是否云练习布置"
+            placeholder="是否学练宝布置"
           >
             <el-option label="是" :value="true"></el-option>
             <el-option label="否" :value="false"></el-option>

+ 2 - 2
src/views/afterSchoolManager/afterWorkList.vue

@@ -62,7 +62,7 @@
             class="organSelect"
             filterable
             clearable
-            placeholder="是否云练习布置"
+            placeholder="是否学练宝布置"
           >
             <el-option label="是" :value="true"></el-option>
             <el-option label="否" :value="false"></el-option>
@@ -254,7 +254,7 @@
               <div>{{ scope.row.isRepliedTimely ? "是" : "否" }}</div>
             </template>
           </el-table-column>
-          <el-table-column align="center" prop="actualTeacherName" label="是否云练习布置">
+          <el-table-column align="center" prop="actualTeacherName" label="是否学练宝布置">
             <template slot-scope="scope">
               <div>
                 {{ scope.row.musicScoreId ? "是" : "否" }}

+ 2 - 2
src/views/afterSchoolManager/components/oldAfterWorkList.vue

@@ -50,7 +50,7 @@
             class="organSelect"
             filterable
             clearable
-            placeholder="是否云练习布置"
+            placeholder="是否学练宝布置"
           >
             <el-option label="是" :value="true"></el-option>
             <el-option label="否" :value="false"></el-option>
@@ -238,7 +238,7 @@
           <el-table-column
             align="center"
             prop="actualTeacherName"
-            label="是否云练习布置"
+            label="是否学练宝布置"
           >
             <template slot-scope="scope">
               <div>

+ 2 - 2
src/views/afterSchoolManager/examination.vue

@@ -84,7 +84,7 @@
             class="organSelect"
             clearable
             filterable
-            placeholder="是否云练习布置"
+            placeholder="是否学练宝布置"
           >
             <el-option label="是" :value="true"></el-option>
             <el-option label="否" :value="false"></el-option>
@@ -154,7 +154,7 @@
             </template>
           </el-table-column>
 
-          <!-- <el-table-column align="center" prop="actualTeacherName" label="是否云练习布置">
+          <!-- <el-table-column align="center" prop="actualTeacherName" label="是否学练宝布置">
             <template slot-scope="scope">
               <div>
                 {{ scope.row.musicScoreId ? "是" : "否" }}

+ 2 - 2
src/views/agentManager/memberShareList.vue

@@ -3,7 +3,7 @@
   <div class="m-container">
     <h2>
       <div class="squrt"></div>
-      云练习分润
+      学练宝分润
     </h2>
     <div class="m-core">
       <el-card header="" style="width:460px" class="myCard">
@@ -22,7 +22,7 @@
           </statistic-item>
           <statistic-item>
             <span>
-              云练习销售数(个月)
+              学练宝销售数(个月)
             </span>
             <span> <count-to :endVal="detail.memberCount"/></span>
           </statistic-item>

+ 1 - 1
src/views/app/clouldSuggestion.vue

@@ -2,7 +2,7 @@
   <div class="m-container">
     <h2>
       <div class="squrt"></div>
-      云练习反馈
+      学练宝反馈
     </h2>
     <div class="m-core">
       <save-form

+ 1 - 1
src/views/app/suggestionIndex.vue

@@ -23,7 +23,7 @@
           <suggestionType v-if="activeIndex === '2'" />
         </el-tab-pane>
         <!-- <el-tab-pane
-          label="云练习反馈"
+          label="学练宝反馈"
           lazy
           name="3"
           v-if="permissionList.clouldSuggestion"

+ 1 - 0
src/views/attendanceManager/attendanceList/components/courseWorkeDetail.vue

@@ -79,6 +79,7 @@
       >
         <div v-if="activeName == 'second'">
           <textConment
+            :courseDetail="courseDetail"
             :trainingDetailList="trainingGroupList"
             :courseScheduleId="courseScheduleId"
           />

+ 1 - 1
src/views/attendanceManager/attendanceList/components/textConment.vue

@@ -49,7 +49,7 @@
 <script>
 import { getHomeworkSubjectPublic } from "../api";
 export default {
-  props: ["trainingDetailList", "courseScheduleId"],
+  props: ["trainingDetailList", "courseScheduleId", "courseDetail"],
   data() {
     return {
       subjectId: [],

+ 2 - 2
src/views/attendanceManager/attendanceList/index.vue

@@ -66,7 +66,7 @@
             class="organSelect"
             clearable
             filterable
-            placeholder="是否云练习布置"
+            placeholder="是否学练宝布置"
           >
             <el-option label="是" :value="true"></el-option>
             <el-option label="否" :value="false"></el-option>
@@ -131,7 +131,7 @@
             prop="actualTeacherName"
             label="布置老师"
           ></el-table-column>
-          <!-- <el-table-column align="center" prop="actualTeacherName" label="是否云练习布置">
+          <!-- <el-table-column align="center" prop="actualTeacherName" label="是否学练宝布置">
             <template slot-scope="scope">
               <div>
                 {{ scope.row.musicScoreId ? "是" : "否" }}

+ 1 - 1
src/views/auditList/index.vue

@@ -14,7 +14,7 @@
           <musicGroup v-if="activeIndex === '1'" />
         </el-tab-pane>
         <el-tab-pane
-          label="云练习缴费"
+          label="学练宝缴费"
           name="2"
           v-if="permission('cloudCoachPaymentProgram/queryPage/home')"
         >

+ 13 - 5
src/views/auditList/member.vue

@@ -4,13 +4,13 @@
       <el-form :inline="true" :model="searchForm">
         <el-form-item prop="period">
           <el-select
-            placeholder="云练习单位"
+            placeholder="学练宝单位"
             clearable
             v-model.trim="searchForm.period"
             style="width: 100% !important"
           >
             <el-option label="月度" value="MONTH"></el-option>
-            <el-option label="季度" value="QUARTERLY"></el-option>
+            <!-- <el-option label="季度" value="QUARTERLY"></el-option> -->
             <el-option label="半年" value="YEAR_HALF"></el-option>
             <el-option label="年度" value="YEAR"></el-option>
             <!-- <el-option label="固定天数" value="DAY"></el-option> -->
@@ -91,16 +91,24 @@
             align="left"
             prop="id"
             label="续费编号"
+            width="80px"
           ></el-table-column>
           <el-table-column align="left" prop="organName" label="分部名称">
           </el-table-column>
-          <el-table-column align="left" prop="name" label="云练习">
+          <el-table-column align="left" prop="name" label="学练宝">
             <template slot-scope="scope">
               <div>
                 <p>
+                  学练宝版本:
+                  {{ scope.row.name ? scope.row.name : "--" }}
+                </p>
+                <p>
+                  续费数量:
+                  {{ scope.row.memberNum ? scope.row.memberNum : "--" }}
+                </p>
+                <p>
                   续费周期:
-                  {{ scope.row.memberNum ? scope.row.memberNum : "--"
-                  }}{{ scope.row.period | memberEnumType }}
+                  {{ scope.row.period | memberEnumType }}
                 </p>
                 <p>
                   缴费金额: {{ scope.row.actualAmount | moneyFormat(true) }}

+ 5 - 2
src/views/auditList/memberModel.vue

@@ -1,10 +1,13 @@
 <template>
   <div>
     <descriptions :column="2" style="margin-bottom: 20px">
-      <descriptions-item label="云练习单位">{{
+      <descriptions-item label="学练宝版本">{{
+        detail.name || '--'
+      }}</descriptions-item>
+      <descriptions-item label="周期">{{
         detail.period | memberEnumType
       }}</descriptions-item>
-      <descriptions-item label="周期数">{{
+      <descriptions-item label="数">{{
         detail.memberNum
       }}</descriptions-item>
       <descriptions-item label="缴费金额(元)">{{

+ 4 - 4
src/views/baseRulesManager/components/otherRules.vue

@@ -60,7 +60,7 @@
         </el-alert>
         <!-- <el-row>
           <el-form-item prop="108">
-            云练习活动分部目标
+            学练宝活动分部目标
             <el-input
               class="marginLR5"
               style="width: 180px"
@@ -73,7 +73,7 @@
         </el-row>
         <el-row>
           <el-form-item prop="109">
-            云练习活动预约开始时间
+            学练宝活动预约开始时间
             <el-date-picker
               class="marginLR5"
               v-model="form['109']"
@@ -88,7 +88,7 @@
         </el-row>
         <el-row>
           <el-form-item prop="110">
-            云练习活动预约结束时间
+            学练宝活动预约结束时间
             <el-date-picker
               class="marginLR5"
               v-model="form['110']"
@@ -103,7 +103,7 @@
         </el-row>
         <el-row>
           <el-form-item prop="111">
-            云练习活动开屏广告编号
+            学练宝活动开屏广告编号
             <el-input
               class="marginLR5"
               v-model="form['111']"

+ 1 - 1
src/views/businessManager/shopManager/shopOperation.vue

@@ -411,7 +411,7 @@
           >
             <el-option label="课程收费" value="0"></el-option>
             <el-option label="系统收费" value="1"></el-option>
-            <el-option label="云练习收费" value="2"></el-option>
+            <el-option label="学练宝收费" value="2"></el-option>
           </select-all>
         </el-form-item> -->
 

+ 7 - 7
src/views/categroyManager/generalSettings/groupMarkPrice.vue

@@ -3,7 +3,7 @@
     <el-form :inline="true" :model="form" ref="form">
       <el-alert
         style="margin: 10px 0"
-        title="机构云练习定价范围设置"
+        title="机构学练宝定价范围设置"
         :closable="false"
         type="info"
       >
@@ -11,7 +11,7 @@
       <el-row>
         <el-form-item
           prop="minMonthFee"
-          label="月度云练习机构定价范围最低:"
+          label="月度学练宝机构定价范围最低:"
           :rules="[
             {
               required: false,
@@ -45,10 +45,10 @@
           </el-input>
         </el-form-item>
       </el-row>
-      <el-row>
+      <!-- <el-row>
         <el-form-item
           prop="minQuarterlyFee"
-          label="季度云练习机构定价范围最低:"
+          label="季度学练宝机构定价范围最低:"
           :rules="[
             {
               required: false,
@@ -81,11 +81,11 @@
             >
           </el-input>
         </el-form-item>
-      </el-row>
+      </el-row> -->
       <el-row>
         <el-form-item
           prop="minHalfYearFee"
-          label="半年云练习机构定价范围最低:"
+          label="半年学练宝机构定价范围最低:"
           :rules="[
             {
               required: false,
@@ -122,7 +122,7 @@
       <el-row>
         <el-form-item
           prop="minYearFee"
-          label="年度云练习机构定价范围最低:"
+          label="年度学练宝机构定价范围最低:"
           :rules="[
             {
               required: false,

+ 1 - 1
src/views/categroyManager/globalConfig.vue

@@ -20,7 +20,7 @@
           <loginRules v-if="activeIndex == 6" />
         </el-tab-pane>
         <el-tab-pane
-          label="云练习定价"
+          label="学练宝定价"
           lazy
           name="3"
           v-if="permissionList.groupMarkPrice"

+ 1 - 1
src/views/categroyManager/globalMusicGroup.vue

@@ -20,7 +20,7 @@
           <typesManager v-if="activeIndex == 2" />
         </el-tab-pane>
         <!-- <el-tab-pane
-            label="分部云练习价格配置"
+            label="分部学练宝价格配置"
             lazy
             name="13"
           >

+ 1 - 0
src/views/categroyManager/modals/baseInfo.vue

@@ -17,6 +17,7 @@
     >
       <el-form-item label="活动名称" prop="name">
         <el-input
+          placeholder="请输入活动名称"
           style="width: 400px"
           v-model.trim="baseForm.name"
           :disabled="isDisabled || status != 'DRAFT'"

+ 30 - 20
src/views/categroyManager/modals/payInfo.vue

@@ -235,40 +235,37 @@
       <div v-else>
         <el-row>
           <el-form-item
-            label="会员名称"
+            label="学练宝版本"
             prop="memberRankId"
             :rules="[
-              { required: true, message: '请选择会员名称', trigger: 'change' }
+              { required: true, message: '请选择学练宝版本', trigger: 'change' }
             ]"
           >
-            <el-select
-              style="width: 400px !important"
+            <el-cascader
               v-model.trim="payForm.memberRankId"
-              placeholder="请选择会员名称"
+              style="width: 400px !important"
+              :options="remberList"
+              :props="{ value: 'id', label: 'name',  }"
+              :show-all-levels="false"
+              collapse-tags
               clearable
               :disabled="isDisabled"
-            >
-              <el-option
-                v-for="(item, index) in remberList"
-                :key="index"
-                :label="item.name"
-                :value="item.id"
-              ></el-option>
-            </el-select>
+              placeholder="请选择学练宝版本"
+            ></el-cascader>
           </el-form-item>
         </el-row>
         <el-row>
           <el-form-item
-            label="会员周期"
+            label="周期"
             prop="periodEnum"
             :rules="[
-              { required: true, message: '请选择会员周期', trigger: 'change' }
+              { required: true, message: '请选择周期', trigger: 'change' }
             ]"
           >
             <el-select
               style="width: 400px !important"
               v-model.trim="payForm.periodEnum"
-              placeholder="请选择会员周期"
+              placeholder="请选择周期"
               clearable
               :disabled="isDisabled"
             >
@@ -555,7 +552,7 @@
             }
           ]"
         >
-          <el-select
+          <!-- <el-select
             style="width: 400px !important"
             v-model.trim="payForm.giveMemberRankId"
             placeholder="请选择会员名称"
@@ -569,7 +566,18 @@
               :value="item.id"
               :disabled="item.id == 2"
             ></el-option>
-          </el-select>
+          </el-select> -->
+          <el-cascader
+            :disabled="isDisabled"
+              v-model.trim="payForm.giveMemberRankId"
+              style="width: 400px !important"
+              :options="remberList"
+              :props="{ value: 'id', label: 'name',  }"
+              :show-all-levels="false"
+              collapse-tags
+              clearable
+              placeholder="请选择学练宝版本"
+            ></el-cascader>
         </el-form-item>
       </el-row>
       <el-row
@@ -603,14 +611,14 @@
 <script>
 import { vipResetTypeList, memberEnumList } from "@/utils/searchArray";
 import { getOnlineMun } from "@/api/vipSeting";
-
 const MIN_NUMBER = 1;
 const MAX_NUMBER = 999;
 export default {
   props: [
+    "organ",
     "payForm",
-    "activeType",
     "remberList",
+    "activeType",
     "isDisabled",
     "activityChannel"
   ],
@@ -625,6 +633,8 @@ export default {
     };
   },
   async mounted() {
+    
+
     const res1 = await getOnlineMun();
 
     let tempObj = JSON.parse(res1.data.config);

+ 48 - 3
src/views/categroyManager/productSystem/api.js

@@ -13,6 +13,24 @@ export function getAllmemberRank(data) {
   })
 }
 
+// 获取所属分部会员列表
+export function getAllMemberFindByOrganIds(data, status = false) {
+  return request2({
+    url: api + '/memberRankSetting/findByOrganIds?organFeeFlag=' + status,
+    method: 'post',
+    data
+  })
+}
+
+// 获取所有会员列表
+export function api_getMemberRankSetting(data) {
+  return request2({
+    url: api + '/memberRankOrganizationFeeMapper/getMemberRankSetting',
+    method: 'post',
+    data
+  })
+}
+
 // 新增会员类型
 export function addMemberRank(data) {
   return request2({
@@ -22,11 +40,12 @@ export function addMemberRank(data) {
   })
 }
 
+
 export function getmemberRankList(data) {
   return request2({
     url: api + '/memberRankSetting/queryPage',
-    method: 'get',
-    params: data
+    method: 'post',
+    data
   })
 }
 
@@ -45,7 +64,6 @@ export function resetMemberRank(data) {
     url: api + '/memberRankSetting/update',
     method: 'post',
     data: data,
-
   })
 }
 
@@ -58,6 +76,15 @@ export function addMemberOrganizationFeeMapper(data) {
   })
 }
 
+// 新增会员收费
+export function addMemberOrganizationFeeMapperV2(data) {
+  return request2({
+    url: api + '/memberRankOrganizationFeeMapper/addV2',
+    method: 'post',
+    data: data
+  })
+}
+
 export function getmemberRankOrganizationFeeMapper(data) {
   return request2({
     url: api + '/memberRankOrganizationFeeMapper/queryPage',
@@ -84,3 +111,21 @@ export function resetMemberOrganizationFeeMapper(data) {
     requestType: 'json'
   })
 }
+
+
+// 分类树状列表
+export function api_memberRankCategoryTree(data) {
+  return request2({
+    url: api + '/memberRankSetting/categoryTree',
+    method: 'get',
+    params: data,
+  })
+}
+
+// 删除
+export function api_memberRankDel(data) {
+  return request2({
+    url: api + '/memberRankSetting/del/' + data.id,
+    method: 'post'
+  })
+}

+ 87 - 72
src/views/categroyManager/productSystem/memberFeeSet.vue

@@ -2,7 +2,7 @@
   <div class="m-container">
     <h2>
       <div class="squrt"></div>
-      云练习收费标准
+      学练宝收费标准
     </h2>
     <div
       class="m-core"
@@ -22,7 +22,7 @@
           <el-input
             v-model.trim="searchForm.search"
             clearable
-            placeholder="云练习名称"
+            placeholder="学练宝名称"
           ></el-input>
         </el-form-item>
         <el-form-item prop="organId">
@@ -66,8 +66,8 @@
         <el-table-column
           align="left"
           prop="rankName"
-          label="云练习名称"
-          width="90px"
+          label="学练宝名称"
+          width="120px"
         ></el-table-column>
         <el-table-column align="left" prop="type" label="月收费">
           <template slot-scope="scope">
@@ -93,7 +93,7 @@
             </div>
           </template>
         </el-table-column>
-        <el-table-column align="left" prop="type" label="季度收费">
+        <!-- <el-table-column align="left" prop="type" label="季度收费">
           <template slot-scope="scope">
             <div>
               <p>
@@ -103,12 +103,6 @@
                     | hasMoneyFormat
                 }}
               </p>
-              <!-- <p>
-              零售:
-              {{
-                scope.row.memberFeeSetting.currentQuarterlyFee | hasMoneyFormat
-              }}
-            </p> -->
               <p>
                 原价:
                 {{
@@ -126,7 +120,7 @@
               </div>
             </div>
           </template>
-        </el-table-column>
+        </el-table-column> -->
         <el-table-column align="left" prop="type" label="半年收费">
           <template slot-scope="scope">
             <div>
@@ -228,8 +222,8 @@
     </div>
     <emptyPage
       @submit="addFee"
-      title="云练习收费标准"
-      btnTitle="新建云练习收费标准"
+      title="学练宝收费标准"
+      btnTitle="新建学练宝收费标准"
       :context="context"
       v-if="!(tableList.length > 0 || rules.page > 1) && contextFlag"
     />
@@ -248,17 +242,20 @@
         <div class="wrap">
           <el-form-item
             label="所属分部"
-            prop="organId"
+            prop="organIds"
             :rules="[{ required: true, message: '请选择分部' }]"
             :label-width="formLabelWidth"
           >
             <el-select
-              :disabled="addDisabled"
+              :disabled="addDisabled || pageType === 'update'"
               class="multiple"
               filterable
-              v-model.trim="form.organId"
+              v-model.trim="form.organIds"
               clearable
+              multiple
+              :collapse-tags="true"
               placeholder="请选择分部"
+              @change="getAllMember"
             >
               <el-option
                 v-for="(item, index) in selects.branchs"
@@ -269,26 +266,20 @@
             </el-select>
           </el-form-item>
           <el-form-item
-            label="云练习名称"
+            label="学练宝版本"
             prop="memberRankSettingId"
-            :rules="[{ required: true, message: '请选择云练习' }]"
+            :rules="[{  required: true, message: '请选择学练宝版本' }]"
             :label-width="formLabelWidth"
           >
-            <el-select
-              disabled
-              class="multiple"
+          <el-cascader
               filterable
               v-model.trim="form.memberRankSettingId"
               clearable
-              placeholder="请选择云练习"
-            >
-              <el-option
-                v-for="(item, index) in remberList"
-                :key="index"
-                :label="item.name"
-                :value="item.id"
-              ></el-option>
-            </el-select>
+              placeholder="请选择学练宝版本"
+              :disabled="addDisabled"
+              :options="remberList"
+              :props="{ value: 'id', label: 'name' }"
+            ></el-cascader>
           </el-form-item>
         </div>
 
@@ -390,7 +381,7 @@
           </el-form-item>
         </div>
 
-        <div class="lineTitle">季度收费</div>
+        <!-- <div class="lineTitle">季度收费</div>
 
         <div class="wrap">
           <el-form-item
@@ -485,7 +476,7 @@
               >
             </el-input>
           </el-form-item>
-        </div>
+        </div> -->
 
         <div class="lineTitle">半年收费</div>
 
@@ -691,10 +682,9 @@
   </div>
 </template>
 <script>
-import numeral from "numeral";
 import {
-  getAllmemberRank,
-  addMemberOrganizationFeeMapper,
+  api_getMemberRankSetting,
+  addMemberOrganizationFeeMapperV2,
   getmemberRankOrganizationFeeMapper,
   getmemberOrganizationFeeMapperkDetail,
   resetMemberOrganizationFeeMapper
@@ -738,8 +728,8 @@ export default {
         groupPurchaseMonthFee: "",
         groupPurchaseQuarterlyFee: "",
         groupPurchaseYearFee: "",
-        organId: "",
-        memberRankSettingId: "",
+        organIds: [],
+        memberRankSettingId: [],
         incomeMonthFee: "", // 月经营报表
         incomeQuarterlyFee: "", // 季度经营报表
         incomeHalfYearFee: "", // 半年经营报表
@@ -758,26 +748,31 @@ export default {
         maxYearFee: null
       },
       context:
-        "云练习收费标准,可根据各分部的实际情况为分部制定不同的售价标准,设置完成后,各分部为学员创建云练习缴费时默认以此处设置的价格向学员收费。",
+        "学练宝收费标准,可根据各分部的实际情况为分部制定不同的售价标准,设置完成后,各分部为学员创建学练宝缴费时默认以此处设置的价格向学员收费。",
       contextFlag: false
     };
   },
   async mounted() {
     await this.$store.dispatch("setBranchs");
-    // 获取所有的会员
-    try {
-      const res = await getAllmemberRank();
-      this.remberList = res.data;
-      // 默认选中第一个
-      if (this.pageType == "create" && this.remberList.length > 0) {
-        this.form.memberRankSettingId = this.remberList[0].id;
-      }
-    } catch {}
-
+    
     this.getList();
     this.getRules();
   },
   methods: {
+    async getAllMember() {
+      // 获取所有的会员
+      try {
+        const res = await api_getMemberRankSetting({
+          organIds: this.form.organIds.join(','),
+          id: this.form.outId
+        });
+        this.remberList = res.data;
+        // 默认选中第一个
+        // if (this.pageType == "create" && this.remberList.length > 0) {
+        //   this.form.memberRankSettingId = this.remberList[0].id;
+        // }
+      } catch {}
+    },
     async getRules() {
       try {
         const res = await sysConfigList({ group: "DEFAULT" });
@@ -790,13 +785,8 @@ export default {
             if (itemValue) {
               this.rulesForm = itemValue;
             }
-            // this.$set(this.form, item.id, item.paranValue);
           }
-          // this.form[item.paramName] = item.paranValue
-          // this.$set(this.form, item.id, item.paranValue);
         });
-        // this.$forceUpdate()
-        // console.log(this.form);
       } catch (e) {
         console.log(e);
       }
@@ -835,18 +825,19 @@ export default {
         incomeQuarterlyFee: "", // 季度经营报表
         incomeHalfYearFee: "", // 半年经营报表
         incomeYearFee: "", // 年经营报表
-        organId: "",
-        memberRankSettingId: ""
+        organIds: [],
+        memberRankSettingId: []
       }),
         this.$refs[ruleForm].resetFields();
     },
     addFee() {
       this.title = "新增收费标准";
       this.addDisabled = false;
+      this.form.outId = null;
       this.pageType = "create";
       this.branchStatus = true;
     },
-    resetFee(row, type) {
+    async resetFee(row, type) {
       if (type == "update") {
         this.title = "修改收费标准";
         this.pageType = "update";
@@ -862,29 +853,53 @@ export default {
           obj[key] = row.memberFeeSetting[key];
         }
       }
-
+      this.form.outId = row.id;
+      this.form.organIds = row.organId ? [row.organId] : []
+      await this.getAllMember()
       this.form = {
         ...obj,
-        organId: row.organId,
-        memberRankSettingId: row.memberRankSettingId,
-        outId: row.id
+        organIds: row.organId ? [row.organId] : [],
+        outId: row.id,
+        memberRankSettingId: row.memberRankSettingId ? this.formatParentId(row.memberRankSettingId, this.remberList) : [],
       };
+      
+      // this.form.memberRankSettingId = 
+      // this.$forceUpdate()
       this.branchStatus = true;
     },
+    formatParentId(id, list, ids = []) {
+      for (const item of list) {
+        if (item.children) {
+          const cIds = this.formatParentId(
+            id,
+            item.children,
+            [...ids, item.id]
+          );
+          if (cIds.includes(id)) {
+            return cIds;
+          }
+        }
+        if (item.id === id) {
+          return [...ids, id];
+        }
+      }
+      return ids;
+    },
     onSubmit() {
-      console.log(this.pageType);
       if (this.pageType == "look") {
         this.branchStatus = false;
         return;
       }
+      console.log(this.form)
       this.$refs.ruleForm.validate(async flag => {
         if (flag) {
+          const memberRankSettingId = this.form.memberRankSettingId.length > 0 ? this.form.memberRankSettingId[this.form.memberRankSettingId.length -1] : null
           if (this.pageType == "update") {
             try {
-              const res = await resetMemberOrganizationFeeMapper({
+               await resetMemberOrganizationFeeMapper({
                 memberFeeSetting: { ...this.form },
-                organId: this.form.organId,
-                memberRankSettingId: this.form.memberRankSettingId,
+                organId: this.form.organIds.join(','),
+                memberRankSettingId,
                 id: this.form.outId
               });
               this.$message.success("修改成功");
@@ -895,10 +910,10 @@ export default {
             }
           } else if (this.pageType == "create") {
             try {
-              const res = await addMemberOrganizationFeeMapper({
+               await addMemberOrganizationFeeMapperV2({
                 memberFeeSetting: { ...this.form },
-                organId: this.form.organId,
-                memberRankSettingId: this.form.memberRankSettingId
+                organIds: this.form.organIds.join(','),
+                memberRankSettingId
               });
               this.$message.success("新建成功");
               this.branchStatus = false;
@@ -926,7 +941,7 @@ export default {
       if (one >= min && one <= max) {
         return callback();
       }
-      return callback(new Error(`月度云练习定价应在${min}-${max}之间`));
+      return callback(new Error(`月度学练宝定价应在${min}-${max}之间`));
     },
     validateQuarterlyIncome(rule, value, callback) {
       const one = Number(value);
@@ -946,7 +961,7 @@ export default {
       if (one >= min && one <= max) {
         return callback();
       }
-      return callback(new Error(`季度云练习定价应在${min}-${max}之间`));
+      return callback(new Error(`季度学练宝定价应在${min}-${max}之间`));
     },
     validateHalfYearIncome(rule, value, callback) {
       const one = Number(value);
@@ -966,7 +981,7 @@ export default {
       if (one >= min && one <= max) {
         return callback();
       }
-      return callback(new Error(`半年云练习定价应在${min}-${max}之间`));
+      return callback(new Error(`半年学练宝定价应在${min}-${max}之间`));
     },
     validateYearIncome(rule, value, callback) {
       const one = Number(value);
@@ -986,7 +1001,7 @@ export default {
       if (one >= min && one <= max) {
         return callback();
       }
-      return callback(new Error(`年度云练习定价应在${min}-${max}之间`));
+      return callback(new Error(`年度学练宝定价应在${min}-${max}之间`));
     }
   },
   watch: {

+ 418 - 209
src/views/categroyManager/productSystem/memberSet.vue

@@ -2,7 +2,7 @@
   <div class="m-container">
     <h2>
       <div class="squrt"></div>
-      会员设置
+      学练宝设置
     </h2>
     <div class="m-core">
       <save-form
@@ -14,16 +14,34 @@
         :model.sync="searchForm"
       >
         <!-- 状态 指导老师 活动方案-->
-        <el-form-item>
+        <el-form-item prop="name">
+          <el-input
+            v-model.trim="searchForm.name"
+            clearable
+            placeholder="学练宝名称"
+          ></el-input>
+        </el-form-item>
+        <el-form-item prop="createTimer">
+          <el-date-picker
+            v-model.trim="searchForm.createTimer"
+            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 prop="updateName">
           <el-input
-            v-model.trim="searchForm.search"
+            v-model.trim="searchForm.updateName"
             clearable
-            placeholder="会员名称"
+            placeholder="更新人"
           ></el-input>
         </el-form-item>
         <el-form-item>
           <el-button native-type="submit" type="danger">搜索</el-button>
-          <!-- <el-button native-type="reset" type="primary">重置</el-button> -->
+          <el-button native-type="reset" type="primary">重置</el-button>
         </el-form-item>
       </save-form>
       <el-button
@@ -31,56 +49,44 @@
         style="margin-bottom: 20px"
         v-permission="'memberRankSetting/add'"
         @click="addLeave"
-        >新增会员等级</el-button
+        >新增</el-button
       >
       <el-table
         :data="tableList"
         :header-cell-style="{ background: '#EDEEF0', color: '#444' }"
+        row-key="id"
+        :tree-props="{ children: 'children', hasChildren: 'hasChildren' }"
       >
-        <el-table-column
-          align="center"
-          prop="name"
-          label="会员名称"
-        ></el-table-column>
-        <el-table-column align="center" prop="type" label="会员标识">
-          <template slot-scope="scope">
-            <el-image
-              style="width: 100px; height: 100px"
-              :src="scope.row.icon"
-              :preview-src-list="[scope.row.icon]"
-            >
-            </el-image>
-          </template>
-        </el-table-column>
-              <el-table-column align="center" prop="type" label="试用会员标识">
+        <el-table-column prop="name" label="学练宝名称"></el-table-column>
+
+        <el-table-column align="center" prop="intro" label="学练宝介绍">
           <template slot-scope="scope">
-            <el-image
-              style="width: 100px; height: 100px"
-              :src="scope.row.experienceIcon"
-              :preview-src-list="[scope.row.experienceIcon]"
-            >
-            </el-image>
+            <tooltip :content="scope.row.intro" />
           </template>
         </el-table-column>
-        <!-- <el-table-column
+        <el-table-column
           align="center"
-          prop="type"
-          label="是否新用户试用"
-        ></el-table-column> -->
+          prop="musicCount"
+          label="曲目数量"
+        ></el-table-column>
         <el-table-column
           align="center"
           prop="updateTime"
-          width="100px"
-          label="修改时间"
+          label="更新时间"
         ></el-table-column>
         <el-table-column
           align="center"
           prop="operatorName"
-          label="修改人"
+          label="更新人"
         ></el-table-column>
         <el-table-column align="center" label="操作">
           <template slot-scope="scope">
             <div>
+              <auth auths="memberRankSetting/get">
+                <el-button v-if="scope.row.parentId <= 0" type="text" @click="addLeave(scope.row)"
+                  >添加子版本</el-button
+                >
+              </auth>
               <!-- memberRankSetting/add -->
               <auth auths="memberRankSetting/get">
                 <el-button type="text" @click="resetMember(scope.row)"
@@ -95,11 +101,15 @@
                   >修改</el-button
                 >
               </auth>
+
+              <el-button type="text" @click="removeMember(scope.row)"
+                >删除</el-button
+              >
             </div>
           </template>
         </el-table-column>
       </el-table>
-      <pagination
+      <!-- <pagination
         save-key="memberSet"
         :total.sync="rules.total"
         sync
@@ -107,7 +117,7 @@
         :limit.sync="rules.limit"
         :page-sizes="rules.page_size"
         @pagination="getList"
-      />
+      /> -->
     </div>
     <el-dialog
       :title="title"
@@ -120,33 +130,45 @@
     >
       <el-form :model="form" :inline="true" ref="ruleForm">
         <el-alert
-          title="会员信息"
+          title="学练宝信息"
           type="info"
           :closable="false"
           style="margin-bottom: 20px"
         >
         </el-alert>
-
         <el-form-item
-          label="会员名称"
+          label="父级"
+          prop="parentName"
+          v-if="form.parentId"
+          :label-width="formLabelWidth"
+        >
+          <el-input
+            :disabled="true"
+            v-model.trim="form.parentName"
+            style="width: 620px"
+          ></el-input>
+        </el-form-item>
+        <el-form-item
+          label="学练宝名称"
           prop="name"
           :label-width="formLabelWidth"
-          :rules="[{ required: true, message: '请输入会员名称' }]"
+          :rules="[{ required: true, message: '请输入学练宝名称' }]"
         >
           <el-input
             :disabled="addDisabled"
             v-model.trim="form.name"
             autocomplete="off"
             style="width: 620px"
-            maxlength="10"
+            maxlength="15"
             show-word-limit
+            placeholder="请输入学练宝名称"
           ></el-input>
         </el-form-item>
         <el-form-item
-          label="会员介绍"
+          label="学练宝介绍"
           prop="intro"
           :label-width="formLabelWidth"
-          :rules="[{ required: true, message: '请输入会员介绍' }]"
+          :rules="[{ required: true, message: '请输入学练宝介绍' }]"
         >
           <el-input
             maxlength="200"
@@ -157,97 +179,91 @@
             type="textarea"
             :rows="5"
             style="width: 620px"
+            placeholder="请输入学练宝介绍"
           ></el-input>
         </el-form-item>
-        <el-form-item
-          label="会员标识"
-          prop="icon"
-          :label-width="formLabelWidth"
-          :rules="[{ required: true, message: '请上传会员标识' }]"
-        >
-          <!-- <upload
-            v-if="!addDisabled"
-            v-model="form.icon"
-            :imageWidthM="200"
-            :disabled="addDisabled"
-            :imageHeightM="200"
-          ></upload>
-          <img v-else :src="form.icon" alt="" width="120px" height="120px" /> -->
-          <image-cropper :options="cropperOptions" :disabled="addDisabled" :imgSize="2" :imageUrl="form.icon" @crop-upload-success="cropSuccess2" />
-          <!-- <p style="color: red" v-if="!addDisabled">
-            请上传200*200像素,大小2M以内,格式为jpg、png、gif图片
-          </p> -->
-        </el-form-item>
-        <br>
-        <el-form-item
-          label="试用会员标识"
-          prop="experienceIcon"
-          :label-width="formLabelWidth"
-          :rules="[{ required: true, message: '请上传试用会员标识' }]"
-        >
-          <!-- <upload
-            v-if="!addDisabled"
-            v-model="form.experienceIcon"
-            :imageWidthM="200"
-            :disabled="addDisabled"
-            :imageHeightM="200"
-          ></upload> -->
-          <image-cropper :options="cropperOptions" :disabled="addDisabled" :imgSize="2" :imageUrl="form.experienceIcon"  @crop-upload-success="cropSuccess" />
-          <!-- <img v-else :src="form.experienceIcon" alt="" width="120px" height="120px" /> -->
-          <p style="color: red" v-if="!addDisabled">
-            请上传大小2M以内,格式为jpg、png、gif图片
-          </p>
-        </el-form-item>
-        <!-- <br />
-        <el-form-item
-          label="是否新用户试用"
-          prop="name"
-          :label-width="formLabelWidth"
-        >
-          <el-select
-            v-model.trim="form.isProbationPeriod"
-            clearable
-            filterable
-            placeholder="请选择是否试用"
-          >
-            <el-option label="是" :value="true"></el-option>
-            <el-option label="否" :value="false"></el-option>
-          </el-select>
-        </el-form-item>
-        <el-form-item
-          label="试用期限"
-          prop="name"
-          :label-width="formLabelWidth"
-        >
-          <el-input
-            style="width: 200px"
-            v-model.trim="form.name"
-            autocomplete="off"
-          >
-            <template slot="append">天</template>
-          </el-input>
-        </el-form-item> -->
+
         <el-alert
-          title="会员权益"
+          title="学练宝权益"
           type="info"
           :closable="false"
           style="margin-bottom: 20px"
         >
         </el-alert>
-        <el-form-item :label="searchName" :label-width="formLabelWidth">
+        <el-form-item label="搜索:" :label-width="formLabelWidth">
           <el-input
             style="width: 210px"
-            v-model.trim="seachRoleValue"
+            v-model.trim="searchRoleValue"
+            placeholder="请输入搜索内容"
           ></el-input>
-          <el-button style="margin-left: 10px" type="danger" @click="seachRoles"
+          <el-button
+            style="margin-left: 10px"
+            type="danger"
+            @click="searchRoles"
             >搜索</el-button
           >
           <el-button type="primary" @click="onReSetRole">重置</el-button>
         </el-form-item>
         <br />
-        <el-form-item label="会员功能" :label-width="formLabelWidth">
+        <el-form-item label="学练宝内容" :label-width="formLabelWidth">
           <el-checkbox
+            :disabled="addDisabled || this.buyFlag && pageType === 'update'"
+            :indeterminate="isMemberIndeterminate"
+            @change="onCheckMemberAll"
+            v-model.trim="memberCheckAll"
+            >全选</el-checkbox
+          >
+          <div>
+            <el-tree
+              class="tree"
+              :data="treeMemberData"
+              show-checkbox
+              node-key="id"
+              @check="onTreeMemberCheck"
+              :filter-node-method="filterNode"
+              ref="memberTrees"
+              highlight-current
+              :default-checked-keys="memberCheckList"
+              :props="defaultProps"
+            >
+              <div slot-scope="{ node, data }">
+                {{ node.label }}
+              </div>
+            </el-tree>
+          </div>
+        </el-form-item>
+
+        <el-form-item label="学练宝内容2" :label-width="formLabelWidth">
+          <!-- <el-checkbox
             :disabled="addDisabled"
+            :indeterminate="isMemberIndeterminate"
+            @change="onCheckMemberAll"
+            v-model.trim="memberCheckAll"
+            >全选</el-checkbox
+          > -->
+          <div style="padding-top: 5px;">
+            <el-tree
+              class="tree"
+              :data="treeClassData"
+              show-checkbox
+              node-key="id"
+              @check="onTreeClassCheck"
+              :filter-node-method="filterNode"
+              ref="classTrees"
+              highlight-current
+              :default-checked-keys="classCheckList"
+              :props="defaultProps"
+            >
+              <div slot-scope="{ node, data }">
+                {{ node.label }}
+              </div>
+            </el-tree>
+          </div>
+        </el-form-item>
+
+        <el-form-item label="学练宝功能" :label-width="formLabelWidth">
+          <el-checkbox
+            :disabled="addDisabled || this.buyFlag && pageType === 'update'"
             :indeterminate="isIndeterminate"
             @change="onCheckAll"
             v-model.trim="checkAll"
@@ -259,9 +275,9 @@
               :data="treeData"
               show-checkbox
               node-key="id"
+              ref="trees"
               @check="onTreeCheck"
               :filter-node-method="filterNode"
-              ref="trees"
               highlight-current
               :default-checked-keys="checkList"
               :props="defaultProps"
@@ -280,73 +296,84 @@
         <el-button @click="onSubmit" type="primary">确 定</el-button>
       </span>
     </el-dialog>
-
   </div>
 </template>
 <script>
 import pagination from "@/components/Pagination/index";
 import Upload from "@/components/Upload/index";
-import ImageCropper from '@/components/ImageCropper'
+import ImageCropper from "@/components/ImageCropper";
+import Tooltip from "@/components/Tooltip/index";
 import {
   addMemberRank,
   getmemberRankList,
   getmemberRankDetail,
   resetMemberRank,
+  api_memberRankCategoryTree,
+  api_memberRankDel
 } from "./api";
+import { getTimeFormat } from "@/utils";
 import { getMemberPrivilegesItem } from "@/views/dictionaryManager/api";
 export default {
-  components: { pagination, Upload, ImageCropper },
+  components: { pagination, Upload, ImageCropper, Tooltip },
   name: "memberSet",
   data() {
     return {
       formLabelWidth: "120px",
       searchForm: {
-        search: null,
+        name: null,
+        updateName: null,
+        createTimer: []
       },
       rules: {
         // 分页规则
         limit: 10, // 限制显示条数
         page: 1, // 当前页
         total: 0, // 总条数
-        page_size: [10, 20, 40, 50], // 选择限制显示条数
+        page_size: [10, 20, 40, 50] // 选择限制显示条数
       },
       tableList: [],
       title: "新增会员等级",
       branchStatus: false,
       form: {
-        name: "",
-        icon: "",
-        into: "",
-        experienceIcon:'',
+        name: null,
+        intro: null,
+        memberCategoryIdList: [],
+        memberCourseTypeList: [],
+        memberPrivilegesItemIdList: []
       },
+      buyFlag: false, // 是否购买
       addDisabled: false,
       checkAll: false,
       isIndeterminate: false,
+      memberCheckAll: false,
+      isMemberIndeterminate: false,
       treeData: [],
+      treeMemberData: [],
+      treeClassData: [],
       defaultProps: {
         children: "children",
         label: "label",
-        disabled: this.addDisabled,
+        disabled: this.addDisabled
       },
       result: {
         roleName: null,
-        roleDesc: null,
+        roleDesc: null
       },
-      seachRoleValue: "",
+      classList: [],
+      classCount: 0,
+      memberRankList: [],
+      memberRankCount: 0,
+      searchRoleValue: "",
       silderList: [],
       slideCount: 0,
       pageType: "",
       allChildIds: [],
+      allMemberChildIds: [],
+      allClassChildIds: [],
       checkList: [],
-      searchName: "搜索\xa0\xa0\xa0\xa0\xa0\xa0\xa0",
-      cropperOptions: {
-        autoCrop: true, //是否默认生成截图框
-        autoCropWidth: 200, //默认生成截图框宽度
-        autoCropHeight: 200, //默认生成截图框高度
-        fixedBox: true, //是否固定截图框大小 不允许改变
-        previewsCircle: false, //预览图是否是圆形
-        title: '会员标识', //模态框上显示的标题
-      },
+      memberCheckList: [],
+      classCheckList: [],
+      searchName: ""
     };
   },
   async mounted() {
@@ -354,12 +381,12 @@ export default {
   },
   methods: {
     onFormClose(ruleForm) {
-      (this.form = {
+      this.form = {
         name: "",
         icon: "",
-        into: "",
-      }),
-        this.$refs.trees.setCheckedNodes([]);
+        into: ""
+      };
+      this.$refs.trees.setCheckedNodes([]);
       this.onTreeCheck();
       this.$refs[ruleForm].resetFields();
     },
@@ -367,30 +394,67 @@ export default {
       this.rules.page = 1;
       this.getList();
     },
-    onReSet() {},
-    cropSuccess(data) {
-      this.form.experienceIcon = data.data.url;
-    },
-    cropSuccess2(data) {
-      this.form.icon = data.data.url;
+    onReSet() {
+      this.searchForm = {
+        name: null,
+        updateName: null,
+        createTimer: []
+      };
+      this.search();
     },
     async getList() {
       try {
+        // this.tableList = []
+        let { createTimer, ...reset } = this.searchForm;
         const res = await getmemberRankList({
-          search: this.searchForm.search,
-          rows: this.rules.limit,
-          page: this.rules.page,
+          ...reset,
+          ...getTimeFormat(
+            createTimer,
+            ["updateStartTime", "updateEndTime"],
+            "YYYY-MM-DD"
+          )
+          // rows: this.rules.limit,
+          // page: this.rules.page,
         });
-        this.tableList = res.data.rows;
-        this.rules.total = res.data.total;
+        this.tableList = res.data;
+        // this.rules.total = res.data.total;
       } catch {}
     },
-    async addLeave() {
+    async addLeave(row) {
       this.checkList = [];
-      this.title = "新增会员等级";
+      this.memberCheckList = [];
+      this.classCheckList = [];
+      this.isIndeterminate = false;
+      this.checkAll = false;
+      this.isMemberIndeterminate = false;
+      this.memberCheckAll = false;
+
+      this.title = "新增";
+      // 添加新增
+      this.form.name = null;
+      this.form.intro = null;
+      if (row) {
+        this.form.parentId = row.id;
+        this.form.parentName = row.name
+      } else {
+        this.form.parentId = 0
+      }
+      
       this.addDisabled = false;
       this.pageType = "create";
-      await this.getNewTree();
+      await this.getMemberRankList(this.form.parentId || null);
+      this.memberRankCount = 0;
+      this.treeMemberData = await this.setMemberTableData(
+        this.memberRankList,
+        this.addDisabled
+      );
+      this.classCount = 0;
+      this.treeClassData = await this.setMemberTableData(
+        this.classList,
+        this.addDisabled,
+        "class"
+      );
+      await this.getNewTree(this.form.parentId || null);
       this.slideCount = 0;
       this.treeData = await this.setTableData(
         this.silderList,
@@ -399,16 +463,26 @@ export default {
       this.branchStatus = true;
     },
     onSubmit() {
-      this.$refs.ruleForm.validate(async (flag) => {
+      this.$refs.ruleForm.validate(async flag => {
         if (flag) {
-          let tempIds = this.$refs.trees.getCheckedKeys();
-          let halfIds = this.$refs.trees.getHalfCheckedKeys();
-          let allIds = [...tempIds, ...halfIds];
+          const tempIds = this.$refs.trees.getCheckedKeys();
+          const halfIds = this.$refs.trees.getHalfCheckedKeys();
+          const allIds = [...tempIds, ...halfIds];
+
+          const memberTempIds = this.$refs.memberTrees.getCheckedKeys();
+          const memberHalfIds = this.$refs.memberTrees.getHalfCheckedKeys();
+          const memberAllIds = [...memberTempIds, ...memberHalfIds];
+
+          const classTempIds = this.$refs.classTrees.getCheckedKeys();
+          const classHalfIds = this.$refs.classTrees.getHalfCheckedKeys();
+          const classAllIds = [...classTempIds, ...classHalfIds];
           if (this.pageType == "update") {
             try {
-              const res = await resetMemberRank({
+              await resetMemberRank({
                 ...this.form,
                 memberPrivilegesItemIdList: allIds,
+                memberCategoryIdList: memberAllIds,
+                memberCourseTypeList: classAllIds
               });
               this.$message.success("修改成功");
               this.branchStatus = false;
@@ -416,11 +490,13 @@ export default {
             } catch {}
           } else if (this.pageType == "create") {
             try {
-              const res = await addMemberRank({
+              await addMemberRank({
                 ...this.form,
                 memberPrivilegesItemIdList: allIds,
+                memberCategoryIdList: memberAllIds,
+                memberCourseTypeList: classAllIds
               });
-              this.$message.success("新建会员成功");
+              this.$message.success("新建成功");
               this.branchStatus = false;
               this.getList();
             } catch {}
@@ -430,6 +506,15 @@ export default {
         }
       });
     },
+    onCheckMemberAll(val) {
+      if (val) {
+        // 先去掉半选
+        this.isMemberIndeterminate = false;
+        this.$refs.memberTrees.setCheckedNodes(this.treeMemberData);
+      } else {
+        this.$refs.memberTrees.setCheckedNodes([]);
+      }
+    },
     onCheckAll(val) {
       if (val) {
         // 先去掉半选
@@ -439,6 +524,13 @@ export default {
         this.$refs.trees.setCheckedNodes([]);
       }
     },
+    onTreeMemberCheck() {
+      let checkTree = this.$refs.memberTrees.getCheckedKeys();
+      this.memberCheckAll = checkTree.length >= this.memberRankCount;
+      this.isMemberIndeterminate =
+        checkTree.length > 0 && checkTree.length < this.memberRankCount;
+    },
+    onTreeClassCheck() {},
     onTreeCheck() {
       let checkTree = this.$refs.trees.getCheckedKeys();
       this.checkAll = checkTree.length >= this.slideCount;
@@ -449,25 +541,26 @@ export default {
       if (!value) return true;
       return data.label.indexOf(value) !== -1;
     },
-    seachRoles() {
-      this.$refs.trees.filter(this.seachRoleValue);
+    searchRoles() {
+      this.$refs.memberTrees.filter(this.searchRoleValue);
+      this.$refs.classTrees.filter(this.searchRoleValue);
+      this.$refs.trees.filter(this.searchRoleValue);
     },
     onReSetRole() {
-      this.seachRoleValue = "";
-      // this.data = this.setTableData(this.silderList);
-      this.$refs.trees.filter(this.seachRoleValue);
-      // console.log(this.data);
+      this.searchRoleValue = "";
+      this.$refs.memberTrees.filter(this.searchRoleValue);
+      this.$refs.classTrees.filter(this.searchRoleValue);
+      this.$refs.trees.filter(this.searchRoleValue);
     },
     setTableData(result, disabled) {
       let list = [];
-
-      list = result.map((res) => {
+      list = result.map(res => {
         let tempList = {};
         tempList = {
           id: res.id,
           name: res.name,
           label: res.name,
-          disabled: disabled ? disabled : false,
+          disabled: disabled ? disabled : false
         };
         this.slideCount++;
         if (res.memberPrivilegesItems && res.memberPrivilegesItems.length > 0) {
@@ -480,90 +573,206 @@ export default {
       });
       return list;
     },
+    setMemberTableData(result, disabled, type = "music") {
+      let list = [];
+      list = result.map(res => {
+        let tempList = {};
+        tempList = {
+          id: res.id,
+          name: res.name,
+          label: res.name,
+          disabled: disabled ? disabled : false
+        };
+        if (type === "music") {
+          this.memberRankCount++;
+        } else {
+          this.classCount++;
+        }
+        if (
+          res.sysMusicScoreCategoriesList &&
+          res.sysMusicScoreCategoriesList.length > 0
+        ) {
+          tempList.children = this.setMemberTableData(
+            res.sysMusicScoreCategoriesList,
+            disabled
+          );
+        }
+        return tempList;
+      });
+      return list;
+    },
+    removeMember(row) {
+      this.$confirm("是否删除该学练宝设置?", "提示", {
+        confirmButtonText: "确定",
+        cancelButtonText: "取消",
+        type: "warning"
+      })
+        .then(async () => {
+          await api_memberRankDel({ id: row.id });
+          this.$message.success("删除成功");
+          this.getList()
+        })
+        .catch(() => {});
+    },
     async resetMember(row, type) {
       this.branchStatus = true;
       await this.resetTree(row);
+      let tempStatus = false
       if (type) {
-        this.title = "修改会员等级";
+        this.title = "修改";
         this.pageType = "update";
         this.addDisabled = false;
-        this.slideCount = 0;
-        this.treeData = await this.setTableData(
-          this.silderList,
-          this.addDisabled
-        );
+        tempStatus = this.buyFlag
       } else {
         this.addDisabled = true;
-        this.title = "查看会员等级";
+        tempStatus = true;
+        this.title = "查看";
         this.pageType = "";
-        this.slideCount = 0;
-        this.treeData = await this.setTableData(
-          this.silderList,
-          this.addDisabled
-        );
       }
+      this.slideCount = 0;
+      this.treeData = await this.setTableData(
+        this.silderList,
+        tempStatus
+      );
+
+      this.memberRankCount = 0;
+      this.treeMemberData = await this.setMemberTableData(
+        this.memberRankList,
+        tempStatus
+      );
+
+      this.classCount = 0;
+      this.treeClassData = await this.setMemberTableData(
+        this.classList,
+        tempStatus,
+        "class"
+      );
     },
     //递归获取到所有的为子级的ID
-    getParent(checkIds, data) {
+    getParent(checkIds, data, type = "tree") {
       let removeIds = JSON.parse(JSON.stringify(checkIds));
-      this.getAllChildIds(data);
-      let tempAllChildIds = this.allChildIds;
+      this.getAllChildIds(data, type);
+      let tempAllChildIds = [];
+      if (type === "tree") {
+        tempAllChildIds = this.allChildIds;
+      } else if (type === "member") {
+        tempAllChildIds = this.allMemberChildIds;
+      } else if (type === "class") {
+        tempAllChildIds = this.allClassChildIds;
+      }
+      
       for (let i = checkIds.length; i > 0; i--) {
-        if (!tempAllChildIds.includes(checkIds[i - 1])) {
+        if (!tempAllChildIds.includes(Number(checkIds[i - 1]))) {
           removeIds.splice(i - 1, 1);
         }
       }
       return removeIds;
     },
-    getAllChildIds(data) {
+    getAllChildIds(data, type) {
       // 获取所有最子集编号
-      let child = this.allChildIds;
-      let tempList = [];
-      data.forEach((item, index) => {
+      data.forEach(item => {
         let temp = [];
         if (item.children && item.children.length > 0) {
-          temp = this.getAllChildIds(item.children);
+          temp = this.getAllChildIds(item.children, type);
         } else {
-          child.push(item.id);
+          if (type === "member") {
+            this.allMemberChildIds.push(item.id);
+          } else if (type === "class") {
+            this.allClassChildIds.push(item.id);
+          } else if (type === "tree") {
+            this.allChildIds.push(item.id);
+          }
         }
       });
     },
     async resetTree(row) {
       try {
-        this.treeData = await this.getNewTree();
-        const res = await getmemberRankDetail({ memberRankSettingId: row.id });
-        this.form = { ...res.data };
-
+        await this.getNewTree(row.parentId || null);
+        await this.getMemberRankList(row.parentId || null);
+        this.treeMemberData = await this.setMemberTableData(
+          this.memberRankList
+        );
+        this.treeClassData = await this.setMemberTableData(
+          this.classList,
+          false,
+          "class"
+        );
+        this.treeData = await this.setTableData(this.silderList);
+        const { data } = await getmemberRankDetail({
+          memberRankSettingId: row.id
+        });
+        this.buyFlag = data.buyFlag || false
+        this.form = { ...data };
+        console.log(row.parentId, 'parentId')
+        if(row.parentId) {
+          this.form.parentId = row.parentId;
+          this.form.parentName = row.parentName
+        }
+        
         this.checkAll =
-          res.data.memberPrivilegesItemIdList?.length >= this.slideCount ||
-          false;
+          data.memberPrivilegesItemIdList?.length >= this.slideCount && data.memberPrivilegesItemIdList?.length > 0 || false;
         // 反写树的值
         this.isIndeterminate =
-          res.data.memberPrivilegesItemIdList?.length > 0 &&
-          res.data.memberPrivilegesItemIdList?.length < this.slideCount;
+          data.memberPrivilegesItemIdList?.length > 0 &&
+          data.memberPrivilegesItemIdList?.length < this.slideCount;
 
-        this.checkList = res.data.memberPrivilegesItemIdList;
+        this.checkList = data.memberPrivilegesItemIdList;
         let tSplice = this.getParent(
-          res.data.memberPrivilegesItemIdList || [],
+          data.memberPrivilegesItemIdList || [],
           this.treeData
         );
         this.checkList = tSplice;
         this.$nextTick(() => {
           this.$refs.trees.setCheckedKeys(this.checkList);
         });
+
+        this.memberCheckAll = data.memberCategoryIdList?.length >= this.memberRankCount && data.memberCategoryIdList?.length > 0 || false;
+        this.isMemberIndeterminate = data.memberCategoryIdList?.length > 0 && data.memberCategoryIdList?.length < this.memberRankCount;
+        this.memberCheckList = data.memberCategoryIdList;
+        const mSplice = this.getParent(data.memberCategoryIdList || [], this.treeMemberData, 'member')
+        this.memberCheckList = mSplice;
+        this.$nextTick(() => {
+          this.$refs.memberTrees.setCheckedKeys(this.memberCheckList);
+        });
+
+        // this.classCheckAll =
+        //   data.memberCourseTypeList?.length >= this.memberRankCount || false;
+        // this.isClassIndeterminate =
+        //   data.memberCourseTypeList?.length > 0 &&
+        //   data.memberCourseTypeList?.length < this.memberRankCount;
+
+        this.classCheckList = data.memberCourseTypeList;
+        const cSplice = this.getParent(
+          data.memberCourseTypeList || [],
+          this.treeClassData,
+          "class"
+        );
+        this.classCheckList = cSplice;
+        this.$nextTick(() => {
+          this.$refs.classTrees.setCheckedKeys(this.classCheckList);
+        });
       } catch (e) {
         console.log(e);
       }
     },
-    async getNewTree() {
+    async getNewTree(parentId) {
       try {
-        const resTree = await getMemberPrivilegesItem();
+        const resTree = await getMemberPrivilegesItem({ parentMemberId: parentId });
         this.silderList = resTree.data;
         this.slideCount = 0;
-        return this.setTableData(resTree.data);
       } catch {}
     },
-  },
+    async getMemberRankList(parentId) {
+      try {
+        const { data } = await api_memberRankCategoryTree({ parentMemberId: parentId });
+        this.memberRankList = data.musicScoreCategories || [];
+        this.memberRankCount = 0;
+
+        this.classList = data.lessonCategories || [];
+        this.classCount = 0;
+      } catch {}
+    }
+  }
 };
 </script>
 <style lang="scss" scoped>

+ 6 - 6
src/views/categroyManager/specialSetup/cloudTeacherFee.vue

@@ -42,14 +42,14 @@
         >
           <el-table-column align="center" prop="organName" label="分部">
           </el-table-column>
-          <el-table-column align="center" prop="price" label="云练习价格(元)">
+          <el-table-column align="center" prop="price" label="学练宝价格(元)">
             <template slot-scope="scope">
               {{ scope.row.price | moneyFormat }}
             </template>
           </el-table-column>
           <el-table-column align="center" prop="price">
             <template #header>
-              云练习<sup>+</sup>价格(元)
+              学练宝<sup>+</sup>价格(元)
             </template>
             <template slot-scope="scope">
               {{ scope.row.plusPrice | moneyFormat }}
@@ -100,7 +100,7 @@
           </el-select>
         </el-form-item>
         <el-form-item
-          label="云练习价格"
+          label="学练宝价格"
           prop="price"
           :label-width="formLabelWidth"
         >
@@ -113,7 +113,7 @@
         </el-form-item>
         <el-form-item prop="plusPrice" :label-width="formLabelWidth">
           <template #label>
-            云练习<sup>+</sup>价格
+            学练宝<sup>+</sup>价格
           </template>
           <el-input
             v-model.number="form.plusPrice"
@@ -150,8 +150,8 @@ export default {
       },
       formActionTitle: "create",
       formTitle: {
-        create: "添加分部云练习价格",
-        update: "修改分部云练习价格"
+        create: "添加分部学练宝价格",
+        update: "修改分部学练宝价格"
       },
       typeStatus: false, // 添加教学点
       formLabelWidth: "120px",

+ 58 - 30
src/views/categroyManager/vipNewActive.vue

@@ -30,6 +30,8 @@
         <payInfo
           :payForm="payForm"
           ref="payInfo"
+          :remberList="remberList"
+          :organ="baseForm.organ"
           :activeType="baseForm.activityType"
           :activityChannel="baseForm.activityChannel"
           @changeCourseType="changeCourseType"
@@ -37,7 +39,6 @@
           @chageSalary="chageSalary"
           @resetFixedCourseNumFlag="resetFixedCourseNumFlag"
           v-if="active == 2"
-          :remberList="remberList"
           :isDisabled="isDisabled || statuss != 'DRAFT'"
         />
         <salaryInfo
@@ -94,7 +95,6 @@
 import baseInfo from "./modals/baseInfo.vue";
 import payInfo from "./modals/payInfo.vue";
 import salaryInfo from "./modals/salaryInfo.vue";
-import { getAllmemberRank } from "@/views/categroyManager/productSystem/api";
 import merge from "webpack-merge";
 import {
   vipGroupCategory,
@@ -102,6 +102,7 @@ import {
   resetVipActive,
   getVipGroupActivity
 } from "@/api/vipSeting";
+import { getAllMemberFindByOrganIds } from "@/views/categroyManager/productSystem/api";
 import cleanDeep from "clean-deep";
 const payBaseForm = {
   courseType: "",
@@ -162,6 +163,7 @@ export default {
     return {
       status: "DRAFT",
       active: 1,
+      remberList: [],
       baseForm: {
         name: "",
         description: "",
@@ -182,20 +184,21 @@ export default {
       },
       salaryForm: {
         ...baseSalaryForm
-      },
-      remberList: []
+      }
     };
   },
   async mounted() {
-    try {
-      const res = await getAllmemberRank({ isDefault: 0 });
-      this.remberList = res.data;
-    } catch {}
 
     if (this.$route.query.id) {
       this.baseForm.id = this.$route.query.id;
-      const rusult = await getVipGroupActivity({ id: this.$route.query.id });
-      this.formatDetail(rusult.data);
+      const result = await getVipGroupActivity({ id: this.$route.query.id });
+      const organ = result.data.organId.split(",").map(organ => {
+        return Number(organ);
+      })
+      if(organ && organ.length > 0) {
+        await this.getMemberList(organ)
+      }
+      this.formatDetail(result.data);
       this.$router;
     } else {
       this.payInfo = { ...payBaseForm };
@@ -215,12 +218,13 @@ export default {
       });
       // }
     },
-    next() {
+    async next() {
       let flags = true;
       if (this.active == 1) {
-        this.$refs.baseForm.$refs.vipform.validate(flag => {
+        this.$refs.baseForm.$refs.vipform.validate((flag) => {
           flags = flag;
         });
+        await this.getMemberList(this.baseForm.organ)
         // 验证表单1
       } else if (this.active == 2) {
         // 验证表单2
@@ -362,9 +366,25 @@ export default {
       ) {
         this.payForm.discount = 100;
       }
+
+      let rankId = null;
+      const memberRankId = this.payForm.memberRankId
+      if(memberRankId && memberRankId.length > 0) {
+        rankId = memberRankId[memberRankId.length - 1]
+      }
+
+
+      let giveRankId = null;
+      const giveMemberRankId = this.payForm.giveMemberRankId
+      if(giveMemberRankId && giveMemberRankId.length > 0) {
+        giveRankId = giveMemberRankId[giveMemberRankId.length - 1]
+      }
+
       let obj = {
         ...this.baseForm,
         ...this.payForm,
+        memberRankId: rankId,
+        giveMemberRankId: giveRankId,
         organId,
         coursesStartTime,
         coursesEndTime,
@@ -427,6 +447,30 @@ export default {
         });
       }
     },
+    formatParentId(id, list, ids = []) {
+      for (const item of list) {
+        if (item.children) {
+          const cIds = this.formatParentId(
+            id,
+            item.children,
+            [...ids, item.id]
+          );
+          if (cIds.includes(id)) {
+            return cIds;
+          }
+        }
+        if (item.id === id) {
+          return [...ids, id];
+        }
+      }
+      return ids;
+    },
+    async getMemberList(organ) {
+      try {
+        const memberInfo = await getAllMemberFindByOrganIds(organ)
+        this.remberList = memberInfo.data || []
+      } catch {}
+    },
     formatDetail(data) {
       this.status = data.status;
       for (let item in data) {
@@ -464,22 +508,6 @@ export default {
         id: this.$route.query.id,
         activityChannel: data.activityChannel
       });
-      // this.baseForm = {
-      //   name: data.name,
-      //   description: data.description,
-      //   activeTime,
-      //   courseTime,
-      //   marketPrice: data.marketPrice,
-      //   organ: data.organId.split(",").map((organ) => {
-      //     return Number(organ);
-      //   }),
-      //   activityType: data.activityType,
-      //   applyToStudentType,
-      //   studentMaxUsedTimes,
-      //   isPayToBalance: Number(data.payToBalance),
-      //   id: this.$route.query.id,
-      // };
-      // this.$set()
       //格式化payForm
       // console.log(data.vipGroupCategoryIdList
       //     .split(",")
@@ -499,7 +527,7 @@ export default {
         fixedCourseNumFlag: data.fixedCourseNumFlag,
         minCourseNum: data.minCourseNum,
         maxCourseNum: data.maxCourseNum,
-        memberRankId: data.memberRankId,
+        memberRankId: this.formatParentId(data.memberRankId, this.remberList),
         periodEnum: data.periodEnum,
         discount: data.discount,
         fullMinusCourseTimes: data.fullMinusCourseTimes,
@@ -509,7 +537,7 @@ export default {
           data.giveCategoryId * 1 ? data.giveCategoryId * 1 : null,
         giveSingleCourseTime: data.giveSingleCourseTime,
         giveCourseNum: data.giveCourseNum,
-        giveMemberRankId: data.giveMemberRankId,
+        giveMemberRankId: this.formatParentId(data.giveMemberRankId, this.remberList),
         givePeriod: data.givePeriodEnum,
         giveMemberTime: data.giveMemberTime ? data.giveMemberTime : null,
         giveAllowOnlineToOffline: data.giveAllowOnlineToOffline + "",

+ 2 - 2
src/views/couponManager/couponGiveList.vue

@@ -100,7 +100,7 @@
     </div>
     <!--  -->
     <el-dialog
-      title="激活云练习"
+      title="激活学练宝"
       :visible.sync="couponDetailVisible"
       width="1000px"
       append-to-body
@@ -108,7 +108,7 @@
       <div class="chioseWrap">
         <p>
           您将为以下 <span>{{ tableList.length }}</span
-          >位学员激活云练习,激活金额<span></span>元
+          >位学员激活学练宝,激活金额<span></span>元
         </p>
         <couponGiveChiose :tableList="tableList" />
       </div>

+ 2 - 2
src/views/courseCredentials/index.vue

@@ -268,7 +268,7 @@
               <span v-if="scope.row.practiceFlag">
                 网管课
               </span>
-              <span v-if="scope.row.memberFlag">云练习</span>
+              <span v-if="scope.row.memberFlag">学练宝</span>
 
               <span
                 v-if="
@@ -299,7 +299,7 @@
               <span v-if="scope.row.givePracticeFlag">
                 网管课
               </span>
-              <span v-if="scope.row.giveMemberFlag">云练习</span>
+              <span v-if="scope.row.giveMemberFlag">学练宝</span>
 
               <span
                 v-if="

+ 2 - 2
src/views/courseRulersManager/components/studentAttRules.vue

@@ -82,7 +82,7 @@
               }
             ]"
           >
-            学员每周使用云练习时长小于
+            学员每周使用学练宝时长小于
             <el-input v-model="form['106']" placeholder="请输入分钟数">
               <template slot="append"
                 >分钟</template
@@ -101,7 +101,7 @@
               }
             ]"
           >
-            学员每周使用云练习练习次数小于
+            学员每周使用学练宝练习次数小于
             <el-input v-model="form['107']" placeholder="请输入次数">
               <template slot="append"
                 >次</template

+ 1 - 1
src/views/courseRulersManager/components/teamRules.vue

@@ -191,7 +191,7 @@
               },
             ]"
           >
-            学员云练习有效期结束前
+            学员学练宝有效期结束前
             <el-input v-model="form[104]" >
               <template slot="append">天</template>
             </el-input>

+ 1 - 1
src/views/dictionaryManager/index.vue

@@ -3,7 +3,7 @@
   <div class="m-container">
     <h2>
       <div class="squrt"></div>
-      云练习功能字典
+      学练宝功能字典
     </h2>
     <div class="m-core">
       <save-form

+ 1 - 1
src/views/main/api.js

@@ -167,7 +167,7 @@ export const getMusicGroupPerformance = data =>
     params: data
   });
 
-// 获取云练习首页数据汇总
+// 获取学练宝首页数据汇总
 export const getCloudStudyStudentOverView = data =>
   request2({
     url: "/api-web/studentManage/getCloudStudyStudentOverView",

+ 2 - 2
src/views/main/cloudDate/exerciseDuration.vue

@@ -215,7 +215,7 @@ export default {
         this,
         {
           url: "/api-web/export/managerDownload",
-          fileName: "云练习练习时长.xls",
+          fileName: "学练宝练习时长.xls",
           method: "post",
           params: {
             exportEnum: "EXPORT_CLOUD_TEACHER_SUM",
@@ -224,7 +224,7 @@ export default {
             }
           }
         },
-        "您确定导出云练习练习时长?"
+        "您确定导出学练宝练习时长?"
       );
     },
     onDetail(row) {

+ 2 - 2
src/views/main/cloudDate/exerciseDurationDetail.vue

@@ -235,7 +235,7 @@ export default {
         this,
         {
           url: "/api-web/export/managerDownload",
-          fileName: "云练习练习时长.xls",
+          fileName: "学练宝练习时长.xls",
           method: "post",
           params: {
             exportEnum: "EXPORT_CLOUD_TEACHER_SUM_DETAIL",
@@ -245,7 +245,7 @@ export default {
             }
           }
         },
-        "您确定导出云练习练习时长?"
+        "您确定导出学练宝练习时长?"
       );
     },
     search() {

+ 4 - 4
src/views/main/cloudDate/organDate.vue

@@ -123,7 +123,7 @@
               <div class="titleCell">
                 <span>使用人数</span>
                 <el-tooltip placement="top" popper-class="mTooltip">
-                  <div slot="content">截止目前使用云练习的总人数</div>
+                  <div slot="content">截止目前使用学练宝的总人数</div>
                   <i
                     class="el-icon-question micon el-tooltip"
                     style="
@@ -180,7 +180,7 @@
               <div class="titleCell">
                 <span>新增使用人数</span>
                 <el-tooltip placement="top" popper-class="mTooltip">
-                  <div slot="content">当日第一次使用云练习的人数</div>
+                  <div slot="content">当日第一次使用学练宝的人数</div>
                   <i
                     class="el-icon-question micon el-tooltip"
                     style="
@@ -409,11 +409,11 @@ export default {
         this,
         {
           url: "/api-web/export/organStudentOverView",
-          fileName: "分部云练习数据.xls",
+          fileName: "分部学练宝数据.xls",
           method: "post",
           params: qs.stringify(params)
         },
-        "您确定导出分部云练习数据列表?"
+        "您确定导出分部学练宝数据列表?"
       );
     },
 

+ 4 - 4
src/views/main/cloudDate/organDateDetail.vue

@@ -4,7 +4,7 @@
     <el-page-header
       @back="goback"
       style="padding-bottom: 30px"
-      content="分部云练习数据详情"
+      content="分部学练宝数据详情"
     >
     </el-page-header>
 
@@ -93,7 +93,7 @@
                 <span>使用人数</span>
                 <el-tooltip placement="top" popper-class="mTooltip">
                   <div slot="content">
-                    指导老师关联的截止目前使用云练习的总人数
+                    指导老师关联的截止目前使用学练宝的总人数
                   </div>
                   <i
                     class="el-icon-question micon el-tooltip"
@@ -337,11 +337,11 @@ export default {
         this,
         {
           url: "/api-web/export/organTeacherMemberStudentData",
-          fileName: "分部云练习数据详情.xls",
+          fileName: "分部学练宝数据详情.xls",
           method: "post",
           params: qs.stringify(params)
         },
-        "您确定导出分部云练习数据详情列表?"
+        "您确定导出分部学练宝数据详情列表?"
       );
     }
   }

+ 4 - 4
src/views/main/cloudDate/organMemberList.vue

@@ -291,11 +291,11 @@ export default {
         this,
         {
           url: "/api-web/export/now",
-          fileName: "云练习数据汇总.xls",
+          fileName: "学练宝数据汇总.xls",
           method: "post",
           params: { exportEnum: "CLOUD_STUDY_STUDENT_OVER_VIEW" }
         },
-        "您确定导出云练习数据汇总?"
+        "您确定导出学练宝数据汇总?"
       );
     },
     async getList() {
@@ -375,11 +375,11 @@ export default {
     //     this,
     //     {
     //       url: "/api-web/export/organStudentOverView",
-    //       fileName: "分部云练习数据.xls",
+    //       fileName: "分部学练宝数据.xls",
     //       method: "post",
     //       params: qs.stringify(params)
     //     },
-    //     "您确定导出分部云练习数据列表?"
+    //     "您确定导出分部学练宝数据列表?"
     //   );
     // },
 

+ 5 - 5
src/views/main/cloudDate/organRankDetail.vue

@@ -3,7 +3,7 @@
     <el-page-header
       @back="goback"
       style="padding-bottom: 30px"
-      content="分部云练习数据"
+      content="分部学练宝数据"
     >
     </el-page-header>
     <save-form
@@ -134,7 +134,7 @@
             <div class="titleCell">
               <span>使用人数</span>
               <el-tooltip placement="top" popper-class="mTooltip">
-                <div slot="content">截止目前使用云练习的总人数</div>
+                <div slot="content">截止目前使用学练宝的总人数</div>
                 <i
                   class="el-icon-question micon el-tooltip"
                   style="
@@ -187,7 +187,7 @@
             <div class="titleCell">
               <span>新增使用人数</span>
               <el-tooltip placement="top" popper-class="mTooltip">
-                <div slot="content">当日第一次使用云练习的人数</div>
+                <div slot="content">当日第一次使用学练宝的人数</div>
                 <i
                   class="el-icon-question micon el-tooltip"
                   style="
@@ -444,11 +444,11 @@ export default {
         this,
         {
           url: "/api-web/export/cloudStudyStudentOverView",
-          fileName: "分部云练习数据排行.xls",
+          fileName: "分部学练宝数据排行.xls",
           method: "post",
           params: qs.stringify(params)
         },
-        "您确定导出分部云练习数据排行?"
+        "您确定导出分部学练宝数据排行?"
       );
     },
     goback() {

+ 5 - 5
src/views/main/cloudDate/organRanking.vue

@@ -161,7 +161,7 @@
               <div class="titleCell">
                 <span>当日新增使用人数</span>
                 <el-tooltip placement="top" popper-class="mTooltip">
-                  <div slot="content">当日第一次使用云练习的人数</div>
+                  <div slot="content">当日第一次使用学练宝的人数</div>
                   <i
                     class="el-icon-question micon el-tooltip"
                     style="
@@ -186,7 +186,7 @@
               <div class="titleCell">
                 <span>使用人数占比</span>
                 <el-tooltip placement="top" popper-class="mTooltip">
-                  <div slot="content">云练习当日使用人数 / 学员总数</div>
+                  <div slot="content">学练宝当日使用人数 / 学员总数</div>
                   <i
                     class="el-icon-question micon el-tooltip"
                     style="
@@ -316,7 +316,7 @@
                 <span>活跃度</span>
                 <el-tooltip placement="top" popper-class="mTooltip">
                   <div slot="content">
-                    当日使用过云练习的会员占比(生效中会员,含试用)
+                    当日使用过学练宝的会员占比(生效中会员,含试用)
                   </div>
                   <i
                     class="el-icon-question micon el-tooltip"
@@ -429,11 +429,11 @@ export default {
         this,
         {
           url: "/api-web/export/cloudStudyStudentOverView",
-          fileName: "分部云练习数据排行.xls",
+          fileName: "分部学练宝数据排行.xls",
           method: "post",
           params: qs.stringify(params)
         },
-        "您确定导出分部云练习数据排行?"
+        "您确定导出分部学练宝数据排行?"
       );
     },
     gotoDetail() {

+ 3 - 3
src/views/main/constant.js

@@ -79,12 +79,12 @@ export const descs = {
   eVipStudentNum: "如果是试用会员又是付费会员,则不算试用会员数",
   cloudStudyLivelyStudentNum:
     "过去四周内有三周及以上每周练习时长超过60分钟的学员人数",
-  newCloudStudyStudentNum: "第一次使用云练习的人数",
+  newCloudStudyStudentNum: "第一次使用学练宝的人数",
   cloudStudyTodayUseStudentNum: "今日有练习记录的学员人数",
   // "cloudStudyUseStudentNum":'累计使用的总人数',
   totalStudentNum: "进行中、暂停乐团的在读学员总数",
-  againBuyRate: "会员人数中,有多次云练习付费订单的学员数占比",
-  buyRate: "在读学员中云练习生效或待激活学员占比",
+  againBuyRate: "会员人数中,有多次学练宝付费订单的学员数占比",
+  buyRate: "在读学员中学练宝生效或待激活学员占比",
   waitActivateVipStudentNum: "待激活学员人数",
   effectiveVipStudentNum: "在读学员中会员生效人数",
   vipStudentRate: "会员人数/在读人数",

+ 4 - 4
src/views/main/coursewareDate/organDateDetail.vue

@@ -4,7 +4,7 @@
     <el-page-header
       @back="goback"
       style="padding-bottom: 30px"
-      content="分部云练习数据详情"
+      content="分部学练宝数据详情"
     >
     </el-page-header>
 
@@ -93,7 +93,7 @@
                 <span>使用人数</span>
                 <el-tooltip placement="top" popper-class="mTooltip">
                   <div slot="content">
-                    指导老师关联的截止目前使用云练习的总人数
+                    指导老师关联的截止目前使用学练宝的总人数
                   </div>
                   <i
                     class="el-icon-question micon el-tooltip"
@@ -337,11 +337,11 @@ export default {
         this,
         {
           url: "/api-web/export/organTeacherMemberStudentData",
-          fileName: "分部云练习数据详情.xls",
+          fileName: "分部学练宝数据详情.xls",
           method: "post",
           params: qs.stringify(params)
         },
-        "您确定导出分部云练习数据详情列表?"
+        "您确定导出分部学练宝数据详情列表?"
       );
     }
   }

+ 4 - 4
src/views/main/coursewareDate/organMemberList.vue

@@ -291,11 +291,11 @@ export default {
         this,
         {
           url: "/api-web/export/now",
-          fileName: "云练习数据汇总.xls",
+          fileName: "学练宝数据汇总.xls",
           method: "post",
           params: { exportEnum: "CLOUD_STUDY_STUDENT_OVER_VIEW" }
         },
-        "您确定导出云练习数据汇总?"
+        "您确定导出学练宝数据汇总?"
       );
     },
     async getList() {
@@ -375,11 +375,11 @@ export default {
     //     this,
     //     {
     //       url: "/api-web/export/organStudentOverView",
-    //       fileName: "分部云练习数据.xls",
+    //       fileName: "分部学练宝数据.xls",
     //       method: "post",
     //       params: qs.stringify(params)
     //     },
-    //     "您确定导出分部云练习数据列表?"
+    //     "您确定导出分部学练宝数据列表?"
     //   );
     // },
 

+ 1 - 1
src/views/main/index.vue

@@ -26,7 +26,7 @@
         <!-- <el-tab-pane
           v-if="permission('/cloudDate')"
           lazy
-          label="云练习数据"
+          label="学练宝数据"
           name="cloudDate"
         >
           <cloudDate v-if="activeKey === 'cloudDate'" />

+ 3 - 3
src/views/organManager/components/memberSetting.vue

@@ -2,7 +2,7 @@
 <template>
   <div>
     <el-alert
-      title="会员设置"
+      title="机构学练宝设置"
       type="info"
       :closable="false"
       style="margin-bottom: 20px"
@@ -48,7 +48,7 @@
           <div slot="append">元/月/人</div>
         </el-input>
       </el-form-item>
-      <el-form-item
+      <!-- <el-form-item
         label="季度会员激活价"
         prop="quarter_divide"
         :rules="[
@@ -64,7 +64,7 @@
         >
           <div slot="append">元/季/人</div>
         </el-input>
-      </el-form-item>
+      </el-form-item> -->
       <el-form-item
         label="半年会员激活价"
         prop="half_year_divide"

+ 311 - 0
src/views/organManager/components/memberSettingMore.vue

@@ -0,0 +1,311 @@
+<!--  -->
+<template>
+  <div>
+    <el-alert
+      title="机构学练宝设置"
+      type="info"
+      :closable="false"
+      style="margin-bottom: 20px"
+    ></el-alert>
+    <el-form ref="form" label-position="top" :model="form" :inline="true">
+      <el-row v-for="(item, index) in form.setting" :key="index">
+        <el-col :span="3">
+          <el-form-item
+            label="学练宝版本"
+            :prop="'setting.' + index + '.memberRankSettingId'"
+            :rules="[
+              { required: true, message: '请选择学练宝版本', trigger: 'blur' }
+            ]"
+            label-width="130px"
+          >
+            <el-cascader
+              v-model.trim="item.memberRankSettingId"
+              :disabled="isDisabled"
+              :options="teachList"
+              :props="{ value: 'id', label: 'name',  }"
+              :show-all-levels="false"
+              collapse-tags
+              clearable
+              placeholder="请选择学练宝版本"
+              @visible-change="(value) => onVisibleChange(value, item.memberRankSettingId)"
+            ></el-cascader>
+          </el-form-item>
+        </el-col>
+        <el-col :span="4">
+          <el-form-item
+            label="按天会员激活金额"
+            :prop="'setting.' + index + '.dayDivide'"
+            :rules="[
+              { required: true, message: '请输入会员激活金额', trigger: 'blur' }
+            ]"
+          >
+            <el-input
+              :disabled="isDisabled"
+              placeholder="请输入会员激活金额"
+              v-model="item.dayDivide"
+              @keyup.native="keyupEvent($event)"
+            >
+              <div slot="append">元/天/人</div>
+            </el-input>
+          </el-form-item>
+        </el-col>
+        <el-col :span="4">
+          <el-form-item
+            label="月度会员激活价"
+            :prop="'setting.' + index + '.monthDivide'"
+            :rules="[
+              { required: true, message: '请输入会员激活价', trigger: 'blur' }
+            ]"
+          >
+            <el-input
+              :disabled="isDisabled"
+              placeholder="请输入会员激活价"
+              v-model="item.monthDivide"
+              @keyup.native="keyupEvent($event)"
+              
+            >
+              <div slot="append">元/月/人</div>
+            </el-input>
+          </el-form-item>
+        </el-col>
+        <!-- <el-col :span="4">
+          <el-form-item
+            label="季度会员激活价"
+            prop="quarterDivide"
+            :prop="'setting.' + index + '.quarterDivide'"
+            :rules="[
+              { required: true, message: '请输入会员激活价', trigger: 'blur' }
+            ]"
+          >
+            <el-input
+              :disabled="isDisabled"
+              placeholder="请输入会员激活价"
+              v-model="item.quarterDivide"
+              @keyup.native="keyupEvent($event)"
+              
+            >
+              <div slot="append">元/季/人</div>
+            </el-input>
+          </el-form-item>
+        </el-col> -->
+        <el-col :span="4"
+          ><el-form-item
+            label="半年会员激活价"
+            prop="halfYearDivide"
+            :prop="'setting.' + index + '.halfYearDivide'"
+            :rules="[
+              { required: true, message: '请输入会员激活价', trigger: 'blur' }
+            ]"
+          >
+            <el-input
+              :disabled="isDisabled"
+              placeholder="请输入会员激活价"
+              @keyup.native="keyupEvent($event)"
+              v-model="item.halfYearDivide"
+              
+            >
+              <div slot="append">元/半年/人</div>
+            </el-input>
+          </el-form-item></el-col
+        >
+        <el-col :span="4">
+          <el-form-item
+            label="年度会员激活价"
+            prop="yearDivide"
+            :prop="'setting.' + index + '.yearDivide'"
+            :rules="[
+              { required: true, message: '请输入会员激活价', trigger: 'blur' }
+            ]"
+          >
+            <el-input
+              :disabled="isDisabled"
+              placeholder="请输入会员激活价"
+              @keyup.native="keyupEvent($event)"
+              v-model="item.yearDivide"
+              
+            >
+              <div slot="append">元/年/人</div>
+            </el-input>
+          </el-form-item>
+          
+        </el-col>
+        <el-col :span="1">
+          <div style="height: 104px;display: flex;align-items: center;">
+            <el-button :disabled="isDisabled || form.setting.length <= 1" icon="el-icon-delete" circle @click="onDelete(form.setting, index)"></el-button>
+          </div>
+        </el-col>
+      </el-row>
+      <el-row style="margin-bottom: 16px;">
+        <el-col :span="24">
+          <el-button
+            style="width: 100%"
+            type="default"
+            icon="el-icon-plus"
+            :disabled="isDisabled"
+            @click="addMemberItem"
+            >添加学练宝版本</el-button
+          >
+        </el-col>
+       
+      </el-row>
+    </el-form>
+  </div>
+</template>
+
+<script>
+import { getmemberRankList } from "../../categroyManager/productSystem/api"
+import _ from "lodash";
+export default {
+  props: ["type", "data"],
+  data() {
+    return {
+      form: {
+        setting: [{
+          memberRankSettingId: null,
+          dayDivide: null,
+          monthDivide: null,
+          quarterDivide: null,
+          halfYearDivide: null,
+          yearDivide: null,
+        }],
+      },
+      memberRankSettingId: [], // 可用教材
+      teachList: [], // 教材列表
+      dynamicTags: []
+    };
+  },
+  async mounted() {
+    await this.__init();
+    if (this.data) {
+      const memberInfos = this.data;
+      const tempSetting = []
+      memberInfos.forEach(item => {
+        const { memberRankSettingId, memberConfig } = item 
+        tempSetting.push({
+          memberRankSettingId: this.formatParentId(memberRankSettingId, this.teachList),
+          ...memberConfig
+        })
+      })
+      this.form.setting = tempSetting
+    }
+  },
+  computed: {
+    isDisabled() {
+      return this.type == "setting" ? true : false;
+    }
+  },
+  methods: {
+    formatParentId(id, list, ids = []) {
+      for (const item of list) {
+        if (item.children) {
+          const cIds = this.formatParentId(
+            id,
+            item.children,
+            [...ids, item.id]
+          );
+          if (cIds.includes(id)) {
+            return cIds;
+          }
+        }
+        if (item.id === id) {
+          return [...ids, id];
+        }
+      }
+      return ids;
+    },
+    async __init() {
+      try {
+        const {data} = await getmemberRankList({
+          hasChildren: true
+        });
+        this.teachList = data || []
+      } catch (e) {
+        console.log(e);
+      }
+    },
+    // 删除选项
+    onDelete(arr, index) {
+      arr.splice(index, 1);
+    },
+    addMemberItem() {
+      this.form.setting.push({
+        memberRankSettingId: null,
+        dayDivide: null,
+        monthDivide: null,
+        quarterDivide: null,
+        halfYearDivide: null,
+        yearDivide: null,
+      })
+    },
+    onSubmit() {
+      let status = false;
+      this.$refs.form.validate(_ => {
+        status = _;
+      });
+      return status;
+    },
+    onVisibleChange(value, id) {
+      if(!value) return
+      const tempId = id ? id[id.length - 1] : null
+      const ids = []
+      this.form.setting.forEach(item => {
+        const itemId = item.memberRankSettingId ? item.memberRankSettingId[item.memberRankSettingId.length - 1] : null
+        if(itemId !== tempId) {
+          ids.push(itemId)
+        }
+      })
+      console.log(ids, 'ids')
+      console.log(value, id, 'teachList', this.teachList)
+      this.teachList.forEach((item) => {
+        if(ids.includes(item.id)) {
+          item.disabled = true;
+        } else {
+          item.disabled = false;
+        }
+
+        if(item.children && item.children.length > 0) {
+          item.children.forEach(child => {
+            if(ids.includes(child.id)) {
+              child.disabled = true;
+            } else {
+              child.disabled = false;
+            }
+          })
+        }
+      })
+      this.$forceUpdate();
+    },
+    getValues() {
+      const setting = this.form.setting
+      const tempConfig = []
+      setting.forEach(item => {
+        const { memberRankSettingId, ...more } = item
+        const id = memberRankSettingId ? memberRankSettingId[memberRankSettingId.length - 1] : null
+        tempConfig.push({
+          memberRankSettingId: id,
+          memberConfig: {
+            ...more
+          }
+        })
+      })
+      return {
+        memberInfos: tempConfig
+      };
+    }
+  }
+};
+</script>
+<style lang="scss" scoped>
+.el-tag + .el-tag {
+  margin-left: 10px;
+}
+.el-input,
+.el-select,
+.el-cascader,
+.el-cascader__dropdown {
+  width: 100% !important;
+}
+.el-cascader-menu {
+  width: 100%;
+}
+</style>

+ 111 - 2
src/views/organManager/components/openService.vue

@@ -91,12 +91,38 @@
             <div slot="append">元</div>
           </el-input>
         </el-form-item>
+        <el-form-item label="可用教材" prop="teachingMaterialId">
+          <el-cascader
+            v-model.trim="form.teachingMaterialId"
+            :disabled="isDisabledMember"
+            v-show="!isDisabledMember"
+            style="width: 300px !important"
+            :options="teachList"
+            :props="{ multiple: true }"
+            :show-all-levels="false"
+            collapse-tags
+            ref="cascader"
+            @change="onChange"
+            clearable
+          ></el-cascader>
+
+          <el-tag
+            :key="tag.id"
+            v-show="isDisabledMember"
+            v-for="tag in dynamicTags"
+            :disable-transitions="false"
+            @close="handleClose(tag)"
+          >
+            {{ tag.name }}
+          </el-tag>
+        </el-form-item>
       </el-form>
   </div>
 </template>
 
 <script>
 import { platformServeQueryPage, platformServeQueryModeDetail } from '@/views/platformManager/serviceManager/api'
+import { queryTree } from "../../accompaniment/api";
 import { paymentMode } from '@/constant'
 export default {
   props: ['type', 'data'],
@@ -112,29 +138,47 @@ export default {
         contractPrice: null,
         originalPrice: null,
         expiryCount: null,
-        payAmount: null
+        payAmount: null,
+        teachingMaterialId: [] // 可用教材
       },
       payState: null,
       productList: [],
       modeList: [],
       studentUpList: [], // 学员上限列表
+      teachList: [], // 教材列表
+      dynamicTags: []
     };
   },
   async mounted () {
     await this.__init()
     if(this.data) {
       const data = this.data
+      console.log(data,'111')
       this.payState = data.payState
       data.serveId ? (await this.onProductChange(data.serveId)) : null
       this.form = data
       this.form.serveMode = data.expiryUnit
       data.serveDetailId ? (await this.onModeChange(data.expiryUnit, 'none')) : null
+      let tempIdArr = [];
+      if (data.teachingMaterialId) {
+        const tempIds = data.teachingMaterialId?.split(",").map(i => Number(i));
+        tempIds.forEach(id => {
+          tempIdArr.push(this.formatParentId(id, this.teachList));
+        });
+      }
+      this.form.teachingMaterialId = tempIdArr
+      this.$nextTick(() => {
+        this.onChange();
+      });
     }
   },
   computed: {
     isDisabled() {
       return this.type == 'setting' || this.payState == 1 ? true : false
     },
+    isDisabledMember() {
+      return this.type == 'setting' ? true : false
+    },
     unitSuffix() {
       // 后辍默认为年
       return this.paymentMode[this.form.expiryUnit] || '年'
@@ -146,6 +190,60 @@ export default {
         const res = await platformServeQueryPage({ page: 1, rows: 999 })
         this.productList = res.data?.rows || []
       } catch(e) {}
+      try {
+        // 不管是添加、查看、修改都传-1
+        const tenantId = -1;
+        const res = await queryTree({ enable: 1, tenantId, queryType: 'ALL' });
+        const rows = res.data || [];
+        rows.forEach(item => {
+          let children = [];
+          item.label = item.name;
+          item.value = item.id;
+          let childList = item.sysMusicScoreCategoriesList
+            ? item.sysMusicScoreCategoriesList
+            : [];
+          if (childList.length > 0) {
+            childList.forEach(child => {
+              child.label = child.name;
+              child.value = child.id;
+              child.sysMusicScoreCategoriesList = [];
+              children.push(child);
+            });
+          }
+          item.children = children.length > 0 ? children : null;
+          this.teachList.push(item);
+        });
+      } catch (e) {
+        console.log(e);
+      }
+    },
+    formatParentId(id, list, ids = []) {
+      for (const item of list) {
+        if (item.sysMusicScoreCategoriesList) {
+          const cIds = this.formatParentId(
+            id,
+            item.sysMusicScoreCategoriesList,
+            [...ids, item.id]
+          );
+          if (cIds.includes(id)) {
+            return cIds;
+          }
+        }
+        if (item.id === id) {
+          return [...ids, id];
+        }
+      }
+      return ids;
+    },
+    onChange() {
+      let childNodes = this.$refs.cascader.getCheckedNodes(true);
+      this.dynamicTags = [];
+      childNodes.forEach(node => {
+        this.dynamicTags.push({
+          name: node.label,
+          id: node.value
+        });
+      });
     },
     async onProductChange(val) {
       const form = this.form
@@ -169,7 +267,15 @@ export default {
       return status
     },
     getValues() {
-      return this.form
+      const { teachingMaterialId, ...res } = this.form 
+      let tempArr = [];
+      teachingMaterialId.forEach(ids => {
+        tempArr.push(_.last(ids));
+      });
+      return {
+        ...res,
+        teachingMaterialId: tempArr
+      }
     },
     onModeChange(val, type) { // 付费模式改变时
       const form = this.form
@@ -202,4 +308,7 @@ export default {
 .el-input, .el-select {
   width: 300px !important;
 }
+.el-tag + .el-tag {
+  margin-left: 10px;
+}
 </style>

+ 16 - 8
src/views/organManager/organOperation.vue

@@ -20,7 +20,7 @@
         <!-- 产品定价 确认设置 -->
         <div v-show="[1, 2].includes(active)">
           <openService ref="openService" :data="productInfo" :type="getType" />
-          <memberSetting ref="memberSetting" :data="config" :type="getType" />
+          <memberSetting ref="memberSetting" :data="memberInfos" :type="getType" />
           <roomRules ref="roomRules" :data="config" :type="getType" />
           <rateSetting ref="rateSetting" :data="config" :type="getType" />
         </div>
@@ -36,7 +36,7 @@
 <script>
 import organInfo from './components/organInfo'
 import openService from './components/openService'
-import memberSetting from './components/memberSetting'
+import memberSetting from './components/memberSettingMore'
 import roomRules from './components/roomRules'
 import rateSetting from './components/rateSetting'
 import { tenantInfoAdd, tenantInfoInfo, tenantInfoUpdate } from './api'
@@ -50,6 +50,7 @@ export default {
       id: query.id,
       active: 0, // 当前第几步
       config: null,
+      memberInfos: null,
       productInfo: null,
       info: null,
       status: false,
@@ -67,10 +68,14 @@ export default {
           this.title = '修改机构'
         }
         const res = await tenantInfoInfo({ id: this.id })
-        const { config, productInfo, ...other } = res.data
-        const { theme, themeColor, corporateChops, corporateFinanceChops, ...con } = config
+        const { config, productInfo, memberInfos, ...other } = res.data
+        const { theme, themeColor, corporateChops, corporateFinanceChops, teachingMaterialId, ...con } = config
+        this.memberInfos = memberInfos
         this.config = { ...con }
-        this.productInfo = productInfo
+        this.productInfo = {
+          ...productInfo,
+          teachingMaterialId,
+        }
         this.info = { ...other, theme, themeColor, corporateChops, corporateFinanceChops }
         if(!this.info.recommender || this.info.recommender==0){
           this.info.recommender = null
@@ -102,6 +107,7 @@ export default {
           this.active += 1
         }
       } else if(this.active == 1) {
+        console.log(await this.$refs.memberSetting.getValues(), 'await this.$refs.memberSetting.getValues()')
         const openStatus = await this.$refs.openService.onSubmit()
         const memberStatus = await this.$refs.memberSetting.onSubmit()
         const ruleStatus = await this.$refs.roomRules.onSubmit()
@@ -125,15 +131,17 @@ export default {
         const memberData = await this.$refs.memberSetting.getValues()
         const ruleData = await this.$refs.roomRules.getValues()
         const rateData = await this.$refs.rateSetting.getValues()
-        const { member_config, teachingMaterialId } = memberData
+        // const { member_config, teachingMaterialId } = memberData
         const { theme, themeColor, corporateChops, corporateFinanceChops, ...con } = organData
         let config = {
-          member_config,
+          // member_config,
           ...ruleData
         }
+        const { teachingMaterialId, ...opens } = openData
         let params = {
           ...con,
-          productInfo: openData,
+          productInfo: { ...opens },
+          memberInfos: memberData.memberInfos,
           config: {
             theme,
             themeColor,

+ 1 - 1
src/views/platformManager/cloudTrafficPackage/index.vue

@@ -2,7 +2,7 @@
   <div class="m-container">
     <h2>
       <div class="squrt"></div>
-      云练习流量包
+      学练宝流量包
     </h2>
     <save-form
       :inline="true"

+ 12 - 12
src/views/reportForm/index.vue

@@ -160,7 +160,7 @@
             class="m-wrap"
             v-permission="'export/cloudStudyStudentTrainData'"
           >
-            <div class="title">云练习学员统计:</div>
+            <div class="title">学练宝学员统计:</div>
             <!-- <el-select
               v-model.trim="trainOrganId"
               class="organSelect"
@@ -214,16 +214,16 @@
               style="margin-left: 10px"
               ExportEnum="CLOUD_STUDY_STUDENT_TRAIN_DATA"
               :exportData="exportTrain"
-              fileName="云练习学员统计"
+              fileName="学练宝学员统计"
               errorMsg="请至少选择一个分部"
               :flag="this.trainOrganId.length < 1"
             />
           </div>
-          <!-- 老师使用云练习数据
+          <!-- 老师使用学练宝数据
  -->
 
           <div class="m-wrap" v-permission="'export/teacherCloudTrainingList'">
-            <div class="title">老师使用云练习数据:</div>
+            <div class="title">老师使用学练宝数据:</div>
             <select-all
               v-model.trim="trainTeacherOrganId"
               class="organSelect"
@@ -260,7 +260,7 @@
               style="margin-left: 10px"
               ExportEnum="EXPORT_TEACHER_CLOUD_COURSE_REPORT"
               :exportData="exportTeacherTrain"
-              fileName="老师使用云练习数据"
+              fileName="老师使用学练宝数据"
               errorMsg="请选择分部"
               :flag="!this.trainTeacherOrganId"
               :isDownList="true"
@@ -804,7 +804,7 @@
             />
           </div>
           <div class="m-wrap" v-permission="'export/EXPORT_CLOUD_TEACHER_SUM'">
-            <div class="title">云练习统计导出:</div>
+            <div class="title">学练宝统计导出:</div>
             <select-all
               v-model.trim="yunOrganId"
               class="organSelect"
@@ -839,7 +839,7 @@
               style="margin-left: 10px"
               ExportEnum="EXPORT_CLOUD_TEACHER_SUM"
               :exportData="exporyun"
-              fileName="云练习统计导出"
+              fileName="学练宝统计导出"
               errorMsg="请选择分部"
               :isDownList="true"
             />
@@ -849,7 +849,7 @@
             class="m-wrap"
             v-permission="'export/CLOUD_COACH_ACTIVATION_DETAILS'"
           >
-            <div class="title">云练习激活明细:</div>
+            <div class="title">学练宝激活明细:</div>
             <select-all
               v-model.trim="cloudAcivationOrganId"
               class="organSelect"
@@ -880,7 +880,7 @@
               style="margin-left: 10px"
               ExportEnum="CLOUD_COACH_ACTIVATION_DETAILS"
               :exportData="expotAcivationDetails"
-              fileName="云练习激活明细导出"
+              fileName="学练宝激活明细导出"
               errorMsg="请选择分部"
               :flag="this.cloudAcivationOrganId.length <= 0"
             />
@@ -1324,7 +1324,7 @@
               clearable
             >
               <el-option
-                label="云练习用户反馈"
+                label="学练宝用户反馈"
                 value="CLOUD_TEACHER_FEEDBACK"
               ></el-option>
             </el-select>
@@ -1729,7 +1729,7 @@ export default {
       //   this,
       //   {
       //     url: "/api-web/export/teacherCloudTrainingList",
-      //     fileName: "老师使用云练习数据.xls",
+      //     fileName: "老师使用学练宝数据.xls",
       //     method: "post",
       //     params: qs.stringify({
       //       organIdList: this.trainTeacherOrganId.join(","),
@@ -1737,7 +1737,7 @@ export default {
       //       endTime,
       //     }),
       //   },
-      //   "您确定导出老师使用云练习数据?"
+      //   "您确定导出老师使用学练宝数据?"
       // );
       let obj = {
         organId: this.trainTeacherOrganId.join(","),

+ 11 - 3
src/views/resetTeaming/api.js

@@ -141,6 +141,14 @@ export const getAllmemberRank = data =>
     method: "get",
     params: data
   });
+
+export const getMemberRankTree = (data) => {
+  return request2({
+    url: "/api-web/memberRankSetting/queryTree",
+    method: "get",
+    params: data
+  });
+}
 // 获取会员是否自动生效
 export const getAutoActivationFlag = data =>
   request2({
@@ -149,7 +157,7 @@ export const getAutoActivationFlag = data =>
     params: data
   });
 
-// 查询未激活云练习用户
+// 查询未激活学练宝用户
 export const queryInactive = data =>
   request2({
     url: "/api-web/cloudTeacherOrder/queryInactive",
@@ -157,7 +165,7 @@ export const queryInactive = data =>
     data
   });
 
-// 设置云练习会员时长
+// 设置学练宝会员时长
 export const cancelInactive = data =>
   request2({
     url: "/api-web/cloudTeacherOrder/cancelInactive",
@@ -165,7 +173,7 @@ export const cancelInactive = data =>
     data
   });
 
-// 激活云练习用户
+// 激活学练宝用户
 export const cloudPay = data =>
   request2({
     url: "/api-web/cloudTeacherOrder/pay",

+ 34 - 4
src/views/resetTeaming/components/giveMemberList.vue

@@ -36,6 +36,17 @@
           <el-option label="已取消" value="4"></el-option>
         </el-select>
       </el-form-item>
+      <el-form-item prop="memberRankId">
+        <el-cascader
+          v-model.trim="searchForm.memberRankId"
+          :options="memberRankList"
+          :props="{ value: 'id', label: 'name',  }"
+          :show-all-levels="false"
+          collapse-tags
+          clearable
+          placeholder="请选择学练宝版本"
+        ></el-cascader>
+      </el-form-item>
       <el-form-item>
         <el-date-picker
           v-model="searchForm.operationDate"
@@ -63,7 +74,7 @@
       v-if="$helpers.permission('cloudTeacherOrder/pay')"
       type="primary"
       style="margin-bottom: 20px"
-      >激活云练习</el-button
+      >激活学练宝</el-button
     >
     <el-button
       type="primary"
@@ -97,7 +108,9 @@
           prop="subjectName"
           label="学员声部"
         ></el-table-column>
-        <el-table-column align="center" prop="type" label="云练习类型">
+        <el-table-column align="center" prop="memberName" label="学练宝版本">
+        </el-table-column>
+        <el-table-column align="center" prop="type" label="周期">
           <template slot-scope="scope">
             {{ scope.row.type | memberEnumType }}
           </template>
@@ -168,7 +181,7 @@
     </div>
 
     <el-dialog
-      title="激活云练习"
+      title="激活学练宝"
       :visible.sync="giveMemberVisible"
       width="1000px"
       v-if="giveMemberVisible"
@@ -219,6 +232,7 @@
 import pagination from "@/components/Pagination/index";
 import { findSound } from "@/api/buildTeam";
 import { queryInactive, cancelInactive } from "../api";
+import { getmemberRankList } from '@/views/categroyManager/productSystem/api'
 import giveMemberModel from "../modals/giveMemberModel";
 import Tooltip from "@/components/Tooltip";
 import { getTimeFormat } from "@/utils";
@@ -232,9 +246,11 @@ export default {
       searchForm: {
         queryCondition: "",
         subjectId: "",
+        memberRankId: [],
         operationDate: [],
         status: ""
       },
+      memberRankList: [],
       soundList: [],
       tableList: [],
       rules: {
@@ -254,9 +270,18 @@ export default {
   },
   mounted() {
     this.__init();
+    this.getMemberList()
     this.getList();
   },
   methods: {
+    async getMemberList() {
+      try {
+        const { data } = await getmemberRankList()
+        this.memberRankList = data || [];
+      } catch (e) {
+        console.log(e);
+      }
+    },
     async __init() {
       try {
         let res = await findSound({ musicGroupId: this.musicGroupId });
@@ -267,9 +292,14 @@ export default {
     },
     async getList() {
       try {
-        let { operationDate, ...rest } = this.searchForm;
+        let { operationDate, memberRankId, ...rest } = this.searchForm;
+        let rankId = null
+        if(memberRankId && memberRankId.length > 0) {
+          rankId = memberRankId[memberRankId.length - 1]
+        }
         let params = {
           ...rest,
+          memberRankId: rankId,
           ...getTimeFormat(operationDate, [
             "operateStartTime",
             "operateEndTime"

+ 128 - 62
src/views/resetTeaming/components/payInfoDetail.vue

@@ -100,12 +100,7 @@
                   :style="{ opacity: memberDisabled ? '0.5' : '1' }"
                   @click.prevent="
                     () => {
-                      if (memberDisabled) return;
-                      member = !member;
-                      if (member && form.memberList.length < 0) {
-                        form.memberList = [];
-                        form.memberList.push({});
-                      }
+                      addShowMember()
                     }
                   "
                 >
@@ -113,7 +108,7 @@
                     <img src="../images/checkIcon2.png" alt="" />
                   </div>
                   <div class="checkRight">
-                    <p>云练习</p>
+                    <p>学练宝</p>
                     <p class="checkSubTitle">乐团练习工具</p>
                   </div>
                   <div class="checTriangle" v-if="member">
@@ -203,6 +198,8 @@
               <payMember
                 ref="payMember"
                 :memberRankList="memberRankList"
+                @create="addPayMember"
+                @remove="removePayMember"
                 @moneyChange="syncAllMoney"
                 @priceChange="priceChange"
                 :rulesForm="rulesForm"
@@ -444,7 +441,7 @@ import { getSysTenantConfig } from "@/views/courseRulersManager/api";
 import { sysConfigList } from "@/api/generalSettings";
 import {
   queryByMusicGroupOrganizationCourseSettingsId,
-  getAllmemberRank,
+  getMemberRankTree,
   musicGroupcreateCalender,
   musicGroupresetCalender,
   getAutoActivationFlag
@@ -454,6 +451,16 @@ import {
   findMusicGroupSubjectInfo,
   getAgreement
 } from "@/api/buildTeam";
+import deepClone from "@/helpers/deep-clone";
+const __memberList = {
+    period: "",
+    num: "",
+    name: "",
+    actualAmount: "",
+    memberRankSettingId: "",
+    optionalFlag: null,
+    autoActivationFlag: false
+  }
 import { vipGroupActivity } from "@/api/vipSeting";
 export default {
   components: {
@@ -471,17 +478,7 @@ export default {
         paymentType: "",
         memo: "",
         eclass: [{}],
-        memberList: [
-          {
-            period: "",
-            num: "",
-            name: "",
-            actualAmount: "",
-            memberRankSettingId: "",
-            optionalFlag: null,
-            autoActivationFlag: false
-          }
-        ],
+        memberList: [deepClone(__memberList)],
         leBaoList: [{}],
         activeList: [{}],
         teacherFeeList: [],
@@ -665,7 +662,13 @@ export default {
             if (res.data.member) {
               // 团练保
               this.member = true;
-              this.$set(this.form, "memberList", [{ ...res.data.member }]);
+
+              const tempMember = res.data?.member || []
+              tempMember.forEach(m => {
+                m.memberRankSettingId = this.formatParentId(m.memberRankSettingId, this.memberRankList)
+              })
+
+              this.$set(this.form, "memberList", tempMember);
             }
             if (res.data.repair) {
               this.leBao = true;
@@ -681,11 +684,11 @@ export default {
                 this.teamCourse = true;
 
                 this.$set(this.form, "eclass", res.data?.course);
-                console.log(
-                  [...res.data?.course],
-                  "res.data?.course",
-                  this.form
-                );
+                // console.log(
+                //   [...res.data?.course],
+                //   "res.data?.course",
+                //   this.form
+                // );
                 this.initDetail = true;
                 this.$set(
                   this.form,
@@ -788,6 +791,31 @@ export default {
         console.log(e);
       }
     },
+    addShowMember() {
+      if (this.memberDisabled) return;
+      this.member = !this.member;
+      if (this.member && this.form.memberList.length < 0) {
+        this.form.memberList = [deepClone(__memberList)];
+      }
+    },
+    formatParentId(id, list, ids = []) {
+      for (const item of list) {
+        if (item.children) {
+          const cIds = this.formatParentId(
+            id,
+            item.children,
+            [...ids, item.id]
+          );
+          if (cIds.includes(id)) {
+            return cIds;
+          }
+        }
+        if (item.id === id) {
+          return [...ids, id];
+        }
+      }
+      return ids;
+    },
     async getLeBao() {
       try {
         const res = await getSysTenantConfig({ group: "MUSIC_REPAIR" });
@@ -804,8 +832,9 @@ export default {
     },
     async getMemberList() {
       try {
-        const res = await getAllmemberRank({ isDefault: 0 });
-        this.memberRankList = res.data;
+        const musicGroupId = this.$route.query.id;
+        const {data} = await getMemberRankTree({ musicGroupId })
+        this.memberRankList = data || [];
         // 获取是否展示会员是否自动生效
         const memberRes = await getAutoActivationFlag();
         this.showAutoActivationFlag = memberRes.data;
@@ -872,11 +901,11 @@ export default {
       // 格式化课程类型
       const organId = this.musicGroup?.organId;
       const courseViewType = this.musicGroup?.courseViewType;
-      console.log(
-        this.musicGroup.courseViewType,
-        "musicGroup.courseViewType",
-        this.organizationCourseUnitPriceSettings
-      );
+      // console.log(
+      //   this.musicGroup.courseViewType,
+      //   "musicGroup.courseViewType",
+      //   this.organizationCourseUnitPriceSettings
+      // );
       const _ = {};
       const list = (this.organizationCourseUnitPriceSettings || []).filter(
         item =>
@@ -885,7 +914,7 @@ export default {
           courseViewType != null &&
           courseViewType == item.courseViewType
       );
-      console.log(list, "list");
+      // console.log(list, "list");
       for (const item of list) {
         _[item.courseType] = item;
       }
@@ -949,6 +978,9 @@ export default {
     addActive() {
       this.form.activeList.push({});
     },
+    addPayMember() {
+      this.form.memberList.push(deepClone(__memberList))
+    },
     removeActive(index) {
       this.form.activeList[index] = null;
       this.$set(
@@ -962,6 +994,10 @@ export default {
       this.$set(this.form, "eclass", this.form.eclass.filter(item => !!item));
       // this.form.eclass = this.form.eclass.filter((item) => !!item);
     },
+    removePayMember(index) {
+      this.form.memberList[index] = null;
+      this.$set(this.form, 'memberList', this.form.memberList.filter(item => !!item))
+    },
     async onPreview() {
       // 开始预览
       const musicGroupId = this.$route.query.id;
@@ -1081,7 +1117,7 @@ export default {
       });
     },
     scrollView(object) {
-      console.log(object);
+      // console.log(object);
       for (const i in object) {
         let dom = this.$refs[i];
         // 这里是针对遍历的情况(多个输入框),取值为数组
@@ -1102,7 +1138,19 @@ export default {
         break; // 跳出循环了
       }
     },
-
+    findMemberItem(id) {
+      let temp = {}
+      this.memberRankList.forEach((item) => {
+        if(Array.isArray(item.children)) {
+          item.children.forEach(child => {
+            if(child.id === id) {
+              temp = child
+            }
+          })
+        }
+      })
+      return temp
+    },
     formatPreviewData() {
       // 格式化预览数据
       const form = this.form;
@@ -1117,17 +1165,18 @@ export default {
           }
         });
       }
-      let memberObj =
-        form.memberList?.length > 0 ? { ...form.memberList[0] } : null;
-      // 获取会员名称
-      if (memberObj) {
-        this.memberRankList.forEach(item => {
-          if (item.id == memberObj.memberRankSettingId) {
-            memberObj.name = item.name;
+      let memberObj = JSON.parse(JSON.stringify(form.memberList))
+      // // 获取会员名称
+      if (memberObj && memberObj.length > 0) {
+        memberObj.forEach(item => {
+          item.memberRankSettingId = item.memberRankSettingId.length > 0 ? item.memberRankSettingId[item.memberRankSettingId.length - 1] : null
+          const n = this.findMemberItem(item.memberRankSettingId) // this.memberRankList.find(c => c.id = item.memberRankSettingId)
+          if(n) {
+            item.name = n.name;
+            item.intro = n.intro
           }
-        });
+        })
       }
-      console.log(memberObj, "memberObj", activeList, form.eclass);
       let tempCourseList = form.eclass?.length > 0 ? form.eclass : [];
       let courseList = [];
       if (tempCourseList.length > 0) {
@@ -1147,7 +1196,7 @@ export default {
           },
           activity: [...activeList], // 小班课
           course: courseList, // 课程
-          member: memberObj, // 云练习
+          member: memberObj, // 学练宝
           memberPrivilegesItemList: [], // 会员基本内容
           repair:
             form.leBaoList?.length > 0 &&
@@ -1164,6 +1213,15 @@ export default {
     },
     fommatDate() {
       if (this.$route.query.payUserType == "STUDENT") {
+        const tempMemberList = this.form.memberList || []
+        const calenderMember = []
+        tempMemberList.forEach(item => {
+          const { memberRankSettingId, ...more } = item 
+          calenderMember.push({
+            ...more,
+            memberRankSettingId: memberRankSettingId.length > 0 ? memberRankSettingId[memberRankSettingId.length - 1] : null
+          })
+        })
         return {
           payUserType: this.$route.query.payUserType,
           musicGroupOrganizationCourseSettingId:
@@ -1177,11 +1235,12 @@ export default {
             this.form.leBaoList?.length > 0
               ? { ...this.form.leBaoList[0] }
               : null,
-          calenderMember:
-            this.form.memberList?.length > 0 &&
-            this.form.memberList[0]?.memberRankSettingId
-              ? { ...this.form.memberList[0] }
-              : null,
+          // calenderMember:
+          //   this.form.memberList?.length > 0 &&
+          //   this.form.memberList[0]?.memberRankSettingId
+          //     ? { ...this.form.memberList[0] }
+          //     : null,
+          calenderMemberList: calenderMember.length > 0 ? calenderMember : [],
           musicGroupPaymentCalenderCourseSettingsList:
             this.form.eclass?.length > 0 ? this.form.eclass : null,
           musicGroupId: this.$route.query.id,
@@ -1198,7 +1257,15 @@ export default {
         if (this.form.calenderFeeType == "TEACHER") {
           calenderFeeJson.teacherFeeList = this.form.teacherFeeList;
         }
-
+        const tempMemberList = this.form.memberList || []
+        const calenderMember = []
+        tempMemberList.forEach(item => {
+          const { memberRankSettingId, ...more } = item 
+          calenderMember.push({
+            ...more,
+            memberRankSettingId: memberRankSettingId.length > 0 ? memberRankSettingId[memberRankSettingId.length - 1] : null
+          })
+        })
         return {
           payUserType: this.$route.query.payUserType,
           musicGroupOrganizationCourseSettingId:
@@ -1212,11 +1279,12 @@ export default {
             this.form.leBaoList?.length > 0
               ? { ...this.form.leBaoList[0] }
               : null,
-          calenderMember:
-            this.form.memberList?.length > 0 &&
-            this.form.memberList[0]?.memberRankSettingId
-              ? { ...this.form.memberList[0] }
-              : null,
+          // calenderMember:
+          //   this.form.memberList?.length > 0 &&
+          //   this.form.memberList[0]?.memberRankSettingId
+          //     ? { ...this.form.memberList[0] }
+          //     : null,
+          calenderMemberList: calenderMember.length > 0 ? calenderMember : [],
           musicGroupPaymentCalenderCourseSettingsList:
             this.form.eclass?.length > 0 ? this.form.eclass : null,
           musicGroupId: this.$route.query.id,
@@ -1272,7 +1340,7 @@ export default {
     },
     member(val) {
       if (!val) {
-        this.$set(this.form, "memberList", [{}]);
+        this.$set(this.form, "memberList", [deepClone(__memberList)]);
       }
     },
     teamActive(val) {
@@ -1304,7 +1372,6 @@ export default {
               courseCurrentPrice: 0
             });
           });
-          console.log("type", newValue, oldValue);
           this.$set(this.form, "teacherFeeList", arr);
         }
       },
@@ -1331,7 +1398,7 @@ export default {
       // this.$forceUpdate()
     },
     "form.calenderFeeType"(val, oldValue) {
-      console.log(val, oldValue, this.initDetail);
+      // console.log(val, oldValue, this.initDetail);
       if (val == "TEACHER" && !this.initDetail) {
         let arr = [];
         this.form.eclass.forEach(item => {
@@ -1342,7 +1409,7 @@ export default {
             courseCurrentPrice: 0
           });
         });
-        console.log("calenderFeeType", val, oldValue);
+        // console.log("calenderFeeType", val, oldValue);
         this.$set(this.form, "teacherFeeList", arr);
       }
     },
@@ -1399,8 +1466,7 @@ export default {
             this.member = true;
             this.memberDisabled = true;
             if (this.member && this.form.memberList.length < 0) {
-              this.form.memberList = [];
-              this.form.memberList.push({});
+              this.form.memberList = [deepClone(__memberList)];
             }
           }
         }

+ 1 - 1
src/views/resetTeaming/components/strudentPayInfo.vue

@@ -258,7 +258,7 @@
                 <el-form-item label="乐团课金额">
                   <span>{{ props.row.courseAmount | moneyFormat }}元</span>
                 </el-form-item>
-                <el-form-item label="云练习金额">
+                <el-form-item label="学练宝金额">
                   <span>{{ props.row.cloudAmount | moneyFormat }}元</span>
                 </el-form-item>
                 <el-form-item label="乐保金额">

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

@@ -200,7 +200,7 @@
           <studentList :teamid="teamid" v-if="activeIndex == '7'" />
         </el-tab-pane>
         <el-tab-pane
-          label="待激活练宝"
+          label="待激活练宝"
           v-if="permission('/giveMemberList')"
           name="13"
           :disabled="!teamid"

+ 7 - 3
src/views/resetTeaming/modals/giveMemberModel.vue

@@ -2,7 +2,7 @@
   <div class="chioseWrap">
     <p>
       您将为以下<span>{{ tableList.length }}</span
-      >位学员激活云练习,激活金额<span>{{
+      >位学员激活学练宝,激活金额<span>{{
         selectStudentMoney | moneyFormat
       }}</span
       >元
@@ -35,7 +35,9 @@
       </el-table-column>
       <el-table-column align="center" prop="phone" label="手机号">
       </el-table-column>
-      <el-table-column align="center" prop="type" label="云练习类型">
+      <el-table-column align="center" prop="memberName" label="学练宝版本">
+      </el-table-column>
+      <el-table-column align="center" prop="type" label="周期">
         <template slot-scope="scope">
           {{ scope.row.type | memberEnumType }}
         </template>
@@ -64,7 +66,7 @@
     </span>
 
     <el-dialog
-      title="激活云练习"
+      title="激活学练宝"
       :visible.sync="payMentVisible"
       :before-close="onClose"
       v-if="payMentVisible"
@@ -152,6 +154,8 @@ export default {
               tenantId +
               "&returnUrl=" +
               returnUrl +
+              "&type=" +
+              res.data.type
               "&wxAppId=" +
               wxAppId +
               "&alipayAppId=" +

+ 2 - 2
src/views/resetTeaming/modals/giveMemberPayment.vue

@@ -2,12 +2,12 @@
   <div class="chioseWrap">
     <p>
       您将为<span>{{ tableList.length }}</span
-      >位学员激活云练习<br />共需支付<span>{{
+      >位学员激活学练宝<br />共需支付<span>{{
         selectStudentMoney | moneyFormat
       }}</span
       >元
     </p>
-    <p>请扫描二维码支付,支付功能后学员云练习即刻激活</p>
+    <p>请扫描二维码支付,支付功能后学员学练宝即刻激活</p>
 
     <vue-qr :text="codeUrl" style="width: 250px" :margin="0"></vue-qr>
   </div>

+ 15 - 6
src/views/resetTeaming/modals/instrumentModel.vue

@@ -80,10 +80,13 @@
                 <!-- 乐器现价 = 乐器现价 + 分部分润金额 -->
                 <span style="color: #1A1A1A" v-if="con.kitType == 'GROUP'"
                   >¥{{
-                    Number(
-                      (con.price - con.coupon + con.organShareProfit).toFixed(2)
-                    ) | moneyFormat
-                  }}</span
+                  (courseViewType == 2 && organId == 55 && !toolsPackages ? Number(
+                    (con.discountPrice - con.coupon + con.organShareProfit).toFixed(2)
+                  ) : Number(
+                    (con.price - con.coupon + con.organShareProfit).toFixed(2)
+                  ))
+                   | moneyFormat
+                }}</span
                 >
               </el-col>
               <el-col :span="5" v-if="con.kitType == 'LEASE'">
@@ -163,8 +166,14 @@ export default {
   },
   computed: {
     toolsPackages() {
-      return this.toolsPackage[0].isStatus;
-    }
+      let status = false
+      this.toolsPackage.forEach(item => {
+        if(item.isStatus) {
+          status = true
+        }
+      })
+      return status
+    },
   }
 };
 </script>

+ 32 - 18
src/views/resetTeaming/modals/member-setting.vue

@@ -6,20 +6,20 @@
     label-suffix=": "
     :inline="true"
   >
-    <el-form-item label="是否购买会员" v-if="isUserType && addStudent">
+    <el-form-item label="是否购买学练宝" v-if="isUserType && addStudent">
       <el-radio-group v-model="radio">
-        <el-radio :label="true">购买会员</el-radio>
-        <el-radio :label="false">不购买会员</el-radio>
+        <el-radio :label="true">购买</el-radio>
+        <el-radio :label="false">不购买</el-radio>
       </el-radio-group>
     </el-form-item>
     <el-form-item
-      label="会员等级"
+      label="学练宝版本"
       prop="memberRankSettingId"
       v-if="isUserType && radio"
-      :rules="[{ required: true, message: '请选择会员等级', trigger: 'blur' }]"
+      :rules="[{ required: true, message: '请选择学练宝版本', trigger: 'blur' }]"
     >
-      <el-select
-        placeholder="会员等级"
+      <!-- <el-select
+        placeholder="学练宝版本"
         style="width: 620px !important"
         clearable
         filterable
@@ -32,17 +32,28 @@
           v-for="item in memberRankList"
           :key="item.id"
         ></el-option>
-      </el-select>
+      </el-select> -->
+      <el-cascader
+        filterable
+        style="width: 620px !important"
+        v-model="form.memberRankSettingId"
+        clearable
+        placeholder="请选择学练宝版本"
+        :options="memberRankList"
+        :props="{ value: 'id', label: 'name' }"
+        @change="(val) => changeMember(val, scope.$index)"
+
+      ></el-cascader>
     </el-form-item>
 
     <el-form-item
       v-if="isUserType && radio"
-      label="会员周期"
+      label="数量"
       prop="num"
       :rules="[
         {
           required: true,
-          message: '请选择会员周期',
+          message: '请选择数量',
           trigger: 'blur',
         },
       ]"
@@ -55,18 +66,18 @@
         :precision="0"
         :min="0"
         @change="changeMemberperiodEnum(form.period)"
-        placeholder="会员周期"
+        placeholder="数量"
         :disabled="!form.memberRankSettingId"
       />
     </el-form-item>
     <el-form-item
       v-if="isUserType && radio"
-      label="周期单位"
+      label="周期"
       prop="period"
       :rules="[
         {
           required: true,
-          message: '请选择周期单位',
+          message: '请选择周期',
           trigger: 'blur',
         },
       ]"
@@ -138,12 +149,13 @@
 </template>
 <script>
 import { objectToOptions } from "@/utils";
-import { getAllmemberRank, getMemberFee } from "../api";
+import { getMemberRankTree, getMemberFee } from "../api";
 import { memberEnumList } from "@/utils/searchArray";
 import { sysConfigList } from "@/api/generalSettings";
 export default {
   props: [
     "form",
+    "musicGroupId",
     "isUserType",
     "organId",
     "addStudent",
@@ -179,8 +191,10 @@ export default {
   async mounted() {
     // 获取所有得会员信息
     try {
-      const res = await getAllmemberRank({ isDefault: 0 });
-      this.memberRankList = res.data;
+      // const res = await getAllmemberRank({ isDefault: 0 });
+      // this.memberRankList = res.data;
+      const {data} = await getMemberRankTree({ musicGroupId: this.musicGroupId })
+      this.memberRankList = data || [];
     } catch (e) {
       console.log(e);
     }
@@ -287,12 +301,12 @@ export default {
       // this.$set(this.form, "originalMemberPaymentAmount", null);
       // this.$set(this.form, "num", null);
       // this.$set(this.form, "period", null);
-      if (val) {
+      if (val && val.length > 0) {
         if (this.getMemberFeeFlag) {
           this.getMemberFeeFlag = false;
           try {
             const res = await getMemberFee({
-              rankId: val,
+              rankId: val[val.length - 1],
               organId: this.organId,
             });
             this.memberPrice = res.data;

+ 6 - 86
src/views/resetTeaming/modals/member.vue

@@ -5,7 +5,7 @@
     class="courseModel"
     style="margin-top: 12px;"
   >
-    <template>
+    <!-- <template>
       <div class="yunTrain">
         <img :src="trainBg" />
         <div class="toolText">
@@ -20,91 +20,11 @@
           </p>
         </div>
       </div>
-    </template>
+    </template> -->
 
     <slot />
-    <!-- <div class="section" v-if="toolsPackage.length > 0" key="toolsPackage">
-      <el-row class="title-row">
-        <el-col :span="isShowSalePrice ? 9 : 14"
-          >练习系统{{
-            isGiveAccessories && accessStatus ? "(赠送辅件一套)" : null
-          }}</el-col
-        >
-        <el-col :span="5" style="text-align: right;">时长</el-col>
-        <el-col :span="5" style="text-align: right;">原价</el-col>
-        <el-col :span="5" style="text-align: right;" v-if="isShowSalePrice"
-          >售价</el-col
-        >
-      </el-row>
-      <div v-for="(item, index) in toolsPackage" :key="index">
-        <el-row class="option-row" @click.native="onTrainChange(item)">
-          <el-col :span="isShowSalePrice ? 9 : 14">
-            <i
-              class="check_default"
-              :class="[
-                item.isStatus ? 'check_active' : '',
-                item.optionalFlag ? 'disabled' : ''
-              ]"
-            ></i>
-            {{ item.isStatus ? "true" : "false" }}
-            <span style="display: flex; align-items: center;">
-              <template>{{ item.name }}</template>
-            </span>
-          </el-col>
-          <el-col :span="5">
-            <span style="color: #AAA; font-size: 12px;"
-              >{{ item.num }}({{ item.period | unitFormat }})</span
-            >
-          </el-col>
-          <el-col :span="5">
-            <del style="color: #AAA; font-size: 12px;"
-              >¥{{ item.originalAmount | moneyFormat }}</del
-            >
-          </el-col>
-          <el-col :span="5" v-if="isShowSalePrice">
-            <span style="color: #1A1A1A"
-              >¥{{ item.actualAmount | moneyFormat }}</span
-            >
-          </el-col>
-        </el-row>
-        <el-row style="padding-left: 24px;" v-if="item.childGoodsList">
-          <el-col
-            v-for="(child, index) in item.childGoodsList"
-            :key="child.name"
-          >
-            <span style="font-size: 12px; color: #808080;"
-              >{{ child.name }}
-              {{ item.childGoodsList.length - 1 == index ? "" : "、" }}</span
-            >
-          </el-col>
-        </el-row>
-      </div>
-    </div> -->
-    <el-dialog
-      title="视频"
-      :visible.sync="videoStatus"
-      :modal-append-to-body="false"
-      :append-to-body="true"
-      class="videoDialog"
-      width="30%"
-    >
-      <!-- <video
-        style="width: 100%"
-        v-if="videoStatus"
-        controls="controls"
-        class="ql-video"
-        :src="'https://daya.ks3-cn-beijing.ksyun.com/202105/SWmqmvW.mp4'"
-        :poster="require('../../../assets/images/musicGroup/video_bg.png')"
-      /> -->
-      <videoTcplayer
-        v-if="videoStatus"
-        style="width: 100%"
-        controls="controls"
-        class="ql-video"
-        :src="'https://oss.dayaedu.com/daya/202105/SWmqmvW.mp4'"
-        :poster="require('../../../assets/images/musicGroup/video_bg.png')"
-      />
-    </el-dialog>
+    
+   
   </div>
 </template>
 
@@ -118,7 +38,7 @@ export default {
       let template = {
         YEAR: "年",
         MONTH: "月",
-        QUARTERLY: "季度",
+        // QUARTERLY: "季度",
         YEAR_HALF: "半年"
       };
       return template[val];
@@ -149,7 +69,7 @@ export default {
   },
   methods: {
     onTrainChange(item) {
-      // 云练习点击时
+      // 学练宝点击时
       this.$emit("onCheckItem", item, "train");
     },
     onQuestions(item) {

+ 129 - 81
src/views/resetTeaming/modals/payMember.vue

@@ -1,7 +1,7 @@
 <template>
   <div class="teamCourseList">
     <p class="coreTitle">
-      云练习
+      管乐AI学练宝
       <el-form-item
         label="是否展示"
         prop="isShowMemberForPay"
@@ -11,13 +11,23 @@
         <el-select
           style="width: 100% !important"
           v-model="form.isShowMemberForPay"
-          placeholder="请选择是否展示云练习费用"
+          placeholder="请选择是否展示学练宝费用"
           size="mini"
         >
           <el-option label="是" :value="true"> </el-option>
           <el-option label="否" :value="false"> </el-option>
         </el-select>
       </el-form-item>
+
+      <el-button
+        icon="el-icon-plus"
+        size="mini"
+        plain
+        class="addBtn"
+        @click="$listeners.create"
+        v-if="!isDisabled"
+        >新增学练宝</el-button
+      >
     </p>
 
     <el-table
@@ -28,7 +38,7 @@
     >
       <el-table-column
         width="170px"
-        label="会员类型"
+        label="学练宝版本"
         prop="memberRankSettingId"
         key="memberRankSettingId"
       >
@@ -37,14 +47,14 @@
             :prop="'memberList.' + scope.$index + '.memberRankSettingId'"
             :rules="{
               required: true,
-              message: '请选择会员类型',
+              message: '请选择学练宝版本',
               trigger: 'change'
             }"
           >
-            <el-select
+            <!-- <el-select
               style="width: 90% !important"
               v-model="form.memberList[scope.$index].memberRankSettingId"
-              placeholder="会员类型"
+              placeholder="学练宝版本"
             >
               <el-option
                 :value="item.id"
@@ -52,7 +62,19 @@
                 v-for="item in memberRankList"
                 :key="item.id"
               ></el-option>
-            </el-select>
+            </el-select> -->
+            <el-cascader
+              filterable
+              style="width: 90% !important"
+              v-model="form.memberList[scope.$index].memberRankSettingId"
+              clearable
+              placeholder="请选择学练宝版本"
+              :options="memberRankList"
+              :props="{ value: 'id', label: 'name' }"
+              @change="(val) => changeMember(val, scope.$index)"
+              @visible-change="(value) => onVisibleChange(value, form.memberList[scope.$index].memberRankSettingId)"
+
+            ></el-cascader>
           </el-form-item>
         </template>
       </el-table-column>
@@ -75,7 +97,7 @@
               style="width: 90% !important"
               v-model="form.memberList[scope.$index].optionalFlag"
               placeholder="是否必选"
-              :disabled="!form.memberList[scope.$index].memberRankSettingId"
+              :disabled="!(form.memberList[scope.$index].memberRankSettingId && form.memberList[scope.$index].memberRankSettingId.length > 0)"
               clearable
             >
               <el-option
@@ -93,7 +115,6 @@
         prop="autoActivationFlag"
         key="autoActivationFlag"
         width="170px"
-        v-if="showAutoActivationFlag"
       >
         <template slot-scope="scope">
           <el-form-item
@@ -108,7 +129,7 @@
               style="width: 90% !important"
               v-model="form.memberList[scope.$index].autoActivationFlag"
               placeholder="请选择是否自动激活"
-              :disabled="!form.memberList[scope.$index].memberRankSettingId"
+              :disabled="!(form.memberList[scope.$index].memberRankSettingId && form.memberList[scope.$index].memberRankSettingId.length > 0) || !(form.memberList[scope.$index].memberRankSettingId && showAutoActivationFlag[form.memberList[scope.$index].memberRankSettingId[form.memberList[scope.$index].memberRankSettingId.length - 1]])"
               clearable
             >
               <el-option
@@ -141,10 +162,10 @@
               :precision="0"
               :min="1"
               @change="
-                changeMemberperiodEnum(form.memberList[scope.$index].period)
+                changeMemberperiodEnum(form.memberList[scope.$index].period, scope.$index)
               "
               placeholder="会员周期"
-              :disabled="!form.memberList[scope.$index].memberRankSettingId"
+              :disabled="!(form.memberList[scope.$index].memberRankSettingId && form.memberList[scope.$index].memberRankSettingId.length > 0)"
             />
           </el-form-item>
         </template>
@@ -169,8 +190,8 @@
             <el-select
               v-model="form.memberList[scope.$index].period"
               style="width: 90% !important"
-              @change="changeMemberperiodEnum"
-              :disabled="!form.memberList[scope.$index].memberRankSettingId"
+              @change="(val) => changeMemberperiodEnum(val, scope.$index)"
+              :disabled="!(form.memberList[scope.$index].memberRankSettingId && form.memberList[scope.$index].memberRankSettingId.length > 0)"
             >
               <el-option
                 :label="item.label"
@@ -210,7 +231,7 @@
                 message: '请输入售价',
                 trigger: 'blur'
               },
-              { validator: validateMember, trigger: 'blur' }
+              { validator: validateMember, index: scope.$index, trigger: 'blur' }
             ]"
           >
             <!-- $listeners.moneyChange -->
@@ -263,20 +284,18 @@
       </el-table-column>
       <el-table-column prop="close" key="close">
         <template slot-scope="scope">
-          <div style="color: #fa6400; cursor: pointer">
-            <!--  v-if="form.length > 1" v-if="clearable" -->
-            <!-- <i
-              @click="$listeners.remove && $listeners.remove(scope.$index)"
-              class="el-icon-error"
-              style="margin-bottom: 24px"
-            ></i>
-            删除 -->
+
+          <div
+            style="color: #fa6400; cursor: pointer; display: inline-block;"
+            v-if=" form.memberList.length > 1"
+            @click="() => onRemove(scope.$index)"
+          >
+            <i class="el-icon-error"></i>
+            删除
           </div>
         </template>
       </el-table-column>
     </el-table>
-    <!--          v-if="!isCommon && $listeners.create"  @click="$listeners.create"-->
-    <!-- <el-button icon="el-icon-plus" plain class="addBtn">新增课程类型</el-button> -->
   </div>
 </template>
 <script>
@@ -301,87 +320,122 @@ export default {
       boolOptionsOptions: objectToOptions(boolOptions),
       memberEnumList,
       memberPrice: {},
+      memberPriceList: [],
       getMemberFeeFlag: true
     };
   },
-  mounted() {},
+  async mounted() {
+    this.form.memberList.forEach(async (item, index) => {
+      await this.changeMember(item.memberRankSettingId, index)
+    })
+  },
   methods: {
-    changeMemberperiodEnum(val) {
-      console.log(this.memberPrice);
+    onVisibleChange(value, id) {
+      if(!value) return
+      const tempId = id ? id[id.length - 1] : null
+      const ids = []
+      this.form.memberList.forEach(item => {
+        const itemId = item.memberRankSettingId ? item.memberRankSettingId[item.memberRankSettingId.length - 1] : null
+        if(itemId !== tempId) {
+          ids.push(itemId)
+        }
+      })
+      // console.log(ids, 'ids')
+      // console.log(value, id, 'teachList', this.memberRankList)
+      this.memberRankList.forEach((item) => {
+        if(ids.includes(item.id)) {
+          item.disabled = true;
+        } else {
+          item.disabled = false;
+        }
+
+        if(item.children && item.children.length > 0) {
+          item.children.forEach(child => {
+            if(ids.includes(child.id)) {
+              child.disabled = true;
+            } else {
+              child.disabled = false;
+            }
+          })
+        }
+      })
+      this.$forceUpdate();
+    },
+    changeMemberperiodEnum(val, index) {
+      // console.log(this.memberPriceList, val, index, "changeMemberperiodEnum");
       if (val == "DAY") {
         this.$set(
-          this.form.memberList[0],
+          this.form.memberList[index],
           "actualAmount",
-          this.memberPrice.groupPurchaseDayFee * this.form.memberList[0].num
+          this.memberPriceList[index].groupPurchaseDayFee * this.form.memberList[index].num
         );
         this.$set(
-          this.form.memberList[0],
+          this.form.memberList[index],
           "originalAmount",
-          this.memberPrice.originalDayFee * this.form.memberList[0].num
+          this.memberPriceList[index].originalDayFee * this.form.memberList[index].num
         );
       }
       if (val == "MONTH") {
         this.$set(
-          this.form.memberList[0],
+          this.form.memberList[index],
           "actualAmount",
-          this.memberPrice.groupPurchaseMonthFee * this.form.memberList[0].num
+          this.memberPriceList[index].groupPurchaseMonthFee * this.form.memberList[index].num
         );
         this.$set(
-          this.form.memberList[0],
+          this.form.memberList[index],
           "originalAmount",
-          this.memberPrice.originalMonthFee * this.form.memberList[0].num
+          this.memberPriceList[index].originalMonthFee * this.form.memberList[index].num
         );
       }
       if (val == "QUARTERLY") {
         this.$set(
-          this.form.memberList[0],
+          this.form.memberList[index],
           "actualAmount",
-          this.memberPrice.groupPurchaseQuarterlyFee *
-            this.form.memberList[0].num
+          this.memberPriceList[index].groupPurchaseQuarterlyFee *
+            this.form.memberList[index].num
         );
         this.$set(
-          this.form.memberList[0],
+          this.form.memberList[index],
           "originalAmount",
-          this.memberPrice.originalQuarterlyFee * this.form.memberList[0].num
+          this.memberPriceList[index].originalQuarterlyFee * this.form.memberList[index].num
         );
       }
       if (val == "YEAR_HALF") {
         this.$set(
-          this.form.memberList[0],
+          this.form.memberList[index],
           "actualAmount",
-          this.memberPrice.groupPurchaseHalfYearFee *
-            this.form.memberList[0].num
+          this.memberPriceList[index].groupPurchaseHalfYearFee *
+            this.form.memberList[index].num
         );
         this.$set(
-          this.form.memberList[0],
+          this.form.memberList[index],
           "originalAmount",
-          this.memberPrice.originalHalfYearFee * this.form.memberList[0].num
+          this.memberPriceList[index].originalHalfYearFee * this.form.memberList[index].num
         );
       }
       if (val == "YEAR") {
         this.$set(
-          this.form.memberList[0],
+          this.form.memberList[index],
           "actualAmount",
-          this.memberPrice.groupPurchaseYearFee * this.form.memberList[0].num
+          this.memberPriceList[index].groupPurchaseYearFee * this.form.memberList[index].num
         );
         this.$set(
-          this.form.memberList[0],
+          this.form.memberList[index],
           "originalAmount",
-          this.memberPrice.originalYearFee * this.form.memberList[0].num
+          this.memberPriceList[index].originalYearFee * this.form.memberList[index].num
         );
       }
     },
-    change() {},
-    async changeMember(val) {
-      if (val) {
+    async changeMember(val, index) {
+      if (val && val.length > 0) {
         if (this.getMemberFeeFlag) {
           this.getMemberFeeFlag = false;
           try {
             const res = await getMemberFee({
-              rankId: val,
+              rankId: val[val.length - 1],
               organId: this.organId
             });
-            this.memberPrice = res.data;
+            this.memberPriceList[index] = res.data
             this.getMemberFeeFlag = true;
             if (!res.data) {
               this.$bus.$emit("showguide", ["memberList"]);
@@ -398,40 +452,39 @@ export default {
       const one = Number(value);
       let min = 0;
       let max = 0;
-
-      switch (this.form.memberList[0]?.period) {
+      switch (this.form.memberList[rule.index]?.period) {
         case "MONTH": {
           min =
-            Number(this.rulesForm.minMonthFee) * this.form.memberList[0].num;
+            Number(this.rulesForm.minMonthFee) * this.form.memberList[rule.index].num;
           max =
-            Number(this.rulesForm.maxMonthFee) * this.form.memberList[0].num;
+            Number(this.rulesForm.maxMonthFee) * this.form.memberList[rule.index].num;
           break;
         }
         case "QUARTERLY": {
           min =
             Number(this.rulesForm.minQuarterlyFee) *
-            this.form.memberList[0].num;
+            this.form.memberList[rule.index].num;
           max =
             Number(this.rulesForm.maxQuarterlyFee) *
-            this.form.memberList[0].num;
-          console.log(
-            this.form.memberList[0]?.period,
-            min,
-            max,
-            this.rulesForm
-          );
+            this.form.memberList[rule.index].num;
+          // console.log(
+          //   this.form.memberList[rule.index]?.period,
+          //   min,
+          //   max,
+          //   this.rulesForm
+          // );
           break;
         }
         case "YEAR_HALF": {
           min =
-            Number(this.rulesForm.minHalfYearFee) * this.form.memberList[0].num;
+            Number(this.rulesForm.minHalfYearFee) * this.form.memberList[rule.index].num;
           max =
-            Number(this.rulesForm.maxHalfYearFee) * this.form.memberList[0].num;
+            Number(this.rulesForm.maxHalfYearFee) * this.form.memberList[rule.index].num;
           break;
         }
         case "YEAR": {
-          min = Number(this.rulesForm.minYearFee) * this.form.memberList[0].num;
-          max = Number(this.rulesForm.maxYearFee) * this.form.memberList[0].num;
+          min = Number(this.rulesForm.minYearFee) * this.form.memberList[rule.index].num;
+          max = Number(this.rulesForm.maxYearFee) * this.form.memberList[rule.index].num;
           break;
         }
       }
@@ -440,16 +493,11 @@ export default {
         return callback();
       }
       return callback(new Error(`定价应在${min}-${max}之间`));
-    }
-  },
-  watch: {
-    form: {
-      deep: true,
-      handler(val) {
-        if (val.memberList[0].memberRankSettingId && !this.memberPrice.id) {
-          this.changeMember(val.memberList[0].memberRankSettingId);
-        }
-      }
+    },
+    onRemove(index) {
+      this.memberPriceList.splice(index, 1)
+      this.$forceUpdate();
+      this.$listeners.remove && this.$listeners.remove(index)
     }
   },
   computed: {

+ 1 - 1
src/views/resetTeaming/modals/payTeamCourse.vue

@@ -229,7 +229,7 @@
       <el-table-column prop="close" key="close">
         <template slot-scope="scope">
           <div
-            style="color: #fa6400; cursor: pointer"
+            style="color: #fa6400; cursor: pointer; display: inline-block;"
             v-if="!isDisabled && form.eclass.length > 1"
             @click="$listeners.remove && $listeners.remove(scope.$index)"
           >

+ 7 - 14
src/views/resetTeaming/modals/review-detail.vue

@@ -201,21 +201,21 @@
       </el-table-column>
     </el-table>
     <el-alert
-      title="云练习"
+      title="学练宝"
       :closable="false"
       class="alert"
       type="info"
-      v-if="memberRankSettingId"
+      v-if="member.length > 0"
     >
     </el-alert>
     <el-table
-      :data="[{ ...member }]"
+      :data="member"
       stripe
-      v-if="memberRankSettingId"
+      v-if="member.length > 0"
       style="width: 100%; margin-top: 10px"
       :header-cell-style="{ background: '#EDEEF0', color: '#444' }"
     >
-      <el-table-column prop="name" label="会员类型" width="120">
+      <el-table-column prop="name" label="学练宝版本" width="120">
       </el-table-column>
       <el-table-column prop="optionalFlag" label="是否必选" width="100px">
         <template slot-scope="scope">{{
@@ -235,10 +235,10 @@
         </template>
       </el-table-column>
       <el-table-column prop="num" label="数量" width="120"> </el-table-column>
-      <el-table-column prop="actualAmount" label="价(元)" width="120">
+      <el-table-column prop="actualAmount" label="团购价(元)" width="120">
         <template slot="header">
           <p style="position: relative">
-            价(元)
+            团购价(元)
             <el-tooltip placement="top" popper-class="mTooltip">
               <div slot="content">学生实际缴费金额</div>
               <i
@@ -518,13 +518,6 @@ export default {
       }
       return "";
     },
-    memberRankSettingId() {
-      const active = this.member?.memberRankSettingId;
-      if (active) {
-        return active;
-      }
-      return "";
-    },
     calenderFeeJson() {
       const calenderFee = this.calender?.calenderFeeJson;
       if (calenderFee) {

+ 22 - 2
src/views/resetTeaming/modals/signUpPayment.less

@@ -29,7 +29,12 @@
     padding-bottom: 2px;
     width: 100%;
     justify-content: space-between;
-
+    .title-name {
+      max-width: 77%;
+      white-space: nowrap;
+      overflow: hidden;
+      text-overflow: ellipsis;
+    }
     .icon_video {
       margin-left: 9px;
       display: inline-block;
@@ -39,7 +44,7 @@
       background-size: 100%;
     }
 
-    > span {
+    .lookVideo {
       display: flex;
       font-size: 11px;
       line-height: 1.5;
@@ -339,6 +344,15 @@
   font-size: 14px;
 }
 
+.option-intro {
+  padding-top: 3px;
+  .el-col {
+    font-size: 13px;
+    color: #777777;
+    line-height: 20px;
+  }
+}
+
 .option-row {
   line-height: 26px;
   font-size: 14px;
@@ -383,5 +397,11 @@
   ::v-deep .el-dialog__body {
     padding: 0;
     font-size: 0;
+
+    .video-js {
+      height: 324px;
+    }
   }
 }
+
+

+ 77 - 94
src/views/resetTeaming/modals/subject-preview.vue

@@ -32,10 +32,26 @@
       :accessStatus="accessOries.length > 0"
       @onCheckItem="onCheckItem"
     >
-      <div class="section" v-if="toolsPackage.length > 0" key="toolsPackage">
+      <template  v-if="toolsPackage.length > 0">
+        <div  v-for="(item, index) in toolsPackage" :key="index">
+        <div class="yunTrain">
+        <img :src="trainBg" />
+        <div class="toolText">
+          <p class="toolTitle">
+            <span class="title-name">{{ item.name }}</span>
+            <span class="lookVideo"
+              >查看视频<i class="icon_video" @click="videoStatus = true"></i
+            ></span>
+          </p>
+          <p class="toolDate">
+            购买后根据教学情况激活使用,详情咨询机构老师
+          </p>
+        </div>
+      </div>
+      <div class="section" >
         <el-row class="title-row">
           <el-col :span="12"
-            >练习系统{{
+            >学练宝版本{{
               isGiveAccessories && accessStatus ? "(赠送辅件一套)" : null
             }}</el-col
           >
@@ -45,33 +61,31 @@
             >售价</el-col
           > -->
         </el-row>
-        <div v-for="(item, index) in toolsPackage" :key="index">
-          <template v-for="(child, index) in formatList">
+        <div>
             <el-row class="option-row" style="cursor: default;" :key="index">
               <el-col :span="12" style="padding-left: 0.05rem">
                 <span style="display: flex; align-items: center;">
-                  {{ child.title }}
+                  {{ item.name }}
                 </span>
               </el-col>
               <el-col :span="5">
                 <span style="color: #AAA; font-size: 12px;"
-                  >{{ item.num | unitFormatMonth(item.period) }}个月</span
+                  >{{ item.num  }}{{ item.period | unitFormat }}</span
                 >
               </el-col>
               <el-col :span="7" style="text-align: right;">
                 <del style="color: #1A1A1A; font-size: 14px;width: 100%"
                   >¥{{
-                    child.monthPrice
-                      | unitFormatPrice(
-                        item.period,
-                        item.num,
-                        child.halfYearPrice
-                      )
+                    item.originalAmount | moneyFormat
                   }}</del
                 >
               </el-col>
             </el-row>
-          </template>
+            <el-row class="option-intro">
+              <el-col :span="24" style="padding-left: 0.05rem">
+                {{ item.intro }}
+              </el-col>
+            </el-row>
 
           <div class="paymentSection" @click="onCheckItem(item, 'train')">
             <i
@@ -83,11 +97,13 @@
             ></i>
             <div class="paymentPrice">
               <span>优惠价:¥{{ item.actualAmount | moneyFormat }}</span>
-              <del>原价:¥ {{ onCalcSinglePrice(item) }}</del>
             </div>
           </div>
         </div>
       </div>
+      </div>
+      </template>
+      
     </member>
 
     <instrument-model
@@ -199,9 +215,28 @@
 
       <a class="btn-submit">购买</a>
     </div> -->
+
+    <el-dialog
+      title="视频"
+      :visible.sync="videoStatus"
+      :modal-append-to-body="false"
+      :append-to-body="true"
+      class="videoDialog"
+      width="576px"
+    >
+      <videoTcplayer
+        v-if="videoStatus"
+        style="width: 100%"
+        controls="controls"
+        class="ql-video"
+        :src="'https://oss.dayaedu.com/daya/202105/SWmqmvW.mp4'"
+        :poster="require('../../../assets/images/musicGroup/video_bg.png')"
+      />
+    </el-dialog>
   </div>
 </template>
 <script>
+import videoTcplayer from "@/components/video-tcplayer";
 import { permission } from "@/utils/directivePage";
 import { getSubjectGoodsAndInfoPreview, getType } from "@/api/buildTeam";
 import dayjs from "dayjs";
@@ -225,7 +260,8 @@ export default {
     InstrumentModel,
     accessories,
     activity,
-    member
+    member,
+    videoTcplayer
   },
   data() {
     const query = this.$route.query;
@@ -242,8 +278,8 @@ export default {
       balance: 0, // 余额
       needPrice: 0, // 还需支付
       payType: false, // 是否余额支付
-      cloudTeacherFee: 0, // 云练习费用
-      cloudTeacherPlusFee: 0, // 云练习+
+      cloudTeacherFee: 0, // 学练宝费用
+      cloudTeacherPlusFee: 0, // 学练宝+
       orderInfo: {
         marketPrice: 0,
         amount: 0, // 现价总金额
@@ -283,9 +319,9 @@ export default {
       isClickStatus: false,
       accessStatus: false, // 是否有辅件乐保
       accessIsShowStatus: false, // 是否显示辅件 true 显示, false 不显示
-      memberCoursePrice: [], // 云练习,显示赠送的课程
+      memberCoursePrice: [], // 学练宝,显示赠送的课程
       memberCourseShowFlag: false, // 是否显示赠送课程
-      buyCloudTeacher: false, // 是否购买云练习
+      buyCloudTeacher: false, // 是否购买学练宝
       remissionCourseFeeStatus: false,
       isGiveAccessories: false, // 是否赠送辅件
       giveAccessoriesStatus: false,
@@ -357,6 +393,7 @@ export default {
               isShowVipCourseForPay: true,
               isShowMusicCourseForPay: true
             };
+      console.log(this.preViewData)
       this.courseViewType = tempResult.musicGroup.courseViewType || 0;
       this.isGiveAccessories =
         (tempResult.musicGroup && tempResult.musicGroup.isGiveAccessories) ||
@@ -408,27 +445,15 @@ export default {
 
       let tempInfo =
         paymentCalender && paymentCalender.course ? paymentCalender.course : [];
-      let memberPrivilegesItemList = tempResult.memberPrivilegesItemList
-        ? tempResult.memberPrivilegesItemList
-        : [];
-      let tempMember = [];
-      memberPrivilegesItemList.forEach(member => {
-        if (
-          member.memberPrivilegesItems &&
-          member.memberPrivilegesItems.length > 0
-        ) {
-          member.memberPrivilegesItems.forEach(item => {
-            tempMember.push(item.name);
-          });
-        }
-      });
-      // 云练习
+
+      // 学练宝
       const member =
-        paymentCalender && paymentCalender.member ? paymentCalender.member : {};
+        paymentCalender && paymentCalender.member ? paymentCalender.member : [];
 
-      member.isStatus = true;
-      this.toolsPackage = member && !member.memberRankSettingId ? [] : [member];
-      console.log(this.toolsPackage, "this.toolsPackage");
+      member.forEach((item) => {
+        item.isStatus = true;
+      })
+      this.toolsPackage = member;
 
       // 乐器保养
       const repair =
@@ -627,7 +652,7 @@ export default {
       }
     },
     // onTrainChange(item) {
-    //   // 云练习点击时
+    //   // 学练宝点击时
     //   // this.$emit("onCheckItem", item, "train");
 
     // },
@@ -664,7 +689,7 @@ export default {
       this.$forceUpdate();
     },
     giveAccessoriesSetStatus() {
-      let status = false; // 是否有选中云练习
+      let status = false; // 是否有选中学练宝
       this.toolsPackage.forEach(item => {
         if (item.isStatus) {
           status = true;
@@ -757,7 +782,7 @@ export default {
         });
       }
 
-      // 云练习
+      // 学练宝
       const toolsPackage = this.toolsPackage;
       if (toolsPackage.length > 0) {
         toolsPackage.forEach(item => {
@@ -804,10 +829,16 @@ export default {
               }
             } else if (item.kitType == "GROUP") {
               // 团购
+               let isToolStatus = false
+                this.toolsPackage.forEach(item => {
+                  if(item.isStatus) {
+                    isToolStatus = true
+                  }
+                })
               if (
                 this.courseViewType == 2 &&
                 this.organId == 55 &&
-                !this.toolsPackage[0].isStatus
+                !isToolStatus
               ) {
                 amount += parseFloat(item.discountPrice);
                 goodsPrice += parseFloat(item.discountPrice);
@@ -915,65 +946,17 @@ export default {
     },
     permission(str) {
       return permission(str);
-    },
-    onCalcSinglePrice(item) {
-      const tempNum = {
-        YEAR: 12,
-        MONTH: 1,
-        QUARTERLY: 3,
-        YEAR_HALF: 6
-      };
-      const num = (tempNum[item.period] || 1) * item.num;
-      let price = 0;
-      if (num % 6 === 0) {
-        const halfYearNum = Number(num / 6);
-        this.formatList.forEach(format => {
-          price += Number(format.halfYearPrice * halfYearNum);
-        });
-      } else {
-        this.formatList.forEach(format => {
-          price += Number(format.monthPrice * num);
-        });
-      }
-
-      return numeral(Number(price)).format("0,0.00");
     }
   },
   filters: {
     unitFormat(val) {
       let template = {
-        YEAR: "年",
-        MONTH: "月",
-        QUARTERLY: "季度",
-        YEAR_HALF: "半年"
+        YEAR: "(年)",
+        MONTH: "(月)",
+        // QUARTERLY: "(季度)",
+        YEAR_HALF: "(半年)"
       };
       return template[val];
-    },
-    unitFormatMonth(val, period) {
-      const tempNum = {
-        YEAR: 12,
-        MONTH: 1,
-        QUARTERLY: 3,
-        YEAR_HALF: 6
-      };
-      return val * (tempNum[period] || 1);
-    },
-    unitFormatPrice(val, type, nums, halfYearPrice) {
-      const tempNum = {
-        YEAR: 12,
-        MONTH: 1,
-        QUARTERLY: 3,
-        YEAR_HALF: 6
-      };
-      const num = (tempNum[type] || 1) * nums;
-      let price = 0;
-      if (num % 6 === 0) {
-        const halfYearNum = Number(num / 6);
-        price += Number(halfYearPrice * halfYearNum);
-      } else {
-        price += Number(val * num);
-      }
-      return numeral(price).format("0,0.00");
     }
   }
 };

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

@@ -488,7 +488,7 @@ export default {
     async init() {
       let organId = this.baseInfo?.musicGroup?.organId;
       this.courseViewType = this.baseInfo?.musicGroup?.courseViewType;
-      // 如果为学员缴费且是乐团缴费则显示云练习的价格
+      // 如果为学员缴费且是乐团缴费则显示学练宝的价格
       //  进行中添加
       if (this.courseViewType == 2 && !this.rowDetail && !this.isUserType) {
         this.$set(this.form, "leixing", "2");

+ 3 - 3
src/views/sporadicManager/sporadicList.vue

@@ -550,7 +550,7 @@ export default {
         { label: "账户充值", value: 9 },
         // { label: "乐保服务", value: 10 },
         // { label: "网基课活动", value: 13 },
-        // { label: "云练习购买", value: 15 },
+        // { label: "学练宝购买", value: 15 },
         { label: "其它", value: 11 }
       ],
       orderType1: [
@@ -564,7 +564,7 @@ export default {
         { label: "其它", value: 11 }
         // { label: "乐保服务", value: 10 },
         // { label: "网基课活动", value: 13 },
-        // { label: "云练习购买", value: 15 },
+        // { label: "学练宝购买", value: 15 },
       ],
       maskForm: {
         organId: [],
@@ -1045,7 +1045,7 @@ export default {
         11: "其它",
         12: "双十一活动",
         13: "网基课活动",
-        15: "云练习购买"
+        15: "学练宝购买"
       };
       return template[val];
     }

+ 18 - 3
src/views/studentManager/api.js

@@ -40,11 +40,26 @@ export const cloudQueryPage = data =>
     params: data
   });
 
-// 设置云练习会员时长
+// 设置学练宝会员时长
 export const setStudentMembe = data =>
   request2({
     url: "/api-web/studentManage/updateStudentMember",
     method: "post",
-    data: data,
-    requestType: "form"
+    data: data
   });
+
+//  学练宝记录
+export const api_studentMemberUpdateLog = data =>
+  request2({
+    url: "/api-web/studentMemberUpdateLog/page",
+    method: "post",
+    data: data
+  });
+
+// 用户信息
+export const api_studentManageUserInfo = data =>
+  request2({
+    url: "/api-web/studentManage/queryUserInfo",
+    method: "get",
+    params: data
+  });

+ 3 - 3
src/views/studentManager/memberList.vue

@@ -206,7 +206,7 @@
           <el-popover placement="right" width="500" trigger="click">
             <div class="popoverWrap">
               <p>乐团退团退费规则:</p>
-              <p>退还云练习费用:报名缴费时缴费的云练习费用</p>
+              <p>退还学练宝费用:报名缴费时缴费的学练宝费用</p>
               <p>退还课程费用:缴费总额-已结束课时单价之和</p>
               <p>退还乐器费用:报名缴费时缴纳的乐器费用(团购、租金)</p>
               <p>退还教辅费用:报名缴费时缴费的教辅费用</p>
@@ -312,7 +312,7 @@
           <el-popover placement="right" width="500" trigger="click">
             <div class="popoverWrap">
               <p>乐团退团退费规则:</p>
-              <p>退还云练习费用:报名缴费时缴费的云练习费用</p>
+              <p>退还学练宝费用:报名缴费时缴费的学练宝费用</p>
               <p>退还课程费用:缴费总额-已结束课时单价之和</p>
               <p>退还乐器费用:报名缴费时缴纳的乐器费用(团购、租金)</p>
               <p>退还教辅费用:报名缴费时缴费的教辅费用</p>
@@ -500,7 +500,7 @@ export default {
                 maintenanceFee: this.quitForm.maintenanceFee,
                 isRefundMemberFee: this.quitForm.isRefundMemberFee
               };
-              // 退还云练习费用
+              // 退还学练宝费用
               if (this.quitForm.isRefundMemberFee) {
                 params.cloudTeacherAmount = this.quitForm.cloudTeacherAmount;
               } else {

+ 100 - 26
src/views/studentManager/modals/createMember.vue

@@ -1,33 +1,57 @@
 <template>
   <div>
     <!-- <p class="title">已选择{{ multipleSelection.length }}名学员</p> -->
-    <el-form :model="memberForm" label-width="100px" ref="memberForm">
+    <el-form :model="memberForm" label-width="110px" ref="memberForm">
+      <el-form-item label="学练宝版本" prop="memberRankId" :rules="[
+          { required: true, message: '请选择学练宝版本', trigger: 'blur' }
+        ]">
+          <el-cascader
+            v-model.trim="memberForm.memberRankId"
+            style="width: 100% !important"  
+            :options="memberRankList"
+            :props="{ value: 'id', label: 'name',  }"
+            :show-all-levels="false"
+            collapse-tags
+            clearable
+            @change="getMemberList"
+            placeholder="请选择学练宝版本"
+          ></el-cascader>
+          <!-- <el-select
+            placeholder="请选择学练宝版本"
+            clearable
+            v-model.trim="memberForm.memberRankId"
+            @change="getMemberList"
+            style="width: 100% !important"
+          >
+            <el-option v-for="(item, index) in memberFeeSettingList" :key="index" :label="item.rankName" :value="item.id"></el-option>
+          </el-select> -->
+        </el-form-item>
       <el-form-item
-        label="云练习单位"
+        label="学练宝周期"
         prop="period"
         :rules="[
-          { required: true, message: '请选择云练习单位', trigger: 'blur' }
+          { required: true, message: '请选择学练宝周期', trigger: 'blur' }
         ]"
       >
         <el-select
-          placeholder="云练习单位"
+          placeholder="学练宝周期"
           clearable
           v-model.trim="memberForm.period"
           @change="getMemberList"
           style="width: 100% !important"
         >
           <el-option label="月度" value="MONTH"></el-option>
-          <el-option label="季度" value="QUARTERLY"></el-option>
+          <!-- <el-option label="季度" value="QUARTERLY"></el-option> -->
           <el-option label="半年" value="YEAR_HALF"></el-option>
           <el-option label="年度" value="YEAR"></el-option>
           <!-- <el-option label="固定天数" value="DAY"></el-option> -->
         </el-select>
       </el-form-item>
       <el-form-item
-        label="云练习周期"
+        label="学练宝周期数"
         prop="memberNum"
         :rules="[
-          { required: true, message: '请输入云练习周期', trigger: 'blur' }
+          { required: true, message: '请输入学练宝周期数', trigger: 'blur' }
         ]"
       >
         <el-input
@@ -35,7 +59,7 @@
           @input="getMemberList"
           onKeypress="return (/[\d]/.test(String.fromCharCode(event.keyCode)))"
           v-model="memberForm.memberNum"
-          placeholder="请输入云练习周期"
+          placeholder="请输入学练宝周期数"
         >
         </el-input>
       </el-form-item>
@@ -79,53 +103,80 @@
 </template>
 <script>
 import { add, update } from "../api";
-import { getmemberRankOrganizationFeeMapper } from "@/views/categroyManager/productSystem/api";
+import { getmemberRankOrganizationFeeMapper, getAllMemberFindByOrganIds } from "@/views/categroyManager/productSystem/api";
 import { sysConfigList } from "@/api/generalSettings"; // 平台的修改和查
 export default {
   props: ["multipleSelection", "type"],
   data() {
     return {
       memberForm: {
+        memberRankId: [],
         memberNum: null,
         actualAmount: null,
         period: null,
         remark: null
       },
       userIds: [],
+      memberRankList: [],
       organId: null,
       rulesForm: null, // 范围
+      memberFeeSettingList: [],
       memberFeeSetting: null
     };
   },
-  mounted() {
-    console.log(this.multipleSelection);
+ async mounted() {
     if (this.type == "update") {
       const {
         memberNum,
         actualAmount,
+        memberRankSettingId,
         period,
         remark,
         organId,
         id
       } = this.multipleSelection;
+      this.organId = organId;
+      // const memberInfo = await getAllMemberFindByOrganIds([organId])
+      // this.memberRankList = memberInfo.data || []
       this.memberForm = {
         memberNum,
+        memberRankId: memberRankSettingId,  // this.formatParentId(memberRankSettingId, this.memberRankList),
         period,
         actualAmount,
         remark,
         id
       };
-      this.organId = organId;
+      
     } else {
       this.userIds = this.multipleSelection.map(stu => {
         return stu.userId;
       });
       this.organId = this.multipleSelection[0].organId; //
+      // const memberInfo = await getAllMemberFindByOrganIds([this.organId])
+      // this.memberRankList = memberInfo.data || []
     }
-
+   
     this.__init();
   },
   methods: {
+    formatParentId(id, list, ids = []) {
+      for (const item of list) {
+        if (item.children) {
+          const cIds = this.formatParentId(
+            id,
+            item.children,
+            [...ids, item.id]
+          );
+          if (cIds.includes(id)) {
+            return cIds;
+          }
+        }
+        if (item.id === id) {
+          return [...ids, id];
+        }
+      }
+      return ids;
+    },
     async __init() {
       try {
         const res = await sysConfigList({ group: "DEFAULT" });
@@ -141,23 +192,40 @@ export default {
           }
         });
 
-        const rankInfo = await getmemberRankOrganizationFeeMapper({
-          page: 1,
-          rows: 10,
-          organId: this.organId
-        });
-        // console.log(rankInfo)
-        const { rows } = rankInfo.data;
-        if (!rows[0]?.memberFeeSetting) {
-          this.$bus.$emit("showguide", ["memberList"]);
+        // const rankInfo = await getmemberRankOrganizationFeeMapper({
+        //   page: 1,
+        //   rows: 10,
+        //   organId: this.organId
+        // });
+        // const { rows } = rankInfo.data;
+        // this.memberFeeSettingList = rows || [];
+        // if (this.memberFeeSettingList.length <= 0) {
+        //   this.$bus.$emit("showguide", ["memberList"]);
+        // }
+
+        const rankInfo = await getAllMemberFindByOrganIds([this.organId], true)
+        this.memberRankList = rankInfo.data || []
+        if (this.type == "update") {
+          const { memberRankSettingId } = this.multipleSelection;
+          this.memberForm.memberRankId = this.formatParentId(memberRankSettingId, this.memberRankList);
+          this.$forceUpdate()
         }
-        this.memberFeeSetting = rows[0]?.memberFeeSetting;
       } catch (e) {}
     },
     getMemberList() {
       let money = 0;
       const memberForm = this.memberForm;
-      const memberFeeSetting = this.memberFeeSetting;
+      let memberFeeSetting = null
+      const memberRankId = this.memberForm.memberRankId || []
+      this.memberRankList.forEach(item => {
+        if(item.id === memberRankId[0]) {
+          item.children.forEach(child => {
+            if(child.id === memberRankId[1]) {
+              memberFeeSetting = child.memberFeeSetting
+            }
+          })
+        }
+      })
       if (memberFeeSetting) {
         switch (memberForm?.period) {
           case "MONTH": {
@@ -195,19 +263,25 @@ export default {
         console.log(res, this.type, "res");
         if (res) {
           try {
+            let rankId = null
+            if(this.memberForm.memberRankId && this.memberForm.memberRankId.length > 0) {
+              rankId = this.memberForm.memberRankId[this.memberForm.memberRankId.length - 1]
+            }
             if (this.type == "update") {
               await update({
                 ...this.memberForm,
+                memberRankSettingId: rankId,
                 organId: this.organId
               });
-              this.$message.success("创建云练习成功");
+              this.$message.success("创建学练宝成功");
             } else {
               await add({
                 ...this.memberForm,
+                memberRankSettingId: rankId,
                 userIds: this.userIds,
                 organId: this.organId
               });
-              this.$message.success("创建云练习成功");
+              this.$message.success("创建学练宝成功");
             }
             this.$emit("close");
             this.$emit("submited");

+ 4 - 1
src/views/studentManager/modals/recordDetail.vue

@@ -2,7 +2,10 @@
   <div>
     <!-- <el-alert title="基础信息" :closable="false" class="alert" type="info" /> -->
     <descriptions :column="3" style="margin-bottom: 20px;">
-      <descriptions-item label="云练习单位">{{
+      <descriptions-item label="学练宝版本">{{
+        detail.name
+      }}</descriptions-item>
+      <descriptions-item label="周期">{{
         detail.period | memberEnumType
       }}</descriptions-item>
       <descriptions-item label="周期数">{{

+ 125 - 36
src/views/studentManager/modals/setMemberDate.vue

@@ -1,22 +1,59 @@
 <template>
   <div>
     <!-- <p class="title">已选择{{ multipleSelection.length }}名学员</p> -->
-    <el-form :model="memberForm" label-width="100px" ref="memberForm">
-      <el-form-item label="到期日期" prop="endTime">
-        <el-date-picker
-          style="width: 360px !important"
-          v-model.trim="memberForm.endTime"
-          align="right"
-          type="date"
-          placeholder="选择日期"
-          value-format="yyyy-MM-dd"
-          :picker-options="pickerOptions"
-        ></el-date-picker>
+    <el-form :model="memberForm" label-width="110px" ref="memberForm">
+      <el-form-item label="学练宝版本" prop="memberRankSettingId" :rules="[
+          { required: true, message: '请选择学练宝版本' }
+        ]">
+        <el-cascader
+          v-model.trim="memberForm.memberRankSettingId"
+          :options="memberRankList"
+          :props="{ value: 'id', label: 'name'  }"
+          :show-all-levels="false"
+          style="width: 100% !important"
+          collapse-tags
+          clearable
+          placeholder="请选择学练宝版本"
+          @change="formatCloudInfo"
+        ></el-cascader>
+        <div v-if="selectItem.memberRankId">{{ selectItem.memberRankName }}剩余<span style="color: red;">{{ selectItem.remainingDays }}</span>天</div>
+      </el-form-item>
+      <el-form-item :label="`${staffText}周期`" prop="periodType" :rules="[
+          { required: true, message: '请选择周期' }
+        ]">
+        <el-select
+          placeholder="请选择周期"
+          clearable
+          v-model.trim="memberForm.periodType"
+          style="width: 100% !important"
+          :disabled="type !== 'add'"
+        >
+          <el-option v-if="type !== 'add'" label="天" value="DAY"></el-option>
+          <el-option label="月度" value="MONTH"></el-option>
+          <!-- <el-option label="季度" value="QUARTERLY"></el-option> -->
+          <el-option label="半年" value="YEAR_HALF"></el-option>
+          <el-option label="年度" value="YEAR"></el-option>
+        </el-select>
+      </el-form-item>
+      <el-form-item
+        :label="`${staffText}数量`"
+        prop="number"
+        :rules="[
+          { required: true, message: '请输入数量', trigger: 'blur' },
+          { validator: validateNum, trigger: 'blur' }
+        ]"
+      >
+        <el-input
+          type="number"
+          v-model="memberForm.number"
+          placeholder="请输入数量"
+        >
+        </el-input>
       </el-form-item>
       <el-form-item
-        label="备注"
+        :label="`${staffText}原因`"
         prop="memo"
-        :rules="[{ required: true, message: '请输入备注', trigger: 'blur' }]"
+        :rules="[{ required: true, message: '请输入原因', trigger: 'blur' }]"
       >
         <el-input
           type="textarea"
@@ -24,56 +61,108 @@
           maxlength="100"
           :rows="3"
           v-model.trim="memberForm.memo"
-          placeholder="请输入备注"
+          placeholder="请输入原因"
         ></el-input>
       </el-form-item>
+      <el-form-item label="是否发送推送" prop="pushFlag" :rules="[
+          { required: true, message: '是否发送推送', trigger: 'blur' }
+        ]">
+        <el-radio-group v-model="memberForm.pushFlag">
+          <el-radio :label="1">是</el-radio>
+          <el-radio :label="0">否</el-radio>
+        </el-radio-group>
+      </el-form-item>
     </el-form>
+
+    <div slot="footer" class="dialog-footer" style="text-align: right;">
+      <el-button @click="onClose">取 消</el-button>
+      <el-button type="primary" @click="onSubmit">确 定</el-button>
+    </div>
   </div>
 </template>
 <script>
 import { setStudentMembe } from "../api";
-import { getmemberRankOrganizationFeeMapper } from "@/views/categroyManager/productSystem/api";
-import { sysConfigList } from "@/api/generalSettings"; // 平台的修改和查
+import { getmemberRankList, getAllMemberFindByOrganIds } from '@/views/categroyManager/productSystem/api'
 export default {
   props: ["row", "type"],
   data() {
     return {
+      memberRankList: [],
       memberForm: {
-        userId: null,
-        endTime: null,
+        studentId: null,
+        memberRankSettingId: null,
+        number: null,
+        periodType: null,
         memo: null,
+        pushFlag: 1
       },
-      userIds: [],
       organId: null,
       rulesForm: null, // 范围
       memberFeeSetting: null,
-      pickerOptions: {
-        firstDayOfWeek: 1,
-        disabledDate(time) {
-          return time.getTime() < new Date().getTime() - 86400000;
-        },
-      },
+      selectItem: {}
     };
   },
+  computed: {
+    staffText() {
+      return this.type === 'add' ? '添加' : '扣减'
+    }
+  },
   mounted() {
-    console.log(this.row, "mounted");
-
-    this.memberForm.userId = this.row.userId;
-    this.memberForm.endTime = this.row.membershipEndTime;
-    console.log(this.memberForm);
+    this.memberForm.studentId = this.row.student.userId;
+    console.log(this.row, 'this.row')
+    if(this.type !== "add") {
+      this.memberForm.periodType = "DAY"
+    }
+    this.getMemberList()
   },
   methods: {
-    async __init() {},
-
-    submit() {
+    validateNum(rule,  value, callback) {
+      if(/^[1-9]\d*$/.test(value)) {
+        return callback()
+      } else {
+        return callback(new Error(`请输入大于0的正整数`));
+      }
+    },
+    async getMemberList() {
+      try {
+        if(this.type === 'add') {
+          const { data } = await getAllMemberFindByOrganIds([this.row.student.organId], false)
+          this.memberRankList = data || [];
+        } else {
+          const { data } = await getmemberRankList({  studentId: this.type === 'add' ? null : this.memberForm.studentId, delFlag: true })
+          this.memberRankList = data || [];
+        }
+      } catch (e) {
+        console.log(e);
+      }
+    },
+    formatCloudInfo(val) {
+      const vipInfo = this.row.vipInfo || []
+      let rankId = val ? val[val.length - 1] : null
+      let selectItem = {}
+      vipInfo.forEach(item => {
+        if(item.memberRankId === rankId) {
+          selectItem = item
+        }
+      })
+      this.selectItem = selectItem
+    },
+    onClose() {
+      this.$emit("close");
+    },
+    onSubmit() {
       this.$refs.memberForm.validate(async (res) => {
-        console.log(res, this.type, "res");
         if (res) {
           try {
-            const res = await setStudentMembe({ ...this.memberForm });
+            const { memberRankSettingId, ...more } = this.memberForm
+            let rankId = null;
+            if(memberRankSettingId && memberRankSettingId.length > 0) {
+              rankId = memberRankSettingId[memberRankSettingId.length - 1]
+            }
+            await setStudentMembe({ ...more, memberRankId: rankId, type: this.type === 'add' ? 2 : 3});
             this.$message.success("修改成功");
             this.$emit("close");
-            this.$emit("submited");
+            this.$emit("confirm");
           } catch (e) {
             console.log(e);
           }

+ 274 - 0
src/views/studentManager/modals/setMemberList.vue

@@ -0,0 +1,274 @@
+<template>
+  <div>
+    <save-form
+        :inline="true"
+        class="searchForm"
+        @submit="onSearch"
+        @reset="onReSet"
+        ref="saveForm"
+        save-key="studentLit-memberChange"
+        :model.sync="searchForm"
+      >
+      <el-form-item prop="memberRankSettingId">
+        <el-cascader
+          v-model.trim="searchForm.memberRankSettingId"
+          :options="memberRankList"
+          :props="{ value: 'id', label: 'name'  }"
+          :show-all-levels="false"
+          collapse-tags
+          clearable
+          placeholder="请选择学练宝版本"
+        ></el-cascader>
+      </el-form-item>
+      <el-form-item prop="buyType">
+        <el-select
+            class="multiple"
+            v-model.trim="searchForm.buyType"
+            clearable
+            placeholder="请选择变更方式"
+          >
+            <el-option label="自行购买" value="1"></el-option>
+            <el-option label="后台添加" value="2"></el-option>
+            <el-option label="后台扣减" value="3"></el-option>
+          </el-select>
+      </el-form-item>
+      <el-form-item prop="operatorName">
+          <el-input
+            clearable
+            placeholder="请输入操作人"
+            @keydown.enter.native="
+              e => {
+                e.target.blur();
+                $refs.saveForm.save();
+                onSearch();
+              }
+            "
+            v-model.trim="searchForm.operatorName"
+          ></el-input>
+        </el-form-item>
+        <el-form-item prop="timer">
+          <el-date-picker
+            :clearable="false"
+            v-model.trim="searchForm.timer"
+            style="width: 420px"
+            type="daterange"
+            clearable
+            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>
+
+      <el-button
+        @click="operationTimer('add')"
+        type="primary"
+        style="margin-bottom: 20px"
+        v-if="$helpers.permission('studentManage/updateStudentMember')"
+      >
+        添加时长
+      </el-button>
+      <el-button
+        @click="operationTimer('plus')"
+        type="default"
+        style="margin-bottom: 20px"
+         v-if="$helpers.permission('studentManage/updateStudentMember')"
+      >
+        扣减时长
+      </el-button>
+    <div class="tableWrap">
+        <el-table
+          style="width: 100%"
+          :header-cell-style="{ background: '#EDEEF0', color: '#444' }"
+          :data="tableList"
+        >
+        <el-table-column
+            align="center"
+            prop="buyType"
+            label="变更方式"
+          >
+          <template slot-scope="scope">
+            {{ scope.row.buyType | filterBuyType }}   
+          </template>
+        </el-table-column>
+          <el-table-column
+            align="center"
+            prop="memberRankSettingName"
+            label="学练宝版本"
+          ></el-table-column>
+          <el-table-column
+            align="center"
+            prop="type"
+            label="周期"
+          >
+          <template slot-scope="scope">
+            {{ scope.row.type | memberEnumType }}   
+          </template>
+          </el-table-column>
+          <el-table-column
+            align="center"
+            prop="time"
+            label="数量"
+          >
+            <template slot-scope="scope">{{ scope.row.time }}   
+            </template>
+          </el-table-column>
+          <el-table-column
+            align="center"
+            prop="operatorName"
+            label="操作人"
+          ></el-table-column>
+          <el-table-column
+            align="center"
+            prop="createTime"
+            label="操作时间"
+          ></el-table-column>
+          <el-table-column align="center" prop="activeDate" label="原因">
+            <template slot-scope="scope">
+              <Tooltip
+                :content="
+                  scope.row.memo
+                    ? scope.row.memo
+                    : '--'
+                "
+              />
+            </template>
+          </el-table-column>
+      </el-table>
+      <pagination
+          sync
+          save-key="studentLit-memberChange"
+          :total.sync="pageInfo.total"
+          :page.sync="pageInfo.page"
+          :limit.sync="pageInfo.limit"
+          :page-sizes="pageInfo.page_size"
+          @pagination="getList"
+        />
+    </div>
+
+    <el-dialog
+      :title="`${operationType === 'add' ? '添加': '扣减'}学练宝`"
+      width="600px"
+      :visible.sync="cloudDateVisible"
+      append-to-body
+      @close="() => {
+          getList()
+          getUserInfo()
+        }"
+    >
+      <setMemberDate
+        v-if="cloudDateVisible"
+        :memberRankList="memberRankList"
+        :type="operationType"
+        :row="userDetail"
+        @close="cloudDateVisible = false"
+        @confirm="() => {
+          getList()
+          getUserInfo()
+        }"
+      ></setMemberDate>
+    </el-dialog>
+  </div>
+</template>
+<script>
+import setMemberDate from "./setMemberDate";
+import pagination from "@/components/Pagination/index";
+import Tooltip from "@/components/Tooltip";
+import { api_studentMemberUpdateLog, api_studentManageUserInfo } from "../api";
+import { getTimeFormat } from "@/utils";
+export default {
+  props: ["row", "type", "memberRankList"],
+  components: {
+    pagination,
+    Tooltip,
+    setMemberDate
+  },
+  data() {
+    return {
+      userDetail: {},
+      cloudDateVisible: false,
+      searchForm: {
+        memberRankSettingId: null,
+        buyType: null,
+        operatorName: null,
+        timer: [],
+      },
+      tableList: [],
+      pageInfo: {
+        // 分页规则
+        limit: 10, // 限制显示条数
+        page: 1, // 当前页
+        total: 0, // 总条数
+        page_size: [10, 20, 40, 50] // 选择限制显示条数
+      },
+      operationType: 'add',
+    };
+  },
+  mounted() {
+    this.getUserInfo()
+    this.getList()
+  },
+  methods: {
+    async getUserInfo() {
+      try {
+        const { data } = await api_studentManageUserInfo({ userId: this.row.userId })
+        this.userDetail = data;
+      } catch {}
+    },
+    async getList() {
+      try {
+        const { timer, memberRankSettingId, ...more } = this.searchForm
+        let rankId = null;
+        if(memberRankSettingId && memberRankSettingId.length > 0) {
+          rankId = memberRankSettingId[memberRankSettingId.length - 1]
+        }
+        let params = { ...more, ...getTimeFormat(timer, ["startTime", "endTime"]), userId: this.row.userId, memberRankSettingId: rankId, page: this.pageInfo.page,
+        rows: this.pageInfo.limit };
+        const { data } = await api_studentMemberUpdateLog(params)
+        this.tableList = data.rows || []
+        this.pageInfo.total = data.total || 0
+      } catch {}
+    },
+    onSearch() {
+      this.pageInfo.page = 1;
+      this.getList();
+    },
+    onReSet() {
+      this.$nextTick(() => {
+        this.searchForm.timer = []
+        this.onSearch();
+      });
+    },
+    operationTimer(type) {
+      this.operationType = type
+      this.cloudDateVisible = true
+    }
+  },
+  filters: {
+    filterBuyType(type) {
+      const template = {
+        1: '自行购买',
+        2: '后台添加',
+        3: '后台扣减',
+      }
+      return template[type]
+    }
+  }
+};
+</script>
+<style lang="scss" scoped>
+.title {
+  margin-bottom: 30px;
+  font-size: 16px;
+  color: #000;
+}
+</style>

+ 44 - 8
src/views/studentManager/studentGroupPractice.vue

@@ -2,7 +2,7 @@
   <div class="m-container">
     <h2>
       <div class="squrt"></div>
-      待激活云练习
+      待激活学练宝
     </h2>
     <div class="m-core">
       <el-form :inline="true" :model="searchForm">
@@ -25,6 +25,17 @@
             <el-option label="已取消" value="4"></el-option>
           </el-select>
         </el-form-item>
+        <el-form-item prop="memberRankId">
+          <el-cascader
+            v-model.trim="searchForm.memberRankId"
+            :options="memberRankList"
+            :props="{ value: 'id', label: 'name',  }"
+            :show-all-levels="false"
+            collapse-tags
+            clearable
+            placeholder="请选择学练宝版本"
+          ></el-cascader>
+        </el-form-item>
         <el-form-item>
           <el-date-picker
             v-model="searchForm.operationDate"
@@ -52,7 +63,7 @@
         v-if="$helpers.permission('cloudTeacherOrder/pay/student')"
         type="primary"
         style="margin-bottom: 20px"
-        >激活云练习</el-button
+        >激活学练宝</el-button
       >
       <el-button
         type="primary"
@@ -97,7 +108,9 @@
             prop="subjectName"
             label="学员声部"
           ></el-table-column>
-          <el-table-column align="center" prop="type" label="云练习类型">
+          <el-table-column align="center" prop="memberName" label="学练宝版本">
+          </el-table-column>
+          <el-table-column align="center" prop="name" label="周期">
             <template slot-scope="scope">
               {{ scope.row.type | memberEnumType }}
             </template>
@@ -159,7 +172,7 @@
     </div>
 
     <el-dialog
-      title="激活云练习"
+      title="激活学练宝"
       :visible.sync="giveMemberVisible"
       width="1000px"
       v-if="giveMemberVisible"
@@ -209,6 +222,7 @@
 <script>
 import pagination from "@/components/Pagination/index";
 import { queryInactive, cancelInactive } from "@/views/resetTeaming/api";
+import { getmemberRankList } from '@/views/categroyManager/productSystem/api'
 import giveMemberModel from "@/views/resetTeaming/modals/giveMemberModel";
 import Tooltip from "@/components/Tooltip";
 import { getTimeFormat } from "@/utils";
@@ -221,6 +235,7 @@ export default {
       musicGroupId,
       giveMemberVisible: false,
       searchForm: {
+        memberRankId: [],
         queryCondition: "",
         subjectId: "",
         operationDate: [],
@@ -228,6 +243,7 @@ export default {
       },
       soundList: [],
       tableList: [],
+      memberRankList: [],
       rules: {
         // 分页规则
         limit: 10, // 限制显示条数
@@ -244,14 +260,28 @@ export default {
     };
   },
   mounted() {
+    this.getMemberList()
     this.getList();
   },
   methods: {
+    async getMemberList() {
+      try {
+        const { data } = await getmemberRankList()
+        this.memberRankList = data || [];
+      } catch (e) {
+        console.log(e);
+      }
+    },
     async getList() {
       try {
-        let { operationDate, ...rest } = this.searchForm;
+        let { operationDate, memberRankId, ...rest } = this.searchForm;
+        let rankId = null
+        if(memberRankId && memberRankId.length > 0) {
+          rankId = memberRankId[memberRankId.length - 1]
+        }
         let params = {
           ...rest,
+          memberRankId: rankId,
           ...getTimeFormat(
             operationDate,
             ["operateStartTime", "operateEndTime"],
@@ -308,9 +338,15 @@ export default {
       this.reson.ids = ids.join(",");
     },
     exportList() {
-      let { operationDate, ...rest } = this.searchForm;
+      
+      let { operationDate, memberRankId, ...rest } = this.searchForm;
+      let rankId = null
+        if(memberRankId && memberRankId.length > 0) {
+          rankId = memberRankId[memberRankId.length - 1]
+        }
       let params = {
         ...rest,
+        memberRankId: rankId,
         ...getTimeFormat(
           operationDate,
           ["operateStartTime", "operateEndTime"],
@@ -321,14 +357,14 @@ export default {
         this,
         {
           url: "/api-web/export/now",
-          fileName: "待激活云练习.xls",
+          fileName: "待激活学练宝.xls",
           method: "post",
           params: {
             exportEnum: "EXPORT_CLOUD_TEACHER_ORDER_INACTIVE",
             queryInfo: params
           }
         },
-        "您确定导出待激活云练习?"
+        "您确定导出待激活学练宝?"
       );
     },
     async submitDateReset() {

+ 37 - 7
src/views/studentManager/studentGroupRecord.vue

@@ -2,19 +2,19 @@
   <div class="m-container">
     <h2>
       <div class="squrt"></div>
-      云练习缴费记录
+      学练宝缴费记录
     </h2>
     <div class="m-core">
       <el-form :inline="true" :model="searchForm">
         <el-form-item prop="period">
           <el-select
-            placeholder="云练习单位"
+            placeholder="周期"
             clearable
             v-model.trim="searchForm.period"
             style="width: 100% !important"
           >
             <el-option label="月度" value="MONTH"></el-option>
-            <el-option label="季度" value="QUARTERLY"></el-option>
+            <!-- <el-option label="季度" value="QUARTERLY"></el-option> -->
             <el-option label="半年" value="YEAR_HALF"></el-option>
             <el-option label="年度" value="YEAR"></el-option>
             <!-- <el-option label="固定天数" value="DAY"></el-option> -->
@@ -36,6 +36,17 @@
             ></el-option>
           </el-select>
         </el-form-item>
+        <el-form-item prop="memberRankId">
+          <el-cascader
+            v-model.trim="searchForm.memberRankId"
+            :options="memberRankList"
+            :props="{ value: 'id', label: 'name',  }"
+            :show-all-levels="false"
+            collapse-tags
+            clearable
+            placeholder="请选择学练宝版本"
+          ></el-cascader>
+        </el-form-item>
         <el-form-item prop="visitTime">
           <el-date-picker
             v-model.trim="searchForm.visitTime"
@@ -69,7 +80,9 @@
           ></el-table-column>
           <el-table-column align="center" prop="organName" label="分部名称">
           </el-table-column>
-          <el-table-column align="center" prop="name" label="云练习单位">
+          <el-table-column align="center" prop="name" label="学练宝版本">
+          </el-table-column>
+          <el-table-column align="center" prop="period" label="周期">
             <template slot-scope="scope">
               {{ scope.row.period | memberEnumType }}
             </template>
@@ -156,7 +169,7 @@
     </div>
 
     <el-dialog
-      title="激活云练习"
+      title="激活学练宝"
       :visible.sync="recordVisible"
       width="1000px"
       v-if="recordVisible"
@@ -166,7 +179,7 @@
     </el-dialog>
 
     <el-dialog
-      title="修改云练习缴费"
+      title="修改学练宝缴费"
       width="500px"
       :visible.sync="memberVisible"
     >
@@ -189,6 +202,7 @@
 import pagination from "@/components/Pagination/index";
 import recordDetail from "@/views/studentManager/modals/recordDetail";
 import { cloudCoachPaymentProgramQueryPage } from "./api";
+import { getmemberRankList } from '@/views/categroyManager/productSystem/api'
 import createMember from "./modals/createMember";
 import { getTimes } from "@/utils";
 export default {
@@ -198,10 +212,12 @@ export default {
       recordVisible: false,
       memberVisible: false,
       searchForm: {
+        memberRankId: [],
         visitTime: [],
         period: null,
         organId: null
       },
+      memberRankList: [],
       tableList: [],
       rules: {
         // 分页规则
@@ -215,14 +231,28 @@ export default {
   },
   async mounted() {
     await this.$store.dispatch("setBranchs");
+    this.getMemberList()
     this.getList();
   },
   methods: {
+    async getMemberList() {
+      try {
+        const { data } = await getmemberRankList()
+        this.memberRankList = data || [];
+      } catch (e) {
+        console.log(e);
+      }
+    },
     async getList() {
       try {
-        const { visitTime, ...search } = this.searchForm;
+        const { visitTime, memberRankId, ...search } = this.searchForm;
+        let rankId = null
+        if(memberRankId && memberRankId.length > 0) {
+          rankId = memberRankId[memberRankId.length - 1]
+        }
         const res = await cloudCoachPaymentProgramQueryPage({
           ...search,
+          memberRankId: rankId,
           ...getTimes(visitTime, ["startTime", "endTime"]),
           page: this.rules.page,
           rows: this.rules.limit

+ 86 - 213
src/views/studentManager/studentList.vue

@@ -152,12 +152,23 @@
             class="multiple"
             v-model.trim="searchForm.isRecord"
             clearable
-            placeholder="是否使用云练习"
+            placeholder="是否使用学练宝"
           >
             <el-option label="是" value="1"></el-option>
             <el-option label="否" value="0"></el-option>
           </el-select>
         </el-form-item>
+        <el-form-item prop="memberRankId">
+          <el-cascader
+            v-model.trim="searchForm.memberRankId"
+            :options="memberRankList"
+            :props="{ value: 'id', label: 'name',  }"
+            :show-all-levels="false"
+            collapse-tags
+            clearable
+            placeholder="请选择学练宝版本"
+          ></el-cascader>
+        </el-form-item>
         <el-form-item>
           <el-button native-type="submit" type="danger">搜索</el-button>
           <el-button native-type="reset" type="primary">重置</el-button>
@@ -174,7 +185,7 @@
         type="primary"
         @click="addStudentMember"
         icon="el-icon-plus"
-        >创建云练习缴费</el-button
+        >创建学练宝缴费</el-button
       >
       <el-button
         v-if="$helpers.permission('studentManage/register')"
@@ -354,9 +365,6 @@
               <copy-text>{{ scope.row.userId }}</copy-text>
             </template>
           </el-table-column>
-          <!-- <el-table-column align="center" prop="username" label="学员姓名">
-            <template slot-scope="scope"> </template>
-          </el-table-column> -->
           <el-table-column
             align="center"
             prop="realName"
@@ -379,67 +387,17 @@
             prop="courseTeacherName"
             label="排课老师"
           ></el-table-column>
-
-          <!-- <el-table-column align="center" prop="teacherName" label="指导老师">
-            <template slot-scope="scope">
-              <copy-text>{{ scope.row.teacherName }}</copy-text>
-            </template>
-          </el-table-column> -->
-          <!-- <el-table-column align="center" label="性别">
-            <template slot-scope="scope"></template>
-          </el-table-column> -->
-
-          <!-- <el-table-column
-            align="center"
-            prop="leaveNum"
-            label="本月请假次数"
-          ></el-table-column> -->
-          <!-- <el-table-column align="center">
-            <template slot="header">
-              <p style="position: relative">
-                是否激活
-                <el-tooltip placement="top" popper-class="mTooltip">
-                  <div slot="content">学员是否设置密码</div>
-                  <i
-                    class="el-icon-question"
-                    style="font-size: 18px; color: #f56c6c"
-                  ></i>
-                </el-tooltip>
-              </p>
-            </template>
-            <template slot-scope="scope">{{
-              scope.row.isActive ? "是" : "否"
-            }}</template>
-          </el-table-column> -->
           <el-table-column align="center" label="未上课时">
             <template slot-scope="scope">{{
               scope.row.hasCourse ? "有" : "无"
             }}</template>
           </el-table-column>
-          <!-- <el-table-column align="center" label="预约网管课">
-            <template slot-scope="scope">{{ scope.row.isMake ? '是' : '否' }}</template>
-          </el-table-column> -->
-          <!-- <el-table-column align="center" label="网管课剩余课时">
-            <template slot-scope="scope">{{
-              scope.row.noStartPracticeCourseNum
-            }}</template>
-          </el-table-column> -->
-          <!-- <el-table-column align="center" label="vip课剩余课时">
-            <template slot-scope="scope">{{
-              scope.row.noStartVipCourseNum
-            }}</template>
-          </el-table-column> -->
-          <!-- <el-table-column align="center" label="是否运营">
-            <template slot-scope="scope">{{
-              scope.row.operatingTag ? "是" : "否"
-            }}</template>
-          </el-table-column> -->
           <el-table-column align="center" label="是否服务" v-if="tenantId == 1">
             <template slot-scope="scope">{{
               scope.row.serviceTag ? "是" : "否"
             }}</template>
           </el-table-column>
-          <el-table-column align="center" label="是否使用云练习">
+          <el-table-column align="center" label="是否使用学练宝">
             <template slot-scope="scope">{{
               scope.row.recordUserId > 0 ? "是" : "否"
             }}</template>
@@ -448,74 +406,21 @@
             align="center"
             width="120px"
             prop="parentsPhone"
-            label="会员截止日期(剩余天数)"
+            label="学练宝截止日期(剩余天数)"
           >
-            <template slot-scope="scope">
-              <div v-if="scope.row.membershipEndTime">
-                <div v-if="scope.row.membershipDay >= 0">
-                  {{ scope.row.membershipEndTime | dayjsFormat }}
-                  <p class="red">剩余{{ scope.row.membershipDay }}天</p>
+              <template slot-scope="scope">
+                <div v-if="scope.row.cloudTeacherOrderList && scope.row.cloudTeacherOrderList.length > 0">
+                  <el-button
+                    type="text"
+                    @click="() => {
+                      memberRecordVisible = true;
+                      tableMemberList = scope.row.cloudTeacherOrderList
+                    }"
+                    >查看</el-button>
                 </div>
-                <!-- 已过期 -->
-                <div v-else>
-                  <!-- 有未生效 -->
-                  <div v-if="scope.row.hasNoStartCloudTeacher">
-                    <p>会员未生效</p>
-                  </div>
-                  <!-- 无未生效 -->
-                  <div v-else>
-                    {{ scope.row.membershipEndTime | dayjsFormat }}
-                    <p class="red" v-if="scope.row.membershipDay < 0">
-                      已过期{{ Math.abs(scope.row.membershipDay) }}天
-                    </p>
-                  </div>
-                </div>
-                <!--
-                <div></div>
-
-
-                <p v-if="scope.row.hasNoStartCloudTeacher">
-                  {{ scope.row.membershipEndTime | dayjsFormat }}
-                </p> -->
-              </div>
-
-              <div v-else class="red">
-                <div v-if="scope.row.hasNoStartCloudTeacher">会员未生效</div>
-                <div v-else>未购买会员</div>
-              </div>
-            </template>
+                <div v-else class="red"> 未购买会员 </div>
+              </template>
           </el-table-column>
-          <!-- <el-table-column
-            label="会员试用结束日期(剩余天数)"
-            align="center"
-            width="120px;"
-          >
-            <template slot-scope="scope">
-              <div>
-                <p>
-                  {{ scope.row.experienceMembershipEndTime | dayjsFormat }}
-                </p>
-                <p
-                  class="red"
-                  v-if="
-                    scope.row.experienceMembershipEndTime &&
-                    scope.row.experienceMembershipDay >= 0
-                  "
-                >
-                  剩余{{ scope.row.experienceMembershipDay }}天
-                </p>
-                <p
-                  class="red"
-                  v-if="
-                    scope.row.membershipEndTime &&
-                    scope.row.experienceMembershipDay < 0
-                  "
-                >
-                  已过期{{ Math.abs(scope.row.experienceMembershipDay) }}天
-                </p>
-              </div>
-            </template>
-          </el-table-column> -->
           <el-table-column align="center" label="是否是新用户">
             <template slot="header">
               <p style="position: relative">
@@ -534,34 +439,6 @@
               {{ scope.row.isNewUser ? "是" : "否" }}
             </template>
           </el-table-column>
-          <!-- <el-table-column
-            align="center"
-            prop="courseBalance"
-            label="课程余额(元)"
-          >
-            <template slot-scope="scope">
-              <div>
-                {{ scope.row.courseBalance | moneyFormat }}
-              </div>
-            </template>
-          </el-table-column> -->
-          <!-- <el-table-column align="center" prop="balance" label="账户余额(元)">
-            <template slot-scope="scope">
-              <div>
-                {{ scope.row.balance | moneyFormat }}
-              </div>
-            </template>
-          </el-table-column> -->
-          <!-- <el-table-column align="center" prop="carePackage" label="关心包">
-            <template slot-scope="scope">{{
-              scope.row.carePackage | studentPackage
-            }}</template>
-          </el-table-column>
-          <el-table-column align="center" prop="comeOnPackage" label="加油包">
-            <template slot-scope="scope">{{
-              scope.row.comeOnPackage | studentPackage
-            }}</template>
-          </el-table-column> -->
           <el-table-column align="center" width="180px" label="操作">
             <template slot-scope="scope">
               <div
@@ -653,57 +530,17 @@
                     <el-dropdown-item
                       style="width: 180px"
                       v-if="
-                        $helpers.permission('studentManage/updateStudentMember')
+                        $helpers.permission('studentMemberUpdateLog/page')
                       "
                       @click.native="setClound(scope.row)"
                     >
                       <el-button type="text" style="padding-left: 10px"
-                        >云练习时长调整</el-button
+                        >学练宝时长调整</el-button
                       >
                     </el-dropdown-item>
                   </el-dropdown-menu>
                 </el-dropdown>
               </div>
-
-              <!-- <router-link
-                v-if="$helpers.permission('/studentDetail')"
-                class="el-button--text"
-                :to="{
-                  path: `/business/studentDetail`,
-                  query: { ...scope.row },
-                }"
-                >查看</router-link
-              > -->
-              <!-- <el-button
-                type="text"
-                style="padding-left: 10px"
-                v-if="$helpers.permission('studentManage/studentUpdate/setStudent')"
-                @click="setStudent(scope.row)"
-                >设置扩展声部</el-button
-              > -->
-              <!-- <el-button
-                type="text"
-                style="padding-left: 10px"
-                v-if="$helpers.permission('studentManage/studentUpdate')"
-                @click="resetStudent(scope.row)"
-                >修改</el-button
-              > -->
-              <!-- api-auth/user/updatePassword2 -->
-              <!-- <el-button
-                v-if="$helpers.permission('api-auth/user/updatePassword2')"
-                @click="resetPassWrod(scope.row)"
-                type="text"
-                >修改密码</el-button
-              > -->
-              <!-- <el-button
-                v-if="
-                  scope.row.isSignedContract &&
-                  $helpers.permission('sysUserContracts/getLatest')
-                "
-                type="text"
-                @click="lookContracts(scope.row)"
-                >下载协议</el-button
-              > -->
             </template>
           </el-table-column>
         </el-table>
@@ -1127,7 +964,7 @@
     </el-dialog>
 
     <el-dialog
-      title="创建云练习缴费"
+      title="创建学练宝缴费"
       width="500px"
       :visible.sync="memberVisible"
     >
@@ -1144,21 +981,40 @@
       </div>
     </el-dialog>
     <el-dialog
-      title="云练习时长调整"
-      width="500px"
+      title="学练宝时长调整"
+      width="1250px"
       :visible.sync="cloundDateVisible"
+      @close="() => {
+          getList()
+        }"
     >
-      <setMemberDate
+      <setMemberList
         v-if="cloundDateVisible"
+        :memberRankList="memberRankList"
         :row="activatedRow"
-        ref="submitDateReset"
         @close="cloundDateVisible = false"
-        @submited="getList"
-      ></setMemberDate>
-      <div slot="footer" class="dialog-footer">
-        <el-button @click="cloundDateVisible = false">取 消</el-button>
-        <el-button type="primary" @click="submitDateReset">确 定</el-button>
-      </div>
+      ></setMemberList>
+    </el-dialog>
+
+    <el-dialog
+      title="学练宝详情"
+      :visible.sync="memberRecordVisible"
+      width="600px"
+    >
+      <el-table :data="tableMemberList" :header-cell-style="{ background: '#EDEEF0', color: '#444' }">
+        <el-table-column align="center" prop="memberRankName" label="学练宝版本">
+          <template slot-scope="scope">
+              {{ scope.row.memberRankName }}
+          </template>
+        </el-table-column>
+        <el-table-column align="center" prop="endTime" label="截止时间">
+          <template slot-scope="scope">
+            {{ scope.row.endTime | dayjsFormat }}
+          </template>
+        </el-table-column>
+        <el-table-column align="center" prop="remainingDays" label="剩余天数">
+        </el-table-column>
+      </el-table>
     </el-dialog>
   </div>
 </template>
@@ -1177,18 +1033,16 @@ import { getGradeList } from "@/views/2021memeberActionManager/api";
 import qrCode from "@/components/QrCode/index";
 import { vaildStudentUrl } from "@/utils/validate";
 import { resetPassword2, getTeacher, getAgreement } from "@/api/buildTeam";
-import {
-  organizationCloudTeacherFeeQueryPage,
-  subjectListTree
-} from "@/api/specialSetting";
+import { subjectListTree } from "@/api/specialSetting";
 import axios from "axios";
 import qs from "qs";
 import { getToken, getTenantId } from "@/utils/auth";
 import load from "@/utils/loading";
 import createMember from "./modals/createMember";
-import setMemberDate from "./modals/setMemberDate";
+import setMemberList from "./modals/setMemberList";
 import studentExt from "./modals/studentExt";
 import Tooltip from "@/components/Tooltip";
+import { getmemberRankList } from '@/views/categroyManager/productSystem/api'
 export default {
   name: "studentManagerList",
   components: {
@@ -1198,15 +1052,19 @@ export default {
     protocolModel,
     studentExt,
     Tooltip,
-    setMemberDate
+    setMemberList
   },
   data() {
     return {
+      memberRecordVisible: false,
+      tableMemberList: [],
       extVisible: false,
       extDetail: {},
       studentVisible: false,
+      memberRankList: [],
       searchForm: {
         organId: [],
+        memberRankId: [],
         search: null,
         studentName: null,
         isActive: null,
@@ -1294,6 +1152,7 @@ export default {
     };
   },
   mounted() {
+    this.getMemberList()
     if (this.$route.params.search) {
       this.searchForm.search = this.$route.params.search;
     }
@@ -1317,14 +1176,19 @@ export default {
     this.tenantId = this.$helpers.tenantId;
   },
   methods: {
+    async getMemberList() {
+      try {
+        const { data } = await getmemberRankList()
+        this.memberRankList = data || [];
+      } catch (e) {
+        console.log(e);
+      }
+    },
     setClound(row) {
       this.activatedRow = row;
       this.cloundDateVisible = true;
       console.log(row, "setClound");
     },
-    submitDateReset() {
-      this.$refs.submitDateReset.submit();
-    },
     async getAgreement() {
       try {
         const res = await getAgreement();
@@ -1371,7 +1235,11 @@ export default {
         vaildStudentUrl() + `/#/queryStudentPer?tenantId=` + this.tenantId;
     },
     getList() {
-      let params = { ...this.searchForm };
+      let rankId = null
+      if(this.searchForm.memberRankId && this.searchForm.memberRankId.length > 0) {
+        rankId = this.searchForm.memberRankId[this.searchForm.memberRankId.length - 1]
+      }
+      let params = { ...this.searchForm, memberRankId: rankId };
       params.rows = this.pageInfo.limit;
       params.page = this.pageInfo.page;
       params.organId = this.searchForm.organId.join(",");
@@ -1400,6 +1268,10 @@ export default {
     downLoadStudent() {
       let url = "/api-web/export/studentHasCourse";
       let searchForm = this.searchForm;
+      let rankId = null
+      if(searchForm.memberRankId && searchForm.memberRankId.length > 0) {
+        rankId = searchForm.memberRankId[searchForm.memberRankId.length - 1]
+      }
       let data = {
         organId: searchForm.organId.join(","),
         search: searchForm.search + "" ? searchForm.search : null,
@@ -1421,7 +1293,8 @@ export default {
         isNewUser: searchForm.isNewUser + "" ? searchForm.isNewUser : null,
         hasTeacher: searchForm.hasTeacher + "" ? searchForm.hasTeacher : null,
         isRecord: searchForm.isRecord + "" ? searchForm.isRecord : null,
-        hasMember: searchForm.hasMember + "" ? searchForm.hasMember : null
+        hasMember: searchForm.hasMember + "" ? searchForm.hasMember : null,
+        memberRankId: rankId
       };
       const options = {
         method: "POST",

+ 1 - 1
src/views/teacherManager/teacherDetail/components/teacherInfo.vue

@@ -94,7 +94,7 @@
           </el-row>
           <el-row>
             <el-col :span="12">
-              <el-form-item label="是否禁用云练习" :label-width="formLabelWidth">
+              <el-form-item label="是否禁用学练宝" :label-width="formLabelWidth">
                  <el-select
                     v-model.trim="topForm.coursewareLimit"
                     clearable

+ 2 - 2
src/views/teacherManager/teacherOperation/components/teacherOperation.vue

@@ -271,7 +271,7 @@
               </el-col>
               <el-col :span="12">
                 <el-form-item
-                  label="是否禁用云练习"
+                  label="是否禁用学练宝"
                   :label-width="formLabelWidth"
                   class="course"
                 >
@@ -279,7 +279,7 @@
                     v-model.trim="topForm.coursewareLimit"
                     clearable
                     filterable
-                    placeholder="是否禁用云练习"
+                    placeholder="是否禁用学练宝"
                   >
                     <el-option label="是" :value="true"></el-option>
                     <el-option label="否" :value="false"></el-option>

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

@@ -585,7 +585,7 @@
             <p style="position: relative; display: inline-block">
               是否赠送辅件
               <el-tooltip placement="top" popper-class="mTooltip">
-                <div slot="content">购买练宝是否赠送辅件</div>
+                <div slot="content">购买管乐AI学练宝是否赠送辅件</div>
                 <i
                   class="el-icon-question"
                   style="font-size: 18px; color: #f56c6c"

+ 17 - 28
src/views/teamBuild/signupList.vue

@@ -244,7 +244,7 @@
                       审核中
                       <el-tooltip placement="top" popper-class="mTooltip">
                         <div slot="content">
-                          不购买云练习系统学员数量,不包含已缴费学员
+                          不购买学练宝系统学员数量,不包含已缴费学员
                         </div>
                         <i
                           class="el-icon-question"
@@ -262,16 +262,16 @@
                   </template>
                 </el-table-column>
                 <el-table-column
-                  label="购买云练习人数"
+                  label="购买学练宝人数"
                   prop="buyCloudTeacherNum"
                   align="center"
                 >
                   <template slot="header">
                     <p>
-                      购买云练习人数
+                      购买学练宝人数
                       <el-tooltip placement="top" popper-class="mTooltip">
                         <div slot="content">
-                          已缴费学员中购买了云练习系统的学员总数
+                          已缴费学员中购买了学练宝系统的学员总数
                         </div>
                         <i
                           class="el-icon-question"
@@ -292,16 +292,16 @@
                   </template>
                 </el-table-column>
                 <el-table-column
-                  label="入团未购云练习"
+                  label="入团未购学练宝"
                   prop="noCloudTeacherStudentNumOfNormal"
                   align="center"
                 >
                   <template slot="header">
                     <p>
-                      入团未购云练习
+                      入团未购学练宝
                       <el-tooltip placement="top" popper-class="mTooltip">
                         <div slot="content">
-                          【在读】学员中,未购买【云练习系统】学员数量
+                          【在读】学员中,未购买【学练宝系统】学员数量
                         </div>
                         <i
                           class="el-icon-question"
@@ -542,7 +542,7 @@
             v-model.trim="searchFrom.hasCloudTeacher"
             clearable
             filterable
-            placeholder="是否购买云练习"
+            placeholder="是否购买学练宝"
           >
             <el-option label="是" :value="1" />
             <el-option label="否" :value="0" />
@@ -651,13 +651,7 @@
                     <span>{{ props.row.isAllowAdjust | isAllowAdjust }}</span>
                   </el-form-item>
                 </el-col>
-                <!-- <el-col :span="4">
-                  <el-form-item label="是否购买云练习:">
-                    <span>{{
-                      props.row.hasCloudTeacher == 1 ? "是" : "否"
-                    }}</span>
-                  </el-form-item></el-col
-                > -->
+
 
                 <el-col :span="4">
                   <!-- <el-form-item> -->
@@ -810,7 +804,7 @@
           </template>
         </el-table-column> -->
         <el-table-column
-          label="是否购买会员"
+          label="是否购买学练宝"
           prop="hasCloudTeacher"
           align="center"
         >
@@ -830,7 +824,7 @@
             <p style="position: relative; display: flex">
               解除限制
               <el-tooltip placement="top" popper-class="mTooltip">
-                <div slot="content">学员是否受到不购买云练习的缴费限制</div>
+                <div slot="content">学员是否受到不购买学练宝的缴费限制</div>
                 <i
                   class="el-icon-question"
                   style="font-size: 18px; color: #f56c6c"
@@ -1130,7 +1124,7 @@
           <el-popover placement="right" width="500" trigger="click">
             <div class="popoverWrap">
               <p>乐团退团退费规则:</p>
-              <p>退还云练习费用:报名缴费时缴费的云练习费用</p>
+              <p>退还学练宝费用:报名缴费时缴费的学练宝费用</p>
               <p>退还课程费用:缴费总额-已结束课时单价之和</p>
               <p>退还乐器费用:报名缴费时缴纳的乐器费用(团购、租金)</p>
               <p>退还教辅费用:报名缴费时缴费的教辅费用</p>
@@ -1306,7 +1300,7 @@ export default {
         currentGrade: null, // 入学年级
         paymentStatus: "",
         visited: "",
-        hasCloudTeacher: null, // 是否购买云练习
+        hasCloudTeacher: null, // 是否购买学练宝
         payingStatus: null,
         noneNeedCloudTeacher: null,
         studentStatus: null
@@ -1377,9 +1371,9 @@ export default {
         ]
       },
       quitRules: {
-        isCloudTeacherAmount: [{ required: true, message: "请输入云练习费用" }],
+        isCloudTeacherAmount: [{ required: true, message: "请输入学练宝费用" }],
         cloudTeacherAmount: [
-          { required: true, message: "请输入云练习金额", trigger: "blur" }
+          { required: true, message: "请输入学练宝金额", trigger: "blur" }
         ],
         isRefundCourseFee: [
           { required: true, message: "请选择是否退还课程费用" }
@@ -2082,12 +2076,7 @@ export default {
           paymentList.forEach(item => {
             if (item.type == "MAINTENANCE") {
               item.name = "乐器保养";
-            } else if (
-              item.type == "CLOUD_TEACHER" ||
-              item.type == "CLOUD_TEACHER_PLUS"
-            ) {
-              item.name = "云练习";
-            } else if (item.type == "COURSE") {
+            }  else if (item.type == "COURSE") {
               item.name = "课程";
             } else if (item.type == "ORGAN_SHARE_PROFIT") {
               item.name = "乐器分润";
@@ -2331,7 +2320,7 @@ export default {
       return row.paymentStatus == 0;
     },
     relieve(row) {
-      this.$confirm("操作后该学员即可不购买云练习缴费入团", "提示", {
+      this.$confirm("操作后该学员即可不购买学练宝缴费入团", "提示", {
         confirmButtonText: "确定",
         cancelButtonText: "取消",
         type: "warning"

+ 9 - 6
src/views/teamDetail/components/modals/create-user-pay.vue

@@ -96,7 +96,7 @@
       @moneyChange="syncAllMoney"
     />
     <el-alert
-      title="会员设置"
+      title="学练宝设置"
       :closable="false"
       class="alert"
       style="margin-top: 20px"
@@ -105,6 +105,7 @@
     </el-alert>
     <memberSetting
       :addStudent="true"
+      :musicGroupId="musicGroupId"
       :form="memberForm"
       :isUserType="isUserType"
       :organId="baseInfo.organId"
@@ -427,12 +428,14 @@ export default {
         return;
       }
       if (forms.length === valided.length) {
+        const { memberRankSettingId, memberPaymentAmount, originalMemberPaymentAmount, ...tempMember } = this.memberForm
         const data = {
-          calenderMember: {
-            ...this.memberForm,
-            actualAmount: this.memberForm.memberPaymentAmount,
-            originalAmount: this.memberForm.originalMemberPaymentAmount
-          },
+          calenderMemberList: [{
+            ...tempMember,
+            memberRankSettingId: memberRankSettingId && memberRankSettingId.length > 0 ? memberRankSettingId[memberRankSettingId.length - 1] : null,
+            actualAmount: memberPaymentAmount,
+            originalAmount: originalMemberPaymentAmount
+          }],
           calenderAddStudent: {
             classGroupIds: this.ids,
             studentIds: this.createdUserId

+ 2 - 2
src/views/teamDetail/components/modals/quite-team.vue

@@ -309,9 +309,9 @@ export default {
   data() {
     return {
       quitRules: {
-        isCloudTeacherAmount: [{ required: true, message: "请输入云练习费用" }],
+        isCloudTeacherAmount: [{ required: true, message: "请输入学练宝费用" }],
         cloudTeacherAmount: [
-          { required: true, message: "请输入云练习金额", trigger: "blur" }
+          { required: true, message: "请输入学练宝金额", trigger: "blur" }
         ],
         isRefundCourseFee: [
           { required: true, message: "请选择是否退还课程费用" }

+ 101 - 173
src/views/teamDetail/components/studentList.vue

@@ -203,6 +203,17 @@
           <el-option label="已使用" :value="2"></el-option>
         </el-select>
       </el-form-item>
+      <el-form-item prop="memberRankId">
+        <el-cascader
+          v-model.trim="searchForm.memberRankId"
+          :options="memberRankList"
+          :props="{ value: 'id', label: 'name',  }"
+          :show-all-levels="false"
+          collapse-tags
+          clearable
+          placeholder="请选择学练宝版本"
+        ></el-cascader>
+      </el-form-item>
       <el-form-item>
         <el-button native-type="submit" type="danger">搜索</el-button>
         <el-button type="primary" native-type="reset">重置</el-button>
@@ -309,28 +320,6 @@
             </div>
           </template>
         </el-table-column>
-        <!-- <el-table-column label="学员姓名" width="120px;" prop="realName">
-          <template slot-scope="scope">
-            <div
-              @click="gotoStudent(scope.row.realName)"
-              style="color: var(--color-primary); cursor: pointer"
-            >
-              <copy-text>
-                {{ scope.row.realName }}
-              </copy-text>
-            </div>
-          </template>
-        </el-table-column> -->
-        <!-- <el-table-column
-          align="center"
-          prop="gender"
-          width="50px;"
-          label="性别"
-        >
-          <template slot-scope="scope">
-            <div>{{ scope.row.gender | sex }}</div>
-          </template>
-        </el-table-column> -->
         <el-table-column align="center" prop="phone" label="联系电话">
           <template slot-scope="scope">
             <copy-text>
@@ -353,13 +342,6 @@
             </div>
           </template>
         </el-table-column>
-        <!-- <el-table-column align="center" label="报名专业" prop="subjectName">
-          <template slot-scope="scope">
-            <copy-text>
-              {{ scope.row.regSubjectName }}
-            </copy-text>
-          </template>
-        </el-table-column> -->
         <el-table-column align="center" label="入团专业" prop="subjectName">
           <template slot-scope="scope">
             <copy-text>
@@ -382,26 +364,6 @@
             <div>{{ scope.row.paymentStatus | paymentStatus }}</div>
           </template>
         </el-table-column>
-        <!-- <el-table-column align="center" label="是否激活">
-          <template slot-scope="scope">
-            <div>{{ scope.row.isActive ? "是" : "否" }}</div>
-          </template>
-        </el-table-column> -->
-        <!-- <el-table-column align="center" label="VIP/网管是否有课">
-          <template slot-scope="scope">
-            <div>{{ scope.row.hasCourse ? "是" : "否" }}</div>
-          </template>
-        </el-table-column> -->
-        <!-- <el-table-column align="center" label="关心包">
-          <template slot-scope="scope">{{
-            scope.row.carePackage | studentPackage
-          }}</template>
-        </el-table-column> -->
-        <!-- <el-table-column align="center" label="加油包">
-          <template slot-scope="scope">{{
-            scope.row.comeOnPackage | studentPackage
-          }}</template>
-        </el-table-column> -->
         <el-table-column align="center" label="欠费金额(元)">
           <template slot-scope="scope">
             <div :class="[scope.row.noPaymentAmount > 0 ? 'error' : null]">
@@ -421,107 +383,26 @@
             </div>
           </template>
         </el-table-column>
-        <!-- <el-table-column label="退团原因" align="center">
-          <template slot-scope="scope">
-            <div>
-              <Tooltip :content="scope.row.quitReason" />
-            </div>
-          </template>
-        </el-table-column> -->
-        <!-- <el-table-column
-          label="下次续费时间(剩余天数)"
-          align="center"
-          width="120px;"
-        >
-          <template slot-scope="scope">
-            <div>
-              {{ scope.row.musicMembershipEndTime | dayjsFormat }}
-              <p
-                class="error"
-                v-if="
-                  scope.row.musicMembershipEndTime &&
-                  scope.row.musicMembershipDay >= 0
-                "
-              >
-                剩余{{ scope.row.musicMembershipDay }}天
-              </p>
-              <p
-                class="error"
-                v-if="
-                  scope.row.musicMembershipEndTime &&
-                  scope.row.musicMembershipDay < 0
-                "
-              >
-                已欠费{{ Math.abs(scope.row.musicMembershipDay) }}天
-              </p>
-            </div>
-          </template>
-        </el-table-column>
-        <el-table-column
-          label="会员试用结束日期(剩余天数)"
-          align="center"
-          width="120px;"
-        >
-          <template slot-scope="scope">
-            <div>
-              {{ scope.row.experienceMembershipEndTime | dayjsFormat }}
-              <p
-                class="error"
-                v-if="
-                  scope.row.experienceMembershipEndTime &&
-                  scope.row.experienceMembershipDay >= 0
-                "
-              >
-                剩余{{ scope.row.experienceMembershipDay }}天
-              </p>
-              <p
-                class="error"
-                v-if="
-                  scope.row.experienceMembershipEndTime &&
-                  scope.row.experienceMembershipDay < 0
-                "
-              >
-                已过期{{ Math.abs(scope.row.experienceMembershipDay) }}天
-              </p>
-            </div>
-          </template>
-        </el-table-column> -->
         <el-table-column
-          label="会员截止时间(剩余天数)"
+          label="学练宝截止时间(剩余天数)"
           align="center"
-          width="120px;"
         >
           <template slot-scope="scope">
-            <div v-if="scope.row.membershipEndTime">
-              <div v-if="scope.row.membershipDay >= 0">
-                {{ scope.row.membershipEndTime | dayjsFormat }}
-                <p class="red">剩余{{ scope.row.membershipDay }}天</p>
-              </div>
-              <!-- 已过期 -->
-              <div v-else>
-                <!-- 有未生效 -->
-                <div v-if="scope.row.hasNoStartCloudTeacher">
-                  <p>会员未生效</p>
-                </div>
-                <!-- 无未生效 -->
-                <div v-else>
-                  {{ scope.row.membershipEndTime | dayjsFormat }}
-                  <p class="red" v-if="scope.row.membershipDay < 0">
-                    已过期{{ Math.abs(scope.row.membershipDay) }}天
-                  </p>
-                </div>
-              </div>
-
-              <!-- <div></div>
-                <p v-if="scope.row.hasNoStartCloudTeacher">
-                  {{ scope.row.membershipEndTime | dayjsFormat }}
-                </p> -->
-            </div>
-
-            <div v-else class="red">
-              <div v-if="scope.row.hasNoStartCloudTeacher">会员未生效</div>
-              <div v-else>未购买会员</div>
+            <div v-if="scope.row.cloudTeacherOrderList && scope.row.cloudTeacherOrderList.length > 0">
+              <!-- <div v-for="(item, index) in scope.row.cloudTeacherOrderList" :key="index">
+                {{ item.memberRankName  }}
+                {{ item.endTime | dayjsFormat }}
+                <p class="red">剩余{{ item.remainingDays }}天</p>
+              </div> -->
+              <el-button
+                type="text"
+                @click="() => {
+                  memberVisible = true;
+                  tableMemberList = scope.row.cloudTeacherOrderList
+                }"
+                >查看</el-button>
             </div>
+            <div v-else class="red"> 未购买会员 </div>
           </template>
         </el-table-column>
         <el-table-column label="备注" prop="remark" align="center">
@@ -811,7 +692,7 @@
           <el-popover placement="right" width="500" trigger="click">
             <div class="popoverWrap">
               <p>乐团退团退费规则:</p>
-              <p>退还云练习费用:报名缴费时缴费的云练习费用</p>
+              <p>退还学练宝费用:报名缴费时缴费的学练宝费用</p>
               <p>退还课程费用:缴费总额-已结束课时单价之和</p>
               <p>退还乐器费用:报名缴费时缴纳的乐器费用(团购、租金)</p>
               <p>退还教辅费用:报名缴费时缴费的教辅费用</p>
@@ -970,6 +851,27 @@
         >
       </div>
     </el-dialog>
+
+    <el-dialog
+      title="学练宝详情"
+      :visible.sync="memberVisible"
+      width="600px"
+    >
+      <el-table :data="tableMemberList" :header-cell-style="{ background: '#EDEEF0', color: '#444' }">
+        <el-table-column align="center" prop="memberRankName" label="学练宝版本">
+          <template slot-scope="scope">
+              {{ scope.row.memberRankName }}
+          </template>
+        </el-table-column>
+        <el-table-column align="center" prop="endTime" label="截止时间">
+          <template slot-scope="scope">
+            {{ scope.row.endTime | dayjsFormat }}
+          </template>
+        </el-table-column>
+        <el-table-column align="center" prop="remainingDays" label="剩余天数">
+        </el-table-column>
+      </el-table>
+    </el-dialog>
     <!-- <el-dialog
       title="新增会员试用期"
       width="600px"
@@ -1035,6 +937,7 @@ import visit from "@/views/withdrawal-application/modals/visit";
 import mergeMusic from "@/views/teamBuild/components/merge-music";
 import quiteTeam from "@/views/teamDetail/components/modals/quite-team";
 import addTryList from "@/views/teamDetail/components/modals/addTryList";
+import { getmemberRankList } from '@/views/categroyManager/productSystem/api'
 export default {
   name: "tstudentList",
   data() {
@@ -1049,6 +952,8 @@ export default {
       addStudentVisible: false, //新增学员弹窗
       timesVisible: false,
       timerDetail: null,
+      memberVisible: false,
+      tableMemberList: [],
       topFrom: {
         // 顶部的禁选框集合
         expect: "2", // 预期招生
@@ -1069,8 +974,10 @@ export default {
         classGroupId: null,
         hasCourse: null,
         carePackage: null,
-        comeOnPackage: null
+        comeOnPackage: null,
+        memberRankId: null,
       },
+      memberRankList: [],
       organizationCourseUnitPriceSettings: [],
       quitForm: {
         // 退团信息确认
@@ -1284,10 +1191,19 @@ export default {
     // } catch (e) {
     //   console.log(e);
     // }
+    this.getMemberList()
     this.init();
     this.getAgreement();
   },
   methods: {
+    async getMemberList() {
+      try {
+        const { data } = await getmemberRankList()
+        this.memberRankList = data || [];
+      } catch (e) {
+        console.log(e);
+      }
+    },
     onPaymentDetail(row) {
       this.paymentDetail = row;
       this.paymentDetailVisible = true;
@@ -1409,19 +1325,25 @@ export default {
     },
     onMusicGroupExport() {
       let url = "/api-web/export/musicGroupStudent";
+      const searchForm = this.searchForm
+      let rankId = null
+        if(searchForm.memberRankId && searchForm.memberRankId.length > 0) {
+          rankId = searchForm.memberRankId[searchForm.memberRankId.length - 1]
+        }
       let data = {
         musicGroupId: this.teamid,
-        studentStatus: this.searchForm.studentStatus || null,
-        paymentStatus: this.searchForm.isPay || null,
-        subjectId: this.searchForm.major || null,
-        search: this.searchForm.search || null,
-        isActive: this.searchForm.isActive || null,
-        classGroupId: this.searchForm.classGroupId || null,
-        currentGrade: this.searchForm.currentGrade || null,
-        createYear: this.searchForm.createYear || null,
-        hasCourse: this.searchForm.hasCourse || null,
-        comeOnPackage: this.searchForm.comeOnPackage,
-        carePackage: this.searchForm.carePackage
+        studentStatus: searchForm.studentStatus || null,
+        paymentStatus: searchForm.isPay || null,
+        subjectId: searchForm.major || null,
+        search: searchForm.search || null,
+        isActive: searchForm.isActive || null,
+        classGroupId: searchForm.classGroupId || null,
+        currentGrade: searchForm.currentGrade || null,
+        createYear: searchForm.createYear || null,
+        hasCourse: searchForm.hasCourse || null,
+        comeOnPackage: searchForm.comeOnPackage,
+        carePackage: searchForm.carePackage,
+        memberRankId: searchForm.memberRankId && searchForm.memberRankId.length > 0 ?searchForm.memberRankId[searchForm.memberRankId.length - 1] : null
       };
       const options = {
         method: "get",
@@ -1473,24 +1395,30 @@ export default {
       //   }
       // });
       this.getTeamStudent();
+      const searchForm = this.searchForm
+      let rankId = null
+        if(searchForm.memberRankId && searchForm.memberRankId.length > 0) {
+          rankId = searchForm.memberRankId[searchForm.memberRankId.length - 1]
+        }
       let obj = {
         musicGroupId: this.teamid,
         page: this.rules.page,
         rows: this.rules.limit,
-        studentStatus: this.searchForm.studentStatus || null,
-        paymentStatus: this.searchForm.isPay || null,
-        subjectId: this.searchForm.major || null,
-        search: this.searchForm.search || null,
-        isActive: this.searchForm.isActive || null,
-        classGroupId: this.searchForm.classGroupId || null,
-        currentGrade: this.searchForm.currentGrade || null,
-        createYear: this.searchForm.createYear || null,
-        oweFlag: this.searchForm.oweFlag || null,
-        hasCourse: this.searchForm.hasCourse || null,
-        oweFlag: this.searchForm.oweFlag || null,
-        comeOnPackage: this.searchForm.comeOnPackage,
-        carePackage: this.searchForm.carePackage,
-        hasMember: this.searchForm.hasMember
+        studentStatus: searchForm.studentStatus || null,
+        paymentStatus: searchForm.isPay || null,
+        subjectId: searchForm.major || null,
+        search: searchForm.search || null,
+        isActive: searchForm.isActive || null,
+        classGroupId: searchForm.classGroupId || null,
+        currentGrade: searchForm.currentGrade || null,
+        createYear: searchForm.createYear || null,
+        oweFlag: searchForm.oweFlag || null,
+        hasCourse: searchForm.hasCourse || null,
+        oweFlag: searchForm.oweFlag || null,
+        comeOnPackage: searchForm.comeOnPackage,
+        carePackage: searchForm.carePackage,
+        hasMember: searchForm.hasMember,
+        memberRankId: searchForm.memberRankId && searchForm.memberRankId.length > 0 ?searchForm.memberRankId[searchForm.memberRankId.length - 1] : null
       };
       return getTeamStudentList(obj).then(res => {
         if (res.code == 200) {
@@ -1568,7 +1496,7 @@ export default {
               } else {
                 params.status = "PROCESSING";
               }
-              // 退还云练习费用
+              // 退还学练宝费用
 
               // 发请求 退团
               applyMusicGroupQuit(params).then(res => {

+ 3 - 3
src/views/teamDetail/teamCourseList.vue

@@ -129,7 +129,7 @@
                   >
 
                   <el-col :span="4">
-                    <el-form-item label="云练习课程:">
+                    <el-form-item label="学练宝课程:">
                       {{ props.row.memberFlag ? "是" : "否" }}
                     </el-form-item></el-col
                   >
@@ -676,13 +676,13 @@
             <el-option label="否" value="0"></el-option>
           </el-select>
         </el-form-item>
-        <el-form-item label="云练习课程" prop="memberFlag">
+        <el-form-item label="学练宝课程" prop="memberFlag">
           <el-select
             style="width: 180px !important"
             v-model.trim="searchForm.memberFlag"
             clearable
             filterable
-            placeholder="云练习课程"
+            placeholder="学练宝课程"
           >
             <el-option label="是" value="1"></el-option>
             <el-option label="否" value="0"></el-option>

+ 33 - 8
src/views/tenantSetting/groupRecordManager.vue

@@ -2,7 +2,7 @@
   <div class="m-container">
     <h2>
       <div class="squrt"></div>
-      云练习激活记录
+      学练宝激活记录
     </h2>
     <div class="m-core">
       <save-form
@@ -30,6 +30,17 @@
             v-model.trim="searchForm.orderNo"
           ></el-input>
         </el-form-item>
+        <el-form-item prop="memberRankId">
+          <el-cascader
+            v-model.trim="searchForm.memberRankId"
+            :options="memberRankList"
+            :props="{ value: 'id', label: 'name',  }"
+            :show-all-levels="false"
+            collapse-tags
+            clearable
+            placeholder="请选择学练宝版本"
+          ></el-cascader>
+        </el-form-item>
         <el-form-item prop="createTimer">
           <el-date-picker
             v-model.trim="searchForm.createTimer"
@@ -89,12 +100,9 @@
           </el-table-column>
           <el-table-column align="center" label="手机号码" prop="phone">
           </el-table-column>
-          <!-- <el-table-column align="center" label="交易类型">
-            <template slot-scope="scope">
-              {{ scope.row.type | tenantStatus }}
-            </template>
-          </el-table-column> -->
-          <el-table-column align="center" label="数量/云练习类型">
+          <el-table-column align="center" label="学练宝版本" prop="memberName">
+          </el-table-column>
+          <el-table-column align="center" label="数量/学练宝周期">
             <template slot-scope="scope">
               {{ scope.row.time }}/{{ scope.row.type | memberEnumType }}
             </template>
@@ -130,9 +138,11 @@ import pagination from "@/components/Pagination/index";
 import { queryActiveRecord } from "./api";
 import { dealStatus } from "@/utils/searchArray";
 import { getTimes } from "@/utils";
+import { getmemberRankList } from '@/views/categroyManager/productSystem/api'
 const initSearch = {
   queryCondition: null,
   orderNo: null,
+  memberRankId: null,
   createTimer: []
 };
 export default {
@@ -148,18 +158,33 @@ export default {
         total: 0, // 总条数
         page_size: [10, 20, 40, 50] // 选择限制显示条数
       },
+      memberRankList: [],
       searchForm: { ...initSearch }
     };
   },
   async mounted() {
+    this.getMemberList()
     this.getList();
   },
   methods: {
+    async getMemberList() {
+      try {
+        const { data } = await getmemberRankList()
+        this.memberRankList = data || [];
+      } catch (e) {
+        console.log(e);
+      }
+    },
     async getList() {
       try {
-        let { createTimer, ...reset } = this.searchForm;
+        let { createTimer, memberRankId, ...reset } = this.searchForm;
+        let rankId = null
+        if(memberRankId && memberRankId.length > 0) {
+          rankId = memberRankId[memberRankId.length - 1]
+        }
         const res = await queryActiveRecord({
           ...reset,
+          memberRankId: memberRankId && memberRankId.length > 0 ?memberRankId[memberRankId.length - 1] : null,
           ...getTimes(
             createTimer,
             ["startTime", "endTime"],

+ 1 - 1
src/views/withdrawal-application/index.vue

@@ -264,7 +264,7 @@
           <el-popover placement="right" width="500" trigger="click">
             <div class="popoverWrap">
               <p>乐团退团退费规则:</p>
-              <p>退还云练习费用:报名缴费时缴费的云练习费用</p>
+              <p>退还学练宝费用:报名缴费时缴费的学练宝费用</p>
               <p>退还课程费用:缴费总额-已结束课时单价之和</p>
               <p>退还乐器费用:报名缴费时缴纳的乐器费用(团购、租金)</p>
               <p>退还教辅费用:报名缴费时缴费的教辅费用</p>

+ 4 - 4
src/views/withdrawal-application/modals/quit.vue

@@ -13,7 +13,7 @@
         <el-radio v-model.trim="quitForm.status" label="DENIED">拒绝</el-radio>
       </el-form-item>
       <el-form-item
-        label="退还云练习费用"
+        label="退还学练宝费用"
         prop="isRefundMemberFee"
         v-if="quitForm.status == 'APPROVED' && courseViewType == 2"
       >
@@ -26,7 +26,7 @@
       </el-form-item>
 
       <el-form-item
-        label="退还云练习金额"
+        label="退还学练宝金额"
         prop="cloudTeacherAmount"
         v-if="
           quitForm.isRefundMemberFee &&
@@ -169,9 +169,9 @@ export default {
     quitRules() {
       const required = this.quitForm.status === "APPROVED";
       return {
-        isCloudTeacherAmount: [{ required: true, message: "请输入云练习费用" }],
+        isCloudTeacherAmount: [{ required: true, message: "请输入学练宝费用" }],
         cloudTeacherAmount: [
-          { required: true, message: "请输入云练习金额", trigger: "blur" }
+          { required: true, message: "请输入学练宝金额", trigger: "blur" }
         ],
         status: [{ required: true, message: "请选择审核状态" }],
         isRefundCourseFee: [{ required, message: "请选择是否退还课程费用" }],

+ 3 - 3
src/views/workBenchManager/journal/model/musicGroup.vue

@@ -49,7 +49,7 @@
         ></el-input>
       </el-form-item>
       <el-form-item
-        label="退还云练习费用"
+        label="退还学练宝费用"
         prop="isRefundMemberFee"
         v-if="musicForm.status == 'PROCESSING' && musicForm.courseViewType == 2"
       >
@@ -62,7 +62,7 @@
       </el-form-item> -->
 
     <!-- <el-form-item
-        label="退还云练习金额"
+        label="退还学练宝金额"
         prop="cloudTeacherAmount"
         v-if="
           quitForm.isRefundMemberFee &&
@@ -170,7 +170,7 @@
         <el-popover placement="right" width="500" trigger="click">
           <div class="popoverWrap">
             <p>乐团退团退费规则:</p>
-            <p>退还云练习费用:报名缴费时缴费的云练习费用</p>
+            <p>退还学练宝费用:报名缴费时缴费的学练宝费用</p>
             <p>退还课程费用:缴费总额-已结束课时单价之和</p>
             <p>退还乐器费用:报名缴费时缴纳的乐器费用(团购、租金)</p>
             <p>退还教辅费用:报名缴费时缴费的教辅费用</p>