jbpm练习小例子

在此非常感谢的人:linliangyi2007:http://linliangyi2007.iteye.com/blog/176345 主要是参考的是他的内容;

还有就是:http://www.blogjava.net/chengang/category/12967.html。以及网上其他的孜孜不倦贡献的人们。

 

 

这次模仿写的是:请假的流程

 

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


<process-definition xmlns="urn:jbpm.org:jpdl-3.1" name="testone">

 <swimlane name="bossswimlane" >
 <assignment class="com.firstflow.task.BossAssignmentHandler"></assignment>
 </swimlane>
 <start-state name="开始">
  <transition name="申请开始" to="填写病假申请单">
  </transition>
 </start-state>
 <task-node name="填写病假申请单">
  <task name="填写申请内容">
   <controller>
    <variable name="days"></variable>
   </controller>
   <assignment class="com.firstflow.task.NewLeaveAssignmentHandler">
   </assignment>
  </task>
  <transition to="天数判定" name="病假申请填写完成"></transition>
 </task-node>

 <decision name="天数判定">
  <transition to="经理审批" name="天数小于5天">
   <condition expression='#{days lt 5}'></condition>
  </transition>
  <transition to="总经理审批" name="天数大于或等于5天">
   <condition expression='#{days ge 5}'></condition>
  </transition>
 </decision>
 <task-node name="经理审批">
  <task name="经理开始审批">
   <controller>
    <variable name="fork"></variable>
   </controller>
   <assignment actor-id="manager" ></assignment>
  </task>
  <transition to="总经理审批" name="经理审批通过"></transition>
  <transition to="结束" name="经理审批未通过"></transition>
 </task-node>

 <task-node name="总经理审批">
  <task name="总经理开始审批" swimlane="bossswimlane"></task>
  <transition to="发通知" name="总经理审批通过"></transition>
  <transition to="结束" name="总经理审批未通过"></transition>
 </task-node>

 <node name="发通知">
  <action class="com.firstflow.action.NoteProcessActoinHandler"></action>
  <transition to="结束"></transition>
 </node>

 <end-state name="结束"></end-state>
</process-definition>

 

 

现在再定义相应的类:

BossAssignmentHandler : 动态委派总经理审批的类

public class BossAssignmentHandler implements AssignmentHandler {

 /**
  *
  */
 private static final long serialVersionUID = 8742291098601946988L;

 @Override
 public void assign(Assignable assignable, ExecutionContext executionContext)
   throws Exception {
  /*
   * 动态委派
   */
  ContextInstance ci = executionContext.getContextInstance();
  String user = (String)ci.getVariable("boss");
  //由于 参数“boss”这里没有添加。所以在这里就写死。。。
  assignable.setActorId("boss");

 }

}

NewLeaveAssignmentHandler  给发起申请的人的任务

 

public class NewLeaveAssignmentHandler implements AssignmentHandler {

 /**
  * 填写申请
  */
 private static final long serialVersionUID = 8742291098601946988L;

 
 @Override
 public void assign(Assignable assignable, ExecutionContext executionContext)
   throws Exception {
  /*
   * 将填写申请单的任务分配给流程发起人
   */
  ContextInstance ci = executionContext.getContextInstance();
  String user = (String)ci.getVariable("actor");
  assignable.setActorId(user);

 }

}

 

NoteProcessActoinHandler   审批通过 发通知的类

 

public class NoteProcessActoinHandler implements ActionHandler {

 /**
  *
  */
 private static final long serialVersionUID = -7942030378343202920L;


 @Override
 public void execute(ExecutionContext executionContext) throws Exception {

  ContextInstance ci = executionContext.getContextInstance();
  String user = (String)ci.getVariable("actor");
  Integer days = (Integer)ci.getVariable("days");
  System.out.println(new Date() + " 员工 " + user +  " 请假 " + days + " 天, 已批准!!!");
  /*
   * 这句别漏了,否则流程不会向下走哒
   */
  executionContext.leaveNode();
  
 }

}

 

 

当这些都定义好之后。就是要发布这个流程到数据库中了。

 

DesployTest1 类就是把流程发布到数据库中去,当然首先要一点就是你先要把jbpm的类映射到数据库中去。


public class DesployTest1 {

 /**
  * @param args
  */
 public static void main(String[] args) {
  JbpmConfiguration config = JbpmConfiguration.getInstance();

        // 创建一个 jbpm 容器

        JbpmContext jbpmContext = config.createJbpmContext();

        // 由 processdefinition.xml 生成相对应的流程定义类 ProcessDefinition

        InputStream is = null;
     try {
   is = new FileInputStream("src/main/jpdl/firstflow1/processdefinition.xml");
  } catch (FileNotFoundException e) {
   
   e.printStackTrace();
  }
        ProcessDefinition processDefinition = ProcessDefinition.parseXmlInputStream(is);

        // 利用容器的方法将流程定义数据部署到数据库上

        jbpmContext.deployProcessDefinition(processDefinition);

        // 关闭 jbpmContext

        jbpmContext.close();
        System.out.println("OK");


 }

}

 

