Преглед на файлове

修改年度支付计划

tags/24080901
WendyYang преди 10 месеца
родител
ревизия
c539233b35
променени са 34 файла, в които са добавени 990 реда и са изтрити 271 реда
  1. +1
    -0
      hz-pm-api/src/main/java/com/hz/pm/api/common/enumeration/ProjectProcessStageEnum.java
  2. +142
    -0
      hz-pm-api/src/main/java/com/hz/pm/api/common/statemachine/action/TenderAction.java
  3. +36
    -0
      hz-pm-api/src/main/java/com/hz/pm/api/common/statemachine/builder/TenderStateMachineBuilder.java
  4. +152
    -0
      hz-pm-api/src/main/java/com/hz/pm/api/common/statemachine/builder/impl/TenderStateMachineBuilderImpl.java
  5. +102
    -0
      hz-pm-api/src/main/java/com/hz/pm/api/common/statemachine/event/TenderStatusChangeEvent.java
  6. +3
    -1
      hz-pm-api/src/main/java/com/hz/pm/api/common/statemachine/factory/ProjectDeclareGuardFactory.java
  7. +107
    -0
      hz-pm-api/src/main/java/com/hz/pm/api/common/statemachine/util/TenderStateMachineUtil.java
  8. +4
    -3
      hz-pm-api/src/main/java/com/hz/pm/api/filemanage/manage/ProjectFileManage.java
  9. +1
    -1
      hz-pm-api/src/main/java/com/hz/pm/api/filemanage/model/vo/ProjectFileVO.java
  10. +15
    -5
      hz-pm-api/src/main/java/com/hz/pm/api/projectdeclared/controller/ConstructionController.java
  11. +4
    -2
      hz-pm-api/src/main/java/com/hz/pm/api/projectdeclared/controller/FinalAcceptanceController.java
  12. +122
    -140
      hz-pm-api/src/main/java/com/hz/pm/api/projectdeclared/manage/ConstructionManage.java
  13. +13
    -12
      hz-pm-api/src/main/java/com/hz/pm/api/projectdeclared/manage/DeclaredProjectManage.java
  14. +18
    -34
      hz-pm-api/src/main/java/com/hz/pm/api/projectdeclared/manage/FinalAcceptanceManage.java
  15. +17
    -0
      hz-pm-api/src/main/java/com/hz/pm/api/projectdeclared/mapper/PurchaseInstMapper.java
  16. +10
    -8
      hz-pm-api/src/main/java/com/hz/pm/api/projectdeclared/model/dto/PreInsSaveDTO.java
  17. +10
    -7
      hz-pm-api/src/main/java/com/hz/pm/api/projectdeclared/model/entity/PreInsAcceptancePerson.java
  18. +26
    -0
      hz-pm-api/src/main/java/com/hz/pm/api/projectdeclared/model/entity/Purchase.java
  19. +45
    -0
      hz-pm-api/src/main/java/com/hz/pm/api/projectdeclared/model/entity/PurchaseInst.java
  20. +37
    -0
      hz-pm-api/src/main/java/com/hz/pm/api/projectdeclared/model/req/SubmitFinallyInspectedReq.java
  21. +35
    -0
      hz-pm-api/src/main/java/com/hz/pm/api/projectdeclared/model/req/XcfhxApplyReq.java
  22. +2
    -1
      hz-pm-api/src/main/java/com/hz/pm/api/projectdeclared/model/vo/PreInsVO.java
  23. +4
    -0
      hz-pm-api/src/main/java/com/hz/pm/api/projectdeclared/model/vo/ProjectDraftVO.java
  24. +20
    -1
      hz-pm-api/src/main/java/com/hz/pm/api/projectdeclared/service/IPreInsAcceptancePersonService.java
  25. +15
    -0
      hz-pm-api/src/main/java/com/hz/pm/api/projectdeclared/service/IPurchaseInstService.java
  26. +19
    -0
      hz-pm-api/src/main/java/com/hz/pm/api/projectdeclared/service/impl/PurchaseInstServiceImpl.java
  27. +1
    -0
      hz-pm-api/src/main/java/com/hz/pm/api/projectlib/manage/DeclaredRecordManage.java
  28. +3
    -26
      hz-pm-api/src/main/java/com/hz/pm/api/projectlib/manage/ProjectLibManage.java
  29. +0
    -1
      hz-pm-api/src/main/java/com/hz/pm/api/projectlib/model/dto/ProjectPaymentPlanDTO.java
  30. +0
    -10
      hz-pm-api/src/main/java/com/hz/pm/api/projectlib/model/entity/Project.java
  31. +11
    -11
      hz-pm-api/src/main/java/com/hz/pm/api/projectlib/model/enumeration/TenderStatusEnum.java
  32. +5
    -0
      hz-pm-api/src/main/java/com/hz/pm/api/projectlib/model/vo/ProjectDetailVO.java
  33. +4
    -4
      hz-pm-api/src/main/java/com/hz/pm/api/scheduler/task/CockpitStatsStatisticsTask.java
  34. +6
    -4
      hz-pm-api/src/main/java/com/hz/pm/api/scheduler/task/EarlyWarningInstanceNotStartTask.java

