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} 通道)。
*
* 对接特征:POST JSON + {@code sign=MD5(appSecret+body)},成功判定为返回 JSON 的 {@code succ == true}。
*
* 站点差异(调用方需保留):
*
* - 需要机构级公众号配置(appid/appSecret/地址),配置不全时直接失败;
* - 要求 HIS 侧患者ID 非空。
*
* 代码来源:{@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 configProvider;
private final XinHuaMpApi xinHuaMpApi;
public XinHuaMpSender(ObjectProvider 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);
}
}