activitimodeler任务节点⾃定义属性扩展
  在⼯作中使⽤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⾥⾯的效果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) {
UserTask userTask = (UserTask) baseElement;
//解析
Map<String, List<ExtensionElement>> customerPropeties = ExtensionElements();
    if(customerPropeties不为空 && customerPropeties是否包含扩展属性){
       ExtensionElement e = (扩展属性).get(0);
       setPropertyValue(扩展属性, e.getElementText(), propetiesNode);
    }
}
@Override
protected FlowElement convertJsonToElement(JsonNode elementNode, JsonNode modelNode, Map<String, JsonNode> shapeMap) {
FlowElement flowElement = vertJsonToElement(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.ConvertersToBpmnMap, ConvertersToJsonMap);
JsonNode editorNode = new ObjectMapper().Id())); BpmnModel bpmnModel = vertToBpmnModel(editorNode);
  效果图:

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。