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);
|
}
|
}
|