diff --git a/src/main/java/com/ai/da/AiDaApplication.java b/src/main/java/com/ai/da/AiDaApplication.java index 2933e83a..2454e1d8 100644 --- a/src/main/java/com/ai/da/AiDaApplication.java +++ b/src/main/java/com/ai/da/AiDaApplication.java @@ -3,9 +3,11 @@ package com.ai.da; import lombok.extern.slf4j.Slf4j; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.scheduling.annotation.EnableScheduling; @Slf4j @SpringBootApplication +@EnableScheduling public class AiDaApplication { public static void main(String[] args) { diff --git a/src/main/java/com/ai/da/common/config/MyTaskScheduler.java b/src/main/java/com/ai/da/common/config/MyTaskScheduler.java new file mode 100644 index 00000000..0aa04f9e --- /dev/null +++ b/src/main/java/com/ai/da/common/config/MyTaskScheduler.java @@ -0,0 +1,53 @@ +package com.ai.da.common.config; + +import com.ai.da.common.utils.SendEmailUtil; +import com.ai.da.mapper.AccountMapper; +import com.ai.da.mapper.entity.Account; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import org.springframework.scheduling.annotation.EnableScheduling; +import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; +import java.util.List; + +@Component +public class MyTaskScheduler { + + @Resource + private AccountMapper accountMapper; + + // 定时任务,每周一零点执行一次 + @Scheduled(cron = "0 0 0 ? * MON") +// @Scheduled(cron = "0 0/1 * * * ?") + public void checkExpiry() { + // 检测正式用户是否快要过期 + QueryWrapper qw = new QueryWrapper<>(); + qw.lambda().eq(Account::getIsTrial, 0); +// qw.lambda().eq(Account::getId, 88); + List accountList = accountMapper.selectList(qw); + for (Account account : accountList) { + // 用户到期时间戳 + Long timestamp = account.getValidEndTime(); // 替换为你的时间戳 + + // 获取当前时间戳 + Long currentTimestamp = System.currentTimeMillis(); + + // 计算时间差(毫秒) + long timeDifference = currentTimestamp - timestamp; + + if (timeDifference < 0) { + continue; + } + + // 判断是否在30天以内(30天的毫秒数) + long thirtyDaysInMillis = 30L * 24 * 60 * 60 * 1000; + boolean within30Days = timeDifference <= thirtyDaysInMillis; + + if (within30Days) { + // 发邮件 + SendEmailUtil.sendWillBeExpiredEmail(account, null); + } + } + } +} diff --git a/src/main/java/com/ai/da/common/utils/SendEmailUtil.java b/src/main/java/com/ai/da/common/utils/SendEmailUtil.java index 6622798a..a14975a4 100644 --- a/src/main/java/com/ai/da/common/utils/SendEmailUtil.java +++ b/src/main/java/com/ai/da/common/utils/SendEmailUtil.java @@ -1,5 +1,6 @@ package com.ai.da.common.utils; +import com.ai.da.mapper.entity.Account; import com.ai.da.mapper.entity.TrialOrder; import com.alibaba.fastjson.JSONObject; import com.ai.da.common.config.exception.BusinessException; @@ -178,6 +179,60 @@ public class SendEmailUtil { throw new BusinessException("failed.to.send.mail"); } } + private final static Long WILLBEEXPIRED_TEMPLATE_ID = 118178L; + public static void sendWillBeExpiredEmail(Account account, String senderAddress) { + try { + // 实例化一个认证对象 + Credential cred = new Credential(SECRET_ID, SECRET_KEy); + HttpProfile httpProfile = new HttpProfile(); + httpProfile.setEndpoint("ses.tencentcloudapi.com"); + ClientProfile clientProfile = new ClientProfile(); + clientProfile.setHttpProfile(httpProfile); + SesClient client = new SesClient(cred, "ap-hongkong", clientProfile); + SendEmailRequest req = new SendEmailRequest(); + if (StringUtils.isEmpty(senderAddress)) { + senderAddress = SEND_ADDRESS; + } + req.setFromEmailAddress(senderAddress); + req.setDestination(new String[]{account.getUserEmail()}); + + // 根据邮件类型设置不同的主题和模板 + String subject = ""; + Template template = new Template(); + subject = "Renewal notice"; + template.setTemplateID(WILLBEEXPIRED_TEMPLATE_ID); + template.setTemplateData(buildAccountData(account)); + + req.setSubject(subject); + req.setTemplate(template); + + // 发送邮件 + SendEmailResponse resp = client.SendEmail(req); + log.info("短信发送结果res###{}", SendEmailResponse.toJsonString(resp)); + } catch (TencentCloudSDKException e) { + log.info("邮件发送失败###{}", e.toString()); + throw new BusinessException("failed.to.send.mail"); + } + } + + private static String buildAccountData(Account account) { + JSONObject jsonObject = new JSONObject(); + // 设置试用订单相关数据 + jsonObject.put("userName", account.getUserName()); + // 用户到期时间戳 + Long timestamp = account.getValidEndTime(); // 替换为你的时间戳 + + // 获取当前时间戳 + Long currentTimestamp = System.currentTimeMillis(); + + // 计算时间差(毫秒) + long timeDifference = currentTimestamp - timestamp; + + // 向上取整计算天数 + long days = (timeDifference + 24 * 60 * 60 * 1000 - 1) / (24 * 60 * 60 * 1000); + jsonObject.put("days", days); + return jsonObject.toJSONString(); + } // 构建试用订单数据 private static String buildTrialOrderData(TrialOrder trialOrder) {