snaker工作流引擎学习记录。
任务1: 完成一个完整的流程设计图。
任务2: 搞懂方法中的参数的作用以及使用场景。
任务3: 写一个会签测试Demo。
snaker中的会签功能取决于节点中performType属性的属性值来决定是否产生多个相同的任务。
performType
的属性只有两个: ANY(代表多个参与者时,只要有一个参与者通过,则流程便可以继而往下流转)、ALL(代表多个参与者时,必须所有的参与者都必须通过,流程才会往西继续流转)。
在写会签节点时,参与者是在哪里添加的呢?
参与者的设置方法在snaker官方文档中有介绍,这里我使用的是在代码中动态添加一个参与者。
如图:
在设计图中只有一个参与者,但只是一个标记,在流程数据构造的时候,会给每个标记赋予对应的角色。
在设计图时参与者的名称必须和数据构造时给的标记是一致的,否则程序就会找不到对应到参与者,会报一个无法执行下一步的错误。
/** 流程数据构造开始 */ Map<String, Object> params = new HashMap<String, Object>(); String falg= ShiroUtils.getOrgCode(); String falg1= ShiroUtils.getParentOrgCode(falg); String falg2= ShiroUtils.getParentOrgCode(falg1); String falg3= ShiroUtils.getParentOrgCode(falg2); params.put("apply.operator",SecurityUtil.getApprover(prop.get("falg"), falg)); params.put("cwh.operator", SecurityUtil.getApprover(prop.get("falg"), falg1)); params.put("sybAndJdxz.operator",SecurityUtil.getApprover(prop.get("falg"), falg2)); params.put("mzj.operator", SecurityUtil.getApprover(prop.get("flag"), falg3)); /** 流程数据构造结束 */
数据流程构造的时候给了他一个角色,也就是参与者。接下来在会签节点对应的方法中再为它动态的添加一个参与者。
engine.task().addTaskActor(taskId, 1 ,SecurityUtil.getApprover(prop.get("falg"), falsg4));
这样会签需要的参与者就搞定了。
然后就是决策,每个节点的返回结果无非就是同意/不同意,通过/不通过 等等。。这个结果可以以变量的形式来储存,以${result}这种形式返回给流程,告诉它这个节点的最后决定是什么,是否继续往下流转。
if(result.equals("甲同意") && result.equals("乙同意")){ setAttr("result", "甲乙同意"); }else{ setAttr("result", "甲乙不同意"); }
在开始并执行流程的时候需要实现这样一个方法,其中有三个参数,分别代表任务ID、当前操作人员ID(当前登录人员)、参与者列表集合(流程数据构造时的集合)
/** * 根据任务主键ID,操作人ID,参数列表执行任务 * @param taskId 任务主键ID * @param operator 操作人主键ID * @param args 参数列表 * @return List<Task> 任务集合 */ public List<Task> executeTask(String taskId, String operator, Map<String, Object> args);
写过的东西记录下来,方便后用。