Order.vue 9.9 KB

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