liyongli 3 年之前
父节点
当前提交
e6fcf7f442
共有 3 个文件被更改,包括 502 次插入111 次删除
  1. 94 111
      src/views/Compete/Compete.vue
  2. 92 0
      src/views/Compete/components/popver.vue
  3. 316 0
      src/views/Compete/components/programs.vue

+ 94 - 111
src/views/Compete/Compete.vue

@@ -14,48 +14,22 @@
         class="demo-form-inline"
       >
         <el-form-item label="节目">
-          <el-select
+          <el-autocomplete
             v-model="form.program"
-            class="m-2"
-            placeholder="节目名称"
-            multiple
-            filterable
-            remote
-            reserve-keyword
-            :remote-method="remoteMethod"
-            :loading="loading"
-          >
-            <el-option
-              v-for="item in options"
-              :key="item.value"
-              :label="item.label"
-              :value="item.value"
-            >
-            </el-option>
-          </el-select>
+            :fetch-suggestions="querySearchAsync"
+            placeholder="请输入节目名"
+            @select="handleSelect"
+          />
         </el-form-item>
         <el-form-item label="节目选择">
-          <el-cascader
-            v-model="form.egp"
-            collapse-tags
-            :options="region"
-            :props="{ multiple: true, children: 'options' }"
-          ></el-cascader>
+          <Programcom @change="changePro" :list="lmList" />
         </el-form-item>
         <el-form-item label="区域">
-          <el-select
+          <el-cascader
             v-model="form.region"
-            placeholder="请选择区域"
-            @change="regionSelect"
-          >
-            <el-option
-              v-for="item in region"
-              :key="item.value"
-              :label="item.label"
-              :value="item.value"
-            >
-            </el-option>
-          </el-select>
+            :options="region"
+            :props="{ children: 'options' }"
+          ></el-cascader>
         </el-form-item>
         <el-form-item style="float: right">
           <el-button type="primary" @click="onSubmit">查询</el-button>
@@ -65,7 +39,7 @@
     </el-card>
     <br />
     <el-card class="box-card">
-      <el-radio-group v-model="radio">
+      <el-radio-group @change="onSubmit" v-model="radio">
         <el-radio :label="0">同时段频道 </el-radio>
         <el-radio :label="1">同时段节目 </el-radio>
         <el-radio :label="2">同时段多节目 </el-radio>
@@ -138,9 +112,19 @@
 
 <script>
 // @ is an alias to /src
-// import {  } from "@/api/index";
+import {
+  overlapSearchTitle,
+  epgAggregate,
+  summary,
+  program,
+  programs,
+  summaryExport,
+  programExport,
+  programsExport
+} from "@/api/kuyun";
 
 // import lineCharts from "@/views/Country/components/lineCharts";
