activiti 是目前比较常用的工作流插件
Starts a new process instance in the latest version of the process definition with the given key
Starts a new process instance in the exactly specified version of the process definition with the given id.
1、未签收(Task)
TaskQuery taskCandidateUserQuery = taskService.createTaskQuery().processDefinitionKey(getProcessDefKey())
.taskCandidateUser(userId);
returntaskCandidateUserQ
uery;
TaskQuery taskAssigneeQuery = taskService.createTaskQuery().processDefinitionKey(getProcessDefKey()).taskAssignee(userId);
returntaskAssigneeQuery;
ProcessInstanceQuery unfinishedQuery = runtimeService.createProcessInstanceQue
ry().processDefinitionKey(getProcessDefKey())
.active();
returnunfinishedQuery;
HistoricProcessInstanceQ
uery finishedQuery = historyService.createHistoricProcessIns
tanceQuery()
.processDefinitionKey(getProcessDefKey()).finished();
returnfinishedQuery;
官网:http://www.activiti.org/
API:http://www.activiti.org/userguide/
下载:http://www.activiti.org/download.html
流程图设计工具用什么
Activiti提供了两个流程设计工具,但是面向对象不同。
Activiti Modeler,面向业务人员,使用开源的BPMN设计工具Signavio,使用BPMN描述业务流程图
Eclipse Designer,面向开发人员,Eclipse的插件,可以让开发人员定制每个节点的属性(ID、Name、Listener、Attr等)
Activiti支持部署*.bpmn20.xml、bar、zip格式的流程定义。
使用Activit Deisigner工具设计流程图的时候会有三个类型的文件:
.activiti设计工具使用的文件
.bpmn20.xml设计工具自动根据.activiti文件生成的xml文件
.png流程图图片
解决办法就是把xml文件和图片文件同时部署,因为在单独部署xml文件的时候Activiti会自动生成一张流程图的图片文件,但是这样在使用的时候坐标和图片对应不起来……
所以把xml和图片同时部署的时候Activiti自动关联xml和图片,当需要获取图片的时候直接返回部署时压缩包里面的图片文件,而不是Activiti自动生成的图片文件.
//起动流程
startProcessInstanceByKe
y(String processDefinitionKey, Map variabes)
其中businessKey就是业务ID,例如要申请请假,那么先填写登记信息,然后(保存+启动流程),因为请假是单独设计的数据表,所以保存后得到实体ID就可以把它传给processInstanceBusinessK
ey方法启动流程。当需要根据businessKey查询流程的时候就可以通过API查询:
runtimeService.createProcessInstanceQue
ry().processInstanceBusinessK
ey(processInstanceBusinessK
ey, processDefinitionKey);
建议数据库冗余设计:在业务表设计的时候添加一列:PROCESS_INSTANCE_ID varchar2(64),在流程启动之后把流程ID更新到业务表中,这样不管从业务还是流程都可以查询到对方!
特别说明: 此方法启动时自动选择最新版本的流程定义。
javadoc对其说明:
startProcessInstanceById
(String processDefinitionId, String businessKey, Map variables)
processDefinitionId:这个参数的值可以通过repositoryService.createProcessDefinitionQ
uery()方法查询,对应数据库:ACT_RE_PROCDEF;每次部署一次流程定义就会添加一条数据,同名的版本号累加。
特别说明: 此可以指定不同版本的流程定义,让用户多一层选择。
建议使用startProcessInstanceByKe
y,特殊情况需要使用以往的版本选择使用startProcessInstanceById
。
各种状态的任务查询以及和业务对象关联
我们目前分为4中状态:未签收、办理中、运行中、已完成
此类任务针对于把Task分配给一个角色时,例如部门领导,因为部门领导角色可以指定多个人所以需要先签收再办理,术语:抢占式
对应的API查询:
@Transactional(readOnly = true)
publicTaskQuery createUnsignedTaskQuery(String userId) {
}
2、办理中(Task)
此类任务数据类源有两种:
签收后的,签收后就应该为办理中状态
节点指定的是具体到一个人,而不是角色
对应的API查询:
@Transactional(readOnly = true)
publicTaskQuery createTodoTaskQuery(String userId) {
}
3、运行中(ProcessInstance)
没有结束的流程,所有参与过的人都应该可以看到这个实例,
从表ACT_RU_EXECUTION中查询数据。
对应的API查询:
@Transactional(readOnly = true)
publicProcessInstanceQue
ry createUnFinishedProcessI
nstanceQuery(String userId) {
}
4、已完成(HistoricProcessInstance)
已经结束的流程实例。
从表ACT_HI_PROCINST中查询数据。
@Transactional(readOnly = true)
publicHistoricProcessIns
tanceQuery createFinishedProcessIns
tanceQuery(String userId) {
}