mirror of
				https://gitee.com/hhyykk/ipms-sjy.git
				synced 2025-10-30 09:48:43 +08:00 
			
		
		
		
	bpm:增加 OA 请假的列表
This commit is contained in:
		| @@ -1,5 +1,15 @@ | |||||||
| import request from '@/config/axios' | import request from '@/config/axios' | ||||||
| import { LeaveVO } from './types' |  | ||||||
|  | export type LeaveVO = { | ||||||
|  |   id: number | ||||||
|  |   result: number | ||||||
|  |   type: number | ||||||
|  |   reason: string | ||||||
|  |   processInstanceId: string | ||||||
|  |   startTime: string | ||||||
|  |   endTime: string | ||||||
|  |   createTime: string | ||||||
|  | } | ||||||
|  |  | ||||||
| // 创建请假申请 | // 创建请假申请 | ||||||
| export const createLeaveApi = async (data: LeaveVO) => { | export const createLeaveApi = async (data: LeaveVO) => { | ||||||
|   | |||||||
| @@ -1,10 +0,0 @@ | |||||||
| export type LeaveVO = { |  | ||||||
|   id: number |  | ||||||
|   result: number |  | ||||||
|   type: number |  | ||||||
|   reason: string |  | ||||||
|   processInstanceId: string |  | ||||||
|   startTime: string |  | ||||||
|   endTime: string |  | ||||||
|   createTime: string |  | ||||||
| } |  | ||||||
| @@ -220,6 +220,54 @@ const remainingRouter: AppRouteRecordRaw[] = [ | |||||||
|           canTo: true, |           canTo: true, | ||||||
|           title: '任务分配规则' |           title: '任务分配规则' | ||||||
|         } |         } | ||||||
|  |       }, | ||||||
|  |       { | ||||||
|  |         path: '/process-instance/create', | ||||||
|  |         component: () => import('@/views/bpm/processInstance/create.vue'), | ||||||
|  |         name: 'BpmProcessInstanceCreate', | ||||||
|  |         meta: { | ||||||
|  |           noCache: true, | ||||||
|  |           hidden: true, | ||||||
|  |           canTo: true, | ||||||
|  |           title: '发起流程', | ||||||
|  |           activeMenu: 'bpm/processInstance/create' | ||||||
|  |         } | ||||||
|  |       }, | ||||||
|  |       { | ||||||
|  |         path: '/process-instance/detail', | ||||||
|  |         component: () => import('@/views/bpm/processInstance/detail.vue'), | ||||||
|  |         name: 'BpmProcessInstanceDetail', | ||||||
|  |         meta: { | ||||||
|  |           noCache: true, | ||||||
|  |           hidden: true, | ||||||
|  |           canTo: true, | ||||||
|  |           title: '流程详情', | ||||||
|  |           activeMenu: 'bpm/processInstance/detail' | ||||||
|  |         } | ||||||
|  |       }, | ||||||
|  |       { | ||||||
|  |         path: '/oa/leave/create', | ||||||
|  |         component: () => import('@/views/bpm/oa/leave/create.vue'), | ||||||
|  |         name: 'OALeaveCreate', | ||||||
|  |         meta: { | ||||||
|  |           noCache: true, | ||||||
|  |           hidden: true, | ||||||
|  |           canTo: true, | ||||||
|  |           title: '发起 OA 请假', | ||||||
|  |           activeMenu: 'bpm/oa/leave/create' | ||||||
|  |         } | ||||||
|  |       }, | ||||||
|  |       { | ||||||
|  |         path: '/oa/leave/detail', | ||||||
|  |         component: () => import('@/views/bpm/oa/leave/detail.vue'), | ||||||
|  |         name: 'OALeaveDetail', | ||||||
|  |         meta: { | ||||||
|  |           noCache: true, | ||||||
|  |           hidden: true, | ||||||
|  |           canTo: true, | ||||||
|  |           title: '查看 OA 请假', | ||||||
|  |           activeMenu: 'bpm/oa/leave/detail' | ||||||
|  |         } | ||||||
|       } |       } | ||||||
|     ] |     ] | ||||||
|   } |   } | ||||||
|   | |||||||
| @@ -3,6 +3,7 @@ export {} | |||||||
| declare global { | declare global { | ||||||
|   const DICT_TYPE: typeof import('@/utils/dict')['DICT_TYPE'] |   const DICT_TYPE: typeof import('@/utils/dict')['DICT_TYPE'] | ||||||
|   const EffectScope: typeof import('vue')['EffectScope'] |   const EffectScope: typeof import('vue')['EffectScope'] | ||||||
|  |   const ElMessage: typeof import('element-plus/es')['ElMessage'] | ||||||
|   const computed: typeof import('vue')['computed'] |   const computed: typeof import('vue')['computed'] | ||||||
|   const createApp: typeof import('vue')['createApp'] |   const createApp: typeof import('vue')['createApp'] | ||||||
|   const customRef: typeof import('vue')['customRef'] |   const customRef: typeof import('vue')['customRef'] | ||||||
|   | |||||||
| @@ -1,4 +0,0 @@ | |||||||
| <template> |  | ||||||
|   <div>index</div> |  | ||||||
| </template> |  | ||||||
| <script setup lang="ts" name="Oa"></script> |  | ||||||
							
								
								
									
										90
									
								
								yudao-ui-admin-vue3/src/views/bpm/oa/leave/create.vue
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										90
									
								
								yudao-ui-admin-vue3/src/views/bpm/oa/leave/create.vue
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,90 @@ | |||||||
|  | <template> | ||||||
|  |   <div class="app-container"> | ||||||
|  |     <el-form ref="createForm" :model="form" :rules="rules" label-width="80px"> | ||||||
|  |       <el-form-item label="开始时间" prop="startTime"> | ||||||
|  |         <el-date-picker clearable v-model="form.startTime" type="date" placeholder="选择开始时间" /> | ||||||
|  |       </el-form-item> | ||||||
|  |       <el-form-item label="结束时间" prop="endTime"> | ||||||
|  |         <el-date-picker clearable v-model="form.endTime" type="date" placeholder="选择结束时间" /> | ||||||
|  |       </el-form-item> | ||||||
|  |       <el-form-item label="请假类型" prop="type"> | ||||||
|  |         <el-select v-model="form.type" placeholder="请选择"> | ||||||
|  |           <el-option | ||||||
|  |             v-for="dict in typeDictData" | ||||||
|  |             :key="parseInt(dict.value)" | ||||||
|  |             :label="dict.label" | ||||||
|  |             :value="parseInt(dict.value)" | ||||||
|  |           /> | ||||||
|  |         </el-select> | ||||||
|  |       </el-form-item> | ||||||
|  |       <el-form-item label="原因" prop="reason"> | ||||||
|  |         <el-input | ||||||
|  |           style="width: 650px" | ||||||
|  |           type="textarea" | ||||||
|  |           :rows="3" | ||||||
|  |           v-model="form.reason" | ||||||
|  |           placeholder="请输入原因" | ||||||
|  |         /> | ||||||
|  |       </el-form-item> | ||||||
|  |       <el-form-item> | ||||||
|  |         <el-button type="primary" @click="submitForm(createForm)">提 交</el-button> | ||||||
|  |       </el-form-item> | ||||||
|  |     </el-form> | ||||||
|  |   </div> | ||||||
|  | </template> | ||||||
|  | <script setup lang="ts"> | ||||||
|  | import { ref, reactive } from 'vue' | ||||||
|  | import { | ||||||
|  |   ElInput, | ||||||
|  |   ElSelect, | ||||||
|  |   ElOption, | ||||||
|  |   ElForm, | ||||||
|  |   ElFormItem, | ||||||
|  |   ElMessage, | ||||||
|  |   ElDatePicker | ||||||
|  | } from 'element-plus' | ||||||
|  | import type { FormInstance } from 'element-plus' | ||||||
|  | import { createLeaveApi } from '@/api/bpm/leave' | ||||||
|  | import { getDictOptions, DICT_TYPE } from '@/utils/dict' | ||||||
|  | import { useRouter } from 'vue-router' | ||||||
|  |  | ||||||
|  | const { push } = useRouter() | ||||||
|  | const createForm = ref() | ||||||
|  | // 表单参数 | ||||||
|  | const form = ref({ | ||||||
|  |   startTime: undefined, | ||||||
|  |   endTime: undefined, | ||||||
|  |   type: undefined, | ||||||
|  |   reason: undefined | ||||||
|  | }) | ||||||
|  | // 表单校验 | ||||||
|  | const rules = reactive({ | ||||||
|  |   startTime: [{ required: true, message: '开始时间不能为空', trigger: 'blur' }], | ||||||
|  |   endTime: [{ required: true, message: '结束时间不能为空', trigger: 'blur' }], | ||||||
|  |   type: [{ required: true, message: '请假类型不能为空', trigger: 'change' }], | ||||||
|  |   reason: [{ required: true, message: '请假原因不能为空', trigger: 'change' }] | ||||||
|  | }) | ||||||
|  | const typeDictData = getDictOptions(DICT_TYPE.BPM_OA_LEAVE_TYPE) | ||||||
|  |  | ||||||
|  | const submitForm = async (formEl: FormInstance | undefined) => { | ||||||
|  |   if (!formEl) return | ||||||
|  |   await formEl.validate((valid, fields) => { | ||||||
|  |     if (valid) { | ||||||
|  |       console.log(form.value, 'submit!') | ||||||
|  |       form.value.startTime = Date.parse(form.value.startTime) | ||||||
|  |       form.value.endTime = Date.parse(form.value.endTime) | ||||||
|  |       // 添加的提交 | ||||||
|  |       createLeaveApi(form.value).then((response) => { | ||||||
|  |         console.log(response, 'response') | ||||||
|  |         ElMessage({ | ||||||
|  |           type: 'success', | ||||||
|  |           message: '发起成功' | ||||||
|  |         }) | ||||||
|  |         push('/bpm/oa/leave') | ||||||
|  |       }) | ||||||
|  |     } else { | ||||||
|  |       console.log('error submit!', fields) | ||||||
|  |     } | ||||||
|  |   }) | ||||||
|  | } | ||||||
|  | </script> | ||||||
							
								
								
									
										54
									
								
								yudao-ui-admin-vue3/src/views/bpm/oa/leave/detail.vue
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										54
									
								
								yudao-ui-admin-vue3/src/views/bpm/oa/leave/detail.vue
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,54 @@ | |||||||
|  | <template> | ||||||
|  |   <div class="app-container"> | ||||||
|  |     <!-- 对话框(添加 / 修改) --> | ||||||
|  |     <el-form ref="form" :model="form" label-width="100px"> | ||||||
|  |       <el-form-item label="开始时间:" prop="startTime"> | ||||||
|  |         {{ formatDate(form.startTime, '{y}-{m}-{d}') }} | ||||||
|  |       </el-form-item> | ||||||
|  |       <el-form-item label="结束时间:" prop="endTime"> | ||||||
|  |         {{ formatDate(form.endTime, '{y}-{m}-{d}') }} | ||||||
|  |       </el-form-item> | ||||||
|  |       <el-form-item label="请假类型:" prop="type"> | ||||||
|  |         <dict-tag :type="DICT_TYPE.BPM_OA_LEAVE_TYPE" :value="form.type" /> | ||||||
|  |       </el-form-item> | ||||||
|  |       <el-form-item label="原因:" prop="reason"> {{ form.reason }}</el-form-item> | ||||||
|  |     </el-form> | ||||||
|  |   </div> | ||||||
|  | </template> | ||||||
|  |  | ||||||
|  | <script lang="ts" setup> | ||||||
|  | import { onMounted, ref } from 'vue' | ||||||
|  | import { ElMessage } from 'element-plus' | ||||||
|  |  | ||||||
|  | import { getLeaveApi } from '@/api/bpm/leave' | ||||||
|  | import { DICT_TYPE } from '@/utils/dict' | ||||||
|  | import { formatDate } from '@/utils/formatTime' | ||||||
|  | import { useRouter } from 'vue-router' | ||||||
|  | const router = useRouter() | ||||||
|  | // 请假编号 | ||||||
|  | const id = ref() | ||||||
|  | // 表单参数 | ||||||
|  | const form = ref({ | ||||||
|  |   startTime: undefined, | ||||||
|  |   endTime: undefined, | ||||||
|  |   type: undefined, | ||||||
|  |   reason: undefined | ||||||
|  | }) | ||||||
|  | /** 获得请假信息 */ | ||||||
|  | const getDetail = () => { | ||||||
|  |   getLeaveApi(id.value).then((response) => { | ||||||
|  |     form.value = response.data | ||||||
|  |   }) | ||||||
|  | } | ||||||
|  | onMounted(() => { | ||||||
|  |   id.value = router.currentRoute.value.query.id | ||||||
|  |   if (!id.value) { | ||||||
|  |     ElMessage({ | ||||||
|  |       type: 'error', | ||||||
|  |       message: '未传递 id 参数,无法查看 OA 请假信息' | ||||||
|  |     }) | ||||||
|  |     return | ||||||
|  |   } | ||||||
|  |   getDetail() | ||||||
|  | }) | ||||||
|  | </script> | ||||||
							
								
								
									
										81
									
								
								yudao-ui-admin-vue3/src/views/bpm/oa/leave/index.vue
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										81
									
								
								yudao-ui-admin-vue3/src/views/bpm/oa/leave/index.vue
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,81 @@ | |||||||
|  | <template> | ||||||
|  |   <XTable @register="registerTable"> | ||||||
|  |     <template #toolbar_buttons> | ||||||
|  |       <!-- 操作:发起请假 --> | ||||||
|  |       <XButton type="primary" preIcon="ep:plus" title="发起请假" @click="handleCreate()" /> | ||||||
|  |     </template> | ||||||
|  |     <template #actionbtns_default="{ row }"> | ||||||
|  |       <!-- 操作: 取消请假 --> | ||||||
|  |       <XTextButton | ||||||
|  |         preIcon="ep:delete" | ||||||
|  |         title="取消请假" | ||||||
|  |         v-hasPermi="['bpm:oa-leave:create']" | ||||||
|  |         v-if="row.result === 1" | ||||||
|  |         @click="cancelLeave(row)" | ||||||
|  |       /> | ||||||
|  |       <!-- 操作: 详情 --> | ||||||
|  |       <XTextButton preIcon="ep:delete" :title="t('action.detail')" @click="handleDetail(row)" /> | ||||||
|  |       <!-- 操作: 审批进度 --> | ||||||
|  |       <XTextButton preIcon="ep:edit-pen" title="审批进度" @click="handleProcessDetail(row)" /> | ||||||
|  |     </template> | ||||||
|  |   </XTable> | ||||||
|  | </template> | ||||||
|  |  | ||||||
|  | <script setup lang="ts"> | ||||||
|  | // 全局相关的 import | ||||||
|  | import { ElMessageBox } from 'element-plus' | ||||||
|  | // 业务相关的 import | ||||||
|  | import { allSchemas } from './leave.data' | ||||||
|  | import * as LeaveApi from '@/api/bpm/leave' | ||||||
|  | import * as ProcessInstanceApi from '@/api/bpm/processInstance' | ||||||
|  |  | ||||||
|  | const { t } = useI18n() // 国际化 | ||||||
|  | const message = useMessage() // 消息弹窗 | ||||||
|  | const router = useRouter() // 路由 | ||||||
|  |  | ||||||
|  | const [registerTable, { reload }] = useXTable({ | ||||||
|  |   allSchemas: allSchemas, | ||||||
|  |   getListApi: LeaveApi.getLeavePageApi | ||||||
|  | }) | ||||||
|  |  | ||||||
|  | // 发起请假 | ||||||
|  | const handleCreate = () => { | ||||||
|  |   router.push({ | ||||||
|  |     name: 'OALeaveCreate' | ||||||
|  |   }) | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // 取消请假 | ||||||
|  | const cancelLeave = (row) => { | ||||||
|  |   ElMessageBox.prompt('请输入取消原因', '取消流程', { | ||||||
|  |     confirmButtonText: t('common.ok'), | ||||||
|  |     cancelButtonText: t('common.cancel'), | ||||||
|  |     inputPattern: /^[\s\S]*.*\S[\s\S]*$/, // 判断非空,且非空格 | ||||||
|  |     inputErrorMessage: '取消原因不能为空' | ||||||
|  |   }).then(async ({ value }) => { | ||||||
|  |     await ProcessInstanceApi.cancelProcessInstanceApi(row.id, value) | ||||||
|  |     message.success('取消成功') | ||||||
|  |     reload() | ||||||
|  |   }) | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // 详情 | ||||||
|  | const handleDetail = (row) => { | ||||||
|  |   router.push({ | ||||||
|  |     name: 'OALeaveDetail', | ||||||
|  |     query: { | ||||||
|  |       id: row.id | ||||||
|  |     } | ||||||
|  |   }) | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // 审批进度 | ||||||
|  | const handleProcessDetail = (row) => { | ||||||
|  |   router.push({ | ||||||
|  |     name: 'BpmProcessInstanceDetail', | ||||||
|  |     query: { | ||||||
|  |       id: row.processInstanceId | ||||||
|  |     } | ||||||
|  |   }) | ||||||
|  | } | ||||||
|  | </script> | ||||||
							
								
								
									
										74
									
								
								yudao-ui-admin-vue3/src/views/bpm/oa/leave/leave.data.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										74
									
								
								yudao-ui-admin-vue3/src/views/bpm/oa/leave/leave.data.ts
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,74 @@ | |||||||
|  | import { reactive } from 'vue' | ||||||
|  | import { DICT_TYPE } from '@/utils/dict' | ||||||
|  | import { VxeCrudSchema, useVxeCrudSchemas } from '@/hooks/web/useVxeCrudSchemas' | ||||||
|  | // 国际化 | ||||||
|  | const { t } = useI18n() | ||||||
|  | // 表单校验 | ||||||
|  | export const rules = reactive({ | ||||||
|  |   startTime: [{ required: true, message: '开始时间不能为空', trigger: 'blur' }], | ||||||
|  |   endTime: [{ required: true, message: '结束时间不能为空', trigger: 'blur' }], | ||||||
|  |   type: [{ required: true, message: '请假类型不能为空', trigger: 'change' }], | ||||||
|  |   reason: [{ required: true, message: '请假原因不能为空', trigger: 'change' }] | ||||||
|  | }) | ||||||
|  |  | ||||||
|  | // crudSchemas | ||||||
|  | const crudSchemas = reactive<VxeCrudSchema>({ | ||||||
|  |   primaryKey: 'id', | ||||||
|  |   primaryType: 'id', | ||||||
|  |   primaryTitle: '申请编号', | ||||||
|  |   action: true, | ||||||
|  |   actionWidth: '260', | ||||||
|  |   columns: [ | ||||||
|  |     { | ||||||
|  |       title: t('common.status'), | ||||||
|  |       field: 'result', | ||||||
|  |       dictType: DICT_TYPE.BPM_PROCESS_INSTANCE_RESULT, | ||||||
|  |       dictClass: 'number', | ||||||
|  |       isSearch: true | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |       title: t('common.startTimeText'), | ||||||
|  |       field: 'startTime', | ||||||
|  |       formatter: 'formatDate', | ||||||
|  |       table: { | ||||||
|  |         width: 180 | ||||||
|  |       } | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |       title: t('common.endTimeText'), | ||||||
|  |       field: 'endTime', | ||||||
|  |       formatter: 'formatDate', | ||||||
|  |       table: { | ||||||
|  |         width: 180 | ||||||
|  |       } | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |       title: '请假类型', | ||||||
|  |       field: 'result', | ||||||
|  |       dictType: DICT_TYPE.BPM_OA_LEAVE_TYPE, | ||||||
|  |       dictClass: 'number', | ||||||
|  |       isSearch: true | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |       title: '原因', | ||||||
|  |       field: 'reason', | ||||||
|  |       isSearch: true | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |       title: '申请时间', | ||||||
|  |       field: 'createTime', | ||||||
|  |       formatter: 'formatDate', | ||||||
|  |       table: { | ||||||
|  |         width: 180 | ||||||
|  |       }, | ||||||
|  |       isSearch: true, | ||||||
|  |       search: { | ||||||
|  |         show: true, | ||||||
|  |         itemRender: { | ||||||
|  |           name: 'XDataTimePicker' | ||||||
|  |         } | ||||||
|  |       } | ||||||
|  |     } | ||||||
|  |   ] | ||||||
|  | }) | ||||||
|  | export const { allSchemas } = useVxeCrudSchemas(crudSchemas) | ||||||
		Reference in New Issue
	
	Block a user
	 YunaiV
					YunaiV