DingtalkServiceImpl.java
5.41 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
package com.chinagas.modules.schsf.service.impl;
import com.alibaba.fastjson.JSONObject;
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() {
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());
// 分割用户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);
}
}
}
}