leaveForm.vue 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252
  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 * 3
  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: '病假需提前3天请',
  154. type: 'error',
  155. })
  156. }
  157. } else {
  158. this.form.leaveTime = date
  159. }
  160. } else {
  161. this.form.leaveTime = ''
  162. this.$refs.uTips.show({
  163. title: '请选择可用日期',
  164. type: 'error',
  165. })
  166. }
  167. },
  168. // 日期转时间戳
  169. dateFormatTimeStamp(date = null,second = true) {
  170.     if (!date) return parseInt(new Date().getTime() / (second ? 1000 : 1))
  171.     return parseInt(new Date(date).getTime() / (second ? 1000 : 1))
  172. },
  173. formatDate(str) {
  174. // 根据 - 符号拆分
  175. return str
  176. .split("-")
  177. .map((item) => {
  178. // +item 将item字符串转换为数字
  179. // 小于10的时候就补全一个前缀0
  180. if (+item < 10) {
  181. return "0" + +item;
  182. }
  183. // 大于10的时候不用补0
  184. return item;
  185. })
  186. .join("-"); // 最后重组回来
  187. },
  188. formatDatedel0(str) {
  189. // 根据 - 符号拆分
  190. return str
  191. .split("-")
  192. .map((item) => {
  193. // +item 将item字符串转换为数字
  194. // 小于10的时候就补全一个前缀0
  195. if (+item < 10) {
  196. return Number(item);
  197. }
  198. // 大于10的时候不用补0
  199. return item;
  200. })
  201. .join("-"); // 最后重组回来
  202. },
  203. // 提交表单
  204. submitForm() {
  205. this.$refs.form.validate(valid => {
  206. if (valid) {
  207. this.form.leaveTime=this.formatDate(this.form.leaveTime)
  208. NET.request(API.submitLevelForm, {
  209. classId: this.classId,
  210. studentId: this.studentId,
  211. ...{ ...this.form, type: this.form.type == '事假' ? 1 : 2 }
  212. }, 'POST').then(res => {
  213. this.$refs.uTips.show({
  214. title: '请假成功',
  215. type: 'success',
  216. })
  217. setTimeout(() => {
  218. uni.navigateBack()
  219. }, 1000)
  220. }).catch(error => {
  221. this.$refs.uTips.show({
  222. title: error.message,
  223. type: 'warning',
  224. })
  225. })
  226. }
  227. });
  228. },
  229. },
  230. }
  231. </script>
  232. <style>
  233. page {
  234. width: 100%;
  235. height: 100%;
  236. position: relative;
  237. }
  238. </style>
  239. <style lang="scss" scoped>
  240. @import "@/static/css/themes.scss";
  241. .content {
  242. width: 100%;
  243. float: left;
  244. padding: 0 15px 60px 15px;
  245. box-sizing: border-box;
  246. }
  247. </style>