| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package com.doumee.core.dingTalk; |
| | | |
| | | import com.alibaba.fastjson.JSONObject; |
| | | import com.aliyun.dingtalkoauth2_1_0.Client; |
| | | import com.aliyun.dingtalkoauth2_1_0.models.GetAccessTokenRequest; |
| | | import com.aliyun.dingtalkoauth2_1_0.models.GetAccessTokenResponse; |
| | | import com.aliyun.tea.TeaException; |
| | | import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; |
| | | import com.dingtalk.api.DefaultDingTalkClient; |
| | | import com.dingtalk.api.DingTalkClient; |
| | | import com.dingtalk.api.request.*; |
| | | import com.dingtalk.api.response.*; |
| | | import com.doumee.biz.system.SystemDictDataBiz; |
| | | import com.doumee.core.constants.ResponseStatus; |
| | | import com.doumee.core.exception.BusinessException; |
| | | import com.doumee.core.utils.Constants; |
| | | import com.doumee.dao.business.dao.CompanyMapper; |
| | | import com.doumee.dao.business.model.Company; |
| | | import com.doumee.dao.system.model.SystemDictData; |
| | | import com.doumee.service.business.CompanyService; |
| | | import com.github.xiaoymin.knife4j.core.util.CollectionUtils; |
| | | import com.taobao.api.ApiException; |
| | | import lombok.extern.slf4j.Slf4j; |
| | | import org.springframework.beans.factory.annotation.Autowired; |
| | | import org.springframework.stereotype.Service; |
| | | |
| | | import java.util.*; |
| | | import java.util.stream.Collectors; |
| | | |
| | | /** |
| | | * Created by IntelliJ IDEA. |
| | | * |
| | | * @Author : Rk |
| | | * @create 2025/9/24 16:25 |
| | | */ |
| | | @Slf4j |
| | | @Service |
| | | public class DingTalk { |
| | | |
| | | @Autowired |
| | | private SystemDictDataBiz systemDictDataBiz; |
| | | |
| | | @Autowired |
| | | private CompanyMapper companyMapper; |
| | | |
| | | /** |
| | | * ä½¿ç¨ Token åå§åè´¦å·Client |
| | | * @return Client com.aliyun.dingtalkoauth2_1_0. |
| | | * @throws Exception |
| | | */ |
| | | public static Client createClient() throws Exception { |
| | | com.aliyun.teaopenapi.models.Config config = new com.aliyun.teaopenapi.models.Config(); |
| | | config.protocol = "https"; |
| | | config.regionId = "central"; |
| | | return new Client(config); |
| | | } |
| | | |
| | | |
| | | public void updTokenInfo() throws Exception { |
| | | String appKey = systemDictDataBiz.queryByCode(Constants.DD_TALK,Constants.APP_KEY).getCode(); |
| | | String appSecret = systemDictDataBiz.queryByCode(Constants.DD_TALK,Constants.APP_SECRET).getCode(); |
| | | Client client = DingTalk.createClient(); |
| | | GetAccessTokenRequest getAccessTokenRequest = new GetAccessTokenRequest() |
| | | .setAppKey(appKey) |
| | | .setAppSecret(appSecret); |
| | | try { |
| | | GetAccessTokenResponse getAccessTokenResponse = client.getAccessToken(getAccessTokenRequest); |
| | | //è¿åæè¿° ä¾ï¼{"body":{"accessToken":"76a248ea72ba3f359b39c9e70073d642","expireIn":7200},"headers":{"access-control-allow-origin":"*","date":"Wed, 24 Sep 2025 08:39:36 GMT","server":"DingTalk/1.0.0","transfer-encoding":"chunked","x-acs-request-id":"9E8AF053-04DD-7031-9766-14DFFB087A79","access-control-allow-headers":"X-Requested-With, X-Sequence, _aop_secret, _aop_signature, x-acs-dingtalk-access-token","connection":"keep-alive","content-type":"application/json;charset=utf-8","access-control-expose-headers":"*","x-acs-trace-id":"96e7cf1f3c0e059779a6d581d4b5fca7"},"statusCode":200} |
| | | if(Constants.equalsInteger(getAccessTokenResponse.statusCode,Constants.DD_STATUS_SUCCESS_CODE)){ |
| | | //è§£ætokenä¿¡æ¯ åå¨ |
| | | String accessToken = getAccessTokenResponse.getBody().getAccessToken(); |
| | | //æ´æ°tokenä¿¡æ¯åå¨ |
| | | SystemDictData systemDictData = systemDictDataBiz.queryByCode(Constants.DD_TALK,Constants.ACCESS_TOKEN); |
| | | systemDictData.setCode(accessToken); |
| | | systemDictData.setUpdateTime(new Date()); |
| | | systemDictDataBiz.updateByIdNew(systemDictData); |
| | | } |
| | | |
| | | //æ´æ°Tokenä¿¡æ¯ |
| | | System.out.println(JSONObject.toJSONString(getAccessTokenResponse)); |
| | | |
| | | } catch (TeaException err) { |
| | | if (!com.aliyun.teautil.Common.empty(err.code) && !com.aliyun.teautil.Common.empty(err.message)) { |
| | | // err ä¸å«æ code å message 屿§ï¼å¯å¸®å©å¼åå®ä½é®é¢ |
| | | log.error("æ´æ°ééToken失败ï¼{}" + err.message); |
| | | } |
| | | |
| | | } catch (Exception _err) { |
| | | TeaException err = new TeaException(_err.getMessage(), _err); |
| | | if (!com.aliyun.teautil.Common.empty(err.code) && !com.aliyun.teautil.Common.empty(err.message)) { |
| | | // err ä¸å«æ code å message 屿§ï¼å¯å¸®å©å¼åå®ä½é®é¢ |
| | | log.error("æ´æ°ééToken失败ï¼{}" + err.message); |
| | | } |
| | | } |
| | | } |
| | | |
| | | |
| | | /** |
| | | * è·åééToken |
| | | * @return |
| | | */ |
| | | public String getToken(){ |
| | | String accessToken = systemDictDataBiz.queryByCode(Constants.DD_TALK,Constants.ACCESS_TOKEN).getCode(); |
| | | return accessToken; |
| | | } |
| | | |
| | | |
| | | /** |
| | | * å
¨é忥 é¨é¨ä¿¡æ¯ |
| | | * æ¥å£ææ¡£å°å https://open.dingtalk.com/document/orgapp/obtain-the-department-list-v2 |
| | | * æ¬æ¥å£åªæ¯æè·åå½åé¨é¨çä¸ä¸çº§é¨é¨åºç¡ä¿¡æ¯ï¼ä¸æ¯æè·åå½åé¨é¨ä¸ææå±çº§åé¨é¨ |
| | | * @throws ApiException |
| | | */ |
| | | public List<OapiV2DepartmentGetResponse.DeptGetResponse> syncAllDDDepartmentList() throws ApiException { |
| | | DingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/topapi/v2/department/listsub"); |
| | | List<Long> headList = new ArrayList<>(); |
| | | headList.add(1L); |
| | | List<OapiV2DepartmentListsubResponse.DeptBaseResponse> deptBaseResponseList = new ArrayList<>(); |
| | | List<OapiV2DepartmentListsubResponse.DeptBaseResponse> thisLevelList = getDepartmentList(client,headList); |
| | | deptBaseResponseList.addAll(thisLevelList); |
| | | while (CollectionUtils.isNotEmpty(thisLevelList)){ |
| | | headList = thisLevelList.stream().map(i->i.getDeptId()).collect(Collectors.toList()); |
| | | thisLevelList = getDepartmentList(client,headList); |
| | | if(CollectionUtils.isNotEmpty(thisLevelList)){ |
| | | deptBaseResponseList.addAll(thisLevelList); |
| | | } |
| | | } |
| | | List<OapiV2DepartmentGetResponse.DeptGetResponse> getResponseList = new ArrayList<>(); |
| | | if(CollectionUtils.isNotEmpty(deptBaseResponseList)){ |
| | | for (OapiV2DepartmentListsubResponse.DeptBaseResponse deptBaseResponse:deptBaseResponseList) { |
| | | OapiV2DepartmentGetResponse.DeptGetResponse deptGetResponse = syncDepartmentInfo(deptBaseResponse.getDeptId()); |
| | | getResponseList.add(deptGetResponse); |
| | | } |
| | | } |
| | | |
| | | return getResponseList; |
| | | } |
| | | |
| | | |
| | | /** |
| | | * è·åé¨é¨ä¸çº§æ°æ® |
| | | * @param client |
| | | * @param deptIdList |
| | | * @return |
| | | * @throws ApiException |
| | | */ |
| | | public List<OapiV2DepartmentListsubResponse.DeptBaseResponse> getDepartmentList |
| | | (DingTalkClient client, List<Long> deptIdList) throws ApiException{ |
| | | List<OapiV2DepartmentListsubResponse.DeptBaseResponse> thisLevelList = new ArrayList<>(); |
| | | for (Long deptId:deptIdList) { |
| | | OapiV2DepartmentListsubRequest req = new OapiV2DepartmentListsubRequest(); |
| | | req.setDeptId(deptId); |
| | | req.setLanguage("zh_CN"); |
| | | OapiV2DepartmentListsubResponse rsp = client.execute(req, this.getToken()); |
| | | if(rsp.getErrcode().equals(Constants.DD_ERR_CODE)){ |
| | | if(CollectionUtils.isNotEmpty(rsp.getResult())){ |
| | | thisLevelList.addAll(rsp.getResult()); |
| | | } |
| | | }else{ |
| | | throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),rsp.getMessage()); |
| | | } |
| | | } |
| | | return thisLevelList; |
| | | } |
| | | |
| | | |
| | | |
| | | /** |
| | | * å建ç»ç»é¨é¨ æä¸ä½¿ç¨ |
| | | * æ¥å£ææ¡£å°åï¼https://open.dingtalk.com/document/orgapp/create-a-department-v2 |
| | | * @param ddParentId ééä¸çº§é¨é¨ä¸»é® å¦ææ²¡æåå
¥null |
| | | * @param name é¨é¨åç§° |
| | | * @param sn åºå· |
| | | * @param id ç³»ç»é¨é¨ä¸»é® |
| | | * @throws ApiException |
| | | */ |
| | | public void pushCreatDepartment(Integer ddParentId,String name,Long sn,Integer id) throws ApiException { |
| | | DingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/topapi/v2/department/create"); |
| | | OapiV2DepartmentCreateRequest req = new OapiV2DepartmentCreateRequest(); |
| | | //å¿
å
¥åæ° |
| | | //妿æ ç¶çº§ åé»è®¤è·ç»ç» 1L |
| | | req.setParentId(Objects.isNull(ddParentId)?1L:ddParentId); |
| | | req.setName(name); |
| | | req.setOrder(sn); |
| | | //å¤é¨é¨é¨å段 |
| | | req.setSourceIdentifier(id.toString()); |
| | | |
| | | //é»è®¤åæ° |
| | | req.setHideDept(false); |
| | | req.setOuterDept(false); |
| | | req.setCreateDeptGroup(false); |
| | | |
| | | OapiV2DepartmentCreateResponse rsp = client.execute(req, getToken()); |
| | | if(rsp.getErrcode().equals(Constants.DD_ERR_CODE)){ |
| | | |
| | | }else{ |
| | | throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),rsp.getMessage()); |
| | | } |
| | | |
| | | System.out.println(rsp.getBody()); |
| | | } |
| | | |
| | | |
| | | /** |
| | | * æ´æ°ç»ç»é¨é¨ æä¸ä½¿ç¨ |
| | | * æ¥å£ææ¡£å°åï¼https://open.dingtalk.com/document/orgapp/update-a-department-v2 |
| | | * @param deptId ééé¨é¨ä¸»é® |
| | | * @param name é¨é¨åç§° |
| | | * @param parentId ç¶çº§ééé¨é¨ä¸»é® |
| | | * @param sn åºå· |
| | | * @throws ApiException |
| | | */ |
| | | public void pushUpdDepartment(Integer deptId,String name,Integer parentId,Long sn) throws ApiException { |
| | | DingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/topapi/v2/department/update"); |
| | | OapiV2DepartmentUpdateRequest req = new OapiV2DepartmentUpdateRequest(); |
| | | req.setDeptId(deptId.longValue()); |
| | | //妿æ ç¶çº§ åé»è®¤è·ç»ç» 1L |
| | | req.setParentId(Objects.isNull(parentId)?1L:parentId.longValue()); |
| | | req.setOrder(sn); |
| | | req.setName(name); |
| | | OapiV2DepartmentUpdateResponse rsp = client.execute(req, getToken()); |
| | | if(rsp.getErrcode().equals(Constants.DD_ERR_CODE)){ |
| | | |
| | | }else{ |
| | | throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),rsp.getMessage()); |
| | | } |
| | | } |
| | | |
| | | |
| | | |
| | | /** |
| | | * å é¤ç»ç»é¨é¨ æä¸ä½¿ç¨ |
| | | * æ¥å£ææ¡£å°åï¼https://open.dingtalk.com/document/orgapp/delete-a-department-v2 |
| | | * @param deptId ééé¨é¨ä¸»é® |
| | | * @throws ApiException |
| | | */ |
| | | public void pushDelDepartment(Integer deptId) throws ApiException { |
| | | DingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/topapi/v2/department/delete"); |
| | | OapiV2DepartmentDeleteRequest req = new OapiV2DepartmentDeleteRequest(); |
| | | req.setDeptId(deptId.longValue()); |
| | | OapiV2DepartmentDeleteResponse rsp = client.execute(req, getToken()); |
| | | System.out.println(rsp.getBody()); |
| | | if(rsp.getErrcode().equals(Constants.DD_ERR_CODE)){ |
| | | |
| | | }else{ |
| | | throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),rsp.getMessage()); |
| | | } |
| | | } |
| | | |
| | | |
| | | /** |
| | | * è·åééé¨é¨è¯¦æ
|
| | | * @param deptId |
| | | * @return |
| | | * @throws ApiException |
| | | */ |
| | | public OapiV2DepartmentGetResponse.DeptGetResponse syncDepartmentInfo(Long deptId) throws ApiException { |
| | | DingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/topapi/v2/department/get"); |
| | | OapiV2DepartmentGetRequest req = new OapiV2DepartmentGetRequest(); |
| | | req.setDeptId(deptId); |
| | | req.setLanguage("zh_CN"); |
| | | OapiV2DepartmentGetResponse rsp = client.execute(req, getToken()); |
| | | System.out.println(rsp.getBody()); |
| | | if(rsp.getErrcode().equals(Constants.DD_ERR_CODE)){ |
| | | return rsp.getResult(); |
| | | }else{ |
| | | throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),rsp.getMessage()); |
| | | } |
| | | } |
| | | |
| | | |
| | | |
| | | |
| | | public List<OapiV2UserGetResponse.UserGetResponse> syncAllUserInfo() throws ApiException { |
| | | List<Company> deptList = companyMapper.selectList(new QueryWrapper<Company>().lambda() |
| | | .eq(Company::getIsdeleted,Constants.ZERO) |
| | | .eq(Company::getType,Constants.ONE) |
| | | .isNotNull(Company::getErpId) |
| | | ); |
| | | if(CollectionUtils.isEmpty(deptList)){ |
| | | return null; |
| | | } |
| | | List<String> allUserIdList = new ArrayList<>(); |
| | | DingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/topapi/user/listid"); |
| | | OapiUserListidRequest req = new OapiUserListidRequest(); |
| | | for (Company company:deptList) { |
| | | req.setDeptId(Long.valueOf(company.getErpId())); |
| | | OapiUserListidResponse rsp = client.execute(req, getToken()); |
| | | if(rsp.getErrcode().equals(Constants.DD_ERR_CODE)){ |
| | | if(CollectionUtils.isNotEmpty(rsp.getResult().getUseridList())){ |
| | | allUserIdList.addAll(rsp.getResult().getUseridList()); |
| | | } |
| | | }else{ |
| | | throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),rsp.getMessage()); |
| | | } |
| | | } |
| | | if(CollectionUtils.isEmpty(allUserIdList)){ |
| | | return null; |
| | | } |
| | | Set<String> setUserIdList = new HashSet<>(allUserIdList); |
| | | return syncUserInfoList(setUserIdList); |
| | | } |
| | | |
| | | |
| | | public List<OapiV2UserGetResponse.UserGetResponse> syncUserInfoList(Set<String> setUserIdList) throws ApiException { |
| | | List<OapiV2UserGetResponse.UserGetResponse> userList = new ArrayList<>(); |
| | | DefaultDingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/topapi/v2/user/get"); |
| | | OapiV2UserGetRequest req = new OapiV2UserGetRequest(); |
| | | for (String userId:setUserIdList) { |
| | | req.setUserid(userId); |
| | | req.setLanguage("zh_CN"); |
| | | OapiV2UserGetResponse rsp = client.execute(req, getToken()); |
| | | if(rsp.getErrcode().equals(Constants.DD_ERR_CODE)){ |
| | | OapiV2UserGetResponse.UserGetResponse userGetResponse = rsp.getResult(); |
| | | userList.add(userGetResponse); |
| | | }else{ |
| | | throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),rsp.getMessage()); |
| | | } |
| | | } |
| | | return userList; |
| | | } |
| | | |
| | | |
| | | public OapiV2UserGetResponse.UserGetResponse syncUserInfo(String userId)throws ApiException { |
| | | DefaultDingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/topapi/v2/user/get"); |
| | | OapiV2UserGetRequest req = new OapiV2UserGetRequest(); |
| | | req.setUserid(userId); |
| | | req.setLanguage("zh_CN"); |
| | | OapiV2UserGetResponse rsp = client.execute(req, getToken()); |
| | | if(rsp.getErrcode().equals(Constants.DD_ERR_CODE)){ |
| | | OapiV2UserGetResponse.UserGetResponse userGetResponse = rsp.getResult(); |
| | | return userGetResponse; |
| | | }else{ |
| | | throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),rsp.getMessage()); |
| | | } |
| | | } |
| | | |
| | | |
| | | public static void main(String[] args) throws Exception { |
| | | String appKey = "dingkfglaktqmfd2dmo2";//systemDictDataBiz.queryByCode("","").getCode(); |
| | | String appSecret = "0e22TT2s794Yj49Exgvq8nU2ulpXmxlw9ThBh5s-vDv5Cfspv-f8HPmta4cg2evk";//systemDictDataBiz.queryByCode("","").getCode(); |
| | | Client client = DingTalk.createClient(); |
| | | GetAccessTokenRequest getAccessTokenRequest = new GetAccessTokenRequest() |
| | | .setAppKey(appKey) |
| | | .setAppSecret(appSecret); |
| | | try { |
| | | GetAccessTokenResponse getAccessTokenResponse = client.getAccessToken(getAccessTokenRequest); |
| | | |
| | | //æ´æ°Tokenä¿¡æ¯ |
| | | System.out.println(JSONObject.toJSONString(getAccessTokenResponse)); |
| | | |
| | | } catch (TeaException err) { |
| | | if (!com.aliyun.teautil.Common.empty(err.code) && !com.aliyun.teautil.Common.empty(err.message)) { |
| | | // err ä¸å«æ code å message 屿§ï¼å¯å¸®å©å¼åå®ä½é®é¢ |
| | | log.error("æ´æ°ééToken失败ï¼{}" + err.message); |
| | | } |
| | | |
| | | } catch (Exception _err) { |
| | | TeaException err = new TeaException(_err.getMessage(), _err); |
| | | if (!com.aliyun.teautil.Common.empty(err.code) && !com.aliyun.teautil.Common.empty(err.message)) { |
| | | // err ä¸å«æ code å message 屿§ï¼å¯å¸®å©å¼åå®ä½é®é¢ |
| | | log.error("æ´æ°ééToken失败ï¼{}" + err.message); |
| | | } |
| | | } |
| | | } |
| | | |
| | | |
| | | |
| | | } |