package com.kanq.platform.kqoa.bpmn.web.model.controller;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.servlet.http.HttpServletResponse;
import org.activiti.bpmn.model.BpmnModel;
import org.activiti.engine.HistoryService;
import org.activiti.engine.ProcessEngine;
import org.activiti.engine.ProcessEngineConfiguration;
import org.activiti.engine.ProcessEngines;
import org.activiti.engine.RepositoryService;
import org.activiti.engine.history.HistoricActivityInstance;
import org.activiti.engine.history.HistoricProcessInstance;
import org.activiti.engine.impl.cfg.ProcessEngineConfigurationImpl;
import org.activiti.engine.impl.context.Context;
import org.activiti.engine.impl.persistence.entity.ProcessDefinitionEntity;
import org.activiti.engine.impl.pvm.PvmTransition;
import org.activiti.engine.impl.pvm.process.ActivityImpl;
import org.activiti.engine.repository.Deployment;
import org.activiti.engine.runtime.ProcessInstance;
import org.activiti.engine.task.Task;
import org.activiti.image.ProcessDiagramGenerator;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import com.kanq.platform.basis.common.base.web.controller.BaseViewController;
import com.kanq.platform.kqoa.bpmn.util.ActivitiTools;
/**
* 直线型流程、选择性流程 示例
* @author wgy
*/
@RestController
@RequestMapping("kqoa/bpmn/test")
public class TestModelController implements BaseViewController {
//工具类
ActivitiTools activitiTools = ActivitiTools.getInstance();
//属性定义
private ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
private ProcessEngineConfiguration processEngineConfiguration = processEngine.getProcessEngineConfiguration();
private RepositoryService repositoryService = processEngine.getRepositoryService();
private HistoryService historyService = processEngine.getHistoryService();
//直线型流程
static final String BPMN_SQ_COMMON0 = "bpmnSqCommon0";
static final String BPMN_COMMON0 = "bpmnCommon0";
//选择流程
static final String BPMN_SQ_COMMON = "bpmnSqCommon";
static final String BPMN_COMMON = "bpmnCommon";
/**
* http://localhost:8080/platform/kqoa/bpmn/test/bpmnSqCommon.do
* 获取启动流程实例的id信息
* 选择型流程图,显示申请环节
* @param response
* @throws Exception
*/
@RequestMapping(BPMN_SQ_COMMON)
public void bpmnSqCommon(HttpServletResponse response) throws Exception {
//创建一个部署对象
String BPMN_XML = "diagrams/jypt/common.bpmn";
String BPMN_PNG = "diagrams/jypt/common.png";
Deployment deployment = activitiTools.createDeployByResources("common", BPMN_XML,BPMN_PNG);
System.out.println(deployment.getId()+":"+deployment.getName());
//启动流程实例
String processDefinitionKey = "common";
ProcessInstance processInstance_start = activitiTools.startProcess(processDefinitionKey);
String processDefinitionId=processInstance_start.getProcessDefinitionId();
String processInstanceId=processInstance_start.getId();
//流程图展示
this.getTx(processInstanceId, processDefinitionId, response);
System.out.println("processInstanceId:"+processInstanceId);
System.out.println("processDefinitionId:"+processDefinitionId);
}
/**
* http://localhost:8080/platform/kqoa/bpmn/test/bpmnCommon.do?processInstanceId=75038&processDefinitionId=common:8:75037 //processInstanceId、processDefinitionId者两个id信息是来至于启动流程实例反馈的信息,一直执行就能看到不同环节效果。
* 完成当前流程环节任务
* 选择型流程图,显示到下一环节
* @param processInstanceId
* @param processDefinitionId
* @param response
* @throws Exception
*/
@RequestMapping(BPMN_COMMON)
public void bpmnCommon(String processInstanceId,String processDefinitionId, HttpServletResponse response) throws Exception {
//通过taskid完成任务
Task task = activitiTools.findTaskByProcess(processInstanceId).singleResult();//通过流程id查询运行时任务详情
Map<String, Object> variables = new HashMap<String, Object>();
if(task.getName().equals("受理")){
variables.put("pageType", "hs");//会审环节
// variables.put("pageType", "fs");//复审环节
}
activitiTools.completeTaskAndVariable(task.getId(), variables);//完成任务,并指向下一个环节(下一环节的指向在variables设置,variables的值是在流程线上Main config condition处理的)
//流程图展示
this.getTx(processInstanceId, processDefinitionId, response);
}
/**
* http://localhost:8080/platform//kqoa/bpmn/test/bpmnSqCommon0.do
* 获取启动流程实例的id信息
* 直线型流程图,显示申请环节
* @param response
* @throws Exception
*/
@RequestMapping(BPMN_SQ_COMMON0)
public void bpmnSqCommon0(HttpServletResponse response) throws Exception {
//创建一个部署对象
String BPMN_XML = "diagrams/jypt/common0.bpmn";
String BPMN_PNG = "diagrams/jypt/common0.png";
Deployment deployment = activitiTools.createDeployByResources("common0", BPMN_XML,BPMN_PNG);
System.out.println(deployment.getId()+":"+deployment.getName());
//启动流程实例
String processDefinitionKey = "common0";
ProcessInstance processInstance_start = activitiTools.startProcess(processDefinitionKey);
String processDefinitionId=processInstance_start.getProcessDefinitionId();
String processInstanceId=processInstance_start.getId();
//流程图展示
this.getTx(processInstanceId, processDefinitionId, response);
System.out.println("processInstanceId:"+processInstanceId);
System.out.println("processDefinitionId:"+processDefinitionId);
}
/**
* http://localhost:8080/platform//kqoa/bpmn/test/bpmnCommon0.do?processInstanceId=72505&processDefinitionId=common0:28:7250 //一直执行会看到不同任务的效果,id信息是启动流程实例反馈的信息。
* 完成当前流程环节任务
* 直线型流程图,显示到下一环节任务
* @param processInstanceId
* @param processDefinitionId
* @param response
* @throws Exception
*/
@RequestMapping(BPMN_COMMON0)
public void bpmnCommon0(String processInstanceId,String processDefinitionId, HttpServletResponse response) throws Exception {
//通过taskid完成任务
Task task = activitiTools.findTaskByProcess(processInstanceId).singleResult();//通过流程id查询运行时任务详情
activitiTools.completeTask(task.getId());
//流程图展示
this.getTx(processInstanceId, processDefinitionId, response);
}
/**
* 获取图形
* @param processInstanceId
* @param processDefinitionId
* @param response
* @throws IOException
*/
public void getTx(String processInstanceId,String processDefinitionId,HttpServletResponse response) throws IOException{
//获取历史流程实例
HistoricProcessInstance processInstance_history = historyService.createHistoricProcessInstanceQuery().processInstanceId(processInstanceId).singleResult();
//获取流程图
BpmnModel bpmnModel = repositoryService.getBpmnModel(processInstance_history.getProcessDefinitionId());//流程图信息
processEngineConfiguration = processEngine.getProcessEngineConfiguration(); //流程引擎
Context.setProcessEngineConfiguration((ProcessEngineConfigurationImpl) processEngineConfiguration);
ProcessDefinitionEntity definitionEntity = (ProcessDefinitionEntity)repositoryService.getProcessDefinition(processDefinitionId);
List<HistoricActivityInstance> highLightedActivitList = historyService.createHistoricActivityInstanceQuery().processInstanceId(processInstanceId).list();
List<String> highLightedFlows = getHighLightedFlows(definitionEntity,highLightedActivitList); //高亮线路id集合
List<String> highLightedActivitis = new ArrayList<String>(); //高亮环节id集合
for(HistoricActivityInstance tempActivity : highLightedActivitList){
String activityId = tempActivity.getActivityId();
highLightedActivitis.add(activityId);
}
ProcessDiagramGenerator diagramGenerator = processEngineConfiguration.getProcessDiagramGenerator();
InputStream imageStream = diagramGenerator.generateDiagram(bpmnModel, "png", highLightedActivitis,highLightedFlows,"宋体","宋体",null,null, 2.0);
byte[] b = new byte[1024];
int len;
while ((len = imageStream.read(b, 0, 1024)) != -1) {
response.getOutputStream().write(b, 0, len);//输出流程图
}
}
/**
* 获取需要高亮的线
* @param processDefinitionEntity
* @param historicActivityInstances
* @return
*/
private List<String> getHighLightedFlows(
ProcessDefinitionEntity processDefinitionEntity,
List<HistoricActivityInstance> historicActivityInstances) {
List<String> highFlows = new ArrayList<String>();// 用以保存高亮的线flowId
for (int i = 0; i < historicActivityInstances.size() - 1; i++) {// 对历史流程节点进行遍历
ActivityImpl activityImpl = processDefinitionEntity
.findActivity(historicActivityInstances.get(i)
.getActivityId());// 得到节点定义的详细信息
List<ActivityImpl> sameStartTimeNodes = new ArrayList<ActivityImpl>();// 用以保存后需开始时间相同的节点
ActivityImpl sameActivityImpl1 = processDefinitionEntity
.findActivity(historicActivityInstances.get(i + 1)
.getActivityId());
// 将后面第一个节点放在时间相同节点的集合里
sameStartTimeNodes.add(sameActivityImpl1);
for (int j = i + 1; j < historicActivityInstances.size() - 1; j++) {
HistoricActivityInstance activityImpl1 = historicActivityInstances
.get(j);// 后续第一个节点
HistoricActivityInstance activityImpl2 = historicActivityInstances
.get(j + 1);// 后续第二个节点
if (activityImpl1.getStartTime().equals(
activityImpl2.getStartTime())) {
// 如果第一个节点和第二个节点开始时间相同保存
ActivityImpl sameActivityImpl2 = processDefinitionEntity
.findActivity(activityImpl2.getActivityId());
sameStartTimeNodes.add(sameActivityImpl2);
} else {
// 有不相同跳出循环
break;
}
}
List<PvmTransition> pvmTransitions = activityImpl
.getOutgoingTransitions();// 取出节点的所有出去的线
for (PvmTransition pvmTransition : pvmTransitions) {
// 对所有的线进行遍历
ActivityImpl pvmActivityImpl = (ActivityImpl) pvmTransition
.getDestination();
// 如果取出的线的目标节点存在时间相同的节点里,保存该线的id,进行高亮显示
if (sameStartTimeNodes.contains(pvmActivityImpl)) {
highFlows.add(pvmTransition.getId());
}
}
}
return highFlows;
}
}
相关推荐
HTML基础学习示例代码HTML基础学习示例代码HTML基础学习示例代码 HTML基础学习示例代码HTML基础学习示例代码HTML基础学习示例代码 HTML基础学习示例代码HTML基础学习示例代码HTML基础学习示例代码 HTML基础学习示例...
学习Java基础的示例代码的集合,包括基本语言、GUI、网络编程等等
html 学习资料 项目资料 项目源码 供学习参考 html 学习资料 项目资料 项目源码 供学习参考 html 学习资料 项目资料 项目源码 供学习参考 html 学习资料 项目资料 项目源码 供学习参考 html 学习资料 项目资料 项目...
此为学习Vue官网基础的示例代码
提供一些基本JavaScript的应用示例,目的是帮助读者了解JavaScript的基本语法,深入的学习是需要自己去实践的.
angualar基础知识示例练习代码学习
1、内部包含超图build资源 2、包含示例页面中使用到的相关图片
FPGA基础学习代码示例,适合初学者研究学习使用,里面是平时学习用到的各种fpga示例代码,通过这些代码的学习可以快速上手fpga,打下一个坚实的基础。
C语言基础,一些基础知识的简单程序,亲测,纯手打,适合初学者调试学习。
学习C#的一些例子,有资源管理器,图形操作,文件操作等等
汇编语言,NLC格式中国国家图书馆的电子图书格式 汇编语言汇编学习基础汇编示例,阅读器使用
《html网页设计参考手册》示例源代码 也是我的html基础家教课件的示例源代码 分2个压缩包 html基础学习例子.part1 html基础学习例子.part2
WCF基础源码示例,里面有最基础的自身作为宿主和将IIS作为宿主的两种宿主方式,提供给初学者学习一下
本项目是一个基于Java语言开发的servlet学习基础项目,包含25个文件,主要文件类型包括XML配置文件、Java源代码、JAR包、...系统设计旨在为用户提供一个servlet基础学习示例,以帮助用户更好地理解和掌握servlet技术。
这是我们这学期学的C#实例,可能可以帮助初学者更好的学习C#
该压缩文件是我自学VB留下的一些资料,适合初学者使用。包含一些学习VB的基础文档和示例代码(全部是完整的工程)。
Visual C# 2005-语言基础,数据库系统开发示例代码 一共包含23个代码 对学习ASP 开发有帮助
C语言基础学习示例,适用于学习C语言基础,从简单到复杂。
赵志东编写基础入门>,蓝版,VBA学习入门的一书好书,我喜欢