From f50ed6b2c54615fa3e540bc6788a08239084d8e2 Mon Sep 17 00:00:00 2001 From: gssong <1742057357@qq.com> Date: 星期四, 21 三月 2024 21:02:41 +0800 Subject: [PATCH] add 添加流程表单配置 --- src/api/workflow/leave/types.ts | 2 src/views/workflow/leave/index.vue | 191 +------------- src/views/workflow/task/myDocument.vue | 4 src/api/workflow/task/types.ts | 2 src/views/workflow/task/taskCopyList.vue | 4 src/views/workflow/model/index.vue | 10 src/views/workflow/task/allTaskWaiting.vue | 4 src/views/workflow/task/taskFinish.vue | 4 src/views/workflow/task/taskWaiting.vue | 57 +-- src/views/workflow/processInstance/index.vue | 11 src/api/workflow/formDefinition/index.ts | 38 ++ src/views/workflow/leave/leaveEdit.vue | 237 ++++++++++++++++++ src/components/Process/approvalRecord.vue | 6 src/router/index.ts | 14 + src/api/workflow/formDefinition/types.ts | 81 ++++++ src/views/workflow/processDefinition/index.vue | 87 +++++ 16 files changed, 508 insertions(+), 244 deletions(-) diff --git a/src/api/workflow/formDefinition/index.ts b/src/api/workflow/formDefinition/index.ts new file mode 100644 index 0000000..7eed53d --- /dev/null +++ b/src/api/workflow/formDefinition/index.ts @@ -0,0 +1,38 @@ +import request from '@/utils/request'; +import { AxiosPromise } from 'axios'; +import { FormDefinitionVO, FormDefinitionForm, FormDefinitionQuery } from '@/api/workflow/formDefinition/types'; + + +/** + * 鏌ヨ琛ㄥ崟閰嶇疆璇︾粏 + * @param id + */ +export const getByDefId = (definitionId: string | number): AxiosPromise<FormDefinitionVO> => { + return request({ + url: '/workflow/formDefinition/getByDefId/' + definitionId, + method: 'get' + }); +}; + +/** + * 鏂板琛ㄥ崟閰嶇疆 + * @param data + */ +export const saveOrUpdate = (data: FormDefinitionForm) => { + return request({ + url: '/workflow/formDefinition/saveOrUpdate', + method: 'post', + data: data + }); +}; + +/** + * 鍒犻櫎琛ㄥ崟閰嶇疆 + * @param id + */ +export const delFormDefinition = (id: string | number | Array<string | number>) => { + return request({ + url: '/workflow/formDefinition/' + id, + method: 'delete' + }); +}; diff --git a/src/api/workflow/formDefinition/types.ts b/src/api/workflow/formDefinition/types.ts new file mode 100644 index 0000000..5a8f37b --- /dev/null +++ b/src/api/workflow/formDefinition/types.ts @@ -0,0 +1,81 @@ +export interface FormDefinitionVO { + /** + * 涓婚敭 + */ + id: string | number; + + /** + * 璺敱鍦板潃 + */ + path: string; + + /** + * 娴佺▼瀹氫箟ID + */ + definitionId: string | number; + + /** + * 娴佺▼KEY + */ + processKey: string; + + /** + * 澶囨敞 + */ + remark: string; + +} + +export interface FormDefinitionForm extends BaseEntity { + /** + * 涓婚敭 + */ + id?: string | number; + + /** + * 璺敱鍦板潃 + */ + path?: string; + + /** + * 娴佺▼瀹氫箟ID + */ + definitionId?: string | number; + + /** + * 娴佺▼KEY + */ + processKey?: string; + + /** + * 澶囨敞 + */ + remark?: string; + +} + +export interface FormDefinitionQuery extends PageQuery { + + /** + * 璺敱鍦板潃 + */ + path?: string; + + /** + * 娴佺▼瀹氫箟ID + */ + definitionId?: string | number; + + /** + * 娴佺▼KEY + */ + processKey?: string; + + /** + * 鏃ユ湡鑼冨洿鍙傛暟 + */ + params?: any; +} + + + diff --git a/src/api/workflow/leave/types.ts b/src/api/workflow/leave/types.ts index 9405257..05fc52e 100644 --- a/src/api/workflow/leave/types.ts +++ b/src/api/workflow/leave/types.ts @@ -5,6 +5,7 @@ endDate: string; leaveDays: number; remark: string; + processInstanceVo: any; } export interface LeaveForm extends BaseEntity { @@ -14,6 +15,7 @@ endDate?: string; leaveDays?: number; remark?: string; + processInstanceVo: any; } export interface LeaveQuery extends PageQuery { diff --git a/src/api/workflow/task/types.ts b/src/api/workflow/task/types.ts index f1aede9..1a7629b 100644 --- a/src/api/workflow/task/types.ts +++ b/src/api/workflow/task/types.ts @@ -36,6 +36,8 @@ processDefinitionKey: string; participantVo: ParticipantVo; multiInstance: boolean; + businessKey: string; + wfFormDefinitionVo: any; } export interface VariableVo { diff --git a/src/components/Process/approvalRecord.vue b/src/components/Process/approvalRecord.vue index 2ef5d73..c24b8a4 100644 --- a/src/components/Process/approvalRecord.vue +++ b/src/components/Process/approvalRecord.vue @@ -10,7 +10,11 @@ <el-table :data="historyList" style="width: 100%" border fit> <el-table-column type="index" label="搴忓彿" align="center" width="60"></el-table-column> <el-table-column prop="name" label="浠诲姟鍚嶇О" sortable align="center"></el-table-column> - <el-table-column prop="nickName" label="鍔炵悊浜�" sortable align="center"></el-table-column> + <el-table-column prop="nickName" label="鍔炵悊浜�" sortable align="center"> + <template #default="scope"> + <el-tag type="success">{{ scope.row.nickName||'鏃�' }}</el-tag> + </template> + </el-table-column> <el-table-column label="鐘舵��" sortable align="center"> <template #default="scope"> <el-tag type="success">{{ scope.row.statusName }}</el-tag> diff --git a/src/router/index.ts b/src/router/index.ts index 0792d8e..e028834 100644 --- a/src/router/index.ts +++ b/src/router/index.ts @@ -162,6 +162,20 @@ meta: { title: '淇敼鐢熸垚閰嶇疆', activeMenu: '/tool/gen', icon: '' } } ] + }, + { + path: '/demo/leaveEdit', + component: Layout, + hidden: true, + permissions: ['demo:leave:edit'], + children: [ + { + path: 'index/:id/:type', + component: () => import('@/views/workflow/leave/leaveEdit.vue'), + name: 'leaveEdit', + meta: { title: '璇峰亣鐢宠', activeMenu: '/demo/leave',noCache:true }, + } + ] } ]; diff --git a/src/views/workflow/leave/index.vue b/src/views/workflow/leave/index.vue index ae9ff00..c7baae2 100644 --- a/src/views/workflow/leave/index.vue +++ b/src/views/workflow/leave/index.vue @@ -80,14 +80,11 @@ > <el-button v-hasPermi="['demo:leave:remove']" link type="primary" icon="Delete" @click="handleDelete(scope.row)"></el-button> </el-tooltip> + <el-tooltip placement="top" content="鏌ョ湅" > + <el-button link type="primary" icon="View" @click="handleView(scope.row)"></el-button> + </el-tooltip> <el-tooltip v-if="scope.row.processInstanceVo.businessStatus === 'waiting'" content="鎾ら攢" placement="top"> <el-button link type="primary" icon="Notification" @click="handleCancelProcessApply(scope.row.processInstanceVo.id)"></el-button> - </el-tooltip> - <el-tooltip v-if="scope.row.processInstanceVo.businessStatus === 'waiting' || - scope.row.processInstanceVo.businessStatus === 'finish'|| - scope.row.processInstanceVo.businessStatus === 'termination'|| - scope.row.processInstanceVo.businessStatus === 'invalid'" content="瀹℃壒璁板綍" placement="top"> - <el-button link type="primary" icon="Document" @click="handleApprovalRecord(scope.row.processInstanceVo.id)"></el-button> </el-tooltip> </template> </el-table-column> @@ -95,66 +92,23 @@ <pagination v-show="total > 0" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize" :total="total" @pagination="getList" /> </el-card> - <!-- 娣诲姞鎴栦慨鏀硅鍋囧璇濇 --> - <el-dialog v-model="dialog.visible" :title="dialog.title" width="800px" append-to-body> - <el-form ref="leaveFormRef" v-loading="loading" :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> - <template #footer> - <div class="dialog-footer"> - <el-button :loading="buttonLoading" type="info" @click="submitForm('draft')">鏆� 瀛�</el-button> - <el-button :loading="buttonLoading" type="primary" @click="submitForm('submit')">鎻� 浜�</el-button> - <el-button @click="cancel">鍙� 娑�</el-button> - </div> - </template> - </el-dialog> - <!-- 鎻愪氦缁勪欢 --> - <submitVerify ref="submitVerifyRef" :task-variables="taskVariables" @submit-callback="submitCallback" /> - <!-- 瀹℃壒璁板綍 --> - <approvalRecord ref="approvalRecordRef" /> </div> </template> <script setup name="Leave" lang="ts"> -import { addLeave, delLeave, getLeave, listLeave, updateLeave } from '@/api/workflow/leave'; +import { delLeave, listLeave } from '@/api/workflow/leave'; import { cancelProcessApply } from '@/api/workflow/processInstance'; 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'; const { proxy } = getCurrentInstance() as ComponentInternalInstance; const leaveList = ref<LeaveVO[]>([]); -const buttonLoading = ref(false); const loading = ref(true); const showSearch = ref(true); const ids = ref<Array<string | number>>([]); const single = ref(true); const multiple = ref(true); const total = ref(0); -const leaveTime = ref<Array<string>>([]); const options = [ { value: '1', @@ -173,51 +127,21 @@ label: '濠氬亣' } ]; -//鎻愪氦缁勪欢 -const submitVerifyRef = ref<InstanceType<typeof SubmitVerify>>(); -//瀹℃壒璁板綍缁勪欢 -const approvalRecordRef = ref<InstanceType<typeof ApprovalRecord>>(); const queryFormRef = ref<ElFormInstance>(); -const leaveFormRef = ref<ElFormInstance>(); -const submitFormData = ref<Record<string, any>>({ - businessKey: '', - processKey: '', - variables: {} -}); -const taskVariables = ref<Record<string, any>>({}); - -const dialog = reactive<DialogOption>({ - visible: false, - title: '' -}); - -const initFormData: LeaveForm = { - id: undefined, - leaveType: undefined, - startDate: undefined, - endDate: undefined, - leaveDays: undefined, - remark: undefined -}; const data = reactive<PageData<LeaveForm, LeaveQuery>>({ - form: { ...initFormData }, + form: { }, 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' }] - } + rules: {} }); -const { queryParams, form, rules } = toRefs(data); +const { queryParams } = toRefs(data); /** 鏌ヨ璇峰亣鍒楄〃 */ const getList = async () => { @@ -226,19 +150,6 @@ leaveList.value = res.rows; total.value = res.total; loading.value = false; -}; - -/** 鍙栨秷鎸夐挳 */ -const cancel = () => { - reset(); - dialog.visible = false; -}; - -/** 琛ㄥ崟閲嶇疆 */ -const reset = () => { - form.value = { ...initFormData }; - leaveTime.value = []; - leaveFormRef.value?.resetFields(); }; /** 鎼滅储鎸夐挳鎿嶄綔 */ @@ -262,63 +173,20 @@ /** 鏂板鎸夐挳鎿嶄綔 */ const handleAdd = () => { - dialog.visible = true; - dialog.title = '娣诲姞璇峰亣鐢宠'; - nextTick(() => { - reset(); - }); + proxy.$tab.closePage(proxy.$route); + proxy.$router.push(`/demo/leaveEdit/index/add/add`); }; -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 handleUpdate = (row?: LeaveVO) => { - buttonLoading.value = false; - dialog.visible = true; - dialog.title = '淇敼璇峰亣鐢宠'; - nextTick(async () => { - reset(); - const _id = row?.id || ids.value[0]; - const res = await getLeave(_id); - Object.assign(form.value, res.data); - leaveTime.value = []; - leaveTime.value.push(form.value.startDate); - leaveTime.value.push(form.value.endDate); - }); + proxy.$tab.closePage(proxy.$route); + proxy.$router.push(`/demo/leaveEdit/index/${row.id}/update`);; }; -/** 鎻愪氦鎸夐挳 */ -const submitForm = (status: string) => { - if (leaveTime.value.length === 0) { - proxy?.$modal.msgError('璇峰亣鏃堕棿涓嶈兘涓虹┖'); - return; - } - 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('鏆傚瓨鎴愬姛'); - dialog.visible = false; - await getList(); - } else { - await handleStartWorkFlow(res.data); - } - } - }); +/** 鏌ョ湅鎸夐挳鎿嶄綔 */ +const handleView = (row?: LeaveVO) => { + proxy.$tab.closePage(proxy.$route); + proxy.$router.push(`/demo/leaveEdit/index/${row.id}/view`); }; /** 鍒犻櫎鎸夐挳鎿嶄綔 */ @@ -341,35 +209,6 @@ ); }; -//鎻愪氦鐢宠 -const handleStartWorkFlow = async (data: LeaveVO) => { - submitFormData.value.processKey = 'leave1'; - submitFormData.value.businessKey = data.id; - //娴佺▼鍙橀噺 - taskVariables.value = { - entity: data, - leaveDays: data.leaveDays, - userList: [1, 2], - userList2: [1, 2] - }; - submitFormData.value.variables = taskVariables.value; - const resp = await startWorkFlow(submitFormData.value); - if (submitVerifyRef.value) { - buttonLoading.value = false; - submitVerifyRef.value.openDialog(resp.data.taskId); - } -}; -//瀹℃壒璁板綍 -const handleApprovalRecord = (id: string) => { - if (approvalRecordRef.value) { - approvalRecordRef.value.init(id); - } -}; -//鎻愪氦鍥炶皟 -const submitCallback = async () => { - dialog.visible = false; - handleQuery(); -}; /** 鎾ら攢鎸夐挳鎿嶄綔 */ const handleCancelProcessApply = async (id: string) => { await proxy?.$modal.confirm('鏄惁纭鎾ら攢褰撳墠鍗曟嵁锛�'); diff --git a/src/views/workflow/leave/leaveEdit.vue b/src/views/workflow/leave/leaveEdit.vue new file mode 100644 index 0000000..1e9cf68 --- /dev/null +++ b/src/views/workflow/leave/leaveEdit.vue @@ -0,0 +1,237 @@ +<template> + <div class="p-2"> + <el-card shadow="never"> + <div style="display: flex;justify-content: space-between;"> + <div> + <el-button :loading="buttonLoading" + v-if="routeParams.type === 'add' || (routeParams.type === 'update' && form.processInstanceVo.businessStatus && (form.processInstanceVo.businessStatus === 'draft' || form.processInstanceVo.businessStatus === 'cancel' || form.processInstanceVo.businessStatus === 'back'))" + type="info" @click="submitForm('draft')">鏆傚瓨</el-button> + <el-button :loading="buttonLoading" v-if="routeParams.type === 'add' || (routeParams.type === 'update' && form.processInstanceVo && (form.processInstanceVo.businessStatus === 'draft' || form.processInstanceVo.businessStatus === 'cancel' || form.processInstanceVo.businessStatus === 'back'))" + type="primary" @click="submitForm('submit')">鎻� 浜�</el-button> + <el-button :loading="buttonLoading" v-if="routeParams.type === 'approval' && form.processInstanceVo && form.processInstanceVo.businessStatus === 'waiting'" + type="primary" @click="approvalVerifyOpen">瀹℃壒</el-button> + <el-button @click="handleApprovalRecord" type="primary" v-if="processInstanceId">娴佺▼杩涘害</el-button> + </div> + <div> + <el-button style="float: right" @click="goBack()">杩斿洖</el-button> + </div> + </div> + </el-card> + <el-card shadow="never"> + <el-form ref="leaveFormRef" :disabled="routeParams.type ==='view'" v-loading="loading" :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'; + +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<Record<string, any>>({ + businessKey: '', + processKey: '', + 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; + } + 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); + } + } + }); +}; + +//鎻愪氦鐢宠 +const handleStartWorkFlow = async (data: LeaveVO) => { + submitFormData.value.processKey = 'test'; + submitFormData.value.businessKey = data.id; + //娴佺▼鍙橀噺 + taskVariables.value = { + entity: data, + leaveDays: data.leaveDays, + userList: [1, 2], + userList2: [1, 2] + }; + submitFormData.value.variables = taskVariables.value; + const resp = await startWorkFlow(submitFormData.value); + if (submitVerifyRef.value) { + buttonLoading.value = false; + submitVerifyRef.value.openDialog(resp.data.taskId); + } +}; +//瀹℃壒璁板綍 +const handleApprovalRecord = () => { + approvalRecordRef.value.init(processInstanceId.value); +}; +//鎻愪氦鍥炶皟 +const submitCallback = async () => { + 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(proxy.$route.query.taskId); +}; +onMounted(() => { + nextTick(async () => { + routeParams.value = proxy?.$route.params + reset(); + if (routeParams.value.type === 'update' || routeParams.value.type === 'view' || routeParams.value.type === 'submit') { + getInfo() + } + }) +}); +</script> diff --git a/src/views/workflow/model/index.vue b/src/views/workflow/model/index.vue index 26550c3..c738e78 100644 --- a/src/views/workflow/model/index.vue +++ b/src/views/workflow/model/index.vue @@ -57,18 +57,18 @@ </el-row> </template> - <el-table v-loading="loading" :data="modelList" @selection-change="handleSelectionChange"> + <el-table border v-loading="loading" :data="modelList" @selection-change="handleSelectionChange"> <el-table-column type="selection" width="55" align="center" /> <el-table-column fixed align="center" type="index" label="搴忓彿" width="50"></el-table-column> - <el-table-column fixed align="center" prop="name" label="妯″瀷鍚嶇О"></el-table-column> + <el-table-column align="center" prop="name" label="妯″瀷鍚嶇О" width="200"></el-table-column> <el-table-column align="center" prop="key" label="妯″瀷KEY"></el-table-column> <el-table-column align="center" prop="version" label="鐗堟湰鍙�" width="90"> <template #default="scope"> v{{ scope.row.version }}.0</template> </el-table-column> <el-table-column align="center" prop="metaInfo" label="澶囨敞璇存槑" min-width="130"></el-table-column> - <el-table-column align="center" prop="createTime" label="鍒涘缓鏃堕棿" width="160"></el-table-column> - <el-table-column align="center" prop="lastUpdateTime" label="鏇存柊鏃堕棿" width="160"></el-table-column> - <el-table-column fixed="right" label="鎿嶄綔" align="center" width="180" class-name="small-padding fixed-width"> + <el-table-column align="center" :show-overflow-tooltip="true" prop="createTime" label="鍒涘缓鏃堕棿" width="160"></el-table-column> + <el-table-column align="center" :show-overflow-tooltip="true" prop="lastUpdateTime" label="鏇存柊鏃堕棿" width="160"></el-table-column> + <el-table-column fixed="right" label="鎿嶄綔" align="center" width="150" class-name="small-padding fixed-width"> <template #default="scope"> <el-row :gutter="10" class="mb8"> <el-col :span="1.5"> diff --git a/src/views/workflow/processDefinition/index.vue b/src/views/workflow/processDefinition/index.vue index df630dc..a99478f 100644 --- a/src/views/workflow/processDefinition/index.vue +++ b/src/views/workflow/processDefinition/index.vue @@ -53,12 +53,12 @@ </el-row> </template> - <el-table v-loading="loading" :data="processDefinitionList" @selection-change="handleSelectionChange"> + <el-table border v-loading="loading" :data="processDefinitionList" @selection-change="handleSelectionChange"> <el-table-column type="selection" width="55" align="center" /> - <el-table-column fixed align="center" type="index" label="搴忓彿" width="50"></el-table-column> - <el-table-column fixed align="center" prop="name" label="娴佺▼瀹氫箟鍚嶇О"></el-table-column> - <el-table-column align="center" prop="key" label="鏍囪瘑Key"></el-table-column> - <el-table-column align="center" prop="version" label="鐗堟湰鍙�" width="90"> + <el-table-column align="center" type="index" label="搴忓彿" width="60"></el-table-column> + <el-table-column align="center" prop="name" label="娴佺▼瀹氫箟鍚嶇О"></el-table-column> + <el-table-column align="center" prop="key" label="鏍囪瘑KEY" width="80"></el-table-column> + <el-table-column align="center" prop="version" label="鐗堟湰鍙�" width="80"> <template #default="scope"> v{{ scope.row.version }}.0</template> </el-table-column> <el-table-column align="center" prop="resourceName" label="娴佺▼XML" min-width="80" :show-overflow-tooltip="true"> @@ -71,14 +71,14 @@ <el-link type="primary" @click="clickPreviewImg(scope.row.id)">{{ scope.row.diagramResourceName }}</el-link> </template> </el-table-column> - <el-table-column align="center" prop="suspensionState" label="鐘舵��" min-width="70"> + <el-table-column align="center" prop="suspensionState" label="鐘舵��" min-width="50"> <template #default="scope"> <el-tag v-if="scope.row.suspensionState == 1" type="success">婵�娲�</el-tag> <el-tag v-else type="danger">鎸傝捣</el-tag> </template> </el-table-column> <el-table-column align="center" prop="deploymentTime" label="閮ㄧ讲鏃堕棿" :show-overflow-tooltip="true"></el-table-column> - <el-table-column fixed="right" label="鎿嶄綔" align="center" width="200" class-name="small-padding fixed-width"> + <el-table-column fixed="right" label="鎿嶄綔" align="center" width="170" class-name="small-padding fixed-width"> <template #default="scope"> <el-row :gutter="10" class="mb8"> <el-col :span="1.5"> @@ -101,9 +101,17 @@ <el-button link type="primary" size="small" icon="Sort" @click="handleConvertToModel(scope.row)"> 杞崲妯″瀷 </el-button> </el-col> <el-col :span="1.5"> - <el-button link type="primary" size="small" icon="Document" @click="getProcessDefinitionHitoryList(scope.row.id, scope.row.key)"> - 鍘嗗彶鐗堟湰 - </el-button> + <el-dropdown> + <el-button type="text" size="small"> + 鏇村<el-icon class="el-icon--right"><arrow-down /></el-icon> + </el-button> + <template #dropdown> + <el-dropdown-menu> + <el-dropdown-item @click="getProcessDefinitionHitoryList(scope.row.id, scope.row.key)">鍘嗗彶鐗堟湰</el-dropdown-item> + <el-dropdown-item @click="handleFormOpen(scope.row)">琛ㄥ崟閰嶇疆</el-dropdown-item> + </el-dropdown-menu> + </template> + </el-dropdown> </el-col> </el-row> </template> @@ -158,8 +166,8 @@ <el-dialog v-if="processDefinitionDialog.visible" v-model="processDefinitionDialog.visible" :title="processDefinitionDialog.title" width="70%"> <el-table v-loading="loading" :data="processDefinitionHistoryList" @selection-change="handleSelectionChange"> <el-table-column type="selection" width="55" align="center" /> - <el-table-column fixed align="center" type="index" label="搴忓彿" width="50"></el-table-column> - <el-table-column fixed align="center" prop="name" label="娴佺▼瀹氫箟鍚嶇О"></el-table-column> + <el-table-column align="center" type="index" label="搴忓彿" width="60"></el-table-column> + <el-table-column align="center" prop="name" label="娴佺▼瀹氫箟鍚嶇О"></el-table-column> <el-table-column align="center" prop="key" label="鏍囪瘑Key"></el-table-column> <el-table-column align="center" prop="version" label="鐗堟湰鍙�" width="90"> <template #default="scope"> v{{ scope.row.version }}.0</template> @@ -208,6 +216,29 @@ </el-table-column> </el-table> </el-dialog> + <!-- 琛ㄥ崟閰嶇疆 --> + <el-dialog v-model="formDialog.visible" :title="formDialog.title" width="650px" append-to-body :close-on-click-modal="false"> + <el-form :model="formDefinitionForm" label-width="auto"> + <el-form-item label="娴佺▼KEY"> + <el-input v-model="formDefinitionForm.processKey" disabled/> + </el-form-item> + <el-form-item label="璺敱鍦板潃"> + <el-input v-model="formDefinitionForm.path" placeholder="璇峰亣绀轰緥璺敱璇峰~鍐欙細/demo/leaveEdit/index"/> + </el-form-item> + <el-form-item label="澶囨敞"> + <el-input v-model="formDefinitionForm.remark" type="textarea" resize="none"/> + </el-form-item> + </el-form> + + <template #footer> + <div class="dialog-footer"> + <el-button @click="formDialog.visible = false">鍙栨秷</el-button> + <el-button type="primary" @click="handlerSaveForm"> + 淇濆瓨 + </el-button> + </div> + </template> + </el-dialog> </div> </template> @@ -224,8 +255,10 @@ } from '@/api/workflow/processDefinition'; import ProcessPreview from './components/processPreview.vue'; import { listCategory } from '@/api/workflow/category'; +import { getByDefId,saveOrUpdate } from '@/api/workflow/formDefinition'; import { CategoryVO } from '@/api/workflow/category/types'; import { ProcessDefinitionQuery, ProcessDefinitionVO } from '@/api/workflow/processDefinition/types'; +import { FormDefinitionForm } from '@/api/workflow/formDefinition/types'; import { UploadRequestOptions } from 'element-plus'; const { proxy } = getCurrentInstance() as ComponentInternalInstance; @@ -254,6 +287,7 @@ const categoryName = ref(''); /** 閮ㄧ讲鏂囦欢鍒嗙被閫夋嫨 */ const selectCategory = ref(); +const formDefinitionForm = ref<FormDefinitionForm>({}); const uploadDialog = reactive<DialogOption>({ visible: false, @@ -263,6 +297,11 @@ const processDefinitionDialog = reactive<DialogOption>({ visible: false, title: '鍘嗗彶鐗堟湰' +}); + +const formDialog = reactive<DialogOption>({ + visible: false, + title: '琛ㄥ崟閰嶇疆' }); // 鏌ヨ鍙傛暟 @@ -429,4 +468,28 @@ }); return; }; +//鎵撳紑琛ㄥ崟閰嶇疆 +const handleFormOpen = async (row: ProcessDefinitionVO) => { + formDialog.visible = true + formDefinitionForm.value.processKey = row.key + formDefinitionForm.value.definitionId = row.id + const resp = await getByDefId(row.id) + if(resp.data){ + formDefinitionForm.value = resp.data + }else{ + formDefinitionForm.value.path = undefined + formDefinitionForm.value.remark = undefined + } +} +//淇濆瓨琛ㄥ崟 +const handlerSaveForm = async () => { + await proxy?.$modal.confirm('鏄惁纭淇濆瓨锛�'); + saveOrUpdate(formDefinitionForm.value).then(resp=>{ + if(resp.code === 200){ + proxy?.$modal.msgSuccess('鎿嶄綔鎴愬姛'); + formDialog.visible = false + getList(); + } + }) +} </script> diff --git a/src/views/workflow/processInstance/index.vue b/src/views/workflow/processInstance/index.vue index eafc609..19e57f7 100644 --- a/src/views/workflow/processInstance/index.vue +++ b/src/views/workflow/processInstance/index.vue @@ -56,12 +56,11 @@ </el-row> </template> - <el-table v-loading="loading" :data="processInstanceList" @selection-change="handleSelectionChange"> + <el-table v-loading="loading" border :data="processInstanceList" @selection-change="handleSelectionChange"> <el-table-column type="selection" width="55" align="center" /> - <el-table-column fixed align="center" type="index" label="搴忓彿" width="50"></el-table-column> - <el-table-column v-if="false" fixed align="center" prop="id" label="id"></el-table-column> - <el-table-column fixed align="center" prop="processDefinitionName" label="娴佺▼瀹氫箟鍚嶇О"></el-table-column> - <el-table-column fixed align="center" prop="processDefinitionKey" label="娴佺▼瀹氫箟KEY"></el-table-column> + <el-table-column align="center" type="index" label="搴忓彿" width="60"></el-table-column> + <el-table-column align="center" prop="processDefinitionName" label="娴佺▼瀹氫箟鍚嶇О"></el-table-column> + <el-table-column align="center" prop="processDefinitionKey" label="娴佺▼瀹氫箟KEY"></el-table-column> <el-table-column align="center" prop="processDefinitionVersion" label="鐗堟湰鍙�" width="90"> <template #default="scope"> v{{ scope.row.processDefinitionVersion }}.0</template> </el-table-column> @@ -127,7 +126,7 @@ </el-row> <el-dialog v-if="processDefinitionDialog.visible" v-model="processDefinitionDialog.visible" :title="processDefinitionDialog.title" width="70%"> <el-table v-loading="loading" :data="processDefinitionHistoryList"> - <el-table-column fixed align="center" type="index" label="搴忓彿" width="50"></el-table-column> + <el-table-column fixed align="center" type="index" label="搴忓彿" width="60"></el-table-column> <el-table-column fixed align="center" prop="name" label="娴佺▼瀹氫箟鍚嶇О"></el-table-column> <el-table-column align="center" prop="key" label="鏍囪瘑Key"></el-table-column> <el-table-column align="center" prop="version" label="鐗堟湰鍙�" width="90"> diff --git a/src/views/workflow/task/allTaskWaiting.vue b/src/views/workflow/task/allTaskWaiting.vue index dfaf7c9..8d5836f 100644 --- a/src/views/workflow/task/allTaskWaiting.vue +++ b/src/views/workflow/task/allTaskWaiting.vue @@ -39,9 +39,9 @@ </el-row> </template> - <el-table v-loading="loading" :data="taskList" @selection-change="handleSelectionChange"> + <el-table v-loading="loading" border :data="taskList" @selection-change="handleSelectionChange"> <el-table-column type="selection" width="55" align="center" /> - <el-table-column fixed align="center" type="index" label="搴忓彿" width="50"></el-table-column> + <el-table-column fixed align="center" type="index" label="搴忓彿" width="60"></el-table-column> <el-table-column fixed align="center" prop="processDefinitionName" label="娴佺▼瀹氫箟鍚嶇О"></el-table-column> <el-table-column fixed align="center" prop="processDefinitionKey" label="娴佺▼瀹氫箟KEY"></el-table-column> <el-table-column fixed align="center" prop="name" label="浠诲姟鍚嶇О"></el-table-column> diff --git a/src/views/workflow/task/myDocument.vue b/src/views/workflow/task/myDocument.vue index 4597a2a..1e71f1f 100644 --- a/src/views/workflow/task/myDocument.vue +++ b/src/views/workflow/task/myDocument.vue @@ -42,9 +42,9 @@ </el-row> </template> - <el-table v-loading="loading" :data="processInstanceList" @selection-change="handleSelectionChange"> + <el-table v-loading="loading" border :data="processInstanceList" @selection-change="handleSelectionChange"> <el-table-column type="selection" width="55" align="center" /> - <el-table-column fixed align="center" type="index" label="搴忓彿" width="50"></el-table-column> + <el-table-column fixed align="center" type="index" label="搴忓彿" width="60"></el-table-column> <el-table-column v-if="false" fixed align="center" prop="id" label="id"></el-table-column> <el-table-column fixed align="center" prop="processDefinitionName" label="娴佺▼瀹氫箟鍚嶇О"></el-table-column> <el-table-column fixed align="center" prop="processDefinitionKey" label="娴佺▼瀹氫箟KEY"></el-table-column> diff --git a/src/views/workflow/task/taskCopyList.vue b/src/views/workflow/task/taskCopyList.vue index 112c95b..5d22b0b 100644 --- a/src/views/workflow/task/taskCopyList.vue +++ b/src/views/workflow/task/taskCopyList.vue @@ -28,9 +28,9 @@ </el-row> </template> - <el-table v-loading="loading" :data="taskList" @selection-change="handleSelectionChange"> + <el-table v-loading="loading" border :data="taskList" @selection-change="handleSelectionChange"> <el-table-column type="selection" width="55" align="center" /> - <el-table-column fixed align="center" type="index" label="搴忓彿" width="50"></el-table-column> + <el-table-column fixed align="center" type="index" label="搴忓彿" width="60"></el-table-column> <el-table-column fixed align="center" prop="processDefinitionName" label="娴佺▼瀹氫箟鍚嶇О"></el-table-column> <el-table-column fixed align="center" prop="processDefinitionKey" label="娴佺▼瀹氫箟KEY"></el-table-column> <el-table-column fixed align="center" prop="name" label="浠诲姟鍚嶇О"></el-table-column> diff --git a/src/views/workflow/task/taskFinish.vue b/src/views/workflow/task/taskFinish.vue index fd9ce6e..8bc870f 100644 --- a/src/views/workflow/task/taskFinish.vue +++ b/src/views/workflow/task/taskFinish.vue @@ -28,9 +28,9 @@ </el-row> </template> - <el-table v-loading="loading" :data="taskList" @selection-change="handleSelectionChange"> + <el-table v-loading="loading" border :data="taskList" @selection-change="handleSelectionChange"> <el-table-column type="selection" width="55" align="center" /> - <el-table-column fixed align="center" type="index" label="搴忓彿" width="50"></el-table-column> + <el-table-column fixed align="center" type="index" label="搴忓彿" width="60"></el-table-column> <el-table-column fixed align="center" prop="processDefinitionName" label="娴佺▼瀹氫箟鍚嶇О"></el-table-column> <el-table-column fixed align="center" prop="processDefinitionKey" label="娴佺▼瀹氫箟KEY"></el-table-column> <el-table-column fixed align="center" prop="name" label="浠诲姟鍚嶇О"></el-table-column> diff --git a/src/views/workflow/task/taskWaiting.vue b/src/views/workflow/task/taskWaiting.vue index a6443bd..8ef3c03 100644 --- a/src/views/workflow/task/taskWaiting.vue +++ b/src/views/workflow/task/taskWaiting.vue @@ -28,9 +28,9 @@ </el-row> </template> - <el-table v-loading="loading" :data="taskList" @selection-change="handleSelectionChange"> + <el-table v-loading="loading" border :data="taskList" @selection-change="handleSelectionChange"> <el-table-column type="selection" width="55" align="center" /> - <el-table-column fixed align="center" type="index" label="搴忓彿" width="50"></el-table-column> + <el-table-column fixed align="center" type="index" label="搴忓彿" width="60"></el-table-column> <el-table-column fixed align="center" prop="processDefinitionName" label="娴佺▼瀹氫箟鍚嶇О"></el-table-column> <el-table-column fixed align="center" prop="processDefinitionKey" label="娴佺▼瀹氫箟KEY"></el-table-column> <el-table-column fixed align="center" prop="name" label="浠诲姟鍚嶇О"></el-table-column> @@ -54,22 +54,14 @@ </template> </el-table-column> <el-table-column align="center" prop="createTime" label="鍒涘缓鏃堕棿" width="160"></el-table-column> - <el-table-column label="鎿嶄綔" align="center" width="160" class-name="small-padding fixed-width"> + <el-table-column label="鎿嶄綔" align="center" width="200"> <template #default="scope"> - <el-row :gutter="10" class="mb8"> - <el-col :span="1.5"> - <el-button link type="primary" size="small" icon="Document" @click="handleApprovalRecord(scope.row)">瀹℃壒璁板綍</el-button> - </el-col> - <el-col v-if="scope.row.participantVo && (scope.row.participantVo.claim === null || scope.row.participantVo.claim === true)" :span="1.5"> - <el-button link type="primary" size="small" icon="Edit" @click="submitVerifyOpen(scope.row.id)">鍔炵悊</el-button> - </el-col> - <el-col v-if="scope.row.participantVo && scope.row.participantVo.claim === true" :span="1.5"> - <el-button link type="primary" size="small" icon="Document" @click="handleReturnTask(scope.row.id)">褰掕繕</el-button> - </el-col> - <el-col v-if="scope.row.participantVo && scope.row.participantVo.claim === false" :span="1.5"> - <el-button link type="primary" size="small" icon="Document" @click="handleClaimTask(scope.row.id)">璁ら</el-button> - </el-col> - </el-row> + <el-button v-if="scope.row.participantVo && (scope.row.participantVo.claim === null || scope.row.participantVo.claim === true)" + type="primary" size="small" icon="Edit" @click="handleOpen(scope.row)">鍔炵悊</el-button> + <el-button v-if="scope.row.participantVo && scope.row.participantVo.claim === true" + type="primary" size="small" icon="Document" @click="handleReturnTask(scope.row.id)">褰掕繕</el-button> + <el-button v-if="scope.row.participantVo && scope.row.participantVo.claim === false" + type="primary" size="small" icon="Document" @click="handleClaimTask(scope.row.id)">璁ら</el-button> </template> </el-table-column> </el-table> @@ -81,22 +73,13 @@ @pagination="handleQuery" /> </el-card> - <!-- 瀹℃壒璁板綍 --> - <approvalRecord ref="approvalRecordRef" /> - <!-- 鎻愪氦缁勪欢 --> - <submitVerify ref="submitVerifyRef" @submit-callback="handleQuery" /> </div> </template> <script lang="ts" setup> import { getPageByTaskWait, claim, returnTask } from '@/api/workflow/task'; -import ApprovalRecord from '@/components/Process/approvalRecord.vue'; -import SubmitVerify from '@/components/Process/submitVerify.vue'; import { TaskQuery, TaskVO } from '@/api/workflow/task/types'; //鎻愪氦缁勪欢 -const submitVerifyRef = ref<InstanceType<typeof SubmitVerify>>(); -//瀹℃壒璁板綍缁勪欢 -const approvalRecordRef = ref<InstanceType<typeof ApprovalRecord>>(); const queryFormRef = ref<ElFormInstance>(); const { proxy } = getCurrentInstance() as ComponentInternalInstance; // 閬僵灞� @@ -124,12 +107,6 @@ onMounted(() => { getWaitingList(); }); -//瀹℃壒璁板綍 -const handleApprovalRecord = (row: TaskVO) => { - if (approvalRecordRef.value) { - approvalRecordRef.value.init(row.processInstanceId); - } -}; /** 鎼滅储鎸夐挳鎿嶄綔 */ const handleQuery = () => { getWaitingList(); @@ -156,10 +133,18 @@ loading.value = false; }); }; -//鎻愪氦 -const submitVerifyOpen = async (id: string) => { - if (submitVerifyRef.value) { - submitVerifyRef.value.openDialog(id); +//鍔炵悊 +const handleOpen = async (row: TaskVO) => { + if(row.wfFormDefinitionVo){ + proxy.$tab.closePage(proxy.$route); + proxy.$router.push({ + path: `${row.wfFormDefinitionVo.path}/${row.businessKey}/approval`, + query: { + taskId: row.id + } + }) + }else{ + proxy?.$modal.msgError('璇峰埌娴佺▼瀹氫箟鑿滃崟閰嶇疆璺敱锛�'); } }; -- Gitblit v1.9.3