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