From 87eb6395ed4d5f5c428d75661b7c7e6fe95bb420 Mon Sep 17 00:00:00 2001
From: xiangpei <xiangpei@timesnew.cn>
Date: 星期一, 17 三月 2025 16:19:15 +0800
Subject: [PATCH] 更新流程实现

---
 flowable/src/main/java/com/ycl/cmd/RemoveDeploymentCacheCMD.java           |   46 +++++++++++++++++++++++
 flowable/src/main/java/com/ycl/controller/FlowDefinitionController.java    |   24 ++++++++++++
 flowable/src/main/resources/mapper/FlowDeployMapper.xml                    |    4 ++
 flowable/src/main/java/com/ycl/domain/dto/FlowSaveXmlVo.java               |    5 ++
 flowable/src/main/java/com/ycl/mapper/FlowDeployMapper.java                |    2 +
 flowable/src/main/java/com/ycl/service/impl/FlowDefinitionServiceImpl.java |   22 +++++++++-
 flowable/src/main/java/com/ycl/service/IFlowDefinitionService.java         |   13 ++++++
 7 files changed, 113 insertions(+), 3 deletions(-)

diff --git a/flowable/src/main/java/com/ycl/cmd/RemoveDeploymentCacheCMD.java b/flowable/src/main/java/com/ycl/cmd/RemoveDeploymentCacheCMD.java
new file mode 100644
index 0000000..bea7801
--- /dev/null
+++ b/flowable/src/main/java/com/ycl/cmd/RemoveDeploymentCacheCMD.java
@@ -0,0 +1,46 @@
+package com.ycl.cmd;
+
+import lombok.RequiredArgsConstructor;
+import org.flowable.common.engine.impl.interceptor.Command;
+import org.flowable.common.engine.impl.interceptor.CommandContext;
+import org.flowable.common.engine.impl.persistence.deploy.DeploymentCache;
+import org.flowable.engine.impl.persistence.deploy.DeploymentManager;
+import org.flowable.engine.impl.persistence.deploy.ProcessDefinitionCacheEntry;
+import org.flowable.engine.impl.util.CommandContextUtil;
+import org.flowable.engine.repository.Deployment;
+import org.springframework.util.StringUtils;
+
+/**
+ * @author锛歺p
+ * @date锛�2025/3/17 14:54
+ */
+public class RemoveDeploymentCacheCMD implements Command<Deployment> {
+
+    /**
+     * 娴佺▼瀹氫箟id
+     */
+    private String processDefId;
+
+    public RemoveDeploymentCacheCMD(String processDefId) {
+        this.processDefId = processDefId;
+    }
+
+    /**
+     * 濡傛灉浼犲叆浜嗘祦绋嬪畾涔塱d锛岄偅涔堝彧鍒犻櫎鐗瑰畾鐨勭紦瀛樸�傛病浼犲氨鍒犻櫎鎵�鏈夌殑缂撳瓨
+     *
+     * @param commandContext
+     * @return
+     */
+    @Override
+    public Deployment execute(CommandContext commandContext) {
+        DeploymentManager deploymentManager = CommandContextUtil.getProcessEngineConfiguration().getDeploymentManager();
+        DeploymentCache<ProcessDefinitionCacheEntry> deploymentCache = deploymentManager.getProcessDefinitionCache();
+
+        if (StringUtils.hasText(processDefId)) {
+            deploymentCache.remove(processDefId);
+        } else {
+            deploymentCache.clear();
+        }
+        return null;
+    }
+}
diff --git a/flowable/src/main/java/com/ycl/controller/FlowDefinitionController.java b/flowable/src/main/java/com/ycl/controller/FlowDefinitionController.java
index ed436a0..e5cdd2f 100644
--- a/flowable/src/main/java/com/ycl/controller/FlowDefinitionController.java
+++ b/flowable/src/main/java/com/ycl/controller/FlowDefinitionController.java
@@ -152,6 +152,30 @@
         return AjaxResult.success("瀵煎叆鎴愬姛");
     }
 
