job
parent
a2c476d5c3
commit
51b6c52fe8
|
|
@ -25,7 +25,7 @@ import java.util.Set;
|
||||||
import java.util.stream.Collectors;
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 机构项目过程控制风险预警定时任务
|
* 过程控制签字完成,超过3天未归档
|
||||||
*
|
*
|
||||||
* @author ltq
|
* @author ltq
|
||||||
* @since 2026/08/13
|
* @since 2026/08/13
|
||||||
|
|
@ -33,15 +33,15 @@ import java.util.stream.Collectors;
|
||||||
@Component
|
@Component
|
||||||
@Slf4j
|
@Slf4j
|
||||||
@RequiredArgsConstructor
|
@RequiredArgsConstructor
|
||||||
public class EvalProjectProcessWaringTaskJob implements Job {
|
public class EvalProjectProcessWaringNotAchivedJob implements Job {
|
||||||
|
|
||||||
private final EvalProcessControlMapper evalProcessControlMapper;
|
private final EvalProcessControlMapper evalProcessControlMapper;
|
||||||
private final EvalProjectOrgWaringMapper evalProjectOrgWaringMapper;
|
private final EvalProjectOrgWaringMapper evalProjectOrgWaringMapper;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@XxlJob("org.qinan.safetyeval.adapter.job.EvalProjectProcessWaringTaskJob")
|
@XxlJob("org.qinan.safetyeval.adapter.job.EvalProjectProcessWaringTaskJob")
|
||||||
@JobRegister(cron = "0/1 * * * * ?",
|
@JobRegister(cron = "0 0 2 * * ?",
|
||||||
jobDesc = "机构项目风险预警",
|
jobDesc = "过程控制签字完成,超过3天未归档",
|
||||||
author = "ltq",
|
author = "ltq",
|
||||||
triggerStatus = 1)
|
triggerStatus = 1)
|
||||||
public ReturnT<String> execute(String param) {
|
public ReturnT<String> execute(String param) {
|
||||||
|
|
@ -67,13 +67,13 @@ public class EvalProjectProcessWaringTaskJob implements Job {
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 查询签字完成未归档的项目(签字时间在3~180天前)
|
* 查询签字完成未归档的项目(签字时间在3~90天前)
|
||||||
*/
|
*/
|
||||||
private List<EvalProcessControlDO> findUnarchivedControls() {
|
private List<EvalProcessControlDO> findUnarchivedControls() {
|
||||||
return evalProcessControlMapper.selectList(
|
return evalProcessControlMapper.selectList(
|
||||||
new LambdaQueryWrapper<EvalProcessControlDO>()
|
new LambdaQueryWrapper<EvalProcessControlDO>()
|
||||||
.between(EvalProcessControlDO::getControlTime,
|
.between(EvalProcessControlDO::getControlTime,
|
||||||
LocalDateTime.now().minusDays(180),
|
LocalDateTime.now().minusDays(90),
|
||||||
LocalDateTime.now().minusDays(3))
|
LocalDateTime.now().minusDays(3))
|
||||||
.eq(EvalProcessControlDO::getArchiveFlag, 0)
|
.eq(EvalProcessControlDO::getArchiveFlag, 0)
|
||||||
.eq(EvalProcessControlDO::getDeleteEnum, BooleanQAEnum.FALSE.getValue()));
|
.eq(EvalProcessControlDO::getDeleteEnum, BooleanQAEnum.FALSE.getValue()));
|
||||||
|
|
@ -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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
Loading…
Reference in New Issue