From 47dd1ecaf0aafa66b9c39fff9c91abc1c611b02c Mon Sep 17 00:00:00 2001
From: liu <2021943741@qq.com>
Date: 星期二, 27 十月 2026 17:59:46 +0800
Subject: [PATCH] feat(wxcp): 通知支持图片/视频/Markdown/多图文模板与成员预览

---
 yudao-module-wxcp/src/main/java/cn/iocoder/yudao/module/wxcp/service/push/WxCpMessagePushServiceImpl.java |  119 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 119 insertions(+), 0 deletions(-)

diff --git a/yudao-module-wxcp/src/main/java/cn/iocoder/yudao/module/wxcp/service/push/WxCpMessagePushServiceImpl.java b/yudao-module-wxcp/src/main/java/cn/iocoder/yudao/module/wxcp/service/push/WxCpMessagePushServiceImpl.java
index 59a8a6e..7c027c8 100644
--- a/yudao-module-wxcp/src/main/java/cn/iocoder/yudao/module/wxcp/service/push/WxCpMessagePushServiceImpl.java
+++ b/yudao-module-wxcp/src/main/java/cn/iocoder/yudao/module/wxcp/service/push/WxCpMessagePushServiceImpl.java
@@ -7,6 +7,8 @@
 import jakarta.annotation.Resource;
 import lombok.extern.slf4j.Slf4j;
 import me.chanjar.weixin.cp.api.WxCpService;
+import me.chanjar.weixin.common.bean.result.WxMediaUploadResult;
+import me.chanjar.weixin.cp.bean.article.NewArticle;
 import me.chanjar.weixin.cp.bean.message.WxCpMessage;
 import me.chanjar.weixin.cp.bean.message.WxCpMessageSendResult;
 import org.springframework.stereotype.Service;
@@ -58,6 +60,123 @@
         return doSend(message, scope, target, "text");
     }
 
