修复预警检测失败
This commit is contained in:
parent
343cb8c76d
commit
494d375ac0
|
|
@ -228,12 +228,22 @@ public class PsyAssessmentReportServiceImpl implements IPsyAssessmentReportServi
|
||||||
// 11. 自动预警检测(在报告生成后触发)
|
// 11. 自动预警检测(在报告生成后触发)
|
||||||
try
|
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)
|
catch (Exception e)
|
||||||
{
|
{
|
||||||
// 预警检测失败不影响报告生成
|
// 预警检测失败不影响报告生成
|
||||||
// 可以记录日志,但不抛出异常
|
// 记录详细错误日志
|
||||||
|
System.err.println("⚠️ 预警检测失败 - 测评ID: " + assessmentId);
|
||||||
|
System.err.println("错误信息: " + e.getMessage());
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,6 @@
|
||||||
package com.ddnai.system.service.impl.psychology;
|
package com.ddnai.system.service.impl.psychology;
|
||||||
|
|
||||||
import java.math.BigDecimal;
|
import java.math.BigDecimal;
|
||||||
import java.util.Date;
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
|
|
@ -127,9 +126,19 @@ public class PsyWarningServiceImpl implements IPsyWarningService
|
||||||
if (rules == null || rules.isEmpty())
|
if (rules == null || rules.isEmpty())
|
||||||
{
|
{
|
||||||
log.warn("没有找到启用的预警规则 - 测评ID: {}, 量表ID: {}", assessmentId, assessment.getScaleId());
|
log.warn("没有找到启用的预警规则 - 测评ID: {}, 量表ID: {}", assessmentId, assessment.getScaleId());
|
||||||
|
System.out.println("⚠️ 警告:没有找到启用的预警规则 - 测评ID: " + assessmentId + ", 量表ID: " + assessment.getScaleId());
|
||||||
return 0; // 没有预警规则,不创建预警
|
return 0; // 没有预警规则,不创建预警
|
||||||
}
|
}
|
||||||
log.info("找到启用的预警规则 - 测评ID: {}, 量表ID: {}, 规则数量: {}", assessmentId, assessment.getScaleId(), rules.size());
|
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. 先检查并自动解除该用户的旧预警(基于新的测评分数)
|
// 4. 先检查并自动解除该用户的旧预警(基于新的测评分数)
|
||||||
checkAndAutoRelieveWarnings(assessment, factorScores, rules);
|
checkAndAutoRelieveWarnings(assessment, factorScores, rules);
|
||||||
|
|
@ -160,12 +169,39 @@ public class PsyWarningServiceImpl implements IPsyWarningService
|
||||||
|
|
||||||
// 检查分值范围
|
// 检查分值范围
|
||||||
if (matchScoreRule(score, percentile, rule))
|
if (matchScoreRule(score, percentile, rule))
|
||||||
|
{
|
||||||
|
// 检查是否已存在相同的预警(避免重复创建)
|
||||||
|
if (!isWarningExists(assessment.getAssessmentId(), rule.getRuleId(), factorId))
|
||||||
{
|
{
|
||||||
PsyWarning warning = createWarning(assessment, rule, score, factorId);
|
PsyWarning warning = createWarning(assessment, rule, score, factorId);
|
||||||
if (warning != null)
|
if (warning != null)
|
||||||
{
|
{
|
||||||
insertWarning(warning);
|
try
|
||||||
|
{
|
||||||
|
int insertResult = insertWarning(warning);
|
||||||
|
if (insertResult > 0)
|
||||||
|
{
|
||||||
warningCount++;
|
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);
|
log.info("分值匹配结果 - 规则ID: {}, 总分: {}, 匹配: {}", rule.getRuleId(), totalScore, matched);
|
||||||
|
|
||||||
if (matched)
|
if (matched)
|
||||||
|
{
|
||||||
|
// 检查是否已存在相同的预警(避免重复创建)
|
||||||
|
if (!isWarningExists(assessment.getAssessmentId(), rule.getRuleId(), null))
|
||||||
{
|
{
|
||||||
PsyWarning warning = createWarning(assessment, rule, totalScore, null);
|
PsyWarning warning = createWarning(assessment, rule, totalScore, null);
|
||||||
if (warning != null)
|
if (warning != null)
|
||||||
|
{
|
||||||
|
try
|
||||||
{
|
{
|
||||||
int insertResult = insertWarning(warning);
|
int insertResult = insertWarning(warning);
|
||||||
if (insertResult > 0)
|
if (insertResult > 0)
|
||||||
{
|
{
|
||||||
warningCount++;
|
warningCount++;
|
||||||
log.info("创建预警成功 - 预警ID: {}, 规则ID: {}, 总分: {}",
|
log.info("创建总分预警成功 - 预警ID: {}, 规则ID: {}, 总分: {}",
|
||||||
warning.getWarningId(), rule.getRuleId(), totalScore);
|
warning.getWarningId(), rule.getRuleId(), totalScore);
|
||||||
}
|
}
|
||||||
else
|
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