`

spring2.5+jbpm4.3会签例子

阅读更多

导入jbpm4.3所有包,我用的mysql,c3数据源


jar包加上,可以直接跑测试类,源码带注释,我变懒了。
 项目中的CountersignActivity类更新为如下代码,之前的有点问题:

package com.bjhy.oa.service.workflow.util;

import java.util.HashMap;
import java.util.Map;

import org.jbpm.api.ExecutionService;
import org.jbpm.api.JbpmException;
import org.jbpm.api.TaskService;
import org.jbpm.api.activity.ActivityExecution;
import org.jbpm.api.task.Task;
import org.jbpm.jpdl.internal.activity.JpdlExternalActivity;
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.history.model.HistoryTaskImpl;
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.script.ScriptManager;
import org.jbpm.pvm.internal.session.DbSession;
import org.jbpm.pvm.internal.task.TaskImpl;

import com.bjhy.oa.service.workflow.util.CountersignUser.Conclusion;

/**
 * 定制会签元素标签
 * 
 */
public class CountersignActivity extends JpdlExternalActivity {

	private static final long serialVersionUID = 1673162002085098868L;

	/**
	 * 默认的会签信息在上下文中的名字
	 */
	public static final String DEFAULT_COUNTERSIGN_VAR_NAME = "COUNTERSIGN";

	/**
	 * 任务的参与者,多个参与者用;号隔开
	 */
	private String assignees;

	/**
	 * Task的名字,可以不设置,不设置时将采用Activity的名字
	 */
	private String name;

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public String getAssignees() {
		return assignees;
	}

	public void setAssignees(String assignees) {
		this.assignees = assignees;
	}

	/**
	 * 执行表达式语句获取结果
	 * 
	 * @param express
	 * @return
	 * @throws JbpmException
	 */
	protected String evaluateExpression(String express) throws JbpmException {
		if (express != null) {
			express = express.trim();
			if (express.length() > 0) {
				ScriptManager scriptManager = ScriptManager.getScriptManager();
				Object result = scriptManager.evaluateExpression(express, null);
				if (result != null) {
					express = result.toString();
				}
			}
		}
		return express;
	}

	/**
	 * 创建新的任务
	 * 
	 * @return
	 */
	private TaskImpl createCounterSignTask(DbSession dbsession,
			ExecutionImpl execution) {
		TaskImpl task = dbsession.createTask();
		String taskName = name == null ? execution.getActivityName() : name;
		task.setName(taskName);
		task.setExecution(execution);
		task.setProcessInstance(execution.getProcessInstance());
		task.setSignalling(false);
		dbsession.save(task);
		HistoryEvent.fire(new TaskActivityStart(task), execution);
		return task;
	}

	/**
	 * 创建会签子任务
	 * 
	 * @param dbsession
	 * @param execution
	 * @param task
	 * @param user
	 * @param ht
	 */
	public void newCounterSignSubTask(DbSession dbsession,
			ExecutionImpl execution, TaskImpl task, String user,
			HistoryTaskImpl ht) {
		TaskImpl subtask = task.createSubTask();
		subtask.setName(task + "_" + user);
		subtask.setAssignee(user);
		subtask.setSignalling(false);
		dbsession.save(subtask);
		ht.addSubTask(dbsession.get(HistoryTaskImpl.class, subtask.getDbid()));
	}

	/**
	 * 实例创建的时候会调用该方法
	 */
	public void execute(ActivityExecution activityExecution) {
		ExecutionImpl execution = (ExecutionImpl) activityExecution;
		// 创建当前任务
		DbSession dbsession = EnvironmentImpl.getFromCurrent(DbSession.class);
		ExecutionService executionService = EnvironmentImpl
				.getFromCurrent(ExecutionService.class);
		TaskImpl taskImpl = createCounterSignTask(dbsession, execution);
		HistoryTaskImpl ht = dbsession.get(HistoryTaskImpl.class, taskImpl
				.getDbid());

		CountersignInfo countersignInfo = new CountersignInfo();// 处理会签过程的类
		Map<String, CountersignUser> users = new HashMap<String, CountersignUser>();

		// 创建子任务
		for (String assignee : assignees.split(";")) {
			newCounterSignSubTask(dbsession, execution, taskImpl, assignee, ht);
			CountersignUser user = new CountersignUser(assignee);
			users.put(assignee, user);
		}

		countersignInfo.setUsers(users);// 保存所有用户
		countersignInfo.setCountersignStrategy(new AllAgreeStrategy());// 设置会签策略
		String name = activityExecution.getActivityName();
		dbsession.flush();
		executionService.setVariable(activityExecution.getId(), name
				+ "_COUNTERSIGN_INFO", countersignInfo);

		execution.waitForSignal();
	}

	/**
	 * 流程执行的时候会调用该方法
	 */
	public void signal(ActivityExecution activityExecution, String signalName,
			Map<String, ?> parameters) throws Exception {
		ExecutionImpl execution = (ExecutionImpl) activityExecution;
		ExecutionService executionService = EnvironmentImpl
				.getFromCurrent(ExecutionService.class);
		TaskService taskService = EnvironmentImpl
				.getFromCurrent(TaskService.class);
		String executionId = activityExecution.getId();
		Activity activity = execution.getActivity();
		Map<String, Object> variables = executionService.getVariables(
				executionId, executionService.getVariableNames(executionId));
		// 获取子任务
		Task subTask = (Task) parameters.get("subTask");
		Task superTask = ((TaskImpl) subTask).getSuperTask();
		taskService.completeTask(subTask.getId());// 结束子任务

		// 收集会签意见
		String countersignAgree = (String) parameters.get("countersignAgree");// 会签意见内容
		Conclusion conclusion = (Conclusion) parameters.get("conclusion");// 会签选择
		String assignee = subTask.getAssignee();// 会签人
		
		
		// 更新集合信息
		CountersignInfo countersignInfo = (CountersignInfo) variables
				.get(superTask.getActivityName() + "_COUNTERSIGN_INFO");

		Map<String, CountersignUser> users = countersignInfo.getUsers();
		CountersignUser countersignUser = users.get(assignee);
		countersignUser.setConclusion(conclusion);
		countersignUser.setCountersignAgree(countersignAgree);

		boolean allSign = true;

		// 遍历是否会签完毕
		for (CountersignUser item : users.values()) {
			if (item.getConclusion() == Conclusion.NOSTART) {
				allSign = false;
			}
		}
		countersignInfo.setAllSign(allSign);
		// 如果会签完毕,计算结果
		if (allSign) {
			countersignInfo.calculate();
			String agree = "同意";
			// 如果结果为否决
			if (countersignInfo.getConclusion() == Conclusion.DENED) {
				agree = "不同意";
			}
			variables.put("agree", agree);
			// 更新集合信息
			executionService.setVariables(executionId, variables);
			// 提交父任务
			// 会签完毕,删除父任务
			
			taskService.completeTask(superTask.getId());// 结束子任务
			Transition transition = null;
			if ((signalName == null)
					|| ((Task.STATE_COMPLETED.equals(signalName))
							&& (activity.getOutgoingTransitions() != null) && (activity
							.getOutgoingTransitions().size() == 1))) {
				transition = activity.getOutgoingTransitions().get(0);
			} else {
				transition = activity.findOutgoingTransition(signalName);
			}

			execution.take(transition);
			return;
		} else {
			// 否则继续等待
			execution.waitForSignal();
		}

	}

}

 CountersignUser类:

/**
 * 每个会签人的信息(可以根据需求写到数据库中)
 * 
 */
public class CountersignUser implements Serializable {

	private static final long serialVersionUID = -555010710697671504L;

	public enum Conclusion implements Serializable {
		/** 通过 */
		AGREE("同意"),
		/** 否决 */
		DENED("不同意"),
		/** 弃权 */
		ABSTAIN("弃权"),
		/** 还未查阅 */
		NOSTART("未查阅");
		
		private String desc;
		
		private Conclusion(String desc){
			this.desc = desc;
		}

		public String getDesc(){
			return desc;
		}
		
		
		
		
	}
	
	private Integer id;// 主键id
	private String assignee;// 参与者名字,唯一的
	private Conclusion conclusion = Conclusion.NOSTART;// 每个人的选择
	private String countersignAgree;// 意见内容

	public CountersignUser() {
		super();
	}

	public CountersignUser(String assignee) {
		super();
		this.assignee = assignee;
	}

	public Integer getId() {
		return id;
	}

	public String getCountersignAgree() {
		return countersignAgree;
	}

	public void setCountersignAgree(String countersignAgree) {
		this.countersignAgree = countersignAgree;
	}

	public void setId(Integer id) {
		this.id = id;
	}

	public String getAssignee() {
		return assignee;
	}

	public void setAssignee(String assignee) {
		this.assignee = assignee;
	}

	public Conclusion getConclusion() {
		return conclusion;
	}

	public void setConclusion(Conclusion conclusion) {
		this.conclusion = conclusion;
	}

}

 

  • 大小: 5.1 KB
分享到:
评论
2 楼 zhangyg 2010-12-20  
示例代码和文章中的代码不一致,请问以哪个为准。
示例中在子任务都结束后,没有删除父任务,请问是不是有问题。
没有这个代码:taskService.completeTask(superTask.getId());
1 楼 guofengcn 2010-07-20  
我过来支持来了!

相关推荐

    SSH+JBPM4.3的整合 JBPM4.3

    SSH+JBPM4.3的整合是企业级应用开发中的一种常见组合,SSH指的是Spring、Struts和Hibernate这三个开源框架的集成,而JBPM4.3则是一个强大的工作流管理系统,用于实现业务流程自动化。这篇内容将深入探讨这两个技术...

    jbpm4整合struts2+spring2.5+hibernate3.3

    【jbpm4整合struts2+spring2.5+hibernate3.3】的集成是企业级应用开发中常见的技术栈组合,旨在利用各框架的优势实现高效、灵活的业务流程管理。jbpm4是一个开源的工作流管理系统,用于定义、执行和管理业务流程。...

    S2SH+e3p0+jbpm4.3完美实例内涵测试代码oracle

    【标题】"S2SH+e3p0+jbpm4.3完美实例内涵测试代码oracle" 提供了一个集成框架的实践案例,其中包含了Spring、Struts2、Hibernate(S2SH)与e3p0数据源以及jbpm4.3工作流引擎的整合,并附带了针对Oracle数据库的测试...

    jbpm4.0实例(整合spring2.5+ext3.0+hibernate)

    jbpm4.0实例(整合spring2.5+ext3.0+hibernate)

    jbpm4.3 会签的实现

    【jbpm4.3 会签的实现】 在企业级工作流管理系统中,会签(Concurrence Signature)是一种常见的审批流程模式,它允许多个审批人同时参与同一个任务的处理,只有当所有指定的审批人都完成他们的操作后,任务才会被...

    jbpm4.3与spring整合

    ### jbpm4.3与Spring框架的整合指南 在企业级应用开发中,流程管理引擎JBPM(JBoss Business Process Management)与Spring框架的结合使用是常见的一种技术方案。JBPM是一个灵活、强大的业务流程管理工具,而Spring...

    JBPM4.3 Spring会签 实例

    **JBPM4.3与Spring整合的会签实例详解** JBPM(Java Business Process Management)是一个开源的工作流管理系统,主要用于处理业务流程自动化。在JBPM4.3版本中,它提供了一个强大的工作流引擎,可以方便地实现复杂...

    JBPM4.3-例子(简单使用)

    在这个例子中,我们将深入探讨JBPM4.3的简单使用,特别是通过一个名为“leave_web”的Web应用程序来展示其核心功能。 首先,让我们了解JBPM4.3的主要特性。这个版本引入了改进的图形化工作流设计器,使得流程模型的...

    jbpm4.3官方例子及文档

    5. **集成能力(Integration Capabilities)**:jbpm4.3可以与多种系统集成,如EJB、Spring、Hibernate等,使得流程可以与其他企业服务交互。 接下来,我们探讨一下jbpm4.3的实例项目: - **examples目录**:这个...

    jbpm3.2.2+spring2.5+hibernate3.0+struts2.0

    jbpm负责流程管理,Spring2.5作为整体的容器,管理各个组件的生命周期和依赖关系,Hibernate3.0处理数据库交互,而Struts2.0则作为前端控制器,处理用户请求并展示结果。这样的组合在当时的开发环境中非常流行,因为...

    jbpm4.3工作流程管理例子

    在这个"jbpm4.3工作流程管理例子"中,我们将深入探讨jbpm4.3的核心特性和如何利用它来构建实际的工作流程应用。 一、jbpm4.3核心特性 1. 工作流引擎:jbpm4.3提供了强大的工作流引擎,可以执行基于流程定义的业务...

    开源工具 jbpm4.3

    **jbpm4.3:开启开源工作流新篇章** jbpm4.3是一个强大的开源工作流管理系统,它允许开发者和业务分析师以图形化的方式设计、执行和管理业务流程。这个工具的核心在于将复杂的业务逻辑转化为计算机可以理解并执行的...

    ssh+jbpm-4.3集成案例

    在这个"ssh+jbpm-4.3集成案例"中,我们将探讨如何将SSH框架与Jbpm 4.3版本相结合,以实现业务流程自动化和管理。Jbpm 4.3是Jbpm的一个较旧但仍然广泛使用的版本,它提供了工作流定义、任务管理和监控等功能。 1. **...

    jbpm4.3+tomcat6简单例子

    本示例主要实现了流程的基本管理,流程实例的管理,...使用本例子只需要拷贝jbpm4.3的lib的jar包到本实例lib里面即可运行,注意用tomcat6的话必须把juel.jar,juel-engine.jar、juel-impl.jar剪切到tomcat的lib目录下。

    JBPM4.3培训学习视频, 包含了JBPM4.3的eclipse插件

    【JBPM4.3培训学习视频】是一套针对初学者设计的教程,旨在帮助学习者掌握JBPM4.3这一企业级工作流管理系统的核心概念和技术。JBPM是Java Business Process Management的缩写,是一个开源的工作流和业务流程管理平台...

    spring+struts1+hibernate+jbpm实例

    标题中的"spring+struts1+hibernate+jbpm实例"揭示了这是一个基于Java技术栈的Web应用程序开发实例,其中涉及四大核心技术:Spring、Struts1、Hibernate和JBPM。接下来,我们将深入探讨这些技术及其在实际项目中的...

    jbpm4.3-spring2.5整合

    jbpm4.3-spring2.5整合是一个关键的话题,涉及到企业级工作流管理系统Jbpm与Spring框架的集成。Jbpm是一个开源的工作流程管理(BPM)和业务规则管理系统,它允许开发者设计、执行、管理和监控业务流程。而Spring是...

Global site tag (gtag.js) - Google Analytics