liusheng
2026-03-13 2359f47c2f89a9867e72aa9b171cb118b874afec
ruoyi-project/src/main/java/com/ruoyi/project/service/impl/DingTalkServiceImpl.java
@@ -5,17 +5,23 @@
import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
import com.dingtalk.api.DefaultDingTalkClient;
import com.dingtalk.api.DingTalkClient;
import com.dingtalk.api.request.*;
import com.dingtalk.api.response.*;
import com.dingtalk.api.request.OapiGettokenRequest;
import com.dingtalk.api.request.OapiMessageCorpconversationAsyncsendV2Request;
import com.dingtalk.api.request.OapiUserListidRequest;
import com.dingtalk.api.request.OapiV2UserGetbymobileRequest;
import com.dingtalk.api.response.OapiGettokenResponse;
import com.dingtalk.api.response.OapiMessageCorpconversationAsyncsendV2Response;
import com.dingtalk.api.response.OapiUserListidResponse;
import com.dingtalk.api.response.OapiV2UserGetbymobileResponse;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.core.domain.entity.SysUser;
import com.ruoyi.common.exception.base.BaseException;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.common.utils.http.HttpUtils;
import com.ruoyi.project.domain.vo.DingDetpInfoVo;
import com.ruoyi.project.domain.vo.DingTalkReqVo;
import com.ruoyi.project.domain.vo.DingUserInfoVo;
import com.ruoyi.project.service.DingTalkService;
import com.ruoyi.project.utils.DingTalkProxyClient;
import com.ruoyi.system.mapper.SysUserMapper;
import com.taobao.api.ApiException;
import lombok.extern.log4j.Log4j;
@@ -23,10 +29,12 @@
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.web.bind.annotation.RequestParam;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
@@ -53,6 +61,9 @@
    @Autowired
    private SysUserMapper sysUserMapper;
    @Autowired
    private DingTalkProxyClient dingTalkProxyClient;
    @Override
    public Boolean sendNotification(DingTalkReqVo dingTalkReqVo) {
@@ -174,17 +185,36 @@
     */
    public Map<String, Object> noLogin(String authCode) {
        try {
            String urlString = "https://oapi.dingtalk.com/topapi/v2/user/getuserinfo";
            String params = "access_token=" + getAccessToken() + "&code=" + authCode;
            String result = HttpUtils.sendPost(urlString, params);
            // 复用同一个 accessToken,避免重复请求
            String accessToken = dingTalkProxyClient.getAccessToken();
            // 第一步:authCode 换 userid
            String params = "access_token=" + accessToken + "&code=" + authCode;
            String result = HttpUtils.sendPost("https://oapi.dingtalk.com/topapi/v2/user/getuserinfo", params);
            ObjectMapper objectMapper = new ObjectMapper();
            Map<String, Object> map = objectMapper.readValue(result, Map.class);
            return map;
            if (!Integer.valueOf(0).equals(map.get("errcode"))) {
                throw new BaseException("钉钉登录失败:" + map.get("errmsg"));
            }
            Map<String, Object> resultMap = (Map<String, Object>) map.get("result");
            String userid = (String) resultMap.get("userid");
            // 第二步:userid 换用户详情(含手机号)
            String params2 = "access_token=" + accessToken + "&userid=" + userid + "&language=zh_CN";
            String result2 = HttpUtils.sendPost("https://oapi.dingtalk.com/topapi/v2/user/get", params2);
            Map<String, Object> map2 = objectMapper.readValue(result2, Map.class);
            if (!Integer.valueOf(0).equals(map2.get("errcode"))) {
                throw new BaseException("获取用户详情失败:" + map2.get("errmsg"));
            }
            Map<String, Object> userDetail = (Map<String, Object>) map2.get("result");
            return userDetail;
        } catch (BaseException e) {
            throw e;
        } catch (Exception e) {
            log.error(e.getMessage());
            new BaseException("登录出异常了,请联系管理员处理");
            log.error("noLogin 异常:{}", e);
            throw new BaseException("登录出异常了,请联系管理员处理");
        }
        return null;
    }
    @Override
@@ -193,13 +223,13 @@
            //根据传过来的部门ID,去获取该部门下的用户信息
            if (begin != 1) DingUserInfoList(deptID);
            //获取子部门的dept_id
            DingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/topapi/v2/department/listsub");
            OapiV2DepartmentListsubRequest req = new OapiV2DepartmentListsubRequest();
            req.setDeptId(deptID);
            req.setLanguage("zh_CN");
            OapiV2DepartmentListsubResponse rsp = client.execute(req, getAccessToken());
            Map<String, String> params = new HashMap<>();
            params.put("access_token", dingTalkProxyClient.getAccessToken());
            params.put("dept_id", deptID.toString());
            params.put("language", "zh_CN");
            String rspBody = dingTalkProxyClient.executeGet("/topapi/v2/department/listsub", params);
            ObjectMapper objectMapper = new ObjectMapper();
            Map<String, Object> map = objectMapper.readValue(rsp.getBody(), Map.class);
            Map<String, Object> map = objectMapper.readValue(rspBody, Map.class);
            if (ObjectUtils.isNotEmpty(map)) {
                List<Map<String, Object>> dingDetpInfoList = (List<Map<String, Object>>) map.get("result");
                if (Integer.valueOf(map.get("errcode").toString()) == 0) {
@@ -216,18 +246,17 @@
    }
    public void DingUserInfoList(Long deptId) {
        DingTalkClient client = null;
        try {
            client = new DefaultDingTalkClient("https://oapi.dingtalk.com/topapi/v2/user/list?access_token=" + getAccessToken());
            OapiV2UserListRequest req = new OapiV2UserListRequest();
            req.setDeptId(deptId);
            req.setCursor(0L);
            req.setSize(100L);
            req.setLanguage("zh_CN");
            OapiV2UserListResponse rsp = client.execute(req, "");
            Map<String, String> params = new HashMap<>();
            params.put("access_token", dingTalkProxyClient.getAccessToken());
            params.put("dept_id", deptId.toString());
            params.put("cursor", "0");
            params.put("size", "100");
            params.put("language", "zh_CN");
            String rspBody = dingTalkProxyClient.executeGet("/topapi/v2/user/list", params);
            //获取resp里的用户信息集合
            ObjectMapper objectMapper = new ObjectMapper();
            Map<String, Object> map = objectMapper.readValue(rsp.getBody(), Map.class);
            Map<String, Object> map = objectMapper.readValue(rspBody, Map.class);
            Map<String, Object> mapResult = (Map<String, Object>) map.get("result");
            List<Map<String, Object>> userInfoMapList = (List<Map<String, Object>>) mapResult.get("list");
            if (!CollectionUtils.isEmpty(userInfoMapList)) {
@@ -262,5 +291,4 @@
        OapiGettokenResponse response = client.execute(request);
        return response.getAccessToken();
    }
}