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>
相关阅读
评论:
↓ 广告开始-头部带绿为生活 ↓
↑ 广告结束-尾部支持多点击 ↑