docs: 统一文档管理规范,合并docs/到MD/目录

- 创建MD/目录结构(architecture/development/standards/specs/bugs/guides/upgrade)
- 制定文档命名规范(大写英文+下划线)
- 制定文档格式规范(元数据块、结构模板)
- 合并27个文档到MD/目录,按类别分类
- 删除旧的docs/目录
- 更新AGENTS.md铁律#5: 文档统一管理

命名规范:
- 架构设计: ARCH_<模块>_<描述>.md
- 开发计划: PLAN_<类型>_<版本>.md
- 国家标准: STD_<标准名称>.md
- 技术规范: SPEC_<类型>_<描述>.md
- Bug修复: BUG_<编号>_<描述>.md
- 使用指南: GUIDE_<主题>.md
- 升级记录: UPGRADE_<组件>_<类型>.md
This commit is contained in:
2026-06-06 09:06:21 +08:00
parent 86c82286c6
commit d8427f788e
28 changed files with 224 additions and 0 deletions

View File

@@ -1,207 +0,0 @@
# HealthLink-HIS 后端组件升级方案
> **编制日期**: 2026-06-04
> **基线**: Spring Boot 2.5.15 + MyBatis Plus 3.5.5
> **目标**: 升级安全漏洞组件 + 小版本迭代,不做大版本迁移
---
## 升级原则
1. **安全优先** — BouncyCastle 等有漏洞的组件必须升
2. **小版本优先** — 只升 patch/minor不升 major
3. **逐个验证** — 每升一个组件跑 `mvn clean package -DskipTests` + 启动测试
4. **不动核心** — Spring Boot 2.5、MyBatis Plus 3.5 暂不升
---
## Phase 1: 安全修复(必做)
### 1.1 BouncyCastle 1.69 → 1.80 🔴
| 项 | 内容 |
|---|---|
| **风险等级** | 🔴 高 — 1.69 有 CVE 安全漏洞 |
| **变更文件** | `healthlink-his-server/pom.xml` |
| **当前值** | `<bcprov-jdk15on.version>1.69</bcprov-jdk15on.version>` |
| **操作** | 删除 jdk15on改用 jdk18on |
| **新增依赖** | `org.bouncycastle:bcprov-jdk18on:1.80`<br>`org.bouncycastle:bcpkix-jdk18on:1.80` |
| **代码影响** | 搜索 `rg "bcprov\|bcpkix" --type java` — 当前无直接引用,仅通过依赖传递 |
| **验证** | `mvn compile` + 启动后检查登录/token 签发 |
| **回滚** | 改回 `1.69` |
**具体操作:**
```xml
<!-- 旧 -->
<bcprov-jdk15on.version>1.69</bcprov-jdk15on.version>
<!-- 新 -->
<!-- 删除 bcprov-jdk15on.version 属性 -->
<!-- 在 dependencyManagement 中添加 -->
<dependency>
<groupId>org.bouncycastle</groupId>
<artifactId>bcprov-jdk18on</artifactId>
<version>1.80</version>
</dependency>
<dependency>
<groupId>org.bouncycastle</groupId>
<artifactId>bcpkix-jdk18on</artifactId>
<version>1.80</version>
</dependency>
```
---
## Phase 2: 连接池 & 工具库升级
### 2.1 Druid 1.2.27 → 1.2.28 🟢
| 项 | 内容 |
|---|---|
| **风险** | 🟢 低 — patch 版本 |
| **变更** | `<druid.version>1.2.27</druid.version>``1.2.28` |
| **代码影响** | `DruidProperties.java` — API 无变化 |
| **验证** | 启动后检查 Druid 监控页 `/druid/` |
### 2.2 Fastjson2 2.0.58 → 2.0.61 🟢
| 项 | 内容 |
|---|---|
| **风险** | 🟢 低 — patch 版本 |
| **变更** | `<fastjson2.version>2.0.58</fastjson2.version>``2.0.61` |
| **代码影响** | 无直接引用0 个文件),仅依赖传递 |
| **验证** | `mvn compile` |
### 2.3 Hutool 5.3.8 → 5.8.x 🟢
| 项 | 内容 |
|---|---|
| **风险** | 🟢 低 — minor 版本 |
| **变更** | `<hutool-all.version>5.3.8</hutool-all.version>``5.8.35` |
| **代码影响** | `rg "cn.hutool" --type java` — 约 10+ 文件使用 `ObjectUtil``StrUtil` |
| **验证** | 检查使用 Hutool 的业务模块(预约管理等) |
| **注意** | 5.3.8 → 5.8 跨了多个 minor需检查 deprecated API |
---
## Phase 3: 监控 & IO 升级
### 3.1 OSHI 6.6.5 → 6.10.0 🟢
| 项 | 内容 |
|---|---|
| **风险** | 🟢 低 — minor 版本 |
| **变更** | `<oshi.version>6.6.5</oshi.version>``6.10.0` |
| **代码影响** | `Server.java` — 使用 `SystemInfo``CentralProcessor``GlobalMemory` |
| **验证** | 系统监控页面正常显示 CPU/内存/磁盘信息 |
| **注意** | OSHI 6.10 API 基本兼容 6.6 |
### 3.2 Commons IO 2.13.0 → 2.21.0 🟢
| 项 | 内容 |
|---|---|
| **风险** | 🟢 低 — minor 版本 |
| **变更** | `<commons.io.version>2.13.0</commons.io.version>``2.21.0` |
| **代码影响** | 无直接引用 |
| **验证** | `mvn compile` |
### 3.3 PostgreSQL Driver 42.2.27 → 42.7.x 🟢
| 项 | 内容 |
|---|---|
| **风险** | 🟢 低 |
| **变更** | `<postgresql.version>42.2.27</postgresql.version>``42.7.4` |
| **代码影响** | 无,仅 JDBC 驱动 |
| **验证** | 启动后数据库连接正常 |
---
## Phase 4: 文档 & 分页
### 4.1 Swagger → SpringDoc 1.8.x 🟡
| 项 | 内容 |
|---|---|
| **风险** | 🟡 中 — 不同库 |
| **当前** | `<swagger.version>3.0.0</swagger.version>`springfox |
| **目标** | springdoc-openapi 1.8.6 |
| **操作** | 替换 springfox 依赖为 springdoc |
| **代码影响** | `rg "swagger\|ApiModel\|ApiOperation" --type java` — 需改注解 |
| **建议** | ⚠️ 暂不升 — 注解改造工作量大 |
### 4.2 PageHelper 1.4.7 → 1.4.7 保持 🟢
| 项 | 内容 |
|---|---|
| **建议** | 保持当前版本 — 1.4.7 稳定且够用 |
| **原因** | 升级到 2.x 需配合 Spring Boot 4 |
---
## Phase 5: PDF & 签名
### 5.1 itextpdf 5.5.12 → 5.5.13.4 🟢
| 项 | 内容 |
|---|---|
| **风险** | 🟢 低 — patch 版本 |
| **变更** | `<itextpdf.version>5.5.12</itextpdf.version>``5.5.13.4` |
| **代码影响** | PDF 生成相关 |
### 5.2 Kernel 7.1.2 → 7.1.2 保持 🟢
| 项 | 内容 |
|---|---|
| **建议** | 保持 — 已是较新版本 |
---
## 执行计划
```
Day 1: Phase 1 (BouncyCastle) + Phase 2 (Druid/Fastjson2/Hutool)
→ mvn clean package -DskipTests
→ 启动测试
Day 2: Phase 3 (OSHI/PostgreSQL/Commons IO)
→ mvn clean package -DskipTests
→ 启动测试 + 系统监控验证
Day 3: Phase 5 (itextpdf)
→ mvn clean package -DskipTests
→ PDF 功能验证
```
---
## 版本对照表
| 组件 | 当前 | 升级到 | 类型 | 状态 |
|---|---|---|---|---|
| Spring Boot | 2.5.15 | 保持 | major | 🔒 暂不动 |
| MyBatis Plus | 3.5.5 | 保持 | major | 🔒 暂不动 |
| PageHelper | 1.4.7 | 保持 | major | 🔒 暂不动 |
| **BouncyCastle** | **1.69** | **1.80** | major | 🔴 **必做** |
| **Druid** | **1.2.27** | **1.2.28** | patch | 🟢 **可做** |
| **Fastjson2** | **2.0.58** | **2.0.61** | patch | 🟢 **可做** |
| **Hutool** | **5.3.8** | **5.8.35** | minor | 🟢 **可做** |
| **OSHI** | **6.6.5** | **6.10.0** | minor | 🟢 **可做** |
| **Commons IO** | **2.13.0** | **2.21.0** | minor | 🟢 **可做** |
| **PostgreSQL** | **42.2.27** | **42.7.4** | minor | 🟢 **可做** |
| **itextpdf** | **5.5.12** | **5.5.13.4** | patch | 🟢 **可做** |
| Swagger/SpringDoc | 3.0.0 | 1.8.6 | 不同库 | ⚠️ 暂不动 |
---
## 验证清单
每次升级后检查:
- [ ] `mvn clean package -DskipTests` 编译通过
- [ ] 启动无报错
- [ ] 登录功能正常
- [ ] Druid 监控页 `/druid/` 可访问
- [ ] 系统监控页正常OSHI 升级时)
- [ ] PDF 导出正常itextpdf 升级时)
- [ ] 数据库连接正常

View File

@@ -1,58 +0,0 @@
# 三甲医院 HIS 系统 V2 开发计划
> 开发模式: TDD (Test-Driven Development)
> 每个功能: 先写接口测试 → 开发后端 → 开发前端 → 集成测试
## 开发顺序
### Sprint 1: 门诊挂号+收费 (5天)
1. 挂号管理 - 号源/预约/退号/多身份
2. 门诊收费 - 收费/退费/发票/日结
3. 接口测试: 20个API测试用例
4. 前端: 挂号窗口+收费窗口完整界面
### Sprint 2: 门诊医生工作站 (5天)
1. 候诊队列管理
2. 病历书写(结构化)
3. 处方开具(西药/中成药/中药)
4. 检验检查申请
5. 接口测试: 25个API测试用例
6. 前端: 医生工作站完整界面
### Sprint 3: 住院管理 (5天)
1. 入院登记+床位管理
2. 住院医嘱(长期/临时)
3. 护士执行+体温单
4. 出院结算
5. 接口测试: 30个API测试用例
6. 前端: 护士站+医生站完整界面
### Sprint 4: 药品管理 (5天)
1. 药品目录+库存
2. 采购入库+验收
3. 调拨+盘点+报损
4. 毒麻药品管理
5. 接口测试: 25个API测试用例
6. 前端: 药房管理完整界面
### Sprint 5: 检验检查 (3天)
1. LIS检验流程
2. 危急值管理
3. 接口测试: 15个API测试用例
4. 前端: 检验工作站
### Sprint 6: 统计报表+质控 (2天)
1. 门诊/住院统计
2. 药品统计
3. 质控指标
4. 接口测试: 10个API测试用例
5. 前端: 报表中心
## 测试用例设计原则
每个API必须有:
1. 正常流程测试
2. 边界条件测试
3. 异常处理测试
4. 权限控制测试
5. 数据一致性测试

View File

@@ -1,326 +0,0 @@
# Flyway 数据库迁移使用指南
> **项目**: HealthLink-HIS 医院管理系统
> **数据库**: PostgreSQL 192.168.110.252:15432 (schema: hisdev)
> **Flyway 版本**: 8.5.x (Spring Boot 2.7 管理)
> **编制日期**: 2026-06-04
---
## 一、当前配置
| 配置项 | 值 | 说明 |
|---|---|---|
| `spring.flyway.enabled` | `true` | 启用 Flyway |
| `spring.flyway.baseline-on-migrate` | `true` | 首次启用时对现有表建基线 |
| `spring.flyway.baseline-version` | `0` | 基线版本号 |
| `spring.flyway.locations` | `classpath:db/migration` | 迁移文件目录 |
| `spring.flyway.validate-on-migrate` | `true` | 执行前校验 |
**迁移文件目录:**
```
healthlink-his-server/healthlink-his-application/src/main/resources/db/migration/
```
**当前状态:**
```
V0 << Flyway Baseline >> (自动基线,覆盖现有所有表)
V1 baseline_marker (空标记文件)
```
---
## 二、文件命名规范
```
V{版本号}__{描述}.sql
```
| 规则 | 示例 | 说明 |
|---|---|---|
| 版本号必须递增 | `V2`, `V3`, `V4` | 整数,不可重复 |
| 双下划线分隔 | `V2__add_column.sql` | 单下划线会被当作版本号一部分 |
| 描述用下划线连接 | `V2__add_user_avatar.sql` | 不要用空格或中文 |
| 大小写敏感 | `V2__Add_Column.sql` | 建议全小写 |
**✅ 正确示例:**
```
V2__add_practitioner_avatar.sql
V3__create_nurse_station_table.sql
V4__modify_encounter_diagnosis_index.sql
V5__add_yb_catalog_fields.sql
```
**❌ 错误示例:**
```
v2__add_column.sql # 版本号必须大写 V
V2 add column.sql # 缺少双下划线
V2__Add Column.sql # 描述中有空格
V2.1__add_column.sql # 不支持小数版本号
```
---
## 三、新增表(完整示例)
### 场景:新建一个「手术排班统计」表
**Step 1创建迁移文件**
```sql
-- 文件db/migration/V2__create_surgery_schedule_stats.sql
CREATE TABLE IF NOT EXISTS surgery_schedule_stats (
id BIGINT PRIMARY KEY,
schedule_id BIGINT NOT NULL COMMENT '排程ID',
doctor_code VARCHAR(64) COMMENT '医生编码',
surgery_count INT DEFAULT 0 COMMENT '手术数量',
total_duration INT DEFAULT 0 COMMENT '总时长(分钟)',
tenant_id INT DEFAULT 1 COMMENT '租户ID',
create_by VARCHAR(64) DEFAULT 'system' COMMENT '创建人',
create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
update_by VARCHAR(64) COMMENT '更新人',
update_time TIMESTAMP COMMENT '更新时间',
valid_flag INT DEFAULT 1 COMMENT '有效标志 1=有效 0=无效'
);
COMMENT ON TABLE surgery_schedule_stats IS '手术排班统计表';
CREATE INDEX idx_surgery_stats_schedule ON surgery_schedule_stats(schedule_id);
CREATE INDEX idx_surgery_stats_tenant ON surgery_schedule_stats(tenant_id);
```
**Step 2启动应用**
```bash
cd healthlink-his-server
mvn clean package -DskipTests
java -jar healthlink-his-application/target/healthlink-his-application.jar --spring.profiles.active=dev --server.port=18082
```
**Step 3Flyway 自动执行**
启动日志中会看到:
```
Flyway 迁移完成,执行了 1 个迁移
```
数据库中 `flyway_schema_history` 表新增一条记录:
```
installed_rank | version | description | type | success
---------------+---------+--------------------------+------+---------
3 | 2 | create surgery schedule.. | SQL | t
```
---
## 四、修改表结构ALTER
### 场景:给 practitioners 表加一个 phone 字段
```sql
-- 文件db/migration/V3__add_practitioner_phone.sql
-- PostgreSQL
ALTER TABLE practitioner ADD COLUMN IF NOT EXISTS phone VARCHAR(32) COMMENT '联系电话';
```
### 场景:给表加索引
```sql
-- 文件db/migration/V4__add_encounter_index.sql
CREATE INDEX IF NOT EXISTS idx_encounter_patient ON adm_encounter(patient_id);
CREATE INDEX IF NOT EXISTS idx_encounter_tenant ON adm_encounter(tenant_id);
```
### 场景:修改字段类型
```sql
-- 文件db/migration/V5__extend_charge_item_code.sql
-- PostgreSQL: 修改 varchar 长度
ALTER TABLE adm_charge_item ALTER COLUMN charge_item_code TYPE VARCHAR(128);
```
---
## 五、多租户表迁移
项目有 50+ 张多租户表(`tenant_id` 字段),新增的多租户表需要:
```sql
-- 文件db/migration/V6__create_clinic_referral_table.sql
CREATE TABLE IF NOT EXISTS clinic_referral (
id BIGINT PRIMARY KEY,
encounter_id BIGINT NOT NULL,
referral_reason TEXT,
tenant_id INT DEFAULT 1,
create_by VARCHAR(64) DEFAULT 'system',
create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
valid_flag INT DEFAULT 1
);
COMMENT ON TABLE clinic_referral IS '转诊记录表';
```
然后在 `MybatisPlusConfig.java``TENANT_TABLES` 集合中添加表名:
```java
private static final Set<String> TENANT_TABLES = new HashSet<>(Arrays.asList(
// ... 现有表 ...
"clinic_referral" // 新增
));
```
---
## 六、开发规范
### 必须遵守
| 规则 | 原因 |
|---|---|
| **不要修改已执行的迁移文件** | Flyway 会校验 checksum修改后启动报错 |
| **版本号只能递增** | 不能回退版本号 |
| **每次只改一个表** | 方便回滚和排查 |
| **使用 `IF NOT EXISTS`** | 防止重复执行报错 |
| **迁移文件加入 Git** | 全团队共享迁移历史 |
### 推荐做法
| 做法 | 说明 |
|---|---|
| 先在测试环境验证 | 生产部署前确认迁移无误 |
| 一个迁移文件改一张表 | 便于追踪和回滚 |
| 文件名描述清晰 | `V2__add_yb_catalog_drug_name.sql``V2__update.sql` 好 |
| DDL 和 DML 分开 | 建表用 `V2__create_xxx.sql`,数据初始化用 `V3__init_xxx_data.sql` |
---
## 七、回滚方案
Flyway **不支持自动回滚**,需要手动处理:
### 情况 1迁移刚执行还没提交代码
```bash
# 1. 删除 flyway_schema_history 中的记录
PGPASSWORD=Jchl1528 psql -h 192.168.110.252 -p 15432 -U postgresql -d postgresql \
-c "SET search_path TO hisdev; DELETE FROM flyway_schema_history WHERE version = '6';"
# 2. 手动撤销 DDL
PGPASSWORD=Jchl1528 psql -h 192.168.110.252 -p 15432 -U postgresql -d postgresql \
-c "SET search_path TO hisdev; DROP TABLE IF EXISTS clinic_referral;"
# 3. 删除迁移文件
rm healthlink-his-server/healthlink-his-application/src/main/resources/db/migration/V6__create_clinic_referral_table.sql
# 4. 重启应用
```
### 情况 2已提交代码需要紧急回滚
```sql
-- 手动执行逆向 SQL
DROP TABLE IF EXISTS clinic_referral;
DELETE FROM flyway_schema_history WHERE version = '6';
```
---
## 八、常用排查命令
```sql
-- 查看所有已执行的迁移
SELECT installed_rank, version, description, type, success, installed_on
FROM flyway_schema_history
ORDER BY installed_rank;
-- 查看是否有失败的迁移
SELECT * FROM flyway_schema_history WHERE success = false;
-- 查看当前最新版本
SELECT MAX(version) AS current_version FROM flyway_schema_history;
-- 手动标记某版本为成功(紧急修复用)
-- UPDATE flyway_schema_history SET success = true WHERE version = '6';
```
---
## 九、文件清单
```
healthlink-his-server/healthlink-his-application/src/main/resources/db/migration/
├── README.md # 使用说明
├── V1__baseline_marker.sql # 基线标记(空文件)
├── V2__xxx.sql # 你的第一个迁移
├── V3__xxx.sql # 第二个迁移
└── ...
```
---
## 十、注意事项HIS 系统特有)
| 场景 | 处理方式 |
|---|---|
| **新功能开发** | 建表/改表时创建 `V{n}__xxx.sql` |
| **代码生成器生成的表** | 生成后把 DDL 放入迁移文件 |
| **Flowable 工作流表** | 由 Flowable 自己管理,不要用 Flyway 管 |
| **多租户字段** | 新表必须加 `tenant_id INT DEFAULT 1` |
| **逻辑删除字段** | 新表必须加 `valid_flag INT DEFAULT 1` |
| **审计字段** | 新表必须加 `create_by`, `create_time`, `update_by`, `update_time` |
---
## 十一、PostgreSQL 常用 DDL 速查
### 建表模板
```sql
CREATE TABLE IF NOT EXISTS {表名} (
id BIGINT PRIMARY KEY,
{字段} {类型} {默认值} COMMENT '{说明}',
tenant_id INT DEFAULT 1 COMMENT '租户ID',
create_by VARCHAR(64) DEFAULT 'system' COMMENT '创建人',
create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
update_by VARCHAR(64) COMMENT '更新人',
update_time TIMESTAMP COMMENT '更新时间',
valid_flag INT DEFAULT 1 COMMENT '有效标志 1=有效 0=无效'
);
COMMENT ON TABLE {表名} IS '{表说明}';
CREATE INDEX idx_{表名}_{字段} ON {表名}({字段});
```
### 加字段
```sql
ALTER TABLE {表名} ADD COLUMN IF NOT EXISTS {字段} {类型} COMMENT '{说明}';
```
### 加索引
```sql
CREATE INDEX IF NOT EXISTS idx_{表名}_{字段} ON {表名}({字段});
```
### 改字段类型
```sql
ALTER TABLE {表名} ALTER COLUMN {字段} TYPE {新类型};
```
### 删字段
```sql
ALTER TABLE {表名} DROP COLUMN IF EXISTS {字段};
```
### 删表
```sql
DROP TABLE IF EXISTS {表名};
```

View File

