大佬们的项目里有用到会签,所以趁双休日研究了下。
其实也是简单的会签情况,不过开始的时候研究了4.4,(因为先前研究的都是4.4),发现4.4跟4.3的处理方法完全不一样,搞的我比较郁闷……弄了一天,都是一个老问题,就是在历史记录表中查不到记录。后来查了很多资料,才觉悟4.4的处理方式确实不同于4.3。
4.3中的实现还是很简单的。实例中使用custom节点。
例子是前几次实例中的请假,就很简单的申请——manager和boss进行会签——同意则继续,不同意返回。
下面是主要的类及说明
package com.ht.util;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import org.jbpm.api.Configuration;
import org.jbpm.api.ProcessInstance;
import org.jbpm.api.TaskService;
import org.jbpm.api.activity.ActivityExecution;
import org.jbpm.api.activity.ExternalActivityBehaviour;
import org.jbpm.api.task.Task;
import org.jbpm.pvm.internal.env.EnvironmentImpl;
import org.jbpm.pvm.internal.history.HistoryEvent;
import org.jbpm.pvm.internal.history.events.TaskActivityStart;
import org.jbpm.pvm.internal.model.Activity;
import org.jbpm.pvm.internal.model.ExecutionImpl;
import org.jbpm.pvm.internal.model.Transition;
import org.jbpm.pvm.internal.session.DbSession;
import org.jbpm.pvm.internal.task.TaskImpl;
/**
*
* @author tommy
* 会签类
*/
public class Huiqian implements ExternalActivityBehaviour {
private static final long serialVersionUID = 1L;
private static int count = 0;// 同意人数
public void signal(ActivityExecution activityExecution, String signalName,
Map<String, ?> parms) throws Exception {
ExecutionImpl executionImpl = (ExecutionImpl) activityExecution;
// 获得流程实例
ProcessInstance pi = (ProcessInstance) executionImpl
.getProcessInstance();
// 获得任务服务
TaskService taskService = Configuration.getProcessEngine()
.getTaskService();
// 获得活动节点
Activity activity = executionImpl.getActivity();
List<Task> tasks = taskService.createTaskQuery().processInstanceId(
pi.getId()).list();
TaskImpl parentTask =(TaskImpl)tasks.get(0);
// 获得子任务
List<Task> subTask_list = taskService.getSubTasks(tasks.get(0).getId());
Iterator<Task> iter = subTask_list.iterator();
// 循环所有子任务
while (iter.hasNext()) {
Task subtask = iter.next();
System.out.println(subtask.getId());
if (parms.get("name").equals(subtask.getAssignee())) {
if (parms.get("RESULT").equals("同意")) {
count++;
}
taskService.completeTask(subtask.getId()); // 完成当前会签人子任务
}
}
// 剩余子任务数量为1个时,则直接跳转下一个流程节点
if (subTask_list == null || subTask_list.size() == 1) {
Transition transition = null;
if ((signalName == null)
|| ((Task.STATE_COMPLETED.equals(signalName))
&& (activity.getOutgoingTransitions() != null) && (activity
.getOutgoingTransitions().size() == 1))) {
transition = activity.getOutgoingTransitions().get(0); // 获得将跳转到的transition
} else {
transition = activity.findOutgoingTransition(signalName);
}
Map<String, Object> map = new HashMap<String, Object>();
if (count == 2) {
count = 0;
map.put("RESULT", "PASS");
} else {
count = 0;
map.put("RESULT", "NOPASS");
// System.out.print("会签不通过");
}
taskService.completeTask(tasks.get(0).getId(), map); // 结束父任务
executionImpl.take(transition); // 流程继续
} else {
executionImpl.waitForSignal();
}
}
public void execute(ActivityExecution activityExecution) throws Exception {
ExecutionImpl executionimpl = (ExecutionImpl) activityExecution;
DbSession dbsession = EnvironmentImpl.getFromCurrent(DbSession.class);
TaskImpl taskimpl = dbsession.createTask();
taskimpl.setName("领导会签");
taskimpl.setExecution(executionimpl);
taskimpl.setProcessInstance(executionimpl.getProcessInstance());
taskimpl.setSignalling(false);
taskimpl.setExecutionDbid(executionimpl.getDbid());
dbsession.save(taskimpl);
HistoryEvent.fire(new TaskActivityStart(taskimpl), executionimpl);
// 从原任务中分出两个子任务
//子任务1分配给manager
TaskImpl subtask1 = taskimpl.createSubTask();
subtask1.setAssignee("manager");
subtask1.setName("领导会签,操作角色:" + "manager");
subtask1.setSignalling(false);
subtask1.setExecution(executionimpl);
subtask1.setExecutionDbid(executionimpl.getDbid());
dbsession.save(subtask1);
HistoryEvent.fire(new TaskActivityStart(subtask1), executionimpl);
//子任务2分配给boss
TaskImpl subtask2 = taskimpl.createSubTask();
subtask2.setAssignee("boss");
subtask2.setName("领导会签,操作角色:" + "boss");
subtask2.setSignalling(false);
subtask2.setExecution(executionimpl);
subtask2.setExecutionDbid(executionimpl.getDbid());
dbsession.save(subtask2);
HistoryEvent.fire(new TaskActivityStart(subtask2), executionimpl);
// 流程等待
executionimpl.waitForSignal();
}
}
在到custom节点时,执行execute方法,在execute方法中主要是生成2个子节点,并保存进入库表,并且让流程进入等待状态。在每次到达该节点时,就会执行signal方法,进行会签的判断,判断结果根据需要进行一定的处理,当完成自己所需要业务以后可以executionImpl.take(transition),来确定需要跳转的下一个节点。
也没什么特别复杂的地方,建议使用debug来调试,就会了解整个会签过程了。
下面分享下源码,由于大小限制,没有jar包
这次的实例比前2次清爽很多……不过还是有点乱,凑合下吧,主要是了解下整个流程
myeclipse8.5+jdk1.6+jbpm4.4+spring3.0.3+struts2.2.1+jbpm4.3+sql server 2000下测试通过.
- 大小: 11.8 KB
- 大小: 14.1 KB
分享到:
相关推荐
这个实例中用到的2张库表 博文链接:https://hellotommy.iteye.com/blog/804233
jBPM4.4+ssh 整合配置及完整实例
SSH+JBPM4.3的整合 JBPM4.3 转载别人的博客,里面包含2份整合框架的资料,2份关于JBPM的学习
JBPM4.3 整合struts2 hibernate spring 请假实例, lib下载,在我的另外资源,路径: http://download.csdn.net/source/2485359 http://download.csdn.net/source/2485373 http://download.csdn.net/source/2485385 ...
jbpm jbpm4.3.jar DDDDDDDD
NULL 博文链接:https://lichun01.iteye.com/blog/1773454
业务流程定制,领导审批。工作流开发,含有lib
jbpm4整合struts2+spring2.5+hibernate3.3.doc
本示例主要实现了流程的基本管理,流程实例的管理,...使用本例子只需要拷贝jbpm4.3的lib的jar包到本实例lib里面即可运行,注意用tomcat6的话必须把juel.jar,juel-engine.jar、juel-impl.jar剪切到tomcat的lib目录下。
jbpm4.3与spring整合的一个小文档
JBPM4.3与Spring会签 实例,欢迎交流ningjinlin@gmail.com
Jbpm4.4+hibernate3.5.4+spring3.0.4+struts2.1.8整合 超级详细的文档,透彻讲解JBPM与SSH的整合过程
NULL 博文链接:https://microbone.iteye.com/blog/1675612
jbpm4.3 请假流程实例示例jbpm4.3 请假流程实例示例jbpm4.3 请假流程实例示例jbpm4.3 请假流程实例示例jbpm4.3 请假流程实例示例
jbpm4.4+ssh整合还需要安装插件进入到myeclipse中 将相应的jar文件放进去 就能够运行 jbpm4.4 jar ssh(strut2,hibernate3,spring3)三大框架整合的jar包 例子是 请假流程 代码中有很好的注释 便于初学者学习
jbpm3,jbpm4用户文档,开发指南,jbpm4解读,jbpm学习笔记,jbpm最佳实践全套套
SSH jbpm4 ExtJs 完整配置 完整实例 下载请参考http://blog.csdn.net/peng_wu01/archive/2010/07/29/5774898.aspx
JBPM4.4+SSH2完整整合jar包
SSH2+JBPM+ExtJs4实战,JBPM是重点讲解。实战与demo的区别我不再多说,在以前工作中走过一些弯路,一些实现都是靠自己想象或者听其他人应该怎么实现才是项目中真正需要的。JBPM书上是讲解以工作流为核心去开发应用,...