修复预警检测失败
This commit is contained in:
parent
343cb8c76d
commit
494d375ac0
|
|
@ -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();
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
@ -160,12 +169,39 @@ public class PsyWarningServiceImpl implements IPsyWarningService
|
|||
|
||||
// 检查分值范围
|
||||
if (matchScoreRule(score, percentile, rule))
|
||||
{
|
||||
// 检查是否已存在相同的预警(避免重复创建)
|
||||
if (!isWarningExists(assessment.getAssessmentId(), rule.getRuleId(), factorId))
|
||||
{
|
||||
PsyWarning warning = createWarning(assessment, rule, score, factorId);
|
||||
if (warning != null)
|
||||
{
|
||||
insertWarning(warning);
|
||||
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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -193,22 +229,44 @@ public class PsyWarningServiceImpl implements IPsyWarningService
|
|||
log.info("分值匹配结果 - 规则ID: {}, 总分: {}, 匹配: {}", rule.getRuleId(), totalScore, matched);
|
||||
|
||||
if (matched)
|
||||
{
|
||||
// 检查是否已存在相同的预警(避免重复创建)
|
||||
if (!isWarningExists(assessment.getAssessmentId(), rule.getRuleId(), null))
|
||||
{
|
||||
PsyWarning warning = createWarning(assessment, rule, totalScore, null);
|
||||
if (warning != null)
|
||||
{
|
||||
try
|
||||
{
|
||||
int insertResult = insertWarning(warning);
|
||||
if (insertResult > 0)
|
||||
{
|
||||
warningCount++;
|
||||
log.info("创建预警成功 - 预警ID: {}, 规则ID: {}, 总分: {}",
|
||||
log.info("创建总分预警成功 - 预警ID: {}, 规则ID: {}, 总分: {}",
|
||||
warning.getWarningId(), rule.getRuleId(), totalScore);
|
||||
}
|
||||
else
|
||||
{
|
||||
log.error("创建预警失败 - 规则ID: {}, 总分: {}", rule.getRuleId(), totalScore);
|
||||
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;
|
||||
}
|
||||
|
||||
/**
|
||||
* 创建预警记录
|
||||
*/
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user