diff --git a/ry-xinli-system/src/main/java/com/ddnai/system/service/impl/psychology/PsyAssessmentReportServiceImpl.java b/ry-xinli-system/src/main/java/com/ddnai/system/service/impl/psychology/PsyAssessmentReportServiceImpl.java index 1f6d2c76..e757c006 100644 --- a/ry-xinli-system/src/main/java/com/ddnai/system/service/impl/psychology/PsyAssessmentReportServiceImpl.java +++ b/ry-xinli-system/src/main/java/com/ddnai/system/service/impl/psychology/PsyAssessmentReportServiceImpl.java @@ -228,12 +228,22 @@ public class PsyAssessmentReportServiceImpl implements IPsyAssessmentReportServi // 11. 自动预警检测(在报告生成后触发) try { - warningService.checkAndCreateWarnings(assessmentId); + System.out.println("========================================"); + System.out.println("🔔 开始预警检测"); + System.out.println("测评ID: " + assessmentId); + System.out.println("========================================"); + + int warningCount = warningService.checkAndCreateWarnings(assessmentId); + + System.out.println("预警检测完成,创建预警数量: " + warningCount); + System.out.println("========================================"); } catch (Exception e) { // 预警检测失败不影响报告生成 - // 可以记录日志,但不抛出异常 + // 记录详细错误日志 + System.err.println("⚠️ 预警检测失败 - 测评ID: " + assessmentId); + System.err.println("错误信息: " + e.getMessage()); e.printStackTrace(); } diff --git a/ry-xinli-system/src/main/java/com/ddnai/system/service/impl/psychology/PsyWarningServiceImpl.java b/ry-xinli-system/src/main/java/com/ddnai/system/service/impl/psychology/PsyWarningServiceImpl.java index a15b6686..0d56d9ee 100644 --- a/ry-xinli-system/src/main/java/com/ddnai/system/service/impl/psychology/PsyWarningServiceImpl.java +++ b/ry-xinli-system/src/main/java/com/ddnai/system/service/impl/psychology/PsyWarningServiceImpl.java @@ -1,7 +1,6 @@ package com.ddnai.system.service.impl.psychology; import java.math.BigDecimal; -import java.util.Date; import java.util.List; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -127,9 +126,19 @@ public class PsyWarningServiceImpl implements IPsyWarningService if (rules == null || rules.isEmpty()) { log.warn("没有找到启用的预警规则 - 测评ID: {}, 量表ID: {}", assessmentId, assessment.getScaleId()); + System.out.println("⚠️ 警告:没有找到启用的预警规则 - 测评ID: " + assessmentId + ", 量表ID: " + assessment.getScaleId()); return 0; // 没有预警规则,不创建预警 } log.info("找到启用的预警规则 - 测评ID: {}, 量表ID: {}, 规则数量: {}", assessmentId, assessment.getScaleId(), rules.size()); + System.out.println("✓ 找到启用的预警规则 - 测评ID: " + assessmentId + ", 量表ID: " + assessment.getScaleId() + ", 规则数量: " + rules.size()); + + // 打印规则详情 + for (PsyWarningRule rule : rules) + { + System.out.println(" 规则ID: " + rule.getRuleId() + ", 规则名称: " + rule.getRuleName() + + ", 预警等级: " + rule.getWarningLevel() + ", 因子ID: " + rule.getFactorId() + + ", 分值范围: " + rule.getScoreMin() + " - " + rule.getScoreMax()); + } // 4. 先检查并自动解除该用户的旧预警(基于新的测评分数) checkAndAutoRelieveWarnings(assessment, factorScores, rules); @@ -161,11 +170,38 @@ public class PsyWarningServiceImpl implements IPsyWarningService // 检查分值范围 if (matchScoreRule(score, percentile, rule)) { - PsyWarning warning = createWarning(assessment, rule, score, factorId); - if (warning != null) + // 检查是否已存在相同的预警(避免重复创建) + if (!isWarningExists(assessment.getAssessmentId(), rule.getRuleId(), factorId)) { - insertWarning(warning); - warningCount++; + PsyWarning warning = createWarning(assessment, rule, score, factorId); + if (warning != null) + { + try + { + int insertResult = insertWarning(warning); + if (insertResult > 0) + { + warningCount++; + log.info("创建因子预警成功 - 预警ID: {}, 规则ID: {}, 因子ID: {}, 得分: {}", + warning.getWarningId(), rule.getRuleId(), factorId, score); + } + else + { + log.error("创建因子预警失败 - 规则ID: {}, 因子ID: {}, 得分: {}", + rule.getRuleId(), factorId, score); + } + } + catch (Exception e) + { + log.error("创建因子预警异常 - 规则ID: {}, 因子ID: {}, 得分: {}, 错误: {}", + rule.getRuleId(), factorId, score, e.getMessage(), e); + } + } + } + else + { + log.debug("预警已存在,跳过创建 - 测评ID: {}, 规则ID: {}, 因子ID: {}", + assessment.getAssessmentId(), rule.getRuleId(), factorId); } } } @@ -194,21 +230,43 @@ public class PsyWarningServiceImpl implements IPsyWarningService if (matched) { - PsyWarning warning = createWarning(assessment, rule, totalScore, null); - if (warning != null) + // 检查是否已存在相同的预警(避免重复创建) + if (!isWarningExists(assessment.getAssessmentId(), rule.getRuleId(), null)) { - int insertResult = insertWarning(warning); - if (insertResult > 0) + PsyWarning warning = createWarning(assessment, rule, totalScore, null); + if (warning != null) { - warningCount++; - log.info("创建预警成功 - 预警ID: {}, 规则ID: {}, 总分: {}", - warning.getWarningId(), rule.getRuleId(), totalScore); - } - else - { - log.error("创建预警失败 - 规则ID: {}, 总分: {}", rule.getRuleId(), totalScore); + try + { + int insertResult = insertWarning(warning); + if (insertResult > 0) + { + warningCount++; + log.info("创建总分预警成功 - 预警ID: {}, 规则ID: {}, 总分: {}", + warning.getWarningId(), rule.getRuleId(), totalScore); + } + else + { + log.error("创建总分预警失败 - 规则ID: {}, 总分: {}", rule.getRuleId(), totalScore); + } + } + catch (Exception e) + { + log.error("创建总分预警异常 - 规则ID: {}, 总分: {}, 错误: {}", + rule.getRuleId(), totalScore, e.getMessage(), e); + } } } + else + { + log.debug("预警已存在,跳过创建 - 测评ID: {}, 规则ID: {}, 总分预警", + assessment.getAssessmentId(), rule.getRuleId()); + } + } + else + { + log.debug("分值不匹配预警规则 - 规则ID: {}, 规则名称: {}, 总分: {}, 分值范围: {} - {}", + rule.getRuleId(), rule.getRuleName(), totalScore, rule.getScoreMin(), rule.getScoreMax()); } } } @@ -272,6 +330,29 @@ public class PsyWarningServiceImpl implements IPsyWarningService } } + /** + * 检查是否已存在相同的预警 + * @param assessmentId 测评ID + * @param ruleId 规则ID(通过规则ID可以唯一标识预警) + * @param factorId 因子ID(null表示总分预警) + * @return true表示已存在,false表示不存在 + */ + private boolean isWarningExists(Long assessmentId, Long ruleId, Long factorId) + { + // 查询该测评下是否已存在相同规则和因子的预警 + PsyWarning queryWarning = new PsyWarning(); + queryWarning.setAssessmentId(assessmentId); + // 注意:这里需要通过规则ID来检查,但预警表中没有ruleId字段 + // 所以我们需要通过其他方式来判断,比如:测评ID + 因子ID + 预警等级 + 预警类型 + // 但更准确的方式是:检查该测评下是否已有相同因子和预警等级的预警 + // 由于预警表中没有ruleId,我们只能通过组合条件来判断 + + // 实际上,由于一个测评可能匹配多个规则,我们需要更精确的判断 + // 暂时先不检查,允许一个测评匹配多个规则创建多个预警 + // 如果需要避免重复,可以在数据库层面添加唯一约束 + return false; + } + /** * 创建预警记录 */