最近在实施政府办公项目的时候,经常有客户在问,公文的流程能否自由流转,如我在拟稿完成后,直接归档,不需要再经过核稿与审批流程。同样,我可以在任何一个任务上,直接把任务回退到以上任何一个环节,如,在审批的过程中,若不合适,可以直接回退至拟稿任务。如下图所示:
非常幸运,JBPM4也提供了给我们动态创建Transition的接口。即在当前的节点中,动态创建出当前节点所有的跳转的Transition,问题是如果你给你的活动节点创建了连接后,下一次进入该任务时,不能显示这些动态创建的连接。否则当前任务的跳转连接会越来越多。
所以对于那些在两个节点间不存在的连接,而又想实现这两个节点的跳转的话,就需要动态创建连接,然后再实现任务跳转,跳转后再进行删除连接。相当于现实中我们所说的过河拆桥模式。
有了这种思想,Jbpm实现任务回退、补签等操作都是相当容易。
动态创建:
Java代码
- /**
- * 动态创建连接当前任务节点至名称为destName的节点的Transition
- * @param taskId 任务节点ID
- * @param sourceName 源节点名称
- * @param destName 目标节点名称
- */
- public void addOutTransition(ProcessDefinitionImpl pd,String sourceName,String destName){
- EnvironmentFactory environmentFactory = (EnvironmentFactory) processEngine;
- Environment env=null;
- try {
- env = environmentFactory.openEnvironment();
- //取得当前流程的活动定义
- ActivityImpl sourceActivity = pd.findActivity(sourceName);
- //取得目标的活动定义
- ActivityImpl destActivity=pd.findActivity(destName);
- //为两个节点创建连接
- TransitionImpl transition = sourceActivity.createOutgoingTransition();
- transition.setName("to" + destName);
- transition.setDestination(destActivity);
- sourceActivity.addOutgoingTransition(transition);
- }catch(Exception ex){
- logger.error(ex.getMessage());
- }finally{
- if(env!=null)env.close();
- }
- }
/** * 动态创建连接当前任务节点至名称为destName的节点的Transition * @param taskId 任务节点ID * @param sourceName 源节点名称 * @param destName 目标节点名称 */ public void addOutTransition(ProcessDefinitionImpl pd,String sourceName,String destName){ EnvironmentFactory environmentFactory = (EnvironmentFactory) processEngine; Environment env=null; try { env = environmentFactory.openEnvironment(); //取得当前流程的活动定义 ActivityImpl sourceActivity = pd.findActivity(sourceName); //取得目标的活动定义 ActivityImpl destActivity=pd.findActivity(destName); //为两个节点创建连接 TransitionImpl transition = sourceActivity.createOutgoingTransition(); transition.setName("to" + destName); transition.setDestination(destActivity); sourceActivity.addOutgoingTransition(transition); }catch(Exception ex){ logger.error(ex.getMessage()); }finally{ if(env!=null)env.close(); } }
动态删除:
Java代码
- /**
- * 动态删除连接sourceName与destName的Transition
- * @param taskId
- * @param sourceName
- * @param destName
- */
- public void removeOutTransition(ProcessDefinitionImpl pd,String sourceName,String destName){
- EnvironmentFactory environmentFactory = (EnvironmentFactory) processEngine;
- Environment env=null;
- try {
- env = environmentFactory.openEnvironment();
- //取得当前流程的活动定义
- ActivityImpl sourceActivity = pd.findActivity(sourceName);
- //若存在这个连接,则需要把该连接删除
- List<Transition> trans=sourceActivity.getOutgoingTransitions();
- for(Transition tran:trans){
- if(destName.equals(tran.getDestination().getName())){//删除该连接
- trans.remove(tran);
- break;
- }
- }
- }catch(Exception ex){
- logger.error(ex.getMessage());
- }finally{
- if(env!=null)env.close();
- }
- }
/** * 动态删除连接sourceName与destName的Transition * @param taskId * @param sourceName * @param destName */ public void removeOutTransition(ProcessDefinitionImpl pd,String sourceName,String destName){ EnvironmentFactory environmentFactory = (EnvironmentFactory) processEngine; Environment env=null; try { env = environmentFactory.openEnvironment(); //取得当前流程的活动定义 ActivityImpl sourceActivity = pd.findActivity(sourceName); //若存在这个连接,则需要把该连接删除 List<Transition> trans=sourceActivity.getOutgoingTransitions(); for(Transition tran:trans){ if(destName.equals(tran.getDestination().getName())){//删除该连接 trans.remove(tran); break; } } }catch(Exception ex){ logger.error(ex.getMessage()); }finally{ if(env!=null)env.close(); } }
其实现效果如下所示,可以跳至任何节点,并且可以指派给任何人。
指定至相关人员: