Files
his/MD/design/PHASE3_FILL_DESIGN.md
chenqi 575f5d6c32 fix(database): 修复数据库字典重复和表结构缺失问题
- 删除手术状态下拉框的重复字典数据,保留每组中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字段以完善审计信息
- 更新院感管理和评审保障模块的设计文档,明确各模块实现状态和缺失功能
2026-06-17 11:46:56 +08:00

1178 lines
46 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 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_1empi_person + empi_person_id_mapping、V20empi_patient_photo + empi_family_member + empi_merge_log、V2026_0616_2fix 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 硬编码 PASSgetCompletionRate 返回全零 |
| Entity | QualityCoreIndicator / QualityOrderStatistics / BusinessAnalytics / EmrDefect / EmrQualityScore | 106 | 全部完整 |
| Service | 3个IServiceIndicator/OrderStats/Analytics | 21 | 空壳 |
| Service | EmrDefect / EmrQualityScore **缺失Service层** | — | 直接通过Mapper访问 |
**Flyway**: V11emr_quality_score + emr_defect、V20quality_core_indicator + quality_order_statistics、V23business_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**: V32followup_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**: V36drug_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**: V31cssd_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 逻辑有bugMap.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**: V14sys_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**: V31reconstruction_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 EmpiEnhancedEMPI增强
#### 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**: V2rational_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**: V9epidemic 相关表)
#### 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 1P0 — 核心补全)
| 优先级 | 模块 | 任务 |
|:------:|------|------|
| 1 | quality | 修复 executeTerminalCheck / getCompletionRate 硬编码 |
| 2 | cssd | 修复 scanTrace statusFlow Map bug |
| 3 | reconstruction | 修复 addTask 模拟桩 → 真实异步 |
| 4 | empi | 实现重复检测算法 |
| 5 | rationaldrug | 实现肝肾功能调量核心逻辑 |
| 6 | epidemic | 实现传染病分类管理 + 病例筛查 |
### Sprint 2P1 — 架构补全)
| 优先级 | 模块 | 任务 |
|:------:|------|------|
| 7 | followup | AppService 层提取 + 自动计划生成 |
| 8 | drugtrace | AppService 层提取 + 自动预警 |
| 9 | cssd | AppService 层提取 + 灭菌批次联动 |
| 10 | preopmanage | AppService 层提取 + 签名自动流转 |
| 11 | reconstruction | AppService 层提取 + 状态回调 |
| 12 | empienhanced | AppService 层提取 |
### Sprint 3P2 — 报表增强)
| 优先级 | 模块 | 任务 |
|:------:|------|------|
| 13 | reportmanage | DRG/DIP 分析 Controller + Service |
| 14 | reportmanage | 经营分析增强(趋势/对比/结构) |
| 15 | reportmanage | 通用数据导出 |
| 16 | reportmanage | 可视化仪表盘增强 |
| 17 | quality | 质控指标自动采集定时任务 |
### Sprint 4P3 — 体验优化)
| 优先级 | 模块 | 任务 |
|:------:|------|------|
| 18 | 所有模块 | 前端页面补全如Vue文件确实缺失 |
| 19 | 所有模块 | 前端联调 + E2E测试 |
| 20 | 公共 | 枚举补充 + 定时任务注册 |
---
## 七、关键设计决策
| 决策 | 选择 | 理由 |
|------|------|------|
| AppService层提取策略 | 保持Controller端点不变仅提取业务逻辑到AppService | 遵循铁律7禁止修改已有公开方法签名 |
| 数据库新增字段 | 全部使用 ALTER TABLE ADD COLUMNIF NOT EXISTS | 遵循铁律18禁止破坏原有功能 |
| 定时任务框架 | 使用 Spring @Scheduled | 项目已有此模式,无需引入新依赖 |
| 导出格式 | Excel(POI) + CSV + PDF(iText) | 项目已有 ExcelFillerUtil/CsvFillerUtil |
| 肝肾功能数据来源 | 从检验模块(lab)查询最近检验结果 | 遵循铁律20数据来源必须验证 |
| 3D重建异步处理 | 保留模拟实现,增加 PROCESSING 中间状态 | 实际对接需第三方服务Phase 3 先完成框架 |
---
> 📅 文档完成时间: 2026-06-17 | 版本: v1.0