学习页面化设计工作流流程图

刚刚初步研究了一下工作流的自定义页面设计,写个博客记录一下~

//创建新的流程模型
	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);
     
     
    
    
东西比较乱,其他的东西应该都可以做相应处理,就不详述了,只记录下一下整体思路吧


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值