@@ -83,8 +83,7 @@ | |||||
<dependency> | <dependency> | ||||
<groupId>org.springframework.boot</groupId> | <groupId>org.springframework.boot</groupId> | ||||
<artifactId>spring-boot-devtools</artifactId> | <artifactId>spring-boot-devtools</artifactId> | ||||
<optional>true</optional> | |||||
<scope>true</scope> | |||||
<scope>runtime</scope> | |||||
</dependency> | </dependency> | ||||
<dependency> | <dependency> | ||||
<groupId>org.springframework.boot</groupId> | <groupId>org.springframework.boot</groupId> | ||||
@@ -100,14 +99,6 @@ | |||||
<artifactId>httpclient</artifactId> | <artifactId>httpclient</artifactId> | ||||
</dependency> | </dependency> | ||||
<dependency> | <dependency> | ||||
<groupId>org.apache.poi</groupId> | |||||
<artifactId>poi</artifactId> | |||||
</dependency> | |||||
<dependency> | |||||
<groupId>org.apache.poi</groupId> | |||||
<artifactId>poi-ooxml</artifactId> | |||||
</dependency> | |||||
<dependency> | |||||
<groupId>junit</groupId> | <groupId>junit</groupId> | ||||
<artifactId>junit</artifactId> | <artifactId>junit</artifactId> | ||||
<scope>test</scope> | <scope>test</scope> | ||||
@@ -120,6 +111,11 @@ | |||||
<dependency> | <dependency> | ||||
<groupId>org.springframework.boot</groupId> | <groupId>org.springframework.boot</groupId> | ||||
<artifactId>spring-boot-starter-test</artifactId> | <artifactId>spring-boot-starter-test</artifactId> | ||||
<scope>test</scope> | |||||
</dependency> | |||||
<dependency> | |||||
<groupId>org.springframework</groupId> | |||||
<artifactId>spring-test</artifactId> | |||||
</dependency> | </dependency> | ||||
<dependency> | <dependency> | ||||
<groupId>org.springframework.boot</groupId> | <groupId>org.springframework.boot</groupId> | ||||
@@ -198,11 +194,6 @@ | |||||
<groupId>org.springframework.statemachine</groupId> | <groupId>org.springframework.statemachine</groupId> | ||||
<artifactId>spring-statemachine-core</artifactId> | <artifactId>spring-statemachine-core</artifactId> | ||||
</dependency> | </dependency> | ||||
<!--导入导出--> | |||||
<dependency> | |||||
<groupId>cn.afterturn</groupId> | |||||
<artifactId>easypoi-base</artifactId> | |||||
</dependency> | |||||
<dependency> | <dependency> | ||||
<groupId>com.github.oshi</groupId> | <groupId>com.github.oshi</groupId> | ||||
<artifactId>oshi-core</artifactId> | <artifactId>oshi-core</artifactId> | ||||
@@ -1,8 +1,8 @@ | |||||
package com.hz.pm.api.common.config; | package com.hz.pm.api.common.config; | ||||
import com.google.common.collect.Lists; | |||||
import com.hz.pm.api.scheduler.listener.TaskCreatedListener; | import com.hz.pm.api.scheduler.listener.TaskCreatedListener; | ||||
import lombok.RequiredArgsConstructor; | import lombok.RequiredArgsConstructor; | ||||
import org.assertj.core.util.Lists; | |||||
import org.flowable.common.engine.api.delegate.event.FlowableEventListener; | import org.flowable.common.engine.api.delegate.event.FlowableEventListener; | ||||
import org.flowable.spring.SpringProcessEngineConfiguration; | import org.flowable.spring.SpringProcessEngineConfiguration; | ||||
import org.flowable.spring.boot.EngineConfigurationConfigurer; | import org.flowable.spring.boot.EngineConfigurationConfigurer; | ||||
@@ -3,12 +3,12 @@ package com.hz.pm.api.common.statemachine.action; | |||||
import cn.hutool.core.collection.CollUtil; | import cn.hutool.core.collection.CollUtil; | ||||
import cn.hutool.json.JSONUtil; | import cn.hutool.json.JSONUtil; | ||||
import com.baomidou.mybatisplus.core.toolkit.Assert; | import com.baomidou.mybatisplus.core.toolkit.Assert; | ||||
import com.hz.pm.api.common.model.constant.StateMachineConst; | |||||
import com.hz.pm.api.common.enumeration.CommonEnum; | import com.hz.pm.api.common.enumeration.CommonEnum; | ||||
import com.hz.pm.api.common.model.constant.StateMachineConst; | |||||
import com.hz.pm.api.common.statemachine.event.ProjectStateChangeEvent; | import com.hz.pm.api.common.statemachine.event.ProjectStateChangeEvent; | ||||
import com.hz.pm.api.projectlib.model.enumeration.status.ProjectStatus; | |||||
import com.hz.pm.api.projectlib.model.entity.Project; | import com.hz.pm.api.projectlib.model.entity.Project; | ||||
import com.hz.pm.api.projectlib.model.entity.ProjectApplication; | import com.hz.pm.api.projectlib.model.entity.ProjectApplication; | ||||
import com.hz.pm.api.projectlib.model.enumeration.status.ProjectStatus; | |||||
import lombok.extern.slf4j.Slf4j; | import lombok.extern.slf4j.Slf4j; | ||||
import org.springframework.statemachine.StateContext; | import org.springframework.statemachine.StateContext; | ||||
import org.springframework.statemachine.action.Action; | import org.springframework.statemachine.action.Action; | ||||
@@ -65,7 +65,6 @@ public class ProjectDeclareActionChoice implements Action<ProjectStatus, Project | |||||
}); | }); | ||||
if (isFirstApp[0]) { | if (isFirstApp[0]) { | ||||
project.setStage(ProjectStatus.NOT_APPROVED.getCode()); | project.setStage(ProjectStatus.NOT_APPROVED.getCode()); | ||||
project.setStatus(ProjectStatus.TO_BE_APP_REGISTER.getCode()); | |||||
} else { | } else { | ||||
project.setStage(ProjectStatus.PROJECT_APPROVED.getCode()); | project.setStage(ProjectStatus.PROJECT_APPROVED.getCode()); | ||||
project.setStatus(ProjectStatus.TO_BE_PURCHASED.getCode()); | project.setStatus(ProjectStatus.TO_BE_PURCHASED.getCode()); | ||||
@@ -153,43 +153,18 @@ public class ProjectStateChangeAction { | |||||
project.setStatus(ProjectStatus.DEPARTMENT_JOINT_REVIEW.getCode()); | project.setStatus(ProjectStatus.DEPARTMENT_JOINT_REVIEW.getCode()); | ||||
} | } | ||||
@OnTransition(source = "PLAN_TO_BE_DECLARED", target = "SCHEME_UNDER_REVIEW") | |||||
public void DECLARE_PLAN(Message<ProjectStateChangeEvent> message) { | |||||
Project project = getProject(message); | |||||
project.setStatus(ProjectStatus.SCHEME_UNDER_REVIEW.getCode()); | |||||
} | |||||
@OnTransition(source = "PLAN_TO_BE_DECLARED", target = "IN_THE_ANNUAL_PLAN") | @OnTransition(source = "PLAN_TO_BE_DECLARED", target = "IN_THE_ANNUAL_PLAN") | ||||
public void PLAN_TO_DECLARE_WITHDRAW(Message<ProjectStateChangeEvent> message) { | public void PLAN_TO_DECLARE_WITHDRAW(Message<ProjectStateChangeEvent> message) { | ||||
Project project = getProject(message); | Project project = getProject(message); | ||||
project.setStatus(ProjectStatus.IN_THE_ANNUAL_PLAN.getCode()); | project.setStatus(ProjectStatus.IN_THE_ANNUAL_PLAN.getCode()); | ||||
} | } | ||||
@OnTransition(source = "SCHEME_REVIEW_FAILED", target = "SCHEME_UNDER_REVIEW") | |||||
public void DECLARE_PLAN_RESUBMIT(Message<ProjectStateChangeEvent> message) { | |||||
Project project = getProject(message); | |||||
project.setStatus(ProjectStatus.SCHEME_UNDER_REVIEW.getCode()); | |||||
} | |||||
@OnTransition(source = "SCHEME_UNDER_REVIEW", target = "TO_BE_APPROVED") | @OnTransition(source = "SCHEME_UNDER_REVIEW", target = "TO_BE_APPROVED") | ||||
public void PLAN_REVIEW_PASS(Message<ProjectStateChangeEvent> message) { | public void PLAN_REVIEW_PASS(Message<ProjectStateChangeEvent> message) { | ||||
Project project = getProject(message); | Project project = getProject(message); | ||||
project.setStatus(ProjectStatus.TO_BE_APPROVED.getCode()); | project.setStatus(ProjectStatus.TO_BE_APPROVED.getCode()); | ||||
} | } | ||||
@OnTransition(source = "SCHEME_UNDER_REVIEW", target = "SCHEME_REVIEW_FAILED") | |||||
public void PLAN_REVIEW_REJECT(Message<ProjectStateChangeEvent> message) { | |||||
Project project = getProject(message); | |||||
project.setStatus(ProjectStatus.SCHEME_REVIEW_FAILED.getCode()); | |||||
} | |||||
@OnTransition(source = "SCHEME_REVIEW_FAILED", target = "SCHEME_UNDER_REVIEW") | |||||
public void PLAN_REVIEW_REJECT_RESUBMIT(Message<ProjectStateChangeEvent> message) { | |||||
Project project = getProject(message); | |||||
project.setStatus(ProjectStatus.SCHEME_UNDER_REVIEW.getCode()); | |||||
} | |||||
@OnTransition(source = "SCHEME_UNDER_REVIEW", target = "PLAN_TO_BE_DECLARED") | @OnTransition(source = "SCHEME_UNDER_REVIEW", target = "PLAN_TO_BE_DECLARED") | ||||
public void SCHEME_UNDER_REVIEW_WITHDRAW(Message<ProjectStateChangeEvent> message) { | public void SCHEME_UNDER_REVIEW_WITHDRAW(Message<ProjectStateChangeEvent> message) { | ||||
Project project = getProject(message); | Project project = getProject(message); | ||||
@@ -235,12 +210,6 @@ public class ProjectStateChangeAction { | |||||
project.setStatus(ProjectStatus.TO_BE_PURCHASED.getCode()); | project.setStatus(ProjectStatus.TO_BE_PURCHASED.getCode()); | ||||
} | } | ||||
@OnTransition(source = "TO_BE_APPROVED", target = "SCHEME_UNDER_REVIEW") | |||||
public void TO_BE_APPROVED_WITHDRAW(Message<ProjectStateChangeEvent> message) { | |||||
Project project = getProject(message); | |||||
project.setStatus(ProjectStatus.SCHEME_UNDER_REVIEW.getCode()); | |||||
} | |||||
@OnTransition(source = "OPERATION", target = "UNDER_CONSTRUCTION") | @OnTransition(source = "OPERATION", target = "UNDER_CONSTRUCTION") | ||||
public void START_TO_WORK(Message<ProjectStateChangeEvent> message) { | public void START_TO_WORK(Message<ProjectStateChangeEvent> message) { | ||||
Project project = getProject(message); | Project project = getProject(message); | ||||
@@ -6,7 +6,6 @@ import com.hz.pm.api.common.statemachine.event.ProjectStateChangeEvent; | |||||
import com.hz.pm.api.common.statemachine.factory.ProjectDeclareGuardFactory.PendingPreQualificationChoiceGuard; | import com.hz.pm.api.common.statemachine.factory.ProjectDeclareGuardFactory.PendingPreQualificationChoiceGuard; | ||||
import com.hz.pm.api.projectlib.model.entity.Project; | import com.hz.pm.api.projectlib.model.entity.Project; | ||||
import com.hz.pm.api.projectlib.model.enumeration.status.ProjectStatus; | import com.hz.pm.api.projectlib.model.enumeration.status.ProjectStatus; | ||||
import com.ningdatech.basic.exception.BizException; | |||||
import lombok.RequiredArgsConstructor; | import lombok.RequiredArgsConstructor; | ||||
import lombok.extern.slf4j.Slf4j; | import lombok.extern.slf4j.Slf4j; | ||||
import org.springframework.beans.factory.BeanFactory; | import org.springframework.beans.factory.BeanFactory; | ||||
@@ -187,31 +186,6 @@ public class ProjectStateMachineBuilderImpl implements BaseStateMachineBuilder<P | |||||
.event(ProjectStateChangeEvent.ANNUAL_PLAN_SUSPEND).and() | .event(ProjectStateChangeEvent.ANNUAL_PLAN_SUSPEND).and() | ||||
// 方案待申报申报方案,从方案待申报到方案评审中 | // 方案待申报申报方案,从方案待申报到方案评审中 | ||||
.withExternal() | .withExternal() | ||||
.source(ProjectStatus.PLAN_TO_BE_DECLARED) | |||||
.target(ProjectStatus.SCHEME_UNDER_REVIEW) | |||||
.event(ProjectStateChangeEvent.DECLARE_PLAN).and() | |||||
// 方案评审通过,从方案评审中到待立项批复 | |||||
.withExternal() | |||||
.source(ProjectStatus.SCHEME_UNDER_REVIEW) | |||||
.target(ProjectStatus.TO_BE_APPROVED) | |||||
.event(ProjectStateChangeEvent.PLAN_REVIEW_PASS).and() | |||||
// 方案评审驳回,从方案评审中到方案评审不通过 | |||||
.withExternal() | |||||
.source(ProjectStatus.SCHEME_UNDER_REVIEW) | |||||
.target(ProjectStatus.SCHEME_REVIEW_FAILED) | |||||
.event(ProjectStateChangeEvent.PLAN_REVIEW_REJECT).and() | |||||
// 方案评审中撤回,从方案评审中到方案待申报 | |||||
.withExternal() | |||||
.source(ProjectStatus.SCHEME_UNDER_REVIEW) | |||||
.target(ProjectStatus.PLAN_TO_BE_DECLARED) | |||||
.event(ProjectStateChangeEvent.SCHEME_UNDER_REVIEW_WITHDRAW).and() | |||||
// 方案评审不通过重新提交,从方案评审不通过到方案评审中 | |||||
.withExternal() | |||||
.source(ProjectStatus.SCHEME_REVIEW_FAILED) | |||||
.target(ProjectStatus.SCHEME_UNDER_REVIEW) | |||||
.event(ProjectStateChangeEvent.PLAN_REVIEW_REJECT_RESUBMIT).and() | |||||
// 立项备案 | |||||
.withExternal() | |||||
.source(ProjectStatus.DECLARED_APPROVED_TO_BE_RECORD) | .source(ProjectStatus.DECLARED_APPROVED_TO_BE_RECORD) | ||||
.target(ProjectStatus.DECLARED_APPROVED_RECORD_AUDITING) | .target(ProjectStatus.DECLARED_APPROVED_RECORD_AUDITING) | ||||
.event(ProjectStateChangeEvent.DECLARED_RECORD_SUBMIT).and() | .event(ProjectStateChangeEvent.DECLARED_RECORD_SUBMIT).and() | ||||
@@ -87,21 +87,6 @@ public enum ProjectStateChangeEvent implements AbstractStateChangeEvent { | |||||
*/ | */ | ||||
DECLARE_PLAN(ProjectStatus.PLAN_TO_BE_DECLARED.getCode(), null, null), | DECLARE_PLAN(ProjectStatus.PLAN_TO_BE_DECLARED.getCode(), null, null), | ||||
/** | /** | ||||
* 方案评审驳回(项目状态变为:方案评审不通过) | |||||
*/ | |||||
PLAN_REVIEW_REJECT(null, ProjectStatus.SCHEME_UNDER_REVIEW.getCode(), null), | |||||
/** | |||||
* 方案评审不通过重新提交(项目状态变为:方案评审中) | |||||
*/ | |||||
PLAN_REVIEW_REJECT_RESUBMIT(ProjectStatus.SCHEME_REVIEW_FAILED.getCode(), null, null), | |||||
/** | |||||
* 方案评审通过(项目状态变为:待立项批复) | |||||
*/ | |||||
PLAN_REVIEW_PASS(ProjectStatus.SCHEME_UNDER_REVIEW.getCode(), null, null), | |||||
//立项备案=========================================================================================================== | |||||
/** | |||||
* 立项备案提交 | * 立项备案提交 | ||||
*/ | */ | ||||
DECLARED_RECORD_SUBMIT(ProjectStatus.DECLARED_APPROVED_TO_BE_RECORD.getCode(), null, null), | DECLARED_RECORD_SUBMIT(ProjectStatus.DECLARED_APPROVED_TO_BE_RECORD.getCode(), null, null), | ||||
@@ -129,17 +114,15 @@ public enum ProjectStateChangeEvent implements AbstractStateChangeEvent { | |||||
PROJECT_APPROVAL(ProjectStatus.TO_BE_APPROVED.getCode(), null, null), | PROJECT_APPROVAL(ProjectStatus.TO_BE_APPROVED.getCode(), null, null), | ||||
/** | /** | ||||
* 注册应用 | |||||
*/ | |||||
REGISTER_APP(ProjectStatus.TO_BE_APP_REGISTER.getCode(), null, null), | |||||
/** | |||||
* 发布采购公告 | * 发布采购公告 | ||||
*/ | */ | ||||
SUBMIT_PURCHASE_NOTICE(ProjectStatus.TO_BE_PURCHASED.getCode(), null, null), | SUBMIT_PURCHASE_NOTICE(ProjectStatus.TO_BE_PURCHASED.getCode(), null, null), | ||||
/** | /** | ||||
* 填写实施计划 | * 填写实施计划 | ||||
*/ | */ | ||||
SUBMIT_OPERATION_PLAN(ProjectStatus.ON_PURCHASING.getCode(), null, null), | SUBMIT_OPERATION_PLAN(ProjectStatus.ON_PURCHASING.getCode(), null, null), | ||||
/** | /** | ||||
* 上传初验材料 | * 上传初验材料 | ||||
*/ | */ | ||||
@@ -180,10 +163,6 @@ public enum ProjectStateChangeEvent implements AbstractStateChangeEvent { | |||||
*/ | */ | ||||
DEPARTMENT_JOINT_REVIEW_WITHDRAW(null, null, ProjectStatus.DEPARTMENT_JOINT_REVIEW.getCode()), | DEPARTMENT_JOINT_REVIEW_WITHDRAW(null, null, ProjectStatus.DEPARTMENT_JOINT_REVIEW.getCode()), | ||||
/** | /** | ||||
* 方案评审中时被撤回(项目状态进入:方案待申报) | |||||
*/ | |||||
SCHEME_UNDER_REVIEW_WITHDRAW(null, null, ProjectStatus.SCHEME_UNDER_REVIEW.getCode()), | |||||
/** | |||||
* 终验审核中时被撤回(项目状态进入:待终验) | * 终验审核中时被撤回(项目状态进入:待终验) | ||||
*/ | */ | ||||
FINAL_ACCEPTANCE_IS_UNDER_REVIEW_WITHDRAW(null, null, ProjectStatus.ON_FINALLY_INSPECTED.getCode()), | FINAL_ACCEPTANCE_IS_UNDER_REVIEW_WITHDRAW(null, null, ProjectStatus.ON_FINALLY_INSPECTED.getCode()), | ||||
@@ -865,7 +865,7 @@ public class MeetingManage { | |||||
buildOptionProjectQuery(query, meetingType, ProjectStatus.PRE_APPLYING); | buildOptionProjectQuery(query, meetingType, ProjectStatus.PRE_APPLYING); | ||||
break; | break; | ||||
case CONSTRUCTION_SCHEME_REVIEW: | case CONSTRUCTION_SCHEME_REVIEW: | ||||
buildOptionProjectQuery(query, meetingType, ProjectStatus.SCHEME_UNDER_REVIEW); | |||||
buildOptionProjectQuery(query, meetingType, null); | |||||
break; | break; | ||||
case ACCEPTANCE_SCHEME_REVIEW: | case ACCEPTANCE_SCHEME_REVIEW: | ||||
buildOptionProjectQuery(query, meetingType, ProjectStatus.ON_FINALLY_INSPECTED); | buildOptionProjectQuery(query, meetingType, ProjectStatus.ON_FINALLY_INSPECTED); | ||||
@@ -3,7 +3,6 @@ package com.hz.pm.api.projectdeclared.controller; | |||||
import com.hz.pm.api.common.util.ExcelDownUtil; | import com.hz.pm.api.common.util.ExcelDownUtil; | ||||
import com.hz.pm.api.projectdeclared.manage.ConstructionPlanManage; | import com.hz.pm.api.projectdeclared.manage.ConstructionPlanManage; | ||||
import com.hz.pm.api.projectdeclared.model.dto.ContructionSuggestionsDTO; | import com.hz.pm.api.projectdeclared.model.dto.ContructionSuggestionsDTO; | ||||
import com.hz.pm.api.projectdeclared.model.dto.DefaultDeclaredDTO; | |||||
import com.hz.pm.api.projectdeclared.model.req.ConstrctionPlanListReq; | import com.hz.pm.api.projectdeclared.model.req.ConstrctionPlanListReq; | ||||
import com.hz.pm.api.projectlib.model.vo.ProjectLibListItemVO; | import com.hz.pm.api.projectlib.model.vo.ProjectLibListItemVO; | ||||
import com.ningdatech.basic.model.PageVo; | import com.ningdatech.basic.model.PageVo; | ||||
@@ -39,14 +38,6 @@ public class ConstructionPlanController { | |||||
return constructionPlanManage.projectLibList(planReq); | return constructionPlanManage.projectLibList(planReq); | ||||
} | } | ||||
@ApiOperation(value = "建设方案申报", notes = "建设方案申报") | |||||
@WebLog("建设方案申报") | |||||
@PostMapping("/start") | |||||
public String startTheProcess(@Validated @RequestBody DefaultDeclaredDTO dto) { | |||||
String instanceId = constructionPlanManage.startTheProcess(dto); | |||||
return "建设方案申报 【" + instanceId + "】 成功"; | |||||
} | |||||
@GetMapping("/export") | @GetMapping("/export") | ||||
@ApiOperation("可申报建设方案项目列表导出") | @ApiOperation("可申报建设方案项目列表导出") | ||||
@WebLog("可申报建设方案项目列表导出") | @WebLog("可申报建设方案项目列表导出") | ||||
@@ -1,25 +1,13 @@ | |||||
package com.hz.pm.api.projectdeclared.converter; | package com.hz.pm.api.projectdeclared.converter; | ||||
import cn.hutool.core.collection.CollUtil; | |||||
import com.alibaba.fastjson.JSON; | |||||
import com.alibaba.fastjson.JSONArray; | |||||
import com.alibaba.fastjson.JSONObject; | |||||
import com.google.common.collect.Lists; | import com.google.common.collect.Lists; | ||||
import com.ningdatech.file.service.FileService; | |||||
import com.hz.pm.api.common.model.constant.BizConst; | |||||
import com.hz.pm.api.projectlib.model.enumeration.ProjectTypeEnum; | import com.hz.pm.api.projectlib.model.enumeration.ProjectTypeEnum; | ||||
import com.hz.pm.api.projectlib.model.enumeration.ProjectTypeNewEnum; | import com.hz.pm.api.projectlib.model.enumeration.ProjectTypeNewEnum; | ||||
import com.hz.pm.api.projectlib.model.entity.Project; | |||||
import com.hz.pm.api.projectlib.model.entity.ProjectApplication; | |||||
import com.hz.pm.api.provincial.model.dto.FileDTO; | |||||
import com.hz.pm.api.provincial.model.dto.ProvincialApplicationDTO; | |||||
import com.hz.pm.api.provincial.model.dto.ProvincialProjectDTO; | |||||
import lombok.extern.slf4j.Slf4j; | import lombok.extern.slf4j.Slf4j; | ||||
import org.apache.commons.lang3.StringUtils; | import org.apache.commons.lang3.StringUtils; | ||||
import java.math.BigDecimal; | import java.math.BigDecimal; | ||||
import java.util.*; | |||||
import java.util.stream.Collectors; | |||||
import java.util.Objects; | |||||
/** | /** | ||||
* @Classname ApplicationConverter | * @Classname ApplicationConverter | ||||
@@ -30,66 +18,20 @@ import java.util.stream.Collectors; | |||||
@Slf4j | @Slf4j | ||||
public class ApplicationConverter { | public class ApplicationConverter { | ||||
public static ProvincialProjectDTO convertProject(Project projectInfo, List<ProjectApplication> applications, | |||||
FileService fileService, String active) { | |||||
return ProvincialProjectDTO.builder() | |||||
//暂时先写死 | |||||
.operationManageUnit(StringUtils.isBlank(active) || BizConst.DEV.equals(active) ? | |||||
"GO_a1479720291640b4982158fe3035a2d0" : projectInfo.getHigherSuperOrgCode()) | |||||
.digitalReform(String.valueOf(projectInfo.getBizDomain())) | |||||
.regionCode(projectInfo.getAreaCode()) | |||||
.regionName(projectInfo.getArea()) | |||||
.projectName(projectInfo.getProjectName()) | |||||
.projectId(projectInfo.getProjectCode()) | |||||
.projectType(convertProjectType(projectInfo.getProjectType())) | |||||
.totalMoney(projectInfo.getDeclareAmount()) | |||||
// TODO | |||||
.yearBudget(BigDecimal.ZERO) | |||||
.budgetFrom(checkAddBudget(projectInfo.getDeclareHaveAmount() | |||||
, projectInfo.getDeclareGovOwnFinanceAmount(), | |||||
projectInfo.getDeclareGovSuperiorFinanceAmount(), | |||||
projectInfo.getDeclareBankLendingAmount(), | |||||
projectInfo.getDeclareOtherAmount())) | |||||
.year(String.valueOf(projectInfo.getProjectYear())) | |||||
.financialCode(projectInfo.getFinancialCode()) | |||||
.developCode(projectInfo.getDevelopCode()) | |||||
.beginTime(projectInfo.getBeginTime()) | |||||
.endTime(projectInfo.getEndTime()) | |||||
.buildBasis("立项依据") | |||||
.buildBasisFile(convertBasicFile(projectInfo.getBuildBasis(), fileService)) | |||||
.projectSummary(projectInfo.getProjectIntroduction()) | |||||
.responsibleMan(projectInfo.getResponsibleMan()) | |||||
.responsibleManPhone(projectInfo.getResponsibleManMobile()) | |||||
.contactName(projectInfo.getContactName()) | |||||
.contactPhone(projectInfo.getContactPhone()) | |||||
.buildUnit(projectInfo.getBuildOrgName()) | |||||
.buildUnitCode(StringUtils.isBlank(active) || BizConst.DEV.equals(active) ? | |||||
"GO_a1479720291640b4982158fe3035a2d0" : projectInfo.getBuildOrgCode()) | |||||
.superUnit(projectInfo.getSuperOrg()) | |||||
.superUnitCode(StringUtils.isBlank(active) || BizConst.DEV.equals(active) ? | |||||
"GO_a1479720291640b4982158fe3035a2d0" : projectInfo.getSuperOrgCode()) | |||||
.projectEstimateFile(convertFile(projectInfo.getCalculationTotalInvestmentFile(), fileService)) | |||||
.unitThreePlan(convertFile(projectInfo.getMainResponsibilitiesApplicantFile(), fileService)) | |||||
.otherFile(convertFile(projectInfo.getPreliminaryPlanFile(), fileService)) | |||||
.projectRemark(projectInfo.getProjectRemarks()) | |||||
.includeApplication(projectInfo.getIncludeApplication()) | |||||
.isEffective(1) | |||||
.projectApplyFile(convertFile(projectInfo.getProjectApplicationForm(), fileService)) | |||||
.researchReport(convertFile(projectInfo.getPreliminaryPlanFile(), fileService)) | |||||
.applicationInfo(convertApplications(applications, fileService)) | |||||
.build(); | |||||
private ApplicationConverter() { | |||||
} | } | ||||
private static Integer convertProjectType(String projectType) { | private static Integer convertProjectType(String projectType) { | ||||
if(StringUtils.isBlank(projectType)){ | |||||
if (StringUtils.isBlank(projectType)) { | |||||
return null; | return null; | ||||
} | } | ||||
if(Lists.newArrayList(ProjectTypeNewEnum.FIRST_BUILD.getCode(), | |||||
ProjectTypeNewEnum.SJ_BUILD.getCode(),ProjectTypeNewEnum.SZ_BUILD.getCode()).contains(projectType)){ | |||||
if (Lists.newArrayList(ProjectTypeNewEnum.FIRST_BUILD.getCode(), | |||||
ProjectTypeNewEnum.SJ_BUILD.getCode(), ProjectTypeNewEnum.SZ_BUILD.getCode()).contains(projectType)) { | |||||
return ProjectTypeEnum.RECONSTRUCTION.getCode(); | return ProjectTypeEnum.RECONSTRUCTION.getCode(); | ||||
}else if(Lists.newArrayList(ProjectTypeNewEnum.NEW_OPERA.getCode(), | |||||
ProjectTypeNewEnum.XU_OPERA.getCode()).contains(projectType)){ | |||||
} else if (Lists.newArrayList(ProjectTypeNewEnum.NEW_OPERA.getCode(), | |||||
ProjectTypeNewEnum.XU_OPERA.getCode()).contains(projectType)) { | |||||
return ProjectTypeEnum.COMPREHENSIVE_INTEGRATION.getCode(); | return ProjectTypeEnum.COMPREHENSIVE_INTEGRATION.getCode(); | ||||
} | } | ||||
return null; | return null; | ||||
@@ -118,77 +60,6 @@ public class ApplicationConverter { | |||||
return sb.toString(); | return sb.toString(); | ||||
} | } | ||||
//放入项目 app | |||||
private static List<ProvincialApplicationDTO> convertApplications(List<ProjectApplication> applications, | |||||
FileService fileService) { | |||||
if (CollUtil.isEmpty(applications)) { | |||||
return Collections.emptyList(); | |||||
} | |||||
return applications.stream().map(app -> convertApp(app, fileService)).collect(Collectors.toList()); | |||||
} | |||||
private static ProvincialApplicationDTO convertApp(ProjectApplication projectApplication, FileService fileService) { | |||||
return ProvincialApplicationDTO.builder() | |||||
.clouds(convertCloud(projectApplication)) | |||||
.isFirst(projectApplication.getIsFirst()) | |||||
.applicationName((projectApplication.getApplicationName())) | |||||
.applicationCode(StringUtils.isNotBlank(projectApplication.getAppCode()) ? | |||||
projectApplication.getAppCode() : projectApplication.getRelatedExistsApplicationCode()) | |||||
.relatedExistsApplication(projectApplication.getRelatedExistsApplication()) | |||||
.applicationType(2) | |||||
.buildLevel(projectApplication.getBuildLevel()) | |||||
.isUniteBuild(projectApplication.getIsUniteBuild()) | |||||
.unionBuildKind(projectApplication.getUnionBuildKind()) | |||||
.applicationSummary(projectApplication.getApplicationSummary()) | |||||
.applicationRemark(projectApplication.getApplicationRemark()) | |||||
.isFiveDomain(projectApplication.getIsDigitalModification()) | |||||
.fiveDomain(projectApplication.getDigitalModification()) | |||||
.bizDomain(projectApplication.getBizDomain()) | |||||
.isBizCooperate(projectApplication.getIsBizCooperate()) | |||||
.userRange(projectApplication.getUsesRangeRemark()) | |||||
.useGovCloud(projectApplication.getUseGovCloud()) | |||||
.nationalITSpec(projectApplication.getNationalItSpec()) | |||||
.netEnv(String.valueOf(projectApplication.getNetEnv())) | |||||
.secrecyGrade(projectApplication.getSecrecyGrade()) | |||||
.passwordGrade(projectApplication.getPasswordGrade()) | |||||
.accountAppName(projectApplication.getAccountAppName()) | |||||
.brainAccountAppName(projectApplication.getDomainBrainAccount()) | |||||
.useCommonData(projectApplication.getUseCommonData()) | |||||
.dataName(projectApplication.getDataName()) | |||||
.commonComponents(projectApplication.getCommonComponents()) | |||||
.useCommonComponent(projectApplication.getUseCommonComponent()) | |||||
.isProduceCommonComponent(projectApplication.getProduceCommonComponent()) | |||||
.produceCommonComponent(projectApplication.getProduceCommonComponents()) | |||||
.publishSide(projectApplication.getPublishSide()) | |||||
.isS2(projectApplication.getIsAccountAppName()) | |||||
.accountAppName(projectApplication.getAccountAppName()) | |||||
.applicationEstimateFile(convertFile(projectApplication.getApplicationEstimateFile(), fileService)) | |||||
.cooperativeUnit(projectApplication.getBizCooperateInfo()) | |||||
.build(); | |||||
} | |||||
private static String convertFile(String applicationEstimateFile, FileService fileService) { | |||||
try { | |||||
JSONArray jsonArrays = JSON.parseArray(applicationEstimateFile); | |||||
List<FileDTO> files = jsonArrays.stream().map(json -> { | |||||
JSONObject fileJson = (JSONObject) JSON.toJSON(json); | |||||
Long fileId = fileJson.getLong("id"); | |||||
String fileName = fileJson.getString("originalFileName"); | |||||
Map<Long, String> fileMap = fileService.findUrlById(Arrays.asList(fileId)); | |||||
String url = fileMap.get(fileId); | |||||
url = removeExpire(url); | |||||
FileDTO file = new FileDTO(); | |||||
file.setFileId(String.valueOf(fileId)); | |||||
file.setFileName(fileName); | |||||
file.setAccessUrl(url); | |||||
return file; | |||||
}).collect(Collectors.toList()); | |||||
return JSON.toJSONString(files); | |||||
} catch (Exception e) { | |||||
log.info("转换省局上传 文件出错 {}", e.getMessage()); | |||||
} | |||||
return null; | |||||
} | |||||
/** | /** | ||||
* 去除掉 oss链接的超时时间 | * 去除掉 oss链接的超时时间 | ||||
@@ -204,42 +75,4 @@ public class ApplicationConverter { | |||||
return StringUtils.EMPTY; | return StringUtils.EMPTY; | ||||
} | } | ||||
//立项依据的文件格式不一样 | |||||
private static String convertBasicFile(String applicationEstimateFile, FileService fileService) { | |||||
try { | |||||
List<FileDTO> files = Lists.newArrayList(); | |||||
JSONArray jsonArrays = JSON.parseArray(applicationEstimateFile); | |||||
jsonArrays.forEach(json -> { | |||||
JSONObject fileJson = (JSONObject) JSON.toJSON(json); | |||||
JSONArray fileList = fileJson.getJSONArray("fileList"); | |||||
fileList.forEach(f -> { | |||||
JSONObject fJson = (JSONObject) JSON.toJSON(f); | |||||
Long fileId = fJson.getLong("id"); | |||||
String fileName = fJson.getString("originalFileName"); | |||||
Map<Long, String> fileMap = fileService.findUrlById(Lists.newArrayList(fileId)); | |||||
String url = fileMap.get(fileId); | |||||
url = removeExpire(url); | |||||
FileDTO file = new FileDTO(); | |||||
file.setFileId(String.valueOf(fileId)); | |||||
file.setFileName(fileName); | |||||
file.setAccessUrl(url); | |||||
files.add(file); | |||||
}); | |||||
}); | |||||
return JSON.toJSONString(files); | |||||
} catch (Exception e) { | |||||
log.info("转换省局上传 basic文件出错 {}", e.getMessage()); | |||||
} | |||||
return null; | |||||
} | |||||
private static List<ProvincialApplicationDTO.Cloud> convertCloud(ProjectApplication projectApplication) { | |||||
return Lists.newArrayList(ProvincialApplicationDTO.Cloud.builder() | |||||
.cloudType(projectApplication.getCloudsType()) | |||||
.cloudNums(projectApplication.getCloudsNumber()) | |||||
.cloudBasicSpec(projectApplication.getCloudsFoundationSpecifications()) | |||||
.cloudUseDescription(projectApplication.getCloudsDescription()) | |||||
.build()); | |||||
} | |||||
} | } |
@@ -5,8 +5,6 @@ import com.alibaba.excel.EasyExcel; | |||||
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; | import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; | ||||
import com.baomidou.mybatisplus.core.toolkit.Wrappers; | import com.baomidou.mybatisplus.core.toolkit.Wrappers; | ||||
import com.baomidou.mybatisplus.extension.plugins.pagination.Page; | import com.baomidou.mybatisplus.extension.plugins.pagination.Page; | ||||
import com.hz.pm.api.common.enumeration.CommonEnum; | |||||
import com.hz.pm.api.common.enumeration.ProjectProcessStageEnum; | |||||
import com.hz.pm.api.common.model.constant.BizConst; | import com.hz.pm.api.common.model.constant.BizConst; | ||||
import com.hz.pm.api.common.model.constant.CommonConst; | import com.hz.pm.api.common.model.constant.CommonConst; | ||||
import com.hz.pm.api.common.statemachine.util.ProjectStateMachineUtil; | import com.hz.pm.api.common.statemachine.util.ProjectStateMachineUtil; | ||||
@@ -14,50 +12,35 @@ import com.hz.pm.api.common.util.ExcelDownUtil; | |||||
import com.hz.pm.api.common.util.ExcelExportStyle; | import com.hz.pm.api.common.util.ExcelExportStyle; | ||||
import com.hz.pm.api.projectdeclared.model.dto.ConstructionPlanExportDTO; | import com.hz.pm.api.projectdeclared.model.dto.ConstructionPlanExportDTO; | ||||
import com.hz.pm.api.projectdeclared.model.dto.ContructionSuggestionsDTO; | import com.hz.pm.api.projectdeclared.model.dto.ContructionSuggestionsDTO; | ||||
import com.hz.pm.api.projectdeclared.model.dto.DefaultDeclaredDTO; | |||||
import com.hz.pm.api.projectdeclared.model.entity.ProjectConstructionSuggestions; | import com.hz.pm.api.projectdeclared.model.entity.ProjectConstructionSuggestions; | ||||
import com.hz.pm.api.projectdeclared.model.req.ConstrctionPlanListReq; | import com.hz.pm.api.projectdeclared.model.req.ConstrctionPlanListReq; | ||||
import com.hz.pm.api.projectdeclared.service.IConstructionSuggestionsService; | import com.hz.pm.api.projectdeclared.service.IConstructionSuggestionsService; | ||||
import com.hz.pm.api.projectlib.helper.ProjectHelper; | import com.hz.pm.api.projectlib.helper.ProjectHelper; | ||||
import com.hz.pm.api.projectlib.manage.ProjectLibManage; | import com.hz.pm.api.projectlib.manage.ProjectLibManage; | ||||
import com.hz.pm.api.projectlib.model.dto.ProjectDTO; | |||||
import com.hz.pm.api.projectlib.model.entity.Project; | import com.hz.pm.api.projectlib.model.entity.Project; | ||||
import com.hz.pm.api.projectlib.model.entity.ProjectInst; | import com.hz.pm.api.projectlib.model.entity.ProjectInst; | ||||
import com.hz.pm.api.projectlib.model.enumeration.InstTypeEnum; | import com.hz.pm.api.projectlib.model.enumeration.InstTypeEnum; | ||||
import com.hz.pm.api.projectlib.model.enumeration.status.ProjectStatus; | |||||
import com.hz.pm.api.projectlib.model.enumeration.ProjectTypeNewEnum; | import com.hz.pm.api.projectlib.model.enumeration.ProjectTypeNewEnum; | ||||
import com.hz.pm.api.projectlib.model.enumeration.status.ProjectStatus; | |||||
import com.hz.pm.api.projectlib.model.req.ProjectListReq; | import com.hz.pm.api.projectlib.model.req.ProjectListReq; | ||||
import com.hz.pm.api.projectlib.model.vo.ProjectLibListItemVO; | import com.hz.pm.api.projectlib.model.vo.ProjectLibListItemVO; | ||||
import com.hz.pm.api.projectlib.service.IProjectInstService; | import com.hz.pm.api.projectlib.service.IProjectInstService; | ||||
import com.hz.pm.api.projectlib.service.IProjectService; | import com.hz.pm.api.projectlib.service.IProjectService; | ||||
import com.hz.pm.api.staging.enums.MsgTypeEnum; | |||||
import com.hz.pm.api.sys.manage.NoticeManage; | |||||
import com.hz.pm.api.sys.manage.ProcessModelManage; | |||||
import com.hz.pm.api.todocenter.constant.WorkNoticeConst; | |||||
import com.hz.pm.api.user.security.model.UserInfoDetails; | import com.hz.pm.api.user.security.model.UserInfoDetails; | ||||
import com.hz.pm.api.user.util.LoginUserUtil; | import com.hz.pm.api.user.util.LoginUserUtil; | ||||
import com.ningdatech.basic.exception.BizException; | import com.ningdatech.basic.exception.BizException; | ||||
import com.ningdatech.basic.function.VUtils; | |||||
import com.ningdatech.basic.model.PageVo; | import com.ningdatech.basic.model.PageVo; | ||||
import com.ningdatech.basic.util.NdDateUtils; | import com.ningdatech.basic.util.NdDateUtils; | ||||
import com.wflow.bean.entity.WflowModels; | |||||
import com.wflow.exception.BusinessException; | import com.wflow.exception.BusinessException; | ||||
import com.wflow.workflow.bean.dto.OrgInfoDTO; | |||||
import com.wflow.workflow.bean.vo.ProcessStartParamsVo; | |||||
import com.wflow.workflow.service.ProcessInstanceService; | |||||
import lombok.RequiredArgsConstructor; | import lombok.RequiredArgsConstructor; | ||||
import lombok.extern.slf4j.Slf4j; | import lombok.extern.slf4j.Slf4j; | ||||
import org.apache.commons.lang3.StringUtils; | |||||
import org.springframework.beans.BeanUtils; | import org.springframework.beans.BeanUtils; | ||||
import org.springframework.stereotype.Component; | import org.springframework.stereotype.Component; | ||||
import org.springframework.transaction.annotation.Transactional; | |||||
import javax.servlet.http.HttpServletResponse; | import javax.servlet.http.HttpServletResponse; | ||||
import java.io.IOException; | import java.io.IOException; | ||||
import java.time.LocalDateTime; | import java.time.LocalDateTime; | ||||
import java.util.Collections; | |||||
import java.util.List; | import java.util.List; | ||||
import java.util.Map; | |||||
import java.util.Objects; | import java.util.Objects; | ||||
import java.util.stream.Collectors; | import java.util.stream.Collectors; | ||||
@@ -72,142 +55,13 @@ import java.util.stream.Collectors; | |||||
@RequiredArgsConstructor | @RequiredArgsConstructor | ||||
public class ConstructionPlanManage { | public class ConstructionPlanManage { | ||||
private final ProcessModelManage processModelManage; | |||||
private final IProjectService projectService; | private final IProjectService projectService; | ||||
private final ProcessInstanceService processService; | |||||
private final ProjectStateMachineUtil projectStateMachineUtil; | private final ProjectStateMachineUtil projectStateMachineUtil; | ||||
private final IProjectInstService projectInstService; | private final IProjectInstService projectInstService; | ||||
private final ProjectLibManage projectLibManage; | private final ProjectLibManage projectLibManage; | ||||
private final DefaultDeclaredProjectManage declaredProjectManage; | |||||
private final DefaultDeclaredProjectManage defaultDeclaredProjectManage; | |||||
private final NoticeManage noticeManage; | |||||
private final IConstructionSuggestionsService constructionSuggestionsService; | private final IConstructionSuggestionsService constructionSuggestionsService; | ||||
/** | /** | ||||
* 建设方案 | |||||
* | |||||
* @param req \ | |||||
* @return \ | |||||
*/ | |||||
@Transactional(rollbackFor = Exception.class) | |||||
public synchronized String startTheProcess(DefaultDeclaredDTO req) { | |||||
UserInfoDetails user = LoginUserUtil.loginUserDetail(); | |||||
Long userId = user.getUserId(); | |||||
ProjectDTO projectInfo = req.getProjectInfo(); | |||||
Long projectInfoId = projectInfo.getId(); | |||||
VUtils.isTrue(Objects.isNull(projectInfoId)).throwMessage("提交失败,缺少项目ID!"); | |||||
Project oldProject = projectService.getById(projectInfoId); | |||||
VUtils.isTrue(StringUtils.isBlank(projectInfo.getConstructionPlanFile())).throwMessage("提交失败,请提交建设方案!"); | |||||
// 判断 项目当前状态 是不是 方案待申报 | |||||
VUtils.isTrue(!ProjectStatus.PLAN_TO_BE_DECLARED.eq(oldProject.getStatus()) || | |||||
!ProjectStatus.NOT_APPROVED.eq(oldProject.getStage())) | |||||
.throwMessage("提交失败 该项目不是 方案待申报状态或者未立项阶段"); | |||||
projectInfo.setBuildOrgCode(user.getMhUnitIdStr()); | |||||
projectInfo.setBuildOrgName(user.getMhUnitName()); | |||||
// 项目名称去重 | |||||
if (StringUtils.isNotBlank(projectInfo.getProjectName()) && !projectInfo.getProjectName() | |||||
.equals(oldProject.getProjectName())) { | |||||
projectInfo.setProjectCode(oldProject.getProjectCode()); | |||||
defaultDeclaredProjectManage.checkDuplication(projectInfo); | |||||
} | |||||
//判断申报金额 是否等于总的 判断年度支付金额 是否等于总金额 | |||||
defaultDeclaredProjectManage.checkAmount(projectInfo); | |||||
//如果主管单位没有 那么主管单位就是自己 | |||||
if (CommonEnum.NO.getCode().equals(projectInfo.getIsSuperOrg())) { | |||||
projectInfo.setSuperOrgCode(user.getMhUnitIdStr()); | |||||
projectInfo.setSuperOrg(user.getMhUnitName()); | |||||
} | |||||
Project constructProject = new Project(); | |||||
BeanUtils.copyProperties(projectInfo, constructProject); | |||||
constructProject.setStatus(oldProject.getStatus()); | |||||
constructProject.setStage(oldProject.getStage()); | |||||
ProjectProcessStageEnum instType = ProjectProcessStageEnum.CONSTRUCTION_PROJECT_APPROVAL_PROCESS; | |||||
WflowModels wflowModels = processModelManage.getWflowModels(instType, user.getMhUnitId()); | |||||
if (Objects.isNull(wflowModels)) { | |||||
throw BizException.wrap("找不到建设申报流程配置"); | |||||
} | |||||
//如果被禁用了的话 直接跳过 进入到下一个状态 | |||||
if (Boolean.TRUE.equals(wflowModels.getIsStop())) { | |||||
//被禁用了 调2次状态机 | |||||
projectStateMachineUtil.pass(constructProject); | |||||
projectStateMachineUtil.pass(constructProject); | |||||
constructProject.setUpdateOn(LocalDateTime.now()); | |||||
projectService.updateById(constructProject); | |||||
return "因为建设方案流程被禁用了 直接跳过!"; | |||||
} | |||||
ProcessStartParamsVo params = new ProcessStartParamsVo(); | |||||
params.setUser(declaredProjectManage.buildUser(userId)); | |||||
params.setProcessUsers(Collections.emptyMap()); | |||||
//放入条件判断的项目字段 | |||||
//把条件值给放入工作流 | |||||
defaultDeclaredProjectManage.buildCondition(params, oldProject, req); | |||||
// 获取发起单位、发起单位主管单位、发起单位上级条线主管单位信息 | |||||
Map<String, OrgInfoDTO> orgModelMap = defaultDeclaredProjectManage.buildOrgModelMap(userId, constructProject); | |||||
String instanceId = processService.startProcessLs(wflowModels, params, orgModelMap); | |||||
log.info("建设方案项目申报成功 【{}】", instanceId); | |||||
// 保存建设项目相关 | |||||
Project buildProject; | |||||
if (Boolean.TRUE.equals(req.getRestart())) { | |||||
//如果是重新提交 不用生成新版本 前面已经生成过了 | |||||
buildProject = contructionPlanModifyProject(oldProject, instanceId); | |||||
} else { | |||||
buildProject = projectLibManage.saveConstructProjectInDeclared(projectInfo, instanceId, userId, oldProject); | |||||
} | |||||
//发送给第一个审批人消息 | |||||
noticeManage.sendFirstUser(buildProject, wflowModels.getFormName(), instanceId, | |||||
WorkNoticeConst.PASS_MSG_TEMPLATE, MsgTypeEnum.PROJECT_REVIEW); | |||||
return instanceId; | |||||
} | |||||
private Project contructionPlanModifyProject(Project project, String instanceId) { | |||||
projectStateMachineUtil.pass(project); | |||||
project.setUpdateOn(LocalDateTime.now()); | |||||
project.setInstCode(instanceId); | |||||
projectService.updateById(project); | |||||
//保存项目和实例的关系 | |||||
ProjectInst projectInst = new ProjectInst(); | |||||
projectInst.setProjectId(project.getId()); | |||||
projectInst.setInstCode(instanceId); | |||||
projectInst.setCreateOn(LocalDateTime.now()); | |||||
projectInst.setUpdateOn(LocalDateTime.now()); | |||||
projectInst.setInstType(ProjectProcessStageEnum.CONSTRUCTION_PROJECT_APPROVAL_PROCESS); | |||||
projectInstService.save(projectInst); | |||||
return project; | |||||
} | |||||
/** | |||||
* 驳回 重新提交建设方案 | |||||
* | |||||
* @param dto | |||||
* @return | |||||
*/ | |||||
@Transactional(rollbackFor = Exception.class) | |||||
public String restartTheProcess(DefaultDeclaredDTO dto) { | |||||
ProjectDTO projectDto = dto.getProjectInfo(); | |||||
VUtils.isTrue(Objects.isNull(projectDto.getId())).throwMessage("提交失败 缺少项目ID!"); | |||||
Project projectInfo = projectService.getById(projectDto.getId()); | |||||
VUtils.isTrue(Objects.isNull(projectInfo)).throwMessage("提交失败 此项目不存在!"); | |||||
VUtils.isTrue(StringUtils.isBlank(projectDto.getConstructionPlanFile())).throwMessage("提交失败 请提交建设方案!"); | |||||
//直接先到待方案审批 | |||||
Project project = projectLibManage.saveProjectWithVersionAndStatus(projectDto, null, | |||||
ProjectStatus.PLAN_TO_BE_DECLARED.getCode(), Boolean.TRUE); | |||||
dto.getProjectInfo().setId(project.getId()); | |||||
dto.setRestart(Boolean.TRUE); | |||||
return startTheProcess(dto); | |||||
} | |||||
/** | |||||
* 提交建设方案项目 时 更新信息 | * 提交建设方案项目 时 更新信息 | ||||
* | * | ||||
* @param project | * @param project | ||||
@@ -1,9 +1,7 @@ | |||||
package com.hz.pm.api.projectdeclared.manage; | package com.hz.pm.api.projectdeclared.manage; | ||||
import cn.hutool.core.collection.CollUtil; | |||||
import com.alibaba.excel.EasyExcel; | import com.alibaba.excel.EasyExcel; | ||||
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; | import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; | ||||
import com.baomidou.mybatisplus.core.toolkit.Wrappers; | |||||
import com.hz.pm.api.common.helper.UserInfoHelper; | import com.hz.pm.api.common.helper.UserInfoHelper; | ||||
import com.hz.pm.api.common.util.ExcelDownUtil; | import com.hz.pm.api.common.util.ExcelDownUtil; | ||||
import com.hz.pm.api.common.util.ExcelExportStyle; | import com.hz.pm.api.common.util.ExcelExportStyle; | ||||
@@ -15,12 +13,10 @@ import com.hz.pm.api.projectlib.helper.ProjectHelper; | |||||
import com.hz.pm.api.projectlib.manage.ProjectLibManage; | 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.ProjectDTO; | ||||
import com.hz.pm.api.projectlib.model.entity.Project; | import com.hz.pm.api.projectlib.model.entity.Project; | ||||
import com.hz.pm.api.projectlib.model.entity.ProjectApplication; | |||||
import com.hz.pm.api.projectlib.model.enumeration.status.ProjectStatus; | |||||
import com.hz.pm.api.projectlib.model.enumeration.ProjectTypeNewEnum; | import com.hz.pm.api.projectlib.model.enumeration.ProjectTypeNewEnum; | ||||
import com.hz.pm.api.projectlib.model.enumeration.status.ProjectStatus; | |||||
import com.hz.pm.api.projectlib.model.req.ProjectListReq; | import com.hz.pm.api.projectlib.model.req.ProjectListReq; | ||||
import com.hz.pm.api.projectlib.model.vo.ProjectLibListItemVO; | import com.hz.pm.api.projectlib.model.vo.ProjectLibListItemVO; | ||||
import com.hz.pm.api.projectlib.service.IProjectApplicationService; | |||||
import com.hz.pm.api.projectlib.service.IProjectService; | import com.hz.pm.api.projectlib.service.IProjectService; | ||||
import com.hz.pm.api.user.security.model.UserFullInfoDTO; | import com.hz.pm.api.user.security.model.UserFullInfoDTO; | ||||
import com.hz.pm.api.user.util.LoginUserUtil; | import com.hz.pm.api.user.util.LoginUserUtil; | ||||
@@ -28,7 +24,6 @@ import com.ningdatech.basic.exception.BizException; | |||||
import com.ningdatech.basic.function.VUtils; | import com.ningdatech.basic.function.VUtils; | ||||
import com.ningdatech.basic.model.PageVo; | import com.ningdatech.basic.model.PageVo; | ||||
import com.ningdatech.basic.util.NdDateUtils; | import com.ningdatech.basic.util.NdDateUtils; | ||||
import com.wflow.exception.BusinessException; | |||||
import lombok.RequiredArgsConstructor; | import lombok.RequiredArgsConstructor; | ||||
import lombok.extern.slf4j.Slf4j; | import lombok.extern.slf4j.Slf4j; | ||||
import org.apache.commons.lang3.StringUtils; | import org.apache.commons.lang3.StringUtils; | ||||
@@ -38,7 +33,6 @@ import org.springframework.transaction.annotation.Transactional; | |||||
import javax.servlet.http.HttpServletResponse; | import javax.servlet.http.HttpServletResponse; | ||||
import java.io.IOException; | import java.io.IOException; | ||||
import java.time.LocalDateTime; | |||||
import java.util.Arrays; | import java.util.Arrays; | ||||
import java.util.Collections; | import java.util.Collections; | ||||
import java.util.List; | import java.util.List; | ||||
@@ -60,10 +54,6 @@ public class ProjectAdjustmentManage { | |||||
private final IProjectService projectService; | private final IProjectService projectService; | ||||
private final IProjectApplicationService projectApplicationService; | |||||
private final RestartProcessMapUtil reStartProcessMapUtil; | |||||
private final DefaultDeclaredProjectManage defaultDeclaredProjectManage; | private final DefaultDeclaredProjectManage defaultDeclaredProjectManage; | ||||
private final ProjectLibManage projectLibManage; | private final ProjectLibManage projectLibManage; | ||||
@@ -102,38 +92,10 @@ public class ProjectAdjustmentManage { | |||||
return declaredFunction.apply(dto); | return declaredFunction.apply(dto); | ||||
} | } | ||||
private Boolean modifyProject(ProjectDTO projectDto) { | |||||
//先修改项目信息 | |||||
Project project = new Project(); | |||||
BeanUtils.copyProperties(projectDto, project); | |||||
project.setUpdateOn(LocalDateTime.now()); | |||||
if (!projectService.updateById(project)) { | |||||
throw new BusinessException("项目调整失败"); | |||||
} | |||||
//再修改应用信息 | |||||
if (CollUtil.isNotEmpty(projectDto.getApplicationList())) { | |||||
//采取批量删除 批量添加的方式 | |||||
projectApplicationService.remove(Wrappers.lambdaQuery(ProjectApplication.class) | |||||
.eq(ProjectApplication::getProjectId, project.getId())); | |||||
//批量添加 | |||||
List<ProjectApplication> applications = projectDto.getApplicationList().stream().map(application -> { | |||||
ProjectApplication projectApplication = new ProjectApplication(); | |||||
BeanUtils.copyProperties(application, projectApplication); | |||||
projectApplication.setProjectId(project.getId()); | |||||
projectApplication.setProjectCode(project.getProjectCode()); | |||||
projectApplication.setProjectVersion(project.getVersion()); | |||||
return projectApplication; | |||||
}).collect(Collectors.toList()); | |||||
projectApplicationService.saveBatch(applications); | |||||
} | |||||
return Boolean.TRUE; | |||||
} | |||||
private static final List<Integer> PROJECT_STATUS = Arrays.asList( | private static final List<Integer> PROJECT_STATUS = Arrays.asList( | ||||
ProjectStatus.UNDER_INTERNAL_AUDIT_NOT_PASS.getCode(), | ProjectStatus.UNDER_INTERNAL_AUDIT_NOT_PASS.getCode(), | ||||
ProjectStatus.PREQUALIFICATION_FAILED.getCode(), | ProjectStatus.PREQUALIFICATION_FAILED.getCode(), | ||||
ProjectStatus.THE_JOINT_REVIEW_OF_PROVINCIAL_DEPARTMENTS_FAILED.getCode(), | |||||
ProjectStatus.SCHEME_REVIEW_FAILED.getCode()); | |||||
ProjectStatus.THE_JOINT_REVIEW_OF_PROVINCIAL_DEPARTMENTS_FAILED.getCode()); | |||||
/** | /** | ||||
* 项目库 | * 项目库 | ||||
@@ -1,118 +0,0 @@ | |||||
package com.hz.pm.api.projectdeclared.manage; | |||||
import com.baomidou.mybatisplus.core.toolkit.Wrappers; | |||||
import com.hz.pm.api.projectdeclared.converter.ApplicationConverter; | |||||
import com.hz.pm.api.projectdeclared.model.dto.DefaultDeclaredDTO; | |||||
import com.hz.pm.api.projectlib.model.enumeration.status.ProjectStatus; | |||||
import com.hz.pm.api.projectlib.manage.ProjectLibManage; | |||||
import com.hz.pm.api.projectlib.model.dto.ProjectDTO; | |||||
import com.hz.pm.api.projectlib.model.entity.Project; | |||||
import com.hz.pm.api.projectlib.model.entity.ProjectApplication; | |||||
import com.hz.pm.api.projectlib.service.IProjectApplicationService; | |||||
import com.hz.pm.api.projectlib.service.IProjectService; | |||||
import com.hz.pm.api.provincial.service.IJoinReviewProvincialBureauService; | |||||
import com.hz.pm.api.todocenter.constant.TodoCenterConst; | |||||
import com.ningdatech.basic.function.VUtils; | |||||
import com.ningdatech.file.service.FileService; | |||||
import com.wflow.exception.BusinessException; | |||||
import lombok.RequiredArgsConstructor; | |||||
import lombok.extern.slf4j.Slf4j; | |||||
import org.springframework.beans.factory.annotation.Value; | |||||
import org.springframework.stereotype.Component; | |||||
import org.springframework.transaction.annotation.Transactional; | |||||
import java.time.LocalDateTime; | |||||
import java.util.List; | |||||
import java.util.Objects; | |||||
/** | |||||
* @Classname ReviewByProvincialDeptManage | |||||
* @Description 省级部门联审 | |||||
* @Date 2023/2/17 14:48 | |||||
* @Author PoffyZhang | |||||
*/ | |||||
@Component | |||||
@Slf4j | |||||
@RequiredArgsConstructor | |||||
public class ReviewByProvincialDeptManage { | |||||
private final IProjectService projectService; | |||||
private final FileService fileService; | |||||
private final IJoinReviewProvincialBureauService joinReviewProvincialBureauService; | |||||
private final IProjectApplicationService applicationService; | |||||
private final ProjectLibManage projectLibManage; | |||||
@Value("${spring.profiles.active}") | |||||
private String active; | |||||
/** | |||||
* 省级部门联审 | |||||
* | |||||
* @param project | |||||
* @return | |||||
*/ | |||||
@Transactional(rollbackFor = Exception.class) | |||||
public Boolean startTheProcess(Project project) { | |||||
VUtils.isTrue(Objects.isNull(project.getId())).throwMessage("提交失败 缺少项目ID!"); | |||||
Project projectInfo = projectService.getById(project.getId()); | |||||
VUtils.isTrue(Objects.isNull(projectInfo)).throwMessage("提交失败 此项目不存在!"); | |||||
//首先要判断 项目当前状态 是不是 省级部门联审 | |||||
VUtils.isTrue(!ProjectStatus.JOINT_REVIEW_BY_PROVINCIAL_DEPARTMENTS.getCode().equals(projectInfo.getStatus()) || | |||||
!ProjectStatus.NOT_APPROVED.getCode().equals(projectInfo.getStage())) | |||||
.throwMessage("提交失败 该项目不是 省级部门联审状态状态或者未立项阶段"); | |||||
// 对接省级联审的接口 | |||||
List<ProjectApplication> applications = applicationService.list(Wrappers.lambdaQuery(ProjectApplication.class) | |||||
.eq(ProjectApplication::getProjectId, projectInfo.getId())); | |||||
if (joinReviewProvincialBureauService.pushImportProject(ApplicationConverter.convertProject(projectInfo, applications, fileService, active))) { | |||||
return Boolean.TRUE; | |||||
} | |||||
return Boolean.FALSE; | |||||
} | |||||
/** | |||||
* 省级部门联审 重新提交 | |||||
* | |||||
* @param declaringDTO \ | |||||
* @return \ | |||||
*/ | |||||
@Transactional(rollbackFor = Exception.class) | |||||
public String restartTheProcess(DefaultDeclaredDTO declaringDTO) { | |||||
ProjectDTO project = declaringDTO.getProjectInfo(); | |||||
VUtils.isTrue(Objects.isNull(project.getId())).throwMessage("提交失败 缺少项目ID!"); | |||||
Project projectInfo = projectService.getNewProject(project.getId()); | |||||
VUtils.isTrue(Objects.isNull(projectInfo)).throwMessage("提交失败 此项目不存在!"); | |||||
//首先要判断 项目当前状态 是不是 省级部门联审不通过 | |||||
VUtils.isTrue(!ProjectStatus.THE_JOINT_REVIEW_OF_PROVINCIAL_DEPARTMENTS_FAILED.getCode().equals(projectInfo.getStatus()) || | |||||
!ProjectStatus.NOT_APPROVED.getCode().equals(projectInfo.getStage())) | |||||
.throwMessage("提交失败 该项目不是 省级部门联审不通过状态或者未立项阶段"); | |||||
// 对接省级联审的接口 | |||||
Project p = projectLibManage.saveProjectWithVersionAndStatus(project, null, | |||||
ProjectStatus.JOINT_REVIEW_BY_PROVINCIAL_DEPARTMENTS.getCode(), Boolean.FALSE); | |||||
List<ProjectApplication> applications = applicationService.list(Wrappers.lambdaQuery(ProjectApplication.class) | |||||
.eq(ProjectApplication::getProjectId, p.getId())); | |||||
//入库暂存表 后续处理 对接外部接口 | |||||
p.setUpdateOn(LocalDateTime.now()); | |||||
//保存一下 当前的主管单位发起人 | |||||
p.setPreStartUserId(p.getSponsor()); | |||||
//当前实例置为空 | |||||
p.setInstCode(TodoCenterConst.Declared.NULL_INST_CODE); | |||||
declaringDTO.getProjectInfo().setId(p.getId()); | |||||
projectService.updateById(p); | |||||
if (!joinReviewProvincialBureauService.pushImportProject( | |||||
ApplicationConverter.convertProject(p, applications, fileService, active))) { | |||||
throw new BusinessException("提交省级部门联审失败"); | |||||
} | |||||
return String.valueOf(p.getId()); | |||||
} | |||||
} |
@@ -69,7 +69,7 @@ public class ReviewChecklistManage { | |||||
//项目查最新 | //项目查最新 | ||||
query.eq(Project::getNewest, Boolean.TRUE); | query.eq(Project::getNewest, Boolean.TRUE); | ||||
//建设方案提交后的状态 | //建设方案提交后的状态 | ||||
query.ge(Project::getStatus, ProjectStatus.SCHEME_UNDER_REVIEW.getCode()) | |||||
query.ge(Project::getStatus, null) | |||||
.ne(Project::getStatus, ProjectStatus.PLAN_TO_BE_DECLARED.getCode()); | .ne(Project::getStatus, ProjectStatus.PLAN_TO_BE_DECLARED.getCode()); | ||||
UserInfoDetails user = LoginUserUtil.loginUserDetail(); | UserInfoDetails user = LoginUserUtil.loginUserDetail(); | ||||
buildReviewCheckPermission(query, user); | buildReviewCheckPermission(query, user); | ||||
@@ -1,7 +1,8 @@ | |||||
package com.hz.pm.api.projectdeclared.utils; | package com.hz.pm.api.projectdeclared.utils; | ||||
import com.google.common.collect.Maps; | import com.google.common.collect.Maps; | ||||
import com.hz.pm.api.projectdeclared.manage.*; | |||||
import com.hz.pm.api.projectdeclared.manage.DeclaredProjectManage; | |||||
import com.hz.pm.api.projectdeclared.manage.PrequalificationDeclaredProjectManage; | |||||
import com.hz.pm.api.projectdeclared.model.dto.DefaultDeclaredDTO; | import com.hz.pm.api.projectdeclared.model.dto.DefaultDeclaredDTO; | ||||
import com.hz.pm.api.projectlib.manage.DeclaredRecordManage; | import com.hz.pm.api.projectlib.manage.DeclaredRecordManage; | ||||
import com.hz.pm.api.projectlib.model.enumeration.status.ProjectStatus; | import com.hz.pm.api.projectlib.model.enumeration.status.ProjectStatus; | ||||
@@ -24,22 +25,14 @@ public class RestartProcessMapUtil { | |||||
private static final Map<Integer, Function<DefaultDeclaredDTO, String>> RESTART_PROCESS_MAP = Maps.newHashMap(); | private static final Map<Integer, Function<DefaultDeclaredDTO, String>> RESTART_PROCESS_MAP = Maps.newHashMap(); | ||||
public RestartProcessMapUtil(DeclaredProjectManage declaredProjectManage, | public RestartProcessMapUtil(DeclaredProjectManage declaredProjectManage, | ||||
ConstructionPlanManage constructionPlanManage, | |||||
PrequalificationDeclaredProjectManage prequalificationDeclaredProjectManage, | PrequalificationDeclaredProjectManage prequalificationDeclaredProjectManage, | ||||
ReviewByProvincialDeptManage provincialDeptManage, | |||||
DeclaredRecordManage declaredRecordManage) { | DeclaredRecordManage declaredRecordManage) { | ||||
//重新项目申报 | //重新项目申报 | ||||
RESTART_PROCESS_MAP.put(ProjectStatus.UNDER_INTERNAL_AUDIT_NOT_PASS.getCode(), | RESTART_PROCESS_MAP.put(ProjectStatus.UNDER_INTERNAL_AUDIT_NOT_PASS.getCode(), | ||||
declaredProjectManage::reStartTheProcess); | declaredProjectManage::reStartTheProcess); | ||||
//建设方案 | |||||
RESTART_PROCESS_MAP.put(ProjectStatus.SCHEME_REVIEW_FAILED.getCode(), | |||||
constructionPlanManage::restartTheProcess); | |||||
//预审方案 | //预审方案 | ||||
RESTART_PROCESS_MAP.put(ProjectStatus.PREQUALIFICATION_FAILED.getCode(), | RESTART_PROCESS_MAP.put(ProjectStatus.PREQUALIFICATION_FAILED.getCode(), | ||||
prequalificationDeclaredProjectManage::restartTheProcess); | prequalificationDeclaredProjectManage::restartTheProcess); | ||||
//省级联审 | |||||
RESTART_PROCESS_MAP.put(ProjectStatus.THE_JOINT_REVIEW_OF_PROVINCIAL_DEPARTMENTS_FAILED.getCode(), | |||||
provincialDeptManage::restartTheProcess); | |||||
// 立项备案重新提交 | // 立项备案重新提交 | ||||
RESTART_PROCESS_MAP.put(ProjectStatus.DECLARED_APPROVED_RECORD_FAILED.getCode(), | RESTART_PROCESS_MAP.put(ProjectStatus.DECLARED_APPROVED_RECORD_FAILED.getCode(), | ||||
declaredRecordManage::restartDeclaredRecord); | declaredRecordManage::restartDeclaredRecord); | ||||
@@ -1,8 +1,5 @@ | |||||
package com.hz.pm.api.projectlib.controller; | package com.hz.pm.api.projectlib.controller; | ||||
import com.ningdatech.basic.model.PageVo; | |||||
import com.ningdatech.log.annotation.WebLog; | |||||
import com.hz.pm.api.projectlib.model.enumeration.ProjectLibFlagEnum; | |||||
import com.hz.pm.api.projectlib.manage.AnnualPlanLibManage; | import com.hz.pm.api.projectlib.manage.AnnualPlanLibManage; | ||||
import com.hz.pm.api.projectlib.model.dto.ProjectDTO; | import com.hz.pm.api.projectlib.model.dto.ProjectDTO; | ||||
import com.hz.pm.api.projectlib.model.req.ProjectApprovedReq; | import com.hz.pm.api.projectlib.model.req.ProjectApprovedReq; | ||||
@@ -10,11 +7,12 @@ import com.hz.pm.api.projectlib.model.req.ProjectIdReq; | |||||
import com.hz.pm.api.projectlib.model.req.ProjectListReq; | import com.hz.pm.api.projectlib.model.req.ProjectListReq; | ||||
import com.hz.pm.api.projectlib.model.req.StartProjectDeclareReq; | import com.hz.pm.api.projectlib.model.req.StartProjectDeclareReq; | ||||
import com.hz.pm.api.projectlib.model.vo.AnnualPlanListItemVO; | import com.hz.pm.api.projectlib.model.vo.AnnualPlanListItemVO; | ||||
import com.ningdatech.basic.model.PageVo; | |||||
import com.ningdatech.log.annotation.WebLog; | |||||
import io.swagger.annotations.Api; | import io.swagger.annotations.Api; | ||||
import io.swagger.annotations.ApiOperation; | import io.swagger.annotations.ApiOperation; | ||||
import lombok.RequiredArgsConstructor; | import lombok.RequiredArgsConstructor; | ||||
import org.springframework.web.bind.annotation.*; | import org.springframework.web.bind.annotation.*; | ||||
import org.springframework.web.multipart.MultipartFile; | |||||
import javax.servlet.http.HttpServletResponse; | import javax.servlet.http.HttpServletResponse; | ||||
import javax.validation.Valid; | import javax.validation.Valid; | ||||
@@ -62,13 +60,6 @@ public class AnnualPlanController { | |||||
annualPlanLibManage.suspendAnnualPlan(req); | annualPlanLibManage.suspendAnnualPlan(req); | ||||
} | } | ||||
@PostMapping("/importAnnualPlan") | |||||
@ApiOperation("导入年度计划") | |||||
@WebLog("导入年度计划") | |||||
public void importAnnualPlan(@RequestParam("importFlag") ProjectLibFlagEnum importFlag, MultipartFile file) { | |||||
annualPlanLibManage.importAnnualPlan(importFlag,file); | |||||
} | |||||
@PostMapping("/modify") | @PostMapping("/modify") | ||||
@ApiOperation("年度计划编辑") | @ApiOperation("年度计划编辑") | ||||
@WebLog("年度计划编辑") | @WebLog("年度计划编辑") | ||||
@@ -83,11 +74,4 @@ public class AnnualPlanController { | |||||
annualPlanLibManage.exportList(param, response); | annualPlanLibManage.exportList(param, response); | ||||
} | } | ||||
@PostMapping("/exportModifyList") | |||||
@ApiOperation("项目(增补)库编辑表导出") | |||||
@WebLog("项目(增补)库编辑表导出") | |||||
public void exportModifyList(@Valid @RequestBody ProjectListReq param, HttpServletResponse response) { | |||||
annualPlanLibManage.exportModifyList(param, response); | |||||
} | |||||
} | } |
@@ -1,15 +1,13 @@ | |||||
package com.hz.pm.api.projectlib.controller; | package com.hz.pm.api.projectlib.controller; | ||||
import com.ningdatech.basic.model.PageVo; | |||||
import com.ningdatech.log.annotation.WebLog; | |||||
import com.hz.pm.api.projectlib.manage.ApplicationManage; | import com.hz.pm.api.projectlib.manage.ApplicationManage; | ||||
import com.hz.pm.api.projectlib.model.dto.ApplicationAppCodeSaveDTO; | import com.hz.pm.api.projectlib.model.dto.ApplicationAppCodeSaveDTO; | ||||
import com.hz.pm.api.projectlib.model.req.ProjectListReq; | |||||
import com.hz.pm.api.projectlib.model.vo.ProjectDetailVO; | |||||
import com.ningdatech.log.annotation.WebLog; | |||||
import io.swagger.annotations.Api; | import io.swagger.annotations.Api; | ||||
import io.swagger.annotations.ApiOperation; | import io.swagger.annotations.ApiOperation; | ||||
import lombok.RequiredArgsConstructor; | import lombok.RequiredArgsConstructor; | ||||
import org.springframework.web.bind.annotation.*; | import org.springframework.web.bind.annotation.*; | ||||
import javax.validation.Valid; | import javax.validation.Valid; | ||||
/** | /** | ||||
@@ -40,9 +38,4 @@ public class ProjectApplicationController { | |||||
return applicationManage.saveAppCode(dto); | return applicationManage.saveAppCode(dto); | ||||
} | } | ||||
@GetMapping("/to-register-app-project-list") | |||||
@ApiOperation("待应用预注册的项目应用列表") | |||||
public PageVo<ProjectDetailVO> toRegisterAppProjectLibList(ProjectListReq req) { | |||||
return applicationManage.toRegisterAppProjectLibList(req); | |||||
} | |||||
} | } |
@@ -63,7 +63,7 @@ public class ProjectApprovalHandle extends AbstractProcessHandle { | |||||
|| ProjectStatus.DECLARED_APPROVED_TO_BE_RECORD.eq(status) | || ProjectStatus.DECLARED_APPROVED_TO_BE_RECORD.eq(status) | ||||
|| ProjectStatus.DECLARED_APPROVED_RECORD_AUDITING.eq(status)) { | || ProjectStatus.DECLARED_APPROVED_RECORD_AUDITING.eq(status)) { | ||||
// 根据建设方案评审通过的时间获取 | // 根据建设方案评审通过的时间获取 | ||||
final List<ProjectStateChangeEvent> events = Arrays.asList(ProjectStateChangeEvent.PLAN_REVIEW_PASS, | |||||
final List<ProjectStateChangeEvent> events = Arrays.asList( | |||||
ProjectStateChangeEvent.DECLARED_RECORD_SUBMIT, | ProjectStateChangeEvent.DECLARED_RECORD_SUBMIT, | ||||
ProjectStateChangeEvent.DECLARED_RECORD_RESUBMIT); | ProjectStateChangeEvent.DECLARED_RECORD_RESUBMIT); | ||||
ProjectStatusChange projectStatusChange = projectStatusChangeService.getLastOne(projectIds, events); | ProjectStatusChange projectStatusChange = projectStatusChangeService.getLastOne(projectIds, events); | ||||
@@ -73,7 +73,7 @@ public class ProjectApprovalHandle extends AbstractProcessHandle { | |||||
detail.setStepStatus(StepStatusEnum.ON_GOING); | detail.setStepStatus(StepStatusEnum.ON_GOING); | ||||
} else { | } else { | ||||
// 取 状态机 改变状态时间 | // 取 状态机 改变状态时间 | ||||
final List<ProjectStateChangeEvent> events = Arrays.asList(ProjectStateChangeEvent.PLAN_REVIEW_PASS, | |||||
final List<ProjectStateChangeEvent> events = Arrays.asList( | |||||
ProjectStateChangeEvent.DECLARED_RECORD_FAILED, | ProjectStateChangeEvent.DECLARED_RECORD_FAILED, | ||||
ProjectStateChangeEvent.DECLARED_RECORD_PASS); | ProjectStateChangeEvent.DECLARED_RECORD_PASS); | ||||
ProjectStatusChange projectStatusChange = projectStatusChangeService.getLastOne(projectIds, events); | ProjectStatusChange projectStatusChange = projectStatusChangeService.getLastOne(projectIds, events); | ||||
@@ -1,18 +1,8 @@ | |||||
package com.hz.pm.api.projectlib.manage; | package com.hz.pm.api.projectlib.manage; | ||||
import cn.afterturn.easypoi.excel.ExcelExportUtil; | |||||
import cn.afterturn.easypoi.excel.ExcelImportUtil; | |||||
import cn.afterturn.easypoi.excel.entity.ImportParams; | |||||
import cn.afterturn.easypoi.excel.entity.TemplateExportParams; | |||||
import cn.hutool.core.bean.BeanUtil; | import cn.hutool.core.bean.BeanUtil; | ||||
import cn.hutool.core.collection.CollUtil; | |||||
import cn.hutool.poi.excel.ExcelUtil; | |||||
import com.alibaba.fastjson.JSON; | |||||
import com.alibaba.fastjson.JSONObject; | |||||
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; | import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; | ||||
import com.baomidou.mybatisplus.core.toolkit.Assert; | |||||
import com.baomidou.mybatisplus.extension.plugins.pagination.Page; | import com.baomidou.mybatisplus.extension.plugins.pagination.Page; | ||||
import com.google.common.collect.Lists; | |||||
import com.hz.pm.api.common.enumeration.CommonEnum; | import com.hz.pm.api.common.enumeration.CommonEnum; | ||||
import com.hz.pm.api.common.helper.UserInfoHelper; | import com.hz.pm.api.common.helper.UserInfoHelper; | ||||
import com.hz.pm.api.common.model.constant.CommonConst; | import com.hz.pm.api.common.model.constant.CommonConst; | ||||
@@ -23,13 +13,8 @@ import com.hz.pm.api.common.util.ExcelDownUtil; | |||||
import com.hz.pm.api.datascope.model.DataScopeDTO; | import com.hz.pm.api.datascope.model.DataScopeDTO; | ||||
import com.hz.pm.api.datascope.utils.DataScopeUtil; | import com.hz.pm.api.datascope.utils.DataScopeUtil; | ||||
import com.hz.pm.api.projectlib.helper.ProjectHelper; | import com.hz.pm.api.projectlib.helper.ProjectHelper; | ||||
import com.hz.pm.api.projectlib.model.dto.AnnualLibExportDTO; | |||||
import com.hz.pm.api.projectlib.model.dto.AnnualLibImportDTO; | |||||
import com.hz.pm.api.projectlib.model.dto.ProjectDTO; | import com.hz.pm.api.projectlib.model.dto.ProjectDTO; | ||||
import com.hz.pm.api.projectlib.model.entity.Project; | import com.hz.pm.api.projectlib.model.entity.Project; | ||||
import com.hz.pm.api.projectlib.model.entity.ProjectRenewalFundDeclaration; | |||||
import com.hz.pm.api.projectlib.model.enumeration.ProjectLibFlagEnum; | |||||
import com.hz.pm.api.projectlib.model.enumeration.ProjectRenewalApprovalStatusEnum; | |||||
import com.hz.pm.api.projectlib.model.enumeration.status.ProjectStatus; | import com.hz.pm.api.projectlib.model.enumeration.status.ProjectStatus; | ||||
import com.hz.pm.api.projectlib.model.req.ProjectApprovedReq; | import com.hz.pm.api.projectlib.model.req.ProjectApprovedReq; | ||||
import com.hz.pm.api.projectlib.model.req.ProjectIdReq; | import com.hz.pm.api.projectlib.model.req.ProjectIdReq; | ||||
@@ -46,23 +31,14 @@ import com.hz.pm.api.user.util.LoginUserUtil; | |||||
import com.ningdatech.basic.exception.BizException; | import com.ningdatech.basic.exception.BizException; | ||||
import com.ningdatech.basic.model.PageVo; | import com.ningdatech.basic.model.PageVo; | ||||
import com.ningdatech.basic.util.CollUtils; | import com.ningdatech.basic.util.CollUtils; | ||||
import com.ningdatech.basic.util.StrPool; | |||||
import lombok.AllArgsConstructor; | import lombok.AllArgsConstructor; | ||||
import lombok.extern.slf4j.Slf4j; | import lombok.extern.slf4j.Slf4j; | ||||
import org.apache.commons.collections4.CollectionUtils; | |||||
import org.apache.poi.ss.usermodel.Workbook; | |||||
import org.springframework.beans.BeanUtils; | |||||
import org.springframework.stereotype.Component; | import org.springframework.stereotype.Component; | ||||
import org.springframework.transaction.annotation.Transactional; | import org.springframework.transaction.annotation.Transactional; | ||||
import org.springframework.web.multipart.MultipartFile; | |||||
import javax.servlet.http.HttpServletResponse; | import javax.servlet.http.HttpServletResponse; | ||||
import java.io.*; | |||||
import java.net.URLEncoder; | |||||
import java.nio.charset.StandardCharsets; | |||||
import java.time.LocalDateTime; | import java.time.LocalDateTime; | ||||
import java.util.*; | import java.util.*; | ||||
import java.util.stream.Collectors; | |||||
import static com.hz.pm.api.projectlib.model.enumeration.status.ProjectStatus.*; | import static com.hz.pm.api.projectlib.model.enumeration.status.ProjectStatus.*; | ||||
@@ -90,7 +66,7 @@ public class AnnualPlanLibManage { | |||||
* 年度计划查询状态 | * 年度计划查询状态 | ||||
*/ | */ | ||||
private static final List<ProjectStatus> ANNUAL_PLAN_LIST_STATUS = | private static final List<ProjectStatus> ANNUAL_PLAN_LIST_STATUS = | ||||
Arrays.asList(IN_THE_ANNUAL_PLAN, SCHEME_UNDER_REVIEW, SCHEME_REVIEW_FAILED, TO_BE_APPROVED, TO_BE_DECLARED, | |||||
Arrays.asList(IN_THE_ANNUAL_PLAN, TO_BE_APPROVED, TO_BE_DECLARED, | |||||
PLAN_TO_BE_DECLARED, PENDING_PREQUALIFICATION_CHOICE, PROJECT_APPROVED, TO_BE_PURCHASED, UNDER_CONSTRUCTION, | PLAN_TO_BE_DECLARED, PENDING_PREQUALIFICATION_CHOICE, PROJECT_APPROVED, TO_BE_PURCHASED, UNDER_CONSTRUCTION, | ||||
ON_PILOT_RUNNING, ARCHIVED); | ON_PILOT_RUNNING, ARCHIVED); | ||||
@@ -277,223 +253,4 @@ public class AnnualPlanLibManage { | |||||
} | } | ||||
@Transactional(rollbackFor = Exception.class) | |||||
public void importAnnualPlan(ProjectLibFlagEnum importFlag, MultipartFile file) { | |||||
Long userId = LoginUserUtil.getUserId(); | |||||
ImportParams params = new ImportParams(); | |||||
// 标题行数 | |||||
params.setTitleRows(2); | |||||
// 从第几行开始,因为第一、二个大标题被上面的参数给占了,所以不是5 | |||||
params.setHeadRows(3); | |||||
// 表格数量 | |||||
params.setSheetNum(2); | |||||
List<AnnualLibImportDTO> list = null; | |||||
try { | |||||
list = ExcelImportUtil.importExcel(file.getInputStream(), AnnualLibImportDTO.class, params); | |||||
} catch (Exception e) { | |||||
throw new BizException(e.getMessage()); | |||||
} | |||||
// 筛选出导入的新建项目 | |||||
List<AnnualLibImportDTO> newList = | |||||
list.stream().filter(d -> CommonConst.NEW_CONSTRUCTION.equals(d.getIsFirst())).collect(Collectors.toList()); | |||||
List<Project> projectList = newList.stream().map(n -> { | |||||
Project project = new Project(); | |||||
assemblyProjectInfo(n, project); | |||||
// 根据传入标志判断是否临时增补 | |||||
if (ProjectLibFlagEnum.ANNUAL_PLAN.equals(importFlag)) { | |||||
project.setIsTemporaryAugment(CommonEnum.NO.getCode()); | |||||
} else if (ProjectLibFlagEnum.ANNUAL_PLAN_SUPPLEMENT.equals(importFlag)) { | |||||
project.setIsTemporaryAugment(CommonEnum.YES.getCode()); | |||||
} | |||||
project.setCreateBy(userId); | |||||
project.setUpdateBy(userId); | |||||
project.setCreateOn(LocalDateTime.now()); | |||||
project.setUpdateOn(LocalDateTime.now()); | |||||
return project; | |||||
}).collect(Collectors.toList()); | |||||
// 保存到项目库中 | |||||
projectService.saveOrUpdateBatch(projectList); | |||||
// 筛选出导入的续建项目 | |||||
List<AnnualLibImportDTO> continuedList = list.stream() | |||||
.filter(d -> CommonConst.CONTINUED_CONSTRUCTION.equals(d.getIsFirst())).collect(Collectors.toList()); | |||||
List<ProjectRenewalFundDeclaration> renewalFundDeclarationList = continuedList.stream().map(c -> { | |||||
ProjectRenewalFundDeclaration renewalFundDeclaration = new ProjectRenewalFundDeclaration(); | |||||
BeanUtils.copyProperties(c, renewalFundDeclaration); | |||||
renewalFundDeclaration.setAnnualPaymentAmount(c.getAnnualPlanAmount()); | |||||
renewalFundDeclaration.setOtherAmount(c.getDeclareOtherAmount()); | |||||
renewalFundDeclaration.setApprovalStatus(ProjectRenewalApprovalStatusEnum.PENDING.name()); | |||||
renewalFundDeclaration.setCreateOn(LocalDateTime.now()); | |||||
renewalFundDeclaration.setUpdateOn(LocalDateTime.now()); | |||||
return renewalFundDeclaration; | |||||
}).collect(Collectors.toList()); | |||||
// 保存到续建项目资金库中 | |||||
projectRenewalFundDeclarationService.saveBatch(renewalFundDeclarationList); | |||||
} | |||||
private void assemblyProjectInfo(AnnualLibImportDTO data, Project project) { | |||||
Long projectId = data.getProjectId(); | |||||
// 从项目库中先查询出对应的项目ID的项目 | |||||
Project projectInfo = projectService.getById(projectId); | |||||
if (Objects.nonNull(projectInfo)) { | |||||
BeanUtils.copyProperties(projectInfo, project); | |||||
} else { | |||||
// 新增的年度计划库项目 | |||||
throw new BizException("项目库中不存在项目ID为:" + projectId + "的项目"); | |||||
} | |||||
project.setId(data.getProjectId()); | |||||
project.setProjectName(data.getProjectName()); | |||||
project.setProjectIntroduction(data.getProjectIntroduction()); | |||||
// 建设依据忽略 | |||||
project.setIsFirst(CommonConst.NEW_CONSTRUCTION.equals(data.getIsFirst()) ? 1 : 0); | |||||
String[] dataArr = data.getBuildCycle().split(CommonConst.ZHI); | |||||
if (CollectionUtils.isEmpty(Arrays.asList(dataArr))) { | |||||
throw new BizException("项目ID为:" + data.getProjectId() + "的建设起止年限格式不正确,请按照xx年xx月至xx年xx月的格式输入!"); | |||||
} | |||||
project.setBeginTime(dataArr[0].trim()); | |||||
project.setEndTime(dataArr[1].trim()); | |||||
project.setDeclareAmount(data.getDeclaredAmount()); | |||||
// TODO 年度计划 | |||||
// project.setAnnualPlanAmount(data.getAnnualPlanAmount()); | |||||
project.setDeclareHaveAmount(data.getDeclareHaveAmount()); | |||||
project.setDeclareGovOwnFinanceAmount(data.getDeclareGovOwnFinanceAmount()); | |||||
project.setDeclareGovSuperiorFinanceAmount(data.getDeclareGovSuperiorFinanceAmount()); | |||||
project.setDeclareBankLendingAmount(data.getDeclareBankLendingAmount()); | |||||
project.setDeclareOtherAmount(data.getDeclareOtherAmount()); | |||||
project.setEngineeringSpeedOne(data.getFirstQuarter()); | |||||
project.setEngineeringSpeedTwo(data.getSecondQuarter()); | |||||
project.setEngineeringSpeedThree(data.getThirdQuarter()); | |||||
project.setEngineeringSpeedFour(data.getFourthQuarter()); | |||||
project.setBuildOrgName(data.getBuildUnitName()); | |||||
project.setContactName(data.getContactName()); | |||||
project.setResponsibleMan(data.getResponsibleMan()); | |||||
project.setProjectRemarks(data.getProjectRemarks()); | |||||
} | |||||
public void exportModifyList(ProjectListReq param, HttpServletResponse response) { | |||||
int year = LocalDateTime.now().getYear(); | |||||
Integer isTemporaryAugment = param.getIsTemporaryAugment(); | |||||
Assert.notNull(isTemporaryAugment, "请传入是否临时增补标志"); | |||||
param.setIsTemporaryAugment(isTemporaryAugment); | |||||
String fileName; | |||||
// 设置excel的文件名称和是否增补 | |||||
if (CommonEnum.NO.getCode().equals(isTemporaryAugment)) { | |||||
fileName = "杭州市" + year + "年数字化项目年度计划库编辑表"; | |||||
} else if (CommonEnum.YES.getCode().equals(isTemporaryAugment)) { | |||||
fileName = "杭州市" + year + "年数字化项目年度计划增补库编辑表"; | |||||
} else { | |||||
throw BizException.wrap("是否临时增补标志无效"); | |||||
} | |||||
LambdaQueryWrapper<Project> query = ProjectHelper.projectQuery(param); | |||||
query.eq(Project::getNewest, Boolean.TRUE); | |||||
query.eq(Project::getIsTemporaryAugment, isTemporaryAugment); | |||||
query.orderByDesc(Project::getAnnualPlanAddTime); | |||||
query.in(Project::getStatus, CollUtils.fieldList(ANNUAL_PLAN_LIST_STATUS, ProjectStatus::getCode)); | |||||
// 数据权限 | |||||
if (!buildProjectLibPermission(query)) { | |||||
throw BizException.wrap("暂无年度计划导出权限"); | |||||
} | |||||
List<Project> projects = projectService.list(query); | |||||
List<AnnualLibExportDTO> list = projects.stream().map(p -> { | |||||
AnnualLibExportDTO dto = new AnnualLibExportDTO(); | |||||
BeanUtils.copyProperties(p, dto); | |||||
String beginTime = p.getBeginTime(); | |||||
String begin = beginTime.replace(StrPool.DASH, CommonConst.YEAR); | |||||
begin = begin + CommonConst.MONTH; | |||||
String endTime = p.getEndTime(); | |||||
String end = endTime.replace(StrPool.DASH, CommonConst.YEAR); | |||||
end = end + CommonConst.MONTH; | |||||
String buildCycle = begin + CommonConst.ZHI + end; | |||||
dto.setBuildCycle(buildCycle); | |||||
dto.setProjectId(p.getId()); | |||||
dto.setDeclaredAmount(p.getDeclareAmount()); | |||||
dto.setBuildUnitName(p.getBuildOrgName()); | |||||
String buildBasis = p.getBuildBasis(); | |||||
List<JSONObject> fileArray = JSON.parseArray(buildBasis, JSONObject.class); | |||||
List<String> nameList = CollUtils.fieldList(fileArray, w -> w.getString(CommonConst.TITLE) | |||||
+ StrPool.LEFT_BRACKET + w.getString(CommonConst.BASIS_FILE_NAME) + StrPool.RIGHT_BRACKET); | |||||
String basis = String.join(StrPool.COMMA, nameList); | |||||
dto.setBuildBasis(basis); | |||||
if (CommonEnum.YES.getCode().equals(p.getIsFirst())) { | |||||
dto.setIsFirst(CommonConst.NEW_CONSTRUCTION); | |||||
} else if (CommonEnum.NO.getCode().equals(p.getIsFirst())) { | |||||
dto.setIsFirst(CommonConst.CONTINUED_CONSTRUCTION); | |||||
} | |||||
dto.setFirstQuarter(p.getEngineeringSpeedOne()); | |||||
dto.setSecondQuarter(p.getEngineeringSpeedTwo()); | |||||
dto.setThirdQuarter(p.getEngineeringSpeedThree()); | |||||
dto.setFourthQuarter(p.getEngineeringSpeedFour()); | |||||
return dto; | |||||
}).collect(Collectors.toList()); | |||||
int count = 0; | |||||
for (AnnualLibExportDTO annualLibExportDTO : list) { | |||||
count++; | |||||
annualLibExportDTO.setSerialNumber(count); | |||||
} | |||||
// 获取本地目录的年度计划编辑表Excel模板 | |||||
File directory = new File(""); | |||||
String templateName = "丽水市" + year + "年数字化项目年度计划编辑表"; | |||||
String templatePath = | |||||
directory.getAbsolutePath() + File.separator + "template" + File.separator + templateName + ".xls"; | |||||
TemplateExportParams temp = new TemplateExportParams(templatePath); | |||||
temp.setSheetNum(new Integer[]{0, 1}); | |||||
temp.setSheetName(new String[]{"实施类(新建)", "实施类(续建)"}); | |||||
Map<String, Object> map = new HashMap<>(4); | |||||
map.put("mapList", list); | |||||
map.put("mapList1", Lists.newArrayList()); | |||||
Workbook workbook = ExcelExportUtil.exportExcel(temp, map); | |||||
if (CollUtil.isEmpty(list)) { | |||||
// 输出空模板 | |||||
// 获取本地目录的年度计划编辑表空Excel模板 | |||||
String emptyTemplate = "丽水市" + year + "年数字化项目年度计划编辑表(空)"; | |||||
String emptyTemplatePath = "template" + File.separator + emptyTemplate + ".xls"; | |||||
try (InputStream templateInputStream = this.getClass().getClassLoader().getResourceAsStream(emptyTemplatePath); | |||||
OutputStream outputStream = response.getOutputStream()) { | |||||
if (templateInputStream == null) { | |||||
throw new BizException("读取模板失败!"); | |||||
} | |||||
// 设置要下载的文件的名称 | |||||
response.setHeader("Content-disposition", "attachment;fileName=" + new String(templateName.getBytes(StandardCharsets.UTF_8), StandardCharsets.ISO_8859_1)); | |||||
// 设置文件的MIME类型 | |||||
response.setContentType("application/vnd.ms-excel;charset=UTF-8"); | |||||
byte[] b = new byte[2048]; | |||||
int len; | |||||
while ((len = templateInputStream.read(b)) != -1) { | |||||
outputStream.write(b, 0, len); | |||||
} | |||||
outputStream.flush(); | |||||
} catch (IOException e) { | |||||
throw new BizException("读取模板失败!"); | |||||
} | |||||
return; | |||||
} | |||||
if (workbook == null) { | |||||
throw new BizException("读取编辑表模板失败!"); | |||||
} | |||||
// 重置响应对象 | |||||
response.reset(); | |||||
try { | |||||
response.setHeader("Content-disposition", | |||||
"attachment;filename*=utf-8''" + URLEncoder.encode(Objects.requireNonNull(fileName), "UTF-8") + ".xls"); | |||||
} catch (UnsupportedEncodingException e) { | |||||
log.error("年度计划导出异常:", e); | |||||
throw BizException.wrap("年度计划导出异常"); | |||||
} | |||||
response.setContentType(ExcelUtil.XLS_CONTENT_TYPE); | |||||
response.setHeader("Pragma", "no-cache"); | |||||
response.setHeader("Cache-Control", "no-cache"); | |||||
response.setDateHeader("Expires", 0); | |||||
// 写出数据输出流到页面 | |||||
try (OutputStream output = response.getOutputStream(); | |||||
BufferedOutputStream bos = new BufferedOutputStream(output)) { | |||||
workbook.write(bos); | |||||
bos.flush(); | |||||
} catch (IOException e) { | |||||
log.error("年度计划导出异常:", e); | |||||
throw BizException.wrap("年度计划导出异常"); | |||||
} | |||||
} | |||||
} | } |
@@ -1,29 +1,19 @@ | |||||
package com.hz.pm.api.projectlib.manage; | package com.hz.pm.api.projectlib.manage; | ||||
import cn.hutool.core.bean.BeanUtil; | |||||
import cn.hutool.core.collection.CollUtil; | import cn.hutool.core.collection.CollUtil; | ||||
import cn.hutool.core.lang.Assert; | import cn.hutool.core.lang.Assert; | ||||
import com.alibaba.fastjson.JSON; | import com.alibaba.fastjson.JSON; | ||||
import com.alibaba.fastjson.JSONArray; | import com.alibaba.fastjson.JSONArray; | ||||
import com.alibaba.fastjson.JSONObject; | import com.alibaba.fastjson.JSONObject; | ||||
import com.baomidou.mybatisplus.core.toolkit.Wrappers; | |||||
import com.baomidou.mybatisplus.extension.plugins.pagination.Page; | |||||
import com.hz.pm.api.common.model.constant.BizConst; | import com.hz.pm.api.common.model.constant.BizConst; | ||||
import com.hz.pm.api.common.util.HmacAuthUtil; | import com.hz.pm.api.common.util.HmacAuthUtil; | ||||
import com.hz.pm.api.projectlib.model.dto.ApplicationAppCodeSaveDTO; | import com.hz.pm.api.projectlib.model.dto.ApplicationAppCodeSaveDTO; | ||||
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.entity.ProjectApplication; | ||||
import com.hz.pm.api.projectlib.model.enumeration.status.ProjectStatus; | |||||
import com.hz.pm.api.projectlib.model.req.ProjectListReq; | |||||
import com.hz.pm.api.projectlib.model.vo.ProjectApplicationVO; | |||||
import com.hz.pm.api.projectlib.model.vo.ProjectDetailVO; | |||||
import com.hz.pm.api.projectlib.service.IProjectApplicationService; | import com.hz.pm.api.projectlib.service.IProjectApplicationService; | ||||
import com.hz.pm.api.projectlib.service.IProjectService; | import com.hz.pm.api.projectlib.service.IProjectService; | ||||
import com.hz.pm.api.user.security.model.UserInfoDetails; | |||||
import com.hz.pm.api.user.util.LoginUserUtil; | import com.hz.pm.api.user.util.LoginUserUtil; | ||||
import com.ningdatech.basic.exception.BizException; | import com.ningdatech.basic.exception.BizException; | ||||
import com.ningdatech.basic.model.ApiResponse; | import com.ningdatech.basic.model.ApiResponse; | ||||
import com.ningdatech.basic.model.PageVo; | |||||
import lombok.RequiredArgsConstructor; | import lombok.RequiredArgsConstructor; | ||||
import lombok.extern.slf4j.Slf4j; | import lombok.extern.slf4j.Slf4j; | ||||
import org.apache.commons.lang3.StringUtils; | import org.apache.commons.lang3.StringUtils; | ||||
@@ -34,11 +24,8 @@ import org.springframework.util.MultiValueMap; | |||||
import org.springframework.web.client.RestTemplate; | import org.springframework.web.client.RestTemplate; | ||||
import java.time.LocalDateTime; | import java.time.LocalDateTime; | ||||
import java.util.Collections; | |||||
import java.util.List; | |||||
import java.util.Map; | import java.util.Map; | ||||
import java.util.Objects; | import java.util.Objects; | ||||
import java.util.stream.Collectors; | |||||
/** | /** | ||||
* <p> | * <p> | ||||
@@ -133,48 +120,4 @@ public class ApplicationManage { | |||||
throw new BizException("获取报告失败!"); | throw new BizException("获取报告失败!"); | ||||
} | } | ||||
/** | |||||
* 查询 待注册的 | |||||
* | |||||
* @param req | |||||
* @return | |||||
*/ | |||||
public PageVo<ProjectDetailVO> toRegisterAppProjectLibList(ProjectListReq req) { | |||||
UserInfoDetails user = LoginUserUtil.loginUserDetail(); | |||||
//建设单位 就是当前人的单位 | |||||
Page<Project> page = req.page(); | |||||
projectService.page(page, Wrappers.lambdaQuery(Project.class) | |||||
.eq(Project::getStage, ProjectStatus.NOT_APPROVED.getCode()) | |||||
.eq(Project::getStatus, ProjectStatus.TO_BE_APP_REGISTER.getCode()) | |||||
.eq(Project::getBuildOrgCode, user.getMhUnitIdStr())); | |||||
if (CollUtil.isEmpty(page.getRecords())) { | |||||
return PageVo.empty(); | |||||
} | |||||
List<String> projectCodes = page.getRecords().stream().map(Project::getProjectCode).collect(Collectors.toList()); | |||||
//要去查询应用 此阶段 必定是 建设方案后的 所以直接查 建设方案的应用 | |||||
List<ProjectApplication> apps = applicationService.list(Wrappers.lambdaQuery(ProjectApplication.class) | |||||
.in(ProjectApplication::getProjectCode, projectCodes) | |||||
.eq(ProjectApplication::getIsConstruct, Boolean.TRUE)); | |||||
Map<String, List<ProjectApplication>> appMap = apps.stream().collect(Collectors.groupingBy(ProjectApplication::getProjectCode)); | |||||
List<ProjectDetailVO> res = page.getRecords().stream().map(p -> { | |||||
ProjectDetailVO vo = BeanUtil.copyProperties(p, ProjectDetailVO.class); | |||||
if (appMap.containsKey(p.getProjectCode())) { | |||||
List<ProjectApplication> projectApplications = appMap.get(p.getProjectCode()); | |||||
vo.setProjectApplications(convert(projectApplications)); | |||||
} | |||||
return vo; | |||||
}).collect(Collectors.toList()); | |||||
return PageVo.of(res, page.getTotal()); | |||||
} | |||||
private List<ProjectApplicationVO> convert(List<ProjectApplication> projectApplications) { | |||||
if (CollUtil.isNotEmpty(projectApplications)) { | |||||
return projectApplications.stream() | |||||
.map(a -> BeanUtil.copyProperties(a, ProjectApplicationVO.class)) | |||||
.collect(Collectors.toList()); | |||||
} | |||||
return Collections.emptyList(); | |||||
} | |||||
} | } |
@@ -8,7 +8,6 @@ import cn.hutool.core.util.NumberUtil; | |||||
import com.alibaba.fastjson.JSONObject; | import com.alibaba.fastjson.JSONObject; | ||||
import com.baomidou.mybatisplus.core.conditions.Wrapper; | import com.baomidou.mybatisplus.core.conditions.Wrapper; | ||||
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; | import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; | ||||
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; | |||||
import com.baomidou.mybatisplus.core.toolkit.Wrappers; | import com.baomidou.mybatisplus.core.toolkit.Wrappers; | ||||
import com.baomidou.mybatisplus.extension.plugins.pagination.Page; | import com.baomidou.mybatisplus.extension.plugins.pagination.Page; | ||||
import com.github.xiaoymin.knife4j.core.util.StrUtil; | import com.github.xiaoymin.knife4j.core.util.StrUtil; | ||||
@@ -851,36 +850,7 @@ public class ProjectLibManage { | |||||
projectInstService.save(projectInst); | projectInstService.save(projectInst); | ||||
return project; | return project; | ||||
} | } | ||||
/** | |||||
* 建设方案申报项目时 保存项目信息和其它相关联的信息 | |||||
* | |||||
* @param projectDto \ | |||||
* @param instanceId \ | |||||
* @param userId \ | |||||
* @param oldProject \ | |||||
* @return \ | |||||
*/ | |||||
public Project saveConstructProjectInDeclared(ProjectDTO projectDto, String instanceId, | |||||
Long userId, Project oldProject) { | |||||
Project project = saveConstructProjectNewVersion(projectDto, instanceId, userId, oldProject); | |||||
// 将旧的项目状态、阶段置为null,防止项目还会出现在待申报列表 | |||||
LambdaUpdateWrapper<Project> updateWrapper = Wrappers.lambdaUpdate(Project.class); | |||||
updateWrapper.set(Project::getStage, null) | |||||
.set(Project::getStatus, null) | |||||
.eq(Project::getId, oldProject.getId()); | |||||
projectService.update(updateWrapper); | |||||
//保存项目和实例的关系 | |||||
ProjectInst projectInst = new ProjectInst(); | |||||
projectInst.setProjectId(project.getId()); | |||||
projectInst.setInstCode(instanceId); | |||||
projectInst.setInstType(ProjectProcessStageEnum.CONSTRUCTION_PROJECT_APPROVAL_PROCESS); | |||||
projectInstService.save(projectInst); | |||||
return project; | |||||
} | |||||
/** | /** | ||||
* 申报新项目时 保存项目信息和其它相关联的信息 | * 申报新项目时 保存项目信息和其它相关联的信息 | ||||
* | * | ||||
@@ -950,68 +920,6 @@ public class ProjectLibManage { | |||||
} | } | ||||
/** | /** | ||||
* 建设方案申报项目时 保存项目信息和其它相关联的信息 | |||||
* | |||||
* @param projectDto \ | |||||
* @param instanceId \ | |||||
* @param userId \ | |||||
* @param oldProject \ | |||||
* @return \ | |||||
*/ | |||||
public Project saveConstructProjectNewVersion(ProjectDTO projectDto, String instanceId, | |||||
Long userId, Project oldProject) { | |||||
//流程启动之后 入库项目 重要业务信息 用于列表查询 展示 | |||||
try { | |||||
Project project; | |||||
//为空 代表是新申报的 | |||||
if (Objects.isNull(projectDto.getId())) { | |||||
project = new Project(); | |||||
BeanUtils.copyProperties(projectDto, project); | |||||
// 被撤回重新申报的项目,项目ID要置空 | |||||
project.setId(null); | |||||
project.setCreateOn(LocalDateTime.now()); | |||||
project.setUpdateOn(LocalDateTime.now()); | |||||
project.setStage(ProjectStatus.NOT_APPROVED.getCode()); | |||||
project.setStatus(ProjectStatus.SCHEME_UNDER_REVIEW.getCode()); | |||||
project.setInstCode(instanceId); | |||||
project.setSponsor(String.valueOf(userId)); | |||||
// 项目编号不变,版本号加1 | |||||
project.setProjectCode(oldProject.getProjectCode()); | |||||
project.setVersion(oldProject.getVersion() + 1); | |||||
// 标记为建设方案申报 | |||||
project.setIsConstruct(Boolean.TRUE); | |||||
project.setIsBackReject(Boolean.FALSE); | |||||
// 保存初步方案项目ID | |||||
if (Boolean.TRUE.equals(oldProject.getIsConstruct())) { | |||||
// 重新提交 | |||||
project.setPrePlanProjectId(oldProject.getPrePlanProjectId()); | |||||
} else { | |||||
project.setPrePlanProjectId(oldProject.getId()); | |||||
} | |||||
if (projectService.save(project)) { | |||||
saveApplication(projectDto, project, Boolean.TRUE); | |||||
// 将旧的项目版本置为不是最新 | |||||
projectService.reverseNewest(project.getProjectCode(), project.getId()); | |||||
} | |||||
} else { | |||||
//否则是被驳回,重新提交的 新生成一个新版本的项目 | |||||
project = newProjectWithVersion(projectDto, Boolean.TRUE); | |||||
if (Objects.nonNull(project)) { | |||||
project.setInstCode(instanceId); | |||||
project.setSponsor(String.valueOf(userId)); | |||||
projectService.updateById(project); | |||||
} | |||||
} | |||||
return project; | |||||
} catch (Exception e) { | |||||
log.error("项目信息入库错误 " + e); | |||||
throw new BusinessException("项目信息入库错误 :" + e); | |||||
} | |||||
} | |||||
/** | |||||
* 在其它项目阶段 保存项目信息和其它相关联的信息 | * 在其它项目阶段 保存项目信息和其它相关联的信息 | ||||
* | * | ||||
* @param projectDto \ | * @param projectDto \ | ||||
@@ -1,102 +0,0 @@ | |||||
package com.hz.pm.api.projectlib.model.dto; | |||||
import java.math.BigDecimal; | |||||
import javax.validation.constraints.NotBlank; | |||||
import javax.validation.constraints.NotNull; | |||||
import cn.afterturn.easypoi.excel.annotation.Excel; | |||||
import lombok.Data; | |||||
/** | |||||
* <p> | |||||
* AnnualLibImportDTO | |||||
* </p> | |||||
* | |||||
* @author WendyYang | |||||
* @since 13:46 2023/2/13 | |||||
*/ | |||||
@Data | |||||
public class AnnualLibExportDTO { | |||||
@NotNull(message = "年度投资额不能为空") | |||||
@Excel(name = "年度投资额",groupName = "2023年计划") | |||||
private BigDecimal annualPlanAmount; | |||||
@NotNull(message = "自由资金不能为空") | |||||
@Excel(name = "自有资金",groupName = "资金来源") | |||||
private BigDecimal declareHaveAmount; | |||||
@Excel(name = "政府投资-本级财政资金") | |||||
@NotNull(message = "政府投资-本级财政不能为空") | |||||
private BigDecimal declareGovOwnFinanceAmount; | |||||
@Excel(name = "政府投资-上级补助资金") | |||||
@NotNull(message = "政府投资-上级补助资金不能为空") | |||||
private BigDecimal declareGovSuperiorFinanceAmount; | |||||
@Excel(name = "银行贷款") | |||||
@NotNull(message = "银行贷款不能为空") | |||||
private BigDecimal declareBankLendingAmount; | |||||
@Excel(name = "其他") | |||||
@NotNull(message = "其他不能为空") | |||||
private BigDecimal declareOtherAmount; | |||||
@Excel(name = "一季度",groupName = "进度和支付计划") | |||||
@NotBlank(message = "一季度不能为空") | |||||
private String firstQuarter; | |||||
@Excel(name = "二季度") | |||||
@NotBlank(message = "二季度不能为空") | |||||
private String secondQuarter; | |||||
@Excel(name = "三季度") | |||||
@NotBlank(message = "三季度不能为空") | |||||
private String thirdQuarter; | |||||
@Excel(name = "四季度") | |||||
@NotBlank(message = "四季度不能为空") | |||||
private String fourthQuarter; | |||||
@NotNull(message = "序号不能为空") | |||||
@Excel(name = "序号") | |||||
private Integer serialNumber; | |||||
@Excel(name = "项目id") | |||||
@NotNull(message = "项目ID不能为空") | |||||
private Long projectId; | |||||
@Excel(name = "项目名称") | |||||
@NotBlank(message = "项目名称不能为空") | |||||
private String projectName; | |||||
@NotBlank(message = "建设内容不能为空") | |||||
@Excel(name = "建设内容") | |||||
private String projectIntroduction; | |||||
@NotBlank(message = "建设依据不能为空") | |||||
@Excel(name = "建设依据") | |||||
private String buildBasis; | |||||
@Excel(name = "建设性质") | |||||
@NotBlank(message = "建设性质不能为空") | |||||
private String isFirst; | |||||
@Excel(name = "建设起止年限(填写到月)") | |||||
@NotBlank(message = "建设起止年限不能为空") | |||||
private String buildCycle; | |||||
@NotBlank(message = "总投资不能为空") | |||||
@Excel(name = "总投资") | |||||
private BigDecimal declaredAmount; | |||||
@Excel(name = "建设单位") | |||||
@NotBlank(message = "建设单位不能为空") | |||||
private String buildUnitName; | |||||
@Excel(name = "项目联系人") | |||||
@NotBlank(message = "项目联系人不能为空") | |||||
private String contactName; | |||||
@Excel(name = "项目分管领导") | |||||
@NotBlank(message = "项目分管领导不能为空") | |||||
private String responsibleMan; | |||||
@Excel(name = "备注") | |||||
private String projectRemarks; | |||||
} |
@@ -1,121 +0,0 @@ | |||||
package com.hz.pm.api.projectlib.model.dto; | |||||
import cn.afterturn.easypoi.excel.annotation.Excel; | |||||
import lombok.Data; | |||||
import javax.validation.constraints.NotBlank; | |||||
import javax.validation.constraints.NotNull; | |||||
import java.math.BigDecimal; | |||||
/** | |||||
* <p> | |||||
* AnnualLibImportDTO | |||||
* </p> | |||||
* | |||||
* @author WendyYang | |||||
* @since 13:46 2023/2/13 | |||||
*/ | |||||
@Data | |||||
public class AnnualLibImportDTO { | |||||
@Excel(name = "项目进展",groupName = "到2022年底完成情况") | |||||
@NotNull(message = "项目进展不能为空") | |||||
private String projectProgress; | |||||
@Excel(name = "累计投资") | |||||
@NotNull(message = "累计投资不能为空") | |||||
private BigDecimal cumulativeInvest; | |||||
@NotNull(message = "年度投资额不能为空") | |||||
@Excel(name = "年度投资额",groupName = "2023年计划") | |||||
private BigDecimal annualPlanAmount; | |||||
@NotNull(message = "自由资金不能为空") | |||||
@Excel(name = "自有资金",groupName = "资金来源") | |||||
private BigDecimal declareHaveAmount; | |||||
@Excel(name = "政府投资-本级财政资金") | |||||
@NotNull(message = "政府投资-本级财政不能为空") | |||||
private BigDecimal declareGovOwnFinanceAmount; | |||||
@Excel(name = "政府投资-上级补助资金") | |||||
@NotNull(message = "政府投资-上级补助资金不能为空") | |||||
private BigDecimal declareGovSuperiorFinanceAmount; | |||||
@Excel(name = "银行贷款") | |||||
@NotNull(message = "银行贷款不能为空") | |||||
private BigDecimal declareBankLendingAmount; | |||||
@Excel(name = "国家、省补助",groupName = "资金来源") | |||||
@NotNull(message = "国家、省补助不能为空") | |||||
private BigDecimal govSuperiorFinanceAmount; | |||||
@Excel(name = "地方财政统筹") | |||||
@NotNull(message = "地方财政统筹不能为空") | |||||
private BigDecimal govOwnFinanceAmount; | |||||
@Excel(name = "建设单位自筹") | |||||
@NotNull(message = "建设单位自筹不能为空") | |||||
private BigDecimal haveAmount; | |||||
@Excel(name = "其他") | |||||
@NotNull(message = "其他不能为空") | |||||
private BigDecimal declareOtherAmount; | |||||
@Excel(name = "一季度",groupName = "进度和支付计划") | |||||
@NotBlank(message = "一季度不能为空") | |||||
private String firstQuarter; | |||||
@Excel(name = "二季度") | |||||
@NotBlank(message = "二季度不能为空") | |||||
private String secondQuarter; | |||||
@Excel(name = "三季度") | |||||
@NotBlank(message = "三季度不能为空") | |||||
private String thirdQuarter; | |||||
@Excel(name = "四季度") | |||||
@NotBlank(message = "四季度不能为空") | |||||
private String fourthQuarter; | |||||
@NotNull(message = "序号不能为空") | |||||
@Excel(name = "序号") | |||||
private Integer serialNumber; | |||||
@Excel(name = "项目id") | |||||
@NotNull(message = "项目ID不能为空") | |||||
private Long projectId; | |||||
@Excel(name = "项目名称") | |||||
@NotBlank(message = "项目名称不能为空") | |||||
private String projectName; | |||||
@NotBlank(message = "建设内容不能为空") | |||||
@Excel(name = "建设内容") | |||||
private String projectIntroduction; | |||||
@NotBlank(message = "建设依据不能为空") | |||||
@Excel(name = "建设依据") | |||||
private String buildBasis; | |||||
@Excel(name = "建设性质") | |||||
@NotBlank(message = "建设性质不能为空") | |||||
private String isFirst; | |||||
@Excel(name = "建设周期") | |||||
@NotBlank(message = "建设周期不能为空") | |||||
private String constructionCycle; | |||||
@Excel(name = "建设起止年限(填写到月)") | |||||
@NotBlank(message = "建设起止年限不能为空") | |||||
private String buildCycle; | |||||
@NotBlank(message = "总投资不能为空") | |||||
@Excel(name = "总投资") | |||||
private BigDecimal declaredAmount; | |||||
@Excel(name = "建设单位") | |||||
@NotBlank(message = "建设单位不能为空") | |||||
private String buildUnitName; | |||||
@Excel(name = "项目联系人") | |||||
@NotBlank(message = "项目联系人不能为空") | |||||
private String contactName; | |||||
@Excel(name = "项目分管领导") | |||||
@NotBlank(message = "项目分管领导不能为空") | |||||
private String responsibleMan; | |||||
@Excel(name = "备注") | |||||
private String projectRemarks; | |||||
} |
@@ -37,15 +37,12 @@ public enum ProjectStatus implements IStatus<Integer, String> { | |||||
DEPARTMENT_JOINT_REVIEW_FAILED(10009, "部门联审不通过", null), | DEPARTMENT_JOINT_REVIEW_FAILED(10009, "部门联审不通过", null), | ||||
IN_THE_ANNUAL_PLAN(10010, "年度计划中", null), | IN_THE_ANNUAL_PLAN(10010, "年度计划中", null), | ||||
BE_SUSPENDED(10011, "被暂缓", null), | BE_SUSPENDED(10011, "被暂缓", null), | ||||
SCHEME_UNDER_REVIEW(10012, "方案评审中", GovProjectStatusEnum.APPROVAL), | |||||
SCHEME_REVIEW_FAILED(10013, "方案评审不通过", null), | |||||
TO_BE_APPROVED(10014, "待立项批复", GovProjectStatusEnum.PENDING), | TO_BE_APPROVED(10014, "待立项批复", GovProjectStatusEnum.PENDING), | ||||
TO_BE_DECLARED(10015, "待申报", null), | TO_BE_DECLARED(10015, "待申报", null), | ||||
PLAN_TO_BE_DECLARED(10016, "方案待申报", null), | PLAN_TO_BE_DECLARED(10016, "方案待申报", null), | ||||
PENDING_PREQUALIFICATION_CHOICE(10017, "待预审选择态", null), | PENDING_PREQUALIFICATION_CHOICE(10017, "待预审选择态", null), | ||||
PREQUALIFICATION_WITHDRAW_CHOICE(10019, "预审中撤回选择态", null), | PREQUALIFICATION_WITHDRAW_CHOICE(10019, "预审中撤回选择态", null), | ||||
APPROVED_AFTER_CHOICE(10020, "立项批复后选择态", null), | APPROVED_AFTER_CHOICE(10020, "立项批复后选择态", null), | ||||
TO_BE_APP_REGISTER(10021, "待应用注册", null), | |||||
/** | /** | ||||
* 信产项目备案 | * 信产项目备案 | ||||
*/ | */ | ||||
@@ -1,15 +0,0 @@ | |||||
package com.hz.pm.api.provincial.contants; | |||||
/** | |||||
* @Classname ProvincialContant | |||||
* @Description | |||||
* @Date 2023/9/6 9:16 | |||||
* @Author PoffyZhang | |||||
*/ | |||||
public interface ProvincialContant { | |||||
class OssUpload { | |||||
public static final String OSS_UPLOAD_URL = "https://pms.zj.gov.cn/prometheus-zhejiang_file_service/api/v1/file/uploadFile"; | |||||
public static final String MEDIA_TYPE = "multipart/form-data"; | |||||
} | |||||
} |
@@ -1,62 +0,0 @@ | |||||
package com.hz.pm.api.provincial.controller; | |||||
import com.hz.pm.api.projectdeclared.manage.ReviewByProvincialDeptManage; | |||||
import com.hz.pm.api.projectlib.model.entity.Project; | |||||
import com.hz.pm.api.provincial.model.res.SjApiResponse; | |||||
import com.hz.pm.api.provincial.service.IJoinReviewProvincialBureauService; | |||||
import io.swagger.annotations.Api; | |||||
import io.swagger.annotations.ApiOperation; | |||||
import lombok.RequiredArgsConstructor; | |||||
import lombok.extern.slf4j.Slf4j; | |||||
import org.springframework.web.bind.annotation.GetMapping; | |||||
import org.springframework.web.bind.annotation.RequestMapping; | |||||
import org.springframework.web.bind.annotation.RequestParam; | |||||
import org.springframework.web.bind.annotation.RestController; | |||||
import javax.validation.Valid; | |||||
import java.io.IOException; | |||||
import java.io.InputStream; | |||||
/** | |||||
* @Classname TestController | |||||
* @Description | |||||
* @Date 2023/3/2 15:08 | |||||
* @Author PoffyZhang | |||||
*/ | |||||
@Slf4j | |||||
@RestController | |||||
@RequiredArgsConstructor | |||||
@RequestMapping("/api/v1/test") | |||||
@Api(tags = "测试省局接口") | |||||
public class TestController { | |||||
private final IJoinReviewProvincialBureauService joinReviewProvincialBureauService; | |||||
private final ReviewByProvincialDeptManage provincialDeptManage; | |||||
@GetMapping("/push") | |||||
@ApiOperation("测试推送") | |||||
public Boolean push(@Valid @RequestParam Long projectId) { | |||||
Project project = new Project(); | |||||
project.setId(projectId); | |||||
return provincialDeptManage.startTheProcess(project); | |||||
} | |||||
@GetMapping("/detail") | |||||
@ApiOperation("测试获取详情") | |||||
public SjApiResponse detail(@RequestParam String projectId) { | |||||
return joinReviewProvincialBureauService.processInfo(projectId); | |||||
} | |||||
@GetMapping("/path") | |||||
@ApiOperation("测试获取详情") | |||||
public String path() throws IOException { | |||||
InputStream in = this.getClass().getResourceAsStream("/template/simsun.ttc"); | |||||
StringBuilder sb = new StringBuilder(); | |||||
int n; | |||||
while ((n = in.read()) != -1) { | |||||
sb.append((char) n); | |||||
} | |||||
return sb.toString(); | |||||
} | |||||
} |
@@ -1,30 +0,0 @@ | |||||
package com.hz.pm.api.provincial.enumeration; | |||||
import lombok.AllArgsConstructor; | |||||
import lombok.Data; | |||||
import lombok.Getter; | |||||
import lombok.NoArgsConstructor; | |||||
/** | |||||
* @Classname ProjectProvincialAuditStatusEnum | |||||
* @Description | |||||
* @Date 2023/3/16 11:04 | |||||
* @Author PoffyZhang | |||||
*/ | |||||
@Getter | |||||
@NoArgsConstructor | |||||
@AllArgsConstructor | |||||
public enum ProjectProvincialAuditStatusEnum { | |||||
/** | |||||
* 省级联审的状态 | |||||
*/ | |||||
NOT_AUDIT(0,"未审核"), | |||||
AUDITING(1,"审核中"), | |||||
SUCCESS(2,"审核通过"), | |||||
FAIL(3,"审核不通过"), | |||||
WITHDRAW(4,"被撤回"), | |||||
BACK(5,"退回地市"); | |||||
private Integer code; | |||||
private String desc; | |||||
} |
@@ -1,56 +0,0 @@ | |||||
package com.hz.pm.api.provincial.manage; | |||||
import com.alibaba.fastjson.JSON; | |||||
import com.ningdatech.basic.exception.BizException; | |||||
import com.hz.pm.api.common.util.CommonInputStreamResource; | |||||
import com.hz.pm.api.provincial.contants.ProvincialContant; | |||||
import com.hz.pm.api.provincial.model.res.OssApiData; | |||||
import com.hz.pm.api.provincial.model.res.OssApiResponse; | |||||
import lombok.RequiredArgsConstructor; | |||||
import lombok.extern.slf4j.Slf4j; | |||||
import org.springframework.http.*; | |||||
import org.springframework.stereotype.Component; | |||||
import org.springframework.util.LinkedMultiValueMap; | |||||
import org.springframework.util.MultiValueMap; | |||||
import org.springframework.web.client.RestTemplate; | |||||
import java.io.ByteArrayInputStream; | |||||
import java.util.Objects; | |||||
/** | |||||
* @Classname ProvincialManage | |||||
* @Description | |||||
* @Date 2023/9/6 9:08 | |||||
* @Author PoffyZhang | |||||
*/ | |||||
@Component | |||||
@RequiredArgsConstructor | |||||
@Slf4j | |||||
public class ProvincialManage { | |||||
public static String uploadToOss(byte[] fileBytes,String fileName) { | |||||
String url = ProvincialContant.OssUpload.OSS_UPLOAD_URL; | |||||
MultiValueMap<String, Object> params = new LinkedMultiValueMap<>(); | |||||
ByteArrayInputStream inputStream = new ByteArrayInputStream(fileBytes); | |||||
CommonInputStreamResource commonInputStreamResource = new CommonInputStreamResource(inputStream, fileBytes.length, fileName); | |||||
params.add("file", commonInputStreamResource); | |||||
RestTemplate restTemplate = new RestTemplate(); | |||||
HttpHeaders headers = new HttpHeaders(); | |||||
MediaType type = MediaType.parseMediaType(ProvincialContant.OssUpload.MEDIA_TYPE); | |||||
headers.setContentType(type); | |||||
HttpEntity<MultiValueMap> formEntity = new HttpEntity(params, headers); | |||||
ResponseEntity<OssApiResponse> res = restTemplate.postForEntity(url, formEntity, OssApiResponse.class); | |||||
log.info("oss res :{}", res); | |||||
OssApiResponse body = res.getBody(); | |||||
if(Objects.isNull(body)){ | |||||
throw new BizException("上传省局oss请求失败"); | |||||
} | |||||
if(HttpStatus.OK.value() != body.getRespCode()){ | |||||
throw new BizException("上传省局oss失败:" + body.getRespMsg()); | |||||
} | |||||
OssApiData ossApiData = JSON.parseObject(JSON.toJSONString(body.getData()), OssApiData.class); | |||||
return ossApiData.getAccessUrl(); | |||||
} | |||||
} |
@@ -1,23 +0,0 @@ | |||||
package com.hz.pm.api.provincial.model.dto; | |||||
import io.swagger.annotations.ApiModelProperty; | |||||
import lombok.Data; | |||||
/** | |||||
* @Classname FileDTO | |||||
* @Description | |||||
* @Date 2023/4/13 9:55 | |||||
* @Author PoffyZhang | |||||
*/ | |||||
@Data | |||||
public class FileDTO { | |||||
@ApiModelProperty("文件id") | |||||
private String fileId; | |||||
@ApiModelProperty("文件名") | |||||
private String fileName; | |||||
@ApiModelProperty("url") | |||||
private String accessUrl; | |||||
} |
@@ -1,36 +0,0 @@ | |||||
package com.hz.pm.api.provincial.model.dto; | |||||
import io.swagger.annotations.ApiModel; | |||||
import io.swagger.annotations.ApiModelProperty; | |||||
import lombok.Builder; | |||||
import lombok.Data; | |||||
/** | |||||
* @Classname ProcessCommentDTO | |||||
* @Description | |||||
* @Date 2023/3/2 15:25 | |||||
* @Author PoffyZhang | |||||
*/ | |||||
@Data | |||||
@Builder | |||||
@ApiModel(value = "ProcessCommentDTO", description = "省局返回流程审核详情") | |||||
public class ProcessCommentDTO { | |||||
@ApiModelProperty("任务id") | |||||
private String taskId; | |||||
@ApiModelProperty("comment") | |||||
private String comment; | |||||
@ApiModelProperty("流程步骤") | |||||
private String stepName; | |||||
@ApiModelProperty("审批状态") | |||||
private String status; | |||||
@ApiModelProperty("审批人") | |||||
private String label; | |||||
@ApiModelProperty("时间") | |||||
private String approverTime; | |||||
} |
@@ -1,121 +0,0 @@ | |||||
package com.hz.pm.api.provincial.model.dto; | |||||
import com.ningdatech.basic.enumeration.Status; | |||||
import com.ningdatech.basic.model.ApiStatus; | |||||
import lombok.Data; | |||||
import lombok.NoArgsConstructor; | |||||
import java.io.Serializable; | |||||
/** | |||||
* <p> | |||||
* ApiResponse - 统一的接口返回值封装 | |||||
* </p> | |||||
* | |||||
* @author WendyYang | |||||
* @since 14:29 2022/9/29 | |||||
*/ | |||||
@Data | |||||
@NoArgsConstructor | |||||
public class ProvinceApiResponse<T> implements Serializable { | |||||
private static final long serialVersionUID = 532384723325394156L; | |||||
public static final int SUCCESS_CODE = 200; | |||||
public static final String SUCCESS_MSG = "success"; | |||||
public static final int ERROR_CODE = 500; | |||||
public static final String ERROR_MSG = "Internal server error"; | |||||
/** | |||||
* 状态码 | |||||
*/ | |||||
private Integer code; | |||||
/** | |||||
* 返回内容 | |||||
*/ | |||||
private String message; | |||||
private String msg; | |||||
/** | |||||
* 返回数据 | |||||
*/ | |||||
private T data; | |||||
/** | |||||
* 全参构造函数 | |||||
* | |||||
* @param code 状态码 | |||||
* @param message 返回内容 | |||||
* @param data 返回数据 | |||||
*/ | |||||
private ProvinceApiResponse(Integer code, String message, T data) { | |||||
this.code = code; | |||||
this.message = message; | |||||
this.data = data; | |||||
} | |||||
/** | |||||
* 构造一个自定义的API返回 | |||||
* | |||||
* @param code 状态码 | |||||
* @param message 返回内容 | |||||
* @param data 返回数据 | |||||
* @return ApiResponse | |||||
*/ | |||||
public static <T> ProvinceApiResponse<T> of(Integer code, String message, T data) { | |||||
return new ProvinceApiResponse<>(code, message, data); | |||||
} | |||||
/** | |||||
* 构造一个成功且不带数据的API返回 | |||||
* | |||||
* @return ApiResponse | |||||
*/ | |||||
public static <T> ProvinceApiResponse<T> ofSuccess() { | |||||
return ofSuccess(null); | |||||
} | |||||
/** | |||||
* 构造一个成功且带数据的API返回 | |||||
* | |||||
* @param data 返回数据 | |||||
* @return ApiResponse | |||||
*/ | |||||
public static <T> ProvinceApiResponse<T> ofSuccess(T data) { | |||||
return ofStatus(Status.OK, data); | |||||
} | |||||
/** | |||||
* 构造一个成功且自定义消息的API返回 | |||||
* | |||||
* @param message 返回内容 | |||||
* @return ApiResponse | |||||
*/ | |||||
public static <T> ProvinceApiResponse<T> ofMessage(String message) { | |||||
return of(Status.OK.getCode(), message, null); | |||||
} | |||||
/** | |||||
* 构造一个有状态的API返回 | |||||
* | |||||
* @param status 状态 {@link Status} | |||||
* @return ApiResponse | |||||
*/ | |||||
public static <T> ProvinceApiResponse<T> ofStatus(ApiStatus status) { | |||||
return ofStatus(status, null); | |||||
} | |||||
/** | |||||
* 构造一个有状态且带数据的API返回 | |||||
* | |||||
* @param status 状态 {@link Status} | |||||
* @param data 返回数据 | |||||
* @return ApiResponse | |||||
*/ | |||||
public static <T> ProvinceApiResponse<T> ofStatus(ApiStatus status, T data) { | |||||
return of(status.getCode(), status.getReasonPhrase(), data); | |||||
} | |||||
} |
@@ -1,103 +0,0 @@ | |||||
package com.hz.pm.api.provincial.model.dto; | |||||
import com.fasterxml.jackson.annotation.JsonIgnoreProperties; | |||||
import io.swagger.annotations.ApiModel; | |||||
import lombok.Builder; | |||||
import lombok.Data; | |||||
import java.io.Serializable; | |||||
import java.util.List; | |||||
/** | |||||
* @Classname ProvincialApplicationDTO | |||||
* @Description | |||||
* @Date 2023/3/2 10:06 | |||||
* @Author PoffyZhang | |||||
*/ | |||||
@Data | |||||
@Builder | |||||
@ApiModel(value = "ProvincialApplicationDTO") | |||||
public class ProvincialApplicationDTO implements Serializable { | |||||
//云 信息 | |||||
private List<Cloud> clouds; | |||||
//是否初次建设 1是 2不是 | |||||
private Integer isFirst; | |||||
//应用名称 | |||||
private String applicationName; | |||||
//关联 关联的IRS应用code | |||||
private String applicationCode; | |||||
//关联的IRS应用name | |||||
private String relatedExistsApplication; | |||||
//1: '办公类系统',2: '业务应用类系统',3: '门户网站',4: '宣传微博/微信公众号',5: '硬件类系统',6: '工具类系统',99: '其他' | |||||
private Integer applicationType; | |||||
//建设层级 1:国家 2:省级 3:市级 4:县(市、区) | |||||
private Integer buildLevel; | |||||
//是否统建 0:否 1:是 | |||||
private Integer isUniteBuild; | |||||
//统建类型 1:全省统建 2:全市统建 | |||||
private Integer unionBuildKind; | |||||
//应用简介 | |||||
private String applicationSummary; | |||||
//应用备注 | |||||
private String applicationRemark; | |||||
//应用总投资测算明细 | |||||
private String applicationEstimateFile; | |||||
//是否数改系统 0:否 1:是 | |||||
private Integer isFiveDomain; | |||||
//1: '党政机关整体智治',2: '数字政府',3: '数字经济',4: '数字社会',7: '数字文化',5: '数字法治',6: '一体化智能化公共数据平台', 8: '基层智治' 多个用英文,分隔 | |||||
private String fiveDomain; | |||||
//业务领域 | |||||
private String bizDomain; | |||||
//否涉及业务协同 0:否 1:是 | |||||
private Integer isBizCooperate; | |||||
//协同单位111111 | |||||
private String cooperativeUnit; | |||||
//用户范围 0: '机关事业单位人员','0-1': '跨部门跨系统','0-2': '系统内地方各级','0-3': '本部门本级','0-4': '处室内部','0-6': '主管处室内部','0-5': '其他',1: '企业', 2: '社会公众',3: '其他' 多个用英文,分隔 | |||||
private String userRange; | |||||
//是否使用政务云资源 1使用 | |||||
private Integer useGovCloud; | |||||
//是否符合国家信息技术应用创新相关规范 0:否 1:是 | |||||
private Integer nationalITSpec; | |||||
//网络环境 1:政务内网 2:政务外网 3:互联网 4:业务专网 5:单机 | |||||
private String netEnv; | |||||
//等保级别 1:一级 2:二级 3:三级 4:四级 5:五级 | |||||
private Integer secrecyGrade; | |||||
//密码测评级别 1:一级 2:二级 3:三级 4:四级 5:五级 | |||||
private Integer passwordGrade; | |||||
//是否是S2 0:否 1:是 | |||||
private Integer isS2; | |||||
//一本账应用名称 | |||||
private String accountAppName; | |||||
//领域”大脑”一本帐名称 | |||||
private String brainAccountAppName; | |||||
//是否使用公共数据 | |||||
private Integer useCommonData; | |||||
//使用的公共数据名称 | |||||
private String dataName; | |||||
//使用公共组件的名称 | |||||
private String commonComponents; | |||||
//是否使用公共组件 | |||||
private Integer useCommonComponent; | |||||
//是否产生公共组件 | |||||
private Integer isProduceCommonComponent; | |||||
//产生的组件名称 | |||||
private String produceCommonComponent; | |||||
//发布端 '浙里办','浙政钉','数字化改革门户','支付宝','微信','网页','PC客户端','APP端' | |||||
private String publishSide; | |||||
@Builder | |||||
@Data | |||||
@JsonIgnoreProperties(value = {"handler"}) | |||||
public static class Cloud implements Serializable { | |||||
//云资源台数 11 | |||||
private Integer cloudNums; | |||||
//云资源类型 云服务器(ECS) | |||||
private String cloudType; | |||||
//云资源规格 1核8G | |||||
private String cloudBasicSpec; | |||||
//云资源描述 | |||||
private String cloudUseDescription; | |||||
} | |||||
} |
@@ -1,134 +0,0 @@ | |||||
package com.hz.pm.api.provincial.model.dto; | |||||
import io.swagger.annotations.ApiModel; | |||||
import io.swagger.annotations.ApiModelProperty; | |||||
import lombok.AllArgsConstructor; | |||||
import lombok.Builder; | |||||
import lombok.Data; | |||||
import lombok.NoArgsConstructor; | |||||
import java.io.Serializable; | |||||
import java.math.BigDecimal; | |||||
import java.util.List; | |||||
/** | |||||
* @Classname ProvincialProjectDTO | |||||
* @Description | |||||
* @Date 2023/3/2 10:06 | |||||
* @Author PoffyZhang | |||||
*/ | |||||
@Data | |||||
@Builder | |||||
@AllArgsConstructor | |||||
@NoArgsConstructor | |||||
@ApiModel(value = "ProvincialProjectDTO", description = "") | |||||
public class ProvincialProjectDTO implements Serializable { | |||||
@ApiModelProperty("区域code") | |||||
private String regionCode; | |||||
@ApiModelProperty("区域名称") | |||||
private String regionName; | |||||
@ApiModelProperty("数字化改革系统 可以多选 1: '党政机关整体智治',2: '数字政府',3: '数字经济',4: '数字社会',7: '数字文化',5: '数字法治',6: '一体化智能化公共数据平台',8: '基层智治'") | |||||
private String digitalReform; | |||||
@ApiModelProperty("业务主管单位浙政钉code,多个单位用英文;组成字符串。数据通过接口-查询省本级业务主管单位获取对应数据") | |||||
private String operationManageUnit; | |||||
@ApiModelProperty("重大项目名称") | |||||
private String projectName; | |||||
@ApiModelProperty("重大项目code 21位") | |||||
private String projectId; | |||||
@ApiModelProperty("项目类型 1新建 2续建") | |||||
private Integer projectType; | |||||
@ApiModelProperty("项目总投资(万元)") | |||||
private BigDecimal totalMoney; | |||||
@ApiModelProperty("项目年度预算(万元)") | |||||
private BigDecimal yearBudget; | |||||
@ApiModelProperty("自有资金,政府投资-本级财政资金,政府投资-上级补助资金") | |||||
private String budgetFrom; | |||||
@ApiModelProperty("预算年度 2023") | |||||
private String year; | |||||
@ApiModelProperty("财政code 32") | |||||
private String financialCode; | |||||
@ApiModelProperty("发改code 23") | |||||
private String developCode; | |||||
@ApiModelProperty("开始时间 比如2022-11-18") | |||||
private String beginTime; | |||||
@ApiModelProperty("结束时间 比如2022-12-13") | |||||
private String endTime; | |||||
@ApiModelProperty("立项依据1111") | |||||
private String buildBasis; | |||||
@ApiModelProperty("立项依据材料 [{\"fileId\":\"\"}]") | |||||
private String buildBasisFile; | |||||
@ApiModelProperty("项目概述") | |||||
private String projectSummary; | |||||
@ApiModelProperty("负责人") | |||||
private String responsibleMan; | |||||
@ApiModelProperty("联系人联系方式") | |||||
private String responsibleManPhone; | |||||
@ApiModelProperty("联系人") | |||||
private String contactName; | |||||
@ApiModelProperty("联系人联系方式") | |||||
private String contactPhone; | |||||
@ApiModelProperty("建设单位 比如财政局") | |||||
private String buildUnit; | |||||
@ApiModelProperty("建设单位浙政钉code") | |||||
private String buildUnitCode; | |||||
@ApiModelProperty("主管单位") | |||||
private String superUnit; | |||||
@ApiModelProperty("主管单位浙政钉code") | |||||
private String superUnitCode; | |||||
@ApiModelProperty("可研报告文件") | |||||
private String researchReport; | |||||
@ApiModelProperty("项目申报书") | |||||
private String projectApplyFile; | |||||
@ApiModelProperty("项目总投资测算明细") | |||||
private String projectEstimateFile; | |||||
@ApiModelProperty("申报单位主要职责") | |||||
private String unitThreePlan; | |||||
@ApiModelProperty("其他附件") | |||||
private String otherFile; | |||||
@ApiModelProperty("项目备注111") | |||||
private String projectRemark; | |||||
@ApiModelProperty("是否有效 1有效 2无效 3撤回") | |||||
private Integer isEffective; | |||||
@ApiModelProperty("是否包含应用 1包含") | |||||
private Integer includeApplication; | |||||
@ApiModelProperty("app信息") | |||||
private List<ProvincialApplicationDTO> applicationInfo; | |||||
@ApiModelProperty("条线单位 先写死") | |||||
private String lineManageUnit; | |||||
} |
@@ -1,31 +0,0 @@ | |||||
package com.hz.pm.api.provincial.model.res; | |||||
import lombok.Data; | |||||
import lombok.NoArgsConstructor; | |||||
import java.io.Serializable; | |||||
/** | |||||
* <p> | |||||
* OssApiResponse - | |||||
* </p> | |||||
* | |||||
* @author ZPF | |||||
* @since 14:29 2022/9/29 | |||||
*/ | |||||
@Data | |||||
@NoArgsConstructor | |||||
public class OssApiData implements Serializable { | |||||
private String fileId; | |||||
private String fileName; | |||||
private String accessUrl; | |||||
private Long fileSize; | |||||
private String uploadUserCode; | |||||
private String ossObject; | |||||
} |
@@ -1,120 +0,0 @@ | |||||
package com.hz.pm.api.provincial.model.res; | |||||
import com.ningdatech.basic.enumeration.Status; | |||||
import com.ningdatech.basic.model.ApiStatus; | |||||
import lombok.Data; | |||||
import lombok.NoArgsConstructor; | |||||
import java.io.Serializable; | |||||
/** | |||||
* <p> | |||||
* OssApiResponse - | |||||
* </p> | |||||
* | |||||
* @author ZPF | |||||
* @since 14:29 2022/9/29 | |||||
*/ | |||||
@Data | |||||
@NoArgsConstructor | |||||
public class OssApiResponse<T> implements Serializable { | |||||
private static final long serialVersionUID = 1L; | |||||
public static final int SUCCESS_CODE = 200; | |||||
public static final String SUCCESS_MSG = "成功"; | |||||
public static final int ERROR_CODE = 500; | |||||
public static final String ERROR_MSG = "Internal server error"; | |||||
/** | |||||
* 状态码 | |||||
*/ | |||||
private Integer respCode; | |||||
/** | |||||
* 返回描述 | |||||
*/ | |||||
private String respMsg; | |||||
/** | |||||
* 返回数据 | |||||
*/ | |||||
private T data; | |||||
/** | |||||
* 全参构造函数 | |||||
* | |||||
* @param respCode 状态码 | |||||
* @param respMsg 返回内容 | |||||
* @param data 返回数据 | |||||
*/ | |||||
private OssApiResponse(Integer respCode, String respMsg, T data) { | |||||
this.respCode = respCode; | |||||
this.respMsg = respMsg; | |||||
this.data = data; | |||||
} | |||||
/** | |||||
* 构造一个自定义的API返回 | |||||
* | |||||
* @param respCode 状态码 | |||||
* @param respMsg 返回内容 | |||||
* @param data 返回数据 | |||||
* @return ApiResponse | |||||
*/ | |||||
public static <T> OssApiResponse<T> of(Integer respCode, String respMsg, T data) { | |||||
return new OssApiResponse<>(respCode, respMsg, data); | |||||
} | |||||
/** | |||||
* 构造一个成功且不带数据的API返回 | |||||
* | |||||
* @return ApiResponse | |||||
*/ | |||||
public static <T> OssApiResponse<T> ofSuccess() { | |||||
return ofSuccess(null); | |||||
} | |||||
/** | |||||
* 构造一个成功且带数据的API返回 | |||||
* | |||||
* @param data 返回数据 | |||||
* @return ApiResponse | |||||
*/ | |||||
public static <T> OssApiResponse<T> ofSuccess(T data) { | |||||
return ofStatus(Status.OK, data); | |||||
} | |||||
/** | |||||
* 构造一个成功且自定义消息的API返回 | |||||
* | |||||
* @param msg 返回内容 | |||||
* @return ApiResponse | |||||
*/ | |||||
public static <T> OssApiResponse<T> ofMessage(String msg) { | |||||
return of(Status.OK.getCode(), msg, null); | |||||
} | |||||
/** | |||||
* 构造一个有状态的API返回 | |||||
* | |||||
* @param status 状态 {@link Status} | |||||
* @return ApiResponse | |||||
*/ | |||||
public static <T> OssApiResponse<T> ofStatus(ApiStatus status) { | |||||
return ofStatus(status, null); | |||||
} | |||||
/** | |||||
* 构造一个有状态且带数据的API返回 | |||||
* | |||||
* @param status 状态 {@link Status} | |||||
* @param data 返回数据 | |||||
* @return ApiResponse | |||||
*/ | |||||
public static <T> OssApiResponse<T> ofStatus(ApiStatus status, T data) { | |||||
return of(status.getCode(), status.getReasonPhrase(), data); | |||||
} | |||||
} |
@@ -1,43 +0,0 @@ | |||||
package com.hz.pm.api.provincial.model.res; | |||||
import io.swagger.annotations.ApiModel; | |||||
import io.swagger.annotations.ApiModelProperty; | |||||
import lombok.AllArgsConstructor; | |||||
import lombok.Builder; | |||||
import lombok.Data; | |||||
import lombok.NoArgsConstructor; | |||||
/** | |||||
* @Classname ProcessCommentDTO | |||||
* @Description | |||||
* @Date 2023/3/2 15:25 | |||||
* @Author PoffyZhang | |||||
*/ | |||||
@Data | |||||
@Builder | |||||
@ApiModel(value = "ProcessCommentRes", description = "省局返回流程审核详情") | |||||
@AllArgsConstructor | |||||
@NoArgsConstructor | |||||
public class ProcessCommentRes { | |||||
@ApiModelProperty("任务id") | |||||
private String taskId; | |||||
@ApiModelProperty("comment") | |||||
private String comment; | |||||
@ApiModelProperty("流程步骤") | |||||
private String stepName; | |||||
@ApiModelProperty("节点ID") | |||||
private String nodeId; | |||||
@ApiModelProperty("审批状态") | |||||
private String status; | |||||
@ApiModelProperty("审批人") | |||||
private String label; | |||||
@ApiModelProperty("时间") | |||||
private String approverTime; | |||||
} |
@@ -1,108 +0,0 @@ | |||||
package com.hz.pm.api.provincial.model.res; | |||||
import com.fasterxml.jackson.annotation.JsonIgnoreProperties; | |||||
import io.swagger.annotations.ApiModel; | |||||
import lombok.AllArgsConstructor; | |||||
import lombok.Builder; | |||||
import lombok.Data; | |||||
import lombok.NoArgsConstructor; | |||||
import java.io.Serializable; | |||||
import java.util.List; | |||||
/** | |||||
* @Classname ProvincialApplicationDTO | |||||
* @Description | |||||
* @Date 2023/3/2 10:06 | |||||
* @Author PoffyZhang | |||||
*/ | |||||
@Data | |||||
@Builder | |||||
@ApiModel(value = "ProvincialApplicationRes", description = "") | |||||
@NoArgsConstructor | |||||
@AllArgsConstructor | |||||
public class ProvincialApplicationRes implements Serializable { | |||||
//云 信息 | |||||
private List<Cloud> clouds; | |||||
//是否初次建设 1是 2不是 | |||||
private Integer isFirst; | |||||
//应用名称 | |||||
private String applicationName; | |||||
//关联 关联的IRS应用code | |||||
private String applicationCode; | |||||
//关联的IRS应用name | |||||
private String relatedExistsApplication; | |||||
//1: '办公类系统',2: '业务应用类系统',3: '门户网站',4: '宣传微博/微信公众号',5: '硬件类系统',6: '工具类系统',99: '其他' | |||||
private Integer applicationType; | |||||
//建设层级 1:国家 2:省级 3:市级 4:县(市、区) | |||||
private Integer buildLevel; | |||||
//是否统建 0:否 1:是 | |||||
private Integer isUniteBuild; | |||||
//统建类型 1:全省统建 2:全市统建 | |||||
private Integer unionBuildKind; | |||||
//应用简介 | |||||
private String applicationSummary; | |||||
//应用备注 | |||||
private String applicationRemark; | |||||
//应用总投资测算明细 | |||||
private String applicationEstimateFile; | |||||
//是否数改系统 0:否 1:是 | |||||
private Integer isFiveDomain; | |||||
//1: '党政机关整体智治',2: '数字政府',3: '数字经济',4: '数字社会',7: '数字文化',5: '数字法治',6: '一体化智能化公共数据平台', 8: '基层智治' 多个用英文,分隔 | |||||
private String fiveDomain; | |||||
//业务领域 | |||||
private String bizDomain; | |||||
//否涉及业务协同 0:否 1:是 | |||||
private Integer isBizCooperate; | |||||
//协同单位111111 | |||||
private String cooperativeUnit; | |||||
//用户范围 0: '机关事业单位人员','0-1': '跨部门跨系统','0-2': '系统内地方各级','0-3': '本部门本级','0-4': '处室内部','0-6': '主管处室内部','0-5': '其他',1: '企业', 2: '社会公众',3: '其他' 多个用英文,分隔 | |||||
private String userRange; | |||||
//是否使用政务云资源 1使用 | |||||
private Integer useGovCloud; | |||||
//是否符合国家信息技术应用创新相关规范 0:否 1:是 | |||||
private Integer nationalITSpec; | |||||
//网络环境 1:政务内网 2:政务外网 3:互联网 4:业务专网 5:单机 | |||||
private String netEnv; | |||||
//等保级别 1:一级 2:二级 3:三级 4:四级 5:五级 | |||||
private Integer secrecyGrade; | |||||
//密码测评级别 1:一级 2:二级 3:三级 4:四级 5:五级 | |||||
private Integer passwordGrade; | |||||
//是否是S2 0:否 1:是 | |||||
private Integer isS2; | |||||
//一本账应用名称 | |||||
private String accountAppName; | |||||
//领域”大脑”一本帐名称 | |||||
private String brainAccountAppName; | |||||
//是否使用公共数据 | |||||
private Integer useCommonData; | |||||
//使用的公共数据名称 | |||||
private String dataName; | |||||
//使用公共组件的名称 | |||||
private String commonComponents; | |||||
//是否使用公共组件 | |||||
private Integer useCommonComponent; | |||||
//是否产生公共组件 | |||||
private Integer isProduceCommonComponent; | |||||
//产生的组件名称 | |||||
private String produceCommonComponent; | |||||
//发布端 '浙里办','浙政钉','数字化改革门户','支付宝','微信','网页','PC客户端','APP端' | |||||
private String publishSide; | |||||
@Builder | |||||
@JsonIgnoreProperties(value = { "handler"}) | |||||
@NoArgsConstructor | |||||
@AllArgsConstructor | |||||
public static class Cloud implements Serializable { | |||||
//云资源台数 11 | |||||
private Integer cloudNums; | |||||
//云资源类型 云服务器(ECS) | |||||
private String cloudType; | |||||
//云资源规格 1核8G | |||||
private String cloudBasicSpec; | |||||
//云资源描述 | |||||
private String cloudUseDescription; | |||||
} | |||||
} |
@@ -1,130 +0,0 @@ | |||||
package com.hz.pm.api.provincial.model.res; | |||||
import io.swagger.annotations.ApiModel; | |||||
import io.swagger.annotations.ApiModelProperty; | |||||
import lombok.AllArgsConstructor; | |||||
import lombok.Builder; | |||||
import lombok.Data; | |||||
import lombok.NoArgsConstructor; | |||||
import java.math.BigDecimal; | |||||
import java.util.List; | |||||
/** | |||||
* @Classname ProvincialProjectDTO | |||||
* @Description | |||||
* @Date 2023/3/2 10:06 | |||||
* @Author PoffyZhang | |||||
*/ | |||||
@Data | |||||
@Builder | |||||
@AllArgsConstructor | |||||
@NoArgsConstructor | |||||
@ApiModel(value = "ProvincialProjectDTO") | |||||
public class ProvincialProjectRes { | |||||
@ApiModelProperty("项目审核结果 1审核中 2审核通过 3审核不通过") | |||||
private Integer projectStatus; | |||||
@ApiModelProperty("区域code") | |||||
private String regionCode; | |||||
@ApiModelProperty("区域名称") | |||||
private String regionName; | |||||
@ApiModelProperty("重大项目名称") | |||||
private String projectName; | |||||
@ApiModelProperty("重大项目code 21位") | |||||
private String projectId; | |||||
@ApiModelProperty("项目类型 1新建 2续建") | |||||
private Integer projectType; | |||||
@ApiModelProperty("项目总投资(万元)") | |||||
private BigDecimal totalMoney; | |||||
@ApiModelProperty("项目年度预算(万元)") | |||||
private BigDecimal yearBudget; | |||||
@ApiModelProperty("自有资金,政府投资-本级财政资金,政府投资-上级补助资金") | |||||
private String budgetFrom; | |||||
@ApiModelProperty("预算年度 2023") | |||||
private String year; | |||||
@ApiModelProperty("财政code 32") | |||||
private String financialCode; | |||||
@ApiModelProperty("发改code 23") | |||||
private String developCode; | |||||
@ApiModelProperty("开始时间 比如2022-11-18") | |||||
private String beginTime; | |||||
@ApiModelProperty("结束时间 比如2022-12-13") | |||||
private String endTime; | |||||
@ApiModelProperty("立项依据1111") | |||||
private String buildBasis; | |||||
@ApiModelProperty("立项依据材料 [{\"fileId\":\"\"}]") | |||||
private String buildBasisFile; | |||||
@ApiModelProperty("项目概述") | |||||
private String projectSummary; | |||||
@ApiModelProperty("负责人") | |||||
private String responsibleMan; | |||||
@ApiModelProperty("联系人联系方式") | |||||
private String responsibleManPhone; | |||||
@ApiModelProperty("联系人") | |||||
private String contactName; | |||||
@ApiModelProperty("联系人联系方式") | |||||
private String contactPhone; | |||||
@ApiModelProperty("建设单位 比如财政局") | |||||
private String buildUnit; | |||||
@ApiModelProperty("建设单位浙政钉code") | |||||
private String buildUnitCode; | |||||
@ApiModelProperty("主管单位") | |||||
private String superUnit; | |||||
@ApiModelProperty("主管单位浙政钉code") | |||||
private String superUnitCode; | |||||
@ApiModelProperty("可研报告文件") | |||||
private String researchReport; | |||||
@ApiModelProperty("项目申报书") | |||||
private String projectApplyFile; | |||||
@ApiModelProperty("项目总投资测算明细") | |||||
private String projectEstimateFile; | |||||
@ApiModelProperty("申报单位主要职责") | |||||
private String unitThreePlan; | |||||
@ApiModelProperty("其他附件") | |||||
private String otherFile; | |||||
@ApiModelProperty("项目备注111") | |||||
private String projectRemark; | |||||
@ApiModelProperty("是否有效 1有效 2无效 3撤回") | |||||
private Integer isEffective; | |||||
@ApiModelProperty("是否包含应用 1包含") | |||||
private Integer includeApplication; | |||||
@ApiModelProperty("app信息") | |||||
private List<ProvincialApplicationRes> applicationInfo; | |||||
@ApiModelProperty("审核信息") | |||||
private List<ProcessCommentRes> processComment; | |||||
} |
@@ -1,120 +0,0 @@ | |||||
package com.hz.pm.api.provincial.model.res; | |||||
import com.ningdatech.basic.enumeration.Status; | |||||
import com.ningdatech.basic.model.ApiStatus; | |||||
import lombok.Data; | |||||
import lombok.NoArgsConstructor; | |||||
import java.io.Serializable; | |||||
/** | |||||
* <p> | |||||
* ApiResponse - 省局统一的接口返回值封装 | |||||
* </p> | |||||
* | |||||
* @author ZPF | |||||
* @since 14:29 2022/9/29 | |||||
*/ | |||||
@Data | |||||
@NoArgsConstructor | |||||
public class SjApiResponse<T> implements Serializable { | |||||
private static final long serialVersionUID = 532384723325394156L; | |||||
public static final int SUCCESS_CODE = 200; | |||||
public static final String SUCCESS_MSG = "success"; | |||||
public static final int ERROR_CODE = 500; | |||||
public static final String ERROR_MSG = "Internal server error"; | |||||
/** | |||||
* 状态码 | |||||
*/ | |||||
private Integer code; | |||||
/** | |||||
* 返回内容 | |||||
*/ | |||||
private String msg; | |||||
/** | |||||
* 返回数据 | |||||
*/ | |||||
private T data; | |||||
/** | |||||
* 全参构造函数 | |||||
* | |||||
* @param code 状态码 | |||||
* @param msg 返回内容 | |||||
* @param data 返回数据 | |||||
*/ | |||||
private SjApiResponse(Integer code, String msg, T data) { | |||||
this.code = code; | |||||
this.msg = msg; | |||||
this.data = data; | |||||
} | |||||
/** | |||||
* 构造一个自定义的API返回 | |||||
* | |||||
* @param code 状态码 | |||||
* @param msg 返回内容 | |||||
* @param data 返回数据 | |||||
* @return ApiResponse | |||||
*/ | |||||
public static <T> SjApiResponse<T> of(Integer code, String msg, T data) { | |||||
return new SjApiResponse<>(code, msg, data); | |||||
} | |||||
/** | |||||
* 构造一个成功且不带数据的API返回 | |||||
* | |||||
* @return ApiResponse | |||||
*/ | |||||
public static <T> SjApiResponse<T> ofSuccess() { | |||||
return ofSuccess(null); | |||||
} | |||||
/** | |||||
* 构造一个成功且带数据的API返回 | |||||
* | |||||
* @param data 返回数据 | |||||
* @return ApiResponse | |||||
*/ | |||||
public static <T> SjApiResponse<T> ofSuccess(T data) { | |||||
return ofStatus(Status.OK, data); | |||||
} | |||||
/** | |||||
* 构造一个成功且自定义消息的API返回 | |||||
* | |||||
* @param msg 返回内容 | |||||
* @return ApiResponse | |||||
*/ | |||||
public static <T> SjApiResponse<T> ofMessage(String msg) { | |||||
return of(Status.OK.getCode(), msg, null); | |||||
} | |||||
/** | |||||
* 构造一个有状态的API返回 | |||||
* | |||||
* @param status 状态 {@link Status} | |||||
* @return ApiResponse | |||||
*/ | |||||
public static <T> SjApiResponse<T> ofStatus(ApiStatus status) { | |||||
return ofStatus(status, null); | |||||
} | |||||
/** | |||||
* 构造一个有状态且带数据的API返回 | |||||
* | |||||
* @param status 状态 {@link Status} | |||||
* @param data 返回数据 | |||||
* @return ApiResponse | |||||
*/ | |||||
public static <T> SjApiResponse<T> ofStatus(ApiStatus status, T data) { | |||||
return of(status.getCode(), status.getReasonPhrase(), data); | |||||
} | |||||
} |
@@ -1,29 +0,0 @@ | |||||
package com.hz.pm.api.provincial.service; | |||||
import com.hz.pm.api.provincial.model.dto.ProvincialProjectDTO; | |||||
import com.hz.pm.api.provincial.model.res.SjApiResponse; | |||||
/** | |||||
* @Classname JointReviewProvincialBureauService | |||||
* @Description 省局联审接口 | |||||
* @Date 2023/3/2 9:29 | |||||
* @Author PoffyZhang | |||||
*/ | |||||
public interface IJoinReviewProvincialBureauService { | |||||
/** | |||||
* 推送/保存 重大接口到 省局联审 | |||||
* | |||||
* @return \ | |||||
*/ | |||||
Boolean pushImportProject(ProvincialProjectDTO project); | |||||
/** | |||||
* 查看 本区域 省局联审 的项目审核详情 | |||||
* | |||||
* @return \ | |||||
*/ | |||||
SjApiResponse processInfo(String projectId); | |||||
} |
@@ -1,141 +0,0 @@ | |||||
package com.hz.pm.api.provincial.service.impl; | |||||
import cn.hutool.core.util.StrUtil; | |||||
import cn.hutool.crypto.SecureUtil; | |||||
import com.alibaba.fastjson.JSON; | |||||
import com.alibaba.fastjson.JSONObject; | |||||
import com.hz.pm.api.common.config.ProvincialProperties; | |||||
import com.hz.pm.api.provincial.model.dto.ProvinceApiResponse; | |||||
import com.hz.pm.api.provincial.model.dto.ProvincialProjectDTO; | |||||
import com.hz.pm.api.provincial.model.res.SjApiResponse; | |||||
import com.hz.pm.api.provincial.service.IJoinReviewProvincialBureauService; | |||||
import lombok.extern.slf4j.Slf4j; | |||||
import org.springframework.beans.factory.annotation.Autowired; | |||||
import org.springframework.beans.factory.annotation.Value; | |||||
import org.springframework.http.HttpMethod; | |||||
import org.springframework.http.MediaType; | |||||
import org.springframework.http.RequestEntity; | |||||
import org.springframework.http.ResponseEntity; | |||||
import org.springframework.stereotype.Service; | |||||
import org.springframework.web.client.RestTemplate; | |||||
/** | |||||
* @Classname JointReviewProvincialBureauService | |||||
* @Description 省局联审接口 | |||||
* @Date 2023/3/2 9:29 | |||||
* @Author PoffyZhang | |||||
*/ | |||||
@Service | |||||
@Slf4j | |||||
public class JoinReviewProvincialBureauServiceImpl implements IJoinReviewProvincialBureauService { | |||||
@Autowired | |||||
private ProvincialProperties provincialProperties; | |||||
@Autowired | |||||
private RestTemplate restTemplate; | |||||
@Value("${irs.interface-refresh.request-token-url:}") | |||||
private String govRequestTokenUrl; | |||||
@Value("${irs.interface-refresh.refresh-token-url:}") | |||||
private String govRefreshTokenUrl; | |||||
@Value("${irs.province-gov.url:}") | |||||
private String govUrl; | |||||
@Value("${irs.province-gov.appSecret:}") | |||||
private String govAppSecret; | |||||
@Value("${irs.province-gov.appKey:}") | |||||
private String govAppKey; | |||||
@Value("${irs.province-gov.interfaceName:}") | |||||
private String interfaceName; | |||||
/** | |||||
* 推送/保存 重大接口到 省局联审 | |||||
* | |||||
* @return | |||||
*/ | |||||
@Override | |||||
public Boolean pushImportProject(ProvincialProjectDTO project) { | |||||
Long timeStamp = System.currentTimeMillis() / 1000; | |||||
String url = provincialProperties.getHost() + provincialProperties.getPushUrl() + "?timestamp=" + timeStamp; | |||||
log.info("省局推送联审url {}", url); | |||||
ResponseEntity<ProvinceApiResponse> responseEntity; | |||||
String signature = getSha256(timeStamp, provincialProperties.getPushUrl(), | |||||
HttpMethod.POST.name(), provincialProperties.getKey(), provincialProperties.getSecret()); | |||||
//发送post请求 | |||||
RequestEntity<ProvincialProjectDTO> requestEntity = RequestEntity | |||||
.post(url) | |||||
.header("Accept", MediaType.APPLICATION_JSON.toString()) | |||||
.header("X-Hmac-Auth-Key", provincialProperties.getKey()) | |||||
.header("X-Hmac-Auth-Signature", signature) | |||||
.contentType(MediaType.APPLICATION_JSON) | |||||
.accept(MediaType.APPLICATION_JSON) | |||||
.body(project); | |||||
log.info("省局联审 提交 :{}", requestEntity); | |||||
log.info("省局联审 提交body :{}", JSON.toJSONString(requestEntity.getBody())); | |||||
try { | |||||
responseEntity = restTemplate.exchange(requestEntity, ProvinceApiResponse.class); | |||||
log.info("省局联审 响应 :{}", responseEntity); | |||||
if (responseEntity.getBody().getCode().equals(200)) { | |||||
return Boolean.TRUE; | |||||
} | |||||
} catch (Exception e) { | |||||
log.error("[省局联审] http request error", e); | |||||
} | |||||
return Boolean.FALSE; | |||||
} | |||||
/** | |||||
* 获取流程审批详情 | |||||
* | |||||
* @param projectId | |||||
* @return | |||||
*/ | |||||
@Override | |||||
public SjApiResponse processInfo(String projectId) { | |||||
Long timeStamp = System.currentTimeMillis() / 1000; | |||||
String url = provincialProperties.getHost() + provincialProperties.getDetailUrl() | |||||
+ "?timestamp=" + timeStamp; | |||||
log.info("省局获取审核详情 url {}", url); | |||||
ResponseEntity<SjApiResponse> responseEntity = null; | |||||
String signature = getSha256(timeStamp, provincialProperties.getDetailUrl(), | |||||
HttpMethod.POST.name(), provincialProperties.getKey(), provincialProperties.getSecret()); | |||||
JSONObject jsonBaby = new JSONObject(); | |||||
jsonBaby.put("projectId", projectId); | |||||
log.info("请求体 :{}", jsonBaby); | |||||
//发送post请求 | |||||
RequestEntity<JSONObject> requestEntity = RequestEntity | |||||
.post(url) | |||||
.header("Accept", MediaType.APPLICATION_JSON.toString()) | |||||
.header("X-Hmac-Auth-Key", provincialProperties.getKey()) | |||||
.header("X-Hmac-Auth-Signature", signature) | |||||
.contentType(MediaType.APPLICATION_JSON) | |||||
.accept(MediaType.APPLICATION_JSON) | |||||
.body(jsonBaby); //也可以是DTO | |||||
try { | |||||
responseEntity = restTemplate.exchange(requestEntity, SjApiResponse.class); | |||||
log.info("获取审批详情 响应 :{}", responseEntity); | |||||
} catch (Exception e) { | |||||
log.error("[省局获取审核详情] http request error", e); | |||||
} | |||||
return responseEntity.getBody(); | |||||
} | |||||
private static String getSha256(Long timeStamp, String url, String method, String key, String secret) { | |||||
String bytesToSign = method + StrUtil.LF + url + StrUtil.LF + timeStamp + StrUtil.LF + key; | |||||
log.info("加密message :{}", bytesToSign); | |||||
String res = SecureUtil.hmacSha256(secret).digestBase64(bytesToSign, false); | |||||
log.info("加密结果 :{}", res); | |||||
return res; | |||||
} | |||||
} |
@@ -37,7 +37,6 @@ import java.util.List; | |||||
import java.util.Objects; | import java.util.Objects; | ||||
import java.util.Set; | import java.util.Set; | ||||
import static com.hz.pm.api.projectlib.model.enumeration.status.ProjectStatus.PRE_APPLYING; | |||||
import static com.hz.pm.api.todocenter.constant.WorkNoticeConst.PASS_MSG_TEMPLATE; | import static com.hz.pm.api.todocenter.constant.WorkNoticeConst.PASS_MSG_TEMPLATE; | ||||
import static com.hz.pm.api.todocenter.constant.WorkNoticeConst.PASS_MSG_TEMPLATE2; | import static com.hz.pm.api.todocenter.constant.WorkNoticeConst.PASS_MSG_TEMPLATE2; | ||||
@@ -185,8 +184,6 @@ public class ProcessEndListener { | |||||
case UNDER_INTERNAL_AUDIT: | case UNDER_INTERNAL_AUDIT: | ||||
// 当前项目状态是部门联审中 | // 当前项目状态是部门联审中 | ||||
case DEPARTMENT_JOINT_REVIEW: | case DEPARTMENT_JOINT_REVIEW: | ||||
// 当前项目状态是方案评审中 | |||||
case SCHEME_UNDER_REVIEW: | |||||
handlerManage.updatePassProjectStatus(0L, project); | handlerManage.updatePassProjectStatus(0L, project); | ||||
break; | break; | ||||
default: | default: | ||||
@@ -1,926 +0,0 @@ | |||||
package com.hz.pm.api.scheduler.task; | |||||
import cn.hutool.core.collection.CollUtil; | |||||
import cn.hutool.core.date.StopWatch; | |||||
import cn.hutool.core.util.ObjectUtil; | |||||
import com.alibaba.fastjson.JSON; | |||||
import com.alibaba.fastjson.JSONArray; | |||||
import com.alibaba.fastjson.JSONObject; | |||||
import com.baomidou.mybatisplus.core.toolkit.Wrappers; | |||||
import com.google.common.collect.Lists; | |||||
import com.hz.pm.api.common.helper.RegionCacheHelper; | |||||
import com.hz.pm.api.common.model.constant.BizConst; | |||||
import com.hz.pm.api.common.model.constant.RegionConst; | |||||
import com.hz.pm.api.common.util.BizUtils; | |||||
import com.hz.pm.api.dashboard.constant.DashboardConstant; | |||||
import com.hz.pm.api.dashboard.model.entity.CockpitStats; | |||||
import com.hz.pm.api.dashboard.model.po.SecrecyPasswordGradePO; | |||||
import com.hz.pm.api.dashboard.service.ICockpitStatsService; | |||||
import com.hz.pm.api.expert.entity.ExpertIntentionWorkRegion; | |||||
import com.hz.pm.api.expert.entity.ExpertUserFullInfo; | |||||
import com.hz.pm.api.expert.service.IExpertIntentionWorkRegionService; | |||||
import com.hz.pm.api.expert.service.IExpertUserFullInfoService; | |||||
import com.hz.pm.api.gov.enumeration.GovProjectStatusEnum; | |||||
import com.hz.pm.api.gov.model.entity.*; | |||||
import com.hz.pm.api.gov.service.*; | |||||
import com.hz.pm.api.meta.model.entity.ExpertTag; | |||||
import com.hz.pm.api.meta.service.IExpertTagService; | |||||
import com.hz.pm.api.performance.model.entity.PerformanceAppraisalProject; | |||||
import com.hz.pm.api.performance.service.IPerformanceAppraisalProjectService; | |||||
import com.hz.pm.api.projectlib.model.entity.Project; | |||||
import com.hz.pm.api.projectlib.model.entity.ProjectInst; | |||||
import com.hz.pm.api.projectlib.model.enumeration.InstTypeEnum; | |||||
import com.hz.pm.api.projectlib.model.enumeration.status.ProjectStatus; | |||||
import com.hz.pm.api.projectlib.service.IProjectInstService; | |||||
import com.hz.pm.api.projectlib.service.IProjectService; | |||||
import com.hz.pm.api.sys.model.dto.RegionDTO; | |||||
import com.hz.pm.api.sys.model.entity.WflowEarlyWarningRecords; | |||||
import com.hz.pm.api.sys.service.IEarlyWarningRecordsService; | |||||
import lombok.RequiredArgsConstructor; | |||||
import lombok.extern.slf4j.Slf4j; | |||||
import org.apache.commons.lang3.StringUtils; | |||||
import org.flowable.engine.HistoryService; | |||||
import org.flowable.engine.history.HistoricActivityInstance; | |||||
import org.springframework.beans.factory.annotation.Value; | |||||
import org.springframework.scheduling.annotation.Scheduled; | |||||
import org.springframework.stereotype.Component; | |||||
import java.math.BigDecimal; | |||||
import java.net.InetAddress; | |||||
import java.net.UnknownHostException; | |||||
import java.time.LocalDateTime; | |||||
import java.util.*; | |||||
import java.util.stream.Collectors; | |||||
import java.util.stream.Stream; | |||||
/** | |||||
* @author ZPF | |||||
* @Class CockpitStatsStatisticsTask | |||||
* 驾驶舱 统计 每日任务 | |||||
* @since 2023/08/31 18:16 | |||||
*/ | |||||
@Component | |||||
@Slf4j | |||||
@RequiredArgsConstructor | |||||
public class CockpitStatsStatisticsTask { | |||||
@Value("${hostname:}") | |||||
public String HOST; | |||||
@Value("${spring.profiles.active}") | |||||
public String active; | |||||
private final ICockpitStatsService cockpitStatsService; | |||||
private final RegionCacheHelper regionCacheHelper; | |||||
private final IProjectService projectService; | |||||
private final IProjectInstService projectInstService; | |||||
private final IExpertUserFullInfoService expertUserFullInfoService; | |||||
private final IPerformanceAppraisalProjectService performanceAppraisalProjectService; | |||||
private final IGovBizProjectBaseinfoService baseinfoService; | |||||
private final IGovBizProjectApplyService applyService; | |||||
private final HistoryService historyService; | |||||
private final IGovBizProjectApproveService approveService; | |||||
private final IGovBizProjectProcureService procureService; | |||||
private final IGovBizProjectCimplementService cimplementService; | |||||
private final IEarlyWarningRecordsService earlyWarningRecordsService; | |||||
private final IExpertIntentionWorkRegionService expertIntentionWorkRegionService; | |||||
private final IExpertTagService expertTagService; | |||||
private List<Integer> years = Lists.newArrayList(2021, 2022, 2023, 2024, 2025); | |||||
/** | |||||
* 定义统计 驾驶舱数据 每天3点开始执行一次 | |||||
*/ | |||||
@Scheduled(cron = "0 0 3 * * ?") | |||||
public void doTask() throws UnknownHostException { | |||||
if (!HOST.equals(InetAddress.getLocalHost().getHostName())) { | |||||
log.info("定时器没开启或者host不对! {}:{}", | |||||
HOST, InetAddress.getLocalHost().getHostName()); | |||||
return; | |||||
} | |||||
if (BizConst.PRE.equals(active)) { | |||||
log.info("预发环境不用同步!"); | |||||
return; | |||||
} | |||||
log.info("驾驶舱数据统计任务开始====="); | |||||
StopWatch stopWatch = new StopWatch(); | |||||
stopWatch.start(); | |||||
List<CockpitStats> res = Lists.newArrayList(); | |||||
//1.根据2个维度来统计 区域和分年 | |||||
//1.总的 | |||||
res.add(statisticsData(DashboardConstant.CockpitStats.TOTAL, | |||||
DashboardConstant.CockpitStats.TOTAL, DashboardConstant.CockpitStats.NONE_YEAR)); | |||||
for (Integer year : years) { | |||||
res.add(statisticsData(DashboardConstant.CockpitStats.TOTAL, | |||||
DashboardConstant.CockpitStats.TOTAL, year)); | |||||
} | |||||
List<RegionDTO> regions = regionCacheHelper.listChildren(RegionConst.RC_HZ, RegionConst.RL_CITY); | |||||
regions = regions.stream().filter(r -> r.getRegionLevel() != RegionConst.RL_CITY).collect(Collectors.toList()); | |||||
for (RegionDTO regionDto : regions) { | |||||
res.add(statisticsData(regionDto.getRegionCode(), regionDto.getRegionName(), | |||||
DashboardConstant.CockpitStats.NONE_YEAR)); | |||||
for (Integer year : years) { | |||||
res.add(statisticsData(regionDto.getRegionCode(), regionDto.getRegionName(), year)); | |||||
} | |||||
} | |||||
//如果结果不为空 就删除之前的 插入最新的数据 | |||||
if (CollUtil.isNotEmpty(res)) { | |||||
//计算增长率 | |||||
computeRates(res); | |||||
List<CockpitStats> list = cockpitStatsService.list(); | |||||
List<Long> ids = list.stream().map(CockpitStats::getId).collect(Collectors.toList()); | |||||
cockpitStatsService.removeByIds(ids); | |||||
cockpitStatsService.saveBatch(res); | |||||
} | |||||
stopWatch.stop(); | |||||
log.info("驾驶舱数据统计任务结束====={}s", stopWatch.getTotalTimeSeconds()); | |||||
} | |||||
private void computeRates(List<CockpitStats> res) { | |||||
Map<String, CockpitStats> map = res.stream().collect(Collectors.toMap(r -> r.getRegionCode() + r.getYear(), r -> r)); | |||||
for (CockpitStats cockpitStats : res) { | |||||
if (Objects.isNull(cockpitStats.getYear())) { | |||||
continue; | |||||
} | |||||
//算增长率 | |||||
//去年的数据 用于算 增长比例 | |||||
if (cockpitStats.getYear().equals(DashboardConstant.CockpitStats.NONE_YEAR)) { | |||||
int thisYear = LocalDateTime.now().getYear(); | |||||
CockpitStats thisYearData = map.get(cockpitStats.getRegionCode() + thisYear); | |||||
CockpitStats lastYearData = map.get(cockpitStats.getRegionCode() + (thisYear - 1)); | |||||
buildMonitorRise(cockpitStats, thisYearData, lastYearData); | |||||
} else { | |||||
CockpitStats lastYearData = map.get(cockpitStats.getRegionCode() + (cockpitStats.getYear() - 1)); | |||||
buildMonitorRise(cockpitStats, cockpitStats, lastYearData); | |||||
} | |||||
} | |||||
} | |||||
/** | |||||
* 统计的具体逻辑 | |||||
* | |||||
* @param regionCode | |||||
* @param regionName | |||||
* @param year | |||||
* @return | |||||
*/ | |||||
private CockpitStats statisticsData(String regionCode, String regionName, Integer year) { | |||||
CockpitStats cockpitStats = new CockpitStats(); | |||||
cockpitStats.setRegionCode(regionCode); | |||||
cockpitStats.setRegionName(regionName); | |||||
cockpitStats.setYear(year); | |||||
//申报项目 | |||||
boolean condition = Objects.nonNull(year) && !year.equals(DashboardConstant.CockpitStats.NONE_YEAR); | |||||
boolean condition1 = Objects.isNull(year) || year.equals(DashboardConstant.CockpitStats.NONE_YEAR); | |||||
List<Project> projects = projectService.list(Wrappers.lambdaQuery(Project.class) | |||||
.eq(Project::getNewest, Boolean.TRUE) | |||||
.eq(StringUtils.isNotBlank(regionCode) && !DashboardConstant.CockpitStats.TOTAL.equals(regionCode), | |||||
Project::getAreaCode, regionCode) | |||||
.eq(condition, Project::getProjectYear, year) | |||||
.in(condition1, Project::getProjectYear, years)); | |||||
//项目归集 | |||||
List<GovBizProjectApply> applieYears = applyService.list(Wrappers.lambdaQuery(GovBizProjectApply.class) | |||||
.eq(condition, | |||||
GovBizProjectApply::getBaseProjSetYear, year) | |||||
.in(condition1, | |||||
GovBizProjectApply::getBaseProjSetYear, years)); | |||||
List<String> yearProjIds = applieYears.stream().map(GovBizProjectApply::getBaseProjId) | |||||
.collect(Collectors.toList()); | |||||
List<GovBizProjectBaseinfo> baseInfos = Lists.newArrayList(); | |||||
if (CollUtil.isNotEmpty(yearProjIds)) { | |||||
baseInfos = baseinfoService.list(Wrappers.lambdaQuery(GovBizProjectBaseinfo.class) | |||||
.eq(GovBizProjectBaseinfo::getDeleted, Boolean.FALSE) | |||||
.in(GovBizProjectBaseinfo::getBaseProjId, yearProjIds)); | |||||
} | |||||
List<GovBizProjectApprove> approves = Lists.newArrayList(); | |||||
List<GovBizProjectApply> applies = Lists.newArrayList(); | |||||
List<GovBizProjectProcure> procures = Lists.newArrayList(); | |||||
List<GovBizProjectCimplement> cimplements = Lists.newArrayList(); | |||||
if (CollUtil.isNotEmpty(baseInfos)) { | |||||
List<String> baseProjIds = baseInfos.stream().map(GovBizProjectBaseinfo::getBaseProjId).collect(Collectors.toList()); | |||||
approves = approveService.list(Wrappers.lambdaQuery(GovBizProjectApprove.class) | |||||
.in(GovBizProjectApprove::getBaseProjId, baseProjIds)); | |||||
applies = applyService.list(Wrappers.lambdaQuery(GovBizProjectApply.class) | |||||
.in(GovBizProjectApply::getBaseProjId, baseProjIds)); | |||||
procures = procureService.list(Wrappers.lambdaQuery(GovBizProjectProcure.class) | |||||
.in(GovBizProjectProcure::getBaseProjId, baseProjIds)); | |||||
cimplements = cimplementService.list(Wrappers.lambdaQuery(GovBizProjectCimplement.class) | |||||
.in(GovBizProjectCimplement::getBaseProjId, baseProjIds)); | |||||
} | |||||
//1.项目监测 | |||||
//1.1 超期在建项目 | |||||
Integer overdueConstructionProjectsNum = (int) projects.stream().filter(p -> { | |||||
if (Objects.nonNull(p.getPlanAcceptanceTime()) && | |||||
p.getPlanAcceptanceTime().compareTo(LocalDateTime.now()) < 0 && | |||||
Objects.nonNull(p.getStatus()) && p.getStatus().compareTo(ProjectStatus.ACCEPTED.getCode()) < 0) { | |||||
return Boolean.TRUE; | |||||
} | |||||
return Boolean.FALSE; | |||||
}).count(); | |||||
cockpitStats.setMonitorOverdueConstructionProjectsNum(overdueConstructionProjectsNum); | |||||
//1.2 环节滞后项目 | |||||
cockpitStats.setMonitorLaggingProjectsNum(computeLagging(projects)); | |||||
//1.3预审驳回项目 | |||||
Integer preFailed = (int) projects.stream().filter(p -> { | |||||
if (Objects.nonNull(p.getStatus()) && | |||||
p.getStatus().equals(ProjectStatus.PREQUALIFICATION_FAILED.getCode())) { | |||||
return Boolean.TRUE; | |||||
} | |||||
return Boolean.FALSE; | |||||
}).count(); | |||||
cockpitStats.setMonitorRejectedPreReviewProjectsNum(preFailed); | |||||
//1.4 建设方案评审失败 | |||||
Integer constructionFailed = (int) projects.stream().filter(p -> { | |||||
if (Objects.nonNull(p.getStatus()) && p.getStatus().equals(ProjectStatus.SCHEME_REVIEW_FAILED.getCode())) { | |||||
return Boolean.TRUE; | |||||
} | |||||
return Boolean.FALSE; | |||||
}).count(); | |||||
cockpitStats.setMonitorRejectedApproveProjectsNum(constructionFailed); | |||||
//1.5 验收不达标 | |||||
cockpitStats.setMonitorAcceptConditionsNotStandardsNum(0); | |||||
//1.6 总申报金额 | |||||
double totalDeclaredAmount = projects.stream().mapToDouble(p -> Objects.nonNull(p.getDeclareAmount()) ? p.getDeclareAmount().doubleValue() : 0.0).sum(); | |||||
cockpitStats.setMonitorDeclaredAmount(BigDecimal.valueOf(totalDeclaredAmount)); | |||||
//1.7 总安全投入 | |||||
double totalSafetyAmount = projects.stream().mapToDouble(p -> { | |||||
if (Objects.nonNull(p.getSafetyInputDescribe())) { | |||||
final Double[] total = {0.0}; | |||||
try { | |||||
JSONArray array = JSON.parseArray(p.getSafetyInputDescribe()); | |||||
array.forEach(j -> { | |||||
JSONObject json = JSON.parseObject(JSON.toJSONString(j)); | |||||
Double safetyInputAmount = json.getDouble(DashboardConstant.Protrait.FEILD_SAFETYMONEY); | |||||
total[0] += safetyInputAmount; | |||||
}); | |||||
} catch (Exception e) { | |||||
} | |||||
return total[0]; | |||||
} | |||||
return 0.0; | |||||
}).sum(); | |||||
cockpitStats.setMonitorSafetyInputAmount(BigDecimal.valueOf(totalSafetyAmount)); | |||||
//1.8等保密评 | |||||
SecrecyPasswordGradePO secrecyPasswordGradePo = cockpitStatsService.getSecrecyPasswordGrade(regionCode, year); | |||||
Integer guijiSecerecyGrade1 = 0; | |||||
Integer guijiSecerecyGrade2 = 0; | |||||
Integer guijiSecerecyGrade3 = 0; | |||||
Integer guijiSecerecyGrade4 = 0; | |||||
Integer guijiSecerecyGrade5 = 0; | |||||
//项目归集 评审信息 | |||||
for (GovBizProjectApprove approve : approves) { | |||||
String equalProtectionLevel = approve.getEqualProtectionLevel(); | |||||
if (StringUtils.isNotBlank(equalProtectionLevel)) { | |||||
switch (equalProtectionLevel) { | |||||
case "01": | |||||
guijiSecerecyGrade1++; | |||||
break; | |||||
case "02": | |||||
guijiSecerecyGrade2++; | |||||
break; | |||||
case "03": | |||||
guijiSecerecyGrade3++; | |||||
break; | |||||
case "04": | |||||
guijiSecerecyGrade4++; | |||||
break; | |||||
case "05": | |||||
guijiSecerecyGrade5++; | |||||
break; | |||||
default: | |||||
break; | |||||
} | |||||
} | |||||
} | |||||
Integer passwordGradeNumGov = 0; | |||||
for (GovBizProjectCimplement cimplement : cimplements) { | |||||
if (StringUtils.isNotBlank(cimplement.getBaseInforLevelFile())) { | |||||
passwordGradeNumGov++; | |||||
} | |||||
} | |||||
if (Objects.nonNull(secrecyPasswordGradePo)) { | |||||
cockpitStats.setMonitorSecrecyGrade1Num(secrecyPasswordGradePo.getMonitorSecrecyGrade1Num() + guijiSecerecyGrade1); | |||||
cockpitStats.setMonitorSecrecyGrade2Num(secrecyPasswordGradePo.getMonitorSecrecyGrade2Num() + guijiSecerecyGrade2); | |||||
cockpitStats.setMonitorSecrecyGrade3Num(secrecyPasswordGradePo.getMonitorSecrecyGrade3Num() + guijiSecerecyGrade3); | |||||
cockpitStats.setMonitorSecrecyGrade4Num(secrecyPasswordGradePo.getMonitorSecrecyGrade4Num() + guijiSecerecyGrade4); | |||||
cockpitStats.setMonitorSecrecyGrade5Num(secrecyPasswordGradePo.getMonitorSecrecyGrade5Num() + guijiSecerecyGrade5); | |||||
cockpitStats.setMonitorPasswordGrade1Num(secrecyPasswordGradePo.getMonitorPasswordGrade1Num() + passwordGradeNumGov); | |||||
cockpitStats.setMonitorPasswordGrade2Num(secrecyPasswordGradePo.getMonitorPasswordGrade2Num()); | |||||
cockpitStats.setMonitorPasswordGrade3Num(secrecyPasswordGradePo.getMonitorPasswordGrade3Num()); | |||||
cockpitStats.setMonitorPasswordGrade4Num(secrecyPasswordGradePo.getMonitorPasswordGrade4Num()); | |||||
cockpitStats.setMonitorPasswordGrade5Num(secrecyPasswordGradePo.getMonitorPasswordGrade5Num()); | |||||
} else { | |||||
cockpitStats.setMonitorSecrecyGrade1Num(guijiSecerecyGrade1); | |||||
cockpitStats.setMonitorSecrecyGrade2Num(guijiSecerecyGrade2); | |||||
cockpitStats.setMonitorSecrecyGrade3Num(guijiSecerecyGrade3); | |||||
cockpitStats.setMonitorSecrecyGrade4Num(guijiSecerecyGrade4); | |||||
cockpitStats.setMonitorSecrecyGrade5Num(guijiSecerecyGrade5); | |||||
cockpitStats.setMonitorPasswordGrade1Num(passwordGradeNumGov); | |||||
} | |||||
//2.专家统计 | |||||
List<String> lsRegionCodes = RegionConst.LS_ARR; | |||||
List<ExpertIntentionWorkRegion> intentions = expertIntentionWorkRegionService.list(Wrappers.lambdaQuery(ExpertIntentionWorkRegion.class) | |||||
.eq(StringUtils.isNotBlank(regionCode) && !DashboardConstant.CockpitStats.TOTAL.equals(regionCode), | |||||
ExpertIntentionWorkRegion::getRegionCode, regionCode) | |||||
.in(StringUtils.isBlank(regionCode) || DashboardConstant.CockpitStats.TOTAL.equals(regionCode), | |||||
ExpertIntentionWorkRegion::getRegionCode, lsRegionCodes)); | |||||
List<ExpertUserFullInfo> experts = Lists.newArrayList(); | |||||
if (CollUtil.isNotEmpty(intentions)) { | |||||
List<Long> userIds = intentions.stream().map(ExpertIntentionWorkRegion::getUserId) | |||||
.collect(Collectors.toList()); | |||||
experts = expertUserFullInfoService.list(Wrappers.lambdaQuery(ExpertUserFullInfo.class) | |||||
.in(ExpertUserFullInfo::getUserId, userIds)); | |||||
} | |||||
List<ExpertTag> goodAt = expertTagService.list(Wrappers.lambdaQuery(ExpertTag.class)); | |||||
Map<Long, List<ExpertTag>> tagMap = goodAt.stream() | |||||
.collect(Collectors.groupingBy(ExpertTag::getUserId)); | |||||
String networkCode = DashboardConstant.Expert.NETWORK_CODE; | |||||
String xinchuangCode = DashboardConstant.Expert.XINCHUANG_CODE; | |||||
String fanganCode = DashboardConstant.Expert.FANGAN_CODE; | |||||
String jishuCode = DashboardConstant.Expert.JISHU_CODE; | |||||
String dangzhengCode = DashboardConstant.Expert.DANGZHENG_CODE; | |||||
String ruanyingCode = DashboardConstant.Expert.RUANYING_CODE; | |||||
String caiwuCode = DashboardConstant.Expert.CAIWU_CODE; | |||||
List<String> specialTags = Lists.newArrayList(networkCode, xinchuangCode, fanganCode, jishuCode, | |||||
dangzhengCode, ruanyingCode, caiwuCode); | |||||
cockpitStats.setExpertTotalNum(experts.size()); | |||||
Integer financialNum = 0; | |||||
Integer networkSecurityNum = 0; | |||||
Integer xinchuangNum = 0; | |||||
Integer planRationalityNum = 0; | |||||
Integer promotionInfoTechnologyNum = 0; | |||||
Integer partyGovInfoNum = 0; | |||||
Integer softHardPricingNum = 0; | |||||
Integer technicalFeasibilityAssessmentNum = 0; | |||||
Integer specialExpertNum = 0; | |||||
for (ExpertUserFullInfo e : experts) { | |||||
if (tagMap.containsKey(e.getUserId())) { | |||||
List<ExpertTag> expertTags = tagMap.get(e.getUserId()); | |||||
boolean isContain = Boolean.FALSE; | |||||
for (ExpertTag expertTag : expertTags) { | |||||
if (expertTag.getTagCode().equals(networkCode)) { | |||||
networkSecurityNum++; | |||||
} | |||||
if (expertTag.getTagCode().equals(caiwuCode)) { | |||||
financialNum++; | |||||
} | |||||
if (expertTag.getTagCode().equals(xinchuangCode)) { | |||||
xinchuangNum++; | |||||
} | |||||
if (expertTag.getTagCode().equals(fanganCode)) { | |||||
planRationalityNum++; | |||||
} | |||||
if (expertTag.getTagCode().equals(jishuCode)) { | |||||
technicalFeasibilityAssessmentNum++; | |||||
} | |||||
if (expertTag.getTagCode().equals(dangzhengCode)) { | |||||
partyGovInfoNum++; | |||||
} | |||||
if (expertTag.getTagCode().equals(ruanyingCode)) { | |||||
softHardPricingNum++; | |||||
} | |||||
if (specialTags.contains(expertTag.getTagCode())) { | |||||
isContain = Boolean.TRUE; | |||||
} | |||||
} | |||||
if (isContain) { | |||||
specialExpertNum++; | |||||
} | |||||
} | |||||
} | |||||
//财务专家 | |||||
cockpitStats.setExpertFinancialNum(financialNum); | |||||
//网络安全 | |||||
cockpitStats.setExpertNetworkSecurityNum(networkSecurityNum); | |||||
cockpitStats.setExpertXinchuangNum(xinchuangNum); | |||||
cockpitStats.setExpertPlanRationalityNum(planRationalityNum); | |||||
cockpitStats.setExpertPromotionInfoTechnologyNum(promotionInfoTechnologyNum); | |||||
cockpitStats.setExpertPartyGovInfoNum(partyGovInfoNum); | |||||
cockpitStats.setExpertSoftHardPricingNum(softHardPricingNum); | |||||
cockpitStats.setExpertTechnicalFeasibilityAssessmentNum(technicalFeasibilityAssessmentNum); | |||||
cockpitStats.setSpecialExpertNum(specialExpertNum); | |||||
//3.顶部数据 | |||||
//3.1 计划项目数(申报项目:完成年度计划的项目总数 | |||||
// 项目归集:评审中、待立项、已立项、已采购、已初验、已终验项目总和) | |||||
Integer planProjectNum = (int) projects.stream().filter(p -> { | |||||
if (Objects.nonNull(p.getStatus()) && | |||||
p.getStatus().compareTo(ProjectStatus.PENDING_PREQUALIFICATION.getCode()) >= 0) { | |||||
return Boolean.TRUE; | |||||
} | |||||
return Boolean.FALSE; | |||||
}).count(); | |||||
Integer planProjectNumGov = (int) baseInfos.stream().filter(p -> { | |||||
if (Objects.nonNull(p.getBaseProjSetProg()) && | |||||
//排除 已驳回 已终止 | |||||
(!Lists.newArrayList(GovProjectStatusEnum.REJECTED.getCode(), | |||||
GovProjectStatusEnum.TERMINATED.getCode()).contains(p.getBaseProjSetProg()))) { | |||||
return Boolean.TRUE; | |||||
} | |||||
return Boolean.FALSE; | |||||
}).count(); | |||||
cockpitStats.setTopPlanProjectsNum(planProjectNum + planProjectNumGov); | |||||
//3.2 批复项目数(申报项目:完成立项批复流程项目总数 项目归集:已立项、已采购、已初验、已终验项目总和) | |||||
Integer approvalNumDeclared = (int) projects.stream().filter(p -> { | |||||
if (Objects.nonNull(p.getApprovalAmount())) { | |||||
return Boolean.TRUE; | |||||
} | |||||
return Boolean.FALSE; | |||||
}).count(); | |||||
Integer approvalNumGov = (int) baseInfos.stream().filter(p -> { | |||||
if (Objects.nonNull(p.getBaseProjSetProg()) && Lists.newArrayList(GovProjectStatusEnum.APPROVED.getCode(), | |||||
GovProjectStatusEnum.PURCHASED.getCode(), GovProjectStatusEnum.HAS_PRE_INS.getCode(), | |||||
GovProjectStatusEnum.HAS_FINAL_INS.getCode()).contains(p.getBaseProjSetProg())) { | |||||
return Boolean.TRUE; | |||||
} | |||||
return Boolean.FALSE; | |||||
}).count(); | |||||
BigDecimal approvalAmount = projects.stream().filter(p -> { | |||||
if (Objects.nonNull(p.getApprovalAmount())) { | |||||
return Boolean.TRUE; | |||||
} | |||||
return Boolean.FALSE; | |||||
}).map(Project::getApprovalAmount).reduce(BigDecimal::add).orElse(BigDecimal.ZERO); | |||||
BigDecimal approvalAmountGov = approves.stream() | |||||
.map(GovBizProjectApprove::getBaseInitialReviewTotalMoney) | |||||
.filter(Objects::nonNull) | |||||
.reduce(BigDecimal::add) | |||||
.orElse(BigDecimal.ZERO); | |||||
cockpitStats.setTopApprovalProjectsNum(approvalNumDeclared + approvalNumGov); | |||||
cockpitStats.setTopApprovalProjectsAmount(approvalAmount.add(approvalAmountGov)); | |||||
//3.3 平均建设周期 | |||||
OptionalDouble od = Stream.concat(projects.stream().map(Project::getBuildCycle), | |||||
applies.stream().map(GovBizProjectApply::getBaseProjDuration)).mapToInt(c -> { | |||||
try { | |||||
return Integer.parseInt(c); | |||||
} catch (Exception e) { | |||||
return 0; | |||||
} | |||||
}).average(); | |||||
double average = od.isPresent() ? od.getAsDouble() : 0.0; | |||||
cockpitStats.setTopAverageConstructionPeriod((int) average); | |||||
//3.4 在建项目数 采购备案后的项目 | |||||
Integer constructionNum = (int) projects.stream().filter(p -> { | |||||
if (Objects.nonNull(p.getStatus()) && | |||||
p.getStatus().compareTo(ProjectStatus.TO_BE_PURCHASED.getCode()) >= 0 | |||||
&& p.getStatus().compareTo(ProjectStatus.ACCEPTED.getCode()) < 0) { | |||||
return Boolean.TRUE; | |||||
} | |||||
return Boolean.FALSE; | |||||
}).count(); | |||||
Integer constructionNumGov = (int) baseInfos.stream().filter(b -> { | |||||
if (Objects.nonNull(b.getBaseProjSetProg()) && | |||||
Lists.newArrayList(GovProjectStatusEnum.PURCHASED.getCode(), GovProjectStatusEnum.HAS_PRE_INS.getCode()).contains(b.getBaseProjSetProg())) { | |||||
return Boolean.TRUE; | |||||
} | |||||
return Boolean.FALSE; | |||||
}).count(); | |||||
cockpitStats.setTopOngoingProjectsNum(constructionNum + constructionNumGov); | |||||
//4.地图 只要放总数 取的时候 会有逻辑(也要取项目归集) | |||||
cockpitStats.setProjectsTotal(projects.size() + baseInfos.size()); | |||||
//5.下面项目状态数 | |||||
//5.1 计划(申报项目:项目预审完成到年度计划未完成 项目归集:评审中) | |||||
Integer inPlanNum = (int) projects.stream().filter(p -> { | |||||
if (Objects.nonNull(p.getStatus()) && | |||||
p.getStatus().compareTo(ProjectStatus.PREQUALIFICATION_FAILED.getCode()) > 0 && | |||||
p.getStatus().compareTo(ProjectStatus.IN_THE_ANNUAL_PLAN.getCode()) <= 0) { | |||||
return Boolean.TRUE; | |||||
} | |||||
return Boolean.FALSE; | |||||
}).count(); | |||||
Integer inPlanNumGov = (int) baseInfos.stream().filter(p -> { | |||||
if (Objects.nonNull(p.getBaseProjSetProg()) && | |||||
p.getBaseProjSetProg().equals(GovProjectStatusEnum.APPROVAL.getCode())) { | |||||
return Boolean.TRUE; | |||||
} | |||||
return Boolean.FALSE; | |||||
}).count(); | |||||
cockpitStats.setProjectsTotalPlan(inPlanNum + inPlanNumGov); | |||||
//5.2 处于申报(申报项目:年度计划完成到建设方案审批第一个节点审批未通过前 项目归集:待立项) | |||||
Integer inApplyNum = (int) projects.stream().filter(p -> { | |||||
if (Objects.nonNull(p.getStatus()) && | |||||
(ProjectStatus.PLAN_TO_BE_DECLARED.getCode().equals(p.getStatus()) || | |||||
(ProjectStatus.SCHEME_UNDER_REVIEW.getCode().equals(p.getStatus()) && | |||||
searchSchemaReviewFlow(p.getProjectCode())))) { | |||||
return Boolean.TRUE; | |||||
} | |||||
return Boolean.FALSE; | |||||
}).count(); | |||||
Integer inApplyNumGov = (int) baseInfos.stream().filter(p -> { | |||||
if (Objects.nonNull(p.getBaseProjSetProg()) && | |||||
p.getBaseProjSetProg().equals(GovProjectStatusEnum.PENDING.getCode())) { | |||||
return Boolean.TRUE; | |||||
} | |||||
return Boolean.FALSE; | |||||
}).count(); | |||||
cockpitStats.setProjectsTotalApply(inApplyNum + inApplyNumGov); | |||||
//5.3 处于审批 (申报项目:建设方案审批第一个节点审批通过到立项批复未完成 项目归集:已立项) | |||||
Integer inApproveNum = (int) projects.stream().filter(p -> { | |||||
if (Objects.nonNull(p.getStatus()) && | |||||
(ProjectStatus.TO_BE_APPROVED.getCode().equals(p.getStatus()) || | |||||
p.getStatus().compareTo(ProjectStatus.APPROVED_AFTER_CHOICE.getCode()) > 0 || | |||||
(ProjectStatus.SCHEME_UNDER_REVIEW.getCode().equals(p.getStatus()) && | |||||
searchSchemaReviewedFlow(p.getProjectCode())))) { | |||||
return Boolean.TRUE; | |||||
} | |||||
return Boolean.FALSE; | |||||
}).count(); | |||||
Integer inApproveNumGov = (int) baseInfos.stream().filter(p -> { | |||||
if (Objects.nonNull(p.getBaseProjSetProg()) && | |||||
p.getBaseProjSetProg().equals(GovProjectStatusEnum.APPROVED.getCode())) { | |||||
return Boolean.TRUE; | |||||
} | |||||
return Boolean.FALSE; | |||||
}).count(); | |||||
cockpitStats.setProjectsTotalApprove(inApproveNum + inApproveNumGov); | |||||
//5.4 建设 (申报项目:立项批复完成到项目初验未完成 项目归集:已采购) | |||||
Integer inConstructionNum = (int) projects.stream().filter(p -> { | |||||
if (Objects.nonNull(p.getStatus()) && | |||||
(p.getStatus().compareTo(ProjectStatus.APPROVED_AFTER_CHOICE.getCode()) > 0 && | |||||
p.getStatus().compareTo(ProjectStatus.UNDER_CONSTRUCTION.getCode()) < 0) || | |||||
//如果在建设中 那么初验材料为空代表 初验未完成 | |||||
(p.getStatus().equals(ProjectStatus.UNDER_CONSTRUCTION.getCode()) /*&& | |||||
StringUtils.isBlank(p.getPreliminaryInspectionMaterials())*/)) { | |||||
return Boolean.TRUE; | |||||
} | |||||
return Boolean.FALSE; | |||||
}).count(); | |||||
Integer inConstructionNumGov = (int) baseInfos.stream().filter(p -> { | |||||
if (Objects.nonNull(p.getBaseProjSetProg()) && | |||||
p.getBaseProjSetProg().equals(GovProjectStatusEnum.PURCHASED.getCode())) { | |||||
return Boolean.TRUE; | |||||
} | |||||
return Boolean.FALSE; | |||||
}).count(); | |||||
cockpitStats.setProjectsTotalConstruction(inConstructionNum + inConstructionNumGov); | |||||
//5.5 验收 (申报项目:项目初验完成到项目终验未完成 项目归集:已初验) | |||||
List<Project> inAcceptProjects = projects.stream().filter(p -> { | |||||
if (Objects.nonNull(p.getStatus()) && | |||||
p.getStatus().compareTo(ProjectStatus.UNDER_CONSTRUCTION.getCode()) > 0 && | |||||
p.getStatus().compareTo(ProjectStatus.ACCEPTED.getCode()) < 0 || | |||||
//如果在建设中 那么初验材料不为空代表 初验完成 | |||||
(p.getStatus().equals(ProjectStatus.UNDER_CONSTRUCTION.getCode()) /*&& | |||||
StringUtils.isNotBlank(p.getPreliminaryInspectionMaterials())*/)) { | |||||
return Boolean.TRUE; | |||||
} | |||||
return Boolean.FALSE; | |||||
}).collect(Collectors.toList()); | |||||
List<GovBizProjectBaseinfo> inAcceptProjectsGov = baseInfos.stream().filter(b -> { | |||||
if (Objects.nonNull(b.getBaseProjSetProg()) && | |||||
b.getBaseProjSetProg().equals(GovProjectStatusEnum.HAS_PRE_INS.getCode())) { | |||||
return Boolean.TRUE; | |||||
} | |||||
return Boolean.FALSE; | |||||
}).collect(Collectors.toList()); | |||||
cockpitStats.setProjectsTotalAccept(inAcceptProjects.size() + inAcceptProjectsGov.size()); | |||||
//5.6 运维(申报项目:项目验收完成后且项目未注销 项目归集:已终验) | |||||
List<Project> inOperationProjects = projects.stream().filter(p -> { | |||||
if (Objects.nonNull(p.getStatus()) && | |||||
p.getStatus().equals(ProjectStatus.ACCEPTED.getCode())) { | |||||
return Boolean.TRUE; | |||||
} | |||||
return Boolean.FALSE; | |||||
}).collect(Collectors.toList()); | |||||
int inOperationProjectsGov = (int) baseInfos.stream().filter(b -> { | |||||
if (Objects.nonNull(b.getBaseProjSetProg()) && | |||||
b.getBaseProjSetProg().equals(GovProjectStatusEnum.HAS_FINAL_INS.getCode())) { | |||||
return Boolean.TRUE; | |||||
} | |||||
return Boolean.FALSE; | |||||
}).count(); | |||||
cockpitStats.setProjectsTotalOperation(inOperationProjects.size() + inOperationProjectsGov); | |||||
//5.7 绩效(申报项目:项目验收完成后且未完成绩效自评 项目归集:无) | |||||
List<String> inAcceptCodes = inOperationProjects.stream().map(Project::getProjectCode).collect(Collectors.toList()); | |||||
List<PerformanceAppraisalProject> performances = performanceAppraisalProjectService.list(Wrappers.lambdaQuery(PerformanceAppraisalProject.class) | |||||
.in(CollUtil.isNotEmpty(inAcceptCodes), PerformanceAppraisalProject::getProjectCode, inAcceptCodes) | |||||
.in(CollUtil.isEmpty(inAcceptCodes), PerformanceAppraisalProject::getProjectCode, Lists.newArrayList("NONE")) | |||||
.eq(PerformanceAppraisalProject::getIsReAppraisal, Boolean.TRUE) | |||||
.isNull(PerformanceAppraisalProject::getReAppraisalTotalScore) | |||||
); | |||||
cockpitStats.setProjectsTotalPerformance(performances.size()); | |||||
cockpitStats.setProjectsTotalLogOff(0); | |||||
//6.项目效益 | |||||
cockpitStats.setExcellentBestAppNum(0); | |||||
cockpitStats.setExcellentMajorAppNum(0); | |||||
cockpitStats.setExcellentCrossLevelSharingNum(0); | |||||
cockpitStats.setExcellentMajorAppNum(0); | |||||
//7.2驳回节约资金 | |||||
List<Project> rejectPreProjects = projects.stream().filter(p -> { | |||||
if (Objects.nonNull(p.getStatus()) && | |||||
p.getStatus().equals(ProjectStatus.PREQUALIFICATION_FAILED.getCode())) { | |||||
return Boolean.TRUE; | |||||
} | |||||
return Boolean.FALSE; | |||||
}).collect(Collectors.toList()); | |||||
BigDecimal rejectPreSum = rejectPreProjects.stream().map(p -> { | |||||
if (Objects.nonNull(p.getDeclareAmount())) { | |||||
return p.getDeclareAmount(); | |||||
} | |||||
return BigDecimal.ZERO; | |||||
}).reduce(BigDecimal::add).orElse(BigDecimal.ZERO); | |||||
cockpitStats.setRejectSavingsFunds(rejectPreSum); | |||||
//7.3 柱状图 | |||||
//7.3.1 申报状态的3个资金 | |||||
// projects.stream() | |||||
//首先完成年度计划 并且未注销的项目 | |||||
List<Project> normalProjects = projects.stream().filter(p -> { | |||||
if (Objects.nonNull(p.getStatus()) && | |||||
p.getStatus().compareTo(ProjectStatus.BE_SUSPENDED.getCode()) > 0) { | |||||
return Boolean.TRUE; | |||||
} | |||||
return Boolean.FALSE; | |||||
}).collect(Collectors.toList()); | |||||
//申报的申报金额(申报项目:初步方案申报金额 项目归集:项目总投资) | |||||
final BigDecimal[] declaredAmountApprove = {BigDecimal.ZERO}; | |||||
normalProjects.stream().map(p -> ObjectUtil.defaultIfNull(p.getDeclareAmount(), BigDecimal.ZERO)) | |||||
.reduce(BigDecimal::add).ifPresent(b -> declaredAmountApprove[0] = b); | |||||
final BigDecimal[] declaredAmountApproveGov = {BigDecimal.ZERO}; | |||||
applies.stream().map(g -> ObjectUtil.defaultIfNull(g.getBaseProjTotalAmount(), BigDecimal.ZERO)) | |||||
.reduce(BigDecimal::add).ifPresent(b -> declaredAmountApproveGov[0] = b); | |||||
BigDecimal declaredAmountApproveTotal = declaredAmountApprove[0].add(declaredAmountApproveGov[0]); | |||||
cockpitStats.setDeclaredAmountApprove(declaredAmountApproveTotal); | |||||
//申报的批复金额(申报项目:建设方案申报金额 项目归集:建议总投资) | |||||
final BigDecimal[] approvalAmountApprove = {BigDecimal.ZERO}; | |||||
normalProjects.stream().map(p -> ObjectUtil.defaultIfNull(p.getApprovalAmount(), BigDecimal.ZERO)) | |||||
.reduce(BigDecimal::add).ifPresent(b -> approvalAmountApprove[0] = b); | |||||
final BigDecimal[] approvalAmountApproveGov = {BigDecimal.ZERO}; | |||||
approves.stream().map(p -> ObjectUtil.defaultIfNull(p.getBaseExpertTotalMoney(), BigDecimal.ZERO)) | |||||
.reduce(BigDecimal::add).ifPresent(b -> approvalAmountApproveGov[0] = b); | |||||
BigDecimal approvalAmountApproveTotal = approvalAmountApprove[0].add(approvalAmountApproveGov[0]); | |||||
cockpitStats.setApprovalAmountApprove(approvalAmountApproveTotal); | |||||
//申报的差额 | |||||
BigDecimal subtractApprove = declaredAmountApproveTotal.subtract(approvalAmountApproveTotal); | |||||
cockpitStats.setDifferenceApprove(subtractApprove); | |||||
//批复的申报金额(申报项目:建设方案申报金额 项目归集:建议总投资) | |||||
cockpitStats.setDeclaredAmountApproval(approvalAmountApproveTotal); | |||||
//批复的批复金额(申报项目:归集信息建议批复总投资 项目归集:建议批复总投资) | |||||
final BigDecimal[] approvalAmountApproval = {BigDecimal.ZERO}; | |||||
normalProjects.stream().map(p -> ObjectUtil.defaultIfNull(p.getProposeTotalInvest(), BigDecimal.ZERO)) | |||||
.reduce(BigDecimal::add).ifPresent(b -> approvalAmountApproval[0] = b); | |||||
final BigDecimal[] approvalAmountApprovalGov = {BigDecimal.ZERO}; | |||||
approves.stream().map(p -> ObjectUtil.defaultIfNull(p.getBaseInitialReviewTotalMoney(), BigDecimal.ZERO)) | |||||
.reduce(BigDecimal::add).ifPresent(b -> approvalAmountApprovalGov[0] = b); | |||||
BigDecimal approvalAmountApprovalTotal = approvalAmountApproval[0].add(approvalAmountApprovalGov[0]); | |||||
cockpitStats.setApprovalAmountApproval(approvalAmountApprovalTotal); | |||||
//批复的差额 | |||||
BigDecimal subtractApproval = approvalAmountApproveTotal.subtract(approvalAmountApprovalTotal); | |||||
cockpitStats.setDifferenceApproval(subtractApproval); | |||||
//合同的申报金额(申报项目:归集信息建议批复总投资 项目归集:建议批复总投资) | |||||
cockpitStats.setDeclaredAmountContract(approvalAmountApprovalTotal); | |||||
//合同的批复金额(申报项目:成交金额 项目归集:成交金额) | |||||
final BigDecimal[] approvalAmountContract = {BigDecimal.ZERO}; | |||||
normalProjects.stream().map(p -> Objects.nonNull(p.getTransactionAmount()) ? p.getTransactionAmount() : BigDecimal.ZERO) | |||||
.reduce(BigDecimal::add).ifPresent(b -> approvalAmountContract[0] = b); | |||||
final BigDecimal[] approvalAmountContractGov = {BigDecimal.ZERO}; | |||||
procures.stream().map(p -> Objects.nonNull(p.getBaseProjPurchaseAmount()) ? | |||||
p.getBaseProjPurchaseAmount() : BigDecimal.ZERO).reduce(BigDecimal::add) | |||||
.ifPresent(b -> approvalAmountContractGov[0] = b); | |||||
BigDecimal approvalAmountContractTotal = approvalAmountContract[0].add(approvalAmountContractGov[0]); | |||||
cockpitStats.setApprovalAmountContract(approvalAmountContractTotal); | |||||
//合同的差额 | |||||
BigDecimal subtractContract = approvalAmountApprovalTotal.subtract(approvalAmountContractTotal); | |||||
cockpitStats.setDifferenceContract(subtractContract); | |||||
//7 核减资金 | |||||
cockpitStats.setReduceFundsTotal(subtractApprove.add(subtractApproval).add(subtractContract)); | |||||
//8 产出数据 | |||||
cockpitStats.setProduceAppNum(0); | |||||
cockpitStats.setProduceDataNum(0); | |||||
cockpitStats.setProduceComponentNum(0); | |||||
cockpitStats.setProduceBrainElementsNum(0); | |||||
//9.绩效 | |||||
List<String> projectCodes = projects.stream().map(Project::getProjectCode).collect(Collectors.toList()); | |||||
if (CollUtil.isNotEmpty(projectCodes)) { | |||||
List<PerformanceAppraisalProject> performanceAll = performanceAppraisalProjectService.list(Wrappers.lambdaQuery(PerformanceAppraisalProject.class) | |||||
.in(PerformanceAppraisalProject::getProjectCode, projectCodes)); | |||||
List<PerformanceAppraisalProject> verified = performanceAll.stream().filter(p -> { | |||||
if (Objects.nonNull(p.getVerifyTotalScore())) { | |||||
return Boolean.TRUE; | |||||
} | |||||
return Boolean.FALSE; | |||||
}).sorted(Comparator.comparing(PerformanceAppraisalProject::getVerifyTotalScore).reversed()) | |||||
.collect(Collectors.toList()); | |||||
List<PerformanceAppraisalProject> start5 = performanceAll.stream().filter(p -> { | |||||
if (Objects.nonNull(p.getVerifyTotalScore()) | |||||
&& p.getVerifyTotalScore().compareTo(BigDecimal.valueOf(80)) > 0) { | |||||
return Boolean.TRUE; | |||||
} | |||||
return Boolean.FALSE; | |||||
}).sorted(Comparator.comparing(PerformanceAppraisalProject::getVerifyTotalScore).reversed()) | |||||
.collect(Collectors.toList()); | |||||
List<PerformanceAppraisalProject> start4 = performanceAll.stream().filter(p -> { | |||||
if (Objects.nonNull(p.getVerifyTotalScore()) | |||||
&& p.getVerifyTotalScore().compareTo(BigDecimal.valueOf(60)) >= 0 | |||||
&& p.getVerifyTotalScore().compareTo(BigDecimal.valueOf(80)) < 0) { | |||||
return Boolean.TRUE; | |||||
} | |||||
return Boolean.FALSE; | |||||
}).sorted(Comparator.comparing(PerformanceAppraisalProject::getVerifyTotalScore).reversed()) | |||||
.collect(Collectors.toList()); | |||||
List<PerformanceAppraisalProject> start3 = performanceAll.stream().filter(p -> { | |||||
if (Objects.nonNull(p.getVerifyTotalScore()) | |||||
&& p.getVerifyTotalScore().compareTo(BigDecimal.valueOf(40)) >= 0 | |||||
&& p.getVerifyTotalScore().compareTo(BigDecimal.valueOf(60)) < 0) { | |||||
return Boolean.TRUE; | |||||
} | |||||
return Boolean.FALSE; | |||||
}).sorted(Comparator.comparing(PerformanceAppraisalProject::getVerifyTotalScore).reversed()) | |||||
.collect(Collectors.toList()); | |||||
List<PerformanceAppraisalProject> start2 = performanceAll.stream().filter(p -> { | |||||
if (Objects.nonNull(p.getVerifyTotalScore()) | |||||
&& p.getVerifyTotalScore().compareTo(BigDecimal.valueOf(20)) >= 0 | |||||
&& p.getVerifyTotalScore().compareTo(BigDecimal.valueOf(40)) < 0) { | |||||
return Boolean.TRUE; | |||||
} | |||||
return Boolean.FALSE; | |||||
}).sorted(Comparator.comparing(PerformanceAppraisalProject::getVerifyTotalScore).reversed()) | |||||
.collect(Collectors.toList()); | |||||
List<PerformanceAppraisalProject> start1 = performanceAll.stream().filter(p -> { | |||||
if (Objects.nonNull(p.getVerifyTotalScore()) | |||||
&& p.getVerifyTotalScore().compareTo(BigDecimal.ZERO) >= 0 | |||||
&& p.getVerifyTotalScore().compareTo(BigDecimal.valueOf(20)) < 0) { | |||||
return Boolean.TRUE; | |||||
} | |||||
return Boolean.FALSE; | |||||
}).sorted(Comparator.comparing(PerformanceAppraisalProject::getVerifyTotalScore).reversed()) | |||||
.collect(Collectors.toList()); | |||||
cockpitStats.setPerformanceTotal(performanceAll.size()); | |||||
cockpitStats.setPerformanceReviewedTotal(verified.size()); | |||||
cockpitStats.setPerformanceTobeReviewTotal(performanceAll.size() - verified.size()); | |||||
cockpitStats.setPerformanceTop1Score(BigDecimal.valueOf(start1.size())); | |||||
cockpitStats.setPerformanceTop2Score(BigDecimal.valueOf(start2.size())); | |||||
cockpitStats.setPerformanceTop3Score(BigDecimal.valueOf(start3.size())); | |||||
cockpitStats.setPerformanceTop4Score(BigDecimal.valueOf(start4.size())); | |||||
cockpitStats.setPerformanceTop5Score(BigDecimal.valueOf(start5.size())); | |||||
} | |||||
return cockpitStats; | |||||
} | |||||
/** | |||||
* 建设方案申报了 但未开始审核的项目 | |||||
* | |||||
* @param projectCode | |||||
* @return | |||||
*/ | |||||
private boolean searchSchemaReviewFlow(String projectCode) { | |||||
Project project = projectService.getProjectByCode(projectCode); | |||||
if (Objects.isNull(project)) { | |||||
return Boolean.FALSE; | |||||
} | |||||
List<Long> allVersionProjectId = projectService.allVersionProjectIds(project.getProjectCode()); | |||||
ProjectInst pi = projectInstService.getOne(Wrappers.lambdaQuery(ProjectInst.class) | |||||
.in(ProjectInst::getProjectId, allVersionProjectId) | |||||
.eq(ProjectInst::getInstType, InstTypeEnum.CONSTRUCTION_PLAN_REVIEW.getCode()) | |||||
.last(BizConst.LIMIT_1)); | |||||
if (Objects.isNull(pi)) { | |||||
return Boolean.FALSE; | |||||
} | |||||
String instCode = pi.getInstCode(); | |||||
List<HistoricActivityInstance> finished = historyService.createHistoricActivityInstanceQuery() | |||||
.finished() | |||||
.processInstanceId(instCode) | |||||
.orderByHistoricActivityInstanceEndTime() | |||||
.asc() | |||||
.list(); | |||||
List<HistoricActivityInstance> unfinished = historyService.createHistoricActivityInstanceQuery() | |||||
.unfinished() | |||||
.processInstanceId(instCode) | |||||
.orderByHistoricActivityInstanceStartTime() | |||||
.asc() | |||||
.list(); | |||||
//已经完成的没有 未完成的有 则可计算 | |||||
if (CollUtil.isNotEmpty(unfinished) && CollUtil.isEmpty(finished)) { | |||||
return Boolean.TRUE; | |||||
} | |||||
return Boolean.FALSE; | |||||
} | |||||
//已经开始审批 | |||||
private boolean searchSchemaReviewedFlow(String projectCode) { | |||||
Project project = projectService.getProjectByCode(projectCode); | |||||
if (Objects.isNull(project)) { | |||||
return Boolean.FALSE; | |||||
} | |||||
List<Long> allVersionProjectId = projectService.allVersionProjectIds(project.getProjectCode()); | |||||
ProjectInst pi = projectInstService.getOne(Wrappers.lambdaQuery(ProjectInst.class) | |||||
.in(ProjectInst::getProjectId, allVersionProjectId) | |||||
.eq(ProjectInst::getInstType, InstTypeEnum.CONSTRUCTION_PLAN_REVIEW.getCode()) | |||||
.last(BizConst.LIMIT_1)); | |||||
if (Objects.isNull(pi)) { | |||||
return Boolean.FALSE; | |||||
} | |||||
String instCode = pi.getInstCode(); | |||||
List<HistoricActivityInstance> finished = historyService.createHistoricActivityInstanceQuery() | |||||
.finished() | |||||
.processInstanceId(instCode) | |||||
.orderByHistoricActivityInstanceEndTime() | |||||
.asc() | |||||
.list(); | |||||
//已经完成的 则可计算 | |||||
if (CollUtil.isNotEmpty(finished)) { | |||||
return Boolean.TRUE; | |||||
} | |||||
return Boolean.FALSE; | |||||
} | |||||
/** | |||||
* 计算环节滞后项目 | |||||
* | |||||
* @param projects | |||||
* @return | |||||
*/ | |||||
private Integer computeLagging(List<Project> projects) { | |||||
List<String> projectCodes = projects.stream().map(Project::getProjectCode).collect(Collectors.toList()); | |||||
Map<String, Project> map = projects.stream().collect(Collectors.toMap(Project::getProjectCode, p -> p)); | |||||
List<WflowEarlyWarningRecords> records = Lists.newArrayList(); | |||||
if (CollUtil.isNotEmpty(projectCodes)) { | |||||
records = earlyWarningRecordsService.list(Wrappers.lambdaQuery(WflowEarlyWarningRecords.class) | |||||
.in(WflowEarlyWarningRecords::getProjectCode, projectCodes)); | |||||
} | |||||
return records.stream().mapToInt(r -> { | |||||
if (!map.containsKey(r.getProjectCode())) { | |||||
return 0; | |||||
} | |||||
Project project = map.get(r.getProjectCode()); | |||||
//如果状态 相等 说明预警了 但是没处理 +1 | |||||
if (Objects.nonNull(project.getStatus()) && Objects.nonNull(r.getProjectStatus()) && | |||||
project.getStatus().equals(r.getProjectStatus())) { | |||||
return 1; | |||||
} | |||||
return 0; | |||||
}).sum(); | |||||
} | |||||
private void buildMonitorRise(CockpitStats cockpitStats, CockpitStats thisYearData, CockpitStats lastYearData) { | |||||
if (Objects.isNull(thisYearData) || Objects.isNull(lastYearData)) { | |||||
return; | |||||
} | |||||
cockpitStats.setMonitorOverdueConstructionProjectsRise(BizUtils.computeRise(thisYearData.getMonitorOverdueConstructionProjectsNum(), | |||||
lastYearData.getMonitorOverdueConstructionProjectsNum())); | |||||
cockpitStats.setMonitorLaggingProjectsRise(BizUtils.computeRise(thisYearData.getMonitorLaggingProjectsNum(), | |||||
lastYearData.getMonitorLaggingProjectsNum())); | |||||
cockpitStats.setMonitorRejectedApproveProjectsRise(BizUtils.computeRise(thisYearData.getMonitorRejectedApproveProjectsNum(), | |||||
lastYearData.getMonitorRejectedApproveProjectsNum())); | |||||
cockpitStats.setMonitorRejectedPreReviewProjectsRise(BizUtils.computeRise(thisYearData.getMonitorRejectedPreReviewProjectsNum(), | |||||
lastYearData.getMonitorRejectedPreReviewProjectsNum())); | |||||
cockpitStats.setMonitorAcceptConditionsNotStandardsRise(BizUtils.computeRise(thisYearData.getMonitorAcceptConditionsNotStandardsNum(), | |||||
lastYearData.getMonitorAcceptConditionsNotStandardsNum())); | |||||
} | |||||
} |
@@ -1,88 +0,0 @@ | |||||
package com.hz.pm.api.scheduler.task; | |||||
import cn.hutool.core.collection.CollUtil; | |||||
import com.alibaba.fastjson.JSON; | |||||
import com.baomidou.mybatisplus.core.toolkit.Wrappers; | |||||
import com.hz.pm.api.projectlib.model.entity.Project; | |||||
import com.hz.pm.api.projectlib.service.IProjectService; | |||||
import com.hz.pm.api.staging.contants.StagingContant; | |||||
import com.hz.pm.api.staging.model.entity.ProjectStaging; | |||||
import com.hz.pm.api.staging.service.IProjectStagingService; | |||||
import com.hz.pm.api.staging.utils.ProjectStatusFlowMapUtil; | |||||
import lombok.RequiredArgsConstructor; | |||||
import lombok.extern.slf4j.Slf4j; | |||||
import org.springframework.beans.factory.annotation.Value; | |||||
import org.springframework.scheduling.annotation.Scheduled; | |||||
import org.springframework.stereotype.Component; | |||||
import java.net.InetAddress; | |||||
import java.net.UnknownHostException; | |||||
import java.time.LocalDateTime; | |||||
import java.util.List; | |||||
import java.util.Objects; | |||||
import java.util.function.Function; | |||||
/** | |||||
* @Classname ProjectStatusFlowTask | |||||
* @Description | |||||
* @Date 2023/2/20 10:12 | |||||
* @Author PoffyZhang | |||||
*/ | |||||
@Slf4j | |||||
@Component | |||||
@RequiredArgsConstructor | |||||
public class ProjectStatusFlowTask { | |||||
private final IProjectStagingService projectStagingService; | |||||
private final IProjectService projectService; | |||||
@Value("${hostname:}") | |||||
private String HOST_NAME; | |||||
@Scheduled(cron = "0 */1 * * * ?") | |||||
public void statusFlow() throws UnknownHostException { | |||||
if (HOST_NAME.equals(InetAddress.getLocalHost().getHostName())) { | |||||
//1. 定时取 项目暂存表的数据 去进行状态继续流转 | |||||
List<ProjectStaging> stagingList = projectStagingService.list(Wrappers.lambdaQuery(ProjectStaging.class) | |||||
.eq(ProjectStaging::getDead, Boolean.FALSE) | |||||
.le(ProjectStaging::getNextTime, LocalDateTime.now()) | |||||
.le(ProjectStaging::getRetryTimes, StagingContant.Retry.MAX_RETRY_TIMES) | |||||
.orderByAsc(ProjectStaging::getProjectId)); | |||||
log.info("需要状态流转的项目 size:{} :{}", stagingList.size(), JSON.toJSONString(stagingList)); | |||||
if (CollUtil.isEmpty(stagingList)) { | |||||
log.info("没有需要状态流转的项目!"); | |||||
return; | |||||
} | |||||
//遍历 | |||||
for (ProjectStaging projectStaging : stagingList) { | |||||
try { | |||||
Project project = projectService.getById(projectStaging.getProjectId()); | |||||
if (Objects.isNull(project)) { | |||||
log.info("此项目 【{}】 不存在", projectStaging.getProjectId()); | |||||
continue; | |||||
} | |||||
//2. 用函数map 定位到 状态流转的函数 | |||||
Function<Project, Boolean> flowFunction = ProjectStatusFlowMapUtil.getFlowFunction(project.getStatus()); | |||||
if (flowFunction == null) { | |||||
log.info("此项目 【{}】 当前状态 【{}】,没有对应流转函数", projectStaging.getProjectId(), project.getStatus()); | |||||
continue; | |||||
} | |||||
//执行对应的函数 | |||||
if (flowFunction.apply(project)) { | |||||
//执行成功了 删除暂存的数据 | |||||
projectStagingService.removeById(projectStaging); | |||||
} | |||||
} catch (Exception e) { | |||||
log.error("项目流转 异常 projectId:【" + projectStaging.getProjectId() + "】 异常内容:" + e.getMessage()); | |||||
} finally { | |||||
//增加重试的次数 和下次扫描时间 | |||||
projectStagingService.addRetryTimes(projectStaging); | |||||
} | |||||
} | |||||
} | |||||
} | |||||
} |
@@ -1,44 +0,0 @@ | |||||
package com.hz.pm.api.staging.utils; | |||||
import com.google.common.collect.Maps; | |||||
import com.hz.pm.api.projectdeclared.manage.ReviewByDeptJointManage; | |||||
import com.hz.pm.api.projectdeclared.manage.ReviewByProvincialDeptManage; | |||||
import com.hz.pm.api.projectlib.model.entity.Project; | |||||
import com.hz.pm.api.projectlib.model.enumeration.status.ProjectStatus; | |||||
import org.springframework.stereotype.Component; | |||||
import java.util.Map; | |||||
import java.util.function.Function; | |||||
/** | |||||
* @Classname ProjectStatusFlowMapUtil | |||||
* @Description 状态流转 事件函数MAP | |||||
* @Date 2023/2/15 11:19 | |||||
* @Author PoffyZhang | |||||
*/ | |||||
@Component | |||||
public class ProjectStatusFlowMapUtil { | |||||
private static final Map<Integer, Function<Project, Boolean>> STATUS_FLOW_FUNCTION_MAP = Maps.newHashMap(); | |||||
public static Function<Project, Boolean> getFlowFunction(Integer status){ | |||||
return STATUS_FLOW_FUNCTION_MAP.get(status); | |||||
} | |||||
/** | |||||
* 初始化业务分派逻辑,代替了if-else部分 | |||||
* key: 枚举 状态值 | |||||
* value: lambda表达式,最终会获取发起实例的函数 | |||||
*/ | |||||
public ProjectStatusFlowMapUtil(ReviewByProvincialDeptManage provincialDeptManage, | |||||
ReviewByDeptJointManage reviewByDeptJointManage) { | |||||
//省级部门联审 | |||||
STATUS_FLOW_FUNCTION_MAP.put(ProjectStatus.JOINT_REVIEW_BY_PROVINCIAL_DEPARTMENTS.getCode(), | |||||
provincialDeptManage::startTheProcess); | |||||
//部门联审 | |||||
STATUS_FLOW_FUNCTION_MAP.put(ProjectStatus.DEPARTMENT_JOINT_REVIEW.getCode(), | |||||
reviewByDeptJointManage::startTheProcess); | |||||
} | |||||
} |
@@ -3,6 +3,7 @@ package com.hz.pm.api.todocenter.handle; | |||||
import cn.hutool.core.collection.CollUtil; | import cn.hutool.core.collection.CollUtil; | ||||
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; | import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; | ||||
import com.baomidou.mybatisplus.core.toolkit.Wrappers; | import com.baomidou.mybatisplus.core.toolkit.Wrappers; | ||||
import com.google.common.collect.Lists; | |||||
import com.hz.pm.api.common.helper.UserInfoHelper; | import com.hz.pm.api.common.helper.UserInfoHelper; | ||||
import com.hz.pm.api.common.util.StrUtils; | import com.hz.pm.api.common.util.StrUtils; | ||||
import com.hz.pm.api.projectlib.model.entity.ProjectInst; | import com.hz.pm.api.projectlib.model.entity.ProjectInst; | ||||
@@ -20,7 +21,6 @@ import com.wflow.workflow.bean.vo.ProcessProgressVo; | |||||
import com.wflow.workflow.enums.ProcessStatusEnum; | import com.wflow.workflow.enums.ProcessStatusEnum; | ||||
import lombok.AllArgsConstructor; | import lombok.AllArgsConstructor; | ||||
import lombok.extern.slf4j.Slf4j; | import lombok.extern.slf4j.Slf4j; | ||||
import org.assertj.core.util.Lists; | |||||
import org.flowable.bpmn.model.*; | import org.flowable.bpmn.model.*; | ||||
import org.flowable.engine.HistoryService; | import org.flowable.engine.HistoryService; | ||||
import org.flowable.engine.RepositoryService; | import org.flowable.engine.RepositoryService; | ||||
@@ -204,12 +204,6 @@ public class HandlerManage { | |||||
case DECLARED_APPROVED_RECORD_AUDITING: | case DECLARED_APPROVED_RECORD_AUDITING: | ||||
updatePassProjectStatus(userId, project); | updatePassProjectStatus(userId, project); | ||||
break; | break; | ||||
case SCHEME_UNDER_REVIEW: | |||||
// 当前项目状态是终验审核中 | |||||
updatePassProjectStatus(userId, project); | |||||
// 判断是否 保存建设建议信息 | |||||
saveConstructionSuggestInfo(instance.getId(), project); | |||||
break; | |||||
case ON_PURCHASING: | case ON_PURCHASING: | ||||
case TO_BE_FIRST_INSPECTED: | case TO_BE_FIRST_INSPECTED: | ||||
case ON_PILOT_RUNNING: | case ON_PILOT_RUNNING: | ||||
@@ -443,8 +437,6 @@ public class HandlerManage { | |||||
case PRE_APPLYING: | case PRE_APPLYING: | ||||
// 当前项目状态是部门联审中 | // 当前项目状态是部门联审中 | ||||
case DEPARTMENT_JOINT_REVIEW: | case DEPARTMENT_JOINT_REVIEW: | ||||
// 当前项目状态是方案评审中 | |||||
case SCHEME_UNDER_REVIEW: | |||||
updateWithdrawProjectStatus(userId, project); | updateWithdrawProjectStatus(userId, project); | ||||
break; | break; | ||||
default: | default: | ||||
@@ -16,9 +16,12 @@ import java.util.Objects; | |||||
*/ | */ | ||||
public class WorkbenchConverter { | public class WorkbenchConverter { | ||||
public static WorkbenchVO.DeclaredStatistics convert(DeclaredProjectStatisticsPO po,DeclaredProjectStatisticsPO lastYearPo) { | |||||
WorkbenchVO.DeclaredStatistics res = BeanUtil.copyProperties(po,WorkbenchVO.DeclaredStatistics.class); | |||||
if(Objects.nonNull(lastYearPo)){ | |||||
private WorkbenchConverter() { | |||||
} | |||||
public static WorkbenchVO.DeclaredStatistics convert(DeclaredProjectStatisticsPO po, DeclaredProjectStatisticsPO lastYearPo) { | |||||
WorkbenchVO.DeclaredStatistics res = BeanUtil.copyProperties(po, WorkbenchVO.DeclaredStatistics.class); | |||||
if (Objects.nonNull(lastYearPo)) { | |||||
res.setDeclaredAmountLastYear(lastYearPo.getDeclaredAmount()); | res.setDeclaredAmountLastYear(lastYearPo.getDeclaredAmount()); | ||||
res.setApprovalAmountLastYear(lastYearPo.getApprovalAmount()); | res.setApprovalAmountLastYear(lastYearPo.getApprovalAmount()); | ||||
} | } | ||||
@@ -32,4 +35,5 @@ public class WorkbenchConverter { | |||||
res.setProjectName(vo.getProjectName()); | res.setProjectName(vo.getProjectName()); | ||||
return res; | return res; | ||||
} | } | ||||
} | } |
@@ -27,16 +27,6 @@ | |||||
<dependencyManagement> | <dependencyManagement> | ||||
<dependencies> | <dependencies> | ||||
<dependency> | <dependency> | ||||
<groupId>org.apache.poi</groupId> | |||||
<artifactId>poi</artifactId> | |||||
<version>5.2.2</version> | |||||
</dependency> | |||||
<dependency> | |||||
<groupId>org.apache.poi</groupId> | |||||
<artifactId>poi-ooxml</artifactId> | |||||
<version>5.2.2</version> | |||||
</dependency> | |||||
<dependency> | |||||
<groupId>com.alibaba</groupId> | <groupId>com.alibaba</groupId> | ||||
<artifactId>fastjson</artifactId> | <artifactId>fastjson</artifactId> | ||||
<version>${fastjson.version}</version> | <version>${fastjson.version}</version> | ||||
@@ -87,7 +77,7 @@ | |||||
<dependency> | <dependency> | ||||
<groupId>com.alibaba</groupId> | <groupId>com.alibaba</groupId> | ||||
<artifactId>easyexcel-core</artifactId> | <artifactId>easyexcel-core</artifactId> | ||||
<version>3.1.2</version> | |||||
<version>3.3.2</version> | |||||
</dependency> | </dependency> | ||||
<dependency> | <dependency> | ||||
<groupId>com.ningdatech</groupId> | <groupId>com.ningdatech</groupId> | ||||
@@ -116,11 +106,6 @@ | |||||
<version>2.0.1.RELEASE</version> | <version>2.0.1.RELEASE</version> | ||||
</dependency> | </dependency> | ||||
<dependency> | <dependency> | ||||
<groupId>cn.afterturn</groupId> | |||||
<artifactId>easypoi-base</artifactId> | |||||
<version>4.4.0</version> | |||||
</dependency> | |||||
<dependency> | |||||
<groupId>com.github.oshi</groupId> | <groupId>com.github.oshi</groupId> | ||||
<artifactId>oshi-core</artifactId> | <artifactId>oshi-core</artifactId> | ||||
<version>6.4.0</version> | <version>6.4.0</version> | ||||