DingtalkService.php 8.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232
  1. <?php
  2. namespace app\common\service;
  3. use app\common\constant\CommonConstant;
  4. use app\common\model\Department;
  5. use app\common\model\User;
  6. use app\extend\Dingtalk\Sample;
  7. /**
  8. * 钉钉服务类
  9. */
  10. class DingtalkService
  11. {
  12. public static function get_obj()
  13. {
  14. require_once env('root_path') . '/vendor/dingapi/TopSdk.php';
  15. date_default_timezone_set('Asia/Shanghai');
  16. $c = new \DingTalkClient(\DingTalkConstant::$CALL_TYPE_OAPI, \DingTalkConstant::$METHOD_POST, \DingTalkConstant::$FORMAT_JSON);
  17. return $c;
  18. }
  19. /**
  20. * 获取部门列表
  21. *
  22. * @param string $dept_id 父部门ID
  23. * @return mixed
  24. */
  25. public static function department_listsub($dept_id)
  26. {
  27. $accessToken = Sample::accessToken()['accessToken'];
  28. $c = self::get_obj();
  29. $req = new \OapiV2DepartmentListsubRequest;
  30. $req->setDeptId($dept_id);
  31. $resp = $c->execute($req, $accessToken, "https://oapi.dingtalk.com/topapi/v2/department/listsub");
  32. if ($resp->errcode == 0 && $resp->errmsg == 'ok') {
  33. $result = $resp->result;
  34. return $result;
  35. }
  36. except($resp->errcode . ' ' . $resp->errmsg);
  37. }
  38. /**
  39. * 获取部门详情
  40. *
  41. * @param string $dept_id 部门ID
  42. * @return mixed
  43. */
  44. public static function department_get($dept_id)
  45. {
  46. $accessToken = Sample::accessToken()['accessToken'];
  47. $c = self::get_obj();
  48. $req = new \OapiV2DepartmentListsubRequest;
  49. $req->setDeptId($dept_id);
  50. $resp = $c->execute($req, $accessToken, "https://oapi.dingtalk.com/topapi/v2/department/get");
  51. if ($resp->errcode == 0 && $resp->errmsg == 'ok') {
  52. $result = $resp->result;
  53. return $result;
  54. }
  55. except($resp->errcode . ' ' . $resp->errmsg);
  56. }
  57. /**
  58. * 获取部门用户详情
  59. *
  60. * @param string $dept_id 部门ID
  61. * @return mixed
  62. */
  63. public static function user_list($dept_id)
  64. {
  65. $accessToken = Sample::accessToken()['accessToken'];
  66. $c = self::get_obj();
  67. $req = new \OapiV2UserListRequest;
  68. $req->setDeptId($dept_id);
  69. $req->setCursor("0");
  70. $req->setSize("100");
  71. $resp = $c->execute($req, $accessToken, "https://oapi.dingtalk.com/topapi/v2/user/list");
  72. if ($resp->errcode == 0 && $resp->errmsg == 'ok') {
  73. $result = $resp->result;
  74. return $result;
  75. }
  76. except($resp->errcode . ' ' . $resp->errmsg);
  77. }
  78. /**
  79. * 查询用户详情
  80. *
  81. * @param string $userid 用户的userId
  82. * @return mixed
  83. */
  84. public static function user_get($userid)
  85. {
  86. $accessToken = Sample::accessToken()['accessToken'];
  87. $c = self::get_obj();
  88. $req = new \OapiV2UserGetRequest;
  89. $req->setUserid($userid);
  90. $resp = $c->execute($req, $accessToken, "https://oapi.dingtalk.com/topapi/v2/user/get");
  91. if ($resp->errcode == 0 && $resp->errmsg == 'ok') {
  92. $result = $resp->result;
  93. return $result;
  94. }
  95. except($resp->errcode . ' ' . $resp->errmsg);
  96. }
  97. /**
  98. * 通过免登码获取用户信息
  99. *
  100. * @param string $code 免登授权码
  101. * @return mixed
  102. */
  103. public static function get_user_info($code)
  104. {
  105. $accessToken = Sample::accessToken()['accessToken'];
  106. $c = self::get_obj();
  107. $req = new \OapiV2UserGetuserinfoRequest;
  108. $req->setCode($code);
  109. $resp = $c->execute($req, $accessToken, "https://oapi.dingtalk.com/topapi/v2/user/getuserinfo");
  110. if ($resp->errcode == 0 && $resp->errmsg == 'ok') {
  111. $result = $resp->result;
  112. return $result;
  113. }
  114. except($resp->errcode . ' ' . $resp->errmsg);
  115. }
  116. /**
  117. * 设置企业内部应用H5微应用鉴权
  118. * @param string $url 应用URL,例如:https://your-domain.com/path/to/your/app.html
  119. * @return mixed
  120. **/
  121. public static function generateAuthSignature($url)
  122. {
  123. // 获取jsapiTicket
  124. $jsapiTicket = Sample::jsapiTickets()['jsapiTicket'];
  125. // 生成鉴权签名
  126. $nonceStr = randCode(16); // 随机字符串,用于保证签名不可预测性,长度为16个字符的随机字符串
  127. $timeStamp = time(); // 时间戳,格式为13位数字,如:1602756290
  128. $stringA = "jsapi_ticket=$jsapiTicket&noncestr=$nonceStr&timestamp=$timeStamp&url=$url";
  129. $signature = sha1($stringA); // 签名值
  130. // agentId值
  131. // corpId值
  132. $config = config('app.dingtalk');
  133. $agentId = $config['agentId'];
  134. $corpId = $config['corpId'];
  135. return compact("agentId", "corpId", "nonceStr", "timeStamp", "signature", "url");
  136. }
  137. /**
  138. * 更新员工和部门
  139. * [{"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}]
  140. **/
  141. public static function renew()
  142. {
  143. // 更新部门
  144. // $department_data = self::get_tree(1);
  145. $department_data = '[{"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}]';
  146. $department_data = json_decode($department_data, JSON_UNESCAPED_UNICODE);
  147. $department_data_key = array_column($department_data, null, 'dept_id');
  148. $department_list = Department::field('is_deleted', true)
  149. ->where('is_deleted', CommonConstant::IS_DELETED_0)
  150. ->select();
  151. $department_key = array_column($department_list->toArray(), null, 'dept_id');
  152. $save_department_data = [];
  153. $add_department_data = [];
  154. $del_department_data = [];
  155. $department_user_data = [];
  156. $user_data = [];
  157. foreach ($department_data as $value) {
  158. if (array_key_exists($value['dept_id'], $department_key)) {
  159. $save_department_data[] = $value;
  160. } else {
  161. $add_department_data[] = $value;
  162. }
  163. $user_list = self::user_list($value['dept_id']);
  164. if($user_list->list){
  165. $department_user_data[$value['dept_id']] = $user_list->list;
  166. }
  167. }
  168. foreach ($department_user_data as $value) {
  169. foreach ($value as $val){
  170. $user_data[] = (array)$val;
  171. }
  172. }
  173. // $user_data_key = array_column($user_data, null, 'userid');
  174. p($user_data);
  175. p(json_encode($user_data,JSON_UNESCAPED_UNICODE));
  176. exit;
  177. if ($save_department_data) {
  178. foreach ($department_list as $val) {
  179. if (array_key_exists($val['dept_id'], $department_data_key)) {
  180. $department_data_info = $department_data_key[$val['dept_id']];
  181. $val->save($department_data_info);
  182. } else {
  183. $del_department_data[] = $val['id'];
  184. }
  185. }
  186. }
  187. if ($add_department_data) {
  188. Department::insertAll($add_department_data);
  189. }
  190. if ($del_department_data) {
  191. Department::where('id', 'in', $del_department_data)->delete();
  192. }
  193. // 更新员工
  194. $user_list = User::field('is_deleted', true)
  195. ->where('is_deleted', CommonConstant::IS_DELETED_0)
  196. ->select();
  197. $user_key = array_column($user_list->toArray(), null, 'userid');
  198. }
  199. /**
  200. * 递归
  201. **/
  202. public static function get_tree($dept_id, &$tree = [])
  203. {
  204. $resp = self::department_listsub($dept_id);
  205. foreach ($resp as $value) {
  206. $tree[] = [
  207. 'dept_id' => $value->dept_id,
  208. 'name' => $value->name,
  209. 'parent_id' => $value->parent_id,
  210. ];
  211. self::get_tree($value->dept_id, $tree);
  212. }
  213. return $tree;
  214. }
  215. }