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 27 @ApiModelProperty(value = "请假类型", required = true, example = "1", notes = "参见 bpm_oa_type 枚举")
28 28 private Integer type;
29 29  
30   - @ApiModelProperty(value = "原因", required = true, example = "阅读芋道源码")
  30 + @ApiModelProperty(value = "原因", example = "阅读芋道源码")
31 31 private String reason;
32 32  
33 33 }
... ...
yudao-ui-admin-vue3/src/views/bpm/oa/leave/create.vue
1 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 13 </template>
35 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 1 import { VxeCrudSchema, useVxeCrudSchemas } from '@/hooks/web/useVxeCrudSchemas'
4   -// 国际化
5   -const { t } = useI18n()
  2 +
  3 +const { t } = useI18n() // 国际化
  4 +
6 5 // 表单校验
7 6 export const rules = reactive({
8 7 startTime: [{ required: true, message: '开始时间不能为空', trigger: 'blur' }],
9 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 12 // crudSchemas
... ... @@ -24,7 +22,8 @@ const crudSchemas = reactive&lt;VxeCrudSchema&gt;({
24 22 field: 'result',
25 23 dictType: DICT_TYPE.BPM_PROCESS_INSTANCE_RESULT,
26 24 dictClass: 'number',
27   - isSearch: true
  25 + isSearch: true,
  26 + isForm: false
28 27 },
29 28 {
30 29 title: t('common.startTimeText'),
... ... @@ -35,6 +34,9 @@ const crudSchemas = reactive&lt;VxeCrudSchema&gt;({
35 34 },
36 35 detail: {
37 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 48 },
47 49 detail: {
48 50 dateFormat: 'YYYY-MM-DD'
  51 + },
  52 + form: {
  53 + component: 'DatePicker'
49 54 }
50 55 },
51 56 {
52 57 title: '请假类型',
53   - field: 'result',
  58 + field: 'type',
54 59 dictType: DICT_TYPE.BPM_OA_LEAVE_TYPE,
55 60 dictClass: 'number',
56 61 isSearch: true
... ... @@ -58,7 +63,11 @@ const crudSchemas = reactive&lt;VxeCrudSchema&gt;({
58 63 {
59 64 title: '原因',
60 65 field: 'reason',
61   - isSearch: true
  66 + isSearch: true,
  67 + componentProps: {
  68 + type: 'textarea',
  69 + rows: 4
  70 + }
62 71 },
63 72 {
64 73 title: '申请时间',
... ... @@ -73,7 +82,8 @@ const crudSchemas = reactive&lt;VxeCrudSchema&gt;({
73 82 itemRender: {
74 83 name: 'XDataTimePicker'
75 84 }
76   - }
  85 + },
  86 + isForm: false
77 87 }
78 88 ]
79 89 })
... ...