|
|
@ -1,6 +1,7 @@ |
|
|
|
package org.dromara.demo.service.impl; |
|
|
|
|
|
|
|
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; |
|
|
|
import lombok.extern.slf4j.Slf4j; |
|
|
|
import org.dromara.common.core.utils.MapstructUtils; |
|
|
|
import org.dromara.common.core.utils.StringUtils; |
|
|
|
import org.dromara.common.mybatis.core.page.TableDataInfo; |
|
|
@ -10,6 +11,7 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; |
|
|
|
import com.baomidou.mybatisplus.core.toolkit.Wrappers; |
|
|
|
import lombok.RequiredArgsConstructor; |
|
|
|
import org.dromara.demo.domain.vo.AllGoatAchieveDataVo; |
|
|
|
import org.dromara.demo.domain.vo.ProjectPerformanceVo; |
|
|
|
import org.springframework.stereotype.Service; |
|
|
|
import org.dromara.demo.domain.bo.ProjectInfoBo; |
|
|
|
import org.dromara.demo.domain.vo.ProjectInfoVo; |
|
|
@ -20,6 +22,7 @@ import org.dromara.demo.service.IProjectInfoService; |
|
|
|
import java.math.BigDecimal; |
|
|
|
import java.math.RoundingMode; |
|
|
|
import java.util.*; |
|
|
|
import java.util.stream.Collectors; |
|
|
|
|
|
|
|
/** |
|
|
|
* 项目信息Service业务层处理 |
|
|
@ -29,6 +32,7 @@ import java.util.*; |
|
|
|
*/ |
|
|
|
@RequiredArgsConstructor |
|
|
|
@Service |
|
|
|
@Slf4j |
|
|
|
public class ProjectInfoServiceImpl extends ServiceImpl<ProjectInfoMapper, ProjectInfo> implements IProjectInfoService { |
|
|
|
|
|
|
|
private final ProjectInfoMapper baseMapper; |
|
|
@ -210,7 +214,295 @@ public class ProjectInfoServiceImpl extends ServiceImpl<ProjectInfoMapper, Proje |
|
|
|
return result; |
|
|
|
} |
|
|
|
|
|
|
|
@Override |
|
|
|
public List<ProjectPerformanceVo> getPerformanceScore(ProjectInfoBo bo) { |
|
|
|
List<ProjectPerformanceVo> projectPerformanceVoList = new ArrayList<>(); |
|
|
|
List<ProjectInfoVo> projectInfoVoList = this.queryList(bo); |
|
|
|
for (ProjectInfoVo projectInfo : projectInfoVoList) { |
|
|
|
ProjectPerformanceVo projectPerformance = new ProjectPerformanceVo(); |
|
|
|
projectPerformance.setProjectName(projectInfo.getProjectName()); |
|
|
|
// 1. 批复等级得分
|
|
|
|
Double approvalLevelScore = getApprovalLevelScore(projectInfo); |
|
|
|
projectPerformance.setApprovalLevelScore(approvalLevelScore); |
|
|
|
// 2. 前期设计得分
|
|
|
|
Double earlyDesignScore = getEarlyDesignScore(projectInfo); |
|
|
|
projectPerformance.setEarlyDesignScore(earlyDesignScore); |
|
|
|
|
|
|
|
// 3. 资金来源得分
|
|
|
|
Double investResourceScore = getInvestResourceScore(projectInfo); |
|
|
|
projectPerformance.setInvestResourceScore(investResourceScore); |
|
|
|
// 4. 验收方式得分
|
|
|
|
Double acceptMethodResourceScore = getAcceptMethodResourceScore(projectInfo); |
|
|
|
projectPerformance.setAcceptMethodScore(acceptMethodResourceScore); |
|
|
|
|
|
|
|
// 5. 巡查模式得分
|
|
|
|
Double patrolTypeScore = getPatrolTypeScore(projectInfo); |
|
|
|
projectPerformance.setPatrolTypeScore(patrolTypeScore); |
|
|
|
|
|
|
|
// 6. 管理方式得分
|
|
|
|
Double manageTypeScore = getManageTypeScore(projectInfo); |
|
|
|
projectPerformance.setManageTypeScore(manageTypeScore); |
|
|
|
|
|
|
|
// 7. 运行情况得分
|
|
|
|
Double devStatusScore = getDevStatusScore(projectInfo); |
|
|
|
projectPerformance.setDevStatusScore(devStatusScore); |
|
|
|
// final:加入集合
|
|
|
|
projectPerformanceVoList.add(projectPerformance); |
|
|
|
//log.info("项目:{},批复等级:{} ,批复等级得分:{}", projectInfo.getProjectName(), projectInfo.getApprovalLevel(),approvalLevelScore);
|
|
|
|
//log.info("项目:{},前期设计:{} ,前期设计得分:{}", projectInfo.getProjectName(), projectInfo.getEarlyDesign(),earlyDesignScore);
|
|
|
|
//log.info("项目:{},资金来源:{} ,资金来源得分:{}", projectInfo.getProjectName(), projectInfo.getInvestResource(),investResourceScore);
|
|
|
|
//log.info("项目:{},验收方式:{} ,验收方式得分:{}", projectInfo.getProjectName(), projectInfo.getAcceptMethod(),acceptMethodResourceScore);
|
|
|
|
//log.info("项目:{},巡查模式:{} ,巡查模式得分:{}", projectInfo.getProjectName(), projectInfo.getPatrolType(),patrolTypeScore);
|
|
|
|
//log.info("项目:{},管理方式:{} ,管理方式得分:{}", projectInfo.getProjectName(), projectInfo.getManageType(),manageTypeScore);
|
|
|
|
log.info("项目:{},运行情况:{} ,运行情况得分:{}", projectInfo.getProjectName(), projectInfo.getDevStatus(),devStatusScore); |
|
|
|
} |
|
|
|
return projectPerformanceVoList; |
|
|
|
} |
|
|
|
|
|
|
|
@Override |
|
|
|
public ProjectPerformanceVo calculateAverageByType(ProjectInfoBo bo) { |
|
|
|
List<ProjectPerformanceVo> projectPerformanceVoList = this.getPerformanceScore(bo); |
|
|
|
String projectType = bo.getProjectTypeList(); |
|
|
|
|
|
|
|
if (projectPerformanceVoList == null || projectPerformanceVoList.isEmpty()) { |
|
|
|
return null; // 没有数据,返回 null
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
// 计算每个字段的平均值,并保留两位小数(四舍五入)
|
|
|
|
double approvalLevelScoreAvg = roundTo2DecimalPlaces(calculateAverage(projectPerformanceVoList, ProjectPerformanceVo::getApprovalLevelScore)); |
|
|
|
double earlyDesignScoreAvg = roundTo2DecimalPlaces(calculateAverage(projectPerformanceVoList, ProjectPerformanceVo::getEarlyDesignScore)); |
|
|
|
double investResourceScoreAvg = roundTo2DecimalPlaces(calculateAverage(projectPerformanceVoList, ProjectPerformanceVo::getInvestResourceScore)); |
|
|
|
double acceptMethodScoreAvg = roundTo2DecimalPlaces(calculateAverage(projectPerformanceVoList, ProjectPerformanceVo::getAcceptMethodScore)); |
|
|
|
double patrolTypeScoreAvg = roundTo2DecimalPlaces(calculateAverage(projectPerformanceVoList, ProjectPerformanceVo::getPatrolTypeScore)); |
|
|
|
double manageTypeScoreAvg = roundTo2DecimalPlaces(calculateAverage(projectPerformanceVoList, ProjectPerformanceVo::getManageTypeScore)); |
|
|
|
double devStatusScoreAvg = roundTo2DecimalPlaces(calculateAverage(projectPerformanceVoList, ProjectPerformanceVo::getDevStatusScore)); |
|
|
|
|
|
|
|
// 创建并设置平均值对象
|
|
|
|
ProjectPerformanceVo avgVo = new ProjectPerformanceVo(); |
|
|
|
avgVo.setProjectName(null); |
|
|
|
// 设置查询的类型
|
|
|
|
avgVo.setProjectType(projectType); |
|
|
|
avgVo.setApprovalLevelScore(approvalLevelScoreAvg); |
|
|
|
avgVo.setEarlyDesignScore(earlyDesignScoreAvg); |
|
|
|
avgVo.setInvestResourceScore(investResourceScoreAvg); |
|
|
|
avgVo.setAcceptMethodScore(acceptMethodScoreAvg); |
|
|
|
avgVo.setPatrolTypeScore(patrolTypeScoreAvg); |
|
|
|
avgVo.setManageTypeScore(manageTypeScoreAvg); |
|
|
|
avgVo.setDevStatusScore(devStatusScoreAvg); |
|
|
|
//TODO 绩效评分AI描述
|
|
|
|
avgVo.setDescription("城镇污水处理及配套工程的常态化管理水平相对较好,政府资金得到较好的保障。从各阶段来看,可行批复总体" + |
|
|
|
"以市级批复为主、初步设计阶段有勘探报告、资金来源充足、验收批复材料基本完整、定期巡查、运营效率的水" + |
|
|
|
"平相对较高,但管理部门以区级国企为主,有待进一步改善。" + |
|
|
|
"其中,“十二五”和“十三五”期间的项目以及排水管网及调蓄池建设类项目需要加强后期运营管护水平。" + |
|
|
|
"常态化管理水平较好的是污水厂建设类项目,较差的是污水处理厂改扩建工程(1)、污水厂改扩建工程(2)。"); |
|
|
|
return avgVo; // ✅ 返回真实计算出的平均值
|
|
|
|
} |
|
|
|
|
|
|
|
// --------------------- private 辅助方法 ---------------------
|
|
|
|
private Double getApprovalLevelScore(ProjectInfoVo projectInfo) { |
|
|
|
Double score = 0.0; |
|
|
|
String approvalLevel = projectInfo.getApprovalLevel(); |
|
|
|
switch (approvalLevel) { |
|
|
|
case "省级部门联合批复": |
|
|
|
score = 5.0; |
|
|
|
break; |
|
|
|
case "省级批复": |
|
|
|
score = 4.0; |
|
|
|
break; |
|
|
|
case "市级批复": |
|
|
|
score = 3.0; |
|
|
|
break; |
|
|
|
case "区级批复": |
|
|
|
score = 2.0; |
|
|
|
break; |
|
|
|
case "审批材料不完整": |
|
|
|
score = 1.0; |
|
|
|
break; |
|
|
|
default: |
|
|
|
score = 0.0; |
|
|
|
} |
|
|
|
return score; |
|
|
|
} |
|
|
|
public Double getEarlyDesignScore(ProjectInfoVo projectInfo) { |
|
|
|
String earlyDesign = projectInfo.getEarlyDesign(); |
|
|
|
if (earlyDesign == null || earlyDesign.isEmpty()) { |
|
|
|
return 0.0; |
|
|
|
} |
|
|
|
|
|
|
|
if (earlyDesign.equals("内容基本完善")) { |
|
|
|
return 5.0; |
|
|
|
} else if (earlyDesign.equals("有勘察或测绘报告/有环境影响评估/有水土保持报告")) { |
|
|
|
return 4.0; |
|
|
|
} else if (earlyDesign.contains("有环境影响评估/有水土保持报告")) { |
|
|
|
return 3.0; |
|
|
|
} else if (earlyDesign.contains("有勘察或测绘报告/有环境影响评估")) { |
|
|
|
return 3.0; |
|
|
|
} else if (earlyDesign.contains("有勘察或测绘报告/有水土保持报告")) { |
|
|
|
return 2.0; |
|
|
|
} else if (earlyDesign.contains("无")) { |
|
|
|
return 1.0; |
|
|
|
} else { |
|
|
|
return 0.0; |
|
|
|
} |
|
|
|
} |
|
|
|
private Double getInvestResourceScore(ProjectInfoVo projectInfo) { |
|
|
|
Double score = 0.0; |
|
|
|
String investResource = projectInfo.getInvestResource(); |
|
|
|
switch (investResource) { |
|
|
|
case "国家、省级专项资金": |
|
|
|
score = 5.0; |
|
|
|
break; |
|
|
|
case "市、区级政府专项资金": |
|
|
|
score = 4.0; |
|
|
|
break; |
|
|
|
case "自筹资金且充足": |
|
|
|
score = 3.0; |
|
|
|
break; |
|
|
|
case "自筹资金且无法保障": |
|
|
|
score = 2.0; |
|
|
|
break; |
|
|
|
case "资金不足而搁置": |
|
|
|
score = 1.0; |
|
|
|
break; |
|
|
|
default: |
|
|
|
score = 0.0; |
|
|
|
} |
|
|
|
return score; |
|
|
|
} |
|
|
|
|
|
|
|
private Double getAcceptMethodResourceScore(ProjectInfoVo projectInfo) { |
|
|
|
Double score = 0.0; |
|
|
|
String acceptMethod = projectInfo.getAcceptMethod(); |
|
|
|
switch (acceptMethod) { |
|
|
|
case "联合验收": |
|
|
|
score = 5.0; |
|
|
|
break; |
|
|
|
case "材料基本齐全": |
|
|
|
score = 4.0; |
|
|
|
break; |
|
|
|
case "合同与验收报告缺失": |
|
|
|
score = 1.0; |
|
|
|
break; |
|
|
|
default: |
|
|
|
score = 0.0; |
|
|
|
} |
|
|
|
return score; |
|
|
|
} |
|
|
|
|
|
|
|
private Double getPatrolTypeScore(ProjectInfoVo projectInfo) { |
|
|
|
Double score = 0.0; |
|
|
|
String patrolType = projectInfo.getPatrolType(); |
|
|
|
switch (patrolType) { |
|
|
|
case "实时监控": |
|
|
|
score = 5.0; |
|
|
|
break; |
|
|
|
case "市级部门联合巡查": |
|
|
|
score = 4.0; |
|
|
|
break; |
|
|
|
case "市级部门巡查": |
|
|
|
score = 3.0; |
|
|
|
break; |
|
|
|
case "主管部门定期巡查": |
|
|
|
score = 2.0; |
|
|
|
break; |
|
|
|
case "无": |
|
|
|
score = 1.0; |
|
|
|
break; |
|
|
|
default: |
|
|
|
score = 0.0; |
|
|
|
} |
|
|
|
return score; |
|
|
|
} |
|
|
|
|
|
|
|
private Double getManageTypeScore(ProjectInfoVo projectInfo) { |
|
|
|
Double score = 0.0; |
|
|
|
String manageType = projectInfo.getManageType(); |
|
|
|
switch (manageType) { |
|
|
|
case "多部门联合管理": |
|
|
|
score = 5.0; |
|
|
|
break; |
|
|
|
case "不设置": |
|
|
|
score = 4.0; |
|
|
|
break; |
|
|
|
case "市级部门下属国企管理": |
|
|
|
score = 3.0; |
|
|
|
break; |
|
|
|
case "属地管理且国企运行": |
|
|
|
score = 2.0; |
|
|
|
break; |
|
|
|
case "属地管理并社会招标": |
|
|
|
score = 1.0; |
|
|
|
break; |
|
|
|
default: |
|
|
|
score = 0.0; |
|
|
|
} |
|
|
|
return score; |
|
|
|
} |
|
|
|
private Double getDevStatusScore(ProjectInfoVo projectInfo) { |
|
|
|
Double score = 0.0; |
|
|
|
String devStatus = projectInfo.getDevStatus(); |
|
|
|
switch (devStatus) { |
|
|
|
case "远超设计目标实现联合调度": |
|
|
|
score = 5.0; |
|
|
|
break; |
|
|
|
case "基本达到设计目标": |
|
|
|
score = 4.0; |
|
|
|
break; |
|
|
|
case "正常运行并有年度运行报告": |
|
|
|
score = 3.0; |
|
|
|
break; |
|
|
|
case "短暂运行": |
|
|
|
score = 2.0; |
|
|
|
break; |
|
|
|
case "荒废": |
|
|
|
score = 1.0; |
|
|
|
break; |
|
|
|
default: |
|
|
|
score = 0.0; |
|
|
|
} |
|
|
|
return score; |
|
|
|
} |
|
|
|
|
|
|
|
/** |
|
|
|
* 通用方法:计算某个得分字段的平均值(保留两位小数) |
|
|
|
*/ |
|
|
|
/** |
|
|
|
* 通用方法:计算某个得分字段的平均值 |
|
|
|
* 注意:返回的 double 值未进行四舍五入,保留原始计算结果 |
|
|
|
*/ |
|
|
|
private double calculateAverage(List<ProjectPerformanceVo> list, |
|
|
|
java.util.function.Function<ProjectPerformanceVo, Double> getter) { |
|
|
|
return list.stream() |
|
|
|
.mapToDouble(vo -> { |
|
|
|
Double value = getter.apply(vo); |
|
|
|
return value != null ? value : 0.0; |
|
|
|
}) |
|
|
|
.average() // 返回 OptionalDouble
|
|
|
|
.orElse(0.0); // 如果列表为空或无有效值,返回 0.0
|
|
|
|
} |
|
|
|
|
|
|
|
/** |
|
|
|
* 使用 BigDecimal 保留两位小数(四舍五入) |
|
|
|
*/ |
|
|
|
private double roundTo2DecimalPlaces(double value) { |
|
|
|
return BigDecimal.valueOf(value) |
|
|
|
.setScale(2, RoundingMode.HALF_UP) // 四舍五入
|
|
|
|
.doubleValue(); |
|
|
|
} |
|
|
|
|
|
|
|
/** |
|
|
|
* 可选:将所有分数设为 0.00 |
|
|
|
*/ |
|
|
|
private void setAllScoresToZero(ProjectPerformanceVo vo) { |
|
|
|
vo.setApprovalLevelScore(0.0); |
|
|
|
vo.setEarlyDesignScore(0.0); |
|
|
|
vo.setInvestResourceScore(0.0); |
|
|
|
vo.setAcceptMethodScore(0.0); |
|
|
|
vo.setPatrolTypeScore(0.0); |
|
|
|
vo.setManageTypeScore(0.0); |
|
|
|
vo.setDevStatusScore(0.0); |
|
|
|
} |
|
|
|
|
|
|
|
private int extractYear(Date date) { |
|
|
|
if (date == null) return 0; |
|
|
|