liusheng
2026-10-10 0afac42fb2e9d6e5291304dd0044ce3042b45d2b
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
package com.ruoyi.message.wechat.provider.xh;
 
import com.alibaba.fastjson.JSONObject;
import com.ruoyi.message.MessageChannel;
import com.ruoyi.message.SendResult;
import com.ruoyi.message.wechat.WechatMpConfig;
import com.ruoyi.message.wechat.WechatMpConfigProvider;
import com.ruoyi.message.wechat.WechatSendRequest;
import com.ruoyi.message.wechat.WechatSender;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.ObjectProvider;
import org.springframework.stereotype.Component;
 
import java.util.Map;
 
/**
 * 新华医院微信公众号发送方({@code xh} 通道)。
 * <p>
 * 对接特征:POST JSON + {@code sign=MD5(appSecret+body)},成功判定为返回 JSON 的 {@code succ == true}。
 * <p>
 * 站点差异(调用方需保留):
 * <ul>
 *   <li>需要机构级公众号配置(appid/appSecret/地址),配置不全时直接失败;</li>
 *   <li>要求 HIS 侧患者ID 非空。</li>
 * </ul>
 * 代码来源:{@code RyTask 公众号分支} + {@code RedisMqReceiver 公众号分支} +
 * {@code ServiceSubtaskServiceImpl.wechatSubTask}(行为保持不变)。
 */
@Slf4j
@Component
public class XinHuaMpSender implements WechatSender {
 
    /**
     * 渠道 key,与 {@code spring.profiles.active=xh} 对应
     */
    public static final String KEY = "xh";
 
    private final ObjectProvider<WechatMpConfigProvider> configProvider;
 
    private final XinHuaMpApi xinHuaMpApi;
 
    public XinHuaMpSender(ObjectProvider<WechatMpConfigProvider> configProvider, XinHuaMpApi xinHuaMpApi) {
        this.configProvider = configProvider;
        this.xinHuaMpApi = xinHuaMpApi;
    }
 
    @Override
    public String key() {
        return KEY;
    }
 
    @Override
    public String description() {
        return "新华医院微信公众号(sign 签名,succ 判定)";
    }
 
    @Override
    public SendResult send(WechatSendRequest request) {
        if (request == null) {
            return SendResult.fail(KEY, MessageChannel.WECHAT, "【公众号】请求参数为空", null);
        }
 
        WechatMpConfig config = resolveConfig(request.getOrgid());
        if (config == null || !config.isComplete()) {
            return SendResult.fail(KEY, MessageChannel.WECHAT,
                    "【公众号】该机构的公众号配置信息不全,无法通过公众号发送", null);
        }
 
        if (StringUtils.isEmpty(request.getPatidHis())) {
            return SendResult.fail(KEY, MessageChannel.WECHAT,
                    "【公众号】公众号发送失败,his系统的患者id为空", null);
        }
 
        try {
            String raw = xinHuaMpApi.sendMessage(
                    request.getIdCard(),
                    request.getUrl(),
                    request.getTitle(),
                    request.getContent(),
                    request.getPhone(),
                    request.getPatientName(),
                    request.getPatidHis(),
                    config,
                    request.isDisableHtmlEscaping());
 
            Map map = JSONObject.parseObject(raw, Map.class);
            boolean success = map != null && !map.isEmpty()
                    && map.get("succ") != null
                    && Boolean.parseBoolean(map.get("succ").toString());
            if (success) {
                return SendResult.success(KEY, MessageChannel.WECHAT, raw);
            }
            Object msg = map == null ? null : map.get("msg");
            String message = msg == null ? "【公众号】公众号发送失败" : msg.toString();
            log.error("【{}】公众号发送失败,错误信息:{}", KEY, message);
            return SendResult.fail(KEY, MessageChannel.WECHAT, message, raw);
        } catch (Exception e) {
            log.error("【{}】公众号发送异常:{}", KEY, e.getMessage(), e);
            return SendResult.fail(KEY, MessageChannel.WECHAT,
                    "【公众号】公众号发送失败,原因:" + e.getMessage(), null);
        }
    }
 
    private WechatMpConfig resolveConfig(String orgid) {
        WechatMpConfigProvider provider = configProvider.getIfAvailable();
        if (provider == null) {
            log.warn("【{}】未找到 WechatMpConfigProvider 实现,无法获取机构公众号配置", KEY);
            return null;
        }
        return provider.getConfig(orgid);
    }
}