diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/sms/vo/log/SmsLogRespVO.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/sms/vo/log/SmsLogRespVO.java index 77409ed918..d7277cf2bd 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/sms/vo/log/SmsLogRespVO.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/sms/vo/log/SmsLogRespVO.java @@ -113,4 +113,6 @@ public class SmsLogRespVO { @ExcelProperty("创建时间") private LocalDateTime createTime; + private String taskName; + private Long orderId; } diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/sms/SmsLogDO.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/sms/SmsLogDO.java index 9f250ce691..74bfa65ba2 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/sms/SmsLogDO.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/sms/SmsLogDO.java @@ -158,4 +158,6 @@ public class SmsLogDO extends BaseDO { */ private String apiReceiveMsg; + private String taskName; + private Long orderId; } diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/sms/SmsLogService.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/sms/SmsLogService.java index 0c86c0f07f..833fb06734 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/sms/SmsLogService.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/sms/SmsLogService.java @@ -31,6 +31,10 @@ public interface SmsLogService { Long createSmsLog(String mobile, Long userId, Integer userType, Boolean isSend, SmsTemplateDO template, String templateContent, Map templateParams); + public Long createSmsLog(String mobile, Long userId, Integer userType, Boolean isSend, + SmsTemplateDO template, String templateContent, Map templateParams,String taskName, + Long orderId); + /** * 更新日志的发送结果 * diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/sms/SmsLogServiceImpl.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/sms/SmsLogServiceImpl.java index 4f969cedf8..57f6fe7580 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/sms/SmsLogServiceImpl.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/sms/SmsLogServiceImpl.java @@ -51,6 +51,32 @@ public class SmsLogServiceImpl implements SmsLogService { return logDO.getId(); } + public Long createSmsLog(String mobile, Long userId, Integer userType, Boolean isSend, + SmsTemplateDO template, String templateContent, Map templateParams,String taskName, + Long orderId) { + SmsLogDO.SmsLogDOBuilder logBuilder = SmsLogDO.builder(); + // 根据是否要发送,设置状态 + logBuilder.sendStatus(Objects.equals(isSend, true) ? SmsSendStatusEnum.INIT.getStatus() + : SmsSendStatusEnum.IGNORE.getStatus()); + // 设置手机相关字段 + logBuilder.mobile(mobile).userId(userId).userType(userType); + // 设置模板相关字段 + logBuilder.templateId(template.getId()).templateCode(template.getCode()).templateType(template.getType()); + logBuilder.templateContent(templateContent).templateParams(templateParams) + .apiTemplateId(template.getApiTemplateId()); + // 设置渠道相关字段 + logBuilder.channelId(template.getChannelId()).channelCode(template.getChannelCode()); + // 设置接收相关字段 + logBuilder.receiveStatus(SmsReceiveStatusEnum.INIT.getStatus()); + + // 插入数据库 + SmsLogDO logDO = logBuilder.build(); + logDO.setTaskName(taskName); + logDO.setOrderId(orderId); + smsLogMapper.insert(logDO); + return logDO.getId(); + } + @Override public void updateSmsSendResult(Long id, Boolean success, String apiSendCode, String apiSendMsg, diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/sms/SmsSendService.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/sms/SmsSendService.java index 3c42cf58ea..e975e1b4bc 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/sms/SmsSendService.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/sms/SmsSendService.java @@ -14,12 +14,12 @@ public interface SmsSendService { /** * 发送单条短信给管理后台的用户 - * + *

* 在 mobile 为空时,使用 userId 加载对应管理员的手机号 * - * @param mobile 手机号 - * @param userId 用户编号 - * @param templateCode 短信模板编号 + * @param mobile 手机号 + * @param userId 用户编号 + * @param templateCode 短信模板编号 * @param templateParams 短信模板参数 * @return 发送日志编号 */ @@ -28,25 +28,28 @@ public interface SmsSendService { /** * 发送单条短信给用户 APP 的用户 - * + *

* 在 mobile 为空时,使用 userId 加载对应会员的手机号 * - * @param mobile 手机号 - * @param userId 用户编号 - * @param templateCode 短信模板编号 + * @param mobile 手机号 + * @param userId 用户编号 + * @param templateCode 短信模板编号 * @param templateParams 短信模板参数 * @return 发送日志编号 */ Long sendSingleSmsToMember(String mobile, Long userId, String templateCode, Map templateParams); + Long sendSingleSmsWithChannel(String mobile, Long userId, Integer userType, String taskName, Long orderId, + String templateCode, Map templateParams, Long channelId); + /** * 发送单条短信给用户 * - * @param mobile 手机号 - * @param userId 用户编号 - * @param userType 用户类型 - * @param templateCode 短信模板编号 + * @param mobile 手机号 + * @param userId 用户编号 + * @param userType 用户类型 + * @param templateCode 短信模板编号 * @param templateParams 短信模板参数 * @return 发送日志编号 */ @@ -70,7 +73,7 @@ public interface SmsSendService { * 接收短信的接收结果 * * @param channelCode 渠道编码 - * @param text 结果内容 + * @param text 结果内容 * @throws Throwable 处理失败时,抛出异常 */ void receiveSmsStatus(String channelCode, String text) throws Throwable; diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/sms/SmsSendServiceImpl.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/sms/SmsSendServiceImpl.java index 41f429eca0..552611f3be 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/sms/SmsSendServiceImpl.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/sms/SmsSendServiceImpl.java @@ -77,6 +77,34 @@ public class SmsSendServiceImpl implements SmsSendService { return sendSingleSms(mobile, userId, UserTypeEnum.MEMBER.getValue(), templateCode, templateParams); } + @Override + public Long sendSingleSmsWithChannel(String mobile, Long userId, Integer userType,String taskName,Long orderId, + String templateCode, Map templateParams, Long channelId) { + // 校验短信模板是否合法 + SmsTemplateDO template = validateSmsTemplate(templateCode); + // 校验短信渠道是否合法 + SmsChannelDO smsChannel = validateSmsChannel(channelId); + + // 校验手机号码是否存在 + mobile = validateMobile(mobile); + // 构建有序的模板参数。为什么放在这个位置,是提前保证模板参数的正确性,而不是到了插入发送日志 + List> newTemplateParams = buildTemplateParams(template, templateParams); + + // 创建发送日志。如果模板被禁用,则不发送短信,只记录日志 + Boolean isSend = CommonStatusEnum.ENABLE.getStatus().equals(template.getStatus()) + && CommonStatusEnum.ENABLE.getStatus().equals(smsChannel.getStatus()); + String content = smsTemplateService.formatSmsTemplateContent(template.getContent(), templateParams); + Long sendLogId = smsLogService.createSmsLog(mobile, userId, userType, isSend, template, content, templateParams,taskName,orderId); + + // 发送 MQ 消息,异步执行发送短信 + if (isSend) { + smsProducer.sendSmsSendMessage(sendLogId, mobile, channelId, + template.getApiTemplateId(), newTemplateParams); + } + return sendLogId; + } + + @Override public Long sendSingleSms(String mobile, Long userId, Integer userType, String templateCode, Map templateParams) { diff --git a/yudao-server/src/main/resources/db/migration/V4.0.1_sms_create.sql b/yudao-server/src/main/resources/db/migration/V4.0.1_sms_create.sql new file mode 100644 index 0000000000..f1ac1f5585 --- /dev/null +++ b/yudao-server/src/main/resources/db/migration/V4.0.1_sms_create.sql @@ -0,0 +1,26 @@ +DROP TABLE IF EXISTS `haoka_sms_task`; +CREATE TABLE `haoka_sms_task` +( + `id` bigint(20) NOT NULL PRIMARY KEY COMMENT 'ID', + `name` varchar(512) NOT NULL COMMENT '任务名称', + `order_status` bigint(20) COMMENT '订单状态', + `order_source_list` longtext COMMENT '订单来源', + `order_on_sale_product_list` longtext COMMENT '商品名称', + `call_status` int(11) COMMENT '是否外呼', + `send_time` int(11) NOT NULL COMMENT '发送时间段', + `sms_channel_id` bigint(20) NOT NULL COMMENT '短信渠道', + `sms_type` int(11) NOT NULL COMMENT '短信类型', + `sms_template_id` int(20) NOT NULL COMMENT '短信内容', + `test_phone` varchar(2048) COMMENT '测试手机', + `dept_id` bigint(20) COMMENT '部门ID', + `creator` varchar(64) NOT NULL DEFAULT '' COMMENT '创建者', + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `updater` varchar(64) NOT NULL DEFAULT '' COMMENT '更新者', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除', + `tenant_id` bigint(20) NOT NULL DEFAULT 0 COMMENT '租户编号' +) COMMENT = '短信任务'; + +ALTER TABLE `system_sms_log` + ADD COLUMN `task_name` varchar(1024) NULL COMMENT '任务名称' AFTER `deleted`, +ADD COLUMN `order_id` bigint(20) NULL COMMENT '订单ID' AFTER `task_name`;