liu
9 小时以前 5d34bdd3c426bb2ca5f6627424ae67984f745603
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,77 @@
        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);
        }
    }
    /**
     * 统一处理接收者解析、发送与错误包装
     */