UFLO 2 : 18.4.业务表单页面

        一个任务节点对应着一个业务表单页面,然后,大多数情况,同一个流程模版的任务节点对于的业务表单页面是相似甚至相同的,往往一个流程一个业务表单页面就够了,差异的地方可以任务节点的组件权限来控制,大大提高了开发效率,表单页面一般包括以下几个要素,与流程关联的业务数据,触发修改当前流程或任务状态的按钮。报销的业务表单页面如下图所示:

       上图是在部门经理节点的业务表单页面的样子,而在其他节点,由于不需要"选二级部门审批处理人"按钮,前面在流程模版设计的时候,已经给其他节点添加了隐藏该按钮的节点配置,其他页面看到的效果如下图所示:

       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, 其他相关流程或者任务的操作的实现方式与此类似。