package com.ruoyi.project.service.impl; import com.alibaba.fastjson2.JSONArray; import com.alibaba.fastjson2.JSONObject; 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.fasterxml.jackson.databind.ObjectMapper; 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.system.mapper.SysUserMapper; import com.taobao.api.ApiException; import lombok.extern.log4j.Log4j; import org.apache.commons.collections4.CollectionUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Date; import java.util.List; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; /** * 智能中心 * * @author ls * @date 2023-05-23 */ @Service @Log4j public class DingTalkServiceImpl implements DingTalkService { @Value("${dingAppid}") private String dingAppid; @Value("${dingAppSecret}") private String dingAppSecret; @Value("${agentId}") private Long agentId; @Autowired private SysUserMapper sysUserMapper; @Override public Boolean sendNotification(DingTalkReqVo dingTalkReqVo) { String body = null; List userIdlist = new ArrayList(); Boolean result = false; log.info("发送钉钉通知"); String accessToken = null; try { accessToken = getAccessToken(); } catch (ApiException e) { e.printStackTrace(); } if (StringUtils.isNotEmpty(dingTalkReqVo.getNumber())) { DingTalkClient clientT = new DefaultDingTalkClient("https://oapi.dingtalk.com/topapi/v2/user/getbymobile"); OapiV2UserGetbymobileRequest req = new OapiV2UserGetbymobileRequest(); req.setMobile(dingTalkReqVo.getNumber()); OapiV2UserGetbymobileResponse rsp = null; try { rsp = clientT.execute(req, accessToken); body = rsp.getBody(); String jsonObject = JSONObject.parseObject(body).getJSONObject("result").get("userid").toString(); userIdlist.add(jsonObject); } catch (ApiException e) { e.printStackTrace(); } } else { DingTalkClient client3 = new DefaultDingTalkClient("https://oapi.dingtalk.com/topapi/user/listid"); OapiUserListidRequest request2 = new OapiUserListidRequest(); request2.setDeptId(dingTalkReqVo.getDeptId()); // 设置要获取的部门 ID,这里以根部门为例675909059L // 设置部门 ID,如果获取所有员工手机号,可以设置为根部门的 ID OapiUserListidResponse response2 = null; try { response2 = client3.execute(request2, accessToken); } catch (ApiException e) { e.printStackTrace(); } body = response2.getBody(); // 解析为JSONObject JSONObject jsonObject = JSONObject.parseObject(body); if (jsonObject != null) { // 提取出JSONArray JSONArray jsonArray = new JSONArray(jsonObject.getJSONObject("result").getJSONArray("userid_list")); // 将JSONArray转为List列表 String str = JSONObject.toJSONString(jsonArray); userIdlist = JSONObject.parseObject(str, List.class); } } //userid数组 for (String urid : userIdlist) { DingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/topapi/message/corpconversation/asyncsend_v2"); OapiMessageCorpconversationAsyncsendV2Request request = new OapiMessageCorpconversationAsyncsendV2Request(); request.setUseridList(urid); request.setAgentId(agentId); request.setToAllUser(false); //发送内容处理 List> contents = dingTalkReqVo.getContents(); ArrayList objects = new ArrayList<>(); for (int i = 0; i < contents.size(); i++) { ConcurrentHashMap map = contents.get(i); for (Map.Entry entry : map.entrySet()) { OapiMessageCorpconversationAsyncsendV2Request.Form formSeverityDesc = new OapiMessageCorpconversationAsyncsendV2Request.Form(); formSeverityDesc.setKey(entry.getKey()); if (entry.getKey().contains("审批时间")) { Date date = (Date) entry.getValue(); SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss"); String format = simpleDateFormat.format(date); formSeverityDesc.setValue(format); } else { if (entry.getValue() != null) { formSeverityDesc.setValue(entry.getValue().toString()); } } objects.add(formSeverityDesc); } } OapiMessageCorpconversationAsyncsendV2Request.Msg msg = new OapiMessageCorpconversationAsyncsendV2Request.Msg(); msg.setOa(new OapiMessageCorpconversationAsyncsendV2Request.OA()); msg.getOa().setMessageUrl(dingTalkReqVo.getUrl()); msg.getOa().setPcMessageUrl(dingTalkReqVo.getUrl()); msg.getOa().setHead(new OapiMessageCorpconversationAsyncsendV2Request.Head()); // msg.getOa().getHead().setText("你在说啥呢绒顶替苛夺阿斯蒂芬阿斯蒂芬"); msg.getOa().getHead().setBgcolor("00409eff"); msg.getOa().setBody(new OapiMessageCorpconversationAsyncsendV2Request.Body()); msg.getOa().getBody().setTitle(dingTalkReqVo.getTitle()); // msg.getOa().getBody().setContent("待处理:" + "123" + "条"); msg.getOa().getBody().setForm(objects); msg.setMsgtype("oa"); request.setMsg(msg); // log.info("获取发送通知消息体和获取发送通知人完成"); OapiMessageCorpconversationAsyncsendV2Response response = null; try { response = client.execute(request, accessToken); } catch (ApiException e) { e.getErrMsg(); } // log.info("消息任务ID"+response.getTaskId()); System.out.println(response.getTaskId()); result = response.isSuccess(); } return result; } /** * 免登陆接口 * * @param authCode * @return */ public Map 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); ObjectMapper objectMapper = new ObjectMapper(); Map map = objectMapper.readValue(result, Map.class); return map; } catch (Exception e) { log.error(e.getMessage()); new BaseException("登录出异常了,请联系管理员处理"); } return null; } @Override public void deptidList(Long deptID, Integer begin) { try { //根据传过来的部门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()); ObjectMapper objectMapper = new ObjectMapper(); Map map = objectMapper.readValue(rsp.getBody(), Map.class); if (ObjectUtils.isNotEmpty(map)) { List> dingDetpInfoList = (List>) map.get("result"); if (Integer.valueOf(map.get("errcode").toString()) == 0) { for (int i = 0; i < dingDetpInfoList.size(); i++) { Map map1 = dingDetpInfoList.get(i); deptidList(Long.valueOf(map1.get("dept_id").toString()), 2); } } } } catch (Exception e) { log.error(e.getMessage()); new BaseException("登录出异常了,请联系管理员处理"); } } 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, ""); //获取resp里的用户信息集合 ObjectMapper objectMapper = new ObjectMapper(); Map map = objectMapper.readValue(rsp.getBody(), Map.class); Map mapResult = (Map) map.get("result"); List> userInfoMapList = (List>) mapResult.get("list"); if (!CollectionUtils.isEmpty(userInfoMapList)) { //根据手机号,将userID写进对应的字段上 for (Map objectMap : userInfoMapList) { SysUser sysUser = new SysUser(); sysUser.setPhonenumber(objectMap.get("mobile").toString()); sysUser.setDingUserId(objectMap.get("userid").toString()); sysUserMapper.updateUser(sysUser); } } } catch (Exception e) { e.printStackTrace(); } } /** * 获取 access_token */ private String getAccessToken() throws ApiException { DefaultDingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/gettoken"); OapiGettokenRequest request = new OapiGettokenRequest(); //Appkey request.setAppkey(dingAppid); //Appsecret request.setAppsecret(dingAppSecret); /*请求方式*/ request.setHttpMethod("GET"); OapiGettokenResponse response = client.execute(request); return response.getAccessToken(); } }