business.vue 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195
  1. <template
  2. >
  3. <el-card header="">
  4. <div slot="header" class="clearfix">
  5. <searchHeader
  6. v-if="mdate.length>0"
  7. :dates="mdate"
  8. :title="'业务数据'"
  9. :isShowQuert='false'
  10. @changeValue="changeValue"
  11. />
  12. </div>
  13. <statistic class="statistic" :cols="0">
  14. <statistic-item v-for="(item, key) in items" :key="key" :class="{active: active === key}" @click="active = key">
  15. <span>
  16. {{item.title}}
  17. <el-tooltip v-if="item.desc" :content="item.desc" :open-delay=".3" placement="top">
  18. <i style="margin-left: 5px;cursor: pointer;" class="el-icon-warning-outline"/>
  19. </el-tooltip>
  20. </span>
  21. <span>
  22. <count-to :endVal="item.percent" :decimals="2"/>%
  23. </span>
  24. </statistic-item>
  25. </statistic>
  26. <ve-histogram
  27. style="width: 100%;"
  28. height="350px"
  29. :data="chartData"
  30. :data-empty="dataEmpty"
  31. :data-zoom="dataZoom"
  32. :extend="chartExtend"
  33. :legend='legend'
  34. ></ve-histogram>
  35. </el-card>
  36. </template>
  37. <script>
  38. import 'v-charts/lib/style.css'
  39. import 'echarts/lib/component/dataZoom'
  40. import countTo from 'vue-count-to'
  41. import veHistogram from 'v-charts/lib/histogram.common'
  42. import searchHeader from "./modals/searchHeader";
  43. import { getTimes } from "@/utils";
  44. import { getIndex } from "../api";
  45. import { descs,chioseNum } from "../constant";
  46. import {
  47. getNowDateAndSunday,
  48. getNowDateAndMonday,
  49. } from "@/utils/date";
  50. export default {
  51. props: ['data',"search"],
  52. components: {
  53. 've-histogram': veHistogram,
  54. 'count-to': countTo,
  55. searchHeader
  56. },
  57. computed: {
  58. legend() {
  59. return {
  60. left: "10px",
  61. };
  62. },
  63. items() {
  64. return {
  65. HOMEWORK_CREATE_RATE: this.data['HOMEWORK_CREATE_RATE'] || {},
  66. HOMEWORK_SUBMIT_RATE: this.data['HOMEWORK_SUBMIT_RATE'] || {},
  67. HOMEWORK_COMMENT_RATE: this.data['HOMEWORK_COMMENT_RATE'] || {},
  68. }
  69. },
  70. chartExtend() {
  71. return {
  72. tooltip: {
  73. axisPointer: {
  74. type: 'shadow',
  75. shadowStyle: {
  76. color: 'rgba(150,150,150,0.2)'
  77. },
  78. },
  79. formatter: item => {
  80. return [item[0].axisValueLabel, ...item.map(d => `<br/>${d.marker}${d.seriesName}: ${d.value} %`)].join('')
  81. }
  82. }
  83. }
  84. },
  85. dataZoom() {
  86. return [
  87. {
  88. grid:{
  89. left:'0%'
  90. },
  91. type: 'slider',
  92. start: 40,
  93. end: 100
  94. }
  95. ]
  96. },
  97. chartData() {
  98. const values = Object.values(this.items)
  99. const months = {}
  100. for (const item of values) {
  101. for (const row of (item.indexMonthData || [])) {
  102. const key = this.$helpers.dayjs(row.month).format('YYYY-MM-DD')
  103. if (!months[key]) {
  104. months[key] = {
  105. '日期': key+'/'+getNowDateAndSunday(key),
  106. }
  107. }
  108. months[key][item.title] = row.percent
  109. }
  110. }
  111. return {
  112. columns: ['日期', ...values.map(item => {
  113. return item.title
  114. })],
  115. rows: Object.values(months)
  116. }
  117. },
  118. dataEmpty() {
  119. return !this.chartData.rows.length
  120. },
  121. },
  122. data () {
  123. return {
  124. active: 'ACTIVATION_RATE',
  125. mdate: [],
  126. loading:false
  127. }
  128. },
  129. mounted(){
  130. let nowTiem = this.$helpers.dayjs(new Date()).format('YYYY-MM-DD')
  131. let startTime = this.$helpers.dayjs(getNowDateAndMonday(nowTiem)).subtract(56,'day').format('YYYY-MM-DD')
  132. let endTime = getNowDateAndSunday(nowTiem)
  133. this.mdate = [startTime,endTime];
  134. this.FetchDetail();
  135. },
  136. methods:{
  137. changeValue(date) {
  138. // 请求更改数据
  139. this.mdate = date;
  140. // this.isDayOrMoth(date)
  141. this.FetchDetail();
  142. },
  143. async FetchDetail() {
  144. this.loading = true;
  145. const data = this.data;
  146. try {
  147. const { dates, ...rest } = this.search;
  148. const res = await getIndex({
  149. ...rest,
  150. ...getTimes(this.mdate, ["startDate", "endDate"]),
  151. });
  152. for (const item of res.data) {
  153. // 再循环一遍
  154. for (const key in this.items) {
  155. if (item.dataType == key) {
  156. data[item.dataType] = {
  157. ...item,
  158. desc: descs[item.dataType],
  159. };
  160. }
  161. }
  162. }
  163. } catch (error) {
  164. console.log(error);
  165. }
  166. this.loading = false
  167. this.dataInfo = data;
  168. this.$emit("resetDate", data);
  169. },
  170. }
  171. }
  172. </script>
  173. <style lang="less" scoped>
  174. // .statistic{
  175. // /deep/ .statistic-content{
  176. // cursor: pointer;
  177. // &.active > span{
  178. // color: #14928a !important;
  179. // }
  180. // }
  181. // }
  182. .chioseBox {
  183. position: absolute;
  184. right: 20px;
  185. z-index: 1000;
  186. }
  187. .wrap {
  188. position: relative;
  189. }
  190. </style>