Php实现钉钉OA一级审批,二级审批

Php实现钉钉OA一级审批,二级审批
一级审批

 public function oaPush($user_id,$person,$data){//测试数据,上线需要删除$user_id = '154502333155';//发起人$person = ['154502665555'];//审批人$len = count($person);$result = null;if($len>0){$approve_config = DingApproveConfig::where("type", 8)->first();$url = $approve_config->url;$rep['originatorUserId']    = $user_id;$rep['processCode']         = $approve_config->processCode;$type = $len>1?'AND':'NONE';$rep['approvers'][]         = ['actionType'=>$type,'userIds'=>$person];$rep['microappAgentId']     = env("DD_AGENT_ID");$rep['formComponentValues'] = $data;$result = $this->oaCurl($url,$rep);}return $result;}

一级审批

public function oaPush2l($user_id,$person,$data){//测试数据,上线需要删除$user_id = '154502333155';//发起人$person = ['154502333155','013359400664'];//审批人$len = count($person);$result = null;if($len>0){// 审批人,按照顺序审批$arr = [];foreach ($person as $key => $value) {$level2 = [];$level2['actionType'] = "NONE";$level2['userIds'] = [$value];array_push($arr, $level2);}$approve_config = DingApproveConfig::where("type", 9)->first();$url = $approve_config->url;$rep['originatorUserId']    = $user_id;$rep['processCode']         = $approve_config->processCode;$rep['approvers']           = $arr;$rep['microappAgentId']     = env("DD_AGENT_ID");$rep['formComponentValues'] = $data;$result = $this->oaCurl($url,$rep);}return $result;}

区别在于参数: approvers

一级审批传入的是:

$type = $len>1?'AND':'NONE';
$rep['approvers'][]  = ['actionType'=>$type,'userIds'=>$person];
  'AND' 是两个人以审批,同时收到,然后同时通过才算通过。

二级审批传入的是

array:2 [0 => array:2 ["actionType" => "NONE""userIds" => array:1 [0 => "154502335555"]]1 => array:2 ["actionType" => "NONE""userIds" => array:1 [0 => "01335926400664"]]
]
 $rep['approvers'] = $arr;
public function oaCurl($url,$data){$ding = new Dingd();$access_token = $ding->getDingdAccessToken(env('DD_APPKEY_COM'),env('DD_APPSECRET_COM'));$ch = curl_init();curl_setopt($ch, CURLOPT_URL, $url);curl_setopt($ch, CURLOPT_POST, 1);curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data));curl_setopt($ch, CURLOPT_REFERER, '');curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);curl_setopt( $ch,CURLOPT_HTTPHEADER, array('Content-Type: application/json','x-acs-dingtalk-access-token:' . $access_token));curl_setopt($ch, CURLOPT_TIMEOUT, 30);$result = curl_exec($ch);curl_close($ch);$result = mb_convert_encoding($result, 'UTF-8','UTF-8 ,GBK, GB2312, BIG5');return json_decode($result,true);}

钉钉回调处理
app\Jobs

