jbpm4.4学习总结(四)请假流程
2012-07-27 15:48
302 查看
写到这,jbpm的准备工作都差不多了,开始进入正题,开始简单的请假流程……
后台java处理:由于我没有用到hibernate,所以都是jdbc操作数据库(真心后悔没用hibernate),总的思路如下:
Struct2接收完请假信息后,调用service层我写好的函数(jbpm相关操作)
punlic ProcessInstance createProcessInstance(String actorId);请看注释:
将流程实例提交,持久化到数据库中
public void submitApplication(String actorId, float days,ProcessInstance pi, int id)
最后,我们需要将流程实例跟你的请假单绑定,这样你的请假单就会跟着流程一起流转啦!!所以,在数据库设计上我们要在Leaves表中增加一个外键l_leave_processId varchar类型,因为processInstranceId是String类型的
我的Action(主要负责整合这几部分,我设计的比较烂)
到此,创建流程实例的部分已经结束,下面是领导审批部分
后台java处理:我们需要几个方法,(1)查询自己任务列表的方法 (2)审批的方法
查询任务列表
根据领导的名字查询自己的任务列表
领导审批
public void approveByManager(String actorId, boolean status, int did,int id);
解释一下:首先我们接收几个参数:领导的名字>>>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确认实际上跟这部分类似,这里就不再多写了
一、创建流程实例
界面部分概述:员工登录后填写请假单,然后点击提交……后台java处理:由于我没有用到hibernate,所以都是jdbc操作数据库(真心后悔没用hibernate),总的思路如下:
Struct2接收完请假信息后,调用service层我写好的函数(jbpm相关操作)
punlic ProcessInstance createProcessInstance(String actorId);请看注释:
/** * 本函数负责根据流程名("leaveProcess")创建一个流程实例 * 将创建者的名字放进 variables对象中,取名为"name" * 返回流程实例对象pi */ @Override public ProcessInstance createProcessInstance(String actorId) { deploy(); Map<String, Object> variables = new HashMap<String, Object>(); variables.put("name", actorId); ProcessInstance pi = processEngine.getExecutionService() .startProcessInstanceByKey("leaveProcess", variables); System.out.println("id :" + pi.getId() + ", processDefination id: " + pi.getProcessDefinitionId()); return pi; }
将流程实例提交,持久化到数据库中
public void submitApplication(String actorId, float days,ProcessInstance pi, int id)
/** * submitApplication 2012-7-9 */ @Override public void submitApplication(String actorId, float days, ProcessInstance pi, int id) { String taskId = processEngine.getTaskService().createTaskQuery() .processInstanceId(pi.getId()).uniqueResult().getId(); // 根据流程实例ID寻找TASKID LeaveDao dao = new LeaveDaoImpl();// 寻找上级 Leaves leaves = null; try { List<Leaves> all = dao.queryParentById(id, 1); for (int i = 0; i < all.size(); i++) { leaves = all.get(i); } } catch (Exception e) { } //System.out.println("TaskId" + taskId); Task tasks = processEngine.getTaskService().getTask(taskId);//根据taskId寻找task String executionId = tasks.getExecutionId();//根据task寻找executionId(跟processId好像没区别) processEngine.getExecutionService().setVariable(executionId, "parentId",new String(leaves.getL_emp_id()+""));//给这个流程添加领导的id processEngine.getExecutionService().setVariable(executionId, "days",//给这个流程添加时间 days); processEngine.getTaskService().completeTask(taskId);//提交任务 }
最后,我们需要将流程实例跟你的请假单绑定,这样你的请假单就会跟着流程一起流转啦!!所以,在数据库设计上我们要在Leaves表中增加一个外键l_leave_processId varchar类型,因为processInstranceId是String类型的
我的Action(主要负责整合这几部分,我设计的比较烂)
public String apply() throws Exception { session = ActionContext.getContext().getSession(); SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm"); String lf = leaveInfo.getFromtime(); String lt = leaveInfo.getTotime(); Date df = sdf.parse(lf); Date dt = sdf.parse(lt); Leaves l = new Leaves(); l.setL_emp_id(leaveInfo.getE_emp_id()); l.setL_leave_depart_id(leaveInfo.getD_depart_id()); l.setL_leave_from(df); l.setL_leave_to(dt); l.setL_leave_type_id(leaveInfo.getLeaveTypeId()); l.setL_leave_reason(leaveInfo.getReason());// 乱码 LeaveDao dao = new LeaveDaoImpl(); // LeaveWorkFlow lwf = new LeaveWorkFlow(); // // 开始流程 float days = ((LeaveDaoImpl) dao).getDays(df, dt); // List<Leaves> approvalList // =lwf.submitApplication(leaveInfo.getE_emp_id(), days, 9); // session.put("aprovalList", approvalList); EmployeeDao employeeDao = new EmployeeDaoImpl(); Employee e = employeeDao.findEmployeeById(leaveInfo.getE_emp_id()); // 如果days 大于3天,需要多executive审批 JbpmFecade jbpmFecade = new JbpmFecadeImpl(); ProcessInstance pi = jbpmFecade.createProcessInstance(e.getE_name_cn()); jbpmFecade.submitApplication(e.getE_name_cn(), days, pi, leaveInfo.getE_emp_id());// 提交公文 // 插入数据库 l.setL_leave_processId(pi.getProcessInstance().getId()); dao.insertLeavesApplication(l); all = dao.queryAllLeavesByPV(leaveInfo.getE_emp_id()); return "leaveApplyList"; }
到此,创建流程实例的部分已经结束,下面是领导审批部分
二、领导审批
界面部分概述:领导登录后查看任务列表,之后看请假的详细信息,进行审批后台java处理:我们需要几个方法,(1)查询自己任务列表的方法 (2)审批的方法
查询任务列表
根据领导的名字查询自己的任务列表
public ArrayList<Leaves> findTaskViewList(String actorId) throws Exception { // 1 tasks List<Task> tasks = processEngine.getTaskService()// .findPersonalTasks(actorId); // 2 流程 变量 封装到tasklist Leaves leave = null; ArrayList<Leaves> list = new ArrayList<Leaves>(); for (Task task : tasks) { String processInstanceId = processEngine.getTaskService()// .getTask(task.getId())// .getExecutionId(); leave = new Leaves(); LeaveDao dao = new LeaveDaoImpl(); leave = dao.findLeaveByProcessId(processInstanceId); list.add(leave); } return list; }
领导审批
public void approveByManager(String actorId, boolean status, int did,int id);
/** * approveByManager 2012-7-9 */ @Override public void approveByManager(String actorId, boolean status, int did,int id) { LeaveDao dao = new LeaveDaoImpl(); /** * 查找上级 */ Leaves l = null; try { List<Leaves> all = dao.queryParentById(id, 1); for (int i = 0; i < all.size(); i++) { l = all.get(i); } } catch (Exception e) { } List<Task> tasks = processEngine.getTaskService()//根据自己的名字查询任务列表 .findPersonalTasks(actorId); Leaves leaves = null; for (Task t : tasks) {//循环判断任务列表 System.out.println(" id " + t.getId() + " ,name " + t.getName() + // 得到任务名称 " assignee " + t.getAssignee() + // 得到 任务的代理人 " , createTime " + t.getCreateTime()// ); // 2 处理task String processInstanceId = processEngine.getTaskService()// .getTask(t.getId())// .getExecutionId(); // 根据流程实例id 获取公文id try { leaves = dao.findLeaveByProcessId(processInstanceId); } catch (Exception e) { // TODO: handle exception } if (did == leaves.getL_leave_id()) {//比较所传人的请假单id和公文id是否相等 if (status) {//领导审批通过状态(true or false) processEngine.getExecutionService().setVariable(processInstanceId, "exeId", new String(l.getL_emp_id()+""));//将自己领导的id存入exeId中 processEngine.getTaskService()// .completeTask(t.getId(), "ManagerApproved"); } else { processEngine.getTaskService()// .completeTask(t.getId(), "ManagerDisApproved"); } break; } } }
解释一下:首先我们接收几个参数:领导的名字>>>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学习总结(四)请假流程
- jbpm4.4学习总结(二)部署流程到Mysql数据库
- jbpm4.4学习总结(一)搭建环境、jpdl流程图
- Jbpm4.4+hibernate3.5.4+spring3.0.4+struts2.1.8整合例子(附完整的请假流程例子,jbpm基础,常见问题解决)
- JBPM4.4 入门 简单的请假流程
- jbpm4.4 简单请假流程
- jbpm4.4请假流程
- Jbpm4.4+hibernate3.5.4+spring3.0.4+struts2.1.8整合例子(附完整的请假流程例子,jbpm基础,常见问题解决)
- jbpm4.4学习总结(三)常用接口使用说明 推荐
- JBPM4.4学习之三:流程变量概念及使用
- Jbpm4.4+hibernate3.5.4+spring3.0.4+struts2.1.8整合例子(附完整的请假流程例子,jbpm基础,常见问题解决)
- jbpm 定义请假流程 编程发布流程文件
- CloudStack 4.4学习总结之前期准备
- 传智播客jbpm学习,jpbm中流程执行比较重要的类和方法
- Redis安装包安装流程及学习总结
- 【整合篇】JBPM4.4业务与流程的整合
- jBPM4.4:如何图示化显示当前的流程执行到了哪一步骤
- jbpm学习--jbpm4.4 与 ssh框架的整合
- Mybatis流程学习总结(待续)
- 【学习总结】ARM cotex-a8 下 u-boot启动流程