基于测试用例 QualityLevelEvaluationTest.java 和用户需求,已完成质控系统的核心重新设计。新系统实现了自动匹配质控标准、5级质量评价、图像级详细结果记录、多线程并发执行等关键功能。
创建了4个新表来存储质控结果:
SQL脚本位置:/doc/sql/create_qc_redesign_tables.sql
创建了4个新实体类和对应的Mapper接口:
所有实体类都使用:
@TableName 注解指定表名@TableId 注解指定主键@TableField 注解指定字段名@Getter 和 @Setter位置:/modules/qc/engine/QcStandardMatcher.java
功能:
核心方法:
public QcStandard matchStandard(String modality, String bodyPart, String examItem)
特点:
位置:/modules/qc/engine/DicomMetadataParser.java
功能:
{模态} {部位} {扫描方式})核心方法:
public ParsedExamInfo parseExamInfo(String dicomFilePath)
返回信息:
特点:
DicomParser 组件位置:/modules/qc/engine/QcLevelEvaluator.java
功能:
质量等级:
核心方法:
public EvaluationResult evaluate(String metricValue, String thresholdValue)
评价逻辑:
位置:/modules/qc/service/QcExecutionService.java
接口方法:
返回结果:
ExecutionResult:批量执行结果(成功数、失败数、错误列表)StudyQcResult:单个检查质控结果(匹配的标准ID、是否成功、通过数、不通过数)位置:/modules/qc/service/impl/QcExecutionServiceImpl.java
核心流程:
1. 获取任务信息
2. 更新任务状态为"执行中"
3. 获取待检查的数据(study列表)
4. 遍历每个study:
a. 获取该study的所有DICOM图像
b. 解析第一张图像的元数据
c. 自动匹配质控标准
d. 如果匹配失败,记录错误日志,跳过该study
e. 获取质控因子列表
f. 遍历每张图像:
- 使用OpenCV分析图像指标
- 对每个因子进行5级评价
- 保存图像因子结果(qc_task_image_factor_result)
- 汇总图像整体结果(qc_task_image_result)
g. 汇总study整体结果(qc_task_overall_result)
5. 更新任务状态为"已完成"
6. 返回执行结果
1. 创建固定大小线程池(最大100并发)
2. 为每个任务提交Future到线程池
3. 统计成功/失败数量和错误信息
4. 等待所有任务完成
5. 返回批量执行结果
1. 获取study信息
2. 获取所有DICOM图像
3. 解析第一张图像元数据
4. 自动匹配质控标准(3级匹配)
5. 如果匹配失败:
- 记录ERROR日志
- 返回失败结果
6. 获取质控因子列表
7. 遍历每张图像执行质控:
- OpenCV图像分析
- 因子评价
- 保存结果
8. 汇总整体结果
9. 返回质控结果
特点:
位置:QcTaskManageController.java + QcTaskServiceImpl.java
需要修改:
standardId 字段的必填校验auto(自动匹配)类型QcExecutionService需要创建:QcResultDetailController.java
接口列表:
GET /qc/result/detail/{resultId} - 获取质控结果详情GET /qc/result/overall/{taskId} - 获取任务整体结果列表GET /qc/result/images/{taskId}/{studyId} - 获取检查的图像结果列表GET /qc/result/image-factors/{taskImageResultId} - 获取图像的因子结果列表GET /qc/result/logs/{taskId} - 获取任务执行日志位置:/qc_web/src/views/QcResultDetail.vue
页面结构(按照用户提供的图片):
┌─────────────────────────────────────────────┐
│ 患者基础信息(顶部) │
├──────────────────┬──────────────────────────┤
│ │ │
│ 报告显示 │ 影像阅片器 │
│ (左下) │ (右下) │
│ │ │
├──────────────────┴──────────────────────────┤
│ 质控结果(底部) │
│ - 整体质控结果(各因子汇总) │
│ - 图像详细结果(每张图像的质控详情) │
│ - 质控执行日志 │
└─────────────────────────────────────────────┘
需要确认:
OpenCVImageAnalyzer 是否已经存在?analyzeImageMetrics() 方法进行改进?@Service
public class QcScheduledService {
@Resource
private QcExecutionService qcExecutionService;
// 每天凌晨2点执行自动质控
@Scheduled(cron = "0 0 2 * * ?")
public void autoQc() {
// 1. 获取昨天所有新检查
List<StudyInfo> studies = getYesterdayStudies();
// 2. 对每个检查执行质控(自动匹配标准)
for (StudyInfo study : studies) {
QcExecutionService.StudyQcResult result =
qcExecutionService.executeStudyQc(study.getStudyId(), study.getInstitutionId());
if (!result.isSuccess()) {
log.error("质控失败:studyId={}, error={}",
study.getStudyId(), result.getErrorMessage());
}
}
}
}
// 批量执行100个质控任务,最大并发50
List<String> taskIds = getTaskIds();
QcExecutionService.ExecutionResult result =
qcExecutionService.executeQcTasksBatch(taskIds, 50);
log.info("批量执行完成:成功={}, 失败={}",
result.getSuccessCount(), result.getFailureCount());
// 1. 查询整体结果
List<QcTaskOverallResult> overallResults = qcTaskOverallResultMapper.selectList(
new LambdaQueryWrapper<QcTaskOverallResult>()
.eq(QcTaskOverallResult::getTaskId, taskId)
.eq(QcTaskOverallResult::getStudyId, studyId)
);
// 2. 查询图像结果
List<QcTaskImageResult> imageResults = qcTaskImageResultMapper.selectList(
new LambdaQueryWrapper<QcTaskImageResult>()
.eq(QcTaskImageResult::getTaskId, taskId)
.eq(QcTaskImageResult::getStudyId, studyId)
);
// 3. 查询某张图像的因子结果
List<QcTaskImageFactorResult> factorResults = qcTaskImageFactorResultMapper.selectList(
new LambdaQueryWrapper<QcTaskImageFactorResult>()
.eq(QcTaskImageFactorResult::getTaskImageResultId, imageResultId)
);
// 4. 查询执行日志
List<QcExecutionLog> logs = qcExecutionLogMapper.selectList(
new LambdaQueryWrapper<QcExecutionLog>()
.eq(QcExecutionLog::getTaskId, taskId)
.orderByDesc(QcExecutionLog::getCreateTime)
);
# 连接到数据库
mysql -u root -p qc_ns
# 执行建表脚本
source /path/to/doc/sql/create_qc_redesign_tables.sql
-- 查看新创建的表
SHOW TABLES LIKE 'qc_task%';
-- 查看表结构
DESC qc_task_overall_result;
DESC qc_task_image_result;
DESC qc_task_image_factor_result;
DESC qc_execution_log;
@Bean("qcTaskThreadPool")
public ThreadPoolTaskExecutor qcTaskThreadPool() {
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
executor.setCorePoolSize(10);
executor.setMaxPoolSize(100); // 最大100并发
executor.setQueueCapacity(200);
executor.setThreadNamePrefix("qc-task-");
executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
executor.initialize();
return executor;
}
DicomInstanceInfo 表中的 file_path 字段有正确的文件路径OpenCVImageAnalyzer 可正常工作qc_standard_factor 表的 threshold_value 字段中配置JSON格式的阈值saveBatch() 方法批量插入本次质控系统重新设计已完成核心功能的实现,包括:
✅ 数据库表结构设计(4个新表) ✅ 实体类和Mapper创建(4个实体+4个Mapper) ✅ 质控标准自动匹配器(3级匹配策略) ✅ DICOM元数据解析器(自动生成检查项目名称) ✅ 5级质量评价器(支持多种评价类型) ✅ 质控执行服务(解耦、多线程、支持定时任务)
核心改进:
下一步工作:
文件位置:
/doc/sql/create_qc_redesign_tables.sql/modules/qc/entity//modules/qc/mapper//modules/qc/engine//modules/qc/service/QcExecutionService.java/modules/qc/service/impl/QcExecutionServiceImpl.java