写到这,jbpm的准备工作都差不多了,开始进入正题,开始简单的请假流程……
一、创建流程实例
- 界面部分概述:员工登录后填写请假单,然后点击提交……
- 后台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;
- }
- /**
- * 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确认实际上跟这部分类似,这里就不再多写了
转载于:https://blog.51cto.com/ug199313/945294