Browse Source

5.30提交

chen 2 years ago
parent
commit
cbb162f8e5

+ 133 - 0
admin/src/common/filter.js

@@ -0,0 +1,133 @@
+/**
+ * 手机号格式化
+ * @param {String} phone
+ */
+const formatPhone = (phone) => {
+  phone = phone.toString()
+  return phone.substr(0, 3) + '****' + phone.substr(7, 11)
+}
+
+/**
+ * 4位一空格(格式化银行卡)
+ * @param {String} val
+ */
+const formatBank = (val) => {
+  if (val) {
+    return val.toString().replace(/\s/g, '').replace(/(.{4})/g, '$1 ')
+  }
+}
+
+/**
+ * 千分位格式化
+ * @param {数字} val
+ */
+const toThousands = (val) => {
+  let num = (val || 0).toString()
+  let result = ''
+  while (num.length > 3) {
+    result = ',' + num.slice(-3) + result
+    num = num.slice(0, num.length - 3)
+  }
+  if (num) {
+    result = num + result
+  }
+  return result
+}
+
+/**
+ * 格式化小数位
+ * @param val 传入的值
+ * @param pos 保留的小数位
+ * @returns {*}
+ */
+const formatFloat = (val, pos = 2) => {
+  let f = parseFloat(val)
+  if (isNaN(f)) {
+    return false
+  }
+  f = Math.round(val * Math.pow(10, pos)) / Math.pow(10, pos) // pow 幂
+  let s = f.toString()
+  let rs = s.indexOf('.')
+  if (rs < 0) {
+    rs = s.length
+    s += '.'
+  }
+  while (s.length <= rs + pos) {
+    s += '0'
+  }
+  return s
+}
+
+/**
+ * 格式化时长
+ * @param second
+ * @returns {string}
+ */
+const realFormatSecond = (second) => {
+  const secondType = typeof second
+  if (secondType === 'number' || secondType === 'string') {
+    second = parseInt(second)
+
+    const hours = Math.floor(second / 3600)
+    second = second - hours * 3600
+    const mimute = Math.floor(second / 60)
+    second = second - mimute * 60
+
+    return hours + ':' + ('0' + mimute).slice(-2) + ':' + ('0' + second).slice(-2)
+  } else {
+    return '0:00:00'
+  }
+}
+
+const formatDate = (date, fmt) => {
+  if (/(y+)/.test(fmt)) {
+    fmt = fmt.replace(RegExp.$1, (date.getFullYear() + '').substr(4 - RegExp.$1.length))
+  }
+  const o = {
+    'M+': date.getMonth() + 1,
+    'd+': date.getDate(),
+    'h+': date.getHours(),
+    'm+': date.getMinutes(),
+    's+': date.getSeconds()
+  }
+  for (const k in o) {
+    if (new RegExp(`(${k})`).test(fmt)) {
+      const str = o[k] + ''
+      fmt = fmt.replace(RegExp.$1, RegExp.$1.length === 1 ? str : padLeftZero(str))
+    }
+  }
+  return fmt
+}
+function padLeftZero(str) {
+  return ('00' + str).substr(str.length)
+}
+
+function unixTimeToDateTime(unixtime) {
+  var date = new Date(unixtime) // 时间戳为10位需*1000,时间戳为13位的话不需乘1000
+  var Y = date.getFullYear() + '-'
+  var M = (date.getMonth() + 1 < 10 ? '0' + (date.getMonth() + 1) : date.getMonth() + 1) + '-'
+  var D = date.getDate()
+  return Y + M + D
+}
+
+function frDateTime(unixtime) {
+  var date = unixtime // 时间戳为10位需*1000,时间戳为13位的话不需乘1000
+  var Y = date.getFullYear() + '-'
+  var M = (date.getMonth() + 1 < 10 ? '0' + (date.getMonth() + 1) : date.getMonth() + 1) + '-'
+  var D = date.getDate() + ' '
+  var h = (date.getHours() < 10 ? '0' + (date.getHours()) : date.getHours()) + ':'
+  var m = (date.getMinutes() < 10 ? '0' + (date.getMinutes()) : date.getMinutes()) + ':'
+  var s = (date.getSeconds() < 10 ? '0' + (date.getSeconds()) : date.getSeconds())
+  return Y + M + D + h + m + s
+}
+
+export default {
+  formatPhone,
+  formatBank,
+  toThousands,
+  formatFloat,
+  realFormatSecond,
+  formatDate,
+  unixTimeToDateTime,
+  frDateTime
+}

+ 282 - 0
admin/src/views/dataPage/feedback/index.vue

