flowable节点的自定义属性扩展_03

文章目录

          • 新增一个节点属性
            • 新增一个package;
            • 把我们新增的这个package添加节点属性中
          • 编写angularJS脚本
            • 在properties.js 配置模板;
            • 编写js控制器
            • 配置引用
          • 后台配置解析我们的节点属性
            • 编写一个自定义的解析器
            • bean的初始化
            • spring定义bean

项目地址:https://gitee.com/lwj/flowable.git 分支flowable-base
视频地址:https://www.bilibili.com/video/av79774697/
业务场景:
在实际业务中,我们有可能对一些节点做一些控制,比方说流程到这个节点的时候,可以编辑表单的某些字段,进而进一步的审批流转 。如何扩展系欸但的属性呢,请看效果和实际扩展代码。

效果如下:
在这里插入图片描述
flowable节点的自定义属性扩展

新增一个节点属性
新增一个package;
{"name": "nodetypepackage","properties": [{"id": "nodetype","type": "dragon-nodetype-combobox","title": "节点类型","value": "","description": "节点类型","popular": true}]}
把我们新增的这个package添加节点属性中
{
“type” : “node”,
“id” : “UserTask”,
“title” : “\u7528\u6237\u4efb\u52a1”,
“description” : “\u4efb\u52a1\u624b\u52a8\u5206\u914d\u7ed9\u4e00\u4e2a\u7279\u5b9a\u7684\u4eba”,
“view” :<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n<svg\n xmlns=“http://www.w3.org/2000/svg”\n xmlns:svg=“http://www.w3.org/2000/svg”\n xmlns:oryx=“http://www.b3mn.org/oryx”\n xmlns:xlink=“http://www.w3.org/1999/xlink”\n\n width=“102”\n height=“82”\n version=“1.0”>\n \n oryx:magnets\n \t<oryx:magnet oryx:cx=“1” oryx:cy=“20” oryx:anchors=“left” />\n \t<oryx:magnet oryx:cx=“1” oryx:cy=“40” oryx:anchors=“left” />\n \t<oryx:magnet oryx:cx=“1” oryx:cy=“60” oryx:anchors=“left” />\n \t\n \t<oryx:magnet oryx:cx=“25” oryx:cy=“79” oryx:anchors=“bottom” />\n \t<oryx:magnet oryx:cx=“50” oryx:cy=“79” oryx:anchors=“bottom” />\n \t<oryx:magnet oryx:cx=“75” oryx:cy=“79” oryx:anchors=“bottom” />\n \t\n \t<oryx:magnet oryx:cx=“99” oryx:cy=“20” oryx:anchors=“right” />\n \t<oryx:magnet oryx:cx=“99” oryx:cy=“40” oryx:anchors=“right” />\n \t<oryx:magnet oryx:cx=“99” oryx:cy=“60” oryx:anchors=“right” />\n \t\n \t<oryx:magnet oryx:cx=“25” oryx:cy=“1” oryx:anchors=“top” />\n \t<oryx:magnet oryx:cx=“50” oryx:cy=“1” oryx:anchors=“top” />\n \t<oryx:magnet oryx:cx=“75” oryx:cy=“1” oryx:anchors=“top” />\n \t\n \t<oryx:magnet oryx:cx=“50” oryx:cy=“40” oryx:default=“yes” />\n </oryx:magnets>\n <g pointer-events=“fill” oryx:minimumSize=“50 40”>\n\t<rect id=“text_frame” oryx:anchors=“bottom top right left” x=“1” y=“1” width=“94” height=“79” rx=“10” ry=“10” stroke=“none” stroke-width=“0” fill=“none” />\n\t<rect id=“bg_frame” oryx:resize=“vertical horizontal” x=“0” y=“0” width=“100” height=“80” rx=“10” ry=“10” stroke=”#bbbbbb" stroke-width=1” fill="#f9f9f9" />\n\t\t<text \n\t\t\tfont-size=12” \n\t\t\tid=“text_name” \n\t\t\tx=50” \n\t\t\ty=40” \n\t\t\toryx:align=“middle center”\n\t\t\toryx:fittoelem=“text_frame”\n\t\t\tstroke="#373e48">\n\t\t\n\t\n\t<g id=“userTask” transform=translate(3,3)>\n\t\t<path oryx:anchors=“top left”\n \t\tstyle=“fill:#d1b575;stroke:none;”\n \t\t d=“m 1,17 16,0 0,-1.7778 -5.333332,-3.5555 0,-1.7778 c 1.244444,0 1.244444,-2.3111 1.244444,-2.3111 l 0,-3.0222 C 12.555557,0.8221 9.0000001,1.0001 9.0000001,1.0001 c 0,0 -3.5555556,-0.178 -3.9111111,3.5555 l 0,3.0222 c 0,0 0,2.3111 1.2444443,2.3111 l 0,1.7778 L 1,15.2222 1,17 17,17” \n />\n\t\t\n\t\n \n\t<g id=“parallel”>\n\t\t<path oryx:anchors=“bottom” fill=“none” stroke="#bbbbbb" d=“M46 70 v8 M50 70 v8 M54 70 v8” stroke-width=2/>\n\t\n\t\n\t<g id=“sequential”>\n\t\t<path oryx:anchors=“bottom” fill=“none” stroke="#bbbbbb" stroke-width=2” d=“M46,76h10M46,72h10 M46,68h10”/>\n\t\n\t\n\n\t<g id=“compensation”>\n\t\t<path oryx:anchors=“bottom” fill=“none” stroke="#bbbbbb" d=“M 62 74 L 66 70 L 66 78 L 62 74 L 62 70 L 58 74 L 62 78 L 62 74” stroke-width=1/>\n\t\n \n",
“icon” : “activity/list/type.user.png”,
“groups” : [ “\u4efb\u52a1” ],
“propertyPackages” : [ “overrideidpackage”, “namepackage”, “documentationpackage”, “asynchronousdefinitionpackage”, “exclusivedefinitionpackage”, “executionlistenerspackage”, “multiinstance_typepackage”, “multiinstance_cardinalitypackage”, “multiinstance_collectionpackage”, “multiinstance_variablepackage”, “multiinstance_conditionpackage”, “isforcompensationpackage”, “usertaskassignmentpackage”, “formkeydefinitionpackage”, “formreferencepackage”, “duedatedefinitionpackage”, “prioritydefinitionpackage”, “formpropertiespackage”, “tasklistenerspackage”, “skipexpressionpackage”,“nodetypepackage” ],
“hiddenPropertyPackages” : [ ],
“roles” : [ “Activity”, “sequence_start”, “sequence_end”, “ActivitiesMorph”, “all” ]
}
编写angularJS脚本
在properties.js 配置模板;
“dragon-nodetype-combobox”: {
“readModeTemplateUrl”: “editor-app/configuration/properties/dragonnodetype-combobox-value-template.html”,
“writeModeTemplateUrl”: “editor-app/configuration/properties/dragonnodetype-combobox-property-write-template.html”
}

