刘光辉
昨天 bb638871a7fb692d80f1b7a758f991dc0879002c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
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;
    }
}