DingtalkServiceImpl.java
6.73 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
package com.chinagas.modules.schsf.service.impl;
import com.alibaba.fastjson.JSONObject;
import com.chinagas.common.core.domain.AjaxResult;
import com.chinagas.common.core.exceptions.ServiceException;
import com.chinagas.common.core.utils.StringUtils;
import com.chinagas.modules.schsf.constant.DingtalkConstant;
import com.chinagas.modules.schsf.service.DingtalkService;
import com.dingtalk.api.DefaultDingTalkClient;
import com.dingtalk.api.DingTalkClient;
import com.dingtalk.api.request.OapiMessageCorpconversationAsyncsendV2Request;
import com.dingtalk.api.response.OapiMessageCorpconversationAsyncsendV2Response;
import com.dingtalk.oapi.lib.aes.DingTalkJsApiSingnature;
import com.dingtalk.open.client.ServiceFactory;
import com.dingtalk.open.client.api.model.corp.JsapiTicket;
import com.dingtalk.open.client.api.service.corp.CorpConnectionService;
import com.dingtalk.open.client.api.service.corp.JsapiService;
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.ArrayList;
import java.util.List;
@Slf4j
@Service
public class DingtalkServiceImpl implements DingtalkService {
@Autowired
private DingtalkConstant dingtalkConstant;
final int MAX_USERID_LIST_SIZE = 100;
@Override
public String getAccessToken() {
if (StringUtils.isEmpty(dingtalkConstant.getCorpId())
|| StringUtils.isEmpty(dingtalkConstant.getAgentId())
|| StringUtils.isEmpty(dingtalkConstant.getAppKey())
|| StringUtils.isEmpty(dingtalkConstant.getAppSecret())) {
log.warn("钉钉相关信息未配置,请在nacos中进行配置,appKey:{},agentId:{},corpId:{},appSecret:{}", dingtalkConstant.getAppKey(), dingtalkConstant.getAgentId(), dingtalkConstant.getCorpId(), dingtalkConstant.getAppSecret());
throw new ServiceException("钉钉相关信息未配置,请在nacos中进行配置");
}
String accToken = "";
JSONObject jsontemp = new JSONObject();
try {
ServiceFactory serviceFactory = ServiceFactory.getInstance();
CorpConnectionService corpConnectionService = serviceFactory.getOpenService(CorpConnectionService.class);
accToken = corpConnectionService.getCorpToken(dingtalkConstant.getAppKey(), dingtalkConstant.getAppSecret());
} catch (Exception e) {
e.printStackTrace();
}
return accToken;
}
@Override
public String getJsapiTicket(String accessToken) {
String jsTicket = "";
ServiceFactory serviceFactory;
try {
serviceFactory = ServiceFactory.getInstance();
JsapiService jsapiService = serviceFactory.getOpenService(JsapiService.class);
JsapiTicket JsapiTicket = jsapiService.getJsapiTicket(accessToken, "jsapi");
jsTicket = JsapiTicket.getTicket();
} catch (Exception e) {
e.printStackTrace();
}
return jsTicket;
}
@Override
public String getSign(String ticket, String nonceStr, Long timeStamp, String url) {
try {
return DingTalkJsApiSingnature.getJsApiSingnature(url, nonceStr, timeStamp, ticket);
} catch (Exception ex) {
throw new ServiceException(ex.getMessage());
}
}
@Override
public void sendMarketFeeNotification(List<String> userIds, String title, String markdown) {
log.info("钉钉通知,通知标题:{}", title);
log.info("钉钉通知,通知内容:{}", markdown);
log.info("钉钉通知,通知用户id:{},通知用户数量:{}", userIds, userIds.size());
if (userIds==null || userIds.size()==0){
return;
}
if (StringUtils.isEmpty(dingtalkConstant.getCorpId())
|| StringUtils.isEmpty(dingtalkConstant.getAgentId())
|| StringUtils.isEmpty(dingtalkConstant.getAppKey())
|| StringUtils.isEmpty(dingtalkConstant.getAppSecret())) {
log.warn("钉钉通知,钉钉相关信息未配置,请在nacos中进行配置,appKey:{},agentId:{},corpId:{},appSecret:{}", dingtalkConstant.getAppKey(), dingtalkConstant.getAgentId(), dingtalkConstant.getCorpId(), dingtalkConstant.getAppSecret());
return;
}
// 分割用户ID列表为多个不超过100的子列表
List<String> userIdSubList = new ArrayList<>();
List<List<String>> splitUserIds = new ArrayList<>();
for (String userId : userIds) {
userIdSubList.add(userId);
if (userIdSubList.size() == MAX_USERID_LIST_SIZE) {
splitUserIds.add(new ArrayList<>(userIdSubList));
userIdSubList.clear(); // 准备下一个子列表
}
}
// 如果最后的子列表非空,也要加进去
if (!userIdSubList.isEmpty()) {
splitUserIds.add(userIdSubList);
}
log.info("钉钉通知,将用户分组数:{}", splitUserIds.size());
for (List<String> uids : splitUserIds) {
DingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/topapi/message/corpconversation/asyncsend_v2");
OapiMessageCorpconversationAsyncsendV2Request request = new OapiMessageCorpconversationAsyncsendV2Request();
request.setAgentId(Long.valueOf(dingtalkConstant.getAgentId()));
request.setUseridList(String.join(",", uids));
request.setToAllUser(false);
OapiMessageCorpconversationAsyncsendV2Request.Msg msg = new OapiMessageCorpconversationAsyncsendV2Request.Msg();
msg.setActionCard(new OapiMessageCorpconversationAsyncsendV2Request.ActionCard());
msg.getActionCard().setTitle(title);
msg.getActionCard().setMarkdown(markdown);
if (StringUtils.isNotEmpty(dingtalkConstant.getAppUrl())) {
msg.getActionCard().setSingleTitle("点击查看");
msg.getActionCard().setSingleUrl("dingtalk://dingtalkclient/action/openapp?" +
"corpid=" + dingtalkConstant.getCorpId() +
"&container_type=work_platform" +
"&app_id=0_" + dingtalkConstant.getAgentId() +
"&redirect_type=jump" +
"&redirect_url=" + dingtalkConstant.getAppUrl());
msg.setMsgtype("action_card");
}
request.setMsg(msg);
try {
OapiMessageCorpconversationAsyncsendV2Response rsp = client.execute(request, getAccessToken());
log.info("钉钉通知,通知结果:{}", rsp);
} catch (ApiException e) {
throw new RuntimeException(e);
}
}
}
}