From 51b6c52fe81d3cf7fb7039a59a3fd252b7b793d2 Mon Sep 17 00:00:00 2001 From: luotaiqian <1147642922@qq.com> Date: Fri, 14 Aug 2026 08:48:58 +0800 Subject: [PATCH] job --- ...valProjectProcessWaringNotAchivedJob.java} | 12 +- ...lProjectProcessWaringReportOverdueJob.java | 129 ++++++++++++++++++ 2 files changed, 135 insertions(+), 6 deletions(-) rename safety-eval-adapter/src/main/java/org/qinan/safetyeval/adapter/job/{EvalProjectProcessWaringTaskJob.java => EvalProjectProcessWaringNotAchivedJob.java} (93%) create mode 100644 safety-eval-adapter/src/main/java/org/qinan/safetyeval/adapter/job/EvalProjectProcessWaringReportOverdueJob.java diff --git a/safety-eval-adapter/src/main/java/org/qinan/safetyeval/adapter/job/EvalProjectProcessWaringTaskJob.java b/safety-eval-adapter/src/main/java/org/qinan/safetyeval/adapter/job/EvalProjectProcessWaringNotAchivedJob.java similarity index 93% rename from safety-eval-adapter/src/main/java/org/qinan/safetyeval/adapter/job/EvalProjectProcessWaringTaskJob.java rename to safety-eval-adapter/src/main/java/org/qinan/safetyeval/adapter/job/EvalProjectProcessWaringNotAchivedJob.java index d91171f2..2543a033 100644 --- a/safety-eval-adapter/src/main/java/org/qinan/safetyeval/adapter/job/EvalProjectProcessWaringTaskJob.java +++ b/safety-eval-adapter/src/main/java/org/qinan/safetyeval/adapter/job/EvalProjectProcessWaringNotAchivedJob.java @@ -25,7 +25,7 @@ import java.util.Set; import java.util.stream.Collectors; /** - * 机构项目过程控制风险预警定时任务 + * 过程控制签字完成,超过3天未归档 * * @author ltq * @since 2026/08/13 @@ -33,15 +33,15 @@ import java.util.stream.Collectors; @Component @Slf4j @RequiredArgsConstructor -public class EvalProjectProcessWaringTaskJob implements Job { +public class EvalProjectProcessWaringNotAchivedJob implements Job { private final EvalProcessControlMapper evalProcessControlMapper; private final EvalProjectOrgWaringMapper evalProjectOrgWaringMapper; @Override @XxlJob("org.qinan.safetyeval.adapter.job.EvalProjectProcessWaringTaskJob") - @JobRegister(cron = "0/1 * * * * ?", - jobDesc = "机构项目风险预警", + @JobRegister(cron = "0 0 2 * * ?", + jobDesc = "过程控制签字完成,超过3天未归档", author = "ltq", triggerStatus = 1) public ReturnT execute(String param) { @@ -67,13 +67,13 @@ public class EvalProjectProcessWaringTaskJob implements Job { } /** - * 查询签字完成未归档的项目(签字时间在3~180天前) + * 查询签字完成未归档的项目(签字时间在3~90天前) */ private List findUnarchivedControls() { return evalProcessControlMapper.selectList( new LambdaQueryWrapper() .between(EvalProcessControlDO::getControlTime, - LocalDateTime.now().minusDays(180), + LocalDateTime.now().minusDays(90), LocalDateTime.now().minusDays(3)) .eq(EvalProcessControlDO::getArchiveFlag, 0) .eq(EvalProcessControlDO::getDeleteEnum, BooleanQAEnum.FALSE.getValue())); diff --git a/safety-eval-adapter/src/main/java/org/qinan/safetyeval/adapter/job/EvalProjectProcessWaringReportOverdueJob.java b/safety-eval-adapter/src/main/java/org/qinan/safetyeval/adapter/job/EvalProjectProcessWaringReportOverdueJob.java new file mode 100644 index 00000000..b4e2dd74 --- /dev/null +++ b/safety-eval-adapter/src/main/java/org/qinan/safetyeval/adapter/job/EvalProjectProcessWaringReportOverdueJob.java @@ -0,0 +1,129 @@ +package org.qinan.safetyeval.adapter.job; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.toolkit.Db; +import com.jjb.saas.framework.job.Job; +import com.jjb.saas.framework.job.annotation.JobRegister; +import com.xxl.job.core.biz.model.ReturnT; +import com.xxl.job.core.context.XxlJobHelper; +import com.xxl.job.core.handler.annotation.XxlJob; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.qinan.safetyeval.domain.constant.OrgProjectWarningTypeEnum; +import org.qinan.safetyeval.infrastructure.dataobject.EvalProjectDO; +import org.qinan.safetyeval.infrastructure.mapper.EvalProjectMapper; +import org.qinan.safetyeval.infrastructure.persistence.domainobject.EvalProjectOrgWaringDO; +import org.qinan.safetyeval.infrastructure.persistence.mapper.EvalProjectOrgWaringMapper; +import org.qinan.safetyeval.infrastructure.support.InsertFieldDefaults; +import org.springframework.stereotype.Component; + +import java.time.LocalDateTime; +import java.util.ArrayList; +import java.util.List; +import java.util.Set; +import java.util.stream.Collectors; + +/** + * 报告超期->项目超期 + * + * @author ltq + * @since 2026/08/13 + */ +@Component +@Slf4j +@RequiredArgsConstructor +public class EvalProjectProcessWaringReportOverdueJob implements Job { + + private final EvalProjectMapper evalProjectMapper; + private final EvalProjectOrgWaringMapper evalProjectOrgWaringMapper; + + @Override + @XxlJob("org.qinan.safetyeval.adapter.job.EvalProjectProcessWaringTaskJob") + @JobRegister(cron = "0 10 2 * * ?", + jobDesc = "报告超期=项目超期", + author = "ltq", + triggerStatus = 1) + public ReturnT execute(String param) { + param = XxlJobHelper.getJobParam(); + log.info("报告超期"); + + // 1. 项目超期(报告超期) + List projectList = findOverdueProjects(); + if (projectList.isEmpty()) { + log.info("报告超期=项目超期,无待检查项目"); + return ReturnT.SUCCESS; + } + + // 2. 查询已存在预警的 projectId + Set existingProjectIds = findExistingWarnedProjectIds(projectList); + + // 3. 构建预警记录并批量保存 + List toInsert = buildWarnings(projectList, existingProjectIds); + batchSave(toInsert); + + log.info("报告超期=项目超期,新增{}条(共{}条)", toInsert.size(), projectList.size()); + return ReturnT.SUCCESS; + } + + /** + * 项目超期(项目超期30天内) + */ + private List findOverdueProjects() { + return evalProjectMapper.selectList( + new LambdaQueryWrapper() + .select(EvalProjectDO::getId, EvalProjectDO::getOrgId, EvalProjectDO::getTenantId) + .between(EvalProjectDO::getArchiveDate, + LocalDateTime.now().minusDays(30), + LocalDateTime.now()) + .eq(EvalProjectDO::getArchiveFlag, 0)); + } + + /** + * 查询已存在未归档预警的 projectId 集合 + */ + private Set findExistingWarnedProjectIds(List projectList) { + List projectIds = projectList.stream() + .map(EvalProjectDO::getId) + .collect(Collectors.toList()); + return evalProjectOrgWaringMapper.selectList( + new LambdaQueryWrapper() + .select(EvalProjectOrgWaringDO::getProjectId) + .in(EvalProjectOrgWaringDO::getProjectId, projectIds) + .eq(EvalProjectOrgWaringDO::getWarningType, + OrgProjectWarningTypeEnum.REPORT_OVERDUE.getCode())) + .stream() + .map(EvalProjectOrgWaringDO::getProjectId) + .collect(Collectors.toSet()); + } + + /** + * 过滤未预警的项目,构建预警记录 + */ + private List buildWarnings(List projectList, + Set existingProjectIds) { + List toInsert = new ArrayList<>(); + for (EvalProjectDO project : projectList) { + if (existingProjectIds.contains(project.getId())) { + continue; + } + EvalProjectOrgWaringDO waring = new EvalProjectOrgWaringDO(); + waring.setProjectId(project.getId()); + waring.setOrgId(project.getOrgId()); + waring.setTenantId(project.getTenantId()); + waring.setWarningType(OrgProjectWarningTypeEnum.REPORT_OVERDUE.getCode()); + waring.setTriggerCondition(OrgProjectWarningTypeEnum.REPORT_OVERDUE.getValue()); + InsertFieldDefaults.applyIgnoreOrgId(waring); + toInsert.add(waring); + } + return toInsert; + } + + /** + * 分批保存,每批100条 + */ + private void batchSave(List toInsert) { + for (int i = 0; i < toInsert.size(); i += 100) { + Db.saveBatch(toInsert.subList(i, Math.min(i + 100, toInsert.size())), 100); + } + } +}