Browse Source

Merge branch '11/24SAAS' of http://git.dayaedu.com/yonge/dy-admin-manager into 11/24SAAS

mo 3 years ago
parent
commit
c5baa7bb17

+ 4 - 1
src/utils/request2.js

@@ -74,7 +74,10 @@ const service = axios.create({
 service.interceptors.request.use(
   config => {
     // do something before request is sent
-    showFullScreenLoading()
+    let hideLoading = config.hideLoading || false
+    if(!hideLoading) {
+      showFullScreenLoading()
+    }
     if (store.getters.token) {
       // let each request carry token
       // ['X-Token'] is a custom headers key

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

@@ -133,7 +133,8 @@ export default {
   },
   computed: {
     isDisabled() {
-      return this.type == 'setting' || this.payState == 1  ? true : false
+      //  || this.payState == 1
+      return this.type == 'setting'  ? true : false
     },
     unitSuffix() {
       // 后辍默认为年

+ 13 - 1
src/views/resetTeaming/api.js

@@ -123,9 +123,21 @@ export const getAllmemberRank = (data) => request2({
 
 // 查询未激活团练宝用户
 export const queryInactive = (data) => request2({
-  url: '/api-web//cloudTeacherOrder/queryInactive',
+  url: '/api-web/cloudTeacherOrder/queryInactive',
   method: 'post',
   data
 })
 
+// 激活团练宝用户
+export const cloudPay = (data) => request2({
+  url: '/api-web/cloudTeacherOrder/pay',
+  method: 'post',
+  data
+})
 
+export const cloudPayCheck = (data) => request2({
+  url: '/api-web/cloudTeacherOrder/payCheck',
+  method: 'get',
+  hideLoading: true,
+  params: data
+})

+ 40 - 14
src/views/resetTeaming/components/giveMemberList.vue

@@ -3,10 +3,10 @@
     <el-form :inline="true" :model="searchForm">
       <el-form-item>
         <el-input
-          v-model.trim="searchForm.search"
-          @keyup.enter.native="search"
+          v-model.trim="searchForm.queryCondition"
+          @keyup.enter.native="queryCondition"
           clearable
-          placeholder="学生编号"
+          placeholder="学生姓名/编号/电话"
         ></el-input>
       </el-form-item>
       <el-form-item>
@@ -33,7 +33,7 @@
     <!-- <div class="newBand"
          @click="resetPays"
          v-permission="'musicGroupStudentFee/batchUpdateCourseFee'">修改缴费金额</div> -->
-    <el-button @click="addMember" type="primary" style="margin-bottom: 20px">激活会员</el-button>
+    <el-button @click="addMember" v-if="$helpers.permission('cloudTeacherOrder/pay')" type="primary" style="margin-bottom: 20px">激活会员</el-button>
 
     <div class="tableWrap">
       <el-table
@@ -51,7 +51,7 @@
         ></el-table-column>
         <el-table-column align="center" prop="name" label="学员姓名">
         </el-table-column>
-        <el-table-column align="center" prop="phone" label="联系电话">
+        <el-table-column align="center" prop="phone" label="手机号">
         </el-table-column>
         <el-table-column
           align="center"
@@ -64,7 +64,7 @@
           label="团练宝类型"
         >
           <template slot-scope="scope">
-            {{ scope.row.type | cloudGroupActive }}
+            {{ scope.row.type | memberEnumType }}
           </template>
         </el-table-column>
         <el-table-column
@@ -100,20 +100,32 @@
         @pagination="getList"
       />
     </div>
+
+    <el-dialog
+      title="激活会员"
+      :visible.sync="giveMemberVisible"
+      width="1000px"
+      v-if="giveMemberVisible"
+      append-to-body
+    >
+      <giveMemberModel :tableList="selectStudentList" @getList="getList" @close="giveMemberVisible = false" />
+    </el-dialog>
   </div>
 </template>
 <script>
 import pagination from "@/components/Pagination/index";
 import { findSound } from '@/api/buildTeam'
 import { queryInactive } from '../api'
+import giveMemberModel from "../modals/giveMemberModel";
 export default {
-  components: { pagination },
+  components: { pagination, giveMemberModel },
   data() {
     let musicGroupId = this.$route.query.id;
     return {
       musicGroupId,
+      giveMemberVisible: false,
       searchForm: {
-        search: "",
+        queryCondition: "",
         subjectId: "",
       },
       soundList: [],
@@ -125,6 +137,7 @@ export default {
         total: 0, // 总条数
         page_size: [10, 20, 40, 50], // 选择限制显示条数
       },
+      selectStudentList: [], // 选中的学生列表
     };
   },
   mounted() {
@@ -144,19 +157,32 @@ export default {
       try {
         const res = await queryInactive({
           ...this.searchForm,
+          musicGroupId: this.musicGroupId,
           page: this.rules.page,
           rows: this.rules.limit,
         });
-        console.log(res)
         this.rules.total = res.data.total;
         this.tableList = res.data.rows;
       } catch (e) { }
       queryInactive
     },
-    handleSelectionChange(val) {},
-    search() {},
-    onReSet() {},
-    addMember(){}
+    handleSelectionChange(val) {
+      this.selectStudentList = val || []
+    },
+    search() {
+      this.rules.page = 1;
+      this.getList();
+    },
+    onReSet() {
+      this.searchForm = { search: "", subjectId: "" };
+    },
+    addMember(){
+      if(this.selectStudentList.length <= 0) {
+        this.$message.error('至少选择一名学生')
+        return
+      }
+      this.giveMemberVisible = true
+    }
   },
 };
-</script>
+</script>

+ 37 - 0
src/views/resetTeaming/components/payInfoDetail.vue

@@ -17,6 +17,7 @@
               <p>基础信息设置</p>
             </div>
             <el-form-item
+              prop="paymentDate"
               :rules="[
                 { required: true, message: '请选择缴费时间', trigger: 'blur' },
               ]"
@@ -224,6 +225,16 @@
         </div>
       </div>
     </div>
+    <el-dialog
+      title="报名声部预览"
+      :visible.sync="dialogSubjectVisible"
+      width="400px"
+      class="subjectPreview"
+    >
+      <subject-preview
+        :preViewData="preViewData"
+      ></subject-preview>
+    </el-dialog>
   </div>
 </template>
 <script>
@@ -233,6 +244,7 @@ import payLeBao from "../modals/payLeBao";
 import payTeamActive from "../modals/payTeamActive";
 import numeral from "numeral";
 import dayjs from "dayjs";
+import subjectPreview from "@/views/resetTeaming/modals/subject-preview";
 import {
   chargeTypeList,
   musicGroupOrganizationCourseSettingsQueryPage,
@@ -304,6 +316,8 @@ export default {
         minYearFee: null,
         maxYearFee: null,
       },
+      dialogSubjectVisible: false, // 预览
+      preViewData: {}
     };
   },
   mounted() {
@@ -597,6 +611,9 @@ export default {
     submitForm() {
       this.$refs.form.validate(async (isok) => {
         if (isok) {
+          // const preViewData = this.formatPreviewData()
+          // this.preViewData = preViewData
+          // this.dialogSubjectVisible = true
           let obj = this.fommatDate();
           if (this.$route.query.calenderId) {
             obj.calenderId = this.$route.query.calenderId;
@@ -619,6 +636,26 @@ export default {
         }
       });
     },
+
+    formatPreviewData() {
+      // 格式化预览数据
+      const form = this.form
+      // 重置小班课数据
+      let activeList = form.activeList?.length > 0 ? form.activeList : []
+      if(activeList.length > 0) {
+        activeList.forEach(active => {
+          active.categoryName = active.vipGroupCategoryNames
+        })
+      }
+      return {
+        musicGroup: this.musicGroup,
+        activity: [...activeList], // 小班课
+        course: form.eclass?.length > 0 ? form.eclass : [], // 课程
+        member: form.memberList?.length > 0 ? { ...form.memberList[0] } : null, // 团练宝
+        memberPrivilegesItemList: [], // 会员基本内容
+        repair: form.leBaoList?.length > 0 ? { ...form.leBaoList[0] } : null, // 乐保
+      }
+    },
     fommatDate() {
       return {
         payUserType: this.$route.query.payUserType,

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

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

+ 152 - 0
src/views/resetTeaming/modals/giveMemberModel.vue

@@ -0,0 +1,152 @@
+<template>
+  <div class="chioseWrap">
+    <p>您将为以下<span>{{tableList.length}}</span>位学员激活团练宝,激活金额<span>{{ selectStudentMoney | moneyFormat }}</span>元</p>
+    <el-form :inline="true" ref="payForm" :model="payForm">
+      <el-form-item prop="payType" :rules="[{required: true, message: '请选择支付方式', trigger: 'change'}]">
+        <el-select
+          v-model.trim="payForm.payType"
+          style="width: 180px"
+          clearable
+          filterable
+          placeholder="请选择支付方式"
+        >
+          <el-option label="支付宝支付" value="alipay_qr"></el-option>
+          <el-option label="微信支付" value="wx_pub"></el-option>
+        </el-select>
+      </el-form-item>
+    </el-form>
+    <el-table
+      style="width: 100%"
+      :header-cell-style="{ background: '#EDEEF0', color: '#444' }"
+      :data="tableList"
+    >
+      <el-table-column align="center" prop="name" label="学员姓名">
+      </el-table-column>
+      <el-table-column align="center" prop="phone" label="手机号">
+      </el-table-column>
+      <el-table-column
+        align="center"
+        prop="type"
+        label="团练宝类型"
+      >
+        <template slot-scope="scope">
+          {{ scope.row.type | memberEnumType }}
+        </template>
+      </el-table-column>
+      <el-table-column
+        align="center"
+        prop="time"
+        label="数量"
+      ></el-table-column>
+      <el-table-column
+        align="center"
+        label="缴费金额(元)"
+      >
+        <template slot-scope="scope">
+          {{ scope.row.amount | hasMoneyFormat }}
+        </template>
+      </el-table-column>
+    </el-table>
+
+    <span slot="footer" class="dialog-footer">
+      <el-button @click="$listeners.close();$listeners.getList()">取 消</el-button>
+      <el-button @click="onMemberPay" type="primary">确 定</el-button>
+    </span>
+
+    <el-dialog
+      title="激活会员"
+      :visible.sync="payMentVisible"
+      :before-close="onClose"
+      v-if="payMentVisible"
+      width="500px"
+      append-to-body
+    >
+      <giveMemberPayment :tableList="tableList" :orderNo="orderNo" :codeUrl="codeUrl" @close="onPaymentClose" />
+    </el-dialog>
+  </div>
+</template>
+<script>
+import { cloudPay } from '../api'
+import { vaildStudentUrl } from '@/utils/validate'
+import giveMemberPayment from '@/views/resetTeaming/modals/giveMemberPayment'
+export default {
+  props: ["tableList"],
+  components: { giveMemberPayment },
+  data() {
+    return {
+      payForm: {
+        payType: null,
+      },
+      pay_channel: null, //支付渠道
+      selectStudentMoney: 0, // 选中学生金额
+      payMentVisible: false,
+      codeUrl: null,
+      orderNo: null,
+    };
+  },
+  async mounted() {
+    let tableList = this.tableList || []
+    for(let i of tableList) {
+      this.selectStudentMoney += parseFloat(i.amount)
+    }
+  },
+  methods: {
+    onMemberPay() {
+      this.$refs.payForm.validate(async (_) => {
+        if(_) {
+          try {
+            const res = await cloudPay(this.tableList)
+            console.log(res)
+            const payForm = this.payForm
+            // // 二维码页面, 唤起支付页面
+            const { orderNo, sign, amount, orderBody, orderSubject } = res.data.payMap
+            this.orderNo = orderNo
+            this.codeUrl = vaildStudentUrl() + '/#/payCenter?orderNo=' + orderNo + '&sign=' + sign + '&amount=' + amount + '&payType=' + payForm.payType + '&orderBody=' + orderBody + '&orderSubject=' + orderSubject + '&platform=tenant'
+            console.log(this.codeUrl, 'codeUrl')
+            this.payMentVisible = true
+          } catch(e) {}
+        }
+      })
+    },
+    onClose(done) {
+      this.onPaymentClose(false, done)
+    },
+    onPaymentClose(hideTip = false, callBack) {
+      if(hideTip) {
+        this.payMentVisible = false
+        this.$emit('close')
+        this.$emit('getList')
+        return
+      }
+      this.$confirm(`是否放弃支付`, "提示", {
+        confirmButtonText: "确定",
+        cancelButtonText: "取消",
+        type: "warning",
+      }).then(async (res) => {
+        if(typeof callBack == 'function') {
+          callBack()
+        }
+        this.payMentVisible = false
+      });
+    }
+  },
+};
+</script>
+<style lang="less" scoped>
+.chioseWrap {
+  font-size: 16px;
+  > p {
+    font-weight: 500;
+    padding-bottom: 15px;
+    span {
+      color: red;
+      padding: 0 3px;
+    }
+  }
+}
+.dialog-footer {
+  text-align: right;
+  display: block;
+  padding-top: 15px;
+}
+</style>

+ 85 - 0
src/views/resetTeaming/modals/giveMemberPayment.vue

@@ -0,0 +1,85 @@
+<template>
+  <div class="chioseWrap">
+    <p>您将为<span>{{tableList.length}}</span>位学员激活会员<br />共需支付<span>{{ selectStudentMoney | moneyFormat }}</span>元</p>
+    <p>请扫描二维码支付,支付功能后学员团练宝即刻激活</p>
+
+    <vue-qr :text="codeUrl" style="width: 250px" :margin="0"></vue-qr>
+  </div>
+</template>
+<script>
+import VueQr from 'vue-qr'
+import { cloudPayCheck } from '../api'
+export default {
+  props: {
+    tableList: {
+      type: Array,
+      default: []
+    },
+    orderNo: {
+      type: String
+    },
+    codeUrl: {
+      type: String
+    },
+  },
+  components: { VueQr },
+  data() {
+    return {
+      payForm: {
+        payType: null,
+      },
+      selectStudentMoney: 0, // 选中学生金额
+      orderTimer: null
+    };
+  },
+  async mounted() {
+    let tableList = this.tableList || []
+    for(let i of tableList) {
+      this.selectStudentMoney += parseFloat(i.amount)
+    }
+    setTimeout(() => {
+      this.getPaymentStatus()
+    }, 3000)
+  },
+  methods: {
+    async getPaymentStatus() {
+      let orderTimer = setInterval(async () => {
+        this.orderTimer = orderTimer
+        try {
+          const res = await cloudPayCheck({ orderNo: this.orderNo })
+          if(res.data) {
+            clearInterval(orderTimer)
+            this.$message.success('您已成功缴费')
+            this.$emit('close', true)
+          }
+        } catch(e) {
+          clearInterval(orderTimer)
+        }
+      }, 5000);
+    }
+  },
+  beforeDestroy() {
+    clearInterval(this.orderTimer)
+  }
+};
+</script>
+<style lang="less" scoped>
+.chioseWrap {
+  text-align: center;
+  font-size: 16px;
+  > p {
+    font-weight: 600;
+    padding-bottom: 15px;
+    line-height: 1.5;
+    span {
+      color: red;
+      padding: 0 3px;
+    }
+  }
+}
+.dialog-footer {
+  text-align: right;
+  display: block;
+  padding-top: 15px;
+}
+</style>

+ 1 - 2
src/views/resetTeaming/modals/subject-preview.vue

@@ -109,7 +109,7 @@ import accessories from './accessories'
 import activity from './activity'
 import member from './member'
 export default {
-  props: ["subjectId", "calenderId"],
+  props: ["subjectId", "calenderId", "preViewData"],
   components: { Tips, courseModel, InstrumentModel, accessories, activity, member },
   data() {
     const query = this.$route.query;
@@ -190,7 +190,6 @@ export default {
           this.chargeTypeList = result.rows || [];
         }
       });
-
       await getSubjectGoodsAndInfoPreview(params).then((res) => {
         let result = res;
         if (result.code == 200) {

+ 5 - 5
src/views/teamDetail/components/modals/createMember.vue

@@ -15,11 +15,11 @@
           v-model.trim="memberForm.addType"
           style="width: 100% !important"
         >
-          <el-option label="月度" :value="2"></el-option>
-          <el-option label="季度" :value="3"></el-option>
-          <el-option label="半年" :value="4"></el-option>
-          <el-option label="年度" :value="5"></el-option>
-          <el-option label="固定天数" :value="1"></el-option>
+          <el-option label="月度" value="MONTH"></el-option>
+          <el-option label="季度" value="QUARTERLY"></el-option>
+          <el-option label="半年" value="YEAR_HALF"></el-option>
+          <el-option label="年度" value="YEAR"></el-option>
+          <el-option label="固定天数" value="DAY"></el-option>
         </el-select>
       </el-form-item>
       <el-form-item

+ 2 - 1
src/views/teamDetail/components/studentList.vue

@@ -1971,7 +1971,8 @@ export default {
       this.multipleSelection = val;
     },
     checkboxSelect(row) {
-      return row.studentStatus == "NORMAL";
+      // 没有会员时间,未购买会员的
+      return row.studentStatus == "NORMAL" && !row.membershipEndTime && !row.hasNoStartCloudTeacher;
     },
     gotoStudent(search) {
       // this.$router.push({

+ 5 - 0
src/views/tenantSetting/api.js

@@ -11,6 +11,11 @@ export const cloudTeacherOrderQueryActive = (data) => request2({
   method: 'post',
   data,
 })
+export const queryActiveRecord = (data) => request2({
+  url: '/api-web/cloudTeacherOrder/queryActiveRecord',
+  method: 'post',
+  data,
+})
 
 // 扣费记录
 export const tenantCloudCourseRecord = (data) => request2({

+ 1 - 1
src/views/tenantSetting/chargingRecord.vue

@@ -150,7 +150,7 @@
             {{ scope.row.deductState | chargingStatus }}
           </template>
         </el-table-column>
-        <el-table-column align="center" label="冻结金额(元)">
+        <el-table-column align="center" label="扣费金额(元)">
           <template slot-scope="scope">
             {{ scope.row.amount | moneyFormat }}
           </template>

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

@@ -55,7 +55,7 @@
         </el-table-column>
         <el-table-column align="center" label="订单号" prop="orderNo">
         </el-table-column>
-        <el-table-column align="center" label="订单时间" prop="createdTime">
+        <el-table-column align="center" label="订单时间" prop="orderTime">
         </el-table-column>
         <el-table-column align="center" label="学员编号" prop="studentId">
         </el-table-column>
@@ -63,14 +63,14 @@
         </el-table-column>
         <el-table-column align="center" label="手机号码" prop="phone">
         </el-table-column>
-        <el-table-column align="center" label="交易类型">
+        <!-- <el-table-column align="center" label="交易类型">
           <template slot-scope="scope">
-            {{ scope.row.orderType | tenantStatus }}
+            {{ scope.row.type | tenantStatus }}
           </template>
-        </el-table-column>
+        </el-table-column> -->
         <el-table-column align="center" label="团练宝类型">
           <template slot-scope="scope">
-            {{ scope.row.expectAmount | moneyFormat }}
+            {{ scope.row.type | memberEnumType }}
           </template>
         </el-table-column>
         <!-- <el-table-column align="center" label="网络教室剩余时长" prop="productName">
@@ -101,7 +101,7 @@
 </template>
 <script>
 import pagination from "@/components/Pagination/index";
-import { cloudTeacherOrderQueryActive } from "./api";
+import { queryActiveRecord } from "./api";
 import { tenantStatus, dealStatus } from "@/utils/searchArray";
 import { getTimes } from "@/utils";
 const initSearch = {
@@ -133,11 +133,11 @@ export default {
     async getList() {
       try {
         let { createTimer, ...reset } = this.searchForm;
-        const res = await cloudTeacherOrderQueryActive({
+        const res = await queryActiveRecord({
           ...reset,
           ...getTimes(createTimer, ["startDate", "endDate"], "YYYY-MM-DD"),
           page: this.pageInfo.page,
-          rows: this.pageInfo.limit,
+          rows: this.pageInfo.limit
         });
         console.log(res)
         this.pageInfo.total = res.data.total;