activiti7的流程图、模板图及子流程图展示

流程图需展示流程完成情况,模板图根据key找到最新模板展示。子流程需从主流程中找到CallActiviti的节点,找到对应的子流程id(已启动)或模板key(未启动),再进行对应的流程或模板展示。

//根据流程id 展示流程图
private void outPutImageByInstanceId(String instanceId,HttpServletResponse response){
if(StringUtils.isEmpty(instanceId)){
LOG.info(“流程id为空!”);
return;
}
LOG.info(“查看完整流程图!流程实例ID:{}”, instanceId);
// 获取流程实例(id查询只能查到单独的记录,如果是其他条件,此处需换为list)
HistoricProcessInstance processInstance = historyService.createHistoricProcessInstanceQuery().processInstanceId(instanceId).singleResult();
if (processInstance == null) {
LOG.error(“流程实例ID:{}没查询到流程实例!”, instanceId);
return;
}
// 根据流程对象获取流程对象模型
BpmnModel bpmnModel = repositoryService.getBpmnModel(processInstance.getProcessDefinitionId());

    // 构造历史流程查询HistoricActivityInstanceQuery historyInstanceQuery = historyService.createHistoricActivityInstanceQuery().processInstanceId(instanceId);// 查询历史节点List<HistoricActivityInstance> historicActivityInstanceList = historyInstanceQuery.orderByHistoricActivityInstanceStartTime().asc().list();if (historicActivityInstanceList == null || historicActivityInstanceList.size() == 0) {LOG.info("流程实例ID:{}没有历史节点信息!", instanceId);outPutImg(response, bpmnModel, null, null);return;}// 已执行的节点ID集合(将historicActivityInstanceList中元素的activityId字段取出封装到executedActivityIdList)List<String> executedActivityIdList = historicActivityInstanceList.stream().map(item -> item.getActivityId()).collect(Collectors.toList());// 获取流程定义ProcessDefinitionEntity processDefinition = (ProcessDefinitionEntity) ((RepositoryServiceImpl) repositoryService).getDeployedProcessDefinition(processInstance.getProcessDefinitionId());//获取流程线List<String> flowIds = ActivitiUtils.getHighLightedFlows(bpmnModel, processDefinition, historicActivityInstanceList);//输出图像outPutImg(response, bpmnModel, flowIds, executedActivityIdList);
}

//展示模板图(根据流程定义key展示最新的模板图,此处也可以换为根据模板key展示最新模板图)
public void showImgTemplate(String processDefinitonKey, HttpServletResponse response) {
if (StringUtils.isEmpty(processDefinitonKey)) return;
//根据key查询最新的流程定义
List list = repositoryService.createProcessDefinitionQuery().processDefinitionKey(processDefinitonKey).latestVersion().list();
if(ListUtils.isEmpty(list)){
LOG.error(“流程定义Key:{}没查询到流程定义!”, processDefinitonKey);
return;
}
// 根据流程对象获取流程对象模型
BpmnModel bpmnModel = repositoryService.getBpmnModel(list.get(0).getId());
//输出图像
outPutImg(response, bpmnModel, null, null);
}

//图像输出(图像均为svg格式,activiti7如何指定图像格式,还待完善)
private void outPutImg(HttpServletResponse response, BpmnModel bpmnModel, List flowIds, List executedActivityIdList) {
InputStream imageStream = null;
try {
if(null == flowIds && null ==executedActivityIdList){
imageStream = processDiagramGenerator.generateDiagram(bpmnModel,“宋体”, “微软雅黑”, “黑体”);
}else{
imageStream = processDiagramGenerator.generateDiagram(bpmnModel, executedActivityIdList, flowIds,
“宋体”, “微软雅黑”, “黑体”, true, “png”);
}
// 输出资源内容到相应对象
byte[] b = new byte[1024];
int len;
while ((len = imageStream.read(b, 0, 1024)) != -1) {
response.getOutputStream().write(b, 0, len);
}
response.getOutputStream().flush();
response.setContentType(“image/png”);
} catch (Exception e) {
LOG.error(“流程图输出异常!”, e);
} finally { // 流关闭
if (null != imageStream) {
try {
imageStream.close();
} catch (IOException e) {
LOG.error(“流程图输入流关闭异常!”, e);
imageStream = null;
}
}
}
}

