From 2d65ffe0e1ba9ffb0e2b8770fe0fab4062fe6eba Mon Sep 17 00:00:00 2001 From: zhangyang Date: Wed, 18 Oct 2023 22:44:56 +0800 Subject: [PATCH 1/5] =?UTF-8?q?sms4j-oa-plugin=E6=94=AF=E6=8C=81=E9=92=89?= =?UTF-8?q?=E9=92=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 1 + sms4j-oa-plugin/pom.xml | 78 ++++++++++++ sms4j-oa-plugin/sms4j-oa-api/pom.xml | 29 +++++ .../java/org/dromara/oa/api/OaSender.java | 9 ++ .../java/org/dromara/oa/api/OaSender.java | 10 ++ sms4j-oa-plugin/sms4j-oa-comm/pom.xml | 32 +++++ .../org/dromara/oa/comm/config/OaConfig.java | 20 +++ .../org/dromara/oa/comm/entity/Request.java | 21 +++ .../org/dromara/oa/comm/entity/Response.java | 19 +++ .../dromara/oa/comm/entity/SignTimesTamp.java | 15 +++ .../dromara/oa/comm/enums/MessageType.java | 21 +++ .../org/dromara/oa/comm/enums/OaType.java | 25 ++++ .../dromara/oa/comm/errors/OaException.java | 12 ++ sms4j-oa-plugin/sms4j-oa-core/pom.xml | 54 ++++++++ .../dromara/oa/core/factory/OaFactory.java | 38 ++++++ .../org/dromara/oa/core/service/OaBuild.java | 22 ++++ .../dromara/oa/core/service/SenderImpl.java | 120 ++++++++++++++++++ .../oa/core/support/AbstractHttpClient.java | 26 ++++ .../oa/core/support/HttpClientImpl.java | 20 +++ .../oa/core/support/MsgHttpClient.java | 17 +++ sms4j-spring-boot-example/pom.xml | 5 + .../org/dromara/sms4j/example/SmsOaTest.java | 56 ++++++++ 22 files changed, 650 insertions(+) create mode 100644 sms4j-oa-plugin/pom.xml create mode 100644 sms4j-oa-plugin/sms4j-oa-api/pom.xml create mode 100644 sms4j-oa-plugin/sms4j-oa-api/src/main/java/org/dromara/oa/api/OaSender.java create mode 100644 sms4j-oa-plugin/sms4j-oa-api/src/test/java/org/dromara/oa/api/OaSender.java create mode 100644 sms4j-oa-plugin/sms4j-oa-comm/pom.xml create mode 100644 sms4j-oa-plugin/sms4j-oa-comm/src/main/java/org/dromara/oa/comm/config/OaConfig.java create mode 100644 sms4j-oa-plugin/sms4j-oa-comm/src/main/java/org/dromara/oa/comm/entity/Request.java create mode 100644 sms4j-oa-plugin/sms4j-oa-comm/src/main/java/org/dromara/oa/comm/entity/Response.java create mode 100644 sms4j-oa-plugin/sms4j-oa-comm/src/main/java/org/dromara/oa/comm/entity/SignTimesTamp.java create mode 100644 sms4j-oa-plugin/sms4j-oa-comm/src/main/java/org/dromara/oa/comm/enums/MessageType.java create mode 100644 sms4j-oa-plugin/sms4j-oa-comm/src/main/java/org/dromara/oa/comm/enums/OaType.java create mode 100644 sms4j-oa-plugin/sms4j-oa-comm/src/main/java/org/dromara/oa/comm/errors/OaException.java create mode 100644 sms4j-oa-plugin/sms4j-oa-core/pom.xml create mode 100644 sms4j-oa-plugin/sms4j-oa-core/src/main/java/org/dromara/oa/core/factory/OaFactory.java create mode 100644 sms4j-oa-plugin/sms4j-oa-core/src/main/java/org/dromara/oa/core/service/OaBuild.java create mode 100644 sms4j-oa-plugin/sms4j-oa-core/src/main/java/org/dromara/oa/core/service/SenderImpl.java create mode 100644 sms4j-oa-plugin/sms4j-oa-core/src/main/java/org/dromara/oa/core/support/AbstractHttpClient.java create mode 100644 sms4j-oa-plugin/sms4j-oa-core/src/main/java/org/dromara/oa/core/support/HttpClientImpl.java create mode 100644 sms4j-oa-plugin/sms4j-oa-core/src/main/java/org/dromara/oa/core/support/MsgHttpClient.java create mode 100644 sms4j-spring-boot-example/src/test/java/org/dromara/sms4j/example/SmsOaTest.java diff --git a/pom.xml b/pom.xml index c870b0c8..ef22415f 100644 --- a/pom.xml +++ b/pom.xml @@ -21,6 +21,7 @@ sms4j-spring-boot-example sms4j-javase-plugin sms4j-Email-plugin + sms4j-oa-plugin diff --git a/sms4j-oa-plugin/pom.xml b/sms4j-oa-plugin/pom.xml new file mode 100644 index 00000000..2a25be5c --- /dev/null +++ b/sms4j-oa-plugin/pom.xml @@ -0,0 +1,78 @@ + + + 4.0.0 + + org.dromara.sms4j + sms4j + ${revision} + ../pom.xml + + + pom + sms4j-oa-plugin + + + sms4j-oa-comm + sms4j-oa-api + sms4j-oa-core + + + sms4j-oa-plugin + sms4j-oa-plugin + + + + + + + + + + org.dromara.sms4j + sms4j-oa-api + ${revision} + + + + org.dromara.sms4j + sms4j-oa-comm + ${revision} + + + + org.dromara.sms4j + sms4j-oa-core + ${revision} + + + + + com.sun.activation + javax.activation + ${sunactivation.version} + + + + jakarta.activation + jakarta.activation-api + ${jakarta.activation.version} + + + cn.hutool + hutool-cron + ${hutool.version} + + + + + + + + + + + + + + diff --git a/sms4j-oa-plugin/sms4j-oa-api/pom.xml b/sms4j-oa-plugin/sms4j-oa-api/pom.xml new file mode 100644 index 00000000..690793c0 --- /dev/null +++ b/sms4j-oa-plugin/sms4j-oa-api/pom.xml @@ -0,0 +1,29 @@ + + + 4.0.0 + + + org.dromara.sms4j + sms4j-oa-plugin + ${revision} + ../pom.xml + + + sms4j-oa-api + + sms4j-oa-api + sms4j-oa-api + + + + + + + + + org.dromara.sms4j + sms4j-oa-comm + + + diff --git a/sms4j-oa-plugin/sms4j-oa-api/src/main/java/org/dromara/oa/api/OaSender.java b/sms4j-oa-plugin/sms4j-oa-api/src/main/java/org/dromara/oa/api/OaSender.java new file mode 100644 index 00000000..08e4b1b3 --- /dev/null +++ b/sms4j-oa-plugin/sms4j-oa-api/src/main/java/org/dromara/oa/api/OaSender.java @@ -0,0 +1,9 @@ +package org.dromara.oa.api; + +import org.dromara.oa.comm.entity.Request; +import org.dromara.oa.comm.entity.Response; +import org.dromara.oa.comm.enums.MessageType; + +public interface OaSender { + Response sender(Request request, MessageType messageType); +} diff --git a/sms4j-oa-plugin/sms4j-oa-api/src/test/java/org/dromara/oa/api/OaSender.java b/sms4j-oa-plugin/sms4j-oa-api/src/test/java/org/dromara/oa/api/OaSender.java new file mode 100644 index 00000000..b745dfd3 --- /dev/null +++ b/sms4j-oa-plugin/sms4j-oa-api/src/test/java/org/dromara/oa/api/OaSender.java @@ -0,0 +1,10 @@ +package org.dromara.oa.api; + +import org.dromara.oa.comm.entity.Request; +import org.dromara.oa.comm.entity.Response; +import org.dromara.oa.comm.enums.MessageType; + +public interface OaSender { + + Response Sender(Request request, MessageType messageType); +} diff --git a/sms4j-oa-plugin/sms4j-oa-comm/pom.xml b/sms4j-oa-plugin/sms4j-oa-comm/pom.xml new file mode 100644 index 00000000..cec4cbbf --- /dev/null +++ b/sms4j-oa-plugin/sms4j-oa-comm/pom.xml @@ -0,0 +1,32 @@ + + + 4.0.0 + + org.dromara.sms4j + sms4j-oa-plugin + ${revision} + ../pom.xml + + + sms4j-oa-comm + sms4j-oa-comm + sms4j-oa-comm + + + + + + + + cn.hutool + hutool-cron + + + + cn.hutool + hutool-http + + + + diff --git a/sms4j-oa-plugin/sms4j-oa-comm/src/main/java/org/dromara/oa/comm/config/OaConfig.java b/sms4j-oa-plugin/sms4j-oa-comm/src/main/java/org/dromara/oa/comm/config/OaConfig.java new file mode 100644 index 00000000..663d64fc --- /dev/null +++ b/sms4j-oa-plugin/sms4j-oa-comm/src/main/java/org/dromara/oa/comm/config/OaConfig.java @@ -0,0 +1,20 @@ +package org.dromara.oa.comm.config; + +import lombok.Builder; +import lombok.EqualsAndHashCode; +import lombok.Getter; +import lombok.ToString; + +@Builder +@ToString +@Getter +@EqualsAndHashCode +public class OaConfig { + + private String OaType; + + private String tokenId; + + private String sign; +} + diff --git a/sms4j-oa-plugin/sms4j-oa-comm/src/main/java/org/dromara/oa/comm/entity/Request.java b/sms4j-oa-plugin/sms4j-oa-comm/src/main/java/org/dromara/oa/comm/entity/Request.java new file mode 100644 index 00000000..8964ea34 --- /dev/null +++ b/sms4j-oa-plugin/sms4j-oa-comm/src/main/java/org/dromara/oa/comm/entity/Request.java @@ -0,0 +1,21 @@ +package org.dromara.oa.comm.entity; + + +import lombok.Data; + +import java.util.List; + +@Data +public class Request { + // 标题 + private String title; + + // 消息内容 + private String content; + + private List phones; + + // oa类型 + private String oaType; + +} diff --git a/sms4j-oa-plugin/sms4j-oa-comm/src/main/java/org/dromara/oa/comm/entity/Response.java b/sms4j-oa-plugin/sms4j-oa-comm/src/main/java/org/dromara/oa/comm/entity/Response.java new file mode 100644 index 00000000..15b038f6 --- /dev/null +++ b/sms4j-oa-plugin/sms4j-oa-comm/src/main/java/org/dromara/oa/comm/entity/Response.java @@ -0,0 +1,19 @@ +package org.dromara.oa.comm.entity; + +import lombok.Data; + +@Data +public class Response { + /** + * 响应码 + */ + private String code; + /** + * 响应消息 + */ + private String message; + /** + * 响应数据 + */ + private String data; +} diff --git a/sms4j-oa-plugin/sms4j-oa-comm/src/main/java/org/dromara/oa/comm/entity/SignTimesTamp.java b/sms4j-oa-plugin/sms4j-oa-comm/src/main/java/org/dromara/oa/comm/entity/SignTimesTamp.java new file mode 100644 index 00000000..f8806bc6 --- /dev/null +++ b/sms4j-oa-plugin/sms4j-oa-comm/src/main/java/org/dromara/oa/comm/entity/SignTimesTamp.java @@ -0,0 +1,15 @@ +package org.dromara.oa.comm.entity; + +import lombok.Data; + +@Data +public class SignTimesTamp { + String sign; + + Long timestamp; + + public SignTimesTamp(String newSign, Long timestamp) { + this.sign = newSign; + this.timestamp = timestamp; + } +} diff --git a/sms4j-oa-plugin/sms4j-oa-comm/src/main/java/org/dromara/oa/comm/enums/MessageType.java b/sms4j-oa-plugin/sms4j-oa-comm/src/main/java/org/dromara/oa/comm/enums/MessageType.java new file mode 100644 index 00000000..fd106a01 --- /dev/null +++ b/sms4j-oa-plugin/sms4j-oa-comm/src/main/java/org/dromara/oa/comm/enums/MessageType.java @@ -0,0 +1,21 @@ +package org.dromara.oa.comm.enums; + +public enum MessageType { + // text 类型 + TEXT("text"), + + // md 格式 + MARKDOWN("markdown"), + + // link 格式 + LINK("link"); + + MessageType(String name) { + this.name = name; + } + private final String name; + + public String getName() { + return name; + } +} diff --git a/sms4j-oa-plugin/sms4j-oa-comm/src/main/java/org/dromara/oa/comm/enums/OaType.java b/sms4j-oa-plugin/sms4j-oa-comm/src/main/java/org/dromara/oa/comm/enums/OaType.java new file mode 100644 index 00000000..2b807eb1 --- /dev/null +++ b/sms4j-oa-plugin/sms4j-oa-comm/src/main/java/org/dromara/oa/comm/enums/OaType.java @@ -0,0 +1,25 @@ +package org.dromara.oa.comm.enums; + +public enum OaType { + DINGTALK("dingding", "https://oapi.dingtalk.com/robot/send?access_token=", true), + WETALK("wetalk", "https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=", true), + BYTETALK("feishu", "https://open.feishu.cn/open-apis/bot/v2/hook/", true), + ; + + private String type; + private String robotUrl; + + + OaType(String type, String robotUrl, boolean enabled) { + this.type = type; + this.robotUrl = robotUrl; + } + + public String getType() { + return type; + } + + public String getUrl() { + return robotUrl; + } +} diff --git a/sms4j-oa-plugin/sms4j-oa-comm/src/main/java/org/dromara/oa/comm/errors/OaException.java b/sms4j-oa-plugin/sms4j-oa-comm/src/main/java/org/dromara/oa/comm/errors/OaException.java new file mode 100644 index 00000000..5ec375a8 --- /dev/null +++ b/sms4j-oa-plugin/sms4j-oa-comm/src/main/java/org/dromara/oa/comm/errors/OaException.java @@ -0,0 +1,12 @@ +package org.dromara.oa.comm.errors; + +public class OaException extends RuntimeException{ + + public OaException() { + super(); + } + + public OaException(String message) { + super(message); + } +} diff --git a/sms4j-oa-plugin/sms4j-oa-core/pom.xml b/sms4j-oa-plugin/sms4j-oa-core/pom.xml new file mode 100644 index 00000000..a694dc26 --- /dev/null +++ b/sms4j-oa-plugin/sms4j-oa-core/pom.xml @@ -0,0 +1,54 @@ + + + 4.0.0 + + org.dromara.sms4j + sms4j-oa-plugin + ${revision} + ../pom.xml + + + sms4j-oa-core + sms4j-oa-core + sms4j-oa-core + + + + + + + + org.dromara.sms4j + sms4j-oa-api + + + + com.sun.activation + javax.activation + + + + jakarta.activation + jakarta.activation-api + + + com.sun.mail + javax.mail + + + cn.hutool + hutool-json + 5.8.18 + compile + + + + + + + + + + + diff --git a/sms4j-oa-plugin/sms4j-oa-core/src/main/java/org/dromara/oa/core/factory/OaFactory.java b/sms4j-oa-plugin/sms4j-oa-core/src/main/java/org/dromara/oa/core/factory/OaFactory.java new file mode 100644 index 00000000..a4415d37 --- /dev/null +++ b/sms4j-oa-plugin/sms4j-oa-core/src/main/java/org/dromara/oa/core/factory/OaFactory.java @@ -0,0 +1,38 @@ +package org.dromara.oa.core.factory; + +import org.dromara.oa.comm.config.OaConfig; +import org.dromara.oa.comm.errors.OaException; +import org.dromara.oa.core.service.OaBuild; +import org.dromara.oa.core.service.SenderImpl; + +import java.util.HashMap; +import java.util.Map; + +public class OaFactory { + private static final Map configs = new HashMap<>(); + + /** + * createMailClient + *

从工厂获取一个OA发送实例 + * @param key 配置的标识key + */ + public static SenderImpl createSender(Object key) { + try { + return OaBuild.build(configs.get(key)); + } catch (Exception e) { + throw new OaException(e.getMessage()); + } + } + + + /** + * set + *

将一个配置对象交给工厂 + * @param key 标识 + * @param config 配置对象 + */ + public static void put(Object key, OaConfig config){ + configs.put(key, config); + } + +} diff --git a/sms4j-oa-plugin/sms4j-oa-core/src/main/java/org/dromara/oa/core/service/OaBuild.java b/sms4j-oa-plugin/sms4j-oa-core/src/main/java/org/dromara/oa/core/service/OaBuild.java new file mode 100644 index 00000000..d7f00ee0 --- /dev/null +++ b/sms4j-oa-plugin/sms4j-oa-core/src/main/java/org/dromara/oa/core/service/OaBuild.java @@ -0,0 +1,22 @@ +package org.dromara.oa.core.service; + + +import lombok.Data; +import org.dromara.oa.comm.config.OaConfig; + +@Data +public class OaBuild { + + private String OaType; + + private OaConfig config; + + public OaBuild(OaConfig config) { + this.config = config; + this.OaType = getOaType(); + } + + public static SenderImpl build(OaConfig config) { + return SenderImpl.NewSender(new OaBuild(config)); + } +} diff --git a/sms4j-oa-plugin/sms4j-oa-core/src/main/java/org/dromara/oa/core/service/SenderImpl.java b/sms4j-oa-plugin/sms4j-oa-core/src/main/java/org/dromara/oa/core/service/SenderImpl.java new file mode 100644 index 00000000..d432b0d5 --- /dev/null +++ b/sms4j-oa-plugin/sms4j-oa-core/src/main/java/org/dromara/oa/core/service/SenderImpl.java @@ -0,0 +1,120 @@ +package org.dromara.oa.core.service; + +import org.dromara.oa.api.OaSender; +import org.dromara.oa.comm.entity.Request; +import org.dromara.oa.comm.entity.Response; +import org.dromara.oa.comm.enums.MessageType; +import org.dromara.oa.comm.errors.OaException; +import org.dromara.oa.core.support.HttpClientImpl; + +import java.io.UnsupportedEncodingException; +import java.net.URLEncoder; +import java.nio.charset.StandardCharsets; +import java.security.InvalidKeyException; +import java.security.NoSuchAlgorithmException; +import java.util.Base64; +import java.util.HashMap; +import java.util.Map; +import java.util.logging.Logger; +import cn.hutool.json.JSONObject; + +import javax.crypto.Mac; +import javax.crypto.spec.SecretKeySpec; + +import static org.dromara.oa.comm.enums.MessageType.*; +import static org.dromara.oa.comm.enums.OaType.DINGTALK; + +public class SenderImpl implements OaSender { + + private static Logger logger = Logger.getLogger("oaLog"); + + private OaBuild oaBuild; + + private HttpClientImpl httpClient = new HttpClientImpl(); + + public SenderImpl() { + } + public SenderImpl(OaBuild oaBuild) { + this.oaBuild = oaBuild; + } + + public static SenderImpl NewSender(OaBuild oaBuild){ + return new SenderImpl(oaBuild); + } + + @Override + public Response sender(Request request, MessageType messageType) { + StringBuilder webhook = new StringBuilder(); + webhook.append(DINGTALK.getUrl()); + webhook.append(oaBuild.getConfig().getTokenId()); + if (request.getOaType().equals(DINGTALK.getType())) { + // todo 等待完善钉钉和飞书的sign + webhook.append(sign(oaBuild.getConfig().getSign())); + } + JSONObject message = createMessage(request, messageType); + try { + String post = httpClient.post(webhook, getHeaders(), message); + logger.info("请求返回结果:" + post); + } catch (Exception e) { + logger.warning("请求失败问题:" + e.getMessage()); + throw new OaException(e.getMessage()); + } + return new Response(); + } + + public static Map getHeaders() { + Map headers = new HashMap<>(); + headers.put("Content-Type", "application/json"); + return headers; + } + public static String sign(String secret) { + Long timestamp = System.currentTimeMillis(); + + String stringToSign = timestamp + "\n" + secret; + Mac mac = null; + try { + mac = Mac.getInstance("HmacSHA256"); + mac.init(new SecretKeySpec(secret.getBytes(StandardCharsets.UTF_8), "HmacSHA256")); + } catch (NoSuchAlgorithmException | InvalidKeyException e) { + throw new RuntimeException(e); + } + byte[] signData = mac.doFinal(stringToSign.getBytes(StandardCharsets.UTF_8)); + String sign = null; + try { + sign = URLEncoder.encode(new String(Base64.getEncoder().encode(signData)),StandardCharsets.UTF_8.toString()); + } catch (UnsupportedEncodingException e) { + throw new RuntimeException(e); + } + return "×tamp=" + timestamp + "&sign=" + sign; + } + public static JSONObject createMessage(Request request, MessageType messageType) { + JSONObject message = new JSONObject(); + if (messageType == TEXT){ + message.set("msgtype", "text"); + JSONObject text = new JSONObject(); + text.set("content", request.getContent()); + JSONObject at = new JSONObject(); + at.set("atMobiles", request.getPhones()); + message.set("at", at); + message.set("text", text); + } else if (messageType == LINK) { + message.set("msgtype", "link"); + JSONObject link = new JSONObject(); + link.set("text", request.getContent()); + link.set("title", request.getTitle()); + message.set("link", link); + } else if (messageType == MARKDOWN) { + message.set("msgtype", "markdown"); + JSONObject markdown = new JSONObject(); + markdown.set("text", request.getContent()); + markdown.set("title", request.getTitle()); + JSONObject at = new JSONObject(); + at.set("atMobiles", request.getPhones()); + message.set("at", at); + message.set("markdown", markdown); + } + return message; + } + + +} diff --git a/sms4j-oa-plugin/sms4j-oa-core/src/main/java/org/dromara/oa/core/support/AbstractHttpClient.java b/sms4j-oa-plugin/sms4j-oa-core/src/main/java/org/dromara/oa/core/support/AbstractHttpClient.java new file mode 100644 index 00000000..3cb73e21 --- /dev/null +++ b/sms4j-oa-plugin/sms4j-oa-core/src/main/java/org/dromara/oa/core/support/AbstractHttpClient.java @@ -0,0 +1,26 @@ +package org.dromara.oa.core.support; + +import java.util.Map; + +public abstract class AbstractHttpClient implements MsgHttpClient{ + + @Override + public String get(String url) { + return null; + } + + @Override + public String get(String url, Map headers) { + return null; + } + + @Override + public String post(String url) { + return null; + } + + @Override + public String post(String url, Map headers) { + return null; + } +} diff --git a/sms4j-oa-plugin/sms4j-oa-core/src/main/java/org/dromara/oa/core/support/HttpClientImpl.java b/sms4j-oa-plugin/sms4j-oa-core/src/main/java/org/dromara/oa/core/support/HttpClientImpl.java new file mode 100644 index 00000000..f4142631 --- /dev/null +++ b/sms4j-oa-plugin/sms4j-oa-core/src/main/java/org/dromara/oa/core/support/HttpClientImpl.java @@ -0,0 +1,20 @@ +package org.dromara.oa.core.support; + +import cn.hutool.http.HttpRequest; +import cn.hutool.http.HttpResponse; + +import java.util.Map; + +public class HttpClientImpl extends AbstractHttpClient{ + @Override + public String post(StringBuilder url, Map headers, T message) throws Exception { + // 构建请求体 + String payload = "{\"msgtype\":\"text\",\"text\":{\"content\":\"This HertzBeat 通知\"},\"at\":{\"isAtAll\":false}}"; + // 发送POST请求 + HttpResponse response = HttpRequest.post(url.toString()) + .headerMap(headers, true) + .body(message.toString()) + .execute(); + return response.body(); + } +} diff --git a/sms4j-oa-plugin/sms4j-oa-core/src/main/java/org/dromara/oa/core/support/MsgHttpClient.java b/sms4j-oa-plugin/sms4j-oa-core/src/main/java/org/dromara/oa/core/support/MsgHttpClient.java new file mode 100644 index 00000000..cb84e146 --- /dev/null +++ b/sms4j-oa-plugin/sms4j-oa-core/src/main/java/org/dromara/oa/core/support/MsgHttpClient.java @@ -0,0 +1,17 @@ +package org.dromara.oa.core.support; + +import java.util.Map; + +public interface MsgHttpClient { + + String get(String url); + + String get(String url, Map headers); + + String post(String url); + + String post(String url, Map headers); + + String post(StringBuilder url, Map headers, T message) throws Exception; + +} diff --git a/sms4j-spring-boot-example/pom.xml b/sms4j-spring-boot-example/pom.xml index a54f8118..fdf7cbea 100644 --- a/sms4j-spring-boot-example/pom.xml +++ b/sms4j-spring-boot-example/pom.xml @@ -29,6 +29,11 @@ spring-boot-starter-test test + + org.dromara.sms4j + sms4j-oa-core + ${revision} + org.dromara.sms4j sms4j-spring-boot-starter diff --git a/sms4j-spring-boot-example/src/test/java/org/dromara/sms4j/example/SmsOaTest.java b/sms4j-spring-boot-example/src/test/java/org/dromara/sms4j/example/SmsOaTest.java new file mode 100644 index 00000000..efe9ad99 --- /dev/null +++ b/sms4j-spring-boot-example/src/test/java/org/dromara/sms4j/example/SmsOaTest.java @@ -0,0 +1,56 @@ +package org.dromara.sms4j.example; + +import lombok.extern.slf4j.Slf4j; +import org.dromara.oa.comm.config.OaConfig; +import org.dromara.oa.comm.entity.Request; +import org.dromara.oa.comm.enums.MessageType; +import org.dromara.oa.comm.enums.OaType; +import org.dromara.oa.core.factory.OaFactory; +import org.dromara.oa.core.service.SenderImpl; +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.context.SpringBootTest; + +import java.util.ArrayList; + + +@Slf4j +@SpringBootTest +public class SmsOaTest { + /** + * 填测试手机号 + */ + private static final String PHONE = ""; + /** + * 填access_token + */ + private static final String TOKENID = ""; + /** + * 填secret + */ + private static final String SIGN = ""; + /** + * 填oa的key + * value是一个OaConfig + */ + private static final String oaKey = ""; + + @Test + public void oaDingTalkTest() { + OaFactory.put(oaKey, OaConfig.builder() + .OaType(OaType.DINGTALK.getType()) + .tokenId(TOKENID) + .sign(SIGN).build()); + SenderImpl alarm = OaFactory.createSender(oaKey); + Request request = new Request(); + request.setOaType(OaType.DINGTALK.getType()); + ArrayList phones = new ArrayList<>(); + phones.add(PHONE); + request.setPhones(phones); + request.setContent("测试消息"); + request.setTitle("测试消息标题"); + alarm.sender(request, MessageType.TEXT); + } +} + + + From a73f5c6d11b2680d97fbdd7fa96db2217b33f43f Mon Sep 17 00:00:00 2001 From: zhangyang Date: Mon, 23 Oct 2023 10:20:04 +0800 Subject: [PATCH 2/5] =?UTF-8?q?sms4j-oa-plugin=E6=94=AF=E6=8C=81=E9=92=89?= =?UTF-8?q?=E9=92=89=E3=80=81=E9=A3=9E=E4=B9=A6=E3=80=81=E5=BE=AE=E4=BF=A1?= =?UTF-8?q?=E7=9A=84webhook=E6=99=AE=E9=80=9A=E4=BF=A1=E6=81=AF=E5=8F=91?= =?UTF-8?q?=E9=80=81---=E6=94=AF=E6=8C=81yaml=E9=85=8D=E7=BD=AE=E5=92=8Cja?= =?UTF-8?q?va=E4=BB=A3=E7=A0=81=E9=85=8D=E7=BD=AE=E4=B8=A4=E7=A7=8D?= =?UTF-8?q?=E6=96=B9=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sms4j-oa-plugin/pom.xml | 13 ++ .../java/org/dromara/oa/api/OaSender.java | 14 ++ sms4j-oa-plugin/sms4j-oa-comm/pom.xml | 5 + .../org/dromara/oa/comm/config/OaConfig.java | 20 --- .../oa/comm/config/OaSupplierConfig.java | 23 +++ .../dromara/oa/comm/content/OaContent.java | 26 ++++ .../org/dromara/oa/comm/entity/Request.java | 10 +- .../org/dromara/oa/comm/entity/Response.java | 16 +- .../dromara/oa/comm/enums/MessageType.java | 1 + .../dromara/oa/comm/errors/OaException.java | 2 +- sms4j-oa-plugin/sms4j-oa-core/pom.xml | 25 +++- .../core/byteTalk/config/ByteTalkConfig.java | 18 +++ .../core/byteTalk/config/ByteTalkFactory.java | 40 +++++ .../core/byteTalk/service/ByteTalkOaImpl.java | 70 +++++++++ .../core/byteTalk/utils/ByteTalkBuilder.java | 62 ++++++++ .../oa/core/config/OaBlendsInitializer.java | 69 +++++++++ .../oa/core/config/OaSupplierConfig.java | 31 ++++ .../core/dingTalk/config/DingTalkConfig.java | 22 +++ .../core/dingTalk/config/DingTalkFactory.java | 40 +++++ .../core/dingTalk/service/DingTalkOaImpl.java | 76 ++++++++++ .../core/dingTalk/utils/DingTalkBuilder.java | 70 +++++++++ .../dromara/oa/core/factory/OaFactory.java | 38 ----- .../oa/core/provider/config/OaBaseConfig.java | 26 ++++ .../factory/AbstractProviderFactory.java | 33 +++++ .../provider/factory/BaseProviderFactory.java | 30 ++++ .../oa/core/provider/factory/OaFactory.java | 53 +++++++ .../factory/ProviderFactoryHolder.java | 43 ++++++ .../provider/service/AbstractOaBlend.java | 27 ++++ .../org/dromara/oa/core/service/OaBuild.java | 22 --- .../dromara/oa/core/service/SenderImpl.java | 120 --------------- .../oa/core/support/AbstractHttpClient.java | 2 +- .../oa/core/support/HttpClientImpl.java | 3 +- .../oa/core/weTalk/config/WeTalkConfig.java | 18 +++ .../oa/core/weTalk/config/WeTalkFactory.java | 40 +++++ .../oa/core/weTalk/service/WeTalkOaImpl.java | 68 +++++++++ .../oa/core/weTalk/utils/WeTalkBuilder.java | 56 +++++++ .../main/resources/META-INF/spring.factories | 2 + ...ot.autoconfigure.AutoConfiguration.imports | 1 + .../src/main/resources/application.properties | 1 + .../src/main/resources/application.yml | 16 +- .../org/dromara/sms4j/example/SmsOaTest.java | 139 ++++++++++++++++-- 41 files changed, 1159 insertions(+), 232 deletions(-) delete mode 100644 sms4j-oa-plugin/sms4j-oa-comm/src/main/java/org/dromara/oa/comm/config/OaConfig.java create mode 100644 sms4j-oa-plugin/sms4j-oa-comm/src/main/java/org/dromara/oa/comm/config/OaSupplierConfig.java create mode 100644 sms4j-oa-plugin/sms4j-oa-comm/src/main/java/org/dromara/oa/comm/content/OaContent.java create mode 100644 sms4j-oa-plugin/sms4j-oa-core/src/main/java/org/dromara/oa/core/byteTalk/config/ByteTalkConfig.java create mode 100644 sms4j-oa-plugin/sms4j-oa-core/src/main/java/org/dromara/oa/core/byteTalk/config/ByteTalkFactory.java create mode 100644 sms4j-oa-plugin/sms4j-oa-core/src/main/java/org/dromara/oa/core/byteTalk/service/ByteTalkOaImpl.java create mode 100644 sms4j-oa-plugin/sms4j-oa-core/src/main/java/org/dromara/oa/core/byteTalk/utils/ByteTalkBuilder.java create mode 100644 sms4j-oa-plugin/sms4j-oa-core/src/main/java/org/dromara/oa/core/config/OaBlendsInitializer.java create mode 100644 sms4j-oa-plugin/sms4j-oa-core/src/main/java/org/dromara/oa/core/config/OaSupplierConfig.java create mode 100644 sms4j-oa-plugin/sms4j-oa-core/src/main/java/org/dromara/oa/core/dingTalk/config/DingTalkConfig.java create mode 100644 sms4j-oa-plugin/sms4j-oa-core/src/main/java/org/dromara/oa/core/dingTalk/config/DingTalkFactory.java create mode 100644 sms4j-oa-plugin/sms4j-oa-core/src/main/java/org/dromara/oa/core/dingTalk/service/DingTalkOaImpl.java create mode 100644 sms4j-oa-plugin/sms4j-oa-core/src/main/java/org/dromara/oa/core/dingTalk/utils/DingTalkBuilder.java delete mode 100644 sms4j-oa-plugin/sms4j-oa-core/src/main/java/org/dromara/oa/core/factory/OaFactory.java create mode 100644 sms4j-oa-plugin/sms4j-oa-core/src/main/java/org/dromara/oa/core/provider/config/OaBaseConfig.java create mode 100644 sms4j-oa-plugin/sms4j-oa-core/src/main/java/org/dromara/oa/core/provider/factory/AbstractProviderFactory.java create mode 100644 sms4j-oa-plugin/sms4j-oa-core/src/main/java/org/dromara/oa/core/provider/factory/BaseProviderFactory.java create mode 100644 sms4j-oa-plugin/sms4j-oa-core/src/main/java/org/dromara/oa/core/provider/factory/OaFactory.java create mode 100644 sms4j-oa-plugin/sms4j-oa-core/src/main/java/org/dromara/oa/core/provider/factory/ProviderFactoryHolder.java create mode 100644 sms4j-oa-plugin/sms4j-oa-core/src/main/java/org/dromara/oa/core/provider/service/AbstractOaBlend.java delete mode 100644 sms4j-oa-plugin/sms4j-oa-core/src/main/java/org/dromara/oa/core/service/OaBuild.java delete mode 100644 sms4j-oa-plugin/sms4j-oa-core/src/main/java/org/dromara/oa/core/service/SenderImpl.java create mode 100644 sms4j-oa-plugin/sms4j-oa-core/src/main/java/org/dromara/oa/core/weTalk/config/WeTalkConfig.java create mode 100644 sms4j-oa-plugin/sms4j-oa-core/src/main/java/org/dromara/oa/core/weTalk/config/WeTalkFactory.java create mode 100644 sms4j-oa-plugin/sms4j-oa-core/src/main/java/org/dromara/oa/core/weTalk/service/WeTalkOaImpl.java create mode 100644 sms4j-oa-plugin/sms4j-oa-core/src/main/java/org/dromara/oa/core/weTalk/utils/WeTalkBuilder.java create mode 100644 sms4j-oa-plugin/sms4j-oa-core/src/main/resources/META-INF/spring.factories create mode 100644 sms4j-oa-plugin/sms4j-oa-core/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports create mode 100644 sms4j-oa-plugin/sms4j-oa-core/src/main/resources/application.properties diff --git a/sms4j-oa-plugin/pom.xml b/sms4j-oa-plugin/pom.xml index 2a25be5c..3999ddea 100644 --- a/sms4j-oa-plugin/pom.xml +++ b/sms4j-oa-plugin/pom.xml @@ -65,6 +65,19 @@ + + + org.springframework.boot + spring-boot-configuration-processor + ${spring.boot.version} + true + + + + org.springframework.boot + spring-boot-starter + ${spring.boot.version} + diff --git a/sms4j-oa-plugin/sms4j-oa-api/src/main/java/org/dromara/oa/api/OaSender.java b/sms4j-oa-plugin/sms4j-oa-api/src/main/java/org/dromara/oa/api/OaSender.java index 08e4b1b3..8b079c36 100644 --- a/sms4j-oa-plugin/sms4j-oa-api/src/main/java/org/dromara/oa/api/OaSender.java +++ b/sms4j-oa-plugin/sms4j-oa-api/src/main/java/org/dromara/oa/api/OaSender.java @@ -5,5 +5,19 @@ import org.dromara.oa.comm.entity.Response; import org.dromara.oa.comm.enums.MessageType; public interface OaSender { + + /** + * 获取通知webhook实例唯一标识 + */ + String getConfigId(); + + /** + * 获取供应商标识 + */ + String getSupplier(); + + /** + * 发送消息 + */ Response sender(Request request, MessageType messageType); } diff --git a/sms4j-oa-plugin/sms4j-oa-comm/pom.xml b/sms4j-oa-plugin/sms4j-oa-comm/pom.xml index cec4cbbf..41002a0a 100644 --- a/sms4j-oa-plugin/sms4j-oa-comm/pom.xml +++ b/sms4j-oa-plugin/sms4j-oa-comm/pom.xml @@ -18,6 +18,11 @@ + + + + + cn.hutool hutool-cron diff --git a/sms4j-oa-plugin/sms4j-oa-comm/src/main/java/org/dromara/oa/comm/config/OaConfig.java b/sms4j-oa-plugin/sms4j-oa-comm/src/main/java/org/dromara/oa/comm/config/OaConfig.java deleted file mode 100644 index 663d64fc..00000000 --- a/sms4j-oa-plugin/sms4j-oa-comm/src/main/java/org/dromara/oa/comm/config/OaConfig.java +++ /dev/null @@ -1,20 +0,0 @@ -package org.dromara.oa.comm.config; - -import lombok.Builder; -import lombok.EqualsAndHashCode; -import lombok.Getter; -import lombok.ToString; - -@Builder -@ToString -@Getter -@EqualsAndHashCode -public class OaConfig { - - private String OaType; - - private String tokenId; - - private String sign; -} - diff --git a/sms4j-oa-plugin/sms4j-oa-comm/src/main/java/org/dromara/oa/comm/config/OaSupplierConfig.java b/sms4j-oa-plugin/sms4j-oa-comm/src/main/java/org/dromara/oa/comm/config/OaSupplierConfig.java new file mode 100644 index 00000000..215ae747 --- /dev/null +++ b/sms4j-oa-plugin/sms4j-oa-comm/src/main/java/org/dromara/oa/comm/config/OaSupplierConfig.java @@ -0,0 +1,23 @@ +package org.dromara.oa.comm.config; + +/** + * @author dongfeng + * @date 2023-10-19 13:36 + */ +public interface OaSupplierConfig { + + /** + * 获取配置标识名(唯一) + */ + String getConfigId(); + + /** + * 获取供应商 + */ + String getSupplier(); + + /** + * 获取是否使用 + */ + Boolean getIsEnable(); +} diff --git a/sms4j-oa-plugin/sms4j-oa-comm/src/main/java/org/dromara/oa/comm/content/OaContent.java b/sms4j-oa-plugin/sms4j-oa-comm/src/main/java/org/dromara/oa/comm/content/OaContent.java new file mode 100644 index 00000000..ad24c74e --- /dev/null +++ b/sms4j-oa-plugin/sms4j-oa-comm/src/main/java/org/dromara/oa/comm/content/OaContent.java @@ -0,0 +1,26 @@ +package org.dromara.oa.comm.content; + +/** + * @author dongfeng + * @date 2023-10-22 13:50 + */ +public class OaContent { + /** + * 供应商配置键名 + */ + public static final String SUPPLIER_KEY = "supplier"; + + /** + * 钉钉 + */ + public static final String DINGTALK = "dingding"; + /** + * 飞书 + */ + public static final String BYTETALK = "feishu"; + /** + * 微信 + */ + public static final String WETALK = "wetalk"; + +} diff --git a/sms4j-oa-plugin/sms4j-oa-comm/src/main/java/org/dromara/oa/comm/entity/Request.java b/sms4j-oa-plugin/sms4j-oa-comm/src/main/java/org/dromara/oa/comm/entity/Request.java index 8964ea34..a1e6ee95 100644 --- a/sms4j-oa-plugin/sms4j-oa-comm/src/main/java/org/dromara/oa/comm/entity/Request.java +++ b/sms4j-oa-plugin/sms4j-oa-comm/src/main/java/org/dromara/oa/comm/entity/Request.java @@ -13,9 +13,15 @@ public class Request { // 消息内容 private String content; - private List phones; + private List phoneList; + + private List userIdList; + + private List userNamesList; + + private Boolean isNoticeAll = false; // oa类型 - private String oaType; + private String oaType; } diff --git a/sms4j-oa-plugin/sms4j-oa-comm/src/main/java/org/dromara/oa/comm/entity/Response.java b/sms4j-oa-plugin/sms4j-oa-comm/src/main/java/org/dromara/oa/comm/entity/Response.java index 15b038f6..66ef8db7 100644 --- a/sms4j-oa-plugin/sms4j-oa-comm/src/main/java/org/dromara/oa/comm/entity/Response.java +++ b/sms4j-oa-plugin/sms4j-oa-comm/src/main/java/org/dromara/oa/comm/entity/Response.java @@ -1,19 +1,23 @@ package org.dromara.oa.comm.entity; +import lombok.AllArgsConstructor; import lombok.Data; @Data +@AllArgsConstructor public class Response { /** - * 响应码 + * 是否成功 */ - private String code; + private boolean success; + /** - * 响应消息 + * 厂商原返回体 */ - private String message; + private Object data; + /** - * 响应数据 + * 配置标识名 如未配置取对应渠道名例如 */ - private String data; + private String oaConfigId; } diff --git a/sms4j-oa-plugin/sms4j-oa-comm/src/main/java/org/dromara/oa/comm/enums/MessageType.java b/sms4j-oa-plugin/sms4j-oa-comm/src/main/java/org/dromara/oa/comm/enums/MessageType.java index fd106a01..49dffc47 100644 --- a/sms4j-oa-plugin/sms4j-oa-comm/src/main/java/org/dromara/oa/comm/enums/MessageType.java +++ b/sms4j-oa-plugin/sms4j-oa-comm/src/main/java/org/dromara/oa/comm/enums/MessageType.java @@ -13,6 +13,7 @@ public enum MessageType { MessageType(String name) { this.name = name; } + private final String name; public String getName() { diff --git a/sms4j-oa-plugin/sms4j-oa-comm/src/main/java/org/dromara/oa/comm/errors/OaException.java b/sms4j-oa-plugin/sms4j-oa-comm/src/main/java/org/dromara/oa/comm/errors/OaException.java index 5ec375a8..d3a19e49 100644 --- a/sms4j-oa-plugin/sms4j-oa-comm/src/main/java/org/dromara/oa/comm/errors/OaException.java +++ b/sms4j-oa-plugin/sms4j-oa-comm/src/main/java/org/dromara/oa/comm/errors/OaException.java @@ -1,6 +1,6 @@ package org.dromara.oa.comm.errors; -public class OaException extends RuntimeException{ +public class OaException extends RuntimeException { public OaException() { super(); diff --git a/sms4j-oa-plugin/sms4j-oa-core/pom.xml b/sms4j-oa-plugin/sms4j-oa-core/pom.xml index a694dc26..d29874d6 100644 --- a/sms4j-oa-plugin/sms4j-oa-core/pom.xml +++ b/sms4j-oa-plugin/sms4j-oa-core/pom.xml @@ -22,7 +22,10 @@ org.dromara.sms4j sms4j-oa-api - + + org.slf4j + slf4j-api + com.sun.activation javax.activation @@ -44,9 +47,23 @@ - - - + + + + + + + + org.springframework.boot + spring-boot-configuration-processor + ${spring.boot.version} + true + + + + org.springframework.boot + spring-boot-starter + diff --git a/sms4j-oa-plugin/sms4j-oa-core/src/main/java/org/dromara/oa/core/byteTalk/config/ByteTalkConfig.java b/sms4j-oa-plugin/sms4j-oa-core/src/main/java/org/dromara/oa/core/byteTalk/config/ByteTalkConfig.java new file mode 100644 index 00000000..7208bea8 --- /dev/null +++ b/sms4j-oa-plugin/sms4j-oa-core/src/main/java/org/dromara/oa/core/byteTalk/config/ByteTalkConfig.java @@ -0,0 +1,18 @@ +package org.dromara.oa.core.byteTalk.config; + +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.dromara.oa.comm.enums.OaType; +import org.dromara.oa.core.provider.config.OaBaseConfig; + +@Data +@EqualsAndHashCode(callSuper = true) +public class ByteTalkConfig extends OaBaseConfig { + + private final String requestUrl = OaType.BYTETALK.getUrl(); + + @Override + public String getSupplier() { + return OaType.BYTETALK.getType(); + } +} \ No newline at end of file diff --git a/sms4j-oa-plugin/sms4j-oa-core/src/main/java/org/dromara/oa/core/byteTalk/config/ByteTalkFactory.java b/sms4j-oa-plugin/sms4j-oa-core/src/main/java/org/dromara/oa/core/byteTalk/config/ByteTalkFactory.java new file mode 100644 index 00000000..a92a1d99 --- /dev/null +++ b/sms4j-oa-plugin/sms4j-oa-core/src/main/java/org/dromara/oa/core/byteTalk/config/ByteTalkFactory.java @@ -0,0 +1,40 @@ +package org.dromara.oa.core.byteTalk.config; + +import lombok.AccessLevel; +import lombok.NoArgsConstructor; +import org.dromara.oa.comm.content.OaContent; +import org.dromara.oa.core.byteTalk.service.ByteTalkOaImpl; +import org.dromara.oa.core.provider.factory.AbstractProviderFactory; + +/** + * @author dongfeng + * @description 飞书通知对象建造 + * @date 2023-10-22 21:00 + */ +@NoArgsConstructor(access = AccessLevel.PRIVATE) +public class ByteTalkFactory extends AbstractProviderFactory { + private static final ByteTalkFactory INSTANCE = new ByteTalkFactory(); + + /** + * 建造一个飞书通知对象实现 + */ + @Override + public ByteTalkOaImpl createSmsOa(ByteTalkConfig byteTalkConfig) { + return new ByteTalkOaImpl(byteTalkConfig); + } + + @Override + public String getSupplier() { + return OaContent.BYTETALK; + } + + /** + * 获取建造者实例 + * + * @return 建造者实例 + */ + public static ByteTalkFactory instance() { + return INSTANCE; + } + +} diff --git a/sms4j-oa-plugin/sms4j-oa-core/src/main/java/org/dromara/oa/core/byteTalk/service/ByteTalkOaImpl.java b/sms4j-oa-plugin/sms4j-oa-core/src/main/java/org/dromara/oa/core/byteTalk/service/ByteTalkOaImpl.java new file mode 100644 index 00000000..1da5b306 --- /dev/null +++ b/sms4j-oa-plugin/sms4j-oa-core/src/main/java/org/dromara/oa/core/byteTalk/service/ByteTalkOaImpl.java @@ -0,0 +1,70 @@ +package org.dromara.oa.core.byteTalk.service; + +import cn.hutool.json.JSONObject; +import lombok.extern.slf4j.Slf4j; +import org.dromara.oa.comm.entity.Request; +import org.dromara.oa.comm.entity.Response; +import org.dromara.oa.comm.enums.MessageType; +import org.dromara.oa.comm.enums.OaType; +import org.dromara.oa.comm.errors.OaException; +import org.dromara.oa.core.byteTalk.config.ByteTalkConfig; +import org.dromara.oa.core.byteTalk.utils.ByteTalkBuilder; +import org.dromara.oa.core.provider.service.AbstractOaBlend; +import org.dromara.oa.core.support.HttpClientImpl; + +import java.util.HashMap; +import java.util.Map; +import java.util.Objects; + +import static org.dromara.oa.comm.enums.OaType.BYTETALK; + +/** + * @author dongfeng + * @date 2023-10-22 21:01 + */ +@Slf4j +public class ByteTalkOaImpl extends AbstractOaBlend { + + private HttpClientImpl httpClient = new HttpClientImpl(); + + public ByteTalkOaImpl(ByteTalkConfig config) { + super(config); + } + + @Override + public String getSupplier() { + return OaType.BYTETALK.getType(); + } + + @Override + public Response sender(Request request, MessageType messageType) { + + if (Objects.isNull(request.getContent())) { + throw new OaException("消息体content不能为空"); + } + StringBuilder webhook = new StringBuilder(); + JSONObject message = null; + ByteTalkConfig config = getConfig(); + webhook.append(BYTETALK.getUrl()); + webhook.append(config.getTokenId()); + long now = System.currentTimeMillis() / 1000; + String sign = ByteTalkBuilder.byteTalkSign(config.getSign(), now); + message = ByteTalkBuilder.createByteTalkMessage(request, messageType, sign, now); + String post; + try { + post = httpClient.post(webhook, getHeaders(), message); + log.info("请求返回结果:" + post); + } catch (Exception e) { + log.warn("请求失败问题:" + e.getMessage()); + throw new OaException(e.getMessage()); + } + // 后续解析响应体提取errorCode判断是否成功 + return new Response(true, post, config.getConfigId()); + } + + public static Map getHeaders() { + Map headers = new HashMap<>(); + headers.put("Content-Type", "application/json"); + return headers; + } +} diff --git a/sms4j-oa-plugin/sms4j-oa-core/src/main/java/org/dromara/oa/core/byteTalk/utils/ByteTalkBuilder.java b/sms4j-oa-plugin/sms4j-oa-core/src/main/java/org/dromara/oa/core/byteTalk/utils/ByteTalkBuilder.java new file mode 100644 index 00000000..d29d7361 --- /dev/null +++ b/sms4j-oa-plugin/sms4j-oa-core/src/main/java/org/dromara/oa/core/byteTalk/utils/ByteTalkBuilder.java @@ -0,0 +1,62 @@ +package org.dromara.oa.core.byteTalk.utils; + +import cn.hutool.json.JSONObject; +import org.dromara.oa.comm.entity.Request; +import org.dromara.oa.comm.enums.MessageType; + +import javax.crypto.Mac; +import javax.crypto.spec.SecretKeySpec; +import java.nio.charset.StandardCharsets; +import java.security.InvalidKeyException; +import java.security.NoSuchAlgorithmException; +import java.util.Base64; +import java.util.List; + +import static org.dromara.oa.comm.enums.MessageType.TEXT; + +/** + * @author dongfeng + * @description 飞书通知签名和信息构建 + * @date 2023-10-19 13:07 + */ +public class ByteTalkBuilder { + + public static String byteTalkSign(String secret, Long timestamp) { + //把timestamp+"\n"+密钥当做签名字符串 + String stringToSign = timestamp + "\n" + secret; + //使用HmacSHA256算法计算签名 + Mac mac = null; + try { + mac = Mac.getInstance("HmacSHA256"); + mac.init(new SecretKeySpec(stringToSign.getBytes(StandardCharsets.UTF_8), "HmacSHA256")); + } catch (NoSuchAlgorithmException | InvalidKeyException e) { + throw new RuntimeException(e); + } + byte[] signData = mac.doFinal(new byte[]{}); + return new String(Base64.getEncoder().encode(signData)); + } + + + public static JSONObject createByteTalkMessage(Request request, MessageType messageType, String sign, Long timestamp) { + JSONObject message = new JSONObject(); + if (messageType == TEXT) { + message.set("msg_type", "text"); + message.set("timestamp", timestamp); + message.set("sign", sign); + StringBuilder content = new StringBuilder(); + List userNamesList = request.getUserNamesList(); + Boolean isNoticeAll = request.getIsNoticeAll(); + if (isNoticeAll) { + content.append("所有人"); + } + userNamesList.forEach(l -> { + content.append("").append(l).append(""); + }); + content.append(request.getContent()); + JSONObject text = new JSONObject(); + text.set("text", content); + message.set("content", text); + } + return message; + } +} diff --git a/sms4j-oa-plugin/sms4j-oa-core/src/main/java/org/dromara/oa/core/config/OaBlendsInitializer.java b/sms4j-oa-plugin/sms4j-oa-core/src/main/java/org/dromara/oa/core/config/OaBlendsInitializer.java new file mode 100644 index 00000000..5ef7626b --- /dev/null +++ b/sms4j-oa-plugin/sms4j-oa-core/src/main/java/org/dromara/oa/core/config/OaBlendsInitializer.java @@ -0,0 +1,69 @@ +package org.dromara.oa.core.config; + +import cn.hutool.core.util.StrUtil; +import cn.hutool.json.JSONObject; +import cn.hutool.json.JSONUtil; +import lombok.extern.slf4j.Slf4j; +import org.dromara.oa.api.OaSender; +import org.dromara.oa.comm.config.OaSupplierConfig; +import org.dromara.oa.comm.content.OaContent; +import org.dromara.oa.core.byteTalk.config.ByteTalkFactory; +import org.dromara.oa.core.dingTalk.config.DingTalkFactory; +import org.dromara.oa.core.provider.factory.BaseProviderFactory; +import org.dromara.oa.core.provider.factory.OaFactory; +import org.dromara.oa.core.provider.factory.ProviderFactoryHolder; +import org.dromara.oa.core.weTalk.config.WeTalkFactory; + +import java.util.List; +import java.util.Map; + +/** + * @author dongfeng + * @description 注册工厂, 读取yaml配置并根据配置生成对象 + * @date 2023-10-22 12:39 + */ + +@Slf4j +public class OaBlendsInitializer { + private List> factoryList; + + private final Map> blends; + + public OaBlendsInitializer(Map> oas + ) { + this.blends = oas; + onApplicationEvent(); + } + + public void onApplicationEvent() { + registerDefaultFactory(); + // 解析供应商配置 + for (String configId : blends.keySet()) { + Map configMap = blends.get(configId); + if (Boolean.FALSE.equals(configMap.get("isEnable"))) { + continue; + } + Object supplierObj = configMap.get(OaContent.SUPPLIER_KEY); + String supplier = supplierObj == null ? "" : String.valueOf(supplierObj); + supplier = StrUtil.isEmpty(supplier) ? configId : supplier; + BaseProviderFactory providerFactory = (BaseProviderFactory) ProviderFactoryHolder.requireForSupplier(supplier); + if (providerFactory == null) { + log.warn("创建\"{}\"的通知webhook服务失败,未找到供应商为\"{}\"的服务", configId, supplier); + continue; + } + configMap.put("configId", configId); + JSONObject configJson = new JSONObject(configMap); + OaSupplierConfig supplierConfig = JSONUtil.toBean(configJson, providerFactory.getConfigClass()); + OaFactory.createAndRegisterOaSender(supplierConfig); + } + } + + /** + * 注册默认工厂实例 + */ + private void registerDefaultFactory() { + ProviderFactoryHolder.registerFactory(DingTalkFactory.instance()); + ProviderFactoryHolder.registerFactory(ByteTalkFactory.instance()); + ProviderFactoryHolder.registerFactory(WeTalkFactory.instance()); + } +} diff --git a/sms4j-oa-plugin/sms4j-oa-core/src/main/java/org/dromara/oa/core/config/OaSupplierConfig.java b/sms4j-oa-plugin/sms4j-oa-core/src/main/java/org/dromara/oa/core/config/OaSupplierConfig.java new file mode 100644 index 00000000..184429d6 --- /dev/null +++ b/sms4j-oa-plugin/sms4j-oa-core/src/main/java/org/dromara/oa/core/config/OaSupplierConfig.java @@ -0,0 +1,31 @@ +package org.dromara.oa.core.config; + +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.context.annotation.Bean; + +import java.util.LinkedHashMap; +import java.util.Map; + +/** + * @author dongfeng + * @date 2023-10-22 12:50 + */ +public class OaSupplierConfig { + /** + * 注入配置 + */ + @Bean + @ConfigurationProperties(prefix = "sms.oas") + @ConditionalOnProperty(prefix = "sms", name = "config-type", havingValue = "yaml") + protected Map> oas() { + return new LinkedHashMap<>(); + } + + + @Bean + protected OaBlendsInitializer smsOasInitializer( + Map> oas) { + return new OaBlendsInitializer(oas); + } +} diff --git a/sms4j-oa-plugin/sms4j-oa-core/src/main/java/org/dromara/oa/core/dingTalk/config/DingTalkConfig.java b/sms4j-oa-plugin/sms4j-oa-core/src/main/java/org/dromara/oa/core/dingTalk/config/DingTalkConfig.java new file mode 100644 index 00000000..41761c22 --- /dev/null +++ b/sms4j-oa-plugin/sms4j-oa-core/src/main/java/org/dromara/oa/core/dingTalk/config/DingTalkConfig.java @@ -0,0 +1,22 @@ +package org.dromara.oa.core.dingTalk.config; + +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.dromara.oa.comm.enums.OaType; +import org.dromara.oa.core.provider.config.OaBaseConfig; + + +/** + * @author dongfeng + * @date 2023-10-19 13:38 + */ +@Data +@EqualsAndHashCode(callSuper = true) +public class DingTalkConfig extends OaBaseConfig { + private final String requestUrl = OaType.DINGTALK.getUrl(); + + @Override + public String getSupplier() { + return OaType.DINGTALK.getType(); + } +} diff --git a/sms4j-oa-plugin/sms4j-oa-core/src/main/java/org/dromara/oa/core/dingTalk/config/DingTalkFactory.java b/sms4j-oa-plugin/sms4j-oa-core/src/main/java/org/dromara/oa/core/dingTalk/config/DingTalkFactory.java new file mode 100644 index 00000000..a80408f1 --- /dev/null +++ b/sms4j-oa-plugin/sms4j-oa-core/src/main/java/org/dromara/oa/core/dingTalk/config/DingTalkFactory.java @@ -0,0 +1,40 @@ +package org.dromara.oa.core.dingTalk.config; + +import lombok.AccessLevel; +import lombok.NoArgsConstructor; +import org.dromara.oa.comm.content.OaContent; +import org.dromara.oa.core.dingTalk.service.DingTalkOaImpl; +import org.dromara.oa.core.provider.factory.AbstractProviderFactory; + +/** + * @author dongfeng + * @description 钉钉通知对象建造 + * @date 2023-10-22 21:00 + */ +@NoArgsConstructor(access = AccessLevel.PRIVATE) +public class DingTalkFactory extends AbstractProviderFactory { + private static final DingTalkFactory INSTANCE = new DingTalkFactory(); + + /** + * 建造一个钉钉通知实现 + */ + @Override + public DingTalkOaImpl createSmsOa(DingTalkConfig dingTalkConfig) { + return new DingTalkOaImpl(dingTalkConfig); + } + + @Override + public String getSupplier() { + return OaContent.DINGTALK; + } + + /** + * 获取建造者实例 + * + * @return 建造者实例 + */ + public static DingTalkFactory instance() { + return INSTANCE; + } + +} diff --git a/sms4j-oa-plugin/sms4j-oa-core/src/main/java/org/dromara/oa/core/dingTalk/service/DingTalkOaImpl.java b/sms4j-oa-plugin/sms4j-oa-core/src/main/java/org/dromara/oa/core/dingTalk/service/DingTalkOaImpl.java new file mode 100644 index 00000000..2d002d7a --- /dev/null +++ b/sms4j-oa-plugin/sms4j-oa-core/src/main/java/org/dromara/oa/core/dingTalk/service/DingTalkOaImpl.java @@ -0,0 +1,76 @@ +package org.dromara.oa.core.dingTalk.service; + +import cn.hutool.json.JSONObject; +import lombok.extern.slf4j.Slf4j; +import org.dromara.oa.comm.entity.Request; +import org.dromara.oa.comm.entity.Response; +import org.dromara.oa.comm.enums.MessageType; +import org.dromara.oa.comm.enums.OaType; +import org.dromara.oa.comm.errors.OaException; +import org.dromara.oa.core.dingTalk.config.DingTalkConfig; +import org.dromara.oa.core.dingTalk.utils.DingTalkBuilder; +import org.dromara.oa.core.provider.service.AbstractOaBlend; +import org.dromara.oa.core.support.HttpClientImpl; + +import java.util.HashMap; +import java.util.Map; +import java.util.Objects; + +import static org.dromara.oa.comm.enums.OaType.DINGTALK; + +/** + * @author dongfeng + * @date 2023-10-22 21:01 + */ +@Slf4j +public class DingTalkOaImpl extends AbstractOaBlend { + + private HttpClientImpl httpClient = new HttpClientImpl(); + + /** + * 建造一个微信通知对象服务 + */ + public DingTalkOaImpl(DingTalkConfig config) { + super(config); + } + + @Override + public String getSupplier() { + return OaType.DINGTALK.getType(); + } + + @Override + public Response sender(Request request, MessageType messageType) { + + if (Objects.isNull(request.getContent())) { + throw new OaException("消息体content不能为空"); + } + StringBuilder webhook = new StringBuilder(); + JSONObject message = null; + DingTalkConfig config = getConfig(); + webhook.append(DINGTALK.getUrl()); + webhook.append(config.getTokenId()); + String sign = config.getSign(); + if (!Objects.isNull(sign)) { + sign = DingTalkBuilder.sign(sign); + webhook.append(sign); + } + message = DingTalkBuilder.createMessage(request, messageType); + String post; + try { + post = httpClient.post(webhook, getHeaders(), message); + log.info("请求返回结果:" + post); + } catch (Exception e) { + log.warn("请求失败问题:" + e.getMessage()); + throw new OaException(e.getMessage()); + } + // 后续解析响应体提取errorCode判断是否成功 + return new Response(true, post, config.getConfigId()); + } + + public static Map getHeaders() { + Map headers = new HashMap<>(); + headers.put("Content-Type", "application/json"); + return headers; + } +} diff --git a/sms4j-oa-plugin/sms4j-oa-core/src/main/java/org/dromara/oa/core/dingTalk/utils/DingTalkBuilder.java b/sms4j-oa-plugin/sms4j-oa-core/src/main/java/org/dromara/oa/core/dingTalk/utils/DingTalkBuilder.java new file mode 100644 index 00000000..e23aadf8 --- /dev/null +++ b/sms4j-oa-plugin/sms4j-oa-core/src/main/java/org/dromara/oa/core/dingTalk/utils/DingTalkBuilder.java @@ -0,0 +1,70 @@ +package org.dromara.oa.core.dingTalk.utils; + +import cn.hutool.json.JSONObject; +import org.dromara.oa.comm.entity.Request; +import org.dromara.oa.comm.enums.MessageType; + +import javax.crypto.Mac; +import javax.crypto.spec.SecretKeySpec; +import java.io.UnsupportedEncodingException; +import java.net.URLEncoder; +import java.nio.charset.StandardCharsets; +import java.security.InvalidKeyException; +import java.security.NoSuchAlgorithmException; +import java.util.Base64; + +import static org.dromara.oa.comm.enums.MessageType.MARKDOWN; +import static org.dromara.oa.comm.enums.MessageType.TEXT; + +/** + * @author dongfeng + * @description 钉钉通知签名和信息构建 + * @date 2023-10-19 13:07 + */ +public class DingTalkBuilder { + public static String sign(String secret) { + Long timestamp = System.currentTimeMillis(); + + String stringToSign = timestamp + "\n" + secret; + Mac mac = null; + try { + mac = Mac.getInstance("HmacSHA256"); + mac.init(new SecretKeySpec(secret.getBytes(StandardCharsets.UTF_8), "HmacSHA256")); + } catch (NoSuchAlgorithmException | InvalidKeyException e) { + throw new RuntimeException(e); + } + byte[] signData = mac.doFinal(stringToSign.getBytes(StandardCharsets.UTF_8)); + String sign = null; + try { + sign = URLEncoder.encode(new String(Base64.getEncoder().encode(signData)), StandardCharsets.UTF_8.toString()); + } catch (UnsupportedEncodingException e) { + throw new RuntimeException(e); + } + return "×tamp=" + timestamp + "&sign=" + sign; + } + + + public static JSONObject createMessage(Request request, MessageType messageType) { + JSONObject message = new JSONObject(); + if (messageType == TEXT) { + message.set("msgtype", "text"); + JSONObject text = new JSONObject(); + text.set("content", request.getContent()); + JSONObject at = new JSONObject(); + at.set("atMobiles", request.getPhoneList()); + at.set("isAtAll", request.getIsNoticeAll()); + message.set("at", at); + message.set("text", text); + } else if (messageType == MARKDOWN) { + message.set("msgtype", "markdown"); + JSONObject markdown = new JSONObject(); + markdown.set("text", request.getContent()); + markdown.set("title", request.getTitle()); + JSONObject at = new JSONObject(); + at.set("atMobiles", request.getPhoneList()); + message.set("at", at); + message.set("markdown", markdown); + } + return message; + } +} diff --git a/sms4j-oa-plugin/sms4j-oa-core/src/main/java/org/dromara/oa/core/factory/OaFactory.java b/sms4j-oa-plugin/sms4j-oa-core/src/main/java/org/dromara/oa/core/factory/OaFactory.java deleted file mode 100644 index a4415d37..00000000 --- a/sms4j-oa-plugin/sms4j-oa-core/src/main/java/org/dromara/oa/core/factory/OaFactory.java +++ /dev/null @@ -1,38 +0,0 @@ -package org.dromara.oa.core.factory; - -import org.dromara.oa.comm.config.OaConfig; -import org.dromara.oa.comm.errors.OaException; -import org.dromara.oa.core.service.OaBuild; -import org.dromara.oa.core.service.SenderImpl; - -import java.util.HashMap; -import java.util.Map; - -public class OaFactory { - private static final Map configs = new HashMap<>(); - - /** - * createMailClient - *

从工厂获取一个OA发送实例 - * @param key 配置的标识key - */ - public static SenderImpl createSender(Object key) { - try { - return OaBuild.build(configs.get(key)); - } catch (Exception e) { - throw new OaException(e.getMessage()); - } - } - - - /** - * set - *

将一个配置对象交给工厂 - * @param key 标识 - * @param config 配置对象 - */ - public static void put(Object key, OaConfig config){ - configs.put(key, config); - } - -} diff --git a/sms4j-oa-plugin/sms4j-oa-core/src/main/java/org/dromara/oa/core/provider/config/OaBaseConfig.java b/sms4j-oa-plugin/sms4j-oa-core/src/main/java/org/dromara/oa/core/provider/config/OaBaseConfig.java new file mode 100644 index 00000000..68ba0e45 --- /dev/null +++ b/sms4j-oa-plugin/sms4j-oa-core/src/main/java/org/dromara/oa/core/provider/config/OaBaseConfig.java @@ -0,0 +1,26 @@ +package org.dromara.oa.core.provider.config; + +import lombok.Data; +import org.dromara.oa.comm.config.OaSupplierConfig; + +@Data +public abstract class OaBaseConfig implements OaSupplierConfig { + /** + * 供应商 + */ + private String supplier; + + + /** + * 获取配置标识名(唯一) + */ + private String configId; + + private String tokenId; + + private String sign; + + private Boolean isEnable = true; + +} + diff --git a/sms4j-oa-plugin/sms4j-oa-core/src/main/java/org/dromara/oa/core/provider/factory/AbstractProviderFactory.java b/sms4j-oa-plugin/sms4j-oa-core/src/main/java/org/dromara/oa/core/provider/factory/AbstractProviderFactory.java new file mode 100644 index 00000000..3281c24d --- /dev/null +++ b/sms4j-oa-plugin/sms4j-oa-core/src/main/java/org/dromara/oa/core/provider/factory/AbstractProviderFactory.java @@ -0,0 +1,33 @@ +package org.dromara.oa.core.provider.factory; + +import org.dromara.oa.api.OaSender; +import org.dromara.oa.comm.config.OaSupplierConfig; + +import java.lang.reflect.ParameterizedType; +import java.lang.reflect.Type; + +public abstract class AbstractProviderFactory implements BaseProviderFactory { + + private Class configClass; + + public AbstractProviderFactory() { + Type genericSuperclass = getClass().getGenericSuperclass(); + if (genericSuperclass instanceof ParameterizedType) { + ParameterizedType paramType = (ParameterizedType) genericSuperclass; + Type[] typeArguments = paramType.getActualTypeArguments(); + if (typeArguments.length > 1 && typeArguments[1] instanceof Class) { + configClass = (Class) typeArguments[1]; + } + } + } + + /** + * 获取配置类 + * + * @return 配置类 + */ + public Class getConfigClass() { + return configClass; + } + +} diff --git a/sms4j-oa-plugin/sms4j-oa-core/src/main/java/org/dromara/oa/core/provider/factory/BaseProviderFactory.java b/sms4j-oa-plugin/sms4j-oa-core/src/main/java/org/dromara/oa/core/provider/factory/BaseProviderFactory.java new file mode 100644 index 00000000..d16765d4 --- /dev/null +++ b/sms4j-oa-plugin/sms4j-oa-core/src/main/java/org/dromara/oa/core/provider/factory/BaseProviderFactory.java @@ -0,0 +1,30 @@ +package org.dromara.oa.core.provider.factory; + +import org.dromara.oa.api.OaSender; +import org.dromara.oa.comm.config.OaSupplierConfig; + +public interface BaseProviderFactory { + + /** + * 创建通知webhook实现对象 + * + * @param c 通知webhook配置对象 + * @return 通知webhook实现对象 + */ + S createSmsOa(C c); + + /** + * 获取配置类 + * + * @return 配置类 + */ + Class getConfigClass(); + + /** + * 获取供应商 + * + * @return 供应商 + */ + String getSupplier(); + +} \ No newline at end of file diff --git a/sms4j-oa-plugin/sms4j-oa-core/src/main/java/org/dromara/oa/core/provider/factory/OaFactory.java b/sms4j-oa-plugin/sms4j-oa-core/src/main/java/org/dromara/oa/core/provider/factory/OaFactory.java new file mode 100644 index 00000000..487ae81a --- /dev/null +++ b/sms4j-oa-plugin/sms4j-oa-core/src/main/java/org/dromara/oa/core/provider/factory/OaFactory.java @@ -0,0 +1,53 @@ +package org.dromara.oa.core.provider.factory; + +import org.dromara.oa.api.OaSender; +import org.dromara.oa.comm.config.OaSupplierConfig; +import org.dromara.oa.comm.errors.OaException; + +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + +public class OaFactory { + private final static Map configs = new ConcurrentHashMap<>(); + + /** + *

创建各个厂商的实现类 + * + * @param config 通知webhook配置 + */ + public static void createAndRegisterOaSender(OaSupplierConfig config) { + OaSender oaSender = createAndGetOa(config); + register(oaSender); + } + + /** + * 注册通知webhook服务对象 + * + * @param smsBlend 通知webhook服务对象 + */ + public static void register(OaSender smsBlend) { + if (smsBlend == null) { + throw new OaException("通知webhook服务对象不能为空"); + } + configs.put(smsBlend.getConfigId(), smsBlend); + } + + public static OaSender createAndGetOa(OaSupplierConfig config) { + BaseProviderFactory factory = ProviderFactoryHolder.requireForSupplier(config.getSupplier()); + if (factory == null) { + throw new OaException("不支持当前供应商配置"); + } + return factory.createSmsOa(config); + } + + /** + * 通过configId获取通知webhook服务对象 + * + * @param configId 唯一标识 + * @return 返回通知webhook服务对象。如果未找到则返回null + */ + public static OaSender getSmsOaBlend(String configId) { + return configs.get(configId); + } + +} diff --git a/sms4j-oa-plugin/sms4j-oa-core/src/main/java/org/dromara/oa/core/provider/factory/ProviderFactoryHolder.java b/sms4j-oa-plugin/sms4j-oa-core/src/main/java/org/dromara/oa/core/provider/factory/ProviderFactoryHolder.java new file mode 100644 index 00000000..02270949 --- /dev/null +++ b/sms4j-oa-plugin/sms4j-oa-core/src/main/java/org/dromara/oa/core/provider/factory/ProviderFactoryHolder.java @@ -0,0 +1,43 @@ +package org.dromara.oa.core.provider.factory; + +import cn.hutool.core.collection.CollUtil; +import org.dromara.oa.api.OaSender; +import org.dromara.oa.comm.config.OaSupplierConfig; +import org.dromara.oa.comm.errors.OaException; + +import java.util.List; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + +/** + * @author dongfeng + * @date 2023-10-22 21:12 + */ +public class ProviderFactoryHolder { + + + private static final Map> factories = new ConcurrentHashMap<>(); + + public static void registerFactory(BaseProviderFactory factory) { + if (factory == null) { + throw new OaException("注册供应商工厂失败,工厂实例不能为空"); + } + factories.put(factory.getSupplier(), factory); + } + + public static void registerFactory(List> factoryList) { + if (CollUtil.isEmpty(factoryList)) { + return; + } + for (BaseProviderFactory factory : factoryList) { + if (factory == null) { + continue; + } + registerFactory(factory); + } + } + + public static BaseProviderFactory requireForSupplier(String supplier) { + return factories.getOrDefault(supplier, null); + } +} diff --git a/sms4j-oa-plugin/sms4j-oa-core/src/main/java/org/dromara/oa/core/provider/service/AbstractOaBlend.java b/sms4j-oa-plugin/sms4j-oa-core/src/main/java/org/dromara/oa/core/provider/service/AbstractOaBlend.java new file mode 100644 index 00000000..f8dbe026 --- /dev/null +++ b/sms4j-oa-plugin/sms4j-oa-core/src/main/java/org/dromara/oa/core/provider/service/AbstractOaBlend.java @@ -0,0 +1,27 @@ +package org.dromara.oa.core.provider.service; + +import cn.hutool.core.util.StrUtil; +import lombok.Getter; +import org.dromara.oa.api.OaSender; +import org.dromara.oa.comm.config.OaSupplierConfig; + +/** + * @author dongfeng + * @date 2023-10-22 21:03 + */ +public abstract class AbstractOaBlend implements OaSender { + + @Getter + private final String configId; + + private final C config; + + protected AbstractOaBlend(C config) { + this.configId = StrUtil.isEmpty(config.getConfigId()) ? getSupplier() : config.getConfigId(); + this.config = config; + } + + protected C getConfig() { + return config; + } +} \ No newline at end of file diff --git a/sms4j-oa-plugin/sms4j-oa-core/src/main/java/org/dromara/oa/core/service/OaBuild.java b/sms4j-oa-plugin/sms4j-oa-core/src/main/java/org/dromara/oa/core/service/OaBuild.java deleted file mode 100644 index d7f00ee0..00000000 --- a/sms4j-oa-plugin/sms4j-oa-core/src/main/java/org/dromara/oa/core/service/OaBuild.java +++ /dev/null @@ -1,22 +0,0 @@ -package org.dromara.oa.core.service; - - -import lombok.Data; -import org.dromara.oa.comm.config.OaConfig; - -@Data -public class OaBuild { - - private String OaType; - - private OaConfig config; - - public OaBuild(OaConfig config) { - this.config = config; - this.OaType = getOaType(); - } - - public static SenderImpl build(OaConfig config) { - return SenderImpl.NewSender(new OaBuild(config)); - } -} diff --git a/sms4j-oa-plugin/sms4j-oa-core/src/main/java/org/dromara/oa/core/service/SenderImpl.java b/sms4j-oa-plugin/sms4j-oa-core/src/main/java/org/dromara/oa/core/service/SenderImpl.java deleted file mode 100644 index d432b0d5..00000000 --- a/sms4j-oa-plugin/sms4j-oa-core/src/main/java/org/dromara/oa/core/service/SenderImpl.java +++ /dev/null @@ -1,120 +0,0 @@ -package org.dromara.oa.core.service; - -import org.dromara.oa.api.OaSender; -import org.dromara.oa.comm.entity.Request; -import org.dromara.oa.comm.entity.Response; -import org.dromara.oa.comm.enums.MessageType; -import org.dromara.oa.comm.errors.OaException; -import org.dromara.oa.core.support.HttpClientImpl; - -import java.io.UnsupportedEncodingException; -import java.net.URLEncoder; -import java.nio.charset.StandardCharsets; -import java.security.InvalidKeyException; -import java.security.NoSuchAlgorithmException; -import java.util.Base64; -import java.util.HashMap; -import java.util.Map; -import java.util.logging.Logger; -import cn.hutool.json.JSONObject; - -import javax.crypto.Mac; -import javax.crypto.spec.SecretKeySpec; - -import static org.dromara.oa.comm.enums.MessageType.*; -import static org.dromara.oa.comm.enums.OaType.DINGTALK; - -public class SenderImpl implements OaSender { - - private static Logger logger = Logger.getLogger("oaLog"); - - private OaBuild oaBuild; - - private HttpClientImpl httpClient = new HttpClientImpl(); - - public SenderImpl() { - } - public SenderImpl(OaBuild oaBuild) { - this.oaBuild = oaBuild; - } - - public static SenderImpl NewSender(OaBuild oaBuild){ - return new SenderImpl(oaBuild); - } - - @Override - public Response sender(Request request, MessageType messageType) { - StringBuilder webhook = new StringBuilder(); - webhook.append(DINGTALK.getUrl()); - webhook.append(oaBuild.getConfig().getTokenId()); - if (request.getOaType().equals(DINGTALK.getType())) { - // todo 等待完善钉钉和飞书的sign - webhook.append(sign(oaBuild.getConfig().getSign())); - } - JSONObject message = createMessage(request, messageType); - try { - String post = httpClient.post(webhook, getHeaders(), message); - logger.info("请求返回结果:" + post); - } catch (Exception e) { - logger.warning("请求失败问题:" + e.getMessage()); - throw new OaException(e.getMessage()); - } - return new Response(); - } - - public static Map getHeaders() { - Map headers = new HashMap<>(); - headers.put("Content-Type", "application/json"); - return headers; - } - public static String sign(String secret) { - Long timestamp = System.currentTimeMillis(); - - String stringToSign = timestamp + "\n" + secret; - Mac mac = null; - try { - mac = Mac.getInstance("HmacSHA256"); - mac.init(new SecretKeySpec(secret.getBytes(StandardCharsets.UTF_8), "HmacSHA256")); - } catch (NoSuchAlgorithmException | InvalidKeyException e) { - throw new RuntimeException(e); - } - byte[] signData = mac.doFinal(stringToSign.getBytes(StandardCharsets.UTF_8)); - String sign = null; - try { - sign = URLEncoder.encode(new String(Base64.getEncoder().encode(signData)),StandardCharsets.UTF_8.toString()); - } catch (UnsupportedEncodingException e) { - throw new RuntimeException(e); - } - return "×tamp=" + timestamp + "&sign=" + sign; - } - public static JSONObject createMessage(Request request, MessageType messageType) { - JSONObject message = new JSONObject(); - if (messageType == TEXT){ - message.set("msgtype", "text"); - JSONObject text = new JSONObject(); - text.set("content", request.getContent()); - JSONObject at = new JSONObject(); - at.set("atMobiles", request.getPhones()); - message.set("at", at); - message.set("text", text); - } else if (messageType == LINK) { - message.set("msgtype", "link"); - JSONObject link = new JSONObject(); - link.set("text", request.getContent()); - link.set("title", request.getTitle()); - message.set("link", link); - } else if (messageType == MARKDOWN) { - message.set("msgtype", "markdown"); - JSONObject markdown = new JSONObject(); - markdown.set("text", request.getContent()); - markdown.set("title", request.getTitle()); - JSONObject at = new JSONObject(); - at.set("atMobiles", request.getPhones()); - message.set("at", at); - message.set("markdown", markdown); - } - return message; - } - - -} diff --git a/sms4j-oa-plugin/sms4j-oa-core/src/main/java/org/dromara/oa/core/support/AbstractHttpClient.java b/sms4j-oa-plugin/sms4j-oa-core/src/main/java/org/dromara/oa/core/support/AbstractHttpClient.java index 3cb73e21..49d2f234 100644 --- a/sms4j-oa-plugin/sms4j-oa-core/src/main/java/org/dromara/oa/core/support/AbstractHttpClient.java +++ b/sms4j-oa-plugin/sms4j-oa-core/src/main/java/org/dromara/oa/core/support/AbstractHttpClient.java @@ -2,7 +2,7 @@ package org.dromara.oa.core.support; import java.util.Map; -public abstract class AbstractHttpClient implements MsgHttpClient{ +public abstract class AbstractHttpClient implements MsgHttpClient { @Override public String get(String url) { diff --git a/sms4j-oa-plugin/sms4j-oa-core/src/main/java/org/dromara/oa/core/support/HttpClientImpl.java b/sms4j-oa-plugin/sms4j-oa-core/src/main/java/org/dromara/oa/core/support/HttpClientImpl.java index f4142631..7b6f72a7 100644 --- a/sms4j-oa-plugin/sms4j-oa-core/src/main/java/org/dromara/oa/core/support/HttpClientImpl.java +++ b/sms4j-oa-plugin/sms4j-oa-core/src/main/java/org/dromara/oa/core/support/HttpClientImpl.java @@ -5,11 +5,10 @@ import cn.hutool.http.HttpResponse; import java.util.Map; -public class HttpClientImpl extends AbstractHttpClient{ +public class HttpClientImpl extends AbstractHttpClient { @Override public String post(StringBuilder url, Map headers, T message) throws Exception { // 构建请求体 - String payload = "{\"msgtype\":\"text\",\"text\":{\"content\":\"This HertzBeat 通知\"},\"at\":{\"isAtAll\":false}}"; // 发送POST请求 HttpResponse response = HttpRequest.post(url.toString()) .headerMap(headers, true) diff --git a/sms4j-oa-plugin/sms4j-oa-core/src/main/java/org/dromara/oa/core/weTalk/config/WeTalkConfig.java b/sms4j-oa-plugin/sms4j-oa-core/src/main/java/org/dromara/oa/core/weTalk/config/WeTalkConfig.java new file mode 100644 index 00000000..88b045b8 --- /dev/null +++ b/sms4j-oa-plugin/sms4j-oa-core/src/main/java/org/dromara/oa/core/weTalk/config/WeTalkConfig.java @@ -0,0 +1,18 @@ +package org.dromara.oa.core.weTalk.config; + +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.dromara.oa.comm.enums.OaType; +import org.dromara.oa.core.provider.config.OaBaseConfig; + +@Data +@EqualsAndHashCode(callSuper = true) +public class WeTalkConfig extends OaBaseConfig { + + private final String requestUrl = OaType.WETALK.getUrl(); + + @Override + public String getSupplier() { + return OaType.WETALK.getType(); + } +} \ No newline at end of file diff --git a/sms4j-oa-plugin/sms4j-oa-core/src/main/java/org/dromara/oa/core/weTalk/config/WeTalkFactory.java b/sms4j-oa-plugin/sms4j-oa-core/src/main/java/org/dromara/oa/core/weTalk/config/WeTalkFactory.java new file mode 100644 index 00000000..3a1969ef --- /dev/null +++ b/sms4j-oa-plugin/sms4j-oa-core/src/main/java/org/dromara/oa/core/weTalk/config/WeTalkFactory.java @@ -0,0 +1,40 @@ +package org.dromara.oa.core.weTalk.config; + +import lombok.AccessLevel; +import lombok.NoArgsConstructor; +import org.dromara.oa.comm.content.OaContent; +import org.dromara.oa.core.provider.factory.AbstractProviderFactory; +import org.dromara.oa.core.weTalk.service.WeTalkOaImpl; + +/** + * @author dongfeng + * @description 微信通知对象建造 + * @date 2023-10-22 21:00 + */ +@NoArgsConstructor(access = AccessLevel.PRIVATE) +public class WeTalkFactory extends AbstractProviderFactory { + private static final WeTalkFactory INSTANCE = new WeTalkFactory(); + + /** + * 建造一个微信通知服务 + */ + @Override + public WeTalkOaImpl createSmsOa(WeTalkConfig weTalkConfig) { + return new WeTalkOaImpl(weTalkConfig); + } + + @Override + public String getSupplier() { + return OaContent.WETALK; + } + + /** + * 获取建造者实例 + * + * @return 建造者实例 + */ + public static WeTalkFactory instance() { + return INSTANCE; + } + +} diff --git a/sms4j-oa-plugin/sms4j-oa-core/src/main/java/org/dromara/oa/core/weTalk/service/WeTalkOaImpl.java b/sms4j-oa-plugin/sms4j-oa-core/src/main/java/org/dromara/oa/core/weTalk/service/WeTalkOaImpl.java new file mode 100644 index 00000000..bc800521 --- /dev/null +++ b/sms4j-oa-plugin/sms4j-oa-core/src/main/java/org/dromara/oa/core/weTalk/service/WeTalkOaImpl.java @@ -0,0 +1,68 @@ +package org.dromara.oa.core.weTalk.service; + +import cn.hutool.json.JSONObject; +import lombok.extern.slf4j.Slf4j; +import org.dromara.oa.comm.entity.Request; +import org.dromara.oa.comm.entity.Response; +import org.dromara.oa.comm.enums.MessageType; +import org.dromara.oa.comm.enums.OaType; +import org.dromara.oa.comm.errors.OaException; +import org.dromara.oa.core.provider.service.AbstractOaBlend; +import org.dromara.oa.core.support.HttpClientImpl; +import org.dromara.oa.core.weTalk.config.WeTalkConfig; +import org.dromara.oa.core.weTalk.utils.WeTalkBuilder; + +import java.util.HashMap; +import java.util.Map; +import java.util.Objects; + +import static org.dromara.oa.comm.enums.OaType.WETALK; + +/** + * @author dongfeng + * @date 2023-10-22 21:01 + */ +@Slf4j +public class WeTalkOaImpl extends AbstractOaBlend { + + private HttpClientImpl httpClient = new HttpClientImpl(); + + public WeTalkOaImpl(WeTalkConfig config) { + super(config); + } + + @Override + public String getSupplier() { + return OaType.WETALK.getType(); + } + + @Override + public Response sender(Request request, MessageType messageType) { + + if (Objects.isNull(request.getContent())) { + throw new OaException("消息体content不能为空"); + } + StringBuilder webhook = new StringBuilder(); + JSONObject message = null; + WeTalkConfig config = getConfig(); + webhook.append(WETALK.getUrl()); + webhook.append(config.getTokenId()); + message = WeTalkBuilder.createWeTalkMessage(request, messageType); + String post; + try { + post = httpClient.post(webhook, getHeaders(), message); + log.info("请求返回结果:" + post); + } catch (Exception e) { + log.warn("请求失败问题:" + e.getMessage()); + throw new OaException(e.getMessage()); + } + // 后续解析响应体提取errorCode判断是否成功 + return new Response(true, post, config.getConfigId()); + } + + public static Map getHeaders() { + Map headers = new HashMap<>(); + headers.put("Content-Type", "application/json"); + return headers; + } +} diff --git a/sms4j-oa-plugin/sms4j-oa-core/src/main/java/org/dromara/oa/core/weTalk/utils/WeTalkBuilder.java b/sms4j-oa-plugin/sms4j-oa-core/src/main/java/org/dromara/oa/core/weTalk/utils/WeTalkBuilder.java new file mode 100644 index 00000000..11046292 --- /dev/null +++ b/sms4j-oa-plugin/sms4j-oa-core/src/main/java/org/dromara/oa/core/weTalk/utils/WeTalkBuilder.java @@ -0,0 +1,56 @@ +package org.dromara.oa.core.weTalk.utils; + +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.json.JSONObject; +import org.dromara.oa.comm.entity.Request; +import org.dromara.oa.comm.enums.MessageType; + +import java.util.List; + +import static org.dromara.oa.comm.enums.MessageType.MARKDOWN; +import static org.dromara.oa.comm.enums.MessageType.TEXT; + +/** + * @author dongfeng + * @description 微信通知签名和信息构建 + * @date 2023-10-19 13:07 + */ +public class WeTalkBuilder { + + + public static JSONObject createWeTalkMessage(Request request, MessageType messageType) { + + JSONObject message = new JSONObject(); + if (messageType == TEXT) { + message.set("msgtype", "text"); + JSONObject text = new JSONObject(); + text.set("content", request.getContent()); + boolean isContain = false; + List userIdList = request.getUserIdList(); + List phoneList = request.getPhoneList(); + Boolean isNoticeAll = request.getIsNoticeAll(); + if (!ObjectUtil.isNull(userIdList)) { + if (isNoticeAll) { + userIdList.add("@all"); + isContain = true; + } + text.set("mentioned_list", userIdList.toArray()); + } + if (!ObjectUtil.isNull(phoneList)) { + if (isNoticeAll && !isContain) { + phoneList.add("@all"); + } + text.set("mentioned_mobile_list", phoneList.toArray()); + } + message.set("text", text); + } else if (messageType == MARKDOWN) { + message.set("msgtype", "markdown"); + JSONObject markdown = new JSONObject(); + markdown.set("content", request.getContent()); + markdown.set("title", request.getTitle()); + message.set("markdown", markdown); + } + return message; + } + +} diff --git a/sms4j-oa-plugin/sms4j-oa-core/src/main/resources/META-INF/spring.factories b/sms4j-oa-plugin/sms4j-oa-core/src/main/resources/META-INF/spring.factories new file mode 100644 index 00000000..9157acc8 --- /dev/null +++ b/sms4j-oa-plugin/sms4j-oa-core/src/main/resources/META-INF/spring.factories @@ -0,0 +1,2 @@ +org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ + org.dromara.oa.core.config.OaSupplierConfig diff --git a/sms4j-oa-plugin/sms4j-oa-core/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports b/sms4j-oa-plugin/sms4j-oa-core/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports new file mode 100644 index 00000000..9dc50ba4 --- /dev/null +++ b/sms4j-oa-plugin/sms4j-oa-core/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports @@ -0,0 +1 @@ +org.dromara.oa.core.config.OaSupplierConfig diff --git a/sms4j-oa-plugin/sms4j-oa-core/src/main/resources/application.properties b/sms4j-oa-plugin/sms4j-oa-core/src/main/resources/application.properties new file mode 100644 index 00000000..8b137891 --- /dev/null +++ b/sms4j-oa-plugin/sms4j-oa-core/src/main/resources/application.properties @@ -0,0 +1 @@ + diff --git a/sms4j-spring-boot-example/src/main/resources/application.yml b/sms4j-spring-boot-example/src/main/resources/application.yml index e212bec1..61b6e526 100644 --- a/sms4j-spring-boot-example/src/main/resources/application.yml +++ b/sms4j-spring-boot-example/src/main/resources/application.yml @@ -59,4 +59,18 @@ sms: #模板ID template-id: pub_verif_short # 模版名称 - templateName: code \ No newline at end of file + templateName: code + + oas: + oaDingTalkByYaml: # configId + isEnable: true # 表示该配置是否生效(默认生效,false表示不生效) + supplier: dingding # 厂商标识 + tokenId: 您的accessKey + sign: 您的sign + oaByteTalkByYaml: # configId + supplier: feishu # 厂商标识 + tokenId: 您的accessKey + sign: 您的sign + oaWeTalkByYaml: + supplier: wetalk # 厂商标识 + tokenId: 您的sign \ No newline at end of file diff --git a/sms4j-spring-boot-example/src/test/java/org/dromara/sms4j/example/SmsOaTest.java b/sms4j-spring-boot-example/src/test/java/org/dromara/sms4j/example/SmsOaTest.java index efe9ad99..d7b4bcdb 100644 --- a/sms4j-spring-boot-example/src/test/java/org/dromara/sms4j/example/SmsOaTest.java +++ b/sms4j-spring-boot-example/src/test/java/org/dromara/sms4j/example/SmsOaTest.java @@ -1,12 +1,14 @@ package org.dromara.sms4j.example; import lombok.extern.slf4j.Slf4j; -import org.dromara.oa.comm.config.OaConfig; +import org.dromara.oa.api.OaSender; import org.dromara.oa.comm.entity.Request; import org.dromara.oa.comm.enums.MessageType; import org.dromara.oa.comm.enums.OaType; -import org.dromara.oa.core.factory.OaFactory; -import org.dromara.oa.core.service.SenderImpl; +import org.dromara.oa.core.byteTalk.config.ByteTalkConfig; +import org.dromara.oa.core.dingTalk.config.DingTalkConfig; +import org.dromara.oa.core.provider.factory.OaFactory; +import org.dromara.oa.core.weTalk.config.WeTalkConfig; import org.junit.jupiter.api.Test; import org.springframework.boot.test.context.SpringBootTest; @@ -28,27 +30,134 @@ public class SmsOaTest { * 填secret */ private static final String SIGN = ""; - /** - * 填oa的key - * value是一个OaConfig - */ - private static final String oaKey = ""; @Test public void oaDingTalkTest() { - OaFactory.put(oaKey, OaConfig.builder() - .OaType(OaType.DINGTALK.getType()) - .tokenId(TOKENID) - .sign(SIGN).build()); - SenderImpl alarm = OaFactory.createSender(oaKey); + String key = "oaDingTalk"; + DingTalkConfig dingTalkConfig = new DingTalkConfig(); + dingTalkConfig.setConfigId(key); + dingTalkConfig.setSign(SIGN); + dingTalkConfig.setTokenId(TOKENID); +// OaFactory.createAndRegisterOaSender(dingTalkConfig); + OaSender alarm = OaFactory.createAndGetOa(dingTalkConfig); Request request = new Request(); - request.setOaType(OaType.DINGTALK.getType()); ArrayList phones = new ArrayList<>(); phones.add(PHONE); - request.setPhones(phones); + request.setPhoneList(phones); + request.setIsNoticeAll(true); request.setContent("测试消息"); request.setTitle("测试消息标题"); alarm.sender(request, MessageType.TEXT); + + // 测试markdown,无法@ +// request.setContent("#### 杭州天气 @150XXXXXXXX \n > 9度,西北风1级,空气良89,相对温度73%\n > ![screenshot](https://img.alicdn.com/tfs/TB1NwmBEL9TBuNjy1zbXXXpepXa-2400-1218.png)\n > ###### 10点20分发布 [天气](https://www.dingtalk.com) \n"); +// request.setTitle("杭州天气"); +// alarm.sender(request, MessageType.MARKDOWN); + + } + + @Test + public void oaDingTalkByYamlTest() { + String configId = "oaDingTalkByYaml"; + OaSender alarm = OaFactory.getSmsOaBlend(configId); + Request request = new Request(); + ArrayList phones = new ArrayList<>(); + phones.add(PHONE); + request.setPhoneList(phones); + request.setIsNoticeAll(false); + request.setContent("HertzBeat"); + request.setTitle("HertzBeat"); + alarm.sender(request, MessageType.TEXT); + + } + + @Test + public void oaByteTalkTest() { + String configId = "oaByteTalk"; + ByteTalkConfig dingTalkConfig = new ByteTalkConfig(); + dingTalkConfig.setConfigId(configId); + dingTalkConfig.setSign(SIGN); + dingTalkConfig.setTokenId(TOKENID); + OaSender alarm = OaFactory.createAndGetOa(dingTalkConfig); + Request request = new Request(); + ArrayList userNameList = new ArrayList<>(); + userNameList.add("user1"); + userNameList.add("user2"); + request.setUserNamesList(userNameList); + request.setContent("测试消息"); + request.setIsNoticeAll(true); +// request.setTitle("测试消息标题"); + alarm.sender(request, MessageType.TEXT); + } + + + @Test + public void oaByteTalkByYamlTest() { + String configId = "oaByteTalkByYaml"; + OaSender alarm = OaFactory.getSmsOaBlend(configId); + Request request = new Request(); + request.setOaType(OaType.BYTETALK.getType()); + ArrayList userNameList = new ArrayList<>(); + userNameList.add("user1"); + userNameList.add("user2"); + request.setUserNamesList(userNameList); + request.setContent("测试消息"); + request.setIsNoticeAll(true); +// request.setTitle("测试消息标题"); + alarm.sender(request, MessageType.TEXT); + } + + @Test + public void oaWeTalkTest() { + String configId = "oaWeTalk"; + WeTalkConfig weTalkConfig = new WeTalkConfig(); + weTalkConfig.setConfigId(configId); + weTalkConfig.setTokenId(TOKENID); + OaSender alarm = OaFactory.createAndGetOa(weTalkConfig); + Request request = new Request(); + ArrayList phones = new ArrayList<>(); + phones.add(PHONE); + phones.add("131"); + request.setPhoneList(phones); + ArrayList userIds = new ArrayList<>(); + userIds.add("123"); + request.setUserIdList(userIds); +// request.setIsNoticeAll(true); + request.setContent("测试消息"); + request.setTitle("测试消息标题"); + alarm.sender(request, MessageType.TEXT); + + // 测试markdown,无法@ + // 企业微信的markdown直接是content,没有title +// request.setContent("#### 杭州天气 @150XXXXXXXX \n > 9度,西北风1级,空气良89,相对温度73%\n > ![screenshot](https://img.alicdn.com/tfs/TB1NwmBEL9TBuNjy1zbXXXpepXa-2400-1218.png)\n > ###### 10点20分发布 [天气](https://www.dingtalk.com) \n"); +// request.setTitle("杭州天气"); +// alarm.sender(request, MessageType.MARKDOWN); + } + + + @Test + public void oaWeTalkByYamlTest() { + String configId = "oaWeTalkByYaml"; + OaSender alarm = OaFactory.getSmsOaBlend(configId); + Request request = new Request(); + request.setOaType(OaType.WETALK.getType()); + ArrayList phones = new ArrayList<>(); + phones.add(PHONE); + phones.add("131"); + request.setPhoneList(phones); + ArrayList userIds = new ArrayList<>(); + userIds.add("123"); + request.setUserIdList(userIds); +// request.setIsNoticeAll(true); + request.setContent("测试消息"); + request.setTitle("测试消息标题"); + alarm.sender(request, MessageType.TEXT); + + // 测试markdown,无法@ + // 企业微信的markdown直接是content,没有title +// request.setContent("#### 杭州天气 @150XXXXXXXX \n > 9度,西北风1级,空气良89,相对温度73%\n > ![screenshot](https://img.alicdn.com/tfs/TB1NwmBEL9TBuNjy1zbXXXpepXa-2400-1218.png)\n > ###### 10点20分发布 [天气](https://www.dingtalk.com) \n"); +// request.setTitle("杭州天气"); +// alarm.sender(request, MessageType.MARKDOWN); } } From 51fc6227618ed14579d708ab81a415d4b28f97fe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=B8=9C=E9=A3=8E?= <1335799468@qq.com> Date: Mon, 27 Nov 2023 22:03:45 +0800 Subject: [PATCH 3/5] =?UTF-8?q?oa=E6=9B=B4=E6=96=B0:1.=E6=94=AF=E6=8C=81te?= =?UTF-8?q?xt,markdown,link=E6=B6=88=E6=81=AF=E6=A0=BC=E5=BC=8F=E3=80=822.?= =?UTF-8?q?=E6=94=AF=E6=8C=81=E5=BC=82=E6=AD=A5=E5=8F=91=E9=80=81,?= =?UTF-8?q?=E4=BC=98=E5=85=88=E7=BA=A7=E6=B6=88=E6=81=AF=E3=80=823.yaml?= =?UTF-8?q?=E9=85=8D=E7=BD=AE=E6=96=B0=E5=A2=9E=E5=B1=9E=E6=80=A7--?= =?UTF-8?q?=E8=AF=A5=E9=85=8D=E7=BD=AE=E6=98=AF=E5=90=A6=E5=BC=80=E5=90=AF?= =?UTF-8?q?=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/org/dromara/oa/api/OaCallBack.java | 12 + .../java/org/dromara/oa/api/OaSender.java | 21 ++ .../org/dromara/oa/comm/entity/Request.java | 20 +- .../dromara/oa/comm/errors/OaException.java | 4 + .../oa/comm/task/delayed/DelayedTime.java | 18 ++ sms4j-oa-plugin/sms4j-oa-core/pom.xml | 13 - .../core/byteTalk/config/ByteTalkFactory.java | 4 +- .../oa/core/config/OaBlendsInitializer.java | 16 +- .../dromara/oa/core/config/OaMainConfig.java | 46 ++++ .../oa/core/config/OaSupplierConfig.java | 12 +- .../core/dingTalk/config/DingTalkFactory.java | 7 +- .../core/dingTalk/service/DingTalkOaImpl.java | 20 +- .../core/dingTalk/utils/DingTalkBuilder.java | 41 ++- .../oa/core/provider/config/OaBaseConfig.java | 3 + .../oa/core/provider/config/OaConfig.java | 31 +++ ...ry.java => OaAbstractProviderFactory.java} | 4 +- ...actory.java => OaBaseProviderFactory.java} | 4 +- .../core/provider/factory/OaBeanFactory.java | 85 ++++++ .../oa/core/provider/factory/OaFactory.java | 4 +- .../factory/ProviderFactoryHolder.java | 10 +- .../provider/service/AbstractOaBlend.java | 61 ++++ .../oa/core/weTalk/config/WeTalkFactory.java | 4 +- .../main/resources/META-INF/spring.factories | 1 + ...ot.autoconfigure.AutoConfiguration.imports | 3 +- .../src/main/resources/application.yml | 10 +- .../org/dromara/sms4j/example/SmsOaTest.java | 260 ++++++++++-------- 26 files changed, 552 insertions(+), 162 deletions(-) create mode 100644 sms4j-oa-plugin/sms4j-oa-api/src/main/java/org/dromara/oa/api/OaCallBack.java create mode 100644 sms4j-oa-plugin/sms4j-oa-comm/src/main/java/org/dromara/oa/comm/task/delayed/DelayedTime.java create mode 100644 sms4j-oa-plugin/sms4j-oa-core/src/main/java/org/dromara/oa/core/config/OaMainConfig.java create mode 100644 sms4j-oa-plugin/sms4j-oa-core/src/main/java/org/dromara/oa/core/provider/config/OaConfig.java rename sms4j-oa-plugin/sms4j-oa-core/src/main/java/org/dromara/oa/core/provider/factory/{AbstractProviderFactory.java => OaAbstractProviderFactory.java} (82%) rename sms4j-oa-plugin/sms4j-oa-core/src/main/java/org/dromara/oa/core/provider/factory/{BaseProviderFactory.java => OaBaseProviderFactory.java} (79%) create mode 100644 sms4j-oa-plugin/sms4j-oa-core/src/main/java/org/dromara/oa/core/provider/factory/OaBeanFactory.java diff --git a/sms4j-oa-plugin/sms4j-oa-api/src/main/java/org/dromara/oa/api/OaCallBack.java b/sms4j-oa-plugin/sms4j-oa-api/src/main/java/org/dromara/oa/api/OaCallBack.java new file mode 100644 index 00000000..a18b2210 --- /dev/null +++ b/sms4j-oa-plugin/sms4j-oa-api/src/main/java/org/dromara/oa/api/OaCallBack.java @@ -0,0 +1,12 @@ +package org.dromara.oa.api; + +import org.dromara.oa.comm.entity.Response; + +/** + * @author dongfeng + * @date 2023-10-28 14:26 + */ +@FunctionalInterface +public interface OaCallBack { + void callBack(Response smsResponse); +} diff --git a/sms4j-oa-plugin/sms4j-oa-api/src/main/java/org/dromara/oa/api/OaSender.java b/sms4j-oa-plugin/sms4j-oa-api/src/main/java/org/dromara/oa/api/OaSender.java index 8b079c36..34b54145 100644 --- a/sms4j-oa-plugin/sms4j-oa-api/src/main/java/org/dromara/oa/api/OaSender.java +++ b/sms4j-oa-plugin/sms4j-oa-api/src/main/java/org/dromara/oa/api/OaSender.java @@ -20,4 +20,25 @@ public interface OaSender { * 发送消息 */ Response sender(Request request, MessageType messageType); + + /** + * 异步(回调) + */ + void senderAsync(Request request, MessageType messageType); + + /** + * 异步(不回调) + * @param request oa请求体 + * @param messageType 消息类型 + * @param callBack 回调方法 + */ + void senderAsync(Request request, MessageType messageType, OaCallBack callBack); + + /** + * 发送带优先级的消息 + * @param request oa请求体 + * @param messageType 消息类型 + */ + + void senderAsyncByPriority(Request request, MessageType messageType); } diff --git a/sms4j-oa-plugin/sms4j-oa-comm/src/main/java/org/dromara/oa/comm/entity/Request.java b/sms4j-oa-plugin/sms4j-oa-comm/src/main/java/org/dromara/oa/comm/entity/Request.java index a1e6ee95..1a574d70 100644 --- a/sms4j-oa-plugin/sms4j-oa-comm/src/main/java/org/dromara/oa/comm/entity/Request.java +++ b/sms4j-oa-plugin/sms4j-oa-comm/src/main/java/org/dromara/oa/comm/entity/Request.java @@ -2,17 +2,25 @@ package org.dromara.oa.comm.entity; import lombok.Data; +import org.dromara.oa.comm.enums.MessageType; +import java.util.Collection; import java.util.List; @Data -public class Request { +public class Request implements Comparable { // 标题 private String title; // 消息内容 private String content; + // link类型的参数 + private String picUrl; + + // link类型的参数 + private String messageUrl; + private List phoneList; private List userIdList; @@ -24,4 +32,14 @@ public class Request { // oa类型 private String oaType; + // 优先级 + private Integer priority; + + // 消息类型,用于优先级队列 + private MessageType messageType; + + @Override + public int compareTo(Request other) { + return Integer.compare(other.priority,this.priority); + } } diff --git a/sms4j-oa-plugin/sms4j-oa-comm/src/main/java/org/dromara/oa/comm/errors/OaException.java b/sms4j-oa-plugin/sms4j-oa-comm/src/main/java/org/dromara/oa/comm/errors/OaException.java index d3a19e49..ce6046e2 100644 --- a/sms4j-oa-plugin/sms4j-oa-comm/src/main/java/org/dromara/oa/comm/errors/OaException.java +++ b/sms4j-oa-plugin/sms4j-oa-comm/src/main/java/org/dromara/oa/comm/errors/OaException.java @@ -9,4 +9,8 @@ public class OaException extends RuntimeException { public OaException(String message) { super(message); } + + public OaException(String message,String configId) { + super("configId为{"+configId+"}抛出异常:"+message); + } } diff --git a/sms4j-oa-plugin/sms4j-oa-comm/src/main/java/org/dromara/oa/comm/task/delayed/DelayedTime.java b/sms4j-oa-plugin/sms4j-oa-comm/src/main/java/org/dromara/oa/comm/task/delayed/DelayedTime.java new file mode 100644 index 00000000..25f2a6dc --- /dev/null +++ b/sms4j-oa-plugin/sms4j-oa-comm/src/main/java/org/dromara/oa/comm/task/delayed/DelayedTime.java @@ -0,0 +1,18 @@ +package org.dromara.oa.comm.task.delayed; + +import java.util.Timer; +import java.util.TimerTask; + +public class DelayedTime { + + private final Timer timer = new Timer(true); + + + /** + * 延迟队列添加新任务 + */ + public void schedule(TimerTask task, long delay) { + timer.schedule(task,delay); + } + +} diff --git a/sms4j-oa-plugin/sms4j-oa-core/pom.xml b/sms4j-oa-plugin/sms4j-oa-core/pom.xml index d29874d6..32520f0b 100644 --- a/sms4j-oa-plugin/sms4j-oa-core/pom.xml +++ b/sms4j-oa-plugin/sms4j-oa-core/pom.xml @@ -26,19 +26,6 @@ org.slf4j slf4j-api - - com.sun.activation - javax.activation - - - - jakarta.activation - jakarta.activation-api - - - com.sun.mail - javax.mail - cn.hutool hutool-json diff --git a/sms4j-oa-plugin/sms4j-oa-core/src/main/java/org/dromara/oa/core/byteTalk/config/ByteTalkFactory.java b/sms4j-oa-plugin/sms4j-oa-core/src/main/java/org/dromara/oa/core/byteTalk/config/ByteTalkFactory.java index a92a1d99..29b1a1bd 100644 --- a/sms4j-oa-plugin/sms4j-oa-core/src/main/java/org/dromara/oa/core/byteTalk/config/ByteTalkFactory.java +++ b/sms4j-oa-plugin/sms4j-oa-core/src/main/java/org/dromara/oa/core/byteTalk/config/ByteTalkFactory.java @@ -4,7 +4,7 @@ import lombok.AccessLevel; import lombok.NoArgsConstructor; import org.dromara.oa.comm.content.OaContent; import org.dromara.oa.core.byteTalk.service.ByteTalkOaImpl; -import org.dromara.oa.core.provider.factory.AbstractProviderFactory; +import org.dromara.oa.core.provider.factory.OaAbstractProviderFactory; /** * @author dongfeng @@ -12,7 +12,7 @@ import org.dromara.oa.core.provider.factory.AbstractProviderFactory; * @date 2023-10-22 21:00 */ @NoArgsConstructor(access = AccessLevel.PRIVATE) -public class ByteTalkFactory extends AbstractProviderFactory { +public class ByteTalkFactory extends OaAbstractProviderFactory { private static final ByteTalkFactory INSTANCE = new ByteTalkFactory(); /** diff --git a/sms4j-oa-plugin/sms4j-oa-core/src/main/java/org/dromara/oa/core/config/OaBlendsInitializer.java b/sms4j-oa-plugin/sms4j-oa-core/src/main/java/org/dromara/oa/core/config/OaBlendsInitializer.java index 5ef7626b..0fa3d9c4 100644 --- a/sms4j-oa-plugin/sms4j-oa-core/src/main/java/org/dromara/oa/core/config/OaBlendsInitializer.java +++ b/sms4j-oa-plugin/sms4j-oa-core/src/main/java/org/dromara/oa/core/config/OaBlendsInitializer.java @@ -9,7 +9,8 @@ import org.dromara.oa.comm.config.OaSupplierConfig; import org.dromara.oa.comm.content.OaContent; import org.dromara.oa.core.byteTalk.config.ByteTalkFactory; import org.dromara.oa.core.dingTalk.config.DingTalkFactory; -import org.dromara.oa.core.provider.factory.BaseProviderFactory; +import org.dromara.oa.core.provider.config.OaConfig; +import org.dromara.oa.core.provider.factory.OaBaseProviderFactory; import org.dromara.oa.core.provider.factory.OaFactory; import org.dromara.oa.core.provider.factory.ProviderFactoryHolder; import org.dromara.oa.core.weTalk.config.WeTalkFactory; @@ -25,12 +26,18 @@ import java.util.Map; @Slf4j public class OaBlendsInitializer { - private List> factoryList; + private List> factoryList; + private final OaConfig oaConfig; private final Map> blends; - public OaBlendsInitializer(Map> oas + public OaBlendsInitializer( + List> factoryList, + OaConfig oaConfig, + Map> oas ) { + this.factoryList=factoryList; + this.oaConfig = oaConfig; this.blends = oas; onApplicationEvent(); } @@ -41,12 +48,13 @@ public class OaBlendsInitializer { for (String configId : blends.keySet()) { Map configMap = blends.get(configId); if (Boolean.FALSE.equals(configMap.get("isEnable"))) { + log.warn("configId为"+configId+"的配置未启用,请注意是否需要开启"); continue; } Object supplierObj = configMap.get(OaContent.SUPPLIER_KEY); String supplier = supplierObj == null ? "" : String.valueOf(supplierObj); supplier = StrUtil.isEmpty(supplier) ? configId : supplier; - BaseProviderFactory providerFactory = (BaseProviderFactory) ProviderFactoryHolder.requireForSupplier(supplier); + OaBaseProviderFactory providerFactory = (OaBaseProviderFactory) ProviderFactoryHolder.requireForSupplier(supplier); if (providerFactory == null) { log.warn("创建\"{}\"的通知webhook服务失败,未找到供应商为\"{}\"的服务", configId, supplier); continue; diff --git a/sms4j-oa-plugin/sms4j-oa-core/src/main/java/org/dromara/oa/core/config/OaMainConfig.java b/sms4j-oa-plugin/sms4j-oa-core/src/main/java/org/dromara/oa/core/config/OaMainConfig.java new file mode 100644 index 00000000..86751962 --- /dev/null +++ b/sms4j-oa-plugin/sms4j-oa-core/src/main/java/org/dromara/oa/core/config/OaMainConfig.java @@ -0,0 +1,46 @@ +package org.dromara.oa.core.config; + +import lombok.Data; +import org.dromara.oa.comm.task.delayed.DelayedTime; +import org.dromara.oa.core.provider.config.OaConfig; +import org.dromara.oa.core.provider.factory.OaBeanFactory; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Lazy; + +import java.util.concurrent.Executor; + +/** + * @author dongfeng + * @description TODO + * @date 2023-11-01 18:05 + */ +@Data +public class OaMainConfig { + + @Bean + @ConfigurationProperties(prefix = "sms-oa") //指定配置文件注入属性前缀 + @ConditionalOnProperty(prefix = "sms-oa", name = "config-type", havingValue = "yaml") + protected OaConfig oaConfig() { + return OaBeanFactory.getSmsConfig(); + } + + /** + * 注入一个定时器 + */ + @Bean("oaDelayedTime") + @Lazy + protected DelayedTime delayedTime() { + return OaBeanFactory.getDelayedTime(); + } + + /** + * 注入线程池 + */ + @Bean("oaExecutor") + protected Executor taskExecutor(OaConfig config) { + return OaBeanFactory.setExecutor(config); + } + +} diff --git a/sms4j-oa-plugin/sms4j-oa-core/src/main/java/org/dromara/oa/core/config/OaSupplierConfig.java b/sms4j-oa-plugin/sms4j-oa-core/src/main/java/org/dromara/oa/core/config/OaSupplierConfig.java index 184429d6..8c4a2acb 100644 --- a/sms4j-oa-plugin/sms4j-oa-core/src/main/java/org/dromara/oa/core/config/OaSupplierConfig.java +++ b/sms4j-oa-plugin/sms4j-oa-core/src/main/java/org/dromara/oa/core/config/OaSupplierConfig.java @@ -1,10 +1,14 @@ package org.dromara.oa.core.config; +import org.dromara.oa.api.OaSender; +import org.dromara.oa.core.provider.config.OaConfig; +import org.dromara.oa.core.provider.factory.OaBaseProviderFactory; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.context.annotation.Bean; import java.util.LinkedHashMap; +import java.util.List; import java.util.Map; /** @@ -16,8 +20,8 @@ public class OaSupplierConfig { * 注入配置 */ @Bean - @ConfigurationProperties(prefix = "sms.oas") - @ConditionalOnProperty(prefix = "sms", name = "config-type", havingValue = "yaml") + @ConfigurationProperties(prefix = "sms-oa.oas") + @ConditionalOnProperty(prefix = "sms-oa", name = "config-type", havingValue = "yaml") protected Map> oas() { return new LinkedHashMap<>(); } @@ -25,7 +29,9 @@ public class OaSupplierConfig { @Bean protected OaBlendsInitializer smsOasInitializer( + List> factoryList, + OaConfig oaConfig, Map> oas) { - return new OaBlendsInitializer(oas); + return new OaBlendsInitializer(factoryList,oaConfig,oas); } } diff --git a/sms4j-oa-plugin/sms4j-oa-core/src/main/java/org/dromara/oa/core/dingTalk/config/DingTalkFactory.java b/sms4j-oa-plugin/sms4j-oa-core/src/main/java/org/dromara/oa/core/dingTalk/config/DingTalkFactory.java index a80408f1..32b4ef15 100644 --- a/sms4j-oa-plugin/sms4j-oa-core/src/main/java/org/dromara/oa/core/dingTalk/config/DingTalkFactory.java +++ b/sms4j-oa-plugin/sms4j-oa-core/src/main/java/org/dromara/oa/core/dingTalk/config/DingTalkFactory.java @@ -4,7 +4,9 @@ import lombok.AccessLevel; import lombok.NoArgsConstructor; import org.dromara.oa.comm.content.OaContent; import org.dromara.oa.core.dingTalk.service.DingTalkOaImpl; -import org.dromara.oa.core.provider.factory.AbstractProviderFactory; +import org.dromara.oa.core.provider.factory.OaAbstractProviderFactory; + +import java.util.concurrent.Executor; /** * @author dongfeng @@ -12,7 +14,7 @@ import org.dromara.oa.core.provider.factory.AbstractProviderFactory; * @date 2023-10-22 21:00 */ @NoArgsConstructor(access = AccessLevel.PRIVATE) -public class DingTalkFactory extends AbstractProviderFactory { +public class DingTalkFactory extends OaAbstractProviderFactory { private static final DingTalkFactory INSTANCE = new DingTalkFactory(); /** @@ -23,6 +25,7 @@ public class DingTalkFactory extends AbstractProviderFactory { super(config); } + /** + * 建造一个微信通知对象服务 + */ + public DingTalkOaImpl(DingTalkConfig config, Executor pool) { + super(config,pool); + } + @Override public String getSupplier() { - return OaType.DINGTALK.getType(); + return getConfig().getSupplier(); } @Override public Response sender(Request request, MessageType messageType) { - + try { + Thread.sleep(10000L); + } catch (InterruptedException e) { + throw new RuntimeException(e); + } if (Objects.isNull(request.getContent())) { - throw new OaException("消息体content不能为空"); + throw new OaException("消息体content不能为空",getConfig().getConfigId()); } StringBuilder webhook = new StringBuilder(); JSONObject message = null; @@ -62,7 +74,7 @@ public class DingTalkOaImpl extends AbstractOaBlend { log.info("请求返回结果:" + post); } catch (Exception e) { log.warn("请求失败问题:" + e.getMessage()); - throw new OaException(e.getMessage()); + throw new OaException(e.getMessage(),getConfig().getConfigId()); } // 后续解析响应体提取errorCode判断是否成功 return new Response(true, post, config.getConfigId()); diff --git a/sms4j-oa-plugin/sms4j-oa-core/src/main/java/org/dromara/oa/core/dingTalk/utils/DingTalkBuilder.java b/sms4j-oa-plugin/sms4j-oa-core/src/main/java/org/dromara/oa/core/dingTalk/utils/DingTalkBuilder.java index e23aadf8..7b0130f9 100644 --- a/sms4j-oa-plugin/sms4j-oa-core/src/main/java/org/dromara/oa/core/dingTalk/utils/DingTalkBuilder.java +++ b/sms4j-oa-plugin/sms4j-oa-core/src/main/java/org/dromara/oa/core/dingTalk/utils/DingTalkBuilder.java @@ -1,5 +1,6 @@ package org.dromara.oa.core.dingTalk.utils; +import cn.hutool.json.JSONArray; import cn.hutool.json.JSONObject; import org.dromara.oa.comm.entity.Request; import org.dromara.oa.comm.enums.MessageType; @@ -12,9 +13,10 @@ import java.nio.charset.StandardCharsets; import java.security.InvalidKeyException; import java.security.NoSuchAlgorithmException; import java.util.Base64; +import java.util.List; +import java.util.Objects; -import static org.dromara.oa.comm.enums.MessageType.MARKDOWN; -import static org.dromara.oa.comm.enums.MessageType.TEXT; +import static org.dromara.oa.comm.enums.MessageType.*; /** * @author dongfeng @@ -45,26 +47,47 @@ public class DingTalkBuilder { public static JSONObject createMessage(Request request, MessageType messageType) { + + JSONObject message = new JSONObject(); if (messageType == TEXT) { message.set("msgtype", "text"); JSONObject text = new JSONObject(); text.set("content", request.getContent()); - JSONObject at = new JSONObject(); - at.set("atMobiles", request.getPhoneList()); - at.set("isAtAll", request.getIsNoticeAll()); - message.set("at", at); message.set("text", text); } else if (messageType == MARKDOWN) { message.set("msgtype", "markdown"); JSONObject markdown = new JSONObject(); markdown.set("text", request.getContent()); markdown.set("title", request.getTitle()); - JSONObject at = new JSONObject(); - at.set("atMobiles", request.getPhoneList()); - message.set("at", at); message.set("markdown", markdown); + } else if (messageType == LINK) { + message.set("msgtype", "link"); + JSONObject link = new JSONObject(); + link.set("text", request.getContent()); + link.set("title", request.getTitle()); + link.set("picUrl", request.getPicUrl()); + link.set("messageUrl", request.getMessageUrl()); + message.set("link", link); } + + + // 处理提到的人 + JSONObject at = new JSONObject(); + List phoneList = request.getPhoneList(); + List userIdList = request.getUserIdList(); + if(!Objects.isNull(phoneList)){ + JSONArray phoneArray = new JSONArray(); + phoneList.forEach(phoneArray::set); + at.set("atMobiles", phoneArray); + } + if(!Objects.isNull(userIdList)){ + JSONArray userIdArray = new JSONArray(); + userIdList.forEach(userIdArray::set); + at.set("atUserIds", userIdArray); + } + at.set("isAtAll", request.getIsNoticeAll()); + message.set("at", at); return message; } } diff --git a/sms4j-oa-plugin/sms4j-oa-core/src/main/java/org/dromara/oa/core/provider/config/OaBaseConfig.java b/sms4j-oa-plugin/sms4j-oa-core/src/main/java/org/dromara/oa/core/provider/config/OaBaseConfig.java index 68ba0e45..d33dc529 100644 --- a/sms4j-oa-plugin/sms4j-oa-core/src/main/java/org/dromara/oa/core/provider/config/OaBaseConfig.java +++ b/sms4j-oa-plugin/sms4j-oa-core/src/main/java/org/dromara/oa/core/provider/config/OaBaseConfig.java @@ -19,6 +19,9 @@ public abstract class OaBaseConfig implements OaSupplierConfig { private String tokenId; private String sign; + /** + * 默认开启 + */ private Boolean isEnable = true; diff --git a/sms4j-oa-plugin/sms4j-oa-core/src/main/java/org/dromara/oa/core/provider/config/OaConfig.java b/sms4j-oa-plugin/sms4j-oa-core/src/main/java/org/dromara/oa/core/provider/config/OaConfig.java new file mode 100644 index 00000000..b01b4c92 --- /dev/null +++ b/sms4j-oa-plugin/sms4j-oa-core/src/main/java/org/dromara/oa/core/provider/config/OaConfig.java @@ -0,0 +1,31 @@ +package org.dromara.oa.core.provider.config; + +import lombok.Data; + +/** + * @author dongfeng + * @description TODO + * @date 2023-11-01 17:55 + */ +@Data +public class OaConfig { + /** + * 核心线程池大小 + */ + private Integer corePoolSize = 10; + + /** + * 最大线程数 + */ + private Integer maxPoolSize = 30; + + /** + * 队列容量 + */ + private Integer queueCapacity = 50; + + /** + * 设置线程池关闭的时候等待所有任务都完成再继续销毁其他的Bean + */ + private Boolean shutdownStrategy = true; +} diff --git a/sms4j-oa-plugin/sms4j-oa-core/src/main/java/org/dromara/oa/core/provider/factory/AbstractProviderFactory.java b/sms4j-oa-plugin/sms4j-oa-core/src/main/java/org/dromara/oa/core/provider/factory/OaAbstractProviderFactory.java similarity index 82% rename from sms4j-oa-plugin/sms4j-oa-core/src/main/java/org/dromara/oa/core/provider/factory/AbstractProviderFactory.java rename to sms4j-oa-plugin/sms4j-oa-core/src/main/java/org/dromara/oa/core/provider/factory/OaAbstractProviderFactory.java index 3281c24d..687f81f5 100644 --- a/sms4j-oa-plugin/sms4j-oa-core/src/main/java/org/dromara/oa/core/provider/factory/AbstractProviderFactory.java +++ b/sms4j-oa-plugin/sms4j-oa-core/src/main/java/org/dromara/oa/core/provider/factory/OaAbstractProviderFactory.java @@ -6,11 +6,11 @@ import org.dromara.oa.comm.config.OaSupplierConfig; import java.lang.reflect.ParameterizedType; import java.lang.reflect.Type; -public abstract class AbstractProviderFactory implements BaseProviderFactory { +public abstract class OaAbstractProviderFactory implements OaBaseProviderFactory { private Class configClass; - public AbstractProviderFactory() { + public OaAbstractProviderFactory() { Type genericSuperclass = getClass().getGenericSuperclass(); if (genericSuperclass instanceof ParameterizedType) { ParameterizedType paramType = (ParameterizedType) genericSuperclass; diff --git a/sms4j-oa-plugin/sms4j-oa-core/src/main/java/org/dromara/oa/core/provider/factory/BaseProviderFactory.java b/sms4j-oa-plugin/sms4j-oa-core/src/main/java/org/dromara/oa/core/provider/factory/OaBaseProviderFactory.java similarity index 79% rename from sms4j-oa-plugin/sms4j-oa-core/src/main/java/org/dromara/oa/core/provider/factory/BaseProviderFactory.java rename to sms4j-oa-plugin/sms4j-oa-core/src/main/java/org/dromara/oa/core/provider/factory/OaBaseProviderFactory.java index d16765d4..e6c2300c 100644 --- a/sms4j-oa-plugin/sms4j-oa-core/src/main/java/org/dromara/oa/core/provider/factory/BaseProviderFactory.java +++ b/sms4j-oa-plugin/sms4j-oa-core/src/main/java/org/dromara/oa/core/provider/factory/OaBaseProviderFactory.java @@ -3,7 +3,9 @@ package org.dromara.oa.core.provider.factory; import org.dromara.oa.api.OaSender; import org.dromara.oa.comm.config.OaSupplierConfig; -public interface BaseProviderFactory { +import java.util.concurrent.Executor; + +public interface OaBaseProviderFactory { /** * 创建通知webhook实现对象 diff --git a/sms4j-oa-plugin/sms4j-oa-core/src/main/java/org/dromara/oa/core/provider/factory/OaBeanFactory.java b/sms4j-oa-plugin/sms4j-oa-core/src/main/java/org/dromara/oa/core/provider/factory/OaBeanFactory.java new file mode 100644 index 00000000..60750969 --- /dev/null +++ b/sms4j-oa-plugin/sms4j-oa-core/src/main/java/org/dromara/oa/core/provider/factory/OaBeanFactory.java @@ -0,0 +1,85 @@ +package org.dromara.oa.core.provider.factory; + +import org.dromara.oa.comm.task.delayed.DelayedTime; +import org.dromara.oa.comm.entity.Request; +import org.dromara.oa.core.provider.config.OaConfig; + +import java.util.concurrent.*; + +public class OaBeanFactory { + + /** 定时器*/ + private static DelayedTime delayedTime; + + /** 线程池*/ + private static Executor executor; + + /** 核心配置信息*/ + private static OaConfig oaConfig; + + /** 优先级队列*/ + private static PriorityBlockingQueue priorityBlockingQueue; + + /** 优先级队列*/ + private static Boolean priorityExecutorThreadStatus = false; + + private OaBeanFactory() { + } + + public static DelayedTime getDelayedTime() { + if (delayedTime == null){ + delayedTime = new DelayedTime(); + } + return delayedTime; + } + + public static Executor setExecutor(OaConfig config) { + if (executor == null){ + // 创建一个线程池对象 + ThreadPoolExecutor ex = new ThreadPoolExecutor( + config.getCorePoolSize(), + config.getMaxPoolSize(), + config.getQueueCapacity(), + TimeUnit.SECONDS, + new ArrayBlockingQueue<>(config.getMaxPoolSize()) + ); + // 线程池对拒绝任务的处理策略,当线程池没有处理能力的时候,该策略会直接在 execute 方法的调用线程中运行被拒绝的任务;如果执行程序已关闭,则会丢弃该任务 + ex.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy()); + executor = ex; + } + return executor; + } + + public static PriorityBlockingQueue initPriorityBlockingQueue() { + if (priorityBlockingQueue == null){ + // 创建一个线程池对象 + priorityBlockingQueue=new PriorityBlockingQueue<>(); + } + return priorityBlockingQueue; + } + + public static Executor getExecutor() { + return executor; + } + + public static OaConfig getSmsConfig(){ + if (oaConfig == null){ + oaConfig = new OaConfig(); + } + return oaConfig; + } + + public static PriorityBlockingQueue getPriorityBlockingQueue(){ + return priorityBlockingQueue; + } + + public static Boolean getPriorityExecutorThreadStatus() { + return priorityExecutorThreadStatus; + } + + public static Boolean setPriorityExecutorThreadStatus(Boolean bo) { + priorityExecutorThreadStatus=bo; + return priorityExecutorThreadStatus; + } + +} diff --git a/sms4j-oa-plugin/sms4j-oa-core/src/main/java/org/dromara/oa/core/provider/factory/OaFactory.java b/sms4j-oa-plugin/sms4j-oa-core/src/main/java/org/dromara/oa/core/provider/factory/OaFactory.java index 487ae81a..3d33f9e8 100644 --- a/sms4j-oa-plugin/sms4j-oa-core/src/main/java/org/dromara/oa/core/provider/factory/OaFactory.java +++ b/sms4j-oa-plugin/sms4j-oa-core/src/main/java/org/dromara/oa/core/provider/factory/OaFactory.java @@ -33,9 +33,9 @@ public class OaFactory { } public static OaSender createAndGetOa(OaSupplierConfig config) { - BaseProviderFactory factory = ProviderFactoryHolder.requireForSupplier(config.getSupplier()); + OaBaseProviderFactory factory = ProviderFactoryHolder.requireForSupplier(config.getSupplier()); if (factory == null) { - throw new OaException("不支持当前供应商配置"); + throw new OaException("不支持"+config.getSupplier()+"供应商配置"); } return factory.createSmsOa(config); } diff --git a/sms4j-oa-plugin/sms4j-oa-core/src/main/java/org/dromara/oa/core/provider/factory/ProviderFactoryHolder.java b/sms4j-oa-plugin/sms4j-oa-core/src/main/java/org/dromara/oa/core/provider/factory/ProviderFactoryHolder.java index 02270949..9502d48a 100644 --- a/sms4j-oa-plugin/sms4j-oa-core/src/main/java/org/dromara/oa/core/provider/factory/ProviderFactoryHolder.java +++ b/sms4j-oa-plugin/sms4j-oa-core/src/main/java/org/dromara/oa/core/provider/factory/ProviderFactoryHolder.java @@ -16,20 +16,20 @@ import java.util.concurrent.ConcurrentHashMap; public class ProviderFactoryHolder { - private static final Map> factories = new ConcurrentHashMap<>(); + private static final Map> factories = new ConcurrentHashMap<>(); - public static void registerFactory(BaseProviderFactory factory) { + public static void registerFactory(OaBaseProviderFactory factory) { if (factory == null) { throw new OaException("注册供应商工厂失败,工厂实例不能为空"); } factories.put(factory.getSupplier(), factory); } - public static void registerFactory(List> factoryList) { + public static void registerFactory(List> factoryList) { if (CollUtil.isEmpty(factoryList)) { return; } - for (BaseProviderFactory factory : factoryList) { + for (OaBaseProviderFactory factory : factoryList) { if (factory == null) { continue; } @@ -37,7 +37,7 @@ public class ProviderFactoryHolder { } } - public static BaseProviderFactory requireForSupplier(String supplier) { + public static OaBaseProviderFactory requireForSupplier(String supplier) { return factories.getOrDefault(supplier, null); } } diff --git a/sms4j-oa-plugin/sms4j-oa-core/src/main/java/org/dromara/oa/core/provider/service/AbstractOaBlend.java b/sms4j-oa-plugin/sms4j-oa-core/src/main/java/org/dromara/oa/core/provider/service/AbstractOaBlend.java index f8dbe026..382ac2de 100644 --- a/sms4j-oa-plugin/sms4j-oa-core/src/main/java/org/dromara/oa/core/provider/service/AbstractOaBlend.java +++ b/sms4j-oa-plugin/sms4j-oa-core/src/main/java/org/dromara/oa/core/provider/service/AbstractOaBlend.java @@ -2,8 +2,18 @@ package org.dromara.oa.core.provider.service; import cn.hutool.core.util.StrUtil; import lombok.Getter; +import org.dromara.oa.api.OaCallBack; import org.dromara.oa.api.OaSender; import org.dromara.oa.comm.config.OaSupplierConfig; +import org.dromara.oa.comm.entity.Request; +import org.dromara.oa.comm.entity.Response; +import org.dromara.oa.comm.enums.MessageType; +import org.dromara.oa.core.provider.factory.OaBeanFactory; + +import java.util.Objects; +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.Executor; +import java.util.concurrent.PriorityBlockingQueue; /** * @author dongfeng @@ -16,12 +26,63 @@ public abstract class AbstractOaBlend implements OaS private final C config; + protected final Executor pool; + + protected final PriorityBlockingQueue priorityQueueMap; + + protected AbstractOaBlend(C config, Executor pool) { + this.configId = StrUtil.isEmpty(config.getConfigId()) ? getSupplier() : config.getConfigId(); + this.config = config; + this.pool = pool; + this.priorityQueueMap = OaBeanFactory.initPriorityBlockingQueue(); + priorityQueueMapThreadInit(); + } + protected AbstractOaBlend(C config) { this.configId = StrUtil.isEmpty(config.getConfigId()) ? getSupplier() : config.getConfigId(); this.config = config; + this.pool = OaBeanFactory.getExecutor(); + this.priorityQueueMap = OaBeanFactory.initPriorityBlockingQueue(); + priorityQueueMapThreadInit(); } protected C getConfig() { return config; } + + protected void priorityQueueMapThreadInit() { + Boolean status = OaBeanFactory.getPriorityExecutorThreadStatus(); + if(Boolean.FALSE.equals(status)){ + OaBeanFactory.setPriorityExecutorThreadStatus(true); + pool.execute(() -> { + Thread.currentThread().setName("oa-priorityQueueMap-thread"); + while (!Thread.currentThread().isInterrupted()) { + Request request = priorityQueueMap.poll(); + if (!Objects.isNull(request)) { + pool.execute(() -> { + System.out.println("优先级为"+request.getPriority()+"已发送"); + sender(request, request.getMessageType()); + }); + } + } + }); + } + } + + + public final void senderAsync(Request request, MessageType messageType) { + pool.execute(() -> { + sender(request, messageType); + }); + } + + public final void senderAsync(Request request, MessageType messageType, OaCallBack callBack) { + CompletableFuture future = CompletableFuture.supplyAsync(() -> sender(request, messageType)); + future.thenAcceptAsync(callBack::callBack); + } + + public final void senderAsyncByPriority(Request request, MessageType messageType) { + request.setMessageType(messageType); + priorityQueueMap.offer(request); + } } \ No newline at end of file diff --git a/sms4j-oa-plugin/sms4j-oa-core/src/main/java/org/dromara/oa/core/weTalk/config/WeTalkFactory.java b/sms4j-oa-plugin/sms4j-oa-core/src/main/java/org/dromara/oa/core/weTalk/config/WeTalkFactory.java index 3a1969ef..77f62087 100644 --- a/sms4j-oa-plugin/sms4j-oa-core/src/main/java/org/dromara/oa/core/weTalk/config/WeTalkFactory.java +++ b/sms4j-oa-plugin/sms4j-oa-core/src/main/java/org/dromara/oa/core/weTalk/config/WeTalkFactory.java @@ -3,7 +3,7 @@ package org.dromara.oa.core.weTalk.config; import lombok.AccessLevel; import lombok.NoArgsConstructor; import org.dromara.oa.comm.content.OaContent; -import org.dromara.oa.core.provider.factory.AbstractProviderFactory; +import org.dromara.oa.core.provider.factory.OaAbstractProviderFactory; import org.dromara.oa.core.weTalk.service.WeTalkOaImpl; /** @@ -12,7 +12,7 @@ import org.dromara.oa.core.weTalk.service.WeTalkOaImpl; * @date 2023-10-22 21:00 */ @NoArgsConstructor(access = AccessLevel.PRIVATE) -public class WeTalkFactory extends AbstractProviderFactory { +public class WeTalkFactory extends OaAbstractProviderFactory { private static final WeTalkFactory INSTANCE = new WeTalkFactory(); /** diff --git a/sms4j-oa-plugin/sms4j-oa-core/src/main/resources/META-INF/spring.factories b/sms4j-oa-plugin/sms4j-oa-core/src/main/resources/META-INF/spring.factories index 9157acc8..fa39fcd2 100644 --- a/sms4j-oa-plugin/sms4j-oa-core/src/main/resources/META-INF/spring.factories +++ b/sms4j-oa-plugin/sms4j-oa-core/src/main/resources/META-INF/spring.factories @@ -1,2 +1,3 @@ org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ + org.dromara.oa.core.config.OaMainConfig,\ org.dromara.oa.core.config.OaSupplierConfig diff --git a/sms4j-oa-plugin/sms4j-oa-core/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports b/sms4j-oa-plugin/sms4j-oa-core/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports index 9dc50ba4..3abd8d80 100644 --- a/sms4j-oa-plugin/sms4j-oa-core/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports +++ b/sms4j-oa-plugin/sms4j-oa-core/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports @@ -1 +1,2 @@ -org.dromara.oa.core.config.OaSupplierConfig +org.dromara.oa.core.config.OaMainConfig +org.dromara.oa.core.config.OaSupplierConfig \ No newline at end of file diff --git a/sms4j-spring-boot-example/src/main/resources/application.yml b/sms4j-spring-boot-example/src/main/resources/application.yml index 61b6e526..630a9347 100644 --- a/sms4j-spring-boot-example/src/main/resources/application.yml +++ b/sms4j-spring-boot-example/src/main/resources/application.yml @@ -60,10 +60,11 @@ sms: template-id: pub_verif_short # 模版名称 templateName: code - +sms-oa: + config-type: yaml oas: oaDingTalkByYaml: # configId - isEnable: true # 表示该配置是否生效(默认生效,false表示不生效) + isEnable: false # 表示该配置是否生效(默认生效,false表示不生效) supplier: dingding # 厂商标识 tokenId: 您的accessKey sign: 您的sign @@ -73,4 +74,7 @@ sms: sign: 您的sign oaWeTalkByYaml: supplier: wetalk # 厂商标识 - tokenId: 您的sign \ No newline at end of file + tokenId: 您的sign + core-pool-size: 20 + queue-capacity: 20 + max-pool-size: 20 \ No newline at end of file diff --git a/sms4j-spring-boot-example/src/test/java/org/dromara/sms4j/example/SmsOaTest.java b/sms4j-spring-boot-example/src/test/java/org/dromara/sms4j/example/SmsOaTest.java index d7b4bcdb..6c5ccfb6 100644 --- a/sms4j-spring-boot-example/src/test/java/org/dromara/sms4j/example/SmsOaTest.java +++ b/sms4j-spring-boot-example/src/test/java/org/dromara/sms4j/example/SmsOaTest.java @@ -4,160 +4,204 @@ import lombok.extern.slf4j.Slf4j; import org.dromara.oa.api.OaSender; import org.dromara.oa.comm.entity.Request; import org.dromara.oa.comm.enums.MessageType; -import org.dromara.oa.comm.enums.OaType; -import org.dromara.oa.core.byteTalk.config.ByteTalkConfig; import org.dromara.oa.core.dingTalk.config.DingTalkConfig; import org.dromara.oa.core.provider.factory.OaFactory; -import org.dromara.oa.core.weTalk.config.WeTalkConfig; import org.junit.jupiter.api.Test; import org.springframework.boot.test.context.SpringBootTest; import java.util.ArrayList; +import java.util.Random; @Slf4j @SpringBootTest public class SmsOaTest { + //***********************DingTalk-Test************************// /** * 填测试手机号 */ - private static final String PHONE = ""; + private static final String DingTalkPHONE = ""; /** * 填access_token */ - private static final String TOKENID = ""; + private static final String DingTalkTOKENID = ""; /** * 填secret */ - private static final String SIGN = ""; + private static final String DingTalkSIGN = ""; + + /** + * DingTalk的Text测试 + */ @Test - public void oaDingTalkTest() { + public void oaDingTalkText() { String key = "oaDingTalk"; DingTalkConfig dingTalkConfig = new DingTalkConfig(); dingTalkConfig.setConfigId(key); - dingTalkConfig.setSign(SIGN); - dingTalkConfig.setTokenId(TOKENID); -// OaFactory.createAndRegisterOaSender(dingTalkConfig); - OaSender alarm = OaFactory.createAndGetOa(dingTalkConfig); + dingTalkConfig.setSign(DingTalkSIGN); + dingTalkConfig.setTokenId(DingTalkTOKENID); + + // 根据配置创建服务实例并注册 + OaFactory.createAndRegisterOaSender(dingTalkConfig); + OaSender alarm = OaFactory.getSmsOaBlend(key); + Request request = new Request(); ArrayList phones = new ArrayList<>(); - phones.add(PHONE); + phones.add(DingTalkPHONE); + //测试text request.setPhoneList(phones); - request.setIsNoticeAll(true); + request.setIsNoticeAll(false); request.setContent("测试消息"); request.setTitle("测试消息标题"); + + // 异步发送方式 + alarm.senderAsync(request, MessageType.TEXT); + alarm.senderAsync(request, MessageType.TEXT, smsResponse -> System.out.println("ConfigId为" + smsResponse.getOaConfigId() + "的异步任务发送成功")); + + System.out.println("异步任务已全部提交"); + System.out.println("下面是同步任务"); + alarm.sender(request, MessageType.TEXT); - // 测试markdown,无法@ -// request.setContent("#### 杭州天气 @150XXXXXXXX \n > 9度,西北风1级,空气良89,相对温度73%\n > ![screenshot](https://img.alicdn.com/tfs/TB1NwmBEL9TBuNjy1zbXXXpepXa-2400-1218.png)\n > ###### 10点20分发布 [天气](https://www.dingtalk.com) \n"); -// request.setTitle("杭州天气"); -// alarm.sender(request, MessageType.MARKDOWN); + System.out.println("同步任务已执行完"); } + /** + * DingTalk的Markdown测试 + */ + @Test + public void oaDingTalkMarkdown() { + String key = "oaDingTalk"; + DingTalkConfig dingTalkConfig = new DingTalkConfig(); + dingTalkConfig.setConfigId(key); + dingTalkConfig.setSign(DingTalkSIGN); + dingTalkConfig.setTokenId(DingTalkTOKENID); + + // 根据配置创建服务实例并注册 + OaFactory.createAndRegisterOaSender(dingTalkConfig); + OaSender alarm = OaFactory.getSmsOaBlend(key); + + Request request = new Request(); + ArrayList phones = new ArrayList<>(); + phones.add(DingTalkPHONE); + request.setPhoneList(phones); + request.setIsNoticeAll(true); + request.setContent("#### 杭州天气 @150XXXXXXXX \n > 9度,西北风1级,空气良89,相对温度73%\n > ![screenshot](https://img.alicdn.com/tfs/TB1NwmBEL9TBuNjy1zbXXXpepXa-2400-1218.png)\n > ###### 10点20分发布 [天气](https://www.dingtalk.com) \n"); + request.setTitle("测试消息标题"); + alarm.senderAsync(request, MessageType.MARKDOWN); + + alarm.senderAsync(request, MessageType.MARKDOWN, smsResponse -> System.out.println("ConfigId为" + smsResponse.getOaConfigId() + "的异步任务发送成功")); + + System.out.println("异步任务已全部提交"); + System.out.println("下面是同步任务"); + + alarm.sender(request, MessageType.MARKDOWN); + + System.out.println("同步任务已执行完"); + } + + /** + * DingTalk的Link测试 + */ + @Test + public void oaDingTalkLink() { + String key = "oaDingTalk"; + DingTalkConfig dingTalkConfig = new DingTalkConfig(); + dingTalkConfig.setConfigId(key); + dingTalkConfig.setSign(DingTalkSIGN); + dingTalkConfig.setTokenId(DingTalkTOKENID); + + // 根据配置创建服务实例并注册 + OaFactory.createAndRegisterOaSender(dingTalkConfig); + OaSender alarm = OaFactory.getSmsOaBlend(key); + + Request request = new Request(); + ArrayList phones = new ArrayList<>(); + phones.add(DingTalkPHONE); + // 测试link + request.setPhoneList(phones); + request.setIsNoticeAll(true); + request.setContent("这个即将发布的新版本,创始人xx称它为红树林。而在此之前,每当面临重大升级,产品经理们都会取一个应景的代号,这一次,为什么是红树林"); + request.setTitle("点击跳转到钉钉"); + request.setMessageUrl("https://www.dingtalk.com/s?__biz=MzA4NjMwMTA2Ng==&mid=2650316842&idx=1&sn=60da3ea2b29f1dcc43a7c8e4a7c97a16&scene=2&srcid=09189AnRJEdIiWVaKltFzNTw&from=timeline&isappinstalled=0&key=&ascene=2&uin=&devicetype=android-23&version=26031933&nettype=WIFI"); + request.setPicUrl("https://img.alicdn.com/tfs/TB1NwmBEL9TBuNjy1zbXXXpepXa-2400-1218.png"); + + alarm.senderAsync(request, MessageType.LINK); + + alarm.senderAsync(request, MessageType.LINK, smsResponse -> System.out.println("ConfigId为" + smsResponse.getOaConfigId() + "的异步任务发送成功")); + + System.out.println("异步任务已全部提交"); + System.out.println("下面是同步任务"); + + alarm.sender(request, MessageType.LINK); + + System.out.println("同步任务已执行完"); + } + + /** + * 异步优先级尽可能优先级高的消息先发送,但是获取响应会受网络影响 + */ + @Test + public void oaDingTalkAsyncByPriority() { + String key = "oaDingTalk"; + DingTalkConfig dingTalkConfig = new DingTalkConfig(); + dingTalkConfig.setConfigId(key); + dingTalkConfig.setSign(DingTalkSIGN); + dingTalkConfig.setTokenId(DingTalkTOKENID); + + // 根据配置创建服务实例并注册 + OaFactory.createAndRegisterOaSender(dingTalkConfig); + OaSender alarm = OaFactory.getSmsOaBlend(key); + + // 模拟10条不同优先级的消息 + for (int i = 0; i < 10; i++) { + Random random = new Random(); + int priority = random.nextInt(10); + + Request request = new Request(); + ArrayList phones = new ArrayList<>(); + phones.add(DingTalkPHONE); + request.setPhoneList(phones); + request.setIsNoticeAll(false); + request.setPriority(priority); + request.setTitle("优先级为" + priority); + //测试-1-TEXT +// request.setContent("该消息优先级为"+ priority); +// alarm.senderAsyncByPriority(request, MessageType.TEXT); +// System.out.println("优先级为"+priority+"的异步任务已提交"); + + // 测试-2-MARKDOWN +// request.setContent("该消息优先级为"+ priority+"\n#### ++杭州天气 @150XXXXXXXX \n > 9度,西北风1级,空气良89,相对温度73%\n > ![screenshot](https://img.alicdn.com/tfs/TB1NwmBEL9TBuNjy1zbXXXpepXa-2400-1218.png)\n > ###### 10点20分发布 [天气](https://www.dingtalk.com) \n"); +// alarm.senderAsyncByPriority(request, MessageType.MARKDOWN); + + // 测试-3-LINK + request.setContent("该消息优先级为" + priority + "这个即将发布的新版本,创始人xx称它为红树林。而在此之前,每当面临重大升级,产品经理们都会取一个应景的代号,这一次,为什么是红树林"); + request.setMessageUrl("https://www.dingtalk.com/s?__biz=MzA4NjMwMTA2Ng==&mid=2650316842&idx=1&sn=60da3ea2b29f1dcc43a7c8e4a7c97a16&scene=2&srcid=09189AnRJEdIiWVaKltFzNTw&from=timeline&isappinstalled=0&key=&ascene=2&uin=&devicetype=android-23&version=26031933&nettype=WIFI"); + request.setPicUrl("https://img.alicdn.com/tfs/TB1NwmBEL9TBuNjy1zbXXXpepXa-2400-1218.png"); + + // 发送 + alarm.senderAsyncByPriority(request, MessageType.LINK); + + System.out.println("优先级为" + priority + "的异步任务已提交"); + } + while (true){ + } + } + @Test public void oaDingTalkByYamlTest() { String configId = "oaDingTalkByYaml"; OaSender alarm = OaFactory.getSmsOaBlend(configId); Request request = new Request(); ArrayList phones = new ArrayList<>(); - phones.add(PHONE); + phones.add(DingTalkPHONE); request.setPhoneList(phones); request.setIsNoticeAll(false); request.setContent("HertzBeat"); request.setTitle("HertzBeat"); alarm.sender(request, MessageType.TEXT); - - } - - @Test - public void oaByteTalkTest() { - String configId = "oaByteTalk"; - ByteTalkConfig dingTalkConfig = new ByteTalkConfig(); - dingTalkConfig.setConfigId(configId); - dingTalkConfig.setSign(SIGN); - dingTalkConfig.setTokenId(TOKENID); - OaSender alarm = OaFactory.createAndGetOa(dingTalkConfig); - Request request = new Request(); - ArrayList userNameList = new ArrayList<>(); - userNameList.add("user1"); - userNameList.add("user2"); - request.setUserNamesList(userNameList); - request.setContent("测试消息"); - request.setIsNoticeAll(true); -// request.setTitle("测试消息标题"); - alarm.sender(request, MessageType.TEXT); - } - - - @Test - public void oaByteTalkByYamlTest() { - String configId = "oaByteTalkByYaml"; - OaSender alarm = OaFactory.getSmsOaBlend(configId); - Request request = new Request(); - request.setOaType(OaType.BYTETALK.getType()); - ArrayList userNameList = new ArrayList<>(); - userNameList.add("user1"); - userNameList.add("user2"); - request.setUserNamesList(userNameList); - request.setContent("测试消息"); - request.setIsNoticeAll(true); -// request.setTitle("测试消息标题"); - alarm.sender(request, MessageType.TEXT); - } - - @Test - public void oaWeTalkTest() { - String configId = "oaWeTalk"; - WeTalkConfig weTalkConfig = new WeTalkConfig(); - weTalkConfig.setConfigId(configId); - weTalkConfig.setTokenId(TOKENID); - OaSender alarm = OaFactory.createAndGetOa(weTalkConfig); - Request request = new Request(); - ArrayList phones = new ArrayList<>(); - phones.add(PHONE); - phones.add("131"); - request.setPhoneList(phones); - ArrayList userIds = new ArrayList<>(); - userIds.add("123"); - request.setUserIdList(userIds); -// request.setIsNoticeAll(true); - request.setContent("测试消息"); - request.setTitle("测试消息标题"); - alarm.sender(request, MessageType.TEXT); - - // 测试markdown,无法@ - // 企业微信的markdown直接是content,没有title -// request.setContent("#### 杭州天气 @150XXXXXXXX \n > 9度,西北风1级,空气良89,相对温度73%\n > ![screenshot](https://img.alicdn.com/tfs/TB1NwmBEL9TBuNjy1zbXXXpepXa-2400-1218.png)\n > ###### 10点20分发布 [天气](https://www.dingtalk.com) \n"); -// request.setTitle("杭州天气"); -// alarm.sender(request, MessageType.MARKDOWN); - } - - - @Test - public void oaWeTalkByYamlTest() { - String configId = "oaWeTalkByYaml"; - OaSender alarm = OaFactory.getSmsOaBlend(configId); - Request request = new Request(); - request.setOaType(OaType.WETALK.getType()); - ArrayList phones = new ArrayList<>(); - phones.add(PHONE); - phones.add("131"); - request.setPhoneList(phones); - ArrayList userIds = new ArrayList<>(); - userIds.add("123"); - request.setUserIdList(userIds); -// request.setIsNoticeAll(true); - request.setContent("测试消息"); - request.setTitle("测试消息标题"); - alarm.sender(request, MessageType.TEXT); - - // 测试markdown,无法@ - // 企业微信的markdown直接是content,没有title -// request.setContent("#### 杭州天气 @150XXXXXXXX \n > 9度,西北风1级,空气良89,相对温度73%\n > ![screenshot](https://img.alicdn.com/tfs/TB1NwmBEL9TBuNjy1zbXXXpepXa-2400-1218.png)\n > ###### 10点20分发布 [天气](https://www.dingtalk.com) \n"); -// request.setTitle("杭州天气"); -// alarm.sender(request, MessageType.MARKDOWN); } } From f0185e56718845bbf69bf0f67664fecc4da4d4ee Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=B8=9C=E9=A3=8E?= <1335799468@qq.com> Date: Mon, 27 Nov 2023 22:20:52 +0800 Subject: [PATCH 4/5] =?UTF-8?q?oa=E6=9B=B4=E6=96=B0:=E6=A0=BC=E5=BC=8F?= =?UTF-8?q?=E5=8C=96javadoc?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/org/dromara/oa/api/OaCallBack.java | 2 +- .../java/org/dromara/oa/comm/config/OaSupplierConfig.java | 2 +- .../main/java/org/dromara/oa/comm/content/OaContent.java | 2 +- .../src/main/java/org/dromara/oa/comm/entity/Request.java | 1 - .../dromara/oa/core/byteTalk/config/ByteTalkFactory.java | 4 ++-- .../dromara/oa/core/byteTalk/service/ByteTalkOaImpl.java | 2 +- .../dromara/oa/core/byteTalk/utils/ByteTalkBuilder.java | 8 +++----- .../org/dromara/oa/core/config/OaBlendsInitializer.java | 4 ++-- .../java/org/dromara/oa/core/config/OaMainConfig.java | 3 +-- .../java/org/dromara/oa/core/config/OaSupplierConfig.java | 2 +- .../dromara/oa/core/dingTalk/config/DingTalkConfig.java | 2 +- .../dromara/oa/core/dingTalk/config/DingTalkFactory.java | 5 ++--- .../dromara/oa/core/dingTalk/service/DingTalkOaImpl.java | 3 +-- .../dromara/oa/core/dingTalk/utils/DingTalkBuilder.java | 4 ++-- .../org/dromara/oa/core/provider/config/OaConfig.java | 4 ++-- .../oa/core/provider/factory/ProviderFactoryHolder.java | 2 +- .../dromara/oa/core/provider/service/AbstractOaBlend.java | 6 ++---- .../org/dromara/oa/core/weTalk/config/WeTalkFactory.java | 4 ++-- .../org/dromara/oa/core/weTalk/service/WeTalkOaImpl.java | 2 +- .../org/dromara/oa/core/weTalk/utils/WeTalkBuilder.java | 4 ++-- 20 files changed, 29 insertions(+), 37 deletions(-) diff --git a/sms4j-oa-plugin/sms4j-oa-api/src/main/java/org/dromara/oa/api/OaCallBack.java b/sms4j-oa-plugin/sms4j-oa-api/src/main/java/org/dromara/oa/api/OaCallBack.java index a18b2210..5601e642 100644 --- a/sms4j-oa-plugin/sms4j-oa-api/src/main/java/org/dromara/oa/api/OaCallBack.java +++ b/sms4j-oa-plugin/sms4j-oa-api/src/main/java/org/dromara/oa/api/OaCallBack.java @@ -4,7 +4,7 @@ import org.dromara.oa.comm.entity.Response; /** * @author dongfeng - * @date 2023-10-28 14:26 + * 2023-10-28 14:26 */ @FunctionalInterface public interface OaCallBack { diff --git a/sms4j-oa-plugin/sms4j-oa-comm/src/main/java/org/dromara/oa/comm/config/OaSupplierConfig.java b/sms4j-oa-plugin/sms4j-oa-comm/src/main/java/org/dromara/oa/comm/config/OaSupplierConfig.java index 215ae747..8dfa7449 100644 --- a/sms4j-oa-plugin/sms4j-oa-comm/src/main/java/org/dromara/oa/comm/config/OaSupplierConfig.java +++ b/sms4j-oa-plugin/sms4j-oa-comm/src/main/java/org/dromara/oa/comm/config/OaSupplierConfig.java @@ -2,7 +2,7 @@ package org.dromara.oa.comm.config; /** * @author dongfeng - * @date 2023-10-19 13:36 + * 2023-10-19 13:36 */ public interface OaSupplierConfig { diff --git a/sms4j-oa-plugin/sms4j-oa-comm/src/main/java/org/dromara/oa/comm/content/OaContent.java b/sms4j-oa-plugin/sms4j-oa-comm/src/main/java/org/dromara/oa/comm/content/OaContent.java index ad24c74e..1a3ea8b3 100644 --- a/sms4j-oa-plugin/sms4j-oa-comm/src/main/java/org/dromara/oa/comm/content/OaContent.java +++ b/sms4j-oa-plugin/sms4j-oa-comm/src/main/java/org/dromara/oa/comm/content/OaContent.java @@ -2,7 +2,7 @@ package org.dromara.oa.comm.content; /** * @author dongfeng - * @date 2023-10-22 13:50 + * 2023-10-22 13:50 */ public class OaContent { /** diff --git a/sms4j-oa-plugin/sms4j-oa-comm/src/main/java/org/dromara/oa/comm/entity/Request.java b/sms4j-oa-plugin/sms4j-oa-comm/src/main/java/org/dromara/oa/comm/entity/Request.java index 1a574d70..e774c593 100644 --- a/sms4j-oa-plugin/sms4j-oa-comm/src/main/java/org/dromara/oa/comm/entity/Request.java +++ b/sms4j-oa-plugin/sms4j-oa-comm/src/main/java/org/dromara/oa/comm/entity/Request.java @@ -4,7 +4,6 @@ package org.dromara.oa.comm.entity; import lombok.Data; import org.dromara.oa.comm.enums.MessageType; -import java.util.Collection; import java.util.List; @Data diff --git a/sms4j-oa-plugin/sms4j-oa-core/src/main/java/org/dromara/oa/core/byteTalk/config/ByteTalkFactory.java b/sms4j-oa-plugin/sms4j-oa-core/src/main/java/org/dromara/oa/core/byteTalk/config/ByteTalkFactory.java index 29b1a1bd..6b8416cc 100644 --- a/sms4j-oa-plugin/sms4j-oa-core/src/main/java/org/dromara/oa/core/byteTalk/config/ByteTalkFactory.java +++ b/sms4j-oa-plugin/sms4j-oa-core/src/main/java/org/dromara/oa/core/byteTalk/config/ByteTalkFactory.java @@ -7,9 +7,9 @@ import org.dromara.oa.core.byteTalk.service.ByteTalkOaImpl; import org.dromara.oa.core.provider.factory.OaAbstractProviderFactory; /** + * 飞书通知对象建造 * @author dongfeng - * @description 飞书通知对象建造 - * @date 2023-10-22 21:00 + * 2023-10-22 21:00 */ @NoArgsConstructor(access = AccessLevel.PRIVATE) public class ByteTalkFactory extends OaAbstractProviderFactory { diff --git a/sms4j-oa-plugin/sms4j-oa-core/src/main/java/org/dromara/oa/core/byteTalk/service/ByteTalkOaImpl.java b/sms4j-oa-plugin/sms4j-oa-core/src/main/java/org/dromara/oa/core/byteTalk/service/ByteTalkOaImpl.java index 1da5b306..77b06135 100644 --- a/sms4j-oa-plugin/sms4j-oa-core/src/main/java/org/dromara/oa/core/byteTalk/service/ByteTalkOaImpl.java +++ b/sms4j-oa-plugin/sms4j-oa-core/src/main/java/org/dromara/oa/core/byteTalk/service/ByteTalkOaImpl.java @@ -20,7 +20,7 @@ import static org.dromara.oa.comm.enums.OaType.BYTETALK; /** * @author dongfeng - * @date 2023-10-22 21:01 + * 2023-10-22 21:01 */ @Slf4j public class ByteTalkOaImpl extends AbstractOaBlend { diff --git a/sms4j-oa-plugin/sms4j-oa-core/src/main/java/org/dromara/oa/core/byteTalk/utils/ByteTalkBuilder.java b/sms4j-oa-plugin/sms4j-oa-core/src/main/java/org/dromara/oa/core/byteTalk/utils/ByteTalkBuilder.java index d29d7361..74bc018f 100644 --- a/sms4j-oa-plugin/sms4j-oa-core/src/main/java/org/dromara/oa/core/byteTalk/utils/ByteTalkBuilder.java +++ b/sms4j-oa-plugin/sms4j-oa-core/src/main/java/org/dromara/oa/core/byteTalk/utils/ByteTalkBuilder.java @@ -15,9 +15,9 @@ import java.util.List; import static org.dromara.oa.comm.enums.MessageType.TEXT; /** + * 飞书通知签名和信息构建 * @author dongfeng - * @description 飞书通知签名和信息构建 - * @date 2023-10-19 13:07 + * 2023-10-19 13:07 */ public class ByteTalkBuilder { @@ -49,9 +49,7 @@ public class ByteTalkBuilder { if (isNoticeAll) { content.append("所有人"); } - userNamesList.forEach(l -> { - content.append("").append(l).append(""); - }); + userNamesList.forEach(l -> content.append("").append(l).append("")); content.append(request.getContent()); JSONObject text = new JSONObject(); text.set("text", content); diff --git a/sms4j-oa-plugin/sms4j-oa-core/src/main/java/org/dromara/oa/core/config/OaBlendsInitializer.java b/sms4j-oa-plugin/sms4j-oa-core/src/main/java/org/dromara/oa/core/config/OaBlendsInitializer.java index 0fa3d9c4..db7edf1d 100644 --- a/sms4j-oa-plugin/sms4j-oa-core/src/main/java/org/dromara/oa/core/config/OaBlendsInitializer.java +++ b/sms4j-oa-plugin/sms4j-oa-core/src/main/java/org/dromara/oa/core/config/OaBlendsInitializer.java @@ -19,9 +19,9 @@ import java.util.List; import java.util.Map; /** + * 注册工厂, 读取yaml配置并根据配置生成对象 * @author dongfeng - * @description 注册工厂, 读取yaml配置并根据配置生成对象 - * @date 2023-10-22 12:39 + * 2023-10-22 12:39 */ @Slf4j diff --git a/sms4j-oa-plugin/sms4j-oa-core/src/main/java/org/dromara/oa/core/config/OaMainConfig.java b/sms4j-oa-plugin/sms4j-oa-core/src/main/java/org/dromara/oa/core/config/OaMainConfig.java index 86751962..77ca6332 100644 --- a/sms4j-oa-plugin/sms4j-oa-core/src/main/java/org/dromara/oa/core/config/OaMainConfig.java +++ b/sms4j-oa-plugin/sms4j-oa-core/src/main/java/org/dromara/oa/core/config/OaMainConfig.java @@ -13,8 +13,7 @@ import java.util.concurrent.Executor; /** * @author dongfeng - * @description TODO - * @date 2023-11-01 18:05 + * 2023-11-01 18:05 */ @Data public class OaMainConfig { diff --git a/sms4j-oa-plugin/sms4j-oa-core/src/main/java/org/dromara/oa/core/config/OaSupplierConfig.java b/sms4j-oa-plugin/sms4j-oa-core/src/main/java/org/dromara/oa/core/config/OaSupplierConfig.java index 8c4a2acb..bc56064d 100644 --- a/sms4j-oa-plugin/sms4j-oa-core/src/main/java/org/dromara/oa/core/config/OaSupplierConfig.java +++ b/sms4j-oa-plugin/sms4j-oa-core/src/main/java/org/dromara/oa/core/config/OaSupplierConfig.java @@ -13,7 +13,7 @@ import java.util.Map; /** * @author dongfeng - * @date 2023-10-22 12:50 + * 2023-10-22 12:50 */ public class OaSupplierConfig { /** diff --git a/sms4j-oa-plugin/sms4j-oa-core/src/main/java/org/dromara/oa/core/dingTalk/config/DingTalkConfig.java b/sms4j-oa-plugin/sms4j-oa-core/src/main/java/org/dromara/oa/core/dingTalk/config/DingTalkConfig.java index 41761c22..3d6d4530 100644 --- a/sms4j-oa-plugin/sms4j-oa-core/src/main/java/org/dromara/oa/core/dingTalk/config/DingTalkConfig.java +++ b/sms4j-oa-plugin/sms4j-oa-core/src/main/java/org/dromara/oa/core/dingTalk/config/DingTalkConfig.java @@ -8,7 +8,7 @@ import org.dromara.oa.core.provider.config.OaBaseConfig; /** * @author dongfeng - * @date 2023-10-19 13:38 + * 2023-10-19 13:38 */ @Data @EqualsAndHashCode(callSuper = true) diff --git a/sms4j-oa-plugin/sms4j-oa-core/src/main/java/org/dromara/oa/core/dingTalk/config/DingTalkFactory.java b/sms4j-oa-plugin/sms4j-oa-core/src/main/java/org/dromara/oa/core/dingTalk/config/DingTalkFactory.java index 32b4ef15..64850761 100644 --- a/sms4j-oa-plugin/sms4j-oa-core/src/main/java/org/dromara/oa/core/dingTalk/config/DingTalkFactory.java +++ b/sms4j-oa-plugin/sms4j-oa-core/src/main/java/org/dromara/oa/core/dingTalk/config/DingTalkFactory.java @@ -6,12 +6,11 @@ import org.dromara.oa.comm.content.OaContent; import org.dromara.oa.core.dingTalk.service.DingTalkOaImpl; import org.dromara.oa.core.provider.factory.OaAbstractProviderFactory; -import java.util.concurrent.Executor; /** + * 钉钉通知对象建造 * @author dongfeng - * @description 钉钉通知对象建造 - * @date 2023-10-22 21:00 + * 2023-10-22 21:00 */ @NoArgsConstructor(access = AccessLevel.PRIVATE) public class DingTalkFactory extends OaAbstractProviderFactory { diff --git a/sms4j-oa-plugin/sms4j-oa-core/src/main/java/org/dromara/oa/core/dingTalk/service/DingTalkOaImpl.java b/sms4j-oa-plugin/sms4j-oa-core/src/main/java/org/dromara/oa/core/dingTalk/service/DingTalkOaImpl.java index 4223e2a5..636f0123 100644 --- a/sms4j-oa-plugin/sms4j-oa-core/src/main/java/org/dromara/oa/core/dingTalk/service/DingTalkOaImpl.java +++ b/sms4j-oa-plugin/sms4j-oa-core/src/main/java/org/dromara/oa/core/dingTalk/service/DingTalkOaImpl.java @@ -5,7 +5,6 @@ import lombok.extern.slf4j.Slf4j; import org.dromara.oa.comm.entity.Request; import org.dromara.oa.comm.entity.Response; import org.dromara.oa.comm.enums.MessageType; -import org.dromara.oa.comm.enums.OaType; import org.dromara.oa.comm.errors.OaException; import org.dromara.oa.core.dingTalk.config.DingTalkConfig; import org.dromara.oa.core.dingTalk.utils.DingTalkBuilder; @@ -21,7 +20,7 @@ import static org.dromara.oa.comm.enums.OaType.DINGTALK; /** * @author dongfeng - * @date 2023-10-22 21:01 + * 2023-10-22 21:01 */ @Slf4j public class DingTalkOaImpl extends AbstractOaBlend { diff --git a/sms4j-oa-plugin/sms4j-oa-core/src/main/java/org/dromara/oa/core/dingTalk/utils/DingTalkBuilder.java b/sms4j-oa-plugin/sms4j-oa-core/src/main/java/org/dromara/oa/core/dingTalk/utils/DingTalkBuilder.java index 7b0130f9..59a750fe 100644 --- a/sms4j-oa-plugin/sms4j-oa-core/src/main/java/org/dromara/oa/core/dingTalk/utils/DingTalkBuilder.java +++ b/sms4j-oa-plugin/sms4j-oa-core/src/main/java/org/dromara/oa/core/dingTalk/utils/DingTalkBuilder.java @@ -19,9 +19,9 @@ import java.util.Objects; import static org.dromara.oa.comm.enums.MessageType.*; /** + * 钉钉通知签名和信息构建 * @author dongfeng - * @description 钉钉通知签名和信息构建 - * @date 2023-10-19 13:07 + * 2023-10-19 13:07 */ public class DingTalkBuilder { public static String sign(String secret) { diff --git a/sms4j-oa-plugin/sms4j-oa-core/src/main/java/org/dromara/oa/core/provider/config/OaConfig.java b/sms4j-oa-plugin/sms4j-oa-core/src/main/java/org/dromara/oa/core/provider/config/OaConfig.java index b01b4c92..e36a67b0 100644 --- a/sms4j-oa-plugin/sms4j-oa-core/src/main/java/org/dromara/oa/core/provider/config/OaConfig.java +++ b/sms4j-oa-plugin/sms4j-oa-core/src/main/java/org/dromara/oa/core/provider/config/OaConfig.java @@ -3,9 +3,9 @@ package org.dromara.oa.core.provider.config; import lombok.Data; /** + * Oa线程池配置 * @author dongfeng - * @description TODO - * @date 2023-11-01 17:55 + * 2023-11-01 17:55 */ @Data public class OaConfig { diff --git a/sms4j-oa-plugin/sms4j-oa-core/src/main/java/org/dromara/oa/core/provider/factory/ProviderFactoryHolder.java b/sms4j-oa-plugin/sms4j-oa-core/src/main/java/org/dromara/oa/core/provider/factory/ProviderFactoryHolder.java index 9502d48a..ce5b7a61 100644 --- a/sms4j-oa-plugin/sms4j-oa-core/src/main/java/org/dromara/oa/core/provider/factory/ProviderFactoryHolder.java +++ b/sms4j-oa-plugin/sms4j-oa-core/src/main/java/org/dromara/oa/core/provider/factory/ProviderFactoryHolder.java @@ -11,7 +11,7 @@ import java.util.concurrent.ConcurrentHashMap; /** * @author dongfeng - * @date 2023-10-22 21:12 + * 2023-10-22 21:12 */ public class ProviderFactoryHolder { diff --git a/sms4j-oa-plugin/sms4j-oa-core/src/main/java/org/dromara/oa/core/provider/service/AbstractOaBlend.java b/sms4j-oa-plugin/sms4j-oa-core/src/main/java/org/dromara/oa/core/provider/service/AbstractOaBlend.java index 382ac2de..f645a055 100644 --- a/sms4j-oa-plugin/sms4j-oa-core/src/main/java/org/dromara/oa/core/provider/service/AbstractOaBlend.java +++ b/sms4j-oa-plugin/sms4j-oa-core/src/main/java/org/dromara/oa/core/provider/service/AbstractOaBlend.java @@ -17,7 +17,7 @@ import java.util.concurrent.PriorityBlockingQueue; /** * @author dongfeng - * @date 2023-10-22 21:03 + * 2023-10-22 21:03 */ public abstract class AbstractOaBlend implements OaSender { @@ -71,9 +71,7 @@ public abstract class AbstractOaBlend implements OaS public final void senderAsync(Request request, MessageType messageType) { - pool.execute(() -> { - sender(request, messageType); - }); + pool.execute(() -> sender(request, messageType)); } public final void senderAsync(Request request, MessageType messageType, OaCallBack callBack) { diff --git a/sms4j-oa-plugin/sms4j-oa-core/src/main/java/org/dromara/oa/core/weTalk/config/WeTalkFactory.java b/sms4j-oa-plugin/sms4j-oa-core/src/main/java/org/dromara/oa/core/weTalk/config/WeTalkFactory.java index 77f62087..0bfe4ec6 100644 --- a/sms4j-oa-plugin/sms4j-oa-core/src/main/java/org/dromara/oa/core/weTalk/config/WeTalkFactory.java +++ b/sms4j-oa-plugin/sms4j-oa-core/src/main/java/org/dromara/oa/core/weTalk/config/WeTalkFactory.java @@ -7,9 +7,9 @@ import org.dromara.oa.core.provider.factory.OaAbstractProviderFactory; import org.dromara.oa.core.weTalk.service.WeTalkOaImpl; /** + * 微信通知对象建造 * @author dongfeng - * @description 微信通知对象建造 - * @date 2023-10-22 21:00 + * 2023-10-22 21:00 */ @NoArgsConstructor(access = AccessLevel.PRIVATE) public class WeTalkFactory extends OaAbstractProviderFactory { diff --git a/sms4j-oa-plugin/sms4j-oa-core/src/main/java/org/dromara/oa/core/weTalk/service/WeTalkOaImpl.java b/sms4j-oa-plugin/sms4j-oa-core/src/main/java/org/dromara/oa/core/weTalk/service/WeTalkOaImpl.java index bc800521..a173c2d6 100644 --- a/sms4j-oa-plugin/sms4j-oa-core/src/main/java/org/dromara/oa/core/weTalk/service/WeTalkOaImpl.java +++ b/sms4j-oa-plugin/sms4j-oa-core/src/main/java/org/dromara/oa/core/weTalk/service/WeTalkOaImpl.java @@ -20,7 +20,7 @@ import static org.dromara.oa.comm.enums.OaType.WETALK; /** * @author dongfeng - * @date 2023-10-22 21:01 + * 2023-10-22 21:01 */ @Slf4j public class WeTalkOaImpl extends AbstractOaBlend { diff --git a/sms4j-oa-plugin/sms4j-oa-core/src/main/java/org/dromara/oa/core/weTalk/utils/WeTalkBuilder.java b/sms4j-oa-plugin/sms4j-oa-core/src/main/java/org/dromara/oa/core/weTalk/utils/WeTalkBuilder.java index 11046292..93b5ff46 100644 --- a/sms4j-oa-plugin/sms4j-oa-core/src/main/java/org/dromara/oa/core/weTalk/utils/WeTalkBuilder.java +++ b/sms4j-oa-plugin/sms4j-oa-core/src/main/java/org/dromara/oa/core/weTalk/utils/WeTalkBuilder.java @@ -11,9 +11,9 @@ import static org.dromara.oa.comm.enums.MessageType.MARKDOWN; import static org.dromara.oa.comm.enums.MessageType.TEXT; /** + * 企业微信--签名和消息构建 * @author dongfeng - * @description 微信通知签名和信息构建 - * @date 2023-10-19 13:07 + * 2023-10-19 13:07 */ public class WeTalkBuilder { From df36fb802a90d7cfc5f65dd5551ba42d8b4e6000 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=B8=9C=E9=A3=8E?= <1335799468@qq.com> Date: Mon, 27 Nov 2023 23:50:08 +0800 Subject: [PATCH 5/5] =?UTF-8?q?=E6=81=A2=E5=A4=8D=E5=90=88=E5=B9=B6?= =?UTF-8?q?=E5=BD=B1=E5=93=8D=E7=9A=84=E9=85=8D=E7=BD=AEdemo?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/resources/application.yml | 28 ++++++++++++++++++- 1 file changed, 27 insertions(+), 1 deletion(-) diff --git a/sms4j-spring-boot-example/src/main/resources/application.yml b/sms4j-spring-boot-example/src/main/resources/application.yml index 630a9347..4d6b6734 100644 --- a/sms4j-spring-boot-example/src/main/resources/application.yml +++ b/sms4j-spring-boot-example/src/main/resources/application.yml @@ -1,6 +1,8 @@ sms: # 标注从yml读取配置 config-type: yaml + # 账户上限 + account-max: 1 blends: # 阿里短信例子 ali: @@ -60,11 +62,35 @@ sms: template-id: pub_verif_short # 模版名称 templateName: code + # 渠道上限 + maximum: 2 + lianlu: + supplier: lianlu + templateId: 模板id + appId: 100116 + appKey: d42d7 + mchId: 100 + signName: 【test】 + cloopen: + # 短信厂商 + supplier: cloopen + base-url: https://app.cloopen.com:8883/2013-12-26 + access-key-id: 你的Access Key + access-key-secret: 你的Access Key Secret + sdkAppId: 你的应用ID + #自定义广州掌骏短信,添加factory全路径。config,factory,SmsImpl复制其他默认实现即可,修改对应的supplier和发送核心逻辑即可 + zhangjun: + supplier: zhangjun + factory: org.dromara.sms4j.example.zhangjun.ZhangJunFactory + templateId: d2a****777 + appId: 64c52d2a****77775fe72e3 + sid: d2a****777 + url: https://sms.idowe.com/**/**/**/send sms-oa: config-type: yaml oas: oaDingTalkByYaml: # configId - isEnable: false # 表示该配置是否生效(默认生效,false表示不生效) + isEnable: true # 表示该配置是否生效(默认生效,false表示不生效) supplier: dingding # 厂商标识 tokenId: 您的accessKey sign: 您的sign