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