Browse Source

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

lex-xin 1 year ago
parent
commit
5fba56ea31

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

+ 2 - 0
src/views/categroyManager/productSystem/memberFeeSet.vue

@@ -859,6 +859,8 @@ 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,

+ 2 - 2
src/views/categroyManager/productSystem/memberSet.vue

@@ -622,8 +622,7 @@ export default {
         this.title = "修改";
         this.pageType = "update";
         this.addDisabled = false;
-        tempStatus = row.buyFlag || false
-        this.buyFlag = row.buyFlag;
+        tempStatus = this.buyFlag
       } else {
         this.addDisabled = true;
         tempStatus = true;
@@ -702,6 +701,7 @@ export default {
         const { data } = await getmemberRankDetail({
           memberRankSettingId: row.id
         });
+        this.buyFlag = data.buyFlag || false
         this.form = { ...data };
         console.log(row.parentId, 'parentId')
         if(row.parentId) {

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

+ 127 - 61
src/views/resetTeaming/components/payInfoDetail.vue

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

+ 1 - 1
src/views/resetTeaming/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>
 

+ 119 - 69
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,122 @@ export default {
       boolOptionsOptions: objectToOptions(boolOptions),
       memberEnumList,
       memberPrice: {},
+      memberPriceList: [],
       getMemberFeeFlag: true
     };
   },
-  mounted() {},
+  async mounted() {
+    this.form.memberList.forEach(async (item, index) => {
+      await this.changeMember(item.memberRankSettingId, index)
+    })
+  },
   methods: {
-    changeMemberperiodEnum(val) {
-      console.log(this.memberPrice);
+    onVisibleChange(value, id) {
+      if(!value) return
+      const tempId = id ? id[id.length - 1] : null
+      const ids = []
+      this.form.memberList.forEach(item => {
+        const itemId = item.memberRankSettingId ? item.memberRankSettingId[item.memberRankSettingId.length - 1] : null
+        if(itemId !== tempId) {
+          ids.push(itemId)
+        }
+      })
+      // console.log(ids, 'ids')
+      // console.log(value, id, 'teachList', this.memberRankList)
+      this.memberRankList.forEach((item) => {
+        if(ids.includes(item.id)) {
+          item.disabled = true;
+        } else {
+          item.disabled = false;
+        }
+
+        if(item.children && item.children.length > 0) {
+          item.children.forEach(child => {
+            if(ids.includes(child.id)) {
+              child.disabled = true;
+            } else {
+              child.disabled = false;
+            }
+          })
+        }
+      })
+      this.$forceUpdate();
+    },
+    changeMemberperiodEnum(val, index) {
+      // console.log(this.memberPriceList, val, index, "changeMemberperiodEnum");
       if (val == "DAY") {
         this.$set(
-          this.form.memberList[0],
+          this.form.memberList[index],
           "actualAmount",
-          this.memberPrice.groupPurchaseDayFee * this.form.memberList[0].num
+          this.memberPriceList[index].groupPurchaseDayFee * this.form.memberList[index].num
         );
         this.$set(
-          this.form.memberList[0],
+          this.form.memberList[index],
           "originalAmount",
-          this.memberPrice.originalDayFee * this.form.memberList[0].num
+          this.memberPriceList[index].originalDayFee * this.form.memberList[index].num
         );
       }
       if (val == "MONTH") {
         this.$set(
-          this.form.memberList[0],
+          this.form.memberList[index],
           "actualAmount",
-          this.memberPrice.groupPurchaseMonthFee * this.form.memberList[0].num
+          this.memberPriceList[index].groupPurchaseMonthFee * this.form.memberList[index].num
         );
         this.$set(
-          this.form.memberList[0],
+          this.form.memberList[index],
           "originalAmount",
-          this.memberPrice.originalMonthFee * this.form.memberList[0].num
+          this.memberPriceList[index].originalMonthFee * this.form.memberList[index].num
         );
       }
       if (val == "QUARTERLY") {
         this.$set(
-          this.form.memberList[0],
+          this.form.memberList[index],
           "actualAmount",
-          this.memberPrice.groupPurchaseQuarterlyFee *
-            this.form.memberList[0].num
+          this.memberPriceList[index].groupPurchaseQuarterlyFee *
+            this.form.memberList[index].num
         );
         this.$set(
-          this.form.memberList[0],
+          this.form.memberList[index],
           "originalAmount",
-          this.memberPrice.originalQuarterlyFee * this.form.memberList[0].num
+          this.memberPriceList[index].originalQuarterlyFee * this.form.memberList[index].num
         );
       }
       if (val == "YEAR_HALF") {
         this.$set(
-          this.form.memberList[0],
+          this.form.memberList[index],
           "actualAmount",
-          this.memberPrice.groupPurchaseHalfYearFee *
-            this.form.memberList[0].num
+          this.memberPriceList[index].groupPurchaseHalfYearFee *
+            this.form.memberList[index].num
         );
         this.$set(
-          this.form.memberList[0],
+          this.form.memberList[index],
           "originalAmount",
-          this.memberPrice.originalHalfYearFee * this.form.memberList[0].num
+          this.memberPriceList[index].originalHalfYearFee * this.form.memberList[index].num
         );
       }
       if (val == "YEAR") {
         this.$set(
-          this.form.memberList[0],
+          this.form.memberList[index],
           "actualAmount",
-          this.memberPrice.groupPurchaseYearFee * this.form.memberList[0].num
+          this.memberPriceList[index].groupPurchaseYearFee * this.form.memberList[index].num
         );
         this.$set(
-          this.form.memberList[0],
+          this.form.memberList[index],
           "originalAmount",
-          this.memberPrice.originalYearFee * this.form.memberList[0].num
+          this.memberPriceList[index].originalYearFee * this.form.memberList[index].num
         );
       }
     },
-    change() {},
-    async changeMember(val) {
-      if (val) {
+    async changeMember(val, index) {
+      if (val && val.length > 0) {
         if (this.getMemberFeeFlag) {
           this.getMemberFeeFlag = false;
           try {
             const res = await getMemberFee({
-              rankId: val,
+              rankId: val[val.length - 1],
               organId: this.organId
             });
-            this.memberPrice = res.data;
+            this.memberPriceList[index] = res.data
             this.getMemberFeeFlag = true;
             if (!res.data) {
               this.$bus.$emit("showguide", ["memberList"]);
@@ -414,12 +469,12 @@ export default {
           max =
             Number(this.rulesForm.maxQuarterlyFee) *
             this.form.memberList[0].num;
-          console.log(
-            this.form.memberList[0]?.period,
-            min,
-            max,
-            this.rulesForm
-          );
+          // console.log(
+          //   this.form.memberList[0]?.period,
+          //   min,
+          //   max,
+          //   this.rulesForm
+          // );
           break;
         }
         case "YEAR_HALF": {
@@ -440,16 +495,11 @@ export default {
         return callback();
       }
       return callback(new Error(`定价应在${min}-${max}之间`));
-    }
-  },
-  watch: {
-    form: {
-      deep: true,
-      handler(val) {
-        if (val.memberList[0].memberRankSettingId && !this.memberPrice.id) {
-          this.changeMember(val.memberList[0].memberRankSettingId);
-        }
-      }
+    },
+    onRemove(index) {
+      this.memberPriceList.splice(index, 1)
+      this.$forceUpdate();
+      this.$listeners.remove && this.$listeners.remove(index)
     }
   },
   computed: {

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

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

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

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

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

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

+ 62 - 85
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,13 @@
             ></i>
             <div class="paymentPrice">
               <span>优惠价:¥{{ item.actualAmount | moneyFormat }}</span>
-              <del>原价:¥ {{ onCalcSinglePrice(item) }}</del>
             </div>
           </div>
         </div>
       </div>
+      </div>
+      </template>
+      
     </member>
 
     <instrument-model
@@ -199,9 +215,28 @@
 
       <a class="btn-submit">购买</a>
     </div> -->
+
+    <el-dialog
+      title="视频"
+      :visible.sync="videoStatus"
+      :modal-append-to-body="false"
+      :append-to-body="true"
+      class="videoDialog"
+      width="576px"
+    >
+      <videoTcplayer
+        v-if="videoStatus"
+        style="width: 100%"
+        controls="controls"
+        class="ql-video"
+        :src="'https://oss.dayaedu.com/daya/202105/SWmqmvW.mp4'"
+        :poster="require('../../../assets/images/musicGroup/video_bg.png')"
+      />
+    </el-dialog>
   </div>
 </template>
 <script>
+import videoTcplayer from "@/components/video-tcplayer";
 import { permission } from "@/utils/directivePage";
 import { getSubjectGoodsAndInfoPreview, getType } from "@/api/buildTeam";
 import dayjs from "dayjs";
@@ -225,7 +260,8 @@ export default {
     InstrumentModel,
     accessories,
     activity,
-    member
+    member,
+    videoTcplayer
   },
   data() {
     const query = this.$route.query;
@@ -357,6 +393,7 @@ export default {
               isShowVipCourseForPay: true,
               isShowMusicCourseForPay: true
             };
+      console.log(this.preViewData)
       this.courseViewType = tempResult.musicGroup.courseViewType || 0;
       this.isGiveAccessories =
         (tempResult.musicGroup && tempResult.musicGroup.isGiveAccessories) ||
@@ -408,27 +445,15 @@ export default {
 
       let tempInfo =
         paymentCalender && paymentCalender.course ? paymentCalender.course : [];
-      let memberPrivilegesItemList = tempResult.memberPrivilegesItemList
-        ? tempResult.memberPrivilegesItemList
-        : [];
-      let tempMember = [];
-      memberPrivilegesItemList.forEach(member => {
-        if (
-          member.memberPrivilegesItems &&
-          member.memberPrivilegesItems.length > 0
-        ) {
-          member.memberPrivilegesItems.forEach(item => {
-            tempMember.push(item.name);
-          });
-        }
-      });
+
       // 云练习
       const member =
-        paymentCalender && paymentCalender.member ? paymentCalender.member : {};
+        paymentCalender && paymentCalender.member ? paymentCalender.member : [];
 
-      member.isStatus = true;
-      this.toolsPackage = member && !member.memberRankSettingId ? [] : [member];
-      console.log(this.toolsPackage, "this.toolsPackage");
+      member.forEach((item) => {
+        item.isStatus = true;
+      })
+      this.toolsPackage = member;
 
       // 乐器保养
       const repair =
@@ -915,65 +940,17 @@ export default {
     },
     permission(str) {
       return permission(str);
-    },
-    onCalcSinglePrice(item) {
-      const tempNum = {
-        YEAR: 12,
-        MONTH: 1,
-        QUARTERLY: 3,
-        YEAR_HALF: 6
-      };
-      const num = (tempNum[item.period] || 1) * item.num;
-      let price = 0;
-      if (num % 6 === 0) {
-        const halfYearNum = Number(num / 6);
-        this.formatList.forEach(format => {
-          price += Number(format.halfYearPrice * halfYearNum);
-        });
-      } else {
-        this.formatList.forEach(format => {
-          price += Number(format.monthPrice * num);
-        });
-      }
-
-      return numeral(Number(price)).format("0,0.00");
     }
   },
   filters: {
     unitFormat(val) {
       let template = {
-        YEAR: "年",
-        MONTH: "月",
-        QUARTERLY: "季度",
-        YEAR_HALF: "半年"
+        YEAR: "(年)",
+        MONTH: "(月)",
+        QUARTERLY: "(季度)",
+        YEAR_HALF: "(半年)"
       };
       return template[val];
-    },
-    unitFormatMonth(val, period) {
-      const tempNum = {
-        YEAR: 12,
-        MONTH: 1,
-        QUARTERLY: 3,
-        YEAR_HALF: 6
-      };
-      return val * (tempNum[period] || 1);
-    },
-    unitFormatPrice(val, type, nums, halfYearPrice) {
-      const tempNum = {
-        YEAR: 12,
-        MONTH: 1,
-        QUARTERLY: 3,
-        YEAR_HALF: 6
-      };
-      const num = (tempNum[type] || 1) * nums;
-      let price = 0;
-      if (num % 6 === 0) {
-        const halfYearNum = Number(num / 6);
-        price += Number(halfYearPrice * halfYearNum);
-      } else {
-        price += Number(val * num);
-      }
-      return numeral(price).format("0,0.00");
     }
   }
 };

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