@@ -109,4 +109,12 @@ public interface RegionCacheHelper { | |||||
*/ | */ | ||||
String getUnionPath(String code, Integer level); | String getUnionPath(String code, Integer level); | ||||
/** | |||||
* 根据区域名称获取区域信息(参数格式:浙江省-杭州市-滨江区) | |||||
* | |||||
* @param regionName 地区名称 | |||||
* @return \ | |||||
**/ | |||||
RegionDTO getByRegionName(String regionName); | |||||
} | } |
@@ -211,6 +211,25 @@ public class RegionsCacheHelperImpl extends AbstractRegionCacheHelper implements | |||||
return String.join("@@", unionPathStrList); | return String.join("@@", unionPathStrList); | ||||
} | } | ||||
@Override | |||||
public RegionDTO getByRegionName(String regionName) { | |||||
if (StrUtils.isBlank(regionName)) { | |||||
return null; | |||||
} | |||||
String[] regionArray = regionName.split("-"); | |||||
int length = regionArray.length; | |||||
return all().stream() | |||||
.filter(w -> { | |||||
boolean lastEq = w.getRegionLevel().equals(length) | |||||
&& w.getRegionName().equals(regionArray[length - 1]); | |||||
if (lastEq && length > 1) { | |||||
RegionDTO parent = getByCodeAndLevel(w.getParentCode(), w.getRegionLevel() - 1); | |||||
return parent.getRegionName().equals(regionArray[length - 2]); | |||||
} | |||||
return false; | |||||
}).findFirst().orElse(null); | |||||
} | |||||
protected void buildUnionPathStrList(String code, Integer level, List<String> unionPathStrList) { | protected void buildUnionPathStrList(String code, Integer level, List<String> unionPathStrList) { | ||||
if (level <= 0 || super.getParentCodeRoot().equals(code)) { | if (level <= 0 || super.getParentCodeRoot().equals(code)) { | ||||
return; | return; | ||||
@@ -1,5 +1,6 @@ | |||||
package com.ningdatech.pmapi.common.util; | package com.ningdatech.pmapi.common.util; | ||||
import cn.hutool.core.bean.BeanUtil; | |||||
import cn.hutool.core.map.MapUtil; | import cn.hutool.core.map.MapUtil; | ||||
import cn.hutool.json.JSONUtil; | import cn.hutool.json.JSONUtil; | ||||
import cn.hutool.poi.excel.ExcelReader; | import cn.hutool.poi.excel.ExcelReader; | ||||
@@ -25,7 +26,6 @@ import java.time.LocalDateTime; | |||||
import java.util.ArrayList; | import java.util.ArrayList; | ||||
import java.util.List; | import java.util.List; | ||||
import java.util.Map; | import java.util.Map; | ||||
import java.util.Optional; | |||||
/** | /** | ||||
* <p> | * <p> | ||||
@@ -60,7 +60,6 @@ public class ExpertRegisterUtil { | |||||
basic.setName(MapUtil.getStr(w, "*姓名")); | basic.setName(MapUtil.getStr(w, "*姓名")); | ||||
basic.setPhoneNo(MapUtil.getStr(w, "*手机")); | basic.setPhoneNo(MapUtil.getStr(w, "*手机")); | ||||
basic.setGender("男".equals(MapUtil.getStr(w, "性别")) ? "1" : "0"); | basic.setGender("男".equals(MapUtil.getStr(w, "性别")) ? "1" : "0"); | ||||
String expertRegion = MapUtil.getStr(w, "*专家层级"); | |||||
// 政治面貌 | // 政治面貌 | ||||
basic.setPolitical(new ArrayList<>()); | basic.setPolitical(new ArrayList<>()); | ||||
String political = MapUtil.getStr(w, "政治面貌"); | String political = MapUtil.getStr(w, "政治面貌"); | ||||
@@ -112,36 +111,18 @@ public class ExpertRegisterUtil { | |||||
} | } | ||||
request.setEduInfo(eduInfo); | request.setEduInfo(eduInfo); | ||||
// 专家层级 | // 专家层级 | ||||
String lastRegionName = expertRegion.substring(expertRegion.lastIndexOf("-") + 1); | |||||
List<RegionDTO> regions = regionCacheHelper.all(); | |||||
Optional<RegionDTO> firstExpertRegion = regions.stream() | |||||
.filter(region -> region.getRegionLevel().equals(3) | |||||
&& region.getRegionName().equals(lastRegionName)) | |||||
.findFirst(); | |||||
if (firstExpertRegion.isPresent()) { | |||||
RegionDTO dto = firstExpertRegion.get(); | |||||
ExpertRegionInfo regionInfo = new ExpertRegionInfo(); | |||||
regionInfo.setRegionCode(dto.getRegionCode()); | |||||
regionInfo.setRegionLevel(dto.getRegionLevel()); | |||||
regionInfo.setRegionName(dto.getRegionName()); | |||||
basic.setExpertRegionInfo(regionInfo); | |||||
String expertRegionStr = MapUtil.getStr(w, "*专家层级"); | |||||
RegionDTO expertRegion = regionCacheHelper.getByRegionName(expertRegionStr); | |||||
if (expertRegion != null) { | |||||
basic.setExpertRegionInfo(BeanUtil.copyProperties(expertRegion, ExpertRegionInfo.class)); | |||||
} | } | ||||
// 履职意向 | // 履职意向 | ||||
String intentionRegionStr = MapUtil.getStr(w, "*履职意向"); | |||||
String intentionRegions = MapUtil.getStr(w, "*履职意向"); | |||||
basic.setExpertIntentionWorkRegions(new ArrayList<>()); | basic.setExpertIntentionWorkRegions(new ArrayList<>()); | ||||
for (String intentionRegion : intentionRegionStr.split("\\n")) { | |||||
String[] split = intentionRegion.split("-"); | |||||
Optional<RegionDTO> first = regions.stream() | |||||
.filter(region -> region.getRegionName().equals(split[split.length - 1]) | |||||
&& region.getRegionLevel().equals(split.length)) | |||||
.findFirst(); | |||||
if (first.isPresent()) { | |||||
RegionDTO dto = first.get(); | |||||
ExpertRegionInfo regionInfo = new ExpertRegionInfo(); | |||||
regionInfo.setRegionCode(dto.getRegionCode()); | |||||
regionInfo.setRegionLevel(dto.getRegionLevel()); | |||||
regionInfo.setRegionName(dto.getRegionName()); | |||||
basic.getExpertIntentionWorkRegions().add(regionInfo); | |||||
for (String intentionRegionStr : intentionRegions.split("\\n|,")) { | |||||
RegionDTO currRegion = regionCacheHelper.getByRegionName(intentionRegionStr); | |||||
if (currRegion != null) { | |||||
basic.getExpertIntentionWorkRegions().add(BeanUtil.copyProperties(currRegion, ExpertRegionInfo.class)); | |||||
} | } | ||||
} | } | ||||
request.setBasicInfo(basic); | request.setBasicInfo(basic); | ||||
@@ -222,12 +203,11 @@ public class ExpertRegisterUtil { | |||||
String goodAtStr = MapUtil.getStr(w, "*擅长方向"); | String goodAtStr = MapUtil.getStr(w, "*擅长方向"); | ||||
for (String othTag : goodAtStr.split(",")) { | for (String othTag : goodAtStr.split(",")) { | ||||
tagMap.entrySet().stream() | tagMap.entrySet().stream() | ||||
.filter(tag -> tag.getValue().getParentCode().equals(ExpertTagEnum.GOOD_AT.getKey()) | |||||
&& tag.getValue().getTagName().equals(othTag)) | |||||
.filter(tag -> tag.getValue().getTagName().equals(othTag)) | |||||
.forEach(tag -> { | .forEach(tag -> { | ||||
TagFieldInfo expertTag = new TagFieldInfo(); | TagFieldInfo expertTag = new TagFieldInfo(); | ||||
expertTag.setTagCode(tag.getValue().getTagCode()); | expertTag.setTagCode(tag.getValue().getTagCode()); | ||||
expertTag.setTagFieldName(tag.getValue().getParentCode()); | |||||
expertTag.setTagFieldName(ExpertTagEnum.GOOD_AT.getKey()); | |||||
expertTag.setTagName(tag.getValue().getTagName()); | expertTag.setTagName(tag.getValue().getTagName()); | ||||
professionalInfo.getGoodAt().add(expertTag); | professionalInfo.getGoodAt().add(expertTag); | ||||
}); | }); | ||||
@@ -236,12 +216,11 @@ public class ExpertRegisterUtil { | |||||
String techStr = MapUtil.getStr(w, "技术专长"); | String techStr = MapUtil.getStr(w, "技术专长"); | ||||
for (String othTag : techStr.split(",|、")) { | for (String othTag : techStr.split(",|、")) { | ||||
tagMap.entrySet().stream() | tagMap.entrySet().stream() | ||||
.filter(tag -> tag.getValue().getParentCode().equals(ExpertTagEnum.TECHNICAL_EXPERTISE.getKey()) | |||||
&& tag.getValue().getTagName().equals(othTag)) | |||||
.filter(tag -> tag.getValue().getTagName().equals(othTag)) | |||||
.forEach(tag -> { | .forEach(tag -> { | ||||
TagFieldInfo expertTag = new TagFieldInfo(); | TagFieldInfo expertTag = new TagFieldInfo(); | ||||
expertTag.setTagCode(tag.getValue().getTagCode()); | expertTag.setTagCode(tag.getValue().getTagCode()); | ||||
expertTag.setTagFieldName(tag.getValue().getParentCode()); | |||||
expertTag.setTagFieldName(ExpertTagEnum.TECHNICAL_EXPERTISE.getKey()); | |||||
expertTag.setTagName(tag.getValue().getTagName()); | expertTag.setTagName(tag.getValue().getTagName()); | ||||
professionalInfo.getTechnicalExpertise().add(expertTag); | professionalInfo.getTechnicalExpertise().add(expertTag); | ||||
}); | }); | ||||
@@ -24,6 +24,9 @@ public class CockpitApplication implements Serializable { | |||||
@ApiModelProperty("应用名称") | @ApiModelProperty("应用名称") | ||||
private String applicationName; | private String applicationName; | ||||
@ApiModelProperty("项目编码") | |||||
private String projectCode; | |||||
@ApiModelProperty("介绍") | @ApiModelProperty("介绍") | ||||
private String introduce; | private String introduce; | ||||
@@ -101,27 +101,30 @@ public class CockpitStats implements Serializable { | |||||
@ApiModelProperty("专家-总人数") | @ApiModelProperty("专家-总人数") | ||||
private Integer expertTotalNum = 0; | private Integer expertTotalNum = 0; | ||||
@ApiModelProperty("专家-方案合理性") | |||||
@ApiModelProperty("专家-方案合理性-擅长") | |||||
private Integer expertPlanRationalityNum = 0; | private Integer expertPlanRationalityNum = 0; | ||||
@ApiModelProperty("专家-计数可行性评估") | |||||
@ApiModelProperty("专家-计数可行性评估-擅长") | |||||
private Integer expertTechnicalFeasibilityAssessmentNum = 0; | private Integer expertTechnicalFeasibilityAssessmentNum = 0; | ||||
@ApiModelProperty("专家-信创") | |||||
@ApiModelProperty("专家-信创-擅长") | |||||
private Integer expertXinchuangNum = 0; | private Integer expertXinchuangNum = 0; | ||||
@ApiModelProperty("专家-软硬件核价") | |||||
@ApiModelProperty("专家-软硬件核价-擅长") | |||||
private Integer expertSoftHardPricingNum = 0; | private Integer expertSoftHardPricingNum = 0; | ||||
@ApiModelProperty("专家-党政信息") | |||||
@ApiModelProperty("专家-党政信息-擅长") | |||||
private Integer expertPartyGovInfoNum = 0; | private Integer expertPartyGovInfoNum = 0; | ||||
@ApiModelProperty("专家-网络安全") | |||||
@ApiModelProperty("专家-网络安全-擅长") | |||||
private Integer expertNetworkSecurityNum = 0; | private Integer expertNetworkSecurityNum = 0; | ||||
@ApiModelProperty("专家-信息化专家") | @ApiModelProperty("专家-信息化专家") | ||||
private Integer expertPromotionInfoTechnologyNum = 0; | private Integer expertPromotionInfoTechnologyNum = 0; | ||||
@ApiModelProperty("专家-信创专家") | |||||
private Integer expertXinchuangOtherNum = 0; | |||||
@ApiModelProperty("专家-财务专家") | @ApiModelProperty("专家-财务专家") | ||||
private Integer expertFinancialNum = 0; | private Integer expertFinancialNum = 0; | ||||
@@ -173,6 +173,9 @@ public class CockpitStatsVO implements Serializable { | |||||
@ApiModelProperty("专家-财务专家 数量") | @ApiModelProperty("专家-财务专家 数量") | ||||
private Integer expertFinancialNum; | private Integer expertFinancialNum; | ||||
@ApiModelProperty("专家-信创专家 数量") | |||||
private Integer expertXinchuangOtherNum; | |||||
} | } | ||||
@Data | @Data | ||||
@@ -381,7 +381,7 @@ public class ProjectRenewalFundManage { | |||||
} | } | ||||
//判断金额 | //判断金额 | ||||
checkPaymentAmount(projectCode,projectYear,dto.getAnnualPaymentAmount()); | |||||
// checkPaymentAmount(projectCode,projectYear,dto.getAnnualPaymentAmount()); | |||||
declaration.setApprovalStatus(ProjectRenewalApprovalStatusEnum.PENDING.name()); | declaration.setApprovalStatus(ProjectRenewalApprovalStatusEnum.PENDING.name()); | ||||
if(Objects.nonNull(project)){ | if(Objects.nonNull(project)){ | ||||
@@ -21,6 +21,10 @@ import com.ningdatech.pmapi.expert.service.IExpertUserFullInfoService; | |||||
import com.ningdatech.pmapi.gov.enumeration.GovProjectStatusEnum; | import com.ningdatech.pmapi.gov.enumeration.GovProjectStatusEnum; | ||||
import com.ningdatech.pmapi.gov.model.entity.*; | import com.ningdatech.pmapi.gov.model.entity.*; | ||||
import com.ningdatech.pmapi.gov.service.*; | import com.ningdatech.pmapi.gov.service.*; | ||||
import com.ningdatech.pmapi.meta.model.entity.ExpertTag; | |||||
import com.ningdatech.pmapi.meta.model.entity.MetaTag; | |||||
import com.ningdatech.pmapi.meta.service.IExpertTagService; | |||||
import com.ningdatech.pmapi.meta.service.IMetaTagService; | |||||
import com.ningdatech.pmapi.performance.model.entity.PerformanceAppraisalProject; | import com.ningdatech.pmapi.performance.model.entity.PerformanceAppraisalProject; | ||||
import com.ningdatech.pmapi.performance.service.IPerformanceAppraisalProjectService; | import com.ningdatech.pmapi.performance.service.IPerformanceAppraisalProjectService; | ||||
import com.ningdatech.pmapi.projectlib.enumeration.InstTypeEnum; | import com.ningdatech.pmapi.projectlib.enumeration.InstTypeEnum; | ||||
@@ -109,6 +113,10 @@ public class CockpitStatsStatisticsTask { | |||||
private List<Integer> years = Lists.newArrayList(2021,2022,2023,2024,2025); | private List<Integer> years = Lists.newArrayList(2021,2022,2023,2024,2025); | ||||
private final IMetaTagService metaTagService; | |||||
private final IExpertTagService expertTagService; | |||||
/** | /** | ||||
* 定义统计 驾驶舱数据 每天3点开始执行一次 | * 定义统计 驾驶舱数据 每天3点开始执行一次 | ||||
* | * | ||||
@@ -366,15 +374,76 @@ public class CockpitStatsStatisticsTask { | |||||
List<ExpertUserFullInfo> experts = expertUserFullInfoService.list(Wrappers.lambdaQuery(ExpertUserFullInfo.class) | List<ExpertUserFullInfo> experts = expertUserFullInfoService.list(Wrappers.lambdaQuery(ExpertUserFullInfo.class) | ||||
.eq(StringUtils.isNotBlank(regionCode) && !DashboardConstant.CockpitStats.TOTAL.equals(regionCode), | .eq(StringUtils.isNotBlank(regionCode) && !DashboardConstant.CockpitStats.TOTAL.equals(regionCode), | ||||
ExpertUserFullInfo::getRegionCode, regionCode)); | ExpertUserFullInfo::getRegionCode, regionCode)); | ||||
List<ExpertTag> goodAt = expertTagService.list(Wrappers.lambdaQuery(ExpertTag.class)); | |||||
Map<Long, List<ExpertTag>> 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"; | |||||
String xinxihuaCode = "5400000"; | |||||
String xinchuangOtherCode = "5500000"; | |||||
cockpitStats.setExpertTotalNum(experts.size()); | 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); | |||||
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 xinchuangOtherNum = 0; | |||||
for(ExpertUserFullInfo e : experts){ | |||||
if(tagMap.containsKey(e.getUserId())){ | |||||
List<ExpertTag> expertTags = tagMap.get(e.getUserId()); | |||||
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(expertTag.getTagCode().equals(xinxihuaCode)){ | |||||
promotionInfoTechnologyNum++; | |||||
} | |||||
if(expertTag.getTagCode().equals(xinchuangOtherCode)){ | |||||
xinchuangOtherNum++; | |||||
} | |||||
} | |||||
} | |||||
} | |||||
//财务专家 | |||||
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.setExpertXinchuangOtherNum(xinchuangOtherNum); | |||||
//3.顶部数据 | //3.顶部数据 | ||||
//3.1 计划项目数(申报项目:完成年度计划的项目总数 | //3.1 计划项目数(申报项目:完成年度计划的项目总数 | ||||
@@ -1,9 +1,17 @@ | |||||
package com.ningdatech.pmapi.region; | package com.ningdatech.pmapi.region; | ||||
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; | |||||
import com.baomidou.mybatisplus.core.toolkit.Wrappers; | |||||
import com.ningdatech.pmapi.AppTests; | import com.ningdatech.pmapi.AppTests; | ||||
import com.ningdatech.pmapi.common.helper.RegionCacheHelper; | import com.ningdatech.pmapi.common.helper.RegionCacheHelper; | ||||
import com.ningdatech.pmapi.common.util.ExpertRegisterUtil; | import com.ningdatech.pmapi.common.util.ExpertRegisterUtil; | ||||
import com.ningdatech.pmapi.expert.constant.ExpertApplyStatusEnum; | |||||
import com.ningdatech.pmapi.expert.constant.ExpertApplyTypeEnum; | |||||
import com.ningdatech.pmapi.expert.controller.ExpertController; | import com.ningdatech.pmapi.expert.controller.ExpertController; | ||||
import com.ningdatech.pmapi.expert.entity.ExpertIntentionWorkRegion; | |||||
import com.ningdatech.pmapi.expert.entity.ExpertMetaApply; | |||||
import com.ningdatech.pmapi.expert.service.IExpertIntentionWorkRegionService; | |||||
import com.ningdatech.pmapi.expert.service.IExpertMetaApplyService; | |||||
import com.ningdatech.pmapi.meta.helper.DictionaryCache; | import com.ningdatech.pmapi.meta.helper.DictionaryCache; | ||||
import com.ningdatech.pmapi.meta.helper.TagCache; | import com.ningdatech.pmapi.meta.helper.TagCache; | ||||
import com.ningdatech.pmapi.organization.service.IDingOrganizationService; | import com.ningdatech.pmapi.organization.service.IDingOrganizationService; | ||||
@@ -12,7 +20,10 @@ import com.ningdatech.pmapi.sys.service.IRegionService; | |||||
import org.junit.Test; | import org.junit.Test; | ||||
import org.springframework.beans.factory.annotation.Autowired; | import org.springframework.beans.factory.annotation.Autowired; | ||||
import java.time.LocalDate; | |||||
import java.time.LocalDateTime; | |||||
import java.util.List; | import java.util.List; | ||||
import java.util.Objects; | |||||
import java.util.Set; | import java.util.Set; | ||||
import java.util.stream.Collectors; | import java.util.stream.Collectors; | ||||
@@ -28,7 +39,7 @@ public class RegionTest extends AppTests { | |||||
private IRegionService regionService; | private IRegionService regionService; | ||||
@Test | @Test | ||||
public void test(){ | |||||
public void test() { | |||||
Set<Region> set = regionService.list().stream().collect(Collectors.toSet()); | Set<Region> set = regionService.list().stream().collect(Collectors.toSet()); | ||||
Set<Long> ids = set.stream().map(Region::getId).collect(Collectors.toSet()); | Set<Long> ids = set.stream().map(Region::getId).collect(Collectors.toSet()); | ||||
@@ -50,7 +61,12 @@ public class RegionTest extends AppTests { | |||||
private ExpertController expertController; | private ExpertController expertController; | ||||
@Test | @Test | ||||
public void test1(){ | |||||
public void test1() { | |||||
System.out.println(regionCacheHelper.getByRegionName("浙江省-杭州市-滨江区")); | |||||
} | |||||
@Test | |||||
public void test2() { | |||||
ExpertRegisterUtil.regionCacheHelper = regionCacheHelper; | ExpertRegisterUtil.regionCacheHelper = regionCacheHelper; | ||||
ExpertRegisterUtil.tagCache = tagCache; | ExpertRegisterUtil.tagCache = tagCache; | ||||
ExpertRegisterUtil.dictionaryCache = dictionaryCache; | ExpertRegisterUtil.dictionaryCache = dictionaryCache; | ||||