From 4b2a08e1c904fc939ba14b8a2c8e8573d9fd851a Mon Sep 17 00:00:00 2001 From: wyl <959814898@qq.com> Date: Thu, 10 Nov 2022 00:33:27 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20aos-robot=20=E5=88=9D=E6=AD=A5=E5=BC=80?= =?UTF-8?q?=E5=8F=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- aos-model-test/pom.xml | 5 ++ .../src/main/resources/application.properties | 2 + .../src/main/resources/bootstrap.properties | 2 - .../main/resources/bootstrap.properties.bk | 1 + .../java/com/aos/test/ApplicationTest.java | 8 +- .../src/test/java/com/aos/test/BaseTest.java | 27 ++++++ aos-robot/pom.xml | 55 ++++++++++++ .../src/main/java/com/aos/robot/WXAlarm.java | 83 +++++++++++++++++++ .../src/main/java/com/aos/robot/WxRobot.java | 49 +++++++++++ .../com/aos/robot/conf/AutoRobotConfig.java | 43 ++++++++++ .../java/com/aos/robot/model/MegTypeEnum.java | 43 ++++++++++ .../java/com/aos/robot/model/RobotConfig.java | 14 ++++ .../java/com/aos/robot/model/RobotParam.java | 25 ++++++ .../java/com/aos/robot/model/RobotRes.java | 32 +++++++ .../main/resources/META-INF/spring.factories | 1 + aos-web/pom.xml | 5 ++ pom.xml | 1 + 17 files changed, 393 insertions(+), 3 deletions(-) create mode 100644 aos-model-test/src/main/resources/application.properties delete mode 100644 aos-model-test/src/main/resources/bootstrap.properties create mode 100644 aos-model-test/src/main/resources/bootstrap.properties.bk create mode 100644 aos-model-test/src/test/java/com/aos/test/BaseTest.java create mode 100644 aos-robot/pom.xml create mode 100644 aos-robot/src/main/java/com/aos/robot/WXAlarm.java create mode 100644 aos-robot/src/main/java/com/aos/robot/WxRobot.java create mode 100644 aos-robot/src/main/java/com/aos/robot/conf/AutoRobotConfig.java create mode 100644 aos-robot/src/main/java/com/aos/robot/model/MegTypeEnum.java create mode 100644 aos-robot/src/main/java/com/aos/robot/model/RobotConfig.java create mode 100644 aos-robot/src/main/java/com/aos/robot/model/RobotParam.java create mode 100644 aos-robot/src/main/java/com/aos/robot/model/RobotRes.java create mode 100644 aos-robot/src/main/resources/META-INF/spring.factories diff --git a/aos-model-test/pom.xml b/aos-model-test/pom.xml index 81448ac..ff34b11 100644 --- a/aos-model-test/pom.xml +++ b/aos-model-test/pom.xml @@ -44,6 +44,11 @@ aos-web 1.0-SNAPSHOT + + com.aos + aos-robot + 1.0-SNAPSHOT + diff --git a/aos-model-test/src/main/resources/application.properties b/aos-model-test/src/main/resources/application.properties new file mode 100644 index 0000000..c3d599d --- /dev/null +++ b/aos-model-test/src/main/resources/application.properties @@ -0,0 +1,2 @@ +asura.robot.wx.ids.test=dc62c56e-c194-4a22-87ff-d9d0e30f56b4 +spring.profiles.active=dev diff --git a/aos-model-test/src/main/resources/bootstrap.properties b/aos-model-test/src/main/resources/bootstrap.properties deleted file mode 100644 index e12477a..0000000 --- a/aos-model-test/src/main/resources/bootstrap.properties +++ /dev/null @@ -1,2 +0,0 @@ -spring.application.name=aos-gateway - diff --git a/aos-model-test/src/main/resources/bootstrap.properties.bk b/aos-model-test/src/main/resources/bootstrap.properties.bk new file mode 100644 index 0000000..257b306 --- /dev/null +++ b/aos-model-test/src/main/resources/bootstrap.properties.bk @@ -0,0 +1 @@ +spring.profiles.active=dev \ No newline at end of file diff --git a/aos-model-test/src/test/java/com/aos/test/ApplicationTest.java b/aos-model-test/src/test/java/com/aos/test/ApplicationTest.java index 27f64f3..18a560c 100644 --- a/aos-model-test/src/test/java/com/aos/test/ApplicationTest.java +++ b/aos-model-test/src/test/java/com/aos/test/ApplicationTest.java @@ -1,8 +1,10 @@ package com.aos.test; +import com.aos.robot.WXAlarm; import lombok.extern.slf4j.Slf4j; import org.junit.Test; import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.context.junit4.SpringRunner; @@ -10,8 +12,12 @@ import org.springframework.test.context.junit4.SpringRunner; @SpringBootTest(classes = Application.class) @Slf4j public class ApplicationTest { + + @Autowired + WXAlarm wxAlarm; + @Test public void test() throws InterruptedException { - Thread.sleep(1000000L); + wxAlarm.alarm("test", "qwe"); } } diff --git a/aos-model-test/src/test/java/com/aos/test/BaseTest.java b/aos-model-test/src/test/java/com/aos/test/BaseTest.java new file mode 100644 index 0000000..0ce50a9 --- /dev/null +++ b/aos-model-test/src/test/java/com/aos/test/BaseTest.java @@ -0,0 +1,27 @@ +package com.aos.test; + +import com.aos.robot.WXAlarm; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.context.annotation.ComponentScan; +import org.springframework.test.context.junit4.SpringRunner; + +@RunWith(SpringRunner.class) +@SpringBootTest(args = "--eureka.client.register-with-eureka=false", webEnvironment = SpringBootTest.WebEnvironment.NONE, classes = BaseTest.Application.class) +public class BaseTest { + + @Autowired + WXAlarm wxAlarm; + + @ComponentScan(basePackages = {"com.aos.test"}) + public static class Application { + + } + + @Test + public void robotTest() { + wxAlarm.alarm("test", "123"); + } +} diff --git a/aos-robot/pom.xml b/aos-robot/pom.xml new file mode 100644 index 0000000..a8e03f4 --- /dev/null +++ b/aos-robot/pom.xml @@ -0,0 +1,55 @@ + + + + aos-dependencies + com.aos + 1.0-SNAPSHOT + ../aos-dependencies/pom.xml + + 4.0.0 + + aos-robot + + + org.springframework + spring-context + 5.2.15.RELEASE + compile + + + org.springframework + spring-web + + + com.squareup.okhttp3 + okhttp + + + org.springframework.boot + spring-boot + + + org.springframework.boot + spring-boot-configuration-processor + true + + + commons-lang + commons-lang + 2.6 + compile + + + com.fasterxml.jackson.core + jackson-annotations + + + + + 8 + 8 + + + \ No newline at end of file diff --git a/aos-robot/src/main/java/com/aos/robot/WXAlarm.java b/aos-robot/src/main/java/com/aos/robot/WXAlarm.java new file mode 100644 index 0000000..8cbc75a --- /dev/null +++ b/aos-robot/src/main/java/com/aos/robot/WXAlarm.java @@ -0,0 +1,83 @@ +package com.aos.robot; + +import com.aos.robot.model.MegTypeEnum; +import com.aos.robot.model.RobotParam; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang.exception.ExceptionUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Component; + +import java.text.MessageFormat; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; + +/** + * @author: wangyl + * @date: 2022/6/25 + * @description: + */ +@Slf4j +@Component +public class WXAlarm { + + @Value("${spring.profiles.active}") + private String env; + @Autowired + WxRobot robot; + + public void alarm(String robootName, String message, Throwable error) { + String stackTrace = ExceptionUtils.getStackTrace(error); + message = message + "\n" + "错误信息:" + error.getMessage(); + message = message + "\n" + stackTrace; + this.makeTextMessage(robootName, message.substring(0, 2000)); + } + + public void alarm(String robootName, String message, Object... value) { + String format = message; + if (value.length != 0) { + format = MessageFormat.format(message, value); + } + this.makeTextMessage(robootName, format); + } + + public void markdown(String robotName, String message, Object... value) { + String format = MessageFormat.format(message, value); + this.makeMarkdownMessage(robotName, format); + } + + private void makeMarkdownMessage(String robotName, String message) { + RobotParam robotParam = new RobotParam(); + robotParam.setMsgtype(MegTypeEnum.MARKDOWN); + RobotParam.Markdown markdown = new RobotParam.Markdown(); + message = "## 当前时间 " + LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")) + "\n" + message; + markdown.setContent(message); + robotParam.setMarkdown(markdown); + this.send(robotName, robotParam); + } + + + private void makeTextMessage(String robotName, String message) { + message = "当前环境:" + env + "\n" + "当前时间:" + LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")) + "\n" + message; + RobotParam robotParam = new RobotParam(); + RobotParam.Text text = new RobotParam.Text(); + text.setContent(message); + robotParam.setText(text); + this.send(robotName, robotParam); + } + + /** + * 发送文本格式消息 + * + * @param robotName + * @param robotParam + * @return void + * @Date 2022/8/5 + * @Author wangyl + */ + private void send(String robotName, RobotParam robotParam) { + robot.sendMessage(robotName, robotParam); + } + + +} diff --git a/aos-robot/src/main/java/com/aos/robot/WxRobot.java b/aos-robot/src/main/java/com/aos/robot/WxRobot.java new file mode 100644 index 0000000..a5ed3e5 --- /dev/null +++ b/aos-robot/src/main/java/com/aos/robot/WxRobot.java @@ -0,0 +1,49 @@ +package com.aos.robot; + +import com.aos.robot.model.RobotConfig; +import com.aos.robot.model.RobotParam; +import com.aos.robot.model.RobotRes; +import lombok.extern.slf4j.Slf4j; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Component; +import org.springframework.util.StringUtils; +import org.springframework.web.client.RestTemplate; + +import javax.annotation.Resource; + +@Slf4j +@Component +public class WxRobot { + @Resource(name = "robotRestTemplate") + RestTemplate restTemplate; + @Resource + RobotConfig robotConfig; + + /** + * 发送消息 + * + * @param robotName 机器人名称 + * @param robotParam 机器人参数 + * @return void + * @Date 2022/8/5 + * @Author wangyl + */ + public void sendMessage(String robotName, RobotParam robotParam) { + String key = robotConfig.getIds().get(robotName); + if (StringUtils.isEmpty(key)) { + throw new RuntimeException("获取机器人名称:" + robotName + "对应的id失败,请检查配置asura.robot.wx.ids." + robotName + "是否存在"); + } + String url = RobotConfig.URL + key; + ResponseEntity stringResponseEntity = restTemplate.postForEntity(url, robotParam, RobotRes.class); + if (stringResponseEntity.getStatusCode() != HttpStatus.OK) { + throw new RuntimeException("消息发送异常,网络代码【" + stringResponseEntity.getStatusCodeValue() + "】"); + } + RobotRes body = stringResponseEntity.getBody(); + if (!body.succeed()) { + log.error("消息发送异常【{}】,错误码【{}】", body.getErrmsg(), body.getErrcode()); + throw new RuntimeException("消息发送异常,【" + body.getErrmsg() + "】"); + } + + } +} diff --git a/aos-robot/src/main/java/com/aos/robot/conf/AutoRobotConfig.java b/aos-robot/src/main/java/com/aos/robot/conf/AutoRobotConfig.java new file mode 100644 index 0000000..5d4caf3 --- /dev/null +++ b/aos-robot/src/main/java/com/aos/robot/conf/AutoRobotConfig.java @@ -0,0 +1,43 @@ +package com.aos.robot.conf; + +import com.aos.robot.model.RobotConfig; +import okhttp3.OkHttpClient; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.ComponentScan; +import org.springframework.context.annotation.Configuration; +import org.springframework.http.client.ClientHttpRequestFactory; +import org.springframework.http.client.OkHttp3ClientHttpRequestFactory; +import org.springframework.web.client.RestTemplate; + +import java.util.concurrent.TimeUnit; + +@Configuration +@ComponentScan(basePackages = {"com.aos.robot"}) +public class AutoRobotConfig { + + @Bean("robotRestTemplate") + public RestTemplate restTemplate() { + RestTemplate restTemplate = new RestTemplate(getClientHttpRequestFactory()); + return restTemplate; + } + + /** + * 使用OkHttpClient作为底层客户端 + * + * @return + */ + private ClientHttpRequestFactory getClientHttpRequestFactory() { + OkHttpClient okHttpClient = new OkHttpClient.Builder().connectTimeout(5, TimeUnit.SECONDS) + .writeTimeout(5, TimeUnit.SECONDS) + .readTimeout(5, TimeUnit.SECONDS) + .build(); + return new OkHttp3ClientHttpRequestFactory(okHttpClient); + } + + @Bean + @ConfigurationProperties(prefix = "asura.robot.wx") + public RobotConfig readDruidDataSource() { + return new RobotConfig(); + } +} diff --git a/aos-robot/src/main/java/com/aos/robot/model/MegTypeEnum.java b/aos-robot/src/main/java/com/aos/robot/model/MegTypeEnum.java new file mode 100644 index 0000000..ea64bbc --- /dev/null +++ b/aos-robot/src/main/java/com/aos/robot/model/MegTypeEnum.java @@ -0,0 +1,43 @@ +package com.aos.robot.model; + +import com.fasterxml.jackson.annotation.JsonValue; +import lombok.AllArgsConstructor; +import lombok.Getter; + +import java.util.HashMap; +import java.util.Map; + +/** + * @author: zouyang + * @date: 2022/6/1 + * @description: 活动需求状态 + */ +@Getter +@AllArgsConstructor +public enum MegTypeEnum { + /** + * + */ + TEXT(0, "text"), + MARKDOWN(1, "markdown"), + ; + private static final Map megTypeMAP = new HashMap<>(); + + static { + for (MegTypeEnum type : MegTypeEnum.values()) { + megTypeMAP.put(type.getValue(), type); + } + } + + /** + * 实际值 + */ + private final Integer value; + /** + * 描述 + */ + @JsonValue + private final String desc; + +} + diff --git a/aos-robot/src/main/java/com/aos/robot/model/RobotConfig.java b/aos-robot/src/main/java/com/aos/robot/model/RobotConfig.java new file mode 100644 index 0000000..84f0e5b --- /dev/null +++ b/aos-robot/src/main/java/com/aos/robot/model/RobotConfig.java @@ -0,0 +1,14 @@ +package com.aos.robot.model; + +import lombok.Data; + +import java.util.HashMap; +import java.util.Map; + + +@Data +public class RobotConfig { + private Map ids = new HashMap<>(); + final static public String URL = "https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key="; +} + diff --git a/aos-robot/src/main/java/com/aos/robot/model/RobotParam.java b/aos-robot/src/main/java/com/aos/robot/model/RobotParam.java new file mode 100644 index 0000000..6cae375 --- /dev/null +++ b/aos-robot/src/main/java/com/aos/robot/model/RobotParam.java @@ -0,0 +1,25 @@ +package com.aos.robot.model; + +import lombok.Data; + +import java.util.List; + +@Data +public class RobotParam { + MegTypeEnum msgtype = MegTypeEnum.TEXT; + Text text; + Markdown markdown; + + @Data + public static class Text { + String content; + List mentioned_list; + List mentioned_mobile_list; + } + + @Data + public static class Markdown { + String content; + } +} + diff --git a/aos-robot/src/main/java/com/aos/robot/model/RobotRes.java b/aos-robot/src/main/java/com/aos/robot/model/RobotRes.java new file mode 100644 index 0000000..b6bc6a6 --- /dev/null +++ b/aos-robot/src/main/java/com/aos/robot/model/RobotRes.java @@ -0,0 +1,32 @@ +package com.aos.robot.model; + +import lombok.Data; + +/** + * @author: wangyl + * @date: 2022/8/5 + * @description: 企业微信机器人返回信息 + */ +@Data +public class RobotRes { + /** + * 错误码 + */ + Integer errcode; + /** + * 错误信息 + */ + String errmsg; + + /** + * 判断是否成功 + * + * @param + * @return java.lang.Boolean + * @Date 2022/8/5 + * @Author wangyl + */ + public Boolean succeed() { + return errcode == 0; + } +} diff --git a/aos-robot/src/main/resources/META-INF/spring.factories b/aos-robot/src/main/resources/META-INF/spring.factories new file mode 100644 index 0000000..bf00a79 --- /dev/null +++ b/aos-robot/src/main/resources/META-INF/spring.factories @@ -0,0 +1 @@ +org.springframework.boot.autoconfigure.EnableAutoConfiguration=com.aos.robot.conf.AutoRobotConfig \ No newline at end of file diff --git a/aos-web/pom.xml b/aos-web/pom.xml index 56bf0a3..d88d6c9 100644 --- a/aos-web/pom.xml +++ b/aos-web/pom.xml @@ -47,5 +47,10 @@ org.springframework.boot spring-boot + + org.springframework.boot + spring-boot-configuration-processor + true + \ No newline at end of file diff --git a/pom.xml b/pom.xml index d36eb4e..a7db5af 100644 --- a/pom.xml +++ b/pom.xml @@ -16,6 +16,7 @@ aos-log aos-swagger aos-web + aos-robot pom