@@ -26,6 +26,7 @@ public enum ProjectProcessStageEnum { | |||
DEPARTMENT_JOINT_APPROVAL_PROCESS(3, "部门联合审批流程"), | |||
CONSTRUCTION_PROJECT_APPROVAL_PROCESS(4, "建设方案审批流程"), | |||
PROJECT_RECORD_APPROVAL_PROCESS(8, "立项备案审批流程"), | |||
XC_APPROVAL_PROCESS(9, "信创审批流程"), | |||
ACCEPTANCE_DECLARATION_APPROVAL_PROCESS(5, "验收申报审批流程"), | |||
APPLY_DELAY(6, "申请延期审批流程"), | |||
APPLY_BORROW(7, "申请借阅审批流程"); | |||
@@ -0,0 +1,142 @@ | |||
package com.hz.pm.api.common.statemachine.action; | |||
import cn.hutool.core.lang.Assert; | |||
import com.hz.pm.api.common.statemachine.builder.impl.TenderStateMachineBuilderImpl; | |||
import com.hz.pm.api.common.statemachine.event.ProjectStatusChangeEvent; | |||
import com.hz.pm.api.common.statemachine.util.TenderStateMachineUtil; | |||
import com.hz.pm.api.projectdeclared.model.entity.Purchase; | |||
import com.hz.pm.api.projectlib.model.enumeration.TenderStatusEnum; | |||
import lombok.extern.slf4j.Slf4j; | |||
import org.springframework.messaging.Message; | |||
import org.springframework.statemachine.annotation.OnTransition; | |||
import org.springframework.statemachine.annotation.WithStateMachine; | |||
/** | |||
* <p> | |||
* 标段状态机action集合类 | |||
* </p> | |||
* | |||
* @author WendyYang | |||
* @since 17:08 2024/2/24 | |||
*/ | |||
@Slf4j | |||
@WithStateMachine(id = TenderStateMachineBuilderImpl.MACHINE_ID) | |||
public class TenderAction { | |||
private Purchase getPurchaseInfo(Message<ProjectStatusChangeEvent> message) { | |||
Purchase purchase = (Purchase) message.getHeaders().get(TenderStateMachineUtil.PURCHASE); | |||
Assert.notNull(purchase, "未获取到需要状态变更的标段信息"); | |||
return purchase; | |||
} | |||
/** | |||
* 填写采购信息 | |||
* | |||
* @param message \ | |||
*/ | |||
@OnTransition(source = "TO_BE_SUBMIT_PURCHASE_INFO", target = "TO_BE_SUBMIT_CONSTRUCTION_INFO") | |||
public void SUBMIT_PURCHASE_INFO(Message<ProjectStatusChangeEvent> message) { | |||
Purchase purchase = getPurchaseInfo(message); | |||
purchase.setStatus(TenderStatusEnum.TO_BE_SUBMIT_CONSTRUCTION_INFO.getTenderStatus()); | |||
} | |||
/** | |||
* 填写合同信息 | |||
* | |||
* @param message \ | |||
*/ | |||
@OnTransition(source = "TO_BE_SUBMIT_CONSTRUCTION_INFO", target = "TO_BE_SUBMIT_OPERATION_PLAN") | |||
public void SUBMIT_CONSTRUCTION_INFO(Message<ProjectStatusChangeEvent> message) { | |||
Purchase purchase = getPurchaseInfo(message); | |||
purchase.setStatus(TenderStatusEnum.TO_BE_SUBMIT_OPERATION_PLAN.getTenderStatus()); | |||
} | |||
/** | |||
* 填写实施计划 | |||
* | |||
* @param message \ | |||
*/ | |||
@OnTransition(source = "TO_BE_SUBMIT_OPERATION_PLAN", target = "TO_BE_SUBMIT_FIRST_INSPECTED_INFO") | |||
public void SUBMIT_OPERATION_PLAN(Message<ProjectStatusChangeEvent> message) { | |||
Purchase purchase = getPurchaseInfo(message); | |||
purchase.setStatus(TenderStatusEnum.TO_BE_SUBMIT_FIRST_INSPECTED_INFO.getTenderStatus()); | |||
} | |||
/** | |||
* 上传初验材料 | |||
* | |||
* @param message \ | |||
*/ | |||
@OnTransition(source = "TO_BE_SUBMIT_FIRST_INSPECTED_INFO", target = "TO_BE_SUBMIT_XCFHX_APPLY") | |||
public void SUBMIT_FIRST_INSPECTED_FILES(Message<ProjectStatusChangeEvent> message) { | |||
Purchase purchase = getPurchaseInfo(message); | |||
purchase.setStatus(TenderStatusEnum.TO_BE_SUBMIT_XCFHX_APPLY.getTenderStatus()); | |||
} | |||
/** | |||
* 信创符合性申请 | |||
* | |||
* @param message \ | |||
*/ | |||
@OnTransition(source = "TO_BE_SUBMIT_XCFHX_APPLY", target = "ON_XCFHX_APPLY") | |||
public void SUBMIT_XCFHX_APPLY(Message<ProjectStatusChangeEvent> message) { | |||
Purchase purchase = getPurchaseInfo(message); | |||
purchase.setStatus(TenderStatusEnum.ON_XCFHX_APPLY.getTenderStatus()); | |||
} | |||
/** | |||
* 信创符合性申请通过 | |||
* | |||
* @param message \ | |||
*/ | |||
@OnTransition(source = "ON_XCFHX_APPLY", target = "TO_BE_SUBMIT_FINALLY_INSPECTED_APPLY") | |||
public void XCFHX_APPLY_PASSED(Message<ProjectStatusChangeEvent> message) { | |||
Purchase purchase = getPurchaseInfo(message); | |||
purchase.setStatus(TenderStatusEnum.TO_BE_SUBMIT_FINALLY_INSPECTED_APPLY.getTenderStatus()); | |||
} | |||
/** | |||
* 信创符合性申请失败 | |||
* | |||
* @param message \ | |||
*/ | |||
@OnTransition(source = "ON_XCFHX_APPLY", target = "XCFHX_APPLY_FAILED") | |||
public void XCFHX_APPLY_FAILED(Message<ProjectStatusChangeEvent> message) { | |||
Purchase purchase = getPurchaseInfo(message); | |||
purchase.setStatus(TenderStatusEnum.XCFHX_APPLY_FAILED.getTenderStatus()); | |||
} | |||
/** | |||
* 终验申报 | |||
* | |||
* @param message \ | |||
*/ | |||
@OnTransition(source = "TO_BE_SUBMIT_FINALLY_INSPECTED_APPLY", target = "ON_FINALLY_INSPECTED_APPLY") | |||
public void SUBMIT_FINALLY_INSPECTED(Message<ProjectStatusChangeEvent> message) { | |||
Purchase purchase = getPurchaseInfo(message); | |||
purchase.setStatus(TenderStatusEnum.ON_FINALLY_INSPECTED_APPLY.getTenderStatus()); | |||
} | |||
/** | |||
* 终验申报通过 | |||
* | |||
* @param message \ | |||
*/ | |||
@OnTransition(source = "ON_FINALLY_INSPECTED_APPLY", target = "FINALLY_INSPECTED_PASSED") | |||
public void FINALLY_INSPECTED_PASSED(Message<ProjectStatusChangeEvent> message) { | |||
Purchase purchase = getPurchaseInfo(message); | |||
purchase.setStatus(TenderStatusEnum.FINALLY_INSPECTED_PASSED.getTenderStatus()); | |||
} | |||
/** | |||
* 终验申报拒绝 | |||
* | |||
* @param message \ | |||
*/ | |||
@OnTransition(source = "ON_FINALLY_INSPECTED_APPLY", target = "FINALLY_INSPECTED_FAILED") | |||
public void FINALLY_INSPECTED_FAILED(Message<ProjectStatusChangeEvent> message) { | |||
Purchase purchase = getPurchaseInfo(message); | |||
purchase.setStatus(TenderStatusEnum.FINALLY_INSPECTED_FAILED.getTenderStatus()); | |||
} | |||
} |
@@ -0,0 +1,36 @@ | |||
package com.hz.pm.api.common.statemachine.builder; | |||
import com.hz.pm.api.common.statemachine.event.TenderStatusChangeEvent; | |||
import com.hz.pm.api.projectdeclared.model.entity.Purchase; | |||
import com.hz.pm.api.projectlib.model.enumeration.TenderStatusEnum; | |||
import org.springframework.beans.factory.BeanFactory; | |||
import org.springframework.statemachine.StateMachine; | |||
import org.springframework.statemachine.StateMachineException; | |||
import org.springframework.statemachine.persist.StateMachinePersister; | |||
/** | |||
* 项目申报状态机 | |||
* | |||
* @author CMM | |||
* @since 2023/02/07 15:56 | |||
*/ | |||
public interface TenderStateMachineBuilder { | |||
StateMachine<TenderStatusEnum, TenderStatusChangeEvent> build() throws StateMachineException; | |||
/** | |||
* 构建状态机 | |||
* | |||
* @param beanFactory \ | |||
*/ | |||
StateMachine<TenderStatusEnum, TenderStatusChangeEvent> build(BeanFactory beanFactory) throws StateMachineException; | |||
/** | |||
* 持久化配置 | |||
* | |||
* @author CMM | |||
* @since 2023/02/07 16:22 | |||
*/ | |||
StateMachinePersister<TenderStatusEnum, TenderStatusChangeEvent, Purchase> stateMachinePersister(); | |||
} |
@@ -0,0 +1,152 @@ | |||
package com.hz.pm.api.common.statemachine.builder.impl; | |||
import com.hz.pm.api.common.statemachine.builder.TenderStateMachineBuilder; | |||
import com.hz.pm.api.common.statemachine.event.TenderStatusChangeEvent; | |||
import com.hz.pm.api.projectdeclared.model.entity.Purchase; | |||
import com.hz.pm.api.projectlib.model.enumeration.TenderStatusEnum; | |||
import lombok.RequiredArgsConstructor; | |||
import lombok.extern.slf4j.Slf4j; | |||
import org.springframework.beans.factory.BeanFactory; | |||
import org.springframework.context.annotation.Bean; | |||
import org.springframework.statemachine.StateMachine; | |||
import org.springframework.statemachine.StateMachineContext; | |||
import org.springframework.statemachine.StateMachineException; | |||
import org.springframework.statemachine.StateMachinePersist; | |||
import org.springframework.statemachine.config.EnableStateMachine; | |||
import org.springframework.statemachine.config.StateMachineBuilder; | |||
import org.springframework.statemachine.persist.DefaultStateMachinePersister; | |||
import org.springframework.statemachine.persist.StateMachinePersister; | |||
import org.springframework.statemachine.support.DefaultStateMachineContext; | |||
import org.springframework.stereotype.Component; | |||
import java.util.EnumSet; | |||
/** | |||
* <p> | |||
* 标段状态机 | |||
* </p> | |||
* | |||
* @author WendyYang | |||
* @since 16:38 2024/2/24 | |||
*/ | |||
@Slf4j | |||
@Component | |||
@EnableStateMachine(name = TenderStateMachineBuilderImpl.MACHINE_ID) | |||
@RequiredArgsConstructor | |||
public class TenderStateMachineBuilderImpl implements TenderStateMachineBuilder { | |||
public static final String MACHINE_ID = "tenderStateMachine"; | |||
private final BeanFactory beanFactory; | |||
@Override | |||
public StateMachine<TenderStatusEnum, TenderStatusChangeEvent> build() throws StateMachineException { | |||
StateMachine<TenderStatusEnum, TenderStatusChangeEvent> stateMachine = build(beanFactory); | |||
log.info("状态机ID:" + stateMachine.getId()); | |||
stateMachine.start(); | |||
return stateMachine; | |||
} | |||
@Override | |||
public StateMachine<TenderStatusEnum, TenderStatusChangeEvent> build(BeanFactory beanFactory) throws StateMachineException { | |||
try { | |||
return buildStateMachine(beanFactory); | |||
} catch (Exception e) { | |||
throw new StateMachineException("状态机构件失败", e); | |||
} | |||
} | |||
private StateMachine<TenderStatusEnum, TenderStatusChangeEvent> buildStateMachine(BeanFactory factory) throws Exception { | |||
StateMachineBuilder.Builder<TenderStatusEnum, TenderStatusChangeEvent> builder = StateMachineBuilder.builder(); | |||
builder.configureConfiguration() | |||
.withConfiguration() | |||
.machineId(MACHINE_ID) | |||
.beanFactory(factory); | |||
builder.configureStates() | |||
.withStates() | |||
.initial(TenderStatusEnum.TO_BE_SUBMIT_PURCHASE_INFO) | |||
.states(EnumSet.allOf(TenderStatusEnum.class)); | |||
builder.configureTransitions() | |||
// 填写采购信息 | |||
.withExternal() | |||
.source(TenderStatusEnum.TO_BE_SUBMIT_PURCHASE_INFO) | |||
.target(TenderStatusEnum.TO_BE_SUBMIT_CONSTRUCTION_INFO) | |||
.event(TenderStatusChangeEvent.SUBMIT_PURCHASE_INFO) | |||
.and() | |||
// 填写合同信息 | |||
.withExternal() | |||
.source(TenderStatusEnum.TO_BE_SUBMIT_CONSTRUCTION_INFO) | |||
.target(TenderStatusEnum.TO_BE_SUBMIT_OPERATION_PLAN) | |||
.event(TenderStatusChangeEvent.SUBMIT_CONSTRUCTION_INFO) | |||
.and() | |||
// 填写实施计划 | |||
.withExternal() | |||
.source(TenderStatusEnum.TO_BE_SUBMIT_OPERATION_PLAN) | |||
.target(TenderStatusEnum.TO_BE_SUBMIT_FIRST_INSPECTED_INFO) | |||
.event(TenderStatusChangeEvent.SUBMIT_OPERATION_PLAN) | |||
.and() | |||
// 上传初验材料 | |||
.withExternal() | |||
.source(TenderStatusEnum.TO_BE_SUBMIT_FIRST_INSPECTED_INFO) | |||
.target(TenderStatusEnum.TO_BE_SUBMIT_XCFHX_APPLY) | |||
.event(TenderStatusChangeEvent.SUBMIT_FIRST_INSPECTED_FILES) | |||
.and() | |||
// 信创符合性申请 | |||
.withExternal() | |||
.source(TenderStatusEnum.TO_BE_SUBMIT_XCFHX_APPLY) | |||
.target(TenderStatusEnum.ON_XCFHX_APPLY) | |||
.event(TenderStatusChangeEvent.SUBMIT_XCFHX_APPLY) | |||
.and() | |||
// 信创符合性申请通过 | |||
.withExternal() | |||
.source(TenderStatusEnum.ON_XCFHX_APPLY) | |||
.target(TenderStatusEnum.TO_BE_SUBMIT_FINALLY_INSPECTED_APPLY) | |||
.event(TenderStatusChangeEvent.XCFHX_APPLY_PASSED) | |||
.and() | |||
// 信创符合性申请失败 | |||
.withExternal() | |||
.source(TenderStatusEnum.ON_XCFHX_APPLY) | |||
.target(TenderStatusEnum.XCFHX_APPLY_FAILED) | |||
.event(TenderStatusChangeEvent.XCFHX_APPLY_FAILED) | |||
.and() | |||
// 终验申报 | |||
.withExternal() | |||
.source(TenderStatusEnum.TO_BE_SUBMIT_FINALLY_INSPECTED_APPLY) | |||
.target(TenderStatusEnum.ON_FINALLY_INSPECTED_APPLY) | |||
.event(TenderStatusChangeEvent.SUBMIT_FINALLY_INSPECTED) | |||
.and() | |||
// 终验申报通过 | |||
.withExternal() | |||
.source(TenderStatusEnum.ON_FINALLY_INSPECTED_APPLY) | |||
.target(TenderStatusEnum.FINALLY_INSPECTED_PASSED) | |||
.event(TenderStatusChangeEvent.FINALLY_INSPECTED_PASSED) | |||
.and() | |||
// 终验申报拒绝 | |||
.withExternal() | |||
.source(TenderStatusEnum.ON_FINALLY_INSPECTED_APPLY) | |||
.target(TenderStatusEnum.FINALLY_INSPECTED_FAILED) | |||
.event(TenderStatusChangeEvent.FINALLY_INSPECTED_FAILED) | |||
.and(); | |||
return builder.build(); | |||
} | |||
@Override | |||
@Bean(name = "tenderStatePersister") | |||
public StateMachinePersister<TenderStatusEnum, TenderStatusChangeEvent, Purchase> stateMachinePersister() { | |||
return new DefaultStateMachinePersister<>(new StateMachinePersist<TenderStatusEnum, TenderStatusChangeEvent, Purchase>() { | |||
@Override | |||
public void write(StateMachineContext<TenderStatusEnum, TenderStatusChangeEvent> context, Purchase contextObj) { | |||
log.info("当前项目为:{}", contextObj); | |||
} | |||
@Override | |||
public StateMachineContext<TenderStatusEnum, TenderStatusChangeEvent> read(Purchase contextObj) { | |||
return new DefaultStateMachineContext<>(TenderStatusEnum.getByStatus(contextObj.getStatus()), | |||
null, null, null, null, MACHINE_ID); | |||
} | |||
}); | |||
} | |||
} |
@@ -0,0 +1,102 @@ | |||
package com.hz.pm.api.common.statemachine.event; | |||
import lombok.AllArgsConstructor; | |||
import lombok.Getter; | |||
import java.util.Objects; | |||
/** | |||
* <p> | |||
* TenderStatusChangeEvent | |||
* </p> | |||
* | |||
* @author WendyYang | |||
* @since 00:14 2024/2/24 | |||
*/ | |||
@Getter | |||
@AllArgsConstructor | |||
public enum TenderStatusChangeEvent { | |||
/** | |||
* 填写采购信息 | |||
*/ | |||
SUBMIT_PURCHASE_INFO(101, null, null), | |||
/** | |||
* 填写合同信息 | |||
*/ | |||
SUBMIT_CONSTRUCTION_INFO(102, null, null), | |||
/** | |||
* 填写实施计划 | |||
*/ | |||
SUBMIT_OPERATION_PLAN(103, null, null), | |||
/** | |||
* 上传初验材料 | |||
*/ | |||
SUBMIT_FIRST_INSPECTED_FILES(201, null, null), | |||
/** | |||
* 信创符合性申请 | |||
*/ | |||
SUBMIT_XCFHX_APPLY(301, null, null), | |||
/** | |||
* 信创符合性申请通过 | |||
*/ | |||
XCFHX_APPLY_PASSED(302, null, null), | |||
/** | |||
* 信创符合性申请不通过 | |||
*/ | |||
XCFHX_APPLY_FAILED(null, 303, null), | |||
/** | |||
* 终验申报 | |||
*/ | |||
SUBMIT_FINALLY_INSPECTED(401, null, null), | |||
/** | |||
* 终验申报通过 | |||
*/ | |||
FINALLY_INSPECTED_PASSED(501, null, null), | |||
/** | |||
* 终验申报拒绝 | |||
*/ | |||
FINALLY_INSPECTED_FAILED(null, 502, null); | |||
private final Integer passStatusCode; | |||
private final Integer rejectStatusCode; | |||
private final Integer withdrawStatusCode; | |||
public static TenderStatusChangeEvent getPassValueByCode(Integer code) { | |||
if (Objects.isNull(code)) { | |||
return null; | |||
} | |||
for (TenderStatusChangeEvent t : TenderStatusChangeEvent.values()) { | |||
if (code.equals(t.getPassStatusCode())) { | |||
return t; | |||
} | |||
} | |||
return null; | |||
} | |||
public static TenderStatusChangeEvent getRejectValueByCode(Integer code) { | |||
if (Objects.isNull(code)) { | |||
return null; | |||
} | |||
for (TenderStatusChangeEvent t : TenderStatusChangeEvent.values()) { | |||
if (code.equals(t.getRejectStatusCode())) { | |||
return t; | |||
} | |||
} | |||
return null; | |||
} | |||
public static TenderStatusChangeEvent getWithdrawValueByCode(Integer code) { | |||
if (Objects.isNull(code)) { | |||
return null; | |||
} | |||
for (TenderStatusChangeEvent t : TenderStatusChangeEvent.values()) { | |||
if (code.equals(t.getWithdrawStatusCode())) { | |||
return t; | |||
} | |||
} | |||
return null; | |||
} | |||
} |
@@ -11,9 +11,11 @@ import org.springframework.statemachine.guard.Guard; | |||
* @author CMM | |||
* @since 2023/02/07 16:18 | |||
*/ | |||
public class ProjectDeclareGuardFactory { | |||
private ProjectDeclareGuardFactory() { | |||
} | |||
public static class PendingPreQualificationChoiceGuard implements Guard<ProjectStatusEnum, ProjectStatusChangeEvent> { | |||
@Override | |||
public boolean evaluate(StateContext<ProjectStatusEnum, ProjectStatusChangeEvent> context) { | |||
@@ -0,0 +1,107 @@ | |||
package com.hz.pm.api.common.statemachine.util; | |||
import com.hz.pm.api.common.statemachine.builder.TenderStateMachineBuilder; | |||
import com.hz.pm.api.common.statemachine.event.TenderStatusChangeEvent; | |||
import com.hz.pm.api.projectdeclared.model.entity.Purchase; | |||
import com.hz.pm.api.projectlib.model.enumeration.TenderStatusEnum; | |||
import com.ningdatech.basic.exception.BizException; | |||
import com.wflow.exception.BusinessException; | |||
import lombok.RequiredArgsConstructor; | |||
import lombok.extern.slf4j.Slf4j; | |||
import org.springframework.messaging.Message; | |||
import org.springframework.messaging.support.MessageBuilder; | |||
import org.springframework.statemachine.StateMachine; | |||
import org.springframework.statemachine.persist.StateMachinePersister; | |||
import org.springframework.stereotype.Component; | |||
import java.util.Objects; | |||
/** | |||
* <p> | |||
* 标段状态机工具类 | |||
* </p> | |||
* | |||
* @author WendyYang | |||
* @since 17:06 2024/2/24 | |||
*/ | |||
@Slf4j | |||
@Component | |||
@RequiredArgsConstructor | |||
public class TenderStateMachineUtil { | |||
public static final String PURCHASE = "purchaseInfo"; | |||
//================================================================================================================== | |||
private final TenderStateMachineBuilder tenderStateMachineBuilder; | |||
//通过审核 | |||
public void pass(Purchase purchase) { | |||
try { | |||
execute(purchase, getPassEvent(purchase.getStatus())); | |||
} catch (Exception e) { | |||
log.info("状态机 通过失败 :{}", e.getMessage()); | |||
throw new BusinessException("状态机 通过失败: " + e); | |||
} | |||
} | |||
//拒绝 | |||
public void reject(Purchase purchase) { | |||
try { | |||
execute(purchase, getRejectEvent(purchase.getStatus())); | |||
} catch (Exception e) { | |||
log.info("状态机 拒绝失败 :{}", e.getMessage()); | |||
throw new BusinessException("状态机 拒绝失败: " + e); | |||
} | |||
} | |||
//撤回 | |||
public void withDraw(Purchase purchase) { | |||
try { | |||
execute(purchase, getWithdrawEvent(purchase.getStatus())); | |||
} catch (Exception e) { | |||
log.info("状态机 撤回失败 :{}", e.getMessage()); | |||
throw new BusinessException("状态机 撤回失败: " + e); | |||
} | |||
} | |||
public void execute(Purchase purchase, TenderStatusChangeEvent event) throws Exception { | |||
log.info("调用状态机前的标段状态为:{}", purchase.getStatus()); | |||
// 获取TO状态机 | |||
StateMachine<TenderStatusEnum, TenderStatusChangeEvent> stateMachine = tenderStateMachineBuilder.build(); | |||
Message<TenderStatusChangeEvent> message = MessageBuilder.withPayload(event) | |||
.setHeader(PURCHASE, purchase) | |||
.build(); | |||
//初始化状态机 | |||
StateMachinePersister<TenderStatusEnum, TenderStatusChangeEvent, Purchase> stateMachinePersister = tenderStateMachineBuilder.stateMachinePersister(); | |||
stateMachinePersister.restore(stateMachine, purchase); | |||
stateMachine.sendEvent(message); | |||
log.info("调用状态机后的标段状态为:{}", purchase.getStatus()); | |||
} | |||
public TenderStatusChangeEvent getPassEvent(Integer status) { | |||
TenderStatusChangeEvent event = TenderStatusChangeEvent.getPassValueByCode(status); | |||
if (Objects.isNull(event)) { | |||
throw new BizException("该状态下没有对应的通过操作!"); | |||
} | |||
return event; | |||
} | |||
public TenderStatusChangeEvent getRejectEvent(Integer status) { | |||
TenderStatusChangeEvent event = TenderStatusChangeEvent.getRejectValueByCode(status); | |||
if (Objects.isNull(event)) { | |||
throw new BizException("该状态下没有对应的驳回操作!"); | |||
} | |||
return event; | |||
} | |||
public TenderStatusChangeEvent getWithdrawEvent(Integer status) { | |||
TenderStatusChangeEvent event = TenderStatusChangeEvent.getWithdrawValueByCode(status); | |||
if (Objects.isNull(event)) { | |||
throw new BizException("该状态下没有对应的撤回操作!"); | |||
} | |||
return event; | |||
} | |||
} |
@@ -231,7 +231,7 @@ public class ProjectFileManage { | |||
ProjectReviewDetailVO projectReviewDetailVo = expertReviewManage.projectExpertReviewDetail(projectCode); | |||
List<PurchaseVO> purchaseVos = purchaseManage.detailByProjectId(projectId); | |||
List<ContractVO> contractVos = constructionManage.detailContractByProjectId(projectId); | |||
PreInsVO preInsVo = constructionManage.detailPreInsByProjectId(projectId); | |||
List<PreInsVO> preInsVo = constructionManage.detailPreInsByProjectId(projectId); | |||
FinalAcceptanceVO finalAcceptanceVo = finalAcceptanceManage.detailByProjectId(projectId); | |||
projectFileVo.setProjectDetailVo(projectDetailVo); | |||
@@ -450,10 +450,11 @@ public class ProjectFileManage { | |||
List<Long> contractFileIdList = getFileIdList(attachment); | |||
fileIdList.addAll(contractFileIdList); | |||
} | |||
// TODO | |||
// 初验备案阶段 | |||
// 获取初验材料 | |||
String preliminaryInspectionMaterials = project.getPreliminaryInspectionMaterials(); | |||
getInspectionMaterials(fileIdList, preliminaryInspectionMaterials); | |||
// String preliminaryInspectionMaterials = project.getPreliminaryInspectionMaterials(); | |||
// getInspectionMaterials(fileIdList, preliminaryInspectionMaterials); | |||
// 终验申报阶段 | |||
// 获取终验材料 | |||
@@ -39,7 +39,7 @@ public class ProjectFileVO { | |||
private List<ContractVO> contractVos; | |||
@ApiModelProperty("初验登记详情") | |||
private PreInsVO preInsVo; | |||
private List<PreInsVO> preInsVo; | |||
@ApiModelProperty("终验信息详情") | |||
private FinalAcceptanceVO finalAcceptanceVo; | |||
@@ -5,6 +5,7 @@ import com.hz.pm.api.projectdeclared.manage.ConstructionManage; | |||
import com.hz.pm.api.projectdeclared.model.dto.PaymentPlanSupplementDTO; | |||
import com.hz.pm.api.projectdeclared.model.dto.PreInsSaveDTO; | |||
import com.hz.pm.api.projectdeclared.model.req.SubmitConstructionReq; | |||
import com.hz.pm.api.projectdeclared.model.req.XcfhxApplyReq; | |||
import com.hz.pm.api.projectdeclared.model.vo.ContractVO; | |||
import com.hz.pm.api.projectdeclared.model.vo.PreInsVO; | |||
import com.hz.pm.api.projectdeclared.model.vo.ProjectContractListVO; | |||
@@ -13,6 +14,7 @@ import com.hz.pm.api.projectlib.model.vo.ProjectLibListItemVO; | |||
import com.ningdatech.basic.model.PageVo; | |||
import com.ningdatech.log.annotation.WebLog; | |||
import io.swagger.annotations.Api; | |||
import io.swagger.annotations.ApiModelProperty; | |||
import io.swagger.annotations.ApiOperation; | |||
import lombok.RequiredArgsConstructor; | |||
import lombok.extern.slf4j.Slf4j; | |||
@@ -91,14 +93,22 @@ public class ConstructionController { | |||
@ApiOperation(value = "初验备案的详情-通过项目ID", notes = "初验备案的详情-通过项目ID") | |||
@GetMapping("/pre-ins/detail/{projectId}") | |||
public PreInsVO detailPreInsByProjectId(@PathVariable Long projectId) { | |||
public List<PreInsVO> detailPreInsByProjectId(@PathVariable Long projectId) { | |||
return constructionManage.detailPreInsByProjectId(projectId); | |||
} | |||
@ApiOperation(value = "填写初验信息", notes = "填写初验信息") | |||
@WebLog("填写初验信息") | |||
@ApiOperation(value = "上传初验材料") | |||
@WebLog("上传初验材料") | |||
@PostMapping("/submit-pre-ins") | |||
public String submitPreIns(@Validated @RequestBody PreInsSaveDTO dto) { | |||
return constructionManage.submitPreIns(dto); | |||
public void submitPreIns(@Validated @RequestBody PreInsSaveDTO dto) { | |||
constructionManage.submitFirstInspectedFiles(dto); | |||
} | |||
@ApiOperation("信创符合性申请") | |||
@WebLog("信创符合性申请") | |||
@PostMapping("/submitXcfhxApply") | |||
public void submitXcfhxApply(@RequestBody XcfhxApplyReq req){ | |||
constructionManage.submitXcfhxApply(req); | |||
} | |||
} |
@@ -1,5 +1,7 @@ | |||
package com.hz.pm.api.projectdeclared.controller; | |||
import com.hz.pm.api.projectdeclared.model.req.SubmitConstructionReq; | |||
import com.hz.pm.api.projectdeclared.model.req.SubmitFinallyInspectedReq; | |||
import com.ningdatech.basic.model.PageVo; | |||
import com.ningdatech.log.annotation.WebLog; | |||
import com.hz.pm.api.common.util.ExcelDownUtil; | |||
@@ -55,8 +57,8 @@ public class FinalAcceptanceController { | |||
@ApiOperation(value = "终验申报", notes = "终验申报") | |||
@WebLog("终验申报") | |||
@PostMapping("/start-process") | |||
public String startTheProcess(@Validated @RequestBody DefaultDeclaredDTO dto) { | |||
String instanceId = finalAcceptanceManage.startProcess(dto); | |||
public String startTheProcess(@Validated @RequestBody SubmitFinallyInspectedReq req) { | |||
String instanceId = finalAcceptanceManage.startProcess(req); | |||
return "终验申报 【" + instanceId + "】 成功"; | |||
} | |||
@@ -7,33 +7,36 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; | |||
import com.baomidou.mybatisplus.core.toolkit.Wrappers; | |||
import com.baomidou.mybatisplus.extension.plugins.pagination.Page; | |||
import com.google.common.collect.Lists; | |||
import com.hz.pm.api.common.enumeration.ProjectProcessStageEnum; | |||
import com.hz.pm.api.common.helper.UserInfoHelper; | |||
import com.hz.pm.api.common.model.constant.BizConst; | |||
import com.hz.pm.api.common.statemachine.util.StateMachineUtil; | |||
import com.hz.pm.api.common.statemachine.util.TenderStateMachineUtil; | |||
import com.hz.pm.api.common.util.DecimalUtil; | |||
import com.hz.pm.api.common.util.ExcelDownUtil; | |||
import com.hz.pm.api.common.util.ExcelExportStyle; | |||
import com.hz.pm.api.projectdeclared.model.dto.ContractSaveDTO; | |||
import com.hz.pm.api.common.util.StrUtils; | |||
import com.hz.pm.api.projectdeclared.model.dto.DeclaredProjectExportDTO; | |||
import com.hz.pm.api.projectdeclared.model.dto.PaymentPlanSupplementDTO; | |||
import com.hz.pm.api.projectdeclared.model.dto.PreInsSaveDTO; | |||
import com.hz.pm.api.projectdeclared.model.entity.Contract; | |||
import com.hz.pm.api.projectdeclared.model.entity.PaymentPlan; | |||
import com.hz.pm.api.projectdeclared.model.entity.PreInsAcceptancePerson; | |||
import com.hz.pm.api.projectdeclared.model.entity.Purchase; | |||
import com.hz.pm.api.projectdeclared.model.entity.*; | |||
import com.hz.pm.api.projectdeclared.model.req.SubmitConstructionReq; | |||
import com.hz.pm.api.projectdeclared.model.vo.*; | |||
import com.hz.pm.api.projectdeclared.service.IContractService; | |||
import com.hz.pm.api.projectdeclared.service.IPaymentPlanService; | |||
import com.hz.pm.api.projectdeclared.service.IPreInsAcceptancePersonService; | |||
import com.hz.pm.api.projectdeclared.service.IPurchaseService; | |||
import com.hz.pm.api.projectdeclared.model.req.XcfhxApplyReq; | |||
import com.hz.pm.api.projectdeclared.model.vo.ContractVO; | |||
import com.hz.pm.api.projectdeclared.model.vo.PreInsAcceptancePersonVO; | |||
import com.hz.pm.api.projectdeclared.model.vo.PreInsVO; | |||
import com.hz.pm.api.projectdeclared.model.vo.ProjectContractListVO; | |||
import com.hz.pm.api.projectdeclared.service.*; | |||
import com.hz.pm.api.projectlib.helper.ProjectHelper; | |||
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.ProjectPaymentPlan; | |||
import com.hz.pm.api.projectlib.model.enumeration.ProjectStatusEnum; | |||
import com.hz.pm.api.projectlib.model.enumeration.ProjectTypeNewEnum; | |||
import com.hz.pm.api.projectlib.model.enumeration.TenderStatusEnum; | |||
import com.hz.pm.api.projectlib.model.req.ProjectListReq; | |||
import com.hz.pm.api.projectlib.model.vo.ProjectLibListItemVO; | |||
import com.hz.pm.api.projectlib.service.IProjectInstService; | |||
import com.hz.pm.api.projectlib.service.IProjectPaymentPlanService; | |||
import com.hz.pm.api.projectlib.service.IProjectService; | |||
import com.hz.pm.api.user.security.model.UserFullInfoDTO; | |||
@@ -44,16 +47,19 @@ import com.ningdatech.basic.function.VUtils; | |||
import com.ningdatech.basic.model.PageVo; | |||
import com.ningdatech.basic.util.CollUtils; | |||
import com.ningdatech.basic.util.NdDateUtils; | |||
import com.wflow.bean.entity.WflowModels; | |||
import com.wflow.workflow.bean.dto.OrgInfoDTO; | |||
import com.wflow.workflow.bean.vo.ProcessStartParamsVo; | |||
import com.wflow.workflow.service.ProcessInstanceService; | |||
import com.wflow.workflow.service.ProcessModelService; | |||
import lombok.RequiredArgsConstructor; | |||
import lombok.extern.slf4j.Slf4j; | |||
import org.apache.commons.lang3.StringUtils; | |||
import org.springframework.beans.BeanUtils; | |||
import org.springframework.stereotype.Component; | |||
import org.springframework.transaction.annotation.Transactional; | |||
import javax.servlet.http.HttpServletResponse; | |||
import java.math.BigDecimal; | |||
import java.math.RoundingMode; | |||
import java.time.LocalDateTime; | |||
import java.time.format.DateTimeFormatter; | |||
import java.util.*; | |||
@@ -75,15 +81,17 @@ public class ConstructionManage { | |||
private final UserInfoHelper userInfoHelper; | |||
private final IPurchaseService purchaseService; | |||
private final IPurchaseInstService purchaseInstService; | |||
private final IContractService contractService; | |||
private final ProcessModelService processModelService; | |||
private final IProjectInstService projectInstService; | |||
private final IPaymentPlanService paymentPlanService; | |||
private final DefaultDeclaredProjectManage defaultDeclaredProjectManage; | |||
private final IPreInsAcceptancePersonService acceptancePersonService; | |||
private final ProcessInstanceService processInstanceService; | |||
private final StateMachineUtil stateMachineUtil; | |||
private final IProjectPaymentPlanService projectPaymentPlanService; | |||
private final TenderStateMachineUtil tenderStateMachineUtil; | |||
/** | |||
* 待采购的-项目列表 | |||
@@ -263,79 +271,6 @@ public class ConstructionManage { | |||
return BeanUtil.copyToList(contracts, ContractVO.class); | |||
} | |||
/** | |||
* 填写合同信息 | |||
* | |||
* @param dto \ | |||
* @return \ | |||
* @deprecated 弃用 | |||
*/ | |||
@Deprecated | |||
@Transactional(rollbackFor = Exception.class) | |||
public String submitContract(ContractSaveDTO dto) { | |||
UserFullInfoDTO user = userInfoHelper.getUserFullInfo(LoginUserUtil.getUserId()); | |||
Long projectId = dto.getProjectId(); | |||
VUtils.isTrue(Objects.isNull(projectId)).throwMessage("提交失败 缺少项目ID!"); | |||
Project project = projectService.getNewProject(dto.getProjectId()); | |||
VUtils.isTrue(Objects.isNull(project)).throwMessage("提交失败 此项目不存在!"); | |||
//首先要判断 项目当前状态 是不是 采购结果备案 | |||
VUtils.isTrue(!ProjectStatusEnum.UNDER_CONSTRUCTION.getCode().equals(project.getStatus()) || | |||
!ProjectStatusEnum.PROJECT_APPROVED.getCode().equals(project.getStage())) | |||
.throwMessage("提交失败 该项目不是 建设中或者已立项阶段"); | |||
Contract contractEntity = new Contract(); | |||
Contract contract = contractService.getOne(Wrappers.lambdaQuery(Contract.class) | |||
.eq(Contract::getProjectId, projectId) | |||
.last(BizConst.LIMIT_1)); | |||
BeanUtil.copyProperties(dto, contractEntity); | |||
if (Objects.isNull(contract)) { | |||
contractEntity.setCreateOn(LocalDateTime.now()); | |||
contractEntity.setCreateBy(user.getUserIdStr()); | |||
} else { | |||
contractEntity.setId(contract.getId()); | |||
} | |||
contractEntity.setProjectId(projectId); | |||
contractEntity.setProjectCode(project.getProjectCode()); | |||
if (contractService.saveOrUpdate(contractEntity) && (Objects.nonNull(dto.getPayments()))) { | |||
//先删除 | |||
paymentPlanService.remove(Wrappers.lambdaQuery(PaymentPlan.class) | |||
.eq(PaymentPlan::getProjectId, projectId)); | |||
if (CollUtil.isNotEmpty(dto.getPayments())) { | |||
List<PaymentPlan> payments = dto.getPayments().stream().map(d -> { | |||
PaymentPlan plan = BeanUtil.copyProperties(d, PaymentPlan.class); | |||
plan.setProjectId(projectId); | |||
plan.setProjectCode(project.getProjectCode()); | |||
plan.setCreateOn(LocalDateTime.now()); | |||
plan.setUpdateOn(LocalDateTime.now()); | |||
plan.setCreateBy(user.getUserIdStr()); | |||
plan.setUpdateBy(user.getUserIdStr()); | |||
return plan; | |||
}).collect(Collectors.toList()); | |||
paymentPlanService.saveBatch(payments); | |||
} | |||
} | |||
//判断下 如果和初验都完成了 才进入下一阶段 | |||
if (StringUtils.isNotBlank(project.getPreliminaryInspectionMaterials())) { | |||
//进入到下一状态 | |||
stateMachineUtil.pass(project); | |||
} | |||
project.setUpdateOn(LocalDateTime.now()); | |||
if (Objects.nonNull(dto.getDeliveryTime())) { | |||
project.setDeliveryTime(dto.getDeliveryTime()); | |||
} | |||
if (Objects.nonNull(dto.getTotalAmount())) { | |||
project.setContractAmount(dto.getTotalAmount()); | |||
} | |||
projectService.updateById(project); | |||
return "填写成功"; | |||
} | |||
@Transactional(rollbackFor = Exception.class) | |||
public String submitPurchaseContract(SubmitConstructionReq req) { | |||
UserInfoDetails user = LoginUserUtil.loginUserDetail(); | |||
@@ -512,19 +447,25 @@ public class ConstructionManage { | |||
* @param projectId | |||
* @return | |||
*/ | |||
public PreInsVO detailPreInsByProjectId(Long projectId) { | |||
Project project = projectService.getById(projectId); | |||
PreInsVO vo = new PreInsVO(); | |||
vo.setProjectId(projectId); | |||
vo.setPreliminaryInspectionMaterials(project.getPreliminaryInspectionMaterials()); | |||
vo.setIsCompletedLogCollection(project.getIsCompletedLogCollection()); | |||
vo.setActualPerformanceIndicators(project.getActualPerformanceIndicators()); | |||
LambdaQueryWrapper<PreInsAcceptancePerson> query = Wrappers.lambdaQuery(PreInsAcceptancePerson.class) | |||
.eq(PreInsAcceptancePerson::getProjectId, projectId) | |||
.orderByAsc(PreInsAcceptancePerson::getCreateOn); | |||
List<PreInsAcceptancePerson> acceptancePersons = acceptancePersonService.list(query); | |||
vo.setAcceptancePersons(convertPersons(acceptancePersons)); | |||
return vo; | |||
public List<PreInsVO> detailPreInsByProjectId(Long projectId) { | |||
List<Purchase> purchases = purchaseService.listByProjectId(projectId); | |||
List<Long> bidIds = CollUtils.fieldList(purchases, Purchase::getId); | |||
Map<Long, List<PreInsAcceptancePerson>> personMap = acceptancePersonService.listByBidIds(bidIds); | |||
return purchases.stream() | |||
.filter(w -> StrUtils.isNotBlank(w.getActualPerformanceIndicators())) | |||
.map(w -> { | |||
PreInsVO vo = new PreInsVO(); | |||
vo.setBidId(w.getId()); | |||
vo.setProjectId(w.getProjectId()); | |||
vo.setPreliminaryInspectionMaterials(w.getPreliminaryInspectionMaterials()); | |||
vo.setIsCompletedLogCollection(w.getIsCompletedLogCollection()); | |||
vo.setActualPerformanceIndicators(w.getActualPerformanceIndicators()); | |||
List<PreInsAcceptancePerson> persons = personMap.get(w.getId()); | |||
if (persons != null) { | |||
vo.setAcceptancePersons(convertPersons(persons)); | |||
} | |||
return vo; | |||
}).collect(Collectors.toList()); | |||
} | |||
private List<PreInsAcceptancePersonVO> convertPersons(List<PreInsAcceptancePerson> acceptancePersons) { | |||
@@ -536,56 +477,97 @@ public class ConstructionManage { | |||
.collect(Collectors.toList()); | |||
} | |||
/** | |||
* 填写初验信息 | |||
* | |||
* @param dto | |||
* @return | |||
*/ | |||
public String submitPreIns(PreInsSaveDTO dto) { | |||
UserFullInfoDTO user = userInfoHelper.getUserFullInfo(LoginUserUtil.getUserId()); | |||
Long projectId = dto.getProjectId(); | |||
VUtils.isTrue(Objects.isNull(projectId)).throwMessage("提交失败 缺少项目ID!"); | |||
Project project = projectService.getNewProject(dto.getProjectId()); | |||
VUtils.isTrue(Objects.isNull(project)).throwMessage("提交失败 此项目不存在!"); | |||
//首先要判断 项目当前状态 是不是 采购结果备案 | |||
VUtils.isTrue(!ProjectStatusEnum.UNDER_CONSTRUCTION.getCode().equals(project.getStatus()) || | |||
!ProjectStatusEnum.PROJECT_APPROVED.getCode().equals(project.getStage())) | |||
.throwMessage("提交失败 该项目不是 建设中或者已立项阶段"); | |||
@Transactional(rollbackFor = Exception.class) | |||
public void submitFirstInspectedFiles(PreInsSaveDTO req) { | |||
UserInfoDetails user = LoginUserUtil.loginUserDetail(); | |||
Purchase purchase = purchaseService.getById(req.getBidId()); | |||
if (!TenderStatusEnum.TO_BE_SUBMIT_FIRST_INSPECTED_INFO.eq(purchase.getStatus())) { | |||
throw BizException.wrap("该标段无法上传初验材料"); | |||
} | |||
LocalDateTime now = LocalDateTime.now(); | |||
//初验人员 | |||
if (Objects.nonNull(dto.getAcceptancePersons())) { | |||
if (Objects.nonNull(req.getAcceptancePersons())) { | |||
//先删除 | |||
acceptancePersonService.remove(Wrappers.lambdaQuery(PreInsAcceptancePerson.class) | |||
.eq(PreInsAcceptancePerson::getProjectId, projectId)); | |||
if (CollUtil.isNotEmpty(dto.getAcceptancePersons())) { | |||
List<PreInsAcceptancePerson> persons = dto.getAcceptancePersons().stream().map(d -> { | |||
PreInsAcceptancePerson person = BeanUtil.copyProperties(d, PreInsAcceptancePerson.class); | |||
person.setProjectId(projectId); | |||
person.setCreateOn(LocalDateTime.now()); | |||
person.setUpdateOn(LocalDateTime.now()); | |||
acceptancePersonService.removeByBidId(req.getBidId()); | |||
if (CollUtil.isNotEmpty(req.getAcceptancePersons())) { | |||
List<PreInsAcceptancePerson> persons = req.getAcceptancePersons().stream().map(d -> { | |||
PreInsAcceptancePerson person = new PreInsAcceptancePerson(); | |||
BeanUtil.copyProperties(d, person); | |||
person.setBidId(req.getBidId()); | |||
person.setProjectId(req.getProjectId()); | |||
person.setCreateOn(now); | |||
person.setUpdateOn(now); | |||
person.setCreateBy(user.getUserIdStr()); | |||
person.setUpdateBy(user.getMhUnitIdStr()); | |||
return person; | |||
}).collect(Collectors.toList()); | |||
acceptancePersonService.saveBatch(persons); | |||
} | |||
} | |||
//判断下 如果和初验都完成了 才进入下一阶段 | |||
if (Objects.nonNull(project.getDeliveryTime())) { | |||
//进入到下一状态 | |||
tenderStateMachineUtil.pass(purchase); | |||
purchase.setUpdateOn(now); | |||
purchase.setPreliminaryInspectionMaterials(req.getPreliminaryInspectionMaterials()); | |||
purchase.setIsCompletedLogCollection(req.getIsCompletedLogCollection()); | |||
purchase.setActualPerformanceIndicators(req.getActualPerformanceIndicators()); | |||
purchaseService.updateById(purchase); | |||
// 判断是否所有标段都上传了初验材料 | |||
List<Purchase> purchases = purchaseService.listByProjectId(req.getProjectId()); | |||
boolean finishedPreInst = purchases.stream().noneMatch(w -> TenderStatusEnum.TO_BE_SUBMIT_FIRST_INSPECTED_INFO.eq(w.getStatus())); | |||
if (finishedPreInst) { | |||
Project project = projectService.getById(req.getProjectId()); | |||
stateMachineUtil.pass(project); | |||
projectService.updateById(project); | |||
} | |||
project.setUpdateOn(LocalDateTime.now()); | |||
project.setPreliminaryInspectionMaterials(dto.getPreliminaryInspectionMaterials()); | |||
project.setIsCompletedLogCollection(dto.getIsCompletedLogCollection()); | |||
project.setActualPerformanceIndicators(dto.getActualPerformanceIndicators()); | |||
projectService.updateById(project); | |||
return "填写成功"; | |||
} | |||
@Transactional(rollbackFor = Exception.class) | |||
public void submitXcfhxApply(XcfhxApplyReq req) { | |||
Purchase purchase = purchaseService.getById(req.getBidId()); | |||
if (!TenderStatusEnum.TO_BE_SUBMIT_XCFHX_APPLY.eq(purchase.getStatus())) { | |||
throw BizException.wrap("该标段不支持提交信创符合性申请"); | |||
} | |||
UserInfoDetails user = LoginUserUtil.loginUserDetail(); | |||
WflowModels model = processModelService.getOne(Wrappers.lambdaQuery(WflowModels.class) | |||
.eq(WflowModels::getProcessType, ProjectProcessStageEnum.XC_APPROVAL_PROCESS.getCode()) | |||
.last(BizConst.LIMIT_1)); | |||
if (Objects.isNull(model)) { | |||
throw BizException.wrap("找不到信创审批流程配置"); | |||
} | |||
ProcessStartParamsVo processParam = new ProcessStartParamsVo(); | |||
processParam.setUser(defaultDeclaredProjectManage.buildUser(user.getUserId())); | |||
processParam.setProcessUsers(Collections.emptyMap()); | |||
// 获取发起单位、发起单位主管单位、发起单位上级主管条线单位信息 | |||
Project project = projectService.getById(req.getProjectId()); | |||
Map<String, OrgInfoDTO> orgMap = defaultDeclaredProjectManage.buildOrgModelMap(user.getUserId(), project); | |||
String instanceId = processInstanceService.startProcessLs(model, processParam, orgMap); | |||
ProjectInst projectInst = new ProjectInst(); | |||
projectInst.setInstCode(instanceId); | |||
projectInst.setInstType(ProjectProcessStageEnum.XC_APPROVAL_PROCESS.getCode()); | |||
projectInst.setProjectId(req.getProjectId()); | |||
projectInst.setUpdateOn(LocalDateTime.now()); | |||
projectInst.setCreatOn(projectInst.getUpdateOn()); | |||
projectInstService.save(projectInst); | |||
log.info("信创审查提交成功 【{}】", instanceId); | |||
purchase.setXcfhxApplyFiles(req.getXcfhxApplyFiles()); | |||
purchase.setMatchXcfhx(req.getMatchXcfhx()); | |||
purchase.setXcfhxApplyRemark(req.getXcfhxApplyRemark()); | |||
purchase.setXcfhxReportFiles(req.getXcfhxReportFiles()); | |||
tenderStateMachineUtil.pass(purchase); | |||
purchaseService.updateById(purchase); | |||
PurchaseInst purchaseInst = new PurchaseInst(); | |||
purchaseInst.setBidId(purchase.getId()); | |||
purchaseInst.setInstCode(instanceId); | |||
purchaseInst.setInstType(ProjectProcessStageEnum.XC_APPROVAL_PROCESS.getCode()); | |||
purchaseInst.setProjectId(req.getProjectId()); | |||
purchaseInst.setUpdateOn(LocalDateTime.now()); | |||
purchaseInst.setCreatOn(projectInst.getUpdateOn()); | |||
purchaseInstService.save(purchaseInst); | |||
} | |||
/** | |||
@@ -14,18 +14,11 @@ import com.baomidou.mybatisplus.core.toolkit.Assert; | |||
import com.baomidou.mybatisplus.core.toolkit.Wrappers; | |||
import com.baomidou.mybatisplus.extension.plugins.pagination.Page; | |||
import com.google.common.collect.Lists; | |||
import com.hz.pm.api.projectlib.model.dto.ProjectPaymentPlanDTO; | |||
import com.ningdatech.basic.exception.BizException; | |||
import com.ningdatech.basic.function.VUtils; | |||
import com.ningdatech.basic.model.PageVo; | |||
import com.ningdatech.basic.util.CollUtils; | |||
import com.ningdatech.basic.util.NdDateUtils; | |||
import com.ningdatech.basic.util.StrPool; | |||
import com.hz.pm.api.common.model.constant.BizConst; | |||
import com.hz.pm.api.common.enumeration.CommonEnum; | |||
import com.hz.pm.api.common.enumeration.ProjectProcessStageEnum; | |||
import com.hz.pm.api.common.helper.RegionCacheHelper; | |||
import com.hz.pm.api.common.helper.UserInfoHelper; | |||
import com.hz.pm.api.common.model.constant.BizConst; | |||
import com.hz.pm.api.common.util.ExcelDownUtil; | |||
import com.hz.pm.api.common.util.ExcelExportStyle; | |||
import com.hz.pm.api.gov.manage.GovProjectCollectionManage; | |||
@@ -35,13 +28,14 @@ import com.hz.pm.api.projectdeclared.model.dto.*; | |||
import com.hz.pm.api.projectdeclared.model.entity.ProjectDraft; | |||
import com.hz.pm.api.projectdeclared.model.vo.ProjectDraftVO; | |||
import com.hz.pm.api.projectdeclared.service.IProjectDraftService; | |||
import com.hz.pm.api.projectlib.model.enumeration.ProjectStatusEnum; | |||
import com.hz.pm.api.projectlib.model.enumeration.ProjectTypeNewEnum; | |||
import com.hz.pm.api.projectlib.helper.ProjectHelper; | |||
import com.hz.pm.api.projectlib.manage.ProjectLibManage; | |||
import com.hz.pm.api.projectlib.model.dto.ProjectDTO; | |||
import com.hz.pm.api.projectlib.model.dto.ProjectPaymentPlanDTO; | |||
import com.hz.pm.api.projectlib.model.entity.Project; | |||
import com.hz.pm.api.projectlib.model.entity.ProjectApplication; | |||
import com.hz.pm.api.projectlib.model.enumeration.ProjectStatusEnum; | |||
import com.hz.pm.api.projectlib.model.enumeration.ProjectTypeNewEnum; | |||
import com.hz.pm.api.projectlib.model.req.ProjectListReq; | |||
import com.hz.pm.api.projectlib.model.vo.ProjectLibListItemVO; | |||
import com.hz.pm.api.projectlib.service.IProjectService; | |||
@@ -51,6 +45,12 @@ import com.hz.pm.api.todocenter.constant.WorkNoticeConst; | |||
import com.hz.pm.api.user.security.model.UserFullInfoDTO; | |||
import com.hz.pm.api.user.security.model.UserInfoDetails; | |||
import com.hz.pm.api.user.util.LoginUserUtil; | |||
import com.ningdatech.basic.exception.BizException; | |||
import com.ningdatech.basic.function.VUtils; | |||
import com.ningdatech.basic.model.PageVo; | |||
import com.ningdatech.basic.util.CollUtils; | |||
import com.ningdatech.basic.util.NdDateUtils; | |||
import com.ningdatech.basic.util.StrPool; | |||
import com.wflow.bean.entity.WflowModels; | |||
import com.wflow.exception.BusinessException; | |||
import com.wflow.workflow.bean.dto.OrgInfoDTO; | |||
@@ -313,12 +313,13 @@ public class DeclaredProjectManage { | |||
* @return \ | |||
*/ | |||
public Long saveToDraft(ProjectDraftSaveDTO dto, Integer draftType) { | |||
Long userId = LoginUserUtil.getUserId(); | |||
UserFullInfoDTO user = userInfoHelper.getUserFullInfo(LoginUserUtil.getUserId()); | |||
UserInfoDetails user = LoginUserUtil.loginUserDetail(); | |||
Long userId = user.getUserId(); | |||
ProjectDTO projectInfo = dto.getProjectInfo(); | |||
ProjectDraft draft = new ProjectDraft(); | |||
BeanUtils.copyProperties(projectInfo, draft); | |||
draft.setId(projectInfo.getDraftId()); | |||
//写死 是否有主管单位 | |||
draft.setIsHigherSuperOrg(CommonEnum.YES.getCode()); | |||
draft.setIsSuperOrg(CommonEnum.YES.getCode()); | |||
@@ -13,7 +13,11 @@ import com.hz.pm.api.common.util.ExcelDownUtil; | |||
import com.hz.pm.api.common.util.ExcelExportStyle; | |||
import com.hz.pm.api.projectdeclared.model.dto.DeclaredProjectExportDTO; | |||
import com.hz.pm.api.projectdeclared.model.dto.DefaultDeclaredDTO; | |||
import com.hz.pm.api.projectdeclared.model.entity.Purchase; | |||
import com.hz.pm.api.projectdeclared.model.req.SubmitFinallyInspectedReq; | |||
import com.hz.pm.api.projectdeclared.model.vo.FinalAcceptanceVO; | |||
import com.hz.pm.api.projectdeclared.service.IPurchaseInstService; | |||
import com.hz.pm.api.projectdeclared.service.IPurchaseService; | |||
import com.hz.pm.api.projectlib.helper.ProjectHelper; | |||
import com.hz.pm.api.projectlib.manage.ProjectLibManage; | |||
import com.hz.pm.api.projectlib.model.dto.ProjectDTO; | |||
@@ -21,11 +25,13 @@ 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.ProjectStatusEnum; | |||
import com.hz.pm.api.projectlib.model.enumeration.ProjectTypeNewEnum; | |||
import com.hz.pm.api.projectlib.model.enumeration.TenderStatusEnum; | |||
import com.hz.pm.api.projectlib.model.req.ProjectListReq; | |||
import com.hz.pm.api.projectlib.model.vo.ProjectLibListItemVO; | |||
import com.hz.pm.api.projectlib.service.IProjectService; | |||
import com.hz.pm.api.sys.manage.NoticeManage; | |||
import com.hz.pm.api.user.security.model.UserFullInfoDTO; | |||
import com.hz.pm.api.user.security.model.UserInfoDetails; | |||
import com.hz.pm.api.user.util.LoginUserUtil; | |||
import com.ningdatech.basic.exception.BizException; | |||
import com.ningdatech.basic.function.VUtils; | |||
@@ -69,15 +75,12 @@ public class FinalAcceptanceManage { | |||
private final IProjectService projectService; | |||
private final UserInfoHelper userInfoHelper; | |||
private final IPurchaseService purchaseService; | |||
private final IPurchaseInstService purchaseInstService; | |||
private final ProcessModelService processModelService; | |||
private final ProcessInstanceService processInstanceService; | |||
private final DefaultDeclaredProjectManage declaredProjectManage; | |||
private final NoticeManage noticeManage; | |||
private final ProjectLibManage projectLibManage; | |||
/** | |||
@@ -193,53 +196,34 @@ public class FinalAcceptanceManage { | |||
/** | |||
* 开启流程 | |||
* | |||
* @param dto | |||
* @param req | |||
* @return | |||
*/ | |||
public String startProcess(DefaultDeclaredDTO dto) { | |||
UserFullInfoDTO user = userInfoHelper.getUserFullInfo(LoginUserUtil.getUserId()); | |||
ProjectDTO projectDto = dto.getProjectInfo(); | |||
VUtils.isTrue(Objects.isNull(projectDto.getId())).throwMessage("提交失败 缺少项目ID!"); | |||
Project projectInfo = projectService.getNewProject(projectDto.getId()); | |||
VUtils.isTrue(Objects.isNull(projectInfo)).throwMessage("提交失败 此项目不存在!"); | |||
VUtils.isTrue(StringUtils.isBlank(projectDto.getFinalAcceptanceMaterials())).throwMessage("提交失败 请提交终验材料!"); | |||
public String startProcess(SubmitFinallyInspectedReq req) { | |||
String regionCode = projectInfo.getAreaCode(); | |||
Purchase purchase = purchaseService.getById(req.getBidId()); | |||
if (!TenderStatusEnum.TO_BE_SUBMIT_FINALLY_INSPECTED_APPLY.eq(purchase.getStatus())) { | |||
throw BizException.wrap("该标段不支持终验申报"); | |||
} | |||
UserInfoDetails user = LoginUserUtil.loginUserDetail(); | |||
WflowModels model = processModelService.getOne(Wrappers.lambdaQuery(WflowModels.class) | |||
.eq(WflowModels::getProcessType, ProjectProcessStageEnum.ACCEPTANCE_DECLARATION_APPROVAL_PROCESS.getCode()) | |||
.last(BizConst.LIMIT_1)); | |||
if (Objects.isNull(model)) { | |||
log.error("此 【{}】区域找不到 验收申报流程配置", regionCode); | |||
throw new BusinessException(String.format("此 【%s】区域找不到 验收申报流程配置", regionCode)); | |||
throw new BusinessException("找不到验收申报流程配置"); | |||
} | |||
//首先要判断 项目当前状态 是不是 方案待申报 | |||
VUtils.isTrue((!ProjectStatusEnum.TO_BE_FINALLY_INSPECTED.getCode().equals(projectInfo.getStatus()) && | |||
!ProjectStatusEnum.FINAL_ACCEPTANCE_REVIEW_FAILED.getCode().equals(projectInfo.getStatus())) || | |||
!ProjectStatusEnum.PROJECT_APPROVED.getCode().equals(projectInfo.getStage())) | |||
.throwMessage("提交失败 该项目不是 待终验状态|不通过或者已立项阶段"); | |||
Project project = projectService.getNewProject(req.getProjectId()); | |||
ProcessStartParamsVo params = new ProcessStartParamsVo(); | |||
params.setUser(declaredProjectManage.buildUser(user.getUserId())); | |||
params.setProcessUsers(Collections.emptyMap()); | |||
//放入条件判断的项目字段 | |||
//把条件值给放入工作流 | |||
declaredProjectManage.buildCondition(params, projectInfo); | |||
// 获取发起单位、发起单位主管单位、发起单位上级条线主管单位信息 | |||
Map<String, OrgInfoDTO> orgModelMap = declaredProjectManage.buildOrgModelMap(user.getUserId(), projectInfo); | |||
Map<String, OrgInfoDTO> orgModelMap = declaredProjectManage.buildOrgModelMap(user.getUserId(), project); | |||
String instanceId = processInstanceService.startProcessLs(model, params, orgModelMap); | |||
log.info("终验方案项目申报成功 【{}】", instanceId); | |||
//保存终验项目 | |||
//生成新版本 并且进入下一状态 | |||
projectInfo = projectLibManage.saveProjectWithVersionAndPass(projectInfo, instanceId, projectDto, | |||
InstTypeEnum.PROJECT_FINAL_INSPECTION.getCode(), Boolean.FALSE); | |||
//发送给第一个审批人消息 | |||
noticeManage.sendFirstUser(projectInfo, model.getFormName(), instanceId, PASS_MSG_TEMPLATE, PROJECT_REVIEW); | |||
return instanceId; | |||
} | |||
@@ -0,0 +1,17 @@ | |||
package com.hz.pm.api.projectdeclared.mapper; | |||
import com.baomidou.mybatisplus.core.mapper.BaseMapper; | |||
import com.hz.pm.api.projectdeclared.model.entity.PurchaseInst; | |||
import com.hz.pm.api.projectlib.model.entity.ProjectInst; | |||
/** | |||
* <p> | |||
* Mapper 接口 | |||
* </p> | |||
* | |||
* @author Poffy | |||
* @since 2023-02-13 | |||
*/ | |||
public interface PurchaseInstMapper extends BaseMapper<PurchaseInst> { | |||
} |
@@ -1,6 +1,5 @@ | |||
package com.hz.pm.api.projectdeclared.model.dto; | |||
import io.swagger.annotations.ApiModel; | |||
import io.swagger.annotations.ApiModelProperty; | |||
import lombok.Data; | |||
@@ -9,21 +8,23 @@ import javax.validation.constraints.NotNull; | |||
import java.util.List; | |||
/** | |||
* @Classname PreInsSaveDTO | |||
* @Description | |||
* @Date 2023/5/30 15:35 | |||
* @Author PoffyZhang | |||
* <p> | |||
* 标段初验材料参数类 | |||
* </p> | |||
* | |||
* @author WendyYang | |||
* @since 20:42 2024/2/24 | |||
*/ | |||
@Data | |||
@ApiModel(value = "PreInsSaveDTO", description = "") | |||
public class PreInsSaveDTO { | |||
private static final long serialVersionUID = 1L; | |||
@ApiModelProperty("项目ID") | |||
@NotNull(message = "项目ID不能为空") | |||
private Long projectId; | |||
@ApiModelProperty("标段ID") | |||
private Long bidId; | |||
@ApiModelProperty("初验材料") | |||
@NotBlank(message = "请提交初验材料") | |||
private String preliminaryInspectionMaterials; | |||
@@ -36,4 +37,5 @@ public class PreInsSaveDTO { | |||
@ApiModelProperty("实际成效指标") | |||
private String actualPerformanceIndicators; | |||
} |
@@ -10,18 +10,18 @@ import lombok.Data; | |||
import java.time.LocalDateTime; | |||
/** | |||
* @Classname PreInsAcceptancePerson | |||
* @Description 初验人员 | |||
* @Date 2023/5/30 15:35 | |||
* @Author PoffyZhang | |||
* <p> | |||
* 初验人员 | |||
* </p> | |||
* | |||
* @author WendyYang | |||
* @since 20:57 2024/2/24 | |||
*/ | |||
@Data | |||
@TableName("nd_pre_ins_acceptance_person") | |||
@ApiModel(value = "PreInsAcceptancePerson", description = "") | |||
@ApiModel(value = "PreInsAcceptancePerson") | |||
public class PreInsAcceptancePerson { | |||
private static final long serialVersionUID = 1L; | |||
@ApiModelProperty("主键") | |||
@TableId(type = IdType.AUTO) | |||
private Long id; | |||
@@ -41,6 +41,9 @@ public class PreInsAcceptancePerson { | |||
@ApiModelProperty("项目ID") | |||
private Long projectId; | |||
@ApiModelProperty("标段ID") | |||
private Long bidId; | |||
@ApiModelProperty("人员名称") | |||
private String personName; | |||
@@ -3,6 +3,7 @@ package com.hz.pm.api.projectdeclared.model.entity; | |||
import com.baomidou.mybatisplus.annotation.IdType; | |||
import com.baomidou.mybatisplus.annotation.TableId; | |||
import com.baomidou.mybatisplus.annotation.TableName; | |||
import com.hz.pm.api.common.compare.Compare; | |||
import io.swagger.annotations.ApiModel; | |||
import io.swagger.annotations.ApiModelProperty; | |||
import lombok.AllArgsConstructor; | |||
@@ -98,4 +99,29 @@ public class Purchase { | |||
@ApiModelProperty("投标截止时间") | |||
private LocalDateTime bidEndTime; | |||
private Integer status; | |||
@ApiModelProperty("初验材料") | |||
private String preliminaryInspectionMaterials; | |||
@ApiModelProperty("是否完成日志数据归集") | |||
private Boolean isCompletedLogCollection; | |||
@ApiModelProperty("实际成效指标") | |||
private String actualPerformanceIndicators; | |||
@ApiModelProperty("是否符合信创符合性要求") | |||
private Boolean matchXcfhx; | |||
@ApiModelProperty("信创符合性申请备注") | |||
private String xcfhxApplyRemark; | |||
@ApiModelProperty("信创符合性申请其他附件") | |||
private String xcfhxApplyFiles; | |||
@ApiModelProperty("信创报告") | |||
private String xcfhxReportFiles; | |||
} |
@@ -0,0 +1,45 @@ | |||
package com.hz.pm.api.projectdeclared.model.entity; | |||
import com.baomidou.mybatisplus.annotation.IdType; | |||
import com.baomidou.mybatisplus.annotation.TableId; | |||
import com.baomidou.mybatisplus.annotation.TableName; | |||
import io.swagger.annotations.ApiModelProperty; | |||
import lombok.Data; | |||
import java.time.LocalDateTime; | |||
/** | |||
* <p> | |||
* PurchaseInst | |||
* </p> | |||
* | |||
* @author WendyYang | |||
* @since 23:06 2024/2/24 | |||
*/ | |||
@Data | |||
@TableName("nd_purchase_inst") | |||
public class PurchaseInst { | |||
@ApiModelProperty("主键") | |||
@TableId(type = IdType.AUTO) | |||
private Long id; | |||
@ApiModelProperty("标段ID") | |||
private Long bidId; | |||
@ApiModelProperty("项目ID") | |||
private Long projectId; | |||
@ApiModelProperty("实例ID") | |||
private String instCode; | |||
@ApiModelProperty("实例类型 1单位内部审批流程 2项目预审审批流程 3部门联合审批流程 4建设方案审批流程 5验收申报审批流程") | |||
private Integer instType; | |||
@ApiModelProperty("创建时间") | |||
private LocalDateTime creatOn; | |||
@ApiModelProperty("修改时间") | |||
private LocalDateTime updateOn; | |||
} |
@@ -0,0 +1,37 @@ | |||
package com.hz.pm.api.projectdeclared.model.req; | |||
import io.swagger.annotations.ApiModelProperty; | |||
import lombok.Data; | |||
import javax.validation.constraints.NotBlank; | |||
import javax.validation.constraints.NotNull; | |||
/** | |||
* <p> | |||
* 标段终验材料参数类 | |||
* </p> | |||
* | |||
* @author WendyYang | |||
* @since 20:42 2024/2/24 | |||
*/ | |||
@Data | |||
public class SubmitFinallyInspectedReq { | |||
@ApiModelProperty("项目ID") | |||
@NotNull(message = "项目ID不能为空") | |||
private Long projectId; | |||
@ApiModelProperty("标段ID") | |||
private Long bidId; | |||
@ApiModelProperty("终验材料") | |||
@NotBlank(message = "请提交初验材料") | |||
private String inspectionMaterials; | |||
@ApiModelProperty("是否完成日志数据归集") | |||
private Boolean isCompletedLogCollection; | |||
@ApiModelProperty("实际成效指标") | |||
private String actualPerformanceIndicators; | |||
} |
@@ -0,0 +1,35 @@ | |||
package com.hz.pm.api.projectdeclared.model.req; | |||
import io.swagger.annotations.ApiModelProperty; | |||
import lombok.Data; | |||
/** | |||
* <p> | |||
* 信创符合性申请参数类 | |||
* </p> | |||
* | |||
* @author WendyYang | |||
* @since 21:13 2024/2/24 | |||
*/ | |||
@Data | |||
public class XcfhxApplyReq { | |||
@ApiModelProperty("项目ID") | |||
private Long projectId; | |||
@ApiModelProperty("标段ID") | |||
private Long bidId; | |||
@ApiModelProperty("是否符合信创符合性要求") | |||
private Boolean matchXcfhx; | |||
@ApiModelProperty("备注") | |||
private String xcfhxApplyRemark; | |||
@ApiModelProperty("其他附件") | |||
private String xcfhxApplyFiles; | |||
@ApiModelProperty("信创报告") | |||
private String xcfhxReportFiles; | |||
} |
@@ -16,7 +16,8 @@ import java.util.List; | |||
@ApiModel(value = "PreInsVO", description = "初验备案详情") | |||
public class PreInsVO { | |||
private static final long serialVersionUID = 1L; | |||
@ApiModelProperty("标段ID") | |||
private Long bidId; | |||
@ApiModelProperty("项目ID") | |||
private Long projectId; | |||
@@ -378,4 +378,8 @@ public class ProjectDraftVO implements Serializable { | |||
@ApiModelProperty("草稿箱类型:1 项目申报、2 立项备案") | |||
private Integer draftType; | |||
@ApiModelProperty("可研批复文件") | |||
private String baseResearchReportApprovalFile; | |||
} |
@@ -1,11 +1,18 @@ | |||
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.projectdeclared.model.entity.PreInsAcceptancePerson; | |||
import com.ningdatech.basic.util.CollUtils; | |||
import java.util.Collection; | |||
import java.util.List; | |||
import java.util.Map; | |||
/** | |||
* <p> | |||
* 服务类 | |||
* 服务类 | |||
* </p> | |||
* | |||
* @author zpf | |||
@@ -13,4 +20,16 @@ import com.hz.pm.api.projectdeclared.model.entity.PreInsAcceptancePerson; | |||
*/ | |||
public interface IPreInsAcceptancePersonService extends IService<PreInsAcceptancePerson> { | |||
default void removeByBidId(Long bidId) { | |||
Wrapper<PreInsAcceptancePerson> query = Wrappers.lambdaQuery(PreInsAcceptancePerson.class) | |||
.eq(PreInsAcceptancePerson::getBidId, bidId); | |||
remove(query); | |||
} | |||
default Map<Long, List<PreInsAcceptancePerson>> listByBidIds(Collection<Long> bidIds) { | |||
Wrapper<PreInsAcceptancePerson> query = Wrappers.lambdaQuery(PreInsAcceptancePerson.class) | |||
.in(PreInsAcceptancePerson::getBidId, bidIds); | |||
return CollUtils.group(list(query), PreInsAcceptancePerson::getBidId); | |||
} | |||
} |
@@ -0,0 +1,15 @@ | |||
package com.hz.pm.api.projectdeclared.service; | |||
import com.baomidou.mybatisplus.extension.service.IService; | |||
import com.hz.pm.api.projectdeclared.model.entity.PurchaseInst; | |||
/** | |||
* <p> | |||
* IPurchaseInstService | |||
* </p> | |||
* | |||
* @author WendyYang | |||
* @since 00:12 2024/2/25 | |||
*/ | |||
public interface IPurchaseInstService extends IService<PurchaseInst> { | |||
} |
@@ -0,0 +1,19 @@ | |||
package com.hz.pm.api.projectdeclared.service.impl; | |||
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; | |||
import com.hz.pm.api.projectdeclared.mapper.PurchaseInstMapper; | |||
import com.hz.pm.api.projectdeclared.model.entity.PurchaseInst; | |||
import com.hz.pm.api.projectdeclared.service.IPurchaseInstService; | |||
import org.springframework.stereotype.Service; | |||
/** | |||
* <p> | |||
* IPurchaseInstServiceImpl | |||
* </p> | |||
* | |||
* @author WendyYang | |||
* @since 00:13 2024/2/25 | |||
*/ | |||
@Service | |||
public class PurchaseInstServiceImpl extends ServiceImpl<PurchaseInstMapper, PurchaseInst> implements IPurchaseInstService { | |||
} |
@@ -120,6 +120,7 @@ public class DeclaredRecordManage { | |||
item.setStatus(project.getStatus()); | |||
item.setStage(project.getStage()); | |||
} | |||
item.setDeclaredUnit(w.getUnitName()); | |||
item.setProjectCode(w.getProjectCode()); | |||
item.setProjectName(w.getProjectName()); | |||
item.setDeclaredAmount(w.getTotalMoney()); | |||
@@ -695,6 +695,9 @@ public class ProjectLibManage { | |||
List<ContractVO> contracts = constructionManage.detailContractByProjectId(projectInfo.getId()); | |||
vo.setContract(contracts); | |||
List<ProjectPaymentPlan> paymentPlans = projectPaymentPlanService.listByProjectId(projectInfo.getId()); | |||
vo.setAnnualPaymentPlans(BeanUtil.copyToList(paymentPlans, ProjectPaymentPlanDTO.class)); | |||
//查询实施信息 | |||
Operation operation = operationService.getOne(Wrappers.lambdaQuery(Operation.class) | |||
.in(Operation::getProjectId, allVersionProjectId) | |||
@@ -730,32 +733,6 @@ public class ProjectLibManage { | |||
//查询终验信息 | |||
vo.setFinalIrsApps(applicationHandler.generateIrsApp(projectInfo.getProjectCode())); | |||
//查询年度投资金额 要是已验收的项目 | |||
if (ProjectStatusEnum.ACCEPTED.getCode().equals(projectInfo.getStatus())) { | |||
List<ProjectPaymentPlan> paymentPlans = projectPaymentPlanService.listByProjectId(projectInfo.getId()); | |||
BigDecimal totalAnnualAmount = paymentPlans.stream() | |||
.map(ProjectPaymentPlan::getAnnualPlanAmount) | |||
.reduce(BigDecimal::add).orElse(BigDecimal.ZERO); | |||
List<AnnualAmountVO> annualAmounts = Lists.newArrayList(); | |||
annualAmounts.add(AnnualAmountVO.builder() | |||
.projectId(projectInfo.getId()) | |||
.projectYear(projectInfo.getProjectYear()) | |||
.annualAmount(totalAnnualAmount) | |||
.build()); | |||
List<ProjectRenewalFundDeclaration> renewalDeclarations = renewalFundDeclarationService.list(Wrappers.lambdaQuery(ProjectRenewalFundDeclaration.class) | |||
.eq(ProjectRenewalFundDeclaration::getProjectId, vo.getId()) | |||
.eq(ProjectRenewalFundDeclaration::getApprovalStatus, ProjectRenewalApprovalStatusEnum.PASS.name()) | |||
.eq(ProjectRenewalFundDeclaration::getDeleted, Boolean.FALSE) | |||
.orderByAsc(ProjectRenewalFundDeclaration::getProjectYear)); | |||
Optional.ofNullable(renewalDeclarations).ifPresent(declarations -> | |||
declarations.forEach(declaration -> annualAmounts.add(AnnualAmountVO.builder() | |||
.projectId(projectInfo.getId()) | |||
.projectYear(declaration.getProjectYear()) | |||
.annualAmount(declaration.getAnnualPaymentAmount()) | |||
.build())) | |||
); | |||
vo.setAnnualAccumulateAmountList(annualAmounts); | |||
} | |||
// 处理文件名 | |||
List<Long> fileIdList = new ArrayList<>(); | |||
BizUtils.notBlank(vo.getApprovedFile(), w -> fileIdList.add(Long.parseLong(w))); | |||
@@ -1,6 +1,5 @@ | |||
package com.hz.pm.api.projectlib.model.dto; | |||
import io.swagger.annotations.Api; | |||
import io.swagger.annotations.ApiModel; | |||
import io.swagger.annotations.ApiModelProperty; | |||
import lombok.Data; | |||
@@ -451,10 +451,6 @@ public class Project implements Serializable { | |||
@ApiModelProperty("交货时间") | |||
private LocalDateTime deliveryTime; | |||
@ApiModelProperty("初验材料") | |||
@Compare("初验材料") | |||
private String preliminaryInspectionMaterials; | |||
@ApiModelProperty("终验材料") | |||
@Compare("终验材料") | |||
private String finalAcceptanceMaterials; | |||
@@ -517,12 +513,6 @@ public class Project implements Serializable { | |||
@ApiModelProperty("其他附件") | |||
private String baseProjOtherFile; | |||
@ApiModelProperty("是否完成日志数据归集") | |||
private Boolean isCompletedLogCollection; | |||
@ApiModelProperty("实际成效指标") | |||
private String actualPerformanceIndicators; | |||
@ApiModelProperty("建议项目总投资") | |||
private BigDecimal proposeTotalInvest; | |||
@@ -19,17 +19,17 @@ import java.util.Optional; | |||
@AllArgsConstructor | |||
public enum TenderStatusEnum { | |||
DTXCGXX(ProjectStatusEnum.ON_PURCHASING, 101, "待填写采购信息"), | |||
DTXHTXX(ProjectStatusEnum.ON_PURCHASING, 102, "待填写合同信息"), | |||
DTXSSJH(ProjectStatusEnum.ON_PURCHASING, 103, "待填写实施计划"), | |||
DSCCYCL(ProjectStatusEnum.TO_BE_FIRST_INSPECTED, 201, "待上传初验材料"), | |||
DXCFHXSQ(ProjectStatusEnum.ON_FIRST_INSPECTED, 301, "待信创符合性申请"), | |||
XCFHXSQZ(ProjectStatusEnum.ON_FIRST_INSPECTED, 302, "信创符合性申请中"), | |||
XCFHXSQSB(ProjectStatusEnum.ON_FIRST_INSPECTED, 303, "信创符合性申请不通过"), | |||
DZYSB(ProjectStatusEnum.ON_FIRST_INSPECTED, 401, "待终验申报"), | |||
ZYSQZ(ProjectStatusEnum.ON_FINALLY_INSPECTED, 501, "终验申报中"), | |||
ZYSQSB(ProjectStatusEnum.ON_FINALLY_INSPECTED, 502, "终验申报不同过"), | |||
ZYWC(ProjectStatusEnum.ACCEPTED, 601, "终验完成"); | |||
TO_BE_SUBMIT_PURCHASE_INFO(ProjectStatusEnum.ON_PURCHASING, 101, "待填写采购信息"), | |||
TO_BE_SUBMIT_CONSTRUCTION_INFO(ProjectStatusEnum.ON_PURCHASING, 102, "待填写合同信息"), | |||
TO_BE_SUBMIT_OPERATION_PLAN(ProjectStatusEnum.ON_PURCHASING, 103, "待填写实施计划"), | |||
TO_BE_SUBMIT_FIRST_INSPECTED_INFO(ProjectStatusEnum.TO_BE_FIRST_INSPECTED, 201, "待上传初验材料"), | |||
TO_BE_SUBMIT_XCFHX_APPLY(ProjectStatusEnum.ON_FIRST_INSPECTED, 301, "待信创符合性申请"), | |||
ON_XCFHX_APPLY(ProjectStatusEnum.ON_FIRST_INSPECTED, 302, "信创符合性申请中"), | |||
XCFHX_APPLY_FAILED(ProjectStatusEnum.ON_FIRST_INSPECTED, 303, "信创符合性申请不通过"), | |||
TO_BE_SUBMIT_FINALLY_INSPECTED_APPLY(ProjectStatusEnum.ON_FIRST_INSPECTED, 401, "待终验申报"), | |||
ON_FINALLY_INSPECTED_APPLY(ProjectStatusEnum.ON_FINALLY_INSPECTED, 501, "终验申报中"), | |||
FINALLY_INSPECTED_FAILED(ProjectStatusEnum.ON_FINALLY_INSPECTED, 502, "终验申报不同过"), | |||
FINALLY_INSPECTED_PASSED(ProjectStatusEnum.ACCEPTED, 601, "终验完成"); | |||
private final ProjectStatusEnum projectStatus; | |||
private final Integer tenderStatus; | |||
@@ -4,6 +4,7 @@ import cn.hutool.json.JSONNull; | |||
import cn.hutool.json.JSONUtil; | |||
import com.alibaba.fastjson.JSON; | |||
import com.alibaba.fastjson.annotation.JSONField; | |||
import com.hz.pm.api.projectlib.model.dto.ProjectPaymentPlanDTO; | |||
import com.ningdatech.basic.util.NdDateUtils; | |||
import com.hz.pm.api.common.compare.Compare; | |||
import com.hz.pm.api.common.util.BizUtils; | |||
@@ -565,4 +566,8 @@ public class ProjectDetailVO { | |||
@ApiModelProperty("立项依据证明材料") | |||
private String baseProjBasisFile; | |||
@ApiModelProperty("年度支付计划") | |||
private List<ProjectPaymentPlanDTO> annualPaymentPlans; | |||
} |
@@ -577,8 +577,8 @@ public class CockpitStatsStatisticsTask { | |||
(p.getStatus().compareTo(ProjectStatusEnum.APPROVED_AFTER_CHOICE.getCode()) > 0 && | |||
p.getStatus().compareTo(ProjectStatusEnum.UNDER_CONSTRUCTION.getCode()) < 0) || | |||
//如果在建设中 那么初验材料为空代表 初验未完成 | |||
(p.getStatus().equals(ProjectStatusEnum.UNDER_CONSTRUCTION.getCode()) && | |||
StringUtils.isBlank(p.getPreliminaryInspectionMaterials()))) { | |||
(p.getStatus().equals(ProjectStatusEnum.UNDER_CONSTRUCTION.getCode()) /*&& | |||
StringUtils.isBlank(p.getPreliminaryInspectionMaterials())*/)) { | |||
return Boolean.TRUE; | |||
} | |||
return Boolean.FALSE; | |||
@@ -598,8 +598,8 @@ public class CockpitStatsStatisticsTask { | |||
p.getStatus().compareTo(ProjectStatusEnum.UNDER_CONSTRUCTION.getCode()) > 0 && | |||
p.getStatus().compareTo(ProjectStatusEnum.ACCEPTED.getCode()) < 0 || | |||
//如果在建设中 那么初验材料不为空代表 初验完成 | |||
(p.getStatus().equals(ProjectStatusEnum.UNDER_CONSTRUCTION.getCode()) && | |||
StringUtils.isNotBlank(p.getPreliminaryInspectionMaterials()))) { | |||
(p.getStatus().equals(ProjectStatusEnum.UNDER_CONSTRUCTION.getCode()) /*&& | |||
StringUtils.isNotBlank(p.getPreliminaryInspectionMaterials())*/)) { | |||
return Boolean.TRUE; | |||
} | |||
return Boolean.FALSE; | |||
@@ -151,12 +151,13 @@ public class EarlyWarningInstanceNotStartTask { | |||
if (ProjectStatusEnum.UNDER_CONSTRUCTION.getCode().equals(projectStutas)) { | |||
List<Long> allVersionProjectId = projectService.getAllVersionProjectId(p); | |||
//如果合同信息提交过了 才是 待初验状态 | |||
if (StringUtils.isNotBlank(p.getPreliminaryInspectionMaterials())) { | |||
// TODO 初验提醒 | |||
/*if (StringUtils.isNotBlank(p.getPreliminaryInspectionMaterials())) { | |||
if (0L == contractService.count(Wrappers.lambdaQuery(Contract.class) | |||
.in(Contract::getProjectId, allVersionProjectId))) { | |||
return Boolean.FALSE; | |||
} | |||
} | |||
}*/ | |||
} | |||
List<Integer> noticeTypes = Lists.newArrayList(); | |||
@@ -326,12 +327,13 @@ public class EarlyWarningInstanceNotStartTask { | |||
if (ProjectStatusEnum.UNDER_CONSTRUCTION.getCode().equals(projectStutas)) { | |||
List<Long> allVersionProjectId = projectService.getAllVersionProjectId(p); | |||
//如果合同信息提交过了 才是 待初验状态 | |||
if (StringUtils.isNotBlank(p.getPreliminaryInspectionMaterials())) { | |||
// 初验提醒 | |||
/*if (StringUtils.isNotBlank(p.getPreliminaryInspectionMaterials())) { | |||
if (0L == contractService.count(Wrappers.lambdaQuery(Contract.class) | |||
.in(Contract::getProjectId, allVersionProjectId))) { | |||
return Boolean.FALSE; | |||
} | |||
} | |||
}*/ | |||
} | |||
//判断 实施信息中 初验和终验的时间 | |||