From 9efecf90d32e39b2ecab8fd6c789300962fd5a97 Mon Sep 17 00:00:00 2001
From: lty <876263681@qq.com>
Date: 星期六, 07 三月 2026 12:49:00 +0800
Subject: [PATCH] #钉钉消息通知

---
 src/main/java/com/zy/asrs/task/handler/ExceptionNoticeHandler.java |   61 +++++++++++++++
 src/main/java/com/zy/asrs/task/ExceptionNoticeScheduler.java       |   16 ++++
 src/main/java/com/zy/common/utils/DingDingPush.java                |  117 +++++++++++++++++++++++++++++
 pom.xml                                                            |   12 +++
 4 files changed, 206 insertions(+), 0 deletions(-)

diff --git a/pom.xml b/pom.xml
index ca051d4..14c7a6d 100644
--- a/pom.xml
+++ b/pom.xml
@@ -112,6 +112,18 @@
             <artifactId>truelicense-core</artifactId>
             <version>1.33</version>
         </dependency>
+        <!-- 閽夐拤娑堟伅鎺ㄩ�� -->
+        <dependency>
+            <groupId>com.aliyun</groupId>
+            <artifactId>alibaba-dingtalk-service-sdk</artifactId>
+            <version>1.0.1</version>
+            <exclusions>
+                <exclusion>
+                    <groupId>log4j</groupId>
+                    <artifactId>log4j</artifactId>
+                </exclusion>
+            </exclusions>
+        </dependency>
         <!-- WebClient -->
         <dependency>
             <groupId>org.springframework.boot</groupId>
