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
| @@ -23,9 +23,9 @@ import java.util.Map; | @@ -23,9 +23,9 @@ import java.util.Map; | ||
| 23 | @Data | 23 | @Data |
| 24 | @EqualsAndHashCode(callSuper = true) | 24 | @EqualsAndHashCode(callSuper = true) |
| 25 | @ToString(callSuper = true) | 25 | @ToString(callSuper = true) |
| 26 | +@Builder | ||
| 26 | @AllArgsConstructor | 27 | @AllArgsConstructor |
| 27 | @NoArgsConstructor | 28 | @NoArgsConstructor |
| 28 | -@Builder | ||
| 29 | public class SysSmsLogDO extends BaseDO { | 29 | public class SysSmsLogDO extends BaseDO { |
| 30 | 30 | ||
| 31 | /** | 31 | /** |
src/main/java/cn/iocoder/dashboard/modules/system/dal/mysql/sms/SysSmsLogMapper.java
| 1 | package cn.iocoder.dashboard.modules.system.dal.mysql.sms; | 1 | package cn.iocoder.dashboard.modules.system.dal.mysql.sms; |
| 2 | 2 | ||
| 3 | +import cn.iocoder.dashboard.common.pojo.PageResult; | ||
| 3 | import cn.iocoder.dashboard.framework.mybatis.core.mapper.BaseMapperX; | 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 | import cn.iocoder.dashboard.modules.system.dal.dataobject.sms.SysSmsLogDO; | 8 | import cn.iocoder.dashboard.modules.system.dal.dataobject.sms.SysSmsLogDO; |
| 5 | import org.apache.ibatis.annotations.Mapper; | 9 | import org.apache.ibatis.annotations.Mapper; |
| 6 | 10 | ||
| 11 | +import java.util.List; | ||
| 12 | + | ||
| 7 | @Mapper | 13 | @Mapper |
| 8 | public interface SysSmsLogMapper extends BaseMapperX<SysSmsLogDO> { | 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 | package cn.iocoder.dashboard.modules.system.service.sms; | 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 | import cn.iocoder.dashboard.modules.system.dal.dataobject.sms.SysSmsTemplateDO; | 7 | import cn.iocoder.dashboard.modules.system.dal.dataobject.sms.SysSmsTemplateDO; |
| 4 | 8 | ||
| 5 | import java.util.Date; | 9 | import java.util.Date; |
| 10 | +import java.util.List; | ||
| 6 | import java.util.Map; | 11 | import java.util.Map; |
| 7 | 12 | ||
| 8 | /** | 13 | /** |
| @@ -53,4 +58,20 @@ public interface SysSmsLogService { | @@ -53,4 +58,20 @@ public interface SysSmsLogService { | ||
| 53 | */ | 58 | */ |
| 54 | void updateSmsReceiveResult(Long id, Boolean success, Date receiveTime, String apiReceiveCode, String apiReceiveMsg); | 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,6 +14,34 @@ import java.util.Map; | ||
| 14 | */ | 14 | */ |
| 15 | public interface SysSmsService { | 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 | Long sendSingleSms(String mobile, Long userId, Integer userType, | 45 | Long sendSingleSms(String mobile, Long userId, Integer userType, |
| 18 | String templateCode, Map<String, Object> templateParams); | 46 | String templateCode, Map<String, Object> templateParams); |
| 19 | 47 |
src/main/java/cn/iocoder/dashboard/modules/system/service/sms/impl/SysSmsLogServiceImpl.java
| 1 | package cn.iocoder.dashboard.modules.system.service.sms.impl; | 1 | package cn.iocoder.dashboard.modules.system.service.sms.impl; |
| 2 | 2 | ||
| 3 | import cn.iocoder.dashboard.common.pojo.CommonResult; | 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 | import cn.iocoder.dashboard.modules.system.dal.dataobject.sms.SysSmsLogDO; | 7 | import cn.iocoder.dashboard.modules.system.dal.dataobject.sms.SysSmsLogDO; |
| 5 | import cn.iocoder.dashboard.modules.system.dal.dataobject.sms.SysSmsTemplateDO; | 8 | import cn.iocoder.dashboard.modules.system.dal.dataobject.sms.SysSmsTemplateDO; |
| 6 | import cn.iocoder.dashboard.modules.system.dal.mysql.sms.SysSmsLogMapper; | 9 | import cn.iocoder.dashboard.modules.system.dal.mysql.sms.SysSmsLogMapper; |
| @@ -12,6 +15,7 @@ import org.springframework.stereotype.Service; | @@ -12,6 +15,7 @@ import org.springframework.stereotype.Service; | ||
| 12 | 15 | ||
| 13 | import javax.annotation.Resource; | 16 | import javax.annotation.Resource; |
| 14 | import java.util.Date; | 17 | import java.util.Date; |
| 18 | +import java.util.List; | ||
| 15 | import java.util.Map; | 19 | import java.util.Map; |
| 16 | import java.util.Objects; | 20 | import java.util.Objects; |
| 17 | 21 | ||
| @@ -69,4 +73,14 @@ public class SysSmsLogServiceImpl implements SysSmsLogService { | @@ -69,4 +73,14 @@ public class SysSmsLogServiceImpl implements SysSmsLogService { | ||
| 69 | .apiReceiveCode(apiReceiveCode).apiReceiveMsg(apiReceiveMsg).build()); | 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,7 +25,6 @@ import org.springframework.util.Assert; | ||
| 25 | import javax.annotation.Resource; | 25 | import javax.annotation.Resource; |
| 26 | import java.util.List; | 26 | import java.util.List; |
| 27 | import java.util.Map; | 27 | import java.util.Map; |
| 28 | -import java.util.Objects; | ||
| 29 | import java.util.stream.Collectors; | 28 | import java.util.stream.Collectors; |
| 30 | 29 | ||
| 31 | import static cn.iocoder.dashboard.common.exception.util.ServiceExceptionUtil.exception; | 30 | import static cn.iocoder.dashboard.common.exception.util.ServiceExceptionUtil.exception; |
| @@ -54,12 +53,30 @@ public class SysSmsServiceImpl implements SysSmsService { | @@ -54,12 +53,30 @@ public class SysSmsServiceImpl implements SysSmsService { | ||
| 54 | private SysUserService userService; | 53 | private SysUserService userService; |
| 55 | 54 | ||
| 56 | @Override | 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 | public Long sendSingleSms(String mobile, Long userId, Integer userType, | 74 | public Long sendSingleSms(String mobile, Long userId, Integer userType, |
| 58 | String templateCode, Map<String, Object> templateParams) { | 75 | String templateCode, Map<String, Object> templateParams) { |
| 59 | // 校验短信模板是否合法 | 76 | // 校验短信模板是否合法 |
| 60 | SysSmsTemplateDO template = this.checkSmsTemplateValid(templateCode); | 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 | Boolean isSend = CommonStatusEnum.ENABLE.getStatus().equals(template.getStatus()); // 如果模板被禁用,则不发送短信,只记录日志 | 82 | Boolean isSend = CommonStatusEnum.ENABLE.getStatus().equals(template.getStatus()); // 如果模板被禁用,则不发送短信,只记录日志 |
| @@ -77,7 +94,7 @@ public class SysSmsServiceImpl implements SysSmsService { | @@ -77,7 +94,7 @@ public class SysSmsServiceImpl implements SysSmsService { | ||
| 77 | @Override | 94 | @Override |
| 78 | public void sendBatchSms(List<String> mobiles, List<Long> userIds, Integer userType, | 95 | public void sendBatchSms(List<String> mobiles, List<Long> userIds, Integer userType, |
| 79 | String templateCode, Map<String, Object> templateParams) { | 96 | String templateCode, Map<String, Object> templateParams) { |
| 80 | - throw new IllegalArgumentException("暂时不支持该操作,感兴趣可以实现该功能哟!"); | 97 | + throw new UnsupportedOperationException("暂时不支持该操作,感兴趣可以实现该功能哟!"); |
| 81 | } | 98 | } |
| 82 | 99 | ||
| 83 | private SysSmsTemplateDO checkSmsTemplateValid(String templateCode) { | 100 | private SysSmsTemplateDO checkSmsTemplateValid(String templateCode) { |
| @@ -108,31 +125,13 @@ public class SysSmsServiceImpl implements SysSmsService { | @@ -108,31 +125,13 @@ public class SysSmsServiceImpl implements SysSmsService { | ||
| 108 | }).collect(Collectors.toList()); | 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 | if (StrUtil.isEmpty(mobile)) { | 129 | if (StrUtil.isEmpty(mobile)) { |
| 114 | throw exception(SMS_SEND_MOBILE_NOT_EXISTS); | 130 | throw exception(SMS_SEND_MOBILE_NOT_EXISTS); |
| 115 | } | 131 | } |
| 116 | return mobile; | 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 | @Override | 135 | @Override |
| 137 | public void doSendSms(SysSmsSendMessage message) { | 136 | public void doSendSms(SysSmsSendMessage message) { |
| 138 | // 获得渠道对应的 SmsClient 客户端 | 137 | // 获得渠道对应的 SmsClient 客户端 |
src/main/resources/codegen/java/service/service.vm
| @@ -63,7 +63,7 @@ public interface ${table.className}Service { | @@ -63,7 +63,7 @@ public interface ${table.className}Service { | ||
| 63 | * 获得${table.classComment}列表, 用于 Excel 导出 | 63 | * 获得${table.classComment}列表, 用于 Excel 导出 |
| 64 | * | 64 | * |
| 65 | * @param exportReqVO 查询条件 | 65 | * @param exportReqVO 查询条件 |
| 66 | - * @return ${table.classComment}分页 | 66 | + * @return ${table.classComment}列表 |
| 67 | */ | 67 | */ |
| 68 | List<${table.className}DO> get${simpleClassName}List(${table.className}ExportReqVO exportReqVO); | 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,6 +138,8 @@ public class SysSmsChannelServiceTest extends BaseDbUnitTest { | ||
| 138 | assertPojoEquals(dbSmsChannel, pageResult.getList().get(0)); | 138 | assertPojoEquals(dbSmsChannel, pageResult.getList().get(0)); |
| 139 | } | 139 | } |
| 140 | 140 | ||
| 141 | + // ========== 随机对象 ========== | ||
| 142 | + | ||
| 141 | @SafeVarargs | 143 | @SafeVarargs |
| 142 | private static SysSmsChannelDO randomSmsChannelDO(Consumer<SysSmsChannelDO>... consumers) { | 144 | private static SysSmsChannelDO randomSmsChannelDO(Consumer<SysSmsChannelDO>... consumers) { |
| 143 | Consumer<SysSmsChannelDO> consumer = (o) -> { | 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,7 +79,7 @@ public class SysSmsTemplateServiceTest extends BaseDbUnitTest { | ||
| 79 | SysSmsTemplateCreateReqVO reqVO = randomPojo(SysSmsTemplateCreateReqVO.class, o -> { | 79 | SysSmsTemplateCreateReqVO reqVO = randomPojo(SysSmsTemplateCreateReqVO.class, o -> { |
| 80 | o.setContent("正在进行登录操作{operation},您的验证码是{code}"); | 80 | o.setContent("正在进行登录操作{operation},您的验证码是{code}"); |
| 81 | o.setStatus(randomEle(CommonStatusEnum.values()).getStatus()); // 保证 status 的范围 | 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 | // mock Channel 的方法 | 84 | // mock Channel 的方法 |
| 85 | SysSmsChannelDO channelDO = randomPojo(SysSmsChannelDO.class, o -> { | 85 | SysSmsChannelDO channelDO = randomPojo(SysSmsChannelDO.class, o -> { |
| @@ -114,7 +114,7 @@ public class SysSmsTemplateServiceTest extends BaseDbUnitTest { | @@ -114,7 +114,7 @@ public class SysSmsTemplateServiceTest extends BaseDbUnitTest { | ||
| 114 | o.setId(dbSmsTemplate.getId()); // 设置更新的 ID | 114 | o.setId(dbSmsTemplate.getId()); // 设置更新的 ID |
| 115 | o.setContent("正在进行登录操作{operation},您的验证码是{code}"); | 115 | o.setContent("正在进行登录操作{operation},您的验证码是{code}"); |
| 116 | o.setStatus(randomEle(CommonStatusEnum.values()).getStatus()); // 保证 status 的范围 | 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 | // mock 方法 | 119 | // mock 方法 |
| 120 | SysSmsChannelDO channelDO = randomPojo(SysSmsChannelDO.class, o -> { | 120 | SysSmsChannelDO channelDO = randomPojo(SysSmsChannelDO.class, o -> { |
| @@ -339,7 +339,7 @@ public class SysSmsTemplateServiceTest extends BaseDbUnitTest { | @@ -339,7 +339,7 @@ public class SysSmsTemplateServiceTest extends BaseDbUnitTest { | ||
| 339 | private static SysSmsTemplateDO randomSmsTemplateDO(Consumer<SysSmsTemplateDO>... consumers) { | 339 | private static SysSmsTemplateDO randomSmsTemplateDO(Consumer<SysSmsTemplateDO>... consumers) { |
| 340 | Consumer<SysSmsTemplateDO> consumer = (o) -> { | 340 | Consumer<SysSmsTemplateDO> consumer = (o) -> { |
| 341 | o.setStatus(randomEle(CommonStatusEnum.values()).getStatus()); // 保证 status 的范围 | 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 | return randomPojo(SysSmsTemplateDO.class, ArrayUtils.append(consumer, consumers)); | 344 | return randomPojo(SysSmsTemplateDO.class, ArrayUtils.append(consumer, consumers)); |
| 345 | } | 345 | } |
src/test/resources/sql/clean.sql
| @@ -21,3 +21,4 @@ DELETE FROM "sys_operate_log"; | @@ -21,3 +21,4 @@ DELETE FROM "sys_operate_log"; | ||
| 21 | DELETE FROM "sys_user"; | 21 | DELETE FROM "sys_user"; |
| 22 | DELETE FROM "sys_sms_channel"; | 22 | DELETE FROM "sys_sms_channel"; |
| 23 | DELETE FROM "sys_sms_template"; | 23 | DELETE FROM "sys_sms_template"; |
| 24 | +DELETE FROM "sys_sms_log"; |
src/test/resources/sql/create_tables.sql
| @@ -378,3 +378,36 @@ CREATE TABLE "sys_sms_template" ( | @@ -378,3 +378,36 @@ CREATE TABLE "sys_sms_template" ( | ||
| 378 | "deleted" bit NOT NULL DEFAULT FALSE, | 378 | "deleted" bit NOT NULL DEFAULT FALSE, |
| 379 | PRIMARY KEY ("id") | 379 | PRIMARY KEY ("id") |
| 380 | ) COMMENT '短信模板'; | 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 '短信日志'; |