一个请假单流程的实现(struts2.1.8+spring2.5+hibernate3集成jbpm4.3)

14年前
转自:http://abstractforever.javaeye.com/blog/608189

先说明这个只是一个例子而已,简单的介绍了一些写法,你真的理解了以后完全可以写出比这个更好的代码来。

 

网上随便找了个请假的流程图,在此先谢谢提供图片的人:



使用jbpm工具画出流程图,中文好像是乱码,所以改为英文:

 

 leave.jpdl.xml内容:

Xml代码
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2.   
  3. <process name="leave" xmlns="http://jbpm.org/4.3/jpdl">  
  4.    <start g="159,47,48,48" name="start1">  
  5.       <transition to="exclusive1"/>  
  6.    </start>  
  7.    <decision expr="#{job}" g="161,152,48,48" name="exclusive1">  
  8.       <transition g="42,179:43,-27" name="isChief" to="boosApprove"/>  
  9.       <transition g="316,175:-83,-23" name="isnotChief" to="chiefApprove"/>  
  10.    </decision>  
  11.    <state g="-3,220,92,52" name="boosApprove">  
  12.       <transition g="47,340:" to="sendEmail"/>  
  13.    </state>  
  14.    <state g="270,214,92,52" name="chiefApprove">  
  15.       <transition to="exclusive2"/>  
  16.    </state>  
  17.    <decision expr="#{day}" g="160,219,48,48" name="exclusive2">  
  18.       <transition g="-2,-20" name="gt10" to="boosApprove"/>  
  19.       <transition g="186,323:12,-47" name="le10" to="sendEmail"/>  
  20.    </decision>  
  21.    <end g="171,410,48,48" name="end"/>  
  22.    <state g="146,313,92,52" name="sendEmail">  
  23.       <transition to="end"/>  
  24.    </state>  
  25.       
  26. </process>  
 

分析之后,有如下一些表:

用户user_
角色role_(简化到user_)
请假单leave_
假设有这么几个用户:
陈均  --普通员工
唐平 --级别最高的,BOOS,老板
胡杰 --级别比较高的,chief主管
张小 --普通员工

用户测试数据:

Sql代码
  1. INSERT INTO `user_` VALUES ('9''陈均''普通员工');  
  2. INSERT INTO `user_` VALUES ('10''胡杰''主管');  
  3. INSERT INTO `user_` VALUES ('11''唐平''老板');  
  4. INSERT INTO `user_` VALUES ('12''张小''普通员工'); 

现在集成jbpm4.3,hibernate3,spring2.5,struts2.1.8。

 系统初步设计如图:



 

 

1.因为jbpm里面带有hibernate,所以创建web项目后,导入jbpm-4.3\lib下的所有包,导入jbpm-4.3\jbpm.jar,

把jbpm4.3\lib\下面得juel.jar,juel-engine.jar,juel-impl.jar放到tomcat的lib下面。导入spring2.5的jar,导入struts2.1.8所需jar包。以下jar包不是最简,有些不是必须的。

 

spring2.5所需jar包清单:

aspectjrt.jar

aspectjweaver.jar

cglib-nodep-2.1_3.jar

common-annotations.jar

commons-logging.jar

log4j-1.2.15.jar

spring.jar

spring-webmvc-struts.jar

------------------------------------

struts2.1.8所需jar包清单:

commons-fileupload-1.2.1.jar

commons-io-1.3.2.jar

freemarker-2.3.15.jar

ognl-2.7.3.jar

struts2-core-2.1.8.1.jar

struts2-dojo-plugin-2.1.8.1.jar

struts2-spring-plugin-2.1.8.1.jar

xwork-core-2.1.6.jar

-----------------------------------

数据库和数据源所需jar包:

c3p0-0.9.1.2.jar

mysql-connector-java-5.1.7-bin.jar

找到jbpm-4.3\install\src\cfg\jbpm\下的spring.jbpm.cfg.xml文件,放入项目的src处,改名为jbpm.cfg.xml.

 

