From b017cb7b54509efd28749ea3a78461f4254dad09 Mon Sep 17 00:00:00 2001
From: gssong <1742057357@qq.com>
Date: 星期五, 22 三月 2024 23:42:05 +0800
Subject: [PATCH] add 添加流程实例,全部待办表单参数

---
 ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/ActProcessDefinitionServiceImpl.java |  188 +++++++++++++++++++++++++++-------------------
 1 files changed, 109 insertions(+), 79 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 51c90f1..28c3520 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,6 +4,7 @@
 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 lombok.RequiredArgsConstructor;
@@ -12,14 +13,17 @@
 import org.dromara.common.core.exception.ServiceException;
 import org.dromara.common.core.utils.StreamUtils;
 import org.dromara.common.core.utils.StringUtils;
+import org.dromara.common.mybatis.core.page.PageQuery;
 import org.dromara.common.mybatis.core.page.TableDataInfo;
 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.bo.ProcessDefinitionBo;
 import org.dromara.workflow.domain.vo.ProcessDefinitionVo;
+import org.dromara.workflow.domain.vo.WfFormDefinitionVo;
 import org.dromara.workflow.service.IActProcessDefinitionService;
 import org.dromara.workflow.service.IWfCategoryService;
+import org.dromara.workflow.service.IWfFormDefinitionService;
 import org.dromara.workflow.utils.QueryUtils;
 import org.flowable.engine.ProcessMigrationService;
 import org.flowable.engine.RepositoryService;
@@ -27,6 +31,7 @@
 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;
@@ -34,7 +39,7 @@
 import java.nio.charset.StandardCharsets;
 import java.util.ArrayList;
 import java.util.List;
-import java.util.stream.Collectors;
+import java.util.zip.ZipEntry;
 import java.util.zip.ZipInputStream;
 
 /**
@@ -49,43 +54,51 @@
     private final RepositoryService repositoryService;
     private final ProcessMigrationService processMigrationService;
     private final IWfCategoryService wfCategoryService;
+    private final IWfFormDefinitionService iWfFormDefinitionService;
 
     /**
      * 鍒嗛〉鏌ヨ
      *
-     * @param processDefinitionBo 鍙傛暟
+     * @param bo 鍙傛暟
      * @return 杩斿洖鍒嗛〉鍒楄〃
      */
     @Override