public function handle(){// 钉钉审批事件$config = DingApproveConfig::where("type", 4)->first();$code= $config->processCode;if ($this->type == "bpms_task_change") {if (isset($this->res['result'])) {// 有result才有返回结果if($this->res['processCode']==$code){//对数据库进行处理}}}if ($this->type == 'bpms_instance_change') {if (isset($this->res['result'])) {// 有result才有返回结果if ($this->res['processCode'] == $code) {//对数据库进行处理}}if ($this->res['type'] === 'terminate') {// 审批撤回if ($this->res['processCode'] == $code) {//对数据库进行处理}}}}

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

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

相关文章

2024年第六届全球校园人工智能算法精英大赛——【算法挑战赛】钢材表面缺陷检测与分割 比赛复盘

引言 钢材表面缺陷检测在钢铁生产中是确保质量的关键环节,传统的人工检测方式难以满足大 规模工业生产的需求。近年来,基于深度学习的缺陷检测方法因其高效性和准确性受到广泛关 注。然而,现有的深度学习模型如U-Net虽具备较好的分割性能&am…

【网络】自定义协议——序列化和反序列化

> 作者:დ旧言~ > 座右铭:松树千年终是朽,槿花一日自为荣。 > 目标:了解什么是序列化和分序列,并且自己能手撕网络版的计算器。 > 毒鸡汤:有些事情,总是不明白,所以我不…

Darknet 连接教程

本篇文章仅供学习,严禁用于非法用途。 1,前言: 首先明确一点,Darknet真没那么神奇,虽然有些技术文章的确很有水平,对于前端学习,软件开发以及PHP和一些服务器端维护都有许多文章,但…

Windows密码的网络认证---基于挑战响应认证的NTLM协议

一,网络认证NTLM协议简介 在平时的测试中,经常会碰到处于工作组的计算机,处于工作组的计算机之间是无法建立一个可信的信托机构的,只能是点对点进行信息的传输。 举个例子就是,主机A想要访问主机B上的资源,…

电脑虚拟机启动树莓派rviz

因为我虚拟机ip和树莓派ip前三位不一样,所以需要先给虚拟机手动设置一个静态ip。 一、虚拟机设置静态ip(非必须) 1.1 虚拟机设置静态ip sudo nano /etc/netplan/01-netcfg.yaml 把下面内容加进去 network:version: 2renderer: networkde…

SpringBoot自动装配过程

Spring Boot的自动装配过程是一个基于注解和条件配置的自动化过程。它依赖于spring.factories文件中的自动配置类列表并结合条件注解和组件扫描来实现灵活且强大的自动装配功能。这使得开发者可以专注于业务逻辑的实现,而无需处理繁琐的配置细节。 1,启动类上@SpringBootApp…

北斗有源终端|智能5G单北斗终端|单兵|单北斗|手持机

在当今科技日新月异的时代,智能设备的创新与升级速度令人目不暇接。其中,智能5G终端作为连接数字世界的桥梁,正逐步渗透到我们生活的方方面面。今天,让我们聚焦于一款集尖端科技与实用功能于一身的智能5G设备——QM-L5智能5G单北斗…

操作系统(9) (并发-----原子性/互斥临界区/生产者消费者问题/临界区问题三条件/互斥性/进展性/公平性)

目录 1. 并发(Concurrency)的定义 2. 原子性(Atomicity) 3. 互斥(Mutual Exclusion) 4. 生产者-消费者问题(Producer-Consumer Problem) 5. 临界区Critical Section 6. 临界区问题&#xf…

Vue进阶指南:Watch 和 Computed 的深度理解

前言 在 Vue.js 开发中,我们常常会用到 watch 和 computed。虽然它们都能用来监听和处理数据的变化,但在使用场景和性能上有显著的区别。本篇文章会通过通俗易懂的方式给你讲解 Vue.js 中 watch 和 computed 的区别和使用方法。 基本概念 Computed&am…

如何对数据库的表字段加密解密处理?

对于表格数据的加密处理,通常涉及到对数据库中存储的数据进行加密,以保护敏感信息。 Java示例(使用AES算法加密数据库表数据) 首先,你需要一个数据库连接,这里假设你使用的是JDBC连接MySQL数据库。以下是…

【AI+教育】一些记录@2024.11.04

一、尝新 今天尝试了使用九章随时问,起因是看到快刀青衣的AI产品好用榜,里面这么介绍九章随时问:「它不是像其他产品那样,直接给你出答案。而是跟你语音对话,你会感觉更像是有一位老师坐在你的旁边,一步步…

DNS域名解析实验

准备工作 [rootlocalhost ~]# setenforce 0 [rootlocalhost ~]# systemctl stop firewalld [rootlocalhost ~]# mount /dev/sr0 /mnt [rootlocalhost ~]# dnf install bind -y DNS正向解析: 对主配置文件进行修改 [rootlocalhost ~]# vim /etc/named.conf 正向解析…

vite如何自定义插件,vite如何优化,代码示例

自定义Vite插件 1. 创建插件函数 - Vite插件是一个包含 name 属性和 transform (或其他钩子函数)的对象。 name 是插件名称, transform 用于转换代码。 - 例如,创建一个简单的插件,将代码中的 console.log 替换为自定…

Java的断点调试

在Java中,可以使用断点调试来调试程序并查看变量的值、程序的执行流程等。下面是使用Eclipse IDE进行Java断点调试的步骤: 在代码中选择要设置断点的行,通常是希望在程序执行到该行时暂停。右击所选行,选择"Toggle Breakpoi…

Jmeter参数化的4种方法 你get了吗?

1. 用Jmeter中的函数获取参数值 __Random,__threadNum,__CSVRead,__StringFromFile,具体调用方法如下: KaTeX parse error: Expected group after _ at position 2: {_̲_Random(,,)},,KaTeX p…

CF D. Genokraken

原题链接:Problem - D - Codeforces 题意:交互题,每次可以询问二个点之间的简单路径是否通过0点,如果通过返回1,否则返回0,要求输出每个节点的父亲。对于这颗树有三个特殊条件。1,如果断开0节点…

C语言 运算符

时间:2024.11.4 一、学习内容 1、算数运算符(加、减、乘、除法和取余) 通用细节: 1.整数计算,结果一定是一个整数 2.小数计算,结果一定是一个小数 3.整数和小数计算,结果一定是一…

php反序列化靶场随笔分析

项目地址:github.com/mcc0624/php_ser_Class 推荐使用docker部署:https://hub.docker.com/r/mcc0624/ser/tags 前面讲了以下php基础,我们直接从class6开始实验 class6 访问页面,传一个序列化的字符串,php代码将其反…

nginx代理websocket服务

一、nginx代理websocket服务 一)nginx代理ws服务 在nginx中,可以通过proxy_pass指令来代理WebSocket服务。 以下是一个示例配置: map $http_upgrade $connection_upgrade {default upgrade; close; }upstream ws_backend {server 127.0.0.1:…

56合并区间 go解题

这里解法是直接找一个快排模板,然后排序了第一个数,所以需要多加一个判断逻辑并且稍微覆盖。 package mainimport "fmt"func main() {fmt.Println(merge([][]int{{0, 2}, {2, 3}, {4, 4}, {0, 1}, {5, 7}, {4, 5}, {0, 0}}))// fmt.Println(m…