From 34981c30a78e8bbd7791131059a9210f9928b62c Mon Sep 17 00:00:00 2001
From: 刘光辉 <347230014@qq.com>
Date: 星期四, 17 九月 2026 09:24:09 +0800
Subject: [PATCH] Merge remote-tracking branch 'origin/master' into master

---
 jnpf-flow-engine/src/main/java/jnpf/workflow/flowable/service/DefinitionServiceImpl.java |  122 ++++++++++++++++++++++++++++++++++++++++
 1 files changed, 122 insertions(+), 0 deletions(-)

diff --git a/jnpf-flow-engine/src/main/java/jnpf/workflow/flowable/service/DefinitionServiceImpl.java b/jnpf-flow-engine/src/main/java/jnpf/workflow/flowable/service/DefinitionServiceImpl.java
new file mode 100644
index 0000000..7371532
--- /dev/null
+++ b/jnpf-flow-engine/src/main/java/jnpf/workflow/flowable/service/DefinitionServiceImpl.java
@@ -0,0 +1,122 @@
+package jnpf.workflow.flowable.service;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+import java.util.stream.Collectors;
+
+import org.flowable.bpmn.model.Activity;
+import org.flowable.bpmn.model.BaseElement;
+import org.flowable.bpmn.model.Event;
+import org.flowable.bpmn.model.FlowElement;
+import org.flowable.bpmn.model.Gateway;
+import org.flowable.bpmn.model.Process;
+import org.flowable.engine.RepositoryService;
+import org.flowable.engine.repository.Deployment;
+import org.flowable.engine.repository.ProcessDefinition;
+import org.springframework.stereotype.Service;
+
+import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.core.collection.CollectionUtil;
+import cn.hutool.core.util.IdUtil;
+import cn.hutool.core.util.StrUtil;
+import jnpf.workflow.common.exception.BizException;
+import jnpf.workflow.common.exception.ResultCode;
+import jnpf.workflow.common.model.fo.DefinitionDeleteFo;
+import jnpf.workflow.common.model.fo.DefinitionDeployFo;
+import jnpf.workflow.common.model.vo.DefinitionVo;
+import jnpf.workflow.common.model.vo.DeploymentVo;
+import jnpf.workflow.common.model.vo.FlowElementVo;
+import jnpf.workflow.common.service.IDefinitionService;
+import jnpf.workflow.flowable.util.FlowableUtil;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+
+@Slf4j
+@Service
+@RequiredArgsConstructor
+public class DefinitionServiceImpl implements IDefinitionService {
+
+    private final RepositoryService repositoryService;
+
+    @Override
+    public DeploymentVo deployDefinition(DefinitionDeployFo fo) {
+        Deployment deployment;
+        try {
+            String resourceName = StrUtil.isNotBlank(fo.getKey()) ? fo.getKey() : IdUtil.getSnowflakeNextIdStr();
+            deployment = repositoryService.createDeployment()
+                    .name(fo.getName())
+                    .key(fo.getKey())
+                    .addString(resourceName + ".bpmn20.xml", fo.getBpmnXml())
+                    .disableSchemaValidation()
+                    .deploy();
+        } catch (Exception e) {
+            throw new BizException(ResultCode.DEPLOY_ERROR.getMsg(), e);
+        }
+        DeploymentVo vo = new DeploymentVo();
+        vo.setDeploymentId(deployment.getId());
+        return vo;
+    }
+
+    @Override
+    public List<DefinitionVo> listDefinition() {
+        List<ProcessDefinition> definitions = repositoryService.createProcessDefinitionQuery().list();
+        List<DefinitionVo> list = new ArrayList<>();
+        if (CollectionUtil.isNotEmpty(definitions)) {
+            for (ProcessDefinition definition : definitions) {
+                DefinitionVo vo = new DefinitionVo();
+                vo.setDefinitionId(definition.getId());
+                vo.setDefinitionName(definition.getName());
+                vo.setDefinitionKey(definition.getKey());
+                vo.setDefinitionVersion(definition.getVersion());
+                vo.setDeploymentId(definition.getDeploymentId());
+                list.add(vo);
+            }
+        }
+        return list;
+    }
+
+    @Override
+    public boolean deleteDefinition(DefinitionDeleteFo fo) {
+        if (null == fo.getCascade()) {
+            fo.setCascade(true);
+        }
+        try {
+            repositoryService.deleteDeployment(fo.getDeploymentId(), fo.getCascade());
+            return true;
+        } catch (Exception e) {
+            log.error(ResultCode.DELETE_FAILURE.getMsg(), e);
+            return false;
+        }
+    }
+
+    @Override
+    public List<FlowElementVo> getStructure(String deploymentId) {
+        List<FlowElementVo> vos = new ArrayList<>();
+        ProcessDefinition definition = repositoryService.createProcessDefinitionQuery().deploymentId(deploymentId).singleResult();
+        if (null != definition) {
+            Process process = repositoryService.getBpmnModel(definition.getId()).getProcesses().get(0);
+            Collection<FlowElement> elements = FlowableUtil.getAllElements(process.getFlowElements(), null);
+            for (FlowElement element : elements) {
+                FlowElementVo vo = BeanUtil.copyProperties(element, FlowElementVo.class);
+                if (element instanceof Event) {
+                    Event el = (Event) element;
+                    vo.setIncomingList(el.getIncomingFlows().stream().map(BaseElement::getId).collect(Collectors.toList()));
+                    vo.setOutgoingList(el.getOutgoingFlows().stream().map(BaseElement::getId).collect(Collectors.toList()));
+                }
+                if (element instanceof Activity) {
+                    Activity el = (Activity) element;
+                    vo.setIncomingList(el.getIncomingFlows().stream().map(BaseElement::getId).collect(Collectors.toList()));
+                    vo.setOutgoingList(el.getOutgoingFlows().stream().map(BaseElement::getId).collect(Collectors.toList()));
+                }
+                if (element instanceof Gateway) {
+                    Gateway el = (Gateway) element;
+                    vo.setIncomingList(el.getIncomingFlows().stream().map(BaseElement::getId).collect(Collectors.toList()));
+                    vo.setOutgoingList(el.getOutgoingFlows().stream().map(BaseElement::getId).collect(Collectors.toList()));
+                }
+                vos.add(vo);
+            }
+        }
+        return vos;
+    }
+}

--
Gitblit v1.8.0