Activiti7

因业务需要,所以对此做下记录

挂起、激活流程定义的所有流程实例


    /**
     * 通过流程定义对流程实例进行批量挂起或激活操作
     */
    public void suspendAllPeocessInstance(){
        //获取流程定义id
        final ProcessDefinition myEve =  repositoryService.createProcessDefinitionQuery().processDefinitionKey("myEve").singleResult();
        //获取流程定义状态
        final boolean suspended = myEve.isSuspended();
        //获取流程定义id
        final String definitionId = myEve.getId();
        //如果当前状态为挂起则激活   反之挂起
        if(suspended){
            repositoryService.activateProcessDefinitionById(definitionId,true,null);
        }else{
            repositoryService.suspendProcessDefinitionById(definitionId,true,null);
        }
    }

repositoryService

此过程操作activiti表中的以下表:
ACT_RE_PROCDEF //流程实例表
SUSPENSION_STATE_ 流程挂起状态 1.激活 2.挂起

ACT_RU_EXECUTION // 流程任务启动执行表
SUSPENSION_STATE_ 流程挂起状态 1.激活 2.挂起

ACT_RU_TASK //流程任务启动表
SUSPENSION_STATE_ 流程挂起状态 1.激活 2.挂起

挂起、激活单个流程实例

   /**
     * 挂起、激活单个流程实例
     */
    public void suspendSingleProcessIntance(){
        //获取流程实例id
        final ProcessInstance processInstance = runtimeService.createProcessInstanceQuery().processDefinitionId("27501").singleResult();
        //获取流程实例状态
        final boolean suspended = processInstance.isSuspended();
        //获取流程实例id
        final String instanceId = processInstance.getId();
        if(suspended){
            //激活
            runtimeService.activateProcessInstanceById(instanceId);
        }else {
            //挂起
            runtimeService.suspendProcessInstanceById(instanceId);
        }
    }

runtimeService

此过程操作activiti表中的以下表:
ACT_RU_EXECUTION // 流程任务启动执行表
SUSPENSION_STATE_ 流程挂起状态 1.激活 2.挂起

ACT_RU_TASK //流程任务启动表
SUSPENSION_STATE_ 流程挂起状态 1.激活 2.挂起

流程任务完成

 /**
     * 挂起后的任务不能被执行
     * 完成个人任务
     */
    public void  completTask(){
        //使用taskService获取任务
        final Task task = taskService.createTaskQuery()
                .processInstanceId("27501")
                .taskAssignee("zhangsan")
                .singleResult();
        System.out.println("流程定义id"+task.getProcessDefinitionId());
        System.out.println("流程任务id"+task.getId());
        System.out.println("流程实例id"+task.getProcessInstanceId());
        System.out.println("负责人"+task.getAssignee());
        System.out.println("任务名称"+task.getName());

        //根据任务id完成任务
        taskService.complete(task.getId());
    }

使用的Service为taskService

(当流程中的审批人,不固定为某个人或某些人时(即部门),可采用候选人方式,不设定任务节点的操作人,用候选人去 拾取任务后,进行完成)

获取任务候选人

/**
    * 
    *@User   :Test
    *@date   :2014-6-27 上午09:38:36
    *@return :Set
    *@userFor :获得任务中的办理候选人
    */
private Set getTaskCandidate(String taskId) {
	Set users = new HashSet();
	List identityLinkList = taskService.getIdentityLinksForTask(taskId);
	if (identityLinkList != null && identityLinkList.size() > 0) {
		for (Iterator iterator = identityLinkList.iterator(); iterator
				.hasNext();) {
			IdentityLink identityLink = (IdentityLink) iterator.next();
			if (identityLink.getUserId() != null) {
				User user = getUser(identityLink.getUserId());
				if (user != null)
					users.add(user);
			}
			if (identityLink.getGroupId() != null) {
				// 根据组获得对应人员
				List userList = identityService.createUserQuery()
						.memberOfGroup(identityLink.getGroupId()).list();
				if (userList != null && userList.size() > 0)
					users.addAll(userList);
			}
		}

	}
	return users;
}

private User getUser(String userId) {
	User user = (User) identityService.createUserQuery().userId(userId)
			.singleResult();
	return user;
}

拾取组任务

@Autowired
TaskService taskService;

/**
 * 候选人拾取任务
 * 根据任务id及候选人查询任务
 * 拾取任务
 */
public void cliamTask(){
    String taskId = "6234";
    String userId = "lisi";
    final Task task = taskService.createTaskQuery().taskId(taskId).taskCandidateUser(userId).singleResult();
    if(task != null){
        taskService.claim(taskId,userId);//拾取任务
    }
}
    

归还任务


    /**
     * 归还任务
     * 任务必须是自己名下的才可归还
     * 归还任务就是将任务的负责人设置为null
     */
    public void testAssigneeToGroupTask(){
        String taskId = "6234";
        String userId = "lisi";
        //根据key和负责人来查询任务
        final Task task = taskService.createTaskQuery().taskId(taskId).taskAssignee(userId).singleResult();
        if(task != null){
            taskService.setAssignee(taskId,null);//归还任务
        }
    }

交接任务 改变负责人

taskService.setAssignee(taskId,userId2);//交接任务

网关

排他网关 (ExclusiveGateway)

使用排他网关的优点在于,当程序执行条件分支时,没有符合的条件,如果没有排他网关则任务就会被结束,二使用后排他网关会给我们抛出异常然后处理即可。

并行网关

1.并行网关 会执行其下面的所有分支去执行,即使并行网关分支上存在条件,也会被忽略。
2.并行网关的设计,一般都会是前后都存在。后面的叫汇聚。如果并行网关存在一个处理完成,则需要等待所有的子模块都处理完成才可流向汇聚网关之后的节点。如下图:请添加图片描述

包含网关

实则是排他网关和并行网关的汇总,如下图:
分支上的条件需要满足,并且必须将所有分支都执行结束,方可执行下一步。
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值