Bläddra i källkod

Merge branch 'master' into 2.0

wenjie 6 månader sedan
förälder
incheckning
1d155af0ff

+ 1 - 1
src/router/index.js

@@ -2,7 +2,7 @@
  * @Author: wenjie 1454560336@qq.com
  * @Date: 2024-03-05 11:36:07
  * @LastEditors: wenjie 1454560336@qq.com
- * @LastEditTime: 2024-11-25 14:54:13
+ * @LastEditTime: 2024-12-04 09:48:22
  * @FilePath: \admin-manage\src\router\index.js
  * @Description:
  *

+ 3 - 3
src/utils/config.js

@@ -2,14 +2,14 @@
  * @Author: wj 1454560336@qq.com
  * @Date: 2024-01-05 16:08:18
  * @LastEditors: wenjie 1454560336@qq.com
- * @LastEditTime: 2024-10-29 17:17:03
+ * @LastEditTime: 2024-12-04 09:46:53
  * @FilePath: \admin-manage\src\utils\config.js
  * @Description: 124234
  * 
  * Copyright (c) 2024 by ${git_name_email}, All Rights Reserved. 
  */
-// const BASE_URL = 'https://api.zonelife.cn/';
-const BASE_URL = 'https://api.dev.zonelife.cn/';
+const BASE_URL = 'https://api.zonelife.cn/';
+// const BASE_URL = 'https://api.dev.zonelife.cn/';
 // http://192.168.110.226:9002
 
 

+ 93 - 21
src/views/operationManage/comboManage/checkoutCode.vue

@@ -15,6 +15,10 @@
         <el-button class="ml10" type="primary" size="small" icon="el-icon-search" @click="handleSearch">
           搜索
         </el-button>
+        <el-button class="ml10" type="info" size="small" :loading="downloadLoading" icon="el-icon-printer"
+          @click="exportAllExcel">
+          导出
+        </el-button>
       </div>
       <el-button class="ml10" type="info" size="small" plain icon="el-icon-back" @click="comeBack">
         返回
@@ -23,15 +27,15 @@
     <el-descriptions class="margin-top" :column="3" border>
       <el-descriptions-item>
         <template slot="label"> 计费号 </template>
-        {{ groupInfos.billId||'--' }}
+        {{ groupInfos.billId || '--' }}
       </el-descriptions-item>
       <el-descriptions-item>
         <template slot="label"> 集团名称 </template>
-        {{ groupInfos.groupName||'--' }}
+        {{ groupInfos.groupName || '--' }}
       </el-descriptions-item>
       <el-descriptions-item>
         <template slot="label"> 订购数量 </template>
-        {{ groupInfos.orderNum||'--' }}
+        {{ groupInfos.orderNum || '--' }}
       </el-descriptions-item>
       <el-descriptions-item>
         <template slot="label"> 所属平台 </template>
@@ -39,19 +43,19 @@
       </el-descriptions-item>
       <el-descriptions-item>
         <template slot="label"> 订购产品策划名称 </template>
-        {{ groupInfos.groupPlanName||'--' }}
+        {{ groupInfos.groupPlanName || '--' }}
       </el-descriptions-item>
       <el-descriptions-item>
         <template slot="label"> 激活码数量 </template>
-        {{ groupInfos.totalTicket||'--' }}
+        {{ groupInfos.totalTicket || '--' }}
       </el-descriptions-item>
       <el-descriptions-item>
         <template slot="label"> 已使用数量 </template>
-        {{ groupInfos.useTicket||'--' }}
+        {{ groupInfos.useTicket || '--' }}
       </el-descriptions-item>
       <el-descriptions-item>
         <template slot="label"> 未使用数量 </template>
-        {{ groupInfos.totalTicket-groupInfos.useTicket||'--' }}
+        {{ groupInfos.totalTicket - groupInfos.useTicket || '--' }}
       </el-descriptions-item>
       <el-descriptions-item>
         <template slot="label"> 激活失败 </template>
@@ -74,9 +78,10 @@
       </el-table-column>
       <el-table-column prop="activationDay" align="center" label="时间段/天数" show-overflow-tooltip>
         <template slot-scope="scope">
