您的位置:首页 > 产品设计 > 产品经理

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

2012-07-27 15:48 302 查看
写到这,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;
}

领导审批

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确认实际上跟这部分类似,这里就不再多写了
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息