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 90437e1..b60d2f4 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 @@ -1,11 +1,13 @@ package org.dromara.demo.controller; +import java.util.ArrayList; import java.util.List; import lombok.RequiredArgsConstructor; import jakarta.servlet.http.HttpServletResponse; import jakarta.validation.constraints.*; -import cn.dev33.satoken.annotation.SaCheckPermission; +import org.dromara.demo.domain.vo.AllGoatAchieveDataVo; +import org.dromara.demo.domain.vo.AllGoatAchieveVo; import org.springframework.web.bind.annotation.*; import org.springframework.validation.annotation.Validated; import org.dromara.common.idempotent.annotation.RepeatSubmit; @@ -102,4 +104,29 @@ public class ProjectInfoController extends BaseController { @PathVariable String[] ids) { return toAjax(projectInfoService.deleteWithValidByIds(List.of(ids), true)); } + +// @GetMapping("/getInvestmentStats") +// public R> getInvestmentStats() { +// return R.ok(projectInfoService.getYearlyInvestmentStats()); +// } + + @GetMapping("/getInvestmentStats") + public R getInvestmentStats() { + List data = projectInfoService.getYearlyInvestmentStats(); + AllGoatAchieveVo rs = new AllGoatAchieveVo(); + rs.setProjectInfo(data); + rs.setDescription(getFiveYearPlanAchievements()); + return R.ok(rs); + } + + + private List getFiveYearPlanAchievements() { + List achievements = new ArrayList<>(); + achievements.add("“九五”:建成1座城镇污水处理厂;完成XX截污工程;完成XX河道截污疏浚工程。"); + achievements.add("“十五”:新增流域污水处理能力22万立方米/天;形成了5大排水系统,排水管网总长933.17公里。"); + achievements.add("“十一五”:新建污水管网251.66公里;城镇污水处理厂处理规模提升55万方/天。"); + achievements.add("“十二五”:截污治污系统基本建成;实施了补水工程;"); + achievements.add("“十三五”:新建再生水厂工程;分别完成排水和再生水管网建设719和123公里;完成30余条河沟水环境整治;新建修缮农村污水处理设施533座。"); + return achievements; + } } diff --git a/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/domain/ProjectInfo.java b/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/domain/ProjectInfo.java index d6daf0f..6088d17 100644 --- a/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/domain/ProjectInfo.java +++ b/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/domain/ProjectInfo.java @@ -6,6 +6,7 @@ import lombok.Data; import lombok.EqualsAndHashCode; import java.util.Date; import com.fasterxml.jackson.annotation.JsonFormat; +import org.springframework.format.annotation.DateTimeFormat; import java.io.Serial; @@ -37,6 +38,8 @@ public class ProjectInfo extends TenantEntity { /** * 项目时期(年月日) */ + @JsonFormat(pattern = "yyyy-MM-dd") + @DateTimeFormat(pattern = "yyyy-MM-dd") private Date projectDate; /** diff --git a/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/domain/vo/AllGoatAchieve.java b/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/domain/vo/AllGoatAchieveDataVo.java similarity index 89% rename from ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/domain/vo/AllGoatAchieve.java rename to ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/domain/vo/AllGoatAchieveDataVo.java index e56c0e4..024c0d8 100644 --- a/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/domain/vo/AllGoatAchieve.java +++ b/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/domain/vo/AllGoatAchieveDataVo.java @@ -7,7 +7,7 @@ import lombok.NoArgsConstructor; @Data @AllArgsConstructor @NoArgsConstructor -public class AllGoatAchieve { +public class AllGoatAchieveDataVo { private String date; private String planInvest; private String actualInvest; diff --git a/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/domain/vo/AllGoatAchieveVo.java b/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/domain/vo/AllGoatAchieveVo.java new file mode 100644 index 0000000..c8da615 --- /dev/null +++ b/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/domain/vo/AllGoatAchieveVo.java @@ -0,0 +1,15 @@ +package org.dromara.demo.domain.vo; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.List; + +@Data +@AllArgsConstructor +@NoArgsConstructor +public class AllGoatAchieveVo { + List projectInfo; + List description; +} 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 92b03df..4559422 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 @@ -1,6 +1,7 @@ package org.dromara.demo.service; import org.dromara.demo.domain.ProjectInfo; +import org.dromara.demo.domain.vo.AllGoatAchieveDataVo; import org.dromara.demo.domain.vo.ProjectInfoVo; import org.dromara.demo.domain.bo.ProjectInfoBo; import org.dromara.common.mybatis.core.page.TableDataInfo; @@ -68,4 +69,11 @@ public interface IProjectInfoService { Boolean deleteWithValidByIds(Collection ids, Boolean isValid); void addData(List list); + + + /** + * 获取项目投资年度统计:按年份累加计划/实际投资,并计算完成率(只返回数字,不带%) + * @return AllGoatAchieve 列表,date 字段为年份 + */ + List getYearlyInvestmentStats(); } 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 5a77d27..ad81d21 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 @@ -9,6 +9,7 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; 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.springframework.stereotype.Service; import org.dromara.demo.domain.bo.ProjectInfoBo; import org.dromara.demo.domain.vo.ProjectInfoVo; @@ -16,9 +17,9 @@ import org.dromara.demo.domain.ProjectInfo; import org.dromara.demo.mapper.ProjectInfoMapper; import org.dromara.demo.service.IProjectInfoService; -import java.util.List; -import java.util.Map; -import java.util.Collection; +import java.math.BigDecimal; +import java.math.RoundingMode; +import java.util.*; /** * 项目信息Service业务层处理 @@ -167,4 +168,69 @@ public class ProjectInfoServiceImpl extends ServiceImpl list) { this.saveBatch(list); } + + @Override + public List getYearlyInvestmentStats() { + List list = baseMapper.selectList(); + + // 按年份累加:TreeMap 自动按年份升序排序 + Map planMap = new TreeMap<>(); + Map actualMap = new TreeMap<>(); + + for (ProjectInfo item : list) { + int year = extractYear(item.getProjectDate()); // 不管是哪年都保留 + + BigDecimal plan = parseBigDecimal(item.getPlanInvest()); + BigDecimal actual = parseBigDecimal(item.getActualInvest()); + + planMap.put(year, planMap.getOrDefault(year, BigDecimal.ZERO).add(plan)); + actualMap.put(year, actualMap.getOrDefault(year, BigDecimal.ZERO).add(actual)); + } + + // 转换为返回结果 + List result = new ArrayList<>(); + for (Integer year : planMap.keySet()) { + BigDecimal plan = planMap.get(year); + BigDecimal actual = actualMap.get(year); + + // 计算完成率(只返回数字) + BigDecimal percent = BigDecimal.ZERO; + if (plan.compareTo(BigDecimal.ZERO) != 0) { + percent = actual.divide(plan, 2, RoundingMode.HALF_UP).multiply(BigDecimal.valueOf(100)); + } + + result.add(new AllGoatAchieveDataVo( + year.toString(), + format(plan), + format(actual), + format(percent) + )); + } + + return result; + } + + // --------------------- private 辅助方法 --------------------- + + private int extractYear(Date date) { + if (date == null) return 0; + Calendar cal = Calendar.getInstance(); + cal.setTime(date); + return cal.get(Calendar.YEAR); + } + + private BigDecimal parseBigDecimal(String str) { + if (str == null || str.trim().isEmpty()) return BigDecimal.ZERO; + try { + return new BigDecimal(str.trim()); + } catch (Exception e) { + return BigDecimal.ZERO; + } + } + + private String format(BigDecimal value) { + return value.setScale(2, RoundingMode.HALF_UP).toPlainString(); + } + + }