extend目录下,API
<?php
// +----------------------------------------------------------------------
// | 飞书API
// +----------------------------------------------------------------------
// | COPYRIGHT (C) 2021 http://www.jeoshi.com All rights reserved.
// +----------------------------------------------------------------------
// | AUTHOR : 陈龙
// | DATE : 2024/01/19 10:45:47
// | VERSION:1.0.0
// +----------------------------------------------------------------------
namespace feishu;class Api extends Request
{public static $instance = null;/*** 构造函数*/public function __construct($option = []){parent::__construct();$this->setAppConfig($option['company_id'] ?? 0);}/*** @desc 单例* @return static|null* @author 陈龙* @date 2024-01-09 11:00*/public static function instance(){if (is_null(self::$instance)) {self::$instance = new static;}return self::$instance;}/*** @desc 自建应用获取 tenant_access_token* https://open.feishu.cn/document/server-docs/authentication-management/access-token/tenant_access_token_internal* @param $up_cache 刷新缓存* @return mixed* @author 陈龙* @date 2024-01-09 11:02*/public function getTenantToken($up_cache = false){return $this->getTenantAccessToken($up_cache);}/*** @desc 创建用户* https://open.feishu.cn/document/server-docs/contact-v3/user/create* @param $data 请求参数* @return mixed* @author 陈龙* @date 2024-01-09 11:02*/public function createUser($data = []){return $this->_createUser($data);}/*** @desc 修改用户部分信息* https://open.feishu.cn/document/server-docs/contact-v3/user/patch* @param $path 路径参数* @param $params 查询参数* @param $data 请求参数* @return array|mixed* @author 陈龙* @date 2024-01-09 18:31*/public function updateUserInfo($path = [], $params = [], $data = []){return $this->_updateUserInfo($path, $params, $data);}/*** @desc 删除用户* https://open.feishu.cn/document/server-docs/contact-v3/user/delete* @param $path 路径参数* @param $params 查询参数* @param $data 请求参数* @return array|mixed* @author 陈龙* @date 2024-01-09 18:31*/public function deleteUser($path = [], $params = [], $data = []){return $this->_deleteUser($path, $params, $data);}/*** @desc 恢复已删除用户* https://open.feishu.cn/document/server-docs/contact-v3/user/resurrect* @param $path 路径参数* @param $params 查询参数* @param $data 请求参数* @return array|mixed* @author 陈龙* @date 2024-01-09 18:31*/public function resurrectUser($path = [], $params = [], $data = []){return $this->_resurrectUser($path, $params, $data);}/*** @desc 获取单个用户信息* https://open.feishu.cn/document/server-docs/contact-v3/user/get* @param $path 路径参数* @param $params 查询参数* @return mixed* @author 陈龙* @date 2024-01-09 11:02*/public function getUser($path = [], $params = []){if (empty($params)) $params = ['user_id_type' => 'user_id'];return $this->_getUser($path, $params);}/*** @desc 批量获取用户信息* https://open.feishu.cn/document/uAjLw4CM/ukTMukTMukTM/reference/contact-v3/user/batch* @param $params 查询参数* @return mixed* @author 陈龙* @date 2024-01-09 11:02*/public function batchGetUser($params = []){return $this->_batchGetUser($params);}/*** @desc 获取部门直属用户列表* https://open.feishu.cn/document/server-docs/contact-v3/user/find_by_department* @param $params 查询参数* @return mixed* @author 陈龙* @date 2024-01-09 11:02*/public function findUserByDepartment($params = []){return $this->_findUserByDepartment($params);}/*** @desc 通过手机号或邮箱获取用户 ID* https://open.feishu.cn/document/server-docs/contact-v3/user/batch_get_id* @param $params 查询参数* @param $data 请求参数* @return mixed* @author 陈龙* @date 2024-01-09 11:02*/public function batchGetId($params = [], $data = []){if (empty($params)) $params = ['user_id_type' => 'user_id'];return $this->_batchGetId($params, $data);}/*** @desc 更新用户ID* https://open.feishu.cn/document/uAjLw4CM/ukTMukTMukTM/reference/contact-v3/user/update_user_id* @param $path 路径参数* @param $params 查询参数* @param $data 请求参数* @return array|mixed* @author 陈龙* @date 2024-01-09 18:31*/public function updateUserId($path = [], $params = [], $data = []){return $this->_updateUserId($path, $params, $data);}/*** @desc 创建部门* https://open.feishu.cn/document/server-docs/contact-v3/department/create* @param $data 请求参数* @return array|mixed* @author 陈龙* @date 2024-01-09 19:49*/public function createDepartment($data = []){return $this->_createDepartment($data);}/*** @desc 删除部门* https://open.feishu.cn/document/server-docs/contact-v3/department/delete* @param $path 路径参数* @param $params 查询参数* @return array|mixed* @author 陈龙* @date 2024-01-09 19:55*/public function deleteDepartment($path = [], $params = []){return $this->_deleteDepartment($path, $params);}/*** @desc 修改部门部分信息* https://open.feishu.cn/document/server-docs/contact-v3/department/patch* @param $path 路径参数* @param $params 查询参数* @param $data 请求参数* @return array|mixed* @author 陈龙* @date 2024-01-09 18:31*/public function updateDepartmentInfo($path = [], $params = [], $data = []){return $this->_updateDepartmentInfo($path, $params, $data);}/*** @desc 更新部门所有信息* https://open.feishu.cn/document/server-docs/contact-v3/department/update* @param $path 路径参数* @param $params 查询参数* @param $data 请求参数* @return array|mixed* @author 陈龙* @date 2024-01-09 18:31*/public function updateDepartmentAllInfo($path = [], $params = [], $data = []){return $this->_updateDepartmentAllInfo($path, $params, $data);}/*** @desc 获取单个部门信息* https://open.feishu.cn/document/server-docs/contact-v3/department/get* @return mixed* @author 陈龙* @date 2024-01-09 11:02*/public function getDepartment($path = [], $params = []){return $this->_getDepartment($path, $params);}/*** @desc 批量获取部门信息* https://open.feishu.cn/document/uAjLw4CM/ukTMukTMukTM/reference/contact-v3/department/batch* @return mixed* @author 陈龙* @date 2024-01-09 11:02*/public function batchGetDepartment($params = []){return $this->_batchGetDepartment($params);}/*** @desc 获取子部门列表* https://open.feishu.cn/document/server-docs/contact-v3/department/children* @return mixed* @author 陈龙* @date 2024-01-09 11:02*/public function getDepartmentChildren($path = [], $params = []){return $this->_getDepartmentChildren($path, $params);}/*** @desc 获取父部门信息* https://open.feishu.cn/document/server-docs/contact-v3/department/parent* @return mixed* @author 陈龙* @date 2024-01-09 11:02*/public function getDepartmentParent($params = []){return $this->_getDepartmentParent($params);}/*** @desc 更新部门ID* https://open.feishu.cn/document/uAjLw4CM/ukTMukTMukTM/reference/contact-v3/department/update_department_id* @param $path 路径参数* @param $params 查询参数* @param $data 请求参数* @return array|mixed* @author 陈龙* @date 2024-01-09 18:31*/public function updateDepartmentId($path = [], $params = [], $data = []){return $this->_updateDepartmentId($path, $params, $data);}/*** @desc 创建角色* https://open.feishu.cn/document/server-docs/contact-v3/functional_role/create* @param $data 请求参数* @return array|mixed* @author 陈龙* @date 2024-01-09 19:50*/public function createRole($data = []){return $this->_createRole($data);}/*** @desc 修改角色名称* https://open.feishu.cn/document/server-docs/contact-v3/functional_role/update* @param $path 路径参数* @param $data 请求参数* @return array|mixed* @author 陈龙* @date 2024-01-09 19:55*/public function updateRoleName($path = [], $data = []){return $this->_updateRoleName($path, $data);}/*** @desc 删除角色* https://open.feishu.cn/document/server-docs/contact-v3/functional_role/delete* @param $path 路径参数* @return array|mixed* @author 陈龙* @date 2024-01-09 19:55*/public function deleteRole($path = []){return $this->_deleteRole($path);}/*** @desc 发送消息* https://open.feishu.cn/document/server-docs/im-v1/message/create* @param $data* @return array|mixed* @author 陈龙* @date 2024-08-14 13:57*/public function messages($data){if (empty($params)) $params = ['receive_id_type' => 'user_id'];return $this->_messages($params, $data);}
}
REQUEST:
<?php
// +----------------------------------------------------------------------
// | 飞书请求
// +----------------------------------------------------------------------
// | COPYRIGHT (C) 2021 http://www.jeoshi.com All rights reserved.
// +----------------------------------------------------------------------
// | AUTHOR : 陈龙
// | DATE : 2024/01/19 10:45:47
// | VERSION:1.0.0
// +----------------------------------------------------------------------
namespace feishu;use think\Cache;
use think\Config;class Request
{/*** @desc redis 对象* @var object*/private $redis;/*** 未经过封装的redis*/private $raw_redis;/*** 请求域名*/private $domain = "https://open.feishu.cn/open-apis";/*** 应用唯一标识*/private $app_id = '';/*** 应用秘钥*/private $app_secret = '';/*** 公司ID*/private $company_id = '';/*** 构造函数*/public function __construct(){$this->redis = Cache::connect(Config::get('cache.redis'));$this->raw_redis = $this->redis->handler();}/*** @desc setAppConfig* @return void* @author 陈龙* @date 2024-04-20 9:57*/public function setAppConfig($company_id){$this->company_id = $company_id;if ($company_id == 23){$this->app_id = Config::get('feishu.app')[23]['app_id'] ?? '';$this->app_secret = Config::get('feishu.app')[23]['app_secret'] ?? '';}elseif ($company_id == 36){$this->app_id = Config::get('feishu.app')[36]['app_id'] ?? '';$this->app_secret = Config::get('feishu.app')[36]['app_secret'] ?? '';}else{$this->app_id = Config::get('feishu.app')[0]['app_id'] ?? '';$this->app_secret = Config::get('feishu.app')[0]['app_secret'] ?? '';}}/*** @desc Curl请求* @param $url* @param $data* @param $method* @param $withToken* @param $header* @return bool|string* @author 陈龙* @date 2024-01-09 17:32*/public function httpCurl($url, $data, $method = 'POST', $withToken = true, $header = ''){$headers = $this->buildHeader($header,$withToken);$curl = curl_init(); // 启动一个CURL会话curl_setopt($curl, CURLOPT_URL, $url);curl_setopt($curl, CURLOPT_HEADER, 0);curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false); // 跳过证书检查curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false); // 从证书中检查SSL加密算法是否存在curl_setopt($curl, CURLOPT_HTTPHEADER, $headers);$method = strtoupper($method);switch ($method){case 'POST':curl_setopt($curl, CURLOPT_POST, 1);curl_setopt($curl, CURLOPT_POSTFIELDS, json_encode($data));break;case 'PUT':case 'PATCH':case 'DELETE':curl_setopt($curl, CURLOPT_CUSTOMREQUEST, $method);curl_setopt($curl, CURLOPT_POSTFIELDS, json_encode($data));break;}$res = curl_exec($curl);curl_close($curl); //关闭URL请求return $res;}/*** @desc 构建头部参数* @param $header* @param $withToken* @return array* @author 陈龙* @date 2024-01-09 11:28*/public function buildHeader($header = '',$withToken = true){$headers[] = "Content-Type: application/json; charset=utf-8";if ($withToken) $headers[] = "Authorization: Bearer " . $this->getTenantAccessToken();if (!empty($header)) $headers[] = $header;return $headers;}/*** @desc 返回数据* @param $code 错误码,非 0 表示失败* @param $msg 错误描述* @param $data* @return array* @author 陈龙* @date 2024-01-09 18:13*/public function back($code = 0, $msg = '', $data = []){return ['code' => $code, 'msg' => $msg, 'data' => $data];}/*** @desc 错误返回* @param $msg* @param $code* @return array* @author 陈龙* @date 2024-01-09 18:34*/public function error($msg = '', $code = 400){return $this->back($code,$msg);}/*** @desc 自建应用获取 tenant_access_token* @param $up_cache* @return mixed|string* @author 陈龙* @date 2024-01-09 11:51*/public function getTenantAccessToken($up_cache = false){$redisKey = 'ehr:feishu:tenant_access_token:' . $this->company_id;$tenant_access_token = $this->redis->get($redisKey);if (empty($tenant_access_token) || $up_cache == true) {$url = $this->domain.'/auth/v3/tenant_access_token/internal';$data = ['app_id' => $this->app_id,'app_secret' => $this->app_secret,];$res = $this->httpCurl($url,$data,'POST',false);$res = json_decode($res,true);$tenant_access_token = $res['tenant_access_token'] ?? '';$expire = max(($res['expire'] ?? 0) - 900, 0);$this->redis->set($redisKey, $tenant_access_token, $expire);}return $tenant_access_token;}/*** @desc 创建用户* @param $data* @return array|mixed* @author 陈龙* @date 2024-01-09 18:21*/public function _createUser($data = []){if (empty($data['name'] ?? '')) return $this->error('用户名不能为空');if (empty($data['mobile'] ?? '')) return $this->error('手机号不能为空');if (empty($data['department_ids'] ?? '')) return $this->error('用户所属部门不能为空');if (empty($data['employee_type'] ?? '')) return $this->error('员工类型不能为空');$url = $this->domain.'/contact/v3/users';$res = $this->httpCurl($url, $data);$res = json_decode($res,true);if (empty($res)) return $this->error('返回异常');return $res;}/*** @desc 修改用户部分信息* @param $path* @param $params* @param $data* @return array|mixed* @author 陈龙* @date 2024-01-09 18:31*/public function _updateUserInfo($path = [], $params = [], $data = []){$user_id = $path['user_id'] ?? '';if (empty($user_id)) return $this->error('用户ID不能为空');$url = $this->domain."/contact/v3/users/{$user_id}?".http_build_query($params);$res = $this->httpCurl($url,$data,'PATCH');$res = json_decode($res,true);if (empty($res)) return $this->error('返回异常');return $res;}/*** @desc 删除用户* @param $path* @param $params* @param $data* @return array|mixed* @author 陈龙* @date 2024-01-09 18:31*/public function _deleteUser($path = [], $params = [], $data = []){$user_id = $path['user_id'] ?? '';if (empty($user_id)) return $this->error('用户ID不能为空');$url = $this->domain."/contact/v3/users/{$user_id}?".http_build_query($params);$res = $this->httpCurl($url,$data,'DELETE');$res = json_decode($res,true);if (empty($res)) return $this->error('返回异常');return $res;}/*** @desc 恢复已删除用户* @param $path* @param $params* @param $data* @return array|mixed* @author 陈龙* @date 2024-01-09 18:31*/public function _resurrectUser($path = [], $params = [], $data = []){$user_id = $path['user_id'] ?? '';if (empty($user_id)) return $this->error('用户ID不能为空');$url = $this->domain."/contact/v3/users/{$user_id}/resurrect?".http_build_query($params);$res = $this->httpCurl($url,$data);$res = json_decode($res,true);if (empty($res)) return $this->error('返回异常');return $res;}/*** @desc 获取单个用户信息* @param $path* @param $params* @return array|mixed* @author 陈龙* @date 2024-01-09 20:13*/public function _getUser($path = [], $params = []){$user_id = $path['user_id'] ?? '';if (empty($user_id)) return $this->error('用户ID不能为空');$url = $this->domain."/contact/v3/users/{$user_id}?".http_build_query($params);$res = $this->httpCurl($url,'','GET');$res = json_decode($res,true);if (empty($res)) return $this->error('返回异常');return $res;}/*** @desc 批量获取用户信息* @param $params* @return array|mixed* @author 陈龙* @date 2024-01-09 20:13*/public function _batchGetUser($params = []){$user_ids = $params['user_ids'] ?? '';if (empty($user_ids)) return $this->error('用户ID不能为空');$url = $this->domain."/contact/v3/users/batch?".http_build_query($params);$res = $this->httpCurl($url,'','GET');$res = json_decode($res,true);if (empty($res)) return $this->error('返回异常');return $res;}/*** @desc 获取部门直属用户列表* @param $params* @return array|mixed* @author 陈龙* @date 2024-01-09 20:13*/public function _findUserByDepartment($params = []){$url = $this->domain."/contact/v3/users/find_by_department?".http_build_query($params);$res = $this->httpCurl($url,'','GET');$res = json_decode($res,true);if (empty($res)) return $this->error('返回异常');return $res;}/*** @desc 通过手机号或邮箱获取用户 ID* @param $params* @return array|mixed* @author 陈龙* @date 2024-01-09 20:13*/public function _batchGetId($params = [],$data = []){$url = $this->domain."/contact/v3/users/batch_get_id?".http_build_query($params);$res = $this->httpCurl($url,$data);$res = json_decode($res,true);if (empty($res)) return $this->error('返回异常');return $res;}/*** @desc 更新用户ID* @param $path* @param $params* @param $data* @return array|mixed* @author 陈龙* @date 2024-01-09 18:31*/public function _updateUserId($path = [], $params = [], $data = []){$user_id = $path['user_id'] ?? '';if (empty($user_id)) return $this->error('用户ID不能为空');$new_user_id = $data['new_user_id'] ?? '';if (empty($new_user_id)) return $this->error('新用户ID不能为空');$url = $this->domain."/contact/v3/users/{$user_id}/update_user_id?".http_build_query($params);$res = $this->httpCurl($url,$data);$res = json_decode($res,true);if (empty($res)) return $this->error('返回异常');return $res;}/*** @desc 创建部门* @param $data* @return array|mixed* @author 陈龙* @date 2024-01-09 19:48*/public function _createDepartment($data = []){if (empty($data['name'] ?? '')) return $this->error('部门名称不能为空');$url = $this->domain.'/contact/v3/departments';$res = $this->httpCurl($url,$data);$res = json_decode($res,true);if (empty($res)) return $this->error('返回异常');return $res;}/*** @desc 删除部门* @param $path* @return array|mixed* @author 陈龙* @date 2024-01-09 19:54*/public function _deleteDepartment($path = [], $params = []){$department_id = $path['department_id'] ?? '';if (empty($department_id)) return $this->error('部门ID不能为空');$url = $this->domain."/contact/v3/departments/{$department_id}?".http_build_query($params);$res = $this->httpCurl($url,'','DELETE');$res = json_decode($res,true);if (empty($res)) return $this->error('返回异常');return $res;}/*** @desc 修改部门部分信息* @param $path* @param $params* @param $data* @return array|mixed* @author 陈龙* @date 2024-01-09 18:31*/public function _updateDepartmentInfo($path = [], $params = [], $data = []){$department_id = $path['department_id'] ?? '';if (empty($department_id)) return $this->error('部门ID不能为空');$url = $this->domain."/contact/v3/departments/{$department_id}?".http_build_query($params);$res = $this->httpCurl($url,$data,'PATCH');$res = json_decode($res,true);if (empty($res)) return $this->error('返回异常');return $res;}/*** @desc 更新部门所有信息* @param $path* @param $params* @param $data* @return array|mixed* @author 陈龙* @date 2024-01-09 18:31*/public function _updateDepartmentAllInfo($path = [], $params = [], $data = []){$department_id = $path['department_id'] ?? '';if (empty($department_id)) return $this->error('部门ID不能为空');$name = $path['name'] ?? '';if (empty($name)) return $this->error('部门名称不能为空');$url = $this->domain."/contact/v3/departments/{$department_id}?".http_build_query($params);$res = $this->httpCurl($url,$data,'PUT');$res = json_decode($res,true);if (empty($res)) return $this->error('返回异常');return $res;}/*** @desc 获取单个部门信息* @param $path* @param $params* @return array|mixed* @author 陈龙* @date 2024-01-09 20:13*/public function _getDepartment($path = [], $params = []){$department_id = $path['department_id'] ?? '';if (empty($department_id)) return $this->error('部门ID不能为空');$url = $this->domain."/contact/v3/departments/{$department_id}?".http_build_query($params);$res = $this->httpCurl($url,'','GET');$res = json_decode($res,true);if (empty($res)) return $this->error('返回异常');return $res;}/*** @desc 批量获取部门信息* @param $params* @return array|mixed* @author 陈龙* @date 2024-01-09 20:13*/public function _batchGetDepartment($params = []){$department_ids = $params['department_ids'] ?? '';if (empty($department_ids)) return $this->error('部门ID不能为空');$url = $this->domain."/contact/v3/departments/batch?".http_build_query($params);$res = $this->httpCurl($url,'','GET');$res = json_decode($res,true);if (empty($res)) return $this->error('返回异常');return $res;}/*** @desc 获取子部门列表* @param $path* @param $params* @return array|mixed* @author 陈龙* @date 2024-01-09 20:13*/public function _getDepartmentChildren($path = [], $params = []){$department_id = $path['department_id'] ?? '';if (empty($department_id)) return $this->error('部门ID不能为空');$url = $this->domain."/contact/v3/departments/{$department_id}/children?".http_build_query($params);$res = $this->httpCurl($url,'','GET');$res = json_decode($res,true);if (empty($res)) return $this->error('返回异常');return $res;}/*** @desc 获取父部门信息* @param $params* @return array|mixed* @author 陈龙* @date 2024-01-09 20:13*/public function _getDepartmentParent($params = []){$department_id = $params['department_id'] ?? '';if (empty($department_id)) return $this->error('部门ID不能为空');$url = $this->domain."/contact/v3/departments/{$department_id}/parent?".http_build_query($params);$res = $this->httpCurl($url,'','GET');$res = json_decode($res,true);if (empty($res)) return $this->error('返回异常');return $res;}/*** @desc 更新部门ID* @param $path* @param $params* @param $data* @return array|mixed* @author 陈龙* @date 2024-01-09 18:31*/public function _updateDepartmentId($path = [], $params = [], $data = []){$department_id = $path['department_id'] ?? '';if (empty($department_id)) return $this->error('部门ID不能为空');$department_id = $data['new_department_id'] ?? '';if (empty($department_id)) return $this->error('新部门ID不能为空');$url = $this->domain."/contact/v3/departments/{$department_id}/update_department_id?".http_build_query($params);$res = $this->httpCurl($url,$data);$res = json_decode($res,true);if (empty($res)) return $this->error('返回异常');return $res;}/*** @desc 创建角色* @param $data* @return array|mixed* @author 陈龙* @date 2024-01-09 19:50*/public function _createRole($data = []){if (empty($data['role_name'] ?? '')) return $this->error('角色名称不能为空');$url = $this->domain.'/contact/v3/functional_roles';$res = $this->httpCurl($url,$data);$res = json_decode($res,true);if (empty($res)) return $this->error('返回异常');return $res;}/*** @desc 修改角色名称* @param $path* @param $data* @return array|mixed* @author 陈龙* @date 2024-01-09 19:54*/public function _updateRoleName($path = [], $data = []){$role_id = $path['role_id'] ?? '';if (empty($role_id)) return $this->error('角色ID不能为空');if (empty($data['role_name'] ?? '')) return $this->error('角色名称不能为空');$url = $this->domain."/contact/v3/functional_roles/{$role_id}";$res = $this->httpCurl($url,$data);$res = json_decode($res,true);if (empty($res)) return $this->error('返回异常');return $res;}/*** @desc 删除角色* @param $path* @return array|mixed* @author 陈龙* @date 2024-01-09 19:54*/public function _deleteRole($path = []){$role_id = $path['role_id'] ?? '';if (empty($role_id)) return $this->error('角色ID不能为空');$url = $this->domain."/contact/v3/functional_roles/{$role_id}";$res = $this->httpCurl($url,'','DELETE');$res = json_decode($res,true);if (empty($res)) return $this->error('返回异常');return $res;}/*** @desc 发送消息* @param $path* @param $params* @return array|mixed* @author 陈龙* @date 2024-01-09 20:13*/public function _messages($params = [], $data = []){$receive_id = $data['receive_id'] ?? '';if (empty($receive_id)) return $this->error('receive_id不能为空');$url = "https://open.feishu.cn/open-apis/im/v1/messages?".http_build_query($params);$res = $this->httpCurl($url,$data);$res = json_decode($res,true);if (empty($res)) return $this->error('返回异常');return $res;}
}
service调用:
<?php
// +----------------------------------------------------------------------
// | 消息发送脚本服务层
// +----------------------------------------------------------------------
// | Copyright (c) 2020 http://www.jeoshi.com All rights reserved.
// +----------------------------------------------------------------------
// | Author: 陈龙
// +----------------------------------------------------------------------namespace app\command\message\service;use app\common\model\Message;
use app\common\model\Users;
use app\common\model\UsersMessages;
use feishu\Api;
use think\Cache;
use think\Config;
use think\console\Output;
use think\QueueAmqp;class FeishuService extends Base
{protected $id;protected $to_third_id;protected $msg_type;protected $msg_type_attr;protected $msg_title;protected $msg_content;protected $uuid;/*** @var null 单列对象*/public static $instance = null;/*** 输出对象* @var Output*/public $output;public function __construct(){$this->output = new Output();}/*** @desc 陈龙* @return static|null* @author 陈龙* @date 2023-03-28 14:10*/public static function instance(){if (is_null(self::$instance)) {self::$instance = new static;}return self::$instance;}/*** @desc 发送信息* @param $message* @return array* @author 陈龙* @date 2024-08-14 13:36*/public function send($message = []){$this->id = $message['id'] ?? '';$this->uuid = $message['uuid'] ?? '';$this->to_third_id = $message['to_third_id'] ?? 0;$this->msg_type = $this->typeAttr($message['msg_type'] ?? 1);$this->msg_type_attr = $message['msg_type_attr'] ?? 0;$this->msg_title = $message['msg_title'] ?? '';$msg_content = $message['msg_content'] ?? '';$this->msg_content = $this->msg_type == 'text' ? $msg_content : json_decode($msg_content, true);$this->msg_content = $this->contentAttr();$msg_data = ['receive_id' => $this->to_third_id,'msg_type' => $this->msg_type,'content' => json_encode($this->msg_content),'uuid' => md5($this->id . "|" . $this->uuid)];$feishuApi = new Api(['company_id' => $message['company_id'] ?? 0]);$res = $feishuApi->messages($msg_data);$code = $res['code'] ?? '';if ($code != 0) return back(0, $res['msg'] ?? '');return back(1, '发送成功');}/*** @desc 消息类型转换* @param $type* @return string* @author 陈龙* @date 2024-08-13 14:49*/private function typeAttr($type = 1){switch ($type){case 1:$type_name = 'text'; //文本break;case 2:$type_name = 'interactive'; //卡片break;default:$type_name = 'text';break;}return $type_name;}/*** @desc 内容类型转换* @param $content* @return string* @author 陈龙* @date 2024-08-13 14:49*/private function contentAttr(){switch ($this->msg_type){case 'text':return $this->textAttr();case 'interactive':return $this->cardAttr();}}/*** @desc 文本转换* @return string* @author 陈龙* @date 2024-08-13 14:49*/private function textAttr(){$data[$this->msg_type] = $this->msg_content;return $data;}/*** @desc 卡片转换* @return array|null* @author 陈龙* @date 2024-08-20 19:45*/private function cardAttr(){switch ($this->msg_type_attr){case 1:return $this->cardTask();default:return $this->msg_content;}}/*** @desc 任务类卡片消息(审核/处理)* @return array* @author 陈龙* @date 2024-08-20 19:45*/private function cardTask(){$data = ['config' => ['wide_screen_mode' => true],'header' => ['template' => 'turquoise','title' => ['content' => $this->msg_title,'tag' => 'plain_text',],],'elements' => $this->cardTaskAttr()];return $data;}/*** @desc 卡片任务转换* @return array* @author 陈龙* @date 2024-08-14 17:51*/private function cardTaskAttr(){// 内容$elements = $this->_handleElements();// 操作$actions = $this->_handleActions();if (!empty($actions)){$elements[] = ['actions' => $actions,'tag' => 'action',];}return $elements;}/*** @desc 处理操作* @return array* @author 陈龙* @date 2024-08-20 17:43*/private function _handleActions(){$actions = [];$temp_actions = $this->msg_content['actions'] ?? [];foreach ($temp_actions as $action){$actions[] = ['tag' => 'button','text' => ['content' => $action['content'],'tag' => 'plain_text',],'type' => 'button','url' => $action['url'],];}return $actions;}/*** @desc 处理元素* @return array* @author 陈龙* @date 2024-08-20 17:44*/private function _handleElements(){$elements = [];$temp_elements = $this->msg_content['elements'] ?? [];foreach ($temp_elements as $item){$columns = $item['columns'] ?? [];if (empty($columns)) {// 单行$lable = $item['lable'] ?? '';$content = $item['content'] ?? '';$elements[] = ['tag' => 'markdown','content' => "**{$lable}:**\n{$content}",'text_align' => 'left','text_size' => 'normal',];}else{$columns_elements = [];// 多行foreach ($columns as $column){$lable = $column['lable'] ?? '';$content = $column['content'] ?? '';$columns_elements[] = ["tag" => "column","width" => "weighted","vertical_align" => "top","vertical_spacing" => "8px","background_style" => "default","elements" => [["tag" => "markdown","content" => "**{$lable}:**\n{$content}","text_align" => "left","text_size" => "normal"]],"weight" => 1];}$elements[] = ["tag" => "column_set","flex_mode" => "stretch","background_style" => "default","horizontal_spacing" => "8px","horizontal_align" => "left","columns" => $columns_elements,"margin" => "16px 0px 0px 0px"];}}return $elements;}
}