+    @Override
+    public WxCpPushResultVO pushNews(String title, String description, String url, String picUrl,
+                                     Integer scope, String target) {
+        if (StrUtil.isBlank(url)) {
+            throw new IllegalArgumentException("鎺ㄩ�佸浘鏂囨秷鎭椂 url 涓嶈兘涓虹┖");
+        }
+        NewArticle article = NewArticle.builder()
+                .title(title)
+                .description(StrUtil.blankToDefault(description, ""))
+                .url(url)
+                .picUrl(picUrl)
+                .build();
+        WxCpMessage message = WxCpMessage.NEWS()
+                .agentId(agentId())
+                .addArticle(article)
+                .build();
+        return doSend(message, scope, target, "news");
+    }
+
+    @Override
+    public WxCpPushResultVO pushFile(java.io.File file, String fileName, String textContent,
+                                     Integer scope, String target) {
+        if (file == null || !file.exists()) {
+            return new WxCpPushResultVO(false, null, "鏂囦欢涓嶅瓨鍦紝鏃犳硶鎺ㄩ��", null, null);
+        }
+        try {
+            // 1. 涓婁紶鏂囦欢鍒颁紒涓氬井淇★紝鎹㈠彇 mediaId
+            WxMediaUploadResult upload = wxCpService.getMediaService().upload("file", file);
+            if (upload == null || StrUtil.isBlank(upload.getMediaId())) {
+                return new WxCpPushResultVO(false, null, "鏂囦欢涓婁紶浼佷笟寰俊澶辫触", null, null);
+            }
+            // 2. 鍏堝彂閫佽鏄庢枃鏈紝鍐嶅彂閫佹枃浠讹紱鏂囨湰澶辫触涓嶉樆濉炴枃浠跺彂閫�
+            if (StrUtil.isNotBlank(textContent)) {
+                pushText(textContent, scope, target);
+            }
+            // 3. 鍙戦�佹枃浠舵秷鎭�
+            WxCpMessage message = WxCpMessage.FILE()
+                    .agentId(agentId())
+                    .mediaId(upload.getMediaId())
+                    .build();
+            WxCpPushResultVO result = doSend(message, scope, target, "file");
+            log.info("[pushFile][鏂囦欢鎺ㄩ�佸畬鎴� fileName={} success={}]", fileName, result.getSuccess());
+            return result;
+        } catch (Exception e) {
+            log.error("[pushFile][鏂囦欢涓婁紶鎴栨帹閫佸紓甯� fileName={}]", fileName, e);
+            return new WxCpPushResultVO(false, null, "鏂囦欢鎺ㄩ�佸紓甯革細" + e.getMessage(), null, null);
+        }
+    }
+
+    @Override
+    public WxCpPushResultVO pushImage(java.io.File file, Integer scope, String target) {
+        if (file == null || !file.exists()) {
+            return new WxCpPushResultVO(false, null, "鍥剧墖鏂囦欢涓嶅瓨鍦紝鏃犳硶鎺ㄩ��", null, null);
+        }
+        try {
+            // 浼佷笟寰俊鍥剧墖娑堟伅瑕佹眰鍏堢敤 image 绫诲瀷涓婁紶鎹㈠彇 mediaId
+            WxMediaUploadResult upload = wxCpService.getMediaService().upload("image", file);
+            if (upload == null || StrUtil.isBlank(upload.getMediaId())) {
+                return new WxCpPushResultVO(false, null, "鍥剧墖涓婁紶浼佷笟寰俊澶辫触", null, null);
+            }
+            WxCpMessage message = WxCpMessage.IMAGE()
+                    .agentId(agentId())
+                    .mediaId(upload.getMediaId())
+                    .build();
+            return doSend(message, scope, target, "image");
+        } catch (Exception e) {
+            log.error("[pushImage][鍥剧墖涓婁紶鎴栨帹閫佸紓甯� file={}]", file.getName(), e);
+            return new WxCpPushResultVO(false, null, "鍥剧墖鎺ㄩ�佸紓甯革細" + e.getMessage(), null, null);
+        }
+    }
+
+    @Override
+    public WxCpPushResultVO pushVideo(java.io.File file, String title, String description,
+                                      Integer scope, String target) {
+        if (file == null || !file.exists()) {
+            return new WxCpPushResultVO(false, null, "瑙嗛鏂囦欢涓嶅瓨鍦紝鏃犳硶鎺ㄩ��", null, null);
+        }
+        try {
+            // 浼佷笟寰俊瑙嗛娑堟伅瑕佹眰鍏堢敤 video 绫诲瀷涓婁紶鎹㈠彇 mediaId
+            WxMediaUploadResult upload = wxCpService.getMediaService().upload("video", file);
+            if (upload == null || StrUtil.isBlank(upload.getMediaId())) {
+                return new WxCpPushResultVO(false, null, "瑙嗛涓婁紶浼佷笟寰俊澶辫触", null, null);
+            }
+            WxCpMessage message = WxCpMessage.VIDEO()
+                    .agentId(agentId())
+                    .mediaId(upload.getMediaId())
+                    .title(StrUtil.blankToDefault(title, "閫氱煡瑙嗛"))
+                    .description(StrUtil.blankToDefault(description, ""))
+                    .build();
+            return doSend(message, scope, target, "video");
+        } catch (Exception e) {
+            log.error("[pushVideo][瑙嗛涓婁紶鎴栨帹閫佸紓甯� file={}]", file.getName(), e);
+            return new WxCpPushResultVO(false, null, "瑙嗛鎺ㄩ�佸紓甯革細" + e.getMessage(), null, null);
+        }
+    }
+
+    @Override
+    public WxCpPushResultVO pushMarkdown(String content, Integer scope, String target) {
+        WxCpMessage message = WxCpMessage.MARKDOWN()
+                .agentId(agentId())
+                .content(content)
+                .build();
+        return doSend(message, scope, target, "markdown");
+    }
+
+    @Override
+    public WxCpPushResultVO pushMultiNews(java.util.List<NewArticle> articles, Integer scope, String target) {
+        if (articles == null || articles.isEmpty()) {
+            return new WxCpPushResultVO(false, null, "鍥炬枃鍐呭涓虹┖锛屾棤娉曟帹閫�", null, null);
+        }
+        WxCpMessage message = WxCpMessage.NEWS()
+                .agentId(agentId())
+                .articles(articles)
+                .build();
+        return doSend(message, scope, target, "multi_news");
+    }
+
     /**
      * 缁熶竴澶勭悊鎺ユ敹鑰呰В鏋愩�佸彂閫佷笌閿欒鍖呰
      */

--
Gitblit v1.9.3