+    @ApiOperation(value = "淇敼鍘熸潵閮ㄧ讲鐨勬祦绋嬶紝涓嶅啀浠ユ柊鐗堟湰閮ㄧ讲")
+    @Log(title = "淇敼鍘熸潵閮ㄧ讲鐨勬祦绋嬶紝涓嶅啀浠ユ柊鐗堟湰閮ㄧ讲", businessType = BusinessType.UPDATE)
+    @PostMapping("/update")
+    public AjaxResult update(@RequestBody FlowSaveXmlVo vo) {
+        InputStream in = null;
+        try {
+            in = new ByteArrayInputStream(vo.getXml().getBytes(StandardCharsets.UTF_8));
+            flowDefinitionService.updateProcess(vo.getDeploymentId(), vo.getName(), vo.getCategory(), in);
+        } catch (Exception e) {
+            log.error("瀵煎叆澶辫触:", e);
+            return AjaxResult.error(e.getMessage());
+        } finally {
+            try {
+                if (in != null) {
+                    in.close();
+                }
+            } catch (IOException e) {
+                log.error("鍏抽棴杈撳叆娴佸嚭閿�", e);
+            }
+        }
+
+        return AjaxResult.success("瀵煎叆鎴愬姛");
+    }
+
     @ApiOperation(value = "鍙戣捣娴佺▼")
     @Log(title = "鍙戣捣娴佺▼", businessType = BusinessType.INSERT)
     @PostMapping("/start/{procDefId}")
diff --git a/flowable/src/main/java/com/ycl/domain/dto/FlowSaveXmlVo.java b/flowable/src/main/java/com/ycl/domain/dto/FlowSaveXmlVo.java
index ab61566..ce384f8 100644
--- a/flowable/src/main/java/com/ycl/domain/dto/FlowSaveXmlVo.java
+++ b/flowable/src/main/java/com/ycl/domain/dto/FlowSaveXmlVo.java
@@ -12,6 +12,11 @@
 public class FlowSaveXmlVo implements Serializable {
 
     /**
+     * 娴佺▼閮ㄧ讲id锛屽彧鏈変簩娆′繚瀛樻椂鎵嶄細鏈�
+     */
+    private String deploymentId;
+
+    /**
      * 娴佺▼鍚嶇О
      */
     private String name;
diff --git a/flowable/src/main/java/com/ycl/mapper/FlowDeployMapper.java b/flowable/src/main/java/com/ycl/mapper/FlowDeployMapper.java
index 0c87247..ab787aa 100644
--- a/flowable/src/main/java/com/ycl/mapper/FlowDeployMapper.java
+++ b/flowable/src/main/java/com/ycl/mapper/FlowDeployMapper.java
@@ -39,4 +39,6 @@
      * @param query
      */
     IPage selectDeployListWithConfigPage(IPage<FlowProcDefWithConfigDto> page, @Param("query") ProcessConfigInfoQuery query);
+
+    void updateProcess(@Param("bytes") Object bytes, @Param("deployId") String deployId);
 }
diff --git a/flowable/src/main/java/com/ycl/service/IFlowDefinitionService.java b/flowable/src/main/java/com/ycl/service/IFlowDefinitionService.java
index 6839c33..99f5e9e 100644
--- a/flowable/src/main/java/com/ycl/service/IFlowDefinitionService.java
+++ b/flowable/src/main/java/com/ycl/service/IFlowDefinitionService.java
@@ -37,6 +37,17 @@
     void importFile(String name, String category, InputStream in);
 
     /**
+     * 鏇存柊閮ㄧ讲鐨勬祦绋嬶紝涓嶅啀閲嶆柊閮ㄧ讲
+     *
+     * @param deploymentId
+     * @param name
+     * @param category
+     * @param in
+     */
+    void updateProcess(String deploymentId, String name, String category, InputStream in);
+
+
+    /**
      * 璇诲彇xml
      * @param deployId
      * @return
@@ -77,4 +88,6 @@
      * @return
      */
     InputStream readImage(String deployId);
