DingtalkService.php 9.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269
  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. $save_department_data = [];
  144. $add_department_data = [];
  145. $del_department_data = [];
  146. $department_user_data = [];
  147. $user_data = [];
  148. $save_user_data = [];
  149. $add_user_data = [];
  150. $del_user_data = [];
  151. // 更新部门
  152. $department_data = self::get_tree(1);
  153. $department_data_key = array_column($department_data, null, 'dept_id');
  154. $department_list = Department::field('is_deleted', true)
  155. ->where('is_deleted', CommonConstant::IS_DELETED_0)
  156. ->select();
  157. $department_key = array_column($department_list->toArray(), null, 'dept_id');
  158. foreach ($department_data as $value) {
  159. if (array_key_exists($value['dept_id'], $department_key)) {
  160. $save_department_data[] = $value;
  161. } else {
  162. $add_department_data[] = $value;
  163. }
  164. $user_list = self::user_list($value['dept_id']);
  165. if($user_list->list){
  166. $department_user_data[$value['dept_id']] = $user_list->list;
  167. }
  168. }
  169. foreach ($department_user_data as $value) {
  170. foreach ($value as $val){
  171. $user_data[] = (array)$val;
  172. }
  173. }
  174. $user_data_key = array_column($user_data, null, 'userid');
  175. $user_list = User::field('is_deleted', true)
  176. ->where('is_deleted', CommonConstant::IS_DELETED_0)
  177. ->select();
  178. $user_key = array_column($user_list->toArray(), null, 'userid');
  179. if ($save_department_data) {
  180. foreach ($department_list as $val) {
  181. if (array_key_exists($val['dept_id'], $department_data_key)) {
  182. $department_data_info = $department_data_key[$val['dept_id']];
  183. $val->save($department_data_info);
  184. } else {
  185. $del_department_data[] = $val['id'];
  186. }
  187. }
  188. }
  189. if ($add_department_data) {
  190. Department::insertAll($add_department_data);
  191. }
  192. if ($del_department_data) {
  193. Department::where('id', 'in', $del_department_data)->delete();
  194. }
  195. // 更新员工
  196. foreach ($user_data as $value) {
  197. if (array_key_exists($value['userid'], $user_key)) {
  198. $data = [
  199. 'userid'=>$value['userid'],
  200. 'unionid'=>$value['unionid'],
  201. 'department' => implode(',', $value['dept_id_list']),
  202. ];
  203. $save_user_data[] = $data;
  204. } else {
  205. $data = [
  206. 'userid' => $value['userid'],
  207. 'unionid' => $value['unionid'],
  208. 'name' => $value['name'],
  209. 'avatar' => $value['avatar'],
  210. 'mobile' => isset($value['mobile']) ? $value['mobile'] : '',
  211. 'title' => isset($value['title']) ? $value['title'] : '',
  212. 'manager_userid' => isset($value['manager_userid']) ? $value['manager_userid'] : '',
  213. 'department' => implode(',', $value['dept_id_list']),
  214. ];
  215. $add_user_data[] = $data;
  216. }
  217. }
  218. if ($save_user_data) {
  219. foreach ($user_list as $val) {
  220. if (array_key_exists($val['userid'], $user_data_key)) {
  221. $user_data_info = $user_data_key[$val['userid']];
  222. $val->save($user_data_info);
  223. } else {
  224. $del_user_data[] = $val['id'];
  225. }
  226. }
  227. }
  228. if ($add_user_data) {
  229. User::insertAll($add_user_data);
  230. }
  231. if ($del_user_data) {
  232. User::where('id', 'in', $del_user_data)->delete();
  233. }
  234. }
  235. /**
  236. * 递归
  237. **/
  238. public static function get_tree($dept_id, &$tree = [])
  239. {
  240. $resp = self::department_listsub($dept_id);
  241. foreach ($resp as $value) {
  242. $tree[] = [
  243. 'dept_id' => $value->dept_id,
  244. 'name' => $value->name,
  245. 'parent_id' => $value->parent_id,
  246. ];
  247. self::get_tree($value->dept_id, $tree);
  248. }
  249. return $tree;
  250. }
  251. }