@@ -23,15 +23,15 @@ public enum WarningFlowTypeEnum { | |||||
*/ | */ | ||||
UNIT_INNER_AUDIT(1, "预审申报", null, "declareManage/planDeclaration/preExaminationDeclare"), | UNIT_INNER_AUDIT(1, "预审申报", null, "declareManage/planDeclaration/preExaminationDeclare"), | ||||
PRELIMINARY_PREVIEW(2, "建设方案申报", null, "declareManage/constructionPlanDeclare"), | PRELIMINARY_PREVIEW(2, "建设方案申报", null, "declareManage/constructionPlanDeclare"), | ||||
DEPT_UNITED_REVIEW(3, "采购结果备案", ProjectStatus.TO_BE_PURCHASED.getCode(), "declareManage/procurementRecord/purchaseResults"), | |||||
WITHOUT_PURCHASE(3, "采购结果备案", ProjectStatus.TO_BE_PURCHASED, "declareManage/procurementRecord/purchaseResults"), | |||||
CONSTRUCTION_PLAN_REVIEW(4, "初验备案", null, "declareManage/acceptanceApply/initialInspectionRecord"), | CONSTRUCTION_PLAN_REVIEW(4, "初验备案", null, "declareManage/acceptanceApply/initialInspectionRecord"), | ||||
PROJECT_FINAL_INSPECTION(5, "验收申报", ProjectStatus.ON_PILOT_RUNNING.getCode(), "declareManage/acceptanceApply/finalInspectionDeclare"); | |||||
PROJECT_FINAL_INSPECTION(5, "验收申报", ProjectStatus.ON_PILOT_RUNNING, "declareManage/acceptanceApply/finalInspectionDeclare"); | |||||
private Integer code; | private Integer code; | ||||
private String desc; | private String desc; | ||||
//对应的 待提交时的项目状态 | //对应的 待提交时的项目状态 | ||||
private Integer projectStutas; | |||||
private ProjectStatus projectStatus; | |||||
private String path; | private String path; | ||||
@@ -78,4 +78,15 @@ public interface IProjectStatusChangeService extends IService<ProjectStatusChang | |||||
Comparator.comparing(ProjectStatusChange::getCreateOn).reversed()); | Comparator.comparing(ProjectStatusChange::getCreateOn).reversed()); | ||||
} | } | ||||
default Map<String, ProjectStatusChange> listLastEventMap(Collection<String> projectCodes, | |||||
ProjectStateChangeEvent event) { | |||||
Wrapper<ProjectStatusChange> query = Wrappers.lambdaQuery(ProjectStatusChange.class) | |||||
.in(ProjectStatusChange::getProjectCode, projectCodes) | |||||
.eq(ProjectStatusChange::getEvent, event) | |||||
.orderByDesc(ProjectStatusChange::getCreateOn); | |||||
return BizUtils.groupFirstMap(list(query), | |||||
ProjectStatusChange::getProjectCode, | |||||
Comparator.comparing(ProjectStatusChange::getCreateOn).reversed()); | |||||
} | |||||
} | } |
@@ -1,7 +1,6 @@ | |||||
package com.hz.pm.api.scheduler.task; | package com.hz.pm.api.scheduler.task; | ||||
import cn.hutool.core.collection.CollUtil; | import cn.hutool.core.collection.CollUtil; | ||||
import cn.hutool.core.date.StopWatch; | |||||
import com.baomidou.mybatisplus.core.toolkit.Wrappers; | import com.baomidou.mybatisplus.core.toolkit.Wrappers; | ||||
import com.google.common.collect.Sets; | import com.google.common.collect.Sets; | ||||
import com.hz.pm.api.common.model.constant.BizConst; | import com.hz.pm.api.common.model.constant.BizConst; | ||||
@@ -10,6 +9,7 @@ import com.hz.pm.api.projectlib.model.entity.ProjectRenewalFundDeclaration; | |||||
import com.hz.pm.api.projectlib.model.enumeration.ProjectRenewalApprovalStatusEnum; | import com.hz.pm.api.projectlib.model.enumeration.ProjectRenewalApprovalStatusEnum; | ||||
import com.hz.pm.api.projectlib.model.enumeration.WarningFlowTypeEnum; | import com.hz.pm.api.projectlib.model.enumeration.WarningFlowTypeEnum; | ||||
import com.hz.pm.api.projectlib.model.enumeration.WarningOperationTypeEnum; | import com.hz.pm.api.projectlib.model.enumeration.WarningOperationTypeEnum; | ||||
import com.hz.pm.api.projectlib.model.enumeration.status.ProjectStatus; | |||||
import com.hz.pm.api.projectlib.service.IProjectRenewalFundDeclarationService; | import com.hz.pm.api.projectlib.service.IProjectRenewalFundDeclarationService; | ||||
import com.hz.pm.api.projectlib.service.IProjectService; | import com.hz.pm.api.projectlib.service.IProjectService; | ||||
import com.hz.pm.api.sys.enumeration.ProjectEarlyWarningStatusEnum; | import com.hz.pm.api.sys.enumeration.ProjectEarlyWarningStatusEnum; | ||||
@@ -23,12 +23,9 @@ import lombok.extern.slf4j.Slf4j; | |||||
import org.apache.commons.lang3.StringUtils; | import org.apache.commons.lang3.StringUtils; | ||||
import org.flowable.engine.TaskService; | import org.flowable.engine.TaskService; | ||||
import org.flowable.task.api.Task; | import org.flowable.task.api.Task; | ||||
import org.springframework.beans.factory.annotation.Value; | |||||
import org.springframework.scheduling.annotation.Scheduled; | import org.springframework.scheduling.annotation.Scheduled; | ||||
import org.springframework.stereotype.Component; | import org.springframework.stereotype.Component; | ||||
import java.net.InetAddress; | |||||
import java.net.UnknownHostException; | |||||
import java.time.LocalDateTime; | import java.time.LocalDateTime; | ||||
import java.util.List; | import java.util.List; | ||||
import java.util.Map; | import java.util.Map; | ||||
@@ -52,26 +49,13 @@ public class EarlyWarningProjectTask { | |||||
private final IEarlyWarningRecordsService earlyWarningRecordsService; | private final IEarlyWarningRecordsService earlyWarningRecordsService; | ||||
private final IProjectRenewalFundDeclarationService renewalFundDeclarationService; | private final IProjectRenewalFundDeclarationService renewalFundDeclarationService; | ||||
private final TaskService taskService; | private final TaskService taskService; | ||||
@Value("${hostname:}") | |||||
private String HOST_NAME; | |||||
@Scheduled(fixedDelay = 12, initialDelay = 1, timeUnit = TimeUnit.MINUTES) | |||||
public void doEarlyWarningDeclared() throws UnknownHostException { | |||||
if (!HOST_NAME.equals(InetAddress.getLocalHost().getHostName())) { | |||||
return; | |||||
} | |||||
log.info("=========== 预警项目维度任务开始 ========"); | |||||
StopWatch stopWatch = new StopWatch(); | |||||
stopWatch.start(); | |||||
@Scheduled(fixedDelay = 5, initialDelay = 5, timeUnit = TimeUnit.MINUTES) | |||||
public void doEarlyWarningDeclared() { | |||||
List<Project> projects = projectService.list(Wrappers.lambdaQuery(Project.class) | List<Project> projects = projectService.list(Wrappers.lambdaQuery(Project.class) | ||||
.eq(Project::getNewest, Boolean.TRUE)); | .eq(Project::getNewest, Boolean.TRUE)); | ||||
if (CollUtil.isEmpty(projects)) { | if (CollUtil.isEmpty(projects)) { | ||||
log.info("系统没有项目 退出任务"); | |||||
stopWatch.stop(); | |||||
log.info("=========== 预警项目维度任务结束 耗时{}s", stopWatch.getTotalTimeSeconds()); | |||||
return; | return; | ||||
} | } | ||||
@@ -122,15 +106,9 @@ public class EarlyWarningProjectTask { | |||||
//3.去查询 各个报警 是否已经正常 | //3.去查询 各个报警 是否已经正常 | ||||
List<ProjectEarlyWarning> trueWarnings = warnings.stream().filter(w -> Objects.nonNull(w.getNormal()) && !w.getNormal()).collect(Collectors.toList()); | List<ProjectEarlyWarning> trueWarnings = warnings.stream().filter(w -> Objects.nonNull(w.getNormal()) && !w.getNormal()).collect(Collectors.toList()); | ||||
if (CollUtil.isEmpty(trueWarnings)) { | if (CollUtil.isEmpty(trueWarnings)) { | ||||
log.info("没有异常的项目 要去查询"); | |||||
stopWatch.stop(); | |||||
log.info("=========== 预警项目维度任务结束 耗时{}s", stopWatch.getTotalTimeSeconds()); | |||||
return; | return; | ||||
} | } | ||||
checkNormal(trueWarnings); | checkNormal(trueWarnings); | ||||
stopWatch.stop(); | |||||
log.info("=========== 预警项目维度任务结束 耗时{}s", stopWatch.getTotalTimeSeconds()); | |||||
} | } | ||||
//3.去查询 各个报警 是否已经正常 | //3.去查询 各个报警 是否已经正常 | ||||
@@ -272,9 +250,9 @@ public class EarlyWarningProjectTask { | |||||
if (Objects.isNull(flowTypeEnum)) { | if (Objects.isNull(flowTypeEnum)) { | ||||
continue; | continue; | ||||
} | } | ||||
Integer projectStutas = flowTypeEnum.getProjectStutas(); | |||||
ProjectStatus projectStatus = flowTypeEnum.getProjectStatus(); | |||||
//已经不是这个状态了 说明已经被提交了 | //已经不是这个状态了 说明已经被提交了 | ||||
if (!projectStutas.equals(project.getStatus())) { | |||||
if (!projectStatus.eq(project.getStatus())) { | |||||
declaredWarning.setDeclaredWarning(Boolean.FALSE); | declaredWarning.setDeclaredWarning(Boolean.FALSE); | ||||
//其它三种 都没有 说明已经正常了 | //其它三种 都没有 说明已经正常了 | ||||
if (!declaredWarning.getProcessWarning() && | if (!declaredWarning.getProcessWarning() && | ||||
@@ -2,6 +2,7 @@ package com.hz.pm.api.scheduler.task; | |||||
import cn.hutool.core.collection.CollUtil; | import cn.hutool.core.collection.CollUtil; | ||||
import cn.hutool.core.date.StopWatch; | import cn.hutool.core.date.StopWatch; | ||||
import cn.hutool.core.util.NumberUtil; | |||||
import cn.hutool.core.util.StrUtil; | import cn.hutool.core.util.StrUtil; | ||||
import com.alibaba.fastjson.JSON; | import com.alibaba.fastjson.JSON; | ||||
import com.alibaba.fastjson.JSONArray; | import com.alibaba.fastjson.JSONArray; | ||||
@@ -11,23 +12,29 @@ import com.baomidou.mybatisplus.core.toolkit.Wrappers; | |||||
import com.google.common.collect.Lists; | import com.google.common.collect.Lists; | ||||
import com.google.common.collect.Maps; | import com.google.common.collect.Maps; | ||||
import com.hz.pm.api.common.enumeration.CommonEnum; | import com.hz.pm.api.common.enumeration.CommonEnum; | ||||
import com.hz.pm.api.common.statemachine.event.ProjectStateChangeEvent; | |||||
import com.hz.pm.api.common.util.EnvironmentUtil; | |||||
import com.hz.pm.api.common.util.StrUtils; | import com.hz.pm.api.common.util.StrUtils; | ||||
import com.hz.pm.api.projectdeclared.model.entity.Operation; | import com.hz.pm.api.projectdeclared.model.entity.Operation; | ||||
import com.hz.pm.api.projectdeclared.service.IOperationService; | import com.hz.pm.api.projectdeclared.service.IOperationService; | ||||
import com.hz.pm.api.projectlib.model.entity.Project; | import com.hz.pm.api.projectlib.model.entity.Project; | ||||
import com.hz.pm.api.projectlib.model.entity.ProjectRenewalFundDeclaration; | import com.hz.pm.api.projectlib.model.entity.ProjectRenewalFundDeclaration; | ||||
import com.hz.pm.api.projectlib.model.entity.ProjectStatusChange; | |||||
import com.hz.pm.api.projectlib.model.enumeration.ProjectRenewalApprovalStatusEnum; | import com.hz.pm.api.projectlib.model.enumeration.ProjectRenewalApprovalStatusEnum; | ||||
import com.hz.pm.api.projectlib.model.enumeration.WarningFlowTypeEnum; | import com.hz.pm.api.projectlib.model.enumeration.WarningFlowTypeEnum; | ||||
import com.hz.pm.api.projectlib.model.enumeration.WarningNoticeTypeEnum; | import com.hz.pm.api.projectlib.model.enumeration.WarningNoticeTypeEnum; | ||||
import com.hz.pm.api.projectlib.model.enumeration.WarningOperationTypeEnum; | import com.hz.pm.api.projectlib.model.enumeration.WarningOperationTypeEnum; | ||||
import com.hz.pm.api.projectlib.service.IProjectRenewalFundDeclarationService; | import com.hz.pm.api.projectlib.service.IProjectRenewalFundDeclarationService; | ||||
import com.hz.pm.api.projectlib.service.IProjectService; | import com.hz.pm.api.projectlib.service.IProjectService; | ||||
import com.hz.pm.api.projectlib.service.IProjectStatusChangeService; | |||||
import com.hz.pm.api.sys.manage.EarlyWarningManage; | import com.hz.pm.api.sys.manage.EarlyWarningManage; | ||||
import com.hz.pm.api.sys.manage.RoleManage; | import com.hz.pm.api.sys.manage.RoleManage; | ||||
import com.hz.pm.api.sys.service.IProjectEarlyWarningService; | import com.hz.pm.api.sys.service.IProjectEarlyWarningService; | ||||
import com.hz.pm.api.user.helper.MhUnitCache; | |||||
import com.hz.pm.api.user.model.entity.UserInfo; | import com.hz.pm.api.user.model.entity.UserInfo; | ||||
import com.hz.pm.api.user.model.enumeration.RoleEnum; | import com.hz.pm.api.user.model.enumeration.RoleEnum; | ||||
import com.hz.pm.api.user.service.IUserInfoService; | import com.hz.pm.api.user.service.IUserInfoService; | ||||
import com.ningdatech.basic.util.CollUtils; | |||||
import com.ningdatech.basic.util.StrPool; | import com.ningdatech.basic.util.StrPool; | ||||
import com.wflow.bean.entity.WflowEarlyWarning; | import com.wflow.bean.entity.WflowEarlyWarning; | ||||
import com.wflow.enums.WarningRuleTypeEnum; | import com.wflow.enums.WarningRuleTypeEnum; | ||||
@@ -42,6 +49,7 @@ import org.springframework.stereotype.Component; | |||||
import java.net.UnknownHostException; | import java.net.UnknownHostException; | ||||
import java.time.Duration; | import java.time.Duration; | ||||
import java.time.LocalDateTime; | import java.time.LocalDateTime; | ||||
import java.time.temporal.ChronoUnit; | |||||
import java.util.List; | import java.util.List; | ||||
import java.util.Map; | import java.util.Map; | ||||
import java.util.Objects; | import java.util.Objects; | ||||
@@ -55,8 +63,8 @@ import java.util.stream.Collectors; | |||||
@Slf4j | @Slf4j | ||||
@Component | @Component | ||||
@RequiredArgsConstructor | @RequiredArgsConstructor | ||||
@ConditionalOnExpression("${early-warning-instance-task:false}") | |||||
public class EarlyWarningInstanceNotStartTask { | |||||
@ConditionalOnExpression("${early-warning-without-submit.open:false}") | |||||
public class EarlyWarningWithoutSubmitTask { | |||||
private final IEarlyWarningService earlyWarningService; | private final IEarlyWarningService earlyWarningService; | ||||
private final IProjectService projectService; | private final IProjectService projectService; | ||||
@@ -66,11 +74,22 @@ public class EarlyWarningInstanceNotStartTask { | |||||
private final IProjectRenewalFundDeclarationService renewalFundDeclarationService; | private final IProjectRenewalFundDeclarationService renewalFundDeclarationService; | ||||
private final RoleManage roleManage; | private final RoleManage roleManage; | ||||
private final IProjectEarlyWarningService projectEarlyWarningService; | private final IProjectEarlyWarningService projectEarlyWarningService; | ||||
private final MhUnitCache mhUnitCache; | |||||
private final IProjectStatusChangeService projectStatusChangeService; | |||||
private final EnvironmentUtil environmentUtil; | |||||
private ChronoUnit getTimeUnit() { | |||||
if (environmentUtil.isDevEnv()) { | |||||
return ChronoUnit.MINUTES; | |||||
} else { | |||||
return ChronoUnit.DAYS; | |||||
} | |||||
} | |||||
/** | /** | ||||
* 填报预警 | * 填报预警 | ||||
*/ | */ | ||||
@Scheduled(cron = "${early-warning-instance-task.cron:0 0/5 * * * ?}") | |||||
@Scheduled(cron = "${early-warning-without-submit.cron:0 0/5 * * * ?}") | |||||
public void doEarlyWarningDeclared() { | public void doEarlyWarningDeclared() { | ||||
StopWatch stopWatch = new StopWatch(); | StopWatch stopWatch = new StopWatch(); | ||||
stopWatch.start(); | stopWatch.start(); | ||||
@@ -80,14 +99,8 @@ public class EarlyWarningInstanceNotStartTask { | |||||
.eq(WflowEarlyWarning::getIsOpen, true); | .eq(WflowEarlyWarning::getIsOpen, true); | ||||
List<WflowEarlyWarning> warnings = earlyWarningService.list(query); | List<WflowEarlyWarning> warnings = earlyWarningService.list(query); | ||||
for (WflowEarlyWarning warning : warnings) { | for (WflowEarlyWarning warning : warnings) { | ||||
String noticeMethod = warning.getNoticeMethod(); | |||||
if (StringUtils.isBlank(noticeMethod) || | |||||
(!noticeMethod.contains(String.valueOf(CommonEnum.ZWDD.getCode())) && | |||||
!noticeMethod.contains(String.valueOf(CommonEnum.MOBILE.getCode())))) { | |||||
log.info("通知方式为空或者错误!"); | |||||
return; | |||||
} | |||||
long mhUnitId = NumberUtil.parseLong(warning.getAreaCode()); | |||||
List<Long> viewUnitIds = mhUnitCache.getViewChildIdsRecursion(mhUnitId); | |||||
String noticeContent = warning.getNoticeContent(); | String noticeContent = warning.getNoticeContent(); | ||||
String adventContent = warning.getAdventContent(); | String adventContent = warning.getAdventContent(); | ||||
String rule = warning.getRule(); | String rule = warning.getRule(); | ||||
@@ -100,63 +113,59 @@ public class EarlyWarningInstanceNotStartTask { | |||||
Integer biz = rJson.getInteger("biz"); | Integer biz = rJson.getInteger("biz"); | ||||
String notice = rJson.getString("notice"); | String notice = rJson.getString("notice"); | ||||
Integer adventTime = rJson.getInteger("adventTime"); | Integer adventTime = rJson.getInteger("adventTime"); | ||||
if ((Objects.isNull(time) && Objects.isNull(adventTime)) || Objects.isNull(biz)) { | |||||
log.info("规则数据 错误 :{}", rJson); | |||||
WarningFlowTypeEnum flowType = WarningFlowTypeEnum.getByCode(biz); | |||||
if (((Objects.isNull(time) && Objects.isNull(adventTime)) || Objects.isNull(biz)) | |||||
|| StrUtil.isBlank(notice) | |||||
|| flowType == null) { | |||||
log.warn("规则数据 错误 :{}", rJson); | |||||
return; | return; | ||||
} | } | ||||
if (StringUtils.isBlank(notice)) { | |||||
log.info("取不到提醒人配置 : " + rJson); | |||||
return; | |||||
} | |||||
WarningFlowTypeEnum flowTypeEnum = WarningFlowTypeEnum.getByCode(biz); | |||||
if (Objects.isNull(flowTypeEnum)) { | |||||
log.info("匹配不到 业务类型"); | |||||
return; | |||||
} | |||||
String path = flowTypeEnum.getPath(); | |||||
//得出 对应待提交的项目状态 | |||||
Integer projectStatus = flowTypeEnum.getProjectStutas(); | |||||
String areaCode = warning.getAreaCode(); | |||||
//测试先用分钟 | |||||
String path = flowType.getPath(); | |||||
//查询 所有这个区域的项目 未提交的项目 | //查询 所有这个区域的项目 未提交的项目 | ||||
List<Project> needNextProjects = projectService.list(Wrappers.lambdaQuery(Project.class) | |||||
.eq(Project::getAreaCode, areaCode) | |||||
Wrapper<Project> projectQuery = Wrappers.lambdaQuery(Project.class) | |||||
.eq(Project::getBuildOrgCode, viewUnitIds) | |||||
.eq(Project::getNewest, Boolean.TRUE) | .eq(Project::getNewest, Boolean.TRUE) | ||||
.eq(Project::getStatus, projectStatus)); | |||||
.eq(Project::getStatus, flowType.getProjectStatus().getCode()); | |||||
List<Project> needNextProjects = projectService.list(projectQuery); | |||||
Map<String, List<Integer>> noticeMap = Maps.newHashMap(); | Map<String, List<Integer>> noticeMap = Maps.newHashMap(); | ||||
//需要发通知的项目 | |||||
List<String> projectCodes = CollUtils.fieldList(needNextProjects, Project::getProjectCode); | |||||
Map<String, ProjectStatusChange> projectStatusChangeMap; | |||||
switch (flowType) { | |||||
case WITHOUT_PURCHASE: | |||||
projectStatusChangeMap = projectStatusChangeService.listLastEventMap(projectCodes, | |||||
ProjectStateChangeEvent.DECLARED_RECORD_PASS); | |||||
break; | |||||
default: | |||||
return; | |||||
} | |||||
// 需要发通知的项目 | |||||
List<Project> needToWaringProjects = needNextProjects.stream() | List<Project> needToWaringProjects = needNextProjects.stream() | ||||
.filter(p -> { | .filter(p -> { | ||||
ProjectStatusChange change = projectStatusChangeMap.get(p.getProjectCode()); | |||||
List<Integer> noticeTypes = Lists.newArrayList(); | List<Integer> noticeTypes = Lists.newArrayList(); | ||||
if (Objects.nonNull(time) && Duration.between(p.getUpdateOn(), LocalDateTime.now()).toMinutes() >= time * 60 && //time * 60 | |||||
Duration.between(p.getUpdateOn(), LocalDateTime.now()).toMinutes() <= time * 60 + 1) { //time * 60 | |||||
noticeTypes.add(com.wflow.enums.WarningNoticeTypeEnum.OVER.getCode()); | |||||
} | |||||
if (Objects.nonNull(adventTime) && Duration.between(p.getUpdateOn(), LocalDateTime.now()).toMinutes() >= adventTime * 60 && //time * 60 | |||||
Duration.between(p.getUpdateOn(), LocalDateTime.now()).toMinutes() <= adventTime * 60 + 1) { | |||||
noticeTypes.add(com.wflow.enums.WarningNoticeTypeEnum.ADVENT.getCode()); | |||||
} | |||||
if (CollUtil.isNotEmpty(noticeTypes)) { | |||||
noticeMap.put(p.getProjectCode(), noticeTypes); | |||||
//项目 填报预警 | |||||
projectEarlyWarningService.earlyWarning(p, | |||||
WarningRuleTypeEnum.DECLARED_WARNING.getCode(), noticeTypes); | |||||
return Boolean.TRUE; | |||||
LocalDateTime touchTime = change == null ? null : change.getCreateOn(); | |||||
if (touchTime != null) { | |||||
if (Objects.nonNull(time)) { | |||||
long duration = Duration.between(touchTime, LocalDateTime.now()).get(getTimeUnit()); | |||||
if (duration >= time && duration < time + (environmentUtil.isDevEnv() ? 5 : 1)) { | |||||
noticeTypes.add(com.wflow.enums.WarningNoticeTypeEnum.OVER.getCode()); | |||||
} | |||||
} | |||||
if (Objects.nonNull(adventTime)) { | |||||
long duration = Duration.between(touchTime, LocalDateTime.now()).get(getTimeUnit()); | |||||
if (duration >= adventTime && duration < adventTime + (environmentUtil.isDevEnv() ? 5 : 1)) { | |||||
noticeTypes.add(com.wflow.enums.WarningNoticeTypeEnum.ADVENT.getCode()); | |||||
} | |||||
} | |||||
if (CollUtil.isNotEmpty(noticeTypes)) { | |||||
noticeMap.put(p.getProjectCode(), noticeTypes); | |||||
//项目 填报预警 | |||||
projectEarlyWarningService.earlyWarning(p, WarningRuleTypeEnum.DECLARED_WARNING.getCode(), noticeTypes); | |||||
return Boolean.TRUE; | |||||
} | |||||
} | } | ||||
return Boolean.FALSE; | return Boolean.FALSE; | ||||
}) | |||||
.collect(Collectors.toList()); | |||||
if (StringUtils.isBlank(noticeMethod) || | |||||
(!noticeMethod.contains(String.valueOf(CommonEnum.ZWDD.getCode())) && | |||||
!noticeMethod.contains(String.valueOf(CommonEnum.MOBILE.getCode())))) { | |||||
log.info("通知方式为空或者错误!"); | |||||
return; | |||||
} | |||||
}).collect(Collectors.toList()); | |||||
for (Project needToWaringProject : needToWaringProjects) { | for (Project needToWaringProject : needToWaringProjects) { | ||||
String username; | String username; | ||||
@@ -197,7 +206,7 @@ public class EarlyWarningInstanceNotStartTask { | |||||
List<Integer> noticeTypes = noticeMap.get(needToWaringProject.getProjectCode()); | List<Integer> noticeTypes = noticeMap.get(needToWaringProject.getProjectCode()); | ||||
for (Integer noticeType : noticeTypes) { | for (Integer noticeType : noticeTypes) { | ||||
for (String employeeCode : batchEmployees) { | for (String employeeCode : batchEmployees) { | ||||
earlyWarningManage.doEarlyWarning(noticeMethod, Objects.nonNull(noticeType) && noticeType.equals(1) ? noticeContent : adventContent, | |||||
earlyWarningManage.doEarlyWarning(warning.getNoticeMethod(), Objects.nonNull(noticeType) && noticeType.equals(1) ? noticeContent : adventContent, | |||||
adventTime, time, biz, | adventTime, time, biz, | ||||
needToWaringProject.getUpdateOn(), Long.valueOf(employeeCode), needToWaringProject, | needToWaringProject.getUpdateOn(), Long.valueOf(employeeCode), needToWaringProject, | ||||
WarningRuleTypeEnum.DECLARED_WARNING.getCode(), noticeType, path, batchEmployeesStr, | WarningRuleTypeEnum.DECLARED_WARNING.getCode(), noticeType, path, batchEmployeesStr, | ||||
@@ -216,7 +225,7 @@ public class EarlyWarningInstanceNotStartTask { | |||||
log.info("=========== 预警填报超时任务结束 耗时{}s", stopWatch.getTotalTimeSeconds()); | log.info("=========== 预警填报超时任务结束 耗时{}s", stopWatch.getTotalTimeSeconds()); | ||||
} | } | ||||
@Scheduled(cron = "10 0/2 * * * ?") | |||||
//@Scheduled(cron = "10 0/2 * * * ?") | |||||
public void doEarlyWarningOperation() throws UnknownHostException { | public void doEarlyWarningOperation() throws UnknownHostException { | ||||
log.info("=========== 预警实施超时任务开始 ========"); | log.info("=========== 预警实施超时任务开始 ========"); | ||||
StopWatch stopWatch = new StopWatch(); | StopWatch stopWatch = new StopWatch(); | ||||
@@ -400,7 +409,7 @@ public class EarlyWarningInstanceNotStartTask { | |||||
* | * | ||||
* @throws UnknownHostException | * @throws UnknownHostException | ||||
*/ | */ | ||||
@Scheduled(cron = "20 0/2 * * * ?") | |||||
//@Scheduled(cron = "20 0/2 * * * ?") | |||||
public void doEarlyWarningRenewalFund() throws UnknownHostException { | public void doEarlyWarningRenewalFund() throws UnknownHostException { | ||||
log.info("=========== 预警续建资金项目 超时任务开始 ========"); | log.info("=========== 预警续建资金项目 超时任务开始 ========"); | ||||
StopWatch stopWatch = new StopWatch(); | StopWatch stopWatch = new StopWatch(); |
@@ -108,7 +108,7 @@ public class EarlyWarningManage { | |||||
records.setRuleType(WarningRuleTypeEnum.RENEWAL_FUND.getCode()); | records.setRuleType(WarningRuleTypeEnum.RENEWAL_FUND.getCode()); | ||||
break; | break; | ||||
default: | default: | ||||
log.info("匹配不到 规则类型"); | |||||
log.warn("匹配不到 规则类型"); | |||||
return; | return; | ||||
} | } | ||||
@@ -7,6 +7,7 @@ import com.hz.pm.api.workbench.model.WorkbenchProjectLibReq; | |||||
import com.hz.pm.api.workbench.model.WorkbenchReq; | import com.hz.pm.api.workbench.model.WorkbenchReq; | ||||
import com.hz.pm.api.workbench.model.vo.ProjectProcessStatVO; | import com.hz.pm.api.workbench.model.vo.ProjectProcessStatVO; | ||||
import com.hz.pm.api.workbench.model.vo.ProjectTotalViewVO; | import com.hz.pm.api.workbench.model.vo.ProjectTotalViewVO; | ||||
import com.hz.pm.api.workbench.model.vo.WorkbenchProjectEarlyWarnVO; | |||||
import com.hz.pm.api.workbench.model.vo.WorkbenchVO; | import com.hz.pm.api.workbench.model.vo.WorkbenchVO; | ||||
import com.ningdatech.basic.model.PageVo; | import com.ningdatech.basic.model.PageVo; | ||||
import com.ningdatech.log.annotation.WebLog; | import com.ningdatech.log.annotation.WebLog; | ||||
@@ -73,8 +74,14 @@ public class WorkbenchController { | |||||
@GetMapping("/systemReplaceInfos") | @GetMapping("/systemReplaceInfos") | ||||
@ApiOperation("获取项目替代情况") | @ApiOperation("获取项目替代情况") | ||||
public SystemReplaceInfoVO systemReplaceInfos(WorkbenchProjectLibReq req ) { | |||||
public SystemReplaceInfoVO systemReplaceInfos(WorkbenchProjectLibReq req) { | |||||
return workbenchManage.listSystemReplaceInfos(req); | return workbenchManage.listSystemReplaceInfos(req); | ||||
} | } | ||||
@GetMapping("/projectEarlyWarnings") | |||||
@ApiOperation("获取项目预警") | |||||
public WorkbenchProjectEarlyWarnVO projectEarlyWarnings(WorkbenchReq req) { | |||||
return workbenchManage.projectEarlyWarnings(req); | |||||
} | |||||
} | } |
@@ -1,13 +1,17 @@ | |||||
package com.hz.pm.api.workbench.manage; | package com.hz.pm.api.workbench.manage; | ||||
import cn.hutool.core.bean.BeanUtil; | |||||
import cn.hutool.core.collection.CollUtil; | import cn.hutool.core.collection.CollUtil; | ||||
import cn.hutool.core.map.MapUtil; | |||||
import cn.hutool.core.util.NumberUtil; | import cn.hutool.core.util.NumberUtil; | ||||
import cn.hutool.core.util.StrUtil; | import cn.hutool.core.util.StrUtil; | ||||
import com.baomidou.mybatisplus.core.conditions.Wrapper; | import com.baomidou.mybatisplus.core.conditions.Wrapper; | ||||
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; | import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; | ||||
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; | |||||
import com.baomidou.mybatisplus.core.toolkit.Assert; | import com.baomidou.mybatisplus.core.toolkit.Assert; | ||||
import com.baomidou.mybatisplus.core.toolkit.Wrappers; | import com.baomidou.mybatisplus.core.toolkit.Wrappers; | ||||
import com.baomidou.mybatisplus.extension.plugins.pagination.Page; | import com.baomidou.mybatisplus.extension.plugins.pagination.Page; | ||||
import com.google.common.collect.Sets; | |||||
import com.hz.pm.api.common.helper.UserInfoHelper; | import com.hz.pm.api.common.helper.UserInfoHelper; | ||||
import com.hz.pm.api.common.model.constant.BizConst; | import com.hz.pm.api.common.model.constant.BizConst; | ||||
import com.hz.pm.api.common.model.constant.ExistsSqlConst; | import com.hz.pm.api.common.model.constant.ExistsSqlConst; | ||||
@@ -36,9 +40,13 @@ import com.hz.pm.api.projectlib.service.IProjectGovSystemReplaceInfosService; | |||||
import com.hz.pm.api.projectlib.service.IProjectService; | import com.hz.pm.api.projectlib.service.IProjectService; | ||||
import com.hz.pm.api.projectlib.service.IProjectStatusChangeService; | import com.hz.pm.api.projectlib.service.IProjectStatusChangeService; | ||||
import com.hz.pm.api.projectlib.service.IPurchaseStatusChangeService; | import com.hz.pm.api.projectlib.service.IPurchaseStatusChangeService; | ||||
import com.hz.pm.api.sys.enumeration.ProjectEarlyWarningStatusEnum; | |||||
import com.hz.pm.api.sys.manage.EarlyWarningManage; | import com.hz.pm.api.sys.manage.EarlyWarningManage; | ||||
import com.hz.pm.api.sys.model.entity.ProjectEarlyWarning; | |||||
import com.hz.pm.api.sys.model.entity.WflowEarlyWarningRecords; | import com.hz.pm.api.sys.model.entity.WflowEarlyWarningRecords; | ||||
import com.hz.pm.api.sys.model.vo.ProjectEarlyWarningVO; | |||||
import com.hz.pm.api.sys.service.IEarlyWarningRecordsService; | import com.hz.pm.api.sys.service.IEarlyWarningRecordsService; | ||||
import com.hz.pm.api.sys.service.IProjectEarlyWarningService; | |||||
import com.hz.pm.api.todocenter.manage.TodoCenterManage; | import com.hz.pm.api.todocenter.manage.TodoCenterManage; | ||||
import com.hz.pm.api.todocenter.model.req.ToBeProcessedReq; | import com.hz.pm.api.todocenter.model.req.ToBeProcessedReq; | ||||
import com.hz.pm.api.todocenter.model.vo.ResToBeProcessedVO; | import com.hz.pm.api.todocenter.model.vo.ResToBeProcessedVO; | ||||
@@ -51,10 +59,7 @@ import com.hz.pm.api.workbench.converter.WorkbenchConverter; | |||||
import com.hz.pm.api.workbench.model.WorkbenchProcessNode; | import com.hz.pm.api.workbench.model.WorkbenchProcessNode; | ||||
import com.hz.pm.api.workbench.model.WorkbenchProjectLibReq; | import com.hz.pm.api.workbench.model.WorkbenchProjectLibReq; | ||||
import com.hz.pm.api.workbench.model.WorkbenchReq; | import com.hz.pm.api.workbench.model.WorkbenchReq; | ||||
import com.hz.pm.api.workbench.model.vo.ProjectProcessStatVO; | |||||
import com.hz.pm.api.workbench.model.vo.ProjectTotalViewVO; | |||||
import com.hz.pm.api.workbench.model.vo.SystemReplaceStatVO; | |||||
import com.hz.pm.api.workbench.model.vo.WorkbenchVO; | |||||
import com.hz.pm.api.workbench.model.vo.*; | |||||
import com.ningdatech.basic.model.PageVo; | import com.ningdatech.basic.model.PageVo; | ||||
import com.ningdatech.basic.util.CollUtils; | import com.ningdatech.basic.util.CollUtils; | ||||
import com.ningdatech.basic.util.StrPool; | import com.ningdatech.basic.util.StrPool; | ||||
@@ -105,6 +110,7 @@ public class WorkbenchManage { | |||||
private final MhUnitCache mhUnitCache; | private final MhUnitCache mhUnitCache; | ||||
private final IProjectGovSystemReplaceInfosService systemReplaceInfosService; | private final IProjectGovSystemReplaceInfosService systemReplaceInfosService; | ||||
private final IPurchaseStatusChangeService purchaseStatusChangeService; | private final IPurchaseStatusChangeService purchaseStatusChangeService; | ||||
private final IProjectEarlyWarningService projectEarlyWarningService; | |||||
public WorkbenchVO getWorkbenchData(Integer year) { | public WorkbenchVO getWorkbenchData(Integer year) { | ||||
WorkbenchVO res = new WorkbenchVO(); | WorkbenchVO res = new WorkbenchVO(); | ||||
@@ -697,4 +703,96 @@ public class WorkbenchManage { | |||||
retDetail.setReplaceDetail(retList); | retDetail.setReplaceDetail(retList); | ||||
return retDetail; | return retDetail; | ||||
} | } | ||||
public WorkbenchProjectEarlyWarnVO projectEarlyWarnings(WorkbenchReq req) { | |||||
Long unitId = Optional.ofNullable(req.getUnitId()).orElseGet(LoginUserUtil::getMhUnitId); | |||||
List<Long> viewUnitIds = mhUnitCache.getViewChildIdsRecursion(unitId); | |||||
List<String> viewUnitIdList = CollUtils.convert(viewUnitIds, String::valueOf); | |||||
WorkbenchProjectEarlyWarnVO earlyWarningStat = new WorkbenchProjectEarlyWarnVO(); | |||||
LambdaQueryWrapper<ProjectEarlyWarning> pageQuery = Wrappers.lambdaQuery(ProjectEarlyWarning.class) | |||||
.in(ProjectEarlyWarning::getBuildOrgCode, viewUnitIdList); | |||||
QueryWrapper<ProjectEarlyWarning> countQuery = new QueryWrapper<>(); | |||||
countQuery.select("count(1) \"total\", status \"status\""); | |||||
countQuery.in("build_org_code", viewUnitIdList); | |||||
if (req.getUnitStrip() != null) { | |||||
String unitStripSql = String.format("select 1 from nd_project np where " + | |||||
"np.project_code = nd_project_early_warning.project_code " + | |||||
" and np.newest = 1 and np.unit_strip = %d", req.getUnitStrip()); | |||||
countQuery.exists(unitStripSql); | |||||
pageQuery.exists(unitStripSql); | |||||
} | |||||
if (req.getProjectYear() != null) { | |||||
LocalDate startDate = LocalDate.of(req.getProjectYear(), 1, 1); | |||||
LocalDate endDate = LocalDate.now().plusDays(1); | |||||
pageQuery.between(ProjectEarlyWarning::getCreateOn, startDate, endDate); | |||||
countQuery.between("create_on", startDate, endDate); | |||||
} | |||||
countQuery.groupBy("status"); | |||||
List<Map<String, Object>> counts = projectEarlyWarningService.listMaps(countQuery); | |||||
Map<String, Integer> countMap = CollUtils.listToMap(counts, | |||||
w -> MapUtil.getStr(w, "status"), w -> MapUtil.getInt(w, "total")); | |||||
earlyWarningStat.setOvertime(countMap.getOrDefault(ProjectEarlyWarningStatusEnum.OVER_TIME.name(), 0)); | |||||
earlyWarningStat.setAdvent(countMap.getOrDefault(ProjectEarlyWarningStatusEnum.ADVENT_TIME.name(), 0)); | |||||
earlyWarningStat.setTotal(earlyWarningStat.getAdvent() + earlyWarningStat.getOvertime()); | |||||
if (counts.isEmpty()) { | |||||
return earlyWarningStat; | |||||
} | |||||
if (req.getProjectEarlyWarningStatus() == null) { | |||||
pageQuery.in(ProjectEarlyWarning::getStatus, ProjectEarlyWarningStatusEnum.OVER_TIME, | |||||
ProjectEarlyWarningStatusEnum.ADVENT_TIME); | |||||
} else { | |||||
pageQuery.eq(ProjectEarlyWarning::getStatus, req.getProjectEarlyWarningStatus()); | |||||
} | |||||
Page<ProjectEarlyWarning> page = Page.of(1, 500); | |||||
if (req.getProjectEarlyWarningStatus() == null) { | |||||
pageQuery.in(ProjectEarlyWarning::getStatus, ProjectEarlyWarningStatusEnum.OVER_TIME, | |||||
ProjectEarlyWarningStatusEnum.ADVENT_TIME); | |||||
} else { | |||||
pageQuery.eq(ProjectEarlyWarning::getStatus, req.getProjectEarlyWarningStatus()); | |||||
} | |||||
projectEarlyWarningService.page(page, pageQuery); | |||||
if (CollUtil.isNotEmpty(page.getRecords())) { | |||||
List<String> projectCodes = CollUtils.fieldList(page.getRecords(), ProjectEarlyWarning::getProjectCode); | |||||
Wrapper<WflowEarlyWarningRecords> wewQuery = Wrappers.lambdaQuery(WflowEarlyWarningRecords.class) | |||||
.in(WflowEarlyWarningRecords::getProjectCode, projectCodes) | |||||
.orderByDesc(WflowEarlyWarningRecords::getWarningTime); | |||||
List<WflowEarlyWarningRecords> warningRecords = earlyWarningRecordsService.list(wewQuery); | |||||
Set<String> projectCodeSet = Sets.newHashSet(); | |||||
Map<String, WflowEarlyWarningRecords> warningMap = warningRecords.stream() | |||||
.filter(w -> projectCodeSet.add(w.getProjectCode())) | |||||
.collect(Collectors.toMap(WflowEarlyWarningRecords::getProjectCode, w -> w)); | |||||
Wrapper<Project> projectQuery = Wrappers.lambdaQuery(Project.class) | |||||
.select(Project::getProjectCode, Project::getProjectName) | |||||
.in(Project::getProjectCode, projectCodes) | |||||
.eq(Project::getNewest, Boolean.TRUE); | |||||
List<Project> projects = projectService.list(projectQuery); | |||||
Map<String, String> projectNameMap = projects.stream() | |||||
.collect(Collectors.toMap(Project::getProjectCode, Project::getProjectName)); | |||||
List<ProjectEarlyWarningVO> warnings = page.getRecords().stream().map(o -> { | |||||
ProjectEarlyWarningVO vo = BeanUtil.copyProperties(o, ProjectEarlyWarningVO.class); | |||||
//取最新一条预警信息 | |||||
if (warningMap.containsKey(vo.getProjectCode())) { | |||||
WflowEarlyWarningRecords wew = warningMap.get(vo.getProjectCode()); | |||||
vo.setWarningTime(wew.getWarningTime()); | |||||
vo.setInstStart(wew.getInstStart()); | |||||
vo.setWarningUserId(wew.getWarningUserId()); | |||||
vo.setNoticeMethod(wew.getNoticeMethod()); | |||||
vo.setNoticeContent(wew.getNoticeContent()); | |||||
vo.setPath(wew.getPath()); | |||||
vo.setBatchUserIds(wew.getBatchUserIds()); | |||||
vo.setRecordId(wew.getId()); | |||||
} | |||||
vo.setProjectName(projectNameMap.get(o.getProjectCode())); | |||||
return vo; | |||||
}).filter(w -> Objects.nonNull(w.getWarningTime())) | |||||
.sorted(Comparator.comparing(ProjectEarlyWarningVO::getWarningTime).reversed()) | |||||
.collect(Collectors.toList()); | |||||
earlyWarningStat.setProjectEarlyWarnings(warnings); | |||||
} | |||||
return earlyWarningStat; | |||||
} | |||||
} | } |
@@ -1,5 +1,6 @@ | |||||
package com.hz.pm.api.workbench.model; | package com.hz.pm.api.workbench.model; | ||||
import com.hz.pm.api.sys.enumeration.ProjectEarlyWarningStatusEnum; | |||||
import io.swagger.annotations.ApiModelProperty; | import io.swagger.annotations.ApiModelProperty; | ||||
import lombok.Data; | import lombok.Data; | ||||
@@ -21,4 +22,7 @@ public class WorkbenchReq { | |||||
@ApiModelProperty("领域") | @ApiModelProperty("领域") | ||||
private Integer unitStrip; | private Integer unitStrip; | ||||
@ApiModelProperty("预警状态") | |||||
private ProjectEarlyWarningStatusEnum projectEarlyWarningStatus; | |||||
} | } |
@@ -0,0 +1,29 @@ | |||||
package com.hz.pm.api.workbench.model.vo; | |||||
import com.hz.pm.api.sys.model.vo.ProjectEarlyWarningVO; | |||||
import io.swagger.annotations.ApiModelProperty; | |||||
import lombok.Data; | |||||
import java.util.List; | |||||
/** | |||||
* <p> | |||||
* ProjectEarlyWarning | |||||
* </p> | |||||
* | |||||
* @author WendyYang | |||||
* @since 00:28 2024/8/28 | |||||
*/ | |||||
@Data | |||||
public class WorkbenchProjectEarlyWarnVO { | |||||
private Integer total; | |||||
private Integer advent; | |||||
private Integer overtime; | |||||
@ApiModelProperty("超期项目预警") | |||||
private List<ProjectEarlyWarningVO> projectEarlyWarnings; | |||||
} |
@@ -3,10 +3,8 @@ package com.hz.pm.api.workbench.model.vo; | |||||
import cn.hutool.core.util.ObjectUtil; | import cn.hutool.core.util.ObjectUtil; | ||||
import com.hz.pm.api.projectlib.model.vo.ProjectLibListItemVO; | import com.hz.pm.api.projectlib.model.vo.ProjectLibListItemVO; | ||||
import com.hz.pm.api.sys.model.vo.NoticeListItemVO; | import com.hz.pm.api.sys.model.vo.NoticeListItemVO; | ||||
import com.hz.pm.api.sys.model.vo.ProjectEarlyWarningVO; | |||||
import com.hz.pm.api.sys.model.vo.WflowEarlyWarningRecordsVO; | import com.hz.pm.api.sys.model.vo.WflowEarlyWarningRecordsVO; | ||||
import com.hz.pm.api.todocenter.model.vo.TodoCenterStatisticsVO; | import com.hz.pm.api.todocenter.model.vo.TodoCenterStatisticsVO; | ||||
import com.ningdatech.basic.model.PageVo; | |||||
import io.swagger.annotations.ApiModelProperty; | import io.swagger.annotations.ApiModelProperty; | ||||
import lombok.Data; | import lombok.Data; | ||||
@@ -25,14 +23,6 @@ import java.util.Objects; | |||||
@Data | @Data | ||||
public class WorkbenchVO { | public class WorkbenchVO { | ||||
@ApiModelProperty("待办中心统计数据 以及代办处理") | |||||
public TodoCenterStatisticsVO todoCerter; | |||||
@ApiModelProperty("单位申报管理统计数据") | |||||
public DeclaredStatistics orgDeclared; | |||||
@ApiModelProperty("区域申报管理统计数据 只有区域管理员才有数据") | |||||
public DeclaredStatistics regionDeclared; | |||||
@ApiModelProperty("项目动态") | @ApiModelProperty("项目动态") | ||||
public List<ProjectLibListItemVO> projects; | public List<ProjectLibListItemVO> projects; | ||||
@@ -40,41 +30,11 @@ public class WorkbenchVO { | |||||
@ApiModelProperty("公告列表") | @ApiModelProperty("公告列表") | ||||
public Map<String, List<NoticeListItemVO>> noticeList; | public Map<String, List<NoticeListItemVO>> noticeList; | ||||
@ApiModelProperty("预警记录") | |||||
public List<EarlyWarning> earlyWarning; | |||||
private TodoCenterStatisticsVO todoCerter; | |||||
@ApiModelProperty("项目预警记录") | @ApiModelProperty("项目预警记录") | ||||
public ProjectEarlyWarning projectEarlyWarning; | |||||
@Data | |||||
public static class ProjectEarlyWarning { | |||||
@ApiModelProperty("统计数据-累积") | |||||
private WarningStatistics accumulate; | |||||
@ApiModelProperty("统计数据-当前") | |||||
private WarningStatistics current; | |||||
@ApiModelProperty("超期项目预警") | |||||
private PageVo<ProjectEarlyWarningVO> overs; | |||||
@ApiModelProperty("临期项目预警") | |||||
private PageVo<ProjectEarlyWarningVO> advents; | |||||
public WorkbenchProjectEarlyWarnVO workbenchProjectEarlyWarnVO; | |||||
@ApiModelProperty("正常项目") | |||||
private PageVo<ProjectEarlyWarningVO> normals; | |||||
} | |||||
@Data | |||||
public static class WarningStatistics { | |||||
@ApiModelProperty("正常") | |||||
private Integer normal = 0; | |||||
@ApiModelProperty("临期") | |||||
private Integer advent = 0; | |||||
@ApiModelProperty("超期") | |||||
private Integer over = 0; | |||||
} | |||||
@Data | @Data | ||||
public static class EarlyWarning { | public static class EarlyWarning { | ||||