Procházet zdrojové kódy

Merge branch 'iteration-20241022-member' into jenkins-dev

lex-xin před 1 rokem
rodič
revize
11b7efbe24
31 změnil soubory, kde provedl 1569 přidání a 771 odebrání
  1. 2 2
      src/constant/guide.js
  2. 1 1
      src/constant/index.js
  3. 1 1
      src/utils/request2.js
  4. 1 1
      src/utils/searchArray.js
  5. 1 1
      src/views/auditList/index.vue
  6. 6 2
      src/views/auditList/member.vue
  7. 39 3
      src/views/categroyManager/productSystem/api.js
  8. 83 62
      src/views/categroyManager/productSystem/memberFeeSet.vue
  9. 417 208
      src/views/categroyManager/productSystem/memberSet.vue
  10. 1 1
      src/views/organManager/components/memberSetting.vue
  11. 311 0
      src/views/organManager/components/memberSettingMore.vue
  12. 111 2
      src/views/organManager/components/openService.vue
  13. 16 8
      src/views/organManager/organOperation.vue
  14. 8 0
      src/views/resetTeaming/api.js
  15. 34 4
      src/views/resetTeaming/components/giveMemberList.vue
  16. 101 40
      src/views/resetTeaming/components/payInfoDetail.vue
  17. 1 1
      src/views/resetTeaming/index.vue
  18. 5 3
      src/views/resetTeaming/modals/giveMemberModel.vue
  19. 2 2
      src/views/resetTeaming/modals/giveMemberPayment.vue
  20. 32 18
      src/views/resetTeaming/modals/member-setting.vue
  21. 4 84
      src/views/resetTeaming/modals/member.vue
  22. 115 63
      src/views/resetTeaming/modals/payMember.vue
  23. 1 1
      src/views/resetTeaming/modals/payTeamCourse.vue
  24. 7 14
      src/views/resetTeaming/modals/review-detail.vue
  25. 16 2
      src/views/resetTeaming/modals/signUpPayment.less
  26. 59 62
      src/views/resetTeaming/modals/subject-preview.vue
  27. 36 7
      src/views/studentManager/studentGroupPractice.vue
  28. 36 6
      src/views/studentManager/studentGroupRecord.vue
  29. 7 4
      src/views/teamDetail/components/modals/create-user-pay.vue
  30. 82 160
      src/views/teamDetail/components/studentList.vue
  31. 33 8
      src/views/tenantSetting/groupRecordManager.vue

+ 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"
   },

+ 1 - 1
src/constant/index.js

@@ -371,7 +371,7 @@ export const couponType = {
 export const orderType = {
   APPLY: "报名",
   RENEW: "续费",
-  MEMBER: "会员购买",
+  MEMBER: "学练宝购买",
   SMALL_CLASS_TO_BUY: "VIP购买",
   SPORADIC: "零星收费",
   LUCK: "福袋活动",

+ 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 => {

+ 1 - 1
src/utils/searchArray.js

@@ -339,7 +339,7 @@ export const orderStatus = [
   },
   {
     value: "MEMBER",
-    label: "会员购买"
+    label: "学练宝购买"
   },
   {
     value: "SMALL_CLASS_TO_BUY",

+ 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')"
         >

+ 6 - 2
src/views/auditList/member.vue

@@ -4,7 +4,7 @@
       <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"
@@ -94,10 +94,14 @@
           ></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 : "--"
                   }}{{ scope.row.period | memberEnumType }}

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

@@ -13,6 +13,15 @@ export function getAllmemberRank(data) {
   })
 }
 
