Commit 3e4d388e701b7b6da39487032b07f2fc646d2530
1 parent
fb06bc83
bpm:增加 OA 请假的创建
Showing
3 changed files
with
66 additions
and
89 deletions
yudao-module-bpm/yudao-module-bpm-biz/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/oa/vo/BpmOALeaveBaseVO.java
| @@ -27,7 +27,7 @@ public class BpmOALeaveBaseVO { | @@ -27,7 +27,7 @@ public class BpmOALeaveBaseVO { | ||
| 27 | @ApiModelProperty(value = "请假类型", required = true, example = "1", notes = "参见 bpm_oa_type 枚举") | 27 | @ApiModelProperty(value = "请假类型", required = true, example = "1", notes = "参见 bpm_oa_type 枚举") |
| 28 | private Integer type; | 28 | private Integer type; |
| 29 | 29 | ||
| 30 | - @ApiModelProperty(value = "原因", required = true, example = "阅读芋道源码") | 30 | + @ApiModelProperty(value = "原因", example = "阅读芋道源码") |
| 31 | private String reason; | 31 | private String reason; |
| 32 | 32 | ||
| 33 | } | 33 | } |
yudao-ui-admin-vue3/src/views/bpm/oa/leave/create.vue
| 1 | <template> | 1 | <template> |
| 2 | - <div class="app-container"> | ||
| 3 | - <el-form ref="createForm" :model="form" :rules="rules" label-width="80px"> | ||
| 4 | - <el-form-item label="开始时间" prop="startTime"> | ||
| 5 | - <el-date-picker clearable v-model="form.startTime" type="date" placeholder="选择开始时间" /> | ||
| 6 | - </el-form-item> | ||
| 7 | - <el-form-item label="结束时间" prop="endTime"> | ||
| 8 | - <el-date-picker clearable v-model="form.endTime" type="date" placeholder="选择结束时间" /> | ||
| 9 | - </el-form-item> | ||
| 10 | - <el-form-item label="请假类型" prop="type"> | ||
| 11 | - <el-select v-model="form.type" placeholder="请选择"> | ||
| 12 | - <el-option | ||
| 13 | - v-for="dict in typeDictData" | ||
| 14 | - :key="parseInt(dict.value)" | ||
| 15 | - :label="dict.label" | ||
| 16 | - :value="parseInt(dict.value)" | ||
| 17 | - /> | ||
| 18 | - </el-select> | ||
| 19 | - </el-form-item> | ||
| 20 | - <el-form-item label="原因" prop="reason"> | ||
| 21 | - <el-input | ||
| 22 | - style="width: 650px" | ||
| 23 | - type="textarea" | ||
| 24 | - :rows="3" | ||
| 25 | - v-model="form.reason" | ||
| 26 | - placeholder="请输入原因" | ||
| 27 | - /> | ||
| 28 | - </el-form-item> | ||
| 29 | - <el-form-item> | ||
| 30 | - <el-button type="primary" @click="submitForm(createForm)">提 交</el-button> | ||
| 31 | - </el-form-item> | ||
| 32 | - </el-form> | ||
| 33 | - </div> | 2 | + <ContentWrap> |
| 3 | + <!-- 对话框(添加 / 修改) --> | ||
| 4 | + <Form :schema="allSchemas.formSchema" :rules="rules" ref="formRef" /> | ||
| 5 | + <!-- 按钮:保存 --> | ||
| 6 | + <XButton | ||
| 7 | + type="primary" | ||
| 8 | + :title="t('action.save')" | ||
| 9 | + :loading="actionLoading" | ||
| 10 | + @click="submitForm" | ||
| 11 | + /> | ||
| 12 | + </ContentWrap> | ||
| 34 | </template> | 13 | </template> |
| 35 | <script setup lang="ts"> | 14 | <script setup lang="ts"> |
| 36 | -import { ref, reactive } from 'vue' | ||
| 37 | -import { | ||
| 38 | - ElInput, | ||
| 39 | - ElSelect, | ||
| 40 | - ElOption, | ||
| 41 | - ElForm, | ||
| 42 | - ElFormItem, | ||
| 43 | - ElMessage, | ||
| 44 | - ElDatePicker | ||
| 45 | -} from 'element-plus' | ||
| 46 | -import type { FormInstance } from 'element-plus' | ||
| 47 | -import { createLeaveApi } from '@/api/bpm/leave' | ||
| 48 | -import { getDictOptions, DICT_TYPE } from '@/utils/dict' | ||
| 49 | -import { useRouter } from 'vue-router' | 15 | +import { ref } from 'vue' |
| 16 | +import { FormExpose } from '@/components/Form' | ||
| 17 | +import XEUtils from 'xe-utils' | ||
| 18 | + | ||
| 19 | +// 业务相关的 import | ||
| 20 | +import * as LeaveApi from '@/api/bpm/leave' | ||
| 21 | +import { rules, allSchemas } from './leave.data' | ||
| 22 | + | ||
| 23 | +const { t } = useI18n() // 国际化 | ||
| 24 | +const message = useMessage() // 消息弹窗 | ||
| 25 | +const router = useRouter() // 路由 | ||
| 50 | 26 | ||
| 51 | -const { push } = useRouter() | ||
| 52 | -const createForm = ref() | ||
| 53 | // 表单参数 | 27 | // 表单参数 |
| 54 | -const form = ref({ | ||
| 55 | - startTime: undefined, | ||
| 56 | - endTime: undefined, | ||
| 57 | - type: undefined, | ||
| 58 | - reason: undefined | ||
| 59 | -}) | ||
| 60 | -// 表单校验 | ||
| 61 | -const rules = reactive({ | ||
| 62 | - startTime: [{ required: true, message: '开始时间不能为空', trigger: 'blur' }], | ||
| 63 | - endTime: [{ required: true, message: '结束时间不能为空', trigger: 'blur' }], | ||
| 64 | - type: [{ required: true, message: '请假类型不能为空', trigger: 'change' }], | ||
| 65 | - reason: [{ required: true, message: '请假原因不能为空', trigger: 'change' }] | ||
| 66 | -}) | ||
| 67 | -const typeDictData = getDictOptions(DICT_TYPE.BPM_OA_LEAVE_TYPE) | 28 | +const actionLoading = ref(false) // 按钮 Loading |
| 29 | +const formRef = ref<FormExpose>() // 表单 Ref | ||
| 68 | 30 | ||
| 69 | -const submitForm = async (formEl: FormInstance | undefined) => { | ||
| 70 | - if (!formEl) return | ||
| 71 | - await formEl.validate((valid, fields) => { | ||
| 72 | - if (valid) { | ||
| 73 | - console.log(form.value, 'submit!') | ||
| 74 | - form.value.startTime = Date.parse(form.value.startTime) | ||
| 75 | - form.value.endTime = Date.parse(form.value.endTime) | 31 | +// 提交按钮 |
| 32 | +const submitForm = async () => { | ||
| 33 | + const elForm = unref(formRef)?.getElFormRef() | ||
| 34 | + if (!elForm) return | ||
| 35 | + elForm.validate(async (valid) => { | ||
| 36 | + if (!valid) { | ||
| 37 | + return | ||
| 38 | + } | ||
| 39 | + try { | ||
| 40 | + // 设置提交中 | ||
| 41 | + actionLoading.value = true | ||
| 42 | + const data = unref(formRef)?.formModel as LeaveApi.LeaveVO | ||
| 43 | + data.startTime = XEUtils.toDateString(data.startTime, 'yyyy-MM-dd HH:mm:ss') | ||
| 44 | + data.endTime = XEUtils.toDateString(data.endTime, 'yyyy-MM-dd HH:mm:ss') | ||
| 76 | // 添加的提交 | 45 | // 添加的提交 |
| 77 | - createLeaveApi(form.value).then((response) => { | ||
| 78 | - console.log(response, 'response') | ||
| 79 | - ElMessage({ | ||
| 80 | - type: 'success', | ||
| 81 | - message: '发起成功' | ||
| 82 | - }) | ||
| 83 | - push('/bpm/oa/leave') | 46 | + await LeaveApi.createLeaveApi(data) |
| 47 | + message.success(t('common.createSuccess')) | ||
| 48 | + // 关闭窗口 | ||
| 49 | + await router.push({ | ||
| 50 | + path: '/oa/leave/create' | ||
| 84 | }) | 51 | }) |
| 85 | - } else { | ||
| 86 | - console.log('error submit!', fields) | 52 | + } finally { |
| 53 | + actionLoading.value = false | ||
| 87 | } | 54 | } |
| 88 | }) | 55 | }) |
| 89 | } | 56 | } |
yudao-ui-admin-vue3/src/views/bpm/oa/leave/leave.data.ts
| 1 | -import { reactive } from 'vue' | ||
| 2 | -import { DICT_TYPE } from '@/utils/dict' | ||
| 3 | import { VxeCrudSchema, useVxeCrudSchemas } from '@/hooks/web/useVxeCrudSchemas' | 1 | import { VxeCrudSchema, useVxeCrudSchemas } from '@/hooks/web/useVxeCrudSchemas' |
| 4 | -// 国际化 | ||
| 5 | -const { t } = useI18n() | 2 | + |
| 3 | +const { t } = useI18n() // 国际化 | ||
| 4 | + | ||
| 6 | // 表单校验 | 5 | // 表单校验 |
| 7 | export const rules = reactive({ | 6 | export const rules = reactive({ |
| 8 | startTime: [{ required: true, message: '开始时间不能为空', trigger: 'blur' }], | 7 | startTime: [{ required: true, message: '开始时间不能为空', trigger: 'blur' }], |
| 9 | endTime: [{ required: true, message: '结束时间不能为空', trigger: 'blur' }], | 8 | endTime: [{ required: true, message: '结束时间不能为空', trigger: 'blur' }], |
| 10 | - type: [{ required: true, message: '请假类型不能为空', trigger: 'change' }], | ||
| 11 | - reason: [{ required: true, message: '请假原因不能为空', trigger: 'change' }] | 9 | + type: [{ required: true, message: '请假类型不能为空', trigger: 'change' }] |
| 12 | }) | 10 | }) |
| 13 | 11 | ||
| 14 | // crudSchemas | 12 | // crudSchemas |
| @@ -24,7 +22,8 @@ const crudSchemas = reactive<VxeCrudSchema>({ | @@ -24,7 +22,8 @@ const crudSchemas = reactive<VxeCrudSchema>({ | ||
| 24 | field: 'result', | 22 | field: 'result', |
| 25 | dictType: DICT_TYPE.BPM_PROCESS_INSTANCE_RESULT, | 23 | dictType: DICT_TYPE.BPM_PROCESS_INSTANCE_RESULT, |
| 26 | dictClass: 'number', | 24 | dictClass: 'number', |
| 27 | - isSearch: true | 25 | + isSearch: true, |
| 26 | + isForm: false | ||
| 28 | }, | 27 | }, |
| 29 | { | 28 | { |
| 30 | title: t('common.startTimeText'), | 29 | title: t('common.startTimeText'), |
| @@ -35,6 +34,9 @@ const crudSchemas = reactive<VxeCrudSchema>({ | @@ -35,6 +34,9 @@ const crudSchemas = reactive<VxeCrudSchema>({ | ||
| 35 | }, | 34 | }, |
| 36 | detail: { | 35 | detail: { |
| 37 | dateFormat: 'YYYY-MM-DD' | 36 | dateFormat: 'YYYY-MM-DD' |
| 37 | + }, | ||
| 38 | + form: { | ||
| 39 | + component: 'DatePicker' | ||
| 38 | } | 40 | } |
| 39 | }, | 41 | }, |
| 40 | { | 42 | { |
| @@ -46,11 +48,14 @@ const crudSchemas = reactive<VxeCrudSchema>({ | @@ -46,11 +48,14 @@ const crudSchemas = reactive<VxeCrudSchema>({ | ||
| 46 | }, | 48 | }, |
| 47 | detail: { | 49 | detail: { |
| 48 | dateFormat: 'YYYY-MM-DD' | 50 | dateFormat: 'YYYY-MM-DD' |
| 51 | + }, | ||
| 52 | + form: { | ||
| 53 | + component: 'DatePicker' | ||
| 49 | } | 54 | } |
| 50 | }, | 55 | }, |
| 51 | { | 56 | { |
| 52 | title: '请假类型', | 57 | title: '请假类型', |
| 53 | - field: 'result', | 58 | + field: 'type', |
| 54 | dictType: DICT_TYPE.BPM_OA_LEAVE_TYPE, | 59 | dictType: DICT_TYPE.BPM_OA_LEAVE_TYPE, |
| 55 | dictClass: 'number', | 60 | dictClass: 'number', |
| 56 | isSearch: true | 61 | isSearch: true |
| @@ -58,7 +63,11 @@ const crudSchemas = reactive<VxeCrudSchema>({ | @@ -58,7 +63,11 @@ const crudSchemas = reactive<VxeCrudSchema>({ | ||
| 58 | { | 63 | { |
| 59 | title: '原因', | 64 | title: '原因', |
| 60 | field: 'reason', | 65 | field: 'reason', |
| 61 | - isSearch: true | 66 | + isSearch: true, |
| 67 | + componentProps: { | ||
| 68 | + type: 'textarea', | ||
| 69 | + rows: 4 | ||
| 70 | + } | ||
| 62 | }, | 71 | }, |
| 63 | { | 72 | { |
| 64 | title: '申请时间', | 73 | title: '申请时间', |
| @@ -73,7 +82,8 @@ const crudSchemas = reactive<VxeCrudSchema>({ | @@ -73,7 +82,8 @@ const crudSchemas = reactive<VxeCrudSchema>({ | ||
| 73 | itemRender: { | 82 | itemRender: { |
| 74 | name: 'XDataTimePicker' | 83 | name: 'XDataTimePicker' |
| 75 | } | 84 | } |
| 76 | - } | 85 | + }, |
| 86 | + isForm: false | ||
| 77 | } | 87 | } |
| 78 | ] | 88 | ] |
| 79 | }) | 89 | }) |