From dd4cd96c69061da3ff80cbfb87237b16cda8abc3 Mon Sep 17 00:00:00 2001 From: doum <doum> Date: 星期五, 26 九月 2025 18:48:06 +0800 Subject: [PATCH] Merge remote-tracking branch 'origin/wuhuyancao' into wuhuyancao --- server/visits/dmvisit_service/src/main/java/com/doumee/core/dingTalk/DingTalk.java | 369 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 369 insertions(+), 0 deletions(-) diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/core/dingTalk/DingTalk.java b/server/visits/dmvisit_service/src/main/java/com/doumee/core/dingTalk/DingTalk.java new file mode 100644 index 0000000..05bda56 --- /dev/null +++ b/server/visits/dmvisit_service/src/main/java/com/doumee/core/dingTalk/DingTalk.java @@ -0,0 +1,369 @@ +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 鍒濆鍖栬处鍙稢lient + * @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)){ + //瑙f瀽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 + * 鏈帴鍙e彧鏀寔鑾峰彇褰撳墠閮ㄩ棬鐨勪笅涓�绾ч儴闂ㄥ熀纭�淇℃伅锛屼笉鏀寔鑾峰彇褰撳墠閮ㄩ棬涓嬫墍鏈夊眰绾у瓙閮ㄩ棬 + * @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; + } + + + + /** + * 鍒涘缓缁勭粐閮ㄩ棬 鏆備笉浣跨敤 + * 鎺ュ彛鏂囨。鍦板潃锛歨ttps://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()); + } + + + /** + * 鏇存柊缁勭粐閮ㄩ棬 鏆備笉浣跨敤 + * 鎺ュ彛鏂囨。鍦板潃锛歨ttps://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()); + } + } + + + + /** + * 鍒犻櫎缁勭粐閮ㄩ棬 鏆備笉浣跨敤 + * 鎺ュ彛鏂囨。鍦板潃锛歨ttps://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); + } + } + } + + + +} -- Gitblit v1.9.3