AddrBookSdk.java 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343
  1. package com.usoftchina.dingtalk.sdk;
  2. import com.dingtalk.api.DefaultDingTalkClient;
  3. import com.dingtalk.api.DingTalkClient;
  4. import com.dingtalk.api.request.*;
  5. import com.dingtalk.api.response.*;
  6. import com.usoftchina.dingtalk.sdk.config.DingTalkProperties;
  7. import org.springframework.util.CollectionUtils;
  8. import java.util.ArrayList;
  9. import java.util.List;
  10. import java.util.Set;
  11. import java.util.stream.Collectors;
  12. /**
  13. * 通讯录
  14. *
  15. * @author yingp
  16. * @date 2020/2/19
  17. */
  18. public class AddrBookSdk extends BaseSdk {
  19. public AddrBookSdk(DingTalkProperties properties) {
  20. super(properties);
  21. }
  22. /**
  23. * 获取用户userid
  24. *
  25. * @param agentCode 应用code
  26. * @param authCode 免登授权码
  27. * @return
  28. */
  29. public OapiUserGetuserinfoResponse getUserInfo(String agentCode, String authCode) {
  30. DingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/user/getuserinfo");
  31. OapiUserGetuserinfoRequest request = new OapiUserGetuserinfoRequest();
  32. request.setCode(authCode);
  33. request.setHttpMethod("GET");
  34. OapiUserGetuserinfoResponse resp = cached(() -> client.execute(request, getAccessToken(agentCode)));
  35. assertOK(resp);
  36. return resp;
  37. }
  38. /**
  39. * 获取用户详情
  40. *
  41. * @param agentCode 应用code
  42. * @param userId 员工id
  43. * @return
  44. */
  45. public OapiUserGetResponse getUser(String agentCode, String userId) {
  46. DingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/user/get");
  47. OapiUserGetRequest req = new OapiUserGetRequest();
  48. req.setUserid(userId);
  49. req.setHttpMethod("GET");
  50. OapiUserGetResponse resp = cached(() -> client.execute(req, getAccessToken(agentCode)));
  51. assertOK(resp);
  52. return resp;
  53. }
  54. /**
  55. * 新增成员
  56. *
  57. * @param agentCode 应用code
  58. * @param req
  59. */
  60. public String createUser(String agentCode, OapiUserCreateRequest req) {
  61. DingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/user/create");
  62. OapiUserCreateResponse resp = cached(() -> client.execute(req, getAccessToken(agentCode)));
  63. assertOK(resp);
  64. return resp.getUserid();
  65. }
  66. /**
  67. * 更新成员
  68. *
  69. * @param agentCode 应用code
  70. * @param req
  71. */
  72. public void updateUser(String agentCode, OapiUserUpdateRequest req) {
  73. DingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/user/update");
  74. OapiUserUpdateResponse resp = cached(() -> client.execute(req, getAccessToken(agentCode)));
  75. assertOK(resp);
  76. }
  77. /**
  78. * 删除成员
  79. *
  80. * @param agentCode 应用code
  81. * @param userId 人员ID
  82. */
  83. public void deleteUser(String agentCode, String userId) {
  84. DingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/user/delete");
  85. OapiUserDeleteRequest req = new OapiUserDeleteRequest();
  86. req.setUserid(userId);
  87. req.setHttpMethod("GET");
  88. OapiUserDeleteResponse resp = cached(() -> client.execute(req, getAccessToken(agentCode)));
  89. assertOK(resp);
  90. }
  91. /**
  92. * 获取部门用户userid列表
  93. *
  94. * @param agentCode 应用code
  95. * @param departmentId 部门ID
  96. * @return
  97. */
  98. public List<String> getUserIdList(String agentCode, long departmentId) {
  99. DingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/user/getDeptMember");
  100. OapiUserGetDeptMemberRequest req = new OapiUserGetDeptMemberRequest();
  101. req.setDeptId(String.valueOf(departmentId));
  102. req.setHttpMethod("GET");
  103. OapiUserGetDeptMemberResponse resp = cached(() -> client.execute(req, getAccessToken(agentCode)));
  104. assertOK(resp);
  105. return resp.getUserIds();
  106. }
  107. /**
  108. * 获取部门用户
  109. *
  110. * @param agentCode 应用code
  111. * @param departmentId 部门ID
  112. * @return
  113. */
  114. public List<OapiUserSimplelistResponse.Userlist> getSimpleUserList(String agentCode, long departmentId) {
  115. List<OapiUserSimplelistResponse.Userlist> userList = new ArrayList<>();
  116. long size = 100;
  117. long offset = 0;
  118. while (true) {
  119. List<OapiUserSimplelistResponse.Userlist> tempList = getSimpleUserList(agentCode, departmentId, offset++, size);
  120. if (null != tempList) {
  121. userList.addAll(tempList);
  122. if (tempList.size() < size) {
  123. break;
  124. }
  125. } else {
  126. break;
  127. }
  128. }
  129. return userList;
  130. }
  131. /**
  132. * 获取部门用户
  133. *
  134. * @param agentCode
  135. * @param departmentId
  136. * @param offset 支持分页查询,与size参数同时设置时才生效,此参数代表偏移量,偏移量从0开始
  137. * @param size
  138. * @return
  139. */
  140. private List<OapiUserSimplelistResponse.Userlist> getSimpleUserList(String agentCode, long departmentId, long offset, long size) {
  141. DingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/user/simplelist");
  142. OapiUserSimplelistRequest req = new OapiUserSimplelistRequest();
  143. req.setDepartmentId(departmentId);
  144. req.setOffset(offset);
  145. req.setSize(size);
  146. req.setHttpMethod("GET");
  147. OapiUserSimplelistResponse resp = cached(() -> client.execute(req, getAccessToken(agentCode)));
  148. assertOK(resp);
  149. return resp.getUserlist();
  150. }
  151. /**
  152. * 获取部门用户详情
  153. *
  154. * @param agentCode 应用code
  155. * @param departmentId 部门ID
  156. * @param fetchChild 包含下级部门的
  157. * @return
  158. */
  159. public List<OapiUserListbypageResponse.Userlist> getUserList(String agentCode, long departmentId, boolean fetchChild) {
  160. List<OapiUserListbypageResponse.Userlist> userList = new ArrayList<>();
  161. long size = 100;
  162. int offset = 0;
  163. while (true) {
  164. List<OapiUserListbypageResponse.Userlist> tempList = getUserList(agentCode, departmentId, offset++ * size, size);
  165. if (null != tempList) {
  166. userList.addAll(tempList);
  167. if (tempList.size() < size) {
  168. break;
  169. }
  170. } else {
  171. break;
  172. }
  173. }
  174. if (fetchChild) {
  175. List<Long> subList = getSubDepartmentIdList(agentCode, departmentId);
  176. if (!CollectionUtils.isEmpty(subList)) {
  177. Set<String> userIdSet = userList.stream().map(user -> user.getUserid()).collect(Collectors.toSet());
  178. for (Long subId : subList) {
  179. List<OapiUserListbypageResponse.Userlist> tempList = getUserList(agentCode, subId, fetchChild);
  180. if (!CollectionUtils.isEmpty(tempList)) {
  181. userList.addAll(tempList.stream().filter(user -> !userIdSet.contains(user.getUserid())).collect(Collectors.toList()));
  182. userIdSet.addAll(tempList.stream().map(user -> user.getUserid()).collect(Collectors.toSet()));
  183. }
  184. }
  185. }
  186. }
  187. return userList;
  188. }
  189. /**
  190. * 获取部门用户详情
  191. *
  192. * @param agentCode
  193. * @param departmentId
  194. * @param offset 支持分页查询,与size参数同时设置时才生效,此参数代表偏移量
  195. * @param size
  196. * @return
  197. */
  198. private List<OapiUserListbypageResponse.Userlist> getUserList(String agentCode, long departmentId, long offset, long size) {
  199. DingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/user/listbypage");
  200. OapiUserListbypageRequest req = new OapiUserListbypageRequest();
  201. req.setDepartmentId(departmentId);
  202. req.setOffset(offset);
  203. req.setSize(size);
  204. req.setHttpMethod("GET");
  205. OapiUserListbypageResponse resp = cached(() -> client.execute(req, getAccessToken(agentCode)));
  206. assertOK(resp);
  207. return resp.getUserlist();
  208. }
  209. /**
  210. * 根据手机号获取userid
  211. *
  212. * @param agentCode 应用code
  213. * @param mobile 手机号
  214. * @return
  215. */
  216. public String getUserIdByMobile(String agentCode, String mobile) {
  217. DingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/user/get_by_mobile");
  218. OapiUserGetByMobileRequest req = new OapiUserGetByMobileRequest();
  219. req.setMobile(mobile);
  220. OapiUserGetByMobileResponse resp = cached(() -> client.execute(req, getAccessToken(agentCode)));
  221. assertOK(resp);
  222. return resp.getUserid();
  223. }
  224. /**
  225. * 创建部门
  226. *
  227. * @param agentCode 应用code
  228. * @param req
  229. * @return 部门ID
  230. */
  231. public Long createDepartment(String agentCode, OapiDepartmentCreateRequest req) {
  232. DingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/department/create");
  233. OapiDepartmentCreateResponse resp = cached(() -> client.execute(req, getAccessToken(agentCode)));
  234. assertOK(resp);
  235. return resp.getId();
  236. }
  237. /**
  238. * 更新部门
  239. *
  240. * @param agentCode 应用code
  241. * @param req
  242. * @return
  243. */
  244. public void updateDepartment(String agentCode, OapiDepartmentUpdateRequest req) {
  245. DingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/department/update");
  246. OapiDepartmentUpdateResponse resp = cached(() -> client.execute(req, getAccessToken(agentCode)));
  247. assertOK(resp);
  248. }
  249. /**
  250. * 删除部门
  251. *
  252. * @param agentCode 应用code
  253. * @param departmentId 部门ID
  254. */
  255. public void deleteDepartment(String agentCode, long departmentId) {
  256. DingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/department/delete");
  257. OapiDepartmentDeleteRequest req = new OapiDepartmentDeleteRequest();
  258. req.setId(String.valueOf(departmentId));
  259. req.setHttpMethod("GET");
  260. OapiDepartmentDeleteResponse resp = cached(() -> client.execute(req, getAccessToken(agentCode)));
  261. assertOK(resp);
  262. }
  263. /**
  264. * 获取子部门ID列表
  265. *
  266. * @param agentCode 应用code
  267. * @param departmentId 父部门ID
  268. * @return
  269. */
  270. public List<Long> getSubDepartmentIdList(String agentCode, long departmentId) {
  271. DingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/department/list_ids");
  272. OapiDepartmentListIdsRequest req = new OapiDepartmentListIdsRequest();
  273. req.setId(String.valueOf(departmentId));
  274. req.setHttpMethod("GET");
  275. OapiDepartmentListIdsResponse resp = cached(() -> client.execute(req, getAccessToken(agentCode)));
  276. assertOK(resp);
  277. return resp.getSubDeptIdList();
  278. }
  279. /**
  280. * 获取部门,包括下级
  281. *
  282. * @param agentCode 应用code
  283. * @param departmentId 父部门ID
  284. * @return
  285. */
  286. public List<OapiDepartmentListResponse.Department> getDepartmentList(String agentCode, long departmentId) {
  287. DingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/department/list");
  288. OapiDepartmentListRequest req = new OapiDepartmentListRequest();
  289. req.setId(String.valueOf(departmentId));
  290. req.setFetchChild(true);
  291. req.setHttpMethod("GET");
  292. OapiDepartmentListResponse resp = cached(() -> client.execute(req, getAccessToken(agentCode)));
  293. assertOK(resp);
  294. return resp.getDepartment();
  295. }
  296. /**
  297. * 获取全部部门
  298. *
  299. * @param agentCode 应用code
  300. * @return
  301. */
  302. public List<OapiDepartmentListResponse.Department> getDepartmentList(String agentCode) {
  303. return getDepartmentList(agentCode, 1);
  304. }
  305. /**
  306. * 获取部门详情
  307. *
  308. * @param agentCode 应用code
  309. * @param departmentId 部门ID
  310. * @return
  311. */
  312. public OapiDepartmentGetResponse getDepartmentDetail(String agentCode, long departmentId) {
  313. DingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/department/get");
  314. OapiDepartmentGetRequest req = new OapiDepartmentGetRequest();
  315. req.setId(String.valueOf(departmentId));
  316. req.setHttpMethod("GET");
  317. OapiDepartmentGetResponse resp = cached(() -> client.execute(req, getAccessToken(agentCode)));
  318. assertOK(resp);
  319. return resp;
  320. }
  321. }