package com.smartor.service.impl; import com.alibaba.fastjson2.JSONArray; import com.alibaba.fastjson2.JSONObject; import com.dingtalk.api.DefaultDingTalkClient; import com.dingtalk.api.DingTalkClient; 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.ruoyi.common.core.domain.DingAsyncSendMsgReq; import com.ruoyi.common.core.domain.DingAsyncSendMsgResp; import com.ruoyi.common.core.domain.DingTalkReqVo; import com.ruoyi.common.core.domain.DingTokenResp; import com.ruoyi.common.utils.DingTalkUtils; import com.ruoyi.common.utils.StringUtils; import com.smartor.service.DingTalkService; import com.taobao.api.ApiException; import lombok.extern.log4j.Log4j; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; import java.util.ArrayList; 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("${dingAppAgentId}") private Long dingAppAgentId; @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); // 提取出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(1779052814L); 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()); formSeverityDesc.setValue(entry.getValue()); 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.printStackTrace(); } // log.info("消息任务ID"+response.getTaskId()); System.out.println(response.getTaskId()); result = response.isSuccess(); } return result; } /** * 获取 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(); } /** * 获取post access_token */ private String getAccessTokenPost() throws ApiException { DefaultDingTalkClient client = new DefaultDingTalkClient("https://api.dingtalk.com/v1.0/oauth2/{corpId}/token"); OapiGettokenRequest request = new OapiGettokenRequest(); //Appkey request.setAppkey(dingAppid); //Appsecret request.setAppsecret(dingAppSecret); /*请求方式*/ request.setHttpMethod("Post"); OapiGettokenResponse response = client.execute(request); return response.getAccessToken(); } // /** // * 发送钉钉消息-景宁 // * @param sMessageContent // * @throws Exception // */ // public void sendDingTalkText(String sMessageContent) throws Exception { // String CORP_ID = "你的企业corpid"; // String CORP_SECRET = "企业应用的corpsecret"; // Long AGENT_ID = 4992829038L; // 你的应用agentId // // try { // // 1. 获取access_token // DingTokenResp tokenResp = DingTalkUtils.getAccessToken(CORP_ID, CORP_SECRET); // if (tokenResp.getErrcode() != 0) { // System.err.println("获取token失败:" + tokenResp.getErrmsg()); // return; // } // String accessToken = tokenResp.getAccess_token(); // System.out.println("access_token=" + accessToken); // // // 2. 组装发送请求 // DingAsyncSendMsgReq sendReq = new DingAsyncSendMsgReq(); // sendReq.setAgent_id(AGENT_ID); // sendReq.setUserid_list("user01,user02"); // 接收人钉钉userId,多个逗号 // sendReq.setTo_all_user(false); // // 设置消息内容,这里用文本消息 // sendReq.setMsg(DingTalkUtils.buildTextMsg("你好,这是异步发送钉钉消息测试")); // // // 3. 调用异步发送接口 // DingAsyncSendMsgResp sendResp = DingTalkUtils.asyncSendCorpMsg(accessToken, sendReq); // if (sendResp.getErrcode() == 0) { // System.out.println("提交消息任务成功,task_id=" + sendResp.getTask_id()); // System.out.println("消息实际发送结果,需要在钉钉后台配置回调接收"); // } else { // System.err.println("提交消息任务失败:code=" + sendResp.getErrcode() + ",msg=" + sendResp.getErrmsg()); // } // // } catch (Exception e) { // e.printStackTrace(); // } // } /** * 发送钉钉消息-景宁 * @param sMessageContent * @throws Exception */ @Override public void sendDingTalkText(String sMessageContent, String userId) throws Exception { Long agentId = dingAppAgentId; String accessToken = getAccessToken(); DingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/topapi/message/corpconversation/asyncsend_v2"); OapiMessageCorpconversationAsyncsendV2Request request = new OapiMessageCorpconversationAsyncsendV2Request(); request.setAgentId(agentId); request.setUseridList(userId); request.setToAllUser(false); OapiMessageCorpconversationAsyncsendV2Request.Msg msg = new OapiMessageCorpconversationAsyncsendV2Request.Msg(); msg.setMsgtype("text"); OapiMessageCorpconversationAsyncsendV2Request.Text text = new OapiMessageCorpconversationAsyncsendV2Request.Text(); text.setContent(sMessageContent); msg.setText(text); request.setMsg(msg); OapiMessageCorpconversationAsyncsendV2Response rsp = client.execute(request, accessToken); System.out.println(rsp.getBody()); } /** * 根据电话获取用户 * @param mobile * @return * @throws Exception */ @Override public String getDingTalkUserByMobile(String mobile) throws Exception { String accessToken = getAccessToken(); DingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/topapi/v2/user/getbymobile"); OapiV2UserGetbymobileRequest req = new OapiV2UserGetbymobileRequest(); req.setMobile(mobile); OapiV2UserGetbymobileResponse rsp = client.execute(req, accessToken); return rsp.getBody(); } }