+// 获取所有会员列表
+export function api_getMemberRankSetting(data) {
+  return request2({
+    url: api + '/memberRankOrganizationFeeMapper/getMemberRankSetting',
+    method: 'post',
+    data
+  })
+}
+
 // 新增会员类型
 export function addMemberRank(data) {
   return request2({
@@ -22,11 +31,12 @@ export function addMemberRank(data) {
   })
 }
 
+
 export function getmemberRankList(data) {
   return request2({
     url: api + '/memberRankSetting/queryPage',
-    method: 'get',
-    params: data
+    method: 'post',
+    data
   })
 }
 
@@ -45,7 +55,6 @@ export function resetMemberRank(data) {
     url: api + '/memberRankSetting/update',
     method: 'post',
     data: data,
-
   })
 }
 
@@ -58,6 +67,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 +102,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'
+  })
+}

+ 83 - 62
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">
@@ -228,8 +228,8 @@
     </div>
     <emptyPage
       @submit="addFee"
-      title="云练习收费标准"
-      btnTitle="新建云练习收费标准"
+      title="学练宝收费标准"
+      btnTitle="新建学练宝收费标准"
       :context="context"
       v-if="!(tableList.length > 0 || rules.page > 1) && contextFlag"
     />
@@ -248,17 +248,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 +272,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>
 
@@ -691,10 +688,9 @@
   </div>
 </template>
 <script>
-import numeral from "numeral";
 import {
-  getAllmemberRank,
-  addMemberOrganizationFeeMapper,
+  api_getMemberRankSetting,
+  addMemberOrganizationFeeMapperV2,
   getmemberRankOrganizationFeeMapper,
   getmemberOrganizationFeeMapperkDetail,
   resetMemberOrganizationFeeMapper
@@ -738,8 +734,8 @@ export default {
         groupPurchaseMonthFee: "",
         groupPurchaseQuarterlyFee: "",
         groupPurchaseYearFee: "",
-        organId: "",
-        memberRankSettingId: "",
+        organIds: [],
+        memberRankSettingId: [],
         incomeMonthFee: "", // 月经营报表
         incomeQuarterlyFee: "", // 季度经营报表
         incomeHalfYearFee: "", // 半年经营报表
@@ -758,26 +754,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 +791,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 +831,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 +859,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 +916,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 +947,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 +967,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 +987,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 +1007,7 @@ export default {
       if (one >= min && one <= max) {
         return callback();
       }
-      return callback(new Error(`年度云练习定价应在${min}-${max}之间`));
+      return callback(new Error(`年度学练宝定价应在${min}-${max}之间`));
     }
   },
   watch: {

+ 417 - 208
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,18 +130,29 @@
     >
       <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"
@@ -140,13 +161,14 @@
             style="width: 620px"
             maxlength="10"
             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>

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

@@ -2,7 +2,7 @@
 <template>
   <div>
     <el-alert
-      title="会员设置"
+      title="机构学练宝设置"
       type="info"
       :closable="false"
       style="margin-bottom: 20px"

+ 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,

+ 8 - 0
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({

+ 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"

+ 101 - 40
src/views/resetTeaming/components/payInfoDetail.vue

@@ -113,7 +113,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 +203,8 @@
               <payMember
                 ref="payMember"
                 :memberRankList="memberRankList"
+                @create="addPayMember"
+                @remove="removePayMember"
                 @moneyChange="syncAllMoney"
                 @priceChange="priceChange"
                 :rulesForm="rulesForm"
@@ -444,7 +446,7 @@ import { getSysTenantConfig } from "@/views/courseRulersManager/api";
 import { sysConfigList } from "@/api/generalSettings";
 import {
   queryByMusicGroupOrganizationCourseSettingsId,
-  getAllmemberRank,
+  getMemberRankTree,
   musicGroupcreateCalender,
   musicGroupresetCalender,
   getAutoActivationFlag
@@ -665,7 +667,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 +689,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 +796,24 @@ export default {
         console.log(e);
       }
     },
+    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 +830,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 +899,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 +912,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 +976,17 @@ export default {
     addActive() {
       this.form.activeList.push({});
     },
+    addPayMember() {
+      this.form.memberList.push({
+        period: "",
+        num: "",
+        name: "",
+        actualAmount: "",
+        memberRankSettingId: "",
+        optionalFlag: null,
+        autoActivationFlag: false
+      })
+    },
     removeActive(index) {
       this.form.activeList[index] = null;
       this.$set(
@@ -962,6 +1000,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 +1123,7 @@ export default {
       });
     },
     scrollView(object) {
-      console.log(object);
+      // console.log(object);
       for (const i in object) {
         let dom = this.$refs[i];
         // 这里是针对遍历的情况(多个输入框),取值为数组
@@ -1117,17 +1159,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.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) {
@@ -1164,6 +1207,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 +1229,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 +1251,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 +1273,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,
@@ -1304,7 +1366,6 @@ export default {
               courseCurrentPrice: 0
             });
           });
-          console.log("type", newValue, oldValue);
           this.$set(this.form, "teacherFeeList", arr);
         }
       },
@@ -1331,7 +1392,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 +1403,7 @@ export default {
             courseCurrentPrice: 0
           });
         });
