基于jeecg-boot的flowable流程提供一种动态设置发起人部门负责人的方式

news2025/1/15 23:33:24

更多功能看演示系统

gitee源代码地址

后端代码: https://gitee.com/nbacheng/nbcio-boot

前端代码:https://gitee.com/nbacheng/nbcio-vue.git

在线演示(包括H5) : http://122.227.135.243:9888

    这里给大家提供一种动态设置下个节点为发起人部门负责人的方式,当然也可以通过其它方式来完成这种功能。

    注意这里需要那个节点要设置为部门负责人,那就在这个节点的前面一个节点进行设置。

    目前设置任务监听器如下:

    类型为创建

    监听器类型为java类

    名称为:com.nbcio.modules.flowable.listener.SetDeptHeadTaskListener

SetDeptHeadTaskListener 具体代码如下:

package com.nbcio.modules.flowable.listener;

import org.flowable.engine.RuntimeService;
import org.flowable.engine.TaskService;
import org.flowable.engine.delegate.TaskListener;
import org.flowable.engine.runtime.ProcessInstance;
import org.flowable.task.service.delegate.DelegateTask;
import org.jeecg.common.util.SpringContextUtils;
import org.springframework.stereotype.Component;

import com.nbcio.modules.flowable.apithird.service.IFlowThirdService;

import java.util.Map;
import java.util.List;
import java.util.ArrayList;

/**
 * 根据发起人动态设置发起人的部门领导
 * @author nbacheng
 * @date 2023-3-02
*/

public class SetDeptHeadTaskListener implements TaskListener{

	private static final long serialVersionUID = 1L;
	private TaskService taskService = SpringContextUtils.getBean(TaskService.class);
	private IFlowThirdService flowThirdService = SpringContextUtils.getBean(IFlowThirdService.class);
	RuntimeService runtimeService = SpringContextUtils.getBean(RuntimeService.class);
	
	@Override
	public void notify(DelegateTask delegateTask) {
		
		String taskId = delegateTask.getId();

        // 获取流程发起人
		ProcessInstance processInstance = runtimeService
                .createProcessInstanceQuery()
                .processInstanceId(delegateTask.getProcessInstanceId())
                .singleResult();
        String startUserId = processInstance.getStartUserId();
        // 获取部门负责人列表
		List<String> depIds = flowThirdService.getDepartIdsByUsername(startUserId);
		List<String> DepHeadlist = new ArrayList<String>();
		for(String depId: depIds) {
			List<String> depList = flowThirdService.getDeptHeadByDepId(depId);
			if(depList != null) {
				DepHeadlist.addAll(depList);
			}
			
		}
		// 部门负责人列表去重
		List<String> listDistinctResult = new ArrayList<String>();
		if(!DepHeadlist.isEmpty() ) {
		    for (String str : DepHeadlist) {
		        if (!listDistinctResult.contains(str)) {
		        	listDistinctResult.add(str);
		        }
		    }
		}
		
		Map<String, Object> map = taskService.getVariables(taskId);
		map.put("SetDeptHeadTaskListener", listDistinctResult);
		taskService.setVariables(taskId, map);
	}
}

在流程定义发起地方增加下面代码

if(nVariablesMap.containsKey("SetDeptHeadTaskListener")) {//是否通过动态设置发起人部门负责人的任务监听器
						  taskService.complete(task.getId(), variables);
						  Task nexttask = taskService.createTaskQuery().processInstanceId(processInstance.getProcessInstanceId()).active().singleResult();
						  if(Objects.nonNull(nexttask)) {
							  if(Objects.nonNull((List<String>) nVariablesMap.get("SetDeptHeadTaskListener"))) {
								  if(((List<String>) nVariablesMap.get("SetDeptHeadTaskListener")).size() == 1) {//是否就一个人
									  taskService.setAssignee(nexttask.getId(), ((List<String>)nVariablesMap.get("SetDeptHeadTaskListener")).get(0).toString());
							          return Result.OK("设置发起人部门负责人的任务监听器流程启动成功.");
								  }
								  else {
									  for (String username : ((List<String>) nVariablesMap.get("SetDeptHeadTaskListener"))) {
	        							  taskService.addCandidateUser(nexttask.getId(), username);
	        						  }
						             return Result.OK("设置多个发起人部门负责人的任务监听器流程启动成功,目前用户可通过签收方式完成审批."); 
								  }
								  
							  }
							
						  }
						  
					}

在流程任务完成里增加如下代码