//查询流程图节点信息(可根据节点的位置信息,定位图中每个节点位置。添加相应的前端事件,展示节点信息。也可以根据其中callActiviti的节点,找到子流程的流程id或key,用于展示子流程图)
public List getImgNode(String instanceId ) {
String instanceId = inst.getInstanceId();
LOG.info(“查看完整流程图!流程实例ID:{}”, instanceId);
/*
* 获取activiti流程实例
*/
HistoricProcessInstance processInstance = historyService.createHistoricProcessInstanceQuery().processInstanceId(instanceId).singleResult();
if (processInstance == null) {
LOG.info(“流程实例ID:{}没查询到流程实例!”, instanceId);
result.setDetail(“activiti流程实例查询为空”);
return result;
}
// 根据流程对象获取流程对象模型
BpmnModel bpmnModel = repositoryService.getBpmnModel(processInstance.getProcessDefinitionId());
List nodeList = getNodeByModel(bpmnModel,inst.getTemplateId(),inst,null);
return nodeList ;
}

//根据BpmnModel查询补充节点信息
public List getNodeByModel(BpmnModel bpmnModel,String templateId) {
List nodeList = new ArrayList<>();
List<org.activiti.bpmn.model.Process> ps = bpmnModel.getProcesses();
if (ps != null && ps.size() > 0) {
for (Process process : ps) {
Collection elements = process.getFlowElements();
if (elements != null && elements.size() > 0) {
for (FlowElement el : elements) {
try{
if (el instanceof UserTask) {
BpmImageNode bpmNode = new BpmImageNode();
bpmNode.setType(“UserTask”);
UserTask ut = (UserTask) el;
GraphicInfo artifactGraphicInfo = bpmnModel.getGraphicInfo(ut.getId());//id为baseElement的id
if (artifactGraphicInfo != null) {
bpmNode.setX(artifactGraphicInfo.getX());
bpmNode.setY(artifactGraphicInfo.getY());
bpmNode.setWidth(artifactGraphicInfo.getWidth());
bpmNode.setHeight(artifactGraphicInfo.getHeight());
}
//TODO 此处根据自己的需要完善逻辑
//可补充任务提交信息,任务表单信息等节点信息
nodeList.add(bpmNode);
}else if(el instanceof CallActivity){
CallActivity ut = (CallActivity) el;
String processDefinitonKey = ((CallActivityBehavior)(ut.getBehavior())).getProcessDefinitonKey();
BpmImageNode bpmNode = new BpmImageNode();
bpmNode.setType(“CallActivity”);
List wfInstanceChildList = null;
//TODO WfInstanceChild是自己系统保存的流程信息,此处根据自己项目需要完善
if(ListUtils.isEmpty(wfInstanceChildList)){
//子流程未开始
bpmNode.setTemplateKey(processDefinitonKey);
}else{
//子流程已开始
List instanceIds = new ArrayList<>();
//TODO 此处可根据自己的项目来查询子流程的Id
bpmNode.setInstanceIds(instanceIds);
}
GraphicInfo artifactGraphicInfo = bpmnModel.getGraphicInfo(ut.getId());//id为baseElement的id
if (artifactGraphicInfo != null) {
bpmNode.setX(artifactGraphicInfo.getX());
bpmNode.setY(artifactGraphicInfo.getY());
bpmNode.setWidth(artifactGraphicInfo.getWidth());
bpmNode.setHeight(artifactGraphicInfo.getHeight());
}
nodeList.add(bpmNode);
}
}catch(Exception e){
LOG.error(e.getMessage(),e);
}
}
}
}
}
return nodeList;
}

