diff --git a/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/controller/ProjectInfoController.java b/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/controller/ProjectInfoController.java index 67c2111..daa0af2 100644 --- a/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/controller/ProjectInfoController.java +++ b/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/controller/ProjectInfoController.java @@ -8,6 +8,7 @@ import jakarta.servlet.http.HttpServletResponse; import jakarta.validation.constraints.*; import org.dromara.demo.domain.vo.AllGoatAchieveDataVo; import org.dromara.demo.domain.vo.AllGoatAchieveVo; +import org.dromara.demo.domain.vo.ProjectPerformanceVo; import org.springframework.web.bind.annotation.*; import org.springframework.validation.annotation.Validated; import org.dromara.common.idempotent.annotation.RepeatSubmit; @@ -142,4 +143,17 @@ public class ProjectInfoController extends BaseController { return R.ok(rs); } + @GetMapping("/getPerformanceScore") + public R> getPerformanceScore(ProjectInfoBo bo) { + + List rs =projectInfoService.getPerformanceScore(bo); + return R.ok(rs); + } + @GetMapping("/calculateAverageByType") + public R calculateAverageByType(ProjectInfoBo bo) { + + ProjectPerformanceVo rs =projectInfoService.calculateAverageByType(bo); + return R.ok(rs); + } + } diff --git a/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/domain/bo/ProjectInfoBo.java b/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/domain/bo/ProjectInfoBo.java index 69591a4..400da14 100644 --- a/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/domain/bo/ProjectInfoBo.java +++ b/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/domain/bo/ProjectInfoBo.java @@ -65,7 +65,7 @@ public class ProjectInfoBo extends BaseEntity { private String ifPlan; /** - * 审批级别 + * 批复等级 */ //@NotBlank(message = "审批级别不能为空", groups = { AddGroup.class, EditGroup.class }) private String approvalLevel; diff --git a/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/domain/vo/ProjectInfoVo.java b/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/domain/vo/ProjectInfoVo.java index 61e1c03..c1f42fc 100644 --- a/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/domain/vo/ProjectInfoVo.java +++ b/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/domain/vo/ProjectInfoVo.java @@ -74,9 +74,9 @@ public class ProjectInfoVo implements Serializable { private String ifPlan; /** - * 审批级别 + * 批复等级 */ - @ExcelProperty(value = "审批级别") + @ExcelProperty(value = "批复等级") private String approvalLevel; /** diff --git a/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/domain/vo/ProjectPerformanceVo.java b/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/domain/vo/ProjectPerformanceVo.java new file mode 100644 index 0000000..4920982 --- /dev/null +++ b/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/domain/vo/ProjectPerformanceVo.java @@ -0,0 +1,35 @@ +package org.dromara.demo.domain.vo; + + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@AllArgsConstructor +@NoArgsConstructor +public class ProjectPerformanceVo { + + private String projectName; + // 总体描述 + private String description; + + private String projectType; + // 批复等级得分 + private Double approvalLevelScore; + // 前期设计得分 + private Double earlyDesignScore; + // 资金来源得分 + private Double investResourceScore; + // 验收方式得分 + private Double acceptMethodScore; + // 巡查模式得分 + private Double patrolTypeScore; + // 管理方式得分 + private Double manageTypeScore; + // 运行情况得分 + private Double devStatusScore; + + + +} diff --git a/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/service/IProjectInfoService.java b/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/service/IProjectInfoService.java index 4559422..c38b027 100644 --- a/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/service/IProjectInfoService.java +++ b/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/service/IProjectInfoService.java @@ -6,6 +6,7 @@ import org.dromara.demo.domain.vo.ProjectInfoVo; import org.dromara.demo.domain.bo.ProjectInfoBo; import org.dromara.common.mybatis.core.page.TableDataInfo; import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.demo.domain.vo.ProjectPerformanceVo; import java.util.Collection; import java.util.List; @@ -76,4 +77,9 @@ public interface IProjectInfoService { * @return AllGoatAchieve 列表,date 字段为年份 */ List getYearlyInvestmentStats(); + + + List getPerformanceScore(ProjectInfoBo bo); + + ProjectPerformanceVo calculateAverageByType(ProjectInfoBo bo); } diff --git a/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/service/impl/ProjectInfoServiceImpl.java b/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/service/impl/ProjectInfoServiceImpl.java index 4397048..44b5522 100644 --- a/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/service/impl/ProjectInfoServiceImpl.java +++ b/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/service/impl/ProjectInfoServiceImpl.java @@ -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 implements IProjectInfoService { private final ProjectInfoMapper baseMapper; @@ -210,7 +214,295 @@ public class ProjectInfoServiceImpl extends ServiceImpl getPerformanceScore(ProjectInfoBo bo) { + List projectPerformanceVoList = new ArrayList<>(); + List 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 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 list, + java.util.function.Function 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;