if (Objects.nonNull(taskVo)) {
    		if(nVariablesMap.containsKey("SetDeptHeadTaskListener")) {//是否通过动态设置下一个节点是发起人部门负责人审批的任务监听器
    			if(taskService.createTaskQuery().processInstanceId(taskVo.getInstanceId()).taskDefinitionKey(nextFlowNode.getUserTask().getId()).active().count() == 1) {//一个目标用户任务节点只能设置一次
    	    		  Task nexttask = taskService.createTaskQuery().processInstanceId(taskVo.getInstanceId()).taskDefinitionKey(nextFlowNode.getUserTask().getId()).active().singleResult();
    				  if(Objects.nonNull(nexttask)) {
    					  if(Objects.nonNull((List<String>) nVariablesMap.get("SetDeptHeadTaskListener"))) {
    						  if(((List<String>) nVariablesMap.get("SetDeptHeadTaskListener")).size() == 1) {//是否就一个人
        						  taskService.setAssignee(nexttask.getId(), ((List<String>)nVariablesMap.get("SetDeptHeadTaskListener")).get(0).toString());
        						  return;
        					  }
        					  else {
        						  for (String username : ((List<String>) nVariablesMap.get("SetDeptHeadTaskListener"))) {
        							  taskService.addCandidateUser(nexttask.getId(), username);
        						  }
        						  return;
        					  }
    					  }
    				  }
    			}	  
			}
    	}

具体流程图设置如下:

 效果图如下:

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/830040.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

node.js系列-常见问题处理方案(持续更新)

问题1&#xff1a;nodejs 如何使用 atob、btoa 解决方案&#xff08;base64与uint8array转换&#xff09;&#xff0c;btoa和atob在nodejs中应该怎么写&#xff1f; 浏览器中我们可以这样使用&#xff1a; btoa(123456) MTIzNDU2 atob(MTIzNDU2) 123456node.js中实现方案 con…

国内GitHub加速访问工具-Fetch GitHub Hosts

一、工具介绍 Fetch GitHub Hosts是一款开源跨平台的国内GitHub加速访问工具&#xff0c;主要为解决研究及学习人员访问 Github 过慢或其他问题而提供的 Github Hosts 同步工具。 项目原理&#xff1a;是通过部署此项目本身的服务器来获取 github.com 的 hosts&#xff0c;而…

LeetCode //C - 289. Game of Life

289. Game of Life According to Wikipedia’s article: “The Game of Life, also known simply as Life, is a cellular automaton devised by the British mathematician John Horton Conway in 1970.” The board is made up of an m x n grid of cells, where each cell…

【雕爷学编程】MicroPython动手做(33)——物联网之天气预报

天气&#xff08;自然现象&#xff09; 是指某一个地区距离地表较近的大气层在短时间内的具体状态。而天气现象则是指发生在大气中的各种自然现象&#xff0c;即某瞬时内大气中各种气象要素&#xff08;如气温、气压、湿度、风、云、雾、雨、闪、雪、霜、雷、雹、霾等&#xff…

Prometheus + Grafana安装

Prometheus是一款基于时序数据库的开源监控告警系统&#xff0c;非常适合Kubernetes集群的监控。Prometheus的基本原理是通过HTTP协议周期性抓取被监控组件的状态&#xff0c;任意组件只要提供对应的HTTP接口就可以接入监控。不需要任何SDK或者其他的集成过程。这样做非常适合做…

Gogs Git windos服务搭建指南

Gogs Git服务器搭建指南 背景&#xff1a; 近期在Linux 麒麟 v10 系统上开发&#xff1b;为了团队协同编程&#xff1b;选用了Git服务器&#xff1b;之前在windos开始时候使用的visualSVN server; visualSVN server从4.x.x.x开始收费&#xff1b;限制15个开发者用户&#xff…

带头循环双向链表详解

目录 一、什么是带头循环双向链表&#xff1f; 1.特点&#xff1a; 2.优点&#xff1a; 二、实现接口 1.前置准备 1.1需要的三个文件 1.2结构体的创建和头文件的引用 2.接口实现 2.1函数创建新节点 2.2打印链表内容 2.3尾插新节点 2.4头插新节点 2.5头删节点 2.6尾删…

Vue3_04_ref 函数和 reactive 函数

ref 函数 声明变量时&#xff0c;赋值的值要写在 ref() 函数中修改变量时&#xff0c;变量名.value xxx在模板中使用时可以省略掉 .value&#xff0c;直接使用变量名即可 <template><h1>一个人的信息</h1><h2>姓名&#xff1a;{{name}}</h2><…

pjsip、pjsua2+bcg729 windows下编译java版本

文章目录 简要说明流程步骤 简要说明 基本参考的这里 https://docs.pjsip.org/en/latest/get-started/windows/build_instructions.html#building-the-projects 我这里主要是为了生成pjsua2.dll 用于在java下调用。 其中 libbcg729.dll 是通过vcpkg来进行安装。 pjsip使用vs2…