activiti7的流程图、模板图及子流程图展示相关推荐

  1. cp 过程流程图模板_19张必备流程图,收藏

    19张必备流程图,原来别人家的公司是这么"转"起来的,供参考. 1.质量管理体系要求 (点击图片放大后查阅) 2.业务计划过程流程图 (点击图片放大后查阅) 3.持续改进过程流程图 ...

  2. 原料采购流程图模板分享

    不管是服装业还是任何厂商都要保证原料的正常供应,那在之前要做的步骤就是对原料进行采购,确保原料的正常供应,那在采购原料时要经过哪些操作步骤呢?具体是什流程呢?下面是分享的原料采购流程图模板,需要使用的 ...

  3. 学校食堂工作流程图流程图模板分享

    学校食堂里面的工作是比较严谨的,所以对任何事情的要求就会比较高,那在学校食堂里面工作有哪些流程呢?下面是分享的食堂工作流程图模板,想要了解新知识的朋友可以进行了解. 学校食堂工作流程图-迅捷流程图 模 ...

  4. 组织结构流程图模板分享 教你快速绘制流程图

    组织结构流程图适用的场合很多,但是常见的还是用在公司中对人事的变动以及工作的安排进行统计,这样方便一个企业进行更好的管理,下面为大家分享几款组织结构流程图的绘制方法,希望可以帮助到大家. 模板来源:迅 ...

  5. 电商运营流程图模板分享,附赠绘制流程图方法

    在电商行业中要掌握的技巧能力也是较多的,要熟悉在这个过程的任何一项操作,对产品规划与设计,推广以及引流等渠道都要进行熟悉,对于繁杂的过程可以使用流程图对其进行图表展示,具体怎样操作呢?下面为大家分享电 ...

  6. 跨境电商运营流程图模板分享以及怎样绘制该流程图方法介绍

    电商行业也有很多分类,不同的分类里面从事着不同的工作,那具体是怎样操作的呢?我们想要对整个跨境电商进行深入的了解就需要借助流程图进行了解使用,下面是分享的两款跨境电商流程图模板以及怎样绘制该流程图的简 ...

  7. 业务流程图模板分享及绘制方法总结

    业务流程图是一种描述管理系统内各单位与人员之间关系的流程图,在工作中使用的比较多,带来的帮助很大,那业务流程图要怎样绘制呢?下面是分享的业务流程图模板以及绘制该流程图的操作方法介绍,希望可以帮助到大家 ...

  8. 精品思维导图,流程图模板分享

    大家在平时的日常办公中是不是市场发现有时候做一件事,明明有了想法,有了思路,可到实行的时候却忘记了呢?这时好我们该怎么办呢?细心的朋友肯定会将想法与思路用思维导图进行梳理,这样实行起来就更有条理,便于 ...

  9. 思维导图,流程图模板整合

    思维导图与流程图在工作中都是经常使用的,出现频率较高的,有些不会绘制的或者是刚接触这一类的图表形式的都会选择使用模板来完成工作,但是很多朋友却不知道模板在×××,今天要给大家分享的是几款孩子走精美的思 ...

  10. 分享漂亮有创意的思维导图,流程图模板

    绘制思维的检测标准是从其框架的搭建以及内容的填充,这两者对思维导图是至关重要的,但是画一张好看的思维导图不容易,但是在网络中看到很多绘制好看的思维导图不仅由衷欣赏,不仅感叹是如何进行绘制的,下面给大家 ...

最新文章

  1. Android用户界面设计学习之旅-第三站
  2. python123数值运算_python基础篇【第二篇】:数据运算、数据类型
  3. java 线程 while循环_java多线程中while循环的问题
  4. Android进度条函数,Android实用笔记——使用ProgressBar实现进度条
  5. toj 4612 A Shooting Game
  6. (三)构建dubbo分布式平台-maven模块规划
  7. java.lang.NoClassDefFoundError: org/apache/commons/collections/map/LRUMap 解决方法
  8. 问题记录:EntityFramework 一对一关系映射
  9. AJAX POST跨域 解决方案 - CORS(转载)
  10. Java关键字与保留字
  11. DW2019HTML中没有文本对象,Dreamweaver CC2019文字或图片添加空连接方法
  12. 使用Origin绘制柱状图(入门)
  13. 升级mac系统正在计算机,苹果笔记本系统升级_苹果电脑Mac系统怎么升级
  14. CSDN云IDE怎样克隆代码
  15. Machine Learning in Action -- AdaBoost
  16. 基于单幅图像的2D转3D算法研究
  17. 斗地主不算花色算大小王,起初发到的17张牌有多少种?
  18. 让PhalApi返回的Json支持中文并且自带格式
  19. 保研联系导师邮件模板
  20. 开篇 | 想成为技术牛人?先搞定网络协议!

热门文章

  1. 办公室电脑里的文件和家里电脑的文件同步,有什么便签软件可以实现
  2. 解决mac上复制粘贴失效问题
  3. 国内外常用的MD5在线解密网站
  4. ES安装以及基本应用
  5. 网易公开课中英字幕文件合并代码
  6. 推荐几款不错的企业网站,前端设计师寻求设计灵感!
  7. RTKLIB源码之单点定位/相对定位后处理简化版—第一版
  8. 【Paper reading】可变剪接预测ENCODEC数据集
  9. a4的尺寸大小转换为像素
  10. 微信公众号跳转小程序,详细教程