From c32e27b174b614a7c8005de3371f9987e05f1bb0 Mon Sep 17 00:00:00 2001 From: lyf66 Date: Fri, 26 Sep 2025 10:55:25 +0800 Subject: [PATCH] =?UTF-8?q?feat(sms):=E4=BC=98=E5=8C=96=E7=94=9F=E6=97=A5?= =?UTF-8?q?=E7=9F=AD=E4=BF=A1=E5=8F=91=E9=80=81=E9=80=BB=E8=BE=91=E5=B9=B6?= =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E5=8E=BB=E9=87=8D=E6=9C=BA=E5=88=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 修改查询条件,增加对专家生日短信已发送标记的过滤 - 实现发送前手机号去重逻辑,避免重复发送 - 添加发送成功后更新专家短信发送标记的逻辑 - 实现定时任务每天重置专家短信发送标记- 添加定时任务,每天凌晨重置短信发送状态 - 增加发送短信抄送功能,抄送指定人员 - 优化线程安全控制,防止重复执行短信发送任务 - 更新 Specialist 实体类,增加短信发送标记字段 - 修改 SpecialistMapper,添加重置短信发送标记的方法- 更新数据库表结构,添加短信发送标记字段 --- sql/tables.sms.sql | 4 +- .../com/whdc/mapper/SpecialistMapper.java | 3 + .../com/whdc/model/entity/Specialist.java | 8 ++ .../service/impl/SmsBirthdayServiceImpl.java | 102 ++++++++++++------ 4 files changed, 82 insertions(+), 35 deletions(-) diff --git a/sql/tables.sms.sql b/sql/tables.sms.sql index c352b57..5f5d4cf 100644 --- a/sql/tables.sms.sql +++ b/sql/tables.sms.sql @@ -9,7 +9,9 @@ CREATE TABLE SPECIALIST ( ADDRESS VARCHAR(20) COMMENT '区域', PHONE VARCHAR(20) UNIQUE COMMENT '电话号码', STATUS INT DEFAULT 1 COMMENT '生效状态 1:有效 0:无效', - CREATE_TM DATETIME DEFAULT CURRENT_TIME COMMENT '创建日期' + CREATE_TM DATETIME DEFAULT CURRENT_TIME COMMENT '创建日期', + FLAG_BIRTHDAY_SENT_TODAY INT DEFAULT 0 + FLAG_HOLIDAY_SENT_TODAY INT DEFAULT 0 ); diff --git a/src/main/java/com/whdc/mapper/SpecialistMapper.java b/src/main/java/com/whdc/mapper/SpecialistMapper.java index 0f5046f..0bea9f1 100644 --- a/src/main/java/com/whdc/mapper/SpecialistMapper.java +++ b/src/main/java/com/whdc/mapper/SpecialistMapper.java @@ -2,6 +2,7 @@ package com.whdc.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.whdc.model.entity.Specialist; +import org.apache.ibatis.annotations.Update; /** * 专家通讯录Mapper接口 @@ -10,4 +11,6 @@ import com.whdc.model.entity.Specialist; * @since 2025-09-23 */ public interface SpecialistMapper extends BaseMapper { + @Update("update specialist set flag_birthday_sent_today = 0") + void resetFlagBirthdaySentToday(); } \ No newline at end of file diff --git a/src/main/java/com/whdc/model/entity/Specialist.java b/src/main/java/com/whdc/model/entity/Specialist.java index ee5049e..2a1fcc8 100644 --- a/src/main/java/com/whdc/model/entity/Specialist.java +++ b/src/main/java/com/whdc/model/entity/Specialist.java @@ -83,4 +83,12 @@ public class Specialist implements Serializable { @ApiModelProperty(value = "创建日期") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") private Date createTm; + + //标记今天已经发送过生日短信的flag + @TableField("FLAG_BIRTHDAY_SENT_TODAY") + private Integer flagBirthdaySentToday; + + //标记今天已经发送过节日短信的flag + @TableField("FLAG_HOLIDAY_SENT_TODAY") + private Integer flagHolidaySentToday; } diff --git a/src/main/java/com/whdc/service/impl/SmsBirthdayServiceImpl.java b/src/main/java/com/whdc/service/impl/SmsBirthdayServiceImpl.java index 481712d..121782a 100644 --- a/src/main/java/com/whdc/service/impl/SmsBirthdayServiceImpl.java +++ b/src/main/java/com/whdc/service/impl/SmsBirthdayServiceImpl.java @@ -18,8 +18,7 @@ import org.springframework.stereotype.Service; import java.time.LocalDate; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; -import java.util.Collections; -import java.util.List; +import java.util.*; import java.util.concurrent.atomic.AtomicBoolean; /** @@ -42,7 +41,7 @@ public class SmsBirthdayServiceImpl extends ServiceImpl listBirthdayToday() { @@ -54,8 +53,9 @@ public class SmsBirthdayServiceImpl extends ServiceImpl queryWrapper = new LambdaQueryWrapper<>(); queryWrapper - .apply("DATE_FORMAT(BIRTHDAY, '%m-%d') = {0}", monthDay) - .eq(Specialist::getStatus, 1); // 1:有效 + .apply("DATE_FORMAT(BIRTHDAY, '%m-%d') = {0}", monthDay) + .eq(Specialist::getFlagBirthdaySentToday, 0) + .eq(Specialist::getStatus, 1); // 1:有效 List specialists = specialistMapper.selectList(queryWrapper); return specialists != null ? specialists : Collections.emptyList(); @@ -89,8 +89,14 @@ public class SmsBirthdayServiceImpl extends ServiceImpl distinct = new HashSet<>(); for (int i = 0; i < specialists.size(); i++) { Specialist specialist = specialists.get(i); + if (distinct.contains(specialist.getPhone())) { + continue; + } + String content = template.replace("{姓名}", specialist.getName()); try { log.info("正在发送第{}/{}位专家{}的生日短信", i + 1, totalSpecialists, specialist.getName()); @@ -98,14 +104,18 @@ public class SmsBirthdayServiceImpl extends ServiceImpl phoneList = Collections.singletonList(specialist.getPhone()); String sendResult = smsHelper.send(phoneList, content); + // 更新专家的flagBirthdaySentToday + specialist.setFlagBirthdaySentToday(1); + specialistMapper.updateById(specialist); + distinct.add(specialist.getPhone()); log.info("向专家{}发送生日短信结果: {}", specialist.getName(), sendResult); // 根据发送结果设置备注 @@ -114,7 +124,8 @@ public class SmsBirthdayServiceImpl extends ServiceImpl phoneList = new ArrayList<>(); + phoneList.add("18154318312"); //唐威 + phoneList.add("13247155309"); //陈锋 + phoneList.add("15671545233"); //李 + smsHelper.send(phoneList, content); + } + + /** + * 每天0点重置所有专家的flagBirthdaySentToday为0 + */ + @Scheduled(cron = "0 0 0 * * ?") + public void resetFlagBirthdaySentToday() { + specialistMapper.resetFlagBirthdaySentToday(); + } /** * 定时检查并发送生日短信 * 每分钟执行一次 @@ -158,12 +187,6 @@ public class SmsBirthdayServiceImpl extends ServiceImpl