¶Ô±ÈÐÂÎļþ |
| | |
| | | <template> |
| | | <div class="p-2"> |
| | | <el-card shadow="never"> |
| | | <div style="display: flex; justify-content: space-between"> |
| | | <div> |
| | | <el-button |
| | | v-if=" |
| | | routeParams.type === 'add' || |
| | | (routeParams.type === 'update' && |
| | | form.processInstanceVo && |
| | | form.processInstanceVo.businessStatus && |
| | | (form.processInstanceVo.businessStatus === 'draft' || |
| | | form.processInstanceVo.businessStatus === 'cancel' || |
| | | form.processInstanceVo.businessStatus === 'back')) |
| | | " |
| | | :loading="buttonLoading" |
| | | type="info" |
| | | @click="submitForm('draft')" |
| | | >æå</el-button |
| | | > |
| | | <el-button |
| | | v-if=" |
| | | routeParams.type === 'add' || |
| | | (routeParams.type === 'update' && |
| | | form.processInstanceVo && |
| | | (form.processInstanceVo.businessStatus === 'draft' || |
| | | form.processInstanceVo.businessStatus === 'cancel' || |
| | | form.processInstanceVo.businessStatus === 'back')) |
| | | " |
| | | :loading="buttonLoading" |
| | | type="primary" |
| | | @click="submitForm('submit')" |
| | | >æ 交</el-button |
| | | > |
| | | <el-button |
| | | v-if="routeParams.type === 'approval' && form.processInstanceVo && form.processInstanceVo.businessStatus === 'waiting'" |
| | | :loading="buttonLoading" |
| | | type="primary" |
| | | @click="approvalVerifyOpen" |
| | | >审æ¹</el-button |
| | | > |
| | | <el-button v-if="processInstanceId" type="primary" @click="handleApprovalRecord">æµç¨è¿åº¦</el-button> |
| | | </div> |
| | | <div> |
| | | <el-button style="float: right" @click="goBack()">è¿å</el-button> |
| | | </div> |
| | | </div> |
| | | </el-card> |
| | | <el-card shadow="never" style="height: 78vh; overflow-y: auto"> |
| | | <el-form ref="leaveFormRef" v-loading="loading" :disabled="routeParams.type === 'view'" :model="form" :rules="rules" label-width="80px"> |
| | | <el-form-item label="请åç±»å" prop="leaveType"> |
| | | <el-select v-model="form.leaveType" placeholder="è¯·éæ©è¯·åç±»å" style="width: 100%"> |
| | | <el-option v-for="item in options" :key="item.value" :label="item.label" :value="item.value" /> |
| | | </el-select> |
| | | </el-form-item> |
| | | <el-form-item label="è¯·åæ¶é´"> |
| | | <el-date-picker |
| | | v-model="leaveTime" |
| | | type="daterange" |
| | | range-separator="To" |
| | | start-placeholder="å¼å§æ¶é´" |
| | | end-placeholder="ç»ææ¶é´" |
| | | @change="changeLeaveTime()" |
| | | /> |
| | | </el-form-item> |
| | | <el-form-item label="请å天æ°" prop="leaveDays"> |
| | | <el-input v-model="form.leaveDays" disabled type="number" placeholder="请è¾å
¥è¯·å天æ°" /> |
| | | </el-form-item> |
| | | <el-form-item label="请ååå " prop="remark"> |
| | | <el-input v-model="form.remark" type="textarea" :rows="3" placeholder="请è¾å
¥è¯·ååå " /> |
| | | </el-form-item> |
| | | </el-form> |
| | | </el-card> |
| | | <!-- æäº¤ç»ä»¶ --> |
| | | <submitVerify ref="submitVerifyRef" :task-variables="taskVariables" @submit-callback="submitCallback" /> |
| | | <!-- 审æ¹è®°å½ --> |
| | | <approvalRecord ref="approvalRecordRef" /> |
| | | </div> |
| | | </template> |
| | | |
| | | <script setup name="Leave" lang="ts"> |
| | | import { addLeave, getLeave, updateLeave } from '@/api/workflow/leave'; |
| | | import { LeaveForm, LeaveQuery, LeaveVO } from '@/api/workflow/leave/types'; |
| | | import { startWorkFlow } from '@/api/workflow/task'; |
| | | import SubmitVerify from '@/components/Process/submitVerify.vue'; |
| | | import ApprovalRecord from '@/components/Process/approvalRecord.vue'; |
| | | import { AxiosResponse } from 'axios'; |
| | | import { StartProcessBo } from '@/api/workflow/workflowCommon/types'; |
| | | const { proxy } = getCurrentInstance() as ComponentInternalInstance; |
| | | |
| | | const buttonLoading = ref(false); |
| | | const loading = ref(true); |
| | | const leaveTime = ref<Array<string>>([]); |
| | | //æµç¨å®ä¾id |
| | | const processInstanceId = ref(''); |
| | | //è·¯ç±åæ° |
| | | const routeParams = ref<Record<string, any>>({}); |
| | | const options = [ |
| | | { |
| | | value: '1', |
| | | label: 'äºå' |
| | | }, |
| | | { |
| | | value: '2', |
| | | label: 'è°ä¼' |
| | | }, |
| | | { |
| | | value: '3', |
| | | label: 'ç
å' |
| | | }, |
| | | { |
| | | value: '4', |
| | | label: 'å©å' |
| | | } |
| | | ]; |
| | | //æäº¤ç»ä»¶ |
| | | const submitVerifyRef = ref<InstanceType<typeof SubmitVerify>>(); |
| | | //审æ¹è®°å½ç»ä»¶ |
| | | const approvalRecordRef = ref<InstanceType<typeof ApprovalRecord>>(); |
| | | |
| | | const leaveFormRef = ref<ElFormInstance>(); |
| | | |
| | | const submitFormData = ref<StartProcessBo>({ |
| | | businessKey: '', |
| | | tableName: '', |
| | | variables: {} |
| | | }); |
| | | const taskVariables = ref<Record<string, any>>({}); |
| | | |
| | | const initFormData: LeaveForm = { |
| | | id: undefined, |
| | | leaveType: undefined, |
| | | startDate: undefined, |
| | | endDate: undefined, |
| | | leaveDays: undefined, |
| | | remark: undefined, |
| | | processInstanceVo: {} |
| | | }; |
| | | const data = reactive<PageData<LeaveForm, LeaveQuery>>({ |
| | | form: { ...initFormData }, |
| | | queryParams: { |
| | | pageNum: 1, |
| | | pageSize: 10, |
| | | startLeaveDays: undefined, |
| | | endLeaveDays: undefined |
| | | }, |
| | | rules: { |
| | | id: [{ required: true, message: '主é®ä¸è½ä¸ºç©º', trigger: 'blur' }], |
| | | leaveType: [{ required: true, message: '请åç±»åä¸è½ä¸ºç©º', trigger: 'blur' }], |
| | | leaveTime: [{ required: true, message: 'è¯·åæ¶é´ä¸è½ä¸ºç©º', trigger: 'blur' }], |
| | | leaveDays: [{ required: true, message: '请å天æ°ä¸è½ä¸ºç©º', trigger: 'blur' }] |
| | | } |
| | | }); |
| | | |
| | | const { form, rules } = toRefs(data); |
| | | |
| | | /** 表åéç½® */ |
| | | const reset = () => { |
| | | form.value = { ...initFormData }; |
| | | leaveTime.value = []; |
| | | leaveFormRef.value?.resetFields(); |
| | | }; |
| | | |
| | | const changeLeaveTime = () => { |
| | | const startDate = new Date(leaveTime.value[0]).getTime(); |
| | | const endDate = new Date(leaveTime.value[1]).getTime(); |
| | | const diffInMilliseconds = endDate - startDate; |
| | | form.value.leaveDays = Math.floor(diffInMilliseconds / (1000 * 60 * 60 * 24)); |
| | | }; |
| | | /** è·å详æ
*/ |
| | | const getInfo = () => { |
| | | loading.value = true; |
| | | buttonLoading.value = false; |
| | | nextTick(async () => { |
| | | const res = await getLeave(routeParams.value.id); |
| | | Object.assign(form.value, res.data); |
| | | leaveTime.value = []; |
| | | leaveTime.value.push(form.value.startDate); |
| | | leaveTime.value.push(form.value.endDate); |
| | | if (form.value.processInstanceVo) { |
| | | processInstanceId.value = form.value.processInstanceVo.id; |
| | | } |
| | | loading.value = false; |
| | | buttonLoading.value = false; |
| | | }); |
| | | }; |
| | | |
| | | /** æäº¤æé® */ |
| | | const submitForm = (status: string) => { |
| | | if (leaveTime.value.length === 0) { |
| | | proxy?.$modal.msgError('è¯·åæ¶é´ä¸è½ä¸ºç©º'); |
| | | return; |
| | | } |
| | | try { |
| | | leaveFormRef.value?.validate(async (valid: boolean) => { |
| | | form.value.startDate = leaveTime.value[0]; |
| | | form.value.endDate = leaveTime.value[1]; |
| | | if (valid) { |
| | | buttonLoading.value = true; |
| | | let res: AxiosResponse<LeaveVO>; |
| | | if (form.value.id) { |
| | | res = await updateLeave(form.value); |
| | | } else { |
| | | res = await addLeave(form.value); |
| | | } |
| | | form.value = res.data; |
| | | if (status === 'draft') { |
| | | buttonLoading.value = false; |
| | | proxy?.$modal.msgSuccess('æåæå'); |
| | | proxy.$tab.closePage(proxy.$route); |
| | | proxy.$router.go(-1); |
| | | } else { |
| | | await handleStartWorkFlow(res.data); |
| | | } |
| | | } |
| | | }); |
| | | } finally { |
| | | buttonLoading.value = false; |
| | | } |
| | | }; |
| | | |
| | | //æäº¤ç³è¯· |
| | | const handleStartWorkFlow = async (data: LeaveVO) => { |
| | | try { |
| | | submitFormData.value.tableName = 'test_leave'; |
| | | submitFormData.value.businessKey = data.id; |
| | | //æµç¨åé |
| | | taskVariables.value = { |
| | | entity: data, |
| | | leaveDays: data.leaveDays, |
| | | userList: [1, 3], |
| | | userList2: [1, 3] |
| | | }; |
| | | submitFormData.value.variables = taskVariables.value; |
| | | const resp = await startWorkFlow(submitFormData.value); |
| | | if (submitVerifyRef.value) { |
| | | buttonLoading.value = false; |
| | | submitVerifyRef.value.openDialog(resp.data.taskId); |
| | | } |
| | | } finally { |
| | | buttonLoading.value = false; |
| | | } |
| | | }; |
| | | //审æ¹è®°å½ |
| | | const handleApprovalRecord = () => { |
| | | approvalRecordRef.value.init(processInstanceId.value); |
| | | }; |
| | | //æäº¤åè° |
| | | const submitCallback = async () => { |
| | | await proxy.$tab.closePage(proxy.$route); |
| | | proxy.$router.go(-1); |
| | | }; |
| | | |
| | | //è¿å |
| | | const goBack = () => { |
| | | proxy.$tab.closePage(proxy.$route); |
| | | proxy.$router.go(-1); |
| | | }; |
| | | //å®¡æ¹ |
| | | const approvalVerifyOpen = async () => { |
| | | submitVerifyRef.value.openDialog(routeParams.value.taskId); |
| | | }; |
| | | onMounted(() => { |
| | | nextTick(async () => { |
| | | routeParams.value = proxy.$route.query; |
| | | reset(); |
| | | loading.value = false; |
| | | if (routeParams.value.type === 'update' || routeParams.value.type === 'view' || routeParams.value.type === 'approval') { |
| | | getInfo(); |
| | | } |
| | | }); |
| | | }); |
| | | </script> |