activiti绘制流程图,线上显示文字,审批过的节点添加审批人的名字

最有时间优化了一下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
  • 0
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 9
    评论
Spring Boot是一个开源的Java开发框架,旨在简化Spring应用程序的开发过程。Activiti是一个开源的工作流和业务流程管理系统,它提供了一个用于设计、执行和监控业务流程的平台。 Spring Boot整合Activiti可以实现流程审批功能。首先,我们需要在pom.xml文件中添加Activiti的依赖。然后,在Spring Boot的配置文件中配置Activiti的相关信息,比如数据库连接、流程定义文件的位置等。 接下来,我们可以定义流程模型,包括流程节点、流程线等。可以使用Activiti提供的图形化工具Activiti Modeler进行可视化设计。然后,将流程模型部署到Activiti引擎。 在代码中,我们可以使用Activiti提供的API来启动流程实例、查询任务、完成任务等。通过编写监听器,我们可以在流程的不同节点上执行自定义的业务逻辑。 为了方便用户对流程的审批操作,我们可以使用Activiti提供的表单功能。通过表单,用户可以填写审批意见、上传附件等。在代码中,我们可以通过获取表单数据来实现流程的控制逻辑。 最后,我们可以使用Activiti提供的监控功能来查看流程的状态和执行情况。Activiti提供了一个可视化的流程监控控制台,可以实时查看流程实例、任务、历史记录等信息。 综上所述,通过Spring Boot整合Activiti,我们可以实现流程审批功能。这使得流程管理更加简单高效,提高了审批流程的可追溯性和可控性。同时,使用Spring Boot的优势,我们可以更加便捷地进行开发和部署。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值