index.vue 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175
  1. <template>
  2. <div class="container">
  3. <save-form inline :model="search" @submit="FetchDetail" @reset="reset" saveKey="/main/main/baseInfo">
  4. <el-form-item prop="year">
  5. <el-date-picker
  6. v-model="search.dates"
  7. type="daterange"
  8. align="right"
  9. unlink-panels
  10. range-separator="至"
  11. start-placeholder="开始日期"
  12. end-placeholder="结束日期"
  13. :picker-options="pickerOptions">
  14. </el-date-picker>
  15. </el-form-item>
  16. <el-form-item prop="organId">
  17. <el-select
  18. clearable
  19. filterable
  20. placeholder="请选择分部"
  21. v-model="search.organId"
  22. >
  23. <el-option v-for="(item,index) in selects.branchs"
  24. :key="index"
  25. :label="item.name"
  26. :value="item.id"></el-option>
  27. </el-select>
  28. </el-form-item>
  29. <el-button native-type="submit" type="primary">搜索</el-button>
  30. <el-button native-type="reset" type="danger">重置</el-button>
  31. </save-form>
  32. <el-alert type="info" :closable="false" style="margin-bottom: 20px;">
  33. 每日0点更新前一日数据
  34. </el-alert>
  35. <empty desc="暂无统计数据" v-if="isEmpty"/>
  36. <el-row v-else class="rows" :gutter="20">
  37. <el-col :xs="24" :sm="24" :md="12">
  38. <operate :data="dataInfo"/>
  39. </el-col>
  40. <el-col :xs="24" :sm="24" :md="12">
  41. <business :data="dataInfo"/>
  42. </el-col>
  43. <!-- <el-col :xs="24" :sm="24" :md="24" :xl="10">
  44. <management :data="dataInfo"/>
  45. </el-col> -->
  46. <el-col :xs="24" :sm="24" :md="12">
  47. <hrdata :data="dataInfo"/>
  48. </el-col>
  49. <el-col :xs="24" :sm="24" :md="12">
  50. <student :data="dataInfo"/>
  51. </el-col>
  52. <el-col :xs="24" :sm="24" :md="24">
  53. <curriculum :data="dataInfo"/>
  54. </el-col>
  55. </el-row>
  56. </div>
  57. </template>
  58. <script>
  59. import { getIndex } from '../api'
  60. import operate from './operate'
  61. import business from './business'
  62. import management from './management'
  63. import hrdata from './hr'
  64. import student from './student'
  65. import curriculum from './curriculum'
  66. import { getTimes } from '@/utils'
  67. import { descs } from '../constant'
  68. const getInitDate = () => {
  69. const end = new Date();
  70. const start = new Date();
  71. start.setTime(start.getTime() - 3600 * 1000 * 24 * 7);
  72. return [start, end]
  73. }
  74. export default {
  75. components: {
  76. operate,
  77. business,
  78. management,
  79. hrdata,
  80. student,
  81. curriculum,
  82. },
  83. data () {
  84. return {
  85. pickerOptions: {
  86. disabledDate: a => {
  87. const { dayjs } = this.$helpers
  88. return dayjs(a).isAfter(dayjs())
  89. },
  90. shortcuts: [{
  91. text: '最近一周',
  92. onClick(picker) {
  93. const end = new Date();
  94. const start = new Date();
  95. start.setTime(start.getTime() - 3600 * 1000 * 24 * 7);
  96. picker.$emit('pick', [start, end]);
  97. }
  98. }, {
  99. text: '最近一个月',
  100. onClick(picker) {
  101. const end = new Date();
  102. const start = new Date();
  103. start.setTime(start.getTime() - 3600 * 1000 * 24 * 30);
  104. picker.$emit('pick', [start, end]);
  105. }
  106. }, {
  107. text: '最近三个月',
  108. onClick(picker) {
  109. const end = new Date();
  110. const start = new Date();
  111. start.setTime(start.getTime() - 3600 * 1000 * 24 * 90);
  112. picker.$emit('pick', [start, end]);
  113. }
  114. }]
  115. },
  116. search: {
  117. dates: [],
  118. organId: null
  119. },
  120. dataInfo: {},
  121. business: {},
  122. }
  123. },
  124. computed: {
  125. isEmpty() {
  126. return !Object.keys(this.dataInfo).length
  127. }
  128. },
  129. mounted () {
  130. this.reset()
  131. this.$store.dispatch('setBranchs')
  132. },
  133. methods: {
  134. reset() {
  135. this.$set(this.search, 'dates', getInitDate())
  136. this.$set(this.search, 'organId', null)
  137. this.FetchDetail()
  138. },
  139. async FetchDetail() {
  140. const data = {}
  141. try {
  142. const {dates, ...rest} = this.search
  143. const res = await getIndex({
  144. ...rest,
  145. ...getTimes(dates, ['startDate', 'endDate'])
  146. })
  147. for (const item of res.data) {
  148. data[item.dataType] = {
  149. ...item,
  150. desc: descs[item.dataType]
  151. }
  152. }
  153. } catch (error) {
  154. console.log(error)
  155. }
  156. this.dataInfo = data
  157. },
  158. }
  159. }
  160. </script>
  161. <style lang="less" scoped>
  162. .container{
  163. overflow: hidden;
  164. .rows{
  165. >div{
  166. margin-bottom: 20px;
  167. }
  168. }
  169. /deep/ .el-card__body .statistic {
  170. margin-bottom: 15px;
  171. padding: 0;
  172. }
  173. }
  174. </style>