-          <span v-if="scope.row.activationType == 1">{{ timeFormat(scope.row.startTime) }}至{{ timeFormat(scope.row.endTime) }}</span>
+          <span v-if="scope.row.activationType == 1">{{ timeFormat(scope.row.startTime) }}至{{
+            timeFormat(scope.row.endTime) }}</span>
           <span v-else>
-          {{ scope.row.activationDay}}
+            {{ scope.row.activationDay+'天' }}
           </span>
         </template>
       </el-table-column>
@@ -93,17 +98,17 @@
       </el-table-column>
       <el-table-column align="center" label="推送状态" show-overflow-tooltipphone>
         <template slot-scope="scope">
-          <span>{{scope.row.sync===true?'推送成功':'--'}}</span>
+          <span>{{ scope.row.sync === true ? '推送成功' : '--' }}</span>
         </template>
       </el-table-column>
       <el-table-column align="center" label="激活手机号" show-overflow-tooltip>
         <template slot-scope="scope">
-          {{ scope.row.phone|| '--' }}
+          {{ scope.row.phone || '--' }}
         </template>
       </el-table-column>
       <el-table-column align="center" label="激活时间" show-overflow-tooltip>
         <template slot-scope="scope">
-          <span v-if="scope.row.phone==null">--</span>
+          <span v-if="scope.row.phone == null">--</span>
           <span v-else>{{ timeFormat(scope.row.useTime) }}</span>
         </template>
       </el-table-column>
@@ -137,14 +142,16 @@
 </template>
 
 <script>
-import { debounce } from "@/utils/index";
-import { checkoutActivationCode, labourActivation,syncNotified } from "@/api/common";
+import { checkoutActivationCode, labourActivation, syncNotified } from "@/api/common";
 import { timeFormat } from "@/utils/index";