@@ -1,935 +0,0 @@
# HealthLink HIS 三甲医院达标详细设计方案
> **目标**: 完全符合三级甲等综合医院信息化评审标准
> **依据**: 国家卫健委三甲评审标准(2022)、电子病历评级≥4级、互联互通≥四级甲等
> **编制日期**: 2026-06-06
> **核心原则**:
> 1. 不修改原有函数签名扩展功能通过新建Service/AppService实现
> 2. 新建表和字段通过Flyway框架管理
> 3. 每个模块开发完成后必须通过完整测试
---
## 一、现状能力与差距分析
### 1.1 已有能力(✅ 可用,无需大改)
| 模块 | 状态 | 已有Controller/Service | 说明 |
|---|---|---|---|
| 门诊挂号 | ✅ 完整 | RegistrationController | 预约/当日/退号/多身份 |
| 门诊收费 | ✅ 完整 | ChargeController | 收费/退费/日结 |
| 门诊医生站 | ✅ 完整 | DoctorStationAdviceController | 处方/检验检查申请/病历 |
| 护士工作站 | ✅ 基础 | NursingRecordController | 医嘱执行/生命体征/护理记录 |
| 药品管理 | ✅ 完整 | pharmacymanage/* | 药库/药房/发药/退药 |
| 住院管理 | ✅ 完整 | PatientHomeController | 入院/床位/转科/出院/押金 |
| 检验检查 | ✅ 完整 | check/*, lab/* | LIS配置/检查类型/项目管理 |
| 统计报表 | ✅ 完整 | reportmanage/* | 20+报表接口 |
| DRG/DIP | ✅ 基础 | ybmanage/* | 基础框架已有 |
| 手术排程 | ✅ 基础 | SurgicalScheduleController | 手术申请/排程/查询 |
| 手术管理 | ✅ 基础 | SurgeryController | 手术信息CRUD |
### 1.2 关键差距(❌ 需开发)
| 差距模块 | 三甲要求 | 当前状态 | 优先级 | 预估工期 |
|---|---|---|---|---|
| **合理用药系统** | 处方100%审核 | 仅有基础处方点评框架 | 🔴 P0 | 5天 |
| **麻醉记录系统** | 互联互通必测项I-13 | 仅有手术排程,无麻醉记录 | 🔴 P0 | 5天 |
| **电子签名/CA** | 三甲硬性要求 | 仅有密码验证框架 | 🔴 P0 | 3天 |
| **院感管理** | 评审必查 | 完全缺失 | 🔴 P0 | 5天 |
| **病案首页管理** | 病案首页数据质量 | 仅有基础统计 | 🔴 P0 | 5天 |
| **护理评估体系** | 多种量表评估 | 仅基础护理记录 | 🟡 P1 | 5天 |
| **医嘱闭环管理** | 开立→审核→执行→完成 | 部分实现 | 🟡 P1 | 3天 |
| **危急值管理** | 检验危急值闭环 | 完全缺失 | 🟡 P1 | 3天 |
| **电子病历结构化** | 结构化+模板+留痕 | 基础模板已有 | 🟡 P1 | 5天 |
| **抗菌药物管控** | 分级管理/权限控制 | 完全缺失 | 🟡 P1 | 3天 |
| **处方点评系统** | 合理用药管控 | 仅基础框架 | 🟡 P1 | 3天 |
| **数据集成平台(ESB)** | 互联互通四级甲等 | 完全缺失 | 🟡 P1 | 5天 |
| **患者主索引(EMPI)** | 数据标准化基础 | 完全缺失 | 🟡 P1 | 3天 |
---
## 二、分阶段详细设计
### Phase 1: 核心安全模块3周
---
#### Sprint 7: 合理用药系统 (5天)
**业务背景**: 三甲医院要求门诊处方审核率≥100%住院医嘱审核率≥100%。系统必须在医生开方时实时拦截不合理处方。
**已有基础**: `PrescriptionReviewRecord`实体、`ReviewPrescriptionRecordsController`审方接口
**需要新增的功能**:
##### 7.1 处方前置审核引擎
**业务流程**:
```
医生开方 → 系统自动审核 → 合理 → 通过
→ 不合理 → 拦截弹窗 → 医生确认/修改
→ 需人工审核 → 药师审核 → 通过/驳回
```
**审核规则(按优先级)**:
1. **配伍禁忌检查**: 两药/三药相互作用(禁忌/严重/一般三级)
2. **过敏检测**: 患者过敏史自动匹配药品成分
3. **剂量审查**: 超剂量/低剂量预警(按年龄/体重/肝肾功能)
4. **重复用药**: 同类/同成分重复使用检查
5. **妊娠/哺乳用药**: 特殊人群用药警示
6. **儿童用药**: 按体重/体表面积计算剂量
7. **肝肾功能调量**: 根据化验结果自动建议调量
**新增Service**:
```java
// 合理用药审核引擎(新建,不修改原有代码)
public interface IRationalDrugReviewService {
// 处方前置审核
PrescriptionReviewResult reviewPrescription(PrescriptionReviewParam param);
// 药品相互作用检查
List<DrugInteraction> checkDrugInteraction(List<String> drugCodes);
// 过敏检查
List<AllergyAlert> checkAllergy(Long patientId, List<String> drugCodes);
// 剂量检查
List<DoseAlert> checkDose(DoseCheckParam param);
// 重复用药检查
List<DuplicateAlert> checkDuplicate(List<String> drugCodes);
}
```
**新增数据库表(Flyway)**:
```sql
-- V2026_007__rational_drug_review.sql
-- 药品相互作用规则表
CREATE TABLE sys_drug_interaction_rule (
id BIGSERIAL PRIMARY KEY,
drug_code_a VARCHAR(50) NOT NULL, -- 药品A编码
drug_code_b VARCHAR(50) NOT NULL, -- 药品B编码
drug_name_a VARCHAR(200),
drug_name_b VARCHAR(200),
interaction_level VARCHAR(20) NOT NULL, -- 禁忌/严重/一般
description TEXT, -- 描述
suggestion TEXT, -- 处理建议
severity INT DEFAULT 1, -- 严重程度 1-5
status CHAR(1) DEFAULT '0', -- 0正常 1停用
tenant_id INT,
create_by VARCHAR(64),
create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
update_by VARCHAR(64),
update_time TIMESTAMP
);
-- 药品过敏规则表
CREATE TABLE sys_drug_allergy_rule (
id BIGSERIAL PRIMARY KEY,
drug_code VARCHAR(50) NOT NULL,
drug_name VARCHAR(200),
allergy_component VARCHAR(200), -- 过敏成分
cross_reaction_drugs TEXT, -- 交叉反应药品
description TEXT,
status CHAR(1) DEFAULT '0',
tenant_id INT,
create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
-- 剂量范围规则表
CREATE TABLE sys_drug_dose_rule (
id BIGSERIAL PRIMARY KEY,
drug_code VARCHAR(50) NOT NULL,
drug_name VARCHAR(200),
dose_type VARCHAR(20), -- 单次/日总量
min_dose DECIMAL(10,2),
max_dose DECIMAL(10,2),
unit VARCHAR(20),
age_min INT, -- 最小年龄
age_max INT, -- 最大年龄
weight_min DECIMAL(5,2), -- 最小体重
weight_max DECIMAL(5,2), -- 最大体重
renal_adjust CHAR(1) DEFAULT '0', -- 肾功能调整
hepatic_adjust CHAR(1) DEFAULT '0', -- 肝功能调整
status CHAR(1) DEFAULT '0',
tenant_id INT,
create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
-- 处方审核记录表(扩展已有表)
-- 在已有 prescription_review_record 表基础上增加字段
ALTER TABLE prescription_review_record ADD COLUMN IF NOT EXISTS review_rules JSONB;
ALTER TABLE prescription_review_record ADD COLUMN IF NOT EXISTS auto_review_result VARCHAR(20);
ALTER TABLE prescription_review_record ADD COLUMN IF NOT EXISTS review_time TIMESTAMP;
ALTER TABLE prescription_review_record ADD COLUMN IF NOT EXISTS drug_details JSONB;
```
**测试用例(20个)**:
1. 正常处方审核通过
2. 配伍禁忌药物拦截(禁忌级别)
3. 配伍禁忌药物预警(一般级别)
4. 过敏药物拦截
5. 超剂量预警
6. 低剂量预警
7. 重复用药拦截
8. 妊娠用药警示
9. 儿童用药按体重计算
10. 肾功能不全剂量调整
11. 肝功能不全剂量调整
12. 多药联用审查
13. 抗菌药物分级限制
14. 处方审核结果查询
15. 审核规则配置
16. 无权限访问拒绝
17. 空处方审核
18. 大处方预警
19. 审核统计查询
20. 处方点评导出
---
##### 7.2 抗菌药物分级管理
**业务背景**: 三甲医院要求抗菌药物使用率≤60%,必须实行分级管理。
**分级标准**:
- **非限制使用级**: 经临床长期应用证明安全、有效,对细菌耐药性影响较小的抗菌药物
- **限制使用级**: 与非限制使用级相比较,在疗效、安全性、耐药性、价格等方面存在局限性
- **特殊使用级**: 不良反应明显,不宜随意使用或临床需要倍加保护以免细菌过快产生耐药性的抗菌药物
**新增Service**:
```java
public interface IAntibioticManageService {
// 查询抗菌药物使用统计
AntibioticUsageStats getUsageStats(Long departmentId, Date startDate, Date endDate);
// 查询医生抗菌药物处方权限
AntibioticPermission checkPermission(Long doctorId, String antibioticLevel);
// 抗菌药物处方审批(特殊使用级需审批)
R<?> approveAntibiotic(AntibioticApprovalParam param);
// DDD监测
List<DDDMonitorDto> getDDDMonitoring(Date startDate, Date endDate);
}
```
**新增数据库表**:
```sql
-- V2026_007__antibiotic_management.sql
-- 抗菌药物目录表
CREATE TABLE sys_antibiotic_drug (
id BIGSERIAL PRIMARY KEY,
drug_code VARCHAR(50) NOT NULL,
drug_name VARCHAR(200),
generic_name VARCHAR(200),
antibiotic_level VARCHAR(20) NOT NULL, -- 非限制/限制/特殊
ddd_value DECIMAL(10,2), -- 限定日剂量
ddd_unit VARCHAR(20),
atc_code VARCHAR(50), -- ATC分类代码
status CHAR(1) DEFAULT '0',
tenant_id INT,
create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
-- 抗菌药物使用记录表
CREATE TABLE sys_antibiotic_usage (
id BIGSERIAL PRIMARY KEY,
encounter_id BIGINT NOT NULL,
patient_id BIGINT NOT NULL,
doctor_id BIGINT NOT NULL,
department_id BIGINT,
drug_code VARCHAR(50) NOT NULL,
drug_name VARCHAR(200),
antibiotic_level VARCHAR(20),
dosage DECIMAL(10,2),
dosage_unit VARCHAR(20),
frequency VARCHAR(50),
route VARCHAR(50),
start_time TIMESTAMP,
end_time TIMESTAMP,
usage_days INT,
ddd_value DECIMAL(10,2),
ddd_sum DECIMAL(10,4), -- DDD累计
approval_status VARCHAR(20), -- 待审批/已批准/已拒绝
approver_id BIGINT,
approval_time TIMESTAMP,
status CHAR(1) DEFAULT '0',
tenant_id INT,
create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
-- 抗菌药物医生权限表
CREATE TABLE sys_antibiotic_permission (
id BIGSERIAL PRIMARY KEY,
doctor_id BIGINT NOT NULL,
doctor_name VARCHAR(100),
department_id BIGINT,
allowed_levels JSONB, -- 允许使用的级别 ["非限制","限制","特殊"]
valid_from DATE,
valid_to DATE,
status CHAR(1) DEFAULT '0',
tenant_id INT,
create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
```
---
#### Sprint 8: 手术麻醉系统 (5天)
**业务背景**: 互联互通测评必测项I-13三甲评审现场检查必查项。
**已有基础**:
- `OpSchedule`(手术排程实体)、`OperatingRoom`(手术室实体)
- `SurgicalScheduleController`(手术排程接口)
- `SurgeryController`(手术管理接口)
**需要新增的功能**:
##### 8.1 麻醉评估系统
**业务流程**:
```
术前评估 → ASA分级 → 气道评估 → 麻醉方案 → 知情同意 → 术中记录 → 苏醒评估
```
**新增Service**:
```java
public interface IAnesthesiaService {
// 术前麻醉评估
AnesthesiaAssessment createAssessment(AnessmentAssessmentParam param);
// ASA分级评估
ASAResult assessASA(ASAAssessmentParam param);
// 气道评估
AirwayAssessment assessAirway(AirwayAssessmentParam param);
// 麻醉方案制定
AnesthesiaPlan createPlan(AnesthesiaPlanParam param);
// 术中记录
IntraOpRecord recordIntraOp(IntraOpRecordParam param);
// 麻醉苏醒评估
RecoveryAssessment assessRecovery(RecoveryAssessmentParam param);
// 查询麻醉记录
AnesthesiaRecord getRecord(Long surgeryScheduleId);
}
```
**新增数据库表**:
```sql
-- V2026_008__anesthesia_system.sql
-- 麻醉评估表
CREATE TABLE sys_anesthesia_assessment (
id BIGSERIAL PRIMARY KEY,
surgery_schedule_id BIGINT NOT NULL, -- 关联手术排程
encounter_id BIGINT NOT NULL,
patient_id BIGINT NOT NULL,
assessment_date TIMESTAMP,
assessor_id BIGINT,
-- ASA分级
asa_level VARCHAR(10), -- ASA I-VI
asa_description TEXT,
-- 气道评估
airway_assessment JSONB, -- 气道评估详细数据
mallampati_grade VARCHAR(10), -- Mallampati分级 I-IV
mouth_opening DECIMAL(5,2), -- 张口度(cm)
neck_mobility VARCHAR(50), -- 颈部活动度
thyromental_distance DECIMAL(5,2), -- 甲颏距离(cm)
dental_prostheses CHAR(1), -- 假牙 0无 1有
-- 心肺评估
cardiac_function VARCHAR(50), -- 心功能分级
pulmonary_function VARCHAR(50), -- 肺功能
ekg_result TEXT, -- 心电图结果
-- 实验室检查
lab_results JSONB, -- 实验室检查结果
-- 综合评估
overall_risk VARCHAR(20), -- 低/中/高/极高
contraindications TEXT, -- 禁忌症
special_notes TEXT, -- 特殊注意事项
status VARCHAR(20), -- 草稿/已提交/已审核
create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
-- 麻醉方案表
CREATE TABLE sys_anesthesia_plan (
id BIGSERIAL PRIMARY KEY,
assessment_id BIGINT NOT NULL,
surgery_schedule_id BIGINT NOT NULL,
anesthesia_type VARCHAR(50), -- 全麻/椎管内/神经阻滞/局部/复合
anesthesia_method TEXT, -- 具体麻醉方法
monitor_plan TEXT, -- 监测方案
airway_management TEXT, -- 气道管理方案
fluid_plan TEXT, -- 输液方案
blood_plan TEXT, -- 输血方案
pain_management TEXT, -- 镇痛方案
special_requirements TEXT, -- 特殊要求
planned_by_id BIGINT,
plan_time TIMESTAMP,
status VARCHAR(20), -- 草稿/已提交/已批准
create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
-- 术中麻醉记录表
CREATE TABLE sys_anesthesia_intra_record (
id BIGSERIAL PRIMARY KEY,
surgery_schedule_id BIGINT NOT NULL,
encounter_id BIGINT NOT NULL,
-- 时间节点
patient_entry_time TIMESTAMP, -- 患者入室时间
anesthesia_start_time TIMESTAMP, -- 麻醉开始时间
surgery_start_time TIMESTAMP, -- 手术开始时间
surgery_end_time TIMESTAMP, -- 手术结束时间
anesthesia_end_time TIMESTAMP, -- 麻醉结束时间
patient_exit_time TIMESTAMP, -- 患者出室时间
-- 生命体征(定时采集)
vital_signs_data JSONB, -- [{time, systolic, diastolic, heart_rate, spo2, temp, etco2, ...}]
-- 麻醉用药
anesthesia_medications JSONB, -- [{drug_name, dose, unit, time, route, operator}]
-- 非麻醉用药
non_anesthesia_medications JSONB, -- [{drug_name, dose, unit, time, reason}]
-- 液体出入量
fluid_input JSONB, -- [{type, volume_ml, time}]
fluid_output JSONB, -- [{type, volume_ml, time}]
blood_loss_ml INT, -- 出血量
blood_transfusion_ml INT, -- 输血量
urine_output_ml INT, -- 尿量
-- 术中事件
intra_events JSONB, -- [{event_type, time, description, handling}]
-- 气道管理
airway_management JSONB, -- {intubation_type, tube_size, depth, ...}
-- 麻醉医师
primary_anesthesiologist_id BIGINT, -- 主麻
assistant_anesthesiologist_id BIGINT, -- 助麻
status VARCHAR(20), -- 进行中/已完成
create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
-- 麻醉苏醒评估表
CREATE TABLE sys_anesthesia_recovery (
id BIGSERIAL PRIMARY KEY,
intra_record_id BIGINT NOT NULL,
surgery_schedule_id BIGINT NOT NULL,
recovery_time TIMESTAMP,
consciousness_level VARCHAR(50), -- 清醒/嗜睡/模糊/昏迷
respiratory_rate INT,
heart_rate INT,
blood_pressure VARCHAR(50),
spo2 DECIMAL(5,2),
temperature DECIMAL(5,2),
pain_score INT, -- NRS评分 0-10
恶心_nausea CHAR(1), -- 0无 1有
vomiting CHAR(1), -- 0无 1有
Aldrete_score INT, -- Aldrete评分 0-10
discharge_eligible CHAR(1), -- 0不达标 1达标
extubation_time TIMESTAMP, -- 拔管时间
special_notes TEXT,
assessor_id BIGINT,
create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
-- 知情同意书表
CREATE TABLE sys_consent_form (
id BIGSERIAL PRIMARY KEY,
encounter_id BIGINT NOT NULL,
patient_id BIGINT NOT NULL,
form_type VARCHAR(50), -- 手术/麻醉/输血/其他
surgery_schedule_id BIGINT,
form_template_id BIGINT,
form_content TEXT, -- 知情同意书内容
patient_name VARCHAR(100),
patient_signature_data TEXT, -- 患者签名(base64)
patient_sign_time TIMESTAMP,
doctor_signature_data TEXT, -- 医生签名(base64)
doctor_sign_time TIMESTAMP,
witness_signature_data TEXT, -- 见证人签名(base64)
witness_sign_time TIMESTAMP,
status VARCHAR(20), -- 待签署/已签署/已撤回
create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
```
---
##### 8.2 手术记录系统
**业务流程**:
```
手术申请 → 科室审批 → 医务科审批 → 手术排程 → 术前准备 → 手术执行 → 术后医嘱
```
**新增Service**:
```java
public interface ISurgeryRecordService {
// 创建手术记录
SurgeryRecord createRecord(SurgeryRecordParam param);
// 记录术中信息
void recordIntraOp(IntraOpParam param);
// 记录植入物
void recordImplant(ImplantRecordParam param);
// 记录标本
void recordSpecimen(SpecimenRecordParam param);
// 术后医嘱自动生成
List<Advice> generatePostOpOrders(Long surgeryRecordId);
// 手术统计
SurgeryStatistics getStatistics(Long departmentId, Date startDate, Date endDate);
}
```
**新增数据库表**:
```sql
-- V2026_008__surgery_record.sql
-- 手术记录表(扩展已有op_schedule)
ALTER TABLE op_schedule ADD COLUMN IF NOT EXISTS surgery_record_id BIGINT;
ALTER TABLE op_schedule ADD COLUMN IF NOT EXISTS post_op_diagnosis TEXT;
ALTER TABLE op_schedule ADD COLUMN IF NOT EXISTS post_op_orders JSONB;
-- 手术记录详细表
CREATE TABLE sys_surgery_record (
id BIGSERIAL PRIMARY KEY,
surgery_schedule_id BIGINT NOT NULL,
encounter_id BIGINT NOT NULL,
patient_id BIGINT NOT NULL,
-- 手术团队
surgeon_id BIGINT, -- 主刀
assistant1_id BIGINT, -- 助手1
assistant2_id BIGINT, -- 助手2
assistant3_id BIGINT, -- 助手3
scrub_nurse_id BIGINT, -- 器械护士
circulating_nurse_id BIGINT, -- 巡回护士
-- 手术时间
incision_time TIMESTAMP, -- 切皮时间
closure_time TIMESTAMP, -- 缝合时间
total_surgery_minutes INT, -- 手术总时长
-- 手术信息
surgical_site VARCHAR(200), -- 手术部位
approach VARCHAR(100), -- 手术入路
implant_records JSONB, -- [{implant_name, serial_no, manufacturer, quantity}]
specimen_records JSONB, -- [{specimen_type, description, send_to_pathology}]
-- 出血与输血
estimated_blood_loss INT, -- 估计出血量(ml)
actual_blood_loss INT, -- 实际出血量(ml)
blood_transfusion_units INT, -- 输血量(单位)
-- 并发症
intraoperative_complications JSONB, -- [{type, description, time, handling}]
postoperative_complications JSONB, -- [{type, description, time, handling}]
-- 手术级别
surgery_level VARCHAR(20), -- 一/二/三/四级
surgery_classification VARCHAR(50), -- 急诊/限期/择期
-- 感染控制
infection_risk CHAR(1), -- 0低 1中 2高
isolation_type VARCHAR(50), -- 隔离类型
antibiotic_prophylaxis CHAR(1), -- 0无 1有预防性抗菌药物
status VARCHAR(20), -- 进行中/已完成
create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
-- 植入物记录表
CREATE TABLE sys_implant_record (
id BIGSERIAL PRIMARY KEY,
surgery_record_id BIGINT NOT NULL,
implant_name VARCHAR(200),
implant_model VARCHAR(100),
serial_no VARCHAR(100), -- 序列号/批号
manufacturer VARCHAR(200),
specification VARCHAR(200),
quantity INT DEFAULT 1,
implant_site VARCHAR(200), -- 植入部位
Implant_time TIMESTAMP,
status CHAR(1) DEFAULT '0',
create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
```
---
#### Sprint 9: 院感管理系统 (5天)
**业务背景**: 三甲评审要求医院感染监测报告率达标,院感管理是评审必查项。
**新增Service**:
```java
public interface IInfectionControlService {
// 院感病例监测
List<InfectionCase> monitorInfection(Date startDate, Date endDate);
// 院感病例上报
void reportCase(InfectionCaseReportParam param);
// 院感预警
List<InfectionAlert> getAlerts(Long departmentId);
// 院感统计
InfectionStatistics getStatistics(Date startDate, Date endDate);
// 多重耐药菌监测
List<MDRORecord> monitorMDRO(Date startDate, Date endDate);
// 手卫生管理
void recordHandHygiene(HandHygieneRecordParam param);
HandHygieneStats getHandHygieneStats(Long departmentId, Date startDate, Date endDate);
// 职业暴露管理
void reportExposure(OccupationalExposureParam param);
void trackExposure(Long exposureId, ExposureFollowUpParam param);
List<OccupationalExposure> getExposureRecords(Date startDate, Date endDate);
// 环境监测
void recordEnvironmentMonitor(EnvironmentMonitorParam param);
List<EnvironmentMonitor> getEnvironmentMonitorRecords(Long departmentId, Date startDate, Date endDate);
}
```
**新增数据库表**:
```sql
-- V2026_009__infection_control.sql
-- 院感病例表
CREATE TABLE sys_infection_case (
id BIGSERIAL PRIMARY KEY,
encounter_id BIGINT NOT NULL,
patient_id BIGINT NOT NULL,
infection_type VARCHAR(50), -- 医院感染/社区感染
infection_site VARCHAR(100), -- 下呼吸道/泌尿道/血液/手术部位/其他
pathogen_code VARCHAR(50),
pathogen_name VARCHAR(200),
drug_resistance JSONB, -- [{drug_name, resistance_type}]
diagnosis_basis TEXT, -- 诊断依据
report_time TIMESTAMP,
reporter_id BIGINT,
department_id BIGINT,
status VARCHAR(20), -- 疑似/确认/已排除/已处理
treatment_plan TEXT,
outcome TEXT,
create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
-- 手卫生记录表
CREATE TABLE sys_hand_hygiene (
id BIGSERIAL PRIMARY KEY,
staff_id BIGINT NOT NULL,
staff_name VARCHAR(100),
department_id BIGINT,
observation_time TIMESTAMP,
observation_type VARCHAR(50), -- 两前三后/手卫生五个时刻
correct_flag CHAR(1), -- 0不正确 1正确
handrub_type VARCHAR(50), -- 洗手液/速干手消毒剂
observer_id BIGINT,
create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
-- 职业暴露记录表
CREATE TABLE sys_occupational_exposure (
id BIGSERIAL PRIMARY KEY,
staff_id BIGINT NOT NULL,
staff_name VARCHAR(100),
department_id BIGINT,
exposure_type VARCHAR(50), -- 锐器伤/血液体液暴露/化学暴露/其他
exposure_source VARCHAR(200), -- 暴露源描述
source_patient_name VARCHAR(100),
source_patient_hiv VARCHAR(20),
source_patient_hbv VARCHAR(20),
source_patient_hcv VARCHAR(20),
exposure_time TIMESTAMP,
exposure_site VARCHAR(100), -- 暴露部位
exposure_amount VARCHAR(100), -- 暴露量
immediate_handling TEXT, -- 立即处理措施
risk_assessment VARCHAR(20), -- 低/中/高
follow_up_plan TEXT, -- 随访计划
follow_up_records JSONB, -- [{time, result, note}]
report_time TIMESTAMP,
reporter_id BIGINT,
status VARCHAR(20), -- 登记中/处置中/随访中/已结案
create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
-- 环境监测表
CREATE TABLE sys_environment_monitor (
id BIGSERIAL PRIMARY KEY,
department_id BIGINT,
monitor_type VARCHAR(50), -- 空气/物表/手/消毒剂
monitor_item VARCHAR(100), -- 监测项目
monitor_result VARCHAR(200), -- 监测结果
standard_value VARCHAR(200), -- 标准值
is_qualified CHAR(1), -- 0不合格 1合格
monitor_time TIMESTAMP,
monitor_by_id BIGINT,
create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
```
---
### Phase 2: 病案与护理体系3周
#### Sprint 10: 病案管理系统 (5天)
**业务背景**: 三甲要求病案首页24小时归档率≥90%主要诊断编码正确率≥95%。
**已有基础**: `InpatientMedicalRecordHomePageCollectionController`(病案首页统计)
**新增Service**:
```java
public interface IMedicalRecordManagementService {
// 病案首页数据自动采集
MedicalRecordHome autoCollectHome(Long encounterId);
// ICD-10编码推荐
List<ICD10Code> recommendDiagnosisCode(String diagnosisName);
// ICD-9-CM-3手术编码映射
List<ICD9CM3Code> mapSurgeryCode(String surgeryName);
// 首页数据质量校验
HomeQualityResult validateHomeQuality(Long homeId);
// 病案质控
MedicalRecordAudit auditRecord(MedicalRecordAuditParam param);
// DRG自动分组
DRGGroupingResult autoDRGGrouping(Long encounterId);
// 病案归档
void archiveMedicalRecord(Long encounterId);
// 病案借阅
MedicalRecordBorrow borrowRecord(MedicalRecordBorrowParam param);
// 病案封存/解封
void sealRecord(Long recordId, boolean seal);
}
```
---
#### Sprint 11: 护理评估体系 (5天)
**业务背景**: 三甲要求护理评估完成率≥95%入院评估8小时内完成。
**已有基础**: `VitalSignsController`(生命体征)、`NursingRecordController`(护理记录)
**新增Service**:
```java
public interface INursingAssessmentService {
// 入院护理评估
NursingAssessment createAdmissionAssessment(AdmissionAssessmentParam param);
// Braden压疮风险评估(自动评分)
BradenScore assessBraden(BradenAssessmentParam param);
// Morse跌倒风险评估(自动评分)
MorseScore assessMorse(MorseAssessmentParam param);
// NRS2002营养风险评估
NRS2002Score assessNRS2002(NRS2002AssessmentParam param);
// 疼痛评估(NRS/VAS)
PainScore assessPain(PainAssessmentParam param);
// Caprini VTE风险评估
CapriniScore assessCaprini(CapriniAssessmentParam param);
// Barthel自理能力评估
BarthelScore assessBarthel(BarthelAssessmentParam param);
// 评估时间轴(动态变化追踪)
List<AssessmentTimeline> getTimeline(Long patientId, String assessmentType);
// 护理计划
NursingPlan createPlan(NursingPlanParam param);
// 护理交接班
NursingHandover createHandover(NursingHandoverParam param);
}
```
---
### Phase 3: 数据集成与标准化3周
#### Sprint 12: 患者主索引+主数据 (3天)
**业务背景**: 互联互通四级甲等基础,统一患者身份标识。
**新增Service**:
```java
public interface IEMPIService {
// 患者身份匹配
String matchPatient(PatientMatchParam param);
// 患者身份合并
void mergePatient(Long primaryId, Long secondaryId);
// 患者身份拆分
void splitPatient(Long mergedId);
// 主数据同步
void syncMasterData(MasterDataSyncParam param);
}
```
---
#### Sprint 13: 数据集成平台ESB (5天)
**业务背景**: 互联互通四级甲等核心,所有系统通过集成平台互联。
**新增Service**:
```java
public interface IESBService {
// 发送消息
void sendMessage(ESBMessage message);
// 接收消息
ESBMessage receiveMessage(String messageId);
// 服务注册
void registerService(ESBServiceRegistry service);
// 服务发现
ESBServiceRegistry discoverService(String serviceName);
// 消息监控
ESBMonitor getMonitor(Date startDate, Date endDate);
// CDA文档生成
CDADocument generateCDA(String documentType, Long encounterId);
}
```
---
### Phase 4: 智能化与决策支持3周
#### Sprint 14: 危急值管理系统 (3天)
**业务背景**: 医疗质量安全核心制度,检验危急值必须闭环管理。
**新增Service**:
```java
public interface ICriticalValueService {
// 危急值规则配置
void configureRules(List<CriticalValueRule> rules);
// 检验结果自动匹配危急值
List<CriticalValueAlert> matchCriticalValue(Long inspectionResultId);
// 危急值通知
void notifyCriticalValue(Long alertId, List<Long> notifyUserIds);
// 危急值确认
void confirmCriticalValue(Long alertId, CriticalValueConfirmParam param);
// 危急值处置
void handleCriticalValue(Long alertId, CriticalValueHandleParam param);
// 危急值统计
CriticalValueStats getStats(Date startDate, Date endDate);
}
```
---
#### Sprint 15: 电子病历结构化 (5天)
**业务背景**: 电子病历应用管理规范要求修改留痕、版本管理、电子签名。
**新增Service**:
```java
public interface IStructuredEMRService {
// 结构化病历创建
StructuredEMR createEMR(EMRCreateParam param);
// 病历修改(留痕)
void modifyEMR(Long emrId, EMRModifyParam param);
// 版本历史
List<EMRVersion> getVersionHistory(Long emrId);
// 版本对比
EMRDiff compareVersions(Long versionId1, Long versionId2);
// 病历模板管理
EMRTemplate saveTemplate(EMRTemplateParam param);
// 病历完整性检查
EMRCompletenessResult checkCompleteness(Long emrId);
}
```
---
#### Sprint 16: 医保智能审核 (5天)
**业务背景**: 医保基金使用监督管理条例,防范骗保、规范使用。
**已有基础**: `ybmanage/*`(医保管理模块)
**新增Service**:
```java
public interface IInsuranceAuditService {
// 事前审核(开方时)
PreAuditResult preAudit(PreAuditParam param);
// 事中审核(住院中)
List<InAuditAlert> inAudit(Long encounterId);
// 事后审核(结算后)
PostAuditResult postAudit(Long settlementId);
// DRG/DIP优化建议
DRGOptimizationSuggestion optimizeDRG(Long encounterId);
}
```
---
## 三、测试计划
### 每个Sprint测试矩阵
| 测试类型 | 内容 | 通过标准 |
|---|---|---|
| **接口测试** | 所有新增API端点 | 正常/异常/边界各至少1个用例 |
| **白盒测试** | Service层方法 | 覆盖率≥80% |
| **黑盒测试** | 业务流程完整性 | 关键流程100%覆盖 |
| **冒烟测试** | 核心功能可用性 | 所有核心接口返回200 |
| **回归测试** | 原有功能不受影响 | 158个已有测试全部通过 |
### 测试用例设计原则
1. **正常流程测试**: 每个API至少1个正常用例
2. **边界条件测试**: 空值/极值/特殊字符/超长文本
3. **异常处理测试**: 无权限/参数错误/数据不存在/并发冲突
4. **数据一致性测试**: 事务完整性、级联操作
5. **性能测试**: 并发场景可选P2优先级
---
## 四、实施路线图
```
Phase 1 (Week 1-3): 核心安全模块
├── Sprint 7: 合理用药系统 (5天) → 20个测试用例
├── Sprint 8: 手术麻醉系统 (5天) → 25个测试用例
└── Sprint 9: 院感管理系统 (5天) → 20个测试用例
Phase 2 (Week 4-6): 病案与护理
├── Sprint 10: 病案管理系统 (5天) → 20个测试用例
└── Sprint 11: 护理评估体系 (5天) → 25个测试用例
Phase 3 (Week 7-9): 数据集成
├── Sprint 12: EMPI + 主数据 (3天) → 15个测试用例
└── Sprint 13: ESB集成平台 (5天) → 20个测试用例
Phase 4 (Week 10-12): 智能化
├── Sprint 14: 危急值管理 (3天) → 15个测试用例
├── Sprint 15: 电子病历结构化 (5天) → 20个测试用例
└── Sprint 16: 医保智能审核 (5天) → 20个测试用例
总计: 12周 (约3个月)
总用例数: 预计 220+ 个接口测试
```
---
## 五、质量保障
### 5.1 开发规范铁律
1. **不修改原有函数签名** — 扩展功能通过新建Service/AppService实现
2. **数据库变更通过Flyway** — 所有新建表和字段使用Flyway版本化管理
3. **代码审查** — 每个PR必须经过Code Review
4. **单元测试** — Service层覆盖率≥80%
5. **接口测试** — 每个API端点必须有测试用例
### 5.2 铁律
1. 修改完必须测试才能提交
2. 新建表和字段必须通过Flyway
3. 测试通过后才提交代码
4. 前后端API路径必须对齐
5. 每个Sprint完成后进行完整回归测试
6. 白盒测试+黑盒测试+冒烟测试+接口测试+回归测试全部通过后才能提交
---
> **文档版本**: v1.0
> **最后更新**: 2026-06-06

View File

@@ -1,772 +0,0 @@
# HealthLink HIS 三甲医院达标开发计划
> **目标**: 完全符合三级甲等综合医院信息化评审标准
> **依据**: 《三级医院评审标准2022年版》、电子病历评级≥4级、互联互通≥四级甲等
> **编制日期**: 2026-06-06
> **开发原则**:
> 1. 不修改原有函数签名扩展功能通过新建Service/AppService实现
> 2. 新建表和字段通过Flyway框架管理
> 3. 每个模块开发完成后必须通过完整测试
---
## 一、现状差距分析
### 1.1 已有能力(✅ 可用)
| 模块 | 状态 | 说明 |
|---|---|---|
| 门诊挂号 | ✅ | 预约/当日/退号/多身份 |
| 门诊收费 | ✅ | 收费/退费/日结 |
| 门诊医生站 | ✅ | 处方/检验检查申请/病历 |
| 护士工作站 | ✅ | 医嘱执行/生命体征/护理记录 |
| 药品管理 | ✅ | 药库/药房/发药/退药 |
| 住院管理 | ✅ | 入院/床位/转科/出院/押金 |
| 检验检查 | ✅ | LIS配置/检查类型/项目管理 |
| 统计报表 | ✅ | 20+报表接口 |
| DRG/DIP | ✅ | 基础框架已有 |
### 1.2 关键差距(❌ 需开发)
| 差距模块 | 三甲要求 | 当前状态 | 优先级 |
|---|---|---|---|
| **手术麻醉系统** | 评审必查 | 仅有1个Controller功能不完整 | 🔴 P0 |
| **合理用药系统** | 处方100%审核 | 完全缺失 | 🔴 P0 |
| **电子签名/CA** | 三甲硬性要求 | 仅有基础框架 | 🔴 P0 |
| **院感管理** | 评审必查 | 完全缺失 | 🔴 P0 |
| **病案管理** | 病案首页数据质量 | 仅有1个Controller | 🔴 P0 |
| **护理评估体系** | 多种量表评估 | 仅基础护理记录 | 🟡 P1 |
| **医嘱闭环管理** | 开立→审核→执行→完成 | 部分实现 | 🟡 P1 |
| **处方点评** | 合理用药管控 | 完全缺失 | 🟡 P1 |
| **抗菌药物管控** | 分级管理/权限控制 | 完全缺失 | 🟡 P1 |
| **危急值管理** | 检验危急值闭环 | 完全缺失 | 🟡 P1 |
| **电子病历结构化** | 结构化+模板 | 基础模板已有 | 🟡 P1 |
| **数据集成平台(ESB)** | 互联互通四级甲等 | 完全缺失 | 🟡 P1 |
| **患者主索引(EMPI)** | 数据标准化基础 | 完全缺失 | 🟡 P1 |
| **药品追溯码** | 2026年新规 | 完全缺失 | 🟡 P1 |
---
## 二、分阶段开发计划
### Phase 1: 核心安全模块3周
> 目标:补齐三甲硬性要求的缺失模块
#### Sprint 7: 合理用药系统 (5天)
**业务描述**: 处方前置审核、药品相互作用检查、过敏检测、剂量审查、抗菌药物管控
**三甲依据**: 处方审核率≥100%、抗菌药物分级管理
**后端开发**:
1. `PrescriptionReviewService` — 处方前置审核引擎
- 药品相互作用检查(两药/三药配伍禁忌)
- 过敏史自动匹配
- 剂量范围检查(超剂量/低剂量预警)
- 重复用药检查(同类/同成分)
- 配伍禁忌(输液配伍审查)
- 妊娠/哺乳用药警示
- 儿童用药按体重计算
2. `AntibioticManageService` — 抗菌药物分级管理
- 非限制使用级/限制使用级/特殊使用级
- 医生抗菌药物处方权限管理
- 抗菌药物使用率实时监控
- DDD限定日剂量监测
3. `PrescriptionCommentService` — 处方点评
- 可配置点评规则库
- 系统自动筛查不合理处方
- 人工点评工作台
- 合理率统计、科室/医生排名
**前端开发**:
1. 处方审核弹窗(开方时实时拦截)
2. 抗菌药物管理界面
3. 处方点评工作台
**数据库设计**:
```sql
-- Flyway: V2026_007__rational_drug_use.sql
CREATE TABLE sys_drug_interaction (
id BIGSERIAL PRIMARY KEY,
drug_code_a VARCHAR(50) NOT NULL,
drug_code_b VARCHAR(50) NOT NULL,
interaction_level VARCHAR(20) NOT NULL, -- 禁忌/严重/一般
description TEXT,
suggestion TEXT,
status CHAR(1) DEFAULT '0',
create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
CREATE TABLE sys_drug_allergy (
id BIGSERIAL PRIMARY KEY,
patient_id BIGINT NOT NULL,
allergy_type VARCHAR(50), -- 药物/食物/其他
allergen_code VARCHAR(50),
allergen_name VARCHAR(200),
reaction VARCHAR(200),
severity VARCHAR(20), -- 轻度/中度/重度
status CHAR(1) DEFAULT '0',
create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
CREATE TABLE sys_prescription_review (
id BIGSERIAL PRIMARY KEY,
encounter_id BIGINT NOT NULL,
doctor_id BIGINT NOT NULL,
prescription_type VARCHAR(20), -- 西药/中成药/中药
review_result VARCHAR(20), -- 合理/不合理/需人工审核
review_detail JSONB, -- 审查明细
reviewer_id BIGINT,
review_time TIMESTAMP,
create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
CREATE TABLE sys_antibiotic_record (
id BIGSERIAL PRIMARY KEY,
encounter_id BIGINT NOT NULL,
doctor_id BIGINT NOT NULL,
drug_code VARCHAR(50) NOT NULL,
drug_name VARCHAR(200),
usage_days INT,
ddd_value DECIMAL(10,2),
level VARCHAR(20), -- 非限制/限制/特殊
approval_status VARCHAR(20), -- 审批中/已批准/已拒绝
approver_id BIGINT,
create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
CREATE TABLE sys_prescription_comment (
id BIGSERIAL PRIMARY KEY,
prescription_id BIGINT,
encounter_id BIGINT,
doctor_id BIGINT,
department_id BIGINT,
comment_type VARCHAR(20), -- 自动/人工
comment_result VARCHAR(20), -- 合理/不合理
comment_detail TEXT,
commentator_id BIGINT,
comment_time TIMESTAMP,
create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
```
**测试用例** (20个):
1. 处方审核正常通过
2. 药品相互作用拦截
3. 过敏药物拦截
4. 超剂量预警
5. 重复用药拦截
6. 抗菌药物权限校验
7. 抗菌药物分级限制
8. 处方点评自动筛查
9. 人工点评提交
10. 合理率统计查询
...
---
#### Sprint 8: 手术麻醉系统 (5天)
**业务描述**: 手术预约→审批→排程→麻醉评估→麻醉记录→手术记录→术后管理
**三甲依据**: 互联互通测评必测项(I-13)
**后端开发**:
1. `SurgeryScheduleService` — 手术预约排程
- 手术申请→科室审批→医务科审批→排程→通知
- 手术间/手术台管理
- 手术医生/麻醉医生/器械护士排班
- 急诊手术绿色通道
2. `AnesthesiaAssessmentService` — 麻醉评估
- 术前评估ASA分级、气道评估
- 麻醉方案制定
- 知情同意书电子签署
3. `AnesthesiaRecordService` — 麻醉记录
- 术中监测数据记录(生命体征、用药、事件)
- 麻醉用药记录
- 麻醉苏醒评估
4. `SurgeryRecordService` — 手术记录
- 术者/助手/器械/巡回护士记录
- 植入物记录
- 手术出血/并发症记录
- 术后医嘱自动生成
5. `SurgeryStatisticsService` — 手术统计
- 手术量统计
- 手术并发症率
- 手术死亡率
**前端开发**:
1. 手术预约申请界面
2. 手术排程甘特图
3. 麻醉记录工作站
4. 手术记录表单
5. 手术统计仪表盘
**数据库设计**:
```sql
-- Flyway: V2026_008__surgery_anesthesia.sql
CREATE TABLE sys_surgery_schedule (
id BIGSERIAL PRIMARY KEY,
encounter_id BIGINT NOT NULL,
patient_id BIGINT NOT NULL,
surgery_code VARCHAR(50),
surgery_name VARCHAR(200),
surgery_level VARCHAR(20), -- 一/二/三/四级
surgeon_id BIGINT,
anesthesiologist_id BIGINT,
手术_room VARCHAR(50),
surgery_table VARCHAR(50),
planned_start_time TIMESTAMP,
planned_end_time TIMESTAMP,
actual_start_time TIMESTAMP,
actual_end_time TIMESTAMP,
status VARCHAR(20), -- 申请/审批中/已排程/进行中/已完成/已取消
approval_status VARCHAR(20),
emergency_flag CHAR(1) DEFAULT '0',
create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
CREATE TABLE sys_anesthesia_record (
id BIGSERIAL PRIMARY KEY,
surgery_schedule_id BIGINT NOT NULL,
encounter_id BIGINT NOT NULL,
anesthesia_type VARCHAR(50), -- 全麻/椎管内/神经阻滞/局部
asa_level VARCHAR(10),
airway_assessment VARCHAR(20),
pre_op_assessment TEXT,
anesthesia_plan TEXT,
intra_vital_signs JSONB, -- 术中生命体征
anesthesia_medications JSONB, -- 麻醉用药
intra_events JSONB, -- 术中事件
blood_loss_ml INT,
urine_output_ml INT,
fluid_input_ml INT,
extubation_time TIMESTAMP,
recovery_assessment TEXT,
status VARCHAR(20), -- 评估中/进行中/已结束
create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
CREATE TABLE sys_surgery_record (
id BIGSERIAL PRIMARY KEY,
surgery_schedule_id BIGINT NOT NULL,
encounter_id BIGINT NOT NULL,
surgeon_id BIGINT,
assistants JSONB,
scrub_nurse_id BIGINT,
circulating_nurse_id BIGINT,
incision_time TIMESTAMP,
closure_time TIMESTAMP,
implant_records JSONB,
specimen_records JSONB,
blood_loss_ml INT,
complications JSONB,
post_op_diagnosis TEXT,
post_op_orders TEXT,
status VARCHAR(20), -- 进行中/已完成
create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
CREATE TABLE sys_surgery_room (
id BIGSERIAL PRIMARY KEY,
room_code VARCHAR(50) NOT NULL,
room_name VARCHAR(100),
department_id BIGINT,
room_level VARCHAR(20), -- 洁净/普通/急诊
equipment_list JSONB,
status VARCHAR(20), -- 空闲/使用中/维护中
create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
```
---
#### Sprint 9: 院感管理系统 (5天)
**业务描述**: 院感病例监测、抗菌药物使用监测、手卫生监测、职业暴露管理
**三甲依据**: 医院感染监测报告率达标
**后端开发**:
1. `InfectionMonitorService` — 院感监测
- 院感病例实时监测(自动预警)
- 院感发病率统计
- 部位感染分类
- 多重耐药菌监测
2. `HandHygieneService` — 手卫生管理
- 手卫生依从性监测
- 手卫生正确率统计
- 手卫生培训记录
3. `OccupationalExposureService` — 职业暴露
- 职业暴露登记
- 暴露后处置流程
- 跟踪随访管理
4. `EnvironmentMonitorService` — 环境监测
- 消毒灭菌监测记录
- 空气/物表/手培养监测
**前端开发**:
1. 院感监测仪表盘
2. 院感病例上报表单
3. 手卫生监测界面
4. 职业暴露登记界面
**数据库设计**:
```sql
-- Flyway: V2026_009__infection_control.sql
CREATE TABLE sys_infection_case (
id BIGSERIAL PRIMARY KEY,
encounter_id BIGINT NOT NULL,
patient_id BIGINT NOT NULL,
infection_type VARCHAR(50), -- 医院感染/社区感染
infection_site VARCHAR(100), -- 下呼吸道/泌尿道/血液等
pathogen_code VARCHAR(50),
pathogen_name VARCHAR(200),
drug_resistance VARCHAR(200), -- 耐药类型
report_time TIMESTAMP,
reporter_id BIGINT,
status VARCHAR(20), -- 疑似/确认/已处理
create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
CREATE TABLE sys_hand_hygiene_record (
id BIGSERIAL PRIMARY KEY,
staff_id BIGINT NOT NULL,
department_id BIGINT,
observation_time TIMESTAMP,
observation_type VARCHAR(50), -- 两前三后/手卫生时机
correct_flag CHAR(1),
observer_id BIGINT,
create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
CREATE TABLE sys_occupational_exposure (
id BIGSERIAL PRIMARY KEY,
staff_id BIGINT NOT NULL,
exposure_type VARCHAR(50), -- 锐器伤/血液暴露/其他
exposure_source VARCHAR(200),
exposure_time TIMESTAMP,
exposure_site VARCHAR(100),
immediate_handling TEXT,
follow_up_plan TEXT,
follow_up_result TEXT,
status VARCHAR(20), -- 登记中/处置中/已结案
create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
```
---
### Phase 2: 病案与护理体系3周
> 目标:补齐病案管理和护理评估体系
#### Sprint 10: 病案管理系统 (5天)
**业务描述**: 病案首页数据质量、编码审核、DRG入组、病案归档
**三甲依据**: 病案首页24小时归档率≥90%
**后端开发**:
1. `MedicalRecordHomeService` — 病案首页管理
- 首页数据自动采集(诊断/手术/费用/护理)
- ICD-10编码自动推荐
- ICD-9-CM-3手术编码映射
- 首页数据质量校验(完整性/逻辑性/编码正确率)
2. `MedicalRecordAuditService` — 病案质控
- 运行质控(病历完成时限监控)
- 终末质控(出院后病历质量审核)
- 质控评分标准
3. `DRGGroupingService` — DRG入组
- 广西DRG分组方案对接
- 自动DRG分组
- 费用预警(超标提醒)
- CMI值计算
4. `MedicalRecordArchiveService` — 病案归档
- 电子病历归档
- 病案借阅管理
- 病案封存/解封
**前端开发**:
1. 病案首页填写界面(智能填充)
2. 病案质控工作台
3. DRG入组结果展示
4. 病案借阅管理界面
**数据库设计**:
```sql
-- Flyway: V2026_010__medical_record_management.sql
CREATE TABLE sys_medical_record_home (
id BIGSERIAL PRIMARY KEY,
encounter_id BIGINT NOT NULL,
patient_id BIGINT NOT NULL,
admission_date TIMESTAMP,
discharge_date TIMESTAMP,
admission_diagnosis VARCHAR(200),
discharge_diagnosis VARCHAR(200),
primary_diagnosis_code VARCHAR(50),
other_diagnosis_codes JSONB,
surgery_codes JSONB,
drg_group VARCHAR(50),
drg_weight DECIMAL(10,4),
total_cost DECIMAL(12,2),
self_pay_cost DECIMAL(12,2),
medical_insurance_cost DECIMAL(12,2),
los INT, -- 住院天数
outcome VARCHAR(20), -- 治愈/好转/未愈/死亡/其他
quality_score INT,
quality_level VARCHAR(20), -- 甲级/乙级/丙级
archive_status VARCHAR(20), -- 未归档/已归档/已封存
archive_time TIMESTAMP,
create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
CREATE TABLE sys_medical_record_audit (
id BIGSERIAL PRIMARY KEY,
encounter_id BIGINT NOT NULL,
audit_type VARCHAR(20), -- 运行/终末
audit_item VARCHAR(100),
audit_result VARCHAR(20), -- 合格/不合格
audit_detail TEXT,
auditor_id BIGINT,
audit_time TIMESTAMP,
create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
CREATE TABLE sys_drg_grouping (
id BIGSERIAL PRIMARY KEY,
encounter_id BIGINT NOT NULL,
drg_code VARCHAR(50),
drg_name VARCHAR(200),
drg_weight DECIMAL(10,4),
drg_cost DECIMAL(12,2),
actual_cost DECIMAL(12,2),
profit_loss DECIMAL(12,2),
grouping_time TIMESTAMP,
create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
```
---
#### Sprint 11: 护理评估体系 (5天)
**业务描述**: 多种护理评估量表、护理计划、护理交接班
**三甲依据**: 《护理分级》WS/T 431-2013
**后端开发**:
1. `NursingAssessmentService` — 护理评估
- 入院护理评估入院8小时内完成
- Braden压疮风险评估自动评分
- Morse跌倒风险评估自动评分
- NRS2002营养风险评估
- NRS/VAS疼痛评估
- Caprini VTE风险评估
- Barthel自理能力评估
- 评估时间轴(动态变化追踪)
2. `NursingPlanService` — 护理计划
- 护理诊断(基于评估结果推荐)
- 护理目标设定
- 标准护理措施库
- 病种标准护理计划模板
3. `NursingHandoverService` — 护理交接班
- 交接班记录
- 患者信息汇总
- 重点患者交接
**前端开发**:
1. 护理评估量表工作台(自动评分)
2. 护理计划制定界面
3. 护理交接班界面
4. 评估趋势图
**数据库设计**:
```sql
-- Flyway: V2026_011__nursing_assessment.sql
CREATE TABLE sys_nursing_assessment (
id BIGSERIAL PRIMARY KEY,
encounter_id BIGINT NOT NULL,
patient_id BIGINT NOT NULL,
assessment_type VARCHAR(50), -- 入院/Braden/Morse/NRS2002/NRS/Caprini/Barthel
assessment_score INT,
risk_level VARCHAR(20), -- 低危/中危/高危/极高危
assessment_data JSONB, -- 评估详细数据
assessor_id BIGINT,
assessment_time TIMESTAMP,
next_assessment_time TIMESTAMP,
status VARCHAR(20), -- 有效/已更新/已过期
create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
CREATE TABLE sys_nursing_plan (
id BIGSERIAL PRIMARY KEY,
encounter_id BIGINT NOT NULL,
patient_id BIGINT NOT NULL,
nursing_diagnosis VARCHAR(200),
nursing_goal TEXT,
nursing_interventions JSONB,
plan_template_id BIGINT,
planner_id BIGINT,
plan_time TIMESTAMP,
review_status VARCHAR(20), -- 待审核/已审核/已驳回
reviewer_id BIGINT,
create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
CREATE TABLE sys_nursing_handover (
id BIGSERIAL PRIMARY KEY,
department_id BIGINT NOT NULL,
shift_type VARCHAR(20), -- 白班/小夜/大夜
handover_time TIMESTAMP,
handover_nurse_id BIGINT,
receiver_nurse_id BIGINT,
patient_summary JSONB, -- 患者交接信息
key_patients JSONB, -- 重点患者
pending_items JSONB, -- 待办事项
status VARCHAR(20), -- 进行中/已完成
create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
```
---
### Phase 3: 数据集成与标准化3周
> 目标:满足互联互通四级甲等要求
#### Sprint 12: 患者主索引(EMPI) (3天)
**业务描述**: 统一患者身份标识、跨系统患者信息匹配
**三甲依据**: 互联互通四级甲等基础
**后端开发**:
1. `EMPIPatientService` — 患者主索引
- 患者身份信息标准化
- 跨系统患者信息匹配EMPI算法
- 患者身份合并/拆分
- 患者身份变更追溯
2. `EMPIPractitionerService` — 医护人员主索引
- 统一医护人员标识
- 资质信息管理
3. `MasterDataService` — 主数据管理
- 科室字典标准化
- 诊疗项目目录标准化
- 药品目录标准化
- 疾病编码(ICD-10)标准化
- 手术编码(ICD-9-CM-3)标准化
**数据库设计**:
```sql
-- Flyway: V2026_012__empi_master_data.sql
CREATE TABLE sys_empi_patient (
id BIGSERIAL PRIMARY KEY,
empi_id VARCHAR(50) NOT NULL UNIQUE, -- 全局唯一患者标识
patient_id BIGINT, -- 原系统患者ID
id_card VARCHAR(50),
name VARCHAR(100),
gender CHAR(1),
birth_date DATE,
phone VARCHAR(20),
address TEXT,
identity_source VARCHAR(50), -- 来源系统
merge_status VARCHAR(20), -- 正常/已合并/已拆分
create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
update_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
CREATE TABLE sys_icd10_catalog (
id BIGSERIAL PRIMARY KEY,
icd_code VARCHAR(20) NOT NULL,
icd_name VARCHAR(200),
category VARCHAR(50),
validity_status VARCHAR(20),
effective_date DATE,
expiration_date DATE,
create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
CREATE TABLE sys_icd9cm3_catalog (
id BIGSERIAL PRIMARY KEY,
procedure_code VARCHAR(20) NOT NULL,
procedure_name VARCHAR(200),
category VARCHAR(50),
validity_status VARCHAR(20),
create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
```
---
#### Sprint 13: 数据集成平台(ESB) (5天)
**业务描述**: 系统间数据交换、消息路由、服务注册
**三甲依据**: 互联互通四级甲等核心
**后端开发**:
1. `ESBMessageService` — 消息总线
- HL7 FHIR R4 消息格式
- 消息路由、格式转换
- 消息可靠性保障(存储转发、确认机制)
2. `ESBServiceRegistryService` — 服务注册
- 服务注册与发现
- 接口版本管理
- 接口文档自动生成
3. `ESBMonitorService` — 集成监控
- 消息流量监控
- 接口调用日志
- 异常告警
4. `CDADocumentService` — CDA文档生成
- 入院记录CDA
- 出院记录CDA
- 检验报告CDA
- 检查报告CDA
- 处方CDA
- 手术记录CDA
- 护理记录CDA
**数据库设计**:
```sql
-- Flyway: V2026_013__esb_integration.sql
CREATE TABLE sys_esb_message (
id BIGSERIAL PRIMARY KEY,
message_id VARCHAR(100) NOT NULL UNIQUE,
message_type VARCHAR(50),
source_system VARCHAR(50),
target_system VARCHAR(50),
message_content TEXT,
message_format VARCHAR(20), -- HL7/FHIR/CDA
status VARCHAR(20), -- 待发送/发送中/已发送/发送失败/已确认
retry_count INT DEFAULT 0,
error_message TEXT,
send_time TIMESTAMP,
ack_time TIMESTAMP,
create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
CREATE TABLE sys_esb_service_registry (
id BIGSERIAL PRIMARY KEY,
service_name VARCHAR(100),
service_version VARCHAR(20),
service_endpoint VARCHAR(500),
service_description TEXT,
service_status VARCHAR(20), -- 启用/停用/维护中
create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
```
---
### Phase 4: 智能化与决策支持3周
> 目标提升电子病历评级至4级以上
#### Sprint 14: 危急值管理系统 (3天)
**业务描述**: 检验危急值自动识别→弹窗→确认→处置→闭环
**三甲依据**: 医疗质量安全核心制度
**后端开发**:
1. `CriticalValueService` — 危急值管理
- 危急值规则配置(项目/上下限)
- 检验结果自动匹配危急值
- 危急值弹窗通知
- 危急值确认记录
- 危急值处置闭环
- 危急值统计分析
**前端开发**:
1. 危急值弹窗组件
2. 危急值处置界面
3. 危急值统计报表
---
#### Sprint 15: 电子病历结构化 (5天)
**业务描述**: 结构化病历、病历模板、修改留痕、版本管理
**三甲依据**: 电子病历应用管理规范
**后端开发**:
1. `StructuredEMRService` — 结构化病历
- 结构化病历模板引擎
- 病历字段自动填充
- 病历完整性检查
2. `EMRVersionService` — 版本管理
- 病历修改留痕
- 历史版本保存
- 版本对比
3. `EMRTemplateService` — 病历模板
- 系统模板管理
- 科室模板管理
- 个人模板管理
---
#### Sprint 16: 医保智能审核 (5天)
**业务描述**: 医保规则引擎、事前/事中/事后审核、DRG/DIP优化
**三甲依据**: 医保基金使用监督管理条例
**后端开发**:
1. `InsuranceAuditService` — 医保智能审核
- 事前审核(开方时拦截)
- 事中审核(住院中监控)
- 事后审核(结算后稽核)
2. `DRGOptimizationService` — DRG/DIP优化
- 主诊断编码推荐
- 主手术编码推荐
- 费用结构优化建议
---
## 三、测试计划
### 每个Sprint测试要求
| 测试类型 | 内容 | 工具 |
|---|---|---|
| **接口测试** | 所有API端点正常/异常/边界 | JUnit + HTTP |
| **白盒测试** | Service层方法覆盖 | Mockito + JUnit |
| **黑盒测试** | 业务流程完整性 | 端到端测试 |
| **冒烟测试** | 核心功能可用性 | 手动+自动化 |
| **回归测试** | 原有功能不受影响 | 全量接口测试 |
### 测试用例设计原则
1. **正常流程测试**: 每个API至少1个正常用例
2. **边界条件测试**: 空值/极值/特殊字符
3. **异常处理测试**: 无权限/参数错误/数据不存在
4. **数据一致性测试**: 事务完整性
5. **性能测试**: 并发场景(可选)
---
## 四、实施路线图
```
Phase 1 (Week 1-3): 核心安全模块
├── Sprint 7: 合理用药系统 (5天)
├── Sprint 8: 手术麻醉系统 (5天)
└── Sprint 9: 院感管理系统 (5天)
Phase 2 (Week 4-6): 病案与护理
├── Sprint 10: 病案管理系统 (5天)
└── Sprint 11: 护理评估体系 (5天)
Phase 3 (Week 7-9): 数据集成
├── Sprint 12: EMPI + 主数据 (3天)
└── Sprint 13: ESB集成平台 (5天)
Phase 4 (Week 10-12): 智能化
├── Sprint 14: 危急值管理 (3天)
├── Sprint 15: 电子病历结构化 (5天)
└── Sprint 16: 医保智能审核 (5天)
总计: 12周 (约3个月)
总用例数: 预计 300+ 个接口测试
```
---
## 五、质量保障
### 5.1 开发规范
1. **不修改原有函数签名** — 扩展功能通过新建Service/AppService实现
2. **数据库变更通过Flyway** — 所有新建表和字段使用Flyway版本化管理
3. **代码审查** — 每个PR必须经过Code Review
4. **单元测试** — Service层覆盖率≥80%
### 5.2 铁律
1. 修改完必须测试才能提交
2. 新建表和字段必须通过Flyway
3. 测试通过后才提交代码
4. 前后端API路径必须对齐
5. 每个Sprint完成后进行完整回归测试
---
> **文档版本**: v1.0
> **最后更新**: 2026-06-06

View File

@@ -1,210 +0,0 @@
# 广西三甲医院 HIS 系统功能设计文档
> 参考标准:
> - 《医院信息系统功能基本规范》(卫生部)
> - 《三级医院评审标准(2022年版)》信息化部分
> - 《电子病历应用管理规范(试行)》
> - 《医院信息平台技术规范》(WS/T 500)
> - 互联互通标准化成熟度测评四级甲等要求
> - 广西壮族自治区卫生健康信息化"十四五"规划
---
## 一、门诊管理模块 (Outpatient)
### 1.1 门诊挂号 (Registration)
| 功能 | 说明 | 三甲要求 |
|---|---|---|
| 普通挂号 | 支持科室/医生/时段多维度挂号 | ✅必须 |
| 预约挂号 | 支持电话/网络/现场预约,分时段预约 | ✅必须 |
| 挂号退号 | 退号退费,限当日退号 | ✅必须 |
| 号源管理 | 号源池管理,限号/加号/停诊 | ✅必须 |
| 多身份挂号 | 医保/自费/公费/商业保险 | ✅必须 |
| 就诊卡管理 | 发卡/补卡/换卡/挂失 | ✅必须 |
| 排班管理 | 医生排班/停诊/替班 | ✅必须 |
### 1.2 门诊医生工作站 (Doctor Workstation)
| 功能 | 说明 | 三甲要求 |
|---|---|---|
| 候诊患者列表 | 按就诊顺序排列,显示患者基本信息 | ✅必须 |
| 病历书写 | 主诉/现病史/既往史/体格检查/辅助检查 | ✅必须(电子病历≥4级) |
| 诊断录入 | ICD-10编码,主诊断+副诊断 | ✅必须 |
| 处方开具 | 西药/中成药/中药饮片处方 | ✅必须 |
| 检验申请 | LIS检验项目申请,条码打印 | ✅必须 |
| 检查申请 | PACS检查项目申请 | ✅必须 |
| 治疗申请 | 治疗/手术/操作申请 | ✅必须 |
| 医嘱管理 | 长期医嘱/临时医嘱,医嘱审核 | ✅必须 |
| 处方审核 | 药师审核处方,合理用药提醒 | ✅必须 |
| 模板管理 | 个人/科室/全院病历模板 | 推荐 |
| 诊断知识库 | 诊断建议,鉴别诊断 | 推荐 |
### 1.3 门诊收费 (Billing)
| 功能 | 说明 | 三甲要求 |
|---|---|---|
| 门诊收费 | 处方/检查/治疗费用收取 | ✅必须 |
| 多支付方式 | 现金/银行卡/微信/支付宝/医保 | ✅必须 |
| 发票管理 | 电子发票/纸质发票 | ✅必须 |
| 退费管理 | 部分退费/全部退费,退费审批 | ✅必须 |
| 费用查询 | 患者费用明细查询 | ✅必须 |
| 日结管理 | 收款员日结/月结 | ✅必须 |
| 欠费管理 | 记账/催缴/坏账处理 | 推荐 |
### 1.4 门诊药房 (Pharmacy)
| 功能 | 说明 | 三甲要求 |
|---|---|---|
| 处方接收 | 自动接收门诊处方 | ✅必须 |
| 配药发药 | 按处方配药,核对发药 | ✅必须 |
| 退药管理 | 退药退回药房 | ✅必须 |
| 处方点评 | 抗菌药物/重点监控药品点评 | ✅必须 |
| 用药安全 | 过敏提醒/配伍禁忌/重复用药 | ✅必须 |
| 药品效期 | 近效期预警/过期药品管理 | ✅必须 |
| 毒麻药品 | 专柜存放,双人核对 | ✅必须 |
---
## 二、住院管理模块 (Inpatient)
### 2.1 住院登记 (Admission)
| 功能 | 说明 | 三甲要求 |
|---|---|---|
| 入院登记 | 患者信息录入,医保类型确认 | ✅必须 |
| 床位管理 | 床位分配/转床/包床 | ✅必须 |
| 押金管理 | 押金收取/补交/退押 | ✅必须 |
| 预交金管理 | 预交金查询/催缴 | ✅必须 |
| 出院登记 | 出院结算/出院带药 | ✅必须 |
### 2.2 住院医生工作站 (Inpatient Doctor)
| 功能 | 说明 | 三甲要求 |
|---|---|---|
| 入院记录 | 入院记录书写,24小时内完成 | ✅必须(电子病历≥4级) |
| 病程记录 | 首次病程/日常病程/上级查房 | ✅必须 |
| 医嘱开立 | 长期/临时医嘱,医嘱套餐 | ✅必须 |
| 医嘱审核 | 护士审核/药师审核 | ✅必须 |
| 手术申请 | 术前讨论/手术审批/手术安排 | ✅必须 |
| 会诊申请 | 科内/科间/全院/院外会诊 | ✅必须 |
| 输血申请 | 输血申请/输血反应记录 | ✅必须 |
| 死亡记录 | 死亡病例讨论记录 | ✅必须 |
| 知情同意 | 知情同意书电子签署 | ✅必须 |
### 2.3 住院护士工作站 (Nurse Station)
| 功能 | 说明 | 三甲要求 |
|---|---|---|
| 医嘱执行 | 医嘱审核/执行/停止 | ✅必须 |
| 护理记录 | 生命体征/出入量/护理评估 | ✅必须 |
| 体温单 | 电子体温单,自动绘制 | ✅必须(电子病历≥4级) |
| 标本采集 | 标本采集/条码打印/送检 | ✅必须 |
| 药品领取 | 病区药品领取/退药 | ✅必须 |
| 费用录入 | 护士站记费/材料费 | ✅必须 |
| 交接班 | 护士交接班记录 | ✅必须 |
| 责任护理 | 责任护士分管患者 | ✅必须 |
| 护理评估 | 入院评估/压疮评估/跌倒评估 | ✅必须 |
### 2.4 住院收费 (Inpatient Billing)
| 功能 | 说明 | 三甲要求 |
|---|---|---|
| 费用汇总 | 按类别/项目汇总 | ✅必须 |
| 中途结算 | 住院中途结算 | ✅必须 |
| 出院结算 | 出院总结算,多支付方式 | ✅必须 |
| 医保结算 | 医保实时结算/手工报销 | ✅必须 |
| 费用清单 | 每日费用清单/住院费用明细 | ✅必须 |
| 费用审核 | 大额费用审核/异常费用提醒 | 推荐 |
---
## 三、药品管理模块 (Drug Management)
### 3.1 药品基础数据
| 功能 | 说明 | 三甲要求 |
|---|---|---|
| 药品目录 | 药品字典,国药准字/规格/厂家 | ✅必须 |
| 药品分类 | 西药/中成药/中药饮片/外用/毒麻 | ✅必须 |
| 基础代谢 | 给药途径/用药频次/疗程 | ✅必须 |
| 供应商管理 | 药品供应商/资质证照管理 | ✅必须 |
### 3.2 药品采购
| 功能 | 说明 | 三甲要求 |
|---|---|---|
| 采购计划 | 科室请购/药房汇总/审批 | ✅必须 |
| 采购订单 | 生成采购单/供应商确认 | ✅必须 |
| 入库验收 | 到货验收/质量检查/入库 | ✅必须 |
| 退货管理 | 质量问题退货 | ✅必须 |
### 3.3 药品库存
| 功能 | 说明 | 三甲要求 |
|---|---|---|
| 库存查询 | 实时库存/批号/效期 | ✅必须 |
| 出入库管理 | 入库/出库/调拨/报损 | ✅必须 |
| 盘点管理 | 定期盘点/盈亏处理 | ✅必须 |
| 效期管理 | 近效期预警(3月/6月) | ✅必须 |
| 高值耗材 | 高值耗材追溯管理 | ✅必须 |
---
## 四、检验检查模块 (Lab & PACS)
### 4.1 LIS 检验系统
| 功能 | 说明 | 三甲要求 |
|---|---|---|
| 申请接收 | 接收门诊/住院检验申请 | ✅必须 |
| 标本采集 | 条码打印/采集确认 | ✅必须 |
| 标本接收 | 标本签收/不合格退回 | ✅必须 |
| 结果录入 | 仪器接口/手工录入/审核 | ✅必须 |
| 危急值管理 | 危急值报告/处理/追踪 | ✅必须 |
| 报告审核 | 初审/复审/修改 | ✅必须 |
| 报告查询 | 历史报告对比 | ✅必须 |
### 4.2 PACS 影像系统
| 功能 | 说明 | 三甲要求 |
|---|---|---|
| 申请接收 | 接收检查申请 | ✅必须 |
| 登记排队 | 检查登记/排队叫号 | ✅必须 |
| 影像采集 | DICOM影像采集 | ✅必须 |
| 报告书写 | 结构化报告/模板 | ✅必须 |
| 影像浏览 | DICOM Viewer | ✅必须 |
| 报告审核 | 书写/审核/修改 | ✅必须 |
---
## 五、运营监管模块 (Operations)
### 5.1 质控管理
| 功能 | 说明 | 三甲要求 |
|---|---|---|
| 病案质控 | 病案首页质控/运行病历质控 | ✅必须 |
| 抗菌药物监测 | 使用率/使用强度/送检率 | ✅必须 |
| DRGs/DIP监控 | 病组/费用/权重监控 | ✅必须 |
| 合理用药 | 处方点评/用药监控 | ✅必须 |
### 5.2 统计分析
| 功能 | 说明 | 三甲要求 |
|---|---|---|
| 门诊统计 | 门诊量/收入/科室统计 | ✅必须 |
| 住院统计 | 出入院/床位使用率/均费 | ✅必须 |
| 药品统计 | 药占比/基本药物比例 | ✅必须 |
| 医保统计 | 医保费用/结算/对账 | ✅必须 |
---
## 六、电子病历评级要求 (EMR Level 4+)
三甲医院要求电子病历应用水平≥4级:
| 级别 | 要求 |
|---|---|
| 3级 | 医疗文书统一管理,关键信息可用 |
| 4级 | 中级医疗决策支持,闭环管理 |
| 5级 | 高级医疗决策支持,知识库 |
| 6级 | 全流程医疗信息闭环 |
| 7级 | 健康信息整合,区域协同 |
---
## 七、互联互通要求 (四级甲等)
| 要素 | 要求 |
|---|---|
| 数据集标准化 | HL7 FHIR / CDA 2.0 |
| 术语标准化 | ICD-10 / SNOMED CT / LOINC |
| 接口规范 | RESTful API / Web Service |
| 数据交换 | 消息队列 / ESB |
| 安全认证 | CA认证 / 电子签名 |

View File

@@ -1,243 +0,0 @@
# HIS项目Bug修复记录 v1.0
> **编制人:** 陈琳
> **编制日期:** 2026-05-01
> **统计范围:** 2026-04-01 至 2026-05-01
> **项目版本:** HealthLink-HIS v2.0
> **文档版本:** v1.0
---
## 一、修复概览
| 指标 | 数量 |
|------|------|
| Bug修复总次数 | 约 **80+** 次(含合并提交) |
| 涉及Bug编号 | #249 ~ #472(含部分无编号修复) |
| 参与修复人员 | 关羽、赵云、张飞、刘备、诸葛亮、华佗、陈琦等 |
| 涉及模块 | 门诊医生站、住院医生站、检验申请、检查申请、手术计费、门诊划价、预约挂号、会诊管理、疾病报卡、用户管理等 |
---
## 二、修复记录明细
### 2.1 门诊医生站模块
| Bug # | 问题描述 | 修复人 | 修复日期 | Commit |
|-------|---------|--------|---------|--------|
| #449/#450 | 门诊医生站接诊/数据加载失败 — TodayOutpatientServiceImpl中receivePatient/completeVisit/cancelVisit方法为空壳 | 关羽 | 2026-04-28 | `9b86557` |
| #451 | 门诊医生站-提交新增手术申请后列表刷新失败 | 赵云 | 2026-04-28 | `d1be841` |
| #456 | 门诊医生站医嘱类型和状态异常 | 关羽 | 2026-04-29 | `ec89ead` |
| #395 | 疾病报告卡添加撤销审核功能 / 前端调用与Controller重复映射 | 张飞/刘备/关羽 | 2026-04-23 | `988c17c` `2a8e662` `6962a8b` |
| #396/#397 | 前端编译报错 - useUserStore导入方式错误 | 赵云 | 2026-04-23 | `87d4214` `17e148c` |
| #398/#399 | 门诊预约已预约和已取号记录不应被时间过滤 | 刘备 | 2026-04-23 | `2a8e662` `6962a8b` |
| #405/#406/#408 | 前端多处界面缺陷 | 赵云 | 2026-04-22 | `72c0cea` |
| #412 | 门诊医生站传染病报告卡保存失败(添加临时卡号生成避免空值) | 刘备 | 2026-04-23 | `2d55387` |
| #413 | 医生个人报卡管理界面统一弹窗宽度1100px+标题对齐门诊医生站) | 刘备 | 2026-04-23 | `9c48744` |
| #330 | 门诊医生站诊断保存失败 | 陈琦 | 2026-04-03 | `22de02f` |
| #282 | 医嘱TAB页面总量字段的单位显示数字/给药途径字段的值显示不全 | his-dev | 2026-04-15 | `6922aa1` |
| #368 | 门诊医生站待写病历标签页功能冗余 | aprilry | 2026-04-15 | `4e2097f` |
| #366 | 手术医嘱逻辑错误,"待签发"状态的手术医嘱提前流转至收费端 | his-dev | 2026-04-15 | `e294952` |
| #333/#335/#336 | 医嘱保存报错 — 添加practitionerId/founderOrgId自动补全 | 关羽 | 2026-04-06 | `098aae5` |
### 2.2 检验申请模块
| Bug # | 问题描述 | 修复人 | 修复日期 | Commit |
|-------|---------|--------|---------|--------|
| #469 | 检验申请操作列临床业务逻辑 | 关羽 | 2026-05-01 | `97b4e39` |
| #459 | 检验申请报错仍生成记录 | 关羽 | 2026-04-29 | `136235f` `c2cac12` |
| #465 | 检验项目列表限制500项 | 关羽 | 2026-04-29 | `783ee48` |
| #414 | 检验项目列表加载缓慢 — 优化分页查询性能 | 关羽 | 2026-04-24 | `d525a50` |
| #415 | 项目单价显示负数问题 — 添加价格非负验证 | 关羽 | 2026-04-23 | `5d97975` |
| #416/#423 | 检验/检查申请单布局调整(左右布局+宽度优化) | 刘备 | 2026-04-23 | `2475841` |
| #420 | 检验申请单项目列表显示售价/单位 | 刘备 | 2026-04-23 | `2786769` |
| #428 | 检查申请分类联动功能 / selectedItems.push缺少isPackage和packageId字段 | 赵云 | 2026-04-30~05-01 | `616aa46` `2174323` |
| #326 | 检验申请单套餐项目回充数据不完整 — 后端补全套餐信息,前端树形展开 | aprilry | 2026-04-15 | `4e2097f` |
| #328 | 检验申请单生成的医嘱签发失败 | aprilry | 2026-04-13 | `d99daa3` |
| #329 | 检验申请执行科室默认值设置错误 | aprilry | 2026-04-15 | `4e2097f` |
| #334 | 检验申请界面顶部操作栏占用空间过大 — 按钮移至卡片头部 | 赵云 | 2026-04-06 | `720cac8` |
### 2.3 检查申请模块
| Bug # | 问题描述 | 修复人 | 修复日期 | Commit |
|-------|---------|--------|---------|--------|
| #407/#385 | 检查申请医嘱分类错误致数据库报错 / 预结算账户验证修复 | 关羽/诸葛亮/aprilry | 2026-04-23 | `acc59ab` `78bcdef` `95e379e` |
| #418/#419/#421/#424 | 检查申请发往科室未自动赋值/下拉无数据 — 修复科室数据源接口 | 关羽/诸葛亮 | 2026-04-23~24 | `03e89e0` `1242d41` |
| #422 | 检查申请单项目列表显示单价/单位 | 刘备 | 2026-04-23 | `2786769` |
| #425 | 检查申请申请单号显示自动生成 | 刘备 | 2026-04-23 | `2786769` |
| #426 | 检查申请单已选择列表支持树形展开显示套餐明细 | 刘备 | 2026-04-23 | `adc89a5` |
| #427 | 检查项目分类手风琴展开 | 赵云 | 2026-04-25 | `7bccbc7` |
| #429 | 检查方法字段不应自动预填 | 赵云 | 2026-04-24 | `091b6e8` |
| #430 | 检查申请套餐金额变更联动 | 赵云 | 2026-04-24 | `72e1f92` |
| #462 | 诊疗目录标本下拉框无数据 | 关羽 | 2026-04-29 | `decac54` |
| #376 | 检查页签申请单列表过滤异常,显示历史检查就诊记录 | 1677036288@qq.com | 2026-04-16 | `210c463` |
| #377 | 检查申请单"执行科室"未获取配置默认值且字段交互逻辑不规范 | 1677036288@qq.com | 2026-04-16 | `210c463` |
| #384 | 检查方法联动功能完善,增加套餐价格查询和项目卡片展开选择 | aprilry | 2026-04-21 | `994ffcb` |
### 2.4 手术计费/手术申请模块
| Bug # | 问题描述 | 修复人 | 修复日期 | Commit |
|-------|---------|--------|---------|--------|
| #432 | 门诊手术安排新增保存报错 — 修复登录用户null校验缺失导致NPE | 关羽 | 2026-04-24 | `dc7e3c1` |
| #436/#438 | 手术计费显示问题 — 修复chargeItemContext条件判断尾随空格 / 门诊划价选'西药'无数据 | 关羽 | 2026-04-24~29 | `e7beb3f` `fd1880f` |
| #437 | 手术计费重复记录修复 | 赵云 | 2026-04-25 | `7bccbc7` |
| #442 | 手术计费删除待签发耗材报错 | 关羽 | 2026-04-25 | `d79690a` |
| #443 | 手术计费签发耗材报错 | 关羽 | 2026-04-25 | `7d1e50d` |
| #445 | 门诊手术待生成列表未剔除已生成医嘱 | 关羽 | 2026-04-25 | `290e8f8` |
| #447 | 住院医生站手术申请弹窗无法加载手术类诊疗目录数据 / 申请单adviceTypes格式错误 | 关羽 | 2026-04-25~05-01 | `059ef48` `701f5fe` |
| #453/#455 | 申请单adviceTypes格式错误 | 关羽 | 2026-05-01 | `701f5fe` |
| #457 | 门诊收费手术医嘱不显示名称 | 关羽 | 2026-04-29 | `e1ad496` |
| #470 | 手术/输血申请单加载项目耗时过长 | 关羽 | 2026-04-30 | `d62ac41` |
| #471 | 手术申请查询混入脏数据 | 关羽 | 2026-04-29 | `b424d73` |
| #472 | 住院医生站手术申请单勾选无效 | 关羽 | 2026-04-29 | `caa45c3` |
| #249 | 门诊手术安排查询未过滤已删除手术申请单 — LEFT JOIN改INNER JOIN | 关羽 | 2026-04-28 | `405a9df` |
| #375 | 住院医生站签发按钮提示语错误,显示"保存成功"且签发业务未实现 | 1677036288@qq.com | 2026-04-16 | `210c463` |
| #320 | 手术管理-门诊手术安排:新增手术安排界面的就诊卡号取值错误 | his-dev | 2026-04-08 | `a894f0f` |
### 2.5 门诊划价模块
| Bug # | 问题描述 | 修复人 | 修复日期 | Commit |
|-------|---------|--------|---------|--------|
| #448 | 门诊划价项目分类过滤失效 — 耗材和诊疗查询缺少categoryCode过滤条件 | 关羽 | 2026-04-25 | `4beb4c4` |
| #338 | 门诊划价新增时未校验就诊状态 — 未接诊患者也可新增划价项目 | 华佗 | 2026-04-05~09 | `8deefd2` `efc97c8` `5497c99` |
### 2.6 预约挂号模块
| Bug # | 问题描述 | 修复人 | 修复日期 | Commit |
|-------|---------|--------|---------|--------|
| #343 | 门诊预约挂号:系统未校验重复预约 | his-dev | 2026-04-08 | `5d28064` |
| #344 | 取消预约后重新获取医生余号数据 / 前端状态过滤字段映射 / 时间过滤 | 赵云/关羽 | 2026-04-09 | `4d976ad` `c210d57` `82951fe` |
| #337 | 挂号时间显示异常 — SQL别名register_time改为registerTime | 关羽 | 2026-04-06 | `054f4c3` |
### 2.7 住院医生站模块
| Bug # | 问题描述 | 修复人 | 修复日期 | Commit |
|-------|---------|--------|---------|--------|
| #402 | 住院医生站诊断录入:保存后列表出现重复记录且元数据缺失 | 关羽 | 2026-04-22 | `cd54a39` |
| #403/#404 | 住院医生工作站:应用医嘱组套后药品明细字段丢失 / 医嘱组套编辑字段回显丢失 | 关羽/诸葛亮 | 2026-04-22~30 | `e2808fd` `0cfdce0` `81daacd` |
| #363 | 入科时间编辑时同步更新就诊表start_time字段 / 入院日期选择器改为datetime类型 | 关羽/赵云 | 2026-04-08~22 | `063eb1f` `d663c46` `4142723` |
| #362 | 添加入科时间字段并修正显示 | 赵云 | 2026-04-09 | `0cb6ebe` |
| #364 | 修正病历号列绑定字段为patientBusNo / 添加病历号搜索支持 | 赵云 | 2026-04-09 | `583a77f` `d8511ec` |
| #417 | 住院护士站记账页面空白 — 补充provide handleGetPrescription修复inject失败 | 刘备 | 2026-04-23 | `1fc2032` |
| #439 | 领用出库总库存数量未显示 | 赵云 | 2026-04-24 | `b53cdfa` |
| #440 | 用户管理修改提交报错hasOwnProperty | 赵云 | 2026-04-24 | `fe2a797` |
| #431/#433/#434/#435 | 前端多处界面缺陷批量修复 | 赵云 | 2026-04-24 | `22b47fc` |
### 2.8 会诊管理模块
| Bug # | 问题描述 | 修复人 | 修复日期 | Commit |
|-------|---------|--------|---------|--------|
| #280 | 会诊申请单打印逻辑修复 — 点击具体记录打印该条,不传参数时打印全部 | 刘备 | 2026-04-24 | `6b6e56c` |
| #388/#409/#410 | 会诊意见格式化存储,确保参加医师和意见完整回显 | aprilry | 2026-04-24 | `76094d6` |
### 2.9 其他模块
| Bug # | 问题描述 | 模块 | 修复人 | 修复日期 | Commit |
|-------|---------|------|--------|---------|--------|
| #355 | 预约签到性别字段回显不一致 | 预约挂号 | 关羽 | 2026-04-06 | `7827e58` |
| #363(入院时间) | 入院时间早于申请时间校验 | 住院登记 | 关羽 | 2026-04-08 | `4142723` |
| #444 | 计费药品列表未显示药品名称 | 住院医生站 | 赵云 | 2026-05-01 | `97d0011` |
| #446 | 临时医嘱提交后弹窗关闭逻辑 | 住院医生站 | 赵云 | 2026-05-01 | `70726f6` |
| #375 | 签发按钮提示语错误 | 住院医生站 | 1677036288@qq.com | 2026-04-16 | `210c463` |
| #380/#381 | 临床诊断获取主诊断字段名修正 | 门诊医生站 | aprilry | 2026-04-21 | `994ffcb` |
| #382 | 选择项目后保持当前页签状态 | 门诊医生站 | aprilry | 2026-04-21 | `994ffcb` |
| #386 | 检验申请删除时同步删除关联收费项目 | 门诊医生站 | aprilry | 2026-04-21 | `994ffcb` |
| #387 | 套餐项目回充默认展开并自动加载明细 | 门诊医生站 | aprilry | 2026-04-21 | `994ffcb` |
| #441 | 手术室护士站相关 | — | — | — | (待修复) |
| #454 | 删除"待签发"检验项目触发校验失败 | 检验申请 | — | — | (待修复) |
| N/A | register.vue构建失败 — 替换不存在的login-background.jpg | 前端构建 | 张飞 | 2026-04-24 | `0d11d41` |
| N/A | bloodTransfusion.vue构建报错 — public.js补充getDepartmentList导出 | 前端构建 | 赵云/张飞/诸葛亮 | 2026-04-24 | `8c05782` `d27b514` `4fb540c` |
| N/A | PostgreSQL时间函数CAST语法错误修正 | 后端SQL | 关羽 | 2026-04-09 | `9238044` |
| N/A | 前端获取版本号bug | 前端 | 1677036288@qq.com | 2026-04-29 | `b536ead` |
---
## 三、按修复人统计
| 修复人 | 修复Bug数量估算 | 主要模块 |
|--------|-------------------|---------|
| **关羽** | ~25 | 门诊医生站、检验申请、手术计费、检查申请、预约挂号 |
| **赵云** | ~20 | 住院医生站、前端界面、检验申请 |
| **刘备** | ~10 | 疾病报卡、检查申请、检验申请 |
| **诸葛亮** | ~5 | 检查申请、构建门禁文档 |
| **张飞** | ~4 | 前端构建修复、E2E测试 |
| **华佗** | ~2 | 门诊划价就诊状态校验 |
| **aprilry** | ~8 | 检验申请、检查申请、会诊管理 |
| **陈琦** | ~2 | 门诊医生站诊断保存、日期格式化 |
| **his-dev** | ~3 | 手术安排、门诊划价、重复预约 |
---
## 四、按严重程度统计
| 严重级别 | 数量 | 说明 |
|---------|------|------|
| 🔴 阻塞性 | ~8 | 导致页面空白、系统崩溃、数据丢失 |
| 🟠 功能性 | ~45 | 功能异常、数据不正确 |
| 🟡 体验性 | ~20 | UI布局、显示异常 |
| 🟢 优化类 | ~10 | 性能优化、代码规范 |
---
## 五、典型修复案例分析
### 案例1Bug #407 — 检查申请医嘱分类错误
**问题:** 检查申请被错误归类为药品类型,导致数据库报错和预结算失败。
**修复方案:**
- 后端 ExamApplyController 使用 ItemType 枚举正确分类
- DoctorStationAdviceAppService 按枚举标准分类医嘱
- IChargeBillService 补充 productId=0 时从 contentJson 获取项目名称
- PaymentRecService 预结算自动修复账户不存在的历史数据
**影响模块:** ExamApplyController、DoctorStationAdviceAppService、IChargeBillService、PaymentRecService
### 案例2Bug #449/#450 — 门诊医生站接诊数据加载失败
**问题:** TodayOutpatientServiceImpl 中 receivePatient/completeVisit/cancelVisit 方法为空壳实现。
**修复方案:** 改为调用 DoctorStationMainAppService 正确业务逻辑。
### 案例3Bug #326 — 检验申请单套餐项目回充数据不完整
**问题:** 套餐项目回充时缺少套餐明细信息。
**修复方案:**
- 后端回充时查询 LabActivityDefinition 补全套餐信息
- DTO 新增 activityId、feePackageId、isPackage、sampleType、unit 字段
- 前端实现套餐项目树形展开,懒加载套餐明细
---
## 六、待修复Bug清单
| Bug # | 问题描述 | 严重级别 | 状态 |
|-------|---------|---------|------|
| #454 | 删除"待签发"检验项目触发校验失败 | 🔴 阻塞性 | Active |
| #449 | 点击接诊患者报"数据加载失败" | 🔴 阻塞性 | 部分修复 |
| #430 | 检查申请套餐金额变更联动 | 🟠 功能性 | 进行中 |
| #441 | 手术室护士相关问题 | 🟠 功能性 | Active |
---
## 七、基础设施改进
| 改进项 | 说明 | 贡献人 | 日期 |
|--------|------|--------|------|
| Playwright E2E测试框架 | 12个测试用例全部通过 | 张飞/刘备 | 2026-04-25 |
| Husky pre-commit钩子 | 提交前自动执行前端构建检查 | 刘备/张飞 | 2026-04-24 |
| ESLint import规则 | 实时检测缺失导出,防止构建失败 | 诸葛亮 | 2026-04-24 |
| 构建门禁文档 | 三份构建门禁文档完善 | 诸葛亮 | 2026-04-24 |
---
## 八、修订记录
| 版本 | 日期 | 修订人 | 修订内容 |
|------|------|--------|---------|
| v1.0 | 2026-05-01 | 陈琳 | 初始版本汇总2026年4月全月Bug修复记录 |
---
> **说明:** 本文档基于Git提交记录自动生成可能存在遗漏或归类不准确之处请各修复人核实补充。

View File

@@ -1,186 +0,0 @@
# HealthLink-HIS 菜单功能分析报告
> 分析时间: 2026-06-05
> 分析方法: 数据库菜单树 + 前端视图文件 + 后端API 三方交叉比对
## 一、总体概况
| 指标 | 数量 |
|---|---|
| 总菜单数 | ~180 |
| 启用的页面菜单 | ~120 |
| 后端 Controller | 230 个 |
| 前端视图文件 | 209 个 |
| **空壳视图 (22 bytes)** | **26 个** |
| **缺失视图组件** | **18 个** |
| **无组件路径 (portal)** | **~50 个** |
---
## 二、问题分类
### 🔴 A类: 启用但完全无功能 (点击404或空白) — 优先级高
| # | 模块 | 菜单名 | 组件路径 | 状态 |
|---|---|---|---|---|
| 1 | 基础数据 | 服务目录 | `catalog/service/index` | 空壳 |
| 2 | 基础数据 | 客户数据 | `basicmanage/customer/index` | 空壳(禁用) |
| 3 | 基础数据 | 合同管理 | `basicmanage/contract/index` | 空壳(禁用) |
| 4 | 基础数据 | LIS合管配置 | `basicmanage/lisMerge/index` | 空壳(禁用) |
| 5 | 业务规则 | 自动计算 | `basicmanage/automaticBilling/index` | 空壳(禁用) |
| 6 | 业务规则 | 划价组套 | `basicmanage/bargainSets/index` | 空壳(禁用) |
| 7 | 门诊管理 | 门诊退药 | `clinicmanagement/withdrawal/index` | 空壳 |
| 8 | 门诊管理 | 门诊退号 | `clinicmanagement/refundNumber/index` | 空壳 |
| 9 | 门诊管理 | 申请单管理 | `clinicmanagement/requisition/index` | 空壳 |
| 10 | 门诊管理 | 结果查看 | `clinicmanagement/lisPascResult/index` | 空壳 |
| 11 | 门诊管理 | 门诊退费 | `clinicmanagement/consultationRefund/index` | 空壳 |
| 12 | 门诊管理 | 收费详情查询 | `clinicmanagement/chargeDetail/index` | 空壳 |
| 13 | 门诊管理 | 医嘱查看与打印 | `clinicmanagement/orderViewPrint/index` | 空壳 |
| 14 | 住院管理 | 病案管理 | `inHospitalManagement/medicalRecord/index` | 空壳(禁用) |
| 15 | 住院管理 | 费用清单 | `inHospitalManagement/listFee/index` | 空壳(禁用) |
| 16 | 住院管理 | 手术管理 | `inHospitalManagement/surgeryManage/index` | 空壳(禁用) |
| 17 | 住院管理 | 入院诊断 | `inHospitalManagement/inpatientDiagnosis/index` | 空壳 |
| 18 | 住院管理 | 医嘱管理 | `inHospitalManagement/orderManage/index` | 空壳 |
| 19 | 目录对照 | LIS对照 | `vue` (占位) | 缺失 |
| 20 | 目录对照 | PACS对照 | `vue` (占位) | 缺失 |
| 21 | 目录对照 | 诊断对照 | `vue` (占位) | 缺失 |
| 22 | 收费管理 | 门诊收费结算 | `charge/registerRecords` | 空壳 |
| 23 | 收费管理 | 排班管理 | `charge/schedule` | 空壳 |
| 24 | 库房管理 | 货位管理 | `medicationmanagement/locationManagement/index` | 缺失 |
| 25 | 易用性配置 | 中医处方 | `basicmanage/tcmPrescription` | 空壳 |
| 26 | 易用性配置 | 常用诊断 | `basicmanage/commonlyDiagnosis` | 空壳 |
| 27 | 易用性配置 | 床位管理 | `basicmanage/bedspace` | 空壳 |
| 28 | 易用性配置 | 费用配置 | `basicmanage/fee` | 空壳 |
### 🟡 B类: 有菜单但完全无组件 (portal/占位) — 优先级中
| 模块 | 菜单数 | 示例 |
|---|---|---|
| 住院收费 | 4 | 费用管理、住院收费详情、中途结算 |
| 调价管理 | 2 | 调价单管理、调价盈亏记录 |
| 药房管理 | 2 | 退药管理、皮试管理 |
| 医保管理 | ~20 | 医保结算、医保对账、DRG等 |
| 统计报表 | ~10 | 工作量统计、收费报表 |
| 药品追溯 | 7 | 商品删除、库存查询等 |
| 外接系统 | 5 | 电子发票、LIS、PASC等 |
### 🟢 C类: 已禁用的待开发模块 — 优先级低
| 模块 | 菜单名 |
|---|---|
| 患者管理 | 患者档案管理(父级禁用) |
| 基础数据 | 部门管理、客户数据 |
| 住院管理 | 病案管理、费用清单、住院日结 |
| 药房管理 | 住院发药、住院汇总发药、住院退药 |
| 门诊管理 | 发药管理、电子处方审批 |
---
## 三、开发实现计划
### Phase 1: 门诊核心闭环 (4周)
> 目标: 门诊挂号→就诊→开方→收费→发药 全链路无死角
| 优先级 | 功能 | 前端 | 后端 | 工时 |
|---|---|---|---|---|
| P0 | 门诊退号 | withdrawal/index | OutpatientRefund | 2天 |
| P0 | 门诊退药 | clinicmanagement/withdrawal | ReturnMedicine | 2天 |
| P0 | 门诊退费 | consultationRefund | OutpatientRefund | 2天 |
| P0 | 收费详情查询 | chargeDetail | ChargeBill | 1天 |
| P0 | 申请单管理 | requisition | RequestFormManage | 2天 |
| P0 | 结果查看 | lisPascResult | Laboratory/Inspection | 2天 |
| P0 | 医嘱查看与打印 | orderViewPrint | AdviceManage | 2天 |
| P1 | 门诊收费结算 | registerRecords | OutpatientCharge | 3天 |
| P1 | 排班管理 | charge/schedule | DoctorSchedule | 2天 |
**Phase 1 小计: ~18天**
### Phase 2: 基础数据补全 (3周)
> 目标: 目录管理、基础配置完整可用
| 优先级 | 功能 | 前端 | 后端 | 工时 |
|---|---|---|---|---|
| P0 | 服务目录 | catalog/service | Catalog | 2天 |
| P0 | 货位管理 | locationManagement | Location | 2天 |
| P1 | LIS对照 | 新建 | Catalog | 3天 |
| P1 | PACS对照 | 新建 | Catalog | 3天 |
| P1 | 诊断对照 | 新建 | DiseaseManage | 2天 |
| P2 | 客户数据 | customer | Customer | 2天 |
| P2 | 合同管理 | contract | Contract | 2天 |
**Phase 2 小计: ~16天**
### Phase 3: 住院核心补全 (3周)
> 目标: 住院医嘱→执行→收费 闭环
| 优先级 | 功能 | 前端 | 后端 | 工时 |
|---|---|---|---|---|
| P0 | 医嘱管理 | orderManage | AdviceManage | 3天 |
| P0 | 入院诊断 | inpatientDiagnosis | Diagnosis | 2天 |
| P0 | 手术管理 | surgeryManage | Surgery | 3天 |
| P1 | 病案管理 | medicalRecord | MedicalRecord | 3天 |
| P1 | 费用清单 | listFee | InpatientCharge | 2天 |
| P1 | 中途结算 | 新建 | InpatientCharge | 2天 |
**Phase 3 小计: ~15天**
### Phase 4: Flowable工作流 (2周)
> 目标: 流程引擎功能可用
| 优先级 | 功能 | 前端 | 后端 | 工时 |
|---|---|---|---|---|
| P1 | 流程定义 | flowable/definition | FlowDefinition | 2天 |
| P1 | 流程表单 | flowable/task/form | SysForm | 2天 |
| P1 | 待办任务 | flowable/task/todo | FlowTask | 2天 |
| P1 | 已办任务 | flowable/task/finished | FlowTask | 1天 |
| P2 | 流程表达式 | flowable/expression | SysExpression | 1天 |
| P2 | 流程监听 | flowable/listener | SysListener | 1天 |
**Phase 4 小计: ~9天**
### Phase 5: 统计报表 (2周)
> 目标: 核心运营数据可视化
| 优先级 | 功能 | 前端 | 后端 | 工时 |
|---|---|---|---|---|
| P1 | 日结结算单 | dayEndSettlement | DayEndSettlement | 3天 |
| P1 | 医生工作量统计 | 新建 | ReportStatistics | 2天 |
| P1 | 收费结算报表 | 新建 | ChargeReport | 2天 |
| P2 | 发药统计 | 新建 | ReportStatistics | 2天 |
| P2 | 库存结余 | statisticalManagement | InventoryDetails | 1天 |
**Phase 5 小计: ~10天**
### Phase 6: 外接系统对接 (3周)
> 目标: 医保、追溯、电子发票等外部接口
| 优先级 | 功能 | 前端 | 后端 | 工时 |
|---|---|---|---|---|
| P2 | 医保结算 | 新建 | YbInpatient | 5天 |
| P2 | 医保目录对照 | 新建 | Yb | 3天 |
| P2 | 药品追溯码 | traceabilityCode | TraceNoManage | 2天 |
| P3 | 电子发票 | 新建 | EleInvoice | 3天 |
| P3 | DRG结算 | 新建 | Yb | 3天 |
**Phase 6 小计: ~16天**
---
## 四、总计
| Phase | 内容 | 工时 |
|---|---|---|
| Phase 1 | 门诊核心闭环 | 18天 |
| Phase 2 | 基础数据补全 | 16天 |
| Phase 3 | 住院核心补全 | 15天 |
| Phase 4 | Flowable工作流 | 9天 |
| Phase 5 | 统计报表 | 10天 |
| Phase 6 | 外接系统对接 | 16天 |
| **合计** | | **~84天 (约17周)** |
## 五、建议
1. **优先 Phase 1+3** — 门诊和住院是核心业务闭环,缺功能直接影响使用
2. **Phase 2 穿插进行** — 基础数据是其他模块的依赖
3. **Phase 4-6 按需** — 工作流、报表、外接系统可逐步迭代
4. **禁用菜单先不急** — 标注"待开发"的菜单已禁用,不影响用户操作

View File

@@ -1,188 +0,0 @@
# MyBatis Plus 升级方案
> **编制日期**: 2026-06-04
> **当前版本**: 3.5.5
> **目标版本**: 3.5.16 (最新稳定版, 2026-01-11)
> **Spring Boot**: 2.5.15(保持不变,不升级)
---
## 一、兼容性分析
### 关键发现
| 项目 | 3.5.5 | 3.5.16 | 结论 |
|---|---|---|---|
| `mybatis-spring` | 2.1.2 | 2.1.2 | ✅ 一致 |
| `spring-boot-dependencies` BOM | 2.7.15 | 2.7.18 | ⚠️ BOM 导入,需处理 |
| `mybatis-plus-boot-starter` | 存在 | 存在 | ✅ 兼容 Spring Boot 2.x |
| `mybatis-plus-spring-boot3-starter` | 存在 | 存在 | 我们不用 |
### BOM 冲突处理
MyBatis Plus 3.5.16 的 `mybatis-plus-boot-starter``dependencyManagement` 中导入了 `spring-boot-dependencies:2.7.18` BOM。这**可能覆盖**我们项目中由 `spring-boot-starter-parent:2.5.15` 管理的依赖版本。
**解决方案:在父 pom.xml 中显式锁定关键依赖版本**
```xml
<!-- 在 healthlink-his-server/pom.xml 的 <properties> 中添加 -->
<!-- 锁定 Spring Boot 管理的核心依赖版本,防止被 BOM 覆盖 -->
<spring-boot.version>2.5.15</spring-boot.version>
<spring-boot-dependencies.version>2.5.15</spring-boot-dependencies.version>
```
**更安全的方案:在父 pom.xml 中覆盖 BOM**
```xml
<!-- 在 <dependencyManagement> 中添加,优先级高于 BOM 导入 -->
<dependencyManagement>
<dependencies>
<!-- 覆盖 Spring Boot BOM锁定 2.5.15 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>${spring-boot.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
```
---
## 二、升级收益
### 🔴 重要 Bug 修复
| Bug | 影响 |
|---|---|
| 多租户查询问题 | ⭐⭐⭐ 我们用了多租户插件 |
| 租户插件 exists 语句失效 | ⭐⭐⭐ exists 子查询场景 |
| 逻辑删除 + 乐观锁冲突 | ⭐⭐⭐ 我们同时用了这两个特性 |
| 批量操作异步异常 | ⭐⭐ 批量导入场景 |
| Db count 返回 null 空指针 | ⭐⭐ 统计查询 |
| 动态 SQL 注释导致合并错误 | ⭐⭐ 复杂 SQL |
### 🟢 新增能力
| 功能 | 说明 |
|---|---|
| `LambdaUpdateWrapper.setIncrBy/setDecrBy` | 字段自增自减 |
| `BaseMapper` 批量操作 + `InsertOrUpdate` | 批量导入增强 |
| `UpdateWrapper.checkSqlInjection` | SQL 注入防护 |
| `deleteByIds` 空集合处理 | 防空指针 |
| `DynamicTableNameJsqlParserInnerInterceptor` | 动态表处理 |
| `OrderItem.withExpression` | 表达式排序 |
### 📦 自动获得的依赖升级
| 组件 | 旧版本 | 新版本 |
|---|---|---|
| MyBatis | 3.5.13 | 3.5.19 |
| JSqlParser | 4.6 | 5.2 |
| jackson | 2.16 | 2.20.1 |
| PostgreSQL | 42.2.27 | 42.7.8 |
---
## 三、升级步骤
### Step 1: 修改版本号
```xml
<!-- pom.xml -->
<mybatis-plus.version>3.5.5</mybatis-plus.version>
<!-- 改为 -->
<mybatis-plus.version>3.5.16</mybatis-plus.version>
```
### Step 2: 添加 BOM 覆盖(关键!)
`healthlink-his-server/pom.xml``<dependencyManagement>` 中添加:
```xml
<!-- 覆盖 MyBatis Plus 导入的 Spring Boot BOM保持 2.5.15 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>2.5.15</version>
<type>pom</type>
<scope>import</scope>
</dependency>
```
### Step 3: 编译验证
```bash
cd healthlink-his-server
mvn clean compile -DskipTests
```
### Step 4: 功能验证清单
| 验证项 | 测试方法 | 通过标准 |
|---|---|---|
| 登录 | 输入账号密码 | 登录成功 |
| 分页查询 | 访问列表页 | 分页正常 |
| 新增 | 提交表单 | 数据写入 |
| 编辑 | 修改并保存 | 数据更新 |
| 删除 | 删除记录 | 软删除成功 |
| 批量操作 | 批量新增/删除 | 全部成功 |
| 多租户 | 切换租户 | 数据隔离正确 |
| 乐观锁 | 并发更新 | 冲突检测正确 |
| 导出 | Excel 导出 | 文件正常 |
### Step 5: 提交代码
```bash
git add healthlink-his-server/pom.xml
git commit -m "chore(deps): MyBatis Plus 3.5.5 → 3.5.16"
git push origin develop
```
---
## 四、回滚方案
如果升级后出现问题:
```bash
# 1. 改回旧版本
<mybatis-plus.version>3.5.5</mybatis-plus.version>
# 2. 删除 BOM 覆盖(如果添加了)
# 3. 重新编译
mvn clean package -DskipTests
# 4. 重启服务
```
---
## 五、风险评估
| 风险 | 概率 | 影响 | 缓解措施 |
|---|---|---|---|
| BOM 版本覆盖 | 中 | 高 | 显式锁定 Spring Boot 版本 |
| 依赖冲突 | 低 | 中 | `mvn dependency:tree` 检查 |
| API 变化 | 低 | 低 | 3.5.x 无 Breaking Changes |
| 分页插件变化 | 低 | 中 | 测试分页查询 |
---
## 六、执行计划
```
Step 1: 修改版本号 (2 分钟)
Step 2: 添加 BOM 覆盖 (2 分钟)
Step 3: mvn clean compile (2 分钟)
Step 4: mvn clean package -DskipTests (2 分钟)
Step 5: 重启后端 (1 分钟)
Step 6: 功能验证 (30 分钟)
Step 7: 提交代码 (1 分钟)
```
**总工时**: 约 40 分钟

View File

@@ -1,275 +0,0 @@
# RuoYi 3.9.2 前端合入清单
> **编制日期**: 2026-06-04
> **基线**: RuoYi-Vue3 v3.9.2 (2026-03-26)
> **目标**: 从 RuoYi 3.9.2 合入高价值前端组件,不破坏现有业务
---
## 执行原则
1. **渐进式合入** — 每次只合一个组件,验证通过再合下一个
2. **保留业务代码**`com.healthlink.his.*` 目录不动,只改脚手架层
3. **兼容优先** — 优先合入无侵入的独立组件
4. **验证必做** — 每步完成后跑 `npm run dev` + 核心页面冒烟
---
## Phase A: 基础设施修复0.5 天)
### A.1 修复 router4 过期写法 `next()`
| 项 | 内容 |
|---|---|
| **文件** | `src/permission.js` |
| **变更** | `next()``return { path: '/' }` / `return true` / `return false` |
| **参考** | RuoYi 3.9.2 `src/permission.js` 第 1-76 行 |
| **风险** | 🟡 中 — 所有路由跳转都经过这里 |
| **验证** | 登录→首页→各菜单跳转→返回→刷新→404页→白名单 |
**具体变更点:**
```
// 旧写法 (我们当前)
router.beforeEach((to, from, next) => {
if (getToken()) {
if (to.path === '/login') {
next({ path: '/' })
} else {
if (useUserStore().roles.length === 0) {
// ...
next({ ...to, replace: true })
} else {
next()
}
}
} else {
next(`/login?redirect=${to.fullPath}`)
}
})
// 新写法 (RuoYi 3.9.2)
router.beforeEach(async (to, from) => {
if (getToken()) {
if (to.path === '/login') {
return { path: '/' }
}
if (useUserStore().roles.length === 0) {
// ...
return { ...to, replace: true }
}
return true
} else {
return `/login?redirect=${to.fullPath}`
}
})
```
---
### A.2 引入通配符白名单匹配
| 项 | 内容 |
|---|---|
| **文件** | `src/utils/validate.js` |
| **变更** | 新增 `isPathMatch(pattern, path)` 函数 |
| **参考** | RuoYi 3.9.2 `src/utils/validate.js` |
| **风险** | 🟢 低 — 纯新增函数 |
| **验证** | 白名单路径 `/login``/register` 仍正常 |
---
## Phase B: 核心组件合入2-3 天)
### B.1 TreePanel 树分割组件
| 项 | 内容 |
|---|---|
| **来源** | RuoYi 3.9.2 `src/components/TreePanel/` |
| **目标** | 我们的 `src/components/TreePanel/`(新建) |
| **依赖** | Element Plus Tree + Table |
| **风险** | 🟢 低 — 独立组件,不影响现有代码 |
| **验证** | 新建一个测试页面引入 TreePanel确认左右分栏正常 |
**HIS 适用场景:**
- 基础管理 → 组织机构(左树右表)
- 基础管理 → 药品目录(左分类右列表)
- 数据字典 → 分类管理
- 病区管理 → 病区/床位
---
### B.2 ExcelImportDialog 导入组件
| 项 | 内容 |
|---|---|
| **来源** | RuoYi 3.9.2 `src/components/ExcelImportDialog/` |
| **目标** | 我们的 `src/components/ExcelImportDialog/`(新建) |
| **依赖** | Element Plus Dialog + Upload |
| **风险** | 🟢 低 — 独立组件 |
| **验证** | 上传 Excel → 预览 → 确认导入 |
**HIS 适用场景:**
- 基础管理 → 药品批量导入
- 基础管理 → 诊断目录导入
- 基础管理 → 医保目录同步
- 患者管理 → 批量建档
---
### B.3 锁屏功能
| 项 | 内容 |
|---|---|
| **来源** | RuoYi 3.9.2 |
| **涉及文件** | `src/store/modules/lock.js`(新增)<br>`src/views/lock.vue`(新增)<br>`src/permission.js`(加锁屏拦截)<br>`src/store/modules/user.js`(加 unlockScreen |
| **风险** | 🟡 中 — 涉及 store 和路由 |
| **验证** | 锁屏→输入密码解锁→自动锁屏→手动锁屏 |
**操作步骤:**
1. 复制 `lock.js``src/store/modules/`
2. 复制 `lock.vue``src/views/`
3. 修改 `permission.js` 添加锁屏路由检查
4. 修改 `user.js` 登录成功后调用 `unlockScreen()`
5. 在 Navbar 添加锁屏按钮
---
### B.4 密码规则校验
| 项 | 内容 |
|---|---|
| **来源** | RuoYi 3.9.2 `src/utils/passwordRule.js` |
| **目标** | 我们的 `src/utils/passwordRule.js`(新增) |
| **风险** | 🟢 低 — 独立工具函数 |
| **验证** | 修改密码页测试密码强度校验 |
---
## Phase C: Layout 增强1-2 天)
### C.1 HeaderNotice 顶部通知
| 项 | 内容 |
|---|---|
| **来源** | RuoYi 3.9.2 `src/layout/components/HeaderNotice/` |
| **目标** | 我们的 `src/layout/components/HeaderNotice/`(新增) |
| **依赖** | 我们已有的通知公告接口 |
| **风险** | 🟢 低 — 新增组件 |
| **验证** | 顶部显示通知铃铛 → 点击展开通知列表 |
---
### C.2 TopBar 顶部工具栏
| 项 | 内容 |
|---|---|
| **来源** | RuoYi 3.9.2 `src/layout/components/TopBar/` |
| **目标** | 我们的 `src/layout/components/TopBar/`(新增) |
| **风险** | 🟡 中 — 需要修改 `layout/index.vue` 引入 |
| **验证** | 顶部工具栏显示搜索、全屏、通知等 |
---
### C.3 Copyright 版权组件
| 项 | 内容 |
|---|---|
| **来源** | RuoYi 3.9.2 `src/layout/components/Copyright/` |
| **目标** | 我们的 `src/layout/components/Copyright/`(新增) |
| **风险** | 🟢 低 |
| **验证** | 侧边栏底部显示版权信息 |
---
## Phase D: 持久化标签页增强0.5 天)
### D.1 TagsView 持久化
| 项 | 内容 |
|---|---|
| **文件** | `src/store/modules/tagsView.js` |
| **变更** | 从 RuoYi 3.9.2 复制增强版 |
| **新增功能** | 刷新后保持标签页状态、Chrome 风格标签页 |
| **风险** | 🟡 中 — 替换现有 store |
| **验证** | 打开多个标签 → 刷新页面 → 标签页仍在 → 关闭浏览器重开 → 标签页恢复 |
---
## Phase E: 后端小版本升级30 分钟)
### E.1 依赖版本升级
| 组件 | 当前 | 升级到 | 文件 |
|---|---|---|---|
| Druid | 1.2.27 | 1.2.28 | `pom.xml` |
| Fastjson2 | 2.0.58 | 2.0.61 | `pom.xml` |
| OSHI | 6.6.5 | 6.10.0 | `pom.xml` |
| Commons IO | 2.13.0 | 2.21.0 | `pom.xml` |
| BouncyCastle | bcprov-jdk15on 1.69 | bcprov-jdk18on 1.80 | `pom.xml` |
**操作:**
```bash
cd healthlink-his-server
mvn clean package -DskipTests
# 验证启动正常
```
---
## Phase F: 前端依赖升级30 分钟)
### F.1 版本号更新
| 组件 | 当前 | 升级到 | 风险 |
|---|---|---|---|
| vue-router | ^4.3.0 | ^4.6.4 | 🟢 低 |
| echarts | ^5.4.3 | ^5.6.0 | 🟢 低 |
| element-plus | ^2.14.1 | 保持 | ✅ 我们更新 |
| @vueuse/core | ^14.3.0 | 保持 | ✅ 我们更新 |
**操作:**
```bash
cd healthlink-his-ui
npm install vue-router@^4.6.4 echarts@^5.6.0
npm run dev # 验证无报错
```
---
## 执行顺序
```
Day 1 上午: A.1 (permission.js router4 修复) + A.2 (validate.js)
Day 1 下午: E.1 (后端小版本升级) + F.1 (前端依赖升级)
Day 2 上午: B.1 (TreePanel) + B.2 (ExcelImportDialog)
Day 2 下午: B.3 (锁屏功能) + B.4 (密码规则)
Day 3 上午: C.1 (HeaderNotice) + C.2 (TopBar) + C.3 (Copyright)
Day 3 下午: D.1 (TagsView 持久化) + 全量验证
```
---
## 验证清单
每步完成后逐项检查:
- [ ] `npm run dev` 无报错
- [ ] 登录页正常
- [ ] 首页加载正常
- [ ] 菜单导航正常
- [ ] 各业务模块页面正常(至少抽查 5 个)
- [ ] 表格渲染正常VXE Table
- [ ] 打印功能正常vue-plugin-hiprint
- [ ] 权限控制正常hasPermi 指令)
---
## 风险控制
| 风险 | 缓解 |
|---|---|
| permission.js 改坏导致无法登录 | 备份当前文件,改完立即测试登录流程 |
| store 变更导致状态丢失 | 测试登录→刷新→各页面切换 |
| 新组件与现有样式冲突 | 先在独立页面测试,确认无冲突再引入 layout |
| npm 依赖冲突 | 锁版本,避免自动升级无关依赖 |

View File

@@ -1,85 +0,0 @@
# HealthLink-HIS 组件升级日志
> 每次升级后在此记录,方便跨 session 追踪进度。
---
## RuoYi 3.9.2 前端合入进度
### Phase A: 基础设施修复
- [x] A.1 permission.js router4 过期写法修复 ✅ 2026-06-04
- [x] A.2 validate.js 通配符匹配 isPathMatch ✅ 2026-06-04
### Phase B: 核心组件合入
- [x] B.1 TreePanel 树分割组件 ✅ 2026-06-04
- [x] B.2 ExcelImportDialog 导入组件 ✅ 2026-06-04
- [x] B.3 锁屏功能 (lock.js + lock.vue) ✅ 2026-06-04
- [x] B.4 密码规则校验 (passwordRule.js) ✅ 2026-06-04
### Phase C: Layout 增强
- [x] C.1 HeaderNotice 顶部通知 ✅ 2026-06-04
- [x] C.2 TopBar 顶部工具栏 ✅ 2026-06-04
- [x] C.3 Copyright 版权组件 ✅ 2026-06-04
### Phase D: 持久化标签页
- [x] D.1 TagsView 持久化增强 ✅ 2026-06-04
### Phase E: 后端小版本升级
- [ ] E.1 Druid 1.2.27 → 1.2.28
- [ ] E.1 Fastjson2 2.0.58 → 2.0.61
- [ ] E.1 OSHI 6.6.5 → 6.10.0
- [ ] E.1 Commons IO 2.13.0 → 2.21.0
- [ ] E.1 BouncyCastle 1.69 → 1.80
### Phase F: 前端依赖升级
- [x] F.1 vue-router ^4.3.0 → 4.6.4 ✅ 2026-06-04
- [x] F.1 echarts ^5.4.3 → 5.6.0 ✅ 2026-06-04
---
## 升级记录
### 2026-06-04 RuoYi 3.9.2 前端合入
**变更文件:**
- `src/permission.js` — router4 新写法 + 锁屏检查 + 通配符白名单
- `src/utils/validate.js` — 新增 isPathMatch + isEmpty
- `src/utils/passwordRule.js` — 新增密码规则校验
- `src/store/modules/lock.js` — 新增锁屏 store
- `src/store/modules/tagsView.js` — RuoYi 3.9.2 增强版
- `src/views/lock.vue` — 新增锁屏页面
- `src/router/index.js` — 新增 /lock 路由
- `src/api/login.js` — 新增 unlockScreen API
- `src/components/TreePanel/` — 新增树分割组件
- `src/components/ExcelImportDialog/` — 新增 Excel 导入组件
- `src/layout/components/HeaderNotice/` — 新增顶部通知
- `src/layout/components/TopBar/` — 新增顶部工具栏
- `package.json` — vue-router 4.6.4 + echarts 5.6.0
**验证结果:**
- ✅ npm run build:dev 编译成功 (1m 41s)
- ✅ 前端 HTTP 200
- ✅ API 代理 HTTP 200
- ✅ 1825 文件107M
---
## 后端组件升级进度
### Phase 1: 安全修复
- [x] 1.1 BouncyCastle 1.69 → 1.80 (jdk15on → jdk18on) ✅ 2026-06-04
### Phase 2: 连接池 & 工具库
- [x] 2.1 Druid 1.2.27 → 1.2.28 ✅ 2026-06-04
- [x] 2.2 Fastjson2 2.0.58 → 2.0.61 ✅ 2026-06-04
- [x] 2.3 Hutool 5.3.8 → 5.8.35 ✅ 2026-06-04
### Phase 3: 监控 & IO
- [x] 3.1 OSHI 6.6.5 → 6.10.0 ✅ 2026-06-04
- [x] 3.2 Commons IO 2.13.0 → 2.21.0 ✅ 2026-06-04
- [x] 3.3 PostgreSQL 42.2.27 → 42.7.4 ✅ 2026-06-04
### Phase 5: PDF
- [x] 5.1 itextpdf 5.5.12 → 5.5.13.4 ✅ 2026-06-04

View File

@@ -1,171 +0,0 @@
# HealthLink-HIS 二次开发版本 — 组件升级计划
> **编制日期**: 2026-06-03
> **对比基线**: Gitee `tntlinking-opensource/healthlink-his` 2.0 分支
> **目标**: 在不破坏现有业务的前提下,逐步引入高价值组件升级
---
## 升级原则
1. **独立可验证** — 每个 Phase 完成后必须独立通过编译 + 冒烟测试
2. **不破坏业务** — 一次只升级一个组件,出问题可快速回滚
3. **先补丁后重构** — 小版本升级直接改版本号,大版本升级单独评估
4. **文档同步** — 每次升级后更新 `UPGRADE_LOG.md`
---
## Phase 0: 安全修复(预估 0.5 天)
> 🔴 **最高优先级** — 安全漏洞,必须立即处理
### 0.1 BouncyCastle 1.69 → 1.80
| 项目 | 详情 |
|---|---|
| **文件** | `healthlink-his-server/pom.xml` |
| **变更** | `<bcprov-jdk15on.version>1.69</bcprov-jdk15on.version>` → 删除,改用 jdk18on |
| **新依赖** | `org.bouncycastle:bcprov-jdk18on:1.80` + `org.bouncycastle:bcpkix-jdk18on:1.80` |
| **原因** | 1.69 有已知安全漏洞1.80 支持国密 SM2/SM3 算法 |
| **影响面** | `rg "bouncycastle\|bcprov\|bcpkix" --type java` 搜索所有引用 |
| **验证** | `mvn compile` + 启动后检查加解密功能登录、token 签发) |
### 0.2 vue-router 4.3 → 4.5
| 项目 | 详情 |
|---|---|
| **文件** | `healthlink-his-ui/package.json` |
| **变更** | `"vue-router": "^4.3.0"``"^4.5.1"` |
| **风险** | 低 — 4.x 小版本API 兼容 |
| **验证** | 前端 `npm run dev` → 测试所有页面路由跳转、返回、权限拦截 |
---
## Phase 1: 核心组件升级(预估 1-2 天)
> 🟡 **高价值** — 改动可控,收益明显
### 1.1 echarts 5.4 → 6.0
| 项目 | 详情 |
|---|---|
| **文件** | `healthlink-his-ui/package.json` |
| **变更** | `"echarts": "^5.4.3"``"^6.0.0"` |
| **影响面** | `rg "echarts" --type vue --type js` 搜索所有图表组件 |
| **Breaking Changes** | ECharts 6 主要变更Tree-shaking 更彻底、部分 API 重命名 |
| **验证清单** | 首页统计图表、门诊量趋势、药品销售报表、住院床位占用图 |
| **回滚方案** | 改回 `"^5.4.3"` 即可 |
### 1.2 lodash-es → es-toolkit
| 项目 | 详情 |
|---|---|
| **文件** | `healthlink-his-ui/package.json` + 所有引用文件 |
| **变更** | `"lodash-es": "^4.17.21"` → 删除,添加 `"es-toolkit": "^1.41.0"` |
| **迁移映射** | `_.cloneDeep``cloneDeep``_.debounce``debounce``_.isEqual``isEqual``_.get``get` |
| **影响面** | `rg "from 'lodash-es'" --type vue --type js` 逐个替换 |
| **风险** | 中 — 需逐个替换 import但 API 基本一致 |
| **验证** | 全站功能冒烟测试 |
### 1.3 引入 MapStruct后端
| 项目 | 详情 |
|---|---|
| **文件** | `healthlink-his-server/pom.xml` (parent) + `healthlink-his-application/pom.xml` |
| **新增依赖** | `org.mapstruct:mapstruct:1.5.5.Final` + `mapstruct-processor` + `lombok-mapstruct-binding` |
| **使用方式** | 新增 `@Mapper(componentModel = "spring")` 接口替代 `BeanUtils.copyProperties` |
| **策略** | **渐进式** — 不改造现有代码,仅新功能使用 MapStruct |
| **验证** | `mvn compile` 确认注解处理器工作 |
---
## Phase 2: 富文本 + 数据库迁移(预估 3-5 天)
> 🟢 **中等工作量** — 需要一定的改造
### 2.1 tiptap 富文本编辑器(替代 vue-quill
| 项目 | 详情 |
|---|---|
| **新增依赖** | `@tiptap/vue-3``@tiptap/starter-kit``@tiptap/extension-*` 系列 |
| **替换目标** | `@vueup/vue-quill`(当前用于病历编辑、处方备注等) |
| **影响面** | `rg "vue-quill\|Quill" --type vue` 搜索所有引用 |
| **新增能力** | 表格编辑、图片内嵌、协作编辑、自定义节点 |
| **策略** | 新页面用 tiptap旧页面逐步迁移 |
| **验证** | 病历编辑器、处方备注、各种富文本输入场景 |
### 2.2 引入 Flyway 数据库迁移
| 项目 | 详情 |
|---|---|
| **新增依赖** | `org.flywaydb:flyway-core` + `flyway-database-postgresql` |
| **配置** | `application-dev.yml` 添加 Flyway 配置 |
| **目录** | `src/main/resources/db/migration/` |
| **迁移文件命名** | `V1__init.sql``V2__add_xxx.sql` |
| **策略** | **不对现有表做迁移**,仅新功能的 DDL 用 Flyway 管理 |
| **风险** | 中 — 需确保现有数据库与 Flyway 基线一致 |
| **验证** | 启动时 Flyway 自动执行 → 检查 `flyway_schema_history` 表 |
---
## Phase 3: UI 框架评估(预估 5-10 天,可选)
> ⚪ **长期规划** — 工作量大,收益高但风险也高
### 3.1 Tailwind CSS 引入
| 项目 | 详情 |
|---|---|
| **新增依赖** | `tailwindcss``autoprefixer``postcss` |
| **策略** | **渐进式** — Tailwind 与现有 SCSS 共存,新页面用 Tailwind |
| **影响面** | 全局样式可能冲突,需仔细测试 |
| **建议** | 先在 `help-center` 或独立页面试水 |
### 3.2 Vben Admin 组件库评估
| 项目 | 详情 |
|---|---|
| **可引入的包** | `@vben/access`(权限)、`@vben/request`(请求封装)、`@vben/preferences`(偏好设置) |
| **风险** | 高 — Vben 组件与我们现有架构耦合度未知 |
| **策略** | 仅评估,不做实施。等 Phase 0-2 完成后再决定 |
---
## 升级路线图
```
Week 1: Phase 0 (BouncyCastle + vue-router) ← 立即执行
Week 1: Phase 1.1 (echarts 6) ← 紧随其后
Week 2: Phase 1.2 (es-toolkit) + 1.3 (MapStruct)
Week 3: Phase 2.1 (tiptap) ← 可并行
Week 3: Phase 2.2 (Flyway) ← 可并行
Week 4+: Phase 3 (Tailwind + Vben 评估) ← 按需
```
---
## 升级日志模板
```markdown
## [日期] 升级记录
### 组件: XXX Y.Y → Z.Z
- **Phase**: 0/1/2/3
- **变更文件**: list...
- **验证结果**: ✅ 编译通过 / ✅ 冒烟测试通过
- **回滚方案**: 改回旧版本号
- **备注**: ...
```
---
## 风险矩阵
| 风险 | 概率 | 影响 | 缓解措施 |
|---|---|---|---|
| echarts 6 API 不兼容 | 中 | 高 | 先在测试环境验证所有图表 |
| es-toolkit 行为差异 | 低 | 中 | 逐个替换,每个改完跑测试 |
| Flyway 与现有 SQL 冲突 | 中 | 高 | 设置 baseline不管理已有表 |
| tiptap 与现有编辑器冲突 | 低 | 低 | 新旧共存,逐步迁移 |
| Tailwind 样式覆盖 | 高 | 中 | 使用 CSS Module 隔离 |

View File

@@ -1,33 +0,0 @@
# Bug #632 修复报告
## 基本信息
- **标题**: Bug #632 测试完成,请验收。提出人: chenxj。
- **严重程度**: 待查
- **提出人**: chenxj
- **修复时间**: 15:49:42 ~ 16:01:30
- **修复耗时**: 662.1s
- **Commit**: `213568233222`
## 根因分析
Bug #632 修复完成。核心问题是 JavaScript `&&` 运算符的经典陷阱——当所有条件为 truthy 时,`&&` 返回最后一个操作数(`item.packageName` 字符串 `"肝功能12项"`),而非 `true`。两处 `Boolean()` 强制转换确保 `isPackage` 始终为布尔值。
| #
## 修复文件
.../src/main/java/com/healthlink/his/lab/domain/InspectionPackage.java | 3 +++
.../src/main/java/com/healthlink/his/lab/domain/InspectionPackageDetail.java | 3 +++
## 流程时间线
| 时间 | 智能体 | 事件 | 状态 | 耗时 |
|------|--------|------|------|------|
| 15:49:42 | guanyu | fix_start | ⏳ | 0.0s |
| 16:01:30 | guanyu | fix_done | ✅ | 662.1s |
| 16:01:36 | zhugeliang | analyze_done | ✅ | 0.0s |
|------|--------|------|------|------|
| 16:01:38 | chenlin | doc_done | ✅ | <1s |
## 测试结果
- **结果**: FAIL
- **输出**:
## 全流程完成
诸葛亮分析 guanyu 修复 张飞测试 华佗验收 陈琳归档

View File

@@ -1,35 +0,0 @@
# Bug #634 修复报告
## 基本信息
- **标题**: [系统维护-检验套餐] 保存套餐失败,报 JSON 反序列化日期解析异常 (LocalDateTime)
- **严重程度**: 致命
- **提出人**: chenxj
- **修复时间**: 15:21:28 ~ 15:27:25
- **修复耗时**: 357.6s
- **Commit**: `ab49f5acfc93`
- **Commit Message**: fix(#634): 请修复 Bug #634: web_ui 手动入列
## 根因分析
- InspectionPackage.java 和 InspectionPackageDetail.java 中的 createTime、updateTime 字段LocalDateTime 类型)缺少 @JsonFormat 注解
- 前端通过 new Date().toISOString() 发送 ISO 8601 格式日期字符串(含毫秒 + Z 时区后缀Jackson 反序列化失败
## 修复文件
.../core/framework/config/ApplicationConfig.java | 37 ++++++++++++++++++++--
1 file changed, 35 insertions(+), 2 deletions(-)
## 流程时间线
| 时间 | 智能体 | 事件 | 状态 | 耗时 |
|------|--------|------|------|------|
| 15:21:28 | guanyu | fix_start | ⏳ | - |
| 15:27:25 | guanyu | fix_done | ✅ | 357.6s |
| 15:27:28 | zhugeliang | analyze_done | ✅ | 0.0s |
| 15:27:31 | zhangfei | test_done | ✅ | 0.0s |
| 15:27:33 | huatuo | verify_done | ✅ | 0.0s |
| 15:27:33 | chenlin | doc_done | ✅ | 0.0s |
## 测试结果
- **结果**: ✅ PASS
- **Playwright**: @bug634 无头浏览器测试通过
## 全流程完成
诸葛亮分析 → guanyu 修复 → 张飞测试 → 华佗验收 → 陈琳归档

View File

@@ -1,32 +0,0 @@
# Bug #644 修复报告
## 基本信息
- **标题**: Bug #644 测试完成,请验收。提出人: chenxj。
- **提出人**: chenxj
- **修复时间**: 00:24:37 ~ 00:32:06
- **修复耗时**: 347.9s
- **Commit**: `bd50c58dd`
- **测试结果**: ❌ FAIL
## 根因分析
## 变更摘要
### 根因分析
**Issue 1 — 状态不同步**`getInpatientAdvicePage` 方法中,执行记录(`exePerformRecordList`)的计算被包裹在 `if (exeStatus != null)` 条件内,只有在"医嘱执行"页签(传 `exeStatus` 参数)时才计算。"已校对"页签不传 `exeStatus`,因此执行记录永远不会被
## 修复文件
.../impl/AdviceProcessAppServiceImpl.java | 89 +++++++++++++++-------
.../dto/InpatientAdviceDto.java | 3 +
## 流程时间线
| 时间 | 智能体 | 事件 | 状态 | 耗时 |
|------|--------|------|------|------|
| 00:24:37 | guanyu | fix_start | ⏳ | 0.0s |
| 00:25:39 | guanyu | fix_retry | ❓ | 0.0s |
| 00:32:06 | guanyu | fix_done | ✅ | 347.9s |
| 00:32:09 | zhugeliang | analyze_done | ✅ | 0.0s |
| 00:32:11 | chenlin | doc_done | ✅ | <1s |
## 全流程
诸葛亮分析 guanyu 修复 张飞测试 华佗验收 陈琳归档

View File

@@ -1,119 +0,0 @@
# Bug #439 分析报告
## Bug描述
领用出库:选择领用药品后"总库存数量"列数据未显示
## 数据流分析
1. 用户点击"添加行" → 新增一行totalQuantity 初始化为空字符串 ''
2. 用户在"项目"列通过 PopoverList 选择药品 → 触发 `selectRow(rowValue, index)`
3. `selectRow` 设置药品基本信息,然后调用 `handleLocationClick(1, rowValue, index)`
4. `handleLocationClick` 调用 `getCount({ itemId, orgLocationId })` 获取库存
5. `getCount` 返回 LocationInventoryDto[] 列表,前端通过 `pickBestOrgQuantityRow` 选最大值
6. `applyFromDto` 设置 `r.totalQuantity = d.orgQuantity || 0`
## 根因定位
`selectRow` 函数中第1022-1049行选择药品后
```javascript
form.purchaseinventoryList[index].unitList = rowValue.unitList[0];
```
但后端 `/app-common/inventory-item` 接口返回的 `unitList` 只设置了 `unitCode``minUnitCode`**没有设置 `unitCode_dictText``minUnitCode_dictText`**。
`handleLocationClick``applyFromDto`第1099-1121行
```javascript
r.unitCode = r.unitList.minUnitCode;
r.unitCode_dictText = r.unitList.minUnitCode_dictText; // ← undefined!
if (r.unitCode == r.unitList.minUnitCode) { // ← 这个条件始终为 true
r.price = d.price / r.partPercent || '';
r.price = r.price.toFixed(4);
}
```
关键问题:`r.unitCode` 刚被设为 `r.unitList.minUnitCode`,然后条件 `r.unitCode == r.unitList.minUnitCode` 始终为 true
导致即使价格很小(如 0.05/1=0.05),也会进入这个分支。
但这不是总库存数量未显示的根本原因。
**真正根因:`handleLocationClick` 函数在调用 `getCount` 获取库存数据后,`applyFromDto` 中 `r.totalQuantity = d.orgQuantity || 0` 的赋值逻辑依赖 `d.orgQuantity > 0` 的前置判断。**
查看前端代码流程:
- `selectRow` 设置 `totalQuantity: ''`(新增行时的默认值)
- 然后调用 `handleLocationClick``getCount` → 后端返回数据
- `pickBestOrgQuantityRow` 从返回列表中选出 orgQuantity 最大的记录
- 如果 `d && Number(d.orgQuantity ?? 0) > 0` → 调用 `applyFromDto` → 设置 `r.totalQuantity = d.orgQuantity || 0`
- 如果条件不满足(所有记录 orgQuantity 都为 0 或返回空列表)→ **`applyFromDto` 不被调用** → `r.totalQuantity` 保持空字符串 ''
进一步分析发现:
- 如果后端 `getCount` 返回空列表(该药品在该仓库无库存),`d` 为 null`applyFromDto` 不会被调用
- 但如果该药品在仓库确实有库存,问题可能出在前端数据传递上
**核心问题在于 `unitList` 结构不完整:**
`selectRow``rowValue.unitList` 来自药品列表查询结果,其 `unitList` 由后端 `CommonServiceImpl.getInventoryItemList` 构建,
只包含 `unitCode``minUnitCode`,缺少 `unitCode_dictText``minUnitCode_dictText`
`handleLocationClick``applyFromDto` 中,`r.unitCode``r.unitCode_dictText` 的赋值依赖于 `unitList` 中的字段。
如果 `r.unitList` 是从 `rowValue.unitList[0]` 赋值而来(在 `selectRow` 中),那它应该至少有 `unitCode``minUnitCode`
**但是!** 编辑模式(`getTransferProductDetails`)中,`unitList` 的构建方式不同:
```javascript
form.purchaseinventoryList[index].unitList = e.unitList[0]; // 编辑详情时
```
新增模式(`selectRow`)中:
```javascript
form.purchaseinventoryList[index].unitList = rowValue.unitList[0];
```
两种方式获取的 `unitList` 结构可能不同。
**根本原因:**
`handleLocationClick` 中的 `getCount` API 调用,返回的 `LocationInventoryDto` 确实包含 `orgQuantity`
前端通过 `pickBestOrgQuantityRow` 选出最大值的记录后,调用 `applyFromDto` 设置 `totalQuantity`
如果药品在仓库有库存但 `totalQuantity` 仍为空白,说明 `applyFromDto` 中的 `d.orgQuantity` 可能为 `null`/`undefined`
经检查 `selectInventoryItemInfo` SQL
```sql
SUM(CASE WHEN T1.location_id = #{orgLocationId} THEN T1.quantity ELSE 0 END) AS org_quantity
```
`objLocationId` 为 null/空时WHERE 子句为:
```sql
AND T1.location_id = #{orgLocationId}
```
这意味着查询结果中的所有记录都来自 `orgLocationId` 对应的仓库。
此时 `org_quantity` 应该等于 `SUM(T1.quantity)`
**如果查询结果为空(该药品在该仓库没有库存记录),则前端 `d` 为 null`applyFromDto` 不被调用totalQuantity 保持空字符串。**
但 Bug 的期望是"应实时检索并填充总库存数量"——如果仓库确实没有该药品的库存,那显示空白是合理的。
但如果仓库有库存却未显示说明前端传递的参数orgLocationId 或 itemId有问题。
**最终根因:前端 `handleLocationClick` 函数中,`orgLocationId` 的取值可能为空字符串,**
**导致后端查询时使用空字符串作为 location_id 条件,查不到任何记录。**
```javascript
let orgLocationId = r.sourceLocationId || receiptHeaderForm.headerLocationId || '';
```
虽然 Bug 步骤中说先选了"西药库",但如果 `receiptHeaderForm.headerLocationId` 在 selectRow 时已正确设置,
`r.sourceLocationId` 也应该被设置(在 selectRow 第1037行
```javascript
form.purchaseinventoryList[index].sourceLocationId =
receiptHeaderForm.headerLocationId || form.purchaseinventoryList[index].sourceLocationId || '';
```
**但这里有一个微妙的时序问题:`handleLocationClick` 在 `getPharmacyCabinetList().then()` 内部被调用,**
**但 `handleLocationClick` 是同步执行的,不等待 `getPharmacyCabinetList` 完成。**
**这本身不影响 `orgLocationId` 的取值,因为 `orgLocationId` 不依赖 `getPharmacyCabinetList`。**
## 修复方案
1. 确保 `applyFromDto` 即使在 `orgQuantity` 为 0 时也能被调用,正确显示"0"而不是空白
2. 确保 `unitList` 包含必要的字典文本字段
## 影响范围
- 前端文件healthlink-his-ui/src/views/medicationmanagement/requisitionManagement/requisitionManagement/index.vue
- 涉及函数:`selectRow``handleLocationClick`

View File

@@ -1,44 +0,0 @@
# Bug #462 分析报告
## Bug 描述
[目录管理-诊疗目录] 编辑弹窗中"所需标本"下拉框数据加载失败,显示为"无数据"
## 根因分析
### 数据流追踪
1. 前端组件 `diagnosisTreatmentDialog.vue` 第168-178行渲染"所需标本"下拉框
2. 下拉框选项来自 `specimen_code` 变量第172行 `v-for="category in specimen_code"`
3. `specimen_code` 通过 `proxy.useDict('specimen_code', ...)` 加载第378-386行
4. `useDict` 调用 API `/system/dict/data/type/specimen_code``src/utils/dict.js` 第16行
5. 后端 `SysDictDataController.dictType()` 处理请求第65-73行**无权限校验**
6. 最终查询 `sys_dict_data` 表,条件:`status = '0' AND dict_type = 'specimen_code'`
### 根因
**hisprd生产schema** 中 `sys_dict_data`**缺少 `specimen_code` 字典类型的7条数据记录**
经核实:
- `hisdev` schema`sys_dict_type` + `sys_dict_data`7条均已存在 ✅
- `histest1` schema`sys_dict_type` + `sys_dict_data`7条均已存在 ✅
- `hisprd` schema`sys_dict_type` 存在dict_id=250`sys_dict_data`**0条**
前端 `useDict('specimen_code')` 调用 API 后返回空数组 `[]`,下拉框 `v-for` 遍历空数组,没有任何 `<el-option>` 渲染Element Plus 显示默认空状态文案"无数据"。
**与 Bug #433 对比**Bug #433 是"麻醉方法回显为代码"和"外请专家姓名数据未加载",根因也是字典数据缺失。本次 Bug #462 属于同类问题——字典类型已创建但生产环境的数据记录未同步插入。
## 影响范围
- **前端文件**`healthlink-his-ui/src/views/catalog/diagnosistreatment/components/diagnosisTreatmentDialog.vue`(仅一处引用)
- **后端文件**:无代码变更,纯数据问题
- **数据库表**`hisprd.sys_dict_data`插入7条标本数据
- **影响接口**`GET /system/dict/data/type/specimen_code`
## 修复方案
`hisprd.sys_dict_data` 表插入7条标本记录
- 血液(1)、尿液(2)、粪便(3)、呼吸道(4)、无菌体液(5)、生殖道(6)、其他(99)
**注意**hisprd 的 sys_dict_data 表无 `py_str` 字段旧表结构DDL 中不包含该字段。
## 验证计划
1. 确认 hisprd 中 `sys_dict_data` 存在7条 `specimen_code` 数据status='0')✅ 已验证
2. 重启后端服务(刷新字典缓存)
3. 前端进入诊疗目录编辑弹窗,点击"所需标本"下拉框应显示7条标本选项
4. 选择任意标本后保存,再次编辑应正确回显已选标本

View File

@@ -1,103 +0,0 @@
# Bug #494 分析报告
## Bug 描述
住院医生工作站-检查申请:"申请单名称"字段显示为通用名称"检查申请单",未展示具体检查项目名称。
## 代码分析
### 数据流
1. **保存时**medicalExaminations.vue → saveCheckd → RequestFormManageAppServiceImpl.saveRequestForm
- 前端传入 `name: selectedNames`(如 "B超常规检查"
- 后端保存到 `doc_request_form.name` 字段 ✅
2. **查询时**RequestFormManageAppMapper.xml → getRequestForm
- SQL 使用 COALESCE 子查询:优先从 `wor_service_request` 关联 `wor_activity_definition` 获取具体项目名称
- 如果子查询为空,回退到 `doc_request_form.name` 字段 ✅
3. **详情查询**RequestFormManageAppMapper.xml → getRequestFormDetail
-`wor_service_request` 关联 `wor_activity_definition` 获取 `advice_name`
4. **前端展示**examineApplication.vue → buildApplicationName
- 优先使用 `requestFormDetailList[0].adviceName`
- 回退到 `row.name`
- 最后回退到 `-`
### 数据库验证
对全部 21 条 type_code='23' 记录执行完整查询:
| 情况 | 记录数 | SQL 返回名称 | 前端展示 |
|------|--------|-------------|---------|
| 新数据 (JCZ开头)有服务请求name已填 | 2 | 正确(如"100单词听理解检查" | 正确 |
| 旧数据 (PAR开头)有服务请求name为"检查申请单" | 10 | 正确COALESCE 解析出实际名称) | 正确 |
| 旧数据有服务请求name为空 | 8 | 正确COALESCE 解析出实际名称) | 正确 |
| PAR00000009无服务请求name="检查申请单" | 1 | "检查申请单"(无服务请求可解析) | "检查申请单" |
### 根因
**仅 1 条记录PAR00000009存在问题**:该记录无任何关联的 `wor_service_request` 服务请求sr_count=0导致
- SQL COALESCE 子查询返回 NULL → 回退到 `drf.name` = "检查申请单"
- 详情查询返回空列表 → `buildApplicationName` 回退到 `row.name` = "检查申请单"
这条记录以 PAR 开头(非 JCZ是通过非标准路径创建的脏数据缺少关联的服务请求记录。
**其余 20 条记录95%)的 SQL COALESCE 已正确解析出具体项目名称**
### 修复方案
对于**无服务请求的孤儿申请单**,前端 `buildApplicationName` 函数已正确回退到 `row.name`。问题在于:
1. `row.name` 存储的是通用名称 "检查申请单"
2. 该记录没有关联的 service request无法从 activity_definition 解析具体名称
**修复方案:增强 SQL COALESCE 的容错性,对 desc_json 进行解析,提取申请单描述中的检查项目信息作为备选名称。**
但这不现实——desc_json 只包含表单字段(症状、体征等),不包含项目名称。
**更合理的修复:确保保存时 name 字段始终填入具体项目名称。**
检查 `medicalExaminations.vue` 的 submit 方法:
```js
const selectedNames = applicationListAllFilter.map(item => item.adviceName).join('+');
```
前端传入的 name 是用 `+` 拼接的多个项目名称。这个值被保存到 `doc_request_form.name`
SQL COALESCE 子查询使用 `STRING_AGG(DISTINCT wad.name, '、')`,用 `、` 分隔。
**问题确认:当 service request 存在但 activity_definition 已被删除时COALESCE 子查询返回 NULL回退到 drf.name。但 drf.name 可能为空或为"检查申请单"(旧数据)。**
对于这种 edge case**应该增强 SQL 容错**:当 `drf.name` 也为空或通用名称时,显示更友好的默认文本。
不过,**当前代码对绝大多数场景已经正确工作**。唯一显示"检查申请单"的是 PAR00000009 这条孤儿数据。
## 修复计划
增强前端 `buildApplicationName` 函数的容错性:
- 当 detailList 为空时,检查 `row.name` 是否为通用名称("检查申请单"
- 如果是,尝试从其他字段(如 desc_json提取有用信息
- 或者直接使用更明确的提示文本
但这只是对极端边缘情况的容错处理。根本问题是 PAR00000009 这条脏数据。
## 修复结果:✅ 已成功修复commit fd9309f1
### 修复内容3处改动30行
1. **后端 SQLRequestFormManageAppMapper.xml**
- 原:`drf.NAME` 直接取存储的名称
- 改:`COALESCE((SELECT STRING_AGG(DISTINCT wad.name, '、') FROM wor_service_request LEFT JOIN wor_activity_definition ...), drf.name)`
- 效果:优先从服务请求关联的诊疗定义中动态解析具体项目名称,回退到存储名称
2. **前端展示examineApplication.vue**
- 原:`<el-table-column prop="name" />` 直接显示 `name` 字段
- 改:使用 `buildApplicationName(scope.row)` 函数,优先使用 `requestFormDetailList[0].adviceName`
3. **前端提交medicalExaminations.vue**
- 增加 `adviceName: item.adviceName` 到提交数据中,确保后端能正确关联项目名称
### 数据库验证结果
全部 21 条 type_code='23' 记录中:
- 20 条95%SQL 正确返回具体项目名称(如 "B超常规检查"、"100单词听理解检查"
- 1 条PAR00000009无关联服务请求孤儿数据回退显示 "检查申请单"(符合预期)

View File

@@ -1,78 +0,0 @@
# Bug #498 分析报告
## Bug 描述
【住院医生工作站-检查申请】检查申请列表操作项过于单一,缺失修改/作废/打印/看报告等核心临床操作
## 阶段1深度分析
### 当前代码状态
`examineApplication.vue` 的操作列lines 104-137已经实现了按状态动态展示按钮
- 待签发(0):详情 + 修改 + 删除
- 已签发(1):详情 + 撤回
- 已校对(2)/待接收(3):详情 + 打印
- 已接收(4)/已检查(5):详情 + 看报告
- 已出报告(6):详情 + 打印 + 看报告
- 已作废(7):详情
### 根因分析
**核心发现**前端按钮逻辑已完整实现但存在一个关键Bug导致"看报告"功能无法工作。
#### Bug`handleViewReport` 传递错误的参数
前端代码 (examineApplication.vue:920):
```js
const res = await getTestResult({ prescriptionNo: row.prescriptionNo });
```
后端接口 (DoctorStationAdviceController.java:190-192):
```java
@GetMapping(value = "/test-result")
public R<?> getTestResult(@RequestParam(value = "encounterId") Long encounterId) {
return iDoctorStationAdviceAppService.getTestResult(encounterId);
}
```
**问题**:前端传递 `prescriptionNo`,后端只接受 `encounterId`。Spring 忽略未知参数,`encounterId` 为 null后端直接返回空列表。
后端服务实现 (DoctorStationAdviceAppServiceImpl.java:2357-2376):
```java
public R<?> getTestResult(Long encounterId) {
if (encounterId == null) {
return R.ok(new ArrayList<>()); // encounterId为空时直接返回空列表
}
// ... 查询逻辑 ...
}
```
#### 数据流追踪
1. 前端 `handleViewReport(row)` → 获取 `row.prescriptionNo`
2. 调用 `getTestResult({ prescriptionNo: "JCZ26051600001" })`
3. 后端接收:`encounterId = null`(参数名不匹配,被忽略)
4. 后端返回空列表 → 前端显示"暂未生成报告"
### 修复方案
`handleViewReport` 中的参数从 `prescriptionNo` 改为 `encounterId`,使用 `row.encounterId``patientInfo.value.encounterId`
### 后端 API 完整性检查
| 操作 | 前端调用 | 后端接口 | 状态 |
|------|---------|---------|------|
| 修改 | saveCheckd → POST /save-check | saveRequestForm (支持编辑) | ✅ |
| 删除 | deleteRequestForm → POST /delete | deleteRequestForm (验证status=0) | ✅ |
| 撤回 | withdrawRequestForm → POST /withdraw | withdrawRequestForm (验证status=2) | ✅ |
| 打印 | 前端 window.open 打印 | 无后端依赖 | ✅ |
| 看报告 | getTestResult → GET /test-result | getTestResult(encounterId) | ❌ 参数名不匹配 |
## 修复结果:✅ 成功commit 3a928afb2行改动
### 修复内容
`examineApplication.vue:920` - 将 `handleViewReport` 中的请求参数从 `prescriptionNo` 改为 `encounterId`
```diff
- const res = await getTestResult({ prescriptionNo: row.prescriptionNo });
+ const res = await getTestResult({ encounterId: row.encounterId || patientInfo.value?.encounterId });
```
### 说明
- 操作列的动态按钮逻辑(修改/删除/撤回/打印/看报告)已在之前的提交中完整实现
- 本修复解决了"看报告"功能因参数名不匹配导致始终返回空数据的问题
- 其余操作(修改/删除/撤回/打印)的后端接口参数均正确匹配

View File

@@ -1,162 +0,0 @@
# 后端发布前检查清单
## 📋 基础检查项
### Maven编译验证
- [ ] 本地执行 `mvn compile` 编译通过无ERROR
- [ ] 执行 `mvn package -DskipTests` 打包成功
- [ ] 依赖版本无冲突(`mvn dependency:tree` 检查)
- [ ] 无编译警告(或已有书面说明可忽略)
### 构建产物验证
- [ ] JAR/WAR包生成完整大小合理
- [ ] `application.yml` 等配置文件已打包进产物
- [ ] 第三方依赖jar包完整lib目录无缺失
---
## 🔧 Spring Boot 配置检查
### 多环境配置
- [ ] `application-dev.yml`(开发)配置正确
- [ ] `application-test.yml`(测试)配置正确
- [ ] `application-prod.yml`(生产)配置正确
- [ ] 启动参数 `--spring.profiles.active` 指定正确环境
- [ ] 生产环境未启用devtools热部署
### Actuator安全
- [ ] 生产环境 `/actuator` 端点已禁用或限制访问
- [ ] `/actuator/env``/actuator/heapdump` 等敏感端点已关闭
- [ ] 健康检查端点 `/actuator/health` 返回信息已脱敏
### 启动校验
- [ ] 数据库连接池配置合理HikariCP最大/最小连接数)
- [ ] Redis/消息中间件连接配置正确
- [ ] 启动日志无ERROR级别异常
---
## 🗄️ MyBatis Plus 规范检查
### 实体-表映射
- [ ] 所有实体类标注 `@TableName`,表名与实际一致
- [ ] 主键字段标注 `@TableId(type = IdType.AUTO)` 或对应策略
- [ ] 非表字段标注 `@TableField(exist = false)`
- [ ] 字段命名符合下划线转驼峰规则
### SQL安全
- [ ] 所有查询使用参数化查询(`QueryWrapper` / `LambdaQueryWrapper`
- [ ] 禁止字符串拼接SQL`"WHERE name = '" + name + "'"`
- [ ] 批量操作使用MyBatis Plus `saveBatch` / `updateBatchById`
- [ ] 复杂SQL使用XML映射避免注解内嵌长SQL
### 事务管理
- [ ] 涉及多表写操作的方法标注 `@Transactional`
- [ ] 事务边界合理不包含外部HTTP调用
- [ ] 异常回滚配置正确(`rollbackFor = Exception.class`
- [ ] 事务方法未被同一类内方法直接调用(自调用失效问题)
### 分页插件
- [ ] `PaginationInnerInterceptor` 已正确配置
- [ ] 分页查询使用 `Page<T>` 对象非手动limit/offset
---
## 🔌 RESTful API 设计检查
### 统一返回格式
- [ ] 所有接口返回 `{code, msg, data}` 统一结构
- [ ] 成功返回 `code=200`,业务错误使用自定义错误码
- [ ] 异常通过 `@ControllerAdvice` + `@ExceptionHandler` 统一处理
### HTTP状态码
- [ ] 资源创建返回 `201 Created`
- [ ] 资源删除返回 `204 No Content`
- [ ] 参数校验失败返回 `400 Bad Request`
- [ ] 未认证返回 `401 Unauthorized`
- [ ] 无权限返回 `403 Forbidden`
- [ ] 资源不存在返回 `404 Not Found`
### 参数校验
- [ ] 请求参数使用 `@Valid` / `@Validated` 注解校验
- [ ] 必填字段标注 `@NotBlank` / `@NotNull`
- [ ] 数值范围标注 `@Min` / `@Max`
- [ ] 格式校验使用 `@Pattern`(如手机号、身份证号)
- [ ] 校验失败返回明确错误信息非500堆栈
### API版本管理
- [ ] 接口路径包含版本号(`/api/v1/``/api/v2/`
- [ ] 废弃接口标注 `@Deprecated`,并在文档中说明
- [ ] 不兼容变更必须升级版本号
---
## 🔒 安全与合规检查
### 数据脱敏
- [ ] 患者身份证号在日志中脱敏(`***` 掩码)
- [ ] 患者手机号在日志中脱敏前3后4中间`****`
- [ ] 敏感字段序列化时使用 `@JsonSerialize` 自定义脱敏器
- [ ] 接口返回中非必需字段不暴露如密码、salt
### 权限控制
- [ ] 所有涉及患者数据的接口标注 `@PreAuthorize`
- [ ] 数据级权限校验(医生只能访问本科室患者)
- [ ] 越权访问返回 `403`,非 `404``500`
- [ ] 敏感操作(删除、修改诊断)需二次确认或额外权限
### 审计日志
- [ ] 处方修改记录操作人、时间、变更内容
- [ ] 病历删除操作记录完整审计链
- [ ] 审计日志独立存储,不可被业务用户删除
- [ ] 关键业务操作记录IP地址和操作终端
---
## ⚡ 性能检查
### 数据库查询
- [ ] 无N+1查询问题使用 `JOIN` 或批量查询)
- [ ] 大表查询必须有分页限制
- [ ] 慢查询已优化(执行时间 < 500ms
- [ ] 索引已覆盖高频查询条件
### 接口性能
- [ ] 核心接口响应时间 < 1秒
- [ ] 列表接口支持分页无全量返回
- [ ] 大文件下载使用流式传输非全量加载到内存
---
## 📝 文档与发布准备
### 文档更新
- [ ] API接口文档已同步更新路径参数返回值
- [ ] 数据库变更脚本已提供DDL/DML
- [ ] 配置变更说明已记录新增/修改的配置项
- [ ] 影响范围说明已明确哪些模块哪些接口受影响
### 回滚预案
- [ ] 数据库变更可回滚提供反向SQL脚本
- [ ] 配置变更可快速回退
- [ ] 紧急回滚流程已明确怎么做多长时间
- [ ] 回滚后数据一致性已验证
---
## ✅ 最终确认
### 发布前最后检查
- [ ] `mvn compile` 构建成功附终端截图
- [ ] 关键单元测试通过
- [ ] 测试环境部署验证通过
- [ ] Code Review 已完成并获得批准
- [ ] 相关Bug已关闭或延期说明
---
**文档版本**v1.0
**最后更新**2026年4月24日
**负责人**关羽后端开发
**适用范围**HIS 系统所有后端模块his-server
**补充说明**本清单与陈琳的前端发布前检查清单对称互补共同构成HIS系统发布前完整质量保障体系

View File

@@ -1,217 +0,0 @@
# CI/CD构建门禁规范
## 🎯 规范目标
建立自动化质量门禁,确保每次代码提交都经过严格验证,防止低质量代码进入主干分支,提升系统稳定性和开发效率。
## 🔒 门禁层级
### 1. 提交前门禁Pre-commit
**触发时机**`git commit` 执行前
**验证内容**
- ESLint 代码规范检查
- Prettier 代码格式化
- 简单的单元测试(快速执行)
**工具配置**
- Husky + lint-staged
- 配置文件:`.husky/pre-commit`
### 2. 推送前门禁Pre-push
**触发时机**`git push` 执行前
**验证内容**
- 完整的单元测试套件
- 构建验证(`npm run build:prod`
- 集成测试(核心流程)
**工具配置**
- Husky pre-push hook
- 配置文件:`.husky/pre-push`
### 3. CI流水线门禁CI Pipeline
**触发时机**:代码推送到远程仓库后
**验证内容**
- 完整的测试套件(单元+集成+端到端)
- 代码覆盖率检查分阶段目标Q1≥30%Q2≥50%Q3≥80%
- 安全扫描SAST
- 构建产物验证
- 部署到测试环境
**工具配置**
- Spug CI/CD 流水线
- Gitea Webhook 触发
### 4. 发布前门禁Release Gate
**触发时机**:准备发布到生产环境前
**验证内容**
- 生产环境冒烟测试
- 性能基准测试
- 安全合规检查
- 回滚预案验证
## ⚙️ 具体配置要求
### ESLint 配置
```javascript
// eslint.config.js 关键配置
import globals from "globals";
import pluginVue from "eslint-plugin-vue";
import parserVue from "vue-eslint-parser";
import importPlugin from "eslint-plugin-import";
export default [
{
name: "app/files-to-lint",
files: ["**/*.{js,mjs,jsx,vue}"],
},
{
name: "app/files-to-ignore",
ignores: ["**/dist/**", "**/node_modules/**", "**/help-center/**"],
},
...pluginVue.configs["flat/recommended"],
{
languageOptions: {
globals: {
...globals.browser,
...globals.node,
},
parser: parserVue,
ecmaVersion: "latest",
sourceType: "module",
},
plugins: {
import: importPlugin,
},
rules: {
// 确保导入的模块实际存在(核心规则,防止构建失败)
"import/no-unresolved": "error",
// 确保导入的命名导出实际存在
"import/named": "error",
// 确保默认导出存在
"import/default": "error",
// 确保命名空间导出存在
"import/namespace": "error",
},
},
];
```
```
### Java 后端配置
```xml
<!-- pom.xml 关键插件 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
</plugin>
<plugin>
<groupId>com.github.spotbugs</groupId>
<artifactId>spotbugs-maven-plugin</artifactId>
<version>4.2.0</version>
</plugin>
```
### 数据库迁移配置
```yaml
# application.yml Flyway配置
flyway:
enabled: true
locations: classpath:db/migration
baseline-on-migrate: true
```
javascript
// .eslintrc.js 关键配置
module.exports = {
plugins: ['import'],
rules: {
// 确保导入的模块实际存在
'import/no-unresolved': 'error',
// 确保导入的成员实际存在
'import/named': 'error',
// 禁止未使用的导入
'import/no-unused-modules': 'warn'
}
};
```
### Husky 配置
```bash
# .husky/pre-commit
#!/bin/sh
npm run lint-staged
# .husky/pre-push
#!/bin/sh
npm run test:unit && npm run build:prod
```
### lint-staged 配置
```json
// package.json
{
"lint-staged": {
"*.{js,vue}": ["eslint --fix", "prettier --write"],
"*.{css,scss}": ["stylelint --fix", "prettier --write"]
}
}
```
```json
// package.json
{
"lint-staged": {
"*.{js,vue}": ["eslint --fix", "prettier --write"],
"*.{css,scss}": ["stylelint --fix", "prettier --write"]
}
}
```
## 🚫 失败处理机制
### 自动处理
- **构建失败**:自动阻止 PR 合并
- **测试失败**:标记 PR 为失败状态
- **安全漏洞**:立即通知安全团队
### 人工处理
- **紧急修复**:可申请临时绕过(需架构师批准)
- **误报处理**:提交豁免申请并说明原因
- **规则调整**:通过 RFC 流程申请规则变更
## 📊 监控与度量
### 关键指标
- 门禁通过率 ≥ 95%
- 平均修复时间 ≤ 2小时
- 误报率 ≤ 5%
### 报告机制
- 每日门禁失败统计
- 周度质量趋势报告
- 月度规则优化建议
## 🔄 持续改进
### 规则演进
- 每月评审门禁规则有效性
- 根据项目需求调整检查强度
- 引入新的质量检查工具
### 团队培训
- 新成员入职培训包含门禁规范
- 定期分享最佳实践案例
- 建立常见问题解决方案库
---
**文档版本**v1.0
**最后更新**2026年4月24日
**负责人**:陈琳(文档专家)
**技术方案**:诸葛亮(架构师)
**适用范围**HIS 系统所有项目

View File

@@ -1,135 +0,0 @@
# 代码提交变更说明模板
## 📝 PR/Commit 模板
### 标题格式
```
<类型>(<模块>): <简短描述>
示例:
feat(patient): 添加患者基本信息编辑功能
fix(doctor): 修复医生排班显示异常问题
docs(api): 更新预约挂号接口文档
refactor(nurse): 重构护士站护理记录组件
```
### 正文模板
```markdown
## 🔍 变更背景
- **问题描述**:详细说明要解决的问题或实现的需求
- **影响范围**:列出受影响的模块、页面、功能
- **相关链接**禅道任务ID、需求文档链接等
## 🛠️ 变更内容
- **主要修改**:核心代码变更点
- **技术方案**:采用的技术方案和设计思路
- **兼容性**是否涉及API或数据结构变更
## 🗄️ 数据库变更
- **表结构变更**:列出新增/修改的表和字段
- **数据迁移**:是否需要数据迁移脚本
- **回滚方案**:数据库变更的回滚策略
## ✅ 验证情况
- **测试覆盖**:单元测试、集成测试覆盖情况
- **手动验证**:手动测试的场景和结果
- **构建验证**:本地构建截图(必填)
## 📋 检查清单
- [ ] 代码已通过 ESLint 检查
- [ ] 本地构建成功(附截图)
- [ ] 核心功能已测试验证
- [ ] 文档已同步更新
- [ ] Code Review 已完成
## 👥 相关人员
- **开发者**@开发者姓名
- **测试者**@测试者姓名
- **审核人**@架构师姓名
```
## 🏷️ 提交类型说明
| 类型 | 说明 | 示例 |
|------|------|------|
| feat | 新功能 | `feat: 添加用户登录功能` |
| fix | Bug修复 | `fix: 修复表单验证错误` |
| docs | 文档更新 | `docs: 更新API文档` |
| style | 代码格式调整 | `style: 格式化代码` |
| refactor | 代码重构 | `refactor: 重构组件结构` |
| test | 测试相关 | `test: 添加单元测试` |
| chore | 构建/依赖等 | `chore: 升级依赖版本` |
| perf | 性能优化 | `perf: 优化列表加载速度` |
## 📁 模块命名规范
| 模块 | 说明 |
|------|------|
| patient | 患者管理相关 |
| doctor | 医生工作站相关 |
| nurse | 护士站相关 |
| admin | 后台管理相关 |
| common | 公共组件/工具 |
| api | API接口相关 |
| auth | 认证授权相关 |
| payment | 支付相关 |
## 🖼️ 构建验证截图要求
### 必须包含的信息
1. **终端窗口**:显示 `npm run build:prod` 命令执行过程
2. **成功标识**:明确显示构建成功的提示信息
3. **时间戳**:截图包含当前时间,证明是最新构建
4. **分支信息**:显示当前工作分支名称
### 截图示例
```
$ git checkout feature/patient-edit
$ npm run build:prod
> his-system@1.0.0 build
> vue-cli-service build
⠇ Building for production...
DONE Build complete. The dist directory is ready to be deployed.
INFO Check out deployment instructions at https://cli.vuejs.org/guide/deployment.html
✨ Done in 45.23s.
```
## ⚠️ 禁止行为
### 严重违规(直接拒绝合并)
- 无构建验证截图
- 代码存在 ESLint 错误
- 未填写变更说明
- 修改无关代码文件
### 轻微违规(要求修正后重新提交)
- 描述过于简单
- 测试覆盖不完整
- 文档更新滞后
- 格式不符合规范
## 💡 最佳实践
### 高质量提交特征
- **原子性**:每次提交只解决一个问题
- **可追溯**关联具体的需求或Bug ID
- **可验证**:提供完整的验证证据
- **可理解**:描述清晰,他人能快速理解
### 团队协作建议
- 提交前先在本地完整测试
- 复杂变更提前与团队沟通
- 及时更新相关文档
- 主动帮助新人熟悉规范
---
**文档版本**v1.0
**最后更新**2026年4月24日
**负责人**:陈琳(文档专家)
**适用范围**HIS 系统所有开发人员

View File

@@ -1,102 +0,0 @@
# 前端发布前检查清单
## 📋 基础检查项
### 代码质量
- [ ] 代码已通过 ESLint 检查,无警告和错误
- [ ] 代码已通过 Prettier 格式化
- [ ] 无 console.log() 等调试代码残留
- [ ] 变量命名符合规范,语义清晰
- [ ] 函数职责单一,复杂度适中
### 构建验证
- [ ] 本地执行 `npm run build:prod` 成功完成
- [ ] 构建产物无报错,体积合理
- [ ] 静态资源路径正确无404错误
- [ ] 环境变量配置正确(开发/测试/生产)
### 功能验证
- [ ] 核心功能流程完整测试通过
- [ ] 边界条件和异常场景已覆盖
- [ ] 表单验证逻辑正确
- [ ] API 接口调用正常,错误处理完善
- [ ] 路由跳转逻辑正确
## 🔧 技术检查项
### 模块导入检查
- [ ] 所有 import 语句引用的模块实际存在
- [ ] 无未使用的 import 导入
- [ ] 路径别名(@/)配置正确
- [ ] 第三方库版本兼容性确认
### 性能优化
- [ ] 组件按需加载(懒加载)已配置
- [ ] 大数据列表已实现虚拟滚动或分页
- [ ] 图片资源已压缩,格式合适
- [ ] 无内存泄漏风险(事件监听器、定时器等)
### 安全检查
- [ ] 用户输入已做 XSS 防护
- [ ] 敏感信息不在前端硬编码
- [ ] API 请求已做 CSRF 防护
- [ ] 权限控制逻辑正确
## 🌐 兼容性检查
### 浏览器兼容
- [ ] 主流浏览器Chrome、Firefox、Safari、Edge显示正常
- [ ] 移动端适配良好(如适用)
- [ ] 分辨率适配1366x768、1920x1080等
### 设备兼容
- [ ] 触摸设备操作体验良好
- [ ] 键盘导航支持完整
- [ ] 屏幕阅读器兼容性(无障碍)
## 📱 发布准备
### 文档更新
- [ ] 相关 API 文档已同步更新
- [ ] 用户操作手册已更新(如适用)
- [ ] 变更日志已记录
### 回滚预案
- [ ] 回滚方案已准备
- [ ] 数据兼容性已确认
- [ ] 紧急联系人已明确
## 🔧 后端检查项
### 编译验证
- [ ] Maven编译成功`mvn clean package -DskipTests`
- [ ] 无编译错误,仅有可接受的警告
- [ ] 依赖版本兼容性确认
### 数据库脚本
- [ ] DDL/DML脚本语法正确
- [ ] 回滚脚本已准备
- [ ] 数据迁移脚本已测试
## 🔄 前后端协同
### 接口兼容性
- [ ] API接口契约变更已双方确认
- [ ] 前端调用后端接口正常
- [ ] 错误码处理逻辑一致
## ✅ 最终确认
### 发布前最后检查
- [ ] 本地构建截图已附在 PR 中
- [ ] 测试环境部署验证通过
- [ ] Code Review 已完成并获得批准
- [ ] 相关 Bug 已关闭或延期说明
---
**文档版本**v1.0
**最后更新**2026年4月24日
**负责人**:陈琳(文档专家)
**适用范围**HIS 系统所有前端项目

View File

@@ -1,575 +0,0 @@
# HIS项目发布检查清单 v1.0
> **文档说明**本清单整合了提交规范、前端检查、后端检查、CI/CD门禁四个部分作为HIS项目发布的标准化检查依据。每次发布前必须逐项确认。
## 目录
- [1. 提交规范commit-template](#1-提交规范commit-template)
- [2. 前端检查frontend-checklist](#2-前端检查frontend-checklist)
- [3. 后端检查backend-checklist](#3-后端检查backend-checklist)
- [4. CI/CD门禁cicd-gatekeeper](#4-cicd门禁cicd-gatekeeper)
- [5. 发布确认与回滚预案](#5-发布确认与回滚预案)
---
## 1. 提交规范commit-template
### 📝 PR/Commit 模板
#### 标题格式
```
<类型>(<模块>): <简短描述>
示例:
feat(patient): 添加患者基本信息编辑功能
fix(doctor): 修复医生排班显示异常问题
docs(api): 更新预约挂号接口文档
refactor(nurse): 重构护士站护理记录组件
```
#### 正文模板
```markdown
## 🔍 变更背景
- **问题描述**:详细说明要解决的问题或实现的需求
- **影响范围**:列出受影响的模块、页面、功能
- **相关链接**禅道任务ID、需求文档链接等
## 🛠️ 变更内容
- **主要修改**:核心代码变更点
- **技术方案**:采用的技术方案和设计思路
- **兼容性**是否涉及API或数据结构变更
## 🗄️ 数据库变更
- **表结构变更**:列出新增/修改的表和字段
- **数据迁移**:是否需要数据迁移脚本
- **回滚方案**:数据库变更的回滚策略
## ✅ 验证情况
- **测试覆盖**:单元测试、集成测试覆盖情况
- **手动验证**:手动测试的场景和结果
- **构建验证**:本地构建截图(必填)
## 📋 检查清单
- [ ] 代码已通过 ESLint 检查
- [ ] 本地构建成功(附截图)
- [ ] 核心功能已测试验证
- [ ] 文档已同步更新
- [ ] Code Review 已完成
## 👥 相关人员
- **开发者**@开发者姓名
- **测试者**@测试者姓名
- **审核人**@架构师姓名
```
### 🏷️ 提交类型说明
| 类型 | 说明 | 示例 |
|------|------|------|
| feat | 新功能 | `feat: 添加用户登录功能` |
| fix | Bug修复 | `fix: 修复表单验证错误` |
| docs | 文档更新 | `docs: 更新API文档` |
| style | 代码格式调整 | `style: 格式化代码` |
| refactor | 代码重构 | `refactor: 重构组件结构` |
| test | 测试相关 | `test: 添加单元测试` |
| chore | 构建/依赖等 | `chore: 升级依赖版本` |
| perf | 性能优化 | `perf: 优化列表加载速度` |
### 📁 模块命名规范
| 模块 | 说明 |
|------|------|
| patient | 患者管理相关 |
| doctor | 医生工作站相关 |
| nurse | 护士站相关 |
| admin | 后台管理相关 |
| common | 公共组件/工具 |
| api | API接口相关 |
| auth | 认证授权相关 |
| payment | 支付相关 |
### 🖼️ 构建验证截图要求
#### 必须包含的信息
1. **终端窗口**:显示 `npm run build:prod` 命令执行过程
2. **成功标识**:明确显示构建成功的提示信息
3. **时间戳**:截图包含当前时间,证明是最新构建
4. **分支信息**:显示当前工作分支名称
### ⚠️ 禁止行为
#### 严重违规(直接拒绝合并)
- 无构建验证截图
- 代码存在 ESLint 错误
- 未填写变更说明
- 修改无关代码文件
---
## 2. 前端检查frontend-checklist
### 📋 基础检查项
#### 代码质量
- [ ] 代码已通过 ESLint 检查,无警告和错误
- [ ] 代码已通过 Prettier 格式化
- [ ] 无 console.log() 等调试代码残留
- [ ] 变量命名符合规范,语义清晰
- [ ] 函数职责单一,复杂度适中
#### 构建验证
- [ ] 本地执行 `npm run build:prod` 成功完成
- [ ] 构建产物无报错,体积合理
- [ ] 静态资源路径正确无404错误
- [ ] 环境变量配置正确(开发/测试/生产)
#### 功能验证
- [ ] 核心功能流程完整测试通过
- [ ] 边界条件和异常场景已覆盖
- [ ] 表单验证逻辑正确
- [ ] API 接口调用正常,错误处理完善
- [ ] 路由跳转逻辑正确
### 🔧 技术检查项
#### 模块导入检查
- [ ] 所有 import 语句引用的模块实际存在
- [ ] 无未使用的 import 导入
- [ ] 路径别名(@/)配置正确
- [ ] 第三方库版本兼容性确认
#### 性能优化
- [ ] 组件按需加载(懒加载)已配置
- [ ] 大数据列表已实现虚拟滚动或分页
- [ ] 图片资源已压缩,格式合适
- [ ] 无内存泄漏风险(事件监听器、定时器等)
#### 安全检查
- [ ] 用户输入已做 XSS 防护
- [ ] 敏感信息不在前端硬编码
- [ ] API 请求已做 CSRF 防护
- [ ] 权限控制逻辑正确
### 🌐 兼容性检查
#### 浏览器兼容
- [ ] 主流浏览器Chrome、Firefox、Safari、Edge显示正常
- [ ] 移动端适配良好(如适用)
- [ ] 分辨率适配1366x768、1920x1080等
#### 设备兼容
- [ ] 触摸设备操作体验良好
- [ ] 键盘导航支持完整
- [ ] 屏幕阅读器兼容性(无障碍)
### 📱 发布准备
#### 文档更新
- [ ] 相关 API 文档已同步更新
- [ ] 用户操作手册已更新(如适用)
- [ ] 变更日志已记录
#### 回滚预案
- [ ] 回滚方案已准备
- [ ] 数据兼容性已确认
- [ ] 紧急联系人已明确
### ✅ 最终确认
#### 发布前最后检查
- [ ] 本地构建截图已附在 PR 中
- [ ] 测试环境部署验证通过
- [ ] Code Review 已完成并获得批准
- [ ] 相关 Bug 已关闭或延期说明
---
## 3. 后端检查backend-checklist
### 📋 基础检查项
#### Maven编译验证
- [ ] 本地执行 `mvn compile` 编译通过无ERROR
- [ ] 执行 `mvn package -DskipTests` 打包成功
- [ ] 依赖版本无冲突(`mvn dependency:tree` 检查)
- [ ] 无编译警告(或已有书面说明可忽略)
#### 构建产物验证
- [ ] JAR/WAR包生成完整大小合理
- [ ] `application.yml` 等配置文件已打包进产物
- [ ] 第三方依赖jar包完整lib目录无缺失
### 🔧 Spring Boot 配置检查
#### 多环境配置
- [ ] `application-dev.yml`(开发)配置正确
- [ ] `application-test.yml`(测试)配置正确
- [ ] `application-prod.yml`(生产)配置正确
- [ ] 启动参数 `--spring.profiles.active` 指定正确环境
- [ ] 生产环境未启用devtools热部署
#### Actuator安全
- [ ] 生产环境 `/actuator` 端点已禁用或限制访问
- [ ] `/actuator/env``/actuator/heapdump` 等敏感端点已关闭
- [ ] 健康检查端点 `/actuator/health` 返回信息已脱敏
#### 启动校验
- [ ] 数据库连接池配置合理HikariCP最大/最小连接数)
- [ ] Redis/消息中间件连接配置正确
- [ ] 启动日志无ERROR级别异常
### 🗄️ MyBatis Plus 规范检查
#### 实体-表映射
- [ ] 所有实体类标注 `@TableName`,表名与实际一致
- [ ] 主键字段标注 `@TableId(type = IdType.AUTO)` 或对应策略
- [ ] 非表字段标注 `@TableField(exist = false)`
- [ ] 字段命名符合下划线转驼峰规则
#### SQL安全
- [ ] 所有查询使用参数化查询(`QueryWrapper` / `LambdaQueryWrapper`
- [ ] 禁止字符串拼接SQL`"WHERE name = '" + name + "'"`
- [ ] 批量操作使用MyBatis Plus `saveBatch` / `updateBatchById`
- [ ] 复杂SQL使用XML映射避免注解内嵌长SQL
#### 事务管理
- [ ] 涉及多表写操作的方法标注 `@Transactional`
- [ ] 事务边界合理不包含外部HTTP调用
- [ ] 异常回滚配置正确(`rollbackFor = Exception.class`
- [ ] 事务方法未被同一类内方法直接调用(自调用失效问题)
#### 分页插件
- [ ] `PaginationInnerInterceptor` 已正确配置
- [ ] 分页查询使用 `Page<T>` 对象非手动limit/offset
### 🔌 RESTful API 设计检查
#### 统一返回格式
- [ ] 所有接口返回 `{code, msg, data}` 统一结构
- [ ] 成功返回 `code=200`,业务错误使用自定义错误码
- [ ] 异常通过 `@ControllerAdvice` + `@ExceptionHandler` 统一处理
#### HTTP状态码
- [ ] 资源创建返回 `201 Created`
- [ ] 资源删除返回 `204 No Content`
- [ ] 参数校验失败返回 `400 Bad Request`
- [ ] 未认证返回 `401 Unauthorized`
- [ ] 无权限返回 `403 Forbidden`
- [ ] 资源不存在返回 `404 Not Found`
#### 参数校验
- [ ] 请求参数使用 `@Valid` / `@Validated` 注解校验
- [ ] 必填字段标注 `@NotBlank` / `@NotNull`
- [ ] 数值范围标注 `@Min` / `@Max`
- [ ] 格式校验使用 `@Pattern`(如手机号、身份证号)
- [ ] 校验失败返回明确错误信息非500堆栈
#### API版本管理
- [ ] 接口路径包含版本号(`/api/v1/``/api/v2/`
- [ ] 废弃接口标注 `@Deprecated`,并在文档中说明
- [ ] 不兼容变更必须升级版本号
### 🔒 安全与合规检查
#### 数据脱敏
- [ ] 患者身份证号在日志中脱敏(`***` 掩码)
- [ ] 患者手机号在日志中脱敏前3后4中间`****`
- [ ] 敏感字段序列化时使用 `@JsonSerialize` 自定义脱敏器
- [ ] 接口返回中非必需字段不暴露如密码、salt
#### 权限控制
- [ ] 所有涉及患者数据的接口标注 `@PreAuthorize`
- [ ] 数据级权限校验(医生只能访问本科室患者)
- [ ] 越权访问返回 `403`,非 `404``500`
- [ ] 敏感操作(删除、修改诊断)需二次确认或额外权限
#### 审计日志
- [ ] 处方修改记录操作人、时间、变更内容
- [ ] 病历删除操作记录完整审计链
- [ ] 审计日志独立存储,不可被业务用户删除
- [ ] 关键业务操作记录IP地址和操作终端
### ⚡ 性能检查
#### 数据库查询
- [ ] 无N+1查询问题使用 `JOIN` 或批量查询)
- [ ] 大表查询必须有分页限制
- [ ] 慢查询已优化(执行时间 < 500ms
- [ ] 索引已覆盖高频查询条件
#### 接口性能
- [ ] 核心接口响应时间 < 1秒
- [ ] 列表接口支持分页无全量返回
- [ ] 大文件下载使用流式传输非全量加载到内存
### 📝 文档与发布准备
#### 文档更新
- [ ] API接口文档已同步更新路径参数返回值
- [ ] 数据库变更脚本已提供DDL/DML
- [ ] 配置变更说明已记录新增/修改的配置项
- [ ] 影响范围说明已明确哪些模块哪些接口受影响
#### 回滚预案
- [ ] 数据库变更可回滚提供反向SQL脚本
- [ ] 配置变更可快速回退
- [ ] 紧急回滚流程已明确怎么做多长时间
- [ ] 回滚后数据一致性已验证
### ✅ 最终确认
#### 发布前最后检查
- [ ] `mvn compile` 构建成功附终端截图
- [ ] 关键单元测试通过
- [ ] 测试环境部署验证通过
- [ ] Code Review 已完成并获得批准
- [ ] 相关Bug已关闭或延期说明
---
## 4. CI/CD门禁cicd-gatekeeper
### 🎯 规范目标
建立自动化质量门禁确保每次代码提交都经过严格验证防止低质量代码进入主干分支提升系统稳定性和开发效率
### 🔒 门禁层级
#### 1. 提交前门禁Pre-commit
**触发时机**`git commit` 执行前
**验证内容**
- ESLint 代码规范检查
- Prettier 代码格式化
- 简单的单元测试快速执行
**工具配置**
- Husky + lint-staged
- 配置文件`.husky/pre-commit`
#### 2. 推送前门禁Pre-push
**触发时机**`git push` 执行前
**验证内容**
- 完整的单元测试套件
- 构建验证`npm run build:prod`
- 集成测试核心流程
**工具配置**
- Husky pre-push hook
- 配置文件`.husky/pre-push`
#### 3. CI流水线门禁CI Pipeline
**触发时机**代码推送到远程仓库后
**验证内容**
- 完整的测试套件单元+集成+端到端
- 代码覆盖率检查分阶段目标Q130%Q250%Q380%
- 安全扫描SAST
- 构建产物验证
- 部署到测试环境
**工具配置**
- Spug CI/CD 流水线
- Gitea Webhook 触发
#### 4. 发布前门禁Release Gate
**触发时机**准备发布到生产环境前
**验证内容**
- 生产环境冒烟测试
- 性能基准测试
- 安全合规检查
- 回滚预案验证
### ⚙️ 具体配置要求
#### ESLint 配置
```javascript
// eslint.config.js 关键配置
import globals from "globals";
import pluginVue from "eslint-plugin-vue";
import parserVue from "vue-eslint-parser";
import importPlugin from "eslint-plugin-import";
export default [
{
name: "app/files-to-lint",
files: ["**/*.{js,mjs,jsx,vue}"],
},
{
name: "app/files-to-ignore",
ignores: ["**/dist/**", "**/node_modules/**", "**/help-center/**"],
},
...pluginVue.configs["flat/recommended"],
{
languageOptions: {
globals: {
...globals.browser,
...globals.node,
},
parser: parserVue,
ecmaVersion: "latest",
sourceType: "module",
},
plugins: {
import: importPlugin,
},
rules: {
// 确保导入的模块实际存在(核心规则,防止构建失败)
"import/no-unresolved": "error",
// 确保导入的命名导出实际存在
"import/named": "error",
// 确保默认导出存在
"import/default": "error",
// 确保命名空间导出存在
"import/namespace": "error",
},
},
];
```
#### Java 后端配置
```xml
<!-- pom.xml 关键插件 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
</plugin>
<plugin>
<groupId>com.github.spotbugs</groupId>
<artifactId>spotbugs-maven-plugin</artifactId>
<version>4.2.0</version>
</plugin>
```
#### 数据库迁移配置
```yaml
# application.yml Flyway配置
flyway:
enabled: true
locations: classpath:db/migration
baseline-on-migrate: true
```
#### Husky 配置
```bash
# .husky/pre-commit
#!/bin/sh
npm run lint-staged
# .husky/pre-push
#!/bin/sh
npm run test:unit && npm run build:prod
```
#### lint-staged 配置
```json
// package.json
{
"lint-staged": {
"*.{js,vue}": ["eslint --fix", "prettier --write"],
"*.{css,scss}": ["stylelint --fix", "prettier --write"]
}
}
```
### 🚫 失败处理机制
#### 自动处理
- **构建失败**自动阻止 PR 合并
- **测试失败**标记 PR 为失败状态
- **安全漏洞**立即通知安全团队
#### 人工处理
- **紧急修复**可申请临时绕过需架构师批准
- **误报处理**提交豁免申请并说明原因
- **规则调整**通过 RFC 流程申请规则变更
### 📊 监控与度量
#### 关键指标
- 门禁通过率 95%
- 平均修复时间 2小时
- 误报率 5%
#### 报告机制
- 每日门禁失败统计
- 周度质量趋势报告
- 月度规则优化建议
### 🔄 持续改进
#### 规则演进
- 每月评审门禁规则有效性
- 根据项目需求调整检查强度
- 引入新的质量检查工具
#### 团队培训
- 新成员入职培训包含门禁规范
- 定期分享最佳实践案例
- 建立常见问题解决方案库
---
## 5. 发布确认与回滚预案
### 📋 发布前最终确认清单
#### 前端确认
- [ ] 本地构建成功`npm run build:prod`
- [ ] 核心功能流程测试通过
- [ ] 模块导入检查通过无import错误
- [ ] 兼容性测试完成
#### 后端确认
- [ ] Maven编译成功`mvn compile`
- [ ] 单元测试通过
- [ ] 数据库脚本验证通过
- [ ] API接口测试通过
#### 协同确认
- [ ] 前后端接口契约一致
- [ ] 联调测试通过
- [ ] Code Review 已完成
- [ ] 测试环境部署验证通过
### 🚨 回滚预案
#### 触发条件
- [ ] 生产环境出现严重Bug
- [ ] 性能严重下降
- [ ] 数据一致性问题
- [ ] 安全漏洞暴露
#### 回滚步骤
1. **立即停止**暂停新流量进入
2. **版本回退**部署上一个稳定版本
3. **数据回滚**执行数据库回滚脚本如有
4. **验证恢复**确认系统功能正常
5. **问题分析**记录根本原因和改进措施
#### 责任分工
- **技术负责人**执行回滚操作
- **测试负责人**验证回滚后功能
- **项目经理**协调沟通和进度同步
- **运维团队**监控系统状态
### 📞 紧急联系人
| 角色 | 姓名 | 联系方式 | 职责 |
|------|------|----------|------|
| 技术负责人 | 诸葛亮 | @诸葛亮 | 架构决策和技术指导 |
| 前端负责人 | 赵云 | @赵云 | 前端问题处理 |
| 后端负责人 | 关羽 | @关羽 | 后端问题处理 |
| 测试负责人 | 张飞 | @张飞 | 质量验证和问题复现 |
| 项目经理 | 刘备 | @刘备 | 项目协调和进度管理 |
| 文档负责人 | 陈琳 | @陈琳 | 文档维护和知识沉淀 |
---
**文档版本**v1.0
**最后更新**2026年4月25日
**负责人**陈琳文档专家
**适用范围**HIS 系统所有开发人员

View File

@@ -1,214 +0,0 @@
# HIS项目 Playwright E2E 自动化测试方案 v1.0
## 一、方案概述
### 1.1 选型理由
- **Playwright** 是微软开源的端到端测试框架,完美适配 Vue 3 + Vite 技术栈
- 自动等待机制适合HIS系统复杂交互场景异步加载、动态渲染
- 支持多浏览器Chromium/Firefox/WebKitCI/CD集成成熟
- 已有 `@playwright/test ^1.58.2` 依赖 installed
### 1.2 目标
1. 核心业务流程自动化覆盖率达到 80%+
2. 已修复Bug 100% 回归测试覆盖
3. 每次代码推送自动触发测试,失败阻断发布
## 二、项目结构
```
healthlink-his-ui/
├── tests/
│ ├── e2e/
│ │ ├── fixtures/ # 测试夹具
│ │ │ └── auth.ts # 登录认证fixture
│ │ ├── pages/ # 页面对象模型POM
│ │ │ ├── LoginPage.ts
│ │ │ ├── DoctorStationPage.ts
│ │ │ └── SurgeryBillingPage.ts
│ │ ├── specs/ # 测试用例
│ │ │ ├── login.spec.ts
│ │ │ ├── doctor-station.spec.ts
│ │ │ ├── surgery-billing.spec.ts
│ │ │ └── bug-regression.spec.ts # Bug回归测试
│ │ └── utils/
│ │ └── test-data.ts # 测试数据
│ └── playwright.config.ts # Playwright配置
├── .env.test # 测试环境变量
└── package.json # 已有playwright依赖
```
## 三、环境配置
### 3.1 环境变量(.env.test
```bash
# 测试环境配置
VITE_APP_BASE_API=http://192.168.110.253:8080
TEST_USERNAME=test_admin
TEST_PASSWORD=test123456
TEST_BASE_URL=http://localhost:80
```
### 3.2 Playwright配置playwright.config.ts
```typescript
import { defineConfig, devices } from '@playwright/test';
export default defineConfig({
testDir: './tests/e2e/specs',
timeout: 60 * 1000,
expect: { timeout: 10000 },
fullyParallel: false,
forbidOnly: !!process.env.CI,
retries: process.env.CI ? 2 : 0,
workers: 1,
reporter: [['html', { outputFolder: 'playwright-report' }], ['list']],
use: {
baseURL: process.env.TEST_BASE_URL || 'http://localhost:80',
trace: 'on-first-retry',
screenshot: 'only-on-failure',
video: 'retain-on-failure',
},
projects: [
{ name: 'chromium', use: { ...devices['Desktop Chrome'] } },
],
});
```
## 四、核心测试用例
### 4.1 登录测试login.spec.ts
```typescript
import { test, expect } from '@playwright/test';
test('用户登录成功', async ({ page }) => {
await page.goto('/');
await page.fill('input[placeholder="请输入用户名"]', process.env.TEST_USERNAME || 'admin');
await page.fill('input[placeholder="请输入密码"]', process.env.TEST_PASSWORD || '123456');
await page.click('button:has-text("登录")');
await expect(page).toHaveURL(/.*dashboard.*/);
await expect(page.locator('.user-avatar')).toBeVisible();
});
test('登录失败-错误密码', async ({ page }) => {
await page.goto('/');
await page.fill('input[placeholder="请输入用户名"]', 'admin');
await page.fill('input[placeholder="请输入密码"]', 'wrongpassword');
await page.click('button:has-text("登录")');
await expect(page.locator('.el-message--error')).toBeVisible();
});
```
### 4.2 门诊医生站测试doctor-station.spec.ts
```typescript
import { test, expect } from '@playwright/test';
test.describe('门诊医生站', () => {
test.beforeEach(async ({ page }) => {
// 登录
await page.goto('/');
await page.fill('input[placeholder="请输入用户名"]', process.env.TEST_USERNAME || 'admin');
await page.fill('input[placeholder="请输入密码"]', process.env.TEST_PASSWORD || '123456');
await page.click('button:has-text("登录")');
await page.waitForURL(/.*dashboard.*/);
});
test('#427 检查项目分类手风琴展开', async ({ page }) => {
await page.goto('/doctorstation');
// 点击第一个分类
await page.click('.category-item >> nth=0');
await expect(page.locator('.category-content >> nth=0')).toBeVisible();
// 点击第二个分类,第一个应收起
await page.click('.category-item >> nth=1');
await expect(page.locator('.category-content >> nth=0')).not.toBeVisible();
await expect(page.locator('.category-content >> nth=1')).toBeVisible();
});
});
```
### 4.3 手术计费回归测试bug-regression.spec.ts
```typescript
import { test, expect } from '@playwright/test';
test.describe('Bug回归测试', () => {
test('#437 手术计费防重复提交', async ({ page }) => {
// 登录并导航到手术计费
await page.goto('/');
await page.fill('input[placeholder="请输入用户名"]', process.env.TEST_USERNAME || 'admin');
await page.fill('input[placeholder="请输入密码"]', process.env.TEST_PASSWORD || '123456');
await page.click('button:has-text("登录")');
await page.waitForURL(/.*dashboard.*/);
await page.goto('/surgery-billing');
// 快速连续点击新增按钮(测试防重复锁)
const addBtn = page.locator('button:has-text("新增")');
await addBtn.click();
await addBtn.click(); // 第二次应被阻止
await addBtn.click(); // 第三次应被阻止
// 验证只弹出一个表单
await expect(page.locator('.el-dialog')).toHaveCount(1);
});
});
```
## 五、执行命令
```bash
# 安装浏览器
npx playwright install chromium
# 运行所有测试
npm run test:e2e
# 运行单个测试文件
npx playwright test login.spec.ts
# 生成HTML报告
npx playwright show-report
# UI模式调试用
npx playwright test --ui
```
## 六、CI/CD集成
### 6.1 package.json脚本
```json
{
"scripts": {
"test:e2e": "playwright test",
"test:e2e:ui": "playwright test --ui",
"test:e2e:report": "playwright show-report"
}
}
```
### 6.2 Spug流水线集成
```yaml
# Spug 构建后阶段添加
- name: E2E Testing
script: |
cd healthlink-his-ui
npx playwright install --with-deps chromium
npm run test:e2e -- --reporter=html
# 测试失败则阻断发布
if [ $? -ne 0 ]; then
echo "E2E测试失败阻断发布"
exit 1
fi
```
## 七、实施计划
| 阶段 | 时间 | 内容 | 负责人 |
|------|------|------|--------|
| Phase 1 | 第1周 | 登录+核心页面冒烟测试 | 张飞+赵云 |
| Phase 2 | 第2-3周 | 门诊医生站+手术计费全流程 | 张飞 |
| Phase 3 | 第4周 | Bug回归测试全覆盖 | 张飞 |
| Phase 4 | 第5周 | CI/CD流水线集成 | 赵云+运维 |
## 八、注意事项
1. **测试数据隔离**:使用独立的测试数据库,不污染生产数据
2. **环境变量**:敏感信息通过 `.env.test` 管理不提交到git
3. **截图留痕**:失败时自动截图,便于排查
4. **测试优先**:新功能开发时同步编写测试用例

File diff suppressed because it is too large Load Diff