liyongli há 3 anos atrás
pai
commit
83a6e33e92

+ 21 - 8
src/api/kuyun.js

@@ -8,14 +8,27 @@ import fileDownload from "@/utils/download.js";
  * @param {*} data
  * @returns {AxjxPromise}
  */
-export function selectDate(data) {
-  return ajax({
-    urlType: "kuyunApi",
-    url: "/api/evaluation/eye/performance/absepg_filter",
-    method: "POST",
-    data,
-  });
-}
+ export function selectDate(data) {
+    return ajax({
+      urlType: "kuyunApi",
+      url: "/api/evaluation/eye/performance/absepg_filter",
+      method: "POST",
+      data,
+    });
+  }
+  /**
+   *
+   * @param {*} data
+   * @returns {AxjxPromise}
+   */
+  export function epgselectDate(data) {
+    return ajax({
+      urlType: "kuyunApi",
+      url: "/api/evaluation/eye/performance/epg_filter",
+      method: "POST",
+      data,
+    });
+  }
 
 /**
  * 频道全天节目

+ 233 - 237
src/views/Program/Program.vue

@@ -1,5 +1,5 @@
 <template>
-  <div class="SingleDay">
+  <div class="AbstractProgram">
     <el-breadcrumb separator-class="el-icon-arrow-right">
       <el-breadcrumb-item>传统媒体</el-breadcrumb-item>
       <el-breadcrumb-item>节目点分钟</el-breadcrumb-item>
@@ -13,6 +13,26 @@
         label-width="120px"
         class="demo-form-inline"
       >
+        <el-form-item label="具体节目">
+          <el-select
+            v-model="form.filter.abs_epg"
+            multiple
+            filterable
+            collapse-tags
+            remote
+            placeholder="请输入节目名"
+            reserve-keyword
+            :remote-method="querySearchAsync"
+          >
+            <el-option
+              v-for="item in selectList"
+              :key="item.id"
+              :label="item.name"
+              :value="item.id"
+            >
+            </el-option>
+          </el-select>
+        </el-form-item>
         <el-form-item label="日期">
           <el-date-picker
             v-model="form.date"
@@ -24,71 +44,93 @@
           >
           </el-date-picker>
         </el-form-item>
-        <el-form-item label="节目选择">
-            <el-cascader
-            v-model="form.egp"
-            collapse-tags
-            :options="region"
-            :props="{ multiple: true,children: 'options' }"
-          ></el-cascader>
-        </el-form-item>
-        <el-form-item label="区域">
+
+        <el-form-item :label="v.name" v-for="(v, i) in searchDate" :key="i">
           <el-select
-            v-model="form.region"
-            placeholder="请选择区域"
-            @change="regionSelect"
+            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 region"
-              :key="item.value"
-              :label="item.label"
-              :value="item.value"
+              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" @click="onSubmit">查询</el-button>
-          <el-button type="primary" @click="onExport">导出</el-button>
+          <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="tableDate"
-        xName="date"
+        :list="tableData"
+        v-if="tableData.length"
+        xName="abs_epg"
         :keys="chartKeys"
       ></line-charts>
       <el-table
-        :data="tableDate"
+        :data="tableData"
         :header-cell-style="{ backgroundColor: '#f4f5f7', color: '#606266' }"
         style="width: 100%"
       >
         <el-table-column
           align="center"
           show-overflow-tooltip
-          width="400px"
-          prop="date"
-          label="日期"
+          prop="abs_epg"
+          label="具体节目"
           class-name="nowrap"
         />
         <el-table-column
-          v-for="(item, i) in tableKeys"
-          :key="'table' + i"
-          align="center"
-          :prop="item.key"
+          prop="indicators_loyal"
           :formatter="matrer"
-          :label="item.name"
-        >
-          <el-table-column
-            v-for="(li, o) in item.children"
-            :key="i + '-' + o"
-            :prop="li.key"
-            :label="li.name"
-            :formatter="matrer"
-          />
-        </el-table-column>
+          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>
@@ -96,7 +138,7 @@
 
 <script>
 // @ is an alias to /src
-// import {  } from "@/api/index";
+import { epgselectDate, epgcountry,overlapSearchTitle } from "@/api/kuyun";
 
 import lineCharts from "@/views/Country/components/lineCharts";
 
@@ -105,221 +147,159 @@ export default {
   name: "Channel",
   data() {
     return {
-      form: {
-        date: [
-          new Date(new Date() - 86400000),
-          new Date(new Date() - 86400000),
-        ],
-        region: 9,
-        epg: -1
-      },
-      tableData: [
-        {
-          abs_epg: "好管家",
-          ca_types: "生活服务",
-          channel_0: "陕西卫视",
-          day: "2022-01-11",
-          default: "34城",
-          epg: "好管家 - 陕西卫视 - 2022-01-11 21:50~22:26",
-          epg_id: 64969089,
-          indicators_market_ratings: 0.002729,
-          indicators_tv_ratings: 0.00045,
-          is_live: "首播",
-          m: 1310,
-          minute: "21:50",
-          month: "2022-01",
-          start_time: 1641909000000,
-          tv_id: "48",
-          week: "星期二",
-          weekrange: "01-10 ~ 01-16",
-          year: "2022",
-        },
-        {
-          abs_epg: "好管家",
-          ca_types: "生活服务",
-          channel_0: "陕西卫视",
-          day: "2022-01-11",
-          default: "34城",
-          epg: "好管家 - 陕西卫视 - 2022-01-11 21:50~22:26",
-          epg_id: 64969089,
-          indicators_market_ratings: 0.002558,
-          indicators_tv_ratings: 0.000419,
-          is_live: "首播",
-          m: 1311,
-          minute: "21:51",
-          month: "2022-01",
-          start_time: 1641909000000,
-          tv_id: "48",
-          week: "星期二",
-          weekrange: "01-10 ~ 01-16",
-          year: "2022",
-        },
+      searchDate: [],
+      rangeTime: [],
+      selectList:[],
+      chartKeys: [
         {
-          abs_epg: "新闻+",
-          ca_types: "新闻",
-          channel_0: "吉林卫视",
-          day: "2017-08-20",
-          default: "34城",
-          epg: "新闻+ - 吉林卫视 - 2017-08-20 23:06~23:27",
-          epg_id: 42434466,
-          indicators_market_ratings: 0.002738,
-          indicators_tv_ratings: 0.000272,
-          is_live: "首播",
-          m: 1386,
-          minute: "23:06",
-          month: "2017-08",
-          start_time: 1503241560000,
-          tv_id: "41",
-          week: "星期日",
-          weekrange: "08-14 ~ 08-20",
-          year: "2017",
+          key: "indicators_market_ratings",
+          name: "市占率",
         },
         {
-          abs_epg: "新闻+",
-          ca_types: "新闻",
-          channel_0: "吉林卫视",
-          day: "2017-08-20",
-          default: "34城",
-          epg: "新闻+ - 吉林卫视 - 2017-08-20 23:06~23:27",
-          epg_id: 42434466,
-          indicators_market_ratings: 0.002485,
-          indicators_tv_ratings: 0.000244,
-          is_live: "首播",
-          m: 1387,
-          minute: "23:07",
-          month: "2017-08",
-          start_time: 1503241560000,
-          tv_id: "41",
-          week: "星期日",
-          weekrange: "08-14 ~ 08-20",
-          year: "2017",
+          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() {},
-  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;
+  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("-")];
+    epgselectDate({
+      date: this.form.date,
+      key: "epg,area_t_1",
+      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 + ""];
       }
-      return li;
+      epgcountry(this.form)
+        .then(r => {
+          this.tableData = r || [];
+          this.loading = false;
+        })
+        .catch(() => {
+          this.loading = false;
+        });
+    });
+  },
+  computed: {},
+  methods: {
+    querySearchAsync(queryString) {
+      if (!queryString) {
+        this.selectList = [];
+        return;
+      }
+      overlapSearchTitle("kw=" + queryString + "&ft=1").then(r => {
+        this.selectList = r || [];
+      });
     },
-    tableDate() {
-      const obj = {};
-
-      const b = [
-        {
-          key: "indicators_tv_ratings",
-          name: "直播关注度",
-        },
-        {
-          key: "indicators_market_ratings",
-          name: "市占率",
-        },
-      ];
-      for (let i = 0; i < this.tableData.length; i++) {
-        const v = this.tableData[i];
-        if (typeof obj[v.epg] !== "object") obj[v.epg] = {};
-        obj[v.epg][v.minute] = v;
+    onExport() {
+      this.loading1 = true;
+      let form = JSON.parse(JSON.stringify(this.form));
+      if (this.rangeTime.length) {
+        form.filter.time = this.rangeTime;
       }
-      let li = [],
-        keys = Object.keys(obj),
-        dataLen = [];
+      let keys = Object.keys(this.form.filter);
+      form.filter.time = ["0000_2400"];
       for (let i = 0; i < keys.length; i++) {
-        const k = keys[i];
-        dataLen.push(...Object.keys(obj[k]));
-      }
-      for (let i = 0; i < dataLen.length; i++) {
-        let p = {};
-        for (let o = 0; o < keys.length; o++) {
-          const v = obj[keys[o]][dataLen[i]];
-          if (!v) continue;
-
-          b.map(k => {
-            p[keys[o] + "_" + k.key] = v[k.key] || 0;
-          });
+        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;
+          }
         }
-        li.push({
-          date: dataLen[i],
-          ...p,
-        });
-      }
-      return li;
-    },
-    chartKeys() {
-      const obj = {},
-        li = [];
-      for (let i = 0; i < this.tableData.length; i++) {
-        const b = [
-          {
-            key: "indicators_tv_ratings",
-            name: "直播关注度",
-          },
-          {
-            key: "indicators_market_ratings",
-            name: "市占率",
-          },
-        ];
-        const v = this.tableData[i];
-        if (obj[v.epg] === true) continue;
-        obj[v.epg] = true;
-        li.push(
-          ...b.map(k => {
-            k.key = v.epg + "_" + k.key;
-            k.name = v.epg + "_" + k.name;
-            return k;
-          })
-        );
       }
-      return li;
-    },
-    tableKeys() {
-      const obj = {},
-        li = [];
-      for (let i = 0; i < this.tableData.length; i++) {
-        const b = [
-          {
-            key: "indicators_tv_ratings",
-            name: "直播关注度",
-          },
-          {
-            key: "indicators_market_ratings",
-            name: "市占率",
-          },
-        ];
-        const v = this.tableData[i];
-        if (obj[v.epg] === true) continue;
-        obj[v.epg] = true;
-        li.push({
-          name: v.epg,
-          children: b.map(k => {
-            k.key = v.epg + "_" + k.key;
-            return k;
-          }),
+      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;
         });
-      }
-      return li;
     },
-  },
-  methods: {
-    onExport() {},
     disabledDate(time) {
       return time.getTime() > Date.now() - 86400000;
     },
-    onSubmit() {},
-    matrer(row, column, cellValue) {
-      let val = cellValue || 0;
-      return (val * 100).toFixed(4) - 0 + "%";
+    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;
+        });
     },
-    regionSelect(a) {
-      this.selectAll(a, "region", -1);
+    matrer(row, column, cellValue) {
+      if (typeof cellValue !== "number") return cellValue;
+      return (cellValue * 100).toFixed(4) - 0 + "%";
     },
     selectAll(a, key, val) {
       if (!a.length) return;
@@ -331,16 +311,32 @@ export default {
           .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>
-.SingleDay {
+.AbstractProgram {
   margin: 10px 15px;
 }
-.SingleDay .nowrap .cell {
+.AbstractProgram .nowrap .cell {
   white-space: nowrap;
 }
 </style>

+ 34 - 2
src/views/SpecificProgram/SpecificProgram.vue

@@ -13,6 +13,26 @@
         label-width="120px"
         class="demo-form-inline"
       >
+        <el-form-item label="具体节目">
+          <el-select
+            v-model="form.filter.abs_epg"
+            multiple
+            filterable
+            collapse-tags
+            remote
+            placeholder="请输入节目名"
+            reserve-keyword
+            :remote-method="querySearchAsync"
+          >
+            <el-option
+              v-for="item in selectList"
+              :key="item.id"
+              :label="item.name"
+              :value="item.id"
+            >
+            </el-option>
+          </el-select>
+        </el-form-item>
         <el-form-item label="日期">
           <el-date-picker
             v-model="form.date"
@@ -118,7 +138,7 @@
 
 <script>
 // @ is an alias to /src
-import { selectDate, epgcountry } from "@/api/kuyun";
+import { selectDate, epgcountry,overlapSearchTitle } from "@/api/kuyun";
 
 import lineCharts from "@/views/Country/components/lineCharts";
 
@@ -129,6 +149,7 @@ export default {
     return {
       searchDate: [],
       rangeTime: [],
+      selectList:[],
       chartKeys: [
         {
           key: "indicators_market_ratings",
@@ -140,7 +161,9 @@ export default {
         },
       ],
       form: {
-        filter: {},
+        filter: {
+            abs_epg:[]
+        },
         date: [],
         field: [
         "epg",
@@ -195,6 +218,15 @@ export default {
   },
   computed: {},
   methods: {
+    querySearchAsync(queryString) {
+      if (!queryString) {
+        this.selectList = [];
+        return;
+      }
+      overlapSearchTitle("kw=" + queryString + "&ft=1").then(r => {
+        this.selectList = r || [];
+      });
+    },
     onExport() {
       this.loading1 = true;
       let form = JSON.parse(JSON.stringify(this.form));

+ 31 - 1
src/views/SpecificProgramQuery/SpecificProgramQuery.vue

@@ -13,6 +13,26 @@
         label-width="120px"
         class="demo-form-inline"
       >
+        <el-form-item label="具体节目">
+          <el-select
+            v-model="form.filter.abs_epg"
+            multiple
+            filterable
+            collapse-tags
+            remote
+            placeholder="请输入节目名"
+            reserve-keyword
+            :remote-method="querySearchAsync"
+          >
+            <el-option
+              v-for="item in selectList"
+              :key="item.id"
+              :label="item.name"
+              :value="item.id"
+            >
+            </el-option>
+          </el-select>
+        </el-form-item>
         <el-form-item label="日期">
           <el-date-picker
             v-model="form.date"
@@ -117,7 +137,7 @@
 
 <script>
 // @ is an alias to /src
-import { selectDate, epgcountry } from "@/api/kuyun";
+import { selectDate, epgcountry,overlapSearchTitle } from "@/api/kuyun";
 
 import lineCharts from "@/views/Country/components/lineCharts";
 
@@ -128,6 +148,7 @@ export default {
     return {
       searchDate: [],
       rangeTime: [],
+      selectList:[],
       chartKeys: [
         {
           key: "indicators_market_ratings",
@@ -202,6 +223,15 @@ export default {
   },
   computed: {},
   methods: {
+    querySearchAsync(queryString) {
+      if (!queryString) {
+        this.selectList = [];
+        return;
+      }
+      overlapSearchTitle("kw=" + queryString + "&ft=1").then(r => {
+        this.selectList = r || [];
+      });
+    },
     onExport() {
       this.loading1 = true;
       let form = JSON.parse(JSON.stringify(this.form));