二、审批流转之待我审批
待我审批,查看数据库中的任务记录,那些分配给“我”(由“我”负责)的任务,便是待我审批的任务。
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 项目的学习,使我知道应该如何学习下一个项目——《教育办公系统》。希望自己能将这个系统做的更好!
加油!