Activiti学习:(第三篇) 整合Activiti Modeler 流程转化为可编辑模型

1. 背景

    Activiti Modeler有个功能可以将已经部署的流程重新转化为可编辑模型,感觉这个功能还是很有实用价值的,百度后发现没有人整合过,所以自己看了源码,做了整合,下面分享给大家。

2. 代码分享

package com.ssm.service.manager;

import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.node.ObjectNode;
import com.ssm.common.ImpoerModelUtil;
import com.ssm.common.util.layui.LayuiUnit;
import com.ssm.mapper.activiti.manager.ProcessManagerMapper;
import com.ssm.vo.activiti.manager.BaseManagerQueryVo;
import com.ssm.vo.activiti.manager.ProcessDefineModel;
import org.activiti.editor.constants.ModelDataJsonConstants;
import org.activiti.engine.ProcessEngine;
import org.activiti.engine.RepositoryService;
import org.activiti.engine.repository.Model;
import org.apache.commons.lang.StringUtils;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.io.InputStream;
import java.util.List;

@Service
public class ProcessManagerService {
    @Resource
    private ProcessManagerMapper processManagerMapper;
    @Resource
    private RepositoryService repositoryService;
    @Resource
    private ProcessEngine processEngine;
    @Resource
    private ObjectMapper objectMapper;
    @Resource
    private ImpoerModelUtil impoerModelUtil;

    /**
     * 流程转化为可编辑模型
     *
     * @param processDefineModel
     */
    public String changeProcessToModel(ProcessDefineModel processDefineModel) {
        Model modelData = repositoryService.newModel();
        // 初始化Model
        ObjectNode modelObjectNode = objectMapper.createObjectNode();
        modelObjectNode.put(ModelDataJsonConstants.MODEL_NAME, processDefineModel.getName());
        modelObjectNode.put(ModelDataJsonConstants.MODEL_REVISION, 1);
        modelObjectNode.put(ModelDataJsonConstants.MODEL_DESCRIPTION, processDefineModel.getDescription());
        modelData.setMetaInfo(modelObjectNode.toString());
        modelData.setName(processDefineModel.getName());
        modelData.setKey(processDefineModel.getKey());
        // 保存模型
        repositoryService.saveModel(modelData);

        String deploymentId = processDefineModel.getDeploymentId();
        String processDefineResourceName = null;
        // 通过deploymentId取得某个部署的资源的名称
        List<String> resourceNames = processEngine.getRepositoryService().getDeploymentResourceNames(deploymentId);
        if (resourceNames != null && resourceNames.size() > 0) {
            for (String temp : resourceNames) {
                if (temp.indexOf(".xml") > 0) {
                    processDefineResourceName = temp;
                }
            }
        }

        /*
         * 读取资源
         * deploymentId:部署的id
         * resourceName:资源的文件名
         */
        InputStream bpmnStream = processEngine.getRepositoryService()
                .getResourceAsStream(deploymentId, processDefineResourceName);
        impoerModelUtil.creatModelByImpoutStream(bpmnStream, modelData.getId());

        return modelData.getId();

    }

    /**
     * 删除部署流程(单个删除与批量删除)
     *
     * @param deploymentIds :被删除部署流程ID
     * @param deleteFlag    : 是否级联删除,1.true级联删除;2.false非级联删除
     */
    public void deleteProcessDeployments(String deploymentIds, boolean deleteFlag) {
        String[] deploymentIdArray = deploymentIds.split(",");
        for (String deploymentId : deploymentIdArray) {
            if (StringUtils.isNotEmpty(deploymentId)) {
                processEngine.getRepositoryService().deleteDeployment(deploymentId, deleteFlag);
            }
        }
    }

}

 

package com.ssm.common;

import com.fasterxml.jackson.databind.node.ObjectNode;
import org.activiti.bpmn.converter.BpmnXMLConverter;
import org.activiti.bpmn.model.BpmnModel;
import org.activiti.editor.language.json.converter.BpmnJsonConverter;
import org.activiti.engine.RepositoryService;
import org.activiti.explorer.util.XmlUtil;
import org.springframework.stereotype.Component;

import javax.annotation.Resource;
import javax.xml.stream.XMLInputFactory;
import javax.xml.stream.XMLStreamException;
import javax.xml.stream.XMLStreamReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;

@Component
public class ImpoerModelUtil {
    @Resource
    private RepositoryService repositoryService;

    /**
     * 创建Model二进制信息
     * @param bpmnStream
     * @param ModelID
     */
    public void creatModelByImpoutStream(InputStream bpmnStream, String ModelID) {
        XMLInputFactory xif;
        InputStreamReader in = null;
        XMLStreamReader xtr = null;
        try {
            xif = XmlUtil.createSafeXmlInputFactory();
            in = new InputStreamReader(bpmnStream, "UTF-8");
            xtr = xif.createXMLStreamReader(in);
            BpmnModel bpmnModel = (new BpmnXMLConverter()).convertToBpmnModel(xtr);

            ObjectNode modelNode = new BpmnJsonConverter().convertToJson(bpmnModel);
            repositoryService.addModelEditorSource(ModelID, modelNode.toString().getBytes("utf-8"));

        } catch (XMLStreamException e) {
            e.printStackTrace();
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        } finally {
            if (xtr != null) {
                try {
                    xtr.close();
                } catch (XMLStreamException e) {
                    e.printStackTrace();
                }
            }
            if (in != null) {
                try {
                    in.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }

            if (bpmnStream != null) {
                try {
                    bpmnStream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }

        }
    }
}

3. 效果展示

猜你喜欢

转载自blog.csdn.net/u011294519/article/details/81153204