liyongli 3 роки тому
батько
коміт
a62da5143f

+ 29 - 1
src/api/kuyun.js

@@ -288,4 +288,32 @@ export function tvlistexport(data,fileName,  call){
     url: "/api/evaluation/eye/download/api/eye/TvDailyAVGKPITrendAction?" + data,
     method: "get",
   },fileName, call);
-}
+}
+
+
+/**
+ * tvList
+ * @props
+ * @return {AxjxPromise}
+ */
+ export function tvrange(data){
+    return ajax({
+      urlType: "kuyunApi",
+      url: "/api/evaluation/eye/TvKPILeaderboardAction",
+      method: "get",
+      data
+    });
+  }
+  /**
+   * tvList 导出
+   * @props
+   * @return {AxjxPromise}
+   */
+  export function tvrangeexport(data,fileName,  call){
+    return fileDownload({
+      urlType: "kuyunApi",
+      url: "/api/evaluation/eye/download/api/eye/TvKPILeaderboardAction",
+      data,
+      method: "get",
+    },fileName, call);
+  }

+ 2 - 2
src/router/index.js

@@ -50,8 +50,8 @@ const routes = [
             component: ()=> import("../views/ChannelEPG/Channel.vue")
         },
         {
-            path: "/country/custom", // 自定义时间段排行
-            component: ()=> import("../views/customRanking/customRanking.vue")
+            path: "/country/customRanking", // 自定义时间段排行
+            component: ()=> import("../views/CustomRanking/CustomRanking.vue")
         },
         {
             path: "/country/channelList", // 多维度筛选 频道时段排名

+ 138 - 71
src/views/customRanking/customRanking.vue → src/views/CustomRanking/CustomRanking.vue

@@ -2,7 +2,7 @@
   <div class="customRanking">
     <el-breadcrumb separator-class="el-icon-arrow-right">
       <el-breadcrumb-item>传统媒体</el-breadcrumb-item>
-      <el-breadcrumb-item>频道全天节目</el-breadcrumb-item>
+      <el-breadcrumb-item>自定义时段 频道收视排行</el-breadcrumb-item>
     </el-breadcrumb>
     <el-card class="box-card">
       <el-form
@@ -13,6 +13,14 @@
         label-width="120px"
         class="demo-form-inline"
       >
+        <el-form-item label="频道">
+          <el-autocomplete
+            v-model="form.program"
+            :fetch-suggestions="querySearchAsync"
+            placeholder="请输入频道"
+            @select="handleSelect"
+          />
+        </el-form-item>
         <el-form-item label="日期">
           <el-date-picker
             v-model="form.date"
@@ -30,37 +38,35 @@
             v-model="form.rangeTime"
             is-range
             format="HH:mm"
-            @change="() => (form.rangeTimeRange = [])"
+            @change="() => (form.filter.time = [])"
             range-separator="-"
             start-placeholder="开始时间"
+            value-format="HH:mm"
             end-placeholder="结束时间"
           >
           </el-time-picker>
         </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.rangeTimeRange"
-            placeholder="请选择时段"
+            v-model="form.filter[v.key]"
+            :placeholder="'请选择' + v.name"
+            multiple
             collapse-tags
-            clearable
-            @change="timeSelect"
+            @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 cycle"
-              :key="item.value"
-              :label="item.label"
-              :value="item.value"
-              :disabled="item.disabled"
+              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-select
-            v-model="form.channelGroup"
-            placeholder="请选择频道组"
-            @change="channelSelect"
-          >
+          <el-select v-model="form.tv_type" placeholder="请选择频道组">
             <el-option
               v-for="item in channelList"
               :key="item.value"
@@ -75,9 +81,8 @@
           <el-cascader
             v-model="form.region"
             :options="region"
-            :props="{children: 'options'}"
+            :props="{ children: 'options' }"
           ></el-cascader>
-
         </el-form-item>
         <el-form-item style="float: right">
           <el-button type="primary" @click="onSubmit">查询</el-button>
@@ -140,20 +145,20 @@
 
 <script>
 // @ is an alias to /src
-// import {  } from "@/api/index";
+import { overlapSearchTitle, selectDate, tvrange,tvrangeexport } from "@/api/kuyun";
+
 import config from "@/config/index";
 
 export default {
   name: "CustomRanking",
   data() {
     return {
+      searchDate: [],
       form: {
+        filter: {},
         rangeTime: [],
-        channelGroup: 0,
-        date: [
-          new Date(new Date() - 86400000),
-          new Date(new Date() - 86400000),
-        ],
+        tv_type: 0,
+        date: [],
         region: -1,
       },
       total: {},
@@ -178,12 +183,33 @@ export default {
     };
   },
   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("-")];
     this.total = this.tableData[0] || {};
+    selectDate({
+      date: this.form.date,
+      key: "time",
+      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;
+        }
+      }
+    });
   },
   computed: {
-    cycle() {
-      return config.cycle;
-    },
     channelList() {
       return config.channelList;
     },
@@ -192,59 +218,70 @@ export default {
     },
   },
   methods: {
-    rogressText(v, key) {
-      return (v[key] * 100).toFixed(4) + "%";
+    handleSelect(item) {
+      this.form.tv_id = item.id || "";
     },
-    timeSelect(a) {
-      let end = (a || [])[(a || []).length - 1];
-      if (this.form.rangeTimeRange.length === config.cycle.length - 1) {
-        this.form.rangeTimeRange = ["0000_2400"];
-      } else {
-        let n = (this.form.rangeTimeRange || []).sort((a, b) => {
-          let aNum = a.split("_")[0];
-          let bNum = b.split("_")[0];
-          return aNum - bNum;
-        });
-        let isSelect = true;
-        for (let i = 0; i < n.length - 1; i++) {
-          let aNum = n[i].split("_")[1];
-          let bNum = n[i + 1].split("_")[0];
-          if (aNum !== bNum) {
-            isSelect = false;
-            break;
-          }
-        }
-        if (!isSelect) {
-          let arr = (n.join(",") + ",")
-            .replace(end + ",", "")
-            .replace(/,$/, "");
-          this.form.rangeTimeRange = arr.split(",");
-        }
+    querySearchAsync(queryString, cb) {
+      if (!queryString) {
+        cb([]);
+        return;
       }
-      if (!this.form.rangeTimeRange.length) return;
-      let s = this.form.rangeTimeRange[0].split("_")[0];
-      let e = this.form.rangeTimeRange[
-        this.form.rangeTimeRange.length - 1
-      ].split("_");
-      e = e[e.length - 1];
-      if (e == "2400") e = "2359";
-      this.form.rangeTime = [
-        new Date(1970, 1, 1, s[0] + s[1] - 0, s[2] + s[3] - 0),
-        new Date(1970, 1, 1, e[0] + e[1] - 0, e[2] + e[3] - 0),
-      ];
+      overlapSearchTitle("kw=" + queryString).then(r => {
+        let li = (r || []).map(v => {
+          return {
+            value: v.name,
+            id: v.id,
+          };
+        });
+        cb(li);
+      });
+    },
+    rogressText(v, key) {
+      return (v[key] * 100).toFixed(4) + "%";
     },
 
-    onExport() {},
+    onExport() {
+      let d = this.form.date || [];
+      let time =
+        this.form.filter.time && this.form.filter.time.length
+          ? this.form.filter.time
+          : (this.form.rangeTime || []).join("_");
+          tvrangeexport({
+            tv_id: this.form.tv_id,
+            area_id: this.form.region,
+            weekday: 0,
+            tv_type: this.form.tv_type,
+            start: d[0] ? d[0] + "+00:00:00" : "",
+            end: d[1] ? d[1] + "+23:59:59" : "",
+            time_range: time,
+          }, '自定义时段 频道收视排行.csv')
+    },
     disabledDate(time) {
       return time.getTime() > Date.now() - 86400000;
     },
-    onSubmit() {},
+    onSubmit() {
+      let d = this.form.date || [];
+      let time =
+        this.form.filter.time && this.form.filter.time.length
+          ? this.form.filter.time
+          : (this.form.rangeTime || []).join("_");
+      tvrange({
+        tv_id: this.form.tv_id,
+        area_id: this.form.region,
+        weekday: 0,
+        tv_type: this.form.tv_type,
+        start: d[0] ? d[0] + "+00:00:00" : "",
+        end: d[1] ? d[1] + "+23:59:59" : "",
+        time_range: time,
+      }).then(r => {
+        let li = r || { list: [] };
+        this.tableData = li.list;
+        this.total = this.tableData[0] || {};
+      });
+    },
     matrer(row, column, cellValue) {
       return (cellValue * 100).toFixed(4) + "%";
     },
-    channelSelect(a) {
-      this.selectAll(a, "channelGroup", 0);
-    },
     selectAll(a, key, val) {
       if (!a.length) return;
       let select = a[a.length - 1];
@@ -255,6 +292,36 @@ export default {
           .replace(/,$/, "")
           .split(",");
     },
+
+    select(v, se) {
+      this.timesSelect(se, v.id, "0000_2400");
+      this.rangeTime = [];
+    },
+
+    timesSelect(a, key, all) {
+      let ngx = new RegExp(all + ",?", "g");
+      let li = [];
+      let end = (a || [])[(a || []).length - 1],
+        s = (a || []).join(",").replace(ngx, "");
+      if (end !== all) li = s ? s.split(",") : [];
+      else li = [all];
+      li = li.sort((a, b) => {
+        let as = a.split("_");
+        let bs = b.split("_");
+        return as[0] - bs[0];
+      });
+      for (let i = 1; i < li.length; i++) {
+        const ov = li[i - 1].split("_");
+        const v = li[i].split("_");
+
+        if (ov[1] !== v[0]) {
+          break; // 时间不完整
+        }
+      }
+
+      this.form.filter[key] = li;
+      this.form.rangeTime = [];
+    },
   },
   components: {},
 };

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

@@ -304,17 +304,6 @@ export default {
       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");