package com.ruoyi.message.sms; import com.ruoyi.message.SendException; import com.ruoyi.message.SendResult; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.stereotype.Component; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import java.util.Set; import java.util.TreeSet; /** * 短信发送方工厂:按 key 路由到一个具体实现,调用方不再需要 {@code if (active.equals("xx"))} 硬分支。 *

* Spring 会自动把所有 {@link SmsSender} 注入进来,新增一个站点只需新增一个实现类。 */ @Slf4j @Component public class SmsSenderFactory { /** * 站点 profile → 短信通道 key 的映射。 *

* 目前两边取值完全一致({@code spring.profiles.active} 直接就是渠道名), * 单独留出映射表是为了将来 profile 名与渠道名解耦时不改调用方。 */ private static final Map PROFILE_ALIAS = new LinkedHashMap<>(); static { PROFILE_ALIAS.put("xh", "xh"); PROFILE_ALIAS.put("ls", "ls"); PROFILE_ALIAS.put("sltd", "sltd"); PROFILE_ALIAS.put("nhfy", "nhfy"); PROFILE_ALIAS.put("hzszlyy", "hzszlyy"); } private final Map senders = new LinkedHashMap<>(); public SmsSenderFactory(List senderList) { for (SmsSender sender : senderList) { SmsSender exists = senders.put(sender.key(), sender); if (exists != null) { throw new IllegalStateException("短信发送方 key 重复:" + sender.key() + ",冲突实现:" + exists.getClass().getName() + " 与 " + sender.getClass().getName()); } } log.info("【SmsSenderFactory】已注册短信发送方:{}", senders.keySet()); } /** * 按 key 获取发送方 * * @param key 渠道 key(即 {@code spring.profiles.active} 取值) * @return 发送方实现 * @throws SendException 找不到对应实现时抛出 */ public SmsSender get(String key) { String resolved = resolveSmsKey(key); SmsSender sender = resolved == null ? null : senders.get(resolved); if (sender == null) { throw new SendException("未找到短信发送方,key=" + key + ",已注册:" + senders.keySet()); } return sender; } /** * 按 key 获取发送方,找不到返回 {@code null} */ public SmsSender getOrNull(String key) { String resolved = resolveSmsKey(key); return resolved == null ? null : senders.get(resolved); } /** * 按 key 发送短信(等价于旧代码里那 200 行 if-else 的结果) */ public SendResult send(String key, SmsSendRequest request) { return get(key).send(request); } /** * 判断是否存在该 key 的发送方 */ public boolean supports(String key) { return getOrNull(key) != null; } /** * 已注册的渠道 key */ public Set keys() { return new TreeSet<>(senders.keySet()); } /** * 站点 profile → 渠道 key */ public static String resolveSmsKey(String profile) { if (StringUtils.isEmpty(profile)) { return null; } String alias = PROFILE_ALIAS.get(profile); return alias == null ? profile : alias; } }