소스 검색

激活码开通套餐版本 -zzx

zouzexu 6 달 전
부모
커밋
8dfed96f8e
7개의 변경된 파일948개의 추가작업 그리고 1개의 파일을 삭제
  1. BIN
      dist.zip
  2. 0 1
      package.json
  3. 45 0
      src/api/common.js
  4. 22 0
      src/router/index.js
  5. 1 0
      src/utils/request.js
  6. 358 0
      src/views/operationManage/comboManage/checkoutCode.vue
  7. 522 0
      src/views/operationManage/comboManage/vipActivation.vue

BIN
dist.zip


+ 0 - 1
package.json

@@ -33,7 +33,6 @@
     "vue-router": "3.0.6",
     "vuex": "3.1.0",
     "xlsx": "^0.16.0"
-
   },
   "devDependencies": {
     "@vue/cli-plugin-babel": "4.4.4",

+ 45 - 0
src/api/common.js

@@ -11,6 +11,51 @@
 
 import request from '@/utils/request'
 
+// 同步推送状态
+export function syncNotified(params) {
+  return request({
+    url: '/vipserver/group/notified',
+    method: 'post',
+    params
+  })
+}
+
+// 后台激活指定账号
+export function labourActivation(params) {
+  return request({
+    url: '/vipserver/group/activation',
+    method: 'post',
+    params
+  })
+}
+
+// 查看激活码列表
+export function checkoutActivationCode(data) {
+  return request({
+    url: '/vipserver/group/activationList',
+    method: 'post',
+    data
+  })
+}
+
+// 生成激活码
+export function generateCode(data) {
+  return request({
+    url: '/vipserver/group/createTicket',
+    method: 'post',
+    data
+  })
+}
+
+// 获取集团列表
+export function getGroupList(data) {
+  return request({
+    url: '/vipserver/group/groupList',
+    method: 'post',
+    data
+  })
+}
+
 // 获取套餐字典
 export function getSetMealNameAndId(params) {
   return request({

+ 22 - 0
src/router/index.js

@@ -573,6 +573,16 @@ export let constantRoutes = [{
               icon: ''
             },
           },
+          {
+            id: 1,
+            path: '/operationManage/comboManage/vipActivation',
+            name: '/operationManage/comboManage/vipActivation',
+            component: () => import('@/views/operationManage/comboManage/vipActivation.vue'),
+            meta: {
+              title: '会员激活码',
+              icon: ''
+            },
+          },
           // {
           //   id: 1,
           //   path: '/operationManage/comboManage/addCombo',
@@ -619,6 +629,18 @@ export let constantRoutes = [{
 
             },
           },
+          {
+            id: 1,
+            path: '/operationManage/comboManage/checkoutCode',
+            name: '/operationManage/comboManage/checkoutCode',
+            component: () => import('@/views/operationManage/comboManage/checkoutCode.vue'),
+            hidden:true,
+            meta: {
+              title: '查看激活码',
+              icon: '',
+              activeMenu: '/operationManage/comboManage/vipActivation'
+            },
+          },
         ]
       },
       

+ 1 - 0
src/utils/request.js

@@ -33,6 +33,7 @@ service.interceptors.request.use(
       // ['X-Token'] is a custom headers key
       // please modify it according to the actual situation
       config.headers['Accesstoken'] = getToken()
+      config.headers['code']='520100,5201000,p-0001' //慧研学520100 中数5201000 贵大p-0001
       config.headers['epid'] = localStorage.getItem('epid')
       // config.headers['Content-Type'] = 'application/x-www-form-urlencoded'
     // }

+ 358 - 0
src/views/operationManage/comboManage/checkoutCode.vue

@@ -0,0 +1,358 @@
+<template>
+  <div class="orderManage app-container">
+    <div class="search">
+      <div>
+        <el-input v-model="query.id" size="small" placeholder="请输入完整激活ID" class="item-width-200"></el-input>
+        <el-input v-model="query.serialNumber" size="small" placeholder="请输入激活码" class="item-width-200 ml10"></el-input>
+        <el-input v-model="query.phone" size="small" placeholder="请输入激活手机号" class="item-width-200 ml10"></el-input>
+        <el-date-picker v-model="date" size="small" value-format="yyyy-MM-dd" class="item-width-350 ml10"
+          type="datetimerange" range-separator="至" start-placeholder="开始日期" end-placeholder="结束日期">
+        </el-date-picker>
+        <el-select v-model="query.state" size="small" clearable class="item-width-200 ml10" placeholder="请选择状态">
+          <el-option label="待使用" value="1"></el-option>
+          <el-option label="激活成功" value="2"></el-option>
+        </el-select>
+        <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">
+        返回
+      </el-button>
+    </div>
+    <el-descriptions class="margin-top" :column="3" border>
+      <el-descriptions-item>
+        <template slot="label"> 计费号 </template>
+        {{ groupInfos.billId || '--' }}
+      </el-descriptions-item>
+      <el-descriptions-item>
+        <template slot="label"> 集团名称 </template>
+        {{ groupInfos.groupName || '--' }}
+      </el-descriptions-item>
+      <el-descriptions-item>
+        <template slot="label"> 订购数量 </template>
+        {{ groupInfos.orderNum || '--' }}
+      </el-descriptions-item>
+      <el-descriptions-item>
+        <template slot="label"> 所属平台 </template>
+        慧研学惠生活
+      </el-descriptions-item>
+      <el-descriptions-item>
+        <template slot="label"> 订购产品策划名称 </template>
+        {{ groupInfos.groupPlanName || '--' }}
+      </el-descriptions-item>
+      <el-descriptions-item>
+        <template slot="label"> 激活码数量 </template>
+        {{ groupInfos.totalTicket || '--' }}
+      </el-descriptions-item>
+      <el-descriptions-item>
+        <template slot="label"> 已使用数量 </template>
+        {{ groupInfos.useTicket || '--' }}
+      </el-descriptions-item>
+      <el-descriptions-item>
+        <template slot="label"> 未使用数量 </template>
+        {{ groupInfos.totalTicket - groupInfos.useTicket || '--' }}
+      </el-descriptions-item>
+      <el-descriptions-item>
+        <template slot="label"> 激活失败 </template>
+        {{ '--' }}
+      </el-descriptions-item>
+    </el-descriptions>
+    <div style="height: 20px;"></div>
+    <el-table :data="tableData" tooltip-effect="dark" border v-loading="loading" style="width: 100%">
+      <el-table-column align="center" label="激活ID" prop="id" show-overflow-tooltip>
+      </el-table-column>
+      <el-table-column prop="serialNumber" align="center" label="激活码" show-overflow-tooltip>
+      </el-table-column>
+      <el-table-column prop="planningName" align="center" label="会员套餐" show-overflow-tooltip>
+      </el-table-column>
+      <el-table-column prop="goodsAmount" align="center" label="有效期类型" show-overflow-tooltip>
+        <template slot-scope="scope">
+          <span v-if="scope.row.activationType == 1">时间段</span>
+          <span v-else>天数</span>
+        </template>
+      </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-else>
+            {{ scope.row.activationDay+'天' }}
+          </span>
+        </template>
+      </el-table-column>
+      <el-table-column prop="startTime" align="center" label="创建时间" show-overflow-tooltip>
+        <template slot-scope="scope">
+          {{ timeFormat(scope.row.createTime) }}
+        </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-else>激活成功</span>
+        </template>
+      </el-table-column>
+      <el-table-column align="center" label="推送状态" show-overflow-tooltipphone>
+        <template slot-scope="scope">
+          <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 || '--' }}
+        </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-else>{{ timeFormat(scope.row.useTime) }}</span>
+        </template>
+      </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.phone == null"
+            @click="activationVip(scope.row)">激活</el-button>
+          <el-button type="text" size="small" v-else @click="synchronization(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>
+    </div>
+    <el-dialog title="激活" :visible.sync="vipDialogVisible" width="30%" center>
+      <div style="margin-left: 32px;margin-bottom: 30px;font-weight: 600;">激活码:{{ vipCode }}</div>
+      <el-form :model="updataPhone" ref="updataPhone" :rules="rules" label-width="130px" size="small">
+        <el-form-item label="激活手机号:" prop="num">
+          <el-input v-model="updataPhone.num" class="item-width-200" placeholder="请输入激活手机号"></el-input>
+        </el-form-item>
+      </el-form>
+      <span slot="footer" class="dialog-footer">
+        <el-button @click="Cancel">取 消</el-button>
+        <el-button type="primary" :loading="updataLoading" @click="confirmActivation('updataPhone')">确 定</el-button>
+      </span>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+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: '',
+      groupInfos: {},
+      updataPhone: {
+        num: '',
+      },
+      rules: {
+        num: [
+          { required: true, pattern: /^1(3[0-9]|4[01456879]|5[0-35-9]|6[2567]|7[0-8]|8[0-9]|9[0-35-9])\d{8}$/, message: "请正确输入手机号", trigger: "blur" },
+        ],
+      },
+      vipDialogVisible: false,
+
+      tableData: [],
+      loading: false,
+      query: {
+        id: '',
+        phone: "",
+        serialNumber: "",
+        groupOrderNo: '',
+        startTime: "",
+        endTime: "",
+        state: '',
+        page: 1,
+        size: 10,
+      },
+      title: "",
+      total: 0,
+    };
+  },
+  watch: {
+    date(val) {
+      if (val) {
+        this.query.startTime = Date.parse(val[0]);
+        this.query.endTime = Date.parse(val[1]);
+      } else {
+        this.query.startTime = "";
+        this.query.endTime = "";
+      }
+    },
+  },
+  filters: {
+
+  },
+  methods: {
+    // 同步和校园推送状态
+    synchronization(item) {
+      syncNotified({ ticketId: item.id }).then((res) => {
+        if (res.state == "Success") {
+          this.getList()
+        }
+      })
+    },
+
+    Cancel() {
+      this.vipDialogVisible = false;
+      this.updataPhone.num = ''
+    },
+    // 确认激活
+    confirmActivation(formName) {
+      this.$refs[formName].validate((valid) => {
+        let updata = {
+          phone: this.updataPhone.num,
+          serialNumber: this.vipCode
+        }
+        if (valid) {
+          this.updataLoading = true;
+          labourActivation({ ...updata }).then((res) => {
+            this.updataLoading = false
+            if (res.state == "Success") {
+              this.vipDialogVisible = false
+              this.updataPhone.num = ''
+              this.getList()
+            } else {
+            }
+          })
+        } else {
+          return false;
+        }
+      });
+    },
+
+    // 激活弹窗
+    activationVip(item) {
+      this.vipDialogVisible = true
+      this.vipCode = item.serialNumber
+    },
+
+    // 返回上一级
+    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();
+    },
+    timeFormat(val) {
+      return timeFormat(val);
+    },
+    handleSizeChange(val) {
+      this.query.page = 1;
+      this.query.size = val;
+      this.getList();
+    },
+    handleCurrentChange(val) {
+      this.query.page = val;
+      this.getList();
+    },
+
+    search() {
+      this.query.page = 1;
+      this.getList();
+    },
+    getList() {
+      this.loading = true;
+      this.groupInfos = JSON.parse(this.$route.query.groupInfo)
+      this.query.groupOrderNo = this.groupInfos.orderNo;
+      let obj = JSON.parse(JSON.stringify(this.query));
+      obj.page = obj.page - 1;
+      if (!obj.orderType) {
+        delete obj.orderType;
+      }
+      checkoutActivationCode(obj).then((res) => {
+        this.loading = false;
+        if (res.state == "Success") {
+          this.tableData = res.content.content;
+          this.total = res.content.totalElements;
+        }
+      });
+    },
+  },
+  created() {
+    this.getList();
+  },
+};
+</script>
+
+<style lang="scss"></style>