@@ -0,0 +1,282 @@
+<template>
+  <div>
+    <el-container>
+      <!--搜索-->
+      <el-header class="searchBox">
+        <el-form :inline="true" :model="searchForm" class="demo-form-inline">
+          <!--                    <el-form-item label="手机号">-->
+          <!--                        <el-input v-model="searchForm.phone" placeholder="手机号"/>-->
+          <!--                    </el-form-item>-->
+          <el-form-item label="产品名称">
+            <el-select
+              v-model="searchForm.spid"
+              filterable
+              clearable
+              placeholder="请选择"
+            >
+              <el-option
+                v-for="item in prductLIst"
+                :key="item.spid"
+                :label="`${item.productName}/${item.spid}`"
+                :value="item.spid"
+              />
+            </el-select>
+          </el-form-item>
+          <el-form-item label="时间范围">
+            <el-date-picker
+              v-model="value2"
+              type="datetimerange"
+              :picker-options="pickerOptions"
+              range-separator="至"
+              start-placeholder="开始日期"
+              end-placeholder="结束日期"
+              align="right"
+              @change="dateChange"
+            />
+          </el-form-item>
+          <el-form-item>
+            <el-button type="primary" @click="searchBtn">查询</el-button>
+            <el-button @click="reset">重置</el-button>
+            <el-button type="warning" @click="download">导出</el-button>
+          </el-form-item>
+        </el-form>
+      </el-header>
+
+      <!--表格-->
+      <el-main class="tableBox">
+        <el-table :data="tableData" stripe style="width: 100%">
+          <el-table-column prop="phone" label="手机号" width="120" />
+          <el-table-column prop="content" label="反馈内容" />
+          <el-table-column prop="productName" label="产品名称" />
+          <el-table-column prop="channelName" label="渠道名称" />
+          <el-table-column prop="orderTime" label="订购时间" width="160" />
+          <el-table-column prop="createTime" label="反馈时间" width="160" />
+        </el-table>
+        <div class="block">
+          <el-pagination
+            :current-page.sync="searchForm['pageNum']"
+            :page-sizes="[20, 50, 100, 300]"
+            :page-size="searchForm['pageSize']"
+            layout="total, sizes, pager"
+            :total="total"
+            @size-change="handleSizeChange"
+            @current-change="handleCurrentChange"
+          />
+        </div>
+      </el-main>
+    </el-container>
+  </div>
+</template>
+
+<script>
+import { get, post } from "@/api/common";
+import filter from "@/common/filter";
+import axios from "axios";
+import { getToken } from "../../../utils/auth";
+
+export default {
+  name: "RunData",
+  data() {
+    return {
+      searchForm: {
+        spid: "",
+        pageSize: 20,
+        pageNum: 1,
+      },
+      value2: "",
+      tableData: [],
+      total: 5000,
+      prductLIst: {},
+      pickerOptions: {
+        shortcuts: [
+          {
+            text: "最近一周",
+            onClick(picker) {
+              const end = new Date();
+              const start = new Date();
+              start.setTime(start.getTime() - 3600 * 1000 * 24 * 7);
+              picker.$emit("pick", [start, end]);
+            },
+          },
+          {
+            text: "最近一个月",
+            onClick(picker) {
+              const end = new Date();
+              const start = new Date();
+              start.setTime(start.getTime() - 3600 * 1000 * 24 * 30);
+              picker.$emit("pick", [start, end]);
+            },
+          },
+          {
+            text: "最近三个月",
+            onClick(picker) {
+              const end = new Date();
+              const start = new Date();
+              start.setTime(start.getTime() - 3600 * 1000 * 24 * 90);
+              picker.$emit("pick", [start, end]);
+            },
+          },
+        ],
+      },
+    };
+  },
+  created() {
+    var that = this;
+    get("/productInfo/list", { parentId: 0, pageSize: 9999, pageNum: 1 }).then(
+      (res) => {
+        this.prductLIst = res.data.list;
+      }
+    );
+    that.search();
+  },
+  methods: {
+    async search() {
+      // 同步搜索
+      // console.log(this.searchForm);
+      await get("/feedbackRecord/page", this.searchForm)
+        .then((res) => {
+          this.tableData = res.data.list;
+          this.total = res.data.total;
+        })
+        .catch((err) => {
+          console.log(err);
+        });
+    },
+    searchBtn() {
+      // 搜索按钮
+      this.search();
+    },
+    reset() {
+      // 重置
+      this.searchForm = {
+        phone: "",
+        pageSize: 20,
+        pageNum: 1,
+      };
+      this.search();
+    },
+    download() {
+      if (this.value2 === "") {
+        let date = new Date();
+        let y = date.getFullYear() - 1;
+        let m = date.getMonth() + 1;
+        let mm = m > 0 ? m : "0" + m;
+        let d = date.getDate() + 2;
+        let dd = d > 0 ? d : "0" + d;
+        let h = date.getHours();
+        let M = date.getMinutes();
+        let s = date.getSeconds();
+        this.searchForm.beginTime = `${y}-${mm}-${dd} ${h}:${M}:${s}`;
+        this.searchForm.endTime = filter.frDateTime(new Date());
+      }
+      let formData = new FormData();
+      formData.append("beginTime", this.searchForm.beginTime);
+      formData.append("endTime", this.searchForm.endTime);
+      if (this.searchForm.spid) {
+        formData.append("spid", this.searchForm.spid);
+      }
+      let loading = this.$loading({
+        lock: true,
+        text: "下载量较大,请耐心等待",
+        spinner: "el-icon-loading",
+        background: "rgba(0, 0, 0, 0.7)",
+      });
+      axios({
+        method: "post",
+        url: process.env.VUE_APP_BASE_API + "/feedbackRecord/download",
+        data: formData,
+        responseType: "blob",
+        headers: {
+          "Content-Type": "multipart/form-data",
+          token: getToken(),
+        },
+      }).then((res) => {
+        if (res.data) {
+          loading.close();
+          let a = document.createElement("a");
+          let blob = new Blob([res.data], {
+            type: "application/vnd.ms-excel",
+          });
+          let objectUrl = URL.createObjectURL(blob);
+          a.setAttribute("href", objectUrl);
+          a.setAttribute("download", "反馈数据.xlsx");
+          a.click();
+          URL.revokeObjectURL(a.objectUrl);
+        }
+      });
+    },
+    dateChange(e) {
+      this.searchForm.beginTime = filter.frDateTime(e[0]);
+      this.searchForm.endTime = filter.frDateTime(e[1]);
+    },
+    handleSizeChange(e) {
+      // 单页数量
+      this.searchForm.pageSize = e;
+      this.search();
+    },
+    handleCurrentChange(e) {
+      // 跳页
+      this.searchForm.pageNum = e;
+      this.search();
+    },
+  },
+};
+</script>
+
+<style scoped lang="scss">
+.searchBox {
+  background-color: #fff;
+  border-radius: 4px;
+  box-shadow: #bfbfbf 0 0 2px;
+  height: unset !important;
+
+  form {
+    margin: auto;
+
+    .el-form-item {
+      margin: 5px 5px;
+    }
+  }
+}
+
+.el-header {
+  padding: 20px;
+}
+
+.el-form-item {
+  margin-bottom: unset;
+}
+
+.tableBox {
+  margin-top: 10px;
+  background-color: #fff;
+  border-radius: 4px;
+  box-shadow: #bfbfbf 0 0 2px;
+}
+
+.block {
+  margin-top: 20px;
+  float: right;
+}
+
+.demo-drawer__content {
+  padding: 20px 5%;
+  line-height: 32px;
+
+  .el-form-item {
+    margin-top: 20px;
+  }
+
+  .demo-drawer__footer {
+    position: fixed;
+    bottom: 30px;
+    width: 45%;
+    margin-top: 20px;
+    display: flex;
+
+    button {
+      flex: 1;
+    }
+  }
+}
+</style>

