一個請假單流程的實現(struts2.1.8+spring2.5+hibernate3集成jbpm4.3)

lovegis 14年前發布 | 5K 次閱讀 C 語言 報表工具 文檔管理

轉自:http://abstractforever.javaeye.com/blog/608189

先說明這個只是一個例子而已,簡單的介紹了一些寫法,你真的理解了以后完全可以寫出比這個更好的代碼來。

 

網上隨便找了個請假的流程圖,在此先謝謝提供圖片的人:



使用jbpm工具畫出流程圖,中文好像是亂碼,所以改為英文:

 

 leave.jpdl.xml內容:

Xml代碼
</div>
  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>  
</div> 

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

用戶user_
角色role_(簡化到user_)
請假單leave_
假設有這么幾個用戶:
陳均  --普通員工
唐平 --級別最高的,BOOS,老板
胡杰 --級別比較高的,chief主管
張小 --普通員工

用戶測試數據:

Sql代碼
</div>
  1. INSERT INTO `user_` VALUES ('9''陳均''普通員工');  
  2. INSERT INTO `user_` VALUES ('10''胡杰''主管');  
  3. INSERT INTO `user_` VALUES ('11''唐平''老板');  
  4. INSERT INTO `user_` VALUES ('12''張小''普通員工'); 
</div>

現在集成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代碼
</div>
  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>  
</div>

添加 log4j.properties文件;

模板類JbpmTemplate:

Java代碼
</div>
  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. }  
</div> 創建測試類Test:

Java代碼
</div>
  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.     }  

</div>

 控制臺輸出沒有報錯說明jbpm和spring初步集成成功;

 訪問http://localhost:8080/leave/user/queryList.action獲取到用戶列表信息,說明集成成功。

項目中需要修改mysql方言為org.hibernate.dialect.MySQLInnoDBDialect,事務service改為biz,剛發現的,呵呵

下一步進行業務的實現。

未完

因為朋友需要,所以對其進行了簡單的實現:

在實現中發現集成的時候,如果你用mysql數據庫,請設置你的方言為:org.hibernate.dialect.MySQLInnoDBDialect

先看一哈這個實現了簡單業務的一個圖,在此用的中文,也是網上找的,呵呵,我都變懶了哈:



 

對應xml文件:

Xml代碼
</div>
  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> 
</div>

 寫了個經理審批的測試類過程:

Java代碼
</div>
  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.       

</div>

 web版的我截幾個效果圖,具體過程你們下載來感受吧:

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



 普通員工登陸用戶名和密碼為cj:



 經理用戶名和密碼為hj,登陸后如圖:




 
 老板的用戶名和密碼zxp,進去后如圖:



 項目里面帶有數據庫腳本。jar自己加哈,有什么問題,歡迎交流

 項目里面帶有數據庫腳本。jar自己加哈,有什么問題,歡迎交流

    </p><ul style="display: none;"><li><a href="/misc/goto?guid=5033701441438621600" target="_blank" target="_blank"><img src="http://dl.javaeye.com/upload/attachment/212036/d8afd312-a483-34bd-9ea4-3fed64569630-thumb.gif" class="magplus" title="點擊查看原始大小圖片"></a></li><li>大小: 25 KB</li></ul>



    <ul style="display: none;"><li><a href="/misc/goto?guid=5033701441542109889" target="_blank" target="_blank"><img src="http://dl.javaeye.com/upload/attachment/212373/e281c5f6-5e02-362e-8f8a-5118e50404cc-thumb.png" class="magplus" title="點擊查看原始大小圖片"></a></li><li>大小: 14.3 KB</li></ul>



    <ul style="display: none;"><li><a href="/misc/goto?guid=5033701441637252122" target="_blank" target="_blank"><img src="http://dl.javaeye.com/upload/attachment/212589/fd4de4c5-eead-33e8-aba4-3501c5e67549-thumb.jpg" class="magplus" title="點擊查看原始大小圖片"></a></li><li>大小: 42.1 KB</li></ul>



    <ul><li><a href="/misc/goto?guid=5033701441727972635" target="_blank" target="_blank">leave_集成完成_.rar</a> (51.8 KB)</li></ul>



    <ul style="display: none;"><li><a href="/misc/goto?guid=5033701441833385302" target="_blank" target="_blank"><img src="http://dl.javaeye.com/upload/attachment/239719/a5b67170-ebb6-3af8-b112-73f6eb0b9919-thumb.png" class="magplus" title="點擊查看原始大小圖片"></a></li><li>大小: 19.2 KB</li></ul>



    <ul style="display: none;"><li><a href="/misc/goto?guid=5033701441934829249" target="_blank" target="_blank"><img src="http://dl.javaeye.com/upload/attachment/239733/ae590370-485f-34a2-9526-7a31569b9cd0-thumb.jpg" class="magplus" title="點擊查看原始大小圖片"></a></li><li>大小: 8.6 KB</li></ul>



    <ul style="display: none;"><li><a href="/misc/goto?guid=5033701442024371832" target="_blank" target="_blank"><img src="http://dl.javaeye.com/upload/attachment/239735/b1e7f62e-bf88-3429-8d8a-e2f18c7059eb-thumb.jpg" class="magplus" title="點擊查看原始大小圖片"></a></li><li>大小: 45.9 KB</li></ul>



    <ul style="display: none;"><li><a href="/misc/goto?guid=5033701442130348810" target="_blank" target="_blank"><img src="http://dl.javaeye.com/upload/attachment/239741/f041faae-6eee-35d6-9b54-e7e1d488c6fd-thumb.jpg" class="magplus" title="點擊查看原始大小圖片"></a></li><li>大小: 41 KB</li></ul>



    <ul style="display: none;"><li><a href="/misc/goto?guid=5033701442235783922" target="_blank" target="_blank"><img src="http://dl.javaeye.com/upload/attachment/239743/9362b0fa-b1e8-3deb-b506-d6ddf0dca660-thumb.jpg" class="magplus" title="點擊查看原始大小圖片"></a></li><li>大小: 14.9 KB</li></ul>



    <ul><li><a href="/misc/goto?guid=5033701442335083321" target="_blank" target="_blank">leave_業務實現版_20100425.rar</a> (126.5 KB)</li></ul>

</div>

 本文由用戶 lovegis 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!
寫博客

博客分類