| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591 |
- package jnpf.base.util;
- import com.alibaba.fastjson.JSONObject;
- import com.dingtalk.api.DefaultDingTalkClient;
- import com.dingtalk.api.DingTalkClient;
- import com.dingtalk.api.request.*;
- import com.dingtalk.api.response.*;
- import com.taobao.api.ApiException;
- import jnpf.message.model.message.DingTalkDeptModel;
- import jnpf.message.model.message.DingTalkUserModel;
- import jnpf.message.model.message.OrganizeListVO;
- import jnpf.permission.entity.OrganizeEntity;
- import jnpf.permission.model.organize.OrganizeModel;
- import jnpf.util.JsonUtil;
- import jnpf.util.StringUtil;
- import jnpf.util.treeutil.SumTree;
- import jnpf.util.treeutil.newtreeutil.TreeDotUtils;
- import java.util.ArrayList;
- import java.util.Iterator;
- import java.util.List;
- import java.util.Map;
- /**
- * 同步到企业微信的接口
- *
- * @版本: V3.1.0
- * @版权: 引迈信息技术有限公司(https://www.jnpfsoft.com)
- * @作者: JNPF开发平台组
- * @日期: 2021/4/30 17:11
- */
- public class SynDingTalkUtil {
- /**
- * token 接口
- */
- public static final String TOKEN = "https://oapi.dingtalk.com/gettoken";
- //--------------------------------------------部门--------------------------------------
- /**
- * 创建部门
- */
- public static final String CREATE_DEPARTMENT = "https://oapi.dingtalk.com/topapi/v2/department/create";
- /**
- * 更新部门
- */
- public static final String UPDATE_DEPARTMENT = "https://oapi.dingtalk.com/topapi/v2/department/update";
- /**
- * 删除部门
- */
- public static final String DELETE_DEPARTMENT = "https://oapi.dingtalk.com/topapi/v2/department/delete";
- /**
- * 获取部门列表
- */
- public static final String GET_DEPARTMENT_LIST = "https://oapi.dingtalk.com/topapi/v2/department/listsub";
- /**
- * 获取单个部门信息
- */
- public static final String GET_DEPARTMENT_INFO = "https://oapi.dingtalk.com/topapi/v2/department/get";
- //-------------------------------------------用户-----------------------------------------------------
- /**
- * 创建用户
- */
- public static final String CREATE_USER = "https://oapi.dingtalk.com/topapi/v2/user/create";
- /**
- * 更新用户
- */
- public static final String UPDATE_USER = "https://oapi.dingtalk.com/topapi/v2/user/update";
- /**
- * 删除用户
- */
- public static final String DELETE_USER = "https://oapi.dingtalk.com/topapi/v2/user/delete";
- /**
- * 获取用户列表(返回精简的员工信息列表)
- */
- public static final String GET_USER_LIST = "https://oapi.dingtalk.com/topapi/user/listsimple";
- /**
- * 获取用户列表(返回详细的员工信息列表)
- */
- public static final String GET_USER_DETAIL_LIST = "https://oapi.dingtalk.com/topapi/v2/user/list";
- /**
- * 获取单个成员信息
- */
- public static final String GET_SINGLE_USER = "https://oapi.dingtalk.com/topapi/v2/user/get";
- /**
- * 获取接口访问凭证
- */
- public static JSONObject getAccessToken(String corpId, String corpSecret) {
- JSONObject retMsg = new JSONObject();
- retMsg.put("code", true);
- try {
- DingTalkClient client = new DefaultDingTalkClient(TOKEN);
- OapiGettokenRequest req = new OapiGettokenRequest();
- req.setAppkey(corpId);
- req.setAppsecret(corpSecret);
- req.setHttpMethod("GET");
- OapiGettokenResponse rsp = client.execute(req);
- retMsg.put("access_token", rsp.getAccessToken());
- if (!rsp.isSuccess()) {
- retMsg.put("code", false);
- retMsg.put("access_token", "");
- }
- } catch (ApiException e) {
- retMsg.put("code", false);
- retMsg.put("access_token", "");
- }
- return retMsg;
- }
- //------------------------------------接口:部门管理的增删改查-------------------------------------
- /**
- * 创建钉钉部门接口
- *
- * @param deptModel
- * @param accessToken
- * @return
- */
- public static JSONObject createDepartment(DingTalkDeptModel deptModel, String accessToken) {
- JSONObject retMsg = new JSONObject();
- boolean codeFlag = true;
- String errorMsg = "";
- String deptId = "0";
- try {
- DingTalkClient client = new DefaultDingTalkClient(CREATE_DEPARTMENT);
- OapiV2DepartmentCreateRequest req = new OapiV2DepartmentCreateRequest();
- req.setParentId(deptModel.getParentId());
- req.setName(deptModel.getName());
- req.setOrder(deptModel.getOrder());
- req.setCreateDeptGroup(deptModel.getCreateDeptGroup());
- req.setSourceIdentifier(deptModel.getSourceIdentifier());
- OapiV2DepartmentCreateResponse rsp = client.execute(req, accessToken);
- if (rsp.isSuccess()) {
- codeFlag = true;
- JSONObject bodyObject = JSONObject.parseObject(rsp.getBody());
- bodyObject = JSONObject.parseObject(bodyObject.getString("result"));
- deptId = bodyObject.getLong("dept_id").toString();
- } else {
- codeFlag = false;
- errorMsg = rsp.getErrmsg();
- }
- } catch (ApiException e) {
- codeFlag = false;
- errorMsg = e.toString();
- }
- retMsg.put("code", codeFlag);
- retMsg.put("error", errorMsg);
- retMsg.put("retDeptId", deptId);
- return retMsg;
- }
- /**
- * 更新钉钉部门接口
- *
- * @param deptModel
- * @param accessToken
- * @return
- */
- public static JSONObject updateDepartment(DingTalkDeptModel deptModel, String accessToken) {
- JSONObject retMsg = new JSONObject();
- boolean codeFlag = true;
- String errorMsg = "";
- try {
- DingTalkClient client = new DefaultDingTalkClient(UPDATE_DEPARTMENT);
- OapiV2DepartmentUpdateRequest req = new OapiV2DepartmentUpdateRequest();
- req.setDeptId(deptModel.getDeptId());
- req.setParentId(deptModel.getParentId());
- req.setOrder(deptModel.getOrder());
- req.setName(deptModel.getName());
- // 设置部门主管,先建部门、再建设用户、再更新部门主管
- if (StringUtil.isNotEmpty(deptModel.getDeptManagerUseridList())) {
- req.setDeptManagerUseridList(deptModel.getDeptManagerUseridList());
- }
- OapiV2DepartmentUpdateResponse rsp = client.execute(req, accessToken);
- if (!rsp.isSuccess()) {
- codeFlag = false;
- errorMsg = rsp.getErrmsg();
- }
- } catch (ApiException e) {
- codeFlag = false;
- errorMsg = e.toString();
- }
- retMsg.put("code", codeFlag);
- retMsg.put("error", errorMsg);
- return retMsg;
- }
- /**
- * 删除钉钉部门接口
- *
- * @param id
- * @param accessToken
- * @return
- */
- public static JSONObject deleteDepartment(Long id, String accessToken) {
- JSONObject retMsg = new JSONObject();
- boolean codeFlag = true;
- String errorMsg = "";
- try {
- DingTalkClient client = new DefaultDingTalkClient(DELETE_DEPARTMENT);
- OapiV2DepartmentDeleteRequest req = new OapiV2DepartmentDeleteRequest();
- req.setDeptId(id);
- OapiV2DepartmentDeleteResponse rsp = client.execute(req, accessToken);
- if (!rsp.isSuccess()) {
- codeFlag = false;
- errorMsg = rsp.getErrmsg();
- }
- } catch (ApiException e) {
- codeFlag = false;
- errorMsg = e.toString();
- }
- retMsg.put("code", codeFlag);
- retMsg.put("error", errorMsg);
- return retMsg;
- }
- /**
- * 获取钉钉部门列表信息接口(一次只能获取下一级部门,不能多级查询)
- *
- * @param id
- * @param accessToken
- * @return
- */
- public static JSONObject getDepartmentList(Long id, String accessToken) {
- JSONObject retMsg = new JSONObject();
- boolean codeFlag = true;
- String errorMsg = "";
- List<OapiV2DepartmentListsubResponse.DeptBaseResponse> departmentAllList = new ArrayList<>();
- retMsg = getDepartmentListSub(id, accessToken, departmentAllList);
- if (!retMsg.getBoolean("code")) {
- codeFlag = false;
- errorMsg = "获取钉钉所有部门列表失败";
- }
- retMsg.put("code", codeFlag);
- retMsg.put("error", errorMsg);
- retMsg.put("department", departmentAllList);
- return retMsg;
- }
- /**
- * 递归获取部门信息列表
- *
- * @param id
- * @param accessToken
- * @param departmentAllList
- * @return
- */
- public static JSONObject getDepartmentListSub(Long id, String accessToken, List<OapiV2DepartmentListsubResponse.DeptBaseResponse> departmentAllList) {
- JSONObject retMsg = new JSONObject();
- boolean codeFlag = true;
- String errorMsg = "";
- List<OapiV2DepartmentListsubResponse.DeptBaseResponse> departmentList = new ArrayList<>();
- try {
- DingTalkClient client = new DefaultDingTalkClient(GET_DEPARTMENT_LIST);
- OapiV2DepartmentListsubRequest req = new OapiV2DepartmentListsubRequest();
- req.setDeptId(id);
- OapiV2DepartmentListsubResponse rsp = client.execute(req, accessToken);
- if (!rsp.isSuccess()) {
- retMsg.put("code", false);
- retMsg.put("error", rsp.getErrmsg());
- return retMsg;
- } else {
- departmentList = rsp.getResult();
- if (departmentList.size() > 0) {
- for (OapiV2DepartmentListsubResponse.DeptBaseResponse deptEntity : departmentList) {
- departmentAllList.add(deptEntity);
- retMsg = getDepartmentListSub(deptEntity.getDeptId(), accessToken, departmentAllList);
- if (!retMsg.getBoolean("code")) {
- codeFlag = false;
- errorMsg = rsp.getErrmsg();
- break;
- }
- }
- }
- }
- } catch (ApiException e) {
- codeFlag = false;
- errorMsg = e.toString();
- }
- retMsg.put("code", codeFlag);
- retMsg.put("error", errorMsg);
- return retMsg;
- }
- /**
- * 获取指定的钉钉部门信息接口
- *
- * @param deptId
- * @param accessToken
- * @return
- */
- public static JSONObject getDepartmentInfo(Long deptId, String accessToken) {
- JSONObject retMsg = new JSONObject();
- boolean codeFlag = true;
- String errorMsg = "";
- OapiV2DepartmentGetResponse.DeptGetResponse departmentInfo = new OapiV2DepartmentGetResponse.DeptGetResponse();
- try {
- DingTalkClient client = new DefaultDingTalkClient(GET_DEPARTMENT_INFO);
- OapiV2DepartmentGetRequest req = new OapiV2DepartmentGetRequest();
- req.setDeptId(deptId);
- OapiV2DepartmentGetResponse rsp = client.execute(req, accessToken);
- if (!rsp.isSuccess()) {
- codeFlag = false;
- errorMsg = rsp.getErrmsg();
- } else {
- departmentInfo = rsp.getResult();
- }
- } catch (ApiException e) {
- codeFlag = false;
- errorMsg = e.toString();
- }
- retMsg.put("code", codeFlag);
- retMsg.put("error", errorMsg);
- retMsg.put("departmentInfo", departmentInfo);
- return retMsg;
- }
- //------------------------------------接口:用户管理的增删改查-------------------------------------
- /**
- * 创建钉钉用户信息接口
- *
- * @param userModel
- * @param accessToken
- * @return
- */
- public static JSONObject createUser(DingTalkUserModel userModel, String accessToken) {
- JSONObject retMsg = new JSONObject();
- boolean codeFlag = true;
- String errorMsg = "";
- try {
- DingTalkClient client = new DefaultDingTalkClient(CREATE_USER);
- OapiV2UserCreateRequest req = new OapiV2UserCreateRequest();
- req.setUserid(userModel.getUserid());
- req.setName(userModel.getName());
- req.setMobile(userModel.getMobile());
- req.setTelephone(userModel.getTelephone());
- req.setJobNumber(userModel.getJobNumber());
- req.setTitle(userModel.getTitle());
- req.setEmail(userModel.getEmail());
- req.setWorkPlace(userModel.getWorkPlace());
- req.setDeptIdList(userModel.getDeptIdList());
- req.setHiredDate(userModel.getHiredDate());
- // 以下属性未设置
- // hide_mobile org_email extension senior_mode login_email
- // exclusive_account exclusive_account_type login_id init_password
- OapiV2UserCreateResponse rsp = client.execute(req, accessToken);
- if (!rsp.isSuccess()) {
- codeFlag = false;
- errorMsg = rsp.getErrmsg();
- }
- } catch (ApiException e) {
- codeFlag = false;
- errorMsg = e.toString();
- }
- retMsg.put("code", codeFlag);
- retMsg.put("error", errorMsg);
- return retMsg;
- }
- /**
- * 更新钉钉用户信息接口
- *
- * @param userModel
- * @param accessToken
- * @return
- */
- public static JSONObject updateUser(DingTalkUserModel userModel, String accessToken) {
- JSONObject retMsg = new JSONObject();
- boolean codeFlag = true;
- String errorMsg = "";
- try {
- DingTalkClient client = new DefaultDingTalkClient(UPDATE_USER);
- OapiV2UserUpdateRequest req = new OapiV2UserUpdateRequest();
- req.setUserid(userModel.getUserid());
- req.setName(userModel.getName());
- req.setMobile(userModel.getMobile());
- req.setTelephone(userModel.getTelephone());
- req.setJobNumber(userModel.getJobNumber());
- req.setTitle(userModel.getTitle());
- req.setEmail(userModel.getEmail());
- req.setWorkPlace(userModel.getWorkPlace());
- req.setDeptIdList(userModel.getDeptIdList());
- req.setHiredDate(userModel.getHiredDate());
- // 以下属性未设置
- // hide_mobile org_email extension senior_mode login_email
- // exclusive_account exclusive_account_type login_id init_password
- OapiV2UserUpdateResponse rsp = client.execute(req, accessToken);
- if (!rsp.isSuccess()) {
- codeFlag = false;
- errorMsg = rsp.getErrmsg();
- }
- } catch (ApiException e) {
- codeFlag = false;
- errorMsg = e.toString();
- }
- retMsg.put("code", codeFlag);
- retMsg.put("error", errorMsg);
- return retMsg;
- }
- /**
- * 删除钉钉用户信息接口
- *
- * @param userId
- * @param accessToken
- * @return
- */
- public static JSONObject deleteUser(String userId, String accessToken) {
- JSONObject retMsg = new JSONObject();
- boolean codeFlag = true;
- String errorMsg = "";
- try {
- DingTalkClient client = new DefaultDingTalkClient(DELETE_USER);
- OapiV2UserDeleteRequest req = new OapiV2UserDeleteRequest();
- req.setUserid(userId);
- OapiV2UserDeleteResponse rsp = client.execute(req, accessToken);
- if (!rsp.isSuccess()) {
- codeFlag = false;
- errorMsg = rsp.getErrmsg();
- }
- } catch (ApiException e) {
- codeFlag = false;
- errorMsg = e.toString();
- }
- retMsg.put("code", codeFlag);
- retMsg.put("error", errorMsg);
- return retMsg;
- }
- public static JSONObject getUserDingList(List<String> departmentList, String accessToken) {
- JSONObject retMsg = new JSONObject();
- boolean codeFlag = true;
- String errorMsg = "";
- List<OapiV2UserListResponse.ListUserResponse> userAllList = new ArrayList<>();
- // 钉钉限制每页记录数:不超过100
- // retMsg = getUserListSub(1L,0L,100L,accessToken,userAllList);
- // if(!retMsg.getBoolean("code")){
- // codeFlag = false;
- // errorMsg = "获取钉钉所有用户列表失败";
- // }
- if (!departmentList.isEmpty()) {
- for (String deptId : departmentList) {
- retMsg = getUserListSub(Long.parseLong(deptId), 0L, 100L, accessToken, userAllList);
- if (!retMsg.getBoolean("code")) {
- codeFlag = false;
- errorMsg = "获取钉钉所有用户列表失败";
- break;
- }
- }
- }
- retMsg.put("code", codeFlag);
- retMsg.put("error", errorMsg);
- retMsg.put("userlist", userAllList);
- return retMsg;
- }
- public static JSONObject getUserList(List<DingTalkDeptModel> departmentList, String accessToken) {
- JSONObject retMsg = new JSONObject();
- boolean codeFlag = true;
- String errorMsg = "";
- List<OapiV2UserListResponse.ListUserResponse> userAllList = new ArrayList<>();
- // 钉钉限制每页记录数:不超过100
- retMsg = getUserListSub(1L, 0L, 100L, accessToken, userAllList);
- if (!retMsg.getBoolean("code")) {
- codeFlag = false;
- errorMsg = "获取钉钉所有用户列表失败";
- }
- if (departmentList.size() > 0 && retMsg.getBoolean("code")) {
- for (DingTalkDeptModel deptEntity : departmentList) {
- retMsg = getUserListSub(deptEntity.getDeptId(), 0L, 100L, accessToken, userAllList);
- if (!retMsg.getBoolean("code")) {
- codeFlag = false;
- errorMsg = "获取钉钉所有用户列表失败";
- break;
- }
- }
- }
- retMsg.put("code", codeFlag);
- retMsg.put("error", errorMsg);
- retMsg.put("userlist", userAllList);
- return retMsg;
- }
- public static JSONObject getUserListSub(Long deptId, Long cursor, Long size, String accessToken,
- List<OapiV2UserListResponse.ListUserResponse> userAllList) {
- JSONObject retMsg = new JSONObject();
- List<OapiV2UserListResponse.ListUserResponse> userList = new ArrayList<>();
- OapiV2UserListResponse.PageResult pageResult = new OapiV2UserListResponse.PageResult();
- try {
- DingTalkClient client = new DefaultDingTalkClient(GET_USER_DETAIL_LIST);
- OapiV2UserListRequest req = new OapiV2UserListRequest();
- req.setDeptId(deptId);
- req.setCursor(cursor);
- req.setSize(size);
- OapiV2UserListResponse rsp = client.execute(req, accessToken);
- if (rsp.isSuccess()) {
- pageResult = rsp.getResult();
- userList = pageResult.getList();
- for (OapiV2UserListResponse.ListUserResponse userEntity : userList) {
- userAllList.add(userEntity);
- }
- if (pageResult.getHasMore()) {
- retMsg = getUserListSub(deptId, pageResult.getNextCursor(), size, accessToken, userAllList);
- if (!retMsg.getBoolean("code")) {
- retMsg.put("code", false);
- retMsg.put("error", rsp.getErrmsg());
- return retMsg;
- }
- }
- }
- } catch (ApiException e) {
- retMsg.put("code", false);
- retMsg.put("error", e.toString());
- return retMsg;
- }
- retMsg.put("code", true);
- retMsg.put("error", "");
- return retMsg;
- }
- /**
- * 按目录树结构数据转化为列表
- *
- * @param selectorVO
- * @param organizeList
- * @param listByOrder
- */
- public static <T> void getOrganizeTreeToList(OrganizeListVO selectorVO, Map<String, T> organizeList, List<T> listByOrder) {
- if (selectorVO.isHasChildren()) {
- List<OrganizeListVO> voChildren = selectorVO.getChildren();
- Iterator<OrganizeListVO> iterator = voChildren.iterator();
- while (iterator.hasNext()) {
- OrganizeListVO organizeSelectorVO = iterator.next();
- T entity = organizeList.get(organizeSelectorVO.getId());
- listByOrder.add(entity);
- if (organizeSelectorVO.isHasChildren()) {
- getOrganizeTreeToList(organizeSelectorVO, organizeList, listByOrder);
- }
- }
- }
- }
- }
|