+ 1
- 0
hz-pm-api/src/main/java/com/hz/pm/api/common/enumeration/ProjectProcessStageEnum.java Целия файл

@@ -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, "申请借阅审批流程");


+ 142
- 0
hz-pm-api/src/main/java/com/hz/pm/api/common/statemachine/action/TenderAction.java Целия файл

@@ -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());
}

}

+ 36
- 0
hz-pm-api/src/main/java/com/hz/pm/api/common/statemachine/builder/TenderStateMachineBuilder.java Целия файл

@@ -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();

}

+ 152
- 0
hz-pm-api/src/main/java/com/hz/pm/api/common/statemachine/builder/impl/TenderStateMachineBuilderImpl.java Целия файл

@@ -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);
}
});
}

}

+ 102
- 0
hz-pm-api/src/main/java/com/hz/pm/api/common/statemachine/event/TenderStatusChangeEvent.java Целия файл

@@ -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;
}

}

+ 3
- 1
hz-pm-api/src/main/java/com/hz/pm/api/common/statemachine/factory/ProjectDeclareGuardFactory.java Целия файл

@@ -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) {


+ 107
- 0
hz-pm-api/src/main/java/com/hz/pm/api/common/statemachine/util/TenderStateMachineUtil.java Целия файл

@@ -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;
}

}

+ 4
- 3
hz-pm-api/src/main/java/com/hz/pm/api/filemanage/manage/ProjectFileManage.java Целия файл

@@ -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);

// 终验申报阶段
// 获取终验材料


+ 1
- 1
hz-pm-api/src/main/java/com/hz/pm/api/filemanage/model/vo/ProjectFileVO.java Целия файл

@@ -39,7 +39,7 @@ public class ProjectFileVO {
private List<ContractVO> contractVos;

@ApiModelProperty("初验登记详情")
private PreInsVO preInsVo;
private List<PreInsVO> preInsVo;

@ApiModelProperty("终验信息详情")
private FinalAcceptanceVO finalAcceptanceVo;


+ 15
- 5
hz-pm-api/src/main/java/com/hz/pm/api/projectdeclared/controller/ConstructionController.java Целия файл

@@ -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);
}

}

+ 4
- 2
hz-pm-api/src/main/java/com/hz/pm/api/projectdeclared/controller/FinalAcceptanceController.java Целия файл

@@ -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 + "】 成功";
}



+ 122
- 140
hz-pm-api/src/main/java/com/hz/pm/api/projectdeclared/manage/ConstructionManage.java Целия файл

@@ -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);
}

