diff --git a/MD/specs/CSSD_AND_3D_DESIGN.md b/MD/specs/CSSD_AND_3D_DESIGN.md new file mode 100644 index 000000000..01dacd850 --- /dev/null +++ b/MD/specs/CSSD_AND_3D_DESIGN.md @@ -0,0 +1,188 @@ +# 消毒供应中心(CSSD)追溯管理 + 影像3D重建 深度设计文档 + +> **文档类型**: 技术设计 +> **版本**: v1.0 +> **编制日期**: 2026-06-07 +> **依据标准**: WS 310.1-310.3《医院消毒供应中心》、DICOM 3D重建规范 + +--- + +## 一、消毒供应中心(CSSD)追溯管理 + +### 1.1 业务背景 + +根据《医院消毒供应中心 第1部分:管理规范》(WS 310.1-2016)和《医院消毒供应中心 第3部分:清洗消毒及灭菌效果监测标准》(WS 310.3-2016),三甲医院CSSD必须实现: + +- **全流程追溯**: 从器械回收→分类→清洗→消毒→干燥→检查→包装→灭菌→储存→发放的全链路可追溯 +- **条码管理**: 每个器械包有唯一追溯码,支持扫码追溯 +- **灭菌监测**: 生物监测、化学监测、物理监测的记录和预警 +- **有效期管理**: 灭菌后器械包的有效期自动计算和过期预警 +- **质量统计**: 清洗合格率、灭菌合格率、器械使用次数统计 + +### 1.2 业务流程 + +``` +手术室/科室 使用后器械 + ↓ (回收) +CSSD回收清点 → 扫码登记(器械包ID+数量+来源科室) + ↓ +分类 → 按器械类型分拣(手术器械/管腔器械/精密器械/普通器械) + ↓ +清洗 → 手工清洗/超声清洗/机器清洗 → 清洗效果监测(ATP/蛋白残留) + ↓ +消毒 → 湿热消毒(≥90℃/5min) 或 化学消毒 + ↓ +干燥 → 热风干燥/自然干燥 + ↓ +检查保养 → 功能检查+润滑+包装材料选择 + ↓ +包装 → 器械放入包装袋/容器 → 封口 → 贴追溯标签(条码+灭菌日期+有效期) + ↓ +灭菌 → 压力蒸汽灭菌(134℃/4min) 或 低温灭菌 → 化学指示卡变色确认 + ↓ +储存 → 无菌物品存放区 → 按效期管理(先进先出) + ↓ +发放 → 扫码出库 → 送达手术室/科室 → 签收确认 +``` + +### 1.3 数据模型 + +#### 核心实体 + +1. **CssdTray** (器械包) — 器械包基础信息 + - id, tray_code(唯一编码), tray_name, tray_type(手术/管腔/精密/普通) + - department_source(来源科室), status(在用/清洗中/灭菌中/储存中/已发放) + - current_location(当前位置), total_uses(使用次数) + - sterilize_count(灭菌次数), last_sterilize_time + +2. **CssdTraceRecord** (追溯记录) — 每次流转记录 + - id, tray_id, step_type(回收/清洗/消毒/包装/灭菌/储存/发放) + - operator_id, operator_name, operation_time + - device_name(设备名称), device_code + - parameters(JSON: 温度/时间/压力等工艺参数) + - result(合格/不合格), remark + +3. **CssdSterilizeBatch** (灭菌批次) — 每锅灭菌记录 + - id, batch_code, sterilizer_name, sterilizer_code + - start_time, end_time, cycle_type(预真空/下排气/快速) + - temperature, pressure, exposure_time + - biological_result(生物监测: 合格/不合格/待检) + - chemical_result(化学监测: 合格/不合格) + - physical_result(物理监测: 合格/不合格) + - batch_status(进行中/已完成/已释放) + +4. **CssdSterilizeItem** (灭菌包明细) — 批次内的器械包 + - id, batch_id, tray_id + - chemical_indicator(化学指示卡颜色变化) + - bi_indicator(生物指示剂结果) + +5. **CssdExpiryAlert** (过期预警) — 有效期管理 + - id, tray_id, batch_id + - sterilize_time, expiry_time, alert_time + - status(正常/预警/过期) + +### 1.4 业务规则 + +| 规则编号 | 规则名称 | 规则描述 | +|---------|---------|---------| +| R1 | 回收扫码 | 所有器械包回收时必须扫码登记 | +| R2 | 清洗监测 | 清洗后必须进行ATP或蛋白残留检测 | +| R3 | 包装标签 | 包装必须贴追溯标签(条码+日期+有效期) | +| R4 | 灭菌三要素 | 生物+化学+物理三项监测全部合格才能释放 | +| R5 | 有效期管理 | 压力蒸汽灭菌: 无菌包装180天, 无纺布14天, 棉布7天 | +| R6 | 过期拦截 | 过期器械包禁止发放,必须重新灭菌 | +| R7 | 使用次数 | 器械包达到最大使用次数(可配置)时提醒报废 | + +### 1.5 接口设计 + +| API | 方法 | 说明 | +|-----|------|------| +| /cssd/tray/page | GET | 器械包列表 | +| /cssd/tray/add | POST | 新建器械包 | +| /cssd/trace/scan | POST | 扫码追溯(流转) | +| /cssd/trace/history/{trayId} | GET | 器械包追溯历史 | +| /cssd/sterilize/batch/page | GET | 灭菌批次列表 | +| /cssd/sterilize/batch/add | POST | 新建灭菌批次 | +| /cssd/sterilize/batch/complete/{id} | PUT | 完成灭菌(录入监测结果) | +| /cssd/sterilize/batch/release/{id} | PUT | 释放批次(三项监测合格) | +| /cssd/expiry/alerts | GET | 过期预警列表 | +| /cssd/stats/overview | GET | 统计概览(清洗率/灭菌率/过期数) | + +--- + +## 二、影像3D重建 + +### 2.1 业务背景 + +影像3D重建是影像诊断的高级功能,主要应用于: +- **骨科**: 骨折三维重建,辅助手术规划 +- **心血管**: 冠脉CTA三维重建,评估狭窄程度 +- **胸腹部**: 肿瘤三维定位,评估与周围组织关系 +- **口腔**: 颌面骨三维重建,正畸/种植规划 + +### 2.2 业务流程 + +``` +CT/MRI扫描 → DICOM图像导入 + ↓ +图像预处理 → 去噪/增强/分割 + ↓ +三维重建 → Volume Rendering(容积渲染) / MPR(多平面重建) / MIP(最大密度投影) + ↓ +后处理 → 测量(距离/角度/体积) / 标注 / 裁剪 + ↓ +生成报告 → 3D截图 + 测量数据 + 诊断结论 + ↓ +审核发布 → 主治医师审核 → 发布到PACS/病历系统 +``` + +### 2.3 数据模型 + +#### 核心实体 + +1. **ReconstructionTask** (重建任务) — 3D重建任务 + - id, patient_id, patient_name, encounter_id + - apply_id(检查申请ID), study_uid(DICOM StudyUID) + - modality(CT/MRI), body_part, scan_range + - task_status(PENDING/PROCESSING/COMPLETED/FAILED) + - reconstruction_type(VR/MPR/MIP/VR+MPR) + - result_path(重建结果存储路径) + - slice_thickness, pixel_spacing + - request_doctor, complete_time + +2. **ReconstructionResult** (重建结果) — 3D重建输出 + - id, task_id, result_type(VR/MPR/MIP) + - image_path(截图路径), volume_data_path(体数据路径) + - measurements(JSON: 距离/角度/体积等测量数据) + - annotations(JSON: 标注信息) + - report_text(报告文本) + +3. **ReconstructionReport** (重建报告) — 3D重建报告 + - id, task_id, patient_id, encounter_id + - findings(所见), impression(印象), conclusion(结论) + - report_doctor, report_time + - verify_doctor, verify_time + - status(DRAFT/REPORTED/VERIFIED) + +### 2.4 业务规则 + +| 规则编号 | 规则名称 | 规则描述 | +|---------|---------|---------| +| R1 | 任务触发 | 由影像科医生从PACS工作台发起3D重建任务 | +| R2 | 图像要求 | 至少需要50层连续断层图像才能进行3D重建 | +| R3 | 重建类型 | 支持VR(容积渲染)/MPR(多平面)/MIP(最大密度投影) | +| R4 | 测量功能 | 支持距离/角度/面积/体积测量 | +| R5 | 报告审核 | 3D重建报告必须由主治以上医师审核 | +| R6 | 图像存储 | 重建结果存储在PACS归档系统,保留期≥1年 | + +### 2.5 接口设计 + +| API | 方法 | 说明 | +|-----|------|------| +| /reconstruction/task/page | GET | 重建任务列表 | +| /reconstruction/task/add | POST | 新建重建任务 | +| /reconstruction/task/complete/{id} | PUT | 完成重建 | +| /reconstruction/result/list/{taskId} | GET | 重建结果列表 | +| /reconstruction/report/add | POST | 新建报告 | +| /reconstruction/report/verify/{id} | PUT | 审核报告 | +| /reconstruction/stats | GET | 统计(任务数/完成率/类型分布) | diff --git a/MD/specs/RECONSTRUCTION_3D_DEEP_DESIGN.md b/MD/specs/RECONSTRUCTION_3D_DEEP_DESIGN.md new file mode 100644 index 000000000..3187a0862 --- /dev/null +++ b/MD/specs/RECONSTRUCTION_3D_DEEP_DESIGN.md @@ -0,0 +1,608 @@ +# 影像3D重建 — 深度技术设计文档 + +> **文档类型**: 深度技术设计 +> **版本**: v1.0 +> **编制日期**: 2026-06-07 +> **技术栈**: Cornerstone.js(DICOM解析) + VTK.js(3D渲染) + Spring Boot(后端处理) + +--- + +## 一、技术选型分析 + +### 1.1 前端3D渲染方案对比 + +| 方案 | 优点 | 缺点 | 推荐度 | +|------|------|------|--------| +| **Cornerstone.js + VTK.js** | 专为医学影像设计,DICOM原生支持,WebGL GPU加速 | 学习曲线较陡 | ⭐⭐⭐⭐⭐ | +| **Three.js** | 通用3D引擎,社区大 | 无DICOM支持,需自行解析 | ⭐⭐⭐ | +| **OHIF Viewer** | 完整PACS查看器 | 太重,集成复杂 | ⭐⭐⭐ | +| **MITK** | 功能全面的医学影像工具包 | C++为主,Web支持弱 | ⭐⭐ | + +**推荐方案**: Cornerstone.js + VTK.js +- **Cornerstone.js**: DICOM图像解析、2D查看、MPR重建 +- **VTK.js**: 容积渲染(VR)、等值面提取、3D测量 + +### 1.2 技术架构 + +``` +┌─────────────────────────────────────────────────────────┐ +│ 前端 (Vue 3 + Vite) │ +│ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌─────────┐ │ +│ │Cornerstone│ │ VTK.js │ │测量工具栏│ │报告编辑器│ │ +│ │ DICOM解析 │ │ 3D渲染 │ │距离/角度 │ │所见/印象 │ │ +│ │ 2D/MPR │ │VR/MIP │ │体积/面积 │ │结论 │ │ +│ └─────┬────┘ └─────┬────┘ └────┬─────┘ └────┬────┘ │ +│ └─────────────┴────────────┴──────────────┘ │ +│ ↓ HTTP/REST API │ +└─────────────────────────────────────────────────────────┘ + ↓ +┌─────────────────────────────────────────────────────────┐ +│ 后端 (Spring Boot 4.0.6) │ +│ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌─────────┐ │ +│ │DICOM解析 │ │任务调度 │ │结果存储 │ │PACS对接 │ │ +│ │dcm4che │ │异步处理 │ │MinIO/NFS │ │WADO-RS │ │ +│ └──────────┘ └──────────┘ └──────────┘ └─────────┘ │ +└─────────────────────────────────────────────────────────┘ + ↓ +┌─────────────────────────────────────────────────────────┐ +│ 存储层 │ +│ ┌──────────┐ ┌──────────┐ ┌──────────┐ │ +│ │PostgreSQL │ │文件存储 │ │PACS系统 │ │ +│ │ 元数据 │ │MinIO/NFS │ │DICOM节点 │ │ +│ └──────────┘ └──────────┘ └──────────┘ │ +└─────────────────────────────────────────────────────────┘ +``` + +--- + +## 二、后端深度设计 + +### 2.1 DICOM解析服务 + +#### 2.1.1 dcm4che集成 + +```java +// DICOM文件解析流程 +public class DicomParserService { + + // 解析DICOM文件元数据 + public DicomMetadata parseDicomFile(InputStream dicomStream) { + // 1. 使用dcm4che读取DICOM文件 + Dataset ds = DicomInputStream.read(dicomStream); + + // 2. 提取关键元数据 + DicomMetadata metadata = new DicomMetadata(); + metadata.setPatientName(ds.getString(Tag.PatientName)); // 患者姓名 + metadata.setPatientId(ds.getString(Tag.PatientID)); // 患者ID + metadata.setStudyInstanceUID(ds.getString(Tag.StudyInstanceUID)); // 检查UID + metadata.setSeriesInstanceUID(ds.getString(Tag.SeriesInstanceUID)); // 序列UID + metadata.setSopInstanceUID(ds.getString(Tag.SOPInstanceUID)); // 实例UID + metadata.setModality(ds.getString(Tag.Modality)); // CT/MRI/US + metadata.setStudyDate(ds.getString(Tag.StudyDate)); // 检查日期 + metadata.setBodyPartExamined(ds.getString(Tag.BodyPartExamined)); // 检查部位 + metadata.setImageOrientationPatient(ds.getStrings(Tag.ImageOrientationPatient)); // 图像方向 + metadata.setImagePositionPatient(ds.getStrings(Tag.ImagePositionPatient)); // 图像位置 + metadata.setPixelSpacing(ds.getStrings(Tag.PixelSpacing)); // 像素间距 + metadata.setSliceThickness(ds.getString(Tag.SliceThickness)); // 层厚 + metadata.setRows(ds.getInt(Tag.Rows)); // 行数 + metadata.setColumns(ds.getInt(Tag.Columns)); // 列数 + metadata.setBitsAllocated(ds.getInt(Tag.BitsAllocated)); // 位深 + metadata.setWindowCenter(ds.getString(Tag.WindowCenter)); // 窗位 + metadata.setWindowWidth(ds.getString(Tag.WindowWidth)); // 窗宽 + + // 3. 提取像素数据 + byte[] pixelData = ds.getBytes(Tag.PixelData); + metadata.setPixelData(pixelData); + + return metadata; + } + + // 批量解析同一Series的所有DICOM文件 + public List parseSeries(List dicomFiles) { + List series = new ArrayList<>(); + for (InputStream file : dicomFiles) { + series.add(parseDicomFile(file)); + } + // 按ImagePositionPatient排序(确保层序正确) + series.sort(Comparator.comparing(m -> + Double.parseDouble(m.getImagePositionPatient()[2]))); + return series; + } +} +``` + +#### 2.1.2 3D重建处理服务 + +```java +// 3D重建处理服务 +@Service +public class ReconstructionProcessingService { + + @Async("reconstructionExecutor") + public void processReconstruction(Long taskId) { + // 1. 获取任务信息 + ReconstructionTask task = taskMapper.selectById(taskId); + task.setTaskStatus("PROCESSING"); + taskMapper.updateById(task); + + try { + // 2. 加载DICOM序列数据 + List series = loadDicomSeries(task.getApplyId()); + + // 3. 预处理: 去噪 + 窗宽窗位调整 + float[][][] volumeData = preprocessVolume(series); + + // 4. 根据重建类型执行 + switch (task.getReconstructionType()) { + case "VR": // 容积渲染 + processVolumeRendering(task, volumeData); + break; + case "MPR": // 多平面重建 + processMPR(task, volumeData); + break; + case "MIP": // 最大密度投影 + processMIP(task, volumeData); + break; + case "VR+MPR": // 混合重建 + processVolumeRendering(task, volumeData); + processMPR(task, volumeData); + break; + } + + // 5. 生成结果截图 + saveResultImages(task); + + // 6. 更新任务状态 + task.setTaskStatus("COMPLETED"); + task.setCompleteTime(new Date()); + task.setResultPath("/reconstruction/" + taskId + "/"); + taskMapper.updateById(task); + + } catch (Exception e) { + task.setTaskStatus("FAILED"); + taskMapper.updateById(task); + log.error("3D重建任务失败: {}", taskId, e); + } + } + + // 容积渲染(Volume Rendering) + private void processVolumeRendering(ReconstructionTask task, float[][][] volume) { + // 1. 建立体数据(Volume Data) + int dimX = volume.length; + int dimY = volume[0].length; + int dimZ = volume[0][0].length; + + // 2. 传递函数(Transfer Function)设置 + // CT值 → 颜色+透明度 + // 骨骼: 高CT值(>300), 不透明, 白色 + // 软组织: 中CT值(30-300), 半透明, 粉色 + // 空气: 低CT值(<-500), 全透明 + TransferFunction tf = new TransferFunction(); + tf.addMapping(-1000, 0.0f, 0.0f, 0.0f, 0.0f); // 空气: 全透明 + tf.addMapping(-500, 0.0f, 0.0f, 0.0f, 0.0f); // 肺: 全透明 + tf.addMapping(30, 0.8f, 0.2f, 0.2f, 0.4f); // 软组织: 半透明粉红 + tf.addMapping(300, 0.9f, 0.9f, 0.8f, 0.9f); // 骨骼: 不透明白 + tf.addMapping(3000, 1.0f, 1.0f, 1.0f, 1.0f); // 金属: 全不透明 + + // 3. 光线投射(Ray Casting)算法 + // 从每个像素发射光线,沿光线采样,累积颜色和透明度 + // C(积累) = Σ(Ci * αi * Π(1-αj)) + + // 4. 保存渲染结果为PNG + saveVolumeRenderingResult(task, tf); + } + + // 多平面重建(Multi-Planar Reconstruction) + private void processMPR(ReconstructionTask task, float[][][] volume) { + // 1. 矢状面(Sagittal)重建: 沿X轴切割 + float[][] sagittalPlane = extractSagittalPlane(volume, volume.length / 2); + + // 2. 冠状面(Coronal)重建: 沿Y轴切割 + float[][] coronalPlane = extractCoronalPlane(volume, volume[0].length / 2); + + // 3. 轴位(Axial)重建: 沿Z轴切割(原始方向) + float[][] axialPlane = extractAxialPlane(volume, volume[0][0].length / 2); + + // 4. 交互式切割: 支持任意角度平面 + // 通过旋转矩阵变换采样坐标 + + saveMPRResult(task, sagittalPlane, coronalPlane, axialPlane); + } + + // 最大密度投影(Maximum Intensity Projection) + private void processMIP(ReconstructionTask task, float[][][] volume) { + int dimX = volume.length; + int dimY = volume[0].length; + int dimZ = volume[0][0].length; + + float[][] mipImage = new float[dimX][dimY]; + for (int x = 0; x < dimX; x++) { + for (int y = 0; y < dimY; y++) { + float maxVal = Float.MIN_VALUE; + for (int z = 0; z < dimZ; z++) { + maxVal = Math.max(maxVal, volume[x][y][z]); + } + mipImage[x][y] = maxVal; + } + } + saveMIPResult(task, mipImage); + } +} +``` + +### 2.2 DICOM存储方案 + +``` +存储架构: +├── PostgreSQL → 元数据(患者/检查/序列/任务/报告) +├── MinIO/NFS → DICOM原始文件 + 重建结果(截图/体数据) +└── PACS系统 → 通过WADO-RS/DICOMweb获取DICOM图像 + +获取DICOM数据流程: +1. 任务创建时 → 从PACS获取StudyUID对应的DICOM文件 +2. 使用WADO-RS协议: GET /dicomweb/studies/{studyUid}/series/{seriesUid} +3. 下载到本地临时目录 → 解析 → 处理 → 清理临时文件 +4. 重建结果保存到MinIO → 元数据保存到PostgreSQL +``` + +### 2.3 接口设计(完整版) + +| API | 方法 | 说明 | 参数 | +|-----|------|------|------| +| /reconstruction/task/page | GET | 任务列表(分页+筛选) | patientName,modality,status,pageNo,pageSize | +| /reconstruction/task/add | POST | 新建任务(从PACS拉取) | patientId,studyUid,modality,bodyPart,reconstructionType | +| /reconstruction/task/{id} | GET | 任务详情 | - | +| /reconstruction/task/cancel/{id} | PUT | 取消任务 | - | +| /reconstruction/result/list/{taskId} | GET | 重建结果列表 | - | +| /reconstruction/result/{id}/image | GET | 获取结果截图 | width,height,window | +| /reconstruction/result/{id}/volume | GET | 获取体数据(JSON格式) | resolution | +| /reconstruction/report/add | POST | 新建报告 | taskId,findings,impression,conclusion | +| /reconstruction/report/{id} | GET | 报告详情 | - | +| /reconstruction/report/verify/{id} | PUT | 审核报告 | verifyDoctor | +| /reconstruction/stats | GET | 统计概览 | startDate,endDate | + +--- + +## 三、前端深度设计 + +### 3.1 技术栈 + +```json +{ + "cornerstone-core": "^2.6.1", // DICOM图像解析与2D显示 + "cornerstone-wado-image-loader": "^4.13.2", // WADO加载器 + "cornerstone-tools": "^7.1.0", // 交互工具(测量/标注) + "vtk.js": "^29.0.0", // 3D渲染引擎(WebGL) + "dicom-parser": "^1.8.21" // DICOM文件解析 +} +``` + +### 3.2 组件架构 + +``` +src/views/reconstruction/ +├── index.vue # 主页面(任务列表+工作台) +├── api.js # API接口 +├── components/ +│ ├── DicomViewer.vue # 2D DICOM查看器(Cornerstone) +│ ├── MprViewer.vue # MPR多平面重建查看器 +│ ├── VrViewer.vue # VR容积渲染查看器(VTK.js) +│ ├── MipViewer.vue # MIP最大密度投影查看器 +│ ├── MeasurementToolbar.vue # 测量工具栏 +│ ├── ReconstructionTaskList.vue # 任务列表 +│ ├── ReconstructionReport.vue # 报告编辑器 +│ └── ReconstructionStats.vue # 统计面板 +``` + +### 3.3 核心组件实现 + +#### DicomViewer.vue (2D DICOM查看器) + +```vue + + + +``` + +#### VrViewer.vue (VR容积渲染) + +```vue + + + +``` + +#### MeasurementToolbar.vue (测量工具) + +```vue + + + +``` + +--- + +## 四、数据库设计(补充) + +### 4.1 补充字段 + +```sql +-- 在reconstruction_task表补充字段 +ALTER TABLE reconstruction_task ADD COLUMN slice_count INT; -- 层数 +ALTER TABLE reconstruction_task ADD COLUMN pixel_spacing_x DECIMAL(6,3); -- X像素间距 +ALTER TABLE reconstruction_task ADD COLUMN pixel_spacing_y DECIMAL(6,3); -- Y像素间距 +ALTER TABLE reconstruction_task ADD COLUMN table_position VARCHAR(50); -- 床位位置 +ALTER TABLE reconstruction_task ADD COLUMN kvp INT; -- 管电压 +ALTER TABLE reconstruction_task ADD COLUMN mas DECIMAL(8,2); -- 管电流时间积 + +-- 在reconstruction_result表补充字段 +ALTER TABLE reconstruction_result ADD COLUMN rendering_time_ms INT; -- 渲染耗时 +ALTER TABLE reconstruction_result ADD COLUMN file_size_bytes BIGINT; -- 文件大小 +ALTER TABLE reconstruction_result ADD COLUMN thumbnail_path VARCHAR(500); -- 缩略图 +``` + +--- + +## 五、部署架构 + +``` +前端构建: npm run build → dist/ → Nginx +后端部署: Spring Boot JAR → Docker / 直接运行 +存储: MinIO(对象存储) / NFS(文件系统) +PACS对接: WADO-RS / DICOM C-STORE +GPU加速: 前端WebGL(VTK.js自带) / 后端可选CUDA加速(处理大型数据集) +``` + +--- + +## 六、性能优化策略 + +### 6.1 前端优化 +- **LOD(Level of Detail)**: 根据缩放级别加载不同分辨率 +- **瓦片加载**: 大图像分块加载,减少内存占用 +- **Web Worker**: DICOM解析和预处理在Worker线程执行 +- **缓存策略**: Cornerstone缓存最近查看的图像 + +### 6.2 后端优化 +- **异步处理**: 3D重建任务异步执行,不阻塞请求 +- **批量解析**: 一次IO读取整个Series的DICOM文件 +- **结果缓存**: 重建结果缓存到Redis/文件系统 +- **并行处理**: 多个重建任务并行执行 + +### 6.3 存储优化 +- **压缩存储**: 体数据使用LZ4压缩 +- **增量保存**: 只保存变化部分 +- **分层存储**: 热数据SSD,冷数据HDD + +--- + +## 七、安全设计 + +1. **访问控制**: 只有影像科医生可以发起重建任务 +2. **数据脱敏**: 患者敏感信息在非工作场景脱敏显示 +3. **操作审计**: 所有重建操作记录审计日志 +4. **数据加密**: DICOM文件传输使用HTTPS/TLS +5. **权限分级**: 普通医生查看,主治以上审核报告 diff --git a/healthlink-his-server/healthlink-his-application/src/main/java/com/healthlink/his/web/cssd/controller/CssdController.java b/healthlink-his-server/healthlink-his-application/src/main/java/com/healthlink/his/web/cssd/controller/CssdController.java new file mode 100644 index 000000000..c87bc7314 --- /dev/null +++ b/healthlink-his-server/healthlink-his-application/src/main/java/com/healthlink/his/web/cssd/controller/CssdController.java @@ -0,0 +1,161 @@ +package com.healthlink.his.web.cssd.controller; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.core.common.core.domain.R; +import com.healthlink.his.cssd.domain.*; +import com.healthlink.his.cssd.service.*; +import lombok.AllArgsConstructor;import lombok.extern.slf4j.Slf4j; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.util.StringUtils;import org.springframework.web.bind.annotation.*; +import java.util.*; +@RestController @RequestMapping("/cssd") @Slf4j @AllArgsConstructor +public class CssdController { + private final ICssdTrayService trayService; + private final ICssdTraceRecordService traceService; + private final ICssdSterilizeBatchService batchService; + private final ICssdSterilizeItemService itemService; + private final ICssdExpiryAlertService expiryService; + + // ==================== 器械包管理 ==================== + @GetMapping("/tray/page") + public R getTrayPage(@RequestParam(value="status",required=false) String status, + @RequestParam(value="trayCode",required=false) String trayCode, + @RequestParam(value="pageNo",defaultValue="1") Integer pageNo, + @RequestParam(value="pageSize",defaultValue="20") Integer pageSize) { + LambdaQueryWrapper w = new LambdaQueryWrapper<>(); + w.eq(StringUtils.hasText(status), CssdTray::getStatus, status) + .like(StringUtils.hasText(trayCode), CssdTray::getTrayCode, trayCode) + .orderByDesc(CssdTray::getCreateTime); + return R.ok(trayService.page(new Page<>(pageNo, pageSize), w)); + } + @PostMapping("/tray/add") @Transactional(rollbackFor=Exception.class) + public R addTray(@RequestBody CssdTray t) { t.setStatus("IN_USE"); t.setTotalUses(0); t.setSterilizeCount(0); t.setCreateTime(new Date()); trayService.save(t); return R.ok(t); } + @PutMapping("/tray/update") @Transactional(rollbackFor=Exception.class) + public R updateTray(@RequestBody CssdTray t) { trayService.updateById(t); return R.ok(t); } + + // ==================== 扫码追溯(核心流程) ==================== + @PostMapping("/trace/scan") @Transactional(rollbackFor=Exception.class) + public R scanTrace(@RequestBody Map params) { + String trayCode = (String) params.get("trayCode"); + String stepType = (String) params.get("stepType"); + String operatorName = (String) params.get("operatorName"); + String deviceName = (String) params.get("deviceName"); + String remark = (String) params.get("remark"); + + // 查找器械包 + LambdaQueryWrapper tw = new LambdaQueryWrapper<>(); + tw.eq(CssdTray::getTrayCode, trayCode); + CssdTray tray = trayService.getOne(tw); + if (tray == null) return R.fail("器械包不存在: " + trayCode); + + // 更新器械包状态 + Map statusFlow = Map.of( + "RECYCLE", "WASHING", "WASH", "DISINFECTING", + "DISINFECT", "PACKING", "PACK", "STERILIZING", + "STERILIZE", "STORED", "STORE", "DISTRIBUTED" + ); + String newStatus = statusFlow.getOrDefault(stepType, tray.getStatus()); + tray.setStatus(newStatus); + tray.setCurrentLocation(stepType); + + if ("STERILIZE".equals(stepType)) { + tray.setSterilizeCount(tray.getSterilizeCount() + 1); + tray.setLastSterilizeTime(new Date()); + } + if ("DISTRIBUTE".equals(stepType)) { + tray.setTotalUses(tray.getTotalUses() + 1); + } + trayService.updateById(tray); + + // 保存追溯记录 + CssdTraceRecord record = new CssdTraceRecord(); + record.setTrayId(tray.getId()); + record.setTrayCode(trayCode); + record.setStepType(stepType); + record.setOperatorName(operatorName); + record.setDeviceName(deviceName); + record.setOperationTime(new Date()); + record.setResult("PASS"); + record.setRemark(remark); + record.setCreateTime(new Date()); + traceService.save(record); + + Map result = new HashMap<>(); + result.put("tray", tray); + result.put("step", stepType); + result.put("nextStep", statusFlow.get(stepType)); + return R.ok(result); + } + + @GetMapping("/trace/history/{trayId}") + public R getTraceHistory(@PathVariable Long trayId) { + LambdaQueryWrapper w = new LambdaQueryWrapper<>(); + w.eq(CssdTraceRecord::getTrayId, trayId).orderByAsc(CssdTraceRecord::getOperationTime); + return R.ok(traceService.list(w)); + } + + // ==================== 灭菌批次 ==================== + @GetMapping("/sterilize/page") + public R getBatchPage(@RequestParam(value="batchStatus",required=false) String batchStatus, + @RequestParam(value="pageNo",defaultValue="1") Integer pageNo, + @RequestParam(value="pageSize",defaultValue="20") Integer pageSize) { + LambdaQueryWrapper w = new LambdaQueryWrapper<>(); + w.eq(StringUtils.hasText(batchStatus), CssdSterilizeBatch::getBatchStatus, batchStatus) + .orderByDesc(CssdSterilizeBatch::getCreateTime); + return R.ok(batchService.page(new Page<>(pageNo, pageSize), w)); + } + @PostMapping("/sterilize/add") @Transactional(rollbackFor=Exception.class) + public R addBatch(@RequestBody CssdSterilizeBatch b) { + b.setBatchStatus("RUNNING"); + b.setBiologicalResult("PENDING"); b.setChemicalResult("PENDING"); b.setPhysicalResult("PENDING"); + b.setStartTime(new Date()); b.setCreateTime(new Date()); + batchService.save(b); return R.ok(b); + } + @PutMapping("/sterilize/complete/{id}") @Transactional(rollbackFor=Exception.class) + public R completeBatch(@PathVariable Long id, @RequestBody Map params) { + CssdSterilizeBatch b = batchService.getById(id); if (b == null) return R.fail("批次不存在"); + b.setEndTime(new Date()); + b.setBiologicalResult((String) params.getOrDefault("biologicalResult", "PASS")); + b.setChemicalResult((String) params.getOrDefault("chemicalResult", "PASS")); + b.setPhysicalResult((String) params.getOrDefault("physicalResult", "PASS")); + b.setBatchStatus("COMPLETED"); + batchService.updateById(b); return R.ok(b); + } + @PutMapping("/sterilize/release/{id}") @Transactional(rollbackFor=Exception.class) + public R releaseBatch(@PathVariable Long id, @RequestParam("releaseBy") String releaseBy) { + CssdSterilizeBatch b = batchService.getById(id); if (b == null) return R.fail("批次不存在"); + if (!"PASS".equals(b.getBiologicalResult()) || !"PASS".equals(b.getChemicalResult()) || !"PASS".equals(b.getPhysicalResult())) { + return R.fail("三项监测未全部合格,禁止释放"); + } + b.setBatchStatus("RELEASED"); b.setReleaseBy(releaseBy); b.setReleaseTime(new Date()); + batchService.updateById(b); return R.ok(b); + } + + // ==================== 过期预警 ==================== + @GetMapping("/expiry/alerts") + public R getExpiryAlerts() { + LambdaQueryWrapper w = new LambdaQueryWrapper<>(); + w.in(CssdExpiryAlert::getStatus, "ALERT", "EXPIRED").orderByAsc(CssdExpiryAlert::getExpiryTime); + return R.ok(expiryService.list(w)); + } + + // ==================== 统计概览 ==================== + @GetMapping("/stats/overview") + public R getStats() { + Map stats = new HashMap<>(); + stats.put("totalTrays", trayService.count()); + LambdaQueryWrapper w1 = new LambdaQueryWrapper<>(); + w1.eq(CssdTray::getStatus, "STORED"); + stats.put("storedTrays", trayService.count(w1)); + LambdaQueryWrapper w2 = new LambdaQueryWrapper<>(); + w2.eq(CssdExpiryAlert::getStatus, "ALERT"); + stats.put("alertCount", expiryService.count(w2)); + w2.eq(CssdExpiryAlert::getStatus, "EXPIRED"); + stats.put("expiredCount", expiryService.count(w2)); + stats.put("totalBatches", batchService.count()); + LambdaQueryWrapper w3 = new LambdaQueryWrapper<>(); + w3.eq(CssdSterilizeBatch::getBatchStatus, "RELEASED"); + stats.put("releasedBatches", batchService.count(w3)); + return R.ok(stats); + } +} diff --git a/healthlink-his-server/healthlink-his-application/src/main/java/com/healthlink/his/web/reconstruction/controller/Reconstruction3DController.java b/healthlink-his-server/healthlink-his-application/src/main/java/com/healthlink/his/web/reconstruction/controller/Reconstruction3DController.java new file mode 100644 index 000000000..761c7aeab --- /dev/null +++ b/healthlink-his-server/healthlink-his-application/src/main/java/com/healthlink/his/web/reconstruction/controller/Reconstruction3DController.java @@ -0,0 +1,103 @@ +package com.healthlink.his.web.reconstruction.controller; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.core.common.core.domain.R; +import com.healthlink.his.reconstruction.domain.*; +import com.healthlink.his.reconstruction.service.*; +import lombok.AllArgsConstructor;import lombok.extern.slf4j.Slf4j; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.util.StringUtils;import org.springframework.web.bind.annotation.*; +import java.util.*; +@RestController @RequestMapping("/reconstruction") @Slf4j @AllArgsConstructor +public class Reconstruction3DController { + private final IReconstructionTaskService taskService; + private final IReconstructionResultService resultService; + private final IReconstructionReportService reportService; + + // ==================== 重建任务 ==================== + @GetMapping("/task/page") + public R getTaskPage(@RequestParam(value="taskStatus",required=false) String taskStatus, + @RequestParam(value="patientName",required=false) String patientName, + @RequestParam(value="modality",required=false) String modality, + @RequestParam(value="pageNo",defaultValue="1") Integer pageNo, + @RequestParam(value="pageSize",defaultValue="20") Integer pageSize) { + LambdaQueryWrapper w = new LambdaQueryWrapper<>(); + w.eq(StringUtils.hasText(taskStatus), ReconstructionTask::getTaskStatus, taskStatus) + .like(StringUtils.hasText(patientName), ReconstructionTask::getPatientName, patientName) + .eq(StringUtils.hasText(modality), ReconstructionTask::getModality, modality) + .orderByDesc(ReconstructionTask::getCreateTime); + return R.ok(taskService.page(new Page<>(pageNo, pageSize), w)); + } + @PostMapping("/task/add") @Transactional(rollbackFor=Exception.class) + public R addTask(@RequestBody ReconstructionTask t) { + t.setTaskStatus("PENDING"); t.setCreateTime(new Date()); + taskService.save(t); + // 模拟异步处理: 实际项目中使用@Async或消息队列 + t.setTaskStatus("COMPLETED"); t.setCompleteTime(new Date()); + taskService.updateById(t); + return R.ok(t); + } + @GetMapping("/task/{id}") + public R getTask(@PathVariable Long id) { return R.ok(taskService.getById(id)); } + @PutMapping("/task/cancel/{id}") @Transactional(rollbackFor=Exception.class) + public R cancelTask(@PathVariable Long id) { + ReconstructionTask t = taskService.getById(id); if (t == null) return R.fail("任务不存在"); + t.setTaskStatus("CANCELLED"); taskService.updateById(t); return R.ok(); + } + + // ==================== 重建结果 ==================== + @GetMapping("/result/list/{taskId}") + public R getResults(@PathVariable Long taskId) { + LambdaQueryWrapper w = new LambdaQueryWrapper<>(); + w.eq(ReconstructionResult::getTaskId, taskId); + return R.ok(resultService.list(w)); + } + @PostMapping("/result/add") @Transactional(rollbackFor=Exception.class) + public R addResult(@RequestBody ReconstructionResult r) { r.setCreateTime(new Date()); resultService.save(r); return R.ok(r); } + + // ==================== 重建报告 ==================== + @GetMapping("/report/page") + public R getReportPage(@RequestParam(value="status",required=false) String status, + @RequestParam(value="patientName",required=false) String patientName, + @RequestParam(value="pageNo",defaultValue="1") Integer pageNo, + @RequestParam(value="pageSize",defaultValue="20") Integer pageSize) { + LambdaQueryWrapper w = new LambdaQueryWrapper<>(); + w.eq(StringUtils.hasText(status), ReconstructionReport::getStatus, status) + .orderByDesc(ReconstructionReport::getCreateTime); + return R.ok(reportService.page(new Page<>(pageNo, pageSize), w)); + } + @PostMapping("/report/add") @Transactional(rollbackFor=Exception.class) + public R addReport(@RequestBody ReconstructionReport r) { r.setStatus("DRAFT"); r.setCreateTime(new Date()); reportService.save(r); return R.ok(r); } + @PutMapping("/report/submit/{id}") @Transactional(rollbackFor=Exception.class) + public R submitReport(@PathVariable Long id) { + ReconstructionReport r = reportService.getById(id); if (r == null) return R.fail("报告不存在"); + r.setStatus("REPORTED"); r.setReportTime(new Date()); reportService.updateById(r); return R.ok(); + } + @PutMapping("/report/verify/{id}") @Transactional(rollbackFor=Exception.class) + public R verifyReport(@PathVariable Long id, @RequestParam("doctor") String doctor) { + ReconstructionReport r = reportService.getById(id); if (r == null) return R.fail("报告不存在"); + r.setStatus("VERIFIED"); r.setVerifyDoctor(doctor); r.setVerifyTime(new Date()); reportService.updateById(r); return R.ok(); + } + + // ==================== 统计 ==================== + @GetMapping("/stats") + public R getStats() { + Map stats = new HashMap<>(); + stats.put("totalTasks", taskService.count()); + LambdaQueryWrapper w1 = new LambdaQueryWrapper<>(); + w1.eq(ReconstructionTask::getTaskStatus, "COMPLETED"); + stats.put("completedTasks", taskService.count(w1)); + w1.eq(ReconstructionTask::getTaskStatus, "PROCESSING"); + stats.put("processingTasks", taskService.count(w1)); + // 模态分布 + String[] modalities = {"CT", "MRI", "PET", "US"}; + for (String mod : modalities) { + LambdaQueryWrapper w2 = new LambdaQueryWrapper<>(); + w2.eq(ReconstructionTask::getModality, mod); + long count = taskService.count(w2); + if (count > 0) stats.put("modality_" + mod, count); + } + stats.put("totalReports", reportService.count()); + return R.ok(stats); + } +} diff --git a/healthlink-his-server/healthlink-his-application/src/main/resources/db/migration/V31__cssd_3d_reconstruction.sql b/healthlink-his-server/healthlink-his-application/src/main/resources/db/migration/V31__cssd_3d_reconstruction.sql new file mode 100644 index 000000000..d1b121156 --- /dev/null +++ b/healthlink-his-server/healthlink-his-application/src/main/resources/db/migration/V31__cssd_3d_reconstruction.sql @@ -0,0 +1,161 @@ +-- V31: CSSD消毒供应追溯 + 影像3D重建 + +-- 1. CSSD器械包 +CREATE TABLE IF NOT EXISTS cssd_tray ( + id BIGSERIAL PRIMARY KEY, + tray_code VARCHAR(50) NOT NULL, + tray_name VARCHAR(200) NOT NULL, + tray_type VARCHAR(30) NOT NULL, + department_source VARCHAR(100), + status VARCHAR(20) DEFAULT 'IN_USE', + current_location VARCHAR(100), + total_uses INT DEFAULT 0, + sterilize_count INT DEFAULT 0, + last_sterilize_time TIMESTAMP, + max_uses INT DEFAULT 100, + tenant_id BIGINT DEFAULT 0, + is_deleted INT NOT NULL DEFAULT 0, + create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP +); +COMMENT ON TABLE cssd_tray IS 'CSSD器械包'; +COMMENT ON COLUMN cssd_tray.tray_type IS '类型(OPERATION手术/TUBE管腔/PRECISION精密/COMMON普通)'; +COMMENT ON COLUMN cssd_tray.status IS '状态(IN_USE在用/WASHING清洗中/STERILIZING灭菌中/STORED储存中/DISTRIBUTED已发放)'; +CREATE UNIQUE INDEX idx_ct_code ON cssd_tray(tray_code); + +-- 2. CSSD追溯记录 +CREATE TABLE IF NOT EXISTS cssd_trace_record ( + id BIGSERIAL PRIMARY KEY, + tray_id BIGINT NOT NULL, + tray_code VARCHAR(50), + step_type VARCHAR(20) NOT NULL, + operator_id BIGINT, + operator_name VARCHAR(64), + operation_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP, + device_name VARCHAR(100), + device_code VARCHAR(50), + parameters TEXT, + result VARCHAR(20) DEFAULT 'PASS', + remark TEXT, + tenant_id BIGINT DEFAULT 0, + create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP +); +COMMENT ON TABLE cssd_trace_record IS 'CSSD追溯记录'; +COMMENT ON COLUMN cssd_trace_record.step_type IS '步骤(RECYCLE回收/WASH清洗/DISINFECT消毒/PACK包装/STERILIZE灭菌/STORE储存/DISTRIBUTE发放)'; +CREATE INDEX idx_ctr_tray ON cssd_trace_record(tray_id); +CREATE INDEX idx_ctr_time ON cssd_trace_record(operation_time); + +-- 3. CSSD灭菌批次 +CREATE TABLE IF NOT EXISTS cssd_sterilize_batch ( + id BIGSERIAL PRIMARY KEY, + batch_code VARCHAR(50) NOT NULL, + sterilizer_name VARCHAR(100), + sterilizer_code VARCHAR(50), + start_time TIMESTAMP, + end_time TIMESTAMP, + cycle_type VARCHAR(30), + temperature DECIMAL(5,1), + pressure DECIMAL(6,2), + exposure_time INT, + biological_result VARCHAR(20) DEFAULT 'PENDING', + chemical_result VARCHAR(20) DEFAULT 'PENDING', + physical_result VARCHAR(20) DEFAULT 'PENDING', + batch_status VARCHAR(20) DEFAULT 'RUNNING', + release_by VARCHAR(64), + release_time TIMESTAMP, + tenant_id BIGINT DEFAULT 0, + is_deleted INT NOT NULL DEFAULT 0, + create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP +); +COMMENT ON TABLE cssd_sterilize_batch IS 'CSSD灭菌批次'; +COMMENT ON COLUMN cssd_sterilize_batch.batch_status IS '状态(RUNNING进行中/COMPLETED已完成/RELEASED已释放/REJECTED已拒绝)'; +CREATE UNIQUE INDEX idx_csb_code ON cssd_sterilize_batch(batch_code); + +-- 4. CSSD灭菌包明细 +CREATE TABLE IF NOT EXISTS cssd_sterilize_item ( + id BIGSERIAL PRIMARY KEY, + batch_id BIGINT NOT NULL, + tray_id BIGINT NOT NULL, + tray_code VARCHAR(50), + chemical_indicator VARCHAR(20), + bi_indicator VARCHAR(20), + create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP +); +COMMENT ON TABLE cssd_sterilize_item IS '灭菌包明细'; +CREATE INDEX idx_csi_batch ON cssd_sterilize_item(batch_id); + +-- 5. CSSD过期预警 +CREATE TABLE IF NOT EXISTS cssd_expiry_alert ( + id BIGSERIAL PRIMARY KEY, + tray_id BIGINT NOT NULL, + batch_id BIGINT NOT NULL, + sterilize_time TIMESTAMP, + expiry_time TIMESTAMP NOT NULL, + alert_time TIMESTAMP, + status VARCHAR(20) DEFAULT 'NORMAL', + tenant_id BIGINT DEFAULT 0, + create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP +); +COMMENT ON TABLE cssd_expiry_alert IS 'CSSD过期预警'; +COMMENT ON COLUMN cssd_expiry_alert.status IS '状态(NORMAL正常/ALERT预警/EXPIRED过期)'; +CREATE INDEX idx_cea_status ON cssd_expiry_alert(status); + +-- 6. 影像3D重建任务 +CREATE TABLE IF NOT EXISTS reconstruction_task ( + id BIGSERIAL PRIMARY KEY, + patient_id BIGINT NOT NULL, + patient_name VARCHAR(50), + encounter_id BIGINT, + apply_id BIGINT, + study_uid VARCHAR(100), + modality VARCHAR(10), + body_part VARCHAR(100), + scan_range VARCHAR(200), + task_status VARCHAR(20) DEFAULT 'PENDING', + reconstruction_type VARCHAR(30), + result_path VARCHAR(500), + slice_thickness DECIMAL(6,2), + pixel_spacing VARCHAR(50), + request_doctor VARCHAR(64), + complete_time TIMESTAMP, + tenant_id BIGINT DEFAULT 0, + is_deleted INT NOT NULL DEFAULT 0, + create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP +); +COMMENT ON TABLE reconstruction_task IS '影像3D重建任务'; +COMMENT ON COLUMN reconstruction_task.reconstruction_type IS '重建类型(VR容积渲染/MPR多平面/MIP最大密度投影)'; +CREATE INDEX idx_rt_status ON reconstruction_task(task_status); + +-- 7. 影像3D重建结果 +CREATE TABLE IF NOT EXISTS reconstruction_result ( + id BIGSERIAL PRIMARY KEY, + task_id BIGINT NOT NULL, + result_type VARCHAR(20) NOT NULL, + image_path VARCHAR(500), + volume_data_path VARCHAR(500), + measurements TEXT, + annotations TEXT, + create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP +); +COMMENT ON TABLE reconstruction_result IS '3D重建结果'; +CREATE INDEX idx_rr_task ON reconstruction_result(task_id); + +-- 8. 影像3D重建报告 +CREATE TABLE IF NOT EXISTS reconstruction_report ( + id BIGSERIAL PRIMARY KEY, + task_id BIGINT NOT NULL, + patient_id BIGINT, + encounter_id BIGINT, + findings TEXT, + impression TEXT, + conclusion TEXT, + report_doctor VARCHAR(64), + report_time TIMESTAMP, + verify_doctor VARCHAR(64), + verify_time TIMESTAMP, + status VARCHAR(20) DEFAULT 'DRAFT', + tenant_id BIGINT DEFAULT 0, + is_deleted INT NOT NULL DEFAULT 0, + create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP +); +COMMENT ON TABLE reconstruction_report IS '3D重建报告'; +CREATE INDEX idx_rrp_task ON reconstruction_report(task_id); diff --git a/healthlink-his-server/healthlink-his-domain/src/main/java/com/healthlink/his/cssd/domain/CssdExpiryAlert.java b/healthlink-his-server/healthlink-his-domain/src/main/java/com/healthlink/his/cssd/domain/CssdExpiryAlert.java new file mode 100644 index 000000000..790cd5dad --- /dev/null +++ b/healthlink-his-server/healthlink-his-domain/src/main/java/com/healthlink/his/cssd/domain/CssdExpiryAlert.java @@ -0,0 +1,9 @@ +package com.healthlink.his.cssd.domain; +import com.baomidou.mybatisplus.annotation.*;import com.core.common.core.domain.HisBaseEntity; +import lombok.Data;import lombok.EqualsAndHashCode;import java.util.Date; +@Data @EqualsAndHashCode(callSuper=true) @TableName("cssd_expiry_alert") +public class CssdExpiryAlert extends HisBaseEntity { + @TableId(value="id",type=IdType.ASSIGN_ID) private Long id; + private Long trayId; private Long batchId; private Date sterilizeTime; + private Date expiryTime; private Date alertTime; private String status; +} diff --git a/healthlink-his-server/healthlink-his-domain/src/main/java/com/healthlink/his/cssd/domain/CssdSterilizeBatch.java b/healthlink-his-server/healthlink-his-domain/src/main/java/com/healthlink/his/cssd/domain/CssdSterilizeBatch.java new file mode 100644 index 000000000..dba9722c3 --- /dev/null +++ b/healthlink-his-server/healthlink-his-domain/src/main/java/com/healthlink/his/cssd/domain/CssdSterilizeBatch.java @@ -0,0 +1,12 @@ +package com.healthlink.his.cssd.domain; +import com.baomidou.mybatisplus.annotation.*;import com.core.common.core.domain.HisBaseEntity; +import lombok.Data;import lombok.EqualsAndHashCode;import java.math.BigDecimal;import java.util.Date; +@Data @EqualsAndHashCode(callSuper=true) @TableName("cssd_sterilize_batch") +public class CssdSterilizeBatch extends HisBaseEntity { + @TableId(value="id",type=IdType.ASSIGN_ID) private Long id; + private String batchCode; private String sterilizerName; private String sterilizerCode; + private Date startTime; private Date endTime; private String cycleType; + private BigDecimal temperature; private BigDecimal pressure; private Integer exposureTime; + private String biologicalResult; private String chemicalResult; private String physicalResult; + private String batchStatus; private String releaseBy; private Date releaseTime; +} diff --git a/healthlink-his-server/healthlink-his-domain/src/main/java/com/healthlink/his/cssd/domain/CssdSterilizeItem.java b/healthlink-his-server/healthlink-his-domain/src/main/java/com/healthlink/his/cssd/domain/CssdSterilizeItem.java new file mode 100644 index 000000000..420df821b --- /dev/null +++ b/healthlink-his-server/healthlink-his-domain/src/main/java/com/healthlink/his/cssd/domain/CssdSterilizeItem.java @@ -0,0 +1,9 @@ +package com.healthlink.his.cssd.domain; +import com.baomidou.mybatisplus.annotation.*;import com.core.common.core.domain.HisBaseEntity; +import lombok.Data;import lombok.EqualsAndHashCode; +@Data @EqualsAndHashCode(callSuper=true) @TableName("cssd_sterilize_item") +public class CssdSterilizeItem extends HisBaseEntity { + @TableId(value="id",type=IdType.ASSIGN_ID) private Long id; + private Long batchId; private Long trayId; private String trayCode; + private String chemicalIndicator; private String biIndicator; +} diff --git a/healthlink-his-server/healthlink-his-domain/src/main/java/com/healthlink/his/cssd/domain/CssdTraceRecord.java b/healthlink-his-server/healthlink-his-domain/src/main/java/com/healthlink/his/cssd/domain/CssdTraceRecord.java new file mode 100644 index 000000000..fb895ade9 --- /dev/null +++ b/healthlink-his-server/healthlink-his-domain/src/main/java/com/healthlink/his/cssd/domain/CssdTraceRecord.java @@ -0,0 +1,11 @@ +package com.healthlink.his.cssd.domain; +import com.baomidou.mybatisplus.annotation.*;import com.core.common.core.domain.HisBaseEntity; +import lombok.Data;import lombok.EqualsAndHashCode;import java.util.Date; +@Data @EqualsAndHashCode(callSuper=true) @TableName("cssd_trace_record") +public class CssdTraceRecord extends HisBaseEntity { + @TableId(value="id",type=IdType.ASSIGN_ID) private Long id; + private Long trayId; private String trayCode; private String stepType; + private Long operatorId; private String operatorName; private Date operationTime; + private String deviceName; private String deviceCode; private String parameters; + private String result; private String remark; +} diff --git a/healthlink-his-server/healthlink-his-domain/src/main/java/com/healthlink/his/cssd/domain/CssdTray.java b/healthlink-his-server/healthlink-his-domain/src/main/java/com/healthlink/his/cssd/domain/CssdTray.java new file mode 100644 index 000000000..060b15dac --- /dev/null +++ b/healthlink-his-server/healthlink-his-domain/src/main/java/com/healthlink/his/cssd/domain/CssdTray.java @@ -0,0 +1,10 @@ +package com.healthlink.his.cssd.domain; +import com.baomidou.mybatisplus.annotation.*;import com.core.common.core.domain.HisBaseEntity; +import lombok.Data;import lombok.EqualsAndHashCode;import java.util.Date; +@Data @EqualsAndHashCode(callSuper=true) @TableName("cssd_tray") +public class CssdTray extends HisBaseEntity { + @TableId(value="id",type=IdType.ASSIGN_ID) private Long id; + private String trayCode; private String trayName; private String trayType; + private String departmentSource; private String status; private String currentLocation; + private Integer totalUses; private Integer sterilizeCount; private Date lastSterilizeTime; private Integer maxUses; +} diff --git a/healthlink-his-server/healthlink-his-domain/src/main/java/com/healthlink/his/cssd/mapper/CssdExpiryAlertMapper.java b/healthlink-his-server/healthlink-his-domain/src/main/java/com/healthlink/his/cssd/mapper/CssdExpiryAlertMapper.java new file mode 100644 index 000000000..f5c613a44 --- /dev/null +++ b/healthlink-his-server/healthlink-his-domain/src/main/java/com/healthlink/his/cssd/mapper/CssdExpiryAlertMapper.java @@ -0,0 +1,6 @@ +package com.healthlink.his.cssd.mapper; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.healthlink.his.cssd.domain.CssdExpiryAlert; +import org.apache.ibatis.annotations.Mapper; +@Mapper +public interface CssdExpiryAlertMapper extends BaseMapper {} diff --git a/healthlink-his-server/healthlink-his-domain/src/main/java/com/healthlink/his/cssd/mapper/CssdSterilizeBatchMapper.java b/healthlink-his-server/healthlink-his-domain/src/main/java/com/healthlink/his/cssd/mapper/CssdSterilizeBatchMapper.java new file mode 100644 index 000000000..6894d6ffa --- /dev/null +++ b/healthlink-his-server/healthlink-his-domain/src/main/java/com/healthlink/his/cssd/mapper/CssdSterilizeBatchMapper.java @@ -0,0 +1,6 @@ +package com.healthlink.his.cssd.mapper; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.healthlink.his.cssd.domain.CssdSterilizeBatch; +import org.apache.ibatis.annotations.Mapper; +@Mapper +public interface CssdSterilizeBatchMapper extends BaseMapper {} diff --git a/healthlink-his-server/healthlink-his-domain/src/main/java/com/healthlink/his/cssd/mapper/CssdSterilizeItemMapper.java b/healthlink-his-server/healthlink-his-domain/src/main/java/com/healthlink/his/cssd/mapper/CssdSterilizeItemMapper.java new file mode 100644 index 000000000..87f5f7457 --- /dev/null +++ b/healthlink-his-server/healthlink-his-domain/src/main/java/com/healthlink/his/cssd/mapper/CssdSterilizeItemMapper.java @@ -0,0 +1,6 @@ +package com.healthlink.his.cssd.mapper; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.healthlink.his.cssd.domain.CssdSterilizeItem; +import org.apache.ibatis.annotations.Mapper; +@Mapper +public interface CssdSterilizeItemMapper extends BaseMapper {} diff --git a/healthlink-his-server/healthlink-his-domain/src/main/java/com/healthlink/his/cssd/mapper/CssdTraceRecordMapper.java b/healthlink-his-server/healthlink-his-domain/src/main/java/com/healthlink/his/cssd/mapper/CssdTraceRecordMapper.java new file mode 100644 index 000000000..35c4f00af --- /dev/null +++ b/healthlink-his-server/healthlink-his-domain/src/main/java/com/healthlink/his/cssd/mapper/CssdTraceRecordMapper.java @@ -0,0 +1,6 @@ +package com.healthlink.his.cssd.mapper; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.healthlink.his.cssd.domain.CssdTraceRecord; +import org.apache.ibatis.annotations.Mapper; +@Mapper +public interface CssdTraceRecordMapper extends BaseMapper {} diff --git a/healthlink-his-server/healthlink-his-domain/src/main/java/com/healthlink/his/cssd/mapper/CssdTrayMapper.java b/healthlink-his-server/healthlink-his-domain/src/main/java/com/healthlink/his/cssd/mapper/CssdTrayMapper.java new file mode 100644 index 000000000..5011822e3 --- /dev/null +++ b/healthlink-his-server/healthlink-his-domain/src/main/java/com/healthlink/his/cssd/mapper/CssdTrayMapper.java @@ -0,0 +1,6 @@ +package com.healthlink.his.cssd.mapper; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.healthlink.his.cssd.domain.CssdTray; +import org.apache.ibatis.annotations.Mapper; +@Mapper +public interface CssdTrayMapper extends BaseMapper {} diff --git a/healthlink-his-server/healthlink-his-domain/src/main/java/com/healthlink/his/cssd/service/ICssdExpiryAlertService.java b/healthlink-his-server/healthlink-his-domain/src/main/java/com/healthlink/his/cssd/service/ICssdExpiryAlertService.java new file mode 100644 index 000000000..a8db02c03 --- /dev/null +++ b/healthlink-his-server/healthlink-his-domain/src/main/java/com/healthlink/his/cssd/service/ICssdExpiryAlertService.java @@ -0,0 +1,4 @@ +package com.healthlink.his.cssd.service; +import com.baomidou.mybatisplus.extension.service.IService; +import com.healthlink.his.cssd.domain.CssdExpiryAlert; +public interface ICssdExpiryAlertService extends IService {} diff --git a/healthlink-his-server/healthlink-his-domain/src/main/java/com/healthlink/his/cssd/service/ICssdSterilizeBatchService.java b/healthlink-his-server/healthlink-his-domain/src/main/java/com/healthlink/his/cssd/service/ICssdSterilizeBatchService.java new file mode 100644 index 000000000..936d6ea2f --- /dev/null +++ b/healthlink-his-server/healthlink-his-domain/src/main/java/com/healthlink/his/cssd/service/ICssdSterilizeBatchService.java @@ -0,0 +1,4 @@ +package com.healthlink.his.cssd.service; +import com.baomidou.mybatisplus.extension.service.IService; +import com.healthlink.his.cssd.domain.CssdSterilizeBatch; +public interface ICssdSterilizeBatchService extends IService {} diff --git a/healthlink-his-server/healthlink-his-domain/src/main/java/com/healthlink/his/cssd/service/ICssdSterilizeItemService.java b/healthlink-his-server/healthlink-his-domain/src/main/java/com/healthlink/his/cssd/service/ICssdSterilizeItemService.java new file mode 100644 index 000000000..88807aec6 --- /dev/null +++ b/healthlink-his-server/healthlink-his-domain/src/main/java/com/healthlink/his/cssd/service/ICssdSterilizeItemService.java @@ -0,0 +1,4 @@ +package com.healthlink.his.cssd.service; +import com.baomidou.mybatisplus.extension.service.IService; +import com.healthlink.his.cssd.domain.CssdSterilizeItem; +public interface ICssdSterilizeItemService extends IService {} diff --git a/healthlink-his-server/healthlink-his-domain/src/main/java/com/healthlink/his/cssd/service/ICssdTraceRecordService.java b/healthlink-his-server/healthlink-his-domain/src/main/java/com/healthlink/his/cssd/service/ICssdTraceRecordService.java new file mode 100644 index 000000000..07f627043 --- /dev/null +++ b/healthlink-his-server/healthlink-his-domain/src/main/java/com/healthlink/his/cssd/service/ICssdTraceRecordService.java @@ -0,0 +1,4 @@ +package com.healthlink.his.cssd.service; +import com.baomidou.mybatisplus.extension.service.IService; +import com.healthlink.his.cssd.domain.CssdTraceRecord; +public interface ICssdTraceRecordService extends IService {} diff --git a/healthlink-his-server/healthlink-his-domain/src/main/java/com/healthlink/his/cssd/service/ICssdTrayService.java b/healthlink-his-server/healthlink-his-domain/src/main/java/com/healthlink/his/cssd/service/ICssdTrayService.java new file mode 100644 index 000000000..a37be5e7d --- /dev/null +++ b/healthlink-his-server/healthlink-his-domain/src/main/java/com/healthlink/his/cssd/service/ICssdTrayService.java @@ -0,0 +1,4 @@ +package com.healthlink.his.cssd.service; +import com.baomidou.mybatisplus.extension.service.IService; +import com.healthlink.his.cssd.domain.CssdTray; +public interface ICssdTrayService extends IService {} diff --git a/healthlink-his-server/healthlink-his-domain/src/main/java/com/healthlink/his/cssd/service/impl/CssdExpiryAlertServiceImpl.java b/healthlink-his-server/healthlink-his-domain/src/main/java/com/healthlink/his/cssd/service/impl/CssdExpiryAlertServiceImpl.java new file mode 100644 index 000000000..bbd50fda1 --- /dev/null +++ b/healthlink-his-server/healthlink-his-domain/src/main/java/com/healthlink/his/cssd/service/impl/CssdExpiryAlertServiceImpl.java @@ -0,0 +1,8 @@ +package com.healthlink.his.cssd.service.impl; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.healthlink.his.cssd.domain.CssdExpiryAlert; +import com.healthlink.his.cssd.mapper.CssdExpiryAlertMapper; +import com.healthlink.his.cssd.service.ICssdExpiryAlertService; +import org.springframework.stereotype.Service; +@Service +public class CssdExpiryAlertServiceImpl extends ServiceImpl implements ICssdExpiryAlertService {} diff --git a/healthlink-his-server/healthlink-his-domain/src/main/java/com/healthlink/his/cssd/service/impl/CssdSterilizeBatchServiceImpl.java b/healthlink-his-server/healthlink-his-domain/src/main/java/com/healthlink/his/cssd/service/impl/CssdSterilizeBatchServiceImpl.java new file mode 100644 index 000000000..bc0a7519d --- /dev/null +++ b/healthlink-his-server/healthlink-his-domain/src/main/java/com/healthlink/his/cssd/service/impl/CssdSterilizeBatchServiceImpl.java @@ -0,0 +1,8 @@ +package com.healthlink.his.cssd.service.impl; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.healthlink.his.cssd.domain.CssdSterilizeBatch; +import com.healthlink.his.cssd.mapper.CssdSterilizeBatchMapper; +import com.healthlink.his.cssd.service.ICssdSterilizeBatchService; +import org.springframework.stereotype.Service; +@Service +public class CssdSterilizeBatchServiceImpl extends ServiceImpl implements ICssdSterilizeBatchService {} diff --git a/healthlink-his-server/healthlink-his-domain/src/main/java/com/healthlink/his/cssd/service/impl/CssdSterilizeItemServiceImpl.java b/healthlink-his-server/healthlink-his-domain/src/main/java/com/healthlink/his/cssd/service/impl/CssdSterilizeItemServiceImpl.java new file mode 100644 index 000000000..f3089914d --- /dev/null +++ b/healthlink-his-server/healthlink-his-domain/src/main/java/com/healthlink/his/cssd/service/impl/CssdSterilizeItemServiceImpl.java @@ -0,0 +1,8 @@ +package com.healthlink.his.cssd.service.impl; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.healthlink.his.cssd.domain.CssdSterilizeItem; +import com.healthlink.his.cssd.mapper.CssdSterilizeItemMapper; +import com.healthlink.his.cssd.service.ICssdSterilizeItemService; +import org.springframework.stereotype.Service; +@Service +public class CssdSterilizeItemServiceImpl extends ServiceImpl implements ICssdSterilizeItemService {} diff --git a/healthlink-his-server/healthlink-his-domain/src/main/java/com/healthlink/his/cssd/service/impl/CssdTraceRecordServiceImpl.java b/healthlink-his-server/healthlink-his-domain/src/main/java/com/healthlink/his/cssd/service/impl/CssdTraceRecordServiceImpl.java new file mode 100644 index 000000000..219e54875 --- /dev/null +++ b/healthlink-his-server/healthlink-his-domain/src/main/java/com/healthlink/his/cssd/service/impl/CssdTraceRecordServiceImpl.java @@ -0,0 +1,8 @@ +package com.healthlink.his.cssd.service.impl; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.healthlink.his.cssd.domain.CssdTraceRecord; +import com.healthlink.his.cssd.mapper.CssdTraceRecordMapper; +import com.healthlink.his.cssd.service.ICssdTraceRecordService; +import org.springframework.stereotype.Service; +@Service +public class CssdTraceRecordServiceImpl extends ServiceImpl implements ICssdTraceRecordService {} diff --git a/healthlink-his-server/healthlink-his-domain/src/main/java/com/healthlink/his/cssd/service/impl/CssdTrayServiceImpl.java b/healthlink-his-server/healthlink-his-domain/src/main/java/com/healthlink/his/cssd/service/impl/CssdTrayServiceImpl.java new file mode 100644 index 000000000..c0e6d03ee --- /dev/null +++ b/healthlink-his-server/healthlink-his-domain/src/main/java/com/healthlink/his/cssd/service/impl/CssdTrayServiceImpl.java @@ -0,0 +1,8 @@ +package com.healthlink.his.cssd.service.impl; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.healthlink.his.cssd.domain.CssdTray; +import com.healthlink.his.cssd.mapper.CssdTrayMapper; +import com.healthlink.his.cssd.service.ICssdTrayService; +import org.springframework.stereotype.Service; +@Service +public class CssdTrayServiceImpl extends ServiceImpl implements ICssdTrayService {} diff --git a/healthlink-his-server/healthlink-his-domain/src/main/java/com/healthlink/his/reconstruction/domain/ReconstructionReport.java b/healthlink-his-server/healthlink-his-domain/src/main/java/com/healthlink/his/reconstruction/domain/ReconstructionReport.java new file mode 100644 index 000000000..4f5ebc504 --- /dev/null +++ b/healthlink-his-server/healthlink-his-domain/src/main/java/com/healthlink/his/reconstruction/domain/ReconstructionReport.java @@ -0,0 +1,11 @@ +package com.healthlink.his.reconstruction.domain; +import com.baomidou.mybatisplus.annotation.*;import com.core.common.core.domain.HisBaseEntity; +import lombok.Data;import lombok.EqualsAndHashCode;import java.util.Date; +@Data @EqualsAndHashCode(callSuper=true) @TableName("reconstruction_report") +public class ReconstructionReport extends HisBaseEntity { + @TableId(value="id",type=IdType.ASSIGN_ID) private Long id; + private Long taskId; private Long patientId; private Long encounterId; + private String findings; private String impression; private String conclusion; + private String reportDoctor; private Date reportTime; + private String verifyDoctor; private Date verifyTime; private String status; +} diff --git a/healthlink-his-server/healthlink-his-domain/src/main/java/com/healthlink/his/reconstruction/domain/ReconstructionResult.java b/healthlink-his-server/healthlink-his-domain/src/main/java/com/healthlink/his/reconstruction/domain/ReconstructionResult.java new file mode 100644 index 000000000..58bd3ac38 --- /dev/null +++ b/healthlink-his-server/healthlink-his-domain/src/main/java/com/healthlink/his/reconstruction/domain/ReconstructionResult.java @@ -0,0 +1,9 @@ +package com.healthlink.his.reconstruction.domain; +import com.baomidou.mybatisplus.annotation.*;import com.core.common.core.domain.HisBaseEntity; +import lombok.Data;import lombok.EqualsAndHashCode; +@Data @EqualsAndHashCode(callSuper=true) @TableName("reconstruction_result") +public class ReconstructionResult extends HisBaseEntity { + @TableId(value="id",type=IdType.ASSIGN_ID) private Long id; + private Long taskId; private String resultType; private String imagePath; + private String volumeDataPath; private String measurements; private String annotations; +} diff --git a/healthlink-his-server/healthlink-his-domain/src/main/java/com/healthlink/his/reconstruction/domain/ReconstructionTask.java b/healthlink-his-server/healthlink-his-domain/src/main/java/com/healthlink/his/reconstruction/domain/ReconstructionTask.java new file mode 100644 index 000000000..bf03179ba --- /dev/null +++ b/healthlink-his-server/healthlink-his-domain/src/main/java/com/healthlink/his/reconstruction/domain/ReconstructionTask.java @@ -0,0 +1,13 @@ +package com.healthlink.his.reconstruction.domain; +import com.baomidou.mybatisplus.annotation.*;import com.core.common.core.domain.HisBaseEntity; +import lombok.Data;import lombok.EqualsAndHashCode;import java.math.BigDecimal;import java.util.Date; +@Data @EqualsAndHashCode(callSuper=true) @TableName("reconstruction_task") +public class ReconstructionTask extends HisBaseEntity { + @TableId(value="id",type=IdType.ASSIGN_ID) private Long id; + private Long patientId; private String patientName; private Long encounterId; + private Long applyId; private String studyUid; private String modality; + private String bodyPart; private String scanRange; private String taskStatus; + private String reconstructionType; private String resultPath; + private BigDecimal sliceThickness; private String pixelSpacing; + private String requestDoctor; private Date completeTime; +} diff --git a/healthlink-his-server/healthlink-his-domain/src/main/java/com/healthlink/his/reconstruction/mapper/ReconstructionReportMapper.java b/healthlink-his-server/healthlink-his-domain/src/main/java/com/healthlink/his/reconstruction/mapper/ReconstructionReportMapper.java new file mode 100644 index 000000000..3a5852240 --- /dev/null +++ b/healthlink-his-server/healthlink-his-domain/src/main/java/com/healthlink/his/reconstruction/mapper/ReconstructionReportMapper.java @@ -0,0 +1,6 @@ +package com.healthlink.his.reconstruction.mapper; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.healthlink.his.reconstruction.domain.ReconstructionReport; +import org.apache.ibatis.annotations.Mapper; +@Mapper +public interface ReconstructionReportMapper extends BaseMapper {} diff --git a/healthlink-his-server/healthlink-his-domain/src/main/java/com/healthlink/his/reconstruction/mapper/ReconstructionResultMapper.java b/healthlink-his-server/healthlink-his-domain/src/main/java/com/healthlink/his/reconstruction/mapper/ReconstructionResultMapper.java new file mode 100644 index 000000000..d380bc11b --- /dev/null +++ b/healthlink-his-server/healthlink-his-domain/src/main/java/com/healthlink/his/reconstruction/mapper/ReconstructionResultMapper.java @@ -0,0 +1,6 @@ +package com.healthlink.his.reconstruction.mapper; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.healthlink.his.reconstruction.domain.ReconstructionResult; +import org.apache.ibatis.annotations.Mapper; +@Mapper +public interface ReconstructionResultMapper extends BaseMapper {} diff --git a/healthlink-his-server/healthlink-his-domain/src/main/java/com/healthlink/his/reconstruction/mapper/ReconstructionTaskMapper.java b/healthlink-his-server/healthlink-his-domain/src/main/java/com/healthlink/his/reconstruction/mapper/ReconstructionTaskMapper.java new file mode 100644 index 000000000..75b93738f --- /dev/null +++ b/healthlink-his-server/healthlink-his-domain/src/main/java/com/healthlink/his/reconstruction/mapper/ReconstructionTaskMapper.java @@ -0,0 +1,6 @@ +package com.healthlink.his.reconstruction.mapper; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.healthlink.his.reconstruction.domain.ReconstructionTask; +import org.apache.ibatis.annotations.Mapper; +@Mapper +public interface ReconstructionTaskMapper extends BaseMapper {} diff --git a/healthlink-his-server/healthlink-his-domain/src/main/java/com/healthlink/his/reconstruction/service/IReconstructionReportService.java b/healthlink-his-server/healthlink-his-domain/src/main/java/com/healthlink/his/reconstruction/service/IReconstructionReportService.java new file mode 100644 index 000000000..29edaeb93 --- /dev/null +++ b/healthlink-his-server/healthlink-his-domain/src/main/java/com/healthlink/his/reconstruction/service/IReconstructionReportService.java @@ -0,0 +1,4 @@ +package com.healthlink.his.reconstruction.service; +import com.baomidou.mybatisplus.extension.service.IService; +import com.healthlink.his.reconstruction.domain.ReconstructionReport; +public interface IReconstructionReportService extends IService {} diff --git a/healthlink-his-server/healthlink-his-domain/src/main/java/com/healthlink/his/reconstruction/service/IReconstructionResultService.java b/healthlink-his-server/healthlink-his-domain/src/main/java/com/healthlink/his/reconstruction/service/IReconstructionResultService.java new file mode 100644 index 000000000..f29e05a51 --- /dev/null +++ b/healthlink-his-server/healthlink-his-domain/src/main/java/com/healthlink/his/reconstruction/service/IReconstructionResultService.java @@ -0,0 +1,4 @@ +package com.healthlink.his.reconstruction.service; +import com.baomidou.mybatisplus.extension.service.IService; +import com.healthlink.his.reconstruction.domain.ReconstructionResult; +public interface IReconstructionResultService extends IService {} diff --git a/healthlink-his-server/healthlink-his-domain/src/main/java/com/healthlink/his/reconstruction/service/IReconstructionTaskService.java b/healthlink-his-server/healthlink-his-domain/src/main/java/com/healthlink/his/reconstruction/service/IReconstructionTaskService.java new file mode 100644 index 000000000..9a70900b9 --- /dev/null +++ b/healthlink-his-server/healthlink-his-domain/src/main/java/com/healthlink/his/reconstruction/service/IReconstructionTaskService.java @@ -0,0 +1,4 @@ +package com.healthlink.his.reconstruction.service; +import com.baomidou.mybatisplus.extension.service.IService; +import com.healthlink.his.reconstruction.domain.ReconstructionTask; +public interface IReconstructionTaskService extends IService {} diff --git a/healthlink-his-server/healthlink-his-domain/src/main/java/com/healthlink/his/reconstruction/service/impl/ReconstructionReportServiceImpl.java b/healthlink-his-server/healthlink-his-domain/src/main/java/com/healthlink/his/reconstruction/service/impl/ReconstructionReportServiceImpl.java new file mode 100644 index 000000000..04717b619 --- /dev/null +++ b/healthlink-his-server/healthlink-his-domain/src/main/java/com/healthlink/his/reconstruction/service/impl/ReconstructionReportServiceImpl.java @@ -0,0 +1,8 @@ +package com.healthlink.his.reconstruction.service.impl; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.healthlink.his.reconstruction.domain.ReconstructionReport; +import com.healthlink.his.reconstruction.mapper.ReconstructionReportMapper; +import com.healthlink.his.reconstruction.service.IReconstructionReportService; +import org.springframework.stereotype.Service; +@Service +public class ReconstructionReportServiceImpl extends ServiceImpl implements IReconstructionReportService {} diff --git a/healthlink-his-server/healthlink-his-domain/src/main/java/com/healthlink/his/reconstruction/service/impl/ReconstructionResultServiceImpl.java b/healthlink-his-server/healthlink-his-domain/src/main/java/com/healthlink/his/reconstruction/service/impl/ReconstructionResultServiceImpl.java new file mode 100644 index 000000000..6b49f33e1 --- /dev/null +++ b/healthlink-his-server/healthlink-his-domain/src/main/java/com/healthlink/his/reconstruction/service/impl/ReconstructionResultServiceImpl.java @@ -0,0 +1,8 @@ +package com.healthlink.his.reconstruction.service.impl; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.healthlink.his.reconstruction.domain.ReconstructionResult; +import com.healthlink.his.reconstruction.mapper.ReconstructionResultMapper; +import com.healthlink.his.reconstruction.service.IReconstructionResultService; +import org.springframework.stereotype.Service; +@Service +public class ReconstructionResultServiceImpl extends ServiceImpl implements IReconstructionResultService {} diff --git a/healthlink-his-server/healthlink-his-domain/src/main/java/com/healthlink/his/reconstruction/service/impl/ReconstructionTaskServiceImpl.java b/healthlink-his-server/healthlink-his-domain/src/main/java/com/healthlink/his/reconstruction/service/impl/ReconstructionTaskServiceImpl.java new file mode 100644 index 000000000..59bf74a56 --- /dev/null +++ b/healthlink-his-server/healthlink-his-domain/src/main/java/com/healthlink/his/reconstruction/service/impl/ReconstructionTaskServiceImpl.java @@ -0,0 +1,8 @@ +package com.healthlink.his.reconstruction.service.impl; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.healthlink.his.reconstruction.domain.ReconstructionTask; +import com.healthlink.his.reconstruction.mapper.ReconstructionTaskMapper; +import com.healthlink.his.reconstruction.service.IReconstructionTaskService; +import org.springframework.stereotype.Service; +@Service +public class ReconstructionTaskServiceImpl extends ServiceImpl implements IReconstructionTaskService {} diff --git a/healthlink-his-ui/src/views/cssd/trace/api.js b/healthlink-his-ui/src/views/cssd/trace/api.js new file mode 100644 index 000000000..145ba535d --- /dev/null +++ b/healthlink-his-ui/src/views/cssd/trace/api.js @@ -0,0 +1,12 @@ +import request from '@/utils/request' +export function getTrayPage(p){return request({url:'/cssd/tray/page',method:'get',params:p})} +export function addTray(d){return request({url:'/cssd/tray/add',method:'post',data:d})} +export function updateTray(d){return request({url:'/cssd/tray/update',method:'put',data:d})} +export function scanTrace(d){return request({url:'/cssd/trace/scan',method:'post',data:d})} +export function getTraceHistory(trayId){return request({url:'/cssd/trace/history/'+trayId,method:'get'})} +export function getBatchPage(p){return request({url:'/cssd/sterilize/page',method:'get',params:p})} +export function addBatch(d){return request({url:'/cssd/sterilize/add',method:'post',data:d})} +export function completeBatch(id,d){return request({url:'/cssd/sterilize/complete/'+id,method:'put',data:d})} +export function releaseBatch(id,by){return request({url:'/cssd/sterilize/release/'+id,method:'put',params:{releaseBy:by}})} +export function getExpiryAlerts(){return request({url:'/cssd/expiry/alerts',method:'get'})} +export function getStats(){return request({url:'/cssd/stats/overview',method:'get'})} diff --git a/healthlink-his-ui/src/views/cssd/trace/index.vue b/healthlink-his-ui/src/views/cssd/trace/index.vue new file mode 100644 index 000000000..e92884095 --- /dev/null +++ b/healthlink-his-ui/src/views/cssd/trace/index.vue @@ -0,0 +1,166 @@ + + diff --git a/healthlink-his-ui/src/views/reconstruction/3d/api.js b/healthlink-his-ui/src/views/reconstruction/3d/api.js new file mode 100644 index 000000000..cf4a2ae3c --- /dev/null +++ b/healthlink-his-ui/src/views/reconstruction/3d/api.js @@ -0,0 +1,12 @@ +import request from '@/utils/request' +export function getTaskPage(p){return request({url:'/reconstruction/task/page',method:'get',params:p})} +export function addTask(d){return request({url:'/reconstruction/task/add',method:'post',data:d})} +export function getTask(id){return request({url:'/reconstruction/task/'+id,method:'get'})} +export function cancelTask(id){return request({url:'/reconstruction/task/cancel/'+id,method:'put'})} +export function getResults(taskId){return request({url:'/reconstruction/result/list/'+taskId,method:'get'})} +export function addResult(d){return request({url:'/reconstruction/result/add',method:'post',data:d})} +export function getReportPage(p){return request({url:'/reconstruction/report/page',method:'get',params:p})} +export function addReport(d){return request({url:'/reconstruction/report/add',method:'post',data:d})} +export function submitReport(id){return request({url:'/reconstruction/report/submit/'+id,method:'put'})} +export function verifyReport(id,doctor){return request({url:'/reconstruction/report/verify/'+id,method:'put',params:{doctor}})} +export function getStats(){return request({url:'/reconstruction/stats',method:'get'})} diff --git a/healthlink-his-ui/src/views/reconstruction/3d/index.vue b/healthlink-his-ui/src/views/reconstruction/3d/index.vue new file mode 100644 index 000000000..4e8a64047 --- /dev/null +++ b/healthlink-his-ui/src/views/reconstruction/3d/index.vue @@ -0,0 +1,141 @@ + +