Browse Source

modify:

1. 重大项目评估;
tags/24091301
WendyYang 1 week ago
parent
commit
a33e3f214f
8 changed files with 154 additions and 28 deletions
  1. +1
    -1
      hz-pm-api/src/main/java/com/hz/pm/api/projectlib/helper/ProjectManageUtil.java
  2. +3
    -0
      hz-pm-api/src/main/java/com/hz/pm/api/projectlib/model/entity/Project.java
  3. +75
    -0
      hz-pm-api/src/main/java/com/hz/pm/api/scheduler/task/MajorProjectEvalTask.java
  4. +6
    -8
      hz-pm-api/src/main/java/com/hz/pm/api/sys/controller/EarlyWarningController.java
  5. +6
    -0
      hz-pm-api/src/main/java/com/hz/pm/api/workbench/controller/WorkbenchController.java
  6. +55
    -17
      hz-pm-api/src/main/java/com/hz/pm/api/workbench/manage/WorkbenchManage.java
  7. +4
    -1
      hz-pm-api/src/main/resources/application-dev.yml
  8. +4
    -1
      hz-pm-api/src/main/resources/application-prod.yml

+ 1
- 1
hz-pm-api/src/main/java/com/hz/pm/api/projectlib/helper/ProjectManageUtil.java View File

