@@ -83,8 +83,7 @@ | |||
<dependency> | |||
<groupId>org.springframework.boot</groupId> | |||
<artifactId>spring-boot-devtools</artifactId> | |||
<optional>true</optional> | |||
<scope>true</scope> | |||
<scope>runtime</scope> | |||
</dependency> | |||
<dependency> | |||
<groupId>org.springframework.boot</groupId> | |||
@@ -100,14 +99,6 @@ | |||
<artifactId>httpclient</artifactId> | |||
</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> | |||
<artifactId>junit</artifactId> | |||
<scope>test</scope> | |||
@@ -120,6 +111,11 @@ | |||
<dependency> | |||
<groupId>org.springframework.boot</groupId> | |||
<artifactId>spring-boot-starter-test</artifactId> | |||
<scope>test</scope> | |||
</dependency> | |||
<dependency> | |||
<groupId>org.springframework</groupId> | |||
<artifactId>spring-test</artifactId> | |||
</dependency> | |||
<dependency> | |||
<groupId>org.springframework.boot</groupId> | |||
@@ -198,11 +194,6 @@ | |||
<groupId>org.springframework.statemachine</groupId> | |||
<artifactId>spring-statemachine-core</artifactId> | |||
</dependency> | |||
<!--导入导出--> | |||
<dependency> | |||
<groupId>cn.afterturn</groupId> | |||
<artifactId>easypoi-base</artifactId> | |||
</dependency> | |||
<dependency> | |||
<groupId>com.github.oshi</groupId> | |||
<artifactId>oshi-core</artifactId> | |||
@@ -1,8 +1,8 @@ | |||
package com.hz.pm.api.common.config; | |||
import com.google.common.collect.Lists; | |||
import com.hz.pm.api.scheduler.listener.TaskCreatedListener; | |||
import lombok.RequiredArgsConstructor; | |||
import org.assertj.core.util.Lists; | |||
import org.flowable.common.engine.api.delegate.event.FlowableEventListener; | |||
import org.flowable.spring.SpringProcessEngineConfiguration; | |||
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.json.JSONUtil; | |||
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.model.constant.StateMachineConst; | |||
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.ProjectApplication; | |||
import com.hz.pm.api.projectlib.model.enumeration.status.ProjectStatus; | |||
import lombok.extern.slf4j.Slf4j; | |||
import org.springframework.statemachine.StateContext; | |||
import org.springframework.statemachine.action.Action; | |||
@@ -65,7 +65,6 @@ public class ProjectDeclareActionChoice implements Action<ProjectStatus, Project | |||
}); | |||
if (isFirstApp[0]) { | |||
project.setStage(ProjectStatus.NOT_APPROVED.getCode()); | |||
project.setStatus(ProjectStatus.TO_BE_APP_REGISTER.getCode()); | |||
} else { | |||
project.setStage(ProjectStatus.PROJECT_APPROVED.getCode()); | |||
project.setStatus(ProjectStatus.TO_BE_PURCHASED.getCode()); | |||
@@ -153,43 +153,18 @@ public class ProjectStateChangeAction { | |||
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") | |||
public void PLAN_TO_DECLARE_WITHDRAW(Message<ProjectStateChangeEvent> message) { | |||
Project project = getProject(message); | |||
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") | |||
public void PLAN_REVIEW_PASS(Message<ProjectStateChangeEvent> message) { | |||
Project project = getProject(message); | |||
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") | |||
public void SCHEME_UNDER_REVIEW_WITHDRAW(Message<ProjectStateChangeEvent> message) { | |||
Project project = getProject(message); | |||
@@ -235,12 +210,6 @@ public class ProjectStateChangeAction { | |||
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") | |||
public void START_TO_WORK(Message<ProjectStateChangeEvent> 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.projectlib.model.entity.Project; | |||
import com.hz.pm.api.projectlib.model.enumeration.status.ProjectStatus; | |||
import com.ningdatech.basic.exception.BizException; | |||
import lombok.RequiredArgsConstructor; | |||
import lombok.extern.slf4j.Slf4j; | |||
import org.springframework.beans.factory.BeanFactory; | |||
@@ -187,31 +186,6 @@ public class ProjectStateMachineBuilderImpl implements BaseStateMachineBuilder<P | |||
.event(ProjectStateChangeEvent.ANNUAL_PLAN_SUSPEND).and() | |||
// 方案待申报申报方案,从方案待申报到方案评审中 | |||
.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) | |||
.target(ProjectStatus.DECLARED_APPROVED_RECORD_AUDITING) | |||
.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), | |||
/** | |||
* 方案评审驳回(项目状态变为:方案评审不通过) | |||
*/ | |||
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), | |||
@@ -129,17 +114,15 @@ public enum ProjectStateChangeEvent implements AbstractStateChangeEvent { | |||
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_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()), | |||
/** | |||
* 方案评审中时被撤回(项目状态进入:方案待申报) | |||
*/ | |||
SCHEME_UNDER_REVIEW_WITHDRAW(null, null, ProjectStatus.SCHEME_UNDER_REVIEW.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); | |||
break; | |||
case CONSTRUCTION_SCHEME_REVIEW: | |||
buildOptionProjectQuery(query, meetingType, ProjectStatus.SCHEME_UNDER_REVIEW); | |||
buildOptionProjectQuery(query, meetingType, null); | |||
break; | |||
case ACCEPTANCE_SCHEME_REVIEW: | |||
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.projectdeclared.manage.ConstructionPlanManage; | |||
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.projectlib.model.vo.ProjectLibListItemVO; | |||
import com.ningdatech.basic.model.PageVo; | |||
@@ -39,14 +38,6 @@ public class ConstructionPlanController { | |||
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") | |||
@ApiOperation("可申报建设方案项目列表导出") | |||
@WebLog("可申报建设方案项目列表导出") | |||
@@ -1,25 +1,13 @@ | |||
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.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.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 org.apache.commons.lang3.StringUtils; | |||
import java.math.BigDecimal; | |||
import java.util.*; | |||
import java.util.stream.Collectors; | |||
import java.util.Objects; | |||
/** | |||
* @Classname ApplicationConverter | |||
@@ -30,66 +18,20 @@ import java.util.stream.Collectors; | |||
@Slf4j | |||
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) { | |||
if(StringUtils.isBlank(projectType)){ | |||
if (StringUtils.isBlank(projectType)) { | |||
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(); | |||
}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 null; | |||
@@ -118,77 +60,6 @@ public class ApplicationConverter { | |||
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链接的超时时间 | |||
@@ -204,42 +75,4 @@ public class ApplicationConverter { | |||
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.toolkit.Wrappers; | |||
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.CommonConst; | |||
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.projectdeclared.model.dto.ConstructionPlanExportDTO; | |||
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.req.ConstrctionPlanListReq; | |||
import com.hz.pm.api.projectdeclared.service.IConstructionSuggestionsService; | |||
import com.hz.pm.api.projectlib.helper.ProjectHelper; | |||
import com.hz.pm.api.projectlib.manage.ProjectLibManage; | |||
import com.hz.pm.api.projectlib.model.dto.ProjectDTO; | |||
import com.hz.pm.api.projectlib.model.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.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.vo.ProjectLibListItemVO; | |||
import com.hz.pm.api.projectlib.service.IProjectInstService; | |||
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.util.LoginUserUtil; | |||
import com.ningdatech.basic.exception.BizException; | |||
import com.ningdatech.basic.function.VUtils; | |||
import com.ningdatech.basic.model.PageVo; | |||
import com.ningdatech.basic.util.NdDateUtils; | |||
import com.wflow.bean.entity.WflowModels; | |||
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.extern.slf4j.Slf4j; | |||
import org.apache.commons.lang3.StringUtils; | |||
import org.springframework.beans.BeanUtils; | |||
import org.springframework.stereotype.Component; | |||
import org.springframework.transaction.annotation.Transactional; | |||
import javax.servlet.http.HttpServletResponse; | |||
import java.io.IOException; | |||
import java.time.LocalDateTime; | |||
import java.util.Collections; | |||
import java.util.List; | |||
import java.util.Map; | |||
import java.util.Objects; | |||
import java.util.stream.Collectors; | |||
@@ -72,142 +55,13 @@ import java.util.stream.Collectors; | |||
@RequiredArgsConstructor | |||
public class ConstructionPlanManage { | |||
private final ProcessModelManage processModelManage; | |||
private final IProjectService projectService; | |||
private final ProcessInstanceService processService; | |||
private final ProjectStateMachineUtil projectStateMachineUtil; | |||
private final IProjectInstService projectInstService; | |||
private final ProjectLibManage projectLibManage; | |||
private final DefaultDeclaredProjectManage declaredProjectManage; | |||
private final DefaultDeclaredProjectManage defaultDeclaredProjectManage; | |||
private final NoticeManage noticeManage; | |||
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 | |||
@@ -1,9 +1,7 @@ | |||
package com.hz.pm.api.projectdeclared.manage; | |||
import cn.hutool.core.collection.CollUtil; | |||
import com.alibaba.excel.EasyExcel; | |||
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.util.ExcelDownUtil; | |||
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.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.model.enumeration.status.ProjectStatus; | |||
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.vo.ProjectLibListItemVO; | |||
import com.hz.pm.api.projectlib.service.IProjectApplicationService; | |||
import com.hz.pm.api.projectlib.service.IProjectService; | |||
import com.hz.pm.api.user.security.model.UserFullInfoDTO; | |||
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.model.PageVo; | |||
import com.ningdatech.basic.util.NdDateUtils; | |||
import com.wflow.exception.BusinessException; | |||
import lombok.RequiredArgsConstructor; | |||
import lombok.extern.slf4j.Slf4j; | |||
import org.apache.commons.lang3.StringUtils; | |||
@@ -38,7 +33,6 @@ import org.springframework.transaction.annotation.Transactional; | |||
import javax.servlet.http.HttpServletResponse; | |||
import java.io.IOException; | |||
import java.time.LocalDateTime; | |||
import java.util.Arrays; | |||
import java.util.Collections; | |||
import java.util.List; | |||
@@ -60,10 +54,6 @@ public class ProjectAdjustmentManage { | |||
private final IProjectService projectService; | |||
private final IProjectApplicationService projectApplicationService; | |||
private final RestartProcessMapUtil reStartProcessMapUtil; | |||
private final DefaultDeclaredProjectManage defaultDeclaredProjectManage; | |||
private final ProjectLibManage projectLibManage; | |||
@@ -102,38 +92,10 @@ public class ProjectAdjustmentManage { | |||
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( | |||
ProjectStatus.UNDER_INTERNAL_AUDIT_NOT_PASS.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.ge(Project::getStatus, ProjectStatus.SCHEME_UNDER_REVIEW.getCode()) | |||
query.ge(Project::getStatus, null) | |||
.ne(Project::getStatus, ProjectStatus.PLAN_TO_BE_DECLARED.getCode()); | |||
UserInfoDetails user = LoginUserUtil.loginUserDetail(); | |||
buildReviewCheckPermission(query, user); | |||
@@ -1,7 +1,8 @@ | |||
package com.hz.pm.api.projectdeclared.utils; | |||
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.projectlib.manage.DeclaredRecordManage; | |||
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(); | |||
public RestartProcessMapUtil(DeclaredProjectManage declaredProjectManage, | |||
ConstructionPlanManage constructionPlanManage, | |||
PrequalificationDeclaredProjectManage prequalificationDeclaredProjectManage, | |||
ReviewByProvincialDeptManage provincialDeptManage, | |||
DeclaredRecordManage declaredRecordManage) { | |||
//重新项目申报 | |||
RESTART_PROCESS_MAP.put(ProjectStatus.UNDER_INTERNAL_AUDIT_NOT_PASS.getCode(), | |||
declaredProjectManage::reStartTheProcess); | |||
//建设方案 | |||
RESTART_PROCESS_MAP.put(ProjectStatus.SCHEME_REVIEW_FAILED.getCode(), | |||
constructionPlanManage::restartTheProcess); | |||
//预审方案 | |||
RESTART_PROCESS_MAP.put(ProjectStatus.PREQUALIFICATION_FAILED.getCode(), | |||
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(), | |||
declaredRecordManage::restartDeclaredRecord); | |||
@@ -1,8 +1,5 @@ | |||
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.model.dto.ProjectDTO; | |||
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.StartProjectDeclareReq; | |||
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.ApiOperation; | |||
import lombok.RequiredArgsConstructor; | |||
import org.springframework.web.bind.annotation.*; | |||
import org.springframework.web.multipart.MultipartFile; | |||
import javax.servlet.http.HttpServletResponse; | |||
import javax.validation.Valid; | |||
@@ -62,13 +60,6 @@ public class AnnualPlanController { | |||
annualPlanLibManage.suspendAnnualPlan(req); | |||
} | |||
@PostMapping("/importAnnualPlan") | |||
@ApiOperation("导入年度计划") | |||
@WebLog("导入年度计划") | |||
public void importAnnualPlan(@RequestParam("importFlag") ProjectLibFlagEnum importFlag, MultipartFile file) { | |||
annualPlanLibManage.importAnnualPlan(importFlag,file); | |||
} | |||
@PostMapping("/modify") | |||
@ApiOperation("年度计划编辑") | |||
@WebLog("年度计划编辑") | |||
@@ -83,11 +74,4 @@ public class AnnualPlanController { | |||
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; | |||
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.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.ApiOperation; | |||
import lombok.RequiredArgsConstructor; | |||
import org.springframework.web.bind.annotation.*; | |||
import javax.validation.Valid; | |||
/** | |||
@@ -40,9 +38,4 @@ public class ProjectApplicationController { | |||
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_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_RESUBMIT); | |||
ProjectStatusChange projectStatusChange = projectStatusChangeService.getLastOne(projectIds, events); | |||
@@ -73,7 +73,7 @@ public class ProjectApprovalHandle extends AbstractProcessHandle { | |||
detail.setStepStatus(StepStatusEnum.ON_GOING); | |||
} else { | |||
// 取 状态机 改变状态时间 | |||
final List<ProjectStateChangeEvent> events = Arrays.asList(ProjectStateChangeEvent.PLAN_REVIEW_PASS, | |||
final List<ProjectStateChangeEvent> events = Arrays.asList( | |||
ProjectStateChangeEvent.DECLARED_RECORD_FAILED, | |||
ProjectStateChangeEvent.DECLARED_RECORD_PASS); | |||
ProjectStatusChange projectStatusChange = projectStatusChangeService.getLastOne(projectIds, events); | |||
@@ -1,18 +1,8 @@ | |||
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.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.toolkit.Assert; | |||
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.helper.UserInfoHelper; | |||
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.utils.DataScopeUtil; | |||
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.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.req.ProjectApprovedReq; | |||
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.model.PageVo; | |||
import com.ningdatech.basic.util.CollUtils; | |||
import com.ningdatech.basic.util.StrPool; | |||
import lombok.AllArgsConstructor; | |||
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.transaction.annotation.Transactional; | |||
import org.springframework.web.multipart.MultipartFile; | |||
import javax.servlet.http.HttpServletResponse; | |||
import java.io.*; | |||
import java.net.URLEncoder; | |||
import java.nio.charset.StandardCharsets; | |||
import java.time.LocalDateTime; | |||
import java.util.*; | |||
import java.util.stream.Collectors; | |||
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 = | |||
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, | |||
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; | |||
import cn.hutool.core.bean.BeanUtil; | |||
import cn.hutool.core.collection.CollUtil; | |||
import cn.hutool.core.lang.Assert; | |||
import com.alibaba.fastjson.JSON; | |||
import com.alibaba.fastjson.JSONArray; | |||
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.util.HmacAuthUtil; | |||
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.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.IProjectService; | |||
import com.hz.pm.api.user.security.model.UserInfoDetails; | |||
import com.hz.pm.api.user.util.LoginUserUtil; | |||
import com.ningdatech.basic.exception.BizException; | |||
import com.ningdatech.basic.model.ApiResponse; | |||
import com.ningdatech.basic.model.PageVo; | |||
import lombok.RequiredArgsConstructor; | |||
import lombok.extern.slf4j.Slf4j; | |||
import org.apache.commons.lang3.StringUtils; | |||
@@ -34,11 +24,8 @@ import org.springframework.util.MultiValueMap; | |||
import org.springframework.web.client.RestTemplate; | |||
import java.time.LocalDateTime; | |||
import java.util.Collections; | |||
import java.util.List; | |||
import java.util.Map; | |||
import java.util.Objects; | |||
import java.util.stream.Collectors; | |||
/** | |||
* <p> | |||
@@ -133,48 +120,4 @@ public class ApplicationManage { | |||
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.baomidou.mybatisplus.core.conditions.Wrapper; | |||
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.extension.plugins.pagination.Page; | |||
import com.github.xiaoymin.knife4j.core.util.StrUtil; | |||
@@ -851,36 +850,7 @@ public class ProjectLibManage { | |||
projectInstService.save(projectInst); | |||
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 \ | |||
@@ -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), | |||
IN_THE_ANNUAL_PLAN(10010, "年度计划中", null), | |||
BE_SUSPENDED(10011, "被暂缓", null), | |||
SCHEME_UNDER_REVIEW(10012, "方案评审中", GovProjectStatusEnum.APPROVAL), | |||
SCHEME_REVIEW_FAILED(10013, "方案评审不通过", null), | |||
TO_BE_APPROVED(10014, "待立项批复", GovProjectStatusEnum.PENDING), | |||
TO_BE_DECLARED(10015, "待申报", null), | |||
PLAN_TO_BE_DECLARED(10016, "方案待申报", null), | |||
PENDING_PREQUALIFICATION_CHOICE(10017, "待预审选择态", null), | |||
PREQUALIFICATION_WITHDRAW_CHOICE(10019, "预审中撤回选择态", 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.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_TEMPLATE2; | |||
@@ -185,8 +184,6 @@ public class ProcessEndListener { | |||
case UNDER_INTERNAL_AUDIT: | |||
// 当前项目状态是部门联审中 | |||
case DEPARTMENT_JOINT_REVIEW: | |||
// 当前项目状态是方案评审中 | |||
case SCHEME_UNDER_REVIEW: | |||
handlerManage.updatePassProjectStatus(0L, project); | |||
break; | |||
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 com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; | |||
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.util.StrUtils; | |||
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 lombok.AllArgsConstructor; | |||
import lombok.extern.slf4j.Slf4j; | |||
import org.assertj.core.util.Lists; | |||
import org.flowable.bpmn.model.*; | |||
import org.flowable.engine.HistoryService; | |||
import org.flowable.engine.RepositoryService; | |||
@@ -204,12 +204,6 @@ public class HandlerManage { | |||
case DECLARED_APPROVED_RECORD_AUDITING: | |||
updatePassProjectStatus(userId, project); | |||
break; | |||
case SCHEME_UNDER_REVIEW: | |||
// 当前项目状态是终验审核中 | |||
updatePassProjectStatus(userId, project); | |||
// 判断是否 保存建设建议信息 | |||
saveConstructionSuggestInfo(instance.getId(), project); | |||
break; | |||
case ON_PURCHASING: | |||
case TO_BE_FIRST_INSPECTED: | |||
case ON_PILOT_RUNNING: | |||
@@ -443,8 +437,6 @@ public class HandlerManage { | |||
case PRE_APPLYING: | |||
// 当前项目状态是部门联审中 | |||
case DEPARTMENT_JOINT_REVIEW: | |||
// 当前项目状态是方案评审中 | |||
case SCHEME_UNDER_REVIEW: | |||
updateWithdrawProjectStatus(userId, project); | |||
break; | |||
default: | |||
@@ -16,9 +16,12 @@ import java.util.Objects; | |||
*/ | |||
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.setApprovalAmountLastYear(lastYearPo.getApprovalAmount()); | |||
} | |||
@@ -32,4 +35,5 @@ public class WorkbenchConverter { | |||
res.setProjectName(vo.getProjectName()); | |||
return res; | |||
} | |||
} |
@@ -27,16 +27,6 @@ | |||
<dependencyManagement> | |||
<dependencies> | |||
<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> | |||
<artifactId>fastjson</artifactId> | |||
<version>${fastjson.version}</version> | |||
@@ -87,7 +77,7 @@ | |||
<dependency> | |||
<groupId>com.alibaba</groupId> | |||
<artifactId>easyexcel-core</artifactId> | |||
<version>3.1.2</version> | |||
<version>3.3.2</version> | |||
</dependency> | |||
<dependency> | |||
<groupId>com.ningdatech</groupId> | |||
@@ -116,11 +106,6 @@ | |||
<version>2.0.1.RELEASE</version> | |||
</dependency> | |||
<dependency> | |||
<groupId>cn.afterturn</groupId> | |||
<artifactId>easypoi-base</artifactId> | |||
<version>4.4.0</version> | |||
</dependency> | |||
<dependency> | |||
<groupId>com.github.oshi</groupId> | |||
<artifactId>oshi-core</artifactId> | |||
<version>6.4.0</version> | |||