创建钉钉审批流实例

news/2024/5/19 11:21:47

1、依赖

<!--钉钉 api -->
<dependency><groupId>com.aliyun</groupId><artifactId>dingtalk</artifactId><version>2.0.14</version>
</dependency>
<!--钉钉 事件订阅-->
<dependency><groupId>com.dingtalk.open</groupId><artifactId>app-stream-client</artifactId><version>1.3.2</version>
</dependency>

2、参数

@Configuration
@ConfigurationProperties(prefix = InterfaceProperties.PREFIX)
@Setter
@Getter
public class InterfaceProperties {public static final String PREFIX = "interface";private String dingDingEnable;private String appKey;private String appSecret;private Long agentId;
}

3、获取Token

public String getToken() {try {com.aliyun.dingtalkoauth2_1_0.Client client = new com.aliyun.dingtalkoauth2_1_0.Client(DingDingImpl.createConfig());com.aliyun.dingtalkoauth2_1_0.models.GetAccessTokenRequest getAccessTokenRequest = new com.aliyun.dingtalkoauth2_1_0.models.GetAccessTokenRequest().setAppKey(interfaceProperties.getAppKey()).setAppSecret(interfaceProperties.getAppSecret());com.aliyun.dingtalkoauth2_1_0.models.GetAccessTokenResponse res = client.getAccessToken(getAccessTokenRequest);com.aliyun.dingtalkoauth2_1_0.models.GetAccessTokenResponseBody body = res.body;return body.getAccessToken();} catch (TeaException err) {log.error(err.code + err.message);} catch (Exception e) {log.error("获取token异常:", e);TeaException err = new TeaException(e.getMessage(), e);log.error(err.code + err.message);}return null;}

4、发起钉钉流程返回实例id

