• jBPM4.3+ssh+会签 整合配置及完整实例


      大佬们的项目里有用到会签,所以趁双休日研究了下。

      其实也是简单的会签情况,不过开始的时候研究了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来调试,就会了解整个会签过程了。

    本文转自:http://hellotommy.iteye.com/blog/996266

  • 相关阅读:
    PouchDB:一款受CouchDB启发的离线Web数据库
    如何使用JPA注解映射枚举类型
    重新排列参数
    sql不同数据处理方式完成同一处理结果对日志增长的影响
    那些让我念念不忘的 Firefox 扩展
    Linux现可运行于Windows Azure上
    Vector Fabrics推出多核软件优化工具Pareon
    分解公式 sql
    sql树形数据生成xml
    Microsoft .NET终于提供了一个通用的Zip库
  • 原文地址:https://www.cnblogs.com/dreammyle/p/4025762.html
Copyright © 2020-2023  润新知