Activiti业务关联流程

/**
	 * 工作流开发的重点是:让流程关联业务,也就是说让流程实例关联业务数据
	 */
	@Override
	public void saveStartProcess(WorkflowBean workflowBean) {
		//1:获取请假单ID,使用请假单ID,查询请假单的对象LeaveBill
		Long id = workflowBean.getId();
		LeaveBill leaveBill = leaveBillDao.findLeaveBillById(id);
		//2:更新请假单的请假状态从0变成1(初始录入-->审核中)
		leaveBill.setState(1);
		//3:使用当前对象获取到流程定义的key(对象的名称就是流程定义的key)
		System.out.println(leaveBill.getClass().getName());
		System.out.println(leaveBill.getClass().getSimpleName());
		System.out.println(leaveBill.getClass().getCanonicalName());
		String key = leaveBill.getClass().getSimpleName();
		/**
		 * 4:从Session中获取当前任务的办理人,
		 * 使用流程变量设置下一个任务的办理人
	     * inputUser是流程变量的名称,
	     * 获取的办理人是流程变量的值
		 */
		/*
		runtimeService.startProcessInstanceByKey(key);
		流程图中的Assignee:${inputUser}
		是使用流程变量的方式动态设置任务办理人
		从Session中获取当前任务的办理人 使用流程变量设置下一个任务的办理人
		inputUser是流程变量的名称
		获取的办理人事流程变量的值
		使用流程定义key启动流程实例,同时设置流程变量
		runtimeService.startProcessInstanceByKey(key,variables);
		*/
		Map<String, Object> variables = new HashMap<String,Object>();
		variables.put("inputUser", SessionContext.get().getName());//表示惟一用户
		/**
		 * 5:(1)使用流程变量设置字符串(格式:LeaveBill.id的形式),
		 *      通过设置,让启动的流程(流程实例)关联业务
   			  (2)使用正在执行对象表中的一个字段BUSINESS_KEY(Activiti提供的一个字段),
   			            让启动的流程(流程实例)关联业务
   			  格式:LeaveBill.id的形式(使用流程变量)
		 */
		/*
		 * 让流程关联业务
		 * 1.使用流程变量
		 * 方式一:使用一个LeaveBill类(javaBean)存放流程变量(与流程实例绑定)
		 * 	    javaBean 一定要实现 序列化接口 固定序列化版本ID
		 * 方式二:使用一个字符串
		 *      字符串的格式  LeaveBill.ID
		 *      在查询流程变量的时候,如果获取流程变量的值LeaveBill.1,使用1查询
		 *      LeaveBill对象,获取当前申请的请假单的数据
		 * 2.使用正在执行对象表中的一个字段(Activiti提供的一个字段JBPM没有提供)
		 * 	 act_ru_execution表中的 BUSINESS_KEY 字段
		 *   将字符串存到该字段上 也可以实现让流程关联业务
		 */
		/**
         * 5:   (1)使用流程变量设置字符串(格式:LeaveBill.id的形式),通过设置,让启动的流程(流程实例)关联业务
         *    (2)使用正在执行对象表中的一个字段BUSINESS_KEY(Activiti提供的一个字段),让启动的流程(流程实例)关联业务
         */
        //格式:LeaveBill.id的形式(使用流程变量)
		String objId = key+"."+id;
		variables.put("objId", objId);
		//6:使用流程定义的key,启动流程实例,同时设置流程变量,
		//同时向正在执行的执行对象表中的字段BUSINESS_KEY添加业务数据,同时让流程关联业务
		runtimeService.startProcessInstanceByKey(key,objId,variables);
	}

获取业务实体

/**
	 * 使用任务id获取LeaveBill
	 */
	@Override
	public LeaveBill findLeaveBillByTaskId(String taskId) {
		Task task = taskService.createTaskQuery()
				   .taskId(taskId)
				   .singleResult();
		String processInstanceId = task.getProcessInstanceId();
		String objId = (String) taskService.getVariable(taskId, "objId");
	    ProcessInstance pi = runtimeService.createProcessInstanceQuery()
					  .processInstanceId(processInstanceId)
					  .singleResult();
		
		String buindess_key = pi.getBusinessKey();
		
		if(StringUtils.isNotEmpty(buindess_key)){
			//截取字符串  点 截取字符串的时候 需要转义 \\.
			String leaveBillId = buindess_key.split("\\.")[1];
			LeaveBill leaveBill = leaveBillDao.findLeaveBillById(Long.parseLong(leaveBillId));
			return leaveBill;
		}
		return null;
	}
runtimeService.createProcessInstanceQuery().processInstanceBusinessKey(processInstanceBusinessKey, processDefinitionKey)

建议数据库冗余设计:在业务表设计的时候添加一列:PROCESS_INSTANCE_ID varchar2(64),在流程启动之后把流程ID更新到业务表中,这样不管从业务还是流程都可以查询到对方!

猜你喜欢

转载自my.oschina.net/u/3134761/blog/1814044