RadioBroadcast.vue 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211
  1. <template>
  2. <div class="RadioBroadcast">
  3. <el-card class="box-card">
  4. <el-form
  5. ref="form"
  6. :model="form"
  7. size="small"
  8. :inline="true"
  9. label-width="120px"
  10. class="demo-form-inline"
  11. >
  12. <el-form-item label="日期">
  13. <el-date-picker
  14. v-model="form.date"
  15. type="daterange"
  16. placeholder="日期"
  17. value-format="YYYY-MM-DD"
  18. :disabled-date="time => disabledDate(time)"
  19. >
  20. </el-date-picker>
  21. </el-form-item>
  22. <el-form-item label="分析周期">
  23. <el-select v-model="form.cycle" placeholder="请选择">
  24. <el-option
  25. v-for="item in cycleList"
  26. :key="item.value"
  27. :label="item.label"
  28. :value="item.value"
  29. :disabled="item.disabled"
  30. >
  31. </el-option>
  32. </el-select>
  33. </el-form-item>
  34. <el-form-item label="电台">
  35. <el-select
  36. multiple
  37. v-model="form.rb"
  38. collapse-tags
  39. clearable
  40. placeholder="请选择"
  41. @change="channelSelect"
  42. >
  43. <el-option
  44. v-for="item in radioList"
  45. :key="item.value"
  46. :label="item.label"
  47. :value="item.value"
  48. :disabled="item.disabled"
  49. >
  50. </el-option>
  51. </el-select>
  52. </el-form-item>
  53. <el-form-item style="float: right">
  54. <el-button type="primary" @click="onSubmit">查询</el-button>
  55. </el-form-item>
  56. </el-form>
  57. </el-card>
  58. <br />
  59. <el-card class="box-card">
  60. <bilateral-bar-chart
  61. ref="chart"
  62. v-if="tableData.length"
  63. keyName="name"
  64. :list="tableData"
  65. :tabs="[
  66. {
  67. name: '收听率',
  68. key: 'radio_rate',
  69. },
  70. {
  71. name: '占有率',
  72. key: 'market_rate',
  73. },
  74. ]"
  75. ></bilateral-bar-chart>
  76. <el-table
  77. :data="tableData"
  78. :header-cell-style="{ backgroundColor: '#f4f5f7', color: '#606266' }"
  79. style="width: 100%"
  80. >
  81. <el-table-column align="center" prop="" label="" width="30">
  82. </el-table-column>
  83. <el-table-column type="index" />
  84. <el-table-column align="center" prop="name" label="广播" />
  85. <el-table-column
  86. align="center"
  87. prop="radio_rate"
  88. sortable
  89. :formatter="
  90. (row, column, cellValue) => (cellValue * 100).toFixed(4) + '%'
  91. "
  92. label="收听率"
  93. />
  94. <el-table-column
  95. align="center"
  96. prop="market_rate"
  97. sortable
  98. :formatter="
  99. (row, column, cellValue) => (cellValue * 100).toFixed(4) + '%'
  100. "
  101. label="占有率"
  102. />
  103. </el-table>
  104. </el-card>
  105. </div>
  106. </template>
  107. <script>
  108. // @ is an alias to /src
  109. import bilateralBarChart from "@/components/bilateralBarChart";
  110. import { audioGet, audioList } from "@/api/index";
  111. import config from "@/config/index";
  112. export default {
  113. name: "RadioBroadcast",
  114. data() {
  115. return {
  116. form: {
  117. rb: [],
  118. cycle: "None",
  119. date: [],
  120. },
  121. tableData: [],
  122. radioList: [],
  123. };
  124. },
  125. mounted() {
  126. const t = new Date(Date.now() - 86400000),
  127. y = t.getFullYear(),
  128. m = t.getMonth() + 1 > 9 ? t.getMonth() + 1 : "0" + (t.getMonth() + 1),
  129. d = t.getDate() > 9 ? t.getDate() : "0" + t.getDate(),
  130. date = [y, m, d].join("-");
  131. this.form.date = [date, date];
  132. audioList().then(r => {
  133. let radioList = [
  134. {
  135. name: "全部",
  136. value: "全部",
  137. },
  138. ];
  139. for (let i = 0; i < (r || []).length; i++) {
  140. const v = (r || [])[i];
  141. radioList.push({
  142. name: v,
  143. value: v,
  144. });
  145. }
  146. this.radioList = radioList;
  147. this.form.rb = [radioList[0].name];
  148. });
  149. this.onSubmit();
  150. },
  151. computed: {
  152. cycleList() {
  153. return config.audioCycle;
  154. },
  155. },
  156. methods: {
  157. playTime(row) {
  158. return row.start_time.split(" ")[1] + "~" + row.end_time.split(" ")[1];
  159. },
  160. disabledDate(time) {
  161. let timeNow = time.getTime()
  162. return timeNow > Date.now() - 86400000 || timeNow < new Date('2021-12-31');
  163. },
  164. onSubmit() {
  165. audioGet(this.formatListData())
  166. .then(r => {
  167. this.tableData = r || [];
  168. })
  169. .catch(() => {
  170. this.tableData = [];
  171. });
  172. },
  173. formatListData() {
  174. let s = (this.form.date[0] || "").replace(/-/g, ""),
  175. e = (this.form.date[1] || "").replace(/-/g, ""),
  176. rb = [];
  177. for (let i = 0; i < this.form.rb.length; i++) {
  178. const v = this.form.rb[i];
  179. if (v !== "全部") rb.push(v);
  180. }
  181. return {
  182. start: s,
  183. end: e,
  184. range: this.form.cycle,
  185. names: rb,
  186. };
  187. },
  188. channelSelect(a) {
  189. if (!a.length) return;
  190. if (a[a.length - 1] === "全部") return (this.form.rb = ["全部"]);
  191. let l = [];
  192. for (let i = 0; i < a.length; i++) {
  193. const v = a[i];
  194. if (v === "全部") continue;
  195. l.push(v);
  196. }
  197. this.form.rb = l;
  198. },
  199. },
  200. beforeUnmount: function() {},
  201. components: { bilateralBarChart },
  202. };
  203. </script>
  204. <style>
  205. .RadioBroadcast {
  206. margin: 10px 15px;
  207. }
  208. </style>