+
+
 }
diff --git a/flowable/src/main/java/com/ycl/service/impl/FlowDefinitionServiceImpl.java b/flowable/src/main/java/com/ycl/service/impl/FlowDefinitionServiceImpl.java
index 9f7aca6..d27ae14 100644
--- a/flowable/src/main/java/com/ycl/service/impl/FlowDefinitionServiceImpl.java
+++ b/flowable/src/main/java/com/ycl/service/impl/FlowDefinitionServiceImpl.java
@@ -3,6 +3,7 @@
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.github.pagehelper.PageHelper;
 import com.github.pagehelper.PageInfo;
+import com.ycl.cmd.RemoveDeploymentCacheCMD;
 import com.ycl.common.constant.ProcessConstants;
 import com.ycl.common.core.domain.AjaxResult;
 import com.ycl.common.core.domain.entity.SysUser;
@@ -20,6 +21,7 @@
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.io.IOUtils;
 import org.flowable.bpmn.model.BpmnModel;
+import org.flowable.engine.ManagementService;
 import org.flowable.engine.repository.Deployment;
 import org.flowable.engine.repository.ProcessDefinition;
 import org.flowable.engine.repository.ProcessDefinitionQuery;
@@ -28,6 +30,7 @@
 import org.flowable.task.api.Task;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
+import org.springframework.util.StringUtils;
 
 import javax.annotation.Resource;
 import java.io.IOException;
@@ -50,12 +53,10 @@
 public class FlowDefinitionServiceImpl extends FlowServiceFactory implements IFlowDefinitionService {
 
     private final ISysDeployFormService sysDeployFormService;
-
     private final ISysUserService sysUserService;
-
     private final ISysDeptService sysDeptService;
-
     private final FlowDeployMapper flowDeployMapper;
+    private final ManagementService managementService;
 
     private static final String BPMN_FILE_SUFFIX = ".bpmn";
 
@@ -135,6 +136,21 @@
 
     }
 
+    @Override
+    public void updateProcess(String deploymentId, String name, String category, InputStream in) {
+        if (! StringUtils.hasText(deploymentId)) {
+            throw new RuntimeException("璇ユ祦绋嬬涓�娆¢儴缃诧紝璇风洿鎺ラ�夋嫨淇濆瓨鎸夐挳");
+        }
+        ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery().deploymentId(deploymentId).singleResult();
+        if (Objects.isNull(processDefinition)) {
+            throw new RuntimeException("娴佺▼瀹氫箟涓嶅瓨鍦�");
+        }
+        // 1.鏇存柊娴佺▼鍥炬暟鎹�
+        flowDeployMapper.updateProcess(in, deploymentId);
+        // 2.娓呴櫎璇ユ祦绋嬬殑缂撳瓨锛屼娇鍏堕噸鏂板姞杞芥柊鐨勬祦绋嬪浘
+        managementService.executeCommand(new RemoveDeploymentCacheCMD(processDefinition.getId()));
+    }
+
     /**
      * 璇诲彇xml
      *
diff --git a/flowable/src/main/resources/mapper/FlowDeployMapper.xml b/flowable/src/main/resources/mapper/FlowDeployMapper.xml
index f1d880a..632bb71 100644
--- a/flowable/src/main/resources/mapper/FlowDeployMapper.xml
+++ b/flowable/src/main/resources/mapper/FlowDeployMapper.xml
@@ -82,4 +82,8 @@
         order by rd.deploy_time_ desc
     </select>
 
+    <update id="updateProcess">
+        UPDATE act_ge_bytearray SET BYTES_ = #{bytes, jdbcType=BLOB} WHERE DEPLOYMENT_ID_ = #{deployId} AND GENERATED_ = 0
+    </update>
+
 </mapper>

--
Gitblit v1.8.0