JBPM4.4 使用泳道动态指定下一个任务节点任务人的两种方式之方法二

上一篇博文描述了使用 assignment-handler来实现动态指定下一个任务节点任务人的方法。

这篇博文主要描述不使用assignment-handler 来实现动态指定下一个任务节点任务人的方法。

简要流程如下:

某级部门(暂定为A级部门)manager 启动一个新任务发布工作流

通过泳道将该任务发布给A级部门的子部门(B)和孙子部门(C)

B和C部门的所有成员都能够看到该任务,并可以点击链接查看该任务的详细信息

一旦有成员apply 该任务,则其他人都不能再次apply该任务

如果该成员只是C级部门的成员,不具有manager 的角色,则该次申请还需要提交给C级部门的经理进行审核。

如果该成员是C级部门的经理,则不需要审核,直接进入tryfinish 待办任务

当获取了任务的assignee 认为自己完成了该项任务时,则可以提交tryfinish 任务,然后该请求进入工作流发布人的待办任务列表中

如果工作流发布者批准该次任务完成,则该次工作流结束。否则重新进入tryfinish 环节。

具体jbpm。xml 代码如下所示,请注意与上一个版本jbpm.xml 文件的不同:该版本没有使用assignment-handler ,而是在C级部门成员apply tryAssign过程中,taskService.completeTask 前通过获取历史任务中tryAssign task 中的assignee 将

将C级部门的manager name 放入到map 中。然后completeTask 。

<?xml version="1.0" encoding="UTF-8"?>

<process name="assignment" xmlns="http://jbpm.org/4.4/jpdl">
<swimlane candidate-groups="#{assignGroup}" name="assignmentswin">
</swimlane>
<start g="336,33,64,58" name="start1">
<transition to="assign"/>
</start>
<task assignee="#{assignOwner}" form="/SSH/LeaveJSP/assign_add.jsp" g="322,107,80,40" name="assign">
<transition to="tryAssign"/>
</task>
<task form="/SSH/LeaveJSP/assign_trytake.jsp" g="323,180,92,52" name="tryAssign" swimlane="assignmentswin">
<transition to="exclusive1"/>
</task>
<decision expr="#{role=='manager'? 'totryFinish':'tomanagerAprove'}" g="351,278,48,48" name="exclusive1">
<transition g="-92,-18" name="tomanagerAprove" to="managerAprove"/>
<transition name="totryFinish" to="tryFinish" g="-56,-18"/>
</decision>

<task assignee="#{assignManager}" form="leaveAction!toAssign_Manager.action" g="118,287,92,52" name="managerAprove">

<!--
<task form="leaveAction!toAssign_Manager.action" g="118,287,92,52" name="managerAprove">

<assignment-handler class="com.util.AssignTask">
<field name="assignee">
<string value="1"/>
</field>
</assignment-handler>
-->
<transition g="-61,-18" name="approveTry" to="tryFinish"/>
<transition g="-59,-18" name="notApproveTry" to="tryAssign"/>
</task>
<task form="leaveAction!toAssign_tryFinish.action" g="332,359,92,52" name="tryFinish" swimlane="assignmentswin">
<transition to="ifFinish"/>
</task>
<end g="351,608,48,48" name="end1"/>
<task assignee="#{assignOwner}" form="leaveAction!toAssign_ifFinish.action" g="335,477,92,52" name="ifFinish">
<transition g="-65,-18" name="AcceptFinish" to="end1"/>
<transition g="447,462:-82,-18" name="NotAcceptFinish" to="tryFinish"/>
</task>
</process>

对这段代码需要作如下的说明:

// 我们已经知道了上一个任务节点的名称是“tryAssign”,所以可以对历史任务列表中的每一个历史任务进行取出任务名称并和“tryAssign”进行比对,如果相同,则将该历史任务的assignee 取出。该assingee 就是C级部门apply 任务的组成员名。

上一篇博文是通过取巧的方式获取到tryAssign 的assingee,这篇博文则是通过比对的方式获得。

下面是 action 中的applyAssign 方法的代码

public String applayAssign(){
Map map=new HashMap();
String tryAssignUserName="";
User user=(User)ActionContext.getContext().getSession().get("user");
User user2=user.getDepartment().getManagerUser();
if(user.equals(user2)){
map.put("role", "manager");

}
else {map.put("role", "common");
}
map.put("tryTime", tryTime);
map.put("tryCondition", tryCondition);

taskService.takeTask(taskId,user.getUsername() );

String executionId = processEngine.getTaskService().getTask(taskId).getExecutionId();
List <HistoryTask>list = processEngine.getHistoryService().createHistoryTaskQuery().executionId(executionId).list();

for(int i=0;i<list.size();i++){
HistoryTaskImpl taskImpl=(HistoryTaskImpl)list.get(i);
String tempName= taskImpl.getAssignee();

Task task = processEngine.getTaskService().getTask(list.get(i).getId());

if(task!=null&&task.getName().equals("tryAssign")){
tryAssignUserName=tempName;

}

}
User user4= this.userServcie.findUserByName(tryAssignUserName);
User assignManager=user4.getDepartment().getManagerUser();
map.put("assignManager", assignManager.getUsername());
taskService.completeTask(taskId,map);
return "addLeaveApplay";
}

在这段代码中,通过获取历史任务列表,并将所有历史任务的任务名称将 tryAssign 进行对比,如果相同,则将该历史任务中的assignee 取出,并通过assignee 获取到 C级部门的manager ,然后 map.put("assignManager", assignManager.getUsername());

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值