Commit 7760e163b3403ad3b184269671ed86a38f32b97f
1 parent
fdc60fbc
初始化短信日志的 CRUD 代码
Showing
19 changed files
with
681 additions
and
65 deletions
src/main/java/cn/iocoder/dashboard/modules/system/controller/sms/SysSmsLogController.java
0 → 100644
| 1 | +package cn.iocoder.dashboard.modules.system.controller.sms; | |
| 2 | + | |
| 3 | +import cn.iocoder.dashboard.common.pojo.CommonResult; | |
| 4 | +import cn.iocoder.dashboard.common.pojo.PageResult; | |
| 5 | +import cn.iocoder.dashboard.framework.excel.core.util.ExcelUtils; | |
| 6 | +import cn.iocoder.dashboard.framework.logger.operatelog.core.annotations.OperateLog; | |
| 7 | +import cn.iocoder.dashboard.modules.system.controller.sms.vo.log.SysSmsLogExcelVO; | |
| 8 | +import cn.iocoder.dashboard.modules.system.controller.sms.vo.log.SysSmsLogExportReqVO; | |
| 9 | +import cn.iocoder.dashboard.modules.system.controller.sms.vo.log.SysSmsLogPageReqVO; | |
| 10 | +import cn.iocoder.dashboard.modules.system.controller.sms.vo.log.SysSmsLogRespVO; | |
| 11 | +import cn.iocoder.dashboard.modules.system.convert.sms.SysSmsLogConvert; | |
| 12 | +import cn.iocoder.dashboard.modules.system.dal.dataobject.sms.SysSmsLogDO; | |
| 13 | +import cn.iocoder.dashboard.modules.system.service.sms.SysSmsLogService; | |
| 14 | +import io.swagger.annotations.Api; | |
| 15 | +import io.swagger.annotations.ApiOperation; | |
| 16 | +import org.springframework.security.access.prepost.PreAuthorize; | |
| 17 | +import org.springframework.validation.annotation.Validated; | |
| 18 | +import org.springframework.web.bind.annotation.GetMapping; | |
| 19 | +import org.springframework.web.bind.annotation.RequestMapping; | |
| 20 | +import org.springframework.web.bind.annotation.RestController; | |
| 21 | + | |
| 22 | +import javax.annotation.Resource; | |
| 23 | +import javax.servlet.http.HttpServletResponse; | |
| 24 | +import javax.validation.Valid; | |
| 25 | +import java.io.IOException; | |
| 26 | +import java.util.List; | |
| 27 | + | |
| 28 | +import static cn.iocoder.dashboard.common.pojo.CommonResult.success; | |
| 29 | +import static cn.iocoder.dashboard.framework.logger.operatelog.core.enums.OperateTypeEnum.EXPORT; | |
| 30 | + | |
| 31 | +@Api(tags = "短信日志") | |
| 32 | +@RestController | |
| 33 | +@RequestMapping("/system/sms-log") | |
| 34 | +@Validated | |
| 35 | +public class SysSmsLogController { | |
| 36 | + | |
| 37 | + @Resource | |
| 38 | + private SysSmsLogService smsLogService; | |
| 39 | + | |
| 40 | + @GetMapping("/page") | |
| 41 | + @ApiOperation("获得短信日志分页") | |
| 42 | + @PreAuthorize("@ss.hasPermission('system:sms-log:query')") | |
| 43 | + public CommonResult<PageResult<SysSmsLogRespVO>> getSmsLogPage(@Valid SysSmsLogPageReqVO pageVO) { | |
| 44 | + PageResult<SysSmsLogDO> pageResult = smsLogService.getSmsLogPage(pageVO); | |
| 45 | + return success(SysSmsLogConvert.INSTANCE.convertPage(pageResult)); | |
| 46 | + } | |
| 47 | + | |
| 48 | + @GetMapping("/export-excel") | |
| 49 | + @ApiOperation("导出短信日志 Excel") | |
| 50 | + @PreAuthorize("@ss.hasPermission('system:sms-log:export')") | |
| 51 | + @OperateLog(type = EXPORT) | |
| 52 | + public void exportSmsLogExcel(@Valid SysSmsLogExportReqVO exportReqVO, | |
| 53 | + HttpServletResponse response) throws IOException { | |
| 54 | + List<SysSmsLogDO> list = smsLogService.getSmsLogList(exportReqVO); | |
| 55 | + // 导出 Excel | |
| 56 | + List<SysSmsLogExcelVO> datas = SysSmsLogConvert.INSTANCE.convertList02(list); | |
| 57 | + ExcelUtils.write(response, "短信日志.xls", "数据", SysSmsLogExcelVO.class, datas); | |
| 58 | + } | |
| 59 | + | |
| 60 | +} | ... | ... |
src/main/java/cn/iocoder/dashboard/modules/system/controller/sms/vo/SmsTemplateVO.java deleted
| 1 | -package cn.iocoder.dashboard.modules.system.controller.sms.vo; | |
| 2 | - | |
| 3 | -import lombok.Data; | |
| 4 | -import lombok.EqualsAndHashCode; | |
| 5 | - | |
| 6 | -/** | |
| 7 | - * 渠道模板VO类 | |
| 8 | - * | |
| 9 | - * @author zzf | |
| 10 | - * @date 2021/1/25 17:03 | |
| 11 | - */ | |
| 12 | -@Data | |
| 13 | -@EqualsAndHashCode | |
| 14 | -public class SmsTemplateVO { | |
| 15 | - | |
| 16 | - /** | |
| 17 | - * 业务编码(来自数据字典, 用户自定义业务场景 一个场景可以有多个模板) | |
| 18 | - */ | |
| 19 | - private String bizCode; | |
| 20 | - | |
| 21 | - /** | |
| 22 | - * 编码 | |
| 23 | - */ | |
| 24 | - private String code; | |
| 25 | - | |
| 26 | - /** | |
| 27 | - * 实际渠道模板唯一标识 | |
| 28 | - */ | |
| 29 | - private String apiTemplateId; | |
| 30 | - | |
| 31 | - /** | |
| 32 | - * 内容 | |
| 33 | - */ | |
| 34 | - private String content; | |
| 35 | - | |
| 36 | - | |
| 37 | - | |
| 38 | -} |
src/main/java/cn/iocoder/dashboard/modules/system/controller/sms/vo/log/SysSmsLogExcelVO.java
0 → 100644
| 1 | +package cn.iocoder.dashboard.modules.system.controller.sms.vo.log; | |
| 2 | + | |
| 3 | +import com.alibaba.excel.annotation.ExcelProperty; | |
| 4 | +import lombok.Data; | |
| 5 | + | |
| 6 | +import java.util.Date; | |
| 7 | +import java.util.Map; | |
| 8 | + | |
| 9 | +/** | |
| 10 | + * 短信日志 Excel VO | |
| 11 | + * | |
| 12 | + * @author 芋道源码 | |
| 13 | + */ | |
| 14 | +@Data | |
| 15 | +public class SysSmsLogExcelVO { | |
| 16 | + | |
| 17 | + @ExcelProperty("编号") | |
| 18 | + private Long id; | |
| 19 | + | |
| 20 | + @ExcelProperty("短信渠道编号") | |
| 21 | + private Long channelId; | |
| 22 | + | |
| 23 | + @ExcelProperty("短信渠道编码") | |
| 24 | + // TODO 导出枚举 | |
| 25 | + private String channelCode; | |
| 26 | + | |
| 27 | + @ExcelProperty("模板编号") | |
| 28 | + private Long templateId; | |
| 29 | + | |
| 30 | + @ExcelProperty("模板编码") | |
| 31 | + private String templateCode; | |
| 32 | + | |
| 33 | + @ExcelProperty("短信类型") | |
| 34 | + private Integer templateType; | |
| 35 | + | |
| 36 | + @ExcelProperty("短信内容") | |
| 37 | + private String templateContent; | |
| 38 | + | |
| 39 | + @ExcelProperty("短信参数") | |
| 40 | + private Map<String, Object> templateParams; | |
| 41 | + | |
| 42 | + @ExcelProperty("短信 API 的模板编号") | |
| 43 | + private String apiTemplateId; | |
| 44 | + | |
| 45 | + @ExcelProperty("手机号") | |
| 46 | + private String mobile; | |
| 47 | + | |
| 48 | + @ExcelProperty("用户编号") | |
| 49 | + private Long userId; | |
| 50 | + | |
| 51 | + @ExcelProperty("用户类型") | |
| 52 | + // TODO 导出枚举 | |
| 53 | + private Integer userType; | |
| 54 | + | |
| 55 | + @ExcelProperty("发送状态") | |
| 56 | + // TODO 导出枚举 | |
| 57 | + private Integer sendStatus; | |
| 58 | + | |
| 59 | + @ExcelProperty("发送时间") | |
| 60 | + private Date sendTime; | |
| 61 | + | |
| 62 | + @ExcelProperty("发送结果的编码") | |
| 63 | + private Integer sendCode; | |
| 64 | + | |
| 65 | + @ExcelProperty("发送结果的提示") | |
| 66 | + private String sendMsg; | |
| 67 | + | |
| 68 | + @ExcelProperty("短信 API 发送结果的编码") | |
| 69 | + private String apiSendCode; | |
| 70 | + | |
| 71 | + @ExcelProperty("短信 API 发送失败的提示") | |
| 72 | + private String apiSendMsg; | |
| 73 | + | |
| 74 | + @ExcelProperty("短信 API 发送返回的唯一请求 ID") | |
| 75 | + private String apiRequestId; | |
| 76 | + | |
| 77 | + @ExcelProperty("短信 API 发送返回的序号") | |
| 78 | + private String apiSerialNo; | |
| 79 | + | |
| 80 | + @ExcelProperty("接收状态") | |
| 81 | + // TODO 导出枚举 | |
| 82 | + private Integer receiveStatus; | |
| 83 | + | |
| 84 | + @ExcelProperty("接收时间") | |
| 85 | + private Date receiveTime; | |
| 86 | + | |
| 87 | + @ExcelProperty("API 接收结果的编码") | |
| 88 | + private String apiReceiveCode; | |
| 89 | + | |
| 90 | + @ExcelProperty("API 接收结果的说明") | |
| 91 | + private String apiReceiveMsg; | |
| 92 | + | |
| 93 | + @ExcelProperty("创建时间") | |
| 94 | + private Date createTime; | |
| 95 | + | |
| 96 | +} | ... | ... |
src/main/java/cn/iocoder/dashboard/modules/system/controller/sms/vo/log/SysSmsLogExportReqVO.java
0 → 100644
| 1 | +package cn.iocoder.dashboard.modules.system.controller.sms.vo.log; | |
| 2 | + | |
| 3 | +import io.swagger.annotations.ApiModel; | |
| 4 | +import io.swagger.annotations.ApiModelProperty; | |
| 5 | +import lombok.Data; | |
| 6 | +import org.springframework.format.annotation.DateTimeFormat; | |
| 7 | + | |
| 8 | +import java.util.Date; | |
| 9 | + | |
| 10 | +import static cn.iocoder.dashboard.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; | |
| 11 | + | |
| 12 | +@ApiModel(value = "短信日志 Excel 导出 Request VO", description = "参数和 SysSmsLogPageReqVO 是一致的") | |
| 13 | +@Data | |
| 14 | +public class SysSmsLogExportReqVO { | |
| 15 | + | |
| 16 | + @ApiModelProperty(value = "短信渠道编号", example = "10") | |
| 17 | + private Long channelId; | |
| 18 | + | |
| 19 | + @ApiModelProperty(value = "模板编号", example = "20") | |
| 20 | + private Long templateId; | |
| 21 | + | |
| 22 | + @ApiModelProperty(value = "手机号", example = "15601691300") | |
| 23 | + private String mobile; | |
| 24 | + | |
| 25 | + @ApiModelProperty(value = "发送状态", example = "1") | |
| 26 | + private Integer sendStatus; | |
| 27 | + | |
| 28 | + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) | |
| 29 | + @ApiModelProperty(value = "开始发送时间") | |
| 30 | + private Date beginSendTime; | |
| 31 | + | |
| 32 | + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) | |
| 33 | + @ApiModelProperty(value = "结束发送时间") | |
| 34 | + private Date endSendTime; | |
| 35 | + | |
| 36 | + @ApiModelProperty(value = "接收状态", example = "0") | |
| 37 | + private Integer receiveStatus; | |
| 38 | + | |
| 39 | + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) | |
| 40 | + @ApiModelProperty(value = "开始接收时间") | |
| 41 | + private Date beginReceiveTime; | |
| 42 | + | |
| 43 | + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) | |
| 44 | + @ApiModelProperty(value = "结束接收时间") | |
| 45 | + private Date endReceiveTime; | |
| 46 | + | |
| 47 | +} | ... | ... |
src/main/java/cn/iocoder/dashboard/modules/system/controller/sms/vo/log/SysSmsLogPageReqVO.java
0 → 100644
| 1 | +package cn.iocoder.dashboard.modules.system.controller.sms.vo.log; | |
| 2 | + | |
| 3 | +import cn.iocoder.dashboard.common.pojo.PageParam; | |
| 4 | +import io.swagger.annotations.ApiModel; | |
| 5 | +import io.swagger.annotations.ApiModelProperty; | |
| 6 | +import lombok.Data; | |
| 7 | +import lombok.EqualsAndHashCode; | |
| 8 | +import lombok.ToString; | |
| 9 | +import org.springframework.format.annotation.DateTimeFormat; | |
| 10 | + | |
| 11 | +import java.util.Date; | |
| 12 | + | |
| 13 | +import static cn.iocoder.dashboard.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; | |
| 14 | + | |
| 15 | +@ApiModel("短信日志分页 Request VO") | |
| 16 | +@Data | |
| 17 | +@EqualsAndHashCode(callSuper = true) | |
| 18 | +@ToString(callSuper = true) | |
| 19 | +public class SysSmsLogPageReqVO extends PageParam { | |
| 20 | + | |
| 21 | + @ApiModelProperty(value = "短信渠道编号", example = "10") | |
| 22 | + private Long channelId; | |
| 23 | + | |
| 24 | + @ApiModelProperty(value = "模板编号", example = "20") | |
| 25 | + private Long templateId; | |
| 26 | + | |
| 27 | + @ApiModelProperty(value = "手机号", example = "15601691300") | |
| 28 | + private String mobile; | |
| 29 | + | |
| 30 | + @ApiModelProperty(value = "发送状态", example = "1", notes = "参见 SysSmsSendStatusEnum 枚举类") | |
| 31 | + private Integer sendStatus; | |
| 32 | + | |
| 33 | + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) | |
| 34 | + @ApiModelProperty(value = "开始发送时间") | |
| 35 | + private Date beginSendTime; | |
| 36 | + | |
| 37 | + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) | |
| 38 | + @ApiModelProperty(value = "结束发送时间") | |
| 39 | + private Date endSendTime; | |
| 40 | + | |
| 41 | + @ApiModelProperty(value = "接收状态", example = "0", notes = "参见 SysSmsReceiveStatusEnum 枚举类") | |
| 42 | + private Integer receiveStatus; | |
| 43 | + | |
| 44 | + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) | |
| 45 | + @ApiModelProperty(value = "开始接收时间") | |
| 46 | + private Date beginReceiveTime; | |
| 47 | + | |
| 48 | + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) | |
| 49 | + @ApiModelProperty(value = "结束接收时间") | |
| 50 | + private Date endReceiveTime; | |
| 51 | + | |
| 52 | +} | ... | ... |
src/main/java/cn/iocoder/dashboard/modules/system/controller/sms/vo/log/SysSmsLogRespVO.java
0 → 100644
| 1 | +package cn.iocoder.dashboard.modules.system.controller.sms.vo.log; | |
| 2 | + | |
| 3 | +import io.swagger.annotations.ApiModel; | |
| 4 | +import io.swagger.annotations.ApiModelProperty; | |
| 5 | +import lombok.Data; | |
| 6 | + | |
| 7 | +import java.util.Date; | |
| 8 | +import java.util.Map; | |
| 9 | + | |
| 10 | +@ApiModel("短信日志 Response VO") | |
| 11 | +@Data | |
| 12 | +public class SysSmsLogRespVO { | |
| 13 | + | |
| 14 | + @ApiModelProperty(value = "编号", required = true, example = "1024") | |
| 15 | + private Long id; | |
| 16 | + | |
| 17 | + @ApiModelProperty(value = "短信渠道编号", required = true, example = "10") | |
| 18 | + private Long channelId; | |
| 19 | + | |
| 20 | + @ApiModelProperty(value = "短信渠道编码", required = true, example = "ALIYUN") | |
| 21 | + private String channelCode; | |
| 22 | + | |
| 23 | + @ApiModelProperty(value = "模板编号", required = true, example = "20") | |
| 24 | + private Long templateId; | |
| 25 | + | |
| 26 | + @ApiModelProperty(value = "模板编码", required = true, example = "test-01") | |
| 27 | + private String templateCode; | |
| 28 | + | |
| 29 | + @ApiModelProperty(value = "短信类型", required = true, example = "1") | |
| 30 | + private Integer templateType; | |
| 31 | + | |
| 32 | + @ApiModelProperty(value = "短信内容", required = true, example = "你好,你的验证码是 1024") | |
| 33 | + private String templateContent; | |
| 34 | + | |
| 35 | + @ApiModelProperty(value = "短信参数", required = true, example = "name,code") | |
| 36 | + private Map<String, Object> templateParams; | |
| 37 | + | |
| 38 | + @ApiModelProperty(value = "短信 API 的模板编号", required = true, example = "SMS_207945135") | |
| 39 | + private String apiTemplateId; | |
| 40 | + | |
| 41 | + @ApiModelProperty(value = "手机号", required = true, example = "15601691300") | |
| 42 | + private String mobile; | |
| 43 | + | |
| 44 | + @ApiModelProperty(value = "用户编号", example = "10") | |
| 45 | + private Long userId; | |
| 46 | + | |
| 47 | + @ApiModelProperty(value = "用户类型", example = "1") | |
| 48 | + private Integer userType; | |
| 49 | + | |
| 50 | + @ApiModelProperty(value = "发送状态", required = true, example = "1") | |
| 51 | + private Integer sendStatus; | |
| 52 | + | |
| 53 | + @ApiModelProperty(value = "发送时间") | |
| 54 | + private Date sendTime; | |
| 55 | + | |
| 56 | + @ApiModelProperty(value = "发送结果的编码", example = "0") | |
| 57 | + private Integer sendCode; | |
| 58 | + | |
| 59 | + @ApiModelProperty(value = "发送结果的提示", example = "成功") | |
| 60 | + private String sendMsg; | |
| 61 | + | |
| 62 | + @ApiModelProperty(value = "短信 API 发送结果的编码", example = "SUCCESS") | |
| 63 | + private String apiSendCode; | |
| 64 | + | |
| 65 | + @ApiModelProperty(value = "短信 API 发送失败的提示", example = "成功") | |
| 66 | + private String apiSendMsg; | |
| 67 | + | |
| 68 | + @ApiModelProperty(value = "短信 API 发送返回的唯一请求 ID", example = "3837C6D3-B96F-428C-BBB2-86135D4B5B99") | |
| 69 | + private String apiRequestId; | |
| 70 | + | |
| 71 | + @ApiModelProperty(value = "短信 API 发送返回的序号", example = "62923244790") | |
| 72 | + private String apiSerialNo; | |
| 73 | + | |
| 74 | + @ApiModelProperty(value = "接收状态", required = true, example = "0") | |
| 75 | + private Integer receiveStatus; | |
| 76 | + | |
| 77 | + @ApiModelProperty(value = "接收时间") | |
| 78 | + private Date receiveTime; | |
| 79 | + | |
| 80 | + @ApiModelProperty(value = "API 接收结果的编码", example = "DELIVRD") | |
| 81 | + private String apiReceiveCode; | |
| 82 | + | |
| 83 | + @ApiModelProperty(value = "API 接收结果的说明", example = "用户接收成功") | |
| 84 | + private String apiReceiveMsg; | |
| 85 | + | |
| 86 | + @ApiModelProperty(value = "创建时间", required = true) | |
| 87 | + private Date createTime; | |
| 88 | + | |
| 89 | +} | ... | ... |
src/main/java/cn/iocoder/dashboard/modules/system/convert/sms/SysSmsLogConvert.java
0 → 100644
| 1 | +package cn.iocoder.dashboard.modules.system.convert.sms; | |
| 2 | + | |
| 3 | +import cn.iocoder.dashboard.common.pojo.PageResult; | |
| 4 | +import cn.iocoder.dashboard.modules.system.controller.sms.vo.log.SysSmsLogExcelVO; | |
| 5 | +import cn.iocoder.dashboard.modules.system.controller.sms.vo.log.SysSmsLogRespVO; | |
| 6 | +import cn.iocoder.dashboard.modules.system.dal.dataobject.sms.SysSmsLogDO; | |
| 7 | +import org.mapstruct.Mapper; | |
| 8 | +import org.mapstruct.factory.Mappers; | |
| 9 | + | |
| 10 | +import java.util.List; | |
| 11 | + | |
| 12 | +/** | |
| 13 | + * 短信日志 Convert | |
| 14 | + * | |
| 15 | + * @author 芋道源码 | |
| 16 | + */ | |
| 17 | +@Mapper | |
| 18 | +public interface SysSmsLogConvert { | |
| 19 | + | |
| 20 | + SysSmsLogConvert INSTANCE = Mappers.getMapper(SysSmsLogConvert.class); | |
| 21 | + | |
| 22 | + SysSmsLogRespVO convert(SysSmsLogDO bean); | |
| 23 | + | |
| 24 | + List<SysSmsLogRespVO> convertList(List<SysSmsLogDO> list); | |
| 25 | + | |
| 26 | + PageResult<SysSmsLogRespVO> convertPage(PageResult<SysSmsLogDO> page); | |
| 27 | + | |
| 28 | + List<SysSmsLogExcelVO> convertList02(List<SysSmsLogDO> list); | |
| 29 | + | |
| 30 | +} | ... | ... |
src/main/java/cn/iocoder/dashboard/modules/system/dal/dataobject/sms/SysSmsLogDO.java
src/main/java/cn/iocoder/dashboard/modules/system/dal/mysql/sms/SysSmsLogMapper.java
| 1 | 1 | package cn.iocoder.dashboard.modules.system.dal.mysql.sms; |
| 2 | 2 | |
| 3 | +import cn.iocoder.dashboard.common.pojo.PageResult; | |
| 3 | 4 | import cn.iocoder.dashboard.framework.mybatis.core.mapper.BaseMapperX; |
| 5 | +import cn.iocoder.dashboard.framework.mybatis.core.query.QueryWrapperX; | |
| 6 | +import cn.iocoder.dashboard.modules.system.controller.sms.vo.log.SysSmsLogExportReqVO; | |
| 7 | +import cn.iocoder.dashboard.modules.system.controller.sms.vo.log.SysSmsLogPageReqVO; | |
| 4 | 8 | import cn.iocoder.dashboard.modules.system.dal.dataobject.sms.SysSmsLogDO; |
| 5 | 9 | import org.apache.ibatis.annotations.Mapper; |
| 6 | 10 | |
| 11 | +import java.util.List; | |
| 12 | + | |
| 7 | 13 | @Mapper |
| 8 | 14 | public interface SysSmsLogMapper extends BaseMapperX<SysSmsLogDO> { |
| 15 | + | |
| 16 | + default PageResult<SysSmsLogDO> selectPage(SysSmsLogPageReqVO reqVO) { | |
| 17 | + return selectPage(reqVO, new QueryWrapperX<SysSmsLogDO>() | |
| 18 | + .eqIfPresent("channel_id", reqVO.getChannelId()) | |
| 19 | + .eqIfPresent("template_id", reqVO.getTemplateId()) | |
| 20 | + .likeIfPresent("mobile", reqVO.getMobile()) | |
| 21 | + .eqIfPresent("send_status", reqVO.getSendStatus()) | |
| 22 | + .betweenIfPresent("send_time", reqVO.getBeginSendTime(), reqVO.getEndSendTime()) | |
| 23 | + .eqIfPresent("receive_status", reqVO.getReceiveStatus()) | |
| 24 | + .betweenIfPresent("receive_time", reqVO.getBeginReceiveTime(), reqVO.getEndReceiveTime()) | |
| 25 | + .orderByDesc("id")); | |
| 26 | + } | |
| 27 | + | |
| 28 | + default List<SysSmsLogDO> selectList(SysSmsLogExportReqVO reqVO) { | |
| 29 | + return selectList(new QueryWrapperX<SysSmsLogDO>() | |
| 30 | + .eqIfPresent("channel_id", reqVO.getChannelId()) | |
| 31 | + .eqIfPresent("template_id", reqVO.getTemplateId()) | |
| 32 | + .likeIfPresent("mobile", reqVO.getMobile()) | |
| 33 | + .eqIfPresent("send_status", reqVO.getSendStatus()) | |
| 34 | + .betweenIfPresent("send_time", reqVO.getBeginSendTime(), reqVO.getEndSendTime()) | |
| 35 | + .eqIfPresent("receive_status", reqVO.getReceiveStatus()) | |
| 36 | + .betweenIfPresent("receive_time", reqVO.getBeginReceiveTime(), reqVO.getEndReceiveTime()) | |
| 37 | + .orderByDesc("id")); | |
| 38 | + } | |
| 39 | + | |
| 9 | 40 | } | ... | ... |
src/main/java/cn/iocoder/dashboard/modules/system/service/sms/SysSmsLogService.java
| 1 | 1 | package cn.iocoder.dashboard.modules.system.service.sms; |
| 2 | 2 | |
| 3 | +import cn.iocoder.dashboard.common.pojo.PageResult; | |
| 4 | +import cn.iocoder.dashboard.modules.system.controller.sms.vo.log.SysSmsLogExportReqVO; | |
| 5 | +import cn.iocoder.dashboard.modules.system.controller.sms.vo.log.SysSmsLogPageReqVO; | |
| 6 | +import cn.iocoder.dashboard.modules.system.dal.dataobject.sms.SysSmsLogDO; | |
| 3 | 7 | import cn.iocoder.dashboard.modules.system.dal.dataobject.sms.SysSmsTemplateDO; |
| 4 | 8 | |
| 5 | 9 | import java.util.Date; |
| 10 | +import java.util.List; | |
| 6 | 11 | import java.util.Map; |
| 7 | 12 | |
| 8 | 13 | /** |
| ... | ... | @@ -53,4 +58,20 @@ public interface SysSmsLogService { |
| 53 | 58 | */ |
| 54 | 59 | void updateSmsReceiveResult(Long id, Boolean success, Date receiveTime, String apiReceiveCode, String apiReceiveMsg); |
| 55 | 60 | |
| 61 | + /** | |
| 62 | + * 获得短信日志分页 | |
| 63 | + * | |
| 64 | + * @param pageReqVO 分页查询 | |
| 65 | + * @return 短信日志分页 | |
| 66 | + */ | |
| 67 | + PageResult<SysSmsLogDO> getSmsLogPage(SysSmsLogPageReqVO pageReqVO); | |
| 68 | + | |
| 69 | + /** | |
| 70 | + * 获得短信日志列表, 用于 Excel 导出 | |
| 71 | + * | |
| 72 | + * @param exportReqVO 查询条件 | |
| 73 | + * @return 短信日志列表 | |
| 74 | + */ | |
| 75 | + List<SysSmsLogDO> getSmsLogList(SysSmsLogExportReqVO exportReqVO); | |
| 76 | + | |
| 56 | 77 | } | ... | ... |
src/main/java/cn/iocoder/dashboard/modules/system/service/sms/SysSmsService.java
| ... | ... | @@ -14,6 +14,34 @@ import java.util.Map; |
| 14 | 14 | */ |
| 15 | 15 | public interface SysSmsService { |
| 16 | 16 | |
| 17 | + /** | |
| 18 | + * 发送单条短信给用户(管理员) | |
| 19 | + * | |
| 20 | + * 在 mobile 为空时,使用 userId 加载对应管理员的手机号 | |
| 21 | + * | |
| 22 | + * @param mobile 手机号 | |
| 23 | + * @param userId 用户编号 | |
| 24 | + * @param templateCode 短信模板编号 | |
| 25 | + * @param templateParams 短信模板参数 | |
| 26 | + * @return 发送日志编号 | |
| 27 | + */ | |
| 28 | + Long sendSingleSmsToAdmin(String mobile, Long userId, | |
| 29 | + String templateCode, Map<String, Object> templateParams); | |
| 30 | + | |
| 31 | + /** | |
| 32 | + * 发送单条短信给用户(会员) | |
| 33 | + * | |
| 34 | + * 在 mobile 为空时,使用 userId 加载对应会员的手机号 | |
| 35 | + * | |
| 36 | + * @param mobile 手机号 | |
| 37 | + * @param userId 用户编号 | |
| 38 | + * @param templateCode 短信模板编号 | |
| 39 | + * @param templateParams 短信模板参数 | |
| 40 | + * @return 发送日志编号 | |
| 41 | + */ | |
| 42 | + Long sendSingleSmsToMember(String mobile, Long userId, | |
| 43 | + String templateCode, Map<String, Object> templateParams); | |
| 44 | + | |
| 17 | 45 | Long sendSingleSms(String mobile, Long userId, Integer userType, |
| 18 | 46 | String templateCode, Map<String, Object> templateParams); |
| 19 | 47 | ... | ... |
src/main/java/cn/iocoder/dashboard/modules/system/service/sms/impl/SysSmsLogServiceImpl.java
| 1 | 1 | package cn.iocoder.dashboard.modules.system.service.sms.impl; |
| 2 | 2 | |
| 3 | 3 | import cn.iocoder.dashboard.common.pojo.CommonResult; |
| 4 | +import cn.iocoder.dashboard.common.pojo.PageResult; | |
| 5 | +import cn.iocoder.dashboard.modules.system.controller.sms.vo.log.SysSmsLogExportReqVO; | |
| 6 | +import cn.iocoder.dashboard.modules.system.controller.sms.vo.log.SysSmsLogPageReqVO; | |
| 4 | 7 | import cn.iocoder.dashboard.modules.system.dal.dataobject.sms.SysSmsLogDO; |
| 5 | 8 | import cn.iocoder.dashboard.modules.system.dal.dataobject.sms.SysSmsTemplateDO; |
| 6 | 9 | import cn.iocoder.dashboard.modules.system.dal.mysql.sms.SysSmsLogMapper; |
| ... | ... | @@ -12,6 +15,7 @@ import org.springframework.stereotype.Service; |
| 12 | 15 | |
| 13 | 16 | import javax.annotation.Resource; |
| 14 | 17 | import java.util.Date; |
| 18 | +import java.util.List; | |
| 15 | 19 | import java.util.Map; |
| 16 | 20 | import java.util.Objects; |
| 17 | 21 | |
| ... | ... | @@ -69,4 +73,14 @@ public class SysSmsLogServiceImpl implements SysSmsLogService { |
| 69 | 73 | .apiReceiveCode(apiReceiveCode).apiReceiveMsg(apiReceiveMsg).build()); |
| 70 | 74 | } |
| 71 | 75 | |
| 76 | + @Override | |
| 77 | + public PageResult<SysSmsLogDO> getSmsLogPage(SysSmsLogPageReqVO pageReqVO) { | |
| 78 | + return smsLogMapper.selectPage(pageReqVO); | |
| 79 | + } | |
| 80 | + | |
| 81 | + @Override | |
| 82 | + public List<SysSmsLogDO> getSmsLogList(SysSmsLogExportReqVO exportReqVO) { | |
| 83 | + return smsLogMapper.selectList(exportReqVO); | |
| 84 | + } | |
| 85 | + | |
| 72 | 86 | } | ... | ... |
src/main/java/cn/iocoder/dashboard/modules/system/service/sms/impl/SysSmsServiceImpl.java
| ... | ... | @@ -25,7 +25,6 @@ import org.springframework.util.Assert; |
| 25 | 25 | import javax.annotation.Resource; |
| 26 | 26 | import java.util.List; |
| 27 | 27 | import java.util.Map; |
| 28 | -import java.util.Objects; | |
| 29 | 28 | import java.util.stream.Collectors; |
| 30 | 29 | |
| 31 | 30 | import static cn.iocoder.dashboard.common.exception.util.ServiceExceptionUtil.exception; |
| ... | ... | @@ -54,12 +53,30 @@ public class SysSmsServiceImpl implements SysSmsService { |
| 54 | 53 | private SysUserService userService; |
| 55 | 54 | |
| 56 | 55 | @Override |
| 56 | + public Long sendSingleSmsToAdmin(String mobile, Long userId, String templateCode, Map<String, Object> templateParams) { | |
| 57 | + // 如果 mobile 为空,则加载用户编号对应的手机号 | |
| 58 | + if (StrUtil.isEmpty(mobile)) { | |
| 59 | + SysUserDO user = userService.getUser(userId); | |
| 60 | + if (user != null) { | |
| 61 | + mobile = user.getMobile(); | |
| 62 | + } | |
| 63 | + } | |
| 64 | + // 执行发送 | |
| 65 | + return this.sendSingleSms(mobile, userId, UserTypeEnum.ADMIN.getValue(), templateCode, templateParams); | |
| 66 | + } | |
| 67 | + | |
| 68 | + @Override | |
| 69 | + public Long sendSingleSmsToMember(String mobile, Long userId, String templateCode, Map<String, Object> templateParams) { | |
| 70 | + throw new UnsupportedOperationException("暂时不支持该操作,感兴趣可以实现该功能哟!"); | |
| 71 | + } | |
| 72 | + | |
| 73 | + @Override | |
| 57 | 74 | public Long sendSingleSms(String mobile, Long userId, Integer userType, |
| 58 | 75 | String templateCode, Map<String, Object> templateParams) { |
| 59 | 76 | // 校验短信模板是否合法 |
| 60 | 77 | SysSmsTemplateDO template = this.checkSmsTemplateValid(templateCode); |
| 61 | 78 | // 校验手机号码是否存在 |
| 62 | - mobile = this.checkMobile(mobile, userId, userType); | |
| 79 | + mobile = this.checkMobile(mobile); | |
| 63 | 80 | |
| 64 | 81 | // 创建发送日志 |
| 65 | 82 | Boolean isSend = CommonStatusEnum.ENABLE.getStatus().equals(template.getStatus()); // 如果模板被禁用,则不发送短信,只记录日志 |
| ... | ... | @@ -77,7 +94,7 @@ public class SysSmsServiceImpl implements SysSmsService { |
| 77 | 94 | @Override |
| 78 | 95 | public void sendBatchSms(List<String> mobiles, List<Long> userIds, Integer userType, |
| 79 | 96 | String templateCode, Map<String, Object> templateParams) { |
| 80 | - throw new IllegalArgumentException("暂时不支持该操作,感兴趣可以实现该功能哟!"); | |
| 97 | + throw new UnsupportedOperationException("暂时不支持该操作,感兴趣可以实现该功能哟!"); | |
| 81 | 98 | } |
| 82 | 99 | |
| 83 | 100 | private SysSmsTemplateDO checkSmsTemplateValid(String templateCode) { |
| ... | ... | @@ -108,31 +125,13 @@ public class SysSmsServiceImpl implements SysSmsService { |
| 108 | 125 | }).collect(Collectors.toList()); |
| 109 | 126 | } |
| 110 | 127 | |
| 111 | - private String checkMobile(String mobile, Long userId, Integer userType) { | |
| 112 | - mobile = getMobile(mobile, userId, userType); | |
| 128 | + private String checkMobile(String mobile) { | |
| 113 | 129 | if (StrUtil.isEmpty(mobile)) { |
| 114 | 130 | throw exception(SMS_SEND_MOBILE_NOT_EXISTS); |
| 115 | 131 | } |
| 116 | 132 | return mobile; |
| 117 | 133 | } |
| 118 | 134 | |
| 119 | - private String getMobile(String mobile, Long userId, Integer userType) { | |
| 120 | - // 如果已经有手机号,则直接返回 | |
| 121 | - if (StrUtil.isNotEmpty(mobile)) { | |
| 122 | - return mobile; | |
| 123 | - } | |
| 124 | - // 没有手机号,则基于 userId 检索 | |
| 125 | - if (userId == null || userType == null) { | |
| 126 | - return null; | |
| 127 | - } | |
| 128 | - if (Objects.equals(userType, UserTypeEnum.ADMIN.getValue())) { | |
| 129 | - SysUserDO user = userService.getUser(userId); | |
| 130 | - return user != null ? user.getMobile() : null; | |
| 131 | - } | |
| 132 | - // TODO 芋艿:支持 C 端用户 | |
| 133 | - return null; | |
| 134 | - } | |
| 135 | - | |
| 136 | 135 | @Override |
| 137 | 136 | public void doSendSms(SysSmsSendMessage message) { |
| 138 | 137 | // 获得渠道对应的 SmsClient 客户端 | ... | ... |
src/main/resources/codegen/java/service/service.vm
| ... | ... | @@ -63,7 +63,7 @@ public interface ${table.className}Service { |
| 63 | 63 | * 获得${table.classComment}列表, 用于 Excel 导出 |
| 64 | 64 | * |
| 65 | 65 | * @param exportReqVO 查询条件 |
| 66 | - * @return ${table.classComment}分页 | |
| 66 | + * @return ${table.classComment}列表 | |
| 67 | 67 | */ |
| 68 | 68 | List<${table.className}DO> get${simpleClassName}List(${table.className}ExportReqVO exportReqVO); |
| 69 | 69 | ... | ... |
src/test/java/cn/iocoder/dashboard/modules/system/service/sms/SysSmsChannelServiceTest.java
| ... | ... | @@ -138,6 +138,8 @@ public class SysSmsChannelServiceTest extends BaseDbUnitTest { |
| 138 | 138 | assertPojoEquals(dbSmsChannel, pageResult.getList().get(0)); |
| 139 | 139 | } |
| 140 | 140 | |
| 141 | + // ========== 随机对象 ========== | |
| 142 | + | |
| 141 | 143 | @SafeVarargs |
| 142 | 144 | private static SysSmsChannelDO randomSmsChannelDO(Consumer<SysSmsChannelDO>... consumers) { |
| 143 | 145 | Consumer<SysSmsChannelDO> consumer = (o) -> { | ... | ... |
src/test/java/cn/iocoder/dashboard/modules/system/service/sms/SysSmsLogServiceTest.java
0 → 100644
| 1 | +package cn.iocoder.dashboard.modules.system.service.sms; | |
| 2 | + | |
| 3 | +import cn.iocoder.dashboard.BaseDbUnitTest; | |
| 4 | +import cn.iocoder.dashboard.common.enums.UserTypeEnum; | |
| 5 | +import cn.iocoder.dashboard.common.pojo.PageResult; | |
| 6 | +import cn.iocoder.dashboard.modules.system.controller.sms.vo.log.SysSmsLogExportReqVO; | |
| 7 | +import cn.iocoder.dashboard.modules.system.controller.sms.vo.log.SysSmsLogPageReqVO; | |
| 8 | +import cn.iocoder.dashboard.modules.system.dal.dataobject.sms.SysSmsLogDO; | |
| 9 | +import cn.iocoder.dashboard.modules.system.dal.mysql.sms.SysSmsLogMapper; | |
| 10 | +import cn.iocoder.dashboard.modules.system.enums.sms.SysSmsReceiveStatusEnum; | |
| 11 | +import cn.iocoder.dashboard.modules.system.enums.sms.SysSmsSendStatusEnum; | |
| 12 | +import cn.iocoder.dashboard.modules.system.enums.sms.SysSmsTemplateTypeEnum; | |
| 13 | +import cn.iocoder.dashboard.modules.system.service.sms.impl.SysSmsLogServiceImpl; | |
| 14 | +import cn.iocoder.dashboard.util.collection.ArrayUtils; | |
| 15 | +import cn.iocoder.dashboard.util.object.ObjectUtils; | |
| 16 | +import org.junit.jupiter.api.Test; | |
| 17 | +import org.springframework.context.annotation.Import; | |
| 18 | + | |
| 19 | +import javax.annotation.Resource; | |
| 20 | +import java.util.HashMap; | |
| 21 | +import java.util.List; | |
| 22 | +import java.util.function.Consumer; | |
| 23 | + | |
| 24 | +import static cn.hutool.core.util.RandomUtil.randomEle; | |
| 25 | +import static cn.iocoder.dashboard.util.AssertUtils.assertPojoEquals; | |
| 26 | +import static cn.iocoder.dashboard.util.RandomUtils.randomPojo; | |
| 27 | +import static cn.iocoder.dashboard.util.RandomUtils.randomString; | |
| 28 | +import static cn.iocoder.dashboard.util.date.DateUtils.buildTime; | |
| 29 | +import static org.junit.jupiter.api.Assertions.assertEquals; | |
| 30 | + | |
| 31 | +/** | |
| 32 | +* {@link SysSmsLogServiceImpl} 的单元测试类 | |
| 33 | +* | |
| 34 | +* @author 芋道源码 | |
| 35 | +*/ | |
| 36 | +@Import(SysSmsLogServiceImpl.class) | |
| 37 | +public class SysSmsLogServiceTest extends BaseDbUnitTest { | |
| 38 | + | |
| 39 | + @Resource | |
| 40 | + private SysSmsLogServiceImpl smsLogService; | |
| 41 | + | |
| 42 | + @Resource | |
| 43 | + private SysSmsLogMapper smsLogMapper; | |
| 44 | + | |
| 45 | + @Test // TODO 请修改 null 为需要的值 | |
| 46 | + public void testGetSmsLogPage() { | |
| 47 | + // mock 数据 | |
| 48 | + SysSmsLogDO dbSmsLog = randomSmsLogDO(o -> { // 等会查询到 | |
| 49 | + o.setChannelId(1L); | |
| 50 | + o.setTemplateId(10L); | |
| 51 | + o.setMobile("15601691300"); | |
| 52 | + o.setSendStatus(SysSmsSendStatusEnum.INIT.getStatus()); | |
| 53 | + o.setSendTime(buildTime(2020, 11, 11)); | |
| 54 | + o.setReceiveStatus(SysSmsReceiveStatusEnum.INIT.getStatus()); | |
| 55 | + o.setReceiveTime(buildTime(2021, 11, 11)); | |
| 56 | + }); | |
| 57 | + smsLogMapper.insert(dbSmsLog); | |
| 58 | + // 测试 channelId 不匹配 | |
| 59 | + smsLogMapper.insert(ObjectUtils.clone(dbSmsLog, o -> o.setChannelId(2L))); | |
| 60 | + // 测试 templateId 不匹配 | |
| 61 | + smsLogMapper.insert(ObjectUtils.clone(dbSmsLog, o -> o.setTemplateId(20L))); | |
| 62 | + // 测试 mobile 不匹配 | |
| 63 | + smsLogMapper.insert(ObjectUtils.clone(dbSmsLog, o -> o.setMobile("18818260999"))); | |
| 64 | + // 测试 sendStatus 不匹配 | |
| 65 | + smsLogMapper.insert(ObjectUtils.clone(dbSmsLog, o -> o.setSendStatus(SysSmsSendStatusEnum.IGNORE.getStatus()))); | |
| 66 | + // 测试 sendTime 不匹配 | |
| 67 | + smsLogMapper.insert(ObjectUtils.clone(dbSmsLog, o -> o.setSendTime(buildTime(2020, 12, 12)))); | |
| 68 | + // 测试 receiveStatus 不匹配 | |
| 69 | + smsLogMapper.insert(ObjectUtils.clone(dbSmsLog, o -> o.setReceiveStatus(SysSmsReceiveStatusEnum.SUCCESS.getStatus()))); | |
| 70 | + // 测试 receiveTime 不匹配 | |
| 71 | + smsLogMapper.insert(ObjectUtils.clone(dbSmsLog, o -> o.setReceiveTime(buildTime(2021, 12, 12)))); | |
| 72 | + // 准备参数 | |
| 73 | + SysSmsLogPageReqVO reqVO = new SysSmsLogPageReqVO(); | |
| 74 | + reqVO.setChannelId(1L); | |
| 75 | + reqVO.setTemplateId(10L); | |
| 76 | + reqVO.setMobile("156"); | |
| 77 | + reqVO.setSendStatus(SysSmsSendStatusEnum.INIT.getStatus()); | |
| 78 | + reqVO.setBeginSendTime(buildTime(2020, 11, 1)); | |
| 79 | + reqVO.setEndSendTime(buildTime(2020, 11, 30)); | |
| 80 | + reqVO.setReceiveStatus(SysSmsReceiveStatusEnum.INIT.getStatus()); | |
| 81 | + reqVO.setBeginReceiveTime(buildTime(2021, 11, 1)); | |
| 82 | + reqVO.setEndReceiveTime(buildTime(2021, 11, 30)); | |
| 83 | + | |
| 84 | + // 调用 | |
| 85 | + PageResult<SysSmsLogDO> pageResult = smsLogService.getSmsLogPage(reqVO); | |
| 86 | + // 断言 | |
| 87 | + assertEquals(1, pageResult.getTotal()); | |
| 88 | + assertEquals(1, pageResult.getList().size()); | |
| 89 | + assertPojoEquals(dbSmsLog, pageResult.getList().get(0)); | |
| 90 | + } | |
| 91 | + | |
| 92 | + @Test | |
| 93 | + public void testGetSmsLogList() { | |
| 94 | + // mock 数据 | |
| 95 | + SysSmsLogDO dbSmsLog = randomSmsLogDO(o -> { // 等会查询到 | |
| 96 | + o.setChannelId(1L); | |
| 97 | + o.setTemplateId(10L); | |
| 98 | + o.setMobile("15601691300"); | |
| 99 | + o.setSendStatus(SysSmsSendStatusEnum.INIT.getStatus()); | |
| 100 | + o.setSendTime(buildTime(2020, 11, 11)); | |
| 101 | + o.setReceiveStatus(SysSmsReceiveStatusEnum.INIT.getStatus()); | |
| 102 | + o.setReceiveTime(buildTime(2021, 11, 11)); | |
| 103 | + }); | |
| 104 | + smsLogMapper.insert(dbSmsLog); | |
| 105 | + // 测试 channelId 不匹配 | |
| 106 | + smsLogMapper.insert(ObjectUtils.clone(dbSmsLog, o -> o.setChannelId(2L))); | |
| 107 | + // 测试 templateId 不匹配 | |
| 108 | + smsLogMapper.insert(ObjectUtils.clone(dbSmsLog, o -> o.setTemplateId(20L))); | |
| 109 | + // 测试 mobile 不匹配 | |
| 110 | + smsLogMapper.insert(ObjectUtils.clone(dbSmsLog, o -> o.setMobile("18818260999"))); | |
| 111 | + // 测试 sendStatus 不匹配 | |
| 112 | + smsLogMapper.insert(ObjectUtils.clone(dbSmsLog, o -> o.setSendStatus(SysSmsSendStatusEnum.IGNORE.getStatus()))); | |
| 113 | + // 测试 sendTime 不匹配 | |
| 114 | + smsLogMapper.insert(ObjectUtils.clone(dbSmsLog, o -> o.setSendTime(buildTime(2020, 12, 12)))); | |
| 115 | + // 测试 receiveStatus 不匹配 | |
| 116 | + smsLogMapper.insert(ObjectUtils.clone(dbSmsLog, o -> o.setReceiveStatus(SysSmsReceiveStatusEnum.SUCCESS.getStatus()))); | |
| 117 | + // 测试 receiveTime 不匹配 | |
| 118 | + smsLogMapper.insert(ObjectUtils.clone(dbSmsLog, o -> o.setReceiveTime(buildTime(2021, 12, 12)))); | |
| 119 | + // 准备参数 | |
| 120 | + SysSmsLogExportReqVO reqVO = new SysSmsLogExportReqVO(); | |
| 121 | + reqVO.setChannelId(1L); | |
| 122 | + reqVO.setTemplateId(10L); | |
| 123 | + reqVO.setMobile("156"); | |
| 124 | + reqVO.setSendStatus(SysSmsSendStatusEnum.INIT.getStatus()); | |
| 125 | + reqVO.setBeginSendTime(buildTime(2020, 11, 1)); | |
| 126 | + reqVO.setEndSendTime(buildTime(2020, 11, 30)); | |
| 127 | + reqVO.setReceiveStatus(SysSmsReceiveStatusEnum.INIT.getStatus()); | |
| 128 | + reqVO.setBeginReceiveTime(buildTime(2021, 11, 1)); | |
| 129 | + reqVO.setEndReceiveTime(buildTime(2021, 11, 30)); | |
| 130 | + | |
| 131 | + // 调用 | |
| 132 | + List<SysSmsLogDO> list = smsLogService.getSmsLogList(reqVO); | |
| 133 | + // 断言 | |
| 134 | + assertEquals(1, list.size()); | |
| 135 | + assertPojoEquals(dbSmsLog, list.get(0)); | |
| 136 | + } | |
| 137 | + | |
| 138 | + // ========== 随机对象 ========== | |
| 139 | + | |
| 140 | + @SafeVarargs | |
| 141 | + private static SysSmsLogDO randomSmsLogDO(Consumer<SysSmsLogDO>... consumers) { | |
| 142 | + Consumer<SysSmsLogDO> consumer = (o) -> { | |
| 143 | + o.setTemplateParams(new HashMap<>()); | |
| 144 | + o.getTemplateParams().put(randomString(), randomString()); | |
| 145 | + o.getTemplateParams().put(randomString(), randomString()); | |
| 146 | + o.setTemplateType(randomEle(SysSmsTemplateTypeEnum.values()).getType()); // 保证 templateType 的范围 | |
| 147 | + o.setUserType(randomEle(UserTypeEnum.values()).getValue()); // 保证 userType 的范围 | |
| 148 | + }; | |
| 149 | + return randomPojo(SysSmsLogDO.class, ArrayUtils.append(consumer, consumers)); | |
| 150 | + } | |
| 151 | +} | ... | ... |
src/test/java/cn/iocoder/dashboard/modules/system/service/sms/SysSmsTemplateServiceTest.java
| ... | ... | @@ -79,7 +79,7 @@ public class SysSmsTemplateServiceTest extends BaseDbUnitTest { |
| 79 | 79 | SysSmsTemplateCreateReqVO reqVO = randomPojo(SysSmsTemplateCreateReqVO.class, o -> { |
| 80 | 80 | o.setContent("正在进行登录操作{operation},您的验证码是{code}"); |
| 81 | 81 | o.setStatus(randomEle(CommonStatusEnum.values()).getStatus()); // 保证 status 的范围 |
| 82 | - o.setType(randomEle(SysSmsTemplateTypeEnum.values()).getType()); // 保证 type 的泛微 | |
| 82 | + o.setType(randomEle(SysSmsTemplateTypeEnum.values()).getType()); // 保证 type 的 范围 | |
| 83 | 83 | }); |
| 84 | 84 | // mock Channel 的方法 |
| 85 | 85 | SysSmsChannelDO channelDO = randomPojo(SysSmsChannelDO.class, o -> { |
| ... | ... | @@ -114,7 +114,7 @@ public class SysSmsTemplateServiceTest extends BaseDbUnitTest { |
| 114 | 114 | o.setId(dbSmsTemplate.getId()); // 设置更新的 ID |
| 115 | 115 | o.setContent("正在进行登录操作{operation},您的验证码是{code}"); |
| 116 | 116 | o.setStatus(randomEle(CommonStatusEnum.values()).getStatus()); // 保证 status 的范围 |
| 117 | - o.setType(randomEle(SysSmsTemplateTypeEnum.values()).getType()); // 保证 type 的泛微 | |
| 117 | + o.setType(randomEle(SysSmsTemplateTypeEnum.values()).getType()); // 保证 type 的 范围 | |
| 118 | 118 | }); |
| 119 | 119 | // mock 方法 |
| 120 | 120 | SysSmsChannelDO channelDO = randomPojo(SysSmsChannelDO.class, o -> { |
| ... | ... | @@ -339,7 +339,7 @@ public class SysSmsTemplateServiceTest extends BaseDbUnitTest { |
| 339 | 339 | private static SysSmsTemplateDO randomSmsTemplateDO(Consumer<SysSmsTemplateDO>... consumers) { |
| 340 | 340 | Consumer<SysSmsTemplateDO> consumer = (o) -> { |
| 341 | 341 | o.setStatus(randomEle(CommonStatusEnum.values()).getStatus()); // 保证 status 的范围 |
| 342 | - o.setType(randomEle(SysSmsTemplateTypeEnum.values()).getType()); // 保证 type 的泛微 | |
| 342 | + o.setType(randomEle(SysSmsTemplateTypeEnum.values()).getType()); // 保证 type 的 范围 | |
| 343 | 343 | }; |
| 344 | 344 | return randomPojo(SysSmsTemplateDO.class, ArrayUtils.append(consumer, consumers)); |
| 345 | 345 | } | ... | ... |
src/test/resources/sql/clean.sql
src/test/resources/sql/create_tables.sql
| ... | ... | @@ -378,3 +378,36 @@ CREATE TABLE "sys_sms_template" ( |
| 378 | 378 | "deleted" bit NOT NULL DEFAULT FALSE, |
| 379 | 379 | PRIMARY KEY ("id") |
| 380 | 380 | ) COMMENT '短信模板'; |
| 381 | + | |
| 382 | +CREATE TABLE "sys_sms_log" ( | |
| 383 | + "id" bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY, | |
| 384 | + "channel_id" bigint NOT NULL, | |
| 385 | + "channel_code" varchar(63) NOT NULL, | |
| 386 | + "template_id" bigint NOT NULL, | |
| 387 | + "template_code" varchar(63) NOT NULL, | |
| 388 | + "template_type" tinyint NOT NULL, | |
| 389 | + "template_content" varchar(255) NOT NULL, | |
| 390 | + "template_params" varchar(255) NOT NULL, | |
| 391 | + "api_template_id" varchar(63) NOT NULL, | |
| 392 | + "mobile" varchar(11) NOT NULL, | |
| 393 | + "user_id" bigint DEFAULT '0', | |
| 394 | + "user_type" tinyint DEFAULT '0', | |
| 395 | + "send_status" tinyint NOT NULL DEFAULT '0', | |
| 396 | + "send_time" timestamp DEFAULT NULL, | |
| 397 | + "send_code" int DEFAULT NULL, | |
| 398 | + "send_msg" varchar(255) DEFAULT NULL, | |
| 399 | + "api_send_code" varchar(63) DEFAULT NULL, | |
| 400 | + "api_send_msg" varchar(255) DEFAULT NULL, | |
| 401 | + "api_request_id" varchar(255) DEFAULT NULL, | |
| 402 | + "api_serial_no" varchar(255) DEFAULT NULL, | |
| 403 | + "receive_status" tinyint NOT NULL DEFAULT '0', | |
| 404 | + "receive_time" timestamp DEFAULT NULL, | |
| 405 | + "api_receive_code" varchar(63) DEFAULT NULL, | |
| 406 | + "api_receive_msg" varchar(255) DEFAULT NULL, | |
| 407 | + "creator" varchar(64) DEFAULT '', | |
| 408 | + "create_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, | |
| 409 | + "updater" varchar(64) DEFAULT '', | |
| 410 | + "update_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, | |
| 411 | + "deleted" bit NOT NULL DEFAULT FALSE, | |
| 412 | + PRIMARY KEY ("id") | |
| 413 | +) COMMENT '短信日志'; | ... | ... |