TASK:续订通知;

This commit is contained in:
shahaibo
2024-01-08 13:02:50 +08:00
parent 67c137392f
commit 5bed3c180b
3 changed files with 110 additions and 0 deletions

View File

@@ -3,9 +3,11 @@ package com.ai.da;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.SpringApplication; import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.scheduling.annotation.EnableScheduling;
@Slf4j @Slf4j
@SpringBootApplication @SpringBootApplication
@EnableScheduling
public class AiDaApplication { public class AiDaApplication {
public static void main(String[] args) { public static void main(String[] args) {

View File

@@ -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<Account> qw = new QueryWrapper<>();
qw.lambda().eq(Account::getIsTrial, 0);
// qw.lambda().eq(Account::getId, 88);
List<Account> 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);
}
}
}
}

View File

@@ -1,5 +1,6 @@
package com.ai.da.common.utils; package com.ai.da.common.utils;
import com.ai.da.mapper.entity.Account;
import com.ai.da.mapper.entity.TrialOrder; import com.ai.da.mapper.entity.TrialOrder;
import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.JSONObject;
import com.ai.da.common.config.exception.BusinessException; import com.ai.da.common.config.exception.BusinessException;
@@ -178,6 +179,60 @@ public class SendEmailUtil {
throw new BusinessException("failed.to.send.mail"); 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) { private static String buildTrialOrderData(TrialOrder trialOrder) {