From 1da98c8a8207dd062e433242e1567b6418c6ed81 Mon Sep 17 00:00:00 2001 From: gssong <1742057357@qq.com> Date: 星期六, 06 四月 2024 11:20:29 +0800 Subject: [PATCH] update 优化表单绑定逻辑,移除流程定义配置表单 --- ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActProcessDefinitionServiceImpl.java | 207 +++++++++++++++++++++++++++++++++++---------------- 1 files changed, 141 insertions(+), 66 deletions(-) diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActProcessDefinitionServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActProcessDefinitionServiceImpl.java index a06fb34..89a71db 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActProcessDefinitionServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActProcessDefinitionServiceImpl.java @@ -4,8 +4,10 @@ import cn.hutool.core.codec.Base64; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.collection.CollectionUtil; +import cn.hutool.core.io.FileUtil; import cn.hutool.core.io.IoUtil; import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; import lombok.RequiredArgsConstructor; import lombok.SneakyThrows; import org.apache.commons.io.IOUtils; @@ -17,25 +19,33 @@ import org.dromara.common.tenant.helper.TenantHelper; import org.dromara.workflow.common.constant.FlowConstant; import org.dromara.workflow.domain.WfCategory; +import org.dromara.workflow.domain.WfNodeConfig; import org.dromara.workflow.domain.bo.ProcessDefinitionBo; import org.dromara.workflow.domain.vo.ProcessDefinitionVo; +import org.dromara.workflow.domain.vo.WfDefinitionConfigVo; import org.dromara.workflow.service.IActProcessDefinitionService; import org.dromara.workflow.service.IWfCategoryService; +import org.dromara.workflow.service.IWfDefinitionConfigService; +import org.dromara.workflow.service.IWfNodeConfigService; +import org.dromara.workflow.utils.ModelUtils; import org.dromara.workflow.utils.QueryUtils; +import org.flowable.bpmn.model.UserTask; import org.flowable.engine.ProcessMigrationService; import org.flowable.engine.RepositoryService; import org.flowable.engine.impl.bpmn.deployer.ResourceNameUtil; import org.flowable.engine.repository.*; import org.flowable.task.api.history.HistoricTaskInstance; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; import org.springframework.web.multipart.MultipartFile; import java.io.IOException; import java.io.InputStream; import java.nio.charset.StandardCharsets; import java.util.ArrayList; +import java.util.Collections; import java.util.List; -import java.util.stream.Collectors; +import java.util.zip.ZipEntry; import java.util.zip.ZipInputStream; /** @@ -50,6 +60,8 @@ private final RepositoryService repositoryService; private final ProcessMigrationService processMigrationService; private final IWfCategoryService wfCategoryService; + private final IWfDefinitionConfigService iWfDefinitionConfigService; + private final IWfNodeConfigService iWfNodeConfigService; /** * 鍒嗛〉鏌ヨ @@ -78,20 +90,29 @@ List<String> deploymentIds = StreamUtils.toList(definitionList, ProcessDefinition::getDeploymentId); deploymentList = QueryUtils.deploymentQuery(deploymentIds).list(); } - for (ProcessDefinition processDefinition : definitionList) { - ProcessDefinitionVo processDefinitionVo = BeanUtil.toBean(processDefinition, ProcessDefinitionVo.class); - if (CollUtil.isNotEmpty(deploymentList)) { - // 閮ㄧ讲鏃堕棿 - deploymentList.stream().filter(e -> e.getId().equals(processDefinition.getDeploymentId())).findFirst().ifPresent(e -> { - processDefinitionVo.setDeploymentTime(e.getDeploymentTime()); - }); + if (CollUtil.isNotEmpty(definitionList)) { + List<String> ids = StreamUtils.toList(definitionList, ProcessDefinition::getId); + List<WfDefinitionConfigVo> wfDefinitionConfigVos = iWfDefinitionConfigService.queryList(ids); + for (ProcessDefinition processDefinition : definitionList) { + ProcessDefinitionVo processDefinitionVo = BeanUtil.toBean(processDefinition, ProcessDefinitionVo.class); + if (CollUtil.isNotEmpty(deploymentList)) { + // 閮ㄧ讲鏃堕棿 + deploymentList.stream().filter(e -> e.getId().equals(processDefinition.getDeploymentId())).findFirst().ifPresent(e -> { + processDefinitionVo.setDeploymentTime(e.getDeploymentTime()); + }); + } + if (CollUtil.isNotEmpty(wfDefinitionConfigVos)) { + wfDefinitionConfigVos.stream().filter(e -> e.getDefinitionId().equals(processDefinition.getId())).findFirst().ifPresent(processDefinitionVo::setWfDefinitionConfigVo); + } + processDefinitionVoList.add(processDefinitionVo); } - processDefinitionVoList.add(processDefinitionVo); } // 鎬昏褰曟暟 long total = query.count(); - - return new TableDataInfo<>(processDefinitionVoList, total); + TableDataInfo<ProcessDefinitionVo> build = TableDataInfo.build(); + build.setRows(processDefinitionVoList); + build.setTotal(total); + return build; } /** @@ -106,18 +127,25 @@ List<ProcessDefinition> definitionList = query.processDefinitionKey(key).list(); List<Deployment> deploymentList = null; if (CollUtil.isNotEmpty(definitionList)) { - List<String> deploymentIds = definitionList.stream().map(ProcessDefinition::getDeploymentId).collect(Collectors.toList()); + List<String> deploymentIds = StreamUtils.toList(definitionList, ProcessDefinition::getDeploymentId); deploymentList = QueryUtils.deploymentQuery(deploymentIds).list(); } - for (ProcessDefinition processDefinition : definitionList) { - ProcessDefinitionVo processDefinitionVo = BeanUtil.toBean(processDefinition, ProcessDefinitionVo.class); - if (CollUtil.isNotEmpty(deploymentList)) { - // 閮ㄧ讲鏃堕棿 - deploymentList.stream().filter(e -> e.getId().equals(processDefinition.getDeploymentId())).findFirst().ifPresent(e -> { - processDefinitionVo.setDeploymentTime(e.getDeploymentTime()); - }); + if (CollUtil.isNotEmpty(definitionList)) { + List<String> ids = StreamUtils.toList(definitionList, ProcessDefinition::getId); + List<WfDefinitionConfigVo> wfDefinitionConfigVos = iWfDefinitionConfigService.queryList(ids); + for (ProcessDefinition processDefinition : definitionList) { + ProcessDefinitionVo processDefinitionVo = BeanUtil.toBean(processDefinition, ProcessDefinitionVo.class); + if (CollUtil.isNotEmpty(deploymentList)) { + // 閮ㄧ讲鏃堕棿 + deploymentList.stream().filter(e -> e.getId().equals(processDefinition.getDeploymentId())).findFirst().ifPresent(e -> { + processDefinitionVo.setDeploymentTime(e.getDeploymentTime()); + }); + if (CollUtil.isNotEmpty(wfDefinitionConfigVos)) { + wfDefinitionConfigVos.stream().filter(e -> e.getDefinitionId().equals(processDefinition.getId())).findFirst().ifPresent(processDefinitionVo::setWfDefinitionConfigVo); + } + } + processDefinitionVoList.add(processDefinitionVo); } - processDefinitionVoList.add(processDefinitionVo); } return CollectionUtil.reverse(processDefinitionVoList); } @@ -160,6 +188,7 @@ * @param processDefinitionId 娴佺▼瀹氫箟id */ @Override + @Transactional(rollbackFor = Exception.class) public boolean deleteDeployment(String deploymentId, String processDefinitionId) { try { List<HistoricTaskInstance> taskInstanceList = QueryUtils.hisTaskInstanceQuery() @@ -169,6 +198,10 @@ } //鍒犻櫎娴佺▼瀹氫箟 repositoryService.deleteDeployment(deploymentId); + //鍒犻櫎娴佺▼瀹氫箟閰嶇疆 + iWfDefinitionConfigService.deleteByDefIds(Collections.singletonList(processDefinitionId)); + //鍒犻櫎鑺傜偣閰嶇疆 + iWfNodeConfigService.deleteByDefIds(Collections.singletonList(processDefinitionId)); return true; } catch (Exception e) { e.printStackTrace(); @@ -265,59 +298,101 @@ * @param file 鏂囦欢 * @param categoryCode 鍒嗙被 */ + @SneakyThrows @Override - public boolean deployByFile(MultipartFile file, String categoryCode) { - try { - WfCategory wfCategory = wfCategoryService.queryByCategoryCode(categoryCode); - if (wfCategory == null) { - throw new ServiceException("娴佺▼鍒嗙被涓嶅瓨鍦�"); - } - // 鏂囦欢鍚� = 娴佺▼鍚嶇О-娴佺▼key - String filename = file.getOriginalFilename(); - assert filename != null; - String[] splitFilename = filename.substring(0, filename.lastIndexOf(".")).split("-"); - if (splitFilename.length < 2) { - throw new ServiceException("娴佺▼鍒嗙被涓嶈兘涓虹┖(鏂囦欢鍚� = 娴佺▼鍚嶇О-娴佺▼key)"); - } - //娴佺▼鍚嶇О - String processName = splitFilename[0]; - //娴佺▼key - String processKey = splitFilename[1]; - // 鏂囦欢鍚庣紑鍚� - String suffix = filename.substring(filename.lastIndexOf(".") + 1).toUpperCase(); - InputStream inputStream = file.getInputStream(); - Deployment deployment; - if (FlowConstant.ZIP.equals(suffix)) { - DeploymentBuilder builder = repositoryService.createDeployment(); - deployment = builder.addZipInputStream(new ZipInputStream(inputStream)) - .tenantId(TenantHelper.getTenantId()) - .name(processName).key(processKey).category(categoryCode).deploy(); - } else { - String[] list = ResourceNameUtil.BPMN_RESOURCE_SUFFIXES; - boolean flag = false; - for (String str : list) { - if (filename.contains(str)) { - flag = true; - break; - } - } - if (flag) { + @Transactional(rollbackFor = Exception.class) + public void deployByFile(MultipartFile file, String categoryCode) { + + WfCategory wfCategory = wfCategoryService.queryByCategoryCode(categoryCode); + if (wfCategory == null) { + throw new ServiceException("娴佺▼鍒嗙被涓嶅瓨鍦�"); + } + // 鏂囦欢鍚庣紑鍚� + String suffix = FileUtil.extName(file.getOriginalFilename()); + InputStream inputStream = file.getInputStream(); + if (FlowConstant.ZIP.equalsIgnoreCase(suffix)) { + ZipInputStream zipInputStream = null; + try { + zipInputStream = new ZipInputStream(inputStream); + ZipEntry zipEntry; + while ((zipEntry = zipInputStream.getNextEntry()) != null) { + String filename = zipEntry.getName(); + String[] splitFilename = filename.substring(0, filename.lastIndexOf(".")).split("-"); + //娴佺▼鍚嶇О + String processName = splitFilename[0]; + //娴佺▼key + String processKey = splitFilename[1]; DeploymentBuilder builder = repositoryService.createDeployment(); - deployment = builder.addInputStream(filename, inputStream) + Deployment deployment = builder.addInputStream(filename, zipInputStream) .tenantId(TenantHelper.getTenantId()) .name(processName).key(processKey).category(categoryCode).deploy(); - } else { - throw new ServiceException("鏂囦欢绫诲瀷涓婁紶閿欒锛�"); + ProcessDefinition definition = QueryUtils.definitionQuery().deploymentId(deployment.getId()).singleResult(); + repositoryService.setProcessDefinitionCategory(definition.getId(), categoryCode); + setWfNodeConfig(definition); + zipInputStream.closeEntry(); + } + } catch (IOException e) { + throw new RuntimeException(e); + } finally { + if (zipInputStream != null) { + zipInputStream.close(); } } - // 鏇存柊鍒嗙被 - ProcessDefinition definition = QueryUtils.definitionQuery().deploymentId(deployment.getId()).singleResult(); - repositoryService.setProcessDefinitionCategory(definition.getId(), categoryCode); + } else { + String originalFilename = file.getOriginalFilename(); + String bpmnResourceSuffix = ResourceNameUtil.BPMN_RESOURCE_SUFFIXES[0]; + if (originalFilename.contains(bpmnResourceSuffix)) { + // 鏂囦欢鍚� = 娴佺▼鍚嶇О-娴佺▼key + String[] splitFilename = originalFilename.substring(0, originalFilename.lastIndexOf(".")).split("-"); + if (splitFilename.length < 2) { + throw new ServiceException("鏂囦欢鍚� = 娴佺▼鍚嶇О-娴佺▼KEY"); + } + //娴佺▼鍚嶇О + String processName = splitFilename[0]; + //娴佺▼key + String processKey = splitFilename[1]; - return true; - } catch (IOException e) { - e.printStackTrace(); - throw new ServiceException("閮ㄧ讲澶辫触" + e.getMessage()); + DeploymentBuilder builder = repositoryService.createDeployment(); + Deployment deployment = builder.addInputStream(originalFilename, inputStream) + .tenantId(TenantHelper.getTenantId()) + .name(processName).key(processKey).category(categoryCode).deploy(); + // 鏇存柊鍒嗙被 + ProcessDefinition definition = QueryUtils.definitionQuery().deploymentId(deployment.getId()).singleResult(); + repositoryService.setProcessDefinitionCategory(definition.getId(), categoryCode); + setWfNodeConfig(definition); + + } else { + throw new ServiceException("鏂囦欢绫诲瀷涓婁紶閿欒锛�"); + } + } + + } + + /** + * 璁剧疆琛ㄥ崟鍐呭 + * + * @param definition 閮ㄧ讲鍚庢渶鏂版祦绋嬪畾涔� + */ + private void setWfNodeConfig(ProcessDefinition definition) { + //鏇存柊娴佺▼鑺傜偣閰嶇疆琛ㄥ崟 + List<UserTask> userTasks = ModelUtils.getUserTaskFlowElements(definition.getId()); + UserTask applyUserTask = ModelUtils.getApplyUserTask(definition.getId()); + List<WfNodeConfig> wfNodeConfigList = new ArrayList<>(); + for (UserTask userTask : userTasks) { + if (StringUtils.isNotBlank(userTask.getFormKey()) && userTask.getFormKey().contains(StrUtil.COLON)) { + WfNodeConfig wfNodeConfig = new WfNodeConfig(); + wfNodeConfig.setNodeId(userTask.getId()); + wfNodeConfig.setNodeName(userTask.getName()); + wfNodeConfig.setDefinitionId(definition.getId()); + String[] split = userTask.getFormKey().split(StrUtil.COLON); + wfNodeConfig.setFormType(split[0]); + wfNodeConfig.setFormId(Long.valueOf(split[1])); + wfNodeConfig.setApplyUserTask(applyUserTask.getId().equals(userTask.getId()) ? FlowConstant.TRUE : FlowConstant.FALSE); + wfNodeConfigList.add(wfNodeConfig); + } + } + if (CollUtil.isNotEmpty(wfNodeConfigList)) { + iWfNodeConfigService.saveOrUpdate(wfNodeConfigList); } } } -- Gitblit v1.9.3