-    public TableDataInfo<ProcessDefinitionVo> page(ProcessDefinitionBo processDefinitionBo) {
+    public TableDataInfo<ProcessDefinitionVo> page(ProcessDefinitionBo bo, PageQuery pageQuery) {
         ProcessDefinitionQuery query = QueryUtils.definitionQuery();
-        if (StringUtils.isNotEmpty(processDefinitionBo.getKey())) {
-            query.processDefinitionKey(processDefinitionBo.getKey());
+        if (StringUtils.isNotEmpty(bo.getKey())) {
+            query.processDefinitionKey(bo.getKey());
         }
-        if (StringUtils.isNotEmpty(processDefinitionBo.getCategoryCode())) {
-            query.processDefinitionCategory(processDefinitionBo.getCategoryCode());
+        if (StringUtils.isNotEmpty(bo.getCategoryCode())) {
+            query.processDefinitionCategory(bo.getCategoryCode());
         }
-        if (StringUtils.isNotEmpty(processDefinitionBo.getName())) {
-            query.processDefinitionNameLike("%" + processDefinitionBo.getName() + "%");
+        if (StringUtils.isNotEmpty(bo.getName())) {
+            query.processDefinitionNameLike("%" + bo.getName() + "%");
         }
         query.orderByDeploymentId().desc();
         // 鍒嗛〉鏌ヨ
         List<ProcessDefinitionVo> processDefinitionVoList = new ArrayList<>();
-        List<ProcessDefinition> definitionList = query.latestVersion().listPage(processDefinitionBo.getPageNum(), processDefinitionBo.getPageSize());
+        List<ProcessDefinition> definitionList = query.latestVersion().listPage(pageQuery.getFirstNum(), pageQuery.getPageSize());
         List<Deployment> deploymentList = null;
         if (CollUtil.isNotEmpty(definitionList)) {
             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<WfFormDefinitionVo> wfFormDefinitionVos = iWfFormDefinitionService.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(wfFormDefinitionVos)) {
+                    wfFormDefinitionVos.stream().filter(e -> e.getDefinitionId().equals(processDefinition.getId())).findFirst().ifPresent(processDefinitionVo::setWfFormDefinitionVo);
+                }
+                processDefinitionVoList.add(processDefinitionVo);
             }
-            processDefinitionVoList.add(processDefinitionVo);
         }
         // 鎬昏褰曟暟
         long total = query.count();
@@ -99,24 +112,31 @@
      * @param key 娴佺▼瀹氫箟key
      */
     @Override
-    public List<ProcessDefinitionVo> getProcessDefinitionListByKey(String key) {
+    public List<ProcessDefinitionVo> getListByKey(String key) {
         List<ProcessDefinitionVo> processDefinitionVoList = new ArrayList<>();
         ProcessDefinitionQuery query = QueryUtils.definitionQuery();
         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<WfFormDefinitionVo> wfFormDefinitionVos = iWfFormDefinitionService.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(wfFormDefinitionVos)) {
+                        wfFormDefinitionVos.stream().filter(e -> e.getDefinitionId().equals(processDefinition.getId())).findFirst().ifPresent(processDefinitionVo::setWfFormDefinitionVo);
+                    }
+                }
+                processDefinitionVoList.add(processDefinitionVo);
             }
-            processDefinitionVoList.add(processDefinitionVo);
         }
         return CollectionUtil.reverse(processDefinitionVoList);
     }
@@ -128,7 +148,7 @@
      */
     @SneakyThrows
     @Override
-    public String processDefinitionImage(String processDefinitionId) {
+    public String definitionImage(String processDefinitionId) {
         InputStream inputStream = repositoryService.getProcessDiagram(processDefinitionId);
         return Base64.encode(IOUtils.toByteArray(inputStream));
     }
@@ -139,7 +159,7 @@
      * @param processDefinitionId 娴佺▼瀹氫箟id
      */
     @Override
-    public String processDefinitionXml(String processDefinitionId) {
+    public String definitionXml(String processDefinitionId) {
         StringBuilder xml = new StringBuilder();
         ProcessDefinition processDefinition = repositoryService.getProcessDefinition(processDefinitionId);
         InputStream inputStream;
@@ -181,7 +201,7 @@
      * @param processDefinitionId 娴佺▼瀹氫箟id
      */
     @Override
-    public boolean updateProcessDefState(String processDefinitionId) {
+    public boolean updateDefinitionState(String processDefinitionId) {
         try {
             ProcessDefinition processDefinition = QueryUtils.definitionQuery()
                 .processDefinitionId(processDefinitionId).singleResult();
@@ -208,7 +228,7 @@
      */
 
     @Override
-    public boolean migrationProcessDefinition(String currentProcessDefinitionId, String fromProcessDefinitionId) {
+    public boolean migrationDefinition(String currentProcessDefinitionId, String fromProcessDefinitionId) {
         try {
             // 杩佺Щ楠岃瘉
             boolean migrationValid = processMigrationService.createProcessInstanceMigrationBuilder()
@@ -264,59 +284,69 @@
      * @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);
+                    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);
-
-            return true;
-        } catch (IOException e) {
-            e.printStackTrace();
-            throw new ServiceException("閮ㄧ讲澶辫触" + e.getMessage());
+        } 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];
+                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);
+            } else {
+                throw new ServiceException("鏂囦欢绫诲瀷涓婁紶閿欒锛�");
+            }
         }
+
     }
 }

--
Gitblit v1.9.3