data.vue 7.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262
  1. <template>
  2. <div v-loading="loading" style="padding: 20px">
  3. <div style="padding-bottom: 20px">
  4. <el-tag style="margin-right: 10px" v-for="v in menu" :type="v.name==title?'success':'info'" @click="getData_(v.url,v.name)">{{v.name}}</el-tag>
  5. </div>
  6. <div style="padding-bottom: 20px">
  7. <el-select v-model="time_type" placeholder="请选择">
  8. <el-option v-for="item in time_type_data" :key="item.value" :label="item.label" :value="item.value">
  9. </el-option>
  10. </el-select>
  11. <el-date-picker v-if="time_type == 1" v-model="date" type="daterange" style="width: 400px" range-separator="至" start-placeholder="开始日期" end-placeholder="结束日期">
  12. </el-date-picker>
  13. <el-date-picker v-if="time_type == 2" v-model="month" style="width: 400px" type="monthrange" range-separator="至" start-placeholder="开始月份" end-placeholder="结束月份">
  14. </el-date-picker>
  15. <el-button @click="search" type="primary">查询</el-button>
  16. <el-button @click="exportExcel" type="primary">导出表格</el-button>
  17. </div>
  18. <el-row>
  19. <el-col :span="24">
  20. <div class="grid-content bg-purple">
  21. <Line-Chart :source="source" :title="title" :width="1200" :height="400"></Line-Chart>
  22. </div>
  23. </el-col>
  24. </el-row>
  25. <el-table :data="table.tableData" style="width: 100%;">
  26. <el-table-column v-for="(value, index) in table.tableHeader" :key="index" :label="value.title">
  27. <template slot-scope="scope">
  28. {{scope.row[index]}}
  29. </template>
  30. </el-table-column>
  31. </el-table>
  32. </div>
  33. </template>
  34. <script>
  35. import LineChart from "@/components/Echart/line";
  36. import {
  37. exportExcelFile
  38. } from "@/utils/excel";
  39. let firstDayOfThisMonth = new Date();
  40. firstDayOfThisMonth.setDate(1);
  41. firstDayOfThisMonth.setHours(0);
  42. firstDayOfThisMonth.setMinutes(0);
  43. firstDayOfThisMonth.setSeconds(0);
  44. const startMonth = new Date();
  45. startMonth.setMonth(startMonth.getMonth() - 12);
  46. export default {
  47. inheritAttrs: false,
  48. components: {
  49. LineChart
  50. },
  51. props: [],
  52. data() {
  53. return {
  54. title: "实名认证数据面板",
  55. loading: true,
  56. source: {
  57. rows: [],
  58. data: [],
  59. day_data: []
  60. },
  61. time_type_data: [{
  62. value: "1",
  63. label: "按日"
  64. },
  65. {
  66. value: "2",
  67. label: "按月"
  68. }
  69. ],
  70. time_type: "1",
  71. date: [firstDayOfThisMonth, new Date()],
  72. month: [startMonth, firstDayOfThisMonth],
  73. type: "0",
  74. menu: [],
  75. url: "",
  76. };
  77. },
  78. computed: {
  79. 'table': function () {
  80. let data = this.source
  81. if(data.day_data.length == 0){
  82. return {
  83. tableData: [],
  84. tableHeader: []
  85. }
  86. }
  87. let tableHeader = data.day_data.map((item) => {
  88. return {
  89. title: item.title,
  90. }
  91. })
  92. // 日期
  93. let date = data.day_data[0].data
  94. // 日期遍历
  95. let tableData = []
  96. date.forEach((item, index) => {
  97. let row = []
  98. // 表头遍历
  99. tableHeader.forEach((item2, index2) => {
  100. let val = data.day_data[index2].data[index]
  101. row.push(val)
  102. })
  103. tableData.push(row)
  104. })
  105. // 添加汇总
  106. let sumRow = data.day_data.map((item,index) => {
  107. if(index == 0){
  108. return "汇总"
  109. }else{
  110. let sum = 0
  111. item.data.forEach((item2) => {
  112. sum += item2
  113. })
  114. return sum
  115. }
  116. })
  117. tableData.unshift(sumRow)
  118. return {
  119. tableHeader,
  120. tableData
  121. }
  122. }
  123. },
  124. watch: {},
  125. created() {},
  126. mounted() {
  127. this.getMenu();
  128. },
  129. methods: {
  130. async search() {
  131. this.getData_(this.url, this.title);
  132. },
  133. async getData_(url, title) {
  134. this.loading = true;
  135. this.title = title;
  136. this.url = url;
  137. let stime = "";
  138. let etime = "";
  139. if (this.time_type == 1) {
  140. stime = this.formatDate(this.date[0] / 1000);
  141. etime = this.formatDate(this.date[1] / 1000);
  142. } else {
  143. stime = this.formatDate(this.month[0] / 1000);
  144. etime = this.formatDate(this.month[1] / 1000);
  145. }
  146. let res = await this.$post(url, {
  147. time_type: this.time_type,
  148. stime: stime,
  149. etime: etime
  150. });
  151. this.loading = false;
  152. if (res.status == 1) {
  153. this.source = {
  154. rows: res.data.day,
  155. data: res.data.data,
  156. day_data: res.data.day_data
  157. };
  158. }
  159. },
  160. async getMenu() {
  161. let url = "/uapi/data/day/menu";
  162. let res = await this.$post(url, {});
  163. if (res.status == 1) {
  164. this.menu = res.data;
  165. this.getData_("/uapi/data/day/project_all", "项目数据");
  166. }
  167. },
  168. formatDate(time) {
  169. if (time === "0") {
  170. return "--";
  171. }
  172. let now = new Date(time * 1000);
  173. let year = now.getFullYear();
  174. let month = now.getMonth() + 1;
  175. let date = now.getDate();
  176. let hour = now.getHours();
  177. let minute = now.getMinutes();
  178. let second = now.getSeconds();
  179. if (date < 10) {
  180. date = "0" + date;
  181. }
  182. if (month < 10) {
  183. month = "0" + month;
  184. }
  185. if (hour < 10) {
  186. hour = "0" + hour;
  187. }
  188. if (minute < 10) {
  189. minute = "0" + minute;
  190. }
  191. if (second < 10) {
  192. second = "0" + second;
  193. }
  194. return (
  195. year +
  196. "-" +
  197. month +
  198. "-" +
  199. date +
  200. " " +
  201. hour +
  202. ":" +
  203. minute +
  204. ":" +
  205. second
  206. );
  207. },
  208. exportExcel() {
  209. let colArr = [];
  210. let header = this.table.tableHeader.map(item => {
  211. return item.title;
  212. })
  213. // 去除汇总项
  214. let t_data = [...this.table.tableData]
  215. t_data.shift()
  216. colArr = [[...header],...t_data]
  217. let wscols = colArr.map((item) => {
  218. return {
  219. wch: 10
  220. }
  221. });
  222. let stime = "";
  223. let etime = "";
  224. if (this.time_type == 1) {
  225. stime = this.formatDate(this.date[0] / 1000);
  226. etime = this.formatDate(this.date[1] / 1000);
  227. } else {
  228. stime = this.formatDate(this.month[0] / 1000);
  229. etime = this.formatDate(this.month[1] / 1000);
  230. }
  231. exportExcelFile(colArr, wscols, `${stime} - ${etime}数据看版`);
  232. }
  233. }
  234. };
  235. </script>
  236. <style scoped>
  237. .el-tag {
  238. cursor: pointer;
  239. }
  240. </style>