index.vue 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223
  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. <!-- 这里显示选项卡 -->
  36. <empty desc="暂无统计数据" v-if="isEmpty"/>
  37. <el-row v-else class="rows" :gutter="20">
  38. <el-col :xs="24" :sm="24" :md="24" :xl="9">
  39. <studentbaseinfo :data="dataInfo" />
  40. </el-col>
  41. <el-col :xs="24" :sm="24" :md="24" :xl="6">
  42. <operate :data="dataInfo"/>
  43. </el-col>
  44. <el-col :xs="24" :sm="24" :md="24" :xl="9">
  45. <hrdata :data="dataInfo"/>
  46. </el-col>
  47. <el-col :xs="24" :sm="24" :md="24" :xl="12">
  48. <surplusCourse :data="dataInfo"/>
  49. </el-col>
  50. <el-col :xs="24" :sm="24" :md="24" :xl="12">
  51. <useCourse :data="dataInfo"/>
  52. </el-col>
  53. <el-col :xs="24" :sm="24" :md="24" :xl="12">
  54. <management :data="dataInfo"/>
  55. </el-col>
  56. <el-col :xs="24" :sm="24" :md="24" :xl="12">
  57. <business :data="dataInfo"/>
  58. </el-col>
  59. <el-col :xs="24" :sm="24" :md="24" :xl="12">
  60. <curriculum :data="dataInfo"/>
  61. </el-col>
  62. <el-col :xs="24" :sm="24" :md="24" :xl="12">
  63. <student :data="dataInfo"/>
  64. </el-col>
  65. <!-- <el-col :xs="24" :sm="24" :md="12">
  66. <operate :data="dataInfo"/>
  67. </el-col> -->
  68. <!-- <el-col :xs="24" :sm="24" :md="12">
  69. <hrdata :data="dataInfo"/>
  70. </el-col> -->
  71. </el-row>
  72. </div>
  73. </template>
  74. <script>
  75. import { getIndex } from '../api'
  76. import operate from './operate'
  77. import business from './business'
  78. import management from './management'
  79. import hrdata from './hr'
  80. import student from './student'
  81. import curriculum from './curriculum'
  82. import studentbaseinfo from './studentBaseinfo'
  83. import surplusCourse from './surplusCourse'
  84. import useCourse from './useCourse'
  85. import { getTimes } from '@/utils'
  86. import { descs } from '../constant'
  87. const getInitDate = () => {
  88. const end = new Date();
  89. const start = new Date();
  90. end.setTime(end.getTime() - 3600 * 1000 * 24 * 1);
  91. start.setTime(start.getTime() - 3600 * 1000 * 24 * 8);
  92. return [start, end]
  93. }
  94. export default {
  95. components: {
  96. operate,
  97. business,
  98. management,
  99. hrdata,
  100. student,
  101. curriculum,
  102. studentbaseinfo,
  103. surplusCourse,
  104. useCourse
  105. },
  106. data () {
  107. return {
  108. pickerOptions: {
  109. disabledDate: a => {
  110. const { dayjs } = this.$helpers
  111. return dayjs(a).isAfter(dayjs().subtract(1, 'day'))
  112. },
  113. shortcuts: [{
  114. text: '最近一周',
  115. onClick(picker) {
  116. const end = new Date();
  117. const start = new Date();
  118. end.setTime(end.getTime() - 3600 * 1000 * 24 * 1);
  119. start.setTime(start.getTime() - 3600 * 1000 * 24 * 8);
  120. picker.$emit('pick', [start, end]);
  121. }
  122. }, {
  123. text: '最近一个月',
  124. onClick(picker) {
  125. const end = new Date();
  126. const start = new Date();
  127. end.setTime(end.getTime() - 3600 * 1000 * 24 * 1);
  128. start.setTime(start.getTime() - 3600 * 1000 * 24 * 31);
  129. picker.$emit('pick', [start, end]);
  130. }
  131. }, {
  132. text: '最近三个月',
  133. onClick(picker) {
  134. const end = new Date();
  135. const start = new Date();
  136. end.setTime(end.getTime() - 3600 * 1000 * 24 * 1);
  137. start.setTime(start.getTime() - 3600 * 1000 * 24 * 91);
  138. picker.$emit('pick', [start, end]);
  139. }
  140. }]
  141. },
  142. search: {
  143. dates: [],
  144. organId: null
  145. },
  146. dataInfo: {},
  147. business: {},
  148. }
  149. },
  150. computed: {
  151. isEmpty() {
  152. return !Object.keys(this.dataInfo).length
  153. }
  154. },
  155. created(){
  156. this.$set(this.search, 'dates', getInitDate())
  157. },
  158. mounted () {
  159. this.FetchDetail()
  160. this.reset()
  161. this.$store.dispatch('setBranchs')
  162. },
  163. methods: {
  164. reset() {
  165. this.$set(this.search, 'dates', getInitDate())
  166. this.$set(this.search, 'organId', null)
  167. this.FetchDetail()
  168. },
  169. async FetchDetail() {
  170. const data = {}
  171. try {
  172. const {dates, ...rest} = this.search
  173. const res = await getIndex({
  174. ...rest,
  175. ...getTimes(dates, ['startDate', 'endDate'])
  176. })
  177. for (const item of res.data) {
  178. data[item.dataType] = {
  179. ...item,
  180. desc: descs[item.dataType]
  181. }
  182. }
  183. } catch (error) {
  184. console.log(error)
  185. }
  186. this.dataInfo = data
  187. },
  188. }
  189. }
  190. </script>
  191. <style lang="less" scoped>
  192. .container{
  193. overflow: hidden;
  194. .rows{
  195. >div{
  196. margin-bottom: 20px;
  197. }
  198. }
  199. /deep/ .el-card__body .statistic {
  200. margin-bottom: 15px;
  201. padding: 0;
  202. }
  203. }
  204. /deep/.el-card__header{
  205. padding: 0 20px!important
  206. }
  207. </style>
  208. <style lang="scss">
  209. .box {
  210. display: flex;
  211. flex-direction: row;
  212. align-items: center;
  213. height: 55px; line-height: 55px;
  214. .shape {
  215. margin-right: 10px;
  216. height: 18px;
  217. width: 4px;
  218. background-color: #14928a;
  219. }
  220. }
  221. </style>