Channel.vue 8.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310
  1. <template>
  2. <div class="program">
  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-item>收视分析</el-breadcrumb-item>
  7. </el-breadcrumb>
  8. <el-card class="box-card">
  9. <el-form
  10. ref="form"
  11. :model="form"
  12. size="small"
  13. :inline="true"
  14. label-width="120px"
  15. class="demo-form-inline"
  16. >
  17. <el-form-item label="日期">
  18. <el-date-picker
  19. v-model="form.date"
  20. type="daterange"
  21. :disabled-date="time => disabledDate(time)"
  22. range-separator="-"
  23. start-placeholder="开始日期"
  24. end-placeholder="结束日期"
  25. >
  26. </el-date-picker>
  27. </el-form-item>
  28. <el-form-item label="时间">
  29. <el-time-picker
  30. v-model="form.rangeTime"
  31. is-range
  32. format="HH:mm"
  33. @change="() => (form.rangeTimeRange = [])"
  34. range-separator="-"
  35. start-placeholder="开始时间"
  36. end-placeholder="结束时间"
  37. >
  38. </el-time-picker>
  39. </el-form-item>
  40. <el-form-item label="时段">
  41. <el-select
  42. v-model="form.rangeTimeRange"
  43. placeholder="请选择时段"
  44. multiple
  45. collapse-tags
  46. clearable
  47. @change="timeSelect"
  48. >
  49. <el-option
  50. v-for="item in cycle"
  51. :key="item.value"
  52. :label="item.label"
  53. :value="item.value"
  54. :disabled="item.disabled"
  55. >
  56. </el-option>
  57. </el-select>
  58. </el-form-item>
  59. <el-form-item label="频道组">
  60. <el-select
  61. v-model="form.channelGroup"
  62. placeholder="请选择频道组"
  63. @change="channelSelect"
  64. >
  65. <el-option
  66. v-for="item in channelList"
  67. :key="item.value"
  68. :label="item.label"
  69. :value="item.value"
  70. :disabled="item.disabled"
  71. >
  72. </el-option>
  73. </el-select>
  74. </el-form-item>
  75. <el-form-item label="区域">
  76. <el-select
  77. v-model="form.region"
  78. placeholder="请选择区域"
  79. @change="regionSelect"
  80. >
  81. <el-option-group
  82. v-for="group in region"
  83. :key="group.value"
  84. :label="group.label"
  85. >
  86. <el-option
  87. v-for="item in group.options"
  88. :key="item.value"
  89. :label="item.label"
  90. :value="item.value"
  91. >
  92. </el-option>
  93. </el-option-group>
  94. </el-select>
  95. </el-form-item>
  96. <el-form-item style="float: right">
  97. <el-button type="primary" @click="onSubmit">查询</el-button>
  98. <el-button type="primary" @click="onExport">导出</el-button>
  99. </el-form-item>
  100. </el-form>
  101. </el-card>
  102. <br />
  103. <el-card class="box-card">
  104. <bilateral-bar-chart
  105. v-if="tableData.length"
  106. keyName="tv_name"
  107. :list="tableData"
  108. ></bilateral-bar-chart>
  109. <el-table
  110. :data="tableData"
  111. :header-cell-style="{ backgroundColor: '#f4f5f7', color: '#606266' }"
  112. style="width: 100%"
  113. >
  114. <el-table-column type="index" />
  115. <el-table-column align="center" prop="tv_name" label="节目" />
  116. <el-table-column
  117. align="center"
  118. prop="tv_ratings"
  119. :formatter="matrer"
  120. label="收视率"
  121. />
  122. <el-table-column
  123. align="center"
  124. prop="market_ratings"
  125. :formatter="matrer"
  126. label="市占率"
  127. />
  128. </el-table>
  129. </el-card>
  130. </div>
  131. </template>
  132. <script>
  133. // @ is an alias to /src
  134. import { channel, channelcsv } from "@/api/index";
  135. import bilateralBarChart from "@/components/bilateralBarChart";
  136. import config from "@/config/index";
  137. export default {
  138. name: "Channel",
  139. data() {
  140. return {
  141. form: {
  142. rangeTime: [],
  143. channelGroup: 0,
  144. date: [
  145. new Date(new Date() - 86400000),
  146. new Date(new Date() - 86400000),
  147. ],
  148. region: -1,
  149. },
  150. tableData: [],
  151. };
  152. },
  153. mounted() {
  154. this.onSubmit();
  155. },
  156. computed: {
  157. cycle() {
  158. return config.cycle;
  159. },
  160. channelList() {
  161. return config.channelList;
  162. },
  163. region() {
  164. return config.region;
  165. },
  166. },
  167. methods: {
  168. timeSelect(a) {
  169. let end = (a || [])[(a || []).length - 1];
  170. if (this.form.rangeTimeRange.length === config.cycle.length - 1) {
  171. this.form.rangeTimeRange = ["0000_2400"];
  172. } else {
  173. let n = (this.form.rangeTimeRange || []).sort((a, b) => {
  174. let aNum = a.split("_")[0];
  175. let bNum = b.split("_")[0];
  176. return aNum - bNum;
  177. });
  178. let isSelect = true;
  179. for (let i = 0; i < n.length - 1; i++) {
  180. let aNum = n[i].split("_")[1];
  181. let bNum = n[i + 1].split("_")[0];
  182. if (aNum !== bNum) {
  183. isSelect = false;
  184. break;
  185. }
  186. }
  187. if (!isSelect) {
  188. let arr = (n.join(",") + ",")
  189. .replace(end + ",", "")
  190. .replace(/,$/, "");
  191. this.form.rangeTimeRange = arr.split(",");
  192. }
  193. }
  194. if (!this.form.rangeTimeRange.length) return;
  195. let s = this.form.rangeTimeRange[0].split("_")[0];
  196. let e = this.form.rangeTimeRange[
  197. this.form.rangeTimeRange.length - 1
  198. ].split("_");
  199. e = e[e.length - 1];
  200. if(e == '2400') e = '2359'
  201. this.form.rangeTime = [
  202. new Date(1970, 1, 1, s[0] + s[1] - 0, s[2] + s[3] - 0),
  203. new Date(1970, 1, 1, e[0] + e[1] - 0, e[2] + e[3] - 0),
  204. ];
  205. },
  206. onExport() {
  207. channelcsv(this.formatListData());
  208. },
  209. disabledDate(time) {
  210. return time.getTime() > Date.now() - 86400000;
  211. },
  212. onSubmit() {
  213. channel(this.formatListData())
  214. .then(r => {
  215. this.tableData = r.list;
  216. })
  217. .catch(err => {
  218. this.tableData = [];
  219. console.log("===", err);
  220. });
  221. },
  222. matrer(row, column, cellValue) {
  223. return (cellValue * 100).toFixed(4) + "%";
  224. },
  225. dateFormat(date) {
  226. let D = new Date(date);
  227. let m = D.getMonth() + 1;
  228. let d = D.getDate();
  229. let h = D.getHours();
  230. let M = D.getMinutes();
  231. let s = D.getSeconds();
  232. m > 9 ? m : (m = "0" + m);
  233. d > 9 ? d : (d = "0" + d);
  234. h > 9 ? h : (h = "0" + h);
  235. M > 9 ? M : (M = "0" + M);
  236. s > 9 ? s : (s = "0" + s);
  237. return {
  238. year: D.getFullYear(),
  239. month: m,
  240. day: d,
  241. hour: h,
  242. minutes: M,
  243. seconds: s,
  244. };
  245. },
  246. formatListData() {
  247. let e = new Date(this.form.date[1]);
  248. let d1 = this.dateFormat(this.form.date[0]);
  249. let d2 = this.dateFormat(e.getTime() + 86400000);
  250. let time = "";
  251. if (this.form.rangeTime.length) {
  252. let start = new Date(this.form.rangeTime[0]);
  253. let end = new Date(this.form.rangeTime[1]);
  254. let start_hour = start.getHours();
  255. let start_min = start.getMinutes();
  256. let end_hour = end.getHours();
  257. let end_min = end.getMinutes();
  258. start_hour = start_hour > 9 ? start_hour + "" : "0" + start_hour;
  259. start_min = start_min > 9 ? start_min + "" : "0" + start_min;
  260. end_hour = end_hour > 9 ? end_hour + "" : "0" + end_hour;
  261. end_min = end_min > 9 ? end_min + "" : "0" + end_min;
  262. if(end_hour + end_min === '2359') {
  263. end_hour = '24';
  264. end_min = '00'
  265. }
  266. time = start_hour + start_min + "_" + end_hour + end_min;
  267. } else {
  268. time = "0000_2400";
  269. }
  270. return {
  271. tv_type: this.form.channelGroup || this.channelList[0].value,
  272. time_range: time,
  273. area_id: this.form.region || this.region[0].value,
  274. start: [d1.year, d1.month, d1.day].join("-"),
  275. end: [d2.year, d2.month, d2.day].join("-"),
  276. };
  277. },
  278. channelSelect(a) {
  279. this.selectAll(a, "channelGroup", 0);
  280. },
  281. regionSelect(a) {
  282. this.selectAll(a, "region", -1);
  283. },
  284. selectAll(a, key, val) {
  285. if (!a.length) return;
  286. let select = a[a.length - 1];
  287. if (select === val) this.form[key] = [val];
  288. else
  289. this.form[key] = (a.join(",") + ",")
  290. .replace(val + ",", "")
  291. .replace(/,$/, "")
  292. .split(",");
  293. },
  294. },
  295. components: { bilateralBarChart },
  296. };
  297. </script>
  298. <style>
  299. .program {
  300. margin: 10px 15px;
  301. }
  302. .program .has-seconds .el-time-spinner__wrapper:last-child {
  303. display: none;
  304. }
  305. </style>