dev-tmp1
luotaiqian 2026-08-14 08:48:58 +08:00
parent a2c476d5c3
commit 51b6c52fe8
2 changed files with 135 additions and 6 deletions

View File

@ -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<String> execute(String param) {
@ -67,13 +67,13 @@ public class EvalProjectProcessWaringTaskJob implements Job {
}
/**
* 3~180
* 3~90
*/
private List<EvalProcessControlDO> findUnarchivedControls() {
return evalProcessControlMapper.selectList(
new LambdaQueryWrapper<EvalProcessControlDO>()
.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()));

View File

@ -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<String> execute(String param) {
param = XxlJobHelper.getJobParam();
log.info("报告超期");
// 1. 项目超期(报告超期)
List<EvalProjectDO> projectList = findOverdueProjects();
if (projectList.isEmpty()) {
log.info("报告超期=项目超期,无待检查项目");
return ReturnT.SUCCESS;
}
// 2. 查询已存在预警的 projectId
Set<Long> existingProjectIds = findExistingWarnedProjectIds(projectList);
// 3. 构建预警记录并批量保存
List<EvalProjectOrgWaringDO> toInsert = buildWarnings(projectList, existingProjectIds);
batchSave(toInsert);
log.info("报告超期=项目超期,新增{}条(共{}条)", toInsert.size(), projectList.size());
return ReturnT.SUCCESS;
}
/**
* 30
*/
private List<EvalProjectDO> findOverdueProjects() {
return evalProjectMapper.selectList(
new LambdaQueryWrapper<EvalProjectDO>()
.select(EvalProjectDO::getId, EvalProjectDO::getOrgId, EvalProjectDO::getTenantId)
.between(EvalProjectDO::getArchiveDate,
LocalDateTime.now().minusDays(30),
LocalDateTime.now())
.eq(EvalProjectDO::getArchiveFlag, 0));
}
/**
* projectId
*/
private Set<Long> findExistingWarnedProjectIds(List<EvalProjectDO> projectList) {
List<Long> projectIds = projectList.stream()
.map(EvalProjectDO::getId)
.collect(Collectors.toList());
return evalProjectOrgWaringMapper.selectList(
new LambdaQueryWrapper<EvalProjectOrgWaringDO>()
.select(EvalProjectOrgWaringDO::getProjectId)
.in(EvalProjectOrgWaringDO::getProjectId, projectIds)
.eq(EvalProjectOrgWaringDO::getWarningType,
OrgProjectWarningTypeEnum.REPORT_OVERDUE.getCode()))
.stream()
.map(EvalProjectOrgWaringDO::getProjectId)
.collect(Collectors.toSet());
}
/**
*
*/
private List<EvalProjectOrgWaringDO> buildWarnings(List<EvalProjectDO> projectList,
Set<Long> existingProjectIds) {
List<EvalProjectOrgWaringDO> 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<EvalProjectOrgWaringDO> toInsert) {
for (int i = 0; i < toInsert.size(); i += 100) {
Db.saveBatch(toInsert.subList(i, Math.min(i + 100, toInsert.size())), 100);
}
}
}