leaveForm.vue 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260
  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 this.formatDatedel0(site.lastDate)
  97. })
  98. // 请假的日期数据
  99. this.activeList = res.data.filter(site => site.type == 1).map(site => {
  100. return this.formatDatedel0(site.lastDate)
  101. })
  102. console.log(this.activeList)
  103. }).catch(error => {
  104. this.$refs.uTips.show({
  105. title: error.message,
  106. type: 'warning',
  107. })
  108. })
  109. },
  110. onReady() {
  111. this.$refs.form.setRules(this.rules);
  112. },
  113. methods: {
  114. // 选择请假类型
  115. handleGetType(args) {
  116. this.form.type = this.selectorObj[args[0]]['cateName']
  117. this.form.leaveTime = ''
  118. this.form.leavePic = ''
  119. this.form.leaveReason = ''
  120. // 移除表单校验结果
  121. this.$nextTick(() => {
  122. this.$refs.form.resetFields()
  123. })
  124. },
  125. // 图片上传成功
  126. handlePicSuccess(args) {
  127. if(args.status == 10000) {
  128. this.form.leavePic = args.data.url
  129. } else {
  130. this.$refs.uTips.show({
  131. title: args.message,
  132. type: 'warning',
  133. })
  134. }
  135. },
  136. // 设置请假日期
  137. setLeaveTime(object) {
  138. // 今天0点的时间戳
  139. const nowTimeStamp = (new Date(new Date().toLocaleDateString()).getTime()) / 1000
  140. // 今天后3天的时间戳
  141. const nextThreeDayTimeStamp = nowTimeStamp + 86400
  142. let date = object.year + '-' + object.month + '-' + object.day
  143. // 当天是否可请假
  144. if (this.availableList.filter(site => site == date).length) {
  145. // 是否为病假
  146. if(this.form.type === '事假') {
  147. // 病假需提前3天请
  148. if(this.dateFormatTimeStamp(date) >= nextThreeDayTimeStamp) {
  149. this.form.leaveTime = date
  150. } else {
  151. this.form.leaveTime = ''
  152. this.$refs.uTips.show({
  153. title: '事假需提前1天请',
  154. type: 'error',
  155. })
  156. }
  157. } else {
  158. if(this.dateFormatTimeStamp(date) >= nowTimeStamp) {
  159. this.form.leaveTime = date
  160. } else {
  161. this.form.leaveTime = ''
  162. this.$refs.uTips.show({
  163. title: '不能选择今天之前',
  164. type: 'error',
  165. })
  166. }
  167. }
  168. } else {
  169. this.form.leaveTime = ''
  170. this.$refs.uTips.show({
  171. title: '请选择可用日期',
  172. type: 'error',
  173. })
  174. }
  175. },
  176. // 日期转时间戳
  177. dateFormatTimeStamp(date = null,second = true) {
  178.     if (!date) return parseInt(new Date().getTime() / (second ? 1000 : 1))
  179.     return parseInt(new Date(date).getTime() / (second ? 1000 : 1))
  180. },
  181. formatDate(str) {
  182. // 根据 - 符号拆分
  183. return str
  184. .split("-")
  185. .map((item) => {
  186. // +item 将item字符串转换为数字
  187. // 小于10的时候就补全一个前缀0
  188. if (+item < 10) {
  189. return "0" + +item;
  190. }
  191. // 大于10的时候不用补0
  192. return item;
  193. })
  194. .join("-"); // 最后重组回来
  195. },
  196. formatDatedel0(str) {
  197. // 根据 - 符号拆分
  198. return str
  199. .split("-")
  200. .map((item) => {
  201. // +item 将item字符串转换为数字
  202. // 小于10的时候就补全一个前缀0
  203. if (+item < 10) {
  204. return Number(item);
  205. }
  206. // 大于10的时候不用补0
  207. return item;
  208. })
  209. .join("-"); // 最后重组回来
  210. },
  211. // 提交表单
  212. submitForm() {
  213. this.$refs.form.validate(valid => {
  214. if (valid) {
  215. this.form.leaveTime=this.formatDate(this.form.leaveTime)
  216. NET.request(API.submitLevelForm, {
  217. classId: this.classId,
  218. studentId: this.studentId,
  219. ...{ ...this.form, type: this.form.type == '事假' ? 1 : 2 }
  220. }, 'POST').then(res => {
  221. this.$refs.uTips.show({
  222. title: '请假成功',
  223. type: 'success',
  224. })
  225. setTimeout(() => {
  226. uni.navigateBack()
  227. }, 1000)
  228. }).catch(error => {
  229. this.$refs.uTips.show({
  230. title: error.message,
  231. type: 'warning',
  232. })
  233. })
  234. }
  235. });
  236. },
  237. },
  238. }
  239. </script>
  240. <style>
  241. page {
  242. width: 100%;
  243. height: 100%;
  244. position: relative;
  245. }
  246. </style>
  247. <style lang="scss" scoped>
  248. @import "@/static/css/themes.scss";
  249. .content {
  250. width: 100%;
  251. float: left;
  252. padding: 0 15px 60px 15px;
  253. box-sizing: border-box;
  254. }
  255. </style>