diff --git a/pmapi/src/main/java/com/ningdatech/pmapi/dashboard/controller/DashboardController.java b/pmapi/src/main/java/com/ningdatech/pmapi/dashboard/controller/DashboardController.java index 3b8a91c..c49534b 100644 --- a/pmapi/src/main/java/com/ningdatech/pmapi/dashboard/controller/DashboardController.java +++ b/pmapi/src/main/java/com/ningdatech/pmapi/dashboard/controller/DashboardController.java @@ -6,12 +6,14 @@ import com.ningdatech.pmapi.dashboard.manage.DashboardExpertManage; import com.ningdatech.pmapi.dashboard.manage.DashboardProjectManage; import com.ningdatech.pmapi.dashboard.model.po.QueryYearPO; import com.ningdatech.pmapi.dashboard.model.vo.*; +import com.ningdatech.pmapi.scheduler.task.CockpitStatsStatisticsTask; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import lombok.RequiredArgsConstructor; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; import javax.validation.Valid; +import java.net.UnknownHostException; /** * @author liuxinxin @@ -30,6 +32,8 @@ public class DashboardController { private final CockpitStatsManage cockpitStatsManage; + private final CockpitStatsStatisticsTask cockpitStatsStatisticsTask; + @PostMapping("/expert-summary") @ApiOperation("专家驾驶舱统计数据") @WebLog("专家驾驶舱统计数据") @@ -70,4 +74,11 @@ public class DashboardController { @RequestParam(required = false) Integer year) { return cockpitStatsManage.getData(regionCode,year); } + + @GetMapping("cockpit-stats-start") + @ApiOperation("驾驶舱-统计数据接口 强制运行任务") + public String statsStart() throws UnknownHostException { + cockpitStatsStatisticsTask.doTask(); + return "运行成功"; + } } diff --git a/pmapi/src/main/java/com/ningdatech/pmapi/dashboard/manage/DashboardProjectManage.java b/pmapi/src/main/java/com/ningdatech/pmapi/dashboard/manage/DashboardProjectManage.java index 72b57d0..db1a097 100644 --- a/pmapi/src/main/java/com/ningdatech/pmapi/dashboard/manage/DashboardProjectManage.java +++ b/pmapi/src/main/java/com/ningdatech/pmapi/dashboard/manage/DashboardProjectManage.java @@ -377,13 +377,13 @@ public class DashboardProjectManage { String safetyInputDescribe = project.getSafetyInputDescribe(); if(org.apache.commons.lang3.StringUtils.isNotBlank(safetyInputDescribe)){ JSONArray array = JSON.parseArray(safetyInputDescribe); - final Integer[] total = {0}; + final Double[] total = {0.0}; array.forEach(j -> { JSONObject json = JSON.parseObject(JSON.toJSONString(j)); - Integer safetyInputAmount = json.getInteger(DashboardConstant.Protrait.FEILD_SAFETYMONEY); + Double safetyInputAmount = json.getDouble(DashboardConstant.Protrait.FEILD_SAFETYMONEY); total[0] += safetyInputAmount; }); - Integer totalAmount = total[0]; + Double totalAmount = total[0]; //申报金额 BigDecimal declareAmount = project.getDeclareAmount(); if(Objects.isNull(declareAmount) || declareAmount.compareTo(BigDecimal.ZERO) == 0){ diff --git a/pmapi/src/main/java/com/ningdatech/pmapi/dashboard/mapper/CockpitStatsMapper.java b/pmapi/src/main/java/com/ningdatech/pmapi/dashboard/mapper/CockpitStatsMapper.java index acd821b..b468436 100644 --- a/pmapi/src/main/java/com/ningdatech/pmapi/dashboard/mapper/CockpitStatsMapper.java +++ b/pmapi/src/main/java/com/ningdatech/pmapi/dashboard/mapper/CockpitStatsMapper.java @@ -2,6 +2,8 @@ package com.ningdatech.pmapi.dashboard.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.ningdatech.pmapi.dashboard.model.entity.CockpitStats; +import com.ningdatech.pmapi.dashboard.model.po.SecrecyPasswordGradePO; +import org.apache.ibatis.annotations.Param; /** *

@@ -13,4 +15,6 @@ import com.ningdatech.pmapi.dashboard.model.entity.CockpitStats; */ public interface CockpitStatsMapper extends BaseMapper { + SecrecyPasswordGradePO getSecrecyPasswordGrade(@Param("regionCode") String regionCode, + @Param("year") Integer year); } diff --git a/pmapi/src/main/java/com/ningdatech/pmapi/dashboard/mapper/CockpitStatsMapper.xml b/pmapi/src/main/java/com/ningdatech/pmapi/dashboard/mapper/CockpitStatsMapper.xml new file mode 100644 index 0000000..a3e935d --- /dev/null +++ b/pmapi/src/main/java/com/ningdatech/pmapi/dashboard/mapper/CockpitStatsMapper.xml @@ -0,0 +1,31 @@ + + + + + diff --git a/pmapi/src/main/java/com/ningdatech/pmapi/dashboard/model/po/SecrecyPasswordGradePO.java b/pmapi/src/main/java/com/ningdatech/pmapi/dashboard/model/po/SecrecyPasswordGradePO.java new file mode 100644 index 0000000..63df01d --- /dev/null +++ b/pmapi/src/main/java/com/ningdatech/pmapi/dashboard/model/po/SecrecyPasswordGradePO.java @@ -0,0 +1,42 @@ +package com.ningdatech.pmapi.dashboard.model.po; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import java.io.Serializable; + +@Data +@ApiModel(value = "等保密评PO", description = "") +public class SecrecyPasswordGradePO implements Serializable { + private static final long serialVersionUID = 1L; + + @ApiModelProperty("项目监控-等保1级数量") + private Integer monitorSecrecyGrade1Num; + + @ApiModelProperty("项目监控-等保2级数量") + private Integer monitorSecrecyGrade2Num; + + @ApiModelProperty("项目监控-等保3级数量") + private Integer monitorSecrecyGrade3Num; + + @ApiModelProperty("项目监控-等保4级数量") + private Integer monitorSecrecyGrade4Num; + + @ApiModelProperty("项目监控-等保5级数量") + private Integer monitorSecrecyGrade5Num; + + @ApiModelProperty("项目监控-密评1级数量") + private Integer monitorPasswordGrade1Num; + + @ApiModelProperty("项目监控-密评2级数量") + private Integer monitorPasswordGrade2Num; + + @ApiModelProperty("项目监控-密评3级数量") + private Integer monitorPasswordGrade3Num; + + @ApiModelProperty("项目监控-密评4级数量") + private Integer monitorPasswordGrade4Num; + + @ApiModelProperty("项目监控-密评5级数量") + private Integer monitorPasswordGrade5Num; +} \ No newline at end of file diff --git a/pmapi/src/main/java/com/ningdatech/pmapi/dashboard/service/ICockpitStatsService.java b/pmapi/src/main/java/com/ningdatech/pmapi/dashboard/service/ICockpitStatsService.java index 578848b..bd75fd8 100644 --- a/pmapi/src/main/java/com/ningdatech/pmapi/dashboard/service/ICockpitStatsService.java +++ b/pmapi/src/main/java/com/ningdatech/pmapi/dashboard/service/ICockpitStatsService.java @@ -2,6 +2,7 @@ package com.ningdatech.pmapi.dashboard.service; import com.baomidou.mybatisplus.extension.service.IService; import com.ningdatech.pmapi.dashboard.model.entity.CockpitStats; +import com.ningdatech.pmapi.dashboard.model.po.SecrecyPasswordGradePO; /** *

@@ -13,4 +14,5 @@ import com.ningdatech.pmapi.dashboard.model.entity.CockpitStats; */ public interface ICockpitStatsService extends IService { + SecrecyPasswordGradePO getSecrecyPasswordGrade(String regionCode,Integer year); } diff --git a/pmapi/src/main/java/com/ningdatech/pmapi/dashboard/service/impl/CockpitStatsServiceImpl.java b/pmapi/src/main/java/com/ningdatech/pmapi/dashboard/service/impl/CockpitStatsServiceImpl.java index 05f9806..af59d07 100644 --- a/pmapi/src/main/java/com/ningdatech/pmapi/dashboard/service/impl/CockpitStatsServiceImpl.java +++ b/pmapi/src/main/java/com/ningdatech/pmapi/dashboard/service/impl/CockpitStatsServiceImpl.java @@ -3,7 +3,9 @@ package com.ningdatech.pmapi.dashboard.service.impl; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.ningdatech.pmapi.dashboard.mapper.CockpitStatsMapper; import com.ningdatech.pmapi.dashboard.model.entity.CockpitStats; +import com.ningdatech.pmapi.dashboard.model.po.SecrecyPasswordGradePO; import com.ningdatech.pmapi.dashboard.service.ICockpitStatsService; +import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; /** @@ -15,7 +17,14 @@ import org.springframework.stereotype.Service; * @since 2023-02-05 */ @Service +@RequiredArgsConstructor public class CockpitStatsServiceImpl extends ServiceImpl implements ICockpitStatsService { + private final CockpitStatsMapper cockpitStatsMapper; + + @Override + public SecrecyPasswordGradePO getSecrecyPasswordGrade(String regionCode, Integer year) { + return cockpitStatsMapper.getSecrecyPasswordGrade(regionCode,year); + } } diff --git a/pmapi/src/main/java/com/ningdatech/pmapi/scheduler/task/CockpitStatsStatisticsTask.java b/pmapi/src/main/java/com/ningdatech/pmapi/scheduler/task/CockpitStatsStatisticsTask.java new file mode 100644 index 0000000..445a9e5 --- /dev/null +++ b/pmapi/src/main/java/com/ningdatech/pmapi/scheduler/task/CockpitStatsStatisticsTask.java @@ -0,0 +1,403 @@ +package com.ningdatech.pmapi.scheduler.task; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.date.StopWatch; +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.ningdatech.pmapi.common.constant.BizConst; +import com.ningdatech.pmapi.common.constant.RegionConst; +import com.ningdatech.pmapi.common.helper.RegionCacheHelper; +import com.ningdatech.pmapi.dashboard.constant.DashboardConstant; +import com.ningdatech.pmapi.dashboard.model.entity.CockpitStats; +import com.ningdatech.pmapi.dashboard.model.po.SecrecyPasswordGradePO; +import com.ningdatech.pmapi.dashboard.service.ICockpitStatsService; +import com.ningdatech.pmapi.expert.entity.ExpertUserFullInfo; +import com.ningdatech.pmapi.expert.service.IExpertUserFullInfoService; +import com.ningdatech.pmapi.performance.model.entity.PerformanceAppraisalProject; +import com.ningdatech.pmapi.performance.service.IPerformanceAppraisalProjectService; +import com.ningdatech.pmapi.projectlib.enumeration.ProjectStatusEnum; +import com.ningdatech.pmapi.projectlib.model.entity.Project; +import com.ningdatech.pmapi.projectlib.service.IProjectService; +import com.ningdatech.pmapi.sys.model.dto.RegionDTO; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +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.Comparator; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.stream.Collectors; + +/** + * @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; + + @Autowired + private ICockpitStatsService cockpitStatsService; + + @Autowired + private RegionCacheHelper regionCacheHelper; + + @Autowired + private IProjectService projectService; + + @Autowired + private IExpertUserFullInfoService expertUserFullInfoService; + + @Autowired + private IPerformanceAppraisalProjectService performanceAppraisalProjectService; + + + /** + * 前置机每天晚上10点自动清空,第二天早上6点获取数据 + * 定时同步前置机数据 每天1点开始执行一次 + * + */ + @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 years = Lists.newArrayList(2021,2022,2023,2024); + + List res = Lists.newArrayList(); + //1.根据2个维度来统计 区域和分年 + //1.总的 + res.add(statisticsData(DashboardConstant.CockpitStats.TOTAL, + DashboardConstant.CockpitStats.TOTAL,0)); + for(Integer year : years){ + res.add(statisticsData(DashboardConstant.CockpitStats.TOTAL, + DashboardConstant.CockpitStats.TOTAL,year)); + } + + List regions = regionCacheHelper.listChildren(RegionConst.RC_LS, RegionConst.RL_COUNTY); + + for(RegionDTO regionDto : regions){ + res.add(statisticsData(regionDto.getRegionCode(),regionDto.getRegionName(),0)); + for(Integer year : years){ + res.add(statisticsData(regionDto.getRegionCode(),regionDto.getRegionName(),year)); + } + } + + //如果结果不为空 就删除之前的 插入最新的数据 + if(CollUtil.isEmpty(res)){ + if(cockpitStatsService.remove(Wrappers.lambdaQuery(CockpitStats.class))){ + cockpitStatsService.saveBatch(res); + } + } + + stopWatch.stop(); + log.info("驾驶舱数据统计任务结束====={}s",stopWatch.getTotalTimeSeconds()); + } + + /** + * 统计的具体逻辑 + * @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); + + List 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(Objects.nonNull(year) && !year.equals(DashboardConstant.CockpitStats.NONE_YEAR), + Project::getProjectYear, year) + .in(Objects.isNull(year) && year.equals(DashboardConstant.CockpitStats.NONE_YEAR), + Project::getProjectYear, Lists.newArrayList(2021,2022,2023,2024))); + //1.项目监测 + //1.1 超期在建项目 + Integer overdueConstructionProjectsNum = projects.stream().filter(p -> { + if(Objects.nonNull(p.getPlanAcceptanceTime()) && p.getPlanAcceptanceTime().compareTo(LocalDateTime.now()) < 0){ + return Boolean.TRUE; + } + return Boolean.FALSE; + }).collect(Collectors.toList()).size(); + cockpitStats.setMonitorOverdueConstructionProjectsNum(overdueConstructionProjectsNum); + //1.2 环节滞后项目 + cockpitStats.setMonitorLaggingProjectsNum(0); + //1.3预审驳回项目 + Integer preFailed = projects.stream().filter(p -> { + if(Objects.nonNull(p.getStatus()) && p.getStatus().equals(ProjectStatusEnum.PREQUALIFICATION_FAILED.getCode())){ + return Boolean.TRUE; + } + return Boolean.FALSE; + }).collect(Collectors.toList()).size(); + cockpitStats.setMonitorRejectedPreReviewProjectsNum(preFailed); + //1.4 建设方案评审失败 + Integer constructionFailed = projects.stream().filter(p -> { + if(Objects.nonNull(p.getStatus()) && p.getStatus().equals(ProjectStatusEnum.SCHEME_REVIEW_FAILED.getCode())){ + return Boolean.TRUE; + } + return Boolean.FALSE; + }).collect(Collectors.toList()).size(); + 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 totalSafytyAmount = projects.stream().mapToDouble(p -> { + if(Objects.nonNull(p.getSafetyInputDescribe())){ + final Double[] total = {0.0}; + 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; + }); + return total[0]; + } + return 0.0; + }).sum(); + cockpitStats.setMonitorSafetyInputAmount(BigDecimal.valueOf(totalSafytyAmount)); + + //1.8等保密评 + SecrecyPasswordGradePO secrecyPasswordGradePo = cockpitStatsService.getSecrecyPasswordGrade(regionCode, year); + cockpitStats.setMonitorSecrecyGrade1Num(secrecyPasswordGradePo.getMonitorSecrecyGrade1Num()); + cockpitStats.setMonitorSecrecyGrade2Num(secrecyPasswordGradePo.getMonitorSecrecyGrade2Num()); + cockpitStats.setMonitorSecrecyGrade3Num(secrecyPasswordGradePo.getMonitorSecrecyGrade3Num()); + cockpitStats.setMonitorSecrecyGrade4Num(secrecyPasswordGradePo.getMonitorSecrecyGrade4Num()); + cockpitStats.setMonitorSecrecyGrade5Num(secrecyPasswordGradePo.getMonitorSecrecyGrade5Num()); + cockpitStats.setMonitorPasswordGrade1Num(secrecyPasswordGradePo.getMonitorPasswordGrade1Num()); + cockpitStats.setMonitorPasswordGrade2Num(secrecyPasswordGradePo.getMonitorPasswordGrade2Num()); + cockpitStats.setMonitorPasswordGrade3Num(secrecyPasswordGradePo.getMonitorPasswordGrade3Num()); + cockpitStats.setMonitorPasswordGrade4Num(secrecyPasswordGradePo.getMonitorPasswordGrade4Num()); + cockpitStats.setMonitorPasswordGrade5Num(secrecyPasswordGradePo.getMonitorPasswordGrade5Num()); + + //2.专家统计 + List experts = expertUserFullInfoService.list(Wrappers.lambdaQuery(ExpertUserFullInfo.class) + .eq(StringUtils.isNotBlank(regionCode) && !DashboardConstant.CockpitStats.TOTAL.equals(regionCode), + ExpertUserFullInfo::getRegionCode, regionCode)); + cockpitStats.setExpertTotalNum(experts.size()); + cockpitStats.setExpertFinancialNum(0); + cockpitStats.setExpertNetworkSecurityNum(0); + cockpitStats.setExpertXinchuangNum(0); + cockpitStats.setExpertPlanRationalityNum(0); + cockpitStats.setExpertPromotionInfoTechnologyNum(0); + cockpitStats.setExpertPartyGovInfoNum(0); + cockpitStats.setExpertSoftHardPricingNum(0); + cockpitStats.setExpertTechnicalFeasibilityAssessmentNum(0); + + //3.顶部数据 + //3.1 计划项目数(通过单位内部审核的项目) + Integer planProjectNum = projects.stream().filter(p -> { + if(Objects.nonNull(p.getStatus()) && p.getStatus().compareTo(ProjectStatusEnum.PENDING_PREQUALIFICATION.getCode()) >= 0){ + return Boolean.TRUE; + } + return Boolean.FALSE; + }).collect(Collectors.toList()).size(); + cockpitStats.setTopPlanProjectsNum(planProjectNum); + //3.2 批复项目数(可以用批复金额来判断) + Integer approvalNum = projects.stream().filter(p -> { + if(Objects.nonNull(p.getApprovalAmount())){ + return Boolean.TRUE; + } + return Boolean.FALSE; + }).collect(Collectors.toList()).size(); + Double approvalAmount = projects.stream().filter(p -> { + if(Objects.nonNull(p.getApprovalAmount())){ + return Boolean.TRUE; + } + return Boolean.FALSE; + }).mapToDouble(p -> p.getApprovalAmount().doubleValue()).sum(); + cockpitStats.setTopApprovalProjectsNum(approvalNum); + cockpitStats.setTopApprovalProjectsAmount(BigDecimal.valueOf(approvalAmount)); + //3.3 平均建设周期 + Double average = projects.stream().mapToInt(p -> { + if (StringUtils.isNotBlank(p.getBuildCycle())) { + try { + Integer buildCycle = Integer.valueOf(p.getBuildCycle()); + return buildCycle; + } catch (Exception e) { + return 0; + } + } + return 0; + }).average().getAsDouble(); + cockpitStats.setTopAverageConstructionPeriod(average.intValue()); + //3.4 在建项目数 采购备案后的项目 + Integer contructionNum = projects.stream().filter(p -> { + if(Objects.nonNull(p.getStatus()) && p.getStatus().compareTo(ProjectStatusEnum.UNDER_CONSTRUCTION.getCode()) >= 0){ + return Boolean.TRUE; + } + return Boolean.FALSE; + }).collect(Collectors.toList()).size(); + cockpitStats.setTopOngoingProjectsNum(contructionNum); + //4.地图 只要放总数 取的时候 会有逻辑 + cockpitStats.setProjectsTotal(projects.size()); + + //5.下面项目状态数 + //5.1 处于计划 (单位内部) + Integer inPlanNum = projects.stream().filter(p -> { + if(Objects.nonNull(p.getStatus()) && p.getStatus().equals(ProjectStatusEnum.UNDER_INTERNAL_AUDIT.getCode())){ + return Boolean.TRUE; + } + return Boolean.FALSE; + }).collect(Collectors.toList()).size(); + cockpitStats.setProjectsTotalPlan(inPlanNum); + //5.2 处于申报 (预审) + Integer inApplyNum = projects.stream().filter(p -> { + if(Objects.nonNull(p.getStatus()) && p.getStatus().equals(ProjectStatusEnum.PRE_APPLYING.getCode())){ + return Boolean.TRUE; + } + return Boolean.FALSE; + }).collect(Collectors.toList()).size(); + //5.3 处于审批 (建设方案) + Integer inApproveNum = projects.stream().filter(p -> { + if(Objects.nonNull(p.getStatus()) && p.getStatus().equals(ProjectStatusEnum.SCHEME_UNDER_REVIEW.getCode())){ + return Boolean.TRUE; + } + return Boolean.FALSE; + }).collect(Collectors.toList()).size(); + cockpitStats.setProjectsTotalApprove(inApproveNum); + //5.4 建设 (建设中) + Integer inContructionNum = projects.stream().filter(p -> { + if(Objects.nonNull(p.getStatus()) && + p.getStatus().equals(ProjectStatusEnum.UNDER_CONSTRUCTION.getCode())){ + return Boolean.TRUE; + } + return Boolean.FALSE; + }).collect(Collectors.toList()).size(); + cockpitStats.setProjectsTotalConstruction(inContructionNum); + //5.5 验收 和 绩效 可以一起查 + List inAccpetProjects = projects.stream().filter(p -> { + if(Objects.nonNull(p.getStatus()) && + p.getStatus().equals(ProjectStatusEnum.ACCEPTED.getCode())){ + return Boolean.TRUE; + } + return Boolean.FALSE; + }).collect(Collectors.toList()); + List inAccpetCodes = inAccpetProjects.stream().map(Project::getProjectCode).collect(Collectors.toList()); + List performances = performanceAppraisalProjectService.list(Wrappers.lambdaQuery(PerformanceAppraisalProject.class) + .in(PerformanceAppraisalProject::getProjectCode, inAccpetCodes) + .isNotNull(PerformanceAppraisalProject::getVerifyTotalScore)); + cockpitStats.setProjectsTotalAccept(inAccpetProjects.size() - performances.size()); + cockpitStats.setProjectsTotalPerformance(performances.size()); + cockpitStats.setProjectsTotalLogOff(0); + cockpitStats.setProjectsTotalOperation(0); + + //6.项目效益 + cockpitStats.setExcellentBestAppNum(0); + cockpitStats.setExcellentMajorAppNum(0); + cockpitStats.setExcellentCrossLevelSharingNum(0); + cockpitStats.setExcellentMajorAppNum(0); + + //7 核减资金 + Double reduceFundsTotal = projects.stream().mapToDouble(p -> { + if(Objects.nonNull(p.getApprovalAmount()) && Objects.nonNull(p.getDeclareAmount())){ + if(Objects.nonNull(p.getContractAmount())){ + return (p.getDeclareAmount().subtract(p.getContractAmount())).doubleValue(); + }else{ + return (p.getDeclareAmount().subtract(p.getApprovalAmount())).doubleValue(); + } + } + return 0.0; + }).sum(); + cockpitStats.setReduceFundsTotal(BigDecimal.valueOf(reduceFundsTotal)); + //7.2驳回节约资金 + List rejectPreProjects = projects.stream().filter(p -> { + if (Objects.nonNull(p.getStatus()) && p.getStatus().equals(ProjectStatusEnum.PREQUALIFICATION_FAILED.getCode())) { + return Boolean.TRUE; + } + return Boolean.FALSE; + }).collect(Collectors.toList()); + Double rejectPreSum = rejectPreProjects.stream().mapToDouble(p -> { + if (Objects.nonNull(p.getDeclareAmount())) { + return p.getDeclareAmount().doubleValue(); + } + return 0.0; + }).sum(); + cockpitStats.setRejectSavingsFunds(BigDecimal.valueOf(rejectPreSum)); + //7.3 柱状图 + //7.3.1 申报状态的3个资金 +// projects.stream() + cockpitStats.setApprovalAmountApproval(BigDecimal.ZERO); + cockpitStats.setApprovalAmountApprove(BigDecimal.ZERO); + cockpitStats.setApprovalAmountContract(BigDecimal.ZERO); + cockpitStats.setDeclaredAmountApproval(BigDecimal.ZERO); + cockpitStats.setDeclaredAmountApprove(BigDecimal.ZERO); + cockpitStats.setDeclaredAmountContract(BigDecimal.ZERO); + cockpitStats.setDifferenceApproval(BigDecimal.ZERO); + cockpitStats.setDifferenceApprove(BigDecimal.ZERO); + cockpitStats.setDifferenceContract(BigDecimal.ZERO); + + //8 产出数据 + cockpitStats.setProduceAppNum(0); + cockpitStats.setProduceDataNum(0); + cockpitStats.setProduceComponentNum(0); + cockpitStats.setProduceBrainElementsNum(0); + + //9.绩效 + List projectCodes = projects.stream().map(Project::getProjectCode).collect(Collectors.toList()); + Map projectMap = projects.stream().collect(Collectors.toMap(Project::getProjectCode, Project::getProjectName)); + List performanceAll = performanceAppraisalProjectService.list(Wrappers.lambdaQuery(PerformanceAppraisalProject.class) + .in(PerformanceAppraisalProject::getProjectCode, projectCodes)); + List 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()); + cockpitStats.setPerformanceTotal(performanceAll.size()); + cockpitStats.setPerformanceReviewedTotal(verified.size()); + cockpitStats.setPerformanceTobeReviewTotal(performanceAll.size() - verified.size()); + + cockpitStats.setPerformanceTop1Name(projectMap.get(verified.get(0).getProjectCode())); + cockpitStats.setPerformanceTop1Score(verified.get(0).getVerifyTotalScore()); + cockpitStats.setPerformanceTop2Name(verified.get(1).getProjectCode()); + cockpitStats.setPerformanceTop2Score(verified.get(1).getVerifyTotalScore()); + cockpitStats.setPerformanceTop3Name(verified.get(2).getProjectCode()); + cockpitStats.setPerformanceTop3Score(verified.get(2).getVerifyTotalScore()); + cockpitStats.setPerformanceTop4Name(verified.get(3).getProjectCode()); + cockpitStats.setPerformanceTop4Score(verified.get(3).getVerifyTotalScore()); + cockpitStats.setPerformanceTop5Name(verified.get(4).getProjectCode()); + cockpitStats.setPerformanceTop5Score(verified.get(4).getVerifyTotalScore()); + + return cockpitStats; + } +} diff --git a/pmapi/src/test/java/com/ningdatech/pmapi/projectCollection/ProjectCollectionTest.java b/pmapi/src/test/java/com/ningdatech/pmapi/projectCollection/ProjectCollectionTest.java index bc06602..a811d1d 100644 --- a/pmapi/src/test/java/com/ningdatech/pmapi/projectCollection/ProjectCollectionTest.java +++ b/pmapi/src/test/java/com/ningdatech/pmapi/projectCollection/ProjectCollectionTest.java @@ -75,7 +75,7 @@ public class ProjectCollectionTest extends AppTests { @Test public void test(){ - List baseProjIds = Lists.newArrayList("33110000020220100244"); + List baseProjIds = Lists.newArrayList("33110000020230100021"); for(String baseProjId : baseProjIds){ GovBizProjectBaseinfo baseinfo = baseinfoService.getOne(Wrappers.lambdaQuery(GovBizProjectBaseinfo.class) .eq(GovBizProjectBaseinfo::getBaseProjId, baseProjId)