Commit 3e4d388e701b7b6da39487032b07f2fc646d2530

Authored by YunaiV
1 parent fb06bc83

bpm:增加 OA 请假的创建

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&lt;VxeCrudSchema&gt;({ @@ -24,7 +22,8 @@ const crudSchemas = reactive&lt;VxeCrudSchema&gt;({
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&lt;VxeCrudSchema&gt;({ @@ -35,6 +34,9 @@ const crudSchemas = reactive&lt;VxeCrudSchema&gt;({
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&lt;VxeCrudSchema&gt;({ @@ -46,11 +48,14 @@ const crudSchemas = reactive&lt;VxeCrudSchema&gt;({
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&lt;VxeCrudSchema&gt;({ @@ -58,7 +63,11 @@ const crudSchemas = reactive&lt;VxeCrudSchema&gt;({
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&lt;VxeCrudSchema&gt;({ @@ -73,7 +82,8 @@ const crudSchemas = reactive&lt;VxeCrudSchema&gt;({
73 itemRender: { 82 itemRender: {
74 name: 'XDataTimePicker' 83 name: 'XDataTimePicker'
75 } 84 }
76 - } 85 + },
  86 + isForm: false
77 } 87 }
78 ] 88 ]
79 }) 89 })