现在就是测试类了:

 

MyFlowProcessDBTest 就是测试的类

 

public class MyFlowProcessDBTest {     
    /* 
     * 初始化jBPM配置 
     * 包含对Hibernate的数据库初始化 
     */ 
    static JbpmConfiguration jbpmConfiguration = JbpmConfiguration.getInstance();      
    public static void main(String[] args){  
        MyFlowProcessDBTest test = new MyFlowProcessDBTest();  
        test.testApplication();  
       // test.test6000YuanApplication();  
       // test.test7000YuanApplication();  
    }  
      
    public void testApplication(){  
        ProcessInstance pi = createProcessInstance("lecord");  
        submitApplication("lecord" , 6);  
        approveByManager(true); 
        approveByBoss(true);
        checkTasks(pi);  
    }  
  
    /** 
     * 生成流程实例  
     */ 
    protected ProcessInstance createProcessInstance(String user){  
        System.out.println("==请假流程开始==");  
        JbpmContext jbpmContext = jbpmConfiguration.createJbpmContext();  
        try {  
             GraphSession graphSession = jbpmContext.getGraphSession();  
             /* 
              * 从数据库获取指定的流程定义 
              */ 
             ProcessDefinition pdf  = graphSession.findLatestProcessDefinition("testone");  
             //生成流程实例  
             ProcessInstance pi = pdf.createProcessInstance();  
             //设置流程发起人  
             pi.getContextInstance().createVariable("actor", user);  
             //触发流程转向  
             pi.signal();  
             /* 
              * 保存流程实例  
              */ 
             jbpmContext.save(pi);             
             return pi;  
        }finally{  
            jbpmContext.close();  
        }  
    }  
      
    /** 
     * 填写提交申请单 
     * @param money 
     */ 
    @SuppressWarnings("unchecked")  
    protected void submitApplication(String actorId , int days){  
        System.out.println("==填写请假内容==");   
        JbpmContext jbpmContext = jbpmConfiguration.createJbpmContext();  
        try {     
            /* 
             *根据操作者ID,获取属于该操作者的任务集 
             */ 
            List<TaskInstance> taskInstances = jbpmContext.getTaskList(actorId);            
            for(TaskInstance ti : taskInstances){
             System.out.println(ti.getCreate());
                System.out.println("ti.name = " + ti.getName());  
                System.out.println("ti.actor = " + ti.getActorId());  
                ContextInstance ci = ti.getContextInstance();  
                ci.setVariable("days",new Integer(days));  
                ti.end();  
            }             
        }finally{  
            jbpmContext.close();      
        }  
    }  
      
    /** 
     * 部门经理审批 
     * @param pass 
     */ 
    @SuppressWarnings("unchecked")  
    protected void approveByManager(boolean pass){        
        System.out.println("==经理审批==");  
        JbpmContext jbpmContext = jbpmConfiguration.createJbpmContext();  
        try{  
            List<TaskInstance> taskInstances = jbpmContext.getTaskList("manager"); 
            System.out.println(taskInstances.size()+"-------经理该审批的taskInstances---------");
           
            for(TaskInstance ti : taskInstances){             
                System.out.println("ti.name = " + ti.getName());  
                System.out.println("ti.actor = " + ti.getActorId());  
                 if(pass){  
                     ti.end("经理审批通过");          
                }else{  
                    ti.end("经理审批未通过");  
                }             
            }  
        }finally{  
            jbpmContext.close();  
        }  
    }  
      
    /** 
     * 总经理审批 
     * @param pass 
     */ 
    @SuppressWarnings("unchecked")  
    protected void approveByBoss(boolean pass){  
        System.out.println("==总经理审批==");          
        JbpmContext jbpmContext = jbpmConfiguration.createJbpmContext();  
        try{  
            List<TaskInstance> taskInstances = jbpmContext.getTaskList("boss");  
            for(TaskInstance ti : taskInstances){  
                System.out.println("ti.name = " + ti.getName());  
                System.out.println("ti.actor = " + ti.getActorId());  
                 if(pass){  
                     ti.end("总经理审批通过");       
                }else{  
                    ti.end("总经理审批未通过");  
                }  
            }  
        }finally{  
            jbpmContext.close();  
        }  
    }  
       }

 

 

这个只是模仿的做的。还有很多的不足。引用了别人的成功希望别介意哦。。

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值