liyongli 3 vuotta sitten
vanhempi
commit
38dd7239d4

+ 14 - 12
src/api/kuyun.js

@@ -160,7 +160,7 @@ export function programsExport(data, fileName) {
 //
 
 /**
- * 抽象节目剧目分地区收视(全国)
+ * 抽象节目剧目
  * @props epg_ids=&area_id=
  * @return {AxjxPromise}
  */
@@ -172,16 +172,19 @@ export function country(data) {
     data,
   });
 }
-export function countryExport(data, fileName) {
-  return fileDownload(
-    {
-      urlType: "kuyunApi",
-      url: "/api/evaluation/eye/download/performance/absepgkpi/download",
-      method: "psot",
-      data,
-    },
-    fileName
-  );
+
+/**
+ * 居图节目剧目
+ * @props epg_ids=&area_id=
+ * @return {AxjxPromise}
+ */
+export function epgcountry(data) {
+  return ajax({
+    urlType: "kuyunApi",
+    url: "/api/evaluation/eye/performance/epgkpi",
+    method: "POST",
+    data,
+  });
 }
 
 /**
@@ -196,4 +199,3 @@ export function singleProgram(data) {
     method: "GET",
   });
 }
-

+ 4 - 4
src/router/index.js

@@ -86,12 +86,12 @@ const routes = [
             component: ()=> import("../views/Compete/Compete.vue")
         },
         {
-            path: "/country/programDetail", // 具体节目剧目查询
-            component: ()=> import("../views/ProgramDetail/ProgramDetail.vue")
+            path: "/country/specificProgramQuery", // 具体节目剧目查询
+            component: ()=> import("../views/SpecificProgramQuery/SpecificProgramQuery.vue")
         },
         {
-            path: "/country/programDetail", // 具体节目剧目排行
-            component: ()=> import("../views/ProgramDetail/ProgramDetail.vue")
+            path: "/country/specificProgram", // 具体节目剧目排行
+            component: ()=> import("../views/SpecificProgram/SpecificProgram.vue")
         },
         {
             path: "/country/abstractProgramQuery", // 抽象节目剧目查询

+ 0 - 1
src/views/AbstractProgramQuery/AbstractProgramQuery.vue

@@ -82,7 +82,6 @@
         <el-table-column
           align="center"
           show-overflow-tooltip
-          width="400px"
           prop="abs_epg"
           label="抽象节目"
           class-name="nowrap"

+ 0 - 245
src/views/ProgramDetail/ProgramDetail.vue

@@ -1,245 +0,0 @@
-<template>
-  <div class="ProgramDetail">
-    <el-breadcrumb separator-class="el-icon-arrow-right">
-      <el-breadcrumb-item>传统媒体</el-breadcrumb-item>
-      <el-breadcrumb-item>具体节目剧目查询</el-breadcrumb-item>
-    </el-breadcrumb>
-    <el-card class="box-card">
-      <el-form
-        ref="form"
-        :model="form"
-        size="small"
-        :inline="true"
-        label-width="120px"
-        class="demo-form-inline"
-      >
-        <el-form-item label="日期">
-          <el-date-picker
-            v-model="form.date"
-            type="daterange"
-            :disabled-date="time => disabledDate(time)"
-            range-separator="-"
-            start-placeholder="开始日期"
-            end-placeholder="结束日期"
-          >
-          </el-date-picker>
-        </el-form-item>
-        <el-form-item label="时间">
-          <el-time-picker
-            v-model="form.rangeTime"
-            is-range
-            format="HH:mm"
-            range-separator="-"
-            start-placeholder="开始时间"
-            end-placeholder="结束时间"
-          >
-          </el-time-picker>
-        </el-form-item>
-        <el-form-item label="频道组">
-          <el-select
-            v-model="form.channelGroup"
-            placeholder="请选择频道组"
-            @change="channelSelect"
-          >
-            <el-option
-              v-for="item in channelList"
-              :key="item.value"
-              :label="item.label"
-              :value="item.value"
-              :disabled="item.disabled"
-            >
-            </el-option>
-          </el-select>
-        </el-form-item>
-        <el-form-item label="区域">
-          <el-cascader
-            v-model="form.region"
-            :options="region"
-            :props="{ children: 'options' }"
-          ></el-cascader>
-        </el-form-item>
-        <el-form-item style="float: right">
-          <el-button type="primary" @click="onSubmit">查询</el-button>
-          <el-button type="primary" @click="onExport">导出</el-button>
-        </el-form-item>
-      </el-form>
-    </el-card>
-    <br />
-    <el-card class="box-card">
-      <line-charts
-        :list="tableData"
-        xName="abs_epg"
-        :keys="chartKeys"
-      ></line-charts>
-      <el-table
-        :data="tableData"
-        :header-cell-style="{ backgroundColor: '#f4f5f7', color: '#606266' }"
-        style="width: 100%"
-      >
-        <el-table-column
-          align="center"
-          show-overflow-tooltip
-          width="400px"
-          prop="abs_epg"
-          label="省级卫视"
-          class-name="nowrap"
-        />
-        <el-table-column
-          v-for="(item, i) in chartKeys"
-          :key="'table' + i"
-          align="center"
-          :prop="item.key"
-          :formatter="matrer"
-          :label="item.name"
-        />
-      </el-table>
-    </el-card>
-  </div>
-</template>
-
-<script>
-// @ is an alias to /src
-// import {  } from "@/api/index";
-
-import lineCharts from "@/views/Country/components/lineCharts";
-
-import config from "@/config/index";
-export default {
-  name: "Channel",
-  data() {
-    return {
-      chartKeys: [
-        {
-          key: "indicators_tv_ratings",
-          name: "直播关注度排行",
-        },
-        {
-          key: "indicators_tv_ratings",
-          name: "直播关注度",
-        },
-        {
-          key: "indicators_market_ratings",
-          name: "市占率",
-        },
-        {
-          key: "indicators_arrive",
-          name: "到达率",
-        },
-        {
-          key: "indicators_loyal",
-          name: "忠诚度",
-        },
-        {
-          key: "indicators_loyal",
-          name: "上期节目留存",
-        },
-        {
-          key: "indicators_loyal",
-          name: "用户牵引",
-        },
-      ],
-      form: {
-        rangeTime: [],
-        channelGroup: 0,
-        date: [
-          new Date(new Date() - 86400000),
-          new Date(new Date() - 86400000),
-        ],
-        region: -1,
-      },
-      tableData: [
-        {
-          abs_epg: "华山论鉴",
-          ca_types: "生活服务",
-          channel_0: "陕西卫视",
-          day: "2021-01-03",
-          default: "陕西",
-          epg: "华山论鉴 - 陕西卫视 - 2021-01-03 21:12~22:05",
-          epg_id: 60049237,
-          indicators_arrive: 0.007165,
-          indicators_column_remain: 0.027886,
-          indicators_loyal: 0.323005,
-          indicators_market_ratings: 0.014964,
-          indicators_traction: 0.455901,
-          indicators_tv_ratings: 0.002313,
-          is_live: "首播",
-          month: "2021-01",
-          start_time: 1609679520000,
-          tv_id: "48",
-          week: "星期日",
-          weekrange: "12-28 ~ 01-03",
-          year: "2021",
-        },
-        {
-          abs_epg: "华山论鉴",
-          ca_types: "生活服务",
-          channel_0: "陕西卫视",
-          day: "2021-01-10",
-          default: "陕西",
-          epg: "华山论鉴 - 陕西卫视 - 2021-01-10 21:10~22:05",
-          epg_id: 60144132,
-          indicators_arrive: 0.008802,
-          indicators_column_remain: 0.035565,
-          indicators_loyal: 0.312986,
-          indicators_market_ratings: 0.016561,
-          indicators_traction: 0.488494,
-          indicators_tv_ratings: 0.002752,
-          is_live: "首播",
-          month: "2021-01",
-          start_time: 1610284200000,
-          tv_id: "48",
-          week: "星期日",
-          weekrange: "01-04 ~ 01-10",
-          year: "2021",
-        },
-      ],
-    };
-  },
-  mounted() {},
-  computed: {
-    channelList() {
-      return config.channelList;
-    },
-    region() {
-      console.log(config.region);
-      return config.region;
-    },
-  },
-  methods: {
-    onExport() {},
-    disabledDate(time) {
-      return time.getTime() > Date.now() - 86400000;
-    },
-    onSubmit() {},
-    matrer(row, column, cellValue) {
-      return (cellValue * 100).toFixed(4) - 0 + "%";
-    },
-    channelSelect(a) {
-      this.selectAll(a, "channelGroup", 0);
-    },
-    regionSelect(a) {
-      this.selectAll(a, "region", -1);
-    },
-    selectAll(a, key, val) {
-      if (!a.length) return;
-      let select = a[a.length - 1];
-      if (select === val) this.form[key] = [val];
-      else
-        this.form[key] = (a.join(",") + ",")
-          .replace(val + ",", "")
-          .replace(/,$/, "")
-          .split(",");
-    },
-  },
-  components: { lineCharts },
-};
-</script>
-
-<style>
-.ProgramDetail {
-  margin: 10px 15px;
-}
-.ProgramDetail .nowrap .cell {
-  white-space: nowrap;
-}
-</style>

+ 312 - 0
src/views/SpecificProgram/SpecificProgram.vue

@@ -0,0 +1,312 @@
+<template>
+  <div class="AbstractProgram">
+    <el-breadcrumb separator-class="el-icon-arrow-right">
+      <el-breadcrumb-item>传统媒体</el-breadcrumb-item>
+      <el-breadcrumb-item>具体节目剧目查询</el-breadcrumb-item>
+    </el-breadcrumb>
+    <el-card class="box-card">
+      <el-form
+        ref="form"
+        :model="form"
+        size="small"
+        :inline="true"
+        label-width="120px"
+        class="demo-form-inline"
+      >
+        <el-form-item label="日期">
+          <el-date-picker
+            v-model="form.date"
+            type="daterange"
+            :disabled-date="time => disabledDate(time)"
+            range-separator="-"
+            start-placeholder="开始日期"
+            end-placeholder="结束日期"
+          >
+          </el-date-picker>
+        </el-form-item>
+
+        <el-form-item :label="v.name" v-for="(v, i) in searchDate" :key="i">
+          <el-select
+            v-model="form.filter[v.key]"
+            :placeholder="'请选择' + v.name"
+            multiple
+            collapse-tags
+            @change="se => select(v, se)"
+          >
+            <el-option key="-1" v-if="v.id !== 'time'" label="全选" value="-1">
+            </el-option>
+            <el-option
+              v-for="item in v.list || []"
+              :key="item.id + ''"
+              :label="item.name"
+              :value="item.key + ''"
+            >
+            </el-option>
+          </el-select>
+        </el-form-item>
+        <el-form-item label="时间">
+          <el-time-picker
+            v-model="rangeTime"
+            is-range
+            format="HH:mm"
+            range-separator="-"
+            @change="() => (form.filter.time = [])"
+            start-placeholder="开始时间"
+            end-placeholder="结束时间"
+          >
+          </el-time-picker>
+        </el-form-item>
+        <el-form-item style="float: right">
+          <el-button type="primary" :loading="loading" @click="onSubmit"
+            >查询</el-button
+          >
+          <el-button type="primary" :loading="loading1" @click="onExport"
+            >导出</el-button
+          >
+        </el-form-item>
+      </el-form>
+    </el-card>
+    <br />
+    <el-card class="box-card">
+      <line-charts
+        :list="tableData"
+        v-if="tableData.length"
+        xName="abs_epg"
+        :keys="chartKeys"
+      ></line-charts>
+      <el-table
+        :data="tableData"
+        :header-cell-style="{ backgroundColor: '#f4f5f7', color: '#606266' }"
+        style="width: 100%"
+      >
+        <el-table-column
+          align="center"
+          show-overflow-tooltip
+          prop="abs_epg"
+          label="具体节目"
+          class-name="nowrap"
+        />
+        <el-table-column
+          prop="indicators_loyal"
+          :formatter="matrer"
+          label="忠诚度"
+        />
+        <el-table-column
+          prop="indicators_arrive"
+          :formatter="matrer"
+          label="到达率"
+        />
+        <el-table-column
+          prop="indicators_market_ratings"
+          :formatter="matrer"
+          label="市占率"
+        />
+        <el-table-column
+          prop="indicators_tv_ratings"
+          :formatter="matrer"
+          label="直播关注度"
+        />
+        <el-table-column
+          prop="indicators_tv_ratings_rank"
+          :formatter="matrer"
+          label="直播关注度排名"
+        />
+      </el-table>
+    </el-card>
+  </div>
+</template>
+
+<script>
+// @ is an alias to /src
+import { selectDate, epgcountry } from "@/api/kuyun";
+
+import lineCharts from "@/views/Country/components/lineCharts";
+
+import config from "@/config/index";
+export default {
+  name: "Channel",
+  data() {
+    return {
+      searchDate: [],
+      rangeTime: [],
+      chartKeys: [
+        {
+          key: "indicators_market_ratings",
+          name: "市占率",
+        },
+        {
+          key: "indicators_tv_ratings",
+          name: "直播关注度",
+        },
+      ],
+      form: {
+        filter: {},
+        date: [],
+        field: [
+        "epg",
+        "indicators_loyal",
+        "indicators_arrive",
+        "indicators_market_ratings",
+        "indicators_tv_ratings",
+        "indicators_tv_ratings_rank"
+        ],
+        info: 1,
+        org_id: 20,
+      },
+      tableData: [],
+      loading: false,
+      loading1: false,
+    };
+  },
+  mounted() {
+    const d = new Date(Date.now() - 86400000);
+    let Y = d.getFullYear(),
+      M = d.getMonth() + 1,
+      D = d.getDate();
+    M > 9 ? "" : (M = "0" + M);
+    D > 9 ? "" : (D = "0" + D);
+    this.form.date = [[Y, M, D].join("-"), [Y, M, D].join("-")];
+    selectDate({
+      date: this.form.date,
+      key: "channel_0,area_t_1,area_c_9,area_c_1,abs_epg,time,week",
+      org_id: 20,
+    }).then(r => {
+      let area = false;
+      this.searchDate = r || [];
+      for (let i = 0; i < this.searchDate.length; i++) {
+        const v = this.searchDate[i];
+        if (/area/.test(v.id)) {
+          if (area) continue;
+          area = true;
+          this.form.filter[v.id] = [v.list[0].key + ""];
+          continue;
+        }
+        this.form.filter[v.id] = [v.list[0].key + ""];
+      }
+      epgcountry(this.form)
+        .then(r => {
+          this.tableData = r || [];
+          this.loading = false;
+        })
+        .catch(() => {
+          this.loading = false;
+        });
+    });
+  },
+  computed: {},
+  methods: {
+    onExport() {
+      this.loading1 = true;
+      let form = JSON.parse(JSON.stringify(this.form));
+      if (this.rangeTime.length) {
+        form.filter.time = this.rangeTime;
+      }
+      let keys = Object.keys(this.form.filter);
+      form.filter.time = ["0000_2400"];
+      for (let i = 0; i < keys.length; i++) {
+        const v = keys[i];
+        if (v === "time") continue;
+        for (let o = 0; o < this.searchDate.length; o++) {
+          const item = this.searchDate[o];
+          if (v === item.key) {
+            form.filter[v] = item.list.map(v => v.key);
+            break;
+          }
+        }
+      }
+      fetch(
+        config.kuyunApi +
+          "/api/evaluation/eye/download/performance/epgkpi/download",          
+        {
+          method: "post",
+          responseType: "blob",
+          body: JSON.stringify(form),
+        }
+      )
+        .then(res => {
+          return res.blob();
+        })
+        .then(blob => {
+          new Blob([blob]);
+          let fileName = "抽象节目剧目查询.csv";
+          var link = document.createElement("a");
+          link.href = window.URL.createObjectURL(blob);
+          link.download = fileName;
+          link.click();
+          window.URL.revokeObjectURL(link.href);
+          this.loading1 = false;
+        });
+    },
+    disabledDate(time) {
+      return time.getTime() > Date.now() - 86400000;
+    },
+    onSubmit() {
+      this.loading = true;
+      let form = JSON.parse(JSON.stringify(this.form));
+      if (this.rangeTime.length) {
+        form.filter.time = this.rangeTime;
+      }
+      let keys = Object.keys(this.form.filter);
+      for (let i = 0; i < keys.length; i++) {
+        const v = keys[i];
+        if (form.filter[v] != -1) continue;
+        for (let o = 0; o < this.searchDate.length; o++) {
+          const item = this.searchDate[o];
+          if (v === item.key) {
+            form.filter[v] = item.list.map(v => v.key);
+            break;
+          }
+        }
+      }
+      epgcountry(form)
+        .then(r => {
+          this.tableData = r || [];
+          this.loading = false;
+        })
+        .catch(() => {
+          this.loading = false;
+        });
+    },
+    matrer(row, column, cellValue) {
+      if (typeof cellValue !== "number") return cellValue;
+      return (cellValue * 100).toFixed(4) - 0 + "%";
+    },
+    selectAll(a, key, val) {
+      if (!a.length) return;
+      let select = a[a.length - 1];
+      if (select === val) this.form[key] = [val];
+      else
+        this.form[key] = (a.join(",") + ",")
+          .replace(val + ",", "")
+          .replace(/,$/, "")
+          .split(",");
+    },
+
+    select(v, se) {
+      if (v.id === "time") {
+        this.timeSelect(se, v.id, "0000_2400");
+        this.rangeTime = [];
+      } else this.timeSelect(se, v.id, "-1");
+    },
+
+    timeSelect(a, key, all) {
+      let ngx = new RegExp(all + ",?", "g");
+      let end = (a || [])[(a || []).length - 1],
+        s = (a || []).join(",").replace(ngx, "");
+      if (end !== all) this.form.filter[key] = s ? s.split(",") : [];
+      else this.form.filter[key] = [all];
+      this.rangeTime = [];
+    },
+  },
+  components: { lineCharts },
+};
+</script>
+
+<style>
+.AbstractProgram {
+  margin: 10px 15px;
+}
+.AbstractProgram .nowrap .cell {
+  white-space: nowrap;
+}
+</style>

+ 319 - 0
src/views/SpecificProgramQuery/SpecificProgramQuery.vue

@@ -0,0 +1,319 @@
+<template>
+  <div class="AbstractProgram">
+    <el-breadcrumb separator-class="el-icon-arrow-right">
+      <el-breadcrumb-item>传统媒体</el-breadcrumb-item>
+      <el-breadcrumb-item>具体节目剧目排行</el-breadcrumb-item>
+    </el-breadcrumb>
+    <el-card class="box-card">
+      <el-form
+        ref="form"
+        :model="form"
+        size="small"
+        :inline="true"
+        label-width="120px"
+        class="demo-form-inline"
+      >
+        <el-form-item label="日期">
+          <el-date-picker
+            v-model="form.date"
+            type="daterange"
+            :disabled-date="time => disabledDate(time)"
+            range-separator="-"
+            start-placeholder="开始日期"
+            end-placeholder="结束日期"
+          >
+          </el-date-picker>
+        </el-form-item>
+
+        <el-form-item :label="v.name" v-for="(v, i) in searchDate" :key="i">
+          <el-select
+            v-model="form.filter[v.key]"
+            :placeholder="'请选择' + v.name"
+            multiple
+            collapse-tags
+            @change="se => select(v, se)"
+          >
+            <el-option key="-1" v-if="v.id !== 'time'" label="全选" value="-1">
+            </el-option>
+            <el-option
+              v-for="item in v.list || []"
+              :key="item.id + ''"
+              :label="item.name"
+              :value="item.key + ''"
+            >
+            </el-option>
+          </el-select>
+        </el-form-item>
+        <el-form-item label="时间">
+          <el-time-picker
+            v-model="rangeTime"
+            is-range
+            format="HH:mm"
+            range-separator="-"
+            @change="() => (form.filter.time = [])"
+            start-placeholder="开始时间"
+            end-placeholder="结束时间"
+          >
+          </el-time-picker>
+        </el-form-item>
+        <el-form-item style="float: right">
+          <el-button type="primary" :loading="loading" @click="onSubmit"
+            >查询</el-button
+          >
+          <el-button type="primary" :loading="loading1" @click="onExport"
+            >导出</el-button
+          >
+        </el-form-item>
+      </el-form>
+    </el-card>
+    <br />
+    <el-card class="box-card">
+      <line-charts
+        :list="tableData"
+        v-if="tableData.length"
+        xName="abs_epg"
+        :keys="chartKeys"
+      ></line-charts>
+      <el-table
+        :data="tableData"
+        :header-cell-style="{ backgroundColor: '#f4f5f7', color: '#606266' }"
+        style="width: 100%"
+      >
+        <el-table-column
+          align="center"
+          show-overflow-tooltip
+          prop="abs_epg"
+          label="具体节目"
+          class-name="nowrap"
+        />
+        <el-table-column
+          prop="indicators_loyal"
+          :formatter="matrer"
+          label="忠诚度"
+        />
+        <el-table-column
+          prop="indicators_arrive"
+          :formatter="matrer"
+          label="到达率"
+        />
+        <el-table-column
+          prop="indicators_market_ratings"
+          :formatter="matrer"
+          label="市占率"
+        />
+        <el-table-column
+          prop="indicators_tv_ratings"
+          :formatter="matrer"
+          label="直播关注度"
+        />
+        <el-table-column
+          prop="indicators_tv_ratings_rank"
+          label="直播关注度排名"
+        />
+      </el-table>
+    </el-card>
+  </div>
+</template>
+
+<script>
+// @ is an alias to /src
+import { selectDate, epgcountry } from "@/api/kuyun";
+
+import lineCharts from "@/views/Country/components/lineCharts";
+
+import config from "@/config/index";
+export default {
+  name: "Channel",
+  data() {
+    return {
+      searchDate: [],
+      rangeTime: [],
+      chartKeys: [
+        {
+          key: "indicators_market_ratings",
+          name: "市占率",
+        },
+        {
+          key: "indicators_tv_ratings",
+          name: "直播关注度",
+        },
+        {
+          key: "indicators_loyal",
+          name: "忠诚度",
+        },
+        {
+          key: "indicators_arrive",
+          name: "到达率",
+        },
+      ],
+      form: {
+        filter: {},
+        date: [],
+        field: [
+        "epg",
+        "indicators_loyal",
+        "indicators_arrive",
+        "indicators_market_ratings",
+        "indicators_tv_ratings",
+        "indicators_tv_ratings_rank"
+        ],
+        info: 1,
+        org_id: 20,
+      },
+      tableData: [],
+      loading: false,
+      loading1: false,
+    };
+  },
+  mounted() {
+    const d = new Date(Date.now() - 86400000);
+    let Y = d.getFullYear(),
+      M = d.getMonth() + 1,
+      D = d.getDate();
+    M > 9 ? "" : (M = "0" + M);
+    D > 9 ? "" : (D = "0" + D);
+    this.form.date = [[Y, M, D].join("-"), [Y, M, D].join("-")];
+    selectDate({
+      date: this.form.date,
+      key: "channel_0,area_t_1,area_c_9,area_c_1,abs_epg,time,week",
+      org_id: 20,
+    }).then(r => {
+      let area = false;
+      this.searchDate = r || [];
+      for (let i = 0; i < this.searchDate.length; i++) {
+        const v = this.searchDate[i];
+        if (/area/.test(v.id)) {
+          if (area) continue;
+          area = true;
+          this.form.filter[v.id] = [v.list[0].key + ""];
+          continue;
+        }
+        this.form.filter[v.id] = [v.list[0].key + ""];
+      }
+      epgcountry(this.form)
+        .then(r => {
+          this.tableData = r || [];
+          this.loading = false;
+        })
+        .catch(() => {
+          this.loading = false;
+        });
+    });
+  },
+  computed: {},
+  methods: {
+    onExport() {
+      this.loading1 = true;
+      let form = JSON.parse(JSON.stringify(this.form));
+      if (this.rangeTime.length) {
+        form.filter.time = this.rangeTime;
+      }
+      let keys = Object.keys(this.form.filter);
+      form.filter.time = ["0000_2400"];
+      for (let i = 0; i < keys.length; i++) {
+        const v = keys[i];
+        if (v === "time") continue;
+        for (let o = 0; o < this.searchDate.length; o++) {
+          const item = this.searchDate[o];
+          if (v === item.key) {
+            form.filter[v] = item.list.map(v => v.key);
+            break;
+          }
+        }
+      }
+      fetch(
+        config.kuyunApi +
+          "/api/evaluation/eye/download/performance/epgkpi/download",          
+        {
+          method: "post",
+          responseType: "blob",
+          body: JSON.stringify(form),
+        }
+      )
+        .then(res => {
+          return res.blob();
+        })
+        .then(blob => {
+          new Blob([blob]);
+          let fileName = "抽象节目剧目查询.csv";
+          var link = document.createElement("a");
+          link.href = window.URL.createObjectURL(blob);
+          link.download = fileName;
+          link.click();
+          window.URL.revokeObjectURL(link.href);
+          this.loading1 = false;
+        });
+    },
+    disabledDate(time) {
+      return time.getTime() > Date.now() - 86400000;
+    },
+    onSubmit() {
+      this.loading = true;
+      let form = JSON.parse(JSON.stringify(this.form));
+      if (this.rangeTime.length) {
+        form.filter.time = this.rangeTime;
+      }
+      let keys = Object.keys(this.form.filter);
+      for (let i = 0; i < keys.length; i++) {
+        const v = keys[i];
+        if (form.filter[v] != -1) continue;
+        for (let o = 0; o < this.searchDate.length; o++) {
+          const item = this.searchDate[o];
+          if (v === item.key) {
+            form.filter[v] = item.list.map(v => v.key);
+            break;
+          }
+        }
+      }
+      epgcountry(form)
+        .then(r => {
+          this.tableData = r || [];
+          this.loading = false;
+        })
+        .catch(() => {
+          this.loading = false;
+        });
+    },
+    matrer(row, column, cellValue) {
+      if (typeof cellValue !== "number") return cellValue;
+      return (cellValue * 100).toFixed(4) - 0 + "%";
+    },
+    selectAll(a, key, val) {
+      if (!a.length) return;
+      let select = a[a.length - 1];
+      if (select === val) this.form[key] = [val];
+      else
+        this.form[key] = (a.join(",") + ",")
+          .replace(val + ",", "")
+          .replace(/,$/, "")
+          .split(",");
+    },
+
+    select(v, se) {
+      if (v.id === "time") {
+        this.timeSelect(se, v.id, "0000_2400");
+        this.rangeTime = [];
+      } else this.timeSelect(se, v.id, "-1");
+    },
+
+    timeSelect(a, key, all) {
+      let ngx = new RegExp(all + ",?", "g");
+      let end = (a || [])[(a || []).length - 1],
+        s = (a || []).join(",").replace(ngx, "");
+      if (end !== all) this.form.filter[key] = s ? s.split(",") : [];
+      else this.form.filter[key] = [all];
+      this.rangeTime = [];
+    },
+  },
+  components: { lineCharts },
+};
+</script>
+
+<style>
+.AbstractProgram {
+  margin: 10px 15px;
+}
+.AbstractProgram .nowrap .cell {
+  white-space: nowrap;
+}
+</style>