+ 280 - 0
admin/src/views/dataPage/orderData/index.vue

@@ -0,0 +1,280 @@
+<template>
+  <div>
+    <el-container>
+      <!--搜索-->
+      <el-header class="searchBox">
+        <el-form :inline="true" :model="searchForm" class="demo-form-inline">
+          <el-form-item label="产品名称">
+            <el-input v-model="searchForm.productName" placeholder="产品名称" />
+          </el-form-item>
+          <el-form-item label="渠道编码">
+            <el-input v-model="searchForm.fullCode" placeholder="渠道编码" />
+          </el-form-item>
+          <el-form-item label="手机号">
+            <el-input v-model="searchForm.phone" placeholder="手机号" />
+          </el-form-item>
+          <el-form-item label="订购/退订">
+            <el-select v-model="searchForm.handleType" placeholder="请选择">
+              <el-option key="0" label="订购" value="0" />
+              <el-option key="1" label="退订" value="1" />
+            </el-select>
+          </el-form-item>
+          <el-form-item label="状态">
+            <el-select v-model="searchForm.handleResult" placeholder="请选择">
+              <el-option key="1" label="成功" value="1" />
+              <el-option key="0" label="失败" value="0" />
+            </el-select>
+          </el-form-item>
+          <el-form-item label="时间范围">
+            <el-date-picker
+              v-model="value2"
+              type="datetimerange"
+              :picker-options="pickerOptions"
+              range-separator="至"
+              start-placeholder="开始日期"
+              end-placeholder="结束日期"
+              align="right"
+              @change="dateChange"
+            />
+          </el-form-item>
+
+          <el-form-item>
+            <el-button type="primary" @click="searchBtn">查询</el-button>
+            <el-button @click="reset">重置</el-button>
+            <el-button type="warning" @click="download()">导出</el-button>
+          </el-form-item>
+        </el-form>
+      </el-header>
+
+      <!--表格-->
+      <el-main class="tableBox">
+        <el-table :data="tableData" stripe style="width: 100%">
+          <el-table-column prop="tradeNo" label="订单号" width="120" />
+          <el-table-column prop="cpid" label="CPID" width="70" />
+          <el-table-column prop="spid" label="SPID" width="70" />
+          <el-table-column prop="productName" label="产品名称" />
+          <el-table-column prop="phone" label="会员手机号" />
+          <el-table-column prop="handleType" label="订购/退订" width="80">
+            <template slot-scope="scope">
+              <span>{{ scope.row.handleType === 0 ? "订购" : "退订" }}</span>
+            </template>
+          </el-table-column>
+          <el-table-column prop="handleResult" label="订购结果" width="80">
+            <template slot-scope="scope">
+              <span>{{ scope.row.handleResult > 0 ? "成功" : "失败" }}</span>
+            </template>
+          </el-table-column>
+          <el-table-column prop="handleResult" label="描述" width="120">
+            <template slot-scope="scope">
+              <span>{{ scope.row.remark ? scope.row.remark : "--" }}</span>
+            </template>
+          </el-table-column>
+          <el-table-column prop="fullCode" label="渠道编码" />
+          <el-table-column prop="createTime" label="订购时间" width="160" />
+        </el-table>
+        <div class="block">
+          <el-pagination
+            :current-page.sync="searchForm['pageNum']"
+            :page-sizes="[20, 50, 100, 300]"
+            :page-size="searchForm['pageSize']"
+            layout="total, sizes, pager"
+            :total="total"
+            @size-change="handleSizeChange"
+            @current-change="handleCurrentChange"
+          />
+        </div>
+      </el-main>
+    </el-container>
+  </div>
+</template>
+
+<script>
+import { get } from "@/api/common";
+import filter from "@/common/filter";
+import axios from "axios";
+import { getToken } from "../../../utils/auth";
+export default {
+  name: "RunData",
+  data() {
+    return {
+      searchForm: {
+        // productName: '',
+        // fullCode: '',
+        // phone: '',
+        // handleType: '',
+        // handleResult: '',
+        // startTime: '',
+        // endTime: '',
+        pageSize: 20,
+        pageNo: 1,
+      },
+      value2: "",
+      tableData: [],
+      total: 5000,
+      pickerOptions: {
+        shortcuts: [
+          {
+            text: "最近一周",
+            onClick(picker) {
+              const end = new Date();
+              const start = new Date();
+              start.setTime(start.getTime() - 3600 * 1000 * 24 * 7);
+              picker.$emit("pick", [start, end]);
+            },
+          },
+          {
+            text: "最近一个月",
+            onClick(picker) {
+              const end = new Date();
+              const start = new Date();
+              start.setTime(start.getTime() - 3600 * 1000 * 24 * 30);
+              picker.$emit("pick", [start, end]);
+            },
+          },
+          {
+            text: "最近三个月",
+            onClick(picker) {
+              const end = new Date();
+              const start = new Date();
+              start.setTime(start.getTime() - 3600 * 1000 * 24 * 90);
+              picker.$emit("pick", [start, end]);
+            },
+          },
+        ],
+      },
+    };
+  },
+  created() {
+    var that = this;
+    that.search();
+  },
+  methods: {
+    async search() {
+      // 同步搜索
+      await get("/record/access-record/page", this.searchForm)
+        .then((res) => {
+          this.tableData = res.data.list;
+          this.total = res.data.total;
+        })
+        .catch((err) => {
+          console.log(err);
+        });
+    },
+    searchBtn() {
+      // 搜索按钮
+      this.search();
+    },
+    reset() {
+      // 重置
+      this.searchForm = {
+        cpid: "",
+        categoryName: "",
+        pageSize: 20,
+        pageNum: 1,
+      };
+      this.search();
+    },
+    dateChange(e) {
+      console.log(e);
+      this.searchForm.startTime = filter.frDateTime(e[0]);
+      this.searchForm.endTime = filter.frDateTime(e[1]);
+    },
+    handleSizeChange(e) {
+      // 单页数量
+      this.searchForm.pageSize = e;
+      this.search();
+    },
+    handleCurrentChange(e) {
+      // 跳页
+      this.searchForm.pageNum = e;
+      this.search();
+    },
+    download() {
+      // 导出
+      let formData = new FormData();
+      for (let i in this.searchForm) {
+        if (this.searchForm[i]) {
+          formData.append(i, this.searchForm[i]);
+        }
+      }
+      let loading = this.$loading({
+        lock: true,
+        text: "下载量较大,请耐心等待",
+        spinner: "el-icon-loading",
+        background: "rgba(0, 0, 0, 0.7)",
+      });
+      axios({
+        method: "post",
+        url: process.env.VUE_APP_BASE_API + "/handleRecord/download",
+        data: formData,
+        responseType: "blob",
+        headers: {
+          "Content-Type": "multipart/form-data",
+          token: getToken(),
+        },
+      }).then((res) => {
+        if (res.data) {
+          loading.close();
+          let a = document.createElement("a");
+          let blob = new Blob([res.data], {
+            type: "application/vnd.ms-excel",
+          });
+          let objectUrl = URL.createObjectURL(blob);
+          a.setAttribute("href", objectUrl);
+          a.setAttribute("download", "订购数据.xlsx");
+          a.click();
+          URL.revokeObjectURL(a.objectUrl);
+        }
+      });
+    },
+  },
+};
+</script>
+
+<style scoped lang="scss">
+.searchBox {
+  background-color: #fff;
+  border-radius: 4px;
+  box-shadow: #bfbfbf 0 0 2px;
+  height: unset !important;
+  form {
+    margin: auto;
+    .el-form-item {
+      margin: 5px 5px;
+    }
+  }
+}
+.el-header {
+  padding: 20px;
+}
+.el-form-item {
+  margin-bottom: unset;
+}
+.tableBox {
+  margin-top: 10px;
+  background-color: #fff;
+  border-radius: 4px;
+  box-shadow: #bfbfbf 0 0 2px;
+}
+.block {
+  margin-top: 20px;
+  float: right;
+}
+.demo-drawer__content {
+  padding: 20px 5%;
+  line-height: 32px;
+  .el-form-item {
+    margin-top: 20px;
+  }
+  .demo-drawer__footer {
+    position: fixed;
+    bottom: 30px;
+    width: 45%;
+    margin-top: 20px;
+    display: flex;
+    button {
+      flex: 1;
+    }
+  }
+}
+</style>

