123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278 |
- <?php
- namespace app\common\service;
- use app\common\constant\CommonConstant;
- use app\common\model\Department;
- use app\common\model\User;
- use app\extend\Dingtalk\Sample;
- use think\Db;
- use think\Exception;
- /**
- * 钉钉服务类
- */
- class DingtalkService
- {
- public static function get_obj()
- {
- require_once env('root_path') . '/vendor/dingapi/TopSdk.php';
- date_default_timezone_set('Asia/Shanghai');
- $c = new \DingTalkClient(\DingTalkConstant::$CALL_TYPE_OAPI, \DingTalkConstant::$METHOD_POST, \DingTalkConstant::$FORMAT_JSON);
- return $c;
- }
- /**
- * 通过免登码获取用户信息
- *
- * @param string $code 免登授权码
- * @return mixed
- */
- public static function get_user_info($code)
- {
- $accessToken = Sample::accessToken()['accessToken'];
- $c = self::get_obj();
- $req = new \OapiV2UserGetuserinfoRequest;
- $req->setCode($code);
- $resp = $c->execute($req, $accessToken, "https://oapi.dingtalk.com/topapi/v2/user/getuserinfo");
- if ($resp->errcode == 0 && $resp->errmsg == 'ok') {
- $result = $resp->result;
- return $result;
- }
- except($resp->errcode . ' ' . $resp->errmsg);
- }
- /**
- * 设置企业内部应用H5微应用鉴权
- *
- * @param string $url 应用URL,例如:https://your-domain.com/path/to/your/app.html
- * @return mixed
- **/
- public static function generateAuthSignature($url)
- {
- // 获取jsapiTicket
- $jsapiTicket = Sample::jsapiTickets()['jsapiTicket'];
- // 生成鉴权签名
- $nonceStr = randCode(16); // 随机字符串,用于保证签名不可预测性,长度为16个字符的随机字符串
- $timeStamp = time(); // 时间戳,格式为13位数字,如:1602756290
- $stringA = "jsapi_ticket=$jsapiTicket&noncestr=$nonceStr×tamp=$timeStamp&url=$url";
- $signature = sha1($stringA); // 签名值
- // agentId值
- // corpId值
- $config = config('app.dingtalk');
- $agentId = $config['agentId'];
- $corpId = $config['corpId'];
- return compact("agentId", "corpId", "nonceStr", "timeStamp", "signature", "url");
- }
- /**
- * 更新员工和部门
- *
- * @return bool
- * [{"dept_id":438337214,"name":"BOSS","parent_id":1},{"dept_id":438145402,"name":"项目管理中心","parent_id":1},{"dept_id":501674219,"name":"技术部","parent_id":438145402},{"dept_id":500773946,"name":"项目一组","parent_id":501674219},{"dept_id":501193520,"name":"项目二组","parent_id":501674219},{"dept_id":731200005,"name":"Ui测试组","parent_id":501674219},{"dept_id":501415496,"name":"销售部","parent_id":438145402},{"dept_id":859178110,"name":"运营部","parent_id":438145402},{"dept_id":724339668,"name":"职能支持中心","parent_id":1},{"dept_id":438218445,"name":"人力资源部","parent_id":724339668},{"dept_id":702458745,"name":"财务部","parent_id":724339668}]
- **/
- public static function renew()
- {
- $save_department_data = [];
- $add_department_data = [];
- $del_department_data = [];
- $department_user_data = [];
- $user_data = [];
- $save_user_data = [];
- $add_user_data = [];
- $del_user_data = [];
- $department_data = self::get_tree(1);
- $department_data_key = array_column($department_data, null, 'dept_id');
- $department_list = Department::field('is_deleted', true)
- ->where('is_deleted', CommonConstant::IS_DELETED_0)
- ->select();
- $department_key = array_column($department_list->toArray(), null, 'dept_id');
- foreach ($department_data as $value) {
- if (array_key_exists($value['dept_id'], $department_key)) {
- $save_department_data[] = $value;
- } else {
- $add_department_data[] = $value;
- }
- $user_list = self::user_list($value['dept_id']);
- if ($user_list->list) {
- $department_user_data[$value['dept_id']] = $user_list->list;
- }
- }
- foreach ($department_user_data as $value) {
- foreach ($value as $val) {
- $user_data[] = (array)$val;
- }
- }
- $user_data_key = array_column($user_data, null, 'userid');
- $user_list = User::field('is_deleted', true)
- ->where('is_deleted', CommonConstant::IS_DELETED_0)
- ->select();
- $user_key = array_column($user_list->toArray(), null, 'userid');
- Db::startTrans();
- try {
- // 更新部门
- foreach ($department_list as $val) {
- if (array_key_exists($val['dept_id'], $department_data_key)) {
- $department_data_info = $department_data_key[$val['dept_id']];
- $val->save($department_data_info);
- } else {
- $del_department_data[] = $val['id'];
- }
- }
- if ($add_department_data) {
- Department::insertAll($add_department_data);
- }
- if ($del_department_data) {
- Department::where('id', 'in', $del_department_data)->update(['is_deleted' => CommonConstant::IS_DELETED_1]);
- }
- // 更新员工
- foreach ($user_data as $value) {
- if (array_key_exists($value['userid'], $user_key)) {
- $save_user_data[] = $value;
- } else {
- $data = [
- 'userid' => $value['userid'],
- 'unionid' => $value['unionid'],
- 'name' => $value['name'],
- 'avatar' => $value['avatar'],
- 'mobile' => isset($value['mobile']) ? $value['mobile'] : '',
- 'title' => isset($value['title']) ? $value['title'] : '',
- 'manager_userid' => isset($value['manager_userid']) ? $value['manager_userid'] : '',
- 'department' => implode(',', $value['dept_id_list']),
- ];
- $add_user_data[] = $data;
- }
- }
- foreach ($user_list as $val) {
- if (array_key_exists($val['userid'], $user_data_key)) {
- $user_data_info = $user_data_key[$val['userid']];
- $data = [
- 'userid' => $user_data_info['userid'],
- 'unionid' => $user_data_info['unionid'],
- 'department' => implode(',', $user_data_info['dept_id_list']),
- ];
- $val->save($data);
- } else {
- $del_user_data[] = $val['id'];
- }
- }
- if ($add_user_data) {
- User::insertAll($add_user_data);
- }
- if ($del_user_data) {
- User::where('id', 'in', $del_user_data)->update(['is_deleted' => CommonConstant::IS_DELETED_1]);
- }
- Db::commit();
- } catch (Exception $e) {
- Db::rollback();
- except('出现错误:' . $e->getMessage() .'|'. $e->getFile() .'|'. $e->getLine());
- }
- return true;
- }
- /**
- * 递归
- **/
- public static function get_tree($dept_id, &$tree = [])
- {
- $resp = self::department_listsub($dept_id);
- foreach ($resp as $value) {
- $tree[] = [
- 'dept_id' => $value->dept_id,
- 'name' => $value->name,
- 'parent_id' => $value->parent_id,
- ];
- self::get_tree($value->dept_id, $tree);
- }
- return $tree;
- }
- /**
- * 获取部门列表
- *
- * @param string $dept_id 父部门ID
- * @return mixed
- */
- public static function department_listsub($dept_id)
- {
- $accessToken = Sample::accessToken()['accessToken'];
- $c = self::get_obj();
- $req = new \OapiV2DepartmentListsubRequest;
- $req->setDeptId($dept_id);
- $resp = $c->execute($req, $accessToken, "https://oapi.dingtalk.com/topapi/v2/department/listsub");
- if ($resp->errcode == 0 && $resp->errmsg == 'ok') {
- $result = $resp->result;
- return $result;
- }
- except($resp->errcode . ' ' . $resp->errmsg);
- }
- /**
- * 获取部门详情
- *
- * @param string $dept_id 部门ID
- * @return mixed
- */
- public static function department_get($dept_id)
- {
- $accessToken = Sample::accessToken()['accessToken'];
- $c = self::get_obj();
- $req = new \OapiV2DepartmentListsubRequest;
- $req->setDeptId($dept_id);
- $resp = $c->execute($req, $accessToken, "https://oapi.dingtalk.com/topapi/v2/department/get");
- if ($resp->errcode == 0 && $resp->errmsg == 'ok') {
- $result = $resp->result;
- return $result;
- }
- except($resp->errcode . ' ' . $resp->errmsg);
- }
- /**
- * 获取部门用户详情
- *
- * @param string $dept_id 部门ID
- * @return mixed
- */
- public static function user_list($dept_id)
- {
- $accessToken = Sample::accessToken()['accessToken'];
- $c = self::get_obj();
- $req = new \OapiV2UserListRequest;
- $req->setDeptId($dept_id);
- $req->setCursor("0");
- $req->setSize("100");
- $resp = $c->execute($req, $accessToken, "https://oapi.dingtalk.com/topapi/v2/user/list");
- if ($resp->errcode == 0 && $resp->errmsg == 'ok') {
- $result = $resp->result;
- return $result;
- }
- except($resp->errcode . ' ' . $resp->errmsg);
- }
- /**
- * 查询用户详情
- *
- * @param string $userid 用户的userId
- * @return mixed
- */
- public static function user_get($userid)
- {
- $accessToken = Sample::accessToken()['accessToken'];
- $c = self::get_obj();
- $req = new \OapiV2UserGetRequest;
- $req->setUserid($userid);
- $resp = $c->execute($req, $accessToken, "https://oapi.dingtalk.com/topapi/v2/user/get");
- if ($resp->errcode == 0 && $resp->errmsg == 'ok') {
- $result = $resp->result;
- return $result;
- }
- except($resp->errcode . ' ' . $resp->errmsg);
- }
- }
|