最有时间优化了一下activiti的绘制图片工具类,主要用于在领导审批的时候展示的漂亮,直接上代码吧,
/** 放在我们的业务代码中,穿个流程实例id进来,返回一个字符数组,然后该怎么处理你们应该知道怎么做了吧
*/
public byte[] getImage(String processInstanceId) throws ServiceRuntimeException
{
try
{
// 获取历史流程实例
HistoricProcessInstance historicProcessInstance = historyService.createHistoricProcessInstanceQuery()
.processInstanceId(processInstanceId).singleResult();
if (historicProcessInstance != null)
{
// 获取流程定义
ProcessDefinitionEntity processDefinition = (ProcessDefinitionEntity) ((RepositoryServiceImpl) repositoryService)
.getDeployedProcessDefinition(historicProcessInstance.getProcessDefinitionId());
List<HistoricActivityInstance> historicActivityInstanceList = historyService
.createHistoricActivityInstanceQuery().processInstanceId(processInstanceId).orderByHistoricActivityInstanceStartTime().asc().list();
// 已执行的节点ID集合
List<String> executedActivityIdList = new ArrayList<String>();
int index = 1;
for (HistoricActivityInstance activityInstance : historicActivityInstanceList)
{
executedActivityIdList.add(activityInstance.getActivityId());
index++;
}
// 获取流程图图像字符流
InputStream imageStream = ProcessDiagramGenerator.generateDiagram(processDefinition, "png", executedActivityIdList,processInstanceId);
ByteArrayOutputStream outStream = new ByteArrayOutputStream();
byte[] buffer = new byte[1024];
int len = -1;
while((len = imageStream.read(buffer)) != -1){
outStream.write(buffer, 0, len);
}
outStream.close();
imageStream.close();
return outStream.toByteArray();
}
return null;
}
catch (Exception e)
{
throw new RuntimeException("获取流程图失败!" + e.getMessage());
}
}
剩下的就是两个绘制流程图的工具类,直接复制就可以了
/* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package *
import com.cfne.cuckoo.oa.domain.entity.category.FlowCategoryEntity;
import com.cfne.cuckoo.oa.service.category.FlowCategoryService;
import com.cfne.cuckoo.oa.service.flow.history.ActHiProcinstExtService;
import com.cfne.cuckoo.oa.service.flow.history.ActHiTaskinstService;
import com.cfne.cuckoo.oa.service.flow.running.ActRuTaskService;
import com.cfne.cuckoo.oa.utils.SpringUtil;
import jdk.nashorn.internal.runtime.ECMAException;
import org.activiti.bpmn.model.*;
import org.activiti.bpmn.model.Process;
import org.activiti.engine.impl.bpmn.parser.BpmnParse;
import org.activiti.engine.impl.persistence.entity.ProcessDefinitionEntity;
import org.activiti.engine.impl.pvm.PvmActivity;
import org.activiti.engine.impl.pvm.PvmTransition;
import org.activiti.engine.impl.pvm.process.*;
import org.activiti.engine.impl.pvm.process.Lane;
import org.apache.log4j.Logger;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.web.context.support.WebApplicationContextUtils;
import javax.annotation.*;
import javax.annotation.Resource;
import java.io.InputStream;
import java.util.*;
/**
* 绘制流程工具类
*
*
*/
public class ProcessDiagramGenerator {
static final Logger logger = Logger.getLogger(ProcessDiagramGenerator.class);
protected static final Map<String, ActivityDrawInstruction> activityDrawInstructions = new HashMap<String, ActivityDrawInstruction>();
static {
// start event
activityDrawInstructions.put("startEvent", new ActivityDrawInstruction() {
@Override
public void draw(ProcessDiagramCanvas processDiagramCreator, ActivityImpl activityImpl) {
processDiagramCreator.drawNoneStartEvent(activityImpl.getX(), activityImpl.getY(), activityImpl.getWidth(), activityImpl.getHeight());
}
});
// start timer event
activityDrawInstructions.put("startTimerEvent", new ActivityDrawInstruction() {
@Override
public void draw(ProcessDiagramCanvas processDiagramCreator, ActivityImpl activityImpl) {
processDiagramCreator.drawTimerStartEvent(activityImpl.getX(), activityImpl.getY(), activityImpl.getWidth(), activityImpl.getHeight());
}
});
// signal catch
activityDrawInstructions.put("intermediateSignalCatch", new ActivityDrawInstruction() {
@Override
public void draw(ProcessDiagramCanvas processDiagramCreator, ActivityImpl activityImpl) {
processDiagramCreator.drawCatchingSignalEvent(activityImpl.getX(), activityImpl.getY(), activityImpl.getWidth(),
activityImpl.getHeight());
}
});
// signal throw
activityDrawInstructions.put("intermediateSignalThrow", new ActivityDrawInstruction() {
@Override
public void draw(ProcessDiagramCanvas processDiagramCreator, ActivityImpl activityImpl) {
processDiagramCreator.drawThrowingSignalEvent(activityImpl.getX(), activityImpl.getY(), activityImpl.getWidth(),
activityImpl.getHeight());
}
});
// end event
activityDrawInstructions.put("endEvent", new ActivityDrawInstruction() {
@Override
public void draw(ProcessDiagramCanvas processDiagramCreator, ActivityImpl activityImpl) {
processDiagramCreator.drawNoneEndEvent(activityImpl.getX(), activityImpl.getY(), activityImpl.getWidth(), activityImpl.getHeight());
}
});
// error end event
activityDrawInstructions.put("errorEndEvent", new ActivityDrawInstruction() {
@Override
public void draw(ProcessDiagramCanvas processDiagramCreator, ActivityImpl activityImpl) {
processDiagramCreator.drawErrorEndEvent(activityImpl.getX(), activityImpl.getY(), activityImpl.getWidth(), activityImpl.getHeight());
}
});
// error start event
activityDrawInstructions.put("errorStartEvent", new ActivityDrawInstruction() {
@Override
public void draw(ProcessDiagramCanvas processDiagramCreator, ActivityImpl activityImpl) {
processDiagramCreator.drawErrorStartEvent(activityImpl.getX(), activityImpl.getY(), activityImpl.getWidth(), activityImpl.getHeight());
}
});
// task
activityDrawInstructions.put("task", new ActivityDrawInstruction() {
@Override
public void draw(ProcessDiagramCanvas processDiagramCreator, ActivityImpl activityImpl) {
processDiagramCreator.drawTask((String) activityImpl.getProperty("name"), activityImpl.getX(), activityImpl.getY(),
activityImpl.getWidth(), activityImpl.getHeight());
}
});
// user task
activityDrawInstructions.put("userTask", new ActivityDrawInstruction() {
@Override
public void draw(ProcessDiagramCanvas processDiagramCreator, ActivityImpl activityImpl) {
processDiagramCreator.drawUserTask((String) activityImpl.getProperty("name"), activityImpl.getX(), activityImpl.getY(),
activityImpl.getWidth(), activityImpl.getHeight());
}
});
// script task
activityDrawInstructions.put("scriptTask", new ActivityDrawInstruction() {
@Override
public void draw(ProcessDiagramCanvas processDiagramCreator, ActivityImpl activityImpl) {
processDiagramCreator.drawScriptTask((String) activityImpl.getProperty("name"), activityImpl.getX(), activityImpl.getY(),
activityImpl.getWidth(), activityImpl.getHeight());
}
});
// service task
activityDrawInstructions.put("serviceTask", new ActivityDrawInstruction() {
@Override
public void draw(ProcessDiagramCanvas processDiagramCreator, ActivityImpl activityImpl) {
processDiagramCreator.drawServiceTask((String) activityImpl.getProperty("name"), activityImpl.getX(), activityImpl.getY(),
activityImpl.getWidth(), activityImpl.getHeight());
}
});
// receive task
activityDrawInstructions.put("receiveTask", new ActivityDrawInstruction() {
@Override
public void draw(ProcessDiagramCanvas processDiagramCreator, ActivityImpl activityImpl) {
processDiagramCreator.drawReceiveTask((String) activityImpl.getProperty("name"), activityImpl.getX(), activityImpl.getY(),
activityImpl.getWidth(), activityImpl.getHeight());
}
});
// send task
activityDrawInstructions.put("sendTask", new ActivityDrawInstruction() {
@Override
public void draw(ProcessDiagramCanvas processDiagramCreator, ActivityImpl activityImpl) {
processDiagramCreator.drawSendTask((String) activityImpl.getProperty("name"), activityImpl.getX(), activityImpl.getY(),
activityImpl.getWidth(), activityImpl.getHeight());
}
});
// manual task
activityDrawInstructions.put("manualTask", new ActivityDrawInstruction() {
@Override
public void draw(ProcessDiagramCanvas processDiagramCreator, ActivityImpl activityImpl) {
processDiagramCreator.drawManualTask((String) activityImpl.getProperty("name"), activityImpl.getX(), activityImpl.getY(),
activityImpl.getWidth(), activityImpl.getHeight());
}
});
// businessRuleTask task
activityDrawInstructions.put("businessRuleTask", new ActivityDrawInstruction() {
@Override
public void draw(ProcessDiagramCanvas processDiagramCreator, ActivityImpl activityImpl) {
processDiagramCreator.drawBusinessRuleTask((String) activityImpl.getProperty("name"), activityImpl.getX(), activityImpl.getY(),
activityImpl.getWidth(), activityImpl.getHeight());
}
});
// exclusive gateway
activityDrawInstructions.put("exclusiveGateway", new ActivityDrawInstruction() {
@Override
public void draw(ProcessDiagramCanvas processDiagramCreator, ActivityImpl activityImpl) {
processDiagramCreator.drawExclusiveGateway(activityImpl, activityImpl.getX(), activityImpl.getY(), activityImpl.getWidth(),
activityImpl.getHeight());
}
});
// inclusive gateway
activityDrawInstructions.put("inclusiveGateway", new ActivityDrawInstruction() {
@Override
public void draw(ProcessDiagramCanvas processDiagramCreator, ActivityImpl activityImpl) {
processDiagramCreator.drawInclusiveGateway(activityImpl.getX(), activityImpl.getY(), activityImpl.getWidth(),
activityImpl.getHeight());
}
});
// parallel gateway
activityDrawInstructions.put("parallelGateway", new ActivityDrawInstruction() {
@Override
public void draw(ProcessDiagramCanvas processDiagramCreator, ActivityImpl activityImpl) {
processDiagramCreator.drawParallelGateway(activityImpl.getX(), activityImpl.getY(), activityImpl.getWidth(), activityImpl.getHeight());
}
});
// Boundary timer
activityDrawInstructions.put("boundaryTimer", new ActivityDrawInstruction() {
@Override
public void draw(ProcessDiagramCanvas processDiagramCreator, ActivityImpl activityImpl) {
processDiagramCreator.drawCatchingTimerEvent(activityImpl.getX(), activityImpl.getY(), activityImpl.getWidth(),
activityImpl.getHeight());
}
});
// Boundary catch error
activityDrawInstructions.put("boundaryError", new ActivityDrawInstruction() {
@Override
public void draw(ProcessDiagramCanvas processDiagramCreator, ActivityImpl activityImpl) {
processDiagramCreator.drawCatchingErroEvent(activityImpl.getX(), activityImpl.getY(), activityImpl.getWidth(),
activityImpl.getHeight());
}
});
// Boundary signal event
activityDrawInstructions.put("boundarySignal", new ActivityDrawInstruction() {
@Override
public void draw(ProcessDiagramCanvas processDiagramCreator, ActivityImpl activityImpl) {
processDiagramCreator.drawCatchingSignalEvent(activityImpl.getX(), activityImpl.getY(), activityImpl.getWidth(),
activityImpl.getHeight());
}
});
// timer catch event
activityDrawInstructions.put("intermediateTimer", new ActivityDrawInstruction() {
@Override
public void draw(ProcessDiagramCanvas processDiagramCreator, ActivityImpl activityImpl) {
processDiagramCreator.drawCatchingTimerEvent(activityImpl.getX(), activityImpl.getY(), activityImpl.getWidth(),
activityImpl.getHeight());
}
});
// subprocess
activityDrawInstructions.put("subProcess", new ActivityDrawInstruction() {
@Override
public void draw(ProcessDiagramCanvas processDiagramCreator, ActivityImpl activityImpl) {
Boolean isExpanded = (Boolean) activityImpl.getProperty(BpmnParse.PROPERTYNAME_ISEXPANDED);
Boolean isTriggeredByEvent = (Boolean) activityImpl.getProperty("triggeredByEvent");
if (isTriggeredByEvent == null) {
isTriggeredByEvent = Boolean.TRUE;
}
if (isExpanded != null && isExpanded == false) {
processDiagramCreator.drawCollapsedSubProcess((String) activityImpl.getProperty("name"), activityImpl.getX(),
activityImpl.getY(), activityImpl.getWidth(), activityImpl.getHeight(), isTriggeredByEvent);
} else {
processDiagramCreator.drawExpandedSubProcess((String) activityImpl.getProperty("name"), activityImpl.getX(), activityImpl.getY(),
activityImpl.getWidth(), activityImpl.getHeight(), isTriggeredByEvent);
}
}
});
// call activity
activityDrawInstructions.put("callActivity", new ActivityDrawInstruction() {
@Override
public void draw(ProcessDiagramCanvas processDiagramCreator, ActivityImpl activityImpl) {
processDiagramCreator.drawCollapsedCallActivity((String) activityImpl.getProperty("name"), activityImpl.getX(), activityImpl.getY(),
activityImpl.getWidth(), activityImpl.getHeight());
}
});
}
/**
* Generates a PNG diagram image of the given process definition, using the
* diagram interchange information of the process.
*/
public static InputStream generatePngDiagram(ProcessDefinitionEntity processDefinition,String processInstanceId) throws Exception {
return generateDiagram(processDefinition, "png", Collections.<String>emptyList(),processInstanceId);
}
/**
* Generates a JPG diagram image of the given process definition, using the
* diagram interchange information of the process.
*/
public static InputStream generateJpgDiagram(ProcessDefinitionEntity processDefinition,String processInstanceId) throws Exception{
return generateDiagram(processDefinition, "jpg", Collections.<String>emptyList(),processInstanceId);
}
protected static ProcessDiagramCanvas initProcessDiagramCanvas(ProcessDefinitionEntity processDefinition) {
int minX = Integer.MAX_VALUE;
int maxX = 0;
int minY = Integer.MAX_VALUE;
int maxY = 0;
if (processDefinition.getParticipantProcess() != null) {
ParticipantProcess pProc = processDefinition.getParticipantProcess();
minX = pProc.getX();
maxX = pProc.getX() + pProc.getWidth();
minY = pProc.getY();
maxY = pProc.getY() + pProc.getHeight();
}
for (ActivityImpl activity : processDefinition.getActivities()) {
// width
if (activity.getX() + activity.getWidth() > maxX) {
maxX = activity.getX() + activity.getWidth();
}
if (activity.getX() < minX) {
minX = activity.getX();
}
// height
if (activity.getY() + activity.getHeight() > maxY) {
maxY = activity.getY() + activity.getHeight();
}
if (activity.getY() < minY) {
minY = activity.getY();
}
for (PvmTransition sequenceFlow : activity.getOutgoingTransitions()) {
List<Integer> waypoints = ((TransitionImpl) sequenceFlow).getWaypoints();
for (int i = 0; i < waypoints.size(); i += 2) {
// width
if (waypoints.get(i) > maxX) {
maxX = waypoints.get(i);
}
if (waypoints.get(i) < minX) {
minX = waypoints.get(i);
}
// height
if (waypoints.get(i + 1) > maxY) {
maxY = waypoints.get(i + 1);
}
if (waypoints.get(i + 1) < minY) {
minY = waypoints.get(i + 1);
}
}
}
}
if (processDefinition.getLaneSets() != null && processDefinition.getLaneSets().size() > 0) {
for (LaneSet laneSet : processDefinition.getLaneSets()) {
if (laneSet.getLanes() != null && laneSet.getLanes().size() > 0) {
for (Lane lane : laneSet.getLanes()) {
// width
if (lane.getX() + lane.getWidth() > maxX) {
maxX = lane.getX() + lane.getWidth();
}
if (lane.getX() < minX) {
minX = lane.getX();
}
// height
if (lane.getY() + lane.getHeight() > maxY) {
maxY = lane.getY() + lane.getHe