Commit 7760e163b3403ad3b184269671ed86a38f32b97f

Authored by YunaiV
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 &quot;sys_operate_log&quot;; @@ -21,3 +21,4 @@ DELETE FROM &quot;sys_operate_log&quot;;
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 &quot;sys_sms_template&quot; ( @@ -378,3 +378,36 @@ CREATE TABLE &quot;sys_sms_template&quot; (
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 '短信日志';