package com.ruoyi.sales.task; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.ruoyi.project.system.domain.SysNotice; import com.ruoyi.project.system.service.ISysNoticeService; import com.ruoyi.projectManagement.vo.InfoVo; import com.ruoyi.projectManagement.pojo.ProjectConfig; import com.ruoyi.projectManagement.service.InfoService; import com.ruoyi.projectManagement.service.ProjectConfigService; import com.ruoyi.sales.pojo.SalesLedger; import com.ruoyi.sales.service.ISalesLedgerService; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Component; import java.time.LocalDate; import java.util.List; import java.util.stream.Collectors; /** * 销售台账-合同原件约定回传日期预警任务 */ @Slf4j @Component @RequiredArgsConstructor public class ContractReturnReminderTask { private final ProjectConfigService projectConfigService; private final ISalesLedgerService salesLedgerService; private final InfoService infoService; private final ISysNoticeService sysNoticeService; // 每天上午 8 点执行 @Scheduled(cron = "0 0 8 * * ?") public void processReminders() { log.info("开始执行:合同原件回传预警扫描"); ProjectConfig config = projectConfigService.getGlobalConfig(); Integer reminderDays = config.getContractReturnReminderDays(); if (reminderDays == null) { reminderDays = 3; } LocalDate targetDate = LocalDate.now().plusDays(reminderDays); // 查询符合条件的销售台账 List ledgers = salesLedgerService.list(Wrappers.lambdaQuery() .eq(SalesLedger::getContractOriginalReturnDate, targetDate)); if (ledgers == null || ledgers.isEmpty()) { log.info("今日无需要预警的合同回传记录"); return; } log.info("发现 {} 条预警记录", ledgers.size()); for (SalesLedger ledger : ledgers) { if (ledger.getProjectId() == null) { continue; } InfoVo projectInfo = infoService.getInfoById(ledger.getProjectId()); if (projectInfo != null && projectInfo.getInfo() != null && projectInfo.getInfo().getManagerId() != null) { sendNotice(ledger, projectInfo); } } log.info("合同原件回传预警扫描结束"); } private void sendNotice(SalesLedger ledger, InfoVo projectInfo) { SysNotice notice = new SysNotice(); notice.setNoticeTitle("合同原件回传预警"); notice.setNoticeType("1"); // 1为通知 String content = String.format("项目【%s】关联的销售台账(%s)的合同原件约定回传日期(%s)即将到期,请及时处理!", projectInfo.getInfo().getTitle(), ledger.getSalesContractNo(), ledger.getContractOriginalReturnDate().toString()); notice.setNoticeContent(content); notice.setStatus("0"); // 正常 notice.setConsigneeId(projectInfo.getInfo().getManagerId()); // 可以设置 senderId 为系统管理员 (例如 1L) notice.setSenderId(1L); try { sysNoticeService.save(notice); } catch (Exception e) { log.error("发送预警通知失败: salesLedgerId={}, error={}", ledger.getId(), e.getMessage()); } } }