-        console.log("calenderFeeType", val, oldValue);
+        // console.log("calenderFeeType", val, oldValue);
         this.$set(this.form, "teacherFeeList", arr);
       }
     },

+ 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"

+ 5 - 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"

+ 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>

+ 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;

+ 4 - 84
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>
 

+ 115 - 63
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
@@ -108,7 +130,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)"
               clearable
             >
               <el-option
@@ -141,10 +163,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 +191,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"
@@ -263,20 +285,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 +321,123 @@ export default {
       boolOptionsOptions: objectToOptions(boolOptions),
       memberEnumList,
       memberPrice: {},
+      memberPriceList: [],
       getMemberFeeFlag: true
     };
   },
-  mounted() {},
+  async mounted() {
+    console.log(this.form.memberList, 'this.form.memberList')
+    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);
       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"]);
@@ -440,16 +496,12 @@ 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) {
+      console.log(index, '1212')
+      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) {

+ 16 - 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;

+ 59 - 62
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">管乐AI学练宝{{ 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,14 @@
             ></i>
             <div class="paymentPrice">
               <span>优惠价:¥{{ item.actualAmount | moneyFormat }}</span>
-              <del>原价:¥ {{ onCalcSinglePrice(item) }}</del>
+              <!-- <del>原价:¥ {{ onCalcSinglePrice(item) }}</del> -->
             </div>
           </div>
         </div>
       </div>
+      </div>
+      </template>
+      
     </member>
 
     <instrument-model
@@ -199,6 +216,24 @@
 
       <a class="btn-submit">购买</a>
     </div> -->
+
+    <el-dialog
+      title="视频"
+      :visible.sync="videoStatus"
+      :modal-append-to-body="false"
+      :append-to-body="true"
+      class="videoDialog"
+      width="30%"
+    >
+      <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>
@@ -408,27 +443,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 =
@@ -942,38 +965,12 @@ export default {
   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");
     }
   }
 };

+ 36 - 7
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: [],
@@ -244,14 +259,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"],
@@ -321,14 +350,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() {

+ 36 - 6
src/views/studentManager/studentGroupRecord.vue

@@ -2,13 +2,13 @@
   <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"
@@ -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="memberName" label="学练宝版本">
+          </el-table-column>
+          <el-table-column align="center" prop="name" 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

+ 7 - 4
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,11 +428,13 @@ 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
+            ...tempMember,
+            memberRankSettingId: memberRankSettingId && memberRankSettingId.length > 0 ? memberRankSettingId[memberRankSettingId.length - 1] : null,
+            actualAmount: memberPaymentAmount,
+            originalAmount: originalMemberPaymentAmount
           },
           calenderAddStudent: {
             classGroupIds: this.ids,

+ 82 - 160
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="会员试用结束日期(剩余天数)"
+          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="会员截止时间(剩余天数)"
-          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">
@@ -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;
@@ -1473,24 +1389,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) {

+ 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"],