diff --git a/src/main/java/com/zy/asrs/task/ExceptionNoticeScheduler.java b/src/main/java/com/zy/asrs/task/ExceptionNoticeScheduler.java
new file mode 100644
index 0000000..06a973e
--- /dev/null
+++ b/src/main/java/com/zy/asrs/task/ExceptionNoticeScheduler.java
@@ -0,0 +1,16 @@
+package com.zy.asrs.task;
+
+import com.zy.asrs.task.core.ReturnT;
+import org.springframework.scheduling.annotation.Scheduled;
+
+import static org.reflections.Reflections.log;
+
+public class ExceptionNoticeScheduler {
+    @Scheduled(cron = "0/1 * * * * ? ")
+    private void execute(){
+        ReturnT<String> returnT = exceptionNoticeHandler.start();
+        if (!returnT.isSuccess()) {
+            log.error(returnT.getMsg());
+        }
+    }
+}
diff --git a/src/main/java/com/zy/asrs/task/handler/ExceptionNoticeHandler.java b/src/main/java/com/zy/asrs/task/handler/ExceptionNoticeHandler.java
new file mode 100644
index 0000000..92ab9b3
--- /dev/null
+++ b/src/main/java/com/zy/asrs/task/handler/ExceptionNoticeHandler.java
@@ -0,0 +1,61 @@
+package com.zy.asrs.task.handler;
+
+import com.baomidou.mybatisplus.mapper.EntityWrapper;
+import com.baomidou.mybatisplus.plugins.Page;
+import com.zy.asrs.entity.ApiLog;
+import com.zy.asrs.service.ApiLogService;
+import com.zy.asrs.task.AbstractHandler;
+import com.zy.asrs.task.core.ReturnT;
+import com.zy.common.utils.DingDingPush;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.transaction.interceptor.TransactionAspectSupport;
+
+
+@Slf4j
+@Service
+@Transactional
+public class ExceptionNoticeHandler extends AbstractHandler<String> {
+    @Autowired
+    private ApiLogService apiLogService;
+    @Transactional
+    public ReturnT<String> start() {
+        try {
+            EntityWrapper<ApiLog> wrapper = new EntityWrapper<>();
+            wrapper.eq("result", 0).isNull("memo").orderBy("create_time", false);
+            Page<ApiLog> page = apiLogService.selectPage(new Page<>(1, 1), wrapper);
+            if (page.getRecords() != null && !page.getRecords().isEmpty()) {
+                ApiLog item = page.getRecords().get(0);
+                StringBuilder sb = new StringBuilder();
+                sb.append("寮傚父鍛婅").append("\n");
+                sb.append("鏃堕棿: ").append(item.getCreateTime$()).append("\n");
+                sb.append("鎺ュ彛: ").append(nvl(item.getNamespace())).append(" ").append(nvl(item.getUrl())).append("\n");
+                sb.append("IP: ").append(nvl(item.getClientIp())).append("\n");
+                sb.append("璇锋眰: ").append(cut(nvl(item.getRequest()), 500)).append("\n");
+                sb.append("鍝嶅簲: ").append(cut(nvl(item.getResponse()), 500)).append("\n");
+                sb.append("寮傚父: ").append(cut(nvl(item.getErr()), 500));
+                DingDingPush.send(sb.toString());
+                item.setMemo("PUSHED");
+                apiLogService.updateById(item);
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+            TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
+            return FAIL.setMsg(e.getMessage());
+        }
+        return SUCCESS;
+    }
+
+    private String nvl(String s) {
+        return s == null ? "" : s;
+    }
+
+    private String cut(String s, int max) {
+        if (s == null) {
+            return "";
+        }
+        return s.length() > max ? s.substring(0, max) : s;
+    }
+}
diff --git a/src/main/java/com/zy/common/utils/DingDingPush.java b/src/main/java/com/zy/common/utils/DingDingPush.java
new file mode 100644
index 0000000..f2115fd
--- /dev/null
+++ b/src/main/java/com/zy/common/utils/DingDingPush.java
@@ -0,0 +1,117 @@
+package com.zy.common.utils;
+
+import com.alibaba.fastjson.JSON;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.io.PrintWriter;
+import java.net.URL;
+import java.net.URLConnection;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * 閽夐拤娑堟伅鍙戦��
+ */
+public class DingDingPush {
+
+    public static void main(String[] args) {
+        StringBuffer pushSb = new StringBuffer();
+        pushSb.append("銆�")
+                .append(new Date()).append("銆�")
+                .append("ERRORChina");
+        DingDingPush.send(pushSb.toString());
+    }
+
+    public static String send(String content){
+        //娴嬭瘯鏈哄櫒浜簁ey
+        String dingKey ="https://oapi.dingtalk.com/robot/send?access_token=a7b0a0e96f4b19810e545b0518740e16ad934679c42ffb0a4d545cf4fd129887";
+        // 璇锋眰鐨凧SON鏁版嵁锛岃繖閲屾垜鐢╩ap鍦ㄥ伐鍏风被閲岃浆鎴恓son鏍煎紡
+        Map<String,Object> json=new HashMap<>();
+        Map<String,Object> text=new HashMap<>();
+        json.put("msgtype","text");
+        text.put("content",content);
+        json.put("text",text);
+        // 鍙戦�乸ost璇锋眰
+        String result = DingDingPush.sendPostByMap(dingKey, json);
+        System.out.println("result sefsefsfsef " + result);
+        return result;
+    }
+
+    /**
+     * 鍙戦�丳OST璇锋眰锛屽弬鏁版槸Map, contentType=x-www-form-urlencoded
+     *
+     * @param url
+     * @param mapParam
+     * @return
+     */
+    public static String sendPostByMap(String url, Map<String, Object> mapParam) {
+        Map<String, String> headParam = new HashMap<>();
+        headParam.put("Content-type", "application/json;charset=UTF-8");
+        return sendPost(url, mapParam, headParam);
+    }
+
+    /**
+     * 鍚戞寚瀹� URL 鍙戦�丳OST鏂规硶鐨勮姹�
+     *
+     * @param url   鍙戦�佽姹傜殑 URL
+     * @param param 璇锋眰鍙傛暟锛�
+     * @return 鎵�浠h〃杩滅▼璧勬簮鐨勫搷搴旂粨鏋�
+     */
+    public static String sendPost(String url, Map<String, Object> param, Map<String, String> headParam) {
+        PrintWriter out = null;
+        BufferedReader in = null;
+        String result = "";
+        try {
+            URL realUrl = new URL(url);
+            // 鎵撳紑鍜孶RL涔嬮棿鐨勮繛鎺�
+            URLConnection conn = realUrl.openConnection();
+            // 璁剧疆閫氱敤鐨勮姹傚睘鎬� 璇锋眰澶�
+            conn.setRequestProperty("accept", "*/*");
+            conn.setRequestProperty("connection", "Keep-Alive");
+            conn.setRequestProperty("user-agent",
+                    "Fiddler");
+            if (headParam != null) {
+                for (Map.Entry<String, String> entry : headParam.entrySet()) {
+                    conn.setRequestProperty(entry.getKey(), entry.getValue());
+                }
+            }
+            // 鍙戦�丳OST璇锋眰蹇呴』璁剧疆濡備笅涓よ
+            conn.setDoOutput(true);
+            conn.setDoInput(true);
+            // 鑾峰彇URLConnection瀵硅薄瀵瑰簲鐨勮緭鍑烘祦
+            out = new PrintWriter(conn.getOutputStream());
+            // 鍙戦�佽姹傚弬鏁�
+            out.print(JSON.toJSONString(param));
+            // flush杈撳嚭娴佺殑缂撳啿
+            out.flush();
+            // 瀹氫箟BufferedReader杈撳叆娴佹潵璇诲彇URL鐨勫搷搴�
+            in = new BufferedReader(
+                    new InputStreamReader(conn.getInputStream()));
+            String line;
+            while ((line = in.readLine()) != null) {
+                result += line;
+            }
+            System.out.println("line=" +line);
+        } catch (Exception e) {
+            System.out.println("鍙戦�� POST 璇锋眰鍑虹幇寮傚父锛�" + e);
+            e.printStackTrace();
+        }
+        //浣跨敤finally鍧楁潵鍏抽棴杈撳嚭娴併�佽緭鍏ユ祦
+        finally {
+            try {
+                if (out != null) {
+                    out.close();
+                }
+                if (in != null) {
+                    in.close();
+                }
+            } catch (IOException ex) {
+                ex.printStackTrace();
+            }
+        }
+        return result;
+    }
+}

--
Gitblit v1.9.1