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' }); }; 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; } 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 { src/api/workflow/task/types.ts
@@ -36,6 +36,8 @@ processDefinitionKey: string; participantVo: ParticipantVo; multiInstance: boolean; businessKey: string; wfFormDefinitionVo: any; } export interface VariableVo { 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> 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 }, } ] } ]; 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('æ¯å¦ç¡®è®¤æ¤éå½ååæ®ï¼'); 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> 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"> 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> 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"> 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> 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> 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> 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> 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('è¯·å°æµç¨å®ä¹èåé 置路ç±ï¼'); } };