Browse Source

Merge remote-tracking branch 'origin/tmp_241012' into dev

tags/24101601
WendyYang 2 months ago
parent
commit
4264e26826
12 changed files with 249 additions and 55 deletions
  1. +2
    -1
      hz-pm-api/src/main/java/com/hz/pm/api/projectdeclared/manage/ProjectReviewManage.java
  2. +7
    -0
      hz-pm-api/src/main/java/com/hz/pm/api/projectlib/controller/ProjectGovSystemReplaceInfoController.java
  3. +36
    -18
      hz-pm-api/src/main/java/com/hz/pm/api/projectlib/helper/ProjectSaveHelper.java
  4. +36
    -4
      hz-pm-api/src/main/java/com/hz/pm/api/projectlib/manage/ProjectGovSystemReplaceInfoManage.java
  5. +13
    -2
      hz-pm-api/src/main/java/com/hz/pm/api/projectlib/manage/ProjectLibManage.java
  6. +6
    -0
      hz-pm-api/src/main/java/com/hz/pm/api/projectlib/model/dto/GovSystemReplaceInfoDTO.java
  7. +26
    -0
      hz-pm-api/src/main/java/com/hz/pm/api/projectlib/model/dto/GovSystemReplaceInfoUpgradeContentDTO.java
  8. +3
    -0
      hz-pm-api/src/main/java/com/hz/pm/api/projectlib/model/entity/Project.java
  9. +8
    -0
      hz-pm-api/src/main/java/com/hz/pm/api/projectlib/model/req/ProjectListReq.java
  10. +15
    -2
      hz-pm-api/src/main/java/com/hz/pm/api/scheduler/listener/UserTaskCreateOrFinishListener.java
  11. +91
    -27
      hz-pm-api/src/main/java/com/hz/pm/api/workbench/manage/WorkbenchManage.java
  12. +6
    -1
      hz-pm-api/src/main/java/com/hz/pm/api/workbench/model/WorkbenchProcessNode.java

+ 2
- 1
hz-pm-api/src/main/java/com/hz/pm/api/projectdeclared/manage/ProjectReviewManage.java View File

