为步骤指定执行人

 

    一个步骤必须具有执行人。执行人可以是如下的几种类型:为了进行说明,我们以一个请假工作为例,工作流程的定义如下:

工作的发起人:

     当工作流转几步后,可能下一步的执行人是工作的起草人。那么可能将执行人定义为“工作的发起人”。比如当张三起草一份请假申请后,由科长审批。在科长审批后,需要再还递交给申请人做工作交接。那么“申请人办理工作交接”的执行人,我们不能说这个步骤的执行人就指定为张三(因为李四也可能会做请假申请),因此定义执行人为“工作的发起人”后,表示工作由谁起草的,就递交给谁。

临时指定执行人

    当无法事先知道执行人时,或者执行人经常变动时,可能临时指定执行人

等同于某步骤的执行人

    仍以上面的请假为例。当在科长审批后,需要再还给张三,那么“申请人办理工作交接”的执行人就是“请假申请”这个步骤的执行人。因此可以如下定义:

 

等同于某步骤的执行人所在部门的其它人员(不包括领导)

    仍以上面的请假为例。当张三需要做工作交接时,交接人是自己同部门的同事,那么“工作交接”的执行人就是“请假申请”这个步骤的执行人所在部门的其它人员(不包括领导),如下图

 

等同于某步骤的执行人所在部门的主要领导或其它领导:

     仍以上面的请假为例。当张三做好请假申请,需要科长审批时,“科长审批”步骤的执行人就是申请人的领导(主要领导即正职的领导,其它领导即副职领导),可以如下设置:

 

提示: 等同某步骤相关人员的各个选项是“复选框”,这表示可能将它们多选,即表示可以按实际需要组这些相关人员进行组合,作为步骤的执行人。

 

等同于某步骤的执行人所在部门的分管领导:

    通常一个部门具有一个正职的领导和若干个副职的领导。同时还可能有更高层的领导来管理这个部门的领导。这个“更高层的领导”就是部门的分管领导。比如某个科长是某科室的领导,某个局长是该科室的分管领导。

 

等同于某步骤的执行人的直属领导:

    当某个人是一个部门的领导时(主要领导或都其他领导),那么他所在部门的上级部门的领导就是他的直属领导。当某个人是普通职工时,他所在部门的领导就是他的直属领导。

   通俗地讲,可能认为:科员和直属领导是科长,科长的直属领导是局长

 

 

直接增加后选人:

    当某步骤的执行人是可以确定时,那么直接指定步骤的执行人是最简单的。比如“财务审批”可以确定就是财务总监来执行的。且一个单位的财务总监相对是固定的,那么直接把这个人的名字加到执行人列表中即可。

直接增加后选岗位:

    当某个步骤的执行人是确定为某个岗位(部门或虚拟部门)中的人来执行的,那么直接把部门加入到后选岗位中,当流转到这个步骤时,执行人就是这个岗位中的所有人,系统会列出这些人,操作者只需要从中选择一个做为执行人即可。

 

使用表达式或二次开发来指定执行人:

    当上述执行人定义都无法满足执行人定义时,可能使用表达式或二次开发来指定执行人。前提是工作流的流转模板必须是“结构化模板”。

    当使用表达式来指定执行人时,表达式的结果是执行人的ID(如果需要指定多个候选人,那么表达式的结果应该是这样的一个字符串:把候选人的ID拼接成一个用逗号分隔的字符串如 "2,3,4,5"), 表达式中允许使用单元格名(如A1,B5)或别名来引用表单上的数据,值得注意的是请使用cstr,cint,clng ,cdbl ,cdate等函数对单元格的数据做强制类型转换后再做运算,如:请使用cint(A1)+5 ,而不要直接用A1+5。

    所谓表达式,就是由数据,运算符,函数组成的一串定义。表达式中使用单元格名称或单元格别名来引用结构化模板中的数据。例如: 

其中“申请表!A1 ”,“a1” 是单元格名称 , name 是单元格别名 ,"abc"是直接数据, UserId2UserName是函数。 单元格名称及别名与MS Excel 命名规则是一致的。可用的函数可以点击来查看。

 

    如果使用表达式仍无法满足要求,那么WiseFlow 使用Rhino做为脚本引擎提供了强劲的二次开发能力。因此使用最后的绝招:使用脚本来指定执行人。

    可以定义一个函数 getExecutor(),返回执行人的ID(如果需要返回多个候选人,那么把他们的ID拼接成一个用逗号分隔的字符串如 "2,3,4,5")来指定本步骤的执行候选人。 下面是一段脚本示例:

   
 

function getExecutor()
{
  var ds=book.getDataSource('flow_gs_nbgzlxd').getDataStore();
  var tfbmid= ds.getString(0,"tfbmid");
  var sql="select distinct b.id , b.name ,b.showname from oa_group_master a ,"+
            "news_user b where a.user_id=b.id and a.group_id="+tfbmid ;
  out.println (sql);
  var tds= flow.createDataStore("", sql);
  tds.retrieve();
  if ( tds.getRowCount()>0)
  {
    var ret="";
    for( i=0;i< tds.GetRowCount();i++)
    {
       ret=ret+","+tds.getString(i,"id");
    }
    return ret;
  }
  
  return -1;

}

 

    由于表达式相对二次开发而言,要简单许多,所以,从方便日后的维护出发,尽量使用表达式做定义,少用二次开发。

    使用表达式指定执行人请参阅下一讲