- 删除手术状态下拉框的重复字典数据,保留每组中dict_code最小的记录 - 修复HisBaseEntity列缺失问题,为多个表添加create_by、update_by、update_time等基础字段 - 为adm_patient表添加邮政编码、户籍地址、监护人信息、患者来源等缺失字段 - 添加文化程度字典类型和相关字典数据,补充3919到3914等10个学历级别选项 - 为adm_patient_identifier表创建tenant_id和patient_id的联合索引以提升查询性能 - 修复prescription_intercept_log和clinical_pathway_execution表的基础实体字段缺失 - 为wor_device_request表增加医嘱退回相关的back_reason、performer_check_id等字段 - 创建EMPI核心表empi_person和empi_person_id_mapping用于全局患者主索引管理 - 为empi_merge_log表添加create_time字段以完善审计信息 - 更新院感管理和评审保障模块的设计文档,明确各模块实现状态和缺失功能
1178 lines
46 KiB
Markdown
1178 lines
46 KiB
Markdown
# Phase 3 — 空壳补全 + 统计报表 + EMPI + 其他 详细设计
|
||
|
||
| 属性 | 值 |
|
||
|------|------|
|
||
| 文档类型 | 详细设计 |
|
||
| 版本 | v1.0 |
|
||
| 日期 | 2026-06-17 |
|
||
| 范围 | 37个模块的补全与增强 |
|
||
|
||
---
|
||
|
||
## 一、总体概述
|
||
|
||
Phase 3 分为四大类工作:
|
||
|
||
| 类别 | 模块数 | 说明 |
|
||
|------|:------:|------|
|
||
| A. 后端骨架补全 | 8 | empi / quality / followup / drugtrace / cssd / preopmanage / reconstruction / empienhanced |
|
||
| B. 统计报表补全 | 5 | 质控指标自动采集 / DRG-DIP分析 / 经营分析 / 数据导出 / 可视化仪表盘 |
|
||
| C. 合理用药增强 | 1 | 肝肾功能调量 |
|
||
| D. 传染病报告 | 1 | 门诊传染病上报 |
|
||
|
||
> 注:前端空壳审计发现所有 237 个 Vue 文件均已含 `<script>` 逻辑(可能已补全),本设计聚焦后端业务逻辑补全。
|
||
|
||
---
|
||
|
||
## 二、模块详细设计
|
||
|
||
---
|
||
|
||
### 2.1 EMPI(企业主患者索引)
|
||
|
||
#### 2.1.1 已有代码分析
|
||
|
||
| 层 | 文件 | 行数 | 状态 |
|
||
|----|------|:----:|------|
|
||
| Controller | EmpiController.java | 76 | 完整(9端点) |
|
||
| Controller | EmpiEnhancedController.java | 97 | 完整(照片/家属/合并日志) |
|
||
| Controller | EmpiIdVerificationController.java | 63 | 完整(身份证验证) |
|
||
| AppService | EmpiAppServiceImpl.java | 129 | 完整(9方法全实现) |
|
||
| Entity | EmpiPerson / EmpiPersonIdMapping / EmpiFamilyMember / EmpiIdVerification / EmpiMergeLog / EmpiPatientPhoto | 147 | 全部完整 |
|
||
| Service | 6个IService + 6个ServiceImpl | 94 | 全部空壳(MyBatis-Plus默认方法够用) |
|
||
| Mapper | 6个Mapper接口 | 46 | 全部空壳(BaseMapper够用) |
|
||
| Listener | EmpiSyncListener.java | 109 | 完整(Patient保存自动同步EMPI) |
|
||
|
||
**Flyway**: V2026_0616_1(empi_person + empi_person_id_mapping)、V20(empi_patient_photo + empi_family_member + empi_merge_log)、V2026_0616_2(fix create_time)
|
||
|
||
#### 2.1.2 缺失功能
|
||
|
||
| # | 功能 | 优先级 | 说明 |
|
||
|---|------|:------:|------|
|
||
| 1 | 重复检测算法 | P0 | 新注册时自动检测姓名+身份证+手机号相似度,提示可能重复 |
|
||
| 2 | 合并回滚 | P1 | 合并操作支持撤销 |
|
||
| 3 | 跨系统同步队列 | P1 | 大批量注册时异步处理 |
|
||
| 4 | 全局ID分配策略优化 | P2 | 当前UUID截断,需考虑分布式唯一性 |
|
||
|
||
#### 2.1.3 业务流程
|
||
|
||
```
|
||
重复检测流程:
|
||
前端输入患者信息 → EmpiController.register
|
||
→ EmpiAppServiceImpl.registerPerson
|
||
→ 1. 查询 empi_person WHERE (name LIKE ? OR id_card_no = ? OR phone = ?)
|
||
→ 2. 计算相似度(姓名编辑距离、身份证完全匹配、手机号匹配)
|
||
→ 3. 相似度 > 0.7 → 返回候选列表,前端展示"疑似重复"弹窗
|
||
→ 4. 用户确认"新增" → 执行注册
|
||
→ 5. 用户确认"合并" → 执行 mergePersons
|
||
```
|
||
|
||
#### 2.1.4 数据库设计
|
||
|
||
无需新建表。已有表结构完整。
|
||
|
||
需新增字段(Flyway迁移):
|
||
|
||
```sql
|
||
-- V2026_0618_1__empi_duplicate_detection.sql
|
||
ALTER TABLE empi_person ADD COLUMN IF NOT EXISTS name_pinyin VARCHAR(100);
|
||
ALTER TABLE empi_person ADD COLUMN IF NOT EXISTS name_initials VARCHAR(20);
|
||
ALTER TABLE empi_person ADD COLUMN IF NOT EXISTS last_sync_time TIMESTAMP;
|
||
ALTER TABLE empi_person ADD COLUMN IF NOT EXISTS sync_status VARCHAR(20) DEFAULT 'SYNCED';
|
||
```
|
||
|
||
#### 2.1.5 API接口
|
||
|
||
| 端点 | 方法 | 说明 |
|
||
|------|------|------|
|
||
| `/empi/person/register` | POST | 已有,增强:加重复检测前置逻辑 |
|
||
| `/empi/person/check-duplicate` | POST | **新增**:接收 name/idCardNo/phone,返回疑似重复列表 |
|
||
| `/empi/person/merge` | POST | 已有 |
|
||
| `/empi/person/unmerge/{mergeLogId}` | POST | **新增**:回滚合并操作 |
|
||
| `/empi/person/statistics` | GET | 已有 |
|
||
| `/empi/person/linked-patients/{globalId}` | GET | 已有 |
|
||
| `/empi/person/list` | GET | 已有 |
|
||
|
||
#### 2.1.6 前端设计
|
||
|
||
empienhanced 模块 4 个 Vue 文件已有完整 script 逻辑(前端已完成),无需补全。
|
||
|
||
---
|
||
|
||
### 2.2 Quality(病历质控 + 质控指标)
|
||
|
||
#### 2.2.1 已有代码分析
|
||
|
||
| 层 | 文件 | 行数 | 状态 |
|
||
|----|------|:----:|------|
|
||
| Controller | EmrQualityController.java | 33 | 完整(6端点) |
|
||
| Controller | QualityEnhancedController.java | 81 | 完整(5端点:指标CRUD+医嘱统计) |
|
||
| Controller | BusinessAnalyticsController.java | 62 | 完整(3端点:经营分析) |
|
||
| AppService | EmrQualityAppServiceImpl.java | 83 | **部分实现**:executeTerminalCheck 硬编码 PASS,getCompletionRate 返回全零 |
|
||
| Entity | QualityCoreIndicator / QualityOrderStatistics / BusinessAnalytics / EmrDefect / EmrQualityScore | 106 | 全部完整 |
|
||
| Service | 3个IService(Indicator/OrderStats/Analytics) | 21 | 空壳 |
|
||
| Service | EmrDefect / EmrQualityScore **缺失Service层** | — | 直接通过Mapper访问 |
|
||
|
||
**Flyway**: V11(emr_quality_score + emr_defect)、V20(quality_core_indicator + quality_order_statistics)、V23(business_analytics)
|
||
|
||
#### 2.2.2 缺失功能
|
||
|
||
| # | 功能 | 优先级 | 说明 |
|
||
|---|------|:------:|------|
|
||
| 1 | executeTerminalCheck 真实逻辑 | P0 | 当前硬编码全部PASS,需实现5项检查的真实判定 |
|
||
| 2 | getCompletionRate 真实逻辑 | P0 | 当前返回全零,需从 emr_quality_score 统计真实完成率 |
|
||
| 3 | 质控指标自动采集 | P0 | 定时任务从各业务表聚合指标数据 |
|
||
| 4 | EmrDefect/EmrQualityScore Service层 | P1 | 补全缺失的Service接口和实现 |
|
||
| 5 | 缺陷自动检测规则引擎 | P2 | 根据规则自动发现病历缺陷 |
|
||
|
||
#### 2.2.3 业务流程
|
||
|
||
```
|
||
终末质控检查流程:
|
||
EmrQualityController.terminalCheck(encounterId)
|
||
→ EmrQualityAppServiceImpl.executeTerminalCheck
|
||
→ 1. 查询 emr_quality_score WHERE encounter_id = ? AND check_type = 'TERMINAL'
|
||
→ 2. 查询 emr_defect WHERE encounter_id = ? AND defect_type = 'TERMINAL'
|
||
→ 3. 逐项检查:
|
||
- 入院记录24h完成: 查 emr_quality_score WHERE emr_type='ADMISSION' AND create_time - encounter_admit_time < 24h
|
||
- 首次病程8h完成: 查 emr_quality_score WHERE emr_type='FIRST_COURSE' AND create_time - encounter_admit_time < 8h
|
||
- 日常病程及时: 查最近7天 daily_course 记录数 >= 1
|
||
- 出院记录完整: 查 emr_quality_score WHERE emr_type='DISCHARGE' AND score >= 80
|
||
- 签名完整: 查 encounter 所有 EMR 记录的 sign_status 全部为 SIGNED
|
||
→ 4. 汇总结果,写入 EmrQualityScore
|
||
→ 5. 返回 {checks, totalItems, passItems, score}
|
||
|
||
病历完成率统计流程:
|
||
EmrQualityController.completionRate(startDate, endDate)
|
||
→ EmrQualityAppServiceImpl.getCompletionRate
|
||
→ 1. SELECT COUNT(DISTINCT encounter_id) FROM encounter WHERE admit_date BETWEEN ? AND ?
|
||
→ 2. SELECT COUNT(DISTINCT encounter_id) FROM emr_quality_score WHERE check_type='TERMINAL' AND score >= 60
|
||
→ 3. SELECT COUNT(DISTINCT encounter_id) FROM emr_defect WHERE severity='CRITICAL' AND rectify_status='PENDING'
|
||
→ 4. completionRate = completedEmr / totalEncounters * 100
|
||
→ 5. 返回 {totalEncounters, completedEmr, overdueEmr, completionRate}
|
||
|
||
质控指标自动采集流程(定时任务):
|
||
QualityAutoCollectJob.execute (每日凌晨2:00)
|
||
→ 1. 从 encounter 表统计: 住院天数、入出院人次、手术人次
|
||
→ 2. 从 prescription 表统计: 处方合格率、抗菌药物使用率
|
||
→ 3. 从 emr_quality_score 表统计: 病历合格率、甲级病案率
|
||
→ 4. 从 emr_defect 表统计: 缺陷率、逾期整改率
|
||
→ 5. 写入 quality_core_indicator 表
|
||
→ 6. 更新 actual_value 和 status(达标/未达标)
|
||
```
|
||
|
||
#### 2.2.4 数据库设计
|
||
|
||
无需新建表。已有表结构完整。
|
||
|
||
需新增 Flyway 迁移:
|
||
|
||
```sql
|
||
-- V2026_0618_2__quality_enhancement.sql
|
||
ALTER TABLE quality_core_indicator ADD COLUMN IF NOT EXISTS data_source VARCHAR(50);
|
||
ALTER TABLE quality_core_indicator ADD COLUMN IF NOT EXISTS collect_time TIMESTAMP;
|
||
ALTER TABLE quality_core_indicator ADD COLUMN IF NOT EXISTS trend_data JSONB;
|
||
|
||
ALTER TABLE emr_quality_score ADD COLUMN IF NOT EXISTS encounter_admit_time TIMESTAMP;
|
||
ALTER TABLE emr_quality_score ADD COLUMN IF NOT EXISTS check_items JSONB;
|
||
```
|
||
|
||
#### 2.2.5 API接口
|
||
|
||
| 端点 | 方法 | 说明 |
|
||
|------|------|------|
|
||
| `/emr-quality/runtime-check/{encounterId}` | GET | 已有(运行时检查) |
|
||
| `/emr-quality/terminal-check/{encounterId}` | GET | 已有,**需补全逻辑** |
|
||
| `/emr-quality/scores/{encounterId}` | GET | 已有 |
|
||
| `/emr-quality/defects/{encounterId}` | GET | 已有 |
|
||
| `/emr-quality/defect-statistics` | GET | 已有 |
|
||
| `/emr-quality/completion-rate` | GET | 已有,**需补全逻辑** |
|
||
| `/quality-enhanced/indicator/page` | GET | 已有 |
|
||
| `/quality-enhanced/indicator/add` | POST | 已有 |
|
||
| `/quality-enhanced/indicator/summary` | GET | 已有 |
|
||
| `/quality-enhanced/indicator/collect` | POST | **新增**:手动触发指标采集 |
|
||
| `/quality-enhanced/indicator/trend/{code}` | GET | **新增**:指标趋势数据 |
|
||
| `/quality-enhanced/order-stats/page` | GET | 已有 |
|
||
| `/business-analytics/page` | GET | 已有 |
|
||
| `/business-analytics/summary` | GET | 已有 |
|
||
| `/business-analytics/trend` | GET | **新增**:经营趋势数据 |
|
||
|
||
#### 2.2.6 前端设计
|
||
|
||
quality 模块前端页面(emr-quality / quality-enhanced / business-analytics 目录下的 Vue 文件)已有 script 逻辑,无需补全。
|
||
|
||
---
|
||
|
||
### 2.3 Followup(门诊随访管理)
|
||
|
||
#### 2.3.1 已有代码分析
|
||
|
||
| 层 | 文件 | 行数 | 状态 |
|
||
|----|------|:----:|------|
|
||
| Controller | FollowupController.java | 411 | 完整(24端点,5子模块全实现) |
|
||
| AppService | **缺失** | — | 无 AppService 层,业务逻辑全在 Controller |
|
||
| Entity | FollowupPlan / FollowupTask / FollowupRecord / SatisfactionSurvey / ComplaintRecord | 56 | 全部完整 |
|
||
| Service | 5个IService + 5个ServiceImpl | 60 | 全部空壳 |
|
||
|
||
**Flyway**: V32(followup_plan + followup_task + followup_record + satisfaction_survey + complaint_record)
|
||
|
||
#### 2.3.2 缺失功能
|
||
|
||
| # | 功能 | 优先级 | 说明 |
|
||
|---|------|:------:|------|
|
||
| 1 | AppService层提取 | P0 | Controller 直接调用 Service,违反分层架构 |
|
||
| 2 | 随访计划自动生成规则 | P0 | 出院/门诊结束后按病种规则自动生成 |
|
||
| 3 | 随访任务分配算法 | P1 | 按医生工作量自动分配 |
|
||
| 4 | 随访提醒(短信/微信) | P2 | 定时任务检查到期任务 |
|
||
| 5 | 满意度调查模板 | P2 | 可配置的调查问卷模板 |
|
||
|
||
#### 2.3.3 业务流程
|
||
|
||
```
|
||
随访计划自动生成流程:
|
||
FollowupPlanAutoGenerateJob.execute (每日凌晨1:00)
|
||
→ 1. 查询最近7天出院的 encounter (status = 'DISCHARGED')
|
||
→ 2. 对每个出院患者,按病种查询随访规则配置
|
||
→ 3. 生成 FollowupPlan:
|
||
- patientId / patientName / encounterId
|
||
- diseaseCode / diseaseName
|
||
- followupType = 'TELEPHONE'(默认电话随访)
|
||
- frequency = 'WEEKLY'(默认每周)
|
||
- totalTimes = 规则配置的次数(默认4次)
|
||
- responsibleDoctor = 主治医生
|
||
- startDate = 出院日期 + 7天
|
||
- status = 'ACTIVE'
|
||
→ 4. 自动拆解 FollowupTask(按频率生成N个任务)
|
||
→ 5. 发送通知给 responsibleDoctor
|
||
|
||
随访任务执行流程:
|
||
FollowupController.executeTask(task)
|
||
→ 1. 更新 task: result / actualDate / operatorName
|
||
→ 2. 如果 result = 'SUCCESS':
|
||
- plan.completedTimes += 1
|
||
- 如果 completedTimes >= totalTimes → plan.status = 'COMPLETED'
|
||
→ 3. 如果 result = 'ABNORMAL':
|
||
- task.abnormalFlag = true
|
||
- 生成 FollowupRecord(含异常描述)
|
||
- 通知 responsibleDoctor
|
||
```
|
||
|
||
#### 2.3.4 数据库设计
|
||
|
||
无需新建表。已有表结构完整。
|
||
|
||
需新增 Flyway 迁移:
|
||
|
||
```sql
|
||
-- V2026_0618_3__followup_enhancement.sql
|
||
ALTER TABLE followup_plan ADD COLUMN IF NOT EXISTS auto_generated BOOLEAN DEFAULT FALSE;
|
||
ALTER TABLE followup_plan ADD COLUMN IF NOT EXISTS rule_config JSONB;
|
||
ALTER TABLE followup_task ADD COLUMN IF NOT EXISTS reminder_sent BOOLEAN DEFAULT FALSE;
|
||
ALTER TABLE followup_task ADD COLUMN IF NOT EXISTS reminder_time TIMESTAMP;
|
||
ALTER TABLE followup_record ADD COLUMN IF NOT EXISTS symptoms TEXT;
|
||
ALTER TABLE followup_record ADD COLUMN IF NOT EXISTS medication_detail TEXT;
|
||
```
|
||
|
||
#### 2.3.5 API接口
|
||
|
||
| 端点 | 方法 | 说明 |
|
||
|------|------|------|
|
||
| `/followup/plan/page` | GET | 已有 |
|
||
| `/followup/plan/add` | POST | 已有 |
|
||
| `/followup/plan/update` | PUT | 已有 |
|
||
| `/followup/plan/delete/{id}` | DELETE | 已有 |
|
||
| `/followup/plan/complete/{id}` | PUT | 已有 |
|
||
| `/followup/plan/auto-generate` | POST | **新增**:手动触发计划生成 |
|
||
| `/followup/task/page` | GET | 已有 |
|
||
| `/followup/task/today` | GET | 已有 |
|
||
| `/followup/task/execute` | PUT | 已有 |
|
||
| `/followup/task/{id}/abnormal` | PUT | 已有 |
|
||
| `/followup/record/page` | GET | 已有 |
|
||
| `/followup/record/add` | POST | 已有 |
|
||
| `/followup/survey/page` | GET | 已有 |
|
||
| `/followup/survey/stats` | GET | 已有 |
|
||
| `/followup/complaint/page` | GET | 已有 |
|
||
| `/followup/complaint/handle` | PUT | 已有 |
|
||
| `/followup/complaint/close/{id}` | PUT | 已有 |
|
||
| `/followup/statistics/overview` | GET | **新增**:随访完成率/异常率/满意度综合统计 |
|
||
|
||
#### 2.3.6 前端设计
|
||
|
||
followup 模块前端页面(followup-plan / followup-task / followup-record / satisfaction-survey / complaint-record 目录)需检查是否有对应 Vue 页面。如缺失需补全 CRUD 页面。
|
||
|
||
---
|
||
|
||
### 2.4 DrugTrace(药品追溯码管理)
|
||
|
||
#### 2.4.1 已有代码分析
|
||
|
||
| 层 | 文件 | 行数 | 状态 |
|
||
|----|------|:----:|------|
|
||
| Controller | DrugTraceController.java | 270 | 完整(16端点,5子模块) |
|
||
| AppService | **缺失** | — | 业务逻辑全在 Controller |
|
||
| Entity | DrugTraceCode / DrugTraceBatch / DrugTraceScan / DrugTraceAlert | 184 | 全部完整 |
|
||
| Service | 4个IService + 4个ServiceImpl | 72 | 全部空壳 |
|
||
|
||
**Flyway**: V36(drug_trace_code + drug_trace_batch + drug_trace_scan + drug_trace_alert)
|
||
|
||
#### 2.4.2 缺失功能
|
||
|
||
| # | 功能 | 优先级 | 说明 |
|
||
|---|------|:------:|------|
|
||
| 1 | AppService层提取 | P0 | Controller直接调Service违反分层 |
|
||
| 2 | 自动预警生成 | P0 | 近效期/过期药品自动创建预警记录 |
|
||
| 3 | 批量扫码入库 | P1 | 支持一次扫码批量操作 |
|
||
| 4 | 追溯链可视化 | P2 | 从采购到使用的全链路时间线 |
|
||
|
||
#### 2.4.3 业务流程
|
||
|
||
```
|
||
自动预警流程(定时任务):
|
||
DrugTraceAlertJob.execute (每日凌晨3:00)
|
||
→ 1. 查询 drug_trace_code WHERE expiry_date BETWEEN NOW() AND NOW()+30天 AND status='ACTIVE'
|
||
→ 2. 对每条记录生成 DrugTraceAlert:
|
||
- alertType = 'EXPIRING_SOON'
|
||
- alertLevel = 'WARNING'
|
||
- alertContent = "药品{drugName}批次{batchNo}将于{expiryDate}过期"
|
||
- relatedCodeId = code.id
|
||
- status = 'PENDING'
|
||
→ 3. 查询 drug_trace_code WHERE expiry_date < NOW() AND status='ACTIVE'
|
||
→ 4. 对每条记录生成 DrugTraceAlert:
|
||
- alertType = 'EXPIRED'
|
||
- alertLevel = 'CRITICAL'
|
||
- status = 'PENDING'
|
||
→ 5. 查询 drug_trace_scan WHERE scan_result != 'SUCCESS'(异常扫码)
|
||
→ 6. 生成异常扫码预警
|
||
|
||
扫码追溯流程:
|
||
DrugTraceController.recordScan(scan)
|
||
→ 1. 验证 traceCode 是否存在 → DrugTraceCode
|
||
→ 2. 检查药品是否过期 → 生成过期预警
|
||
→ 3. 记录 DrugTraceScan
|
||
→ 4. 如果 scanType = 'INBOUND' → 更新 DrugTraceBatch.receivedQuantity
|
||
→ 5. 如果 scanType = 'DISPENSE' → 检查库存是否充足
|
||
→ 6. 返回扫码结果
|
||
```
|
||
|
||
#### 2.4.4 数据库设计
|
||
|
||
无需新建表。已有表结构完整。
|
||
|
||
需新增 Flyway 迁移:
|
||
|
||
```sql
|
||
-- V2026_0618_4__drugtrace_enhancement.sql
|
||
ALTER TABLE drug_trace_code ADD COLUMN IF NOT EXISTS current_quantity INTEGER;
|
||
ALTER TABLE drug_trace_code ADD COLUMN IF NOT EXISTS location_code VARCHAR(50);
|
||
ALTER TABLE drug_trace_scan ADD COLUMN IF NOT EXISTS related_batch_id BIGINT;
|
||
ALTER TABLE drug_trace_scan ADD COLUMN IF NOT EXISTS quantity_change INTEGER;
|
||
```
|
||
|
||
#### 2.4.5 API接口
|
||
|
||
| 端点 | 方法 | 说明 |
|
||
|------|------|------|
|
||
| `/drugtrace/code/page` | GET | 已有 |
|
||
| `/drugtrace/code/add` | POST | 已有 |
|
||
| `/drugtrace/code/verify/{traceCode}` | GET | 已有 |
|
||
| `/drugtrace/batch/page` | GET | 已有 |
|
||
| `/drugtrace/batch/add` | POST | 已有 |
|
||
| `/drugtrace/batch/{id}/receive` | PUT | 已有 |
|
||
| `/drugtrace/scan/page` | GET | 已有 |
|
||
| `/drugtrace/scan/record` | POST | 已有 |
|
||
| `/drugtrace/scan/trace/{traceCode}` | GET | 已有 |
|
||
| `/drugtrace/alert/page` | GET | 已有 |
|
||
| `/drugtrace/alert/add` | POST | 已有 |
|
||
| `/drugtrace/alert/{id}/handle` | PUT | 已有 |
|
||
| `/drugtrace/statistics` | GET | 已有 |
|
||
| `/drugtrace/scan/batch-inbound` | POST | **新增**:批量扫码入库 |
|
||
| `/drugtrace/trace/chain/{traceCode}` | GET | **新增**:全链路追溯时间线 |
|
||
| `/drugtrace/alert/auto-generate` | POST | **新增**:手动触发预警生成 |
|
||
|
||
#### 2.4.6 前端设计
|
||
|
||
drugtrace 模块前端页面需检查是否有对应 Vue 文件。如缺失需补全。
|
||
|
||
---
|
||
|
||
### 2.5 CSSD(消毒供应中心追溯)
|
||
|
||
#### 2.5.1 已有代码分析
|
||
|
||
| 层 | 文件 | 行数 | 状态 |
|
||
|----|------|:----:|------|
|
||
| Controller | CssdController.java | 161 | 完整(12端点,5子模块) |
|
||
| AppService | **缺失** | — | 业务逻辑全在 Controller |
|
||
| Entity | CssdTray / CssdTraceRecord / CssdSterilizeBatch / CssdSterilizeItem / CssdExpiryAlert | 51 | 全部完整 |
|
||
| Service | 5个IService + 5个ServiceImpl | 70 | 全部空壳 |
|
||
|
||
**Flyway**: V31(cssd_tray + cssd_trace_record + cssd_sterilize_batch + cssd_sterilize_item + cssd_expiry_alert)
|
||
|
||
#### 2.5.2 缺失功能
|
||
|
||
| # | 功能 | 优先级 | 说明 |
|
||
|---|------|:------:|------|
|
||
| 1 | AppService层提取 | P0 | Controller直接调Service违反分层 |
|
||
| 2 | 扫码状态流转校验 | P0 | scanTrace 的 statusFlow Map 逻辑有bug(Map.of键值对误用) |
|
||
| 3 | 灭菌批次关联器械包 | P1 | 批次完成时自动更新关联器械包状态 |
|
||
| 4 | 过期预警自动生成 | P1 | 定时检查器械包灭菌有效期 |
|
||
|
||
#### 2.5.3 业务流程
|
||
|
||
```
|
||
CSSD核心流程(扫码追溯):
|
||
CssdController.scanTrace(params)
|
||
→ 1. 根据 trayCode 查找 CssdTray
|
||
→ 2. 根据 stepType 确定新状态:
|
||
RECYCLE → WASHING → WASH → DISINFECTING → DISINFECT → PACKING → PACK → STERILIZING → STERILIZE → STORED → STORE → DISTRIBUTED
|
||
→ 3. 更新 tray: status / currentLocation
|
||
→ 4. 如果 stepType = 'STERILIZE': sterilizeCount += 1, lastSterilizeTime = now
|
||
→ 5. 如果 stepType = 'DISTRIBUTE': totalUses += 1
|
||
→ 6. 保存 CssdTraceRecord
|
||
→ 7. 返回 {tray, step, nextStep}
|
||
|
||
灭菌批次释放流程:
|
||
CssdController.releaseBatch(id, releaseBy)
|
||
→ 1. 验证批次状态 = COMPLETED
|
||
→ 2. 验证三项监测全部 PASS(生物/化学/物理)
|
||
→ 3. 如果任一不通过 → 返回失败
|
||
→ 4. 更新 batchStatus = RELEASED / releaseBy / releaseTime
|
||
→ 5. 更新关联器械包状态为 STORED
|
||
```
|
||
|
||
#### 2.5.4 数据库设计
|
||
|
||
无需新建表。已有表结构完整。
|
||
|
||
需新增 Flyway 迁移:
|
||
|
||
```sql
|
||
-- V2026_0618_5__cssd_enhancement.sql
|
||
ALTER TABLE cssd_tray ADD COLUMN IF NOT EXISTS sterilize_validity_days INTEGER DEFAULT 180;
|
||
ALTER TABLE cssd_tray ADD COLUMN IF NOT EXISTS last_distribute_time TIMESTAMP;
|
||
ALTER TABLE cssd_sterilize_batch ADD COLUMN IF NOT EXISTS tray_ids JSONB;
|
||
ALTER TABLE cssd_trace_record ADD COLUMN IF NOT EXISTS photo_url VARCHAR(500);
|
||
```
|
||
|
||
#### 2.5.5 API接口
|
||
|
||
| 端点 | 方法 | 说明 |
|
||
|------|------|------|
|
||
| `/cssd/tray/page` | GET | 已有 |
|
||
| `/cssd/tray/add` | POST | 已有 |
|
||
| `/cssd/tray/update` | PUT | 已有 |
|
||
| `/cssd/trace/scan` | POST | 已有,**需修复 statusFlow bug** |
|
||
| `/cssd/trace/history/{trayId}` | GET | 已有 |
|
||
| `/cssd/sterilize/page` | GET | 已有 |
|
||
| `/cssd/sterilize/add` | POST | 已有 |
|
||
| `/cssd/sterilize/complete/{id}` | PUT | 已有 |
|
||
| `/cssd/sterilize/release/{id}` | PUT | 已有 |
|
||
| `/cssd/expiry/alerts` | GET | 已有 |
|
||
| `/cssd/stats/overview` | GET | 已有 |
|
||
| `/cssd/tray/{id}/detail` | GET | **新增**:器械包详情含追溯历史 |
|
||
| `/cssd/sterilize/batch-detail/{id}` | GET | **新增**:批次详情含关联器械包 |
|
||
|
||
#### 2.5.6 前端设计
|
||
|
||
cssd 模块前端页面需检查是否有对应 Vue 文件。
|
||
|
||
---
|
||
|
||
### 2.6 PreopManage(术前讨论管理)
|
||
|
||
#### 2.6.1 已有代码分析
|
||
|
||
| 层 | 文件 | 行数 | 状态 |
|
||
|----|------|:----:|------|
|
||
| Controller | PreopDiscussionController.java | 161 | 完整(7端点) |
|
||
| AppService | **缺失** | — | 业务逻辑全在 Controller |
|
||
| Entity | PreopDiscussion / PreopParticipant | 60 | 全部完整 |
|
||
| Service | 2个IService + 2个ServiceImpl | 24 | 全部空壳 |
|
||
|
||
**Flyway**: V14(sys_preop_discussion + sys_preop_participant)
|
||
|
||
#### 2.6.2 缺失功能
|
||
|
||
| # | 功能 | 优先级 | 说明 |
|
||
|---|------|:------:|------|
|
||
| 1 | AppService层提取 | P0 | Controller直接调Service违反分层 |
|
||
| 2 | 签名后自动流转状态 | P0 | 所有参与者签名后自动将状态从SUBMITTED→REVIEWING |
|
||
| 3 | 讨论记录导出PDF | P1 | 生成术前讨论记录PDF文档 |
|
||
| 4 | 与手术审批模块联动 | P1 | checkRequired 已有,需在手术审批时调用 |
|
||
|
||
#### 2.6.3 业务流程
|
||
|
||
```
|
||
术前讨论完整流程:
|
||
1. 创建讨论 → status = DRAFT(0)
|
||
2. 提交讨论 → status = SUBMITTED(1)
|
||
3. 参与者逐个签名 → signStatus = 1
|
||
4. 所有参与者签名完成 → 自动流转 status = REVIEWING(2)
|
||
5. 科主任审核:
|
||
- 通过 → status = APPROVED(3)
|
||
- 驳回 → status = REJECTED(5)
|
||
6. 审核通过后,手术审批模块可读取讨论结论
|
||
|
||
签名自动流转逻辑:
|
||
PreopDiscussionController.sign(discussionId, userId)
|
||
→ 1. 查找参与者记录
|
||
→ 2. 更新 signStatus = 1
|
||
→ 3. 检查该讨论所有参与者是否全部签名
|
||
→ 4. 如果全部签名 AND 当前状态 = SUBMITTED(1)
|
||
→ 自动更新 status = REVIEWING(2)
|
||
→ 通知科主任审核
|
||
```
|
||
|
||
#### 2.6.4 数据库设计
|
||
|
||
无需新建表。已有表结构完整。
|
||
|
||
需新增 Flyway 迁移:
|
||
|
||
```sql
|
||
-- V2026_0618_6__preop_enhancement.sql
|
||
ALTER TABLE sys_preop_discussion ADD COLUMN IF NOT EXISTS pdf_url VARCHAR(500);
|
||
ALTER TABLE sys_preop_discussion ADD COLUMN IF NOT EXISTS auto_transition BOOLEAN DEFAULT TRUE;
|
||
ALTER TABLE sys_preop_participant ADD COLUMN IF NOT EXISTS sign_order INTEGER;
|
||
```
|
||
|
||
#### 2.6.5 API接口
|
||
|
||
| 端点 | 方法 | 说明 |
|
||
|------|------|------|
|
||
| `/preop-discussion/page` | GET | 已有 |
|
||
| `/preop-discussion/detail` | GET | 已有 |
|
||
| `/preop-discussion/add` | POST | 已有 |
|
||
| `/preop-discussion/submit` | PUT | 已有 |
|
||
| `/preop-discussion/sign` | PUT | 已有,**需增强:自动流转状态** |
|
||
| `/preop-discussion/review` | PUT | 已有 |
|
||
| `/preop-discussion/check-required` | GET | 已有 |
|
||
| `/preop-discussion/statistics` | GET | 已有 |
|
||
| `/preop-discussion/export-pdf/{id}` | GET | **新增**:导出讨论记录PDF |
|
||
|
||
#### 2.6.6 前端设计
|
||
|
||
preopmanage 模块前端页面需检查是否有对应 Vue 文件。
|
||
|
||
---
|
||
|
||
### 2.7 Reconstruction(影像3D重建)
|
||
|
||
#### 2.7.1 已有代码分析
|
||
|
||
| 层 | 文件 | 行数 | 状态 |
|
||
|----|------|:----:|------|
|
||
| Controller | Reconstruction3DController.java | 137 | **部分实现**:addTask 是模拟桩(直接设COMPLETED) |
|
||
| AppService | **缺失** | — | 业务逻辑全在 Controller |
|
||
| Entity | ReconstructionTask / ReconstructionResult / ReconstructionReport | 33 | 全部完整 |
|
||
| Service | 3个IService + 3个ServiceImpl | 54 | 全部空壳 |
|
||
|
||
**Flyway**: V31(reconstruction_task + reconstruction_result + reconstruction_report)
|
||
|
||
#### 2.7.2 缺失功能
|
||
|
||
| # | 功能 | 优先级 | 说明 |
|
||
|---|------|:------:|------|
|
||
| 1 | addTask 真实异步处理 | P0 | 当前直接设COMPLETED,需改为 PROCESSING + 异步回调 |
|
||
| 2 | AppService层提取 | P0 | Controller直接调Service违反分层 |
|
||
| 3 | 重建任务状态回调 | P1 | 第三方重建服务完成后回调更新状态 |
|
||
| 4 | DICOM数据关联 | P1 | 从PACS获取DICOM影像数据 |
|
||
|
||
#### 2.7.3 业务流程
|
||
|
||
```
|
||
3D重建任务流程:
|
||
1. 医生提交重建请求 → Reconstruction3DController.addTask
|
||
→ 创建 ReconstructionTask, status = PENDING
|
||
→ 调用第三方3D重建服务(异步)
|
||
→ 更新 status = PROCESSING
|
||
2. 第三方服务完成 → 回调 /reconstruction/task/{id}/callback
|
||
→ 更新 status = COMPLETED / completeTime
|
||
→ 创建 ReconstructionResult(包含3D模型文件路径)
|
||
3. 医生查看结果 → /reconstruction/result/list/{taskId}
|
||
4. 医生撰写报告 → /reconstruction/report/add
|
||
→ 创建 ReconstructionReport, status = DRAFT
|
||
5. 提交报告 → status = REPORTED
|
||
6. 审核报告 → status = VERIFIED
|
||
```
|
||
|
||
#### 2.7.4 数据库设计
|
||
|
||
无需新建表。已有表结构完整。
|
||
|
||
需新增 Flyway 迁移:
|
||
|
||
```sql
|
||
-- V2026_0618_7__reconstruction_enhancement.sql
|
||
ALTER TABLE reconstruction_task ADD COLUMN IF NOT EXISTS callback_url VARCHAR(500);
|
||
ALTER TABLE reconstruction_task ADD COLUMN IF NOT EXISTS priority INTEGER DEFAULT 0;
|
||
ALTER TABLE reconstruction_task ADD COLUMN IF NOT EXISTS error_message TEXT;
|
||
ALTER TABLE reconstruction_result ADD COLUMN IF NOT EXISTS model_file_url VARCHAR(500);
|
||
ALTER TABLE reconstruction_result ADD COLUMN IF NOT EXISTS file_size BIGINT;
|
||
```
|
||
|
||
#### 2.7.5 API接口
|
||
|
||
| 端点 | 方法 | 说明 |
|
||
|------|------|------|
|
||
| `/reconstruction/task/page` | GET | 已有 |
|
||
| `/reconstruction/task/add` | POST | 已有,**需改为异步** |
|
||
| `/reconstruction/task/{id}` | GET | 已有 |
|
||
| `/reconstruction/task/cancel/{id}` | PUT | 已有 |
|
||
| `/reconstruction/task/{id}/callback` | POST | **新增**:第三方回调更新状态 |
|
||
| `/reconstruction/result/list/{taskId}` | GET | 已有 |
|
||
| `/reconstruction/result/add` | POST | 已有 |
|
||
| `/reconstruction/report/page` | GET | 已有 |
|
||
| `/reconstruction/report/add` | POST | 已有 |
|
||
| `/reconstruction/report/submit/{id}` | PUT | 已有 |
|
||
| `/reconstruction/report/verify/{id}` | PUT | 已有 |
|
||
| `/reconstruction/stats` | GET | 已有 |
|
||
| `/reconstruction/doctors` | GET | 已有 |
|
||
|
||
#### 2.7.6 前端设计
|
||
|
||
reconstruction 模块前端页面需检查是否有对应 Vue 文件。
|
||
|
||
---
|
||
|
||
### 2.8 EmpiEnhanced(EMPI增强)
|
||
|
||
#### 2.8.1 已有代码分析
|
||
|
||
| 层 | 文件 | 状态 |
|
||
|----|------|------|
|
||
| Controller | EmpiEnhancedController.java(在empi模块内) | 完整(照片/家属/合并日志 CRUD) |
|
||
| 前端 | 4个Vue文件(empienhanced目录) | **已有完整script** |
|
||
| 后端AppService | **缺失**(Controller直接调Service) | 需补AppService层 |
|
||
|
||
#### 2.8.2 缺失功能
|
||
|
||
| # | 功能 | 优先级 | 说明 |
|
||
|---|------|:------:|------|
|
||
| 1 | AppService层提取 | P0 | EmpiEnhancedController 直接调 Service |
|
||
| 2 | 照片存储优化 | P1 | 当前未对接OSS/MinIO |
|
||
|
||
#### 2.8.3 数据库设计
|
||
|
||
无需新建表。V20 已创建 empi_patient_photo / empi_family_member / empi_merge_log。
|
||
|
||
---
|
||
|
||
### 2.9 合理用药增强 — 肝肾功能调量
|
||
|
||
#### 2.9.1 已有代码分析
|
||
|
||
| 层 | 文件 | 行数 | 状态 |
|
||
|----|------|:----:|------|
|
||
| Controller | RationalDrugController.java | 111 | 完整 |
|
||
| AppService | RationalDrugAppServiceImpl.java | 283 | **完整实现**:审核/批量审核/统计/趋势/配伍检查/剂量检查 |
|
||
| Entity | DrugDosageRange / DrugInteractionRule / PrescriptionAuditLog | — | 全部完整 |
|
||
|
||
**Flyway**: V2(rational_drug_system 表:drug_dosage_range 等)
|
||
|
||
#### 2.9.2 缺失功能
|
||
|
||
| # | 功能 | 优先级 | 说明 |
|
||
|---|------|:------:|------|
|
||
| 1 | 肝肾功能参数输入 | P0 | auditPrescription 当前只按 population 检查,不按肝肾功能分级 |
|
||
| 2 | 肝肾功能剂量调整规则 | P0 | 基于 eGFR/Child-Pugh 分级自动调整剂量 |
|
||
| 3 | 肾功能不全药物警示 | P1 | 特定药物在肾功能不全时自动告警 |
|
||
|
||
#### 2.9.3 业务流程
|
||
|
||
```
|
||
肝肾功能调量流程:
|
||
1. 医生开具处方 → RationalDrugController.audit
|
||
2. RationalDrugAppServiceImpl.auditPrescription:
|
||
→ 原有: 配伍禁忌检查 + population 剂量检查
|
||
→ 新增: 肝肾功能检查
|
||
a. 查询患者最近一次检验结果(eGFR / ALT / AST / Child-Pugh)
|
||
b. 根据 eGFR 分级:
|
||
- G1 (≥90): 正常剂量
|
||
- G2 (60-89): 减量25%
|
||
- G3 (30-59): 减量50%
|
||
- G4 (15-29): 减量75% 或禁用
|
||
- G5 (<15): 禁用
|
||
c. 根据 Child-Pugh 分级:
|
||
- A级: 正常剂量
|
||
- B级: 减量50%
|
||
- C级: 禁用
|
||
d. 查询 drug_dosage_range WHERE population = 'RENAL_G{level}' 或 'HEPATIC_{level}'
|
||
e. 如果无对应规则 → 生成 MANUAL 审核结果
|
||
f. 如果有规则 → 按规则调整剂量范围检查
|
||
3. 返回审核结果(含肝肾功能调整建议)
|
||
```
|
||
|
||
#### 2.9.4 数据库设计
|
||
|
||
需新增 Flyway 迁移:
|
||
|
||
```sql
|
||
-- V2026_0618_8__rationaldrug_renal_hepatic.sql
|
||
ALTER TABLE drug_dosage_range ADD COLUMN IF NOT EXISTS renal_adjustment VARCHAR(200);
|
||
ALTER TABLE drug_dosage_range ADD COLUMN IF NOT EXISTS hepatic_adjustment VARCHAR(200);
|
||
ALTER TABLE drug_dosage_range ADD COLUMN IF NOT EXISTS contraindicated_renal VARCHAR(20);
|
||
ALTER TABLE drug_dosage_range ADD COLUMN IF NOT EXISTS contraindicated_hepatic VARCHAR(20);
|
||
|
||
CREATE TABLE IF NOT EXISTS drug_renal_hepatic_rule (
|
||
id BIGINT PRIMARY KEY,
|
||
drug_code VARCHAR(50) NOT NULL,
|
||
drug_name VARCHAR(200),
|
||
renal_function_field VARCHAR(50),
|
||
renal_threshold_min DECIMAL(10,2),
|
||
renal_threshold_max DECIMAL(10,2),
|
||
renal_adjustment_type VARCHAR(20),
|
||
renal_adjustment_value DECIMAL(5,2),
|
||
hepatic_function_field VARCHAR(50),
|
||
hepatic_threshold VARCHAR(50),
|
||
hepatic_adjustment_type VARCHAR(20),
|
||
hepatic_adjustment_value DECIMAL(5,2),
|
||
enabled VARCHAR(1) DEFAULT '1',
|
||
del_flag VARCHAR(1) DEFAULT '0',
|
||
create_time TIMESTAMP,
|
||
update_time TIMESTAMP
|
||
);
|
||
```
|
||
|
||
#### 2.9.5 API接口
|
||
|
||
| 端点 | 方法 | 说明 |
|
||
|------|------|------|
|
||
| `/rationaldrug/audit` | POST | 已有,**需增强:加肝肾功能参数** |
|
||
| `/rationaldrug/batch-audit` | POST | 已有 |
|
||
| `/rationaldrug/statistics` | GET | 已有 |
|
||
| `/rationaldrug/trend` | GET | 已有 |
|
||
| `/rationaldrug/interaction/check` | POST | 已有 |
|
||
| `/rationaldrug/dosage/check` | POST | 已有 |
|
||
| `/rationaldrug/renal-hepatic/rule/page` | GET | **新增**:肝肾功能规则分页查询 |
|
||
| `/rationaldrug/renal-hepatic/rule/add` | POST | **新增**:添加规则 |
|
||
| `/rationaldrug/renal-hepatic/rule/update` | PUT | **新增**:更新规则 |
|
||
| `/rationaldrug/renal-hepatic/rule/delete/{id}` | DELETE | **新增**:删除规则 |
|
||
| `/rationaldrug/renal-hepatic/check` | POST | **新增**:独立肝肾功能检查接口 |
|
||
|
||
#### 2.9.6 前端设计
|
||
|
||
rationaldrug 模块 3 个 Vue 文件已有完整 script 逻辑。需新增"肝肾功能规则管理"页面。
|
||
|
||
---
|
||
|
||
### 2.10 传染病报告
|
||
|
||
#### 2.10.1 已有代码分析
|
||
|
||
| 层 | 文件 | 行数 | 状态 |
|
||
|----|------|:----:|------|
|
||
| Controller | EpidemicController.java | 20 | 完整(4端点) |
|
||
| AppService | EpidemicAppServiceImpl.java | 30 | **基本完整**(report / confirmReport / getReports / getStatistics) |
|
||
| Entity | EpidemicReport | — | 完整 |
|
||
|
||
**Flyway**: V9(epidemic 相关表)
|
||
|
||
#### 2.10.2 缺失功能
|
||
|
||
| # | 功能 | 优先级 | 说明 |
|
||
|---|------|:------:|------|
|
||
| 1 | 传染病分类管理 | P0 | 按法定传染病分类(甲/乙/丙)管理 |
|
||
| 2 | 病例自动筛查 | P0 | 从门诊诊断中自动筛查疑似传染病 |
|
||
| 3 | 上报CDC接口 | P1 | 对接疾控中心上报系统 |
|
||
| 4 | 统计报表 | P1 | 按病种/科室/时间段统计 |
|
||
|
||
#### 2.10.3 业务流程
|
||
|
||
```
|
||
门诊传染病报告流程:
|
||
1. 医生诊断 → clinicmanagement 模块写入诊断
|
||
2. 疑似传染病筛查(定时任务):
|
||
→ 查询今日门诊诊断 WHERE diagnosis_code IN (法定传染病编码列表)
|
||
→ 对每个疑似病例生成 EpidemicReport
|
||
→ status = 'SUSPECTED'
|
||
→ 通知防保科确认
|
||
3. 防保科确认:
|
||
→ 确认为传染病 → status = 'CONFIRMED' → 填写 cdcConfirmNo
|
||
→ 排除 → status = 'EXCLUDED'
|
||
4. 上报CDC:
|
||
→ 调用 CDC 上报接口
|
||
→ status = 'REPORTED'
|
||
5. 统计:
|
||
→ 按病种统计发病数
|
||
→ 按科室统计报告数
|
||
→ 按时间段统计趋势
|
||
```
|
||
|
||
#### 2.10.4 数据库设计
|
||
|
||
需新增 Flyway 迁移:
|
||
|
||
```sql
|
||
-- V2026_0618_9__epidemic_enhancement.sql
|
||
ALTER TABLE epidemic_report ADD COLUMN IF NOT EXISTS disease_category VARCHAR(20);
|
||
ALTER TABLE epidemic_report ADD COLUMN IF NOT EXISTS disease_code VARCHAR(50);
|
||
ALTER TABLE epidemic_report ADD COLUMN IF NOT EXISTS disease_name VARCHAR(200);
|
||
ALTER TABLE epidemic_report ADD COLUMN IF NOT EXISTS department_id BIGINT;
|
||
ALTER TABLE epidemic_report ADD COLUMN IF NOT EXISTS department_name VARCHAR(100);
|
||
ALTER TABLE epidemic_report ADD COLUMN IF NOT EXISTS doctor_id BIGINT;
|
||
ALTER TABLE epidemic_report ADD COLUMN IF NOT EXISTS doctor_name VARCHAR(100);
|
||
ALTER TABLE epidemic_report ADD COLUMN IF NOT EXISTS diagnosis_code VARCHAR(50);
|
||
ALTER TABLE epidemic_report ADD COLUMN IF NOT EXISTS diagnosis_name VARCHAR(200);
|
||
ALTER TABLE epidemic_report ADD COLUMN IF NOT EXISTS patient_phone VARCHAR(20);
|
||
ALTER TABLE epidemic_report ADD COLUMN IF NOT EXISTS patient_address VARCHAR(500);
|
||
ALTER TABLE epidemic_report ADD COLUMN IF NOT EXISTS report_to_cdc BOOLEAN DEFAULT FALSE;
|
||
ALTER TABLE epidemic_report ADD COLUMN IF NOT EXISTS cdc_report_time TIMESTAMP;
|
||
ALTER TABLE epidemic_report ADD COLUMN IF NOT EXISTS report_source VARCHAR(50);
|
||
|
||
CREATE TABLE IF NOT EXISTS epidemic_disease_config (
|
||
id BIGINT PRIMARY KEY,
|
||
disease_code VARCHAR(50) NOT NULL,
|
||
disease_name VARCHAR(200) NOT NULL,
|
||
category VARCHAR(20) NOT NULL,
|
||
report_limit_hours INTEGER DEFAULT 24,
|
||
enabled VARCHAR(1) DEFAULT '1',
|
||
del_flag VARCHAR(1) DEFAULT '0',
|
||
create_time TIMESTAMP,
|
||
update_time TIMESTAMP
|
||
);
|
||
```
|
||
|
||
#### 2.10.5 API接口
|
||
|
||
| 端点 | 方法 | 说明 |
|
||
|------|------|------|
|
||
| `/epidemic/report` | POST | 已有 |
|
||
| `/epidemic/report/confirm/{id}` | PUT | 已有 |
|
||
| `/epidemic/report/list` | GET | 已有 |
|
||
| `/epidemic/statistics` | GET | 已有 |
|
||
| `/epidemic/report/page` | GET | **新增**:分页查询 |
|
||
| `/epidemic/report/suspected` | GET | **新增**:疑似病例列表 |
|
||
| `/epidemic/report/confirm` | PUT | **新增**:确认/排除传染病 |
|
||
| `/epidemic/report/to-cdc/{id}` | POST | **新增**:上报CDC |
|
||
| `/epidemic/config/page` | GET | **新增**:传染病配置管理 |
|
||
| `/epidemic/config/add` | POST | **新增**:添加传染病配置 |
|
||
| `/epidemic/statistics/trend` | GET | **新增**:趋势统计 |
|
||
| `/epidemic/statistics/by-disease` | GET | **新增**:按病种统计 |
|
||
|
||
#### 2.10.6 前端设计
|
||
|
||
epidemic 模块前端页面需检查是否有对应 Vue 文件。如缺失需补全。
|
||
|
||
---
|
||
|
||
## 三、统计报表补全(5项)
|
||
|
||
reportmanage 模块已有 21 个 Controller + 21 个 AppService + 78 个 DTO + 21 个 Mapper,共 16663 行,非常完整。以下 5 项为缺失的统计能力。
|
||
|
||
### 3.1 质控指标自动采集
|
||
|
||
**归属**: quality 模块(见 2.2 节)
|
||
|
||
**实现方式**: 在 QualityEnhancedController 中新增 `/quality-enhanced/indicator/collect` 端点,由定时任务 `QualityAutoCollectJob` 每日凌晨调用。
|
||
|
||
**数据源**:
|
||
| 指标 | 数据源表 | 聚合方式 |
|
||
|------|---------|---------|
|
||
| 病历合格率 | emr_quality_score | COUNT(score >= 60) / COUNT(*) |
|
||
| 甲级病案率 | emr_quality_score | COUNT(grade = 'A') / COUNT(*) |
|
||
| 缺陷率 | emr_defect | COUNT(*) / encounter总数 |
|
||
| 逾期整改率 | emr_defect | COUNT(rectify_status = 'OVERDUE') / COUNT(*) |
|
||
| 处方合格率 | prescription_audit_log | COUNT(audit_result = 'PASS') / COUNT(*) |
|
||
| 抗菌药物使用率 | prescription + drug | COUNT(含抗菌药) / COUNT(*) |
|
||
|
||
### 3.2 DRG/DIP 分析
|
||
|
||
**归属**: reportmanage 模块
|
||
|
||
**已有基础**: V28 创建了 `mr_drg_grouping` 表
|
||
|
||
**新增 Controller**: `DrgDipAnalysisController.java`
|
||
|
||
**业务逻辑**:
|
||
```
|
||
DRG/DIP分析流程:
|
||
1. 从 mr_drg_grouping 表读取分组数据
|
||
2. 按 DRG 组统计:
|
||
- 入组病例数
|
||
- 平均住院日
|
||
- 平均费用
|
||
- CMI(病例组合指数)
|
||
- 费用消耗指数
|
||
3. 按科室统计:
|
||
- 各科室 DRG 分组分布
|
||
- 各科室 CMI 值
|
||
- 权重RW分布
|
||
4. 异常分析:
|
||
- 高倍率病例(实际费用 / 标准费用 > 2)
|
||
- 低倍率病例(实际费用 / 标准费用 < 0.5)
|
||
- 入组失败病例
|
||
5. 趋势分析: 按月统计 CMI / 费用消耗指数变化
|
||
```
|
||
|
||
**数据库**:
|
||
|
||
```sql
|
||
-- V2026_0618_10__drg_dip_analysis.sql (如V28已创建mr_drg_grouping则无需新建)
|
||
-- 确认 mr_drg_grouping 表字段:
|
||
-- id, patient_id, encounter_id, drg_code, drg_name, dip_code, dip_name,
|
||
-- rw (权重), cmi, actual_cost, standard_cost, los (住院天数),
|
||
-- standard_los, cost_ratio, los_ratio, group_status, create_time
|
||
|
||
CREATE TABLE IF NOT EXISTS mr_drg_analysis_summary (
|
||
id BIGINT PRIMARY KEY,
|
||
stat_period VARCHAR(20) NOT NULL,
|
||
department_id BIGINT,
|
||
department_name VARCHAR(100),
|
||
drg_code VARCHAR(50),
|
||
drg_name VARCHAR(200),
|
||
case_count INTEGER DEFAULT 0,
|
||
avg_cost DECIMAL(12,2),
|
||
avg_los DECIMAL(5,1),
|
||
avg_rw DECIMAL(5,3),
|
||
cost_ratio_avg DECIMAL(5,2),
|
||
los_ratio_avg DECIMAL(5,2),
|
||
high_ratio_count INTEGER DEFAULT 0,
|
||
low_ratio_count INTEGER DEFAULT 0,
|
||
create_time TIMESTAMP,
|
||
update_time TIMESTAMP,
|
||
del_flag VARCHAR(1) DEFAULT '0'
|
||
);
|
||
```
|
||
|
||
**API接口**:
|
||
|
||
| 端点 | 方法 | 说明 |
|
||
|------|------|------|
|
||
| `/report/drg-dip/summary` | GET | DRG/DIP综合分析概览 |
|
||
| `/report/drg-dip/by-department` | GET | 按科室分析 |
|
||
| `/report/drg-dip/by-drg` | GET | 按DRG组分析 |
|
||
| `/report/drg-dip/abnormal` | GET | 异常病例分析 |
|
||
| `/report/drg-dip/trend` | GET | 趋势分析 |
|
||
| `/report/drg-dip/export` | GET | 导出分析报告 |
|
||
|
||
**前端页面**: `reportmanage/drgAnalysis/index.vue`
|
||
|
||
### 3.3 经营分析
|
||
|
||
**归属**: reportmanage 模块
|
||
|
||
**已有基础**: V23 创建了 `business_analytics` 表,BusinessAnalyticsController 已有 page/add/summary
|
||
|
||
**新增能力**: 趋势分析、科室对比、收入结构分析
|
||
|
||
**新增 Controller 方法**(在 BusinessAnalyticsController 中追加):
|
||
|
||
```
|
||
经营分析增强:
|
||
1. 趋势分析: 按月统计收入/成本/利润/患者数变化
|
||
2. 科室对比: 各科室收入排名、人均创收、成本占比
|
||
3. 收入结构: 门诊/住院/检查/检验/药品/手术 各占比
|
||
4. 同比环比: 与去年同期/上月对比
|
||
```
|
||
|
||
**API接口**(在 BusinessAnalyticsController 追加):
|
||
|
||
| 端点 | 方法 | 说明 |
|
||
|------|------|------|
|
||
| `/business-analytics/trend` | GET | 收入趋势分析 |
|
||
| `/business-analytics/department-compare` | GET | 科室对比分析 |
|
||
| `/business-analytics/revenue-structure` | GET | 收入结构分析 |
|
||
| `/business-analytics/yoy-comparison` | GET | 同比环比分析 |
|
||
| `/business-analytics/export` | GET | 导出经营分析报告 |
|
||
|
||
### 3.4 数据导出
|
||
|
||
**归属**: reportmanage 模块
|
||
|
||
**已有基础**: ReportController 中已有 CsvFillerUtil / ExcelFillerUtil 工具类
|
||
|
||
**新增通用导出能力**:
|
||
|
||
```
|
||
数据导出流程:
|
||
1. 前端选择报表类型 + 筛选条件 + 导出格式(Excel/CSV/PDF)
|
||
2. 调用 /report/export 接口
|
||
3. 后端根据报表类型查询数据
|
||
4. 使用 ExcelFillerUtil/CsvFillerUtil 生成文件
|
||
5. 返回文件下载流
|
||
```
|
||
|
||
**新增 Controller**: `DataExportController.java`
|
||
|
||
**API接口**:
|
||
|
||
| 端点 | 方法 | 说明 |
|
||
|------|------|------|
|
||
| `/report/export/excel` | POST | 通用Excel导出 |
|
||
| `/report/export/csv` | POST | 通用CSV导出 |
|
||
| `/report/export/pdf` | POST | 通用PDF导出 |
|
||
| `/report/export/template/{type}` | GET | 下载导出模板 |
|
||
| `/report/export/history` | GET | 导出历史记录 |
|
||
|
||
**数据库**:
|
||
|
||
```sql
|
||
-- V2026_0618_11__data_export.sql
|
||
CREATE TABLE IF NOT EXISTS sys_export_record (
|
||
id BIGINT PRIMARY KEY,
|
||
export_type VARCHAR(50) NOT NULL,
|
||
export_format VARCHAR(20) NOT NULL,
|
||
filter_params JSONB,
|
||
file_path VARCHAR(500),
|
||
file_name VARCHAR(200),
|
||
file_size BIGINT,
|
||
export_status VARCHAR(20) DEFAULT 'PENDING',
|
||
export_by VARCHAR(100),
|
||
export_time TIMESTAMP,
|
||
download_count INTEGER DEFAULT 0,
|
||
del_flag VARCHAR(1) DEFAULT '0',
|
||
create_time TIMESTAMP,
|
||
update_time TIMESTAMP
|
||
);
|
||
```
|
||
|
||
### 3.5 可视化仪表盘
|
||
|
||
**归属**: reportmanage 模块
|
||
|
||
**已有基础**: DashboardController 已有,V20 创建了 `sys_dashboard_config` 表
|
||
|
||
**新增能力**: 多仪表盘模板 + 数据实时刷新 + 自定义布局
|
||
|
||
**业务逻辑**:
|
||
|
||
```
|
||
仪表盘配置流程:
|
||
1. 预置仪表盘模板:
|
||
- 院长驾驶舱: 收入/患者数/床位使用率/手术量/药占比
|
||
- 科主任驾驶舱: 科室收入/病历质量/处方合格率/患者满意度
|
||
- 护理驾驶舱: 护理质量/患者跌倒率/压疮发生率/满意度
|
||
- 质控驾驶舱: 病历合格率/缺陷率/整改率/DRG指标
|
||
2. 用户可自定义:
|
||
- 选择展示哪些指标卡片
|
||
- 调整卡片位置和大小
|
||
- 设置刷新频率
|
||
3. 数据刷新:
|
||
- 实时指标: 每5分钟刷新(当前住院人数、今日门诊量)
|
||
- 准实时指标: 每小时刷新(今日收入、处方合格率)
|
||
- 统计指标: 每日刷新(DRG指标、质控指标)
|
||
```
|
||
|
||
**API接口**(在 DashboardController 追加):
|
||
|
||
| 端点 | 方法 | 说明 |
|
||
|------|------|------|
|
||
| `/dashboard/config` | GET | 获取仪表盘配置 |
|
||
| `/dashboard/config/save` | POST | 保存仪表盘配置 |
|
||
| `/dashboard/data/{template}` | GET | 获取仪表盘数据 |
|
||
| `/dashboard/data/realtime` | GET | 获取实时指标数据 |
|
||
| `/dashboard/card/{cardType}` | GET | 获取单个卡片数据 |
|
||
|
||
---
|
||
|
||
## 四、公共基础设施
|
||
|
||
### 4.1 定时任务汇总
|
||
|
||
| 任务 | 模块 | 频率 | 说明 |
|
||
|------|------|------|------|
|
||
| QualityAutoCollectJob | quality | 每日 02:00 | 质控指标自动采集 |
|
||
| DrugTraceAlertJob | drugtrace | 每日 03:00 | 药品近效期/过期预警 |
|
||
| CssdExpiryCheckJob | cssd | 每日 04:00 | 器械包灭菌有效期检查 |
|
||
| FollowupPlanAutoGenerateJob | followup | 每日 01:00 | 随访计划自动生成 |
|
||
| FollowupReminderJob | followup | 每日 08:00 | 随访任务提醒 |
|
||
| EpidemicScreeningJob | epidemic | 每日 06:00 | 传染病疑似病例筛查 |
|
||
|
||
### 4.2 枚举补充
|
||
|
||
需新增的枚举:
|
||
|
||
| 枚举类 | 位置 | 值 |
|
||
|--------|------|-----|
|
||
| EmpiDuplicateLevel | common/enums/ | HIGH / MEDIUM / LOW / NONE |
|
||
| CssdStepType | common/enums/ | RECYCLE / WASH / DISINFECT / PACK / STERILIZE / STORE / DISTRIBUTE |
|
||
| QualityCheckType | common/enums/ | RUNTIME / TERMINAL |
|
||
| DrugAlertType | common/enums/ | EXPIRING_SOON / EXPIRED / ABNORMAL_SCAN / BATCH_RECALL |
|
||
| RenalFunctionGrade | common/enums/ | G1 / G2 / G3 / G4 / G5 |
|
||
| HepaticFunctionGrade | common/enums/ | A / B / C |
|
||
| EpidemicDiseaseCategory | common/enums/ | CATEGORY_A / CATEGORY_B / CATEGORY_C |
|
||
| ReconstructionTaskStatus | common/enums/ | PENDING / PROCESSING / COMPLETED / FAILED / CANCELLED |
|
||
| ExportFormat | common/enums/ | EXCEL / CSV / PDF |
|
||
| DashboardTemplate | common/enums/ | DEAN / DIRECTOR / NURSING / QUALITY |
|
||
|
||
---
|
||
|
||
## 五、Flyway 迁移汇总
|
||
|
||
| 版本 | 文件名 | 模块 | 内容 |
|
||
|------|--------|------|------|
|
||
| V2026_0618_1 | V2026_0618_1__empi_duplicate_detection.sql | empi | name_pinyin / name_initials / last_sync_time / sync_status |
|
||
| V2026_0618_2 | V2026_0618_2__quality_enhancement.sql | quality | indicator数据源字段 / score的check_items |
|
||
| V2026_0618_3 | V2026_0618_3__followup_enhancement.sql | followup | auto_generated / reminder / symptoms |
|
||
| V2026_0618_4 | V2026_0618_4__drugtrace_enhancement.sql | drugtrace | current_quantity / location / batch关联 |
|
||
| V2026_0618_5 | V2026_0618_5__cssd_enhancement.sql | cssd | validity_days / tray_ids / photo |
|
||
| V2026_0618_6 | V2026_0618_6__preop_enhancement.sql | preopmanage | pdf_url / sign_order |
|
||
| V2026_0618_7 | V2026_0618_7__reconstruction_enhancement.sql | reconstruction | callback / priority / model_file |
|
||
| V2026_0618_8 | V2026_0618_8__rationaldrug_renal_hepatic.sql | rationaldrug | 肝肾功能规则表 + 剂量调整字段 |
|
||
| V2026_0618_9 | V2026_0618_9__epidemic_enhancement.sql | epidemic | 传染病分类 + 配置表 |
|
||
| V2026_0618_10 | V2026_0618_10__drg_dip_analysis.sql | reportmanage | DRG分析汇总表 |
|
||
| V2026_0618_11 | V2026_0618_11__data_export.sql | reportmanage | 导出记录表 |
|
||
| V2026_0618_12 | V2026_0618_12__dashboard_enhancement.sql | reportmanage | 仪表盘布局配置 |
|
||
|
||
---
|
||
|
||
## 六、开发优先级排序
|
||
|
||
### Sprint 1(P0 — 核心补全)
|
||
|
||
| 优先级 | 模块 | 任务 |
|
||
|:------:|------|------|
|
||
| 1 | quality | 修复 executeTerminalCheck / getCompletionRate 硬编码 |
|
||
| 2 | cssd | 修复 scanTrace statusFlow Map bug |
|
||
| 3 | reconstruction | 修复 addTask 模拟桩 → 真实异步 |
|
||
| 4 | empi | 实现重复检测算法 |
|
||
| 5 | rationaldrug | 实现肝肾功能调量核心逻辑 |
|
||
| 6 | epidemic | 实现传染病分类管理 + 病例筛查 |
|
||
|
||
### Sprint 2(P1 — 架构补全)
|
||
|
||
| 优先级 | 模块 | 任务 |
|
||
|:------:|------|------|
|
||
| 7 | followup | AppService 层提取 + 自动计划生成 |
|
||
| 8 | drugtrace | AppService 层提取 + 自动预警 |
|
||
| 9 | cssd | AppService 层提取 + 灭菌批次联动 |
|
||
| 10 | preopmanage | AppService 层提取 + 签名自动流转 |
|
||
| 11 | reconstruction | AppService 层提取 + 状态回调 |
|
||
| 12 | empienhanced | AppService 层提取 |
|
||
|
||
### Sprint 3(P2 — 报表增强)
|
||
|
||
| 优先级 | 模块 | 任务 |
|
||
|:------:|------|------|
|
||
| 13 | reportmanage | DRG/DIP 分析 Controller + Service |
|
||
| 14 | reportmanage | 经营分析增强(趋势/对比/结构) |
|
||
| 15 | reportmanage | 通用数据导出 |
|
||
| 16 | reportmanage | 可视化仪表盘增强 |
|
||
| 17 | quality | 质控指标自动采集定时任务 |
|
||
|
||
### Sprint 4(P3 — 体验优化)
|
||
|
||
| 优先级 | 模块 | 任务 |
|
||
|:------:|------|------|
|
||
| 18 | 所有模块 | 前端页面补全(如Vue文件确实缺失) |
|
||
| 19 | 所有模块 | 前端联调 + E2E测试 |
|
||
| 20 | 公共 | 枚举补充 + 定时任务注册 |
|
||
|
||
---
|
||
|
||
## 七、关键设计决策
|
||
|
||
| 决策 | 选择 | 理由 |
|
||
|------|------|------|
|
||
| AppService层提取策略 | 保持Controller端点不变,仅提取业务逻辑到AppService | 遵循铁律7(禁止修改已有公开方法签名) |
|
||
| 数据库新增字段 | 全部使用 ALTER TABLE ADD COLUMN(IF NOT EXISTS) | 遵循铁律18(禁止破坏原有功能) |
|
||
| 定时任务框架 | 使用 Spring @Scheduled | 项目已有此模式,无需引入新依赖 |
|
||
| 导出格式 | Excel(POI) + CSV + PDF(iText) | 项目已有 ExcelFillerUtil/CsvFillerUtil |
|
||
| 肝肾功能数据来源 | 从检验模块(lab)查询最近检验结果 | 遵循铁律20(数据来源必须验证) |
|
||
| 3D重建异步处理 | 保留模拟实现,增加 PROCESSING 中间状态 | 实际对接需第三方服务,Phase 3 先完成框架 |
|
||
|
||
---
|
||
|
||
> 📅 文档完成时间: 2026-06-17 | 版本: v1.0
|