public String sendData(String originatorUserId, String processCode, Long deptId, List<FormComponentValuesDto> param) {String token = this.getToken();if (null == token) {throw new BusinessException("接口Token获取失败");}List<StartProcessInstanceRequest.StartProcessInstanceRequestFormComponentValues> formComponentValues = paramToEntity(param);try {com.aliyun.dingtalkworkflow_1_0.Client client = new com.aliyun.dingtalkworkflow_1_0.Client(DingDingImpl.createConfig());com.aliyun.dingtalkworkflow_1_0.models.StartProcessInstanceHeaders startProcessInstanceHeaders = new com.aliyun.dingtalkworkflow_1_0.models.StartProcessInstanceHeaders();startProcessInstanceHeaders.xAcsDingtalkAccessToken = token;StartProcessInstanceRequest startProcessInstanceRequest = new StartProcessInstanceRequest()//应用标识AgentId.setMicroappAgentId(interfaceProperties.getAgentId())//审批发起人的userId 必填.setOriginatorUserId(originatorUserId)//审批流的唯一码。process_code在审批模板编辑页面的URL中获取 必填.setProcessCode(processCode)//审批发起人所在的部门ID.setDeptId(deptId)//不使用审批流模板时,直接指定的审批人列表,最大列表长度:20.setApprovers(null)//使用审批流模板时,流程预测结果中节点规则上必填的自选操作人列表,最大列表长度:20.setTargetSelectActioners(null)//表单数据内容,控件列表,最大列表长度:150 必填.setFormComponentValues(formComponentValues);StartProcessInstanceResponse response = client.startProcessInstanceWithOptions(startProcessInstanceRequest, startProcessInstanceHeaders, new RuntimeOptions());StartProcessInstanceResponseBody body = response.body;responseContent = body.instanceId;return body.instanceId;} catch (TeaException err) {log.error(err.code + err.message);} catch (Exception e) {log.error("发起钉钉流程异常:", e);TeaException err = new TeaException(e.getMessage(), e);log.error(err.code + err.message);} throw new BusinessException("钉钉审批实例创建异常");}@Data
@EqualsAndHashCode
public class FormComponentValuesDto {@ApiModelProperty(value = "控件名称")@NotBlankpublic String name;@ApiModelProperty(value = "控件值")@NotBlankpublic String value;@ApiModelProperty(value = "控件类型")public String componentType;
}

5、钉钉事件订阅–OA审批

@Slf4j
@Component
public class DingDingEventListener implements InitializingBean {@Resourceprivate InterfaceProperties interfaceProperties;@Resourceprivate DingDingInterface dingDingInterface;@Overridepublic void afterPropertiesSet() {try {OpenDingTalkStreamClientBuilder.custom().credential(new AuthClientCredential(interfaceProperties.getAppKey(), interfaceProperties.getAppSecret()))//注册事件监听.registerAllEventListener(new GenericEventListener() {public EventAckStatus onEvent(GenericOpenDingTalkEvent event) {try {if ("bpms_task_change".equals(event.getEventType())) {//获取事件体JSONObject bizData = event.getData();//处理事件log.info(event.getEventType() + bizData.toString());//保存审批记录.....}//审批实例开始,结束if ("bpms_instance_change".equals(event.getEventType())) {//获取事件体JSONObject bizData = event.getData();//处理事件log.info(event.getEventType() + bizData.toString());//保存审批记录.....}return EventAckStatus.SUCCESS;} catch (Exception e) {log.error("钉钉订阅事件保存异常", e);//消费失败return EventAckStatus.LATER;}}}).build().start();} catch (Exception e) {log.error("钉钉事件订阅异常", e);}}
}

6、参数获取

1、审批模板唯一ID

在这里插入图片描述### 2、AppKey 、AppSecret
在这里插入图片描述


http://www.mrgr.cn/p/64513404

相关文章

MATLAB实现蚁群算法栅格路径优化

蚁群算法是一种模拟自然界中蚂蚁觅食行为的优化算法&#xff0c;常用于解决路径规划问题。在栅格路径优化中&#xff0c;蚁群算法可以帮助找到从起点到终点的最优路径。以下是蚁群算法栅格路径优化的基本流程步骤&#xff1a; 初始化参数&#xff1a; (1)设置蚂蚁数量&#xff…

NumPy 1.26 中文官方指南(五)

NumPy 许可证原文:numpy.org/doc/1.26/license.htmlCopyright (c) 2005-2023, NumPy Developers. All rights reserved.Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:* …

NumPy 1.26 中文官方指南(一)

NumPy 用户指南原文:numpy.org/doc/1.26/user/index.html本指南是一个概述,解释了重要特性;细节请参阅 NumPy 参考文档。 入门指南什么是 NumPy?安装NumPy 快速入门NumPy:初学者的绝对基础基础知识和用法NumPy 基础知识数组创建对 ndarrays 进行索引使用 NumPy 进行 I/O数…

5分钟——快速搭建后端springboot项目

5分钟——快速搭建后端springboot项目 1. idea新建工程2. 构建pom.xml文件3. 构建application.yml配置文件4. 构建springboot启动类5. 补充增删改查代码6. 运行代码7. 下一章 1. idea新建工程 点击右上角新建一个代码工程 别的地方不太一样也不用太担心&#xff0c;先创建一个…

NumPy 1.26 中文官方指南(二)

NumPy 1.26 中文官方指南(二) NumPy: 绝对初学者的基础知识原文:numpy.org/doc/1.26/user/absolute_beginners.html欢迎来到 NumPy 的绝对初学者指南!如果你有评论或建议,请不要犹豫联系我们! 欢迎来到 NumPy! NumPy(Numerical Python)是一个开源的 Python 库,几乎在…

spark standalone同时运行pyspark和spark-shell

需要限制资源数量,使用 spark.cores.max 或 --total-executor-cores 来指定最大核数。 假设集群一共4c5.6g pyspark(使用2c2g) from pyspark.sql import SparkSessionspark = SparkSession.builder \.master("spark://worker1:7077") \.appName("pysparkApp&…

解决Vue3项目运行控制台警告

运行Vue3项目,控制台警告:Feature flag VUE_PROD_HYDRATION_MISMATCH_DETAILS is not explicitly defined. You are running the esm-bundler build of Vue, which expects these compile-time feature flags to be globally injected via the bundler config in order to ge…

Redis入门到通关之数据结构解析-SkipList

文章目录 ☃️概述☃️总结 欢迎来到 请回答1024 的博客 &#x1f353;&#x1f353;&#x1f353;欢迎来到 请回答1024的博客 关于博主&#xff1a; 我是 请回答1024&#xff0c;一个追求数学与计算的边界、时间与空间的平衡&#xff0c;0与1的延伸的后端开发者。 博客特色&…

解决警告

运行Vue3项目,控制台警告:Feature flag VUE_PROD_HYDRATION_MISMATCH_DETAILS is not explicitly defined. You are running the esm-bundler build of Vue, which expects these compile-time feature flags to be globally injected via the bundler config in order to ge…

日本岛津电子天平UW UX 系列series 精密电子天平Shimadzu使用说明

日本岛津电子天平UW UX 系列series 精密电子天平Shimadzu使用说明

python-自动化篇-终极工具-用GUI自动控制键盘和鼠标-pyautogui-键盘

文章目录 键盘键盘——记忆宫殿入门——通过键盘发送一个字符串——typewrite()常规——键名——typewrite()常规——按下键盘——keyDown()常规——释放键盘——keyUp()升级——热键组合——hotkey() 键盘 pyautogui也有一些函数向计算机发送虚拟按键&#xff0c;让你能够填充…

微信小程序4~6章总结

目录 第四章 页面组件总结 4.1 组件的定义及属性 4.2 容器视图组件 4.2.1 view 4.2.2 scroll-view 4.2.3 swiper 4.3 基础内容组件 4.3.1 icon ​编辑 4.3.2 text 4.3.3 progress ​编辑 4.4 表单组件 4.4.1 button 4.4.2 radio 4.4.3 checkbox 4.4.4 switch …

手撕sql面试题:根据分数进行排名,不使用窗口函数

分享一道面试题&#xff1a; 有一个分数表id 是该表的主键。该表的每一行都包含了一场考试的分数。Score 是一个有两位小数点的浮点值。 以下是表结构和数据&#xff1a; Create table Scores ( id int(11) NOT NULL AUTO_INCREMENT, score DECIMAL(3,2), PRIMARY KEY…

OpenAI未至,Open-Sora再度升级!已支持生成16秒720p视频

Open-Sora 在开源社区悄悄更新了!现在支持长达 16 秒的视频生成,分辨率最高可达 720p,并且可以处理任何宽高比的文本到图像、文本到视频、图像到视频、视频到视频和无限长视频的生成需求。我们来试试效果。 生成个横屏圣诞雪景,发b站再生成个竖屏,发抖音还能生成16秒的长视…

解决宏定义后面无法加分号

总结&#xff1a;注意是针对单行if语句使用&#xff0c;并且宏定义后面必须带分号&#xff08;格式统一&#xff09; 参考连接 C语言种do_while(0)的妙用_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV1vk4y1R7VJ/?spm_id_from333.337.search-card.all.click&vd_…

OpenCV——Bernsen局部阈值二值化方法

目录 一、Bernsen算法1、算法概述2、参考文献二、代码实现三、结果展示Bernsen局部阈值二值化方法由CSDN点云侠原创,爬虫自重。如果你不是在点云侠的博客中看到该文章,那么此处便是不要脸的爬虫。 一、Bernsen算法 1、算法概述 Bernsen 算法是另一种流行的局部阈值二值化方…

Jenkins CI/CD 持续集成专题四 Jenkins服务器IP更换

一、查看brew 的 services brew services list 二、编辑 homebrew.mxcl.jenkins-lts.plist 将下面的httpListenAddress值修改为自己的ip 服务器&#xff0c;这里我是用的本机的ip 三 、重新启动 jenkins-lts brew services restart jenkins-lts 四 、浏览器访问 http://10.…

Microchip 32位MCU CAN驱动图文教程-附源码

文章目录 创建一个新的32位MCU工程Microchip MCC Harmony配置界面说明在MCC下配置系统的时钟在MCC下配置所需要使用的模块配置调试打印模块配置CAN模块配置管脚功能修改系统堆栈大小生成代码 添加用户代码 创建一个新的32位MCU工程 确保电脑上已经安装最新的MPlab X IDE、XC32编…

黑龙江—等保测评三级安全设计思路

需求分析 6.1、 系统现状 6.2、 现有措施 目前&#xff0c;信息系统已经采取了下述的安全措施&#xff1a; 1、在物理层面上&#xff0c; 2、在网络层面上&#xff0c; 3、在系统层面上&#xff0c; 4、在应用层面上&#xff0c; 5、在管理层面上&#xff0c; 6.…

几种中文字体的比较

根据自己的喜好给常见的几个中文字体的打分:字体选项 字体名 得分adobe Adobe 宋体 Std 5fandol FandolSong 0founder 方正书宋_GPK 10hanyi 汉仪宋体 6sinotype 华文宋体 3win 中易宋体 9fandol 缺少偏僻字体,故得零分。