一个任务节点对应着一个业务表单页面,然后,大多数情况,同一个流程模版的任务节点对于的业务表单页面是相似甚至相同的,往往一个流程一个业务表单页面就够了,差异的地方可以任务节点的组件权限来控制,大大提高了开发效率,表单页面一般包括以下几个要素,与流程关联的业务数据,触发修改当前流程或任务状态的按钮。报销的业务表单页面如下图所示:
上图是在部门经理节点的业务表单页面的样子,而在其他节点,由于不需要"选二级部门审批处理人"按钮,前面在流程模版设计的时候,已经给其他节点添加了隐藏该按钮的节点配置,其他页面看到的效果如下图所示:
1)业务数据加载
在此页面,可以通过${param.businessId}获取与当前流程相关的业务数据,将${param.businessId}的值作为DataSet的parameter属性的值,后台根据参数值加载对于的业务数据,后台代码如下:
@DataProvider public Reimbursement loadReimbursement(String id){ Session session=this.getSessionFactory().openSession(); try{ return (Reimbursement) session.get(Reimbursement.class, id); }finally{ session.flush(); session.close(); } }
2)"不通过"逻辑处理
当用户点击"不通过"按钮时,我们需要将当前报销单的状态由"正在审批"置为"不通过"状态,客户端修改完成后,需要将修改后的数据持久化到数据库,后台代码如下:
@DataResolver public void saveReimbursements(Collection<Reimbursement> reimbursements){ Session session = this.getSessionFactory().openSession(); try{ for(Reimbursement reimbursement:reimbursements){ EntityState state=EntityUtils.getState(reimbursement); if(EntityState.NEW.equals(state)){ reimbursement.setId(UUID.randomUUID().toString()); reimbursement.setCreateDate(new Date()); session.save(reimbursement); }else if(EntityState.MODIFIED.equals(state)){ session.update(reimbursement); } } }finally{ session.flush(); session.close(); } }
其实,跟添加报销单的后台处理是同一个方法。
3)"通过"逻辑处理
通过${taskId}可以获得当前任务的ID,"通过"按钮就可以通过出发AjaxAction,把taskId传到后台,后台根据taskId来完成当前任务,后台代码如下:
@Expose public void completeTask(Long taskId){ taskService.start(taskId); taskService.complete(taskId); }
4)选二级部门经理审批处理人
"选二级部门审批处理人"按钮的功能就是弹出一个选人对话框,通过选人对话框为二级部门经理审批节点选择处理人,如下图所示:
选人对话框中的数据就是应用中的所有用户,开发人员可以更加业务需要实现更为强大的选人对话框。
为二级部门经理审批节点设置处理人的后台代码如下:
@Expose public void appointTaskAssignee(Long taskId,String assignee){ taskService.saveTaskAppointor(taskId, assignee, "二级部门经理审批"); }
其中,assignee参数为处理人的ID, 其他相关流程或者任务的操作的实现方式与此类似。
Attachments:


