activiti2-多用户完成一节点任务

需求是这样,调度员派了一个任务给N个人,N个人都必须完成,这件事才算完成。


定义流程为这样:


其中网格员巡查,是多个人分别要完成自己的任务,所以这样配置分配人:



分配窗口:


下面看下代码,代码包含了查任务列表的功能:

package com.xx;

import com.google.gson.Gson;
import org.activiti.bpmn.model.*;
import org.activiti.bpmn.model.Process;
import org.activiti.engine.*;
import org.activiti.engine.history.HistoricProcessInstance;
import org.activiti.engine.history.HistoricTaskInstance;
import org.activiti.engine.impl.RepositoryServiceImpl;
import org.activiti.engine.impl.persistence.entity.IdentityLinkEntity;
import org.activiti.engine.impl.persistence.entity.ProcessDefinitionEntity;
import org.activiti.engine.impl.util.ProcessDefinitionUtil;
import org.activiti.engine.repository.ProcessDefinition;
import org.activiti.engine.runtime.Execution;
import org.activiti.engine.runtime.ExecutionQuery;
import org.activiti.engine.runtime.ProcessInstance;
import org.activiti.engine.task.Task;
import org.activiti.spring.boot.SecurityAutoConfiguration;
import org.mybatis.spring.annotation.MapperScan;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ConfigurableApplicationContext;

import java.text.SimpleDateFormat;
import java.util.*;

@SpringBootApplication(exclude = SecurityAutoConfiguration.class)
public class Application {
    private static Logger logger= LoggerFactory.getLogger(Application.class);
    Gson gson=new Gson();
    @Autowired
    RuntimeService runtimeService;
    @Autowired
    HistoryService historyService;
    @Autowired
    TaskService taskService;

    @Autowired
    ProcessEngine processEngine;
    @Autowired
    RepositoryService repositoryService;
    SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

    public static void main(String[] args) {
        ConfigurableApplicationContext context=SpringApplication.run(Application.class,args);
        //启动流程
        //context.getBean(Application.class).startLeaveProcessMul("multipers");
        //查询本人任务
        //context.getBean(Application.class).findTask("grid2");

        Map<String,Object> nextAssign=new HashMap<>();
        List<String> gridList= new ArrayList<>();
        gridList.add("grid1");
        gridList.add("grid2");

        nextAssign.put("gridUserList",gridList);
        //context.getBean(Application.class).completeTask("22514",nextAssign);
        //context.getBean(Application.class).completeTask("22517");


        //查询实例,及历史节点
        context.getBean(Application.class).queryInstances("multipers");

    }


    public String startLeaveProcess(){

        // 启动流程
        Map<String,Object> map = new HashMap<>(1);
        // 设置流程启动人
        map.put("applyUserId","cz");
        ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("first");
        System.out.println("请假流程启动成功,流程实例id为 "+processInstance.getId());
        // 回填 流程实例id
        //leaveMapper.updateLeave(leave.getId(),processInstance.getId());

        return "请假流程启动成功";
    }

    public String startLeaveProcessMul(String procName){
        // 启动流程
        Map<String,Object> map = new HashMap<>(1);
        // 设置流程启动人
        map.put("applyUserId","boss");
        ProcessInstance processInstance = runtimeService.startProcessInstanceByKey(procName);
        System.out.println("巡查流程启动成功,流程实例id为 "+processInstance.getId());
        // 回填 流程实例id
        //leaveMapper.updateLeave(leave.getId(),processInstance.getId());

        return "巡查流程启动成功";
    }

    public void findTask(String userName){

        List<Task> list = taskService.createTaskQuery().taskAssignee(userName).list();
        Collections.sort(list, new Comparator<Task>() {
            @Override
            public int compare(Task o1, Task o2) {
                if(o1.getCreateTime().before(o2.getCreateTime())){
                    return 1;
                }else if(o1.getCreateTime().getTime()==o2.getCreateTime().getTime()){
                    return 0;
                }else{
                    return -1;
                }
            }
        });
        if(list!=null && list.size()>0){
            for(Task task:list){
                System.out.print("\t任务ID:"+task.getId());
                System.out.print("\t任务的办理人:"+task.getAssignee());
                System.out.print("\t任务名称:"+task.getName());
                System.out.print("\t任务的创建时间:"+sdf.format(task.getCreateTime()));
                System.out.println("\t流程实例ID:"+task.getProcessInstanceId());
            }
        }
    }

    /*完成任务,流转*/
    public void completeTask(String taskId) {
        processEngine.getTaskService().complete(taskId);
    }
    public void completeTask(String taskId,Map<String,Object> param) {
        processEngine.getTaskService().complete(taskId,param);
    }


    public void queryInstances(String procKey) {
        /*
        ProcessInstanceQuery query=runtimeService.createProcessInstanceQuery();

        List<ProcessInstance> procList= query.processDefinitionName(procKey).orderByProcessInstanceId().desc().list();
        //List<ProcessInstance> procList= query.list();
        for(int i=0;i<procList.size();i++){
            ProcessInstance pi=procList.get(i);
            System.out.println("=======流程实例"+(i+1)+"===========");
            System.out.print("\t流程实例Id:"+pi.getId());
            System.out.print("\t流程活动节点Id:"+pi.getActivityId());
            System.out.println("\t流程定义Id:"+pi.getProcessDefinitionId());
            getHistoryTaskInstance(pi.getId());
        }

         */



        List<HistoricProcessInstance> histProcList= historyService.createHistoricProcessInstanceQuery().processDefinitionName(procKey).orderByProcessInstanceStartTime().desc().list();
        for(int i=0;i<histProcList.size();i++){
            HistoricProcessInstance pi=histProcList.get(i);
            System.out.println("=======流程实例"+(i+1)+"===========");
            System.out.print("\t流程实例Id:"+pi.getId());
            System.out.println("\t流程定义Id:"+pi.getProcessDefinitionId());
            getHistoryTaskInstance(pi.getId());
        }
    }
    public void getHistoryTaskInstance(String instanceId) {

        List<HistoricTaskInstance> historicActivityInstanceList = processEngine.getHistoryService().createHistoricTaskInstanceQuery()
                .processInstanceId(instanceId).orderByHistoricTaskInstanceStartTime().desc().list();
        //HistoricProcessInstance historicProcessInstance = processEngine.getHistoryService().createHistoricProcessInstanceQuery().processInstanceId(instanceId).singleResult();
        System.out.println("\t=======历史流程节点(任务)相关信息查询===========");
        for(HistoricTaskInstance task:historicActivityInstanceList) {
            System.out.print("\t\t历史流程实例ID:" + task.getId());
            System.out.print("\t\t历史流程实例名称:" + task.getName());



            System.out.print("\t\t父级Id:" );
            System.out.print("\t历史流程实例创建时间:" + (task.getStartTime()==null?"null":sdf.format(task.getStartTime())));
            System.out.println("\t历史流程实例结束时间:" + (task.getEndTime()==null?"null":sdf.format(task.getEndTime())));

            System.out.println("\t\t前节点:"+getBeforeAfter(task,true,false));
            System.out.println("\t\t后节点:"+getBeforeAfter(task,false,true));
        }
    }





    private List<String>  getBeforeAfter(HistoricTaskInstance task,boolean needBefore,boolean needAfter) {
        String defProcessId = historyService.createHistoricProcessInstanceQuery().processInstanceId(task.getProcessInstanceId()).singleResult().getProcessDefinitionId();
        //获取bpm对象
        BpmnModel bpmnModel = repositoryService.getBpmnModel(defProcessId);
        //传节点定义key 获取当前节点
        FlowNode flowNode = (FlowNode) bpmnModel.getFlowElement(task.getTaskDefinitionKey());



        String processInstanceId = task.getProcessInstanceId();
        List<SequenceFlow> flows=null;
        if(needBefore){
            flows = flowNode.getIncomingFlows();
        }else if(needAfter){
            flows = flowNode.getOutgoingFlows();
        }
        //输出连线

        List<String> outInfo=getNodeInfos(bpmnModel,flows,processInstanceId,needBefore, needAfter);
        return outInfo;

    }
    private List<String> getNodeInfos(BpmnModel bpmnModel,List<SequenceFlow> nodes,String processInstanceId,boolean needBefore,boolean needAfter){

        List<String> listNode = new ArrayList<>();
        //遍历返回下一个节点信息
        for (SequenceFlow flow : nodes) {
            Map map = new HashMap();



            //类型自己判断
            String ref="";
            if(needBefore) {
                ref = flow.getSourceRef();
            }else if(needAfter){
                ref = flow.getTargetRef();
            }
            //通过上级节点对象的信息来判断上级节点是什么节点(网关、用户、开始、结束)
            FlowNode flowElement = (FlowNode) bpmnModel.getMainProcess().getFlowElement(ref);
            map.put("name", flowElement.getName());
            map.put("taskId", flowElement.getId());
            map.put("processInstanceId", processInstanceId);


            //用户任务
            if (flowElement instanceof UserTask) {

                listNode.add(gson.toJson(map));
                //System.out.println("节点信息:"+gson.toJson(map));
            } else if (flowElement instanceof Gateway) {
                /*
                List<Map> maps = setExclusiveGateway(incomingFlows, processInstanceId);
                logger.info("节点信息:{}",maps);
                return Result.data(maps);
                 */
            } else if (flowElement instanceof StartEvent) {
                map.put("message", "上级节点是流程起点");
                listNode.add(gson.toJson(map));
                // logger.info("节点信息:{}", map);
                //System.out.println("节点信息:"+gson.toJson(map));
            }else if(flowElement instanceof EndEvent){
                map.put("message", "上级节点是流程终点");
                listNode.add(gson.toJson(map));
            }
        }
        return listNode;
    }


}


pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>org.example</groupId>
    <artifactId>activity_test</artifactId>
    <version>1.0-SNAPSHOT</version>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.5.3</version>
    </parent>
    <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>

        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>

        <h2.version>1.4.200</h2.version>

    </properties>





    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>

        </dependency>
        <dependency>
            <groupId>org.activiti</groupId>
            <artifactId>activiti-spring-boot-starter-basic</artifactId>
            <version>6.0.0</version>
        </dependency>

        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.44</version>
        </dependency>
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>2.0.1</version>
        </dependency>

        <dependency>
            <groupId>ch.qos.logback</groupId>
            <artifactId>logback-classic</artifactId>
            <version>1.2.3</version>
        </dependency>

        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid-spring-boot-starter</artifactId>
            <version>RELEASE</version>
        </dependency>

        <dependency>
            <groupId>com.google.code.gson</groupId>
            <artifactId>gson</artifactId>
            <version>2.8.5</version>
        </dependency>
    </dependencies>
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
</project>

文/程忠 浏览次数:0次   2022-08-16 17:33:23

相关阅读


评论:
点击刷新

↓ 广告开始-头部带绿为生活 ↓
↑ 广告结束-尾部支持多点击 ↑