+ 332 - 0
admin/src/views/dataPage/receData/index.vue

@@ -0,0 +1,332 @@
+<template>
+    <div>
+        <el-container>
+            <!--搜索-->
+            <el-header class="searchBox">
+                <el-form :inline="true" :model="searchForm" class="demo-form-inline">
+                    <el-form-item label="产品名称">
+                        <el-input v-model="searchForm.productName" placeholder="产品名称"/>
+                    </el-form-item>
+                    <el-form-item label="渠道编码">
+                        <el-input v-model="searchForm.fullCode" placeholder="渠道编码"/>
+                    </el-form-item>
+                    <el-form-item label="手机号">
+                        <el-input v-model="searchForm.phone" placeholder="手机号"/>
+                    </el-form-item>
+                    <el-form-item label="状态">
+                        <el-select v-model="searchForm.joinActivityResult" placeholder="请选择">
+                            <el-option key="1" label="成功" value="1"/>
+                            <el-option key="0" label="失败" value="0"/>
+                        </el-select>
+                    </el-form-item>
+                    <el-form-item label="时间范围">
+                        <el-date-picker
+                                v-model="value2"
+                                type="datetimerange"
+                                :picker-options="pickerOptions"
+                                range-separator="至"
+                                start-placeholder="开始日期"
+                                end-placeholder="结束日期"
+                                align="right"
+                                @change="dateChange"
+                        />
+                    </el-form-item>
+
+                    <el-form-item>
+                        <el-button type="primary" @click="searchBtn">查询</el-button>
+                        <el-button @click="reset">重置</el-button>
+                        <el-button type="warning" @click="value5 = true">手动领取</el-button>
+                    </el-form-item>
+                </el-form>
+            </el-header>
+
+            <!--表格-->
+            <el-main class="tableBox">
+                <!--批量领取窗口主体-->
+                <vxe-modal v-model="value5" width="60%" title="批量领取会员">
+                    <template #default>
+                        <el-form label-position="left" status-icon :rules="rules" ref="memberForm" label-width="80px"
+                                 :model="memberForm">
+                            <el-form-item label="名称" prop="index">
+                                <el-select filterable v-model="memberForm.index" placeholder="请选择产品">
+                                    <el-option v-for="(item, index) in productInfoList"
+                                               :key="item.id"
+                                               :label="`${item.productName}/${item.remark}/${item.spid}`"
+                                               :value="index"/>
+                                </el-select>
+                            </el-form-item>
+                            <el-form-item class="margin-top" label="手机号" prop="phones">
+                                <el-input v-model="memberForm.phones"></el-input>
+                            </el-form-item>
+
+                            <el-form-item class="margin-top">
+                                <el-button type="primary" @click="giveMenmber('memberForm')">提交</el-button>
+                                <el-button @click="value5 = false">取消</el-button>
+                            </el-form-item>
+                        </el-form>
+                    </template>
+                </vxe-modal>
+                <!--表格主体-->
+                <el-table :data="tableData" stripe style="width: 100%">
+                    <el-table-column prop="parentChannelName" label="一级渠道" width="120">
+                        <template slot-scope="ppp">
+                            <div style="text-align: center">{{ ppp.row.parentChannelName ? ppp.row.parentChannelName :
+                                '后台操作' }}
+                            </div>
+                        </template>
+                    </el-table-column>
+                    <el-table-column prop="channelName" label="二级渠道" width="120">
+                        <template slot-scope="ppp">
+                            <div style="text-align: center">{{ ppp.row.channelName ? ppp.row.channelName : '手动领取' }}
+                            </div>
+                        </template>
+                    </el-table-column>
+                    <el-table-column prop="fullCode" label="渠道代码" width="120">
+                        <template slot-scope="ppp">
+                            <div style="text-align: center">{{ ppp.row.fullCode ? ppp.row.fullCode : '— —' }}</div>
+                        </template>
+                    </el-table-column>
+                    <el-table-column prop="productName" label="产品名称"/>
+                    <el-table-column prop="phone" label="会员手机号"/>
+                    <el-table-column prop="joinActivityResult" label="领取结果" width="80">
+                        <template slot-scope="scope">
+                            <span>{{ scope.row.joinActivityResult > 0 ? '成功' : '失败' }}</span>
+                        </template>
+                    </el-table-column>
+                    <el-table-column prop="createTime" label="订购时间" width="160"/>
+                </el-table>
+                <div class="block">
+                    <el-pagination
+                            :current-page.sync="searchForm['pageNum']"
+                            :page-sizes="[20, 50, 100, 300]"
+                            :page-size="searchForm['pageSize']"
+                            layout="total, sizes, pager"
+                            :total="total"
+                            @size-change="handleSizeChange"
+                            @current-change="handleCurrentChange"
+                    />
+                </div>
+            </el-main>
+        </el-container>
+    </div>
+
+</template>
+
+<script>
+    import {get, post} from '@/api/common'
+    import filter from '@/common/filter'
+
+    export default {
+        name: 'RunData',
+        data() {
+            return {
+                searchForm: {
+                    productName: '',
+                    fullCode: '',
+                    phone: '',
+                    handleType: '',
+                    handleResult: '',
+                    startTime: '',
+                    endTime: '',
+                    pageSize: 20,
+                    pageNum: 1
+                },
+                memberForm: {},
+                productInfoList: {},
+                value2: '',
+                value5: false,
+                tableData: [],
+                total: 5000,
+                pickerOptions: {
+                    shortcuts: [{
+                        text: '最近一周',
+                        onClick(picker) {
+                            const end = new Date()
+                            const start = new Date()
+                            start.setTime(start.getTime() - 3600 * 1000 * 24 * 7)
+                            picker.$emit('pick', [start, end])
+                        }
+                    }, {
+                        text: '最近一个月',
+                        onClick(picker) {
+                            const end = new Date()
+                            const start = new Date()
+                            start.setTime(start.getTime() - 3600 * 1000 * 24 * 30)
+                            picker.$emit('pick', [start, end])
+                        }
+                    }, {
+                        text: '最近三个月',
+                        onClick(picker) {
+                            const end = new Date()
+                            const start = new Date()
+                            start.setTime(start.getTime() - 3600 * 1000 * 24 * 90)
+                            picker.$emit('pick', [start, end])
+                        }
+                    }]
+                },
+                rules: {
+                    index: [
+                        {required: true, message: '请选择产品', trigger: 'change'}
+                    ],
+                    phones: [
+                        {required: true, message: '请输入手机号', trigger: 'blur'}
+                    ],
+                },
+            }
+        },
+        created() {
+            var that = this
+            that.search()
+            get('/productInfo/page', {'pageSize': 9999, 'pageNum': 1}).then(res => {
+                this.productInfoList = res.data.list
+            });
+        },
+        methods: {
+            giveMenmber(formName) {
+                this.$confirm('您确定为这些手机号领取会员么?当前操作不可逆', '提示', {
+                    confirmButtonText: '确定',
+                    cancelButtonText: '取消',
+                    type: 'warning'
+                }).then(() => {
+                    this.$refs[formName].validate((valid) => {
+                        if (valid) {
+                            let d = this.memberForm
+                            let phones = d.phones.split(',')
+                            let data = {
+                                "activeType": this.productInfoList[d.index].activeType,
+                                "givecpId": "",
+                                "isCompositeProduct": this.productInfoList[d.index].isCompositeProduct,
+                                "phones": phones,
+                                "productId": this.productInfoList[d.index].id
+                            }
+                            post('/vip/batchjoin', data).then((res) => {
+                                if (res.code === 10000) {
+                                    this.value5 = false
+                                    this.reset()
+                                    this.$message({
+                                        type: 'info',
+                                        message: res.data,
+                                        duration:3000,
+                                        offset: 360
+                                    });
+                                }
+                            }).catch((err) => {
+                                this.$message({
+                                    type: 'worning',
+                                    message: err.message,
+                                    offset: 360
+                                });
+                            })
+
+                        } else {
+                            console.log('error submit!!');
+                            return false;
+                        }
+                    });
+                }).catch(() => {
+                    this.$message({
+                        type: 'info',
+                        message: '已取消'
+                    });
+                });
+            },
+
+            async search() { // 同步搜索
+                await get('/joinActivityRecord/page', this.searchForm)
+                    .then((res) => {
+                        this.tableData = res.data.list
+                        this.total = res.data.total
+                    }).catch((err) => {
+                        console.log(err)
+                    })
+            },
+            searchBtn() { // 搜索按钮
+                this.search()
+            },
+            reset() { // 重置
+                this.searchForm = {
+                    cpid: '',
+                    categoryName: '',
+                    pageSize: 20,
+                    pageNum: 1
+                }
+                this.search()
+            },
+            dateChange(e) {
+                console.log(e)
+                this.searchForm.startTime = filter.frDateTime(e[0])
+                this.searchForm.endTime = filter.frDateTime(e[1])
+            },
+            handleSizeChange(e) { // 单页数量
+                this.searchForm.pageSize = e
+                this.search()
+            },
+            handleCurrentChange(e) { // 跳页
+                this.searchForm.pageNum = e
+                this.search()
+            }
+        }
+    }
+</script>
+
+<style scoped lang="scss">
+    .margin-top {
+        margin-top: 30px;
+    }
+
+    .searchBox {
+        background-color: #fff;
+        border-radius: 4px;
+        box-shadow: #bfbfbf 0 0 2px;
+        height: unset !important;
+
+        form {
+            margin: auto;
+
+            .el-form-item {
+                margin: 5px 5px;
+            }
+        }
+    }
+
+    .el-header {
+        padding: 20px
+    }
+
+    .el-form-item {
+        margin-bottom: unset
+    }
+
+    .tableBox {
+        margin-top: 10px;
+        background-color: #fff;
+        border-radius: 4px;
+        box-shadow: #bfbfbf 0 0 2px;
+    }
+
+    .block {
+        margin-top: 20px;
+        float: right;
+    }
+
+    .demo-drawer__content {
+        padding: 20px 5%;
+        line-height: 32px;
+
+        .el-form-item {
+            margin-top: 20px;
+        }
+
+        .demo-drawer__footer {
+            position: fixed;
+            bottom: 30px;
+            width: 45%;
+            margin-top: 20px;
+            display: flex;
+
+            button {
+                flex: 1;
+            }
+        }
+    }
+</style>

