同志们,我这边有这么几个需求,麻烦同志们抽时间帮忙回复一下,不胜感激~~~1:首先我对JBPM4.4父子流程的概念还是不怎么搞得清楚,希望有哥们帮忙给个具体例子,就是一个简单的有父流程,还有子流程的例子2: 怎么能实现从子流程中自由回退回父流程去
麻烦大家了,谢谢~~~

解决方案 »

  1.   

    嗯  只有是有帮助的,分时一定会给的给我一个具体的代码,行吗???我的邮箱:[email protected]
    谢谢
      

  2.   

      private static final long serialVersionUID = 1L;   
      
        /**  
         * 传递会签意见的变量  
         */  
        public static final String VAR_SIGN  = "sign";   
           
        /**  
         * 审批通过的转移路径  
         */  
        private String transitionPassName;   
           
        /**  
         * 审批不通过的转移路径  
         */  
        private String transitionNoPassName;   
           
        /**  
         * 父节点任务ID  
         */  
        private String parentTaskId;   
           
        /**  
         * 主任务  
         */  
        private Task   parentTask;   
        /**  
         * 流程ID,运行时计算得出  
         */  
        private String pid;   
        /**  
         * 会签对象任务,由客户端通过setter方法注入  
         */  
        private Task joinsignTask;   
           
        public String getPid() {   
            return pid;   
        }   
      
        public void setJoinsignTask(Task joinsignTask) {   
            this.joinsignTask = joinsignTask;   
        }   
      
           
      
        /**构造方法  
         * @param transitionPassName  
         * @param trainsitionNoPassName  
         * @param parentTaskId  
         */  
        public CounterSignCommand(String transitionPassName,   
                String trainsitionNoPassName, String parentTaskId) {   
            super();   
            this.transitionPassName = transitionPassName;   
            this.transitionNoPassName = trainsitionNoPassName;   
            this.parentTaskId = parentTaskId;   
        }   
      
        /* (non-Javadoc)  
         * @see org.jbpm.api.cmd.Command#execute(org.jbpm.api.cmd.Environment)  
         */  
        @Override  
        public Boolean execute(Environment environment) throws Exception {   
               
            //获取任务服务   
            TaskService taskService  = environment.get(TaskService.class);   
               
            //计算出主任务和流程实例ID   
            this.parentTask  =  taskService.getTask(parentTaskId);   
            this.pid         =  parentTask.getExecutionId();   
            //获取当前的会签任务   
            String  joinsignTaskId   = joinsignTask.getId();   
               
               
               
            //从当前会签任务的历史变量里面获取‘会签意见’   
            String sign = (String) taskService.getVariable(parentTaskId, VAR_SIGN);    
            //设定规则{一票否决}:会签意见为 {false,no,不同意} ,则表示否决   
            if(StringUtils.equalsIgnoreCase("false", sign)||StringUtils.equalsIgnoreCase("no", sign)||   
                    StringUtils.equalsIgnoreCase("不同意", sign)){   
                //首先结束会签任务   
                taskService.completeTask(joinsignTaskId);   
                //为会签主任务增加一条会签意见的注释记录,一杯日后查询   
                taskService.addTaskComment(parentTaskId, joinsignTask.getAssignee()+"审批意见:"+ VAR_SIGN);   
                   
                //结束主任务并流向预定义的会签否决转移   
                taskService.completeTask(parentTaskId, transitionNoPassName);  
                //全部结束oa待办
                updateOATodo(joinsignTaskId,pid,parentTask.getActivityName());
                //返回true,表示会签活动结束   
                return true;   
            }   
            //会签任务通过   
            taskService.completeTask(joinsignTaskId); 
            //将当前的用户的协作关系清掉 避免待办任务里继续出现(这里属于特殊处理)
            String delSql = "delete jbpm4_participation where task_='"+parentTaskId+"' and userid_=(select t.assignee_ from jbpm4_task t where t.dbid_='"+joinsignTaskId+"' )";
            ExecUtil eu = new ExecUtil();
    eu.setSQL(delSql);
    eu.exec();
            //结束当前oa待办
            updateOATodo(joinsignTaskId,null,null);
            //System.out.println(joinsignTaskId);   
            //为主任务增加一条注释   
            taskService.addTaskComment(parentTaskId, joinsignTask.getAssignee()+"审批意见:"+ VAR_SIGN);   
            //taskService.getSubTasks(parentTaskId).size();// 此处会出错。。   
            //判断是否还有会签子任务   
            if(taskService.getSubTasks(parentTaskId).size() == 0){   
                   
                //已无会签子任务,表明全体会签通过   
                //结束主任务,并流向会签通过转移   
                taskService.completeTask(parentTaskId, transitionPassName);   
                //返回true,表示会签活动结束   
                return true;   
            }   
            //返回false。表示会签活动尚未结束,继续惊进行   
            return false;   
        }  
      

  3.   

    行 
    <start g="61,6,48,48" name="start1">
          <transition to="拟定需求"/>
       </start>
       <task form="forwardbyparm.do?target=BPM/client/qd/startRequestInfo" g="34,87,101,52" name="拟定需求">
        <on event="end">
       <event-listener class="org.huitu.business.utask.util.bpmtasklistener.HuiTaskEndListener">
        </event-listener>
      </on>
          <transition g="267,111:-76,-15" name="提交" to="市场部主任一次会签"/>
       </task>
       <task form="forwardbyparm.do?target=BPM/client/qd/sign" g="204,175,126,52" name="市场部主任一次会签">
          <description>{participant:{type:'Role',param1:'R_SIGN_SCBZR'}}</description>
          <assignment-handler class="org.huitu.business.utask.util.sign.CommercialTripAssignment">
           <field name="participantRule"><string value="{type:'Role',param1:'R_SIGN_SCBZR'}"/></field>
          </assignment-handler>
          <transition g="156,205:-6,-29" name="不同意" to="需求打回"/>
          <transition g="-13,-14" name="同意" to="市场部承办人会签"/>
       </task>流程图
      

  4.   

    <assignment-handler class="org.huitu.business.utask.util.sign.CommercialTripAssignment">
       <field name="participantRule"><string value="{type:'Role',param1:'R_SIGN_SCBZR'}"/></field>
       </assignment-handler>这个类会处理启动子流程CommercialTripAssignment.java
    public class CommercialTripAssignment implements AssignmentHandler{
    /**
     * 
     */
    private static final long serialVersionUID = -3920702116151020548L;  /**  
         *  获取流程引擎  
         */  
        private final static ProcessEngine  processEngine  = (ProcessEngine)  HuiServiceManager.getInstance().getIocService("processEngine");
           
        /**  
         * 任务服务  
         */  
        private final static TaskService    taskService    =  processEngine.getTaskService();   
        /**  
         * 参与人员,从流程变量获取  
         */  
        private List<String>  participants;  
        
        /**  
         * 参与人员,从配置文件中读取  
         */  
        private List<HuiParticipant> participant;
        
        /**
     * 参与者规则
     */
    String participantRule;
           
        @Override  
        public void assign(Assignable assignable, OpenExecution execution)   
                throws Exception { 
        
         // 获取会签参与人
         HuiParticipantRule rule = HuiParticipantRuleUtil.getParticipantRule4Handler(participantRule);
    participant = ParticipantParserUtil.getParticipants4Handler(rule, execution);
        
        
            // 获取会签参与人   
            //participants  = (List<String>) execution.getVariable("participants");   
            
            String pid = execution.getProcessInstance().getId();   
               
            //获取主任务   
            Task task = taskService.createTaskQuery().processInstanceId(pid).activityName(execution.getName()).uniqueResult();   
               
            createSubTask(task,execution);   
        }   
      
        /**创建子任务  
         * @param task  
         */  
        private void createSubTask(Task task,OpenExecution execution){   
                if(participant!=null&&!participant.isEmpty()){ 
                
                 for (HuiParticipant p : participant) {
                  //创建子流程   
                        Task  subTask  = ((OpenTask)task).createSubTask();   
                        //设置会签参与者为子任务的分配者   
                        subTask.setAssignee(p.getCode()); 
                        //oa待办
                        insertOATodo(subTask,execution);
                        //关联主任务   
                        taskService.addTaskParticipatingUser(task.getId(), p.getCode(), Participation.CLIENT);  
    }
                
                 /*
                    for (String participant : participants) {   
                        //创建子流程   
                        Task  subTask  = ((OpenTask)task).createSubTask();   
                           
                        //设置会签参与者为子任务的分配者   
                        subTask.setAssignee(participant);   
                        //关联主任务   
                        taskService.addTaskParticipatingUser(task.getId(), participant, Participation.CLIENT);   
                    }  */ 
                }   
        } 
        
    }这样就有了多个子任务
     
      

  5.   

    //设置任务变量
    processEngine.getTaskService().setVariables(bpmCtlParam.getTaskid(), var);
    CounterSignCommand  cmd = new CounterSignCommand("同意", "不同意", bpmCtlParam.getTaskid());
    boolean b = false;
     //获取真正的子任务taskid 
    String sql = "select dbid_ taskid from jbpm4_task t where t.supertask_ = '"+bpmCtlParam.getTaskid()+"' and t.assignee_ ='"+bpmCtlParam.getCuruser().getCode()+"'";
    QueryUtil qu = new QueryUtil();
    qu.setWholeSQL(sql);
    List list = qu.list();
    String taskid = ((Map)list.get(0)).get("taskid").toString();

            Task subtask  = processEngine.getTaskService().getTask(taskid);//.findPersonalTasks("jacky").get(0);   
           
            cmd.setJoinsignTask(subtask);   
            b =processEngine.execute(cmd);
    //执行代码见第一个回复
    processEngine.execute(cmd);