很多时候因为自己的业务需求需要修改节点的属性
例如需要在用户任务节点添加部门与岗位属性
首先修改stencilset.json
在propertyPackages下添加岗位与部门
{
"name" : "responsiblepostpackage",
"properties" : [{
"id" :"responsiblepost",
"type" : "responsiblepostcomplex",
"title" : "责任岗位",
"value" : "",
"description" : "请选择责任岗位.",
"popular" : true
}]
}, {
"name" : "responsibledepartmentpackage",
"properties" : [{
"id" :"responsibledepartment",
"type" : "responsibledepartmentcomplex",
"title" : "责任部门",
"value" : "",
"description" : "请选择责任部门.",
"popular" : true
}]
},
注意这里我们定义的name,后面我们需要节点下的propertyPackages添加。
stencilset.json修改完成
修改editor-app/configuration/properties.js
添加自定义属性展示页面的路径,即下拉框展示的页面
"responsiblepostcomplex" : {
"readModeTemplateUrl": "editor-app/configuration/properties/default-value-display-template.html",
"writeModeTemplateUrl": "editor-app/configuration/properties/responsible-post-list-template.html"
},
"responsibledepartmentcomplex" : {
"readModeTemplateUrl": "editor-app/configuration/properties/default-value-display-template.html",
"writeModeTemplateUrl": "editor-app/configuration/properties/responsible-department-list-template.html"
},
responsiblepostcomplex 是我们在stencilset.json中定义的type
在templates/modeler.html里添加js
新建editor-app/configuration/responsible-post-controller.js
js内容:
var options = []
var KisBpmMultiInstanceCtrl = [ '$scope','$http', function($scope,$http) {
$http.get("http://10.200.8.21:9010/imcp/business/business-ps-temp/getOrtherList")
.then(function (response) {
$scope.property.option1s = response.data.orgList
options = response.data.jobList
});
$scope.multiInstanceSelectChanged = function(){
$scope.updatePropertyInModel($scope.property);
};
$scope.multiInstanceSelectChanged1 = function(){
$http.get("http://10.200.8.21:9010/imcp/business/business-ps-temp/getJobList?orgId="+$scope.property.value)
.then(function (response) {
//修改scope的值
setTimeout(function(){
$scope.$apply(function(){
options = []
options = response.data.jobList
})
},1000)
});
$scope.updatePropertyInModel($scope.property);
};
}];
var KisBpmMultiInstanceCtr2 = [ '$scope','$http', function($scope,$http) {
if($scope.property.options != options){
setInterval(function () {
$scope.$apply(function(){
$scope.property.options = options
})
})
}
$scope.multiInstanceSelectChanged = function(){
$scope.updatePropertyInModel($scope.property);
};
}];
这里需要我们定义获取数据的接口,我这里是http://10.200.8.21:9010/imcp/business/business-ps-temp/getOrtherList
新建editor-app/configuration/properties/responsible-department-list-template.html
页面内容
ng-options="item.organizationId as item.organizationName for item in property.option1s">
ng-change=“multiInstanceSelectChanged1()” 这里定义onchange方法,选择部门的时候后面显示相应部门的岗位
选择完部门后,通过部门ID去获取该部门的岗位,然后将岗位信息存储到options全局变量中
然后再在岗位页面的controller中写一个定时循环的方法,获取options值,然后强制刷新。实现下拉框联动
新建editor-app/configuration/properties/responsible-post-list-template.html
页面内容
ng-options="item.jobId as item.jobName for item in property.options">
前端的已经改完了,还需要重写activiti的方法
新建 CustomUserTaskJsonConverter.java
package com.ww.activiti.config;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.node.ObjectNode;
import org.activiti.bpmn.model.BaseElement;
import org.activiti.bpmn.model.CustomProperty;
import org.activiti.bpmn.model.FlowElement;
import org.activiti.bpmn.model.UserTask;
import org.activiti.editor.language.json.converter.UserTaskJsonConverter;
import java.util.Map;
public class CustomUserTaskJsonConverter extends UserTaskJsonConverter {
@Override
protected FlowElement convertJsonToElement(JsonNode elementNode, JsonNode modelNode, Map shapeMap) {
FlowElement flowElement = super.convertJsonToElement(elementNode,modelNode,shapeMap);
UserTask userTask = (UserTask)flowElement;
CustomProperty customProperty = new CustomProperty();
//添加扩展属性的名称对应stencilset.json里定义的id
customProperty.setName("responsibledepartment");
customProperty.setSimpleValue(this.getPropertyValueAsString("responsibledepartment",elementNode));
CustomProperty customProperty1 = new CustomProperty();
customProperty1.setName("responsiblepost");
customProperty1.setSimpleValue(this.getPropertyValueAsString("responsiblepost",elementNode ));
CustomProperty customProperty2 = new CustomProperty();
customProperty2.setName("forms");
customProperty2.setSimpleValue(this.getPropertyValueAsString("forms",elementNode ));
userTask.getCustomProperties().add(customProperty);
userTask.getCustomProperties().add(customProperty1);
userTask.getCustomProperties().add(customProperty2);
return userTask;
}
@Override
protected void convertElementToJson(ObjectNode propertiesNode, BaseElement baseElement) {
super.convertElementToJson(propertiesNode,baseElement);
}
}
新建 CustomBpmnJsonConverter.java
package com.ww.activiti.config;
import org.activiti.editor.language.json.converter.BaseBpmnJsonConverter;
import org.activiti.editor.language.json.converter.BpmnJsonConverter;
import java.util.Map;
public class CustomBpmnJsonConverter extends BpmnJsonConverter {
public static Map> getConvertersToBpmnMap(){
return convertersToBpmnMap;
}
}
在部署流程的方法中添加
@PostMapping("{id}/deployment")
public Object deploy(@PathVariable("id")String id,HttpServletResponse response) throws Exception {
response.setHeader("Access-Control-Allow-Origin","*");
//获取模型
Model modelData = repositoryService.getModel(id);
byte[] bytes = repositoryService.getModelEditorSource(modelData.getId());
if (bytes == null) {
return ToWeb.buildResult().status(Status.FAIL)
.msg("模型数据为空,请先设计流程并成功保存,再进行发布。");
}
JsonNode modelNode = new ObjectMapper().readTree(bytes);
CustomBpmnJsonConverter.getConvertersToBpmnMap().put("UserTask", CustomUserTaskJsonConverter.class);
BpmnModel model = new BpmnJsonConverter().convertToBpmnModel(modelNode);
if(model.getProcesses().size()==0){
return ToWeb.buildResult().status(Status.FAIL)
.msg("数据模型不符要求,请至少设计一条主线流程。");
}
byte[] bpmnBytes = new BpmnXMLConverter().convertToXML(model);
//发布流程
String processName = modelData.getName() + ".bpmn20.xml";
Deployment deployment = repositoryService.createDeployment()
.name(modelData.getName())
.addString(processName, new String(bpmnBytes, "UTF-8"))
.deploy();
modelData.setDeploymentId(deployment.getId());
repositoryService.saveModel(modelData);
return ToWeb.buildResult().msg(deployment.getId());
}
启动程序即可