From d3d8edceef85becda22cd710362edf7f716565e9 Mon Sep 17 00:00:00 2001 From: PoffyZhang <99775271@qq.com> Date: Tue, 28 Nov 2023 10:35:49 +0800 Subject: [PATCH] =?UTF-8?q?=E9=A2=84=E8=AD=A6=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dashboard/controller/StatisticsController.java | 35 ++ .../dashboard/manage/FundStatisticsManage.java | 368 ++++++++++++++++++++ .../dashboard/model/vo/ExpertStatisticsVO.java | 375 +++++++++++++++++++++ .../pmapi/dashboard/model/vo/FundStatisticsVO.java | 55 +++ .../gov/manage/GovProjectCollectionManage.java | 4 +- .../enumeration/WarningFlowTypeEnum.java | 8 +- .../enumeration/WarningOperationTypeEnum.java | 4 +- .../manage/ProjectRenewalFundManage.java | 2 +- .../scheduler/task/CockpitStatsStatisticsTask.java | 97 +++--- .../com/ningdatech/pmapi/expert/ExpertTest.java | 73 ++++ 10 files changed, 964 insertions(+), 57 deletions(-) create mode 100644 pmapi/src/main/java/com/ningdatech/pmapi/dashboard/controller/StatisticsController.java create mode 100644 pmapi/src/main/java/com/ningdatech/pmapi/dashboard/manage/FundStatisticsManage.java create mode 100644 pmapi/src/main/java/com/ningdatech/pmapi/dashboard/model/vo/ExpertStatisticsVO.java create mode 100644 pmapi/src/main/java/com/ningdatech/pmapi/dashboard/model/vo/FundStatisticsVO.java create mode 100644 pmapi/src/test/java/com/ningdatech/pmapi/expert/ExpertTest.java diff --git a/pmapi/src/main/java/com/ningdatech/pmapi/dashboard/controller/StatisticsController.java b/pmapi/src/main/java/com/ningdatech/pmapi/dashboard/controller/StatisticsController.java new file mode 100644 index 0000000..b43a08c --- /dev/null +++ b/pmapi/src/main/java/com/ningdatech/pmapi/dashboard/controller/StatisticsController.java @@ -0,0 +1,35 @@ +package com.ningdatech.pmapi.dashboard.controller; + +import com.ningdatech.pmapi.dashboard.manage.FundStatisticsManage; +import com.ningdatech.pmapi.dashboard.model.vo.*; +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.*; + +/** + * @author ZPF + * @date 2023/11/25 上午10:36 + */ +@RestController +@RequestMapping("/api/v1/statistics") +@Validated +@RequiredArgsConstructor +@Api(value = "StatisticsController", tags = "统计") +public class StatisticsController { + + private final FundStatisticsManage fundStatisticsManage; + + @GetMapping("/fund") + @ApiOperation("项目资金统计") + public FundStatisticsVO fund(@RequestParam(required = false) Integer year) { + return fundStatisticsManage.fund(year); + } + + @GetMapping("/expert") + @ApiOperation("专家统计") + public ExpertStatisticsVO expert(@RequestParam(required = false) Integer year) { + return fundStatisticsManage.expert(year); + } +} diff --git a/pmapi/src/main/java/com/ningdatech/pmapi/dashboard/manage/FundStatisticsManage.java b/pmapi/src/main/java/com/ningdatech/pmapi/dashboard/manage/FundStatisticsManage.java new file mode 100644 index 0000000..cba280d --- /dev/null +++ b/pmapi/src/main/java/com/ningdatech/pmapi/dashboard/manage/FundStatisticsManage.java @@ -0,0 +1,368 @@ +package com.ningdatech.pmapi.dashboard.manage; + +import cn.hutool.core.collection.CollUtil; +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.statemachine.contants.RegionContant; +import com.ningdatech.pmapi.dashboard.constant.DashboardConstant; +import com.ningdatech.pmapi.dashboard.model.vo.ExpertStatisticsVO; +import com.ningdatech.pmapi.dashboard.model.vo.FundStatisticsVO; +import com.ningdatech.pmapi.gov.model.entity.GovBizProjectApply; +import com.ningdatech.pmapi.gov.model.entity.GovBizProjectApprove; +import com.ningdatech.pmapi.gov.model.entity.GovBizProjectBaseinfo; +import com.ningdatech.pmapi.gov.model.entity.GovBizProjectProcure; +import com.ningdatech.pmapi.gov.service.IGovBizProjectApplyService; +import com.ningdatech.pmapi.gov.service.IGovBizProjectApproveService; +import com.ningdatech.pmapi.gov.service.IGovBizProjectBaseinfoService; +import com.ningdatech.pmapi.gov.service.IGovBizProjectProcureService; +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.req.NoticeListReq; +import com.ningdatech.pmapi.todocenter.model.req.ToBeProcessedReq; +import com.ningdatech.pmapi.todocenter.model.vo.TodoCenterStatisticsVO; +import com.ningdatech.pmapi.user.security.auth.model.UserInfoDetails; +import com.ningdatech.pmapi.user.util.LoginUserUtil; +import com.ningdatech.pmapi.workbench.converter.WorkbenchConverter; +import io.swagger.models.auth.In; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.springframework.stereotype.Component; + +import java.math.BigDecimal; +import java.time.LocalDateTime; +import java.util.Arrays; +import java.util.List; +import java.util.Objects; +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.ForkJoinPool; +import java.util.stream.Collectors; + +/** + * @Classname FundStatisticsManage + * @Description + * @Date 2023/11/24 17:44 + * @Author PoffyZhang + */ +@Component +@RequiredArgsConstructor +@Slf4j +public class FundStatisticsManage { + private final IProjectService projectService; + + private final IGovBizProjectBaseinfoService baseinfoService; + + private final IGovBizProjectApplyService applyService; + + private final IGovBizProjectApproveService approveService; + + private final IGovBizProjectProcureService procureService; + + private Integer[] years = new Integer[]{2021,2022,2023,2024,2025}; + + private Integer[] threeYears = new Integer[]{LocalDateTime.now().getYear()-2, + LocalDateTime.now().getYear()-1,LocalDateTime.now().getYear()}; + + /** + * 项目统计 + * @param year + * @return + */ + public FundStatisticsVO fund(Integer year) { + FundStatisticsVO res = new FundStatisticsVO(); + + CompletableFuture.allOf( + CompletableFuture.runAsync(() -> { + //选择的年份去计算的数据 + yearCompleteAmount(res,year); + }, ForkJoinPool.commonPool()), + CompletableFuture.runAsync(() -> { + //近三年 + threeYearsCompleteAmount(res); + }, ForkJoinPool.commonPool()), + CompletableFuture.runAsync(() -> { + //所有年 用于算累积 + allYearsCompleteAmount(res); + }, ForkJoinPool.commonPool()) + ).join(); + + return res; + } + + /** + * 计算 所有年的 + * @param res + */ + private void allYearsCompleteAmount(FundStatisticsVO res) { + //1.申报项目 和 归集项目 + //申报项目 + List allProjects = projectService.list(Wrappers.lambdaQuery(Project.class) + .eq(Project::getNewest, Boolean.TRUE) + .in(Project::getProjectYear, years)); + + //项目归集 + List allApplieYears = applyService.list(Wrappers.lambdaQuery(GovBizProjectApply.class) + .in(GovBizProjectApply::getBaseProjSetYear, years)); + + List allProjIds = allApplieYears.stream().map(GovBizProjectApply::getBaseProjId) + .collect(Collectors.toList()); + + List allBaseInfos = Lists.newArrayList(); + List allApplies = Lists.newArrayList(); + List allApproves = Lists.newArrayList(); + List allProcures = Lists.newArrayList(); + + if(CollUtil.isNotEmpty(allProjIds)){ + allBaseInfos = baseinfoService.list(Wrappers.lambdaQuery(GovBizProjectBaseinfo.class) + .eq(GovBizProjectBaseinfo::getDeleted, Boolean.FALSE) + .in(GovBizProjectBaseinfo::getBaseProjId,allProjIds)); + if(CollUtil.isNotEmpty(allBaseInfos)){ + List allBaseProjIds = allBaseInfos.stream().map(GovBizProjectBaseinfo::getBaseProjId) + .collect(Collectors.toList()); + allApplies = applyService.list(Wrappers.lambdaQuery(GovBizProjectApply.class) + .in(GovBizProjectApply::getBaseProjId,allBaseProjIds)); + allApproves = approveService.list(Wrappers.lambdaQuery(GovBizProjectApprove.class) + .in(GovBizProjectApprove::getBaseProjId,allBaseProjIds)); + allProcures = procureService.list(Wrappers.lambdaQuery(GovBizProjectProcure.class) + .in(GovBizProjectProcure::getBaseProjId,allBaseProjIds)); + } + } + + //2.4 累积 核减 + res.setAccumulatedDeductionTotalAmount(completeDeductionAmount(allProjects,allApplies, + allApproves,allProcures)); + } + + /** + * 计算核减资金的方法 + * @param projects + * @param applies + * @param approves + * @param procures + * @return + */ + private BigDecimal completeDeductionAmount(List projects, + List applies, List approves, + List procures) { + //首先完成年度计划 并且未注销的项目 + List normalProjects = projects.stream().filter(p -> { + if (Objects.nonNull(p.getStatus()) && + p.getStatus().compareTo(ProjectStatusEnum.BE_SUSPENDED.getCode()) > 0) { + return Boolean.TRUE; + } + return Boolean.FALSE; + }).collect(Collectors.toList()); + + //申报的申报金额(申报项目:初步方案申报金额 项目归集:项目总投资) + BigDecimal declaredAmountApprove = normalProjects.stream().map(p -> { + BigDecimal declareAmount = Objects.nonNull(p.getDeclareAmount()) ? + p.getDeclareAmount() : BigDecimal.ZERO; + return declareAmount; + }).reduce(BigDecimal::add).get(); + BigDecimal declaredAmountApproveGov = applies.stream().map(g -> { + BigDecimal totalAmount = Objects.nonNull(g.getBaseProjTotalAmount()) ? g.getBaseProjTotalAmount() : BigDecimal.ZERO; + return totalAmount; + }).reduce(BigDecimal::add).get(); + BigDecimal declaredAmountApproveTotal = declaredAmountApprove.add(declaredAmountApproveGov); + + //申报的批复金额(申报项目:建设方案申报金额 项目归集:建议总投资) + BigDecimal approvalAmountApprove = normalProjects.stream().map(p -> { + BigDecimal declareAmount = Objects.nonNull(p.getApprovalAmount()) ? p.getApprovalAmount() : BigDecimal.ZERO; + return declareAmount; + }).reduce(BigDecimal::add).get(); + BigDecimal approvalAmountApproveGov = approves.stream().map(p -> { + BigDecimal expertTotalMoney = Objects.nonNull(p.getBaseExpertTotalMoney()) ? p.getBaseExpertTotalMoney() : BigDecimal.ZERO; + return expertTotalMoney; + }).reduce(BigDecimal::add).get(); + BigDecimal approvalAmountApproveTotal = approvalAmountApprove.add(approvalAmountApproveGov); + //申报的差额 + BigDecimal subtractApprove = declaredAmountApproveTotal.subtract(approvalAmountApproveTotal); + + //批复的批复金额(申报项目:归集信息建议批复总投资 项目归集:建议批复总投资) + BigDecimal approvalAmountApproval = normalProjects.stream().map(p -> { + BigDecimal proposeTotalInvest = Objects.nonNull(p.getProposeTotalInvest()) ? p.getProposeTotalInvest() : BigDecimal.ZERO; + return proposeTotalInvest; + }).reduce(BigDecimal::add).get(); + BigDecimal approvalAmountApprovalGov = approves.stream().map(p -> { + BigDecimal reviewTotalMoney = Objects.nonNull(p.getBaseInitialReviewTotalMoney()) ? p.getBaseInitialReviewTotalMoney() : BigDecimal.ZERO; + return reviewTotalMoney; + }).reduce(BigDecimal::add).get(); + BigDecimal approvalAmountApprovalTotal = approvalAmountApproval.add(approvalAmountApprovalGov); + + //批复的差额 + BigDecimal subtractApproval = approvalAmountApproveTotal.subtract(approvalAmountApprovalTotal); + + //合同的批复金额(申报项目:成交金额 项目归集:成交金额) + BigDecimal approvalAmountContract = normalProjects.stream().map(p -> { + BigDecimal transactionAmount = Objects.nonNull(p.getTransactionAmount()) ? p.getTransactionAmount() : BigDecimal.ZERO; + return transactionAmount; + }).reduce(BigDecimal::add).get(); + BigDecimal approvalAmountContractGov = procures.stream().map(p -> { + BigDecimal purchaseAmount = Objects.nonNull(p.getBaseProjPurchaseAmount()) ? + p.getBaseProjPurchaseAmount() : BigDecimal.ZERO; + return purchaseAmount; + }).reduce(BigDecimal::add).get(); + BigDecimal approvalAmountContractTotal = approvalAmountContract.add(approvalAmountContractGov); + //合同的差额 + BigDecimal subtractContract = approvalAmountApprovalTotal.subtract(approvalAmountContractTotal); + + return subtractApprove.add(subtractApproval).add(subtractContract); + } + + /** + * 近三年 + * @param res + */ + private void threeYearsCompleteAmount(FundStatisticsVO res) { + //申报项目 + List threeYearsProjects = projectService.list(Wrappers.lambdaQuery(Project.class) + .eq(Project::getNewest, Boolean.TRUE) + .in(Project::getProjectYear, threeYears)); + //项目归集 + List threeYearsApplieYears = applyService.list(Wrappers.lambdaQuery(GovBizProjectApply.class) + .in(GovBizProjectApply::getBaseProjSetYear, threeYears)); + List threeYearsProjIds = threeYearsApplieYears.stream().map(GovBizProjectApply::getBaseProjId) + .collect(Collectors.toList()); + List threeYearsBaseInfos = Lists.newArrayList(); + List threeYearsApplies = Lists.newArrayList(); + List threeYearsApproves = Lists.newArrayList(); + List threeYearsProcures = Lists.newArrayList(); + + if(CollUtil.isNotEmpty(threeYearsProjIds)){ + threeYearsBaseInfos = baseinfoService.list(Wrappers.lambdaQuery(GovBizProjectBaseinfo.class) + .eq(GovBizProjectBaseinfo::getDeleted, Boolean.FALSE) + .in(GovBizProjectBaseinfo::getBaseProjId,threeYearsProjIds)); + if(CollUtil.isNotEmpty(threeYearsBaseInfos)){ + List threeYearsBaseProjIds = threeYearsBaseInfos.stream().map(GovBizProjectBaseinfo::getBaseProjId) + .collect(Collectors.toList()); + threeYearsApplies = applyService.list(Wrappers.lambdaQuery(GovBizProjectApply.class) + .in(GovBizProjectApply::getBaseProjId,threeYearsBaseProjIds)); + threeYearsApproves = approveService.list(Wrappers.lambdaQuery(GovBizProjectApprove.class) + .in(GovBizProjectApprove::getBaseProjId,threeYearsBaseProjIds)); + threeYearsProcures = procureService.list(Wrappers.lambdaQuery(GovBizProjectProcure.class) + .in(GovBizProjectProcure::getBaseProjId,threeYearsBaseProjIds)); + } + } + + //2.4 近三年 核减 + res.setThreeYearsDeductionTotalAmount(completeDeductionAmount(threeYearsProjects,threeYearsApplies, + threeYearsApproves,threeYearsProcures)); + + //安全起见 再排序下 + Arrays.sort(threeYears); + + List threeYearsDeduction = Lists.newArrayList(); + for(Integer year : threeYears){ + FundStatisticsVO.AmountData amountData = new FundStatisticsVO.AmountData(); + //申报项目 + List thisYearsProjects = projectService.list(Wrappers.lambdaQuery(Project.class) + .eq(Project::getNewest, Boolean.TRUE) + .eq(Project::getProjectYear, year)); + //项目归集 + List thisYearApplieYears = applyService.list(Wrappers.lambdaQuery(GovBizProjectApply.class) + .eq(GovBizProjectApply::getBaseProjSetYear, year)); + List thisYearProjIds = thisYearApplieYears.stream().map(GovBizProjectApply::getBaseProjId) + .collect(Collectors.toList()); + List thisYearBaseInfos = Lists.newArrayList(); + List thisYearApplies = Lists.newArrayList(); + List thisYearApproves = Lists.newArrayList(); + List thisYearProcures = Lists.newArrayList(); + + if(CollUtil.isNotEmpty(thisYearProjIds)){ + thisYearBaseInfos = baseinfoService.list(Wrappers.lambdaQuery(GovBizProjectBaseinfo.class) + .eq(GovBizProjectBaseinfo::getDeleted, Boolean.FALSE) + .in(GovBizProjectBaseinfo::getBaseProjId,threeYearsProjIds)); + if(CollUtil.isNotEmpty(thisYearBaseInfos)){ + List threeYearsBaseProjIds = threeYearsBaseInfos.stream().map(GovBizProjectBaseinfo::getBaseProjId) + .collect(Collectors.toList()); + thisYearApplies = applyService.list(Wrappers.lambdaQuery(GovBizProjectApply.class) + .in(GovBizProjectApply::getBaseProjId,threeYearsBaseProjIds)); + thisYearApproves = approveService.list(Wrappers.lambdaQuery(GovBizProjectApprove.class) + .in(GovBizProjectApprove::getBaseProjId,threeYearsBaseProjIds)); + thisYearProcures = procureService.list(Wrappers.lambdaQuery(GovBizProjectProcure.class) + .in(GovBizProjectProcure::getBaseProjId,threeYearsBaseProjIds)); + } + } + amountData.setName(year.toString()); + amountData.setAmount(completeDeductionAmount(thisYearsProjects,thisYearApplies, + thisYearApproves,thisYearProcures)); + threeYearsDeduction.add(amountData); + } + res.setThreeYearsDeduction(threeYearsDeduction); + } + + /** + * 选择年份去计算 + * @param res + */ + private void yearCompleteAmount(FundStatisticsVO res, Integer year) { + //申报项目 + List projects = projectService.list(Wrappers.lambdaQuery(Project.class) + .eq(Project::getNewest, Boolean.TRUE) + .eq(Objects.nonNull(year), Project::getProjectYear, year) + .in(Objects.isNull(year), Project::getProjectYear, years)); + //项目归集 + List applieYears = applyService.list(Wrappers.lambdaQuery(GovBizProjectApply.class) + .eq(Objects.nonNull(year), GovBizProjectApply::getBaseProjSetYear, year) + .in(Objects.isNull(year), GovBizProjectApply::getBaseProjSetYear, years)); + List yearProjIds = applieYears.stream().map(GovBizProjectApply::getBaseProjId) + .collect(Collectors.toList()); + List baseInfos = Lists.newArrayList(); + List applies = Lists.newArrayList(); + List approves = Lists.newArrayList(); + List procures = Lists.newArrayList(); + if(CollUtil.isNotEmpty(yearProjIds)){ + baseInfos = baseinfoService.list(Wrappers.lambdaQuery(GovBizProjectBaseinfo.class) + .eq(GovBizProjectBaseinfo::getDeleted, Boolean.FALSE) + .in(GovBizProjectBaseinfo::getBaseProjId,yearProjIds)); + if(CollUtil.isNotEmpty(baseInfos)){ + List baseProjIds = baseInfos.stream().map(GovBizProjectBaseinfo::getBaseProjId) + .collect(Collectors.toList()); + applies = applyService.list(Wrappers.lambdaQuery(GovBizProjectApply.class) + .in(GovBizProjectApply::getBaseProjId,baseProjIds)); + approves = approveService.list(Wrappers.lambdaQuery(GovBizProjectApprove.class) + .in(GovBizProjectApprove::getBaseProjId,baseProjIds)); + procures = procureService.list(Wrappers.lambdaQuery(GovBizProjectProcure.class) + .in(GovBizProjectProcure::getBaseProjId,baseProjIds)); + } + } + //2 + //2.1 总申请金额 + BigDecimal declaredTotalAmount = projects.stream() + .map(p -> Objects.nonNull(p.getDeclareAmount()) ? p.getDeclareAmount() : BigDecimal.ZERO) + .reduce(BigDecimal::add).get(); + BigDecimal declaredTotalAmountGov = applies.stream() + .map(a -> Objects.nonNull(a.getBaseProjTotalAmount()) ? a.getBaseProjTotalAmount() : BigDecimal.ZERO) + .reduce(BigDecimal::add).get(); + res.setDeclaredTotalAmount(declaredTotalAmount.add(declaredTotalAmountGov)); + //2.2 总批复金额 + BigDecimal approvalTotalAmount = projects.stream() + .map(p -> Objects.nonNull(p.getApprovalAmount()) ? p.getApprovalAmount() : BigDecimal.ZERO) + .reduce(BigDecimal::add).get(); + BigDecimal approvalTotalAmountGov = approves.stream() + .map(a -> Objects.nonNull(a.getBaseExpertTotalMoney()) ? a.getBaseExpertTotalMoney() : BigDecimal.ZERO) + .reduce(BigDecimal::add).get(); + res.setApprovalTotalAmount(approvalTotalAmount.add(approvalTotalAmountGov)); + //2.3 总合同金额 + BigDecimal contractTotalAmount = projects.stream() + .map(p -> Objects.nonNull(p.getContractAmount()) ? p.getContractAmount() : BigDecimal.ZERO) + .reduce(BigDecimal::add).get(); + BigDecimal contractTotalAmountGov = procures.stream() + .map(p -> Objects.nonNull(p.getBaseProjPurchaseAmount()) ? p.getBaseProjPurchaseAmount() : BigDecimal.ZERO) + .reduce(BigDecimal::add).get(); + res.setApprovalTotalAmount(contractTotalAmount.add(contractTotalAmountGov)); + } + + /** + * 专家统计 + * @param year + * @return + */ + public ExpertStatisticsVO expert(Integer year) { + ExpertStatisticsVO res = new ExpertStatisticsVO(); + + return res; + } +} diff --git a/pmapi/src/main/java/com/ningdatech/pmapi/dashboard/model/vo/ExpertStatisticsVO.java b/pmapi/src/main/java/com/ningdatech/pmapi/dashboard/model/vo/ExpertStatisticsVO.java new file mode 100644 index 0000000..cfb607e --- /dev/null +++ b/pmapi/src/main/java/com/ningdatech/pmapi/dashboard/model/vo/ExpertStatisticsVO.java @@ -0,0 +1,375 @@ +package com.ningdatech.pmapi.dashboard.model.vo; + +import com.ningdatech.pmapi.dashboard.model.entity.CockpitApplication; +import com.ningdatech.pmapi.portrait.model.entity.Tag; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; +import java.math.BigDecimal; +import java.time.LocalDateTime; +import java.util.List; +import java.util.Map; + +@Data +@ApiModel(value = "专家统计", description = "") +public class ExpertStatisticsVO implements Serializable { + private static final long serialVersionUID = 1L; + + @ApiModelProperty("区域code") + private String regionCode; + + @ApiModelProperty("区域名") + private String regionName; + + @ApiModelProperty("年份") + private Integer year; + + @ApiModelProperty("年份") + private LocalDateTime createOn; + + @ApiModelProperty("项目监测数据") + private Monitor monitorData; + + @ApiModelProperty("项目专家数据") + private Expert expertData; + + @ApiModelProperty("顶部数据") + private TopData topData; + + @ApiModelProperty("地图-项目数") + private List mapProjectData; + + @ApiModelProperty("状态-项目数") + private StatusProjectsData statusProjectsData; + + @ApiModelProperty("优秀项目数据") + private ExcellentData excellentData; + + @ApiModelProperty("核减数据") + private ReduceData reduceData; + + @ApiModelProperty("产出数据") + private ProduceData produceData; + + @ApiModelProperty("绩效数据") + private PerformanceData performanceData; + + @ApiModelProperty("最佳应用or重大应用") + private Map> appDatas; + + @ApiModelProperty("数据质量区域信息") + private List qualityDatas; + + @Data + public static class Monitor { + @ApiModelProperty("项目监控-超期建设项目数") + private Integer monitorOverdueConstructionProjectsNum; + + @ApiModelProperty("项目监控-超期建设项目-增长比例") + private String monitorOverdueConstructionProjectsRise; + + @ApiModelProperty("项目监控-环节滞后项目数") + private Integer monitorLaggingProjectsNum; + + @ApiModelProperty("项目监控-环节滞后项目-增长比例") + private String monitorLaggingProjectsRise; + + @ApiModelProperty("项目监控-预审驳回项目数") + private Integer monitorRejectedPreReviewProjectsNum; + + @ApiModelProperty("项目监控-预审驳回项目-增长比例") + private String monitorRejectedPreReviewProjectsRise; + + @ApiModelProperty("项目监控-评审驳回项目数") + private Integer monitorRejectedApproveProjectsNum; + + @ApiModelProperty("项目监控-评审驳回项目-增长比例") + private String monitorRejectedApproveProjectsRise; + + @ApiModelProperty("项目监控-验收条件未达标") + private Integer monitorAcceptConditionsNotStandardsNum; + + @ApiModelProperty("项目监控-验收条件未达标-增长比例") + private String monitorAcceptConditionsNotStandardsRise; + + @ApiModelProperty("项目监控-安全投入占比 图") + private List monitorSafetyInputRate; + + @ApiModelProperty("项目监控-等保等级图") + private List secrecyGradeCharts; + + @ApiModelProperty("项目监控-密保等级图") + private List passwordGradeCharts; + } + + @Data + public static class SecrecyGradeChart { + public SecrecyGradeChart (Integer level,Integer num){ + this.level = level; + this.num = num; + } + + @ApiModelProperty("等保等级") + private Integer level; + + @ApiModelProperty("等保数量") + private Integer num; + } + + @Data + public static class PasswordGradeChart { + public PasswordGradeChart (Integer level,Integer num){ + this.level = level; + this.num = num; + } + + @ApiModelProperty("密保等级") + private Integer level; + + @ApiModelProperty("密保数量") + private Integer num; + } + + @Data + public static class SafetyInput { + private Integer year; + private BigDecimal rate; + private Integer amount; + } + + @Data + public static class Expert { + @ApiModelProperty("专家-各区域专家数") + private List expertRegionData; + + @ApiModelProperty("专家-总人数") + private Integer expertTotalNum; + + @ApiModelProperty("专家-总人数-包含这些标签的专家总人数") + private Integer specialExpertNum; + + @ApiModelProperty("专家-方案合理性 数量") + private Integer expertPlanRationalityNum; + + @ApiModelProperty("专家-计数可行性评估 数量") + private Integer expertTechnicalFeasibilityAssessmentNum; + + @ApiModelProperty("专家-信创 数量") + private Integer expertXinchuangNum; + + @ApiModelProperty("专家-软硬件核价 数量") + private Integer expertSoftHardPricingNum; + + @ApiModelProperty("专家-党政信息 数量") + private Integer expertPartyGovInfoNum; + + @ApiModelProperty("专家-网络安全 数量") + private Integer expertNetworkSecurityNum; + + @ApiModelProperty("专家-信息化专家 数量") + private Integer expertPromotionInfoTechnologyNum; + + @ApiModelProperty("专家-财务专家 数量") + private Integer expertFinancialNum; + + @ApiModelProperty("专家-信创专家 数量") + private Integer expertXinchuangOtherNum; + } + + @Data + public static class ExpertRegion { + @ApiModelProperty("区域CODE") + private String regionCode; + + @ApiModelProperty("区域名字") + private String regionName; + + @ApiModelProperty("专家数量") + private Integer expertNum; + } + + @Data + public static class TopData { + @ApiModelProperty("顶部-计划项目数") + private Integer topPlanProjectsNum; + + @ApiModelProperty("顶部-批复项目数") + private Integer topApprovalProjectsNum; + + @ApiModelProperty("顶部-批复金额") + private BigDecimal topApprovalProjectsAmount; + + @ApiModelProperty("顶部-平均建设周期") + private Integer topAverageConstructionPeriod; + + @ApiModelProperty("顶部-在建项目数") + private Integer topOngoingProjectsNum; + } + + @Data + public static class MapProjectsData { + @ApiModelProperty("区域CODE") + private String regionCode; + + @ApiModelProperty("区域名字") + private String regionName; + + @ApiModelProperty("项目数量") + private Integer projectsNum; + } + + @Data + public static class QualityData { + @ApiModelProperty("区域CODE") + private String regionCode; + + @ApiModelProperty("区域名字") + private String regionName; + + @ApiModelProperty("质量分数") + private BigDecimal quality = BigDecimal.ZERO; + } + + @Data + public static class StatusProjectsData { + @ApiModelProperty("项目总数-计划状态") + private Integer projectsTotalPlan; + + @ApiModelProperty("项目总数-申报状态") + private Integer projectsTotalApply; + + @ApiModelProperty("项目总数-审批状态") + private Integer projectsTotalApprove; + + @ApiModelProperty("项目总数-建设状态") + private Integer projectsTotalConstruction; + + @ApiModelProperty("项目总数-验收状态") + private Integer projectsTotalAccept; + + @ApiModelProperty("项目总数-运维状态") + private Integer projectsTotalOperation; + + @ApiModelProperty("项目总数-绩效状态") + private Integer projectsTotalPerformance; + + @ApiModelProperty("项目总数-注销状态") + private Integer projectsTotalLogOff; + } + + @Data + public static class ExcellentData { + @ApiModelProperty("优秀项目-最佳应用") + private Integer excellentBestAppNum; + + @ApiModelProperty("优秀项目-重大应用") + private Integer excellentMajorAppNum; + + @ApiModelProperty("优秀项目-跨域共享数") + private Integer excellentCrossDomainSharingNum; + + @ApiModelProperty("优秀项目-跨域共享数") + private Integer excellentCrossLevelSharingNum; + + @ApiModelProperty("优秀项目-列表") + private List excellentProjects; + } + + @Data + public static class ExcellentProjects { + @ApiModelProperty("项目CODE") + private String projectCode; + + @ApiModelProperty("项目名") + private String projectName; + + @ApiModelProperty("项目简介") + private String projectIntroduction; + + @ApiModelProperty("标签") + private List tags; + } + + @Data + public static class ReduceData { + @ApiModelProperty("核减资金") + private BigDecimal reduceFundsTotal; + + @ApiModelProperty("驳回节约资金") + private BigDecimal rejectSavingsFunds; + + @ApiModelProperty("资金对比图") + private List amountComparisonCharts; + } + + @Data + public static class AmountComparisonChart { + public AmountComparisonChart (String statusName,BigDecimal declaredAmount,BigDecimal approvalAmount,BigDecimal differenceAmount){ + this.statusName = statusName; + this.declaredAmount = declaredAmount; + this.approvalAmount = approvalAmount; + this.differenceAmount = differenceAmount; + } + + @ApiModelProperty("状态名") + private String statusName; + + @ApiModelProperty("申报金额") + private BigDecimal declaredAmount; + + @ApiModelProperty("批复金额") + private BigDecimal approvalAmount; + + @ApiModelProperty("差额") + private BigDecimal differenceAmount; + } + + @Data + public static class ProduceData { + @ApiModelProperty("产出-应用数量") + private Integer produceAppNum; + @ApiModelProperty("产出-数据产品") + private Integer produceDataNum; + @ApiModelProperty("产出-组件数") + private Integer produceComponentNum; + @ApiModelProperty("产出-大脑要素") + private Integer produceBrainElementsNum; + @ApiModelProperty("产出-大脑要素") + private Integer produceBrainModelNum; + } + + @Data + public static class PerformanceData { + @ApiModelProperty("绩效-项目总数量") + private Integer performanceTotal; + + @ApiModelProperty("绩效-未评价数量") + private Integer performanceTobeReviewTotal; + + @ApiModelProperty("绩效-已评价数量") + private Integer performanceReviewedTotal; + + @ApiModelProperty("绩效-top数据") + private List performanceTops; + } + + @Data + public static class PerformanceTop { + public PerformanceTop (String topName,BigDecimal score,String appName){ + this.topName = topName; + this.score = score; + this.appName = appName; + } + + @ApiModelProperty("绩效-top") + private String topName; + + @ApiModelProperty("分数") + private BigDecimal score; + + @ApiModelProperty("应用名称") + private String appName; + } +} \ No newline at end of file diff --git a/pmapi/src/main/java/com/ningdatech/pmapi/dashboard/model/vo/FundStatisticsVO.java b/pmapi/src/main/java/com/ningdatech/pmapi/dashboard/model/vo/FundStatisticsVO.java new file mode 100644 index 0000000..ad7d43c --- /dev/null +++ b/pmapi/src/main/java/com/ningdatech/pmapi/dashboard/model/vo/FundStatisticsVO.java @@ -0,0 +1,55 @@ +package com.ningdatech.pmapi.dashboard.model.vo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.List; + +@Data +@ApiModel(value = "项目资金统计", description = "") +public class FundStatisticsVO implements Serializable { + private static final long serialVersionUID = 1L; + + @ApiModelProperty("累积核减总资金") + private BigDecimal accumulatedDeductionTotalAmount; + + @ApiModelProperty("近三年核减总资金") + private BigDecimal threeYearsDeductionTotalAmount; + + @ApiModelProperty("申请总金额") + private BigDecimal declaredTotalAmount; + + @ApiModelProperty("批复总金额") + private BigDecimal approvalTotalAmount; + + @ApiModelProperty("合同总金额") + private BigDecimal contractTotalAmount; + + @ApiModelProperty("近三年核减数据") + private List threeYearsDeduction; + + @ApiModelProperty("计划阶段核减情况") + private List planDeduction; + + @ApiModelProperty("批复阶段阶段核减情况") + private List approvalDeduction; + + @ApiModelProperty("合同阶段阶段核减情况") + private List contractDeduction; + + @ApiModelProperty("各部门核减TOP10") + private List departmentTop10; + + + @Data + public static class AmountData{ + @ApiModelProperty("金额") + private BigDecimal amount; + + @ApiModelProperty("名称") + private String name; + } +} \ No newline at end of file diff --git a/pmapi/src/main/java/com/ningdatech/pmapi/gov/manage/GovProjectCollectionManage.java b/pmapi/src/main/java/com/ningdatech/pmapi/gov/manage/GovProjectCollectionManage.java index 2236e8a..b58584a 100644 --- a/pmapi/src/main/java/com/ningdatech/pmapi/gov/manage/GovProjectCollectionManage.java +++ b/pmapi/src/main/java/com/ningdatech/pmapi/gov/manage/GovProjectCollectionManage.java @@ -1697,9 +1697,7 @@ public class GovProjectCollectionManage { StringJoiner sj = convertAndUpload(procure.getBiddingFile()); saveProcure.setBiddingFilePdf(sj.toString()); } - Boolean purchaseContract = checkFieldNotPdf(procure.getPurchaseContract(), o, "purchaseContract"); - log.info("是否转换 采购合同 purchaseContract:{}",purchaseContract); - if(purchaseContract){ + if(checkFieldNotPdf(procure.getPurchaseContract(), o, "purchaseContract")){ StringJoiner sj = convertAndUpload(procure.getPurchaseContract()); saveProcure.setPurchaseContractPdf(sj.toString()); } diff --git a/pmapi/src/main/java/com/ningdatech/pmapi/projectlib/enumeration/WarningFlowTypeEnum.java b/pmapi/src/main/java/com/ningdatech/pmapi/projectlib/enumeration/WarningFlowTypeEnum.java index f1e8cea..73160e4 100644 --- a/pmapi/src/main/java/com/ningdatech/pmapi/projectlib/enumeration/WarningFlowTypeEnum.java +++ b/pmapi/src/main/java/com/ningdatech/pmapi/projectlib/enumeration/WarningFlowTypeEnum.java @@ -20,11 +20,11 @@ public enum WarningFlowTypeEnum { /** * 预警填报类型枚举 */ - UNIT_INNER_AUDIT(1, "预审申报",ProjectStatusEnum.PENDING_PREQUALIFICATION.getCode(),"declareManage/preExaminationDeclare"), + UNIT_INNER_AUDIT(1, "预审申报",ProjectStatusEnum.PENDING_PREQUALIFICATION.getCode(),"declareManage/planDeclaration/preExaminationDeclare"), PRELIMINARY_PREVIEW(2, "建设方案申报",ProjectStatusEnum.PLAN_TO_BE_DECLARED.getCode(),"declareManage/constructionPlanDeclare"), - DEPT_UNITED_REVIEW(3,"采购结果备案",ProjectStatusEnum.TO_BE_PURCHASED.getCode(),"declareManage/purchaseResults"), - CONSTRUCTION_PLAN_REVIEW(4,"初验备案",ProjectStatusEnum.UNDER_CONSTRUCTION.getCode(),"declareManage/initialInspectionRecord"), - PROJECT_FINAL_INSPECTION(5,"验收申报",ProjectStatusEnum.TO_BE_FINALLY_INSPECTED.getCode(),"declareManage/finalInspectionDeclare"); + DEPT_UNITED_REVIEW(3,"采购结果备案",ProjectStatusEnum.TO_BE_PURCHASED.getCode(),"declareManage/procurementRecord/purchaseResults"), + CONSTRUCTION_PLAN_REVIEW(4,"初验备案",ProjectStatusEnum.UNDER_CONSTRUCTION.getCode(),"declareManage/acceptanceApply/initialInspectionRecord"), + PROJECT_FINAL_INSPECTION(5,"验收申报",ProjectStatusEnum.TO_BE_FINALLY_INSPECTED.getCode(),"declareManage/acceptanceApply/finalInspectionDeclare"); private Integer code; private String desc; diff --git a/pmapi/src/main/java/com/ningdatech/pmapi/projectlib/enumeration/WarningOperationTypeEnum.java b/pmapi/src/main/java/com/ningdatech/pmapi/projectlib/enumeration/WarningOperationTypeEnum.java index 37120c2..3fbad57 100644 --- a/pmapi/src/main/java/com/ningdatech/pmapi/projectlib/enumeration/WarningOperationTypeEnum.java +++ b/pmapi/src/main/java/com/ningdatech/pmapi/projectlib/enumeration/WarningOperationTypeEnum.java @@ -20,8 +20,8 @@ public enum WarningOperationTypeEnum { /** * 预警实施类型枚举 */ - CHUYAN(1, "项目初验",ProjectStatusEnum.UNDER_CONSTRUCTION.getCode(),"declareManage/initialInspectionRecord"), - ZHONGYAN(2, "项目终验",ProjectStatusEnum.TO_BE_FINALLY_INSPECTED.getCode(),"declareManage/finalInspectionDeclare"); + CHUYAN(1, "项目初验",ProjectStatusEnum.UNDER_CONSTRUCTION.getCode(),"declareManage/acceptanceApply/initialInspectionRecord"), + ZHONGYAN(2, "项目终验",ProjectStatusEnum.TO_BE_FINALLY_INSPECTED.getCode(),"declareManage/acceptanceApply/finalInspectionDeclare"); private Integer code; private String desc; diff --git a/pmapi/src/main/java/com/ningdatech/pmapi/projectlib/manage/ProjectRenewalFundManage.java b/pmapi/src/main/java/com/ningdatech/pmapi/projectlib/manage/ProjectRenewalFundManage.java index 7232413..dd1ce2c 100644 --- a/pmapi/src/main/java/com/ningdatech/pmapi/projectlib/manage/ProjectRenewalFundManage.java +++ b/pmapi/src/main/java/com/ningdatech/pmapi/projectlib/manage/ProjectRenewalFundManage.java @@ -381,7 +381,7 @@ public class ProjectRenewalFundManage { } //判断金额 -// checkPaymentAmount(projectCode,projectYear,dto.getAnnualPaymentAmount()); + checkPaymentAmount(projectCode,projectYear,dto.getAnnualPaymentAmount()); declaration.setApprovalStatus(ProjectRenewalApprovalStatusEnum.PENDING.name()); if(Objects.nonNull(project)){ 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 index 1b6f69e..dfff299 100644 --- a/pmapi/src/main/java/com/ningdatech/pmapi/scheduler/task/CockpitStatsStatisticsTask.java +++ b/pmapi/src/main/java/com/ningdatech/pmapi/scheduler/task/CockpitStatsStatisticsTask.java @@ -209,24 +209,26 @@ public class CockpitStatsStatisticsTask { 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), + .in(Objects.isNull(year) || year.equals(DashboardConstant.CockpitStats.NONE_YEAR), Project::getProjectYear, years)); //项目归集 List applieYears = applyService.list(Wrappers.lambdaQuery(GovBizProjectApply.class) .eq(Objects.nonNull(year) && !year.equals(DashboardConstant.CockpitStats.NONE_YEAR), GovBizProjectApply::getBaseProjSetYear, year) - .in(Objects.isNull(year) && year.equals(DashboardConstant.CockpitStats.NONE_YEAR), + .in(Objects.isNull(year) || year.equals(DashboardConstant.CockpitStats.NONE_YEAR), GovBizProjectApply::getBaseProjSetYear, years)); List yearProjIds = applieYears.stream().map(GovBizProjectApply::getBaseProjId) .collect(Collectors.toList()); - List baseInfos = baseinfoService.list(Wrappers.lambdaQuery(GovBizProjectBaseinfo.class) - .eq(GovBizProjectBaseinfo::getDeleted, Boolean.FALSE) - .eq(StringUtils.isNotBlank(regionCode) && !DashboardConstant.CockpitStats.TOTAL.equals(regionCode), - GovBizProjectBaseinfo::getBaseAreaCode, regionCode + RegionContant.MORE_CODE) - .in(CollUtil.isNotEmpty(yearProjIds),GovBizProjectBaseinfo::getBaseProjId,yearProjIds) - .in(CollUtil.isEmpty(yearProjIds),GovBizProjectBaseinfo::getBaseProjId,Lists.newArrayList(BizConst.NINE_AREA_CODE_LAST))); + List baseInfos = Lists.newArrayList(); + if(CollUtil.isNotEmpty(yearProjIds)){ + baseInfos = baseinfoService.list(Wrappers.lambdaQuery(GovBizProjectBaseinfo.class) + .eq(GovBizProjectBaseinfo::getDeleted, Boolean.FALSE) + .eq(StringUtils.isNotBlank(regionCode) && !DashboardConstant.CockpitStats.TOTAL.equals(regionCode), + GovBizProjectBaseinfo::getBaseAreaCode, regionCode + RegionContant.MORE_CODE) + .in(GovBizProjectBaseinfo::getBaseProjId,yearProjIds)); + } List approves = Lists.newArrayList(); List applies = Lists.newArrayList(); @@ -483,22 +485,22 @@ public class CockpitStatsStatisticsTask { return Boolean.FALSE; }).collect(Collectors.toList()).size(); - Double approvalAmount = projects.stream().filter(p -> { + BigDecimal approvalAmount = projects.stream().filter(p -> { if(Objects.nonNull(p.getApprovalAmount())){ return Boolean.TRUE; } return Boolean.FALSE; - }).mapToDouble(p -> p.getApprovalAmount().doubleValue()).sum(); + }).map(Project::getApprovalAmount).reduce(BigDecimal::add).get(); - Double approvalAmountGov = approves.stream().filter(a -> { + BigDecimal approvalAmountGov = approves.stream().filter(a -> { if(Objects.nonNull(a.getBaseInitialReviewTotalMoney())){ return Boolean.TRUE; } return Boolean.FALSE; - }).mapToDouble(a -> a.getBaseInitialReviewTotalMoney().doubleValue()).sum(); + }).map(GovBizProjectApprove::getBaseInitialReviewTotalMoney).reduce(BigDecimal::add).get(); cockpitStats.setTopApprovalProjectsNum(approvalNumDeclared + approvalNumGov); - cockpitStats.setTopApprovalProjectsAmount(BigDecimal.valueOf(approvalAmount).add(BigDecimal.valueOf(approvalAmountGov))); + cockpitStats.setTopApprovalProjectsAmount(approvalAmount.add(approvalAmountGov)); //3.3 平均建设周期 OptionalDouble od = Stream.concat(projects.stream().map(Project::getBuildCycle), applies.stream().map(GovBizProjectApply::getBaseProjDuration)).mapToInt(c -> { @@ -674,13 +676,13 @@ public class CockpitStatsStatisticsTask { } return Boolean.FALSE; }).collect(Collectors.toList()); - Double rejectPreSum = rejectPreProjects.stream().mapToDouble(p -> { + BigDecimal rejectPreSum = rejectPreProjects.stream().map(p -> { if (Objects.nonNull(p.getDeclareAmount())) { - return p.getDeclareAmount().doubleValue(); + return p.getDeclareAmount(); } - return 0.0; - }).sum(); - cockpitStats.setRejectSavingsFunds(BigDecimal.valueOf(rejectPreSum)); + return BigDecimal.ZERO; + }).reduce(BigDecimal::add).get(); + cockpitStats.setRejectSavingsFunds(rejectPreSum); //7.3 柱状图 //7.3.1 申报状态的3个资金 @@ -695,27 +697,28 @@ public class CockpitStatsStatisticsTask { }).collect(Collectors.toList()); //申报的申报金额(申报项目:初步方案申报金额 项目归集:项目总投资) - Double declaredAmountApprove = normalProjects.stream().mapToDouble(p -> { - BigDecimal declareAmount = Objects.nonNull(p.getDeclareAmount()) ? p.getDeclareAmount() : BigDecimal.ZERO; - return declareAmount.doubleValue(); - }).sum(); - Double declaredAmountApproveGov = applies.stream().mapToDouble(g -> { + BigDecimal declaredAmountApprove = normalProjects.stream().map(p -> { + BigDecimal declareAmount = Objects.nonNull(p.getDeclareAmount()) ? + p.getDeclareAmount() : BigDecimal.ZERO; + return declareAmount; + }).reduce(BigDecimal::add).get(); + BigDecimal declaredAmountApproveGov = applies.stream().map(g -> { BigDecimal totalAmount = Objects.nonNull(g.getBaseProjTotalAmount()) ? g.getBaseProjTotalAmount() : BigDecimal.ZERO; - return totalAmount.doubleValue(); - }).sum(); - BigDecimal declaredAmountApproveTotal = BigDecimal.valueOf(declaredAmountApprove).add(BigDecimal.valueOf(declaredAmountApproveGov)); + return totalAmount; + }).reduce(BigDecimal::add).get(); + BigDecimal declaredAmountApproveTotal = declaredAmountApprove.add(declaredAmountApproveGov); cockpitStats.setDeclaredAmountApprove(declaredAmountApproveTotal); //申报的批复金额(申报项目:建设方案申报金额 项目归集:建议总投资) - Double approvalAmountApprove = normalProjects.stream().mapToDouble(p -> { + BigDecimal approvalAmountApprove = normalProjects.stream().map(p -> { BigDecimal declareAmount = Objects.nonNull(p.getApprovalAmount()) ? p.getApprovalAmount() : BigDecimal.ZERO; - return declareAmount.doubleValue(); - }).sum(); - Double approvalAmountApproveGov = approves.stream().mapToDouble(p -> { + return declareAmount; + }).reduce(BigDecimal::add).get(); + BigDecimal approvalAmountApproveGov = approves.stream().map(p -> { BigDecimal expertTotalMoney = Objects.nonNull(p.getBaseExpertTotalMoney()) ? p.getBaseExpertTotalMoney() : BigDecimal.ZERO; - return expertTotalMoney.doubleValue(); - }).sum(); - BigDecimal approvalAmountApproveTotal = BigDecimal.valueOf(approvalAmountApprove).add(BigDecimal.valueOf(approvalAmountApproveGov)); + return expertTotalMoney; + }).reduce(BigDecimal::add).get(); + BigDecimal approvalAmountApproveTotal = approvalAmountApprove.add(approvalAmountApproveGov); cockpitStats.setApprovalAmountApprove(approvalAmountApproveTotal); //申报的差额 BigDecimal subtractApprove = declaredAmountApproveTotal.subtract(approvalAmountApproveTotal); @@ -725,15 +728,15 @@ public class CockpitStatsStatisticsTask { cockpitStats.setDeclaredAmountApproval(approvalAmountApproveTotal); //批复的批复金额(申报项目:归集信息建议批复总投资 项目归集:建议批复总投资) - Double approvalAmountApproval = normalProjects.stream().mapToDouble(p -> { + BigDecimal approvalAmountApproval = normalProjects.stream().map(p -> { BigDecimal proposeTotalInvest = Objects.nonNull(p.getProposeTotalInvest()) ? p.getProposeTotalInvest() : BigDecimal.ZERO; - return proposeTotalInvest.doubleValue(); - }).sum(); - Double approvalAmountApprovalGov = approves.stream().mapToDouble(p -> { + return proposeTotalInvest; + }).reduce(BigDecimal::add).get(); + BigDecimal approvalAmountApprovalGov = approves.stream().map(p -> { BigDecimal reviewTotalMoney = Objects.nonNull(p.getBaseInitialReviewTotalMoney()) ? p.getBaseInitialReviewTotalMoney() : BigDecimal.ZERO; - return reviewTotalMoney.doubleValue(); - }).sum(); - BigDecimal approvalAmountApprovalTotal = BigDecimal.valueOf(approvalAmountApproval).add(BigDecimal.valueOf(approvalAmountApprovalGov)); + return reviewTotalMoney; + }).reduce(BigDecimal::add).get(); + BigDecimal approvalAmountApprovalTotal = approvalAmountApproval.add(approvalAmountApprovalGov); cockpitStats.setApprovalAmountApproval(approvalAmountApprovalTotal); //批复的差额 @@ -744,16 +747,16 @@ public class CockpitStatsStatisticsTask { cockpitStats.setDeclaredAmountContract(approvalAmountApprovalTotal); //合同的批复金额(申报项目:成交金额 项目归集:成交金额) - Double approvalAmountContract = normalProjects.stream().mapToDouble(p -> { + BigDecimal approvalAmountContract = normalProjects.stream().map(p -> { BigDecimal transactionAmount = Objects.nonNull(p.getTransactionAmount()) ? p.getTransactionAmount() : BigDecimal.ZERO; - return transactionAmount.doubleValue(); - }).sum(); - Double approvalAmountContractGov = procures.stream().mapToDouble(p -> { + return transactionAmount; + }).reduce(BigDecimal::add).get(); + BigDecimal approvalAmountContractGov = procures.stream().map(p -> { BigDecimal purchaseAmount = Objects.nonNull(p.getBaseProjPurchaseAmount()) ? p.getBaseProjPurchaseAmount() : BigDecimal.ZERO; - return purchaseAmount.doubleValue(); - }).sum(); - BigDecimal approvalAmountContractTotal = BigDecimal.valueOf(approvalAmountContract).add(BigDecimal.valueOf(approvalAmountContractGov)); + return purchaseAmount; + }).reduce(BigDecimal::add).get(); + BigDecimal approvalAmountContractTotal = approvalAmountContract.add(approvalAmountContractGov); cockpitStats.setApprovalAmountContract(approvalAmountContractTotal); //合同的差额 diff --git a/pmapi/src/test/java/com/ningdatech/pmapi/expert/ExpertTest.java b/pmapi/src/test/java/com/ningdatech/pmapi/expert/ExpertTest.java new file mode 100644 index 0000000..6fd47a3 --- /dev/null +++ b/pmapi/src/test/java/com/ningdatech/pmapi/expert/ExpertTest.java @@ -0,0 +1,73 @@ +package com.ningdatech.pmapi.expert; + +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.google.common.collect.Lists; +import com.ningdatech.pmapi.AppTests; +import com.ningdatech.pmapi.common.constant.RegionConst; +import com.ningdatech.pmapi.dashboard.constant.DashboardConstant; +import com.ningdatech.pmapi.expert.entity.ExpertUserFullInfo; +import com.ningdatech.pmapi.expert.service.IExpertUserFullInfoService; +import com.ningdatech.pmapi.meta.model.entity.ExpertTag; +import com.ningdatech.pmapi.meta.service.IExpertTagService; +import org.apache.commons.lang3.StringUtils; +import org.junit.Test; +import org.springframework.beans.factory.annotation.Autowired; + +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +/** + * @Classname ExpertTest + * @Description + * @Date 2023/11/24 9:35 + * @Author PoffyZhang + */ +public class ExpertTest extends AppTests { + + @Autowired + private IExpertTagService expertTagService; + + @Autowired + private IExpertUserFullInfoService expertUserFullInfoService; + + @Test + public void test(){ + List lsRegionCodes = RegionConst.LS_ARR; + List experts = expertUserFullInfoService.list(Wrappers.lambdaQuery(ExpertUserFullInfo.class) + .in(ExpertUserFullInfo::getRegionCode,lsRegionCodes) + .eq(ExpertUserFullInfo::getExpertAccountStatus,"available")); + + List goodAt = expertTagService.list(Wrappers.lambdaQuery(ExpertTag.class)); + Map> tagMap = goodAt.stream() + .collect(Collectors.groupingBy(ExpertTag::getUserId)); + + String networkCode = "1030000"; + String xinchuangCode = "2040000"; + String fanganCode = "2030000"; + String jishuCode = "2010000"; + String dangzhengCode = "1020000"; + String ruanyingCode = "2020000"; + String caiwuCode = "5600000"; + List specialTags = Lists.newArrayList(networkCode,xinchuangCode,fanganCode,jishuCode, + dangzhengCode,ruanyingCode,caiwuCode); + + List users = Lists.newArrayList(); + for(ExpertUserFullInfo e : experts) { + if (tagMap.containsKey(e.getUserId())) { + List expertTags = tagMap.get(e.getUserId()); + Boolean isContain = Boolean.FALSE; + for (ExpertTag expertTag : expertTags) { + if (specialTags.contains(expertTag.getTagCode())) { + isContain = Boolean.TRUE; + } + } + if (!isContain) { + users.add(e.getUserId()); + } + } + } + System.out.println(users); + } + +}