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; /** *
* 客户回访提醒定时任务 *
* * @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 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); } } }