创建钉钉审批流实例

news2024/10/7 4:26:26

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 = "控件名称")
    @NotBlank
    public String name;

    @ApiModelProperty(value = "控件值")
    @NotBlank
    public String value;

    @ApiModelProperty(value = "控件类型")
    public String componentType;
}

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

@Slf4j
@Component
public class DingDingEventListener implements InitializingBean {

    @Resource
    private InterfaceProperties interfaceProperties;
    @Resource
    private DingDingInterface dingDingInterface;

    @Override
    public 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.coloradmin.cn/o/1618964.html

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

相关文章

智慧安防视频监控EasyCVR视频汇聚平台无法自动播放视频的原因排查与解决

国标GB28181协议EasyCVR安防视频监控平台可以提供实时远程视频监控、视频录像、录像回放与存储、告警、语音对讲、云台控制、平台级联、磁盘阵列存储、视频集中存储、云存储等丰富的视频能力&#xff0c;平台支持7*24小时实时高清视频监控&#xff0c;能同时播放多路监控视频流…

【Flask】Flask中HTTP请求与接收

一、接收http请求与返回响应 在Flask中&#xff0c;可以通过app.route装饰器来定义路由函数。 app.route(/BringGoods,methods [POST, GET]) GET请求&#xff1a;使用request.args.get(key)或者request.values.get(key)来获取URL中的参数。 POST请求&#xff1a; 使用req…

设计模式学习笔记 - 开源实战四(中):剖析Spring框架中用来支持扩展的设计模式

概述 上篇文章&#xff0c;学习了 Spring 框架背后蕴含的设计思想&#xff0c;比如约定优于配置、低侵入松耦合、模块化轻量级等等。这些设计思想可以借鉴到其他框架开发中&#xff0c;在大的设计层面提高框架的代码质量。 除了上篇文章降到的设计思想&#xff0c;实际上&…

【牛客 NC253455】小红走排列 题解(双端队列+位集合+贪心算法)

题目描述 对于一个排列&#xff0c;小红定义该排列的总消耗为&#xff1a;1走到2&#xff0c;2走到3&#xff0c;……&#xff0c;最终从 n − 1 n-1 n−1走到 n n n所需的最少的总步数。其中&#xff0c;每一步可以向左走一步&#xff0c;也可以向右走一步。 现在&#xff0…

薄板样条插值TPS原理以及torch和opencv实现

薄板样条插值TPS原理以及torch和opencv实现 1、薄板样条插值TPS原理概述原理以及公式推导2、torch实现3、opencv实现1、薄板样条插值TPS原理 概述 薄板样条(Thin Plate Spline),简称TPS,是一种插值方法,可找到通过所有给定点的“最小弯曲”光滑曲面。因为它一般都是基于…

ESP-IDF下载与安装完整流程

本文主要看参考官网说明&#xff0c;如下&#xff1a; Windows 平台工具链的标准设置 - ESP32 - — ESP-IDF 编程指南 latest 文档 (espressif.com) 一、概述 ESP-IDF需要安装一些必备工具&#xff0c;才能围绕ESP32构建固件&#xff0c;包括&#xff1a; PythonGit交叉编译…

DeepFaceLab小白教程:视频换脸过程

合适那些人阅读&#xff1f; 适合从未使用过DeepFaceLab的群体。 如果你想基于DeepFaceLab完成一次视频换脸的操作&#xff0c;可以看本篇。 下载方式 GitHub https://github.com/iperov/DeepFaceLab 我是用motrix下载。 网盘 https://pan.baidu.com/share/init?surlO4…

蓝桥杯:日期问题(我的绝望题)

&#x1f381;个人主页&#xff1a;我们的五年 &#x1f50d;系列专栏&#xff1a;每日一练 &#x1f337;追光的人&#xff0c;终会万丈光芒 目录 前言&#xff1a; &#x1f337;1.问题描述&#xff1a; 1.问题描述&#xff1a; 2.输入格式&#xff1a; 3.输出格式&#…

华为海思校园招聘-芯片-数字 IC 方向 题目分享——第七套

华为海思校园招聘-芯片-数字 IC 方向 题目分享——第七套 (共9套&#xff0c;有答案和解析&#xff0c;答案非官方&#xff0c;未仔细校正&#xff0c;仅供参考&#xff09; 部分题目分享&#xff0c;完整版获取&#xff08;WX:didadidadidida313&#xff0c;加我备注&#x…

Golang基础1

基本类型 bool 整数&#xff1a;byte(相当于uint8), rune(相当于int32), int/uint ,int8/uint8 ,int16/uint16 ,int32/uint32 ,int64/uint64 浮点数: float32 ,float64, complex64 ,complex128 array&#xff08;值类型&#xff09;、slice、map、chan&#xff08;引用类型…

小扎宣布开放 Meta Horizo​​n OS

日前&#xff0c;Meta以“混合现实的新时代”为题的博文宣布向第三方制造商开放Meta Horizon OS&#xff0c;包括华硕、联想和微软Xbox等等&#xff1a; Meta正在朝着为元宇宙建立一个更开放的计算平台的愿景迈出下一步。Meta正在向第三方硬件制造商开放赋能Meta Quest设备的操…

ETL简介以及使用ETL(Kettle)进行数据接入的具体例子

目录 ETL介绍 ETL简介 ETL包含的三部分 ETL基本概念 ETL资源库 ETL变量 业务表梳理以及接入规划 数据接入流程 业务表梳理 ETL任务规范 接入规划 数据接入中的方便工具 具体例子 导出生产表信息 1、ORACLE 2、MYSQL ETL数据增量抽取任务开发 1、ORACLE通用流程…

使用 IPAM 解决方案简化分布式网络管理

随着组织在数字领域的全球扩张&#xff0c;分布式网络是不可避免的&#xff0c;这意味着&#xff0c;随着 IT 基础设施的发展&#xff0c;组织需要适应&#xff0c;这包括在不断增长的系统需求、应用程序堆栈、各种协议和安全防御中监控、现代化和简化流程和资源。在有效管理现…

场景 - 分库分表

分什么 数据量大分表&#xff0c;并发大分库 分表字段如何选择 如果对交易订单进行分表&#xff0c;可以选择的东西很多&#xff0c;比如说商户id&#xff0c;用户id&#xff0c;地区等等 分表的时候要考虑到数据倾斜问题 数据倾斜 比如说按商户号进行分表&#xff0c;一共…

React-editor-js not showing up in a function component

React-editor-js not showing up in a function component react-editor-js 在react 函数组件中显示不出来 真的&#xff0c;我马上就想放弃它了。但是看它周下载量还挺多&#xff0c;我不信别人没遇到过。于是我继续在网络上挖呀挖。只是我一开始的方向错了。我一直以为我的写…

vite和webpacke的常规配置

文章目录 1、vite和webpacke的区分2、vite的常规配置介绍主要部分介绍vite基本配置示例 3、webpacke的常规配置介绍主要部分介绍Webpack 基本配置示例 1、vite和webpacke的区分 相同点&#xff1a; 都是构建工具&#xff0c;用于资源打包 &#xff1b; 都有应用到摇树原理 tre…

大模型的实践应用22-谷歌Gemma AI大模型的架构原理,以及Gemma模型的部署安装本地教程

大家好,我是微学AI,今天给大家介绍一下大模型的实践应用22-谷歌Gemma AI大模型的架构原理,以及Gemma模型的部署安装本地教程。谷歌Gemma AI大模型是由Google AI团队开发并开源。Gemma模型采用Transformer编码器-解码器架构,并加入了一些改进,例如使用稀疏注意力机制来提高推…

【八股】计算机网络篇

网络模型 应用层【HTTP&#x1f449;报文/消息】 传输层【TCP或UDP&#x1f449;段&#x1f449;MSS】网络层【IP、寻址和路由&#x1f449;MTU】 ①IP&#xff08;Internet Protocol&#xff0c;网际协议&#xff09;主要作用是定义数据包的格式、对数据包进行路由和寻址&…

一个java项目中,如何使用sse协议,构造一个chatgpt的流式对话接口

前言 如何注册chatGPT&#xff0c;怎么和它交互&#xff0c;本文就不讲了&#xff1b;因为网上教程一大堆&#xff0c;而且你要使用的话&#xff0c;通常会再包一个算法服务&#xff0c;用来做一些数据训练和过滤处理之类的&#xff0c;业务服务基本不会直接与原生chatGPT交互。…

刷代码随想录有感(44):对称二叉树

题干&#xff1a; 代码&#xff1a; class Solution { public:bool compare(TreeNode* left, TreeNode* right){//传入左右子树if(left NULL && right ! NULL) return false;//子else if(left ! NULL && right NULL) return false;//子else if(left NULL &…