JBPM 中的 ProcessInstance,Execution,Task上坟的男女是什么关系系

博客分类:
-控制流程的活动
控制流程的活动
开始节点,一个(主)流程只能有一个开始节点
结束节点,一个流程可以有多个结束节点
Decision 条件判断节点,当一个流程出现多个分支(情况),而分支排他时使用。
分支节点,当一个流程出现多个分支,而分支并列执行时使用。
聚合/联合节点,通常与fork节点一起使用。
Sub-process 子流程(本人未曾使用过)
一个暂停节点,当需要对流程的执行进行控制时使用。
任务节点,通常与form表单关联,主要是在流程实例经过活动时为某一人或组指派任务
Java、Script、Sql、Hql、Email
下面介绍三个最常用的活动
一个强制流程暂停的节点,当需要对流程的执行进行控制时使用。该节点可能什么都不需要做,也可能执行一些的操作。比如,路过银行,你拍怕裤兜,看看钱够还是不够。如果钱还可以花一段时间,你就不会去取钱。如果钱不多了,你就会去银行取些现金。或是钱本来就够花,但外面在下着雨,你想取避一避雨也不是不可以。State要做的相当于带你路过银行,至于你取不取钱,取多少,还是为了别的什么,不是它说了算,而是你自己的决定。
第一种方式:无分支的State
&?xml version="1.0" encoding="UTF-8"?&
&process name="simpleState" xmlns="http://jbpm.org/4.3/jpdl"&
&start name="start1" g="368,117,48,48"&
&transition name="to state" to="state" g="-59,-17"/&
&end name="end" g="372,396,48,48"/&
&state name="state" g="348,250,92,52"&
&transition name="to end" to="end" g="-47,-17"/&
&/process&
测试代码如下:
ProcessInstance processInstance =
executionService.startProcessInstanceByKey("simpleState");
System.out.println("流程实例Id:"+
processInstance.getId());
System.out.println("流程定义Id:"+
processInstance.getProcessDefinitionId());
System.out.println("是否在 state节点:"+
processInstance.isActive("state"));//true
System.out.println("判断流程是否结束:"+
processInstance.isEnded());//false
processInstance =
executionService.signalExecutionById(processInstance.getId());
System.out.println("是否在 state节点:"+
processInstance.isActive("state"));//true
System.out.println("判断流程是否结束:"+
processInstance.isEnded());//false
执行结果如下:
流程实例Id:simpleState.7
流程定义Id:simpleState-1
是否在 state节点:true
判断流程是否结束:false
**************
是否在 state节点:false
判断流程是否结束:true
第二种方式:有分支的state
&?xml version="1.0" encoding="UTF-8"?&
&process name="compState" xmlns="http://jbpm.org/4.3/jpdl"&
&start name="start1" g="300,106,48,48"&
&transition name="to proot" to="proot" g="-59,-17"/&
&end name="end" g="315,448,48,48"/&
&state name="proot" g="281,223,92,52"&
&transition name="to boy" to="boy" g="-59,-17"/&
&transition name="to girl" to="girl" g="-59,-17"/&
&state name="boy" g="187,346,92,52"&
&transition name="to end" to="end" g="-47,-17"/&
&state name="girl" g="383,342,92,52"&
&transition name="to end" to="end" g="-47,-17"/&
&/process&
测试代码如下:
ProcessInstance processInstance =
executionService.startProcessInstanceByKey("compState");
System.out.println("是否在 proot节点:"+
processInstance.isActive("proot"));//true
System.out.println("是否在 boy节点:"+
processInstance.isActive("boy"));//false
System.out.println("是否在 girl节点:"+
processInstance.isActive("girl"));//false
System.out.println("判断流程是否结束:"+
processInstance.isEnded());//false
processInstance =
executionService.signalExecutionById(processInstance.getId(),"to boy");//因为proot往下有多个分支,如果不指定流程转向,流程不会继续往下执行
System.out.println("是否在 proot节点:"+
processInstance.isActive("proot"));//false
System.out.println("是否在 boy节点:"+
processInstance.isActive("boy"));//true
System.out.println("是否在 girl节点:"+
processInstance.isActive("girl"));//false
System.out.println("判断流程是否结束:"+
processInstance.isEnded());//false
executionService.signalExecutionById(processInstance.getId(),"to boy");
这句如果改为:
executionService.signalExecutionById(processInstance.getId());
则流程不会往下执行,流程继续停留在proot节点。
条件判断节点,当一个流程出现多个中情况而各种情况都排他时使用,相当于switch case.
第一种方式:decision内置condition
&?xml version="1.0" encoding="UTF-8"?&
&process key="deci" name="deci" xmlns="http://jbpm.org/4.3/jpdl"&
&start g="358,77,48,48" name="start1"&
&transition g="-83,-17" name="to exclusive1" to="exclusive1"/&
&end g="374,510,48,48" name="end"/&
&decision g="358,219,48,48" name="exclusive1"&
&transition g="-59,-17" name="to 200" to="200"&
&condition expr="#{errorcode == 200}"/&
&/transition&
&transition g="-59,-17" name="to 404" to="404"&
&condition expr="#{errorcode == 404}"/&
&/transition&
&transition g="-59,-17" name="to 500" to="500"&
&condition expr="#{errorcode == 500}"/&
&/transition&
&/decision&
&state g="194,351,92,52" name="200"&
&transition g="-47,-17" name="to end" to="end"/&
&state g="340,349,92,52" name="404"&
&transition g="-47,-17" name="to end" to="end"/&
&state g="476,349,92,52" name="500"&
&transition g="-47,-17" name="to end" to="end"/&
&/process&
测试代码如下:
Map&String, String& variables = new HashMap&String, String&();
variables.put("errorcode", "200");
ProcessInstance processInstance =
executionService.startProcessInstanceByKey("deci", variables);
System.out.println("200 isActive:"+
processInstance.isActive("200"));//进入state 200,暂停
System.out.println("processInstance isEnd:"+
processInstance.isEnded()); //流程未结束,返回false
System.out.println("&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&");
//该方法返回processInstance如果不接收,processInstance还是原来的对象
//如果不接收返回值,也不重新查询,则processInstance还是方法调前的状态
processInstance=
executionService.signalExecutionById(processInstance.getId());
System.out.println("processInstance isEnd:"+
processInstance.isEnded()); //流程结束,返回true
System.out.println("&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&");
控制台输出结果如下:
200 isActive:true
processInstance isEnd:false
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
processInstance isEnd:true
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
第二种方式:为decision活动设置expr
&?xml version="1.0" encoding="UTF-8"?&
&process name="deciBaseExpr" xmlns="http://jbpm.org/4.3/jpdl"&
&start name="start1" g="407,65,48,48"&
&transition name="to exclusive1" to="exclusive1" g="-83,-17"/&
&end name="end1" g="418,497,48,48"/&
&decision name="exclusive1" g="409,207,48,48" expr="#{whatcode}"&
&transition name="to 200" to="200" g="-59,-17"/&
&transition name="to 404" to="404" g="-59,-17"/&
&transition name="to 500" to="500" g="-59,-17"/&
&/decision&
&state name="200" g="251,344,92,52"&
&transition name="to end1" to="end1" g="-47,-17"/&
&state name="404" g="389,342,92,52"&
&transition name="to end1" to="end1" g="-47,-17"/&
&state name="500" g="516,341,92,52"&
&transition name="to end1" to="end1" g="-47,-17"/&
&/process&
测试代码如下:
Map&String, String& variables = new HashMap&String, String&();
variables.put("whatcode", "to 404");
ProcessInstance processInstance =
executionService.startProcessInstanceByKey("deciBaseExpr", variables);
System.out.println("200 isActive:"+
processInstance.isActive("200"));//返回false
System.out.println("404 isActive:"+
processInstance.isActive("404"));//返回true
System.out.println("500 isActive:"+
processInstance.isActive("500"));//返回false
System.out.println("processInstance isEnd:"+
processInstance.isEnded()); //流程未结束,返回false
System.out.println("&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&");
//该方法返回processInstance如果不接收,processInstance还是原来的对象
//如果不接收返回值,也不重新查询,则processInstance还是方法调前的状态
processInstance=
executionService.signalExecutionById(processInstance.getId());
System.out.println("processInstance isEnd:"+
processInstance.isEnded()); //流程结束,返回true
System.out.println("&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&");
控制台输出结果如下:
200 isActive:false
404 isActive:true
500 isActive:false
processInstance isEnd:false
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
***************
processInstance isEnd:true
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
第三种方式:为decision配置handler
&?xml version="1.0" encoding="UTF-8"?&
&process name="deciByHandler" key="deciByHandler" xmlns="http://jbpm.org/4.3/jpdl"&
&start name="start1" g="341,55,48,48"&
&transition name="to exclusive1" to="exclusive1" g="-83,-17"/&
&end name="end1" g="346,435,48,48"/&
&decision name="exclusive1" g="340,164,48,48"&
&handler class="com.lihua.HandlerDecision"&&/handler&
&transition name="to 200" to="200" g="-59,-17"/&
&transition name="to 404" to="404" g="-59,-17"/&
&transition name="to 500" to="500" g="-59,-17"/&
&/decision&
&state name="200" g="178,315,92,52"&
&transition name="to end1" to="end1" g="-47,-17"/&
&state name="404" g="322,309,92,52"&
&transition name="to end1" to="end1" g="-47,-17"/&
&state name="500" g="461,309,92,52"&
&transition name="to end1" to="end1" g="-47,-17"/&
&/process&
Handler类:
package com.
import org.jbpm.api.jpdl.DecisionH
import org.jbpm.api.model.OpenE
public class HandlerDecision implements DecisionHandler {
private static final long serialVersionUID = -0348966L;
public String decide(OpenExecution execution) {
return (String) execution.getVariable("towhere");
测试代码如下:
Map&String, String& variables =
new HashMap&String, String&();
variables.put("towhere", "to 500");
ProcessInstance processInstance =
executionService.
startProcessInstanceByKey("deciByHandler", variables);
System.out.println("200 isActive:"+
processInstance.isActive("200"));//返回 false
System.out.println("404 isActive:"+
processInstance.isActive("404"));//返回 false
System.out.println("500 isActive:"+
processInstance.isActive("500"));//返回 true
System.out.println("processInstance isEnd:"+
processInstance.isEnded()); //流程未结束,返回false
System.out.println("&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&");
//该方法返回processInstance如果不接收,processInstance还是原来的对象
//如果不接收返回值,也不重新查询,则processInstance还是方法调前的状态
processInstance=
executionService.signalExecutionById(processInstance.getId());
System.out.println("processInstance isEnd:"+
processInstance.isEnded()); //流程结束,返回true
System.out.println("&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&");
控制台输出结果如下:
200 isActive:false
404 isActive:false
500 isActive:true
processInstance isEnd:false
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
************
processInstance isEnd:true
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
以上三种方式差别都不是很大,第三中在程序中通过Handler进行复杂的处理。个人觉得,如果对于逻辑不是很复杂的操作,前两种方式是比较可取的。但如果逻辑过于复杂,或者还有其他的操作比如同步数据库中的其他信息等操作时,不妨选择第三种方式。
这些代码代码比较简单,这里就不做过多的解释。
任务节点,通常与form表单关联,主要是在流程实例经过活动时为某一人或组指派任务.
Task的assignee属性
第一, assignee用来指示用户,负责完成任务的人。分配人是一个任务中的字符串属性,引用一个用户。(直接指定一个字符串)
第二,这个属性默认会当做表达式来执行。(指定一个表达式,然后在代码里为该表达式赋值) 如:在这里任务被分配给#{order.owner}。这意味着首先使用order这个名字查找一个对象。 其中一个查找对象的地方是这个任务对应的流程变量。 然后getOwner()方法会用来获得用户id, 引用的用户负责完成这个任务。
&?xml version="1.0" encoding="UTF-8"?&
&process name="task" xmlns="http://jbpm.org/4.3/jpdl"&
&start name="start1" g="390,97,48,48"&
&transition name="to task" to="task" g="-53,-17"/&
&end name="end1" g="391,362,48,48"/&
&task name="task" g="368,239,92,52" assignee="${taskAssignee}"&
&transition name="to end1" to="end1" g="-47,-17"/&
&/process&
测试代码如下:
Map&String,String& map=
new HashMap&String, String&();
map.put("taskAssignee", "lihua");
ProcessInstance processInstance=
for (int i = 0; i & 2; i++) {
processInstance=executionService.
startProcessInstanceByKey("task",map);
System.out.println("流程是否处于task节点:"+
processInstance.isActive("task"));//true
System.out.println("流程实例Id:"+
processInstance.getId());
List&Task& list=taskService.findPersonalTasks("lihua");
for (Task task : list) {
System.out.println("任务活动名称:"+
task.getActivityName());
System.out.println("流程实例Id:"+
task.getExecutionId());
System.out.println("任务活动Id:"+
task.getId());
System.out.println("任务活动创建时间:"+
task.getCreateTime());
System.out.println("任务活动进度:"+
task.getProgress());
System.out.println("任务活动分配给:"+
task.getAssignee());
System.out.println("&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&");
控制台输出结果如下:
流程是否处于task节点:true
流程实例Id:task.7
************
流程是否处于task节点:true
流程实例Id:task.11
*****************
任务活动名称:task
流程实例Id:task.11
任务活动Id:13
任务活动创建时间: 15:48:50.406
任务活动进度:null
任务活动分配给:lihua
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
任务活动名称:task
流程实例Id:task.7
任务活动Id:9
任务活动创建时间: 15:48:50.375
任务活动进度:null
任务活动分配给:lihua
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
1、在流程设置时如果出现乱码可在Eclipse.ini中添加如下配置:
-Dfile.encoding=UTF-8
2、在jbpm中表达式$(),#()均可以成功解析。
浏览: 314375 次
来自: 杭州
com.mon.util 这个包下的工 ...
q 写道原来就支持自定义不同时长的cac ...
原来就支持自定义不同时长的cache的吧配置cachemana ...
我看没生效也是这样,更新下spring boot版本试试
牛X,我服。
(window.slotbydup=window.slotbydup || []).push({
id: '4773203',
container: s,
size: '200,200',
display: 'inlay-fix'jBPM 4.0 解读分析Abstract
这篇文章主要是介绍了jBPM 4.0的基础架构,以及通过一个简单的例子来让大家知道怎么应用jBPM.
为什么选择4.0版本呢?以后的主流版本应该是4.0版本的,所以直接写4.0版本的了.
我们不妨也看下ConfigurationTest测试.
public void testConfigurationServices() {
ProcessEngine processEngine = new Configuration()
.setXmlString(
"&jbpm-configuration&" +
&process-engine-context&" +
&repository-service /&" +
&execution-service /&" +
&management-service /&" +
&/process-engine-context&" +
"&/jbpm-configuration&"
.buildProcessEngine();
assertNotNull(processEngine);
assertNotNull(processEngine.getExecutionService());
assertNotNull(processEngine.getManagementService());
Configuration类是jBPM的入口,你可以从Configuration类中创建ProcessEngine,而从ProcessEngine中获取到RepositoryService,
ExecutionService, TaskService等等. Configuration类里有两个实现类,一个是JbpmConfiguration,这是默认的jBPM自带的Configuration解析器,另外一个是SpringConfiguration,这个是jBPM和Spring的集成.
在这里,我们就只看下JbpmConfiguration的实现,在JbpmConfiguration类里,我们可以看到他是这么去调用Parser来解析xml的.
protected void parse(StreamInput streamSource) {
isConfigured =
JbpmConfigurationParser.getInstance()
.createParse()
.pushObject(this)
.setStreamSource(streamSource)
.execute()
.checkErrors("jbpm configuration " + streamSource);
在这里,我们可以看到,jbpm的配置文件是有两个元素组成的,一个是process-engine-context,另外一个是transaction-context. 其中process-engine-context里面的元素是包括了对外发布的服务,
比如repository-service, execution-service等等. 而transaction-context则包括了他的内部真正实现,比如repository-service对应repository-session.
也可以简单的把repository-servie看做是API, repository-session看做是SPI. 这样做的好处是,SPI的实现,对API一点影响都没有,很大程度上提供了一个容易集成的特性.
说到这里,应该对jBPM的IOC介绍的差不多了.我自己在用JBoss IDM project[]来实现jBPM的Identity module时.需要增加如下的配置.
&jbpm-configuration&
&process-engine-context&
&jboss-idm-identity-session-factory jndi="java:/IdentitySessionFactory" /&
&/process-engine-context&
&transaction-context&
&jboss-idm-identity-session realm="realm://JBossIdentity" /&
&/transaction-context&
&/jbpm-configuration&
于是,我需要增加以下的类来完成对象的创建和实例化. JbossIdmIdentitySessionFactoryBinding,JbossIdmIdentitySessionFactoryDescriptor,JbossIdmIdentitySessionBinding, JbossIdmIdentitySessionDescriptor
然后,在jbpm.wire.bindings.xml里面注册我们新加的Binding.
从上面我们所说的,不难看出本身这个IOC的实现机制也是很简单的,而且也很容易扩展,如果说到时候和Spring, JBoss MC等IOC容器的集成也是很方便的.用户名:gaochaojs
文章数:204
评论数:368
访问量:376886
注册日期:
阅读量:1297
阅读量:3317
阅读量:580937
阅读量:464752
51CTO推荐博文
  在我们的工作流系统里已经有工作移交的功能,工作移交常用于用户离职、异动、岗位变化、长期不在岗位等情况,将已经分配给该用户的工作移交给其他用户。移交的本质是更改正在审批中的任务的审批人。而委托和转交功能中的转交功能与移交相似,移交功能由管理员发起,而转交则是由当前审批人主动发起的改变审批的行为。在日常运维中,经常出现类似这样的场景,某一工作被错误的移交到我手里,或者是我现在已经不办理类似流程了,我想主动的将该流程转给他人办理,这就是转交。另外,用户请假、外出、出差或针对某些低级别的流程(按照流程规定需要高层审批,比如总监级的请假单、加班单会由越级领导高级副总裁审批,而高级副对类似的单子不愿意去审批)希望委托他人审批,这即是一种事前的委托,而转交或转办也被称为审批中的委托。  在中国特色的工作流系统中,委托与转交功这样较常见。以下是我对委托与转交功能的基本定义:1.首先在t_bpm_process_task中需增加人和转交人,同理将审批人改变为被人或被转交人;2.该功能由该任务的审批人主动发起;3.人数据(被人、时间)来源暂定为请假表的代理人及请假的开始、结束时间;4.所有单据均可;5.转交是当前审批人将该任务的审批权移交他人;6.被转交人和被人不允许再将任务转交或他人;7.我的工作中新增两个标签,我转交和我,转交人或人可以通过这两个模块查看自己转交或的任务的办理情况以上功能为必要功能;另外,还可增加更丰富的设置数据,比如1.被人可以设置自己不允许被;2.任务可以设置为是否允许转;3.允许被或被转交人在/转交人恢复工作后仍未办理结束的任务退回/转交人;  在实际编码的过程中,对一些未清晰的需求进一步明确:1.关于抢办的转交功能,抢办点击转交相当于jbpm4中候选功能的pick,即将抢办的任务先只归到自己名下,然后再进行转交,所以转交后暂定为只有被转交人有审批权限;2.非OA任务不准转交;3.改变审批人、加签等情况不自动转给被人;4.抢办的暂无查看任务办理详情;5.菜单表中需增加我转交我的菜单  我们先看看实现转交和委托所需要的表结构,实际是任务表,增加了两个字段用于表示委托人和转交人,如下:&resultMap&type="com.fx.oa.module.bpm.workflow.api.shared.domain.ProcessTaskEntity"&id="TaskResultMap"&
&&&& &id&&property="id"&column="id"/&
&result&property="processExecutionId"&column="processExecutionId"&jdbcType="VARCHAR"/&
&result&property="processDefineId"&column="processDefineId"&jdbcType="VARCHAR"/&
&result&property="processDefineName"&column="processDefineName"&jdbcType="VARCHAR"/&
&result&property="activityName"&column="activityName"&jdbcType="VARCHAR"/&
&result&property="finishTime"&column="finishTime"&jdbcType="TIMESTAMP"/&
&result&property="timeConsuming"&column="timeConsuming"&jdbcType="BIGINT"/&
&result&property="fromTaskId"&column="fromTaskId"&jdbcType="VARCHAR"/&
&result&property="fromTaskName"&column="fromTaskName"&jdbcType="VARCHAR"/&
&result&property="taskId"&column="taskId"&jdbcType="VARCHAR"/&
&result&property="transTo"&column="transTo"&jdbcType="VARCHAR"/&
&result&property="status"&column="status"&jdbcType="VARCHAR"/&
&result&property="preProcessTaskId"&column="preProcessTaskId"&jdbcType="VARCHAR"/&
&result&property="description"&column="description"&jdbcType="VARCHAR"/&
&result&property="creatorName"&column="creatorName"&jdbcType="VARCHAR"/&
&result&property="createTime"&column="createTime"&jdbcType="TIMESTAMP"/&
&result&property="modifyTime"&column="modifyTime"&jdbcType="TIMESTAMP"/&
&result&property="createUserCode"&column="createUserCode"&jdbcType="VARCHAR"/&
&result&property="modifyUserCode"&column="modifyUserCode"&jdbcType="VARCHAR"/&
&result&property="entrustedUserCode"&column="entrustedUserCode"&jdbcType="VARCHAR"/&
&result&property="substituteUserCode"&column="substiuteUserCode"&jdbcType="VARCHAR"/&
&/resultMap&  我们先来看转交功能。对于前端页面我们直接使用单选的人员选择器,选中某用户后,点击确定后进入转交的处理,代码如下:/**
&*&raid&task&to&other&people
&*&@author&chao.gao
&*&@date&&上午11:39:04
&*&@see&com.gaochao.oa.module.bpm.workflow.api.server.service.IProcessActivityService#raidTo(com.gaochao.oa.module.bpm.workflow.api.shared.dto.FlowRunTime,&com.gaochao.oa.module.bpm.workflow.api.shared.vo.TaskVo)
&*&@param&flowRunTime
&*&@param&taskVo
public&boolean&raidTo(FlowRunTime&flowRunTime,&TaskVo&task)&{
if(StringUtils.isNotEmpty(flowRunTime.getCurrentUser())){
&&&&&&&& ProcessExecutionEntity&processExecutionEntity&=&processExecutionService.queryProcessExecutionByPkValue(flowRunTime.getPkValue());
&&&&&&&& List&Task&&list&=&jbpmOperatorService.getTasksByProcessInstanceId(processExecutionEntity.getProcessInstanceId());
&&&&&&&& processExecutionService.changePeople(flowRunTime);&&&&
MailSettingEntity&mailSetting&=&mailSettingService.queryMailSetting();&&&&
Map&String,&List&MailblackwhitelistEntity&&&mailBlackWhiteListMap&=&mailblackwhitelistService.queryMailBlackWhiteList();
//设置流程处理ID
flowRunTime.setProcessExecutionId(processExecutionEntity.getId());
&&&&&&&& for(int&i=0;i&list.size();i++){
Task&task1&=&list.get(i);
if(task1.getId().equals(task.getTaskId())){
task.setTaskId(task1.getId());
processTaskService.raidTo(task);
//设置任务Id
flowRunTime.setNextTaskId(task1.getId());
final&String&assign&=&flowRunTime.getCurrentUser();
jbpmOperatorService.assignTask(task1.getId(),&assign);
//发送邮件
EmailUtil.sendMail2Proxy(assign,&flowRunTime,&mailSetting,&mailBlackWhiteListMap);
&&&&&&&& }
&&&& }else{
&&&&&&&&&&&&throw&new&ProcessActivityException("没有选择人员");
&&&&&&&&return&
}  在以上的代码中,共有三处引用,分别是jbpm分配任务、更新扩展任务列表和向转交的审批人发送邮件。我们着重看一下分配任务:/**
&*&分配任务
&*&@author&chao.gao
&*&@date&&下午7:18:31
&*&@param&taskId&任务Id
&*&@param&userId&用户
public&void&assignTask(String&taskId,String&userId){
UserEntity&userEntity&=&userService.queryUserByUserCode(userId);
if(userEntity&==&null){
throw&new&ProcessActivityException("流程引擎运行错误:审批用户异常!");
processEngine.getTaskService().assignTask(taskId,userId);
}  在更新扩展任务列表中,我们会将选中的用户用作当前任务的审批人,同时将转交人赋值为当前用户,即substituteUserCode=OAUserContext.getUserC& 下面介绍一下委托,委托是一种事前的工作委托,即前一步用户在将工作下发时,即将任务下发给工作的代理人,这里需要配合授权模块。授权模块的核心字段是委托人工号、被委托人工号和委托单号。如下:&resultMap&type="com.fx.oa.module.auth.authorize.api.shared.domain.AuthorizeEntity"&id="authorizeObject"&
&&id&&property="id"&column="id"/&
&&result&property="staffId"&column="staff_id"/&
&&result&property="staffName"&column="staff_name"/&
&&result&property="authTime"&column="auth_time"/&
&&result&property="pstaffId"&column="p_staff_id"/&
&&result&property="pstaffName"&column="p_staff_name"/&
&&result&property="authorizeStart"&column="authorize_start"/&
&&result&property="authorizeEnd"&column="authorize_end"/&
&&result&property="active"&column="active"/&
&&result&property="failureTime"&column="failure_time"/&
&&result&property="scopeKey"&column="scope_key"/&
&&result&property="scopeName"&column="scope_name"/&
&&result&property="remarks"&column="remarks"/&
&&result&property="define1"&column="define1"/&
&&result&property="define2"&column="define2"/&
&&result&property="define3"&column="define3"/&
&/resultMap&  这种事前的委托体现在根据审批人设置规则筛选出审批人后,再根据审批人列表及授权设置将审批人及代理人显示给用户。  后端的处理代码如下,这段代码主要实现这样一个功能,将审批人列表userList遍历看是否在授权表中存在活跃的授权,然后将被授权也就是被委托人拿出,组成一个新的list返回。/**
&*&get&the&final&assignee&based&authorization
&*&TODO(方法详细描述说明、方法参数的具体涵义)
&*&@author&chao.gao
&*&@date&&下午4:10:15
&*&@param&userList
&*&@return
&&&&private&List&UserEntity&&filterByAuth(List&UserEntity&&userList,&String&processDefineId)&{
&&&& List&UserEntity&&userNewList&=&new&ArrayList&UserEntity&();
&&&& for(UserEntity&user&:&userList){
AuthorizeEntity&authEntity&=&authorizeService.authorize(user.getStaffId(),&processDefineId);
if(authEntity&==&null)
userNewList.add(user);
UserEntity&user2&=&userService.queryUserByStaffId(authEntity.getPstaffId());
if(user2&!=&null){
&&&&&&&&UserEntity&user3&=&new&UserEntity();
user3.setUserCode(user2.getUserCode());
user3.setUserName(user2.getUserName()+&"("&+&user.getUserName()&+&"的工作代理人)");
user3.setDefine1(user.getUserCode());
userNewList.add(user3);
&&&& return&userNewL
}  前端我是这样处理的:if(result.userList.length&&0){
var&jbrArray&=&[];
var&hiddenWtr&=&[];
$.each(result.userList,function(i,r){
jbrArray&+="&span&class='input_checked'&&input&type='checkbox'&class='check_box'&name='jbr'&checked='checked'&value='"+&r.userCode+"'/&&/span&"+r.userN
if(r.define1){
hiddenWtr&+=&"&input&name='wtr'&value='"&+(r.userCode&+&':'&+&r.define1)&+&"'&type='hidden'/&"
if(jbrArray.length&&&0){
$("#jbr").append(jbrArray);
$("#jbr").append(hiddenWtr);
if($("#jbr&input[type='checkbox']").length&==&1){
$("#jbr&input[type='checkbox']").first().attr("checked","checked")
var&wtrArr&=&new&Array();
$("input[name='jbr']:checked").each(function(index,&element){
var&userCode&=&$(element).val()
if(userCode!=null&&userCode!=""){
jbrArr.push(userCode);
$("input[name='wtr']").each(function(index,&element){
var&userCode&=&$(element).val()
if(userCode!=null&&userCode!=""){
wtrArr.push(userCode);
});  初看下来这样写其实是有问题的,其实没有问题。虽然审批人列表长度可能大于1,在这种情况下,如非会签,我们可以选择一到多个审批人,在审批人的数组里我们只push了选中的审批人,但在委托人的数组里却未对是否选中进行甄别。但这并不影响我们的正确使用,接下来看:&if(StringUtils.isNotEmpty(task.getAssignee())){
&&taskForm.setCreateUserCode(task.getAssignee());
&&Map&String,&String&&wtrMap&=&queryWtr(startFlowRunTime);
&&if(StringUtils.isNotEmpty(wtrMap.get(task.getAssignee()))){
&&taskForm.setEntrustedUserCode(wtrMap.get(task.getAssignee()));
&&this.processTaskService.save(taskForm);
&&}  jbpm的分配任务跟普通任务是一样的,因为我们通过授权的筛选已经将审批人替换为被委托人,又通过上述代码委托人作为扩展任务的trustedUserCode作为主动委托人供委托模块查询。我们再看一下queryWtr这个方法是如何处理我们前端传入的“被委托人:委托人”格式的委托人列表的:/**
&*&get&entrustedUserCode&based&wtrList&whose&style&as&a&:&b
&*&@author&chao.gao
&*&@date&&上午8:56:15
&*&@param&startFlowRunTime
&*&@return
private&Map&String,&String&&queryWtr(FlowRunTime&startFlowRunTime)&{
Map&String,&String&&map&=&new&HashMap&String,&String&();
List&String&&wtrList&=&startFlowRunTime.getWtrList();
if(!CollectionUtils.isEmpty(wtrList)){
for(String&wtr&:&wtrList){
if(wtr.contains(":")){
String[]&wtrs&=&wtr.split(":");
if(wtrs.length&==&2){
map.put(wtrs[0],&wtrs[1]);
}  最后是查询模块,委托和转交的查询语句是相似的,我们拿委托模块举例如下: &!--&查询我委托工作信息集合&&--&
&select&id="queryMyWtTask"&resultMap="ExecutionResultMap"&&parameterType="com.fx.oa.module.bpm.workflow.api.shared.domain.ProcessExecutionEntity"&
DISTINCT(Execution.id),
Execution.code,
Execution.userId,
Execution.processDefineId,
Execution.processInstanceId,
Execution.status,
Execution.tableName,
Execution.pkValue,
Execution.formDefineId,
Execution.urgencyDegree,
ProcessDefine.description,
Execution.createTime,
Execution.modifyTime,
sysUser1.userName&AS&createUserCode,
sysUser2.userName&AS&modifyUserCode,
ProcessDefine.name,
Execution.active,
RejectWork.status&as&rejectStatus,
Task.NAME_&as&activityName,
task3.activityName&AS&joinActivityName,
Task.ASSIGNEE_&as&currentHandler
FROM&T_BPM_PROCESS_DEFINE&ProcessDefine,T_BPM_PROCESS_TASK&TASK3,T_BPM_PROCESS_EXECUTION&Execution
LEFT&JOIN&T_BPM_REJECTWORK&RejectWork
ON&Execution.pkValue&=&RejectWork.pkValue
LEFT&JOIN&jbpm4_task&task
ON&Execution.processInstanceId&=&task.EXECUTION_ID_
&&&&&&&&LEFT&JOIN&T_SYS_USER&sysUser1&
ON&Execution.createUserCode&=&sysUser1.userCode&
LEFT&JOIN&T_SYS_USER&sysUser2&
ON&Execution.modifyUserCode&=&sysUser2.userCode&&
WHERE&1&=&1
AND&Execution.ID&=&task3.processExecutionId
&&&&&&&&&&&&AND&task3.entrustedUserCode&=&#{createUserCode}
&&&&&&&&&&&&AND&Execution.processDefineId&=&ProcessDefine.ID&&&&&&&&&&&&&&
&&&&&&&&&&&&&when&test="status&==&'11'"&
&&&&&&&&&&&&&&&&!--&AND&rejectWork.status&=&'1'&--&&&&AND&Execution.status&=&'2'&AND&Execution.active&!=&'Y'
&&&&&&&&&&&&&/when&
&&&&&&&&&&&&&when&test="status&==&'2'"&
&&&&&&&&&&&&&&&&!--&&AND&rejectWork.status&!=&'1'&--&&AND&Execution.active&!=&'N'
&&&&&&&&&&&&&/when&
&&&&&&&&&&&&&otherwise&&
&&&&&&&&&&&& AND&Execution.active&!=&'N'
&/otherwise&&
&&&&&&&&&/choose& &&&&&&&&
AND&Execution.createUserCode&!=&#{createUserCode}
&if&test="createUserName&!=&null&and&createUserName&!=''"&
AND&Execution.createUserCode&=&(SELECT&userCode
&&&&&&&&&&&&&&&&FROM&T_SYS_USER&sysUser
&&&&&&&&&&&&&&&&WHERE&sysUser.userName=&#{createUserName}&LIMIT&0,1)
&if&test="processDefineId&!=&null&and&processDefineId&!=''"&
AND&Execution.processDefineId&=&&#{processDefineId}&&
&if&test="status&!=&null&and&status&!=''&and&status&!='11'"&
AND&Execution.status&=&#{status}
&if&test="name&!=&null&and&name&!=''"&
AND&ProcessDefine.name&LIKE&'%'&#{name}&'%'&&
&if&test="startCreateTime&!=&null&and&startCreateTime&!=''"&
AND&Execution.createTime&&![CDATA[&=&#{startCreateTime}&]]&&&&
&if&test="endCreateTime&!=&null&and&endCreateTime&!=''"&
AND&Execution.createTime&&![CDATA[&=&#{endCreateTime}]]&&&&&
GROUP&BY&Execution.id
ORDER&BY&Execution.createTime&DESC
&/select&本文出自 “” 博客,请务必保留此出处
了这篇文章
类别:┆阅读(0)┆评论(0)}

我要回帖

更多关于 闺蜜是什么样的关系 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信