+import Programcom from "./components/programs.vue";
 
 import config from "@/config/index";
 const three = [
@@ -163,13 +147,13 @@ export default {
     return {
       form: {
         program: "",
-        region: 9,
-        epg: -1,
+        programLi: [],
+        region: -1,
       },
       options: [],
       list: [],
-      loading: false,
       radio: 0,
+      lmList: [],
       col: [],
       cols: [
         {
@@ -229,28 +213,7 @@ export default {
           name: "直播关注度贡献",
         },
       ],
-      tableList: [
-        {
-          market_ratings: 0.103766,
-          tv_name: "CCTV-8",
-          time_range: "04:02~04:32",
-          epgs: "《破冰行动 8 9 10 11 12 13》、《星推荐》",
-          rank: 1,
-          tv_ratings: 0.000401,
-          id: 13,
-          type: "央视",
-        },
-        {
-          market_ratings: 0.081786,
-          tv_name: "CCTV-新闻",
-          time_range: "04:02~04:32",
-          epgs: "《新闻直播间》",
-          rank: 2,
-          tv_ratings: 0.000316,
-          id: 18,
-          type: "央视",
-        },
-      ],
+      tableList: [],
       columns: [
         [
           {
@@ -322,36 +285,27 @@ export default {
             name: "节目",
           },
           {
-            type: "tv_name",
-            name: "频道",
+            type: "epg_play_date",
+            name: "日期",
           },
           {
-            type: "start_time:end_time",
+            type: "epg_play_time",
             name: "播出时间",
           },
         ],
       ],
       total: {
-        arrive: 0.00003,
-        loyal: 0.412556,
-        market_ratings: 0.003147,
-        tv_ratings: 0.000012,
+        arrive: 0,
+        loyal: 0,
+        market_ratings: 0,
+        tv_ratings: 0,
       },
     };
   },
   mounted() {},
   computed: {
     region() {
-      let reg = config.region || [],
-        li = [];
-      for (let i = 0; i < reg.length; i++) {
-        const v = reg[i];
-        if (v.label === "行业分城") {
-          li = v.options || [];
-          break;
-        }
-      }
-      return li;
+      return config.region;
     },
     tableDate() {
       const obj = {};
@@ -451,24 +405,66 @@ export default {
     },
   },
   methods: {
-    onExport() {},
-    onSubmit() {},
-    matrer(row, column, cellValue) {
-      let val = cellValue || 0;
-      return (val * 100).toFixed(4) - 0 + "%";
+    changePro(li) {
+      this.form.programLi = li || [];
     },
-    regionSelect(a) {
-      this.selectAll(a, "region", -1);
+    handleSelect(item) {
+      epgAggregate("ca_id=" + item.id).then(res => {
+        this.lmList = res || [];
+      });
     },
-    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(",");
+    querySearchAsync(queryString, cb) {
+      if (!queryString) {
+        cb([]);
+        return;
+      }
+      overlapSearchTitle("kw=" + queryString + "&ft=1").then(r => {
+        let li = (r || []).map(v => {
+          return {
+            value: v.name,
+            id: v.id,
+          };
+        });
+        cb(li);
+      });
+    },
+    onExport() {
+      let programLi = this.form.programLi || [{}];
+      const apis = [summaryExport, program, programs];
+      const apistext = [summaryExport, programExport, programsExport];
+      console.log(programLi[0]);
+      let epg = "epg_id=" + +(programLi[0] ? programLi[0].epg_id : "");
+      if (this.radio == 2)
+        epg = "epg_ids=" + +(programLi[0] ? programLi[0].epg_id : "");
+      apis[this.radio](
+        epg + "&area_id=" + this.form.region+"&domain=pro.eye.kuyun.com%2F&download=csv&page_no=1&page_size=10000",
+        "电视剧排播信息及表现(全国)-"+apistext[this.radio] + ".csv"
+      );
+    },
+    onSubmit() {
+      let programLi = this.form.programLi || [{}];
+      const apis = [summary, program, programs];
+      console.log(programLi[0]);
+      // if (programLi.length !== 1)
+      // return ElNotification({
+      //   message: "请选择一个节目",
+      //   title: "Warning",
+      //   type: "warning",
+      // });
+      let epg = "epg_id=" + +(programLi[0] ? programLi[0].epg_id : "");
+      if (this.radio == 2)
+        epg = "epg_ids=" + +(programLi[0] ? programLi[0].epg_id : "");
+      apis[this.radio](epg + "&area_id=" + this.form.region).then(r => {
+        console.log(r);
+        let li = r || {};
+        this.tableList = li.list || [];
+        this.total = {
+          arrive: li.arrive || 0,
+          loyal: li.loyal || 0,
+          market_ratings: li.market_ratings || 0,
+          tv_ratings: li.tv_ratings || 0,
+        };
+      });
     },
     change(v) {
       let ori = v || [];
@@ -485,23 +481,10 @@ export default {
       this.columns[2] = l;
     },
     format(v) {
-      return (v * 100).toFixed(4);
-    },
-    remoteMethod(query) {
-      if (query) {
-        this.loading = true;
-        setTimeout(() => {
-          this.loading = false;
-          this.options = this.list.filter(item => {
-            return item.label.toLowerCase().indexOf(query.toLowerCase()) > -1;
-          });
-        }, 200);
-      } else {
-        this.options = [];
-      }
+      return (v * 100).toFixed(4) - 0;
     },
   },
-  components: {},
+  components: { Programcom },
 };
 </script>
 

+ 92 - 0
src/views/Compete/components/popver.vue

@@ -0,0 +1,92 @@
+<template>
+  <div class="local_popver">
+    <div class="local_title" @click="showClick">
+      <span>
+        {{ titles.length ? title : placeholder || "请选择" }}
+        <el-tag v-if="titles.length > 1">+ {{ titles.length - 1 }}</el-tag>
+      </span>
+      <el-icon :size="14" color="#c0c4cc" style="padding-top: 0px;vertical-align: middle;">
+        <arrow-up v-show="card" />
+        <arrow-down v-show="!card" />
+      </el-icon>
+    </div>
+    <el-card v-show="card" style="position: absolute;z-index:10">
+      <div style="width: 300px">
+        <el-checkbox-group v-model="titles">
+          <el-checkbox v-for="item in list" :key="item.id" :label="item.name">
+            {{ item.name }}
+          </el-checkbox>
+        </el-checkbox-group>
+      </div>
+    </el-card>
+  </div>
+</template>
+
+<script>
+// @ is an alias to /src
+
+import { ArrowDown, ArrowUp } from "@element-plus/icons-vue";
+// import config from "@/config/index";
+export default {
+  name: "Channel",
+  props: {
+    list: {
+      type: Array,
+      default: () => [],
+    },
+    placeholder: String,
+  },
+  data() {
+    return {
+      titles: [],
+      card: false,
+    };
+  },
+  watch:{
+      titles(){
+          this.$emit("changeEvent", this.titles)
+      }
+  },
+  mounted() {},
+  computed: {
+    title() {
+      if (this.titles.length > 1) return this.titles[0] + "";
+      return this.titles.join(",");
+    },
+  },
+  methods: {
+    onSubmit() {},
+    showClick() {
+      this.card = !this.card;
+      if (!this.card) return;
+      document.body.addEventListener("click", this.showClickFunc, true);
+    },
+    showClickFunc(e) {
+      let classnames = [];
+      for (let i = 0; i < e.path.length; i++) {
+        const v = e.path[i];
+        const classList = v.classList || [];
+        for (let o = 0; o < classList.length; o++) {
+          const p = v.classList[o];
+          classnames.push(p);
+        }
+      }
+      classnames = classnames.join(",");
+      if (/card__body/g.test(classnames)) return;
+      this.card = false;
+      document.body.removeEventListener("click", this.showClickFunc, true);
+    },
+  },
+  components: { ArrowDown, ArrowUp },
+};
+</script>
+
+<style scoped>
+.local_popver {
+  position: relative;
+}
+.local_title {
+  padding: 3px 10px;
+  cursor: pointer;
+}
+</style>

+ 316 - 0
src/views/Compete/components/programs.vue

@@ -0,0 +1,316 @@
+<template>
+  <el-popover
+    placement="bottom"
+    :visible="visible"
+    :width="800"
+    trigger="click"
+  >
+    <template #reference>
+      <div
+        v-text="program || '请选择节目'"
+        class="el-input__inner"
+        @click="visible = !visible"
+        style="height: 33px;line-height: 33px;min-width: 220px;cursor: pointer;"
+      ></div>
+    </template>
+    <el-form :inline="true" size="small" :model="form" class="demo-form-inline">
+      <el-form-item label="">
+        <el-date-picker
+          v-model="form.data"
+          type="daterange"
+          @change="dateChange"
+          range-separator="-"
+          :disabled-date="disabledDate"
+          start-placeholder="开始时间"
+          end-placeholder="结束时间"
+        />
+      </el-form-item>
+      <el-form-item label="">
+        <local-popver
+          placeholder="请选择频道"
+          @changeEvent="changeChannel"
+          :list="channelList"
+        />
+      </el-form-item>
+      <el-form-item label="">
+        <local-popver
+          placeholder="请选择时间"
+          @changeEvent="changeTime"
+          :list="timeList"
+        />
+      </el-form-item>
+      <el-form-item label="">
+        <local-popver
+          placeholder="请选择星期"
+          @changeEvent="changeWeek"
+          :list="weeks"
+        />
+      </el-form-item>
+      <el-form-item label="">
+        <el-select
+          v-model="form.times"
+          @change="changeTimes"
+          style="width: 120px;"
+          class="programsinput"
+          placeholder="请选择频次"
+        >
+          <el-option
+            v-for="item in firstFrequency"
+            :key="item.value"
+            :label="item.label"
+            :value="item.value"
+          >
+          </el-option>
+        </el-select>
+      </el-form-item>
+    </el-form>
+    <el-table
+      ref="table"
+      @selection-change="handleSelectionChange"
+      :data="tableList"
+      height="300"
+    >
+      <el-table-column type="selection" width="55" />
+      <el-table-column
+        property="epg_name"
+        show-overflow-tooltip
+        label="节目"
+      ></el-table-column>
+      <el-table-column
+        property="tv_name"
+        show-overflow-tooltip
+        label="频道"
+      ></el-table-column>
+      <el-table-column
+        property="weekday"
+        show-overflow-tooltip
+        label="星期"
+      ></el-table-column>
+      <el-table-column
+        property="start_time"
+        show-overflow-tooltip
+        label="时间"
+        width="300"
+      >
+        <template #default="scope">
+          {{ scope.row.start_time.replace(/:00$/, "") }} -
+          {{ scope.row.end_time.replace(/:00$/, "") }}
+        </template>
+      </el-table-column>
+    </el-table>
+    <el-pagination
+      @current-change="handleCurrentChange"
+      :currentPage="page"
+      layout="prev, pager, next"
+      :total="total"
+    ></el-pagination>
+    <div class="progtamsfooter">
+      <el-row class="mb-4">
+        <el-button @click="visible = false">取消</el-button>
+        <el-button type="primary" @click="onSubmit">确定</el-button>
+      </el-row>
+    </div>
+  </el-popover>
+</template>
+
+<script>
+// @ is an alias to /src
+
+import config from "@/config/index";
+
+import localPopver from "./popver.vue";
+import { ElNotification } from "element-plus";
+let selectTable = [];
+export default {
+  name: "Channel",
+  data() {
+    return {
+      form: {
+        times: 0,
+      },
+      program: "",
+      li: [],
+      page: 1,
+      visible: false,
+      size: 10,
+    };
+  },
+  props: ["list"],
+  emits: ["change"],
+  watch: {
+    list() {
+      if (!this.list || !this.list.length) return;
+      this.li = this.list;
+    },
+  },
+  mounted() {
+      selectTable = [];
+  },
+  computed: {
+    channelList() {
+      return this.li.map(v => {
+        return {
+          name: v.tv_name,
+          id: v.tv_id,
+        };
+      });
+    },
+    tableList() {
+      let l = [],
+        n = 0,
+        channel = (this.form.channel || []).join(",") + ",",
+        data = this.form.data || [],
+        time = this.form.time || [],
+        week = this.form.week || [],
+        rtmes = this.form.times || 0;
+      if (channel === ",") channel = "";
+      for (let i = 0; i < this.li.length; i++) {
+        const v = this.li[i],
+          exg = new RegExp(v.tv_name + ",", "g");
+        if (channel && !exg.test(channel)) continue;
+        for (let o = 0; o < (v.epg_list || []).length; o++) {
+          const item = (v.epg_list || [])[o];
+          if (data.length && !this.At(item.start_time, item.end_time, data))
+            continue;
+          if (time.length && !this.Attime(item.start_time, item.end_time, time))
+            continue;
+          if (week.length && !this.Atweek(item.weekday)) continue;
+          if (rtmes != 0 && item.is_live != rtmes ) continue;
+          ++n;
+          if (n <= this.page * this.size - this.size) continue;
+          if (n > this.page * this.size) break;
+          l.push(item);
+        }
+      }
+      return l;
+    },
+    total() {
+      let t = 0,
+        channel = (this.form.channel || []).join(",") + ",",
+        data = this.form.data || [],
+        time = this.form.time || [],
+        week = this.form.week || [],
+        rtmes = this.form.times || 0;
+      if (channel === ",") channel = "";
+      for (let i = 0; i < this.li.length; i++) {
+        const v = this.li[i],
+          exg = new RegExp(v.tv_name + ",", "g");
+        if (channel && !exg.test(channel)) continue;
+        for (let o = 0; o < (v.epg_list || []).length; o++) {
+          const item = (v.epg_list || [])[o];
+          if (data.length > 0 && !this.At(item.start_time, item.end_time, data))
+            continue;
+          if (time.length && !this.Attime(item.start_time, item.end_time, time))
+            continue;
+          if (week.length && !this.Atweek(item.weekday)) continue;
+          if (rtmes != 0 && item.is_live != rtmes ) continue;
+          t++;
+        }
+      }
+      return t;
+    },
+
+    timeList() {
+      let li = new Array(24);
+      li.fill(0);
+      for (let i = 0; i < 24; i++) {
+        li[i] = {
+          name: i,
+          id: i,
+        };
+      }
+      return li;
+    },
+    weeks() {
+      return config.weeks.map(v => {
+        return {
+          name: v.label,
+          id: v.value,
+        };
+      });
+    },
+    firstFrequency() {
+      return config.frequency;
+    },
+  },
+  methods: {
+    handleSelectionChange(val) {
+      selectTable = val || [];
+    },
+    onSubmit() {
+      if (selectTable.length > 1)
+        return ElNotification({
+          message: "请选择一个节目",
+          title: "Warning",
+          type: "warning",
+        });
+      this.visible = false;
+      this.program = selectTable[0].epg_name
+      this.$emit("change", selectTable);
+    },
+    disabledDate(time) {
+      return time.getTime() > Date.now();
+    },
+    handleCurrentChange(p) {
+      this.page = p;
+    },
+    dateChange() {
+      this.page = 1;
+    },
+    changeChannel(li) {
+      this.page = 1;
+      this.form.channel = li;
+    },
+    changeTime(li) {
+      this.page = 1;
+      this.form.time = li;
+    },
+    changeWeek(li) {
+      this.page = 1;
+      this.form.week = li;
+    },
+    changeTimes(li) {
+      this.page = 1;
+      console.log(li);
+    },
+    At(sT, eT, rang) {
+      if (!rang.length) return false;
+      let s = new Date(sT.split(" ")[0] + " 00:00:00");
+      let e = new Date(eT.split(" ")[0] + " 00:00:00");
+      let start = s <= rang[1] - 0 && s >= rang[0] - 0;
+      let end = e <= rang[1] - 0 && e >= rang[0] - 0;
+      return start || end;
+    },
+    Attime(sT, eT, rang) {
+      let out = false;
+      if (!rang.length) return out;
+      let s = sT.split(" ")[1].split(":");
+      let e = eT.split(" ")[1].split(":");
+      for (let i = 0; i < rang.length; i++) {
+        const v = rang[i];
+        if (v === s[0] - 0 || v === e[0] - 0) {
+          out = true;
+          break;
+        }
+      }
+      return out;
+    },
+    Atweek(w) {
+      const exg = new RegExp(w + ",", "g"),
+        weeks = (this.form.week || []).join(",") + ",";
+      return exg.test(weeks);
+    },
+  },
+  components: { localPopver },
+};
+</script>
+
+<style>
+.programsinput .el-input__inner {
+  border: none;
+}
+.progtamsfooter {
+  padding: 10px 0;
+  text-align: center;
+}
+</style>