+ 522 - 0
src/views/operationManage/comboManage/vipActivation.vue

@@ -0,0 +1,522 @@
+<template>
+  <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-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-option>
+        </el-select>
+        <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-column>
+      <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>
+      <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>
+      <el-table-column prop="invalidDate" align="center" label="失效时间" show-overflow-tooltip>
+      </el-table-column>
+      <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>
+        <template slot-scope="scope">
+          <span v-if="scope.row.groupType === 1">已生成</span>
+          <span v-if="scope.row.groupType === 2">待生成</span>
+          <span v-if="scope.row.groupType == 3">全部激活</span>
+        </template>
+      </el-table-column>
+      <el-table-column align="center" label="未激活数量" show-overflow-tooltip>
+        <template slot-scope="scope">
+          {{ scope.row.totalTicket - scope.row.useTicket || "--" }}
+        </template>
+      </el-table-column>
+      <el-table-column align="center" label="已激活数量" show-overflow-tooltip>
+        <template slot-scope="scope">
+          {{ scope.row.useTicket || "--" }}
+        </template>
+      </el-table-column>
+      <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>
+        <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>
+          <el-tag type="info" v-else-if="scope.row.action === 3">激活</el-tag>
+          <el-tag type="warning" v-else>暂停</el-tag>
+        </template>
+      </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"
+            @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>
+    </div>
+    <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>
+          {{ codeData.billId || "--" }}
+        </el-descriptions-item>
+        <el-descriptions-item>
+          <template slot="label"> 集团名称 </template>
+          {{ codeData.groupName || "--" }}
+        </el-descriptions-item>
+        <el-descriptions-item>
+          <template slot="label"> 订购时间 </template>
+          {{ codeData.orderDate || "--" }}
+        </el-descriptions-item>
+        <el-descriptions-item>
+          <template slot="label"> 失效时间 </template>
+          {{ codeData.invalidDate || "--" }}
+        </el-descriptions-item>
+        <el-descriptions-item>
+          <template slot="label"> 订购数量 </template>
+          {{ codeData.orderNum || "--" }}
+        </el-descriptions-item>
+        <el-descriptions-item>
+          <template slot="label"> 所属平台 </template>
+          慧研学惠生活
+        </el-descriptions-item>
+      </el-descriptions>
+      <div class="codeInfo">激活码信息</div>
+      <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-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>
+        </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-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>
+            </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-form-item>
+          </div>
+        </el-form-item>
+        <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-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-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>
+      </span>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+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: {},
+      optionsList: [],
+      radioOptions: [
+        {
+          value: 1,
+          label: "时间段",
+        },
+        {
+          value: 2,
+          label: "天数",
+        },
+      ],
+      orderStatusoptions: [
+        {
+          value: 1,
+          label: "订购",
+        },
+        {
+          value: 2,
+          label: "退订",
+        },
+        {
+          value: 3,
+          label: "激活",
+        },
+        {
+          value: 4,
+          label: "暂停",
+        },
+      ],
+      statusOptions: [
+        {
+          value: 1,
+          label: "已生成",
+        },
+        {
+          value: 2,
+          label: "待生成",
+        },
+        {
+          value: 3,
+          label: "全部激活",
+        },
+      ],
+      setQuery: {
+        validDay: "",
+        activationType: "",
+        activationDay: "",
+        totalTicket: "",
+        planningName: "",
+        planningId: "",
+        groupOrderNo: "",
+        startString: "",
+        startTime: "",
+        endTime: "",
+        selectType: "",
+      },
+      rules: {
+        validDay: [
+          {
+            required: true,
+            message: "请输入激活码有效期且必须为整数",
+            trigger: "blur",
+          },
+        ],
+        selectType: [
+          { required: true, message: "请选择会员套餐", trigger: "change" },
+        ],
+        activationType: [
+          {
+            required: true,
+            message: "请选择有效期(天数必须为整数)",
+            trigger: "change",
+          },
+        ],
+        endTime: [
+          {
+            required: true,
+            message: "请至少选择一个有效期类型",
+            trigger: "change",
+          },
+        ],
+        activationDay: [
+          {
+            required: true,
+            message: "请输入天数",
+            trigger: "blur",
+          },
+        ],
+        startTime: [
+          {
+            required: true,
+            message: "请选择会员有效期",
+            trigger: "change",
+          },
+        ],
+        startString: [
+          { required: true, pattern: /^[a-z0-9A-Z]+$/, message: "请正确输入激活码开头", trigger: "blur" },
+        ],
+      },
+      vipDialogVisible: false,
+
+      tableData: [],
+      loading: false,
+      query: {
+        billId: "",
+        groupName: "",
+        orderNo: "",
+        groupType: "",
+        actionID: "",
+        page: 1,
+        size: 10,
+      },
+      title: "",
+      total: 0,
+    };
+  },
+  watch: {
+    date(val) {
+      if (val) {
+        this.setQuery.startTime = new Date(val[0]).getTime();
+        this.setQuery.endTime = new Date(val[1]).getTime();
+      } else {
+        this.setQuery.startTime = "";
+        this.setQuery.endTime = "";
+      }
+    },
+  },
+  filters: {},
+  methods: {
+    // 重置表单
+    activationCancel() {
+      this.$refs["setQuery"].resetFields();
+      this.vipDialogVisible = false;
+    },
+    closeVipDialog(done) {
+      this.$refs["setQuery"].resetFields();
+      done();
+    },
+    //  生成弹窗
+    gotoGenerating(item) {
+      this.get_setmealList();
+      this.vipDialogVisible = true;
+      this.codeData = item;
+      this.setQuery.groupOrderNo = item.orderNo;
+      this.setQuery.totalTicket = Math.floor(item.orderNum);
+      this.totalTicketNumber = Math.floor(item.orderNum);
+    },
+
+    // 套餐选择
+    selectChange(item) {
+      const { value, label } = item;
+      this.setQuery.planningId = value;
+      this.setQuery.planningName = label;
+    },
+
+    // 判断激活套餐是否大于于订购数量
+    totalTicketChange() {
+      if (Math.trunc(this.codeData.orderNum) > this.setQuery.totalTicket) {
+        this.$message.error("激活码数量必须大于订购数量");
+        this.setQuery.totalTicket = this.totalTicketNumber;
+        return;
+      }
+    },
+
+    // 提交生成逻辑处理
+    vipsubmitForm(formName) {
+      this.$refs[formName].validate((valid) => {
+        if (valid) {
+          delete this.setQuery.selectType;
+          this.updataLoading = true;
+          if (this.setQuery.activationType == "时间段") {
+            this.setQuery.activationType = 1;
+          } else {
+            this.setQuery.activationType = 2;
+          }
+          this.submit_generateCode();
+        } else {
+          return false;
+        }
+      });
+    },
+
+    // 提交接口调用
+    submit_generateCode() {
+      generateCode(this.setQuery).then((res) => {
+        this.updataLoading = false;
+        if (res.state == "Success") {
+          this.vipDialogVisible = false;
+          this.getList();
+          this.setQuery.validDay = "";
+          this.setQuery.activationType = "";
+          this.date = "";
+          this.setQuery.totalTicket = "";
+          setQuery.startString = "";
+        }
+      });
+    },
+
+    // 查看激活码
+    codeDetails(item) {
+      this.$router.push({
+        path: "/operationManage/comboManage/checkoutCode",
+        query: {
+          groupInfo: JSON.stringify(item),
+        },
+      });
+    },
+
+    // 套餐列表
+    get_setmealList() {
+      this.loading = true;
+      getList().then((res) => {
+        this.loading = false;
+        if (res.state == "Success") {
+          this.optionsList = res.content.records;
+        }
+      });
+    },
+
+    // 导出
+    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();
+    },
+    timeFormat(val) {
+      return timeFormat(val);
+    },
+    handleSizeChange(val) {
+      this.query.page = 1;
+      this.query.size = val;
+      this.getList();
+    },
+    handleCurrentChange(val) {
+      this.query.page = val;
+      this.getList();
+    },
+
+    search() {
+      this.query.page = 1;
+      this.getList();
+    },
+    getList() {
+      this.loading = true;
+      let obj = JSON.parse(JSON.stringify(this.query));
+      obj.page = obj.page - 1;
+      // getOrderList
+      getGroupList(obj).then((res) => {
+        this.loading = false;
+        if (res.state == "Success") {
+          this.tableData = res.content.content;
+          this.total = res.content.totalElements;
+        }
+      });
+    },
+  },
+  created() {
+    this.getList();
+  },
+};
+</script>
+
+<style lang="scss">
+.codeInfo {
+  height: 50px;
+  line-height: 50px;
+  font-weight: 800;
+  font-size: 16px;
+  color: #000;
+}
+</style>