activiti modeler 任務節點自定義屬性擴展


  在工作中使用Activiti modeler時難免會遇到局限,如usertask中的屬性,完全不夠用,這時需要我們去擴展。

  activiti modeler通過讀取stencilset.json生成編輯器UI,在界面上的擴展需要了解stencilset.json配置文件,它定義元素的屬性,規則的配置文件,頁面的展示就是根據這個配置文件生成的。

配置文件說明:

--屬性的定義

"propertyPackages" : [ {

    "name" : "process_idpackage",

    "properties" : [ {

        "id" : "name",      ---id

        "type" : "String",  --類型,在賦值的時候會根據類型展示各種輸入框,根據properties.js

        "title" : "名稱",  --顯示的標題

        "value" : "",      --值

        "description" : "BPMN元素的描述性名稱.", --描述

        "category":"property", --分類,空的話位popular

        "popular" : true,         --是否顯示

        "refToView" : "text_name" --觸發svg里面的效果

    }]

--節點的定義

"type" : "node",

    "id" : "MailTask",

    "title" : "郵件任務",--標題

    "description" : "郵件任務", --描述

    "view" : "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n</svg>", --svg的xml

    "icon" : "activity/list/type.send.png",        --圖標

    "groups" : [ "任務" ], --歸屬的組

    "propertyPackages" : [ "overrideidpackage" ],--屬性

    "hiddenPropertyPackages" : [ ],

    "roles" : [ "Activity" ] --規則

配置步驟說明:

  在stencilset.json文件中添加屬性(各種類型可參照其它屬性編寫),如圖:

 

  並引用到UserTask節點中,如圖:

 

  這樣,ORYX Designer會自動解析該JSON文件並在UI中展示新添加的屬性,如圖:

 

  接着,我們需要將UI上擴展的屬性與activiti進行綁定。不難發現,BpmnJsonConverter起着至關重要的作用,activiti modeler將頁面編輯器的數據保存為Json格式文件存儲到數據庫中,回顯也是通過讀取該文件,BpmnJsonConverter用於轉換BPMN與JSON供activiti解析界面屬性並應用。

  在UserTask中擴展屬性,默認的任務節點Json數據解析類UserTaskJsonConverter,因為它不認識skiprepetition,所以需要定義一個類替換它,以此達到解析自定義屬性的目的。

  然后,重寫convertElementToJson與convertJsonToElement方法,UserTask提供了List<CustomProperty> customProperties用來存儲我們的自定義屬性。

public class CustomUserTaskJsonConverter extends UserTaskJsonConverter implements CustomStencilConstants{
    
    @Override
    protected void convertElementToJson(ObjectNode propertiesNode, BaseElement baseElement) {
        super.convertElementToJson(propertiesNode, baseElement);
        UserTask userTask = (UserTask) baseElement;
        
        //解析
        Map<String, List<ExtensionElement>> customerPropeties = userTask.getExtensionElements();
     if(customerPropeties不為空 && customerPropeties是否包含擴展屬性){
       ExtensionElement e = customerPropeties.get(擴展屬性).get(0);
       setPropertyValue(擴展屬性, e.getElementText(), propetiesNode);
     } } @Override
protected FlowElement convertJsonToElement(JsonNode elementNode, JsonNode modelNode, Map<String, JsonNode> shapeMap) { FlowElement flowElement = super.convertJsonToElement(elementNode, modelNode, shapeMap); //解析 UserTask userTask = (UserTask) flowElement;
     List<CustomerPropety> cplist = new ArrayList();
     String skiprepetition = getPropetyValueAsString(擴展屬性, elementNode);
     if(skiprepetition不為空){
       CustomerPropety cp = new CustomerPropety();
       cp.setName(擴展屬性);

       cp.setSimpleValue(skiprepetition);
       cplist.add(cp);
     }

     task.setCustomProperties(cplist);
return task; } public static void fillTypes(Map<String, Class<? extends BaseBpmnJsonConverter>> convertersToBpmnMap, Map<Class<? extends BaseElement>, Class<? extends BaseBpmnJsonConverter>> convertersToJsonMap) { fillJsonTypes(convertersToBpmnMap); fillBpmnTypes(convertersToJsonMap); } public static void fillJsonTypes(Map<String, Class<? extends BaseBpmnJsonConverter>> convertersToBpmnMap) { convertersToBpmnMap.put(STENCIL_TASK_USER, CustomUserTaskJsonConverter.class); } public static void fillBpmnTypes(Map<Class<? extends BaseElement>, Class<? extends BaseBpmnJsonConverter>> convertersToJsonMap) { convertersToJsonMap.put(UserTask.class, CustomUserTaskJsonConverter.class); } }

  最后,在部署流程時,待BpmnJsonConverter初始化完成后替換掉UserTaskJsonConverter就OK了。

BpmnJsonConverter jsonConverter = new BpmnJsonConverter();
            
// TODO:UserTask自定義擴展屬性
BpmnJsonConverterProperties bjcp = new BpmnJsonConverterProperties();
CustomUserTaskJsonConverter.fillTypes(bjcp.getConvertersToBpmnMap, bjcp.getConvertersToJsonMap);
            
JsonNode editorNode = new ObjectMapper().readTree(repositoryService.getModelEditorSource(modelData.getId()));
BpmnModel bpmnModel = jsonConverter.convertToBpmnModel(editorNode);

  效果圖:

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM