二、审批流转之待我审批
待我审批,查看数据库中的任务记录,那些分配给“我”(由“我”负责)的任务,便是待我审批的任务。
1.待我审批
/**
* 待我审批(我的任务列表)
*/
public ActionForward taskList(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response)
throws Exception {
// 获取当前页码
int pageNum = RequestUtils.getIntParam(request, "pageNum", 1);
// 获取当前用户
User user = (User) request.getSession().getAttribute("user");
// 当前用户 未完成的 任务列表
PageView pageView = formInstanceService.getTaskPageView(user
.getEmployee(), pageNum);
request.setAttribute("pageView", pageView);
return mapping.findForward("taskList");
}
|
其中的“formInstanceService.getTaskPageView”如下:
// 查询TaskInfo的列表
@SuppressWarnings("unchecked")
public PageView getTaskPageView(Employee employee, int pageNum) {
int pageSize = 10;
// 获取待我审批的任务数量
int count = ((Number) getSession().createQuery(//
"SELECT COUNT(ti) FROM org.jbpm.taskmgmt.exe.TaskInstance ti WHERE actorId=? AND ti.end IS NULL")//
.setParameter(0, employee.getId().toString())//
.uniqueResult())//
.intValue();
// 获取待我审批的任务列表
int firstResult = PageView.calcFirstResult(pageNum, pageSize);
List<TaskInstance> taskInstanceList = getSession().createQuery(//
"FROM org.jbpm.taskmgmt.exe.TaskInstance ti WHERE actorId=? AND ti.end IS NULL")//
.setParameter(0, employee.getId().toString())//
.setFirstResult(firstResult)//
.setMaxResults(pageSize)//
.list();
// 页面中需要显示表单实例信息,且仅需要任务实例的ID
List<FormInstance> formInstanceList = new ArrayList<FormInstance>();
for (TaskInstance ti : taskInstanceList) {
FormInstance formInstance = (FormInstance) ti.getContextInstance().getVariable("formInstance");
formInstance.setCurrentTaskInstanceId(ti.getId());
formInstanceList.add(formInstance);
}
// 显示
return new PageView(pageNum, pageSize, count, formInstanceList);
}
|
2.审批页面
/**
* 审批页面
*/
public ActionForward approveUI(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response)
throws Exception {
// 获取表单实例ID
Long formInstanceId = Long.parseLong(request
.getParameter("formInstanceId"));
// 获取表单实例,表单实例包含审批信息
FormInstance formInstance = formInstanceService.getById(formInstanceId);
request.setAttribute("formInstance", formInstance);
return mapping.findForward("approveUI");
}
|
3.审批
/**
* 审批
*/
public ActionForward approve(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response)
throws Exception {
// 获取表单数据
ApproveInfoActionForm actionForm = (ApproveInfoActionForm) form;
FormInstance formInstance = formInstanceService.getById(actionForm
.getFormInstanceId());
// 获取当前用户
User user = (User) request.getSession().getAttribute("user");
// 创建审批信息
ApproveInfo approveInfo = new ApproveInfo();
approveInfo.setApprover(user.getEmployee());
approveInfo.setApproveTime(new Date());
approveInfo.setApproval(actionForm.isApproval());
approveInfo.setComment(actionForm.getComment());
approveInfo.setTaskInstanceId(actionForm.getTaskInstanceId());
approveInfo.setFormInstance(formInstance);
// 审批
formInstanceService.approve(approveInfo);
return mapping.findForward("toTaskList");
}
|
其中的“formInstanceService.approve”如下:
/**
* 审批
*/
public void approve(ApproveInfo approveInfo) {
// 保存审批信息
getSession().save(approveInfo);
// 办理任务:审批
FormInstance formInstance = approveInfo.getFormInstance();
TaskInstance ti = getJbpmContext().getTaskInstance(approveInfo.getTaskInstanceId());
ProcessInstance pi = ti.getProcessInstance();
// 如果未通过
if (!approveInfo.isApproval()) {
// 停止任务向下流转
ti.setSignalling(false);
ti.start();
ti.end();
// 结束流程实例
pi.end();
// 设置流程状态为“未通过审批”
formInstance.setStatus(FormInstance.STATUS_NOT_APPROVED);
}
// 如果审批通过
else {
// 正常执行任务,向下流转
ti.start();
ti.end();
// 如果流程已结束, 就代表本次为最后一个审批
if (pi.hasEnded()) {
// 设置流程状态为“已通过审批”
formInstance.setStatus(FormInstance.STATUS_APPROVED);
}
}
// 需要手动更新流程数据(如果FormInstance的lazy属性为false呢!)
getSession().update(formInstance);
}
|
OK,待我审批完成!
三、表单查询
这部分的内容有“我的申请”、“经我审批”和“所有表单”,其中涉及条件查询在此就不一一总结了。不过这些模块中有一个十分有趣的功能——“查看流程图”。
在以前的工作中,我经涉及到图片和画板的应用开发。我的查看流程图思路是将图片画到画板上然后根据坐标信息(gpd.xml)画出对应流程模块的矩形,然后保存图板图,最后将图片显示到页面。但汤老师的实现比较优雅,直接将流程图显示到页面,然后向页面中添加一个div,并设置div的坐标、尺寸和边框颜色。
由此可见,我还需要一些工作经验将这些技术熟练掌握!
通过OA项目的学习,使我知道应该如何学习下一个项目——《教育办公系统》。希望自己能将这个系统做的更好!
加油!