From 9ffdbd21ad142fdbea8c61511efeec633fb969db Mon Sep 17 00:00:00 2001 From: zhangrui Date: Sat, 10 Oct 2026 11:03:55 +0800 Subject: [PATCH] =?UTF-8?q?=E8=8D=A3=E8=AA=89=E6=A8=A1=E5=9D=97=E6=95=B0?= =?UTF-8?q?=E6=8D=AE=E7=9C=8B=E6=9D=BF=E6=9F=A5=E8=AF=A2=E6=8A=A5=E9=94=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/HonorBoardController.java | 35 +----------- .../honor/service/HonorCommonService.java | 9 +++ .../service/impl/HonorCommonServiceImpl.java | 57 +++++++++++++++++++ 3 files changed, 68 insertions(+), 33 deletions(-) diff --git a/src/main/java/com/budwk/app/zhgh/dayofficework/honor/controller/HonorBoardController.java b/src/main/java/com/budwk/app/zhgh/dayofficework/honor/controller/HonorBoardController.java index 1989527b..938f25e7 100644 --- a/src/main/java/com/budwk/app/zhgh/dayofficework/honor/controller/HonorBoardController.java +++ b/src/main/java/com/budwk/app/zhgh/dayofficework/honor/controller/HonorBoardController.java @@ -10,14 +10,11 @@ import org.nutz.dao.Dao; import org.nutz.dao.Sqls; import org.nutz.dao.entity.Record; import org.nutz.dao.sql.Sql; -import org.nutz.dao.util.Daos; import org.nutz.ioc.loader.annotation.Inject; import org.nutz.ioc.loader.annotation.IocBean; -import org.nutz.lang.util.NutMap; import org.nutz.mvc.annotation.At; import org.nutz.mvc.annotation.Ok; -import java.util.ArrayList; import java.util.Calendar; import java.util.List; @@ -42,36 +39,8 @@ public class HonorBoardController { @At @SaCheckPermission("honor.board") public Result getHonorTypeByYear() { - Sql sqlYear = Sqls.create(""" - select YEAR(grantDate) AS `year` from honor where grantDate is not null GROUP BY grantDate - """); - int[] yearList = (int[]) Daos.query(dao, sqlYear.toString(), Sqls.callback.ints()); - - List resultList = new ArrayList<>(); - for (int year : yearList) { - resultList.add(NutMap.NEW().addv("name", "集体荣誉").addv("num", 0).addv("year", year)); - resultList.add(NutMap.NEW().addv("name", "个人荣誉").addv("num", 0).addv("year", year)); - } - - Sql sql = Sqls.create(""" - SELECT YEAR - ( h.grantDate ) as year, - hbs.`name` - FROM - honor h - left join honor_basic_settings hbs on hbs.id = h.honorType - WHERE YEAR (h.grantDate) <= @currentYear - """); - sql.setParam("currentYear", Calendar.getInstance().get(Calendar.YEAR)); - List list = honorCommonService.listMap(sql); - - for (NutMap map : resultList) { - int year = map.getInt("year"); - String name = map.getString("name"); - long count = list.stream().filter(v -> v.getString("name").equals(name) && v.getInt("year") == year).count(); - map.setv("num", count); - } - return Result.success(resultList); + int currentYear = Calendar.getInstance().get(Calendar.YEAR); + return Result.success(honorCommonService.getHonorTypeStatisticsByYear(currentYear)); } @At diff --git a/src/main/java/com/budwk/app/zhgh/dayofficework/honor/service/HonorCommonService.java b/src/main/java/com/budwk/app/zhgh/dayofficework/honor/service/HonorCommonService.java index 153c9694..7c85c2f7 100644 --- a/src/main/java/com/budwk/app/zhgh/dayofficework/honor/service/HonorCommonService.java +++ b/src/main/java/com/budwk/app/zhgh/dayofficework/honor/service/HonorCommonService.java @@ -3,6 +3,7 @@ package com.budwk.app.zhgh.dayofficework.honor.service; import com.budwk.app.base.service.BaseService; import com.budwk.app.zhgh.dayofficework.honor.models.Honor; import com.budwk.app.zhgh.dayofficework.honor.models.HonorBasicSettings; +import org.nutz.lang.util.NutMap; import java.util.List; @@ -16,4 +17,12 @@ import java.util.List; public interface HonorCommonService extends BaseService { List getHonorBasicSettingsByQueryTypeCode(String queryTypeCode); + + /** + * 按年度统计集体荣誉和个人荣誉数量。 + * + * @param currentYear 当前允许统计的最大年份,晚于该年份的数据不返回 + * @return 年度荣誉统计列表;每项包含 name(荣誉类别)、num(数量)和 year(年份) + */ + List getHonorTypeStatisticsByYear(int currentYear); } diff --git a/src/main/java/com/budwk/app/zhgh/dayofficework/honor/service/impl/HonorCommonServiceImpl.java b/src/main/java/com/budwk/app/zhgh/dayofficework/honor/service/impl/HonorCommonServiceImpl.java index dcd909c2..1359b0a0 100644 --- a/src/main/java/com/budwk/app/zhgh/dayofficework/honor/service/impl/HonorCommonServiceImpl.java +++ b/src/main/java/com/budwk/app/zhgh/dayofficework/honor/service/impl/HonorCommonServiceImpl.java @@ -7,9 +7,16 @@ import com.budwk.app.zhgh.dayofficework.honor.models.HonorBasicSettings; import com.budwk.app.zhgh.dayofficework.honor.service.HonorCommonService; import org.nutz.dao.Cnd; import org.nutz.dao.Dao; +import org.nutz.dao.Sqls; +import org.nutz.dao.sql.Sql; import org.nutz.ioc.loader.annotation.IocBean; +import org.nutz.lang.Strings; +import org.nutz.lang.util.NutMap; +import java.util.ArrayList; +import java.util.LinkedHashMap; import java.util.List; +import java.util.Map; /** * @version 1.0 @@ -32,4 +39,54 @@ public class HonorCommonServiceImpl extends BaseServiceImpl implements Ho List query = dao().query(HonorBasicSettings.class, Cnd.where("parentId", "=", basicSettings.getId()).asc("`code`")); return query; } + + /** + * 按年度统计荣誉类别数量,并为每个存在荣誉数据的年度补齐集体荣誉、个人荣誉两类数据。 + * SQL 将年份显式转换为字符类型,避免部分 JDBC 驱动把 YEAR 函数结果识别为 Timestamp。 + * + * @param currentYear 当前允许统计的最大年份 + * @return 年度荣誉统计列表;每项包含 name、num、year 三个字段 + */ + @Override + public List getHonorTypeStatisticsByYear(int currentYear) { + Sql sql = Sqls.create(""" + SELECT + CAST(YEAR(h.grantDate) AS CHAR) AS honorYear, + hbs.`name` AS honorName, + COUNT(1) AS honorCount + FROM honor h + LEFT JOIN honor_basic_settings hbs ON hbs.id = h.honorType + WHERE h.grantDate IS NOT NULL + AND YEAR(h.grantDate) <= @currentYear + GROUP BY CAST(YEAR(h.grantDate) AS CHAR), hbs.`name` + ORDER BY honorYear + """); + sql.setParam("currentYear", currentYear); + List statistics = listMap(sql); + + // 每个年度固定返回两类荣誉,保证某一类别无数据时图表仍能显示 0。 + Map> statisticsByYear = new LinkedHashMap<>(); + for (NutMap statistic : statistics) { + String honorYear = statistic.getString("honorYear"); + if (Strings.isBlank(honorYear)) { + continue; + } + int year = Integer.parseInt(honorYear); + Map categoryStatistics = statisticsByYear.computeIfAbsent(year, key -> { + Map categoryMap = new LinkedHashMap<>(); + categoryMap.put("集体荣誉", 0L); + categoryMap.put("个人荣誉", 0L); + return categoryMap; + }); + String honorName = statistic.getString("honorName"); + if (categoryStatistics.containsKey(honorName)) { + categoryStatistics.put(honorName, statistic.getLong("honorCount")); + } + } + + List resultList = new ArrayList<>(); + statisticsByYear.forEach((year, categoryStatistics) -> categoryStatistics.forEach((name, count) -> + resultList.add(NutMap.NEW().addv("name", name).addv("num", count).addv("year", year)))); + return resultList; + } }