@@ -101,7 +101,7 @@ public class ProjectManageUtil {
public static void projectBaseQuery(LambdaQueryWrapper<Project> query) {
query.select(Project::getId, Project::getStage, Project::getStatus, Project::getProjectCode,
Project::getBuildOrgCode, Project::getBuildOrgName, Project::getApprovalAmount, Project::getApprovalDate,
Project::getCreateOn, Project::getProjectName, Project::getProjectYear,
Project::getCreateOn, Project::getProjectName, Project::getProjectYear, Project::getIsMajorProject,
Project::getDeclareAmount, Project::getReviewAmount, Project::getUnitStrip);
}



+ 3
- 0
hz-pm-api/src/main/java/com/hz/pm/api/projectlib/model/entity/Project.java View File

@@ -497,4 +497,7 @@ public class Project implements Serializable {
@ApiModelProperty("项目终止状态")
private Integer stoppedStatus;

@ApiModelProperty("是否是重大项目")
private Boolean isMajorProject;

}

+ 75
- 0
hz-pm-api/src/main/java/com/hz/pm/api/scheduler/task/MajorProjectEvalTask.java View File

@@ -0,0 +1,75 @@
package com.hz.pm.api.scheduler.task;

import cn.hutool.json.JSONUtil;
import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.hz.pm.api.projectlib.model.entity.Project;
import com.hz.pm.api.projectlib.service.IProjectService;
import com.hz.pm.api.user.helper.MhUnitCache;
import com.wflow.bean.dto.MajorProjectRuleDTO;
import com.wflow.bean.entity.WflowEarlyWarning;
import com.wflow.enums.WarningRuleTypeEnum;
import com.wflow.service.IEarlyWarningService;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.autoconfigure.condition.ConditionalOnExpression;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
import java.util.Optional;

/**
* <p>
* MajorProjectEvalTask
* </p>
*
* @author WendyYang
* @since 11:29 2024/9/10
*/
@Slf4j
@Component
@ConditionalOnExpression("${major-project-eval.open:true}")
@RequiredArgsConstructor
public class MajorProjectEvalTask {

private final IEarlyWarningService earlyWarningService;
private final IProjectService projectService;
private final MhUnitCache mhUnitCache;

@Scheduled(cron = "${major-project-eval.cron:0 0/3 * * * ?}")
public void doMajorProjectEval() {
Wrapper<WflowEarlyWarning> query = Wrappers.lambdaQuery(WflowEarlyWarning.class)
.eq(WflowEarlyWarning::getRuleType, WarningRuleTypeEnum.MAJOR_PROJECT.getCode())
.eq(WflowEarlyWarning::getIsOpen, Boolean.TRUE);
List<WflowEarlyWarning> earlyWarnings = earlyWarningService.list(query);
if (earlyWarnings.isEmpty()) {
return;
}
List<Project> projects = projectService.list(Wrappers.lambdaQuery(Project.class)
.select(Project::getId, Project::getReviewAmount, Project::getBuildOrgCode)
.isNotNull(Project::getReviewAmount)
.gt(Project::getReviewAmount, 0)
.eq(Project::getNewest, Boolean.TRUE));
List<Project> projectsUpdate = new ArrayList<>();
if (!projects.isEmpty()) {
for (Project project : projects) {
long unitId = Long.parseLong(project.getBuildOrgCode());
List<Long> unitIdPaths = mhUnitCache.getUnitIdPaths(unitId);
Optional<WflowEarlyWarning> earlyWarning = earlyWarnings.stream()
.filter(warning -> unitIdPaths.contains(warning.getMhUnitId()))
.max(Comparator.comparing(w -> unitIdPaths.indexOf(w.getMhUnitId())));
earlyWarning.ifPresent(warning -> {
MajorProjectRuleDTO rule = JSONUtil.toBean(warning.getRule(), MajorProjectRuleDTO.class);
boolean isMajorProject = project.getReviewAmount().compareTo(rule.getMinimumReviewAmount()) >= 0;
project.setIsMajorProject(isMajorProject);
projectsUpdate.add(project);
});
}
projectService.updateBatchById(projectsUpdate);
}
}

}

+ 6
- 8
hz-pm-api/src/main/java/com/hz/pm/api/sys/controller/EarlyWarningController.java View File

@@ -1,11 +1,10 @@
package com.hz.pm.api.sys.controller;

import com.hz.pm.api.user.helper.MhUnitCache;
import com.ningdatech.basic.model.PageVo;
import com.ningdatech.log.annotation.WebLog;
import com.hz.pm.api.sys.model.req.WarningListReq;
import com.hz.pm.api.sys.model.vo.WflowEarlyWarningRecordsVO;
import com.hz.pm.api.sys.service.IEarlyWarningRecordsService;
import com.ningdatech.basic.model.PageVo;
import com.ningdatech.log.annotation.WebLog;
import com.wflow.bean.dto.WflowEarlyWarningDTO;
import com.wflow.bean.vo.WflowEarlyWarningVO;
import com.wflow.service.IEarlyWarningService;
@@ -35,12 +34,11 @@ public class EarlyWarningController {
private final IEarlyWarningService earlyWarningService;

private final IEarlyWarningRecordsService earlyWarningRecordsService;
private final MhUnitCache mhUnitCache;

@ApiOperation(value = "预警规则获取", notes = "预警规则获取")
@GetMapping("/detail/{mhUnitId}")
public List<WflowEarlyWarningVO> detail(@PathVariable Long mhUnitId) {
return earlyWarningService.detailByMhUnitId(mhUnitId);
@GetMapping("/detail/{mhUnitId}/{ruleType}")
public List<WflowEarlyWarningVO> detail(@PathVariable Long mhUnitId, @PathVariable Integer ruleType) {
return earlyWarningService.detailByMhUnitId(mhUnitId, ruleType);
}

@ApiOperation(value = "预警规则保存", notes = "预警规则保存")
@@ -53,6 +51,6 @@ public class EarlyWarningController {
@ApiOperation(value = "预警记录查询", notes = "预警记录查询")
@GetMapping("/records/{ruleType}")
public PageVo<WflowEarlyWarningRecordsVO> records(@PathVariable Integer ruleType, WarningListReq req) {
return earlyWarningRecordsService.records(ruleType,req);
return earlyWarningRecordsService.records(ruleType, req);
}
}

+ 6
- 0
hz-pm-api/src/main/java/com/hz/pm/api/workbench/controller/WorkbenchController.java View File

@@ -95,4 +95,10 @@ public class WorkbenchController {
return workbenchManage.projectMonitorEarlyWarnings(req);
}

@GetMapping("/pageMajorProjects")
@ApiOperation("获取重大项目动态")
public PageVo<ProjectLibListItemVO> listMajorProjects(WorkbenchProjectLibReq req) {
return workbenchManage.pageMajorProjects(req);
}

}

+ 55
- 17
hz-pm-api/src/main/java/com/hz/pm/api/workbench/manage/WorkbenchManage.java View File

@@ -47,13 +47,14 @@ 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.IProjectEarlyWarningService;
import com.hz.pm.api.sys.utils.EarlyWarningUtil;
import com.hz.pm.api.todocenter.manage.TodoCenterManage;
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.TodoCenterStatisticsVO;
import com.hz.pm.api.todocenter.model.vo.TodoVO;
import com.hz.pm.api.user.helper.MhUnitCache;
import com.hz.pm.api.user.helper.MhUnitQueryAuthHelper;
import com.hz.pm.api.user.helper.MhUnitQueryAuthHelper.UnitQueryState;
import com.hz.pm.api.user.security.model.UserFullInfoDTO;
import com.hz.pm.api.user.security.model.UserInfoDetails;
import com.hz.pm.api.user.util.LoginUserUtil;
@@ -113,6 +114,7 @@ public class WorkbenchManage {
private final IProjectGovSystemReplaceInfosService systemReplaceInfosService;
private final IPurchaseStatusChangeService purchaseStatusChangeService;
private final IProjectEarlyWarningService projectEarlyWarningService;
private final MhUnitQueryAuthHelper mhUnitQueryAuthHelper;

public WorkbenchVO getWorkbenchData(Integer year) {
WorkbenchVO res = new WorkbenchVO();
@@ -801,9 +803,9 @@ public class WorkbenchManage {
UserInfoDetails userInfoDetails = LoginUserUtil.loginUserDetail();
// 从预警表中查询当前登录用户所能查看的项目
LambdaQueryWrapper<ProjectEarlyWarning> queryWrapper = Wrappers.lambdaQuery(ProjectEarlyWarning.class);
buildPermissionWarningWrapper(queryWrapper,userInfoDetails);
buildPermissionWarningWrapper(queryWrapper, userInfoDetails);
// 查询状态非正常的预警信息
queryWrapper.eq(ProjectEarlyWarning::getNormal,Boolean.FALSE);
queryWrapper.eq(ProjectEarlyWarning::getNormal, Boolean.FALSE);
queryWrapper.ne(ProjectEarlyWarning::getStatus, ProjectEarlyWarningStatusEnum.NORMAL);
if (req.getUnitStrip() != null) {
String unitStripSql = String.format("select 1 from nd_project np where " +
@@ -819,7 +821,7 @@ public class WorkbenchManage {
}

List<ProjectEarlyWarning> records = projectEarlyWarningService.list(queryWrapper);
if (Objects.nonNull(req.getUnitId())){
if (Objects.nonNull(req.getUnitId())) {
List<Long> viewUnitIds = mhUnitCache.getViewChildIdsRecursion(req.getUnitId());
List<String> queryMhUnitIdList = CollUtils.convert(viewUnitIds, String::valueOf);
records = records.stream().filter(record -> queryMhUnitIdList.contains(record.getBuildOrgCode())).collect(Collectors.toList());
@@ -860,18 +862,54 @@ public class WorkbenchManage {
}

private void buildPermissionWarningWrapper(LambdaQueryWrapper<ProjectEarlyWarning> wrapper, UserInfoDetails user) {
//如果是超管的话
if (user.hasSuperAdmin() || user.hasRegionAdmin()) {
// 可以看所有
}
// 如果是单位管理员 查看本单位及下属单位
else if (user.hasOrgAdmin()) {
List<String> viewChildIdsRecursion = mhUnitCache.getViewChildIdsRecursion(user.getMhUnitId())
.stream().map(String::valueOf).collect(Collectors.toList());
wrapper.in(ProjectEarlyWarning::getBuildOrgCode, viewChildIdsRecursion);
} else {
// 否则都只能看自己单位的
wrapper.eq(ProjectEarlyWarning::getBuildOrgCode, user.getMhUnitIdStr());
}
//如果是超管的话
if (user.hasSuperAdmin() || user.hasRegionAdmin()) {
// 可以看所有
}
// 如果是单位管理员 查看本单位及下属单位
else if (user.hasOrgAdmin()) {
List<String> viewChildIdsRecursion = mhUnitCache.getViewChildIdsRecursion(user.getMhUnitId())
.stream().map(String::valueOf).collect(Collectors.toList());
wrapper.in(ProjectEarlyWarning::getBuildOrgCode, viewChildIdsRecursion);
} else {
// 否则都只能看自己单位的
wrapper.eq(ProjectEarlyWarning::getBuildOrgCode, user.getMhUnitIdStr());
}
}

public PageVo<ProjectLibListItemVO> pageMajorProjects(WorkbenchProjectLibReq req) {
LambdaQueryWrapper<Project> query = Wrappers.lambdaQuery(Project.class)
.eq(Project::getNewest, Boolean.TRUE)
.eq(req.getProjectYear() != null, Project::getProjectYear, req.getProjectYear())
.eq(req.getUnitStrip() != null, Project::getUnitStrip, req.getUnitStrip())
.eq(Project::getIsMajorProject, Boolean.TRUE)
.orderByDesc(Project::getUpdateOn);
UnitQueryState state = mhUnitQueryAuthHelper.listCanViewUnitIds(req.getUnitId());
if (!state.isState()) {
return PageVo.empty();
}
if (CollUtil.isNotEmpty(state.getUnitIds())) {
query.in(Project::getBuildOrgCode, state.getUnitIds());
}
ProjectManageUtil.projectBaseQuery(query);
Page<Project> page = projectService.page(req.page(), query);
if (page.getTotal() == 0) {
return PageVo.empty();
}
List<ProjectLibListItemVO> data = page.getRecords().stream().map(w -> {
ProjectLibListItemVO item = new ProjectLibListItemVO();
item.setId(w.getId());
item.setStage(w.getStage());
item.setStatus(w.getStatus());
item.setProjectCode(w.getProjectCode());
item.setProjectName(w.getProjectName());
item.setBuildOrgName(w.getBuildOrgName());
item.setBuildOrgCode(w.getBuildOrgCode());
item.setDeclaredAmount(w.getDeclareAmount());
item.setReviewAmount(w.getReviewAmount());
return item;
}).collect(Collectors.toList());
return PageVo.of(data, page.getTotal());
}

}

+ 4
- 1
hz-pm-api/src/main/resources/application-dev.yml View File

@@ -231,4 +231,7 @@ random-invite:
core-pool-size: 2
thread-name-prefix: expert-invite-executor-
early-warning-without-submit:
open: true
open: false
major-project-eval:
open: true
cron: 0 0/2 8-20 * * ?

+ 4
- 1
hz-pm-api/src/main/resources/application-prod.yml View File

@@ -254,4 +254,7 @@ random-invite:
core-pool-size: 3
thread-name-prefix: expert-invite-executor-
early-warning-without-submit:
open: true
open: true
major-project-eval:
open: true
cron: 0 0/5 6-22 * * ?

Loading…
Cancel
Save