模板的内容
dragonnodetype-combobox-value-template.html 内容为:

<span>{{property.text}}</span>

dragonnodetype-combobox-property-write-template.html 内容为

 <div ng-controller="DragonNodetypeComboboxCtrl"><select ng-init="item = property.value" ng-model="item" ng-change="comboValueChanged(item)"ng-options="item.sn as item.name for item in nodeTypes"></select>
</div>
编写js控制器

properties-dragon-combobox-controller.js

angular.module('flowableModeler').controller('DragonNodetypeComboboxCtrl',[ '$scope', '$modal', '$http', function($scope, $modal, $http) {if ($scope.property.value == undefined && $scope.property.value == null) {$scope.property.value = '';}//请求数据//url 你可以请求你后台的rest接口来获取数据对象$http({method: 'GET',url: FLOWABLE.URL.getNodeProertyInfos('node_type')}).then(function successCallback(response) {$scope.nodeTypes = response.data.data;}, function errorCallback(response) {// 请求失败执行代码});$scope.comboValueChanged = function (item) {$scope.property.value = item;for (var i = 0; i < $scope.nodeTypes.length; i++) {if ($scope.nodeTypes[i].sn == item) {$scope.property.text = $scope.nodeTypes[i].name;}}$scope.updatePropertyInModel($scope.property);};}]);
配置引用

在index.html中加入自定的js

后台配置解析我们的节点属性
编写一个自定义的解析器

记住一定要继承UserTaskJsonConverter

public class BruceUserTaskJsonConverter extends UserTaskJsonConverter {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 setCustomTypes(Map<String, Class<? extends BaseBpmnJsonConverter>> convertersToBpmnMap,Map<Class<? extends BaseElement>, Class<? extends BaseBpmnJsonConverter>> convertersToJsonMap) {removeTypes(convertersToBpmnMap,convertersToJsonMap);fillTypes(convertersToBpmnMap,convertersToJsonMap);}public static void removeTypes(Map<String, Class<? extends BaseBpmnJsonConverter>> convertersToBpmnMap,Map<Class<? extends BaseElement>, Class<? extends BaseBpmnJsonConverter>> convertersToJsonMap) {convertersToJsonMap.remove(UserTask.class);convertersToBpmnMap.remove(StencilConstants.STENCIL_TASK_USER);}public static void fillJsonTypes(Map<String, Class<? extends BaseBpmnJsonConverter>> convertersToBpmnMap) {convertersToBpmnMap.put(STENCIL_TASK_USER, BruceUserTaskJsonConverter.class);}public static void fillBpmnTypes(Map<Class<? extends BaseElement>, Class<? extends BaseBpmnJsonConverter>> convertersToJsonMap) {convertersToJsonMap.put(UserTask.class, BruceUserTaskJsonConverter.class);}@Overridepublic void convertToJson(BaseElement baseElement, ActivityProcessor processor, BpmnModel model, FlowElementsContainer container, ArrayNode shapesArrayNode, double subProcessX, double subProcessY){super.convertToJson(baseElement, processor, model, container, shapesArrayNode, subProcessX, subProcessY);}@Overrideprotected FlowElement convertJsonToElement(JsonNode elementNode, JsonNode modelNode,Map<String, JsonNode> shapeMap) {UserTask flowElement = (UserTask) super.convertJsonToElement(elementNode, modelNode, shapeMap);List<CustomProperty> customProperties = new ArrayList<>();// 扩展 节点类型String nodetype = getPropertyValueAsString(FlowConstant.NODE_TYPE, elementNode);if (StringUtils.isNotBlank(nodetype)) {CustomProperty nodeType = this.createProperty(FlowConstant.NODE_TYPE, nodetype);customProperties.add(nodeType);}if (CollectionUtils.isNotEmpty(customProperties)) {flowElement.setCustomProperties(customProperties);}return flowElement;}/*** 创建自定义属性** @param propertyName  属性名称* @param propertyValue 属性值*/private CustomProperty createProperty(String propertyName, String propertyValue) {CustomProperty customProperty = new CustomProperty();customProperty.setId(propertyName);customProperty.setName(propertyName);customProperty.setSimpleValue(propertyValue);return customProperty;}
}
bean的初始化
public class CustomPropertyInit {public CustomPropertyInit(){Map<Class<? extends BaseElement>, Class<? extends BaseBpmnJsonConverter>> convertersToJsonMap = BpmnJsonConverter.convertersToJsonMap;Map<String, Class<? extends BaseBpmnJsonConverter>> convertersToBpmnMap = BpmnJsonConverter.convertersToBpmnMap;//添加自定义的任务json转化器BruceUserTaskJsonConverter.setCustomTypes(convertersToBpmnMap, convertersToJsonMap);}}
spring定义bean
/*** 自定义节点属性初始化*/@Beanpublic CustomPropertyInit createCustomPropertyInit() {return new CustomPropertyInit();}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/519570.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

终于有人把超融合和边缘计算说清楚了

戳蓝字“CSDN云计算”关注我们哦&#xff01;作者 | 采葑责编 | 阿秃近年来超融合在国内迎来快速增长&#xff0c;根据IDC最新发布的报告&#xff0c;2019上半年中国超融合市场增长率达56.7%&#xff0c;大幅超越去年同期。Gartner发布的最新报告&#xff0c;到2023年我国超融合…

表格存储TableStore全新升级,打造统一的在线数据存储平台!

表格存储TableStore是阿里云自研的面向海量结构化和半结构化数据存储的Serverless NoSQL多模型数据库&#xff0c;被广泛用于社交、物联网、人工智能、元数据和大数据等业务场景。表格存储TableStore采用与Google Bigtable类似的宽表模型&#xff0c;天然的分布式架构&#xff…

编写一个函数,该函数能判断一个英文句子str(带空格)中是否含有某个单词w,如“How old are you?”含有“old”。在main函数中输入一个英文句子,再输入一个单词,如果英文句子中含有那

题目要求&#xff1a; 编写一个C程序&#xff0c;实现以下功能&#xff1a; 编写一个函数&#xff0c;该函数能判断一个英文句子str(带空格&#xff08;升级版&#xff09;)中是否含有某个单词w,如“How old are you?”含有“old”。 在main函数中输入一个英文句子&#xff0…

java短信验证码功能发送的验证码如何校验_企业如何选择短信平台才能保障安全和稳定性?...

现如今互联网不断发展&#xff0c;人们对网络的依赖性越来越大&#xff0c; 伴随而来的网络运营安全问题越来越严重&#xff0c;安全是我们企业都担忧的一个大问题&#xff0c;短信平台的安全性再次被企业所重视起来。短信验证码日常生活中经常遇到&#xff0c;比如银行卡的绑定…

达摩院里的女Leader,一面温柔似水一面灿烂如阳

天下网商 贡晓丽 作为全球最成功的女性之一,谢丽尔桑德伯格在《向前一步》一书中深刻地剖析了男女不平等现象的根本原因&#xff0c;她认为&#xff0c;女性之所以没有勇气跻身领导层&#xff0c;不敢放开脚步追求自己的梦想&#xff0c;更多是出于内在的恐惧与不自信。 纵然…

flowable DMN规则引擎几种类型解释_04

文章目录单一命中第一个&#xff08;FIRST&#xff09;唯一&#xff08;UNIQUE&#xff09;优先级&#xff08;PRIORITY&#xff09;任何&#xff08;ANY&#xff09;多重命中输出顺序&#xff08;OUTPUT ORDER&#xff09;规则顺序&#xff08;RULE ORDER&#xff09;采集&…

“我哥毕业1年,做Python挣了50W!”网友:吹得太少...

现状揭秘&#xff1a;Python岗位大厂50K起&#xff1f;程序员&#xff1a;心态崩了&#xff01;屠杀各种榜单&#xff0c;拿下语言排行榜的Python&#xff0c;薪酬真的如同网传开挂了吗&#xff1f;笔者在脉脉上发现了这样的一个信息&#xff1a;但Python真的这么火&#xff1f…

Nvidia GPU如何在Kubernetes 里工作

Nvidia GPU如何在Kubernetes 里工作 本文介绍Nvidia GPU设备如何在Kubernetes中管理调度。 整个工作流程分为以下两个方面&#xff1a; 如何在容器中使用GPUKubernetes 如何调度GPU如何在容器中使用GPU 想要在容器中的应用可以操作GPU&#xff0c; 需要实两个目标 容器中可…

C++多重继承师生类复盘

要求&#xff1a;做一个基类Data&#xff0c;数据成员name&#xff0c;派生类教师teacher和学生student继承Data的name数据成员&#xff0c;此外教师新增薪水sal数据成员&#xff0c;学生新增学号id数据成员&#xff0c;派生类研究生Postgard继承学生,新增系别dn数据成员&#…

mysql的每隔1分钟定时_简单易用,spring boot集成quartz,实现分布式定时任务

什么是quartz&#xff1f;Quartz是一个完全由 Java 编写的开源任务调度框架。我们经常会遇到一些问题&#xff1a;想每个月27号&#xff0c;提醒信用卡还款&#xff1b;想每隔1小时&#xff0c;提醒一下&#xff0c;累了&#xff0c;站起来活动一下&#xff1b;想每个月定时发送…

flowable springboot 集成 flowableDMN_05

文章目录配置POM配置Config通过上述的配置&#xff0c;现在在spring容器中已经存在一些接口bean了项目地址&#xff1a;https://gitee.com/lwj/flowable.git 分支flowable-base视频地址&#xff1a;https://www.bilibili.com/video/av79774697/*DMN集成&#xff1a;这里我们说的…

阿里云安全肖力:从RSA2019看安全技术发展的十个机遇

又一年RSA大会归来。每一年参会&#xff0c;总会有一些不同的感悟&#xff0c;或是发现全球安全行业的新趋势&#xff0c;或是找到志同道合的新伙伴&#xff0c;或是看到很多人也相信我们相信的安全技术新方向。今天在回国的航班上提笔写下我的感悟和判断&#xff0c;希望对安全…

华为组织架调整,CloudAI升至第四大BG,打通全球第一款集成5G模组的4K直播编码器网络通信服务;谷歌宣布与IBM合作……...

关注并标星星CSDN云计算 速递、最新、绝对有料。这里有企业新动、这里有业界要闻&#xff0c;打起十二分精神&#xff0c;紧跟fashion你可以的&#xff01;每周两次&#xff0c;打卡即read更快、更全了解泛云圈精彩newsgo go goIntel 10nm Tiger Lake晶圆首曝&#xff1a;核心面…

编写C语言代码,实现以下功能:输入平面上两个点P1(x1,y1)和P2(x2,y2)的坐标,以这两个点为左上角和右下角可以确定一个矩形,输出这个矩形的周长。要求平面上点的坐标和矩形都用结构体来表示。

编写C语言代码&#xff0c;实现以下功能&#xff1a; 输入平面上两个点P1(x1,y1)和P2(x2,y2)的坐标&#xff0c;以这两个点为左上角和右下角可以确定一个矩形&#xff0c;输出这个矩形的周长。要求平面上点的坐标和矩形都用结构体来表示。 #define _CRT_SECURE_NO_WARNINGS 1 …

flowable DMN部署单独使用_06

文章目录配置规则部署使用项目地址&#xff1a;https://gitee.com/lwj/flowable.git 分支flowable-base视频地址&#xff1a;https://www.bilibili.com/video/av79774697/DMN部署&#xff1a; dmn制定了规则之后&#xff0c;还需要部署好才能用DMN部署&#xff0c;独立使用 配…

SpringBoot使用SOFA-Lookout监控

本文介绍SpringBoot使用蚂蚁金服SOFA-Lookout配合Prometheus进行监控。 1.SOFA-Lookout介绍 上一篇已经介绍使用Prometheus进行暴露SpringBoot的一些指标进行监控&#xff0c;传送门&#xff0c;这一篇介绍如何使用SOFA-Lookout配合Prometheus。 SOFA-Lookout是蚂蚁金服开源的…

python迷宫小游戏大全_Python迷宫小游戏源代码、源程序

Python迷宫小游戏源程序包括两个文件maze.py和mazeGenerator.py&#xff0c;mazeGenerator.py实现迷宫地图的生成&#xff0c;程序运行截图&#xff1a;mazeGenerator.pyimport numpy as npimport randomimport copyclass UnionSet(object): """ 并查集实…

NoSQL最新现状和趋势:云NoSQL数据库将成重要增长引擎

NoSQL最早起源于1998年&#xff0c;但从2009年开始&#xff0c;NoSQL真正开始逐渐兴起和发展。回望历史应该说NoSQL数据库的兴起&#xff0c;完全是十年来伴随互联网技术&#xff0c;大数据数据的兴起和发展&#xff0c;NoSQL在面临大数据场景下相对于关系型数据库运用&#xf…

编写C语言代码,实现以下功能:有N名学生,每个人的信息包括学号、姓名和语文、数学、英语、平均分等内容(用结构体表示 ),输出平均分排名倒数第2的学生信息。

编写C语言代码&#xff0c;实现以下功能&#xff1a; 有N名学生&#xff0c;每个人的信息包括学号、姓名和语文、数学、英语、平均分等内容&#xff08;用结构体表示 &#xff09;&#xff0c;输出平均分排名倒数第2的学生信息。 #define _CRT_SECURE_NO_WARNINGS 1 /*编写C语…

详谈ARM架构与ARM内核发展史

戳蓝字“CSDN云计算”关注我们哦&#xff01;作者 | 架构师技术联盟责编 | 阿秃1、ARM架构与ARM内核1.1 ARM架构与内核简述目前为止&#xff0c;ARM总共发布8种架构&#xff1a;ARMv1、ARMv2、ARMv3、ARMv4、ARMv5、ARMv6、ARMv7 、ARMv8&#xff0c;这是ARM架构指令集的多个v版…