• 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"?> </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);

      效果图:

  • 相关阅读:
    自动杀死僵尸进程的脚本
    利用CodeBlocks修改PUTTY以文件形式保存配置信息
    [C#Util]读写文件汉字乱码
    [Hadoop]在Windows上安装Hadoop
    [短彩信]C#短彩信模块开发设计(1)——架构
    [MQ]ActiveMQ消息收发简单例子
    [C#Util]ObjectPool Prototype
    [DesignPattern]各自用一句话来概括MVC、MVP、MVVM的差异特点
    [Java]Jersey Spring Integration Demo
    [OpenSource]浅谈.Net和Java互相调用的三种方式
  • 原文地址:https://www.cnblogs.com/huyufan/p/7777680.html
Copyright © 2020-2023  润新知