|
@@ -1,6 +1,5 @@
|
|
package com.fs.app.task;
|
|
package com.fs.app.task;
|
|
|
|
|
|
-
|
|
|
|
import com.fs.app.taskService.QwExternalContactRatingService;
|
|
import com.fs.app.taskService.QwExternalContactRatingService;
|
|
import com.fs.app.taskService.SopLogsChatTaskService;
|
|
import com.fs.app.taskService.SopLogsChatTaskService;
|
|
import com.fs.app.taskService.SopLogsTaskService;
|
|
import com.fs.app.taskService.SopLogsTaskService;
|
|
@@ -26,6 +25,13 @@ import java.time.LocalDateTime;
|
|
import java.time.format.DateTimeFormatter;
|
|
import java.time.format.DateTimeFormatter;
|
|
import java.util.List;
|
|
import java.util.List;
|
|
|
|
|
|
|
|
+/**
|
|
|
|
+ * 企业微信SOP定时任务管理类
|
|
|
|
+ * 负责处理各种定时任务,包括SOP规则检查、消息发送、数据清理等
|
|
|
|
+ *
|
|
|
|
+ * @author 系统
|
|
|
|
+ * @version 1.0
|
|
|
|
+ */
|
|
@Component
|
|
@Component
|
|
@Slf4j
|
|
@Slf4j
|
|
public class qwTask {
|
|
public class qwTask {
|
|
@@ -44,9 +50,10 @@ public class qwTask {
|
|
|
|
|
|
@Autowired
|
|
@Autowired
|
|
private ISopUserLogsService sopUserLogsService;
|
|
private ISopUserLogsService sopUserLogsService;
|
|
-
|
|
|
|
|
|
+
|
|
@Autowired
|
|
@Autowired
|
|
private SopLogsTaskService sopLogsTaskService;
|
|
private SopLogsTaskService sopLogsTaskService;
|
|
|
|
+
|
|
@Autowired
|
|
@Autowired
|
|
private SopWxLogsService sopWxLogsService;
|
|
private SopWxLogsService sopWxLogsService;
|
|
|
|
|
|
@@ -64,143 +71,149 @@ public class qwTask {
|
|
|
|
|
|
@Autowired
|
|
@Autowired
|
|
private QwSopLogsMapper qwSopLogsMapper;
|
|
private QwSopLogsMapper qwSopLogsMapper;
|
|
|
|
+
|
|
@Autowired
|
|
@Autowired
|
|
private IQwSopTagService qwSopTagService;
|
|
private IQwSopTagService qwSopTagService;
|
|
- /**
|
|
|
|
- * 定时任务 将 qw_sop任务 符合条件的录入到sop_user_Logs(clickHouse)
|
|
|
|
- */
|
|
|
|
|
|
|
|
|
|
+ /**
|
|
|
|
+ * 定时任务:检查SOP规则时间
|
|
|
|
+ * 执行时间:每天凌晨 1:10:00
|
|
|
|
+ * 功能:将符合条件的qw_sop任务录入到sop_user_Logs(clickHouse)
|
|
|
|
+ */
|
|
@Scheduled(cron = "0 10 1 * * ?")
|
|
@Scheduled(cron = "0 10 1 * * ?")
|
|
- public void qwCheckSopRuleTime()
|
|
|
|
- {
|
|
|
|
|
|
+ public void qwCheckSopRuleTime() {
|
|
qwSopService.checkSopRuleTime();
|
|
qwSopService.checkSopRuleTime();
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ /**
|
|
|
|
+ * 定时任务:添加标签
|
|
|
|
+ * 执行时间:每20分钟执行一次
|
|
|
|
+ * 功能:自动为符合条件的记录添加标签
|
|
|
|
+ */
|
|
@Scheduled(cron = "0 0/20 * * * ?")
|
|
@Scheduled(cron = "0 0/20 * * * ?")
|
|
- public void addTag(){
|
|
|
|
|
|
+ public void addTag() {
|
|
qwSopTagService.addTag();
|
|
qwSopTagService.addTag();
|
|
}
|
|
}
|
|
|
|
+
|
|
/**
|
|
/**
|
|
- * 根据营期生成sopLogs待发记录
|
|
|
|
- * @throws Exception
|
|
|
|
|
|
+ * 定时任务:根据营期生成sopLogs待发记录
|
|
|
|
+ * 执行时间:每小时的第5分钟执行
|
|
|
|
+ * 功能:根据营期时间生成需要发送的SOP日志记录
|
|
|
|
+ *
|
|
|
|
+ * @throws Exception 执行异常
|
|
*/
|
|
*/
|
|
@Scheduled(cron = "0 5 * * * ?") // 每小时的第5分钟触发
|
|
@Scheduled(cron = "0 5 * * * ?") // 每小时的第5分钟触发
|
|
@Async
|
|
@Async
|
|
public void selectSopUserLogsListByTime() throws Exception {
|
|
public void selectSopUserLogsListByTime() throws Exception {
|
|
- // 获取当前时间
|
|
|
|
|
|
+ // 获取当前时间,精确到小时
|
|
LocalDateTime currentTime = LocalDateTime.now().withMinute(0).withSecond(0).withNano(0);
|
|
LocalDateTime currentTime = LocalDateTime.now().withMinute(0).withSecond(0).withNano(0);
|
|
- // 打印日志,确认时间
|
|
|
|
|
|
+ // 打印日志,确认任务执行时间
|
|
log.info("任务实际执行时间: {}", currentTime);
|
|
log.info("任务实际执行时间: {}", currentTime);
|
|
|
|
|
|
- // 调用服务方法
|
|
|
|
|
|
+ // 调用服务方法处理SOP用户日志
|
|
sopLogsTaskService.selectSopUserLogsListByTime(currentTime);
|
|
sopLogsTaskService.selectSopUserLogsListByTime(currentTime);
|
|
}
|
|
}
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * 定时任务:微信SOP处理
|
|
|
|
+ * 执行时间:每小时的第5分钟执行
|
|
|
|
+ * 功能:处理微信相关的SOP日志
|
|
|
|
+ *
|
|
|
|
+ * @throws Exception 执行异常
|
|
|
|
+ */
|
|
@Scheduled(cron = "0 5 * * * ?") // 每小时的第5分钟触发
|
|
@Scheduled(cron = "0 5 * * * ?") // 每小时的第5分钟触发
|
|
public void wxSop() throws Exception {
|
|
public void wxSop() throws Exception {
|
|
- // 获取当前时间
|
|
|
|
|
|
+ // 获取当前时间,精确到小时
|
|
LocalDateTime currentTime = LocalDateTime.now().withMinute(0).withSecond(0).withNano(0);
|
|
LocalDateTime currentTime = LocalDateTime.now().withMinute(0).withSecond(0).withNano(0);
|
|
- // 打印日志,确认时间
|
|
|
|
|
|
+ // 打印日志,确认任务执行时间
|
|
log.info("任务实际执行时间: {}", currentTime);
|
|
log.info("任务实际执行时间: {}", currentTime);
|
|
|
|
|
|
- // 调用服务方法
|
|
|
|
|
|
+ // 调用服务方法处理微信SOP日志
|
|
sopWxLogsService.wxSopLogsByTime(currentTime);
|
|
sopWxLogsService.wxSopLogsByTime(currentTime);
|
|
}
|
|
}
|
|
|
|
|
|
/**
|
|
/**
|
|
- * 定时任务 将 clickHouse的sopUserLogsChat(营期表)按每1分钟的巡回
|
|
|
|
|
|
+ * 定时任务:处理聊天SOP用户日志
|
|
|
|
+ * 执行时间:已注释,原为每分钟的第5秒执行
|
|
|
|
+ * 功能:将clickHouse的sopUserLogsChat(营期表)按每分钟巡回处理
|
|
|
|
+ *
|
|
|
|
+ * @throws Exception 执行异常
|
|
*/
|
|
*/
|
|
// @Scheduled(cron = "5 0/1 * * * ?")
|
|
// @Scheduled(cron = "5 0/1 * * * ?")
|
|
public void selectChatSopUserLogsListByTime() throws Exception {
|
|
public void selectChatSopUserLogsListByTime() throws Exception {
|
|
-
|
|
|
|
|
|
+ // 获取当前时间,精确到分钟
|
|
LocalDateTime today = LocalDateTime.now().withSecond(0).withNano(0);
|
|
LocalDateTime today = LocalDateTime.now().withSecond(0).withNano(0);
|
|
|
|
|
|
|
|
+ // 创建AI聊天SOP日志
|
|
sopLogsTaskChatService.createAiChatSopLogs(today);
|
|
sopLogsTaskChatService.createAiChatSopLogs(today);
|
|
}
|
|
}
|
|
|
|
|
|
-// /**
|
|
|
|
-// * 定时 发送 通过调用 企业微信接口 发送的 SOP 群发消息
|
|
|
|
-// */
|
|
|
|
-// @Scheduled(cron = "0 15 0 * * ?")
|
|
|
|
-// public void SendQwApiSopLogTimer(){
|
|
|
|
-// log.info("zyp \n【企微官方接口群发开始】");
|
|
|
|
-//// qwSopLogsService.checkQwSopLogs();
|
|
|
|
-// LocalDate localDate = LocalDateTime.now().withMinute(0).withSecond(0).withNano(0).toLocalDate();
|
|
|
|
-// String date = localDate.format(DateTimeFormatter.ofPattern("yyyy-MM-dd"));
|
|
|
|
-//
|
|
|
|
-// qwSopLogsService.createCorpMassSending(date);
|
|
|
|
-// }
|
|
|
|
-//
|
|
|
|
-// /**
|
|
|
|
-// * 定时获取 通过调用 企业微信接口 发送的 SOP 客户群发消息 的反馈结果
|
|
|
|
-// */
|
|
|
|
-// @Scheduled(cron = "0 0 8 * * ?")
|
|
|
|
-// public void GetQwApiSopLogResultTimer(){
|
|
|
|
-// qwSopLogsService.qwSopLogsResult();
|
|
|
|
-// }
|
|
|
|
-
|
|
|
|
/**
|
|
/**
|
|
- * 定时 发送 通过调用 企业微信接口 发送的 SOP 群发消息(新版-安装营期发)
|
|
|
|
|
|
+ * 定时任务:发送企业微信SOP群发消息(新版-按营期发送)
|
|
|
|
+ * 执行时间:每天凌晨 0:20:00
|
|
|
|
+ * 功能:通过调用企业微信接口发送SOP群发消息
|
|
*/
|
|
*/
|
|
@Scheduled(cron = "0 20 0 * * ?")
|
|
@Scheduled(cron = "0 20 0 * * ?")
|
|
- public void SendQwApiSopLogTimerNew(){
|
|
|
|
-
|
|
|
|
|
|
+ public void SendQwApiSopLogTimerNew() {
|
|
log.info("zyp \n【企微官方接口群发开始】");
|
|
log.info("zyp \n【企微官方接口群发开始】");
|
|
-// qwSopLogsService.checkQwSopLogs();
|
|
|
|
|
|
+
|
|
|
|
+ // 获取当前日期
|
|
LocalDate localDate = LocalDateTime.now().withMinute(0).withSecond(0).withNano(0).toLocalDate();
|
|
LocalDate localDate = LocalDateTime.now().withMinute(0).withSecond(0).withNano(0).toLocalDate();
|
|
String date = localDate.format(DateTimeFormatter.ofPattern("yyyy-MM-dd"));
|
|
String date = localDate.format(DateTimeFormatter.ofPattern("yyyy-MM-dd"));
|
|
|
|
|
|
|
|
+ // 根据用户日志创建企业群发
|
|
qwSopLogsService.createCorpMassSendingByUserLogs(date);
|
|
qwSopLogsService.createCorpMassSendingByUserLogs(date);
|
|
}
|
|
}
|
|
|
|
|
|
-
|
|
|
|
/**
|
|
/**
|
|
- * 定时获取 通过调用 企业微信接口 发送的 SOP 客户群发消息 的反馈结果(新版-安装营期发)
|
|
|
|
|
|
+ * 定时任务:获取企业微信SOP群发消息反馈结果(新版-按营期发送)
|
|
|
|
+ * 执行时间:每天上午 8:00:00
|
|
|
|
+ * 功能:获取通过企业微信接口发送的SOP客户群发消息的反馈结果
|
|
*/
|
|
*/
|
|
@Scheduled(cron = "0 0 8 * * ?")
|
|
@Scheduled(cron = "0 0 8 * * ?")
|
|
- public void GetQwApiSopLogResultTimerNew(){
|
|
|
|
|
|
+ public void GetQwApiSopLogResultTimerNew() {
|
|
qwSopLogsService.qwSopLogsResultNew();
|
|
qwSopLogsService.qwSopLogsResultNew();
|
|
}
|
|
}
|
|
|
|
|
|
/**
|
|
/**
|
|
- * 定时群发API接口的 客户/群 群发
|
|
|
|
- */
|
|
|
|
|
|
+ * 定时任务:群发API接口的客户/群群发
|
|
|
|
+ * 执行时间:每10分钟执行一次
|
|
|
|
+ * 功能:定时处理群发消息任务
|
|
|
|
+ */
|
|
@Scheduled(cron = "0 0/10 * * * ?")
|
|
@Scheduled(cron = "0 0/10 * * * ?")
|
|
- public void sendQwGroupMsgTask(){
|
|
|
|
|
|
+ public void sendQwGroupMsgTask() {
|
|
qwGroupMsgService.qwGroupMsgTask();
|
|
qwGroupMsgService.qwGroupMsgTask();
|
|
}
|
|
}
|
|
|
|
+
|
|
/**
|
|
/**
|
|
- * 定时发送转换消息
|
|
|
|
- */
|
|
|
|
|
|
+ * 定时任务:发送转换消息
|
|
|
|
+ * 执行时间:每天上午 8:00:00
|
|
|
|
+ * 功能:根据SOP规则发送转换消息
|
|
|
|
+ */
|
|
@Scheduled(cron = "0 0 8 * * ?")
|
|
@Scheduled(cron = "0 0 8 * * ?")
|
|
-// @Scheduled(cron = "0/10 * * * * ?")
|
|
|
|
- public void sendQwBySop(){
|
|
|
|
|
|
+// @Scheduled(cron = "0/10 * * * * ?") // 测试用:每10秒执行一次
|
|
|
|
+ public void sendQwBySop() {
|
|
sopUserLogsService.sendQwBySop();
|
|
sopUserLogsService.sendQwBySop();
|
|
}
|
|
}
|
|
|
|
|
|
-
|
|
|
|
/**
|
|
/**
|
|
- * 企业微信自动打标签/备注 没打上的 补偿机制
|
|
|
|
- */
|
|
|
|
|
|
+ * 定时任务:企业微信自动打标签/备注补偿机制
|
|
|
|
+ * 执行时间:每3分钟执行一次
|
|
|
|
+ * 功能:对没有成功打标签或备注的记录进行补偿处理
|
|
|
|
+ */
|
|
@Scheduled(cron = "0 0/3 * * * ?")
|
|
@Scheduled(cron = "0 0/3 * * * ?")
|
|
- public void qwExternalErrRetryTimer(){
|
|
|
|
|
|
+ public void qwExternalErrRetryTimer() {
|
|
log.info("补偿机制开始");
|
|
log.info("补偿机制开始");
|
|
errRetryService.qwExternalErrRetryTimer();
|
|
errRetryService.qwExternalErrRetryTimer();
|
|
}
|
|
}
|
|
|
|
|
|
-
|
|
|
|
/**
|
|
/**
|
|
- * 同步完企微客户,然后对加微的数据信息筛选并上传给百度进行投流优化
|
|
|
|
- */
|
|
|
|
-// @Scheduled(cron = "0 0 6 * * ?")
|
|
|
|
-// public void bdUpload(){
|
|
|
|
-// qwWorkUserService.uploadBd();
|
|
|
|
-// }
|
|
|
|
-
|
|
|
|
- /**
|
|
|
|
- * 补发过期完课消息
|
|
|
|
|
|
+ * 定时任务:补发过期完课消息
|
|
|
|
+ * 执行时间:每小时的第0分钟执行
|
|
|
|
+ * 功能:补发已过期但未发送的完课消息
|
|
*/
|
|
*/
|
|
@Scheduled(cron = "0 0 * * * ?") // 每小时的第0分钟0秒执行
|
|
@Scheduled(cron = "0 0 * * * ?") // 每小时的第0分钟0秒执行
|
|
- public void updateQwSopLogsByCancel(){
|
|
|
|
|
|
+ public void updateQwSopLogsByCancel() {
|
|
log.info("补发过期完课消息 - 定时任务开始");
|
|
log.info("补发过期完课消息 - 定时任务开始");
|
|
try {
|
|
try {
|
|
sopLogsTaskService.updateSopLogsByCancel();
|
|
sopLogsTaskService.updateSopLogsByCancel();
|
|
@@ -211,16 +224,18 @@ public class qwTask {
|
|
}
|
|
}
|
|
|
|
|
|
/**
|
|
/**
|
|
- * 批量处理sop待发送记录中已过期得消息每8分钟执行一次
|
|
|
|
- */
|
|
|
|
|
|
+ * 定时任务:批量处理SOP待发送记录中已过期的消息
|
|
|
|
+ * 执行时间:每8分钟执行一次
|
|
|
|
+ * 功能:批量更新已过期的SOP待发送记录
|
|
|
|
+ */
|
|
@Scheduled(cron = "0 0/8 * * * ?")
|
|
@Scheduled(cron = "0 0/8 * * * ?")
|
|
- public void batchProcessingExpiredMessages(){
|
|
|
|
-
|
|
|
|
|
|
+ public void batchProcessingExpiredMessages() {
|
|
log.info("批量处理sop待发送记录中已过期的消息");
|
|
log.info("批量处理sop待发送记录中已过期的消息");
|
|
try {
|
|
try {
|
|
- // Step 1: 批量更新已过期的记录
|
|
|
|
|
|
+ // 步骤1:批量获取已过期的记录
|
|
List<QwSopLogsDoSendListTVO> expireded = iQwSopLogsService.expiredMessagesByQwSopLogs();
|
|
List<QwSopLogsDoSendListTVO> expireded = iQwSopLogsService.expiredMessagesByQwSopLogs();
|
|
if (!expireded.isEmpty()) {
|
|
if (!expireded.isEmpty()) {
|
|
|
|
+ // 步骤2:批量处理并插入记录
|
|
processAndInsertQwSopLogs(expireded);
|
|
processAndInsertQwSopLogs(expireded);
|
|
}
|
|
}
|
|
log.info("处理已过期 - 定时任务成功完成");
|
|
log.info("处理已过期 - 定时任务成功完成");
|
|
@@ -229,19 +244,23 @@ public class qwTask {
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
-
|
|
|
|
- // 定义一个方法来批量处理插入逻辑,支持每 500 条数据一次的批量插入
|
|
|
|
|
|
+ /**
|
|
|
|
+ * 批量处理插入逻辑,支持每500条数据一次的批量插入
|
|
|
|
+ *
|
|
|
|
+ * @param logsByJsApiNotExtId 需要处理的日志列表
|
|
|
|
+ */
|
|
private void processAndInsertQwSopLogs(List<QwSopLogsDoSendListTVO> logsByJsApiNotExtId) {
|
|
private void processAndInsertQwSopLogs(List<QwSopLogsDoSendListTVO> logsByJsApiNotExtId) {
|
|
// 定义批量插入的大小
|
|
// 定义批量插入的大小
|
|
int batchSize = 500;
|
|
int batchSize = 500;
|
|
|
|
|
|
- // 循环处理外部用户 ID,每次处理批量大小的子集
|
|
|
|
|
|
+ // 循环处理外部用户ID,每次处理批量大小的子集
|
|
for (int i = 0; i < logsByJsApiNotExtId.size(); i += batchSize) {
|
|
for (int i = 0; i < logsByJsApiNotExtId.size(); i += batchSize) {
|
|
-
|
|
|
|
|
|
+ // 计算当前批次的结束索引
|
|
int endIndex = Math.min(i + batchSize, logsByJsApiNotExtId.size());
|
|
int endIndex = Math.min(i + batchSize, logsByJsApiNotExtId.size());
|
|
- List<QwSopLogsDoSendListTVO> batchList = logsByJsApiNotExtId.subList(i, endIndex); // 获取当前批次的子集
|
|
|
|
|
|
+ // 获取当前批次的子集
|
|
|
|
+ List<QwSopLogsDoSendListTVO> batchList = logsByJsApiNotExtId.subList(i, endIndex);
|
|
|
|
|
|
- // 直接使用批次数据进行批量更新,不需要额外的 List
|
|
|
|
|
|
+ // 直接使用批次数据进行批量更新
|
|
try {
|
|
try {
|
|
qwSopLogsMapper.batchUpdateQwSopLogsBySendTime(batchList);
|
|
qwSopLogsMapper.batchUpdateQwSopLogsBySendTime(batchList);
|
|
} catch (Exception e) {
|
|
} catch (Exception e) {
|
|
@@ -252,35 +271,42 @@ public class qwTask {
|
|
}
|
|
}
|
|
|
|
|
|
/**
|
|
/**
|
|
- * 定时清除 2天以前的sop任务记录 每天删除
|
|
|
|
- */
|
|
|
|
|
|
+ * 定时任务:清除2天以前的SOP任务记录
|
|
|
|
+ * 执行时间:每天凌晨 0:10:00
|
|
|
|
+ * 功能:清理历史数据,保持数据库性能
|
|
|
|
+ */
|
|
@Scheduled(cron = "0 10 0 * * ?")
|
|
@Scheduled(cron = "0 10 0 * * ?")
|
|
public void deleteQwSopLogsByDate() {
|
|
public void deleteQwSopLogsByDate() {
|
|
-
|
|
|
|
qwSopLogsMapper.deleteQwSopLogsByDate();
|
|
qwSopLogsMapper.deleteQwSopLogsByDate();
|
|
-
|
|
|
|
}
|
|
}
|
|
|
|
|
|
/**
|
|
/**
|
|
- * 定时处理 营期异常的数据 每3小时
|
|
|
|
- */
|
|
|
|
-
|
|
|
|
|
|
+ * 定时任务:处理营期异常的数据
|
|
|
|
+ * 执行时间:每3小时的第30分钟执行
|
|
|
|
+ * 功能:修复营期相关的异常数据
|
|
|
|
+ */
|
|
@Scheduled(cron = "0 30 0/3 * * ? ")
|
|
@Scheduled(cron = "0 30 0/3 * * ? ")
|
|
public void processRepairQwSopLogsTimer() {
|
|
public void processRepairQwSopLogsTimer() {
|
|
sopUserLogsService.repairSopUserLogsTimer();
|
|
sopUserLogsService.repairSopUserLogsTimer();
|
|
}
|
|
}
|
|
|
|
|
|
/**
|
|
/**
|
|
- * 凌晨3点30开始 客户评级
|
|
|
|
- */
|
|
|
|
|
|
+ * 定时任务:客户评级处理
|
|
|
|
+ * 执行时间:每天凌晨 3:45:00
|
|
|
|
+ * 功能:对SOP营期用户进行分级评级
|
|
|
|
+ * 备注:异步执行,避免阻塞其他任务
|
|
|
|
+ */
|
|
@Scheduled(cron = "0 45 3 * * ?")
|
|
@Scheduled(cron = "0 45 3 * * ?")
|
|
@Async
|
|
@Async
|
|
public void processQwSopExternalContactRatingTimer() {
|
|
public void processQwSopExternalContactRatingTimer() {
|
|
|
|
+ // 记录任务开始时间
|
|
long startTimeMillis = System.currentTimeMillis();
|
|
long startTimeMillis = System.currentTimeMillis();
|
|
log.info("====== 开始选择和处理 sop营期-用户分级 ======");
|
|
log.info("====== 开始选择和处理 sop营期-用户分级 ======");
|
|
|
|
|
|
|
|
+ // 执行用户分级评级
|
|
qwExternalContactRatingService.ratingUserLogs();
|
|
qwExternalContactRatingService.ratingUserLogs();
|
|
|
|
|
|
|
|
+ // 计算并记录任务执行耗时
|
|
long endTimeMillis = System.currentTimeMillis();
|
|
long endTimeMillis = System.currentTimeMillis();
|
|
log.info("====== sop营期-用户分级处理完成,耗时 {} 毫秒 ======", (endTimeMillis - startTimeMillis));
|
|
log.info("====== sop营期-用户分级处理完成,耗时 {} 毫秒 ======", (endTimeMillis - startTimeMillis));
|
|
}
|
|
}
|