刚刚初步研究了一下工作流的自定义页面设计,写个博客记录一下~
//创建新的流程模型
public String createNewModel(HashMap
parms) {
try{
String name = (String) parms.get("name");
String key = (String) parms.get("key");
String description = (String) parms.get("description");
ObjectMapper objectMap = new ObjectMapper();
ObjectNode modelObjectNode = objectMap.createObjectNode();
modelObjectNode.put(ModelDataJsonConstants.MODEL_NAME, name);
modelObjectNode.put(ModelDataJsonConstants.MODEL_REVISION, 1);
modelObjectNode.put(ModelDataJsonConstants.MODEL_DESCRIPTION, StringUtils.defaultString(description));
Model newModel = repositoryService.newModel();
newModel.setMetaInfo(modelObjectNode.toString());
newModel.setName(name);
newModel.setKey(StringUtils.defaultString(key));
repositoryService.saveModel(newModel);
ObjectNode editorNode = objectMap.createObjectNode();
editorNode.put("id", "canvas");
editorNode.put("resourceId", "canvas");
ObjectNode stencilSetNode = objectMap.createObjectNode();
stencilSetNode.put("namespace", "diagrams/bpmn2.0#");
editorNode.put("stencilset", stencilSetNode);
//为新模型绑定参数
repositoryService.addModelEditorSource(newModel.getId(), editorNode.toString().getBytes("utf-8"));
return "创建成功!";
}catch(Exception e){
System.out.println(e.toString());
return "创建失败!"+e.toString();
}
}//编辑已有的模型
public String editProcessModel(HashMap
parms){
String modelId = (String) parms.get("modelId");
String processId = (String) parms.get("processId");
String processName = (String) parms.get("processName");
List
flowElementList = (List
) parms.get("flowElementList");
try {
//获得模型对象
Model model = repositoryService.getModel(modelId);
if(model == null){
throw new Exception("未找到相关数据!");
}else{
// ObjectNode modelNode = (ObjectNode) new ObjectMapper().readTree(repositoryService.getModelEditorSource(model.getId()));
// //获得bpmnModel对象
// BpmnModel bpmnModel = new BpmnJsonConverter().convertToBpmnModel(modelNode);
BpmnModel bpmnModel = new BpmnModel();
Process process = new Process();
bpmnModel.addProcess(process);
process.setId(processId);
process.setName(processName);
//遍历flowElementList,形成新的流程
for(FlowElement flowElement : flowElementList){
// process.removeFlowElement(flowElement.getId());
addProcessElement(process,flowElementList);
process.addFlowElement(flowElement);
}
new BpmnAutoLayout(bpmnModel).execute();
//将bpmnModel保存到Model对象中
BpmnJsonConverter converter = new BpmnJsonConverter();
// ObjectNode modelNode = converter.convertToJson(bpmnModel);
JsonNode modelNode = converter.convertToJson(bpmnModel);
// System.out.println(String.valueOf(modelNode));
repositoryService.addModelEditorSource(model.getId(), String.valueOf(modelNode).getBytes("utf-8"));
}
// repositoryService.saveModel(model);
System.out.println("执行成功!");
return model.getId();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
return e.toString();
}
}public String exportProcessModel(HashMap
parms) { try { String modelId = (String) parms.get("modelId"); //获取模型对象 Model modeData = repositoryService.getModel(modelId); BpmnJsonConverter jsonConverter = new BpmnJsonConverter(); //从模型对象中获取Json数据 JsonNode editorNode = new ObjectMapper() .readTree(repositoryService.getModelEditorSource(modeData.getId())); //把Json对象转换成bpmnModel BpmnModel bpmnModel = jsonConverter.convertToBpmnModel(editorNode); if(bpmnModel == null){ throw new Exception("流程实例为空!"); } System.out.println("-----------------------"); System.out.println("流程实例ID:"+bpmnModel.getMainProcess().getId()); System.out.println("流程实例名称:"+bpmnModel.getMainProcess().getName()); System.out.println("-----------------------"); BpmnXMLConverter xmlConverter = new BpmnXMLConverter(); //把bpmnModel对象转换成XML格式 byte[] bpmnBytes = xmlConverter.convertToXML(bpmnModel); //创建输入流输出文件内容到浏览器 ByteArrayInputStream in = new ByteArrayInputStream(bpmnBytes); //保存到本地文件中 String fileName = bpmnModel.getMainProcess().getId() + ".bpmn"; File file = new File("src/main/resources/diagrams/"+ fileName); FileUtils.copyInputStreamToFile(in, file); return fileName; } catch (Exception e) { System.out.println(e.toString()); return "导出失败!"; } }
需要注意的是:
1、流程需要事先引入或者创建新的流程引擎来处理相关操作
2、我这里使用的传参方法是通过Map来传递参数,这个自由度比较高,参数就那么几个,可以使用不同的传参方式
3、里面的addProcessElement(process,flowElementList)方法是自定义的,就是用于添加各个节点的操作
//添加开始节点
public StartEvent createStartEventPoint(HashMap
parms) throws Exception {
String id = (String)parms.get("id");
if(id == null || id.equals("")){
throw new Exception("ID不能为空!");
}
StartEvent startEvent = new StartEvent();
startEvent.setId(id);
return startEvent;
}
//添加结束节点
public EndEvent createEndEventPoint(HashMap
parms) throws Exception {
String id = (String)parms.get("id");
if(id == null || id.equals("")){
throw new Exception("ID不能为空!");
}
EndEvent endEvent = new EndEvent();
endEvent.setId(id);
return endEvent;
}
//添加任务节点
public UserTask createUserTaskPoint(HashMap
parms) throws Exception {
String id = (String)parms.get("id");
if(id == null || id.equals("")){
throw new Exception("ID不能为空!");
}
String name = (String)parms.get("name");
if(name == null || name.equals("")){
throw new Exception("节点名称不能为空!");
}
String groupName = (String)parms.get("groupName");
if(groupName == null || groupName.equals("")){
throw new Exception("groupName不能为空!");
}
UserTask userTask = new UserTask();
userTask.setName(name);
userTask.setId(id);
List
candidateGroups = new ArrayList
(); candidateGroups.add(groupName); userTask.setCandidateGroups(candidateGroups); return userTask; } //添加连线节点 public SequenceFlow createSequenceFlowPoint(HashMap
parms) throws Exception { String from = (String)parms.get("from"); if(from == null || from.equals("")){ throw new Exception("起点不能为空!"); } String to = (String)parms.get("to"); if(to == null || to.equals("")){ throw new Exception("重点不能为空!"); } String condition = (String)parms.get("condition"); SequenceFlow flow = new SequenceFlow(); flow.setSourceRef(from); flow.setTargetRef(to); if(condition != null && !condition.equals("")){ flow.setConditionExpression("#{message == '"+condition+"'}"); } return flow; }
添加节点的时候需要注意的是SequenceFlow这个连线的对象,我参照网上一些资料,发现先保存到模型再读取出来,连线的SourceRef和TargetRef属性值就丢失了,费解了许久终于发现了原因,原来在添加连线的同时,也需要的对线两端的节点对象设置一下。
List
sequenceFlows=new ArrayList
();
SequenceFlow sequenceFlow = new SequenceFlow();
sequenceFlow.setId("sequenceFlow1");
sequenceFlow.setSourceRef("start");
sequenceFlow.setTargetRef("usertask");
sequenceFlow.setConditionExpression("#{message=='通过'}");
sequenceFlows.add(sequenceFlow);
startEvent.setOutgoingFlows(sequenceFlows);
userTask.setIncomingFlows(sequenceFlows);
flowElementList.add(sequenceFlow);
东西比较乱,其他的东西应该都可以做相应处理,就不详述了,只记录下一下整体思路吧