activiti集成自定义表单

2023-03-30 05:02:44 来源:网络

activiti集成自定义表单

Activiti6.0中如何设计和关联表单?

新增了环节用户任务,这时紧跟着新增一个表单即可,以及脚本、样式、Web API;删除了环节用户任务,这时可以不用管,为顾及旧版本的流程定义,其对应的表单还需要保留,并不能删除;修改了环节用户任务,比如在 A 环节新增了两个字段,同时在 B 环节减少了两个字段,这时就要为 A、B 两个环节各自重新创建表单、重新创建脚本、样式、以及重新创建Web API,因为表单变了,那么业务也就变了,SQL(表)也都跟着变了。

怎么实现Activiti的分支条件的自定义配置

一、Activiti的流程分支条件的局限

Activiti的流程分支条件目前是采用脚本判断方式,并且需要在流程定义中进行分支条件的设定,如下图所示:

 

 <sequenceFlow id="flow2" sourceRef="exclusiveGw" targetRef="theTask1">

     <conditionExpression xsi:type="tFormalExpression">${input == 1}</conditionExpression>

   </sequenceFlow>

   <sequenceFlow id="flow3" sourceRef="exclusiveGw" targetRef="theTask2">

     <conditionExpression xsi:type="tFormalExpression">${input == 2}</conditionExpression>

   </sequenceFlow>

   <sequenceFlow id="flow4" sourceRef="exclusiveGw" targetRef="theTask3">

     <conditionExpression xsi:type="tFormalExpression">${input == 3}</conditionExpression>

   </sequenceFlow>

从上面的定义可以看到,流程的分支条件存在以下两个致命的局限性:

1.分支条件需要在流程定义(XML)中设定,这要求流程定义必须由开发人员来设计及编写

2.分支条件比较简单,一般为boolean表达式,表达式里的为单变量的判断处理。

以上两个局限性限制了流程的分支判断处理必须由开发人员来设定,而国内的大部分的流程应用都要求是普通的业务人员即可处理,或者是由有一定计算机基础的人员来设置处理。这要求我们对流程的条件设置提出了更高的要求,上一节我们通过修改Activiti的流程定义的XML中的分支条件表达式,同时刷新流程定义的引擎缓存,如下的代码就是基于这种方式:

JsonNode jsonObject=objectMapper.readTree(configJson);

 JsonNode configsNode=jsonObject.get("configs");

   

 BpmSolution bpmSolution=bpmSolutionManager.get(solId);

 BpmDef bpmDef=bpmDefManager.getLatestBpmByKey(bpmSolution.getDefKey(), ContextUtil.getCurrentTenantId());

    ActProcessDef processDef=actRepService.getProcessDef(bpmDef.getActDefId());

    String processDefXml=actRepService.getBpmnXmlByDeployId(bpmDef.getActDepId());

   

    System.out.println("xml:"+processDefXml);

   

    ActNodeDef sourceNode=processDef.getNodesMap().get(nodeId);

    ByteArrayInputStream is=new ByteArrayInputStream(processDefXml.getBytes());

   

 

    if(configsNode!=null){

    //取得分支条件列表

    JsonNode configs=configsNode.get("conditions");

    if(configs!=null){

    Iterator<JsonNode> it=configs.elements();

    while(it.hasNext()){

    ObjectNode config=(ObjectNode)it.next();

    String tmpNodeId=config.get("nodeId").textValue();

    String tmpCondition=config.get("condition").textValue();

   

    Element seqFlow=(Element)rootEl.selectSingleNode("/bpm:definitions/bpm:process/bpm:sequenceFlow[@sourceRef='"

    +sourceNode.getNodeId()+"' and @targetRef='"+tmpNodeId+"']");

    if(seqFlow==null) continue;

   

    Element conditionExpress=(Element)seqFlow.selectSingleNode("bpm:conditionExpression");

    if(conditionExpress==null){

    conditionExpress=seqFlow.addElement("conditionExpression");

      conditionExpress.addAttribute("xsi:type", "tFormalExpression");

    }else{

    conditionExpress.clearContent();

    }

    conditionExpress.addCDATA(tmpCondition);

 

    }

    }

    }

//修改流程定义的XML,并且清空该流程定义的缓存

    actRepService.doModifyXmlAndClearCache(bpmDef.getActDefId(),bpmDef.getActDepId(), doc.asXML());