`
sunbin
  • 浏览: 349659 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

jbpm4.4学习总结(四)请假流程

    博客分类:
  • jbpm
 
阅读更多

 

 

 

一、创建流程实例

  • 界面部分概述:员工登录后填写请假单,然后点击提交……
  • 后台java处理:由于我没有用到hibernate,所以都是jdbc操作数据库(真心后悔没用hibernate),总的思路如下:
  1. Struct2接收完请假信息后,调用service层我写好的函数(jbpm相关操作)
  2.  punlic ProcessInstance createProcessInstance(String actorId);请看注释:
    1. /**
    2. * 本函数负责根据流程名("leaveProcess")创建一个流程实例
    3. * 将创建者的名字放进 variables对象中,取名为"name"
    4. * 返回流程实例对象pi
    5. */
    6. @Override 
    7.     public ProcessInstance createProcessInstance(String actorId) {  
    8.         deploy();  
    9.         Map<String, Object> variables = new HashMap<String, Object>();  
    10.         variables.put("name", actorId);  
    11.         ProcessInstance pi = processEngine.getExecutionService()  
    12.                 .startProcessInstanceByKey("leaveProcess", variables);  
    13.         System.out.println("id :" + pi.getId() + ", processDefination id:  " 
    14.                 + pi.getProcessDefinitionId());  
    15.         return pi;  
    16.     } 
  3. 将流程实例提交,持久化到数据库中
  4. public void submitApplication(String actorId, float days,ProcessInstance pi, int id)
    1. /**  
    2.      * submitApplication 2012-7-9  
    3.      */ 
    4.     @Override 
    5.     public void submitApplication(String actorId, float days,  
    6.             ProcessInstance pi, int id) {  
    7.         String taskId = processEngine.getTaskService().createTaskQuery()  
    8.                 .processInstanceId(pi.getId()).uniqueResult().getId();  
    9.         // 根据流程实例ID寻找TASKID  
    10.         LeaveDao dao = new LeaveDaoImpl();// 寻找上级  
    11.         Leaves leaves = null;  
    12.         try {  
    13.             List<Leaves> all = dao.queryParentById(id, 1);  
    14.             for (int i = 0; i < all.size(); i++) {  
    15.                 leaves = all.get(i);  
    16.             }  
    17.         } catch (Exception e) {  
    18.         }  
    19.         //System.out.println("TaskId" + taskId);  
    20.         Task tasks = processEngine.getTaskService().getTask(taskId);//根据taskId寻找task  
    21.         String executionId = tasks.getExecutionId();//根据task寻找executionId(跟processId好像没区别)  
    22.         processEngine.getExecutionService().setVariable(executionId,  
    23.                 "parentId",new String(leaves.getL_emp_id()+""));//给这个流程添加领导的id  
    24.         processEngine.getExecutionService().setVariable(executionId, "days",//给这个流程添加时间  
    25.                 days);  
    26.         processEngine.getTaskService().completeTask(taskId);//提交任务  
    27.     } 
  5. 最后,我们需要将流程实例跟你的请假单绑定,这样你的请假单就会跟着流程一起流转啦!!所以,在数据库设计上我们要在Leaves表中增加一个外键l_leave_processId varchar类型,因为processInstranceId是String类型的
  6. 我的Action(主要负责整合这几部分,我设计的比较烂)
  1. public String apply() throws Exception {  
  2.         session = ActionContext.getContext().getSession();  
  3.         SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm");  
  4.         String lf = leaveInfo.getFromtime();  
  5.         String lt = leaveInfo.getTotime();  
  6.         Date df = sdf.parse(lf);  
  7.         Date dt = sdf.parse(lt);  
  8.         Leaves l = new Leaves();  
  9.         l.setL_emp_id(leaveInfo.getE_emp_id());  
  10.         l.setL_leave_depart_id(leaveInfo.getD_depart_id());  
  11.         l.setL_leave_from(df);  
  12.         l.setL_leave_to(dt);  
  13.         l.setL_leave_type_id(leaveInfo.getLeaveTypeId());  
  14.         l.setL_leave_reason(leaveInfo.getReason());// 乱码  
  15.         LeaveDao dao = new LeaveDaoImpl();  
  16.  
  17.         // LeaveWorkFlow lwf = new LeaveWorkFlow();  
  18.         // // 开始流程  
  19.         float days = ((LeaveDaoImpl) dao).getDays(df, dt);  
  20.         // List<Leaves> approvalList  
  21.         // =lwf.submitApplication(leaveInfo.getE_emp_id(), days, 9);  
  22.         // session.put("aprovalList", approvalList);  
  23.         EmployeeDao employeeDao = new EmployeeDaoImpl();  
  24.         Employee e = employeeDao.findEmployeeById(leaveInfo.getE_emp_id());  
  25.         // 如果days 大于3天,需要多executive审批  
  26.         JbpmFecade jbpmFecade = new JbpmFecadeImpl();  
  27.         ProcessInstance pi = jbpmFecade.createProcessInstance(e.getE_name_cn());  
  28.         jbpmFecade.submitApplication(e.getE_name_cn(), days, pi,  
  29.                 leaveInfo.getE_emp_id());// 提交公文  
  30.         // 插入数据库  
  31.         l.setL_leave_processId(pi.getProcessInstance().getId());  
  32.         dao.insertLeavesApplication(l);  
  33.         all = dao.queryAllLeavesByPV(leaveInfo.getE_emp_id());  
  34.         return "leaveApplyList";  
  35.     } 

 到此,创建流程实例的部分已经结束,下面是领导审批部分

二、领导审批

  • 界面部分概述:领导登录后查看任务列表,之后看请假的详细信息,进行审批
  • 后台java处理:我们需要几个方法,(1)查询自己任务列表的方法 (2)审批的方法
  1. 查询任务列表
  2. 根据领导的名字查询自己的任务列表
    1. public ArrayList<Leaves> findTaskViewList(String actorId) throws Exception {  
    2.         // 1 tasks  
    3.         List<Task> tasks = processEngine.getTaskService()//  
    4.                 .findPersonalTasks(actorId);  
    5.         // 2  流程 变量 封装到tasklist  
    6.         Leaves leave = null;  
    7.         ArrayList<Leaves> list = new ArrayList<Leaves>();  
    8.         for (Task task : tasks) {  
    9.             String processInstanceId = processEngine.getTaskService()//  
    10.                     .getTask(task.getId())//  
    11.                     .getExecutionId();  
    12.             leave = new Leaves();  
    13.             LeaveDao dao = new LeaveDaoImpl();  
    14.             leave = dao.findLeaveByProcessId(processInstanceId);  
    15.             list.add(leave);  
    16.         }  
    17.         return list;  
    18.     } 
  3. 领导审批
  4.  public void approveByManager(String actorId, boolean status, int did,int id);
    1. /**  
    2.      * approveByManager 2012-7-9  
    3.      */ 
    4.     @Override 
    5.     public void approveByManager(String actorId, boolean status, int did,int id) {  
    6.         LeaveDao dao = new LeaveDaoImpl();  
    7.         /**  
    8.          * 查找上级  
    9.          */ 
    10.         Leaves l = null;  
    11.         try {  
    12.             List<Leaves> all = dao.queryParentById(id, 1);  
    13.             for (int i = 0; i < all.size(); i++) {  
    14.                 l = all.get(i);  
    15.             }  
    16.         } catch (Exception e) {  
    17.         }  
    18.         List<Task> tasks = processEngine.getTaskService()//根据自己的名字查询任务列表       
    19.                 .findPersonalTasks(actorId);  
    20.         Leaves leaves = null;  
    21.         for (Task t : tasks) {//循环判断任务列表  
    22.             System.out.println(" id " + t.getId() + " ,name " + t.getName() + // 得到任务名称  
    23.                     " assignee " + t.getAssignee() + // 得到 任务的代理人  
    24.                     " , createTime " + t.getCreateTime()//  
    25.             );  
    26.             // 2 处理task  
    27.             String processInstanceId = processEngine.getTaskService()//  
    28.                     .getTask(t.getId())//  
    29.                     .getExecutionId();  
    30.             // 根据流程实例id 获取公文id  
    31.             try {  
    32.                 leaves = dao.findLeaveByProcessId(processInstanceId);  
    33.             } catch (Exception e) {  
    34.                 // TODO: handle exception  
    35.             }  
    36.  
    37.             if (did == leaves.getL_leave_id()) {//比较所传人的请假单id和公文id是否相等  
    38.                 if (status) {//领导审批通过状态(true or false)  
    39.                     processEngine.getExecutionService().setVariable(processInstanceId,  
    40.                             "exeId"new String(l.getL_emp_id()+""));//将自己领导的id存入exeId中  
    41.                     processEngine.getTaskService()//  
    42.                             .completeTask(t.getId(), "ManagerApproved");  
    43.                       
    44.                 } else {  
    45.                     processEngine.getTaskService()//  
    46.                             .completeTask(t.getId(), "ManagerDisApproved");  
    47.                 }  
    48.                 break;  
    49.             }  
    50.         }  
    51.     } 


    解释一下:首先我们接收几个参数:领导的名字>>>actorId、请假单的ID>>>did、领导审批的状态变量>>>status、领导自己的Id>>>id

    用途:

    actorId 负责查询任务列表tasks,所以只会查到自己下属提交的

    status 的值为true or false ,这样任务会提交到不同的地方

    did 上层模块传来公文id(请假单的id,很好获得)当循环遍历任务列表时,我们可以通过task t获取流程实例t.getId(),根据流程实例id获取那个请假单的id,大体过程如下:id>>>> processInstanceId>>>>l_leave_id,然后我们就和这个did进行比较就好啦,如果相等则证明这个是当前要审批的请假单啦,好乱!!

    id 上层模块传来的领导自己的id,用来查找自己上级(因为请假天数大于3天后会增加一个高层来审批,也就是你的上级)

    高层审批hr确认实际上跟这部分类似,这里就不再多写了

分享到:
评论

相关推荐

    jbpm4.4+s2sh请假流程例子

    【jbpm4.4+s2sh请假流程例子】是一个典型的结合了jbpm4.4工作流引擎和Struts2、Spring、Hibernate(S2SH)框架的实战项目,旨在演示如何在企业级应用中实现一个完整的请假流程。在这个例子中,jbpm4.4作为流程管理的...

    jbpm4.4整合s2sh 请假流程例子

    jbpm4.4整合s2sh 请假流程例子,项目很好,是学习JBPM的很好的例子,已经测试过,很好用,可以下载后好好研究一下

    JBPM4.4+SSH2完整请假流程(部署即可用)

    利用JBPM4.4编写的完整请假流程,涉及申请人填写,经理审批以及决策节点后的老板审批,加入SSH2与JBPM4.4的jar包过后部署好就可以用,只用修改applicationContext.xml中的数据库相关信息即可!

    jbpm4.4-请假流程

    【jbpm4.4-请假流程】是一个基于Java开发的流程引擎示例,主要用于演示如何在企业级应用中实现请假流程。jbPM是Java Business Process Management的缩写,它是一个开源的工作流和业务流程管理系统,提供了对BPMN 2.0...

    JBPM5工作流引擎 S2SH+JBPM4.4开发工作流的一个完整的请假流程例子

    JBPM5工作流引擎 S2SH+JBPM4.4开发工作流的一个完整的请假流程例子。带有文档教程和所有源码+JAR包。在网上找了半天jbpm6\jbpm7的资料,都很少。所以 环境:Myeclipse2015 JDK1.7 mysql 5.0 Struts2+Spring3.1 1...

    jbpm4.4 简单请假流程

    综上,"jbpm4.4简单请假流程"项目展示了如何利用jbpm4.4的特性设计和实现一个典型的业务流程,涵盖了流程定义、任务处理、决策逻辑以及系统集成等方面,为企业级流程管理提供了实用范例。通过对这个项目的理解和实践...

    JBPM4.4完整可用审批流程

    使用JBPM4.4,开发者可以设计复杂的审批流程,例如请假申请、报销审批等,通过图形化的流程设计器(Business Process Designer)创建流程模型。流程中的每个步骤可以关联到一个任务,任务可以分配给不同的角色或用户...

    jbpm4.4请假例子,eclipse工程

    【jbpm4.4请假例子】是一个基于jbpm4.4流程引擎的示例项目,它展示了一个在Eclipse环境中开发的请假流程。jbPM(Java Business Process Management)是一个开源的工作流和业务流程管理框架,它允许开发者设计、执行...

    ssh2+jbpm4.4 完整请假流程

    自从前些日子发布了如何整合JBPM4.4+ssh2后,有些朋友问我有没有一个完整一点的实例,我看过贩卖你的jbpm的教程,我就参考那个请假的实例把它改装成ssh2版的吧。顺便也加入了模拟不同的角色登陆后能接到不同的待办...

    jbpm4.4项目

    在【jbpm4.4经典请假流程】中,我们可以看到JBPM如何处理日常的业务流程,如员工请假申请。这个流程可能包括请假申请的提交、审批、以及不同角色之间的交互。JBPM4.4通过图形化的流程设计工具(BPMN 2.0模型),使得...

    jbpm4.4入门编程小例子

    **jbpm4.4入门编程小例子** ...通过学习这个入门编程小例子,你可以了解如何使用jbpm4.4定义流程、启动流程实例、执行任务以及监控流程状态。这将为你在实际项目中应用工作流管理打下坚实的基础。

    jbpm4.4+tomcat6+eclipse jee

    总结起来,这个项目是一个很好的学习资源,让初学者了解如何在Java EE环境中使用jbpm4.4构建和部署一个简单的请假流程应用。通过实际操作,可以掌握流程建模、工作流引擎使用、Web应用开发以及服务器配置等一系列...

    JBPM4.4+MySQL完整请假实例

    【JBPM4.4+MySQL完整请假实例】是基于JBPM工作流引擎和MySQL数据库构建的一个实际应用案例,主要用于演示如何在企业环境中实现一个简单的请假流程。JBPM(Java Business Process Management)是一款开源的工作流管理...

    jbpm4.4+ssh2 完整请假流程

    【jbpm4.4+SSH2 完整请假流程】是一个结合了业务流程管理(BPM)工具jbpm4.4与Spring、Struts、Hibernate...总之,"jbpm4.4+SSH2 完整请假流程"是一个综合性的学习案例,涵盖了BPM与企业级Java开发的多个重要方面。

    jBPM4.4请假流程JavaWeb完全版

    **jBPM4.4请假流程JavaWeb完全版** jBPM(Java Business Process Management)是一个开源的工作流和业务流程管理框架,它允许开发者在Java应用程序中实现复杂的业务流程。jBPM4.4是该框架的一个较早版本,但仍然...

    jbpm4.4实例

    jbpm4.4实例是一个基于Java的企业工作流管理系统示例,它主要展示了如何利用jbpm框架来实现一个具体的业务流程,如本例中的请假流程。jbPM(Business Process Management)是一个开源的工作流管理系统,它提供了对...

    JBPM4.4入门开发实例

    在本文中,我们将探讨如何使用myeclipse7.5来搭建基于JBPM4.4的开发环境,并通过一个实际的请假流程实例深入理解其工作原理。 **一、JBPM概述** JBPM的核心功能包括: 1. **流程建模**:使用BPMN(Business ...

    jbpm4.4 经典请假源码

    通过学习和研究这个【jbpm4.4 经典请假源码】,开发者不仅可以掌握jbpm工作流引擎的使用,还能了解到如何将工作流技术应用于实际的业务场景,如请假审批流程,这有助于提升开发人员在业务流程自动化领域的技能和经验...

    JBPM4.4整合SSH2完整请假流程

    整合JBPM4.4和SSH2的完整请假流程,部署项目加入SSH2和JBPM4.4相应的jar包即可运行,只用修改applicatinContext.xml配置文档里的数据库相关信息即可!(给出同项目的jar包下载地址:...

Global site tag (gtag.js) - Google Analytics