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