leaveForm.vue 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218
  1. <template>
  2. <view class="content">
  3. <u-form :model="form" ref="form" label-width="140">
  4. <u-form-item label="请假类型" prop="type" required>
  5. <u-input v-model="form.type" placeholder="请选择请假类型" :select-open="leaveTypeShow" type="select" @click="leaveTypeShow = true" />
  6. </u-form-item>
  7. <u-form-item label="请假时间" prop="leaveTime" required>
  8. <u-input v-model="form.leaveTime" placeholder="请选择请假时间" :select-open="leaveTimeShow" type="select" @click="leaveTimeShow = true" />
  9. </u-form-item>
  10. <u-form-item label="上传证明" v-if="form.type === '病假'" prop="leavePic" required>
  11. <u-upload :action="action" :header="header" :file-list="fileList" max-count="1" :multiple="false" :show-progress="false" @on-success="handlePicSuccess"></u-upload>
  12. </u-form-item>
  13. <u-form-item label="请假理由" prop="leaveReason" required>
  14. <u-input v-model="form.leaveReason" placeholder="请输入请假理由" type="text" />
  15. </u-form-item>
  16. </u-form>
  17. <u-picker mode="selector" v-model="leaveTypeShow" :range="selectorObj" range-key="cateName" @confirm="handleGetType"></u-picker>
  18. <u-calendar v-model="leaveTimeShow" mode="date" :active-bg-color="mainColor" btn-type="error" availableText="有课"
  19. :available="availableList" activeText="已请假" :activeList="activeList" @change="setLeaveTime" max-date="2300-12-31"></u-calendar>
  20. <view class="handle-fix-box">
  21. <u-button type="warning" shape="circle" :ripple="true" :custom-style="customStyle" @click="submitForm()">提交</u-button>
  22. </view>
  23. <u-top-tips ref="uTips"></u-top-tips>
  24. </view>
  25. </template>
  26. <script>
  27. import {
  28. mapGetters
  29. } from 'vuex'
  30. const NET = require('@/utils/request')
  31. const API = require('@/config/api')
  32. export default {
  33. computed: {
  34. ...mapGetters([
  35. 'mainColor',
  36. 'customStyle',
  37. ])
  38. },
  39. data() {
  40. return {
  41. action: API.uploadFile,
  42. header: {
  43. Authorization: uni.getStorageSync('token')
  44. },
  45. classId: '',
  46. studentId: '',
  47. form: {
  48. type: '病假',
  49. leaveTime: '',
  50. leavePic: '',
  51. leaveReason: '',
  52. },
  53. rules: {
  54. leaveTime: [{
  55. required: true,
  56. message: '请选择请假时间',
  57. trigger: 'change'
  58. }],
  59. leaveReason: [{
  60. required: true,
  61. message: '请输入请假理由',
  62. trigger: 'change'
  63. }],
  64. leavePic: [{
  65. required: true,
  66. message: '请上传证明照片',
  67. trigger: 'change'
  68. }],
  69. },
  70. leaveTypeShow: false,
  71. selectorObj: [
  72. {
  73. cateName: '病假',
  74. type: 1
  75. },
  76. {
  77. cateName: '事假',
  78. type: 2
  79. }
  80. ],
  81. leaveTimeShow: false,
  82. availableList: [],
  83. activeList: [],
  84. fileList: []
  85. }
  86. },
  87. onLoad(options) {
  88. this.classId = options.id
  89. this.studentId = options.studentId
  90. NET.request(API.getLeaveList, {
  91. id: this.classId
  92. }, 'POST').then(res => {
  93. // type: 0:有课 1:请假
  94. // 有课的日期数据
  95. this.availableList = res.data.filter(site => site.type == 0).map(site => {
  96. return site.lastDate
  97. })
  98. // 请假的日期数据
  99. this.activeList = res.data.filter(site => site.type == 1).map(site => {
  100. return site.lastDate
  101. })
  102. }).catch(error => {
  103. this.$refs.uTips.show({
  104. title: error.message,
  105. type: 'warning',
  106. })
  107. })
  108. },
  109. onReady() {
  110. this.$refs.form.setRules(this.rules);
  111. },
  112. methods: {
  113. // 选择请假类型
  114. handleGetType(args) {
  115. this.form.type = this.selectorObj[args[0]]['cateName']
  116. this.form.leaveTime = ''
  117. this.form.leavePic = ''
  118. this.form.leaveReason = ''
  119. // 移除表单校验结果
  120. this.$nextTick(() => {
  121. this.$refs.form.resetFields()
  122. })
  123. },
  124. // 图片上传成功
  125. handlePicSuccess(args) {
  126. if(args.status == 10000) {
  127. this.form.leavePic = args.data.url
  128. } else {
  129. this.$refs.uTips.show({
  130. title: args.message,
  131. type: 'warning',
  132. })
  133. }
  134. },
  135. // 设置请假日期
  136. setLeaveTime(object) {
  137. // 今天0点的时间戳
  138. const nowTimeStamp = (new Date(new Date().toLocaleDateString()).getTime()) / 1000
  139. // 今天后3天的时间戳
  140. const nextThreeDayTimeStamp = nowTimeStamp + 86400 * 3
  141. let date = object.year + '-' + object.month + '-' + object.day
  142. // 当天是否可请假
  143. if (this.availableList.filter(site => site == date).length) {
  144. // 是否为病假
  145. if(this.form.type === '病假') {
  146. // 病假需提前3天请
  147. if(this.dateFormatTimeStamp(date) > nextThreeDayTimeStamp) {
  148. this.form.leaveTime = date
  149. } else {
  150. this.form.leaveTime = ''
  151. this.$refs.uTips.show({
  152. title: '病假需提前3天请',
  153. type: 'error',
  154. })
  155. }
  156. } else {
  157. this.form.leaveTime = date
  158. }
  159. } else {
  160. this.form.leaveTime = ''
  161. this.$refs.uTips.show({
  162. title: '请选择可用日期',
  163. type: 'error',
  164. })
  165. }
  166. },
  167. // 日期转时间戳
  168. dateFormatTimeStamp(date = null,second = true) {
  169.     if (!date) return parseInt(new Date().getTime() / (second ? 1000 : 1))
  170.     return parseInt(new Date(date).getTime() / (second ? 1000 : 1))
  171. },
  172. // 提交表单
  173. submitForm() {
  174. this.$refs.form.validate(valid => {
  175. if (valid) {
  176. NET.request(API.submitLevelForm, {
  177. classId: this.classId,
  178. studentId: this.studentId,
  179. ...{ ...this.form, type: this.form.type == '事假' ? 1 : 2 }
  180. }, 'POST').then(res => {
  181. this.$refs.uTips.show({
  182. title: '请假成功',
  183. type: 'success',
  184. })
  185. setTimeout(() => {
  186. uni.navigateBack()
  187. }, 1000)
  188. }).catch(error => {
  189. this.$refs.uTips.show({
  190. title: error.message,
  191. type: 'warning',
  192. })
  193. })
  194. }
  195. });
  196. },
  197. },
  198. }
  199. </script>
  200. <style>
  201. page {
  202. width: 100%;
  203. height: 100%;
  204. position: relative;
  205. }
  206. </style>
  207. <style lang="scss" scoped>
  208. @import "@/static/css/themes.scss";
  209. .content {
  210. width: 100%;
  211. float: left;
  212. padding: 0 15px 60px 15px;
  213. box-sizing: border-box;
  214. }
  215. </style>