DICOM数据管理功能实现说明
功能概述
本次实现了完整的DICOM文件上传、解析和数据管理功能,包括:
第一步:DICOM文件上传和解析 ✓
DICOM文件上传
- 支持单文件和批量上传
- 自动解析DICOM文件,提取患者信息和检查信息
- 自动保存患者信息到patient_info表
- 自动保存检查信息到study_info表
- 文件存储到本地:
/data/dicom/{机构ID}/{日期}/{文件ID}.dcm
DICOM解析功能
- 提取患者基本信息:患者ID、姓名、性别、年龄等
- 提取检查信息:检查日期、检查类型、检查描述、检查部位等
- 识别多部位检查(根据检查描述中的关键词)
- 自动判断数据是否需要治理(关键字段缺失)
多部位检查识别
- 根据检查描述自动识别多部位检查
- 关键词:双侧、双、和、+、&、bilateral、and、with等
- 支持拆分多部位检查描述
第二步:数据管理功能 ✓
数据列表展示
- 机构名称
- 患者姓名
- 手机号
- 身份证号
- 检查日期
- 检查类型
- 检查状态(待检查、检查中、已完成)
- 数据上传时间
- 智能治理(操作按钮)
- 确认状态(待确认、已确认、已驳回)
- 操作(确认、查看、删除)
数据筛选功能
- 按机构筛选
- 按患者姓名筛选
- 按手机号筛选
- 按检查类型筛选
- 按检查状态筛选
- 按治理状态筛选
- 按确认状态筛选
数据操作功能
- 智能治理:自动标准化数据(检查描述、检查类型、检查部位等)
- 确认数据:确认或驳回检查数据
- 删除数据:删除检查数据
- 查看数据:查看详情(预留接口)
数据库表结构
扩展的表字段
patient_info表新增字段:
study_info表新增字段:
- check_status:检查状态(0待检查 1检查中 2已完成)
- upload_time:数据上传时间
- govern_status:治理状态(0未治理 1已治理 2治理中)
- confirm_status:确认状态(0待确认 1已确认 2已驳回)
- is_split:是否拆分(0否 1是)
- parent_study_id:父检查ID(拆分后的记录指向原始检查)
新增的表
- study_split_record:检查项目拆分记录表
- data_govern_record:数据治理记录表
- dicom_file_info:DICOM文件信息表
- image_thumbnail:影像缩略图表
文件结构
后端文件
QConline/src/main/java/com/zskk/qconline/modules/
├── dicom/
│ ├── controller/
│ │ ├── DicomController.java # DICOM上传接口
│ │ └── DataManageController.java # 数据管理接口
│ ├── service/
│ │ ├── DicomService.java # DICOM服务接口
│ │ └── DataManageService.java # 数据管理服务接口
│ ├── service/impl/
│ │ ├── DicomServiceImpl.java # DICOM服务实现
│ │ └── DataManageServiceImpl.java # 数据管理服务实现
│ ├── vo/
│ │ ├── DicomUploadVO.java # DICOM上传响应VO
│ │ ├── DataManageQueryVO.java # 数据管理查询VO
│ │ └── DataManageVO.java # 数据管理列表VO
│ └── util/
│ └── DicomParser.java # DICOM解析工具类
前端文件
qconline_web/src/
├── api/
│ ├── dicom.ts # DICOM上传API
│ ├── dataManage.ts # 数据管理API
│ └── institution.ts # 机构API
└── views/
├── DicomUpload.vue # DICOM上传页面
└── DataManage.vue # 数据管理列表页面
使用说明
1. 执行数据库脚本
首先执行数据库表结构扩展脚本:
mysql -u root -p qconline < /path/to/data_management_tables.sql
2. 配置文件存储路径
确保服务器有以下目录并具有写权限:
mkdir -p /data/dicom
chmod 755 /data/dicom
或者修改 DicomServiceImpl.java 中的存储路径:
private static final String DICOM_ROOT_PATH = "/your/custom/path/";
3. 重启后端服务
由于添加了新的依赖(dcm4che),需要重新构建:
cd /Users/geng/Documents/IdeaProjects/QConline
mvn clean package
# 然后重启应用
4. 使用功能
DICOM上传
- 登录系统
- 点击菜单:数据管理 → DICOM上传
- 选择所属机构
- 选择上传方式(单文件/批量)
- 拖拽或选择DICOM文件
- 点击"开始上传"
- 查看上传结果(患者信息、检查信息、是否多部位、是否需要治理)
数据管理
- 点击菜单:数据管理 → 数据列表
- 使用顶部筛选条件查询数据
- 查看列表中的数据信息
- 点击"治理"按钮进行智能治理
- 点击"确认"按钮确认数据
- 点击"查看"按钮查看详情(预留)
- 点击"删除"按钮删除数据
API接口文档
1. DICOM上传
上传单个DICOM文件
- URL:
POST /api/dicom/upload
- 参数:
- file: MultipartFile(DICOM文件)
- institutionId: String(机构ID)
- 响应: DicomUploadVO
批量上传DICOM文件
- URL:
POST /api/dicom/batch-upload
- 参数:
- files: MultipartFile[](DICOM文件数组)
- institutionId: String(机构ID)
- 响应: DicomUploadVO[]
2. 数据管理
分页查询数据列表
- URL:
GET /api/data-manage/list
- 参数: DataManageQueryVO
- 响应: Page
确认检查数据
- URL:
PUT /api/data-manage/confirm/{studyId}
- 参数:
- confirmStatus: Integer(1已确认 2已驳回)
- 响应: 成功/失败
执行数据治理
- URL:
PUT /api/data-manage/govern/{studyId}
- 响应: 成功/失败
删除检查数据
- URL:
DELETE /api/data-manage/{studyId}
- 响应: 成功/失败
核心功能说明
DICOM解析
使用dcm4che库解析DICOM文件,提取以下信息:
患者信息:
- PatientID(患者ID)
- PatientName(患者姓名)
- PatientSex(性别)
- PatientAge(年龄)
- PatientTelephoneNumbers(电话)
检查信息:
- StudyInstanceUID(检查实例UID)
- StudyDate(检查日期)
- StudyTime(检查时间)
- AccessionNumber(检查号)
- Modality(检查类型)
- StudyDescription(检查描述)
- BodyPartExamined(检查部位)
- ViewPosition(体位)
多部位检查识别
识别规则:
- 检查描述包含关键词:双侧、双、和、+、&、bilateral、and、with、plus等
- 检查部位包含分号";"分隔符
拆分逻辑:
- 根据分隔符拆分检查描述
- 为每个部位创建独立的检查记录
- 关联原始检查ID
数据治理
治理内容:
- 移除检查描述中多余空格
- 标准化检查类型(转大写)
- 标准化检查部位(移除空格)
- 更多治理规则可扩展
治理记录:
- 所有治理操作记录到data_govern_record表
- 包含治理前后的值对比
- 记录治理规则和时间
注意事项
- DICOM文件格式:只支持标准DICOM格式(.dcm、.dicom)
- 文件存储:确保有足够的磁盘空间存储DICOM文件
- 权限控制:只能查看和操作本机构的数据
- 数据删除:删除操作不可恢复,请谨慎操作
- 批量上传:批量上传时建议一次不超过100个文件
后续扩展建议
- 影像预览:实现DICOM文件转图片和缩略图生成
- 多部位拆分:完善拆分逻辑和拆分后的图像关联
- AI辅助治理:集成AI模型进行智能数据治理
- 数据导出:支持导出检查数据和统计报告
- 权限细化:增加更细粒度的权限控制
- 操作日志:记录所有操作日志用于审计
技术栈
- 后端:Spring Boot 2.x + MyBatis-Plus + dcm4che
- 前端:Vue 3 + TypeScript + Element Plus
- 数据库:MySQL 8.0
- DICOM解析:dcm4che 5.23.3
联系方式
如有问题,请联系开发团队。