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 listDefinition() { List definitions = repositoryService.createProcessDefinitionQuery().list(); List 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 getStructure(String deploymentId) { List vos = new ArrayList<>(); ProcessDefinition definition = repositoryService.createProcessDefinitionQuery().deploymentId(deploymentId).singleResult(); if (null != definition) { Process process = repositoryService.getBpmnModel(definition.getId()).getProcesses().get(0); Collection 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; } }