1.oa规范类型命名. 2.企业微信新增news消息类型

This commit is contained in:
东风 2024-03-25 11:59:29 +08:00
parent b1a18b6972
commit a120bc9370
17 changed files with 107 additions and 54 deletions

View File

@ -13,14 +13,14 @@ public class OaContent {
/** /**
* 钉钉 * 钉钉
*/ */
public static final String DINGTALK = "dingding"; public static final String DING_TALK = "ding_ding";
/** /**
* 飞书 * 飞书
*/ */
public static final String BYTETALK = "feishu"; public static final String BYTE_TALK = "byte_talk";
/** /**
* 微信 * 微信
*/ */
public static final String WETALK = "wetalk"; public static final String WE_TALK = "we_talk";
} }

View File

@ -20,6 +20,9 @@ public class Request implements Comparable<Request> {
// link类型的参数 // link类型的参数
private String messageUrl; private String messageUrl;
// news类型的参数
private List<WeTalkRequestArticle> articleList;
private List<String> phoneList; private List<String> phoneList;
// 用于@,唯一标识:userId/openId // 用于@,唯一标识:userId/openId

View File

@ -0,0 +1,27 @@
package org.dromara.oa.comm.entity;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* 图文消息一个图文消息支持1到8条图文
* @author dongfeng
* 2024-03-23 19:25
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
public class WeTalkRequestArticle {
// 标题不超过128个字节超过会自动截断
private String title;
// 描述不超过512个字节超过会自动截断
private String description;
// 点击后跳转的链接
private String url;
// 图文消息的图片链接支持JPGPNG格式较好的效果为大图 1068*455小图150*150
private String picUrl;
}

View File

@ -5,27 +5,27 @@ import lombok.Getter;
@Getter @Getter
public enum MessageType { public enum MessageType {
// 钉钉支持类型 // 钉钉支持类型
DINGTALK_TEXT("text"), DING_TALK_TEXT("text"),
DINGTALK_MARKDOWN("markdown"), DING_TALK_MARKDOWN("markdown"),
DING_TALK_LINK("link"),
DINGTALK_LINK("link"),
// 飞书支持类型 // 飞书支持类型
BYTE_TALK_TEXT("text"),
BYTETALK_TEXT("text"), // BYTE_TALK_MARKDOWN("markdown"),
// BYTETALK_MARKDOWN("markdown"), // BYTE_TALK_LINK("link"),
// BYTETALK_LINK("link"),
// 企业微信支持类型 // 企业微信支持类型
WETETALK_TEXT("text"), WE_TALK_TEXT("text"),
WETETALK_MARKDOWN("markdown"); WE_TALK_MARKDOWN("markdown"),
WE_TALK_NEWS("news");
//暂未支持 //暂未支持
// WETETALK_IMAGE("image"), // WE_TALK_IMAGE("image"),
// WETETALK_NEWS("news"), // WE_TALK_FILE("file"),
// WETETALK_FILE("file"), // WE_TALK_VOICE("voice"),
// WETETALK_VOICE("voice"), // WE_TALK_TEMPLATE_CARD("template_card");
// WETETALK_TEMPLATE_CARD("template_card");
MessageType(String name) { MessageType(String name) {
this.name = name; this.name = name;

View File

@ -6,15 +6,15 @@ public enum OaType {
/** /**
* 钉钉 * 钉钉
*/ */
DINGTALK("dingding", "https://oapi.dingtalk.com/robot/send?access_token=", true), DING_TALK("ding_ding", "https://oapi.dingtalk.com/robot/send?access_token=", true),
/** /**
* 微信 * 微信
*/ */
WETALK("wetalk", "https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=", true), WE_TALK("we_talk", "https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=", true),
/** /**
* 飞书 * 飞书
*/ */
BYTETALK("feishu", "https://open.feishu.cn/open-apis/bot/v2/hook/", true), BYTE_TALK("byte_talk", "https://open.feishu.cn/open-apis/bot/v2/hook/", true),
; ;
@Getter @Getter

View File

@ -9,10 +9,10 @@ import org.dromara.oa.core.provider.config.OaBaseConfig;
@EqualsAndHashCode(callSuper = true) @EqualsAndHashCode(callSuper = true)
public class ByteTalkConfig extends OaBaseConfig { public class ByteTalkConfig extends OaBaseConfig {
private final String requestUrl = OaType.BYTETALK.getUrl(); private final String requestUrl = OaType.BYTE_TALK.getUrl();
@Override @Override
public String getSupplier() { public String getSupplier() {
return OaType.BYTETALK.getType(); return OaType.BYTE_TALK.getType();
} }
} }

View File

@ -25,7 +25,7 @@ public class ByteTalkFactory extends OaAbstractProviderFactory<ByteTalkOaImpl, B
@Override @Override
public String getSupplier() { public String getSupplier() {
return OaContent.BYTETALK; return OaContent.BYTE_TALK;
} }
/** /**

View File

@ -16,7 +16,7 @@ import java.util.HashMap;
import java.util.Map; import java.util.Map;
import java.util.Objects; import java.util.Objects;
import static org.dromara.oa.comm.enums.OaType.BYTETALK; import static org.dromara.oa.comm.enums.OaType.BYTE_TALK;
/** /**
* @author dongfeng * @author dongfeng
@ -33,7 +33,7 @@ public class ByteTalkOaImpl extends AbstractOaBlend<ByteTalkConfig> {
@Override @Override
public String getSupplier() { public String getSupplier() {
return OaType.BYTETALK.getType(); return OaType.BYTE_TALK.getType();
} }
@Override @Override
@ -45,7 +45,7 @@ public class ByteTalkOaImpl extends AbstractOaBlend<ByteTalkConfig> {
StringBuilder webhook = new StringBuilder(); StringBuilder webhook = new StringBuilder();
JSONObject message = null; JSONObject message = null;
ByteTalkConfig config = getConfig(); ByteTalkConfig config = getConfig();
webhook.append(BYTETALK.getUrl()); webhook.append(BYTE_TALK.getUrl());
webhook.append(config.getTokenId()); webhook.append(config.getTokenId());
long now = System.currentTimeMillis() / 1000; long now = System.currentTimeMillis() / 1000;
String sign = ByteTalkBuilder.byteTalkSign(config.getSign(), now); String sign = ByteTalkBuilder.byteTalkSign(config.getSign(), now);

View File

@ -12,7 +12,7 @@ import java.nio.charset.StandardCharsets;
import java.util.List; import java.util.List;
import java.util.Objects; import java.util.Objects;
import static org.dromara.oa.comm.enums.MessageType.BYTETALK_TEXT; import static org.dromara.oa.comm.enums.MessageType.BYTE_TALK_TEXT;
/** /**
* 飞书通知签名和信息构建 * 飞书通知签名和信息构建
@ -35,7 +35,7 @@ public class ByteTalkBuilder {
public static JSONObject createByteTalkMessage(Request request, MessageType messageType, String sign, Long timestamp) { public static JSONObject createByteTalkMessage(Request request, MessageType messageType, String sign, Long timestamp) {
JSONObject message = new JSONObject(); JSONObject message = new JSONObject();
List<String> userIdList = request.getUserIdList(); List<String> userIdList = request.getUserIdList();
if (messageType == BYTETALK_TEXT) { if (messageType == BYTE_TALK_TEXT) {
message.set("msg_type", "text"); message.set("msg_type", "text");
message.set("timestamp", timestamp); message.set("timestamp", timestamp);
message.set("sign", sign); message.set("sign", sign);

View File

@ -13,10 +13,10 @@ import org.dromara.oa.core.provider.config.OaBaseConfig;
@Data @Data
@EqualsAndHashCode(callSuper = true) @EqualsAndHashCode(callSuper = true)
public class DingTalkConfig extends OaBaseConfig { public class DingTalkConfig extends OaBaseConfig {
private final String requestUrl = OaType.DINGTALK.getUrl(); private final String requestUrl = OaType.DING_TALK.getUrl();
@Override @Override
public String getSupplier() { public String getSupplier() {
return OaType.DINGTALK.getType(); return OaType.DING_TALK.getType();
} }
} }

View File

@ -27,7 +27,7 @@ public class DingTalkFactory extends OaAbstractProviderFactory<DingTalkOaImpl, D
@Override @Override
public String getSupplier() { public String getSupplier() {
return OaContent.DINGTALK; return OaContent.DING_TALK;
} }
/** /**

View File

@ -16,7 +16,7 @@ import java.util.Map;
import java.util.Objects; import java.util.Objects;
import java.util.concurrent.Executor; import java.util.concurrent.Executor;
import static org.dromara.oa.comm.enums.OaType.DINGTALK; import static org.dromara.oa.comm.enums.OaType.DING_TALK;
/** /**
* @author dongfeng * @author dongfeng
@ -54,7 +54,7 @@ public class DingTalkOaImpl extends AbstractOaBlend<DingTalkConfig> {
StringBuilder webhook = new StringBuilder(); StringBuilder webhook = new StringBuilder();
JSONObject message = null; JSONObject message = null;
DingTalkConfig config = getConfig(); DingTalkConfig config = getConfig();
webhook.append(DINGTALK.getUrl()); webhook.append(DING_TALK.getUrl());
webhook.append(config.getTokenId()); webhook.append(config.getTokenId());
String sign = config.getSign(); String sign = config.getSign();
if (!Objects.isNull(sign)) { if (!Objects.isNull(sign)) {

View File

@ -15,9 +15,9 @@ import java.nio.charset.StandardCharsets;
import java.util.List; import java.util.List;
import java.util.Objects; import java.util.Objects;
import static org.dromara.oa.comm.enums.MessageType.DINGTALK_LINK; import static org.dromara.oa.comm.enums.MessageType.DING_TALK_LINK;
import static org.dromara.oa.comm.enums.MessageType.DINGTALK_MARKDOWN; import static org.dromara.oa.comm.enums.MessageType.DING_TALK_MARKDOWN;
import static org.dromara.oa.comm.enums.MessageType.DINGTALK_TEXT; import static org.dromara.oa.comm.enums.MessageType.DING_TALK_TEXT;
/** /**
* 钉钉通知签名和信息构建 * 钉钉通知签名和信息构建
@ -46,18 +46,18 @@ public class DingTalkBuilder {
JSONObject message = new JSONObject(); JSONObject message = new JSONObject();
if (messageType == DINGTALK_TEXT) { if (messageType == DING_TALK_TEXT) {
message.set("msgtype", "text"); message.set("msgtype", "text");
JSONObject text = new JSONObject(); JSONObject text = new JSONObject();
text.set("content", request.getContent()); text.set("content", request.getContent());
message.set("text", text); message.set("text", text);
} else if (messageType == DINGTALK_MARKDOWN) { } else if (messageType == DING_TALK_MARKDOWN) {
message.set("msgtype", "markdown"); message.set("msgtype", "markdown");
JSONObject markdown = new JSONObject(); JSONObject markdown = new JSONObject();
markdown.set("text", request.getContent()); markdown.set("text", request.getContent());
markdown.set("title", request.getTitle()); markdown.set("title", request.getTitle());
message.set("markdown", markdown); message.set("markdown", markdown);
} else if (messageType == DINGTALK_LINK) { } else if (messageType == DING_TALK_LINK) {
message.set("msgtype", "link"); message.set("msgtype", "link");
JSONObject link = new JSONObject(); JSONObject link = new JSONObject();
link.set("text", request.getContent()); link.set("text", request.getContent());

View File

@ -9,10 +9,10 @@ import org.dromara.oa.core.provider.config.OaBaseConfig;
@EqualsAndHashCode(callSuper = true) @EqualsAndHashCode(callSuper = true)
public class WeTalkConfig extends OaBaseConfig { public class WeTalkConfig extends OaBaseConfig {
private final String requestUrl = OaType.WETALK.getUrl(); private final String requestUrl = OaType.WE_TALK.getUrl();
@Override @Override
public String getSupplier() { public String getSupplier() {
return OaType.WETALK.getType(); return OaType.WE_TALK.getType();
} }
} }

View File

@ -25,7 +25,7 @@ public class WeTalkFactory extends OaAbstractProviderFactory<WeTalkOaImpl, WeTal
@Override @Override
public String getSupplier() { public String getSupplier() {
return OaContent.WETALK; return OaContent.WE_TALK;
} }
/** /**

View File

@ -14,9 +14,8 @@ import org.dromara.oa.core.weTalk.utils.WeTalkBuilder;
import java.util.HashMap; import java.util.HashMap;
import java.util.Map; import java.util.Map;
import java.util.Objects;
import static org.dromara.oa.comm.enums.OaType.WETALK; import static org.dromara.oa.comm.enums.OaType.WE_TALK;
/** /**
* @author dongfeng * @author dongfeng
@ -33,19 +32,17 @@ public class WeTalkOaImpl extends AbstractOaBlend<WeTalkConfig> {
@Override @Override
public String getSupplier() { public String getSupplier() {
return OaType.WETALK.getType(); return OaType.WE_TALK.getType();
} }
@Override @Override
public Response sender(Request request, MessageType messageType) { public Response sender(Request request, MessageType messageType) {
if (Objects.isNull(request.getContent())) {
throw new OaException("消息体content不能为空");
}
StringBuilder webhook = new StringBuilder(); StringBuilder webhook = new StringBuilder();
JSONObject message = null; JSONObject message = null;
WeTalkConfig config = getConfig(); WeTalkConfig config = getConfig();
webhook.append(WETALK.getUrl()); webhook.append(WE_TALK.getUrl());
webhook.append(config.getTokenId()); webhook.append(config.getTokenId());
message = WeTalkBuilder.createWeTalkMessage(request, messageType); message = WeTalkBuilder.createWeTalkMessage(request, messageType);
String post; String post;

View File

@ -5,13 +5,16 @@ import cn.hutool.json.JSONArray;
import cn.hutool.json.JSONObject; import cn.hutool.json.JSONObject;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.dromara.oa.comm.entity.Request; import org.dromara.oa.comm.entity.Request;
import org.dromara.oa.comm.entity.WeTalkRequestArticle;
import org.dromara.oa.comm.enums.MessageType; import org.dromara.oa.comm.enums.MessageType;
import org.dromara.oa.comm.errors.OaException;
import java.util.List; import java.util.List;
import java.util.Objects; import java.util.Objects;
import static org.dromara.oa.comm.enums.MessageType.WETETALK_MARKDOWN; import static org.dromara.oa.comm.enums.MessageType.WE_TALK_MARKDOWN;
import static org.dromara.oa.comm.enums.MessageType.WETETALK_TEXT; import static org.dromara.oa.comm.enums.MessageType.WE_TALK_NEWS;
import static org.dromara.oa.comm.enums.MessageType.WE_TALK_TEXT;
/** /**
@ -30,7 +33,10 @@ public class WeTalkBuilder {
List<String> phoneList = request.getPhoneList(); List<String> phoneList = request.getPhoneList();
StringBuilder content = new StringBuilder(); StringBuilder content = new StringBuilder();
Boolean isNoticeAll = request.getIsNoticeAll(); Boolean isNoticeAll = request.getIsNoticeAll();
if (messageType == WETETALK_TEXT) { if (messageType == WE_TALK_TEXT) {
if (Objects.isNull(request.getContent())) {
throw new OaException("消息体content不能为空");
}
message.set("msgtype", "text"); message.set("msgtype", "text");
JSONObject text = new JSONObject(); JSONObject text = new JSONObject();
text.set("content", request.getContent()); text.set("content", request.getContent());
@ -58,7 +64,10 @@ public class WeTalkBuilder {
text.set("mentioned_mobile_list",phoneArray); text.set("mentioned_mobile_list",phoneArray);
} }
message.set("text", text); message.set("text", text);
} else if (messageType == WETETALK_MARKDOWN) { } else if (messageType == WE_TALK_MARKDOWN) {
if (Objects.isNull(request.getContent())) {
throw new OaException("消息体content不能为空");
}
message.set("msgtype", "markdown"); message.set("msgtype", "markdown");
if(!Objects.isNull(userIdList)){ if(!Objects.isNull(userIdList)){
userIdList.forEach(l -> content.append("<@").append(l).append(">")); userIdList.forEach(l -> content.append("<@").append(l).append(">"));
@ -69,8 +78,25 @@ public class WeTalkBuilder {
markdown.set("content", content ); markdown.set("content", content );
markdown.set("title", request.getTitle()); markdown.set("title", request.getTitle());
message.set("markdown", markdown); message.set("markdown", markdown);
} else if (messageType == WE_TALK_NEWS) {
message.set("msgtype", "news");
JSONObject news = new JSONObject();
JSONArray articles = new JSONArray();
List<WeTalkRequestArticle> articleList = request.getArticleList();
if(!articleList.isEmpty()){
articleList.forEach(article -> {
JSONObject articleJson = new JSONObject();
articleJson.set("title", article.getTitle());
articleJson.set("description", article.getDescription());
articleJson.set("url", article.getUrl());
articleJson.set("picurl", article.getPicUrl());
articles.add(articleJson);
});
}
news.set("articles", articles );
message.set("news", news);
} else { } else {
log.error("输入的消息格式不对,message:"+messageType+"应该使用WETETALK前缀的消息类型"); log.error("输入的消息格式不对,message:"+messageType+"应该使用WE_TALK前缀的消息类型");
} }
return message; return message;
} }