/**


+ 13
- 12
hz-pm-api/src/main/java/com/hz/pm/api/projectdeclared/manage/DeclaredProjectManage.java Целия файл

@@ -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());


+ 18
- 34
hz-pm-api/src/main/java/com/hz/pm/api/projectdeclared/manage/FinalAcceptanceManage.java Целия файл

@@ -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;
}



+ 17
- 0
hz-pm-api/src/main/java/com/hz/pm/api/projectdeclared/mapper/PurchaseInstMapper.java Целия файл

@@ -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> {

}

+ 10
- 8
hz-pm-api/src/main/java/com/hz/pm/api/projectdeclared/model/dto/PreInsSaveDTO.java Целия файл

@@ -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
- 7
hz-pm-api/src/main/java/com/hz/pm/api/projectdeclared/model/entity/PreInsAcceptancePerson.java Целия файл

@@ -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;



+ 26
- 0
hz-pm-api/src/main/java/com/hz/pm/api/projectdeclared/model/entity/Purchase.java Целия файл

@@ -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;



}

+ 45
- 0
hz-pm-api/src/main/java/com/hz/pm/api/projectdeclared/model/entity/PurchaseInst.java Целия файл

@@ -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;

}

+ 37
- 0
hz-pm-api/src/main/java/com/hz/pm/api/projectdeclared/model/req/SubmitFinallyInspectedReq.java Целия файл

@@ -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;

}

+ 35
- 0
hz-pm-api/src/main/java/com/hz/pm/api/projectdeclared/model/req/XcfhxApplyReq.java Целия файл

@@ -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;

}

+ 2
- 1
hz-pm-api/src/main/java/com/hz/pm/api/projectdeclared/model/vo/PreInsVO.java Целия файл

@@ -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;


+ 4
- 0
hz-pm-api/src/main/java/com/hz/pm/api/projectdeclared/model/vo/ProjectDraftVO.java Целия файл

@@ -378,4 +378,8 @@ public class ProjectDraftVO implements Serializable {

@ApiModelProperty("草稿箱类型:1 项目申报、2 立项备案")
private Integer draftType;

@ApiModelProperty("可研批复文件")
private String baseResearchReportApprovalFile;

}

+ 20
- 1
hz-pm-api/src/main/java/com/hz/pm/api/projectdeclared/service/IPreInsAcceptancePersonService.java Целия файл

@@ -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);
}

}

+ 15
- 0
hz-pm-api/src/main/java/com/hz/pm/api/projectdeclared/service/IPurchaseInstService.java Целия файл

@@ -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> {
}

+ 19
- 0
hz-pm-api/src/main/java/com/hz/pm/api/projectdeclared/service/impl/PurchaseInstServiceImpl.java Целия файл

@@ -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 {
}

+ 1
- 0
hz-pm-api/src/main/java/com/hz/pm/api/projectlib/manage/DeclaredRecordManage.java Целия файл

@@ -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());


+ 3
- 26
hz-pm-api/src/main/java/com/hz/pm/api/projectlib/manage/ProjectLibManage.java Целия файл

@@ -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)));


+ 0
- 1
hz-pm-api/src/main/java/com/hz/pm/api/projectlib/model/dto/ProjectPaymentPlanDTO.java Целия файл

@@ -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;


+ 0
- 10
hz-pm-api/src/main/java/com/hz/pm/api/projectlib/model/entity/Project.java Целия файл

@@ -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;



+ 11
- 11
hz-pm-api/src/main/java/com/hz/pm/api/projectlib/model/enumeration/TenderStatusEnum.java Целия файл

@@ -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;


+ 5
- 0
hz-pm-api/src/main/java/com/hz/pm/api/projectlib/model/vo/ProjectDetailVO.java Целия файл

@@ -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;

}

+ 4
- 4
hz-pm-api/src/main/java/com/hz/pm/api/scheduler/task/CockpitStatsStatisticsTask.java Целия файл

@@ -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;


+ 6
- 4
hz-pm-api/src/main/java/com/hz/pm/api/scheduler/task/EarlyWarningInstanceNotStartTask.java Целия файл

@@ -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;
}
}
}*/
}

//判断 实施信息中 初验和终验的时间


Loading…
Отказ
Запис