diff --git a/hz-pm-api/src/main/java/com/hz/pm/api/common/model/constant/CommonConst.java b/hz-pm-api/src/main/java/com/hz/pm/api/common/model/constant/CommonConst.java
index 47d4131..e6206dc 100644
--- a/hz-pm-api/src/main/java/com/hz/pm/api/common/model/constant/CommonConst.java
+++ b/hz-pm-api/src/main/java/com/hz/pm/api/common/model/constant/CommonConst.java
@@ -11,27 +11,6 @@ public interface CommonConst {
Integer EXPORT_PAGE_NUMBER = 1;
Integer EXPORT_PAGE_SIZE = 100000;
- String CALL_STATUS = "status";
- String CALL_STATUS_OK_VALUE = "ok";
-
- Integer COMMENT_MAX_SIZE = 163;
- Integer SUB_COMMENT_SIZE_MIN = 0;
- Integer SUB_COMMENT_SIZE_MAX = 160;
-
- String PROJECT_DECLARE = "项目申报";
- String UNIT_INNER_AUDIT = "单位内部审核";
- String PRELIMINARY_PREVIEW = "项目预审";
-
- String DEPT_UNITED_REVIEW = "部门联审";
- String PROVINCE_UNITED_REVIEW = "省级部门联审";
- String ANNUAL_PLAN = "年度计划";
- String CONSTRUCTION_PLAN_REVIEW = "建设方案评审";
- String PROJECT_APPROVAL = "立项批复";
- String TENDER_PURCHASE = "招标采购";
- String PROJECT_PRELIMINARY_INSPECTION = "项目初验";
- String PROJECT_FINAL_INSPECTION = "项目终验";
-
- String ARCHIVED = "归档";
String FILE_NAME = "name";
String BASIS_FILE_NAME = "fileName";
diff --git a/hz-pm-api/src/main/java/com/hz/pm/api/projectdeclared/service/IPurchaseInstService.java b/hz-pm-api/src/main/java/com/hz/pm/api/projectdeclared/service/IPurchaseInstService.java
index b11645e..1b439b5 100644
--- a/hz-pm-api/src/main/java/com/hz/pm/api/projectdeclared/service/IPurchaseInstService.java
+++ b/hz-pm-api/src/main/java/com/hz/pm/api/projectdeclared/service/IPurchaseInstService.java
@@ -3,10 +3,14 @@ package com.hz.pm.api.projectdeclared.service;
import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.service.IService;
+import com.hz.pm.api.common.util.BizUtils;
import com.hz.pm.api.projectdeclared.model.entity.PurchaseInst;
+import com.hz.pm.api.projectlib.model.enumeration.InstTypeEnum;
import java.util.Collection;
+import java.util.Comparator;
import java.util.List;
+import java.util.Map;
/**
*
@@ -31,4 +35,12 @@ public interface IPurchaseInstService extends IService {
return list(query);
}
+ default Map list(Collection purchaseIds, Integer instType) {
+ List instances = list(Wrappers.lambdaQuery(PurchaseInst.class)
+ .in(PurchaseInst::getBidId, purchaseIds)
+ .eq(PurchaseInst::getInstType, instType));
+ return BizUtils.groupFirstMap(instances, PurchaseInst::getBidId,
+ Comparator.comparing(PurchaseInst::getCreateOn).reversed());
+ }
+
}
diff --git a/hz-pm-api/src/main/java/com/hz/pm/api/projectlib/handle/AbstractProcessBusinessHandle.java b/hz-pm-api/src/main/java/com/hz/pm/api/projectlib/handle/AbstractProcessBusinessHandle.java
index 976e526..65cd5db 100644
--- a/hz-pm-api/src/main/java/com/hz/pm/api/projectlib/handle/AbstractProcessBusinessHandle.java
+++ b/hz-pm-api/src/main/java/com/hz/pm/api/projectlib/handle/AbstractProcessBusinessHandle.java
@@ -2,6 +2,9 @@ package com.hz.pm.api.projectlib.handle;
import com.hz.pm.api.projectlib.model.entity.Project;
import com.wflow.workflow.bean.vo.ProcessDetailVO;
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+import org.springframework.core.Ordered;
import java.util.List;
@@ -12,7 +15,7 @@ import java.util.List;
* @since 2023/02/24 14:22
*/
-public abstract class AbstractProcessBusinessHandle {
+public abstract class AbstractProcessBusinessHandle implements Ordered {
/**
* 构造,子类必须实现
*/
@@ -28,7 +31,29 @@ public abstract class AbstractProcessBusinessHandle {
*/
abstract void businessHandle(Project project, List processSchedule);
- abstract Integer getOrder();
+ abstract ProcessNode getProcessNode();
+
+ @Getter
+ @AllArgsConstructor
+ enum ProcessNode {
+
+ PROJECT_DECLARED("项目申报", 1),
+ PROJECT_REVIEW("项目评审", 2),
+ APPROVAL_AMOUNT("资金下达", 3),
+ PROJECT_APPROVAL("项目立项", 4),
+ PROJECT_PURCHASE("招标采购", 5),
+ PROJECT_ADAPTION("适配改造", 6),
+ SYSTEM_SELF_TEST("系统自测", 7),
+ SYSTEM_TEST_VALID("测试验证", 8),
+ FIRST_INSPECTED("项目初验", 9),
+ PILOT_RUNNING("上线试运行", 10),
+ XCFHX_REVIEW("信创测评", 11),
+ FINAL_INSPECTED("项目终验", 12);
+
+
+ private final String name;
+ private final Integer order;
+
+ }
- abstract void setOrder(Integer order);
}
diff --git a/hz-pm-api/src/main/java/com/hz/pm/api/projectlib/handle/AnnualPlanHandle.java b/hz-pm-api/src/main/java/com/hz/pm/api/projectlib/handle/AnnualPlanHandle.java
deleted file mode 100644
index 23b3327..0000000
--- a/hz-pm-api/src/main/java/com/hz/pm/api/projectlib/handle/AnnualPlanHandle.java
+++ /dev/null
@@ -1,121 +0,0 @@
-package com.hz.pm.api.projectlib.handle;
-
-import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
-import com.baomidou.mybatisplus.core.toolkit.Wrappers;
-import com.hz.pm.api.common.model.constant.BizConst;
-import com.hz.pm.api.common.model.constant.CommonConst;
-import com.hz.pm.api.common.statemachine.event.ProjectStateChangeEvent;
-import com.hz.pm.api.projectlib.model.enumeration.ProjectStatusEnum;
-import com.hz.pm.api.projectlib.model.entity.Project;
-import com.hz.pm.api.projectlib.model.entity.ProjectStatusChange;
-import com.hz.pm.api.projectlib.service.IProjectStatusChangeService;
-import com.hz.pm.api.projectlib.service.IProjectService;
-import com.ningdatech.basic.util.CollUtils;
-import com.wflow.workflow.bean.vo.ProcessDetailVO;
-import com.wflow.workflow.enums.StepStatusEnum;
-import org.springframework.core.annotation.Order;
-import org.springframework.stereotype.Component;
-
-import java.util.Arrays;
-import java.util.List;
-import java.util.Objects;
-
-import static com.hz.pm.api.projectlib.model.enumeration.ProjectStatusEnum.*;
-
-/**
- * 年度计划处理
- *
- * @author CMM
- * @since 2023/02/24 14:35
- */
-@Order(6)
-@Component
-public class AnnualPlanHandle extends AbstractProcessBusinessHandle {
- private final IProjectStatusChangeService projectStatusChangeService;
- private final IProjectService projectService;
-
- private Integer order = 6;
-
- /**
- * 项目状态为:年度计划中之前的状态
- */
- private static final List ANNUAL_PLAN_LIST_STATUS = Arrays.asList(
- NOT_APPROVED,
- UNDER_INTERNAL_AUDIT,
- UNDER_INTERNAL_AUDIT_NOT_PASS,
- PENDING_PREQUALIFICATION,
- JOINT_REVIEW_BY_PROVINCIAL_DEPARTMENTS,
- JOINT_REVIEW_BY_PROVINCIAL_DEPARTMENTS_SUCCESS,
- THE_JOINT_REVIEW_OF_PROVINCIAL_DEPARTMENTS_FAILED,
- PRE_APPLYING,
- PREQUALIFICATION_FAILED,
- DEPARTMENT_JOINT_REVIEW,
- DEPARTMENT_JOINT_REVIEW_FAILED
- );
-
- public AnnualPlanHandle(IProjectStatusChangeService projectStatusChangeService, IProjectService projectService) {
- this.projectStatusChangeService = projectStatusChangeService;
- this.projectService = projectService;
- }
-
- @Override
- void businessHandle(Project project, List processSchedule) {
- ProcessDetailVO processDetailVO = new ProcessDetailVO();
- // 根据项目状态判断年度计划是否开始
- Integer status = project.getStatus();
- List fieldList = CollUtils.fieldList(ANNUAL_PLAN_LIST_STATUS, ProjectStatusEnum::getCode);
-
- //查出历史版本的 所有项目ID
- List allVersionProjectIds = projectService.allVersionProjectIds(project.getProjectCode());
-
- // 项目状态为年度计划中之前的状态
- if (fieldList.contains(status)) {
- processDetailVO.setStepStatus(StepStatusEnum.NOT_START);
- processDetailVO.setProcessName(CommonConst.ANNUAL_PLAN);
- processSchedule.add(processDetailVO);
- return;
- }
-
- // 项目状态为年度计划中
- LambdaQueryWrapper pscQuery = Wrappers.lambdaQuery(ProjectStatusChange.class)
- .in(ProjectStatusChange::getProjectId, allVersionProjectIds)
- .last(BizConst.LIMIT_1);
- if (ProjectStatusEnum.IN_THE_ANNUAL_PLAN.getCode().equals(status)) {
- // 根据部门联审通过的时间获取
- pscQuery.eq(ProjectStatusChange::getEvent, ProjectStateChangeEvent.DEPARTMENT_UNITED_REVIEW_PASS);
- ProjectStatusChange projectStatusChange = projectStatusChangeService.getOne(pscQuery);
- if (Objects.nonNull(projectStatusChange)) {
- processDetailVO.setFinishTime(projectStatusChange.getCreateOn());
- processDetailVO.setStepStatus(StepStatusEnum.ON_GOING);
- }
- } else if (ProjectStatusEnum.BE_SUSPENDED.getCode().equals(status)) {
- // 根据年度计划暂缓的时间获取
- pscQuery.eq(ProjectStatusChange::getEvent, ProjectStateChangeEvent.ANNUAL_PLAN_SUSPEND);
- ProjectStatusChange projectStatusChange = projectStatusChangeService.getOne(pscQuery);
- if (Objects.nonNull(projectStatusChange)) {
- processDetailVO.setFinishTime(projectStatusChange.getCreateOn());
- processDetailVO.setStepStatus(StepStatusEnum.REJECTED);
- }
- } else {
- // 根据开启方案申报的时间获取
- pscQuery.eq(ProjectStatusChange::getEvent, ProjectStateChangeEvent.ANNUAL_PLAN_PROJECT_OPEN_PLAN_DECLARE);
- ProjectStatusChange projectStatusChange = projectStatusChangeService.getOne(pscQuery);
- if (Objects.nonNull(projectStatusChange)) {
- processDetailVO.setFinishTime(projectStatusChange.getCreateOn());
- processDetailVO.setStepStatus(StepStatusEnum.COMPLETED);
- }
- }
- processDetailVO.setProcessName(CommonConst.ANNUAL_PLAN);
- processSchedule.add(processDetailVO);
- }
-
- @Override
- Integer getOrder() {
- return order;
- }
-
- @Override
- void setOrder(Integer order) {
- this.order = order;
- }
-}
diff --git a/hz-pm-api/src/main/java/com/hz/pm/api/projectlib/handle/ApprovalAmountHandle.java b/hz-pm-api/src/main/java/com/hz/pm/api/projectlib/handle/ApprovalAmountHandle.java
new file mode 100644
index 0000000..05359f1
--- /dev/null
+++ b/hz-pm-api/src/main/java/com/hz/pm/api/projectlib/handle/ApprovalAmountHandle.java
@@ -0,0 +1,38 @@
+package com.hz.pm.api.projectlib.handle;
+
+import com.hz.pm.api.projectlib.model.entity.Project;
+import com.wflow.workflow.bean.vo.ProcessDetailVO;
+import com.wflow.workflow.enums.StepStatusEnum;
+import org.springframework.stereotype.Component;
+
+import java.util.List;
+
+/**
+ *
+ * ApprovalAmountHandle
+ *
+ *
+ * @author WendyYang
+ * @since 21:02 2024/4/8
+ */
+@Component
+public class ApprovalAmountHandle extends AbstractProcessBusinessHandle {
+
+ @Override
+ void businessHandle(Project project, List processSchedule) {
+ ProcessDetailVO detail = new ProcessDetailVO();
+ processSchedule.add(detail);
+ detail.setProcessName(getProcessNode().getName());
+ detail.setStepStatus(project.getApprovalAmount() != null ? StepStatusEnum.COMPLETED : StepStatusEnum.NOT_START);
+ }
+
+ @Override
+ ProcessNode getProcessNode() {
+ return ProcessNode.APPROVAL_AMOUNT;
+ }
+
+ @Override
+ public int getOrder() {
+ return getProcessNode().getOrder();
+ }
+}
diff --git a/hz-pm-api/src/main/java/com/hz/pm/api/projectlib/handle/ArchivedHandle.java b/hz-pm-api/src/main/java/com/hz/pm/api/projectlib/handle/ArchivedHandle.java
deleted file mode 100644
index acf3c66..0000000
--- a/hz-pm-api/src/main/java/com/hz/pm/api/projectlib/handle/ArchivedHandle.java
+++ /dev/null
@@ -1,78 +0,0 @@
-package com.hz.pm.api.projectlib.handle;
-
-
-import java.util.List;
-import java.util.Objects;
-
-import com.hz.pm.api.common.model.constant.BizConst;
-import com.hz.pm.api.projectlib.model.entity.Project;
-import com.hz.pm.api.projectlib.service.IProjectService;
-import com.wflow.workflow.bean.vo.ProcessDetailVO;
-import com.wflow.workflow.enums.StepStatusEnum;
-import org.springframework.core.annotation.Order;
-import org.springframework.stereotype.Component;
-import com.baomidou.mybatisplus.core.toolkit.Wrappers;
-import com.hz.pm.api.common.model.constant.CommonConst;
-import com.hz.pm.api.common.statemachine.event.ProjectStateChangeEvent;
-import com.hz.pm.api.projectlib.model.enumeration.ProjectStatusEnum;
-import com.hz.pm.api.projectlib.model.entity.ProjectStatusChange;
-import com.hz.pm.api.projectlib.service.IProjectStatusChangeService;
-
-/**
- * 归档处理
- *
- * @author CMM
- * @since 2023/02/24 14:35
- */
-@Order(12)
-@Component
-public class ArchivedHandle extends AbstractProcessBusinessHandle {
- private final IProjectService projectService;
- private final IProjectStatusChangeService projectStatusChangeService;
-
- private Integer order = 12;
-
- public ArchivedHandle( IProjectService projectService, IProjectStatusChangeService projectStatusChangeService){
- this.projectService = projectService;
- this.projectStatusChangeService = projectStatusChangeService;
- }
-
- @Override
- void businessHandle(Project project, List processSchedule) {
- ProcessDetailVO processDetailVO = new ProcessDetailVO();
- Integer status = project.getStage();
- //查出历史版本的 所有项目ID
- List allVersionProjectIds = projectService.allVersionProjectIds(project.getProjectCode());
- // 根据项目阶段判断是否已归档
- // 项目阶段不为已归档
- if (!ProjectStatusEnum.ARCHIVED.getCode().equals(status)){
- processDetailVO.setStepStatus(StepStatusEnum.NOT_START);
- processDetailVO.setProcessName(CommonConst.ARCHIVED);
- processSchedule.add(processDetailVO);
- return;
- }
- // 项目阶段为已归档
- processDetailVO.setStepStatus(StepStatusEnum.COMPLETED);
- // 根据项目终验获取归档时间
- ProjectStatusChange projectStatusChange = projectStatusChangeService.getOne(Wrappers.lambdaQuery(ProjectStatusChange.class)
- .in(ProjectStatusChange::getProjectId, allVersionProjectIds)
- .eq(ProjectStatusChange::getEvent, ProjectStateChangeEvent.FINAL_ACCEPTANCE_PASS.name())
- .orderByDesc(ProjectStatusChange::getCreateOn)
- .last(BizConst.LIMIT_1));
- if(Objects.nonNull(projectStatusChange)){
- processDetailVO.setFinishTime(projectStatusChange.getCreateOn());
- processDetailVO.setProcessName(CommonConst.ARCHIVED);
- }
- processSchedule.add(processDetailVO);
- }
-
- @Override
- Integer getOrder() {
- return order;
- }
-
- @Override
- void setOrder(Integer order) {
- this.order = order;
- }
-}
diff --git a/hz-pm-api/src/main/java/com/hz/pm/api/projectlib/handle/ConstructionPlanReviewHandle.java b/hz-pm-api/src/main/java/com/hz/pm/api/projectlib/handle/ConstructionPlanReviewHandle.java
deleted file mode 100644
index 9e198dc..0000000
--- a/hz-pm-api/src/main/java/com/hz/pm/api/projectlib/handle/ConstructionPlanReviewHandle.java
+++ /dev/null
@@ -1,125 +0,0 @@
-package com.hz.pm.api.projectlib.handle;
-
-import cn.hutool.core.collection.CollUtil;
-import com.baomidou.mybatisplus.core.toolkit.Wrappers;
-import com.google.common.collect.Lists;
-import com.hz.pm.api.common.model.constant.BizConst;
-import com.hz.pm.api.common.model.constant.CommonConst;
-import com.hz.pm.api.projectlib.model.enumeration.InstTypeEnum;
-import com.hz.pm.api.projectlib.model.entity.Project;
-import com.hz.pm.api.projectlib.model.entity.ProjectInst;
-import com.hz.pm.api.projectlib.service.IProjectInstService;
-import com.hz.pm.api.projectlib.service.IProjectService;
-import com.hz.pm.api.projectlib.utils.ProjectVersionUtil;
-import com.hz.pm.api.todocenter.constant.TodoCenterConst;
-import com.hz.pm.api.todocenter.utils.BuildUserUtils;
-import com.ningdatech.basic.util.NdDateUtils;
-import com.wflow.workflow.bean.process.ProgressNode;
-import com.wflow.workflow.bean.vo.ProcessDetailVO;
-import com.wflow.workflow.bean.vo.ProcessProgressVo;
-import com.wflow.workflow.enums.ProcessStatusEnum;
-import com.wflow.workflow.enums.StepStatusEnum;
-import com.wflow.workflow.service.ProcessInstanceService;
-import org.springframework.core.annotation.Order;
-import org.springframework.stereotype.Component;
-
-import java.time.LocalDateTime;
-import java.util.List;
-import java.util.Objects;
-
-/**
- * 建设方案评审处理
- *
- * @author CMM
- * @since 2023/02/24 14:35
- */
-@Order(7)
-@Component
-public class ConstructionPlanReviewHandle extends AbstractProcessBusinessHandle {
-
- private final IProjectInstService projectInstService;
- private final ProcessInstanceService processInstanceService;
- private final BuildUserUtils buildUserUtils;
- private final ProjectVersionUtil projectVersionUtil;
- private final IProjectService projectService;
-
- private Integer order = 7;
-
- public ConstructionPlanReviewHandle(IProjectInstService projectInstService, ProcessInstanceService processInstanceService, BuildUserUtils buildUserUtils, ProjectVersionUtil projectVersionUtil, IProjectService projectService) {
- this.projectInstService = projectInstService;
- this.processInstanceService = processInstanceService;
- this.buildUserUtils = buildUserUtils;
- this.projectVersionUtil = projectVersionUtil;
- this.projectService = projectService;
- }
-
- @Override
- void businessHandle(Project project, List processSchedule) {
- ProcessDetailVO processDetailVO = new ProcessDetailVO();
- //查出历史版本的 所有项目ID
- Long projectId = project.getId();
- List allVersionProjectIds = projectService.allVersionProjectIds(project.getProjectCode());
- // 根据项目ID查询出建设方案评审流程的流程状态
- ProjectInst projectInst = projectInstService.getOne(Wrappers.lambdaQuery(ProjectInst.class)
- .in(ProjectInst::getProjectId, allVersionProjectIds)
- .eq(ProjectInst::getInstType, InstTypeEnum.CONSTRUCTION_PLAN_REVIEW.getCode())
- .ne(ProjectInst::getInstCode, TodoCenterConst.Declared.NULL_INST_CODE)
- .orderByDesc(ProjectInst::getCreateOn)
- .last(BizConst.LIMIT_1));
- ProcessProgressVo instanceDetail = null;
- // 未找到当前版本项目的建设方案审核流程且当前项目版本号大于1(是被驳回重新申报的项目)
- if (Objects.isNull(projectInst)) {
- if (project.getVersion() > CommonConst.VERSION_ONE) {
- // 获取上个版本的信息
- instanceDetail = projectVersionUtil.getPreVerProcessInfo(projectId, InstTypeEnum.CONSTRUCTION_PLAN_REVIEW);
- }
- } else {
- String instCode = projectInst.getInstCode();
- instanceDetail = processInstanceService.getProgressInstanceDetail(null, instCode);
- }
- if (Objects.isNull(instanceDetail)) {
- processDetailVO.setStepStatus(StepStatusEnum.NOT_START);
- processDetailVO.setProcessName(CommonConst.CONSTRUCTION_PLAN_REVIEW);
- processSchedule.add(processDetailVO);
- return;
- }
- String status = instanceDetail.getStatus();
- if (ProcessStatusEnum.UNDER_REVIEW.getDesc().equals(status)) {
- processDetailVO.setStepStatus(StepStatusEnum.ON_GOING);
- } else if (ProcessStatusEnum.BE_REJECTED.getDesc().equals(status)) {
- processDetailVO.setStepStatus(StepStatusEnum.REJECTED);
- } else if (ProcessStatusEnum.APPROVED.getDesc().equals(status)) {
- processDetailVO.setStepStatus(StepStatusEnum.COMPLETED);
- }
-
- // 装配节点审核人员信息
- List progressInfo = instanceDetail.getProgressInfo();
- if (CollUtil.isNotEmpty(progressInfo)) {
- buildUserUtils.buildUserByProcessInfo(progressInfo);
- // 根据流程处理详情获取流程完成时间
- if (StepStatusEnum.contains(processDetailVO.getStepStatus(),
- Lists.newArrayList(StepStatusEnum.REJECTED,
- StepStatusEnum.COMPLETED))) {
- ProgressNode progressNode = progressInfo.get(progressInfo.size() - 1);
- LocalDateTime finishTime = NdDateUtils.date2LocalDateTime(progressNode.getFinishTime());
- processDetailVO.setFinishTime(finishTime);
- }
- } else {
- LocalDateTime finishTime = NdDateUtils.date2LocalDateTime(instanceDetail.getStartTime());
- processDetailVO.setFinishTime(finishTime);
- }
- processDetailVO.setProcessProgressVo(instanceDetail);
- processDetailVO.setProcessName(CommonConst.CONSTRUCTION_PLAN_REVIEW);
- processSchedule.add(processDetailVO);
- }
-
- @Override
- Integer getOrder() {
- return order;
- }
-
- @Override
- void setOrder(Integer order) {
- this.order = order;
- }
-}
diff --git a/hz-pm-api/src/main/java/com/hz/pm/api/projectlib/handle/DeptUnitedReviewHandle.java b/hz-pm-api/src/main/java/com/hz/pm/api/projectlib/handle/DeptUnitedReviewHandle.java
deleted file mode 100644
index f3d76da..0000000
--- a/hz-pm-api/src/main/java/com/hz/pm/api/projectlib/handle/DeptUnitedReviewHandle.java
+++ /dev/null
@@ -1,117 +0,0 @@
-package com.hz.pm.api.projectlib.handle;
-
-import cn.hutool.core.collection.CollUtil;
-import com.baomidou.mybatisplus.core.toolkit.Wrappers;
-import com.google.common.collect.Lists;
-import com.hz.pm.api.common.model.constant.BizConst;
-import com.hz.pm.api.common.model.constant.CommonConst;
-import com.hz.pm.api.projectlib.model.entity.Project;
-import com.hz.pm.api.projectlib.model.enumeration.InstTypeEnum;
-import com.hz.pm.api.projectlib.model.entity.ProjectInst;
-import com.hz.pm.api.projectlib.service.IProjectInstService;
-import com.hz.pm.api.projectlib.service.IProjectService;
-import com.hz.pm.api.todocenter.constant.TodoCenterConst;
-import com.hz.pm.api.todocenter.utils.BuildUserUtils;
-import com.ningdatech.basic.util.NdDateUtils;
-import com.wflow.workflow.bean.process.ProgressNode;
-import com.wflow.workflow.bean.vo.ProcessDetailVO;
-import com.wflow.workflow.bean.vo.ProcessProgressVo;
-import com.wflow.workflow.enums.ProcessStatusEnum;
-import com.wflow.workflow.enums.StepStatusEnum;
-import com.wflow.workflow.service.ProcessInstanceService;
-import org.springframework.core.annotation.Order;
-import org.springframework.stereotype.Component;
-
-import java.time.LocalDateTime;
-import java.util.List;
-import java.util.Objects;
-
-/**
- * 部门联审审核处理
- *
- * @author CMM
- * @since 2023/02/24 14:35
- */
-@Order(5)
-@Component
-public class DeptUnitedReviewHandle extends AbstractProcessBusinessHandle {
-
- private final IProjectInstService projectInstService;
-
- private final IProjectService projectService;
- private final ProcessInstanceService processInstanceService;
- private final BuildUserUtils buildUserUtils;
-
- private Integer order = 5;
-
- public DeptUnitedReviewHandle(IProjectInstService projectInstService,
- IProjectService projectService,
- ProcessInstanceService processInstanceService,
- BuildUserUtils buildUserUtils) {
- this.projectInstService = projectInstService;
- this.projectService = projectService;
- this.processInstanceService = processInstanceService;
- this.buildUserUtils = buildUserUtils;
- }
-
- @Override
- void businessHandle(Project project, List processSchedule) {
- ProcessDetailVO retProcessDetail = new ProcessDetailVO();
- Long projectId = project.getId();
- //查出历史版本的 所有项目ID
- List allVersionProjectIds = projectService.allVersionProjectIds(projectId);
-
- // 根据项目ID查询出部门联审流程的流程状态
- ProjectInst projectInst = projectInstService.getOne(Wrappers.lambdaQuery(ProjectInst.class)
- .in(ProjectInst::getProjectId, allVersionProjectIds)
- .eq(ProjectInst::getInstType, InstTypeEnum.DEPT_UNITED_REVIEW.getCode())
- .ne(ProjectInst::getInstCode, TodoCenterConst.Declared.NULL_INST_CODE)
- .orderByDesc(ProjectInst::getCreateOn)
- .last(BizConst.LIMIT_1));
- if (Objects.isNull(projectInst)) {
- retProcessDetail.setStepStatus(StepStatusEnum.NOT_START);
- retProcessDetail.setProcessName(CommonConst.DEPT_UNITED_REVIEW);
- processSchedule.add(retProcessDetail);
- return;
- }
- String instCode = projectInst.getInstCode();
- ProcessProgressVo instanceDetail = processInstanceService.getProgressInstanceDetail(null, instCode);
- String status = instanceDetail.getStatus();
- if (ProcessStatusEnum.UNDER_REVIEW.getDesc().equals(status)) {
- retProcessDetail.setStepStatus(StepStatusEnum.ON_GOING);
- } else if (ProcessStatusEnum.BE_REJECTED.getDesc().equals(status)) {
- retProcessDetail.setStepStatus(StepStatusEnum.REJECTED);
- } else if (ProcessStatusEnum.APPROVED.getDesc().equals(status)) {
- retProcessDetail.setStepStatus(StepStatusEnum.COMPLETED);
- }
- // 装配节点审核人员信息
- List progressInfo = instanceDetail.getProgressInfo();
- if (CollUtil.isNotEmpty(progressInfo)) {
- buildUserUtils.buildUserByProcessInfo(progressInfo);
- // 根据流程处理详情获取流程完成时间
- if (StepStatusEnum.contains(retProcessDetail.getStepStatus(),
- Lists.newArrayList(StepStatusEnum.REJECTED,
- StepStatusEnum.COMPLETED))) {
- ProgressNode progressNode = progressInfo.get(progressInfo.size() - 1);
- LocalDateTime finishTime = NdDateUtils.date2LocalDateTime(progressNode.getFinishTime());
- retProcessDetail.setFinishTime(finishTime);
- }
- } else {
- LocalDateTime finishTime = NdDateUtils.date2LocalDateTime(instanceDetail.getStartTime());
- retProcessDetail.setFinishTime(finishTime);
- }
- retProcessDetail.setProcessProgressVo(instanceDetail);
- retProcessDetail.setProcessName(CommonConst.DEPT_UNITED_REVIEW);
- processSchedule.add(retProcessDetail);
- }
-
- @Override
- Integer getOrder() {
- return order;
- }
-
- @Override
- void setOrder(Integer order) {
- this.order = order;
- }
-}
diff --git a/hz-pm-api/src/main/java/com/hz/pm/api/projectlib/handle/FinalInspectionHandle.java b/hz-pm-api/src/main/java/com/hz/pm/api/projectlib/handle/FinalInspectionHandle.java
new file mode 100644
index 0000000..ddfd255
--- /dev/null
+++ b/hz-pm-api/src/main/java/com/hz/pm/api/projectlib/handle/FinalInspectionHandle.java
@@ -0,0 +1,80 @@
+package com.hz.pm.api.projectlib.handle;
+
+import com.hz.pm.api.projectdeclared.model.entity.Purchase;
+import com.hz.pm.api.projectdeclared.model.entity.PurchaseInst;
+import com.hz.pm.api.projectdeclared.service.IPurchaseInstService;
+import com.hz.pm.api.projectdeclared.service.IPurchaseService;
+import com.hz.pm.api.projectlib.model.entity.Project;
+import com.hz.pm.api.projectlib.model.enumeration.InstTypeEnum;
+import com.hz.pm.api.projectlib.model.enumeration.TenderStatusEnum;
+import com.hz.pm.api.todocenter.utils.BuildUserUtils;
+import com.wflow.workflow.bean.vo.ProcessDetailVO;
+import com.wflow.workflow.bean.vo.ProcessInfoVO;
+import com.wflow.workflow.bean.vo.ProcessProgressVo;
+import com.wflow.workflow.enums.StepStatusEnum;
+import com.wflow.workflow.service.ProcessInstanceService;
+import lombok.RequiredArgsConstructor;
+import org.springframework.stereotype.Component;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.function.Function;
+import java.util.stream.Collectors;
+
+
+/**
+ * 项目终验处理
+ *
+ * @author CMM
+ * @since 2023/02/24 14:35
+ */
+@Component
+@RequiredArgsConstructor
+public class FinalInspectionHandle extends AbstractProcessBusinessHandle {
+
+ private final IPurchaseInstService purchaseInstService;
+ private final IPurchaseService purchaseService;
+ private final ProcessInstanceService processInstanceService;
+ private final BuildUserUtils buildUserUtils;
+
+ @Override
+ ProcessNode getProcessNode() {
+ return ProcessNode.FINAL_INSPECTED;
+ }
+
+ @Override
+ void businessHandle(Project project, List processSchedule) {
+ List purchases = purchaseService.listByProjectId(project.getId());
+ Map purchaseMap = purchases.stream()
+ .filter(w -> TenderStatusEnum.FINALLY_INSPECTED_FAILED.eq(w.getStatus())
+ || TenderStatusEnum.FINALLY_INSPECTED_PASSED.eq(w.getStatus()))
+ .collect(Collectors.toMap(Purchase::getId, Function.identity()));
+ if (purchaseMap.isEmpty()) {
+ return;
+ }
+ ProcessDetailVO detail = new ProcessDetailVO();
+ detail.setProcessName(getProcessNode().getName());
+ detail.setStepStatus(StepStatusEnum.COMPLETED);
+ detail.setProcessInfoList(new ArrayList<>());
+ processSchedule.add(detail);
+ Map instMap = purchaseInstService.list(purchaseMap.keySet(), InstTypeEnum.PROJECT_FINAL_INSPECTION.getCode());
+ for (Map.Entry entry : instMap.entrySet()) {
+ if (detail.getFinishTime() == null || detail.getFinishTime().isBefore(entry.getValue().getCreateOn())) {
+ detail.setFinishTime(entry.getValue().getCreateOn());
+ }
+ ProcessProgressVo instanceDetail = processInstanceService.getProgressInstanceDetail(null, entry.getValue().getInstCode());
+ buildUserUtils.buildUserByProcessInfo(instanceDetail.getProgressInfo());
+ ProcessInfoVO tenderProgress = new ProcessInfoVO();
+ tenderProgress.setProcessName(purchaseMap.get(entry.getKey()).getBidName());
+ tenderProgress.setProcessProgressVo(instanceDetail);
+ detail.getProcessInfoList().add(tenderProgress);
+ }
+ }
+
+ @Override
+ public int getOrder() {
+ return getProcessNode().getOrder();
+ }
+
+}
diff --git a/hz-pm-api/src/main/java/com/hz/pm/api/projectlib/handle/FirstInspectedHandle.java b/hz-pm-api/src/main/java/com/hz/pm/api/projectlib/handle/FirstInspectedHandle.java
new file mode 100644
index 0000000..8e150b6
--- /dev/null
+++ b/hz-pm-api/src/main/java/com/hz/pm/api/projectlib/handle/FirstInspectedHandle.java
@@ -0,0 +1,58 @@
+package com.hz.pm.api.projectlib.handle;
+
+import com.baomidou.mybatisplus.core.conditions.Wrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.hz.pm.api.common.model.constant.BizConst;
+import com.hz.pm.api.common.statemachine.event.ProjectStateChangeEvent;
+import com.hz.pm.api.projectlib.model.entity.Project;
+import com.hz.pm.api.projectlib.model.entity.ProjectStatusChange;
+import com.hz.pm.api.projectlib.service.IProjectStatusChangeService;
+import com.wflow.workflow.bean.vo.ProcessDetailVO;
+import com.wflow.workflow.enums.StepStatusEnum;
+import lombok.RequiredArgsConstructor;
+import org.springframework.stereotype.Component;
+
+import java.util.List;
+
+/**
+ * 初验处理
+ *
+ * @author CMM
+ * @since 2023/02/27 10:09
+ */
+@Component
+@RequiredArgsConstructor
+public class FirstInspectedHandle extends AbstractProcessBusinessHandle {
+
+ private final IProjectStatusChangeService projectStatusChangeService;
+
+ @Override
+ ProcessNode getProcessNode() {
+ return ProcessNode.FIRST_INSPECTED;
+ }
+
+ @Override
+ public int getOrder() {
+ return getProcessNode().getOrder();
+ }
+
+ @Override
+ void businessHandle(Project project, List processSchedule) {
+ ProcessDetailVO detail = new ProcessDetailVO();
+ detail.setProcessName(getProcessNode().getName());
+ processSchedule.add(detail);
+ Wrapper query = Wrappers.lambdaQuery(ProjectStatusChange.class)
+ .eq(ProjectStatusChange::getProjectCode, project.getProjectCode())
+ .eq(ProjectStatusChange::getEvent, ProjectStateChangeEvent.SUBMIT_FIRST_INSPECTED_FILES)
+ .orderByDesc(ProjectStatusChange::getCreateOn)
+ .last(BizConst.LIMIT_1);
+ ProjectStatusChange change = projectStatusChangeService.getOne(query);
+ if (change != null) {
+ detail.setStepStatus(StepStatusEnum.COMPLETED);
+ detail.setFinishTime(change.getCreateOn());
+ } else {
+ detail.setStepStatus(StepStatusEnum.NOT_START);
+ }
+ }
+
+}
diff --git a/hz-pm-api/src/main/java/com/hz/pm/api/projectlib/handle/PilotRunningHandle.java b/hz-pm-api/src/main/java/com/hz/pm/api/projectlib/handle/PilotRunningHandle.java
new file mode 100644
index 0000000..2853b6d
--- /dev/null
+++ b/hz-pm-api/src/main/java/com/hz/pm/api/projectlib/handle/PilotRunningHandle.java
@@ -0,0 +1,59 @@
+package com.hz.pm.api.projectlib.handle;
+
+import com.baomidou.mybatisplus.core.conditions.Wrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.hz.pm.api.common.model.constant.BizConst;
+import com.hz.pm.api.common.statemachine.event.ProjectStateChangeEvent;
+import com.hz.pm.api.projectlib.model.entity.Project;
+import com.hz.pm.api.projectlib.model.entity.ProjectStatusChange;
+import com.hz.pm.api.projectlib.service.IProjectStatusChangeService;
+import com.wflow.workflow.bean.vo.ProcessDetailVO;
+import com.wflow.workflow.enums.StepStatusEnum;
+import lombok.RequiredArgsConstructor;
+import org.springframework.stereotype.Component;
+
+import java.util.List;
+
+/**
+ *
+ * PilotRunningHandle
+ *
+ *
+ * @author WendyYang
+ * @since 10:34 2024/4/9
+ */
+@Component
+@RequiredArgsConstructor
+public class PilotRunningHandle extends AbstractProcessBusinessHandle {
+
+ private final IProjectStatusChangeService projectStatusChangeService;
+
+ @Override
+ void businessHandle(Project project, List processSchedule) {
+ ProcessDetailVO detail = new ProcessDetailVO();
+ detail.setProcessName(getProcessNode().getName());
+ processSchedule.add(detail);
+ Wrapper query = Wrappers.lambdaQuery(ProjectStatusChange.class)
+ .eq(ProjectStatusChange::getProjectCode, project.getProjectCode())
+ .eq(ProjectStatusChange::getEvent, ProjectStateChangeEvent.SUBMIT_FIRST_INSPECTED_FILES)
+ .orderByDesc(ProjectStatusChange::getCreateOn)
+ .last(BizConst.LIMIT_1);
+ ProjectStatusChange change = projectStatusChangeService.getOne(query);
+ if (change != null) {
+ detail.setStepStatus(StepStatusEnum.COMPLETED);
+ detail.setFinishTime(change.getCreateOn());
+ } else {
+ detail.setStepStatus(StepStatusEnum.NOT_START);
+ }
+ }
+
+ @Override
+ ProcessNode getProcessNode() {
+ return ProcessNode.PILOT_RUNNING;
+ }
+
+ @Override
+ public int getOrder() {
+ return getProcessNode().getOrder();
+ }
+}
diff --git a/hz-pm-api/src/main/java/com/hz/pm/api/projectlib/handle/PreliminaryPreviewHandle.java b/hz-pm-api/src/main/java/com/hz/pm/api/projectlib/handle/PreliminaryPreviewHandle.java
deleted file mode 100644
index 2ee374d..0000000
--- a/hz-pm-api/src/main/java/com/hz/pm/api/projectlib/handle/PreliminaryPreviewHandle.java
+++ /dev/null
@@ -1,132 +0,0 @@
-package com.hz.pm.api.projectlib.handle;
-
-import cn.hutool.core.collection.CollUtil;
-import com.baomidou.mybatisplus.core.toolkit.Wrappers;
-import com.google.common.collect.Lists;
-import com.ningdatech.basic.exception.BizException;
-import com.ningdatech.basic.util.NdDateUtils;
-import com.hz.pm.api.common.model.constant.CommonConst;
-import com.hz.pm.api.projectlib.model.enumeration.InstTypeEnum;
-import com.hz.pm.api.projectlib.model.entity.Project;
-import com.hz.pm.api.projectlib.model.entity.ProjectInst;
-import com.hz.pm.api.projectlib.service.IProjectInstService;
-import com.hz.pm.api.projectlib.service.IProjectService;
-import com.hz.pm.api.projectlib.utils.ProjectVersionUtil;
-import com.hz.pm.api.todocenter.constant.TodoCenterConst;
-import com.hz.pm.api.todocenter.utils.BuildUserUtils;
-import com.wflow.workflow.bean.process.ProgressNode;
-import com.wflow.workflow.bean.vo.ProcessDetailVO;
-import com.wflow.workflow.bean.vo.ProcessProgressVo;
-import com.wflow.workflow.enums.ProcessStatusEnum;
-import com.wflow.workflow.enums.StepStatusEnum;
-import com.wflow.workflow.service.ProcessInstanceService;
-import org.springframework.core.annotation.Order;
-import org.springframework.stereotype.Component;
-
-import java.time.LocalDateTime;
-import java.util.List;
-import java.util.Objects;
-
-/**
- * 项目预审处理
- *
- * @author CMM
- * @since 2023/02/27 10:09
- */
-@Order(4)
-@Component
-public class PreliminaryPreviewHandle extends AbstractProcessBusinessHandle {
-
- private final IProjectInstService projectInstService;
- private final ProcessInstanceService processInstanceService;
- private final BuildUserUtils buildUserUtils;
- private final ProjectVersionUtil projectVersionUtil;
- private final IProjectService projectService;
-
- private Integer order = 4;
-
- public PreliminaryPreviewHandle(IProjectInstService projectInstService,
- ProcessInstanceService processInstanceService,
- BuildUserUtils buildUserUtils,
- ProjectVersionUtil projectVersionUtil,
- IProjectService projectService) {
- this.projectInstService = projectInstService;
- this.processInstanceService = processInstanceService;
- this.buildUserUtils = buildUserUtils;
- this.projectVersionUtil = projectVersionUtil;
- this.projectService = projectService;
- }
-
- @Override
- void businessHandle(Project project, List processSchedule) {
- ProcessDetailVO processDetailVO = new ProcessDetailVO();
- if (Objects.isNull(project)){
- throw new BizException("当前项目不存在!");
- }
- Long projectId = project.getId();
- //查出历史版本的 所有项目ID
- List allVersionProjectIds = projectService.allVersionProjectIds(projectId);
- // 根据项目ID查询项目预审流程的流程状态
- ProjectInst projectInst = projectInstService.getOne(Wrappers.lambdaQuery(ProjectInst.class)
- .in(ProjectInst::getProjectId, allVersionProjectIds)
- .eq(ProjectInst::getInstType, InstTypeEnum.PRELIMINARY_PREVIEW.getCode())
- .ne(ProjectInst::getInstCode, TodoCenterConst.Declared.NULL_INST_CODE)
- .orderByDesc(ProjectInst::getCreateOn)
- .last("limit 1"));
- ProcessProgressVo instanceDetail = null;
- // 未找到当前版本项目的预审审核流程且当前项目版本号大于1(是被驳回重新申报的项目或者建设方案申报的项目)
- if (Objects.isNull(projectInst)) {
- if (project.getVersion() > CommonConst.VERSION_ONE){
- // 获取上个版本的信息
- instanceDetail = projectVersionUtil.getPreVerProcessInfo(projectId,InstTypeEnum.PRELIMINARY_PREVIEW);
- }
- }else {
- String instCode = projectInst.getInstCode();
- instanceDetail = processInstanceService.getProgressInstanceDetail(null, instCode);
- }
- if (Objects.isNull(instanceDetail)){
- processDetailVO.setStepStatus(StepStatusEnum.NOT_START);
- processDetailVO.setProcessName(CommonConst.PRELIMINARY_PREVIEW);
- processSchedule.add(processDetailVO);
- return;
- }
- String status = instanceDetail.getStatus();
- if (ProcessStatusEnum.UNDER_REVIEW.getDesc().equals(status)){
- processDetailVO.setStepStatus(StepStatusEnum.ON_GOING);
- } else if (ProcessStatusEnum.BE_REJECTED.getDesc().equals(status)) {
- processDetailVO.setStepStatus(StepStatusEnum.REJECTED);
- } else if (ProcessStatusEnum.APPROVED.getDesc().equals(status)) {
- processDetailVO.setStepStatus(StepStatusEnum.COMPLETED);
- }
-
- // 装配节点审核人员信息
- List progressInfo = instanceDetail.getProgressInfo();
- if (CollUtil.isNotEmpty(progressInfo)) {
- buildUserUtils.buildUserByProcessInfo(progressInfo);
- // 根据流程处理详情获取流程完成时间
- if (StepStatusEnum.contains(processDetailVO.getStepStatus(),
- Lists.newArrayList(StepStatusEnum.REJECTED,
- StepStatusEnum.COMPLETED))) {
- ProgressNode progressNode = progressInfo.get(progressInfo.size() - 1);
- LocalDateTime finishTime = NdDateUtils.date2LocalDateTime(progressNode.getFinishTime());
- processDetailVO.setFinishTime(finishTime);
- }
- }else {
- LocalDateTime finishTime = NdDateUtils.date2LocalDateTime(instanceDetail.getStartTime());
- processDetailVO.setFinishTime(finishTime);
- }
- processDetailVO.setProcessProgressVo(instanceDetail);
- processDetailVO.setProcessName(CommonConst.PRELIMINARY_PREVIEW);
- processSchedule.add(processDetailVO);
- }
-
- @Override
- Integer getOrder() {
- return order;
- }
-
- @Override
- void setOrder(Integer order) {
- this.order = order;
- }
-}
diff --git a/hz-pm-api/src/main/java/com/hz/pm/api/projectlib/handle/ProcessExecuteChainHandle.java b/hz-pm-api/src/main/java/com/hz/pm/api/projectlib/handle/ProcessExecuteChainHandle.java
deleted file mode 100644
index 6eab33a..0000000
--- a/hz-pm-api/src/main/java/com/hz/pm/api/projectlib/handle/ProcessExecuteChainHandle.java
+++ /dev/null
@@ -1,84 +0,0 @@
-package com.hz.pm.api.projectlib.handle;
-
-import com.google.common.collect.Lists;
-import com.hz.pm.api.common.enumeration.ProjectProcessStageEnum;
-import com.hz.pm.api.projectlib.model.entity.Project;
-import com.hz.pm.api.sys.manage.ProcessModelManage;
-import com.wflow.bean.entity.WflowModels;
-import com.wflow.workflow.bean.vo.ProcessDetailVO;
-import com.wflow.workflow.enums.StepStatusEnum;
-import lombok.RequiredArgsConstructor;
-import org.springframework.stereotype.Component;
-
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.List;
-import java.util.Objects;
-
-/**
- * 流程执行链
- *
- * @author CMM
- * @since 2023/02/26 21:36
- */
-@Component
-@RequiredArgsConstructor
-public class ProcessExecuteChainHandle {
-
- private final ProcessModelManage processModelManage;
-
- /**
- * 具体处理者的集合
- */
- private final List processBusinessHandles;
-
- /**
- * 遍历处理链,通过前缀判断能否处理逻辑,如果不能继续遍历
- *
- * @param projectId \
- * @return void
- * @author CMM
- * @since 2023/02/26
- */
- public List handle(Project project, List processSchedule) {
- List handles = Lists.newArrayList();
- for (AbstractProcessBusinessHandle processBusinessHandle : processBusinessHandles) {
- if (processBusinessHandle instanceof AnnualPlanHandle) {
- processBusinessHandle.setOrder(6);
- } else if (processBusinessHandle instanceof ConstructionPlanReviewHandle) {
- processBusinessHandle.setOrder(7);
- }
-
- //建设方案
- if (processBusinessHandle instanceof ConstructionPlanReviewHandle) {
- ProjectProcessStageEnum processType = ProjectProcessStageEnum.CONSTRUCTION_PROJECT_APPROVAL_PROCESS;
- WflowModels wflowModels = processModelManage.getWflowModels(processType, project.getId());
- if (Objects.nonNull(wflowModels) && (Boolean.FALSE.equals(wflowModels.getIsStop()))) {
- handles.add(processBusinessHandle);
- }
- } else if (processBusinessHandle instanceof ProvinceUnitedReviewHandle) {
- // TODO 省级联审
- } else {
- handles.add(processBusinessHandle);
- }
- }
-
- if (!handles.isEmpty()) {
- handles.sort(Comparator.comparing(AbstractProcessBusinessHandle::getOrder));
- for (AbstractProcessBusinessHandle processBusinessHandle : handles) {
- processBusinessHandle.businessHandle(project, processSchedule);
- }
- for (int i = processSchedule.size() - 1; i >= 1; i--) {
- ProcessDetailVO curr = processSchedule.get(i);
- if (curr.getStepStatus() == null ||
- curr.getStepStatus().equals(StepStatusEnum.NOT_START)) {
- continue;
- }
- ProcessDetailVO pre = processSchedule.get(i - 1);
- pre.setStepStatus(StepStatusEnum.COMPLETED);
- }
- return processSchedule;
- }
- return Collections.emptyList();
- }
-}
diff --git a/hz-pm-api/src/main/java/com/hz/pm/api/projectlib/handle/ProcessProgressContext.java b/hz-pm-api/src/main/java/com/hz/pm/api/projectlib/handle/ProcessProgressContext.java
new file mode 100644
index 0000000..f1fe002
--- /dev/null
+++ b/hz-pm-api/src/main/java/com/hz/pm/api/projectlib/handle/ProcessProgressContext.java
@@ -0,0 +1,47 @@
+package com.hz.pm.api.projectlib.handle;
+
+import com.hz.pm.api.projectlib.model.entity.Project;
+import com.wflow.workflow.bean.vo.ProcessDetailVO;
+import com.wflow.workflow.enums.StepStatusEnum;
+import lombok.RequiredArgsConstructor;
+import org.springframework.stereotype.Component;
+
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.List;
+
+/**
+ * 流程执行链
+ *
+ * @author CMM
+ * @since 2023/02/26 21:36
+ */
+@Component
+@RequiredArgsConstructor
+public class ProcessProgressContext {
+
+ /**
+ * 具体处理者的集合
+ */
+ private final List processBusinessHandles;
+
+ public List handle(Project project, List processSchedule) {
+ if (!processBusinessHandles.isEmpty()) {
+ processBusinessHandles.sort(Comparator.comparing(AbstractProcessBusinessHandle::getOrder));
+ for (AbstractProcessBusinessHandle processBusinessHandle : processBusinessHandles) {
+ processBusinessHandle.businessHandle(project, processSchedule);
+ }
+ for (int i = processSchedule.size() - 1; i >= 1; i--) {
+ ProcessDetailVO curr = processSchedule.get(i);
+ if (curr.getStepStatus() == null ||
+ curr.getStepStatus().equals(StepStatusEnum.NOT_START)) {
+ continue;
+ }
+ ProcessDetailVO pre = processSchedule.get(i - 1);
+ pre.setStepStatus(StepStatusEnum.COMPLETED);
+ }
+ return processSchedule;
+ }
+ return Collections.emptyList();
+ }
+}
diff --git a/hz-pm-api/src/main/java/com/hz/pm/api/projectlib/handle/ProjectAdaptionHandle.java b/hz-pm-api/src/main/java/com/hz/pm/api/projectlib/handle/ProjectAdaptionHandle.java
new file mode 100644
index 0000000..67d33ac
--- /dev/null
+++ b/hz-pm-api/src/main/java/com/hz/pm/api/projectlib/handle/ProjectAdaptionHandle.java
@@ -0,0 +1,81 @@
+package com.hz.pm.api.projectlib.handle;
+
+import com.hz.pm.api.projectdeclared.model.entity.Purchase;
+import com.hz.pm.api.projectdeclared.model.entity.PurchaseInst;
+import com.hz.pm.api.projectdeclared.service.IPurchaseInstService;
+import com.hz.pm.api.projectdeclared.service.IPurchaseService;
+import com.hz.pm.api.projectlib.model.entity.Project;
+import com.hz.pm.api.projectlib.model.enumeration.InstTypeEnum;
+import com.hz.pm.api.projectlib.model.enumeration.TenderAdaptStatusEnum;
+import com.hz.pm.api.todocenter.utils.BuildUserUtils;
+import com.wflow.workflow.bean.vo.ProcessDetailVO;
+import com.wflow.workflow.bean.vo.ProcessInfoVO;
+import com.wflow.workflow.bean.vo.ProcessProgressVo;
+import com.wflow.workflow.enums.StepStatusEnum;
+import com.wflow.workflow.service.ProcessInstanceService;
+import lombok.RequiredArgsConstructor;
+import org.springframework.stereotype.Component;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.function.Function;
+import java.util.stream.Collectors;
+
+/**
+ *
+ * AdaptionHandle
+ *
+ *
+ * @author WendyYang
+ * @since 09:29 2024/4/9
+ */
+@Component
+@RequiredArgsConstructor
+public class ProjectAdaptionHandle extends AbstractProcessBusinessHandle {
+
+ private final IPurchaseService purchaseService;
+ private final IPurchaseInstService purchaseInstService;
+ private final BuildUserUtils buildUserUtils;
+ private final ProcessInstanceService processInstanceService;
+
+ @Override
+ void businessHandle(Project project, List processSchedule) {
+ List purchases = purchaseService.listByProjectId(project.getId());
+ Map purchaseMap = purchases.stream()
+ .filter(w -> TenderAdaptStatusEnum.ADAPT_INFO_PASSED.eq(w.getAdaptStatus())
+ || TenderAdaptStatusEnum.ADAPT_INFO_FAILED.eq(w.getAdaptStatus()))
+ .collect(Collectors.toMap(Purchase::getId, Function.identity()));
+ if (purchaseMap.isEmpty()) {
+ return;
+ }
+ ProcessDetailVO detail = new ProcessDetailVO();
+ detail.setProcessName(getProcessNode().getName());
+ detail.setStepStatus(StepStatusEnum.COMPLETED);
+ detail.setProcessInfoList(new ArrayList<>());
+ processSchedule.add(detail);
+ Map instMap = purchaseInstService.list(purchaseMap.keySet(), InstTypeEnum.ADAPTION.getCode());
+ for (Map.Entry entry : instMap.entrySet()) {
+ if (detail.getFinishTime() == null || detail.getFinishTime().isBefore(entry.getValue().getCreateOn())) {
+ detail.setFinishTime(entry.getValue().getCreateOn());
+ }
+ ProcessProgressVo instanceDetail = processInstanceService.getProgressInstanceDetail(null, entry.getValue().getInstCode());
+ buildUserUtils.buildUserByProcessInfo(instanceDetail.getProgressInfo());
+ ProcessInfoVO tenderProgress = new ProcessInfoVO();
+ tenderProgress.setProcessName(purchaseMap.get(entry.getKey()).getBidName());
+ tenderProgress.setProcessProgressVo(instanceDetail);
+ detail.getProcessInfoList().add(tenderProgress);
+ }
+ }
+
+ @Override
+ ProcessNode getProcessNode() {
+ return ProcessNode.PROJECT_ADAPTION;
+ }
+
+ @Override
+ public int getOrder() {
+ return getProcessNode().getOrder();
+ }
+
+}
diff --git a/hz-pm-api/src/main/java/com/hz/pm/api/projectlib/handle/ProjectApprovalHandle.java b/hz-pm-api/src/main/java/com/hz/pm/api/projectlib/handle/ProjectApprovalHandle.java
index 4ec90e2..a55768f 100644
--- a/hz-pm-api/src/main/java/com/hz/pm/api/projectlib/handle/ProjectApprovalHandle.java
+++ b/hz-pm-api/src/main/java/com/hz/pm/api/projectlib/handle/ProjectApprovalHandle.java
@@ -1,15 +1,22 @@
package com.hz.pm.api.projectlib.handle;
-import com.hz.pm.api.common.model.constant.CommonConst;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.hz.pm.api.common.model.constant.BizConst;
import com.hz.pm.api.common.statemachine.event.ProjectStateChangeEvent;
import com.hz.pm.api.projectlib.model.entity.Project;
+import com.hz.pm.api.projectlib.model.entity.ProjectInst;
import com.hz.pm.api.projectlib.model.entity.ProjectStatusChange;
+import com.hz.pm.api.projectlib.model.enumeration.InstTypeEnum;
import com.hz.pm.api.projectlib.model.enumeration.ProjectStatusEnum;
-import com.hz.pm.api.projectlib.service.IProjectStatusChangeService;
+import com.hz.pm.api.projectlib.service.IProjectInstService;
import com.hz.pm.api.projectlib.service.IProjectService;
+import com.hz.pm.api.projectlib.service.IProjectStatusChangeService;
+import com.hz.pm.api.todocenter.utils.BuildUserUtils;
import com.wflow.workflow.bean.vo.ProcessDetailVO;
+import com.wflow.workflow.bean.vo.ProcessProgressVo;
import com.wflow.workflow.enums.StepStatusEnum;
-import org.springframework.core.annotation.Order;
+import com.wflow.workflow.service.ProcessInstanceService;
+import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Component;
import java.util.Arrays;
@@ -22,27 +29,27 @@ import java.util.Objects;
* @author CMM
* @since 2023/02/24 14:35
*/
-@Order(8)
@Component
+@RequiredArgsConstructor
public class ProjectApprovalHandle extends AbstractProcessBusinessHandle {
+
private final IProjectStatusChangeService projectStatusChangeService;
private final IProjectService projectService;
+ private final IProjectInstService projectInstService;
+ private final ProcessInstanceService processInstanceService;
+ private final BuildUserUtils buildUserUtils;
- private Integer order = 8;
-
- public ProjectApprovalHandle(IProjectStatusChangeService projectStatusChangeService,
- IProjectService projectService) {
- this.projectStatusChangeService = projectStatusChangeService;
- this.projectService = projectService;
+ @Override
+ ProcessNode getProcessNode() {
+ return ProcessNode.PROJECT_APPROVAL;
}
@Override
void businessHandle(Project project, List processSchedule) {
- ProcessDetailVO processDetail = new ProcessDetailVO();
- processDetail.setProcessName(CommonConst.PROJECT_APPROVAL);
- processSchedule.add(processDetail);
+ ProcessDetailVO detail = new ProcessDetailVO();
+ detail.setProcessName(getProcessNode().getName());
+ processSchedule.add(detail);
//查出历史版本的 所有项目ID
- List allProjectIds = projectService.allVersionProjectIds(project.getProjectCode());
Integer status = project.getStatus();
if (Objects.isNull(status)) {
return;
@@ -50,9 +57,10 @@ public class ProjectApprovalHandle extends AbstractProcessBusinessHandle {
// 项目状态为待立项批复之前的状态
if (status < ProjectStatusEnum.TO_BE_APPROVED.getCode()
&& status < ProjectStatusEnum.DECLARED_APPROVED_TO_BE_RECORD.getCode()) {
- processDetail.setStepStatus(StepStatusEnum.NOT_START);
+ detail.setStepStatus(StepStatusEnum.NOT_START);
return;
}
+ List projectIds = projectService.allVersionProjectIds(project.getProjectCode());
// 当前项目状态为待立项批复
if (ProjectStatusEnum.TO_BE_APPROVED.eq(status)
|| ProjectStatusEnum.DECLARED_APPROVED_TO_BE_RECORD.eq(status)
@@ -61,31 +69,37 @@ public class ProjectApprovalHandle extends AbstractProcessBusinessHandle {
final List events = Arrays.asList(ProjectStateChangeEvent.PLAN_REVIEW_PASS,
ProjectStateChangeEvent.DECLARED_RECORD_SUBMIT,
ProjectStateChangeEvent.DECLARED_RECORD_RESUBMIT);
- ProjectStatusChange projectStatusChange = projectStatusChangeService.getLastOne(allProjectIds, events);
+ ProjectStatusChange projectStatusChange = projectStatusChangeService.getLastOne(projectIds, events);
if (projectStatusChange != null) {
- processDetail.setFinishTime(projectStatusChange.getCreateOn());
+ detail.setFinishTime(projectStatusChange.getCreateOn());
}
- processDetail.setStepStatus(StepStatusEnum.ON_GOING);
+ detail.setStepStatus(StepStatusEnum.ON_GOING);
} else {
// 取 状态机 改变状态时间
final List events = Arrays.asList(ProjectStateChangeEvent.PLAN_REVIEW_PASS,
ProjectStateChangeEvent.DECLARED_RECORD_FAILED,
ProjectStateChangeEvent.DECLARED_RECORD_PASS);
- ProjectStatusChange projectStatusChange = projectStatusChangeService.getLastOne(allProjectIds, events);
+ ProjectStatusChange projectStatusChange = projectStatusChangeService.getLastOne(projectIds, events);
if (Objects.nonNull(projectStatusChange)) {
- processDetail.setFinishTime(projectStatusChange.getCreateOn());
- processDetail.setStepStatus(StepStatusEnum.COMPLETED);
+ detail.setFinishTime(projectStatusChange.getCreateOn());
+ detail.setStepStatus(StepStatusEnum.COMPLETED);
+ ProjectInst inst = projectInstService.getOne(Wrappers.lambdaQuery(ProjectInst.class)
+ .in(ProjectInst::getProjectId, projectIds)
+ .eq(ProjectInst::getInstType, InstTypeEnum.DECLARED_RECORD.getCode())
+ .orderByDesc(ProjectInst::getCreateOn)
+ .last(BizConst.LIMIT_1));
+ if (inst != null) {
+ ProcessProgressVo instDetail = processInstanceService.getProgressInstanceDetail(null, inst.getInstCode());
+ detail.setProcessProgressVo(instDetail);
+ buildUserUtils.buildUserByProcessInfo(instDetail.getProgressInfo());
+ }
}
}
}
@Override
- Integer getOrder() {
- return order;
+ public int getOrder() {
+ return getProcessNode().getOrder();
}
- @Override
- void setOrder(Integer order) {
- this.order = order;
- }
}
diff --git a/hz-pm-api/src/main/java/com/hz/pm/api/projectlib/handle/ProjectDeclareHandle.java b/hz-pm-api/src/main/java/com/hz/pm/api/projectlib/handle/ProjectDeclareHandle.java
index a0844d8..d7f8e3c 100644
--- a/hz-pm-api/src/main/java/com/hz/pm/api/projectlib/handle/ProjectDeclareHandle.java
+++ b/hz-pm-api/src/main/java/com/hz/pm/api/projectlib/handle/ProjectDeclareHandle.java
@@ -1,11 +1,9 @@
package com.hz.pm.api.projectlib.handle;
-import com.hz.pm.api.common.model.constant.CommonConst;
import com.hz.pm.api.projectlib.model.entity.Project;
-import com.hz.pm.api.projectlib.service.IProjectService;
import com.wflow.workflow.bean.vo.ProcessDetailVO;
import com.wflow.workflow.enums.StepStatusEnum;
-import org.springframework.core.annotation.Order;
+import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Component;
import java.time.LocalDateTime;
@@ -17,19 +15,15 @@ import java.util.List;
* @author CMM
* @since 2023/02/24 14:35
*/
-
-@Order(1)
@Component
+@RequiredArgsConstructor
public class ProjectDeclareHandle extends AbstractProcessBusinessHandle {
- private final IProjectService projectService;
-
- public ProjectDeclareHandle(IProjectService projectService){
- this.projectService = projectService;
+ @Override
+ ProcessNode getProcessNode() {
+ return ProcessNode.PROJECT_DECLARED;
}
- private Integer order = 1;
-
@Override
void businessHandle(Project project, List processSchedule) {
// 因为此时在项目库中的项目,都是已经申报过的项目,所以直接设置环节状态为已完成
@@ -38,17 +32,13 @@ public class ProjectDeclareHandle extends AbstractProcessBusinessHandle {
// 项目库中查出申报完成时间
LocalDateTime createOn = project.getCreateOn();
processDetailVO.setFinishTime(createOn);
- processDetailVO.setProcessName(CommonConst.PROJECT_DECLARE);
+ processDetailVO.setProcessName(getProcessNode().getName());
processSchedule.add(processDetailVO);
}
@Override
- Integer getOrder() {
- return order;
+ public int getOrder() {
+ return getProcessNode().getOrder();
}
- @Override
- void setOrder(Integer order) {
- this.order = order;
- }
}
diff --git a/hz-pm-api/src/main/java/com/hz/pm/api/projectlib/handle/ProjectFinalInspectionHandle.java b/hz-pm-api/src/main/java/com/hz/pm/api/projectlib/handle/ProjectFinalInspectionHandle.java
deleted file mode 100644
index 28b14f9..0000000
--- a/hz-pm-api/src/main/java/com/hz/pm/api/projectlib/handle/ProjectFinalInspectionHandle.java
+++ /dev/null
@@ -1,116 +0,0 @@
-package com.hz.pm.api.projectlib.handle;
-
-import java.time.LocalDateTime;
-import java.util.List;
-import java.util.Objects;
-
-import cn.hutool.core.collection.CollUtil;
-import com.google.common.collect.Lists;
-import com.ningdatech.basic.util.NdDateUtils;
-import com.hz.pm.api.common.model.constant.BizConst;
-import com.hz.pm.api.projectlib.model.enumeration.InstTypeEnum;
-import com.hz.pm.api.projectlib.model.entity.Project;
-import com.hz.pm.api.projectlib.model.entity.ProjectInst;
-import com.hz.pm.api.projectlib.service.IProjectInstService;
-import com.hz.pm.api.projectlib.service.IProjectService;
-import com.hz.pm.api.todocenter.constant.TodoCenterConst;
-import com.hz.pm.api.todocenter.utils.BuildUserUtils;
-import com.wflow.workflow.bean.process.ProgressNode;
-import com.wflow.workflow.bean.vo.ProcessDetailVO;
-import com.wflow.workflow.bean.vo.ProcessProgressVo;
-import com.wflow.workflow.enums.ProcessStatusEnum;
-import com.wflow.workflow.enums.StepStatusEnum;
-import com.wflow.workflow.service.ProcessInstanceService;
-import org.springframework.core.annotation.Order;
-import org.springframework.stereotype.Component;
-import com.baomidou.mybatisplus.core.toolkit.Wrappers;
-import com.hz.pm.api.common.model.constant.CommonConst;
-
-
-/**
- * 项目终验处理
- *
- * @author CMM
- * @since 2023/02/24 14:35
- */
-@Order(11)
-@Component
-public class ProjectFinalInspectionHandle extends AbstractProcessBusinessHandle {
- private final IProjectInstService projectInstService;
- private final ProcessInstanceService processInstanceService;
- private final BuildUserUtils buildUserUtils;
-
- private final IProjectService projectService;
-
- private Integer order = 11;
- public ProjectFinalInspectionHandle(IProjectInstService projectInstService, ProcessInstanceService processInstanceService,
- BuildUserUtils buildUserUtils,IProjectService projectService){
- this.projectInstService = projectInstService;
- this.processInstanceService = processInstanceService;
- this.buildUserUtils = buildUserUtils;
- this.projectService = projectService;
- }
-
- @Override
- void businessHandle(Project project, List processSchedule) {
- ProcessDetailVO processDetailVO = new ProcessDetailVO();
- //查出历史版本的 所有项目ID
- List allVersionProjectIds = projectService.allVersionProjectIds(project.getProjectCode());
- // 根据项目ID查询出项目终验流程的流程状态
- ProjectInst projectInst = projectInstService.getOne(Wrappers.lambdaQuery(ProjectInst.class)
- .in(ProjectInst::getProjectId, allVersionProjectIds)
- .eq(ProjectInst::getInstType, InstTypeEnum.PROJECT_FINAL_INSPECTION.getCode())
- .ne(ProjectInst::getInstCode, TodoCenterConst.Declared.NULL_INST_CODE)
- .orderByDesc(ProjectInst::getCreateOn)
- .last(BizConst.LIMIT_1));
-
- if (Objects.isNull(projectInst)){
- processDetailVO.setStepStatus(StepStatusEnum.NOT_START);
- processDetailVO.setProcessName(CommonConst.PROJECT_FINAL_INSPECTION);
- processSchedule.add(processDetailVO);
- return;
- }
-
- String instCode = projectInst.getInstCode();
- ProcessProgressVo instanceDetail = processInstanceService.getProgressInstanceDetail(null, instCode);
- String status = instanceDetail.getStatus();
- // 项目状态不在待终验之后的状态
- if (ProcessStatusEnum.UNDER_REVIEW.getDesc().equals(status)){
- processDetailVO.setStepStatus(StepStatusEnum.ON_GOING);
- } else if (ProcessStatusEnum.BE_REJECTED.getDesc().equals(status)) {
- processDetailVO.setStepStatus(StepStatusEnum.REJECTED);
- } else if (ProcessStatusEnum.APPROVED.getDesc().equals(status)) {
- processDetailVO.setStepStatus(StepStatusEnum.COMPLETED);
- }
-
- // 装配节点审核人员信息
- List progressInfo = instanceDetail.getProgressInfo();
- if (CollUtil.isNotEmpty(progressInfo)) {
- buildUserUtils.buildUserByProcessInfo(progressInfo);
- // 根据流程处理详情获取流程完成时间
- if (StepStatusEnum.contains(processDetailVO.getStepStatus(),
- Lists.newArrayList(StepStatusEnum.REJECTED,
- StepStatusEnum.COMPLETED))) {
- ProgressNode progressNode = progressInfo.get(progressInfo.size() - 1);
- LocalDateTime finishTime = NdDateUtils.date2LocalDateTime(progressNode.getFinishTime());
- processDetailVO.setFinishTime(finishTime);
- }
- }else {
- LocalDateTime finishTime = NdDateUtils.date2LocalDateTime(instanceDetail.getStartTime());
- processDetailVO.setFinishTime(finishTime);
- }
- processDetailVO.setProcessProgressVo(instanceDetail);
- processDetailVO.setProcessName(CommonConst.PROJECT_FINAL_INSPECTION);
- processSchedule.add(processDetailVO);
- }
-
- @Override
- Integer getOrder() {
- return order;
- }
-
- @Override
- void setOrder(Integer order) {
- this.order = order;
- }
-}
diff --git a/hz-pm-api/src/main/java/com/hz/pm/api/projectlib/handle/ProjectPreliminaryInspectionHandle.java b/hz-pm-api/src/main/java/com/hz/pm/api/projectlib/handle/ProjectPreliminaryInspectionHandle.java
deleted file mode 100644
index 3db4c41..0000000
--- a/hz-pm-api/src/main/java/com/hz/pm/api/projectlib/handle/ProjectPreliminaryInspectionHandle.java
+++ /dev/null
@@ -1,99 +0,0 @@
-package com.hz.pm.api.projectlib.handle;
-
-import static com.hz.pm.api.projectlib.model.enumeration.ProjectStatusEnum.*;
-
-import java.util.Arrays;
-import java.util.List;
-import java.util.Objects;
-
-import com.hz.pm.api.common.model.constant.BizConst;
-import com.wflow.workflow.bean.vo.ProcessDetailVO;
-import com.wflow.workflow.enums.StepStatusEnum;
-import org.springframework.core.annotation.Order;
-import org.springframework.stereotype.Component;
-
-import com.baomidou.mybatisplus.core.toolkit.Wrappers;
-import com.ningdatech.basic.util.CollUtils;
-import com.hz.pm.api.common.model.constant.CommonConst;
-import com.hz.pm.api.common.statemachine.event.ProjectStateChangeEvent;
-import com.hz.pm.api.projectlib.model.enumeration.ProjectStatusEnum;
-import com.hz.pm.api.projectlib.model.entity.ProjectStatusChange;
-import com.hz.pm.api.projectlib.model.entity.Project;
-import com.hz.pm.api.projectlib.service.IProjectStatusChangeService;
-import com.hz.pm.api.projectlib.service.IProjectService;
-
-/**
- * 项目初验处理
- *
- * @author CMM
- * @since 2023/02/24 14:35
- */
-@Order(10)
-@Component
-public class ProjectPreliminaryInspectionHandle extends AbstractProcessBusinessHandle {
- private final IProjectStatusChangeService projectStatusChangeService;
- private final IProjectService projectService;
-
- private Integer order = 10;
-
- /**
- * 项目状态为:建设中及之后的状态
- */
- private static final List PROJECT_PRELIMINARY_INSPECTION_LIST_STATUS = Arrays.asList(
- UNDER_CONSTRUCTION,
- TO_BE_FINALLY_INSPECTED,
- FINAL_ACCEPTANCE_IS_UNDER_REVIEW,
- FINAL_ACCEPTANCE_REVIEW_FAILED,
- ARCHIVED,
- ACCEPTED
- );
-
- public ProjectPreliminaryInspectionHandle(IProjectStatusChangeService projectStatusChangeService, IProjectService projectService){
- this.projectStatusChangeService = projectStatusChangeService;
- this.projectService = projectService;
- }
-
- @Override
- void businessHandle(Project project, List processSchedule) {
- ProcessDetailVO processDetailVO = new ProcessDetailVO();
- // 根据项目状态是否在建设中及之后的状态判断项目初验是否开始
- List fieldList = CollUtils.fieldList(PROJECT_PRELIMINARY_INSPECTION_LIST_STATUS, ProjectStatusEnum::getCode);
- //查出历史版本的 所有项目ID
- List allVersionProjectIds = projectService.allVersionProjectIds(project.getProjectCode());
- Integer status = project.getStatus();
- // 项目状态不在建设中及之后的状态
- if (!fieldList.contains(status)){
- processDetailVO.setStepStatus(StepStatusEnum.NOT_START);
- processDetailVO.setProcessName(CommonConst.PROJECT_PRELIMINARY_INSPECTION);
- processSchedule.add(processDetailVO);
- return;
- }
- // 项目状态为建设中或之后的状态
- if (ProjectStatusEnum.UNDER_CONSTRUCTION.getCode().equals(project.getStatus())){
- processDetailVO.setStepStatus(StepStatusEnum.ON_GOING);
- }else {
- processDetailVO.setStepStatus(StepStatusEnum.COMPLETED);
- // 根据初验备案的时间获取
- ProjectStatusChange projectStatusChange = projectStatusChangeService.getOne(Wrappers.lambdaQuery(ProjectStatusChange.class)
- .in(ProjectStatusChange::getProjectId, allVersionProjectIds)
- .eq(ProjectStatusChange::getEvent, ProjectStateChangeEvent.PRELIMINARY_ACCEPTANCE_PUT_ON_RECORD.name())
- .orderByDesc(ProjectStatusChange::getCreateOn)
- .last(BizConst.LIMIT_1));
- if(Objects.nonNull(projectStatusChange)){
- processDetailVO.setFinishTime(projectStatusChange.getCreateOn());
- }
- }
- processDetailVO.setProcessName(CommonConst.PROJECT_PRELIMINARY_INSPECTION);
- processSchedule.add(processDetailVO);
- }
-
- @Override
- Integer getOrder() {
- return order;
- }
-
- @Override
- void setOrder(Integer order) {
- this.order = order;
- }
-}
diff --git a/hz-pm-api/src/main/java/com/hz/pm/api/projectlib/handle/ProjectPurchaseHandle.java b/hz-pm-api/src/main/java/com/hz/pm/api/projectlib/handle/ProjectPurchaseHandle.java
new file mode 100644
index 0000000..71ebc02
--- /dev/null
+++ b/hz-pm-api/src/main/java/com/hz/pm/api/projectlib/handle/ProjectPurchaseHandle.java
@@ -0,0 +1,72 @@
+package com.hz.pm.api.projectlib.handle;
+
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.hz.pm.api.common.model.constant.BizConst;
+import com.hz.pm.api.common.statemachine.event.ProjectStateChangeEvent;
+import com.hz.pm.api.projectlib.model.entity.Project;
+import com.hz.pm.api.projectlib.model.entity.ProjectStatusChange;
+import com.hz.pm.api.projectlib.service.IProjectService;
+import com.hz.pm.api.projectlib.service.IProjectStatusChangeService;
+import com.wflow.workflow.bean.vo.ProcessDetailVO;
+import com.wflow.workflow.enums.StepStatusEnum;
+import lombok.RequiredArgsConstructor;
+import org.springframework.stereotype.Component;
+
+import java.util.List;
+
+import static com.hz.pm.api.projectlib.model.enumeration.ProjectStatusEnum.ON_PURCHASING;
+import static com.hz.pm.api.projectlib.model.enumeration.ProjectStatusEnum.TO_BE_PURCHASED;
+
+/**
+ * 招标采购处理
+ *
+ * @author CMM
+ * @since 2023/02/24 14:35
+ */
+@Component
+@RequiredArgsConstructor
+public class ProjectPurchaseHandle extends AbstractProcessBusinessHandle {
+
+ private final IProjectStatusChangeService projectStatusChangeService;
+ private final IProjectService projectService;
+
+ @Override
+ public int getOrder() {
+ return getProcessNode().getOrder();
+ }
+
+ @Override
+ ProcessNode getProcessNode() {
+ return ProcessNode.PROJECT_PURCHASE;
+ }
+
+ @Override
+ void businessHandle(Project project, List processSchedule) {
+ ProcessDetailVO detail = new ProcessDetailVO();
+ detail.setProcessName(getProcessNode().getName());
+ processSchedule.add(detail);
+ // 根据项目是否通过立项批复(立项批复时间)来判断招标采购是否开始
+ // 进行了立项批复且项目状态是待采购
+ if (TO_BE_PURCHASED.eq(project.getStatus())) {
+ detail.setStepStatus(StepStatusEnum.NOT_START);
+ } else if (ON_PURCHASING.eq(project.getStatus())) {
+ detail.setStepStatus(StepStatusEnum.ON_GOING);
+ } else {
+ List projectIds = projectService.allVersionProjectIds(project.getProjectCode());
+ // 根据采购备案的时间获取
+ ProjectStatusChange change = projectStatusChangeService.getOne(Wrappers.lambdaQuery(ProjectStatusChange.class)
+ .in(ProjectStatusChange::getProjectId, projectIds)
+ .eq(ProjectStatusChange::getEvent, ProjectStateChangeEvent.SUBMIT_OPERATION_PLAN)
+ .orderByDesc(ProjectStatusChange::getCreateOn)
+ .last(BizConst.LIMIT_1));
+ if (change == null) {
+ detail.setStepStatus(StepStatusEnum.NOT_START);
+ } else {
+ detail.setStepStatus(StepStatusEnum.COMPLETED);
+ detail.setFinishTime(change.getCreateOn());
+ }
+ }
+ detail.setProcessName(getProcessNode().getName());
+ }
+
+}
diff --git a/hz-pm-api/src/main/java/com/hz/pm/api/projectlib/handle/ProjectReviewHandle.java b/hz-pm-api/src/main/java/com/hz/pm/api/projectlib/handle/ProjectReviewHandle.java
new file mode 100644
index 0000000..ed18f64
--- /dev/null
+++ b/hz-pm-api/src/main/java/com/hz/pm/api/projectlib/handle/ProjectReviewHandle.java
@@ -0,0 +1,43 @@
+package com.hz.pm.api.projectlib.handle;
+
+import com.hz.pm.api.projectlib.model.entity.Project;
+import com.wflow.workflow.bean.vo.ProcessDetailVO;
+import com.wflow.workflow.enums.StepStatusEnum;
+import org.springframework.stereotype.Component;
+
+import java.time.LocalDateTime;
+import java.util.List;
+
+/**
+ * 项目申报处理
+ *
+ * @author CMM
+ * @since 2023/02/24 14:35
+ */
+
+@Component
+public class ProjectReviewHandle extends AbstractProcessBusinessHandle {
+
+ @Override
+ ProcessNode getProcessNode() {
+ return ProcessNode.PROJECT_REVIEW;
+ }
+
+ @Override
+ public int getOrder() {
+ return getProcessNode().getOrder();
+ }
+
+ @Override
+ void businessHandle(Project project, List processSchedule) {
+ // 因为此时在项目库中的项目,都是已经申报过的项目,所以直接设置环节状态为已完成
+ ProcessDetailVO processDetailVO = new ProcessDetailVO();
+ processDetailVO.setStepStatus(StepStatusEnum.COMPLETED);
+ // 项目库中查出申报完成时间
+ LocalDateTime createOn = project.getCreateOn();
+ processDetailVO.setFinishTime(createOn);
+ processDetailVO.setProcessName(getProcessNode().getName());
+ processSchedule.add(processDetailVO);
+ }
+
+}
diff --git a/hz-pm-api/src/main/java/com/hz/pm/api/projectlib/handle/ProjectSelfTestHandle.java b/hz-pm-api/src/main/java/com/hz/pm/api/projectlib/handle/ProjectSelfTestHandle.java
new file mode 100644
index 0000000..b94d00f
--- /dev/null
+++ b/hz-pm-api/src/main/java/com/hz/pm/api/projectlib/handle/ProjectSelfTestHandle.java
@@ -0,0 +1,81 @@
+package com.hz.pm.api.projectlib.handle;
+
+import com.hz.pm.api.projectdeclared.model.entity.Purchase;
+import com.hz.pm.api.projectdeclared.model.entity.PurchaseInst;
+import com.hz.pm.api.projectdeclared.service.IPurchaseInstService;
+import com.hz.pm.api.projectdeclared.service.IPurchaseService;
+import com.hz.pm.api.projectlib.model.entity.Project;
+import com.hz.pm.api.projectlib.model.enumeration.InstTypeEnum;
+import com.hz.pm.api.projectlib.model.enumeration.TenderSelfTestStatusEnum;
+import com.hz.pm.api.todocenter.utils.BuildUserUtils;
+import com.wflow.workflow.bean.vo.ProcessDetailVO;
+import com.wflow.workflow.bean.vo.ProcessInfoVO;
+import com.wflow.workflow.bean.vo.ProcessProgressVo;
+import com.wflow.workflow.enums.StepStatusEnum;
+import com.wflow.workflow.service.ProcessInstanceService;
+import lombok.RequiredArgsConstructor;
+import org.springframework.stereotype.Component;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.function.Function;
+import java.util.stream.Collectors;
+
+/**
+ *
+ * SelfTestHandle
+ *
+ *
+ * @author WendyYang
+ * @since 09:29 2024/4/9
+ */
+@Component
+@RequiredArgsConstructor
+public class ProjectSelfTestHandle extends AbstractProcessBusinessHandle {
+
+ private final IPurchaseService purchaseService;
+ private final IPurchaseInstService purchaseInstService;
+ private final BuildUserUtils buildUserUtils;
+ private final ProcessInstanceService processInstanceService;
+
+ @Override
+ void businessHandle(Project project, List processSchedule) {
+ List purchases = purchaseService.listByProjectId(project.getId());
+ Map purchaseMap = purchases.stream()
+ .filter(w -> TenderSelfTestStatusEnum.SELF_TEST_INFO_PASSED.eq(w.getSelfTestStatus())
+ || TenderSelfTestStatusEnum.SELF_TEST_INFO_FAILED.eq(w.getSelfTestStatus()))
+ .collect(Collectors.toMap(Purchase::getId, Function.identity()));
+ if (purchaseMap.isEmpty()) {
+ return;
+ }
+ ProcessDetailVO detail = new ProcessDetailVO();
+ detail.setProcessName(getProcessNode().getName());
+ detail.setStepStatus(StepStatusEnum.COMPLETED);
+ detail.setProcessInfoList(new ArrayList<>());
+ processSchedule.add(detail);
+ Map instMap = purchaseInstService.list(purchaseMap.keySet(), InstTypeEnum.SELF_TEST.getCode());
+ for (Map.Entry entry : instMap.entrySet()) {
+ if (detail.getFinishTime() == null || detail.getFinishTime().isBefore(entry.getValue().getCreateOn())) {
+ detail.setFinishTime(entry.getValue().getCreateOn());
+ }
+ ProcessProgressVo instanceDetail = processInstanceService.getProgressInstanceDetail(null, entry.getValue().getInstCode());
+ buildUserUtils.buildUserByProcessInfo(instanceDetail.getProgressInfo());
+ ProcessInfoVO tenderProgress = new ProcessInfoVO();
+ tenderProgress.setProcessName(purchaseMap.get(entry.getKey()).getBidName());
+ tenderProgress.setProcessProgressVo(instanceDetail);
+ detail.getProcessInfoList().add(tenderProgress);
+ }
+ }
+
+ @Override
+ ProcessNode getProcessNode() {
+ return ProcessNode.SYSTEM_SELF_TEST;
+ }
+
+ @Override
+ public int getOrder() {
+ return getProcessNode().getOrder();
+ }
+
+}
diff --git a/hz-pm-api/src/main/java/com/hz/pm/api/projectlib/handle/ProjectTestValidHandle.java b/hz-pm-api/src/main/java/com/hz/pm/api/projectlib/handle/ProjectTestValidHandle.java
new file mode 100644
index 0000000..1ca5d7c
--- /dev/null
+++ b/hz-pm-api/src/main/java/com/hz/pm/api/projectlib/handle/ProjectTestValidHandle.java
@@ -0,0 +1,82 @@
+package com.hz.pm.api.projectlib.handle;
+
+import com.hz.pm.api.projectdeclared.model.entity.Purchase;
+import com.hz.pm.api.projectdeclared.model.entity.PurchaseInst;
+import com.hz.pm.api.projectdeclared.service.IPurchaseInstService;
+import com.hz.pm.api.projectdeclared.service.IPurchaseService;
+import com.hz.pm.api.projectlib.model.entity.Project;
+import com.hz.pm.api.projectlib.model.enumeration.InstTypeEnum;
+import com.hz.pm.api.projectlib.model.enumeration.TenderSelfTestStatusEnum;
+import com.hz.pm.api.projectlib.model.enumeration.TenderTestValidStatusEnum;
+import com.hz.pm.api.todocenter.utils.BuildUserUtils;
+import com.wflow.workflow.bean.vo.ProcessDetailVO;
+import com.wflow.workflow.bean.vo.ProcessInfoVO;
+import com.wflow.workflow.bean.vo.ProcessProgressVo;
+import com.wflow.workflow.enums.StepStatusEnum;
+import com.wflow.workflow.service.ProcessInstanceService;
+import lombok.RequiredArgsConstructor;
+import org.springframework.stereotype.Component;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.function.Function;
+import java.util.stream.Collectors;
+
+/**
+ *
+ * SelfTestHandle
+ *
+ *
+ * @author WendyYang
+ * @since 09:29 2024/4/9
+ */
+@Component
+@RequiredArgsConstructor
+public class ProjectTestValidHandle extends AbstractProcessBusinessHandle {
+
+ private final IPurchaseService purchaseService;
+ private final IPurchaseInstService purchaseInstService;
+ private final BuildUserUtils buildUserUtils;
+ private final ProcessInstanceService processInstanceService;
+
+ @Override
+ void businessHandle(Project project, List processSchedule) {
+ List purchases = purchaseService.listByProjectId(project.getId());
+ Map purchaseMap = purchases.stream()
+ .filter(w -> TenderTestValidStatusEnum.TEST_VALID_INFO_PASSED.eq(w.getTestValidStatus())
+ || TenderTestValidStatusEnum.TEST_VALID_INFO_FAILED.eq(w.getTestValidStatus()))
+ .collect(Collectors.toMap(Purchase::getId, Function.identity()));
+ if (purchaseMap.isEmpty()) {
+ return;
+ }
+ ProcessDetailVO detail = new ProcessDetailVO();
+ detail.setProcessName(getProcessNode().getName());
+ detail.setStepStatus(StepStatusEnum.COMPLETED);
+ detail.setProcessInfoList(new ArrayList<>());
+ processSchedule.add(detail);
+ Map instMap = purchaseInstService.list(purchaseMap.keySet(), InstTypeEnum.TEST_VALID.getCode());
+ for (Map.Entry entry : instMap.entrySet()) {
+ if (detail.getFinishTime() == null || detail.getFinishTime().isBefore(entry.getValue().getCreateOn())) {
+ detail.setFinishTime(entry.getValue().getCreateOn());
+ }
+ ProcessProgressVo instanceDetail = processInstanceService.getProgressInstanceDetail(null, entry.getValue().getInstCode());
+ buildUserUtils.buildUserByProcessInfo(instanceDetail.getProgressInfo());
+ ProcessInfoVO tenderProgress = new ProcessInfoVO();
+ tenderProgress.setProcessName(purchaseMap.get(entry.getKey()).getBidName());
+ tenderProgress.setProcessProgressVo(instanceDetail);
+ detail.getProcessInfoList().add(tenderProgress);
+ }
+ }
+
+ @Override
+ ProcessNode getProcessNode() {
+ return ProcessNode.SYSTEM_TEST_VALID;
+ }
+
+ @Override
+ public int getOrder() {
+ return getProcessNode().getOrder();
+ }
+
+}
diff --git a/hz-pm-api/src/main/java/com/hz/pm/api/projectlib/handle/ProvinceUnitedReviewHandle.java b/hz-pm-api/src/main/java/com/hz/pm/api/projectlib/handle/ProvinceUnitedReviewHandle.java
deleted file mode 100644
index c0b82fc..0000000
--- a/hz-pm-api/src/main/java/com/hz/pm/api/projectlib/handle/ProvinceUnitedReviewHandle.java
+++ /dev/null
@@ -1,109 +0,0 @@
-package com.hz.pm.api.projectlib.handle;
-
-import com.baomidou.mybatisplus.core.toolkit.Wrappers;
-import com.hz.pm.api.common.model.constant.BizConst;
-import com.hz.pm.api.common.model.constant.CommonConst;
-import com.hz.pm.api.projectlib.model.enumeration.ProjectStatusEnum;
-import com.hz.pm.api.projectlib.model.entity.Project;
-import com.hz.pm.api.projectlib.model.entity.ProjectStatusChange;
-import com.hz.pm.api.projectlib.service.IProjectStatusChangeService;
-import com.hz.pm.api.projectlib.service.IProjectService;
-import com.wflow.workflow.bean.vo.ProcessDetailVO;
-import com.wflow.workflow.enums.StepStatusEnum;
-import org.springframework.core.annotation.Order;
-import org.springframework.stereotype.Component;
-
-import java.util.List;
-import java.util.Objects;
-
-/**
- * 省级联审审核处理
- *
- * @author CMM
- * @since 2023/02/24 14:35
- */
-@Order(3)
-@Component
-public class ProvinceUnitedReviewHandle extends AbstractProcessBusinessHandle {
- private final IProjectService projectService;
- private final IProjectStatusChangeService projectStatusChangeService;
-
- private Integer order = 3;
-
- public ProvinceUnitedReviewHandle(IProjectService projectService,
- IProjectStatusChangeService projectStatusChangeService) {
- this.projectService = projectService;
- this.projectStatusChangeService = projectStatusChangeService;
- }
-
- @Override
- void businessHandle(Project project, List processSchedule) {
- ProcessDetailVO processDetailVO = new ProcessDetailVO();
-
- //查询项目
- Long projectId = project.getId();
- List allVersionProjectId = projectService.allVersionProjectIds(projectId);
-
- // 根据项目ID查询出部门联审流程的流程状态
- if (Objects.isNull(project)) {
- processDetailVO.setStepStatus(StepStatusEnum.NOT_START);
- processDetailVO.setProcessName(CommonConst.PROVINCE_UNITED_REVIEW);
- processSchedule.add(processDetailVO);
- return;
- }
-
- Integer status = project.getStatus();
- if (ProjectStatusEnum.JOINT_REVIEW_BY_PROVINCIAL_DEPARTMENTS.getCode().equals(status)) {
- processDetailVO.setStepStatus(StepStatusEnum.ON_GOING);
- ProjectStatusChange startChange = projectStatusChangeService.getOne(Wrappers.lambdaQuery(ProjectStatusChange.class)
- .in(ProjectStatusChange::getProjectId, allVersionProjectId)
- .eq(ProjectStatusChange::getBeforeStatus, ProjectStatusEnum.PENDING_PREQUALIFICATION.getCode())
- .eq(ProjectStatusChange::getAfterStatus, ProjectStatusEnum.JOINT_REVIEW_BY_PROVINCIAL_DEPARTMENTS.getCode()).orderByDesc(ProjectStatusChange::getCreateOn)
- .orderByDesc(ProjectStatusChange::getCreateOn)
- .last(BizConst.LIMIT_1));
- if (Objects.nonNull(startChange)) {
- processDetailVO.setFinishTime(startChange.getCreateOn());
- }
- } else if (status.compareTo(ProjectStatusEnum.JOINT_REVIEW_BY_PROVINCIAL_DEPARTMENTS.getCode()) > 0) {
- processDetailVO.setStepStatus(StepStatusEnum.COMPLETED);
- ProjectStatusChange passChange = projectStatusChangeService.getOne(Wrappers.lambdaQuery(ProjectStatusChange.class)
- .in(ProjectStatusChange::getProjectId, allVersionProjectId)
- .eq(ProjectStatusChange::getBeforeStatus, ProjectStatusEnum.JOINT_REVIEW_BY_PROVINCIAL_DEPARTMENTS.getCode())
- .eq(ProjectStatusChange::getAfterStatus, ProjectStatusEnum.JOINT_REVIEW_BY_PROVINCIAL_DEPARTMENTS_SUCCESS.getCode())
- .orderByDesc(ProjectStatusChange::getCreateOn)
- .last(BizConst.LIMIT_1));
- if (Objects.nonNull(passChange)) {
- processDetailVO.setFinishTime(passChange.getCreateOn());
- }
- } else if (status.compareTo(ProjectStatusEnum.THE_JOINT_REVIEW_OF_PROVINCIAL_DEPARTMENTS_FAILED.getCode()) > 0) {
- processDetailVO.setStepStatus(StepStatusEnum.REJECTED);
- ProjectStatusChange rejectChange = projectStatusChangeService.getOne(Wrappers.lambdaQuery(ProjectStatusChange.class)
- .in(ProjectStatusChange::getProjectId, allVersionProjectId)
- .eq(ProjectStatusChange::getBeforeStatus, ProjectStatusEnum.JOINT_REVIEW_BY_PROVINCIAL_DEPARTMENTS.getCode())
- .eq(ProjectStatusChange::getAfterStatus, ProjectStatusEnum.THE_JOINT_REVIEW_OF_PROVINCIAL_DEPARTMENTS_FAILED.getCode())
- .orderByDesc(ProjectStatusChange::getCreateOn)
- .last(BizConst.LIMIT_1));
- if (Objects.nonNull(rejectChange)) {
- processDetailVO.setFinishTime(rejectChange.getCreateOn());
- }
- } else {
- processDetailVO.setStepStatus(StepStatusEnum.NOT_START);
- processDetailVO.setProcessName(CommonConst.PROVINCE_UNITED_REVIEW);
- processSchedule.add(processDetailVO);
- return;
- }
- processDetailVO.setContent(project.getSjlsResult());
- processDetailVO.setProcessName(CommonConst.PROVINCE_UNITED_REVIEW);
- processSchedule.add(processDetailVO);
- }
-
- @Override
- Integer getOrder() {
- return order;
- }
-
- @Override
- void setOrder(Integer order) {
- this.order = order;
- }
-}
diff --git a/hz-pm-api/src/main/java/com/hz/pm/api/projectlib/handle/TenderPurchaseHandle.java b/hz-pm-api/src/main/java/com/hz/pm/api/projectlib/handle/TenderPurchaseHandle.java
deleted file mode 100644
index 2443e71..0000000
--- a/hz-pm-api/src/main/java/com/hz/pm/api/projectlib/handle/TenderPurchaseHandle.java
+++ /dev/null
@@ -1,97 +0,0 @@
-package com.hz.pm.api.projectlib.handle;
-
-import com.baomidou.mybatisplus.core.toolkit.Wrappers;
-import com.hz.pm.api.common.model.constant.BizConst;
-import com.hz.pm.api.common.model.constant.CommonConst;
-import com.hz.pm.api.common.statemachine.event.ProjectStateChangeEvent;
-import com.hz.pm.api.projectlib.model.enumeration.ProjectStatusEnum;
-import com.hz.pm.api.projectlib.model.entity.Project;
-import com.hz.pm.api.projectlib.model.entity.ProjectStatusChange;
-import com.hz.pm.api.projectlib.service.IProjectStatusChangeService;
-import com.hz.pm.api.projectlib.service.IProjectService;
-import com.ningdatech.basic.util.CollUtils;
-import com.wflow.workflow.bean.vo.ProcessDetailVO;
-import com.wflow.workflow.enums.StepStatusEnum;
-import org.springframework.core.annotation.Order;
-import org.springframework.stereotype.Component;
-
-import java.util.Arrays;
-import java.util.List;
-import java.util.Objects;
-
-import static com.hz.pm.api.projectlib.model.enumeration.ProjectStatusEnum.*;
-
-/**
- * 招标采购处理
- *
- * @author CMM
- * @since 2023/02/24 14:35
- */
-@Order(9)
-@Component
-public class TenderPurchaseHandle extends AbstractProcessBusinessHandle {
- private final IProjectStatusChangeService projectStatusChangeService;
- private final IProjectService projectService;
-
- private Integer order = 9;
-
- /**
- * 项目状态为:建设中及之后的状态
- */
- private static final List TENDER_PURCHASE_LIST_STATUS = Arrays.asList(
- UNDER_CONSTRUCTION,
- TO_BE_FINALLY_INSPECTED,
- FINAL_ACCEPTANCE_IS_UNDER_REVIEW,
- FINAL_ACCEPTANCE_REVIEW_FAILED,
- ARCHIVED,
- ACCEPTED
- );
-
- public TenderPurchaseHandle(IProjectStatusChangeService projectStatusChangeService, IProjectService projectService) {
- this.projectStatusChangeService = projectStatusChangeService;
- this.projectService = projectService;
- }
-
- @Override
- void businessHandle(Project project, List processSchedule) {
- ProcessDetailVO processDetailVO = new ProcessDetailVO();
- // 根据项目是否通过立项批复(立项批复时间)来判断招标采购是否开始
- List allVersionProjectIds = projectService.allVersionProjectIds(project.getProjectCode());
- Integer status = project.getStatus();
- // 未进行立项批复
- if (Objects.isNull(project.getApprovalDate())) {
- processDetailVO.setStepStatus(StepStatusEnum.NOT_START);
- processDetailVO.setProcessName(CommonConst.TENDER_PURCHASE);
- processSchedule.add(processDetailVO);
- return;
- }
- List fieldList = CollUtils.fieldList(TENDER_PURCHASE_LIST_STATUS, ProjectStatusEnum::getCode);
- // 进行了立项批复且项目状态是待采购
- if (ProjectStatusEnum.TO_BE_PURCHASED.getCode().equals(project.getStatus())) {
- processDetailVO.setStepStatus(StepStatusEnum.ON_GOING);
- } else if (fieldList.contains(status)) {
- processDetailVO.setStepStatus(StepStatusEnum.COMPLETED);
- // 根据采购备案的时间获取
- ProjectStatusChange projectStatusChange = projectStatusChangeService.getOne(Wrappers.lambdaQuery(ProjectStatusChange.class)
- .in(ProjectStatusChange::getProjectId, allVersionProjectIds)
- .eq(ProjectStatusChange::getEvent, ProjectStateChangeEvent.SUBMIT_PURCHASE_NOTICE.name())
- .orderByDesc(ProjectStatusChange::getCreateOn)
- .last(BizConst.LIMIT_1));
- if (projectStatusChange != null) {
- processDetailVO.setFinishTime(projectStatusChange.getCreateOn());
- }
- }
- processDetailVO.setProcessName(CommonConst.TENDER_PURCHASE);
- processSchedule.add(processDetailVO);
- }
-
- @Override
- Integer getOrder() {
- return order;
- }
-
- @Override
- void setOrder(Integer order) {
- this.order = order;
- }
-}
diff --git a/hz-pm-api/src/main/java/com/hz/pm/api/projectlib/handle/UnitInnerAuditHandle.java b/hz-pm-api/src/main/java/com/hz/pm/api/projectlib/handle/UnitInnerAuditHandle.java
deleted file mode 100644
index dc1d82c..0000000
--- a/hz-pm-api/src/main/java/com/hz/pm/api/projectlib/handle/UnitInnerAuditHandle.java
+++ /dev/null
@@ -1,136 +0,0 @@
-package com.hz.pm.api.projectlib.handle;
-
-import cn.hutool.core.collection.CollUtil;
-import com.baomidou.mybatisplus.core.toolkit.Wrappers;
-import com.google.common.collect.Lists;
-import com.hz.pm.api.common.model.constant.BizConst;
-import com.hz.pm.api.common.model.constant.CommonConst;
-import com.hz.pm.api.projectlib.model.entity.Project;
-import com.hz.pm.api.projectlib.model.entity.ProjectInst;
-import com.hz.pm.api.projectlib.model.enumeration.InstTypeEnum;
-import com.hz.pm.api.projectlib.service.IProjectInstService;
-import com.hz.pm.api.projectlib.service.IProjectService;
-import com.hz.pm.api.projectlib.utils.ProjectVersionUtil;
-import com.hz.pm.api.todocenter.constant.TodoCenterConst;
-import com.hz.pm.api.todocenter.utils.BuildUserUtils;
-import com.ningdatech.basic.util.NdDateUtils;
-import com.wflow.workflow.bean.dto.ProcessInstanceUserDto;
-import com.wflow.workflow.bean.process.ProgressNode;
-import com.wflow.workflow.bean.vo.ProcessDetailVO;
-import com.wflow.workflow.bean.vo.ProcessProgressVo;
-import com.wflow.workflow.enums.ProcessStatusEnum;
-import com.wflow.workflow.enums.StepStatusEnum;
-import com.wflow.workflow.service.ProcessInstanceService;
-import org.springframework.core.annotation.Order;
-import org.springframework.stereotype.Component;
-
-import java.time.LocalDateTime;
-import java.util.List;
-import java.util.Map;
-import java.util.Objects;
-
-/**
- * 单位内部审核处理
- *
- * @author CMM
- * @since 2023/02/24 14:35
- */
-@Order(2)
-@Component
-public class UnitInnerAuditHandle extends AbstractProcessBusinessHandle {
-
- private final IProjectInstService projectInstService;
-
- private final ProcessInstanceService processInstanceService;
- private final BuildUserUtils buildUserUtils;
- private final ProjectVersionUtil projectVersionUtil;
- private final IProjectService projectService;
-
- private Integer order = 2;
-
- public UnitInnerAuditHandle(IProjectInstService projectInstService, ProcessInstanceService processInstanceService, BuildUserUtils buildUserUtils, ProjectVersionUtil projectVersionUtil, IProjectService projectService) {
- this.projectInstService = projectInstService;
- this.processInstanceService = processInstanceService;
- this.buildUserUtils = buildUserUtils;
- this.projectVersionUtil = projectVersionUtil;
- this.projectService = projectService;
- }
-
- @Override
- void businessHandle(Project project, List processSchedule) {
- ProcessDetailVO processDetailVO = new ProcessDetailVO();
- processDetailVO.setProcessName(CommonConst.UNIT_INNER_AUDIT);
- Long projectId = project.getId();
- List allVersionProjectIds = projectService.allVersionProjectIds(project.getProjectCode());
- // 根据项目ID查询出单位内部审核流程的流程状态
- ProjectInst projectInst = projectInstService.getOne(Wrappers.lambdaQuery(ProjectInst.class)
- .in(ProjectInst::getProjectId, allVersionProjectIds)
- .eq(ProjectInst::getInstType, InstTypeEnum.UNIT_INNER_AUDIT.getCode())
- .ne(ProjectInst::getInstCode, TodoCenterConst.Declared.NULL_INST_CODE)
- .orderByDesc(ProjectInst::getCreateOn)
- .last(BizConst.LIMIT_1));
- ProcessProgressVo instanceDetail = null;
-
- // 未找到当前版本项目的单位内部审核流程且当前项目版本号大于1(是被驳回重新申报的项目)
- // 注意:已经在项目库中的项目,一定是单位内部审核已经开始的项目
- if (Objects.isNull(projectInst)) {
- if (project.getVersion() > CommonConst.VERSION_ONE) {
- // 获取上个版本的信息
- instanceDetail = projectVersionUtil.getPreVerProcessInfo(projectId, InstTypeEnum.UNIT_INNER_AUDIT);
- }
- } else {
- String instCode = projectInst.getInstCode();
- instanceDetail = processInstanceService.getProgressInstanceDetail(null, instCode);
- }
- processSchedule.add(processDetailVO);
- if (Objects.isNull(instanceDetail)) {
- return;
- }
- String status = instanceDetail.getStatus();
- if (ProcessStatusEnum.UNDER_REVIEW.getDesc().equals(status)) {
- processDetailVO.setStepStatus(StepStatusEnum.ON_GOING);
- } else if (ProcessStatusEnum.BE_REJECTED.getDesc().equals(status)) {
- processDetailVO.setStepStatus(StepStatusEnum.REJECTED);
- } else if (ProcessStatusEnum.APPROVED.getDesc().equals(status)) {
- processDetailVO.setStepStatus(StepStatusEnum.COMPLETED);
- }
-
- // 装配节点审核人员信息
- List progressInfo = instanceDetail.getProgressInfo();
- if (CollUtil.isNotEmpty(progressInfo)) {
- buildUserUtils.buildUserByProcessInfo(progressInfo);
- // 根据流程处理详情获取流程完成时间
- if (StepStatusEnum.contains(processDetailVO.getStepStatus(),
- Lists.newArrayList(StepStatusEnum.REJECTED,
- StepStatusEnum.COMPLETED))) {
- // 如果是驳回,获取流程信息时可能
- ProgressNode progressNode = progressInfo.get(progressInfo.size() - 1);
- LocalDateTime finishTime = NdDateUtils.date2LocalDateTime(progressNode.getFinishTime());
- processDetailVO.setFinishTime(finishTime);
- }
- } else {
- LocalDateTime finishTime = NdDateUtils.date2LocalDateTime(instanceDetail.getStartTime());
- processDetailVO.setFinishTime(finishTime);
- }
- processDetailVO.setProcessProgressVo(instanceDetail);
- }
-
- @Override
- Integer getOrder() {
- return order;
- }
-
- @Override
- void setOrder(Integer order) {
- this.order = order;
- }
-
- private void buildUser(List progressInfo, Map userMap) {
- for (ProgressNode progressNode : progressInfo) {
- progressNode.setUser(userMap.get(progressNode.getUserId()));
- if (CollUtil.isNotEmpty(progressNode.getChildren())) {
- buildUser(progressNode.getChildren(), userMap);
- }
- }
- }
-}
diff --git a/hz-pm-api/src/main/java/com/hz/pm/api/projectlib/handle/XcfhxReviewHandle.java b/hz-pm-api/src/main/java/com/hz/pm/api/projectlib/handle/XcfhxReviewHandle.java
new file mode 100644
index 0000000..53542ba
--- /dev/null
+++ b/hz-pm-api/src/main/java/com/hz/pm/api/projectlib/handle/XcfhxReviewHandle.java
@@ -0,0 +1,81 @@
+package com.hz.pm.api.projectlib.handle;
+
+import com.hz.pm.api.projectdeclared.model.entity.Purchase;
+import com.hz.pm.api.projectdeclared.model.entity.PurchaseInst;
+import com.hz.pm.api.projectdeclared.service.IPurchaseInstService;
+import com.hz.pm.api.projectdeclared.service.IPurchaseService;
+import com.hz.pm.api.projectlib.model.entity.Project;
+import com.hz.pm.api.projectlib.model.enumeration.InstTypeEnum;
+import com.hz.pm.api.projectlib.model.enumeration.TenderXcfhxApplyStatusEnum;
+import com.hz.pm.api.todocenter.utils.BuildUserUtils;
+import com.wflow.workflow.bean.vo.ProcessDetailVO;
+import com.wflow.workflow.bean.vo.ProcessInfoVO;
+import com.wflow.workflow.bean.vo.ProcessProgressVo;
+import com.wflow.workflow.enums.StepStatusEnum;
+import com.wflow.workflow.service.ProcessInstanceService;
+import lombok.RequiredArgsConstructor;
+import org.springframework.stereotype.Component;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.function.Function;
+import java.util.stream.Collectors;
+
+/**
+ *
+ * XcfhxReviewHandle
+ *
+ *
+ * @author WendyYang
+ * @since 10:43 2024/4/9
+ */
+@Component
+@RequiredArgsConstructor
+public class XcfhxReviewHandle extends AbstractProcessBusinessHandle {
+
+ private final IPurchaseService purchaseService;
+ private final IPurchaseInstService purchaseInstService;
+ private final BuildUserUtils buildUserUtils;
+ private final ProcessInstanceService processInstanceService;
+
+
+ @Override
+ void businessHandle(Project project, List processSchedule) {
+ List purchases = purchaseService.listByProjectId(project.getId());
+ Map purchaseMap = purchases.stream()
+ .filter(w -> TenderXcfhxApplyStatusEnum.XCFHX_APPLY_PASSED.eq(w.getXcfhxApplyStatus())
+ || TenderXcfhxApplyStatusEnum.XCFHX_APPLY_FAILED.eq(w.getXcfhxApplyStatus()))
+ .collect(Collectors.toMap(Purchase::getId, Function.identity()));
+ if (purchaseMap.isEmpty()) {
+ return;
+ }
+ ProcessDetailVO detail = new ProcessDetailVO();
+ detail.setProcessName(getProcessNode().getName());
+ detail.setStepStatus(StepStatusEnum.COMPLETED);
+ detail.setProcessInfoList(new ArrayList<>());
+ processSchedule.add(detail);
+ Map instMap = purchaseInstService.list(purchaseMap.keySet(), InstTypeEnum.XCFHX_APPLY.getCode());
+ for (Map.Entry entry : instMap.entrySet()) {
+ if (detail.getFinishTime() == null || detail.getFinishTime().isBefore(entry.getValue().getCreateOn())) {
+ detail.setFinishTime(entry.getValue().getCreateOn());
+ }
+ ProcessProgressVo instanceDetail = processInstanceService.getProgressInstanceDetail(null, entry.getValue().getInstCode());
+ buildUserUtils.buildUserByProcessInfo(instanceDetail.getProgressInfo());
+ ProcessInfoVO tenderProgress = new ProcessInfoVO();
+ tenderProgress.setProcessName(purchaseMap.get(entry.getKey()).getBidName());
+ tenderProgress.setProcessProgressVo(instanceDetail);
+ detail.getProcessInfoList().add(tenderProgress);
+ }
+ }
+
+ @Override
+ ProcessNode getProcessNode() {
+ return ProcessNode.XCFHX_REVIEW;
+ }
+
+ @Override
+ public int getOrder() {
+ return getProcessNode().getOrder();
+ }
+}
diff --git a/hz-pm-api/src/main/java/com/hz/pm/api/projectlib/manage/ProjectLibManage.java b/hz-pm-api/src/main/java/com/hz/pm/api/projectlib/manage/ProjectLibManage.java
index 7a87869..efe725d 100644
--- a/hz-pm-api/src/main/java/com/hz/pm/api/projectlib/manage/ProjectLibManage.java
+++ b/hz-pm-api/src/main/java/com/hz/pm/api/projectlib/manage/ProjectLibManage.java
@@ -53,7 +53,7 @@ import com.hz.pm.api.projectdeclared.service.IPreInsAcceptancePersonService;
import com.hz.pm.api.projectdeclared.service.IPurchaseService;
import com.hz.pm.api.projectdeclared.utils.ProjectCodeGenUtil;
import com.hz.pm.api.projectlib.entity.ProjectGovSystemReplaceInfos;
-import com.hz.pm.api.projectlib.handle.ProcessExecuteChainHandle;
+import com.hz.pm.api.projectlib.handle.ProcessProgressContext;
import com.hz.pm.api.projectlib.helper.ProjectHelper;
import com.hz.pm.api.projectlib.model.constant.ProjectConstant;
import com.hz.pm.api.projectlib.model.dto.GovSystemReplaceInfoDTO;
@@ -122,7 +122,7 @@ public class ProjectLibManage {
private final IProjectService projectService;
private final IProjectApplicationService applicationService;
private final IProjectRenewalFundDeclarationService renewalFundDeclarationService;
- private final ProcessExecuteChainHandle processExecuteHandle;
+ private final ProcessProgressContext processExecuteHandle;
private final FileService fileService;
private final IProjectApplicationService projectApplicationService;
private final ProjectCodeGenUtil projectCodeGenUtil;