以下代码支持的版本是activiti5-13
流程设计图画完之后,就要保存,保存会操作两个表,act_re_model和act_ge_bytearray。
保存act_re_model记录
Model modelData = repositoryService.getModel(modelId);//先通过modelId去查找Model记录
//如果没有就创建
if ( modelData == null ){
modelData = repositoryService.newModel();
}
//然后修改属性信息
String processName = "流程名称";
String processkey = "流程Key";
String category = "分类";
String documentation = "流程描述";
// 创建model需要的MetaInfo属性数据
ObjectNode modelObjectNode = objectMapper.createObjectNode();
modelObjectNode.put(ModelDataJsonConstants.MODEL_NAME, processName);
modelObjectNode.put(ModelDataJsonConstants.MODEL_REVISION, 1);// 版本
modelObjectNode.put(ModelDataJsonConstants.MODEL_DESCRIPTION,documentation);
modelData.setMetaInfo(modelObjectNode.toString());// 设置MetaInfo属性数据
modelData.setName(processName);
modelData.setKey(processkey);
modelData.setCategory(category);
// 保存模型
repositoryService.saveModel(modelData);
保存act_ge_bytearray记录
1)保存二进制源xmlString xml = "";//真实的xml格式数据
repositoryService.addModelEditorSource(modelData.getId(),xml.getBytes("UTF-8"));
2)保存流程图片
InputStream in = new ByteArrayInputStream(xml.getBytes("UTF-8"));
InputStreamSource xmlSource = new InputStreamSource(in);
BpmnXMLConverter bpmnXMLConverter = new BpmnXMLConverter();
BpmnModel bpmnModel = bpmnXMLConverter.convertToBpmnModel(
xmlSource, true, false, "UTF-8");
List
highLightedActivities = new ArrayList
();
MyDefaultProcessDiagramGenerator defaultProcessDiagramGenerator = new MyDefaultProcessDiagramGenerator();
InputStream is = defaultProcessDiagramGenerator.generateDiagram(
bpmnModel, "png", highLightedActivities);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
try {
byte[] buff = new byte[1024];
while ((is.read(buff)) != -1) {
baos.write(buff);
}
byte[] result = baos.toByteArray();
// 添加图片源
this.repositoryService.addModelEditorSourceExtra(
modelData.getId(), result);
} catch (IOException e) {
message = "流程图创建失败!";
e.printStackTrace();
}
因为此代码用的activiti版本是5-13,而图片生成是用5-22版本,需要将activiti-image-generator-5.22.0.jar导入5-13工程,本来图片生成包是独立的,但其中有些方法改动了,所以下面自定义一个图片生成类,集成DefaultProcessDiagramGenerator,代码如下:
import java.io.InputStream;
import java.util.Collections;
import java.util.List;
import org.activiti.bpmn.model.Artifact;
import org.activiti.bpmn.model.BpmnModel;
import org.activiti.bpmn.model.FlowNode;
import org.activiti.bpmn.model.GraphicInfo;
import org.activiti.bpmn.model.Lane;
import org.activiti.bpmn.model.Pool;
import org.activiti.bpmn.model.Process;
import org.activiti.bpmn.model.SubProcess;
import org.activiti.image.impl.DefaultProcessDiagramCanvas;
import org.activiti.image.impl.DefaultProcessDiagramGenerator;
/**
* @author 竹子
* 自定义流程图管理器
*/
public class MyDefaultProcessDiagramGenerator extends
DefaultProcessDiagramGenerator {
public InputStream generateDiagram(BpmnModel bpmnModel, String imageType,
List
highLightedActivities, List
highLightedFlows,
String activityFontName, String labelFontName,
String annotationFontName, ClassLoader customClassLoader,
double scaleFactor) {
return generateProcessDiagram(bpmnModel, imageType,
highLightedActivities, highLightedFlows, activityFontName,
labelFontName, annotationFontName, customClassLoader,
scaleFactor).generateImage(imageType);
}
public InputStream generateDiagram(BpmnModel bpmnModel, String imageType,
List
highLightedActivities) {
return generateDiagram(bpmnModel, imageType, highLightedActivities,
Collections.
emptyList());
}
public InputStream generateDiagram(BpmnModel bpmnModel, String imageType,
List
highLightedActivities, List
highLightedFlows) { return generateDiagram(bpmnModel, imageType, highLightedActivities, highLightedFlows, null, null, null, null, 1.0); } protected DefaultProcessDiagramCanvas generateProcessDiagram( BpmnModel bpmnModel, String imageType, List
highLightedActivities, List
highLightedFlows, String activityFontName, String labelFontName, String annotationFontName, ClassLoader customClassLoader, double scaleFactor) { prepareBpmnModel(bpmnModel); DefaultProcessDiagramCanvas processDiagramCanvas = initProcessDiagramCanvas( bpmnModel, imageType, activityFontName, labelFontName, annotationFontName, customClassLoader); // Draw pool shape, if process is participant in collaboration for (Pool pool : bpmnModel.getPools()) { GraphicInfo graphicInfo = bpmnModel.getGraphicInfo(pool.getId()); processDiagramCanvas.drawPoolOrLane(pool.getName(), graphicInfo); } // Draw lanes for (Process process : bpmnModel.getProcesses()) { for (Lane lane : process.getLanes()) { GraphicInfo graphicInfo = bpmnModel .getGraphicInfo(lane.getId()); processDiagramCanvas .drawPoolOrLane(lane.getName(), graphicInfo); } } // Draw activities and their sequence-flows for (Process process : bpmnModel.getProcesses()) { for (FlowNode flowNode : process .findFlowElementsOfType(FlowNode.class)) { drawActivity(processDiagramCanvas, bpmnModel, flowNode, highLightedActivities, highLightedFlows, scaleFactor); } } // Draw artifacts for (Process process : bpmnModel.getProcesses()) { for (Artifact artifact : process.getArtifacts()) { drawArtifact(processDiagramCanvas, bpmnModel, artifact); } List
subProcesses = process.findFlowElementsOfType( SubProcess.class); if (subProcesses != null) { for (SubProcess subProcess : subProcesses) { for (Artifact subProcessArtifact : subProcess .getArtifacts()) { drawArtifact(processDiagramCanvas, bpmnModel, subProcessArtifact); } } } } return processDiagramCanvas; } }