Mobile.vue 9.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326
  1. <template>
  2. <div>
  3. <el-card>
  4. <el-form :model="efunParams" ref="efunParams" class="clearfix topForm" style="float: left">
  5. <div class="leftForm-skill">
  6. <el-form-item
  7. style="display:flex;"
  8. prop="channel"
  9. name="channel"
  10. :rules="[{ required: true, message: '请选择渠道', trigger: 'blur' }]"
  11. label="渠道选择"
  12. >
  13. <el-select
  14. v-model="efunParams.channel"
  15. style="width:160px"
  16. placeholder="请选择渠道"
  17. >
  18. <el-option
  19. v-for="item in efunChannelList"
  20. :key="item.code"
  21. :label="item.name"
  22. :value="item.code"
  23. ></el-option>
  24. </el-select>
  25. </el-form-item>
  26. <el-form-item class="dateForm-skill" name="data" label="查询日期" style="display:flex">
  27. <el-date-picker
  28. style="width:140px"
  29. v-model="efunParams.startDate"
  30. type="date"
  31. placeholder="起"
  32. ></el-date-picker>
  33. <el-date-picker
  34. style="width:140px"
  35. v-model="efunParams.endDate"
  36. type="date"
  37. placeholder="止"
  38. ></el-date-picker>
  39. </el-form-item>
  40. </div>
  41. <el-form-item>
  42. <el-button type="primary" @click="submitForm('efunParams')">搜索</el-button>
  43. </el-form-item>
  44. </el-form>
  45. <el-button type="primary" @click="onExportExcel" style="float: right">导出</el-button>
  46. <el-table id="table" :data="channelData" border style="width: 100%" :height="tableHeight">
  47. <el-table-column
  48. label="日期"
  49. fixed
  50. align="left"
  51. header-align="center"
  52. min-width="140px"
  53. >
  54. <template slot-scope="scope">
  55. <span>{{changeDate(scope.row.day)}}</span>
  56. </template>
  57. </el-table-column>
  58. <el-table-column label="流量与观看" header-align="center">
  59. <el-table-column
  60. label="UV"
  61. prop="uv"
  62. align="right"
  63. header-align="center"
  64. min-width="100px"
  65. ></el-table-column>
  66. <el-table-column
  67. label="VIP用户 | -UV1"
  68. align="right"
  69. header-align="center"
  70. :render-header="renderheader"
  71. prop="vipUv"
  72. min-width="120px"
  73. ></el-table-column>
  74. <el-table-column
  75. label="非VIP用户 | UV2=UV-UV1"
  76. align="right"
  77. header-align="center"
  78. :render-header="renderheader"
  79. prop="waitVipUv"
  80. min-width="140px"
  81. ></el-table-column>
  82. <el-table-column
  83. label="VIP用户占比 | =UV1/UV"
  84. align="right"
  85. header-align="center"
  86. :render-header="renderheader"
  87. prop="vipProportion"
  88. min-width="140px"
  89. ></el-table-column>
  90. <!-- <el-table-column
  91. label="VV"
  92. prop="vv"
  93. align="right"
  94. header-align="center"
  95. min-width="100px"
  96. ></el-table-column>-->
  97. <el-table-column
  98. label="VV"
  99. align="right"
  100. header-align="center"
  101. :render-header="renderheader"
  102. prop="totalPlay"
  103. min-width="140px"
  104. ></el-table-column>
  105. <el-table-column
  106. label="人均播放 | =VV/UV"
  107. align="right"
  108. header-align="center"
  109. :render-header="renderheader"
  110. prop="perCapitaPlay"
  111. min-width="140px"
  112. ></el-table-column>
  113. </el-table-column>
  114. <el-table-column label="拉新,付费与转换率" header-align="center">
  115. <el-table-column
  116. label="连续包月 | -Qm1"
  117. align="right"
  118. header-align="center"
  119. :render-header="renderheader"
  120. prop="consecutiveMonthly"
  121. min-width="100px"
  122. ></el-table-column>
  123. <el-table-column
  124. label="月包 | -Qm2"
  125. align="right"
  126. header-align="center"
  127. :render-header="renderheader"
  128. prop="monthlyPayment"
  129. min-width="90px"
  130. ></el-table-column>
  131. <el-table-column
  132. label="年包 | -Qy"
  133. align="right"
  134. header-align="center"
  135. :render-header="renderheader"
  136. prop="yearlyPayment"
  137. ></el-table-column>
  138. <el-table-column
  139. label="付费订单数量| Q=Qm1+Qm2+Qy"
  140. align="right"
  141. header-align="center"
  142. :render-header="renderheader"
  143. prop="totalPayment"
  144. min-width="160px"
  145. ></el-table-column>
  146. <el-table-column
  147. label="r1 | =Qm1/Q"
  148. align="right"
  149. header-align="center"
  150. :render-header="renderheader"
  151. prop="consecutiveConversion"
  152. min-width="130px"
  153. ></el-table-column>// 月包占比
  154. <el-table-column
  155. label="r2 | =Qm2/Q"
  156. align="right"
  157. header-align="center"
  158. :render-header="renderheader"
  159. prop="monthlyConversion"
  160. min-width="130px"
  161. ></el-table-column>// 年包占比
  162. <el-table-column
  163. label="r3 | =Qy/Q"
  164. align="right"
  165. header-align="center"
  166. :render-header="renderheader"
  167. prop="yearlyConversion"
  168. min-width="130px"
  169. ></el-table-column>
  170. <el-table-column
  171. label="R | =(Qm1+Qm2+Qy)/UV2"
  172. align="right"
  173. header-align="center"
  174. :render-header="renderheader"
  175. prop="totalConversion"
  176. min-width="190px"
  177. ></el-table-column>
  178. </el-table-column>
  179. </el-table>
  180. <!-- <el-pagination
  181. v-if="orderList.totalElements"
  182. background
  183. layout="prev, pager, next"
  184. :total="orderList.totalElements"
  185. @current-change="changePage">
  186. </el-pagination>-->
  187. </el-card>
  188. </div>
  189. </template>
  190. <script>
  191. import { mapGetters } from "vuex";
  192. import formatDate from "../../utils/formatTime";
  193. import downTable from '@/utils/downTable'
  194. export default {
  195. data() {
  196. return {
  197. tableHeight: 500,
  198. dateValue: "",
  199. efunParams: {
  200. startDate: "",
  201. endDate: "",
  202. channel: ""
  203. },
  204. rules: {
  205. channel: [{ required: true, trigger: "blur" }],
  206. }
  207. };
  208. },
  209. computed: {
  210. ...mapGetters({
  211. efunChannelList: "efunChannelList",
  212. channelData: "channelData",
  213. })
  214. },
  215. created() {
  216. this.$store.dispatch("clearList");
  217. this.$store.dispatch("getEfunChannelList",'PHONE');
  218. this.efunParams.startDate = this.getYesterDay();
  219. this.efunParams.endDate = this.getYesterDay();
  220. this.tableHeight = document.documentElement.clientHeight * 0.75;
  221. },
  222. methods: {
  223. // 搜索
  224. submitForm(formName) {
  225. this.efunParams.startDate = this.efunParams.startDate
  226. ? formatDate(this.efunParams.startDate, 2)
  227. : "";
  228. this.efunParams.endDate = this.efunParams.endDate
  229. ? formatDate(this.efunParams.endDate, 2)
  230. : "";
  231. this.$refs[formName].validate(valid => {
  232. console.log(valid,123123123)
  233. if (valid) {
  234. this.$store.dispatch("getChannelData", this.efunParams);
  235. } else {
  236. console.log("error submit!!");
  237. return false;
  238. }
  239. });
  240. },
  241. // 渠道下课程分页
  242. changePage(e) {
  243. this.efunParams.pageNo = e;
  244. this.$store.dispatch("getChannelData", this.efunParams);
  245. },
  246. // 表头折行
  247. renderheader(h, { column, $index }) {
  248. return h("span", {}, [
  249. h("span", {}, column.label.split("|")[0]),
  250. h("br"),
  251. h("span", {}, column.label.split("|")[1])
  252. ]);
  253. },
  254. getYesterDay() {
  255. let yesterday = new Date().getTime() - 86400000;
  256. return formatDate(yesterday, 2);
  257. },
  258. columnZero() {
  259. return "0";
  260. },
  261. columnZeroPercent(row, column, index) {
  262. if (row.totalPayment && column.property === "yearlyConversion") {
  263. return "100.00%";
  264. } else {
  265. return "0.00%";
  266. }
  267. // if(row.)
  268. },
  269. changeDate(date) {
  270. return formatDate(date, 4)
  271. },
  272. // 导出表格
  273. onExportExcel() {
  274. const nameList = this.efunChannelList.filter((item) => item.code === this.efunParams.channel)[0]
  275. const name = (nameList && nameList.name) || ''
  276. const date = this.efunParams.startDate + '至' + this.efunParams.endDate
  277. downTable('table', [
  278. {wch: 15}, // "characters"
  279. {wch: 6},
  280. {wch: 15},
  281. {wch: 20},
  282. {wch: 20},
  283. {wch: 6},
  284. {wch: 15},
  285. {wch: 15},
  286. {wch: 10},
  287. {wch: 10},
  288. {wch: 25},
  289. {wch: 10},
  290. {wch: 10},
  291. {wch: 10},
  292. {wch: 25}
  293. ], name + date)
  294. }
  295. }
  296. };
  297. </script>
  298. <style lang="less" scoped>
  299. .pruductForm-skill {
  300. margin-left: 10px;
  301. display: flex;
  302. }
  303. .topForm {
  304. display: flex;
  305. align-items: center;
  306. flex-direction: row;
  307. flex-shrink: 0;
  308. justify-content: space-between;
  309. }
  310. .leftForm-skill {
  311. display: flex;
  312. align-items: center;
  313. flex-direction: row;
  314. justify-content: space-between;
  315. }
  316. .dateForm-skill {
  317. margin-left: 18px;
  318. }
  319. </style>