From 3062c46b496236ce1f89ece74e4626c15c66bfe5 Mon Sep 17 00:00:00 2001 From: dap <dap@qq.com> Date: 星期四, 16 五月 2024 08:18:54 +0800 Subject: [PATCH] fix: 流程定义xml预览问题 & 重构代码 --- src/views/workflow/processDefinition/index.vue | 227 ++++++++++++++++++++++++++++++++++++++++---------------- 1 files changed, 163 insertions(+), 64 deletions(-) diff --git a/src/views/workflow/processDefinition/index.vue b/src/views/workflow/processDefinition/index.vue index 6a04f8a..1dacb80 100644 --- a/src/views/workflow/processDefinition/index.vue +++ b/src/views/workflow/processDefinition/index.vue @@ -38,47 +38,52 @@ </el-card> </div> </transition> - <transition :enter-active-class="proxy?.animate.searchAnimate.enter" :leave-active-class="proxy?.animate.searchAnimate.leave"> - <div v-show="showSearch" class="mb-[10px]"> - <el-card shadow="hover"> - <el-button type="primary" icon="UploadFilled" @click="uploadDialog.visible = true">閮ㄧ讲娴佺▼鏂囦欢</el-button> - </el-card> - </div> - </transition> <el-card shadow="hover"> <template #header> <el-row :gutter="10" class="mb8"> - <el-col :span="1.5"> </el-col> + <el-col :span="1.5"> + <el-button type="danger" icon="Delete" :disabled="multiple" @click="handleDelete()">鍒犻櫎</el-button> + </el-col> + <el-col :span="1.5"> + <el-button type="primary" icon="UploadFilled" @click="uploadDialog.visible = true">閮ㄧ讲娴佺▼鏂囦欢</el-button> + </el-col> <right-toolbar v-model:showSearch="showSearch" @query-table="getList"></right-toolbar> </el-row> </template> - <el-table v-loading="loading" :data="processDefinitionList" @selection-change="handleSelectionChange"> + <el-table v-loading="loading" border :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="娴佺▼瀹氫箟鍚嶇О" :show-overflow-tooltip="true"></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"> + <el-table-column align="center" prop="resourceName" label="娴佺▼XML" width="100" :show-overflow-tooltip="true"> <template #default="scope"> - <el-link type="primary" @click="clickPreviewXML(scope.row.id)">{{ scope.row.resourceName }}</el-link> + <el-link type="primary" @click="clickPreview(scope.row.id, 'xml')">{{ scope.row.resourceName }}</el-link> </template> </el-table-column> - <el-table-column align="center" prop="diagramResourceName" label="娴佺▼鍥剧墖" min-width="80" :show-overflow-tooltip="true"> + <el-table-column align="center" prop="diagramResourceName" label="娴佺▼鍥剧墖" width="100" :show-overflow-tooltip="true"> <template #default="scope"> - <el-link type="primary" @click="clickPreviewImg(scope.row.id)">{{ scope.row.diagramResourceName }}</el-link> + <el-link type="primary" @click="clickPreview(scope.row.id, 'bpmn')">{{ 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="鐘舵��" width="80"> <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 align="center" prop="deploymentTime" label="閮ㄧ讲鏃堕棿" width="120" :show-overflow-tooltip="true"></el-table-column> + <el-table-column align="center" label="琛ㄥ悕/琛ㄥ崟KEY" width="120" :show-overflow-tooltip="true"> + <template #default="scope"> + <span v-if="scope.row.wfDefinitionConfigVo"> + {{ scope.row.wfDefinitionConfigVo.tableName }} + </span> + </template> + </el-table-column> + <el-table-column fixed="right" label="鎿嶄綔" align="center" width="220" class-name="small-padding fixed-width"> <template #default="scope"> <el-row :gutter="10" class="mb8"> <el-col :span="1.5"> @@ -93,6 +98,11 @@ </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-col> + <el-col :span="1.5"> <el-button link type="primary" size="small" icon="Delete" @click="handleDelete(scope.row)">鍒犻櫎</el-button> </el-col> </el-row> @@ -101,9 +111,7 @@ <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-button link type="primary" size="small" icon="Tickets" @click="handleDefinitionConfigOpen(scope.row)">缁戝畾涓氬姟</el-button> </el-col> </el-row> </template> @@ -138,11 +146,18 @@ style="width: 240px" /> </div> - <el-upload class="upload-demo" drag accept="application/zip,application/xml,.bpmn" :http-request="handerDeployProcessFile"> - <el-icon class="UploadFilled"><upload-filled /></el-icon> - <div class="el-upload__text"><em>鐐瑰嚮涓婁紶锛岄�夋嫨BPMN娴佺▼鏂囦欢</em></div> - <div class="el-upload__text">浠呮敮鎸� .zip銆�.bpmn20.xml銆乥pmn 鏍煎紡鏂囦欢</div> - <div class="el-upload__text">PS:濡傝嫢閮ㄧ讲璇烽儴缃蹭粠鏈」鐩ā鍨嬬鐞嗗鍑虹殑鏁版嵁</div> + <el-upload + class="upload-demo" + drag + multiple + accept="application/zip,application/xml,.bpmn" + :before-upload="handlerBeforeUpload" + :http-request="handerDeployProcessFile" + > + <el-icon class="UploadFilled"><upload-filled /></el-icon> + <div class="el-upload__text"><em>鐐瑰嚮涓婁紶锛岄�夋嫨BPMN娴佺▼鏂囦欢</em></div> + <div class="el-upload__text">浠呮敮鎸� .zip銆�.bpmn20.xml銆乥pmn 鏍煎紡鏂囦欢</div> + <div class="el-upload__text">PS:濡傝嫢閮ㄧ讲璇烽儴缃蹭粠鏈」鐩ā鍨嬬鐞嗗鍑虹殑鏁版嵁</div> </el-upload> </div> </el-dialog> @@ -151,9 +166,9 @@ <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" prop="key" label="鏍囪瘑Key"></el-table-column> + <el-table-column align="center" type="index" label="搴忓彿" width="60"></el-table-column> + <el-table-column align="center" prop="name" label="娴佺▼瀹氫箟鍚嶇О" :show-overflow-tooltip="true" min-width="80"></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> @@ -189,17 +204,48 @@ </el-button> </el-col> <el-col :span="1.5"> - <el-button link type="primary" icon="Delete" size="small" @click="handleDelete(scope.row)">鍒犻櫎</el-button> + <el-button type="text" size="small" icon="Tickets" @click="handleDefinitionConfigOpen(scope.row)">缁戝畾涓氬姟</el-button> </el-col> </el-row> <el-row :gutter="10" class="mb8"> <el-col :span="1.5"> <el-button link type="primary" icon="Sort" size="small" @click="handleConvertToModel(scope.row)"> 杞崲妯″瀷 </el-button> </el-col> + <el-col :span="1.5"> + <el-button link type="primary" icon="Delete" size="small" @click="handleDelete(scope.row)">鍒犻櫎</el-button> + </el-col> </el-row> </template> </el-table-column> </el-table> + </el-dialog> + + <!-- 琛ㄥ崟閰嶇疆 --> + <el-dialog + v-model="definitionConfigDialog.visible" + :title="definitionConfigDialog.title" + width="650px" + append-to-body + :close-on-click-modal="false" + > + <el-form :model="definitionConfigForm" label-width="auto"> + <el-form-item label="娴佺▼KEY"> + <el-input v-model="definitionConfigForm.processKey" disabled /> + </el-form-item> + <el-form-item label="琛ㄥ悕" prop="formId"> + <el-input v-model="definitionConfigForm.tableName" placeholder="绀轰緥:test_leave" /> + </el-form-item> + <el-form-item label="澶囨敞"> + <el-input v-model="definitionConfigForm.remark" type="textarea" resize="none" /> + </el-form-item> + </el-form> + + <template #footer> + <div class="dialog-footer"> + <el-button @click="definitionConfigDialog.visible = false">鍙栨秷</el-button> + <el-button type="primary" @click="handlerSaveForm">淇濆瓨</el-button> + </div> + </template> </el-dialog> </div> </template> @@ -215,17 +261,20 @@ deployProcessFile, getListByKey } from '@/api/workflow/processDefinition'; +import { getByTableNameNotDefId, getByDefId, saveOrUpdate } from '@/api/workflow/definitionConfig'; import ProcessPreview from './components/processPreview.vue'; import { listCategory } from '@/api/workflow/category'; import { CategoryVO } from '@/api/workflow/category/types'; import { ProcessDefinitionQuery, ProcessDefinitionVO } from '@/api/workflow/processDefinition/types'; -import { UploadRequestOptions } from 'element-plus'; +import { DefinitionConfigForm } from '@/api/workflow/definitionConfig/types'; +import { UploadRequestOptions, ElMessage, ElMessageBox } from 'element-plus'; const { proxy } = getCurrentInstance() as ComponentInternalInstance; const previewRef = ref<InstanceType<typeof ProcessPreview>>(); const queryFormRef = ref<ElFormInstance>(); const categoryTreeRef = ref<ElTreeInstance>(); +const definitionConfigForm = ref<DefinitionConfigForm>({}); type CategoryOption = { categoryCode: string; @@ -234,7 +283,9 @@ }; const loading = ref(true); -const ids = ref<Array<string | number>>([]); +const ids = ref<Array<any>>([]); +const deploymentIds = ref<Array<any>>([]); +const keys = ref<Array<any>>([]); const single = ref(true); const multiple = ref(true); const showSearch = ref(true); @@ -242,7 +293,6 @@ const uploadDialogLoading = ref(false); const processDefinitionList = ref<ProcessDefinitionVO[]>([]); const processDefinitionHistoryList = ref<ProcessDefinitionVO[]>([]); -const url = ref<string[]>([]); const categoryOptions = ref<CategoryOption[]>([]); const categoryName = ref(''); /** 閮ㄧ讲鏂囦欢鍒嗙被閫夋嫨 */ @@ -256,6 +306,11 @@ const processDefinitionDialog = reactive<DialogOption>({ visible: false, title: '鍘嗗彶鐗堟湰' +}); + +const definitionConfigDialog = reactive<DialogOption>({ + visible: false, + title: '娴佺▼瀹氫箟閰嶇疆' }); // 鏌ヨ鍙傛暟 @@ -320,6 +375,8 @@ // 澶氶�夋閫変腑鏁版嵁 const handleSelectionChange = (selection: any) => { ids.value = selection.map((item: any) => item.id); + deploymentIds.value = selection.map((item: any) => item.deploymentId); + keys.value = selection.map((item: any) => item.key); single.value = selection.length !== 1; multiple.value = !selection.length; }; @@ -342,33 +399,26 @@ loading.value = false; }; -//棰勮鍥剧墖 -const clickPreviewImg = async (id: string) => { - loading.value = true; - const resp = await definitionImage(id); - if (previewRef.value) { - url.value = []; - url.value.push('data:image/png;base64,' + resp.data); - loading.value = false; - previewRef.value.openDialog(url.value, 'png'); - } -}; -//棰勮xml -const clickPreviewXML = async (id: string) => { +type PreviewType = 'xml' | 'bpmn'; +//棰勮 鍏叡鏂规硶 +const clickPreview = async (id: string, type: PreviewType) => { loading.value = true; const resp = await definitionXml(id); if (previewRef.value) { - url.value = []; - url.value = resp.data.xml; + const xmlStr = resp.data.xmlStr; loading.value = false; - previewRef.value.openDialog(url.value, 'xml'); + previewRef.value.openDialog(xmlStr, type); } }; + /** 鍒犻櫎鎸夐挳鎿嶄綔 */ -const handleDelete = async (row: ProcessDefinitionVO) => { - await proxy?.$modal.confirm('鏄惁纭鍒犻櫎娴佺▼瀹氫箟key涓恒��' + row.key + '銆戠殑鏁版嵁椤癸紵'); +const handleDelete = async (row?: ProcessDefinitionVO) => { + const id = row?.id || ids.value; + const deployIds = row?.deploymentId || deploymentIds.value; + const defKeys = row?.key || keys.value; + await proxy?.$modal.confirm('鏄惁纭鍒犻櫎娴佺▼瀹氫箟KEY涓恒��' + defKeys + '銆戠殑鏁版嵁椤癸紵'); loading.value = true; - await deleteProcessDefinition(row.deploymentId, row.id).finally(() => (loading.value = false)); + await deleteProcessDefinition(deployIds, id).finally(() => (loading.value = false)); await getList(); proxy?.$modal.msgSuccess('鍒犻櫎鎴愬姛'); }; @@ -394,25 +444,74 @@ proxy?.$modal.msgSuccess('鎿嶄綔鎴愬姛'); }; -//閮ㄧ讲鏂囦欢 -const handerDeployProcessFile = (data: UploadRequestOptions): XMLHttpRequest => { - let formData = new FormData(); +//涓婁紶鏂囦欢鍓嶇殑閽╁瓙 +const handlerBeforeUpload = () => { if (selectCategory.value === 'ALL') { proxy?.$modal.msgError('椤剁骇鑺傜偣涓嶅彲浣滀负鍒嗙被锛�'); - return; + return false; } if (!selectCategory.value) { proxy?.$modal.msgError('璇烽�夋嫨宸︿晶瑕佷笂浼犵殑鍒嗙被锛�'); - return; + return false; } +}; +//閮ㄧ讲鏂囦欢 +const handerDeployProcessFile = (data: UploadRequestOptions): XMLHttpRequest => { + let formData = new FormData(); uploadDialogLoading.value = true; formData.append('file', data.file); formData.append('categoryCode', selectCategory.value); - deployProcessFile(formData).then(() => { - uploadDialog.visible = false; - proxy?.$modal.msgSuccess('閮ㄧ讲鎴愬姛'); - uploadDialogLoading.value = false; - handleQuery(); + deployProcessFile(formData) + .then(() => { + uploadDialog.visible = false; + proxy?.$modal.msgSuccess('閮ㄧ讲鎴愬姛'); + handleQuery(); + }) + .finally(() => { + uploadDialogLoading.value = false; + }); + return; +}; +//鎵撳紑娴佺▼瀹氫箟閰嶇疆 +const handleDefinitionConfigOpen = async (row: ProcessDefinitionVO) => { + definitionConfigDialog.visible = true; + definitionConfigForm.value.processKey = row.key; + definitionConfigForm.value.definitionId = row.id; + definitionConfigForm.value.version = row.version; + const resp = await getByDefId(row.id); + if (resp.data) { + definitionConfigForm.value = resp.data; + } else { + definitionConfigForm.value.tableName = undefined; + definitionConfigForm.value.remark = undefined; + } +}; +//淇濆瓨琛ㄥ崟 +const handlerSaveForm = async () => { + getByTableNameNotDefId(definitionConfigForm.value.tableName, definitionConfigForm.value.definitionId).then((res) => { + if (res.data && res.data.length > 0) { + ElMessageBox.confirm('琛ㄥ悕宸茶銆�' + res.data[0].processKey + '銆戠増鏈瑅' + res.data[0].version + '.0缁戝畾纭鍚庡皢浼氬垹闄ょ粦瀹氱殑娴佺▼KEY!', '鎻愮ず', { + confirmButtonText: '纭', + cancelButtonText: '鍙栨秷', + type: 'warning' + }).then(() => { + saveOrUpdate(definitionConfigForm.value).then((resp) => { + if (resp.code === 200) { + proxy?.$modal.msgSuccess('鎿嶄綔鎴愬姛'); + definitionConfigDialog.visible = false; + getList(); + } + }); + }); + } else { + saveOrUpdate(definitionConfigForm.value).then((resp) => { + if (resp.code === 200) { + proxy?.$modal.msgSuccess('鎿嶄綔鎴愬姛'); + definitionConfigDialog.visible = false; + getList(); + } + }); + } }); }; </script> -- Gitblit v1.9.3