在项目src下面创建applicationContext.xml配置文件,内容如下:

 

Xml代码
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <beans xmlns="http://www.springframework.org/schema/beans"  
  3.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"   
  4.     xmlns:context="http://www.springframework.org/schema/context"  
  5.      xmlns:p="http://www.springframework.org/schema/p"  
  6.     xmlns:aop="http://www.springframework.org/schema/aop"   
  7.     xmlns:tx="http://www.springframework.org/schema/tx"  
  8.     xsi:schemaLocation="http://www.springframework.org/schema/beans  
  9.            http://www.springframework.org/schema/beans/spring-beans-2.5.xsd  
  10.            http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd  
  11.            http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd  
  12.            http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd">  
  13.   
  14.     <!-- 开启注解配置 -->  
  15.     <context:annotation-config />  
  16.       
  17.     <!-- 对指定的包进行组件扫描 -->  
  18.     <context:component-scan base-package="org.forever.leave" />  
  19.   
  20.     <!-- 配置数据源,导入c3p0-0.9.1.2.jar,mysql-connector-java-5.1.7-bin.jar -->  
  21.     <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"  
  22.         destroy-method="close">  
  23.         <property name="driverClass">  
  24.             <value>com.mysql.jdbc.Driver</value>  
  25.         </property>  
  26.         <property name="jdbcUrl">  
  27.             <value>jdbc:mysql://localhost:3306/jbpmdb</value>  
  28.         </property>  
  29.         <property name="user">  
  30.             <value>root</value>  
  31.         </property>  
  32.         <property name="password">  
  33.             <value>root</value>  
  34.         </property>  
  35.     </bean>  
  36.   
  37.     <!-- 集成hibernate配置 -->  
  38.     <bean id="sessionFactory"  
  39.         class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">  
  40.         <property name="dataSource" ref="dataSource" />  
  41.         <property name="hibernateProperties" ref="hibernateProperties" />  
  42.         <property name="mappingLocations">  
  43.             <list>  
  44.                 <value>classpath*:org/forever/leave/entities/*.hbm.xml</value>  
  45.                 <value>classpath:jbpm.repository.hbm.xml</value>     
  46.                 <!-- 以下几个jbpm.*.hbm.xml由jBPM自带 -->                     
  47.                 <value>classpath:jbpm.execution.hbm.xml</value>     
  48.                 <value>classpath:jbpm.history.hbm.xml</value>     
  49.                 <value>classpath:jbpm.task.hbm.xml</value>     
  50.                 <value>classpath:jbpm.identity.hbm.xml</value>   
  51.             </list>  
  52.         </property>  
  53.     </bean>  
  54.       
  55.     <bean name="hibernateProperties"  
  56.         class="org.springframework.beans.factory.config.PropertiesFactoryBean">  
  57.         <property name="properties">  
  58.             <props>  
  59.                 <prop key="hibernate.dialect">org.hibernate.dialect.MySQLInnoDBDialect</prop>  
  60.                 <prop key="hibernate.show_sql">true</prop>  
  61.                 <prop key="hibernate.hbm2ddl.auto">update</prop>  
  62.             </props>  
  63.         </property>  
  64.     </bean>  
  65.   
  66.     <!-- jbpm配置 -->  
  67.     <bean id="springHelper" class="org.jbpm.pvm.internal.processengine.SpringHelper" />  
  68.     <bean id="processEngine" factory-bean="springHelper"  
  69.         factory-method="createProcessEngine" />  
  70.       
  71.     <!-- 模板配置自己写的,不是必须的 -->  
  72.     <bean id="jbpmTemplate" class="org.forever.leave.jbpm.JbpmTemplate">  
  73.         <property name="processEngine" ref="processEngine"></property>  
  74.     </bean>  
  75.       
  76.     <!-- 数据层用的模板工具,不是必须的 -->  
  77.     <bean id="hibernateTemplate" class="org.springframework.orm.hibernate3.HibernateTemplate">  
  78.         <property name="sessionFactory" ref="sessionFactory"></property>  
  79.     </bean>  
  80.   
  81.     <!-- 事务配置,必须 -->  
  82.     <bean id="transactionManager"  
  83.         class="org.springframework.orm.hibernate3.HibernateTransactionManager">  
  84.         <property name="sessionFactory" ref="sessionFactory" />  
  85.     </bean>  
  86.   
  87.     <!-- 切面配置 -->  
  88.     <aop:config>  
  89.         <aop:pointcut expression="execution(* org.forever.leave.biz..*.*(..))"  
  90.             id="transactionPointcut" />  
  91.         <aop:advisor advice-ref="txAdvice" pointcut-ref="transactionPointcut" />  
  92.     </aop:config>  
  93.     <!-- 通知配置 -->  
  94.     <tx:advice id="txAdvice" transaction-manager="transactionManager">  
  95.         <tx:attributes>  
  96.             <tx:method name="get*" read-only="true" propagation="NOT_SUPPORTED" />  
  97.             <tx:method name="find*" read-only="true" propagation="NOT_SUPPORTED" />  
  98.             <tx:method name="*" propagation="REQUIRED" />  
  99.         </tx:attributes>  
  100.     </tx:advice>  
  101.   
  102.   
  103.   
  104. </beans>  

添加 log4j.properties文件;

模板类JbpmTemplate:

Java代码
  1. package org.forever.leave.jbpm;  
  2.   
  3. import java.util.List;  
  4. import java.util.Map;  
  5.   
  6. import org.jbpm.api.Execution;  
  7. import org.jbpm.api.ExecutionService;  
  8. import org.jbpm.api.HistoryService;  
  9. import org.jbpm.api.ManagementService;  
  10. import org.jbpm.api.ProcessEngine;  
  11. import org.jbpm.api.ProcessInstance;  
  12. import org.jbpm.api.RepositoryService;  
  13. import org.jbpm.api.TaskService;  
  14. import org.jbpm.api.task.Task;  
  15.   
  16. /** 
  17.  * jbpm模板类(初步实现) 
  18.  *  
  19.  * @author Administrator 
  20.  *  
  21.  */  
  22. public class JbpmTemplate {  
  23.   
  24.     /** 
  25.      * 部署流程到数据库 
  26.      *  
  27.      * @param resourceName 
  28.      *            资源文件名字 比如(org/forever/jbpm/jpdl/process.jpdl.xml) 
  29.      * @return 返回流程定义id(格式:key-version) 
  30.      */  
  31.     public String Deploy(String resourceName) {  
  32.         return repositoryService.createDeployment().addResourceFromClasspath(  
  33.                 resourceName).deploy();  
  34.     }  
  35.   
  36.     /** 
  37.      * 创建一个新的流程实例 
  38.      *  
  39.      * @param processDefinitionKey 
  40.      *            (process.jpdl.xml中process标签的key) 
  41.      * @param processInstanceKey 
  42.      *            (用户给的key,比如一个请假单的id) 
  43.      * @return 流程实例 
  44.      */  
  45.     public ProcessInstance addProcessInstance(String processDefinitionKey,  
  46.             String processInstanceKey) {  
  47.         return executionService.startProcessInstanceByKey(processDefinitionKey,  
  48.                 processInstanceKey);  
  49.   
  50.     }  
  51.       
  52.     /** 
  53.      * 创建一个新的流程实例 
  54.      * @param processDefinitionKey(process.jpdl.xml中process标签的key) 
  55.      * @param variables 该流程实例要用到的变量 
  56.      * @param processInstanceKey(用户给定的业务key) 
  57.      * @return 
  58.      */  
  59.     public ProcessInstance addProcessInstance(  
  60.             String processDefinitionKey,  
  61.             Map<String, ?> variables,  
  62.             String processInstanceKey){  
  63.         return executionService.startProcessInstanceByKey(processDefinitionKey, variables, processInstanceKey);  
  64.     }  
  65.       
  66.     /** 
  67.      * 提交任务 
  68.      * @param taskId 任务id 
  69.      */  
  70.     public void completeTask(String taskId){  
  71.         taskService.completeTask(taskId);  
  72.     }  
  73.       
  74.     /** 
  75.      * 将任务流转到指定名字的流程中去 
  76.      * @param taskId 
  77.      * @param outcome 
  78.      */  
  79.     public void completeTask(String taskId,String outcome){  
  80.         taskService.completeTask(taskId, outcome);  
  81.     }  
  82.   
  83.     /** 
  84.      * 根据key获取流程实例(这里我使用的uuid) 
  85.      *  
  86.      * @param key 
  87.      *            (对应于数据库表jbpm4_execution中的KEY_字段) 
  88.      * @return 返回查找到得流程实例,没有返回null 
  89.      */  
  90.     public ProcessInstance getProcessInstance(String key) {  
  91.         return executionService.createProcessInstanceQuery()  
  92.                 .processInstanceKey(key).uniqueResult();  
  93.     }  
  94.       
  95.       
  96.     /** 
  97.      * 根据executionId获取指定的变量值 
  98.      * @param executionId 
  99.      * @param variableName 
  100.      * @return 
  101.      */  
  102.     public Object getVariableByexecutionId(String executionId,String variableName){  
  103.         return executionService.getVariable(executionId, variableName);  
  104.     }  
  105.       
  106.       
  107.     /** 
  108.      * 根据任务id获取指定变量值 
  109.      * @param taskId 
  110.      * @param variableName 
  111.      * @return 
  112.      */  
  113.     public Object getVariableByTaskId(String taskId,String variableName){  
  114.         return taskService.getVariable(taskId, variableName);  
  115.     }  
  116.       
  117.     /** 
  118.      * 获取指定用户名字的任务 
  119.      * @param userId 
  120.      * @return 
  121.      */  
  122.     public List<Task> findPersonalTasks(String userId){  
  123.         return taskService.findPersonalTasks(userId);  
  124.     }  
  125.       
  126.     /** 
  127.      * 根据任务id获取任务 
  128.      * @param taskId 
  129.      * @return 
  130.      */  
  131.     public Task getTask(String taskId) {  
  132.         return taskService.getTask(taskId);  
  133.           
  134.     }  
  135.       
  136.     /** 
  137.      * 根据流程实例id获取 
  138.      * @param executionId 
  139.      * @return 
  140.      */  
  141.     public Execution findExecutionById(String executionId) {  
  142.         return executionService.findExecutionById(executionId);  
  143.     }  
  144.   
  145.     /** 
  146.      * 彻底删除文件的部署 
  147.      *  
  148.      * @param deploymentId流程定义id 
  149.      */  
  150.     public void deleteDeploymentCascade(String deploymentId) {  
  151.         repositoryService.deleteDeploymentCascade(deploymentId);  
  152.     }  
  153.   
  154.     public JbpmTemplate() {  
  155.           
  156.     }  
  157.   
  158.     public JbpmTemplate(ProcessEngine processEngine) {  
  159.         this.processEngine = processEngine;  
  160.         repositoryService = processEngine.getRepositoryService();  
  161.         executionService = processEngine.getExecutionService();  
  162.         taskService = processEngine.getTaskService();  
  163.         historyService = processEngine.getHistoryService();  
  164.         managementService = processEngine.getManagementService();  
  165.     }  
  166.   
  167.     private ProcessEngine processEngine;  
  168.     private RepositoryService repositoryService = null;  
  169.     private ExecutionService executionService = null;  
  170.     private TaskService taskService = null;  
  171.     private HistoryService historyService = null;  
  172.     private ManagementService managementService = null;  
  173.   
  174.     public ProcessEngine getProcessEngine() {  
  175.         return processEngine;  
  176.     }  
  177.   
  178.     public void setProcessEngine(ProcessEngine processEngine) {  
  179.         this.processEngine = processEngine;  
  180.         System.out.println(processEngine);  
  181.         repositoryService = processEngine.getRepositoryService();  
  182.         executionService = processEngine.getExecutionService();  
  183.         taskService = processEngine.getTaskService();  
  184.         historyService = processEngine.getHistoryService();  
  185.         managementService = processEngine.getManagementService();  
  186.     }  
  187.   
  188.     //省略get和set方法     
  189.   
  190. }  