@@ -179,7 +179,7 @@ public class ProjectReviewManage {
if (!projectQueryPermission(query, user, req.getDeclaredUnitId())) { if (!projectQueryPermission(query, user, req.getDeclaredUnitId())) {
return PageVo.empty(); return PageVo.empty();
} }
Integer status = req.getStatus();
Integer status = req.clearStatus();
if (status != null) { if (status != null) {
req.setStatus(null); req.setStatus(null);
if (ProjectStatus.PROJECT_REVIEW_PASSED.eq(status)) { if (ProjectStatus.PROJECT_REVIEW_PASSED.eq(status)) {
@@ -272,6 +272,7 @@ public class ProjectReviewManage {
" and npsc.event = {0}", ProjectStateChangeEvent.COMPLIANCE_REVIEW_PASS); " and npsc.event = {0}", ProjectStateChangeEvent.COMPLIANCE_REVIEW_PASS);
} }
ProjectManageUtil.projectQuery(query, req); ProjectManageUtil.projectQuery(query, req);
ProjectManageUtil.projectBaseQuery(query);
query.eq(Project::getNewest, Boolean.TRUE) query.eq(Project::getNewest, Boolean.TRUE)
.ne(Project::getStage, ProjectStatus.STOPPED.getCode()); .ne(Project::getStage, ProjectStatus.STOPPED.getCode());
Page<Project> page = projectService.page(req.page(), query); Page<Project> page = projectService.page(req.page(), query);


+ 7
- 0
hz-pm-api/src/main/java/com/hz/pm/api/projectlib/controller/ProjectGovSystemReplaceInfoController.java View File

@@ -9,6 +9,8 @@ import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController; import org.springframework.web.bind.annotation.RestController;


import javax.servlet.http.HttpServletResponse;

/** /**
* <p> * <p>
* ProjectGovSystemReplaceInfoController * ProjectGovSystemReplaceInfoController
@@ -30,4 +32,9 @@ public class ProjectGovSystemReplaceInfoController {
return systemReplaceInfoManage.systemReplaceInfos(targetSystem); return systemReplaceInfoManage.systemReplaceInfos(targetSystem);
} }


@GetMapping("/down")
public void downTmp(HttpServletResponse response) {
systemReplaceInfoManage.downTmp(response);
}

} }

+ 36
- 18
hz-pm-api/src/main/java/com/hz/pm/api/projectlib/helper/ProjectSaveHelper.java View File

@@ -3,13 +3,16 @@ package com.hz.pm.api.projectlib.helper;
import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.collection.CollUtil; import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.ArrayUtil; import cn.hutool.core.util.ArrayUtil;
import cn.hutool.json.JSONUtil;
import com.baomidou.mybatisplus.core.conditions.Wrapper; import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.hz.pm.api.common.enumeration.CommonEnum; import com.hz.pm.api.common.enumeration.CommonEnum;
import com.hz.pm.api.performance.model.dto.ProjectCoreBusinessDTO; import com.hz.pm.api.performance.model.dto.ProjectCoreBusinessDTO;
import com.hz.pm.api.performance.model.entity.ProjectCoreBusinessIndicators; import com.hz.pm.api.performance.model.entity.ProjectCoreBusinessIndicators;
import com.hz.pm.api.performance.service.IProjectCoreBusinessIndicatorsService; import com.hz.pm.api.performance.service.IProjectCoreBusinessIndicatorsService;
import com.hz.pm.api.projectlib.entity.ProjectGovSystemReplaceInfos; import com.hz.pm.api.projectlib.entity.ProjectGovSystemReplaceInfos;
import com.hz.pm.api.projectlib.model.dto.GovSystemReplaceInfoUpgradeContentDTO;
import com.hz.pm.api.projectlib.model.dto.GovSystemReplaceInfoDTO; import com.hz.pm.api.projectlib.model.dto.GovSystemReplaceInfoDTO;
import com.hz.pm.api.projectlib.model.dto.ProjectDTO; import com.hz.pm.api.projectlib.model.dto.ProjectDTO;
import com.hz.pm.api.projectlib.model.dto.ProjectPaymentPlanDTO; import com.hz.pm.api.projectlib.model.dto.ProjectPaymentPlanDTO;
@@ -19,6 +22,7 @@ import com.hz.pm.api.projectlib.model.entity.ProjectApplication;
import com.hz.pm.api.projectlib.service.IProjectAnnualPaymentPlanService; import com.hz.pm.api.projectlib.service.IProjectAnnualPaymentPlanService;
import com.hz.pm.api.projectlib.service.IProjectApplicationService; import com.hz.pm.api.projectlib.service.IProjectApplicationService;
import com.hz.pm.api.projectlib.service.IProjectGovSystemReplaceInfosService; import com.hz.pm.api.projectlib.service.IProjectGovSystemReplaceInfosService;
import com.hz.pm.api.projectlib.service.IProjectService;
import com.hz.pm.api.user.security.model.UserInfoDetails; import com.hz.pm.api.user.security.model.UserInfoDetails;
import com.hz.pm.api.user.util.LoginUserUtil; import com.hz.pm.api.user.util.LoginUserUtil;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
@@ -44,6 +48,7 @@ import java.util.stream.Collectors;
@RequiredArgsConstructor @RequiredArgsConstructor
public class ProjectSaveHelper { public class ProjectSaveHelper {


private final IProjectService projectService;
private final IProjectApplicationService projectApplicationService; private final IProjectApplicationService projectApplicationService;
private final IProjectGovSystemReplaceInfosService projectGovSystemReplaceInfosService; private final IProjectGovSystemReplaceInfosService projectGovSystemReplaceInfosService;
private final IProjectCoreBusinessIndicatorsService projectCoreBusinessIndicatorsService; private final IProjectCoreBusinessIndicatorsService projectCoreBusinessIndicatorsService;
@@ -142,27 +147,40 @@ public class ProjectSaveHelper {
Wrapper<ProjectGovSystemReplaceInfos> delQuery = Wrappers.lambdaQuery(ProjectGovSystemReplaceInfos.class) Wrapper<ProjectGovSystemReplaceInfos> delQuery = Wrappers.lambdaQuery(ProjectGovSystemReplaceInfos.class)
.eq(ProjectGovSystemReplaceInfos::getProjectCode, projectCode); .eq(ProjectGovSystemReplaceInfos::getProjectCode, projectCode);
projectGovSystemReplaceInfosService.remove(delQuery); projectGovSystemReplaceInfosService.remove(delQuery);
if (CollUtil.isEmpty(systemReplaceInfos)) {
return;
}
List<ProjectGovSystemReplaceInfos> replaceInfos = new ArrayList<>();
for (int i = 0; i < systemReplaceInfos.size(); i++) {
GovSystemReplaceInfoDTO curr = systemReplaceInfos.get(i);
for (int i1 = 0; i1 < curr.getSourceSystemNames().size(); i1++) {
ProjectGovSystemReplaceInfos replaceInfo = new ProjectGovSystemReplaceInfos();
replaceInfo.setProjectId(projectId);
replaceInfo.setProjectCode(projectCode);
replaceInfo.setReplaceType(curr.getReplaceType());
replaceInfo.setSourceSystem(curr.getSourceSystemNames().get(i1));
replaceInfo.setTargetSystem(curr.getTargetSystemName());
replaceInfo.setBatchNo(i + 1);
if (ArrayUtil.isNotEmpty(curr.getSourceSystemIds())) {
replaceInfo.setSourceSystemId(curr.getSourceSystemIds().get(i1));
LambdaUpdateWrapper<Project> projectUpdate = Wrappers.lambdaUpdate(Project.class)
.eq(Project::getProjectCode, projectCode)
.eq(Project::getNewest, Boolean.TRUE);
if (CollUtil.isNotEmpty(systemReplaceInfos)) {
List<ProjectGovSystemReplaceInfos> replaceInfos = new ArrayList<>();
List<GovSystemReplaceInfoUpgradeContentDTO> upgradeContents = new ArrayList<>();
for (int i = 0; i < systemReplaceInfos.size(); i++) {
int batchNo = i + 1;
GovSystemReplaceInfoDTO curr = systemReplaceInfos.get(i);
for (int i1 = 0; i1 < curr.getSourceSystemNames().size(); i1++) {
ProjectGovSystemReplaceInfos replaceInfo = new ProjectGovSystemReplaceInfos();
replaceInfo.setProjectId(projectId);
replaceInfo.setProjectCode(projectCode);
replaceInfo.setReplaceType(curr.getReplaceType());
replaceInfo.setSourceSystem(curr.getSourceSystemNames().get(i1));
replaceInfo.setTargetSystem(curr.getTargetSystemName());
replaceInfo.setBatchNo(batchNo);
if (ArrayUtil.isNotEmpty(curr.getSourceSystemIds())) {
replaceInfo.setSourceSystemId(curr.getSourceSystemIds().get(i1));
}
replaceInfos.add(replaceInfo);
} }
replaceInfos.add(replaceInfo);
GovSystemReplaceInfoUpgradeContentDTO upgradeContent = new GovSystemReplaceInfoUpgradeContentDTO();
upgradeContent.setBatchNo(batchNo);
upgradeContent.setIterativeUpgradeContent(curr.getIterativeUpgradeContent());
upgradeContent.setIsAddIterativeUpgradeContent(curr.getIsAddIterativeUpgradeContent());
upgradeContents.add(upgradeContent);
} }
projectUpdate.set(Project::getIterativeUpgradeContent, JSONUtil.toJsonStr(upgradeContents));
projectGovSystemReplaceInfosService.saveBatch(replaceInfos);
} else {
projectUpdate.set(Project::getIterativeUpgradeContent, null);
} }
projectGovSystemReplaceInfosService.saveBatch(replaceInfos);
projectService.update(projectUpdate);
} }


} }

+ 36
- 4
hz-pm-api/src/main/java/com/hz/pm/api/projectlib/manage/ProjectGovSystemReplaceInfoManage.java View File

@@ -2,11 +2,14 @@ package com.hz.pm.api.projectlib.manage;


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 cn.hutool.poi.excel.ExcelUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.hz.pm.api.common.exception.ReturnException;
import com.hz.pm.api.projectlib.entity.ProjectGovSystemReplaceInfos; import com.hz.pm.api.projectlib.entity.ProjectGovSystemReplaceInfos;
import com.hz.pm.api.projectlib.model.dto.GovSystemReplaceInfoDTO; import com.hz.pm.api.projectlib.model.dto.GovSystemReplaceInfoDTO;
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.enumeration.GovSystemReplaceTypeEnum;
import com.hz.pm.api.projectlib.model.vo.SystemReplaceInfoVO; import com.hz.pm.api.projectlib.model.vo.SystemReplaceInfoVO;
import com.hz.pm.api.projectlib.model.vo.UnitProjectGovSystemReplaceVO; import com.hz.pm.api.projectlib.model.vo.UnitProjectGovSystemReplaceVO;
import com.hz.pm.api.projectlib.model.vo.UnitProjectGovSystemReplaceVO.ProjectGovSystemReplaceVO; import com.hz.pm.api.projectlib.model.vo.UnitProjectGovSystemReplaceVO.ProjectGovSystemReplaceVO;
@@ -18,10 +21,9 @@ import com.ningdatech.basic.util.CollUtils;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;


import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
import java.util.Map;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import java.util.*;
import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.atomic.AtomicInteger;
import java.util.stream.Collectors; import java.util.stream.Collectors;


@@ -112,4 +114,34 @@ public class ProjectGovSystemReplaceInfoManage {
return retDetail; return retDetail;
} }


public void downTmp(HttpServletResponse response) {
List<ProjectGovSystemReplaceInfos> replaceInfos = systemReplaceInfosService.list();
replaceInfos.removeIf(w -> StrUtil.isNotBlank(w.getSourceSystemId()));
if (replaceInfos.isEmpty()) {
throw ReturnException.wrap("暂无数据可供导出");
}
for (ProjectGovSystemReplaceInfos replaceInfo : replaceInfos) {
if (StrUtil.isNotBlank(replaceInfo.getReplaceType())) {
String replaceType = replaceInfo.getReplaceType();
String[] split = replaceType.split(",");
String replaceTypeStr = Arrays.stream(split)
.filter(NumberUtil::isNumber)
.map(w -> GovSystemReplaceTypeEnum.getVal(Integer.parseInt(w)))
.collect(Collectors.joining(","));
replaceInfo.setReplaceType(replaceTypeStr);
} else {
replaceInfo.setReplaceType(StrUtil.EMPTY);
}
}
try (ServletOutputStream sos = response.getOutputStream()) {
response.setContentType("application/vnd.ms-excel");
ExcelUtil.getWriter()
.write(replaceInfos)
.flush(sos)
.close();
} catch (Exception e) {
throw ReturnException.wrap("导出失败");
}
}

} }

+ 13
- 2
hz-pm-api/src/main/java/com/hz/pm/api/projectlib/manage/ProjectLibManage.java View File

@@ -5,6 +5,7 @@ import cn.hutool.core.bean.copier.CopyOptions;
import cn.hutool.core.collection.CollUtil; import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.lang.Assert; import cn.hutool.core.lang.Assert;
import cn.hutool.core.util.NumberUtil; import cn.hutool.core.util.NumberUtil;
import cn.hutool.json.JSONUtil;
import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.JSONObject;
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;
@@ -60,6 +61,7 @@ import com.hz.pm.api.projectlib.handle.ProcessProgressHelper;
import com.hz.pm.api.projectlib.helper.ProjectManageUtil; import com.hz.pm.api.projectlib.helper.ProjectManageUtil;
import com.hz.pm.api.projectlib.helper.ProjectSaveHelper; import com.hz.pm.api.projectlib.helper.ProjectSaveHelper;
import com.hz.pm.api.projectlib.model.constant.ProjectConstant; import com.hz.pm.api.projectlib.model.constant.ProjectConstant;
import com.hz.pm.api.projectlib.model.dto.GovSystemReplaceInfoUpgradeContentDTO;
import com.hz.pm.api.projectlib.model.dto.GovSystemReplaceInfoDTO; import com.hz.pm.api.projectlib.model.dto.GovSystemReplaceInfoDTO;
import com.hz.pm.api.projectlib.model.dto.ProjectApprovalAmountDTO; import com.hz.pm.api.projectlib.model.dto.ProjectApprovalAmountDTO;
import com.hz.pm.api.projectlib.model.dto.ProjectDTO; import com.hz.pm.api.projectlib.model.dto.ProjectDTO;
@@ -676,7 +678,7 @@ public class ProjectLibManage {
* @param projectId \ * @param projectId \
* @return \ * @return \
*/ */
private List<GovSystemReplaceInfoDTO> getGovSystemReplaceInfos(Long projectId) {
private List<GovSystemReplaceInfoDTO> getGovSystemReplaceInfos(Long projectId, String upgradeContent) {
Wrapper<ProjectGovSystemReplaceInfos> query = Wrappers.lambdaQuery(ProjectGovSystemReplaceInfos.class) Wrapper<ProjectGovSystemReplaceInfos> query = Wrappers.lambdaQuery(ProjectGovSystemReplaceInfos.class)
.eq(ProjectGovSystemReplaceInfos::getProjectId, projectId) .eq(ProjectGovSystemReplaceInfos::getProjectId, projectId)
.orderByAsc(ProjectGovSystemReplaceInfos::getId) .orderByAsc(ProjectGovSystemReplaceInfos::getId)
@@ -685,6 +687,11 @@ public class ProjectLibManage {
if (govSystemReplaceInfos.isEmpty()) { if (govSystemReplaceInfos.isEmpty()) {
return Collections.emptyList(); return Collections.emptyList();
} }
Map<Integer, GovSystemReplaceInfoUpgradeContentDTO> upgradeContentMap = new HashMap<>();
if (StrUtil.isNotBlank(upgradeContent)) {
List<GovSystemReplaceInfoUpgradeContentDTO> upgradeContents = JSONUtil.toList(upgradeContent, GovSystemReplaceInfoUpgradeContentDTO.class);
upgradeContentMap.putAll(CollUtils.listToMap(upgradeContents, GovSystemReplaceInfoUpgradeContentDTO::getBatchNo));
}
Map<Integer, List<ProjectGovSystemReplaceInfos>> replaceInfoGroup = CollUtils.group(govSystemReplaceInfos, ProjectGovSystemReplaceInfos::getBatchNo); Map<Integer, List<ProjectGovSystemReplaceInfos>> replaceInfoGroup = CollUtils.group(govSystemReplaceInfos, ProjectGovSystemReplaceInfos::getBatchNo);
return replaceInfoGroup.entrySet().stream() return replaceInfoGroup.entrySet().stream()
.sorted(Comparator.comparingInt(Map.Entry::getKey)) .sorted(Comparator.comparingInt(Map.Entry::getKey))
@@ -696,6 +703,10 @@ public class ProjectLibManage {
replaceInfo.setTargetSystemName(firstReplaceInfo.getTargetSystem()); replaceInfo.setTargetSystemName(firstReplaceInfo.getTargetSystem());
List<String> sourceSystemNames = CollUtils.fieldList(currBatchValues, ProjectGovSystemReplaceInfos::getSourceSystem); List<String> sourceSystemNames = CollUtils.fieldList(currBatchValues, ProjectGovSystemReplaceInfos::getSourceSystem);
replaceInfo.setSourceSystemNames(sourceSystemNames); replaceInfo.setSourceSystemNames(sourceSystemNames);
Optional.ofNullable(upgradeContentMap.get(w.getKey())).ifPresent(uc -> {
replaceInfo.setIterativeUpgradeContent(uc.getIterativeUpgradeContent());
replaceInfo.setIsAddIterativeUpgradeContent(uc.getIsAddIterativeUpgradeContent());
});
return replaceInfo; return replaceInfo;
}).collect(Collectors.toList()); }).collect(Collectors.toList());
} }
@@ -720,7 +731,7 @@ public class ProjectLibManage {
Map<Long, List<ProjectCoreBusinessIndicators>> coreBizMap = CollUtils.group(coreBizs, ProjectCoreBusinessIndicators::getApplicationId); Map<Long, List<ProjectCoreBusinessIndicators>> coreBizMap = CollUtils.group(coreBizs, ProjectCoreBusinessIndicators::getApplicationId);
retProjectDetail.setProjectApplications(CollUtils.convert(applications, app -> ProjectManageUtil.to(app, coreBizMap))); retProjectDetail.setProjectApplications(CollUtils.convert(applications, app -> ProjectManageUtil.to(app, coreBizMap)));
} }
retProjectDetail.setSystemReplaceInfos(getGovSystemReplaceInfos(project.getId()));
retProjectDetail.setSystemReplaceInfos(getGovSystemReplaceInfos(project.getId(), project.getIterativeUpgradeContent()));
//审批信息 //审批信息
if (StrUtils.isNotBlank(project.getInstCode())) { if (StrUtils.isNotBlank(project.getInstCode())) {
ProcessDetailReq req = new ProcessDetailReq(); ProcessDetailReq req = new ProcessDetailReq();


+ 6
- 0
hz-pm-api/src/main/java/com/hz/pm/api/projectlib/model/dto/GovSystemReplaceInfoDTO.java View File

@@ -39,6 +39,12 @@ public class GovSystemReplaceInfoDTO implements Serializable {
@ApiModelProperty("替代前系统id") @ApiModelProperty("替代前系统id")
private List<String> sourceSystemIds; private List<String> sourceSystemIds;


@ApiModelProperty("是否新增迭代升级内容")
private Boolean isAddIterativeUpgradeContent;

@ApiModelProperty("迭代升级内容")
private String iterativeUpgradeContent;

@Override @Override
public boolean equals(Object o) { public boolean equals(Object o) {
if (this == o) { if (this == o) {


+ 26
- 0
hz-pm-api/src/main/java/com/hz/pm/api/projectlib/model/dto/GovSystemReplaceInfoUpgradeContentDTO.java View File

@@ -0,0 +1,26 @@
package com.hz.pm.api.projectlib.model.dto;

import io.swagger.annotations.ApiModelProperty;
import lombok.Data;

/**
* <p>
* GOvSystemReplaceInfoUpgradeContent
* </p>
*
* @author WendyYang
* @since 14:03 2024/10/14
*/
@Data
public class GovSystemReplaceInfoUpgradeContentDTO {

@ApiModelProperty("保存时批次号")
private Integer batchNo;

@ApiModelProperty("是否新增迭代升级内容")
private Boolean isAddIterativeUpgradeContent;

@ApiModelProperty("迭代升级内容")
private String iterativeUpgradeContent;

}

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

@@ -503,4 +503,7 @@ public class Project implements Serializable {
@ApiModelProperty("是否是重大项目") @ApiModelProperty("是否是重大项目")
private Boolean isMajorProject; private Boolean isMajorProject;


@ApiModelProperty("迭代升级内容")
private String iterativeUpgradeContent;

} }

+ 8
- 0
hz-pm-api/src/main/java/com/hz/pm/api/projectlib/model/req/ProjectListReq.java View File

@@ -143,4 +143,12 @@ public class ProjectListReq extends PagePo {
return NumberUtil.parseLong(tmpBuildOrgCode, null); return NumberUtil.parseLong(tmpBuildOrgCode, null);
} }


public Integer clearStatus() {
Integer tmpStatus = this.getStatus();
if (tmpStatus != null) {
this.setStatus(null);
}
return tmpStatus;
}

} }

+ 15
- 2
hz-pm-api/src/main/java/com/hz/pm/api/scheduler/listener/UserTaskCreateOrFinishListener.java View File

@@ -74,12 +74,25 @@ public class UserTaskCreateOrFinishListener {


@EventListener(classes = NodeCreateEvent.class) @EventListener(classes = NodeCreateEvent.class)
public void onEvent(NodeCreateEvent event) { public void onEvent(NodeCreateEvent event) {
SCHEDULER.schedule(() -> handleEvent(event), instantDelay10s());
SCHEDULER.schedule(() -> {
try {
handleEvent(event);
} catch (Exception e) {
log.error("任务节点创建监听异常:{}", event, e);
}
}, instantDelay10s());
} }


@EventListener(classes = NodeCompleteEvent.class) @EventListener(classes = NodeCompleteEvent.class)
public void onEvent(NodeCompleteEvent event) { public void onEvent(NodeCompleteEvent event) {
SCHEDULER.schedule(() -> handleEvent(event), instantDelay10s());
SCHEDULER.schedule(() -> {
try {
handleEvent(event);

} catch (Exception e) {
log.error("任务节点完成监听异常:{}", event, e);
}
}, instantDelay10s());
} }


public void handleEvent(NodeCreateEvent event) { public void handleEvent(NodeCreateEvent event) {


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

@@ -15,7 +15,10 @@ 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;
import com.hz.pm.api.common.statemachine.event.*;
import com.hz.pm.api.common.statemachine.event.AbstractStateChangeEvent;
import com.hz.pm.api.common.statemachine.event.ProjectStateChangeEvent;
import com.hz.pm.api.common.statemachine.event.TenderStateChangeEvent;
import com.hz.pm.api.common.statemachine.event.XcfhxStateChangeEvent;
import com.hz.pm.api.common.util.DecimalUtil; import com.hz.pm.api.common.util.DecimalUtil;
import com.hz.pm.api.projectdeclared.model.entity.Contract; import com.hz.pm.api.projectdeclared.model.entity.Contract;
import com.hz.pm.api.projectdeclared.model.entity.Purchase; import com.hz.pm.api.projectdeclared.model.entity.Purchase;
@@ -86,6 +89,10 @@ import java.util.function.BiFunction;
import java.util.function.Predicate; import java.util.function.Predicate;
import java.util.stream.Collectors; import java.util.stream.Collectors;


import static com.hz.pm.api.common.statemachine.event.AdaptStateChangeEvent.ADAPT_INFO_PASSED;
import static com.hz.pm.api.common.statemachine.event.SelfTestStateChangeEvent.SELF_TEST_PASSED;
import static com.hz.pm.api.common.statemachine.event.TenderStateChangeEvent.SUBMIT_PURCHASE_ORG_CONFIRM;
import static com.hz.pm.api.common.statemachine.event.TestValidStateChangeEvent.TEST_VALID_INFO_PASSED;
import static com.hz.pm.api.projectlib.helper.ProjectManageUtil.projectQueryByProjectStatusChange; import static com.hz.pm.api.projectlib.helper.ProjectManageUtil.projectQueryByProjectStatusChange;
import static com.hz.pm.api.workbench.model.vo.ProjectProcessStatVO.TenderAdaptFinishStatVO; import static com.hz.pm.api.workbench.model.vo.ProjectProcessStatVO.TenderAdaptFinishStatVO;


@@ -355,6 +362,13 @@ public class WorkbenchManage {
List<Project> projects = projectService.list(query); List<Project> projects = projectService.list(query);
Map<String, List<ProjectStatusChange>> projectStatusChangeMap = new HashMap<>(); Map<String, List<ProjectStatusChange>> projectStatusChangeMap = new HashMap<>();
for (WorkbenchProcessNode node : WorkbenchProcessNode.ALL) { for (WorkbenchProcessNode node : WorkbenchProcessNode.ALL) {
if (Arrays.asList(WorkbenchProcessNode.FINISHED,
WorkbenchProcessNode.SUBMIT_START_FILE,
WorkbenchProcessNode.ORG_CONFIRM,
WorkbenchProcessNode.SELF_TEST,
WorkbenchProcessNode.TEST_VALID).contains(node)) {
continue;
}
if (!projects.isEmpty()) { if (!projects.isEmpty()) {
ProjectProcessStatVO currStat = ProjectProcessStatVO.builder() ProjectProcessStatVO currStat = ProjectProcessStatVO.builder()
.stageName(node.getName()) .stageName(node.getName())
@@ -436,13 +450,13 @@ public class WorkbenchManage {
.select(PurchaseStatusChange::getEvent, PurchaseStatusChange::getProjectId) .select(PurchaseStatusChange::getEvent, PurchaseStatusChange::getProjectId)
.in(PurchaseStatusChange::getProjectId, projectIds) .in(PurchaseStatusChange::getProjectId, projectIds)
.in(PurchaseStatusChange::getEvent, .in(PurchaseStatusChange::getEvent,
AdaptStateChangeEvent.ADAPT_INFO_PASSED,
SelfTestStateChangeEvent.SELF_TEST_PASSED,
TestValidStateChangeEvent.TEST_VALID_INFO_PASSED,
ADAPT_INFO_PASSED,
SELF_TEST_PASSED,
TEST_VALID_INFO_PASSED,
TenderStateChangeEvent.SUBMIT_FIRST_INSPECTED_FILES, TenderStateChangeEvent.SUBMIT_FIRST_INSPECTED_FILES,
XcfhxStateChangeEvent.XCFHX_APPLY_PASSED, XcfhxStateChangeEvent.XCFHX_APPLY_PASSED,
TenderStateChangeEvent.FINALLY_INSPECTED_PASSED, TenderStateChangeEvent.FINALLY_INSPECTED_PASSED,
TenderStateChangeEvent.SUBMIT_PURCHASE_ORG_CONFIRM,
SUBMIT_PURCHASE_ORG_CONFIRM,
TenderStateChangeEvent.SUBMIT_PURCHASE_CONSTRUCTION_INFO); TenderStateChangeEvent.SUBMIT_PURCHASE_CONSTRUCTION_INFO);
List<PurchaseStatusChange> purchaseChanges = purchaseStatusChangeService.list(pQuery); List<PurchaseStatusChange> purchaseChanges = purchaseStatusChangeService.list(pQuery);
Map<String, Map<Long, Long>> purchaseEventMapTmp = purchaseChanges.stream() Map<String, Map<Long, Long>> purchaseEventMapTmp = purchaseChanges.stream()
@@ -454,7 +468,7 @@ public class WorkbenchManage {
} }
break; break;
case PROJECT_ADAPTION: { case PROJECT_ADAPTION: {
List<Long> projectIds = computeProjectIds.apply(TenderStateChangeEvent.SUBMIT_PURCHASE_ORG_CONFIRM, node);
List<Long> projectIds = computeProjectIds.apply(SUBMIT_PURCHASE_ORG_CONFIRM, node);
currStat.setProjectCount(projectIds.size()); currStat.setProjectCount(projectIds.size());
Pair<Integer, Integer> replaceSystemCount = countReplaceSystemByProjectIds(projectIds); Pair<Integer, Integer> replaceSystemCount = countReplaceSystemByProjectIds(projectIds);
currStat.setSourceCount(replaceSystemCount.getKey()); currStat.setSourceCount(replaceSystemCount.getKey());
@@ -468,7 +482,7 @@ public class WorkbenchManage {
.map(Map.Entry::getKey) .map(Map.Entry::getKey)
.collect(Collectors.toList()); .collect(Collectors.toList());
if (!tmpProjectIds.isEmpty()) { if (!tmpProjectIds.isEmpty()) {
currStat.setAdaptFinishStat(tenderAdaptStatistics(tmpProjectIds));
currStat.setAdaptFinishStat(tenderAdaptStatistics(tmpProjectIds, projectPurchaseCountMap));
} }
} }
long finishPurchaseByWithoutApp = CollUtil.count(projectPurchaseCountMap.entrySet(), w -> { long finishPurchaseByWithoutApp = CollUtil.count(projectPurchaseCountMap.entrySet(), w -> {
@@ -514,26 +528,42 @@ public class WorkbenchManage {
return retData; return retData;
} }


private TenderAdaptFinishStatVO tenderAdaptStatistics(List<Long> projectIds) {
private TenderAdaptFinishStatVO tenderAdaptStatistics(List<Long> projectIds, Map<Long, List<Purchase>> projectPurchaseCountMap) {
Wrapper<PurchaseStatusChange> purchaseQuery = Wrappers.lambdaQuery(PurchaseStatusChange.class) Wrapper<PurchaseStatusChange> purchaseQuery = Wrappers.lambdaQuery(PurchaseStatusChange.class)
.select(PurchaseStatusChange::getEvent, PurchaseStatusChange::getBidId)
.select(PurchaseStatusChange::getEvent, PurchaseStatusChange::getBidId, PurchaseStatusChange::getProjectId)
.in(PurchaseStatusChange::getProjectId, projectIds) .in(PurchaseStatusChange::getProjectId, projectIds)
.in(PurchaseStatusChange::getEvent, AdaptStateChangeEvent.SUBMIT_ADAPT_INFO,
SelfTestStateChangeEvent.SUBMIT_SELF_TEST_INFO,
TestValidStateChangeEvent.SUBMIT_TEST_VALID_INFO,
TenderStateChangeEvent.SUBMIT_PURCHASE_ORG_CONFIRM);
.in(PurchaseStatusChange::getEvent, ADAPT_INFO_PASSED,
SELF_TEST_PASSED,
TEST_VALID_INFO_PASSED,
SUBMIT_PURCHASE_ORG_CONFIRM);
List<PurchaseStatusChange> statusChanges = purchaseStatusChangeService.list(purchaseQuery); List<PurchaseStatusChange> statusChanges = purchaseStatusChangeService.list(purchaseQuery);
Map<String, Integer> eventMap = statusChanges.stream()
.collect(Collectors.groupingBy(PurchaseStatusChange::getEvent,
Collectors.collectingAndThen(Collectors.mapping(PurchaseStatusChange::getBidId, Collectors.toSet()), Set::size)));
Map<Long, List<PurchaseStatusChange>> projectPurchaseStatusChangeMap = CollUtils.group(statusChanges, PurchaseStatusChange::getProjectId);
TenderAdaptFinishStatVO stat = new TenderAdaptFinishStatVO(); TenderAdaptFinishStatVO stat = new TenderAdaptFinishStatVO();
stat.setFinishTestValidCount(eventMap.getOrDefault(TestValidStateChangeEvent.SUBMIT_TEST_VALID_INFO.name(), 0));
stat.setFinishAdaptionInfo(eventMap.getOrDefault(AdaptStateChangeEvent.SUBMIT_ADAPT_INFO.name(), 0));
stat.setFinishOrgConfirmCount(eventMap.getOrDefault(TenderStateChangeEvent.SUBMIT_PURCHASE_ORG_CONFIRM.name(), 0));
stat.setFinishSelfTestCount(eventMap.getOrDefault(SelfTestStateChangeEvent.SUBMIT_SELF_TEST_INFO.name(), 0));
stat.setFinishTestValidCount(countAdaptBranchStatus(TEST_VALID_INFO_PASSED, projectIds, projectPurchaseCountMap, projectPurchaseStatusChangeMap));
stat.setFinishAdaptionInfo(countAdaptBranchStatus(ADAPT_INFO_PASSED, projectIds, projectPurchaseCountMap, projectPurchaseStatusChangeMap));
stat.setFinishOrgConfirmCount(countAdaptBranchStatus(SUBMIT_PURCHASE_ORG_CONFIRM, projectIds, projectPurchaseCountMap, projectPurchaseStatusChangeMap));
stat.setFinishSelfTestCount(countAdaptBranchStatus(SELF_TEST_PASSED, projectIds, projectPurchaseCountMap, projectPurchaseStatusChangeMap));
return stat; return stat;
} }


private static <T extends AbstractStateChangeEvent> int countAdaptBranchStatus(T event,
List<Long> projectIds,
Map<Long, List<Purchase>> projectPurchaseCountMap,
Map<Long, List<PurchaseStatusChange>> projectPurchaseChangeMap) {
return (int) projectIds.stream().filter(w -> {
int bidCount = CollUtil.count(projectPurchaseCountMap.getOrDefault(w, Collections.emptyList()),
w1 -> BidTypeEnum.BUILD_APP.eq(w1.getBidType()));
List<PurchaseStatusChange> purchaseStatusChanges = projectPurchaseChangeMap.getOrDefault(w, Collections.emptyList());
int finishedBidCount = purchaseStatusChanges.stream()
.filter(w1 -> w1.getProjectId().equals(w) && event.eq(w1.getEvent()))
.map(PurchaseStatusChange::getBidId)
.collect(Collectors.toSet()).size();
return finishedBidCount != 0 && finishedBidCount == bidCount;
}).count();
}

private static int stoppedProjectCount(Map<String, List<ProjectStatusChange>> projectStatusChangeMap, List<String> projectCodes) { private static int stoppedProjectCount(Map<String, List<ProjectStatusChange>> projectStatusChangeMap, List<String> projectCodes) {
return CollUtil.count(projectStatusChangeMap.entrySet(), return CollUtil.count(projectStatusChangeMap.entrySet(),
w -> projectCodes.contains(w.getKey()) w -> projectCodes.contains(w.getKey())
@@ -552,6 +582,9 @@ public class WorkbenchManage {


public PageVo<ProjectLibListItemVO> pageProjectLib(WorkbenchProjectLibReq req) { public PageVo<ProjectLibListItemVO> pageProjectLib(WorkbenchProjectLibReq req) {
LambdaQueryWrapper<Project> query = workbenchProjectLibQuery(req); LambdaQueryWrapper<Project> query = workbenchProjectLibQuery(req);
if (query == null) {
return PageVo.empty();
}
ProjectManageUtil.projectBaseQuery(query); ProjectManageUtil.projectBaseQuery(query);
projectQueryByProjectStatusChange(query, ProjectStateChangeEvent.PROJECT_APPLICATION_SUBMIT); projectQueryByProjectStatusChange(query, ProjectStateChangeEvent.PROJECT_APPLICATION_SUBMIT);
switch (req.getProcessNode()) { switch (req.getProcessNode()) {
@@ -572,12 +605,33 @@ public class WorkbenchManage {
case FIRST_INSPECTED: case FIRST_INSPECTED:
projectQueryByProjectStatusChange(query, ProjectStateChangeEvent.SUBMIT_FIRST_INSPECTED_FILES); projectQueryByProjectStatusChange(query, ProjectStateChangeEvent.SUBMIT_FIRST_INSPECTED_FILES);
break; break;
case ORG_CONFIRM:
case PROJECT_ADAPTION: case PROJECT_ADAPTION:
projectQueryByProjectStatusChange(query, ProjectStateChangeEvent.SUBMIT_PURCHASE_ORG_CONFIRM); projectQueryByProjectStatusChange(query, ProjectStateChangeEvent.SUBMIT_PURCHASE_ORG_CONFIRM);
break; break;
case FINAL_INSPECTED: case FINAL_INSPECTED:
projectQueryByProjectStatusChange(query, ProjectStateChangeEvent.FINAL_ACCEPTANCE_PASS); projectQueryByProjectStatusChange(query, ProjectStateChangeEvent.FINAL_ACCEPTANCE_PASS);
break; break;
case FINISHED:
projectQueryByProjectStatusChange(query, ProjectStateChangeEvent.SUBMIT_PURCHASE_CONTRACT_RECORD);
query.notExists("select 1 from nd_purchase np where np.project_id = nd_project.id and bid_type = {0}",
BidTypeEnum.BUILD_APP.getCode());
break;
case TEST_VALID:
query.apply("(select count(1) from nd_purchase np where np.project_id = nd_project.id and bid_type = {0}) " +
"= (select count(distinct bid_id) from nd_purchase_status_change npsc where npsc.project_code = nd_project.project_code " +
"and event = {1})", BidTypeEnum.BUILD_APP.getCode(), TEST_VALID_INFO_PASSED);
break;
case SELF_TEST:
query.apply("(select count(1) from nd_purchase np where np.project_id = nd_project.id and bid_type = {0}) " +
"= (select count(distinct bid_id) from nd_purchase_status_change npsc where npsc.project_code = nd_project.project_code " +
"and event = {1})", BidTypeEnum.BUILD_APP.getCode(), SELF_TEST_PASSED);
break;
case SUBMIT_START_FILE:
query.apply("(select count(1) from nd_purchase np where np.project_id = nd_project.id and bid_type = {0}) " +
"= (select count(distinct bid_id) from nd_purchase_status_change npsc where npsc.project_code = nd_project.project_code " +
"and event = {1})", BidTypeEnum.BUILD_APP.getCode(), ADAPT_INFO_PASSED);
break;
default: default:
return PageVo.empty(); return PageVo.empty();
} }
@@ -606,9 +660,12 @@ public class WorkbenchManage {
} }


public SystemReplaceInfoVO listSystemReplaceInfos(WorkbenchProjectLibReq req) { public SystemReplaceInfoVO listSystemReplaceInfos(WorkbenchProjectLibReq req) {
LambdaQueryWrapper<Project> query = workbenchProjectLibQuery(req)
.select(Project::getProjectCode, Project::getProjectName,
Project::getBuildOrgCode, Project::getBuildOrgName);
LambdaQueryWrapper<Project> query = workbenchProjectLibQuery(req);
if (query == null) {
return null;
}
query.select(Project::getProjectCode, Project::getProjectName,
Project::getBuildOrgCode, Project::getBuildOrgName);
projectQueryByProjectStatusChange(query, ProjectStateChangeEvent.PROJECT_APPLICATION_SUBMIT); projectQueryByProjectStatusChange(query, ProjectStateChangeEvent.PROJECT_APPLICATION_SUBMIT);
switch (req.getProcessNode()) { switch (req.getProcessNode()) {
case PROJECT_DECLARED: case PROJECT_DECLARED:
@@ -643,13 +700,15 @@ public class WorkbenchManage {


private LambdaQueryWrapper<Project> workbenchProjectLibQuery(WorkbenchProjectLibReq req) { private LambdaQueryWrapper<Project> workbenchProjectLibQuery(WorkbenchProjectLibReq req) {
Assert.notNull(req.getProcessNode(), "节点不能为空"); Assert.notNull(req.getProcessNode(), "节点不能为空");
Long unitId = Optional.ofNullable(req.getUnitId()).orElseGet(LoginUserUtil::getMhUnitId);
List<Long> viewUnitIds = mhUnitCache.getViewChildIdsRecursion(unitId);
return Wrappers.lambdaQuery(Project.class)
Long unitId = req.getUnitId();
UnitQueryState unitQueryState = mhUnitQueryAuthHelper.listCanViewUnitIds(unitId);
if (!unitQueryState.isState()) {
return null;
}
LambdaQueryWrapper<Project> query = Wrappers.lambdaQuery(Project.class)
.eq(req.getProjectYear() != null, Project::getProjectYear, req.getProjectYear()) .eq(req.getProjectYear() != null, Project::getProjectYear, req.getProjectYear())
.like(StrUtil.isNotBlank(req.getBuildOrg()), Project::getBuildOrgName, req.getBuildOrg()) .like(StrUtil.isNotBlank(req.getBuildOrg()), Project::getBuildOrgName, req.getBuildOrg())
.like(StrUtil.isNotBlank(req.getProjectName()), Project::getProjectName, req.getProjectName()) .like(StrUtil.isNotBlank(req.getProjectName()), Project::getProjectName, req.getProjectName())
.in(Project::getBuildOrgCode, CollUtils.convert(viewUnitIds, String::valueOf))
.ge(req.getReviewAmountMin() != null, Project::getReviewAmount, req.getReviewAmountMin()) .ge(req.getReviewAmountMin() != null, Project::getReviewAmount, req.getReviewAmountMin())
.le(req.getReviewAmountMax() != null, Project::getReviewAmount, req.getReviewAmountMax()) .le(req.getReviewAmountMax() != null, Project::getReviewAmount, req.getReviewAmountMax())
.ge(req.getApproveAmountMin() != null, Project::getApprovalAmount, req.getApproveAmountMin()) .ge(req.getApproveAmountMin() != null, Project::getApprovalAmount, req.getApproveAmountMin())
@@ -657,6 +716,11 @@ public class WorkbenchManage {
.eq(req.getUnitStrip() != null, Project::getUnitStrip, req.getUnitStrip()) .eq(req.getUnitStrip() != null, Project::getUnitStrip, req.getUnitStrip())
.eq(Project::getNewest, Boolean.TRUE) .eq(Project::getNewest, Boolean.TRUE)
.orderByDesc(Project::getUpdateOn); .orderByDesc(Project::getUpdateOn);
List<Long> unitIds = unitQueryState.getUnitIds();
if (CollUtil.isNotEmpty(unitIds)) {
query.in(Project::getBuildOrgCode, CollUtils.convert(unitIds, String::valueOf));
}
return query;
} }


private SystemReplaceInfoVO buildSystemReplaceInfos(List<Project> projects) { private SystemReplaceInfoVO buildSystemReplaceInfos(List<Project> projects) {


+ 6
- 1
hz-pm-api/src/main/java/com/hz/pm/api/workbench/model/WorkbenchProcessNode.java View File

@@ -27,7 +27,12 @@ public enum WorkbenchProcessNode {
PROJECT_PURCHASE("已采购", 5), PROJECT_PURCHASE("已采购", 5),
PROJECT_ADAPTION("已适配改造", 6), PROJECT_ADAPTION("已适配改造", 6),
FIRST_INSPECTED("已初验", 9), FIRST_INSPECTED("已初验", 9),
FINAL_INSPECTED("已终验", 12);
FINAL_INSPECTED("已终验", 12),
FINISHED("已完成", 13),
SUBMIT_START_FILE("上传开工文件", 10),
TEST_VALID("监理核实验证", 14),
SELF_TEST("系统自测", 15),
ORG_CONFIRM("单位确认", 16);




private final String name; private final String name;


Loading…
Cancel
Save