工作流activiti笔记(四)审批人设置

单人

方式一:写死Assignee

画流程图时填写Assignee,启动流程自动会为每个环节分配好审批人。

方式二:写死变量 ${xx},然后在启动流程时设置变量。

与方式一一样,启动流程时分配好,只不过它是以变量的形式。

java 复制代码
 ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
        Map<String, Object> param = new HashMap<>();
        param.put("user0", "张三");
        ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("myflow", "businessKey",param);
        

方式三:实现TaskListener接口

java 复制代码
import org.activiti.engine.delegate.DelegateTask;
import org.activiti.engine.delegate.TaskListener;

public class MyTaskListener implements TaskListener {
    @Override
    public void notify(DelegateTask delegateTask) {
        delegateTask.setAssignee("张三");
    }
}

然后侦听这里配置好侦听类,指向我们上面新建的类

方式四:taskService.setAssignee设置

这种的好处就是,在每个环节处理审批的时候,可以指定审批人,而不用在流程启动时就指定好,这个审批人就可以用我们自己定义的"审批人配置表"。

java 复制代码
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
        ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("myflow", "businessKey");
        TaskService taskService = processEngine.getTaskService();
        Task task=taskService.createTaskQuery()
                .processInstanceId(processInstance.getProcessInstanceId()).singleResult();
        taskService.setAssignee(task.getId(), "张三");

多人

个人觉得单人完全无法满足实际要求,就算暂时是单人审批,难保哪天客户突然要求要分给多个人审批。

多人审批的意思是说,分配给A,B,C三个人,他们任何一个人都能审批,一旦有人审批了,其他人就不能再审批了。主要场景是说,可能三个人不一定都有空,因此任何一个人审批都行。

多人方式和单人的几种方式是一样的,只不过不是setAssignee,而是Candidate

java 复制代码
//taskService.setAssignee(task.getId(), "张三");
taskService.addCandidateUser(task.getId(), "张三");
taskService.addCandidateUser(task.getId(), "李四");

设置完act_ru_identitylink会出现下面这样的数据。

审批流程

1、获取待办列表

java 复制代码
 @PostMapping("qryTodoList")
    public R<IPage<TaskVo>> qryTodoList(@RequestBody FlowTaskReq flowTaskReq) {
        SecurityUtil bean = SpringUtils.getBean(SecurityUtil.class);
        bean.logInAs(flowTaskReq.getCandidateUser());
        ProcessEngine defaultProcessEngine = ProcessEngines.getDefaultProcessEngine();
        TaskService taskService = defaultProcessEngine.getTaskService();
        // 创建TaskQuery查询当前用户的待办任务  
        int firstResult = (flowTaskReq.getPageNo() - 1) * flowTaskReq.getPageSize();
        TaskQuery taskQuery = taskService.createTaskQuery();
        taskQuery.taskCandidateUser(flowTaskReq.getCandidateUser());
        List<Task> tasks = taskQuery.listPage(firstResult,flowTaskReq.getPageSize());
        long total = taskQuery.count();
        IPage<TaskVo> page = new Page<>();
        List<TaskVo> list = new ArrayList<>();
        // 遍历并打印任务信息  
        for (Task task : tasks) {
            // 根据需要打印其他任务信息  
            list.add(parseTask(task));
        }
        page.setRecords(list);
        page.setTotal(total);
        return R.ok(page);
    }
 private static TaskVo parseTask(Task task) {
        log.debug("任务ID: " + task.getId());
        log.debug("任务名称: " + task.getName());
        TaskVo taskVo = new TaskVo();
        taskVo.setId(task.getId());
        taskVo.setStartTime(task.getCreateTime());
        taskVo.setName(task.getName());
        taskVo.setAssignee(task.getAssignee());
        taskVo.setOwner(task.getOwner());
        taskVo.setProcessInstanceId(task.getProcessInstanceId());
        taskVo.setProcessDefinitionId(task.getProcessDefinitionId());
        taskVo.setCreateTime(task.getCreateTime());
        taskVo.setDueDate(task.getDueDate());
        taskVo.setTaskInstName(task.getName());
        taskVo.setProcInstId(task.getProcessInstanceId());
        taskVo.setExecutionId(task.getExecutionId());
        return taskVo;
    }

2、上一步得到executionId后,获取要处理的任务,拿到task.id

(1)根据任务id用claim领取任务

(2)用任务id调用complete完成任务

(3)再次根据executionId查询下一环节任务,设置下一环节候选人。

java 复制代码
 @PostMapping("doTask")
    public void doTask(@RequestBody(required = false) Req flowTaskReq) {
//        SecurityUtil bean = SpringUtils.getBean(SecurityUtil.class);
//        bean.logInAs("张三");
        // 获取任务对象  
        Task task = taskService.createTaskQuery()
                .executionId(flowTaskReq.getExecutionId()).singleResult();
        if (task == null) {
            throw new RuntimeException("任务不存在!");
        }
        if (StrUtil.isNotBlank(flowTaskReq.getAssignee())) {
//            task.setAssignee(flowTaskReq.getAssignee());
            taskService.setAssignee(task.getId(), flowTaskReq.getAssignee());
        }
        if (StrUtil.isNotBlank(flowTaskReq.getComments())) {
            taskService.addComment(task.getId(), task.getProcessInstanceId(), flowTaskReq.getComments());
        }
        taskService.claim(task.getId(),"张三");
        // 完成任务  
        taskService.complete(task.getId());

        
        Task taskNext = taskService.createTaskQuery()
                .executionId(flowTaskReq.getExecutionId()).singleResult();
        if(taskNext!=null){
            taskService.addCandidateUser(taskNext.getId(), "张三");
        }
    }
相关推荐
-许平安-24 分钟前
MCP项目笔记十(客户端 MCPClient)
c++·笔记·ai·raii·mcp·pluginapi·plugin system
一只旭宝27 分钟前
【C++ 入门精讲2】函数重载、默认参数、函数指针、volatile | 手写笔记(附完整代码)
c++·笔记
John.Lewis1 小时前
C++进阶(8)智能指针
开发语言·c++·笔记
weixin_395772471 小时前
计算机网络学习笔记】初始网络之网络发展和OSI七层模型
笔记·学习·计算机网络
小陈phd2 小时前
多模态大模型学习笔记(三十四)——ChatTTS:新一代中文语音合成工具原理与实战解析
笔记·学习·语音识别
码以致用2 小时前
Java垃圾回收器笔记
java·jvm·笔记
zhangrelay2 小时前
面向机器人工程的 Linux 发行版:科学选型与深度评测-2026
笔记·学习
半步成诗!2 小时前
【RJ 45连接器】RJ45 网络连接器 3D 模型 3 零件装配体 SolidWorks 源文件 含 STEP/IGS 通用格式
网络·笔记·3d·硬件工程
网络工程小王2 小时前
【Function Calling详解】(学习笔记)
笔记·学习
ohsehun_mek02 小时前
如何为netlify部署网页配置自定义二级域名
笔记