Compare commits
197 Commits
9ae9fae2c8
...
zhaoyun
| Author | SHA1 | Date | |
|---|---|---|---|
| 58c15d6bb7 | |||
| d7abfa13d3 | |||
| 7c375f5af8 | |||
| 16d4fb94d7 | |||
| bfde021754 | |||
| 3f164d4585 | |||
| 6d39e4ce11 | |||
| fe2a60f379 | |||
| 26d520ccad | |||
| 3326356332 | |||
| d21a2f49c1 | |||
| 7354f01330 | |||
| e87ade7215 | |||
| 767619e308 | |||
| 0db68fc6ad | |||
| 47ac23763a | |||
| 1911278570 | |||
| a5bbc298f7 | |||
| f693560f04 | |||
| f0f4a95fe9 | |||
| f3f6c6d726 | |||
| 8528adf5b8 | |||
| 3a454189b0 | |||
| 3754539c81 | |||
| c3864c4a75 | |||
| 51acc3f91c | |||
| 67051ad0b4 | |||
| 9c9e6d371d | |||
| 5ec3c8425a | |||
| 3002d7389a | |||
| 687c6dfef4 | |||
| dbb4504be9 | |||
|
|
a380ad93d9 | ||
| db83b97839 | |||
| d9c7e87326 | |||
|
|
ad90af44a2 | ||
| 62ea334b40 | |||
| 1528b48b0c | |||
| 86cb6be013 | |||
| 80e06668df | |||
| 06111ef284 | |||
| 2d13319273 | |||
|
|
f56aa2ad2e | ||
| d9616eedf7 | |||
| 84cc974597 | |||
| 7b7c5cbf20 | |||
| 36acf6c513 | |||
| 1f3457b084 | |||
| 808c0305c9 | |||
| d5f177ae56 | |||
|
|
d7d76c922e | ||
|
|
b6eec300a9 | ||
| 52b94b9df4 | |||
| c49c9229a8 | |||
| eccc0ec7cf | |||
| 84c0f6a43d | |||
| f1a8fafb72 | |||
| 786fc14147 | |||
| 5cd42a3253 | |||
| b5f83b96e6 | |||
| 9694184748 | |||
| e7bdf4e5ac | |||
| 0156884099 | |||
| d6e64e5019 | |||
| 9ea5830095 | |||
| 8d02a530c6 | |||
| 7b912ee96c | |||
| 9d4c0b6b2a | |||
| 52377d7529 | |||
| 5100237faf | |||
| e344091a41 | |||
| 529d994377 | |||
| 73aa812544 | |||
| de6d6a2b51 | |||
|
|
57d14603ee | ||
| 1df1f0d1ad | |||
| 00604b2d01 | |||
| ce96dc6235 | |||
|
|
a58168c6de | ||
|
|
7f1f3e1a3b | ||
| 09e43e4b8c | |||
| 9673c0ed80 | |||
| f3a24a9129 | |||
| 6184ed262f | |||
| 6ea2eb8020 | |||
| f0d20a8d79 | |||
| f6c8b5fff2 | |||
| 694935b648 | |||
|
|
5801fec21c | ||
| b3800b7ae0 | |||
| 557263875b | |||
| 8adee630fb | |||
| f444584908 | |||
| c0f51f0e86 | |||
| 0ec77ab89c | |||
| e8356f5f83 | |||
| fc892e96dc | |||
| 58238e6b25 | |||
| f79c5a2c26 | |||
| 7cde7f4ad3 | |||
| 815b80437e | |||
| d74c9a2e7f | |||
| 4385472f26 | |||
| 37e44a2735 | |||
| 5ef05b9b55 | |||
| 19a22c3869 | |||
| d7455684db | |||
| d8e9da965b | |||
| 575f5d6c32 | |||
| 3fd7862a85 | |||
| 892890b59f | |||
| 8feb27f180 | |||
| 621bc27267 | |||
|
|
62c1b4278b | ||
|
|
690486084e | ||
|
|
d792f03bbd | ||
| 6a4545c240 | |||
| a2e607caf4 | |||
| f887053cb2 | |||
| 20390328d4 | |||
|
|
cfc7ca9b4e | ||
|
|
bdb7d978fb | ||
| 5a227014fe | |||
| 2fefbeefee | |||
| 1c68860541 | |||
| 324fe3fa62 | |||
| 2a0303d0e6 | |||
| 9ab3136a99 | |||
| 81d5c99a35 | |||
| b023021a3a | |||
| a7b472187c | |||
| 8258d3e2da | |||
| cd0b557cc0 | |||
| 213615715b | |||
| 3812561ede | |||
| 02874b59ce | |||
| 092804557b | |||
|
|
48189a075f | ||
| a5b2faea3a | |||
|
|
c26b458298 | ||
| e38c5993a0 | |||
| ae746cdd37 | |||
|
|
cb82f8d5bf | ||
|
|
ea8dca058a | ||
| deb5683ca6 | |||
| c4ca097bf6 | |||
| b2c60ab76f | |||
|
|
8b6265801d | ||
| fec6e928d8 | |||
|
|
bf5a9674df | ||
| 471bf2b823 | |||
| 954462272e | |||
| 7b42e94b85 | |||
| 9a5d772c72 | |||
| d861c20d5e | |||
| 488573a51b | |||
| e35bdb5b9e | |||
|
|
259a5946c2 | ||
| d0d6cf3533 | |||
| 9ed35448ce | |||
|
|
fef1ca6637 | ||
|
|
fca3d0ca86 | ||
| 193a08acbd | |||
|
|
41d05a1629 | ||
|
|
8cfa6fe05e | ||
|
|
8eb6feb70d | ||
|
|
f93bec967a | ||
|
|
020d1be4be | ||
|
|
f7f037aee9 | ||
| 6c77ee8f84 | |||
| 0855d1153b | |||
|
|
168961e656 | ||
|
|
9dc4a12339 | ||
|
|
9bbf7c6c08 | ||
| 05088a1d1a | |||
|
|
5e9dbb2f1b | ||
|
|
b25d2fbaa9 | ||
| 690e7ca22c | |||
| 43ab5b4498 | |||
| 219ac30dc5 | |||
| 20f71ec5d9 | |||
| 601be0d66b | |||
| e825f5fb33 | |||
| 97827b6ff0 | |||
| 01e8cc459c | |||
|
|
cc7c669fc1 | ||
|
|
5c73cc6987 | ||
| cb792684e2 | |||
| 871690848e | |||
| 17616a32cb | |||
|
|
2609791b62 | ||
|
|
c7ae277613 | ||
|
|
6882085d69 | ||
|
|
b1391afcd8 | ||
| d12b77f81a | |||
| acf685fbaf | |||
|
|
dfce7d0332 |
@@ -47,7 +47,7 @@
|
||||
|
||||
**铁律2: Flyway 数据库迁移**
|
||||
- 凡是新建表、新增字段,必须创建 Flyway 迁移脚本
|
||||
- 路径:`healthlink-his-domain/src/main/resources/db/migration/`
|
||||
- 路径:`healthlink-his-application/src/main/resources/db/migration/`
|
||||
- 命名:`V{版本号}__{描述}.sql`(双下划线)
|
||||
|
||||
**铁律3: 测试通过后才提交**
|
||||
@@ -184,7 +184,7 @@
|
||||
|
||||
**铁律2: Flyway 数据库迁移**
|
||||
- 凡是新建表、新增字段,必须创建 Flyway 迁移脚本
|
||||
- 路径:`healthlink-his-domain/src/main/resources/db/migration/`
|
||||
- 路径:`healthlink-his-application/src/main/resources/db/migration/`
|
||||
- 命名:`V{版本号}__{描述}.sql`(双下划线)
|
||||
|
||||
**铁律3: 测试通过后才提交**
|
||||
|
||||
439
MD/GRADE3A_FULL_IMPLEMENTATION_PLAN.md
Normal file
@@ -0,0 +1,439 @@
|
||||
# HealthLink-HIS 三甲达标完整实现计划
|
||||
|
||||
> **文档类型**: 实施计划
|
||||
> **版本**: v1.0
|
||||
> **编制日期**: 2026-06-17
|
||||
> **依据标准**:
|
||||
> - 《三级医院评审标准(2022年版)》及广西实施细则
|
||||
> - 《电子病历系统应用水平分级评价标准》(≥4级 = 三甲硬性)
|
||||
> - 《医院信息互联互通标准化成熟度测评方案》(≥四级甲等 = 三甲硬性)
|
||||
> - 《MODULE_CAPABILITY_REQUIREMENTS.md》142项必备能力清单
|
||||
> - 《GRADE3A_GAP_ANALYSIS_AND_DESIGN.md》差距分析
|
||||
|
||||
---
|
||||
|
||||
## 一、现状总览
|
||||
|
||||
### 1.1 能力完成度
|
||||
|
||||
| 维度 | 数量 | 占比 | 说明 |
|
||||
|------|:----:|:----:|------|
|
||||
| 总必备能力 | **142** | 100% | 三甲评审14个模块域 |
|
||||
| ✅ 已实现 | **59** | 42% | 功能完整可用 |
|
||||
| ⚠️ 基础实现 | **31** | 22% | 有框架/表结构,功能未完善 |
|
||||
| ❌ 缺失 | **52** | 37% | 完全没有实现 |
|
||||
| **综合完成率** | — | **53%** | (59 + 31×0.5) / 142 |
|
||||
|
||||
### 1.2 各模块完成率
|
||||
|
||||
| 模块 | 必备能力 | ✅已实现 | ⚠️基础 | ❌缺失 | 完成率 | 优先级 |
|
||||
|------|:-------:|:-------:|:------:|:------:|:-----:|:-----:|
|
||||
| 门诊医生站 | 10 | 7 | 2 | 1 | 80% | — |
|
||||
| 住院医生站 | 10 | 4 | 2 | 4 | 50% | P0 |
|
||||
| 护士站 | 10 | 5 | 2 | 3 | 60% | P1 |
|
||||
| 合理用药 | 12 | 10 | 1 | 1 | 83% | — |
|
||||
| 手术麻醉 | 12 | 6 | 2 | 4 | 58% | P0 |
|
||||
| 检验(LIS) | 10 | 5 | 2 | 3 | 60% | P1 |
|
||||
| 检查(PACS) | 10 | 3 | 3 | 4 | 45% | P1 |
|
||||
| 电子病历 | 10 | 4 | 2 | 4 | 50% | P0 |
|
||||
| 病案管理 | 10 | 2 | 3 | 5 | 35% | P0 |
|
||||
| 院感管理 | 10 | 3 | 1 | 6 | 35% | P1 |
|
||||
| 护理评估 | 10 | 4 | 3 | 3 | 55% | P1 |
|
||||
| ESB集成 | 10 | 0 | 4 | 6 | 20% | P1 |
|
||||
| EMPI | 8 | 2 | 3 | 3 | 38% | P1 |
|
||||
| 统计报表 | 10 | 4 | 1 | 5 | 45% | P1 |
|
||||
|
||||
### 1.3 三甲硬性指标对照
|
||||
|
||||
| 指标 | 要求 | 当前状态 | 差距 |
|
||||
|------|------|---------|------|
|
||||
| 处方审核率 | ≥100% | ✅ 合理用药12项能力已实现10项 | 基本达标 |
|
||||
| 抗菌药物使用率 | ≤60% | ✅ 分级管控已实现 | 达标 |
|
||||
| 危急值处理率 | ≥95% | ✅ LIS危急值闭环已实现 | 达标 |
|
||||
| 电子病历评级 | ≥4级 | ⚠️ 部分能力缺失 | 差版本管理/时效/检索完善 |
|
||||
| 互联互通成熟度 | ≥四级甲等 | ⚠️ ESB/FHIR基础框架有 | 差完整集成 |
|
||||
| 首页编码正确率 | ≥95% | ✅ ICD-10编码库已实现 | 达标 |
|
||||
| 术前讨论率 | 100% | ✅ 已实现(V14) | 达标 |
|
||||
| 病案24h归档率 | ≥90% | ✅ 已完成(P2) | 达标 |
|
||||
|
||||
---
|
||||
|
||||
## 二、52项缺失能力详细清单
|
||||
|
||||
### 2.1 住院医生站(4项缺失)
|
||||
|
||||
| # | 缺失能力 | 三甲依据 | 实现方案 | 预估工时 |
|
||||
|---|---------|---------|---------|:-------:|
|
||||
| 1 | **医嘱执行闭环追踪** | 医嘱管理制度 | 扩展`order_execute_record`表,增加每步时间戳 | 3天 |
|
||||
| 2 | **输血管理** | 临床用血管理规范 | 新建输血申请→配血→发血→输注→观察全流程 | 5天 |
|
||||
| 3 | **临床路径执行** | 临床路径管理 | 路径入径→执行→变异记录→退出 | 5天 |
|
||||
| 4 | **危急值处理记录** | 危急值管理规范 | 危急值接收→确认→处理→记录闭环 | 3天 |
|
||||
|
||||
**小计**: 16天
|
||||
|
||||
### 2.2 手术麻醉(4项缺失)
|
||||
|
||||
| # | 缺失能力 | 三甲依据 | 实现方案 | 预估工时 |
|
||||
|---|---------|---------|---------|:-------:|
|
||||
| 5 | **麻醉评估(ASA分级)** | 麻醉质控 | 新建`anes_assessment`表+评估工作台 | 3天 |
|
||||
| 6 | **术中生命体征(5min间隔)** | 麻醉记录规范 | 新建`anes_vital_sign`表+自动采集 | 4天 |
|
||||
| 7 | **麻醉小结** | 麻醉质控 | 新建麻醉总结+并发症记录 | 2天 |
|
||||
| 8 | **术后随访记录** | 麻醉质控 | 24h/48h/72h随访+疼痛评估 | 3天 |
|
||||
|
||||
**小计**: 12天
|
||||
|
||||
### 2.3 电子病历(4项缺失)
|
||||
|
||||
| # | 缺失能力 | 三甲依据 | 实现方案 | 预估工时 |
|
||||
|---|---------|---------|---------|:-------:|
|
||||
| 9 | **病历修改留痕** | 电子病历管理规范 | 新建`emr_revision`表,diff追踪 | 3天 |
|
||||
| 10 | **病历版本管理** | 电子病历管理规范 | 扩展`doc_emr`增加version字段+版本对比 | 3天 |
|
||||
| 11 | **病历完整性检查** | 病历质控 | 新建`EmrCompletenessChecker`自动校验 | 2天 |
|
||||
| 12 | **病历时效监控** | 病历书写规范 | 新建`EmrTimelinessMonitor`超时提醒 | 2天 |
|
||||
|
||||
**小计**: 10天
|
||||
|
||||
### 2.4 病案管理(5项缺失)
|
||||
|
||||
| # | 缺失能力 | 三甲依据 | 实现方案 | 预估工时 |
|
||||
|---|---------|---------|---------|:-------:|
|
||||
| 13 | **病案首页数据质量校验** | 首页数据质量≥95% | 新建`mr_homepage_quality_check`表 | 3天 |
|
||||
| 14 | **病案首页上报(HQMS)** | 卫统报表 | 新建HQMS上报接口 | 3天 |
|
||||
| 15 | **病案终末质控** | 病案管理规范 | 新建终末质控评分+缺陷管理 | 3天 |
|
||||
| 16 | **病案示踪管理** | 病案管理 | 在架/借出/归档状态追踪 | 2天 |
|
||||
| 17 | **死亡病例讨论记录** | 评审必查 | 新建死亡讨论记录+7日内完成提醒 | 2天 |
|
||||
|
||||
**小计**: 13天
|
||||
|
||||
### 2.5 院感管理(6项缺失)
|
||||
|
||||
| # | 缺失能力 | 三甲依据 | 实现方案 | 预估工时 |
|
||||
|---|---------|---------|---------|:-------:|
|
||||
| 18 | **院感病例自动筛查** | 院感管理办法 | 规则引擎自动匹配疑似病例 | 3天 |
|
||||
| 19 | **暴发预警** | 院感管理办法 | 同科室短时间多例感染预警 | 2天 |
|
||||
| 20 | **目标性监测(ICU/手术部位)** | 院感监测规范 | ICU导管/手术部位感染监测 | 3天 |
|
||||
| 21 | **手卫生依从性监测** | 患者安全目标 | 手卫生执行率统计 | 2天 |
|
||||
| 22 | **环境卫生学监测** | 院感管理办法 | 空气/物表/手培养结果管理 | 2天 |
|
||||
| 23 | **多重耐药菌管理** | 院感管理办法 | 耐药菌检出→隔离→跟踪→解除 | 2天 |
|
||||
|
||||
**小计**: 14天
|
||||
|
||||
### 2.6 检验系统LIS(3项缺失)
|
||||
|
||||
| # | 缺失能力 | 三甲依据 | 实现方案 | 预估工时 |
|
||||
|---|---------|---------|---------|:-------:|
|
||||
| 24 | **室内质控(Westgard规则)** | 质量管理 | 质控图+Westgard规则+失控处理 | 3天 |
|
||||
| 25 | **室间质评** | 质量管理 | 参加省级/国家级室间质评 | 2天 |
|
||||
| 26 | **检验报告标准格式打印** | 基本功能规范 | 标准检验报告单模板 | 1天 |
|
||||
|
||||
**小计**: 6天
|
||||
|
||||
### 2.7 检查系统PACS(4项缺失)
|
||||
|
||||
| # | 缺失能力 | 三甲依据 | 实现方案 | 预估工时 |
|
||||
|---|---------|---------|---------|:-------:|
|
||||
| 27 | **DICOM图像采集存储** | DICOM标准 | PACS对接+图像存储 | 5天 |
|
||||
| 28 | **结构化图文报告** | 检查规范 | 结构化报告模板+图像标注 | 3天 |
|
||||
| 29 | **影像对比查看** | 临床决策 | 历史影像对比功能 | 2天 |
|
||||
| 30 | **DICOM打印(胶片)** | 基本功能规范 | 胶片打印接口 | 2天 |
|
||||
|
||||
**小计**: 12天
|
||||
|
||||
### 2.8 护理评估(3项缺失)
|
||||
|
||||
| # | 缺失能力 | 三甲依据 | 实现方案 | 预估工时 |
|
||||
|---|---------|---------|---------|:-------:|
|
||||
| 31 | **管道滑脱风险评估** | 护理安全 | 导管类型/位置/状态评估量表 | 2天 |
|
||||
| 32 | **营养风险筛查(NRS2002)** | 营养管理 | NRS2002量表+自动评分 | 2天 |
|
||||
| 33 | **疼痛评估(NRS/VAS)** | 疼痛管理 | NRS/VAS评分+干预+再评估 | 2天 |
|
||||
|
||||
**小计**: 6天
|
||||
|
||||
### 2.9 护士站(3项缺失)
|
||||
|
||||
| # | 缺失能力 | 三甲依据 | 实现方案 | 预估工时 |
|
||||
|---|---------|---------|---------|:-------:|
|
||||
| 34 | **护理文书(一般/危重)** | 病历书写规范 | 一般/危重护理记录单模板 | 3天 |
|
||||
| 35 | **护理质量指标上报** | 护理质量 | 护理敏感指标自动采集+上报 | 3天 |
|
||||
| 36 | **护理交接班(重点患者)** | 护理安全 | 电子交接班+重点患者提示 | 2天 |
|
||||
|
||||
**小计**: 8天
|
||||
|
||||
### 2.10 ESB集成平台(6项缺失)
|
||||
|
||||
| # | 缺失能力 | 三甲依据 | 实现方案 | 预估工时 |
|
||||
|---|---------|---------|---------|:-------:|
|
||||
| 37 | **HL7 FHIR R4消息转换** | 互联互通 | FHIR资源映射+格式转换 | 5天 |
|
||||
| 38 | **CDA临床文档** | 互联互通 | 入院/出院/检验/处方CDA文档 | 5天 |
|
||||
| 39 | **院内编码↔标准编码映射** | 互联互通 | ICD-10/LOINC/SNOMED CT映射 | 3天 |
|
||||
| 40 | **集成监控仪表盘** | 互联互通 | 消息流量/成功率/失败率可视化 | 3天 |
|
||||
| 41 | **消息可靠性保障** | 互联互通 | 存储转发+确认机制+死信处理 | 3天 |
|
||||
| 42 | **接口版本管理** | 互联互通 | 接口版本控制+向后兼容 | 2天 |
|
||||
|
||||
**小计**: 21天
|
||||
|
||||
### 2.11 EMPI患者主索引(3项缺失)
|
||||
|
||||
| # | 缺失能力 | 三甲依据 | 实现方案 | 预估工时 |
|
||||
|---|---------|---------|---------|:-------:|
|
||||
| 43 | **患者身份合并/拆分** | EMPI | 多来源患者信息合并+拆分 | 3天 |
|
||||
| 44 | **重复检测算法** | 数据质量 | 身份证+姓名+手机号模糊匹配 | 3天 |
|
||||
| 45 | **跨系统同步** | 互联互通 | EMPI→HIS/LIS/PACS/EMR同步 | 3天 |
|
||||
|
||||
**小计**: 9天
|
||||
|
||||
### 2.12 统计报表(5项缺失)
|
||||
|
||||
| # | 缺失能力 | 三甲依据 | 实现方案 | 预估工时 |
|
||||
|---|---------|---------|---------|:-------:|
|
||||
| 46 | **质控指标自动采集** | 评审指标 | 十八项核心制度执行指标 | 3天 |
|
||||
| 47 | **DRG/DIP分析** | 医保支付 | 病组分布/费用结构/时间消耗 | 3天 |
|
||||
| 48 | **经营分析(科室成本)** | 经营管理 | 科室成本/收益/绩效分析 | 3天 |
|
||||
| 49 | **数据导出(Excel/PDF)** | 基本功能 | 多格式导出+定时推送 | 2天 |
|
||||
| 50 | **可视化仪表盘** | 高级功能 | 数据大屏+图表展示 | 3天 |
|
||||
|
||||
**小计**: 14天
|
||||
|
||||
### 2.13 门诊医生站(1项缺失)
|
||||
|
||||
| # | 缺失能力 | 三甲依据 | 实现方案 | 预估工时 |
|
||||
|---|---------|---------|---------|:-------:|
|
||||
| 51 | **传染病报告卡** | 传染病管理 | 传染病直报卡填报+审核 | 3天 |
|
||||
|
||||
**小计**: 3天
|
||||
|
||||
### 2.14 合理用药(1项缺失)
|
||||
|
||||
| # | 缺失能力 | 三甲依据 | 实现方案 | 预估工时 |
|
||||
|---|---------|---------|---------|:-------:|
|
||||
| 52 | **肝肾功能自动调量** | 合理用药 | 根据化验结果自动建议调量 | 3天 |
|
||||
|
||||
**小计**: 3天
|
||||
|
||||
---
|
||||
|
||||
## 三、31项基础实现补全清单
|
||||
|
||||
> 以下模块已有表结构/框架,但功能未完善,需补全。
|
||||
|
||||
### 3.1 需补全的基础实现
|
||||
|
||||
| # | 模块 | 当前状态 | 需补全内容 | 预估工时 |
|
||||
|---|------|---------|-----------|:-------:|
|
||||
| B1 | 门诊退号 | 空壳视图 | 退号流程+费用退回 | 2天 |
|
||||
| B2 | 门诊退药 | 空壳视图 | 退药申请+审批+重新入库 | 2天 |
|
||||
| B3 | 门诊退费 | 空壳视图 | 退费流程+医保回退 | 2天 |
|
||||
| B4 | 收费详情查询 | 空壳视图 | 费用明细+发票查询 | 1天 |
|
||||
| B5 | 申请单管理 | 空壳视图 | 检验检查申请单查看 | 2天 |
|
||||
| B6 | 结果查看 | 空壳视图 | LIS/PACS结果统一查看 | 2天 |
|
||||
| B7 | 医嘱查看与打印 | 空壳视图 | 医嘱单打印 | 1天 |
|
||||
| B8 | 入院诊断 | 空壳视图 | 入院诊断录入+ICD编码 | 2天 |
|
||||
| B9 | 医嘱管理 | 空壳视图 | 医嘱查询+统计 | 2天 |
|
||||
| B10 | 门诊收费结算 | 空壳视图 | 结算流程完善 | 2天 |
|
||||
| B11 | 排班管理 | 空壳视图 | 医生排班+号源管理 | 2天 |
|
||||
| B12 | 病案管理 | 空壳视图 | 病案借阅/封存/示踪 | 3天 |
|
||||
| B13 | 费用清单 | 空壳视图 | 患者每日费用清单 | 2天 |
|
||||
| B14 | 手术管理 | 空壳视图 | 手术全流程管理 | 3天 |
|
||||
| B15 | 服务目录 | 空壳视图 | 诊疗服务项目目录 | 2天 |
|
||||
| B16 | 常用诊断 | 空壳视图 | 常用诊断维护 | 1天 |
|
||||
| B17 | 中医处方 | 空壳视图 | 中药饮片处方 | 2天 |
|
||||
| B18 | 床位管理 | 空壳视图 | 实时床位图+利用率统计 | 2天 |
|
||||
| B19 | 费用配置 | 空壳视图 | 收费项目配置 | 1天 |
|
||||
| B20 | LIS对照 | 空壳视图 | 检验项目目录对照 | 2天 |
|
||||
| B21 | PACS对照 | 空壳视图 | 检查项目目录对照 | 2天 |
|
||||
| B22 | 诊断对照 | 空壳视图 | 院内诊断↔ICD↔医保诊断 | 2天 |
|
||||
| B23 | 货位管理 | 空壳视图 | 药品货位维护 | 2天 |
|
||||
| B24 | 调价管理 | 空壳视图 | 药品/服务调价流程 | 2天 |
|
||||
| B25 | 退药管理 | 空壳视图 | 药房退药流程 | 2天 |
|
||||
| B26 | 自动计算 | 空壳视图 | 自动计费规则 | 2天 |
|
||||
|
||||
**小计**: 49天
|
||||
|
||||
---
|
||||
|
||||
## 四、广西地方特色模块(P2)
|
||||
|
||||
| # | 模块 | 广西要求 | 实现方案 | 预估工时 |
|
||||
|---|------|---------|---------|:-------:|
|
||||
| G1 | **壮医/中医特色** | 广西壮医药诊疗 | 壮医望诊/脉诊/目诊+中药方剂模板 | 10天 |
|
||||
| G2 | **传染病直报** | 对接广西疾控 | 传染病自动筛查+直报对接 | 5天 |
|
||||
| G3 | **电子健康卡** | 对接广西平台 | 健康卡申领+就诊使用 | 5天 |
|
||||
| G4 | **电子票据** | 对接广西财政 | 财政电子票据+核销对账 | 5天 |
|
||||
| G5 | **DRG/DIP深化** | 广西医保规则 | 广西DRG/DIP分组+费用预警 | 10天 |
|
||||
|
||||
**小计**: 35天
|
||||
|
||||
---
|
||||
|
||||
## 五、实施路线图
|
||||
|
||||
### Phase 1: 核心达标(Sprint 1-4,4周)
|
||||
|
||||
**目标**: 补齐P0缺失能力,达到电子病历4级基本要求
|
||||
|
||||
```
|
||||
Week 1: 住院医生站闭环 + 医嘱执行追踪 + 危急值处理
|
||||
Week 2: 麻醉评估 + 术中记录 + 麻醉小结 + 术后随访
|
||||
Week 3: 病历修改留痕 + 版本管理 + 完整性检查 + 时效监控
|
||||
Week 4: 病案首页质控 + HQMS上报 + 死亡病例讨论 + 病案示踪
|
||||
```
|
||||
|
||||
| 周 | 工作内容 | 工时 | 交付物 |
|
||||
|:--:|---------|:---:|--------|
|
||||
| W1 | 住院医生站4项缺失 | 16天 | 医嘱闭环+输血+临床路径+危急值 |
|
||||
| W2 | 手术麻醉4项缺失 | 12天 | 麻醉评估+术中记录+小结+随访 |
|
||||
| W3 | 电子病历4项缺失 | 10天 | 留痕+版本+完整性+时效 |
|
||||
| W4 | 病案管理5项缺失 | 13天 | 首页质控+HQMS+终末质控+示踪+死亡讨论 |
|
||||
| | **Phase 1 合计** | **51天** | |
|
||||
|
||||
### Phase 2: 评审保障(Sprint 5-8,4周)
|
||||
|
||||
**目标**: 补齐P1缺失能力,达到三甲评审合格线
|
||||
|
||||
```
|
||||
Week 5: 院感管理6项缺失
|
||||
Week 6: 护理评估3项 + 护士站3项
|
||||
Week 7: 检验3项 + 检查4项
|
||||
Week 8: ESB集成平台6项
|
||||
```
|
||||
|
||||
| 周 | 工作内容 | 工时 | 交付物 |
|
||||
|:--:|---------|:---:|--------|
|
||||
| W5 | 院感管理6项缺失 | 14天 | 自动筛查+暴发预警+目标监测+手卫生+环境+耐药菌 |
|
||||
| W6 | 护理+护士6项缺失 | 14天 | 管道评估+营养筛查+疼痛评估+护理文书+质量指标+交接班 |
|
||||
| W7 | LIS+PACS 7项缺失 | 18天 | 质控+室间质评+报告打印+DICOM+图文报告+影像对比+胶片 |
|
||||
| W8 | ESB集成6项 | 21天 | FHIR+CDA+编码映射+监控+可靠性+版本管理 |
|
||||
| | **Phase 2 合计** | **67天** | |
|
||||
|
||||
### Phase 3: 能力补全(Sprint 9-12,4周)
|
||||
|
||||
**目标**: 补全31项空壳视图 + 统计报表5项 + 其他缺失
|
||||
|
||||
```
|
||||
Week 9: 空壳视图第一批(门诊退号/退药/退费/收费详情/申请单/结果查看)
|
||||
Week 10: 空壳视图第二批(医嘱查看/入院诊断/医嘱管理/结算/排班/病案/费用)
|
||||
Week 11: 空壳视图第三批(手术/服务目录/常用诊断/中医处方/床位/费用配置)
|
||||
+ 统计报表5项
|
||||
Week 12: 空壳视图第四批(LIS/PACS/诊断对照/货位/调价/退药/自动计算)
|
||||
+ EMPI 3项 + 合理用药1项 + 传染病报告1项
|
||||
```
|
||||
|
||||
| 周 | 工作内容 | 工时 | 交付物 |
|
||||
|:--:|---------|:---:|--------|
|
||||
| W9 | 空壳视图6项 | 11天 | 门诊退号/退药/退费/收费详情/申请单/结果查看 |
|
||||
| W10 | 空壳视图7项 | 14天 | 医嘱查看/入院诊断/医嘱管理/结算/排班/病案/费用 |
|
||||
| W11 | 空壳视图6项+报表5项 | 20天 | 手术/服务目录/常用诊断/中医/床位/费用+统计报表 |
|
||||
| W12 | 空壳视图7项+EMPI+合理用药+传染病 | 22天 | 目录对照/货位/调价/退药/计算+EMPI+调量+报卡 |
|
||||
| | **Phase 3 合计** | **67天** | |
|
||||
|
||||
### Phase 4: 地方特色(Sprint 13-15,3周)
|
||||
|
||||
**目标**: 满足广西地方要求
|
||||
|
||||
```
|
||||
Week 13: 壮医/中医特色 + 传染病直报
|
||||
Week 14: 电子健康卡 + 电子票据
|
||||
Week 15: DRG/DIP深化
|
||||
```
|
||||
|
||||
| 周 | 工作内容 | 工时 | 交付物 |
|
||||
|:--:|---------|:---:|--------|
|
||||
| W13 | 壮医/中医+传染病 | 15天 | 壮医诊疗+中药方剂+传染病直报 |
|
||||
| W14 | 电子健康卡+电子票据 | 10天 | 健康卡对接+财政票据 |
|
||||
| W15 | DRG/DIP深化 | 10天 | 广西DRG/DIP分组+费用预警 |
|
||||
| | **Phase 4 合计** | **35天** | |
|
||||
|
||||
---
|
||||
|
||||
## 六、工时汇总
|
||||
|
||||
| 类别 | 模块数 | 工时 | 占比 |
|
||||
|------|:-----:|:----:|:----:|
|
||||
| 🔴 P0 核心达标(Phase 1) | 17项 | 51天 | 19% |
|
||||
| 🟡 P1 评审保障(Phase 2) | 25项 | 67天 | 26% |
|
||||
| 🔧 空壳补全+其他(Phase 3) | 37项 | 67天 | 26% |
|
||||
| 🟢 P2 地方特色(Phase 4) | 5项 | 35天 | 14% |
|
||||
| **合计** | **84项** | **220天** | — |
|
||||
|
||||
> **并行开发估算**:
|
||||
> - 2人并行: ~16周(4个月)
|
||||
> - 3人并行: ~11周(3个月)
|
||||
> - 4人并行: ~8周(2个月)
|
||||
|
||||
---
|
||||
|
||||
## 七、关键里程碑
|
||||
|
||||
| 里程碑 | 时间 | 验收标准 | 评审支撑 |
|
||||
|--------|------|---------|---------|
|
||||
| **M1** | Phase 1 结束 | 电子病历4级核心能力就绪 | 电子病历评级申请 |
|
||||
| **M2** | Phase 2 结束 | 三甲评审17项必测项全部覆盖 | 三甲评审自查 |
|
||||
| **M3** | Phase 3 结束 | 142项必备能力完成率≥90% | 评审材料准备 |
|
||||
| **M4** | Phase 4 结束 | 广西地方特色全覆盖 | 地方评审加分 |
|
||||
|
||||
---
|
||||
|
||||
## 八、风险与依赖
|
||||
|
||||
### 8.1 技术风险
|
||||
|
||||
| 风险 | 影响 | 缓解措施 |
|
||||
|------|------|---------|
|
||||
| ESB集成平台复杂度高 | Phase 2延期 | 优先使用开源集成引擎(Kafka/RabbitMQ) |
|
||||
| PACS设备对接不确定性 | 图像采集延期 | 先做框架,设备对接延后 |
|
||||
| 医保接口联调周期长 | DRG/DIP延期 | 预留联调缓冲期 |
|
||||
|
||||
### 8.2 外部依赖
|
||||
|
||||
| 依赖 | 影响 | 应对 |
|
||||
|------|------|------|
|
||||
| 广西医保平台接口文档 | DRG/DIP对接 | 提前获取文档 |
|
||||
| CA签名服务商 | 电子签名 | 已有基础,扩展即可 |
|
||||
| HL7 FHIR认证 | 互联互通测评 | 参考国家标准实现 |
|
||||
|
||||
---
|
||||
|
||||
## 九、验证计划
|
||||
|
||||
### 9.1 每Phase验证
|
||||
|
||||
| Phase | 验证内容 | 验证方式 |
|
||||
|-------|---------|---------|
|
||||
| Phase 1 | 医嘱闭环→麻醉记录→病历留痕→病案首页 | 端到端流程测试 |
|
||||
| Phase 2 | 院感监测→护理评估→LIS/PACS→ESB集成 | 接口联通测试 |
|
||||
| Phase 3 | 空壳视图功能→统计报表→EMPI | 功能验收测试 |
|
||||
| Phase 4 | 壮医模块→传染病直报→电子票据→DRG | 地方标准对照 |
|
||||
|
||||
### 9.2 评审指标验证
|
||||
|
||||
| 指标 | 验证方法 | 目标值 |
|
||||
|------|---------|:------:|
|
||||
| 处方审核率 | 统计全院处方审核覆盖率 | 100% |
|
||||
| 首页编码正确率 | 抽样检查ICD-10编码 | ≥95% |
|
||||
| 病案24h归档率 | 统计出院后归档时间 | ≥90% |
|
||||
| 危急值处理及时率 | 统计危急值处理时间 | ≥95% |
|
||||
| 电子病历评级 | 对照4级评价标准自评 | ≥4级 |
|
||||
| 互联互通成熟度 | 对照四级甲等标准自评 | ≥四级甲等 |
|
||||
|
||||
---
|
||||
|
||||
## 十、与现有开发规范对齐
|
||||
|
||||
本计划严格遵循 `AGENTS.md` 中的开发规范:
|
||||
|
||||
| 规范 | 对齐方式 |
|
||||
|------|---------|
|
||||
| **铁律1: 修改完必须测试** | 每个Phase结束运行`mvn test`+`npm run build:dev` |
|
||||
| **铁律2: Flyway迁移** | 每个新模块创建`V{版本号}__{描述}.sql` |
|
||||
| **铁律5: 状态值一致性** | 新增状态值走完整链路检查 |
|
||||
| **铁律9: 先审核原有代码** | 每个模块开发前搜索已有代码 |
|
||||
| **铁律12: 按设计文档自主开发** | 本文档确认后直接执行 |
|
||||
| **铁律18: 禁止破坏原有功能** | 每次修改后编译验证 |
|
||||
| **全链路6环分析** | 每个缺失能力走完整链路 |
|
||||
| **Karpathy准则** | 简洁优先,精准修改 |
|
||||
|
||||
---
|
||||
|
||||
> **文档版本**: v1.0
|
||||
> **最后更新**: 2026-06-17
|
||||
> **下一步**: 确认本文档后,立即开始 Phase 1 Week 1 开发
|
||||
BIN
MD/HEALTHLINK_HIS_PRICING_PROPOSAL_0.2.docx
Normal file
724
MD/HEALTHLINK_HIS_PRICING_PROPOSAL_0.2.md
Normal file
@@ -0,0 +1,724 @@
|
||||
---
|
||||
文档类型: 公众号软文 / 产品报价方案
|
||||
版本: V4.0
|
||||
日期: 2026-06-16
|
||||
标题: 医院信息化到底要花多少钱?— HealthLink-HIS 按模块透明报价全公开
|
||||
---
|
||||
|
||||
# 医院信息化到底要花多少钱?— HealthLink-HIS 按模块透明报价全公开
|
||||
|
||||
> **上海经创贺联信息科技有限公司**
|
||||
|
||||
---
|
||||
|
||||
医院信息化建设,院长们最头疼的三个问题:
|
||||
|
||||
- **贵** — 传统 HIS 系统动辄百万起步,基层医院望而却步
|
||||
- **复杂** — 花了大价钱买全套系统,一半功能用不上,一半需求没覆盖
|
||||
- **不适配** — 大医院的系统搬到小医院水土不服,小医院的系统到大医院不够用
|
||||
|
||||
这三个问题的根源,其实是同一个:**HIS 系统的定价方式不透明**。你不知道自己为用不上的功能买了多少单,也不知道想加一个新模块到底要花多少钱。
|
||||
|
||||
**如果 HIS 系统能像搭积木一样,按需选配、逐个模块定价呢?**
|
||||
|
||||
今天,我们把 HealthLink-HIS 的 **108 个业务模块**全部拆开,让你清清楚楚看到:每一分钱,花在了哪里。
|
||||
|
||||
---
|
||||
|
||||
## 一、HealthLink-HIS 是什么来头?
|
||||
|
||||
先亮几个数据,让你对这套系统有个基本认知:
|
||||
|
||||
| 维度 | 数据 | 说明 |
|
||||
|------|------|------|
|
||||
| 代码提交 | **2,265 次** | 40+ 工程师半年密集迭代 |
|
||||
| 新增功能 | **111 项** | 覆盖门诊、住院、手术、检验等全业务 |
|
||||
| Bug 修复 | **1,400+** | 系统稳定性持续打磨 |
|
||||
| 业务模块 | **108 个** | 14 大业务域全覆盖 |
|
||||
| 数据库表 | **181 张** | 全业务域数据模型 |
|
||||
| 后端接口 | **230 个** | 45 个业务模块统一接口规范 |
|
||||
| 前端页面 | **209 个** | 42 个功能模块操作体验一致 |
|
||||
|
||||
**一句话总结**:这不是一套 PPT 产品,是一套已经在多家医院上线运行、经过 1,400+ 个 Bug 修复打磨的实战系统。
|
||||
|
||||
### 技术栈:走在行业前面
|
||||
|
||||
| 技术维度 | HealthLink-HIS | 行业主流 | 优势 |
|
||||
|---------|:-------------:|:--------:|------|
|
||||
| 后端框架 | **Spring Boot 4.0.6** | 2.x/3.x | 业内首批升级,性能与安全全面领先 |
|
||||
| 运行时 | **JDK 25** | 17/21 | 最新长期支持版 |
|
||||
| 前端框架 | **Vue 3 + Vite** | Vue 2/jQuery | 现代化体验,首屏加载快 3 倍 |
|
||||
| 高性能表格 | **VxeTable** | el-table | 万级数据量流畅渲染 |
|
||||
| 数据库 | **PostgreSQL 15+** | MySQL/Oracle | 企业级开源,零授权费 |
|
||||
| 工作流 | **Flowable BPMN** | 自研/无 | 国际标准流程引擎 |
|
||||
| 数据标准 | **HL7 FHIR R4** | 私有协议 | 互联互通标准协议 |
|
||||
| 电子签名 | **CA 认证** | 无/第三方 | 法律效力保障 |
|
||||
|
||||
### 资质与合规
|
||||
|
||||
- 符合《医院信息系统基本功能规范》(卫生部)
|
||||
- 支持**电子病历应用水平分级评价 4 级及以上**
|
||||
- 支持**医院信息互联互通标准化成熟度 4A 级**
|
||||
- 对标《三级医院评审标准(2022版)》
|
||||
- 符合 WS/T 447、WS/T 448、WS/T 500 行业标准
|
||||
- 支持广西地方标准(壮医/瑶医、疾控直报、电子健康卡)
|
||||
|
||||
---
|
||||
|
||||
## 二、部署方式:灵活适配您的基础设施
|
||||
|
||||
我们提供多种部署方式,适配不同医院的 IT 基础设施条件:
|
||||
|
||||
| 部署方式 | 适用场景 | 特点 | 参考周期 |
|
||||
|---------|---------|------|:------:|
|
||||
| **私有化部署** | 有自建机房的二/三级医院 | 数据完全自主可控,部署在院内服务器 | 1-2周 |
|
||||
| **混合云部署** | 希望兼顾安全与弹性的医院 | 核心数据院内存储,非核心业务上云 | 1-2周 |
|
||||
| **SaaS 托管** | 基层医疗机构、社区卫生中心 | 零运维、按年付费、快速上线 | 3-5天 |
|
||||
| **信创环境部署** | 有信创要求的公立医院 | 适配国产操作系统/数据库/中间件 | 2-3周 |
|
||||
|
||||
### 服务器配置参考
|
||||
|
||||
| 医院规模 | 推荐配置 | 并发用户 |
|
||||
|---------|---------|:------:|
|
||||
| 一级医院(<100 床) | 4核8G / 500G SSD | 50+ |
|
||||
| 二级医院(100-500 床) | 8核16G / 1T SSD + 数据库服务器 | 100+ |
|
||||
| 三级医院(500+ 床) | 集群部署 / 负载均衡 / 主从数据库 | 300+ |
|
||||
|
||||
> 具体配置根据实际业务量和并发需求调整,可提供免费评估服务。
|
||||
|
||||
---
|
||||
|
||||
## 三、108 个模块,逐个标价
|
||||
|
||||
> **计价基准**:工程师单价 **1,500 元/人天**
|
||||
>
|
||||
> 每个模块报价含:需求分析 + 设计 + 前端开发 + 后端开发 + 单元测试 + 联调
|
||||
>
|
||||
> 模块可单独选购,也可按下方套餐组合
|
||||
|
||||
### 系统平台层 — HIS 运行的基础设施
|
||||
|
||||
| 序号 | 模块 | 功能说明 | 人天 | 报价区间 |
|
||||
|:---:|------|---------|:---:|:------:|
|
||||
| P-01 | **系统管理** | 用户/角色/菜单/部门/岗位/字典/参数/公告/版本管理、多租户 | 10-15 | 1.5-2.5万 |
|
||||
| P-02 | **监控运维** | 缓存监控、服务器指标、登录日志、操作审计、在线用户追踪 | 5-8 | 0.8-1.2万 |
|
||||
| P-03 | **文件服务** | 统一文件上传/下载,多格式支持 | 3-5 | 0.3-0.8万 |
|
||||
| P-04 | **工作流引擎** | Flowable BPMN 流程定义/实例/任务/表单/表达式/监听器 | 10-15 | 1.5-2.5万 |
|
||||
| P-05 | **定时任务** | Cron 调度引擎,报表自动生成、数据同步 | 3-5 | 0.5-0.8万 |
|
||||
| P-06 | **代码生成器** | 数据库表→CRUD 代码自动生成 | 3-5 | 0.3-0.8万 |
|
||||
| P-07 | **数据导出** | Excel/PDF/CSV 多格式导出,定时推送 | 3-5 | 0.3-0.8万 |
|
||||
| P-08 | **首页仪表板** | 数据驾驶舱(处方统计/收入趋势/医生工作量/快捷入口) | 5-8 | 0.5-1.2万 |
|
||||
| | **平台层参考** | | **42-66** | **6-11万** |
|
||||
|
||||
### 门诊管理域 — 从挂号到完诊的完整闭环
|
||||
|
||||
| 序号 | 模块 | 功能说明 | 人天 | 报价区间 |
|
||||
|:---:|------|---------|:---:|:------:|
|
||||
| M-01 | **挂号预约** | 多渠道预约(窗口/自助机/线上)、退号退费、就诊卡管理、费用性质自动识别 | 10-15 | 1.5-2.5万 |
|
||||
| M-02 | **分诊叫号** | 智能分诊、排队管理、LCD/语音叫号、SSE 实时推送、等候时间预估 | 6-10 | 0.8-1.5万 |
|
||||
| M-03 | **门诊医生站** | 结构化病历、ICD-10 诊断(含中医体系)、处方(西药/中成药/中药饮片)、检验检查申请、手术申请、过敏史管理、传染病报卡 | 15-22 | 2-3.5万 |
|
||||
| M-04 | **门诊收费** | 多支付方式(现金/微信/支付宝/医保)、发票管理、退费、日终结算 | 10-15 | 1.5-2.5万 |
|
||||
| M-05 | **门诊药房** | 处方接收、发药、退药、处方审核、效期管理、管制药品管理 | 8-12 | 1-2万 |
|
||||
| M-06 | **门诊治疗** | 治疗执行、皮试记录、输液管理、处方拦截 | 6-10 | 0.8-1.5万 |
|
||||
| M-07 | **门诊手术** | 手术申请、术中临时医嘱、门诊手术计费 | 4-6 | 0.5-1万 |
|
||||
| | **门诊域参考** | | **59-90** | **9-14.5万** |
|
||||
|
||||
### 住院管理域 — 入出转全流程
|
||||
|
||||
| 序号 | 模块 | 功能说明 | 人天 | 报价区间 |
|
||||
|:---:|------|---------|:---:|:------:|
|
||||
| H-01 | **入院管理** | 入院登记(双入口)、床位分配、押金管理、预交金出入 | 10-15 | 1.5-2.5万 |
|
||||
| H-02 | **住院医生站** | 病程记录(8种模板)、医嘱(长期/临时)、诊断(西医+中医)、手术申请、会诊、输血、知情同意、临床路径、出院小结 | 18-28 | 3-4.5万 |
|
||||
| H-03 | **护士工作站** | 医嘱执行闭环、生命体征、体温单(D3.js)、护理记录、扫码执行、交接班、输液巡视、住院记账 | 14-20 | 2-3万 |
|
||||
| H-04 | **住院收费** | 费用聚合、中途结算、出院结算、每日费用清单 | 8-12 | 1-2万 |
|
||||
| H-05 | **床位管理** | 实时床位状态、出院自动转清洁、利用率统计 | 5-8 | 0.8-1.2万 |
|
||||
| H-06 | **医嘱闭环** | 医嘱全生命周期追踪、执行记录、超时提醒 | 5-8 | 0.8-1.2万 |
|
||||
| | **住院域参考** | | **60-91** | **10-14.4万** |
|
||||
|
||||
### 药品管理域 — 从采购到发药的全供应链
|
||||
|
||||
| 序号 | 模块 | 功能说明 | 人天 | 报价区间 |
|
||||
|:---:|------|---------|:---:|:------:|
|
||||
| D-01 | **药品目录** | 药品主数据、分类管理、医保目录对照 | 6-10 | 0.8-1.5万 |
|
||||
| D-02 | **药库管理** | 采购→验收→入库→退货→盘点→盈亏→调价,全流程单据审批 | 12-18 | 2-3万 |
|
||||
| D-03 | **药房管理** | 请领→入库→发药→退药→盘点→盈亏→退回药库 | 10-15 | 1.5-2.5万 |
|
||||
| D-04 | **科室物资管理** | 科室请领→发放→入库→转入/转出→盘点→盈亏→退库 | 8-12 | 1-2万 |
|
||||
| D-05 | **库存管理** | 实时库存、预警、调拨、盘点、报损、调价、追溯号 | 10-15 | 1.5-2.5万 |
|
||||
| D-06 | **药品追溯** | 一品一码扫码追溯、全供应链追踪、追溯预警 | 5-8 | 0.8-1.2万 |
|
||||
| D-07 | **合理用药** | 药物相互作用、过敏匹配、剂量审查、重复用药、配伍禁忌、妊娠/哺乳警示、儿童用药、处方前置拦截 | 10-15 | 1.5-2.5万 |
|
||||
| D-08 | **抗菌药物管控** | 三级分类、权限拦截、DDD 监测、审批流程 | 5-8 | 0.8-1.2万 |
|
||||
| D-09 | **处方点评** | 自动筛查+人工点评+科室排名+统计 | 4-6 | 0.5-1万 |
|
||||
| D-10 | **日终结算** | 药房日结/月结/年结 | 2-4 | 0.3-0.6万 |
|
||||
| D-11 | **药品效期管理** | 3/6/12 月效期预警、先进先出、过期自动拦截 | 3-5 | 0.5-0.8万 |
|
||||
| | **药品域参考** | | **75-116** | **11-18.8万** |
|
||||
|
||||
### 检验检查域 — LIS + PACS + 病理
|
||||
|
||||
| 序号 | 模块 | 功能说明 | 人天 | 报价区间 |
|
||||
|:---:|------|---------|:---:|:------:|
|
||||
| L-01 | **检验管理(LIS)** | 申请接收、条码管理、标本采集/接收、结果录入、报告审核/发布、参考范围、历史对比 | 14-20 | 2-3万 |
|
||||
| L-02 | **危急值管理** | 自动识别→弹窗通知→确认→处置→闭环追踪 | 4-6 | 0.5-1万 |
|
||||
| L-03 | **检验质控** | 室内质控(Westgard 规则)、室间质评 | 5-8 | 0.8-1.2万 |
|
||||
| L-04 | **检验增强** | 检验类型/套餐/活动定义管理、历史对比 | 5-8 | 0.8-1.2万 |
|
||||
| L-05 | **检查管理(PACS)** | 申请接收、预约排队、DICOM 图像采集、结构化图文报告、紧急报告、影像对比、DICOM 打印 | 12-18 | 2-3万 |
|
||||
| L-06 | **3D 影像重建** | DICOM 三维重建、多平面重建(MPR)、体积渲染 | 6-10 | 1-1.5万 |
|
||||
| L-07 | **病理管理** | 病理申请、标本追踪、制片流程、三级诊断、报告管理 | 8-12 | 1-2万 |
|
||||
| L-08 | **医技工作站** | 检验申请单号自动生成、套餐管理、执行科室智能匹配 | 5-8 | 0.8-1.2万 |
|
||||
| | **检验检查域参考** | | **59-90** | **9-14.1万** |
|
||||
|
||||
### 手术麻醉域 — 高风险高价值
|
||||
|
||||
| 序号 | 模块 | 功能说明 | 人天 | 报价区间 |
|
||||
|:---:|------|---------|:---:|:------:|
|
||||
| S-01 | **手术管理** | 手术申请、分级审批、手术室安排(冲突检查)、手术计费、手术统计 | 12-18 | 2-3万 |
|
||||
| S-02 | **术前讨论** | 三/四级手术强制讨论、讨论记录、签名审核 | 4-6 | 0.5-1万 |
|
||||
| S-03 | **麻醉管理** | 麻醉评估(ASA分级)、麻醉方案、术中记录(5分钟间隔生命体征)、复苏评估 | 8-12 | 1.2-2万 |
|
||||
| S-04 | **手术安全核查** | WS/T 313 三次核查(麻醉前/切皮前/离室前) | 3-5 | 0.5-0.8万 |
|
||||
| S-05 | **手术记录** | 手术团队、时间、植入物、标本、出血量、并发症 | 3-5 | 0.5-0.8万 |
|
||||
| S-06 | **术后随访** | 24h/48h/72h 术后随访 | 2-4 | 0.3-0.6万 |
|
||||
| S-07 | **麻醉质控** | 麻醉安全指标、不良事件上报 | 3-5 | 0.5-0.8万 |
|
||||
| | **手术麻醉域参考** | | **35-55** | **5.5-9万** |
|
||||
|
||||
### 电子病历域 — 直接影响电子病历评级
|
||||
|
||||
| 序号 | 模块 | 功能说明 | 人天 | 报价区间 |
|
||||
|:---:|------|---------|:---:|:------:|
|
||||
| E-01 | **结构化病历** | 结构化+自由文本混合录入、ICD-10 自动编码推荐 | 6-10 | 0.8-1.5万 |
|
||||
| E-02 | **模板管理** | 系统+科室+个人三级模板体系 | 4-6 | 0.5-1万 |
|
||||
| E-03 | **修改追踪** | 修改留痕(原文+修改人+时间)、差异对比 | 3-5 | 0.5-0.8万 |
|
||||
| E-04 | **版本管理** | 历史版本保存、版本对比 | 2-4 | 0.3-0.6万 |
|
||||
| E-05 | **完整性检查** | 必填项+逻辑一致性自动检查 | 3-5 | 0.5-0.8万 |
|
||||
| E-06 | **时效监控** | 入院记录 24h、首次病程 8h 等时限提醒 | 2-4 | 0.3-0.6万 |
|
||||
| E-07 | **CA 电子签名** | 文书电子签名、签名验证、历史、撤销 | 4-6 | 0.5-1万 |
|
||||
| E-08 | **病历检索** | 按诊断/时间/医生多维度检索 | 3-5 | 0.5-0.8万 |
|
||||
| E-09 | **知识库链接** | 病历中嵌入临床指南/药物信息 | 3-5 | 0.5-0.8万 |
|
||||
| E-10 | **打印归档** | 病历打印、出院自动归档、24h 归档率统计 | 3-5 | 0.5-0.8万 |
|
||||
| E-11 | **病程记录** | 首次/日常/上级查房/阶段小结/抢救/转科/出院/死亡记录模板 | 5-8 | 0.8-1.2万 |
|
||||
| E-12 | **知情同意** | 电子知情同意书模板+签名 | 3-5 | 0.5-0.8万 |
|
||||
| | **电子病历域参考** | | **41-68** | **6.2-10.7万** |
|
||||
|
||||
### 病案管理域 — DRG/DIP 分组质量的基础
|
||||
|
||||
| 序号 | 模块 | 功能说明 | 人天 | 报价区间 |
|
||||
|:---:|------|---------|:---:|:------:|
|
||||
| R-01 | **病案首页** | 数据自动采集、ICD-10 编码推荐与验证、ICD-9-CM-3 手术编码 | 8-12 | 1-2万 |
|
||||
| R-02 | **病案质控** | 首页数据质量检查、运行+终末病历质控 | 5-8 | 0.8-1.2万 |
|
||||
| R-03 | **DRG/DIP 分组** | 自动分组、费用预警、TOP-DRG 分析、优化建议 | 8-12 | 1-2万 |
|
||||
| R-04 | **病案归档** | 出院自动归档、24h 归档率追踪 | 3-5 | 0.5-0.8万 |
|
||||
| R-05 | **病案借阅/封存** | 借阅审批+超期提醒、纠纷封存、病案示踪 | 4-6 | 0.5-1万 |
|
||||
| R-06 | **死亡病历讨论** | 死亡病例 7 日内讨论记录 | 2-3 | 0.3-0.5万 |
|
||||
| R-07 | **病案评审** | 评审计划、记录、统计 | 3-5 | 0.5-0.8万 |
|
||||
| | **病案域参考** | | **33-51** | **5.1-8.3万** |
|
||||
|
||||
### 护理管理域 — 患者安全的最后防线
|
||||
|
||||
| 序号 | 模块 | 功能说明 | 人天 | 报价区间 |
|
||||
|:---:|------|---------|:---:|:------:|
|
||||
| N-01 | **护理评估** | Braden/Morse/NRS2002/NRS-VAS/Caprini/Barthel 六大评估量表,自动评分+预警 | 10-15 | 1.5-2.5万 |
|
||||
| N-02 | **护理计划** | 基于评估结果自动生成护理计划 | 4-6 | 0.5-1万 |
|
||||
| N-03 | **交班记录** | 护理交接班、重点患者提示 | 3-5 | 0.5-0.8万 |
|
||||
| N-04 | **移动护理** | 扫码执行医嘱(腕带/药品/标本) | 5-8 | 0.8-1.2万 |
|
||||
| N-05 | **输液管理** | 输液巡视记录、速度监控 | 3-5 | 0.5-0.8万 |
|
||||
| N-06 | **评估趋势** | 历次评估结果动态趋势图 | 3-5 | 0.5-0.8万 |
|
||||
| N-07 | **护理质控** | 护理敏感质量指标自动采集+上报 | 3-5 | 0.5-0.8万 |
|
||||
| N-08 | **护理文书** | 一般/危重护理记录单 | 3-5 | 0.5-0.8万 |
|
||||
| | **护理域参考** | | **34-54** | **5.3-8.7万** |
|
||||
|
||||
### 院感管理域 — 三甲评审重点检查项
|
||||
|
||||
| 序号 | 模块 | 功能说明 | 人天 | 报价区间 |
|
||||
|:---:|------|---------|:---:|:------:|
|
||||
| I-01 | **感染监测** | 自动筛查疑似感染病例、上报院感科、跟踪 | 5-8 | 0.8-1.2万 |
|
||||
| I-02 | **暴发预警** | 同科室短时间多例感染预警 | 3-5 | 0.5-0.8万 |
|
||||
| I-03 | **目标性监测** | ICU/手术部位/导管相关感染 | 3-5 | 0.5-0.8万 |
|
||||
| I-04 | **手卫生监测** | 手卫生依从性统计 | 2-4 | 0.3-0.6万 |
|
||||
| I-05 | **环境监测** | 空气/物表/手培养监测 | 2-4 | 0.3-0.6万 |
|
||||
| I-06 | **多重耐药菌** | 检出→隔离→跟踪→解除 | 3-5 | 0.5-0.8万 |
|
||||
| I-07 | **职业暴露** | 锐器伤/暴露事件上报+随访 | 2-4 | 0.3-0.6万 |
|
||||
| I-08 | **消毒供应(CSSD)** | 器械包追溯、灭菌批次、效期预警 | 5-8 | 0.8-1.2万 |
|
||||
| | **院感域参考** | | **25-43** | **4-7.2万** |
|
||||
|
||||
### 医保管理域 — 直接关系到医院收入
|
||||
|
||||
| 序号 | 模块 | 功能说明 | 人天 | 报价区间 |
|
||||
|:---:|------|---------|:---:|:------:|
|
||||
| Y-01 | **医保基础结算** | 门诊/住院基本医保结算 | 6-10 | 0.8-1.5万 |
|
||||
| Y-02 | **目录对照** | 药品/诊疗/耗材三目录对照 | 6-10 | 0.8-1.5万 |
|
||||
| Y-03 | **医保对账** | 财务对账/清算、差异处理 | 5-8 | 0.8-1.2万 |
|
||||
| Y-04 | **处方上传** | 门诊处方上传/拒收/撤销 | 4-6 | 0.5-1万 |
|
||||
| Y-05 | **住院医保** | 住院登记/出院结算、DRG/DIP 结算 | 6-10 | 0.8-1.5万 |
|
||||
| Y-06 | **跨省结算** | 跨省异地就医直接结算 | 4-6 | 0.5-1万 |
|
||||
| Y-07 | **智能审核** | 事前/事中/事后三阶段审核规则引擎 | 6-10 | 0.8-1.5万 |
|
||||
| Y-08 | **DRG/DIP 优化** | 优化建议、费用结构分析 | 4-6 | 0.5-1万 |
|
||||
| | **医保域参考** | | **41-66** | **5.5-10.2万** |
|
||||
|
||||
### 集成平台层 — 面向三级医院的互联互通
|
||||
|
||||
| 序号 | 模块 | 功能说明 | 人天 | 报价区间 |
|
||||
|:---:|------|---------|:---:|:------:|
|
||||
| J-01 | **ESB 集成平台** | 消息路由、服务注册、消息监控、死信队列 | 10-15 | 1.5-2.5万 |
|
||||
| J-02 | **HL7 FHIR R4** | FHIR R4 标准消息格式 | 5-8 | 0.8-1.2万 |
|
||||
| J-03 | **CDA 文档** | 临床文档架构(入院/出院/检验/处方/手术/护理) | 5-8 | 0.8-1.2万 |
|
||||
| J-04 | **代码映射** | 院内编码↔标准编码映射 | 3-5 | 0.5-0.8万 |
|
||||
| J-05 | **API 认证审计** | 接口调用认证+授权+审计日志 | 2-4 | 0.3-0.6万 |
|
||||
| J-06 | **EMPI 患者主索引** | 身份合并/拆分、重复检测、跨系统统一标识 | 6-10 | 0.8-1.5万 |
|
||||
| | **集成平台参考** | | **31-50** | **4.7-7.8万** |
|
||||
|
||||
### 其他业务模块
|
||||
|
||||
| 序号 | 模块 | 功能说明 | 人天 | 报价区间 |
|
||||
|:---:|------|---------|:---:|:------:|
|
||||
| O-01 | **急诊管理** | 四级分诊、绿色通道(胸痛/卒中/创伤)、抢救/留观、D2T 监控 | 8-12 | 1-2万 |
|
||||
| O-02 | **随访管理** | 随访计划自动生成、任务分配、满意度调查 | 6-10 | 0.8-1.5万 |
|
||||
| O-03 | **中医/壮医** | 中医处方、体质辨识、民族药目录(壮药/瑶药) | 5-8 | 0.8-1.2万 |
|
||||
| O-04 | **会诊管理** | 会诊申请/审批/确认、超时监控、结果反馈 | 5-8 | 0.8-1.2万 |
|
||||
| O-05 | **传染病报告** | 报卡新增/审核/退回、Word 导出、统计 | 5-8 | 0.8-1.2万 |
|
||||
| O-06 | **调价管理** | 药品/器械/服务调价、审批流程 | 4-6 | 0.5-1万 |
|
||||
| O-07 | **支付管理** | 收费账单、电子发票、第三方支付集成 | 6-10 | 0.8-1.5万 |
|
||||
| O-08 | **医嘱套餐** | 医嘱组套配置(组织级/医院级/个人级) | 4-6 | 0.5-1万 |
|
||||
| O-09 | **医嘱闭环追踪** | 医嘱全生命周期执行步骤记录 | 4-6 | 0.5-1万 |
|
||||
| O-10 | **跨模块集成** | 术-病理关联、会诊监控、DRG 绩效、危急值联动、手术全链路追踪 | 8-12 | 1-2万 |
|
||||
| O-11 | **质量管理** | 质控增强、业务分析大屏、EMR 质量检查 | 4-6 | 0.5-1万 |
|
||||
| O-12 | **食源性数据采集** | 食源性疾病数据外接采集 | 2-4 | 0.3-0.6万 |
|
||||
| | **其他模块参考** | | **61-96** | **9-15.2万** |
|
||||
|
||||
### 全模块汇总
|
||||
|
||||
| 业务域 | 模块数 | 人天区间 | 参考报价 |
|
||||
|--------|:-----:|:------:|:------:|
|
||||
| 系统平台层 | 8 | 42-66 | 6-11万 |
|
||||
| 门诊管理域 | 7 | 59-90 | 9-14.5万 |
|
||||
| 住院管理域 | 6 | 60-91 | 10-14.4万 |
|
||||
| 药品管理域 | 11 | 75-116 | 11-18.8万 |
|
||||
| 检验检查域 | 8 | 59-90 | 9-14.1万 |
|
||||
| 手术麻醉域 | 7 | 35-55 | 5.5-9万 |
|
||||
| 电子病历域 | 12 | 41-68 | 6.2-10.7万 |
|
||||
| 病案管理域 | 7 | 33-51 | 5.1-8.3万 |
|
||||
| 护理管理域 | 8 | 34-54 | 5.3-8.7万 |
|
||||
| 院感管理域 | 8 | 25-43 | 4-7.2万 |
|
||||
| 医保管理域 | 8 | 41-66 | 5.5-10.2万 |
|
||||
| 其他业务模块 | 12 | 61-96 | 9-15.2万 |
|
||||
| 集成平台层 | 6 | 31-50 | 4.7-7.8万 |
|
||||
| **全量参考** | **108** | **596-936** | **约90-150万** |
|
||||
|
||||
> 以上为软件开发的参考价格区间,实际报价根据医院具体需求、定制程度和接口数量确定。
|
||||
|
||||
---
|
||||
|
||||
## 四、三个版本,按需选配
|
||||
|
||||
不是每家医院都需要 108 个模块。我们根据医院等级,设计了三个标准版本:
|
||||
|
||||
| 方案 | 适用对象 | 模块数 | 软件参考报价 | 实施周期 |
|
||||
|------|---------|:-----:|:---------:|:------:|
|
||||
| **基础版** | 一级医院/社区卫生中心 | 18 | **18-25万** | 1-2月 |
|
||||
| **标准版** | 二级综合医院 | 52 | **55-70万** | 3-5月 |
|
||||
| **旗舰版** | 三级综合医院 | 108 | **90-120万** | 5-8月 |
|
||||
| **定制开发** | 特殊需求/已有HIS升级 | 按需 | **1,500元/人天起** | 按需 |
|
||||
|
||||
### 基础版 — 一级医院 / 社区卫生服务中心
|
||||
|
||||
**适合**:基层医疗机构、社区卫生服务中心、乡镇卫生院。快速上线、经济实惠。
|
||||
|
||||
| 业务域 | 包含模块 |
|
||||
|--------|---------|
|
||||
| 系统平台 | 系统管理、文件服务、定时任务、首页仪表板 |
|
||||
| 门诊管理 | 挂号预约、分诊叫号、门诊医生站、门诊收费、门诊药房 |
|
||||
| 住院管理 | 入院管理、护士工作站、住院收费、床位管理 |
|
||||
| 电子病历 | 结构化病历、模板管理 |
|
||||
| 医保管理 | 医保基础结算 |
|
||||
| 其他 | 调价管理、质量管理 |
|
||||
|
||||
**软件 + 实施 + 接口 + 首年维保,整体投入约 25-35 万。**
|
||||
|
||||
### 标准版 — 二级综合医院
|
||||
|
||||
**适合**:二级综合医院、中医医院、妇幼保健院。覆盖等级评审全部信息化条款。
|
||||
|
||||
在基础版之上新增:
|
||||
|
||||
| 业务域 | 新增模块 |
|
||||
|--------|---------|
|
||||
| 系统平台 | + 监控运维、工作流引擎、数据导出 |
|
||||
| 门诊管理 | + 门诊治疗、门诊手术 |
|
||||
| 住院管理 | + 住院医生站、医嘱闭环 |
|
||||
| 药品管理 | + 药品目录、药库、药房、科室物资、库存、合理用药、抗菌药物管控、处方点评、日终结算 |
|
||||
| 检验检查 | + 检验(LIS)、危急值、检查(PACS)、医技工作站 |
|
||||
| 手术麻醉 | + 手术管理、术前讨论、安全核查 |
|
||||
| 电子病历 | + 修改追踪、版本管理、完整性检查、时效监控、CA签名、检索、知识库、归档、病程记录、知情同意 |
|
||||
| 病案管理 | + 病案首页、病案质控、归档、借阅/封存 |
|
||||
| 护理管理 | + 护理评估、护理计划、交班记录、护理质控 |
|
||||
| 院感管理 | + 感染监测、暴发预警、多重耐药菌 |
|
||||
| 医保管理 | + 目录对照、对账、处方上传、住院医保 |
|
||||
| 其他 | + 急诊、随访、会诊、传染病报告、支付管理、医嘱套餐 |
|
||||
|
||||
**软件 + 实施 + 接口 + 首年维保,整体投入约 70-90 万。**
|
||||
|
||||
### 旗舰版 — 三级综合医院
|
||||
|
||||
**适合**:三级综合医院。全面覆盖三甲评审、DRG/DIP 支付改革、电子病历高等级评价、互联互通测评。
|
||||
|
||||
在标准版之上新增:
|
||||
|
||||
| 业务域 | 新增模块 |
|
||||
|--------|---------|
|
||||
| 药品管理 | + 药品追溯、药品效期管理 |
|
||||
| 检验检查 | + 检验质控、检验增强、3D影像重建、病理管理 |
|
||||
| 手术麻醉 | + 麻醉管理、手术记录、术后随访、麻醉质控 |
|
||||
| 病案管理 | + DRG/DIP分组、死亡病历讨论、病案评审 |
|
||||
| 护理管理 | + 移动护理、输液管理、评估趋势、护理文书 |
|
||||
| 院感管理 | + 目标性监测、手卫生、环境监测、职业暴露、CSSD |
|
||||
| 医保管理 | + 跨省结算、智能审核、DRG/DIP优化 |
|
||||
| 集成平台 | + ESB平台、FHIR R4、CDA文档、代码映射、API认证、EMPI |
|
||||
| 其他 | + 中医/壮医、医嘱闭环追踪、跨模块集成、食源性采集 |
|
||||
|
||||
**软件 + 实施 + 全量接口 + 评审支持 + 首年维保,整体投入约 130-160 万。**
|
||||
|
||||
---
|
||||
|
||||
## 五、几个值得重点关注的明星模块
|
||||
|
||||
在 108 个模块中,有几个模块是评审检查和日常运营中的"高频考点":
|
||||
|
||||
### 合理用药系统(1.5-2.5万)
|
||||
|
||||
12 项审核能力,让处方审核率 100% 不再是口号:
|
||||
- 药物相互作用检查(两药/三药配伍禁忌)
|
||||
- 过敏史自动匹配
|
||||
- 剂量范围审查(超/低剂量 + 肝肾功能自动调量)
|
||||
- 重复用药检查
|
||||
- 配伍禁忌审查
|
||||
- 妊娠/哺乳用药警示
|
||||
- 儿童用药按体重自动计算
|
||||
- **处方前置拦截**:不合理处方必须处理才能继续
|
||||
|
||||
### DRG/DIP 分组系统(1-2万)
|
||||
|
||||
医保付费改革的核心武器:
|
||||
- 主诊断+主手术 → 自动分组
|
||||
- 病组分布/费用结构/时间消耗分析
|
||||
- TOP-DRG 分析
|
||||
- 费用预警(入院即开始监控)
|
||||
- 优化建议(帮助医生在保证质量的前提下控制费用)
|
||||
|
||||
### 手术安全核查(0.5-0.8万)
|
||||
|
||||
符合 WS/T 313 标准的三次核查:麻醉前核查 → 切皮前核查 → 离室前核查。
|
||||
|
||||
看似价格最低的模块之一,却是手术安全最关键的防线。
|
||||
|
||||
### 护理评估系统(1.5-2.5万)
|
||||
|
||||
覆盖六大评估量表,自动评分+自动预警:
|
||||
- Braden 压疮评估 → 自动预警 → 干预 → 跟踪
|
||||
- Morse 跌倒评估 → 风险分级 → 防护措施
|
||||
- NRS2002 营养风险筛查
|
||||
- NRS/VAS 疼痛评估
|
||||
- Caprini VTE 风险评估
|
||||
- Barthel 自理能力评估
|
||||
|
||||
---
|
||||
|
||||
## 六、实施服务体系
|
||||
|
||||
### 6.1 标准实施流程
|
||||
|
||||
我们采用经过数十家医院验证的标准化实施流程:
|
||||
|
||||
| 阶段 | 内容 | 周期 | 交付物 |
|
||||
|------|------|:---:|-------|
|
||||
| **需求调研** | 现场调研、流程梳理、差距分析、需求确认 | 1-3周 | 需求确认书 |
|
||||
| **环境部署** | 服务器部署、网络配置、安全加固 | 3-5天 | 部署报告 |
|
||||
| **系统配置** | 参数配置、权限设置、字典维护、流程配置 | 1周 | 配置清单 |
|
||||
| **数据迁移** | 历史数据清洗、字段映射、数据导入、数据校验 | 1-3周 | 迁移报告 |
|
||||
| **用户培训** | 分角色培训、操作演练、考核通关 | 1-2周 | 培训签到表 |
|
||||
| **并行运行** | 新旧系统并行、问题修复、流程优化 | 2-4周 | 问题清单 |
|
||||
| **正式上线** | 切换上线、驻场陪跑、应急预案 | 1周 | 上线报告 |
|
||||
|
||||
### 6.2 数据迁移服务
|
||||
|
||||
| 服务项 | 说明 |
|
||||
|--------|------|
|
||||
| **数据评估** | 免费评估原系统数据结构和迁移可行性 |
|
||||
| **数据清洗** | 去重、纠错、标准化、编码映射 |
|
||||
| **字段映射** | 原系统字段→新系统字段自动+人工映射 |
|
||||
| **增量迁移** | 支持切换前最后一天的增量数据同步 |
|
||||
| **数据校验** | 迁移后逐条核对,确保数据完整性 |
|
||||
| **回滚预案** | 迁移失败可完整回滚,不影响业务 |
|
||||
|
||||
### 6.3 培训服务体系
|
||||
|
||||
| 培训对象 | 培训内容 | 课时 | 方式 |
|
||||
|---------|---------|:---:|------|
|
||||
| **系统管理员** | 系统配置、用户管理、字典维护、备份恢复 | 8-16h | 现场+远程 |
|
||||
| **医生** | 医生工作站、电子病历、处方、医嘱、手术申请 | 8-12h | 现场+视频 |
|
||||
| **护士** | 护士工作站、医嘱执行、护理评估、体温单 | 8-12h | 现场+视频 |
|
||||
| **收费员** | 挂号、收费、退费、日结、医保结算 | 4-8h | 现场 |
|
||||
| **药房人员** | 发药、退药、库存管理、盘点、日结 | 4-8h | 现场 |
|
||||
| **管理层** | 数据驾驶舱、统计报表、经营分析 | 2-4h | 现场+远程 |
|
||||
| **院感/质控** | 院感监测、病案管理、质控操作 | 4-8h | 现场+视频 |
|
||||
|
||||
> 提供培训视频和操作手册,支持新员工随时自主学习。
|
||||
|
||||
---
|
||||
|
||||
## 七、接口对接服务
|
||||
|
||||
| 接口类型 | 参考报价 | 说明 |
|
||||
|---------|:------:|------|
|
||||
| 检验设备对接(单台) | 0.3-0.8万 | LIS 仪器接口,支持主流品牌 |
|
||||
| 影像设备对接(单台) | 0.5-1.2万 | PACS/DICOM 设备 |
|
||||
| 医保平台对接 | 1-2万 | 省/国家医保平台 |
|
||||
| 卫健委数据上报 | 0.8-1.5万 | HQMS/传染病直报 |
|
||||
| 电子发票对接 | 0.5-1万 | 财政电子票据 |
|
||||
| 银行/第三方支付 | 0.5-1万 | 微信/支付宝/银联 |
|
||||
| 自助终端设备 | 0.5-1万 | 自助挂号机/取单机/报告打印机 |
|
||||
| 其他第三方系统 | 0.5-2万 | 按复杂度定价 |
|
||||
|
||||
---
|
||||
|
||||
## 八、售后服务分级
|
||||
|
||||
我们提供三级售后服务体系,满足不同医院的需求:
|
||||
|
||||
| 服务项目 | 标准服务 | 高级服务 | 尊享服务 |
|
||||
|---------|:------:|:------:|:------:|
|
||||
| 适用医院 | 一级 | 二级 | 三级 |
|
||||
| 首年维保 | **免费** | **免费** | **免费** |
|
||||
| 续费年维保 | 软件费×15% | 软件费×15% | 软件费×12% |
|
||||
| 远程支持 | 5×8h | 7×12h | 7×24h |
|
||||
| 故障响应 | 4小时 | 2小时 | 1小时 |
|
||||
| 现场支持 | 按需另计 | 2次/年 | 4次/年 |
|
||||
| 版本升级 | 小版本免费 | 大版本免费 | 全版本免费 |
|
||||
| 专属服务经理 | — | ✅ | ✅ |
|
||||
| 季度巡检 | — | — | ✅ |
|
||||
| 应急演练 | — | — | 1次/年 |
|
||||
| 重大活动保障 | — | — | 远程值守 |
|
||||
|
||||
### 服务等级协议(SLA)
|
||||
|
||||
| 故障等级 | 定义 | 响应时间 | 解决时间 |
|
||||
|:------:|------|:------:|:------:|
|
||||
| **P0 紧急** | 系统无法使用,业务完全中断 | 30分钟 | 4小时 |
|
||||
| **P1 严重** | 核心功能不可用,影响大量用户 | 1小时 | 8小时 |
|
||||
| **P2 一般** | 部分功能异常,有替代方案 | 4小时 | 24小时 |
|
||||
| **P3 轻微** | 界面/体验问题,不影响业务 | 8小时 | 72小时 |
|
||||
|
||||
---
|
||||
|
||||
## 九、定制开发服务
|
||||
|
||||
已有 HIS 系统?也没关系。我们提供模块化定制开发服务。
|
||||
|
||||
### 9.1 人员单价
|
||||
|
||||
| 角色 | 单价(元/人天) | 说明 |
|
||||
|------|:-------------:|------|
|
||||
| 开发工程师 | **1,500** | 需求分析+设计+开发+自测 |
|
||||
| 高级工程师 | **2,000** | 架构设计、性能优化、疑难问题 |
|
||||
| 项目经理 | **1,800** | 需求调研、项目管理、交付管理 |
|
||||
| 实施顾问 | **1,200** | 部署实施、培训、数据迁移 |
|
||||
|
||||
### 9.2 常见定制参考价
|
||||
|
||||
| 定制项目 | 预估人天 | 参考报价 |
|
||||
|---------|:------:|:------:|
|
||||
| 新增业务模块(中等复杂度) | 15-25 | 2-4万 |
|
||||
| 报表定制开发(单张) | 3-5 | 0.5-0.8万 |
|
||||
| 第三方系统接口对接(单个) | 5-10 | 0.8-1.5万 |
|
||||
| 已有模块功能增强 | 5-15 | 0.8-2.5万 |
|
||||
| 流程改造/优化 | 8-20 | 1-3万 |
|
||||
| 移动端功能开发 | 10-20 | 1.5-3万 |
|
||||
| 大屏可视化开发 | 8-15 | 1-2.5万 |
|
||||
| 单模块独立采购 | 见上方明细 | 0.3-3.5万/模块 |
|
||||
|
||||
### 9.3 定制开发流程
|
||||
|
||||
```
|
||||
需求沟通(1-2天) → 方案设计与报价(2-3天) → 合同签订 → 开发实施 → 内部测试 → 用户验收 → 上线交付
|
||||
```
|
||||
|
||||
### 9.4 交付标准
|
||||
|
||||
每次定制开发交付包含:
|
||||
- 功能代码(含单元测试)
|
||||
- 数据库迁移脚本(Flyway 版本化)
|
||||
- 接口文档(Swagger/OpenAPI 自动生成)
|
||||
- 用户操作说明
|
||||
- 测试报告
|
||||
|
||||
---
|
||||
|
||||
## 十、付款方式与验收
|
||||
|
||||
### 付款节奏
|
||||
|
||||
| 阶段 | 比例 | 条件 |
|
||||
|------|:---:|------|
|
||||
| 合同签订 | 30% | 合同签署后 5 个工作日 |
|
||||
| 系统开发完成进入测试 | 30% | 系统功能开发完成,进入内部测试阶段 |
|
||||
| 系统验收 | 30% | 系统上线并通过验收 |
|
||||
| 质保期满 | 10% | 首年维保期满后支付 |
|
||||
|
||||
### 验收标准
|
||||
|
||||
| 验收项 | 标准 |
|
||||
|--------|------|
|
||||
| 功能验收 | 合同约定的核心模块功能完整可用 |
|
||||
| 性能验收 | 核心页面加载 < 3秒,常规操作响应流畅 |
|
||||
| 数据验收 | 历史数据迁移完成,关键数据核对无误 |
|
||||
| 培训验收 | 主要岗位人员完成培训并能基本操作 |
|
||||
| 稳定性 | 连续运行 3 个工作日无阻断性故障 |
|
||||
|
||||
---
|
||||
|
||||
## 十一、为什么选择 HealthLink-HIS?
|
||||
|
||||
| 维度 | 选择理由 |
|
||||
|------|---------|
|
||||
| **技术领先** | Spring Boot 4.0 + JDK 25,业内首批升级 |
|
||||
| **架构扎实** | DDD 领域驱动 + Maven 多模块,业务独立演进 |
|
||||
| **功能完整** | 108 个模块,14 大业务域全覆盖 |
|
||||
| **质量可靠** | 2,265 次提交、1,400+ Bug 修复,持续打磨 |
|
||||
| **安全合规** | JWT + 多租户隔离 + CA 签名 + 数据加密 |
|
||||
| **达标有路** | 对标三甲评审标准,142 项必备能力已实现 59 项 |
|
||||
| **灵活选配** | 按需选配模块,从 18 万到 120 万自由组合 |
|
||||
| **灵活部署** | 支持私有云/混合云/SaaS/信创环境 |
|
||||
| **持续迭代** | 首年免费维保,版本升级持续获得新功能 |
|
||||
|
||||
---
|
||||
|
||||
## 联系我们
|
||||
|
||||
> **上海经创贺联信息科技有限公司**
|
||||
>
|
||||
> - 销售热线:18017857330
|
||||
> - 邮箱:chen.qi@jin-group.cn
|
||||
> - 官网:www.health-link.com.cn
|
||||
> - 地址:上海市闵行区甬虹路69号虹桥绿谷广场G座G栋505
|
||||
>
|
||||
> **支持免费远程演示,欢迎扫码预约体验!**
|
||||
>
|
||||
> *获取您医院的定制化报价方案,只需告诉我们医院等级和核心需求。*
|
||||
|
||||
---
|
||||
|
||||
## 附录:模块速查表
|
||||
|
||||
| 域 | 编号 | 模块 | 报价区间 | 基础版 | 标准版 | 旗舰版 |
|
||||
|----|:---:|------|:------:|:-----:|:-----:|:-----:|
|
||||
| 平台 | P-01 | 系统管理 | 1.5-2.5万 | ✅ | ✅ | ✅ |
|
||||
| 平台 | P-02 | 监控运维 | 0.8-1.2万 | | ✅ | ✅ |
|
||||
| 平台 | P-03 | 文件服务 | 0.3-0.8万 | ✅ | ✅ | ✅ |
|
||||
| 平台 | P-04 | 工作流引擎 | 1.5-2.5万 | | ✅ | ✅ |
|
||||
| 平台 | P-05 | 定时任务 | 0.5-0.8万 | ✅ | ✅ | ✅ |
|
||||
| 平台 | P-06 | 代码生成器 | 0.3-0.8万 | | | ✅ |
|
||||
| 平台 | P-07 | 数据导出 | 0.3-0.8万 | | ✅ | ✅ |
|
||||
| 平台 | P-08 | 首页仪表板 | 0.5-1.2万 | ✅ | ✅ | ✅ |
|
||||
| 门诊 | M-01 | 挂号预约 | 1.5-2.5万 | ✅ | ✅ | ✅ |
|
||||
| 门诊 | M-02 | 分诊叫号 | 0.8-1.5万 | ✅ | ✅ | ✅ |
|
||||
| 门诊 | M-03 | 门诊医生站 | 2-3.5万 | ✅ | ✅ | ✅ |
|
||||
| 门诊 | M-04 | 门诊收费 | 1.5-2.5万 | ✅ | ✅ | ✅ |
|
||||
| 门诊 | M-05 | 门诊药房 | 1-2万 | ✅ | ✅ | ✅ |
|
||||
| 门诊 | M-06 | 门诊治疗 | 0.8-1.5万 | | ✅ | ✅ |
|
||||
| 门诊 | M-07 | 门诊手术 | 0.5-1万 | | ✅ | ✅ |
|
||||
| 住院 | H-01 | 入院管理 | 1.5-2.5万 | ✅ | ✅ | ✅ |
|
||||
| 住院 | H-02 | 住院医生站 | 3-4.5万 | | ✅ | ✅ |
|
||||
| 住院 | H-03 | 护士工作站 | 2-3万 | ✅ | ✅ | ✅ |
|
||||
| 住院 | H-04 | 住院收费 | 1-2万 | ✅ | ✅ | ✅ |
|
||||
| 住院 | H-05 | 床位管理 | 0.8-1.2万 | ✅ | ✅ | ✅ |
|
||||
| 住院 | H-06 | 医嘱闭环 | 0.8-1.2万 | | ✅ | ✅ |
|
||||
| 药品 | D-01 | 药品目录 | 0.8-1.5万 | | ✅ | ✅ |
|
||||
| 药品 | D-02 | 药库管理 | 2-3万 | | ✅ | ✅ |
|
||||
| 药品 | D-03 | 药房管理 | 1.5-2.5万 | | ✅ | ✅ |
|
||||
| 药品 | D-04 | 科室物资 | 1-2万 | | ✅ | ✅ |
|
||||
| 药品 | D-05 | 库存管理 | 1.5-2.5万 | | ✅ | ✅ |
|
||||
| 药品 | D-06 | 药品追溯 | 0.8-1.2万 | | | ✅ |
|
||||
| 药品 | D-07 | 合理用药 | 1.5-2.5万 | | ✅ | ✅ |
|
||||
| 药品 | D-08 | 抗菌药物管控 | 0.8-1.2万 | | ✅ | ✅ |
|
||||
| 药品 | D-09 | 处方点评 | 0.5-1万 | | ✅ | ✅ |
|
||||
| 药品 | D-10 | 日终结算 | 0.3-0.6万 | | ✅ | ✅ |
|
||||
| 药品 | D-11 | 药品效期 | 0.5-0.8万 | | | ✅ |
|
||||
| 检验 | L-01 | 检验(LIS) | 2-3万 | | ✅ | ✅ |
|
||||
| 检验 | L-02 | 危急值 | 0.5-1万 | | ✅ | ✅ |
|
||||
| 检验 | L-03 | 检验质控 | 0.8-1.2万 | | | ✅ |
|
||||
| 检验 | L-04 | 检验增强 | 0.8-1.2万 | | | ✅ |
|
||||
| 检验 | L-05 | 检查(PACS) | 2-3万 | | ✅ | ✅ |
|
||||
| 检验 | L-06 | 3D重建 | 1-1.5万 | | | ✅ |
|
||||
| 检验 | L-07 | 病理 | 1-2万 | | | ✅ |
|
||||
| 检验 | L-08 | 医技工作站 | 0.8-1.2万 | | ✅ | ✅ |
|
||||
| 手术 | S-01 | 手术管理 | 2-3万 | | ✅ | ✅ |
|
||||
| 手术 | S-02 | 术前讨论 | 0.5-1万 | | ✅ | ✅ |
|
||||
| 手术 | S-03 | 麻醉管理 | 1.2-2万 | | | ✅ |
|
||||
| 手术 | S-04 | 安全核查 | 0.5-0.8万 | | ✅ | ✅ |
|
||||
| 手术 | S-05 | 手术记录 | 0.5-0.8万 | | | ✅ |
|
||||
| 手术 | S-06 | 术后随访 | 0.3-0.6万 | | | ✅ |
|
||||
| 手术 | S-07 | 麻醉质控 | 0.5-0.8万 | | | ✅ |
|
||||
| 病历 | E-01 | 结构化病历 | 0.8-1.5万 | ✅ | ✅ | ✅ |
|
||||
| 病历 | E-02 | 模板管理 | 0.5-1万 | ✅ | ✅ | ✅ |
|
||||
| 病历 | E-03 | 修改追踪 | 0.5-0.8万 | | ✅ | ✅ |
|
||||
| 病历 | E-04 | 版本管理 | 0.3-0.6万 | | ✅ | ✅ |
|
||||
| 病历 | E-05 | 完整性检查 | 0.5-0.8万 | | ✅ | ✅ |
|
||||
| 病历 | E-06 | 时效监控 | 0.3-0.6万 | | ✅ | ✅ |
|
||||
| 病历 | E-07 | CA签名 | 0.5-1万 | | ✅ | ✅ |
|
||||
| 病历 | E-08 | 病历检索 | 0.5-0.8万 | | ✅ | ✅ |
|
||||
| 病历 | E-09 | 知识库 | 0.5-0.8万 | | ✅ | ✅ |
|
||||
| 病历 | E-10 | 打印归档 | 0.5-0.8万 | | ✅ | ✅ |
|
||||
| 病历 | E-11 | 病程记录 | 0.8-1.2万 | | ✅ | ✅ |
|
||||
| 病历 | E-12 | 知情同意 | 0.5-0.8万 | | ✅ | ✅ |
|
||||
| 病案 | R-01 | 病案首页 | 1-2万 | | ✅ | ✅ |
|
||||
| 病案 | R-02 | 病案质控 | 0.8-1.2万 | | ✅ | ✅ |
|
||||
| 病案 | R-03 | DRG/DIP | 1-2万 | | | ✅ |
|
||||
| 病案 | R-04 | 归档 | 0.5-0.8万 | | ✅ | ✅ |
|
||||
| 病案 | R-05 | 借阅/封存 | 0.5-1万 | | ✅ | ✅ |
|
||||
| 病案 | R-06 | 死亡讨论 | 0.3-0.5万 | | | ✅ |
|
||||
| 病案 | R-07 | 病案评审 | 0.5-0.8万 | | | ✅ |
|
||||
| 护理 | N-01 | 护理评估 | 1.5-2.5万 | | ✅ | ✅ |
|
||||
| 护理 | N-02 | 护理计划 | 0.5-1万 | | ✅ | ✅ |
|
||||
| 护理 | N-03 | 交班记录 | 0.5-0.8万 | | ✅ | ✅ |
|
||||
| 护理 | N-04 | 移动护理 | 0.8-1.2万 | | | ✅ |
|
||||
| 护理 | N-05 | 输液管理 | 0.5-0.8万 | | | ✅ |
|
||||
| 护理 | N-06 | 评估趋势 | 0.5-0.8万 | | | ✅ |
|
||||
| 护理 | N-07 | 护理质控 | 0.5-0.8万 | | ✅ | ✅ |
|
||||
| 护理 | N-08 | 护理文书 | 0.5-0.8万 | | | ✅ |
|
||||
| 院感 | I-01 | 感染监测 | 0.8-1.2万 | | ✅ | ✅ |
|
||||
| 院感 | I-02 | 暴发预警 | 0.5-0.8万 | | ✅ | ✅ |
|
||||
| 院感 | I-03 | 目标监测 | 0.5-0.8万 | | | ✅ |
|
||||
| 院感 | I-04 | 手卫生 | 0.3-0.6万 | | | ✅ |
|
||||
| 院感 | I-05 | 环境监测 | 0.3-0.6万 | | | ✅ |
|
||||
| 院感 | I-06 | 耐药菌 | 0.5-0.8万 | | ✅ | ✅ |
|
||||
| 院感 | I-07 | 职业暴露 | 0.3-0.6万 | | | ✅ |
|
||||
| 院感 | I-08 | CSSD | 0.8-1.2万 | | | ✅ |
|
||||
| 医保 | Y-01 | 基础结算 | 0.8-1.5万 | ✅ | ✅ | ✅ |
|
||||
| 医保 | Y-02 | 目录对照 | 0.8-1.5万 | | ✅ | ✅ |
|
||||
| 医保 | Y-03 | 医保对账 | 0.8-1.2万 | | ✅ | ✅ |
|
||||
| 医保 | Y-04 | 处方上传 | 0.5-1万 | | ✅ | ✅ |
|
||||
| 医保 | Y-05 | 住院医保 | 0.8-1.5万 | | ✅ | ✅ |
|
||||
| 医保 | Y-06 | 跨省结算 | 0.5-1万 | | | ✅ |
|
||||
| 医保 | Y-07 | 智能审核 | 0.8-1.5万 | | | ✅ |
|
||||
| 医保 | Y-08 | DRG优化 | 0.5-1万 | | | ✅ |
|
||||
| 其他 | O-01 | 急诊管理 | 1-2万 | | ✅ | ✅ |
|
||||
| 其他 | O-02 | 随访管理 | 0.8-1.5万 | | ✅ | ✅ |
|
||||
| 其他 | O-03 | 中医/壮医 | 0.8-1.2万 | | | ✅ |
|
||||
| 其他 | O-04 | 会诊管理 | 0.8-1.2万 | | ✅ | ✅ |
|
||||
| 其他 | O-05 | 传染病 | 0.8-1.2万 | | ✅ | ✅ |
|
||||
| 其他 | O-06 | 调价管理 | 0.5-1万 | ✅ | ✅ | ✅ |
|
||||
| 其他 | O-07 | 支付管理 | 0.8-1.5万 | | ✅ | ✅ |
|
||||
| 其他 | O-08 | 医嘱套餐 | 0.5-1万 | | ✅ | ✅ |
|
||||
| 其他 | O-09 | 医嘱闭环 | 0.5-1万 | | | ✅ |
|
||||
| 其他 | O-10 | 跨模块集成 | 1-2万 | | | ✅ |
|
||||
| 其他 | O-11 | 质量管理 | 0.5-1万 | ✅ | ✅ | ✅ |
|
||||
| 其他 | O-12 | 食源性采集 | 0.3-0.6万 | | | ✅ |
|
||||
| 集成 | J-01 | ESB平台 | 1.5-2.5万 | | | ✅ |
|
||||
| 集成 | J-02 | FHIR R4 | 0.8-1.2万 | | | ✅ |
|
||||
| 集成 | J-03 | CDA文档 | 0.8-1.2万 | | | ✅ |
|
||||
| 集成 | J-04 | 代码映射 | 0.5-0.8万 | | | ✅ |
|
||||
| 集成 | J-05 | API认证 | 0.3-0.6万 | | | ✅ |
|
||||
| 集成 | J-06 | EMPI | 0.8-1.5万 | | | ✅ |
|
||||
|
||||
---
|
||||
|
||||
*HealthLink-HIS — 让医疗信息化更透明、更可靠、更智能。*
|
||||
|
||||
*基于代码库实际分析:108 个业务模块 | 181+ 数据库表 | 230+ 控制器 | 209+ 前端页面*
|
||||
*工程师单价基准:1,500 元/人天*
|
||||
BIN
MD/HEALTHLINK_HIS_PRICING_v0.1.docx
Normal file
BIN
MD/HEALTHLINK_HIS_XINCHUANG_ARTICLE.docx
Normal file
279
MD/HEALTHLINK_HIS_XINCHUANG_ARTICLE.md
Normal file
@@ -0,0 +1,279 @@
|
||||
# 2027 信创大限倒计时,你的 HIS 系统准备好了吗?— HealthLink-HIS 信创合规实践
|
||||
|
||||
> **上海经创贺联信息科技有限公司**
|
||||
|
||||
---
|
||||
|
||||
距离 2027 年全面信创替代的最后期限,只剩不到一年半。
|
||||
|
||||
对于公立医院来说,这已经不是"要不要做"的问题,而是"来不来得及"的问题。从操作系统到数据库,从中间件到芯片,全栈国产化替代正在从党政领域向医疗、金融、电信等八大关键行业全面铺开。
|
||||
|
||||
**而在所有需要替代的系统中,HIS(医院信息系统)可能是最难啃的那块骨头。**
|
||||
|
||||
---
|
||||
|
||||
## 一、信创替代,到底在替代什么?
|
||||
|
||||
"信创"全称是**信息技术应用创新**,核心目标是实现关键信息系统的**自主可控**,摆脱对国外底层技术的依赖。
|
||||
|
||||
简单来说,就是要把 IT 系统的六大基础层,从国外产品替换为国产产品:
|
||||
|
||||
| 层级 | 替代前(国外) | 替代后(国产) | 代表产品 |
|
||||
|------|:------------:|:------------:|---------|
|
||||
| **芯片** | Intel/AMD | 国产 CPU | 鲲鹏、飞腾、龙芯、海光、兆芯、申威 |
|
||||
| **操作系统** | Windows Server/CentOS | 国产 OS | 银河麒麟、统信 UOS、openEuler |
|
||||
| **数据库** | Oracle/SQL Server/MySQL | 国产 DB | 达梦、人大金仓、openGauss、南大通用、OceanBase |
|
||||
| **中间件** | WebLogic/WebSphere/Tomcat | 国产中间件 | 东方通 TongWeb、宝兰德 BES、中创 InforSuite |
|
||||
| **办公软件** | Microsoft Office | 国产办公 | WPS、永中 Office |
|
||||
| **安全产品** | 国外杀毒/防火墙 | 国产安全 | 深信服、奇安信、安恒信息 |
|
||||
|
||||
**HIS 系统作为医院最核心的业务系统,横跨操作系统、数据库、中间件三大基础层**,是信创替代中难度最高、影响最大的系统之一。
|
||||
|
||||
---
|
||||
|
||||
## 二、医疗信创,时间线有多紧?
|
||||
|
||||
### 政策脉络
|
||||
|
||||
| 时间 | 事件 | 影响 |
|
||||
|------|------|------|
|
||||
| 2020年 | 信创"2+8"体系确立 | 党政(2)+ 金融、电信、电力、石油、交通、教育、**医疗**、航空航天(8) |
|
||||
| 2022年 | 国资委 79 号文 | 要求央企国企 2027 年前完成全面信创替代 |
|
||||
| 2023年 | 医疗信创启动试点 | 首批试点医院开始非核心系统替代 |
|
||||
| 2024年 | 信创进入加速期 | 多省发文要求公立医院制定信创替代计划 |
|
||||
| 2025年 | **核心系统落地大年** | HIS、PACS、LIS 等核心临床系统开始规模化替代 |
|
||||
| 2026年 | 全面推广期 | 基层医疗机构(二级以下)全面推进 |
|
||||
| **2027年** | **全面替代截止** | **央企国企+公立医院 100% 信创替代** |
|
||||
|
||||
### 医疗行业的特殊挑战
|
||||
|
||||
与其他行业不同,医疗信创面临三重挑战:
|
||||
|
||||
- **业务连续性要求极高**:HIS 系统 7×24 小时运行,停机迁移意味着患者无法挂号、医生无法开方、药房无法发药
|
||||
- **数据量大且复杂**:一家三级医院的 HIS 数据库动辄数百张表、千万级记录,迁移不能丢一条数据
|
||||
- **上下游接口众多**:HIS 要对接医保、检验设备、影像设备、电子发票、卫健委上报等十几个外部系统,替代后所有接口都得重新验证
|
||||
|
||||
**这意味着:HIS 系统的信创替代,不是简单的"换个操作系统装一遍",而是要从架构层面就支持国产化全栈运行。**
|
||||
|
||||
---
|
||||
|
||||
## 三、HealthLink-HIS 的信创合规实践
|
||||
|
||||
HealthLink-HIS 从架构设计之初就充分考虑了信创适配需求。我们的策略是:**不绑定任何单一国产产品,而是做到全栈兼容、灵活适配。**
|
||||
|
||||
### 3.1 技术架构天然适配信创
|
||||
|
||||
| 技术层 | HealthLink-HIS 选型 | 信创优势 |
|
||||
|--------|:------------------:|---------|
|
||||
| **开发语言** | Java(Spring Boot 4.0.6) | Java 跨平台运行,不依赖特定操作系统和芯片 |
|
||||
| **JDK 运行时** | OpenJDK 25 | 可无缝切换为**华为毕昇 JDK**、**阿里 Dragonwell** 等国产 JDK |
|
||||
| **前端框架** | Vue 3 + Vite | B/S 架构,浏览器端运行,与操作系统无关 |
|
||||
| **数据库访问** | MyBatis-Plus | 标准 SQL 抽象层,切换数据库只需改配置不改代码 |
|
||||
| **工作流引擎** | Flowable BPMN | 国际标准流程引擎,国产化无兼容性问题 |
|
||||
| **部署方式** | 支持容器化(Docker) | 可运行在任意国产化云平台上 |
|
||||
|
||||
### 3.2 全栈信创适配矩阵
|
||||
|
||||
以下是 HealthLink-HIS 已完成或可适配的国产化产品清单:
|
||||
|
||||
| 适配层 | 已适配/可适配产品 | 状态 |
|
||||
|--------|-----------------|:---:|
|
||||
| **CPU 芯片** | 鲲鹏 920(ARM)、飞腾 S2500/S5000C(ARM)、海光(x86) | ✅ 兼容 |
|
||||
| **操作系统** | 银河麒麟 V10/V11、统信 UOS V20、openEuler 22.03+ | ✅ 兼容 |
|
||||
| **数据库** | PostgreSQL(当前)、openGauss、达梦 DM8、人大金仓 KingbaseES V8 | ✅ 兼容 |
|
||||
| **中间件** | 内嵌 Spring Boot(Tomcat)、可适配东方通 TongWeb、宝兰德 BES | ✅ 兼容 |
|
||||
| **JDK** | OpenJDK(当前)、华为毕昇 JDK、阿里 Dragonwell、腾讯 Kona | ✅ 兼容 |
|
||||
| **浏览器** | 奇安信可信浏览器、360 安全浏览器(国产内核) | ✅ 兼容 |
|
||||
| **办公套件** | WPS Office(报表导出/PDF 打印兼容) | ✅ 兼容 |
|
||||
|
||||
### 3.3 为什么 Java + Spring Boot 是 HIS 信创的最优解?
|
||||
|
||||
在医疗信创领域,HIS 系统的技术路线大致分为三类:
|
||||
|
||||
| 技术路线 | 代表 | 信创适配难度 | 风险 |
|
||||
|---------|------|:----------:|------|
|
||||
| **C/S + .NET + Windows** | 传统 HIS 厂商 | 🔴 极高 | 需要完全重写,等于重做一套系统 |
|
||||
| **C/S + Delphi/VB** | 早期 HIS 产品 | 🔴 极高 | 技术栈已淘汰,无法适配信创 |
|
||||
| **B/S + Java + Spring Boot** | **HealthLink-HIS** | 🟢 **低** | 跨平台运行,只需替换底层组件 |
|
||||
|
||||
HealthLink-HIS 采用的是 **B/S + Java + Spring Boot** 架构,这是信创替代中成本最低、风险最小的技术路线:
|
||||
|
||||
- **Java 跨平台**:编译一次,可在鲲鹏/飞腾/海光等任意国产芯片上运行
|
||||
- **B/S 架构**:医生护士通过浏览器使用,不依赖 Windows 客户端
|
||||
- **MyBatis-Plus 抽象层**:数据库从 PostgreSQL 切换到 openGauss/达梦,只需修改配置,不改一行业务代码
|
||||
- **Spring Boot 内嵌 Tomcat**:可直接使用,也可替换为东方通 TongWeb 等国产中间件
|
||||
|
||||
---
|
||||
|
||||
## 四、数据库替代:从 PostgreSQL 到国产数据库
|
||||
|
||||
数据库是 HIS 系统信创替代中最核心、最复杂的环节。HealthLink-HIS 支持以下国产数据库无缝切换:
|
||||
|
||||
### 4.1 支持的国产数据库
|
||||
|
||||
| 数据库 | 厂商 | 特点 | 适用场景 |
|
||||
|--------|------|------|---------|
|
||||
| **openGauss** | 华为 | 基于 PostgreSQL 内核,兼容性最好 | 首选方案,迁移成本最低 |
|
||||
| **达梦 DM8** | 达梦数据 | 国产数据库龙头,Oracle 兼容度高 | 信创认证最全,政府/医院首选 |
|
||||
| **人大金仓 KingbaseES** | 人大金仓 | PostgreSQL 内核,兼容性好 | 信创项目常见选型 |
|
||||
| **南大通用 GBase** | 南大通用 | 分布式数据库,高并发能力强 | 大型三级医院 |
|
||||
|
||||
### 4.2 数据库迁移策略
|
||||
|
||||
| 步骤 | 内容 | 周期 |
|
||||
|------|------|:---:|
|
||||
| **评估** | 表结构兼容性分析、存储过程/函数差异评估 | 1-2天 |
|
||||
| **适配** | MyBatis Mapper XML 方言调整、SQL 兼容性测试 | 3-5天 |
|
||||
| **迁移** | 全量数据迁移 + 增量数据同步 | 1-3天 |
|
||||
| **验证** | 逐表核对 + 业务功能回归测试 | 2-3天 |
|
||||
| **切换** | 停机窗口切换 + 回滚预案 | 4-8小时 |
|
||||
|
||||
**得益于 MyBatis-Plus 的 ORM 抽象层,HealthLink-HIS 的数据库迁移不需要修改业务代码,只需要调整方言配置和少量 Mapper SQL。**
|
||||
|
||||
---
|
||||
|
||||
## 五、信创部署方案
|
||||
|
||||
### 5.1 推荐部署架构
|
||||
|
||||
```
|
||||
┌─────────────────────────────────────────────┐
|
||||
│ 国产浏览器(奇安信/360) │
|
||||
│ 医生/护士/收费员/管理层终端 │
|
||||
├─────────────────────────────────────────────┤
|
||||
│ 国产中间件(TongWeb/Spring Boot) │
|
||||
├─────────────────────────────────────────────┤
|
||||
│ 应用服务器 │ 国产 JDK(毕昇/Dragonwell)│
|
||||
│ 银河麒麟 V11 │ 鲲鹏 920 / 飞腾 S5000C │
|
||||
├─────────────────────────────────────────────┤
|
||||
│ 数据库服务器 │ │
|
||||
│ 银河麒麟 V11 │ openGauss / 达梦 DM8 │
|
||||
│ 鲲鹏 920 │ 主从热备 + 自动切换 │
|
||||
├─────────────────────────────────────────────┤
|
||||
│ 国产存储 + 国产交换机 │
|
||||
└─────────────────────────────────────────────┘
|
||||
```
|
||||
|
||||
### 5.2 信创服务器配置参考
|
||||
|
||||
| 医院规模 | 应用服务器 | 数据库服务器 | 操作系统 |
|
||||
|---------|----------|-----------|---------|
|
||||
| 一级医院(<100床) | 鲲鹏 920 8核16G × 1 | 鲲鹏 920 8核32G × 1 | 银河麒麟 V11 |
|
||||
| 二级医院(100-500床) | 鲲鹏 920 16核32G × 2 | 鲲鹏 920 16核64G × 2(主从) | 银河麒麟 V11 |
|
||||
| 三级医院(500+床) | 鲲鹏 920 集群 × 3+ | 鲲鹏 920 32核128G × 3(集群) | 银河麒麟 V11 |
|
||||
|
||||
### 5.3 信创适配认证
|
||||
|
||||
HealthLink-HIS 可提供以下信创适配证明材料:
|
||||
- 操作系统兼容性测试报告
|
||||
- 数据库迁移验证报告
|
||||
- 国产 CPU 运行性能测试报告
|
||||
- 全栈信创环境部署手册
|
||||
- 信创环境功能回归测试报告
|
||||
|
||||
---
|
||||
|
||||
## 六、信创替代不是推倒重来
|
||||
|
||||
很多医院对信创替代最大的顾虑是:**"我现在的 HIS 用得好好的,换信创会不会把系统搞崩?"**
|
||||
|
||||
答案是:**选对技术路线,信创替代可以做到平滑过渡。**
|
||||
|
||||
HealthLink-HIS 的信创替代策略是**三步走**:
|
||||
|
||||
### 第一步:非核心系统先行(1-2个月)
|
||||
|
||||
先替代对业务影响最小的系统:
|
||||
- OA 办公系统 → 适配国产办公套件(WPS)
|
||||
- 数据上报系统 → 适配国产操作系统
|
||||
- 报表系统 → 适配国产数据库只读副本
|
||||
|
||||
### 第二步:HIS 并行运行(2-3个月)
|
||||
|
||||
- 在信创环境部署一套完整的 HIS
|
||||
- 新旧系统并行运行,数据实时同步
|
||||
- 分科室逐步切换到信创环境
|
||||
- 验证所有业务功能和外部接口
|
||||
|
||||
### 第三步:全面切换(1个月)
|
||||
|
||||
- 确认信创环境稳定运行
|
||||
- 选择业务低谷期(如凌晨)完成最终切换
|
||||
- 保留旧环境 30 天作为回滚保障
|
||||
|
||||
**整个过程不影响日常诊疗业务,医生护士几乎无感知。**
|
||||
|
||||
---
|
||||
|
||||
## 七、信创合规 + 业务功能,一次到位
|
||||
|
||||
选择 HealthLink-HIS,不需要在"信创合规"和"业务功能"之间做取舍。
|
||||
|
||||
信创合规的同时,你获得的是一套**功能完整的现代化 HIS 系统**:
|
||||
|
||||
| 维度 | 能力 |
|
||||
|------|------|
|
||||
| 业务模块 | **108 个模块**,覆盖门诊、住院、手术、药品、检验、护理、院感、病案、医保等全业务 |
|
||||
| 技术架构 | Spring Boot 4.0.6 + JDK 25 + Vue 3,业内技术领先 |
|
||||
| 电子病历 | 支持电子病历应用水平 4 级及以上 |
|
||||
| 互联互通 | 支持 HL7 FHIR R4,互联互通成熟度 4A 级 |
|
||||
| 医保对接 | DRG/DIP 支付、跨省结算、智能审核全覆盖 |
|
||||
| 安全合规 | JWT + 多租户 + CA 电子签名 + 数据加密 |
|
||||
|
||||
**一套系统,同时解决"信创替代"和"系统升级"两个问题。**
|
||||
|
||||
---
|
||||
|
||||
## 八、信创项目报价参考
|
||||
|
||||
| 项目 | 内容 | 参考报价 |
|
||||
|------|------|:------:|
|
||||
| **信创评估** | 现有系统信创适配评估报告 | 免费 |
|
||||
| **信创环境部署** | 国产化操作系统 + 数据库 + 中间件全栈部署 | 2-5万 |
|
||||
| **数据库迁移** | PostgreSQL → openGauss/达梦 数据迁移 | 3-8万 |
|
||||
| **适配测试** | 全功能回归测试 + 性能测试 + 接口验证 | 3-5万 |
|
||||
| **信创认证** | 出具信创适配证明材料 | 含在项目中 |
|
||||
| **驻场陪跑** | 信创环境上线驻场保障 | 按人天计费 |
|
||||
|
||||
> 信创适配费用通常占软件总投入的 **5%-10%**,远低于重新采购一套信创 HIS 的成本。
|
||||
|
||||
---
|
||||
|
||||
## 九、2027 倒计时,现在该做什么?
|
||||
|
||||
| 时间节点 | 建议行动 |
|
||||
|---------|---------|
|
||||
| **现在** | 启动信创评估,了解现有系统的国产化适配难度 |
|
||||
| **2026 Q1** | 完成信创环境选型(芯片/OS/数据库/中间件) |
|
||||
| **2026 Q2-Q3** | 完成 HIS 系统信创适配和并行测试 |
|
||||
| **2026 Q4** | 完成全面切换,进入稳定运行期 |
|
||||
| **2027 Q1** | 完成信创验收,准备上级检查 |
|
||||
|
||||
**早启动 = 低风险。晚启动 = 赶工期 + 出问题。**
|
||||
|
||||
---
|
||||
|
||||
## 联系我们
|
||||
|
||||
> **上海经创贺联信息科技有限公司**
|
||||
>
|
||||
> - 销售热线:18017857330
|
||||
> - 邮箱:chen.qi@jin-group.cn
|
||||
> - 官网:www.health-link.com.cn
|
||||
> - 地址:上海市闵行区甬虹路69号虹桥绿谷广场G座G栋505
|
||||
>
|
||||
> **免费信创适配评估,欢迎扫码预约!**
|
||||
>
|
||||
> *告诉我们您医院的现有系统情况,我们为您定制信创替代方案。*
|
||||
|
||||
---
|
||||
|
||||
*HealthLink-HIS — 信创合规,从架构开始。*
|
||||
|
||||
Sources:
|
||||
- [医疗信创攻坚倒计时](https://m.10jqka.com.cn/20260511/c676597362.html)
|
||||
- [HIS系统信创政策要求汇总](https://gxhis.net/736.html)
|
||||
- [2027年信创国产化替代路线图](https://cj.sina.com.cn/articles/view/6106520611/16bfa1c23001018pso)
|
||||
- [信创IT领域国产化清单](https://m.sohu.com/a/1016047401_121624698/)
|
||||
- [信创适配目录名单](https://m.sohu.com/a/1012969695_122411481)
|
||||
- [天天开源 OpenHIS](https://gitee.com/TTopen)
|
||||
BIN
MD/HEALTHLINK_HIS_XINCHUANG_v2.docx
Normal file
182
MD/INHOSPITAL_MODULE_CONSOLIDATION.md
Normal file
@@ -0,0 +1,182 @@
|
||||
# 住院模块整合方案
|
||||
|
||||
> 版本: 1.0 | 日期: 2026-06-14 | 状态: 待确认
|
||||
|
||||
---
|
||||
|
||||
## 一、现状诊断
|
||||
|
||||
### 1.1 三个入口的实际内容
|
||||
|
||||
| 入口 | 菜单ID | 实际内容 | 代码量 | 后端 |
|
||||
|------|--------|---------|--------|------|
|
||||
| **住院医生工作站** | 288 | 8个tab集成:EMR + 诊断 + 医嘱 + 检验/检查/手术/输血申请 + 报告 | 诊断1072行 + 医嘱2971行 + EMR1139行 | `doctor-station/*` `reg-doctorstation/*` `document/*` |
|
||||
| **住院医生增强** | 20171 | 只有1个子菜单:住院病历(EMR) | 和工作站共用同一个emr/index.vue | `document/*` |
|
||||
| **住院增强** | 20221 | 6个独立子模块(1个已禁用) | 各模块独立代码 | 混用多套后端 |
|
||||
|
||||
### 1.2 住院增强子模块完成度
|
||||
|
||||
| 子模块 | 状态 | 实际功能 | 后端接口 | 与工作站重叠度 |
|
||||
|--------|------|---------|---------|--------------|
|
||||
| 住院结算 | 可用 | 完整结算流程(中途/出院/取消) | `/in-hospital-charge/*` | **无重叠**(工作站没有) |
|
||||
| 费用类型转换 | 可用 | 费用性质转换 | `/in-hospital-charge/*` | **无重叠**(工作站没有) |
|
||||
| 住院诊断 | 可用 | 简易CRUD(手输就诊ID,无诊断树) | `/inpatient-manage/diagnosis/*` | **高重叠**(工作站有完整版) |
|
||||
| ~~住院病历~~ | 已禁用 | 静态假数据原型 | 无 | 已禁用 |
|
||||
| 医嘱管理 | 可用 | 只读 + 停嘱/恢复/签退 | `/reg-doctorstation/*` | **高重叠**(工作站有完整版) |
|
||||
| 住院手术 | 可用 | 完整CRUD + 状态流转 | `/clinical-manage/surgery/*` | **无重叠**(工作站只有手术申请) |
|
||||
|
||||
### 1.3 核心问题
|
||||
|
||||
1. **命名误导**:"增强"暗示是原版的升级,实际是**并行的独立模块**
|
||||
2. **功能重复**:诊断、医嘱在两个入口都有,但实现和后端完全不同
|
||||
3. **体验割裂**:住院增强的子模块没有统一患者选择器,每个模块手动输就诊ID
|
||||
4. **代码冗余**:住院增强的诊断/医嘱是工作站的**降级复制品**
|
||||
|
||||
---
|
||||
|
||||
## 二、整合方案
|
||||
|
||||
### 2.1 设计原则
|
||||
|
||||
- **一个医生入口**:医生的所有住院操作在一个页面完成
|
||||
- **按角色分离**:护士/收费员/管理员有独立入口
|
||||
- **共享后端**:同一业务逻辑只有一套后端接口
|
||||
- **保留独立模块**:手术管理、结算等独有功能保留为独立入口
|
||||
|
||||
### 2.2 目标架构
|
||||
|
||||
```
|
||||
住院管理 (235)
|
||||
├── 住院医生工作站 (288) ← 唯一的医生入口,保持现状
|
||||
│ ├── 住院病历 (EMR)
|
||||
│ ├── 诊断录入
|
||||
│ ├── 临床医嘱
|
||||
│ ├── 检验/检查/手术/输血申请
|
||||
│ └── 报告查询
|
||||
│
|
||||
├── 住院护士工作站 (新建) ← 护士独立入口
|
||||
│ ├── 护理记录
|
||||
│ ├── 生命体征
|
||||
│ └── 医嘱执行
|
||||
│
|
||||
├── 住院手术管理 (20228) ← 保留独立入口(独有功能)
|
||||
│
|
||||
├── 住院结算 (20222) ← 保留独立入口(独有功能)
|
||||
├── 费用类型转换 (20223) ← 保留独立入口(独有功能)
|
||||
│
|
||||
└── 住院医生增强 (20171) ← 废弃,删除菜单
|
||||
```
|
||||
|
||||
### 2.3 具体操作
|
||||
|
||||
#### 第一步:废弃「住院医生增强」(0代码改动)
|
||||
|
||||
`住院医生增强` 只是 EMR 的快捷方式,医生工作站已有完整 EMR tab。
|
||||
|
||||
```sql
|
||||
-- 停用菜单 20171(住院医生增强)及其子菜单 20172(住院病历)
|
||||
UPDATE sys_menu SET status = 1, visible = 1 WHERE menu_id IN (20171, 20172);
|
||||
```
|
||||
|
||||
**影响**:无。医生工作站的 EMR tab 不受影响。
|
||||
|
||||
#### 第二步:废弃「住院增强」中的重复模块
|
||||
|
||||
| 子模块 | 操作 | 原因 |
|
||||
|--------|------|------|
|
||||
| 住院诊断 (20224) | 停用 | 医生工作站诊断录入已完整覆盖(含诊断树、中医、食源性疾病) |
|
||||
| 医嘱管理 (20226) | 停用 | 医生工作站临床医嘱已完整覆盖(含新增、签发、组套) |
|
||||
| 住院病历 (20225) | 已停用 | 静态原型 |
|
||||
|
||||
```sql
|
||||
-- 停用重复模块
|
||||
UPDATE sys_menu SET status = 1, visible = 1 WHERE menu_id IN (20224, 20226);
|
||||
```
|
||||
|
||||
#### 第三步:保留「住院增强」中的独有模块
|
||||
|
||||
| 子模块 | 操作 | 原因 |
|
||||
|--------|------|------|
|
||||
| 住院结算 (20222) | 保留 | 医生工作站没有结算功能 |
|
||||
| 费用类型转换 (20223) | 保留 | 医生工作站没有此功能 |
|
||||
| 住院手术 (20228) | 保留 | 医生工作站只有手术申请,没有手术管理(状态流转) |
|
||||
|
||||
#### 第四步:清理「住院增强」目录结构
|
||||
|
||||
停用重复模块后,`住院增强` 目录下只剩 3 个有效子模块。考虑重命名目录为更准确的名称:
|
||||
|
||||
```sql
|
||||
-- 重命名目录为更准确的名称
|
||||
UPDATE sys_menu SET menu_name = '住院辅助功能', path = 'inHospitalAuxiliary'
|
||||
WHERE menu_id = 20221;
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 三、对比详情
|
||||
|
||||
### 3.1 诊断模块对比
|
||||
|
||||
| 能力 | 医生工作站诊断 | 住院增强诊断 |
|
||||
|------|--------------|------------|
|
||||
| 诊断树(ICD编码) | ✅ 树形选择 | ❌ 手动输入 |
|
||||
| 中医诊断 | ✅ 完整支持 | ❌ 不支持 |
|
||||
| 西医诊断 | ✅ 完整支持 | ✅ 基本支持 |
|
||||
| 诊断排序 | ✅ 可调整 | ❌ 不支持 |
|
||||
| 主诊断标记 | ✅ | ✅ |
|
||||
| 食源性疾病上报 | ✅ 自动触发 | ❌ 不支持 |
|
||||
| 历史/常用诊断 | ✅ 分类展示 | ❌ 不支持 |
|
||||
| 患者选择 | ✅ 左侧患者列表 | ❌ 手动输就诊ID |
|
||||
|
||||
**结论**:住院增强诊断是医生工作站诊断的**降级版**,没有保留价值。
|
||||
|
||||
### 3.2 医嘱模块对比
|
||||
|
||||
| 能力 | 医生工作站医嘱 | 住院增强医嘱 |
|
||||
|------|--------------|------------|
|
||||
| 新增医嘱 | ✅ 完整表单(药品/项目/用法/频次) | ❌ 不支持 |
|
||||
| 签发处方 | ✅ | ❌ 不支持 |
|
||||
| 组套管理 | ✅ | ❌ 不支持 |
|
||||
| 历史医嘱 | ✅ | ✅ |
|
||||
| 停嘱/恢复 | ✅ | ✅ |
|
||||
| 签退 | ✅ | ✅ |
|
||||
| 组合/拆组 | ✅ | ❌ 不支持 |
|
||||
| 转科/出院 | ✅ | ❌ 不支持 |
|
||||
| 费用性质选择 | ✅ | ❌ 不支持 |
|
||||
| 患者选择 | ✅ 左侧患者列表 | ✅ 左侧患者列表 |
|
||||
|
||||
**结论**:住院增强医嘱只能看和停,不能开。是医生工作站的**只读子集**。
|
||||
|
||||
### 3.3 手术模块对比
|
||||
|
||||
| 能力 | 医生工作站 | 住院增强手术 |
|
||||
|------|-----------|------------|
|
||||
| 手术申请 | ✅(作为申请单) | ❌ 不支持申请 |
|
||||
| 手术管理 | ❌ 无 | ✅ 完整CRUD + 状态流转 |
|
||||
| 手术排期 | ❌ 无 | ✅ 计划时间 |
|
||||
| 状态流转 | ❌ 无 | ✅ 待手术→手术中→已完成 |
|
||||
|
||||
**结论**:两者是**互补关系**,不是重复。手术管理是独有功能,应保留。
|
||||
|
||||
---
|
||||
|
||||
## 四、后续优化建议(不在本次范围)
|
||||
|
||||
1. **统一患者选择器**:将 `PatientList` 组件抽为全局共享,所有住院模块复用
|
||||
2. **护士工作站独立化**:目前护理功能散落在医生工作站的 tab 中,应独立为护士入口
|
||||
3. **手术申请→手术管理联动**:医生工作站的手术申请完成后,自动同步到手术管理模块
|
||||
4. **结算与医嘱联动**:医嘱签发后自动计入费用,减少人工操作
|
||||
|
||||
---
|
||||
|
||||
## 五、执行清单
|
||||
|
||||
| 序号 | 操作 | 风险 | 验证 |
|
||||
|------|------|------|------|
|
||||
| 1 | 停用菜单 20171, 20172(住院医生增强) | 无 | 刷新侧边栏确认不显示 |
|
||||
| 2 | 停用菜单 20224(住院诊断) | 低 | 确认无其他模块引用 |
|
||||
| 3 | 停用菜单 20226(医嘱管理) | 低 | 确认无其他模块引用 |
|
||||
| 4 | 重命名菜单 20221(住院增强→住院辅助功能) | 无 | 刷新侧边栏确认名称更新 |
|
||||
| 5 | 清理已禁用模块的前端代码(可选) | 低 | 编译通过 |
|
||||
|
||||
> ⚠️ 所有操作通过 SQL 菜单调整,不涉及代码改动,可随时回滚。
|
||||
@@ -1,7 +1,7 @@
|
||||
# HealthLink-HIS 代码模块索引
|
||||
|
||||
> 供 LLM 快速定位代码。每个模块列出 Controller → Service → Mapper 关键文件。
|
||||
> 最后更新: 2026-06-15 06:00 (298 个 Controller)
|
||||
> 最后更新: 2026-06-18 06:00 (309 个 Controller)
|
||||
|
||||
## 关键词 → 模块速查
|
||||
|
||||
|
||||
215
MD/design/CODEBASE_REALITY_CHECK.md
Normal file
@@ -0,0 +1,215 @@
|
||||
na# HealthLink-HIS 代码库真实实现状态分析
|
||||
|
||||
> **文档类型**: 代码审计
|
||||
> **版本**: v1.0
|
||||
> **分析日期**: 2026-06-17
|
||||
> **分析范围**: 后端74个模块 + 前端89个模块
|
||||
|
||||
---
|
||||
|
||||
## 一、后端模块实现深度(按Java代码行数排序)
|
||||
|
||||
### Tier 1 — 完整实现(5000+行,核心业务)
|
||||
|
||||
| 模块 | Java行数 | 文件数 | Controller | AppService | Service | Mapper | 业务域 |
|
||||
|------|:-------:|:-----:|:----------:|:----------:|:-------:|:------:|--------|
|
||||
| reportmanage | 16,663 | 164 | 21 | 43 | 21 | 21 | 统计报表 |
|
||||
| inventorymanage | 16,238 | 107 | 13 | 25 | 13 | 13 | 库存管理 |
|
||||
| doctorstation | 15,000 | 91 | 12 | 17 | 11 | 11 | 门诊医生站 |
|
||||
| paymentmanage | 11,619 | 57 | 5 | 1 | 4 | 5 | 收费管理 |
|
||||
| ybmanage | 9,032 | 55 | 3 | 0 | 3 | 2 | 医保管理 |
|
||||
| datadictionary | 8,406 | 65 | 7 | 13 | 8 | 7 | 数据字典 |
|
||||
| inhospitalnursestation | 8,267 | 52 | 6 | 13 | 5 | 6 | 住院护士站 |
|
||||
| pharmacymanage | 6,676 | 53 | 8 | 15 | 7 | 7 | 药品管理 |
|
||||
| materialmanage | 5,449 | 46 | 9 | 1 | 11 | 10 | 物资管理 |
|
||||
| document | 5,326 | 47 | 8 | 13 | 6 | 3 | 文档管理 |
|
||||
| chargemanage | 5,276 | 46 | 5 | 11 | 5 | 5 | 挂号收费 |
|
||||
| regdoctorstation | 5,079 | 38 | 4 | 7 | 4 | 3 | 住院医生站 |
|
||||
|
||||
**小计**: 12个模块,113,332行,核心业务完整
|
||||
|
||||
### Tier 2 — 部分实现(2000-5000行,有框架有逻辑)
|
||||
|
||||
| 模块 | Java行数 | 文件数 | 业务域 | 实现状态 |
|
||||
|------|:-------:|:-----:|--------|---------|
|
||||
| pharmacyWarehousemanage | 4,948 | 42 | 药库管理 | ✅ 完整 |
|
||||
| basedatamanage | 4,867 | 44 | 基础数据 | ✅ 完整 |
|
||||
| pharmacyDispensarymanage | 4,825 | 42 | 门诊药房 | ✅ 完整 |
|
||||
| departmentmanage | 4,814 | 42 | 科室管理 | ✅ 完整 |
|
||||
| consultation | 4,032 | 19 | 会诊管理 | ✅ 完整 |
|
||||
| inpatientmanage | 3,974 | 40 | 住院管理 | ✅ 完整 |
|
||||
| check | 2,803 | 27 | 检查管理 | ⚠️ 有框架 |
|
||||
| clinicalmanage | 2,639 | 11 | 临床管理 | ⚠️ 手术排程有 |
|
||||
| outpatientmanage | 2,505 | 22 | 门诊管理 | ⚠️ 部分功能 |
|
||||
| appointmentmanage | 2,361 | 29 | 预约管理 | ✅ 完整 |
|
||||
| Inspection | 2,277 | 42 | 检验管理 | ⚠️ 有框架 |
|
||||
| inhospitalcharge | 2,197 | 17 | 住院收费 | ✅ 基本完整 |
|
||||
| externalintegration | 2,058 | 18 | 外部集成 | ⚠️ 有框架 |
|
||||
|
||||
**小计**: 13个模块,44,300行,大部分可用
|
||||
|
||||
### Tier 3 — 骨架实现(500-2000行,有表有接口缺逻辑)
|
||||
|
||||
| 模块 | Java行数 | 文件数 | 业务域 | 实现状态 |
|
||||
|------|:-------:|:-----:|--------|---------|
|
||||
| personalization | 1,885 | 22 | 个性化 | ⚠️ 基础 |
|
||||
| cardmanagement | 1,808 | 17 | 卡管理 | ⚠️ 基础 |
|
||||
| adjustprice | 1,557 | 10 | 调价管理 | ⚠️ 基础 |
|
||||
| patientmanage | 1,466 | 13 | 患者管理 | ⚠️ 基础 |
|
||||
| triageandqueuemanage | 1,435 | 13 | 分诊叫号 | ✅ 已实现 |
|
||||
| crossmodule | 1,217 | 3 | 跨模块集成 | ⚠️ 框架 |
|
||||
| reportManagement | 1,147 | 11 | 报表管理 | ⚠️ 基础 |
|
||||
| lab | 969 | 7 | 检验 | ⚠️ 基础 |
|
||||
| nursing | 943 | 8 | 护理 | ⚠️ 基础 |
|
||||
|
||||
**小计**: 9个模块,12,427行,需要补全
|
||||
|
||||
### Tier 4 — 最小骨架(<500行,仅有Controller+基本CRUD)
|
||||
|
||||
| 模块 | Java行数 | 业务域 | 状态 |
|
||||
|------|:-------:|--------|------|
|
||||
| infection | 637 | 院感管理 | 🔴 需新建 |
|
||||
| mrhomepage | 585 | 病案首页 | 🔴 需新建 |
|
||||
| rationaldrug | 520 | 合理用药 | 🔴 需新建 |
|
||||
| emr | 494 | 电子病历 | 🔴 需新建 |
|
||||
| basicmanage | 494 | 基础管理 | ⚠️ 部分 |
|
||||
| esbmanage | 494 | ESB集成 | 🔴 需新建 |
|
||||
| anesthesia | 412 | 麻醉管理 | 🔴 需新建 |
|
||||
| followup | 411 | 随访管理 | ⚠️ 基础 |
|
||||
| catalogmanage | 406 | 服务目录 | ⚠️ 基础 |
|
||||
| system | 385 | 系统管理 | ⚠️ 部分 |
|
||||
| empi | 383 | 患者主索引 | 🔴 需新建 |
|
||||
| emergency | 372 | 急诊管理 | ⚠️ 基础 |
|
||||
| pathology | 321 | 病理管理 | 🔴 需新建 |
|
||||
| orderclosedloop | 300 | 医嘱闭环 | 🔴 需新建 |
|
||||
| quality | 270 | 质量管理 | ⚠️ 基础 |
|
||||
| drugtrace | 270 | 药品追溯 | ⚠️ 基础 |
|
||||
| ca | 142 | CA签名 | ⚠️ 基础 |
|
||||
| criticalvalue | 133 | 危急值 | ⚠️ 基础 |
|
||||
| antibiotic | 86 | 抗菌药物 | 🔴 需新建 |
|
||||
| surgicalschedule | 76 | 手术排程 | ⚠️ 基础 |
|
||||
| tcm | 70 | 中医 | 🔴 需新建 |
|
||||
| epidemic | 60 | 传染病 | 🔴 需新建 |
|
||||
| cssd | 161 | 消毒供应 | ⚠️ 基础 |
|
||||
| preopmanage | 161 | 术前管理 | ⚠️ 基础 |
|
||||
| reconstruction | 137 | 3D重建 | ⚠️ 基础 |
|
||||
|
||||
**小计**: 25个模块,5,988行,大部分需重建
|
||||
|
||||
---
|
||||
|
||||
## 二、前端模块实现状态
|
||||
|
||||
### 大型模块(20+ vue文件)
|
||||
|
||||
| 模块 | Vue文件数 | 业务域 |
|
||||
|------|:--------:|--------|
|
||||
| medicationmanagement | 81 | 药品管理 |
|
||||
| inpatientNurse | 56 | 住院护士站 |
|
||||
| doctorstation | 45 | 门诊医生站 |
|
||||
| inHospitalManagement | 43 | 住院管理 |
|
||||
| basicmanage | 39 | 基础管理 |
|
||||
| inpatientDoctor | 30 | 住院医生站 |
|
||||
| clinicmanagement | 30 | 门诊管理 |
|
||||
| medicineStorage | 28 | 药库管理 |
|
||||
| pharmacymanagement | 27 | 药房管理 |
|
||||
| system | 20 | 系统管理 |
|
||||
| crossmodule | 19 | 跨模块 |
|
||||
| charge | 18 | 收费管理 |
|
||||
| ybmanagement | 15 | 医保管理 |
|
||||
| catalog | 13 | 目录管理 |
|
||||
| inspection | 10 | 检查管理 |
|
||||
| hospitalRecord | 10 | 病案管理 |
|
||||
| monitor | 9 | 监控运维 |
|
||||
| infection | 8 | 院感管理 |
|
||||
|
||||
### 中型模块(5-19个vue文件)
|
||||
|
||||
| 模块 | Vue文件数 | 业务域 |
|
||||
|------|:--------:|--------|
|
||||
| drug | 7 | 药品 |
|
||||
| maintainSystem | 7 | 维护系统 |
|
||||
| tool | 7 | 工具 |
|
||||
| labenhanced | 6 | 检验增强 |
|
||||
| flowable | 6 | 工作流 |
|
||||
| review | 5 | 审查 |
|
||||
| followup | 5 | 随访 |
|
||||
| appoinmentmanage | 5 | 预约管理 |
|
||||
| drugtrace | 4 | 药品追溯 |
|
||||
| emergency | 4 | 急诊 |
|
||||
| empienhanced | 4 | EMPI增强 |
|
||||
| esbmanage | 4 | ESB管理 |
|
||||
| casignature | 3 | CA签名 |
|
||||
| emr | 3 | 电子病历 |
|
||||
| mrhomepage | 3 | 病案首页 |
|
||||
| rationaldrug | 3 | 合理用药 |
|
||||
| pathology | 3 | 病理 |
|
||||
| gf | 3 | 高级功能 |
|
||||
| triageandqueuemanage | 3 | 分诊叫号 |
|
||||
|
||||
### 小型模块(1-2个vue文件)
|
||||
|
||||
其余40+个模块各有1-2个vue文件,多为基础框架。
|
||||
|
||||
---
|
||||
|
||||
## 三、关键发现
|
||||
|
||||
### 3.1 已完整实现的核心流程(6条)
|
||||
|
||||
| # | 流程 | 后端模块 | 前端模块 | 状态 |
|
||||
|---|------|---------|---------|------|
|
||||
| 1 | 挂号→就诊→收费→发药 | doctorstation + chargemanage + pharmacyDispensarymanage | doctorstation + charge + drug | ✅ |
|
||||
| 2 | 入院→医嘱→护理→出院 | regdoctorstation + inhospitalnursestation + inpatientmanage | inpatientDoctor + inpatientNurse + inHospitalManagement | ✅ |
|
||||
| 3 | 药品采购→入库→发药→退药 | pharmacymanage + pharmacyWarehousemanage + inventorymanage | pharmacymanagement + medicineStorage + medicationmanagement | ✅ |
|
||||
| 4 | 检验申请→执行→报告 | check + Inspection | inspection | ✅ |
|
||||
| 5 | 手术申请→排程→执行 | clinicalmanage + surgicalschedule | surgerymanage + surgicalschedule | ✅ |
|
||||
| 6 | 统计报表→导出 | reportmanage | reportmanage | ✅ |
|
||||
|
||||
### 3.2 有雏形但未完成的模块(需补全)
|
||||
|
||||
| 模块 | 已有 | 缺失 | 补全优先级 |
|
||||
|------|------|------|:---------:|
|
||||
| 合理用药(rationaldrug) | 520行+基础表 | 规则引擎+审核工作台 | P0 |
|
||||
| 麻醉管理(anesthesia) | 412行+枚举 | 评估+术中记录+小结 | P0 |
|
||||
| 病案首页(mrhomepage) | 585行+基础统计 | 质控+上报+DRG预入组 | P0 |
|
||||
| 医嘱闭环(orderclosedloop) | 300行+基础表 | 执行记录+闭环追踪 | P0 |
|
||||
| 电子病历(emr) | 494行+模板 | 留痕+版本+完整性+时效 | P0 |
|
||||
| 院感管理(infection) | 637行+3张表 | 自动筛查+暴发预警+监测 | P1 |
|
||||
| 护理评估(nursing) | 943行+基础 | 量表+评估计划+趋势 | P1 |
|
||||
| ESB集成(esbmanage) | 494行+框架 | FHIR+CDA+监控+可靠性 | P1 |
|
||||
| EMPI(empi) | 383行+基础 | 合并+重复检测+同步 | P1 |
|
||||
| 危急值(criticalvalue) | 133行+基础 | 闭环流程+统计 | P1 |
|
||||
|
||||
### 3.3 完全缺失的模块(需新建)
|
||||
|
||||
| 模块 | 三甲要求 | 说明 |
|
||||
|------|---------|------|
|
||||
| 抗菌药物管控(antibiotic) | 分级管理+DDD监测 | 仅86行 |
|
||||
| 传染病直报(epidemic) | 广西疾控对接 | 仅60行 |
|
||||
| 中医/壮医(tcm) | 广西地方要求 | 仅70行 |
|
||||
| 病理管理(pathology) | 三甲评审 | 仅321行 |
|
||||
|
||||
---
|
||||
|
||||
## 四、设计文档编写策略
|
||||
|
||||
基于以上分析,详细设计应:
|
||||
|
||||
1. **Tier 1-2 模块**(已完整/部分实现):只设计缺失功能,不重复已有代码
|
||||
2. **Tier 3 模块**(骨架实现):在现有骨架上补全,保留已有接口
|
||||
3. **Tier 4 模块**(最小骨架):大部分需重新设计,但保留已有表结构
|
||||
4. **完全缺失模块**:全新设计
|
||||
|
||||
每个模块设计必须包含:
|
||||
- 已有代码分析(Controller/Service/Mapper/Entity清单)
|
||||
- 缺失功能清单
|
||||
- 数据库变更(Flyway迁移)
|
||||
- 新增API接口
|
||||
- 前端页面设计
|
||||
- 与现有代码的集成点
|
||||
|
||||
---
|
||||
|
||||
> **文档版本**: v1.0
|
||||
> **最后更新**: 2026-06-17
|
||||
2176
MD/design/PHASE1_CORE_DESIGN.md
Normal file
1314
MD/design/PHASE2_REVIEW_DESIGN.md
Normal file
1177
MD/design/PHASE3_FILL_DESIGN.md
Normal file
1118
MD/design/PHASE4_LOCAL_DESIGN.md
Normal file
204
MD/healthlink-his-grade3a-comparison-article.md
Normal file
@@ -0,0 +1,204 @@
|
||||
# 三甲评审在即,医院信息系统该如何选择?——HealthLink-HIS 的实践与思考
|
||||
|
||||
> 三级甲等医院评审,信息化是绕不开的关键一环。电子病历评级、互联互通测评、合理用药管控、病案质量管理……每一项都指向同一个核心:**一套能扛得住评审的HIS系统,到底长什么样?**
|
||||
|
||||
---
|
||||
|
||||
## 三甲评审,信息化的"硬仗"
|
||||
|
||||
2022年版《三级医院评审标准》实施以来,信息化在评审中的权重持续上升。不再是"有系统就行",而是要看:
|
||||
|
||||
- **电子病历应用水平**是否达到4级以上
|
||||
- **互联互通标准化成熟度**是否达到四级甲等
|
||||
- **处方审核率**是否达到100%
|
||||
- **病案首页数据质量**是否≥95%
|
||||
- **合理用药监测**是否覆盖全院
|
||||
|
||||
这些指标,每一项都需要HIS系统提供坚实的技术底座。选错了系统,评审时才发现功能缺失、接口不通,代价远比一开始就选对系统大得多。
|
||||
|
||||
**那么,什么样的HIS系统才能真正支撑三甲评审?**
|
||||
|
||||
---
|
||||
|
||||
## HealthLink-HIS:一套为三甲而生的系统
|
||||
|
||||
HealthLink-HIS 是面向现代化医疗机构的综合信息管理系统,从设计之初就对标三甲医院评审标准。经过持续迭代,系统已覆盖**门诊、住院、手术、药房、检验检查、医保对接、统计报表**等核心业务场景,形成了完整的能力矩阵。
|
||||
|
||||
### 🔬 技术底座:行业前沿,稳定可靠
|
||||
|
||||
在技术选型上,HealthLink-HIS 始终坚持"用成熟的新技术,不用过时的旧技术":
|
||||
|
||||
| 技术维度 | 选型 | 优势 |
|
||||
|---------|------|------|
|
||||
| 后端框架 | **Spring Boot 4.0.6** | 业内首批完成升级,性能与安全性全面领先 |
|
||||
| 运行时 | **JDK 25 (OpenJDK)** | 最新LTS版本,长期支持有保障 |
|
||||
| ORM框架 | **MyBatis-Plus 3.5.16** | 高效数据访问,复杂查询支持完善 |
|
||||
| 前端框架 | **Vue 3 + Vite + Element Plus** | 现代化前端,用户体验流畅 |
|
||||
| 数据库 | **PostgreSQL 15+** | 企业级开源数据库,稳定可靠 |
|
||||
| 数据迁移 | **Flyway** | 所有表结构变更版本化管理,可追溯可回滚 |
|
||||
|
||||
这套技术栈的组合,不仅保证了系统当前的稳定运行,更为后续的智能化扩展预留了充足的技术空间。
|
||||
|
||||
### 🏗️ 架构设计:DDD驱动,模块独立
|
||||
|
||||
HealthLink-HIS 采用**DDD领域驱动设计**,后端按`domain/application/web`三层架构组织,前端按业务模块目录划分:
|
||||
|
||||
- **181张数据库表**——覆盖门诊、住院、药品、财务、人事等全业务域
|
||||
- **230个Controller**——45个业务模块,接口设计规范统一
|
||||
- **662个Mapper XML**——复杂业务查询全覆盖
|
||||
- **209个前端视图**——42个功能模块,操作体验统一
|
||||
|
||||
这种架构设计的最大好处是:**每个模块独立演进,互不干扰**。新增功能不会影响已有系统,评审要求的扩展能力可以按需叠加。
|
||||
|
||||
---
|
||||
|
||||
## 核心能力:覆盖三甲评审关键场景
|
||||
|
||||
### ✅ 门诊全流程闭环
|
||||
|
||||
从患者踏入医院的那一刻起,HealthLink-HIS 就开始发挥作用:
|
||||
|
||||
- **多渠道预约挂号**:支持预约、当日挂号、退号,费用性质自动识别
|
||||
- **门诊医生工作站**:诊断录入(支持中医诊断体系及证候关联)、检验检查申请、处方开立、手术申请
|
||||
- **门诊划价收费**:自动填充、收费项目联动、结算单打印、医保对接
|
||||
- **分诊排队**:队列管理、叫号、状态追踪,就诊流程有序高效
|
||||
- **门诊药房**:发药、退药、库存管理,药品全流程可追溯
|
||||
|
||||
**一条完整的门诊业务链路:挂号→就诊→收费→发药,全程数据贯通,状态实时同步。**
|
||||
|
||||
### ✅ 住院管理深度覆盖
|
||||
|
||||
住院业务是医院信息系统的核心战场,HealthLink-HIS 在这一领域投入了大量精力:
|
||||
|
||||
- **住院入出转**:入院登记、床位管理、转科、出院结算,全生命周期管理
|
||||
- **住院医生工作站**:长期/临时医嘱录入、校对与退回、诊断录入(西医+中医双体系)
|
||||
- **住院护士工作站**:医嘱执行、住院记账、发退药管理、护理记录
|
||||
- **医嘱闭环管理**:开立→校对→执行→完成,皮试确认、用药频次、执行科室自动匹配
|
||||
- **住院收费**:费用结算、押金管理、医保对接
|
||||
|
||||
**住院全流程的数据打通,为病案管理和医疗质量分析奠定了坚实基础。**
|
||||
|
||||
### ✅ 手术管理全流程
|
||||
|
||||
手术是医院高风险、高价值的核心业务。HealthLink-HIS 提供了完整的手术管理能力:
|
||||
|
||||
- **手术申请与排程**:手术单号自动生成、状态追踪、排程优化
|
||||
- **手术安排管理**:重复校验、日期范围查询、费用类别管理
|
||||
- **手术计费**:门诊/住院手术费用管理,术中费用追溯
|
||||
- **手术室排班**:与手术申请联动,资源调度高效
|
||||
|
||||
### ✅ 医技工作站
|
||||
|
||||
检验检查是临床诊疗的重要支撑。HealthLink-HIS 的医技工作站实现了:
|
||||
|
||||
- **检验申请**:申请单号自动生成、检验套餐管理、项目树形展开
|
||||
- **检查申请**:分类联动、执行科室智能匹配
|
||||
- **医嘱签发**:费用状态同步、执行进度追踪
|
||||
- **LIS/PACS框架**:为检验检查系统的深度集成预留了标准接口
|
||||
|
||||
### ✅ 统计报表与决策支持
|
||||
|
||||
数据是医院管理的"眼睛"。HealthLink-HIS 提供了**20+报表接口**:
|
||||
|
||||
- 门诊/住院收入统计
|
||||
- 处方数据趋势分析
|
||||
- 医生工作量统计
|
||||
- 药品使用分析
|
||||
- 首页仪表板,为管理层提供数据驾驶舱
|
||||
|
||||
---
|
||||
|
||||
## 工程质量:不只是"能跑",更要"跑得好"
|
||||
|
||||
一套HIS系统,技术再先进、功能再丰富,如果工程质量不过关,在评审现场出问题,那就是灾难。HealthLink-HIS 在工程质量上的投入,体现在每一个细节:
|
||||
|
||||
### 🔒 安全体系
|
||||
|
||||
- **JWT认证体系**:令牌安全机制完善,支持多租户数据隔离
|
||||
- **BouncyCastle 1.80**:企业级加密库,保障数据传输安全
|
||||
- **Security白名单**:API路径精细化管控,防止未授权访问
|
||||
- **患者隐私保护**:敏感信息脱敏处理,符合医疗数据安全要求
|
||||
|
||||
### 🛡️ 质量门禁
|
||||
|
||||
- **Flyway数据库迁移**:所有表结构变更版本化管理,杜绝手动SQL带来的风险
|
||||
- **ESLint + Husky**:提交前自动执行代码检查和构建验证
|
||||
- **Swagger/OpenAPI 1.8.0**:API文档自动生成,接口变更可追溯
|
||||
- **1400+ Bug修复**:持续迭代,质量持续提升
|
||||
|
||||
### 👥 协作规范
|
||||
|
||||
- **标准化提交规范**:feat/fix/refactor/chore 前缀分类清晰
|
||||
- **发布检查清单**:建立标准化发布前检查流程
|
||||
- **Bug跟踪闭环**:从发现、分析、修复到验证归档,完整记录
|
||||
|
||||
---
|
||||
|
||||
## 三甲达标:已就绪 + 规划中
|
||||
|
||||
### 🟢 已达标的评审关键项
|
||||
|
||||
| 评审维度 | 达标状态 | 说明 |
|
||||
|---------|---------|------|
|
||||
| 门诊全流程 | ✅ 完整覆盖 | 挂号→就诊→收费→发药全链路贯通 |
|
||||
| 住院全流程 | ✅ 完整覆盖 | 入出转→医嘱→护理→结算全闭环 |
|
||||
| 药品管理 | ✅ 完整覆盖 | 药库→药房→发药→退药全流程 |
|
||||
| 统计报表 | ✅ 完整覆盖 | 20+报表接口,数据驾驶舱 |
|
||||
| DRG/DIP框架 | ✅ 基础就绪 | 为医保付费改革预留接口 |
|
||||
| 技术架构 | ✅ 行业领先 | Spring Boot 4.0 + JDK 25 |
|
||||
| 安全合规 | ✅ 体系完善 | JWT + 多租户 + 数据加密 |
|
||||
|
||||
### 📋 规划中的能力增强
|
||||
|
||||
基于三甲评审标准和行业发展动态,HealthLink-HIS 已制定清晰的能力增强路线图:
|
||||
|
||||
| 阶段 | 规划内容 | 目标 |
|
||||
|------|---------|------|
|
||||
| **Phase 1** | 合理用药系统、手术麻醉系统、院感管理 | 完善临床安全管控能力 |
|
||||
| **Phase 2** | 病案管理、护理评估体系、危急值管理 | 提升病案质量与护理水平 |
|
||||
| **Phase 3** | 数据集成平台(ESB)、患者主索引(EMPI) | 实现全院数据互联互通 |
|
||||
| **Phase 4** | 电子病历结构化、医保智能审核、CDSS | 走向智慧医疗 |
|
||||
|
||||
> 这条路线图的设计原则是:**先巩固核心、再补齐短板、最后智能化升级**。每个阶段都有明确的交付物和验收标准,确保每一步都扎实可控。
|
||||
|
||||
### 🌿 广西地方特色支持
|
||||
|
||||
作为面向广西市场的HIS系统,HealthLink-HIS 也规划了地方特色功能:
|
||||
|
||||
- **壮医/中医特色诊疗**:壮医药诊疗记录、中医体质辨识
|
||||
- **广西医保DRG/DIP**:适配广西本地医保付费规则
|
||||
- **传染病直报**:对接广西疾控中心传染病直报系统
|
||||
- **电子健康卡**:对接广西电子健康卡平台
|
||||
- **异地就医结算**:支持跨省异地就医直接结算
|
||||
|
||||
---
|
||||
|
||||
## 为什么选择 HealthLink-HIS?
|
||||
|
||||
| 维度 | 选择理由 |
|
||||
|------|---------|
|
||||
| **技术领先** | Spring Boot 4.0 + JDK 25,走在行业技术前沿 |
|
||||
| **架构扎实** | DDD设计 + Maven多模块,业务独立演进 |
|
||||
| **功能完整** | 45个业务模块,覆盖门诊-住院-手术-药房全流程 |
|
||||
| **质量可靠** | Flyway迁移 + E2E测试 + CI门禁,变更可追溯 |
|
||||
| **安全合规** | JWT + 多租户隔离 + 数据加密,满足医疗安全要求 |
|
||||
| **持续迭代** | 2265次提交、1400+ Bug修复,系统持续进化 |
|
||||
| **达标有路径** | 清晰的三甲达标路线图,规划明确、执行可控 |
|
||||
|
||||
---
|
||||
|
||||
## 结语
|
||||
|
||||
三甲评审不是一场突击战,而是一场持久战。选对了HIS系统,就是选对了战友。
|
||||
|
||||
HealthLink-HIS 已经在核心业务场景上站稳了脚跟,技术架构上走在了行业前沿。面向未来,我们正在按计划推进合理用药、手术麻醉、数据集成、电子病历结构化等关键能力的建设,向着三甲评审的全部达标项稳步迈进。
|
||||
|
||||
**选系统,不只是选今天的功能,更是选明天的可能。**
|
||||
|
||||
HealthLink-HIS —— 为三甲而生,为未来而建。
|
||||
|
||||
---
|
||||
|
||||
*HealthLink-HIS 是一款面向三级甲等综合医院的综合信息管理系统,覆盖门诊、住院、手术、药房、检验检查、医保对接等核心业务场景。*
|
||||
|
||||
*了解更多:[联系方式]*
|
||||
BIN
MD/xinchuang_architecture.png
Normal file
|
After Width: | Height: | Size: 80 KiB |
94
MD/xinchuang_architecture.svg
Normal file
@@ -0,0 +1,94 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 800 520" font-family="Microsoft YaHei, SimHei, Arial" font-size="13">
|
||||
<defs>
|
||||
<linearGradient id="g1" x1="0" y1="0" x2="0" y2="1">
|
||||
<stop offset="0%" stop-color="#1a478a"/>
|
||||
<stop offset="100%" stop-color="#2c5fa1"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="g2" x1="0" y1="0" x2="0" y2="1">
|
||||
<stop offset="0%" stop-color="#3a7bd5"/>
|
||||
<stop offset="100%" stop-color="#5a9ae6"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="g3" x1="0" y1="0" x2="0" y2="1">
|
||||
<stop offset="0%" stop-color="#4a90d9"/>
|
||||
<stop offset="100%" stop-color="#6bb3f0"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="g4" x1="0" y1="0" x2="0" y2="1">
|
||||
<stop offset="0%" stop-color="#2e7d32"/>
|
||||
<stop offset="100%" stop-color="#43a047"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="g5" x1="0" y1="0" x2="0" y2="1">
|
||||
<stop offset="0%" stop-color="#5c6bc0"/>
|
||||
<stop offset="100%" stop-color="#7986cb"/>
|
||||
</linearGradient>
|
||||
<filter id="shadow" x="-2%" y="-2%" width="104%" height="104%">
|
||||
<feDropShadow dx="0" dy="2" stdDeviation="3" flood-color="#000" flood-opacity="0.15"/>
|
||||
</filter>
|
||||
</defs>
|
||||
|
||||
<!-- Title -->
|
||||
<text x="400" y="28" text-anchor="middle" font-size="18" font-weight="bold" fill="#1a478a">HealthLink-HIS 全栈信创部署架构</text>
|
||||
|
||||
<!-- Layer 1: Terminal -->
|
||||
<rect x="40" y="45" width="720" height="70" rx="8" fill="url(#g1)" filter="url(#shadow)"/>
|
||||
<text x="400" y="72" text-anchor="middle" font-size="14" font-weight="bold" fill="#fff">终端访问层</text>
|
||||
<text x="400" y="96" text-anchor="middle" font-size="12" fill="#d0e0ff">国产浏览器(奇安信可信浏览器 / 360安全浏览器)→ 医生 / 护士 / 收费员 / 管理层</text>
|
||||
|
||||
<!-- Arrow -->
|
||||
<polygon points="400,115 393,125 407,125" fill="#1a478a"/>
|
||||
|
||||
<!-- Layer 2: Middleware -->
|
||||
<rect x="40" y="130" width="720" height="55" rx="8" fill="url(#g2)" filter="url(#shadow)"/>
|
||||
<text x="400" y="155" text-anchor="middle" font-size="14" font-weight="bold" fill="#fff">应用中间件层</text>
|
||||
<text x="400" y="175" text-anchor="middle" font-size="12" fill="#d0e8ff">Spring Boot 4.0.6(内嵌 Tomcat)/ 东方通 TongWeb / 宝兰德 BES</text>
|
||||
|
||||
<!-- Arrow -->
|
||||
<polygon points="400,185 393,195 407,195" fill="#3a7bd5"/>
|
||||
|
||||
<!-- Layer 3: App Server -->
|
||||
<rect x="40" y="200" width="720" height="100" rx="8" fill="url(#g3)" filter="url(#shadow)"/>
|
||||
<text x="400" y="225" text-anchor="middle" font-size="14" font-weight="bold" fill="#fff">应用服务器层</text>
|
||||
|
||||
<!-- App Server boxes -->
|
||||
<rect x="60" y="238" width="210" height="48" rx="5" fill="rgba(255,255,255,0.2)" stroke="rgba(255,255,255,0.5)" stroke-width="1"/>
|
||||
<text x="165" y="258" text-anchor="middle" font-size="12" fill="#fff" font-weight="bold">国产 JDK</text>
|
||||
<text x="165" y="276" text-anchor="middle" font-size="11" fill="#e0f0ff">华为毕昇 / 阿里 Dragonwell / 腾讯 Kona</text>
|
||||
|
||||
<rect x="295" y="238" width="210" height="48" rx="5" fill="rgba(255,255,255,0.2)" stroke="rgba(255,255,255,0.5)" stroke-width="1"/>
|
||||
<text x="400" y="258" text-anchor="middle" font-size="12" fill="#fff" font-weight="bold">国产 CPU</text>
|
||||
<text x="400" y="276" text-anchor="middle" font-size="11" fill="#e0f0ff">鲲鹏 920 / 飞腾 S5000C / 海光</text>
|
||||
|
||||
<rect x="530" y="238" width="210" height="48" rx="5" fill="rgba(255,255,255,0.2)" stroke="rgba(255,255,255,0.5)" stroke-width="1"/>
|
||||
<text x="635" y="258" text-anchor="middle" font-size="12" fill="#fff" font-weight="bold">国产操作系统</text>
|
||||
<text x="635" y="276" text-anchor="middle" font-size="11" fill="#e0f0ff">银河麒麟 V11 / 统信 UOS V20</text>
|
||||
|
||||
<!-- Arrow -->
|
||||
<polygon points="400,300 393,310 407,310" fill="#4a90d9"/>
|
||||
|
||||
<!-- Layer 4: Database -->
|
||||
<rect x="40" y="315" width="720" height="100" rx="8" fill="url(#g4)" filter="url(#shadow)"/>
|
||||
<text x="400" y="340" text-anchor="middle" font-size="14" font-weight="bold" fill="#fff">数据库层</text>
|
||||
|
||||
<rect x="60" y="353" width="210" height="48" rx="5" fill="rgba(255,255,255,0.2)" stroke="rgba(255,255,255,0.5)" stroke-width="1"/>
|
||||
<text x="165" y="373" text-anchor="middle" font-size="12" fill="#fff" font-weight="bold">国产数据库</text>
|
||||
<text x="165" y="391" text-anchor="middle" font-size="11" fill="#e0ffe0">openGauss / 达梦 DM8 / 人大金仓</text>
|
||||
|
||||
<rect x="295" y="353" width="210" height="48" rx="5" fill="rgba(255,255,255,0.2)" stroke="rgba(255,255,255,0.5)" stroke-width="1"/>
|
||||
<text x="400" y="373" text-anchor="middle" font-size="12" fill="#fff" font-weight="bold">国产 CPU</text>
|
||||
<text x="400" y="391" text-anchor="middle" font-size="11" fill="#e0ffe0">鲲鹏 920 / 飞腾 S5000C</text>
|
||||
|
||||
<rect x="530" y="353" width="210" height="48" rx="5" fill="rgba(255,255,255,0.2)" stroke="rgba(255,255,255,0.5)" stroke-width="1"/>
|
||||
<text x="635" y="373" text-anchor="middle" font-size="12" fill="#fff" font-weight="bold">高可用架构</text>
|
||||
<text x="635" y="391" text-anchor="middle" font-size="11" fill="#e0ffe0">主从热备 + 自动故障切换</text>
|
||||
|
||||
<!-- Arrow -->
|
||||
<polygon points="400,415 393,425 407,425" fill="#2e7d32"/>
|
||||
|
||||
<!-- Layer 5: Infrastructure -->
|
||||
<rect x="40" y="430" width="720" height="55" rx="8" fill="url(#g5)" filter="url(#shadow)"/>
|
||||
<text x="400" y="455" text-anchor="middle" font-size="14" font-weight="bold" fill="#fff">基础网络层</text>
|
||||
<text x="400" y="475" text-anchor="middle" font-size="12" fill="#e0e0ff">国产存储(华为 / 浪潮)+ 国产交换机(锐捷 / 华为)+ 国产防火墙(深信服 / 奇安信)</text>
|
||||
|
||||
<!-- Right side badge -->
|
||||
<rect x="700" y="45" width="60" height="440" rx="6" fill="none" stroke="#c0392b" stroke-width="2" stroke-dasharray="6,3"/>
|
||||
<text x="730" y="270" text-anchor="middle" font-size="11" fill="#c0392b" font-weight="bold" transform="rotate(90,730,270)">全栈国产化</text>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 5.8 KiB |
BIN
MD/~$ALTHLINK_HIS_PRICING_PROPOSAL_0.2.docx
Normal file
@@ -1,273 +1,273 @@
|
||||
## 门诊手术中临时医嘱生成界面PRD文档
|
||||
|
||||
### 一、页面概述
|
||||
|
||||
**页面名称**:门诊手术中临时医嘱生成界面
|
||||
**页面目标**:帮助麻醉医师在手术过程中快速生成临时医嘱,完成药品计费引用、医嘱预览和电子签名确认的全流程操作
|
||||
**适用场景**:门诊手术过程中需要追加药品医嘱时使用
|
||||
**页面类型**:表单页+数据展示页
|
||||
|
||||
**核心功能**:
|
||||
|
||||
1. 患者手术信息展示
|
||||
2. 已引用计费药品列表展示与汇总
|
||||
3. 临时医嘱预览与编辑功能
|
||||
4. 医师电子签名确认流程
|
||||
5. 数据刷新与退出操作
|
||||
**用户价值**:简化手术中医嘱生成流程,确保医嘱准确性,实现无纸化操作,提高手术室工作效率
|
||||
原型图地址:https://static.pm-ai.cn/prototype/20260122/e1d7f10b85e9efea543bf47bd6831600/index.html
|
||||
**流程图:**
|
||||
```mermaid
|
||||
flowchart TD
|
||||
Start(["Start"]) --> Enter["进入门诊手术中临时医嘱生成界面"]
|
||||
Enter --> ShowBase["展示患者基本信息"]
|
||||
ShowBase --> ShowQuoted["显示已引用计费药品列表"]
|
||||
ShowQuoted --> ShowPreview["显示医嘱预览表格"]
|
||||
ShowPreview --> UserOp{用户操作}
|
||||
|
||||
UserOp -- "引用计费" --> GetLatest{"获取最新计费药品数据\n获取成功?"}
|
||||
GetLatest -- "否" --> ErrTip1["显示错误提示"]
|
||||
GetLatest -- "是" --> UpdateTable["更新药品表格和汇总"]
|
||||
|
||||
UserOp -- "编辑" --> PopEdit["弹出医嘱编辑表单"]
|
||||
PopEdit --> EditVal{"验证通过?"}
|
||||
EditVal -- "否" --> ErrTip2["返回错误提示"]
|
||||
EditVal -- "是" --> SaveClick{"点击保存?"}
|
||||
SaveClick -- "是" --> GenTemp["生成临时药品医嘱"]
|
||||
SaveClick -- "否" --> UserOp
|
||||
|
||||
GenTemp --> UpdatePreview["更新医嘱预览表格"]
|
||||
UpdatePreview --> UpdateRecord["更新手术记录"]
|
||||
UpdateRecord --> ShowResult["显示生成结果"]
|
||||
|
||||
UserOp -- "一键签名并生成医嘱" --> PopPwd["弹出账户密码输入框"]
|
||||
PopPwd --> PopConfirm{"弹出确认对话框"}
|
||||
PopConfirm -- "否" --> UserOp
|
||||
PopConfirm -- "是" --> GenTemp
|
||||
|
||||
UserOp -- "刷新" --> Reload["重新加载界面数据"]
|
||||
Reload --> ShowQuoted
|
||||
|
||||
UserOp -- "退出" --> ExitConfirm{"确认退出?"}
|
||||
ExitConfirm -- "否" --> UserOp
|
||||
ExitConfirm -- "是" --> ReturnUp["返回上级页面"]
|
||||
|
||||
ErrTip1 --> UserOp
|
||||
ErrTip2 --> PopEdit
|
||||
ShowResult --> UserOp
|
||||
ReturnUp --> End([结束])
|
||||
```
|
||||
|
||||
### 二、整体布局分析
|
||||
|
||||
**页面宽度**:自适应布局
|
||||
|
||||
**要区域划分**:
|
||||
|
||||
1. 顶部信息区(15%):患者基本信息+操作按钮区
|
||||
2. 计费药品展示区(35%):已引用计费药品表格+金额汇总
|
||||
3. 医嘱预览区(35%):待生成医嘱的预览表格
|
||||
4. 签名确认区(15%):医师签名信息+操作按钮
|
||||
**布局特点**:上下分块布局,采用卡片式设计,主要区域间有明确分隔线
|
||||
**响应式要求**:768px以下时患者信息改为纵向排列,操作按钮换行显示
|
||||
|
||||
### 三、页面区域详细描述
|
||||
|
||||
#### 1. 顶部信息区
|
||||
|
||||
**区域位置**:页面顶部
|
||||
**区域尺寸**:高度180px(包含20px内边距)
|
||||
**区域功能**:展示患者基本信息+提供主要操作入口
|
||||
**包含元素**:
|
||||
|
||||
- **标题栏**:
|
||||
- 元素类型:标题文本
|
||||
- 显示内容:“门诊术中临时医嘱”
|
||||
- 样式特征:白色文字,1.5rem字号,居中显示,渐变蓝色背景
|
||||
- **患者信息卡**:
|
||||
- 元素类型:信息展示区块
|
||||
- 显示内容:患者姓名、就诊卡号、手术单号、科室、医师、角色
|
||||
- 患者:样例值-张三
|
||||
- 就诊卡号:样例值-202507010122
|
||||
- 手术单号:样例值- S202507010135
|
||||
- 科室: 样例值-手术室(OR101)-取值于手术安排的手术间号字段
|
||||
- 医师:样例值-李麻(3015)
|
||||
- 角色:样例值-麻醉医师
|
||||
- 样式特征:半透明白色背景,圆角8px,内部flex布局
|
||||
- **操作按钮组**:
|
||||
- **[刷新按钮]**:
|
||||
- 元素类型:主要操作按钮
|
||||
- 显示内容:↻ 刷新
|
||||
- 交互行为:点击后重新加载当前界面的数据
|
||||
- 样式特征:蓝色渐变背景,悬停有上浮效果
|
||||
- **[引用计费按钮]**:
|
||||
- 元素类型:次要操作按钮
|
||||
- 显示内容:引用计费
|
||||
- 交互行为:点击后拉取当前患者最新计费药品的数据
|
||||
|
||||
#### 2. 计费药品展示区
|
||||
|
||||
**区域位置**:顶部信息区下方
|
||||
**区域尺寸**:高度约420px(包含标题和表格)
|
||||
**区域功能**:展示待生成医嘱的计费药品清单
|
||||
**包含元素**:
|
||||
|
||||
- **表格标题**:
|
||||
- 显示内容:“一、已引用计费药品(待生成医嘱)”
|
||||
- 样式特征:1.2rem字号,底部边框线
|
||||
- **药品数据表格**:
|
||||
|
||||
**取值于门诊术中计费界面生成的药品计费数据(adm_charge_item(费用项管理)、med_medication_request(药品请求管理)等),具体与系统实际业务数据为主。**
|
||||
|
||||
**(参考)关联字段:adm_charge_item. encounter_id = med_medication_request. encounter_id and –就诊ID**
|
||||
|
||||
**adm_charge_item. service_table = 'med_medication_request' and --记录药品数据**
|
||||
|
||||
**adm_charge_item. bus_no = med_medication_request. bus_no -- adm_charge_item. bus_no的值之前多加了‘CI’**
|
||||
|
||||
- 展示方式:斑马纹表格
|
||||
- 数据字段:
|
||||
- 序号:数字 - 自动生成
|
||||
- 药品名称:文本 - 如"罗哌卡因注射液"
|
||||
- 规格:文本 - 如"10ml"
|
||||
- 数量:数字 - 可编辑
|
||||
- 批号:文本 - 如"L240715"
|
||||
- 单价:数字 - 如"38"
|
||||
- 小计:数字 - 自动计算
|
||||
- 医保:标签 - “甲/乙/自费”
|
||||
- 样式特征:表头浅灰色背景,医保类型有颜色区分(蓝色=医保,绿色=自费)
|
||||
- **金额汇总栏**:
|
||||
- 显示内容:
|
||||
- 医保内金额(蓝色强调)
|
||||
- 自费金额(绿色强调)
|
||||
- 总计金额(红色强调)
|
||||
- 位置:表格底部右对齐
|
||||
|
||||
#### 3. 医嘱预览区
|
||||
|
||||
**区域位置**:计费药品展示区下方
|
||||
**区域尺寸**:高度约420px(包含标题和表格)
|
||||
**区域功能**:展示即将生成的药品医嘱
|
||||
**包含元素**:
|
||||
|
||||
\*生成门诊药品医嘱表相关的数据,满足**计费药品明细 ↔ 药品医嘱** 一一对应的要求。
|
||||
|
||||
可以对照参考:需结合门诊医生站开立药品医嘱时生成的药品医嘱表
|
||||
|
||||
- **表格标题**:
|
||||
- 显示内容:“二、临时医嘱预览(已生成)”
|
||||
- **医嘱表格**:
|
||||
- 展示方式:斑马纹表格
|
||||
- 数据字段:
|
||||
- 序号:数字
|
||||
- 医嘱名称:文本(取已引用计费药品的药品名称)
|
||||
- 剂量:数字(自动计算=规格×数量)
|
||||
- 单位:文本(根据药品类型自动判断)
|
||||
- 用法:下拉选择(不可编辑)
|
||||
- 频次:固定"临时"
|
||||
- 执行时间:自动生成当前时间
|
||||
- 操作:编辑/删除按钮
|
||||
- 操作功能:
|
||||
- 编辑:弹出表单修改剂量、用法等字段
|
||||
- 删除:二次确认后移除该条医嘱
|
||||
|
||||
#### 4. 签名确认区
|
||||
|
||||
**区域位置**:页面底部
|
||||
**区域尺寸**:高度约180px
|
||||
**区域功能**:完成医嘱确认和电子签名
|
||||
**包含元素**:
|
||||
|
||||
- **签名信息卡**:
|
||||
- 显示内容:医师姓名工号、签名状态、签名时间
|
||||
- 样式特征:浅灰色背景,圆角边框
|
||||
- **[一键签名按钮]**:
|
||||
- 元素类型:主要操作按钮
|
||||
- 显示内容:“一键签名并生成医嘱”
|
||||
- 交互行为:点击后弹出账户密码输入框
|
||||
- 样式特征:绿色背景,悬停效果
|
||||
- **[取消按钮]**:
|
||||
- 元素类型:次要操作按钮
|
||||
- 显示内容:“取消”
|
||||
- 交互行为:返回上级页面
|
||||
|
||||
### 四、交互功能详细说明
|
||||
|
||||
#### 1. 引用计费功能
|
||||
|
||||
**功能描述**:从术中计费药品获取患者当前最新的计费药品数据
|
||||
**触发条件**:点击"引用计费"按钮
|
||||
**操作流程**:
|
||||
|
||||
1. 点击按钮获取患者当前最新的计费药品数据
|
||||
2. 成功返回后更新药品表格数据
|
||||
3. 自动计算并更新费用汇总
|
||||
|
||||
**反馈机制**:成功提示弹窗"已成功引用最新计费药品信息!"
|
||||
**异常处理**:请求失败时显示错误提示“获取计费数据失败,请重试”,保留原数据
|
||||
|
||||
#### 2. 医嘱生成功能
|
||||
|
||||
**功能描述**:将计费药品转为正式医嘱
|
||||
**触发条件**:点击"一键签名并生成医嘱"按钮
|
||||
**操作流程**:
|
||||
|
||||
1. 自动生成药品医嘱预览(带默认用法和剂量)
|
||||
2. 弹出账户密码输入框
|
||||
3. 验证通过后生成临时药品医嘱数据
|
||||
4. 成功返回后显示生成结果
|
||||
**数据转换规则**:
|
||||
- 剂量 = 规格数值 × 数量(如"10ml"×2 → 20ml)
|
||||
- 单位:根据药品名称自动判断(默认获取当前药品在《药品目录》维护剂量单位的值)
|
||||
- 用法:根据药品名称自动判断(默认获取当前药品在《药品目录》维护用法的值,如果未维护默认空)
|
||||
- 医嘱名称:取值药品名称
|
||||
- 频次:默认ST
|
||||
- 执行时间:默认当前系统时间
|
||||
|
||||
#### 3. 医嘱编辑功能
|
||||
|
||||
**功能描述**:修改已生成的医嘱明细
|
||||
**触发条件**:点击"编辑"按钮
|
||||
**操作流程**:
|
||||
|
||||
1. 弹出编辑表单(带当前值医嘱值)
|
||||
2. 修改后点击保存更新表格
|
||||
3. 自动重新计算相关字段得值
|
||||
**字段限制**:
|
||||
- 剂量:必须为数字
|
||||
- 用法:限定下拉选项,取值于字典管理:用药途径(用法)的值
|
||||
- 频次:固定为"ST"不可编辑
|
||||
|
||||
### 五、数据结构说明
|
||||
|
||||
**关键数据字段**:
|
||||
|
||||
| **字段名** | **说明** | **数据类型** | **示例值** | **是否必填** | **备注** |
|
||||
|---------------|----------|--------------|--------------------|--------------|------------------|
|
||||
| patientId | 患者ID | string | “202507010122” | 是 | 就诊卡号 |
|
||||
| surgeryNo | 手术单号 | string | “S202507010135” | 是 | |
|
||||
| medicineName | 药品名称 | string | “罗哌卡因注射液” | 是 | |
|
||||
| spec | 规格 | string | “10ml” | 是 | 需包含数值和单位 |
|
||||
| batchNo | 批号 | string | “L240715” | 是 | |
|
||||
| insuranceType | 医保类型 | string | “乙” | 是 | 甲/乙/自费 |
|
||||
| usage | 用法 | string | “静脉推注” | 是 | |
|
||||
| execTime | 执行时间 | datetime | “2025-07-01 08:41” | 是 | 精确到分钟 |
|
||||
|
||||
### 六、开发实现要点
|
||||
|
||||
**样式规范**:
|
||||
|
||||
- **主色调**:\#4a90e2(按钮/标题)
|
||||
- **辅助色**:\#5cb85c(成功操作)、\#e74c3c(警告)
|
||||
- **字体规范**:标题1.5rem/正文0.95rem,行高1.6
|
||||
- **间距系统**:区块padding20px,元素间距15px
|
||||
- **表格样式**:斑马纹,行高56px,单元格padding15px 20px
|
||||
|
||||
**技术要求**:
|
||||
|
||||
- **浏览器兼容**:Chrome/Firefox/Edge最新版
|
||||
|
||||
**注意事项**:
|
||||
|
||||
1. 医嘱生成后需同步更新手术记录
|
||||
2. 所有金额显示保留两位小数
|
||||
## 门诊手术中临时医嘱生成界面PRD文档
|
||||
|
||||
### 一、页面概述
|
||||
|
||||
**页面名称**:门诊手术中临时医嘱生成界面
|
||||
**页面目标**:帮助麻醉医师在手术过程中快速生成临时医嘱,完成药品计费引用、医嘱预览和电子签名确认的全流程操作
|
||||
**适用场景**:门诊手术过程中需要追加药品医嘱时使用
|
||||
**页面类型**:表单页+数据展示页
|
||||
|
||||
**核心功能**:
|
||||
|
||||
1. 患者手术信息展示
|
||||
2. 已引用计费药品列表展示与汇总
|
||||
3. 临时医嘱预览与编辑功能
|
||||
4. 医师电子签名确认流程
|
||||
5. 数据刷新与退出操作
|
||||
**用户价值**:简化手术中医嘱生成流程,确保医嘱准确性,实现无纸化操作,提高手术室工作效率
|
||||
原型图地址:https://static.pm-ai.cn/prototype/20260122/e1d7f10b85e9efea543bf47bd6831600/index.html
|
||||
**流程图:**
|
||||
```mermaid
|
||||
flowchart TD
|
||||
Start(["Start"]) --> Enter["进入门诊手术中临时医嘱生成界面"]
|
||||
Enter --> ShowBase["展示患者基本信息"]
|
||||
ShowBase --> ShowQuoted["显示已引用计费药品列表"]
|
||||
ShowQuoted --> ShowPreview["显示医嘱预览表格"]
|
||||
ShowPreview --> UserOp{用户操作}
|
||||
|
||||
UserOp -- "引用计费" --> GetLatest{"获取最新计费药品数据\n获取成功?"}
|
||||
GetLatest -- "否" --> ErrTip1["显示错误提示"]
|
||||
GetLatest -- "是" --> UpdateTable["更新药品表格和汇总"]
|
||||
|
||||
UserOp -- "编辑" --> PopEdit["弹出医嘱编辑表单"]
|
||||
PopEdit --> EditVal{"验证通过?"}
|
||||
EditVal -- "否" --> ErrTip2["返回错误提示"]
|
||||
EditVal -- "是" --> SaveClick{"点击保存?"}
|
||||
SaveClick -- "是" --> GenTemp["生成临时药品医嘱"]
|
||||
SaveClick -- "否" --> UserOp
|
||||
|
||||
GenTemp --> UpdatePreview["更新医嘱预览表格"]
|
||||
UpdatePreview --> UpdateRecord["更新手术记录"]
|
||||
UpdateRecord --> ShowResult["显示生成结果"]
|
||||
|
||||
UserOp -- "一键签名并生成医嘱" --> PopPwd["弹出账户密码输入框"]
|
||||
PopPwd --> PopConfirm{"弹出确认对话框"}
|
||||
PopConfirm -- "否" --> UserOp
|
||||
PopConfirm -- "是" --> GenTemp
|
||||
|
||||
UserOp -- "刷新" --> Reload["重新加载界面数据"]
|
||||
Reload --> ShowQuoted
|
||||
|
||||
UserOp -- "退出" --> ExitConfirm{"确认退出?"}
|
||||
ExitConfirm -- "否" --> UserOp
|
||||
ExitConfirm -- "是" --> ReturnUp["返回上级页面"]
|
||||
|
||||
ErrTip1 --> UserOp
|
||||
ErrTip2 --> PopEdit
|
||||
ShowResult --> UserOp
|
||||
ReturnUp --> End([结束])
|
||||
```
|
||||
|
||||
### 二、整体布局分析
|
||||
|
||||
**页面宽度**:自适应布局
|
||||
|
||||
**要区域划分**:
|
||||
|
||||
1. 顶部信息区(15%):患者基本信息+操作按钮区
|
||||
2. 计费药品展示区(35%):已引用计费药品表格+金额汇总
|
||||
3. 医嘱预览区(35%):待生成医嘱的预览表格
|
||||
4. 签名确认区(15%):医师签名信息+操作按钮
|
||||
**布局特点**:上下分块布局,采用卡片式设计,主要区域间有明确分隔线
|
||||
**响应式要求**:768px以下时患者信息改为纵向排列,操作按钮换行显示
|
||||
|
||||
### 三、页面区域详细描述
|
||||
|
||||
#### 1. 顶部信息区
|
||||
|
||||
**区域位置**:页面顶部
|
||||
**区域尺寸**:高度180px(包含20px内边距)
|
||||
**区域功能**:展示患者基本信息+提供主要操作入口
|
||||
**包含元素**:
|
||||
|
||||
- **标题栏**:
|
||||
- 元素类型:标题文本
|
||||
- 显示内容:“门诊术中临时医嘱”
|
||||
- 样式特征:白色文字,1.5rem字号,居中显示,渐变蓝色背景
|
||||
- **患者信息卡**:
|
||||
- 元素类型:信息展示区块
|
||||
- 显示内容:患者姓名、就诊卡号、手术单号、科室、医师、角色
|
||||
- 患者:样例值-张三
|
||||
- 就诊卡号:样例值-202507010122
|
||||
- 手术单号:样例值- S202507010135
|
||||
- 科室: 样例值-手术室(OR101)-取值于手术安排的手术间号字段
|
||||
- 医师:样例值-李麻(3015)
|
||||
- 角色:样例值-麻醉医师
|
||||
- 样式特征:半透明白色背景,圆角8px,内部flex布局
|
||||
- **操作按钮组**:
|
||||
- **[刷新按钮]**:
|
||||
- 元素类型:主要操作按钮
|
||||
- 显示内容:↻ 刷新
|
||||
- 交互行为:点击后重新加载当前界面的数据
|
||||
- 样式特征:蓝色渐变背景,悬停有上浮效果
|
||||
- **[引用计费按钮]**:
|
||||
- 元素类型:次要操作按钮
|
||||
- 显示内容:引用计费
|
||||
- 交互行为:点击后拉取当前患者最新计费药品的数据
|
||||
|
||||
#### 2. 计费药品展示区
|
||||
|
||||
**区域位置**:顶部信息区下方
|
||||
**区域尺寸**:高度约420px(包含标题和表格)
|
||||
**区域功能**:展示待生成医嘱的计费药品清单
|
||||
**包含元素**:
|
||||
|
||||
- **表格标题**:
|
||||
- 显示内容:“一、已引用计费药品(待生成医嘱)”
|
||||
- 样式特征:1.2rem字号,底部边框线
|
||||
- **药品数据表格**:
|
||||
|
||||
**取值于门诊术中计费界面生成的药品计费数据(adm_charge_item(费用项管理)、med_medication_request(药品请求管理)等),具体与系统实际业务数据为主。**
|
||||
|
||||
**(参考)关联字段:adm_charge_item. encounter_id = med_medication_request. encounter_id and –就诊ID**
|
||||
|
||||
**adm_charge_item. service_table = 'med_medication_request' and --记录药品数据**
|
||||
|
||||
**adm_charge_item. bus_no = med_medication_request. bus_no -- adm_charge_item. bus_no的值之前多加了‘CI’**
|
||||
|
||||
- 展示方式:斑马纹表格
|
||||
- 数据字段:
|
||||
- 序号:数字 - 自动生成
|
||||
- 药品名称:文本 - 如"罗哌卡因注射液"
|
||||
- 规格:文本 - 如"10ml"
|
||||
- 数量:数字 - 可编辑
|
||||
- 批号:文本 - 如"L240715"
|
||||
- 单价:数字 - 如"38"
|
||||
- 小计:数字 - 自动计算
|
||||
- 医保:标签 - “甲/乙/自费”
|
||||
- 样式特征:表头浅灰色背景,医保类型有颜色区分(蓝色=医保,绿色=自费)
|
||||
- **金额汇总栏**:
|
||||
- 显示内容:
|
||||
- 医保内金额(蓝色强调)
|
||||
- 自费金额(绿色强调)
|
||||
- 总计金额(红色强调)
|
||||
- 位置:表格底部右对齐
|
||||
|
||||
#### 3. 医嘱预览区
|
||||
|
||||
**区域位置**:计费药品展示区下方
|
||||
**区域尺寸**:高度约420px(包含标题和表格)
|
||||
**区域功能**:展示即将生成的药品医嘱
|
||||
**包含元素**:
|
||||
|
||||
\*生成门诊药品医嘱表相关的数据,满足**计费药品明细 ↔ 药品医嘱** 一一对应的要求。
|
||||
|
||||
可以对照参考:需结合门诊医生站开立药品医嘱时生成的药品医嘱表
|
||||
|
||||
- **表格标题**:
|
||||
- 显示内容:“二、临时医嘱预览(已生成)”
|
||||
- **医嘱表格**:
|
||||
- 展示方式:斑马纹表格
|
||||
- 数据字段:
|
||||
- 序号:数字
|
||||
- 医嘱名称:文本(取已引用计费药品的药品名称)
|
||||
- 剂量:数字(自动计算=规格×数量)
|
||||
- 单位:文本(根据药品类型自动判断)
|
||||
- 用法:下拉选择(不可编辑)
|
||||
- 频次:固定"临时"
|
||||
- 执行时间:自动生成当前时间
|
||||
- 操作:编辑/删除按钮
|
||||
- 操作功能:
|
||||
- 编辑:弹出表单修改剂量、用法等字段
|
||||
- 删除:二次确认后移除该条医嘱
|
||||
|
||||
#### 4. 签名确认区
|
||||
|
||||
**区域位置**:页面底部
|
||||
**区域尺寸**:高度约180px
|
||||
**区域功能**:完成医嘱确认和电子签名
|
||||
**包含元素**:
|
||||
|
||||
- **签名信息卡**:
|
||||
- 显示内容:医师姓名工号、签名状态、签名时间
|
||||
- 样式特征:浅灰色背景,圆角边框
|
||||
- **[一键签名按钮]**:
|
||||
- 元素类型:主要操作按钮
|
||||
- 显示内容:“一键签名并生成医嘱”
|
||||
- 交互行为:点击后弹出账户密码输入框
|
||||
- 样式特征:绿色背景,悬停效果
|
||||
- **[取消按钮]**:
|
||||
- 元素类型:次要操作按钮
|
||||
- 显示内容:“取消”
|
||||
- 交互行为:返回上级页面
|
||||
|
||||
### 四、交互功能详细说明
|
||||
|
||||
#### 1. 引用计费功能
|
||||
|
||||
**功能描述**:从术中计费药品获取患者当前最新的计费药品数据
|
||||
**触发条件**:点击"引用计费"按钮
|
||||
**操作流程**:
|
||||
|
||||
1. 点击按钮获取患者当前最新的计费药品数据
|
||||
2. 成功返回后更新药品表格数据
|
||||
3. 自动计算并更新费用汇总
|
||||
|
||||
**反馈机制**:成功提示弹窗"已成功引用最新计费药品信息!"
|
||||
**异常处理**:请求失败时显示错误提示“获取计费数据失败,请重试”,保留原数据
|
||||
|
||||
#### 2. 医嘱生成功能
|
||||
|
||||
**功能描述**:将计费药品转为正式医嘱
|
||||
**触发条件**:点击"一键签名并生成医嘱"按钮
|
||||
**操作流程**:
|
||||
|
||||
1. 自动生成药品医嘱预览(带默认用法和剂量)
|
||||
2. 弹出账户密码输入框
|
||||
3. 验证通过后生成临时药品医嘱数据
|
||||
4. 成功返回后显示生成结果
|
||||
**数据转换规则**:
|
||||
- 剂量 = 规格数值 × 数量(如"10ml"×2 → 20ml)
|
||||
- 单位:根据药品名称自动判断(默认获取当前药品在《药品目录》维护剂量单位的值)
|
||||
- 用法:根据药品名称自动判断(默认获取当前药品在《药品目录》维护用法的值,如果未维护默认空)
|
||||
- 医嘱名称:取值药品名称
|
||||
- 频次:默认ST
|
||||
- 执行时间:默认当前系统时间
|
||||
|
||||
#### 3. 医嘱编辑功能
|
||||
|
||||
**功能描述**:修改已生成的医嘱明细
|
||||
**触发条件**:点击"编辑"按钮
|
||||
**操作流程**:
|
||||
|
||||
1. 弹出编辑表单(带当前值医嘱值)
|
||||
2. 修改后点击保存更新表格
|
||||
3. 自动重新计算相关字段得值
|
||||
**字段限制**:
|
||||
- 剂量:必须为数字
|
||||
- 用法:限定下拉选项,取值于字典管理:用药途径(用法)的值
|
||||
- 频次:固定为"ST"不可编辑
|
||||
|
||||
### 五、数据结构说明
|
||||
|
||||
**关键数据字段**:
|
||||
|
||||
| **字段名** | **说明** | **数据类型** | **示例值** | **是否必填** | **备注** |
|
||||
|---------------|----------|--------------|--------------------|--------------|------------------|
|
||||
| patientId | 患者ID | string | “202507010122” | 是 | 就诊卡号 |
|
||||
| surgeryNo | 手术单号 | string | “S202507010135” | 是 | |
|
||||
| medicineName | 药品名称 | string | “罗哌卡因注射液” | 是 | |
|
||||
| spec | 规格 | string | “10ml” | 是 | 需包含数值和单位 |
|
||||
| batchNo | 批号 | string | “L240715” | 是 | |
|
||||
| insuranceType | 医保类型 | string | “乙” | 是 | 甲/乙/自费 |
|
||||
| usage | 用法 | string | “静脉推注” | 是 | |
|
||||
| execTime | 执行时间 | datetime | “2025-07-01 08:41” | 是 | 精确到分钟 |
|
||||
|
||||
### 六、开发实现要点
|
||||
|
||||
**样式规范**:
|
||||
|
||||
- **主色调**:\#4a90e2(按钮/标题)
|
||||
- **辅助色**:\#5cb85c(成功操作)、\#e74c3c(警告)
|
||||
- **字体规范**:标题1.5rem/正文0.95rem,行高1.6
|
||||
- **间距系统**:区块padding20px,元素间距15px
|
||||
- **表格样式**:斑马纹,行高56px,单元格padding15px 20px
|
||||
|
||||
**技术要求**:
|
||||
|
||||
- **浏览器兼容**:Chrome/Firefox/Edge最新版
|
||||
|
||||
**注意事项**:
|
||||
|
||||
1. 医嘱生成后需同步更新手术记录
|
||||
2. 所有金额显示保留两位小数
|
||||
@@ -1,349 +1,349 @@
|
||||
## 医生个人报卡管理界面PRD文档
|
||||
|
||||
### 一、页面概述
|
||||
|
||||
**页面名称**:医生个人报卡管理界面
|
||||
**页面目标**:为医生提供传染病报告卡的管理功能,包括查看、编辑、提交、撤回、导出等操作,并提供数据统计和筛选功能。
|
||||
**适用场景**:医生需要查看/编辑或管理已填写的传染病报告卡,进行批量操作或筛选特定状态的报告卡
|
||||
**页面类型**:列表页(含筛选功能) + 表单页(编辑/查看模态框)。
|
||||
|
||||
**核心功能**:
|
||||
|
||||
1. 报卡数据统计展示(总报卡数/待处理失败/已成功上报)
|
||||
2. 报卡列表筛选与查询(按日期/状态/关键词)
|
||||
3. 报卡详情查看与编辑
|
||||
4. 批量操作(全选/批量提交/批量删除)
|
||||
5. 报卡导出为Word格式
|
||||
|
||||
**用户价值**:
|
||||
|
||||
- 快速掌握个人报卡工作整体情况
|
||||
- 高效管理不同状态的报卡记录
|
||||
- 规范疾病报告卡流程,确保数据及时准确上报
|
||||
**原型图地址**:https://static.pm-ai.cn/prototype/20260129/865d147e5650ff42c054b38244ed8239/index.html
|
||||
**流程图**:
|
||||
```mermaid
|
||||
flowchart TD
|
||||
Start([医生进入个人报卡管理界面]) --> Load[展示数据统计卡片]
|
||||
Load --> Stats[展示统计卡片\n总报卡数待处理已上报]
|
||||
Stats --> Filter[渲染筛选区日期状态名称]
|
||||
Filter --> Table[展示报卡列表]
|
||||
|
||||
Table --> Op{用户操作选择}
|
||||
|
||||
Op -->|点击查看| View1[弹出只读模态框]
|
||||
View1 --> View2[展示完整报卡信息]
|
||||
View2 --> View3[关闭模态框]
|
||||
View3 --> Table
|
||||
|
||||
Op -->|点击编辑| Edit1{状态是待提交?}
|
||||
Edit1 -->|否| Table
|
||||
Edit1 -->|是| Edit2[弹出编辑模态框]
|
||||
Edit2 --> Edit3[修改表单字段]
|
||||
Edit3 --> Edit4[点击保存]
|
||||
Edit4 --> Edit5{验证必填项}
|
||||
Edit5 -->|失败| Edit6[显示错误原因]
|
||||
Edit6 --> Edit2
|
||||
Edit5 -->|通过| Edit7[保存数据]
|
||||
Edit7 --> Edit8[提示成功]
|
||||
Edit8 --> Table
|
||||
|
||||
Op -->|点击提交| Sub1{状态是待提交?}
|
||||
Sub1 -->|是| Sub2[确认对话框]
|
||||
Sub2 --> Sub3[变更为已提交]
|
||||
Sub3 --> Sub4[刷新表格统计]
|
||||
Sub4 --> Table
|
||||
Sub1 -->|否| Table
|
||||
|
||||
Op -->|点击撤回| Back1{状态是已提交?}
|
||||
Back1 -->|是| Back2[变更为待提交]
|
||||
Back2 --> Table
|
||||
Back1 -->|否| Table
|
||||
|
||||
Op -->|点击导出| Exp1{状态是已上报?}
|
||||
Exp1 -->|是| Exp2[报告卡导出预览]
|
||||
Exp2 --> Exp3[导出Word文档]
|
||||
Exp3 --> Table
|
||||
Exp1 -->|否| Table
|
||||
|
||||
Op -->|应用筛选| Filt1[触发筛选条件]
|
||||
Filt1 --> Filt2[重新加载列表]
|
||||
Filt2 --> Table
|
||||
|
||||
Op -->|批量操作| Batch1{已选记录?}
|
||||
Batch1 -->|否| Batch2[提示请选择记录]
|
||||
Batch2 --> Table
|
||||
Batch1 -->|是| Batch3{操作类型}
|
||||
|
||||
Batch3 -->|批量提交| Batch4{全是待提交?}
|
||||
Batch4 -->|否| Batch5[提示只能提交待提交]
|
||||
Batch5 --> Table
|
||||
Batch4 -->|是| Batch6[确认数量]
|
||||
Batch6 --> Batch7[更新为已提交]
|
||||
Batch7 --> Batch8[刷新统计数据]
|
||||
Batch8 --> Table
|
||||
|
||||
Batch3 -->|批量删除| Batch9{全是待提交?}
|
||||
Batch9 -->|否| Batch10[提示只能删除待提交]
|
||||
Batch10 --> Table
|
||||
Batch9 -->|是| Batch11[确认删除]
|
||||
Batch11 --> Batch12[状态变为作废]
|
||||
Batch12 --> Batch13[刷新数据]
|
||||
Batch13 --> Table
|
||||
```
|
||||
|
||||
### 二、整体布局分析
|
||||
|
||||
**页面宽度**:自适应布局
|
||||
**主要区域划分**:
|
||||
|
||||
1. **顶部标题区**(5%):页面标题。
|
||||
2. **数据统计区**(15%):展示总报卡数、待处理失败数、已成功上报数。
|
||||
3. **高级筛选区**(15%):提供日期范围、状态、报卡名称等筛选条件。
|
||||
4. **数据表格区**(55%):展示报卡列表,支持多选和操作按钮。
|
||||
5. **底部批量操作区**(10%):全选、批量删除、批量提交功能。
|
||||
|
||||
**布局特点**:上下布局,采用卡片式设计,主内容区为表格展示
|
||||
|
||||
### 三、页面区域详细描述
|
||||
|
||||
#### 1. 顶部标题区
|
||||
|
||||
**区域位置**:页面最上方
|
||||
**区域尺寸**:高度60px,宽度100%。
|
||||
**区域功能**:展示页面标题和主要操作入口
|
||||
**包含元素**:
|
||||
|
||||
- **页面标题**:
|
||||
|
||||
- - 元素类型:文本
|
||||
- 显示内容:“我的报卡”
|
||||
- 样式特征:20px/600,深灰色(#1e293b)
|
||||
|
||||
#### 2. 数据统计卡片区
|
||||
|
||||
**区域位置**:标题区下方
|
||||
**区域尺寸**:高度150px,宽度100%。
|
||||
**区域功能**:展示关键统计数据,帮助医生快速了解报卡状态分布。
|
||||
**包含元素**:
|
||||
|
||||
- **总报卡数卡片**:
|
||||
|
||||
- - 元素类型:统计卡片
|
||||
- 显示内容:图标+数值+“总报卡数”
|
||||
- 样式特征:紫色渐变背景,圆角12px
|
||||
|
||||
- **待处理失败卡片**:
|
||||
|
||||
- - 同总报卡数卡片,红色系配色
|
||||
|
||||
- **已成功上报卡片**:
|
||||
|
||||
- - 同总报卡数卡片,绿色系配色
|
||||
|
||||
#### 3. 高级筛选区
|
||||
|
||||
**区域位置**:统计卡片下方
|
||||
**区域尺寸**:高度150px,宽度100%
|
||||
**区域功能**:提供多维筛选条件,支持快速定位目标报卡。
|
||||
**包含元素**:
|
||||
|
||||
- **日期范围选择器**:
|
||||
|
||||
- - 元素类型:表单控件(两个date输入框)
|
||||
- 交互行为:选择日期后触发筛选。
|
||||
- 限制条件:结束日期不能早于开始日期。
|
||||
|
||||
- **状态筛选下拉框**:
|
||||
|
||||
- - 元素类型:下拉选择
|
||||
- 可选值:全部状态/待提交/已提交/已审核/已上报/失败/作废
|
||||
|
||||
- **报卡名称搜索框**:
|
||||
|
||||
- - 元素类型:文本输入框
|
||||
- 占位文本:“输入报卡名称…”
|
||||
|
||||
- **应用筛选按钮**:
|
||||
|
||||
- - 元素类型:主要操作按钮
|
||||
- 交互行为:点击后触发表格数据刷新
|
||||
|
||||
- **重置条件按钮**:
|
||||
|
||||
- - 元素类型:次要操作按钮
|
||||
- 交互行为:清空所有筛选条件
|
||||
|
||||
#### 4. 数据表格区
|
||||
|
||||
**区域位置**:页面中部
|
||||
**区域尺寸**:高度自适应,宽度100%。
|
||||
**区域功能**:展示报卡列表及提供行级操作
|
||||
**包含元素**:
|
||||
|
||||
- **表格头部**:
|
||||
|
||||
**数据主要取值于传染病报卡表(infectious_card)**
|
||||
|
||||
- - 包含字段:选择框、卡片ID、患者姓名、身份证号、联系电话、就诊卡号、报卡名称、提交时间、状态、操作
|
||||
- 样式特征:灰色背景,13px字号,大写字母
|
||||
|
||||
- **表格内容行**:
|
||||
|
||||
- - 展示方式:每行显示一条报卡记录
|
||||
|
||||
- 数据字段:
|
||||
|
||||
- - 卡片ID:文本 - HOSP202601150001 - 不可操作
|
||||
- 患者姓名:文本 - 张三 - 不可操作
|
||||
- 身份证号:不脱敏文本 - 110101199001011234 - 不可操作
|
||||
- 联系电话:文本 - 13800138000 - 不可操作
|
||||
- 就诊卡号:文本 - M12345678 - 不可操作
|
||||
- 报卡名称:文本 - 中华人民共和国传染病报告卡 - 不可操作
|
||||
- 提交时间:时间 - 2026-01-15 14:30 - 不可操作
|
||||
- 状态标签:根据状态值显示不同颜色
|
||||
|
||||
- 操作功能:
|
||||
|
||||
- - 查看按钮:所有状态可见
|
||||
- 编辑按钮:仅"待提交"状态可见
|
||||
- 提交按钮:仅"待提交"状态可见
|
||||
- 撤回按钮:仅"已提交"状态可见
|
||||
- 导出按钮:仅"已上报"状态可见
|
||||
|
||||
#### 5. 底部批量操作区
|
||||
|
||||
**区域位置**:页面底部
|
||||
**区域尺寸**:高度60px,宽度100%。
|
||||
**区域功能**:支持批量操作选中报卡。
|
||||
**包含元素**:
|
||||
|
||||
- **全选复选框**:
|
||||
|
||||
- - 交互行为:勾选后选中当前页所有记录
|
||||
|
||||
- **批量删除按钮**:
|
||||
|
||||
- - 元素类型:文本按钮
|
||||
- 限制条件:仅对"待提交"状态记录有效
|
||||
- 交互行为:提交后状态变为"作废"。
|
||||
|
||||
- **批量提交按钮**:
|
||||
|
||||
- - 元素类型:主要操作按钮
|
||||
- 限制条件:仅对"待提交"状态记录有效
|
||||
- 交互行为:提交后状态变为"已提交"。
|
||||
|
||||
#### 6. 报卡详情弹窗(界面内容功能与需求编号102界面保持一致,建议用同一个界面)
|
||||
|
||||
**区域位置**:页面居中模态框
|
||||
**区域功能**:查看/编辑完整报卡信息
|
||||
**包含元素**:
|
||||
|
||||
- 表单字段(按模块分组):
|
||||
|
||||
- 1. 患者基本信息(姓名/身份证号/联系方式*)
|
||||
2. 临床信息(发病日期/诊断日期*)
|
||||
3. 传染病分类(甲/乙/丙类多选*)
|
||||
4. 报告信息(报告单位/医生*)
|
||||
|
||||
- 操作按钮:
|
||||
|
||||
o 取消:关闭弹窗不保存
|
||||
|
||||
o 保存:验证必填项后保持数据
|
||||
|
||||
### 四、交互功能详细说明
|
||||
|
||||
#### 1. 报卡查看功能
|
||||
|
||||
**功能描述**:查看报卡详细信息
|
||||
**触发条件**:点击任意行的"查看"按钮
|
||||
**操作流程**:
|
||||
|
||||
1. 弹出模态框展示完整报卡信息
|
||||
2. 所有字段为只读状态
|
||||
3. 点击关闭按钮或蒙层关闭模态框
|
||||
|
||||
#### 2. 报卡编辑功能
|
||||
|
||||
**功能描述**:修改待提交的报卡信息
|
||||
**触发条件**:点击"待提交"状态的"编辑"按钮
|
||||
**操作流程**:
|
||||
|
||||
1. 弹出可编辑的报卡表单模态框
|
||||
2. 修改必要字段(带*号为必填项)
|
||||
3. 点击"保存"按钮提交修改
|
||||
4. 成功提示后关闭模态框
|
||||
|
||||
#### 3. 批量提交功能
|
||||
|
||||
**功能描述**:批量提交选中的待提交报卡
|
||||
**触发条件**:勾选记录后点击"批量提交"按钮
|
||||
**操作流程**:
|
||||
|
||||
1. 校验是否选中有效记录(状态为待提交)
|
||||
2. 弹出确认对话框显示待提交数量
|
||||
3. 确认后更新记录状态为"已提交"
|
||||
4. 刷新表格数据和统计卡片
|
||||
|
||||
**异常处理**:
|
||||
|
||||
- 未选中记录:提示"请选择待提交的记录"
|
||||
- 包含不可提交记录:提示"只能提交待提交状态的记录"
|
||||
|
||||
#### 4. 报卡状态流转
|
||||
|
||||
**触发方式**:点击操作列按钮
|
||||
**执行流程**:
|
||||
|
||||
1. 待提交 → 已提交:点击"提交"按钮 → 弹窗确认 → 状态变更
|
||||
2. 已提交 → 待提交:点击"撤回"按钮 → 状态回滚
|
||||
3. 已上报 → 导出:生成标准疾病报告卡Word文档(含医院红头格式)
|
||||
|
||||
**异常处理**:
|
||||
|
||||
- 提交失败:显示具体错误原因(如:必填项未完成)
|
||||
|
||||
### 五、数据结构说明
|
||||
|
||||
**关键数据字段**:
|
||||
|
||||
**传染病报卡表(infectious_card)**
|
||||
|
||||
### 六、开发实现要点
|
||||
|
||||
**样式规范**:
|
||||
|
||||
- **主色调**:#6366f1(紫色)
|
||||
|
||||
- **状态色**:
|
||||
|
||||
- - 待提交:#f59e0b(橙色)
|
||||
- 已提交:#2563eb(蓝色)
|
||||
- 已上报:#16a34a(绿色)
|
||||
- 失败:#dc2626(红色)
|
||||
|
||||
- **字体规范**:
|
||||
|
||||
- - 标题:20px/600
|
||||
- 正文:14px/400
|
||||
|
||||
- **间距系统**:
|
||||
|
||||
- - 卡片内边距:24px
|
||||
- 元素间距:16px
|
||||
|
||||
**技术要求**:
|
||||
|
||||
- **表格组件**:需支持虚拟滚动(大数据量场景)
|
||||
- **导出功能**:实现Word导出
|
||||
|
||||
**注意事项**:
|
||||
|
||||
1. 身份证号等敏感信息不需做脱敏处理
|
||||
2. 批量操作需考虑性能优化(分页处理)
|
||||
3. 状态变更需同步更新统计卡片数据
|
||||
4. 移动端需特别处理表格的横向滚动体验
|
||||
5. ‘待提交’状态就是‘暂存’状态
|
||||
## 医生个人报卡管理界面PRD文档
|
||||
|
||||
### 一、页面概述
|
||||
|
||||
**页面名称**:医生个人报卡管理界面
|
||||
**页面目标**:为医生提供传染病报告卡的管理功能,包括查看、编辑、提交、撤回、导出等操作,并提供数据统计和筛选功能。
|
||||
**适用场景**:医生需要查看/编辑或管理已填写的传染病报告卡,进行批量操作或筛选特定状态的报告卡
|
||||
**页面类型**:列表页(含筛选功能) + 表单页(编辑/查看模态框)。
|
||||
|
||||
**核心功能**:
|
||||
|
||||
1. 报卡数据统计展示(总报卡数/待处理失败/已成功上报)
|
||||
2. 报卡列表筛选与查询(按日期/状态/关键词)
|
||||
3. 报卡详情查看与编辑
|
||||
4. 批量操作(全选/批量提交/批量删除)
|
||||
5. 报卡导出为Word格式
|
||||
|
||||
**用户价值**:
|
||||
|
||||
- 快速掌握个人报卡工作整体情况
|
||||
- 高效管理不同状态的报卡记录
|
||||
- 规范疾病报告卡流程,确保数据及时准确上报
|
||||
**原型图地址**:https://static.pm-ai.cn/prototype/20260129/865d147e5650ff42c054b38244ed8239/index.html
|
||||
**流程图**:
|
||||
```mermaid
|
||||
flowchart TD
|
||||
Start([医生进入个人报卡管理界面]) --> Load[展示数据统计卡片]
|
||||
Load --> Stats[展示统计卡片\n总报卡数待处理已上报]
|
||||
Stats --> Filter[渲染筛选区日期状态名称]
|
||||
Filter --> Table[展示报卡列表]
|
||||
|
||||
Table --> Op{用户操作选择}
|
||||
|
||||
Op -->|点击查看| View1[弹出只读模态框]
|
||||
View1 --> View2[展示完整报卡信息]
|
||||
View2 --> View3[关闭模态框]
|
||||
View3 --> Table
|
||||
|
||||
Op -->|点击编辑| Edit1{状态是待提交?}
|
||||
Edit1 -->|否| Table
|
||||
Edit1 -->|是| Edit2[弹出编辑模态框]
|
||||
Edit2 --> Edit3[修改表单字段]
|
||||
Edit3 --> Edit4[点击保存]
|
||||
Edit4 --> Edit5{验证必填项}
|
||||
Edit5 -->|失败| Edit6[显示错误原因]
|
||||
Edit6 --> Edit2
|
||||
Edit5 -->|通过| Edit7[保存数据]
|
||||
Edit7 --> Edit8[提示成功]
|
||||
Edit8 --> Table
|
||||
|
||||
Op -->|点击提交| Sub1{状态是待提交?}
|
||||
Sub1 -->|是| Sub2[确认对话框]
|
||||
Sub2 --> Sub3[变更为已提交]
|
||||
Sub3 --> Sub4[刷新表格统计]
|
||||
Sub4 --> Table
|
||||
Sub1 -->|否| Table
|
||||
|
||||
Op -->|点击撤回| Back1{状态是已提交?}
|
||||
Back1 -->|是| Back2[变更为待提交]
|
||||
Back2 --> Table
|
||||
Back1 -->|否| Table
|
||||
|
||||
Op -->|点击导出| Exp1{状态是已上报?}
|
||||
Exp1 -->|是| Exp2[报告卡导出预览]
|
||||
Exp2 --> Exp3[导出Word文档]
|
||||
Exp3 --> Table
|
||||
Exp1 -->|否| Table
|
||||
|
||||
Op -->|应用筛选| Filt1[触发筛选条件]
|
||||
Filt1 --> Filt2[重新加载列表]
|
||||
Filt2 --> Table
|
||||
|
||||
Op -->|批量操作| Batch1{已选记录?}
|
||||
Batch1 -->|否| Batch2[提示请选择记录]
|
||||
Batch2 --> Table
|
||||
Batch1 -->|是| Batch3{操作类型}
|
||||
|
||||
Batch3 -->|批量提交| Batch4{全是待提交?}
|
||||
Batch4 -->|否| Batch5[提示只能提交待提交]
|
||||
Batch5 --> Table
|
||||
Batch4 -->|是| Batch6[确认数量]
|
||||
Batch6 --> Batch7[更新为已提交]
|
||||
Batch7 --> Batch8[刷新统计数据]
|
||||
Batch8 --> Table
|
||||
|
||||
Batch3 -->|批量删除| Batch9{全是待提交?}
|
||||
Batch9 -->|否| Batch10[提示只能删除待提交]
|
||||
Batch10 --> Table
|
||||
Batch9 -->|是| Batch11[确认删除]
|
||||
Batch11 --> Batch12[状态变为作废]
|
||||
Batch12 --> Batch13[刷新数据]
|
||||
Batch13 --> Table
|
||||
```
|
||||
|
||||
### 二、整体布局分析
|
||||
|
||||
**页面宽度**:自适应布局
|
||||
**主要区域划分**:
|
||||
|
||||
1. **顶部标题区**(5%):页面标题。
|
||||
2. **数据统计区**(15%):展示总报卡数、待处理失败数、已成功上报数。
|
||||
3. **高级筛选区**(15%):提供日期范围、状态、报卡名称等筛选条件。
|
||||
4. **数据表格区**(55%):展示报卡列表,支持多选和操作按钮。
|
||||
5. **底部批量操作区**(10%):全选、批量删除、批量提交功能。
|
||||
|
||||
**布局特点**:上下布局,采用卡片式设计,主内容区为表格展示
|
||||
|
||||
### 三、页面区域详细描述
|
||||
|
||||
#### 1. 顶部标题区
|
||||
|
||||
**区域位置**:页面最上方
|
||||
**区域尺寸**:高度60px,宽度100%。
|
||||
**区域功能**:展示页面标题和主要操作入口
|
||||
**包含元素**:
|
||||
|
||||
- **页面标题**:
|
||||
|
||||
- - 元素类型:文本
|
||||
- 显示内容:“我的报卡”
|
||||
- 样式特征:20px/600,深灰色(#1e293b)
|
||||
|
||||
#### 2. 数据统计卡片区
|
||||
|
||||
**区域位置**:标题区下方
|
||||
**区域尺寸**:高度150px,宽度100%。
|
||||
**区域功能**:展示关键统计数据,帮助医生快速了解报卡状态分布。
|
||||
**包含元素**:
|
||||
|
||||
- **总报卡数卡片**:
|
||||
|
||||
- - 元素类型:统计卡片
|
||||
- 显示内容:图标+数值+“总报卡数”
|
||||
- 样式特征:紫色渐变背景,圆角12px
|
||||
|
||||
- **待处理失败卡片**:
|
||||
|
||||
- - 同总报卡数卡片,红色系配色
|
||||
|
||||
- **已成功上报卡片**:
|
||||
|
||||
- - 同总报卡数卡片,绿色系配色
|
||||
|
||||
#### 3. 高级筛选区
|
||||
|
||||
**区域位置**:统计卡片下方
|
||||
**区域尺寸**:高度150px,宽度100%
|
||||
**区域功能**:提供多维筛选条件,支持快速定位目标报卡。
|
||||
**包含元素**:
|
||||
|
||||
- **日期范围选择器**:
|
||||
|
||||
- - 元素类型:表单控件(两个date输入框)
|
||||
- 交互行为:选择日期后触发筛选。
|
||||
- 限制条件:结束日期不能早于开始日期。
|
||||
|
||||
- **状态筛选下拉框**:
|
||||
|
||||
- - 元素类型:下拉选择
|
||||
- 可选值:全部状态/待提交/已提交/已审核/已上报/失败/作废
|
||||
|
||||
- **报卡名称搜索框**:
|
||||
|
||||
- - 元素类型:文本输入框
|
||||
- 占位文本:“输入报卡名称…”
|
||||
|
||||
- **应用筛选按钮**:
|
||||
|
||||
- - 元素类型:主要操作按钮
|
||||
- 交互行为:点击后触发表格数据刷新
|
||||
|
||||
- **重置条件按钮**:
|
||||
|
||||
- - 元素类型:次要操作按钮
|
||||
- 交互行为:清空所有筛选条件
|
||||
|
||||
#### 4. 数据表格区
|
||||
|
||||
**区域位置**:页面中部
|
||||
**区域尺寸**:高度自适应,宽度100%。
|
||||
**区域功能**:展示报卡列表及提供行级操作
|
||||
**包含元素**:
|
||||
|
||||
- **表格头部**:
|
||||
|
||||
**数据主要取值于传染病报卡表(infectious_card)**
|
||||
|
||||
- - 包含字段:选择框、卡片ID、患者姓名、身份证号、联系电话、就诊卡号、报卡名称、提交时间、状态、操作
|
||||
- 样式特征:灰色背景,13px字号,大写字母
|
||||
|
||||
- **表格内容行**:
|
||||
|
||||
- - 展示方式:每行显示一条报卡记录
|
||||
|
||||
- 数据字段:
|
||||
|
||||
- - 卡片ID:文本 - HOSP202601150001 - 不可操作
|
||||
- 患者姓名:文本 - 张三 - 不可操作
|
||||
- 身份证号:不脱敏文本 - 110101199001011234 - 不可操作
|
||||
- 联系电话:文本 - 13800138000 - 不可操作
|
||||
- 就诊卡号:文本 - M12345678 - 不可操作
|
||||
- 报卡名称:文本 - 中华人民共和国传染病报告卡 - 不可操作
|
||||
- 提交时间:时间 - 2026-01-15 14:30 - 不可操作
|
||||
- 状态标签:根据状态值显示不同颜色
|
||||
|
||||
- 操作功能:
|
||||
|
||||
- - 查看按钮:所有状态可见
|
||||
- 编辑按钮:仅"待提交"状态可见
|
||||
- 提交按钮:仅"待提交"状态可见
|
||||
- 撤回按钮:仅"已提交"状态可见
|
||||
- 导出按钮:仅"已上报"状态可见
|
||||
|
||||
#### 5. 底部批量操作区
|
||||
|
||||
**区域位置**:页面底部
|
||||
**区域尺寸**:高度60px,宽度100%。
|
||||
**区域功能**:支持批量操作选中报卡。
|
||||
**包含元素**:
|
||||
|
||||
- **全选复选框**:
|
||||
|
||||
- - 交互行为:勾选后选中当前页所有记录
|
||||
|
||||
- **批量删除按钮**:
|
||||
|
||||
- - 元素类型:文本按钮
|
||||
- 限制条件:仅对"待提交"状态记录有效
|
||||
- 交互行为:提交后状态变为"作废"。
|
||||
|
||||
- **批量提交按钮**:
|
||||
|
||||
- - 元素类型:主要操作按钮
|
||||
- 限制条件:仅对"待提交"状态记录有效
|
||||
- 交互行为:提交后状态变为"已提交"。
|
||||
|
||||
#### 6. 报卡详情弹窗(界面内容功能与需求编号102界面保持一致,建议用同一个界面)
|
||||
|
||||
**区域位置**:页面居中模态框
|
||||
**区域功能**:查看/编辑完整报卡信息
|
||||
**包含元素**:
|
||||
|
||||
- 表单字段(按模块分组):
|
||||
|
||||
- 1. 患者基本信息(姓名/身份证号/联系方式*)
|
||||
2. 临床信息(发病日期/诊断日期*)
|
||||
3. 传染病分类(甲/乙/丙类多选*)
|
||||
4. 报告信息(报告单位/医生*)
|
||||
|
||||
- 操作按钮:
|
||||
|
||||
o 取消:关闭弹窗不保存
|
||||
|
||||
o 保存:验证必填项后保持数据
|
||||
|
||||
### 四、交互功能详细说明
|
||||
|
||||
#### 1. 报卡查看功能
|
||||
|
||||
**功能描述**:查看报卡详细信息
|
||||
**触发条件**:点击任意行的"查看"按钮
|
||||
**操作流程**:
|
||||
|
||||
1. 弹出模态框展示完整报卡信息
|
||||
2. 所有字段为只读状态
|
||||
3. 点击关闭按钮或蒙层关闭模态框
|
||||
|
||||
#### 2. 报卡编辑功能
|
||||
|
||||
**功能描述**:修改待提交的报卡信息
|
||||
**触发条件**:点击"待提交"状态的"编辑"按钮
|
||||
**操作流程**:
|
||||
|
||||
1. 弹出可编辑的报卡表单模态框
|
||||
2. 修改必要字段(带*号为必填项)
|
||||
3. 点击"保存"按钮提交修改
|
||||
4. 成功提示后关闭模态框
|
||||
|
||||
#### 3. 批量提交功能
|
||||
|
||||
**功能描述**:批量提交选中的待提交报卡
|
||||
**触发条件**:勾选记录后点击"批量提交"按钮
|
||||
**操作流程**:
|
||||
|
||||
1. 校验是否选中有效记录(状态为待提交)
|
||||
2. 弹出确认对话框显示待提交数量
|
||||
3. 确认后更新记录状态为"已提交"
|
||||
4. 刷新表格数据和统计卡片
|
||||
|
||||
**异常处理**:
|
||||
|
||||
- 未选中记录:提示"请选择待提交的记录"
|
||||
- 包含不可提交记录:提示"只能提交待提交状态的记录"
|
||||
|
||||
#### 4. 报卡状态流转
|
||||
|
||||
**触发方式**:点击操作列按钮
|
||||
**执行流程**:
|
||||
|
||||
1. 待提交 → 已提交:点击"提交"按钮 → 弹窗确认 → 状态变更
|
||||
2. 已提交 → 待提交:点击"撤回"按钮 → 状态回滚
|
||||
3. 已上报 → 导出:生成标准疾病报告卡Word文档(含医院红头格式)
|
||||
|
||||
**异常处理**:
|
||||
|
||||
- 提交失败:显示具体错误原因(如:必填项未完成)
|
||||
|
||||
### 五、数据结构说明
|
||||
|
||||
**关键数据字段**:
|
||||
|
||||
**传染病报卡表(infectious_card)**
|
||||
|
||||
### 六、开发实现要点
|
||||
|
||||
**样式规范**:
|
||||
|
||||
- **主色调**:#6366f1(紫色)
|
||||
|
||||
- **状态色**:
|
||||
|
||||
- - 待提交:#f59e0b(橙色)
|
||||
- 已提交:#2563eb(蓝色)
|
||||
- 已上报:#16a34a(绿色)
|
||||
- 失败:#dc2626(红色)
|
||||
|
||||
- **字体规范**:
|
||||
|
||||
- - 标题:20px/600
|
||||
- 正文:14px/400
|
||||
|
||||
- **间距系统**:
|
||||
|
||||
- - 卡片内边距:24px
|
||||
- 元素间距:16px
|
||||
|
||||
**技术要求**:
|
||||
|
||||
- **表格组件**:需支持虚拟滚动(大数据量场景)
|
||||
- **导出功能**:实现Word导出
|
||||
|
||||
**注意事项**:
|
||||
|
||||
1. 身份证号等敏感信息不需做脱敏处理
|
||||
2. 批量操作需考虑性能优化(分页处理)
|
||||
3. 状态变更需同步更新统计卡片数据
|
||||
4. 移动端需特别处理表格的横向滚动体验
|
||||
5. ‘待提交’状态就是‘暂存’状态
|
||||
6. 只能查询医生本人报卡的数据
|
||||
@@ -1,434 +1,434 @@
|
||||
## 报卡管理界面PRD文档
|
||||
|
||||
### 一、页面概述
|
||||
|
||||
**页面名称**:报卡管理界面
|
||||
**页面目标**:提供传染病报卡的审核、管理、筛选及批量操作功能,帮助疾控人员高效完成报卡审核工作
|
||||
**适用场景**:疾控中心工作人员日常审核医疗机构上报的传染病病例
|
||||
|
||||
- 医院CDC管理员日常审核传染病报卡
|
||||
- 批量处理待审核/退回的报卡
|
||||
- 按条件筛选统计报卡数据
|
||||
**页面类型**:数据管理列表页(含详情抽屉)
|
||||
|
||||
**核心功能**:
|
||||
|
||||
1. 报卡数据概览统计(今日待审/本月失败/本月成功/本月上报)
|
||||
2. 多维度筛选报卡数据(时间/状态/科室/来源等)
|
||||
3. 报卡列表展示与批量操作(审核/退回/导出)
|
||||
4. 报卡详情查看与单条审核
|
||||
5. 审核记录追溯与意见填写
|
||||
|
||||
**用户价值**:
|
||||
|
||||
- 疾控人员可快速处理待审报卡
|
||||
- 支持批量审核提升工作效率
|
||||
- 完整记录审核过程便于追溯
|
||||
- 多维度筛选快速定位目标报卡
|
||||
**原型图地址**:https://static.pm-ai.cn/prototype/20260206/cc9991b716df0303fa3459042e33a1ea/index.html
|
||||
**流程图**:
|
||||
```mermaid
|
||||
flowchart TD
|
||||
A["进入报卡管理界面"] --> B["查看报卡概览统计"]
|
||||
B --> C["点击统计卡片"]
|
||||
C --> D["悬停统计卡片"]
|
||||
D --> E["自动设置筛选项"]
|
||||
B --> F["鼠标悬停"]
|
||||
F --> G["筛选报卡数据"]
|
||||
G --> H["卡片上浮+阴影"]
|
||||
E --> I["设置筛选条件"]
|
||||
I --> K["点击重置按钮"]
|
||||
K --> J["清空条件"]
|
||||
I --> L["点击查询按钮"]
|
||||
L --> M["触发筛选"]
|
||||
M --> N["操作报卡列表"]
|
||||
N --> O["勾选报卡"]
|
||||
N --> P["处理单条报卡"]
|
||||
O --> Q["批量操作报卡"]
|
||||
P --> R["点击单条审核"]
|
||||
P --> S["点击单条查看"]
|
||||
Q --> T["点击批量审核"]
|
||||
Q --> U["点击批量退回"]
|
||||
R --> V{"报卡状态"}
|
||||
S --> W{"报卡状态"}
|
||||
V -- 已审核 --> X["打开查看抽屉"]
|
||||
V -- 待审核/失败 --> Y["校验选择状态"]
|
||||
W -- 任意 --> X
|
||||
T --> Z["校验选择状态"]
|
||||
U --> AA["校验选择状态"]
|
||||
Y -- 选择有效 --> AB["打开审核抽屉"]
|
||||
AB-->AN["展示审核记录"]
|
||||
AB-->AO["展示审核记录"]
|
||||
Y -- 未选择 --> AC["提示请选择报卡"]
|
||||
Z -- 选择有效 --> AD{"包含已审核项"}
|
||||
Z -- 未选择 --> AE["提示请选择报卡"]
|
||||
AD -- 是 --> AF["提示只能选择待审核报卡"]
|
||||
AD -- 否 --> AG["弹出审核弹窗"]
|
||||
AA -- 选择有效 --> AH{"包含已审核项"}
|
||||
AA -- 未选择 --> AI["提示请选择报卡"]
|
||||
AH -- 是 --> AF
|
||||
AH -- 否 --> AJ["弹出退回弹窗"]
|
||||
AG --> AK["加载报卡详情"]
|
||||
AJ --> AL["加载报卡详情"]
|
||||
AK -- 加载失败 --> AM["提示数据加载失败"]
|
||||
AL -- 加载失败 --> AM
|
||||
AK -- 成功 --> AN["展示审核记录"]
|
||||
AL -- 成功 --> AO["展示审核记录"]
|
||||
AN --> AP["填写审核意见"]
|
||||
AO --> AQ["填写退回原因"]
|
||||
AP --> AR{"意见是否为空"}
|
||||
AQ --> AS{"原因是否为空"}
|
||||
AR -- 是 --> AT["红字提示必填"]
|
||||
AS -- 是 --> AU["红字提示必填"]
|
||||
AR -- 否 --> AV["点击确认审核"]
|
||||
AS -- 否 --> AW["点击确认退回"]
|
||||
AV --> AX["点击审核通过"]
|
||||
AW --> AY["点击退回修改"]
|
||||
AX --> AZ["更新报卡状态"]
|
||||
AY --> BA["更新报卡状态"]
|
||||
AZ --> BB["生成审核记录"]
|
||||
BA --> BC["生成审核记录"]
|
||||
BB --> BD["按钮置灰"]
|
||||
BC --> BD["按钮置灰"]
|
||||
AX --> BE["提示操作失败,请检查网络"]
|
||||
AY --> BE
|
||||
AZ --> BF["刷新表格数据"]
|
||||
BA --> BF
|
||||
BF --> BG["刷新行状态"]
|
||||
BG --> BH["结束"]
|
||||
BE --> BH
|
||||
```
|
||||
|
||||
|
||||
### 二、整体布局分析
|
||||
|
||||
**页面宽度**:自适应布局
|
||||
**主要区域划分**:
|
||||
|
||||
1. **顶部导航栏**(固定高度60px)
|
||||
2. **报卡管理概览区**(统计卡片+快捷操作,高度自适应)
|
||||
3. **筛选控制区**(多条件组合筛选,折叠式布局)
|
||||
4. **报卡列表区**(表格展示,占主体60%高度)
|
||||
**布局特点**:上下层级结构,筛选区支持折叠/展开
|
||||
5. **抽屉详情区**
|
||||
|
||||
|
||||
|
||||
### 三、页面区域详细描述
|
||||
|
||||
#### 1. 顶部导航栏
|
||||
|
||||
**区域位置**:页面顶部固定
|
||||
**区域尺寸**:高度60px,100%宽度
|
||||
**区域功能**:展示系统标识和用户信息
|
||||
**包含元素**:
|
||||
|
||||
- **系统Logo**
|
||||
|
||||
- - 元素类型:图标+文字组合
|
||||
- 显示内容:"CDC"图标+"报卡管理"文字
|
||||
- 样式特征:蓝色主色调(#4a6fa5),左侧对齐
|
||||
|
||||
#### 2. 报卡管理概览
|
||||
|
||||
**区域位置**:导航栏下方
|
||||
|
||||
**区域尺寸**:100%宽度,自适应高度
|
||||
**区域功能**:关键数据统计与快速操作入口
|
||||
**包含元素**:
|
||||
|
||||
- **统计卡片组**(4个)
|
||||
|
||||
- - 展示方式:网格布局(4列)
|
||||
- 数据字段:
|
||||
|
||||
| **字段名** | **类型** | **示例值** | **可操作** | **计算逻辑** |
|
||||
| ------------ | -------- | ---------- | ---------- | ------------------------- |
|
||||
| 今日待审核 | 数字 | 12 | 可点击 | 当天created_at+待审状态 |
|
||||
| 本月审核失败 | 数字 | 3 | 可点击 | 当月created_at+失败状态 |
|
||||
| 本月审核成功 | 数字 | 2 | 可点击 | 当月created_at+成功状态 |
|
||||
| 本月已上报 | 数字 | 156 | 可点击 | 当月created_at+已上报状态 |
|
||||
|
||||
o 交互行为:
|
||||
|
||||
- - - 悬停:卡片上浮5px+阴影加深
|
||||
- 点击:自动设置对应筛选项
|
||||
|
||||
- 样式特征:左侧状态色条(蓝/橙/红/绿)
|
||||
|
||||
#### 3. 筛选控制区
|
||||
|
||||
**区域功能**:多维度组合筛选报卡数据
|
||||
|
||||
**区域尺寸**:100%宽度,高度自适应(展开状态)
|
||||
**包含元素**:
|
||||
|
||||
- **筛选条件组**(横向排列→移动端垂直堆叠)
|
||||
|
||||
- - 登记来源(下拉单选):全部/门诊/住院/急诊/体检
|
||||
- 上报时间范围(双日期选择器)--默认值:最近一个月
|
||||
- 患者姓名(文本输入)
|
||||
- 审核状态(下拉单选):全部/待审核/审核通过/审核失败/已上报
|
||||
- 上报科室(树形下拉多选)--全部科室/取值于《科室管理》adm_organization表
|
||||
|
||||
- **操作按钮**:
|
||||
|
||||
- - “查询”(主按钮,触发筛选)
|
||||
- “重置”(次要按钮,清空条件)
|
||||
|
||||
#### 4. 报卡列表区
|
||||
|
||||
**区域功能**:展示报卡数据及操作入口
|
||||
**包含元素**:
|
||||
|
||||
- **表格头部**
|
||||
|
||||
- - 全选复选框(联动所有行选择状态)
|
||||
- 列标题:报卡名称/病种名称/患者信息等11列
|
||||
|
||||
- **快捷操作按钮组**
|
||||
|
||||
- - 包含按钮:
|
||||
|
||||
- - “批量审核”蓝色按钮,(需选择条目)点击弹出填写审核备注弹窗
|
||||
- “批量退回修改”橙色警示按钮,(需选择条目)点击弹出退回原因填写弹窗
|
||||
- “导出当前”(按筛选条件)
|
||||
|
||||
- **表格行**
|
||||
|
||||
- - 数据字段:
|
||||
|
||||
取值于传染病报卡表(infectious_card)
|
||||
|
||||
| **列名** | **数据类型** | **示例值** | **说明** |
|
||||
| -------- | ------------ | ---------------- | --------------- |
|
||||
| 选择框 | boolean | - | 带全选功能 |
|
||||
| 报卡名称 | string | 传染病报告卡 | - |
|
||||
| 病种名称 | string | 病毒性肝炎 | - |
|
||||
| 报卡编号 | string | HOSP202601150001 | 唯一标识 |
|
||||
| 患者姓名 | string | 张某某 | 脱敏显示 |
|
||||
| 性别 | enum | 男 | 男/女/未知 |
|
||||
| 年龄 | number | 32 | - |
|
||||
| 上报科室 | string | 儿科 | - |
|
||||
| 登记来源 | string | 门诊 | - |
|
||||
| 上报时间 | datetime | 2026-01-31 09:23 | - |
|
||||
| 状态 | badge | 待审核 | 待审核<->已提交 |
|
||||
| 操作 | button | 审核/查看 | 根据状态禁用 |
|
||||
|
||||
|
||||
|
||||
- - 行操作按钮:
|
||||
|
||||
- - “审核”(主按钮,打开可编辑抽屉)
|
||||
- “查看”(次要按钮,打开只读抽屉)
|
||||
|
||||
- 交互规则:
|
||||
|
||||
- - 已审核通过的报卡禁用"审核"按钮
|
||||
- 行hover时显示浅蓝色背景
|
||||
|
||||
- 分页功能:
|
||||
|
||||
- - 实现分页功能(可以设置每页5/10/20条)
|
||||
|
||||
#### 5. 抽屉详情区
|
||||
|
||||
**区域位置**:右侧滑出
|
||||
**区域尺寸**:自适应布局
|
||||
**包含元素**:
|
||||
|
||||
· **报卡表单(****根据具体报卡登记的界面内容,比如《中华人民共和国传染病报告卡》内容和功能与需求编号102界面保持一致,建议用同一个界面)**
|
||||
|
||||
- - 字段分组:
|
||||
|
||||
- 1. 患者基本信息(姓名、身份证等)
|
||||
2. 临床信息(发病日期、诊断分类等)
|
||||
3. 疾病选择(甲/乙/丙类传染病复选框)
|
||||
4. 上报信息(报告单位、医生等)
|
||||
|
||||
· **审核记录**
|
||||
|
||||
- - 展示方式:时间轴列表
|
||||
- 数据字段:时间、操作人、操作类型、意见
|
||||
|
||||
· **操作按钮组**
|
||||
|
||||
- - 主按钮:审核通过(绿色)
|
||||
- 次按钮:退回修改(橙色)
|
||||
|
||||
|
||||
|
||||
### 四、交互功能详细说明
|
||||
|
||||
#### 1. 批量审核流程
|
||||
|
||||
**触发条件**:勾选多行后点击"批量审核"
|
||||
**操作流程**:
|
||||
|
||||
1. 系统校验:至少选择1条非"已通过"状态的报卡
|
||||
|
||||
2. 弹出审核弹窗(500px居中模态框)
|
||||
|
||||
3. 填写审核意见(必填)
|
||||
|
||||
4. 点击"确认审核":
|
||||
|
||||
5. 批量更新状态为"审核通过",(自动批量写入每一条审核记录(插入infectious_audit 字段详表②、更改表infectious_card. Statu= 2和infectious_card. update_time= now()))
|
||||
|
||||
6. 刷新表格数据
|
||||
|
||||
7. - 成功:更新状态为"审核通过",添加审核记录
|
||||
- 失败:提示"审核失败,请检查网络"
|
||||
- 包含已审核项:提示"只能选择待审核报卡"
|
||||
- 未填写意见:阻止提交并红字提示
|
||||
|
||||
#### 2. 批量退回修改操作
|
||||
|
||||
**触发方式**:勾选多选框后点击"批量退回"
|
||||
**前置校验**:
|
||||
|
||||
- 至少勾选一条非"已审核"状态报卡
|
||||
- 选中已审核报卡时提示"只能操作待审核报卡"
|
||||
|
||||
**执行流程**:
|
||||
|
||||
1. 弹出模态框要求填写退回原因(必填)填写退回原因:阻止提交并红字提示
|
||||
2. 提交后批量更新选中报卡状态
|
||||
3. 每条生成审核记录(①、插入infectious_audit 字段详表②、更改表infectious_card. Statu=5和infectious_card. update_time= now())
|
||||
|
||||
#### 3.单卡审核流程
|
||||
|
||||
**触发方式**:点击操作列"审核"按钮
|
||||
**状态控制**:
|
||||
|
||||
- 待审核/审核失败:可操作
|
||||
- 审核通过:按钮禁用
|
||||
**执行流程**:
|
||||
|
||||
1. 右侧滑出审核抽屉
|
||||
2. 从行数据获取报卡ID自动填充患者报卡信息(异步加载报卡详情数据)
|
||||
3. 展示历史审核记录(如有)
|
||||
4. 填写审核意见/退回原因
|
||||
5. 点击"审核通过"或"退回修改"
|
||||
6. 更新表格行状态(生成审核记录(①、插入infectious_audit 字段详表②、更改表infectious_card. Statu=2/5和infectious_card. update_time= now()))
|
||||
|
||||
**异常处理**:
|
||||
|
||||
· 数据加载失败:提示"数据加载失败,请重试"
|
||||
|
||||
**·** 重复提交:按钮置灰防止重复点击
|
||||
|
||||
**状态变化**:
|
||||
|
||||
- 审核通过:表格行变绿色,按钮禁用,状态变成“审核通过”
|
||||
- 退回修改:表格行变橙色,生成退回记录,状态变成“审核失败”审核失败<->退回
|
||||
|
||||
**数据校验**:
|
||||
|
||||
- 必填字段红框提示
|
||||
- 身份证号格式校验
|
||||
- 日期逻辑校验(发病日期≤诊断日期)
|
||||
|
||||
#### 4. 筛选查询功能
|
||||
|
||||
**触发方式**:点击"查询"按钮
|
||||
**查询逻辑**:
|
||||
|
||||
- 登记来源:精确匹配
|
||||
- 患者姓名:模糊匹配
|
||||
- 时间范围:闭区间查询
|
||||
- 状态筛选:精确匹配
|
||||
- 上报科室:多选
|
||||
**性能优化**:
|
||||
- 500ms防抖处理
|
||||
- 分页加载(可以设置每页5/10/20条)实现分页功能
|
||||
|
||||
#### 5. 报卡详情查看
|
||||
|
||||
**触发条件**:点击行"查看"按钮
|
||||
**抽屉内容**:
|
||||
|
||||
- 只读表单(包含所有报卡字段)
|
||||
- 审核记录时间轴(倒序展示)
|
||||
- 关闭按钮(右上角×图标)
|
||||
**数据加载**:根据行数据获取报卡ID自动填充患者报卡信息(异步加载报卡详情数据)
|
||||
|
||||
#### 6. 筛选联动逻辑
|
||||
|
||||
| **操作** | **系统响应** |
|
||||
| ---------------------- | ------------------------------------------ |
|
||||
| 点击"今日待审核"统计卡 | 自动设置: - 时间=当天 - 状态=待审核 |
|
||||
| 本月审核失败 | 自动设置: - 时间=本月 - 状态=审核失败 |
|
||||
| 本月审核成功 | 自动设置: - 时间=本月 - 状态=审核成功 |
|
||||
| 本月已上报 | 自动设置: - 时间=本月 - 状态=已上报 |
|
||||
|
||||
|
||||
|
||||
### 五、数据结构说明
|
||||
|
||||
**关键数据表**:
|
||||
|
||||
```
|
||||
|
||||
infectious_card 与报卡审核记录表(infectious_audit)采用 一对多 关联:
|
||||
① 、一张报卡可经历多次审核(初审、复审、退回、重审等)。
|
||||
② 、关联键:infectious_card.card_no → infectious_audit.card_id(FK)。
|
||||
*infectious_card. Statu增加状态5退回=审核失败(当批量退回修改/退回修改时更改表infectious_card. Statu=5 and infectious_card. update_time= now())
|
||||
|
||||
*infectious_audit 字段详表
|
||||
```
|
||||
|
||||
| **字段名** | **中文名称** | **取值说明** | **类型****(PG)** | **约束** |
|
||||
| ----------------- | ------------ | ------------------------------------------------------------ | ---------------- | ---------------------------------------- |
|
||||
| audit_id | 审核记录ID | 主键,自增 | BIGINT | PRIMARY KEY |
|
||||
| card_id | 报卡ID | 关联infectious_card.card_no | BIGINT | NOT NULL, FK |
|
||||
| audit_seq | 审核序号 | 第几次审核,从1开始 | SMALLINT | NOT NULL, ≥1 |
|
||||
| audit_type | 审核类型 | 1批量审核/2单审核通过/3批量退回修改/4单退回修改 /5其他 | CHAR(1) | NOT NULL, IN('1','2','3','4','5') |
|
||||
| audit_status_from | 审核前状态 | 同infectious_card.status(0暂存/1已提交=待审核/2已审核=审核通过/3已上报/4失败/5退回=审核失败) | CHAR(1) | NOT NULL, IN('0','1','2','3','4','5') |
|
||||
| audit_status_to | 审核后状态 | 同上,审核后的新状态 | CHAR(1) | NOT NULL, IN('0','1','2','3','4') |
|
||||
| audit_time | 审核时间 | 精确到秒,当前时间戳 | TIMESTAMP | NOT NULL, DEFAULT now() |
|
||||
| auditor_id | 审核人账号 | 登录账号 | VARCHAR(20) | NOT NULL |
|
||||
| auditor_name | 审核人姓名 | 登录账号的姓名 | VARCHAR(50) | NOT NULL |
|
||||
| audit_opinion | 审核意见 | 审核意见简述 | TEXT | |
|
||||
| Reason_for_return | 退回原因 | 退回原因简述 | TEXT | |
|
||||
| fail_reason_code | 失败原因码 | 字典:001必填项/002逻辑错误/003网络超时等 | VARCHAR(20) | |
|
||||
| fail_reason_desc | 失败详情 | 详细描述,可空 | TEXT | |
|
||||
| is_batch | 是否批量 | 0单条审核/1批量审核 | BOOLEAN | NOT NULL, DEFAULT false |
|
||||
| batch_size | 批量数量 | 批量时涉及报卡数 | INTEGER | NOT NULL, DEFAULT 1, ≥1 |
|
||||
| created_time | 记录创建时间 | 自动生成 | TIMESTAMP | NOT NULL, DEFAULT now() |
|
||||
| updated_time | 记录更新时间 | 自动更新 | TIMESTAMP | NOT NULL, DEFAULT now(), ON UPDATE now() |
|
||||
|
||||
```
|
||||
|
||||
```
|
||||
|
||||
|
||||
|
||||
### 六、开发实现要点
|
||||
|
||||
**样式规范**:
|
||||
|
||||
- **主色调**:`#4a6fa5`(导航栏/主按钮)
|
||||
|
||||
- **状态色**:
|
||||
|
||||
- - 待审核:`rgba(74, 111, 165, 0.1)`
|
||||
- 审核失败:`rgba(231, 76, 60, 0.1)`
|
||||
|
||||
- **字体**:
|
||||
|
||||
- - 标题:`16px/1.5 #333`
|
||||
- 表格内容:`14px/1.5 #666`
|
||||
|
||||
**注意事项**:
|
||||
|
||||
- 审核记录需永久保存不可删除
|
||||
|
||||
|
||||
|
||||
### 七、补充说明
|
||||
|
||||
1. **日期格式**:统一使用`YYYY/MM/DD`(符合医疗系统惯例)
|
||||
2. **地址组件**:四级联动(省→市→区→街道)
|
||||
3. **职业选项**:使用国家标准职业分类
|
||||
## 报卡管理界面PRD文档
|
||||
|
||||
### 一、页面概述
|
||||
|
||||
**页面名称**:报卡管理界面
|
||||
**页面目标**:提供传染病报卡的审核、管理、筛选及批量操作功能,帮助疾控人员高效完成报卡审核工作
|
||||
**适用场景**:疾控中心工作人员日常审核医疗机构上报的传染病病例
|
||||
|
||||
- 医院CDC管理员日常审核传染病报卡
|
||||
- 批量处理待审核/退回的报卡
|
||||
- 按条件筛选统计报卡数据
|
||||
**页面类型**:数据管理列表页(含详情抽屉)
|
||||
|
||||
**核心功能**:
|
||||
|
||||
1. 报卡数据概览统计(今日待审/本月失败/本月成功/本月上报)
|
||||
2. 多维度筛选报卡数据(时间/状态/科室/来源等)
|
||||
3. 报卡列表展示与批量操作(审核/退回/导出)
|
||||
4. 报卡详情查看与单条审核
|
||||
5. 审核记录追溯与意见填写
|
||||
|
||||
**用户价值**:
|
||||
|
||||
- 疾控人员可快速处理待审报卡
|
||||
- 支持批量审核提升工作效率
|
||||
- 完整记录审核过程便于追溯
|
||||
- 多维度筛选快速定位目标报卡
|
||||
**原型图地址**:https://static.pm-ai.cn/prototype/20260206/cc9991b716df0303fa3459042e33a1ea/index.html
|
||||
**流程图**:
|
||||
```mermaid
|
||||
flowchart TD
|
||||
A["进入报卡管理界面"] --> B["查看报卡概览统计"]
|
||||
B --> C["点击统计卡片"]
|
||||
C --> D["悬停统计卡片"]
|
||||
D --> E["自动设置筛选项"]
|
||||
B --> F["鼠标悬停"]
|
||||
F --> G["筛选报卡数据"]
|
||||
G --> H["卡片上浮+阴影"]
|
||||
E --> I["设置筛选条件"]
|
||||
I --> K["点击重置按钮"]
|
||||
K --> J["清空条件"]
|
||||
I --> L["点击查询按钮"]
|
||||
L --> M["触发筛选"]
|
||||
M --> N["操作报卡列表"]
|
||||
N --> O["勾选报卡"]
|
||||
N --> P["处理单条报卡"]
|
||||
O --> Q["批量操作报卡"]
|
||||
P --> R["点击单条审核"]
|
||||
P --> S["点击单条查看"]
|
||||
Q --> T["点击批量审核"]
|
||||
Q --> U["点击批量退回"]
|
||||
R --> V{"报卡状态"}
|
||||
S --> W{"报卡状态"}
|
||||
V -- 已审核 --> X["打开查看抽屉"]
|
||||
V -- 待审核/失败 --> Y["校验选择状态"]
|
||||
W -- 任意 --> X
|
||||
T --> Z["校验选择状态"]
|
||||
U --> AA["校验选择状态"]
|
||||
Y -- 选择有效 --> AB["打开审核抽屉"]
|
||||
AB-->AN["展示审核记录"]
|
||||
AB-->AO["展示审核记录"]
|
||||
Y -- 未选择 --> AC["提示请选择报卡"]
|
||||
Z -- 选择有效 --> AD{"包含已审核项"}
|
||||
Z -- 未选择 --> AE["提示请选择报卡"]
|
||||
AD -- 是 --> AF["提示只能选择待审核报卡"]
|
||||
AD -- 否 --> AG["弹出审核弹窗"]
|
||||
AA -- 选择有效 --> AH{"包含已审核项"}
|
||||
AA -- 未选择 --> AI["提示请选择报卡"]
|
||||
AH -- 是 --> AF
|
||||
AH -- 否 --> AJ["弹出退回弹窗"]
|
||||
AG --> AK["加载报卡详情"]
|
||||
AJ --> AL["加载报卡详情"]
|
||||
AK -- 加载失败 --> AM["提示数据加载失败"]
|
||||
AL -- 加载失败 --> AM
|
||||
AK -- 成功 --> AN["展示审核记录"]
|
||||
AL -- 成功 --> AO["展示审核记录"]
|
||||
AN --> AP["填写审核意见"]
|
||||
AO --> AQ["填写退回原因"]
|
||||
AP --> AR{"意见是否为空"}
|
||||
AQ --> AS{"原因是否为空"}
|
||||
AR -- 是 --> AT["红字提示必填"]
|
||||
AS -- 是 --> AU["红字提示必填"]
|
||||
AR -- 否 --> AV["点击确认审核"]
|
||||
AS -- 否 --> AW["点击确认退回"]
|
||||
AV --> AX["点击审核通过"]
|
||||
AW --> AY["点击退回修改"]
|
||||
AX --> AZ["更新报卡状态"]
|
||||
AY --> BA["更新报卡状态"]
|
||||
AZ --> BB["生成审核记录"]
|
||||
BA --> BC["生成审核记录"]
|
||||
BB --> BD["按钮置灰"]
|
||||
BC --> BD["按钮置灰"]
|
||||
AX --> BE["提示操作失败,请检查网络"]
|
||||
AY --> BE
|
||||
AZ --> BF["刷新表格数据"]
|
||||
BA --> BF
|
||||
BF --> BG["刷新行状态"]
|
||||
BG --> BH["结束"]
|
||||
BE --> BH
|
||||
```
|
||||
|
||||
|
||||
### 二、整体布局分析
|
||||
|
||||
**页面宽度**:自适应布局
|
||||
**主要区域划分**:
|
||||
|
||||
1. **顶部导航栏**(固定高度60px)
|
||||
2. **报卡管理概览区**(统计卡片+快捷操作,高度自适应)
|
||||
3. **筛选控制区**(多条件组合筛选,折叠式布局)
|
||||
4. **报卡列表区**(表格展示,占主体60%高度)
|
||||
**布局特点**:上下层级结构,筛选区支持折叠/展开
|
||||
5. **抽屉详情区**
|
||||
|
||||
|
||||
|
||||
### 三、页面区域详细描述
|
||||
|
||||
#### 1. 顶部导航栏
|
||||
|
||||
**区域位置**:页面顶部固定
|
||||
**区域尺寸**:高度60px,100%宽度
|
||||
**区域功能**:展示系统标识和用户信息
|
||||
**包含元素**:
|
||||
|
||||
- **系统Logo**
|
||||
|
||||
- - 元素类型:图标+文字组合
|
||||
- 显示内容:"CDC"图标+"报卡管理"文字
|
||||
- 样式特征:蓝色主色调(#4a6fa5),左侧对齐
|
||||
|
||||
#### 2. 报卡管理概览
|
||||
|
||||
**区域位置**:导航栏下方
|
||||
|
||||
**区域尺寸**:100%宽度,自适应高度
|
||||
**区域功能**:关键数据统计与快速操作入口
|
||||
**包含元素**:
|
||||
|
||||
- **统计卡片组**(4个)
|
||||
|
||||
- - 展示方式:网格布局(4列)
|
||||
- 数据字段:
|
||||
|
||||
| **字段名** | **类型** | **示例值** | **可操作** | **计算逻辑** |
|
||||
| ------------ | -------- | ---------- | ---------- | ------------------------- |
|
||||
| 今日待审核 | 数字 | 12 | 可点击 | 当天created_at+待审状态 |
|
||||
| 本月审核失败 | 数字 | 3 | 可点击 | 当月created_at+失败状态 |
|
||||
| 本月审核成功 | 数字 | 2 | 可点击 | 当月created_at+成功状态 |
|
||||
| 本月已上报 | 数字 | 156 | 可点击 | 当月created_at+已上报状态 |
|
||||
|
||||
o 交互行为:
|
||||
|
||||
- - - 悬停:卡片上浮5px+阴影加深
|
||||
- 点击:自动设置对应筛选项
|
||||
|
||||
- 样式特征:左侧状态色条(蓝/橙/红/绿)
|
||||
|
||||
#### 3. 筛选控制区
|
||||
|
||||
**区域功能**:多维度组合筛选报卡数据
|
||||
|
||||
**区域尺寸**:100%宽度,高度自适应(展开状态)
|
||||
**包含元素**:
|
||||
|
||||
- **筛选条件组**(横向排列→移动端垂直堆叠)
|
||||
|
||||
- - 登记来源(下拉单选):全部/门诊/住院/急诊/体检
|
||||
- 上报时间范围(双日期选择器)--默认值:最近一个月
|
||||
- 患者姓名(文本输入)
|
||||
- 审核状态(下拉单选):全部/待审核/审核通过/审核失败/已上报
|
||||
- 上报科室(树形下拉多选)--全部科室/取值于《科室管理》adm_organization表
|
||||
|
||||
- **操作按钮**:
|
||||
|
||||
- - “查询”(主按钮,触发筛选)
|
||||
- “重置”(次要按钮,清空条件)
|
||||
|
||||
#### 4. 报卡列表区
|
||||
|
||||
**区域功能**:展示报卡数据及操作入口
|
||||
**包含元素**:
|
||||
|
||||
- **表格头部**
|
||||
|
||||
- - 全选复选框(联动所有行选择状态)
|
||||
- 列标题:报卡名称/病种名称/患者信息等11列
|
||||
|
||||
- **快捷操作按钮组**
|
||||
|
||||
- - 包含按钮:
|
||||
|
||||
- - “批量审核”蓝色按钮,(需选择条目)点击弹出填写审核备注弹窗
|
||||
- “批量退回修改”橙色警示按钮,(需选择条目)点击弹出退回原因填写弹窗
|
||||
- “导出当前”(按筛选条件)
|
||||
|
||||
- **表格行**
|
||||
|
||||
- - 数据字段:
|
||||
|
||||
取值于传染病报卡表(infectious_card)
|
||||
|
||||
| **列名** | **数据类型** | **示例值** | **说明** |
|
||||
| -------- | ------------ | ---------------- | --------------- |
|
||||
| 选择框 | boolean | - | 带全选功能 |
|
||||
| 报卡名称 | string | 传染病报告卡 | - |
|
||||
| 病种名称 | string | 病毒性肝炎 | - |
|
||||
| 报卡编号 | string | HOSP202601150001 | 唯一标识 |
|
||||
| 患者姓名 | string | 张某某 | 脱敏显示 |
|
||||
| 性别 | enum | 男 | 男/女/未知 |
|
||||
| 年龄 | number | 32 | - |
|
||||
| 上报科室 | string | 儿科 | - |
|
||||
| 登记来源 | string | 门诊 | - |
|
||||
| 上报时间 | datetime | 2026-01-31 09:23 | - |
|
||||
| 状态 | badge | 待审核 | 待审核<->已提交 |
|
||||
| 操作 | button | 审核/查看 | 根据状态禁用 |
|
||||
|
||||
|
||||
|
||||
- - 行操作按钮:
|
||||
|
||||
- - “审核”(主按钮,打开可编辑抽屉)
|
||||
- “查看”(次要按钮,打开只读抽屉)
|
||||
|
||||
- 交互规则:
|
||||
|
||||
- - 已审核通过的报卡禁用"审核"按钮
|
||||
- 行hover时显示浅蓝色背景
|
||||
|
||||
- 分页功能:
|
||||
|
||||
- - 实现分页功能(可以设置每页5/10/20条)
|
||||
|
||||
#### 5. 抽屉详情区
|
||||
|
||||
**区域位置**:右侧滑出
|
||||
**区域尺寸**:自适应布局
|
||||
**包含元素**:
|
||||
|
||||
· **报卡表单(****根据具体报卡登记的界面内容,比如《中华人民共和国传染病报告卡》内容和功能与需求编号102界面保持一致,建议用同一个界面)**
|
||||
|
||||
- - 字段分组:
|
||||
|
||||
- 1. 患者基本信息(姓名、身份证等)
|
||||
2. 临床信息(发病日期、诊断分类等)
|
||||
3. 疾病选择(甲/乙/丙类传染病复选框)
|
||||
4. 上报信息(报告单位、医生等)
|
||||
|
||||
· **审核记录**
|
||||
|
||||
- - 展示方式:时间轴列表
|
||||
- 数据字段:时间、操作人、操作类型、意见
|
||||
|
||||
· **操作按钮组**
|
||||
|
||||
- - 主按钮:审核通过(绿色)
|
||||
- 次按钮:退回修改(橙色)
|
||||
|
||||
|
||||
|
||||
### 四、交互功能详细说明
|
||||
|
||||
#### 1. 批量审核流程
|
||||
|
||||
**触发条件**:勾选多行后点击"批量审核"
|
||||
**操作流程**:
|
||||
|
||||
1. 系统校验:至少选择1条非"已通过"状态的报卡
|
||||
|
||||
2. 弹出审核弹窗(500px居中模态框)
|
||||
|
||||
3. 填写审核意见(必填)
|
||||
|
||||
4. 点击"确认审核":
|
||||
|
||||
5. 批量更新状态为"审核通过",(自动批量写入每一条审核记录(插入infectious_audit 字段详表②、更改表infectious_card. Statu= 2和infectious_card. update_time= now()))
|
||||
|
||||
6. 刷新表格数据
|
||||
|
||||
7. - 成功:更新状态为"审核通过",添加审核记录
|
||||
- 失败:提示"审核失败,请检查网络"
|
||||
- 包含已审核项:提示"只能选择待审核报卡"
|
||||
- 未填写意见:阻止提交并红字提示
|
||||
|
||||
#### 2. 批量退回修改操作
|
||||
|
||||
**触发方式**:勾选多选框后点击"批量退回"
|
||||
**前置校验**:
|
||||
|
||||
- 至少勾选一条非"已审核"状态报卡
|
||||
- 选中已审核报卡时提示"只能操作待审核报卡"
|
||||
|
||||
**执行流程**:
|
||||
|
||||
1. 弹出模态框要求填写退回原因(必填)填写退回原因:阻止提交并红字提示
|
||||
2. 提交后批量更新选中报卡状态
|
||||
3. 每条生成审核记录(①、插入infectious_audit 字段详表②、更改表infectious_card. Statu=5和infectious_card. update_time= now())
|
||||
|
||||
#### 3.单卡审核流程
|
||||
|
||||
**触发方式**:点击操作列"审核"按钮
|
||||
**状态控制**:
|
||||
|
||||
- 待审核/审核失败:可操作
|
||||
- 审核通过:按钮禁用
|
||||
**执行流程**:
|
||||
|
||||
1. 右侧滑出审核抽屉
|
||||
2. 从行数据获取报卡ID自动填充患者报卡信息(异步加载报卡详情数据)
|
||||
3. 展示历史审核记录(如有)
|
||||
4. 填写审核意见/退回原因
|
||||
5. 点击"审核通过"或"退回修改"
|
||||
6. 更新表格行状态(生成审核记录(①、插入infectious_audit 字段详表②、更改表infectious_card. Statu=2/5和infectious_card. update_time= now()))
|
||||
|
||||
**异常处理**:
|
||||
|
||||
· 数据加载失败:提示"数据加载失败,请重试"
|
||||
|
||||
**·** 重复提交:按钮置灰防止重复点击
|
||||
|
||||
**状态变化**:
|
||||
|
||||
- 审核通过:表格行变绿色,按钮禁用,状态变成“审核通过”
|
||||
- 退回修改:表格行变橙色,生成退回记录,状态变成“审核失败”审核失败<->退回
|
||||
|
||||
**数据校验**:
|
||||
|
||||
- 必填字段红框提示
|
||||
- 身份证号格式校验
|
||||
- 日期逻辑校验(发病日期≤诊断日期)
|
||||
|
||||
#### 4. 筛选查询功能
|
||||
|
||||
**触发方式**:点击"查询"按钮
|
||||
**查询逻辑**:
|
||||
|
||||
- 登记来源:精确匹配
|
||||
- 患者姓名:模糊匹配
|
||||
- 时间范围:闭区间查询
|
||||
- 状态筛选:精确匹配
|
||||
- 上报科室:多选
|
||||
**性能优化**:
|
||||
- 500ms防抖处理
|
||||
- 分页加载(可以设置每页5/10/20条)实现分页功能
|
||||
|
||||
#### 5. 报卡详情查看
|
||||
|
||||
**触发条件**:点击行"查看"按钮
|
||||
**抽屉内容**:
|
||||
|
||||
- 只读表单(包含所有报卡字段)
|
||||
- 审核记录时间轴(倒序展示)
|
||||
- 关闭按钮(右上角×图标)
|
||||
**数据加载**:根据行数据获取报卡ID自动填充患者报卡信息(异步加载报卡详情数据)
|
||||
|
||||
#### 6. 筛选联动逻辑
|
||||
|
||||
| **操作** | **系统响应** |
|
||||
| ---------------------- | ------------------------------------------ |
|
||||
| 点击"今日待审核"统计卡 | 自动设置: - 时间=当天 - 状态=待审核 |
|
||||
| 本月审核失败 | 自动设置: - 时间=本月 - 状态=审核失败 |
|
||||
| 本月审核成功 | 自动设置: - 时间=本月 - 状态=审核成功 |
|
||||
| 本月已上报 | 自动设置: - 时间=本月 - 状态=已上报 |
|
||||
|
||||
|
||||
|
||||
### 五、数据结构说明
|
||||
|
||||
**关键数据表**:
|
||||
|
||||
```
|
||||
|
||||
infectious_card 与报卡审核记录表(infectious_audit)采用 一对多 关联:
|
||||
① 、一张报卡可经历多次审核(初审、复审、退回、重审等)。
|
||||
② 、关联键:infectious_card.card_no → infectious_audit.card_id(FK)。
|
||||
*infectious_card. Statu增加状态5退回=审核失败(当批量退回修改/退回修改时更改表infectious_card. Statu=5 and infectious_card. update_time= now())
|
||||
|
||||
*infectious_audit 字段详表
|
||||
```
|
||||
|
||||
| **字段名** | **中文名称** | **取值说明** | **类型****(PG)** | **约束** |
|
||||
| ----------------- | ------------ | ------------------------------------------------------------ | ---------------- | ---------------------------------------- |
|
||||
| audit_id | 审核记录ID | 主键,自增 | BIGINT | PRIMARY KEY |
|
||||
| card_id | 报卡ID | 关联infectious_card.card_no | BIGINT | NOT NULL, FK |
|
||||
| audit_seq | 审核序号 | 第几次审核,从1开始 | SMALLINT | NOT NULL, ≥1 |
|
||||
| audit_type | 审核类型 | 1批量审核/2单审核通过/3批量退回修改/4单退回修改 /5其他 | CHAR(1) | NOT NULL, IN('1','2','3','4','5') |
|
||||
| audit_status_from | 审核前状态 | 同infectious_card.status(0暂存/1已提交=待审核/2已审核=审核通过/3已上报/4失败/5退回=审核失败) | CHAR(1) | NOT NULL, IN('0','1','2','3','4','5') |
|
||||
| audit_status_to | 审核后状态 | 同上,审核后的新状态 | CHAR(1) | NOT NULL, IN('0','1','2','3','4') |
|
||||
| audit_time | 审核时间 | 精确到秒,当前时间戳 | TIMESTAMP | NOT NULL, DEFAULT now() |
|
||||
| auditor_id | 审核人账号 | 登录账号 | VARCHAR(20) | NOT NULL |
|
||||
| auditor_name | 审核人姓名 | 登录账号的姓名 | VARCHAR(50) | NOT NULL |
|
||||
| audit_opinion | 审核意见 | 审核意见简述 | TEXT | |
|
||||
| Reason_for_return | 退回原因 | 退回原因简述 | TEXT | |
|
||||
| fail_reason_code | 失败原因码 | 字典:001必填项/002逻辑错误/003网络超时等 | VARCHAR(20) | |
|
||||
| fail_reason_desc | 失败详情 | 详细描述,可空 | TEXT | |
|
||||
| is_batch | 是否批量 | 0单条审核/1批量审核 | BOOLEAN | NOT NULL, DEFAULT false |
|
||||
| batch_size | 批量数量 | 批量时涉及报卡数 | INTEGER | NOT NULL, DEFAULT 1, ≥1 |
|
||||
| created_time | 记录创建时间 | 自动生成 | TIMESTAMP | NOT NULL, DEFAULT now() |
|
||||
| updated_time | 记录更新时间 | 自动更新 | TIMESTAMP | NOT NULL, DEFAULT now(), ON UPDATE now() |
|
||||
|
||||
```
|
||||
|
||||
```
|
||||
|
||||
|
||||
|
||||
### 六、开发实现要点
|
||||
|
||||
**样式规范**:
|
||||
|
||||
- **主色调**:`#4a6fa5`(导航栏/主按钮)
|
||||
|
||||
- **状态色**:
|
||||
|
||||
- - 待审核:`rgba(74, 111, 165, 0.1)`
|
||||
- 审核失败:`rgba(231, 76, 60, 0.1)`
|
||||
|
||||
- **字体**:
|
||||
|
||||
- - 标题:`16px/1.5 #333`
|
||||
- 表格内容:`14px/1.5 #666`
|
||||
|
||||
**注意事项**:
|
||||
|
||||
- 审核记录需永久保存不可删除
|
||||
|
||||
|
||||
|
||||
### 七、补充说明
|
||||
|
||||
1. **日期格式**:统一使用`YYYY/MM/DD`(符合医疗系统惯例)
|
||||
2. **地址组件**:四级联动(省→市→区→街道)
|
||||
3. **职业选项**:使用国家标准职业分类
|
||||
4. **病种名称**:严格遵循《传染病报告卡》规范用词
|
||||
@@ -1,387 +1,387 @@
|
||||
## 门诊医生站开立会诊申请单界面PRD文档
|
||||
|
||||
### 一、页面概述
|
||||
|
||||
**页面名称**:门诊医生站开立会诊申请单界面**页面目标**:帮助门诊医生完成会诊申请单的创建、编辑、提交和作废操作,实现多科室会诊流程的电子化管理**适用场景**:
|
||||
|
||||
1. 门诊医生需要邀请其他科室专家进行会诊时
|
||||
2. 会诊申请单需要修改或补充信息时
|
||||
3. 会诊流程需要跟踪管理时
|
||||
**页面类型**:表单页+列表页复合型界面
|
||||
|
||||
**核心功能**:
|
||||
|
||||
1. 会诊申请单的新增、保存、提交、作废功能
|
||||
2. 会诊科室/专家可视化选择
|
||||
3. 申请单数据表格展示与交互
|
||||
4. 表单数据自动填充与校验
|
||||
5. 申请单打印输出
|
||||
|
||||
**用户价值**:
|
||||
|
||||
- 规范会诊申请流程,减少纸质单据使用
|
||||
- 通过智能填充减少医生重复录入
|
||||
- 实时查看会诊申请状态(新开/已提交/已确认/已签名/已完成/已取消)
|
||||
|
||||
原型图地址:https://static.pm-ai.cn/prototype/20260115/4eb1bd5367f9d5610b32c0ecc6c793f5/index.html
|
||||
|
||||
流程图:
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
%% ---------- 开始 ----------
|
||||
START(["开始"]) --> A["医生进入会诊申请单界面"]
|
||||
|
||||
%% ---------- 操作选择 ----------
|
||||
A --> B{"操作选择"}
|
||||
B -->|"打印"| C["选择已有申请单"]
|
||||
B -->|"提交/取消提交"| D{"校验状态为“已提交”?"}
|
||||
B -->|"删除"| E["弹出确认对话框"]
|
||||
B -->|"结束"| F{"校验状态为“已提交”?"}
|
||||
B -->|"编辑"| G["修改表单内容"]
|
||||
B -->|"新增"| H["清空表单(保留患者信息)"]
|
||||
|
||||
%% ---------- 打印分支 ----------
|
||||
C --> I["高亮选中行"]
|
||||
I --> J["生成打印视图"]
|
||||
J --> K["输出打印样式"]
|
||||
K --> L(["取消"])
|
||||
|
||||
%% ---------- 提交/取消提交分支 ----------
|
||||
D -->|"不通过"| M["提示“请完善必填信息”"]
|
||||
D -->|"通过"| N["更新状态为“已提交/新开”"]
|
||||
|
||||
%% ---------- 删除分支 ----------
|
||||
E --> O{"确认?"}
|
||||
O -->|"是"| P["标记状态为“已取消”"]
|
||||
O -->|"否"| L
|
||||
|
||||
%% ---------- 结束分支 ----------
|
||||
F -->|"不通过"| Q["提示“请先提交申请”"]
|
||||
F -->|"通过"| R["标记状态为“已完成”"]
|
||||
|
||||
%% ---------- 编辑分支 ----------
|
||||
G --> S{"校验必填字段"}
|
||||
S -->|"不通过"| M
|
||||
S -->|"通过"| T["保存到表格"]
|
||||
|
||||
%% ---------- 新增/保存通用路径 ----------
|
||||
H --> U["填写表单"]
|
||||
U --> V["选择会诊科室/专家"]
|
||||
V --> W["自动填充邀请对象"]
|
||||
W --> X["填写病史及目的"]
|
||||
X --> Y["点击保存"]
|
||||
Y --> Z{"校验必填字段"}
|
||||
Z -->|"不通过"| M
|
||||
Z -->|"通过"| AA["生成会诊申请记录"]
|
||||
AA --> AB["保存到表格"]
|
||||
AB --> AC["新增/更新记录"]
|
||||
|
||||
%% ---------- 循环 ----------
|
||||
AC --> A
|
||||
N --> A
|
||||
P --> A
|
||||
R --> A
|
||||
T --> A
|
||||
M --> A
|
||||
Q --> A
|
||||
L --> A
|
||||
```
|
||||
|
||||
### 二、整体布局分析
|
||||
|
||||
**页面宽度**:自适应宽度(主内容区采用7:3比例分割)
|
||||
**主要区域划分**:
|
||||
|
||||
1. 顶部操作栏(48px固定高度)
|
||||
2. 会诊申请单列表区(高度自适应)
|
||||
3. 主内容区(分左右结构,7:3比例)
|
||||
|
||||
- 左侧:会诊申请单表单区
|
||||
- 右侧:会诊科室/专家选择区
|
||||
**布局特点**:响应式上下+左右混合布局,主要对齐方式为左对齐
|
||||
|
||||
### 三、页面区域详细描述
|
||||
|
||||
#### 1. 顶部操作栏区域
|
||||
|
||||
**区域位置**:页面顶部固定位置**区域尺寸**:高度48px,宽度100%**区域功能**:提供全局操作功能入口**包含元素**:
|
||||
|
||||
- **打印按钮**
|
||||
- 元素类型:操作按钮
|
||||
- 显示内容:“打印”
|
||||
- 交互行为:点击后生成A4打印视图,自动适配医院抬头格式
|
||||
- 样式特征:绿色背景(\#13C2C2),圆角4px,32px高度
|
||||
- **新增按钮**
|
||||
- 元素类型:操作按钮
|
||||
- 显示内容:“新增”
|
||||
- 交互行为:点击清空表单(保留当前患者基本信息)
|
||||
- 样式特征:蓝色背景(\#1890FF)
|
||||
- **结束按钮**
|
||||
- 元素类型:危险操作按钮
|
||||
- 显示内容:“结束”
|
||||
- 交互行为:点击结束已提交的会诊流程,标记申请单状态为"已结束",禁用后续操作
|
||||
- 样式特征:红色背景(\#FF4D4F)
|
||||
- 限制条件:需先选中已提交的会诊单
|
||||
- **保存按钮**
|
||||
- 元素类型:主要操作按钮
|
||||
- 显示内容:“保存”
|
||||
- 交互行为:点击保存当前表单数据,校验必填字段后保存至表格,自动生成时间戳
|
||||
- 样式特征:绿色背景(\#52C41A)
|
||||
|
||||
#### 2. 会诊申请单列表区
|
||||
|
||||
**区域位置**:顶部操作栏下方**区域尺寸**:高度自适应,宽度100%**区域功能**:展示当前医生的会诊申请记录**包含元素**:
|
||||
|
||||
- **申请单表格**
|
||||
- 展示方式:带边框表格
|
||||
- 数据字段:
|
||||
|
||||
- 序号:文本 - 自增序号 - 不可操作
|
||||
- 急:布尔 - ✓表示紧急 - 不可操作
|
||||
- 申请单号:文本 - CS20260105001 - 不可操作
|
||||
- 会诊时间:日期 - 2026-01-05 15:08 - 不可操作
|
||||
- 邀请对象:文本 - 吴院长 - 不可操作
|
||||
- 申请科室:文本 - 内科 - 不可操作
|
||||
- 申请医师:文本 - 张医生 - 不可操作
|
||||
- 申请时间:日期 - 2026-01-05 15:08 - 不可操作
|
||||
- 提交状态:布尔 - 复选框 - 仅查看
|
||||
- 结束状态:布尔 - 复选框 - 仅查看
|
||||
- 操作功能:
|
||||
|
||||
- - o 提交/取消提交按钮
|
||||
|
||||
```
|
||||
样式要求:蓝色小按钮,禁用状态显示灰色
|
||||
```
|
||||
|
||||
|
||||
```
|
||||
交互行为:切换提交状态,需二次确认
|
||||
```
|
||||
|
||||
|
||||
```
|
||||
o 删除图标
|
||||
```
|
||||
|
||||
|
||||
```
|
||||
样式要求:红色垃圾桶图标,hover时放大10%
|
||||
```
|
||||
|
||||
|
||||
```
|
||||
交互行为:弹出确认对话框后作废该记录
|
||||
```
|
||||
|
||||
|
||||
[删除]**将状态改为“已取消”****
|
||||
|
||||
UPDATE ConsultationRequest
|
||||
SET ConsultationStatus = 50,cancelnatureDate = <作废会诊时间>
|
||||
WHERE ConsultationID = <会诊申请单ID> and ConsultationStatus <> 40 ;
|
||||
|
||||
- 交互特性:
|
||||
- 行点击选中效果(蓝色高亮+左侧边框)
|
||||
- 行hover浅灰色背景
|
||||
- 提交按钮状态联动(切换提交状态,需二次确认)
|
||||
|
||||
#### 3. 会诊申请单表单区
|
||||
|
||||
**区域位置**:主内容区左侧**区域尺寸**:占主内容区70%宽度**区域功能**:会诊申请单的详细表单填写**包含元素**:
|
||||
|
||||
- **基础信息区**
|
||||
- 申请单号:只读文本,【保存】时自动生成规则CS+年月日时分秒+4位随机数
|
||||
- 申请时间:只读文本,自动获取系统当前时间
|
||||
- 病人信息:病人姓名/性别/年龄/就诊卡号/申请医师/申请科室(不可编辑),自动获取当前患者档案信息。
|
||||
- **会诊信息区**
|
||||
- 会诊时间:时间控件可编辑
|
||||
- 紧急标识:复选框控件
|
||||
- 申请医师:默认当前登录医生
|
||||
- 申请科室:默认当前医生登录的开单科室
|
||||
- 门诊诊断:自动获取医生开立的门诊诊断(主诊断)
|
||||
- **病史及目的**
|
||||
- 多行文本域,最小高度100px
|
||||
- **会诊邀请**
|
||||
- 会诊邀请对象:支持多选(逗号分隔)-》(可从右侧会诊邀请对象选择)
|
||||
- **会诊记录区**
|
||||
- 会诊意见:只读文本域
|
||||
- 会诊确认参加医师:只读字段
|
||||
- 所属医生、代表科室、签名医生、签名时间:只读字段
|
||||
|
||||
#### 4. 会诊邀请对象选择区(侧边栏)
|
||||
|
||||
**区域位置**:主内容区右侧**区域尺寸**:占主内容区30%宽度**区域功能**:快速选择会诊科室和专家**包含元素**:
|
||||
|
||||
- **会诊科室列表**
|
||||
- 展示方式:带边框可滚动列表
|
||||
- 交互行为:选择科室后动态加载对应专家
|
||||
- **会诊专家列表**
|
||||
- 展示方式:带边框可滚动列表
|
||||
- 交互行为:点击专家自动填入会诊邀请对象字段(防重复:已选专家提示"请勿重复选择")
|
||||
- 特殊逻辑:支持多选(自动用逗号分隔)
|
||||
|
||||
### 四、交互功能详细说明
|
||||
|
||||
#### 1. 会诊申请单提交流程
|
||||
|
||||
**功能描述**:完成会诊申请单的提交操作**触发条件**:点击表格行的"提交"按钮**操作流程**:
|
||||
|
||||
1. 医生点击行内"提交"按钮
|
||||
2. 系统校验必填字段(会诊时间、邀请对象)
|
||||
3. 提交状态复选框变为已勾选
|
||||
4. 按钮文字变为"取消提交"
|
||||
5. 禁用该行编辑功能
|
||||
|
||||
【提交】**将状态从“新开”改为“已提交”**
|
||||
|
||||
UPDATE ConsultationRequest
|
||||
SET ConsultationStatus = 10,ConfirmingPhysician = <提交会诊医生姓名> ,ConfirmingPhysicianID = <提交会诊医生ID> ,ConfirmingDate = <提交会诊时间>
|
||||
WHERE ConsultationID = <会诊申请单ID> and ConsultationStatus = 0 ;
|
||||
|
||||
【取消提交】**将状态从“已提交”改为“新开”**
|
||||
|
||||
UPDATE ConsultationRequest
|
||||
SET ConsultationStatus = 0,ConfirmingPhysician = '',ConfirmingPhysicianID = '',ConfirmingDate = ''
|
||||
WHERE ConsultationID = <会诊申请单ID> and ConsultationStatus = 10 ;
|
||||
|
||||
**异常处理**:
|
||||
|
||||
- 必填字段缺失:弹出"请完善会诊时间和邀请对象信息"
|
||||
- 重复提交:提示"该申请已提交,请勿重复操作"
|
||||
|
||||
#### 2. 会诊流程结束功能
|
||||
|
||||
**功能描述**:标记会诊流程已结束**触发条件**:选中已提交的申请单后点击顶部"结束"按钮**操作流程**:
|
||||
|
||||
1. 医生选中已提交的申请单(行高亮)
|
||||
2. 点击顶部"结束"按钮
|
||||
3. 系统校验提交状态为已提交
|
||||
4. 结束状态复选框变为已勾选
|
||||
5. 禁用该行的取消提交功能
|
||||
|
||||
【结束】**将状态从“已签名”改为“已完成”**
|
||||
|
||||
UPDATE ConsultationRequest
|
||||
SET ConsultationStatus = 40,Signature = <结束会诊医生姓名> ,SignatureDate=<结束会诊时间>
|
||||
WHERE ConsultationID = <会诊申请单ID> and ConsultationStatus = 30 ;
|
||||
|
||||
**异常处理**:
|
||||
|
||||
- 未选中记录:提示"请先选择要结束的会诊申请"
|
||||
- 未提交记录:提示"请先提交该会诊申请"
|
||||
|
||||
#### 3. 申请单保存功能
|
||||
|
||||
**功能描述**:保存会诊申请单数据**触发条件**:点击顶部"保存"按钮**操作流程**:
|
||||
|
||||
1. 系统自动生成申请单号(如为空)
|
||||
2. 保存当前表单所有字段值
|
||||
3. 新增记录插入表格末尾
|
||||
4. 已有记录更新对应行数据
|
||||
|
||||
【保存】
|
||||
|
||||
①、写入门诊医嘱表(医嘱状态为新开,医嘱名称为"门诊会诊")
|
||||
|
||||
②、写入门诊会诊申请单表(ConsultationRequest)
|
||||
|
||||
**数据校验**:
|
||||
|
||||
- 必填字段:病人姓名、会诊时间、申请科室、会诊时间、会诊邀请对象、简要病史及会诊目的
|
||||
- 未选会诊对象:提示"请至少选择1位会诊专家"
|
||||
- 过期时间:提示"会诊时间不能早于当前时间"
|
||||
|
||||
#### 4. 会诊邀请对象选择联动
|
||||
|
||||
**触发方式**:点击科室列表项
|
||||
**数据联动**:
|
||||
|
||||
1. 根据选中会诊科室过滤会诊专家列表
|
||||
2. 记忆已选专家(跨科室切换时不丢失)
|
||||
|
||||
**技术要点**:
|
||||
|
||||
- 使用对象存储会诊科室-会诊专家映射关系
|
||||
- 采用事件委托处理动态生成的列表项
|
||||
|
||||
### 五、数据结构说明
|
||||
|
||||
门诊会诊申请单表(ConsultationRequest)
|
||||
|
||||
|
||||
| **字段名称** | **数据类型** | **长度** | **描述** | **取值范围** |
|
||||
|-----------------------------| ------------ | -------- |----------------| --------------------------------------------------------- |
|
||||
| **PatientID** | Text | 20 | 患者唯一标识 | 患者就诊卡号 (取值患者档案) |
|
||||
| **ConsultationID** | Text | 20 | 会诊申请单唯一标识 | 系统自动生成的唯一编号,生成规则CS+年月日时分秒+4位随机数 |
|
||||
| **VisitID** | BIGINT | 20 | 门诊就诊流水号(逻辑外键) | 取值于本次门诊就诊记录表的主键 |
|
||||
| **OrderID** | BIGINT | 20 | 门诊医嘱表主键(一对一外键) | 门诊医嘱表 |
|
||||
| **PatientName** | Text | 50 | 患者姓名 | 患者的姓名 (取值患者档案) |
|
||||
| **Gender** | Text | 10 | 患者性别 | 男/女/其他 (取值患者档案) |
|
||||
| **Age** | Integer | - | 患者年龄 | 取值患者档案 |
|
||||
| **Department** | Text | 50 | 申请会诊的科室 | 当前科室名称 |
|
||||
| **RequestingPhysician** | Text | 50 | 申请会诊的医生 | 当前医生姓名 |
|
||||
| **ConsultationrequestDate** | DateTime | - | 会诊申请时间 | YYYY-MM-DD HH:MM:SS
|
||||
| **ConsultationPurpose** | Text | 255 | 简要病史及会诊目的 | 文本描述,自定义编辑 |
|
||||
| **ProvisionalDiagnosis** | Text | 255 | 门诊诊断 | 文本描述,自动获取医生开立的门诊诊断(主诊断) |
|
||||
| **ConsultationDate** | DateTime | - | 会诊时间 | YYYY-MM-DD HH:MM:SS |
|
||||
| **ConsultationStatus** | Text | 20 | 会诊状态 | 新开/已提交/已确认/已签名/已完成/已取消 |
|
||||
| **ConsultationUrgency** | Text | 20 | 是否紧急 | 勾选框:一般/紧急 |
|
||||
| **ConsultationOpinion** | Text | 255 | 会诊意见 | 文本描述 |
|
||||
| **ConfirmingPhysician** | Text | 50 | 提交会诊的医生 | 医生姓名 |
|
||||
| **ConfirmingPhysicianID** | Text | 20 | 提交会诊的医生ID | 医生唯一标识 |
|
||||
| **ConfirmingDate** | DateTime | - | 提交会诊日期 | YYYY-MM-DD HH:MM:SS |
|
||||
| **Signature** | Text | 50 | 结束会诊医生 | 医生姓名 |
|
||||
| **SignatureDate** | DateTime | - | 结束会诊日期 | YYYY-MM-DD HH:MM:SS |
|
||||
| **cancelnatureDate** | DateTime | - | 作废会诊日期 | YYYY-MM-DD HH:MM:SS |
|
||||
| InvitedObject | Text | 50 | 会诊邀请对象 | |
|
||||
|
||||
**诊状态用于记录会诊申请在不同阶段的状态,以下是常见的会诊状态及其说明:**
|
||||
|
||||
|
||||
| **状态名称** | **状态值** | **描述** |
|
||||
| ------------ | ---------- | ---------------------------------------------------------------------- |
|
||||
| **新开** | 0 | 会诊申请单已保存 |
|
||||
| **已提交** | 10 | 会诊申请已提交,但尚未被会诊医生确认。 |
|
||||
| **已确认** | 20 | 会诊医生已确认会诊申请,并准备进行会诊。 |
|
||||
| **已签名** | 30 | 会诊完成后进行签名 |
|
||||
| **已完成** | 40 | 会诊已经完成,会诊意见已记录。 |
|
||||
| **已取消** | 50 | 会诊申请被取消,可能由于患者情况变化或其他原因,申请医生进行作废操作。 |
|
||||
|
||||
**门诊医嘱表在相关会诊操作步骤的相关事务**
|
||||
|
||||
把“门诊会诊申请”当成**一种特殊医嘱**(OrderType = 'Consult')由系统**在同一事务内**自动插入 门诊医嘱表,再挂到 `ConsultationRequest` **注意:按照现有系统的门诊医嘱表进行设置相关字段的值**
|
||||
|
||||
|
||||
| **节点** | **是否自动** | **说明** |
|
||||
| --------------------- | ------------ | --------------------------------------------------------------------------------------------------- |
|
||||
| 医生点击【保存】 | ✅ | 后台事务:先插门诊医嘱表(医嘱状态为“新开”),再插`ConsultationRequest`.Status=0 |
|
||||
| 医生点击【提交】 | ✅ | 仅更新两表状态 → 门诊医嘱表的医嘱状态和`ConsultationRequest.Status=10` (已提交),不重复生成医嘱 |
|
||||
| 医生点击【作废/删除】 | ✅ | 自动将门诊医嘱表的医嘱状态字段置为“作废”,级联`ConsultationRequest.Status=50` |
|
||||
| 医生点击【结束】 | ✅ | 将 门诊医嘱表的医嘱状态字段置为“已完成”,同时写`ConsultationRequest.Status=40` |
|
||||
|
||||
### 六、开发实现要点
|
||||
|
||||
**样式规范**:
|
||||
|
||||
- **主色调**:\#1890FF(操作按钮)
|
||||
- **辅助色**:\#13C2C2(打印)、\#52C41A(保存)、\#FF4D4F(结束)
|
||||
- **字体规范**:14px/1.5,中文字体优先使用"PingFang SC"
|
||||
- **间距系统**:16px基准,表单行间距12px
|
||||
- **组件样式**:
|
||||
- 按钮:4px圆角,32px高度
|
||||
- 输入框:4px圆角,1px \#D9D9D9边框
|
||||
- 表格行:选中状态\#E6F7FF背景+左侧3px蓝色边框
|
||||
|
||||
**技术要求**:
|
||||
|
||||
- **浏览器兼容**:支持Chrome/Firefox/Edge最新版
|
||||
- **性能要求**:表单提交响应时间\<1秒
|
||||
|
||||
**注意事项**:
|
||||
|
||||
1. 时间字段需统一处理为YYYY-MM-DD HH:mm:ss格式
|
||||
2. 申请单号生成需加锁防止重复
|
||||
3. 移动端需优化表格横向滚动体验
|
||||
4. 打印功能需特殊样式处理(隐藏操作按钮)
|
||||
## 门诊医生站开立会诊申请单界面PRD文档
|
||||
|
||||
### 一、页面概述
|
||||
|
||||
**页面名称**:门诊医生站开立会诊申请单界面**页面目标**:帮助门诊医生完成会诊申请单的创建、编辑、提交和作废操作,实现多科室会诊流程的电子化管理**适用场景**:
|
||||
|
||||
1. 门诊医生需要邀请其他科室专家进行会诊时
|
||||
2. 会诊申请单需要修改或补充信息时
|
||||
3. 会诊流程需要跟踪管理时
|
||||
**页面类型**:表单页+列表页复合型界面
|
||||
|
||||
**核心功能**:
|
||||
|
||||
1. 会诊申请单的新增、保存、提交、作废功能
|
||||
2. 会诊科室/专家可视化选择
|
||||
3. 申请单数据表格展示与交互
|
||||
4. 表单数据自动填充与校验
|
||||
5. 申请单打印输出
|
||||
|
||||
**用户价值**:
|
||||
|
||||
- 规范会诊申请流程,减少纸质单据使用
|
||||
- 通过智能填充减少医生重复录入
|
||||
- 实时查看会诊申请状态(新开/已提交/已确认/已签名/已完成/已取消)
|
||||
|
||||
原型图地址:https://static.pm-ai.cn/prototype/20260115/4eb1bd5367f9d5610b32c0ecc6c793f5/index.html
|
||||
|
||||
流程图:
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
%% ---------- 开始 ----------
|
||||
START(["开始"]) --> A["医生进入会诊申请单界面"]
|
||||
|
||||
%% ---------- 操作选择 ----------
|
||||
A --> B{"操作选择"}
|
||||
B -->|"打印"| C["选择已有申请单"]
|
||||
B -->|"提交/取消提交"| D{"校验状态为“已提交”?"}
|
||||
B -->|"删除"| E["弹出确认对话框"]
|
||||
B -->|"结束"| F{"校验状态为“已提交”?"}
|
||||
B -->|"编辑"| G["修改表单内容"]
|
||||
B -->|"新增"| H["清空表单(保留患者信息)"]
|
||||
|
||||
%% ---------- 打印分支 ----------
|
||||
C --> I["高亮选中行"]
|
||||
I --> J["生成打印视图"]
|
||||
J --> K["输出打印样式"]
|
||||
K --> L(["取消"])
|
||||
|
||||
%% ---------- 提交/取消提交分支 ----------
|
||||
D -->|"不通过"| M["提示“请完善必填信息”"]
|
||||
D -->|"通过"| N["更新状态为“已提交/新开”"]
|
||||
|
||||
%% ---------- 删除分支 ----------
|
||||
E --> O{"确认?"}
|
||||
O -->|"是"| P["标记状态为“已取消”"]
|
||||
O -->|"否"| L
|
||||
|
||||
%% ---------- 结束分支 ----------
|
||||
F -->|"不通过"| Q["提示“请先提交申请”"]
|
||||
F -->|"通过"| R["标记状态为“已完成”"]
|
||||
|
||||
%% ---------- 编辑分支 ----------
|
||||
G --> S{"校验必填字段"}
|
||||
S -->|"不通过"| M
|
||||
S -->|"通过"| T["保存到表格"]
|
||||
|
||||
%% ---------- 新增/保存通用路径 ----------
|
||||
H --> U["填写表单"]
|
||||
U --> V["选择会诊科室/专家"]
|
||||
V --> W["自动填充邀请对象"]
|
||||
W --> X["填写病史及目的"]
|
||||
X --> Y["点击保存"]
|
||||
Y --> Z{"校验必填字段"}
|
||||
Z -->|"不通过"| M
|
||||
Z -->|"通过"| AA["生成会诊申请记录"]
|
||||
AA --> AB["保存到表格"]
|
||||
AB --> AC["新增/更新记录"]
|
||||
|
||||
%% ---------- 循环 ----------
|
||||
AC --> A
|
||||
N --> A
|
||||
P --> A
|
||||
R --> A
|
||||
T --> A
|
||||
M --> A
|
||||
Q --> A
|
||||
L --> A
|
||||
```
|
||||
|
||||
### 二、整体布局分析
|
||||
|
||||
**页面宽度**:自适应宽度(主内容区采用7:3比例分割)
|
||||
**主要区域划分**:
|
||||
|
||||
1. 顶部操作栏(48px固定高度)
|
||||
2. 会诊申请单列表区(高度自适应)
|
||||
3. 主内容区(分左右结构,7:3比例)
|
||||
|
||||
- 左侧:会诊申请单表单区
|
||||
- 右侧:会诊科室/专家选择区
|
||||
**布局特点**:响应式上下+左右混合布局,主要对齐方式为左对齐
|
||||
|
||||
### 三、页面区域详细描述
|
||||
|
||||
#### 1. 顶部操作栏区域
|
||||
|
||||
**区域位置**:页面顶部固定位置**区域尺寸**:高度48px,宽度100%**区域功能**:提供全局操作功能入口**包含元素**:
|
||||
|
||||
- **打印按钮**
|
||||
- 元素类型:操作按钮
|
||||
- 显示内容:“打印”
|
||||
- 交互行为:点击后生成A4打印视图,自动适配医院抬头格式
|
||||
- 样式特征:绿色背景(\#13C2C2),圆角4px,32px高度
|
||||
- **新增按钮**
|
||||
- 元素类型:操作按钮
|
||||
- 显示内容:“新增”
|
||||
- 交互行为:点击清空表单(保留当前患者基本信息)
|
||||
- 样式特征:蓝色背景(\#1890FF)
|
||||
- **结束按钮**
|
||||
- 元素类型:危险操作按钮
|
||||
- 显示内容:“结束”
|
||||
- 交互行为:点击结束已提交的会诊流程,标记申请单状态为"已结束",禁用后续操作
|
||||
- 样式特征:红色背景(\#FF4D4F)
|
||||
- 限制条件:需先选中已提交的会诊单
|
||||
- **保存按钮**
|
||||
- 元素类型:主要操作按钮
|
||||
- 显示内容:“保存”
|
||||
- 交互行为:点击保存当前表单数据,校验必填字段后保存至表格,自动生成时间戳
|
||||
- 样式特征:绿色背景(\#52C41A)
|
||||
|
||||
#### 2. 会诊申请单列表区
|
||||
|
||||
**区域位置**:顶部操作栏下方**区域尺寸**:高度自适应,宽度100%**区域功能**:展示当前医生的会诊申请记录**包含元素**:
|
||||
|
||||
- **申请单表格**
|
||||
- 展示方式:带边框表格
|
||||
- 数据字段:
|
||||
|
||||
- 序号:文本 - 自增序号 - 不可操作
|
||||
- 急:布尔 - ✓表示紧急 - 不可操作
|
||||
- 申请单号:文本 - CS20260105001 - 不可操作
|
||||
- 会诊时间:日期 - 2026-01-05 15:08 - 不可操作
|
||||
- 邀请对象:文本 - 吴院长 - 不可操作
|
||||
- 申请科室:文本 - 内科 - 不可操作
|
||||
- 申请医师:文本 - 张医生 - 不可操作
|
||||
- 申请时间:日期 - 2026-01-05 15:08 - 不可操作
|
||||
- 提交状态:布尔 - 复选框 - 仅查看
|
||||
- 结束状态:布尔 - 复选框 - 仅查看
|
||||
- 操作功能:
|
||||
|
||||
- - o 提交/取消提交按钮
|
||||
|
||||
```
|
||||
样式要求:蓝色小按钮,禁用状态显示灰色
|
||||
```
|
||||
|
||||
|
||||
```
|
||||
交互行为:切换提交状态,需二次确认
|
||||
```
|
||||
|
||||
|
||||
```
|
||||
o 删除图标
|
||||
```
|
||||
|
||||
|
||||
```
|
||||
样式要求:红色垃圾桶图标,hover时放大10%
|
||||
```
|
||||
|
||||
|
||||
```
|
||||
交互行为:弹出确认对话框后作废该记录
|
||||
```
|
||||
|
||||
|
||||
[删除]**将状态改为“已取消”****
|
||||
|
||||
UPDATE ConsultationRequest
|
||||
SET ConsultationStatus = 50,cancelnatureDate = <作废会诊时间>
|
||||
WHERE ConsultationID = <会诊申请单ID> and ConsultationStatus <> 40 ;
|
||||
|
||||
- 交互特性:
|
||||
- 行点击选中效果(蓝色高亮+左侧边框)
|
||||
- 行hover浅灰色背景
|
||||
- 提交按钮状态联动(切换提交状态,需二次确认)
|
||||
|
||||
#### 3. 会诊申请单表单区
|
||||
|
||||
**区域位置**:主内容区左侧**区域尺寸**:占主内容区70%宽度**区域功能**:会诊申请单的详细表单填写**包含元素**:
|
||||
|
||||
- **基础信息区**
|
||||
- 申请单号:只读文本,【保存】时自动生成规则CS+年月日时分秒+4位随机数
|
||||
- 申请时间:只读文本,自动获取系统当前时间
|
||||
- 病人信息:病人姓名/性别/年龄/就诊卡号/申请医师/申请科室(不可编辑),自动获取当前患者档案信息。
|
||||
- **会诊信息区**
|
||||
- 会诊时间:时间控件可编辑
|
||||
- 紧急标识:复选框控件
|
||||
- 申请医师:默认当前登录医生
|
||||
- 申请科室:默认当前医生登录的开单科室
|
||||
- 门诊诊断:自动获取医生开立的门诊诊断(主诊断)
|
||||
- **病史及目的**
|
||||
- 多行文本域,最小高度100px
|
||||
- **会诊邀请**
|
||||
- 会诊邀请对象:支持多选(逗号分隔)-》(可从右侧会诊邀请对象选择)
|
||||
- **会诊记录区**
|
||||
- 会诊意见:只读文本域
|
||||
- 会诊确认参加医师:只读字段
|
||||
- 所属医生、代表科室、签名医生、签名时间:只读字段
|
||||
|
||||
#### 4. 会诊邀请对象选择区(侧边栏)
|
||||
|
||||
**区域位置**:主内容区右侧**区域尺寸**:占主内容区30%宽度**区域功能**:快速选择会诊科室和专家**包含元素**:
|
||||
|
||||
- **会诊科室列表**
|
||||
- 展示方式:带边框可滚动列表
|
||||
- 交互行为:选择科室后动态加载对应专家
|
||||
- **会诊专家列表**
|
||||
- 展示方式:带边框可滚动列表
|
||||
- 交互行为:点击专家自动填入会诊邀请对象字段(防重复:已选专家提示"请勿重复选择")
|
||||
- 特殊逻辑:支持多选(自动用逗号分隔)
|
||||
|
||||
### 四、交互功能详细说明
|
||||
|
||||
#### 1. 会诊申请单提交流程
|
||||
|
||||
**功能描述**:完成会诊申请单的提交操作**触发条件**:点击表格行的"提交"按钮**操作流程**:
|
||||
|
||||
1. 医生点击行内"提交"按钮
|
||||
2. 系统校验必填字段(会诊时间、邀请对象)
|
||||
3. 提交状态复选框变为已勾选
|
||||
4. 按钮文字变为"取消提交"
|
||||
5. 禁用该行编辑功能
|
||||
|
||||
【提交】**将状态从“新开”改为“已提交”**
|
||||
|
||||
UPDATE ConsultationRequest
|
||||
SET ConsultationStatus = 10,ConfirmingPhysician = <提交会诊医生姓名> ,ConfirmingPhysicianID = <提交会诊医生ID> ,ConfirmingDate = <提交会诊时间>
|
||||
WHERE ConsultationID = <会诊申请单ID> and ConsultationStatus = 0 ;
|
||||
|
||||
【取消提交】**将状态从“已提交”改为“新开”**
|
||||
|
||||
UPDATE ConsultationRequest
|
||||
SET ConsultationStatus = 0,ConfirmingPhysician = '',ConfirmingPhysicianID = '',ConfirmingDate = ''
|
||||
WHERE ConsultationID = <会诊申请单ID> and ConsultationStatus = 10 ;
|
||||
|
||||
**异常处理**:
|
||||
|
||||
- 必填字段缺失:弹出"请完善会诊时间和邀请对象信息"
|
||||
- 重复提交:提示"该申请已提交,请勿重复操作"
|
||||
|
||||
#### 2. 会诊流程结束功能
|
||||
|
||||
**功能描述**:标记会诊流程已结束**触发条件**:选中已提交的申请单后点击顶部"结束"按钮**操作流程**:
|
||||
|
||||
1. 医生选中已提交的申请单(行高亮)
|
||||
2. 点击顶部"结束"按钮
|
||||
3. 系统校验提交状态为已提交
|
||||
4. 结束状态复选框变为已勾选
|
||||
5. 禁用该行的取消提交功能
|
||||
|
||||
【结束】**将状态从“已签名”改为“已完成”**
|
||||
|
||||
UPDATE ConsultationRequest
|
||||
SET ConsultationStatus = 40,Signature = <结束会诊医生姓名> ,SignatureDate=<结束会诊时间>
|
||||
WHERE ConsultationID = <会诊申请单ID> and ConsultationStatus = 30 ;
|
||||
|
||||
**异常处理**:
|
||||
|
||||
- 未选中记录:提示"请先选择要结束的会诊申请"
|
||||
- 未提交记录:提示"请先提交该会诊申请"
|
||||
|
||||
#### 3. 申请单保存功能
|
||||
|
||||
**功能描述**:保存会诊申请单数据**触发条件**:点击顶部"保存"按钮**操作流程**:
|
||||
|
||||
1. 系统自动生成申请单号(如为空)
|
||||
2. 保存当前表单所有字段值
|
||||
3. 新增记录插入表格末尾
|
||||
4. 已有记录更新对应行数据
|
||||
|
||||
【保存】
|
||||
|
||||
①、写入门诊医嘱表(医嘱状态为新开,医嘱名称为"门诊会诊")
|
||||
|
||||
②、写入门诊会诊申请单表(ConsultationRequest)
|
||||
|
||||
**数据校验**:
|
||||
|
||||
- 必填字段:病人姓名、会诊时间、申请科室、会诊时间、会诊邀请对象、简要病史及会诊目的
|
||||
- 未选会诊对象:提示"请至少选择1位会诊专家"
|
||||
- 过期时间:提示"会诊时间不能早于当前时间"
|
||||
|
||||
#### 4. 会诊邀请对象选择联动
|
||||
|
||||
**触发方式**:点击科室列表项
|
||||
**数据联动**:
|
||||
|
||||
1. 根据选中会诊科室过滤会诊专家列表
|
||||
2. 记忆已选专家(跨科室切换时不丢失)
|
||||
|
||||
**技术要点**:
|
||||
|
||||
- 使用对象存储会诊科室-会诊专家映射关系
|
||||
- 采用事件委托处理动态生成的列表项
|
||||
|
||||
### 五、数据结构说明
|
||||
|
||||
门诊会诊申请单表(ConsultationRequest)
|
||||
|
||||
|
||||
| **字段名称** | **数据类型** | **长度** | **描述** | **取值范围** |
|
||||
|-----------------------------| ------------ | -------- |----------------| --------------------------------------------------------- |
|
||||
| **PatientID** | Text | 20 | 患者唯一标识 | 患者就诊卡号 (取值患者档案) |
|
||||
| **ConsultationID** | Text | 20 | 会诊申请单唯一标识 | 系统自动生成的唯一编号,生成规则CS+年月日时分秒+4位随机数 |
|
||||
| **VisitID** | BIGINT | 20 | 门诊就诊流水号(逻辑外键) | 取值于本次门诊就诊记录表的主键 |
|
||||
| **OrderID** | BIGINT | 20 | 门诊医嘱表主键(一对一外键) | 门诊医嘱表 |
|
||||
| **PatientName** | Text | 50 | 患者姓名 | 患者的姓名 (取值患者档案) |
|
||||
| **Gender** | Text | 10 | 患者性别 | 男/女/其他 (取值患者档案) |
|
||||
| **Age** | Integer | - | 患者年龄 | 取值患者档案 |
|
||||
| **Department** | Text | 50 | 申请会诊的科室 | 当前科室名称 |
|
||||
| **RequestingPhysician** | Text | 50 | 申请会诊的医生 | 当前医生姓名 |
|
||||
| **ConsultationrequestDate** | DateTime | - | 会诊申请时间 | YYYY-MM-DD HH:MM:SS
|
||||
| **ConsultationPurpose** | Text | 255 | 简要病史及会诊目的 | 文本描述,自定义编辑 |
|
||||
| **ProvisionalDiagnosis** | Text | 255 | 门诊诊断 | 文本描述,自动获取医生开立的门诊诊断(主诊断) |
|
||||
| **ConsultationDate** | DateTime | - | 会诊时间 | YYYY-MM-DD HH:MM:SS |
|
||||
| **ConsultationStatus** | Text | 20 | 会诊状态 | 新开/已提交/已确认/已签名/已完成/已取消 |
|
||||
| **ConsultationUrgency** | Text | 20 | 是否紧急 | 勾选框:一般/紧急 |
|
||||
| **ConsultationOpinion** | Text | 255 | 会诊意见 | 文本描述 |
|
||||
| **ConfirmingPhysician** | Text | 50 | 提交会诊的医生 | 医生姓名 |
|
||||
| **ConfirmingPhysicianID** | Text | 20 | 提交会诊的医生ID | 医生唯一标识 |
|
||||
| **ConfirmingDate** | DateTime | - | 提交会诊日期 | YYYY-MM-DD HH:MM:SS |
|
||||
| **Signature** | Text | 50 | 结束会诊医生 | 医生姓名 |
|
||||
| **SignatureDate** | DateTime | - | 结束会诊日期 | YYYY-MM-DD HH:MM:SS |
|
||||
| **cancelnatureDate** | DateTime | - | 作废会诊日期 | YYYY-MM-DD HH:MM:SS |
|
||||
| InvitedObject | Text | 50 | 会诊邀请对象 | |
|
||||
|
||||
**诊状态用于记录会诊申请在不同阶段的状态,以下是常见的会诊状态及其说明:**
|
||||
|
||||
|
||||
| **状态名称** | **状态值** | **描述** |
|
||||
| ------------ | ---------- | ---------------------------------------------------------------------- |
|
||||
| **新开** | 0 | 会诊申请单已保存 |
|
||||
| **已提交** | 10 | 会诊申请已提交,但尚未被会诊医生确认。 |
|
||||
| **已确认** | 20 | 会诊医生已确认会诊申请,并准备进行会诊。 |
|
||||
| **已签名** | 30 | 会诊完成后进行签名 |
|
||||
| **已完成** | 40 | 会诊已经完成,会诊意见已记录。 |
|
||||
| **已取消** | 50 | 会诊申请被取消,可能由于患者情况变化或其他原因,申请医生进行作废操作。 |
|
||||
|
||||
**门诊医嘱表在相关会诊操作步骤的相关事务**
|
||||
|
||||
把“门诊会诊申请”当成**一种特殊医嘱**(OrderType = 'Consult')由系统**在同一事务内**自动插入 门诊医嘱表,再挂到 `ConsultationRequest` **注意:按照现有系统的门诊医嘱表进行设置相关字段的值**
|
||||
|
||||
|
||||
| **节点** | **是否自动** | **说明** |
|
||||
| --------------------- | ------------ | --------------------------------------------------------------------------------------------------- |
|
||||
| 医生点击【保存】 | ✅ | 后台事务:先插门诊医嘱表(医嘱状态为“新开”),再插`ConsultationRequest`.Status=0 |
|
||||
| 医生点击【提交】 | ✅ | 仅更新两表状态 → 门诊医嘱表的医嘱状态和`ConsultationRequest.Status=10` (已提交),不重复生成医嘱 |
|
||||
| 医生点击【作废/删除】 | ✅ | 自动将门诊医嘱表的医嘱状态字段置为“作废”,级联`ConsultationRequest.Status=50` |
|
||||
| 医生点击【结束】 | ✅ | 将 门诊医嘱表的医嘱状态字段置为“已完成”,同时写`ConsultationRequest.Status=40` |
|
||||
|
||||
### 六、开发实现要点
|
||||
|
||||
**样式规范**:
|
||||
|
||||
- **主色调**:\#1890FF(操作按钮)
|
||||
- **辅助色**:\#13C2C2(打印)、\#52C41A(保存)、\#FF4D4F(结束)
|
||||
- **字体规范**:14px/1.5,中文字体优先使用"PingFang SC"
|
||||
- **间距系统**:16px基准,表单行间距12px
|
||||
- **组件样式**:
|
||||
- 按钮:4px圆角,32px高度
|
||||
- 输入框:4px圆角,1px \#D9D9D9边框
|
||||
- 表格行:选中状态\#E6F7FF背景+左侧3px蓝色边框
|
||||
|
||||
**技术要求**:
|
||||
|
||||
- **浏览器兼容**:支持Chrome/Firefox/Edge最新版
|
||||
- **性能要求**:表单提交响应时间\<1秒
|
||||
|
||||
**注意事项**:
|
||||
|
||||
1. 时间字段需统一处理为YYYY-MM-DD HH:mm:ss格式
|
||||
2. 申请单号生成需加锁防止重复
|
||||
3. 移动端需优化表格横向滚动体验
|
||||
4. 打印功能需特殊样式处理(隐藏操作按钮)
|
||||
@@ -1,310 +1,310 @@
|
||||
## 门诊医生站会诊申请确认界面PRD文档
|
||||
|
||||
### 一、页面概述
|
||||
|
||||
**页面名称**:门诊医生站会诊申请确认界面
|
||||
**页面目标**:帮助医生完成会诊申请的确认、签名和打印操作,展示会诊申请详细信息
|
||||
**适用场景**:医生在收到会诊申请后,查看申请信息并给出会诊意见
|
||||
**页面类型**:表单页+列表页复合型页面
|
||||
|
||||
**核心功能**:
|
||||
|
||||
1. 会诊申请单列表展示与选择
|
||||
2. 会诊确认与取消确认功能
|
||||
3. 签名功能
|
||||
4. 会诊记录单打印
|
||||
5. 会诊意见编辑与保存
|
||||
|
||||
**用户价值**:
|
||||
|
||||
- 规范会诊申请流程
|
||||
- 电子化确认和签名提高效率
|
||||
- 完整记录会诊意见便于后续诊疗
|
||||
- 打印功能满足纸质存档需求
|
||||
**原型图地址:**https://static.pm-ai.cn/prototype/20260115/7c45e175239257e0f04c9081bf2ca204/index.html
|
||||
**流程图:**
|
||||
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
Start(["医生进入会诊申请确认界面"]) --> LoadList["加载会诊申请列表"]
|
||||
LoadList --> HasUntreated{"是否有未处理申请?"}
|
||||
|
||||
HasUntreated -- "否" --> ShowNoTip["显示无申请提示"]
|
||||
HasUntreated -- "是" --> SelectApp["医生选择会诊申请"]
|
||||
|
||||
SelectApp --> ShowDetail["显示会诊申请详情"]
|
||||
ShowDetail --> EditOpinion["医生编辑会诊意见"]
|
||||
|
||||
EditOpinion --> ConfirmClick{"点击确认按钮?"}
|
||||
ConfirmClick -- "否" --> SignClick{"点击签名按钮?"}
|
||||
ConfirmClick -- "是" --> ValidateConfirm{"校验必填字段"}
|
||||
|
||||
ValidateConfirm -- "不通过" --> TipFill["提示\n请先填写会诊意见"]
|
||||
ValidateConfirm -- "通过" --> CheckConfirmed{"是否已确认?"}
|
||||
|
||||
CheckConfirmed -- "是" --> UpdateConfirmed["更新状态为\n已确认"]
|
||||
UpdateConfirmed --> AutoFill["自动填充医生科室信息"]
|
||||
AutoFill --> DisableCancel["禁用取消确认功能"]
|
||||
|
||||
CheckConfirmed -- "否" --> KeepState["保持当前状态"]
|
||||
|
||||
SignClick -- "否" --> PrintClick{"点击打印按钮?"}
|
||||
SignClick -- "是" --> ValidateSign{"校验通过?"}
|
||||
|
||||
ValidateSign -- "不通过" --> TipConfirmFirst["提示\n请先确认会诊申请"]
|
||||
ValidateSign -- "通过" --> UpdateSigned["更新状态为\n已签名"]
|
||||
UpdateSigned --> RecordSign["记录签名医生和时间"]
|
||||
|
||||
PrintClick -- "否" --> RefreshClick{"点击刷新按钮?"}
|
||||
PrintClick -- "是" --> GenPrintView["生成打印优化视图"]
|
||||
GenPrintView --> BrowserPrint["调用浏览器打印功能"]
|
||||
|
||||
RefreshClick -- "是" --> LoadList
|
||||
RefreshClick -- "否" --> KeepState
|
||||
|
||||
TipFill --> EditOpinion
|
||||
TipConfirmFirst --> EditOpinion
|
||||
KeepState --> End(["结束"])
|
||||
BrowserPrint --> End
|
||||
DisableCancel --> End
|
||||
```
|
||||
|
||||
|
||||
|
||||
|
||||
### 二、整体布局分析
|
||||
|
||||
**页面宽度**:自适应布局
|
||||
**主要区域划分**:
|
||||
|
||||
1. 顶部标签导航(高度48px)
|
||||
2. 操作按钮区(高度36px+间距)
|
||||
3. 会诊申请列表区(高度自适应)
|
||||
4. 会诊记录单表单区(高度自适应)
|
||||
**布局特点**:上下布局,采用网格系统对齐,左侧对齐为主
|
||||
|
||||
### 三、页面区域详细描述
|
||||
|
||||
#### 1. 顶部标签导航区域
|
||||
|
||||
**区域位置**:页面顶部
|
||||
**区域尺寸**:高度48px,宽度100%
|
||||
**区域功能**:页面导航标识
|
||||
**包含元素**:
|
||||
|
||||
- **会诊确认标签**
|
||||
- 元素类型:文本标签
|
||||
- 显示内容:“会诊确认”
|
||||
- 交互行为:无点击交互(当前页面)
|
||||
- 样式特征:蓝色下划线,16px字体,700字重
|
||||
|
||||
#### 2. 操作按钮区域
|
||||
|
||||
**区域位置**:标签导航下方
|
||||
**区域尺寸**:高度36px,宽度100%
|
||||
**区域功能**:提供页面主要操作入口
|
||||
**包含元素**:
|
||||
|
||||
- **打印按钮**
|
||||
- 元素类型:操作按钮
|
||||
- 显示内容:“打印”
|
||||
- 交互行为:点击触发打印会诊记录单
|
||||
- 样式特征:绿色背景,白色文字,圆角6px
|
||||
- **刷新按钮**
|
||||
- 元素类型:操作按钮
|
||||
- 显示内容:“刷新”
|
||||
- 交互行为:点击重新加载页面数据
|
||||
- 样式特征:白色背景,灰色边框,黑色文字
|
||||
- **确认按钮**
|
||||
- 元素类型:状态切换按钮
|
||||
- 显示内容:“确认”/“取消确认”
|
||||
- 交互行为:
|
||||
- 点击后变为"取消确认"状态(红色样式)
|
||||
- 已签名时禁用取消操作
|
||||
- 样式特征:蓝色背景,白色文字
|
||||
- 限制条件:需选中表格行才可操作
|
||||
- **签名按钮**
|
||||
- 元素类型:操作按钮
|
||||
- 显示内容:“签名”
|
||||
- 交互行为:
|
||||
- 需先确认才能签名
|
||||
- 签名后自动记录签名时间和签名医生
|
||||
- 样式特征:蓝色背景,白色文字
|
||||
- 限制条件:需先完成确认操作
|
||||
|
||||
#### 3. 会诊申请列表区域
|
||||
|
||||
**区域位置**:按钮区域下方
|
||||
**区域尺寸**:高度自适应,宽度100%
|
||||
**区域功能**:展示待处理的会诊申请列表
|
||||
**包含元素**:
|
||||
|
||||
- **申请列表表格** (取值于门诊会诊申请单表(ConsultationRequest))
|
||||
- 检索要求:医生登录门诊医生站打开会诊申请确认界面时只能检索出当前登录医生姓名包含在会诊邀请对象内(只能查看自己受会诊邀请对象)
|
||||
- 展示方式:带斑马纹表格
|
||||
- 表头字段:
|
||||
- 序号 \| 紧急 \| 申请单号 \| 病人姓名 \| 会诊时间 \| 邀请对象 \| 申请科室 \| 申请医师 \| 申请时间 \| 确认 \| 签名
|
||||
- 数据字段:
|
||||
- 序号:文本 - 自动编号 - “1” - 不可操作
|
||||
- 紧急:复选框 - 布尔值 - 未勾选 - 可操作
|
||||
- 申请单号:文本 - 字符串 - “CS20250812001” - 不可操作
|
||||
- 病人姓名:文本 - 字符串 - “陈明” - 不可操作
|
||||
- 会诊时间:日期 - 日期时间 - “2025-08-12 17:48” - 不可操作
|
||||
- 邀请对象:文本 - 字符串 - “演示测试” - 不可操作
|
||||
- 申请科室:文本 - 字符串 - “内科” - 不可操作
|
||||
- 申请医师:文本 - 字符串 - “徐斌” - 不可操作
|
||||
- 申请时间:日期 - 日期时间 - “2025-08-12 17:48” - 不可操作
|
||||
- 确认:复选框 - 布尔值 - 勾选框 – 不可操作
|
||||
- 签名:复选框 - 布尔值 - 勾选框 – 不可操作
|
||||
- 操作功能:点击行选中查看会诊申请详情
|
||||
- 样式特征:斑马纹交替背景,悬停高亮
|
||||
|
||||
#### 4. 会诊记录单表单区域
|
||||
|
||||
**区域位置**:列表区域下方
|
||||
**区域尺寸**:高度自适应,宽度100%
|
||||
**区域功能**:展示和编辑会诊详细信息
|
||||
**包含元素**:
|
||||
|
||||
- **基础信息区**
|
||||
- 布局方式:8列网格
|
||||
- 包含字段:
|
||||
- 病人姓名/性别/年龄/就诊卡号
|
||||
- 申请单号/申请科室
|
||||
- 会诊时间/紧急标志
|
||||
- 会诊邀请对象
|
||||
- 提交医生/提交时间
|
||||
- **病史及目的区**
|
||||
- 元素类型:文本区域
|
||||
- 显示内容:患者主诉和会诊目的
|
||||
- 交互行为:只读展示
|
||||
- **会诊确认参加医师**
|
||||
- **会诊意见区**
|
||||
- 元素类型:可编辑文本域
|
||||
- 显示内容:会诊意见文本
|
||||
- 交互行为:支持多行编辑
|
||||
- 样式特征:浅灰色背景,120px最小高度
|
||||
- **确认/签名信息区**
|
||||
- 包含字段:
|
||||
- 所属医生/代表科室(确认后自动填充当前医生和科室)
|
||||
- 签名医生/签名时间(自动填充签名医生和签名时间(系统当前时间))
|
||||
|
||||
### 四、交互功能详细说明
|
||||
|
||||
#### 1. 会诊申请选择功能
|
||||
|
||||
**触发方式**:点击表格行
|
||||
**执行流程**:
|
||||
|
||||
1. 高亮选中行(浅蓝色背景)
|
||||
2. 同步该行数据到下方表单
|
||||
3. 根据确认状态更新按钮文字
|
||||
4. 加载存储的会诊意见到文本域
|
||||
|
||||
**异常处理**:
|
||||
|
||||
- 无选中行时禁用确认/签名按钮
|
||||
- 已签名行禁止取消确认
|
||||
|
||||
#### 2. 会诊确认功能
|
||||
|
||||
**触发方式**:点击确认按钮
|
||||
|
||||
**执行流程**:
|
||||
|
||||
1. 校验必填字段(会诊意见、会诊确认参加医师)
|
||||
2. 保存会诊意见等相关内容到行数据(写入门诊会诊申请确认表(ConsultationConfirmation))
|
||||
3. 勾选确认复选框
|
||||
4. 更新按钮为"取消确认"状态
|
||||
5. 所属医生和代表科室(自动填充当前医生和科室)
|
||||
|
||||
**异常处理**:
|
||||
|
||||
- 未填写会诊意见时提示"请先填写会诊意见"
|
||||
- 保存失败时保持原状态并提示错误
|
||||
|
||||
#### 2. 电子签名功能
|
||||
|
||||
**功能描述**:医生对确认的会诊进行电子签名
|
||||
**触发条件**:已确认的会诊申请点击"签名"按钮
|
||||
**操作流程**:
|
||||
|
||||
1. 医生确认会诊申请
|
||||
2. 点击"签名"按钮
|
||||
3. 校验确认状态
|
||||
4. 表格中"签名"列复选框被勾选
|
||||
5. 自动记录签名医生(当前用户)
|
||||
6. 自动填充签名时间为系统时间
|
||||
7. 禁用取消确认功能
|
||||
**成功反馈**:表单区显示签名信息
|
||||
**失败处理**:提示"请先确认会诊申请"
|
||||
|
||||
#### 3. 打印会诊记录单
|
||||
|
||||
**功能描述**:打印格式化的会诊记录
|
||||
**触发条件**:点击"打印"按钮
|
||||
**操作流程**:
|
||||
|
||||
1. 点击"打印"按钮
|
||||
2. 系统生成打印优化视图
|
||||
3. 调用浏览器打印功能
|
||||
**特殊处理**:隐藏交互元素,优化打印布局
|
||||
|
||||
### 五、数据结构说明
|
||||
|
||||
**门诊会诊申请确认表(**ConsultationConfirmation**)**
|
||||
|
||||
| **字段名称** | **数据类型** | **长度** | **描述** | **约束/说明** |
|
||||
|-----------------------------|--------------|----------|--------------------|------------------------------------------------------------------------------------|
|
||||
| **ConsultationID** | INTEGER | 20 | 会诊申请单唯一标识 | FOREIGN KEY REFERENCES ConsultationRequest(ConsultationID) |
|
||||
| **ConfirmingPhysicianID** | TEXT | -20 | 确认会诊的医生ID | 操作【确认】按钮的当前医生ID |
|
||||
| **ConfirmingPhysicianName** | TEXT | -20 | 确认会诊的医生姓名 | 操作【确认】按钮的当前医生姓名 |
|
||||
| **ConfirmingDeptName** | TEXT | 20 | 代表科室 | 操作【确认】按钮的当前开单科室 |
|
||||
| **ConfirmingDate** | DateTime | - | 确认会诊的日期 | 操作【确认】按钮当前系统时间 |
|
||||
| **ConsultationStatus** | TEXT | 20 | 会诊状态 | CHECK (ConsultationStatus IN ('已确认', '取消确认', '已签名', '已完成')), NOT NULL |
|
||||
| **ConsultationOpinion** | TEXT | 500 | 会诊意见 | |
|
||||
| **ConfirmingPhysician** | TEXT | 100 | 会诊确认参加医师 | |
|
||||
| **Signature** | TEXT | 20 | 签名医生 | |
|
||||
| **SignatureDate** | DateTime | - | 签名时间 | - |
|
||||
|
||||
ConsultationConfirmation.ConsultationStatu会诊状态
|
||||
|
||||
| **状态值** | **状态名** | **描述** |
|
||||
|------------|------------|-----------------------------------|
|
||||
| **0** | 取消确认 | 作废 |
|
||||
| **20** | 已确认 | 会诊医生已查看/同意,可写初步意见 |
|
||||
| **30** | 已签名 | 已电子签名,意见最终生效 |
|
||||
| **40** | 已完成 | 会诊报告已回写,流程关闭 |
|
||||
|
||||
**按钮涉及的事务**
|
||||
|
||||
| **按钮** | **涉及表** | **执行事务** | **锁/并发** | **成功状态** | **失败处理** |
|
||||
|--------------|----------------------------------------------------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------|-----------------------|------------------|--------------------------|
|
||||
| **确认** | 1、ConsultationRequest<br>2、门诊医嘱<br>3、ConsultationConfirmation | 1、ConsultationRequest.ConsultationStatus =20<br>2、医嘱 状态='已执行'<br>3、写入ConsultationConfirmation表相关的数据 | SELECT ... FOR UPDATE | 已提交 → 已确认 | 任何异常 → 整体 ROLLBACK |
|
||||
| **取消确认** | 1、ConsultationRequest<br>2、门诊医嘱<br>3、ConsultationConfirmation | 1、ConsultationRequest.ConsultationStatus =10<br>2、医嘱 状态='已提交'<br>3、ConsultationConfirmation. ConsultationStatus = 0 | 同上 | 已确认→ 取消确认 | 同上回滚 |
|
||||
| **签名** | 1、ConsultationRequest<br>2、门诊医嘱<br>3、ConsultationConfirmation | 1、ConsultationRequest.ConsultationStatus =30<br>2、医嘱 Status='已完成'<br>3、写入ConsultationConfirmation. Signature, SignatureDate,ConsultationStatus =30 | 同上 | 已确认 → 已签名 | 同上回滚 |
|
||||
|
||||
### 六、开发实现要点
|
||||
|
||||
**样式规范**:
|
||||
|
||||
- **主色调**:\#4A89DC(按钮蓝色)
|
||||
- **辅助色**:\#4CAF50(成功绿色)
|
||||
- **字体规范**:14px/1.5 常规,16px 标题
|
||||
- **间距系统**:8px基础间距,24px区块间距
|
||||
- **组件样式**:
|
||||
- 按钮:6px圆角,1px边框
|
||||
- 输入框:4px圆角,1px \#E0E0E0边框
|
||||
|
||||
**技术要求**:
|
||||
|
||||
- **浏览器兼容**:Chrome/Firefox/Edge最新版
|
||||
- **性能要求**:列表加载时间\<1s
|
||||
|
||||
**注意事项**:
|
||||
|
||||
1. 确认和签名状态需要联动控制
|
||||
2. 打印功能需要特殊样式处理
|
||||
3. 时间字段需统一使用YYYY-MM-DD HH:mm:ss格式
|
||||
4. 移动端需优化表单布局
|
||||
## 门诊医生站会诊申请确认界面PRD文档
|
||||
|
||||
### 一、页面概述
|
||||
|
||||
**页面名称**:门诊医生站会诊申请确认界面
|
||||
**页面目标**:帮助医生完成会诊申请的确认、签名和打印操作,展示会诊申请详细信息
|
||||
**适用场景**:医生在收到会诊申请后,查看申请信息并给出会诊意见
|
||||
**页面类型**:表单页+列表页复合型页面
|
||||
|
||||
**核心功能**:
|
||||
|
||||
1. 会诊申请单列表展示与选择
|
||||
2. 会诊确认与取消确认功能
|
||||
3. 签名功能
|
||||
4. 会诊记录单打印
|
||||
5. 会诊意见编辑与保存
|
||||
|
||||
**用户价值**:
|
||||
|
||||
- 规范会诊申请流程
|
||||
- 电子化确认和签名提高效率
|
||||
- 完整记录会诊意见便于后续诊疗
|
||||
- 打印功能满足纸质存档需求
|
||||
**原型图地址:**https://static.pm-ai.cn/prototype/20260115/7c45e175239257e0f04c9081bf2ca204/index.html
|
||||
**流程图:**
|
||||
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
Start(["医生进入会诊申请确认界面"]) --> LoadList["加载会诊申请列表"]
|
||||
LoadList --> HasUntreated{"是否有未处理申请?"}
|
||||
|
||||
HasUntreated -- "否" --> ShowNoTip["显示无申请提示"]
|
||||
HasUntreated -- "是" --> SelectApp["医生选择会诊申请"]
|
||||
|
||||
SelectApp --> ShowDetail["显示会诊申请详情"]
|
||||
ShowDetail --> EditOpinion["医生编辑会诊意见"]
|
||||
|
||||
EditOpinion --> ConfirmClick{"点击确认按钮?"}
|
||||
ConfirmClick -- "否" --> SignClick{"点击签名按钮?"}
|
||||
ConfirmClick -- "是" --> ValidateConfirm{"校验必填字段"}
|
||||
|
||||
ValidateConfirm -- "不通过" --> TipFill["提示\n请先填写会诊意见"]
|
||||
ValidateConfirm -- "通过" --> CheckConfirmed{"是否已确认?"}
|
||||
|
||||
CheckConfirmed -- "是" --> UpdateConfirmed["更新状态为\n已确认"]
|
||||
UpdateConfirmed --> AutoFill["自动填充医生科室信息"]
|
||||
AutoFill --> DisableCancel["禁用取消确认功能"]
|
||||
|
||||
CheckConfirmed -- "否" --> KeepState["保持当前状态"]
|
||||
|
||||
SignClick -- "否" --> PrintClick{"点击打印按钮?"}
|
||||
SignClick -- "是" --> ValidateSign{"校验通过?"}
|
||||
|
||||
ValidateSign -- "不通过" --> TipConfirmFirst["提示\n请先确认会诊申请"]
|
||||
ValidateSign -- "通过" --> UpdateSigned["更新状态为\n已签名"]
|
||||
UpdateSigned --> RecordSign["记录签名医生和时间"]
|
||||
|
||||
PrintClick -- "否" --> RefreshClick{"点击刷新按钮?"}
|
||||
PrintClick -- "是" --> GenPrintView["生成打印优化视图"]
|
||||
GenPrintView --> BrowserPrint["调用浏览器打印功能"]
|
||||
|
||||
RefreshClick -- "是" --> LoadList
|
||||
RefreshClick -- "否" --> KeepState
|
||||
|
||||
TipFill --> EditOpinion
|
||||
TipConfirmFirst --> EditOpinion
|
||||
KeepState --> End(["结束"])
|
||||
BrowserPrint --> End
|
||||
DisableCancel --> End
|
||||
```
|
||||
|
||||
|
||||
|
||||
|
||||
### 二、整体布局分析
|
||||
|
||||
**页面宽度**:自适应布局
|
||||
**主要区域划分**:
|
||||
|
||||
1. 顶部标签导航(高度48px)
|
||||
2. 操作按钮区(高度36px+间距)
|
||||
3. 会诊申请列表区(高度自适应)
|
||||
4. 会诊记录单表单区(高度自适应)
|
||||
**布局特点**:上下布局,采用网格系统对齐,左侧对齐为主
|
||||
|
||||
### 三、页面区域详细描述
|
||||
|
||||
#### 1. 顶部标签导航区域
|
||||
|
||||
**区域位置**:页面顶部
|
||||
**区域尺寸**:高度48px,宽度100%
|
||||
**区域功能**:页面导航标识
|
||||
**包含元素**:
|
||||
|
||||
- **会诊确认标签**
|
||||
- 元素类型:文本标签
|
||||
- 显示内容:“会诊确认”
|
||||
- 交互行为:无点击交互(当前页面)
|
||||
- 样式特征:蓝色下划线,16px字体,700字重
|
||||
|
||||
#### 2. 操作按钮区域
|
||||
|
||||
**区域位置**:标签导航下方
|
||||
**区域尺寸**:高度36px,宽度100%
|
||||
**区域功能**:提供页面主要操作入口
|
||||
**包含元素**:
|
||||
|
||||
- **打印按钮**
|
||||
- 元素类型:操作按钮
|
||||
- 显示内容:“打印”
|
||||
- 交互行为:点击触发打印会诊记录单
|
||||
- 样式特征:绿色背景,白色文字,圆角6px
|
||||
- **刷新按钮**
|
||||
- 元素类型:操作按钮
|
||||
- 显示内容:“刷新”
|
||||
- 交互行为:点击重新加载页面数据
|
||||
- 样式特征:白色背景,灰色边框,黑色文字
|
||||
- **确认按钮**
|
||||
- 元素类型:状态切换按钮
|
||||
- 显示内容:“确认”/“取消确认”
|
||||
- 交互行为:
|
||||
- 点击后变为"取消确认"状态(红色样式)
|
||||
- 已签名时禁用取消操作
|
||||
- 样式特征:蓝色背景,白色文字
|
||||
- 限制条件:需选中表格行才可操作
|
||||
- **签名按钮**
|
||||
- 元素类型:操作按钮
|
||||
- 显示内容:“签名”
|
||||
- 交互行为:
|
||||
- 需先确认才能签名
|
||||
- 签名后自动记录签名时间和签名医生
|
||||
- 样式特征:蓝色背景,白色文字
|
||||
- 限制条件:需先完成确认操作
|
||||
|
||||
#### 3. 会诊申请列表区域
|
||||
|
||||
**区域位置**:按钮区域下方
|
||||
**区域尺寸**:高度自适应,宽度100%
|
||||
**区域功能**:展示待处理的会诊申请列表
|
||||
**包含元素**:
|
||||
|
||||
- **申请列表表格** (取值于门诊会诊申请单表(ConsultationRequest))
|
||||
- 检索要求:医生登录门诊医生站打开会诊申请确认界面时只能检索出当前登录医生姓名包含在会诊邀请对象内(只能查看自己受会诊邀请对象)
|
||||
- 展示方式:带斑马纹表格
|
||||
- 表头字段:
|
||||
- 序号 \| 紧急 \| 申请单号 \| 病人姓名 \| 会诊时间 \| 邀请对象 \| 申请科室 \| 申请医师 \| 申请时间 \| 确认 \| 签名
|
||||
- 数据字段:
|
||||
- 序号:文本 - 自动编号 - “1” - 不可操作
|
||||
- 紧急:复选框 - 布尔值 - 未勾选 - 可操作
|
||||
- 申请单号:文本 - 字符串 - “CS20250812001” - 不可操作
|
||||
- 病人姓名:文本 - 字符串 - “陈明” - 不可操作
|
||||
- 会诊时间:日期 - 日期时间 - “2025-08-12 17:48” - 不可操作
|
||||
- 邀请对象:文本 - 字符串 - “演示测试” - 不可操作
|
||||
- 申请科室:文本 - 字符串 - “内科” - 不可操作
|
||||
- 申请医师:文本 - 字符串 - “徐斌” - 不可操作
|
||||
- 申请时间:日期 - 日期时间 - “2025-08-12 17:48” - 不可操作
|
||||
- 确认:复选框 - 布尔值 - 勾选框 – 不可操作
|
||||
- 签名:复选框 - 布尔值 - 勾选框 – 不可操作
|
||||
- 操作功能:点击行选中查看会诊申请详情
|
||||
- 样式特征:斑马纹交替背景,悬停高亮
|
||||
|
||||
#### 4. 会诊记录单表单区域
|
||||
|
||||
**区域位置**:列表区域下方
|
||||
**区域尺寸**:高度自适应,宽度100%
|
||||
**区域功能**:展示和编辑会诊详细信息
|
||||
**包含元素**:
|
||||
|
||||
- **基础信息区**
|
||||
- 布局方式:8列网格
|
||||
- 包含字段:
|
||||
- 病人姓名/性别/年龄/就诊卡号
|
||||
- 申请单号/申请科室
|
||||
- 会诊时间/紧急标志
|
||||
- 会诊邀请对象
|
||||
- 提交医生/提交时间
|
||||
- **病史及目的区**
|
||||
- 元素类型:文本区域
|
||||
- 显示内容:患者主诉和会诊目的
|
||||
- 交互行为:只读展示
|
||||
- **会诊确认参加医师**
|
||||
- **会诊意见区**
|
||||
- 元素类型:可编辑文本域
|
||||
- 显示内容:会诊意见文本
|
||||
- 交互行为:支持多行编辑
|
||||
- 样式特征:浅灰色背景,120px最小高度
|
||||
- **确认/签名信息区**
|
||||
- 包含字段:
|
||||
- 所属医生/代表科室(确认后自动填充当前医生和科室)
|
||||
- 签名医生/签名时间(自动填充签名医生和签名时间(系统当前时间))
|
||||
|
||||
### 四、交互功能详细说明
|
||||
|
||||
#### 1. 会诊申请选择功能
|
||||
|
||||
**触发方式**:点击表格行
|
||||
**执行流程**:
|
||||
|
||||
1. 高亮选中行(浅蓝色背景)
|
||||
2. 同步该行数据到下方表单
|
||||
3. 根据确认状态更新按钮文字
|
||||
4. 加载存储的会诊意见到文本域
|
||||
|
||||
**异常处理**:
|
||||
|
||||
- 无选中行时禁用确认/签名按钮
|
||||
- 已签名行禁止取消确认
|
||||
|
||||
#### 2. 会诊确认功能
|
||||
|
||||
**触发方式**:点击确认按钮
|
||||
|
||||
**执行流程**:
|
||||
|
||||
1. 校验必填字段(会诊意见、会诊确认参加医师)
|
||||
2. 保存会诊意见等相关内容到行数据(写入门诊会诊申请确认表(ConsultationConfirmation))
|
||||
3. 勾选确认复选框
|
||||
4. 更新按钮为"取消确认"状态
|
||||
5. 所属医生和代表科室(自动填充当前医生和科室)
|
||||
|
||||
**异常处理**:
|
||||
|
||||
- 未填写会诊意见时提示"请先填写会诊意见"
|
||||
- 保存失败时保持原状态并提示错误
|
||||
|
||||
#### 2. 电子签名功能
|
||||
|
||||
**功能描述**:医生对确认的会诊进行电子签名
|
||||
**触发条件**:已确认的会诊申请点击"签名"按钮
|
||||
**操作流程**:
|
||||
|
||||
1. 医生确认会诊申请
|
||||
2. 点击"签名"按钮
|
||||
3. 校验确认状态
|
||||
4. 表格中"签名"列复选框被勾选
|
||||
5. 自动记录签名医生(当前用户)
|
||||
6. 自动填充签名时间为系统时间
|
||||
7. 禁用取消确认功能
|
||||
**成功反馈**:表单区显示签名信息
|
||||
**失败处理**:提示"请先确认会诊申请"
|
||||
|
||||
#### 3. 打印会诊记录单
|
||||
|
||||
**功能描述**:打印格式化的会诊记录
|
||||
**触发条件**:点击"打印"按钮
|
||||
**操作流程**:
|
||||
|
||||
1. 点击"打印"按钮
|
||||
2. 系统生成打印优化视图
|
||||
3. 调用浏览器打印功能
|
||||
**特殊处理**:隐藏交互元素,优化打印布局
|
||||
|
||||
### 五、数据结构说明
|
||||
|
||||
**门诊会诊申请确认表(**ConsultationConfirmation**)**
|
||||
|
||||
| **字段名称** | **数据类型** | **长度** | **描述** | **约束/说明** |
|
||||
|-----------------------------|--------------|----------|--------------------|------------------------------------------------------------------------------------|
|
||||
| **ConsultationID** | INTEGER | 20 | 会诊申请单唯一标识 | FOREIGN KEY REFERENCES ConsultationRequest(ConsultationID) |
|
||||
| **ConfirmingPhysicianID** | TEXT | -20 | 确认会诊的医生ID | 操作【确认】按钮的当前医生ID |
|
||||
| **ConfirmingPhysicianName** | TEXT | -20 | 确认会诊的医生姓名 | 操作【确认】按钮的当前医生姓名 |
|
||||
| **ConfirmingDeptName** | TEXT | 20 | 代表科室 | 操作【确认】按钮的当前开单科室 |
|
||||
| **ConfirmingDate** | DateTime | - | 确认会诊的日期 | 操作【确认】按钮当前系统时间 |
|
||||
| **ConsultationStatus** | TEXT | 20 | 会诊状态 | CHECK (ConsultationStatus IN ('已确认', '取消确认', '已签名', '已完成')), NOT NULL |
|
||||
| **ConsultationOpinion** | TEXT | 500 | 会诊意见 | |
|
||||
| **ConfirmingPhysician** | TEXT | 100 | 会诊确认参加医师 | |
|
||||
| **Signature** | TEXT | 20 | 签名医生 | |
|
||||
| **SignatureDate** | DateTime | - | 签名时间 | - |
|
||||
|
||||
ConsultationConfirmation.ConsultationStatu会诊状态
|
||||
|
||||
| **状态值** | **状态名** | **描述** |
|
||||
|------------|------------|-----------------------------------|
|
||||
| **0** | 取消确认 | 作废 |
|
||||
| **20** | 已确认 | 会诊医生已查看/同意,可写初步意见 |
|
||||
| **30** | 已签名 | 已电子签名,意见最终生效 |
|
||||
| **40** | 已完成 | 会诊报告已回写,流程关闭 |
|
||||
|
||||
**按钮涉及的事务**
|
||||
|
||||
| **按钮** | **涉及表** | **执行事务** | **锁/并发** | **成功状态** | **失败处理** |
|
||||
|--------------|----------------------------------------------------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------|-----------------------|------------------|--------------------------|
|
||||
| **确认** | 1、ConsultationRequest<br>2、门诊医嘱<br>3、ConsultationConfirmation | 1、ConsultationRequest.ConsultationStatus =20<br>2、医嘱 状态='已执行'<br>3、写入ConsultationConfirmation表相关的数据 | SELECT ... FOR UPDATE | 已提交 → 已确认 | 任何异常 → 整体 ROLLBACK |
|
||||
| **取消确认** | 1、ConsultationRequest<br>2、门诊医嘱<br>3、ConsultationConfirmation | 1、ConsultationRequest.ConsultationStatus =10<br>2、医嘱 状态='已提交'<br>3、ConsultationConfirmation. ConsultationStatus = 0 | 同上 | 已确认→ 取消确认 | 同上回滚 |
|
||||
| **签名** | 1、ConsultationRequest<br>2、门诊医嘱<br>3、ConsultationConfirmation | 1、ConsultationRequest.ConsultationStatus =30<br>2、医嘱 Status='已完成'<br>3、写入ConsultationConfirmation. Signature, SignatureDate,ConsultationStatus =30 | 同上 | 已确认 → 已签名 | 同上回滚 |
|
||||
|
||||
### 六、开发实现要点
|
||||
|
||||
**样式规范**:
|
||||
|
||||
- **主色调**:\#4A89DC(按钮蓝色)
|
||||
- **辅助色**:\#4CAF50(成功绿色)
|
||||
- **字体规范**:14px/1.5 常规,16px 标题
|
||||
- **间距系统**:8px基础间距,24px区块间距
|
||||
- **组件样式**:
|
||||
- 按钮:6px圆角,1px边框
|
||||
- 输入框:4px圆角,1px \#E0E0E0边框
|
||||
|
||||
**技术要求**:
|
||||
|
||||
- **浏览器兼容**:Chrome/Firefox/Edge最新版
|
||||
- **性能要求**:列表加载时间\<1s
|
||||
|
||||
**注意事项**:
|
||||
|
||||
1. 确认和签名状态需要联动控制
|
||||
2. 打印功能需要特殊样式处理
|
||||
3. 时间字段需统一使用YYYY-MM-DD HH:mm:ss格式
|
||||
4. 移动端需优化表单布局
|
||||
@@ -1,267 +1,267 @@
|
||||
## 门诊会诊申请管理界面PRD文档
|
||||
|
||||
### 一、页面概述
|
||||
|
||||
**页面名称**:门诊会诊申请管理界面
|
||||
**页面目标**:提供会诊申请的全流程管理功能,包括申请记录查询、编辑申请、查看详情、状态变更等核心操作
|
||||
**适用场景**:门诊医生需要查看会诊申请或管理已有申请记录时使用
|
||||
**页面类型**:列表页+表单弹窗复合型页面
|
||||
|
||||
**核心功能**:
|
||||
|
||||
1. 多条件组合筛选会诊申请记录
|
||||
2. 会诊申请表格展示与操作(编辑/查看/删除)
|
||||
3. 会诊申请单的填写与提交
|
||||
4. 会诊状态标记(提交/结束)
|
||||
**用户价值**:规范会诊申请流程,减少纸质单据流转,提高多科室协作效率
|
||||
原型图地址:https://static.pm-ai.cn/prototype/20260116/aed1f102d614677f100c0d1fe3104999/index.html
|
||||
**流程图:**
|
||||
```mermaid
|
||||
flowchart TD
|
||||
Start([Start]) --> A[进入门诊会诊申请管理界面]
|
||||
A --> B{用户操作类型}
|
||||
B -->|筛选查询| C[设置筛选条件]
|
||||
B -->|编辑申请| D[点击编辑按钮]
|
||||
B -->|查看详情| E[点击查看按钮]
|
||||
B -->|删除申请| G[点击删除按钮]
|
||||
|
||||
C --> H{验证筛选条件}
|
||||
H -->|有效| I[展示筛选结果]
|
||||
H -->|无效| J[显示错误提示]
|
||||
J --> C
|
||||
|
||||
I --> K[用户浏览列表]
|
||||
|
||||
D --> L{检查会诊状态}
|
||||
L -->|未结束| M[打开编辑弹窗]
|
||||
L -->|已结束| N[提示不可编辑]
|
||||
N --> O[关闭弹窗]
|
||||
|
||||
M --> P[修改表单内容]
|
||||
P --> Q{表单验证}
|
||||
Q -->|通过| R[保存修改]
|
||||
Q -->|不通过| S[标红错误字段]
|
||||
S --> P
|
||||
|
||||
E --> T{检查会诊状态}
|
||||
T -->|未结束| U[打开只读弹窗]
|
||||
T -->|已结束| U
|
||||
|
||||
G --> Z{删除验证}
|
||||
Z -->|可删除| AA[确认删除]
|
||||
Z -->|不可删除| AB[提示删除失败]
|
||||
AB --> K
|
||||
|
||||
AA --> AC[更新状态为已取消]
|
||||
AC --> AD[更新列表显示]
|
||||
|
||||
R --> AD
|
||||
AD --> K
|
||||
K --> AE([End])
|
||||
```
|
||||
|
||||
### 二、整体布局分析
|
||||
|
||||
**页面宽度**:自适应布局
|
||||
**主要区域划分**:
|
||||
|
||||
1. 顶部筛选区(高度自适应,约80px)
|
||||
2. 表格展示区(高度自适应,占主要空间)
|
||||
3. 底部页码区(固定高度56px)
|
||||
**布局特点**:上下布局+弹性布局,采用左右对齐方式
|
||||
|
||||
### 三、页面区域详细描述
|
||||
|
||||
#### 1. 顶部筛选区
|
||||
|
||||
**区域位置**:页面顶部
|
||||
**区域尺寸**:100%宽度,高度自适应
|
||||
**区域功能**:提供多维度筛选和快速搜索功能
|
||||
**包含元素**:
|
||||
|
||||
- **时间类型选择器**
|
||||
- 元素类型:下拉选择框
|
||||
- 显示内容:默认"会诊时间",可选"申请时间"
|
||||
- 交互行为:点击展开下拉选项
|
||||
- 样式特征:宽度120px,高度32px,圆角4px
|
||||
- **时间范围选择器**(开始/结束时间)
|
||||
- 元素类型:日期时间输入框
|
||||
- 显示内容:placeholder提示"开始时间"/“结束时间”
|
||||
- 交互行为:点击弹出日期选择面板
|
||||
- 样式特征:宽度180px,高度32px
|
||||
- **申请科室/申请医生选择器**
|
||||
- 元素类型:带datalist的输入框
|
||||
- 显示内容:placeholder提示"选择或输入科室/医生"
|
||||
- 交互行为:输入时显示匹配选项
|
||||
- 数据来源:动态生成申请科室/医生候选列表,取值于门诊会诊申请单表(ConsultationRequest.Department/ RequestingPhysician)
|
||||
- **会诊状态筛选器**
|
||||
- 元素类型:下拉选择框
|
||||
- 可选值:全部/未提交/提交/结束
|
||||
- 默认值:全部
|
||||
- **病人姓名搜索框**
|
||||
- 元素类型:文本输入框
|
||||
- 显示内容:placeholder提示"病人姓名"
|
||||
- 交互行为:支持模糊搜索
|
||||
- **操作按钮组**
|
||||
- 查询按钮
|
||||
- 样式:蓝色背景,带搜索图标
|
||||
- 交互:触发筛选条件应用
|
||||
- 重置按钮
|
||||
- 样式:灰色背景,带刷新图标
|
||||
- 交互:清空所有筛选条件
|
||||
- 打印按钮
|
||||
- 样式:深灰色背景,带打印图标
|
||||
- 交互:调起浏览器打印功能
|
||||
|
||||
#### 2. 表格展示区
|
||||
|
||||
**区域位置**:页面中部
|
||||
**区域尺寸**:100%宽度,高度自适应
|
||||
**区域功能**:展示会诊申请列表数据,支持行内操作
|
||||
**包含元素**:
|
||||
|
||||
取值于门诊会诊申请单表(ConsultationRequest)和门诊会诊申请单表(ConsultationRequest)
|
||||
|
||||
- **数据表格**
|
||||
- 展示方式:11列固定表头表格
|
||||
- 数据字段:
|
||||
- ID:文本 - 15 -申请单号
|
||||
- 急:复选框 - 布尔值 - 示例false – 不可编辑
|
||||
- 病人姓名:文本 - 朱某某 - 红色高亮
|
||||
- 会诊时间:日期 - 2026-01-05 15:08
|
||||
- 申请科室:文本 - 内科
|
||||
- 邀请对象:文本 - 吴院长
|
||||
- 申请时间:日期 - 2026-01-05 15:08
|
||||
- 申请医师:文本 - 演示测试
|
||||
- 提交:复选框 - 布尔值 - 示例false
|
||||
- 结束:复选框 - 布尔值 - 示例false
|
||||
- 操作功能:
|
||||
- 编辑按钮(✏️):点击打开编辑弹窗
|
||||
- 查看按钮(👁️):点击打开只读弹窗
|
||||
- 删除按钮(🗑️):点击确认删除
|
||||
- 【删除】将状态改为“已取消”
|
||||
- UPDATE ConsultationRequest
|
||||
- SET ConsultationStatus = 50,cancelnatureDate = \<作废会诊时间\>
|
||||
- WHERE ConsultationID = \<会诊申请单ID\> and ConsultationStatus \<\> 40 ;
|
||||
- 交互行为:
|
||||
- 行悬停效果:浅蓝色背景
|
||||
- 复选框点击:即时更新状态(需防抖处理)
|
||||
|
||||
#### 3. 底部页码区
|
||||
|
||||
**区域位置**:页面底部
|
||||
**区域尺寸**:100%宽度,固定高度56px
|
||||
**区域功能**:分页控制和数据统计
|
||||
**包含元素**:
|
||||
|
||||
- **总数统计**:总数统计文本(如:“总数:15”)
|
||||
- **分页控制器**:
|
||||
- 上一页按钮(\<)
|
||||
- 当前页按钮(1)active状态
|
||||
- 下一页按钮(\>)
|
||||
- 交互反馈:hover时边框变蓝
|
||||
|
||||
#### 4. 会诊申请弹窗(模态框)
|
||||
|
||||
**触发方式**:点击表格行操作列的编辑/查看按钮
|
||||
**区域功能**:展示/编辑会诊申请详细信息
|
||||
**包含元素**:
|
||||
|
||||
- 头部区域
|
||||
- 标题:“会诊申请单”
|
||||
- 关闭按钮(×图标)
|
||||
- 表单区域(分两栏布局)
|
||||
- 基础信息区:
|
||||
- 申请单号(只读)
|
||||
- 申请时间(不可编辑)
|
||||
- 病人姓名(不可编辑)
|
||||
- 性别/年龄(不可编辑)
|
||||
- 就诊卡号(不可编辑)
|
||||
- 会诊信息区:
|
||||
- 会诊时间(日期时间选择器)
|
||||
- 申请医师(不可编辑)
|
||||
- 紧急程度(复选框)
|
||||
- 申请科室(不可编辑)
|
||||
- 门诊诊断(不可编辑)
|
||||
- 会诊邀请对象
|
||||
- 会诊确认参加医师
|
||||
- 所属医生
|
||||
- 代表科室
|
||||
- 签名医生
|
||||
- 签名时间
|
||||
- 文本域:
|
||||
- 病史及会诊目的(多行文本)
|
||||
- 会诊意见(多行文本)
|
||||
- 底部按钮区:
|
||||
- 取消按钮(左对齐)
|
||||
- 保存按钮(右对齐,蓝色)
|
||||
|
||||
### 四、交互功能详细说明
|
||||
|
||||
#### 1. 会诊申请编辑功能
|
||||
|
||||
**功能描述**:修改已有会诊申请信息
|
||||
**触发条件**:点击表格行中的"✏️"按钮
|
||||
**操作流程**:
|
||||
|
||||
1. 检查会诊状态是否为"结束",若已结束则提示不可编辑
|
||||
2. 弹出会诊申请编辑弹窗,填充当前行数据的会诊申请和确认相关的数据
|
||||
3. 用户修改表单内容(必填字段校验)
|
||||
4. 点击"保存"按钮提交修改
|
||||
**异常处理**:
|
||||
- 必填字段为空时,标红提示
|
||||
- 保存失败时显示toast提示"保存失败,请重试"
|
||||
|
||||
#### 2. 会诊申请查看功能
|
||||
|
||||
**功能描述**:查看会诊申请详细信息
|
||||
**触发条件**:点击表格行中的"👁️"按钮
|
||||
**操作流程**:
|
||||
|
||||
1. 弹出只读弹窗,显示完整申请信息
|
||||
2. 所有字段禁用编辑
|
||||
3. 仅显示"取消"按钮用于关闭弹窗
|
||||
|
||||
#### 3. 数据筛选功能
|
||||
|
||||
**功能描述**:多条件组合查询会诊记录
|
||||
**触发条件**:点击"查询"按钮
|
||||
**数据过滤逻辑**:
|
||||
|
||||
- 时间范围:根据选择的时间类型(会诊/申请)进行筛选
|
||||
- 申请科室/申请医生:支持模糊匹配
|
||||
- 会诊状态筛选:支持多选逻辑(未提交/提交/结束)
|
||||
1. 收集所有筛选条件值
|
||||
2. 发起异步请求(示例中为前端过滤)
|
||||
3. 更新表格数据展示
|
||||
**异常处理**:
|
||||
- 时间范围不合法:提示"结束时间不能早于开始时间"
|
||||
- 无查询结果:显示空白表格+提示文字
|
||||
**性能优化**:前端本地缓存数据,减少服务器请求
|
||||
|
||||
### 五、数据结构说明
|
||||
|
||||
门诊会诊申请单表(ConsultationRequest)和门诊会诊申请单表(ConsultationRequest)
|
||||
|
||||
### 六、开发实现要点
|
||||
|
||||
**样式规范**:
|
||||
|
||||
- **主色调**:\#5D9CEC(按钮/交互元素)
|
||||
- **辅助色**:\#8E8E8E(次要按钮)
|
||||
- **字体规范**:14px/1.5(主要内容),16px/1.5(标题)
|
||||
- **间距系统**:16px(元素间距),24px(区块间距)
|
||||
- **组件样式**:
|
||||
- 按钮:圆角6px,内边距0 16px
|
||||
- 输入框:1px实线边框\#D9D9D9,圆角4px
|
||||
|
||||
**技术要求**:
|
||||
|
||||
- **浏览器兼容**:支持Chrome/Firefox/Edge最新版
|
||||
- **性能要求**:列表数据筛选响应时间\<200ms
|
||||
|
||||
**注意事项**:
|
||||
|
||||
1. 状态变更逻辑:已结束的记录不可编辑
|
||||
2. 时间字段需要做时区转换处理
|
||||
3. 申请科室/申请医生选择器需要支持拼音首字母检索
|
||||
## 门诊会诊申请管理界面PRD文档
|
||||
|
||||
### 一、页面概述
|
||||
|
||||
**页面名称**:门诊会诊申请管理界面
|
||||
**页面目标**:提供会诊申请的全流程管理功能,包括申请记录查询、编辑申请、查看详情、状态变更等核心操作
|
||||
**适用场景**:门诊医生需要查看会诊申请或管理已有申请记录时使用
|
||||
**页面类型**:列表页+表单弹窗复合型页面
|
||||
|
||||
**核心功能**:
|
||||
|
||||
1. 多条件组合筛选会诊申请记录
|
||||
2. 会诊申请表格展示与操作(编辑/查看/删除)
|
||||
3. 会诊申请单的填写与提交
|
||||
4. 会诊状态标记(提交/结束)
|
||||
**用户价值**:规范会诊申请流程,减少纸质单据流转,提高多科室协作效率
|
||||
原型图地址:https://static.pm-ai.cn/prototype/20260116/aed1f102d614677f100c0d1fe3104999/index.html
|
||||
**流程图:**
|
||||
```mermaid
|
||||
flowchart TD
|
||||
Start([Start]) --> A[进入门诊会诊申请管理界面]
|
||||
A --> B{用户操作类型}
|
||||
B -->|筛选查询| C[设置筛选条件]
|
||||
B -->|编辑申请| D[点击编辑按钮]
|
||||
B -->|查看详情| E[点击查看按钮]
|
||||
B -->|删除申请| G[点击删除按钮]
|
||||
|
||||
C --> H{验证筛选条件}
|
||||
H -->|有效| I[展示筛选结果]
|
||||
H -->|无效| J[显示错误提示]
|
||||
J --> C
|
||||
|
||||
I --> K[用户浏览列表]
|
||||
|
||||
D --> L{检查会诊状态}
|
||||
L -->|未结束| M[打开编辑弹窗]
|
||||
L -->|已结束| N[提示不可编辑]
|
||||
N --> O[关闭弹窗]
|
||||
|
||||
M --> P[修改表单内容]
|
||||
P --> Q{表单验证}
|
||||
Q -->|通过| R[保存修改]
|
||||
Q -->|不通过| S[标红错误字段]
|
||||
S --> P
|
||||
|
||||
E --> T{检查会诊状态}
|
||||
T -->|未结束| U[打开只读弹窗]
|
||||
T -->|已结束| U
|
||||
|
||||
G --> Z{删除验证}
|
||||
Z -->|可删除| AA[确认删除]
|
||||
Z -->|不可删除| AB[提示删除失败]
|
||||
AB --> K
|
||||
|
||||
AA --> AC[更新状态为已取消]
|
||||
AC --> AD[更新列表显示]
|
||||
|
||||
R --> AD
|
||||
AD --> K
|
||||
K --> AE([End])
|
||||
```
|
||||
|
||||
### 二、整体布局分析
|
||||
|
||||
**页面宽度**:自适应布局
|
||||
**主要区域划分**:
|
||||
|
||||
1. 顶部筛选区(高度自适应,约80px)
|
||||
2. 表格展示区(高度自适应,占主要空间)
|
||||
3. 底部页码区(固定高度56px)
|
||||
**布局特点**:上下布局+弹性布局,采用左右对齐方式
|
||||
|
||||
### 三、页面区域详细描述
|
||||
|
||||
#### 1. 顶部筛选区
|
||||
|
||||
**区域位置**:页面顶部
|
||||
**区域尺寸**:100%宽度,高度自适应
|
||||
**区域功能**:提供多维度筛选和快速搜索功能
|
||||
**包含元素**:
|
||||
|
||||
- **时间类型选择器**
|
||||
- 元素类型:下拉选择框
|
||||
- 显示内容:默认"会诊时间",可选"申请时间"
|
||||
- 交互行为:点击展开下拉选项
|
||||
- 样式特征:宽度120px,高度32px,圆角4px
|
||||
- **时间范围选择器**(开始/结束时间)
|
||||
- 元素类型:日期时间输入框
|
||||
- 显示内容:placeholder提示"开始时间"/“结束时间”
|
||||
- 交互行为:点击弹出日期选择面板
|
||||
- 样式特征:宽度180px,高度32px
|
||||
- **申请科室/申请医生选择器**
|
||||
- 元素类型:带datalist的输入框
|
||||
- 显示内容:placeholder提示"选择或输入科室/医生"
|
||||
- 交互行为:输入时显示匹配选项
|
||||
- 数据来源:动态生成申请科室/医生候选列表,取值于门诊会诊申请单表(ConsultationRequest.Department/ RequestingPhysician)
|
||||
- **会诊状态筛选器**
|
||||
- 元素类型:下拉选择框
|
||||
- 可选值:全部/未提交/提交/结束
|
||||
- 默认值:全部
|
||||
- **病人姓名搜索框**
|
||||
- 元素类型:文本输入框
|
||||
- 显示内容:placeholder提示"病人姓名"
|
||||
- 交互行为:支持模糊搜索
|
||||
- **操作按钮组**
|
||||
- 查询按钮
|
||||
- 样式:蓝色背景,带搜索图标
|
||||
- 交互:触发筛选条件应用
|
||||
- 重置按钮
|
||||
- 样式:灰色背景,带刷新图标
|
||||
- 交互:清空所有筛选条件
|
||||
- 打印按钮
|
||||
- 样式:深灰色背景,带打印图标
|
||||
- 交互:调起浏览器打印功能
|
||||
|
||||
#### 2. 表格展示区
|
||||
|
||||
**区域位置**:页面中部
|
||||
**区域尺寸**:100%宽度,高度自适应
|
||||
**区域功能**:展示会诊申请列表数据,支持行内操作
|
||||
**包含元素**:
|
||||
|
||||
取值于门诊会诊申请单表(ConsultationRequest)和门诊会诊申请单表(ConsultationRequest)
|
||||
|
||||
- **数据表格**
|
||||
- 展示方式:11列固定表头表格
|
||||
- 数据字段:
|
||||
- ID:文本 - 15 -申请单号
|
||||
- 急:复选框 - 布尔值 - 示例false – 不可编辑
|
||||
- 病人姓名:文本 - 朱某某 - 红色高亮
|
||||
- 会诊时间:日期 - 2026-01-05 15:08
|
||||
- 申请科室:文本 - 内科
|
||||
- 邀请对象:文本 - 吴院长
|
||||
- 申请时间:日期 - 2026-01-05 15:08
|
||||
- 申请医师:文本 - 演示测试
|
||||
- 提交:复选框 - 布尔值 - 示例false
|
||||
- 结束:复选框 - 布尔值 - 示例false
|
||||
- 操作功能:
|
||||
- 编辑按钮(✏️):点击打开编辑弹窗
|
||||
- 查看按钮(👁️):点击打开只读弹窗
|
||||
- 删除按钮(🗑️):点击确认删除
|
||||
- 【删除】将状态改为“已取消”
|
||||
- UPDATE ConsultationRequest
|
||||
- SET ConsultationStatus = 50,cancelnatureDate = \<作废会诊时间\>
|
||||
- WHERE ConsultationID = \<会诊申请单ID\> and ConsultationStatus \<\> 40 ;
|
||||
- 交互行为:
|
||||
- 行悬停效果:浅蓝色背景
|
||||
- 复选框点击:即时更新状态(需防抖处理)
|
||||
|
||||
#### 3. 底部页码区
|
||||
|
||||
**区域位置**:页面底部
|
||||
**区域尺寸**:100%宽度,固定高度56px
|
||||
**区域功能**:分页控制和数据统计
|
||||
**包含元素**:
|
||||
|
||||
- **总数统计**:总数统计文本(如:“总数:15”)
|
||||
- **分页控制器**:
|
||||
- 上一页按钮(\<)
|
||||
- 当前页按钮(1)active状态
|
||||
- 下一页按钮(\>)
|
||||
- 交互反馈:hover时边框变蓝
|
||||
|
||||
#### 4. 会诊申请弹窗(模态框)
|
||||
|
||||
**触发方式**:点击表格行操作列的编辑/查看按钮
|
||||
**区域功能**:展示/编辑会诊申请详细信息
|
||||
**包含元素**:
|
||||
|
||||
- 头部区域
|
||||
- 标题:“会诊申请单”
|
||||
- 关闭按钮(×图标)
|
||||
- 表单区域(分两栏布局)
|
||||
- 基础信息区:
|
||||
- 申请单号(只读)
|
||||
- 申请时间(不可编辑)
|
||||
- 病人姓名(不可编辑)
|
||||
- 性别/年龄(不可编辑)
|
||||
- 就诊卡号(不可编辑)
|
||||
- 会诊信息区:
|
||||
- 会诊时间(日期时间选择器)
|
||||
- 申请医师(不可编辑)
|
||||
- 紧急程度(复选框)
|
||||
- 申请科室(不可编辑)
|
||||
- 门诊诊断(不可编辑)
|
||||
- 会诊邀请对象
|
||||
- 会诊确认参加医师
|
||||
- 所属医生
|
||||
- 代表科室
|
||||
- 签名医生
|
||||
- 签名时间
|
||||
- 文本域:
|
||||
- 病史及会诊目的(多行文本)
|
||||
- 会诊意见(多行文本)
|
||||
- 底部按钮区:
|
||||
- 取消按钮(左对齐)
|
||||
- 保存按钮(右对齐,蓝色)
|
||||
|
||||
### 四、交互功能详细说明
|
||||
|
||||
#### 1. 会诊申请编辑功能
|
||||
|
||||
**功能描述**:修改已有会诊申请信息
|
||||
**触发条件**:点击表格行中的"✏️"按钮
|
||||
**操作流程**:
|
||||
|
||||
1. 检查会诊状态是否为"结束",若已结束则提示不可编辑
|
||||
2. 弹出会诊申请编辑弹窗,填充当前行数据的会诊申请和确认相关的数据
|
||||
3. 用户修改表单内容(必填字段校验)
|
||||
4. 点击"保存"按钮提交修改
|
||||
**异常处理**:
|
||||
- 必填字段为空时,标红提示
|
||||
- 保存失败时显示toast提示"保存失败,请重试"
|
||||
|
||||
#### 2. 会诊申请查看功能
|
||||
|
||||
**功能描述**:查看会诊申请详细信息
|
||||
**触发条件**:点击表格行中的"👁️"按钮
|
||||
**操作流程**:
|
||||
|
||||
1. 弹出只读弹窗,显示完整申请信息
|
||||
2. 所有字段禁用编辑
|
||||
3. 仅显示"取消"按钮用于关闭弹窗
|
||||
|
||||
#### 3. 数据筛选功能
|
||||
|
||||
**功能描述**:多条件组合查询会诊记录
|
||||
**触发条件**:点击"查询"按钮
|
||||
**数据过滤逻辑**:
|
||||
|
||||
- 时间范围:根据选择的时间类型(会诊/申请)进行筛选
|
||||
- 申请科室/申请医生:支持模糊匹配
|
||||
- 会诊状态筛选:支持多选逻辑(未提交/提交/结束)
|
||||
1. 收集所有筛选条件值
|
||||
2. 发起异步请求(示例中为前端过滤)
|
||||
3. 更新表格数据展示
|
||||
**异常处理**:
|
||||
- 时间范围不合法:提示"结束时间不能早于开始时间"
|
||||
- 无查询结果:显示空白表格+提示文字
|
||||
**性能优化**:前端本地缓存数据,减少服务器请求
|
||||
|
||||
### 五、数据结构说明
|
||||
|
||||
门诊会诊申请单表(ConsultationRequest)和门诊会诊申请单表(ConsultationRequest)
|
||||
|
||||
### 六、开发实现要点
|
||||
|
||||
**样式规范**:
|
||||
|
||||
- **主色调**:\#5D9CEC(按钮/交互元素)
|
||||
- **辅助色**:\#8E8E8E(次要按钮)
|
||||
- **字体规范**:14px/1.5(主要内容),16px/1.5(标题)
|
||||
- **间距系统**:16px(元素间距),24px(区块间距)
|
||||
- **组件样式**:
|
||||
- 按钮:圆角6px,内边距0 16px
|
||||
- 输入框:1px实线边框\#D9D9D9,圆角4px
|
||||
|
||||
**技术要求**:
|
||||
|
||||
- **浏览器兼容**:支持Chrome/Firefox/Edge最新版
|
||||
- **性能要求**:列表数据筛选响应时间\<200ms
|
||||
|
||||
**注意事项**:
|
||||
|
||||
1. 状态变更逻辑:已结束的记录不可编辑
|
||||
2. 时间字段需要做时区转换处理
|
||||
3. 申请科室/申请医生选择器需要支持拼音首字母检索
|
||||
@@ -1,62 +1,62 @@
|
||||
**门诊手术中计费PRD文档**
|
||||
|
||||
**目标:**
|
||||
|
||||
支持手术中追加计费(耗材、药品等)、退费等场景使用
|
||||
|
||||
术后一站式结算(发票、清单、医保等)
|
||||
|
||||
**流程图:**
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
A["医生开立手术申请单"] --> B{"系统生成计费包"}
|
||||
B --> C["患者缴费"]
|
||||
C --> D["手术室确认"]
|
||||
D --> E{"术中追加/退费?"}
|
||||
|
||||
E -- "是" --> F{"术中计费"}
|
||||
F -- "耗材" --> F2["护士扫码追加耗材\n实时计价 更新库存"]
|
||||
F -- "药品" --> F3["麻醉师追加药品\n实时计价 更新库存"]
|
||||
F -- "诊疗项目" --> F4["追加麻醉时长/项目\n实时计价"]
|
||||
|
||||
|
||||
F2 --> F6["生成术中追加计费单"]
|
||||
F3 --> F6
|
||||
F4 --> F6
|
||||
|
||||
|
||||
F6 --> G{"患者支付?"}
|
||||
G -- "是" --> P["提示支付成功"]--> J
|
||||
G -- "否" --> H["提示支付失败\n保持待支付"]
|
||||
H --> D
|
||||
|
||||
E -- "否" --> I["手术完成"]
|
||||
I --> J["术后统一结算"]
|
||||
J --> K["发票/清单/分割单"]
|
||||
K --> L["财务对账"]
|
||||
```
|
||||
|
||||
**注意:**待门诊手术安排界面(禅道需求编号:93)完成后再执行
|
||||
|
||||

|
||||
|
||||
图1:门诊手术安排界面(禅道需求编号:93)
|
||||
|
||||

|
||||
|
||||
图2:门诊管理-》门诊划价:手术计费界面复制《门诊划价》界面红色框内容
|
||||
|
||||
1、如上图1、2所示:在门诊手术安排界面增加【计费】按钮,实现对门诊手术中追加的费用进行记账,手术计费界面如图2所示复制《门诊划价》界面红色框内容进行个性化改造,患者信息:取值于手术安排界面选中行的患者信息,计费账号为当前系统登录的账号。
|
||||
|
||||
\*比如:在手术计费界面给患者1计费成功后,重新从手术按钮界面选中患者1点击【计费】打开界面时显示当前患者已计费成功的手术费用。
|
||||
|
||||
写入事务注意:
|
||||
|
||||
adm_charge_item费用项管理表
|
||||
|
||||
①、术中费用仍走“门诊就诊管理”的就诊ID(adm_encounter.id = adm_charge_item.encounter_id)。
|
||||
|
||||
2\. 为了事后能追溯“这些费用是术中发生的”,在费用项管理表明细上加一个 “来源业务单据(SourceBillNo)” 字段(adm_charge_item.generate_source_enum = 2(帐单生成来源为手术计费),SourceBillNo = 手术申请单号)。
|
||||
|
||||
3\. 其他内容按照《门诊划价》的业务数据流程走。
|
||||
**门诊手术中计费PRD文档**
|
||||
|
||||
**目标:**
|
||||
|
||||
支持手术中追加计费(耗材、药品等)、退费等场景使用
|
||||
|
||||
术后一站式结算(发票、清单、医保等)
|
||||
|
||||
**流程图:**
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
A["医生开立手术申请单"] --> B{"系统生成计费包"}
|
||||
B --> C["患者缴费"]
|
||||
C --> D["手术室确认"]
|
||||
D --> E{"术中追加/退费?"}
|
||||
|
||||
E -- "是" --> F{"术中计费"}
|
||||
F -- "耗材" --> F2["护士扫码追加耗材\n实时计价 更新库存"]
|
||||
F -- "药品" --> F3["麻醉师追加药品\n实时计价 更新库存"]
|
||||
F -- "诊疗项目" --> F4["追加麻醉时长/项目\n实时计价"]
|
||||
|
||||
|
||||
F2 --> F6["生成术中追加计费单"]
|
||||
F3 --> F6
|
||||
F4 --> F6
|
||||
|
||||
|
||||
F6 --> G{"患者支付?"}
|
||||
G -- "是" --> P["提示支付成功"]--> J
|
||||
G -- "否" --> H["提示支付失败\n保持待支付"]
|
||||
H --> D
|
||||
|
||||
E -- "否" --> I["手术完成"]
|
||||
I --> J["术后统一结算"]
|
||||
J --> K["发票/清单/分割单"]
|
||||
K --> L["财务对账"]
|
||||
```
|
||||
|
||||
**注意:**待门诊手术安排界面(禅道需求编号:93)完成后再执行
|
||||
|
||||

|
||||
|
||||
图1:门诊手术安排界面(禅道需求编号:93)
|
||||
|
||||

|
||||
|
||||
图2:门诊管理-》门诊划价:手术计费界面复制《门诊划价》界面红色框内容
|
||||
|
||||
1、如上图1、2所示:在门诊手术安排界面增加【计费】按钮,实现对门诊手术中追加的费用进行记账,手术计费界面如图2所示复制《门诊划价》界面红色框内容进行个性化改造,患者信息:取值于手术安排界面选中行的患者信息,计费账号为当前系统登录的账号。
|
||||
|
||||
\*比如:在手术计费界面给患者1计费成功后,重新从手术按钮界面选中患者1点击【计费】打开界面时显示当前患者已计费成功的手术费用。
|
||||
|
||||
写入事务注意:
|
||||
|
||||
adm_charge_item费用项管理表
|
||||
|
||||
①、术中费用仍走“门诊就诊管理”的就诊ID(adm_encounter.id = adm_charge_item.encounter_id)。
|
||||
|
||||
2\. 为了事后能追溯“这些费用是术中发生的”,在费用项管理表明细上加一个 “来源业务单据(SourceBillNo)” 字段(adm_charge_item.generate_source_enum = 2(帐单生成来源为手术计费),SourceBillNo = 手术申请单号)。
|
||||
|
||||
3\. 其他内容按照《门诊划价》的业务数据流程走。
|
||||
|
Before Width: | Height: | Size: 224 KiB After Width: | Height: | Size: 224 KiB |
|
Before Width: | Height: | Size: 219 KiB After Width: | Height: | Size: 219 KiB |
|
Before Width: | Height: | Size: 268 KiB After Width: | Height: | Size: 268 KiB |
|
Before Width: | Height: | Size: 216 KiB After Width: | Height: | Size: 216 KiB |
2
RULES.md
@@ -40,7 +40,7 @@
|
||||
|
||||
**铁律2: Flyway 数据库迁移**
|
||||
- 凡是新建表、新增字段,必须创建 Flyway 迁移脚本
|
||||
- 路径:`healthlink-his-domain/src/main/resources/db/migration/`
|
||||
- 路径:`healthlink-his-application/src/main/resources/db/migration/`
|
||||
- 命名:`V{版本号}__{描述}.sql`(双下划线)
|
||||
|
||||
**铁律3: 测试通过后才提交**
|
||||
|
||||
@@ -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 修复 → 张飞测试 → 华佗验收 → 陈琳归档
|
||||
@@ -1,50 +0,0 @@
|
||||
# Bug #752 修复报告
|
||||
|
||||
## 基本信息
|
||||
- **标题**: Bug #752 测试完成,请验收。提出人: chenxj。
|
||||
- **提出人**: chenxj
|
||||
- **修复时间**: 13:23:23 ~ 13:23:14
|
||||
- **修复耗时**: 1199.6s
|
||||
- **Commit**: `79214ee8b`
|
||||
- **测试结果**: ❌ FAIL
|
||||
|
||||
## 根因分析
|
||||
前端构建成功。验证完成。
|
||||
|
||||
---
|
||||
|
||||
## Bug #752 修复总结
|
||||
|
||||
### 根因
|
||||
`examinationApplication.vue` 中所有 checkbox 组件的 `:true-value="true"` 使用了 JavaScript 布尔值 `true`,但后端 `ExamApply` 实体的 `isUrgent`、`isCharged`、`isRefunded`、`isExec | 文件变更: 无变更 | 阶段: generator:PASS reviewer:PASS qa:PASS verifier:PASS
|
||||
|
||||
## 修复文件
|
||||
.../main/java/com/core/common/utils/DictUtils.java | 40 ++-
|
||||
.../healthlink/his/common/aspectj/DictAspect.java | 20 +-
|
||||
package-lock.json | 381 ---------------------
|
||||
.../PatientManagement/OutpatientRecord.vue | 69 ----
|
||||
|
||||
## 流程时间线
|
||||
| 时间 | 智能体 | 事件 | 状态 | 耗时 |
|
||||
|------|--------|------|------|------|
|
||||
| 22:09:23 | zhugeliang | pre_analyze_done | ✅ | 0.0s |
|
||||
| 08:06:52 | zhaoyun | fix_start | ⏳ | 0.0s |
|
||||
| 08:13:07 | zhaoyun | fix_retry | ❓ | 0.0s |
|
||||
| 08:19:02 | zhaoyun | fix_retry | ❓ | 0.0s |
|
||||
| 08:24:32 | zhaoyun | fix_retry | ❓ | 0.0s |
|
||||
| 08:31:14 | zhaoyun | fix_done | ❌ | 340.9s |
|
||||
| 08:31:16 | zhaoyun | fix_start | ⏳ | 0.0s |
|
||||
| 08:37:06 | zhaoyun | fix_retry | ❓ | 0.0s |
|
||||
| 08:43:01 | zhaoyun | fix_retry | ❓ | 0.0s |
|
||||
| 08:48:57 | zhaoyun | fix_retry | ❓ | 0.0s |
|
||||
| 08:55:04 | zhaoyun | fix_done | ❌ | 281.7s |
|
||||
| 13:02:21 | guanyu | fix_start | ⏳ | 0.0s |
|
||||
| 13:23:14 | guanyu | fix_done | ✅ | 1199.6s |
|
||||
| 13:23:19 | guanyu | verification | ❌ | 4.9s |
|
||||
| 13:23:23 | xunyu | db_review_done | ✅ | 0.0s |
|
||||
| 13:23:23 | guanyu | fix_start | ⏳ | 0.0s |
|
||||
| 13:23:24 | zhugeliang | analyze_done | ✅ | 0.0s |
|
||||
| 13:23:40 | chenlin | doc_done | ✅ | <1s |
|
||||
|
||||
## 全流程
|
||||
诸葛亮分析 → guanyu 修复 → 张飞测试 → 华佗验收 → 陈琳归档
|
||||
@@ -1,61 +0,0 @@
|
||||
# Bug #760 修复报告
|
||||
|
||||
## 基本信息
|
||||
- **标题**: Bug #760 测试完成,请验收。提出人: chenxj。
|
||||
- **提出人**: chenxj
|
||||
- **修复时间**: 11:32:35 ~ 11:32:32
|
||||
- **修复耗时**: 1505.2s
|
||||
- **Commit**: `008ae24b4`
|
||||
- **测试结果**: ❌ FAIL
|
||||
|
||||
## 根因分析
|
||||
全部验证通过 ✅。
|
||||
|
||||
---
|
||||
|
||||
## 修复摘要
|
||||
|
||||
**根因**:`inpatientNurseStation/index.vue` 第57行「护理记录」页签错误渲染了 `Criticalrecord`(危重记录)组件,该组件内部请求了不存在的后端接口 `/nursing/statistics/summary/list`,导致报错。
|
||||
|
||||
**修复**(仅改动 `index.vue` 1个文件,2处修改 | 文件变更: 修改1个 | 阶段: generator:PASS reviewer:PASS qa:PASS verifier:PASS
|
||||
|
||||
## 修复文件
|
||||
.../impl/DoctorStationLabApplyServiceImpl.java | 32 ++++++++++------------
|
||||
|
||||
## 流程时间线
|
||||
| 时间 | 智能体 | 事件 | 状态 | 耗时 |
|
||||
|------|--------|------|------|------|
|
||||
| 14:30:54 | zhugeliang | pre_analyze_done | ✅ | 0.0s |
|
||||
| 15:09:54 | zhugeliang | pre_analyze_done | ✅ | 0.0s |
|
||||
| 15:57:33 | zhugeliang | pre_analyze_done | ✅ | 0.0s |
|
||||
| 21:49:14 | zhugeliang | pre_analyze_done | ✅ | 0.0s |
|
||||
| 21:57:36 | zhaoyun | fix_start | ⏳ | 0.0s |
|
||||
| 21:58:28 | zhaoyun | fix_start | ⏳ | 0.0s |
|
||||
| 03:53:20 | zhaoyun | fix_start | ⏳ | 0.0s |
|
||||
| 03:58:57 | zhaoyun | fix_retry | ❓ | 0.0s |
|
||||
| 04:04:21 | zhaoyun | fix_retry | ❓ | 0.0s |
|
||||
| 04:09:49 | zhaoyun | fix_retry | ❓ | 0.0s |
|
||||
| 04:16:00 | zhaoyun | fix_done | ❌ | 296.1s |
|
||||
| 04:16:09 | zhaoyun | fix_start | ⏳ | 0.0s |
|
||||
| 04:21:18 | zhaoyun | fix_retry | ❓ | 0.0s |
|
||||
| 04:26:52 | zhaoyun | fix_retry | ❓ | 0.0s |
|
||||
| 04:32:34 | zhaoyun | fix_retry | ❓ | 0.0s |
|
||||
| 04:38:30 | zhaoyun | fix_done | ❌ | 285.1s |
|
||||
| 09:01:57 | zhaoyun | fix_start | ⏳ | 0.0s |
|
||||
| 09:07:35 | zhaoyun | fix_retry | ❓ | 0.0s |
|
||||
| 09:13:02 | zhaoyun | fix_retry | ❓ | 0.0s |
|
||||
| 09:18:56 | zhaoyun | fix_retry | ❓ | 0.0s |
|
||||
| 09:24:37 | zhaoyun | fix_done | ❌ | 281.3s |
|
||||
| 09:24:42 | zhaoyun | fix_start | ⏳ | 0.0s |
|
||||
| 09:30:05 | zhaoyun | fix_retry | ❓ | 0.0s |
|
||||
| 09:35:38 | zhaoyun | fix_retry | ❓ | 0.0s |
|
||||
| 09:41:37 | zhaoyun | fix_retry | ❓ | 0.0s |
|
||||
| 09:47:16 | zhaoyun | fix_done | ❌ | 280.2s |
|
||||
| 11:06:38 | zhaoyun | fix_start | ⏳ | 0.0s |
|
||||
| 11:32:32 | zhaoyun | fix_done | ✅ | 1505.2s |
|
||||
| 11:32:35 | zhaoyun | fix_start | ⏳ | 0.0s |
|
||||
| 11:32:39 | zhugeliang | analyze_done | ✅ | 0.0s |
|
||||
| 11:32:42 | chenlin | doc_done | ✅ | <1s |
|
||||
|
||||
## 全流程
|
||||
诸葛亮分析 → guanyu 修复 → 张飞测试 → 华佗验收 → 陈琳归档
|
||||
@@ -1,34 +0,0 @@
|
||||
# Bug #761 修复报告
|
||||
|
||||
## 基本信息
|
||||
- **标题**: Bug #761 测试完成,请验收。提出人: chenxj。
|
||||
- **提出人**: chenxj
|
||||
- **修复时间**: 17:05:05 ~ 17:31:09
|
||||
- **修复耗时**: 1465.3s
|
||||
- **Commit**: `008ae24b4`
|
||||
- **测试结果**: ❌ FAIL
|
||||
|
||||
## 根因分析
|
||||
---
|
||||
|
||||
## Bug #761 修复完成
|
||||
|
||||
**根因**:
|
||||
- `MedicineSummaryAppMapper.xml` 中 `dispenseTime` 字段映射自 `med_medication_dispense.planned_dispense_time`(计划发药时间),而非实际执行时间。`planned_dispense_time` 在 `AdviceProcessAppServi | 文件变更: 无变更 | 阶段: generator:PASS reviewer:PASS qa:PASS verifier:PASS
|
||||
|
||||
## 修复文件
|
||||
.../impl/DoctorStationLabApplyServiceImpl.java | 32 ++++++++++------------
|
||||
|
||||
## 流程时间线
|
||||
| 时间 | 智能体 | 事件 | 状态 | 耗时 |
|
||||
|------|--------|------|------|------|
|
||||
| 14:24:44 | zhugeliang | pre_analyze_done | ✅ | 0.0s |
|
||||
| 15:06:07 | zhugeliang | pre_analyze_done | ✅ | 0.0s |
|
||||
| 15:53:07 | zhugeliang | pre_analyze_done | ✅ | 0.0s |
|
||||
| 17:05:05 | guanyu | fix_start | ⏳ | 0.0s |
|
||||
| 17:31:09 | guanyu | fix_done | ✅ | 1465.3s |
|
||||
| 17:31:21 | zhugeliang | analyze_done | ✅ | 0.0s |
|
||||
| 21:33:09 | chenlin | doc_done | ✅ | <1s |
|
||||
|
||||
## 全流程
|
||||
诸葛亮分析 → guanyu 修复 → 张飞测试 → 华佗验收 → 陈琳归档
|
||||
@@ -1,63 +0,0 @@
|
||||
# Bug #762 修复报告
|
||||
|
||||
## 基本信息
|
||||
- **标题**: Bug #762 测试完成,请验收。提出人: chenxj。
|
||||
- **提出人**: chenxj
|
||||
- **修复时间**: 03:27:34 ~ 03:53:16
|
||||
- **修复耗时**: 264.2s
|
||||
- **Commit**: `008ae24b4`
|
||||
- **测试结果**: ❌ FAIL
|
||||
|
||||
## 根因分析
|
||||
{"type":"thread.started","thread_id":"019ebd60-ee0a-7a60-bb8b-7a2fe4d81b93"}
|
||||
{"type":"turn.started"}
|
||||
{"type":"error","message":"Reconnecting... 1/5 (stream disconnected before completion: error sendin | 文件变更: 无变更 | 阶段: generator:UNKNOWN reviewer:UNKNOWN qa:UNKNOWN verifier:UNKNOWN
|
||||
|
||||
## 修复文件
|
||||
.../impl/DoctorStationLabApplyServiceImpl.java | 32 ++++++++++------------
|
||||
|
||||
## 流程时间线
|
||||
| 时间 | 智能体 | 事件 | 状态 | 耗时 |
|
||||
|------|--------|------|------|------|
|
||||
| 14:05:01 | zhaoyun | fix_start | ⏳ | 0.0s |
|
||||
| 14:06:51 | zhaoyun | fix_start | ⏳ | 0.0s |
|
||||
| 14:19:01 | zhugeliang | pre_analyze_done | ✅ | 0.0s |
|
||||
| 14:59:46 | zhugeliang | pre_analyze_done | ✅ | 0.0s |
|
||||
| 15:01:26 | zhugeliang | pre_analyze_done | ✅ | 0.0s |
|
||||
| 15:45:55 | zhugeliang | pre_analyze_done | ✅ | 0.0s |
|
||||
| 16:22:09 | zhugeliang | pre_analyze_done | ✅ | 0.0s |
|
||||
| 21:38:12 | zhaoyun | fix_start | ⏳ | 0.0s |
|
||||
| 21:43:58 | zhugeliang | pre_analyze_done | ✅ | 0.0s |
|
||||
| 21:58:20 | zhaoyun | fix_start | ⏳ | 0.0s |
|
||||
| 22:13:23 | zhaoyun | fix_start | ⏳ | 0.0s |
|
||||
| 22:46:12 | zhaoyun | fix_retry | ❓ | 0.0s |
|
||||
| 23:13:30 | zhaoyun | fix_start | ⏳ | 0.0s |
|
||||
| 23:37:29 | zhaoyun | fix_retry | ❓ | 0.0s |
|
||||
| 23:37:49 | zhaoyun | fix_done | ✅ | 1375.2s |
|
||||
| 23:37:54 | zhaoyun | fix_start | ⏳ | 0.0s |
|
||||
| 00:16:29 | zhaoyun | fix_done | ✅ | 2230.5s |
|
||||
| 00:16:30 | zhaoyun | fix_start | ⏳ | 0.0s |
|
||||
| 00:22:53 | zhaoyun | fix_retry | ❓ | 0.0s |
|
||||
| 00:48:45 | zhaoyun | fix_start | ⏳ | 0.0s |
|
||||
| 01:18:10 | zhaoyun | fix_done | ✅ | 1685.3s |
|
||||
| 01:18:12 | zhaoyun | fix_start | ⏳ | 0.0s |
|
||||
| 01:47:53 | zhaoyun | fix_done | ✅ | 1690.2s |
|
||||
| 01:48:01 | zhaoyun | fix_start | ⏳ | 0.0s |
|
||||
| 02:22:32 | zhaoyun | fix_done | ✅ | 1970.3s |
|
||||
| 02:22:34 | zhaoyun | fix_start | ⏳ | 0.0s |
|
||||
| 03:01:53 | zhaoyun | fix_done | ✅ | 2285.4s |
|
||||
| 03:02:00 | zhaoyun | fix_start | ⏳ | 0.0s |
|
||||
| 03:09:01 | zhaoyun | fix_retry | ❓ | 0.0s |
|
||||
| 03:15:15 | zhaoyun | fix_retry | ❓ | 0.0s |
|
||||
| 03:21:26 | zhaoyun | fix_retry | ❓ | 0.0s |
|
||||
| 03:27:30 | zhaoyun | fix_done | ❌ | 259.8s |
|
||||
| 03:27:34 | zhaoyun | fix_start | ⏳ | 0.0s |
|
||||
| 03:33:46 | zhaoyun | fix_retry | ❓ | 0.0s |
|
||||
| 03:40:03 | zhaoyun | fix_retry | ❓ | 0.0s |
|
||||
| 03:46:34 | zhaoyun | fix_retry | ❓ | 0.0s |
|
||||
| 03:53:16 | zhaoyun | fix_done | ❌ | 264.2s |
|
||||
| 03:56:31 | zhugeliang | analyze_done | ✅ | 0.0s |
|
||||
| 03:56:35 | chenlin | doc_done | ✅ | <1s |
|
||||
|
||||
## 全流程
|
||||
诸葛亮分析 → guanyu 修复 → 张飞测试 → 华佗验收 → 陈琳归档
|
||||
@@ -1,35 +0,0 @@
|
||||
# Bug #763 修复报告
|
||||
|
||||
## 基本信息
|
||||
- **标题**: Bug #763 测试完成,请验收。提出人: chenxj。
|
||||
- **提出人**: chenxj
|
||||
- **修复时间**: 17:31:18 ~ 18:13:03
|
||||
- **修复耗时**: 1310.2s
|
||||
- **Commit**: `008ae24b4`
|
||||
- **测试结果**: ❌ FAIL
|
||||
|
||||
## 根因分析
|
||||
**编译验证通过 ✅ BUILD SUCCESS**
|
||||
|
||||
## Bug #763 修复验证结果
|
||||
|
||||
**根因确认(诸葛亮分析正确)**:
|
||||
- Bug #665 引入的 `queryWrapper.le("end_time", deadlineTime)` 对 NULL 值处理不当
|
||||
- 住院临时医嘱签发时 `effectiveDoseEnd` 未赋值 → DB 中 `effective_dose_end | 文件变更: 无变更 | 阶段: generator:PASS reviewer:PASS qa:PASS verifier:PASS
|
||||
|
||||
## 修复文件
|
||||
.../impl/DoctorStationLabApplyServiceImpl.java | 32 ++++++++++------------
|
||||
|
||||
## 流程时间线
|
||||
| 时间 | 智能体 | 事件 | 状态 | 耗时 |
|
||||
|------|--------|------|------|------|
|
||||
| 14:06:51 | guanyu | fix_start | ⏳ | 0.0s |
|
||||
| 16:18:32 | zhugeliang | pre_analyze_done | ✅ | 0.0s |
|
||||
| 17:31:18 | guanyu | fix_start | ⏳ | 0.0s |
|
||||
| 17:48:37 | guanyu | fix_retry | ❓ | 0.0s |
|
||||
| 18:13:03 | guanyu | fix_done | ✅ | 1310.2s |
|
||||
| 18:13:16 | zhugeliang | analyze_done | ✅ | 0.0s |
|
||||
| 21:33:23 | chenlin | doc_done | ✅ | <1s |
|
||||
|
||||
## 全流程
|
||||
诸葛亮分析 → guanyu 修复 → 张飞测试 → 华佗验收 → 陈琳归档
|
||||
@@ -1,32 +0,0 @@
|
||||
# Bug #764 修复报告
|
||||
|
||||
## 基本信息
|
||||
- **标题**: Bug #764 测试完成,请验收。提出人: chenxj。
|
||||
- **提出人**: chenxj
|
||||
- **修复时间**: 18:13:10 ~ 18:36:37
|
||||
- **修复耗时**: 1285.2s
|
||||
- **Commit**: `008ae24b4`
|
||||
- **测试结果**: ❌ FAIL
|
||||
|
||||
## 根因分析
|
||||
**修复完成** ✅
|
||||
|
||||
修改文件:`healthlink-his-server/healthlink-his-application/src/main/java/com/healthlink/his/web/doctorstation/appservice/impl/DoctorStationLabApplyServiceImpl.java`
|
||||
|
||||
核心改动:将门诊医嘱创建阶段的检验项目定义查询从 ` | 文件变更: 无变更 | 阶段: generator:PASS reviewer:PASS qa:PASS verifier:PASS
|
||||
|
||||
## 修复文件
|
||||
.../impl/DoctorStationLabApplyServiceImpl.java | 32 ++++++++++------------
|
||||
|
||||
## 流程时间线
|
||||
| 时间 | 智能体 | 事件 | 状态 | 耗时 |
|
||||
|------|--------|------|------|------|
|
||||
| 16:05:49 | zhugeliang | pre_analyze_done | ✅ | 0.0s |
|
||||
| 18:13:10 | guanyu | fix_start | ⏳ | 0.0s |
|
||||
| 18:36:37 | guanyu | fix_done | ✅ | 1285.2s |
|
||||
| 18:36:49 | zhugeliang | analyze_done | ✅ | 0.0s |
|
||||
| 21:33:06 | xunyu | db_review_done | ✅ | 0.0s |
|
||||
| 21:33:52 | chenlin | doc_done | ✅ | <1s |
|
||||
|
||||
## 全流程
|
||||
诸葛亮分析 → guanyu 修复 → 张飞测试 → 华佗验收 → 陈琳归档
|
||||
@@ -1,34 +0,0 @@
|
||||
# Bug #765 修复报告
|
||||
|
||||
## 基本信息
|
||||
- **标题**: Bug #765 测试完成,请验收。提出人: chenxj。
|
||||
- **提出人**: chenxj
|
||||
- **修复时间**: 18:36:43 ~ 19:01:34
|
||||
- **修复耗时**: 1410.2s
|
||||
- **Commit**: `008ae24b4`
|
||||
- **测试结果**: ✅ PASS
|
||||
|
||||
## 根因分析
|
||||
✅ **编译成功**,`✓ built in 1m 55s`,0 错误。
|
||||
|
||||
---
|
||||
|
||||
## 修复摘要
|
||||
|
||||
**根因**:`selsectPatient` 函数(第 2228 行)只做了患者信息回填(`Object.assign` + 逐字段赋值),没有关闭 `showPopover`。由于 `@mousedown.prevent` 阻止了 input 失焦,`handleBlur` 中的 `show | 文件变更: 无变更 | 阶段: generator:PASS reviewer:PASS qa:PASS verifier:PASS
|
||||
|
||||
## 修复文件
|
||||
.../impl/DoctorStationLabApplyServiceImpl.java | 32 ++++++++++------------
|
||||
|
||||
## 流程时间线
|
||||
| 时间 | 智能体 | 事件 | 状态 | 耗时 |
|
||||
|------|--------|------|------|------|
|
||||
| 15:59:27 | zhugeliang | pre_analyze_done | ✅ | 0.0s |
|
||||
| 18:36:43 | guanyu | fix_start | ⏳ | 0.0s |
|
||||
| 19:01:34 | guanyu | fix_done | ✅ | 1410.2s |
|
||||
| 19:01:44 | zhugeliang | analyze_done | ✅ | 0.0s |
|
||||
| 21:33:38 | zhangfei | test_done | ✅ | 0.0s |
|
||||
| 21:33:38 | chenlin | doc_done | ✅ | <1s |
|
||||
|
||||
## 全流程
|
||||
诸葛亮分析 → guanyu 修复 → 张飞测试 → 华佗验收 → 陈琳归档
|
||||
@@ -40,7 +40,7 @@
|
||||
|
||||
**铁律2: Flyway 数据库迁移**
|
||||
- 凡是新建表、新增字段,必须创建 Flyway 迁移脚本
|
||||
- 路径:`healthlink-his-domain/src/main/resources/db/migration/`
|
||||
- 路径:`healthlink-his-application/src/main/resources/db/migration/`
|
||||
- 命名:`V{版本号}__{描述}.sql`(双下划线)
|
||||
|
||||
**铁律3: 测试通过后才提交**
|
||||
|
||||
@@ -26,6 +26,18 @@ public class SysMenuController extends BaseController {
|
||||
@Autowired
|
||||
private ISysMenuService menuService;
|
||||
|
||||
/**
|
||||
* 获取当前用户可访问的菜单树(无需管理员权限)
|
||||
* 用于功能配置页面,让普通用户也能选择自己有权限的菜单
|
||||
*/
|
||||
@GetMapping("/userMenus")
|
||||
public AjaxResult userMenus() {
|
||||
Long userId = getUserId();
|
||||
List<SysMenu> menus = menuService.selectMenuList(new SysMenu(), userId);
|
||||
List<SysMenu> menuTreeWithFullPath = menuService.buildMenuTreeWithFullPath(menus);
|
||||
return success(menuTreeWithFullPath);
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取菜单列表
|
||||
*/
|
||||
@@ -42,7 +54,7 @@ public class SysMenuController extends BaseController {
|
||||
* 根据菜单编号获取详细信息
|
||||
*/
|
||||
@PreAuthorize("@ss.hasPermi('system:menu:query')")
|
||||
@GetMapping(value = "/{menuId}")
|
||||
@GetMapping(value = "/{menuId:\\d+}")
|
||||
public AjaxResult getInfo(@PathVariable Long menuId) {
|
||||
return success(menuService.selectMenuById(menuId));
|
||||
}
|
||||
|
||||
@@ -110,9 +110,9 @@
|
||||
</dependency>
|
||||
|
||||
<!-- JSON工具类 -->
|
||||
<!-- JSON工具类 -->
|
||||
<!-- JSON工具类 -->
|
||||
<dependency>
|
||||
<groupId>com.fasterxml.jackson.core</groupId>
|
||||
<groupId>tools.jackson.core</groupId>
|
||||
<artifactId>jackson-databind</artifactId>
|
||||
</dependency>
|
||||
|
||||
|
||||
@@ -3,7 +3,7 @@ package com.core.common.annotation;
|
||||
import com.core.common.config.serializer.SensitiveJsonSerializer;
|
||||
import com.core.common.enums.DesensitizedType;
|
||||
import com.fasterxml.jackson.annotation.JacksonAnnotationsInside;
|
||||
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
|
||||
import tools.jackson.databind.annotation.JsonSerialize;
|
||||
|
||||
import java.lang.annotation.ElementType;
|
||||
import java.lang.annotation.Retention;
|
||||
|
||||
@@ -4,14 +4,13 @@ import com.core.common.annotation.Sensitive;
|
||||
import com.core.common.core.domain.model.LoginUser;
|
||||
import com.core.common.enums.DesensitizedType;
|
||||
import com.core.common.utils.SecurityUtils;
|
||||
import com.fasterxml.jackson.core.JsonGenerator;
|
||||
import com.fasterxml.jackson.databind.BeanProperty;
|
||||
import com.fasterxml.jackson.databind.JsonMappingException;
|
||||
import com.fasterxml.jackson.databind.JsonSerializer;
|
||||
import com.fasterxml.jackson.databind.SerializerProvider;
|
||||
import com.fasterxml.jackson.databind.ser.ContextualSerializer;
|
||||
import tools.jackson.core.JacksonException;
|
||||
import tools.jackson.core.JsonGenerator;
|
||||
import tools.jackson.databind.BeanProperty;
|
||||
import tools.jackson.databind.DatabindException;
|
||||
import tools.jackson.databind.ValueSerializer;
|
||||
import tools.jackson.databind.SerializationContext;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.util.Objects;
|
||||
|
||||
/**
|
||||
@@ -19,11 +18,11 @@ import java.util.Objects;
|
||||
*
|
||||
* @author system
|
||||
*/
|
||||
public class SensitiveJsonSerializer extends JsonSerializer<String> implements ContextualSerializer {
|
||||
public class SensitiveJsonSerializer extends ValueSerializer<String> {
|
||||
private DesensitizedType desensitizedType;
|
||||
|
||||
@Override
|
||||
public void serialize(String value, JsonGenerator gen, SerializerProvider serializers) throws IOException {
|
||||
public void serialize(String value, JsonGenerator gen, SerializationContext serializers) throws JacksonException {
|
||||
if (desensitization()) {
|
||||
gen.writeString(desensitizedType.desensitizer().apply(value));
|
||||
} else {
|
||||
@@ -32,14 +31,14 @@ public class SensitiveJsonSerializer extends JsonSerializer<String> implements C
|
||||
}
|
||||
|
||||
@Override
|
||||
public JsonSerializer<?> createContextual(SerializerProvider prov, BeanProperty property)
|
||||
throws JsonMappingException {
|
||||
public ValueSerializer<?> createContextual(SerializationContext prov, BeanProperty property)
|
||||
throws DatabindException {
|
||||
Sensitive annotation = property.getAnnotation(Sensitive.class);
|
||||
if (Objects.nonNull(annotation) && Objects.equals(String.class, property.getType().getRawClass())) {
|
||||
this.desensitizedType = annotation.desensitizedType();
|
||||
return this;
|
||||
}
|
||||
return prov.findValueSerializer(property.getType(), property);
|
||||
return prov.findPrimaryPropertySerializer(property.getType(), property);
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -9,8 +9,8 @@ import com.core.common.annotation.Excel.Type;
|
||||
import com.core.common.annotation.Excels;
|
||||
import com.core.common.core.domain.BaseEntity;
|
||||
import com.core.common.xss.Xss;
|
||||
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
|
||||
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
|
||||
import tools.jackson.databind.annotation.JsonSerialize;
|
||||
import tools.jackson.databind.ser.std.ToStringSerializer;
|
||||
import lombok.Data;
|
||||
import org.apache.commons.lang3.builder.ToStringBuilder;
|
||||
import org.apache.commons.lang3.builder.ToStringStyle;
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
package com.core.common.filter;
|
||||
|
||||
import com.fasterxml.jackson.annotation.JsonFilter;
|
||||
import com.fasterxml.jackson.databind.ser.FilterProvider;
|
||||
import com.fasterxml.jackson.databind.ser.impl.SimpleBeanPropertyFilter;
|
||||
import com.fasterxml.jackson.databind.ser.impl.SimpleFilterProvider;
|
||||
import tools.jackson.databind.ser.FilterProvider;
|
||||
import tools.jackson.databind.ser.std.SimpleBeanPropertyFilter;
|
||||
import tools.jackson.databind.ser.std.SimpleFilterProvider;
|
||||
import org.apache.commons.lang3.ArrayUtils;
|
||||
|
||||
import java.util.HashSet;
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
package com.core.common.utils;
|
||||
|
||||
import com.fasterxml.jackson.core.type.TypeReference;
|
||||
import com.fasterxml.jackson.databind.ObjectMapper;
|
||||
import tools.jackson.core.type.TypeReference;
|
||||
import tools.jackson.databind.ObjectMapper;
|
||||
import com.core.common.constant.CacheConstants;
|
||||
import com.core.common.core.domain.entity.SysDictData;
|
||||
import com.core.common.core.redis.RedisCache;
|
||||
|
||||
@@ -1,11 +1,12 @@
|
||||
package com.core.common.utils;
|
||||
|
||||
import com.fasterxml.jackson.core.JsonProcessingException;
|
||||
import com.fasterxml.jackson.core.type.TypeReference;
|
||||
import com.fasterxml.jackson.databind.DeserializationFeature;
|
||||
import com.fasterxml.jackson.databind.JsonNode;
|
||||
import com.fasterxml.jackson.databind.ObjectMapper;
|
||||
import com.fasterxml.jackson.databind.SerializationFeature;
|
||||
import tools.jackson.core.JacksonException;
|
||||
import tools.jackson.core.type.TypeReference;
|
||||
import tools.jackson.databind.DeserializationFeature;
|
||||
import tools.jackson.databind.JsonNode;
|
||||
import tools.jackson.databind.ObjectMapper;
|
||||
import tools.jackson.databind.SerializationFeature;
|
||||
import tools.jackson.databind.json.JsonMapper;
|
||||
|
||||
/**
|
||||
* Jackson JSON 工具类
|
||||
@@ -13,12 +14,10 @@ import com.fasterxml.jackson.databind.SerializationFeature;
|
||||
* @author system
|
||||
*/
|
||||
public class JsonUtils {
|
||||
private static final ObjectMapper MAPPER = new ObjectMapper();
|
||||
|
||||
static {
|
||||
MAPPER.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
|
||||
MAPPER.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false);
|
||||
}
|
||||
private static final ObjectMapper MAPPER = JsonMapper.builder()
|
||||
.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES)
|
||||
.disable(SerializationFeature.FAIL_ON_EMPTY_BEANS)
|
||||
.build();
|
||||
|
||||
public static ObjectMapper getMapper() {
|
||||
return MAPPER;
|
||||
@@ -27,7 +26,7 @@ public class JsonUtils {
|
||||
public static String toJson(Object obj) {
|
||||
try {
|
||||
return MAPPER.writeValueAsString(obj);
|
||||
} catch (JsonProcessingException e) {
|
||||
} catch (JacksonException e) {
|
||||
return "{}";
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
package com.core.common.utils.ip;
|
||||
|
||||
import com.fasterxml.jackson.databind.ObjectMapper;
|
||||
import tools.jackson.databind.ObjectMapper;
|
||||
import com.core.common.utils.JsonUtils;
|
||||
import com.fasterxml.jackson.databind.JsonNode;
|
||||
import tools.jackson.databind.JsonNode;
|
||||
import com.core.common.config.CoreConfig;
|
||||
import com.core.common.constant.Constants;
|
||||
import com.core.common.utils.StringUtils;
|
||||
|
||||
@@ -34,7 +34,7 @@
|
||||
|
||||
<!-- JSON工具类 -->
|
||||
<dependency>
|
||||
<groupId>com.fasterxml.jackson.core</groupId>
|
||||
<groupId>tools.jackson.core</groupId>
|
||||
<artifactId>jackson-databind</artifactId>
|
||||
</dependency>
|
||||
|
||||
|
||||
@@ -1,11 +1,11 @@
|
||||
package com.core.flowable.service.impl;
|
||||
|
||||
import com.core.common.utils.JsonUtils;
|
||||
import com.fasterxml.jackson.databind.ObjectMapper;
|
||||
import com.fasterxml.jackson.databind.node.ObjectNode;
|
||||
import com.fasterxml.jackson.databind.node.ArrayNode;
|
||||
import com.fasterxml.jackson.databind.JsonNode;
|
||||
import com.fasterxml.jackson.core.type.TypeReference;
|
||||
import tools.jackson.databind.ObjectMapper;
|
||||
import tools.jackson.databind.node.ObjectNode;
|
||||
import tools.jackson.databind.node.ArrayNode;
|
||||
import tools.jackson.databind.JsonNode;
|
||||
import tools.jackson.core.type.TypeReference;
|
||||
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
||||
import com.core.common.core.domain.AjaxResult;
|
||||
import com.core.common.core.domain.entity.SysRole;
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
package com.core.framework.aspectj;
|
||||
|
||||
import com.fasterxml.jackson.databind.ObjectMapper;
|
||||
import tools.jackson.databind.ObjectMapper;
|
||||
import com.core.common.utils.JsonUtils;
|
||||
import com.core.common.annotation.Log;
|
||||
import com.core.common.core.domain.entity.SysUser;
|
||||
|
||||
@@ -1,51 +1,77 @@
|
||||
package com.core.framework.config;
|
||||
|
||||
import com.fasterxml.jackson.core.JsonParser;
|
||||
import com.fasterxml.jackson.databind.DeserializationContext;
|
||||
import com.fasterxml.jackson.databind.JsonDeserializer;
|
||||
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
|
||||
import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer;
|
||||
|
||||
import org.mybatis.spring.annotation.MapperScan;
|
||||
import org.springframework.boot.jackson2.autoconfigure.Jackson2ObjectMapperBuilderCustomizer;
|
||||
import org.springframework.boot.jackson.autoconfigure.JsonMapperBuilderCustomizer;
|
||||
import org.springframework.context.annotation.Bean;
|
||||
import org.springframework.context.annotation.Configuration;
|
||||
import org.springframework.context.annotation.EnableAspectJAutoProxy;
|
||||
import tools.jackson.core.JacksonException;
|
||||
import tools.jackson.core.JsonParser;
|
||||
import tools.jackson.core.JsonGenerator;
|
||||
import tools.jackson.databind.DeserializationContext;
|
||||
import tools.jackson.databind.SerializationContext;
|
||||
import tools.jackson.databind.ValueDeserializer;
|
||||
import tools.jackson.databind.ValueSerializer;
|
||||
import tools.jackson.databind.module.SimpleModule;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.text.SimpleDateFormat;
|
||||
import java.util.TimeZone;
|
||||
import java.time.LocalDateTime;
|
||||
import java.time.format.DateTimeFormatter;
|
||||
import java.util.TimeZone;
|
||||
|
||||
@Configuration
|
||||
@EnableAspectJAutoProxy(exposeProxy = true)
|
||||
@MapperScan({"com.core.**.mapper", "com.healthlink.his.**.mapper"})
|
||||
public class ApplicationConfig {
|
||||
|
||||
private static final JsonDeserializer<LocalDateTime> LOCAL_DATE_TIME_DESERIALIZER = new JsonDeserializer<>() {
|
||||
private static final DateTimeFormatter ISO_FORMATTER = DateTimeFormatter.ISO_LOCAL_DATE_TIME;
|
||||
private static final DateTimeFormatter SIMPLE_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
|
||||
private static final DateTimeFormatter SLASH_FORMATTER = DateTimeFormatter.ofPattern("yyyy/M/d HH:mm:ss");
|
||||
private static final DateTimeFormatter FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
|
||||
private static final DateTimeFormatter ISO_FORMATTER = DateTimeFormatter.ISO_LOCAL_DATE_TIME;
|
||||
private static final DateTimeFormatter SLASH_FORMATTER = DateTimeFormatter.ofPattern("yyyy/M/d HH:mm:ss");
|
||||
|
||||
@Override
|
||||
public LocalDateTime deserialize(JsonParser p, DeserializationContext context) throws IOException {
|
||||
String text = p.getText();
|
||||
if (text == null || text.isEmpty()) return null;
|
||||
String cleaned = text.replaceAll("[Zz]$", "").replaceAll("[+-]\\d{2}:?\\d{2}$", "");
|
||||
try { return LocalDateTime.parse(cleaned, ISO_FORMATTER); } catch (Exception ignored) {}
|
||||
try { return LocalDateTime.parse(cleaned, SIMPLE_FORMATTER); } catch (Exception ignored) {}
|
||||
return LocalDateTime.parse(cleaned, SLASH_FORMATTER);
|
||||
}
|
||||
};
|
||||
private static final ValueDeserializer<LocalDateTime> LOCAL_DATE_TIME_DESERIALIZER =
|
||||
new ValueDeserializer<LocalDateTime>() {
|
||||
@Override
|
||||
public LocalDateTime deserialize(JsonParser p, DeserializationContext context) throws JacksonException {
|
||||
String text = p.getText();
|
||||
if (text == null || text.isEmpty()) return null;
|
||||
String cleaned = text.replaceAll("[Zz]$", "").replaceAll("[+-]\\d{2}:?\\d{2}$", "");
|
||||
try { return LocalDateTime.parse(cleaned, ISO_FORMATTER); } catch (Exception ignored) {}
|
||||
try { return LocalDateTime.parse(cleaned, FORMATTER); } catch (Exception ignored) {}
|
||||
return LocalDateTime.parse(cleaned, SLASH_FORMATTER);
|
||||
}
|
||||
};
|
||||
|
||||
private static final ValueSerializer<LocalDateTime> LOCAL_DATE_TIME_SERIALIZER =
|
||||
new ValueSerializer<LocalDateTime>() {
|
||||
@Override
|
||||
public void serialize(LocalDateTime value, JsonGenerator gen, SerializationContext ctx) throws JacksonException {
|
||||
gen.writeString(value.format(FORMATTER));
|
||||
}
|
||||
|
||||
@Override
|
||||
public Class<LocalDateTime> handledType() {
|
||||
return LocalDateTime.class;
|
||||
}
|
||||
};
|
||||
|
||||
@Bean
|
||||
public Jackson2ObjectMapperBuilderCustomizer jacksonObjectMapperCustomization() {
|
||||
public JsonMapperBuilderCustomizer jacksonObjectMapperCustomization() {
|
||||
return builder -> {
|
||||
builder.timeZone(TimeZone.getDefault());
|
||||
builder.simpleDateFormat("yyyy-MM-dd HH:mm:ss");
|
||||
JavaTimeModule javaTimeModule = new JavaTimeModule();
|
||||
javaTimeModule.addDeserializer(LocalDateTime.class, LOCAL_DATE_TIME_DESERIALIZER);
|
||||
builder.modules(javaTimeModule);
|
||||
builder.serializerByType(LocalDateTime.class, new LocalDateTimeSerializer(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
|
||||
builder.defaultTimeZone(TimeZone.getDefault());
|
||||
builder.defaultDateFormat(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"));
|
||||
SimpleModule module = new SimpleModule("HealthLinkLocalDateTime");
|
||||
module.addDeserializer(LocalDateTime.class, LOCAL_DATE_TIME_DESERIALIZER);
|
||||
module.addSerializer(LocalDateTime.class, LOCAL_DATE_TIME_SERIALIZER);
|
||||
module.addSerializer(java.sql.Date.class, new ValueSerializer<java.sql.Date>() {
|
||||
private final SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
|
||||
@Override
|
||||
public void serialize(java.sql.Date value, JsonGenerator gen, SerializationContext ctx) throws JacksonException {
|
||||
gen.writeString(sdf.format(value));
|
||||
}
|
||||
});
|
||||
builder.addModule(module);
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,7 +1,10 @@
|
||||
package com.core.framework.config;
|
||||
|
||||
import com.fasterxml.jackson.databind.ObjectMapper;
|
||||
import com.fasterxml.jackson.databind.jsontype.impl.LaissezFaireSubTypeValidator;
|
||||
import tools.jackson.databind.DefaultTyping;
|
||||
import tools.jackson.databind.ObjectMapper;
|
||||
import tools.jackson.databind.jsontype.BasicPolymorphicTypeValidator;
|
||||
import tools.jackson.databind.jsontype.PolymorphicTypeValidator;
|
||||
import tools.jackson.databind.json.JsonMapper;
|
||||
import com.fasterxml.jackson.annotation.JsonAutoDetect;
|
||||
import com.fasterxml.jackson.annotation.PropertyAccessor;
|
||||
import org.slf4j.Logger;
|
||||
@@ -10,16 +13,17 @@ import org.springframework.data.redis.serializer.RedisSerializer;
|
||||
import org.springframework.data.redis.serializer.SerializationException;
|
||||
|
||||
import java.nio.charset.Charset;
|
||||
import java.nio.charset.StandardCharsets;
|
||||
import java.util.LinkedHashMap;
|
||||
|
||||
/**
|
||||
* Redis序列化器 - 兼容fastjson2旧格式
|
||||
* Redis序列化器 - 兼容fastjson2旧格式(Jackson 3 迁移版)
|
||||
*
|
||||
* @author system
|
||||
*/
|
||||
public class FastJson2JsonRedisSerializer<T> implements RedisSerializer<T> {
|
||||
private static final Logger log = LoggerFactory.getLogger(FastJson2JsonRedisSerializer.class);
|
||||
public static final Charset DEFAULT_CHARSET = Charset.forName("UTF-8");
|
||||
public static final Charset DEFAULT_CHARSET = StandardCharsets.UTF_8;
|
||||
|
||||
/** 新格式: 带类型信息 (activateDefaultTyping) */
|
||||
private final ObjectMapper typedMapper;
|
||||
@@ -31,16 +35,21 @@ public class FastJson2JsonRedisSerializer<T> implements RedisSerializer<T> {
|
||||
super();
|
||||
this.clazz = clazz;
|
||||
|
||||
// Jackson 3: 用 BasicPolymorphicTypeValidator 替代 LaissezFaireSubTypeValidator
|
||||
PolymorphicTypeValidator ptv = BasicPolymorphicTypeValidator.builder()
|
||||
.allowIfBaseType(Object.class)
|
||||
.build();
|
||||
|
||||
// 新格式 ObjectMapper (带类型信息)
|
||||
this.typedMapper = new ObjectMapper();
|
||||
this.typedMapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
|
||||
this.typedMapper.activateDefaultTyping(
|
||||
LaissezFaireSubTypeValidator.instance,
|
||||
ObjectMapper.DefaultTyping.NON_FINAL);
|
||||
this.typedMapper = JsonMapper.builder()
|
||||
.changeDefaultVisibility(vc -> vc.withVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY))
|
||||
.activateDefaultTyping(ptv, DefaultTyping.NON_FINAL)
|
||||
.build();
|
||||
|
||||
// 旧格式 ObjectMapper (不带类型信息)
|
||||
this.plainMapper = new ObjectMapper();
|
||||
this.plainMapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
|
||||
this.plainMapper = JsonMapper.builder()
|
||||
.changeDefaultVisibility(vc -> vc.withVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY))
|
||||
.build();
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -75,4 +84,4 @@ public class FastJson2JsonRedisSerializer<T> implements RedisSerializer<T> {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2,8 +2,10 @@ package com.core.framework.config;
|
||||
|
||||
import com.fasterxml.jackson.annotation.JsonAutoDetect;
|
||||
import com.fasterxml.jackson.annotation.PropertyAccessor;
|
||||
import com.fasterxml.jackson.databind.DeserializationFeature;
|
||||
import com.fasterxml.jackson.databind.ObjectMapper;
|
||||
import tools.jackson.databind.DeserializationFeature;
|
||||
import tools.jackson.databind.JsonNode;
|
||||
import tools.jackson.databind.ObjectMapper;
|
||||
import tools.jackson.databind.json.JsonMapper;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
import org.springframework.data.redis.serializer.RedisSerializer;
|
||||
@@ -12,7 +14,7 @@ import org.springframework.data.redis.serializer.SerializationException;
|
||||
import java.nio.charset.StandardCharsets;
|
||||
|
||||
/**
|
||||
* Jackson Redis序列化器 - 兼容fastjson旧格式
|
||||
* Jackson Redis序列化器 - 兼容fastjson旧格式(Jackson 3 迁移版)
|
||||
*
|
||||
* 新数据: 纯JSON (无类型包装),调用方用 convertValue 转换
|
||||
* 旧fastjson: 去除L后缀后按JSON解析
|
||||
@@ -30,10 +32,10 @@ public class FastjsonCompatibleRedisSerializer implements RedisSerializer<Object
|
||||
}
|
||||
|
||||
private static ObjectMapper createMapper() {
|
||||
ObjectMapper mapper = new ObjectMapper();
|
||||
mapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
|
||||
mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
|
||||
return mapper;
|
||||
return JsonMapper.builder()
|
||||
.changeDefaultVisibility(vc -> vc.withVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY))
|
||||
.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES)
|
||||
.build();
|
||||
}
|
||||
|
||||
/** 获取共享ObjectMapper,供 DictUtils / TokenService 等做 convertValue */
|
||||
@@ -64,7 +66,7 @@ public class FastjsonCompatibleRedisSerializer implements RedisSerializer<Object
|
||||
try {
|
||||
// 处理旧Jackson activateDefaultTyping格式: ["className", {data}]
|
||||
if (cleaned.startsWith("[\"") && cleaned.length() > 10) {
|
||||
com.fasterxml.jackson.databind.JsonNode node = objectMapper.readTree(cleaned);
|
||||
JsonNode node = objectMapper.readTree(cleaned);
|
||||
if (node.isArray() && node.size() >= 2 && node.get(0).isTextual()) {
|
||||
// 取data部分(第2个元素),忽略className
|
||||
return objectMapper.treeToValue(node.get(1), Object.class);
|
||||
@@ -76,4 +78,4 @@ public class FastjsonCompatibleRedisSerializer implements RedisSerializer<Object
|
||||
return null;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
package com.core.framework.interceptor;
|
||||
|
||||
import com.fasterxml.jackson.databind.ObjectMapper;
|
||||
import tools.jackson.databind.ObjectMapper;
|
||||
import com.core.common.utils.JsonUtils;
|
||||
import com.core.common.annotation.RepeatSubmit;
|
||||
import com.core.common.core.domain.AjaxResult;
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
package com.core.framework.interceptor.impl;
|
||||
|
||||
import com.fasterxml.jackson.databind.ObjectMapper;
|
||||
import tools.jackson.databind.ObjectMapper;
|
||||
import com.core.common.utils.JsonUtils;
|
||||
import com.core.common.annotation.RepeatSubmit;
|
||||
import com.core.common.constant.CacheConstants;
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
package com.core.framework.security.handle;
|
||||
|
||||
import com.fasterxml.jackson.databind.ObjectMapper;
|
||||
import tools.jackson.databind.ObjectMapper;
|
||||
import com.core.common.utils.JsonUtils;
|
||||
import com.core.common.constant.HttpStatus;
|
||||
import com.core.common.core.domain.AjaxResult;
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
package com.core.framework.security.handle;
|
||||
|
||||
import com.fasterxml.jackson.databind.ObjectMapper;
|
||||
import tools.jackson.databind.ObjectMapper;
|
||||
import com.core.common.utils.JsonUtils;
|
||||
import com.core.common.constant.Constants;
|
||||
import com.core.common.core.domain.AjaxResult;
|
||||
|
||||
@@ -71,17 +71,19 @@ public class TokenService {
|
||||
if (cached instanceof java.util.List<?> list && list.size() >= 2 && list.get(0) instanceof String) {
|
||||
Object data = list.get(1);
|
||||
if (data instanceof java.util.Map) {
|
||||
com.fasterxml.jackson.databind.ObjectMapper mapper =
|
||||
new com.fasterxml.jackson.databind.ObjectMapper();
|
||||
mapper.configure(com.fasterxml.jackson.databind.DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
|
||||
tools.jackson.databind.ObjectMapper mapper =
|
||||
tools.jackson.databind.json.JsonMapper.builder()
|
||||
.disable(tools.jackson.databind.DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES)
|
||||
.build();
|
||||
return mapper.convertValue(data, LoginUser.class);
|
||||
}
|
||||
}
|
||||
// 兼容纯JSON格式: LinkedHashMap -> LoginUser
|
||||
if (cached instanceof java.util.Map) {
|
||||
com.fasterxml.jackson.databind.ObjectMapper mapper =
|
||||
new com.fasterxml.jackson.databind.ObjectMapper();
|
||||
mapper.configure(com.fasterxml.jackson.databind.DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
|
||||
tools.jackson.databind.ObjectMapper mapper =
|
||||
tools.jackson.databind.json.JsonMapper.builder()
|
||||
.disable(tools.jackson.databind.DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES)
|
||||
.build();
|
||||
return mapper.convertValue(cached, LoginUser.class);
|
||||
}
|
||||
return null;
|
||||
|
||||
@@ -61,7 +61,7 @@
|
||||
|
||||
<!-- JSON工具类 -->
|
||||
<dependency>
|
||||
<groupId>com.fasterxml.jackson.core</groupId>
|
||||
<groupId>tools.jackson.core</groupId>
|
||||
<artifactId>jackson-databind</artifactId>
|
||||
</dependency>
|
||||
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
package com.core.generator.service;
|
||||
|
||||
import com.fasterxml.jackson.databind.ObjectMapper;
|
||||
import tools.jackson.databind.ObjectMapper;
|
||||
import com.core.common.utils.JsonUtils;
|
||||
import com.fasterxml.jackson.databind.JsonNode;
|
||||
import tools.jackson.databind.JsonNode;
|
||||
import com.core.common.constant.Constants;
|
||||
import com.core.common.constant.GenConstants;
|
||||
import com.core.common.core.text.CharsetKit;
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
package com.core.generator.util;
|
||||
|
||||
import com.fasterxml.jackson.databind.ObjectMapper;
|
||||
import tools.jackson.databind.ObjectMapper;
|
||||
import com.core.common.utils.JsonUtils;
|
||||
import com.fasterxml.jackson.databind.JsonNode;
|
||||
import tools.jackson.databind.JsonNode;
|
||||
import com.core.common.constant.GenConstants;
|
||||
import com.core.common.utils.DateUtils;
|
||||
import com.core.common.utils.StringUtils;
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
package com.core.system.domain;
|
||||
|
||||
import com.core.common.core.domain.BaseEntity;
|
||||
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
|
||||
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
|
||||
import tools.jackson.databind.annotation.JsonSerialize;
|
||||
import tools.jackson.databind.ser.std.ToStringSerializer;
|
||||
|
||||
/**
|
||||
* 公告/通知已读记录 sys_notice_read
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
package com.healthlink.his.web.Inspection.dto;
|
||||
|
||||
import com.fasterxml.jackson.annotation.JsonFormat;
|
||||
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
|
||||
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
|
||||
import tools.jackson.databind.annotation.JsonSerialize;
|
||||
import tools.jackson.databind.ser.std.ToStringSerializer;
|
||||
import com.healthlink.his.common.annotation.Dict;
|
||||
import lombok.Data;
|
||||
import lombok.experimental.Accessors;
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
package com.healthlink.his.web.Inspection.dto;
|
||||
|
||||
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
|
||||
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
|
||||
import tools.jackson.databind.annotation.JsonSerialize;
|
||||
import tools.jackson.databind.ser.std.ToStringSerializer;
|
||||
import com.healthlink.his.lab.domain.ActivityDefDeviceDef;
|
||||
import com.healthlink.his.lab.domain.ActivityDefObservationDef;
|
||||
import com.healthlink.his.lab.domain.ActivityDefSpecimenDef;
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
package com.healthlink.his.web.Inspection.dto;
|
||||
|
||||
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
|
||||
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
|
||||
import tools.jackson.databind.annotation.JsonSerialize;
|
||||
import tools.jackson.databind.ser.std.ToStringSerializer;
|
||||
import com.healthlink.his.common.annotation.Dict;
|
||||
import lombok.Data;
|
||||
import lombok.experimental.Accessors;
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
package com.healthlink.his.web.Inspection.dto;
|
||||
|
||||
import com.fasterxml.jackson.annotation.JsonFormat;
|
||||
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
|
||||
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
|
||||
import tools.jackson.databind.annotation.JsonSerialize;
|
||||
import tools.jackson.databind.ser.std.ToStringSerializer;
|
||||
import lombok.Data;
|
||||
|
||||
/**
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
package com.healthlink.his.web.Inspection.dto;
|
||||
|
||||
import com.fasterxml.jackson.annotation.JsonFormat;
|
||||
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
|
||||
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
|
||||
import tools.jackson.databind.annotation.JsonSerialize;
|
||||
import tools.jackson.databind.ser.std.ToStringSerializer;
|
||||
import lombok.Data;
|
||||
|
||||
import java.util.Date;
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
package com.healthlink.his.web.Inspection.dto;
|
||||
|
||||
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
|
||||
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
|
||||
import tools.jackson.databind.annotation.JsonSerialize;
|
||||
import tools.jackson.databind.ser.std.ToStringSerializer;
|
||||
import lombok.Data;
|
||||
import lombok.experimental.Accessors;
|
||||
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
package com.healthlink.his.web.adjustprice.dto;
|
||||
|
||||
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
|
||||
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
|
||||
import tools.jackson.databind.annotation.JsonSerialize;
|
||||
import tools.jackson.databind.ser.std.ToStringSerializer;
|
||||
import lombok.Data;
|
||||
|
||||
import java.math.BigDecimal;
|
||||
|
||||
@@ -1,8 +1,11 @@
|
||||
package com.healthlink.his.web.anesthesia.appservice;
|
||||
|
||||
import com.healthlink.his.anesthesia.domain.AnesAsaAssessment;
|
||||
import com.healthlink.his.anesthesia.domain.AnesSummary;
|
||||
import com.healthlink.his.anesthesia.domain.AnesthesiaFollowup;
|
||||
import com.healthlink.his.anesthesia.domain.AnesthesiaIoRecord;
|
||||
import com.healthlink.his.anesthesia.domain.AnesthesiaMedication;
|
||||
import com.healthlink.his.anesthesia.domain.AnesthesiaPostopFollowup;
|
||||
import com.healthlink.his.anesthesia.domain.AnesthesiaRecord;
|
||||
import com.healthlink.his.anesthesia.domain.AnesthesiaVitalSign;
|
||||
import com.healthlink.his.anesthesia.dto.AnesthesiaIoSummaryDto;
|
||||
@@ -31,4 +34,20 @@ public interface IAnesthesiaAppService {
|
||||
AnesthesiaIoSummaryDto getIoSummary(Long recordId);
|
||||
|
||||
void completeRecord(Long recordId);
|
||||
|
||||
AnesAsaAssessment saveAsaAssessment(AnesAsaAssessment assessment);
|
||||
|
||||
List<AnesAsaAssessment> getAsaAssessments(Long recordId);
|
||||
|
||||
AnesthesiaVitalSign recordVitalSign(AnesthesiaVitalSign vitalSign);
|
||||
|
||||
List<AnesthesiaVitalSign> getVitalSignTimeline(Long recordId);
|
||||
|
||||
AnesSummary saveSummary(AnesSummary summary);
|
||||
|
||||
AnesSummary getSummary(Long recordId);
|
||||
|
||||
AnesthesiaPostopFollowup recordFollowup(AnesthesiaPostopFollowup followup);
|
||||
|
||||
List<AnesthesiaPostopFollowup> getFollowups(Long encounterId);
|
||||
}
|
||||
|
||||
@@ -1,18 +1,25 @@
|
||||
package com.healthlink.his.web.anesthesia.appservice.impl;
|
||||
|
||||
import com.healthlink.his.anesthesia.domain.AnesAsaAssessment;
|
||||
import com.healthlink.his.anesthesia.domain.AnesSummary;
|
||||
import com.healthlink.his.anesthesia.domain.AnesthesiaFollowup;
|
||||
import com.healthlink.his.anesthesia.domain.AnesthesiaIoRecord;
|
||||
import com.healthlink.his.anesthesia.domain.AnesthesiaMedication;
|
||||
import com.healthlink.his.anesthesia.domain.AnesthesiaPostopFollowup;
|
||||
import com.healthlink.his.anesthesia.domain.AnesthesiaRecord;
|
||||
import com.healthlink.his.anesthesia.domain.AnesthesiaVitalSign;
|
||||
import com.healthlink.his.anesthesia.dto.AnesthesiaIoSummaryDto;
|
||||
import com.healthlink.his.anesthesia.dto.AnesthesiaRecordDetailDto;
|
||||
import com.healthlink.his.anesthesia.service.IAnesAsaAssessmentService;
|
||||
import com.healthlink.his.anesthesia.service.IAnesSummaryService;
|
||||
import com.healthlink.his.anesthesia.service.IAnesthesiaFollowupService;
|
||||
import com.healthlink.his.anesthesia.service.IAnesthesiaIoRecordService;
|
||||
import com.healthlink.his.anesthesia.service.IAnesthesiaPostopFollowupService;
|
||||
import com.healthlink.his.anesthesia.service.IAnesthesiaMedicationService;
|
||||
import com.healthlink.his.anesthesia.service.IAnesthesiaRecordService;
|
||||
import com.healthlink.his.anesthesia.service.IAnesthesiaVitalSignService;
|
||||
import com.healthlink.his.web.anesthesia.appservice.IAnesthesiaAppService;
|
||||
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
||||
import jakarta.annotation.Resource;
|
||||
import org.springframework.stereotype.Service;
|
||||
import org.springframework.transaction.annotation.Transactional;
|
||||
@@ -39,6 +46,15 @@ public class AnesthesiaAppServiceImpl implements IAnesthesiaAppService {
|
||||
@Resource
|
||||
private IAnesthesiaFollowupService anesthesiaFollowupService;
|
||||
|
||||
@Resource
|
||||
private IAnesAsaAssessmentService anesAsaAssessmentService;
|
||||
|
||||
@Resource
|
||||
private IAnesSummaryService anesSummaryService;
|
||||
|
||||
@Resource
|
||||
private IAnesthesiaPostopFollowupService anesthesiaPostopFollowupService;
|
||||
|
||||
@Override
|
||||
@Transactional
|
||||
public AnesthesiaRecord createRecord(AnesthesiaRecord record) {
|
||||
@@ -125,4 +141,74 @@ public class AnesthesiaAppServiceImpl implements IAnesthesiaAppService {
|
||||
record.setEndTime(new Date());
|
||||
anesthesiaRecordService.updateById(record);
|
||||
}
|
||||
|
||||
@Override
|
||||
@Transactional
|
||||
public AnesAsaAssessment saveAsaAssessment(AnesAsaAssessment assessment) {
|
||||
if (assessment.getId() != null) {
|
||||
anesAsaAssessmentService.updateById(assessment);
|
||||
} else {
|
||||
anesAsaAssessmentService.save(assessment);
|
||||
}
|
||||
return assessment;
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<AnesAsaAssessment> getAsaAssessments(Long recordId) {
|
||||
return anesAsaAssessmentService.selectByRecordId(recordId);
|
||||
}
|
||||
|
||||
@Override
|
||||
@Transactional
|
||||
public AnesthesiaVitalSign recordVitalSign(AnesthesiaVitalSign vitalSign) {
|
||||
anesthesiaVitalSignService.save(vitalSign);
|
||||
return vitalSign;
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<AnesthesiaVitalSign> getVitalSignTimeline(Long recordId) {
|
||||
return anesthesiaVitalSignService.selectByRecordId(recordId);
|
||||
}
|
||||
|
||||
@Override
|
||||
@Transactional
|
||||
public AnesSummary saveSummary(AnesSummary summary) {
|
||||
if (summary.getId() != null) {
|
||||
anesSummaryService.updateById(summary);
|
||||
} else {
|
||||
AnesSummary existing = anesSummaryService.selectByRecordId(summary.getRecordId());
|
||||
if (existing != null) {
|
||||
summary.setId(existing.getId());
|
||||
anesSummaryService.updateById(summary);
|
||||
} else {
|
||||
anesSummaryService.save(summary);
|
||||
}
|
||||
}
|
||||
return summary;
|
||||
}
|
||||
|
||||
@Override
|
||||
public AnesSummary getSummary(Long recordId) {
|
||||
return anesSummaryService.selectByRecordId(recordId);
|
||||
}
|
||||
|
||||
@Override
|
||||
@Transactional(rollbackFor = Exception.class)
|
||||
public AnesthesiaPostopFollowup recordFollowup(AnesthesiaPostopFollowup followup) {
|
||||
if (followup.getId() != null) {
|
||||
anesthesiaPostopFollowupService.updateById(followup);
|
||||
} else {
|
||||
followup.setStatus(0);
|
||||
anesthesiaPostopFollowupService.save(followup);
|
||||
}
|
||||
return followup;
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<AnesthesiaPostopFollowup> getFollowups(Long encounterId) {
|
||||
LambdaQueryWrapper<AnesthesiaPostopFollowup> wrapper = new LambdaQueryWrapper<>();
|
||||
wrapper.eq(AnesthesiaPostopFollowup::getEncounterId, encounterId)
|
||||
.orderByDesc(AnesthesiaPostopFollowup::getFollowupTime);
|
||||
return anesthesiaPostopFollowupService.list(wrapper);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,9 +1,12 @@
|
||||
package com.healthlink.his.web.anesthesia.controller;
|
||||
|
||||
import com.core.common.core.domain.R;
|
||||
import com.healthlink.his.anesthesia.domain.AnesAsaAssessment;
|
||||
import com.healthlink.his.anesthesia.domain.AnesSummary;
|
||||
import com.healthlink.his.anesthesia.domain.AnesthesiaFollowup;
|
||||
import com.healthlink.his.anesthesia.domain.AnesthesiaIoRecord;
|
||||
import com.healthlink.his.anesthesia.domain.AnesthesiaMedication;
|
||||
import com.healthlink.his.anesthesia.domain.AnesthesiaPostopFollowup;
|
||||
import com.healthlink.his.anesthesia.domain.AnesthesiaRecord;
|
||||
import com.healthlink.his.anesthesia.domain.AnesthesiaVitalSign;
|
||||
import com.healthlink.his.anesthesia.dto.AnesthesiaIoSummaryDto;
|
||||
@@ -17,6 +20,7 @@ import com.healthlink.his.web.anesthesia.appservice.IAnesthesiaAppService;
|
||||
import io.swagger.v3.oas.annotations.Operation;
|
||||
import io.swagger.v3.oas.annotations.tags.Tag;
|
||||
import jakarta.annotation.Resource;
|
||||
import org.springframework.security.access.prepost.PreAuthorize;
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
|
||||
import java.util.List;
|
||||
@@ -134,4 +138,60 @@ public class AnesthesiaController {
|
||||
anesthesiaAppService.completeRecord(id);
|
||||
return R.ok();
|
||||
}
|
||||
|
||||
@PostMapping("/asa-assessment")
|
||||
@Operation(summary = "保存ASA评估")
|
||||
@PreAuthorize("@ss.hasPermi('inpatient:anesthesia:edit')")
|
||||
public R<AnesAsaAssessment> saveAsaAssessment(@RequestBody AnesAsaAssessment assessment) {
|
||||
return R.ok(anesthesiaAppService.saveAsaAssessment(assessment));
|
||||
}
|
||||
|
||||
@GetMapping("/asa-assessment/{recordId}")
|
||||
@Operation(summary = "查询ASA评估列表")
|
||||
@PreAuthorize("@ss.hasPermi('inpatient:anesthesia:list')")
|
||||
public R<List<AnesAsaAssessment>> getAsaAssessments(@PathVariable Long recordId) {
|
||||
return R.ok(anesthesiaAppService.getAsaAssessments(recordId));
|
||||
}
|
||||
|
||||
@PostMapping("/vital-sign/record")
|
||||
@Operation(summary = "记录术中生命体征")
|
||||
@PreAuthorize("@ss.hasPermi('inpatient:anesthesia:edit')")
|
||||
public R<AnesthesiaVitalSign> recordVitalSign(@RequestBody AnesthesiaVitalSign vitalSign) {
|
||||
return R.ok(anesthesiaAppService.recordVitalSign(vitalSign));
|
||||
}
|
||||
|
||||
@GetMapping("/vital-sign/timeline/{recordId}")
|
||||
@Operation(summary = "查询生命体征时间线")
|
||||
@PreAuthorize("@ss.hasPermi('inpatient:anesthesia:list')")
|
||||
public R<List<AnesthesiaVitalSign>> getVitalSignTimeline(@PathVariable Long recordId) {
|
||||
return R.ok(anesthesiaAppService.getVitalSignTimeline(recordId));
|
||||
}
|
||||
|
||||
@PostMapping("/summary")
|
||||
@Operation(summary = "保存麻醉小结")
|
||||
@PreAuthorize("@ss.hasPermi('inpatient:anesthesia:edit')")
|
||||
public R<AnesSummary> saveSummary(@RequestBody AnesSummary summary) {
|
||||
return R.ok(anesthesiaAppService.saveSummary(summary));
|
||||
}
|
||||
|
||||
@GetMapping("/summary/{recordId}")
|
||||
@Operation(summary = "获取麻醉小结")
|
||||
@PreAuthorize("@ss.hasPermi('inpatient:anesthesia:list')")
|
||||
public R<AnesSummary> getSummary(@PathVariable Long recordId) {
|
||||
return R.ok(anesthesiaAppService.getSummary(recordId));
|
||||
}
|
||||
|
||||
@PostMapping("/postop-followup")
|
||||
@Operation(summary = "记录术后随访")
|
||||
@PreAuthorize("@ss.hasPermi('inpatient:anesthesia:edit')")
|
||||
public R<AnesthesiaPostopFollowup> recordFollowup(@RequestBody AnesthesiaPostopFollowup followup) {
|
||||
return R.ok(anesthesiaAppService.recordFollowup(followup));
|
||||
}
|
||||
|
||||
@GetMapping("/postop-followup/{encounterId}")
|
||||
@Operation(summary = "查询术后随访列表")
|
||||
@PreAuthorize("@ss.hasPermi('inpatient:anesthesia:list')")
|
||||
public R<List<AnesthesiaPostopFollowup>> getPostopFollowups(@PathVariable Long encounterId) {
|
||||
return R.ok(anesthesiaAppService.getFollowups(encounterId));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
package com.healthlink.his.web.appointmentmanage.dto;
|
||||
|
||||
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
|
||||
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
|
||||
import tools.jackson.databind.annotation.JsonSerialize;
|
||||
import tools.jackson.databind.ser.std.ToStringSerializer;
|
||||
import lombok.Data;
|
||||
import lombok.EqualsAndHashCode;
|
||||
import lombok.experimental.Accessors;
|
||||
|
||||
@@ -3,8 +3,8 @@
|
||||
*/
|
||||
package com.healthlink.his.web.basedatamanage.dto;
|
||||
|
||||
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
|
||||
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
|
||||
import tools.jackson.databind.annotation.JsonSerialize;
|
||||
import tools.jackson.databind.ser.std.ToStringSerializer;
|
||||
import lombok.Data;
|
||||
import lombok.experimental.Accessors;
|
||||
|
||||
|
||||
@@ -3,8 +3,8 @@
|
||||
*/
|
||||
package com.healthlink.his.web.basedatamanage.dto;
|
||||
|
||||
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
|
||||
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
|
||||
import tools.jackson.databind.annotation.JsonSerialize;
|
||||
import tools.jackson.databind.ser.std.ToStringSerializer;
|
||||
import lombok.Data;
|
||||
import lombok.experimental.Accessors;
|
||||
|
||||
|
||||
@@ -3,8 +3,8 @@
|
||||
*/
|
||||
package com.healthlink.his.web.basedatamanage.dto;
|
||||
|
||||
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
|
||||
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
|
||||
import tools.jackson.databind.annotation.JsonSerialize;
|
||||
import tools.jackson.databind.ser.std.ToStringSerializer;
|
||||
import com.healthlink.his.common.annotation.Dict;
|
||||
import lombok.Data;
|
||||
import lombok.experimental.Accessors;
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
package com.healthlink.his.web.basedatamanage.dto;
|
||||
|
||||
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
|
||||
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
|
||||
import tools.jackson.databind.annotation.JsonSerialize;
|
||||
import tools.jackson.databind.ser.std.ToStringSerializer;
|
||||
import com.healthlink.his.common.annotation.Dict;
|
||||
import lombok.Data;
|
||||
import lombok.experimental.Accessors;
|
||||
|
||||
@@ -3,8 +3,8 @@
|
||||
*/
|
||||
package com.healthlink.his.web.basedatamanage.dto;
|
||||
|
||||
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
|
||||
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
|
||||
import tools.jackson.databind.annotation.JsonSerialize;
|
||||
import tools.jackson.databind.ser.std.ToStringSerializer;
|
||||
import lombok.Data;
|
||||
import lombok.experimental.Accessors;
|
||||
|
||||
|
||||
@@ -3,8 +3,8 @@
|
||||
*/
|
||||
package com.healthlink.his.web.basedatamanage.dto;
|
||||
|
||||
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
|
||||
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
|
||||
import tools.jackson.databind.annotation.JsonSerialize;
|
||||
import tools.jackson.databind.ser.std.ToStringSerializer;
|
||||
import com.healthlink.his.common.annotation.Dict;
|
||||
import lombok.Data;
|
||||
import lombok.experimental.Accessors;
|
||||
|
||||
@@ -4,8 +4,8 @@
|
||||
package com.healthlink.his.web.basedatamanage.dto;
|
||||
|
||||
import com.fasterxml.jackson.annotation.JsonFormat;
|
||||
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
|
||||
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
|
||||
import tools.jackson.databind.annotation.JsonSerialize;
|
||||
import tools.jackson.databind.ser.std.ToStringSerializer;
|
||||
import lombok.Data;
|
||||
import lombok.experimental.Accessors;
|
||||
|
||||
|
||||
@@ -3,8 +3,8 @@
|
||||
*/
|
||||
package com.healthlink.his.web.basedatamanage.dto;
|
||||
|
||||
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
|
||||
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
|
||||
import tools.jackson.databind.annotation.JsonSerialize;
|
||||
import tools.jackson.databind.ser.std.ToStringSerializer;
|
||||
import lombok.Data;
|
||||
import lombok.experimental.Accessors;
|
||||
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
package com.healthlink.his.web.basedatamanage.dto;
|
||||
|
||||
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
|
||||
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
|
||||
import tools.jackson.databind.annotation.JsonSerialize;
|
||||
import tools.jackson.databind.ser.std.ToStringSerializer;
|
||||
import com.healthlink.his.common.annotation.Dict;
|
||||
import lombok.Data;
|
||||
import lombok.experimental.Accessors;
|
||||
|
||||
@@ -3,8 +3,8 @@
|
||||
*/
|
||||
package com.healthlink.his.web.basedatamanage.dto;
|
||||
|
||||
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
|
||||
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
|
||||
import tools.jackson.databind.annotation.JsonSerialize;
|
||||
import tools.jackson.databind.ser.std.ToStringSerializer;
|
||||
import lombok.Data;
|
||||
import lombok.experimental.Accessors;
|
||||
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
package com.healthlink.his.web.basedatamanage.dto;
|
||||
|
||||
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
|
||||
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
|
||||
import tools.jackson.databind.annotation.JsonSerialize;
|
||||
import tools.jackson.databind.ser.std.ToStringSerializer;
|
||||
import lombok.Data;
|
||||
import lombok.experimental.Accessors;
|
||||
|
||||
|
||||
@@ -3,8 +3,8 @@
|
||||
*/
|
||||
package com.healthlink.his.web.basedatamanage.dto;
|
||||
|
||||
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
|
||||
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
|
||||
import tools.jackson.databind.annotation.JsonSerialize;
|
||||
import tools.jackson.databind.ser.std.ToStringSerializer;
|
||||
import lombok.Data;
|
||||
import lombok.experimental.Accessors;
|
||||
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
package com.healthlink.his.web.basedatamanage.dto;
|
||||
|
||||
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
|
||||
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
|
||||
import tools.jackson.databind.annotation.JsonSerialize;
|
||||
import tools.jackson.databind.ser.std.ToStringSerializer;
|
||||
import com.healthlink.his.common.annotation.Dict;
|
||||
import lombok.Data;
|
||||
import lombok.experimental.Accessors;
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
package com.healthlink.his.web.basicservice.dto;
|
||||
|
||||
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
|
||||
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
|
||||
import tools.jackson.databind.annotation.JsonSerialize;
|
||||
import tools.jackson.databind.ser.std.ToStringSerializer;
|
||||
import com.healthlink.his.common.annotation.Dict;
|
||||
import lombok.Data;
|
||||
import lombok.experimental.Accessors;
|
||||
|
||||
@@ -0,0 +1,12 @@
|
||||
package com.healthlink.his.web.bloodtransfusion.appservice;
|
||||
import com.healthlink.his.bloodtransfusion.domain.BloodTransfusionRecord;
|
||||
import com.healthlink.his.bloodtransfusion.domain.BloodTransfusionObservation;
|
||||
import com.baomidou.mybatisplus.core.metadata.IPage;
|
||||
import java.util.Map;
|
||||
public interface IBloodTransfusionAppService {
|
||||
void apply(BloodTransfusionRecord record);
|
||||
IPage<BloodTransfusionRecord> page(String approvalStatus, String bloodComponent, Integer pageNum, Integer pageSize);
|
||||
void approve(Long id, String approvalStatus, String approverName);
|
||||
void observe(BloodTransfusionObservation observation);
|
||||
Map<String, Object> getRecordDetail(Long id);
|
||||
}
|
||||
@@ -0,0 +1,74 @@
|
||||
package com.healthlink.his.web.bloodtransfusion.appservice.impl;
|
||||
import com.healthlink.his.bloodtransfusion.domain.BloodTransfusionRecord;
|
||||
import com.healthlink.his.bloodtransfusion.domain.BloodTransfusionObservation;
|
||||
import com.healthlink.his.bloodtransfusion.service.IBloodTransfusionRecordService;
|
||||
import com.healthlink.his.bloodtransfusion.service.IBloodTransfusionObservationService;
|
||||
import com.healthlink.his.web.bloodtransfusion.appservice.IBloodTransfusionAppService;
|
||||
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
||||
import com.baomidou.mybatisplus.core.metadata.IPage;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.stereotype.Service;
|
||||
import java.util.*;
|
||||
@Service
|
||||
public class BloodTransfusionAppServiceImpl implements IBloodTransfusionAppService {
|
||||
@Autowired
|
||||
private IBloodTransfusionRecordService recordService;
|
||||
@Autowired
|
||||
private IBloodTransfusionObservationService observationService;
|
||||
@Override
|
||||
public void apply(BloodTransfusionRecord record) {
|
||||
record.setStatus("SUBMITTED");
|
||||
record.setApprovalStatus("PENDING");
|
||||
record.setCreateTime(new Date());
|
||||
recordService.save(record);
|
||||
}
|
||||
@Override
|
||||
public IPage<BloodTransfusionRecord> page(String approvalStatus, String bloodComponent, Integer pageNum, Integer pageSize) {
|
||||
LambdaQueryWrapper<BloodTransfusionRecord> w = new LambdaQueryWrapper<>();
|
||||
if (approvalStatus != null && !approvalStatus.isEmpty()) {
|
||||
w.eq(BloodTransfusionRecord::getApprovalStatus, approvalStatus);
|
||||
}
|
||||
if (bloodComponent != null && !bloodComponent.isEmpty()) {
|
||||
w.eq(BloodTransfusionRecord::getBloodComponent, bloodComponent);
|
||||
}
|
||||
w.orderByDesc(BloodTransfusionRecord::getCreateTime);
|
||||
return recordService.page(new com.baomidou.mybatisplus.extension.plugins.pagination.Page<>(pageNum, pageSize), w);
|
||||
}
|
||||
@Override
|
||||
public void approve(Long id, String approvalStatus, String approverName) {
|
||||
BloodTransfusionRecord record = recordService.getById(id);
|
||||
if (record == null) {
|
||||
throw new RuntimeException("输血记录不存在");
|
||||
}
|
||||
record.setApprovalStatus(approvalStatus);
|
||||
record.setApproverName(approverName);
|
||||
record.setApproveTime(new Date());
|
||||
if ("APPROVED".equals(approvalStatus)) {
|
||||
record.setStatus("APPROVED");
|
||||
} else if ("REJECTED".equals(approvalStatus)) {
|
||||
record.setStatus("REJECTED");
|
||||
}
|
||||
recordService.updateById(record);
|
||||
}
|
||||
@Override
|
||||
public void observe(BloodTransfusionObservation observation) {
|
||||
observation.setCreateTime(new Date());
|
||||
observationService.save(observation);
|
||||
}
|
||||
@Override
|
||||
public Map<String, Object> getRecordDetail(Long id) {
|
||||
Map<String, Object> result = new LinkedHashMap<>();
|
||||
BloodTransfusionRecord record = recordService.getById(id);
|
||||
if (record == null) {
|
||||
throw new RuntimeException("输血记录不存在");
|
||||
}
|
||||
result.put("record", record);
|
||||
List<BloodTransfusionObservation> observations = observationService.list(
|
||||
new LambdaQueryWrapper<BloodTransfusionObservation>()
|
||||
.eq(BloodTransfusionObservation::getRecordId, id)
|
||||
.orderByAsc(BloodTransfusionObservation::getObservationTime)
|
||||
);
|
||||
result.put("observations", observations);
|
||||
return result;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,53 @@
|
||||
package com.healthlink.his.web.bloodtransfusion.controller;
|
||||
import com.core.common.core.domain.AjaxResult;
|
||||
import com.healthlink.his.bloodtransfusion.domain.BloodTransfusionRecord;
|
||||
import com.healthlink.his.bloodtransfusion.domain.BloodTransfusionObservation;
|
||||
import com.healthlink.his.web.bloodtransfusion.appservice.IBloodTransfusionAppService;
|
||||
import io.swagger.v3.oas.annotations.Operation;
|
||||
import io.swagger.v3.oas.annotations.tags.Tag;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.security.access.prepost.PreAuthorize;
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
@Tag(name = "输血管理") @RestController @RequestMapping("/api/v1/blood-transfusion")
|
||||
public class BloodTransfusionController {
|
||||
@Autowired
|
||||
private IBloodTransfusionAppService appService;
|
||||
@Operation(summary = "申请输血")
|
||||
@PreAuthorize("@ss.hasPermi('inpatient:bloodtransfusion:edit')")
|
||||
@PostMapping("/apply")
|
||||
public AjaxResult apply(@RequestBody BloodTransfusionRecord record) {
|
||||
appService.apply(record);
|
||||
return AjaxResult.success();
|
||||
}
|
||||
@Operation(summary = "输血申请分页")
|
||||
@PreAuthorize("@ss.hasPermi('inpatient:bloodtransfusion:list')")
|
||||
@GetMapping("/page")
|
||||
public AjaxResult page(@RequestParam(required = false) String approvalStatus,
|
||||
@RequestParam(required = false) String bloodComponent,
|
||||
@RequestParam(defaultValue = "1") Integer pageNum,
|
||||
@RequestParam(defaultValue = "10") Integer pageSize) {
|
||||
return AjaxResult.success(appService.page(approvalStatus, bloodComponent, pageNum, pageSize));
|
||||
}
|
||||
@Operation(summary = "审批输血")
|
||||
@PreAuthorize("@ss.hasPermi('inpatient:bloodtransfusion:edit')")
|
||||
@PutMapping("/approve/{id}")
|
||||
public AjaxResult approve(@PathVariable Long id,
|
||||
@RequestParam String approvalStatus,
|
||||
@RequestParam(required = false) String approverName) {
|
||||
appService.approve(id, approvalStatus, approverName);
|
||||
return AjaxResult.success();
|
||||
}
|
||||
@Operation(summary = "输血观察记录")
|
||||
@PreAuthorize("@ss.hasPermi('inpatient:bloodtransfusion:edit')")
|
||||
@PostMapping("/observe")
|
||||
public AjaxResult observe(@RequestBody BloodTransfusionObservation observation) {
|
||||
appService.observe(observation);
|
||||
return AjaxResult.success();
|
||||
}
|
||||
@Operation(summary = "输血记录详情")
|
||||
@PreAuthorize("@ss.hasPermi('inpatient:bloodtransfusion:list')")
|
||||
@GetMapping("/record/{id}")
|
||||
public AjaxResult recordDetail(@PathVariable Long id) {
|
||||
return AjaxResult.success(appService.getRecordDetail(id));
|
||||
}
|
||||
}
|
||||
@@ -4,8 +4,8 @@
|
||||
package com.healthlink.his.web.cardmanagement.dto;
|
||||
|
||||
import com.fasterxml.jackson.annotation.JsonFormat;
|
||||
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
|
||||
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
|
||||
import tools.jackson.databind.annotation.JsonSerialize;
|
||||
import tools.jackson.databind.ser.std.ToStringSerializer;
|
||||
import lombok.Data;
|
||||
|
||||
import java.time.LocalDate;
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
package com.healthlink.his.web.chargemanage.dto;
|
||||
|
||||
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
|
||||
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
|
||||
import tools.jackson.databind.annotation.JsonSerialize;
|
||||
import tools.jackson.databind.ser.std.ToStringSerializer;
|
||||
import com.healthlink.his.common.constant.CommonConstants;
|
||||
import com.healthlink.his.common.enums.AccountBillingStatus;
|
||||
import com.healthlink.his.common.enums.AccountStatus;
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
package com.healthlink.his.web.chargemanage.dto;
|
||||
|
||||
import com.core.common.utils.SecurityUtils;
|
||||
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
|
||||
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
|
||||
import tools.jackson.databind.annotation.JsonSerialize;
|
||||
import tools.jackson.databind.ser.std.ToStringSerializer;
|
||||
import com.healthlink.his.common.constant.CommonConstants;
|
||||
import com.healthlink.his.common.enums.ChargeItemContext;
|
||||
import com.healthlink.his.common.enums.ChargeItemStatus;
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
package com.healthlink.his.web.chargemanage.dto;
|
||||
|
||||
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
|
||||
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
|
||||
import tools.jackson.databind.annotation.JsonSerialize;
|
||||
import tools.jackson.databind.ser.std.ToStringSerializer;
|
||||
import lombok.Data;
|
||||
import lombok.experimental.Accessors;
|
||||
|
||||
|
||||