package com.ruoyi.basic.task;
|
|
import com.ruoyi.basic.pojo.CustomerReturnVisit;
|
import com.ruoyi.basic.service.CustomerReturnVisitService;
|
import com.ruoyi.framework.redis.RedisCache;
|
import com.ruoyi.project.system.domain.SysUserClient;
|
import com.ruoyi.project.system.service.SysUserClientService;
|
import com.ruoyi.project.system.service.impl.UnipushService;
|
import lombok.extern.slf4j.Slf4j;
|
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.scheduling.annotation.Scheduled;
|
import org.springframework.stereotype.Component;
|
|
import java.time.LocalDateTime;
|
import java.util.Set;
|
|
/**
|
* <br>
|
* 客户回访提醒定时任务
|
* </br>
|
*
|
* @author deslrey
|
* @version 1.0
|
* @since 2026/03/05 9:04
|
*/
|
@Slf4j
|
@Component
|
public class ReturnVisitReminderTask {
|
|
private static final String REMINDER_QUEUE_KEY = "return_visit:reminder:queue";
|
|
@Autowired
|
private RedisCache redisCache;
|
|
@Autowired
|
private CustomerReturnVisitService customerReturnVisitService;
|
|
@Autowired
|
private UnipushService unipushService;
|
|
@Autowired
|
private SysUserClientService userClientService;
|
|
@SuppressWarnings("unchecked")
|
@Scheduled(fixedDelay = 60000)
|
public void processReminders() {
|
long now = System.currentTimeMillis();
|
Set<Object> dueReminders = redisCache.redisTemplate.opsForZSet().rangeByScore(REMINDER_QUEUE_KEY, 0, now);
|
if (dueReminders == null || dueReminders.isEmpty()) {
|
return;
|
}
|
|
for (Object obj : dueReminders) {
|
Long returnVisitId = Long.valueOf(obj.toString());
|
try {
|
Long removeCount = redisCache.redisTemplate.opsForZSet().remove(REMINDER_QUEUE_KEY, obj);
|
if (removeCount != null && removeCount > 0) {
|
processReminder(returnVisitId);
|
}
|
} catch (Exception e) {
|
log.error("处理回访提醒失败: ID={}", returnVisitId, e);
|
}
|
}
|
}
|
|
@SuppressWarnings("unchecked")
|
private void processReminder(Long returnVisitId) {
|
CustomerReturnVisit returnVisit = customerReturnVisitService.getById(returnVisitId);
|
if (returnVisit == null || returnVisit.getIsEnabled() == 0 || returnVisit.getIsCompleted() == 1) {
|
return;
|
}
|
SysUserClient client = userClientService.getById(returnVisit.getRemindUserId());
|
if (client == null || client.getCid() == null) {
|
log.warn("用户未绑定CID, 无法发送Unipush推送: userId={}", returnVisit.getRemindUserId());
|
return;
|
}
|
|
try {
|
unipushService.sendReturnVisitReminder(returnVisitId, client.getCid(), returnVisit.getContent(), returnVisit.getCustomerId());
|
CustomerReturnVisit updateObj = new CustomerReturnVisit();
|
updateObj.setId(returnVisitId);
|
updateObj.setIsCompleted(1);
|
customerReturnVisitService.updateById(updateObj);
|
|
log.info("回访提醒已通过 Unipush 发送: ID={}", returnVisitId);
|
} catch (Exception e) {
|
log.error("发送回访提醒失败,重新加入队列: ID={}", returnVisitId, e);
|
long retryTime = System.currentTimeMillis() + 60000;
|
redisCache.redisTemplate.opsForZSet().add(REMINDER_QUEUE_KEY, returnVisitId, retryTime);
|
}
|
}
|
}
|