【Autoresizing案例03-通过代码设置Autoresizing Objective-C语言】

一、通过代码实现Autoresizing 1.好,那么,接下来,我们就给大家看一下,怎么来通过代码实现Autoresizing, 好,那么,接下来,我们为什么要说这个通过代码,实现Autoresizing, 那么,注意,我们能通过我们的storyboard来操作,就不要通过代码来实现, 以后的趋势,就是苹…

使用Git在GitHub上部署静态页面

在GitHub中&#xff0c;我们可以将自己的静态页面部署到GitHub中&#xff0c;它会给我们提供一个地址使得我们的页面变成一个真正的网站&#xff0c;可以供用户访问。 一、在GitHub下创建仓库 二、将项目部署到GitHub上 1. 初始化Git仓库 2. 提交代码 3. 关联远程仓库 在Gi…

Vulnhub: BlueMoon: 2021靶机

kali&#xff1a;192.168.111.111 靶机&#xff1a;192.168.111.174 信息收集 端口扫描 nmap -A -sC -v -sV -T5 -p- --scripthttp-enum 192.168.111.174 80端口目录爆破&#xff0c;发现文件&#xff1a;hidden_text gobuster dir -u http://192.168.111.174 -w /usr/sha…

二重积分1

目录 二重积分 二重积分的性质 ​编辑 中值定理 二重积分的计算 方法1&#xff1a;利用直角坐标计算 方法2&#xff1a;利用极坐标进行计算 适用于极坐标的二重积分的特征 对称性和奇偶性的应用 题目 例题1&#xff1a; 题目2&#xff1a; 题目3&#xff1a; 题目4&#x…

【Spring框架】Spring AOP

目录 什么是AOP&#xff1f;AOP组成Spring AOP 实现步骤Spring AOP实现原理JDK Proxy VS CGLIB 什么是AOP&#xff1f; AOP&#xff08;Aspect Oriented Programming&#xff09;&#xff1a;⾯向切⾯编程&#xff0c;它是⼀种思想&#xff0c;它是对某⼀类事情的集中处理。⽐如…

C++11的range-based for loop(基于范围的循环)

2023年8月3日&#xff0c;周四上午 目录 语法举例说明 语法 for(能存放容器元素的变量:容器){//函数体 } 容器可以是数组、CSTL容器等 这个变量会自动遍历容器里面的每个元素 举例说明 #include<vector> #include<iostream>int main(){/*--------------------…

innovus: 让ndr使用自定义via def

我正在「拾陆楼」和朋友们讨论有趣的话题&#xff0c;你⼀起来吧&#xff1f; 拾陆楼知识星球入口 让ndr 使用指定via def可以用add_ndr -via命令&#xff0c;如果现有的via list无法满足要求&#xff0c;可以用 add_via_definition -via_rule -row_col去创建。

跨境电商代运营模式,Live Market打造跨境电商出海SaaS服务平台

近年来&#xff0c;我国跨境电商发展取得可喜进展。商务部数据显示&#xff0c;跨境电商货物进出口规模占外贸比重由5年前的不足1%上升到目前的5%左右。私域流量业态在电商领域兴起&#xff0c;品牌企业在线上建立自主经营的手机应用软件直接触达用户。跨境电商的发展模式转向平…

如何在群晖nas中使用cpolar内网穿透?

如何在群晖nas中使用cpolar内网穿透 文章目录 如何在群晖nas中使用cpolar内网穿透 今天&#xff0c;我们来为大家介绍&#xff0c;如何在群晖系统中&#xff0c;使用图形化界面的cpolar。 cpolar经过图形化改造后&#xff0c;使用方法已经简便了很多&#xff0c;基本与其他应用…

Linux2.6.32.2内核在mini2440上的移植(七)添加ADC驱动

Linux-2.6.32.2内核在mini2440上的移植(七)---添加ADC驱动 【2】在内核中添加ADC 驱动 Linux-2.6.32.2 内核并没有提供支持S3C2440 的ADC 驱动程序&#xff0c;由于《移植开发实战指南》中ADC部分代码在实际测试中始终输出-1&#xff0c;而无法通过测试&#xff0c;于是结合…

离散Hopfield神经网络的联想记忆与matlab实现

1案例背景 1.1离散Hopfield神经网络概述 Hopfield网络作为一种全连接型的神经网络,曾经为人工神经网络的发展开辟了新的研究途径。它利用与阶层型神经网络不同的结构特征和学习方法,模拟生物神经网络的记忆机理,获得了令人满意的结果。这一网络及学习算法最初是由美国物理学家…