OA-activity逻辑流程记录(工作)

(一) 部署流程图
1.读取resources目录下的processes目录下的后缀为.bpmn文件,代码如下:
 

List<ProcessFileModel> processFileModels = new ArrayList<ProcessFileModel>();
		try {
			ResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
			Resource[] resources = resolver.getResources("classpath:processes/*.*");
			if(resources != null && resources.length > 0) {
				int i = 1;
				for(Resource resource : resources) {
					if (!resource.getFilename().contains(".bpmn")) {
						continue;
					}
					ProcessFileModel processFileModel = new ProcessFileModel();
					processFileModel.setId(i);
					processFileModel.setFileName(resource.getFilename());
					log.info("文件名称:" + resource.getFilename());
					String filePath = resource.getURL().toString();
					log.info("文件路径:" + filePath);
					filePath = filePath.substring(0, filePath.lastIndexOf("."));
					processFileModel.setPicPath(filePath + ".png");
					processFileModels.add(processFileModel);
					i++;
				 }
			}
		} catch (IOException e) {
			e.printStackTrace();
		}

2.返回到页面以列表形式展示,然后有部署按钮。

 

部署的代码如下:
 

public void deploymentProcess(String procName, String procCategory, String fileName) throws Exception{
		String bpmnPath = "processes/"+fileName;
		String pngPath = "processes/"+fileName.substring(0, fileName.lastIndexOf("."))+".png";
		repositoryService.createDeployment()//创建一个部署对象
				.name(procName)//添加部署的名称
				.category(procCategory)
				.addClasspathResource(bpmnPath)
				.addClasspathResource(pngPath)
				.deploy();
	}

(二) 启动流程
2.1  在发起申请时。查询流程最大版本号,代码如下:

public List<ProcessDefinition> listLastVersionProcessDefinition() {
		List<ProcessDefinition> list = repositoryService.createProcessDefinitionQuery()
				.orderByProcessDefinitionVersion().asc().list();
		Map<String, ProcessDefinition> map = new LinkedHashMap<String, ProcessDefinition>();
		if (list != null && list.size() > 0) {
			for (ProcessDefinition pd : list) {
				if(!(ActivitiContants.ACT_PROC_TYPE_SPECIAL.equals(pd.getCategory()) ||
						ActivitiContants.ACT_PROC_TYPE_RES.equals(pd.getCategory()))) {
					map.put(pd.getKey(), pd);
				}
			}
		}
		List<ProcessDefinition> pdList = new ArrayList<ProcessDefinition>(map.values());
		return pdList;
	}

2.2 把数据渲染到页面让用户选择申请哪个流程。
2.3查询需要的数据到页面,填好资料后提交到后台。然后启动流程
       获取下一个节点,代码如下(注activitiId是当前节点,类似于startEvent)

	/**
	* @Title: getNextNodeByProcInsId
	* @Description: 根据流程实例,节点编号获取流程下一个节点
	* @param @param procDefId
	* @param @param activitiId
	* @param @return    参数
	* @return List<PvmActivity>    返回类型
	*/
	public List<PvmActivity> getNextNodeByProcInsId(String procDefId, String activitiId) {
		List<PvmActivity> pvmActivitys = new ArrayList<PvmActivity>();
		//然后根据当前任务获取当前流程的流程定义,然后根据流程定义获得所有的节点
		ProcessDefinitionEntity defEntity = (ProcessDefinitionEntity) ((RepositoryServiceImpl) repositoryService).getDeployedProcessDefinition(procDefId);
		List<ActivityImpl> activitiList = defEntity.getActivities();
		//然后循环activitiList 并判断出当前流程所处节点,然后得到当前节点实例,根据节点实例获取所有从当前节点出发的路径,然后根据路径获得下一个节点实例:
		for (ActivityImpl activityImpl : activitiList) {
			String id = activityImpl.getId();
			if (activitiId.equals(id)) {
				System.out.println("当前任务:" + activityImpl.getProperty("name")); // 输出某个节点的某种属性
				List<PvmTransition> outTransitions = activityImpl.getOutgoingTransitions();// 获取从某个节点出来的所有线路
				for (PvmTransition pt : outTransitions) {
					PvmActivity ac = pt.getDestination(); // 获取线路的终点节点
					System.out.println("下一步任务任务:" + ac.getProperty("name"));
					pvmActivitys.add(ac);
				}
				break;
			}
		}
		return pvmActivitys;
	}
          //启动流程
		Authentication.setAuthenticatedUserId(userId+"");//设置流程发起人
		pi = runtimeService.startProcessInstanceByKey(procInsKey, variables);

 

(三) 任务审批
 

//设置批注及流程变量
addComment(ActivitiContants.METHOD_COMPLETE_TASK, taskId, task.getTaskDefinitionKey(), result, comment);
/**
	* @Title: addComment
	* @Description: 流程添加批注
	* @param @param methodType 方法类型
	* @param @param taskId 任务编号
	* @param @param TaskDefKey 任务节点编号
	* @param @param result 审批结果
	* @param @param comment  审批批注  参数
	* @return void    返回类型
	*/
	private void addComment(String methodType, String taskId, String taskDefKey, String result, String comment) {
		String _comment = comment;
		if(methodType.equals(ActivitiContants.METHOD_COMPLETE_TASK)) {
			if(CompleteResultEnum.AGREE.getValue().equals(result)) {
				_comment = "同意_"+_comment;
			}else if(CompleteResultEnum.DISAGREE.getValue().equals(result)) {
				_comment = "不同意_"+_comment;
			}else if(CompleteResultEnum.REJECT.getValue().equals(result)) {
				_comment = "不同意_"+_comment;
			}
		}else if(methodType.equals(ActivitiContants.METHOD_REJECT_TASK)) {
			if(StringUtils.isNotEmpty(result)){
				if("3".equals(result)){
					_comment = "不同意_"+_comment;
				}else{
					_comment = "驳回_"+_comment;
				}
			}
		}else if(methodType.equals(ActivitiContants.METHOD_CALLBACK_PROCESS)) {
			_comment = "流程取回_"+_comment;
		}else if(methodType.equals(ActivitiContants.METHOD_STOP_PROCESS)) {
			_comment = "发起人撤回_"+_comment;
		}else if(methodType.equals(ActivitiContants.METHOD_ROLLBACK_WORKFLOW)) {
			_comment = "流程被退回_"+_comment;
		}

		// 设置批注
		taskService.addComment(taskId, null, _comment);
		// 设置变量
		Map<String, Object> procVariables = new HashMap<String, Object>();
		procVariables.put(taskDefKey + "result", result);
		procVariables.put(taskDefKey + "comment", comment);
		taskService.setVariables(taskId, procVariables);
	}
taskService.complete(taskId,variables);

项目中有一个表单配置和节点配置

一个很重要的表。以这个表为核心

 

 

Guess you like

Origin blog.csdn.net/weixin_43075758/article/details/117355923