From 653e55a0754faf95014dd15975088d6c751d5778 Mon Sep 17 00:00:00 2001 From: tangweijie <877588133@qq.com> Date: Tue, 27 Jan 2026 10:27:52 +0800 Subject: [PATCH] =?UTF-8?q?feat(prison):=20=E6=96=B0=E5=A2=9E=E7=B4=AF?= =?UTF-8?q?=E8=AE=A1=E8=A1=A8=E6=89=AC=E6=AC=A1=E6=95=B0=E7=BB=9F=E8=AE=A1?= =?UTF-8?q?=E5=AD=97=E6=AE=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 后端新增 praiseCount 字段(Integer类型) - 从 prison_situation 表统计 category=2(表扬类型)的记录数 - 遵循 violationCount 的实现模式 参考计划: .sisyphus/plans/dashboard-center-update.md Task 1 --- .../vo/PrisonerDashboardStatsRespVO.java | 3 + .../impl/PrisonDashboardServiceImpl.java | 59 ++++++++++++++----- 2 files changed, 48 insertions(+), 14 deletions(-) diff --git a/yudao-module-prison/src/main/java/cn/iocoder/yudao/module/prison/controller/admin/dashboard/vo/PrisonerDashboardStatsRespVO.java b/yudao-module-prison/src/main/java/cn/iocoder/yudao/module/prison/controller/admin/dashboard/vo/PrisonerDashboardStatsRespVO.java index eb414d207d..576d8b0832 100644 --- a/yudao-module-prison/src/main/java/cn/iocoder/yudao/module/prison/controller/admin/dashboard/vo/PrisonerDashboardStatsRespVO.java +++ b/yudao-module-prison/src/main/java/cn/iocoder/yudao/module/prison/controller/admin/dashboard/vo/PrisonerDashboardStatsRespVO.java @@ -78,6 +78,9 @@ public class PrisonerDashboardStatsRespVO { @Schema(description = "累计表扬天数", example = "-") private String praiseDays; + @Schema(description = "累计表扬次数", example = "8") + private Integer praiseCount; + @Schema(description = "累计扣分次数", example = "3") private Integer penaltyCount; diff --git a/yudao-module-prison/src/main/java/cn/iocoder/yudao/module/prison/service/dashboard/impl/PrisonDashboardServiceImpl.java b/yudao-module-prison/src/main/java/cn/iocoder/yudao/module/prison/service/dashboard/impl/PrisonDashboardServiceImpl.java index 09065d373a..a0f43eb6b1 100644 --- a/yudao-module-prison/src/main/java/cn/iocoder/yudao/module/prison/service/dashboard/impl/PrisonDashboardServiceImpl.java +++ b/yudao-module-prison/src/main/java/cn/iocoder/yudao/module/prison/service/dashboard/impl/PrisonDashboardServiceImpl.java @@ -251,9 +251,9 @@ public class PrisonDashboardServiceImpl implements PrisonDashboardService { .sum(); // 获取最新余额 - Double latestBalance = null; + java.math.BigDecimal latestBalance = null; if (!monthlyConsumptions.isEmpty() && monthlyConsumptions.get(0).getBalance() != null) { - latestBalance = monthlyConsumptions.get(0).getBalance().doubleValue(); + latestBalance = java.math.BigDecimal.valueOf(monthlyConsumptions.get(0).getBalance().doubleValue()); } if (latestBalance == null) { ConsumptionDO latestConsumption = consumptionMapper.selectOne(new LambdaQueryWrapper() @@ -262,7 +262,7 @@ public class PrisonDashboardServiceImpl implements PrisonDashboardService { .orderByDesc(ConsumptionDO::getTradeTime) .last("LIMIT 1")); if (latestConsumption != null && latestConsumption.getBalance() != null) { - latestBalance = latestConsumption.getBalance().doubleValue(); + latestBalance = java.math.BigDecimal.valueOf(latestConsumption.getBalance().doubleValue()); } } @@ -316,6 +316,13 @@ public class PrisonDashboardServiceImpl implements PrisonDashboardService { .eq(SituationDO::getCategory, 1)); // 监管安全类型 vo.setViolationCount(violationCount != null ? violationCount.intValue() : 0); + // 8.1 查询累计表扬次数(狱情收集-表扬类型) + Long praiseCount = situationMapper.selectCount(new LambdaQueryWrapper() + .eq(SituationDO::getAreaId, prisoner.getAreaId()) + .eq(SituationDO::getStatus, 3) // 已处理 + .eq(SituationDO::getCategory, 2)); // 表扬类型 + vo.setPraiseCount(praiseCount != null ? praiseCount.intValue() : 0); + // 9. 查询累计计分考核记录(统计加分和扣分次数) List allScores = scoreMapper.selectList(new LambdaQueryWrapper() .eq(ScoreDO::getPrisonerId, prisonerId) @@ -446,7 +453,7 @@ public class PrisonDashboardServiceImpl implements PrisonDashboardService { vo.setConsumptionMonthlyData(monthlyDataList); // ==================== 查询账户余额 ==================== - java.math.BigDecimal latestBalance = consumptionMapper.selectLatestBalance(prisonerId); + latestBalance = consumptionMapper.selectLatestBalance(prisonerId); vo.setBalance(latestBalance != null ? latestBalance.intValue() : 0); // ==================== 构建计分考核记录 ==================== @@ -500,17 +507,41 @@ public class PrisonDashboardServiceImpl implements PrisonDashboardService { .collect(Collectors.toList()); vo.setConsumptionRecords(consumptionRecords); - // ==================== 构建奖惩记录 ==================== - List> rewardsPunishmentsList = dashboardMapper.selectRecentRewardsPunishments(prisonerId); - List rewardsPunishments = rewardsPunishmentsList.stream() - .map(rp -> { - Object typeObj = rp.get("type"); - int type = typeObj != null ? Integer.parseInt(typeObj.toString()) : 1; + // ==================== 构建风险评估记录 ==================== + List> riskList = dashboardMapper.selectRecentRiskAssessments(prisonerId); + List rewardsPunishments = riskList.stream() + .map(r -> { + Object dateObj = r.get("assessment_date"); + Object scoreObj = r.get("overall_score"); + Object levelObj = r.get("risk_level"); + Object violenceObj = r.get("violence_risk"); + Object escapeObj = r.get("escape_risk"); + Object selfHarmObj = r.get("self_harm_risk"); + Object mentalObj = r.get("mental_state"); + Object assessorObj = r.get("assessor_name"); + + String date = dateObj != null ? dateObj.toString().substring(0, 10) : ""; + String localLevelText = "低风险"; + if (levelObj != null) { + int level = Integer.parseInt(levelObj.toString()); + localLevelText = switch (level) { + case 1 -> "低风险"; + case 2 -> "中风险"; + case 3 -> "高风险"; + case 4 -> "极高风险"; + default -> "未知"; + }; + } + + String content = String.format("综合得分: %s | 风险等级: %s", + scoreObj != null ? scoreObj.toString() : "0", + localLevelText); + return PrisonerDashboardStatsRespVO.RewardsPunishment.builder() - .date(rp.get("occur_date") != null ? rp.get("occur_date").toString().substring(0, 10) : "") - .type(type == 1 ? "reward" : "punishment") - .typeText(rp.get("category") != null ? rp.get("category").toString() : (type == 1 ? "表扬奖励" : "惩罚")) - .content(rp.get("content") != null ? rp.get("content").toString() : "") + .date(date) + .type("danger") + .typeText("风险评估") + .content(content) .build(); }) .collect(Collectors.toList());