短信发送
This commit is contained in:
parent
6bcf5adce3
commit
ce3a5c55a1
|
@ -0,0 +1,151 @@
|
||||||
|
package net.maku.sms.service;
|
||||||
|
|
||||||
|
import cn.hutool.core.map.MapUtil;
|
||||||
|
import cn.hutool.core.util.StrUtil;
|
||||||
|
import lombok.AllArgsConstructor;
|
||||||
|
import lombok.extern.slf4j.Slf4j;
|
||||||
|
import net.maku.framework.common.constant.Constant;
|
||||||
|
import net.maku.framework.common.exception.ServerException;
|
||||||
|
import net.maku.framework.common.utils.ExceptionUtils;
|
||||||
|
import net.maku.framework.common.utils.JsonUtils;
|
||||||
|
import net.maku.sms.SmsContext;
|
||||||
|
import net.maku.sms.config.SmsConfig;
|
||||||
|
import net.maku.system.cache.SmsConfigCache;
|
||||||
|
import net.maku.system.entity.SysSmsLogEntity;
|
||||||
|
import net.maku.system.service.SysSmsConfigService;
|
||||||
|
import net.maku.system.service.SysSmsLogService;
|
||||||
|
import org.apache.commons.lang3.StringUtils;
|
||||||
|
import org.springframework.stereotype.Service;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 短信服务
|
||||||
|
*
|
||||||
|
* @author 阿沐 babamu@126.com
|
||||||
|
* <a href="https://maku.net">MAKU</a>
|
||||||
|
*/
|
||||||
|
@Slf4j
|
||||||
|
@Service
|
||||||
|
@AllArgsConstructor
|
||||||
|
public class SmsService {
|
||||||
|
private final SysSmsConfigService sysSmsConfigService;
|
||||||
|
private final SysSmsLogService sysSmsLogService;
|
||||||
|
private final SmsConfigCache smsConfigCache;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 发送短信
|
||||||
|
*
|
||||||
|
* @param mobile 手机号
|
||||||
|
* @return 是否发送成功
|
||||||
|
*/
|
||||||
|
public boolean send(String mobile) {
|
||||||
|
return this.send(mobile, MapUtil.newHashMap());
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 发送短信
|
||||||
|
*
|
||||||
|
* @param groupName 分组名称
|
||||||
|
* @param mobile 手机号
|
||||||
|
* @return 是否发送成功
|
||||||
|
*/
|
||||||
|
public boolean send(String groupName, String mobile) {
|
||||||
|
return this.send(mobile, MapUtil.newHashMap());
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 发送短信
|
||||||
|
*
|
||||||
|
* @param mobile 手机号
|
||||||
|
* @param params 参数
|
||||||
|
* @return 是否发送成功
|
||||||
|
*/
|
||||||
|
public boolean send(String mobile, Map<String, String> params) {
|
||||||
|
return this.send(null, mobile, params);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 发送短信
|
||||||
|
*
|
||||||
|
* @param groupName 分组名称
|
||||||
|
* @param mobile 手机号
|
||||||
|
* @param params 参数
|
||||||
|
* @return 是否发送成功
|
||||||
|
*/
|
||||||
|
public boolean send(String groupName, String mobile, Map<String, String> params) {
|
||||||
|
SmsConfig config = roundSmsConfig(groupName);
|
||||||
|
|
||||||
|
try {
|
||||||
|
// 发送短信
|
||||||
|
new SmsContext(config).send(mobile, params);
|
||||||
|
|
||||||
|
saveLog(config, mobile, params, null);
|
||||||
|
return true;
|
||||||
|
} catch (Exception e) {
|
||||||
|
log.error("短信发送失败,手机号:{}", mobile, e);
|
||||||
|
|
||||||
|
saveLog(config, mobile, params, e);
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 保存短信日志
|
||||||
|
*/
|
||||||
|
public void saveLog(SmsConfig config, String mobile, Map<String, String> params, Exception e) {
|
||||||
|
SysSmsLogEntity logEntity = new SysSmsLogEntity();
|
||||||
|
logEntity.setPlatform(config.getPlatform());
|
||||||
|
logEntity.setPlatformId(config.getId());
|
||||||
|
logEntity.setMobile(mobile);
|
||||||
|
logEntity.setParams(JsonUtils.toJsonString(params));
|
||||||
|
|
||||||
|
if (e != null) {
|
||||||
|
String error = StringUtils.substring(ExceptionUtils.getExceptionMessage(e), 0, 2000);
|
||||||
|
logEntity.setStatus(Constant.FAIL);
|
||||||
|
logEntity.setError(error);
|
||||||
|
} else {
|
||||||
|
logEntity.setStatus(Constant.SUCCESS);
|
||||||
|
}
|
||||||
|
|
||||||
|
sysSmsLogService.save(logEntity);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 通过轮询算法,获取短信平台的配置
|
||||||
|
*
|
||||||
|
* @param groupName 分组名称
|
||||||
|
* @return 短信平台配置
|
||||||
|
*/
|
||||||
|
private SmsConfig roundSmsConfig(String groupName) {
|
||||||
|
List<SmsConfig> platformList = sysSmsConfigService.listByEnable();
|
||||||
|
|
||||||
|
// 是否有可用的短信平台
|
||||||
|
if (platformList.isEmpty()) {
|
||||||
|
throw new ServerException("没有可用的短信平台,请先添加");
|
||||||
|
}
|
||||||
|
|
||||||
|
// 没有短信编码的情况
|
||||||
|
if (StrUtil.isBlank(groupName)) {
|
||||||
|
// 采用轮询算法,发送短信
|
||||||
|
long round = smsConfigCache.getRoundValue();
|
||||||
|
|
||||||
|
return platformList.get((int) round % platformList.size());
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// 有短信编码的情况
|
||||||
|
List<SmsConfig> newList = platformList.stream().filter(platform -> StrUtil.equals(platform.getGroupName(), groupName)).toList();
|
||||||
|
if (newList.isEmpty()) {
|
||||||
|
throw new ServerException("短信分组不存在");
|
||||||
|
}
|
||||||
|
|
||||||
|
long round = smsConfigCache.getRoundCodeValue();
|
||||||
|
|
||||||
|
// 指定短信平台
|
||||||
|
return newList.get((int) round % newList.size());
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user