@@ -13,6 +13,4 @@ public class AnalysisBasicConstant { | |||||
*/ | */ | ||||
public static final String LS_REGION_CODE = "331100"; | public static final String LS_REGION_CODE = "331100"; | ||||
} | } |
@@ -25,5 +25,30 @@ public enum ChartTypeEnum { | |||||
/** | /** | ||||
* 各类型评审次数 | * 各类型评审次数 | ||||
*/ | */ | ||||
MEETING_TYPE_CNT_CHART; | |||||
MEETING_TYPE_CNT_CHART, | |||||
/** | |||||
* 项目增补情况 | |||||
*/ | |||||
PROJECT_SUPPLEMENTATION_STATUS_CHART, | |||||
/** | |||||
* 各类型项目数量 | |||||
*/ | |||||
EACH_TYPE_QUANTITY_OF_PROJECT_CHART, | |||||
/** | |||||
* 各区域项目数量 | |||||
*/ | |||||
PROJECTS_NUMBER_IN_EACH_REGION_CHART, | |||||
/** | |||||
* 各领域项目数量 | |||||
*/ | |||||
PROJECTS_NUMBER_IN_VARIOUS_FIELDS_CHART, | |||||
/** | |||||
* 各阶段项目数量 | |||||
*/ | |||||
PROJECTS_NUMBER_IN_EACH_STAGE_CHART | |||||
} | } |
@@ -62,5 +62,4 @@ public class DashboardController { | |||||
return dashboardProjectManage.getInvestmentSummary(queryYearPO); | return dashboardProjectManage.getInvestmentSummary(queryYearPO); | ||||
} | } | ||||
} | } |
@@ -0,0 +1,55 @@ | |||||
package com.ningdatech.pmapi.dashboard.helper; | |||||
import cn.hutool.core.collection.CollUtil; | |||||
import com.ningdatech.pmapi.dashboard.constant.ChartTypeEnum; | |||||
import com.ningdatech.pmapi.dashboard.model.basic.AnalysisChart; | |||||
import com.ningdatech.pmapi.dashboard.model.basic.AnalysisData; | |||||
import com.ningdatech.pmapi.projectlib.enumeration.ProjectStatusEnum; | |||||
import com.ningdatech.pmapi.projectlib.model.entity.Project; | |||||
import org.springframework.stereotype.Component; | |||||
import java.util.ArrayList; | |||||
import java.util.List; | |||||
import java.util.Map; | |||||
/** | |||||
* @author liuxinxin | |||||
* @date 2023/8/4 下午2:36 | |||||
*/ | |||||
@Component | |||||
public class DashboardChartAssembler { | |||||
public static AnalysisChart buildProjectStateAnalysisChart(Map<Integer, List<Project>> projectGroupMap, ChartTypeEnum chartTypeEnum) { | |||||
AnalysisChart analysisChart = new AnalysisChart(); | |||||
List<AnalysisData> dataList = new ArrayList<>(); | |||||
analysisChart.setChartType(chartTypeEnum); | |||||
analysisChart.setDataList(dataList); | |||||
for (Integer key : projectGroupMap.keySet()) { | |||||
AnalysisData analysisData = new AnalysisData(); | |||||
String chartKey = ProjectStatusEnum.getDesc(key); | |||||
List<Project> projectList = projectGroupMap.get(key); | |||||
analysisData.setKey(chartKey); | |||||
analysisData.setValue(CollUtil.isEmpty(projectList) ? 0 : projectList.size()); | |||||
dataList.add(analysisData); | |||||
} | |||||
return analysisChart; | |||||
} | |||||
public static <T> AnalysisChart buildAnalysisChart(Map<T, String> keyValueMap | |||||
, Map<T, List<Project>> projectGroupMap, ChartTypeEnum chartTypeEnum) { | |||||
AnalysisChart analysisChart = new AnalysisChart(); | |||||
List<AnalysisData> dataList = new ArrayList<>(); | |||||
analysisChart.setChartType(chartTypeEnum); | |||||
analysisChart.setDataList(dataList); | |||||
for (T key : keyValueMap.keySet()) { | |||||
AnalysisData analysisData = new AnalysisData(); | |||||
String chartKey = keyValueMap.get(key); | |||||
List<Project> projectList = projectGroupMap.get(key); | |||||
analysisData.setKey(chartKey); | |||||
analysisData.setValue(CollUtil.isEmpty(projectList) ? 0 : projectList.size()); | |||||
dataList.add(analysisData); | |||||
} | |||||
return analysisChart; | |||||
} | |||||
} |
@@ -0,0 +1,77 @@ | |||||
package com.ningdatech.pmapi.dashboard.helper; | |||||
import com.baomidou.mybatisplus.core.toolkit.Wrappers; | |||||
import com.ningdatech.pmapi.dashboard.constant.AnalysisBasicConstant; | |||||
import com.ningdatech.pmapi.sys.model.entity.Region; | |||||
import com.ningdatech.pmapi.sys.service.IRegionService; | |||||
import lombok.RequiredArgsConstructor; | |||||
import org.springframework.stereotype.Component; | |||||
import java.util.HashMap; | |||||
import java.util.List; | |||||
import java.util.Map; | |||||
import java.util.stream.Collectors; | |||||
/** | |||||
* @author liuxinxin | |||||
* @date 2023/8/3 下午3:13 | |||||
*/ | |||||
@Component | |||||
@RequiredArgsConstructor | |||||
public class DashboardHelper { | |||||
private final IRegionService iRegionService; | |||||
/** | |||||
* 获取丽水区域相关信息 | |||||
*/ | |||||
public Map<String, String> getLiShuiRegionCodeNameMap() { | |||||
List<Region> regionList = iRegionService.list(Wrappers.lambdaQuery(Region.class) | |||||
.eq(Region::getParentCode, AnalysisBasicConstant.LS_REGION_CODE)); | |||||
Map<String, String> regionCodeNameMap = regionList.stream().collect(Collectors.toMap(Region::getRegionCode, Region::getRegionName)); | |||||
return regionCodeNameMap; | |||||
} | |||||
/** | |||||
* 获取增补情况键值表 | |||||
*/ | |||||
public Map<Integer, String> getTemporaryAugmentMap() { | |||||
// 0:否 1:是 | |||||
Map<Integer, String> map = new HashMap<>(); | |||||
map.put(1, "增补项目"); | |||||
map.put(0, "非增补项目"); | |||||
return map; | |||||
} | |||||
/** | |||||
* 获取项目类型键值表 | |||||
*/ | |||||
public Map<Integer, String> getProjectTypeMap() { | |||||
// "项目类型 1:建设 2:运维 | |||||
Map<Integer, String> map = new HashMap<>(); | |||||
map.put(1, "建设"); | |||||
map.put(2, "运维"); | |||||
return map; | |||||
} | |||||
/** | |||||
* 获取项目类型键值表 | |||||
*/ | |||||
public Map<Integer, String> getBizDomainMap() { | |||||
// 综合业务领域 1: '党政机关整体智治',2: '数字政府',3: '数字经济',4: '数字社会',7: '数字文化',5: '数字法治',6: '一体化智能化公共数据平台', 8: '基层智治' | |||||
Map<Integer, String> map = new HashMap<>(); | |||||
map.put(1, "党政机关整体智治"); | |||||
map.put(2, "数字政府"); | |||||
map.put(3, "数字经济"); | |||||
map.put(4, "数字社会"); | |||||
map.put(5, "数字文化"); | |||||
map.put(6, "数字法治"); | |||||
map.put(7, "一体化智能化公共数据平台"); | |||||
map.put(8, "基层智治"); | |||||
return map; | |||||
} | |||||
} |
@@ -1,35 +0,0 @@ | |||||
package com.ningdatech.pmapi.dashboard.helper; | |||||
import com.baomidou.mybatisplus.core.toolkit.Wrappers; | |||||
import com.ningdatech.pmapi.dashboard.constant.AnalysisBasicConstant; | |||||
import com.ningdatech.pmapi.sys.model.entity.Region; | |||||
import com.ningdatech.pmapi.sys.service.IRegionService; | |||||
import lombok.RequiredArgsConstructor; | |||||
import org.springframework.stereotype.Component; | |||||
import java.util.List; | |||||
import java.util.Map; | |||||
import java.util.stream.Collectors; | |||||
/** | |||||
* @author liuxinxin | |||||
* @date 2023/8/3 下午3:13 | |||||
*/ | |||||
@Component | |||||
@RequiredArgsConstructor | |||||
public class DashboardRegionHelper { | |||||
private final IRegionService iRegionService; | |||||
/** | |||||
* 获取丽水区域相关信息 | |||||
*/ | |||||
public Map<String, String> getLiShuiRegionCodeNameMap() { | |||||
List<Region> regionList = iRegionService.list(Wrappers.lambdaQuery(Region.class) | |||||
.eq(Region::getParentCode, AnalysisBasicConstant.LS_REGION_CODE)); | |||||
Map<String, String> regionCodeNameMap = regionList.stream().collect(Collectors.toMap(Region::getRegionCode, Region::getRegionName)); | |||||
return regionCodeNameMap; | |||||
} | |||||
} |
@@ -4,7 +4,7 @@ import cn.hutool.core.collection.CollectionUtil; | |||||
import com.baomidou.mybatisplus.core.toolkit.StringUtils; | import com.baomidou.mybatisplus.core.toolkit.StringUtils; | ||||
import com.baomidou.mybatisplus.core.toolkit.Wrappers; | import com.baomidou.mybatisplus.core.toolkit.Wrappers; | ||||
import com.ningdatech.pmapi.dashboard.constant.ChartTypeEnum; | import com.ningdatech.pmapi.dashboard.constant.ChartTypeEnum; | ||||
import com.ningdatech.pmapi.dashboard.helper.DashboardRegionHelper; | |||||
import com.ningdatech.pmapi.dashboard.helper.DashboardHelper; | |||||
import com.ningdatech.pmapi.dashboard.model.basic.AnalysisChart; | import com.ningdatech.pmapi.dashboard.model.basic.AnalysisChart; | ||||
import com.ningdatech.pmapi.dashboard.model.basic.AnalysisData; | import com.ningdatech.pmapi.dashboard.model.basic.AnalysisData; | ||||
import com.ningdatech.pmapi.dashboard.model.basic.StarExpertBO; | import com.ningdatech.pmapi.dashboard.model.basic.StarExpertBO; | ||||
@@ -38,7 +38,7 @@ import java.util.stream.Collectors; | |||||
@RequiredArgsConstructor | @RequiredArgsConstructor | ||||
public class DashboardExpertManage { | public class DashboardExpertManage { | ||||
private final DashboardRegionHelper dashboardRegionHelper; | |||||
private final DashboardHelper dashboardHelper; | |||||
private final IExpertUserFullInfoService iExpertUserFullInfoService; | private final IExpertUserFullInfoService iExpertUserFullInfoService; | ||||
private final IMeetingService iMeetingService; | private final IMeetingService iMeetingService; | ||||
private final DictionaryCache dictionaryCache; | private final DictionaryCache dictionaryCache; | ||||
@@ -51,7 +51,7 @@ public class DashboardExpertManage { | |||||
List<AnalysisChart> analysisChartList = new ArrayList<>(); | List<AnalysisChart> analysisChartList = new ArrayList<>(); | ||||
// 获取丽水区域 code name Map | // 获取丽水区域 code name Map | ||||
Map<String, String> liShuiRegionCodeNameMap = dashboardRegionHelper.getLiShuiRegionCodeNameMap(); | |||||
Map<String, String> liShuiRegionCodeNameMap = dashboardHelper.getLiShuiRegionCodeNameMap(); | |||||
// 获取库内所有的专家列表 | // 获取库内所有的专家列表 | ||||
List<ExpertUserFullInfo> evidenceHasBeenSubmittedExpertInfoList = iExpertUserFullInfoService.list(Wrappers.lambdaQuery(ExpertUserFullInfo.class) | List<ExpertUserFullInfo> evidenceHasBeenSubmittedExpertInfoList = iExpertUserFullInfoService.list(Wrappers.lambdaQuery(ExpertUserFullInfo.class) | ||||
.eq(ExpertUserFullInfo::getUserInfoStep, ExpertUserInfoStepEnum.EVIDENCE_HAS_BEEN_SUBMITTED.getKey())); | .eq(ExpertUserFullInfo::getUserInfoStep, ExpertUserInfoStepEnum.EVIDENCE_HAS_BEEN_SUBMITTED.getKey())); | ||||
@@ -2,6 +2,10 @@ package com.ningdatech.pmapi.dashboard.manage; | |||||
import com.baomidou.mybatisplus.core.toolkit.StringUtils; | import com.baomidou.mybatisplus.core.toolkit.StringUtils; | ||||
import com.baomidou.mybatisplus.core.toolkit.Wrappers; | import com.baomidou.mybatisplus.core.toolkit.Wrappers; | ||||
import com.ningdatech.pmapi.dashboard.constant.ChartTypeEnum; | |||||
import com.ningdatech.pmapi.dashboard.helper.DashboardChartAssembler; | |||||
import com.ningdatech.pmapi.dashboard.helper.DashboardHelper; | |||||
import com.ningdatech.pmapi.dashboard.model.basic.AnalysisChart; | |||||
import com.ningdatech.pmapi.dashboard.model.basic.QueryTimeYearBO; | import com.ningdatech.pmapi.dashboard.model.basic.QueryTimeYearBO; | ||||
import com.ningdatech.pmapi.dashboard.model.po.QueryYearPO; | import com.ningdatech.pmapi.dashboard.model.po.QueryYearPO; | ||||
import com.ningdatech.pmapi.dashboard.model.vo.DashboardInvestmentSummaryVO; | import com.ningdatech.pmapi.dashboard.model.vo.DashboardInvestmentSummaryVO; | ||||
@@ -39,6 +43,7 @@ public class DashboardProjectManage { | |||||
private static String timeFormat = "%s-01-01 00:00:00"; | private static String timeFormat = "%s-01-01 00:00:00"; | ||||
private final IProjectService iProjectService; | private final IProjectService iProjectService; | ||||
private final INdProjectDelayApplyService iProjectDelayApplyService; | private final INdProjectDelayApplyService iProjectDelayApplyService; | ||||
private final DashboardHelper dashboardHelper; | |||||
/** | /** | ||||
@@ -129,7 +134,6 @@ public class DashboardProjectManage { | |||||
Integer delayProjectCnt = projectDelayApplyListMap.keySet().size(); | Integer delayProjectCnt = projectDelayApplyListMap.keySet().size(); | ||||
Double delayProportion = new BigDecimal((float) delayProjectCnt / projectCnt).setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue(); | Double delayProportion = new BigDecimal((float) delayProjectCnt / projectCnt).setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue(); | ||||
// 项目变更数量 项目变更金额 | // 项目变更数量 项目变更金额 | ||||
List<Project> changedProjectList = new ArrayList<>(); | List<Project> changedProjectList = new ArrayList<>(); | ||||
Map<String, List<Project>> allProjectMap = allProjectWithRepeatList.stream().collect(Collectors.groupingBy(Project::getProjectCode)); | Map<String, List<Project>> allProjectMap = allProjectWithRepeatList.stream().collect(Collectors.groupingBy(Project::getProjectCode)); | ||||
@@ -179,12 +183,62 @@ public class DashboardProjectManage { | |||||
} | } | ||||
public DashboardProjectCntSummaryVO getProjectCntSummary(QueryYearPO queryYearPO) { | public DashboardProjectCntSummaryVO getProjectCntSummary(QueryYearPO queryYearPO) { | ||||
QueryTimeYearBO queryTimeYearBO = getQueryTimeYearBO(queryYearPO.getYear()); | |||||
// 预算年度 | |||||
Integer year = queryYearPO.getYear(); | |||||
String regionCode = queryYearPO.getRegionCode(); | |||||
List<Project> allProjectWithRepeatList = iProjectService.list(Wrappers.lambdaQuery(Project.class) | |||||
.eq(Objects.nonNull(year), Project::getProjectYear, year) | |||||
.eq(StringUtils.isNotBlank(regionCode), Project::getAreaCode, regionCode) | |||||
); | |||||
List<Project> allProjectList = allProjectWithRepeatList.stream() | |||||
.filter(r -> r.getNewest()).collect(Collectors.toList()); | |||||
// 项目增补情况 | |||||
Map<Integer, List<Project>> isTemporaryAugmentGroupMap = allProjectList.stream() | |||||
.collect(Collectors.groupingBy(Project::getIsTemporaryAugment)); | |||||
Map<Integer, String> temporaryAugmentMap = dashboardHelper.getTemporaryAugmentMap(); | |||||
AnalysisChart isTemporaryAugmentAnalysisChart = DashboardChartAssembler.buildAnalysisChart(temporaryAugmentMap, isTemporaryAugmentGroupMap | |||||
, ChartTypeEnum.PROJECT_SUPPLEMENTATION_STATUS_CHART); | |||||
// 各类型项目数量 | |||||
Map<Integer, List<Project>> projectTypeGroupMap = allProjectList.stream() | |||||
.collect(Collectors.groupingBy(Project::getProjectType)); | |||||
Map<Integer, String> projectTypeMap = dashboardHelper.getTemporaryAugmentMap(); | |||||
AnalysisChart projectTypeAnalysisChart = DashboardChartAssembler.buildAnalysisChart(projectTypeMap, projectTypeGroupMap | |||||
, ChartTypeEnum.EACH_TYPE_QUANTITY_OF_PROJECT_CHART); | |||||
// 各区域项目数量 | |||||
Map<String, List<Project>> areaCodeGroupMap = allProjectList.stream() | |||||
.collect(Collectors.groupingBy(Project::getAreaCode)); | |||||
Map<String, String> liShuiRegionCodeNameMap = dashboardHelper.getLiShuiRegionCodeNameMap(); | |||||
AnalysisChart areaCodeAnalysisChart = DashboardChartAssembler.buildAnalysisChart(liShuiRegionCodeNameMap, areaCodeGroupMap | |||||
, ChartTypeEnum.PROJECTS_NUMBER_IN_EACH_REGION_CHART); | |||||
// 各领域项目数量 | |||||
Map<Integer, List<Project>> bizDomainGroupMap = allProjectList.stream() | |||||
.collect(Collectors.groupingBy(Project::getBizDomain)); | |||||
Map<Integer, String> bizDomainMap = dashboardHelper.getBizDomainMap(); | |||||
AnalysisChart bizDomainAnalysisChart = DashboardChartAssembler.buildAnalysisChart(bizDomainMap, bizDomainGroupMap | |||||
, ChartTypeEnum.PROJECTS_NUMBER_IN_VARIOUS_FIELDS_CHART); | |||||
// 各阶段项目数量 | |||||
Map<Integer, List<Project>> projectStateGroupMap = allProjectList.stream() | |||||
.collect(Collectors.groupingBy(Project::getStage)); | |||||
AnalysisChart projectStateAnalysisChart = DashboardChartAssembler | |||||
.buildProjectStateAnalysisChart(projectStateGroupMap, ChartTypeEnum.PROJECTS_NUMBER_IN_EACH_STAGE_CHART); | |||||
DashboardProjectCntSummaryVO dashboardProjectCntSummaryVO = new DashboardProjectCntSummaryVO(); | DashboardProjectCntSummaryVO dashboardProjectCntSummaryVO = new DashboardProjectCntSummaryVO(); | ||||
List<AnalysisChart> analysisChartList = new ArrayList<>(); | |||||
dashboardProjectCntSummaryVO.setAnalysisChartList(analysisChartList); | |||||
analysisChartList.add(isTemporaryAugmentAnalysisChart); | |||||
analysisChartList.add(projectTypeAnalysisChart); | |||||
analysisChartList.add(bizDomainAnalysisChart); | |||||
analysisChartList.add(areaCodeAnalysisChart); | |||||
analysisChartList.add(projectStateAnalysisChart); | |||||
return dashboardProjectCntSummaryVO; | return dashboardProjectCntSummaryVO; | ||||
} | } | ||||
public DashboardInvestmentSummaryVO getInvestmentSummary(QueryYearPO queryYearPO) { | public DashboardInvestmentSummaryVO getInvestmentSummary(QueryYearPO queryYearPO) { | ||||
QueryTimeYearBO queryTimeYearBO = getQueryTimeYearBO(queryYearPO.getYear()); | QueryTimeYearBO queryTimeYearBO = getQueryTimeYearBO(queryYearPO.getYear()); | ||||
@@ -192,5 +246,4 @@ public class DashboardProjectManage { | |||||
return dashboardInvestmentSummaryVO; | return dashboardInvestmentSummaryVO; | ||||
} | } | ||||
} | } |
@@ -1,8 +1,12 @@ | |||||
package com.ningdatech.pmapi.dashboard.model.vo; | package com.ningdatech.pmapi.dashboard.model.vo; | ||||
import com.ningdatech.pmapi.dashboard.model.basic.AnalysisChart; | |||||
import io.swagger.annotations.ApiModel; | import io.swagger.annotations.ApiModel; | ||||
import io.swagger.annotations.ApiModelProperty; | |||||
import lombok.Data; | import lombok.Data; | ||||
import java.util.List; | |||||
/** | /** | ||||
* @author liuxinxin | * @author liuxinxin | ||||
* @date 2023/8/2 下午3:36 | * @date 2023/8/2 下午3:36 | ||||
@@ -12,13 +16,12 @@ import lombok.Data; | |||||
@ApiModel("项目数量驶舱统计数据") | @ApiModel("项目数量驶舱统计数据") | ||||
public class DashboardProjectCntSummaryVO { | public class DashboardProjectCntSummaryVO { | ||||
/** | /** | ||||
* 项目增补情况 | |||||
* 各类型项目数量 | |||||
* 各区域项目数量 | |||||
* 各领域项目数量 | |||||
* 单位项目数量TOP5 | * 单位项目数量TOP5 | ||||
* 近5年项目数量走势 | * 近5年项目数量走势 | ||||
* 近5年立项率走势 | * 近5年立项率走势 | ||||
* 各阶段项目数量 | |||||
*/ | */ | ||||
@ApiModelProperty("项目增补情况,各类型项目数量,各区域项目数量,各领域项目数量,各阶段项目数量") | |||||
List<AnalysisChart> analysisChartList; | |||||
} | } |
@@ -16,9 +16,6 @@ import java.math.BigDecimal; | |||||
public class DashboardProjectSummaryVO { | public class DashboardProjectSummaryVO { | ||||
/** | /** | ||||
* 项目画像 | * 项目画像 | ||||
* 项目立项率 | |||||
* 项目申报总金额 | |||||
* 项目批复总金额 | |||||
* 项目采购总金额 | * 项目采购总金额 | ||||
* 资金核定率 | * 资金核定率 | ||||
*/ | */ | ||||