index.vue 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182
  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. <student :data="dataInfo"/>
  39. </el-col>
  40. <el-col :xs="24" :sm="24" :md="12" :xl="12">
  41. <management :data="dataInfo"/>
  42. </el-col>
  43. <el-col :xs="24" :sm="24" :md="12">
  44. <business :data="dataInfo"/>
  45. </el-col>
  46. <el-col :xs="24" :sm="24" :md="12">
  47. <curriculum :data="dataInfo"/>
  48. </el-col>
  49. <el-col :xs="24" :sm="24" :md="12">
  50. <operate :data="dataInfo"/>
  51. </el-col>
  52. <el-col :xs="24" :sm="24" :md="12">
  53. <hrdata :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. end.setTime(end.getTime() - 3600 * 1000 * 24 * 1);
  72. start.setTime(start.getTime() - 3600 * 1000 * 24 * 8);
  73. return [start, end]
  74. }
  75. export default {
  76. components: {
  77. operate,
  78. business,
  79. management,
  80. hrdata,
  81. student,
  82. curriculum,
  83. },
  84. data () {
  85. return {
  86. pickerOptions: {
  87. disabledDate: a => {
  88. const { dayjs } = this.$helpers
  89. return dayjs(a).isAfter(dayjs().subtract(1, 'day'))
  90. },
  91. shortcuts: [{
  92. text: '最近一周',
  93. onClick(picker) {
  94. const end = new Date();
  95. const start = new Date();
  96. end.setTime(end.getTime() - 3600 * 1000 * 24 * 1);
  97. start.setTime(start.getTime() - 3600 * 1000 * 24 * 8);
  98. picker.$emit('pick', [start, end]);
  99. }
  100. }, {
  101. text: '最近一个月',
  102. onClick(picker) {
  103. const end = new Date();
  104. const start = new Date();
  105. end.setTime(end.getTime() - 3600 * 1000 * 24 * 1);
  106. start.setTime(start.getTime() - 3600 * 1000 * 24 * 31);
  107. picker.$emit('pick', [start, end]);
  108. }
  109. }, {
  110. text: '最近三个月',
  111. onClick(picker) {
  112. const end = new Date();
  113. const start = new Date();
  114. end.setTime(end.getTime() - 3600 * 1000 * 24 * 1);
  115. start.setTime(start.getTime() - 3600 * 1000 * 24 * 91);
  116. picker.$emit('pick', [start, end]);
  117. }
  118. }]
  119. },
  120. search: {
  121. dates: [],
  122. organId: null
  123. },
  124. dataInfo: {},
  125. business: {},
  126. }
  127. },
  128. computed: {
  129. isEmpty() {
  130. return !Object.keys(this.dataInfo).length
  131. }
  132. },
  133. created() {
  134. this.$set(this.search, 'dates', getInitDate())
  135. },
  136. mounted () {
  137. this.FetchDetail()
  138. this.$store.dispatch('setBranchs')
  139. },
  140. methods: {
  141. reset() {
  142. this.$set(this.search, 'dates', getInitDate())
  143. this.$set(this.search, 'organId', null)
  144. this.FetchDetail()
  145. },
  146. async FetchDetail() {
  147. const data = {}
  148. try {
  149. const {dates, ...rest} = this.search
  150. const res = await getIndex({
  151. ...rest,
  152. ...getTimes(dates, ['startDate', 'endDate'])
  153. })
  154. for (const item of res.data) {
  155. data[item.dataType] = {
  156. ...item,
  157. desc: descs[item.dataType]
  158. }
  159. }
  160. } catch (error) {
  161. console.log(error)
  162. }
  163. this.dataInfo = data
  164. },
  165. }
  166. }
  167. </script>
  168. <style lang="less" scoped>
  169. .container{
  170. overflow: hidden;
  171. .rows{
  172. >div{
  173. margin-bottom: 20px;
  174. }
  175. }
  176. /deep/ .el-card__body .statistic {
  177. margin-bottom: 15px;
  178. padding: 0;
  179. }
  180. }
  181. </style>