@@ -6,7 +6,6 @@ import com.baomidou.mybatisplus.core.toolkit.StringUtils; | |||||
import com.baomidou.mybatisplus.core.toolkit.Wrappers; | import com.baomidou.mybatisplus.core.toolkit.Wrappers; | ||||
import com.hz.pm.api.common.helper.UserInfoHelper; | import com.hz.pm.api.common.helper.UserInfoHelper; | ||||
import com.hz.pm.api.common.model.constant.BizConst; | import com.hz.pm.api.common.model.constant.BizConst; | ||||
import com.hz.pm.api.common.util.BizUtils; | |||||
import com.hz.pm.api.common.util.StrUtils; | import com.hz.pm.api.common.util.StrUtils; | ||||
import com.hz.pm.api.sys.mapper.RoleMapper; | import com.hz.pm.api.sys.mapper.RoleMapper; | ||||
import com.hz.pm.api.sys.model.entity.Role; | import com.hz.pm.api.sys.model.entity.Role; | ||||
@@ -2,7 +2,6 @@ package com.hz.pm.api.common.util; | |||||
import cn.hutool.core.collection.CollUtil; | import cn.hutool.core.collection.CollUtil; | ||||
import com.hz.pm.api.expert.model.TagFieldInfo; | import com.hz.pm.api.expert.model.TagFieldInfo; | ||||
import org.apache.commons.collections4.CollectionUtils; | |||||
import java.util.Comparator; | import java.util.Comparator; | ||||
import java.util.List; | import java.util.List; | ||||
@@ -1,84 +0,0 @@ | |||||
package com.hz.pm.api.dashboard.controller; | |||||
import com.ningdatech.log.annotation.WebLog; | |||||
import com.hz.pm.api.dashboard.manage.CockpitStatsManage; | |||||
import com.hz.pm.api.dashboard.manage.DashboardProjectManage; | |||||
import com.hz.pm.api.dashboard.model.dto.CockpitStatsSaveDTO; | |||||
import com.hz.pm.api.dashboard.model.po.QueryYearPO; | |||||
import com.hz.pm.api.dashboard.model.vo.*; | |||||
import com.hz.pm.api.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; | |||||
import java.util.List; | |||||
/** | |||||
* @author liuxinxin | |||||
* @date 2023/8/2 上午10:36 | |||||
*/ | |||||
@RestController | |||||
@RequestMapping("/api/v1/dashboard") | |||||
@Validated | |||||
@RequiredArgsConstructor | |||||
@Api(value = "DashboardController", tags = "驾驶舱相关接口") | |||||
public class DashboardController { | |||||
private final DashboardProjectManage dashboardProjectManage; | |||||
private final CockpitStatsManage cockpitStatsManage; | |||||
private final CockpitStatsStatisticsTask cockpitStatsStatisticsTask; | |||||
@PostMapping("project-summary") | |||||
@ApiOperation("驾驶舱项目总览") | |||||
@WebLog("驾驶舱项目总览") | |||||
public DashboardProjectSummaryVO getProjectSummary(@Valid @RequestBody QueryYearPO queryYearPO) { | |||||
return dashboardProjectManage.getProjectSummary(queryYearPO); | |||||
} | |||||
@PostMapping("project-cnt-summary") | |||||
@ApiOperation("驾驶舱项目数量") | |||||
@WebLog("驾驶舱项目数量") | |||||
public DashboardProjectCntSummaryVO getProjectCntSummary(@Valid @RequestBody QueryYearPO queryYearPO) { | |||||
return dashboardProjectManage.getProjectCntSummary(queryYearPO); | |||||
} | |||||
@PostMapping("investment-summary") | |||||
@ApiOperation("驾驶舱投资金额") | |||||
@WebLog("驾驶舱投资金额") | |||||
public DashboardInvestmentSummaryVO getInvestmentSummary(@Valid @RequestBody QueryYearPO queryYearPO) { | |||||
return dashboardProjectManage.getInvestmentSummary(queryYearPO); | |||||
} | |||||
@GetMapping("/project-portrait/{projectCode}") | |||||
@ApiOperation("驾驶舱-项目画像接口") | |||||
public DashboardProjectProtraitVO getProjectPortrait(@PathVariable String projectCode) { | |||||
return dashboardProjectManage.getProjectPortrait(projectCode); | |||||
} | |||||
@GetMapping("cockpit-stats") | |||||
@ApiOperation("驾驶舱-统计数据接口") | |||||
public CockpitStatsVO getData(@RequestParam(required = false) String regionCode, | |||||
@RequestParam(required = false) Integer year) { | |||||
return cockpitStatsManage.getData(regionCode,year); | |||||
} | |||||
@GetMapping("cockpit-stats-start") | |||||
@ApiOperation("驾驶舱-统计数据接口 强制运行任务") | |||||
public String statsStart() throws UnknownHostException { | |||||
cockpitStatsStatisticsTask.doTask(); | |||||
return "运行成功"; | |||||
} | |||||
@PostMapping("cockpit-stats-save") | |||||
@ApiOperation("驾驶舱-统计数据接口 假数据保存") | |||||
public String statsSave(@RequestBody List<CockpitStatsSaveDTO> saves) { | |||||
cockpitStatsManage.save(saves); | |||||
return "保存成功"; | |||||
} | |||||
} |
@@ -1,7 +1,11 @@ | |||||
package com.hz.pm.api.dashboard.controller; | package com.hz.pm.api.dashboard.controller; | ||||
import com.hz.pm.api.dashboard.manage.*; | |||||
import com.hz.pm.api.dashboard.model.vo.*; | |||||
import com.hz.pm.api.dashboard.manage.ExpertStatisticsManage; | |||||
import com.hz.pm.api.dashboard.manage.FundStatisticsManage; | |||||
import com.hz.pm.api.dashboard.manage.ProjectCostStatisticsManage; | |||||
import com.hz.pm.api.dashboard.model.vo.CostStatisticsVO; | |||||
import com.hz.pm.api.dashboard.model.vo.ExpertStatisticsVO; | |||||
import com.hz.pm.api.dashboard.model.vo.FundStatisticsVO; | |||||
import com.ningdatech.log.annotation.DataScopeQueryCheck; | import com.ningdatech.log.annotation.DataScopeQueryCheck; | ||||
import io.swagger.annotations.Api; | import io.swagger.annotations.Api; | ||||
import io.swagger.annotations.ApiOperation; | import io.swagger.annotations.ApiOperation; | ||||
@@ -20,23 +24,13 @@ import org.springframework.web.bind.annotation.RestController; | |||||
@RequestMapping("/api/v1/statistics") | @RequestMapping("/api/v1/statistics") | ||||
@Validated | @Validated | ||||
@RequiredArgsConstructor | @RequiredArgsConstructor | ||||
@Api(value = "StatisticsController", tags = "统计") | |||||
@Api(tags = "统计") | |||||
public class StatisticsController { | public class StatisticsController { | ||||
private final FundStatisticsManage fundStatisticsManage; | private final FundStatisticsManage fundStatisticsManage; | ||||
private final ExpertStatisticsManage expertStatisticsManage; | private final ExpertStatisticsManage expertStatisticsManage; | ||||
private final MeetingStatisticsManage meetingStatisticsManage; | |||||
private final ProjectCostStatisticsManage costStatisticsManage; | private final ProjectCostStatisticsManage costStatisticsManage; | ||||
private final EarlyWarningStatisticsManage earlyWarningStatisticsManage; | |||||
private final PerformanceStatisticsManage performanceStatisticsManage; | |||||
private final ProjectStatisticsManage projectStatisticsManage; | |||||
@DataScopeQueryCheck | @DataScopeQueryCheck | ||||
@GetMapping("/fund") | @GetMapping("/fund") | ||||
@ApiOperation("项目资金统计") | @ApiOperation("项目资金统计") | ||||
@@ -52,37 +46,11 @@ public class StatisticsController { | |||||
} | } | ||||
@DataScopeQueryCheck | @DataScopeQueryCheck | ||||
@GetMapping("/meeting") | |||||
@ApiOperation("评审会议统计") | |||||
public MeetingStatisticsVO meeting(@RequestParam(required = false) Integer year) { | |||||
return meetingStatisticsManage.statistics(year); | |||||
} | |||||
@DataScopeQueryCheck | |||||
@GetMapping("/project-cost") | @GetMapping("/project-cost") | ||||
@ApiOperation("项目成本统计") | @ApiOperation("项目成本统计") | ||||
public CostStatisticsVO projectCost() { | public CostStatisticsVO projectCost() { | ||||
return costStatisticsManage.statistics(); | return costStatisticsManage.statistics(); | ||||
} | } | ||||
@DataScopeQueryCheck | |||||
@GetMapping("/early-warning") | |||||
@ApiOperation("预警统计") | |||||
public EarlyWarningStatisticsVO earlyWarning(@RequestParam(required = false) Integer year) { | |||||
return earlyWarningStatisticsManage.statistics(year); | |||||
} | |||||
@DataScopeQueryCheck | |||||
@GetMapping("/performance") | |||||
@ApiOperation("绩效统计") | |||||
public PerformanceStatisticsVO performance(@RequestParam(required = false) Integer year) { | |||||
return performanceStatisticsManage.statistics(year); | |||||
} | |||||
@DataScopeQueryCheck | |||||
@GetMapping("/project") | |||||
@ApiOperation("项目统计") | |||||
public ProjectStatisticsVO project(@RequestParam(required = false) Integer year) { | |||||
return projectStatisticsManage.statistics(year); | |||||
} | |||||
} | } |
@@ -1,122 +0,0 @@ | |||||
package com.hz.pm.api.dashboard.helper; | |||||
import cn.hutool.core.collection.CollUtil; | |||||
import com.hz.pm.api.dashboard.constant.ChartTypeEnum; | |||||
import com.hz.pm.api.dashboard.model.basic.AnalysisChart; | |||||
import com.hz.pm.api.dashboard.model.basic.AnalysisData; | |||||
import com.hz.pm.api.meta.helper.DictionaryCache; | |||||
import com.hz.pm.api.projectlib.model.entity.Project; | |||||
import com.hz.pm.api.projectlib.model.enumeration.ProjectStatusEnum; | |||||
import lombok.RequiredArgsConstructor; | |||||
import org.springframework.stereotype.Component; | |||||
import java.math.BigDecimal; | |||||
import java.util.ArrayList; | |||||
import java.util.List; | |||||
import java.util.Map; | |||||
import java.util.Objects; | |||||
/** | |||||
* @author liuxinxin | |||||
* @date 2023/8/4 下午2:36 | |||||
*/ | |||||
@Component | |||||
@RequiredArgsConstructor | |||||
public class DashboardChartAssembler { | |||||
private final DictionaryCache dictionaryCache; | |||||
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 (Map.Entry<Integer, List<Project>> entry : projectGroupMap.entrySet()) { | |||||
AnalysisData analysisData = new AnalysisData(); | |||||
String chartKey = ProjectStatusEnum.getDesc(entry.getKey()); | |||||
analysisData.setKey(chartKey); | |||||
analysisData.setValue(CollUtil.size(entry.getValue())); | |||||
dataList.add(analysisData); | |||||
} | |||||
return analysisChart; | |||||
} | |||||
public static <T> AnalysisChart buildInvestmentAnalysisChart(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); | |||||
BigDecimal approvedTotalInvestmentIncreaseSum = new BigDecimal("0"); | |||||
if (CollUtil.isNotEmpty(projectList)) { | |||||
for (Project project : projectList) { | |||||
BigDecimal approvedTotalInvestmentIncrease = project.getApprovedTotalInvestmentIncrease(); | |||||
if (Objects.nonNull(approvedTotalInvestmentIncrease)) { | |||||
approvedTotalInvestmentIncreaseSum.add(approvedTotalInvestmentIncrease); | |||||
} | |||||
} | |||||
} | |||||
analysisData.setKey(chartKey); | |||||
analysisData.setValue(approvedTotalInvestmentIncreaseSum); | |||||
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; | |||||
} | |||||
public static <T> AnalysisChart buildAnalysisChartString(Map<T, String> keyValueMap | |||||
, Map<String, 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; | |||||
} | |||||
public <T> AnalysisChart assemblerAnalysisChart(Map<String, List<T>> dictionaryCodeIdMap | |||||
, ChartTypeEnum chartTypeEnum) { | |||||
AnalysisChart analysisChart = new AnalysisChart(); | |||||
List<AnalysisData> dataList = new ArrayList<>(); | |||||
analysisChart.setChartType(chartTypeEnum); | |||||
analysisChart.setDataList(dataList); | |||||
for (String dictionaryCode : dictionaryCodeIdMap.keySet()) { | |||||
AnalysisData analysisData = new AnalysisData(); | |||||
analysisData.setKey(dictionaryCache.getByCode(dictionaryCode).get().getName()); | |||||
analysisData.setValue(dictionaryCodeIdMap.get(dictionaryCode).size()); | |||||
dataList.add(analysisData); | |||||
} | |||||
return analysisChart; | |||||
} | |||||
} |
@@ -1,74 +0,0 @@ | |||||
package com.hz.pm.api.dashboard.helper; | |||||
import com.baomidou.mybatisplus.core.toolkit.Wrappers; | |||||
import com.hz.pm.api.dashboard.constant.AnalysisBasicConstant; | |||||
import com.hz.pm.api.sys.model.entity.Region; | |||||
import com.hz.pm.api.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)); | |||||
return regionList.stream().collect(Collectors.toMap(Region::getRegionCode, Region::getRegionName)); | |||||
} | |||||
/** | |||||
* 获取增补情况键值表 | |||||
*/ | |||||
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,164 +0,0 @@ | |||||
package com.hz.pm.api.dashboard.manage; | |||||
import cn.hutool.core.collection.CollectionUtil; | |||||
import com.baomidou.mybatisplus.core.toolkit.StringUtils; | |||||
import com.baomidou.mybatisplus.core.toolkit.Wrappers; | |||||
import com.hz.pm.api.dashboard.constant.ChartTypeEnum; | |||||
import com.hz.pm.api.dashboard.helper.DashboardChartAssembler; | |||||
import com.hz.pm.api.dashboard.helper.DashboardHelper; | |||||
import com.hz.pm.api.dashboard.model.basic.AnalysisChart; | |||||
import com.hz.pm.api.dashboard.model.basic.AnalysisData; | |||||
import com.hz.pm.api.dashboard.model.basic.StarExpertBO; | |||||
import com.hz.pm.api.dashboard.model.po.QueryYearPO; | |||||
import com.hz.pm.api.dashboard.model.vo.ExpertDashboardSummaryVO; | |||||
import com.hz.pm.api.expert.constant.ExpertUserInfoStepEnum; | |||||
import com.hz.pm.api.expert.entity.ExpertUserFullInfo; | |||||
import com.hz.pm.api.expert.service.IExpertUserFullInfoService; | |||||
import com.hz.pm.api.meeting.entity.domain.Meeting; | |||||
import com.hz.pm.api.meeting.entity.domain.MeetingExpertJudge; | |||||
import com.hz.pm.api.meeting.entity.enumeration.MeetingStatusEnum; | |||||
import com.hz.pm.api.meeting.service.IMeetingExpertJudgeService; | |||||
import com.hz.pm.api.meeting.service.IMeetingService; | |||||
import com.hz.pm.api.meta.constant.ExpertDictTypeEnum; | |||||
import com.hz.pm.api.meta.model.entity.ExpertDictionary; | |||||
import com.hz.pm.api.meta.service.IExpertDictionaryService; | |||||
import lombok.RequiredArgsConstructor; | |||||
import org.springframework.stereotype.Component; | |||||
import java.util.*; | |||||
import java.util.function.Function; | |||||
import java.util.stream.Collectors; | |||||
/** | |||||
* @author liuxinxin | |||||
* @date 2023/8/2 上午10:39 | |||||
*/ | |||||
@Component | |||||
@RequiredArgsConstructor | |||||
public class DashboardExpertManage { | |||||
private final DashboardHelper dashboardHelper; | |||||
private final IExpertUserFullInfoService iExpertUserFullInfoService; | |||||
private final IMeetingService iMeetingService; | |||||
private final IMeetingExpertJudgeService iMeetingExpertJudgeService; | |||||
private final IExpertDictionaryService iExpertDictionaryService; | |||||
private final DashboardChartAssembler dashboardChartAssembler; | |||||
public ExpertDashboardSummaryVO getExpertDashboardSummary(QueryYearPO queryYearPO) { | |||||
String queryRegionCode = queryYearPO.getRegionCode(); | |||||
List<AnalysisChart> analysisChartList = new ArrayList<>(); | |||||
// 获取丽水区域 code name Map | |||||
Map<String, String> liShuiRegionCodeNameMap = dashboardHelper.getLiShuiRegionCodeNameMap(); | |||||
// 获取库内所有的专家列表 | |||||
List<ExpertUserFullInfo> evidenceHasBeenSubmittedExpertInfoList = iExpertUserFullInfoService.list(); | |||||
// 专家regionCode分组map列表 | |||||
Map<String, List<ExpertUserFullInfo>> regionCodeExpertMap = Collections.emptyMap(); | |||||
// 各区域专家数量 | |||||
AnalysisChart regionExpertNumberChartAnalysisChart = new AnalysisChart(); | |||||
List<AnalysisData> regionExpertNumberChartDataList = new ArrayList<>(); | |||||
regionExpertNumberChartAnalysisChart.setChartType(ChartTypeEnum.REGION_EXPERT_NUMBER_CHART); | |||||
regionExpertNumberChartAnalysisChart.setDataList(regionExpertNumberChartDataList); | |||||
for (String regionCode : liShuiRegionCodeNameMap.keySet()) { | |||||
AnalysisData analysisData = new AnalysisData(); | |||||
String regionName = liShuiRegionCodeNameMap.get(regionCode); | |||||
List<ExpertUserFullInfo> expertUserFullInfoList = regionCodeExpertMap.get(regionCode); | |||||
int expertCnt = 0; | |||||
if (CollectionUtil.isNotEmpty(expertUserFullInfoList)) { | |||||
expertCnt = expertUserFullInfoList.size(); | |||||
} | |||||
analysisData.setKey(regionName); | |||||
analysisData.setValue(expertCnt); | |||||
regionExpertNumberChartDataList.add(analysisData); | |||||
} | |||||
analysisChartList.add(regionExpertNumberChartAnalysisChart); | |||||
// 查询区域的专家id 列表 | |||||
List<Long> regionDegreeExpertIdList = new ArrayList<>(); | |||||
if (StringUtils.isNotBlank(queryRegionCode)) { | |||||
List<ExpertUserFullInfo> expertUserFullInfoList = regionCodeExpertMap.get(queryRegionCode); | |||||
if (CollectionUtil.isNotEmpty(expertUserFullInfoList)) { | |||||
regionDegreeExpertIdList = expertUserFullInfoList.stream() | |||||
.map(ExpertUserFullInfo::getUserId) | |||||
.collect(Collectors.toList()); | |||||
} | |||||
} else { | |||||
regionDegreeExpertIdList = evidenceHasBeenSubmittedExpertInfoList.stream() | |||||
.map(ExpertUserFullInfo::getUserId) | |||||
.collect(Collectors.toList()); | |||||
} | |||||
if (CollectionUtil.isNotEmpty(regionDegreeExpertIdList)) { | |||||
// 区域学历分布 | |||||
List<ExpertDictionary> degreeExpertDictionaryList = iExpertDictionaryService | |||||
.listByUserId(regionDegreeExpertIdList, ExpertDictTypeEnum.DEGREE); | |||||
Map<String, List<String>> degreeCodeMap = degreeExpertDictionaryList.stream() | |||||
.map(ExpertDictionary::getDictionaryCode) | |||||
.collect(Collectors.groupingBy(Function.identity())); | |||||
AnalysisChart regionExpertEducationChartAnalysisChart = | |||||
dashboardChartAssembler.assemblerAnalysisChart(degreeCodeMap, ChartTypeEnum.REGION_EXPERT_EDUCATION_CHART); | |||||
analysisChartList.add(regionExpertEducationChartAnalysisChart); | |||||
// 区域职称级别分布 | |||||
List<ExpertDictionary> titleLevelExpertDictionaryList = iExpertDictionaryService | |||||
.listByUserId(regionDegreeExpertIdList, ExpertDictTypeEnum.TITLE_LEVEL); | |||||
Map<String, List<ExpertDictionary>> titleLevelCodeMap = titleLevelExpertDictionaryList.stream() | |||||
.collect(Collectors.groupingBy(ExpertDictionary::getDictionaryCode)); | |||||
AnalysisChart regionExpertTitleLevelChartAnalysisChart = | |||||
dashboardChartAssembler.assemblerAnalysisChart(titleLevelCodeMap, ChartTypeEnum.REGION_EXPERT_TITLE_LEVEL_CHART); | |||||
analysisChartList.add(regionExpertTitleLevelChartAnalysisChart); | |||||
} | |||||
// 评审次数 | |||||
List<Meeting> normalMeetingList = iMeetingService.list(Wrappers.lambdaQuery(Meeting.class) | |||||
.ne(Meeting::getStatus, MeetingStatusEnum.CANCELED.getCode())); | |||||
Integer meetingCnt = normalMeetingList.size(); | |||||
// 各类型评审次数 | |||||
Map<String, List<Meeting>> meetingTypeMap = normalMeetingList.stream().collect(Collectors.groupingBy(Meeting::getType)); | |||||
AnalysisChart meetingTypeCntChartAnalysisChart = | |||||
dashboardChartAssembler.assemblerAnalysisChart(meetingTypeMap, ChartTypeEnum.MEETING_TYPE_CNT_CHART); | |||||
analysisChartList.add(meetingTypeCntChartAnalysisChart); | |||||
// 明星专家列表 | |||||
List<StarExpertBO> starExpertList = new ArrayList<>(); | |||||
List<MeetingExpertJudge> meetingExpertJudgeList = iMeetingExpertJudgeService.list(); | |||||
Map<Long, List<MeetingExpertJudge>> expertIdMeetingExpertJudgeMap = meetingExpertJudgeList.stream() | |||||
.collect(Collectors.groupingBy(MeetingExpertJudge::getExpertId)); | |||||
Map<Long, String> expertIdExpertNameMap = evidenceHasBeenSubmittedExpertInfoList.stream() | |||||
.collect(Collectors.toMap(ExpertUserFullInfo::getUserId, ExpertUserFullInfo::getExpertName)); | |||||
for (Long expertId : expertIdMeetingExpertJudgeMap.keySet()) { | |||||
String expertName = expertIdExpertNameMap.get(expertId); | |||||
List<MeetingExpertJudge> expertMeetingExpertJudgeList = expertIdMeetingExpertJudgeMap.get(expertId); | |||||
DoubleSummaryStatistics statistics = expertMeetingExpertJudgeList | |||||
.stream().filter(r -> Objects.nonNull(r.getScore())) | |||||
.map(MeetingExpertJudge::getScore).mapToDouble(Number::doubleValue).summaryStatistics(); | |||||
double average = statistics.getAverage(); | |||||
StarExpertBO starExpertBO = new StarExpertBO(); | |||||
starExpertBO.setAveragePerformanceScore(average); | |||||
starExpertBO.setExpertId(expertId); | |||||
starExpertBO.setExpertName(expertName); | |||||
starExpertList.add(starExpertBO); | |||||
} | |||||
starExpertList = starExpertList.stream() | |||||
.sorted(Comparator.comparing(StarExpertBO::getAveragePerformanceScore) | |||||
.reversed()).collect(Collectors.toList()); | |||||
if (starExpertList.size() > 5) { | |||||
starExpertList = starExpertList.subList(0, 5); | |||||
} | |||||
// 装配返回类 | |||||
ExpertDashboardSummaryVO expertDashboardSummaryVO = new ExpertDashboardSummaryVO(); | |||||
expertDashboardSummaryVO.setMeetingCnt(meetingCnt); | |||||
expertDashboardSummaryVO.setStarExpertList(starExpertList); | |||||
expertDashboardSummaryVO.setAnalysisChartList(analysisChartList); | |||||
return expertDashboardSummaryVO; | |||||
} | |||||
} | |||||
@@ -1,549 +0,0 @@ | |||||
package com.hz.pm.api.dashboard.manage; | |||||
import cn.hutool.core.bean.BeanUtil; | |||||
import com.alibaba.fastjson.JSON; | |||||
import com.alibaba.fastjson.JSONArray; | |||||
import com.alibaba.fastjson.JSONObject; | |||||
import com.baomidou.mybatisplus.core.toolkit.StringUtils; | |||||
import com.baomidou.mybatisplus.core.toolkit.Wrappers; | |||||
import com.google.common.collect.Lists; | |||||
import com.hz.pm.api.common.model.constant.BizConst; | |||||
import com.hz.pm.api.dashboard.constant.ChartTypeEnum; | |||||
import com.hz.pm.api.dashboard.constant.DashboardConstant.Protrait; | |||||
import com.hz.pm.api.dashboard.handle.ApplicationHandler; | |||||
import com.hz.pm.api.dashboard.handle.ProjectStatusHandler; | |||||
import com.hz.pm.api.dashboard.helper.DashboardChartAssembler; | |||||
import com.hz.pm.api.dashboard.helper.DashboardHelper; | |||||
import com.hz.pm.api.dashboard.model.basic.AnalysisChart; | |||||
import com.hz.pm.api.dashboard.model.basic.CompanyProjectCntBO; | |||||
import com.hz.pm.api.dashboard.model.basic.ProjectATIISBO; | |||||
import com.hz.pm.api.dashboard.model.po.QueryYearPO; | |||||
import com.hz.pm.api.dashboard.model.vo.*; | |||||
import com.hz.pm.api.gov.model.entity.GovBizProjectApply; | |||||
import com.hz.pm.api.gov.model.entity.GovBizProjectBaseinfo; | |||||
import com.hz.pm.api.gov.model.entity.GovOperationProjectBaseinfo; | |||||
import com.hz.pm.api.gov.service.IGovBizProjectApplyService; | |||||
import com.hz.pm.api.gov.service.IGovBizProjectBaseinfoService; | |||||
import com.hz.pm.api.gov.service.IGovOperationProjectBaseinfoService; | |||||
import com.hz.pm.api.portrait.service.IProjectTagService; | |||||
import com.hz.pm.api.projectdeclared.model.entity.Purchase; | |||||
import com.hz.pm.api.projectdeclared.service.IPurchaseService; | |||||
import com.hz.pm.api.projectlib.model.entity.Project; | |||||
import com.hz.pm.api.projectlib.model.entity.ProjectDelayApply; | |||||
import com.hz.pm.api.projectlib.model.enumeration.InstTypeEnum; | |||||
import com.hz.pm.api.projectlib.model.enumeration.ProjectStatusEnum; | |||||
import com.hz.pm.api.projectlib.service.INdProjectDelayApplyService; | |||||
import com.hz.pm.api.projectlib.service.IProjectService; | |||||
import lombok.RequiredArgsConstructor; | |||||
import org.springframework.stereotype.Component; | |||||
import java.math.BigDecimal; | |||||
import java.math.RoundingMode; | |||||
import java.util.*; | |||||
import java.util.concurrent.CompletableFuture; | |||||
import java.util.concurrent.ForkJoinPool; | |||||
import java.util.stream.Collectors; | |||||
/** | |||||
* @author liuxinxin | |||||
* @date 2023/8/2 上午10:39 | |||||
*/ | |||||
@Component | |||||
@RequiredArgsConstructor | |||||
public class DashboardProjectManage { | |||||
private final IProjectService iProjectService; | |||||
private final IGovBizProjectBaseinfoService baseinfoService; | |||||
private final IGovBizProjectApplyService applyService; | |||||
private final IGovOperationProjectBaseinfoService operationBaseService; | |||||
private final INdProjectDelayApplyService iProjectDelayApplyService; | |||||
private final DashboardHelper dashboardHelper; | |||||
private final IPurchaseService iPurchaseService; | |||||
private final ProjectStatusHandler statusHandler; | |||||
private final IProjectTagService projectTagService; | |||||
private final ApplicationHandler applicationHandler; | |||||
public DashboardProjectSummaryVO getProjectSummary(QueryYearPO queryYearPO) { | |||||
// 预算年度 | |||||
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()); | |||||
List<Long> allProjectIdWithRepeatList = allProjectWithRepeatList.stream().map(Project::getId).collect(Collectors.toList()); | |||||
// 项目总数 | |||||
Integer projectCnt = allProjectList.size(); | |||||
// 待立项项目数 | |||||
List<Project> toBeApprovedProjectList = allProjectList.stream() | |||||
.filter(r -> ProjectStatusEnum.TO_BE_APPROVED.getCode().equals(r.getStatus())) | |||||
.collect(Collectors.toList()); | |||||
Integer toBeApprovedProjectCnt = toBeApprovedProjectList.size(); | |||||
// 已立项项目数 | |||||
Integer approvedProjectCnt = projectCnt - toBeApprovedProjectCnt; | |||||
// 项目立项率 | |||||
Double projectApprovalRate = BigDecimal.valueOf((float) approvedProjectCnt / projectCnt).setScale(2, RoundingMode.HALF_UP).doubleValue(); | |||||
// 项目申报总金额 | |||||
List<BigDecimal> declareAmountList = allProjectList.stream().map(Project::getDeclareAmount) | |||||
.filter(Objects::nonNull). | |||||
collect(Collectors.toList()); | |||||
BigDecimal declareAmountSum = new BigDecimal("0"); | |||||
for (BigDecimal declareAmount : declareAmountList) { | |||||
declareAmountSum.add(declareAmount); | |||||
} | |||||
// 项目批复总金额 | |||||
List<BigDecimal> approvedTotalInvestmentIncreaseList = allProjectList.stream().map(Project::getApprovedTotalInvestmentIncrease) | |||||
.filter(Objects::nonNull) | |||||
.collect(Collectors.toList()); | |||||
BigDecimal approvedTotalInvestmentIncreaseSum = new BigDecimal("0"); | |||||
for (BigDecimal approvedTotalInvestmentIncrease : approvedTotalInvestmentIncreaseList) { | |||||
approvedTotalInvestmentIncreaseSum.add(approvedTotalInvestmentIncrease); | |||||
} | |||||
// 资金核定率 | |||||
BigDecimal fundApprovalRate = new BigDecimal("0"); | |||||
if (new BigDecimal("0").compareTo(approvedTotalInvestmentIncreaseSum) != 0) { | |||||
fundApprovalRate = declareAmountSum.divide(approvedTotalInvestmentIncreaseSum, 2, RoundingMode.HALF_UP); | |||||
} | |||||
// 项目采购总金额 | |||||
BigDecimal projectProcurementTotalAmount = new BigDecimal("0"); | |||||
List<Purchase> purchaseList = iPurchaseService.list(Wrappers.lambdaQuery(Purchase.class) | |||||
.in(Purchase::getProjectId, allProjectIdWithRepeatList)); | |||||
for (Purchase purchase : purchaseList) { | |||||
BigDecimal transactionAmount = purchase.getTransactionAmount(); | |||||
if (Objects.nonNull(transactionAmount)) { | |||||
projectProcurementTotalAmount.add(transactionAmount); | |||||
} | |||||
} | |||||
// 项目画像 | |||||
// 延期项目数 延期占比 | |||||
List<ProjectDelayApply> projectDelayApplyList = iProjectDelayApplyService | |||||
.list(Wrappers.lambdaQuery(ProjectDelayApply.class) | |||||
.in(ProjectDelayApply::getProjectId, allProjectIdWithRepeatList)); | |||||
Map<Long, List<ProjectDelayApply>> projectDelayApplyListMap = projectDelayApplyList.stream().collect(Collectors.groupingBy(ProjectDelayApply::getProjectId)); | |||||
Integer delayProjectCnt = projectDelayApplyListMap.keySet().size(); | |||||
Double delayProportion = BigDecimal.valueOf((float) delayProjectCnt / projectCnt).setScale(2, RoundingMode.HALF_UP).doubleValue(); | |||||
// 项目变更数量 项目变更金额 | |||||
List<Project> changedProjectList = new ArrayList<>(); | |||||
Map<String, List<Project>> allProjectMap = allProjectWithRepeatList.stream().collect(Collectors.groupingBy(Project::getProjectCode)); | |||||
for (String projectCode : allProjectMap.keySet()) { | |||||
List<Project> projectList = allProjectMap.get(projectCode); | |||||
Project newestProject = projectList.stream() | |||||
.filter(Project::getNewest) | |||||
.collect(Collectors.toList()).get(0); | |||||
boolean isChanged = false; | |||||
for (Project project : projectList) { | |||||
Boolean newest = project.getNewest(); | |||||
boolean isBackReject = project.getIsBackReject(); | |||||
if (!newest && isBackReject) { | |||||
isChanged = true; | |||||
break; | |||||
} | |||||
} | |||||
if (isChanged) { | |||||
changedProjectList.add(newestProject); | |||||
} | |||||
} | |||||
Integer changedProjectCnt = changedProjectList.size(); | |||||
// 项目变更金额 | |||||
BigDecimal changedProjectContractAmountSum = new BigDecimal("0"); | |||||
for (Project project : changedProjectList) { | |||||
BigDecimal contractAmount = project.getContractAmount(); | |||||
if (Objects.nonNull(contractAmount)) { | |||||
changedProjectContractAmountSum.add(contractAmount); | |||||
} | |||||
} | |||||
// 装配返回VO | |||||
DashboardProjectSummaryVO dashboardProjectSummaryVO = new DashboardProjectSummaryVO(); | |||||
dashboardProjectSummaryVO.setProjectCnt(projectCnt); | |||||
dashboardProjectSummaryVO.setApprovedProjectCnt(approvedProjectCnt); | |||||
dashboardProjectSummaryVO.setToBeApprovedProjectCnt(toBeApprovedProjectCnt); | |||||
dashboardProjectSummaryVO.setProjectApprovalRate(projectApprovalRate); | |||||
dashboardProjectSummaryVO.setDeclareAmountSum(declareAmountSum); | |||||
dashboardProjectSummaryVO.setApprovedTotalInvestmentIncreaseSum(approvedTotalInvestmentIncreaseSum); | |||||
dashboardProjectSummaryVO.setDelayProjectCnt(delayProjectCnt); | |||||
dashboardProjectSummaryVO.setDelayProportion(delayProportion); | |||||
dashboardProjectSummaryVO.setChangedProjectCnt(changedProjectCnt); | |||||
dashboardProjectSummaryVO.setChangedProjectContractAmountSum(changedProjectContractAmountSum); | |||||
dashboardProjectSummaryVO.setFundApprovalRate(fundApprovalRate); | |||||
return dashboardProjectSummaryVO; | |||||
} | |||||
public DashboardProjectCntSummaryVO getProjectCntSummary(QueryYearPO req) { | |||||
// 预算年度 | |||||
Integer year = req.getYear(); | |||||
List<Project> allProjectList = iProjectService.list(Wrappers.lambdaQuery(Project.class) | |||||
.eq(Project::getNewest, true) | |||||
.eq(Objects.nonNull(year), Project::getProjectYear, year)); | |||||
// 单位项目数量TOP5 | |||||
List<CompanyProjectCntBO> companyProjectCntTop5List = new ArrayList<>(); | |||||
Map<String, List<Project>> buildOrgNameProjectGroupMap = allProjectList.stream() | |||||
.collect(Collectors.groupingBy(Project::getBuildOrgName)); | |||||
for (String buildOrgName : buildOrgNameProjectGroupMap.keySet()) { | |||||
List<Project> projectList = buildOrgNameProjectGroupMap.get(buildOrgName); | |||||
CompanyProjectCntBO companyProjectCntBO = new CompanyProjectCntBO(); | |||||
companyProjectCntBO.setBuildOrgName(buildOrgName); | |||||
companyProjectCntBO.setProjectCnt(projectList.size()); | |||||
companyProjectCntTop5List.add(companyProjectCntBO); | |||||
} | |||||
companyProjectCntTop5List.sort(Comparator.comparing(CompanyProjectCntBO::getProjectCnt).reversed()); | |||||
if (companyProjectCntTop5List.size() > 5) { | |||||
companyProjectCntTop5List = companyProjectCntTop5List.subList(0, 5); | |||||
} | |||||
// 项目增补情况 | |||||
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<String, List<Project>> projectTypeGroupMap = allProjectList.stream() | |||||
.collect(Collectors.groupingBy(Project::getProjectType)); | |||||
Map<Integer, String> projectTypeMap = dashboardHelper.getTemporaryAugmentMap(); | |||||
AnalysisChart projectTypeAnalysisChart = DashboardChartAssembler.buildAnalysisChartString(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.setCompanyProjectCntTop5List(companyProjectCntTop5List); | |||||
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; | |||||
} | |||||
public DashboardInvestmentSummaryVO getInvestmentSummary(QueryYearPO req) { | |||||
// 预算年度 | |||||
Integer year = req.getYear(); | |||||
String regionCode = req.getRegionCode(); | |||||
List<Project> allProjectList = iProjectService.list(Wrappers.lambdaQuery(Project.class) | |||||
.eq(Project::getNewest, true) | |||||
.eq(Objects.nonNull(year), Project::getProjectYear, year) | |||||
.eq(StringUtils.isNotBlank(regionCode), Project::getAreaCode, regionCode) | |||||
); | |||||
// 项目预算TOP5 | |||||
List<ProjectATIISBO> projectATIISTop5List = allProjectList.stream().filter(r -> Objects.nonNull(r.getApprovedTotalInvestmentIncrease())) | |||||
.map(r -> { | |||||
ProjectATIISBO projectATIISBO = new ProjectATIISBO(); | |||||
projectATIISBO.setProjectId(r.getId()); | |||||
projectATIISBO.setProjectCode(r.getProjectCode()); | |||||
projectATIISBO.setProjectName(r.getProjectName()); | |||||
projectATIISBO.setApprovedTotalInvestmentIncrease(r.getApprovedTotalInvestmentIncrease()); | |||||
return projectATIISBO; | |||||
}).collect(Collectors.toList()); | |||||
projectATIISTop5List.sort(Comparator.comparing(ProjectATIISBO::getApprovedTotalInvestmentIncrease)); | |||||
if (projectATIISTop5List.size() > 5) { | |||||
projectATIISTop5List = projectATIISTop5List.subList(0, 5); | |||||
} | |||||
// 单位预算TOP5 | |||||
List<CompanyProjectCntBO> companyProjectATIISTop5List = new ArrayList<>(); | |||||
Map<String, List<Project>> buildOrgNameProjectGroupMap = allProjectList.stream() | |||||
.collect(Collectors.groupingBy(Project::getBuildOrgName)); | |||||
for (String buildOrgName : buildOrgNameProjectGroupMap.keySet()) { | |||||
List<Project> projectList = buildOrgNameProjectGroupMap.get(buildOrgName); | |||||
CompanyProjectCntBO companyProjectCntBO = new CompanyProjectCntBO(); | |||||
companyProjectCntBO.setBuildOrgName(buildOrgName); | |||||
BigDecimal approvedTotalInvestmentIncreaseSum = new BigDecimal("0"); | |||||
for (Project project : projectList) { | |||||
BigDecimal approvedTotalInvestmentIncrease = project.getApprovedTotalInvestmentIncrease(); | |||||
if (Objects.nonNull(approvedTotalInvestmentIncrease)) { | |||||
approvedTotalInvestmentIncreaseSum.add(approvedTotalInvestmentIncrease); | |||||
} | |||||
} | |||||
companyProjectCntBO.setApprovedTotalInvestmentIncreaseSum(approvedTotalInvestmentIncreaseSum); | |||||
companyProjectATIISTop5List.add(companyProjectCntBO); | |||||
} | |||||
companyProjectATIISTop5List.sort(Comparator.comparing(CompanyProjectCntBO::getApprovedTotalInvestmentIncreaseSum).reversed()); | |||||
if (companyProjectATIISTop5List.size() > 5) { | |||||
companyProjectATIISTop5List = companyProjectATIISTop5List.subList(0, 5); | |||||
} | |||||
// 各领域项目投资情况 | |||||
Map<Integer, List<Project>> bizDomainGroupMap = allProjectList.stream() | |||||
.collect(Collectors.groupingBy(Project::getBizDomain)); | |||||
Map<Integer, String> bizDomainMap = dashboardHelper.getBizDomainMap(); | |||||
AnalysisChart bizDomainInvestmentAnalysisChart = DashboardChartAssembler.buildInvestmentAnalysisChart(bizDomainMap, bizDomainGroupMap | |||||
, ChartTypeEnum.PROJECTS_INVESTMENT_AMOUNT_IN_VARIOUS_FIELDS_CHART); | |||||
// 各区域项目投资情况 | |||||
Map<String, List<Project>> areaCodeGroupMap = allProjectList.stream() | |||||
.collect(Collectors.groupingBy(Project::getAreaCode)); | |||||
Map<String, String> liShuiRegionCodeNameMap = dashboardHelper.getLiShuiRegionCodeNameMap(); | |||||
AnalysisChart areaCodeInvestmentAnalysisChart = DashboardChartAssembler.buildInvestmentAnalysisChart(liShuiRegionCodeNameMap, areaCodeGroupMap | |||||
, ChartTypeEnum.PROJECTS_INVESTMENT_SITUATION_IN_VARIOUS_REGIONS); | |||||
DashboardInvestmentSummaryVO dashboardInvestmentSummaryVO = new DashboardInvestmentSummaryVO(); | |||||
dashboardInvestmentSummaryVO.setCompanyProjectATIISTop5List(companyProjectATIISTop5List); | |||||
dashboardInvestmentSummaryVO.setProjectATIISTop5List(projectATIISTop5List); | |||||
List<AnalysisChart> analysisChartList = new ArrayList<>(); | |||||
dashboardInvestmentSummaryVO.setAnalysisChartList(analysisChartList); | |||||
analysisChartList.add(areaCodeInvestmentAnalysisChart); | |||||
analysisChartList.add(bizDomainInvestmentAnalysisChart); | |||||
return dashboardInvestmentSummaryVO; | |||||
} | |||||
/** | |||||
* 驾驶舱-项目画像 | |||||
* | |||||
* @param projectCode | |||||
* @return | |||||
*/ | |||||
public DashboardProjectProtraitVO getProjectPortrait(String projectCode) { | |||||
DashboardProjectProtraitVO res = new DashboardProjectProtraitVO(); | |||||
//1.先查询项目 | |||||
Project project = iProjectService.getProjectByCode(projectCode); | |||||
GovBizProjectBaseinfo baseInfo = baseinfoService.getOne(Wrappers.lambdaQuery(GovBizProjectBaseinfo.class) | |||||
.eq(GovBizProjectBaseinfo::getBaseProjId, projectCode) | |||||
.last(BizConst.LIMIT_1)); | |||||
GovOperationProjectBaseinfo operationBase = operationBaseService.getOne(Wrappers.lambdaQuery(GovOperationProjectBaseinfo.class) | |||||
.eq(GovOperationProjectBaseinfo::getBaseProjId, projectCode) | |||||
.last(BizConst.LIMIT_1)); | |||||
GovBizProjectApply apply = applyService.getOne(Wrappers.lambdaQuery(GovBizProjectApply.class) | |||||
.eq(GovBizProjectApply::getBaseProjId, projectCode) | |||||
.last(BizConst.LIMIT_1)); | |||||
if (Objects.isNull(project) && Objects.isNull(baseInfo) && Objects.isNull(operationBase)) { | |||||
return res; | |||||
} | |||||
//2.转换项目信息 | |||||
if (Objects.nonNull(project)) { | |||||
ProtraitProjectInfoVO projectInfo = BeanUtil.copyProperties(project, ProtraitProjectInfoVO.class); | |||||
projectInfo.setOverdueSituation("即将超期"); | |||||
projectInfo.setSafetyInputRate(convertSafetyInputRate(project)); | |||||
projectInfo.setStatus(Objects.nonNull(project.getStatus()) ? project.getStatus().toString() : null); | |||||
//3.项目状态情况 | |||||
projectInfo.setStatusSituation(genProjectStatus(project)); | |||||
res.setProjectInfo(projectInfo); | |||||
} else if (Objects.nonNull(baseInfo)) { | |||||
ProtraitProjectInfoVO projectInfo = BeanUtil.copyProperties(baseInfo, ProtraitProjectInfoVO.class); | |||||
projectInfo.setOverdueSituation("即将超期"); | |||||
projectInfo.setSafetyInputRate("0"); | |||||
if (Objects.nonNull(apply)) { | |||||
try { | |||||
projectInfo.setProjectYear(Integer.valueOf(apply.getBaseProjSetYear())); | |||||
} catch (Exception ignored) { | |||||
} | |||||
projectInfo.setProjectIntroduction(apply.getBaseProjIntro()); | |||||
projectInfo.setBuildCycle(apply.getBaseProjDuration()); | |||||
projectInfo.setApprovalAmount(apply.getBaseProjTotalAmount()); | |||||
} | |||||
projectInfo.setProjectCode(projectCode); | |||||
projectInfo.setProjectName(baseInfo.getBaseProjName()); | |||||
projectInfo.setBuildOrgName(baseInfo.getBaseBuildDeprt()); | |||||
projectInfo.setBuildOrgCode(baseInfo.getBaseBuildDeprtDing()); | |||||
//3.项目状态情况 | |||||
projectInfo.setStatusSituation(genProjectStatus(baseInfo)); | |||||
projectInfo.setStatus(baseInfo.getBaseProjSetProg()); | |||||
res.setProjectInfo(projectInfo); | |||||
} else if (Objects.nonNull(operationBase)) { | |||||
ProtraitProjectInfoVO projectInfo = BeanUtil.copyProperties(operationBase, ProtraitProjectInfoVO.class); | |||||
projectInfo.setOverdueSituation("即将超期"); | |||||
projectInfo.setSafetyInputRate("0"); | |||||
if (Objects.nonNull(apply)) { | |||||
try { | |||||
projectInfo.setProjectYear(Integer.valueOf(apply.getBaseProjSetYear())); | |||||
} catch (Exception ignored) { | |||||
} | |||||
projectInfo.setProjectIntroduction(apply.getBaseProjIntro()); | |||||
projectInfo.setBuildCycle(apply.getBaseProjDuration()); | |||||
projectInfo.setApprovalAmount(apply.getBaseProjTotalAmount()); | |||||
} | |||||
projectInfo.setProjectCode(projectCode); | |||||
projectInfo.setProjectName(operationBase.getBaseProjName()); | |||||
projectInfo.setBuildOrgName(operationBase.getBaseBuildDeprt()); | |||||
projectInfo.setBuildOrgCode(operationBase.getBaseBuildDeprtDing()); | |||||
//3.项目状态情况 | |||||
projectInfo.setStatusSituation(genProjectStatus(operationBase)); | |||||
projectInfo.setStatus(operationBase.getBaseProjSetProg()); | |||||
res.setProjectInfo(projectInfo); | |||||
} | |||||
//4.查询项目特征 | |||||
res.setProjectFeatures(projectTagService.getProjectTas(projectCode)); | |||||
//5.查询项目产出 | |||||
res.setProjectOutput(applicationHandler.generateOutput(projectCode)); | |||||
return res; | |||||
} | |||||
/** | |||||
* 计算安全投入 | |||||
* | |||||
* @param project | |||||
* @return | |||||
*/ | |||||
public static String convertSafetyInputRate(Project project) { | |||||
String safetyInputDescribe = project.getSafetyInputDescribe(); | |||||
if (org.apache.commons.lang3.StringUtils.isNotBlank(safetyInputDescribe)) { | |||||
try { | |||||
JSONArray array = JSON.parseArray(safetyInputDescribe); | |||||
final Double[] total = {0.0}; | |||||
array.forEach(j -> { | |||||
JSONObject json = JSON.parseObject(JSON.toJSONString(j)); | |||||
Double safetyInputAmount = json.getDouble(Protrait.FEILD_SAFETYMONEY); | |||||
if (Objects.nonNull(safetyInputAmount)) { | |||||
total[0] += safetyInputAmount; | |||||
} | |||||
}); | |||||
Double totalAmount = total[0]; | |||||
//申报金额 | |||||
BigDecimal declareAmount = project.getDeclareAmount(); | |||||
if (Objects.isNull(declareAmount) || declareAmount.compareTo(BigDecimal.ZERO) == 0) { | |||||
return Protrait.ZREO_PERCEN; | |||||
} | |||||
BigDecimal rate = BigDecimal.valueOf(totalAmount).multiply(BigDecimal.valueOf(100)) | |||||
.divide(declareAmount, BigDecimal.ROUND_CEILING, RoundingMode.HALF_UP) | |||||
.stripTrailingZeros(); | |||||
return rate.toPlainString(); | |||||
} catch (Exception ignored) { | |||||
} | |||||
} | |||||
return Protrait.ZREO_PERCEN; | |||||
} | |||||
/** | |||||
* 生成项目 状态流转信息 | |||||
* | |||||
* @param project | |||||
* @return | |||||
*/ | |||||
private List<ProtraitProjectStatusSituationVO> genProjectStatus(Project project) { | |||||
final List<ProtraitProjectStatusSituationVO> res = Lists.newArrayList(); | |||||
//1.计划(单位内部审核) | |||||
res.add(new ProtraitProjectStatusSituationVO()); | |||||
//2.申报(项目预审) | |||||
res.add(new ProtraitProjectStatusSituationVO()); | |||||
//3.审批(建设方案审批) | |||||
res.add(new ProtraitProjectStatusSituationVO()); | |||||
//4.建设(立项后的建设中) | |||||
res.add(new ProtraitProjectStatusSituationVO()); | |||||
//5.验收(终验) | |||||
res.add(new ProtraitProjectStatusSituationVO()); | |||||
//6.运维(todo: 运维时间还没有) | |||||
res.add(ProtraitProjectStatusSituationVO.builder().statusName(Protrait.OPERATION).build()); | |||||
//7.绩效 | |||||
res.add(new ProtraitProjectStatusSituationVO()); | |||||
//8.注销(todo: 还没有注销功能) | |||||
res.add(ProtraitProjectStatusSituationVO.builder().statusName(Protrait.LOG_OFF).build()); | |||||
CompletableFuture.allOf( | |||||
CompletableFuture.runAsync(() -> res.set(0, statusHandler.genApproveStatus(project, Protrait.PLAN, | |||||
InstTypeEnum.UNIT_INNER_AUDIT)), ForkJoinPool.commonPool()), | |||||
CompletableFuture.runAsync(() -> res.set(1, statusHandler.genApproveStatus(project, Protrait.DECLARED, | |||||
InstTypeEnum.PRELIMINARY_PREVIEW)), ForkJoinPool.commonPool()), | |||||
CompletableFuture.runAsync(() -> res.set(2, statusHandler.genApproveStatus(project, Protrait.APPROVE, | |||||
InstTypeEnum.CONSTRUCTION_PLAN_REVIEW)), ForkJoinPool.commonPool()), | |||||
CompletableFuture.runAsync(() -> res.set(3, statusHandler.genStatus(project, Protrait.CONSTRUCTION, | |||||
ProjectStatusEnum.UNDER_CONSTRUCTION, ProjectStatusEnum.TO_BE_FINALLY_INSPECTED)), ForkJoinPool.commonPool()), | |||||
CompletableFuture.runAsync(() -> res.set(4, statusHandler.genApproveStatus(project, Protrait.ACCEPT, | |||||
InstTypeEnum.PROJECT_FINAL_INSPECTION)), ForkJoinPool.commonPool()), | |||||
CompletableFuture.runAsync(() -> res.set(6, statusHandler.generatePerformanceStatus(project)), | |||||
ForkJoinPool.commonPool()) | |||||
).join(); | |||||
return res; | |||||
} | |||||
private List<ProtraitProjectStatusSituationVO> genProjectStatus(GovBizProjectBaseinfo baseinfo) { | |||||
final List<ProtraitProjectStatusSituationVO> res = Lists.newArrayList(); | |||||
//1.计划(单位内部审核) | |||||
res.add(new ProtraitProjectStatusSituationVO(Protrait.PLAN, null)); | |||||
//2.申报(项目预审) | |||||
res.add(new ProtraitProjectStatusSituationVO(Protrait.DECLARED, null)); | |||||
//3.审批(建设方案审批) | |||||
res.add(new ProtraitProjectStatusSituationVO(Protrait.APPROVE, null)); | |||||
//4.建设(立项后的建设中) | |||||
res.add(new ProtraitProjectStatusSituationVO(Protrait.CONSTRUCTION, null)); | |||||
//5.验收(终验) | |||||
res.add(new ProtraitProjectStatusSituationVO(Protrait.ACCEPT, | |||||
Objects.nonNull(baseinfo.getBaseProjSetProg()) && "07".equals(baseinfo.getBaseProjSetProg()) ? baseinfo.getTongTime() : null)); | |||||
//6.运维(todo: 运维时间还没有) | |||||
res.add(ProtraitProjectStatusSituationVO.builder().statusName(Protrait.OPERATION).build()); | |||||
//7.绩效 | |||||
res.add(new ProtraitProjectStatusSituationVO(Protrait.ACCEPT, null)); | |||||
//8.注销(todo: 还没有注销功能) | |||||
res.add(ProtraitProjectStatusSituationVO.builder().statusName(Protrait.LOG_OFF).build()); | |||||
return res; | |||||
} | |||||
private List<ProtraitProjectStatusSituationVO> genProjectStatus(GovOperationProjectBaseinfo baseinfo) { | |||||
final List<ProtraitProjectStatusSituationVO> res = Lists.newArrayList(); | |||||
//1.计划(单位内部审核) | |||||
res.add(new ProtraitProjectStatusSituationVO(Protrait.PLAN, null)); | |||||
//2.申报(项目预审) | |||||
res.add(new ProtraitProjectStatusSituationVO(Protrait.DECLARED, null)); | |||||
//3.审批(建设方案审批) | |||||
res.add(new ProtraitProjectStatusSituationVO(Protrait.APPROVE, null)); | |||||
//4.建设(立项后的建设中) | |||||
res.add(new ProtraitProjectStatusSituationVO(Protrait.CONSTRUCTION, null)); | |||||
//5.验收(终验) | |||||
res.add(new ProtraitProjectStatusSituationVO(Protrait.ACCEPT, | |||||
Objects.nonNull(baseinfo.getBaseProjSetProg()) && "07".equals(baseinfo.getBaseProjSetProg()) ? baseinfo.getTongTime() : null)); | |||||
//6.运维(todo: 运维时间还没有) | |||||
res.add(ProtraitProjectStatusSituationVO.builder().statusName(Protrait.OPERATION).build()); | |||||
//7.绩效 | |||||
res.add(new ProtraitProjectStatusSituationVO(Protrait.ACCEPT, null)); | |||||
//8.注销(todo: 还没有注销功能) | |||||
res.add(ProtraitProjectStatusSituationVO.builder().statusName(Protrait.LOG_OFF).build()); | |||||
return res; | |||||
} | |||||
} |
@@ -1,301 +0,0 @@ | |||||
package com.hz.pm.api.dashboard.manage; | |||||
import cn.hutool.core.collection.CollUtil; | |||||
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; | |||||
import com.baomidou.mybatisplus.core.toolkit.Wrappers; | |||||
import com.google.common.collect.Lists; | |||||
import com.hz.pm.api.common.enumeration.ProjectProcessStageEnum; | |||||
import com.hz.pm.api.common.model.entity.DataDTO; | |||||
import com.hz.pm.api.dashboard.model.vo.EarlyWarningStatisticsVO; | |||||
import com.hz.pm.api.projectlib.model.enumeration.ProjectStatusEnum; | |||||
import com.hz.pm.api.projectlib.model.enumeration.WarningFlowTypeEnum; | |||||
import com.hz.pm.api.projectlib.model.enumeration.WarningOperationTypeEnum; | |||||
import com.hz.pm.api.projectlib.model.entity.Project; | |||||
import com.hz.pm.api.projectlib.model.entity.ProjectInst; | |||||
import com.hz.pm.api.projectlib.service.IProjectInstService; | |||||
import com.hz.pm.api.projectlib.service.IProjectService; | |||||
import com.hz.pm.api.sys.model.entity.WflowEarlyWarningRecords; | |||||
import com.hz.pm.api.sys.service.IEarlyWarningRecordsService; | |||||
import com.hz.pm.api.sys.utils.EarlyWarningUtil; | |||||
import com.hz.pm.api.user.security.model.UserInfoDetails; | |||||
import com.hz.pm.api.user.util.LoginUserUtil; | |||||
import com.wflow.enums.WarningNoticeTypeEnum; | |||||
import com.wflow.enums.WarningRuleTypeEnum; | |||||
import lombok.RequiredArgsConstructor; | |||||
import lombok.extern.slf4j.Slf4j; | |||||
import org.apache.commons.lang3.StringUtils; | |||||
import org.flowable.engine.HistoryService; | |||||
import org.flowable.engine.TaskService; | |||||
import org.flowable.engine.history.HistoricProcessInstance; | |||||
import org.flowable.task.api.Task; | |||||
import org.springframework.stereotype.Component; | |||||
import java.math.BigDecimal; | |||||
import java.time.LocalDateTime; | |||||
import java.util.List; | |||||
import java.util.Map; | |||||
import java.util.Objects; | |||||
import java.util.Set; | |||||
import java.util.stream.Collectors; | |||||
/** | |||||
* @Classname EarlyWarningStatisticsManage | |||||
* @Description | |||||
* @Date 2023/12/05 17:44 | |||||
* @Author PoffyZhang | |||||
*/ | |||||
@Component | |||||
@RequiredArgsConstructor | |||||
@Slf4j | |||||
public class EarlyWarningStatisticsManage { | |||||
private final IEarlyWarningRecordsService earlyWarningRecordsService; | |||||
private final HistoryService historyService; | |||||
private final IProjectInstService projectInstService; | |||||
private final IProjectService projectService; | |||||
private final TaskService taskService; | |||||
private static final List<Integer> threeYears = Lists.newArrayList(LocalDateTime.now().getYear() - 2, | |||||
LocalDateTime.now().getYear() - 1, LocalDateTime.now().getYear()); | |||||
public EarlyWarningStatisticsVO statistics(Integer year) { | |||||
UserInfoDetails user = LoginUserUtil.loginUserDetail(); | |||||
//项目 | |||||
List<Project> projects = projectService.list(Wrappers.lambdaQuery(Project.class) | |||||
.eq(Project::getNewest, Boolean.TRUE)); | |||||
EarlyWarningStatisticsVO res = new EarlyWarningStatisticsVO(); | |||||
LambdaQueryWrapper<WflowEarlyWarningRecords> wrapper = Wrappers.lambdaQuery(WflowEarlyWarningRecords.class); | |||||
EarlyWarningUtil.buildPermissionWrapper(wrapper, user); | |||||
List<WflowEarlyWarningRecords> records = earlyWarningRecordsService.list(wrapper); | |||||
//累积总告警数 | |||||
res.setAccumulatedAlarmsTotal(records.size()); | |||||
res.setAccumulatedAlarmsFlow((int) records.stream().filter(a -> { | |||||
if (Objects.nonNull(a.getRuleType()) && | |||||
a.getRuleType().equals(WarningRuleTypeEnum.PROCESS_WARNING.getCode())) { | |||||
return Boolean.TRUE; | |||||
} | |||||
return Boolean.FALSE; | |||||
}).count()); | |||||
res.setAccumulatedAlarmsFilling((int) records.stream().filter(a -> { | |||||
if (Objects.nonNull(a.getRuleType()) && | |||||
a.getRuleType().equals(WarningRuleTypeEnum.DECLARED_WARNING.getCode())) { | |||||
return Boolean.TRUE; | |||||
} | |||||
return Boolean.FALSE; | |||||
}).count()); | |||||
//近三年 | |||||
List<DataDTO> threeYearsAlarms = Lists.newArrayList(); | |||||
for (Integer thisYear : threeYears) { | |||||
DataDTO yearData = new DataDTO(); | |||||
yearData.setName(thisYear.toString()); | |||||
yearData.setNum((int) records.stream().filter(r -> { | |||||
if (Objects.nonNull(r.getWarningTime()) && | |||||
thisYear.equals(r.getWarningTime().getYear())) { | |||||
return Boolean.TRUE; | |||||
} | |||||
return Boolean.FALSE; | |||||
}).count()); | |||||
threeYearsAlarms.add(yearData); | |||||
} | |||||
res.setThreeYearsAlarms(threeYearsAlarms); | |||||
//当前各流程报警数 | |||||
List<DataDTO> alarmsFlowsNow = Lists.newArrayList(); | |||||
for (ProjectProcessStageEnum stageEnum : ProjectProcessStageEnum.values()) { | |||||
String processName = stageEnum.getDesc(); | |||||
Integer processType = stageEnum.getCode(); | |||||
alarmsFlowsNow.add(DataDTO.of(processName, computeFlowWarningNow(processType, records))); | |||||
} | |||||
res.setAlarmsFlowsNow(alarmsFlowsNow); | |||||
//当前各填报报警数 | |||||
List<DataDTO> alarmsFillingNow = Lists.newArrayList(); | |||||
for (WarningFlowTypeEnum fillingEnum : WarningFlowTypeEnum.values()) { | |||||
String processName = fillingEnum.getDesc(); | |||||
Integer projectStatus = fillingEnum.getProjectStutas(); | |||||
alarmsFillingNow.add(DataDTO.of(processName, computeFillingNow(projectStatus, records, projects))); | |||||
} | |||||
res.setAlarmsFillingNow(alarmsFillingNow); | |||||
//实施预警 | |||||
List<DataDTO> alarmsConstruction = Lists.newArrayList(); | |||||
for (WarningNoticeTypeEnum noticeTypeEnum : WarningNoticeTypeEnum.values()) { | |||||
String name = noticeTypeEnum.getDesc(); | |||||
Integer noticeType = noticeTypeEnum.getCode(); | |||||
alarmsConstruction.add(DataDTO.of(name, computeConstruction(noticeType, records, projects))); | |||||
} | |||||
res.setConstructionAlarms(alarmsConstruction); | |||||
//安全监测 | |||||
List<DataDTO> safetyMonitoring = Lists.newArrayList(); | |||||
//--1 安全设计 | |||||
safetyMonitoring.add(DataDTO.of("安全设计", 0)); | |||||
//--2 安全投入低于5% | |||||
safetyMonitoring.add(DataDTO.of("安全投入低于5%", computeSafeLessFive(projects))); | |||||
//--3 非信创 | |||||
safetyMonitoring.add(DataDTO.of("非信创", computeNotXinChuang(projects))); | |||||
//--4 等保未做 | |||||
safetyMonitoring.add(DataDTO.of("等保未做", 0)); | |||||
//--5 密评未做 | |||||
safetyMonitoring.add(DataDTO.of("密评未做", 0)); | |||||
res.setSafetyMonitoring(safetyMonitoring); | |||||
return res; | |||||
} | |||||
//计算非信创 | |||||
private Integer computeNotXinChuang(List<Project> projects) { | |||||
return (int) projects.stream().filter(p -> StringUtils.isNotBlank(p.getCloudType()) && | |||||
!p.getCloudType().contains("2")).count(); | |||||
} | |||||
//计算安全投入低于5% | |||||
private Integer computeSafeLessFive(List<Project> projects) { | |||||
return (int) projects.stream().filter(p -> { | |||||
//计算出 安全投入 | |||||
BigDecimal rate = new BigDecimal(DashboardProjectManage.convertSafetyInputRate(p)); | |||||
if (rate.compareTo(new BigDecimal(5)) < 0) { | |||||
return Boolean.TRUE; | |||||
} | |||||
return Boolean.FALSE; | |||||
}).count(); | |||||
} | |||||
private Integer computeConstruction(Integer noticeType, List<WflowEarlyWarningRecords> records, | |||||
List<Project> projects) { | |||||
//终验告警 | |||||
List<WflowEarlyWarningRecords> constructionRecords = records.stream().filter(r -> { | |||||
if (Objects.nonNull(r.getRuleType()) && | |||||
WarningRuleTypeEnum.OPERATION_WARNING.getCode().equals(r.getRuleType())) { | |||||
return Boolean.TRUE; | |||||
} | |||||
return Boolean.FALSE; | |||||
}).filter(r -> Objects.nonNull(r.getNoticeType()) && r.getNoticeType().equals(noticeType) && | |||||
WarningOperationTypeEnum.ZHONGYAN.getCode().equals(r.getBiz())) | |||||
.collect(Collectors.toList()); | |||||
if (CollUtil.isEmpty(constructionRecords)) { | |||||
return 0; | |||||
} | |||||
Map<String, List<WflowEarlyWarningRecords>> recordsMap = constructionRecords.stream().collect(Collectors.groupingBy( | |||||
WflowEarlyWarningRecords::getProjectCode)); | |||||
//待终验的项目 | |||||
List<Project> tobeFinalProjects = projects.stream().filter(p -> { | |||||
if (Objects.nonNull(p.getStatus()) && | |||||
p.getStatus().equals(ProjectStatusEnum.TO_BE_FINALLY_INSPECTED.getCode())) { | |||||
return Boolean.TRUE; | |||||
} | |||||
return Boolean.FALSE; | |||||
}).collect(Collectors.toList()); | |||||
return (int) tobeFinalProjects.stream().filter(p -> { | |||||
if (recordsMap.containsKey(p.getProjectCode())) { | |||||
List<WflowEarlyWarningRecords> warningRecords = recordsMap.get(p.getProjectCode()); | |||||
//如果是临期的 不能包含有超期的 | |||||
if (noticeType.equals(WarningNoticeTypeEnum.ADVENT.getCode())) { | |||||
for (WflowEarlyWarningRecords warningRecord : warningRecords) { | |||||
if (Objects.isNull(warningRecord.getNoticeType()) || warningRecord.getNoticeType() | |||||
.equals(WarningNoticeTypeEnum.OVER.getCode())) { | |||||
return Boolean.FALSE; | |||||
} | |||||
} | |||||
} | |||||
//这个状态有告警 并且 这个项目也是这个类型 | |||||
return Boolean.TRUE; | |||||
} | |||||
return Boolean.FALSE; | |||||
}).count(); | |||||
} | |||||
private Integer computeFillingNow(Integer projectStutas, List<WflowEarlyWarningRecords> records, | |||||
List<Project> projects) { | |||||
List<WflowEarlyWarningRecords> fillingRecords = records.stream().filter(r -> { | |||||
if (Objects.nonNull(r.getRuleType()) && | |||||
WarningRuleTypeEnum.DECLARED_WARNING.getCode().equals(r.getRuleType())) { | |||||
return Boolean.TRUE; | |||||
} | |||||
return Boolean.FALSE; | |||||
}).filter(r -> Objects.nonNull(r.getNodeId())).collect(Collectors.toList()); | |||||
if (CollUtil.isEmpty(fillingRecords)) { | |||||
return 0; | |||||
} | |||||
Map<String, List<WflowEarlyWarningRecords>> warningMap = fillingRecords.stream() | |||||
.collect(Collectors.groupingBy(WflowEarlyWarningRecords::getProjectCode)); | |||||
List<Project> thisStatusProjects = projects.stream().filter(p -> { | |||||
if (Objects.nonNull(p.getStatus()) && p.getStatus().equals(projectStutas)) { | |||||
return Boolean.TRUE; | |||||
} | |||||
return Boolean.FALSE; | |||||
}).collect(Collectors.toList()); | |||||
return (int) thisStatusProjects.stream().filter(p -> { | |||||
if (warningMap.containsKey(p.getProjectCode())) { | |||||
//这个状态有告警 并且 这个项目也是这个类型 | |||||
return Boolean.TRUE; | |||||
} | |||||
return Boolean.FALSE; | |||||
}).count(); | |||||
} | |||||
//计算某个流程当前正在告警的数量 | |||||
private Integer computeFlowWarningNow(Integer processType, List<WflowEarlyWarningRecords> records) { | |||||
List<WflowEarlyWarningRecords> processRecords = records.stream().filter(r -> { | |||||
if (Objects.nonNull(r.getRuleType()) && | |||||
WarningRuleTypeEnum.PROCESS_WARNING.getCode().equals(r.getRuleType())) { | |||||
return Boolean.TRUE; | |||||
} | |||||
return Boolean.FALSE; | |||||
}).filter(r -> Objects.nonNull(r.getNodeId())).collect(Collectors.toList()); | |||||
if (CollUtil.isEmpty(processRecords)) { | |||||
return 0; | |||||
} | |||||
Map<String, List<WflowEarlyWarningRecords>> warningMap = processRecords.stream() | |||||
.collect(Collectors.groupingBy(WflowEarlyWarningRecords::getNodeId)); | |||||
//1.先查出 所育 这个类型的 流程 | |||||
List<ProjectInst> proInsts = projectInstService.list(Wrappers.lambdaQuery(ProjectInst.class) | |||||
.eq(ProjectInst::getInstType, processType)); | |||||
if (CollUtil.isEmpty(proInsts)) { | |||||
return 0; | |||||
} | |||||
//2.再筛选一下 选出 正在审核 未完成的 | |||||
Set<String> instCodes = proInsts.stream().map(ProjectInst::getInstCode) | |||||
.collect(Collectors.toSet()); | |||||
List<HistoricProcessInstance> processes = historyService.createHistoricProcessInstanceQuery() | |||||
.processInstanceIds(instCodes) | |||||
.unfinished() | |||||
.orderByProcessInstanceStartTime() | |||||
.asc() | |||||
.list(); | |||||
if (CollUtil.isEmpty(processes)) { | |||||
return 0; | |||||
} | |||||
//查出所有正在执行的工作流任务 | |||||
List<Task> tasks = taskService.createTaskQuery() | |||||
.list(); | |||||
if (CollUtil.isEmpty(tasks)) { | |||||
return 0; | |||||
} | |||||
Map<String, List<Task>> taskMap = tasks.stream() | |||||
.collect(Collectors.groupingBy(Task::getProcessInstanceId)); | |||||
return (int) processes.stream().filter(p -> { | |||||
if (taskMap.containsKey(p.getId())) { | |||||
List<Task> tasksThis = taskMap.get(p.getId()); | |||||
for (Task taskThis : tasksThis) { | |||||
//说明 当前有告警 | |||||
if (warningMap.containsKey(taskThis.getTaskDefinitionKey())) { | |||||
return Boolean.TRUE; | |||||
} | |||||
} | |||||
} | |||||
return Boolean.FALSE; | |||||
}).count(); | |||||
} | |||||
} |
@@ -57,10 +57,6 @@ public class ExpertStatisticsManage { | |||||
private final IMetaDictionaryService metaDictionaryService; | private final IMetaDictionaryService metaDictionaryService; | ||||
private Integer[] years = new Integer[]{LocalDateTime.now().getYear() - 2, | |||||
LocalDateTime.now().getYear() - 1, LocalDateTime.now().getYear(), | |||||
LocalDateTime.now().getYear() + 1, LocalDateTime.now().getYear() + 2}; | |||||
private Integer[] threeYears = new Integer[]{LocalDateTime.now().getYear() - 2, | private Integer[] threeYears = new Integer[]{LocalDateTime.now().getYear() - 2, | ||||
LocalDateTime.now().getYear() - 1, LocalDateTime.now().getYear()}; | LocalDateTime.now().getYear() - 1, LocalDateTime.now().getYear()}; | ||||
@@ -1,195 +0,0 @@ | |||||
package com.hz.pm.api.dashboard.manage; | |||||
import cn.hutool.core.collection.CollUtil; | |||||
import com.baomidou.mybatisplus.core.toolkit.Wrappers; | |||||
import com.google.common.collect.Lists; | |||||
import com.hz.pm.api.common.helper.RegionCacheHelper; | |||||
import com.hz.pm.api.common.model.constant.RegionConst; | |||||
import com.hz.pm.api.common.model.entity.DataDTO; | |||||
import com.hz.pm.api.dashboard.model.vo.MeetingStatisticsVO; | |||||
import com.hz.pm.api.ding.constants.DingOrganizationContant; | |||||
import com.hz.pm.api.expert.constant.ReviewResultEnum; | |||||
import com.hz.pm.api.expert.model.entity.ExpertReview; | |||||
import com.hz.pm.api.expert.model.enumeration.ReviewTemplateTypeEnum; | |||||
import com.hz.pm.api.expert.service.IExpertReviewService; | |||||
import com.hz.pm.api.meeting.entity.domain.Meeting; | |||||
import com.hz.pm.api.meeting.service.IMeetingService; | |||||
import com.hz.pm.api.organization.model.entity.DingOrganization; | |||||
import com.hz.pm.api.organization.service.IDingOrganizationService; | |||||
import com.hz.pm.api.projectlib.model.entity.Project; | |||||
import com.hz.pm.api.projectlib.service.IProjectService; | |||||
import com.hz.pm.api.sys.model.dto.RegionDTO; | |||||
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.math.RoundingMode; | |||||
import java.util.Comparator; | |||||
import java.util.List; | |||||
import java.util.Objects; | |||||
import java.util.stream.Collectors; | |||||
/** | |||||
* @Classname MeetingStatisticsManage | |||||
* @Description | |||||
* @Date 2023/12/05 17:44 | |||||
* @Author PoffyZhang | |||||
*/ | |||||
@Component | |||||
@RequiredArgsConstructor | |||||
@Slf4j | |||||
public class MeetingStatisticsManage { | |||||
private final IMeetingService meetingService; | |||||
private final IExpertReviewService expertReviewService; | |||||
private final RegionCacheHelper regionCacheHelper; | |||||
private final IDingOrganizationService dingOrganizationService; | |||||
private final IProjectService projectService; | |||||
public MeetingStatisticsVO statistics(Integer year) { | |||||
MeetingStatisticsVO res = new MeetingStatisticsVO(); | |||||
List<Meeting> meetings = meetingService.list(Wrappers.lambdaQuery(Meeting.class)); | |||||
//查出 年份的 会议数据 | |||||
meetings = meetings.stream().filter(m -> { | |||||
if (Objects.nonNull(m.getStartTime()) && | |||||
(Objects.isNull(year) || year.equals(m.getStartTime().getYear()))) { | |||||
return Boolean.TRUE; | |||||
} | |||||
return Boolean.FALSE; | |||||
}).collect(Collectors.toList()); | |||||
List<Long> meetingIds = meetings.stream().map(Meeting::getId) | |||||
.collect(Collectors.toList()); | |||||
//会议总数 | |||||
res.setMeetingTotal(meetings.size()); | |||||
//评审数 | |||||
List<ExpertReview> expertReviews = Lists.newArrayList(); | |||||
Integer reviewsTotal = 0; | |||||
if (CollUtil.isNotEmpty(meetingIds)) { | |||||
expertReviews = expertReviewService.list(Wrappers.lambdaQuery(ExpertReview.class) | |||||
.eq(ExpertReview::getIsFinal, Boolean.TRUE) | |||||
.in(ExpertReview::getMeetingId, meetingIds)); | |||||
reviewsTotal = expertReviews.size(); | |||||
} | |||||
//通过的评审 | |||||
List<ExpertReview> passExpertReviews = expertReviews.stream() | |||||
.filter(r -> Objects.nonNull(r.getReviewResult()) && | |||||
r.getReviewResult().equals(ReviewResultEnum.PASSED.getCode())) | |||||
.collect(Collectors.toList()); | |||||
//不通过的评审 | |||||
List<ExpertReview> notpassExpertReviews = expertReviews.stream() | |||||
.filter(r -> Objects.nonNull(r.getReviewResult()) && | |||||
r.getReviewResult().equals(ReviewResultEnum.REFUSED.getCode())) | |||||
.collect(Collectors.toList()); | |||||
res.setPassReview(passExpertReviews.size()); | |||||
res.setNotPassRate(reviewsTotal.compareTo(0) == 0 ? BigDecimal.ZERO : | |||||
BigDecimal.valueOf(notpassExpertReviews.size()).multiply(BigDecimal.valueOf(100) | |||||
.divide(BigDecimal.valueOf(reviewsTotal), RoundingMode.HALF_UP))); | |||||
//各区域 | |||||
List<RegionDTO> regions = regionCacheHelper.listChildren(RegionConst.RC_HZ, RegionConst.RL_CITY) | |||||
.stream().filter(r -> r.getRegionLevel().equals(RegionConst.RL_COUNTY)) | |||||
.sorted(Comparator.comparing(RegionDTO::getRegionCode)).collect(Collectors.toList()); | |||||
List<DataDTO> regionMeetngs = Lists.newArrayList(); | |||||
for (RegionDTO region : regions) { | |||||
regionMeetngs.add(DataDTO.of(region.getRegionName(), region.getRegionCode(), meetings.size())); | |||||
} | |||||
res.setRegionMeetings(regionMeetngs); | |||||
//预审 验收 会议 | |||||
List<DataDTO> meetingTypes = Lists.newArrayList(); | |||||
meetingTypes.add(DataDTO.of("预审会议", ReviewTemplateTypeEnum.PRELIMINARY_SCHEME_REVIEW.getCode().toString(), | |||||
meetings.stream().filter(m -> { | |||||
if (StringUtils.isNotBlank(m.getType()) && | |||||
m.getType().equals(ReviewTemplateTypeEnum.PRELIMINARY_SCHEME_REVIEW.getCode() | |||||
.toString())) { | |||||
return Boolean.TRUE; | |||||
} | |||||
return Boolean.FALSE; | |||||
}).collect(Collectors.toList()).size())); | |||||
long yanshouCount = meetings.stream().filter(m -> { | |||||
if (StringUtils.isNotBlank(m.getType()) && | |||||
m.getType().equals(ReviewTemplateTypeEnum.ACCEPTANCE_SCHEME_REVIEW.getCode() | |||||
.toString())) { | |||||
return Boolean.TRUE; | |||||
} | |||||
return Boolean.FALSE; | |||||
}).count(); | |||||
meetingTypes.add(DataDTO.of("验收会议", ReviewTemplateTypeEnum.ACCEPTANCE_SCHEME_REVIEW.getCode().toString(), | |||||
(int) yanshouCount)); | |||||
res.setMeetingTypes(meetingTypes); | |||||
//各区县评审 不通过率 | |||||
List<DataDTO> regionNotpassReview = Lists.newArrayList(); | |||||
for (RegionDTO region : regions) { | |||||
DataDTO data = new DataDTO(); | |||||
data.setCode(region.getRegionCode()); | |||||
data.setName(region.getRegionName()); | |||||
//先求出 此区域会议 | |||||
List<Long> regionMeetingIds = meetings.stream().filter(m -> Boolean.FALSE).map(Meeting::getId).collect(Collectors.toList()); | |||||
List<ExpertReview> regionReviews = expertReviews.stream().filter(r -> { | |||||
if (Objects.nonNull(r.getMeetingId()) && | |||||
regionMeetingIds.contains(r.getMeetingId())) { | |||||
return Boolean.TRUE; | |||||
} | |||||
return Boolean.FALSE; | |||||
}).collect(Collectors.toList()); | |||||
long regionNotpass = regionReviews.stream().filter(r -> Objects.nonNull(r.getReviewResult()) && | |||||
r.getReviewResult().equals(ReviewResultEnum.REFUSED.getCode())) | |||||
.count(); | |||||
data.setRate(CollUtil.isEmpty(regionReviews) ? BigDecimal.ZERO : | |||||
BigDecimal.valueOf(regionNotpass).multiply(BigDecimal.valueOf(100)) | |||||
.divide(BigDecimal.valueOf(regionReviews.size()), BigDecimal.ROUND_CEILING, RoundingMode.HALF_UP)); | |||||
regionNotpassReview.add(data); | |||||
} | |||||
res.setNotPassRegionMeetings(regionNotpassReview); | |||||
//各部门 不通过项目TOP10 | |||||
List<DingOrganization> organizations = dingOrganizationService.list(Wrappers.lambdaQuery(DingOrganization.class) | |||||
.in(DingOrganization::getTypeCode, Lists.newArrayList(DingOrganizationContant.UNIT_TYPE, | |||||
DingOrganizationContant.GOV_TEMPORARY))); | |||||
List<Project> projects = projectService.list(Wrappers.lambdaQuery(Project.class) | |||||
.eq(Project::getNewest, Boolean.TRUE)); | |||||
//TOP10 | |||||
List<ExpertReview> finalExpertReviews = expertReviews; | |||||
List<DataDTO> notpassTop10 = organizations.stream() | |||||
.map(o -> { | |||||
DataDTO data = new DataDTO(); | |||||
data.setCode(o.getOrganizationCode()); | |||||
data.setName(o.getOrganizationName()); | |||||
List<Project> orgProjects = projects.stream().filter(p -> Objects.nonNull(p.getBuildOrgCode()) && | |||||
p.getBuildOrgCode().equals(o.getOrganizationCode())) | |||||
.collect(Collectors.toList()); | |||||
List<String> projectCodes = orgProjects.stream().map(Project::getProjectCode) | |||||
.collect(Collectors.toList()); | |||||
if (CollUtil.isEmpty(projectCodes)) { | |||||
return data; | |||||
} | |||||
List<ExpertReview> reviews = finalExpertReviews.stream().filter(r -> Objects.nonNull(r.getProjectCode()) && | |||||
projectCodes.contains(r.getProjectCode())).collect(Collectors.toList()); | |||||
long orgNotpass = reviews.stream().filter(r -> Objects.nonNull(r.getReviewResult()) && | |||||
r.getReviewResult().equals(ReviewResultEnum.REFUSED.getCode())) | |||||
.count(); | |||||
data.setRate(CollUtil.isEmpty(reviews) ? BigDecimal.ZERO : | |||||
BigDecimal.valueOf(orgNotpass).multiply(BigDecimal.valueOf(100)) | |||||
.divide(BigDecimal.valueOf(reviews.size()), BigDecimal.ROUND_CEILING, RoundingMode.HALF_UP)); | |||||
return data; | |||||
}) | |||||
.filter(d -> Objects.nonNull(d.getRate())) | |||||
.sorted(Comparator.comparing(DataDTO::getRate).reversed()) | |||||
.limit(10).collect(Collectors.toList()); | |||||
res.setNotPassTop10(notpassTop10); | |||||
return res; | |||||
} | |||||
} |
@@ -1,33 +0,0 @@ | |||||
package com.hz.pm.api.dashboard.manage; | |||||
import com.google.common.collect.Lists; | |||||
import com.hz.pm.api.dashboard.model.vo.PerformanceStatisticsVO; | |||||
import com.hz.pm.api.performance.service.IPerformanceAppraisalProjectService; | |||||
import lombok.RequiredArgsConstructor; | |||||
import lombok.extern.slf4j.Slf4j; | |||||
import org.springframework.stereotype.Component; | |||||
import java.time.LocalDateTime; | |||||
import java.util.List; | |||||
/** | |||||
* @Classname PerformanceStatisticsManage | |||||
* @Description | |||||
* @Date 2023/12/05 17:44 | |||||
* @Author PoffyZhang | |||||
*/ | |||||
@Component | |||||
@RequiredArgsConstructor | |||||
@Slf4j | |||||
public class PerformanceStatisticsManage { | |||||
private final IPerformanceAppraisalProjectService performanceAppraisalProjectService; | |||||
List<Integer> thisTwoYears = Lists.newArrayList(LocalDateTime.now().getYear() - 1 | |||||
,LocalDateTime.now().getYear()); | |||||
public PerformanceStatisticsVO statistics(Integer year) { | |||||
PerformanceStatisticsVO res = new PerformanceStatisticsVO(); | |||||
return res; | |||||
} | |||||
} |
@@ -32,7 +32,6 @@ import java.util.stream.Collectors; | |||||
public class ProjectCostStatisticsManage { | public class ProjectCostStatisticsManage { | ||||
private final IMeetingExpertService meetingExpertService; | private final IMeetingExpertService meetingExpertService; | ||||
private final IMeetingService meetingService; | private final IMeetingService meetingService; | ||||
//评审费 每人500 (0.05万) | //评审费 每人500 (0.05万) | ||||
@@ -1,19 +0,0 @@ | |||||
package com.hz.pm.api.datascope.contants; | |||||
/** | |||||
* <p> | |||||
* DataScopeColumnConst | |||||
* </p> | |||||
* | |||||
* @author WendyYang | |||||
* @since 16:24 2022/11/3 | |||||
*/ | |||||
public interface DataScopeColumnConst { | |||||
String REGION_ID = "region_id"; | |||||
String REGION_CODE = "region_code"; | |||||
String ORG_CODE = "org_code"; | |||||
} |
@@ -1,32 +0,0 @@ | |||||
package com.hz.pm.api.datascope.contants; | |||||
import io.swagger.annotations.ApiModel; | |||||
/** | |||||
* @Classname DataScopeTypeEnum | |||||
* @Description | |||||
* @Date 2022/11/18 11:15 | |||||
* @Created by PoffyZhang | |||||
*/ | |||||
@ApiModel(value = "DataScopeTypeEnum", description = "数据范围类型-枚举") | |||||
public enum LambdaDataScopeTypeEnum { | |||||
/** | |||||
* 地区 | |||||
*/ | |||||
REGION, | |||||
/** | |||||
* 公司 | |||||
*/ | |||||
ORG, | |||||
/** | |||||
* 员工 | |||||
*/ | |||||
EMPLOYEE, | |||||
/** | |||||
* 都没有 | |||||
*/ | |||||
NONE; | |||||
} |
@@ -3,10 +3,10 @@ package com.hz.pm.api.datascope.model; | |||||
import lombok.Data; | import lombok.Data; | ||||
/** | /** | ||||
* @Classname DataScopEntity | |||||
* @author PoffyZhang | |||||
* @Classname DataScopeEntity | |||||
* @Description | * @Description | ||||
* @Date 2022/11/11 16:25 | * @Date 2022/11/11 16:25 | ||||
* @Created by PoffyZhang | |||||
*/ | */ | ||||
@Data | @Data | ||||
public class DataScopeEntity { | public class DataScopeEntity { | ||||
@@ -1,14 +0,0 @@ | |||||
package com.hz.pm.api.ding.constants; | |||||
/** | |||||
* @Classname DingOrganizationContant | |||||
* @Description | |||||
* @Date 2023/7/10 17:58 | |||||
* @Author PoffyZhang | |||||
*/ | |||||
public interface DingOrganizationContant { | |||||
String UNIT_TYPE = "GOV_UNIT"; | |||||
String GOV_TEMPORARY = "GOV_TEMPORARY"; | |||||
String HOLLOW = "GOV_HOLLOW_DIVISION_NODE"; | |||||
} |
@@ -1,42 +1,13 @@ | |||||
package com.hz.pm.api.ding.controller; | package com.hz.pm.api.ding.controller; | ||||
import com.alibaba.fastjson.JSON; | |||||
import com.hz.pm.api.common.util.CryptUtils; | |||||
import com.hz.pm.api.ding.task.EmployeeBatchGetTask; | |||||
import com.hz.pm.api.ding.task.GovBusinessStripsTask; | import com.hz.pm.api.ding.task.GovBusinessStripsTask; | ||||
import com.hz.pm.api.ding.task.OrganizationBatchGetTask; | |||||
import com.hz.pm.api.irs.manage.AppIrsManage; | |||||
import com.hz.pm.api.irs.model.dto.ForwardDTO; | import com.hz.pm.api.irs.model.dto.ForwardDTO; | ||||
import com.hz.pm.api.sys.manage.OrgProcDefManage; | |||||
import com.hz.pm.api.projectdeclared.manage.IrsManage; | |||||
import com.hz.pm.api.projectlib.model.dto.ProjectDTO; | |||||
import com.hz.pm.api.projectlib.model.entity.Project; | |||||
import com.hz.pm.api.projectlib.service.IProjectService; | |||||
import com.ningdatech.irs.service.IRefreshTokenService; | |||||
import io.swagger.annotations.ApiOperation; | import io.swagger.annotations.ApiOperation; | ||||
import lombok.RequiredArgsConstructor; | import lombok.RequiredArgsConstructor; | ||||
import lombok.extern.slf4j.Slf4j; | import lombok.extern.slf4j.Slf4j; | ||||
import org.apache.commons.lang3.StringUtils; | |||||
import org.apache.poi.hssf.usermodel.HSSFWorkbook; | |||||
import org.apache.poi.ss.usermodel.Row; | |||||
import org.apache.poi.ss.usermodel.Sheet; | |||||
import org.apache.poi.ss.usermodel.Workbook; | |||||
import org.apache.poi.xssf.usermodel.XSSFWorkbook; | |||||
import org.springframework.beans.factory.annotation.Value; | |||||
import org.springframework.http.HttpMethod; | |||||
import org.springframework.http.ResponseEntity; | |||||
import org.springframework.util.Assert; | |||||
import org.springframework.web.bind.annotation.*; | import org.springframework.web.bind.annotation.*; | ||||
import org.springframework.web.client.RestTemplate; | |||||
import javax.annotation.Resource; | |||||
import javax.validation.Valid; | import javax.validation.Valid; | ||||
import java.io.File; | |||||
import java.io.FileInputStream; | |||||
import java.io.IOException; | |||||
import java.io.InputStream; | |||||
import java.security.NoSuchAlgorithmException; | |||||
import java.util.Objects; | |||||
/** | /** | ||||
* <p> | * <p> | ||||
@@ -52,237 +23,11 @@ import java.util.Objects; | |||||
@Slf4j | @Slf4j | ||||
public class DingInfoPullController { | public class DingInfoPullController { | ||||
private final EmployeeBatchGetTask employeeBatchGetTask; | |||||
private final GovBusinessStripsTask businessStripsTask; | private final GovBusinessStripsTask businessStripsTask; | ||||
private final OrganizationBatchGetTask organizationBatchGetTask; | |||||
private final OrgProcDefManage orgProcDefManage; | |||||
private final IrsManage irsManage; | |||||
@Resource | |||||
private IRefreshTokenService refreshTokenService; | |||||
@Value("${irs.interface-refresh.request-token-url}") | |||||
private String govRequestTokenUrl; | |||||
@Value("${irs.interface-refresh.refresh-token-url}") | |||||
private String govRefreshTokenUrl; | |||||
private final AppIrsManage appIrsManage; | |||||
private final IProjectService projectService; | |||||
@GetMapping("/employee") | |||||
public void employeeBatchGet() { | |||||
employeeBatchGetTask.batchGetEmployeeTask(); | |||||
} | |||||
@GetMapping("/businessStrips") | @GetMapping("/businessStrips") | ||||
public void businessStripsBatchGet() { | public void businessStripsBatchGet() { | ||||
businessStripsTask.batchGetGovBusinessStripsTask(); | businessStripsTask.batchGetGovBusinessStripsTask(); | ||||
} | } | ||||
@GetMapping("/organization") | |||||
public void organizationBatchGet() { | |||||
organizationBatchGetTask.batchGetOrganizationTask(); | |||||
} | |||||
@GetMapping("/organization/{orgCode}") | |||||
public void organizationGetSubs(@PathVariable String orgCode) { | |||||
organizationBatchGetTask.organizationGetSubs(orgCode); | |||||
} | |||||
@GetMapping("/organization-sub/{orgCode}") | |||||
public void organizationSubGetOrgs(@PathVariable String orgCode) { | |||||
organizationBatchGetTask.organizationSubGetOrgs(orgCode); | |||||
} | |||||
@GetMapping("/employeeByRegionCode/{regionCode}") | |||||
public void employeeBatchGetByRegionCode(@PathVariable String regionCode) { | |||||
employeeBatchGetTask.batchGetEmployeeTaskByRegionCode(regionCode); | |||||
} | |||||
@GetMapping("/employeeByOrdCode/{orgCode}") | |||||
public void employeeBatchGetByOrdCode(@PathVariable String orgCode) { | |||||
employeeBatchGetTask.batchGetEmployeeTaskByOrdCode(orgCode); | |||||
} | |||||
@GetMapping("/getEmployeeByCode/{empCode}") | |||||
public void getEmployeeByCode(@PathVariable String empCode) { | |||||
employeeBatchGetTask.getEmployeeByCode(empCode); | |||||
} | |||||
@GetMapping("/getBatchEmployeeByCode/{orgCode}") | |||||
public void getBatchEmployeeByCode(@PathVariable String orgCode) { | |||||
employeeBatchGetTask.getBatchEmployeeByCode(orgCode); | |||||
} | |||||
@GetMapping("/getToken") | |||||
public String getToken() { | |||||
return employeeBatchGetTask.getToken(); | |||||
} | |||||
@GetMapping("/getAuthToken") | |||||
public String getAuthToken() { | |||||
return employeeBatchGetTask.getAuthToken(); | |||||
} | |||||
@ApiOperation(value = "项目详情推送", notes = "项目详情推送") | |||||
@GetMapping("/push-project") | |||||
public String pushProject() throws Exception { | |||||
File f = new File("/temp/遂昌归集项目信息(需补).xlsx"); | |||||
// File f = new File("C:\\Users\\PoffyZhang\\Desktop\\遂昌归集项目信息(需补).xlsx"); | |||||
Workbook wb = readExcel(new FileInputStream(f), f.getName()); | |||||
Assert.notNull(wb, "文件流为空"); | |||||
Row row; | |||||
Integer sucessNum = 0; | |||||
if (wb != null) { | |||||
//获取第一个sheet | |||||
Sheet sheet = wb.getSheetAt(0); | |||||
//获取最大行数 | |||||
int rownum = sheet.getPhysicalNumberOfRows(); | |||||
//获取第一行 | |||||
row = sheet.getRow(0); | |||||
//获取最大列数 | |||||
for (int i = 1; i < rownum; i++) { | |||||
row = sheet.getRow(i); | |||||
if (Objects.isNull(row) || Objects.isNull(row.getCell(0))) { | |||||
//取不到数据了 停止 | |||||
log.info("数据取完"); | |||||
break; | |||||
} | |||||
ProjectDTO projectDto = new ProjectDTO(); | |||||
projectDto.setProjectCode(row.getCell(0).toString()); | |||||
projectDto.setProjectName(row.getCell(1).toString()); | |||||
projectDto.setArea(row.getCell(2).toString()); | |||||
projectDto.setAreaCode("331123000"); | |||||
String baseProjType = String.valueOf(row.getCell(4)); | |||||
if (StringUtils.isNotBlank(baseProjType) && baseProjType.contains(".")) { | |||||
baseProjType = baseProjType.substring(0, | |||||
baseProjType.indexOf(".")); | |||||
} | |||||
projectDto.setBaseProjType(baseProjType); | |||||
projectDto.setBaseConstructionType(String.valueOf(row.getCell(5))); | |||||
projectDto.setBaseProjConsClass(String.valueOf(row.getCell(6))); | |||||
projectDto.setBaseLowestLevel(String.valueOf(row.getCell(7))); | |||||
projectDto.setProjectYear(Integer.valueOf(String.valueOf(row.getCell(8)))); | |||||
projectDto.setBaseProjBasis(String.valueOf(row.getCell(9))); | |||||
projectDto.setBuildBasis(String.valueOf(row.getCell(10))); | |||||
String baseProjSerProg = String.valueOf(row.getCell(12)); | |||||
if (StringUtils.isNotBlank(baseProjSerProg) && baseProjSerProg.contains(".")) { | |||||
baseProjSerProg = baseProjSerProg.substring(0, | |||||
baseProjSerProg.indexOf(".")); | |||||
} | |||||
projectDto.setBaseProjSetProg(baseProjSerProg); | |||||
projectDto.setResponsibleMan(String.valueOf(row.getCell(13))); | |||||
projectDto.setResponsibleManMobile(String.valueOf(row.getCell(14))); | |||||
projectDto.setContactName(String.valueOf(row.getCell(15))); | |||||
projectDto.setContactPhone(String.valueOf(row.getCell(16))); | |||||
projectDto.setBuildOrgName(String.valueOf(row.getCell(18))); | |||||
projectDto.setBuildOrgCode(String.valueOf(row.getCell(19))); | |||||
projectDto.setSuperOrg(String.valueOf(row.getCell(21))); | |||||
projectDto.setSuperOrgCode(String.valueOf(row.getCell(22))); | |||||
projectDto.setHigherSuperOrg(String.valueOf(row.getCell(24))); | |||||
projectDto.setHigherSuperOrgCode(String.valueOf(row.getCell(25))); | |||||
log.info("projectDto :{}", JSON.toJSONString(projectDto)); | |||||
if (StringUtils.isNotBlank(appIrsManage.pushProjectDetail(projectDto))) { | |||||
sucessNum++; | |||||
} | |||||
} | |||||
} | |||||
return "推送IRS项目详情成功数量:" + sucessNum; | |||||
} | |||||
@ApiOperation(value = "应用和项目关系推送", notes = "应用和项目关系推送") | |||||
@GetMapping("/push-app-project") | |||||
public String pushAppProject() throws Exception { | |||||
long timestamp = System.currentTimeMillis(); | |||||
String areaCode = "331123"; | |||||
String appKey = "A331101453557202109017383"; | |||||
String appSecret = "496f0f2a19994f76b4fd9dae087366c7"; | |||||
String baseProjSys = "初次建设的应用21"; | |||||
String baseProjSysCode = "A331123467587202307014177"; | |||||
String baseProjName = "遂昌县-nsl-项目测试004"; | |||||
String baseProjId = "331123230130123412186"; | |||||
String requestSecret = refreshTokenService.refreshToken(appKey, appSecret, govRequestTokenUrl, govRefreshTokenUrl, HttpMethod.POST.name()); | |||||
String capCode = CryptUtils.encryptHMAC(timestamp + areaCode, "bcb4fc0f517fc168ee543fcf4d231f3b"); | |||||
String capTime = String.valueOf(timestamp); | |||||
String sign = CryptUtils.MD5Encode(appKey + requestSecret + timestamp); | |||||
String url = "https://interface.zjzwfw.gov.cn/gateway/api/proxy/001003001029/dataSharing/94wbaL1I1Pbz0648.htm?requestTime=" + timestamp + | |||||
"&sign=" + sign + "&appKey=" + appKey + "&capCode=" + capCode + "&capTime=" + capTime + | |||||
"&baseProjSys=" + baseProjSys + "&areaCode=331123&baseProjName=" + baseProjName + "&baseProjId=" + baseProjId + | |||||
"&isEffective=1&baseProjSysCode=" + baseProjSysCode; | |||||
RestTemplate restTemplate = new RestTemplate(); | |||||
log.info("url :{}", url); | |||||
ResponseEntity<String> forEntity = restTemplate.getForEntity(url, String.class); | |||||
log.info(JSON.toJSONString(forEntity)); | |||||
return forEntity.getBody(); | |||||
} | |||||
@ApiOperation(value = "项目详情推送", notes = "项目详情推送") | |||||
@GetMapping("/push-project-detail") | |||||
public String pushProjectDetail() throws NoSuchAlgorithmException { | |||||
Project project = projectService.getById(189L); | |||||
ProjectDTO projectDto = new ProjectDTO(); | |||||
projectDto.setProjectCode(project.getProjectCode()); | |||||
projectDto.setProjectName(project.getProjectName()); | |||||
projectDto.setArea(project.getArea()); | |||||
projectDto.setAreaCode(project.getAreaCode()); | |||||
projectDto.setBaseProjType("1"); | |||||
projectDto.setBaseConstructionType("03"); | |||||
projectDto.setBaseProjConsClass("C"); | |||||
projectDto.setBaseLowestLevel("C"); | |||||
projectDto.setProjectYear(project.getProjectYear()); | |||||
projectDto.setBaseProjBasis("1"); | |||||
projectDto.setBuildBasis("01"); | |||||
projectDto.setBaseProjSetProg("05"); | |||||
projectDto.setResponsibleMan(project.getResponsibleMan()); | |||||
projectDto.setResponsibleManMobile(project.getResponsibleManMobile()); | |||||
projectDto.setContactName(project.getContactName()); | |||||
projectDto.setContactPhone(project.getContactPhone()); | |||||
projectDto.setBuildOrgName(project.getBuildOrgName()); | |||||
projectDto.setBuildOrgCode(project.getBuildOrgCode()); | |||||
projectDto.setSuperOrg(project.getSuperOrg()); | |||||
projectDto.setSuperOrgCode(project.getSuperOrgCode()); | |||||
projectDto.setHigherSuperOrg(project.getHigherSuperOrg()); | |||||
projectDto.setHigherSuperOrgCode(project.getHigherSuperOrgCode()); | |||||
log.info("projectDto :{}", JSON.toJSONString(projectDto)); | |||||
if (StringUtils.isNotBlank(appIrsManage.pushProjectDetail(projectDto))) { | |||||
return "推送成功"; | |||||
} | |||||
return "推送失败"; | |||||
} | |||||
@ApiOperation(value = "转发IRS请求", notes = "转发IRS请求 用于") | |||||
@PostMapping("/forward") | |||||
public String forward(@Valid @RequestBody ForwardDTO dto) { | |||||
return irsManage.forward(dto); | |||||
} | |||||
public static Workbook readExcel(InputStream is, String extString) { | |||||
Workbook wb = null; | |||||
extString = extString.substring(extString.lastIndexOf(".")); | |||||
try { | |||||
if (".xls".equals(extString)) { | |||||
return new HSSFWorkbook(is); | |||||
} else if (".xlsx".equals(extString)) { | |||||
return new XSSFWorkbook(is); | |||||
} else { | |||||
return null; | |||||
} | |||||
} catch (IOException e) { | |||||
e.printStackTrace(); | |||||
} | |||||
return wb; | |||||
} | |||||
} | } |
@@ -1,446 +0,0 @@ | |||||
package com.hz.pm.api.ding.task; | |||||
import cn.hutool.core.collection.CollUtil; | |||||
import com.alibaba.fastjson.JSON; | |||||
import com.baomidou.mybatisplus.core.toolkit.StringUtils; | |||||
import com.baomidou.mybatisplus.core.toolkit.Wrappers; | |||||
import com.google.common.collect.Lists; | |||||
import com.hz.pm.api.common.model.constant.BizConst; | |||||
import com.hz.pm.api.ding.constants.DingOrganizationContant; | |||||
import com.hz.pm.api.organization.model.entity.DingEmployeeInfo; | |||||
import com.hz.pm.api.organization.model.entity.DingOrganization; | |||||
import com.hz.pm.api.organization.service.IDingEmployeeInfoService; | |||||
import com.hz.pm.api.organization.service.IDingOrganizationService; | |||||
import com.hz.pm.api.user.model.entity.UserInfo; | |||||
import com.hz.pm.api.user.service.IUserInfoService; | |||||
import com.ningdatech.basic.function.VUtils; | |||||
import com.ningdatech.basic.model.GenericResult; | |||||
import com.ningdatech.zwdd.ZwddIntegrationProperties; | |||||
import com.ningdatech.zwdd.client.ZwddAuthClient; | |||||
import com.ningdatech.zwdd.client.ZwddClient; | |||||
import com.ningdatech.zwdd.model.Page; | |||||
import com.ningdatech.zwdd.model.dto.EmployeeAccountIdDTO; | |||||
import com.ningdatech.zwdd.model.dto.EmployeeInfoDTO; | |||||
import com.ningdatech.zwdd.model.query.PageOrganizationEmployeePositionsQuery; | |||||
import com.ningdatech.zwdd.model.response.OrganizationEmployeePosition; | |||||
import com.ningdatech.zwdd.model.response.OrganizationEmployeePosition.GovEmployeePosition; | |||||
import lombok.RequiredArgsConstructor; | |||||
import lombok.extern.slf4j.Slf4j; | |||||
import org.springframework.beans.BeanUtils; | |||||
import org.springframework.stereotype.Component; | |||||
import org.springframework.transaction.annotation.Transactional; | |||||
import java.time.LocalDateTime; | |||||
import java.util.*; | |||||
import java.util.stream.Collectors; | |||||
/** | |||||
* @author liuxinxin | |||||
* @date 2023/2/10 上午9:52 | |||||
*/ | |||||
@Slf4j | |||||
@Component | |||||
@RequiredArgsConstructor | |||||
public class EmployeeBatchGetTask { | |||||
private static final int PAGE_SIZE = 20; | |||||
private static final int GROUP_SIZE = 100; | |||||
private static final long MAX_SIZE = 10000; | |||||
//================================================================================================================== | |||||
private final ZwddClient zwddClient; | |||||
private final ZwddAuthClient zwddAuthClient; | |||||
private final IDingOrganizationService dingOrganizationService; | |||||
private final IDingEmployeeInfoService dingEmployeeInfoService; | |||||
private final ZwddIntegrationProperties zwddIntegrationProperties; | |||||
private final IUserInfoService userInfoService; | |||||
//================================================================================================================== | |||||
@Transactional(rollbackFor = Exception.class) | |||||
// @Scheduled(cron = "0 0 1 * * ?") | |||||
public void batchGetEmployeeTask() { | |||||
// 获取所有的组织列表用户获取组织下的 用户信息(暂时只查单位的类型) | |||||
List<DingOrganization> dingOrganizationList = dingOrganizationService.list( | |||||
Wrappers.lambdaQuery(DingOrganization.class) | |||||
.eq(DingOrganization::getTypeCode, DingOrganizationContant.UNIT_TYPE)); | |||||
log.info("所有待更新员工的单位数:{}", dingOrganizationList.size()); | |||||
if (CollUtil.isNotEmpty(dingOrganizationList)) { | |||||
//记录任务 单位数 | |||||
Integer index = 0; | |||||
for (DingOrganization dingOrg : dingOrganizationList) { | |||||
log.info("当前单位:{},下标数,{}", dingOrg.getOrganizationName(), index); | |||||
index++; | |||||
List<OrganizationEmployeePosition> allOrganizationEmployeePositionList = new ArrayList<>(); | |||||
String organizationCode = dingOrg.getOrganizationCode(); | |||||
PageOrganizationEmployeePositionsQuery query = new PageOrganizationEmployeePositionsQuery(); | |||||
query.setEmployeeStatus("A"); | |||||
query.setOrganizationCode(organizationCode); | |||||
query.setReturnTotalSize(true); | |||||
query.setTenantId(zwddIntegrationProperties.getTenantId()); | |||||
int pageNo = 1; | |||||
query.setPageNo(pageNo); | |||||
query.setPageSize(PAGE_SIZE); | |||||
// 查询组织下 用户信息 | |||||
GenericResult<Page<OrganizationEmployeePosition>> firstPageGenericResult = zwddClient.pageOrganizationEmployeePositions(query); | |||||
Page<OrganizationEmployeePosition> data = firstPageGenericResult.getData(); | |||||
if (Objects.isNull(data)) { | |||||
log.info("响应为空:{}", organizationCode); | |||||
continue; | |||||
} | |||||
if (CollUtil.isNotEmpty(data.getData())) { | |||||
allOrganizationEmployeePositionList.addAll(data.getData()); | |||||
} | |||||
Long totalSize = data.getTotalSize(); | |||||
log.info("dingOrg :{}", JSON.toJSONString(dingOrg)); | |||||
log.info("totalSize :{},{}", totalSize, dingOrg.getOrganizationName()); | |||||
if (totalSize > PAGE_SIZE) { | |||||
if (totalSize > MAX_SIZE) { | |||||
//超过1万 按1万的处理 | |||||
totalSize = MAX_SIZE; | |||||
} | |||||
int restPageNo = totalSize % PAGE_SIZE > 0 ? 1 : 0; | |||||
int maxPageNo = (int) Math.ceil(totalSize / PAGE_SIZE) + restPageNo; | |||||
for (pageNo = 2; pageNo <= maxPageNo; pageNo++) { | |||||
query.setPageNo(pageNo); | |||||
GenericResult<Page<OrganizationEmployeePosition>> pageGenericResult = zwddClient.pageOrganizationEmployeePositions(query); | |||||
if (pageGenericResult.isSuccess()) { | |||||
allOrganizationEmployeePositionList.addAll(pageGenericResult.getData().getData()); | |||||
} else { | |||||
log.error(pageGenericResult.getMsg()); | |||||
} | |||||
} | |||||
} | |||||
// 批量查询 成员的accountId | |||||
List<DingEmployeeInfo> dingEmployeeInfoSaveRecordList = new ArrayList<>(); | |||||
if (allOrganizationEmployeePositionList.size() <= GROUP_SIZE) { | |||||
log.info("assemblerAccountId :{}", allOrganizationEmployeePositionList.size()); | |||||
assemblerAccountId(allOrganizationEmployeePositionList, dingEmployeeInfoSaveRecordList); | |||||
} else { | |||||
log.info("assemblerAccountId :{}", allOrganizationEmployeePositionList.size()); | |||||
List<List<OrganizationEmployeePosition>> split = Lists.partition(allOrganizationEmployeePositionList, GROUP_SIZE); | |||||
for (List<OrganizationEmployeePosition> segment : split) { | |||||
assemblerAccountId(segment, dingEmployeeInfoSaveRecordList); | |||||
} | |||||
} | |||||
// 批量保存用户信息 | |||||
saveBatch(dingEmployeeInfoSaveRecordList); | |||||
} | |||||
} | |||||
} | |||||
private void assemblerAccountId(List<OrganizationEmployeePosition> segment, List<DingEmployeeInfo> dingEmployeeInfoSaveRecordList) { | |||||
List<String> employeeCodes = segment.stream().map(OrganizationEmployeePosition::getEmployeeCode).distinct().collect(Collectors.toList()); | |||||
GenericResult<List<EmployeeAccountIdDTO>> listGenericResult = zwddClient.listEmployeeAccountIds(employeeCodes); | |||||
List<EmployeeAccountIdDTO> employeeAccountIdDTOList = listGenericResult.getData(); | |||||
if (CollUtil.isNotEmpty(employeeAccountIdDTOList)) { | |||||
Map<String, Long> employeeCodeAccountIdMap = employeeAccountIdDTOList.stream().filter(Objects::nonNull) | |||||
.collect(Collectors.toMap(EmployeeAccountIdDTO::getEmployeeCode, EmployeeAccountIdDTO::getAccountId)); | |||||
List<DingEmployeeInfo> dingEmployeeInfos = buildDingEmployeeInfoRecordList(segment); | |||||
dingEmployeeInfos = dingEmployeeInfos.stream().map(r -> { | |||||
r.setAccountId(employeeCodeAccountIdMap.get(r.getEmployeeCode())); | |||||
return r; | |||||
}).collect(Collectors.toList()); | |||||
dingEmployeeInfoSaveRecordList.addAll(dingEmployeeInfos); | |||||
} | |||||
} | |||||
private List<DingEmployeeInfo> buildDingEmployeeInfoRecordList(List<OrganizationEmployeePosition> allOrganizationEmployeePositionList) { | |||||
List<DingEmployeeInfo> saveRecordList = new ArrayList<>(); | |||||
for (OrganizationEmployeePosition organizationEmployeePosition : allOrganizationEmployeePositionList) { | |||||
List<GovEmployeePosition> govEmployeePositions = organizationEmployeePosition.getGovEmployeePositions(); | |||||
if (CollUtil.isNotEmpty(govEmployeePositions)) { | |||||
List<DingEmployeeInfo> segmentSaveRecordList = new ArrayList<>(); | |||||
for (GovEmployeePosition govEmployeePosition : govEmployeePositions) { | |||||
DingEmployeeInfo dingEmployeeInfo = new DingEmployeeInfo(); | |||||
BeanUtils.copyProperties(organizationEmployeePosition, dingEmployeeInfo); | |||||
dingEmployeeInfo.setMainJob(govEmployeePosition.getMainJob()); | |||||
dingEmployeeInfo.setEmpPosUnitCode(govEmployeePosition.getEmpPosUnitCode()); | |||||
dingEmployeeInfo.setEmpPosEmployeeRoleCode(govEmployeePosition.getEmpPosEmployeeRoleCode()); | |||||
dingEmployeeInfo.setEmpPosInnerInstitutionCode(govEmployeePosition.getEmpPosInnerInstitutionCode()); | |||||
dingEmployeeInfo.setEmployeeCode(govEmployeePosition.getEmployeeCode()); | |||||
dingEmployeeInfo.setJobAttributesCode(govEmployeePosition.getJobAttributesCode()); | |||||
dingEmployeeInfo.setOrganizationCode(govEmployeePosition.getOrganizationCode()); | |||||
dingEmployeeInfo.setEmpPosVirtualOrganizationCode(govEmployeePosition.getEmpPosVirtualOrganizationCode()); | |||||
dingEmployeeInfo.setEmpStatus(govEmployeePosition.getStatus()); | |||||
dingEmployeeInfo.setCreateOn(LocalDateTime.now()); | |||||
dingEmployeeInfo.setUpdateOn(LocalDateTime.now()); | |||||
dingEmployeeInfo.setCreateBy(-1L); | |||||
dingEmployeeInfo.setUpdateBy(-1L); | |||||
segmentSaveRecordList.add(dingEmployeeInfo); | |||||
} | |||||
saveRecordList.addAll(segmentSaveRecordList); | |||||
} else { | |||||
DingEmployeeInfo dingEmployeeInfo = new DingEmployeeInfo(); | |||||
BeanUtils.copyProperties(organizationEmployeePosition, dingEmployeeInfo); | |||||
saveRecordList.add(dingEmployeeInfo); | |||||
} | |||||
} | |||||
return saveRecordList; | |||||
} | |||||
private void saveBatch(List<DingEmployeeInfo> dingEmployeeInfoSaveRecordList) { | |||||
dingEmployeeInfoSaveRecordList = dingEmployeeInfoSaveRecordList.stream() | |||||
.filter(r -> "true".equals(r.getMainJob()) | |||||
&& "A".equals(r.getEmpStatus()) | |||||
&& StringUtils.isNotBlank(r.getEmpPosUnitCode()) | |||||
&& StringUtils.isNotBlank(r.getEmployeeCode()) | |||||
).collect(Collectors.toList()); | |||||
Set<String> uniqueKeySet = new HashSet<String>(); | |||||
List<DingEmployeeInfo> saveList = new ArrayList<>(); | |||||
for (DingEmployeeInfo dingEmployeeInfo : dingEmployeeInfoSaveRecordList) { | |||||
if (uniqueKeySet.add(dingEmployeeInfo.getEmployeeCode() + dingEmployeeInfo.getEmpPosUnitCode())) { | |||||
saveList.add(dingEmployeeInfo); | |||||
} | |||||
} | |||||
List<DingOrganization> organizations = dingOrganizationService.list(); | |||||
Map<String, DingOrganization> organizationMap = organizations.stream().collect(Collectors.toMap(DingOrganization::getOrganizationCode, o -> o)); | |||||
for (DingEmployeeInfo dingEmployeeInfo : saveList) { | |||||
String employeeCode = dingEmployeeInfo.getEmployeeCode(); | |||||
DingEmployeeInfo employeeInfo = dingEmployeeInfoService.getOne(Wrappers.lambdaQuery(DingEmployeeInfo.class) | |||||
.eq(DingEmployeeInfo::getEmployeeCode, employeeCode) | |||||
.last(BizConst.LIMIT_1)); | |||||
if (Objects.isNull(employeeInfo)) { | |||||
dingEmployeeInfoService.save(dingEmployeeInfo); | |||||
} else { | |||||
dingEmployeeInfo.setId(employeeInfo.getId()); | |||||
dingEmployeeInfoService.saveOrUpdate(dingEmployeeInfo); | |||||
} | |||||
} | |||||
} | |||||
/** | |||||
* 按区域 来更新员工 | |||||
* | |||||
* @param regionCode | |||||
*/ | |||||
public void batchGetEmployeeTaskByRegionCode(String regionCode) { | |||||
List<DingOrganization> units = dingOrganizationService.list(Wrappers.lambdaQuery(DingOrganization.class) | |||||
.eq(DingOrganization::getTypeCode, DingOrganizationContant.UNIT_TYPE) | |||||
.eq(DingOrganization::getDivisionCode, regionCode)); | |||||
log.info("所有地区 {} 待更新员工的单位数:{}", regionCode, units.size()); | |||||
if (CollUtil.isNotEmpty(units)) { | |||||
//记录任务 单位数 | |||||
Integer index = 0; | |||||
for (DingOrganization dingOrganization : units) { | |||||
log.info("当前单位:{},下标数,{}", dingOrganization.getOrganizationName(), index); | |||||
index++; | |||||
List<OrganizationEmployeePosition> allOrganizationEmployeePositionList = new ArrayList<>(); | |||||
String organizationCode = dingOrganization.getOrganizationCode(); | |||||
PageOrganizationEmployeePositionsQuery query = new PageOrganizationEmployeePositionsQuery(); | |||||
query.setEmployeeStatus("A"); | |||||
query.setOrganizationCode(organizationCode); | |||||
query.setReturnTotalSize(true); | |||||
query.setTenantId(zwddIntegrationProperties.getTenantId()); | |||||
int pageNo = 1; | |||||
query.setPageNo(pageNo); | |||||
query.setPageSize(PAGE_SIZE); | |||||
// 查询组织下 用户信息 | |||||
GenericResult<Page<OrganizationEmployeePosition>> firstPageGenericResult = zwddClient.pageOrganizationEmployeePositions(query); | |||||
Page<OrganizationEmployeePosition> data = firstPageGenericResult.getData(); | |||||
if (Objects.isNull(data)) { | |||||
log.info("响应为空:{}", organizationCode); | |||||
continue; | |||||
} | |||||
if (CollUtil.isNotEmpty(data.getData())) { | |||||
allOrganizationEmployeePositionList.addAll(data.getData()); | |||||
} | |||||
Long totalSize = data.getTotalSize(); | |||||
log.info("dingOrganization :{}", JSON.toJSONString(dingOrganization)); | |||||
log.info("totalSize :{},{}", totalSize, dingOrganization.getOrganizationName()); | |||||
if (totalSize > PAGE_SIZE) { | |||||
if (totalSize > MAX_SIZE) { | |||||
//超过1万 按1万的处理 | |||||
totalSize = MAX_SIZE; | |||||
} | |||||
int restPageNo = totalSize % PAGE_SIZE > 0 ? 1 : 0; | |||||
int maxPageNo = (int) Math.ceil(totalSize / PAGE_SIZE) + restPageNo; | |||||
for (pageNo = 2; pageNo <= maxPageNo; pageNo++) { | |||||
query.setPageNo(pageNo); | |||||
GenericResult<Page<OrganizationEmployeePosition>> pageGenericResult = zwddClient.pageOrganizationEmployeePositions(query); | |||||
if (pageGenericResult.isSuccess()) { | |||||
allOrganizationEmployeePositionList.addAll(pageGenericResult.getData().getData()); | |||||
} else { | |||||
log.error(pageGenericResult.getMsg()); | |||||
} | |||||
} | |||||
} | |||||
// 批量查询 成员的accountId | |||||
List<DingEmployeeInfo> dingEmployeeInfoSaveRecordList = new ArrayList<>(); | |||||
if (allOrganizationEmployeePositionList.size() <= GROUP_SIZE) { | |||||
log.info("assemblerAccountId :{}", allOrganizationEmployeePositionList.size()); | |||||
assemblerAccountId(allOrganizationEmployeePositionList, dingEmployeeInfoSaveRecordList); | |||||
} else { | |||||
log.info("assemblerAccountId :{}", allOrganizationEmployeePositionList.size()); | |||||
List<List<OrganizationEmployeePosition>> split = Lists.partition(allOrganizationEmployeePositionList, GROUP_SIZE); | |||||
for (List<OrganizationEmployeePosition> segment : split) { | |||||
assemblerAccountId(segment, dingEmployeeInfoSaveRecordList); | |||||
} | |||||
} | |||||
// 批量保存用户信息 | |||||
saveBatch(dingEmployeeInfoSaveRecordList); | |||||
} | |||||
log.info("员工同步完成"); | |||||
} | |||||
} | |||||
public void batchGetEmployeeTaskByOrdCode(String orgCode) { | |||||
DingOrganization org = dingOrganizationService.getOne(Wrappers.lambdaQuery(DingOrganization.class) | |||||
.eq(DingOrganization::getOrganizationCode, orgCode) | |||||
.last(BizConst.LIMIT_1)); | |||||
VUtils.isTrue(Objects.isNull(org)).throwMessage("单位不存在"); | |||||
log.info("所属单位 {} 要更新员工信息了", org.getOrganizationName()); | |||||
List<OrganizationEmployeePosition> allOrganizationEmployeePositionList = new ArrayList<>(); | |||||
PageOrganizationEmployeePositionsQuery query = new PageOrganizationEmployeePositionsQuery(); | |||||
query.setEmployeeStatus("A"); | |||||
query.setOrganizationCode(orgCode); | |||||
query.setReturnTotalSize(true); | |||||
query.setTenantId(zwddIntegrationProperties.getTenantId()); | |||||
int pageNo = 1; | |||||
query.setPageNo(pageNo); | |||||
query.setPageSize(PAGE_SIZE); | |||||
// 查询组织下 用户信息 | |||||
GenericResult<Page<OrganizationEmployeePosition>> firstPageGenericResult = zwddClient.pageOrganizationEmployeePositions(query); | |||||
Page<OrganizationEmployeePosition> data = firstPageGenericResult.getData(); | |||||
if (Objects.isNull(data)) { | |||||
log.info("响应为空:{}", orgCode); | |||||
return; | |||||
} | |||||
if (CollUtil.isNotEmpty(data.getData())) { | |||||
allOrganizationEmployeePositionList.addAll(data.getData()); | |||||
} | |||||
Long totalSize = data.getTotalSize(); | |||||
log.info("dingOrganization :{}", JSON.toJSONString(org)); | |||||
log.info("totalSize :{},{}", totalSize, org.getOrganizationName()); | |||||
if (totalSize > PAGE_SIZE) { | |||||
if (totalSize > MAX_SIZE) { | |||||
//超过1万 按1万的处理 | |||||
totalSize = MAX_SIZE; | |||||
} | |||||
int restPageNo = totalSize % PAGE_SIZE > 0 ? 1 : 0; | |||||
int maxPageNo = (int) Math.ceil(totalSize / PAGE_SIZE) + restPageNo; | |||||
for (pageNo = 2; pageNo <= maxPageNo; pageNo++) { | |||||
query.setPageNo(pageNo); | |||||
GenericResult<Page<OrganizationEmployeePosition>> pageGenericResult = zwddClient.pageOrganizationEmployeePositions(query); | |||||
// log.info("pageGenericResult :{}", JSON.toJSONString(pageGenericResult)); | |||||
if (pageGenericResult.isSuccess()) { | |||||
allOrganizationEmployeePositionList.addAll(pageGenericResult.getData().getData()); | |||||
} else { | |||||
log.error(pageGenericResult.getMsg()); | |||||
} | |||||
} | |||||
} | |||||
// 批量查询 成员的accountId | |||||
List<DingEmployeeInfo> dingEmployeeInfoSaveRecordList = new ArrayList<>(); | |||||
if (allOrganizationEmployeePositionList.size() <= GROUP_SIZE) { | |||||
log.info("assemblerAccountId :{}", allOrganizationEmployeePositionList.size()); | |||||
assemblerAccountId(allOrganizationEmployeePositionList, dingEmployeeInfoSaveRecordList); | |||||
} else { | |||||
log.info("assemblerAccountId :{}", allOrganizationEmployeePositionList.size()); | |||||
List<List<OrganizationEmployeePosition>> split = Lists.partition(allOrganizationEmployeePositionList, GROUP_SIZE); | |||||
for (List<OrganizationEmployeePosition> segment : split) { | |||||
assemblerAccountId(segment, dingEmployeeInfoSaveRecordList); | |||||
} | |||||
} | |||||
// 批量保存用户信息 | |||||
saveBatch(dingEmployeeInfoSaveRecordList); | |||||
log.info("员工同步完成"); | |||||
} | |||||
/** | |||||
* 更新员工信息 主要是头像 | |||||
* | |||||
* @param empCode | |||||
*/ | |||||
public void getEmployeeByCode(String empCode) { | |||||
GenericResult<EmployeeInfoDTO> result = zwddClient.getEmployeeByCode(empCode); | |||||
log.error("请求员工信息 result:{}", JSON.toJSONString(result)); | |||||
if (!result.isSuccess()) { | |||||
log.error("请求员工信息失败 :{},mesg:{}", empCode, result.getMsg()); | |||||
return; | |||||
} | |||||
EmployeeInfoDTO data = result.getData(); | |||||
if (Objects.isNull(data)) { | |||||
log.error("请求员工信息失败 返回为空"); | |||||
return; | |||||
} | |||||
DingEmployeeInfo emp = dingEmployeeInfoService.getOne(Wrappers.lambdaQuery(DingEmployeeInfo.class) | |||||
.eq(DingEmployeeInfo::getEmployeeCode, empCode) | |||||
.last(BizConst.LIMIT_1)); | |||||
if (Objects.nonNull(emp)) { | |||||
emp.setAvatar(data.getGovEmpAvatar()); | |||||
dingEmployeeInfoService.updateById(emp); | |||||
} | |||||
UserInfo user = userInfoService.getOne(Wrappers.lambdaQuery(UserInfo.class) | |||||
.eq(UserInfo::getEmployeeCode, empCode) | |||||
.last(BizConst.LIMIT_1)); | |||||
if (Objects.nonNull(user)) { | |||||
user.setAvatar(data.getGovEmpAvatar()); | |||||
userInfoService.updateById(user); | |||||
} | |||||
} | |||||
/** | |||||
* 更新一整个单位的 | |||||
* | |||||
* @param orgCode | |||||
*/ | |||||
public void getBatchEmployeeByCode(String orgCode) { | |||||
List<DingEmployeeInfo> employees = dingEmployeeInfoService.list(Wrappers.lambdaQuery(DingEmployeeInfo.class) | |||||
.eq(DingEmployeeInfo::getEmpPosUnitCode, orgCode)); | |||||
for (DingEmployeeInfo employee : employees) { | |||||
getEmployeeByCode(employee.getEmployeeCode()); | |||||
} | |||||
} | |||||
/** | |||||
* 获取token | |||||
*/ | |||||
public String getToken() { | |||||
GenericResult<String> accessToken = zwddClient.getAccessToken(); | |||||
return accessToken.getData(); | |||||
} | |||||
public String getAuthToken() { | |||||
GenericResult<String> accessToken = zwddAuthClient.getAccessToken(); | |||||
return accessToken.getData(); | |||||
} | |||||
} |
@@ -35,7 +35,6 @@ public class GovBusinessStripsTask { | |||||
private final IGovBusinessStripService iGovBusinessStripService; | private final IGovBusinessStripService iGovBusinessStripService; | ||||
@Transactional(rollbackFor = Exception.class) | @Transactional(rollbackFor = Exception.class) | ||||
// @Scheduled(cron = "0 0 1 * * ?") | |||||
public void batchGetGovBusinessStripsTask() { | public void batchGetGovBusinessStripsTask() { | ||||
PageSubGovBusinessStripsQuery pageSubGovBusinessStripsQuery = new PageSubGovBusinessStripsQuery(); | PageSubGovBusinessStripsQuery pageSubGovBusinessStripsQuery = new PageSubGovBusinessStripsQuery(); | ||||
pageSubGovBusinessStripsQuery.setPageNo(1); | pageSubGovBusinessStripsQuery.setPageNo(1); | ||||
@@ -1,256 +0,0 @@ | |||||
package com.hz.pm.api.ding.task; | |||||
import cn.hutool.core.collection.CollUtil; | |||||
import com.alibaba.fastjson.JSON; | |||||
import com.alibaba.fastjson.JSONObject; | |||||
import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; | |||||
import com.baomidou.mybatisplus.core.toolkit.Wrappers; | |||||
import com.google.common.collect.Lists; | |||||
import com.ningdatech.basic.model.GenericResult; | |||||
import com.hz.pm.api.common.model.constant.BizConst; | |||||
import com.hz.pm.api.ding.model.DingOrgInfoTreeDTO; | |||||
import com.hz.pm.api.organization.model.entity.DingOrganization; | |||||
import com.hz.pm.api.organization.service.IDingOrganizationService; | |||||
import com.ningdatech.zwdd.client.ZwddClient; | |||||
import com.ningdatech.zwdd.model.dto.DingOrgInfoDTO; | |||||
import com.ningdatech.zwdd.model.dto.DingScopesV2DTO; | |||||
import com.ningdatech.zwdd.model.dto.PageSubOrganizationCodeDTO; | |||||
import lombok.extern.slf4j.Slf4j; | |||||
import org.springframework.beans.factory.annotation.Autowired; | |||||
import org.springframework.stereotype.Component; | |||||
import org.springframework.transaction.annotation.Transactional; | |||||
import java.time.LocalDateTime; | |||||
import java.util.ArrayList; | |||||
import java.util.List; | |||||
import java.util.Objects; | |||||
import java.util.stream.Collectors; | |||||
/** | |||||
* @author liuxinxin | |||||
* @date 2023/2/7 上午10:15 | |||||
*/ | |||||
@Slf4j | |||||
@Component | |||||
public class OrganizationBatchGetTask { | |||||
@Autowired | |||||
private ZwddClient zwddClient; | |||||
private static final Integer GROUP_SIZE = 100; | |||||
@Autowired | |||||
private IDingOrganizationService iDingOrganizationService; | |||||
@Autowired | |||||
private EmployeeBatchGetTask employeeBatchGetTask; | |||||
/** | |||||
* 获取浙政钉组织架构 | |||||
*/ | |||||
@Transactional(rollbackFor = Exception.class) | |||||
// @Scheduled(cron = "0 0 1 * * ?") | |||||
public void batchGetOrganizationTask() { | |||||
// List<DingOrganization> allList = iDingOrganizationService.list(); | |||||
// List<String> currentAllOrganizationCodeList = allList.stream().map(DingOrganization::getOrganizationCode).collect(Collectors.toList()); | |||||
// 全量删除 | |||||
iDingOrganizationService.remove(Wrappers.lambdaQuery(DingOrganization.class).isNotNull(DingOrganization::getId)); | |||||
// 获取顶级组织code | |||||
GenericResult<DingScopesV2DTO> scopesV2Result = zwddClient.getScopesV2(); | |||||
DingScopesV2DTO scopesV2 = scopesV2Result.getData(); | |||||
if (Objects.nonNull(scopesV2)) { | |||||
// 顶级组织code | |||||
List<String> deptVisibleScopes = scopesV2.getDeptVisibleScopes(); | |||||
log.info("顶级组织code: size = " + deptVisibleScopes.size() + "列表:" + JSONObject.toJSONString(deptVisibleScopes)); | |||||
// 获取顶级节点信息 | |||||
GenericResult<List<DingOrgInfoDTO>> listGenericResult = zwddClient.listOrganizationsByCodes(deptVisibleScopes); | |||||
log.info("listGenericResult: {}" + JSON.toJSONString(listGenericResult)); | |||||
List<DingOrgInfoDTO> dingOrgInfoDtos = listGenericResult.getData(); | |||||
for (String orgCode : deptVisibleScopes) { | |||||
// if (currentAllOrganizationCodeList.contains(orgCode)) { | |||||
// log.info("已存在组织架构---{}", orgCode); | |||||
// continue; | |||||
// } | |||||
List<DingOrgInfoTreeDTO> treeDTOList = new ArrayList<>(); | |||||
DingOrgInfoTreeDTO childDingOrgInfoTreeDTO = new DingOrgInfoTreeDTO(); | |||||
//设置节点详情 | |||||
if (dingOrgInfoDtos != null && !dingOrgInfoDtos.isEmpty()) { | |||||
for (DingOrgInfoDTO orgInfo : dingOrgInfoDtos) { | |||||
if (orgInfo.getOrganizationCode().equals(orgCode)) { | |||||
childDingOrgInfoTreeDTO.setDingOrgInfoDTO(orgInfo); | |||||
} | |||||
} | |||||
} | |||||
childDingOrgInfoTreeDTO.setCode(orgCode); | |||||
childDingOrgInfoTreeDTO.setChildCodes(new ArrayList<>()); | |||||
getDingOrgChild(childDingOrgInfoTreeDTO); | |||||
treeDTOList.add(childDingOrgInfoTreeDTO); | |||||
if (CollectionUtils.isNotEmpty(treeDTOList)) { | |||||
List<DingOrganization> saveRecordList = new ArrayList<>(); | |||||
buildSaveRecordList(treeDTOList, saveRecordList); | |||||
// 批量保存 | |||||
if (saveRecordList.size() <= GROUP_SIZE) { | |||||
iDingOrganizationService.saveBatch(saveRecordList); | |||||
} else { | |||||
List<List<DingOrganization>> split = Lists.partition(saveRecordList, GROUP_SIZE); | |||||
for (List<DingOrganization> segment : split) { | |||||
iDingOrganizationService.saveBatch(segment); | |||||
} | |||||
} | |||||
} | |||||
log.info("----拉取浙政钉组织结构结束---,顶级code:" + orgCode); | |||||
} | |||||
} | |||||
} | |||||
/** | |||||
* 更新 其 子单位 | |||||
* @param orgCode | |||||
*/ | |||||
public void organizationGetSubs(String orgCode) { | |||||
log.info("----拉取浙政钉组织子单位开始---,顶级code:" + orgCode); | |||||
DingOrganization topOrg = iDingOrganizationService.getOne(Wrappers.lambdaQuery(DingOrganization.class) | |||||
.eq(DingOrganization::getOrganizationCode, orgCode) | |||||
.last(BizConst.LIMIT_1)); | |||||
// 顶级组织code | |||||
GenericResult<PageSubOrganizationCodeDTO> subOrganizationResult = zwddClient.pageSubOrganizationCodes(1, 100, orgCode); | |||||
log.info("subOrganizationResult: {}" + JSON.toJSONString(subOrganizationResult)); | |||||
PageSubOrganizationCodeDTO data = subOrganizationResult.getData(); | |||||
List<String> subOrganizationCodeList = data.getSubOrganizationCodeList(); | |||||
if(Objects.isNull(subOrganizationCodeList)){ | |||||
log.info("subOrganizationCodeList为null"); | |||||
return; | |||||
} | |||||
employeeBatchGetTask.batchGetEmployeeTaskByOrdCode(orgCode); | |||||
for(String subOrganizationCode : subOrganizationCodeList){ | |||||
GenericResult<DingOrgInfoDTO> organizationByCode = zwddClient.getOrganizationByCode(subOrganizationCode); | |||||
DingOrgInfoDTO dingOrgInfo = organizationByCode.getData(); | |||||
DingOrganization old = iDingOrganizationService.getOne(Wrappers.lambdaQuery(DingOrganization.class) | |||||
.eq(DingOrganization::getOrganizationCode, dingOrgInfo.getOrganizationCode()) | |||||
.last(BizConst.LIMIT_1)); | |||||
if(Objects.nonNull(old)){ | |||||
log.info("该单位已经存在 :{}",old.getOrganizationName()); | |||||
organizationGetSubs(dingOrgInfo.getOrganizationCode()); | |||||
// employeeBatchGetTask.batchGetEmployeeTaskByOrdCode(dingOrgInfo.getOrganizationCode()); | |||||
continue; | |||||
} | |||||
DingOrganization organization = new DingOrganization(); | |||||
organization.setOrganizationCode(dingOrgInfo.getOrganizationCode()); | |||||
organization.setOrganizationName(dingOrgInfo.getOrganizationName()); | |||||
//和顶级单位一个区域 | |||||
organization.setDivisionCode(topOrg.getDivisionCode()); | |||||
organization.setParentCode(dingOrgInfo.getParentCode()); | |||||
organization.setTypeName(dingOrgInfo.getTypeName()); | |||||
organization.setAddress(dingOrgInfo.getAddress()); | |||||
organization.setBusinessStripCodes(dingOrgInfo.getBusinessStripCodes()); | |||||
organization.setDisplayOrder(dingOrgInfo.getDisplayOrder()); | |||||
organization.setGmtCreate(LocalDateTime.now()); | |||||
organization.setInstitutionLevelCode(dingOrgInfo.getInstitutionLevelCode()); | |||||
organization.setParentName(dingOrgInfo.getParentName()); | |||||
if(iDingOrganizationService.save(organization)){ | |||||
organizationGetSubs(organization.getOrganizationCode()); | |||||
// employeeBatchGetTask.batchGetEmployeeTaskByOrdCode(organization.getOrganizationCode()); | |||||
} | |||||
} | |||||
log.info("----拉取浙政钉组织子单位结束---,顶级code:" + orgCode); | |||||
} | |||||
/** | |||||
* 查看下 当前的子单位信息 | |||||
* @param orgCode | |||||
*/ | |||||
public void organizationSubGetOrgs(String orgCode) { | |||||
// 顶级组织code | |||||
GenericResult<PageSubOrganizationCodeDTO> subOrganizationResult = zwddClient.pageSubOrganizationCodes(1, 100, orgCode); | |||||
log.info("subOrganizationResult: {}" + JSON.toJSONString(subOrganizationResult)); | |||||
PageSubOrganizationCodeDTO data = subOrganizationResult.getData(); | |||||
List<String> subOrganizationCodeList = data.getSubOrganizationCodeList(); | |||||
if(Objects.isNull(subOrganizationCodeList)){ | |||||
log.info("subOrganizationCodeList为null"); | |||||
return; | |||||
} | |||||
for(String subOrganizationCode : subOrganizationCodeList){ | |||||
GenericResult<DingOrgInfoDTO> organizationByCode = zwddClient.getOrganizationByCode(subOrganizationCode); | |||||
DingOrgInfoDTO dingOrgInfo = organizationByCode.getData(); | |||||
log.info("dingOrgInfo :{}",JSON.toJSONString(dingOrgInfo)); | |||||
} | |||||
} | |||||
private void buildSaveRecordList(List<DingOrgInfoTreeDTO> treeDTOList, List<DingOrganization> saveRecordList) { | |||||
if (CollectionUtils.isEmpty(treeDTOList)) { | |||||
return; | |||||
} | |||||
for (DingOrgInfoTreeDTO dingOrgInfoTreeDTO : treeDTOList) { | |||||
DingOrganization saveRecord = new DingOrganization(); | |||||
DingOrgInfoDTO dingOrgInfoDTO = dingOrgInfoTreeDTO.getDingOrgInfoDTO(); | |||||
List<DingOrgInfoTreeDTO> childCodes = dingOrgInfoTreeDTO.getChildCodes(); | |||||
saveRecord.setDisplayOrder(dingOrgInfoDTO.getDisplayOrder()); | |||||
// saveRecord.setEnabled("1"); | |||||
saveRecord.setParentCode(dingOrgInfoDTO.getParentCode()); | |||||
saveRecord.setTypeCode(dingOrgInfoDTO.getTypeCode()); | |||||
saveRecord.setTypeName(dingOrgInfoDTO.getTypeName()); | |||||
saveRecord.setOrganizationCode(dingOrgInfoDTO.getOrganizationCode()); | |||||
// saveRecord.setSubCount((long) dingOrgInfoTreeDTO.getChildCodes().size()); | |||||
saveRecord.setOrganizationName(dingOrgInfoDTO.getOrganizationName()); | |||||
saveRecord.setDivisionCode(dingOrgInfoDTO.getDivisionCode()); | |||||
saveRecordList.add(saveRecord); | |||||
if (CollectionUtils.isNotEmpty(childCodes)) { | |||||
buildSaveRecordList(childCodes, saveRecordList); | |||||
} | |||||
} | |||||
} | |||||
private void getDingOrgChild(DingOrgInfoTreeDTO parentDingOrgInfoTreeDTO) { | |||||
String parentOrgCode = parentDingOrgInfoTreeDTO.getCode(); | |||||
DingOrgInfoDTO orgInfoDTO = parentDingOrgInfoTreeDTO.getDingOrgInfoDTO(); | |||||
boolean leaf = orgInfoDTO.getLeaf(); | |||||
if (!leaf) { | |||||
int currentPage = 1; | |||||
int pageSize = 100; | |||||
GenericResult<PageSubOrganizationCodeDTO> pageSubOrganizationCodeDTOGenericResult = zwddClient.pageSubOrganizationCodes(currentPage++, pageSize, parentOrgCode); | |||||
PageSubOrganizationCodeDTO pageSubOrganizationCodeDTO = pageSubOrganizationCodeDTOGenericResult.getData(); | |||||
if (CollUtil.isNotEmpty(pageSubOrganizationCodeDTO.getSubOrganizationCodeList())) { | |||||
List<String> subOrganizationCodeList = new ArrayList<>(pageSubOrganizationCodeDTO.getSubOrganizationCodeList()); | |||||
Long totalSize = pageSubOrganizationCodeDTO.getTotalSize(); | |||||
while (totalSize > (long) currentPage * pageSize) { | |||||
GenericResult<PageSubOrganizationCodeDTO> subPageSubOrganizationCodeDTOGenericResult = zwddClient | |||||
.pageSubOrganizationCodes(currentPage++, pageSize, parentOrgCode); | |||||
PageSubOrganizationCodeDTO subOrganizationCodeDTO = subPageSubOrganizationCodeDTOGenericResult.getData(); | |||||
if (CollectionUtils.isNotEmpty(subOrganizationCodeDTO.getSubOrganizationCodeList())) { | |||||
subOrganizationCodeList.addAll(subOrganizationCodeDTO.getSubOrganizationCodeList()); | |||||
} | |||||
} | |||||
if (CollectionUtils.isNotEmpty(subOrganizationCodeList)) { | |||||
GenericResult<List<DingOrgInfoDTO>> listGenericResult = zwddClient | |||||
.listOrganizationsByCodes(subOrganizationCodeList); | |||||
List<DingOrgInfoDTO> dingOrgInfoDtos = listGenericResult.getData(); | |||||
List<DingOrgInfoTreeDTO> dingOrgInfoTreeDTOList = dingOrgInfoDtos.stream().map(r -> { | |||||
DingOrgInfoTreeDTO dingOrgInfoTreeDTO = new DingOrgInfoTreeDTO(); | |||||
dingOrgInfoTreeDTO.setCode(r.getOrganizationCode()); | |||||
dingOrgInfoTreeDTO.setDingOrgInfoDTO(r); | |||||
dingOrgInfoTreeDTO.setChildCodes(new ArrayList<>()); | |||||
getDingOrgChild(dingOrgInfoTreeDTO); | |||||
return dingOrgInfoTreeDTO; | |||||
}).collect(Collectors.toList()); | |||||
parentDingOrgInfoTreeDTO.setChildCodes(dingOrgInfoTreeDTOList); | |||||
} | |||||
} | |||||
} | |||||
} | |||||
} | |||||
@@ -53,17 +53,17 @@ public class ExpertInfoCmdAssembler { | |||||
private static List<ExpertAvoidCompanyDTO> buildExpertAvoidCompanyList(ExpertProfessionalInfo professionalInfo) { | private static List<ExpertAvoidCompanyDTO> buildExpertAvoidCompanyList(ExpertProfessionalInfo professionalInfo) { | ||||
List<ExpertAvoidCompanyDTO> expertAvoidCompanyList = new ArrayList<>(); | |||||
List<ExpertAvoidCompanyDTO> avoidCompanies = new ArrayList<>(); | |||||
List<ExpertAvoidCompanyInfo> avoidCompanyList = professionalInfo.getAvoidCompanyList(); | List<ExpertAvoidCompanyInfo> avoidCompanyList = professionalInfo.getAvoidCompanyList(); | ||||
if (CollectionUtils.isNotEmpty(avoidCompanyList)) { | if (CollectionUtils.isNotEmpty(avoidCompanyList)) { | ||||
expertAvoidCompanyList = avoidCompanyList.stream().map(r -> { | |||||
avoidCompanyList.forEach(r -> { | |||||
ExpertAvoidCompanyDTO expertAvoidCompanyDTO = new ExpertAvoidCompanyDTO(); | ExpertAvoidCompanyDTO expertAvoidCompanyDTO = new ExpertAvoidCompanyDTO(); | ||||
expertAvoidCompanyDTO.setCompanyName(r.getCompanyName()); | expertAvoidCompanyDTO.setCompanyName(r.getCompanyName()); | ||||
expertAvoidCompanyDTO.setCompanyUniqCode(r.getCompanyUniqCode()); | expertAvoidCompanyDTO.setCompanyUniqCode(r.getCompanyUniqCode()); | ||||
return expertAvoidCompanyDTO; | |||||
}).collect(Collectors.toList()); | |||||
avoidCompanies.add(expertAvoidCompanyDTO); | |||||
}); | |||||
} | } | ||||
return expertAvoidCompanyList; | |||||
return avoidCompanies; | |||||
} | } | ||||
private static List<ExpertRegionDTO> buildExpertRegionList(ExpertBasicInfo basicInfo) { | private static List<ExpertRegionDTO> buildExpertRegionList(ExpertBasicInfo basicInfo) { | ||||
@@ -9,7 +9,6 @@ import com.hz.pm.api.expert.constant.ExpertApplyTypeEnum; | |||||
import com.hz.pm.api.expert.entity.*; | import com.hz.pm.api.expert.entity.*; | ||||
import com.hz.pm.api.expert.model.*; | import com.hz.pm.api.expert.model.*; | ||||
import com.hz.pm.api.expert.model.dto.*; | import com.hz.pm.api.expert.model.dto.*; | ||||
import com.hz.pm.api.expert.model.vo.ExpertFullInfoVO; | |||||
import com.hz.pm.api.gov.model.vo.GovBusinessStripVO; | import com.hz.pm.api.gov.model.vo.GovBusinessStripVO; | ||||
import com.hz.pm.api.meta.constant.ExpertDictTypeEnum; | import com.hz.pm.api.meta.constant.ExpertDictTypeEnum; | ||||
import com.hz.pm.api.meta.constant.ExpertTagEnum; | import com.hz.pm.api.meta.constant.ExpertTagEnum; | ||||
@@ -42,60 +41,6 @@ public class ExpertUserInfoAssembler { | |||||
private final DictionaryCache dictionaryCache; | private final DictionaryCache dictionaryCache; | ||||
private final RegionCacheHelper regionCacheHelper; | private final RegionCacheHelper regionCacheHelper; | ||||
public ExpertFullInfoVO buildExpertDetail(List<AttachFileVo> attachFiles, ExpertFullInfoAllDTO expertFullInfoAll) { | |||||
ExpertUserFullInfoDTO expertUserInfo = expertFullInfoAll.getExpertUserInfoDTO(); | |||||
// 字典字典段map | |||||
Map<String, List<DictFieldInfoDTO>> dictMap = buildDictInfoMap(expertFullInfoAll.getExpertDictionaryList()); | |||||
// 专家文件资料map | |||||
Map<Long, FileBasicInfo> fileMap = buildFileBasicInfoMap(attachFiles); | |||||
// 专家标签字段map | |||||
Map<String, List<TagFieldInfo>> tagMap = buildTagFieldInfoMap(expertFullInfoAll.getExpertTagList()); | |||||
// 专家履职意向地 | |||||
List<ExpertRegionDTO> intentionWorkRegions = expertFullInfoAll.getExpertIntentionWorkRegionInfo(); | |||||
// 专家回避单位列表 | |||||
List<ExpertAvoidCompanyDTO> avoidCompanies = expertFullInfoAll.getExpertAvoidCompanyList(); | |||||
// 基本信息 | |||||
ExpertBasicInfo basicInfo = convert(expertUserInfo, dictMap, tagMap, intentionWorkRegions); | |||||
// 学历信息 | |||||
ExpertEduInfo eduInfo = buildExpertEduInfo(expertUserInfo, dictMap); | |||||
// 职业信息 | |||||
ExpertJobInfo jobInfo = buildExpertJobInfo(expertUserInfo, dictMap); | |||||
jobInfo.setBusinessStrips(expertFullInfoAll.getBusinessStrips()); | |||||
// 专业信息 | |||||
ExpertProfessionalInfo profession = buildExpertProfessionalInfo(expertUserInfo, dictMap, tagMap, fileMap, avoidCompanies); | |||||
// 推荐信息 | |||||
ExpertRecommendInfo recommendInfo = new ExpertRecommendInfo(); | |||||
recommendInfo.setRecommendedWay(dictMap.get(ExpertDictTypeEnum.RECOMMENDED_WAY.getKey())); | |||||
recommendInfo.setRecommendFile(expertUserInfo.getRecommendFile()); | |||||
// 其他信息 | |||||
ExpertOtherInfo otherInfo = new ExpertOtherInfo(); | |||||
otherInfo.setOther(tagMap.get(ExpertTagEnum.OTHER.getKey())); | |||||
otherInfo.setRemark(expertUserInfo.getRemark()); | |||||
// 专家申请履职意向展示列表 | |||||
List<ExpertRegionInfo> applyIntentionWorkRegions = expertFullInfoAll.getExpertApplyIntentionWorkRegionInfo().stream().map(r -> { | |||||
ExpertRegionInfo intentionWorkRegion = new ExpertRegionInfo(); | |||||
intentionWorkRegion.setRegionLevel(r.getRegionLevel()); | |||||
intentionWorkRegion.setRegionCode(r.getRegionCode()); | |||||
intentionWorkRegion.setRegionName(regionCacheHelper.getUnionPath(r.getRegionCode(), r.getRegionLevel())); | |||||
return intentionWorkRegion; | |||||
}).collect(Collectors.toList()); | |||||
if (CollUtil.isEmpty(basicInfo.getExpertIntentionWorkRegions())) { | |||||
basicInfo.setExpertIntentionWorkRegions(applyIntentionWorkRegions); | |||||
} | |||||
ExpertFullInfoVO resExpertFullInfo = new ExpertFullInfoVO(); | |||||
resExpertFullInfo.setUserId(expertUserInfo.getUserId()); | |||||
resExpertFullInfo.setBasicInfo(basicInfo); | |||||
resExpertFullInfo.setEduInfo(eduInfo); | |||||
resExpertFullInfo.setJobInfo(jobInfo); | |||||
resExpertFullInfo.setProfessionalInfo(profession); | |||||
resExpertFullInfo.setRecommendInfo(recommendInfo); | |||||
resExpertFullInfo.setExpertOtherInfo(otherInfo); | |||||
resExpertFullInfo.setExpertApplyIntentionWorkRegions(applyIntentionWorkRegions); | |||||
return resExpertFullInfo; | |||||
} | |||||
public static Map<Long, FileBasicInfo> buildFileBasicInfoMap(List<AttachFileVo> attachFiles) { | public static Map<Long, FileBasicInfo> buildFileBasicInfoMap(List<AttachFileVo> attachFiles) { | ||||
return attachFiles.stream().map(r -> { | return attachFiles.stream().map(r -> { | ||||
FileBasicInfo fileBasicInfo = new FileBasicInfo(); | FileBasicInfo fileBasicInfo = new FileBasicInfo(); | ||||
@@ -44,20 +44,6 @@ public class ExpertController { | |||||
expertManage.expertRegistration(request); | expertManage.expertRegistration(request); | ||||
} | } | ||||
@PostMapping("/basic-info-submit") | |||||
@ApiOperation("专家管理员新增专家)") | |||||
@WebLog("专家管理员新增专家") | |||||
public void expertBasicInfoSubmit(@Valid @RequestBody ExpertUserBasicInfoSubmitRequest request) { | |||||
expertManage.expertBasicInfoSubmit(request); | |||||
} | |||||
@PostMapping("/basic-info-submit-notvalid") | |||||
@ApiOperation("专家管理员新增专家 参数不校检") | |||||
@WebLog("专家管理员新增专家 参数不校检") | |||||
public void expertBasicInfoSubmitNotValid(@RequestBody ExpertUserBasicInfoSubmitRequest request) { | |||||
expertManage.expertBasicInfoSubmit(request); | |||||
} | |||||
@GetMapping("/portrait/{expertId}/{year}") | @GetMapping("/portrait/{expertId}/{year}") | ||||
public ExpertPortraitVO expertPortrait(@PathVariable Long expertId, @PathVariable Integer year) { | public ExpertPortraitVO expertPortrait(@PathVariable Long expertId, @PathVariable Integer year) { | ||||
return expertManage.expertPortrait(expertId, year); | return expertManage.expertPortrait(expertId, year); | ||||
@@ -83,9 +83,6 @@ public class ExpertManage { | |||||
private final IExpertUserFullInfoService expertUserFullInfoService; | private final IExpertUserFullInfoService expertUserFullInfoService; | ||||
private final ExpertInfoService expertInfoService; | private final ExpertInfoService expertInfoService; | ||||
private final IUserInfoService userInfoService; | private final IUserInfoService userInfoService; | ||||
private final ExpertMetaApplyManage expertMetaApplyManage; | |||||
private final IUserRoleService userRoleService; | |||||
private final IRoleService roleService; | |||||
private final VerifyCodeCheckHelper verifyCodeCheckHelper; | private final VerifyCodeCheckHelper verifyCodeCheckHelper; | ||||
private final ZwddClient zwddClient; | private final ZwddClient zwddClient; | ||||
private final IMeetingExpertService meetingExpertService; | private final IMeetingExpertService meetingExpertService; | ||||
@@ -112,30 +109,6 @@ public class ExpertManage { | |||||
}).filter(Objects::nonNull).collect(Collectors.groupingBy(DictionaryVO::getDictionaryType)); | }).filter(Objects::nonNull).collect(Collectors.groupingBy(DictionaryVO::getDictionaryType)); | ||||
} | } | ||||
/** | |||||
* 专家管理员新增专家 | |||||
* | |||||
* @param req / | |||||
*/ | |||||
@Transactional(rollbackFor = Exception.class) | |||||
public void expertBasicInfoSubmit(ExpertUserBasicInfoSubmitRequest req) { | |||||
Long operatorId = LoginUserUtil.getUserId(); | |||||
// 用户id | |||||
Long userId = assemblerAndGenerateExpert(req, operatorId); | |||||
// 批量通过专家入库审核/专家履职意向审核 | |||||
expertMetaApplyManage.autoPassExpertApply(userId); | |||||
// 增加用户专家角色 | |||||
Role role = roleService.getOne(Wrappers.lambdaQuery(Role.class).eq(Role::getCode, RoleEnum.EXPERT.name())); | |||||
UserRole expertRole = userRoleService.getOne(userId, role.getId()); | |||||
if (Objects.isNull(expertRole)) { | |||||
expertRole = new UserRole(); | |||||
expertRole.setUserId(userId); | |||||
expertRole.setRoleId(role.getId()); | |||||
userRoleService.save(expertRole); | |||||
} | |||||
} | |||||
public ExpertDetailVO getExpertDetail(Long userId, boolean getFileDetail) { | public ExpertDetailVO getExpertDetail(Long userId, boolean getFileDetail) { | ||||
ExpertUserFullInfo eui = expertUserFullInfoService.getByUserId(userId); | ExpertUserFullInfo eui = expertUserFullInfoService.getByUserId(userId); | ||||
if (eui == null) { | if (eui == null) { | ||||
@@ -8,7 +8,6 @@ import com.hz.pm.api.gov.model.vo.GovBizProjectListVO; | |||||
import com.hz.pm.api.gov.model.vo.GovOperationProjectDetailVO; | import com.hz.pm.api.gov.model.vo.GovOperationProjectDetailVO; | ||||
import com.hz.pm.api.gov.model.vo.GovProjectDictionaryVO; | import com.hz.pm.api.gov.model.vo.GovProjectDictionaryVO; | ||||
import com.hz.pm.api.projectlib.model.req.ProjectListReq; | import com.hz.pm.api.projectlib.model.req.ProjectListReq; | ||||
import com.hz.pm.api.scheduler.task.SynProjectCollectionTask; | |||||
import com.hz.pm.api.scheduler.task.SynProvinceOrgTask; | import com.hz.pm.api.scheduler.task.SynProvinceOrgTask; | ||||
import com.ningdatech.basic.model.PageVo; | import com.ningdatech.basic.model.PageVo; | ||||
import com.ningdatech.log.annotation.WebLog; | import com.ningdatech.log.annotation.WebLog; | ||||
@@ -40,9 +39,6 @@ import java.util.List; | |||||
public class GovProjectCollectionController { | public class GovProjectCollectionController { | ||||
private final GovProjectCollectionManage collectionManage; | private final GovProjectCollectionManage collectionManage; | ||||
private final SynProjectCollectionTask collectionTask; | |||||
private final SynProvinceOrgTask synProvinceOrgTask; | private final SynProvinceOrgTask synProvinceOrgTask; | ||||
@GetMapping("/dictionary") | @GetMapping("/dictionary") | ||||
@@ -155,41 +151,6 @@ public class GovProjectCollectionController { | |||||
return collectionManage.operationDraftRemove(draftId); | return collectionManage.operationDraftRemove(draftId); | ||||
} | } | ||||
@PostMapping("/push-task") | |||||
@ApiOperation("主动调用定时器方法") | |||||
@WebLog("主动调用定时器方法") | |||||
public void pushTask() throws UnknownHostException { | |||||
collectionTask.doTask(); | |||||
} | |||||
@PostMapping("/push-task-single") | |||||
@ApiOperation("主动调用定时器方法") | |||||
@WebLog("主动调用定时器方法") | |||||
public void pushTaskSingle(@RequestBody List<String> projectCodes) { | |||||
collectionTask.doTaskSingle(projectCodes); | |||||
} | |||||
@PostMapping("/staging-convert-pdf") | |||||
@ApiOperation("把库存的项目归集的文件 都转换成PDF文件存入字段") | |||||
@WebLog("主动转换库存的文件都为PDF文件") | |||||
public void stagingConvertPdf(@RequestParam(required = false) String projId) { | |||||
collectionTask.stagingConvertPdf(projId); | |||||
} | |||||
@PostMapping("/staging-convert-pdf2") | |||||
@ApiOperation("把库存的项目归集的文件approval_file重新转换") | |||||
@WebLog("把库存的项目归集的文件approval_file重新转换") | |||||
public void stagingConvertPdf2(@RequestParam(required = false) String projId) { | |||||
collectionTask.stagingConvertPdf2(projId); | |||||
} | |||||
@PostMapping("/staging-convert-pdf3") | |||||
@ApiOperation("把库存的项目归集的文件 都转换成PDF文件存入字段 采购") | |||||
@WebLog("主动转换库存的文件都为PDF文件 采购") | |||||
public void stagingConvertPdf3(@RequestParam(required = false) String projId) { | |||||
collectionTask.stagingConvertPdf3(projId); | |||||
} | |||||
@PostMapping("/rebuild-project-code") | @PostMapping("/rebuild-project-code") | ||||
@ApiOperation("重新生成项目编号") | @ApiOperation("重新生成项目编号") | ||||
@WebLog("重新生成项目编号") | @WebLog("重新生成项目编号") | ||||
@@ -1,78 +0,0 @@ | |||||
package com.hz.pm.api.gov.entity; | |||||
import com.baomidou.mybatisplus.annotation.TableName; | |||||
import io.swagger.annotations.ApiModel; | |||||
import java.io.Serializable; | |||||
/** | |||||
* <p> | |||||
* | |||||
* </p> | |||||
* | |||||
* @author liuxinxin | |||||
* @since 2023-04-13 | |||||
*/ | |||||
@TableName("gov_business_strip") | |||||
@ApiModel(value = "GovBusinessStrip对象", description = "") | |||||
public class GovBusinessStrip implements Serializable { | |||||
private static final long serialVersionUID = 1L; | |||||
private Long id; | |||||
private String businessStripCode; | |||||
private String businessStripName; | |||||
private String parentCode; | |||||
private String parentName; | |||||
public Long getId() { | |||||
return id; | |||||
} | |||||
public void setId(Long id) { | |||||
this.id = id; | |||||
} | |||||
public String getBusinessStripCode() { | |||||
return businessStripCode; | |||||
} | |||||
public void setBusinessStripCode(String businessStripCode) { | |||||
this.businessStripCode = businessStripCode; | |||||
} | |||||
public String getBusinessStripName() { | |||||
return businessStripName; | |||||
} | |||||
public void setBusinessStripName(String businessStripName) { | |||||
this.businessStripName = businessStripName; | |||||
} | |||||
public String getParentCode() { | |||||
return parentCode; | |||||
} | |||||
public void setParentCode(String parentCode) { | |||||
this.parentCode = parentCode; | |||||
} | |||||
public String getParentName() { | |||||
return parentName; | |||||
} | |||||
public void setParentName(String parentName) { | |||||
this.parentName = parentName; | |||||
} | |||||
@Override | |||||
public String toString() { | |||||
return "GovBusinessStrip{" + | |||||
"id=" + id + | |||||
", businessStripCode=" + businessStripCode + | |||||
", businessStripName=" + businessStripName + | |||||
", parentCode=" + parentCode + | |||||
", parentName=" + parentName + | |||||
"}"; | |||||
} | |||||
} |
@@ -115,20 +115,15 @@ public class GovProjectCollectionManage { | |||||
private final FileService fileService; | private final FileService fileService; | ||||
@Value("${project.push-url}") | |||||
@Value("${project.push-url:}") | |||||
private String pushUrl; | private String pushUrl; | ||||
@Value("${project.no-effective-url}") | |||||
@Value("${project.no-effective-url:}") | |||||
private String noEffectiveUrl; | private String noEffectiveUrl; | ||||
@Value("${project.delete-all-url}") | |||||
@Value("${project.delete-all-url:}") | |||||
private String deleteAllUrl; | private String deleteAllUrl; | ||||
@Value("${spring.profiles.active}") | |||||
private String active; | |||||
private final RegionCacheHelper regionCacheHelper; | |||||
private final IProjectService projectService; | private final IProjectService projectService; | ||||
private final IProjectApplicationService applicationService; | private final IProjectApplicationService applicationService; | ||||
@@ -22,27 +22,27 @@ public class IrsSealPlatformProperties { | |||||
public static String apiUrl; | public static String apiUrl; | ||||
@Value("${irs.seal-platform.project-id}") | |||||
@Value("${irs.seal-platform.project-id:}") | |||||
public void setProjectId(String projectId) { | public void setProjectId(String projectId) { | ||||
IrsSealPlatformProperties.projectId = projectId; | IrsSealPlatformProperties.projectId = projectId; | ||||
} | } | ||||
@Value("${irs.seal-platform.project-secret}") | |||||
@Value("${irs.seal-platform.project-secret:}") | |||||
public void setProjectSecret(String projectSecret) { | public void setProjectSecret(String projectSecret) { | ||||
IrsSealPlatformProperties.projectSecret = projectSecret; | IrsSealPlatformProperties.projectSecret = projectSecret; | ||||
} | } | ||||
@Value("${irs.seal-platform.access-key}") | |||||
@Value("${irs.seal-platform.access-key:}") | |||||
public void setAccessKey(String accessKey) { | public void setAccessKey(String accessKey) { | ||||
IrsSealPlatformProperties.accessKey = accessKey; | IrsSealPlatformProperties.accessKey = accessKey; | ||||
} | } | ||||
@Value("${irs.seal-platform.secret-key}") | |||||
@Value("${irs.seal-platform.secret-key:}") | |||||
public void setSecretKey(String secretKey) { | public void setSecretKey(String secretKey) { | ||||
IrsSealPlatformProperties.secretKey = secretKey; | IrsSealPlatformProperties.secretKey = secretKey; | ||||
} | } | ||||
@Value("${irs.seal-platform.api-url}") | |||||
@Value("${irs.seal-platform.api-url:}") | |||||
public void setApiUrl(String apiUrl) { | public void setApiUrl(String apiUrl) { | ||||
IrsSealPlatformProperties.apiUrl = apiUrl; | IrsSealPlatformProperties.apiUrl = apiUrl; | ||||
} | } | ||||
@@ -1,52 +0,0 @@ | |||||
package com.hz.pm.api.irs.controller; | |||||
import com.alibaba.fastjson.JSONArray; | |||||
import com.alibaba.fastjson.JSONObject; | |||||
import com.ningdatech.log.annotation.WebLog; | |||||
import com.hz.pm.api.irs.manage.AppIrsManage; | |||||
import com.hz.pm.api.irs.model.dto.ApiApplyDTO; | |||||
import com.hz.pm.api.irs.model.dto.PushProjectAppToIrsDTO; | |||||
import lombok.AllArgsConstructor; | |||||
import lombok.extern.slf4j.Slf4j; | |||||
import org.springframework.web.bind.annotation.*; | |||||
import javax.validation.Valid; | |||||
import java.security.NoSuchAlgorithmException; | |||||
/** | |||||
* @Classname ApplicationController | |||||
* @Description | |||||
* @Date 2023/7/12 9:26 | |||||
* @Author PoffyZhang | |||||
*/ | |||||
@RestController | |||||
@RequestMapping("/api/v1/irs/app") | |||||
@AllArgsConstructor | |||||
@Slf4j | |||||
@Valid | |||||
public class ApplicationController { | |||||
private final AppIrsManage appIrsManage; | |||||
@PostMapping("/push-project-app") | |||||
@WebLog("推送项目和应用关系") | |||||
public Boolean pushProjectApp(@Valid @RequestBody PushProjectAppToIrsDTO dto) throws Exception { | |||||
return appIrsManage.pushProjectApp(dto); | |||||
} | |||||
@GetMapping("/sreach-app") | |||||
public JSONObject searchApp(ApiApplyDTO apply) throws NoSuchAlgorithmException { | |||||
return appIrsManage.searchApp(apply); | |||||
} | |||||
@GetMapping("/sreach-apps") | |||||
public JSONArray searchApps(ApiApplyDTO apply) throws NoSuchAlgorithmException { | |||||
return appIrsManage.searchApps(apply); | |||||
} | |||||
@GetMapping("/digitalResourcesIndicators/{appCode}/{pageSize}") | |||||
public JSONObject getDigitalResourcesIndicators(@PathVariable String appCode,@PathVariable Integer pageSize) { | |||||
return appIrsManage.getDigitalResourceIndicatorsByAppCode(appCode, pageSize); | |||||
} | |||||
} |
@@ -1,70 +0,0 @@ | |||||
package com.hz.pm.api.irs.controller; | |||||
import com.hz.pm.api.projectdeclared.manage.IrsManage; | |||||
import com.hz.pm.api.projectdeclared.model.vo.IrsApplicationVO; | |||||
import com.hz.pm.api.projectdeclared.model.vo.PiotTasksVO; | |||||
import com.hz.pm.api.scheduler.task.SynProjectCoreBizTask; | |||||
import com.ningdatech.log.annotation.WebLog; | |||||
import io.swagger.annotations.Api; | |||||
import io.swagger.annotations.ApiOperation; | |||||
import lombok.RequiredArgsConstructor; | |||||
import lombok.extern.slf4j.Slf4j; | |||||
import org.apache.commons.lang3.StringUtils; | |||||
import org.springframework.validation.annotation.Validated; | |||||
import org.springframework.web.bind.annotation.GetMapping; | |||||
import org.springframework.web.bind.annotation.RequestMapping; | |||||
import org.springframework.web.bind.annotation.RequestParam; | |||||
import org.springframework.web.bind.annotation.RestController; | |||||
import java.net.UnknownHostException; | |||||
import java.security.NoSuchAlgorithmException; | |||||
import java.util.List; | |||||
/** | |||||
* @Classname IrsController | |||||
* @Description irs 一些下拉框信息 | |||||
* @Date 2023/3/13 9:53 | |||||
* @Author PoffyZhang | |||||
*/ | |||||
@Slf4j | |||||
@Validated | |||||
@RestController | |||||
@RequestMapping("/api/v1/irs") | |||||
@Api(value = "irs", tags = "irs-信息查询") | |||||
@RequiredArgsConstructor | |||||
public class IrsController { | |||||
private final IrsManage irsManage; | |||||
private final SynProjectCoreBizTask projectCoreBizTask; | |||||
@ApiOperation(value = "irs应用列表", notes = "irs应用列表") | |||||
@WebLog("irs应用列表") | |||||
@GetMapping("/application-list") | |||||
public List<IrsApplicationVO> applicationList(@RequestParam(required = false) String areaCode) { | |||||
return irsManage.applicationList(areaCode); | |||||
} | |||||
@ApiOperation(value = "试点任务列表", notes = "试点任务列表") | |||||
@WebLog("试点任务列表") | |||||
@GetMapping("/piot-tasks") | |||||
public List<PiotTasksVO> piotTasks() { | |||||
return irsManage.listPiotTasks(); | |||||
} | |||||
@ApiOperation(value = "获取企业社会信用编码", notes = "获取企业社会信用编码") | |||||
@GetMapping("/get-credit-code") | |||||
public String getCreditCode() throws NoSuchAlgorithmException { | |||||
return irsManage.getCreditCode(); | |||||
} | |||||
@ApiOperation(value = "强制刷新核心业务", notes = "强制刷新核心业务") | |||||
@GetMapping("/refresh-core-biz") | |||||
public void refreshCoreBiz(@RequestParam(required = false) String orgCode) throws UnknownHostException { | |||||
if(StringUtils.isNotBlank(orgCode)){ | |||||
projectCoreBizTask.doTask(orgCode); | |||||
}else{ | |||||
projectCoreBizTask.doTask(); | |||||
} | |||||
} | |||||
} |
@@ -1,396 +0,0 @@ | |||||
package com.hz.pm.api.irs.manage; | |||||
import cn.hutool.core.collection.CollUtil; | |||||
import cn.hutool.crypto.digest.MD5; | |||||
import com.alibaba.fastjson.JSON; | |||||
import com.alibaba.fastjson.JSONArray; | |||||
import com.alibaba.fastjson.JSONObject; | |||||
import com.baomidou.mybatisplus.core.toolkit.Wrappers; | |||||
import com.hz.pm.api.common.model.constant.RegionConst; | |||||
import com.hz.pm.api.common.enumeration.CommonEnum; | |||||
import com.hz.pm.api.common.statemachine.util.StateMachineUtil; | |||||
import com.hz.pm.api.common.util.CryptUtils; | |||||
import com.hz.pm.api.common.util.HttpUtil; | |||||
import com.hz.pm.api.irs.model.dto.ApiApplyDTO; | |||||
import com.hz.pm.api.irs.model.dto.ApiApplySearchResult; | |||||
import com.hz.pm.api.irs.model.dto.PushProjectAppToIrsDTO; | |||||
import com.hz.pm.api.irs.model.res.ApiResponse; | |||||
import com.hz.pm.api.projectlib.model.dto.ProjectDTO; | |||||
import com.hz.pm.api.projectlib.model.entity.Project; | |||||
import com.hz.pm.api.projectlib.model.entity.ProjectApplication; | |||||
import com.hz.pm.api.projectlib.service.IProjectApplicationService; | |||||
import com.hz.pm.api.projectlib.service.IProjectService; | |||||
import com.ningdatech.basic.function.VUtils; | |||||
import com.ningdatech.irs.service.IRefreshTokenService; | |||||
import lombok.RequiredArgsConstructor; | |||||
import lombok.extern.slf4j.Slf4j; | |||||
import org.apache.commons.lang3.StringUtils; | |||||
import org.springframework.beans.factory.annotation.Value; | |||||
import org.springframework.http.HttpMethod; | |||||
import org.springframework.http.ResponseEntity; | |||||
import org.springframework.http.client.HttpComponentsClientHttpRequestFactory; | |||||
import org.springframework.stereotype.Component; | |||||
import org.springframework.web.client.RestTemplate; | |||||
import javax.annotation.Resource; | |||||
import java.security.NoSuchAlgorithmException; | |||||
import java.time.LocalDateTime; | |||||
import java.util.List; | |||||
import java.util.Objects; | |||||
import java.util.stream.Collectors; | |||||
/** | |||||
* @Classname AppIrsManage | |||||
* @Description | |||||
* @Date 2023/7/12 11:43 | |||||
* @Author PoffyZhang | |||||
*/ | |||||
@Component | |||||
@Slf4j | |||||
@RequiredArgsConstructor | |||||
public class AppIrsManage { | |||||
private final IProjectService projectService; | |||||
private final IProjectApplicationService applicationService; | |||||
private final StateMachineUtil stateMachineUtil; | |||||
@Value("${irs.push-app.appKey}") | |||||
private String pushAppKey; | |||||
@Value("${irs.push-app.appScret}") | |||||
private String pushAppScret; | |||||
@Value("${irs.push-app.url}") | |||||
private String pushUrl; | |||||
@Value("${irs.search-app.appKey}") | |||||
private String searchAppKey; | |||||
@Value("${irs.search-app.appScret}") | |||||
private String searchAppScret; | |||||
@Value("${irs.search-app.url}") | |||||
private String searchUrl; | |||||
@Resource | |||||
private IRefreshTokenService refreshTokenService; | |||||
@Value("${irs.interface-refresh.request-token-url}") | |||||
private String govRequestTokenUrl; | |||||
@Value("${irs.interface-refresh.refresh-token-url}") | |||||
private String govRefreshTokenUrl; | |||||
@Value("${irs.push-project-detail.url}") | |||||
private String pushProjectUrl; | |||||
@Value("${irs.push-project-detail.appKey}") | |||||
private String pushProjectAppKey; | |||||
@Value("${irs.push-project-detail.appSecret}") | |||||
private String pushProjectAppSecret; | |||||
//=============数字资源指标获取======================================================================================== | |||||
@Value("${irs.digital-resource-indicators.app-key}") | |||||
private String driAppKey; | |||||
@Value("${irs.digital-resource-indicators.app-secret}") | |||||
private String driAppSecret; | |||||
@Value("${irs.digital-resource-indicators.interface-name}") | |||||
private String driInterfaceName; | |||||
@Value("${irs.digital-resource-indicators.url}") | |||||
private String driUrl; | |||||
/** | |||||
* 推送 项目和应用关系 | |||||
* | |||||
* @param dto | |||||
* @return | |||||
* @throws NoSuchAlgorithmException | |||||
*/ | |||||
public Boolean pushProjectApp(PushProjectAppToIrsDTO dto) throws Exception { | |||||
String appCode = dto.getAppCode(); | |||||
Long appId = dto.getAppId(); | |||||
String projectCode = dto.getProjectCode(); | |||||
ProjectApplication app = applicationService.getById(appId); | |||||
VUtils.isTrue(Objects.isNull(app)).throwMessage("应用不存在!"); | |||||
VUtils.isTrue(CommonEnum.NO.getCode().equals(app.getIsFirst())).throwMessage("应用不是初次新建!"); | |||||
Project project = projectService.getProjectByCode(projectCode); | |||||
VUtils.isTrue(Objects.isNull(project)).throwMessage("项目不存在!"); | |||||
ApiApplyDTO apiApply = new ApiApplyDTO(); | |||||
apiApply.setAppId(appCode); | |||||
JSONObject jsonObject = this.searchApp(apiApply); | |||||
ApiApplySearchResult apiApplySearchResult = JSON.parseObject(JSON.toJSONString(jsonObject), ApiApplySearchResult.class); | |||||
VUtils.isTrue(Objects.isNull(apiApplySearchResult)).throwMessage("应用在IRS不存在!"); | |||||
long timestamp = System.currentTimeMillis(); | |||||
String areaCode = project.getAreaCode(); | |||||
String projectName = project.getProjectName(); | |||||
String requestSecret = refreshTokenService.refreshToken(pushAppKey, pushAppScret, govRequestTokenUrl, govRefreshTokenUrl, HttpMethod.POST.name()); | |||||
String capCode = CryptUtils.encryptHMAC(timestamp + areaCode, "bcb4fc0f517fc168ee543fcf4d231f3b"); | |||||
String capTime = String.valueOf(timestamp); | |||||
String sign = CryptUtils.MD5Encode(pushAppKey + requestSecret + timestamp); | |||||
String url = pushUrl + "?requestTime=" + timestamp + | |||||
"&sign=" + sign + "&appKey=" + pushAppKey + "&capCode=" + capCode + "&capTime=" + capTime + | |||||
"&baseProjSys=" + apiApplySearchResult.getName() + "&areaCode=" + areaCode + "&baseProjName=" + projectName + | |||||
"&baseProjId=" + project.getProjectCode() + | |||||
"&isEffective=1&baseProjSysCode=" + appCode; | |||||
RestTemplate restTemplate = new RestTemplate(); | |||||
ResponseEntity<ApiResponse> forEntity = restTemplate.getForEntity(url, ApiResponse.class); | |||||
log.info("推送 项目和应用结果 : {}", JSON.toJSONString(forEntity)); | |||||
ApiResponse body = forEntity.getBody(); | |||||
if (Objects.isNull(body) || Objects.isNull(body.getCode()) | |||||
|| 0 != body.getCode()) { | |||||
return Boolean.FALSE; | |||||
} | |||||
//保存关系 | |||||
app.setAppCode(appCode); | |||||
if (applicationService.updateById(app)) { | |||||
/** | |||||
* 判断下 如果成功的话 那么判断下 这个项目的初次创建的app 是否都已经被注册 | |||||
* 如果都已经注册 要调用状态机 进入下一个状态 | |||||
*/ | |||||
List<ProjectApplication> apps = applicationService.list(Wrappers.lambdaQuery(ProjectApplication.class) | |||||
.eq(ProjectApplication::getProjectId, project.getId())); | |||||
//筛选出 初次新建的app 但是没有appCode的 | |||||
apps = apps.stream().filter(a -> { | |||||
if (CommonEnum.YES.getCode().equals(a.getIsFirst()) && | |||||
StringUtils.isBlank(app.getAppCode())) { | |||||
return Boolean.TRUE; | |||||
} | |||||
return Boolean.FALSE; | |||||
}) | |||||
.collect(Collectors.toList()); | |||||
//如果筛选出来的 为空的话 就调用状态机 | |||||
if (CollUtil.isEmpty(apps)) { | |||||
stateMachineUtil.pass(project); | |||||
project.setUpdateOn(LocalDateTime.now()); | |||||
projectService.updateById(project); | |||||
} | |||||
} | |||||
return body.getSuccess(); | |||||
} | |||||
/** | |||||
* 查询app | |||||
* | |||||
* @param apply | |||||
* @return | |||||
* @throws NoSuchAlgorithmException | |||||
*/ | |||||
public JSONObject searchApp(ApiApplyDTO apply) throws NoSuchAlgorithmException { | |||||
long timestamp = System.currentTimeMillis(); | |||||
String appCode = apply.getAppId(); | |||||
String requestSecret = refreshTokenService.refreshToken(searchAppKey, searchAppScret, govRequestTokenUrl, govRefreshTokenUrl, HttpMethod.POST.name()); | |||||
String sign = CryptUtils.MD5Encode(searchAppKey + requestSecret + timestamp); | |||||
String url = searchUrl + "?requestTime=" + timestamp + "&sign=" + sign + | |||||
"&appKey=" + searchAppKey + "&" + | |||||
"pageSize=10&pageNum=1&appCode=" + appCode + | |||||
"&areaCode=&deptCode=&name="; | |||||
log.info("url : {}", url); | |||||
RestTemplate restTemplate = new RestTemplate(); | |||||
ResponseEntity<String> forEntity = restTemplate.getForEntity(url, String.class); | |||||
if (Objects.nonNull(forEntity.getBody()) && Objects.nonNull(forEntity.getBody())) { | |||||
JSONObject body = JSON.parseObject(forEntity.getBody()); | |||||
if (Objects.isNull(body)) { | |||||
return null; | |||||
} | |||||
JSONObject datas = body.getJSONObject("datas"); | |||||
if (Objects.isNull(datas)) { | |||||
return null; | |||||
} | |||||
JSONObject data = datas.getJSONObject("data"); | |||||
if (Objects.isNull(data)) { | |||||
return null; | |||||
} | |||||
JSONArray apiApplySearchResult = data.getJSONArray("apiApplySearchResult"); | |||||
if (CollUtil.isEmpty(apiApplySearchResult)) { | |||||
return null; | |||||
} | |||||
return apiApplySearchResult.getJSONObject(0); | |||||
} | |||||
return null; | |||||
} | |||||
public JSONArray searchApps(ApiApplyDTO apply) throws NoSuchAlgorithmException { | |||||
long timestamp = System.currentTimeMillis(); | |||||
String areaCode = StringUtils.isNotBlank(apply.getAreaCode()) ? | |||||
convertAreaCode(apply.getAreaCode()) : null; | |||||
String requestSecret = refreshTokenService.refreshToken(searchAppKey, searchAppScret, govRequestTokenUrl, govRefreshTokenUrl, | |||||
HttpMethod.POST.name()); | |||||
String sign = CryptUtils.MD5Encode(searchAppKey + requestSecret + timestamp); | |||||
String url = searchUrl + "?requestTime=" + timestamp + "&sign=" + sign + | |||||
"&appKey=" + searchAppKey + "&pageSize=1000&" + | |||||
"pageNum=1&areaCode=" + areaCode + | |||||
"&deptCode=&name="; | |||||
log.info("查询应用目录:{}", url); | |||||
RestTemplate restTemplate = new RestTemplate(); | |||||
ResponseEntity<String> forEntity = restTemplate.getForEntity(url, String.class); | |||||
log.info("查询应用目录 : {}", forEntity.getStatusCode()); | |||||
if (Objects.nonNull(forEntity.getBody())) { | |||||
JSONObject body = JSON.parseObject(forEntity.getBody()); | |||||
if (Objects.isNull(body)) { | |||||
return null; | |||||
} | |||||
JSONObject datas = body.getJSONObject("datas"); | |||||
if (Objects.isNull(datas)) { | |||||
return null; | |||||
} | |||||
JSONObject data = datas.getJSONObject("data"); | |||||
if (Objects.isNull(data)) { | |||||
return null; | |||||
} | |||||
JSONArray apiApplySearchResult = data.getJSONArray("apiApplySearchResult"); | |||||
return apiApplySearchResult; | |||||
} | |||||
return null; | |||||
} | |||||
/** | |||||
* 如果是市本级的 结尾改成01 还要转换开发区的code | |||||
* | |||||
* @param areaCode | |||||
* @return | |||||
*/ | |||||
private String convertAreaCode(String areaCode) { | |||||
if (RegionConst.RC_HZ.equals(areaCode) || RegionConst.LS_KF.equals(areaCode)) { | |||||
return RegionConst.RC_LS_SBJ_IRS; | |||||
} | |||||
return areaCode; | |||||
} | |||||
public String testGuibing() throws Exception { | |||||
long timestamp = System.currentTimeMillis(); | |||||
String appSecret = "496f0f2a19994f76b4fd9dae087366c7"; | |||||
String appKey = "A331101453557202109017383"; | |||||
String method = "POST"; | |||||
String secret = refreshTokenService.refreshToken(appKey, appSecret, govRequestTokenUrl, govRefreshTokenUrl, method); | |||||
log.info("secret :{}", secret); | |||||
String sign = MD5.create().digestHex(appKey + secret + timestamp); | |||||
HttpComponentsClientHttpRequestFactory factory = HttpUtil.generateHttpRequestFactory(); | |||||
RestTemplate restTemplate; | |||||
if (Objects.nonNull(factory)) { | |||||
restTemplate = new RestTemplate(factory); | |||||
} else { | |||||
restTemplate = new RestTemplate(); | |||||
} | |||||
String appId = "A330000100000202105005790"; | |||||
String capCode = CryptUtils.encryptHMAC(timestamp + appId, "bcb4fc0f517fc168ee543fcf4d231f3b"); | |||||
String url = "https://interface.zjzwfw.gov.cn/gateway/api/proxy/001003001029/" + | |||||
"dataSharing/5crv7i4727abLCv0.htm?requestTime=" + timestamp + | |||||
"&sign=" + sign + "&appKey=" + appKey + | |||||
"&capCode=" + capCode + "&capTime=" + timestamp + | |||||
"&appId=" + appId; | |||||
log.info("url :{}", url); | |||||
ResponseEntity<String> forEntity = restTemplate.getForEntity(url, String.class); | |||||
log.info(forEntity.getBody()); | |||||
return forEntity.getBody(); | |||||
} | |||||
/** | |||||
* 推送项目详情 | |||||
* | |||||
* @return | |||||
*/ | |||||
public String pushProjectDetail(ProjectDTO projectDto) { | |||||
long timestamp = System.currentTimeMillis(); | |||||
String appSecret = pushProjectAppSecret; | |||||
String appKey = pushProjectAppKey; | |||||
String method = HttpMethod.POST.name(); | |||||
String secret = refreshTokenService.refreshToken(appKey, appSecret, govRequestTokenUrl, govRefreshTokenUrl, method); | |||||
log.info("secret :{}", secret); | |||||
String sign = MD5.create().digestHex(appKey + secret + timestamp); | |||||
HttpComponentsClientHttpRequestFactory factory = HttpUtil.generateHttpRequestFactory(); | |||||
RestTemplate restTemplate; | |||||
if (Objects.nonNull(factory)) { | |||||
restTemplate = new RestTemplate(factory); | |||||
} else { | |||||
restTemplate = new RestTemplate(); | |||||
} | |||||
String baseProjPrincipal = projectDto.getResponsibleMan();//"蒋国海" | |||||
String baseProjSetYear = String.valueOf(projectDto.getProjectYear());//"2022" | |||||
String baseProjId = projectDto.getProjectCode();//"331123220130969000000" | |||||
String baseManDeprt = projectDto.getBuildOrgName();//"遂昌县大数据和金融发展中心" | |||||
String baseProjBasis = projectDto.getBaseProjBasis();//"2" | |||||
String baseLowestLevel = projectDto.getBaseLowestLevel();//"C" | |||||
String ProjPrincipalCall = projectDto.getResponsibleManMobile();//"13884366607" | |||||
//内容类别 | |||||
String baseConstructionType = projectDto.getBaseConstructionType();//"01" | |||||
String baseProjType = projectDto.getBaseProjType();//"1" | |||||
String baseProjContacts = projectDto.getContactName();//"毛以林" | |||||
String isEffective = "02"; // 有效 | |||||
String baseConsDeprtDing = projectDto.getBuildOrgCode();//"GO_9a7dce7fbaf54787998fa004f1b7c0e1"; | |||||
String baseProjSetProg = projectDto.getBaseProjSetProg();//"04" | |||||
String baseProjContactsCall = projectDto.getContactPhone();//"13857049999" | |||||
String baseProjName = projectDto.getProjectName();//"遂昌县大数据和金融发展中心天工系统" | |||||
String baseProjConsClass = projectDto.getBaseProjConsClass();//"C" | |||||
String areaCode = projectDto.getAreaCode();//"331123000" | |||||
String baseAreaName = projectDto.getArea();//"遂昌县"; | |||||
String baseManDeprtDing = projectDto.getSuperOrgCode();//"GO_9a7dce7fbaf54787998fa004f1b7c0e1"; | |||||
String baseProvManDeprtDing = projectDto.getHigherSuperOrgCode();//"GO_6c383c049d95461f9a0df780140ceb32"; | |||||
String baseBasisEstablish = projectDto.getBuildBasis();//"中共遂昌县委办公室关于研究开发“天工”智能化管理平台(三期)的函"; | |||||
String capCode = null; | |||||
try { | |||||
capCode = CryptUtils.encryptHMAC(timestamp + areaCode, "bcb4fc0f517fc168ee543fcf4d231f3b"); | |||||
} catch (Exception e) { | |||||
log.error(e.getMessage()); | |||||
} | |||||
String url = pushProjectUrl + "?" + | |||||
"requestTime=" + timestamp + "&sign=" + sign + | |||||
"&appKey=" + appKey + "&baseProjPrincipal=" + baseProjPrincipal + "" + | |||||
"&baseProjSetYear=" + baseProjSetYear + "&baseProjId=" + baseProjId + | |||||
"&baseManDeprt=" + baseManDeprt + "&baseProjBasis=" + baseProjBasis + | |||||
"&baseLowestLevel=" + baseLowestLevel + "&ProjPrincipalCall=" + ProjPrincipalCall + | |||||
"&baseConstructionType=" + baseConstructionType + "&baseProjType=" + baseProjType + | |||||
"&baseProjContacts=" + baseProjContacts + "&isEffective=" + isEffective + | |||||
"&baseConsDeprtDing=" + baseConsDeprtDing + "&baseProjSetProg=" + baseProjSetProg + | |||||
"&baseProjContactsCall=" + baseProjContactsCall + "&baseProjName=" + baseProjName + | |||||
"&baseProjConsClass=" + baseProjConsClass + "&capCode=" + capCode + "&baseManDeprtDing=" + baseManDeprtDing + | |||||
"&baseProvManDeprtDing=" + baseProvManDeprtDing + "&baseBasisEstablish=" + baseBasisEstablish + | |||||
"&baseAreaCode=" + areaCode + "&capTime=" + timestamp + "&baseAreaName=" + baseAreaName; | |||||
log.info("url :{}", url); | |||||
ResponseEntity<String> forEntity = restTemplate.getForEntity(url, String.class); | |||||
log.info(forEntity.getBody()); | |||||
return forEntity.getBody(); | |||||
} | |||||
public JSONObject getDigitalResourceIndicatorsByAppCode(String appCode, Integer pageSize) { | |||||
long timestamp = System.currentTimeMillis(); | |||||
String appSecret = driAppSecret; | |||||
String appKey = driAppKey; | |||||
String method = HttpMethod.POST.name(); | |||||
String secret = refreshTokenService.refreshToken(appKey, appSecret, govRequestTokenUrl, govRefreshTokenUrl, method); | |||||
log.info("secret : {}", secret); | |||||
String sign = MD5.create().digestHex(appKey + secret + timestamp); | |||||
HttpComponentsClientHttpRequestFactory factory = HttpUtil.generateHttpRequestFactory(); | |||||
RestTemplate restTemplate; | |||||
if (Objects.nonNull(factory)) { | |||||
restTemplate = new RestTemplate(factory); | |||||
} else { | |||||
restTemplate = new RestTemplate(); | |||||
} | |||||
String url = driUrl + "?" + | |||||
"requestTime=" + timestamp + "&sign=" + sign + | |||||
"&appKey=" + appKey + "&appCode=" + appCode + "&pageIndex=1&pageSize=" + pageSize; | |||||
log.info("url :{}", url); | |||||
ResponseEntity<JSONObject> forEntity = restTemplate.getForEntity(url, JSONObject.class); | |||||
log.info(Objects.requireNonNull(forEntity.getBody()).toJSONString()); | |||||
return forEntity.getBody(); | |||||
} | |||||
} |
@@ -1,93 +0,0 @@ | |||||
package com.hz.pm.api.irs.manage; | |||||
import com.alibaba.fastjson.JSONObject; | |||||
import com.ningdatech.irs.service.IRefreshTokenService; | |||||
import com.hz.pm.api.common.util.CryptUtils; | |||||
import com.hz.pm.api.common.util.HttpUtil; | |||||
import com.hz.pm.api.common.util.RefreshKeyUtil; | |||||
import lombok.RequiredArgsConstructor; | |||||
import lombok.extern.slf4j.Slf4j; | |||||
import org.apache.commons.lang3.StringUtils; | |||||
import org.springframework.beans.factory.annotation.Value; | |||||
import org.springframework.http.HttpMethod; | |||||
import org.springframework.http.ResponseEntity; | |||||
import org.springframework.http.client.HttpComponentsClientHttpRequestFactory; | |||||
import org.springframework.stereotype.Component; | |||||
import org.springframework.web.client.RestTemplate; | |||||
import javax.annotation.Resource; | |||||
import java.security.NoSuchAlgorithmException; | |||||
import java.util.Objects; | |||||
/** | |||||
* @Classname ProjectIrsManage | |||||
* @Description | |||||
* @Date 2023/8/15 11:43 | |||||
* @Author PoffyZhang | |||||
*/ | |||||
@Component | |||||
@Slf4j | |||||
@RequiredArgsConstructor | |||||
public class ProjectIrsManage { | |||||
@Value("${irs.core-biz.appKey}") | |||||
private String appKey; | |||||
@Value("${irs.core-biz.appSecret}") | |||||
private String appSecret; | |||||
@Value("${irs.core-biz.url}") | |||||
private String coreBizUrl; | |||||
@Value("${irs.core-biz.interfaceName}") | |||||
private String interfaceName; | |||||
@Resource | |||||
private IRefreshTokenService refreshTokenService; | |||||
@Value("${irs.interface-refresh.request-token-url}") | |||||
private String govRequestTokenUrl; | |||||
@Value("${irs.interface-refresh.refresh-token-url}") | |||||
private String govRefreshTokenUrl; | |||||
/** | |||||
* 查询核心业务 | |||||
* | |||||
* @param businessName | |||||
* @return | |||||
* @throws NoSuchAlgorithmException | |||||
*/ | |||||
public JSONObject searchCoreBiz(String businessName,String orgCode,Integer limit,Integer page) { | |||||
long timestamp = System.currentTimeMillis(); | |||||
String secret = refreshTokenService.refreshToken(appKey, appSecret, govRequestTokenUrl, govRefreshTokenUrl, | |||||
HttpMethod.POST.name()); | |||||
String sign = null; | |||||
try{ | |||||
sign = CryptUtils.MD5Encode(appKey + secret + timestamp); | |||||
}catch (Exception e){ | |||||
log.error(e.getMessage()); | |||||
} | |||||
HttpComponentsClientHttpRequestFactory factory = HttpUtil.generateHttpRequestFactory(); | |||||
RestTemplate restTemplate; | |||||
if(Objects.nonNull(factory)){ | |||||
restTemplate = new RestTemplate(factory); | |||||
}else{ | |||||
restTemplate = new RestTemplate(); | |||||
} | |||||
String url = coreBizUrl + "?" + | |||||
"dingCode=" + (StringUtils.isNotBlank(orgCode)?orgCode:StringUtils.EMPTY) + | |||||
"&matterName=" + (StringUtils.isNotBlank(businessName)?businessName:StringUtils.EMPTY) + | |||||
"&oid=&useState=1&" + | |||||
"limit=" + (Objects.isNull(limit) ? "10" : limit) + "&page=" + (Objects.isNull(page) ? "1" : page) + | |||||
"&appKey=" + appKey + "&sign=" + sign + "&requestTime=" + timestamp; | |||||
ResponseEntity<JSONObject> forEntity = restTemplate.getForEntity(url, JSONObject.class); | |||||
JSONObject body = forEntity.getBody(); | |||||
log.info("core biz :{}",body); | |||||
JSONObject datas = body.getJSONObject("datas"); | |||||
if(Objects.nonNull(datas)){ | |||||
return datas; | |||||
} | |||||
return forEntity.getBody(); | |||||
} | |||||
} |
@@ -1,50 +0,0 @@ | |||||
package com.hz.pm.api.meeting.entity.config; | |||||
import lombok.Data; | |||||
import org.springframework.beans.factory.annotation.Value; | |||||
import org.springframework.stereotype.Component; | |||||
/** | |||||
* <p> | |||||
* SystemProperties | |||||
* </p> | |||||
* | |||||
* @author WendyYang | |||||
* @since 14:39 2022/9/15 | |||||
*/ | |||||
@Data | |||||
@Component | |||||
public class WebProperties { | |||||
public static String expertRegistrationUrl; | |||||
public static String webUrl; | |||||
public static String apiHost; | |||||
public static String provincialUrl; | |||||
@Value("${api-host:}") | |||||
private void setApiHost(String host) { | |||||
apiHost = host; | |||||
} | |||||
@Value("${expert-registration.url:/expertEnroll}") | |||||
private void setExpertRegistrationUrl(String url) { | |||||
expertRegistrationUrl = url; | |||||
} | |||||
@Value("${web.url:}") | |||||
private void setWebUrl(String url) { | |||||
webUrl = url; | |||||
} | |||||
/** | |||||
* 省局项目管理调用跳转地址 | |||||
*/ | |||||
@Value("${web.provincial:}") | |||||
private void setProvincial(String provincial) { | |||||
provincialUrl = provincial; | |||||
} | |||||
} |
@@ -0,0 +1,27 @@ | |||||
package com.hz.pm.api.meeting.entity.config; | |||||
import lombok.Data; | |||||
import org.springframework.beans.factory.annotation.Value; | |||||
import org.springframework.stereotype.Component; | |||||
/** | |||||
* <p> | |||||
* WebProps | |||||
* </p> | |||||
* | |||||
* @author WendyYang | |||||
* @since 14:39 2022/9/15 | |||||
*/ | |||||
@Data | |||||
@Component | |||||
public class WebProps { | |||||
public static String apiHost; | |||||
@Value("${api-host:}") | |||||
private void setApiHost(String host) { | |||||
apiHost = host; | |||||
} | |||||
} |
@@ -0,0 +1,18 @@ | |||||
package com.hz.pm.api.organization.constant; | |||||
/** | |||||
* <p> | |||||
* ProcDefCont | |||||
* </p> | |||||
* | |||||
* @author WendyYang | |||||
* @since 15:50 2024/3/29 | |||||
*/ | |||||
public class ProcDefCont { | |||||
private ProcDefCont() { | |||||
} | |||||
public static final String MODELS_ID_PREFIX = "pd"; | |||||
} |
@@ -1,13 +0,0 @@ | |||||
package com.hz.pm.api.organization.constants; | |||||
/** | |||||
* @Classname ProcDefContant | |||||
* @Description | |||||
* @Date 2023/7/11 9:35 | |||||
* @Author PoffyZhang | |||||
*/ | |||||
public interface ProcDefContant { | |||||
public final static String MODELS_ID_PREFIX = "pd"; | |||||
} |
@@ -3,8 +3,6 @@ package com.hz.pm.api.organization.controller; | |||||
import com.hz.pm.api.organization.manage.OrganizationManage; | import com.hz.pm.api.organization.manage.OrganizationManage; | ||||
import com.hz.pm.api.organization.model.po.ReqOrganizationListPO; | import com.hz.pm.api.organization.model.po.ReqOrganizationListPO; | ||||
import com.hz.pm.api.organization.model.po.ReqSynthesizePO; | |||||
import com.hz.pm.api.organization.model.vo.KeyTreeVO; | |||||
import com.hz.pm.api.organization.model.vo.OrganizationTreeVO; | import com.hz.pm.api.organization.model.vo.OrganizationTreeVO; | ||||
import com.hz.pm.api.organization.model.vo.ResOrganizationListVO; | import com.hz.pm.api.organization.model.vo.ResOrganizationListVO; | ||||
import com.ningdatech.basic.model.PageVo; | import com.ningdatech.basic.model.PageVo; | ||||
@@ -49,9 +47,4 @@ public class DingOrganizationController { | |||||
return organizationManage.getChildOrganizationList(parentCode, orgName, false); | return organizationManage.getChildOrganizationList(parentCode, orgName, false); | ||||
} | } | ||||
@ApiOperation("组织树状列表筛选(前端定制化接口不可复用)") | |||||
@PostMapping("/tree-list") | |||||
public List<KeyTreeVO> treeVOList(@Valid @RequestBody ReqSynthesizePO request) { | |||||
return organizationManage.treeRubbishVOList(request); | |||||
} | |||||
} | } |
@@ -9,7 +9,6 @@ import com.hz.pm.api.organization.model.vo.GovBusinessStripTreeVO; | |||||
import com.hz.pm.api.organization.model.vo.ProvincialGovBusinessStripVO; | import com.hz.pm.api.organization.model.vo.ProvincialGovBusinessStripVO; | ||||
import com.hz.pm.api.organization.service.IGovBusinessStripService; | import com.hz.pm.api.organization.service.IGovBusinessStripService; | ||||
import com.hz.pm.api.organization.service.IProvincialGovBusinessStripService; | import com.hz.pm.api.organization.service.IProvincialGovBusinessStripService; | ||||
import com.hz.pm.api.provincial.service.IJoinReviewProvincialBureauService; | |||||
import lombok.RequiredArgsConstructor; | import lombok.RequiredArgsConstructor; | ||||
import org.apache.commons.lang3.StringUtils; | import org.apache.commons.lang3.StringUtils; | ||||
import org.springframework.beans.factory.annotation.Value; | import org.springframework.beans.factory.annotation.Value; | ||||
@@ -30,14 +29,8 @@ import java.util.stream.Collectors; | |||||
public class GovBusinessStripManage { | public class GovBusinessStripManage { | ||||
private final IGovBusinessStripService iGovBusinessStripService; | private final IGovBusinessStripService iGovBusinessStripService; | ||||
private final IProvincialGovBusinessStripService provincialGovBusinessStripService; | private final IProvincialGovBusinessStripService provincialGovBusinessStripService; | ||||
private final IJoinReviewProvincialBureauService joinReviewProvincialBureauService; | |||||
@Value("${irs.province-gov.can-search}") | |||||
private Boolean canSearch; | |||||
public List<GovBusinessStripTreeVO> getChildOrganizationList(String parentCode) { | public List<GovBusinessStripTreeVO> getChildOrganizationList(String parentCode) { | ||||
if (Objects.isNull(parentCode)) { | if (Objects.isNull(parentCode)) { | ||||
parentCode = "-1"; | parentCode = "-1"; | ||||
@@ -57,15 +50,15 @@ public class GovBusinessStripManage { | |||||
public List<ProvincialGovBusinessStripVO> getProvincialGovBusinessStripList(String businessStripName) { | public List<ProvincialGovBusinessStripVO> getProvincialGovBusinessStripList(String businessStripName) { | ||||
List<ProvincialGovBusinessStrip> strips = provincialGovBusinessStripService.list(Wrappers.lambdaQuery(ProvincialGovBusinessStrip.class) | List<ProvincialGovBusinessStrip> strips = provincialGovBusinessStripService.list(Wrappers.lambdaQuery(ProvincialGovBusinessStrip.class) | ||||
.like(StringUtils.isNotBlank(businessStripName),ProvincialGovBusinessStrip::getBusinessStripName,businessStripName) | |||||
.like(StringUtils.isNotBlank(businessStripName), ProvincialGovBusinessStrip::getBusinessStripName, businessStripName) | |||||
.orderByAsc(ProvincialGovBusinessStrip::getBusinessStripName)); | .orderByAsc(ProvincialGovBusinessStrip::getBusinessStripName)); | ||||
if(CollUtil.isEmpty(strips)){ | |||||
if (CollUtil.isEmpty(strips)) { | |||||
return Collections.emptyList(); | return Collections.emptyList(); | ||||
} | } | ||||
return strips.stream() | return strips.stream() | ||||
.map(p -> BeanUtil.copyProperties(p,ProvincialGovBusinessStripVO.class)) | |||||
.map(p -> BeanUtil.copyProperties(p, ProvincialGovBusinessStripVO.class)) | |||||
.collect(Collectors.toList()); | .collect(Collectors.toList()); | ||||
} | } | ||||
} | } |
@@ -5,23 +5,20 @@ 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.baomidou.mybatisplus.extension.plugins.pagination.Page; | import com.baomidou.mybatisplus.extension.plugins.pagination.Page; | ||||
import com.google.common.collect.Lists; | |||||
import com.ningdatech.basic.model.PageVo; | |||||
import com.hz.pm.api.common.config.DingOrganizationProperties; | import com.hz.pm.api.common.config.DingOrganizationProperties; | ||||
import com.hz.pm.api.common.helper.RegionCacheHelper; | import com.hz.pm.api.common.helper.RegionCacheHelper; | ||||
import com.hz.pm.api.common.util.StrUtils; | import com.hz.pm.api.common.util.StrUtils; | ||||
import com.hz.pm.api.ding.constants.DingOrganizationContant; | |||||
import com.hz.pm.api.fiscal.service.ICompanyFiscalCodeService; | import com.hz.pm.api.fiscal.service.ICompanyFiscalCodeService; | ||||
import com.hz.pm.api.organization.model.entity.DingEmployeeInfo; | import com.hz.pm.api.organization.model.entity.DingEmployeeInfo; | ||||
import com.hz.pm.api.organization.model.entity.DingOrganization; | import com.hz.pm.api.organization.model.entity.DingOrganization; | ||||
import com.hz.pm.api.organization.model.po.ReqOrganizationListPO; | import com.hz.pm.api.organization.model.po.ReqOrganizationListPO; | ||||
import com.hz.pm.api.organization.model.po.ReqSynthesizePO; | |||||
import com.hz.pm.api.organization.model.vo.KeyTreeVO; | import com.hz.pm.api.organization.model.vo.KeyTreeVO; | ||||
import com.hz.pm.api.organization.model.vo.OrganizationTreeVO; | import com.hz.pm.api.organization.model.vo.OrganizationTreeVO; | ||||
import com.hz.pm.api.organization.model.vo.ResOrganizationListVO; | import com.hz.pm.api.organization.model.vo.ResOrganizationListVO; | ||||
import com.hz.pm.api.organization.service.IDingEmployeeInfoService; | import com.hz.pm.api.organization.service.IDingEmployeeInfoService; | ||||
import com.hz.pm.api.organization.service.IDingOrganizationService; | import com.hz.pm.api.organization.service.IDingOrganizationService; | ||||
import com.hz.pm.api.sys.model.dto.RegionDTO; | import com.hz.pm.api.sys.model.dto.RegionDTO; | ||||
import com.ningdatech.basic.model.PageVo; | |||||
import lombok.RequiredArgsConstructor; | import lombok.RequiredArgsConstructor; | ||||
import org.apache.commons.collections4.CollectionUtils; | import org.apache.commons.collections4.CollectionUtils; | ||||
import org.springframework.stereotype.Component; | import org.springframework.stereotype.Component; | ||||
@@ -138,50 +135,6 @@ public class OrganizationManage { | |||||
}).collect(Collectors.toList()); | }).collect(Collectors.toList()); | ||||
} | } | ||||
public List<KeyTreeVO> treeRubbishVOList(ReqSynthesizePO request) { | |||||
String organizationCode = request.getOrganizationCode(); | |||||
String organizationName = request.getOrganizationName(); | |||||
String employeeName = request.getEmployeeName(); | |||||
Boolean onlyUnit = request.getOnlyUnit(); | |||||
// 用户搜索为特殊逻辑 | |||||
if (StringUtils.isNotBlank(employeeName)) { | |||||
return treeEmployeeQuery(employeeName, organizationCode); | |||||
} | |||||
List<DingOrganization> dingOrganizationList = new ArrayList<>(); | |||||
List<String> organizationCodeList = new ArrayList<>(); | |||||
if (StringUtils.isNotBlank(organizationName)) { | |||||
dingOrganizationList = iDingOrganizationService.list(Wrappers.lambdaQuery(DingOrganization.class) | |||||
.like(DingOrganization::getOrganizationName, organizationName) | |||||
.in(onlyUnit, DingOrganization::getTypeCode, Lists.newArrayList(DingOrganizationContant.UNIT_TYPE, | |||||
DingOrganizationContant.HOLLOW))); | |||||
if (dingOrganizationList.isEmpty()) { | |||||
return new ArrayList<>(); | |||||
} | |||||
} else if (StrUtils.isBlank(organizationCode)) { | |||||
organizationCodeList = dingOrganizationProperties.getDeptVisibleScopes(); | |||||
} else { | |||||
organizationCodeList = CollectionUtil.toList(organizationCode); | |||||
} | |||||
if (CollectionUtil.isEmpty(dingOrganizationList)) { | |||||
dingOrganizationList = iDingOrganizationService.list(Wrappers.lambdaQuery(DingOrganization.class) | |||||
.in(DingOrganization::getOrganizationCode, organizationCodeList) | |||||
.notIn(onlyUnit, DingOrganization::getTypeCode, "GOV_INTERNAL_INSTITUTION")); | |||||
} | |||||
List<KeyTreeVO> orgKeyTreeVOList = dingOrganizationList.stream().map(r -> { | |||||
KeyTreeVO keyTreeVO = new KeyTreeVO(); | |||||
keyTreeVO.setTitle(r.getOrganizationName()); | |||||
keyTreeVO.setKey(r.getOrganizationCode()); | |||||
keyTreeVO.setType("ORGANIZATION"); | |||||
return keyTreeVO; | |||||
}).collect(Collectors.toList()); | |||||
treeVOList(request.getNeedMember(), orgKeyTreeVOList, onlyUnit); | |||||
return orgKeyTreeVOList; | |||||
} | |||||
public List<KeyTreeVO> treeEmployeeQuery(String employeeName, String organizationCode) { | public List<KeyTreeVO> treeEmployeeQuery(String employeeName, String organizationCode) { | ||||
List<String> parentCodeList = CollUtil.toList(organizationCode).stream() | List<String> parentCodeList = CollUtil.toList(organizationCode).stream() | ||||
.filter(StringUtils::isNotBlank) | .filter(StringUtils::isNotBlank) | ||||
@@ -272,53 +272,6 @@ public class IndicatorConfigManage { | |||||
} | } | ||||
/** | /** | ||||
* 装配 模板详情 | |||||
* | |||||
* @param templateDetails | |||||
* @return | |||||
*/ | |||||
private List<ProjectTemplateDetailVO> buildTemplateDetail(List<PerformanceIndicatorProjectTemplateDetail> templateDetails) { | |||||
List<ProjectTemplateDetailVO> res = Lists.newArrayList(); | |||||
//第一层是 一级的 | |||||
for (PerformanceIndicatorProjectTemplateDetail templateDetailFirst : templateDetails) { | |||||
if (PerformanceTemplateTypeEnum.FIRST_INDEX.getCode().equals(templateDetailFirst.getType())) { | |||||
ProjectTemplateDetailVO detailFirstVo = BeanUtil.copyProperties(templateDetailFirst, ProjectTemplateDetailVO.class); | |||||
List<ProjectTemplateDetailVO> firstList = Lists.newArrayList(); | |||||
for (PerformanceIndicatorProjectTemplateDetail templateDetailSecond : templateDetails) { | |||||
if (Objects.nonNull(templateDetailSecond.getParentId()) && | |||||
templateDetailSecond.getParentId().equals(templateDetailFirst.getId())) { | |||||
ProjectTemplateDetailVO detailSecondVo = BeanUtil.copyProperties(templateDetailSecond, ProjectTemplateDetailVO.class); | |||||
List<ProjectTemplateDetailVO> secondList = Lists.newArrayList(); | |||||
for (PerformanceIndicatorProjectTemplateDetail templateDetailThird : templateDetails) { | |||||
if (Objects.nonNull(templateDetailThird.getParentId()) && | |||||
templateDetailThird.getParentId().equals(templateDetailSecond.getId())) { | |||||
ProjectTemplateDetailVO detailThirdVo = BeanUtil.copyProperties(templateDetailThird, ProjectTemplateDetailVO.class); | |||||
List<ProjectTemplateDetailVO> thirdList = Lists.newArrayList(); | |||||
for (PerformanceIndicatorProjectTemplateDetail templateDetailFour : templateDetails) { | |||||
if (Objects.nonNull(templateDetailFour.getParentId()) && | |||||
templateDetailFour.getParentId().equals(templateDetailThird.getId())) { | |||||
ProjectTemplateDetailVO detailFourVo = BeanUtil.copyProperties(templateDetailFour, ProjectTemplateDetailVO.class); | |||||
thirdList.add(detailFourVo); | |||||
} | |||||
} | |||||
detailThirdVo.setChildren(thirdList); | |||||
secondList.add(detailThirdVo); | |||||
} | |||||
} | |||||
detailSecondVo.setChildren(secondList); | |||||
firstList.add(detailSecondVo); | |||||
} | |||||
} | |||||
detailFirstVo.setChildren(firstList); | |||||
res.add(detailFirstVo); | |||||
} | |||||
} | |||||
return res; | |||||
} | |||||
/** | |||||
* 删除项目模板 | * 删除项目模板 | ||||
* | * | ||||
* @param id | * @param id | ||||
@@ -1,34 +1,33 @@ | |||||
package com.hz.pm.api.projectdeclared.controller; | package com.hz.pm.api.projectdeclared.controller; | ||||
import javax.servlet.http.HttpServletResponse; | |||||
import com.hz.pm.api.projectdeclared.model.enumerization.ProjectDraftTypeEnum; | |||||
import com.ningdatech.log.annotation.WebLog; | |||||
import com.hz.pm.api.gov.manage.GovProjectCollectionManage; | |||||
import org.springframework.validation.annotation.Validated; | |||||
import org.springframework.web.bind.annotation.*; | |||||
import com.alibaba.fastjson.JSONObject; | |||||
import com.ningdatech.basic.model.PageVo; | |||||
import com.hz.pm.api.common.util.ExcelDownUtil; | import com.hz.pm.api.common.util.ExcelDownUtil; | ||||
import com.hz.pm.api.projectdeclared.manage.DeclaredProjectManage; | import com.hz.pm.api.projectdeclared.manage.DeclaredProjectManage; | ||||
import com.hz.pm.api.projectdeclared.manage.ProjectAdjustmentManage; | import com.hz.pm.api.projectdeclared.manage.ProjectAdjustmentManage; | ||||
import com.hz.pm.api.projectdeclared.model.dto.DeclaredProjectListParamDTO; | import com.hz.pm.api.projectdeclared.model.dto.DeclaredProjectListParamDTO; | ||||
import com.hz.pm.api.projectdeclared.model.dto.DefaultDeclaredDTO; | import com.hz.pm.api.projectdeclared.model.dto.DefaultDeclaredDTO; | ||||
import com.hz.pm.api.projectdeclared.model.dto.ProjectDraftSaveDTO; | import com.hz.pm.api.projectdeclared.model.dto.ProjectDraftSaveDTO; | ||||
import com.hz.pm.api.projectdeclared.model.enumerization.ProjectDraftTypeEnum; | |||||
import com.hz.pm.api.projectdeclared.model.vo.ProjectDraftVO; | import com.hz.pm.api.projectdeclared.model.vo.ProjectDraftVO; | ||||
import com.hz.pm.api.projectlib.model.req.ProjectListReq; | import com.hz.pm.api.projectlib.model.req.ProjectListReq; | ||||
import com.hz.pm.api.projectlib.model.vo.ProjectLibListItemVO; | import com.hz.pm.api.projectlib.model.vo.ProjectLibListItemVO; | ||||
import com.ningdatech.basic.model.PageVo; | |||||
import com.ningdatech.log.annotation.WebLog; | |||||
import io.swagger.annotations.Api; | import io.swagger.annotations.Api; | ||||
import io.swagger.annotations.ApiOperation; | import io.swagger.annotations.ApiOperation; | ||||
import lombok.RequiredArgsConstructor; | import lombok.RequiredArgsConstructor; | ||||
import lombok.extern.slf4j.Slf4j; | import lombok.extern.slf4j.Slf4j; | ||||
import org.springframework.validation.annotation.Validated; | |||||
import org.springframework.web.bind.annotation.*; | |||||
import javax.servlet.http.HttpServletResponse; | |||||
/** | /** | ||||
* @Classname DeclaredProjectController | |||||
* @Description 申报项目 | |||||
* @Date 2023/1/31 11:29 | |||||
* @Author PoffyZhang | |||||
* <p> | |||||
* DeclaredProjectController | |||||
* </p> | |||||
* | |||||
* @author WendyYang | |||||
* @since 16:22 2024/3/29 | |||||
*/ | */ | ||||
@Slf4j | @Slf4j | ||||
@Validated | @Validated | ||||
@@ -47,15 +46,6 @@ public class DeclaredProjectController { | |||||
return declaredProjectManage.projectLibList(req); | return declaredProjectManage.projectLibList(req); | ||||
} | } | ||||
@ApiOperation(value = "核心业务列表", notes = "核心业务列表") | |||||
@GetMapping("/core-biz") | |||||
public JSONObject bizList(@RequestParam(required = false) String businessName, | |||||
@RequestParam(required = false) Integer pageSize, | |||||
@RequestParam(required = false) Integer pageNumber, | |||||
@RequestParam(required = false) String orgCode) { | |||||
return declaredProjectManage.bizList(businessName, pageSize, pageNumber, orgCode); | |||||
} | |||||
@ApiOperation(value = "申报项目草稿箱列表", notes = "申报项目草稿箱列表") | @ApiOperation(value = "申报项目草稿箱列表", notes = "申报项目草稿箱列表") | ||||
@GetMapping("/draft") | @GetMapping("/draft") | ||||
public PageVo<ProjectDraftVO> draft(@ModelAttribute DeclaredProjectListParamDTO params) { | public PageVo<ProjectDraftVO> draft(@ModelAttribute DeclaredProjectListParamDTO params) { | ||||
@@ -110,10 +100,4 @@ public class DeclaredProjectController { | |||||
ExcelDownUtil.downXls(response, req, declaredProjectManage::exportList); | ExcelDownUtil.downXls(response, req, declaredProjectManage::exportList); | ||||
} | } | ||||
@PostMapping("/remove/{projectCode}") | |||||
@ApiOperation("申报项目删除-预审失败") | |||||
@WebLog("申报项目删除-预审失败") | |||||
public String remove(@PathVariable String projectCode) { | |||||
return declaredProjectManage.removeProject(projectCode); | |||||
} | |||||
} | } |
@@ -4,26 +4,19 @@ import cn.hutool.core.bean.BeanUtil; | |||||
import cn.hutool.core.collection.CollUtil; | import cn.hutool.core.collection.CollUtil; | ||||
import cn.hutool.core.util.StrUtil; | import cn.hutool.core.util.StrUtil; | ||||
import cn.hutool.json.JSONUtil; | import cn.hutool.json.JSONUtil; | ||||
import com.alibaba.excel.EasyExcel; | |||||
import com.alibaba.excel.EasyExcelFactory; | |||||
import com.alibaba.fastjson.JSON; | import com.alibaba.fastjson.JSON; | ||||
import com.alibaba.fastjson.JSONArray; | |||||
import com.alibaba.fastjson.JSONObject; | |||||
import com.alibaba.fastjson.TypeReference; | import com.alibaba.fastjson.TypeReference; | ||||
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; | import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; | ||||
import com.baomidou.mybatisplus.core.toolkit.Assert; | import com.baomidou.mybatisplus.core.toolkit.Assert; | ||||
import com.baomidou.mybatisplus.core.toolkit.Wrappers; | import com.baomidou.mybatisplus.core.toolkit.Wrappers; | ||||
import com.baomidou.mybatisplus.extension.plugins.pagination.Page; | import com.baomidou.mybatisplus.extension.plugins.pagination.Page; | ||||
import com.google.common.collect.Lists; | |||||
import com.hz.pm.api.common.enumeration.CommonEnum; | import com.hz.pm.api.common.enumeration.CommonEnum; | ||||
import com.hz.pm.api.common.enumeration.ProjectProcessStageEnum; | import com.hz.pm.api.common.enumeration.ProjectProcessStageEnum; | ||||
import com.hz.pm.api.common.helper.UserInfoHelper; | import com.hz.pm.api.common.helper.UserInfoHelper; | ||||
import com.hz.pm.api.common.model.constant.BizConst; | |||||
import com.hz.pm.api.common.util.ExcelDownUtil; | import com.hz.pm.api.common.util.ExcelDownUtil; | ||||
import com.hz.pm.api.common.util.ExcelExportStyle; | import com.hz.pm.api.common.util.ExcelExportStyle; | ||||
import com.hz.pm.api.external.model.enumeration.MhUnitTypeEnum; | import com.hz.pm.api.external.model.enumeration.MhUnitTypeEnum; | ||||
import com.hz.pm.api.gov.manage.GovProjectCollectionManage; | |||||
import com.hz.pm.api.irs.manage.ProjectIrsManage; | |||||
import com.hz.pm.api.projectdeclared.contant.DeclaredProjectConst; | |||||
import com.hz.pm.api.projectdeclared.model.dto.*; | import com.hz.pm.api.projectdeclared.model.dto.*; | ||||
import com.hz.pm.api.projectdeclared.model.entity.ProjectDraft; | import com.hz.pm.api.projectdeclared.model.entity.ProjectDraft; | ||||
import com.hz.pm.api.projectdeclared.model.enumerization.ProjectDraftTypeEnum; | import com.hz.pm.api.projectdeclared.model.enumerization.ProjectDraftTypeEnum; | ||||
@@ -55,7 +48,6 @@ import com.ningdatech.basic.function.VUtils; | |||||
import com.ningdatech.basic.model.PageVo; | import com.ningdatech.basic.model.PageVo; | ||||
import com.ningdatech.basic.util.CollUtils; | import com.ningdatech.basic.util.CollUtils; | ||||
import com.ningdatech.basic.util.NdDateUtils; | import com.ningdatech.basic.util.NdDateUtils; | ||||
import com.ningdatech.basic.util.StrPool; | |||||
import com.wflow.bean.entity.WflowModels; | import com.wflow.bean.entity.WflowModels; | ||||
import com.wflow.exception.BusinessException; | import com.wflow.exception.BusinessException; | ||||
import com.wflow.workflow.bean.dto.OrgInfoDTO; | import com.wflow.workflow.bean.dto.OrgInfoDTO; | ||||
@@ -65,22 +57,26 @@ import lombok.RequiredArgsConstructor; | |||||
import lombok.extern.slf4j.Slf4j; | import lombok.extern.slf4j.Slf4j; | ||||
import org.apache.commons.lang3.StringUtils; | import org.apache.commons.lang3.StringUtils; | ||||
import org.springframework.beans.BeanUtils; | import org.springframework.beans.BeanUtils; | ||||
import org.springframework.beans.factory.annotation.Value; | |||||
import org.springframework.stereotype.Component; | import org.springframework.stereotype.Component; | ||||
import org.springframework.transaction.annotation.Transactional; | import org.springframework.transaction.annotation.Transactional; | ||||
import javax.servlet.http.HttpServletResponse; | import javax.servlet.http.HttpServletResponse; | ||||
import java.io.IOException; | import java.io.IOException; | ||||
import java.time.LocalDateTime; | import java.time.LocalDateTime; | ||||
import java.util.*; | |||||
import java.util.Collections; | |||||
import java.util.List; | |||||
import java.util.Map; | |||||
import java.util.Objects; | |||||
import java.util.concurrent.atomic.AtomicInteger; | import java.util.concurrent.atomic.AtomicInteger; | ||||
import java.util.stream.Collectors; | import java.util.stream.Collectors; | ||||
/** | /** | ||||
* @Classname DeclaredProjectManage | |||||
* @Description | |||||
* @Date 2023/2/1 14:48 | |||||
* @Author PoffyZhang | |||||
* <p> | |||||
* DeclaredProjectManage | |||||
* </p> | |||||
* | |||||
* @author WendyYang | |||||
* @since 16:24 2024/3/29 | |||||
*/ | */ | ||||
@Component | @Component | ||||
@Slf4j | @Slf4j | ||||
@@ -88,38 +84,23 @@ import java.util.stream.Collectors; | |||||
public class DeclaredProjectManage { | public class DeclaredProjectManage { | ||||
private final IProjectService projectService; | private final IProjectService projectService; | ||||
private final ProjectLibManage projectLibManage; | private final ProjectLibManage projectLibManage; | ||||
private final IProjectDraftService projectDraftService; | private final IProjectDraftService projectDraftService; | ||||
private final ProcessInstanceService processService; | private final ProcessInstanceService processService; | ||||
private final ProcessModelManage processModelManage; | private final ProcessModelManage processModelManage; | ||||
private final DefaultDeclaredProjectManage defaultDeclaredProjectManage; | |||||
private final DefaultDeclaredProjectManage declaredProjectManage; | |||||
private final NoticeManage noticeManage; | private final NoticeManage noticeManage; | ||||
private final UserInfoHelper userInfoHelper; | private final UserInfoHelper userInfoHelper; | ||||
private final MhUnitCache mhUnitCache; | private final MhUnitCache mhUnitCache; | ||||
private final ProjectIrsManage projectIrsManage; | |||||
private final GovProjectCollectionManage collectionManage; | |||||
@Value("${spring.profiles.active}") | |||||
private String active; | |||||
/** | /** | ||||
* 新项目 启动实例 | * 新项目 启动实例 | ||||
* | * | ||||
* @param dto | |||||
* @return | |||||
* @param req \ | |||||
* @return \ | |||||
*/ | */ | ||||
@Transactional(rollbackFor = Exception.class) | @Transactional(rollbackFor = Exception.class) | ||||
public synchronized String startTheProcess(DefaultDeclaredDTO dto) { | |||||
public synchronized String startTheProcess(DefaultDeclaredDTO req) { | |||||
UserInfoDetails user = LoginUserUtil.loginUserDetail(); | UserInfoDetails user = LoginUserUtil.loginUserDetail(); | ||||
WflowModels model = processModelManage.getWflowModels(ProjectProcessStageEnum.ORG_INTERNAL_APPROVAL_PROCESS, | WflowModels model = processModelManage.getWflowModels(ProjectProcessStageEnum.ORG_INTERNAL_APPROVAL_PROCESS, | ||||
@@ -128,15 +109,15 @@ public class DeclaredProjectManage { | |||||
throw BizException.wrap("找不到单位流程配置"); | throw BizException.wrap("找不到单位流程配置"); | ||||
} | } | ||||
ProjectDTO projectInfo = dto.getProjectInfo(); | |||||
ProjectDTO projectInfo = req.getProjectInfo(); | |||||
projectInfo.setBuildOrgCode(user.getMhUnitIdStr()); | projectInfo.setBuildOrgCode(user.getMhUnitIdStr()); | ||||
projectInfo.setBuildOrgName(user.getMhUnitName()); | projectInfo.setBuildOrgName(user.getMhUnitName()); | ||||
//项目名称去重 | //项目名称去重 | ||||
defaultDeclaredProjectManage.checkDuplication(projectInfo); | |||||
declaredProjectManage.checkDuplication(projectInfo); | |||||
//判断申报金额 是否等于总的 判断年度支付金额 是否等于总金额 | //判断申报金额 是否等于总的 判断年度支付金额 是否等于总金额 | ||||
defaultDeclaredProjectManage.checkAmount(projectInfo); | |||||
declaredProjectManage.checkAmount(projectInfo); | |||||
//写死 是否有主管单位 | //写死 是否有主管单位 | ||||
projectInfo.setIsHigherSuperOrg(CommonEnum.YES.getCode()); | projectInfo.setIsHigherSuperOrg(CommonEnum.YES.getCode()); | ||||
@@ -156,21 +137,21 @@ public class DeclaredProjectManage { | |||||
ProcessStartParamsVo params = new ProcessStartParamsVo(); | ProcessStartParamsVo params = new ProcessStartParamsVo(); | ||||
params.setUser(defaultDeclaredProjectManage.buildUser(user)); | |||||
params.setUser(declaredProjectManage.buildUser(user)); | |||||
params.setProcessUsers(Collections.emptyMap()); | params.setProcessUsers(Collections.emptyMap()); | ||||
//放入条件判断的项目字段 | //放入条件判断的项目字段 | ||||
ProjectConditionDTO conditionDto = new ProjectConditionDTO(); | ProjectConditionDTO conditionDto = new ProjectConditionDTO(); | ||||
BeanUtils.copyProperties(dto.getProjectInfo(), conditionDto); | |||||
dto.getFormData().putAll( | |||||
BeanUtils.copyProperties(req.getProjectInfo(), conditionDto); | |||||
req.getFormData().putAll( | |||||
JSON.parseObject(JSON.toJSONString(conditionDto), new TypeReference<Map<String, Object>>() { | JSON.parseObject(JSON.toJSONString(conditionDto), new TypeReference<Map<String, Object>>() { | ||||
}) | }) | ||||
); | ); | ||||
params.setFormData(dto.getFormData()); | |||||
params.setFormData(req.getFormData()); | |||||
//开始申报 | //开始申报 | ||||
// 获取发起单位、发起单位主管单位、发起单位上级主管条线单位信息 | // 获取发起单位、发起单位主管单位、发起单位上级主管条线单位信息 | ||||
Project project = new Project(); | Project project = new Project(); | ||||
BeanUtils.copyProperties(projectInfo, project); | BeanUtils.copyProperties(projectInfo, project); | ||||
Map<String, OrgInfoDTO> orgModelMap = defaultDeclaredProjectManage.buildOrgModelMap(user.getUserId(), project); | |||||
Map<String, OrgInfoDTO> orgModelMap = declaredProjectManage.buildOrgModelMap(user.getUserId(), project); | |||||
String instanceId = processService.startProcessLs(model, params, orgModelMap); | String instanceId = processService.startProcessLs(model, params, orgModelMap); | ||||
log.info("申报项目成功 【{}】", instanceId); | log.info("申报项目成功 【{}】", instanceId); | ||||
@@ -211,7 +192,7 @@ public class DeclaredProjectManage { | |||||
if (StringUtils.isNotBlank(projectDto.getProjectName()) && | if (StringUtils.isNotBlank(projectDto.getProjectName()) && | ||||
!projectDto.getProjectName().equals(projectInfo.getProjectName())) { | !projectDto.getProjectName().equals(projectInfo.getProjectName())) { | ||||
projectDto.setProjectCode(projectInfo.getProjectCode()); | projectDto.setProjectCode(projectInfo.getProjectCode()); | ||||
defaultDeclaredProjectManage.checkDuplication(projectDto); | |||||
declaredProjectManage.checkDuplication(projectDto); | |||||
} | } | ||||
//写死 是否有主管单位 | //写死 是否有主管单位 | ||||
@@ -227,7 +208,7 @@ public class DeclaredProjectManage { | |||||
} | } | ||||
//判断申报金额 是否等于总的 判断年度支付金额 是否等于总金额 | //判断申报金额 是否等于总的 判断年度支付金额 是否等于总金额 | ||||
defaultDeclaredProjectManage.checkAmount(projectDto); | |||||
declaredProjectManage.checkAmount(projectDto); | |||||
WflowModels model = processModelManage.getWflowModels(ProjectProcessStageEnum.ORG_INTERNAL_APPROVAL_PROCESS, | WflowModels model = processModelManage.getWflowModels(ProjectProcessStageEnum.ORG_INTERNAL_APPROVAL_PROCESS, | ||||
user.getMhUnitId()); | user.getMhUnitId()); | ||||
@@ -242,16 +223,16 @@ public class DeclaredProjectManage { | |||||
.throwMessage("提交失败 该项目不是 单位内部拒绝审核状态或者未立项阶段"); | .throwMessage("提交失败 该项目不是 单位内部拒绝审核状态或者未立项阶段"); | ||||
ProcessStartParamsVo params = new ProcessStartParamsVo(); | ProcessStartParamsVo params = new ProcessStartParamsVo(); | ||||
params.setUser(defaultDeclaredProjectManage.buildUser(user)); | |||||
params.setUser(declaredProjectManage.buildUser(user)); | |||||
params.setProcessUsers(Collections.emptyMap()); | params.setProcessUsers(Collections.emptyMap()); | ||||
//把条件值给放入工作流 | //把条件值给放入工作流 | ||||
defaultDeclaredProjectManage.buildCondition(params, dto); | |||||
declaredProjectManage.buildCondition(params, dto); | |||||
// 获取发起单位、发起单位主管单位、发起单位上级主管条线单位信息 | // 获取发起单位、发起单位主管单位、发起单位上级主管条线单位信息 | ||||
Project project = new Project(); | Project project = new Project(); | ||||
BeanUtils.copyProperties(projectDto, project); | BeanUtils.copyProperties(projectDto, project); | ||||
Map<String, OrgInfoDTO> orgModelMap = defaultDeclaredProjectManage.buildOrgModelMap(user.getUserId(), project); | |||||
Map<String, OrgInfoDTO> orgModelMap = declaredProjectManage.buildOrgModelMap(user.getUserId(), project); | |||||
String instanceId = processService.startProcessLs(model, params, orgModelMap); | String instanceId = processService.startProcessLs(model, params, orgModelMap); | ||||
log.info("重新申报项目成功 【{}】", instanceId); | log.info("重新申报项目成功 【{}】", instanceId); | ||||
@@ -421,7 +402,7 @@ public class DeclaredProjectManage { | |||||
ExcelDownUtil.setFileName(fileName, response); | ExcelDownUtil.setFileName(fileName, response); | ||||
//数据导出处理函数 | //数据导出处理函数 | ||||
try { | try { | ||||
EasyExcel.write(response.getOutputStream(), DeclaredProjectExportDTO.class) | |||||
EasyExcelFactory.write(response.getOutputStream(), DeclaredProjectExportDTO.class) | |||||
.autoCloseStream(false) | .autoCloseStream(false) | ||||
.registerWriteHandler(ExcelExportStyle.formalStyle()) | .registerWriteHandler(ExcelExportStyle.formalStyle()) | ||||
.sheet(fileName) | .sheet(fileName) | ||||
@@ -431,73 +412,4 @@ public class DeclaredProjectManage { | |||||
} | } | ||||
} | } | ||||
/** | |||||
* 查询 核心业务 | |||||
* | |||||
* @param businessName \ | |||||
* @return \ | |||||
*/ | |||||
public JSONObject bizList(String businessName, Integer limit, Integer page, String orgCode) { | |||||
JSONObject jsonObject = new JSONObject(); | |||||
UserInfoDetails user = LoginUserUtil.loginUserDetail(); | |||||
if (BizConst.DEV.equals(active)) { | |||||
jsonObject = JSONObject.parseObject(DeclaredProjectConst.Biz.CORE_BIZ); | |||||
if (CollUtil.isEmpty(jsonObject)) { | |||||
return jsonObject; | |||||
} | |||||
if (StringUtils.isNotBlank(businessName)) { | |||||
JSONArray dataArray = jsonObject.getJSONArray(BizConst.RESPONSE_KEY_DATA); | |||||
if (CollUtil.isEmpty(dataArray)) { | |||||
return new JSONObject(); | |||||
} | |||||
Iterator<Object> iter = dataArray.stream().iterator(); | |||||
JSONArray dataArrayRes = new JSONArray(); | |||||
while (iter.hasNext()) { | |||||
JSONObject value = (JSONObject) iter.next(); | |||||
String businessValue = value.getString("matterName"); | |||||
if (StringUtils.isNotBlank(businessValue) && businessValue.contains(businessName)) { | |||||
dataArrayRes.add(value); | |||||
} | |||||
} | |||||
jsonObject.put("data", dataArrayRes); | |||||
jsonObject.put("total", dataArrayRes.size()); | |||||
} | |||||
} else if (BizConst.PRE.equals(active) || | |||||
BizConst.PROD.equals(active)) { | |||||
if (StringUtils.isNotBlank(orgCode)) { | |||||
String[] orgCodes = orgCode.split(StrPool.COMMA); | |||||
JSONArray finalArray = new JSONArray(); | |||||
for (String og : orgCodes) { | |||||
JSONObject res = projectIrsManage.searchCoreBiz(businessName, og, limit, page); | |||||
if (Objects.nonNull(res)) { | |||||
JSONArray dataArray = res.getJSONArray(BizConst.RESPONSE_KEY_DATA); | |||||
if (CollUtil.isNotEmpty(dataArray)) { | |||||
finalArray.addAll(dataArray); | |||||
} | |||||
} | |||||
} | |||||
jsonObject.put("data", finalArray); | |||||
jsonObject.put("total", finalArray.size()); | |||||
} else { | |||||
jsonObject = projectIrsManage.searchCoreBiz(businessName, user.getMhUnitIdStr(), limit, page); | |||||
} | |||||
} | |||||
return jsonObject; | |||||
} | |||||
/** | |||||
* 预审失败的时候 可以删除项目 | |||||
* | |||||
* @param projectCode \ | |||||
*/ | |||||
@Transactional | |||||
public String removeProject(String projectCode) { | |||||
Project project = projectService.getProjectByCode(projectCode); | |||||
Assert.notNull(project, "该项目不存在"); | |||||
VUtils.isTrue(Objects.isNull(project.getStatus()) || | |||||
!ProjectStatusEnum.PREQUALIFICATION_FAILED.getCode().equals(project.getStatus())) | |||||
.throwMessage("不是预审不通过 状态 不能删除!"); | |||||
return collectionManage.removeProject(Lists.newArrayList(projectCode)); | |||||
} | |||||
} | } |
@@ -1,136 +0,0 @@ | |||||
package com.hz.pm.api.projectdeclared.manage; | |||||
import cn.hutool.core.bean.BeanUtil; | |||||
import cn.hutool.core.collection.CollUtil; | |||||
import com.alibaba.fastjson.JSON; | |||||
import com.alibaba.fastjson.JSONArray; | |||||
import com.alibaba.fastjson.JSONObject; | |||||
import com.google.common.base.Joiner; | |||||
import com.ningdatech.basic.util.CollUtils; | |||||
import com.hz.pm.api.common.model.constant.BizConst; | |||||
import com.hz.pm.api.common.util.CryptUtils; | |||||
import com.hz.pm.api.common.util.HttpUtil; | |||||
import com.hz.pm.api.irs.manage.AppIrsManage; | |||||
import com.hz.pm.api.irs.model.dto.ApiApplyDTO; | |||||
import com.hz.pm.api.irs.model.dto.ForwardDTO; | |||||
import com.hz.pm.api.irs.utils.RefreshTokenUtil; | |||||
import com.hz.pm.api.projectdeclared.model.entity.IrsApplication; | |||||
import com.hz.pm.api.projectdeclared.model.entity.NdPiotTasks; | |||||
import com.hz.pm.api.projectdeclared.model.vo.IrsApplicationVO; | |||||
import com.hz.pm.api.projectdeclared.model.vo.PiotTasksVO; | |||||
import com.hz.pm.api.projectdeclared.service.INdPiotTasksService; | |||||
import com.hz.pm.api.projectdeclared.service.IrsApplicationService; | |||||
import lombok.RequiredArgsConstructor; | |||||
import lombok.extern.slf4j.Slf4j; | |||||
import org.springframework.beans.factory.annotation.Value; | |||||
import org.springframework.http.ResponseEntity; | |||||
import org.springframework.stereotype.Component; | |||||
import org.springframework.web.client.RestTemplate; | |||||
import java.security.NoSuchAlgorithmException; | |||||
import java.util.Collections; | |||||
import java.util.List; | |||||
import java.util.Map; | |||||
import java.util.stream.Collectors; | |||||
/** | |||||
* @Classname IrsManage | |||||
* @Description | |||||
* @Date 2023/3/1 14:48 | |||||
* @Author PoffyZhang | |||||
*/ | |||||
@Component | |||||
@Slf4j | |||||
@RequiredArgsConstructor | |||||
public class IrsManage { | |||||
@Value("${irs.is-search-app}") | |||||
private Boolean isSearchApp; | |||||
private final IrsApplicationService irsApplicationService; | |||||
private final INdPiotTasksService piotTasksService; | |||||
private final AppIrsManage appIrsManage; | |||||
public List<IrsApplicationVO> applicationList(String areaCode) { | |||||
//不请求IRS | |||||
if(!isSearchApp) { | |||||
List<IrsApplication> list = irsApplicationService.list(); | |||||
if(CollUtil.isEmpty(list)){ | |||||
return Collections.emptyList(); | |||||
} | |||||
return CollUtils.convert(list,app -> BeanUtil.copyProperties(app,IrsApplicationVO.class)); | |||||
} | |||||
try { | |||||
ApiApplyDTO apiApplay = new ApiApplyDTO(); | |||||
apiApplay.setAreaCode(areaCode); | |||||
JSONArray jsonArray = appIrsManage.searchApps(apiApplay); | |||||
if(CollUtil.isNotEmpty(jsonArray)){ | |||||
return jsonArray.stream().map(apply -> { | |||||
JSONObject jsonObject = JSON.parseObject(JSON.toJSONString(apply)); | |||||
IrsApplicationVO vo = new IrsApplicationVO(); | |||||
vo.setApplicationCode(jsonObject.getString("appId")); | |||||
vo.setApplicationName(jsonObject.getString("name")); | |||||
return vo; | |||||
}).collect(Collectors.toList()); | |||||
} | |||||
} catch (NoSuchAlgorithmException e) { | |||||
throw new RuntimeException(e); | |||||
} | |||||
return Collections.emptyList(); | |||||
} | |||||
public List<PiotTasksVO> listPiotTasks() { | |||||
List<NdPiotTasks> list = piotTasksService.list(); | |||||
if(CollUtil.isEmpty(list)){ | |||||
return Collections.emptyList(); | |||||
} | |||||
return CollUtils.convert(list,task -> BeanUtil.copyProperties(task,PiotTasksVO.class)); | |||||
} | |||||
public String getCreditCode() throws NoSuchAlgorithmException { | |||||
String appSecret = RefreshTokenUtil.refrshByAppScret(); | |||||
String appkey = "8fb070a1f1194b2ebffdc6f596bb8a96"; | |||||
String dataName = "丽水市大数据"; | |||||
long timestamp = System.currentTimeMillis(); | |||||
String sign = CryptUtils.MD5Encode(appkey + appSecret + timestamp); | |||||
String url = "https://interface.ls.local/a/api/shared/1689239219101?data_name=" + dataName + "&appKey=" + appkey + | |||||
"&sign=" + sign + "&requestTime=" + timestamp; | |||||
RestTemplate restTemplate = new RestTemplate(HttpUtil.generateHttpRequestFactory()); | |||||
log.info("url:" + url); | |||||
ResponseEntity<String> forEntity = restTemplate.getForEntity(url, String.class); | |||||
log.info(forEntity.getBody()); | |||||
return forEntity.getBody(); | |||||
} | |||||
/** | |||||
* 转发IRS请求 | |||||
* @param dto | |||||
* @return | |||||
*/ | |||||
public String forward(ForwardDTO dto) { | |||||
try{ | |||||
String url = dto.getUrl(); | |||||
url = url + "?" + asUrlParams(dto.getData()); | |||||
log.info("url :{}",url); | |||||
RestTemplate restTemplate = new RestTemplate(); | |||||
ResponseEntity<String> forEntity = restTemplate.getForEntity(url, String.class); | |||||
log.info(forEntity.getBody()); | |||||
return forEntity.getBody(); | |||||
}catch (Exception e){ | |||||
log.error("e:" + e); | |||||
} | |||||
return BizConst.OP_FAIL; | |||||
} | |||||
public static String asUrlParams(Map<String, Object> source){ | |||||
return Joiner.on("&") | |||||
// 用指定符号代替空值,key 或者value 为null都会被替换 | |||||
.useForNull("") | |||||
.withKeyValueSeparator("=") | |||||
.join(source); | |||||
} | |||||
} |
@@ -1,7 +1,6 @@ | |||||
package com.hz.pm.api.projectdeclared.service; | package com.hz.pm.api.projectdeclared.service; | ||||
import cn.hutool.core.collection.CollUtil; | import cn.hutool.core.collection.CollUtil; | ||||
import cn.hutool.core.util.ArrayUtil; | |||||
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; | import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; | ||||
import com.baomidou.mybatisplus.core.toolkit.Wrappers; | import com.baomidou.mybatisplus.core.toolkit.Wrappers; | ||||
import com.baomidou.mybatisplus.extension.service.IService; | import com.baomidou.mybatisplus.extension.service.IService; | ||||
@@ -9,7 +8,10 @@ import com.hz.pm.api.projectdeclared.model.entity.Purchase; | |||||
import com.hz.pm.api.projectlib.model.enumeration.TenderStatusEnum; | import com.hz.pm.api.projectlib.model.enumeration.TenderStatusEnum; | ||||
import com.ningdatech.basic.util.CollUtils; | import com.ningdatech.basic.util.CollUtils; | ||||
import java.util.*; | |||||
import java.util.Collection; | |||||
import java.util.Collections; | |||||
import java.util.List; | |||||
import java.util.Set; | |||||
import java.util.stream.Collectors; | import java.util.stream.Collectors; | ||||
/** | /** | ||||
@@ -53,13 +53,13 @@ import java.util.stream.Collectors; | |||||
@Slf4j | @Slf4j | ||||
public class ApplicationManage { | public class ApplicationManage { | ||||
@Value("${irs.app-report.url}") | |||||
@Value("${irs.app-report.url:}") | |||||
private String url; | private String url; | ||||
@Value("${irs.app-report.appKey}") | |||||
@Value("${irs.app-report.appKey:}") | |||||
private String appKey; | private String appKey; | ||||
@Value("${irs.app-report.appScret}") | |||||
@Value("${irs.app-report.appScret:}") | |||||
private String appScret; | private String appScret; | ||||
private final IProjectApplicationService applicationService; | private final IProjectApplicationService applicationService; | ||||
@@ -54,21 +54,21 @@ public class JoinReviewProvincialBureauServiceImpl implements IJoinReviewProvinc | |||||
@Resource | @Resource | ||||
private IRefreshTokenService refreshTokenService; | private IRefreshTokenService refreshTokenService; | ||||
@Value("${irs.interface-refresh.request-token-url}") | |||||
@Value("${irs.interface-refresh.request-token-url:}") | |||||
private String govRequestTokenUrl; | private String govRequestTokenUrl; | ||||
@Value("${irs.interface-refresh.refresh-token-url}") | |||||
@Value("${irs.interface-refresh.refresh-token-url:}") | |||||
private String govRefreshTokenUrl; | private String govRefreshTokenUrl; | ||||
@Value("${irs.province-gov.url}") | |||||
@Value("${irs.province-gov.url:}") | |||||
private String govUrl; | private String govUrl; | ||||
@Value("${irs.province-gov.appSecret}") | |||||
@Value("${irs.province-gov.appSecret:}") | |||||
private String govAppSecret; | private String govAppSecret; | ||||
@Value("${irs.province-gov.appKey}") | |||||
@Value("${irs.province-gov.appKey:}") | |||||
private String govAppKey; | private String govAppKey; | ||||
@Value("${irs.province-gov.interfaceName}") | |||||
@Value("${irs.province-gov.interfaceName:}") | |||||
private String interfaceName; | private String interfaceName; | ||||
/** | /** | ||||
@@ -1,61 +0,0 @@ | |||||
package com.hz.pm.api.scheduler.task; | |||||
import cn.hutool.core.date.StopWatch; | |||||
import com.baomidou.mybatisplus.core.toolkit.Wrappers; | |||||
import com.google.common.collect.Lists; | |||||
import com.hz.pm.api.ding.constants.DingOrganizationContant; | |||||
import com.hz.pm.api.ding.task.EmployeeBatchGetTask; | |||||
import com.hz.pm.api.organization.model.entity.DingOrganization; | |||||
import com.hz.pm.api.organization.service.IDingOrganizationService; | |||||
import lombok.RequiredArgsConstructor; | |||||
import lombok.extern.slf4j.Slf4j; | |||||
import org.springframework.beans.factory.annotation.Value; | |||||
import org.springframework.scheduling.annotation.Scheduled; | |||||
import org.springframework.stereotype.Component; | |||||
import java.net.InetAddress; | |||||
import java.net.UnknownHostException; | |||||
import java.util.List; | |||||
/** | |||||
* @author liuxinxin | |||||
* @date 2023/1/12 上午9:53 | |||||
* 批量获取/更新部门信息任务 | |||||
*/ | |||||
@Component | |||||
@Slf4j | |||||
@RequiredArgsConstructor | |||||
public class BatchUpdateEmployeeTask { | |||||
@Value("${hostname}") | |||||
private String HOST_NAME; | |||||
private final EmployeeBatchGetTask employeeBatchGetTask; | |||||
private final IDingOrganizationService organizationService; | |||||
//@Scheduled(cron = "0 45 1 * * ?") | |||||
public void doTask() throws UnknownHostException { | |||||
if (!HOST_NAME.equals(InetAddress.getLocalHost().getHostName())) { | |||||
return; | |||||
} | |||||
log.info("=========== 每日更新 浙政钉员工信息 (根据现有单位) ======== 任务开始"); | |||||
StopWatch stopWatch = new StopWatch(); | |||||
stopWatch.start(); | |||||
// 1.查出浙政钉 所有单位 | |||||
List<DingOrganization> units = organizationService.list(Wrappers.lambdaQuery(DingOrganization.class) | |||||
.in(DingOrganization::getTypeCode, Lists.newArrayList( | |||||
DingOrganizationContant.UNIT_TYPE,DingOrganizationContant.GOV_TEMPORARY | |||||
))); | |||||
log.info("需要更新的 单位数量为 {}",units.size()); | |||||
for(DingOrganization organization : units){ | |||||
log.info("当前单位是 {}",organization.getOrganizationName()); | |||||
employeeBatchGetTask.batchGetEmployeeTaskByOrdCode(organization.getOrganizationCode()); | |||||
} | |||||
stopWatch.stop(); | |||||
log.info("=========== 每日更新 浙政钉员工信息 (根据现有单位) ======== 任务结束 {}s", stopWatch.getTotalTimeSeconds()); | |||||
} | |||||
} |
@@ -1,14 +0,0 @@ | |||||
package com.hz.pm.api.scheduler.task; | |||||
import org.springframework.stereotype.Component; | |||||
/** | |||||
* @author liuxinxin | |||||
* @date 2023/1/12 上午9:53 | |||||
* 批量获取/更新部门信息任务 | |||||
*/ | |||||
@Component | |||||
public class BatchUpdateOrganizationTask { | |||||
} |
@@ -44,7 +44,7 @@ public class CheckProvincialReviewResultTask { | |||||
private final IProjectService projectService; | private final IProjectService projectService; | ||||
private final StateMachineUtil stateMachineUtil; | private final StateMachineUtil stateMachineUtil; | ||||
@Value("${hostname}") | |||||
@Value("${hostname:}") | |||||
private String HOST_NAME; | private String HOST_NAME; | ||||
@Value("${spring.profiles.active}") | @Value("${spring.profiles.active}") | ||||
@@ -64,7 +64,7 @@ import java.util.stream.Stream; | |||||
@RequiredArgsConstructor | @RequiredArgsConstructor | ||||
public class CockpitStatsStatisticsTask { | public class CockpitStatsStatisticsTask { | ||||
@Value("${hostname}") | |||||
@Value("${hostname:}") | |||||
public String HOST; | public String HOST; | ||||
@Value("${spring.profiles.active}") | @Value("${spring.profiles.active}") | ||||
@@ -56,7 +56,7 @@ import java.util.stream.Collectors; | |||||
@RequiredArgsConstructor | @RequiredArgsConstructor | ||||
public class EarlyWarningInstanceNotStartTask { | public class EarlyWarningInstanceNotStartTask { | ||||
@Value("${hostname}") | |||||
@Value("${hostname:}") | |||||
private String HOST_NAME; | private String HOST_NAME; | ||||
private final IEarlyWarningService earlyWarningService; | private final IEarlyWarningService earlyWarningService; | ||||
@@ -65,8 +65,6 @@ public class EarlyWarningInstanceNotStartTask { | |||||
private final EarlyWarningManage earlyWarningManage; | private final EarlyWarningManage earlyWarningManage; | ||||
private final IContractService contractService; | |||||
private final IOperationService operationService; | private final IOperationService operationService; | ||||
private final IUserInfoService userInfoService; | private final IUserInfoService userInfoService; | ||||
@@ -55,7 +55,7 @@ public class EarlyWarningProjectTask { | |||||
private final TaskService taskService; | private final TaskService taskService; | ||||
@Value("${hostname}") | |||||
@Value("${hostname:}") | |||||
private String HOST_NAME; | private String HOST_NAME; | ||||
@Scheduled(fixedDelay = 6000 * 120) | @Scheduled(fixedDelay = 6000 * 120) | ||||
@@ -37,7 +37,7 @@ public class ProjectStatusFlowTask { | |||||
private final IProjectService projectService; | private final IProjectService projectService; | ||||
@Value("${hostname}") | |||||
@Value("${hostname:}") | |||||
private String HOST_NAME; | private String HOST_NAME; | ||||
@Scheduled(cron = "0 */1 * * * ?") | @Scheduled(cron = "0 */1 * * * ?") | ||||
@@ -1,475 +0,0 @@ | |||||
package com.hz.pm.api.scheduler.task; | |||||
import cn.hutool.core.collection.CollUtil; | |||||
import cn.hutool.core.date.StopWatch; | |||||
import com.baomidou.mybatisplus.core.toolkit.Wrappers; | |||||
import com.ningdatech.basic.exception.BizException; | |||||
import com.ningdatech.basic.model.PageVo; | |||||
import com.ningdatech.file.service.FileService; | |||||
import com.hz.pm.api.common.model.constant.BizConst; | |||||
import com.hz.pm.api.gov.manage.GovProjectCollectionManage; | |||||
import com.hz.pm.api.gov.model.entity.*; | |||||
import com.hz.pm.api.gov.model.vo.GovBizProjectDetailVO; | |||||
import com.hz.pm.api.gov.model.vo.GovBizProjectListVO; | |||||
import com.hz.pm.api.gov.model.vo.GovOperationProjectBaseinfoVO; | |||||
import com.hz.pm.api.gov.model.vo.GovOperationProjectDetailVO; | |||||
import com.hz.pm.api.gov.service.*; | |||||
import com.hz.pm.api.gov.utils.ProjectConvertUtil; | |||||
import com.hz.pm.api.projectlib.manage.ProjectLibManage; | |||||
import com.hz.pm.api.projectlib.model.entity.Project; | |||||
import com.hz.pm.api.projectlib.model.req.ProjectListReq; | |||||
import com.hz.pm.api.projectlib.model.vo.ProjectDetailVO; | |||||
import com.hz.pm.api.projectlib.service.IProjectService; | |||||
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.net.InetAddress; | |||||
import java.net.UnknownHostException; | |||||
import java.util.List; | |||||
import java.util.Objects; | |||||
import java.util.StringJoiner; | |||||
/** | |||||
* @author ZPF | |||||
* @since 2023/08/31 18:16 | |||||
*/ | |||||
@Slf4j | |||||
@Component | |||||
@RequiredArgsConstructor | |||||
public class SynProjectCollectionTask { | |||||
@Value("${hostname}") | |||||
public String HOST; | |||||
@Value("${spring.profiles.active}") | |||||
public String active; | |||||
private final GovProjectCollectionManage collectionManage; | |||||
private final IGovBizProjectBaseinfoService baseinfoService; | |||||
private final IGovBizProjectApplyService applyService; | |||||
private final IGovBizProjectApproveService approveService; | |||||
private final IGovBizProjectCimplementService cimplementService; | |||||
private final IGovBizProjectMimplementService mimplementService; | |||||
private final IGovBizProjectProcureService procureService; | |||||
private final IProjectService projectService; | |||||
private final ProjectLibManage projectLibManage; | |||||
private final FileService fileService; | |||||
private static final Integer PAGE_NUMBER = 1; | |||||
/** | |||||
* 前置机每天晚上10点自动清空,第二天早上6点获取数据 | |||||
* 定时同步前置机数据 每天1点开始执行一次 | |||||
*/ | |||||
@Scheduled(cron = "0 0 1 * * ?") | |||||
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; | |||||
} | |||||
StopWatch stopWatch = new StopWatch(); | |||||
stopWatch.start(); | |||||
log.info("数据同步任务开始之前 先删除前置机上的所有数据"); | |||||
collectionManage.deleteAll(); | |||||
//全量项目归集 | |||||
ProjectListReq req = new ProjectListReq(); | |||||
Long count = collectionManage.count(req) + collectionManage.operationCount(req); | |||||
if (count == 0L) { | |||||
log.info("本次同步无数据"); | |||||
return; | |||||
} | |||||
req.setPageNumber(PAGE_NUMBER); | |||||
req.setPageSize(count.intValue()); | |||||
PageVo<GovBizProjectListVO> projectCollectionPage = collectionManage.list(req); | |||||
log.info("projectCollections size :{}", projectCollectionPage.getTotal()); | |||||
for (GovBizProjectListVO vo : projectCollectionPage.getRecords()) { | |||||
GovBizProjectDetailVO projectDetail = collectionManage.detail(vo.getBaseProjId()); | |||||
collectionManage.pushProjectVo(projectDetail); | |||||
} | |||||
//2.运维备案项目 | |||||
PageVo<GovBizProjectListVO> operationList = collectionManage.operationList(req); | |||||
log.info("operation list size :{}", operationList.getTotal()); | |||||
for (GovBizProjectListVO vo : operationList.getRecords()) { | |||||
GovOperationProjectDetailVO operationDetail = collectionManage.operationDetail(vo.getBaseProjId()); | |||||
GovOperationProjectBaseinfoVO baseinfo = operationDetail.getBaseinfo(); | |||||
if (Objects.isNull(baseinfo) || Objects.isNull(baseinfo.getPush()) || | |||||
Boolean.FALSE.equals(baseinfo.getPush())) { | |||||
log.info("此运维项目不用推送:" + vo.getBaseProjId()); | |||||
} | |||||
collectionManage.pushProjectVo(operationDetail); | |||||
} | |||||
//3.申报项目 需要推送的项目 | |||||
List<Project> projects = projectService.list(Wrappers.lambdaQuery(Project.class) | |||||
.eq(Project::getNewest, Boolean.TRUE) | |||||
.eq(Project::getPush, Boolean.TRUE)); | |||||
log.info("projects need push size :{}", projects.size()); | |||||
for (Project project : projects) { | |||||
ProjectDetailVO projectDetailVO = projectLibManage.detailProjectCode(project.getProjectCode()); | |||||
GovBizProjectDetailVO vo = ProjectConvertUtil.declaredToCollection(projectDetailVO, fileService); | |||||
if (Objects.nonNull(vo)) { | |||||
collectionManage.pushProjectVo(vo); | |||||
} | |||||
} | |||||
stopWatch.stop(); | |||||
log.info("数据同步任务结束====={}s", stopWatch.getTotalTimeSeconds()); | |||||
} | |||||
/** | |||||
* 把库存的项目归集里 没有转换PDF文件的 都转换一遍 存入数据库 | |||||
*/ | |||||
public void stagingConvertPdf(String projId) { | |||||
log.info("项目归集库存转换PDF任务开始====="); | |||||
StopWatch stopWatch = new StopWatch(); | |||||
stopWatch.start(); | |||||
GovBizProjectBaseinfo base = baseinfoService.getOne(Wrappers.lambdaQuery(GovBizProjectBaseinfo.class) | |||||
.eq(GovBizProjectBaseinfo::getBaseProjId, projId)); | |||||
if (Objects.nonNull(base)) { | |||||
//开始转换PDF | |||||
convertPdfVo(projId); | |||||
} | |||||
stopWatch.stop(); | |||||
log.info("项目归集库存转换PDF任务结束====={}s", stopWatch.getTotalTimeSeconds()); | |||||
} | |||||
public void stagingConvertPdf2(String projId) { | |||||
log.info("项目归集库存转换PDF任务2开始====="); | |||||
StopWatch stopWatch = new StopWatch(); | |||||
stopWatch.start(); | |||||
ProjectListReq req = new ProjectListReq(); | |||||
req.setPageNumber(1); | |||||
req.setPageSize(BizConst.MAX_EXPORT_COUNT); | |||||
List<GovBizProjectApprove> projects = approveService.list(Wrappers.lambdaQuery(GovBizProjectApprove.class) | |||||
.eq(GovBizProjectApprove::getDeleted, Boolean.FALSE) | |||||
.eq(StringUtils.isNotBlank(projId), GovBizProjectApprove::getBaseProjId, projId) | |||||
.isNotNull(GovBizProjectApprove::getApprovalFile) | |||||
.isNull(GovBizProjectApprove::getApprovalFilePdf)); | |||||
if (CollUtil.isEmpty(projects)) { | |||||
log.info("没有项目归集 任务终止"); | |||||
return; | |||||
} | |||||
for (GovBizProjectApprove project : projects) { | |||||
String baseProjId = project.getBaseProjId(); | |||||
//开始转换PDF | |||||
GovBizProjectApprove approve = approveService.getOne(Wrappers.lambdaQuery(GovBizProjectApprove.class) | |||||
.eq(GovBizProjectApprove::getBaseProjId, baseProjId) | |||||
.last(BizConst.LIMIT_1)); | |||||
if (Objects.isNull(approve)) { | |||||
return; | |||||
} | |||||
if (StringUtils.isBlank(approve.getApprovalFilePdf()) && StringUtils.isNotBlank(approve.getApprovalFile())) { | |||||
StringJoiner sj = collectionManage.convertAndUpload(approve.getApprovalFile()); | |||||
approve.setApprovalFilePdf(sj.toString()); | |||||
} | |||||
} | |||||
stopWatch.stop(); | |||||
log.info("项目归集库存转换PDF任务2结束====={}s", stopWatch.getTotalTimeSeconds()); | |||||
} | |||||
public void stagingConvertPdf3(String projId) { | |||||
log.info("项目归集库存转换PDF任务3开始====="); | |||||
StopWatch stopWatch = new StopWatch(); | |||||
stopWatch.start(); | |||||
ProjectListReq req = new ProjectListReq(); | |||||
req.setPageNumber(1); | |||||
req.setPageSize(BizConst.MAX_EXPORT_COUNT); | |||||
List<GovBizProjectApprove> approves = approveService.list(Wrappers.lambdaQuery(GovBizProjectApprove.class) | |||||
.eq(GovBizProjectApprove::getDeleted, Boolean.FALSE) | |||||
.eq(StringUtils.isNotBlank(projId), GovBizProjectApprove::getBaseProjId, projId) | |||||
.isNotNull(GovBizProjectApprove::getApprovalFile) | |||||
.isNull(GovBizProjectApprove::getApprovalFilePdf)); | |||||
if (CollUtil.isEmpty(approves)) { | |||||
log.info("没有项目归集 审批信息 立项文件 任务终止"); | |||||
return; | |||||
} | |||||
for (GovBizProjectApprove approve : approves) { | |||||
//开始转换PDF | |||||
convertPdfVo(approve.getBaseProjId()); | |||||
} | |||||
stopWatch.stop(); | |||||
log.info("项目归集库存转换PDF任务3结束====={}s", stopWatch.getTotalTimeSeconds()); | |||||
} | |||||
//开始转换PDF | |||||
private void convertPdfVo(String baseProjId) { | |||||
convertPdfApply(baseProjId); | |||||
convertPdfApprove(baseProjId); | |||||
convertPdfCimplement(baseProjId); | |||||
convertPdfMimplement(baseProjId); | |||||
convertPdfAProcure(baseProjId); | |||||
} | |||||
private void convertPdfApply(String baseProjId) { | |||||
GovBizProjectApply apply = applyService.getOne(Wrappers.lambdaQuery(GovBizProjectApply.class) | |||||
.eq(GovBizProjectApply::getBaseProjId, baseProjId) | |||||
.last(BizConst.LIMIT_1)); | |||||
if (Objects.isNull(apply)) { | |||||
return; | |||||
} | |||||
if (StringUtils.isBlank(apply.getBaseProjApplyFilePdf()) && StringUtils.isNotBlank(apply.getBaseProjApplyFile())) { | |||||
StringJoiner sj = collectionManage.convertAndUpload(apply.getBaseProjApplyFile()); | |||||
apply.setBaseProjApplyFilePdf(sj.toString()); | |||||
} | |||||
if (StringUtils.isBlank(apply.getBaseProjBasisFilePdf()) && StringUtils.isNotBlank(apply.getBaseProjBasisFile())) { | |||||
StringJoiner sj = collectionManage.convertAndUpload(apply.getBaseProjBasisFile()); | |||||
apply.setBaseProjBasisFilePdf(sj.toString()); | |||||
} | |||||
if (StringUtils.isBlank(apply.getBaseProjOtherFilePdf()) && StringUtils.isNotBlank(apply.getBaseProjOtherFile())) { | |||||
StringJoiner sj = collectionManage.convertAndUpload(apply.getBaseProjOtherFile()); | |||||
apply.setBaseProjOtherFilePdf(sj.toString()); | |||||
} | |||||
if (StringUtils.isBlank(apply.getBaseResearchReportFilePdf()) && StringUtils.isNotBlank(apply.getBaseResearchReportFile())) { | |||||
StringJoiner sj = collectionManage.convertAndUpload(apply.getBaseResearchReportFile()); | |||||
apply.setBaseResearchReportFilePdf(sj.toString()); | |||||
} | |||||
if (StringUtils.isBlank(apply.getBaseOperatMaintenFilePdf()) && StringUtils.isNotBlank(apply.getBaseOperatMaintenFile())) { | |||||
StringJoiner sj = collectionManage.convertAndUpload(apply.getBaseOperatMaintenFile()); | |||||
apply.setBaseOperatMaintenFilePdf(sj.toString()); | |||||
} | |||||
applyService.updateById(apply); | |||||
} | |||||
private void convertPdfApprove(String baseProjId) { | |||||
GovBizProjectApprove approve = approveService.getOne(Wrappers.lambdaQuery(GovBizProjectApprove.class) | |||||
.eq(GovBizProjectApprove::getBaseProjId, baseProjId) | |||||
.last(BizConst.LIMIT_1)); | |||||
if (Objects.isNull(approve)) { | |||||
return; | |||||
} | |||||
if (StringUtils.isBlank(approve.getApprovalFilePdf()) && StringUtils.isNotBlank(approve.getApprovalFile())) { | |||||
StringJoiner sj = collectionManage.convertAndUpload(approve.getApprovalFile()); | |||||
approve.setApprovalFilePdf(sj.toString()); | |||||
} | |||||
if (StringUtils.isBlank(approve.getPreliminaryDesignFilePdf()) && StringUtils.isNotBlank(approve.getPreliminaryDesignFile())) { | |||||
StringJoiner sj = collectionManage.convertAndUpload(approve.getPreliminaryDesignFile()); | |||||
approve.setPreliminaryDesignFilePdf(sj.toString()); | |||||
} | |||||
if (StringUtils.isBlank(approve.getBaseReviewCommentsFilePdf()) && StringUtils.isNotBlank(approve.getBaseReviewCommentsFile())) { | |||||
StringJoiner sj = collectionManage.convertAndUpload(approve.getBaseReviewCommentsFile()); | |||||
approve.setBaseReviewCommentsFilePdf(sj.toString()); | |||||
} | |||||
approveService.updateById(approve); | |||||
} | |||||
private void convertPdfCimplement(String baseProjId) { | |||||
GovBizProjectCimplement cimplement = cimplementService.getOne(Wrappers.lambdaQuery(GovBizProjectCimplement.class) | |||||
.eq(GovBizProjectCimplement::getBaseProjId, baseProjId) | |||||
.last(BizConst.LIMIT_1)); | |||||
if (Objects.isNull(cimplement)) { | |||||
return; | |||||
} | |||||
if (StringUtils.isBlank(cimplement.getBaseCheckFilePdf()) && StringUtils.isNotBlank(cimplement.getBaseCheckFile())) { | |||||
StringJoiner sj = collectionManage.convertAndUpload(cimplement.getBaseCheckFile()); | |||||
cimplement.setBaseCheckFilePdf(sj.toString()); | |||||
} | |||||
if (StringUtils.isBlank(cimplement.getBaseChanFilePdf()) && StringUtils.isNotBlank(cimplement.getBaseChanFile())) { | |||||
StringJoiner sj = collectionManage.convertAndUpload(cimplement.getBaseChanFile()); | |||||
cimplement.setBaseChanFilePdf(sj.toString()); | |||||
} | |||||
if (StringUtils.isBlank(cimplement.getBaseChangeFormFilePdf()) && StringUtils.isNotBlank(cimplement.getBaseChangeFormFile())) { | |||||
StringJoiner sj = collectionManage.convertAndUpload(cimplement.getBaseChangeFormFile()); | |||||
cimplement.setBaseChangeFormFilePdf(sj.toString()); | |||||
} | |||||
if (StringUtils.isBlank(cimplement.getBaseUserConsFilePdf()) && StringUtils.isNotBlank(cimplement.getBaseUserConsFile())) { | |||||
StringJoiner sj = collectionManage.convertAndUpload(cimplement.getBaseUserConsFile()); | |||||
cimplement.setBaseUserConsFilePdf(sj.toString()); | |||||
} | |||||
if (StringUtils.isBlank(cimplement.getBaseEstaSummFilePdf()) && StringUtils.isNotBlank(cimplement.getBaseEstaSummFile())) { | |||||
StringJoiner sj = collectionManage.convertAndUpload(cimplement.getBaseEstaSummFile()); | |||||
cimplement.setBaseEstaSummFilePdf(sj.toString()); | |||||
} | |||||
if (StringUtils.isBlank(cimplement.getBaseEngineerPostpoFilePdf()) && StringUtils.isNotBlank(cimplement.getBaseEngineerPostpoFile())) { | |||||
StringJoiner sj = collectionManage.convertAndUpload(cimplement.getBaseEngineerPostpoFile()); | |||||
cimplement.setBaseEngineerPostpoFilePdf(sj.toString()); | |||||
} | |||||
if (StringUtils.isBlank(cimplement.getBasePasswAssessFilePdf()) && StringUtils.isNotBlank(cimplement.getBasePasswAssessFile())) { | |||||
StringJoiner sj = collectionManage.convertAndUpload(cimplement.getBasePasswAssessFile()); | |||||
cimplement.setBasePasswAssessFilePdf(sj.toString()); | |||||
} | |||||
if (StringUtils.isBlank(cimplement.getBaseThirdAcceptFilePdf()) && StringUtils.isNotBlank(cimplement.getBaseThirdAcceptFile())) { | |||||
StringJoiner sj = collectionManage.convertAndUpload(cimplement.getBaseThirdAcceptFile()); | |||||
cimplement.setBaseThirdAcceptFilePdf(sj.toString()); | |||||
} | |||||
if (StringUtils.isBlank(cimplement.getBaseFinanlAuditFilePdf()) && StringUtils.isNotBlank(cimplement.getBaseFinanlAuditFile())) { | |||||
StringJoiner sj = collectionManage.convertAndUpload(cimplement.getBaseFinanlAuditFile()); | |||||
cimplement.setBaseFinanlAuditFilePdf(sj.toString()); | |||||
} | |||||
if (StringUtils.isBlank(cimplement.getBaseInitialOpinionFilePdf()) && StringUtils.isNotBlank(cimplement.getBaseInitialOpinionFile())) { | |||||
StringJoiner sj = collectionManage.convertAndUpload(cimplement.getBaseInitialOpinionFile()); | |||||
cimplement.setBaseInitialOpinionFilePdf(sj.toString()); | |||||
} | |||||
if (StringUtils.isBlank(cimplement.getBaseThirdAcceptFilePdf()) && StringUtils.isNotBlank(cimplement.getBaseThirdAcceptFile())) { | |||||
StringJoiner sj = collectionManage.convertAndUpload(cimplement.getBaseThirdAcceptFile()); | |||||
cimplement.setBaseThirdAcceptFilePdf(sj.toString()); | |||||
} | |||||
if (StringUtils.isBlank(cimplement.getBaseSummReportFilePdf()) && StringUtils.isNotBlank(cimplement.getBaseSummReportFile())) { | |||||
StringJoiner sj = collectionManage.convertAndUpload(cimplement.getBaseSummReportFile()); | |||||
cimplement.setBaseSummReportFilePdf(sj.toString()); | |||||
} | |||||
if (StringUtils.isBlank(cimplement.getBaseFinalExpertOpinionFilePdf()) && StringUtils.isNotBlank(cimplement.getBaseFinalExpertOpinionFile())) { | |||||
StringJoiner sj = collectionManage.convertAndUpload(cimplement.getBaseFinalExpertOpinionFile()); | |||||
cimplement.setBaseFinalExpertOpinionFilePdf(sj.toString()); | |||||
} | |||||
if (StringUtils.isBlank(cimplement.getBaseIrsTestRunFilePdf()) && StringUtils.isNotBlank(cimplement.getBaseIrsTestRunFile())) { | |||||
StringJoiner sj = collectionManage.convertAndUpload(cimplement.getBaseIrsTestRunFile()); | |||||
cimplement.setBaseIrsTestRunFilePdf(sj.toString()); | |||||
} | |||||
if (StringUtils.isBlank(cimplement.getBaseInforLevelFilePdf()) && StringUtils.isNotBlank(cimplement.getBaseInforLevelFile())) { | |||||
StringJoiner sj = collectionManage.convertAndUpload(cimplement.getBaseInforLevelFile()); | |||||
cimplement.setBaseInforLevelFilePdf(sj.toString()); | |||||
} | |||||
cimplementService.updateById(cimplement); | |||||
} | |||||
private void convertPdfMimplement(String baseProjId) { | |||||
GovBizProjectMimplement mimplement = mimplementService.getOne(Wrappers.lambdaQuery(GovBizProjectMimplement.class) | |||||
.eq(GovBizProjectMimplement::getBaseProjId, baseProjId) | |||||
.last(BizConst.LIMIT_1)); | |||||
if (Objects.isNull(mimplement)) { | |||||
return; | |||||
} | |||||
if (StringUtils.isBlank(mimplement.getBaseChanFilePdf()) && StringUtils.isNotBlank(mimplement.getBaseChanFile())) { | |||||
StringJoiner sj = collectionManage.convertAndUpload(mimplement.getBaseChanFile()); | |||||
mimplement.setBaseChanFilePdf(sj.toString()); | |||||
} | |||||
if (StringUtils.isBlank(mimplement.getBaseUserConsFilePdf()) && StringUtils.isNotBlank(mimplement.getBaseUserConsFile())) { | |||||
StringJoiner sj = collectionManage.convertAndUpload(mimplement.getBaseUserConsFile()); | |||||
mimplement.setBaseUserConsFilePdf(sj.toString()); | |||||
} | |||||
if (StringUtils.isBlank(mimplement.getBaseEstaSummFilePdf()) && StringUtils.isNotBlank(mimplement.getBaseEstaSummFile())) { | |||||
StringJoiner sj = collectionManage.convertAndUpload(mimplement.getBaseEstaSummFile()); | |||||
mimplement.setBaseEstaSummFilePdf(sj.toString()); | |||||
} | |||||
if (StringUtils.isBlank(mimplement.getBaseEngineerPostpoFilePdf()) && StringUtils.isNotBlank(mimplement.getBaseEngineerPostpoFile())) { | |||||
StringJoiner sj = collectionManage.convertAndUpload(mimplement.getBaseEngineerPostpoFile()); | |||||
mimplement.setBaseEngineerPostpoFilePdf(sj.toString()); | |||||
} | |||||
if (StringUtils.isBlank(mimplement.getBasePasswAssessFilePdf()) && StringUtils.isNotBlank(mimplement.getBasePasswAssessFile())) { | |||||
StringJoiner sj = collectionManage.convertAndUpload(mimplement.getBasePasswAssessFile()); | |||||
mimplement.setBasePasswAssessFilePdf(sj.toString()); | |||||
} | |||||
if (StringUtils.isBlank(mimplement.getBaseThirdAcceptFilePdf()) && StringUtils.isNotBlank(mimplement.getBaseThirdAcceptFile())) { | |||||
StringJoiner sj = collectionManage.convertAndUpload(mimplement.getBaseThirdAcceptFile()); | |||||
mimplement.setBaseThirdAcceptFilePdf(sj.toString()); | |||||
} | |||||
if (StringUtils.isBlank(mimplement.getBaseThirdAcceptFilePdf()) && StringUtils.isNotBlank(mimplement.getBaseThirdAcceptFile())) { | |||||
StringJoiner sj = collectionManage.convertAndUpload(mimplement.getBaseThirdAcceptFile()); | |||||
mimplement.setBaseThirdAcceptFilePdf(sj.toString()); | |||||
} | |||||
if (StringUtils.isBlank(mimplement.getBaseFinalExpertOpinionFilePdf()) && StringUtils.isNotBlank(mimplement.getBaseFinalExpertOpinionFile())) { | |||||
StringJoiner sj = collectionManage.convertAndUpload(mimplement.getBaseFinalExpertOpinionFile()); | |||||
mimplement.setBaseFinalExpertOpinionFilePdf(sj.toString()); | |||||
} | |||||
if (StringUtils.isBlank(mimplement.getBaseEngineerAlterFilePdf()) && StringUtils.isNotBlank(mimplement.getBaseEngineerAlterFile())) { | |||||
StringJoiner sj = collectionManage.convertAndUpload(mimplement.getBaseEngineerAlterFile()); | |||||
mimplement.setBaseEngineerAlterFilePdf(sj.toString()); | |||||
} | |||||
if (StringUtils.isBlank(mimplement.getBaseOperatMaintenSummFilePdf()) && StringUtils.isNotBlank(mimplement.getBaseOperatMaintenSummFile())) { | |||||
StringJoiner sj = collectionManage.convertAndUpload(mimplement.getBaseOperatMaintenSummFile()); | |||||
mimplement.setBaseOperatMaintenSummFilePdf(sj.toString()); | |||||
} | |||||
mimplementService.updateById(mimplement); | |||||
} | |||||
private void convertPdfAProcure(String baseProjId) { | |||||
List<GovBizProjectProcure> procures = procureService.list(Wrappers.lambdaQuery(GovBizProjectProcure.class) | |||||
.eq(GovBizProjectProcure::getBaseProjId, baseProjId)); | |||||
for (GovBizProjectProcure procure : procures) { | |||||
if (StringUtils.isBlank(procure.getPurchaseContractPdf()) && StringUtils.isNotBlank(procure.getPurchaseContract())) { | |||||
StringJoiner sj = collectionManage.convertAndUpload(procure.getPurchaseContract()); | |||||
procure.setPurchaseContractPdf(sj.toString()); | |||||
} | |||||
if (StringUtils.isBlank(procure.getPurchaseFilePdf()) && StringUtils.isNotBlank(procure.getPurchaseFile())) { | |||||
StringJoiner sj = collectionManage.convertAndUpload(procure.getPurchaseFile()); | |||||
procure.setPurchaseFilePdf(sj.toString()); | |||||
} | |||||
if (StringUtils.isBlank(procure.getBiddingFilePdf()) && StringUtils.isNotBlank(procure.getBiddingFile())) { | |||||
StringJoiner sj = collectionManage.convertAndUpload(procure.getBiddingFile()); | |||||
procure.setBiddingFilePdf(sj.toString()); | |||||
} | |||||
procureService.updateById(procure); | |||||
} | |||||
} | |||||
public void doTaskSingle(List<String> projectCodes) { | |||||
StopWatch stopWatch = new StopWatch(); | |||||
stopWatch.start(); | |||||
log.info("数据同步任务 指定项目编号 :{}", projectCodes); | |||||
if (CollUtil.isEmpty(projectCodes)) { | |||||
throw new BizException("不能为空!"); | |||||
} | |||||
//全量项目归集 | |||||
ProjectListReq req = new ProjectListReq(); | |||||
req.setPageNumber(PAGE_NUMBER); | |||||
req.setPageSize(1000); | |||||
PageVo<GovBizProjectListVO> projectCollectionPage = collectionManage.list(req); | |||||
log.info("projectCollections size :{}", projectCollectionPage.getTotal()); | |||||
for (GovBizProjectListVO vo : projectCollectionPage.getRecords()) { | |||||
GovBizProjectDetailVO projectDetail = collectionManage.detail(vo.getBaseProjId()); | |||||
collectionManage.pushProjectVo(projectDetail); | |||||
} | |||||
//2.运维备案项目 | |||||
PageVo<GovBizProjectListVO> operationList = collectionManage.operationList(req); | |||||
log.info("operation list size :{}", operationList.getTotal()); | |||||
for (GovBizProjectListVO vo : operationList.getRecords()) { | |||||
GovOperationProjectDetailVO operationDetail = collectionManage.operationDetail(vo.getBaseProjId()); | |||||
GovOperationProjectBaseinfoVO baseinfo = operationDetail.getBaseinfo(); | |||||
if (Objects.isNull(baseinfo) || Objects.isNull(baseinfo.getPush()) || | |||||
Boolean.FALSE.equals(baseinfo.getPush())) { | |||||
log.info("此运维项目不用推送:" + vo.getBaseProjId()); | |||||
} | |||||
collectionManage.pushProjectVo(operationDetail); | |||||
} | |||||
//3.申报项目 需要推送的项目 | |||||
List<Project> projects = projectService.list(Wrappers.lambdaQuery(Project.class) | |||||
.eq(Project::getNewest, Boolean.TRUE) | |||||
.eq(Project::getPush, Boolean.TRUE) | |||||
.in(Project::getProjectCode, projectCodes)); | |||||
log.info("projects need push size :{}", projects.size()); | |||||
for (Project project : projects) { | |||||
ProjectDetailVO projectDetailVO = projectLibManage.detailProjectCode(project.getProjectCode()); | |||||
GovBizProjectDetailVO vo = ProjectConvertUtil.declaredToCollection(projectDetailVO, fileService); | |||||
if (Objects.nonNull(vo)) { | |||||
collectionManage.pushProjectVo(vo); | |||||
} | |||||
} | |||||
stopWatch.stop(); | |||||
log.info("数据同步任务 指定项目编号 结束====={}s", stopWatch.getTotalTimeSeconds()); | |||||
} | |||||
} |
@@ -1,250 +0,0 @@ | |||||
package com.hz.pm.api.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.basic.model.GenericResult; | |||||
import com.hz.pm.api.common.model.constant.BizConst; | |||||
import com.hz.pm.api.ding.constants.DingOrganizationContant; | |||||
import com.hz.pm.api.irs.manage.ProjectIrsManage; | |||||
import com.hz.pm.api.irs.model.entity.ProjectCoreBiz; | |||||
import com.hz.pm.api.irs.service.IProjectCoreBizService; | |||||
import com.hz.pm.api.organization.model.entity.DingOrganization; | |||||
import com.hz.pm.api.organization.service.IDingOrganizationService; | |||||
import com.hz.pm.api.projectdeclared.contant.ProjectCodeCont; | |||||
import com.ningdatech.zwdd.client.ZwddClient; | |||||
import com.ningdatech.zwdd.model.dto.DingOrgInfoDTO; | |||||
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.stereotype.Component; | |||||
import java.net.InetAddress; | |||||
import java.net.UnknownHostException; | |||||
import java.time.LocalDateTime; | |||||
import java.util.List; | |||||
import java.util.Map; | |||||
import java.util.Objects; | |||||
import java.util.stream.Collectors; | |||||
/** | |||||
* @author ZPF | |||||
* @since 2023/09/13 18:16 | |||||
*/ | |||||
@Component | |||||
@Slf4j | |||||
@RequiredArgsConstructor | |||||
public class SynProjectCoreBizTask { | |||||
@Value("${hostname}") | |||||
public String HOST; | |||||
@Value("${spring.profiles.active}") | |||||
public String active; | |||||
@Autowired | |||||
private IProjectCoreBizService projectCoreBizService; | |||||
@Autowired | |||||
private IDingOrganizationService organizationService; | |||||
@Autowired | |||||
private ZwddClient zwddClient; | |||||
@Autowired | |||||
private ProjectIrsManage projectIrsManage; | |||||
private final Integer MAX_PAGE_SIZE = 1000; | |||||
/** | |||||
* 前置机每天晚上10点自动清空,第二天早上6点获取数据 | |||||
* 定时同步前置机数据 每天1点开始执行一次 不按照单位 | |||||
* | |||||
*/ | |||||
// @Scheduled(cron = "0 0 2 * * ?") | |||||
public void doTask() throws UnknownHostException { | |||||
if (!HOST.equals(InetAddress.getLocalHost().getHostName())) { | |||||
log.info("定时器没开启或者host不对! {}:{}", | |||||
HOST,InetAddress.getLocalHost().getHostName()); | |||||
return; | |||||
} | |||||
log.info("同步项目核心业务开始====="); | |||||
StopWatch stopWatch = new StopWatch(); | |||||
stopWatch.start(); | |||||
List<DingOrganization> orgs = organizationService.list(Wrappers.lambdaQuery(DingOrganization.class) | |||||
.in(DingOrganization::getTypeCode, Lists.newArrayList(DingOrganizationContant.UNIT_TYPE | |||||
, DingOrganizationContant.GOV_TEMPORARY))); | |||||
log.info("总共需要同步 orgs size :{}",orgs.size()); | |||||
syncCoreBiz(orgs); | |||||
stopWatch.stop(); | |||||
log.info("同步项目核心业务结束====={}s",stopWatch.getTotalTimeSeconds()); | |||||
} | |||||
public void doTask(String orgCode) throws UnknownHostException { | |||||
log.info("同步项目核心业务开始====="); | |||||
StopWatch stopWatch = new StopWatch(); | |||||
stopWatch.start(); | |||||
List<DingOrganization> orgs = organizationService.list(Wrappers.lambdaQuery(DingOrganization.class) | |||||
.in(DingOrganization::getTypeCode, Lists.newArrayList(DingOrganizationContant.UNIT_TYPE | |||||
, DingOrganizationContant.GOV_TEMPORARY)) | |||||
.eq(StringUtils.isNotBlank(orgCode),DingOrganization::getOrganizationCode,orgCode)); | |||||
log.info("总共需要同步 orgs size :{}",orgs.size()); | |||||
syncCoreBiz(orgs); | |||||
stopWatch.stop(); | |||||
log.info("同步项目核心业务结束====={}s",stopWatch.getTotalTimeSeconds()); | |||||
} | |||||
private void syncCoreBiz(List<DingOrganization> orgs) { | |||||
for(DingOrganization organization : orgs){ | |||||
GenericResult<DingOrgInfoDTO> dingResult = zwddClient.getOrganizationByCode(organization.getOrganizationCode()); | |||||
log.info("core biz result : {}",JSON.toJSONString(dingResult)); | |||||
if(dingResult.isSuccess()){ | |||||
DingOrgInfoDTO data = dingResult.getData(); | |||||
String unifiedSocialCreditCode = data.getUnifiedSocialCreditCode(); | |||||
if(StringUtils.isNotBlank(unifiedSocialCreditCode)){ | |||||
organization.setUnifiedSocialCreditCode(unifiedSocialCreditCode); | |||||
organizationService.updateById(organization); | |||||
} | |||||
//去请求IRS接口 | |||||
JSONObject jsonObject = projectIrsManage.searchCoreBiz(null, organization.getOrganizationCode(), 1000, 1); | |||||
JSONArray jsonArray = jsonObject.getJSONArray(BizConst.RESPONSE_KEY_DATA); | |||||
if(CollUtil.isNotEmpty(jsonArray)){ | |||||
jsonArray.forEach(j -> { | |||||
JSONObject jsonData = JSON.parseObject(JSON.toJSONString(j)); | |||||
ProjectCoreBiz coreBiz = new ProjectCoreBiz(); | |||||
// | |||||
Long irsId = jsonData.getLong(BizConst.RESPONSE_KEY_ID); | |||||
String dingCode = jsonData.getString(BizConst.RESPONSE_KEY_DING_CODE); | |||||
String matterName = jsonData.getString(BizConst.RESPONSE_KEY_MATTER_NAME); | |||||
String orgName = jsonData.getString(BizConst.RESPONSE_KEY_ORG_NAME); | |||||
String userState = jsonData.getString(BizConst.RESPONSE_KEY_USER_STATE); | |||||
String areaName = jsonData.getString(BizConst.RESPONSE_KEY_AREA_NAME); | |||||
ProjectCoreBiz old = projectCoreBizService.getOne(Wrappers.lambdaQuery(ProjectCoreBiz.class) | |||||
.eq(ProjectCoreBiz::getIrsId, irsId) | |||||
.last(BizConst.LIMIT_1)); | |||||
if(Objects.nonNull(old)){ | |||||
coreBiz.setId(old.getId()); | |||||
}else{ | |||||
coreBiz.setCreateOn(LocalDateTime.now()); | |||||
} | |||||
coreBiz.setUpdateOn(LocalDateTime.now()); | |||||
coreBiz.setIrsId(irsId); | |||||
coreBiz.setMatterName(matterName); | |||||
coreBiz.setOrgCode(dingCode); | |||||
coreBiz.setOrgName(orgName); | |||||
coreBiz.setUserState(userState); | |||||
coreBiz.setAreaName(areaName); | |||||
coreBiz.setMatterCode(irsId.toString()); | |||||
projectCoreBizService.saveOrUpdate(coreBiz); | |||||
coreBiz.setMatterCode(genirate(unifiedSocialCreditCode,coreBiz.getId())); | |||||
projectCoreBizService.updateById(coreBiz); | |||||
}); | |||||
} | |||||
} | |||||
} | |||||
} | |||||
private void syncCoreBiz() { | |||||
Map<String,DingOrganization> map = organizationService.list().stream().distinct().collect(Collectors.toMap(DingOrganization::getOrganizationCode, o -> o)); | |||||
Integer currentSize = MAX_PAGE_SIZE; | |||||
Integer page = 1; | |||||
while (currentSize.equals(MAX_PAGE_SIZE)) { | |||||
//去请求IRS接口 | |||||
JSONObject jsonObject = projectIrsManage.searchCoreBiz(null, null, MAX_PAGE_SIZE, page); | |||||
JSONArray jsonArray = jsonObject.getJSONArray(BizConst.RESPONSE_KEY_DATA); | |||||
if(Objects.isNull(jsonArray)){ | |||||
return; | |||||
} | |||||
currentSize = jsonArray.size(); | |||||
if (CollUtil.isNotEmpty(jsonArray)) { | |||||
if (currentSize.equals(MAX_PAGE_SIZE)) { | |||||
page++; | |||||
} | |||||
jsonArray.forEach(j -> { | |||||
JSONObject jsonData = JSON.parseObject(JSON.toJSONString(j)); | |||||
ProjectCoreBiz coreBiz = new ProjectCoreBiz(); | |||||
// | |||||
Long irsId = jsonData.getLong(BizConst.RESPONSE_KEY_ID); | |||||
String dingCode = jsonData.getString(BizConst.RESPONSE_KEY_DING_CODE); | |||||
String matterName = jsonData.getString(BizConst.RESPONSE_KEY_MATTER_NAME); | |||||
String orgName = jsonData.getString(BizConst.RESPONSE_KEY_ORG_NAME); | |||||
String userState = jsonData.getString(BizConst.RESPONSE_KEY_USER_STATE); | |||||
String areaName = jsonData.getString(BizConst.RESPONSE_KEY_AREA_NAME); | |||||
ProjectCoreBiz old = projectCoreBizService.getOne(Wrappers.lambdaQuery(ProjectCoreBiz.class) | |||||
.eq(ProjectCoreBiz::getIrsId, irsId) | |||||
.last(BizConst.LIMIT_1)); | |||||
if (Objects.nonNull(old)) { | |||||
coreBiz.setId(old.getId()); | |||||
} else { | |||||
coreBiz.setCreateOn(LocalDateTime.now()); | |||||
} | |||||
if(map.containsKey(dingCode)){ | |||||
DingOrganization organization = map.get(dingCode); | |||||
String unifiedSocialCreditCode = organization.getUnifiedSocialCreditCode(); | |||||
if(StringUtils.isBlank(unifiedSocialCreditCode)){ | |||||
GenericResult<DingOrgInfoDTO> dingResult = zwddClient.getOrganizationByCode(organization.getOrganizationCode()); | |||||
log.info("ding org result : {}",JSON.toJSONString(dingResult)); | |||||
if(dingResult.isSuccess()){ | |||||
DingOrgInfoDTO data = dingResult.getData(); | |||||
unifiedSocialCreditCode = data.getUnifiedSocialCreditCode(); | |||||
organization.setUnifiedSocialCreditCode(unifiedSocialCreditCode); | |||||
organizationService.updateById(organization); | |||||
} | |||||
} | |||||
coreBiz.setUpdateOn(LocalDateTime.now()); | |||||
coreBiz.setIrsId(irsId); | |||||
coreBiz.setMatterName(matterName); | |||||
coreBiz.setOrgCode(dingCode); | |||||
coreBiz.setOrgName(orgName); | |||||
coreBiz.setUserState(userState); | |||||
coreBiz.setAreaName(areaName); | |||||
coreBiz.setMatterCode(irsId.toString()); | |||||
projectCoreBizService.saveOrUpdate(coreBiz); | |||||
coreBiz.setMatterCode(genirate(unifiedSocialCreditCode, coreBiz.getId())); | |||||
projectCoreBizService.updateById(coreBiz); | |||||
} | |||||
}); | |||||
} | |||||
} | |||||
} | |||||
/** | |||||
* 生成 编号 | |||||
* @param unifiedSocialCreditCode | |||||
* @param id | |||||
* @return | |||||
*/ | |||||
private String genirate(String unifiedSocialCreditCode, Long id) { | |||||
String formatId = String.format(ProjectCodeCont.SHUZI_4, id); | |||||
return unifiedSocialCreditCode + formatId; | |||||
} | |||||
} |
@@ -28,7 +28,7 @@ import java.util.stream.Collectors; | |||||
@RequiredArgsConstructor | @RequiredArgsConstructor | ||||
public class SynProvinceOrgTask { | public class SynProvinceOrgTask { | ||||
@Value("${hostname}") | |||||
@Value("${hostname:}") | |||||
public String HOST; | public String HOST; | ||||
@Value("${spring.profiles.active}") | @Value("${spring.profiles.active}") | ||||
@@ -4,6 +4,7 @@ import java.net.InetAddress; | |||||
import java.net.UnknownHostException; | import java.net.UnknownHostException; | ||||
import java.time.LocalDateTime; | import java.time.LocalDateTime; | ||||
import java.util.List; | import java.util.List; | ||||
import com.ningdatech.basic.model.GenericResult; | import com.ningdatech.basic.model.GenericResult; | ||||
import com.hz.pm.api.staging.model.entity.WorkNoticeStaging; | import com.hz.pm.api.staging.model.entity.WorkNoticeStaging; | ||||
import com.hz.pm.api.staging.service.INdWorkNoticeStagingService; | import com.hz.pm.api.staging.service.INdWorkNoticeStagingService; | ||||
@@ -25,7 +26,7 @@ import lombok.extern.slf4j.Slf4j; | |||||
/** | /** | ||||
* 发送工作通知定时任务 | * 发送工作通知定时任务 | ||||
* @return | |||||
* | |||||
* @author CMM | * @author CMM | ||||
* @since 2023/02/28 21:23 | * @since 2023/02/28 21:23 | ||||
*/ | */ | ||||
@@ -37,7 +38,7 @@ public class WorkNoticeFlowTask { | |||||
private final INdWorkNoticeStagingService workNoticeStagingService; | private final INdWorkNoticeStagingService workNoticeStagingService; | ||||
private final ZwddClient zwddClient; | private final ZwddClient zwddClient; | ||||
@Value("${hostname}") | |||||
@Value("${hostname:}") | |||||
private String HOST_NAME; | private String HOST_NAME; | ||||
@Scheduled(cron = "0 */1 * * * ?") | @Scheduled(cron = "0 */1 * * * ?") | ||||
@@ -51,27 +52,27 @@ public class WorkNoticeFlowTask { | |||||
.le(WorkNoticeStaging::getRetryTimes, StagingContant.Retry.MAX_RETRY_TIMES) | .le(WorkNoticeStaging::getRetryTimes, StagingContant.Retry.MAX_RETRY_TIMES) | ||||
.orderByAsc(WorkNoticeStaging::getId)); | .orderByAsc(WorkNoticeStaging::getId)); | ||||
log.info("需要发送的工作通知 size:{} :{}",stagingList.size(), JSON.toJSONString(stagingList)); | |||||
if(CollUtil.isEmpty(stagingList)){ | |||||
log.info("需要发送的工作通知 size:{} :{}", stagingList.size(), JSON.toJSONString(stagingList)); | |||||
if (CollUtil.isEmpty(stagingList)) { | |||||
log.info("没有需要发送的工作通知!"); | log.info("没有需要发送的工作通知!"); | ||||
return; | return; | ||||
} | } | ||||
//遍历 | //遍历 | ||||
for(WorkNoticeStaging workNoticeStaging : stagingList){ | |||||
try{ | |||||
for (WorkNoticeStaging workNoticeStaging : stagingList) { | |||||
try { | |||||
WorkNoticeInfo workNoticeInfo = new WorkNoticeInfo(); | WorkNoticeInfo workNoticeInfo = new WorkNoticeInfo(); | ||||
BeanUtils.copyProperties(workNoticeStaging,workNoticeInfo); | |||||
BeanUtils.copyProperties(workNoticeStaging, workNoticeInfo); | |||||
String receiverUserId = workNoticeInfo.getReceiverUserId(); | String receiverUserId = workNoticeInfo.getReceiverUserId(); | ||||
String bizMsgId = workNoticeInfo.getBizMsgId(); | String bizMsgId = workNoticeInfo.getBizMsgId(); | ||||
String msg = workNoticeInfo.getMsg(); | String msg = workNoticeInfo.getMsg(); | ||||
GenericResult<Void> result = zwddClient.sendWorkNotice(receiverUserId, bizMsgId, msg); | GenericResult<Void> result = zwddClient.sendWorkNotice(receiverUserId, bizMsgId, msg); | ||||
if (result.isSuccess()){ | |||||
if (result.isSuccess()) { | |||||
//执行成功了 删除暂存的数据 | //执行成功了 删除暂存的数据 | ||||
workNoticeStagingService.removeById(workNoticeStaging); | workNoticeStagingService.removeById(workNoticeStaging); | ||||
} | } | ||||
}catch (Exception e){ | |||||
} catch (Exception e) { | |||||
log.error("发送工作通知 异常 bizMsgId:【" + workNoticeStaging.getBizMsgId() + "】 异常内容:" + e); | log.error("发送工作通知 异常 bizMsgId:【" + workNoticeStaging.getBizMsgId() + "】 异常内容:" + e); | ||||
}finally { | |||||
} finally { | |||||
//增加重试的次数 和下次扫描时间 | //增加重试的次数 和下次扫描时间 | ||||
workNoticeStagingService.addRetryTimes(workNoticeStaging); | workNoticeStagingService.addRetryTimes(workNoticeStaging); | ||||
} | } | ||||
@@ -1,7 +1,5 @@ | |||||
package com.hz.pm.api.staging.utils; | package com.hz.pm.api.staging.utils; | ||||
import com.google.common.collect.Maps; | |||||
import java.util.HashMap; | import java.util.HashMap; | ||||
import java.util.Map; | import java.util.Map; | ||||
@@ -14,7 +14,6 @@ import lombok.extern.slf4j.Slf4j; | |||||
import org.springframework.validation.annotation.Validated; | import org.springframework.validation.annotation.Validated; | ||||
import org.springframework.web.bind.annotation.*; | import org.springframework.web.bind.annotation.*; | ||||
import java.util.List; | |||||
import java.util.Set; | import java.util.Set; | ||||
/** | /** | ||||
@@ -79,7 +79,7 @@ public class RegionConverter { | |||||
List<RegionTreeVO> treeList = new ArrayList<>(); | List<RegionTreeVO> treeList = new ArrayList<>(); | ||||
List<RegionDTO> children = regions.getOrDefault(parentId, Collections.emptyList()); | List<RegionDTO> children = regions.getOrDefault(parentId, Collections.emptyList()); | ||||
for (RegionDTO region : children) { | for (RegionDTO region : children) { | ||||
if (!showDeleted && region.getDeleted()) { | |||||
if (!showDeleted && Boolean.TRUE.equals(region.getDeleted())) { | |||||
continue; | continue; | ||||
} | } | ||||
RegionTreeVO node = toRegionTreeVO(region); | RegionTreeVO node = toRegionTreeVO(region); | ||||
@@ -58,7 +58,7 @@ public class InitProcessManage { | |||||
models.setFormName(stage.getDesc()); | models.setFormName(stage.getDesc()); | ||||
models.setProcessType(stage.getCode()); | models.setProcessType(stage.getCode()); | ||||
models.setRegionCode(unitId); | models.setRegionCode(unitId); | ||||
models.setProcess(new ProcessNode()); | |||||
models.setProcess(new ProcessNode<>()); | |||||
models.setSettings("{\"sign\":false,\"admin\":[],\"notify\":{},\"commiter\":[]}"); | models.setSettings("{\"sign\":false,\"admin\":[],\"notify\":{},\"commiter\":[]}"); | ||||
models.setFormItems("[]"); | models.setFormItems("[]"); | ||||
String formId = processModelService.insertProcess(models); | String formId = processModelService.insertProcess(models); | ||||
@@ -4,7 +4,7 @@ import cn.hutool.core.util.IdUtil; | |||||
import com.alibaba.fastjson.JSON; | import com.alibaba.fastjson.JSON; | ||||
import com.baomidou.mybatisplus.core.conditions.Wrapper; | import com.baomidou.mybatisplus.core.conditions.Wrapper; | ||||
import com.baomidou.mybatisplus.core.toolkit.Wrappers; | import com.baomidou.mybatisplus.core.toolkit.Wrappers; | ||||
import com.hz.pm.api.organization.constants.ProcDefContant; | |||||
import com.hz.pm.api.organization.constant.ProcDefCont; | |||||
import com.hz.pm.api.user.model.entity.MhUnit; | import com.hz.pm.api.user.model.entity.MhUnit; | ||||
import com.hz.pm.api.user.service.IMhUnitService; | import com.hz.pm.api.user.service.IMhUnitService; | ||||
import com.ningdatech.basic.util.CollUtils; | import com.ningdatech.basic.util.CollUtils; | ||||
@@ -75,7 +75,7 @@ public class OrgProcDefManage { | |||||
} | } | ||||
private void saveDef(MhUnit unit, ProcessDefTypeEnum defType) { | private void saveDef(MhUnit unit, ProcessDefTypeEnum defType) { | ||||
String procDefId = ProcDefContant.MODELS_ID_PREFIX + IdUtil.objectId(); | |||||
String procDefId = ProcDefCont.MODELS_ID_PREFIX + IdUtil.objectId(); | |||||
WflowOrgModels defaultModel = new WflowOrgModels(); | WflowOrgModels defaultModel = new WflowOrgModels(); | ||||
defaultModel.setProcessDefId(procDefId); | defaultModel.setProcessDefId(procDefId); | ||||
defaultModel.setIsStop(Boolean.FALSE); | defaultModel.setIsStop(Boolean.FALSE); | ||||
@@ -4,9 +4,8 @@ import cn.hutool.core.collection.CollUtil; | |||||
import cn.hutool.core.lang.Assert; | import cn.hutool.core.lang.Assert; | ||||
import com.baomidou.mybatisplus.core.toolkit.Wrappers; | import com.baomidou.mybatisplus.core.toolkit.Wrappers; | ||||
import com.google.common.collect.Lists; | import com.google.common.collect.Lists; | ||||
import com.hz.pm.api.expert.entity.ExpertUserFullInfo; | |||||
import com.ningdatech.basic.function.VUtils; | |||||
import com.hz.pm.api.common.model.constant.BizConst; | import com.hz.pm.api.common.model.constant.BizConst; | ||||
import com.hz.pm.api.expert.entity.ExpertUserFullInfo; | |||||
import com.hz.pm.api.expert.service.IExpertUserFullInfoService; | import com.hz.pm.api.expert.service.IExpertUserFullInfoService; | ||||
import com.hz.pm.api.signature.entity.CompanySignature; | import com.hz.pm.api.signature.entity.CompanySignature; | ||||
import com.hz.pm.api.signature.service.ICompanySignatureService; | import com.hz.pm.api.signature.service.ICompanySignatureService; | ||||
@@ -2,7 +2,7 @@ package com.hz.pm.api.user.controller; | |||||
import com.fasterxml.jackson.databind.ObjectMapper; | import com.fasterxml.jackson.databind.ObjectMapper; | ||||
import com.hz.pm.api.meeting.entity.config.WebProperties; | |||||
import com.hz.pm.api.meeting.entity.config.WebProps; | |||||
import com.hz.pm.api.user.manage.AgentLoginManage; | import com.hz.pm.api.user.manage.AgentLoginManage; | ||||
import com.hz.pm.api.user.manage.AuthCodeLoginManage; | import com.hz.pm.api.user.manage.AuthCodeLoginManage; | ||||
import com.hz.pm.api.user.model.vo.AuthCodeVO; | import com.hz.pm.api.user.model.vo.AuthCodeVO; | ||||
@@ -109,7 +109,7 @@ public class UserAuthController { | |||||
} | } | ||||
String authCode = authCodeLoginManage.generateAuthCode(targetUserId); | String authCode = authCodeLoginManage.generateAuthCode(targetUserId); | ||||
String urlParam = "?authCode=" + authCode; | String urlParam = "?authCode=" + authCode; | ||||
String path = WebProperties.apiHost + request.getContextPath() + AUTH_CODE_LOGIN_PATH; | |||||
String path = WebProps.apiHost + request.getContextPath() + AUTH_CODE_LOGIN_PATH; | |||||
response.sendRedirect(path + urlParam); | response.sendRedirect(path + urlParam); | ||||
} | } | ||||
@@ -72,7 +72,7 @@ public class UserInfoDetails extends AbstractLoginUser implements UserDetails { | |||||
*/ | */ | ||||
@Override | @Override | ||||
public Collection<? extends GrantedAuthority> getAuthorities() { | public Collection<? extends GrantedAuthority> getAuthorities() { | ||||
if (CollectionUtil.isNotEmpty(this.userRoleList)) { | |||||
if (CollUtil.isNotEmpty(this.userRoleList)) { | |||||
List<SimpleGrantedAuthority> authorities = new ArrayList<>(); | List<SimpleGrantedAuthority> authorities = new ArrayList<>(); | ||||
for (Role role : this.userRoleList) { | for (Role role : this.userRoleList) { | ||||
authorities.add(new SimpleGrantedAuthority(role.getCode())); | authorities.add(new SimpleGrantedAuthority(role.getCode())); | ||||
@@ -10,7 +10,6 @@ import com.ningdatech.basic.model.PageVo; | |||||
import io.swagger.annotations.ApiModelProperty; | import io.swagger.annotations.ApiModelProperty; | ||||
import lombok.Data; | import lombok.Data; | ||||
import java.io.Serializable; | |||||
import java.math.BigDecimal; | import java.math.BigDecimal; | ||||
import java.math.RoundingMode; | import java.math.RoundingMode; | ||||
import java.util.List; | import java.util.List; | ||||
@@ -152,10 +152,6 @@ sa-token: | |||||
token-style: uuid | token-style: uuid | ||||
# 是否输出操作日志 | # 是否输出操作日志 | ||||
is-log: false | is-log: false | ||||
#浙政钉公司顶级organizationCode | |||||
organization: | |||||
dept-visible-scopes: | |||||
- GO_ff70e47bae684fdba0d64f4acab85661 | |||||
yxt: | yxt: | ||||
# wsdl-url: http://115.239.137.23:9501/ws/v1?wsdl | # wsdl-url: http://115.239.137.23:9501/ws/v1?wsdl | ||||
@@ -168,72 +164,6 @@ yxt: | |||||
sms-enable: true | sms-enable: true | ||||
tel-enable: true | tel-enable: true | ||||
#省局联审 请求信息 | |||||
provincial: | |||||
# host: http://zj.ningdatech.com/prometheus-zhejiang_foreign | |||||
host: http://223.4.72.75/prometheus-zhejiang_foreign | |||||
pushUrl: /api/v1/foreign/importantPro | |||||
detailUrl: /api/v1/foreign/importantProView | |||||
domainUrl: /api/v1/foreign/dominantUnit | |||||
key: 7fb48b518c6044a5a44deddd11b445e3 | |||||
secret: ced8fff70018413c9516c58f95885624 | |||||
#天印服务器接口信息 | |||||
irs: | |||||
is-search-app: false | |||||
digital-resource-indicators: | |||||
url: https://interface.zjzwfw.gov.cn/gateway/api/proxy/001003001029/dataSharing/99E2bic31KdXzaa7.htm | |||||
interface-name: 99E2bic31KdXzaa7 | |||||
app-key: A331101453557202109017383 | |||||
app-secret: 496f0f2a19994f76b4fd9dae087366c7 | |||||
seal-platform: | |||||
project-id: 330001110 | |||||
project-secret: 70e512d40c8f440484db4acab181570a | |||||
access-key: 42bcb49bea174986a3bfdfba7d005566 | |||||
secret-key: bebff29877d4443abd67fc4f8fb335d8 | |||||
api-url: https://bcdsg.zj.gov.cn:8443/restapi/prod/IC33000020220309000004/seal-platform/seal/v1/rest/sign/signPdf | |||||
app-report: | |||||
url: https://bcdsg.zj.gov.cn:8443/restapi/prod/IC33000020230427000001/irs-res-bill/report/pdfUrl | |||||
appScret: BCDSGS_4ab4235d26a9a357170a39f3a13fd68c | |||||
appKey: BCDSGA_d874c8e46b541eb4e8aac6510fd3351b | |||||
push-app: | |||||
url: https://interface.zjzwfw.gov.cn/gateway/api/proxy/001003001029/dataSharing/94wbaL1I1Pbz0648.htm | |||||
appScret: 496f0f2a19994f76b4fd9dae087366c7 | |||||
appKey: A331101453557202109017383 | |||||
search-app: | |||||
url: https://interface.zjzwfw.gov.cn/gateway/api/001003001029/dataSharing/XS8daav3bcemZ3Ra.htm | |||||
appScret: 496f0f2a19994f76b4fd9dae087366c7 | |||||
appKey: A331101453557202109017383 | |||||
province-gov: | |||||
can-search: false | |||||
url: https://interface.zjzwfw.gov.cn/gateway/api/proxy/001003001029/dataSharing/62vd5jAdM0b7Gr00.htm | |||||
interfaceName: 62vd5jAdM0b7Gr00 | |||||
appSecret: 496f0f2a19994f76b4fd9dae087366c7 | |||||
appKey: A331101453557202109017383 | |||||
push-project-detail: | |||||
url: https://interface.zjzwfw.gov.cn/gateway/api/proxy/001003001029/dataSharing/3XN9R93Pva6db7sf.htm | |||||
interfaceName: 3XN9R93Pva6db7sf | |||||
appSecret: 496f0f2a19994f76b4fd9dae087366c7 | |||||
appKey: A331101453557202109017383 | |||||
core-biz: | |||||
url: https://interface.zjzwfw.gov.cn/gateway/api/001008012012001/dataSharing/Fc3re2cq7r64Qfa7.htm | |||||
interfaceName: Fc3re2cq7r64Qfa7 | |||||
appSecret: 496f0f2a19994f76b4fd9dae087366c7 | |||||
appKey: A331101453557202109017383 | |||||
interface-refresh: | |||||
method: POST | |||||
request-token-url: http://interface.zjzwfw.gov.cn/gateway/app/refreshTokenByKey.htm | |||||
refresh-token-url: http://interface.zjzwfw.gov.cn/gateway/app/refreshTokenBySec.htm | |||||
interface-local-refresh: | |||||
method: GET | |||||
request-token-url: https://interface.ls.local/a/api/requestTokenKey?appKey={appKey}&requestTime={requestTime}&sign={sign} | |||||
refresh-token-url: https://interface.ls.local/a/api/refreshTokenKey?appKey={appKey}&requestTime={requestTime}&sign={sign} | |||||
hostname: iZbp13nwyvib53j4j1p2xoZ | |||||
project: | |||||
push-url: http://120.26.44.207:38088/open/api/v1/project-receive/save | |||||
no-effective-url: http://120.26.44.207:38088/open/api/v1/project-receive/not-effective | |||||
delete-all-url: http://120.26.44.207:38088/open/api/v1/project-receive/delete-all | |||||
login: | login: | ||||
phone-verify-code: | phone-verify-code: | ||||
skip: true | skip: true | ||||
@@ -173,70 +173,6 @@ yxt: | |||||
sms-enable: false | sms-enable: false | ||||
tel-enable: false | tel-enable: false | ||||
#省局联审 请求信息 | |||||
provincial: | |||||
host: https://pms.zj.gov.cn/prometheus-zhejiang_foreign | |||||
pushUrl: /api/v1/foreign/importantPro | |||||
detailUrl: /api/v1/foreign/importantProView | |||||
domainUrl: /api/v1/foreign/dominantUnit | |||||
key: b5b2096953534a53991be4ea95f8cffa | |||||
secret: 1bec9b77134d4962ac466fbe9696b897 | |||||
#天印服务器接口信息 | |||||
irs: | |||||
is-search-app: true | |||||
digital-resource-indicators: | |||||
url: https://interface.zjzwfw.gov.cn/gateway/api/proxy/001003001029/dataSharing/99E2bic31KdXzaa7.htm | |||||
interfaceName: 99E2bic31KdXzaa7 | |||||
app-key: A331101453557202109017383 | |||||
app-secret: 496f0f2a19994f76b4fd9dae087366c7 | |||||
seal-platform: | |||||
project-id: 330001110 | |||||
project-secret: 70e512d40c8f440484db4acab181570a | |||||
access-key: 42bcb49bea174986a3bfdfba7d005566 | |||||
secret-key: bebff29877d4443abd67fc4f8fb335d8 | |||||
api-url: https://bcdsg.zj.gov.cn:8443/restapi/prod/IC33000020220309000004/seal-platform/seal/v1/rest/sign/signPdf | |||||
app-report: | |||||
url: https://bcdsg.zj.gov.cn:8443/restapi/prod/IC33000020230427000001/irs-res-bill/report/pdfUrl | |||||
appScret: BCDSGS_4ab4235d26a9a357170a39f3a13fd68c | |||||
appKey: BCDSGA_d874c8e46b541eb4e8aac6510fd3351b | |||||
push-app: | |||||
url: https://interface.zjzwfw.gov.cn/gateway/api/proxy/001003001029/dataSharing/94wbaL1I1Pbz0648.htm | |||||
appScret: 496f0f2a19994f76b4fd9dae087366c7 | |||||
appKey: A331101453557202109017383 | |||||
search-app: | |||||
url: https://interface.zjzwfw.gov.cn/gateway/api/001003001029/dataSharing/XS8daav3bcemZ3Ra.htm | |||||
appScret: 496f0f2a19994f76b4fd9dae087366c7 | |||||
appKey: A331101453557202109017383 | |||||
province-gov: | |||||
can-search: true | |||||
interfaceName: 62vd5jAdM0b7Gr00 | |||||
url: https://interface.zjzwfw.gov.cn/gateway/api/proxy/001003001029/dataSharing/62vd5jAdM0b7Gr00.htm | |||||
appSecret: 496f0f2a19994f76b4fd9dae087366c7 | |||||
appKey: A331101453557202109017383 | |||||
push-project-detail: | |||||
url: https://interface.zjzwfw.gov.cn/gateway/api/proxy/001003001029/dataSharing/3XN9R93Pva6db7sf.htm | |||||
interfaceName: 3XN9R93Pva6db7sf | |||||
appSecret: 496f0f2a19994f76b4fd9dae087366c7 | |||||
appKey: A331101453557202109017383 | |||||
core-biz: | |||||
url: https://interface.zjzwfw.gov.cn/gateway/api/001008012012001/dataSharing/Fc3re2cq7r64Qfa7.htm | |||||
interfaceName: Fc3re2cq7r64Qfa7 | |||||
appSecret: 496f0f2a19994f76b4fd9dae087366c7 | |||||
appKey: A331101453557202109017383 | |||||
interface-refresh: | |||||
method: POST | |||||
request-token-url: http://interface.zjzwfw.gov.cn/gateway/app/refreshTokenByKey.htm | |||||
refresh-token-url: http://interface.zjzwfw.gov.cn/gateway/app/refreshTokenBySec.htm | |||||
interface-local-refresh: | |||||
method: GET | |||||
request-token-url: https://interface.ls.local/a/api/requestTokenKey?appKey={appKey}&requestTime={requestTime}&sign={sign} | |||||
refresh-token-url: https://interface.ls.local/a/api/refreshTokenKey?appKey={appKey}&requestTime={requestTime}&sign={sign} | |||||
hostname: iZ6mx01gyeodd80imxd2gbZ | |||||
project: | |||||
push-url: http://10.53.168.41:38088/open/api/v1/project-receive/save | |||||
no-effective-url: http://10.53.168.41:38088/open/api/v1/project-receive/not-effective | |||||
delete-all-url: http://10.53.168.41:38088/open/api/v1/project-receive/delete-all | |||||
login: | login: | ||||
phone-verify-code: | phone-verify-code: | ||||
skip: false | skip: false | ||||
@@ -7,7 +7,6 @@ import com.hz.pm.api.AppTests; | |||||
import com.hz.pm.api.common.util.CryptUtils; | import com.hz.pm.api.common.util.CryptUtils; | ||||
import com.hz.pm.api.common.util.HmacAuthUtil; | import com.hz.pm.api.common.util.HmacAuthUtil; | ||||
import com.hz.pm.api.common.util.RefreshKeyUtil; | import com.hz.pm.api.common.util.RefreshKeyUtil; | ||||
import com.hz.pm.api.irs.manage.AppIrsManage; | |||||
import com.ningdatech.zwdd.ZwddIntegrationProperties; | import com.ningdatech.zwdd.ZwddIntegrationProperties; | ||||
import com.ningdatech.zwdd.client.ZwddAuthClient; | import com.ningdatech.zwdd.client.ZwddAuthClient; | ||||
import com.ningdatech.zwdd.client.ZwddClient; | import com.ningdatech.zwdd.client.ZwddClient; | ||||
@@ -8,9 +8,7 @@ import com.google.common.collect.Lists; | |||||
import com.ningdatech.basic.model.GenericResult; | import com.ningdatech.basic.model.GenericResult; | ||||
import com.hz.pm.api.AppTests; | import com.hz.pm.api.AppTests; | ||||
import com.hz.pm.api.ding.model.DingOrgInfoTreeDTO; | import com.hz.pm.api.ding.model.DingOrgInfoTreeDTO; | ||||
import com.hz.pm.api.ding.task.EmployeeBatchGetTask; | |||||
import com.hz.pm.api.ding.task.GovBusinessStripsTask; | import com.hz.pm.api.ding.task.GovBusinessStripsTask; | ||||
import com.hz.pm.api.ding.task.OrganizationBatchGetTask; | |||||
import com.hz.pm.api.organization.model.entity.DingOrganization; | import com.hz.pm.api.organization.model.entity.DingOrganization; | ||||
import com.hz.pm.api.organization.service.IDingOrganizationService; | import com.hz.pm.api.organization.service.IDingOrganizationService; | ||||
import com.ningdatech.zwdd.client.ZwddClient; | import com.ningdatech.zwdd.client.ZwddClient; | ||||
@@ -152,10 +152,6 @@ sa-token: | |||||
token-style: uuid | token-style: uuid | ||||
# 是否输出操作日志 | # 是否输出操作日志 | ||||
is-log: false | is-log: false | ||||
#浙政钉公司顶级organizationCode | |||||
organization: | |||||
dept-visible-scopes: | |||||
- GO_ff70e47bae684fdba0d64f4acab85661 | |||||
yxt: | yxt: | ||||
# wsdl-url: http://115.239.137.23:9501/ws/v1?wsdl | # wsdl-url: http://115.239.137.23:9501/ws/v1?wsdl | ||||
@@ -168,72 +164,6 @@ yxt: | |||||
sms-enable: true | sms-enable: true | ||||
tel-enable: true | tel-enable: true | ||||
#省局联审 请求信息 | |||||
provincial: | |||||
# host: http://zj.ningdatech.com/prometheus-zhejiang_foreign | |||||
host: http://223.4.72.75/prometheus-zhejiang_foreign | |||||
pushUrl: /api/v1/foreign/importantPro | |||||
detailUrl: /api/v1/foreign/importantProView | |||||
domainUrl: /api/v1/foreign/dominantUnit | |||||
key: 7fb48b518c6044a5a44deddd11b445e3 | |||||
secret: ced8fff70018413c9516c58f95885624 | |||||
#天印服务器接口信息 | |||||
irs: | |||||
is-search-app: false | |||||
digital-resource-indicators: | |||||
url: https://interface.zjzwfw.gov.cn/gateway/api/proxy/001003001029/dataSharing/99E2bic31KdXzaa7.htm | |||||
interface-name: 99E2bic31KdXzaa7 | |||||
app-key: A331101453557202109017383 | |||||
app-secret: 496f0f2a19994f76b4fd9dae087366c7 | |||||
seal-platform: | |||||
project-id: 330001110 | |||||
project-secret: 70e512d40c8f440484db4acab181570a | |||||
access-key: 42bcb49bea174986a3bfdfba7d005566 | |||||
secret-key: bebff29877d4443abd67fc4f8fb335d8 | |||||
api-url: https://bcdsg.zj.gov.cn:8443/restapi/prod/IC33000020220309000004/seal-platform/seal/v1/rest/sign/signPdf | |||||
app-report: | |||||
url: https://bcdsg.zj.gov.cn:8443/restapi/prod/IC33000020230427000001/irs-res-bill/report/pdfUrl | |||||
appScret: BCDSGS_4ab4235d26a9a357170a39f3a13fd68c | |||||
appKey: BCDSGA_d874c8e46b541eb4e8aac6510fd3351b | |||||
push-app: | |||||
url: https://interface.zjzwfw.gov.cn/gateway/api/proxy/001003001029/dataSharing/94wbaL1I1Pbz0648.htm | |||||
appScret: 496f0f2a19994f76b4fd9dae087366c7 | |||||
appKey: A331101453557202109017383 | |||||
search-app: | |||||
url: https://interface.zjzwfw.gov.cn/gateway/api/001003001029/dataSharing/XS8daav3bcemZ3Ra.htm | |||||
appScret: 496f0f2a19994f76b4fd9dae087366c7 | |||||
appKey: A331101453557202109017383 | |||||
province-gov: | |||||
can-search: false | |||||
url: https://interface.zjzwfw.gov.cn/gateway/api/proxy/001003001029/dataSharing/62vd5jAdM0b7Gr00.htm | |||||
interfaceName: 62vd5jAdM0b7Gr00 | |||||
appSecret: 496f0f2a19994f76b4fd9dae087366c7 | |||||
appKey: A331101453557202109017383 | |||||
push-project-detail: | |||||
url: https://interface.zjzwfw.gov.cn/gateway/api/proxy/001003001029/dataSharing/3XN9R93Pva6db7sf.htm | |||||
interfaceName: 3XN9R93Pva6db7sf | |||||
appSecret: 496f0f2a19994f76b4fd9dae087366c7 | |||||
appKey: A331101453557202109017383 | |||||
core-biz: | |||||
url: https://interface.zjzwfw.gov.cn/gateway/api/001008012012001/dataSharing/Fc3re2cq7r64Qfa7.htm | |||||
interfaceName: Fc3re2cq7r64Qfa7 | |||||
appSecret: 496f0f2a19994f76b4fd9dae087366c7 | |||||
appKey: A331101453557202109017383 | |||||
interface-refresh: | |||||
method: POST | |||||
request-token-url: http://interface.zjzwfw.gov.cn/gateway/app/refreshTokenByKey.htm | |||||
refresh-token-url: http://interface.zjzwfw.gov.cn/gateway/app/refreshTokenBySec.htm | |||||
interface-local-refresh: | |||||
method: GET | |||||
request-token-url: https://interface.ls.local/a/api/requestTokenKey?appKey={appKey}&requestTime={requestTime}&sign={sign} | |||||
refresh-token-url: https://interface.ls.local/a/api/refreshTokenKey?appKey={appKey}&requestTime={requestTime}&sign={sign} | |||||
hostname: iZbp13nwyvib53j4j1p2xoZ | |||||
project: | |||||
push-url: http://120.26.44.207:38088/open/api/v1/project-receive/save | |||||
no-effective-url: http://120.26.44.207:38088/open/api/v1/project-receive/not-effective | |||||
delete-all-url: http://120.26.44.207:38088/open/api/v1/project-receive/delete-all | |||||
login: | login: | ||||
phone-verify-code: | phone-verify-code: | ||||
skip: true | skip: true | ||||