hsy
2026-08-28 a8e4132c3e2e9c3b3fcb0360901b35571b6464ea
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
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<SalesLedger> ledgers = salesLedgerService.list(Wrappers.<SalesLedger>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());
        }
    }
}