mirror of
				https://github.com/YunaiV/ruoyi-vue-pro.git
				synced 2025-10-31 10:37:41 +08:00 
			
		
		
		
	1. 创建和修改短信模板时,接入 API 短信模板的校验
This commit is contained in:
		| @ -77,8 +77,7 @@ public class SysSmsServiceImpl implements SysSmsService { | |||||||
|     @Override |     @Override | ||||||
|     public void sendBatchSms(List<String> mobiles, List<Long> userIds, Integer userType, |     public void sendBatchSms(List<String> mobiles, List<Long> userIds, Integer userType, | ||||||
|                              String templateCode, Map<String, Object> templateParams) { |                              String templateCode, Map<String, Object> templateParams) { | ||||||
|         // 校验短信模板是否存在 |         throw new IllegalArgumentException("暂时不支持该操作,感兴趣可以实现该功能哟!"); | ||||||
|         SysSmsTemplateDO template = this.checkSmsTemplateValid(templateCode); |  | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     private SysSmsTemplateDO checkSmsTemplateValid(String templateCode) { |     private SysSmsTemplateDO checkSmsTemplateValid(String templateCode) { | ||||||
|  | |||||||
| @ -4,6 +4,10 @@ import cn.hutool.core.util.ReUtil; | |||||||
| import cn.hutool.core.util.StrUtil; | import cn.hutool.core.util.StrUtil; | ||||||
| import cn.iocoder.dashboard.common.enums.CommonStatusEnum; | import cn.iocoder.dashboard.common.enums.CommonStatusEnum; | ||||||
| import cn.iocoder.dashboard.common.pojo.PageResult; | import cn.iocoder.dashboard.common.pojo.PageResult; | ||||||
|  | import cn.iocoder.dashboard.framework.sms.core.client.SmsClient; | ||||||
|  | import cn.iocoder.dashboard.framework.sms.core.client.SmsClientFactory; | ||||||
|  | import cn.iocoder.dashboard.framework.sms.core.client.SmsCommonResult; | ||||||
|  | import cn.iocoder.dashboard.framework.sms.core.client.dto.SmsTemplateRespDTO; | ||||||
| import cn.iocoder.dashboard.modules.system.controller.sms.vo.template.SysSmsTemplateCreateReqVO; | import cn.iocoder.dashboard.modules.system.controller.sms.vo.template.SysSmsTemplateCreateReqVO; | ||||||
| import cn.iocoder.dashboard.modules.system.controller.sms.vo.template.SysSmsTemplateExportReqVO; | import cn.iocoder.dashboard.modules.system.controller.sms.vo.template.SysSmsTemplateExportReqVO; | ||||||
| import cn.iocoder.dashboard.modules.system.controller.sms.vo.template.SysSmsTemplatePageReqVO; | import cn.iocoder.dashboard.modules.system.controller.sms.vo.template.SysSmsTemplatePageReqVO; | ||||||
| @ -16,6 +20,8 @@ import cn.iocoder.dashboard.modules.system.service.sms.SysSmsChannelService; | |||||||
| import cn.iocoder.dashboard.modules.system.service.sms.SysSmsTemplateService; | import cn.iocoder.dashboard.modules.system.service.sms.SysSmsTemplateService; | ||||||
| import com.google.common.annotations.VisibleForTesting; | import com.google.common.annotations.VisibleForTesting; | ||||||
| import org.springframework.stereotype.Service; | import org.springframework.stereotype.Service; | ||||||
|  | import org.springframework.util.Assert; | ||||||
|  | import org.springframework.validation.annotation.Validated; | ||||||
|  |  | ||||||
| import javax.annotation.Resource; | import javax.annotation.Resource; | ||||||
| import java.util.Collection; | import java.util.Collection; | ||||||
| @ -34,6 +40,7 @@ import static cn.iocoder.dashboard.modules.system.enums.SysErrorCodeConstants.*; | |||||||
|  * @date 2021/1/25 9:25 |  * @date 2021/1/25 9:25 | ||||||
|  */ |  */ | ||||||
| @Service | @Service | ||||||
|  | @Validated | ||||||
| public class SysSmsTemplateServiceImpl implements SysSmsTemplateService { | public class SysSmsTemplateServiceImpl implements SysSmsTemplateService { | ||||||
|  |  | ||||||
|     /** |     /** | ||||||
| @ -47,6 +54,9 @@ public class SysSmsTemplateServiceImpl implements SysSmsTemplateService { | |||||||
|     @Resource |     @Resource | ||||||
|     private SysSmsChannelService smsChannelService; |     private SysSmsChannelService smsChannelService; | ||||||
|  |  | ||||||
|  |     @Resource | ||||||
|  |     private SmsClientFactory smsClientFactory; | ||||||
|  |  | ||||||
|     @Override |     @Override | ||||||
|     public SysSmsTemplateDO getSmsTemplateByCode(String code) { |     public SysSmsTemplateDO getSmsTemplateByCode(String code) { | ||||||
|         return smsTemplateMapper.selectByCode(code); |         return smsTemplateMapper.selectByCode(code); | ||||||
| @ -68,6 +78,8 @@ public class SysSmsTemplateServiceImpl implements SysSmsTemplateService { | |||||||
|         SysSmsChannelDO channelDO = checkSmsChannel(createReqVO.getChannelId()); |         SysSmsChannelDO channelDO = checkSmsChannel(createReqVO.getChannelId()); | ||||||
|         // 校验短信编码是否重复 |         // 校验短信编码是否重复 | ||||||
|         checkSmsTemplateCodeDuplicate(null, createReqVO.getCode()); |         checkSmsTemplateCodeDuplicate(null, createReqVO.getCode()); | ||||||
|  |         // 校验短信模板 | ||||||
|  |         checkApiTemplate(createReqVO.getChannelId(), createReqVO.getApiTemplateId()); | ||||||
|  |  | ||||||
|         // 插入 |         // 插入 | ||||||
|         SysSmsTemplateDO template = SysSmsTemplateConvert.INSTANCE.convert(createReqVO); |         SysSmsTemplateDO template = SysSmsTemplateConvert.INSTANCE.convert(createReqVO); | ||||||
| @ -86,6 +98,8 @@ public class SysSmsTemplateServiceImpl implements SysSmsTemplateService { | |||||||
|         SysSmsChannelDO channelDO = checkSmsChannel(updateReqVO.getChannelId()); |         SysSmsChannelDO channelDO = checkSmsChannel(updateReqVO.getChannelId()); | ||||||
|         // 校验短信编码是否重复 |         // 校验短信编码是否重复 | ||||||
|         checkSmsTemplateCodeDuplicate(updateReqVO.getId(), updateReqVO.getCode()); |         checkSmsTemplateCodeDuplicate(updateReqVO.getId(), updateReqVO.getCode()); | ||||||
|  |         // 校验短信模板 | ||||||
|  |         checkApiTemplate(updateReqVO.getChannelId(), updateReqVO.getApiTemplateId()); | ||||||
|  |  | ||||||
|         // 更新 |         // 更新 | ||||||
|         SysSmsTemplateDO updateObj = SysSmsTemplateConvert.INSTANCE.convert(updateReqVO); |         SysSmsTemplateDO updateObj = SysSmsTemplateConvert.INSTANCE.convert(updateReqVO); | ||||||
| @ -155,4 +169,20 @@ public class SysSmsTemplateServiceImpl implements SysSmsTemplateService { | |||||||
|         } |         } | ||||||
|     } |     } | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 校验 API 短信平台的模板是否有效 | ||||||
|  |      * | ||||||
|  |      * @param channelId 渠道编号 | ||||||
|  |      * @param apiTemplateId API 模板编号 | ||||||
|  |      */ | ||||||
|  |     @VisibleForTesting | ||||||
|  |     public void checkApiTemplate(Long channelId, String apiTemplateId) { | ||||||
|  |         // 获得短信模板 | ||||||
|  |         SmsClient smsClient = smsClientFactory.getSmsClient(channelId); | ||||||
|  |         Assert.notNull(smsClient, String.format("短信客户端(%d) 不存在", channelId)); | ||||||
|  |         SmsCommonResult<SmsTemplateRespDTO> templateResult = smsClient.getSmsTemplate(apiTemplateId); | ||||||
|  |         // 校验短信模板是否正确 | ||||||
|  |         templateResult.checkError(); | ||||||
|  |     } | ||||||
|  |  | ||||||
| } | } | ||||||
|  | |||||||
| @ -2,8 +2,16 @@ package cn.iocoder.dashboard.modules.system.service.sms; | |||||||
|  |  | ||||||
| import cn.iocoder.dashboard.BaseDbUnitTest; | import cn.iocoder.dashboard.BaseDbUnitTest; | ||||||
| import cn.iocoder.dashboard.common.enums.CommonStatusEnum; | import cn.iocoder.dashboard.common.enums.CommonStatusEnum; | ||||||
|  | import cn.iocoder.dashboard.common.exception.enums.GlobalErrorCodeConstants; | ||||||
| import cn.iocoder.dashboard.common.pojo.PageResult; | import cn.iocoder.dashboard.common.pojo.PageResult; | ||||||
| import cn.iocoder.dashboard.modules.system.controller.sms.vo.template.*; | import cn.iocoder.dashboard.framework.sms.core.client.SmsClient; | ||||||
|  | import cn.iocoder.dashboard.framework.sms.core.client.SmsClientFactory; | ||||||
|  | import cn.iocoder.dashboard.framework.sms.core.client.SmsCommonResult; | ||||||
|  | import cn.iocoder.dashboard.framework.sms.core.client.dto.SmsTemplateRespDTO; | ||||||
|  | import cn.iocoder.dashboard.modules.system.controller.sms.vo.template.SysSmsTemplateCreateReqVO; | ||||||
|  | import cn.iocoder.dashboard.modules.system.controller.sms.vo.template.SysSmsTemplateExportReqVO; | ||||||
|  | import cn.iocoder.dashboard.modules.system.controller.sms.vo.template.SysSmsTemplatePageReqVO; | ||||||
|  | import cn.iocoder.dashboard.modules.system.controller.sms.vo.template.SysSmsTemplateUpdateReqVO; | ||||||
| import cn.iocoder.dashboard.modules.system.dal.dataobject.sms.SysSmsChannelDO; | import cn.iocoder.dashboard.modules.system.dal.dataobject.sms.SysSmsChannelDO; | ||||||
| import cn.iocoder.dashboard.modules.system.dal.dataobject.sms.SysSmsTemplateDO; | import cn.iocoder.dashboard.modules.system.dal.dataobject.sms.SysSmsTemplateDO; | ||||||
| import cn.iocoder.dashboard.modules.system.dal.mysql.sms.SysSmsTemplateMapper; | import cn.iocoder.dashboard.modules.system.dal.mysql.sms.SysSmsTemplateMapper; | ||||||
| @ -47,6 +55,11 @@ public class SysSmsTemplateServiceTest extends BaseDbUnitTest { | |||||||
|     @MockBean |     @MockBean | ||||||
|     private SysSmsChannelService smsChannelService; |     private SysSmsChannelService smsChannelService; | ||||||
|  |  | ||||||
|  |     @MockBean | ||||||
|  |     private SmsClientFactory smsClientFactory; | ||||||
|  |     @MockBean | ||||||
|  |     private SmsClient smsClient; | ||||||
|  |  | ||||||
|     @Test |     @Test | ||||||
|     public void testParseTemplateContentParams() { |     public void testParseTemplateContentParams() { | ||||||
|         // 准备参数 |         // 准备参数 | ||||||
| @ -60,6 +73,7 @@ public class SysSmsTemplateServiceTest extends BaseDbUnitTest { | |||||||
|     } |     } | ||||||
|  |  | ||||||
|     @Test |     @Test | ||||||
|  |     @SuppressWarnings("unchecked") | ||||||
|     public void testCreateSmsTemplate_success() { |     public void testCreateSmsTemplate_success() { | ||||||
|         // 准备参数 |         // 准备参数 | ||||||
|         SysSmsTemplateCreateReqVO reqVO = randomPojo(SysSmsTemplateCreateReqVO.class, o -> { |         SysSmsTemplateCreateReqVO reqVO = randomPojo(SysSmsTemplateCreateReqVO.class, o -> { | ||||||
| @ -67,12 +81,16 @@ public class SysSmsTemplateServiceTest extends BaseDbUnitTest { | |||||||
|             o.setStatus(randomEle(CommonStatusEnum.values()).getStatus()); // 保证 status 的范围 |             o.setStatus(randomEle(CommonStatusEnum.values()).getStatus()); // 保证 status 的范围 | ||||||
|             o.setType(randomEle(SysSmsTemplateTypeEnum.values()).getType()); // 保证 type 的泛微 |             o.setType(randomEle(SysSmsTemplateTypeEnum.values()).getType()); // 保证 type 的泛微 | ||||||
|         }); |         }); | ||||||
|         // mock 方法 |         // mock Channel 的方法 | ||||||
|         SysSmsChannelDO channelDO = randomPojo(SysSmsChannelDO.class, o -> { |         SysSmsChannelDO channelDO = randomPojo(SysSmsChannelDO.class, o -> { | ||||||
|             o.setId(reqVO.getChannelId()); |             o.setId(reqVO.getChannelId()); | ||||||
|             o.setStatus(CommonStatusEnum.ENABLE.getStatus()); // 保证 status 开启,创建必须处于这个状态 |             o.setStatus(CommonStatusEnum.ENABLE.getStatus()); // 保证 status 开启,创建必须处于这个状态 | ||||||
|         }); |         }); | ||||||
|         when(smsChannelService.getSmsChannel(eq(channelDO.getId()))).thenReturn(channelDO); |         when(smsChannelService.getSmsChannel(eq(channelDO.getId()))).thenReturn(channelDO); | ||||||
|  |         // mock 获得 API 短信模板成功 | ||||||
|  |         when(smsClientFactory.getSmsClient(eq(reqVO.getChannelId()))).thenReturn(smsClient); | ||||||
|  |         when(smsClient.getSmsTemplate(eq(reqVO.getApiTemplateId()))).thenReturn(randomPojo(SmsCommonResult.class, SmsTemplateRespDTO.class, | ||||||
|  |                 o -> o.setCode(GlobalErrorCodeConstants.SUCCESS.getCode()))); | ||||||
|  |  | ||||||
|         // 调用 |         // 调用 | ||||||
|         Long smsTemplateId = smsTemplateService.createSmsTemplate(reqVO); |         Long smsTemplateId = smsTemplateService.createSmsTemplate(reqVO); | ||||||
| @ -86,6 +104,7 @@ public class SysSmsTemplateServiceTest extends BaseDbUnitTest { | |||||||
|     } |     } | ||||||
|  |  | ||||||
|     @Test |     @Test | ||||||
|  |     @SuppressWarnings("unchecked") | ||||||
|     public void testUpdateSmsTemplate_success() { |     public void testUpdateSmsTemplate_success() { | ||||||
|         // mock 数据 |         // mock 数据 | ||||||
|         SysSmsTemplateDO dbSmsTemplate = randomSmsTemplateDO(); |         SysSmsTemplateDO dbSmsTemplate = randomSmsTemplateDO(); | ||||||
| @ -103,6 +122,10 @@ public class SysSmsTemplateServiceTest extends BaseDbUnitTest { | |||||||
|             o.setStatus(CommonStatusEnum.ENABLE.getStatus()); // 保证 status 开启,创建必须处于这个状态 |             o.setStatus(CommonStatusEnum.ENABLE.getStatus()); // 保证 status 开启,创建必须处于这个状态 | ||||||
|         }); |         }); | ||||||
|         when(smsChannelService.getSmsChannel(eq(channelDO.getId()))).thenReturn(channelDO); |         when(smsChannelService.getSmsChannel(eq(channelDO.getId()))).thenReturn(channelDO); | ||||||
|  |         // mock 获得 API 短信模板成功 | ||||||
|  |         when(smsClientFactory.getSmsClient(eq(reqVO.getChannelId()))).thenReturn(smsClient); | ||||||
|  |         when(smsClient.getSmsTemplate(eq(reqVO.getApiTemplateId()))).thenReturn(randomPojo(SmsCommonResult.class, SmsTemplateRespDTO.class, | ||||||
|  |                 o -> o.setCode(GlobalErrorCodeConstants.SUCCESS.getCode()))); | ||||||
|  |  | ||||||
|         // 调用 |         // 调用 | ||||||
|         smsTemplateService.updateSmsTemplate(reqVO); |         smsTemplateService.updateSmsTemplate(reqVO); | ||||||
|  | |||||||
| @ -7,6 +7,7 @@ import cn.iocoder.dashboard.modules.system.dal.dataobject.user.SysUserDO; | |||||||
| import uk.co.jemos.podam.api.PodamFactory; | import uk.co.jemos.podam.api.PodamFactory; | ||||||
| import uk.co.jemos.podam.api.PodamFactoryImpl; | import uk.co.jemos.podam.api.PodamFactoryImpl; | ||||||
|  |  | ||||||
|  | import java.lang.reflect.Type; | ||||||
| import java.util.Arrays; | import java.util.Arrays; | ||||||
| import java.util.Date; | import java.util.Date; | ||||||
| import java.util.Set; | import java.util.Set; | ||||||
| @ -87,4 +88,14 @@ public class RandomUtils { | |||||||
|         return pojo; |         return pojo; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|  |     @SafeVarargs | ||||||
|  |     public static <T> T randomPojo(Class<T> clazz, Type type, Consumer<T>... consumers) { | ||||||
|  |         T pojo = PODAM_FACTORY.manufacturePojo(clazz, type); | ||||||
|  |         // 非空时,回调逻辑。通过它,可以实现 Pojo 的进一步处理 | ||||||
|  |         if (ArrayUtil.isNotEmpty(consumers)) { | ||||||
|  |             Arrays.stream(consumers).forEach(consumer -> consumer.accept(pojo)); | ||||||
|  |         } | ||||||
|  |         return pojo; | ||||||
|  |     } | ||||||
|  |  | ||||||
| } | } | ||||||
|  | |||||||
		Reference in New Issue
	
	Block a user
	 YunaiV
					YunaiV