springboot + activiti6常用流程实战(顺序流程,排他网关)

一.基本流程实现

流程测试我这用的是swagger,也可以用postman进行流程的运行,

       (1)先来了解什么是并行网关  图标为+

  并行网关允许将流程分成多条分支,也可以把多条分支汇聚到一起,并行网关的功能是基于进入和外出顺序流的:

  fork 分支:

    并行后的所有外出顺序流,为每个顺序流都创建一个并发分支。

  join 汇聚:

    所有到达并行网关,在此等待的进入分支, 直到所有进入顺序流的分支都到达以后,  流程就会通过汇聚网关。

  注意:

    如果同一个并行网关有多个进入和多个外出顺序流, 它就同时具有分支和汇聚功能。 这时, 网关会先汇聚所有进入的顺序流,然后再切分成多个并行分支。

      (2)什么是排他网关  图标为 -

           排他网关是用来控制流程的流向.

  并行与其他网关的主要区别:

    并行网关不会解析条件。 即使顺序流中定义了条件,也会被忽略。

流程图对应一个流程id和多个任务.每个任务对应每个人来操作.

1.普通流程,先用idea插件画BPMN流程图.这个插件画相对eclipse插件,或者activiti-app相对恶心点,不好画.如果不习惯这个插件,也可以用其他软件画好,复制过来.

2.发起流程,此流程很简单,先是主管审核,主管审完然后人事审核,流程结束,接下来开始操作

上一节config初始化配置拿到的流程相关接口注入.

   启动流程

   /**
     * 启动流程
     * @param perid
     * @param tempName
     * @param map
     * @return
     */
    @Override
    public ProcessInstance getTask(String perid, String tempName, Map<String, Object> map){
        identityService.setAuthenticatedUserId(perid);
        // 开始流程  map内容set对应的审核用户
        ProcessInstance pi = runtimeService.startProcessInstanceByKey(tempName, map);
        // 查询当前任务
        return pi;
    }

map里面对应的key可以set用户,也可以在流程图写死,一般是根据业务来进行set对应的用户(assignee属性配置)

perid 发起流程的用户

tempName 此流程的名称

3.流程启动然后到主管,用主管查询待审核的流程

    @Override
    public List<ActivitiTask> myApproval(String userName) {
        List<Task> taskList = taskService.createTaskQuery().taskAssignee(userName)
                .orderByTaskCreateTime().desc().list();
        // 多此一举 taskList中包含了以下内容(用户的任务中包含了所在用户组的任务)
        //        Group group = identityService.createGroupQuery().groupMember(userName).singleResult();
        //        List<Task> list = taskService.createTaskQuery().taskCandidateGroup(group.getId()).list();
        //        taskList.addAll(list);
        List<ActivitiTask> activitiTaskList = new ArrayList<>();
        for (Task task : taskList) {
            ActivitiTask activitiTask = new ActivitiTask();
            activitiTask.setId(task.getId());
            activitiTask.setName(task.getName());
            activitiTask.setCreateTime(task.getCreateTime());
            String instanceId = task.getProcessInstanceId();
            ProcessInstance instance = runtimeService.createProcessInstanceQuery().processInstanceId(instanceId).singleResult();
            Activiti activiti = getActiviti(instance);
            activitiTask.setActiviti(activiti);
            activitiTask.setProcessInstanceId(instanceId);
            activitiTaskList.add(activitiTask);
        }
        return activitiTaskList;

4,查询到待审核的任务,根据任务id和当前用户进行审核

  审核操作(审核操作可能会牵扯到是否同意,原因等字段,可以自定义进行传参)

    @Override
    public Boolean passApproval(String userName, ActivitiTask activitiTask) {
        String taskId = activitiTask.getId();
        Map<String, Object> vars = new HashMap<>();
        vars.put("result", activitiTask.getActiviti().getResult());
        vars.put("auditor", activitiTask.getActiviti().getAuditor());
        vars.put("auditTime", new Date());
        vars.put("ifPass", activitiTask.getActiviti().getIfPass());
        //taskService.claim(taskId, userName);
        taskService.setAssignee(taskId, userName);
        taskService.complete(taskId, vars);
        return true;
    }

5,审核成功之后进入人事审核,人事审核同样上述操作,审核完成,流程结束.

6.想要查看当前流程进度,查看流程图(根据流程的id获取流程图)

    /**
     * 生成流程图片
     *
     * @param processDefinitionId
     * @param outputStream
     * @return
     */
    @Override
    public void tracePhoto(String processDefinitionId, OutputStream outputStream) {
        ActUtils.getFlowImgByInstanceId(processDefinitionId, outputStream);
    }

以上基本流程代码已经可以实现流程的步骤,

二 .排他网关的流程实现

排他网关在业务流程中可能有两种或者多种选择,选择不同结果会进入的下一步流程就会不同,所以在他的后面用表达式进行区分,在实现审核的时候根据你审核的参数他会进入不同的审核状态

 用户申报流程,申报成功结转到审核,审核有两种情况,在condition属性下配置表达式,同意流程结束,不同意,退回重新申报,接下来开始操作

1.此方法操作跟上面接口一直,在审核的时候,你只需要给参数ifPass进行写入数据,同意为1,不同意为0,,如果没有满足的值会抛出异常,流程审核会根据你的条件退回去还是结束.

后面还有对应的多人顺序或者并列审核,持续学习,持续更新.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值