创建测试类Test:
Java代码
  1. import java.util.UUID;  
  2.   
  3. import org.forever.leave.jbpm.JbpmTemplate;  
  4. import org.jbpm.api.ProcessInstance;  
  5. import org.springframework.context.ApplicationContext;  
  6. import org.springframework.context.support.ClassPathXmlApplicationContext;  
  7.   
  8. public class Test {  
  9.   
  10.     public static void main(String[] args) {  
  11.         ApplicationContext context = new ClassPathXmlApplicationContext(  
  12.                 "applicationContext.xml");  
  13.   
  14.         JbpmTemplate jbpmTemplate = (JbpmTemplate) context  
  15.                 .getBean("jbpmTemplate");  
  16.         System.out.println(jbpmTemplate);  
  17.   
  18.         jbpmTemplate.Deploy("org/forever/leave/jbpm/jpdl/leave.jpdl.xml");  
  19.         UUID uuid = UUID.randomUUID();  
  20.     }  

 控制台输出没有报错说明jbpm和spring初步集成成功;

 访问http://localhost:8080/leave/user/queryList.action获取到用户列表信息,说明集成成功。

项目中需要修改mysql方言为org.hibernate.dialect.MySQLInnoDBDialect,事务service改为biz,刚发现的,呵呵

下一步进行业务的实现。

未完

因为朋友需要,所以对其进行了简单的实现:

在实现中发现集成的时候,如果你用mysql数据库,请设置你的方言为:org.hibernate.dialect.MySQLInnoDBDialect

先看一哈这个实现了简单业务的一个图,在此用的中文,也是网上找的,呵呵,我都变懒了哈:



 

对应xml文件:

Xml代码
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2.   
  3. <process key="leave" name="leave" xmlns="http://jbpm.org/4.3/jpdl">  
  4.    <start g="201,14,48,48" name="开始">  
  5.       <transition g="-42,-10" name="请假" to="填写请假单"/>  
  6.    </start>  
  7.    <task assignee="writerForm" g="178,87,92,52" name="填写请假单">  
  8.       <transition g="-97,2" name="判断是不是经理" to="是不是经理"/>  
  9.    </task>  
  10.    <decision expr="#{manager}" g="204,158,48,48" name="是不是经理">  
  11.       <transition g="-23,-11" name="否" to="经理审核"/>  
  12.       <transition g="14,-11" name="是" to="老板审批"/>  
  13.    </decision>  
  14.    <task assignee="#{username}" g="103,252,92,52" name="经理审核">  
  15.       <transition g="150,450:10,-21" name="经理批准" to="结束"/>  
  16.       <transition g="-22,-22" name="请假天数>5" to="老板审批"/>  
  17.       <transition g="-61,-1" name="经理不批准" to="终止"/>  
  18.       <transition g="149,114:-55,82" name="经理驳回" to="填写请假单"/>  
  19.    </task>  
  20.      
  21.    <!-- 这里只有一个老板,所以写死了,如果有多个老板,写法同上,业务就会改变 -->  
  22.    <task assignee="张杰" g="278,251,92,52" name="老板审批">  
  23.       <transition g="326,450:-58,-24" name="老板批准" to="结束"/>  
  24.       <transition g="7,0" name="老板不批准" to="终止"/>  
  25.       <transition g="323,114:13,61" name="老板驳回" to="填写请假单"/>  
  26.    </task>  
  27.    <end g="219,429,48,48" name="结束" state="confirm"/>  
  28.    <end g="220,360,48,48" name="终止" state="dissent"/>  
  29. </process> 

 写了个经理审批的测试类过程:

Java代码
  1. package org.forever.leave.biz.test;  
  2.   
  3. import java.util.ArrayList;  
  4. import java.util.Date;  
  5. import java.util.HashMap;  
  6. import java.util.List;  
  7. import java.util.Map;  
  8. import java.util.UUID;  
  9.   
  10. import org.forever.leave.entities.Leave;  
  11. import org.forever.leave.entities.User;  
  12. import org.jbpm.api.ProcessInstance;  
  13. import org.jbpm.api.task.Task;  
  14. import org.junit.Test;  
  15.   
  16. //请假测试  
  17. //运行顺序  
  18. //testDeploy()  
  19. //testCresteLeave()  
  20. //testStart()  
  21. //testGetTask()  
  22. //testGetLeave()  
  23. public class LeaveTest extends BaseTest{  
  24.       
  25.     //部署流程  
  26.     @Test  
  27.     public void testDeploy(){  
  28.         String resourceName ="org/forever/leave/jbpm/jpdl/leave.jpdl.xml";   
  29.         jbpmTemplate.Deploy(resourceName);  
  30.           
  31.     }  
  32.       
  33.     //新建请假单  
  34.     @Test  
  35.     public void testCresteLeave(){  
  36.           
  37.         //现假设用户陈均登陆了系统,然后进行请假  
  38.         String loginName = "cj";//登陆者  
  39.         String password = "cj";//登陆密码  
  40.         User user = userDao.get(loginName,password);  
  41.         //status=新建,就是未提交的  
  42.         UUID uuid = UUID.randomUUID();  
  43.         Leave leave = new Leave(user, 3,new Date(),"新建""生病了");  
  44.         leave.setLeaveId(uuid.toString());  
  45.         //保存到数据库  
  46.         leaveDao.save(leave);  
  47.     }  
  48.       
  49.     // 启动流程实例,提交请假申请  
  50.     //注意(如果要对该测试类成功测试,首先确保存在juel-engine.jar,juel-impl.jar,juel.jar)  
  51.     //部署到tomcat里面的时候就把juel.jar,juel-engine.jar,juel-impl.jar放到tomcat的lib下面  
  52.     @Test  
  53.     public void testStart() {  
  54.         //进行业务流转所需的变量  
  55.         String loginName = "cj";//登陆者  
  56.         String password = "cj";//登陆密码  
  57.         User user = userDao.get(loginName,password);  
  58.         // 3.启动流程实例,绑定业务key,key最好是唯一的  
  59.         List<?> list = leaveDao.findByUserLeave(user.getUserId());//该用户可能有多次请假的记录  
  60.         //假设用户选择的是index=0的那个请假单  
  61.         Leave leave = (Leave)list.get(0);  
  62.           
  63.           
  64.         String position = user.getPosition();//用户的职位  
  65.         Map<String, Object> variables = new HashMap<String, Object>();//流程中要用到的变量信息  
  66.           
  67.         variables.put("leaveId",leave.getLeaveId());//存放该实例的请假单  
  68.           
  69.         if("员工".equals(position)){//如果是员工请假  
  70.             variables.put("manager""否");  
  71.             variables.put("username","胡杰");//指定一个经理进行审批  
  72.               
  73.         }else if("经理".equals(position)){//如果是经理请假  
  74.             variables.put("manager""是");  
  75.             //只有一个boos,所以在xml中指定了,在此就不用指定了  
  76.         }  
  77.         //此时就获取到了该请假单的id  
  78.         //通过该leaveId来绑定一个流程实例  
  79.         ProcessInstance processInstance = jbpmTemplate.addProcessInstance("leave",variables, leave.getLeaveId());  
  80.         //该表单到时候是在web页面进行申请时填写好的  
  81.         System.out.println("请假单已填写:" + processInstance.isActive("填写请假单"));  
  82.           
  83.         String taskId = jbpmTemplate.findPersonalTasks("writerForm").get(0).getId();  
  84.         //让任务向下流转,提交任务  
  85.         jbpmTemplate.completeTask(taskId);  
  86.           
  87.     }  
  88.       
  89.     //获取任务集合  
  90.     @Test  
  91.     public void testGetTask(){  
  92.         //经理登陆系统,获取审批任务  
  93.         String username = "胡杰";  
  94.         List<Leave> leaves = new ArrayList<Leave>();//该经理可能对多个请假单审批,该集合提供给页面使用的  
  95.         List<Task> list = jbpmTemplate.findPersonalTasks(username);  
  96.         if(list.size()==0){  
  97.             System.out.println(username + "没有任务.........");  
  98.         }  
  99.         else{  
  100.             for (Task task : list) {  
  101.                 System.out.println("任务名字:" + task.getName());  
  102.                 System.out.println("任务参与者:" + task.getAssignee());  
  103.                 String taskId = task.getId();  
  104.                 String leaveId = (String) jbpmTemplate.getVariableByTaskId(taskId, "leaveId");  
  105.                 Leave leave = leaveDao.findbyIdLeave(leaveId);  
  106.                 leave.setTaskId(taskId);  
  107.                 leaves.add(leave);  
  108.             }  
  109.         }  
  110.           
  111.         //页面显示,并全部通过审批  
  112.         for (Leave leave : leaves) {  
  113.             System.out.println(leave);  
  114.             //批准流程  
  115.             ProcessInstance processInstance = jbpmTemplate.getProcessInstance(leave.getLeaveId());  
  116.             String taskId = leave.getTaskId();  
  117.             int day = leave.getDay();//请假天数  
  118.             if(day>5 && true){//如果大于5天,并且经理批准,也要提交给boos审核  
  119.                 jbpmTemplate.completeTask(taskId, "请假天数>5");  
  120.             }else{//直接通过,既让任务流转到结束  
  121.                 jbpmTemplate.completeTask(taskId,"经理批准");  
  122.             }  
  123.             System.out.println("审批结果:" + processInstance.getState());  
  124.             leave.setStatus("通过");  
  125.             leaveDao.update(leave);//更新结果  
  126.         }  
  127.           
  128.           
  129.     }  
  130.       
  131.     //获取指定用户的请假单集合  
  132.     @Test  
  133.     public void testGetLeave(){  
  134.         //进行业务流转所需的变量  
  135.         String loginName = "cj";//登陆者  
  136.         String password = "cj";//登陆密码  
  137.         User user = userDao.get(loginName,password);  
  138.         //页面显示用  
  139.         List<?> list = leaveDao.findByUserLeave(user.getUserId());  
  140.         for (Object object : list) {  
  141.             System.out.println(object);  
  142.             //是否已经申请  
  143.             //已经提交的请假单不能进行删除操作(所以慎重,呵呵)  
  144.             //新建状态的请假单可以进行删除操作  
  145.         }  
  146.           
  147.     }  
  148.       

 web版的我截几个效果图,具体过程你们下载来感受吧:

login.jsp登陆页面http://localhost:90/leave/login.jsp:第一次需要部署一哈



 普通员工登陆用户名和密码为cj:



 经理用户名和密码为hj,登陆后如图:




 
 老板的用户名和密码zxp,进去后如图:



 项目里面带有数据库脚本。jar自己加哈,有什么问题,欢迎交流

 项目里面带有数据库脚本。jar自己加哈,有什么问题,欢迎交流

  • 大小: 25 KB
  • 大小: 14.3 KB
  • 大小: 42.1 KB
  • 大小: 19.2 KB
  • 大小: 8.6 KB
  • 大小: 45.9 KB
  • 大小: 41 KB
  • 大小: 14.9 KB