From a63543a5c793c8954fa2f9da0ee4fb215c62d8c2 Mon Sep 17 00:00:00 2001 From: 疯狂的狮子Li <15040126243@163.com> Date: 星期一, 20 五月 2024 10:26:46 +0800 Subject: [PATCH] !118 ♥️发布 5.2.0-BETA 公测版本 Merge pull request !118 from 疯狂的狮子Li/dev --- src/views/workflow/leave/leaveEdit.vue | 273 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 273 insertions(+), 0 deletions(-) diff --git a/src/views/workflow/leave/leaveEdit.vue b/src/views/workflow/leave/leaveEdit.vue new file mode 100644 index 0000000..e978ad8 --- /dev/null +++ b/src/views/workflow/leave/leaveEdit.vue @@ -0,0 +1,273 @@ +<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> -- Gitblit v1.9.3