AbstractProgramQuery.vue 8.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299
  1. <template>
  2. <div class="AbstractProgram">
  3. <el-breadcrumb separator-class="el-icon-arrow-right">
  4. <el-breadcrumb-item>传统媒体</el-breadcrumb-item>
  5. <el-breadcrumb-item>抽象节目剧目查询</el-breadcrumb-item>
  6. </el-breadcrumb>
  7. <el-card class="box-card">
  8. <el-form
  9. ref="form"
  10. :model="form"
  11. size="small"
  12. :inline="true"
  13. label-width="120px"
  14. class="demo-form-inline"
  15. >
  16. <el-form-item label="日期">
  17. <el-date-picker
  18. v-model="form.date"
  19. type="daterange"
  20. :disabled-date="time => disabledDate(time)"
  21. range-separator="-"
  22. start-placeholder="开始日期"
  23. end-placeholder="结束日期"
  24. >
  25. </el-date-picker>
  26. </el-form-item>
  27. <el-form-item :label="v.name" v-for="(v, i) in searchDate" :key="i">
  28. <el-select
  29. v-model="form.filter[v.key]"
  30. :placeholder="'请选择' + v.name"
  31. multiple
  32. collapse-tags
  33. @change="se => select(v, se)"
  34. >
  35. <el-option key="-1" v-if="v.id !== 'time'" label="全选" value="-1">
  36. </el-option>
  37. <el-option
  38. v-for="item in v.list || []"
  39. :key="item.id + ''"
  40. :label="item.name"
  41. :value="item.key + ''"
  42. >
  43. </el-option>
  44. </el-select>
  45. </el-form-item>
  46. <el-form-item label="时间">
  47. <el-time-picker
  48. v-model="rangeTime"
  49. is-range
  50. format="HH:mm"
  51. range-separator="-"
  52. @change="() => (form.filter.time = [])"
  53. start-placeholder="开始时间"
  54. end-placeholder="结束时间"
  55. >
  56. </el-time-picker>
  57. </el-form-item>
  58. <el-form-item style="float: right">
  59. <el-button type="primary" :loading="loading" @click="onSubmit"
  60. >查询</el-button
  61. >
  62. <el-button type="primary" :loading="loading1" @click="onExport"
  63. >导出</el-button
  64. >
  65. </el-form-item>
  66. </el-form>
  67. </el-card>
  68. <br />
  69. <el-card class="box-card">
  70. <line-charts
  71. :list="tableData"
  72. v-if="tableData.length"
  73. xName="abs_epg"
  74. :keys="chartKeys"
  75. ></line-charts>
  76. <el-table
  77. :data="tableData"
  78. :header-cell-style="{ backgroundColor: '#f4f5f7', color: '#606266' }"
  79. style="width: 100%"
  80. >
  81. <el-table-column
  82. align="center"
  83. show-overflow-tooltip
  84. prop="abs_epg"
  85. label="抽象节目"
  86. class-name="nowrap"
  87. />
  88. <el-table-column align="center" prop="time" label="时段" />
  89. <el-table-column
  90. prop="indicators_market_ratings"
  91. :formatter="matrer"
  92. label="市占率"
  93. />
  94. <el-table-column
  95. prop="indicators_tv_ratings"
  96. :formatter="matrer"
  97. label="直播关注度"
  98. />
  99. </el-table>
  100. </el-card>
  101. </div>
  102. </template>
  103. <script>
  104. // @ is an alias to /src
  105. import { selectDate, country } from "@/api/kuyun";
  106. import lineCharts from "@/views/Country/components/lineCharts";
  107. import config from "@/config/index";
  108. export default {
  109. name: "Channel",
  110. data() {
  111. return {
  112. searchDate: [],
  113. rangeTime: [],
  114. chartKeys: [
  115. {
  116. key: "indicators_market_ratings",
  117. name: "市占率",
  118. },
  119. {
  120. key: "indicators_tv_ratings",
  121. name: "直播关注度",
  122. },
  123. ],
  124. form: {
  125. filter: {},
  126. date: [
  127. new Date(new Date() - 86400000),
  128. new Date(new Date() - 86400000),
  129. ],
  130. field: [
  131. "abs_epg",
  132. "time",
  133. "indicators_market_ratings",
  134. "indicators_tv_ratings",
  135. ],
  136. info: 1,
  137. org_id: 20,
  138. },
  139. tableData: [],
  140. loading: false,
  141. loading1: false,
  142. };
  143. },
  144. mounted() {
  145. const d = new Date(Date.now() - 86400000);
  146. let Y = d.getFullYear(),
  147. M = d.getMonth() + 1,
  148. D = d.getDate();
  149. M > 9 ? "" : (M = "0" + M);
  150. D > 9 ? "" : (D = "0" + D);
  151. this.form.date = [[Y - 1, M, D].join("-"), [Y, M, D].join("-")];
  152. selectDate({
  153. date: this.form.date,
  154. key: "channel_0,area_t_1,area_c_9,area_c_1,abs_epg,time,week",
  155. org_id: 20,
  156. }).then(r => {
  157. let area = false;
  158. this.searchDate = r || [];
  159. for (let i = 0; i < this.searchDate.length; i++) {
  160. const v = this.searchDate[i];
  161. if (/area/.test(v.id)) {
  162. if (area) continue;
  163. area = true;
  164. this.form.filter[v.id] = [v.list[0].key + ""];
  165. continue;
  166. }
  167. this.form.filter[v.id] = [v.list[0].key + ""];
  168. }
  169. country(this.form)
  170. .then(r => {
  171. this.tableData = r || [];
  172. this.loading = false;
  173. })
  174. .catch(() => {
  175. this.loading = false;
  176. });
  177. });
  178. },
  179. computed: {},
  180. methods: {
  181. onExport() {
  182. this.loading1 = true;
  183. let form = JSON.parse(JSON.stringify(this.form));
  184. if (this.rangeTime.length) {
  185. form.filter.time = this.rangeTime;
  186. }
  187. let keys = Object.keys(this.form.filter);
  188. form.filter.time = ["0000_2400"];
  189. for (let i = 0; i < keys.length; i++) {
  190. const v = keys[i];
  191. if (v === "time") continue;
  192. for (let o = 0; o < this.searchDate.length; o++) {
  193. const item = this.searchDate[o];
  194. if (v === item.key) {
  195. form.filter[v] = item.list.map(v => v.key);
  196. break;
  197. }
  198. }
  199. }
  200. fetch(
  201. config.kuyunApi +
  202. "/kuyun/api/evaluation/eye/download/performance/epgkpi/download",
  203. {
  204. method: "post",
  205. responseType: "blob",
  206. body: JSON.stringify(form),
  207. }
  208. )
  209. .then(res => {
  210. return res.blob();
  211. })
  212. .then(blob => {
  213. new Blob([blob]);
  214. let fileName = "抽象节目剧目查询.csv";
  215. var link = document.createElement("a");
  216. link.href = window.URL.createObjectURL(blob);
  217. link.download = fileName;
  218. link.click();
  219. window.URL.revokeObjectURL(link.href);
  220. this.loading1 = false;
  221. });
  222. },
  223. disabledDate(time) {
  224. return time.getTime() > Date.now() - 86400000;
  225. },
  226. onSubmit() {
  227. this.loading = true;
  228. let form = JSON.parse(JSON.stringify(this.form));
  229. if (this.rangeTime.length) {
  230. form.filter.time = this.rangeTime;
  231. }
  232. let keys = Object.keys(this.form.filter);
  233. for (let i = 0; i < keys.length; i++) {
  234. const v = keys[i];
  235. if (form.filter[v] != -1) continue;
  236. for (let o = 0; o < this.searchDate.length; o++) {
  237. const item = this.searchDate[o];
  238. if (v === item.key) {
  239. form.filter[v] = item.list.map(v => v.key);
  240. break;
  241. }
  242. }
  243. }
  244. country(form)
  245. .then(r => {
  246. this.tableData = r || [];
  247. this.loading = false;
  248. })
  249. .catch(() => {
  250. this.loading = false;
  251. });
  252. },
  253. matrer(row, column, cellValue) {
  254. if (typeof cellValue !== "number") return cellValue;
  255. return (cellValue * 100).toFixed(4) - 0 + "%";
  256. },
  257. selectAll(a, key, val) {
  258. if (!a.length) return;
  259. let select = a[a.length - 1];
  260. if (select === val) this.form[key] = [val];
  261. else
  262. this.form[key] = (a.join(",") + ",")
  263. .replace(val + ",", "")
  264. .replace(/,$/, "")
  265. .split(",");
  266. },
  267. select(v, se) {
  268. if (v.id === "time") {
  269. this.timeSelect(se, v.id, "0000_2400");
  270. this.rangeTime = [];
  271. } else this.timeSelect(se, v.id, "-1");
  272. },
  273. timeSelect(a, key, all) {
  274. let ngx = new RegExp(all + ",?", "g");
  275. let end = (a || [])[(a || []).length - 1],
  276. s = (a || []).join(",").replace(ngx, "");
  277. if (end !== all) this.form.filter[key] = s ? s.split(",") : [];
  278. else this.form.filter[key] = [all];
  279. this.rangeTime = [];
  280. },
  281. },
  282. components: { lineCharts },
  283. };
  284. </script>
  285. <style>
  286. .AbstractProgram {
  287. margin: 10px 15px;
  288. }
  289. .AbstractProgram .nowrap .cell {
  290. white-space: nowrap;
  291. }
  292. </style>