+import FileSaver from 'file-saver';
+import XLSX from 'xlsx';
 
 export default {
   name: "orderManage",
   data() {
     return {
+      downloadLoading: false,
       updataLoading: false,
       date: '',
       vipCode: '',
@@ -168,7 +175,7 @@ export default {
         groupOrderNo: '',
         startTime: "",
         endTime: "",
-        state:'',
+        state: '',
         page: 1,
         size: 10,
       },
@@ -191,16 +198,16 @@ export default {
 
   },
   methods: {
-    // 同步和校园数据,待完成
-    synchronization(item){
-      syncNotified({ticketId:item.id}).then((res)=>{
-        if(res.state == "Success"){
+    // 同步和校园推送状态
+    synchronization(item) {
+      syncNotified({ ticketId: item.id }).then((res) => {
+        if (res.state == "Success") {
           this.getList()
         }
       })
     },
 
-    Cancel(){
+    Cancel() {
       this.vipDialogVisible = false;
       this.updataPhone.num = ''
     },
@@ -208,7 +215,7 @@ export default {
     confirmActivation(formName) {
       this.$refs[formName].validate((valid) => {
         let updata = {
-          phone:this.updataPhone.num,
+          phone: this.updataPhone.num,
           serialNumber: this.vipCode
         }
         if (valid) {
@@ -238,6 +245,71 @@ export default {
     comeBack() {
       this.$router.back()
     },
+
+    // 导出
+    exportAllExcel() {
+      this.downloadLoading = true
+      const allData = [];
+      let query = JSON.parse(JSON.stringify(this.query))
+      query.size = this.total
+      query.page = 0
+      checkoutActivationCode(query).then(res => {
+        this.downloadLoading = false
+        if (res.state == "Success") {
+          allData.push(...res.content.content);
+          this.exportExcel(allData);
+        }
+      });
+    },
+
+    // 导出数据处理
+    exportExcel(r) {
+      const data = r.map((item) => {
+        let createTime=''
+        let codeStatus = ''
+        let pushSync=''
+        let pushTime=''
+        let validType=''
+        if(item.activationType===1){
+          createTime = item.startTime+'至'+item.endTime
+          validType='时间段'
+        }else{
+          createTime = item.activationDay+'天'
+          validType='天数'
+        }
+        if(item.phone==null){
+          codeStatus='待使用'
+          pushTime='--'
+        }else{
+          codeStatus='激活成功'
+          pushTime=timeFormat(item.useTime)
+        }
+        if(item.sync==true){
+          pushSync='推送成功'
+        }else{
+          pushSync='--'
+        }
+        return {
+          "激活ID": item.id,
+          "激活码": item.serialNumber,
+          "会员套餐": item.planningName,
+          "有效期类型":validType,
+          "时间段/天数": createTime,
+          "创建时间":timeFormat(item.createTime),
+          "状态": codeStatus,
+          "推送状态": pushSync,
+          "激活手机号": item.phone||'--',
+          "激活时间": pushTime,
+        }
+      })
+      const worksheet = XLSX.utils.json_to_sheet(data);
+      const workbook = { Sheets: { data: worksheet }, SheetNames: ['data'] };
+      const excelBuffer = XLSX.write(workbook, { bookType: 'xlsx', type: 'array' });
+      const blob = new Blob([excelBuffer], { type: 'application/octet-stream' });
+      FileSaver.saveAs(blob, '激活码列表.xlsx');
+    },
+
+
     handleSearch() {
       this.query.page = 1;
       this.getList();

+ 32 - 0
src/views/operationManage/comboManage/editCombo.vue

@@ -61,6 +61,24 @@
           @uploadEnd="uploadEnd"
         ></Upload>
       </el-form-item>
+      <el-form-item label="套餐来源:">
+        <el-select v-model="setQuery.source"
+          class="item-width-300" placeholder="请选择" clearable>
+          <el-option
+            v-for="item in options"
+            :key="item.value"
+            :label="item.label"
+            :value="item.value">
+          </el-option>
+        </el-select>
+      </el-form-item>
+      <el-form-item label="套餐天数:">
+        <el-input
+        type="number"
+          v-model.number="setQuery.setMealDay"
+          class="item-width-300"
+        ></el-input>
+      </el-form-item>
       <el-form-item label="套餐说明:">
         <el-input
           type="textarea"
@@ -97,6 +115,16 @@ export default {
       loading: false,
       loading1: false,
       mode:'',
+      options:[
+        {
+          label:'移动',
+          value:1
+        },
+        {
+          label:'其他',
+          value:2
+        }
+      ],
       setQuery: {
         setMealCode: 0,
         setMealDetail: "",
@@ -107,6 +135,8 @@ export default {
         backImg:"",
         colour:'',
         backColour:'',
+        source:'',
+        setMealDay:'',
       },
       rules: {
         setMealCode: [
@@ -148,6 +178,8 @@ export default {
                 this.setQuery.backColour = res.content.backColour
                 this.setQuery.discount = res.content.discount
                 this.setQuery.backImg = res.content.backImg
+                this.setQuery.source = res.content.source
+                this.setQuery.setMealDay = res.content.setMealDay
                 
             }
         })

+ 119 - 228
src/views/operationManage/comboManage/vipActivation.vue

@@ -2,147 +2,53 @@
   <div class="orderManage app-container">
     <div class="search">
       <div>
-        <el-input
-          v-model="query.billId"
-          size="small"
-          placeholder="请输入计费号"
-          class="item-width-200"
-        ></el-input>
-        <el-input
-          v-model="query.groupName"
-          size="small"
-          placeholder="请输入集团名称"
-          class="item-width-200 ml10"
-        ></el-input>
-        <el-input
-          v-model="query.planningName"
-          size="small"
-          placeholder="请输入产品策划名称"
-          class="item-width-200 ml10"
-        ></el-input>
-        <el-input
-          v-model="query.orderNo"
-          size="small"
-          placeholder="请输入订单号"
-          class="item-width-200 ml10"
-        ></el-input>
-        <el-select
-          v-model="query.groupType"
-          size="small"
-          clearable
-          class="item-width-200 ml10"
-          placeholder="请选择状态"
-        >
-          <el-option
-            v-for="item in statusOptions"
-            :key="item.value"
-            :label="item.label"
-            :value="item.value"
-          >
+        <el-input v-model="query.billId" size="small" placeholder="请输入计费号" class="item-width-200"></el-input>
+        <el-input v-model="query.groupName" size="small" placeholder="请输入集团名称" class="item-width-200 ml10"></el-input>
+        <el-input v-model="query.planningName" size="small" placeholder="请输入产品策划名称"
+          class="item-width-200 ml10"></el-input>
+        <el-input v-model="query.orderNo" size="small" placeholder="请输入订单号" class="item-width-200 ml10"></el-input>
+        <el-select v-model="query.groupType" size="small" clearable class="item-width-200 ml10" placeholder="请选择状态">
+          <el-option v-for="item in statusOptions" :key="item.value" :label="item.label" :value="item.value">
           </el-option>
         </el-select>
-        <el-select
-          v-model="query.actionID"
-          size="small"
-          clearable
-          class="item-width-200 ml10"
-          placeholder="请选择订单状态"
-        >
-          <el-option
-            v-for="item in orderStatusoptions"
-            :key="item.value"
-            :label="item.label"
-            :value="item.value"
-          >
+        <el-select v-model="query.actionID" size="small" clearable class="item-width-200 ml10" placeholder="请选择订单状态">
+          <el-option v-for="item in orderStatusoptions" :key="item.value" :label="item.label" :value="item.value">
           </el-option>
         </el-select>
-        <el-button
-          class="ml10"
-          type="primary"
-          size="small"
-          icon="el-icon-search"
-          @click="handleSearch"
-        >
+        <el-button class="ml10" type="primary" size="small" icon="el-icon-search" @click="handleSearch">
           搜索
         </el-button>
       </div>
+      <el-button class="ml10" type="info" size="small" :loading="downloadLoading" icon="el-icon-printer" @click="exportAllExcel">
+          导出
+        </el-button>
     </div>
 
-    <el-table
-      :data="tableData"
-      tooltip-effect="dark"
-      border
-      v-loading="loading"
-      style="width: 100%"
-    >
-      <el-table-column
-        align="center"
-        label="计费号"
-        prop="billId"
-        show-overflow-tooltip
-      >
+    <el-table :data="tableData" tooltip-effect="dark" border v-loading="loading" style="width: 100%">
+      <el-table-column align="center" label="计费号" prop="billId" show-overflow-tooltip>
       </el-table-column>
-      <el-table-column
-        prop="groupName"
-        align="center"
-        label="集团名称"
-        show-overflow-tooltip
-      >
+      <el-table-column prop="groupName" align="center" label="集团名称" show-overflow-tooltip>
       </el-table-column>
-      <el-table-column
-        prop="orderNo"
-        align="center"
-        label="订单号"
-        show-overflow-tooltip
-      >
+      <el-table-column prop="orderNo" align="center" label="订单号" show-overflow-tooltip>
       </el-table-column>
-      <el-table-column
-        prop="groupPlanName"
-        align="center"
-        label="订购产品策划名称"
-        show-overflow-tooltip
-      ></el-table-column>
-      <el-table-column
-        prop="orderPrice"
-        align="center"
-        label="订购产品单价(元)"
-        show-overflow-tooltip
-      >
+      <el-table-column prop="groupPlanName" align="center" label="订购产品策划名称" show-overflow-tooltip></el-table-column>
+      <el-table-column prop="orderPrice" align="center" label="订购产品单价(元)" show-overflow-tooltip>
       </el-table-column>
       <el-table-column align="center" label="订购数量" show-overflow-tooltip>
         <template slot-scope="scope">
           {{ scope.row.orderNum || "--" }}
         </template>
       </el-table-column>
-      <el-table-column
-        prop="orderDate"
-        align="center"
-        label="订购时间"
-        show-overflow-tooltip
-      >
+      <el-table-column prop="orderDate" align="center" label="订购时间" show-overflow-tooltip>
       </el-table-column>
-      <el-table-column
-        prop="invalidDate"
-        align="center"
-        label="失效时间"
-        show-overflow-tooltip
-      >
+      <el-table-column prop="invalidDate" align="center" label="失效时间" show-overflow-tooltip>
       </el-table-column>
-      <el-table-column
-        align="center"
-        label="和校园推送时间"
-        show-overflow-tooltip
-      >
+      <el-table-column align="center" label="和校园推送时间" show-overflow-tooltip>
         <template slot-scope="scope">
           {{ timeFormat(scope.row.createTime) }}
         </template>
       </el-table-column>
-      <el-table-column
-        prop="groupType"
-        align="center"
-        label="状态"
-        show-overflow-tooltip
-      >
+      <el-table-column prop="groupType" align="center" label="状态" show-overflow-tooltip>
         <template slot-scope="scope">
           <span v-if="scope.row.groupType === 1">已生成</span>
           <span v-if="scope.row.groupType === 2">待生成</span>
@@ -162,12 +68,7 @@
       <el-table-column align="center" label="所属小程序" show-overflow-tooltip>
         <template slot-scope="scope">{{ "慧研学惠生活" }}</template>
       </el-table-column>
-      <el-table-column
-        prop="action"
-        align="center"
-        label="订单状态"
-        show-overflow-tooltip
-      >
+      <el-table-column prop="action" align="center" label="订单状态" show-overflow-tooltip>
         <template slot-scope="scope">
           <el-tag v-if="scope.row.action === 1" type="success">订购</el-tag>
           <el-tag type="danger" v-else-if="scope.row.action === 2">退订</el-tag>
@@ -177,42 +78,19 @@
       </el-table-column>
       <el-table-column prop="address" align="center" label="操作">
         <template slot-scope="scope">
-          <el-button
-            type="text"
-            size="small"
-            v-if="scope.row.groupType === 2&&btnAuthObj.createVipActivationl"
-            @click="gotoGenerating(scope.row)"
-            >生成激活码</el-button
-          >
-          <el-button
-            type="text"
-            size="small"
-             v-if="scope.row.groupType != 2&&btnAuthObj.vipActivationDetail"
-            @click="codeDetails(scope.row)"
-            >查看激活码</el-button
-          >
+          <el-button type="text" size="small" v-if="scope.row.groupType === 2"
+            @click="gotoGenerating(scope.row)">生成激活码</el-button>
+          <el-button type="text" size="small" v-else @click="codeDetails(scope.row)">查看激活码</el-button>
         </template>
       </el-table-column>
     </el-table>
     <div class="page-box">
-      <el-pagination
-        @size-change="handleSizeChange"
-        @current-change="handleCurrentChange"
-        background
-        :current-page="query.page"
-        :page-sizes="[10, 20, 30, 40]"
-        :page-size="query.size"
-        layout="total, sizes, prev, pager, next, jumper"
-        :total="total"
-      >
+      <el-pagination @size-change="handleSizeChange" @current-change="handleCurrentChange" background
+        :current-page="query.page" :page-sizes="[10, 20, 30, 40]" :page-size="query.size"
+        layout="total, sizes, prev, pager, next, jumper" :total="total">
       </el-pagination>
     </div>
-    <el-dialog
-      title="生成激活码"
-      :visible.sync="vipDialogVisible"
-      :before-close="closeVipDialog"
-      width="50%"
-    >
+    <el-dialog title="生成激活码" :visible.sync="vipDialogVisible" :before-close="closeVipDialog" width="50%">
       <el-descriptions class="margin-top" :column="3" border>
         <el-descriptions-item>
           <template slot="label"> 计费号 </template>
@@ -240,124 +118,75 @@
         </el-descriptions-item>
       </el-descriptions>
       <div class="codeInfo">激活码信息</div>
-      <el-form
-        :model="setQuery"
-        ref="setQuery"
-        :rules="rules"
-        label-width="130px"
-        size="small"
-      >
+      <el-form :model="setQuery" ref="setQuery" :rules="rules" label-width="130px" size="small">
         <el-form-item label="激活码有效期:" prop="validDay">
-          <el-input
-            v-model="setQuery.validDay"
-            onkeyup="this.value=this.value.replace(/\D/g,'')"
-            onafterpaste="this.value=this.value.replace(/\D/g,'')"
-            class="item-width-100"
-          ></el-input>
+          <el-input v-model="setQuery.validDay" onkeyup="this.value=this.value.replace(/\D/g,'')"
+            onafterpaste="this.value=this.value.replace(/\D/g,'')" class="item-width-100"></el-input>
         </el-form-item>
         <el-form-item label="会员套餐:" prop="selectType">
-          <el-select
-            v-model="setQuery.selectType"
-            @change="selectChange"
-            placeholder="请选择套餐"
-          >
-            <el-option
-              v-for="(item, index) in optionsList"
-              :key="item.value"
-              :label="item.setMealName"
-              :value="{ value: item.setMealCode, label: item.setMealName }"
-            ></el-option>
+          <el-select v-model="setQuery.selectType" @change="selectChange" placeholder="请选择套餐">
+            <el-option v-for="(item, index) in optionsList" :key="item.value" :label="item.setMealName"
+              :value="{ value: item.setMealCode, label: item.setMealName }"></el-option>
           </el-select>
         </el-form-item>
         <el-form-item label="会员有效期:" prop="activationType">
           <el-radio-group v-model="setQuery.activationType">
-            <el-radio
-              v-for="item in radioOptions"
-              :key="item.value"
-              :value="item.value"
-              :label="item.label"
-            ></el-radio>
+            <el-radio v-for="item in radioOptions" :key="item.value" :value="item.value" :label="item.label"></el-radio>
           </el-radio-group>
           <div v-if="setQuery.activationType == '时间段'">
             <el-form-item prop="startTime">
-              <el-date-picker
-                v-model="date"
-                type="daterange"
-                range-separator="至"
-                start-placeholder="开始日期"
-                end-placeholder="结束日期"
-              >
+              <el-date-picker v-model="date" type="daterange" range-separator="至" start-placeholder="开始日期"
+                end-placeholder="结束日期">
               </el-date-picker>
             </el-form-item>
           </div>
           <div v-if="setQuery.activationType == '天数'">
             <el-form-item prop="activationDay">
-              <el-input
-                v-model="setQuery.activationDay"
-                onkeyup="this.value=this.value.replace(/\D/g,'')"
-                onafterpaste="this.value=this.value.replace(/\D/g,'')"
-                class="item-width-100"
-              ></el-input>
+              <el-input v-model="setQuery.activationDay" onkeyup="this.value=this.value.replace(/\D/g,'')"
+                onafterpaste="this.value=this.value.replace(/\D/g,'')" class="item-width-100"></el-input>
             </el-form-item>
           </div>
         </el-form-item>
-        <div
-          style="
+        <div style="
             color: red;
             font-size: 12px;
             line-height: 16px;
             margin-left: 40px;
-          "
-        >
+          ">
           注:会员有效期为用户使用激活码后会员生效时间。时间段为用户使用激活码后仅在对应时间段内拥有会员权益;天数为用户使用激活码后对应天数内拥有会员权益。时间段激活码无法叠加使用,天数激活码可叠加使用累计天数。
         </div>
         <el-form-item label="激活码数量:">
-          <el-input
-            v-model="setQuery.totalTicket"
-            onkeyup="this.value=this.value.replace(/\D/g,'')"
-            onafterpaste="this.value=this.value.replace(/\D/g,'')"
-            class="item-width-100"
-            @blur="totalTicketChange"
-          ></el-input>
-          <span style="color: red; font-size: 12px; margin-left: 10px"
-            >注:默认为订购数量,激活码数量必须大于订购数量,输入数字须为整数</span
-          >
+          <el-input v-model="setQuery.totalTicket" onkeyup="this.value=this.value.replace(/\D/g,'')"
+            onafterpaste="this.value=this.value.replace(/\D/g,'')" class="item-width-100"
+            @blur="totalTicketChange"></el-input>
+          <span style="color: red; font-size: 12px; margin-left: 10px">注:默认为订购数量,激活码数量必须大于订购数量,输入数字须为整数</span>
         </el-form-item>
         <el-form-item label="激活码开头:" prop="startString">
-          <el-input
-            v-model="setQuery.startString"
-            class="item-width-100"
-            maxlength="6"
-          ></el-input>
-          <span style="color: red; font-size: 12px; margin-left: 10px"
-            >注:只能输入大小写英文和数字,最长单位为6位,创建激活码时放在激活码开头</span
-          >
+          <el-input v-model="setQuery.startString" class="item-width-100" maxlength="6"></el-input>
+          <span style="color: red; font-size: 12px; margin-left: 10px">注:只能输入大小写英文和数字,最长单位为6位,创建激活码时放在激活码开头</span>
         </el-form-item>
       </el-form>
       <span slot="footer" class="dialog-footer">
         <el-button @click="activationCancel('setQuery')">取 消</el-button>
-        <el-button
-          type="primary"
-          :loading="updataLoading"
-          @click="vipsubmitForm('setQuery')"
-          >生成</el-button
-        >
+        <el-button type="primary" :loading="updataLoading" @click="vipsubmitForm('setQuery')">生成</el-button>
       </span>
     </el-dialog>
   </div>
 </template>
 
 <script>
-import { debounce } from "@/utils/index";
 import { getGroupList, generateCode, getList } from "@/api/common";
 import { timeFormat } from "@/utils/index";
-
+import FileSaver from 'file-saver';
+import XLSX from 'xlsx';
 export default {
   name: "orderManage",
   data() {
     return {
+      downloadLoading: false,
+      totalTicketNumber: '',
       date: "",
       updataLoading: false,
       codeData: {},
@@ -457,7 +286,7 @@ export default {
           },
         ],
         startString: [
-          { required: true,pattern:/^[a-z0-9A-Z]+$/, message: "请正确输入激活码开头", trigger: "blur" },
+          { required: true, pattern: /^[a-z0-9A-Z]+$/, message: "请正确输入激活码开头", trigger: "blur" },
         ],
       },
       vipDialogVisible: false,
@@ -506,6 +335,7 @@ export default {
       this.codeData = item;
       this.setQuery.groupOrderNo = item.orderNo;
       this.setQuery.totalTicket = Math.floor(item.orderNum);
+      this.totalTicketNumber = Math.floor(item.orderNum);
     },
 
     // 套餐选择
@@ -519,7 +349,7 @@ export default {
     totalTicketChange() {
       if (Math.trunc(this.codeData.orderNum) > this.setQuery.totalTicket) {
         this.$message.error("激活码数量必须大于订购数量");
-        this.setQuery.totalTicket = "";
+        this.setQuery.totalTicket = this.totalTicketNumber;
         return;
       }
     },
@@ -579,6 +409,67 @@ export default {
       });
     },
 
+    // 导出
+    exportAllExcel() {
+      this.downloadLoading=true
+      const allData = [];
+      let query = JSON.parse(JSON.stringify(this.query))
+      query.size = this.total
+      query.page=0
+      getGroupList(query).then(res => {
+        this.downloadLoading=false
+        if(res.state == "Success"){
+          allData.push(...res.content.content);
+          this.exportExcel(allData);
+        }
+      });
+    },
+
+    // 导出数据处理
+    exportExcel(r) {
+      const data = r.map((item) => {
+        let status = "";
+        let orderStatus = "";
+        if (item.groupType == 1) {
+          status = "已生成"
+        } else if (item.groupType == 2) {
+          status = "未生成"
+        } else {
+          status = "全部激活"
+        }
+        if (item.action == 1) {
+          orderStatus = '订购'
+        } else if (item.action == 2) {
+          orderStatus = '退订'
+        } else if (item.action == 3) {
+          orderStatus = '激活'
+        } else {
+          orderStatus = '暂停'
+        }
+        return {
+          "计费号": item.billId,
+          "集团名称": item.groupName,
+          "订单号": item.orderNo,
+          "订购产品策划名称": item.groupPlanName,
+          "订购产品单价(元)": item.orderPrice,
+          "订购数量": item.orderNum,
+          "订购时间": item.orderDate,
+          "失效时间": item.invalidDate,
+          "和校园推送时间": timeFormat(item.createTime),
+          "状态": status,
+          "未激活数量": item.totalTicket - item.useTicket,
+          "已激活数量": item.useTicket,
+          "所属小程序": '慧研学惠生活',
+          "订单状态": orderStatus,
+        }
+      })
+      const worksheet = XLSX.utils.json_to_sheet(data);
+      const workbook = { Sheets: { data: worksheet }, SheetNames: ['data'] };
+      const excelBuffer = XLSX.write(workbook, { bookType: 'xlsx', type: 'array' });
+      const blob = new Blob([excelBuffer], { type: 'application/octet-stream' });
+      FileSaver.saveAs(blob, '集团列表.xlsx');
+    },
+
     handleSearch() {
       this.query.page = 1;
       this.getList();

+ 1 - 2
src/views/operationManage/equitiesManage/addEquities.vue

@@ -90,7 +90,7 @@
                   :maxlength="10"
                   class="item-width-300"
               >
-                <template slot="append">次</template>
+                <template slot="append">次/月</template>
               </el-input>
           </el-form-item>
           
@@ -446,7 +446,6 @@ export default {
       setQuery: {
         claimType: 1,
         claimNum:1,
-        givenNum:1,
         getFlag:1,
         "setMealCode":'',
         "bindContent": "",