+ 191 - 0
admin/src/views/dataPage/runData/index.vue

@@ -0,0 +1,191 @@
+<template>
+  <div>
+    <el-container>
+      <!--搜索-->
+      <el-header class="searchBox">
+        <el-form :inline="true" :model="searchForm" class="demo-form-inline">
+          <el-form-item label="渠道key">
+            <el-input v-model="searchForm.channelKey" placeholder="渠道key" />
+          </el-form-item>
+          <el-form-item label="客户来源">
+            <el-input v-model="searchForm.fromSource" placeholder="客户来源" />
+          </el-form-item>
+          <el-form-item label="产品名称">
+            <el-input v-model="searchForm.productName" placeholder="产品名称" />
+          </el-form-item>
+          <el-form-item label="时间范围">
+            <el-date-picker
+              v-model="searchForm.date"
+              type="date"
+              placeholder="选择日期"
+              value-format="yyyy-MM-dd">
+            </el-date-picker>
+          </el-form-item>
+
+          <el-form-item>
+            <el-button type="primary" @click="searchBtn">查询</el-button>
+            <el-button @click="reset">重置</el-button>
+          </el-form-item>
+        </el-form>
+      </el-header>
+
+      <!--表格-->
+      <el-main class="tableBox">
+        <el-table :data="tableData" stripe style="width: 100%">
+          <el-table-column prop="prouductName" label="产品名称" />
+          <el-table-column prop="spid" label="spid" />
+          <el-table-column prop="fullCode" label="渠道编码" />
+          <el-table-column prop="pvNum" label="PV" />
+          <el-table-column prop="uvNum" label="UV" />
+          <el-table-column prop="fromSource " label="获客来源" />
+          <el-table-column prop="orderNum" label="订单数" />
+          <el-table-column prop="orderProfit" label="订单收益" />
+          <el-table-column prop="refundOrderNum" label="退单数" />
+          <el-table-column prop="primaryConversionRate" label="分类名称" />
+          <el-table-column prop="seconfaryConversionRate" label="分类名称" />
+          <el-table-column prop="thirdConversionRate" label="分类名称" />
+          <el-table-column prop="data" label="创建时间" width="160" />
+        </el-table>
+        <div class="block">
+          <el-pagination
+            :current-page.sync="searchForm['pageNum']"
+            :page-sizes="[20, 50, 100, 300]"
+            :page-size="searchForm['pageSize']"
+            layout="total, sizes, pager"
+            :total="total"
+            @size-change="handleSizeChange"
+            @current-change="handleCurrentChange"
+          />
+        </div>
+      </el-main>
+    </el-container>
+  </div>
+
+</template>
+
+<script>
+import { post, get } from '@/api/common'
+export default {
+  name: 'RunData',
+  data() {
+    return {
+      searchForm: {
+        channelKey: '',
+        date: '',
+        fromSource: '',
+        productName: '',
+        pageSize: 20,
+        pageNum: 1
+      },
+      tableData: [],
+      total: 5000,
+      pickerOptions: {
+        shortcuts: [{
+          text: '最近一周',
+          onClick(picker) {
+            const end = new Date()
+            const start = new Date()
+            start.setTime(start.getTime() - 3600 * 1000 * 24 * 7)
+            picker.$emit('pick', [start, end])
+          }
+        }, {
+          text: '最近一个月',
+          onClick(picker) {
+            const end = new Date()
+            const start = new Date()
+            start.setTime(start.getTime() - 3600 * 1000 * 24 * 30)
+            picker.$emit('pick', [start, end])
+          }
+        }, {
+          text: '最近三个月',
+          onClick(picker) {
+            const end = new Date()
+            const start = new Date()
+            start.setTime(start.getTime() - 3600 * 1000 * 24 * 90)
+            picker.$emit('pick', [start, end])
+          }
+        }]
+      }
+    }
+  },
+  created() {
+    var that = this
+    that.search()
+  },
+  methods: {
+    async search() { // 同步搜索
+      await get('/sysData/dataReport', this.searchForm)
+        .then((res) => {
+          this.tableData = res.data.list
+          this.total = res.data.total
+        }).catch((err) => {
+          console.log(err)
+        })
+    },
+    searchBtn() { // 搜索按钮
+      this.search()
+    },
+    reset() { // 重置
+      this.searchForm = {
+        cpid: '',
+        categoryName: '',
+        pageSize: 20,
+        pageNum: 1
+      }
+      this.search()
+    },
+    handleSizeChange(e) { // 单页数量
+      this.searchForm.pageSize = e
+      this.search()
+    },
+    handleCurrentChange(e) { // 跳页
+      this.searchForm.pageNum = e
+      this.search()
+    }
+  }
+}
+</script>
+
+<style scoped lang="scss">
+.searchBox {
+  background-color: #fff;
+  border-radius: 4px;
+  box-shadow: #bfbfbf 0 0 2px;
+  height: unset !important;
+  form {
+    margin: auto;
+    .el-form-item {
+      margin: 5px 5px;
+    }
+  }
+}
+.el-header {padding: 20px}
+.el-form-item {margin-bottom: unset}
+.tableBox{
+  margin-top: 10px;
+  background-color: #fff;
+  border-radius: 4px;
+  box-shadow: #bfbfbf 0 0 2px;
+}
+.block {
+  margin-top: 20px;
+  float: right;
+}
+.demo-drawer__content {
+  padding: 20px 5%;
+  line-height: 32px;
+  .el-form-item {
+    margin-top: 20px;
+  }
+  .demo-drawer__footer {
+    position: fixed;
+    bottom: 30px;
+    width: 45%;
+    margin-top: 20px;
+    display: flex;
+    button {
+      flex: 1;
+    }
+  }
+}
+</style>